From ec7b0c2da93fcf89188cbc438dfa71c54df8ca49 Mon Sep 17 00:00:00 2001 From: donho Date: Tue, 7 Aug 2007 00:55:50 +0000 Subject: [PATCH] v4.2 ready git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository@1 f5eea248-9336-0410-98b8-ebc06183d4e3 --- PowerEditor/bin/ConvertExt.enc | 93 + PowerEditor/bin/ConvertExt.ini | 2 + PowerEditor/bin/ConvertExt.lng | 14 + PowerEditor/bin/LINEDRAW.TTF | Bin 0 -> 80024 bytes PowerEditor/bin/QuickText.ini | 88 + PowerEditor/bin/SciLexer.dll | Bin 0 -> 352256 bytes PowerEditor/bin/change.log | 20 + PowerEditor/bin/config.xml | 77 + PowerEditor/bin/contextMenu.xml | 17 + PowerEditor/bin/doLocalConf.xml | 0 PowerEditor/bin/insertExt.ini | 6 + PowerEditor/bin/langs.xml | 247 + PowerEditor/bin/license.txt | 88 + PowerEditor/bin/md5summer.exe | Bin 0 -> 907264 bytes PowerEditor/bin/nppIExplorerShell.exe | Bin 0 -> 6656 bytes PowerEditor/bin/nppcm.dll | Bin 0 -> 24576 bytes PowerEditor/bin/nppv42RC.zip | Bin 0 -> 1361077 bytes PowerEditor/bin/plugins/APIs/c.api | 682 + PowerEditor/bin/plugins/APIs/cpp.api | 1182 + PowerEditor/bin/plugins/APIs/cs.api | 228 + PowerEditor/bin/plugins/APIs/css.api | 357 + PowerEditor/bin/plugins/APIs/flash.api | 930 + PowerEditor/bin/plugins/APIs/fortran.api | 576 + PowerEditor/bin/plugins/APIs/java.api | 3700 ++++ PowerEditor/bin/plugins/APIs/javascript.api | 634 + PowerEditor/bin/plugins/APIs/lisp.api | 478 + PowerEditor/bin/plugins/APIs/nsis.api | 219 + PowerEditor/bin/plugins/APIs/pascal.api | 18407 ++++++++++++++++ PowerEditor/bin/plugins/APIs/perl.api | 467 + PowerEditor/bin/plugins/APIs/php.api | 2655 +++ PowerEditor/bin/plugins/APIs/python.api | 290 + PowerEditor/bin/plugins/APIs/tex.api | 2154 ++ PowerEditor/bin/plugins/APIs/vb.api | 512 + PowerEditor/bin/plugins/APIs/vhdl.api | 90 + PowerEditor/bin/plugins/APIs/xml.api | 376 + PowerEditor/bin/plugins/Config/Explorer.ini | 21 + PowerEditor/bin/plugins/Config/Favorites.dat | 12 + PowerEditor/bin/plugins/Config/HexEditor.ini | 7 + PowerEditor/bin/plugins/Config/NppExec.ini | 7 + .../bin/plugins/Config/SpellChecker.ini | 2 + PowerEditor/bin/plugins/ConvertExt.dll | Bin 0 -> 114688 bytes PowerEditor/bin/plugins/Explorer.dll | Bin 0 -> 196608 bytes PowerEditor/bin/plugins/FunctionList.dll | Bin 0 -> 159744 bytes PowerEditor/bin/plugins/HexEditor.dll | Bin 0 -> 172032 bytes PowerEditor/bin/plugins/NPPTextFX.dll | Bin 0 -> 132096 bytes PowerEditor/bin/plugins/NPPTextFX.ini | 29 + .../bin/plugins/NPPTextFX/AsciiToEBCDIC.bin | Bin 0 -> 512 bytes .../bin/plugins/NPPTextFX/NPPTextFXdemo.TXT | 386 + PowerEditor/bin/plugins/NPPTextFX/TIDYCFG.INI | 190 + .../plugins/NPPTextFX/W3C-CSSValidator.htm | 5 + .../plugins/NPPTextFX/W3C-HTMLValidator.htm | 6 + PowerEditor/bin/plugins/NPPTextFX/libTidy.dll | Bin 0 -> 250368 bytes PowerEditor/bin/plugins/NppExec.dll | Bin 0 -> 135168 bytes PowerEditor/bin/plugins/QuickText.dll | Bin 0 -> 184320 bytes PowerEditor/bin/plugins/SpellChecker.dll | Bin 0 -> 77824 bytes PowerEditor/bin/plugins/doc/NppExec.txt | 72 + .../bin/plugins/doc/NppExec_TechInfo.txt | 139 + .../bin/plugins/doc/quickText_README.txt | 100 + PowerEditor/bin/readme.txt | 45 + PowerEditor/bin/session.xml | 5 + PowerEditor/bin/shortcuts.xml | 23 + PowerEditor/bin/stylers.xml | 709 + PowerEditor/bin/todo.txt | 6 + PowerEditor/bin/userDefineLang.xml | 36 + PowerEditor/gcc/makefile | 283 + PowerEditor/installer/bin/xmlUpdater.exe | Bin 0 -> 100247 bytes PowerEditor/installer/configModel.xml | 6 + PowerEditor/installer/images/Thumbs.db | Bin 0 -> 34304 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 | 978 + PowerEditor/installer/stylesGlobalModel.xml | 7 + PowerEditor/installer/stylesLexerModel.xml | 7 + PowerEditor/license.txt | 88 + PowerEditor/src/CMakeLists.txt | 176 + PowerEditor/src/IExplorerShell/makefile | 2 + .../src/IExplorerShell/nppIExplorerShell.cpp | 40 + PowerEditor/src/MISC/FileNameStringSplitter.h | 92 + .../MISC/PluginsManager/Notepad_plus_msgs.h | 195 + .../src/MISC/PluginsManager/PluginInterface.h | 64 + .../MISC/PluginsManager/PluginsManager.cpp | 163 + .../PluginsManager/PluginsManager.cpp.bak | 164 + .../src/MISC/PluginsManager/PluginsManager.h | 141 + .../MISC/PluginsManager/deprecatedSymbols.h | 68 + PowerEditor/src/MISC/Process/Process.cpp | 292 + PowerEditor/src/MISC/Process/Process.h | 107 + .../Process/ProcessAvecThread/Process.cpp | 243 + .../MISC/Process/ProcessAvecThread/Process.h | 92 + .../Process/ProcessAvecThread/ProcessThread.h | 85 + PowerEditor/src/MISC/RegExt/regExtDlg.cpp | 358 + PowerEditor/src/MISC/RegExt/regExtDlg.h | 60 + PowerEditor/src/MISC/RegExt/regExtDlg.rc | 39 + PowerEditor/src/MISC/RegExt/regExtDlgRc.h | 35 + PowerEditor/src/MISC/SysMsg/SysMsg.cpp | 179 + PowerEditor/src/MISC/SysMsg/SysMsg.h | 27 + PowerEditor/src/MISC/crc16/Crc16.h | 112 + PowerEditor/src/Notepad_plus.aps | Bin 0 -> 360976 bytes PowerEditor/src/Notepad_plus.cpp | 7235 ++++++ PowerEditor/src/Notepad_plus.cpp.bak | 7188 ++++++ .../src/Notepad_plus.cpp.internalDockingDlg | 6559 ++++++ PowerEditor/src/Notepad_plus.h | 803 + PowerEditor/src/Notepad_plus.rc | 619 + PowerEditor/src/Parameters.cpp | 3003 +++ PowerEditor/src/Parameters.cpp.bak | 2990 +++ PowerEditor/src/Parameters.h | 1048 + PowerEditor/src/Parameters.h.bak | 1044 + PowerEditor/src/RCa02172 | Bin 0 -> 56926 bytes PowerEditor/src/ScitillaComponent/Buffer.cpp | 80 + PowerEditor/src/ScitillaComponent/Buffer.h | 337 + .../src/ScitillaComponent/DocTabView.cpp | 166 + .../src/ScitillaComponent/DocTabView.h | 82 + .../src/ScitillaComponent/FindReplaceDlg | 1291 ++ .../src/ScitillaComponent/FindReplaceDlg.aps | Bin 0 -> 43892 bytes .../src/ScitillaComponent/FindReplaceDlg.cpp | 1277 ++ .../ScitillaComponent/FindReplaceDlg.cpp.bak | 1319 ++ .../src/ScitillaComponent/FindReplaceDlg.h | 411 + .../src/ScitillaComponent/FindReplaceDlg.rc | 100 + .../src/ScitillaComponent/FindReplaceDlg_rc.h | 64 + .../src/ScitillaComponent/GoToLineDlg.cpp | 73 + .../src/ScitillaComponent/GoToLineDlg.h | 78 + PowerEditor/src/ScitillaComponent/Printer.cpp | 500 + PowerEditor/src/ScitillaComponent/Printer.h | 55 + PowerEditor/src/ScitillaComponent/RCa02172 | Bin 0 -> 11212 bytes .../ScitillaComponent/ScintillaEditView.cpp | 1576 ++ .../src/ScitillaComponent/ScintillaEditView.h | 829 + .../src/ScitillaComponent/ScintillaRef.h | 6 + .../ScitillaComponent/UserDefineDialog.aps | Bin 0 -> 66736 bytes .../ScitillaComponent/UserDefineDialog.cpp | 1599 ++ .../src/ScitillaComponent/UserDefineDialog.h | 505 + .../src/ScitillaComponent/UserDefineDialog.rc | 270 + .../UserDefineLangReference.h | 36 + .../ScitillaComponent/UserDefineResource.h | 265 + PowerEditor/src/ScitillaComponent/colors.h | 60 + .../src/ScitillaComponent/columnEditor.aps | Bin 0 -> 40328 bytes .../src/ScitillaComponent/columnEditor.cpp | 259 + .../src/ScitillaComponent/columnEditor.h | 83 + .../src/ScitillaComponent/columnEditor.rc | 49 + .../src/ScitillaComponent/columnEditor_rc.h | 39 + PowerEditor/src/StaticControl.h | 35 + PowerEditor/src/TinyXml/tinystr.cpp | 303 + PowerEditor/src/TinyXml/tinystr.h | 236 + PowerEditor/src/TinyXml/tinyxml.cpp | 1258 ++ PowerEditor/src/TinyXml/tinyxml.h | 1259 ++ PowerEditor/src/TinyXml/tinyxmlerror.cpp | 50 + PowerEditor/src/TinyXml/tinyxmlparser.cpp | 1157 + PowerEditor/src/UniConversion.cpp | 135 + PowerEditor/src/UniConversion.h | 13 + PowerEditor/src/Utf8_16.cpp | 505 + PowerEditor/src/Utf8_16.h | 151 + .../src/WinControls/AboutDlg/AboutDlg.cpp | 89 + .../src/WinControls/AboutDlg/AboutDlg.h | 65 + .../src/WinControls/AboutDlg/URLCtrl.cpp | 277 + .../src/WinControls/AboutDlg/URLCtrl.h | 43 + .../WinControls/ColourPicker/ColourPicker.cpp | 135 + .../WinControls/ColourPicker/ColourPicker.h | 57 + .../WinControls/ColourPicker/ColourPopup.aps | Bin 0 -> 38912 bytes .../WinControls/ColourPicker/ColourPopup.cpp | 238 + .../WinControls/ColourPicker/ColourPopup.h | 66 + .../WinControls/ColourPicker/ColourPopup.rc | 32 + .../ColourPicker/ColourPopupResource.h | 3 + .../ColourPicker/FontPreviewCombo.cpp | 183 + .../WinControls/ColourPicker/WordStyleDlg.aps | Bin 0 -> 42568 bytes .../WinControls/ColourPicker/WordStyleDlg.cpp | 600 + .../ColourPicker/WordStyleDlg.cpp.dockable | 608 + .../WinControls/ColourPicker/WordStyleDlg.h | 176 + .../ColourPicker/WordStyleDlg.h.dockable | 179 + .../WinControls/ColourPicker/WordStyleDlg.rc | 68 + .../ColourPicker/WordStyleDlgRes.h | 54 + .../src/WinControls/ContextMenu/ContextMenu.h | 78 + .../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 | 1224 + .../DockingWnd/DockingCont.cpp.bak | 1221 + .../src/WinControls/DockingWnd/DockingCont.h | 213 + .../WinControls/DockingWnd/DockingCont.h.bak | 213 + .../DockingWnd/DockingDlgInterface.h | 136 + .../DockingWnd/DockingGUIWidget.rc | 22 + .../WinControls/DockingWnd/DockingManager.cpp | 811 + .../DockingWnd/DockingManager.cpp.bak | 811 + .../WinControls/DockingWnd/DockingManager.h | 209 + .../DockingWnd/DockingManager.h.bak | 209 + .../DockingWnd/DockingSplitter.cpp | 210 + .../DockingWnd/DockingSplitter.cpp.bak | 206 + .../WinControls/DockingWnd/DockingSplitter.h | 60 + .../src/WinControls/DockingWnd/DropData.cpp | 214 + .../src/WinControls/DockingWnd/DropData.h | 74 + .../src/WinControls/DockingWnd/Gripper.cpp | 802 + .../WinControls/DockingWnd/Gripper.cpp.bak | 794 + .../src/WinControls/DockingWnd/Gripper.h | 140 + .../src/WinControls/DockingWnd/Gripper.h.bak | 126 + .../src/WinControls/DockingWnd/RCa02172 | Bin 0 -> 1694 bytes .../WinControls/DockingWnd/common_func.cpp | 86 + .../DockingWnd/common_func.cpp.bak | 36 + .../src/WinControls/DockingWnd/common_func.h | 20 + .../WinControls/DockingWnd/common_func.h.bak | 9 + .../WinControls/DockingWnd/dockingResource.h | 45 + PowerEditor/src/WinControls/Grid/BabyGrid.cpp | 3262 +++ .../src/WinControls/Grid/BabyGrid.cpp.bak | 3262 +++ PowerEditor/src/WinControls/Grid/BabyGrid.h | 109 + .../src/WinControls/Grid/BabyGridWrapper.cpp | 41 + .../src/WinControls/Grid/BabyGridWrapper.h | 91 + .../src/WinControls/Grid/ShortcutMapper.cpp | 359 + .../src/WinControls/Grid/ShortcutMapper.h | 62 + .../src/WinControls/Grid/ShortcutMapper.rc | 36 + .../src/WinControls/Grid/ShortcutMapper_rc.h | 23 + .../WinControls/ImageListSet/ImageListSet.cpp | 70 + .../WinControls/ImageListSet/ImageListSet.h | 203 + .../OpenSaveFileDialog/FileDialog.cpp | 201 + .../OpenSaveFileDialog/FileDialog.h | 92 + .../src/WinControls/Preference/RCa02240 | Bin 0 -> 23084 bytes .../src/WinControls/Preference/preference.rc | 237 + .../WinControls/Preference/preference.rc.bak | 225 + .../WinControls/Preference/preferenceDlg.cpp | 1296 ++ .../Preference/preferenceDlg.cpp.bak | 1213 + .../WinControls/Preference/preferenceDlg.h | 181 + .../Preference/preferenceDlg.h.bak | 171 + .../WinControls/Preference/preference_rc.h | 160 + .../Preference/preference_rc.h.bak | 152 + .../SplitterContainer/Splitter.cpp | 692 + .../WinControls/SplitterContainer/Splitter.h | 117 + .../SplitterContainer/SplitterContainer.cpp | 240 + .../SplitterContainer/SplitterContainer.h | 100 + .../StaticDialog/RunDlg/RunDlg.cpp | 266 + .../WinControls/StaticDialog/RunDlg/RunDlg.h | 72 + .../WinControls/StaticDialog/RunDlg/RunDlg.rc | 43 + .../StaticDialog/RunDlg/RunDlg_rc.h | 5 + .../WinControls/StaticDialog/StaticDialog.cpp | 137 + .../WinControls/StaticDialog/StaticDialog.h | 85 + .../src/WinControls/StatusBar/StatusBar.cpp | 76 + .../src/WinControls/StatusBar/StatusBar.h | 85 + .../src/WinControls/TabBar/ControlsTab.cpp | 71 + .../src/WinControls/TabBar/ControlsTab.h | 111 + PowerEditor/src/WinControls/TabBar/TabBar.cpp | 623 + .../src/WinControls/TabBar/TabBar.cpp.bak | 612 + PowerEditor/src/WinControls/TabBar/TabBar.h | 279 + .../src/WinControls/TaskList/TaskList.cpp | 243 + .../src/WinControls/TaskList/TaskList.h | 90 + .../src/WinControls/TaskList/TaskListDlg.h | 261 + .../src/WinControls/TaskList/TaskListDlg.rc | 26 + .../src/WinControls/TaskList/TaskListDlg_rc.h | 24 + .../src/WinControls/ToolBar/ToolBar.cpp | 361 + .../src/WinControls/ToolBar/ToolBar.cpp.new | 287 + PowerEditor/src/WinControls/ToolBar/ToolBar.h | 201 + .../src/WinControls/ToolBar/ToolBar.h.new | 150 + .../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 | 114 + PowerEditor/src/WinControls/Window.h.bak | 108 + 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 | 301 + .../src/WinControls/WindowsDlg/WinRect.cpp | 84 + .../src/WinControls/WindowsDlg/WindowsDlg.aps | Bin 0 -> 39912 bytes .../src/WinControls/WindowsDlg/WindowsDlg.cpp | 841 + .../src/WinControls/WindowsDlg/WindowsDlg.h | 113 + .../src/WinControls/WindowsDlg/WindowsDlg.rc | 48 + .../src/WinControls/WindowsDlg/WindowsDlgRc.h | 19 + .../src/WinControls/shortcut/RunMacroDlg.cpp | 117 + .../src/WinControls/shortcut/RunMacroDlg.h | 97 + .../src/WinControls/shortcut/RunMacroDlg.rc | 41 + .../src/WinControls/shortcut/RunMacroDlg_rc.h | 32 + .../src/WinControls/shortcut/shortcut.cpp | 386 + .../src/WinControls/shortcut/shortcut.h | 303 + .../src/WinControls/shortcut/shortcut.rc | 48 + .../src/WinControls/shortcut/shortcutRc.h | 31 + PowerEditor/src/config.xml | 77 + PowerEditor/src/constant.h | 6 + PowerEditor/src/contextMenu.xml | 17 + PowerEditor/src/cursors/drag.cur | Bin 0 -> 766 bytes PowerEditor/src/cursors/drag_interdit.cur | Bin 0 -> 766 bytes PowerEditor/src/cursors/drag_plus.cur | Bin 0 -> 766 bytes PowerEditor/src/icons/CVS/Entries | 98 + PowerEditor/src/icons/CVS/Entries.Extra | 97 + PowerEditor/src/icons/CVS/Entries.Extra.Old | 97 + PowerEditor/src/icons/CVS/Entries.Old | 98 + PowerEditor/src/icons/CVS/Repository | 1 + PowerEditor/src/icons/CVS/Root | 1 + 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/npp.ico.new | Bin 0 -> 90022 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/langs.xml | 247 + PowerEditor/src/lastRecentFileList.h | 163 + PowerEditor/src/lesDlgs.h | 131 + PowerEditor/src/notepad++.exe.manifest | 23 + PowerEditor/src/resource.h | 551 + PowerEditor/src/shortcuts.xml | 23 + PowerEditor/src/stylers.xml | 709 + PowerEditor/src/toolbarIcons.xml | 94 + PowerEditor/src/userDefineLang.xml | 62 + PowerEditor/src/winmain.cpp | 309 + PowerEditor/src/xmlUpdater/Debug/BuildLog.htm | 54 + PowerEditor/src/xmlUpdater/configModel.xml | 6 + PowerEditor/src/xmlUpdater/langsModel.xml | 6 + PowerEditor/src/xmlUpdater/makefile | 56 + .../src/xmlUpdater/stylesGlobalModel.xml | 7 + .../src/xmlUpdater/stylesLexerModel.xml | 7 + PowerEditor/src/xmlUpdater/xmlUpdater.cpp | 326 + PowerEditor/src/xmlUpdater/xmlUpdater.vcproj | 159 + PowerEditor/visual.net/Debug/BuildLog.htm | Bin 0 -> 27736 bytes PowerEditor/visual.net/Release/BuildLog.htm | Bin 0 -> 37528 bytes PowerEditor/visual.net/no_ms_shit.vsprops | 11 + PowerEditor/visual.net/notepadPlus.7.0.vcproj | 803 + PowerEditor/visual.net/notepadPlus.vcproj | 1081 + readmeFirst.txt | 33 + scintilla/License.txt | 20 + scintilla/README | 69 + scintilla/bin/empty.txt | 1 + scintilla/delbin.bat | 1 + scintilla/delcvs.bat | 1 + scintilla/doc/Design.html | 249 + scintilla/doc/Icons.html | 56 + scintilla/doc/Lexer.txt | 226 + scintilla/doc/SciBreak.jpg | Bin 0 -> 33592 bytes scintilla/doc/SciCoding.html | 251 + scintilla/doc/SciRest.jpg | Bin 0 -> 16680 bytes scintilla/doc/SciTEIco.png | Bin 0 -> 10091 bytes scintilla/doc/SciWord.jpg | Bin 0 -> 6164 bytes scintilla/doc/ScintillaDoc.html | 5406 +++++ scintilla/doc/ScintillaDownload.html | 70 + scintilla/doc/ScintillaHistory.html | 5512 +++++ scintilla/doc/ScintillaRelated.html | 485 + scintilla/doc/ScintillaToDo.html | 178 + scintilla/doc/ScintillaUsage.html | 375 + scintilla/doc/Steps.html | 142 + scintilla/doc/index.html | 207 + scintilla/gtk/Converter.h | 87 + scintilla/gtk/PlatGTK.cxx | 2711 +++ scintilla/gtk/ScintillaGTK.cxx | 2671 +++ scintilla/gtk/deps.mak | 191 + scintilla/gtk/makefile | 95 + scintilla/gtk/scintilla-marshal.c | 86 + scintilla/gtk/scintilla-marshal.h | 21 + scintilla/gtk/scintilla-marshal.list | 1 + scintilla/gtk/scintilla.mak | 497 + scintilla/include/Accessor.h | 78 + scintilla/include/Face.py | 107 + scintilla/include/HFacer.py | 76 + scintilla/include/KeyWords.h | 82 + scintilla/include/Platform.h | 526 + scintilla/include/Platform.h.bak | 517 + scintilla/include/PropSet.h | 114 + scintilla/include/SString.h | 280 + scintilla/include/SciLexer.h | 1145 + scintilla/include/SciLexer.h.bak | 1141 + scintilla/include/Scintilla.h | 803 + scintilla/include/Scintilla.iface | 3116 +++ scintilla/include/ScintillaWidget.h | 59 + scintilla/include/WindowAccessor.h | 57 + scintilla/src/AutoComplete.cxx | 174 + scintilla/src/AutoComplete.h | 70 + scintilla/src/CallTip.cxx | 314 + scintilla/src/CallTip.h | 79 + scintilla/src/CellBuffer.cxx | 914 + scintilla/src/CellBuffer.h | 231 + scintilla/src/CharClassify.cxx | 43 + scintilla/src/CharClassify.h | 25 + scintilla/src/ContractionState.cxx | 289 + scintilla/src/ContractionState.h | 65 + scintilla/src/Document.cxx | 1727 ++ scintilla/src/Document.cxx.bak | 1612 ++ scintilla/src/Document.h | 308 + scintilla/src/Document.h.bak | 305 + scintilla/src/DocumentAccessor.cxx | 190 + scintilla/src/DocumentAccessor.h | 67 + scintilla/src/Editor.cxx | 7424 +++++++ scintilla/src/Editor.h | 583 + scintilla/src/ExternalLexer.cxx | 259 + scintilla/src/ExternalLexer.h | 95 + scintilla/src/Indicator.cxx | 77 + scintilla/src/Indicator.h | 22 + scintilla/src/KeyMap.cxx | 148 + scintilla/src/KeyMap.h | 43 + scintilla/src/KeyWords.cxx | 223 + scintilla/src/LexAPDL.cxx | 136 + scintilla/src/LexAU3.cxx | 894 + scintilla/src/LexAVE.cxx | 225 + scintilla/src/LexAda.cxx | 520 + scintilla/src/LexAsm.cxx | 177 + scintilla/src/LexAsn1.cxx | 181 + scintilla/src/LexBaan.cxx | 189 + scintilla/src/LexBash.cxx | 664 + scintilla/src/LexBasic.cxx | 369 + scintilla/src/LexBullant.cxx | 225 + scintilla/src/LexCLW.cxx | 675 + scintilla/src/LexCPP.cxx | 484 + scintilla/src/LexCSS.cxx | 303 + scintilla/src/LexCaml.cxx | 399 + scintilla/src/LexCmake.cxx | 453 + scintilla/src/LexConf.cxx | 184 + scintilla/src/LexCrontab.cxx | 218 + scintilla/src/LexCsound.cxx | 207 + scintilla/src/LexD.cxx | 354 + scintilla/src/LexEScript.cxx | 270 + scintilla/src/LexEiffel.cxx | 234 + scintilla/src/LexErlang.cxx | 522 + scintilla/src/LexFlagship.cxx | 226 + scintilla/src/LexForth.cxx | 348 + scintilla/src/LexFortran.cxx | 452 + scintilla/src/LexGen.py | 241 + scintilla/src/LexGui4Cli.cxx | 309 + scintilla/src/LexHTML.cxx | 2061 ++ scintilla/src/LexHTML.cxx.bak | 2046 ++ scintilla/src/LexHaskell.cxx | 263 + scintilla/src/LexInno.cxx | 290 + scintilla/src/LexKix.cxx | 122 + scintilla/src/LexLisp.cxx | 275 + scintilla/src/LexLout.cxx | 208 + scintilla/src/LexLua.cxx | 358 + scintilla/src/LexMMIXAL.cxx | 183 + scintilla/src/LexMPT.cxx | 182 + scintilla/src/LexMSSQL.cxx | 359 + scintilla/src/LexMatlab.cxx | 233 + scintilla/src/LexMetapost.cxx | 320 + scintilla/src/LexNsis.cxx | 650 + scintilla/src/LexObjC.cxx | 759 + scintilla/src/LexOpal.cxx | 518 + scintilla/src/LexOthers.cxx | 1158 + scintilla/src/LexPB.cxx | 358 + scintilla/src/LexPOV.cxx | 312 + scintilla/src/LexPS.cxx | 343 + scintilla/src/LexPascal.cxx | 369 + scintilla/src/LexPerl.cxx | 1256 ++ scintilla/src/LexPython.cxx | 449 + scintilla/src/LexRebol.cxx | 319 + scintilla/src/LexRuby.cxx | 1714 ++ scintilla/src/LexSQL.cxx | 342 + scintilla/src/LexScriptol.cxx | 404 + scintilla/src/LexSearchResult.cxx | 258 + scintilla/src/LexSmalltalk.cxx | 317 + scintilla/src/LexSpecman.cxx | 286 + scintilla/src/LexSpice.cxx | 221 + scintilla/src/LexTADS3.cxx | 900 + scintilla/src/LexTCL.cxx | 362 + scintilla/src/LexTeX.cxx | 648 + scintilla/src/LexTeX.cxx.bak | 626 + scintilla/src/LexUser.cxx | 493 + scintilla/src/LexVB.cxx | 278 + scintilla/src/LexVHDL.cxx | 473 + scintilla/src/LexVerilog.cxx | 299 + scintilla/src/LexYAML.cxx | 305 + scintilla/src/LineMarker.cxx | 301 + scintilla/src/LineMarker.h | 54 + scintilla/src/Partitioning.h | 184 + scintilla/src/PropSet.cxx | 1173 + scintilla/src/RESearch.cxx | 976 + scintilla/src/RESearch.h | 67 + scintilla/src/SVector.h | 127 + scintilla/src/SciTE.properties | 6 + scintilla/src/ScintillaBase.cxx | 729 + scintilla/src/ScintillaBase.h | 93 + scintilla/src/SplitVector.h | 235 + scintilla/src/Style.cxx | 154 + scintilla/src/Style.h | 56 + scintilla/src/StyleContext.cxx | 51 + scintilla/src/StyleContext.h | 171 + scintilla/src/UniConversion.cxx | 76 + scintilla/src/UniConversion.h | 12 + scintilla/src/ViewStyle.cxx | 299 + scintilla/src/ViewStyle.h | 109 + scintilla/src/WindowAccessor.cxx | 178 + scintilla/src/XPM.cxx | 322 + scintilla/src/XPM.h | 72 + .../Editor.cxx.2007-05-22_000024.bak | 7423 +++++++ .../Editor.cxx.2007-05-22_002237.bak | 7461 +++++++ scintilla/tgzsrc | 4 + scintilla/vcbuild/SciLexer.dsp | 473 + scintilla/vcbuild/SciLexer.dsw | 29 + scintilla/vcbuild/SciLexer.ncb | Bin 0 -> 345088 bytes scintilla/vcbuild/SciLexer.opt | Bin 0 -> 48640 bytes scintilla/vcbuild/SciLexer.plg | 311 + scintilla/version.txt | 1 + scintilla/win32/Margin.cur | Bin 0 -> 326 bytes scintilla/win32/PlatWin.cxx | 2180 ++ scintilla/win32/PlatformRes.h | 8 + scintilla/win32/SciTE.properties | 21 + scintilla/win32/ScintRes.rc | 40 + scintilla/win32/Scintilla.def | 2 + scintilla/win32/ScintillaWin.cxx | 2423 ++ scintilla/win32/deps.mak | 211 + scintilla/win32/makefile | 114 + scintilla/win32/scintilla.mak | 459 + scintilla/win32/scintilla_vc6.mak | 458 + scintilla/zipsrc.bat | 4 + 601 files changed, 224757 insertions(+) create mode 100644 PowerEditor/bin/ConvertExt.enc create mode 100644 PowerEditor/bin/ConvertExt.ini create mode 100644 PowerEditor/bin/ConvertExt.lng create mode 100644 PowerEditor/bin/LINEDRAW.TTF create mode 100644 PowerEditor/bin/QuickText.ini create mode 100644 PowerEditor/bin/SciLexer.dll create mode 100644 PowerEditor/bin/change.log create mode 100644 PowerEditor/bin/config.xml create mode 100644 PowerEditor/bin/contextMenu.xml create mode 100644 PowerEditor/bin/doLocalConf.xml create mode 100644 PowerEditor/bin/insertExt.ini create mode 100644 PowerEditor/bin/langs.xml create mode 100644 PowerEditor/bin/license.txt create mode 100644 PowerEditor/bin/md5summer.exe create mode 100644 PowerEditor/bin/nppIExplorerShell.exe create mode 100644 PowerEditor/bin/nppcm.dll create mode 100644 PowerEditor/bin/nppv42RC.zip create mode 100644 PowerEditor/bin/plugins/APIs/c.api create mode 100644 PowerEditor/bin/plugins/APIs/cpp.api create mode 100644 PowerEditor/bin/plugins/APIs/cs.api create mode 100644 PowerEditor/bin/plugins/APIs/css.api create mode 100644 PowerEditor/bin/plugins/APIs/flash.api create mode 100644 PowerEditor/bin/plugins/APIs/fortran.api create mode 100644 PowerEditor/bin/plugins/APIs/java.api create mode 100644 PowerEditor/bin/plugins/APIs/javascript.api create mode 100644 PowerEditor/bin/plugins/APIs/lisp.api create mode 100644 PowerEditor/bin/plugins/APIs/nsis.api create mode 100644 PowerEditor/bin/plugins/APIs/pascal.api create mode 100644 PowerEditor/bin/plugins/APIs/perl.api create mode 100644 PowerEditor/bin/plugins/APIs/php.api create mode 100644 PowerEditor/bin/plugins/APIs/python.api create mode 100644 PowerEditor/bin/plugins/APIs/tex.api create mode 100644 PowerEditor/bin/plugins/APIs/vb.api create mode 100644 PowerEditor/bin/plugins/APIs/vhdl.api create mode 100644 PowerEditor/bin/plugins/APIs/xml.api create mode 100644 PowerEditor/bin/plugins/Config/Explorer.ini create mode 100644 PowerEditor/bin/plugins/Config/Favorites.dat create mode 100644 PowerEditor/bin/plugins/Config/HexEditor.ini create mode 100644 PowerEditor/bin/plugins/Config/NppExec.ini create mode 100644 PowerEditor/bin/plugins/Config/SpellChecker.ini create mode 100644 PowerEditor/bin/plugins/ConvertExt.dll create mode 100644 PowerEditor/bin/plugins/Explorer.dll create mode 100644 PowerEditor/bin/plugins/FunctionList.dll create mode 100644 PowerEditor/bin/plugins/HexEditor.dll create mode 100644 PowerEditor/bin/plugins/NPPTextFX.dll create mode 100644 PowerEditor/bin/plugins/NPPTextFX.ini create mode 100644 PowerEditor/bin/plugins/NPPTextFX/AsciiToEBCDIC.bin create mode 100644 PowerEditor/bin/plugins/NPPTextFX/NPPTextFXdemo.TXT create mode 100644 PowerEditor/bin/plugins/NPPTextFX/TIDYCFG.INI create mode 100644 PowerEditor/bin/plugins/NPPTextFX/W3C-CSSValidator.htm create mode 100644 PowerEditor/bin/plugins/NPPTextFX/W3C-HTMLValidator.htm create mode 100644 PowerEditor/bin/plugins/NPPTextFX/libTidy.dll create mode 100644 PowerEditor/bin/plugins/NppExec.dll create mode 100644 PowerEditor/bin/plugins/QuickText.dll create mode 100644 PowerEditor/bin/plugins/SpellChecker.dll create mode 100644 PowerEditor/bin/plugins/doc/NppExec.txt create mode 100644 PowerEditor/bin/plugins/doc/NppExec_TechInfo.txt create mode 100644 PowerEditor/bin/plugins/doc/quickText_README.txt create mode 100644 PowerEditor/bin/readme.txt create mode 100644 PowerEditor/bin/session.xml create mode 100644 PowerEditor/bin/shortcuts.xml create mode 100644 PowerEditor/bin/stylers.xml create mode 100644 PowerEditor/bin/todo.txt create mode 100644 PowerEditor/bin/userDefineLang.xml create mode 100644 PowerEditor/gcc/makefile create mode 100644 PowerEditor/installer/bin/xmlUpdater.exe create mode 100644 PowerEditor/installer/configModel.xml create mode 100644 PowerEditor/installer/images/Thumbs.db 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/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/IExplorerShell/makefile create mode 100644 PowerEditor/src/IExplorerShell/nppIExplorerShell.cpp 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.cpp.bak 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/SysMsg/SysMsg.cpp create mode 100644 PowerEditor/src/MISC/SysMsg/SysMsg.h create mode 100644 PowerEditor/src/MISC/crc16/Crc16.h create mode 100644 PowerEditor/src/Notepad_plus.aps create mode 100644 PowerEditor/src/Notepad_plus.cpp create mode 100644 PowerEditor/src/Notepad_plus.cpp.bak create mode 100644 PowerEditor/src/Notepad_plus.cpp.internalDockingDlg 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.cpp.bak create mode 100644 PowerEditor/src/Parameters.h create mode 100644 PowerEditor/src/Parameters.h.bak create mode 100644 PowerEditor/src/RCa02172 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 create mode 100644 PowerEditor/src/ScitillaComponent/FindReplaceDlg.aps create mode 100644 PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp create mode 100644 PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp.bak 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/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/RCa02172 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/UserDefineDialog.aps 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.aps 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/StaticControl.h 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.aps 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/FontPreviewCombo.cpp create mode 100644 PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.aps create mode 100644 PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp create mode 100644 PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp.dockable create mode 100644 PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h create mode 100644 PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h.dockable 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.cpp.bak create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingCont.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingCont.h.bak 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.cpp.bak create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingManager.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingManager.h.bak create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp.bak create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingSplitter.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/DropData.cpp 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.cpp.bak create mode 100644 PowerEditor/src/WinControls/DockingWnd/Gripper.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/Gripper.h.bak create mode 100644 PowerEditor/src/WinControls/DockingWnd/RCa02172 create mode 100644 PowerEditor/src/WinControls/DockingWnd/common_func.cpp create mode 100644 PowerEditor/src/WinControls/DockingWnd/common_func.cpp.bak create mode 100644 PowerEditor/src/WinControls/DockingWnd/common_func.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/common_func.h.bak 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.cpp.bak 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/RCa02240 create mode 100644 PowerEditor/src/WinControls/Preference/preference.rc create mode 100644 PowerEditor/src/WinControls/Preference/preference.rc.bak create mode 100644 PowerEditor/src/WinControls/Preference/preferenceDlg.cpp create mode 100644 PowerEditor/src/WinControls/Preference/preferenceDlg.cpp.bak create mode 100644 PowerEditor/src/WinControls/Preference/preferenceDlg.h create mode 100644 PowerEditor/src/WinControls/Preference/preferenceDlg.h.bak create mode 100644 PowerEditor/src/WinControls/Preference/preference_rc.h create mode 100644 PowerEditor/src/WinControls/Preference/preference_rc.h.bak 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.cpp.bak 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.cpp.new create mode 100644 PowerEditor/src/WinControls/ToolBar/ToolBar.h create mode 100644 PowerEditor/src/WinControls/ToolBar/ToolBar.h.new 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/Window.h.bak 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.aps 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.xml create mode 100644 PowerEditor/src/constant.h 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_plus.cur create mode 100644 PowerEditor/src/icons/CVS/Entries create mode 100644 PowerEditor/src/icons/CVS/Entries.Extra create mode 100644 PowerEditor/src/icons/CVS/Entries.Extra.Old create mode 100644 PowerEditor/src/icons/CVS/Entries.Old create mode 100644 PowerEditor/src/icons/CVS/Repository create mode 100644 PowerEditor/src/icons/CVS/Root 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/npp.ico.new 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/langs.xml create mode 100644 PowerEditor/src/lastRecentFileList.h create mode 100644 PowerEditor/src/lesDlgs.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.xml create mode 100644 PowerEditor/src/toolbarIcons.xml create mode 100644 PowerEditor/src/userDefineLang.xml create mode 100644 PowerEditor/src/winmain.cpp create mode 100644 PowerEditor/src/xmlUpdater/Debug/BuildLog.htm create mode 100644 PowerEditor/src/xmlUpdater/configModel.xml create mode 100644 PowerEditor/src/xmlUpdater/langsModel.xml create mode 100644 PowerEditor/src/xmlUpdater/makefile create mode 100644 PowerEditor/src/xmlUpdater/stylesGlobalModel.xml create mode 100644 PowerEditor/src/xmlUpdater/stylesLexerModel.xml create mode 100644 PowerEditor/src/xmlUpdater/xmlUpdater.cpp create mode 100644 PowerEditor/src/xmlUpdater/xmlUpdater.vcproj create mode 100644 PowerEditor/visual.net/Debug/BuildLog.htm create mode 100644 PowerEditor/visual.net/Release/BuildLog.htm create mode 100644 PowerEditor/visual.net/no_ms_shit.vsprops create mode 100644 PowerEditor/visual.net/notepadPlus.7.0.vcproj create mode 100644 PowerEditor/visual.net/notepadPlus.vcproj create mode 100644 readmeFirst.txt create mode 100644 scintilla/License.txt create mode 100644 scintilla/README create mode 100644 scintilla/bin/empty.txt create mode 100644 scintilla/delbin.bat create mode 100644 scintilla/delcvs.bat create mode 100644 scintilla/doc/Design.html create mode 100644 scintilla/doc/Icons.html create mode 100644 scintilla/doc/Lexer.txt create mode 100644 scintilla/doc/SciBreak.jpg create mode 100644 scintilla/doc/SciCoding.html create mode 100644 scintilla/doc/SciRest.jpg create mode 100644 scintilla/doc/SciTEIco.png create mode 100644 scintilla/doc/SciWord.jpg create mode 100644 scintilla/doc/ScintillaDoc.html create mode 100644 scintilla/doc/ScintillaDownload.html create mode 100644 scintilla/doc/ScintillaHistory.html create mode 100644 scintilla/doc/ScintillaRelated.html create mode 100644 scintilla/doc/ScintillaToDo.html create mode 100644 scintilla/doc/ScintillaUsage.html create mode 100644 scintilla/doc/Steps.html create mode 100644 scintilla/doc/index.html create mode 100644 scintilla/gtk/Converter.h create mode 100644 scintilla/gtk/PlatGTK.cxx create mode 100644 scintilla/gtk/ScintillaGTK.cxx create mode 100644 scintilla/gtk/deps.mak create mode 100644 scintilla/gtk/makefile create mode 100644 scintilla/gtk/scintilla-marshal.c create mode 100644 scintilla/gtk/scintilla-marshal.h create mode 100644 scintilla/gtk/scintilla-marshal.list create mode 100644 scintilla/gtk/scintilla.mak create mode 100644 scintilla/include/Accessor.h create mode 100644 scintilla/include/Face.py create mode 100644 scintilla/include/HFacer.py create mode 100644 scintilla/include/KeyWords.h create mode 100644 scintilla/include/Platform.h create mode 100644 scintilla/include/Platform.h.bak create mode 100644 scintilla/include/PropSet.h create mode 100644 scintilla/include/SString.h create mode 100644 scintilla/include/SciLexer.h create mode 100644 scintilla/include/SciLexer.h.bak create mode 100644 scintilla/include/Scintilla.h create mode 100644 scintilla/include/Scintilla.iface create mode 100644 scintilla/include/ScintillaWidget.h create mode 100644 scintilla/include/WindowAccessor.h create mode 100644 scintilla/src/AutoComplete.cxx create mode 100644 scintilla/src/AutoComplete.h create mode 100644 scintilla/src/CallTip.cxx create mode 100644 scintilla/src/CallTip.h create mode 100644 scintilla/src/CellBuffer.cxx create mode 100644 scintilla/src/CellBuffer.h create mode 100644 scintilla/src/CharClassify.cxx create mode 100644 scintilla/src/CharClassify.h create mode 100644 scintilla/src/ContractionState.cxx create mode 100644 scintilla/src/ContractionState.h create mode 100644 scintilla/src/Document.cxx create mode 100644 scintilla/src/Document.cxx.bak create mode 100644 scintilla/src/Document.h create mode 100644 scintilla/src/Document.h.bak create mode 100644 scintilla/src/DocumentAccessor.cxx create mode 100644 scintilla/src/DocumentAccessor.h create mode 100644 scintilla/src/Editor.cxx create mode 100644 scintilla/src/Editor.h create mode 100644 scintilla/src/ExternalLexer.cxx create mode 100644 scintilla/src/ExternalLexer.h create mode 100644 scintilla/src/Indicator.cxx create mode 100644 scintilla/src/Indicator.h create mode 100644 scintilla/src/KeyMap.cxx create mode 100644 scintilla/src/KeyMap.h create mode 100644 scintilla/src/KeyWords.cxx create mode 100644 scintilla/src/LexAPDL.cxx create mode 100644 scintilla/src/LexAU3.cxx create mode 100644 scintilla/src/LexAVE.cxx create mode 100644 scintilla/src/LexAda.cxx create mode 100644 scintilla/src/LexAsm.cxx create mode 100644 scintilla/src/LexAsn1.cxx create mode 100644 scintilla/src/LexBaan.cxx create mode 100644 scintilla/src/LexBash.cxx create mode 100644 scintilla/src/LexBasic.cxx create mode 100644 scintilla/src/LexBullant.cxx create mode 100644 scintilla/src/LexCLW.cxx create mode 100644 scintilla/src/LexCPP.cxx create mode 100644 scintilla/src/LexCSS.cxx create mode 100644 scintilla/src/LexCaml.cxx create mode 100644 scintilla/src/LexCmake.cxx create mode 100644 scintilla/src/LexConf.cxx create mode 100644 scintilla/src/LexCrontab.cxx create mode 100644 scintilla/src/LexCsound.cxx create mode 100644 scintilla/src/LexD.cxx create mode 100644 scintilla/src/LexEScript.cxx create mode 100644 scintilla/src/LexEiffel.cxx create mode 100644 scintilla/src/LexErlang.cxx create mode 100644 scintilla/src/LexFlagship.cxx create mode 100644 scintilla/src/LexForth.cxx create mode 100644 scintilla/src/LexFortran.cxx create mode 100644 scintilla/src/LexGen.py create mode 100644 scintilla/src/LexGui4Cli.cxx create mode 100644 scintilla/src/LexHTML.cxx create mode 100644 scintilla/src/LexHTML.cxx.bak create mode 100644 scintilla/src/LexHaskell.cxx create mode 100644 scintilla/src/LexInno.cxx create mode 100644 scintilla/src/LexKix.cxx create mode 100644 scintilla/src/LexLisp.cxx create mode 100644 scintilla/src/LexLout.cxx create mode 100644 scintilla/src/LexLua.cxx create mode 100644 scintilla/src/LexMMIXAL.cxx create mode 100644 scintilla/src/LexMPT.cxx create mode 100644 scintilla/src/LexMSSQL.cxx create mode 100644 scintilla/src/LexMatlab.cxx create mode 100644 scintilla/src/LexMetapost.cxx create mode 100644 scintilla/src/LexNsis.cxx create mode 100644 scintilla/src/LexObjC.cxx create mode 100644 scintilla/src/LexOpal.cxx create mode 100644 scintilla/src/LexOthers.cxx create mode 100644 scintilla/src/LexPB.cxx create mode 100644 scintilla/src/LexPOV.cxx create mode 100644 scintilla/src/LexPS.cxx create mode 100644 scintilla/src/LexPascal.cxx create mode 100644 scintilla/src/LexPerl.cxx create mode 100644 scintilla/src/LexPython.cxx create mode 100644 scintilla/src/LexRebol.cxx create mode 100644 scintilla/src/LexRuby.cxx create mode 100644 scintilla/src/LexSQL.cxx create mode 100644 scintilla/src/LexScriptol.cxx create mode 100644 scintilla/src/LexSearchResult.cxx create mode 100644 scintilla/src/LexSmalltalk.cxx create mode 100644 scintilla/src/LexSpecman.cxx create mode 100644 scintilla/src/LexSpice.cxx create mode 100644 scintilla/src/LexTADS3.cxx create mode 100644 scintilla/src/LexTCL.cxx create mode 100644 scintilla/src/LexTeX.cxx create mode 100644 scintilla/src/LexTeX.cxx.bak create mode 100644 scintilla/src/LexUser.cxx create mode 100644 scintilla/src/LexVB.cxx create mode 100644 scintilla/src/LexVHDL.cxx create mode 100644 scintilla/src/LexVerilog.cxx create mode 100644 scintilla/src/LexYAML.cxx create mode 100644 scintilla/src/LineMarker.cxx create mode 100644 scintilla/src/LineMarker.h create mode 100644 scintilla/src/Partitioning.h create mode 100644 scintilla/src/PropSet.cxx create mode 100644 scintilla/src/RESearch.cxx create mode 100644 scintilla/src/RESearch.h create mode 100644 scintilla/src/SVector.h create mode 100644 scintilla/src/SciTE.properties create mode 100644 scintilla/src/ScintillaBase.cxx create mode 100644 scintilla/src/ScintillaBase.h create mode 100644 scintilla/src/SplitVector.h create mode 100644 scintilla/src/Style.cxx create mode 100644 scintilla/src/Style.h create mode 100644 scintilla/src/StyleContext.cxx create mode 100644 scintilla/src/StyleContext.h create mode 100644 scintilla/src/UniConversion.cxx create mode 100644 scintilla/src/UniConversion.h create mode 100644 scintilla/src/ViewStyle.cxx create mode 100644 scintilla/src/ViewStyle.h create mode 100644 scintilla/src/WindowAccessor.cxx create mode 100644 scintilla/src/XPM.cxx create mode 100644 scintilla/src/XPM.h create mode 100644 scintilla/src/nppBackup/Editor.cxx.2007-05-22_000024.bak create mode 100644 scintilla/src/nppBackup/Editor.cxx.2007-05-22_002237.bak create mode 100644 scintilla/tgzsrc create mode 100644 scintilla/vcbuild/SciLexer.dsp create mode 100644 scintilla/vcbuild/SciLexer.dsw create mode 100644 scintilla/vcbuild/SciLexer.ncb create mode 100644 scintilla/vcbuild/SciLexer.opt create mode 100644 scintilla/vcbuild/SciLexer.plg create mode 100644 scintilla/version.txt create mode 100644 scintilla/win32/Margin.cur create mode 100644 scintilla/win32/PlatWin.cxx create mode 100644 scintilla/win32/PlatformRes.h create mode 100644 scintilla/win32/SciTE.properties create mode 100644 scintilla/win32/ScintRes.rc create mode 100644 scintilla/win32/Scintilla.def create mode 100644 scintilla/win32/ScintillaWin.cxx create mode 100644 scintilla/win32/deps.mak create mode 100644 scintilla/win32/makefile create mode 100644 scintilla/win32/scintilla.mak create mode 100644 scintilla/win32/scintilla_vc6.mak create mode 100644 scintilla/zipsrc.bat diff --git a/PowerEditor/bin/ConvertExt.enc b/PowerEditor/bin/ConvertExt.enc new file mode 100644 index 00000000..f15ec8ad --- /dev/null +++ b/PowerEditor/bin/ConvertExt.enc @@ -0,0 +1,93 @@ + +// this is a comment + +// File structure: +// +// GROUP "Group Name" - language group (Russian, Polish etc.) +// TABLE "Table Name" - encoding table in this group (cp1251 etc.) +// { +// - hex values of your alphabet's symbols +// according to the encoding (codepage) +// } +// + + +// modify this file as you need + + +// EXAMPLE: + +GROUP "Russian..." + + // first TABLE of the GROUP describes + // default (WINDOWS) encoding + +// TABLE "cp1251" + { + E0 E1 E2 E3 E4 E5 B8 E6 E7 E8 // 'a' ... + E9 EA EB EC ED EE EF F0 F1 F2 + F3 F4 F5 F6 F7 F8 F9 FA FB FC + FD FE FF BA BF // + ukrainian [ye:] and [yi:] + C0 C1 C2 C3 C4 C5 A8 C6 C7 C8 // 'A' ... + C9 CA CB CC CD CE CF D0 D1 D2 + D3 D4 D5 D6 D7 D8 D9 DA DB DC + DD DE DF AA AF // + ukrainian [Ye:] and [Yi:] + } + + // second, third etc. TABLE of the GROUP describes + // additional encodings particular to the GROUP + // (to your language/alphabet) + +// TABLE "cp866" + { + A0 A1 A2 A3 A4 A5 F1 A6 A7 A8 // 'a' ... + A9 AA AB AC AD AE AF E0 E1 E2 + E3 E4 E5 E6 E7 E8 E9 EA EB EC + ED EE EF F3 F5 // + ukrainian [ye:] and [yi:] + 80 81 82 83 84 85 F0 86 87 88 // 'A' ... + 89 8A 8B 8C 8D 8E 8F 90 91 92 + 93 94 95 96 97 98 99 9A 9B 9C + 9D 9E 9F F2 F4 // + ukrainian [Ye:] and [Yi:] + } + +// TABLE "iso8859-5" + { + D0 D1 D2 D3 D4 D5 F1 D6 D7 D8 // 'a' ... + D9 DA DB DC DD DE DF E0 E1 E2 + E3 E4 E5 E6 E7 E8 E9 EA EB EC + ED EE EF F3 F4 // + ukrainian [ye:] and [yi:] + B0 B1 B2 B3 B4 B5 A1 B6 B7 B8 // 'A' ... + B9 BA BB BC BD BE BF C0 C1 C2 + C3 C4 C5 C6 C7 C8 C9 CA CB CC + CD CE CF A3 A4 // + ukrainian [Ye:] and [Yi:] + } + + TABLE "Default" + { + "àáâãäå¸æçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + "ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß" + "1234567890" + } + + TABLE "Reversed" + { + "ÿþýüûúùø÷öõôóòñðïîíìëêéèçæ¸åäãâáà" + "ßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇƨÅÄÃÂÁÀ" + "0987654321" + } + +GROUP "Latin..." + + TABLE "Default" // original latin alphabet + { + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "1234567890" + } + + TABLE "Reversed" // latin alphabet in a reverse order + { + "zyxwvutsrqponmlkjihgfedcba" + "ZYXWVUTSRQPONMLKJIHGFEDCBA" + "0987654321" + } diff --git a/PowerEditor/bin/ConvertExt.ini b/PowerEditor/bin/ConvertExt.ini new file mode 100644 index 00000000..9006dd9a --- /dev/null +++ b/PowerEditor/bin/ConvertExt.ini @@ -0,0 +1,2 @@ +[Options] +plug_f=0000 diff --git a/PowerEditor/bin/ConvertExt.lng b/PowerEditor/bin/ConvertExt.lng new file mode 100644 index 00000000..306ae189 --- /dev/null +++ b/PowerEditor/bin/ConvertExt.lng @@ -0,0 +1,14 @@ + +[Symbols] + +;default symbols (english) +SymbL0=`1234567890-=\qwertyuiop[]asdfghjkl;'zxcvbnm,./ +SymbH0=~!@#$%^&*()_+|QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>? + +;alternative symbols 1 (user_1) (F9) +SymbL1=¸1234567890-=\éöóêåíãøùçõúôûâàïðîëäæýÿ÷ñìèòüáþ. +SymbH1=¨!"¹;%:?*()_+/ÉÖÓÊÅÍÃØÙÇÕÚÔÛÂÀÏÐÎËÄÆÝß×ÑÌÈÒÜÁÞ, + +;alternative symbols 2 (user_2) (Alt+F9) +SymbL2='1234567890-=\éöóêåíãøùçõ¿ôiâàïðîëäæºÿ÷ñìèòüáþ. +SymbH2='!"¹;%:?*()_+/ÉÖÓÊÅÍÃØÙÇÕ¯ÔIÂÀÏÐÎËÄƪß×ÑÌÈÒÜÁÞ, diff --git a/PowerEditor/bin/LINEDRAW.TTF b/PowerEditor/bin/LINEDRAW.TTF new file mode 100644 index 0000000000000000000000000000000000000000..5f57f844711ea918ef2633858600a646a504165a GIT binary patch literal 80024 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

~Z!^ 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\n$ +incl=#include "$"\n$ +main=int main(int argc, char* argv[])\n{\n $\n}\n +switch=switch ($)\n{\n $\n}\n$ +while=while ($)\n{\n $\n}\n$ +whiles=while ($)\n $\n$ +[3] +case=case $: $\n$ +class=class $ {\nprivate:\n $\nprotected:\n $\npublic:\n $\n};\n$ +def=#define $\n$ +default=default $: $\n$ +dowhile=do\n{\n $\n}\nwhile ($);\n$ +dowhiles=do\n $\nwhile ($);\n$ +else=else\n{\n $\n}\n$ +elseif=else if ($)\n{\n $\n}\n$ +elseifs=else if ($)\n $\n$ +elses=else\n $\n$ +for=for ($;$;$)\n{\n $\n}\n$ +fors=for ($;$;$)\n $\n$ +func=$ $($)\n{\n $\n return $;\n}\n$ +hclass=#ifndef $\n#define $\n\nclass $ {\nprivate:\n $\nprotected:\n $\npublic:\n $\n};\n\n#endif\n$ +if=if ($)\n{\n $\n}\n$ +ifelse=if ($)\n{\n $\n}\nelse\n{\n $\n}\n$ +ifelses=if ($)\n{\n $\n}\nelse\n $\n$ +ifs=if ($)\n $\n$ +ifselse=if ($)\n $\nelse\n{\n $\n}\n$ +ifselses=if ($)\n $\nelse\n $\n$ +inc=#include <$>\n$ +incl=#include "$"\n$ +main=int main(int argc, char* argv[])\n{\n $\n}\n +switch=switch ($)\n{\n $\n}\n$ +while=while ($)\n{\n $\n}\n$ +whiles=while ($)\n $\n$ +[8] +b=$$ +black=#000000 +blue=#0000FF +body=\n $\n\n$ +comment=\n$ +cyan=#00FFFF +form=

\n $\n\n$ +green=#00FF00 +grey=#C0C0C0 +h1=

$

\n$ +h2=

$

\n$ +h3=

$

\n$ +h4=

$

\n$ +h5=
$
\n$ +h6=
$
\n$ +head=\n $\n\n$ +html=\n \n $\n $\n \n \n $\n \n\n$ +i=$$ +img=$\n$ +input=\n$ +li=
  • $
  • \n$ +link=$$ +mangenta=#FF00FF +ol=
      \n
    1. $
    2. \n $\n
    \n$ +p=

    $

    \n$ +pre=
    $
    \n$ +red=#FF0000 +span=$$ +table=\n \n \n $\n \n $\n
    $
    \n$ +td=$\n$ +title=$\n$ +tr=\n $\n\n$ +ul=
      \n
    • $
    • \n $\n
    \n$ +white=#FFFFFF +yellow=#FFFF00 diff --git a/PowerEditor/bin/SciLexer.dll b/PowerEditor/bin/SciLexer.dll new file mode 100644 index 0000000000000000000000000000000000000000..a4c4a26faca8dcc90904c9066a502e19fa286fab GIT binary patch literal 352256 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%0DcLUdC_8L@F zSj69%^*JeGgb+z!);D+Vsj9l7hg!_YWRJ z=M1%at=2$cWFsSYN9y;SLY+4>o7=ymap18{lheb_G|Y9*1_Neu)GxL+YKZ80YFPHd zC8^&wPfQQkV)nF%}`*r=L$>*;_8v$emSCbE(N5?`B~Glt!%i-g9jj66_E~yf9|Cj~ z%@~bn1wm?h-0N75+(1VxVKA!b4iV>`tUGvof9j019?Yt#_iMthJ?g6h1A>@gLZkw8 zzo9Q3GOV>>Eas)|Llvs`P@YofzVP9+yH4 zFZZd+hW&w-UvNQb+{V6dufS7#kSm;{lMnFA1a)QsQalzDRtDZ(JjKrPKpfZ|UtMEJ zi52O@7J;~7?QsG$2)R#HHgs4=vF1m#ckxZy<7N}9bEnY*d*em>`7A&PtPCQF$_&RB zxbG|~NJeYI(em+EE*Vczm`r8ddcEWL+-|O@(eGz z*pyzAPR5MPbZ?DGuJMxDeiUi$h>!DEu&d%=WkaVke0IY}k=#PrY9^wD742#oPI40| zWu%NQ^damBS$ z!T@{CBODnOWw7zbS7E(y1B2A~C5ng7-C7c4o_%jb+Ipdb?*Yqd*0?n%i6boR-W5DC zVZ+SyE`a0E#Pss&_Zk`n0??97cmU67C@*|BWDNTQV-g{+Ar~9&xf}?TI;;7SGEHAt zRC4@*mJcOu5#;|na-(Z&Kq;7yC-T@bcO@%R%iYv=6*~VafaFGH1=_#DBU;L!&x`_Z zM+_Lg=BjVQp8z%JbKODLn!2aii)W;-QL8BWD*)9sm-tzFwpp77o+Tw z1W|7cv^=leyk+ST15~?LrR8FKly4w@Myh%E86tJadEOgZOdo8lUPaj3(f}^kjn2mk zkmXA@=v~Btb2ghuN?HOl*$BIyIUV= zCys+dIlwsCtqmtwE;7Dpc@N5h1@x|9F&{0zEO|fos_wrRSZj)wy(A2(k{j()h$oUi zA`ezE5V!1OvHRX!&jv$=sqJyil#pSu-S*Xe#sD8}*e*TA*h#7tExyqih37#ua3ih< z3l`A4WF7fx!oSfo4JHSlG&-l(9eJ$N9TnC-sKUoN98fsWVo2o;Bw}hAX!(F4l09Y1 zU(H1hzQN{#eHWW}hVngbX$7{e9bECI+|)I)sa`6>U)**Glq*paMJ72wZRF#%^DA>d zc9PT;#l#Q#zPZom%IeU^awT|jDl7B`s+rp@HN}~Tcqq#9rR^FWvUp`oSXNHzM#*R= z$y&-gSOGqGZ6b;$8J?DXPt5pFr<+-uy14lmg%n9|DmBlkIpIvu%Y zFVK)M*xEzxXC`ZNf-u2D^iA7kV#)!6(6eD$8#1uq{ZoK$ z>N{sW4phbMk<0JT#-{ZpcZ!x|UNb&nw615}pNymq18wBG1?~;AJg!nI$Pp=ki~;=8 zbzbUf3FLzJhuqKoOmoJh4o`tj(&O830Zn5gP~%?232N>P%z_Ax+}sTtPNIQ%514tDtY1NXSwoaVE$01usu`+atPK_OBm=oGXoo8oP=ctK&R zM9w>ttlwK62B@51<-ijjs?g4!-C@b#O@b{VvpKL|6l|Ez9x>T|UvAURrMc$@i!gf` zxKC^|M+wpVr^i)i%b8Nqh^&_-kwnzCj`17~aep|=oamQbpx6=Jfp(0hk?$46whzJg zMG=%nF%Q%H9Q%yBe~KnI+mcx~s)vPwlWM27*Y< z_Z%`V9F@V6=rD^8r+Tr5L)hs+c6g}>AlyTN(^^j{65TRU2DrY zA9SI1q1!Oe9?%{C<`aEvBI_nMKWy@RwP+km+T$v>j3rX+Uds32Tf(?TG2+-tHt;+8;2?M zG-pUeoTYfLCEA2;XS;y>lxosMi?wg&Sml2>=Z3amY4gUMIg#OPETzqJOXfI7ILHra zziPIGM^N4NU})}y(+U-A>*8)(_eZ}Y>Z7%RXZyQ{z# zIkP>k$3pI}Q3ye_a*4#A!fB%0X0=a0+sRUN2bCo#&j=D8KVNJ(PomV#N*c^bU7VGG)ZHqV{qbKF|@3<_5c1&a0P z0qWABdteN=tj2p`@b#uy%-GESAz~vlX*f|s8SoN(HF3Z_KH2PrX>uXQ&orD?XCUU% zG5qxwLFrh&?5bM9m`0CvU*I|2XlDf&QLpQV(K56qFkI1A!1h$1KqD|N(sD25JArQ5 z-DfZ>o6a)2X+2+hWM^3f!QfCsIT9R7@VLu0rEt|TUYt`R{*hs5K=1c@41T zgUHT^A(rgKI?ELEu>_9%Hj;o32kyW1 zfmk&+@@M$g(0-qU1I5i6`L{C^XR-VV)~jl8jO0r!giRP^Gtf&yD2QxI4q@-zQt8s$GHh&HNt8iMK+2 zb0W4|FHlEnRn@L&qnDB8EaL8y-rW!wK4h-5%=^9uF|AKsNOqN%U8I137hpiGBSq8M zjSZ-k_k+Vg;xl~h)orJCRIc{s+7G`dJ>P@=)I<=gi8K=^|4W;f? z)Gh`pkEYCVo}j8W9!edi^nX$MdzoSTdZL=+?o8ufRf zNi*_8AKyrOuD>okgq$hlY^g43e>RJ*hO?Hm#(i9@SYn%e-sNgj^qh2yBE_v&jn7KF zy3qY@&Z$0jTylw6+ElvExkmdgkNTRQ)z1a(an%^fV^8HbMfAXbUa_9+Vw?33< z<=M8Cqr9q$%tDw+cIqvo-rU@2KcPe^2qj)~ZzXTbqLOgds=hl)?e}vZWB(AVe?j|q z^ciCCvWrSvuc{c5c&*xf8%ntO)G4|WDdZ7%qb=+lirvjbF5cC0i9Xq!#A`p#s&;=# zVGJHXU@5>n!F=KLC;cykaBMe2!$rxTYg`U;S!i6<0?(PR&X||j-i-8m#F+{ji z13Q44av-a5N^HgF*2tXQj$%?!Q05&G$nKc~#68!K%AfA^1+KJ$r0|dJ>X1i!+7jfZSnGp|sjmpzd zozqd8Og7M-hdJD1D!&nmF1b%nQwQ590{YYeQVot03=0sD^@2=F?1&(;L|M`!EG2+J zEtb;B4EsU_{|783`FQDEm56o-ODQ_WMBg4`B&%a=^zB7RKLm#m?FiiSKWtcLu0TdD zZ|{H>f^bkuIOEgBalup47`=pZVU(`VbgS^VY=qCgRTtLx6V*z-2Sym+~D_ zcMDp_hFnVJ%j0^!!P+t3gsJI{RH0fbD^+EMs?4v-?(o_$Qf-){&k~m&WCVP=K!b=8nz2-?hwTKA3_g=t75L+*`JjabZhyf0vB4cCJsslb#$ z(_bv4bX8GE6$&wKh=T#^{)X!JF!xp>X)qk^=Sf_xP35a~Y$|e34tXKoXtF{RPyr;L*5Slact?M3 zToZH^@##0=r9ZQY?_Eh~qn>$9Fk71j)beQ>l_CtehZa7bPaHX0??3{^YnH(T8dOW% zizH&tyuF_1urnxA8ZAD|2pFnuxaKgOaWAD4%|y&Z8S|?9JMvS1UnLYJzbV4$VoEp< zS$`{ht~;Ev()_shabei6SSMSQ@R9v>6@6mecKN{H>B6UlGdwzv1-#$=t;T&riTf#5 zjo7dPYMtSfi>ZyA1G`sL^`_M3atDvh{~luttGPAtK{VxiH08c;e0a^EL7`}oz14f ziku}jukc3Lyw7VpOHnm7vgWO>1E+-{!Xh6M20kXhODP?-qxrhysY3< zz?|+-$$oVlhFAyJUtGE&QzOCX$XNES6 zb_jOzJ?*vFDZ@y@SJc{`uTfIYa@#gi;D19f9xU20z~XdUr%Dd2Np32mOQKd)GMz~{gZ+PuU6?hzadkt6t=ed)YC zHcw+K?P6`x57{u&{6=Tk?1r&0BV$r`i+NeVESl=fX)K0&(TBa}GvX$kGaHM%ggG`r zpp!$aOz@W_yW>k0h~r`h)4%hNdJc3_#(uzw(E$XIvT z2>J=KMFR#^1U=6;;$n=m1`5bO7H49VF{&D+;8#${Rz4{H61Ui~oP=$b`>MSWv`CM_ zyd8F*@lyP=gQH|a+9T*uA_I@bL-PjcA`)`0uH(uJLHp}MYlGSyF3a8>VyF253C$-q zM$RHi+nLQLqL>L{uT{zuvezosFVO|C{TfTH25G)0DVYp+Qv$|E&%71uESJ>E=%GN% zTU@|?RUE`1LfiU(6v>8pbgAu$%v;=6l8k!$fdIQ3?lcQqb1E0bP7Gc5Du2*Yu6@~; z%57dV?qyzd%I5%m`LZ#K47uMNX~iiKwBIi`K4n&2+)I;bL4dKVgYuXof1S!$%d4Bb zGGOPEtMn&wwPLRxRNoV(zDv^ejiGZMe4i}0qpUQ8l`d076XmV;D2)Z(7%f)Wlef1%hZaQPZg- zey-35bE;l*W=K<%Ek+%Kfa$R9GNj;X_qd*|>7+=$Zd3Lau3xA1ue`<#WDgCr|A1MA z;^5v_G?}wd4>VoEaTaVOu>Kd;FVJ|Mhu^K*B~sk&bLN1a>}=LCW7QNcm3*L;hwVsx=5(?FL}gBFltH#wmSH1emcZFlrI5 z&u8O{%z<}{Fx_SfwCX$o)6a*`BIfqF0@6Z;Pb5pug#xBu!1251d;v-}WdJ43iA|@C z2XpKIm-i9u{@=WtQRdWDDD6VCmxSCGwNDlimio0Q8|xBHNZHkPp-m477vCWI9iWS% zsP~($>Rhzc9ElRuMTu1kj>C%fW4FI2_UEj?{V#kX_I7UU1!8IW+0fnq0p6J#-y0#c zw|^KPc6YE~5M}UYZ&&?qo;ek|9n3I5eZ;A!{s(TSX zu@e&j_nLGxl^qNCttKoG+sSk0h**e7rKxmyATE|w25&7|)WDD55?(2%o?#VlZ24_v zZE0jR&P#$Tn+y4TV`~iF3qe?AF8Mko9~R3*?1$sQx7>w%`r6U|Otd zkDPpsSl_Vlg!=HLPbU7*w%i|?*Hjzp%Wpa_))&Cs4BF{?jL9|KGSS}7GHygQ4b@AXb9y9}Kw0IA27ap>L^eV2dagJyX#<*mV8g`f>4tGjD z&Tq=a$pB|oGG236lEBXpeqwi*%tXQVn){JU+8rge?t~$BiKGOo_g9JL{w%b;L+C+` zVvrRAjV~}}EjJhe2R2a1t0i2j<`CN>;R#dTJ)#<|ruKYhAMnQo?r*Yeg`OoRQ#xBDZj2~v6#yIjznS#dUFXZNUS&`4BpMTAr zmJpE+#CK#0hp?SH)1-1hsV>qnAo)0d*qyw`+#_4O^GkJ+PD{yllii!n{=LoqB2NRI z&p@&mciJ$Z)6)CBvXLH=P){1?O)VhFgtaS3$MseC<4;f z44Z;MOIFDJ52XRMMKF7`Vg(5dJ={;eYnBPGgvN4ylW^*rq?zTwS}-Oo-eOo0nbUNQ z7Qwl(zCuEoU4>_o_40J)+xOcav?YCQoMFCU(bM&S7S4 zMJ`+%8NGP1vxrG`#OJlN0{$g+iP1^_L=7<${d%sL=nx6%s=tv*pJUUhPqfo(@f4AJ z3Hh{5mwMFCw)zUSdM;ID@gShe(&o>LOiWzouevU0J(3g9dbMsYQFbwtxv9wg-Cwv? zcvAOqQq3AOJ43De514U@D8|&f-|#MxcV8gb$(b40Np;?aOM@sgK21fkZTD}w4SSrX zOCe)yWQ5us$(M7MhqJt)S)IDty8;+{UZU#t54=9c-pvx)<^*T7!e*FLUOr80p^>qP zr&0xBi7YqhE?eu*1 z>_34x*K7<7qV-KZ&@TBU@}FAQ&q_|Yq*UdOYyrcn%!cqVB}o1RKWrQQA0eDg>X(&iXX_P%K6iyaH={Mx zOj_V=DLj9X{Dm7MLC#5BVLrfFvAbAAe)ldi2)J$6l}Xa`X*&*a6wPbp zXu}ynhE!r#G=;(#Mg;EP;kNU**K?UlOyf4zR6Gj^4wk@EP~2G0o%K$>tiH%D=r6re z_FEK+6u2vFKO$GB4!Ijo*ctuC>|h_zx>T~>RI;`n<3t%u5Yw$M>*p+0$s``9&Zpj{ zoB!2vQ0xT)?3`0OQeW2x{E&1*rD_=hKjw*;MRwJ?XWJLlJ7uv`Hwm-#W?{D8BFxq` z!faiu#dGVx#S`nC40-VAN3k`C%zXg=~G6oP>>jk`Rr@hv2E`u685=q zpTY6USdRf*E;s$n@A%44M7`@?>^jTb2g`&;0{kkt~CW#GM~IWz^+;Mi$YRWx7=v>QLgRLNo-UIYt2K z2&OozcsU1`xj3VJm8^7|Uf>$Xgh0!8sF*|E$UuucEx0-Zm_K_p3al!wQZLDafxZre zW&YLkz6Eq`HTg7W!9Quv*J+LeOhtcFeyeItQw(a~)4nnjqeY$88xRza6!7{PV(|%# zm`yqu_nJSZXzE@W5O^Jk;CweKtKwklIfN4$We0R))b1mjk27i-WhPZ}8@&XvJ$5YH zIlr>zfWnaXBsD?`PabG_h^uCanhX|XQe)eEd=gk-$3eMjJ`PrL^YImtg68AV$cED<2L!Dx5r$&l! z(U!D3*?38BPDb2Q10s%iY3X}Gm zQZs;PLg%h&&l#1CQPZASk2z1wNu9yU-DsT_md3VC#m=_OY)*~0If#hPhbxeXNMfG> zBBDypdx(e{tzvg}Ir5?JQapUt)*i`+zWn>N4(S=XBoUGPge#8JS|?XTIEq4&jjHFh z=C!8)hwJ74N&aJ5xAugu&DqyR%r_1YlJ*oUzE)G#5-$o@$+WISc9yUg$SaBW;ZSUK zRFA{eD?-F#^iD)KM-%mg36k&>K@!?(9wS783GiB)SWwnh^GsXt7fscP>?Nj}$vWT$ zWW&O5QS-4PVEFoC9c6RN%uBiJHAHzNk-EHQh(t@ld@3~}k=^JkXFPmr5l1(IZxQ=u z{4&{Y6N>OaEnfWY%!6=(d8^Ed(g7^m%>nk)Sa@hwW9t;%C%FE&eBmNjN%C>PU3ZAR z&_snALi}nI6)HDH?BHxnB%)owE%3KYDyZ&>X!KFlA8_aEk+u7@aGQ}v5jlYXZNL`c zNU!WNvctY)7i(T71P9yz3C+>JAoT2jJx@LY!9&0s>!dFcj7Scfcis0_3E zG{`8t;w>af-=z56A>PsctghSzSOj>9ZZ>M5=4Wyhp}nx)!6m?ybvxfD`C*gnt8X@s z&2jP;HP4?DIZoZV@GnNbjFGxz?wmat_{Zzq&qd8Kta!@~K`F&LdScs5o&8#PI;j}%> zrR+W7GC;fzxFe4A$_5RE&r?8(Y%(n>WX41#lyUP-Qy!~xci0>bG_G`7sRbys>f9go zr<#)@>dI&8+;8-!>UgPmcfY7}H``Rzsxzq;@sWd!^Voy2cXF4xkN*MYgc#)4nh#TL z=f^ilOwEyN!psaD+j*OhHS>JpSQG^JIg!yz-3$M2sa<}o&z!frCOX;3waS9bBn0*G zO6IYhz0w4Op$86yCclVAbM!S|q9+39<%Y8m59#DLM5M1+r0-1mbno{$#C+brD|kv! znsOCD0YI?A;e9px0n`v>s@NvOzTBq_Bj)U{a*CU{DMJVSWX-9>sP=*{Z2xmnHsfC0 z&NQPrIKI9FS~_nvp0LF1Vb1zefO8|;A8T6z5gyo*k83BXzhrfh7n-^)(w!BLNrLsHVeuYPq2eihbT`TDUWbdR|fIH2)V*x&G zE?9tq?lTMU2V68q5BnlZ408{ZsrQ9{$rga&!sfnaIuyMi);A|Ixz1hvf&HT6^hHYm zr7MfD|8yC1#IC{(Xl~N1qec+&vK%pQ_F^1zWWhJV8D%^97b@3@Ao(Mm$PmE7`ZS33 zDG$WQ&>}-zDkwxxR)krnK?J%7+#i#Y{34GCQ13Fz)uY55ZmY~yd-alu&b4+fXob@) zmUiT7^qMmi&Fp~t$KR>e?k1i)Q}?fMZw6qr=&+(@lVO4PTZ70@>rKMw{QcT zSALdGqr-LuPi7@Q&9vn;Oy!%nx?Dq*=!u@Gof_TJMNlPe_PGoe)@4JJ7gNY=AhXt; zrT7NeTXectkZ3;S3wl}%TUFpIJGq8d^EY-3-q^5h$0icU;aGWOo=p4hd(z}h3EcN5 zbAg`kVO>PKXRSk#(Or3m0w$z}RBW>(>{x8u@Q|^97FnmjMvR>O$^YaTGuXS{l)CqT z`)Pjd)^Y`%-xci5N`8ql3BaW>XYfXWfOq?{tv>H|#f|QE-O1**KC%+~w-B@WTAk8T z*J;y1D#Rq16LZgrjOU_osrzrNbf%k;In$ZrwO4vZ82qX!Uh|!?weDVs z7Isbb;=^W$4^y1rQ`1ZUidDq2TeYKcM-!aY%iWf<62p|Xc$3>5f!zpza3?1)7$$dd zS1<1S%_pX}HuxhqH=mdjX=pxC6}h4L#CZ`EXnyx3W|MsW$VCP^@H)ntJEvTrfa9A_ z%!q({ueb=UrFqqhsM0<9fhwf7)OMW?%kzAK-oa9QWP5d1sz7NsW}zZ$ExEz4fmZi1 zOR9?trMkFCs*4J#E-sep;u7)Rmx}kkOuYAO@!pl0)4zS#@aIERCR=54R3IDPou+XBHU0t82@5H~dZk?@r@6+W z^E@-7#WoHS9SWXG=uO! z!POVkxl_fP>@32RgJp8j!5ah^c-7`!tP{hzhUq&*)V*SN&g&uo#sKka!GP5+-vr%Z zpRNoZUT1*346$LmO0r;Qlc(S_hmzuXI4#5oG7MS!V&J|)5)^)zyH5u0>l5MVSrBN^ z*%nn&pyhpYF+b39SQpXGoIo58G6;e>m9VQHp0+1;EK5c^-K#Lzjp92q!sreUxlhte zbcg26ZX2TgB=g@FzNI~Wr{$Rrxo5m2ZpqxbZyu)Jp1St9fO|vf)Fpo<6<+h<%T-FF z6Kg7jrEKdT1a>XaH?KUKfG-c(&+tDZ>JsWIVP{82kY z*0ki1J3{Z{+cGNWIp=5}JmenVCoWl6QPY}JJ~ohi>^U`Zu-=T^XggN>R8rr|U8c%6 ziIja^{bfPQ7G|RPgd4?nM8$TLvr`XA6^7i$yh26xjjhz9R$$*8?OsWtoYZ8l$|7Z& z7v>F-v)!A$QksV;*#1r_c+J}vlcQF={~F)!>ySTgIR4AL+}%x@p>cLGuFxWG&?3HE zi+G|I@nkLHDO#X&wLs@-f#Ox~xnkMpnxw&8B{HyDHJq;+E>I2ARKo<-aHDFNsTww^ zhW^mnoN{sKfja^q0OA%d!w?YKc6$mA^*m>;rF!ji{Q!xA###jEh#MkL1_FSG%DK7P zt!FYbtZ?TaX|@s z#TSg$kjU1KoejS41+wsUPCm=8Y-5corq-SQK2H*3&)5pP=jg7Gz~5L7hs*Gle=4bL zZ5W=4*?e0=k-bxX+S3O%70>&O_wa{`-5}8?OuBchAB9GXwMdX9Bi|&|$TPd$$2!@g z_B|-0+g3vb!ayrjIUV)wW`%$F!&`s&-+|a#QN&$C@cLRlR)J!K`kHu2Xnmt-Wczie z6y-eIz)Qf_=L?HUV#=`whzbA$n9buxPI(-gsr;4BjF5ZnG3!w_(IZdo)u)z)+*^7y zh$1o}SD4U{wya>c0owS1E7{B`w$3`!nM3Y3OiF;(5Y6W$x7FPCaZ41Bm)yI!t&8nq zuwQBoo^-<|w-?zfF6@HUAuz|-l}IC_r`9`D*)P`0DyZ)kz~-VSBVv^Uj>F%+n~k;5 zdIj4(W`gY=^LaItn;Iy8>J|m*4m6tbH<|LESNRjB{0Sc`?*>!$ddl7`rkA%>Q#TQH zc-w8x93%*zbuRu{)q_SZO0RXEq4Z~+Cn>$gdE%#87j0{K0|6bb)zM=~aFq}6Mj;k(xD0iq=&FKtK$*8NKScer9%Sh!E4kTOWB?;y7nRiOy z)>=*-_O(S_-ef$Y^34$>-#9%SPB@47@^Txv=Rt^Re>I6wHY^q{@GoJb&(yuPpM4BG zmsc06=yQ*~ZI+ldZ)=`MMDi4bz(cS-i)*|7zN5tH=L_LACzGg!)L3p3KS0B;l94+a zOHIO`(h0XV7Mp}u(h18O{U+g=bi!4QJrIXl_lN0(ipEZp@U3*hgvP@rp)H*-vT?sj zxYJ9}NqcqU9+S2vU1)-_daHGpr4vRrK4VH;nRzPqT3=!}DyYWC+F)|uOb9NYl$ z;XKRjJuYtV=l=?~H<$J|cJM@a&DI5!b%Q(7+}^|DVvz7jxc9OV?(H1Mt*b@zv z2&l#+T|rRM;~U|hgnVo=oUGe|Pr%3Rr+##y4G3hBJR^QR|1OybJZ6CWdS@u0-k;DbOx1QL~)r4$csK0YgO|MsgVzR2Cb49(`Y z_1fGLo5WS|0vP8_Z>Bw8I^ZwG`2T5_cuRTf2V!4kLo|n1Oy2$-3Kg*C-H|I6N6I-e zjW9;t+sQ~aGr{0sX07`of3aB~$CIhg638{sGKEWHwtal}$v%cE`Bff3l9X6l0QLQC z;J&}>epuq~iFwWQFNzc{fR0tYu<7r~KPdg;&DDXH*SM;6fB8S$WA&L;?@S0hnP>Dr zSCL~ZhpF4V-p8&e7;*Bx-%!Y=+?IQ%i8V6R%~Mnd6ml# zf0!;9e}&tS`>(Y5)`za*D^Yl5f8kYw3pbd;Yt%vKDags=UNwEr9#>tA?JOH;KQ1pk zN}|2s zHD5GS=7ZlDcMRwD0j?N#h*w@Vo8ZRffJT*I&?R5FE4e<)TnAE@a(%YBE=o1%H)-YOsZ4}X}bE?9i$h{T9Q!REk|!`iO8uQ>GqhJAr2hbFH25~jITTlWmDSL zW1eVKl3<7k9aGN}ADUipQoSDHb8l044uOBqyS@uGp2B{YiO6BI3nfaJ+SR;a1F zWhNPPFyubX>Sp7G7^PEwZ&Jvt58>52@z0RVT=&mRexl^sF{}^V3uEm|jM&~WgoA$~ zhhE?T^ekl(2TZL$;}Uot4h_3hFj%Z&^jKvFj^0nmHKX?^7e?oICr_I3T9n1eh1^E& z={QHB<+cKE$U^RQ>5_!yy^?G7ooPN=!!*(iQ^=ia%PdU&!HiFC^L&PfKTd9Q6-R0_ zG{rgTmYH50MMUWJqLWM0i4vw)*)UxC=r5>DLU zo69r}9<>D8d~sz%e;C%6d}Y!>^fGipBC0w7$C<|w)?*vY=uc-#FD5C7I1DeL}q zYubRn)H6+yv9Ae&+vN>!v5dS*Hk^Sa--t9IU5N*?FB^fUzn?WkuycZID^Zt)`6+9Z z_x{ui&>UWH+nK>=!ux^d0(_2spt-~Drw{hB`0@vWiZb?qigr1h06t*&R6SI|g39r| zLIzDPevJ1BORmSmlJlP%^b1SQFD$tpizVlZnQ>3YlJoat$zkMyLLSzlgxc&^<1>{Q zEV;w#z`dW~Lzo%PtTjMfn6opDJO)hCmDtXb)6oztGrA9cwJw8&Am9VE(pUi?b+p3D zU{M8{i(zfiVu0TyATkz7xegL{I6d|$G{>-dSfW1D&*yzpELzyV!ti=|9-hH9&#~h~ z*d$^^9g5F~XyFfMrPG1-i+Q5f&Huf3BvCXZ;}>U`6=57yk#f<&*$t&c!^BkwsSO4g z=gRNIVlm0cO1@h#7u?E85ZTV8{M*?x!nMefCR8FT_AtoRkX>p|hFS-^tt z?_(EuIQP?xrLW#5TDLg25MrVejuQy`Jw9PYQil2iz!J)D)LtDyJ=sN1jNjY-bj|+$ zyy42j@9j`JuXA69DKV(n>^3)Cgiljj3!b4Fw5k4Uk90M+}l<#Pw zA+fgIx7bl)J-1Nt&v;0~c9F6l;YJSmftEP!u*`aTVjw=8NxKDEck02p76e=_p(cEPBfsxQelAUp;#}Dzs6h;zVw*TD0<*bR!U^=Fz z;Ie$4K?W$`U5pdwHD3ySdJh^zj(T>?R`ZNORd|gQ(~?Q3sj`wr?L_A#1ACk->C{G5 zM$vDEa}9!5cui7LVdfb@t{9Ei5wXR38taL?j*hLvz3XY~J9rMiDTlY7Pn>hg{lJv_ zTz%w#!77l~{He+fpI|~`wj@VfcKhDS4V9j1=7L)HgE!0+b0$cUGme^8M8@c&Eya4A z?}||+PQXA*<)!j)LmXmXe;gxr(|K@9Bq;wFqi0YNHdD$wf8BFC{N4(+{F5Zg@4WHR z2O!T$zOu-(NbUggd|!*5xJHD0uc z3331^9w1zZdJh#Fj41cXr!r#@6EJfvez}9uTYk(&1D%c?Unz%YY_~k@mUA^)^T=d; z!EX7C=u%YJEw^x$l$VyFaoEUQ#kCex@%8Sf$TO=^Uf{`TCId*8|Dp%iyPvR`&?^JU zB8vdgrO&fU&2ccqN`u|UVA5L1Mpp^chGxgc}1Ji+xhg%Fa(dq$;(Ar2U1* zfQmrVen`{w8{*eQ_)-ZE{X}pm$~!*GxPl4&qyY^{y>$H&gNM*6I5RBV$t_+zetylW z)Z*<&J2|XgPF|K87joBQdaczBQD7HSF#rbp-HFfkDti9O%-A|y^dPV00HaR%u^|j@q#5Meakdi^qmvfyd6rkIrLs z+M)>D5WbHY5C{S@VFb5hPJ`9L?B=FAx0=fNa1s2K54e@~#`-4WuiW8I@>1|u4u}Wu zmQfsH=P@%;ct`V@RkSk{=L)twp&1eX;nV}x@n4hzmrJai+FQP2z-T%w}w zSw9Z-I1m1AU$2~t1;2pCj!$tL=S4J`R7n|S}AlGoeBdj}<6ZWCJuB^o_)UgM@giGui~ou40+cuFK7 z&qVM`w-bzRVSpU8l?;oo1iqu1~fW8o7;9YUi1*0LIa$TcoFUX z12~0gaKLa1o#GU(eHcz5XEK~Zm?y#uwr&%r@bnMUoWi#?+}76Cata)B0A$huN|Je` z(g@^{!s~#=M-l#65YNc?#eX#R{}fLbT7cPimW*!CJ;E+2aj@loD^S zCe0gs|G#-myn#t^f3hsY8<^c4G$DH?vDshk&lX>7j3o?Iht2*%fA(-?n@KK=5u1H| zf3{90NeO(+!Nq1*^k?gEk~Hj@&Mr2)*k)x}+?xW^wXoFvk_hR^h8>;p=Rl-9nwk*S))U9TX zQ?srj^E9xumyEp?^4lS)b1<_w8zVPkG%<3id&eKGJ=6$e5^3Oxr+T%$_T$X#yXRi^ zdlrgb@+irB|5sqk&7B1t_GP(nPW^MYvq0LPRT!KPAHhnby&HSNTOV;x;x5*1qT_^Y zntN_YcKMkr_Kqy;+ZPBRc@Bh8XWaZaQT zS%2X2W+q4UT3v?R2%=DNRfN3_B5Tkh?OE;M=ouVi%blxB)bd_A0^bHX>duH1*o)N> zPG~@5b|Y+lT9Yo?O>B{$az%isfM6rd|~QwCV@Wcr8K!!h^v|U+JX;jM~QuhnZG4?sC}ah67|KA2<&rzy4#dz9xOE8 z&JUUUF%)czq9!oh6M~~*`l9*7*$Mj5Q?4HgZifW3@&W!FPo&;V1RplSH^V`}C>B^o z@nH#L4;eqj1q+K9&%a15{AO*PTS)uZe(NLEz?c%?@FcTc_gL{S%HsZg z?>+*=MQ`d{Tj)SKab)eHI`_r&Bk+j5d~g$%=6zpeGVL+Y7`-X<5d~8m@LZJ7Y&!xc z$`!M%lPfX@jrheceSE}cae_qp|6DXZ)y}MQBRlL=o5Gxol*=S~JOv88xj3rMUFH=q z7Qh_A_pr0N`B<{j!$8Xyc(s6ij$_5Dg!qjlOl#Pqsk#vSx*g`gHyJwHjUe&*uH~#iE44$FPuDXm?uL z^b;~jGyH4Fot8=ehL=9sOutc?^t-+EGLwE{uN}BRi;nuLr`V*wlSyCVrCa2lmon+H z=2rRUv6|jL&!ms{(hE#I|B*=_>ZR{HTjgV!^beqOs^@k(A96pPN&mfycllqyE5s2vFQLfPV&;kAoeDuj#YVu84kJmUS8y|(iD$4`(sLbh3qaUzyHtc}4kza_Qk3qAy}YgAWdlSB%U@tv{sP1D7Z_zTpkn)ypM>}DxQ&gA zdDj}X8U-BchJXIc@-c>M}> zXWdS0>j;|D%YlrbIg@{H&Sf0Tyr4O=wEaG8vN2ki1tHuuVd+y|%Tl%0p3MEczgqZ6a^w@VQuZf-hk*D%rO>)zDOWtkM^L*2KyGJ z_Dh$Ym;G9JhziGII^k^AgwZqmCsrU|pv%J@SWnb0qb!ToVD3Jr$a5;bx zLXEt|sdt;#lw_H=ZHjD~J1=slY1EKRqqY=`Z$5TDn;0Gt$EHS>5i2O<`l_`lMF`vy z&NgPXRnelhXu_^d^9r%~ntCrkYZ*nV_-E-al}O2-2kP%hhLqFM6g27W2pYgD2(KwI;Pi3DBv zCj~WN?bik{Hur{%qe5yY4e+O)lSyuTuZf4zTvlb^%l~{P2(}z zRCJ|FeisgKbbp3WqmzIy@;;&tiVGYRm^ck(qA zv^8|3#!8|>*^0fDHEvr?M`U}X}qB~!dgC@ zzk>!;>M2ST`pW3WFg;IXY(JYuCohlAps;g>no&+O*j~(NMPS-ZM;56kbk24r^$L5& z=64ht4Z?ER{oG~RY|Lrn5MhqHn<@tPU+54jT=h~DMkMp|h^@xX;({f}g-*e+M!IU+;(jpn4t?wB<{v zbLtz*`JV1?er}dFaXy52vd8@u1?0K5x~;locivfaY}E@nKHk5%vzeP^i9f`u&LV>M zn8Y=_PN7dTZ%aNplvbd7k9Iu5Kf=rQfw~dwoQ6C->L#3yP-6GAT_Jb-CHg#xJ?%M{ zeRJ9iiRFjoh2EL{f^K@QPHgA*bw-V-wBHQp)E_;TSl;pasn;>6=;kQdzPK;8?G)^V ztylPq~dWQH)nzzmRR zRK!?g#Re@J)PxBbgb6{34#p6uBxpsNo!VWLcZAj?3{DdA=5>&^wzc1{%UTPT)^4TM zYFaHOhE1SY1WPp*s<@?kr$cL~EF=_h~R%Ht<%=<{N#4h#s@N^C6f5nbmCXA{8T{2UoWUSfdW7N9Y|fZ+pOBJ z%SXn~A(pD$w{k2s`6Zn}R`i;YrSGO#$>0sifa3S-3|=v-kT`HU$&B{u3{t;}51>=_ zumB>(6T6QZm{kF@>XF2f46MzWRgbc&So;bp`pl}wECMi6xWG0mV)&6Xs~)$i`rLmr zD_YHp%?KiOL1_ClnW2Z^X3fx#;RxLyn$hhhj*LV^iK{vK;aM|;HGrYIw42cmvtgIn z@Cx23t71u(V>>=DIy#HYha2^4N|lm277S&w%S50;Q+A8(f`)_ADV{`CNAg`!2f&0z z2}nbdS9oa?B4i3=1aHto2#%}TuOWioID0r}By-?z;{!-WMFbTeILF`Q)(>OQ*MKY{ zOAMf42mu34_8L#xtW3VW23s;quDcJghDwAY@ zB+v2AkCX5yq#s8Q{IAOUR95+^XW|2a=+$Q@|3}3qZu)4kQv=*~4@`{Sc6PFV)XEX1 z4(E_B4d~{y$(i;nT%3GQkBBddwutUNYeQ9$Z<2XFJ+Z2)fiU#RP(c(`uTPz<^J792^?h&V7hB`si z!*M{HY$8^CU~+WkCsObHd#TTq{AWI=?vD>-qgZoxZ;OfXPZfJ6;q-L5C-u1HM8EQh z#5)zOUf^3ptt34Px2);Q#K3)E_1o+?`m^%mPv%u z{^-m6(obu93<5^UL75IPdc(8xbSHchd{U}b@CNroERF=msbrMBr=o<_Xk zq$r=p2hNS&!jcg0{xDHKDEL5dl;EWv$F@6^5-ZgjjtDbG;291-fjiGe7)9}rZa8l_k>1M1LEEo*KpRjF;>4JQx@qz*PFiKOk1WzMh z4+{U1^{euqE0p!3{rl4^SPm z3Uu6IhIZ4As>5dVaWJwOZ3pS5(I-oSH&OL?@&_Eqk`C5nLK-mABwc>9DeThXG^cGbD#d#C+Gf_Ss9LBSKPHr3h| z_X#2MopuoRsYd878PSR=971;%yevhZmB+;YK94EnDEE%Ucos z0D8?{w6xrj+mrAJ4A4{QmjC4KP051=gRDYMpt%02{mk+sBYmi(F*mpsk?wa3olVDUM8qvEeMPPXpH zSFiO}@i-%U0WA)GSbqYS9pxT9LA)+&(Z`-tAF$2(Azg|`mtfCukH#7UF0;|+Z;I=# zNO+oAb6iLdSJTB-@2VcR%e~6VT4m15jL)HBHG_>eCgzQzA(n5TwcNH2bbjb<4Onk> zo({Aw&G0{WXv1Dng6RCC*Z{TWI+y?W!m|3nNaLz*`n&6tUSa`s*p+( z@htsZgD_U!YNFXWcTkL3=2_8Gra2t}!FeYgb&B7o8q!$aPV_qO$yGp8vVB%P@z`)glg3pt zrx)eJ_$IJtJ0o?>zS)O$NI*2r(t>5Y*u{X=M+b@6)x8*bH+f;p`VsHV}KqeUs`KD zX05jsG%Lt9+pNtsYp0mCd1h_CSv$?Foo?37=*cRQxgb_bHB zD+ymjxKz$8n`Y-oM?`Y<+jJ+h6}2zptKK?}d0E#`PhkQzd$_Ok`WIgnV1dkbiJ&8r zA(bv4&Ng7bfxsg>U1Lm{j?4#NzPitIhh}#!`ApII$d{Z_olVaC;oNd{Zc}t_+V-}! zz+)W`mgQmcp)ns}=lxzRLh6R3#yEGgET2eb8Ri4&wa6Fjdx=m&j$QbPFXu>1SgLL3 zbTE-5f>XK#NyH)|BI+TESN|kzrV}RiSHXNTP`Nx})L5O*{NT~2f6{;%M3pX-=_a@% z9h+IbPyK~?HWHQS7EhN1GVMqaKQ;plmnNi`c9_UTS_gyiGk!gQecm zmTd`kEElB9FbXt!B-3v*yQU%?`8XS+k}+ z(eUC^iBMmdHa zr#rv>)Q)EibJ`Lv!wtGyNi9{yvEDS5FXhStdSkf zXNdc&mF(mSryl~!^6iQ#!BAfPVJnmu4CU5~`v@{IL-~yy3(7@IMY_R}si8tXkvg~j zaP00}tR$U>{Qg*L&G}-ghar{HWQs5*@|d0;s{slD6olP;a0W*#_+6vv{MRMy^;8*^ zRaeT92S>>1%*_rU{NLftEx4j%BY}Ls0J*(7cUz)j|F*>f=H)3;-}dEL z^in6_3BUj(v))u+p`f$6V;9}Ag+7uAe~|gk;VtQhGfQp zYw!oh=&78)2{9I(Q2aoNF{WrZ{0lf~dr7ESn4McLp4nWv*^ z?CGIoD|Esg&Cg)7C7QebiR3ZrEln{lsuQ_PqIv62^|^Bj$WsLm4xx_J>}q;T0;}yc zCD!a0g=l?)7PLz$nH}uz3ypbJ27u_A68jDI%cQ4gdnrEsePpeN8Xmn%@~Iu!;HNH> zK9dH+HRL6lqPlh?6Av}n_^i|1;Yhl{zM%%^4K-LpZoWW*9{*|9n>ylSM6{#R^|M}q zSakBi^OTAVM+2A!5di@8b4S&&=4Cwt{`-8`{rQLaeC6zX1k13oWxd&WD_h*Lk{NkX zZ)q@;Uw)fX)*); z23=iAIxh^+J*RB#rPG6dOZZXasx&C{I-o$u_*7m@gF>RBe{nd`?0gY2L3%i~R$cJE zhWxNqR)SB6g+;Zc(fNS7fJr6WZ<0l2*nWduM(xARAuPPP`)ctQ}vho znLh#bZx;wG5YMN{4F{I{hhb98qeSx~IdaG;G{~AfGtn#&sXnx3&7hrQ&}8%iu46m5Fp-d$xRb%Yprpix zo0IEM8<=h|rty#$>5SDA?5ckq!Kt=ca2@C>@vC%lnAo=L36?+Nx!v@Zxw~Q?#_sdS zK0H!pdhZ(rGL9g z?M16E;PP)`N72P1k(lR6x0(7^;NuMXt<57$Mv0x%4z!?qJKA&`lV}f}mKhIad(8}l zFsZTPqAZl{iFbLx$MGIdFcheNF;z>Z&_L4n&?$Pn?E8zV)xGRej)0cc&X`TMdax%D zj<_n-M3w*)JW>}zZv=Z9&Pn*<1^ozwp+4rv2Pw1Db4&ENMi-h0Uc5LxTjrcVMF@aJ zcFkgQ7A)?8-UhS8j}@ikPSSCAJF(VL2UMJfsL{qWBk;{@!SX91hyGJI2|>>|y7}Sr!cZiTk zcK9qZgoz}%9VNFKhp7TnvvOE(M%V=9%MrdH26e@Zxw>qY9H;DxK2S(Tg*O9@f(p!} zq5SN1HHaR?sosnb!5lyE=>VSu_$0;|+Roa$O>yEH-Tz#b$z8*L^T}@P-9YPiOO3aEZ`bD0hVVwuR{?s87iyJt+kk$a}RXGGnn~n_RdY3KU2Z$%4L@ zdgMlX_DkuK0@LeD{2L!7x}D!_{tl(O3{ZdSfjW=ejJiy@eWk8RZma5=<+h^El-ttp z6^XQ~0~bx#>;UHKaxaJ4e!aQl`w||_t@EAr4h8zU{$gFTo5Jfv)=3cQ&#iNjAJ3`r z`iVy5NEE913O51Xd#TuogYJObPjk=YK89a_-&B6*@&ni~Ym;8H?hiJ4 zQF9q=T$pIO-oD7?y3}=qwG1JQ`s>$e^!*;I*S@w=y@TpLn;}_+uhDJAOR_o8aI-JN zb0Fb6a6@oOcKvbtTGdXb%gm`(tp{GkJ(X3}Z1hyBb2e$zxuVwUV#mml=agj!%L4V+ zS5_xpbcqKH+^Gmd0lG!NAEjUvqRO)64P!f%>Mly>K`o&Kh8UkpE7s6~y$te*ti*eMlXOZM0kM9%#V*Cy-Ld2zSIdfZYlne_I z`yQqpj@Y*+L!u;4Lf$8V0ayG|FN4R;C%3M2*i3op88w3&boX#@wi6uS#$dX->ZrX- zeTS=vSOv?_a+hEk_WX~lyQnN)S8vWnMvg9y3!$7k)drD$^E6eX-%DF-=bN>Q%-Y+` z+NEaganCr*48IlViJ;TF7+f@T8AEc zvbNGXEq=5*QM!^{3xv8Rz8kRZR-UbAfH`-$%nx(!9dw@5^DKeuE(Z6El+r2#;GJBJ zalohWk|HycCQPJM8mEeB5<;OT5DJN-q~p~ zqk;>-V$xHxt$FiOh?i<}le9&MnVq^(w|KC3V&3d)tC(Vz-PU^Zd~2yE@*yG?!Iw*9 zA&-RX%49*GxuH?>Gq z>{=Wtp^;5A5{bbTy76Z>JG6`Mckn&p3P)zx_m{GB;UE{iFbaY(=Z2XR&QrNO%`KOv zwr{=}Sb5;Pn(<_{x84k^O>D-(bGs7_hv6&0)ocYV`j7uIhR`fkPK{J z?1A|%V^*DCGkdFr0$yUTS*c3d+_Cyr#kWQ!Oi-yvww7@I-XW5qdo`&)Q3sPkq!&3t zgeO9qA<8@5}QTNj#Sx(}s79sOpsprBdxGlj~8c`ibdKnuTv$>=Ga#@F%HF8t= zU>_Z`U;UoRQ(U%a8G2b|iy(c=R%+77np+}MDdN({Z-^@=e9FDRxfb%)$%)P3ipY+N z`W>~`WDim5TIKV->3ViyybL&$X) zA$%h`v1W=RR@tU*0cB)_4xXGB$S~%k<*z?!A&Yg5mmY@Fh-7JQe@(9a zdPMukwdK*e=5anp#@nw$79fJxEc=AirNo|xR9u22eLC8xv!Z#2-h`L7=1G5G%jSf1 z$s}vxOe?$7n&0UWa){$i6WVph>_O46A9*p-HZ=|Cf{p#2tPxr&v}@a`-eqA8yF6`! zZA5@%=WLY@zn?OTn3#Q4^bgvorX%OhjKLE#}8iZo+8xukNP zZ-RV8B+;)M_+!54p2O?zL8r|-2x88Gl;KF#v(2(D(F)_A)cY_ZvYT(z+H10{(PSVx zTpnx96!$eUJFIyq?ReeS$c$lLs9w@qHz8lr#2)jcPliD&Iu2HwsMCHI(U6608nOWw z>I%vBjwa1KNETQIWQ}+S(E?0CcJm%A}<=TCCtyn z{6ev+SGXrNdRA2+nrZEx7b_`rMSHZRyh&##7$-<$MTvEdAO@D2y6sfZUR!Fvu6gI& zQkE(QC#(f!`+#6H6uRn_bf7w)xOz$Qx%8SvRMCHDj$PvG!{-;l? z^+-}9nb4OSR}bawhVrZPKV7!S-J3@6^Uf+xXu3}pSF6j@7+si14+uC6Ivh8Q^WZnI zS2$kp*$F}xzCh3)Fyd@J!Bxl-JH%A%XMu%l-zMj%WCNaM{85rO#4UmkY0lQxmwLIGjQujXRPfI&iQ0I!Mi$ zVXea*xsrD=l!`iuY^k5H=B*Q*rCX8c+NiZw^r=1IbmSCjzuZL&d0stQ&;=DI3VL9} zu&ud09pPyw!a-}^>Sbt%q5an9mcuN)swEvG;lyCwH;7S0j1xM>VYM_U z5pbUFQUrNrCo!G2_9i&2@BOD6vV1xJGpHpH(c8>1?v~$ z*lzv&$R!T2B9#-_B(#O4`4EG5L@#Kge-7IZXf%v1iC;J97e-XYO(c)GYhnJM8^w6OdYHaU`rR)%S;Ns91{xSl3}1x(}kFMRq|@K>RKW_n-{fFrF6dZ@9J+b?r*) zLP2(HHP&qsWOsk5)elPfE%8HM_p8CqMqJ4k^n~la<9xM$n;t_wM)?|!j73eZkv8+R8R3E1q@DQXVvE`+EHD!%X2L;H*BO4h}O32F-?}VwuNT^+P8j zh}{S4&UI6*)oCiIPPU2)JHisXvRZDGBpXA*eYZ;He6U}~LP+`!MeA}3AF-jEMlhv% z$o)&4v+;2pmo=fOfg88+SeNDDiX*hy_(HkAX%BDZMqwmHd8&&SQ571wtz{rX%!$#F z$;bI>=Lm!*#pQ*rU=wd)_0ks|4s$&mW(JUux}O||)|$E>O8?TD*9-TovP8RZ6*7j~ zn)lSR<}7w7MfsYVi!G>3k&(?xggTt|w~{?ctv;9@T~bxLBu+c-R+SVr9Q7f-bi` zcDNb=x2z3EN#UHVnZXLD@a<}AlKBZzB=6Qai6|W529ehh*%_ZmX7XifY?a*x@{WAS zFbUJiW)>ohr9@A2p4HWLfs6CP4&RxN2nf|C;W_Ir`4i_f2a&v#sxcH21_tggRUb){Hc+i2XRD<-{J;r-x<2}e>sbuPKyzw5FxSAKm zFulu|+E2+pr{q+HKv~&s@?jzkK+@(gKB<`m5h+FgrKU+FbkYJU#_FHCfbg&oeHGaV zaFN=}SM?5(WR4FB^3versF`Tx73pscLJdB2pQ4!vV*t%o#xRxTvHXswxd z4`HapI)RJwfp8J~La~AljC?Gu4zdbg3j!b>?dSwO*1`oXiFnoHjcHQTI9Db^PgWnI z7dz+2NCpu!2rVWqJ&>_dlpLh;06^RMC@OalD(v>n^$clDiI$p^fv(k7qG{n(Pu3ur ziYC|<4Z^)^%|*VX)x?HA2F`qp`0X6wjpVc=J5HTlk?c?f=fXQcmVlEnNx{r`{tm zhhNt_uWeN6aW93pj+d(pIx7X+IE}2J0dy+mq_=N`^;c~>CB97#mAm5G4Cf|ZLwKu~ zTXkzF7P+Xfqet5zMc9u$)P@b(z)IRQDfBZ9i2q8WXV!_vB`4~h5N&LFg)dY<%V@t> zN>FphifDFSDRpy(5y`Fu8x!kh5|$pm?~9Iw%A~Bce)|k97RC;_mgO$#3GJW3$DYtZ zcPWfwl(Pm$JOm)lFrx}t44U&jq26`MO)0zSayTr}j>0Xj2(3(!q%0?R)v4ZE0pLAd z>SBOh*Bt_jI(J#O<$KyPn>zHdLF3A{2~B&9X|plG`P%YUl72UVMfg`~lUf1{z96?hV9_7H1 z)L#gpI%_*(VZuL<@H;NRSw8q3dhxkaAnSs_eT zEtBbXCRQb!rnmW!EJS$Ku~U;olQ51d$rui{epO~szux(|KR?*NHcyw~hcO;kjgIy! z$mQV?t*lsn5n9~dR6b??j6~I(2xrXs21lL6sn$kM>TS_!m2D%@!59A2%3${rAjd8` zo>w^Je?C(m*4GFu4y${SkRT_xpkrBSD)VZ=05V6YCAEWf8$Y-Mgz7BQgej zT@Lotbj4|3a zxp*LP_qe;zjlT~)nSJVRR(Q0BXXt~VXzosEs|vJcdu<-eylyeJ?G3BvL3A0l5@Jmd zVGxX$)s0?xP5Q71+fOiq#+PL>mwDITMJ)pH({{B~!>0z;I@M_Ox=#liDOc9&zW~vc zdo_6$p!tUW@dQB7{p&<_MtPerqjk~w`sAz|@i2LW)l8~D(aw1XjvvqgQo1!4It64D z?5kdLt-uv7GVaSyWX}oiUvptWPie4k%|t6Bkv*d=dsb`q45F8%)a76Grp8zqvHTe> z^IoqbZIh7@WlS$}kqLs{+`AX6TeSQ{yc!f_rQ8U|WV1nxz`67xay|RvAJa~~nyG+p zXdg;XVbw(6JBKGGX@1TmkAUG9;a$Fo#lM*b9fgioXdL_(FmvaEc~dt<0_t1R^uj$T*!f3nIaqxxbti+z4M>E5DZ58% zr?4?mQP7rLcJM|PBK7n!sm<#k5YoG&dSA+qy(ArJ|{*wlzrdt13dKWk3ej3Ob|fYZ}l6rHbA;u=ZV13@s>daoRIk#j5HH)rA3j1zJ? zAH9Q&Xc3E&noAlHc=;c?0!-oPT3o^tu@a4$)pg|(X^KPwr}`iA@~QeINlAoi<>o`M zyAe?oNTg2;F{a*Q4Yr`SUXm_B>eW-3xH%J8PwzQPDvF-R+L00VkV74IuAH60F`JciJ?hV=ydg3P6@3Hs}khSLsW! zvV-HkhCY`Zx$jfwKFGunf{(eN&l*OtJK672E2xf8a{>{Js%+z013jTZwrgG1bwKhJ zvQJwpOM)ttw#YFpk4s&~v#dHx)P?fIYIMl@Ao|<*WiAwA4ALSv_;ePjxEjj@-C zL5K^THNu4%GEZcJ+;N}IH&O4-P`B~SJjXiP^3fToKZq|6yP`k(YV#rST6KG+dWPZv zO;~Q@PC0uh!tkL?5o=sUra>~TR{uxm>QR~8-TmF8XH#`7g2kP}RO((Qcr2yC1ufvH z3gUvkp#q=5T8Zp5&;}7OBAl3NoG-ZNN=bjMx-6ahMcidQn989pPI0hx+*&)awRVym zyQq%H-ijRT3B!=YR!wxpR!wph?rFO@kbqh!^Df3X(Uo*G`^cjc&hadaj*_G0Pe6Q;I;U!eAWof_is4nVfx7A8~cSwsdjxd2pkojED8lac&fX33^0<>-JB)2 z=!EX(DbD*Sxxv-6jRt@&v0g=c8Q18N(iI&Sdof2p85w1Bt^IA{^yTe@=jT$3u$nEE z>IH|sCFjJ9MHffC)oMHY28FLN824X?332~(Q)b0pyin(n@L@?tq|;G9OK@2{6!4hi zQXhGQjhU2$ReidJA6&^)r4&b_+A1g-YTy2ep6gGv^=`(mr$8 z^h`U;*+rF#;mjovd?Q-gR+-US#gRAsbI&Tz zh+bl4CT_|owcc#QcO6cs#zj4)^HP6{6{Vf2+%B6+H+cLzz44bl!B>slR*TR_|olbt`8KvYf$@-w+>YHczvZ7umB>Dk)L2caNAp_zXuR9)B7+=V>|EfFnU$E?2 zWkf(oou|n`&8dv+i;q9u7cVo$|C_$Rmfv$1S@X9@U#uI^7r%{0+Nv`av{rp=4YXDH z#A|m^I0NtI(X2=&TJy`=sy?2T?d53tXt$hnODxXNeUv?GY&6hT;VUijMn{Qj=F%Hd z?@AlB#a&}mY?jNookJwjWvI;UHJ$(v|HocC^}p;jukJOVM=NEuyn=XHi3wI`xk_Hj zqo#AV^1&7V;yPDkEVNGIYvB)`ig=eLekro;51v{fb9QXv-tY=$c<7&r2_by*4m*Bx zugwAJTb4!NbF>8(3!aol5*OqnT)lPkj`)CWgsigOc)xATF6gxSF-j3ung8M-tSsYF z$RYdwbFC#i=r=3F{o7mZfHk4jbDp?6O**803dg~4m2w)pKl)T#$kCJX;Ess4S^GQx z?2aE9-4^q{?Fo3B#!9sl59u3#qjw@?rXY_+qJhiM<@vtY={xV66g&O3wc|1Lqkax_ z#8P>woY?8P_XT37zp!?k1aFbxE^Pz!n>=bBLYEj^sJF?HJRwV|>?+v0XcST|2y8J4OrI7cj+2I~~XoeCthGEGPx!(Ta^BZ)Ew> z9EO&Bd9uw{31F#yEw1gbrCn z0-?p~*#}~sNda&^h(&3T|7H7o`>D?0ClNel813TU;rOG zq>}4YDz%K>m!te4pNPY}F41l*nQ@=5q)iVe(_5S>s$_7HNXgsd8h^FvVvaOi^~%=RR{ zxs^68vHq55d404@)&`{R2XRh_E?_Ta#hRP$eXFyk_z7z9Z+zsW;)mM1B9tQfZ8!K~z}`Ws7%8!s*?F>*@gMCZh2dHqcTI^LM% zPxalK{2_NXY{X)!n!(YZvBmSPdViB-Q;hr3O>gLUV^dY)qbzz=$uwN?hK}IT#h>Wn zQ}P+=g~`O+*sLsnQ#&C-%=tI{T)yq$n}}+v8Pm-|lveD|sOWbO$cgn6^<%oTGRl%- zQNKIO{nAoopk;};po)UiZQj-iu{>8}&XU7R{yfxV;=( zN9-IQ+ZxM8zwMb(KyixP3aKAHhoK6&(3C+uA}zMSuNx>8j@;!_0coAI+gD;p77}x47Zx`Z_oOITdyk`%pN7Rog|B{BFte=$yH+VwX`Q+R@OmxE@yL zo+)ehr^~u2UDml$RtjDaVH9?YIHR{$Rq~Alk~t1 zk6VR(^_ih7lA$}6l#cDr%1nw+AOY2;AMntYSu)P70^~o(O9@tN#pqhes77zeSpTL3 z&p?0l++z5X?lo{Ws%=c`1O{Ifhtz$2vCl%HX1L1AaJVd{=5TMX?)SBYZO%(!37|Xm zez$9!bzIv$*KYil#0I8er!x(=*N{C1?SXm|SntltDr?OuD>Xw$lK-mb*5%R9YG}?T zo&(Jy&4=pl&Klh|KVC1D-L5QxN|vo5g0}1S>H?}@y=LDW@faI&9dlW z0N2`Erre1C&+e{I^c7AKPo$>Ev}m1>njBl70U6hwH7eyLsBN?^R=B`^t4b|E{0q?g zA9|MIl}a|Qg;k8@X?KV1vCkp5ZAO6RYG2J`YJK~1x!u=ZDz`7UPnX-u_H4P;w7cZC zr2QyNZt9lygK{fx-z~Sf?d@`#)xKSBh3${XZF+mX+%9cjEw`x*MvumC^bxC9YI3oD zi=Jo?^Bt#Gkki7Tu;t(gXpYC9+|4W({~aJT)b+mLOssUSN~S{*bsFNmkTc^M5irdJ3dSE_9wxP#s?#BD~P{?A+* zE+3Kd5(62(2FnE%ZrniQ*}T8ZgM|DXs|Qix0((;1xOuZWlhQz|hwfb_wyu1l?;A^wN3P3h9;hiaK68&ad?UcX`5 zyyO8Vo`Hlmaf>aM80q{$%M^H|e_|yWnV@y4j5cBV>5tl%d=m9KDbC;Y6CL&MXXVZG zH){&v?`7r9G@_|8>Sbkbu;x=W7^#|Uvr6`-8?F?yN+^(?>7@PIF4B|=th)R)jITlZhJIam4?Ai5f5NM)XT&&bdORCR^W2_Llsf}o_ z4a1T=cAj>}|9Fw~Np{KEm zH=9enJ*B=TdCpKEvGdqD0)XUtfEi}YmIGGlBd+lSxVjvE9fhdCOqs3Q7@73P+Qh$>>`zhk)Jr*}Hi8i@TgiG3V1 zDN+rm1Ozu@sGxNblEn!uG;`79s8kO~s%b@Ba!L*^ontB-j}_viFKYTZ*|KCI(%RX3>JE*|NU@0=h}}I7ypP%3YIVatg@(5Z|(on&8Fe}Mcw|B!hA3ml$8{&4Q{JGawM< z?%@V+9itn}w#%>1Vc0O&OSIreYgZU0R?iiKq%h{K^5{xT*iMX` zMpE25nR2osfREN8*a&PTkCFphE3&ik;_viW-872ct(JheHE1Whh(PA&>hhlE1$Bp} zAEfV&TEuuv^X^rv=-1fJCIJm&*#_H1f)}Q7F$y-=8FIg5gPke&3pUuh;U_WOQm|#|+ixeah`r{2R1~ zrX;TiQ0vwm14o_96W?Fp1IytnvcZ-72`@lW{8%ac=9|?COHbkMY%2dkwp1Q7{#@fP z$n@m2;oDq6AkDVFNd!rWX9W7lG{9JZgTmG7wdD@KZRh)e zxr4Sl{e6k*CPH!xtKx8yXC(>Q?`u%tUMb}6Z5xTZSN&V#P~)9U)J>9y)<=Y3 zL?v;+vU2H4v1T`gGd2x}$zs7{#bR>qNc|;fWxIQ{ISE4Qvmuq^9gm4t@zI9KiPbBC zh%r`NTIv>U`lIgdc<0J$XmzFDe;cwtgtyt7yw)x`ofCJCrHP3?j-~Xt(D(f!sqHqzO53)&EdO10qMbn0Isp=q$ zT+z7GMgiGDC_p7NdaNLNl${&3g6hGr#AWFaM&IyrykZbYyp9i8qU|5bNV=t>uVA;+ zOghCaoupNvPb9Lv1s@0Bz>;eHR65D3;xK~r*vsENU>CgX9zaL1zur@@Pe?0F4<2>z ziy!k@yI@G@mH(+v-soYy%SbovGMc6pkHOF?AIR5BvDdYsQ(B(9lF#6IkMpV)@an8q z8;%`=Bh`Z3EmLS}!InI()xj+?Gpy4MSE2BGIfjx^`z2n(XRH>PIMs=Augdxiy;(81 zAh=WFwl;Vrn(t)nCqIdGy`9>VD*%R>dEhC@dp1`^Mwr~G>! zy||1)@41diTU0<6uwX0ISNlE7-7|lfm--(ZIHTKUzdt3vHA*rDvb!fUfVEk zsQn~~{UV=G%%}(VuOA9Ohw$WoL27}mHXK_7+Cu6vG_oLo@Qm0tVL60^_BXAA>`H%} zSSS6F__=(z9ElQ3s4ik`!SbwE$)UVqlWT08@h2p ze_BUoOK1G2KOgv#G=7)NBalKKwjku@^ooJz{CxhBREGJyfPM za9~`{;PzP!gTYh&hlI*>K4PLz{pzzUA*XQLpraR@5|iIS#`YOK27A@E21pOxe0Bwo zspW=jnI2hHPTd&-l z)oJwvs_l6W!C9gt7xWvppPwnb&t7$%7q5`^^NV;(%zy3@V%Rft(I1DDand?6!67U@ z!>7BBQ(Ic|xne(9o0D6DwmD1WV4Gm*Sfjsy#%tVodFaIDY`rm*+Oo7HlO&tBOTU8% z1SgEZ2J#&YxuNSGT4(KbFy%JY(+q!506Pujlp91}Q%0BV+4cgcWDC`^JyS|Lo{5 ze>(cOx@Sj37ejGXdJ`II#onCGVe$}7lM5yo-i?*Qe04iUrrso|BDhJSSy`y4Esl(@ z+wMdd%Ikb9i)ON2#@um;MK*y))_+3X<0G=9{{Ogif8C=aqUyR2S6kj9fx3rAlnxOU zV7EbZL-ORO8rWZ6QFD9kGDviWL|uxkDoxR?h8kyb@A*9hyhv{OEPB}YVDp1|f5HOZ zLnnwOM!3?OGGVhtxFWSR_>sM#`!J8Pi<=ciM4&bk#yi<+)C(Q<^Z1rScp$qIxO{Y0XblgsK?O2JX@P|6ZcrL!-Sd5MJU7LpA-$H#ye01`j%vPYhsJAg`#UNl77gHbguce)GJX+ z68MqbZuBP3Cps{3sgvz+24|9b(@B%q1&KYW8=Vg6`~rCFcD=zb>Ux|}Ztd_xQ*tPG z^Rqk<=ruRDJ5Roz*mn77+w0BNAM<3k?vU%|7xnW>y0*2oPGA3ttJ!*wzOLrl6EnE3 zr;mDE9dM**MFCJ=%ap9;Nma2j0aZ>&@*Uo^J%tUDA5Y%a4U(tC*dW(URxG|ndT)xOk_%4=Tk})Es$&nqWPumEMlHVf8YMDapWSczhQ%A`%xkR#q zigeiRf5weXa^9K5UzYc~gdt!(aH9O2{E~S()lkr+j|du1kU$%%h^;L`jU-P)Mfjg{ zp3gliLA&H}n9surgmX&%+DV|F-yQi?_?_gBov-?NH_yUtBROr64$y4eDvT&3TSlh4 zRMHtvI{m!aNe4SXn`JnPBdpC1TcS3j_??vPnqR!7N5H>PWKsSmMaL#uzoZ9XoPXmS z$s<4UDg$6`%B2L!3JxNW9LpCcNZzxPpOJT|q7d52W3u8pk7M|dMsW$K#iZ;z&{M+u zCdJ0MrTJF9Q=&UwSWHS$Yb5eki6FT?M5x)aSzl$fH(Lg|re^4mkLch>xu)LH0gvf` z$0YzkMOr?h%E=K>xNQ{~-$cg410vK@vY3!xJi%-VcKSDp4xV4TY?sjw1^Z6sQk|j3zSGrOctGSi)KLh{{31B-wbuRBP!^uAB z@aI}|;YW3fv-`Lt`6QuIXq`v^3ggL3jn8aIW+Q^}H*b?q4O+=^0QtPBr)n}Pq5IT! znHJj1u^uxSpi*u1-qNc?QoN@pS~2s-Ec5y|iamS=*=CUAIv-bbhK%zjLC}eva#ejZ z=sWZffu*t5^@&@&>W*AO&VeSjZ(W(F5209=7MZYEB50(H~S396ANIrKoI z)eo3T@W=T>i;^)~oi`J?9V$Ar~^j|BnB;p%6yJ%Rt=cYxnfe(&>}n&Sza z=01V@Rs6opXw2ungx?qWMfq*y_f3A=`2CdMUVeYzxB47UAja<@e&6Bu@BDtv?-0Lg zes}Ym$!`I_WBks`C4YW-l(B%Hl-11pfAAa6a}_^fCDmofF%z4%(* zJhsc@!#oxqsw*uR73j&DcEl5C-LjeR)-7M>YHoQ%Umw-i$8`APT(MawitlF26TCpc z_d7t`ffxg{`IE|A5CrBLM zDYbRg)@Rw5_VcdwF+^9CdWdN%e6qAimxU88(p};1mXAIUJ!I$f5gC1;3ulYvl;}A) z63#^Cx>LToaDcQ=nJ)@?F(~g5nMCHhPTs9Q7_k?if79(TEd0 z@kNloOk&of&^SBiA&#?&kk*V#pQFSc?N1d{3wQQocz0TH8x_IWCmS1L@{{mKoNzfN zhC|{?``Sdspn9}@kWE`msXa{2LI|>FE2gIv_A(IoVCDtQ0mNA^geg4{mGk_Gii5*U zQre6n?puO!9pf3f)?RIby8Dd_meOt&aLdx#Z=^x}|c6EdGLYPi9mkD!;l|@XiTS z2dP_sg9u2PdhMMuH48h~?n`R``dGuU-R%P1H)BEpllPu!HX+C*r*H0b4yWpjoCH63z0R&wpivwF$Np$QHuG!RJs-D+^D1 z5)8V_<$!r2AurlNS!rr+Wo6yNR3p(0px9!BPBP@wgzSFN5s%18mtIXoi;%x*wnUSa zKgLil2%fJ0v;Ca#OLCYJ@Vfkq^y+Ra!&>NJRJHwuDE=*uvYtVgA5$kn8c7q=m?W)! zi+B1cb)GB^uq56(Kb29{@^R>hR$9{)R#(njhUtD(zSzK<3i#?cr3FN~)EydwBFW*}&XIuW|d4*NGwq>lckkNFz6v;7-| zYVkLT0X*dG-sNdoS2K#m%Gy%5cIGwjoec>|J`!Wd>;~aAd)L(nSi@cZcm0R0q ziF7fMc;56J3u6w?@In}BmKnFtZ1Kn%`y`eR6D@*QWprFrh#I(%o+kf9Q#jF?yo9>O z?HqqoKW&QJ=lh!u>xVpJdfdL)-*hp(6u0x)&#*)OmO_9xZZFU~w=6@nD3YHXMHF6? z5Hicq`CS$4@;96065FW}kC6oebf;E}6xliGt>wx4)arn)PZ2d{da~ImmHgBj-4D{seaD6h&xTdR`m;3^wO$HTk zf!tcprxOoTd!Ax67Wktpv|KDYO%lR zJNn@P0YL!TPmB zQwk#h`_${gTMkVru&d}#OL!sMa&%{j3^$4p6&yDtbk$#hzcIQQzQ_Y?%?>wyak7S& zh%bqAbbEvSxYX>yyQtI#`+K^U*YSCSy+fXxZz5dpy1=jRQ{Su`w9V0)6w>eCao&ME z9t!PMf|NSn3#c#i%B&pMll;w4dI-GeWFhf#hM9TwRm5p>swxxrB)C|s4yQ6vjM}Gu zPjXQiuM`c(7NPb^Ww?5-*dujv)Bx0V{-)P?WfHz5H&i5e+{I&@qtwmcl))6Q&0sr{ zTmZKi+bQG&ZJHqRzkTXU$T>vvd6ed^ir+nfS#Ue%7%Ri8*h*JVevSbV--eL8Pg<3pfj2|wond~WT-~%ZQfHFo$T*=3r!1>S6 zwv{|Pa9NiDSS4TL5_?kDHK8e<%E%=3uid~$I5JT^;yeV<0+J9iRE^YNnT+{^?7s;{ znM967Zhy1zQOSQIJL*SxqJ&;d&XBI$r{?4gm0FpUL(}aoOb>x)N#t+(8*lAm0a$`W zMZ)P@tLKFY1QvApn|??jJ-%6P<;EHwr3cE5b2x>aLmAYJVj|~J%`CDZvWHxnZ=S`y*IM%yDLt?UYzQ6 zo=*Lq%6QFhOMGJrXTGu;{B;+Ok^Z*BtCPE_a@|y3Q}0_X(^%f!os|M<{{g$7e2R}i zR;O}bnnAbH+EQ8zNJ0Q&MPl)H1f>lL1>SuR34J|Do7kSlJ?tDnLV%*u>W|=c{p4&> zB>-*dulsqk<^c9jBClQ+=Io0u<}+PGkC{A4aq4)HUbM5`kTk`M2U_S0AWG>O>zjC{1@CMOOH8P z-O2-&i;~NSVe)7GeI<*(^j=cj6XOi`E zoE=M!ml#foVzra5Hn-F>g4SpVr1RqIIX;IhTC?GZ-v8>Ae!4E@vDbQ}_0?3$!M|Bw z)=T805OiUOZC9^MVe~(c4(_?4m9^gA^bRjz071xCyuroa6r*ddSOE6-H;LT+ivOe$ z#$;NgXJ)m!RrCU$=F9MGUrq`+iW-QXU$>DD@F18$C}-qmXG-Tc2Z=z{+)6O1u@GiN zXwnK_@Kq54BU*XzJYviinDw_z;BizD4JSM<1}~}?58;ta-PW8%GBw|mwLp}i?9IZI zCEw8998hmv#18y!Rhah?nimqMJ2k3(U3uC%mCv0(ysQa zBvf+9H>NE#E?Q`uvrs4ezmjmePWX9!l{0%??V=jj)h;^qUG1XG*%j~qm-P#fuad)+ z#?|rU6~<)?jj0Qb9I3|Gg$tuq?V^0&)qbtM2K9B8z8352OnohqtH_CDk(Ko4#*-Hq z6BZhy7e*&XYN+gTez)_xgWuuaOFeobFRh}_lwfLwoZwM^>HwI#+($<8I9Db-nMOj>A+Ss1Np7v-O>cF`f~Y8U09 zu6EHH>S`Btp{{n>@6i=0CLbByQF?%+VdJP!^ul(|*AeeNeO;rk_v-7H zlOK`%ve{du{Jh!Q<#yg|Q4=>N&3;a9<7O{rZ8toKfH*_96b4cR-a|iC%+7RrjY0B* zh(NUZi#Evu3$4%9Sb#pR*Z2&WcBN(_Mms5{0s4+b2D7Duc&Ur3Q7MyTJLSqGd&{G< zo=!xR%2rq{&k~M|n5%5|i1?rKidtl)Ho{EDiz#DlBvWm35)PFRKay#-93)ce0{c0+ zllOxo@_tgnT=AXyrbXV8W1G%b3aV`5Bt9j@b}p5OMlM@u6I7{_!z0vAEO>|&5=Shg zWj1XaWT{ObW#Ld{{3R{JkW)X=uOi(DKCh((7vqXB_?@Mo#P#P07J2wK9_z7+oE_Y_ zoX5s2Ina|@5WbZi&TB;QfyuRA4k`2+g<<}9;$6>GMML>Wl{G83i!b+i`&jRr- z;)Ap^m!T6u+M|%QN%UR(PcvR(Pe@bjUv}#*&!aJPQjPPL&ztlEro*KZ!nzZ#QxUyF zpeeXd&4j{|P9-GGF0dgZDE!G=9ex30Bml`2$%r#~L%<_<)z9WX-*Wku-t-~ZtKM;f zvk8XW_*MrSJ9__o3Uw&#fciZuHtysg!3YbOVjTwtA5k8LE3^??d-JorK!q1K^cxpx z_&f3jbz(0wodxS(L%+Rw2hl`&i8=3|3X#Fa;zMBWF8imVj)cBMqrB-Vl**XsZG2I7 z>R24fC_IVM+}@s0hm@>+{c3-e(Sx|*>T`2Ogq;^;x+bNDBweH|D$dj+4HlCRD|=Zgd3UZ=A90GS9n_A2uhT7dN)|Wlj!xnTM37pJEsjdH z8V(wzqB=GimF&f7jJc-<4ZJ!6QIf~I`V4{h^=O)CqBg=e6!qbV`Zp+6A;>q7*E2>?DgBQGZ z$$t0#!j4te%biC8<906|%IrIz&P9m1{V1Gqt+; z?_?C#ny4I8<@_|xr7#MB&apmu^`Acx{u2S(^A((O3XJPKd59Tt!J+scJ(YECh&T1I zeOg+nn}>3H+7%QIXpWzy9dHHuy&B9Bg(A{Ku_nQp6V<#=z!=RH%>}L#6_!VC((+Vx zHwVzK^hcjq9(8cA*z#~rC(6kT*&h``NpCD8 zOxeC2VoQW@2vL9_mr?CdZI$+pUb-IU)QKBbf4i7k>5UamzYDF{TbafPTKh^}fzmXX zdOYVpIXi~v?jp8mF~xli?BngJ&q)fMnz^0ODX=Fnz)s9rX;Ls7jQWKmAyD z<}odN^EYXgn1_Y3ti;l!SM30u(D2bu>f0?#8SYS@|M`s~qGt@GkF0C@oW$Sih>WMN zF+`?CpvvFWOPh%mJcssIJ-#;z22=iO&ZVyaza`UnP;}ptUDvG-lH} zc6THx;^sI>QNrVsd7!{f4LP{5TD$Zp9L=N*m^ zwC`q}@lk4zGC0{9Gb%A~kg+(dqXL82oD*>=!eC6BM*9HIL49mb?%NB=m@20ge(l$# zW=H%@ht4$9>I;5gMvwZNdI-b)lG8eDV@MnBpHv(gjCzZvTm`3BF*rB4`@X-@8UN>x zx-%L@eQ0$?!gFm{&7*?Lq_HT2(cYstQOOZ!D$;!VQSFk2!|9}4q7HSEflX{$OeFOV zF*GRktK(OLSZW5BVO3yctI9RGJg8pd^D;Rr<+PYGm#FFb8?|qhzQ{Sj)zVNQFtL^S z>=<9YjoQz-jmdNSinOG5rtC(DYm8T@h*$g%H#qLwd-33IHXIQ{eGQEHBP_01%K=G> zT?AHJgCbyV()Oiu>YY~%h=}nE^a%0frzNni=xs|PAF2=8J!epl2&U6~Q&IvV*&~gC zyJB^>u>n<=$4-w(ojZtZwul(lY^mpJwHW$2##LP1SsO&dNfew5Un`mzb*zHiS|_sp zRG7ytj<*KVo$*CR-V!M#uL^I7fd^|Gr zF^7-CAMgSj9o?Q;>WZZ}-H*T#SvvX{1WfzMx&HmA%lT&55lavshh7O;Pr8 zzWA^=G`ig_SuB=RRv5!VtYqOp!{2h^77&{=D)aMm!FQQv5hj)F6&TCX9V2-{?qrlh@rb4f@1n1!%a3HMZ&4Zaickkb z)y2Lqkhqbqx=-xk!_4Z#p+cJI_J`GP;O8WdPH7Tmv#?LkQy{pn$F&O;DRVUz>jRDF z5$3B-gng^5;81M>zSu{0zrAEK9>E*+!%P z+B4-YB{>d8kC3}2p@=Wm&3uSAlnDKY`kL2m^6F6PBV!!^tw@d;ba6ViRql!XVznT3 zc0>UHcy!}4t8nZa+#tA-Z9M!AMFUN>UigYe@cgKz+CcOQ9iz+eubMsH6}?3L+uM5T zpRXflOJu)}Jch`cb;z{39NSVd1mzy}&m?HuEiFFzW+Vf($2%C!a-SW4$44*W`9ZAx zBQBBJj*{ByV`|9fGFUs$GjwJYv>7YSuhv);x~C#rTnnto_=^U2AAZ zVMlAt_STvow$}WpwdSeTnjg2;{CjK7Pg-l9j*Lc~_@~;cowc*?O2`J!H_%aazc^z$ zWutL#XNn7#(24c#Nal(qxad+B&8Myv{lUFf4}1o@qqtY>iIjgAfnr!qxmLSl4n2Z$ z?y|Pl%gN;An=8bjvWO-&bZ+K~B688ApW{n+=&1~0?Lynxk4?;viFRyj%?`_hhgeLP zid9ba2&8};8?ip4#~p)KT{)n%L`C-p+`5 zA}2_H!)zSuimaLh;-N@AJc%0gVaaJwwgn{QMMBsW2!7DI{F*^AbyI7NuA~PC7mIoH z($qAk%yXSGBUlL-V~y4&CMvwC-wW0CstW#Jp{n#*{s`SCf?noDqz=QQl&w{4O;q#M z0w91@V~ElcIW@YrxY{8W9rMT`X)dTF*I0xp9c*E=N_}Uq<}-$iK+NuraO4J@bgAaQ z_?tv6vdST?v}q?TsgtFr(nF<9&Cb$;c;7;}q zp@I@^+Dz{h42w)z!9LJYZ9ZIG7^Fkl2J#6DD?BaK2>dQG*)*Fed(1n9i&ecT&hI|o zff?&%Yp>xb?DE;3z%8kQ1*vHaRrg#D{q*BHjAKzey8Ba;Ff=F(y}WX?mm`;h_#7c% zX{Dpw<8e(Thl}~;^ZPu%h3Vfc?sNEQl03iC`mXTJVr2U;$7lxCpGwK`jM?ZDa)PD% zz>$bsCbQJHUrirT*Bhzpg>w*Oq_R_U;$7LP;)1tR*J!KK!dZ$+`rGdAU~l8aR&VOU z!b7k%Xr@0Z-$W%I_e*UVe7^*T?+?Kbg$J z0IAv6Q)R@^f79^(EL2xyq6J;8tt>O3V#=8Y(zuFm3!WOp%GPJ3DH(}xPopB7+o^Bv zz{eeiV;AZOTERoQ)9vKhPM(tf+ms~22hm`r;6EK7E|Kj&qB95d&crLu2TA5IYw=^* zauCEV)qoM)dq!2pQCrdK{HU715a9c>Vz65)oMfoSz9rfKgDxb(qRS6{OK9~Kt(Ag` ze$$!i#=kF;D^TH}dVfwDL+HbZ)mBmkN7R&)h#1Z9n$uUzfd3()t!;LyBU;&zEOO`i}r*&`_2N>xeGkhfE)E#$2?v9XI=ImgB$ zaylUfSHsz-de86pxTAHWsG-GPlB)|_OP@%hed(N)pedaM*bPmI=gHC3&=fpOJS-{` zVi@;iD3E7*jjSHor*!e=g|?oNHifJ`5Q%UQ8;?76nZ~_mc6IK1|Fodn75GCX$4zH) z^qrNXPv_2Bf^dvglH+HnUm@wxY8VIqs>i+vxR<5a349ZbA~ME#9c-Irkv$dHmc5~= zAju=Px|}bXw%7fOXO=0IOA7ahb(sIIWkLaGnz^uZSanMeg(#b%vi7Qa{UymVFErVD z6@4+(iiC^(-a#22f0JyqftT+-$oL#)e2y;0-|*rkjM09^NKEz}vBLnG|DktiXS_i{ zt;tT6mLACR!viW;4zH~bD?*$3M40f{SU@N=SQ=Kx{~vAd0v=U)F8D9g%mASV z4H6_?gKcU+69+UAazPCwMiL?d_P>Rlrgm=&Ye3s1Ou7;}YnG$5yVt#YtZdZU+SAfa zi?p?v5OxB{RxY-p(27cR#X${9lOQp3e($#?Ay~W5|NNhQ=6U8@-}U|OxA%K5xyg|Q zb`S9!DmCgN1)Jcre?>Gd%aIjR)>sO)VXW?;EQmI%e71UxFwmscnk)90D-JMLgwIEj zxQROFGeQAE{TkmL)6!=+D~abnvpgZ1@!Or~V#qd%Qp6_f+>6j$(;lk$vL7n;DSfep z%D8H8e95OZg}DN$1EUQ=Wt%RRcF;K(bDMUyV5wPq5Ogaqu5l!&5^x{T!_8A%@?!0^ z?aS1qQ5{yYoO=tD!mK}QM3sw>{OHrkh9i!)KBiqFr;e#|tWg?i z?mEBsFX7CgQYF(oO&US+eD;C_7aSJGM6a?lu9Em8X9lh$2`P@;RLuwE9VT_>y)G?G z^;tmF(7uPu1($%icQZli3XU~uTkqtoxr!0$h-5w}D|k|rGeVnx#v3ByBL$6-lq`v~ zNu)UsW^%Jf$X4QyYZT6%V`}vlfuux2qj3E(2hQW3Vum9s)|>M4Ed zSQ&#jDGvJCSm|Sko7yXA3mI`qpweqdMNG^Uz}8%yA~#6Btli41y+a{7{NL$PN(Nc| z)dFs{=CBrVKJyl}3Yjbz>Q;Hbz$d+^RY+!a&o*}#GR5RJWNmU{*O{AC+r$1}3=&ll-fo^Ld+kwZ6YXDv51`*_gw-&yLqZcfBr$Yj@}^>L z5~^MMt{g^$6U-B?6Jdu6nf{KNOfSh05luB2j{B&%duRu^O4;oPdR43g_<{_^Z0(lR z&@myhP@lk=P+oA@wv@nK)!!AuZB&ae=Py$ucznUjoefCL)NI8EChQ4(ER{1QRFZ3`X)HhRh1G^=Zq_Ifk$7_wjoX}J?IytHDB|WWm zfKPn!{5BG!OEqO#9L{RFcUSd_bV-`W|D0%-fYK$o!PJ=Src=jkF3G}nN?~8L?}2}L zROr9DNq8NEof0pvJXo?HAXo7aiS>e&32@ev6N!@E@OJ}}(sz=*`6F5LXyp3Pt*S4t zYd9bSY#3roL1OqsLFOUFGQbvgnH~o~;B1 z`|KY-0MUd@KOw}xQrBG;aQ}{^E<5EhAq|$(@&6^|6k2(~u7+EX_ns!od*SFWn+>Q$ zl{c(ZJ;WB`XcQoGg_fUuej~8eQ)oF*5$T*}l_RU%Yn5l4W!cg4 zNs+Qi(elZWvdLCC@}D!Khl7RS)h}J z10oDRKxEqmVrjNOECmWPHvmN0l*_WBrMUvP6j(E@(%AyHG+*GB&H-+;v@lY3&8Joq zuE{wHr&Mq_T6N7GVqUGxtL{kLpDWIp%9*3g$;zBWPZ}_8TWP6qhFzr18ksevA`?evy!5 z-a`?E?AB<>l4*`Q7%+F7W6MzEY%Rz~Lvwt#RVGN_nG9;Hb~Yl1R!(L()QDvgYZ&MR zbnM+B>e?7B$k1ImyGGC@_o9{=^odv-PobtT1VPpfSfRt4KQTS%vOH zXTHdEQ44_ATI96?i>j)vy@@+GzCnz{mXZlNm)59eBp}+7#XPe%uah}Ytn}QiN4#`a z1)QT-ui)_KML63!Znwk?#OBQKbXVD1E*En5=AlU1+Bd?vGh~wPQ;X66d6rzQKanLO zGsa~3S+W!fC-zO8KPB&aGCw++Irwj$vsoI}Und-)Ype-txC~$6e`a6n*)UaJ=P8c+ zThGc9#5%3GIPNhzJY`_QNwM~@qe68lEIBj*>(u(i+$601f?}roN}+Gm(i;oKCp zl%dO{U|$h<^YzmN#~;m{BpT{d!yk35cNdogS-RK0ElAZ`;`Kw+R=0jN&CW0kmS(QI zE1G#z8S&SRU*q3#n0JSGF{BC8q@EaS&T_)k~u^zaJ zOG<(v-`Xv_W_FF$bQ`Jg;Wi#q*DXhzubdTxXH~pfvTCe9CkpJ>K>3uTNj|82>zht3 zH=a~Uzz)Zr=CjynB`VFW# zc#I`GQ+t^E9G0btIh*W_1am4%C?Ch)TDWN_DTK$;b}3aH3LkpfzJX~P+oh5AchZM! zrx~z>8$DIGg+6S|Ap~sma(w@tBZ<+IExtVbwsAHS-zMej!+w%f)INz3vrsQaHdbOGdUOGQ_MSKqe&p&xrpO=lwtEati6cl@= z`OBbaM7+QF|AX@P;m^a{b~P}Prt0qPYA_^C)#=-1FqlbGb^3N00A|uuUB6vA-Bc!$ zH?YSH2aXyB+hrJ-%8VHTEoL|n<|zN-Q8Q+!!DBe_WvH0jZyz;dh7(f;in)CmX3TIx z9lMz3_B)k%uL>2@%#RuOE5Cb`OWZOX%Qzh3Xhfs55lc)fqWabn(~78GwZya{S(v6J zW;BwG8L`BSMiwf&m{z0$)3n5lMyiy*m{vr!y(MNea<}pq(~78;x5SJ_8kE17Rz!Nh zw8V@?bmcE*G!jyFF{6>`$}XlA$-y)&F{6>Il)so(WVZ4b(~8Vdb}_BUJY^TtirC67 zW;D`=8L`B)B4?Dpn6#C$i)lqvPg-KqR?@4Mm{!Dx8QvPe#7i7jCeq~p6QbOdN#3Srd=A)u_mrQnw zWD9dsM8@)7^Wlg1_H5dW$y^}Nl_2oj$-wXP-I>5&w!9zWFgHDx40>E#kDgSft;|!H zh@dwg?i1(3XE4K0%9J6M%$CTb8cq58j*bqO`ExJUo=pMFZQHhC%fcoLboj|^v4x*p zC?9iE1)uPfG8ss8r*g>1W!KG7j;q80d0e2XXOj$9=?43@Z&7U$%a|n$^(nU|edakn zSykq)JB6%irt%LzsYYM;$-4!bx#@0#%w0B)@RKs81pyX*vO#P;n`B^<3AQ2ekWJ<1 zYH06LgZfb!!9APqkuch_XOm1uDOKcA9b4p4nS|z}GPc7{hA~~n!)<&Lje!-hO%GvX zus_J%6ve^p`*=0#NYCiaXPli$MA7vor@BaFzHxjYm5$X<}cdUtcGz(u;nk>Gq9qX zM6Jkw;v6AkrPK?Z1jlKmTADcL?v*%RUjl;EQ?X65W;=0m1T2@7I=kjB6(w7uyj$a( ztR$xnlH&AINOAtsaR!pke|MY}N$0;fP8n7bxy^CrB%LA0DWgh4*EmiYQ{t?1ob!^- z3dd{g?xV+@g~AGTzQhhu|nbZR?MW z8P+u6sD~5+KAla{T@VdCsxf{Mmk2s&hjg8wseNc9wl);d&Q3TZc@EUa-wD(SkkB#3gYNTnAKffL^NuIS6ycnUhK z?oBeg+=6Sg zeU3;Ar0VBX&0l9lLjBs0W73)RtDM!QXA>`HYMJQSbP`)Q9Coc_j>(%M9P#$=5J4lz zyqM4Id|fl!J}(C#kv$u2mBv-tW)P&DOZ@~(VtSpy!-J}SS4k$9NA?+^nhsb?vx2+z z>xIe!y)QwLDj*LpXNnd65pBRr2kl=_^F+SYqn=}9p%Kw)RfVdtpvYAi1t{N5gcFnr z=Ey9|8LOm34r}adXYHACYNG~?TEl&i2-VvE%stL|i@dIJe8WA;Z~3U-rM31ZjTC}* z)ThZ@5L&ldyG`CX;vlVFwB=-ZUb2x?i`Egv2OQHxTbgWhBl?TjfV;~wbIiqA=HhH~ zagM*uWVN;m>+B<38|%P(*@cpFu+HA?cxd*ONsnJT9zI+6C#&p#SNF_p;omL=2J|2H z8486uDH_1)>OA48vfmUB2spUJX5R*OsClRXa(pJnVl5fCv;oC1DP<1nRVFuHf}?2sGI5$u_CdsXo>;&KBDD;lsCXW@=y7KICES+9lAgon_2&*JPV`v$rt z{u!$*8?PSCBU1;2S5yNvh`QS>&&q874y}+iT`M>5-jo|`@ijd?GW8H8401Yr(<~nG zL+&z`9idZh1fp=4MANG5mDq(kOPpoMc3muCgW~X@whlZHZjW-~;GG1uBodg~`G#iR znR`{0Jze~6&zw(UYgI!{Mj_KLptwbI)iyCPXK|K##_acD-s~;X!y67KhT*TE~*abR~1!f>9dNe zv-L}hs&n*dMb*9*i2h5mtvLr{+QD0(91T|cn%+~FW&};hItOyCEKuifdx=IZD$DXK zQJF<$+5WcO%7=OO8)#JP3*5tQM;|@sQsFF*EQ^P_-f;Lhwc~BfYe~BHoeFp|#B5nas-GnG~eHiprw; zRiH2$w5B(gLlrj*CwCdqho=;`{pFGR;W(ittrwmX?dG&mgj2_K{19 zg6Lylc0+#O^j<}(b++^E6w7y`Bfl!m@{P0qiROxf z4X2Qm-1>v|3Ota5Q&gsfK5ujsvsTM0Y4cvLWT5N9-zXO0HXl%rKdZL-#nn16s;J_i0ErBc=1#fjNpRvaCBzu!}GZfrD-G2)rBZCK<-c$79Aeppp z#`}#2eXiylMHUXt^dyAiBI~nQD=I;ovRUFo&DrA6yDP0lkcgvZxl`5xl?7&2e273wO8h6cK+rBDh5 zLgPAnQ$qh7pBY6z$++@G`sIwytDW#r+ zx4TvUbK7Bkc3Z!G=>Q8sf{`m%eHQ_l`>`rT-;CWA<=d5u$A?1IupqtKVeO)RL%D!CHb*iRCMm>#f~#{S`J4D9akNc>>i^t**UgVGDO_#C}i$WRQF8b z11)Mw{J&x)a=6s;I=f;e!=tv3M{Pq%8~cf7|B^MWezY_P4#)$hH{O`+AxlB3OBT@Y z6fiha!2iB%vnboePT3}&FWZCYl8rq$9QVc^{5bB3Jt&3oCE-ttPAXy0-5a^6JekFN z@l-XYoI&ay8Kjd&+u?QM&tZ^WnH;2(ok2=7^q3bp1AUES=`QD;rYq@K)fGvGLVh9d z&zdxYw1etTI?j2U0dIW>TF~M3UW6ok{Q*u>$vKtDWHjFJAOvvj)gL~Q$oEnBb?-{;>dFM*8Ed(;s=#AA2baF(mTlqu2-e!{Z#_@Hy*Hq};O@z)Pg%c8mcl z@1*ca*=)e@I}D z^h=qC+K=f6<)*e{`hdC-$ML(M-;DW>Uz-|mw@hmAFh$gax>it^_3Bh@WqhBT;TlUT zxm<#~Mq*D)&b^dRMvZDE#tHYBcqt0xtNu@bRPj>A#1p-wUi&{jHJ&yaZ&E{;(W;_; z<5QwuE}^55CpHSn4eF;pC8lx0J0_k|j%?5U)Odl>c#|50`9*=8@X4sEi6nST?2ATX zALpj`w+$-6qp>G8<|x3w{A5(sP&r+V)9gpUMvPtV|Bu(Ztbbzce9C&4|7A75t|D00 zyPx6QT#Rv_Son{wVgKEFC%~B(qj8gS=o9Om#QOC0E}7m>gdy@g!~Ycjll+hKe~JGA z{>+pAf%Q(cL_#W@&wn2OD*mJM>i@U(ZreYTi?iO{gZ1yMcRMKy{UDJy@5OHO58xPC zr~YQWlbHW|>z#r*0%vqp`0v)cB&zPrv*Rtap-`mFU3S z%l|0FO)dwhwTfc<1QOMto4 zL6#*dPg;EsfP*;^h8jLYWJw_cVqLn-ZpFvTy{TyW5EQHkFyd%z41S@h-WdGq#ybr= z2RgJ}%T}hMc?^ko&~p||zY~`=zZkndu{QB?;}rX~OhAD+V<`yO(Dx~P5_bfY-c7M* zO(ihyA*LM3xlTz1s*U-QpQ|Q>h*8PV|IjZ;N2dNqo)n9n)B7l2?uL$T+UBc9)^J~A zN{wAIK?)yF-y-XLR9l8r6xbRxt1JE`YpVEhY#&4g>)!r_x4Ogn#PI3~F8IYFE5^f@ zHa?7)=*S8f)0RQi0L7fE(Nj&^d8-=a4J$EMie`tYl(8oVqMe^0fFzXW-%&ag&%pfH zzoT-9yFp|nr~Kjvh`MfTI>0x_0V{&+Hcut z^I6>p>6HddHeOw_;mRqs({MkB9{1DQO%NpKF96l^U2MlOAy>*ob`bV!#b|dc|8=L( z^0TMiZN0AaBUN?P+E;?qP0X!g7}{abs@7Do)>|33%fLLH_krBVyVuRX!~S1_bnSqQ z)`@%x=^Wg#R?rVYol20GA*r{D(Rnr{=8KpP9Oi-PHc|zqX7$<6GK!fiLYSu64>G-k z|D}H5XhoOW+U?wN3R$7xgfbel?C*nV+oB3)RS z7lwmq$}IrtEg`{)f!z#Zm;TfmE5+C?un*(AUtsS8cBj#q5`Rct1e1o8rLLwnI!Q1B zTyDM?{fe9W%@S*XkW6%f79Lbr)O2tFSSLWJ_*Y~LPz>?t3&mqCiRc$nxO-g{P2+}8 zcp|hXTH@iZm=#@Jd{tHN)>PGQs`+9pf6k zRrU&6kU=U==RBv*6kaAIsu2(Scid2J3}0)#r=wmvFQkdP;MfQZ9t>*jYzM%|B5}WQ zLZn1x#I%2l-CcH262xCLKEBrK3bCvT#h25&_tCp!4=gNOu({|9rQbm3eIU)0{xVlF z{kos1)=!U4ywM-JqpTbSbH_*dT1kpk1P$~X#*FS+kQo29>Sf9P!l;}*Ub zI#Hod0_Omdr1cFkgNH)@RpB7pT2Bp<6qFn4{*2)i|JOw-nb90@`P)RYnP5>D`+tGh zI3ZOJgLI6wd#SPKL$IZYx3jwQx(W^t3=|uK-VL9F+7w)aeHMtIjG@CZzU4?4rDb!TnA7 zLPeUH9(;M-MId$!gh1w5qz5Imc2(} z=JT-S=?eDvjcLT9Sk^#qAN2KVp<=rt9tcZcaB%&6vaIoRvh}L>uaGY|uwgO`AjvAF zSbt`=#^0eHFf_1=xd29aA$#5MB7+^mNH%hraly`7eL6!bV0~~a6d03hVr$*eY0*F= zt2i>LWO3-jCC62oWTn!fj(n+QkvYV@o5Nz9!{Z-*{t{g1r_jFGA zHC^+_YJ zy$ZIB*HRzjStLMgX`&z^RV@Q>6OH*{oNns2k4;W(aA&bJ2$B_!aSl^l0_BO#ONR3s z$J>1zzH03_O)1k@pHf?8kEa<3xq&k!qkSb(7wtSbUvff7%$>I)6=tB>bOQV5+@?ji z$5R`xDGeXs@OEk@HyT8A0Bv(hth0XUBm|%ECO%!jVa1i6vbIAAzJswD%=orvs`WPIs1(N8LcFK zhqV_TG&xFkf)~^{T z^LgEM`akjaNN;9n`Aj4^Sp0irRqjE}>7ep63L8HdUly_+rI$ zU`*?XX{~VU6_ZVWv6iD}G$I_e#;%}$Xmfx^E4>kKJX7R7cvlJ3)KRDq!monEW3ewM z?x)GsERK6&nx$5IISZ_i)u{DU1t%BvWacaAkIpD>JEnMnPa!_q-*$%G9G#C)AbI&9 zq=*N|rKi|~@DHEMX_^u~_rS)9{#{+su&^{6C;akK?%&ncosY9~P(y5hS$fd_jejKp zXt{B1M5^pdm`e|sOOKjMPnb(jnoEbwrN?_8AO?WAgy=z05`L{=d-WLzWuA=7-(F9! zQ90!8t#T|{uZU&E$K87qmT=`zxOcAOlhQj|e9m1HniWIvwf$FI3~&)p6`Slt(FTs< z?A35_L-X%?KBk3Z3rh~hdl4Yg`z|PXNq(tHzGEbLpFehl5GjA}ek?J~l$0ccAftDu zO0-D-Z1`M*o)bQIpFTN!ZiB!5G4Zeb*xUO(m3Ao5`>
      1~&wo39ULq7i;hXkvLe z@xruw?|lTAOAk6TgU0di=;~is!kucG2yWxGl!oG2jabnc41;pgj15>L8SL@(Ud~sV zbnqYjj|l0BF}T_v`z|Bg7+mImB#s45kK%7H@VEU4C#`)y|NGGR>u>L6tynWqI+X7X zX;J~y&KSc;@7cv}y-~Hy4}mW+0^WLv5-SHCeFKPK8gFI%ifa#EJ*6U!Ok^DWadG=$ zo}Y28fvCsdwjUdO9B=oO9*`K}t{ghEIQILUydehnBT>;GdlCPh(mvYXrL>@rEsc|} z6hjZ%`4pro)-Fk_?9P!1aE814bug<6`1sX^eHRjB?eY45R-h&Uzg{mDw2$&OSszhJ zdrHqpR0j^nrrx({8&%Qm$yd<=D0O($o84dfu~)yy|D5ZPO&uY`NmjG>*V3A+k0Ui^ zkkH<(IJaz*mVocD_hEpCeBpEdC^{`gw-IA6kO&x z@RhjZ^YS_m4fg&DAE)V_KJEAsxO3tq~->PFo2;jZ7&Bm zeMPkNrS8&q^0jIZDzqL8eLP-~j3H_CAXP|-&sF_$2|Y+yPQ5;Uja7LHu}|?-zAz3r zz1}-Z`h#Hwcy=k`ejL`BDl7`3SgSscSOSRVW?~kLukN$=ia(s4KZsv$KdbD|bi_Xx zjo`I^tP-BEedT7AvPVWg}JIPRchH(PNe4?_iy<=mVgy;|lo%z8XRdpPGJItkf?CorD ziO?SFsL_?52z4OqLZtZ`=ZYks7LRAeOC0&+@kpWoonNn{aubVFFwA%D@9MoH;3+_ zBVAVL1ZsryLTCEBe4)w7MX0th#}kT zt4>KF7(-BzkmhCa&$NHW+RDmp+>}7wkwn-i_g5u)#Ok`OwvH56a23ub6*Pirb!DW2 zkPC)pmF#9o)^!`n-k|vE+GDsh%f*tCba+ANlnh$cBW?oMNGQjy$2g#YO=7hYM*369 z@A2gKS@l))OY^@^%w0S2Q2gb2t;3QCh3vzU2zl7Ul1QJ@IxLCw^s2(26|1-^5z297SXoHW zI2nA+-}Xb2LG%dq5)75OL-w19P@;OM<}N+X$|*|P+{i{)3Ezq3n&&7D?4UnFR3> z?T-)z0>{$ySuhTxXzGEO5$LH?nV;EJs9>ol)vF_ak^YMkKtr} z>f$aVgbF@ELgV4ps=Uq&y7CJ~u7&ZLYS5wiGjvx6ZXSw)%V z{5y#fnO-Fk=P9%(#kkDDz}CjTG8F7vJ4MZ4ie|j01r@?}-McFr!cwjWq?ilHt-ih? zA|7qxah>vLKeiklenOwQN^uRFsx*nIxfEa(8UXBD;N`Cu%fBj%bA_Z{>oP_&?AGG% zDgs4E5=Hy55K^~%b`>P=^}Sj2FSmF($kf<>1$l{t&t7>|F5psr!qMfzP4pNvgEjUa zIXN&}xTe?p+rCYqoXhHlTWUdx?Ezsx%TaU9Iv3BYwTEe1wQ$fB3x+C!-D^{0P)$s1fCH5B|^pj-DOtEY`OG87~dIz@nr`FW&A#6tdC!b?O|*pnqkcK7`-qf zSM`95GYFAG(~bFZUFU#TYY!m;SgO^oG3a^+K{qI|AM7E(`x8WgYy`eq`z3i|CY~O! z)(&s5n?Bicn`8*>r&Nk)BwS096r7Mu|HE~H*#`Z&NddIw$?xeWuaL;6YR zz`ePdP(_OEbMIdn9AU+B!hhn$!0&CMdlLI~yF@*G+_F$j`wgLmz?AaU2b7Z)5B=?vt_bn%EG z0yt;M*pxNgIF?c>w;67<@M zN7oCt|2`-H_jNT4;gy)WjW%J3Ol>%UlbQ6C<4&b}4tDkafW}utm@OCaA)J}HN!9DK z%SJHYegYbyVxI9nO)c2-U1?*m=W^P5DVp&Vdl+Od6U(9#BWcmj=)|(NeW4G*PSe!U zsVdYfWX3n{*S*mScQK)7qFz4wHHt(zBYbu>C+V}La*}@6+FKDW%-26E420YjQP{xS z4o3o^eg*AMuH)0aZ>XxS)nq9Ii$gP2R~zVjV1v;wQF2gbbCLo-#d{=o81DB&FyV^I zIZnqnoezQyH!0Ehs#xjKT25O?bSm{$SO3ZNr|evNr^FOpIruL1#UKJl@p^OLwFu0G zN{; zr_xt#r@fL$6s-WYX6@BI-R@HGJ0;SJ^Q@KHZ4agn9P4&pTVkBMw`r2q)p+j@Rt^li zp!EO2z_9fy-V>DfgbTb~_3q@1RO9edo9H`NoNpqe4tAe!Atabr*$EC7PRm@_EVGl% zLW{_|K^^q56(U+)zc>g|a%#ao)hbf8=dI3eSAO^&w@Vu491Y{SHug0)2{;LYVy?4q zmJ>zyxcvI^c#3CGaFs0!#s5nDACsY154qNQt-QXyzd283q7D2xK5pR8MIm34#}qN{ zzB=_Hfu%9O&OUC-i8FJR2<25rCgapq!t->r?vn%LdsI)I;{&n#c}7c)4UyfB_P0J+ zc!!}9B?f4_ieR7rhn>dYP}3EVSYO7_pAa2a&fC}7obq95BR4!v44uEQ5VBp$DPQ~; zQOf%nuBcKddFhnyXb!CA%HJF)MfqQIU`=R>I#4_O*IUZS-TBn#QUgJb&Y%WL<`;teYdQ@Lf9G4C;CCem z6^%q4$;{D7Emyi^hK@|Q){i7tf7@xySi9&YYS2g}3}#aYAyX#7l%&6Xl2y;P{~)WE z<3%_AUXs`g@GRyIGjILXPDquVj~AV%KpJ+i(c>9xI5i9Gu$^{9HAJla9vZUYfP(rh zVmlt__59ALqhYTKZNnq6<7d>#iBn~-#it>V-m|1+egKd>&)NgFm!4l7wG1gnlkuE`msw7;jA!Nu*Tegx#bY++QF)UqMBt8)JiDYI=qznZ?t-U?PRo|b( zJ4|sVZH*3j4*Xuq<76VTKTnWAc%?!&tD>s=bOFMD^=PcKUr*SuW#lT$TNVq_)bga$MhYT=|a6bXuZjy*l~T?aV>OQs~lI=e5tO0T`V58cDa1ySaZHrlYA%@+?*Q1pwjFw5l2;;%iAUP z8*h=qoGS?Lp44IgDTN%N<{3^I z%(PfU6`^xocK9BO;7y49yzb)E3D!iTBe%6v72pI{S_fLwGx0P?bbwpX-=1i>UAVfu z#@U2k81?YPaNSeh5NLs^M=2^TI171h-JgQ&XB)Q0o8D-8q(T$Uv9blhfu>&-9J4Z{ z-ZAZ%F|Rcdo6{PqY(LgrrnMrusDD{}g4I=_E_oe)rO#y^Sc3+Vwk~3jBr|k$JDNAi zbuulySVNqSyr50M>Wyod;RVJyPt*4jbEOIhV+M#?N$Is+lD9g!-(U@@h7S&|n;Bc> zGrood*m1}J6O;hb8he~>F}iYtgKOVldKSrH=?a+V<>D`Zn|2CjLQ(Kk;Dnwg)lQKO za<04(79^r+$PAo3Z@%s>ueG}mGBRR%nmcaCwBOU;F!g;7h>RVSOUx~ln~j$v?qkqi z)m!rgLg5U(Xlb4O5GgIYzBGLEeEqVe_D4hzH5X|r`d1`+9i{6R_!O<)^Ks#f(7qK3 zRS3IH!p-Rd&b)Nh%AVAPlvJj(Lq=77Vd)pLnC#LiidtT|W2)74i#&arb1U$-h6}TF z2Av$b!R8kHkP>?B7vH1=Bk>tXF>O;-ZJm%f96`Z-5homx6HNWub+fmk>R4 znSM32Czm5zsQ>Hk+abEqeF--Yj%hrJf2OQh+5e#I@fVas3t!IOM5_%cG_iUV{qf)mbjC%l@_#lrtKT zxQJ33FT8iBmH%G+#}?jNnwd!HDfLRd3XX*f?+$6j3*rM(q}iY;Lzjb>Y0lz8{($?k zSQXsF*6z5{R@Cg1r>iXgw|ARMvkt|rBe(HBKXHK+q&w~IvV-d24>?QM?qRkeY3UeJuo$SJg2W$0e~RwwNtGB<+xS(;CsY$Vc+TG@_yZ?Q z&JVqUDN$IURxFGmpOfBU?psrIsnxAdEG}MClodMbd_KtQw&n|Js?4Rc%cT z($MFKQ1xJ3ziz4BgC0_uGF;{KSv56Ft3Wm65-agC2ZxC`0`}cRsWyPhSc`yGorR zM0n{z0oW~1ib5&GWv`&4(N)A1v_Xi~xDv3~X;h-UW2?M(>r?HAs6XZNkKC#|fWYlX zEzmTw>E_KUw6XK7)_C)xRfvuY zzPO%=0};#=EqMDBZ>R!9w{bRSUG{SnEqvtt*zIm@;N_W3+ZGOw59N{T%%XU%(Rm^n zOzdQgXSeMk1(DJu5}c(#vzn%8rm|{Sy`B|==7U}eW1Z_vXiJR5&FejlH?LxKG+w7% zr+7sLMBdUNd{hZxcwclEuY{Gp^{H^A!cw|o$T|lANgn)YeTwx_@J0PgTx_jscwxts zUS0yiN8V9oJ3RBw^QE7pN}miKDgEJ@-@c&q)tUl{Og_!L)v;^H=QD5hT1&ZBAvj^Y zQi5)h3rNeD@9aoSu@lV%!mXNF?Zph<>J9xv^!9O@k;sWu`iDCs*wwk<0@Rv9O!)A@2T+pP6oc33pLfO2P#}8NjA>-Dz9=TQx*q|$0O3k z4qU4^FkG>~iBJ&;Ke&K4K_b|&@-ZIZ9q2y6dfo3!ysW$u_n)6Vie5zxdTXl8k(d^S zfz;ZoBIfOl-9G75b*v(@y2_phrk{Nc%w8fxCP^?=>a^Zt*qK&_BsDW+GNFH<)Vo!J z%(+s{(W~L9%rV(;an-_gv3Xx7vdoQ&i;UO%m=_GSMGX1oiN*_wBkzgCbVwuO(1o6W zexjiNh%J;7rGr}}CkqU-xkBVD-lkc>S(SschSOgRr5jzD!4*RUtbLm=iW^@If_e8s z5jQqkD$(L^1&@a6iL`E#fqu`B7e8Xg-<5P%jHJs@VJiN6#GmNMLO6=xf)!ppv&Mdv z`CV__7J$rdLBJ?XgvNn5_2X$ySEXDKumZ+M&|eIpIO3tr(rs4L=7l5Wy}@$4?q4`- z>ENu;86jMZRV+;ZBijB#7g^tIBR+(D1VS8Z4bLh{e_8KE_?ET5AmJ=7BMS?h+_wYw zg-}K^o5mb6S=GL;DfQ6nbgyHimC*VdAe8YI3Q(c9BBW0)zN z-hB0NXSg}t6~QNzuBM{(!jbpK2S=@xeSA}7Vf=GrB4)%Ek4)R~Ut>`jiao1Ji}xH*ZV?Xaea`k`WypS`q&#+p@?#6lD&g67wzayE-As_v!5;k!hO;@T z4a}K9YO*!#DPfoMGK-u9+)ol}uS10-;#99el87rOxwW#bS14#gNtKBVh0#o8Q-=KR zB4e>Pp#=FRQe|peWdZJ9>Y6J^Otrt&Szietj{w&54#v|7PJkfnZvJA2Y;SkP+Va)j zRyt%Bd(C1EB+9Kc&$&je^KHN9LAH5zSGBt*%ff-d%Z%>*7g{^^J=gslp+4F$FIFBf zDh3lqA(Rj}J{483NY}!n7xB;~}1@0yb9B7u>(TM~>`Ee5r$sVIFHl zxM7Jmb}OO|y=IAK-23Q4m-+0YGWnuq3!;06J5hJTDK+*>cl?!PFn+Q(iGrCsMcerx~VOu;2Xi-Jrp4roP+trF4f{)bml zD$dIO_9a+6ub^n?5fP8V&~O&Ko0*O4(;9EC=WDIff~(j*W#^wUy4MVRnOHVke85_+(ys`Z^)f?R2IH{r}{48e6z|q0`DQ z#@TO)@V8rOn<_ag$;hsU6du}tD7NrArjU8NTc)AHc$>Gt9(&zjZ#j*~YAXWM{V`EO zjg+mcfy^AeZ76nk0h1Il_C8tY@L;WzL(WQQ66lI{sds27xd^HNS}3^08-n0IXWgaF z;`hRlIJaR|KGpIQLs!X(YFd0ID@C&9W2`&`|4p;6@JY*W(9Ex>mfwK7I|#Z0p3snq zL>Oo3b#gtw+I>wLR=Vmo8r+K+yiK)maxt=wo~q_a>#c%__|q^BAAyJjO$c zh{B0~U~_)`4bKHri%Uwp^I0v6O?Mt=71n26@uy*>`WLopZvAp@X4gBk%0jCG zn)E6vSqlO1Mtng@DCGk7^|DI35MpWyANjY9Gfatt!g@ zhkC7~RFe6H_4=`tb);S^$vIiCyRnYciyf);RHmjVXa)5UfUM4J?o-DuQKQGQ-Z_{W z%WhW~G!CpMX2j-nSf0+eQu-I>Yls|cOo2|rYaeqSBrK1o8$#c(zpaxd@A8S9wb1utJ9yhegz`Cokav+P251*Y78kZ>T>vm-nM<7Mm8~cvL%-au{HN|T> zAQ*e)10L!OxO2yah&oSVPQHUQr;Qiz5aTW#4EBf$@u9p@U$8W=Hj4TX@$L}iB+DdgA__eX5xG%fIdTwI6B9Fd_M9I zr5W1bo>Uz?+ww>Q6^kStP*xZF+kPs~5ib+o;}Vi}`wv*n!ua95(mu6TBvK>HQ?i`jsdg6%NLDTClr$oYlQmLgX>HN2;>bTPX`zeP|}k zQRZ9;vwwa;fVc5t`vlAehzHtvKMxDmR7qlLli(=ikUhWeIuH%-6zuzLSOQO5ot?vq zLVV7zWk^ZMv`x$?U0#_z#)O2iJEx@eqZ34KI>dv8A99EAe4znx>8ZW_lX#Pm2WJ#^ za%t*Zd(r%Zz~2za>tvW39ng|}<5kMiMdr*zA(K+kjls-j9-|0uP{Dve$k+u@{yxO- zj)5p7R-b^l;S&&56y{aUg*>nh_p30?3NP#k7wjv%=qgrDwGJyjSVanQtX}cKULvp^ zW=@9@BT4c_TcxakpRZ!#HsRV(gla?YvK3uuH8fUxMSWpHad3jT6+MX# zS5kgFH+S(0y zeU&1Q2q?BAd_O@Ru~&#MzKIb?(nk28jhF~+gm=9+4+PyMcjjjD_44%%yb1~GtFBKF zXwaTWq*qERFy!2Vtcw(Q6vy4-e_G3pe~7?*V_#x(NiT7Q8%OJw7e2rWK(WifQW zG>lM+m?=A<@O7b(rw%Xl8xJ?!2Y`DMbMbX0N%9EEv6gwQ`+bn7>z_p{F1L;G|C+~P`lu|{ACOB^J#PA6v((b z?#GR-zL4U*8Vl#G7;-v`La*3yGxf|4hJuaKZOrTBrk){6+$&MDKF(Z zQm1C|5ArMaSY5iRRJ}LcOIegqgdz?!5cwPQyp0BkI?Q*e@KIdYD%=+W+ zWeL`2fE8u4(=++<)~9=ee+;Fk_r%Ag|7YA2KH#49;z~U|_+KH^`|>gp7hp&WTG8JV zSgs&z3^k`jwURZ2S`;W*l4QA3C<*k-Zaz5!T~Zh+q4oT4RXO%6H46H4hqpk*Hp4=B6yW-Tcggb2ik z{z||pV3`1m&D&nrI767{^7bD&QI)vCUL!}gJ-)>cWD~~PHWk`dyq6@sjrTPOMBbLE zB7;D*j{q6^?8cmWg(_O*CY!F6z^2T59nu*jG4O(3Imkm710wH(yFiJ&(H_ueF5pb; zwKHWT$PPJCor4yOlUY#@Y-%ZS8$I_-n*=PbB>!FX78*Q*$ zcH{(XyVN#x+-g44n6lg&K*ly_zTj(3erjNK^85mEvNkC$Qj&~Zx9c{Gnycn0%Wa9;0sp{gq8ctxUCJDj6}~3jqct%h?{^>a6@Kz^#H6#XR16O+KY%& z4_PP!IB$v1+88+U7HjdqE26%cdWF+Zr-Q#t6oY_7rsdK>ZocSNnE)y=1doW%{Jd)G z23G-FIRriOx4*86=j&?78tZ#s(pUA1&)G#e&~hShDs`A;gpsUD?hx?jCMo7VCGrzv zB7cW!8GD?_*3y6@l^ex1x1#U8#oe8j-+s*MX_*0P7mY)cc$-Y~?>bz9bmaWIB7x#W zr8flbH4x50^heX=aM9eR3}^z2La7jg#s50&3g7hkP-@~9Ek3!Y zRDOhP3#u(I z|6J)&gy@TY-a7kfGGN0uTUhQZju{N$HP$U@&n3o@eDCElj5~X^S*X7BS+{7` zWdAd-C>$qSgP&?3u2Y`^skS%v8`nH}^F-AtpPA|gKRI|LG?8gxF4It~XfE@{Z;SoL zO*Agf*8a}kshua%)Ate~9Zc36>4J3&w7-D7j(}&M^=fB)M*1r;-(+w%%e2-Wk!xr@ zAAgOZkpAKt5OZocG^W^h?qOU(JhYy+kUbFfAl{w%jEA6CzYJ7jnId>;I&GYtvi36L zZ0?5X_ANy1anZ3Z4%~7yv3!4>LyDEAx2yH+vv{nX+In_B-whcymt`WeJ4s~u^te9b zI1V182|K)9c8{|7oEOVJE;Ud|+|n@bFG8vMGY-(!VDKEArE{Oc-jI)XohUloDlv7A zsE$X2Prh5v;F@b4%|KnxJv?f-_LfY2c&R29YX_hff$EFOUun{&s9Pj|kh{WSJyA%zMD8H)Ps zXtmp+#(;(BqhQYlUUP?{-^w9^ceB7L4)(17Ye`AC$Q61?q$zZH!I^4nI~nmksi&wo zMR!$gl_szSbrst&o3ziJ!2QG%^;@MzPsHy4z=H{Ry~=4htJ^7|w|G9&!L{~ujr|?I zPF!=Yz>M>9AYU+>3KBbM9PafYMh6FV`v*j~e~;1okgSp~B4;&2myYYfQ@bEOHLQK7JT zpONv?p_qFjZK&OLpe) zQ?gk(u{@9Ph!1~y%PrAcMEBgmRm+j)(|+nB`eLs1kCV0FW&m3Yy3(EsZ;Oh3nXAA_Q-%dS6CXvmq z+vxV}{@p2hzzNEcAYjMe3_m7;E>Swxz4p2IqGYQWgC%RHA%TevT8;QXbZ@vbClXPR zW*}*5?G&U;ZJ0O$Zg03ZCw^iC7@&5sV;J*=AdGuj%NtD_+j#mnI=GJfE;S<8&q=N^}r(CyC^iJs_{(RTh;j2 zxTmVIKQZ+lS%JnGzI-T?}b~ z7wi9d7zLv+6a+ywL;ykf5SkR@810 zY?C!W<5^l7dqGKmvCq&ms_c8XTnVO@BcPGUY`WTssHHh*AEEbCK8ZPL_MN|nC|2Oq z8@Xxd_EWH%o><9l`md57PgtT^lY3vSJ&W#?7!QAyoz2`+?KOQt{9^HSg`lcQfk@bPCxb#M>4V8e z+g5A$1FycmEU5BqdWgpQGNmA8rkfUnU{EReO)}ZALLpKFmMB;wVyS0%e}I(26$)-k zSP2j|pG7KE^vd$WJ^BZ;OXgjC@xJiuIVqi5$)*z*I1vhU_~MRi(Zd*jpf8asGUkl= zf=_d8gu*F4wJ(t&evMP?a5qyy<6<(ROX%2U^0`v-nNg1XQZu%ll7?#r0?^$^^%DwY~+G*zG{n~DcOG4 zjvT>LT`}Qgbeuku{HK?d7Y?mWD?Gj-CFQNcL2O5{brE7UljQrl_C;#sdq@&0qPzSi@ohdO3KikjXLouSW4Kc>$pE3c-)A8^QZ zDr~Fcu2#=;(D+56KOnuPOCPUtU7IrS$_165sNjDS_)>j%HBerD9q!|EX3$e+glN1yQL zfog+jW&MWZpIp&chVrckH0uRVKic5t+}znaBmJ~h;k8~yfk5XwGY-9;zMr>iue1IU zo5yH0m3)9C__t;p>P>%v6Sn2;d>i|rchJm$0zZ?;>U_q19c9BS-~tQouH_cJxR_)5 z6thM%YrN~L>yUR~eHd#-NlDEU_WhKq#%{z^3?X)ka^Ho?$;McH1}f1(vJN! zE=P?$*@;qbqB0QLQE+%wQH__!P#%Ljk>X}9@LC?Luk*bCN+Z%w%dNO{sE-4VxlS`Z z@guwB7Sg`X8w%9eX8=X0+y?67@ikx+R<1D@Oh_`2oVuGOf_rwX^l?xa+^0M4GP(0C zwdF|$s;biCJl&b4FCpRtP3d6t%u?j01fqU)OXwKm^$EPoK+<|PBZU04w;Q#U%pPMf z-T#dZ;Hwabvb7tv^yfa`gjfiaSTuTir{jO)bYaN}jcZKpEyL*-sVI5+rAX$Os3b4E zgr_3;Y=ji{sMKaz{Kv-Xqw-i8e-v;CF=>ktV59+4>E)XwGeKv=2beRyGp-(zC@y$rKe zhLgr-sKg~mcE6#C{B09dov!t_$-3S92eNgblWR+|M%VxS40xzwx#3Z{F1BP?`l2%6 z^u@wtKkD@3y{aGmv{|D!z8X0=QkhgKLO)6T4}Aa#Y3oO1X^c;hwx1{?WPIcJWlMTR z&WR*g81FQib6om0K#na*Fi6Nu&qPW``>#l6RN9Hgam#v5qRY2cz7v)#GX^L4+vJ?z z`_K3=yn7=!dP+}F92bwuNh!}zHFwE7)~!3FF%co8d|)<3=rrqL~sRUBb%NeCb$o%=D@p2&0nXiiIB%rnpISJJmkqM&7LncXvyy>eM#DZwM)<)tW!%7N%4|Pzo+2XPC-T} zbVb2oq`xvpT=A9jx5X0)k?C*hu;>LY zI2M0;#0DVlD(t;R^FeM@W4u){D!u8YM^~9&Ni*wH)|e#|tkP4gP?K1o?%S;ee#d`u z7vhNde~LsQonvs@C;y};w{UZCao4wGmNi21L|YeaZW4{Y7RLDX;ynZ19Y2hZZrxQ4d3 zc=s<89ne!-c3Us9L-b~Su_I6kO6ooD8e?@Iv|2IW;x*>dkG{08(roUJ{mSio_t{hI zLY>3B)O_H7u6y7po!bYO8hu8Gu4!%lC~@;zHi(mDPJk#Ut*`Gd&2q0X3-n3g%Sh#c zuY04n_cTih9!6p+RE|?u`JV}W)cW4=%_0$L^+!y=Y(WPp@GDROnW)UJ51j_ze$l|6 zTi=p4XhDoHdH)lEi|bJ}xx`Ji+xMBJ*)3IOWhP3$V$I$so{&gS*cTH^MW3WBA|{2j zPYxt~&tZv{p0g^m!>i8;nS;jCi(=k4xE2GsL?|99_yzyJRCG(4%jx~jVBt#_&Jp^q2W3ze@Y z2$ggUAt_c|a#+T@f44Nb$`1D~Ieh2`OgG3^6_ABsP{tQW=&;Hy$8cQb1YZ5P^soR9 zAHRaz6^<=cLO)V+xCqriJ@Rdf!_68JNX)d1Ds#W<7S{t;-f|^=UWXrz3<=iJM@2THkZF$pj+xx0- z3Vq>Ft-Nv5dd#rvaaIT~2Mq@+L_gnzGpkDDx+dR*ky+SOsco(6M9JW-+9;W+br&ls zbr(VV3!U%HjlY?QOcqB51_(bM*&NyvJpW@Uc*7TO7w4vIxeaDf`kWDd&k3ib50hym z|0mcjTE1{W%cow$xs|!EogP|rmOK0dKF?x3vshzHAbKk(`(*OmnxB%-<{z%xikIM$ zajpeF8A%mi|G@0*rpcRV$$%Qn?0zEq>sfVeNd!i8Y?K@l7Z*E{8zUOp+KG+aAfFZvQ%FenAF<_N%WglW@ecPh)Z1$mV@nO^h z#Lnyk6`{uz?SR7u`!0N|5}yOi-+yyK@-6uXZ!W;^zUMUiwnODFpLf74O=a*{K^tek z#mqW;Jzk%?d8VzNwn%vMl9ySTKF&G!+i^;M^H@2)oSNPIK~~O=Eg2x)il=b>}32h*cxcb zW>+@<;PT_ zRs#;TpP4*<6UMW}x?5Cd)nmI7;mH-KHh zLEtAK`A4(|7zjUIN8w)uYzFoLXMn{3T{$OGnSMZP;MC8l%zj`8unBk)SO(ky%mbza zL0~vA5MY6BKq-}n+Y~tUQz~-^*ad6`)&Y+K_X4*9Gl3vb45&aCpbX_}fk%N^z#`yz zU^B1-*asX3c72P!0_%XhBdN?vxc34Jfa$;lU?h+M^a0ufXOQn0un*V)tOwQt4*>Ik z89)UfzHTYeCeJbNxn$Ea31R+d}V_c5_Ce+}M$Ng8`^eE$6QpdPf zUW@x5U|c@|L%(EPCl4{MS^Mn!teL^MV%IUQ5i=QA$2%F|3?D*+4OD+7@IPo=(pW;LCr#bc032yRJFv;;# zJ*keL@;7q)bgvok4{*xT4_%O-f+>!l$~JcVRJMuZr?S_PA1>t??)WLs2>3@k@gp5S z#a{(K>)fk@bn@JQXG(qw(g!}tPwjC# zd8j?3;g_8JtsOrF=ORDFQ~o*d3>yiqjwyII8(@HAh&u>;?4->{TnwlJMgxNZ7NBxe{#p1}0n41Yyi|Oy0_X*_ z22LaXJK$4br;{gs-wlmX9#{iB3Q(PQz^w(w0Yy%n4!7fZaq&8+4E6c{>4nGlA70cT zy3er-FeU&M=y)McE&vCcp+CU01oUee-1$HSK>3a}M;_o~fWmaq_)#4BcV2{k1GfS< z0963RH*eXw zxX-#6&lwm8WC6W^<^bhCzx?7>Xg5Ipz5y=vmGWg>g1G^71eybkbk zFr_VP-N;34qOq9||5RWcKxr>JY2H zCqCEW&t)0n?*L{2wZJ%_2+#qlH{M2CALooI=s>)##C-0a7_T1Z^##w2=IAk`eF|&` zHUU(Q`bKVEbu^X{o=W7Nd3#fe>(R|At|70bxMss8{|+GU^%Pg-8!4^~U=DCU!V27- zzyoilxK;tL03QHf1D9+`aeWG81I2HpxNZfeZcA~k2EN&z;^N*-aZLkW+>zq?0&d&) zQ(T!qHE=ud9PkN{v@6Bc69@qdfF-~(U?%RL$dCPZ`?u`=U)P@Fds19SKTdJg00aMl zX91J~BY`jWVyr$%aruCof!l!Bf!)BTK$lNbToUjF>R7rj#TEMo;}1*(RsivFN=i;` z>T(a9)u>VGU-IFU_hqF2D?a=H(kb7+;=|poaS9K7_>C8*x;|=*-*h~W4}Tc(RL5WO z;n$&jyxjt1krE&kai`(N!i?)KUl2_8{DCzwH_W_KwRM(ZjRRGB+ zG%hc&sjf4?H=G^!&;ZC6Kv%@|2WVV^a1+O+RKssOLOv`FK)2gsE1Hh08ixx)N$pfzO_2lq zYSX50n&KY?nO;nYsbhlp*PCi$dWGtOLECGE=?|3IXD_@7-}(f||0>+q0XxGn*jSiN zGn0za;m$gHc2Ih5v?vlT4@9HkNKU{XtBVARB7tZi6hnq9vx^I|^91_Tas3tO%d#v& zkvdF)nt(eHiG(9=?16cOB_(#~qGm`h$t@U^5M;6n^V4$+8e)n)EH7WwtiQW1b z+_A8`I#eC2_6Mt{2i#Qwf2~ywL;1XvFBFcs1EFx;_$qg_)?XfQSK_|G@RaI=g8o=_ zIMh(i^OxnKv5J3DPNH(P7z+2~>PW24A9PpNh03XJcR8lJbpvXb_?PvM4Tl0#t78NF zF>>57>SBGnIEBhJ^gCP|K*ixuG>mbm2u!XnPsr*M*r)11AcSu@Oh z>XeG<%joeQhWwb-b)ku&@RX2guc!N0f?fcF0^ESG5G^32Ebv8V1Z2s zvI6CSnzBHI+FcNyT<Cu^8eHSzg?S>Ss_d)ybePss{+6+%&3#%2QbeWtbA84;4tD`Xbeque7Qz z5_RH61S&!SCs0~v`|`sfE48G~as4qW%b*;C{0#Cj$b;Wv4KZBTp#|v$&_#63Eg(Wn zF3G1{*Agopd5{$)P!Q!&4O)bBv<*!}OVMDo8_h>A&>8dzT|*D4qqtHJlQeH%`=Qsw zH_;f^Hw|&KpaOKC z|67NS(!e+8V*jWA$|7B8sT`;S9GQ%7sU#vP~S}af+ z9#LHp$gBcgTA!2~&C19uL9G>(lsy#(UM-5830A8|5@>UNxS}o?80-&K1OwoCHYep_ z?{KySgiXpr3{ZMS1=yY_!#oS>6bQsOj@3!I^-Rh6&8wrb!vm2h`j8E3KMZs`7>NC$ zd%Ke34K5AW_k!t2rSrlVhCptpGK{v=P)uoc`NYgHwl9XcD``+LT;>lB3(+19EteB6 z0fWRaw>lwIfwWht*O^6B6Y~m2WjNTVip+3Dpa^>rGuz3V9z;#dd?!TxY~bwD;dEqI62tpq+IgkK~@d)t~oES6gnpR*TMj;xDgr_b z1F=YTIog<#T#P5{j|Q?bnct~(a91)}5&x8&aCu$SYQ|GmxHK>|md>oJ_m5yEp}m#C zcw;l2+B3sJv@V%Rub6<{yJ2`}2A{V2Z?)eVq06oQ_-lzbXP6r>zLicNXx=i+%UC@X zMSk=L+Aby|FupqEge1CKkw1cw#H)2AsU;Rnj`u1vUiZj`XX8AJTat%`BB&9=5y=et zqfy*%q%&p~1C$>K)iJllpScy9kz5+_mrra+W*SpFvch#>f-{4d;H3~87^W4)UKyBH z62s^)KPD9?-iICqb0Q(Gy0$Frk5uFkJBlG@3aIq3T5B4N2MxKzsm;oj=bsj?i!u9> zFo3a!nXxS?KRSMdzdD9mtd&?B3>214z#NV;1E}xT<0N|$>UN6RZB-dG9K%=|E-A;d z!Tp*g+rHAUodWGWmC6c^&x}Qaxmh?^jdhq=RUNEg?oPTAYlUixFvWBq+soXUYLZqcrU@I1O-@Z52l?5_@z>;e83JqSl>{Oy5c znB&emv%^_n`5ESeq(TTI4VjvN2Sfx`SEw$XnUriV3`{93cT9<>O}e^T?TpuK*Yqrt zT~iyI)=(7_u-0)Vrelm5?93rMv>-lz>>yK_G?+-dm2+50c5$4CEI6NwxI;Lu^KMti}&%AS>P?Op$!YUlInj%81lO!G`D494QE(XVI8V1G-zY z#uECl4x^yX`QZ3V!$b*gNXn}Y!Ot*{VkQTtjmKvB6xKv}%pV$$hq{!>o@%wWunzrv zm)f3z-GfLA>`yjjEAnGxA|dDg>ywJHxl~vb3)J1BeOb8~^*ixMCOe4d7!5ENGw4%B z5HuxBEu=BQ&9DS4$|>+8n1>SXK7tATX|8mvYiC5AcI~iRiG4YMqmSp*oITa5JDmys zY5WMr+Ht8R4rNYf)?hR&jY0f@;#^uT@e)xC63soUr-f9X{fI$1#!{#xhJ7>s)Z?>} zG8f~qcVaTbHDwrj3NTHGo`s@B!)ZH=1~9j<%`)Ab@rytEL0P%ZM17knq+LC(&0zLZ zcvz@Gzrp;#6bB}UCkC*GjL(XMF>``UR=6SbPo&#aw;>MN0jK^#Cby=>*^)9b*D)fn zZzB#vjh5GjqqucAE*$u4OQV3&OGL%4xaz*|0qSu~u4K z7{%QDe5W-}*dtC%N}vLgRwO`DJj1L_jL!|#$J^s??XW}#)1zP{0v4IwW>KVYO%2#J zn)&GrK7L=%V=>G_NrRymviX+3S$>UYcC$ zC^4YwvQ%GqH_F*_X{(G!F1PMb9I)^4h!wJVulCd`(gawF1cv!Mc?4M60QG|@wr5v` z&2nOvP}t@|DZK!M6Ky(`aKBPZQIlH%8*FlEFp6gg?hR7$athfuXC5KH)p5|^bME~p zrO+T*WojtZzO} z?MFF|CUGF=LEir}uBo|6E~zNV_3Ef3mp&%R)ut>7y09cy`c$|xlU#FdNOGmzmE>A} zZ<6cHza_ag-kZj$Q+!0k$M)$K-}eMzq84kfuB zJCfvzexKwT@pF>v-qT60nJLMxSDPfep1CyH#kNUyP3f5IDs(5iDy~d+tpHjNO?CxJ zl3nis14bpgI$VQ%70Irp)yb}Hkz`lbDao#{fo|8K-0Wmm^Ba?0(!yld)CZDXU#w1c z^?DlRUQTv3*_iB#y_W3y{q`Qk2dNSDs3Bc90S&C~- zYuNEFPjQVlQ(V!U6xa7dQd~Jh5jP^m)&J@g*U)mWaP`*VThtK{%c#?q)!zi}_4D zQ8BoHfV+Ezr3r@CmFz#t$8$S%ob zN`_@H+0Z{`LJ5~$n!%J@RlpRaU&&-;ihuy{0LNtIWkbJ@nO=yz#VC)}F}##v^571J zn}PZ=vh$eq%qyAff}u=yVJYex$&?TZ2Qvl3@}OJB*^=_^e^TsBrH9K{k^O% zMhX6Ch@*B@I%C(>Ul$9*Brz;2hl%^Mr`DoDI1l8cmB5YwLri@b7NP!$eXY-j-O@cV zFpcgXkE`*MKE5HGIL`4rDAMpu>I9}M4Jzu2_Q%jsUF89Wg*(>r$J6M^#E=$cx>kqE zgLPma6Vu_3g~t?PS@&tm>Ky{_< zQkimy{Nzrtn?>bNtcoG)0zGV4T)^j8^-(cOr|vTG%HtJxb#81GM!qSK3aMf%Gr3^c zE5K34sz|bA7^;k(S6Xc(P(SWgKEz?HVE(f1Yvpmqj>WTs&fAVPJZ+vLaYpQdSOz&4OOrk$SRI>gSJsdj@&D09dpjY1CHmuW|5cajil03r_dg4w+mu&#&=Kyx z!oRAwHOl@OQW5{Z66d#p>ZZ6qyEn!Cue^8sUWskMEtoQz6PV=H<<^>T$A~S)h4oQy z<)v^uK2E!t)aM|)=}?kuG9L#y`o$99)0@uPaB}>hUptPX2wh>t!I~Uw3lAtn`!7K z;(PS%-)BI#?!9_nea*Efs-|^i$}+-*bW$p4vBc&6nqXRue>{yo(bpPl&n(7)gUDpi zgAue-yL(xrga*o;=Pv_MrXvpL=ZU94dkDi~q{5v&sSXl4b&G*;fQ^^RBh5|vD0h6D zY_I`O1#yj%?mo(7)Kv##{i{PDW7yE?#!;(ej>D@{rI{eRpxP04!ln(4Xap5B5Ip3= z*isymm3?JFQAugstq4pE)zVYQ0RID&g+XQ0GcvQX!86&ezpNZ|k=mb8nB&d{a)uRT zmgW`~xQhyN3re$#-6ez5i?h*|!u+D#yli)2er_q{FDfp~%+4BCoLyf6lKWufK-#c^ z(%d|_*|4OJfH}1g^3w3!Z2ZNUjl#mbjPzorG#$L&;OuOwtT?-#D2WO{eWrP14R9rZ$2;rQ&VpvFFl!h!IIpmfs$zzq%j8-e&q>duw&a#(=jV>fW^yrR*(0+v zhm~f7S1q9=@SB6I0_mBV*+po7etJ>ExFFqmE+JT4tWA9wrW`csv<)#0`b_INllsA$ zN98sCi2;6wGAK3X2c#fO;5&a>MU05sPUe2F&56pvEI>JNW*1 zoHdQ1O9jJHS#3$TMUm>7f1Lwus;y<>ywZRHS18@Hg=;58qOrQkQ>IRvZqN5YgL8*mnU`NsSTwY_ zq;%Nu5hJe}#d5qLN*=GQP~HEfDp0Q5z|lQ)v+K3jU46}8Hv;*38U3iQ^>YGhn)om= zp-?6cuHfKK{aAvoKtD+9{hZN-Eg@FruIFb%P;^=4P(RJF`pgJJdsTrL%iv-0yND~S zEr%*J%9KY*G3)Fjh_}QCxS1s-d?JA0cj6Re1z&CNZ)hK#HexCx;Tnp^M8#1s znx&XORRJqP3tbPu~=NH`* zD;n0+VB$1lSl9;8K1d>Xw+Wzkn|cBCju4&sqcpGqkTU{gGNimD_EI0?QRKH+9JpX3 zA~2VM6e2IeHI~iX_Q#7-Jh3L^lBhy%8Sxh|!1)oZ4?BJ^7-7heFv{Rcyg|Hjt1_e| zR$}=Pmsq&c3#*Pj22A#35)!fBSa$I!Grq1`EDu&QRsQJ206N&eKWul`VNBrKYrtMd zerL|c+v-Oh;1+_k*lEI+49d^5S%uQ9#DOjvT$C7Oil%{IYFPfv@C=yWAaf^X8UmHe z`LTmbQ9p!CYt36Xf>EYkLdQFYSfde3i;s8BrjE2}mctzAy3TZ=F|_W4yfJW4G0e$7 z%zQ^?v@&4EVItegiG+A-Y-`gnf&Dm6kw&Yt&XEtNf)%T+s%0kNM##oYKtG5;)S}N6 zo?I3se$nrSpC@X5~Vs5PS8lnTt)tOo8rRi7WIo2}z74%f_ zT>6`g?xQ=P&Z^pYcWfGIttjw+2@}7_A1%jezWSJ=gdVvoELAGjdo)gyEm~F`3enVL zCRR^na^k$3HQq$4pwX~(FP4rZSdGTvLcM>udqP}AAXr@k-99OX6Z4+4rv}N`jB8-F zrM_SWT1I$V4iypKt32#1uxRgo?%V-|?jG)_WdLzQT&RXbQf(1q@U5UP{oK8*^P;_x z3%2g61mcIfY;iVD&Z11P&X2LZ8e?CJgACy5{V`a4L8oCPBzg!_nIB_exnvEecG7c% zk;wAHoC<1!=NpKWfv>2cV3`wV?+fwVY4u`Cd;(Fq^YS=M33LjMWu<$Tdvtuw*H>Ur zo#+F~C&XFLBOzSh%7(ZQi03)ap=4T3SvZJ?Zwp` zK`x4c=LVaboyFvUGljzxfi)%9E<;*0)M-B>*a|U85`+V)yMBJb@9=Ju!TFQ1-I|L| zS?ftsM4}Xu$N`wD#PYx)k$s|?UlF_Ma0`c(=P5uH2B%^ zI16P@M%$0R)Rj5xiyhw(Mw-pnSP70l9ybURx0Vu|cq>fzxB^P5D;y^FiU5r5;9?Pn zT>|mdmEoQhv)1of-83wsj0?xgRXB6(+_58&I&khO%0EUN??_6SGuL01$8S zC)S2+?b9&fhH2=C*4xC@k+n;(|Izq_Yw2mDoZn`)Ar@Nu5$R|nA&>(Ib#Z1tmxTB8 z;;Qx&8b1w_M6c9@K*q0<^{_f(5Zuh~Tks zmKns17BlFtKLW-J$E&S=mSb-Q&l0Y!vgPecgsGuZ{1F(V$J=EQP9tKE->_R?gQlM=cYTl8M4b#SalMho3~2QzCa0f2xD&L#$Fzar$A@mwvJj`d5B*b zVYh>-V=PlDd~R&8@q1!lvC{fEF=VE5V>2ZF284!waf2zZR9Mytrhtox1`Fr(k-E?U>_V^p7RLJ@*;W5+@g96J^+?Thf>iqH zI50@yWn#AKEX!e2T+gyTXM2bSmX8;SdOEzY0&%PK>#NKa;acCq_czrWjU?H}Kv zEz^m$eKW3Rcrp3!x zarL{WT@kd67J+l3nYI|;c0dOpuKR5d|0=w{IcaEQ$_OlgNL`tAKHsp(E;Ab9L*-#j*7_v$`Z%p}cScWCi?jG4i7={asJttpa+Kucinz?Ova z5FTiY!Wx2d4L*>6%kEJIPLSk1h;p#6L9~P)!mOpt0&{~Cf|R$qiUdg9lezlZUJgHN z)9)x|NO=`Bd|*nErG78B?I-qLO!5ESm+QO+P&gi!3O^wp7kA@vr1$^N;IHbT`p5?G zzXS0$$J>&O`_e`3{|+SHKR&)z1OENz|Jo6V;w`iw*cYNRAy{9db=U;q2aT|JC`;EC z-zVZsqb2(#QfSbY0JKopjp`Z8KgmP;3iv|sUso{ET8rhg_tYyLRjXS(FD#rF=Fbar zOv%u^K1DFc(gQ5YgC-X)$pm0M0&Zv1q%@KSz~?z~6+&rc-~jNx#6+;o^_#Gj&q}e* zC!|3e=C{uQSUf215)9L+LWeh?YQmx5v@~1FC{52Q5fYS!F@Hr=K;E>pG=?M%yhsRA zPJ#x<#BiWA&LmftX67XnV@j`V2%VS2#L9!Dw7F&c=z?YM7?u;jB8FH^&Y7xdYbU+KNicEvyNQw{%j(5rzU&tUbz> zQxWqgVr)Yi9e_wXFF(d1Ek2Z#wX zOWJr53}+>DG>LJ-pTzNh636{9&Up~FDuC{nP_L6lQp=yF+mdJ|Nus3Vvh-YzrtLgF z8KTrgTYKKH46#-mIlq)r>E6(zR0qS5tw_&Isv}D)jWq>5D=DEW!JWZx=>;gi<&REe zCg6n>3MUqd7ob~HTD%bCA1hprX4AwWmt-G{hjbc{=E%vzNVPt~J^_X2W7|qC1|DsX zhl^|>gE~+jmmmpDuCmWI#g#ha10hnZSTZJ=mSX4=2D%o?8H>LpZVoy#%LI!m87nCg+#PR^n~0vsRtM-Ac@0&9Smf&7xJ?BRI#0s0iX`DiPSP}v{NfPX+A_sF7rcb@@{AI>>f z-Myf_z-?3QZ(`85GN#N=buI7P$O5FfKm6+jYmoi#k7<9584Q`_U;VoQ@0^|g@7(;e znTCH!%zy4*VhwYchJVSBF#a?D;^p1vjMo310isQ50J#r*k?Oh?pplqA$o^gt`Ty*C z@x1h%=Y^M@7yh$4{@;qrM8$;v?(6>xZAcu0U!F^K{TWCupL!7A+JTz~_X4w7UgXOkn*)LKx?!K&>WyT$fY=PY28v9-7}s>^-@`KTLM%s zEendHbxmuUK=D@q6i@A@aJmyFdPd0lt$e-%LY2CHSI*T8iHwE)qA z2taM6eo+2d0JV9x2m=}zX728+zIpsmO9~w;Zl1Z1?YZ{0hI3rfZDeMp!7We zrMJbP(D+~+H&K|b%i*W-rE5uo|2Ft(?C4sU;J-b=e@B8JZL80}D8YYMf}frzJr|;b z)L;589319RB#fIgZO#=Gz_s#o+kJS2?aqE^Kaogg;LKT;y9)VVdt~n;Zaeu8e`lYu zqXs(ebN|Ww=}!LVk^jBr2bZ^JzFK~G`PF}2|ICN25<@YdL-&r^>t@F8ov@exWBw05 z-nai($nrDombpDPovu2R>Z$<70i%JDKq*iJ3g$0m=^2hL-Cv?8|f95L6`kyP`(Ti_w0@Q~1ej9I3Vwn7$kU(C;Iv)rE=UmH@ z2iAwTHfr#nYFh6f_(1b|f6?nL>;2t+Y8Cg-T5@ljxZk~DV>{cQ`s&*q7K-G5`1|cU zI&A)+V4(Zh(&uXXu6p9l2df9}yyo}rU$tLY*zVi811Bxnb9ZKoMz{5TYU#jVUtN~< z{p?n^&z|$rz*qH;R=#&OxAWA^9}Em{*?;Rdv)&%G{;pN&8*ZF9tfz9@FSYw;WNi3s z;l5uV{O#MBtA}Pjd}#8Q+mH7iaKr2#S-o7Btv>mr>&rLaIF%Cmt}))cM!RL{ zqETnBS$XVX_omVnw|f2W|9;D;TR!f7&CS1lGJf^lCx7hu>hi7Ed^RhT_xAnwxECZB zk9(tg9s0|>yZv3~moR_xO){G8d8C&9ob-*V&^|A`?VeDpxj*|}|Da!>-GPypz3~1I zzMU<*-Y}@cpfztkcGNd;<@43Sry9NDo%gLzFg9dN|LUW~ukQZZxB2(qcld9(c*^$2 z5Bdh=UHwJ=8ygqjedul9qBlykx~z9wZ@lj*-@ftd7c1FMbb9)|#lCJ`w;b58UgP|? zO!xVRUG>_`r%PtEdU>pG&(Q(5HQu=B#!G+8@^$mA_(oaL^T_q9`uMI}^YFn96*F>n zem2Z3zqaxAuBB7vp1pInapx(u-SqPAncSu|`V}|7FV7it&x_3Od$dpIk8IlE>BC>n zTbZJ5xgk5F$@71!^L~=13X?kS>iP+PH202C%F3HIZW^(7#hjJPpW_cyt-JWK;)k-X zdcoDNd+x#h9e|#rV1|;= zrWkTnBYym!)D*Jvu#AYeC>20t%B=S(%fJ;TL8=ZjHQ?ju9@EexKSBYk{sOqvDmT8* z5@sq;chtJK8#(QiDm-(XRk!X;Eu(Ld`mv{m(VFpA9W$A}xJSHqStv*Osjao=^rhra zYRO{q@XyWk2mC+@>a9cBa@69+v#3BVbXV%NyS^VZIygs$6uSC=GiV zqTrv5zVUb#EZX44Q<;Xpe>LjRaWXA%uR^D8>NmA7KDHFHpWGkYnTE17miWB{tB*yf zgPv#|#xj=BL*o0-f11Q2(HNdv=KPUN97h_=OHl@N0sXP)0?H@Bhs$y7K*L|~7Y%{G z@)40CkdQ&3^_tQYb>0hrDkPnRAOti4QUD4wgsFfGv;~m=FD~M7{_?`_>7B(7?pZhn z_ZWUV^JEk#KYR9cij7Th_XEd(lTO?jxMvA-f!BdA0jlhem))#n43Qh_ibgE{OBa99 z;Qx+j5O{h79f>TuZU0yke%5}E^D*@e^|YF2%r+i0&qz^PjB9PH^}XlY?fcAk(D$wHxbIiG z&n){s4BLcl!CuOCWc#zs9k$H8L;HuepBUn0cAF2eSsb&;_MfG)J8ge!_GO;gZ`U(l zzg@pyf77>}(vR7^@F~w3PqMeMx0$zvx0Sbzx4pNMw~M!jw~sf?%X>Xu)oXe)ygA+> z-U4s2cerPSncg|xdEN!yh2BNpCEokIOTEjzE4{0|PkPsR zpZBi!ZuD;UZt-sO?(pvN?)L8W?(-h-9`YXX9`zpgp75UXp7AEjjpb%?3%QltMs6>6 zlDo(~4bDjIwK`}8he^~T6kJ{+IZS~I(fQydU*PH(mcG!<54}PC&QED8R9AM z6nlnyMtR0~$~={x37(KA;+gE3?wRSCvF3)byUe7+y0nZ`N5zkT2anA|Q|4C1!SRO8qlE=tpa-}>$4#^RD zvOHa$DbJDT$qVF#@*;VOe4o5jUM{bcSIbYz>*VL<_3}n}v%E##Chw4U$-Cvf@;>>1 zd`LbbAC-^GC*)J|897;LtTaN_(Y~(naZ^^ik3jUhycZVk#L*jxt0kP>Pk| z$|z-wQl?ZY6O@n=Q6?+Xm6^&MWuCG?S*R>hmMHfrOO@ryN@cb3q_R$VURkefR5mMH zlx@lmWtXyB*{keR4k(9|Bg#?bxN<@{rJPZc)y8TwwT0SBZKJkVJE>jN9%>&oP32XO zs;Z`%q2{PV)B?3w9j=a2$Eam$r8+?ksS$OuI$fQq&Qa&73)F?`B6W#+pSo0CuC7#9 zt52%y)aTXp>PB_5x<%cl?ofBByVbqwKJ|clNIjw+RgbGD)KlsiHCbz{HPc#Xt+X~; zd##h!MeCvU(b60R_5dLKPa=XH;+>ZYEd=jcQ90=-xtu8-2k=w*7PK0y!Z z5q+{gU7xAX(dX$4^o9B&eTjabzEoeXuhduTPwMOR=k@jaMt!rsMc=0H(0A#(^}YH& z{eXT*KcXMikLxG&Q~DV_*=TGuGg=s}j5bDlqm$9a=wb9R(hT147^-0!8AgsV#3(R| zjp4>9V~kN|R2mbEkP$H^8`F)M#vEgwvA|epEHaiD_Zdr#<;F^5weh5}&UoHfZ)`L+ z8(WNR#tvhbvD?^d>@yA+hm0e}QRBFA!Z>A|F_O*3W;3&e*~)BVwl_POUCbV4A2ZG5 zO^>OXrkP>pm_y70v)CMNjxxuXWoD&0!3>!ZbFw+zoN3N6=a~!4h2|o2iFu#7)Ld?^ zG*_EXn(NHx&GqI+bF;a{+-B}DcbU7*z2-jifO*I~VjeY*n?;MnV&8DzDBl=g8FrTmzK}2Co9vtJn~6PU zo^OF~p>L6IiSIt_G|PP}eXD&>`qufL$9}WXx7oMFx6QZ1w+p+@Uf(|70pB6t5#Lel zJtuspeDrI^%)lfj3p`6Q+n8;J9jF!ChHcMwV!NBkW{$Iy;k{!_H$DunXBm>=NvlOWEb@N_I8-B)g7%o?XvwWH+;0 z*lp|%b{D&w-OKJ{53q;WBkWQ3ID3LU#hzi4xyD>Gt_9bMYs0nYI&odN9$X(TjpI2F zr*bBj!R2s6xB{-28_td5#&Bg^B{zW!aS?7ZH=Ucw&Ee*83%G^cB5nzHAGefS&aLED zb5C;XxaYa`+(vFQw}sor?cjECyScsGKJEZ_h&#d^<&JYFxKrF2E}3u4H{)CIt@t*4 zd%hFjh3~=l;nR4Y_wXuj@)>*%KZGyfi}~UFD1HoI##iza_z)lAC-c+!nfx4n9>0KJ z$S>lT@b~dc`Q`jdel`Cjzm9*NU(avkH}hNgZTt>?7r&d|%kSe4@Q3&#{89cme}X^7 zpW%~*#zHfph0sc9BeWMf30;I9LLVVb;02GM3Z{@D4i42cnOvN&CwDb5k+i3`Mq;v#X0c%Qfw+|){OwfLmCPJCWmFK!e! zi(ABP;tp|_xLe#S?h_A)hr}b|QSrD~Al)Txl6dc6?+EZ5G4DHGkNkJ}ZTUUy6E`S# zDBpor6&k~gYmA^#hZVoV7;26%$C?3iqB+T&VqRy?HE%X=H}5v@Hy<`1GoLV@F<&xY zHQzMfG2b`$n4g(nn%|iJG=DaKGn0Hxd>8pH@wM}H_I3C5^>IG0&+ujXa(#uqVZN(< ze&2X-Z&BYg-}Sy5eYg1T1poG+?-AeMeNXwG^SulX?k(TDz7Kr=@O|$43Ow8ozF&O5 z`|!y+$TDE>*$dc~;Nd#3SFk<7$7Qg&STV!cacm7ciTy!*!t<)tHA%1gZp{F`-1mV?=Rj( z@})|Raz<^ZvD#p>ocP_^BulnS!3s*liW!bM-jwgiKhC$r)7yp-KP9%1x=0>rh~$^* zq}!y2rRSu#rO%`vqzgTrJpy>0G2mMe;E0`F{B)Z6D}$W8-pzGdPPT4mYnh z$C=~J#pW|Ue9V$qZbo5i`0M!7!Uf_*;_cw3|AslRLhRrpWy*Y{zt4Wbes9fmmvAX& zcxTM-ucZ{+Rr8GSM8Qct>{;h|-SeS`^WG}|O@2^*N`6*;2|UD`maQVVSte2mKreb$7%`13iui?$|7J5f} z$AJ@`;+^50?VS%Ew=c$~k=`78C8zhqeuawHCNXQ^%wz9o*RpSd#{H8`<=WvnWN}x4 zPR-@+<(>c)+QWUvC4t8D<%fcTT+83VuK;~`kKfP#02*+K&`prA(kq3iFh#f->-jF> zUg05OtMHNV58+$k7}|D9ND?!ZtCgs7i}Hx_vhsoQt&*a4P=8fj+9gIeW3jQuc*FSA z_`$fqyxio>Y%`42@qoF^T!(eB5$ghCE@zSx~k?d>&del8^Co`FlXMI*R?V z;)Bxl;H#H|mwsL9;r*NUYxSh+);RDaH|X>ATlG8i#rnPa1Nt)kQGJ!ZMqjHxtG}pk z&^PIC=rfI5jN6Teu^T^btTkRR_8Z@$Jt^30TVkhWc9M1i?}%WQ_XBOs^P%@TZB7=yRmOPEW9SXCA=%_5jfE+4i-m>*MP#`A>IvI{)+gz z_%7)7*WzztbLnEKha`hC4F+YJAkBazb}J;Xr!ek&AzwA}wD$D%7@nb?D$iUC*;t}A#-Y8pLe_WeMpL*Ku%n2d}Z|V4fIX)eGO`A@g%Nf<^lBOLiP^sI{pU! zK~S*G{0A7nWZ^QQpOB6{aH22^EnY3WDtst>BQ(N(CUuJT5`C*=a|YHh4GNt>!&r`@34 zu05bFgCy`0%ENr;M2X}(wT9|mhQH_*i-B)8sHTM;aQZ3 zpL^HKAIS5SyOqBwk1K1H=OB~4rVN1|C7Dzy%mj7_IJpQow+FeWxi`6It#z}9{}k)x z5T5pL{G-xEmbQZRO3+gHpra^-7UF$NzwndyH!mYMf%c$Kjw!b*Yn18w-JnCS>p$u( zj1ER;>{l}0R?RY)S;^K}0>$DXM{|DgjuUa;Ra~ZU6=u@Y!U-`&Y9h6hI!RrnUeW+* zg!D63TMlH7Nk(V0pUFZJ7-Z&|L(P%2=I=WSX{N~QX?`X%UeORYOr_gHNfq_#DX(LRPmmJ0ccg|tD*whrMO1iBz`C! z78$9n)K40Sm0u;j?8)^8yzMNxRoBuXuU-jh^>?kael^z89Q{rG2TRUsZMK7a)fLj! z7e4$*A+s3w7=xz}=4NyAx!btK+}FZS!bzc-criH8%f(KhEmujCq?? zYU%NLia=9t14a4R(-E{J2V7&=JIi~o_wUd{-3!iOi}IQBlX9VYfhAM-(*#Y%Xg>u> z(B6fbn9a>g%o6M;6_DbtHD{SOnzv$4O18dDB8fx6*Q%fx*GNBlQoWaYJIMWH1DdI^ za;-dDen?&;ua$q1Ps>TrU0kG;s#DY@+GCJ;UxSqUGx(%M#zV#n#>$0?OSx3( zs9d6dWE?b38b?4Of5X#HAvGp*5u~-tpfT*qPGN6iAC{k%FS4{4tSUi!;e+ntW%V<4 zxwcZj$mnHc8m}3@7-iHRSBkY>`{T(j5g!pB6JG*{{<^qTd{4Z@TPa73>y5d_D&q;r z(Jw%XX51-EKNNeJyM=!T&*&oYGR(14k_%d}y`Hf5Htj8KBP7gkExMOtt?k|1w;aP? z3K`0WoxK_|(k=W0*m*WuyiT1kU$|drA$OKpIbAN6+d$V7hA!nL=t|CNt@V-m_0T6g zr|;CiwKz}FxDvAeG$RMkZ3OuKTC)x``3LIDz!Zy@sKPj2W9jB*d2WPG?sjP8Mk#yL zgX&>xUN_b*(k_60gVhVMpSLnbLUVAx@v8AIq>0XurEl}S2|hl>nge%%FMJ&`>aVPe zW5M*MgZhr-u7S*14chx8_Zs(%=MB$|mM(Oa_bKnQ-j|{M{J^`%J3&3Gs+etATCP^4 zJ*&O0Er%2`3356!&K~p5>;T9G{rPl00Dk#SUK0ijd64JIg({&&hzT!9k3nmMe$}Q} z`^*?=q7=s7H6PsiV(A&_MeuKLo4b5_e4qNh@Er#KodSCccqvw32SX}9$hG6!ixQ~s zB=J`4+FQjh#WP}m>0aQ(ufodMD8DXm zmEV;=lz+!PS}1O%JM?)2pv~K?Jr7#&5B)p+tR6ORFh4Pmp~m*U0lqBXRnTb6_1y~{ z`Bv!0kNcQqDVBAl3EP(K4ei5~=vPndQ!+FFg2cf-LLKPQ%aAC)z&>9hxxFGJ zqLuOpXbG=Z?pK~s-ci0(ep4<{`>L7h)oN6|1*_pb(BD)|*DAE8deoR@+yE}_eq$MA z$~8u+k6D{ySz`up_Xv*)tAwk-wfcN-fL^6AYtipUY+q@6DNlzqv<55eEy%s!W1s0FNszyWf@4}BJpw)T zc4c8rZ zjC3O(JoXysws=U93$Q1@#8+oU_CyQRN@gL+t6A^lx? z&2!N6ljk>2Q*TReXIK(8d)vxaK=b z+Dz-Mm4GjK9~#J8z`?$#zoWmef3AP8Ut;t#bR!QGbPZPK&qk7Im>Isid=L4a_A&eI zKIO80XqMKq-?Nu-zeAF0#9v@Z%$M@*!0#6GcY(t_mlyv68kPajPAn4d7he$%7CD75q`=#TDAhc+S~-0Amt0#VS_SFm!n%Ad(U$nCId zGL>=AJ>LYaGwn8el&_Ry%I``mwIB4uRqE}K?>|?+R=>A))KutqFV@;>owaVz=}ypU zp|!n9yI*_Q+5_zQ_AC1Y^ip4Q&7mt|yqy)Y%#)qz9%#}24r%fQ=+E9{x3eEWs{DdI z4DRs+`#XC%*AkrlMuB*)0ipo@R}+0=CU~za#X`v5{iGUbqGxLhje+JpKK!~WnURH3Tr=o~o)THlrO>&2BVVt~MZazVH+7eC4_47bkT4$u@Aeed(+iL_ zUsYaL-onay4^rnIEfH(2!ko{j2 z-WMi{Q^8gKU3?q!HCgHmt};)W2ATXetiZ>mwUCuxmHeS?_tz(;gHsAJ(`N z-rv0@Ce=K)VdZ9K}5n*RpfmQt$sM1d5L*)mhgPO0Fsw36W>NvFm z^FOH8!uGKVHrK7{cJ(q%(z3O2kYwj;cWZ04SF}%HfoKGaLw{HpM(S0Nt(SnyZECoU zp2h$}1kbJ;0q75iCa*P~HC{9}7@MHc*lM&g+nOE0RdoZcyW3oAzF=-JH<@pkUzis{ ziDnWI3;R}*a)HtsHZ3>yzYJxNGE|wUOjBlKb!~&rN>)oiD`u*% zsc(TMw$k#zGuLP{G`HT%lI?lW_7TQSW;*uwRO<}UmC&p|0}Z;5Ya(7KwiGV`57t5K zEOr%t6n_pQR+&JG;ZW>GR}5 z-o4sW4L!@Fo(-N)JtC~X*LlD4Hj}S}t?z0%06X7uSn{5O{_P#~>Qnh=?CHta(=Wj+ z@PHDu!|D#g5;jx)2zs`4+RLypeWU$TJBbzEOV7j_nS_9Tx9`uHqf>G*(SZiIs+7B%)X|&q*hx zRM>jEfYuwZ><;!k0$c5IkJsB?7O>uHVaZ$q4&p0WQU=4WxLSD{_QS2p$DneDU^Bc_ zy#l<1plZ-G4#j>pMja1J;AC}%dJ|~=K5#b2_2$OKn8!U}y-GJqV5^#BOfhCaXMH>7 z@;c)c<8|RsxiSfTH!U%(pK82hmRo@k_YEv$(PLFpdQzSf$<8rV%AY5WZ~ zvW}o*%-U2sV!(VOoE2JnI(pKW5+3EQR_U&Y^*E<$6;Uw>i z-VeQB;0!<#EdOmlTSm#%7~?yzpS}#c@H@~A9Ffn;jUYu`igi)|3vY!I#wwYs+zjfn z8~e+C?5$^%RB&(8)O*xb;NW&bQaugXt{v>7IcRewX!AVC(JP?i_!^Q!FG$eUkewgH z+}jR&;}LKbZlgOi6(;1TvqoFk@q)0_9WuXz1uhqw{tsap10TI9)zS~=uvPr^u+(&c zmT43$D(i%I1Q+P!@8YH4h{j5fcpmdS?s*FG=L_idtLXPz&~3fvneDybyT<#r_XzCD z{a`&_3L9uU@H3Aa&l&Fjv6gk=_&x(2-Fv)C~<2%A8own7K6 z6FRYvg-?b3!a=Ny@1Qj%$@;Xwh^b;zvAO6HTVwz0h#jDt*b9AQMG?DzE)Ep4p!3TU zi^NiB{zi-AM3>xF?kKzEZgMY3!J=gs7-;PiMRKV;QXVZ=VC4j{c4G2Wc?PKBd_3R9 zpo|a5k6IGJTKPq1FWD}Oimd3+;ty8xlp>{68L5m0Csm;Ym0BgH%z_+pE9^asm3x&3 zlt-0S(C9p?ya-MI8(4+gvDbVI%DErf{$t8X<+Q@6P1WYAOKq)oRNZPfwHNp=R+Uv< z9jFe5ma53wl^XV>7*^^m^#*mmdaHVedawF`x(use6|4o%sxLbG)lT(8OB=G^k{iEM zf5Kc#)tYK9tu=VKZdxy`AFM4RGzvOoyuqN`MVN!5vA3w_0oHQEe5p zJ8K~YzNl@`HfdY6?b=T5Luh;UYX`OOpwDIWrm!Kn^wxS?-Hp}O3(~0w{jRPL)U))# z;4@0GLyp$RVV4Z*wR%jS3Z7$@e#3d%_qgtzH1AvgM|;-?tws|Wslr4}p_JzE1s-wvQ|;A39g#VBa4F8}qI`A5wB3}UO`U|_ zlGd5u*j|g5D9sPIuQ}6XbAN2{Dz?VK_vVDEkfxc;jO-^%$vz%iK``!gEGI5E^@X(yU7(&zGMx+@2K z3%wA}G+f-kODRbyN`sXa@z?YvDkFn(r~<`aqdL;41~riqw%{eVsY6}rk&Aq4Kttf< z7&+C1rZl5De2E40z!JE*rVVXr2UW1A10Cr^OR<6ry%pxSWcY(B>^g4n`RkiA(9$`w zkbeEkXYi1voq=OMT`8a&8Nw7vkrHW<5m}KF7I3W~if~mzHE#_xqh9IBKC8JG>tSBQxg29MC&0Im zSFUkhFF2!r_IH8auF=;|^z?*&UeHT)k`l%!s%45YsA3*nETK<5%1TS-WkD9fDN3>o z74OIjm_-dP<*RJSru;5j@GHYit1Elbm3=voLn!^Rd`G%9l{4_Kk0_5?$`zQ{2F}tB u-sVYq(AZ~rkv^1mAaBsx)92YU9wWZu3d9wND-c&8u0ULYxB~xu1%3kC8Column Editor..."). +3. Fixed "To UPPER/lower case" bug in column mode. +4. Fix the display bug in User language define dialog. +5. Add new feature which backups files in a user specific directory. + + +Plugins included in v4.2 : + +1. TexFX v0.24a +2. Function list v1.2 +3. ConvertExt v1.1 +4. NppExec v0.2 beta 3 +5. Spell checker v1.1 +6. Quick text v0.02 +7. Explorer v1.4 +8. Hex editor v0.84 + diff --git a/PowerEditor/bin/config.xml b/PowerEditor/bin/config.xml new file mode 100644 index 00000000..35111dbe --- /dev/null +++ b/PowerEditor/bin/config.xml @@ -0,0 +1,77 @@ + + + + + standard + + show + + + + vertical + + hide + + + + + + + + yes + no + no + yes + + + + + + + + yes + no + + + + + + + diff --git a/PowerEditor/bin/contextMenu.xml b/PowerEditor/bin/contextMenu.xml new file mode 100644 index 00000000..2d42b4b6 --- /dev/null +++ b/PowerEditor/bin/contextMenu.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/bin/doLocalConf.xml b/PowerEditor/bin/doLocalConf.xml new file mode 100644 index 00000000..e69de29b diff --git a/PowerEditor/bin/insertExt.ini b/PowerEditor/bin/insertExt.ini new file mode 100644 index 00000000..2eeee4f8 --- /dev/null +++ b/PowerEditor/bin/insertExt.ini @@ -0,0 +1,6 @@ +[Function List] +Show all functions=0 +Sort by names=0 +showCmd=0 +[User Languages] +Count User Languages=0 diff --git a/PowerEditor/bin/langs.xml b/PowerEditor/bin/langs.xml new file mode 100644 index 00000000..2aa5e7ad --- /dev/null +++ b/PowerEditor/bin/langs.xml @@ -0,0 +1,247 @@ + + + + + + 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 + + + + 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 + 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 $ @ \ & < > # { } + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + !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 compact content coords data datafld dataformatas datapagesize datasrc datetime dd declare defer del dfn dir disabled div dl dt em 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 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 + + + + 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 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 + + + + 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 + + + + 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 + + + + 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 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 + + + + 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 + + + + rem set if else exist errorlevel for in do break call 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 + + + + + + + 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 + + + + + + + + + + + + + + + + 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 + + + + 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 + + + + 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 + + + + + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + + - * / = < > <= >= => 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? + + + + __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 + + + + $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 + + + 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 + + + + + ifTrue: ifFalse: whileTrue: whileFalse: ifNil: ifNotNil: whileTrue whileFalse repeat isNil notNil + + + + ? 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 + + + + 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 + + + + + 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 + + + + 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 + + + + 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 + + + + + break case catch continue else elseif end for function global if otherwise persistent return switch try while + + + + 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 _ + + + + 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 + + + + + + + + + + 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 + + + + + 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/md5summer.exe b/PowerEditor/bin/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/bin/nppIExplorerShell.exe b/PowerEditor/bin/nppIExplorerShell.exe new file mode 100644 index 0000000000000000000000000000000000000000..d14630ea735d46d2b857fbd2d26e08a649995087 GIT binary patch literal 6656 zcmeHLeQZowpEntip0IJGZ3YZ$F_5ZjV!1U6mE-q!~7rp;< zN@sij=`OFY&m4|~jzru6bB{Y13<>7Lyg4EU&Ay;{%hw&|K*+;4E?M$;UD34N%9u@O zU>gR!mXfz|R;^#G)3-7cI8OrfSkE$GqRjwW9gV@Kb?X3xwPr^T;@nwn8ictZOA4fe zRzwAYW9(H*z!%&a1-@T^PtQ_xv><|qL12t_2%koeTX17M0MKGb%&dlp*~T%JZam!A zN1QNqP1HTw21w3VFsQ}ML56%%j>{ScxiWHo_&=P1z0%!iu6|@ooxxz{SlpVIw$z!D zW{gLyd5U|)P{%-lT@|;^02!6#OBj=K&P-fb!!&(kvI!!ww6JfO!ywsWAxhjIof#Ka zMbl=h3-B7S}iEni#Ta>+R(TaC?Ql9+FvmYK}jzl%Ly{qj4IXpdvqccgtGkg!y`DT{g8 zIRhtG42<$ZR*;0nK*~qxqcb{T6=MBOky&&Uzw``As-wS9(XwxoDjiHE)nTY+ZztZ- zc(Z1WWcKBv*(YM@>cMY89ZEEjJy&K$lXOBdHZA-}Y55YShotHD@6oc)whs|HGtmy^ z_*+nA#q|{8hrMwVa_7t|uaU2uLAn1J96$K0swx{FpgT|Gy~j}_Dz!05y8#13QY${P z-Glr{8RZg0q!o3F05h}ohkc4mt*uApl~Y)Rlxt3-Ow)z^fqDJxy!VlL6bBVmYqvmM z+gZovtlwCgZ!OLz9yZu_PMkq9ikySEa`>>@vu<4@-_NrKzgGzO&G0?n<})y#f&bSG zG_p{b57KS0uiFv-<)8kdswZ;{XI}i3DV%}vpHG3~r3a^NOi-Ua70eOCnJ!3|82jc0_ZY=$%QW8fUKZ2~JjJHMFHn-1<|x`07F6 z2#<{ko2uVh&}Ob4`~lS47F7?DnYL9zf16q8ZCfPN45kHBhbAL*gEkDN#YxQVz<4Xp zWOAx}0w=IGZT&ze)K$N|_oj5P&WH=Ts&x60%M9)a*_n^#OxH3OaRspKt->`^v_1oi zQ`y%wYL)O9{7hxPPgFKhE-~T4(f{!5rUByZmUkK*va?DSO&f3Zndjc8vc({Ms=FfV zqL+<2{l;67KOT4yFORwR!*VPY*CXC6bg?!8BQ_xA$J$Nf%*?ukzp>k84A9Y>F=&cXDkPhRx~N4dK0u#6=jKeDEbyQv7o^mC)|fWEZ?ick#e5 z(EaJWKo_gDgt*z45{U-e_RZTmI`(aNw!zxj;Mif?(Xg$nb5Fz0?Yp*tNjuzbPc|WV z)vm>oT{0Uy<-0j8-Mv6RI`aGEZyWEwhO1THYeWe~SSz?AoFTCi3FM5Uh$cx{ls4DM zwF3Mn!?d*BD(jRaVwA0V!i0R}6;pigPKsYICZw^h(9D(J2Xy0e0|RnS}oZK|NBxViBdD&|=QT~$FFE9jXD zdy^G(zJfk9M<3^nbK;v*4^MSE4LBTa)M%^?=DYuz42&-0*zWDG8 z|14axS;C(sGtc{CGT`NA{nU3bHVJyDj3wq-iCLjl3n`br67&iepfF0lggaIc2gMb9!G~g$IHvlQXRlq2q)IKa5=gP+a z8SAikJQg7oK-^Jg?e_`xNT`R`{=gk#TYbUeWAg=x z#n$S;+ZpnRetxUZ&le>bTQ|$^gt(uCyNTxz+z~+xZx8l{NPkH0;DxIG{Lbne5Uh`<)=-T1e> zpkJ@=jqtE~Kp$}X{h=PRd0gM;I}&vJX*{6s6Cyos&DVFB!^`{q)_%T66p#Qfv%3ZF z9zGB{rX|Y}=6fgyjQf0e-nwU()wbc;Mvq_fQv;oU6#{+7dLlx>Qa$WAI;}P`y~So@ SZ5nOcXR&YBXsqnt+WrQ=jL!xD literal 0 HcmV?d00001 diff --git a/PowerEditor/bin/nppcm.dll b/PowerEditor/bin/nppcm.dll new file mode 100644 index 0000000000000000000000000000000000000000..eea8387e8b2ab7affa9e19c519d98aff2e88b1c6 GIT binary patch literal 24576 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 NfQEpEz@Iq+{|&Rzk^=w$ literal 0 HcmV?d00001 diff --git a/PowerEditor/bin/nppv42RC.zip b/PowerEditor/bin/nppv42RC.zip new file mode 100644 index 0000000000000000000000000000000000000000..a0bdb950144631f45bc7bf87ec41bed907fd4f3f GIT binary patch literal 1361077 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

      IPf{(WZQ#dI)605ypCJ^?s0OQkJ#)W#${md+wx( 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

      3pli?swQ{cx2uBC3rZ-xwc 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�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

      gECtk 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%0Dk`X^5EylK*G!Fe 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 z

      I=hIQC{P$msySve9yOseVQVARxca1>1)s^idi#qlM=jT)u^NG!)s4mo}U$sPN{ zhgbAG2PvNC+y0>EY3811*zucCqd0zg#qm4vZae3*@-NiQCzV(1CPV4QExMU&)vuTM zocJB@i7rDP4f@mM=Kjn*KIgmtlbfq}JFyF=1Pj%d1I$;t9N@(Mf$DO=OJ}1m2YAoM zyc{t7Z1{4(E(gQ|CQ{;Zz&>7gSONC0b4i-b??alZP&*OV=gm&^F8D&cV?Y<)Pko5md`xZ9 zs>GpGXrTzV4~!I!qBqOLR<^sZN%%!dt;o+!nwiGX4yMBzQ3*a%ZgM#SGjRg)wz!hQ z2ERkY4j!gX@=Vs_pFt9>JBJ(>UgE7J9T+mBkt7QvsK)w!&OE*8}=qzjl}&M?g*@hj&I~!r(2qp zD|MUrl{#dzN;o&||xT&)W;<@zSUlsDhzOu-%(U300&K0txN zJBQz`JIe3YRRCPTy`KGq%Ng|hglN#Hf;a%UE0%&^vRSB}T4a>(2-Y$jC z4ZBsVk3Sk&Dzrg~4~%7|>=%E3TAB?M6EJzhApC$G&!xcroU+8?*Y_jp0!E+KpMccC#D#XAVYQ zyD=l@`-73!Zm2e08NH}nyD`VOc4Llp?WW~|xNFj&g<3SE;)`FlyY*k8%XUTpFr^Mx zuI{Nng9dZNIkmy`pei5>gPG6UrHBotkJ!1&Xrp=V?U2!|TuCZ2 z?kzeI`Uu7Cw8S?IJ&~fkmyQSaS^Q;_!|?Oca+#s3XjjoKH~l?#fl z@Jdm-(r;gcuJqX_bmig0>-pCEiM0{xQZ^X4a^2Lbnvk#O;JA1#7ybQm`_r8Pu`WOz7Byq+>opR2T`h zrWLTTrriUC1*t)0Ydx)2wj$IPy$F4~gSSo*D6$t1M628Ue}>debvLo%qPUxAR_-R6 z!*>%EXL(mj=BTD20iiq$p@#zDL$1H= zU~GaOikJd5nD+Nf&A)cf^wD!yzGo_07McIw@0pt0-!t``=l4t}T#mYDy7+wXo@r$* zY2%;`;fWL*Zxrd#h_k_o_C%qRwpc6qc!7YV{LT@91a`GeJ z_%>d~`oABJCA{<9a4g}VccWu|24R{ipoqfCJ7xo~)nIw9J?*fvJ}l6A3-mBiby+F> zv7;jt6sPuz&TnWYr7b1>_3aF*GDmVjE0Xj0#?%;{cZ}XU#-OPGIB1?SFmgW&4jDTd zb!6$sId;BzC6VnGtbPH>1*@0vZ;F1V(9+1E$)>eN97pVXRXL6bt9_SG6}7j1+D`3{ zoQqa_<7J`t;r7RND(!owCX)6?Tod*kMiJdMRs=A7Ao#S^tmE5V zg2~>pX@E0#FI_oi-H4ZK69$j@?`_j;-mQ6OePJ`nDVMxhg1@PE7;Wnz3Z*l9|z z({adIu!=hM6j#Dct)R$-3LBhK5xH=Cni7DdFveJV2ksaIrPmM7_8>1j8WDS=6HU@N zRIl|TmpSkr2?1|M3cTm!Re$0e=exb@T%4$acZs7@1NIq&9dVhfG08c=$ zzuwa8lnl5(!tEgusaFr-vijy19)shlBxjB0yzLBxu@#fkP>nTm>d#b@YzHR#Xsd?eG>4 zzhXkMPu&)!*x%h2q1YMYIysG{hBzcEy z@8AINEugSlzA?`Xe5knwQCUbp+B)FVfhwtZ|NT3h>zgpHEj2Ffg7F^C5(acKR*&F( zdWHLj%->Niqc#dW8_h8D(shw+S}K4&B!Eo~2C1FG--1xW-MkzGJJvsnBYXRYIgfLQz*K?29d#g=ckeFqlN1yw z4iDl{*-tIS_5D;*9KVrEu_H+_EP9Wq1U5pbu0Fx+siABNt`&0^>(LT9Q19*+MPxcM zU=$%+GLKQVu~)yKP%%1;Z*w(Ve*R->?Wr1oUF=)M4)VvSLei?eh#ww}Cnm#hCqOxO4%&sX$^a1LzE*Y*Rm;V#M-E4G_6hE;^&B;u}Z9{6dq}- zxj7kSmseAtd3F?kbq>W(n*BZHyZTy&_bu*{hfKZ|anw_1wrnL7-NzTsdmg_WD|ucL z$2w79{X506Ef}u^Y>!(V4%nuv37)-yJbXxNnxQunlZQD^&?!S{@&aPo^%%c-c*W%? zHf=Xuxg)IM`|QP)#fj{`Dz4YKQRt5M;Wi|_gd+vG)ggx*Cn;ilC7GU(LKk|L`%}~)A6gf**Ys50j`(_Xi zj@I3$)F9ZyQ4LE(LmjiJ8=BM&owHGo^^I!$xMle>%u z-%vGPhQOa1&?p1gn^e-vJWVsQ z#pdNy+OjIdX77e8vf1)ROm1~zzgOe@eNzl>wQY#WEj>HALDhI&6ABxFk3#f?^++FC z6(YKU(z{m)qK~ZS$P1$PQeyimLG(5x929r^;d*iu36xFV#b2%G+!TiPlB)DeDy=|i zL(R2OY?{7at&I<^zapFBH^gL9XLgA?`+z8w_i$Q2{3QmXzFZ%ZQC-+aC{P-f{DOit zVJ3a?I<*dywVl#a6()V~dW2@Y@p^=2tfIt3qW3#2WL5M&jUtCa>&(}$NNY+IvJ+Nu zWVI2DbEdRnMcT=k##T z8(u>?CCsYjlr|A2Wzm?-c}*?zN3V=c((5rTP&d{|jZNK8Q5NWj*J3J5cedxXC}nx( zrx?nz{l()(6|;^}cw6hE_0P4Vn?SERV#YcVOt3y)t@ zQT%0N6vb!P#iY0gJF+f{;uVcCD1LukOp32!tJZ}mexOlJ@p~0WuU{FG`8rCMuN1?h zydq+F$Q2R8V@`#l(PT#+tBAA|ZxT-ztqk>Gr>bMZJ={gM1G2q9d(HbMv;*G358!mEl98irhmvQgi@8nzS%@a%b=7=s|Vuw1rK z>&BOOCk23>o-pOu7xIRHgTGEeMy!sY(Y^X%$Kv>MlhM zg0Ef<>+okUU(r%LwI-&eNMw`OsHFCXA5geCjK>o%lMYeO4nvf}6uzvsQ}m&{Fh_u z_Vq0Dp3yc|-rf1f08Kg{6Y5q6`({z&IY5?fbAkoe202($P- zC8jBg_T{QbWidj8Tb(F!C?MZg6*m!&$Au9nUlnx4Hb+ain2Iu2ggE!es`e|H2=4V- z9dk{S#Nt+~q`d8f8VsXB`t7QicD4`u_bOH6vJ+8uc3o7%!7F&f-?L}b4M#-vYDPWg zjB4ChG`^ADt8Q#OL6cXQX%DSL`poi>)a;Z#v0O+kYo%hOhpdb+4gFUtM*8NJk>YsZ zB#C%=2y$m?QxS%I;UxufLq@y#@1=ZGcQCQ(s#xRY*?;3QSmJE&@3 zrRd~}$f6slC?O1`Zbbx?f2pdTAu1)M=w(&WS11Y&n6edW;@vAEh%OR_X_0= zf%8#n^y2cc8p+GAXd8#Dh-t%bV#zC1nsnk=)Bx43h`C1m1M@FeHGK0}jD3>2d!CoT@$(t~wN@TOTi1#F?h5`v}#Y7_Qrsz}gf9^^_P<9`^rUjKI_XVkDfK z2u^w!&Sx)1pjV};dXe~(6t4OzN*xWS&(hWqa)awX0%w>7D|7yOwiho61$fPTKn*t%LFIm zmqx6#J1vdm!cbD5HQ^o_mV^iPH%lUGUQ0C>glm4XM2*YalrB-ae|1U3X5ms5oW0-B z=tRAS`3`=L{0FhWt`x? ztgD*fU0>6L7bf@y>U`L;5W&X95d_Bt3BK@xGM_ckLqmE)^!n!owRgYsg)1WZk! z*sbir#VSO9|Fv3?W>OdCFrt%Rh(I*|g$NgY#0wEF`d?m9q%-IR)&9?6wLMIrHc6yz zBQ;S1xcoed5|@Q&`|0^B()RKTF=^|^=DnbzE$b`ws+{Ii+&Xxn-KzXgY=pX{0WF>S zFjpoJa>tg2xMHL9?xlh&cRe4$l|j!(aOD{u#>dgAkuoN;^&gw`(&FI+A!iY&gJ z#Nt{SLg45kH3EB8wL5JzQ0rAZ=tgZ!J)xz?B!>ba6KQ@;xI~N3abGG zU^7N(dfQ#0rlUmD0c>KZ>6l+z7Sgs^2=h0E9uZ(EK z!GAfgE}F5IaX%BUfxL@CM#_j@68$0`Hud0hTo=$z$zGxaTBWh!&qZiNfBy0$e>~18 zr$Pu$+fsg^xMzR5&RNELk5TuXu$LS!kN@VxX;V$LmiD=$F+JrO7YiB`+K9K zK>L>{p#ugSr+)T#$@JGLlIg2QB-4^vlIj1ZN~TYyNv16>lszq(?n3#$$|TcUGbGdB zN+i?Kxss`ICf?nOe|sL6OpiQ)XOCnWHeE7po-LV1mLd;zcRnhas^&osl2Ri9HOI^Aex^lut+IN6c4b%&Jrwd+T?#C0oi>{+D zrzw{L-xEY+vaIoqZn`gEGkG3qz0PAjb6wGd;A;@h;57zC5wDA%C|*&WjGu=4HOL%D z?2reJSVZg%46JAqzw4FXjmqyP{tG1WcMnLYJyU`Z=#oR8c(FuC-{h9EK;(-P$b?;jTo;&<=+}$= ze)C@{-B7$-=6D1vHu`i&>KMJ{(roE3w)DB)^~0#0RxE;v|z;w zRndYA7PK{>MM)`0F*URSp@mg&V+0o=!TK&mFccdeg7}Iq>mq`HR^fe@Z$+$&3oX@_ zO9i}_g?zuFLbJaQDu=@mKStfsm_R zDpWo2I1G2@3Xe;~qQ%3)9MnnI5>K3{uF7euMChDS^-swj>3tZ7akfuK36V?!yy*>q z{~8VMAIe8sFrYXQ`O_CFhf$qM!l39CYzQYZa0Lx?3WxaJDT15Ar8Z6o z;P?!jK=(DFrCdYN$**@fmIwyZbgNy+u8Vvnt7|mLsQWXo|+-OTe zbkZg-1ddeY%LwPuBagm6<gg?>mKh~c2le~Ia&4~3ER~tO%xuBYy`-s9E1-UuK`vyAYaJ4pUoN|^ zAg<#}1cs6sT^)>VO?=DzZgI=JnVfi;qi&h+dXf1WSzKgp78jW(Jbb)Cxh7mW0`HKA zNuv!kUVMp|JkP8=2g5UbVg%(81o2mCe}q?l-A;a+_Otvp?W&*16wI@b)~_k_#hB=X zpL7&F@RuDwy#@Ve5lK@XR77ewE+aEMq&H%z7u-^=Owl!O<=i5q-bTuLBd7#$4+u z4$908DhFl$BiQAj%!ZEmgEDlYN_@ufLXUobY;ix)0sT*ziZE8bj`#RJ?(>|&U?c_& zZ;Ki7li%8sDcdjrm9=mrh+|Deu>~=)*@$r;_&VZR&iSaAx5mtV6PqxY4M2jw1f2pd ze%Z$J#FK@y>7u4pnh*aRcT0&mx}~%sZMqem*?q#gAGOoyh9Ks`tx`RePfag zRECBM#R1BL-g+||jR+3d&;K*YQ6X>q%Z}l$31VmHf{BXtB=#w{PjttKV0X4?=>-eE zz?Vf=e8wMt5Rbvw0RcYcz99ee%YY=~2rl-iNY&8YK5dd(wq;H0dQI1HOa#6PGrm_} zMGF6$%KxVEzv=i}Q8AeQ=9&0Vvz$QrWwK&OmUgC4LK{wD$$eA!^=?(Gfs>EC^{O6V zSyh@^W2z;)V0mPaPxA(TiHZq-Gk+{B+(Vv-@NNgdND%s>un@7$8jUFwUZdqh{!K_QtmH{ii(fSU~5= zFt_Sd8&xu0p0!aY6ZJh;qbzvhPTjZ?0aUmT4b9?5BjpitC6HOI6p9JNXC)tq+!>cr zHu-p(kE*f1$o$iVM?i>|vrx-uK7fyUJZhM>?Fgss1~si+`4(BNa`O`U#%u9)?}Eil z?5yTIB0Q+|YaKx0Qol#43C8R=HTvFKylvh^u4G3-LJ=5*2)3~zlyTGh1pft8^J4NZ zigCO*G7oUV@!rxh14(^StH(k@+US8;elHp}dJrCquN$3?hi9NudI_RqkC@_CBCjCo z=rn$^kHjL*$RXS*CHX_$orZ=h!n_|8>$2jFD&+E68#AkMdaDFLboe0a_thcCBglKb(*$HJ7e>Tb{M75xN!mc3;L94aYITv|BV2qGU~0oD zT582y9mJ}36wVv7-6ovkS=)VZ3><_Agb|H{8RFmP>H#nVCyjwKPE@IB*Tl*xA}Mra zum};U6(f6*($7-Z-^6W5+Pac36dhCsAWeg^8%g^L*ct&!mP0McNh7jGnW zi9AzZMMsx?ODVxOW?1ta=<4X3QhSn`bwPB(jYH6{Fajuk`Hop?9qzlcuU&(#I;@>ldi1!s&kZ-hQNc=HUBcv=rN=sCV>{-H|1xq&(f!+^vK(xn%ac9NVD-PUg z^7O}HgWf9~YD8>mk73+6e$L>V@HqoZt#R3VDq4N5n3%M(qJpv##7Wfj=SVT&2^W?Q zK1{+=g{oYhDm52rt_T!AE4Dx~Rp@){#U+ECFx2+IAu&34|yTyvae%J455&*zouVA8P%jc6YHd4ti!kva~a>)t!#VH*e2( z;Gx>FKukFGNmM(oI4;Bd9k|mwI*$nS443=1VvupZO|=Z#Hsx^awC>(S0D&tpiA+QQ zlID$a-!lM(-bxIZ@#~Iv&R@t`a!u@;*oDC2^O2PV%Zxr%{U5VqoxG-nPJrwp{`n#3 zo!_#>`G5XQly4DC#b79?cWFh!Cc!TDJdz;twiJY_*h00&jDbcK30T6?JbSaN+n!l( z68e^@bpIuKfZz?_VtM0CQE5yx`QnusLFx3CEqq$p!X_81RAMefs+bKCr8c%jGLVBu zRt)>!jUqQ3g(5}DZ<0>$snYS+woU8k>+iV%f7ydDs+mecLmQtlgqLGlqg#@==%BYG zk?i1^;2llFoytANv4@I=%(kt9U#0XLOd3NQ@rmJ%NS5SDV-?^%Ub`?}270&UrfA&; zClg{``3gvMgqyhNDO$Q%{{vol?sVpuunQpmKPKuSE)8?)QMiyVHc`-dr9Se-&~OD5 z&4i*yeG-jn^z|qMx{ldVH~1}Bcnu_1ORgUD<(h*CODb_e>vnZOb6Yj_1SP{jCBp#B zfL^A{&NcHqx(nrzCZ#}{x+M&ayGx-2NM(JXmlkCLLL{cKPOuB4@q2PDi?9|s>Fz_W zN-*E0GM!imVW#4D{bun6s#rtNx`py!>2tE3L-}>@iuZJC=}8?%rbqDt-E0toB_gQv z=IVop-p`|+r0d6-13K?GbC6t4tDeS0xafDW_YoC88G9em4+|6AM>OUkm8yX&7fh1M zPO?1~tE}T}l-HXA;q~SVq`ilk=kBoAn{vJ>eKzFv<|W1JjR1=Edh@5VQC@FWo)uni zYW}UU!!0)ZX*x1CLY67A^YwA?ys|zvaVIzIL)yW!fwOqaz7nGZlC6Z3L?ABcv-!W} z3u1$|)|U&8?jj+fMA!U+;*zGAmcF$RNi6lgd_&QK@lrje9cVMPwYCDg=;OJx;-zAx zeHjO9&S^5v@$#*mT+ypWTQ1aRv1+71czj!US=<9COc_t=YC1Ks zKDUVKaXPOj@c<)j>JURG$ zkS$%BWGH~J2fRW5VjbxncLl{tG+%GgyZcFp16q8!yx9AJTYQQ>yg$UI0TME>80hVE zTOjCG?tec;U5d_ZpO@h@8Ew9#%%D~zAkQruNkowHQrXKu;cz%Hx`pK~TlnQfnZNAS zJ@OL52J03R-Jy>}(E>&!y&IJTiioIrQAtEeiO0l?!87!1z| zl*84ZwzSqgucYIkH6`Pkc`Bm)O*O60>yuQFuAbbag1FO)kn7JBYSKc6e2GHCFzYNu zs7i%Dn`Y8PwH<$|c5Fh_ra^Rr2GQa4Hb;x-YW&&V0_1zr)HEM&u4+O=YTYxBN4L0= z9+VF3ZXkeaq@3P@SQW)g8j1mMriK71eKVzR*C;{ z-aU`vtvv41ZDy}JRH{vLP*PovTD_46RLV0)BLbOibvfFJE}d`W`-ri*l*6D=a`1pk zJds1i11=qMJjm_^q%?Xm`9hx_g69Dho(en<;8R3~srDk@$Zd%FMh5xciCX%*j{j}p ze@Bswv>mO#djtLyVHe2-&5g4G5lpm2TrdtLeh^A5rx81cY>Xb4f%!(SfceRw1l$*w*ud<1|X4j|M7 ztH#qePwZviJxD>~8#~5>#1eJ{!Hp#JAa9g%YNG*3JTCU^%W?&yGXBumriG_x8hox_f84ta0Oe&X2#-t#<%i2FFcI_{c zMD7%kJ5A(Hjdp{J`S;XR%)hY{0Lc?i>80_8K#uq66z=v~M{cimw8^m|WyPm=4!|n% z6RaYqs1Yf_Dl#W0H+R`5QL9KGH+$>TEayD$lm6G6rV=Vwiukeur-bT9PZI{_wG}d- zs*$OOFPTQTn=rqLnalqK304zi;kfJ`JZWxv#H^y5FO&IJ`cUQNsbBC?+zSGn1Lx92 zn(E6<4c$+fLgH4>l7#o+eIUo(hj$ABHx3x%w3xP(1qHYVj zDKcM8Q<6h!cd$bb(0xEth2rNT_W`wbCcM7qZ=IZ~3tr#z&(4diJHPJ?c|*U8xRWyd zf^N!3DsIaE)e-WB4h98IM7U#rMB$EJ;m(Iem*t}T89BziZz%a=-qj6YQj{-L8xgr+ z8g;f2U45Z8a9^m^EUhE#-_jV2lJwsbl0G{xB>iq-N&gOHfTArV>3355h^tYam zlJwUjA|(AJF6rwEq9uJ_@dq|v@jmV)Y>D7AXjB}c?qfZH9Z%s9b)Svu{GezmU>ok77F=#R6tvEE=gG}6vcT$Z3ua(e551f z2{peO#F2AKG+x9%W%n}?|CDb{hHg=61o^bH#vba3bxxUuI4}#(l)XBlJfSwQmWShA zQ?@)9c1=n9D)lNF>_TqYO%c!Rd1+#C!OkUETqMOTE?z*HG!4{zmjpM6iVMVoLdu@` zBbKnf-=Ga2*ZCgT`yMy==3u+{1&(y#FuOEPul-P(l3ISu-3yzXvml?^**kVj9`acF zUcDctu}1)$joAE8rh%i+oLONr#euOg-Sd`HqI({AfcG{Oump&x$Fv9$ zJq6&>{XnBDvK3&Dl%t_GpEe`bX<(ipterj3-evLDcs_pdc5`QF@mA%g(V@`6-QdLB zd?y`+i)5c?yU(-3f1i%7zJp=w*H~W*-K?*yfeo2N%j?6^$Mi{-?W<|lK<~9xI^g|U zd-^SOXG@)N`Az6pd`A2LPT8_O4H#>D9=&n-66$Ygp+D#WNPCl97MMq}05&MCA4sYd zCTNkbQdG(|H6lfdFc70sMmt~2QDD-nWG#GqY@bx9hY5&J_q@+qEnD?8I9m;A7Hh-& zRhezso@#ObI}Dd`n;+xKO*@>$p;&ns()j2z8~d@YbT)e;>If{BI;3jc-KBl(AjZc4 zswyu?mG;RCQV3jLV8%eozK3W*pVvEQ`Ll=_PSRI-gwtm0y@c;%5oD0i26al2-^!$uT$9pwGl_}T)(k5X-bbyB z?+TvDu(l`(En?3|fYTn6l$)ACTgE9FlT5B08^GWZ{p0q6j3W<7HSna)^I@mQMfN(v zS`E8P#&6{H;AJ&M%mW+p;2-~1m#e)*0R+#c3jA`GMgUe(T$i7n$AU{Vw z4Z2{vRD>(v$HXNy^MO_Vn z?{W-gSxGM@RGVBdA~1~Ke=m8=urjm5x2VwK`g2V-P_Tjcl}z%Fqe!-m;L`OBMZ>+M zjElnVk>1$`74};Ue6rG#i0N$jtI7lp@{2gRJy8=l2}i%cK97ur0{zL{C=4fTj!pmu zAW(ipHU@{HO@TVHF=*f$gG=yT(jM*^ECG;T$p0mZB~t-SCZrBNUIM?4GCyGuxJmXFEs6$7!A-q3yL1w|)U*OS{yDJ# zEV4V(urzn_&pww6ctvyMzQ?HxjV2Uu3R_@z>VVaTT9Oga94XIWxBDiIl5z~rJL!e| zWeo!l#`<$pu`Q)W5;|3VZq7g;t|JISS;66ldx4g0(_<15uUvM0s2TwKAMhK}T0 z-pa%2{>7Ljeap`v#`gS^rfm%MH10Pd;Ns=B$#I*%_h3TFeI}9orEqm(j8K}Q;|<#2op@UV>@bq;3Vqcxf(;tr@~hK z8}T@UN5Jla&Bkpy#l$YVI88!>S;^wpot3?wYT+wRTRc<})yq$lbQKsD6bsNkp?tD6 z4Q#ORS}*!kTFxk+)$G?T;ahvHlTy*159z=Z~1ehSQV zrS1UA54vvv%`keJG+4V&8gGJ|RZlOJj&cIYm|WWo@s^BGLi zBojs@-(F(lKV9D`Sx;cNa;J2IZ@AXQyUPHvPaE9$VjCQiBLC<6GimEf;Yoz;1d`2x@;~D2OS1b z1j6RbASyov#}l5P5;MhOW*wp8`qDL_z4(x_)WEk=jLVLzm3!pAQBlBST=p>nLl+?# z_J;`O!IH%NP@d-z|MI~|#CVh9e$ZZ#A}yzWZFl&Vr}6K{=wo+XWnFTd;cSGQM1S&Py z#L72l+CC5g9qx@LN|8l~Bd|aakp`fYcT&Y62cQXPo-)dPs{ljwN~f0G4f_WWd$a3G z(FNg;5*PW9IWa}7)i~huxf<5Hh`|V)(@TG)ku7%cedG9WRUp_mozNRnDb!%1~e$YHKx59L#*F{v(kWz}04h9Fo7lRL;w zt(afMOYv#o?EPm1ZsX7*`wcQq@keJbbW%a_nP35<$dk0x9KA#o ztmXpHY*4rBWe?GA=K~&2AE+oKtmNfSrJ`$u8#H zS=?|tKD9KVk#|VDwM@w={{gEjZ^?MTvMy&dP(v(PyK*+o7tUZ;u7 zR#w-Hg(sVjv6(izos+^)#I30zON?QBNc83(k@;wdDFmm9V3t<=8LV1_ogA6P*`1xy zva7#TT`n6}z01X^&oKJe+AyXI`@>4Tr^mgPuNHmRycVxr-C%oBXFaa+m;Lkf)(^8^lA>O|(t zG;YEa2@|_UpY@1rZG_2eT`BvygG^={=l?f8cFB5#zW4d#m5Trz{#8_drp)#Oij3nd z`xY1;+h3|(MPx`%O@@Ml+Ajw7l?ZH~Fs!#`3VWPhv?t2qN}R>Xc0L-F#a<{4eIJ}D zQVwNECwKj~hn$x#KMru4XiIeddzYSn7wHSX3%zmv5z)}waN^oTiGNCzxGquRhD3=Q z6D7WuC~A((*mK$|7C6L!44_sgW4L1DHQYqIipF_+TQw9hksHkbK1GQ7JXrkVtY;-S9;hX_g1T?6Dg`R(pbtpmld)BPdKZ?FB_h z?_Llh{X*M3wQ<`#4MfNN_g?Zo{{eFBHc#YQS6@Eg$%x$Ne|~hr`~1J4lD@s?A|(yy zB|R%Pl(ML#EKyPqvN*zAhXfSkImxx+YZ4dJM8zzQErxo9C}uam7Z&QD+Z|NaZ#+=X zdtm>d?F=+aWi6I6le-UKxXQQMiCu+GBzaEp0tY25kWX%dg#uMfwp{S1nTK*Y$HmXN zHfLUVh9oHes`qIQ{@F%t->4FUH~Y(3K5R^t*7GsDR_FZ#pP4L}na=-DW+wM7n3I5% zV<}~hvtnM_UdP8Vl_HCNaS!!Mn#1^~EMBSuUsvgtsKKT&yr1$)7Ga$yog}`xdQi8- zfmmkVuDHp^xyj>?qaJ00RqmUd%g|jZX+M%ez=PTMe~AG9g#)M2_6)7U4Bom?MJ^1k zQ{JM@YqBg58yOIu+4c8z@g-lv1`yqQ(^XZcsM(**A;;guULkC3*+xh3V<{FyJQOCv zz;5A03<*<=q^qMS9>PXO0e8$L;B-)IB8p8!u~S8B2mf{yR={;Np$aTP1uz!)%juPk z9fb`O)raudC-B-}#UH6q3A=v`RcEkDu)XT;ShhRjYq9RXBdnY?H?|f?DwrExi{D29 z-!WI=dl~V)jPpIxoK^+Wp;W^bX$SV_@nRH>rut7g3e^LMYE2Z?4r2Ye5ayiFg;6K| zD?-Y)IYi3XXuAJ2CqnmF_HGpL(;Rpdm^v7A=MRqQJN2U+1-1kvv%JX7QpfY+I?)Vv z>~5kyM^!b9s2_V5QJ*gQ&+H>4PoYVt0bYe=f6iR-c5TT?bijsrl z5>Zlrm!Krp-e4g<%hD;;SiToAd!a+x-AGia9+OM8 zyE%a>zP?oCNX0uu-dS$>9;8`q++-n={++(CLO)h&QSzm9?P?+6#ET!eoq*r3v<}=C znIiJ%1;Mk}T!1GK;EbolMN+FkDId|Dv_^b6hU7xJBSDn3zDr5ajGMw3ANwSW7bxXT z*BvjUkz<9$p%!f7VFf^HQO(Z$6Gy5 z!LlP3OAo@5N?3Yc4wlIZmd9hUbSErV5|(<^WnjrtundmHq9-iLgk|aFU`bW5d^0u% zOEMRmXiOq*!;bO;27Azbdld~Mm zl0hbU0&r@?B=2%8`_8mREc?#flF+g*)_%`*RxAS*`@Ptg-?d)cxbOQ`#keolQ1Ys? zV#Nu(F@}=iOV|4s@iifU9c;vGzGT#P;)UnO5?T!wC$!Yt*s56SMUHj!E{PD|iot&~ z4gQ~GUeJm#Q?Vj+{~WR+%u=ifIl9_nWl5}8mc&bM?P5b%_1{#+;}Yh_K>;oR||Xi5Pg`XTiXPFU_q{FX4Bq zt*D4kywW*7^@e?o(V>!G7&&(1Gb&C!6f(ZDF11Uq#xAWhv9vx79$mKikvm1U27y>v zS_i+UrFC%r_P{k#KB(my-RGzb)_V*;G}j9Q`Lr1&Bw5omFJ}4Mj*Iy&v13rJXdr0MQioTP!^~YfDzZvc(XK%^kruJQkai{oNkM*7wo< ze0-WTMw2xJ1Ma*bpAtogK1wH zwgR7ZJGXLMA@~pS6dT*^++-S0VPm_UGO$^qae-9-Z5JEcD>?;ZlWtLLY`0-Lh`lZT zD?T??0v)C|_75}>JwLly*x34_ZivUm*tF37@Cz2Ikz@Uzdyn%d33C+lM*c z!61iaPl-3PE&ol}%(m(i>K=iim$1X0-yH59&mQV(hduL9yd8EGGO+Q7F2@dg(4naA zan+$%JM2Y+E@X#&!?`YY*gplk*kQ}Y!BVxxw9aRJhuOe10`0pF1M+s7W zwBIBhFDigV8?V4`Z^YI?)pu0d^u(pTk}pb|{K$n$`~9U#yT+rGcKQaC*8KRd%JCU= zcKS~JLN;&pJ{zk=35};zD{SiOE-EX5yQonh@v*k7m@E7RhQNVK8ov(+CNO@FpMvf`C%%GX=?SKw zs(wq+AO~-b+rO&HQWSjSQf;Jdt3({kLpY0noNE!6#!dF+PWF$Rg48M8kMVXI%<7#E zO!o8zuwI>scD;l(2`uMNE0*&I+2F6jmh-#X70Y=C(oJ6}_T}9Wu(S)y`2~9NI`$>{ zxTv3+cZw8%e+}oQ7-2(}^GG@TF9pFV1b_gR^N*3`{JV$(m()&^Mu(%2RRA4zwrOZz zyMs0VlF)MgrL%&Ss|RsbqJYPNh`#aM(-F)0`+$Zl=k4q@j)uNc;=#1I%C`s_U!M@J z{Pg*#{O3yLS4~i8FGm2h4~ta(Ok1e(eP)F!KLb!=$wu{GDR57S!!bgs|80o!`addD z4$gvC+hSPY`F%nby!NnQfq!6#1>cPqEO_OiL@c=V_wg(cdzDjeO1M`!rz3W+QuNOZ z0xnYe=3NuXXdS&0R)TCeBIuOtW;}h1r~4Mq^evth?tncWitm72Lc?ozavo)z!tQGm z`e;I886FC!vfn6SR4g6AlG@OjhegK~mcDwt%bACaw)is-t>?pM9tNQ%7zGm!eR7=` z`m84}H1u6{>Jmd=QcxNC+S6$0YeT^yk~h{VByX+jLh{SM#FPAVnB-Uu{LPtM10Nm} z`YCZ`TwvWZVaWq^D2IC|Q=GJ*@3m7XK^$Up5k%% zFoazP$|0LBdGroeeJdQ;@fIACw-2yT{@ zMrK)Q!k#U%D+0r|G-24*C7X?B8%5bhVMip&tS!N=N57-o(a7VmJ060bRRkU0Wy+Jr zPZxvuVeeD?EYEly%Bay5IM-je4BE@6kFAO=VBSL;T#lH04(F>;u?uW@bR}s{Xk6_| z)#i&)H3wA1acavY;bUsyeEpK}b2$7If}etok4wQC!?j>XiBY&J1r{QGmR0#7^2KS>k&BW7FW17_dn^29vmhFFGO zojLeQG1@A_0}^N`n8x;A&xeTlG(-$dqv357A0LEYoK~^}ud25m;h%o5TYwTH&JEVk z9wKIqNTUFS=y5q;@GJig=3F@COFpm zX;+Q`!-1Swj%|qJSUcK8A?MK8u1tIXx(hOG!zG!f2!mth!01xp+YP4^^X-Xq3g5bF zw(f6Fc$A%vWMam?ptgHdDBBY9YY4`B%&sI}^Btn*od5`2;ZlXu6a!LzZNVtD=Xcn% zr*8<$D3}i;w2e4Cn)89yKHRLS&^a+|&SZ-+{-p!o!0%EQ?xK3yBl8E6>=83hY^0aeQzV}y@3MVy}C&jmp$SNDmRtOGAZ zkSqP(p%9^94~P9PXb#8g{qRz7w7HL1qw?}#_!FxhK2NGY&J*C}e+i7;*clGKDe^bJ z6s;;Qji`!^-g3NA)WxMjT@17OXmzouk*l7+FF6NPB; zSiSL*D7|qvkcrxb^u~E{E*fS6o4_x$gP9!rU_l!Du{B;fIIdqcFa6s9z7i8lN}(%F@*BX@$ntSE5G~ z`d8(kyTU%CK6wY(CEtyb{LA?++Z3H|irzQH;9tHiI?B!0gt;rV0^5HhueWbKO_>$z zj}z>A8VpHG5v?pBC4k7Ml-2iolqJrtJl{e=Dwf>{HVCSe12XKTY~jOa6`lpcvSv4d zVwpdwL2>Bt)Nyd=*uvpbSjO5#`zK-f;l7z@qn$hk{@IZAarB$}JcrRhVzLei2SPRw z+mI*27C@iUTE89XG*3oSNuA!#K4>HZ6H8gUbO`5&(JxtELyTSD8wdGrWtpG{ay)Vc zw34;mTZ&CfjiiFY@Um@z1x|M#Y+HJ*?WJtO!O)H+94Q3DQj^d@RCI6&`oUxT@d^4U zO@Mo7GIxY0#ZM{C5ji8pJFSi@iV_H~51mLTp*5GpCo8olkqMM^2001$gM^Z)VI`3N zfTB^^exQp+W&E%48kL`eQC$NqkkKBcntT$k4QL(`oea8 z#z^n;Fz;Ty_doci^PSjq{?)sfx8?0C2CO)E=XFX$mZ%Y#friY@9XF0Q>Y6lfJ*PS!R5u?)iA12aF_t>eZDZ?$An;A1iA*q8y-LGlVWT7wP2i!g zkbyGLK{O2qO((%sqN(?a{wr!ZP1T_3K{X;o(>?cqrfSgi326Gn`wtms@XS&n8wWOm zEKAu5Um<7;+$j~dO3zRs*z1uFYinXjLt|D(O%iZYh{5NGmJ!v5KtlUGjU<#F;<$RA~i=%-_^Ad~&l zOnu*h3ZnPdTU+?L_o{0`qc5lJ94R;J-8l<0akvjBXTzp?we3jjo6c?+&_5Y zFtO2L6V>25B;Q^ubN!$nFoL7?{V59o!t7g1`^~i$Uf}#ciUN(x=sqeXyu1`)Nf30b zzI+~@+~l$xgb8=$C$CJ#H9Dt#F1K>y#R}5#>gc?622F*I*!t zaEdv%_Mii{F>Vgur;p<}B4VZ6~e*AmVWj?<*zJai}yXBOd1W(QIgoTd=YZT%AB ztR$R0fD_1$eiT9`0D%#pzA=+S(88kf_y7*Q70|wNx6+Vq&dVAVsX%jleqyKSHgN2~ zV*;aJHy+|30*a-iLdqw8l_4@LRC7NBFof@1P60? z0$u0UQX3rvtjycg%in8^&n%QfT^3N*(VT*YJ?L;zt zL)Utf1#yn=@8MblYq-u3H?I(NPHK&>@$*2bctr(fbxe)*EGblD0EilYe{~3TM!h>P z&pkTNeOsRUraX6Qp4;q*n0h*t3jpu%=PwD|C~g-G3_uT~=T%@KJ$s>d&@&kYM0m)a z>mSQISRURQ=A8iL>~pe7v*X#<-WmQjCPJ4FPV>+5#O;IHr|#osh5zTNnDT$xd(=$bpGKFY5XR`Eq*VTUg6)$uJ@OUM7m?frr#oYQvCOh z%BWk>tHLlWmmi@&$o>I|0uLkFo_lLHt0LzdJl)t8XTg#r*7sK-Z*B${3g+G)l8cPX zG&Ena9>!%y)fBkPxU3R^p?g8BaoGz9=DBYr&k*I!;x@k6^X}PJGrwZ(p=#M4E;PxWiC9p2uV94=(`1ojt*Qt@no{<1(|FUSYH+F6r5I z0nD!+L~0maJ7O$T(W}Q8O z-$_9~28RZEJC8G<)kgc-c|;`tM^?YI>xs=yGR3HoKGxP*Iv46K?Z#)wQOntSfT}!Z z_#E?oqxGKC&%gQf7CHUJQ7X_`|2KN+ZPv{7^eR6uaO;(xYbpJ%WUXAAwL|4zm zpOyG+$8XTbE0Qa^t;khZj8m`3)c|e9IE}YX>#gU=8^Xx_<5gi;4yE?iX}t9sf_gm+ zwOYV<>i~ndYI<7{jUy9}H2hNVGvTMlPlaDQXlcby8oTO*Z|rj?@ML&0JX`Q=!Lt?5 zRy@z(c?QpRJlpXM;u-Yo{3`s@wrbl$+>oi#lkuC0pPN#w`jQ#@YgZG6(P2@0B?UCb za0KiK!TR09gZ@R?L8T4SBW=*L+su*-!}Yq;P*a$hw%fiQ^D(0JX7#Y!PAVV8BY_Q^xlA{0Z%=i zdOUS_>SEhQ@QC4WD}E}C+GN&5+6Huk>PTCNcx*dFr^U2gvjroTxOW99P>1NJ?w(A8 zMOoA7E!?A^LEJOOT|aqF$et$LjDxLwVG~Wd6g$nC)dV(6x|UDo+F6@aii)q;AUzzE zaC=|VG=iTp^;uoI+!VU5c$PGh0DT^;PTCt#Czp!rY)Li1iWU+I19n5bO&wA`TvqF5 zNuxR9;-Jqm%f|~7_uGjo=zuZ^I^es&W{cM(XZI(yWEx&03v?&ax5c$V38R^mr?>Q^ z)sx$RsLq?GBY%{&IMj?AE-~_RCn;(2JQF?GseT-dI7B|ezO+m~NR6J|yGpG?lYmM! z&G)Z?GCCSwZ#_N~>56ZuCdrxtEd%E%ldP#eE94DO1Y4dn0B;wUP0l{!o7+BXBUO%j zSZUv_<`jW$y_+o-FQrmH+xAPw!pPIu6ROaH^34vC#?eJ3}gLNoCmlqx-zCO4rh zg<{&MunWt(Ck@gJOgCs&pGUta%iAeqGR{opM?WUfb&@)7cAl;*$&#mEoJ4O8#4)rJ z&p?RE4pK4s=3L)!DL=)hwv018sk5{$Okyq9pnm~J36P*<>MVTb_a(DB)JIw(9K7jR z6=J^a6eFKM?9K4Yz!j3-f~#)b-N8C2bx-Edb$&(cSwIjb3(thzo`sZvBR3Tk2Z~1o z3ejYFI?GA;6opPhr}CUEX`XzI0M65uh<=!&964qrDWN}wZVEK#VAY?YMc>PBM}U1mMHu%_d_3#gnFGFqoeao zRn!&SMq&^hR`qGBXaujNCL#r_tJCQOf>|>E+GqK0pah zI$nW6dccrfpvO5wH7BKD*O^mTDD_YR;FGv&)%TcTD(veZOSoj4V33XU=?azP``C}4 ztrqN`i9M#7dR4uu6eDEVmvMbEMddr#Ac#LXHujUA%Ybw$%H2c0!^SfD^9#-EbM-_@ z_%=MAU1XNV!R0-9sl0*Q8z0kiJg-OL>4S8fMC(V0u+Sc-L!x3A=6wnjsR@g_yZnTX zxeNe;k1BLGRDKE4xhVR1wCt9QMUNu8x%AErfMFVZGE|qfh`4&Oz1IK>4M(u1D{rGb zy$LT_YB6eY))Vlx06amJ<0bqxx`fT=qD$CLC2Rmn!bn>KQ0efhbfb}0n#~BWON;$g z%q$IJH1?=#n`?k_<7d72#R(euh^rraH<^lSi2g^dWe30m=z8!_wE`Euo+aT_<-Te~ z5AR;}Z3o@+y-e-CO{98$@G{-}-VW(}&A;{9ujpaYeigW81~m2VUZEU0$l*CPt(IWF zm3m|z+#`2(F4ms&o|H2Wd-v*=eyvigm%5vz2|+*)x-H=DSJP}l(14&Ouy2O{9(h`= z|DMhn^tXfm4dQQ%?-2;C4t$pEDXbGP@$!2oanrG@+v%+{R$OJ=c|fWebog!cC;zTt zTL0Lj2x z)bow>k3foX=WUtQ^eX4mrqHVzkN%z|cd9)94(RGMs(T1oe$Z!2k!myco^70QP4%E! zI2m~Y<1mJTn17_r#|*3d!%CfG4o#10cXzPPxK)=PI4NOd-7h2ETcci)%wN^1jhl4o z^M8_RFb$MM;}o3QoUXz@|EzSnZxFr64y*kpJvFJ)n0&55YCiW^2)rK+M zN|^A`$s-3}P4|-AjHuKz9bu_;BPB^6XB2N!A4#ne36m+eiWr%tLbspSrWnXKh`IjBeHN|{pY zO;c^;xd{?%bs3yTh#Rk74e)I@iBSM^H?!dL1{ZiuyYrf!VDA8^mOTfkTF6^Ewg)ie zUgB)y)I9O^q;YczztsfR8T{5JtXoe2=xI!K_i$m7`8-W*F6Sb@Dcs#(&OcGA2OsM& zo%Wv{F><%e?}#-n8-Y=rT+sHM zV*;mhb(>1*S)}*%T||L}hNa)hPt*EE;~O~-DQ?5kLn^RJ#L%g=dtK^HZiLzLOwK#w zGAfi!<;nw34_1xj=8rfDw^7OSQ1Yg+HzC9G!&RzH$7y-&974d0Ze_=Z@jx2ea4Qd7 zjk-M{+7n_{QX_zy|C4ZyzVIzpaYFKP1^n-AEb-iX7(rAn}dg0(CnS0lYPm7 ztJxPxNW-qC$=j~==*ej1N}iD8pB*eAa}0EmCh8)K`f`yHodRQHrffM2W9HFBpK;mS z)V5_oORF1VoW?VJV;&fSoeKlxmm(4;k04ie*$Lw^GA~dP*}zWT#Q-;7DmK}9+R-(l z+jXivy)5;f9(D(%ws*)VkC1CUHw(aTkpxz0ePx8$-6vFJ54$K(>AUE*f&LO?dA-yf zC!2T8|_q8-I6*$0_ zR$|L+V4yK|wCXC2N$a`QGP0#F?!dayrDOf@N*PpMAB|w>d&(5w6N(yC-sVx~io9xf zvbWCY{jRmhMHdbMiQKmoEyeBvnpzYAjJ^8+4Zp3r>B)hdFb_U2>P}Z>V_{_BhQQ!DNhElF z=3*TtgQ$n3{u`frkI-Pg7xut!@*$i_V}i(e8;0ccH^DP(lH&nRY62hm$H-JlMoq1M zOlLUM5e@~F(EpSEXi@LP`lHoXa$UvB-a>z5qUQ#rHQ?8JrTX&pM~ix2j{XQxiSb|1ar}I5%Xf^cws&;J2gq{}269iaD%5+SliT`lD35 z0t5lC9)hq9ztTPz*B=4(PsUk%GGcG<=5Nar{o;*Mi>}{DSxy&Hr2aBf+D= z_&W^09Q-Dm|CjVf7@<`Eh4G`-$VVtF6{dtnsT_pUrHtamb5l;{>x0W*J_$zDV+~y2qGG>>h;!MwS}43DyGz53ms?MQ9q>)=lG1YD?C;Q}~_es!BCQ)$ZTM|I6CffJJqk>&`GUu))C@6%`FC zMv|DIDG^K{BgqgM#6--PQIIH@o?|Sf?QMd4`_q6zHj^@JC$VjMPI_+IN=@42G;Px! zV`*y?90W`}#-B8j##(HNS(8Z&Rsw?(_kF*$_5dcm=iKu=m*-*j`uWyc-}+zc`&&`~ z$HDc0vJsGOoSU33B}LwdOY;t!Ypb=^#ym)?b+-3f@cImFvEPB?k1*qdyP*{a=fGyE z$^x$s@w#lbvip&M@`}vBuEk*XQ>Wd^$el`7dQo!ZUwQA$Kt5EWjr|$MT#y%=4E#a_ z2J8+dAgfkhhaGnIDtrQ0DTHg^e5%dMxS5M5-EP2xZqVs~(%K{{YZWL)ECOB*FXnZC zp^b7qcDxWs=!El7T&dQtnJt}Ek6K*ntq|VOau#X!iIz7k?UkWwcU3Nx;h{3#g;1tO z+R(k~qpc=w*$9-L^)0Ey*f``vL?kqGL+fw|%G_CM0Fb1#0wVTNy_UhzqpflV*1Vm4DzN65Yn6R-Mlk2Q zTE*MJod3`&t*+3He7tYGGZz+V2z1Q}&3YIP?O~XCBn)j$XP{&-Y==v#mi(1!e zQs%04y(akvbOXEa5i-Lln8-@ddeF^#?=$KX8Yf=r!v-3~mxvO1g~nDf#)+eGIaxgi zfy2>wFI=G1LL@0^&~2%AG~P}Dn1I`?*dXkjuwcdmKQBr0V)oo!w7Ae=UFT=kGWL_v zkdLX-OH%_0!Ictw9ykON!sif16Sjy|j=~)=QdSuu;smO1NkJhP0q=83Qiy?B9eyt4 zlt3Wghb!_^bw{d6$!3#{lyV*AlOFSZ6M3L);J{{)KtLJ0TVxh_nEmBW1L%HA@^Q?! zgc|TFeB}8OQX>6eyphwu{Y*>;H^TW#$#(4l zJ3ljjb%e{w(wmZ4<DJb84|Zns-B0O0qQb3ilTGp*Sg_QUbYwS5u*btm zj8lMdey!D%v@&|Jgvi6C0+0=cxjAgl2&SRS6Wv_ubKO;YAJ)U2`PwqO_8{(AR#;#v z9zgx#X#^=Zp%k3*kUqG!A6aA{jg=B00Mj5fK-xWooEcu6l zjdlw_^RgVzG{EC}%(}A{PXYOlYL9{D%yxWJdjLzmJ&2V%(SJ0sraw^f(GIj_zm}_S zhAQ$|_HR*fx0t1ue588%t$Ci0cK!vzvU&*vfkLfgrk#I?%%{Gqivkg?Z*@#9a(gM(5P zITil3#bhYorfTtJHzC70ykF5`Hg?p)+kVh(-6YRZcVN5yrb^j=nBM?%&%|w%o#ZL6Y(k}Q`MiB_~g_`=;;}3*VQ8Z*@Ll zM*&_6s7_`VNDu?01g+>1K^mB%ONzr~du2)-hno*LaWYk@`gZmjB@o8|Ah{9SJ`$Da zQr@-&vP~;qpeN>S%OO_|xw6QWMJ_kF+&UOIEA+rVnjf~pA>cAOzkd*)33<5+ikqGq zBdn(bq?ElpK)dcQP$qgaTSpTC=Q<0Wh~Wl0j|(?-E4{2F&!b+&LYc5i^c|Xv#Jo)7 zJ1WF}7{{qg65n@;2?bToUyQ0lMg6+`HEnSt+*QvZ7>}h??V|7A0i=efo_nIgvyFR3 zxJS*WK+|3tYRdeUV)Q--Ygs|A5psFq>atNrgR>AukX3tTQ`rckvAUNKl?$?UKH!#> zvA0r32VCao2i#0!zy)@sj2~=TS0sVyBUHBym2|3Tr9qa7wqi3-W2o?&b6yrbL4zPn(M}QQ8zrqMx`P_(#ZKj2BwnmFI4Ab(f*nWp{Osm)2U}bhJ{z4^Z+z{h9=Lmt~tt=E!L8GjP1`N)Mw3G#NI1+e?X|_^Royz*?$g4$N zSCwS;AtC#16YnNta@%bSUE18)2z-P$KnZ^!3Suf=>Cfxi!a$h>4ZKh{NeayXx$oJL>ZSoVu z9tc8@>iJ zNYZZA3evoIpwP=q1`x59um1y2%Sylo3u}oMceh!&9Za&D@BXq`xhbhno&~Pc-34*V z3`@uXR-$;%3GVEE zthL5Bi+|DcfXg8`&p@`PKf6D$nDSDRx@`2N>~MOnN(F{hCw@izAFR8EBurn+TCf|) z&Zs;mz%4Iwg1R6Gg(W00mfOfh^g*#a?a(X8q08TcjV=01y!-z)^+?L09=JtlE`|OM zp-m;d#>-%55$wgD_;t>>QKnR-1I7qu|8j+ng25k>PYZe3rZD_!+XOYbWXnwyum%BI zj{sNM9hRPIOH~>&@Ub`f*o0#dr3n^hVcoaD{5ktBh~k(b+5q$g??nEGQUMS5-Eddg z;Vxxgf)m<>^YKB%TzvG`2>ntvm4KXh?5nEp7X z5?W1hsD8Ywvo1mF+)FXl5D)mbNn&N(n?tO)+11w4z+#GH4cA53s%NgP3}v7C9j$E< zTMGpS>~YYhAvWo7?;uvZ53`T{{xL-3Lf)?S&VdCjE$6j#koAJrHqH7J9WUv`VNsKG zDB=_}TscAOhyfT*Kk}u|%b>;dT2}BSU@q8pp5w|S4 zrr{bfToo(U+X)TV_K>?0!&0}cN8L6J71`}(rNmbjT;hKO0qVUbyx3;Kjl#zw7x)qz zNKmE(i&CoN$U1KPTD;&0u?=Xr-AlT(_XH|ap_#dT)ZLz=l56#FeHSl^=~ABaNj`~Z8v;4-`02Po}b zd9Jz>H|HBj!onOMnb~a7aZJ$O;!oNyrBn&P7RmSq8GI#!G&UMOS{+kI3iwa(nH=!6 z20XB-xkvN&BEZ*-%Xi~@j>cUeOki6f?Z}ed%hbAkroih2;MnyTV(PD^*QV58-L})= zI2dvqtZ%~#p!Pb5bn7_S*xn0obwYd8S`K5yp52abFF+cQ`d2L?F>SS^O^4m|faiG_ zCxQ`8kp5uBC@cX6xv4B&c0qbyUZ^rjo&yDo$wHPto+u?9Qn*(*tl=}lVGbXMqrRl0 zK72%k#Dxz~$kp3G>GJmhX{*LRntR0GhB6(&=Z!puDqafjhFe46!8h@yYOt{21R%ms z5Wu5trf`jsQ^r5asm&35hyYQc@N%9_+xTqS!Z|$ka{2c9t5tG({nf9_lk2Z;b@s4lV`0454O+%iJEJ?9abAXhIOA`*?Br{+%IK?}q(PjrZ*wI*M z+?QJVu(%*Z^Bm~%ykI6`{S9#>j`=LP>qF^iQMX#x28_D{$^l1k*hH~y@dTM;zP|8( zP@ep#}yTpqOctY zP4!51&e511M~%npUuKy6owjwFChGjLrz}EiLdg_gPtRj z1=DM@~R4Se(FaZ!^%5$jW~ke%k_Lebb1sfaa<%^#)4n zaT>wM(&{=umTLF_4S{P8bq0iLu&yJjobZ9M1|E>Z1MXR&%N}fj>xIAd-=LS6;_2?ugAJlVDPP6AZ>#9!A zt65E+U*naCIBNd{gd2bo2OI=qs8L+_V>pZ+1wi^}ugZy=w32$)SP~$ z12$=|C~?_3^*~)>Y!HCk(=l}2K+r-Hx)fOHd&Lxdt;@{UG`*zF-?lTJVq_2qTYvD7 zw+z<+GQr!Pr4Hu>Dt1xsJ1mxx=b9$2j2sL4DP?A75r%0TCJZ_g{I}!vd07e_O_K3c zKUfu=<}5cN)w<_#-xv}T235e|?t&}?+I3+hWiTY1nUTc7P@Fsg&UE8J4o!I}Q+Xv* zX&nsNL3w+PuS}kOrPb-|*PN_pr)J>?lMfwTc4)&n~@WS9aSb&EgIEyZM|*gKW>z@}-y-I~Iz}y_9>9Vp#>{RJY4i zu5?8ly3&eDQUOH>E=QkR@D|6j-dFYvz~{{#5{BjWH-`Px@;zCUz{45Q#m zg$wUQqI~xKnWk1F<*C?Rmm%%Qj`7*{O#~TiVu$~BZj%DyIK7T<4PAHdm zddo<%ZZgb{f)$1=ks~r_hYMumyox^M0iYM3J%}a2E(B!YDD{mOkrCO>`v=+n0o8<~ zmp#t&OW_yt2WhFR=v8h+#uj8emTTE)wizN@jdE5V$(uz|H1gU~cJM5!Pr7~YlU}VS z`#m%t8Ws(+u!noBE+s_MyBYKe>bby?o#S4*KJizM0xw+<(%1}$z^f-Q#6nT`F zmi;chA4cbL`sqLhvpAPFPX{LVY7_lOk@O@b9jf`5WYMb5xXBOJPg08VoR$oHAn3c7zAhUD)+A{r(0Jbm;qQEv8@ROQ;)j`us#3Lr{DtJd zbS*}IN##46Q<)o}@~L$8T|{QrYe37z%hY}yDH~bn zgeg+d95~*0vgL#cfRXPkjvE*Gr@>Zaf9XlB(uth~S-j+S_%G7eEKespOD`e(oG|XA z_FfB23=~lU#Nbe1H>tg!sNHd!UbdSNuH48kQK-LhftuiB`wZbkNQpn43H<3MC7H|Q zjbyv^o?x*#Fi~5Xni*a0*YOC+j^r}0kNy5OnzQyuwt7{^(eX`~3D@jFx{zui+)r^U z4O$x_w$@tEg~5wSmy@gGpv%e<=kp~3IX9O`O;RK!TVDoVqJ%8JavP6At{4m(aQ|6p zPmhpL%uPDix=_2*1E^KE4&7mD7^3e2InZu}PVCl1ZF#Zdx7LEl>Qe1Q`xRKG-Cpe2 z|M$Vdt>*d-m9nEcuF3OR)0&Y^&o$H9NK%t$gkC%T%;ZMTKb`_n{b0$&Rh+2_4of$% z5$w*mqj)0QGjX0LW<3tfjxsPwY%3;Xu>LbfeYeY{i6D8UR!CTKCZj5GCx(Bu=@PoqLbKO4&Q~#l%IAgVv3)w{oK^8LSWt zq!)>BdCK($*xChPq__@avP)V)PRx-NbGT!U6?zku(?aP3MH~577v4PY0y#-@FBtXa zkT+-4n?>HNQLmf4Zo{j&SLpSWF>slZH%W0c40A3`!YZcFGza6SlEj_Te}ifHHq3H> z6Z1Sid^WNh|A8p;hloWA)=p$1n$cO5^alvVsB7jz{kg)_#?+k&Q%2>fp`Ot zX`jbqB5<(0iSjRCLlL>u9)d;CiJ*K82Yp}@9Df_UjHq&5P+^*xr0{~fcUU+K2;f9NDgg#Pf=6p8^3V??6@8<$KFU(aGT}7G$&o_bBo8 zE3NKGBFR}>;grUZI5)#U;$Qjd4aERJ0@I{p@;6);RvkS}et73*{AZ>z;fd>ZMe(A z3Gs>87+^8c8px~9y-}H%ebj%-@oc+WJNfGyBMbF-w4kk7YH}=VmK^)vbq}iTSY@rU z-H1tTnzIZBz>u-L2pT>I>W9;1Tm5jN@*6~3JC_Lw!1`Rw6Ed;TER6!hyCav1BjjYmeeWWTo*CY0jb_todFmxl?tn+Fe@l{s8jl=ijyyc-p()*gu?j!0g~2+#&$ z{^W=LQ*tsdJz@PaJ^p^>aa=xWF*6BDe@h`3(hn?t-bw6yG>O)u#A)Yfqb&<6(d?sIh`G4H&j>hL z?HA%KonDrAl13I^F~z95iQt3wdngGKBvAs-NOAezdSr|7*N6|z5n#A#RZBO@Cu62s z{s0crXu?5Ps5-7fSqQ7D{jSThy~{=*{5m{a$Xlqg_y=KR1UYJ)` zZgw`*@z3TP`C%59AQK&8KgVcSJ$=^5A6W~MQ665(qg>?ik;vnt|JOV!C=WHCbavvD zWHo;q9JU%O0ajbq;!2eV7D2Vi@oZZaQSq^?eZ;RsduivCZ)2p2h*fnj?a#{Ws;Grb zNL$58))CuZ`;o*D^^NW1U*$_)AEMW23rUQ5ho@9q%;3jhVSraVAwuoOfHt9A{Z81L zC3;>pcfuU!=&}8eYG=w)7tg8o_=ZZI=P?#rv2HvP<5l+ZsXm)04)s_%pyKE^J*%0# zu?AAK`X6?L2%HCd@eKh%Sg5!649NkJ+x8w|?Z{NtvlaqsK zFb-!Arv01i&6-bwR(H_)B;F~rA}S7R9|Slj(_y(>^1m0TkQ|Lx_|&U5+_AqbnMkjE z#6$sRN8|fkv}P@rp0Eds)@lXd*GLZkAqt;59|g87z>npy>qOlxLF+^9y>Z%()#}Dv z$)x2|v^I<4@3Z^`G8nGYwSOfU(!_>gkb~Q_9qX0EuA=oS&AyEd!@Cj20~#p6*D(B@ zSU@8M+}AMty;y*s0`6!S4#onWq=58>;b&q2Pf-BQir=Mx1Ozm5Dbe*fbe%58+ZvGs zsw>0^uzHlEVzjm-62Eh5ANq-}AFU)1M#B$8E19e(ew)slbj{~X6x! z3Gxn)a4O=5CSzFzan<`!)Ay-0M!Ba>1abzdm#zCVXPws7Yh7M;JM8G7*d^s#ZY1v< zc(o{CRpzR;SfZR|TE?E^R(j#k-z3wVOQ^$o*x%s^7FyE4ceRug19cUN@|~?R?I$+t z0PYwd0e*&0RVrt^{{5^-OzsP3$JnLh&rP8c7DVPh6!cRAd4n7fCy`xm0$s0uXZ3(M zKVfS3qUnP#Qp0LNYDE?ZaU)R;M|N@Bf7hvM-4;{Tnp-tOuw>P$zI5{SZS$u<_}!tpX?4DAulJZU+%-r2P|z_SRRATFIK% zE^{GK+3*7Y#N{~A2C%>T&mh7VOuIvy5?C{!m5v0~M71>oI2GW9F-2~_V!dCza_<&P z^}P>k4_I9fNXmWcm2^5>)Nh`ly>U7cToGp-Iz4xNYvHv-WgZZiJ0p@7yuWue=K0nR zKqE4qBFn8L{o$i0ZlGywff3nA zU$s`>i)+yXm9BGJu&Y~2q9T>+9b|xzcU*sxD`AI2d)(@JTvA->)%1fL=jqy;r!Nk@ zGgk(_D=b!JE+KVCWM=SzULL+rV2db$@8edUi=-{bL#V<{>IZlf6^$IRki==-0Qd~9 zKY<}2Oqd1jC$(}bAjsk_pjYBo!mn$kq&(7$MrkT>Tx&-wHo?95rusSu_$AsKyiHF> zP-x-|?&hsq*jkvF8o8ANInk`+pvtZA|DO9l3^sDS6P;LJ0`Y;uEG(e?x+I9*Ei~BZ zDs`3+Opd~*Ev8L}?>Oz}9hPGIA85PrtlJ$VAlIhyA#Saw6}_7SW_AZxO!^3x z=TgAJp1q$R35n94OzW1lcVLqK3vuHYFB6y+?2i#J?Z3UO?er2HAs$J#Bm-Y`FmhE;rNf@YL6o@k_F8Y7i=-chDVAuR$#MI}X1G4$HfEKa9+0^21> zTx1?MmyFQG$?^1yoM1D8Ri$0GKB(&V23OoMLaW{etzsaUb~RAp)YkFz70y7p1fz$v zusk5)*HtblWz8!Ru$WB2Vxp%v!M!=HzHSOFCU1>jOoD~G3$?c*={(LEeDHH?NFzrY z!LjM?#CnXD2^KCI2}pqz=8=d6A;BVZ;67-4E{cYiaB+@sE(j0hT zB)C3%1U=P$&AL*(b}u#&gi)0$2R$R`0KP^lBStijAa%M2XM zUaZl;s0nT~t5~CtAL32)3AJ1vZ`R{zR=zX?vvHBzN1Ju!ShJFVqa{$7I)Wqb*zisP z{J14hZJ(~5@AqMk#>gzi8dHYhnI2s7B={PTTRN_vzNnT&A-9X6hl!j$c$#7QxA4`k zC!h?t{t`(+Jv7(6lIXl^6W&rLsG$^B#Rv}GH6P%sWWW^2r0XD(2%?7on5##yx&yO# zhD)8AQ@x^Nfsj+QUA#hC?e4-@!aFq{G;d9m8xt%p)b5z43`}@OQwCr$`a6vxj%=2< zTeUnSIU|R$PW*#eyJB}?wm$E;@(rUDlu(_%AyTP6A(?m$fE|#p`Gjh4Gis1XG2<}r zcl9U}nS-o&_V8PVoa$r0<@RkJa0bk%iJA)|q!~EtVdQ=b#hyIB%zqS%DN0{GY}Jx7 zaVokbMhUG3J7}PgN&+`KbidVgzoe{JbumKgZr0wS`2(foTnxoP#YgkjHx&l(f6bv} z;~fAT3+7IUEWo4^V7vH+DWK=hxaL3#WdeWzI`;vqag2zf97+3@HL%@^0<~|^df{jc zBH`G8yH&@_f)DcGi-~t(eFLj*LLe!yViMK@cr~TpauU;>f)+-?Ttai(h) z?ZC=pZ3)dl0+d=i++45GQ31BK*X4 z;R|1|m>@3){vEheELpY}bM4wzs}+KWt&{n$RifWXgo7qp3jN7^U2JN! zv1_;ufj2zR?77(3*6AmIx_qZExaN~G$NnUU=DFIp&dTgA(B6f1c<=yE(3+0F%RkrN zRL@&3|2s_i+y{&2CpWC4(-Pqn^fQcSQL?u*$TKCL(X&o**FZSI(4!Nh(WN3O`()a6 zFeBq(sz@Zmfa?OB+OeMG5O#T}IHG$`t8XHTowIqDjdE{l>P0S*w88c`*(svZ5k;9s z{?=JfktVAAfk+`Z)X{>P8EW+5ttqigy6fB1MHbjTqhGF>qDH^9b)u0EV#Dc?-f_7c z#Hguc{dniaSTEB?ttOF(!DaMFnWJ$vwfreiZ(i-88}OrQTh@K~{TRSCA5(Xgj`ozp zKNq0X`Oqmdj}CwUZ<)X>Y6QnqAMrVU5qDu)yMra4G*4)_&qunhEBYuf1`OBi+8FeEv>kllc$4+hR6t#*kI&lg|BP{k**K{TEf ztg$Tv1qJonb&SR3w9*|d(Aq_$&g{`^ z%H%E^`GjUzH@YH{sYXA$KKK{~r>M~p#W5D#vTHK%^uQ<~HHV;TYl~kY;2eg2;pj4$~Ob|v``L^ylp{c@s(O$;$J&1-e~!#trav{L61HTQ2vkU>t#=%6u$S9&524v!{7){a%qiQjbyxiv+e3teF57}pMg*yI43J^s zX>7uD;@CnY{B^ura7;*Pv~ilF`>;gz0|0$(OSlSgBzO%6P@@q0 zX_v0!P6D+v?y!UP`#rccVc8Glar>v;SIporLy2c$%_VhsN==43oUwHd`+67MH>6}? z2eFb8**`r7SllQoLk+_RXf#i27=8oatrJI5X9@-yGvq;88hIeuH5f?G#an0dC)2ieK$Py+iQSP*h(ne4fcj$wBM)8PzrGKG*3$u6Aw5MRnL&mrxMkIaQm+6%zj8HNLd$^bb0o z{tlHki-Kc_oF*i`g=CqFTlISAFQ^?&vxL$lS8WsldvoD!p&zd1e*(X= zf+ZuXs_n3Py{g(w+6f{ue$WH<&Desu%m%jriMB#{LG&LksX{=9DYs-zoi-G zqs&bSWM(LAmNOe+jX*#u@ADIl@@4gJ7J14T7$ELaBWC4e;*GBZePgIgm}ZP+;%Iyh zei5pCC^C^nB$5rTs}#zCT=$U5{IO6#jE^ZGPE$J#1;n%1aTh=Vakim=XvY^0r6Vvs zlG^ZB9oryW6X7y(mlZRca?Ng|d}%jG;ANmxRKnrkij6deHI~*MT3XL`)9WGF?Q#72 zakmgsthQ{x>h8)XRhzm}Z3rAiu2Z8~DtM1_dP) zgNx2X^qhG1Vk`3IzCc?1vdE9GlPmcy3Jw8*uXfSi;Ugg-62Q{B>(7JFTR$A9+`Z{# znBmNU*b~$rGoz4dxTVZXx-B&}E*64)(Sa0=ZQC8Nt&FWOl0f25>YMroq#;SJKzyYZ zS|12Hbs0tJ8IxrOlL(s>Yg zadDL-N04|gMgzPG;i2`snQ%4*hk&>X*{ANqgI42FRz;2WG zSc)=f6DR?ja30&bpvg>@le2?s><^XdkIe@~dlfyA;amkDHuWeG4?AUBo?^#Y?3YpO zYNp$OC$)b?h!wYCXu3BV>f|=|=zHR6O~F2@6EcJ`9$+aDPnkfEbmCQAxFNMLbV=)h zOTxEb3k_{Vc(>L`U(3nJGPsE|ygI{9Fek$&-#hu?$({*Em4TtlT0fvt0D*}ybis16 zW}*vlTcsL@3$R-fS7svOhSeD<+3&$6!DS!%6NJS7WYXTyPHXQ{IhC;&6iV5%&`d*b zl`BqmbciaMXjC#(hPtG1)7z<-9Ix_qnD5Jidrn$FSljH7>Oi`3B*BAd$JGntdPM6a zu|RZ5efnqMM04RS=>Uf3^dsD0gliV{<>qZ#2x?zV>}jS3xG0<^FDUqYZy`yqX3U|zMA zq8`DtAM$EhP$5D+U7lPWSB8gg2#n33*6%>9r4vGvu**U=C#ew1?-eSdtmCQ6 zoD{JuGf06!&vSvg-L4>kZN5cYvrG5vYMxwBe|EtbLU)hv2WmSDx9Bj;$Idb6j=)m1xN^X$sxrGskkr$TBPBNIfgL!%25 znZO+Wr@6%Kv+~2$w#q!^S!Egf_NSxm>4!6r6{#x2yEv=#*C-eLHOf;TD{=ygMC}5e zrpPO!*+*KSa>5?`ln(8;X%=cTtaYL_>T_rE={%Fo;w7c=+ZmOVOXJUy>1l*6aFBXu z1H0>IBtX9hZf+zkl?L9A4*w4a-u{XIw}JQGXX6Im(*vUw-!<@G4ZL^pz=?Jtq=;`y4^leoJ;=q)6LG*$Y$fx+o)G?_TC=gQ+W!eG3@?lHKQ&JVlxG$!bmWn0U#Wm z8;r=7aK$(DKw8?1puU&YT%gs85;|V8-MtF zg)gPTruRL(z^>q<-7FtlirDUPB5!N}`t%m;ECA5!j8pm7&XV~TMqT(fg?;ub`lhl^ z>3b);$i3<80{>>PbNoA>y~Do?*m3^NVx9b(!w&Lq8r#pmx$KwxyM+A|U$w)nZ*jB# z&4UWr_xQJ%Y5co_sr>6@Pw?+*wwZs|vaj*)diKx!`v_adzZ;p4fAKab|9+h<<=@Ac zi+^R7&A;1NCjZv5c?Jsmxsl_k6uQ5WoJri-L{9yeorKElz`zzn@8Qm1EsacWImlWBJ%ApL8RinW7M9EYeAl z8Ajx1zu=K6vB(sPoNq+-ipbPhWGY22Fd{=DGA$OFMv+-Y>G$f#s0t9E8qMN?3L5Oh}J|%Mm{KPmE+Z3^@_FTj-hu!!IkZqCu5fz zyhGMa2A|vMGcW&4 zzC~L(qLqyR%9;DAVu#uK_79!##pQm=&0gHlwn6Q|2@E)NXwx)D?iDP5qIf_6OGOoSLaE&Z+{_PgB$tb}bd)wcCIrOgOP3;;)CoccAxd;Tx zyO-%(ZMaZ`Mp{G@W;pJ=Rf|fJ3EJJ90RFYZ7T6vuVAQg+-xrWifW<+-V{Ak)-@kVWW$JeG;Nkv*O^S@|Nc|)?>cpZn-@IGHA zx_GY72MiUf&liaoh!LQV*EPy(lvi;~PDB{Xd>NVMRdkcDkIf>V))ijIbrgHhn-v{- z6%zWfR*r@oUisQLnMjJM0emI{?qr#K!XuQbVGFXyA53W!@vq$3jMhzpKsKMKO zM0jI}KM$+~NgG4pCnhR=#AvMr?}*kK3Dg}Z^_8)&UlrCPov}tcnLv$}%@2T3#hj-r zXIc3RhAATX4tSC3PLZn1(?RWqurfXZdd4F_dX6Ff5c$ob)qw!+OyNKcnOGOp!(mtn2HQSJ6Z5+rwTbNLB?=fd3TY0P{=JUBM%R8>ab&g<)Tid)ku;O1NcjR1PqR>ecgbhiVqi-g8)HCQ4t*#dsl7xRB zX*S*b8c{ZMg(AOz&LpiQhD*HWIT2V2_8^DP>#1pD5L$%!c_& z=fi)J4AtB^8=xYSvC-3w%gc^o&Z?WzaDd%pH^pw{&rv5f02R8npp}uUTTTW9CwJ|A zjY?##zcX~LN;!dJRQJh7gvm2p9r6PLp$uQ*>;G%xZd(pD2)O^|#`O&!D>Q%Z#&w5} zePTiwh!D>TF{;tKXkP>>?0wvHwLF7O=1)lX1tg|lFs@f$yoSvX_kXjv|Bu1p`gLF* zQJv!0AAd}hpaX_0nJ_Oc+q_n5ABT6lz*|cI=KSJr28lISmlwt4ROe*3Wp>NX<+8LK z_P(kIB9gcI(}=}eJqWATH2)G*dpr@}r?J(eD6og%6gNS1${4L{^XxAYx}a;xi?wK` z5SuiXg<~`eZhwzD;phJ$D@IXn~ zzljm^zF09(i|mFyAVUz(V<+~JFj7`lN{{uN2jc)^8p_GA>X!0;tn!gtvCt9a9ZX2}_nR@>TXZHlhRs9sq-d#u zinc&q2j;#DmbV)>n~CjxVwG20Onh@kL_|1Vvgc~N1+<>`HM2U6w~MXo%|Z!13zuQ`}ld|06*oR__pgYpfirj zYmh3Zmz5c379SjTaWFt#H}OaNjzub|64T1?HwHj;Kn0f4qdaN6U_jzVz6e0x@nEhl zvWReu{pTJ4q4gt9n8?uOBpfUQW|9JG&8s^gC-~Sa1c0acup?qIVVCe!3Hu55ATbtJ zKoz6fx|ZEaulWuT&#;F?99jjYTd}gk>H|h!6Jb`;+CnTS*m@i~Gw)jFu-3nlwrcgl zCAD*s<5!m~mtEH&?^NR^LHG5Td)$1L$W&KGMzc-Vu(Nqa{1r_8>!9aj(8+r+7G)bc z0_2D2W+Fo@admFCz_NI?6^$H4Y9VyW5g_LG2-jh}$-;-%z$&*l2DJ-N!AD=>+^FmB z55nZZtGcG+l)s2Gl$vkBeJ8g=zPO-Z$;_EY>(8ghwOb3G>b=gJ+bbWR*_Nim02W;; zgaQkjj&q#0cB5++CzvO&oDSO7)hAL+ioT_Dr3KX3At|D=*l-rIUa&PO6(bR=X^6V+%d6Q z0)^(6?c&6iq&*0YachCv%T?ZrB0Y}%6N}X0h1yB%z{8n}mHgSTSCmzo1RE$jab3!a zSaACwUbLO$kgWv-68W=wW#NWOC2pvP?1xDv*fTLNEEwv+yKJELW3yJTByO?QA1;en z>JMi%O)BuWZM}d;sh2lTYc@AcTHX|2ayhM(y$Cn$q$|X- zl_Zu%EedMBUdklIer{Ft>*ZJ&JFzf=pI63y`xk@OkJFzxI;0+?^WQJV(^aefn_a%x z$0||Mb-O$$stb%mMa04G`OE0W{Ez9V2Pu7sO&f({DR3He)XT5LPDo@%L6v90B>fB` zqMdkN*Ecn6vJYK__)s98jKURJ(d33QDGfZ>lQ%)C>4#MGjtmp7yjOQRo+45=NT&@~ z>EgP1PTr3Bu!;aHf}0MBag?YP(KuQ=uM5NIajmqNS^yfR-Ghbqo9l%o0;#DYvD1?T zO9Y8c71%uzv1yip#D^`b+CpXsBrm@g6IJi`{giJyGRwfi74O*Z8HuDh_LqDHa>t`1 z6WXDfe6^rfQm;N7T$;Wk&XCz2_a2`_tfmRw__ZsE@LPw@gXiNLIxpBx#6q$N*Lln7 zb%>&LU!WgMI4YN*O)wXKTkszb?@uQ>z|Bd0%?a`?SQF+6`bX|aO?>Xzt#NS|a-(qd zz}1=Cp-dp^%gOAcSS}LD(wANnH}r0d&Y<7agkjgZ_AoA_p#UA*`XQ(q{@TA?(_3pP z@RuSmyyt01=k1}8=MjPjw8P5?CO3qTW*)LHJo|qmWIcs!;~^>&fZ9eOZXP0qBR@dM^AvJB53z^erI0=fN#h|I;Vy&_>>+#&wD%EE z>Jb19H3_tT5{pa=|7*;d8{QRjt`0ZEoR5XKQ0n!R`gcvDiW@1Uodc`vs)Ij2sYI(6z))v3DG_cr7x=O%D`%eY&55T_4u z%9iow{k-A?(|?%Zb^E_&c;)_otRUBrN%nshn@S9 zQtG-pMXG{QixQ~@N`3h^)Y(jRK79>Yci;X>X3f(56~NS^6PWM2Qd9DYb;G(7AkB>Y zfXHEt%q0O0NYU(Gj66gF*&x?Vc?)%vQXMy}BIZ9?{x}jWkAmt^u;nOrTC_sHa}GI^~`E|SUL$z-)mPL)ZoOcu$cT_#7$!IGJ?Gq+TWm z%Vb}fJWD1!$>cwmw~&WG-f)9DPNqLYWR$qO7NblpnS zFIVx{wVLt{5$Bt$TH@2Wf9LV3=Qi-)7m`!5i24grJBfPyDjuY#kd*%& zaQ?tJtM}hDknr~XZsgE0*o*irROntoGV_^CpZ)!*)Oz9suHy4oO`N^NDVOcKYPX1+ zAAs)=c71UhEgsv!8A8^qBI*L7Dv0VuR5MX$T*ZUkb0pvAU2uL{!k3X%#BmbmOU4Lc)Gxo1RhTqv3U$(L{=P??FE7;T}`)Ww^_ltR`|NcqxAaNQOx0JA=#JZ=5>8IMH9iT2H%1e}&2}Viq zq3K}mCZ=OCZ^<32MO3CYiTA(Zi1XA+iu(`NiPU41Dw~0_eLh0jcoXkU7jc}#`Ib00 zETAezPj6|{{g0CMl>au%UqsCQ(|O^#TUZ<>)+{2?*S(%3Rx=BWC@OLbnV_0T8zYAk zna9ZHUudBNxo#^}Q{BV|^;yIjz7w1ZaGqa(0-JXI!zbc3XI=%W=XErNo?k`3#EcX=;xM-X>C=TdF^H#~46 zPP*{mDb^QOe*Z+2XJz(3fHJK9{cAO#UMEUgh$jZyulB3`YQNgA_N)DBzuK?%tNm)f z{*x~=9z>f5m=3rIfQS5>`UBIo`X4IkCBRm|t$=F)mjUJgrU1qPw18azx_aOzUNrzW zU=qL&2m_V^mIGD+)&O1wd;s_ia178BZ%)>Ksgf!IB>*cR7tjaL3DEq7O3H-XR^S%^ zj{xolECtj6Dgj==7=Rft2#^El1o#>MX~7=AcEGEEHJ_s_U@2e@U;@Aj7zF48=nVJ~ z&*pp$*zp<4e1Ia3ZMkw1PlfA07!sCdr?1ND`5Rzlmn~+EC(zFEC5skCIQ9)%z#`# z4j>cI{0Z6%*bDdouo$OH5T^Z*=3-+u@A2Ve)_b-)_H zD!{FPC4ewsCcq0A4KM<>!2ZPb>ow(p-^Bv;RRPjJHiUxX z0}G;>F|qopXl68J$ZSOo$(h*{rxG(E<*b? zfak|>{g;nvyUZWQ@G?KG0ly|RAHEH?xCj0yu7`u7)C=BFq?VYxU&zP#v1n*qc~v+R z3`*l>Nb0P?l3H6SsaL@-7gr|Nr9;|Xne2RX_x4@EV;dA{19 zZ&omn$SVld)g|YkTw&4ZiDQAMPt{aLrwwfghpHGgY^rvIEq}zNz7dzrs2nkD&?0b{ zgx$_D%A^w=D;HK?j@--B*d)Ps3*CwGxjY*lm2Jr# zB8(d-w~5SKTe*O^l9R7j%?O3vtCIc!Ab(2?9;;fGv>&fyL_n7Kokd$@w) zayCxJR}@!VB2*^oB`J;_y!}Pv3oG4ul#(-uPXmybt@AaYS&6!*+ADL>ti0i}1-$xU z1GzuPRJs>cIt$85y=CKJ0!x*Ym3cWkzr2VMql?BCkB3@TX3WI#1r^0*NF&EPp{$^& zaN>j_)-UC;S>*xdn@YE^zdyAl4YRWUKxyiTJcV7N-I#r?gi)ugxTxNbs#?{R*D^>T zn=CjzRR}VuL>5Z6gS&>?kz6p*CxLo@%OIT{_SH#ADV|7?O$-{+oy=*Owkc&WFT$Z1 zLP9DpCic7+$>I5iK?-MC^HJbGo8=DP>b9H$pi85>+V&Y5_4dG~@G{7PFsYX-|9mFb1OaqB@B*gMyTO!2x1JwzW zKu4nC7_Ia2JgY*SZ_P|@i=1B65=|D#supn#oTfGg_?S}0kxC39lmBPmh0hhC}Ju5J~mfR)k;qn*=iMiPlNtO8uHz)gumq`g{(%{zXgIyWV;L(^E zQR!oxJ$Y=g#5^B&FCSz5Wnp=YO?BC)opjjJYLrl)(4C}@EN!D)e*|BryCwXlm8(Sb z9>AA8S-LWh%PZ{~M0P8h;n1MhhK%5STRE+NVp(ok?;L1hbtgIGqmKL9mF= zmn)J-Oj=v>obF20mGB4pGO^y47LA{npeGegC`Y(19zUi`UPGj`<8fGFaehhJ*p_}9 z$@@#W08DjM_Mb+)%Uj!s2D_Z@VU@K0ky)&)Y`0zMs<0;HkCJ)%d%_y^C$aiqZ0y=STL&T=h95hFRqwTHu|EX zf{Gbh(ow(`@1l8u`lu$r_gokHvlD!-O_@Q3Sj^It`l3}enkru;VDFZ#!BtUH8_`5+ zLb0GwQL^Hpp7LD*hrXd^%#{2=8Q6HGE(3OxKF6*2X!={^CO?y*np`t*Z=91Rc)rC+& zw8mGj3AI!XA2qU)gBJ~!Rfie^VIQJpo@Puaj19Cu5ROEB_0(+m1^z>87x?NLf`Pn* z8%E2f3MY_56fP+D)uCAt$W+6Q;bcDO==?ySUfE96LIt_o*~Xj3#DrKd5P`C`eMti? z7+}TgFv@C!#O$AFNTh$Brns6)QNN=7LEh@>S~LvxMZ=BUvk5({conZ54o0aUb}0dW z9(4SwTf?wa7%%oUNyZoQGBp8KhKonYV_^FkCn8GK!(S12nkvK%OI5hGAv#iw;Dp;N zAYYF=*hFstHw1mP^$|8O&=z7wqGXQT5yMA}7$J{Z?sb=DaJn74Vn{4fkQ(JBt1795 zFUP}dQm5E)Lr+_UPp-X9u5#W{g$Q7BmBYo>=La&-^fE_MyPs5f-&V1O|GWFhpnw{ILCU;5MG9NZ@SBgQNVH$^Y{cDp`66?sG+JVVH&iQFfT66rh z)zyehI3PqXAvbxH4so2GxGcL6 zWLv#?xll?gpx6m8m)3HxItJ5fk7n|92puCgVSX*nw%9>WLqot9M)>6$2ShehK%Zhw z4Hgyd$0$NCLV2(uLau~z#ZsB17iW;Q(MCc|g8zjC$unNZc=CNW(wEjrAYNF8w z`^b?IED2R)KURYJKy)N-Pv&6Rh>WanXc*BDjM1zfN%D0#u8M~2bFk0JFW~0$xF#pP$)ccS6w)?3T08mzSUXeDgxT=E4g}e-tCNst^+) z#Oy6?q?6T(+6K_~uH^b&U2$@KiSx*s8zl7rgWh7n22>}ZedEyk7<>}Z)Og;N#NqZ2 zNm^@?kXRB_BqQkS}Qv`Hcwrek-Ex6E?*y$mipuD;~nbw0Qxx_K8u#2ZiRFIIANrOxpWzr;* zW^&&B8~8Z5VZ*791LuvBy2y`!5{}VXF#KAFAkR~Ii8E!gFAy#9H6qsdxm)w2(Qqwx zzVH_FDRshohk5;54xM`a_J86W{biLp)>Bf?1}p-d(VNqoL0|g|r)%ry`GSb5IR2nG z(~vlz=V|$i6!k`xdeR9=-4WkC%)+e}#wzADKMkY*p-3gkR|op;pyO?4C(=%o?SXPs zc4Gb9`p|s3JE#gYh{Lod0>PQTVwPR~0N?K?9$->yzh zZ|s?zuFm1<;lL&U@m~afJ*SnPK0H0Iw@Up+Z!UMiIV$ylbCTuWz5scG{uuO_U}Q`< z5Rib;<&%8D7^BB3=zMZ1YkMGE9|#)sd47B;f-9kSXg`%Y50FSt20c}gCY&))r7o?- z_bHK3byPE{HWI^~YQeB!2s;SVn0qC)v%c)dAdl;rIYMkQi-}0#z{@DB{j763vE5vz8766s$ME_Luzsz*#Bz3}X!4?%2b)?IrmAoXN$+dc?WObG-TJ2{xGf!(;eQHoE|7cF(GfqSt-{r{L1EFDvEzy_y11lte3|#R6Ur;_ ze=knC(P#60>V+=gbY()rT5>hs|hg-uwlPmn~d$`4v~T^v8|1N4-bY?z&xgHSaA%;&dG=_Gh6(wcm<(xxFsl0gnSVdAQEGx|~9xrnyn6-Kv z?qK+x3O3onTE5IArW4KX810GKRP5DBcJGsFm2U*8t@?avj(Fz+8KC%!fm{p>YKRPfab7(#VyD~HvI6$Qs1 z@N*v~n#}f}{j#%_djREpe+0kvU)(aN3&Nl<2(<`jvqdLV;(h95iWSrthUSZoW&HwQ|*1!5e z`%n7miH|a+%u}7#)k^-P?M!WVD-Luh=+&P zT@<79FT!|QhWHKPS_r}?FW?e*1`dLs;4XNLoY!jIpFW@KA1D3yFZw01`*5b?rTs>EVY#L2v~SPa zbW7nA9sgc4cyESDMbGTmE5+eNc{D~FTCX^vt{mUc;N=I@m5EbLI>)SRNC@b)T0`Z8 z0NaqYh-lbZXM=whjln}Ib?bJqvvKfMY52$SGeMsL66wUV#XVo$>?@bggcsi*&35Z!>VZ_U(Q-efyeQ>7nw{##C9-IdG$r z$9+5;yv!r%eeKATM*!Uxs-)h4et=;B6Tk!bEuabz16&JO z3D^X%FT(TnfX}YLv+DrqO1wJ&7z!`~+yE~i3b+Qa0`L^zRlruj4!~Z(VL)b+N;)5) z1>6l-1$Y9m5%3;hH{c7v+4zz50RR(VCLp{RHUVw{{9!Tl0}cRA0M1_mp8)OzBwxHw zl$azqPQ5I@k&^o2wH^{1n*<$18TG58zZ5(Tcy!*I3Hs10d^~HxQ`(?!O5bRQNPCH_9Y6t zw6CSNeXc^Lq79i}!^$iF+~j_^NRcM}%s;53b>FOhP40&UB7fa$$^CG-!p`HTV5jnW z^So3$w6Al0RF?)c@kYI#T<3#|IvZY3U*}qd%;TSw5wHgq@@_Ah8dX1qdXcIxqmi-Cf;6PrM~5gI@O!f*SSO?V{Aj_VaO2ugz(XG!bdLwC&uNJHp*@nWp|3Q zdqvrA6lIsUQT7*6w&Oy%t=l)9p6@mlr24MwUuAvAH*vfAf_EzV#uldPt5oPK0ZqK% zDe7C3M&Dx!eJh2&^{1$B)c90=#})bx2z^~QpPIf$(&#JMEbDWEW6%I1eu93@uob_KiDi{z?;c!y7Dw_ z*)}=ZmdR66ZCUnasx2!Nw#)=gva4I!a?5Gj((BS>TVA|0)s~)HQf(QyMYiRDu*C>o zQhX4$JORw&gTOBVx2#)R+K3OL>`qbU3t+Z~1@1t$EmEneyc(EnI3KtZeV@CC>+Vc* zs14nPi#Wdon62N7xbDhDT=#6DJ1qE@3*E~^`ZiHV7pniQ^mVKjbv(OBv{{sWQ{WE- z{zTxf1^$6!RLb!g0_O}5xDae9REh(^93Fvuu))-z!wQTQQ(;Z&lPx{z>5XGUf??gen8;I z1zrcN1%6H7Z36%83f^}{(9zVsU`IhAQ_Ab(`R4MB7OID@C4CCi_ZRrt7x!GW``Y+HI$|u4*4iZI6GOye?FL zCSG*gsjV~PA5GP_Mxk$&(D!;PedDe?y*T*EW6AyEdptD`_I)Qc4i0}uj)TpxfvtV- zB-?VSuw@o7m6>y;y#H)^C%u2K5HhU2ZOGiLklERW%nJ&c5YNq z@2C3M_@3O}fuM<3_};1Y*|9YGmMZi`g}&vj^sQ?;z4=_QGkHF5-I+R{54@K;pO3#M z&*#@clWf=blWo~@nzqc|m2As?q+8pv;Qdrvmc1|A;ss5zE8agfKX3dv)z1fnKDK^? zX6-#ieR;c6^*KL~^$iEj?g4<6`VI+S9c$wG9TxL;bYCp5XNx{aKPDeg%)xaZoZh${ z@@bm(E9~7Z>^voQdy)c4Th)0-Q!zDu4Ps)MO>WBHEM zxv@&v(vj||L6hv7R<^t#YAZyVe*@eS|J#tw z6|x3k(&-R*3^288JTTdFiNJn=Ljqq0oVe#$np%hWULf_%^SfX8ndes@C7*dd2tMJ= zoqUbBN$6+yb~{t`^Y05%&tk(T_?hvzowDwW!DHVYg12UueDa*L8^0ZM3x4eH?Aegs^AsUPbq{Nr3nh& zgg`?O&#D#UkvVCaM9-4ZyBeW-yb1)_V5De)B;iL(3Mxtx&vC_6c;c%xTrDcXgPIXWatcaP2&lz?ah1HF;=Ab z1N~zNZq1+1LKHZcK_Xg#=Ni%aHL8p8IvP(5&)_2+jcdr4%uG*VaCR{sJ!w&= zCT(CAM8m=2Laa(iV~AD7;D?u0)H4{J*WtAN8y~0$`|0dlu#Hynnllr11b7^4%N<^C0zvB z1U)oEJQ-0~Aax}^@J^|yK2}Epm~=E=qyjt&%pJ(OU8+(R3vV4m`o!^#w*4UNmjw-WpD}F)vvX zRC$y|pd7SyHbPAxToCj{A~ZjtxmwvU=|?{LkWCMq=1Zd_?%|3M_qZh8mBHU}!>g7E zI8Y`eze#!i^mvOd9-8LJUXvz@KILx`GF_;BLK3$azmE{ckWb{!1vfNQGgaaOtH&wjdOQ54%aD>3v}#S4#dD-YpZgh@@ndy(s4Y z>!<+_bhpgmiRDET5_5kINuxq~MG$WD(nG}teZJHkHP8>G_G2Je_Yms$fv?853XSS=EM!^nXwuadO%;##-^Bqvf#4^QJ8 zxMIKUCX8bl52se5IVfJ7*UJ<9~!^x%( zSr6A%&1DRLx|jST_mNuKM&8x##Z8hk5}Ba7tc^ZD#S&?zO^)C}pn zHcCvEuI(_n)*mRS@r5fwrS!hT=thLIGOj08T*_uGN$jyYvs7XiHm}1Z{+cSF{hrOp zqEgTzK6=Sv(%BhpzC9pafIOH)uXivzVe#yMv@l^48%DT;WV<5qx*}$4cj`m3o+1Qm z(KD!9xQTiVGIKLp{8@ti;X>{2u|CU*Y};(B~_DGLj*6z&VKWVM!LGW(DxlcP)NW!Y|E+=a3!A z4~OvpD^j$8Np*aMrwJqB=MR{L?N|HNezjliSNqj|{qMYT@mm4+<9z=wfVTnr06zf| z`L*~hjU9tk>Srh78UJ1~|H@pM_6Yup$2iXOH*>oh#5Na1~xM()5Vmi;!3Ts7nZ^t~;hhWrBK=zb=#H zbbc za3Sz{!1q0)QZFEzfg7nF;LGTFNZ{in4;%-s1Xg8aGLu)q;F(Jrmn44h>fui~zW*VP z7yohZal)gnXkvIZVrdpU|VqJzLRCi;l;v~FU*(na)T zS3qZhy9k^u^3G7?|gkOGMp4 z!LJkl?+*R`B#nu%u(gwrZxS{y7I=xsze?mUB|UtMvtQ}DSETP3_N)^1{YmiuBJA5H z@;?&!eX_VO*5m#2bU^Vi;{`b;R&D?dr~r5YC4g~&LVy!s1Pljg06hU+0TST&dX@SZ zpc!xoZ~*WX;4{Epz;3`!zz2ZsfX#sQfHi=}g#0SNO2Bf!GC&g`3aA120W$#=fKdP= zpi8D4yYr}Te}SDnGENFtii_5UU)#IoDfmqdoIdnD-&1?bE2Mwr@)rJU<(pvpMu2jU z-40?(y&5V+MW;m`V~@G~WC4EJZ?F9&`K_!#hJ;L3S;Zah5SvOn}~szsPr+4k5{GC&wpcOSrgyeej#lq zbQ-l_gnKW+lMQ;QJ7}t-2~T=l+^V%1-hAu=ywLg+vtx-g2O9C~zF4CgpfLuWwMgdy z8t@r~be*&SX+Pvz>*^|9fc-)j7Vk+{KFUX>8h9#<*xv=8i@0|38*y3cvLr28=$b67 zEIXyCTo3FnWpXi;A{<4zT2PVH`q7qNiuwa6>4R(#wI}y+2I`>ao_Z*3jY5Alq{FN~ zha*)Cm=8N+(BKChMDAQ@)gV8_{?C=UMCNV$G2cPSO{L2>IEn051*bd1{tDuT4ofO^WwcJPtQOYz#$l}61m>H+41R9%te+QA9H zqUdSXDoUMFZHcQN`|VX4H(3}rXC?gltN!vPdMIgRj0fhH`Oy2r@X^2nM%1M}>2HfA zf2f=e<>&yLKxDseD7F6=qyO~@I}?3PqfSJO>Qa2 z83zjXC(Xoiijwk76gAdxNl<=p&_aqHD3coZjLNu&R!@LU_S9GpxqA`of9A0s`lI+X zKyoBL=uMgpXjwpv)!CpB`Nq?4?p znzp@n8mk}OU-$FsaHskpT6a5Z@71k$fZn|{8nHg!5##G)5%Y6YQD^csAVW3f8swIu z+?}G#AhyOt(UuzI6o8JTlvCv{o-$W*OMP)ieLpL=I4S>ONj2qKRZ>E>411|mIhBgbWhCTio>BZD zkEF_DUZ2nA_2UT}5;3=xWCzG*Nku9<=JO*$wgS>&raeL{G~c75rp8uf`=D$A%9>F2 z(UkEKB^^l5#mYiD4C&Tr)ZGn!=`8QjAWJbX28`I7yf4m|resN(s^Kbg%f9$x$TVUM z@-{(Ay8r{BL6iCt+FX}0G>s*zCv5#v*J4rV%^eNp7Qx+V}!J(cjX>0_E-^c{ND217n};cuLq&%4DN_ZKrjtl|>_I72$p&oh?$S zdcS3QpZ*oSiPogHM~n7c+tQwLNVj z9cxZ9R#M9?XXV!Na;G?kRGvg> z{96gt9zuyYA@A1zpYK%YUbH*faiL1S7p+LM1Dp>I*Dzb`OB-pwmY7#$CExdwZT!ws z-a%6oVs=)EooqE(g%m6YM7eIrDDO$Jx~08a8HtED_`m6w!AS9VH8=I19DW!8KXjI+ z&r82Q<@U^oOQQzd7)iHy;^cRU@~FUt-p@?YmD~$*9~829Gl`;9>WslP5W3J)iG3i&nxrw5 zmHAX=F0fjFibs18Z9O#7gnxvZIHC`TjT<*g8+UJ%4sCf@%FN7U|C>_Ru3e?G&N@rV z$;pxW_U$Y6@84e$T4k>q20%3ciMzG};-m^- z08|6O-?|k5ejMpI(($dlD)y-c+yx+BoL6r!0KhkZZvY=QAPF!4ssZ3vgAW@Z0x$ro z0pP<118hJsfB{eq0DtRN0Qhn6;^4)>BRk@8-aN8|eeMEm1;lxi4F&-C2Jj8w!xoqT zFaW9n;KLRmfB{eqxC=nMICs@n0|30O;K2r%4FE3=UVJNRi{rDEyAbv8&sO1H16c%2 z={R?FwE^jBV8~T(1sz9O1E3mk7l3rdd3Uh7tAWAa3O?#b769_ZkAoivAAW#1?+Nk% zvw(C{R~i7|8Nf4ui~3mCk{#96z~GY|Xc(#i7y#9Py8w_!g{T@}08|6O-wHl#!9M`> z#KDh)PyUF<`DkFhKy_ls7?3s~4IARHAr2c*1Ykhj)xh9aqbzKI8h`-+K5U4?hB$11 zYJdR%K5U4?hByp}$Dtz*UL3qQT3=0lR1H8L(+!MtKj|T9#*7)#{Q2{xYp%IQy5o*J zq_^IBOM2#+XQYol`bhfw-~TS{+qX~p`s=Ty@4x?EI(F=sbm*UPY1MuAVII?rj>oilc9P8|B0o0TxnRLynU?GL{`m#7S>i9t)K5^*l~` zDFz}c=B;OO5@`g$)eak4#5 z{s+X#S6_Yg-xepcaq-B(uk0h)+3Vx-b!5$vr1Y9KYbcFs4$&3QUXv^@(uer9zPVL? zBE5e7x9m#FZ^o6qo29=M*Ab+7J`bEnl=(-gzAlt*W@RZ-igYs%vq!$Av>YkF{hr!; zM2?i%|Bg7>zMpK5lkIWxKQB)Hd-szm*Ac*hW4OL$NkmHgxfR>911yb5nZ+0hc_ft# zq>~v)bA<;I>EsLPy1JuT$Li{MdUsaV_s6obn(LZd(pg8dvQWL8ZvF;EM7j(6d+=aZ zQu@Gw?~~Gppsw|G8vDr&RYRmr1ao!LHo%6tHqd~Gjm61rkFAzKpaEYJy-kV(j()if zX~Kxd1P6D3-UE6M=snWGgI`KV0dc}dk4gvQM=?GK$Jsd9g!TcqLp%JR1RgEanW{`& z8JTLHmOSDb#nT-;c_u@iZdf9nfwUj86+73Hhf6ou)8!20*>*M@9lF|opK6q<om?M>7Bp6ia6Ql|K~WlbN_+%IN2U2+vDVaP@GIUoy3dX;xrIphN2{Xb$Kk(B1%%a zH_~#Hg#1`#RHX9Cs7Pr!D)O|5it()VJl*mw%@LkfMnz^1kBX>Jq(vA+6wK!K@(W3% z<@O+n^hODwjC4Gm9x?%40euti9Cz=|qvxoOr}pbG?N|HtKYXd#`~Ffuzgs`a*kt~z z`75)=QewHpGS9Nua=qnQ%Wlg#*1^`_S%0*4uvzTCb@p=AyZDciEC71iu*mq3>3P#m zQ{0qmE;N^#E6qXk67xOg=geEo$IL2Af6EX{rDcm{hsABZ#2T{RYkk!Ey7dF=0qY6t znYIgTgKY*|zHO|n+;)j=rmex|v)9}IXn(@K$Ns$2@9OHF=hk^%^StTV;o0vw?xBZS zE9f^#wC8IJv=g-VXjf_1YY%CUYP;#a(jCza)L&w{#`KA4iFtrUYbmu%u~b>sTCT8t zZtG$9*h}np+xt64I)*yuIu|%!alh;Sksi1mh2J#+%Gd7IeyhF7pf+A+9A)Z^cFZ^5 zX#SH~YcW|SSQc9DvOHi}kCuE0pJZ5btmj%Uv^uQgtqZNotan(SL#zH~{lxmY^&9K= z)*RcpwgI*gHmj|`_FLPfwz;-H*`Bp+v>mh^vt`(?wExAv#r}!?8~ZRvp<{w$kz=uA zh2s&&Gmf_%A345o9C4_eZfAk>5@)UR8t0wPd!6f?JDguSe{nio`L409Qr8mKYF8I` zgPVR(W;kqjYs1>xwVSk8>aN#4W!_+Z-@4B_*YTF)0_RVzPVQUWFS{W$ll_*1)KS|@ z`=<66?K!$@^%ofHOkY|KTaH=Ix300iZ{2JCr}ZM+llGVGqa0%$C5~y1+ZT!_H@&uRDKs_IFua6)wLk>RRl&(e;dLyK9&08&^N~#qOEzM)!ZY z?{Yuve%8Iwy~W+lGt^`E6nd`ptn#e!yzbfN`NTsn=y(wpduhjO7ie$LKCFFCyHWeD zHcK~3H%E7+ZiQ~OZk_H8-Fv!EbU*8|_2=kK`Xc=#{q_1c^au5shVu*~3@*b(hRFuM zq26$-;Q_;whJ%J&W07&9F<@M1{G;(n<9g%UM#+?G@|zk>_n4kBy=D5?^o{A5siV1v zd4&05bFDdok@~)QpZQz!3A54iTZ_-~JIfW8-&=0CJdA$sgkCmU3#}DapS9k)5dFN? z`iAu#=BIOPqivIIH`~_P-nM;h``MOl*Vqf~6?Q*H@Duj8>>s0lRgMcCqa0qxT*ozz zI~-3tb~?UtoN)Aax}2rx+ojG&ook)PoI2Mfm{q@b{mHe#^{MN7jQYNAt9zV#qC4Pj za^LKJ)J;%1(wZ?lrfX}o ztF_y;pKCL8J#_tbBXv$)vCgl%QFpKI3Ehjj9lE_bjozg%)lbt$^iS(w(QnhAWymwQ z4dV?F!&1WwhK~$i8jcz=jb|B6@M@WHrtuErOU7@FzZkoj&M^%(8BJxTdearA-KGwf z&K5Q1NRwrmLnn zu^^&) zeSv+k{d)Ty_CMJFWPjYg*8ZaXHpktLha8VOo^`zFcnu?ex8ny#2WNL@FK4cEq|<}Z zTjmTqS2&+`K93l7uB)HxG1qgh&s~?gXJ8&(=YGrmH}@CrGd<_P!%h!Plu_{I4DAcr z+l=oR_Zq)69yMl|I-9zi&NmG=Sxuu%<4qGy0aL_uwdr2dL#D?}YfYKvY_rM%jGC#9PfP5EmanM0vyfmbn?RG0W1`GTdUcxGW({BRu!C$} zXGB^xB4eJ-g%MV4n`HZ)?J?V0cw@Kids_#45BqucDfT(`)%K_D&Gw({-5qB;&UfTF zOpeixagLxP=D5o7UyhqF-u~ct!0{)?8}P=Dj^mDQ&K&2t&H>IL&OE2ZneTkX`KI$j z=N`nBgU)8m=1#7zuHLTmT)CLl9#@g;B3GH~QdgC$!8PA?B}V58*CVcHUC+DzhB3O| zb=YNcm%A@weG0jf3NRk=w%pauwb@M zG1MADhRY5AWmts~w#o3Rp|kNkqsv%eY%s=*zsIcov+)VzE5=R6_l-M^pBg_meq%gn z{K5E>F>dSt|93O>F!eU|HT5$MG7U3nahhm1jW!jVCYh#Ume-oXrbVX3rt3^MneH;( zZ+h7DwCOq18>Vfh9at5B)S&04e7oKJm(HEWi+#$1nBu)usZV*cIc z2hER|pER#AKW~1?{HFOG^A7WF^QY#o5G8&zA2)ZfWLwU&46_(4ZcDMH!ZO_wMATSh zS%N;i*>b04mE|$Z^Olz_{cUBoN?W6CsqH6QZ^wGan~q(cFFn#zlJpt<%7?C(ew^N? zuhU2MP5R&Km+L>(pJB+s?3)1}%`;qun0CM6Wy8mY{f3_m=Nb!*Q;gG%uNpr#HXB2x ztI@{W(ZZ)pubIqR?DZB6PAJ2kyaa`R-JXL^&@MBtvlAD+cB#i zx2>_gY5NYVP?kLhBWa|4v^{2DV!y?Hm;HYGGl=|eV`ciu{u{?YhsQDA(TH)h((zZ! zCY^J%bEla74X6xU2wo$C*-`&l=PdCGIl^NUB?&ezIJZHe|)?N06ah=r?k(+sZ|)*COh=q-g#Djkpyx4rL`7v|7q*yo%)!sl z&MbFNx6bW!mtvK;6|3$2SSg-yuXn$Se%R&C^^Ee2^^|!kJX1WCo~u2NVi&dD^MPk4 z){DKK&oEC9pr=&q{@JW`YDZ}cwd1r;z@iVdA7d}{nf5Df7o9;D&;@l3x~Oh}Zjr7@ zw^X+bEAmd=Zmb@k>GJin^y~B{!+gU{hUEr_@duOITw%T)YiS=#KkU82mM1MgSh`tt zR=4#w>w4>J*6r3+wrdzvEc%39a&T$j17 zcioNte9!d}B2IVr5VY0e4!L9QYutaqdia%ls^>1xYT8YpMW1`6T+Ju@XCpZ**PsYJE?AAAMiFMn6!Ws~@hPr(cBGw^YAO|DFCPeNV%= z1`Q%ruAvxf;6sMT3{M%>82-QZ&i^@z@{Z$|F?9|+$3Vl(m4tGIh|!7oJo`Mm_dL7L z?go28pvM@7w1gpO(1Qt`v_=ywVsui#kg3#(7&QX{4uKkLklDSh8T{h|MXGyC}iGQ0b{KJPCNGe@&Cqtk*7IqJ-DrF#%L z=;JJtp*&wQmuKf>pBksIjI1R0lOK>8@-W#-9wk2^Pm^7wjr<(Uc9Je~1UadP^pUgV zJ)F=b;-@xULEqAb;NH_nMYEBLI9m-3+01?not?*ZsOvq(ea0GNy|Kyok@2Ll%jhr; z8NYz4rHx4_+MMwG@CIa_m!Tf#!k;7E-iq9Fry#-=6-e#dM62i&N5oqq4VS)*+^)&* zA^SWe8)d7RG(R%0nJ=nJyTSR)ne7%Kmt=nsZaVurj@tLN_1Z?L+-7ZSPU&957OiG$ zq5i*w{$F8N**Ew?emh@^=UmC3fCIGiKBSCyp!`1l7N~tt4?*cQ-Gt|^fzEHzx9BbU zuzprAg44FcRX>3yC&T{?e@iS!!{`5 zy#(*PXkIe^W0qNlwZUq%-aumb#8S|>wdzszf;ysl)kSq#-DT^xopnOwg`Lg;=Y40= znR2c=KG%;Fw#997pLSn%kGdz_U%4N;zVhqm$;m3xN?szbkk`n0auMgWfG(jG^nUsP z-A13JZD8^M)aP~V(%;ZrGDx^S?9y2+seOTS?1t)Jfir%SFG23wz@Otsq5KKtkPM#% z_gkz-^tJkCxWKdeKK(F!u1D|Fe+#D@)dOO_2thMlbdz-=hA;9{(IF0t<49n=IK%Te z#ZU2trqRIs@P)e(ap?I6#9#1rTb z7s%~Ml$=WH&^7cysKh9JkA6=5+C1pxYHfp7r)}5vX@|64?X-4Y`%=4&En)XCoz<}& zY(I-bch9iDvJcoeyToSa7`U5r?(!{sCm7hzU*)I3!5KcrQ+zJ+<{~|e^Z%i~LvKaa z`lJ4tKBM1^ycIOQ4L4t!%UsKhCb&q#cpmBfbl4C|tim^V3h#da{Pv6ALx0Ypqy0ES z+(%TA{eb-#+;7rOI2W9Jw-_x)xM$sL*SfAnw?R+Ok?&B0zDSSKQ`CjhJg>#ISCO}W zgPk44cPYX}@at@poo5SqQvXn&(yu{9i|{rpu(2`Yad^TD*werC7ON4dZ@D_CPOD3Boidx*(k{1`!y_B*6jJY}_M6U4 z?i_cqyWV}+{j>YNdlh{wFV}+?fZYvHoMR-925`dn(r4&CdXoNyPSOIjuoc>I?G9Ff zjMC1&U^nqwu(x~oUVefv(0A!ajT6Q@$Vpd?S>X~qp(87y6HT%eO=&-J>}h<}E0US_ znd^|`pD>?=ho3R0kYa<@A}hO%v5~iI*8n1sl)2;(3LzF|7whE?z(H-ZSEc@ z|0&!HjJoIC3+`n%`{RMtxo*3VP;!7ACnw1tpphStkI-{V@clQ@M%sq==)x&nqSxp` ztySyPUeS8sUvF#gV(-S`0RM)97O?qnfTc{Zds+7X9`3^5je**F*1($BcGk>V(2m;J zUc7$?>ttPE`55c|Kd%^L36^9jmImJwY?5Wz6q{x<%*XS&p9gpWFZ{|&2)Gwq@p5Fm z3LfQ^yb4*bhIjEeKgPRx5ATI0_M^=X@*zIVNB9`Dz!$&n-6`zzI5ck(J3WQ1o)JEo zFUzpg9GOqaa%^^mjN%-sWHo57mE01R!gr3KFGSH!tE_5dlv;fCI;+p>2jhd*kTs0v zKV~JYB$P32jaw6N>p+%65tF&sZ6zRMc zK9zyS7pRabQ$)q^7aH(4n(Y?59htB9#@`A#G5GAbGvgGxLAT6RNI(%}pISHOZg<<< zy>2`5LJ#ub(2X24g=FX(%**}QZGaS$5Gf%7DJV)R(Vm;hUeZpAkrK-BEVWrh!~S+@ z-P#~}O-jo^sROK#1z9nODTD8pBj3hALm#q23g@1|c?WQ^l{n29Z{jVy6DK-=GfeYI zp05Y=LOqmglNEX;GGGktrA?1R%~N^?`j&4L8X@$Q2);thsE4|>!0+NlH`HJNI+sEx z38F)aaCx{c+??wl{b&Hma60T4#iA4*UXAp;U9^aH(S7Fxwt3HFs+3LHhj zP%SjF1zX#WyR5j?ZS{hrK~OXXg3_QT19E(zra%R8j-@z90d^`>WiI>GsRmHgqS{nD zIEsU$UXU~hmc~F+8Z>3Vlh5|s1$ME`?Mk~gclLeuu${0|(BNsi0QV-`DMz2*ja!pW z+&m?mG;-p!Qwm*{;D)v>%>SM`wq@>eC2R}AMK&!wys?iOcA zJ}smnDrkh(pffb&+`EVN(E&O{M`!|BcpTa|MQ3QfR`3-o?Pxr`P?up);s+swDHdT> z(2fqM#Q+EygCYc=0wHXD4X@)3;G+%R_diCac_5d5h_3W1y#{nNfQ}B((XUT{4!=Y;=a>;qGuR7#R!?hZEt+uuu3! zKop3e2!R%k4pS@YKunWp&Rz^>uIIRX;>Xu1AcZ7|4JjpMxvW}|-4bkU1&z{5T1Bg~ zcXoK+3{*6P_Z6%bZHHT^O9KQH0000802{aYHpIi<^!^J0005u@02KfL0B~$|XK8M8FGyv0MPzAo zZ*neVY;5d(e_&L_weY>W2`sR(3j{<(4GJ~Sq?!t~i9tnVTSQiNBir(xC|HrMTdEXx z0WGmfmPj_s+Q1_%w!A)UV@q3FqNQ!Hs7XYEJgmV|8*5$-n6`J_ymqx|T``jHoHKLp z+#kC!(0b&#D&fqv6d}r+|*Z=#p8uhR97jn%UxWC&{QF9~QfB&;(HCNJIs#%WVE%`O2 z6!+qqtpt~A3h911q{H<83U_>;PWQ_D?g=7Zwah+`BrTHjrSlJb|I;e0R~kQkoIF~R zx@35RKlmM~g1Z|7>D>+g=sl08$Bwq^$_7wn>h{ zEJSUwNz0~4QsXIEnkJpa56ZdOmOJ>W@Vy(ua9{p1uU8k{4ZlJt=2dG~-W|SMl0LYZ z*WJhN`rlmme-%c8RD9eL6*{)6<<{%Mb=KVfsv^5n%Jk;fhL zC^c1z8y1b>@$fJKA8ttQh1?(y<@7vR3XM&8`~C5NBR;Rxr~J4>mZFE8zF^&L6eaF= zRt`-LLSB&NYPhA=#XSWvPhYgEPYz!WS6kSYx`SetR>nP!_yVVYX!06}*@`RG)Tcx4 zM4-Qt@bO>`Ul?u}sC;@U=9=frl77^zwv=sFTiiQ1%bTa%4iT}^1(I4{N6edvdopo% z+?yGyES)(7iR#)S4~C>*%VNk<3o3y}L=FK1qmho8_&f&`Vg+Oc5wM~VGzdWyafY7- zLA=T;vG+L#M3eSh@ZLZBX!s0yH3KzAB*T6#oJh(P*!l3`K z@%FZ}yX_`fBJw8dASB_<_!HRIe(&RLRH{{ea8_GIAmeIk^99=$TYJP(xFs=n=oB+i zXGIt29yL{czkv8(T}cmEkZq71y!;fQm*E3JCqpTyE8T-#$+dYIyeIFMDe8WT;nux8 zx`e&_oL&xM1?I_Es=k_JE5Kr2?3d$QTS^cb=$qBnPCgXmjPem(idI$r%2Kiw9kbLG>(%VJstz1?@?9%}Jy~ z^gTJ^z%<(nAatk1^TR5};U)O<#SAiwO6!Qto5S#=G4Q86a0)AC?54Ra@Yfi)p9j7t z@s#sf;LkCzjR*EfJmmrw_?T8l+rSaE^5R78q9pHC5@S z0av8FrfT4|4~B*!rBv~8lOPiaKop_}^Pxl;mSHCUod?7BW5HjVBbIxnGOBEncvIj2 zXQR4$lH~px{JjZ(pDB>sFTnjPaF^u#d|Q5gzCAxb@0j}I{F2I)mZbG6su{5|V%#obEFjbm!Sfp@Hv$fp6+;X|>)j!rmK#Sbx3O><6L=Um{b z4DR<;YKWBIzhMNfK;VmS5Oc8y<@2FH&oAatoRyqxEv(5G${1=PY8!^iJk;Du!7l2D z6l%pBVyJxn;BBVVYB(T%o0yhJY7Tl%l*k;k-%^}S&}E=wpTsegj#j0m@Lj%V;{tF(%2>@x)*i|vXzSFqfcT&&g<+_K4A~iiF#WH` zW7xpT*m>BJIIh(3RMTGsr4b_6z-K=fOLV^v9jgwn(T!!YtF9jjKqG{LSQe{Uwm56C zxR&t?yx|uZ+JvE^$Re~ILIp~5=u^XDJ}@liwqY@M5xDyT40K~)rZTv~7#LLpfuMhJ2pY}y zDM1z#Phgff#eCTqzCaCEFg#8rt4!1(wS3AQep#wHS)0Bjj1H?!Mv}w zr6)~X!P6gYTLLpiKhO5r*WmKt1xUj{KhoE@(4V2D6LEMHU+|=l7pSz7r;qeU4=<_d&jY?ot&Z&t1>&=6 z>#HE>-Yrw2=!5g6$hAb&G8uF0LnfRW4G&x2WK&+BFSz4PDij+<3y_ChCbQ<;2u(2! z1?E9NkyUNS{Zkmpr($Cm8tI!;K8$1=rx;0AH$sx_mQ<4U8cEiRp|z4qvfi^NS>0~{ z-zSJ(j7&W$nR+;x0zH*PCaQ$f&&Z?=7PCAae1@jdL1o#%&`@1lI1g6v7YCo^z|Sz? zXeRjQx7zrOs*blp9B;jyo&h$t`VB*@mkqIAKE&>L6)DwQ)3Fq4Rtdpein{q#xSWBd zCB~(OnQ#RgdY*n?0%`nvAEi`jOtnP#T@Hd%Grv@zjuFt01Xt)ne#$}sUJQwpDLyWI zW`OxcJLF1bXfcNGsewYlnWp{KD-wIXFK z8Pqj@S)RlyxQ(hG-0mO}Q8$~wqG4vW80usB3{87&MTR`z@bNrF zC+f}CiF$b_nhT|cC^d%>fhiU>7&Xj=5R38~3ovEZX%NdU2)Tm``api$P4ZhWn>iOy zw;zP{Jgnj?l@+%VJ+1t?roUCv%U=r0Up^4*IdkUyh|j))iyxoJxp+VCTguCmXtu+& zM4&fjP>+c>Atd_H0x5Ex815q4o{55yauzEB<18@sIaG2bpm|xpqXKG_#k3Fvh}9r! z=*1dh=(7y52)u>`vaE1SurNL><^z>kx%tRo@%Z5Q7=(s2WOLvB-9@iNPvunxziur1 z%M&OIh6lT+8n(nw42=a)S8ireqZ#05^SQPnu?UkrgICZzvIjXlDftr6nvIfJAd`Gf zQuCzV%&VbwXk&@4*O!QQYqc6nDyeb4W=t`TrSR#>nwhEV_h%y0^}UZH6BEH)8}F{; zU^8dgkl#a>L z#C%!31piHbN0v}|+Y|(FCCUp*dN1{AqW=P-{{of%3yA)oNq!7hcg;{^o=*AHBG%7; zhS;qmT~pIQrXiS}AnX6on4lGnC@ zvMk0dy$Xt#-@J*$OQC@>>#rBgLDhc%oGW60Hp8{$mfR_Ua!lcALxNZv+)cV-RP4dSA2Lo?Jr@KGN^MfVJvYRnzeaZ~N^sbmLq(vOJO4bB1x0Q$AKT zA-K6U^VMu-QX+tIHInmCp6fa9e%Et>pS$)QeeB)$P_lW`Y~)CNikYZX!U(g}zUxWs z0R3^+gdr-44GZjZrl#sO|8*}i755LI6se`WEkZK%Jx)LepZwJ-Iy>ujK^2$$0m?I$ zJ^SF9w{)BV^v%5pnp-oA&ADDRi*oul0HdGjljBE}5D@v!4!5M| zM@CIWYK%7ZVM--4he%TH$*h|JgQ)#fUMw&OnC+g-tQQ*`u4lJ(_0br&cR=q?b-)u1 zTY;ZOtP}9nRAp>91Z=5g(JFW8+DqWNYQt2xmaiWL*PGTl;ri+I)8Kmdx+!pVgmElJ z9|U^w^}~&naulWEF`!h?X(ctr#by!^vnd1e&!@4gR$m>ztBvCq#K|2%dcIOUT(=Wm zBv2?ZrOjjT_SYY+`q2-W1wk7kb(ltDqrw2ugz(tBxp6|OypK~Uq4e>tjR6MP(4Fvf z`&8)cO6r^hQ|_;zmZ)n(#-OGo+T5B5bXO|xT&J!^~$?%128mJ!*zddT)eAp zgJLbmE}`;E3%z#{z59^f8rgRn$o{xW_JpSoDc47o+a)MRG*U3=kJ*9%ol0_RC>v`u zC^s$cqPv^UQNFE4v7H zkletOVEMv?xJ;YejrK+vQXpgYIg9;ymFkP5cmkV3^87R{2t0EDj}RmZRFnc=NXQkl znbgG^xXft96Xg}SOSLj)4=*u>NBavvo0;&WQ8~pis2bz6QN9{J{$R0ZAh$dg-RP7e zdDpb1CTayKf@Hv}n%a0O5g(b0FW<+1)S*g4N3@kDc- z{7FM?!9Sf#6TLF%o}2&ytA0Zj1k0n2WPCq^}uV)<}o-`{wA0Rkh=D?jxq+tgF zZWSFCU$?^D+-tMbbJmMUQCCxYL%X#O8#|=dP)R`Pa zH`K2U)&S0!BOY+ae0d<)#TGbp@`Li7_YuidKi0BiZl!W+4qJy>S0WQ(mMOf=uo5x) zFO_}vbL8Q3qNeHuYJOc?c0o$@W%J+i>4nw}*U$q(AEO$ch$d|@xK^E5;)xdvYzxetTy z9Yq<}BvFyY@^-kkEM|ER&1l*Hc?PGOUA@Rdr4T{&$oTyz8NY#jRV+vf)dk7!8?*&U zp>9D^vjDXnb3=23*TTHPf_W!TcIA^$9X&wvO(Z}0Tt4b;3gpP=F(OSv(N+gs<;b-V zv9o41KBKg@;zlU%0Iq#6yG@67>M1UI7gn-09+e&O#J3@yN~QD+EiY1+QbMf?(^zfA zoTf`ygbB^>!O3ndIj@ckrB4LX6xB_up{b$y(0_C~+%yU=)3bQ!6(WMRJVZG)z5rzH zu9~W@5On?UxM)?^K=_vA`F5=5)M$qjoPAKC?}(n1>s}1cB$I=K@p(`OcHLkjf2q;e zlJTN*ZUI7=BhlS?nDf+_R{@CwrYdmY0M89Me0~jFfw19!p$EGZu1M~-LAw=()RIz* zax@p_QIO~>B4`LoskL3aezr`$UAopR#AvR%SCGU|4F8OZK%cAbc_YQkFc~Vg6*R~Ja-tk-hs!Eihd25())QO^d@?ezZYJ^c7&?|9Qw+&eQIGv()Vv2-1_9 zVS#m9()B=9(15mS6=lh)yA7)gwJP_Oef2iA0lL@TOck9`;qBRwn*uNVYfcI{Y{L=t zHbOb0!UGwpc|t~ny3Ef4S$^(H%xKP9o{_bG{U==6Qxnn?yq=i$@8%8awfv)Y#5#U{$r6_R^g zndF}HDapME?oOCuq`W-YmiN#3**`W%a#z6LGWfe6{=N@?2jTB1{JjQ$L-1$O*G5~} zWMfO+M{S$uCRHoW7@BV|@azhYW8E0kStP+$0BUZBv;pj@4w+d&RAx36-%(T`4^uy? zY;iAdYCLtYN_=m*7gBIJ$SSX>r9o4x3$j!DLXpfwoZ;e6(UpHtl%FR%JAKkOZCsyZ zq?fj6%tSY$Oh|;9QORV&U^uOg5bHn80~SRP4bsGJngK*3vGUT8>WLjH1(*;9xci?f zHJ+tDY%JG@S>)^b)!0yP%cu}7Ly$;fj;TLr^`N0OmjEkEAT^9Ab`_n7y!s9 zGK?nC0}T6>ys4N>l`|!D%3D%bM6X{n*XEYOmpqPlZbVmB6w#`nGoJ#f3I%`xT{WG4 z94wUSe3UZv8a|=ltA;eUqmMyj+|#I0eY2BOeQQnCRtY8MPtpU1y=lW-wnpC?9SdOa z2bf|@C8qFf1*K>G{M%68PL#kc4l&-6AwdihRBavO+Hxg}2lDv5#SjkJ@|m5HWCfH0 zXkM|PC=8vu5o%H~&k?==Z{q6B*KDr#m&9=)2LJe z=1}e?JYtmLu7}8I=mD$8Q4!1&_N*7nJ%g?t?ONusdgO5-H!J+C7omeq(gHiH3sq@Z zkcaa`K47UjbC4&x)dojM=pII!&r|aiFx@-50`^$L8bG4eh@!@7!ZHPR*4FbyKyu4i zjMdm#t*V=nk+BrHvt}#B;k9>Ap4U2!ot`%p7v3uvE*$o(mt&IW#}S6;(~VTA+oc~7pvAL9600U2L5e0OdA`b_xMHJKx5=kDLMVR%P`lRS`)%qsu(W^tL1UfGGlAi`mnXGh(~&& zhvn?}D$+EHzc*UXC%io|S`0+1dZn*o@D??gWm8Xsyj?E$_PXl+oAwVB9LR@zBGSd& zeHxYN4?q$@gi^S&5|}v&(Sth>GY+C?u$Po9ppJHXHw z^Bh61uD4`eH>qK@=&}cnVCovms1dW*b*f&>+Q?HeS-I!P+UX)1#jzGRdn1GU9=O|7 zbhzsNEM=!eqf;Fc?7fIuaL1LwVwh%e1 z3^rm1X~a53%8Yc_gdvn7a*1(>S7S&+DY3ZGDvhr+cVk1Eh9Y7Z z8_oGQmLPoFCUbwRDWw*~oU*Z(n(V{8J-)q&HIo+CPJO+SWtxMk+u8eem8#XV88$7h zofw%fxCWg%evqQoD)#y_dFqt0!48*7xO93B8TfPb0At3J^>g&cZiLwL?PAhI;PGVu zyc&RJc?QjyO(Y4pW8V6BpdQ9h46ar67i@Sq?x{z4>ygDIZ-wB7twGiGVVU6>aC>Tj zQByACCc)DJe7bu)Jl%j#Tc*O(Y-q!RW|)~KFe(XqeCh%Sn#6+mIC5xy0+v~4vc68| z&4W7K0kWT7W^pW6sdf{Dpeqr~gr&W>KHQZE?5^Y^l^JSu0A-(@sgwh|V}bo~Pcv*` zihK9Oya(ffy)oFr;@KZ<8wES0;@*QXZ%aI|3mgphW43^+fN<@vdnG)RwT+lA$nmbV z)3YBN4pPKCo6*yEGn2kHqqJ9M?%b5cZkEMvT^3ZfJ#kM<%(FY;-49c`iz9~2V}WW! zT+KR2wU6;8^E8L96~XaVj@1?mG{-%=z*%=U(U)b25VmN9S?O)I_=tITMyqzh;A|%@ zw6o@+JX#smJxLkwjBa#{an&_T*ww5u$gLr_3hb&mMZj0W7ePsHf8NvuMDJL_f;6F! z2VIZN{evo$n|Ek~X;vGPWMwpb31$r-THNlS5pw7ubsuD*QLuFQsmCqAzRgxM%kR2_ zEok1nNphdMRdQeBmE2D*l-vXGXNLudl&|~A`Tx&-@bO9+_QjkpM$@<;m-?yUxdF$;O{@-PZ}kUvixkL?0NaLUI(_64mm?o0(}%u zUrx4mbSa1aeH)mm^1w5#1sZ|v_+`d(2v2WG%_u2JM5+~5f**yp* zD7q>;YH$yCpE4NL?DJxqfTx$dcY49$y29&pMK6=N3K?(RJW`;W_(C^B$W@X5QHOFz z_qyBT;BI0FdA^Q$o};=jufeC>PGoR^xoc+J+wC{R{RYOx(*3HAGNyk1Xtb&ahUhkA z6-@<$=*sE(11(FLPBEQ$X2}QO^nU> zS*=>wZ7;j+XSY_o>B{`T-zYz1!{j;R$1+|CWlX*ZZwc@^H&mkwo2ib7UcU%M0*s z)MOsk-eg+-7s~f?=C%M2#kLigfSom(zM~1D>LPeHL5crDC_#EyFqHDR(EO82 z7uwvFLAyhXBb*~I5#cstxX=V$K;G(;sJVWRMvk>7sku^9jK#~tf@sB4_MV0y_V{I4 zgRa8e7?1x&dmmMmt-tt`pY&3bszE}jM*gZCJOS=(2=Q%x6AOeNw(8%4W>C>ne@~sg z->9YwYc4QF+^I$blvXPC(-PYm$^2qan_28lGh3}l$9GSWkyhP#SETMGr3E@fWTKIT zlwV54B7dmJRS<*;ZYrvnR~7-ADaWbqMAdLFV{Mjiz)sN(K26VS`sbx$@Mchu^t1?4 zj3=qRMI!~%m1b)CQ(%6!R3Gs6(Zsn9GCtMQeljoG zUO-109I7XmoFgp4F^n+ll~@222PYDqR@A&)Y?s;t3o-&=rzC9>ct7^()K1LL!1Fq>Th`g^nsXGDlYC`#=w_xxhGm(rwI+8x0Sx&GQeM@WHs}AZ}lTq__i*v;mN~k1)t(Gv80=I~HwN5i(GH-Q7?fi|`TUZde@Ay@h;iK@20K9TUW`IHZmOyKagLAeiM&4b}Fj9v?h^qLEtM19I$ zH&G>ZF%A|^Dr*AO$~iec86RTkX}%X$CoHjAi03fuuTLz$E4#m<6Wk0QcEG*Z;{cxL zaTI%;%*WZvpMuDrnn9r?_|x6wKi6#HPq*glkHFgfTaxG?orPgF8yHrziD5Ns3@ef3 z46E75uy#kQc1vLwTi|w!vC? z_EoAO0k$LH#|!}Mq{7qtu!Dq=T{xxm#R9uf5PN<0TjtgF~;s#uQ>Qbdq$ z0r50j*^R62DQs`3X@b}EmM=jJ&eQOH%o$d5Z$E7f_{IcnBPz))hP>uD z0L(Q%^cz#nf64$*(~1Dp9IX=&jtIO+}KMA`y7T{ zt0io41v8zlDUZ2$Q?`KYK~32QnjRf1?NV837ZC}x{$0RIUD2NccsO?2m4ls%K49$@ z+jESOZ~ofUQ)0hX*@9`_X*SP0#eo4V_`{;ukyt<pwuzM_e%4P3p&*W7Af2m`3 z>wZ8{?&%7TM=~Vsu|ybJI5i&JoM5>VNynP-JxiGfU%97k-It*MAC^&Ps`8rs$ZOzQwcl2C4NM~qj<%C|z)b4L;)b|q zalhx%zt98&FXN7?AtVd;rJe(P&~zl1_W>r#tc?QOQuRoSeWS#kug^lbR1rjWzTur7svM>O*n_+tPSS-t{)OQgj|ah#}a@Verfk zR`~4)sMI|X^Hj&Z)qdrFWQ+>6ejR*run(OE>F5zj9e&Epdy)6I@VD>ZgKxlBS}Hty z*TbB-m&|i}D*=Mb5;Yl$MM~&blI~zEF@B5u%3>D8CV!c183*DO$bcj z70$_E2C~F!|fT&y)BDOtQkW z8>_k-CCerZLmdwBBrDpOXOE~R2;r4V_ze;aAK!>vwQda^T!B|9Jdr(sT=-2o`V^%s zvIsV-^V}ZmOtyzJKgOmj9}mM7h-V5zC{T8Hv8Nd&D^`-)o!5+c`*)EEDu%;x0I%qoHH zhzE95Ox^^Ih=;l~R^(U1WB3|8EgJbiBU~7EaSV)@%D;7#hEejnfQmW;;(-y+>Dj6t z%C(jF-B$1et(c6cxqRl?O`VK6RV-m>gjjVm13)6zJ}MizyxKc_@$>M_&t$EOS*)|5 zRkOWa8?AOYH8?JjQT-X*ubXk<%beBx*% zwq%uQL~}T`jq4c|(r5^Runj<@Z*u{0?^wpWpZHVfo!KOn#l!Y=gBKcj!ZK zFXXsS{Yl`q`m2L1=a$$MsBG*c8|3w{o-wTeoalz=9WZw?UvLmIMNe&|IbS9#QN>v# z9#9j1fhA7jH{Z!?Hw1=5 za^P?f%RrXa7c6AK$P@?bkwH1&HHo*Qj|FAaYLZ+OVJNf+#gK)X{D7KL6hyqoYp}!c z!#ZZ1j`zUPaKEy98zjR zFb$oYPFrb^$g_c&+xhv3u)0C-Amv*_l6uCVSHaFJ_9y$5n+Exe(yKbG6)>UXP38q* zG&p?$5JF929^83t_c~|2(lFtRuZ)4yvZrs@V*%Z0t4d zkdkNffSOJ61$I=V>J7lE_-}N0ZiDTMZDaDWY(Apzl`IjQ0VwkYPnu*T+)iHMaaLVM z1x;t82hZ-M)W1TUEH!!g3`gD1P%}Lb)0$TV05#R5KTA!XIKxpx3|K{>K2KSGni^YE z>I!~b67!-~U9D{aDG$n_GZ57V(F14@h|WJ%vFSqWqO8DlYR_Op!%{H9);m(aP2LG< zu@@5z|u*hezwACf)YSSC0LH{ZC_AwsS;B?fFg-41pkot9M z8CZCGWoF^+6is7}v9TV_nbI;|ia}bUkYu z*RIA)J(c=eY7<0*)`V`(GGK-|rq=|2v#Mp3u>Y`465Yq6U=+AkDUPagLf79gq3aYC zx4#}e=UmTDh@O%efHVsX4JsGXlsKJgP5nCfpA$^*z{qF#Rxzd>IsaWE zEA%B+I(F&~J9rew=>?2wfrbPNir~S9JR8*hReEASDv6jV=y)3&RIw~qb{1OMGcON6hO-d6G=6vs6TF#c-StQT*X=;_ z966+~pUq+j$-1>#Vm>P6o}C+}Xti4v_wHO3BjG<)7;-Z`L>`cxGA!kXAp>vF9e0I! z{rLn)!ZDk!B%QU>;EF#pv&gawN!vlQDu(V%0?VpS8sD;%EU_8(-VySVZS{%1XWMk0 zK2tSbgJCM|c&xbNct+$Lt0gM1{adUolu~ASFbHi zlo2F#rD+0*z9Vap7(r5_HRDPTtS~;qh^d^ZG;BVe#?^109bmLMp{q;Gsd;=-5p0~YFPoHkX>QpsfQItXsGGHoUm>Tu^T`J6SyM7DEai2hiz!>#s#+?UFvJcy^ zC*hIJgbd{&$^AF@vwcN!yWlSjf1lbUxp%m)9knE_*sO*UTG*G=yxpfg8{Z|p_ zk6fZ^XnpTs0sD04V2`({u^t`;(-c_@`wXA+>oZtHmA;<=yCxgb>BF?t!o1!%h^%`6 zBCGv}CLLGZz3fwR>W;cT-bU4=!X{0(Pbo-q!9AlzAVk8!qnNe4^44D{Cgqd{;T+^Y zAs7p5nNkrLaBX>ueOCmM(Dg+|h%;7SVuZM3^`!zLjz;*9tm?il=@La- zOPI2!+L*2(r-E`ox3e~_+o?Bza-OzTe6|(>DTKEy`3~?eUj(l3ddm_)QNmHvRWn`+*s0hnK?+M?Ae)J(j}LBXDQgF6-KSm~FdI zrp+g%MQEaNOZTi7udikc-FokzkW>7L`BAVHzP%DMFfr#I3v<3RXKED8iJmI8huft2TIt{LFQHtUqzG_%i3W`-TQYe=t$afeA8m$I|>M5suh{OoU7_mrVk z-Y(%=_U~c?_=C9QUf3YHzqb_*D1>L>-&rpi&bR+8^Yzp=DL1p*9?ObkL{2Im~IhLYEC_K`IW%hu?bMnaQ!vj!9^M+O?sR1S)y1a9?cOfa8Et0SC0_;I(2 zN$iEx*OztU2Ct)jQGP26P~Iw6)08vMhDWylFZHzzpEfyQjn{G-&RHShZT0iIeEUt{ zYfFY9ue#zpE369uD{YVDUm6t-tKa^vrfF!QrC_5m{9zUj<2W&YGHkt-&Hk)+@(7+5 z++T_c54Ei1-Esp9PX5N+Z)?p(_JsKb5Ol61>a2Sp|-pqWqXB#}_q+-}~0Ze&U1SPFo2_c`?=zrcB z8lpLle=X#Fu!Hs^an_*JLgFK2G$Ck^~kw*E~Eg$#S*LGCDF7Lu5{iF z8?lsLs2viXJs=THrQ@LX@_8~5*b{3if@t`qB)k(VqbE8Bl$~JIRALzV>}XwBH}x{T z5g$HJBk2JF^lhHjOFN#6J$s5hjbzvW{sa!nU=JcE@Lja8XE$w; zYzCW;-P_0y*MBx{5u{ zZ>l;+`5{w~KU9c2;gxq^=hj8mOoh-)=Z25%tKa3v-F57Upc#NmUtQJ2TlWn;`55IZ z*ka`?0xVXgt61*Qr&rUu;d3E%Xx1$Oun|$CYac%_vD)6jc0iC$x<1Z6&6x01>xK;j z@`Id{e;R8l7TY@9G{>9^5gJh~OAnQHRg#OEqeW zJ((14gcDXuA>gK(ZO4)_ny%ZKHA7+Ym>mfJ&}p3@)LiA&r!PGvba@=Lgq5*oAlt zZEq>XcQ3e9|4q`xbk+TlSyNs6>Zl&xooFiAnPo01_qrpuoD*X#rcc>YCha_f-SMW` zj2Z3Jn9(`1U54Esr}Bf0h_m^w%D9GjMlb&kFlag|sNT45#9dK`6#43G5H~6k2wgvp zA|Tz?UIJ4j<2bIm|72#Jii8he6OHVcFgdd7pI3z(Ge`0=Z7dlyLggN4#_vg%u<=^- zoGMfD4R55SUWYr#VV0n5vM^0CgD8vL0hC z|3BJeifPFDhOh4JeE3m~U61}vV!~1r8;!`ltaDTjJ@CJoIvr63I?cRu>5Sm(K{~CS zX#Q^bzuw0ei#|S|vFo{lUAJhgXpeyv&1JxBbmgtcCx3Zd@d`;W+e+TP59vJwf4XX!8&(C*Vz zqNBrDKqmvf|E)GdK+O6Oq^baKWm*6hu!wmFZ*7e7P zZAQ!LHvmcUOZqQOXN-H>7V0`|J+H2niDpbpG^1yt;N+8RX1KMP>D(}}SN4#D9Ty+f z&e-1IvP~ReF;ZVNwSyeFk)~X+RyDDXw!07;B5}{Bs5~yP+Y|OsBJNxMh=lBXcIJ zeWQr%8)b0Cv6)D$fu|UWjESZ~qlp7h7)%^w8v(929jzRRm57KyWb0_cr&!a#8D{Rl zI}HnXGMYO8=`iLFmWe^WM?kb=RE!?t6dtQ%>Zp}e_(ddaV_j8s-fD`o1S^$T3Rgcj zQ3wl&`pLe+UhNx3)*3^p>7zg4TUoIU!MwP{D<%eVyr?`hVpNFvuS#eEYz1l7rGv^wRKjGZk=& z6xhBqidfy7_haz)|Z8s8``r9)A*f3eC5~ z%VO4)yE)vf7Ij$QrA+3C)j25$5mqGJq=MJzCC;p&a3g#+!QC8gR@y#fq!d0|_42MQ z{gN@1p|Yx=BUkD}5VuwRtbUl=nsb&@V<(Fcp??pOOsi9%#sRa&&!~D<)l%ZD`R?GEbLYF5*2;H9 zIr)+H20hXCpQ?HyE??|4`%kRaW?JJB`b`Kjo}!PRS8m!w?u1+CvZL8SdzDCpS&0fN zN!}31xV#bA18a(@@crkQM{}uwPfI0&+@%8V2xN0VeQcV^7*sYfjWfj7lXs@N>ZZt8 znq59jVqpiX%_=*g{~z>mPY3UwX!|Hoy(a>@#D@YzsG}IqSl>l%7WVeX-mTh2zKE;M zW+wz$hhe$5dF@)Y^kTE19Jy-5D8O+qb#)d3AjryE=un2{?L(!hJ$kYyKu|U)wp+ z02g82CI8%pr}widjWzUIeBWS`k|mAQa1JrMrVJ7>1F#>jkfwK z(&U-blvA3ui+L!;7pp30746e7sv^B#+3%t|>)q=MLYRhskr0Fb-~@fx9hmM(QC2hN z_@jue_y_>i56*J*>P&{O(z;1dT6IHtk-FhnW~qdF3bTEoI83e}PyrTO;Ko z0LCr130Nm$@CkP=iUK~<$7lPqetb5K_LMXx^`* z8}y~P?H?~iF_t1)m6ocY+o#pN*#oqnHqNs-AG47Gzh28lA=gi$e9fO8PA2I?$M37! zxyYBT->?ji$C4uw{G@zpAv_t+tiB|aBhv*hz#M!bq|Fkx_YYhe%#z_XdeTjDsWrty z3{rQv8enRn?wJUMTABdzCph^}f_|Gdiq>TSY|<+B=bQ+9YA!DVp5&1{1A)N2XUkgV z3qmXtpIX6Rj)Bx)vFXSjJ;3dWRUbZdVQ{k18<`C;O)A2Et75NT|J9htCbhm|gKhtC zMnkO=#fvT>2t z4k)4`{a+^jO?u+A0L3`H7*ym0dYRq|#TE;q>8>w=##efLM& zXH5IW>H5iW!z9UMPtq;rP9pEkn&b(II?_zk$f}<`<3SBs8C+y?$ZgHxZuXfos`aIpRG_@Rju)ngnq(1Rd^P z$KdZE{EY=cMUoxae>R&v&+$+BMrV`9CJrNyX{?wrD3ka#lZjtof;^wtwlXxM z>G30yTX3B~ze&g5pIyfux!o+Sgm2VyJ;o(9NQ@wC3$uBcAocG*4~EFC`XMsMp-yWf zU>7v~YvRQxAZhYiyB5>Ha%-{+5$)x*RIT8MM8@!qCgubhZoM!k>Z)~kQP)~0))hY~ znBYvrH=6qkRGMcJc(=Nar0qvFiN*s-lMBTxDt3%c*9sJEWfoMIPPzt5+`s5~+)JZ` zOpu0_(}>wO3Z)>~L`>@@%y5x8f^|Q!tL`HC>{2pM4W9S4Z$Ipk z&N2JQ3SEPjSQ@;9B{v(g#Ok3`>k*D__WZo)B=OLFW3ytfhk{Ic^_2?7(#Nr-R8k zgTu=?gQofqT4#8Hh_{+q!Vx(SkAsdi`sD!-E$-5z8$MCx$fFYe*Ixs9V|7+Kbz10T zcyAGO`#Uk!L4Jrwbr#Zr0rr1^cn`Ni<-P{h7&%emM{`v1_^INf=49X|H{=_6y{Jr~ zZf!sWmaxFPRt=4WAYZrpyho7@}NI_ZdpN^I4&TCD9y_1*y^*hWmp6Qw?L zHdb+McPhmdpBW@XXH_-J{(U?D93h^gqWk8NM(^C@j+}?)_*L|YGbqN{__wefHNvSz zd>3MnpJrw{?~Jr*j+l%u10TRkz!|ggo?$%?2BKEfGu`Eojd~dw9T?<)*r%-}SM8hh z=rWA##F~*Nbeif=G}1aaM_PxHvnz_I zL#Y~3D8b;rXd3!<`wUqJi9XFFqpw7(3gk#c!zBzHI`kth*I>MnQgElCL9(2!1!9Tak`cK)Ab zyyIYrdFV{)@MO5k;k9tJxi;6LI_<}B31zFP(17Rz$8#92q`{|`Vv2SbA?{;2t=VRvIifh?t^<1LUPt5%9k_1 zg46i)+xNgulwN-UKHs51+W}gfjzwBh=i}>B@2LT086JQ~1|Z-H004T!>7wv%9yWZ7 zf2CGE;ocbBqZZsw1uvk2+p-qi@Erv_E_!eCJM6gVy}RH6zb+WEQ%Z;|zJaA9YJr+^ zPa{vcr}`cK0h~Na36aIohI}vntxZfQe?H52!vm&{DOcyy#L47;dP>-7%B55ye$i*? z0QzqDge-V-{2$)F2R^Fe+W+3Wo3MrryMaWbLP;emHlR_k1_LETf=G?-M#7(ppcZ&> z)rz_c=p#y8QnR^k<-L;rw9nT<(Uw+QX{$c4q6zUONYR3&Hhsk!Fs(Oks!^i^3GDBC z&dj}c|0Drl`}-xIy?5@MGiT16nK|?C%*=m^lM0P3Dvge)LGCa@8fxhV322~qFL^&e z<|w^uZiQR-JFB7?mJ`BzmjJ=#r=bOX?x0V_XDE5{p1}de7l*GCnTH*M@FgI3TXPwn z@O8{`(#_rFu5P!C*K5U_sd2n_k^6In4qirKj^dqsgPN&qH>EbsNlrxPtqqYNU&c{wDcK{i&=^T8oxdzxyUH(zohduDbTm# zR42)`T%jDgcN~%BNm7zB0ZN6DJCYGQhYTkC^U3%5$%;aGNbcJZ)J~t>U;8&T?L52F zO27M*>CeaX84YuvJxMm0M8aSa`NR^Be<$(b-frXPSV2j+ZN&?_1XQ#r-NkYbK!ke^ zB~V`ULxXVgdtnkw@mVpN5w;&`_cfI{%_9M4xyDKOK~23k zi$1200H2qOhKj!TjbaiJsyqYSoH+U1a@TEdk_6!6@Hq*=@7}H^a=-X-v%%zJm(!^W;A8fy6jZ z&|rjn-Rk}inH&^;j6TTuL0Yy;rN#MXp zvMzmsY0xtg-HfL>cx)oCD%8NpQ=8zTTs7Y35M}se|Bd93#4fprclO&1E%lH`33FS* z+!FO@JxN)VfA*-7=ntMCc~2#DJjuP8Y0=Z~*AGUXdL#k+@I)eBY%-rx|Ipdh>>erNXrvWTMAC%Pda zfm<(Rl{r0&l%3lXzLrRZ+_!y3G^410w<0qgZ9W$J`UH^$5Re7F&J=hDmXu9-X0x<3 zHqT$15ZzRSf&o7Tsdj-Bxr|rNAkV_2B2g5jZ@(!Jmno2Mq7=tU?Nl?|G0){sV*2M3 znQ0m3(a*&|%J}SiRwmk-Cdw3MxdbV6gd`K3xFB4l{KzJrJk9i7z*0MNq?ExOGC{^c z8pA#778?<}DEak|C4{>i;q3CkL2K|Kk&N%TB)#QUv{8Z>KhLs6JKAkJ(Y7=4%|xMz z@T!dYOySkYQ%mqkHOnU{+@2*#FEUxZ$VJ@E=ZI&x#XgbfHmi#HhyWVgDw5|-pUc{H ztr7Uixzx00Zb8wRTOpxgANU9`GRb>u}e)TNWC^gRy=n5MCf1BY+lpauP<{Pu5hP{eyW?#jQ?8$pImP< zJ}kc$gOXv%<4RGVNr zJ!3p*@P5(HOjdtDUW+5KWz z^ddZqD%@fZRcXb*y_x9PaqqgnwAvLqe+#9QG_M0WN&&m&6?Gy7f5sQ)Z)p0AQxQuT zTur7zKyj?b025sdMhL*|GYS=XliGmTuc}#Tcc6VEXz$weOmoD z3OG*c@4C2WyfLi=Fh1jMs%P9`=*dKev{)h4=KJ!!_ngZe>U>(LA^Pi)D0Z|@l%4B* zk2%q1+^eQXp02MdowhU!NC@OPk*B|1a%r7>&ZM1bGXtuLu~M~zou7C~$lp~G{!f5T z!k5^F=;zx#>A}hmZ&%DMt#paf^XE_HmciVj3Kx|rH}C1oEuxLpZt4!NUM7MRk=3)C zOU_*?6$6)95^ffsKI3Xx7?_?Yi!3A#^nJxni&b7Ox2v0L*zz)cqbx6}>1nHo69rm; zn424|jx*Ue6vr7Ee5#8cbq~jb`%oM^DE=U&{wqrr>@`VN|9=I zX$3|yJmRv0rp%A@Q}%dJ@WmyX>Ke$fkEZSH%Qb0Ac8Kv_b9(!M0|w*>ud)kib9;DN zq07*D7nMO;kgTF*yTTV3(ZnR7)TrV#`HD^q6JytahQMt@$2JL(&U6$PcoO26fJ&Y( z9+#cYx<|NCqD1UiXDHrQ*+OyUIh#r_p_g(m5l1-~AAQcXR!|8Z7nikE_CzpHs74Zu zNO`^)=u8w5yOm2gCn34Kz5_Ir*EM75<4q1T;Fy&=4MmuWD2sQ5EUS&lEmK z$QxxfWh3%~!g3zj88g^;UeAFhqXN_m4pK+-$>r~2Ev@|7@w4zwC;liD1nqn_es}?s zYp94fLIEV{jY5to_4@Lm=Ram!_;v$k$LALDT{3ihvxkX~22mXT!}F8F=O*(|%rp{P z!Q}M{#-`~q1Te0GxX4WbuYlY5QF03G@Cz2kT-4V;07=TE7%LpMQa%&2Bjo4D84)~7 zqW6FDRP6O-ORe<`ZxpOXkyK-HQVI}1L5%-8E_lIwp7Auf<&@qJsgP5`7s!-x;b=|Q z$D%CxjNjJERy(ad|79v9z5n2_<4z70;HNlq8802L}8P|3e z#g9=EDZS*rQcDmOd0cdkDW_h&)(cVXMrcSYy?n+e44dEH!Sg#d5>UyFi&o7m-N8|! zpXxQHqvI8OM+C6-4oo~`L=UtLc&Y4RtnEl%>@TbfLl4UidWzl}yg%!LRX_G3TZ7>csRc%pE4^7mMewF%KXHl-V6wLb3g271!m@Dvc6;C z7?acl4VGH|x>L(vT7U3Ps7U6JFC$G+$aa2q4%Xhe%^dY6~VhA z*C!0fyhCNVZ6CCd7lMhdai!>*iGBc`C>nB$tf=L4f(FnQaHA#24XQ8P(l1&5G`5Xb z6`TF~(O6nt3&J*N66L_xziExKZ2nlL19i0nv_uvh4Mz^&fAT|+VqbEmiQ5PZ<<)biH=pvo zHG|KmPhC&P#G z0BX-3$~*F)823%(=69bD#d0~s#9*(rmc7Rph|w~uKt~Bsya5`*1K|+gSh*)ME7$ni z5=B8oFno0my`GrT&M;wG`u0&oduTJ2Vq2N;{^^OX#Fdl2Nc0d*bkLGQ2OM>~=&5mq zIEbhGcA%zYbo;0co3W})^TMW&FYDvL;hkI>f@Ab1{(O->f$=%-J0&l%9KQ!?BMagq ziq)5vRX?D{^Y$?`IFj7^4~sMEvMuk?j#Sb>ma>wlu&o*>n%RgZo_7#W z9C1Zgx_0x7MP3lniZpc+;d*-d^lTEKKibrVFPs;2A9Ez-)If0q)=4lKcUzVz#_$dT zYoT+ZQ3~vrtcb1j9f%r>u=ND-nUG3h2Ek1Iiu79)kECo0Jz)H`3@r4kAzYK=z2%;K zJXfxv9zwX&6Cr)?4Zl`~2FKV{#=3Sq5N6$THlB0Vj6s_cKH`Z~dx7u18R)T#0Vr6V ziD&UWL~$D26ks$3fScl==gQSioQG9_wuT!fv(c5AP@e09OvRytG#Ra9r%9T@6qo0G zqylYalrx^6vYuaz3N37X#0f6QJ^rIXXg{A@N#oSg%7NOikp$uCOAC(?x9AJs{jZ!& zNWKSceo=Kl?NH|e5&Pv%l@=^QuIR4b)GawZ5!koN4yy3u#2>uIq79aG6pHOIrGAH7TIo{~@^%LZfNcNoCENGnwy5Q)qU6 zj+Ob@#TA*KTq|f=p@}}jyYs7b2GjUo;*fe~GnM>YvaK({drDHTfUI#E<+TZ zYZh>CEGf4LltAU%)L%b8;I=3v`^TFx}|*kfMl24ei8lNYGDFgPguSr zF8WO_IHciK%&d1g2eVgJMf9ddlQZw%$Yftrk(E>3LK7~HusJ(ek%jx?p|K1^PI;;9 z@cg9LFZJ9AvrBwVR7`Hy6B23sq-^8yv2&2|qoqmN#!-Pgkd1n6GZ4#9he)z4&b0KB zW=T(PAR{Tg9hl476jkW>{;kO9iFLAK^>W`a^X+%aa=Y&Pa5V+30VireGI6 z(U|@i^u>o793>oD@Jro$P+z%g>+~BFza@HMm^#+FTOHPI)W)MX@J{viiY~=Vz6SXU z0V+{$zI?{%Qwd#4Ll_yO$@Q)G$VqFLqq?UJ)@~p~({ZluU-0VotJKimv|KDr z**+tYKG4)cUkPZ^YvR8sNYFJ;`AI7p#xH`>|4H(X(lZj>LGC8Pp-E4p z(ZtzI{``#8KZj>~{Y!YV8s#u;su`coaG!Brh{ts`y}fj_5c&Cy-~224MG%;Z6qCTJ zQWH54a0drG7PJFmX!&qrnAl#BVn&}}M(J5)G_7JTO#<6)PfT!>6LVO_wENU}-mBaL z+zziman0BI(6x5sp*N9Fm9RUOA~MuO0(`pHGsJ;MZ=yFh?(En_PsQ`dcSM)ZQBU7( zWlr=bwn-TwP?X$s?Tc{iqNi57h>9DNX)Jd(cRG=?4vwY)250QAGm$8IK24N5&&$p% z&&v%y8g_9|_A7UeY)K3n+t|GzZf4|x&uP-f%R@l8+Gcy5lxZx*$5@Jwu@tYri^XOe zV=H~OF?Qn8e<$^}#s%bU`9s;ewUy;14VBW@_uT2=^!7&&xwr|k+MjvXi}r_RE~Dh< z7tIZi2N_j1M76F@p0dxNOwxZh4x;~VPSSq{$wunGO`Ktyg#IJdD?T&~cW%^DuiR(z z;(#K%-^QeSO|24s(aA#~Hz}wc3PIjTUo5;D$EB@?JGej{^Lq7G_e z9n?gXB8g8?PkhFI+`*hseWOLR#+=*Vbkyz6zgqK}Vm2C>psSq~pDL^8ld^iUgXG50 zQmxh}V7I^Ks5?ffsGZ50$<(f27sN#L4h}TswMG}Aw@|Ep6Y)HO7~4c_6C5gqn#e2> z6h?WhY@T3wwh9%NSnCX`bw62Y*SfU&Bq!5{tdCP=eH_xh{rb0rJ;Q}>nf46Xnq}X9 z+V;W1KHBB{V)oJRika9RjbDGz{#o|XUmw&yx=FF^qklStee{-p$UZtX{b~6jCk~Ch zN4O*l29n?|hW{)TZrfMiHI#kz_aGOZ0iWR-(!P2$=o0SdYPx+jHy(S8W&afW>T441 ztKBK~)k{VUX8_m+s5_2koUt*!I#c=PB)_i5sSvxPD6E zYg;R0&qmWc z&a{oDCF~70nwB54Y@=!E6L(6ZY5Dy_Y0nI5w$U`)Y&6XnCr&aALSUom4aaSxX+|`7 zXv;>^1k;=78R3z{W_bW$1{lfTIQCXm;VCUT_a$II!x*bfM)sHt<}!nK*j$XsAfstXhSFry*oGJ_fgDOm$}0|OH2v+{ ztwvvh4kj5*lNZ-d8Ir3g`*JOn<%6PWVowI8S62p7jg=v0I?S0ES?QQ<#{mv6jiv{O zxC90APBof-H6elD`keLPQ7zSInrKF8e-qMd8cjDRi0pFHj`k%};9Cz_vf1WHFq+5Ig()E9c z$5ZU3KYlYFx9z2!HR)Er>Gn3Gv?1)h7`kW)cRFq8;PzfFr)}?*WUq5_{md_9F9bqK z_Cn2nN^0@a?PXrkhP9tqrP|g2gWBsns10ea)1@Za>zvx&=Jy@8Ekb(-&F`qEu($bT zg1ybB@5JM&_BMyn^G5?ati8=HbufFIt2=Cao6-*3-sX}HX>apAb$ELlkr%iu;v3Sc zW(a#4V5QnKaQWT*_W#P>1mp&{H<^=cZ^C%#_9kVjWp9$P;`HrJggp(@07*c$zf8BM z=~09|%@Fn}GnC=%Q(k$?E)&0gYbg5^e`7_QeA4Yz-g%o#g>A3$fEX0De~M(Wy~>@! z0``cg4K85H=`;`AUVcVy?b7)Ze zls$d%c#3_>`APOEOfKC%r2t6MKIN~s{%`D4h_3N{WJ;=iil%-6`;UsrqRPbi}y59sp#mZ1!2?EFFM#Zuu&E2R~^%mJsAOq;9w z#L0oj!@D#1T%SJkfT`o*<_t_5@M2Ck3%8er%QioFEy0U{?+*uz4F~KQ4*0=vz`qX% z>>UpH;c&qE;ea0v2mE+QV86enZ#dwm!vQ}V0!SyVgw7V=%3dmZ7I-;cL(H#@wda+g zE{s4{w4w*<*wFpO@~}lrO1{LsMIXxouq4`d5N#;NxyAA%^$1yrchMRJp0!;g)~the z#6@@W@@dK*b&L+#lEufc>t?Ll2EK2{BY`D0Fvexpu*+=hTpQSvN>(H#{GvE_W1Nlo z!Ej{$J`@>mDw*El$b2{ynKC{MCIR!~R5CRk<(ii>QxdQRZXXLW)i3(fpPZ?By=ST3 z75Gi&xBZ)kUqXHtCSE>Kc}TW>wCu^RPI|F^=(X88WV1zvHluZ@qVnSQ^^^)$IN;|H z($)SD`7i}^3k|cp97-xLLA(fP%<@UyJ7CAxZ3nR9I|JNtG>dJ-_ie_K5j8?Awh@K0 zIYbgnMs&&@2VH1)cxd4H_HNRk>lHq5DAdK*sXmJ@k+_v;1y@F>M%W%*@Sq}ZNB6;C z2^h_s7Pr@NA!LD>A|xL*N#wo5Qt+lx@Jb4@WsIF2@YZanB{Jtns@EbkmlZ^(8k)c> z(z0~fLQKjY>^6}X1N{Cvd%%`vAIx<6xG-`gTr!c2vxFsU64@mJl<$*02)8d4bT&Ye zQYz@2AqavJikwqQP_?aR-RZNj>HPnkq-~_}pD{H58AJ1*F*N@fr{-VzV*IDs4_^); z<)+&YkG#T)7YKbLB=5H6-vBN0_={`K9E8E;>HRzIPycq1`G9=t^s%AR4M%v9>RMz58XpLacR4K$QsHuR&BcaXZ&om4kF<)SWnY_f+8hS95zJTx6d zz;>$HG4-Yz2u65}gmvXT5Jy0lyk)mw&DqO7_L2}2G7Ei`fzszm<)B~ z;y!omW?oE{RrO0Q5c=1AZWnoplZ#;}n>u0}oMIJoBz;`1@COGPPl4u$K(Mm_dU6aS zZBuC1l;-5E!?}uBf9_8@Ii!o0qFsEJ13kmdB|cqzM>we$(X>SqgYGX;LK6at&<&G5 zRlOpJ$n&|v#`2dAY13-29M>RPsS&0A)!=luHj?X1G9=(VMbJ1x2 zNnz@F#AnkemL)J+*-N0m4FW<7B5s7DI%h`?X!Bv!gc&EU;bLT-HaFh$N>d?^v-=%; zJ+C}}0o<(6A3u7sbk7455>=y3(n|iX(0JJKo-<6m^)g^F32;98d%nrSYo~6}&wNp)QOZ>7# z?Vc`EKw*f}xpYFa<3N@1t4dC7>{pW8qzKqe+>%3vEv@YJL?dGJBa5+$uMp*uba|d! zzUpz{v|<(xMFtyEzD$&Has&=i&)Hwy?>K;LAVj{ohbTJsM);jT08(@8hR{&cN-K?Z zBZylbn=*}oD&uD$>oZ;zTj@a1EL(f1)c$plQp?qRy-TcG3NIoA&lAL|l%UH3^+cN7 zoD=l)88t#H>d&)$+e%VQBa^E3%fCn27JC@FsHvWKb?O+O^+iLHzA&IK_$(Az%Q?lV zW+F5Kpqg3p7f#{Yq!iK(FO@yECh=hw7&xg_=`b&}t>vOr;+F`G%y`p5N-%@gChDXz z(n%bI6uL#}|9}#sb46j@V{_&5*}CV%7}X;^l(`Sh+A>0TnzEnn zH$_$AjsrzaoFYEhC%lWEN^psF zdJ(;fqU4*v?wvVR`fiONoJ>&y;Op$ z`%y^jG@qKg%0ADdUr~iUsZQ~%GRtF?C%I^Fd6^+R^?GKM7S?}2B-HxU{x z6;_J-;cU++sL;GOUxB@68LKQ;GhFN0<(;E>H?!+z%e5V@W_BsCWb1{iX6*nTowGHs zQGSgu(|zJ2_!L*br&#(dC!F=<^CjuyBcJ``<4z1!0Q$z~bA``r!dXQ=hV+?EKF#Fw zmhcHUjh!>i2@P6@$eRS3Tj zfXIa*`(|=fdn0+viR*8Tpy`CGG%uBzSM_W{i@5Z>o9PWZt8BuG%!Ln?rYe!FX-Lc$ z3B(d`B2YltLO4D_<}#JX-;C`SNaNu}L=SSpBAU+ZM&>!UFv)V4o(+<~uJHl8<#e%G z@ZX&;xjwBRy-N^e^XW!Va4n?=5u6rw%{NFM#Ew#;(k{+C3LrOvZl$bk&zOoQNr~^{ z5p_I$Kgw)A@A_=sEJg0BfUuaG=ohru%FPuipQ!WtY9#mdu^@}3KU$@7|91gCYRV=P z3p_;XNt-EkuQmG9H(<5igr)8V#ed&W5v+a+8+S_3ViRyd6N=lb4>J z=0Yl=u=S%-1kxx%iANj#yMs<8vxBCGFBl{|Ao-E<=_V6we<%s%%Jt42#n3AxW4pez zDjLt@x*93ed3BV z1y9iCS$cMi;LWm?GW^_p-k%Vn@O0i(r$&2VFHzY(h&p(p25lyfrnLw!E7_yuQBN3z zFSe-=7`J+E*sNH{0>x)26|6;pTmO(El@{BN3u-x@JfQvZ*@1U7iAcL&~R*G@XH_UV;R|BUgX&lA+dmJB^qVr{up($32d zX|eOREKRfajHLN`&8-{zI{rnwZFIt+Z#+wdkH#GAKdTW$^tRHHrh`+)jaL z1BwxuCMLsYP=speED7&7;kOAmQIh&=Zj%1$7bVuZ8AG;7QtghE=A$(VE6pGjsJwIj zIiOn*^!w1S=KJ&nWJ+_mwpqd1OOV;C6&9!~1(Z7{2_%=yHct_0x6XqyHMciabEnFO z?X6gKzPxdk=4H)kn@lmBGloCY&mY|4g~WU&X}iBo-if^<<5kS-2%!!>UUT!5s2CKu zU;q;3i-l|Mq1B595tb4-B>m@xqwlgzMF)sz545!Cwp(*=14?M5?7>&}$6VZH6^9)} zvMDYeToogK2eD@|9z)zL2*F=Kl|`ZKTr_7-XCnnKpxa@UCkfT|pbsLt&VPKD!O8F= z?H2s#kwkb6Wt8aDzl>ESTB^-5a!-)`H-=v6{Wa0y{^Y-y2AAjU&ZP3ZV4;)`@9tZ2 zoMzYPnHfA!IAB$korx7I{t!!Rw2;~T3Z||*9AK)2t8JriClQ!w zdG;evaD{NI&%phy?(+bYr8Bos&c}4`&9FR|jW<1?w>|H_$n@N7d;Z}v(^I!Si>H{L zt8Gu+^1KC}0n__cC={O<2QPl>q{NsB46FA2$i}$B!Wd^0e#nOZvB!j;a9Z$NZTL|O z{V-UEV{*la33T0SGqL|@rG84@?$HC z`SksrQ7Q=mkJQoa7OFcwtL})6V*oIt^WEd|$Kmg~qxxSa7Q1(S0joBtpDs5{deFuM$1$c3%b}5q5`n(Q~Bd;g1!< z#s_UZZkSo7dSMDU1+P;i%s5HK`ykI7+J4rfl$ePs2brq>M z01jvjvb(Yp*2!x)gwb+Dt1>z+kt=)q$)BIty2*<`orH5(^Bd2ZIQuv(J#kPMo;D*8 z8M}FXt&4-xvouN()qaJC^Tr(}ojpv4(PUiY6LD{h?Mx!cD0G{k#AT95flcykljN&b zoI10nvroj?7~8266TC^2C3!4aT(l%t%KAK>F02lwN6#vqq{=%w?HR^5+yw3v;2r|k ze4a{#$*WA>E&-DKK_bsjpAffSFfaS4cezhr#1|yV)4eegZD!u-S!Hbf3X3VW>omx9 zCXwqg$-TtnUSe|dO>!c-2+z6cVw`JSA%G$!ktTa4&u5GkAhXZ!wkPsqS;EcfM(;&2 ze$$4f=fdlJ09B*tmWOfMdj3BMvWeGp*=lM6W$6NAkND8hGl>}1?@ zw<-38+b1)q-{z~yQIm^#_eMgR!AoW%Zo2!Aq!S3(zRwL}}~0Fpv?YYuWS2 zze-r-);xmsYZ`|ef1J!}iK0K+;WPWcJMI4SUSc(%fhUTUXe3`HsZ2;eFF-FV8Tx#V zfRbpKD$PmNG;`7+_9x~pkTyngTq{(`8=`QEQ(K_cc`}LC@QsIy>=TxFO>)9zNoVk0 z4-Uk3v762lWxtng0j?KcMIh+H24Z8fZfbe!^!{A)*rxrLnj~XSBT`tG@}c+dUmyrp z^zp>0+%LoP_9P}g3Rg@-;Di)>Vm(b9vdd;0$1gII1Q4Z4gT&GfdC|f6lbm>$eW^fo zAK&6i`#4K0`fIOXKE?4n#=`=c4x6axOFO+q*L=nbff3umAp}Ql&MeO4^!1{blGcm* z7* zAM5nZR$S^ZaWR_b;WyYqh<&2u6Ix7mV0O^QWKeeK3=&uIt+|+Pf9Y0>q;1$XdUApr z-L8f#_TZ50h&>;>btMc+m~w3NN}Zi6GgM_|gq^UK6tC)+OZPtbRoJS$?0J?sm5`zq z8Ap`kaH$oL-8pfS73_>7ZYUGxa(2?wZ+v$G=Moo%gHRg0r}^d>XQ+8G zam@h}aJ2wPdudtRE)$-dt+R=A6FsYp5@xY#~b~m3d%XuLUy7)=sbgmjTOI<>8_BGaS2gVjPH;et0 z$p&wCONm-`j!Nh%N#{EN89(h7_kK`)bzuBbvyptiD}06K%@qb%#sk8$dmJ^Q5(Z`NAa7dm_q}q!E?&{fDky~4d6f;!HVT)nPq3Ib> zr=%zv1c1~r2lfS2A&$EQpu3wZH`A^3)~+-uR0+D*Saewcyl%*Ji%md45%k6j4`Pw= zD5avf(8w8rj9%-FM>xf?wIWTF1$PF>46RKhrf3hfOl(PQ{O&zLuX?~C&08g1SR+$Bz zt(wre5|3g?qVG59zXbXcArXG53GW*mo@2r%ov`71+? z%Zs+3^3F)Aq{YIxxd?k@igq7B@7{3i;XCO1iYj{8i!FC~9kkyL=Hg(7=({YxXqH!E z_7?%O(*%qynw2X70|e*_lu3|pY>_{=%KXSL^3&*`3*>QnfxTa~z#3NB`?VvLU4ab9 zlGnKqpo^}Q$Lf2hIc;eB%_Tn`V$tL%fAovv^t!|u4rT0T&}qbhvUuL+PV)eOD!>l2 zE}}Dj4L)5SA2c9&>ug?gC!D;wO}=!^`ig+p8#L3hjvSxng-75;10z zCx4J0L_}=VmwrA0Xq$&@RGQ1h@)SVI+&R|U1pfCn_sh$r>#jaI|k(TY1G4!DbsvVCPFI{k#~$Cj|kBt2;jdrhhB_G~y4&oF{01LX{+P{|AM0xAlgc-}^`<`N@K&~Q-%r6~6gx|)jzt;^qy;5sJhLyvP(m&a?0MPmMR6M+P#KRy zQ{}DcfTkq=*MqZIvB-&N8K7K>L{4xZWDt3$gcu>z*M!rMvYgDEGRnSJC8>Wh);O6Z zG>2lH1nW*aKDDhZSCzf6l>2AHC0fu$cb80agvRro1vFjA9hcX$xg~(7B$PBBfG+Qm zGkeyEp$9W^tm1oU+*qEEHW`#?&ue(Ln9D*YX&8KrN#2&(eF30y7P0R0_3)`31qx#R ztlOCgY$jl8@b^S2Y1XjrSSMlJATg+MdtaSaJ#bG(cZ-b`K0KanoSC6=^?af_gW?Uk zO`6}ugC(pXMco9G?9b?>2yPV-aJQ^mn^rk+j~4r;#0YnKpm8P%p8aaw5h5?r6*^OJ zFjuQP%)ZAs)-zz0??{=UQ7V{=2GM3T3omE;tPl@lJV4mk^_m>Q75Mc1ZR>(R7 zMT_q+HHekm@aJmi0)UBwsgS@q02r^U^6VAw)~PpXUU;?5%4Hu-oOR&zJWO^w;&hu) z%cv^H8l|gsk`e+wh^8e9w|VW%TQQjW}`0b)@eeIk+FhnR-@0I0a5^Hr6G zi+nmvX=Q)#8UzmC@4|Us?B^2u@v4leBV~`;XfNY}$rI`mgfBLqaJIr*~!(3;sm*;B8Qa8V8!Ok@ACPm!z{k;U>d#rJtW;?`u%4x$RgR%cQS};u~mZ z%1Yv8&<|taqtw# zc({$LVab4u8^bAaS}92$`VJ<)Q=Um(Ie_}2GRSM`+dNy}Ce3GP!=4wt(mp^w9nPAA zPVn_?YH4gCw3Per_USmBZLOQ?3*3G;570V&hSSA0gFJI0)qBFVdr+hQ%q3t?ys&=# zH&rjes@)O47bNKZ9^(%qWNkX6SA*^$>afdxIHO>#;(50?ME2i62}qPfd64ioffsIZ zz$Y@#BKK{RTnCfu0J(sJA{DDfoya|l?oEQO*>x3Zfl|c%x&jg_1u6~M=6Z=*IeOC< znDh^FN)A$;myIf;z*;v`vP;+6v9>t_mI@za%5eLc&XmRzWT%WIhCM?yAe*GaYD?z3^!ksW6#T_!R;z$D=@BQx#UVZ z{eC4Mf6rChuFylB_vki_jNdMz2#C!1j2~dqf9J5E}&k*PPhMQet>A5kdp*pS$r(bQL z6|~06c*9(k1OGoRPi-hpRKwcK6Fb*L^^2D$ih=1ef9V^Bhb~`tsAlG0YiDZ9VOMgFW|=vf6`Pra#@b|FR!Z*L1&*7ZmHOPQk$ZbDPsX@0@?ZRx3#R;TrK?u+W&D5764> zr872N23yk+#-6kA-LD4=-Qfo(s-71z9~c#I`4$>K&l9avmVW(Q&kN33Vm-w%C)VM4 zVbq-PvB~;@U`F^@QOHT(*kE(4cwJWb*t7>T!rjF&NBFgP_*gvXjyl&zowEof_ICL5 z$;+08w4)uZ-S=X~Hvn@HnxlJ%=8jej(CAe)8nCLgcyVmRl;*NleT5N*`AWcnNx8$Q zilx~!qZ3kFyIW|j^^x4(>!wjC4 ze6ld%rK>N-Po8|hu|M1!pRya*8vRsJ)w-ae&l*6;%Qkcc3xA4fGfa5lrNlA!_j+_z zoMI_zX^qZ0X}L~Vt^w(ys&xa}&2Td{jLY?L9G_$PR(g}k$4zein*;it1M$uqUqjQj zXz|0&!gwcw@nP4?^~(t{5~Axw^#BjKL+*H}KOS-!d3W6~Nei zl{dZ$4v4xSzRFE6<2Hd$NxXsd1@p0zr=}|0?PWA4p&$=ql>rqV@m0C}^wN__g@lvi z9w%s#pw<>*8xj1#mGLPCh%BM8`t1erZ{~yCjpBL}ntw!Mu+>Umbv=+lP&(NnUg;JAh*0fsS-IuTiCn5z=10`h ztKDmyrM;^&j3pqm3^bO4$c?YHk~9|RC~lEV<76&kSigaCXO7e8&Bc2=ed%pWTaCjK z$OA7|Dau0d49EvF1s|2QPHApkV7vkhqEyO(LSEw+xJ@dKO08Bn67A7PfT zg>MJ?XleJW=LzJw&ZVtl_JTyWqKBrgXd$2?w+u%^y&q6%GZ+#o)@3l1#1Tx)|V`=4~q5#ywD|%6H`|#`M z`inSky%TY+=!@LhZ^qdXt>|Fl0Pj;pvFHA&7romk&g7x&C^mjUGt<7{;>F<=`xLeq zJIksr`b`}X2bX7-hDi@SLu3lKHz*6$ynww8@l%QFzY{aU@+5B72eX`+<~hqj4`rl2 zzt9`ec92$RMR0gwhWupBb`V$|=V~XHu>dL17rFFRZj_$j#ihZ*!r;W{)YZEC*O6-r zslg1d`!(`qbd9PK_OD$=8A*8luU)a$<&Q$)upR|7$ol0vuWZ%b=cI^G2hhQ-a!>QS zLK!<$X2t&-^APQoKibZ!FSn&z3m<6QD92L?C*3%W*zP75vN4=;is%py}7G+3U%qS*IG9c zho;+3z4QT(i4q}kn7Gm4r32A*(*|T76xw-^ed3d+1`zMsyD8qIe}beZ!U;MX|EG2uYN)sFB7EWHm|dcU$s6Fn2h&Z`fAsj-|BFgMzG zgk#=y}F1%fMJMnfV<&Bh412Ku;X8fKbA0cDn8(iCYA-@4A13D>6{U zp`2@}V}kmGFE`q;dC(9}D29*qb%oxMe?+zgOMc4wBd2lHm7dTdlvpaRh8i5#II8ii zk^`ZN#_QC^g(_U7DCShy4K4KUvZby19%LlM87%tbC&3H#>jw0N1Hkf@d>V4MbbDLg z_u@+{`E&;*`rPJa;g0yyR`Bquex~jz*&BL~Vi{ZVLFg~!7*ltc`XhBm=vjIo^cp-7 ziK!13f?-$eTW0TudnyZMhiHu1A(~-!hyWk9|1$yopL0b2XO!Llxi22ej^1|?L;d?s z#2nH4sKetHBq5C)isQ}T%7(KbAQ{p7v5W{logA00%GmTAE55@BF?GXd!3&S>=GaEl zo1<%woJAUYS?fySXuDcd=tKH8$ammuzO-KU0_{KKqnl)arH|_|A_eY3{aE;O=RKDm z{Zsg`Bj_$V&@h5>vRe&(rtfL#bU9k+<;81n_z34)<|j{+ji11KpYS+JDmblFPC(yv zbT=n-x~^TRhAz%(4qkBOEo$ietghfVY@5AumKHi2o;g?E;s|+>YTV$M)fIYEkE27d z@!aMEofz`89^K6)EFa_M-73hu2T3B(p`*Js@_%xr4gk@A1HNrU|Gzo)fR^TI<5h+WGGAz z1;@bOXH3HU5Jm)<`qfT&E<+D%H;CQ`qAF1do)N#>X}ss5oY!YjCo5yeL>Za!2c-Qo zWR)5mvB3E4Cm>MwV;}9BSnaI;Y%wAIfCvRf8Rr$^y_AXkE|JK$Z6g0* z`@3Y#;O+0K)vW99SR>ls-qm=o$Kx6N_OCw8_IJse(`kQ!HB|d+)3^bzGW<&LE5>gk zeg*jD@s2Jc{vKw07wB zSCT&6_P2lS7j1tf?Pu_M4!@W1dlkQZ_#MRW5Pl!7{b#kmLPoCpkl*+f;5YTYe^UFK ze7V65RF4+Y&cGjF1{~TZQsIWNckQ9Th)NG!x5dGambZF zXTzJJzhWXEmao|~9`@zOGSF_FQ{Jd~Ug(|jXZ?){zq{)9@3ws4XuS6FLmU1SI->ti zEZ_6OWmB37RQCH$6VwuNm9M{23B4P0u0KyHmxi3ae7&`3H%)S5<$BqK)}=QZ!4Ko{ z*IF0EFP{{mbJ$2z;Ak?q_1-Pyr5`BT5A|O9@x9mWr0Jm2kM7m<6n)2IMxKDB{{84<$?;y*%!`w;e z)aMNVd%|V0;MwRn!Rdxmi|tt!Esx*W8ZAG$jGia>Ie;gR*B6F=7yoRII~<(4z|byK zp#A%eI_&$2ul5>$nJAjV=GqKk#YXFM#v*MavETFz09KAw7Kc~56>14dkc&u=mkKar01WOgn1BL7LSA6h#?e}sGNz$m?2ibwz^En^D*QBX?^hRi>fff} z=_bn2M=nKH^et%5q%U09gyxitKrU5j(C>|8KerSmY>snlGrbqMB6+WpW3{{PZ}A67 zZE2Cqcfcp;u6sj45fNY1tJxh;x4s0oaa}Q&8P5ia)bM1|7Y;yafOq#^^3pG%n1giw zKuL(shqzc#wobnZuHuUbd0mn5^b|f_S)~Y_g;JLwNu!u6FHtl z)shX!&hHT-^)CEvH>2F!5i~7_2W?uZCeb&?(uLfBUGrNfpiU9!Iy3$ZnSl2Oqb518 zqMqO2W&LP1r3+JZi8KwP=4ckFpjyjo#w(?;QZuR(4?(~qxIj=t*2q|Xrs!vVuOV}4AzwX7}NrCA9_Po5eMW-w!!}aU$KYXN-#Zy#w_1XKuKC8^Q3$m7oZyv z!!2^$h^*ujpMWyAJr5b7i~UK6ksO>=2&WNMH3gl656m5Cq6(GwkWBCiN_cNt2n69m zBbd)=T-X|SfcEa#s=D2_KDw9?p{$+D;ORc1lvAPCbz#_Aw@ zvIs<7H;q|zpBok}lG|nJAmCI)PC;Zu`iq4?^4JGDNU_V3N*PK6NNP^wZqycmow%34 z@SYwA^RhSTi}CGccNnRgDFw@27UGWEYyVw4r~H~yI87BHVPaCjjhh~`WX3G+n59S! zQ7TFjMGq}lu31#0_EqLhBfvrD^x@9T;ZFB(XOX&vaMP)O5DM6nXSq28znFciA4CS3 z<`jylpip4}qsGR*7^f2=HtFw>`W*m543Y1m3>Z3P;>0*-Ik=oS4? z;@gK(c_0&tG?Z3w&!Ay0N`>2H9?Yn{HVctKQjuy(aV!fVa@%VYD5xMEX`zx@Y4oF0 zYOY4jHC=PPp}A&iu9r1ep62?l<|@=&0nN2&7Ui5g){uukiTzWmR@F%GDO5Byk}Aq} zm!To1od8Bf@1Uq)tp16MCboEEEnGf% zpoKGUZsCdlxP?Jsz~rvy$jWZouygKg5qK_#@NbjjsqgiE3|T=>@5f3zh4wB_Pcdt@ zkIg5aM35$f?j=!w$emIrko&UaC}dV)&+0ZD>Q>2E#Zni zeHUDCzlEJ|1xajH7)+#tWcd3n+n1EWdf3%0O~gT`c7&oHE8&&i83$PX_$u-l*13h! zsQqV+sE7QHJMh_eiq-)m_KTWVg#lh9_gO#xtS$uGPC~E?AymujQ65!M1Q^|$P56wq z!{Hy3E9MvfS8DL4#9(yhx;tZ@-Prgm?V2md?lreVfny;MdDum+5dxOu=MgWQmx%)^ zbFc&FxtQHUs*>=oItd)Y5x^?2ET;Ddly@WH0v%YH}@4#=QZ zI5^mC_frxx{bu$y`uWj{;=KdcLx|NLT9xhy!(?<2?>#??MClAwzX}4*0$NDp^0z=F zQNIsTLWfxkiO4yqNnQseANkUf;H)l81!mdp7ub!Ifz{W62Vm7kW4yPRor6iv;<>`-Q$|^DhBuZ+Y!5dFwtqV zVU5w+EREKp5vPDc84I+yM#&m%wFfVB4M|R**DkeLA9Qrmuu_C}K5k=1n7mL`|NHdkk1aw&Np2UTZ zvjQ|2-*Zgvi8D!-9;+y&(nwPbuN%o}l;U59s8Em9B%6Vp_h-YF>}RT;?U2ZW^<71` zdL_W6OZ#cJ29@npOC$KHov2iaA^AKz4JZo%srt6V;gVCN&WO1z*sx7P+ah2BQ z4zu!@Xg;Le3;vW&6}kA$=unkdVTRL#a8)u2tPc?gS7aQ{t=Knsm6bCcJEbglAmzvp zc>|0C9!k-|UO+V9Vmogj0)ZiS*;Ix`UWQFJcGo~&#TJ}R7gA~F02)J>%SaZcDf0vn z;1QJ8LUnB_D}q)*o{SG*sH1GW=>CHy%1&p*iefDkyjV^c&8>AOs*{v?qB8wH#g=S- z$J~s$+Fh}PQuvszSe{X8Y-smT>G@!Jhe4U!2T3(`U1~W0R57djgc=iPW-Js1sCxq* zEoGaywHoh=vMN|ZYd5fO;!83bh1HZly$)454QG8G9QFFxaUjCe!RVU=(78hwa>gOu zK_&m7*0%C(um(4vd#91#h7_me`{QH>_e=xQCeELXgT=t3^TOirRLRAu-d-xjTv!^F zg^-8copmC#c$aITttve{{d-F3?(p>ADrJJJWz#HIfw(z4JjY0&i}xzR0a%I`X7xZm zVfPJwX&g<6b8plMuiugSn&tEBsON_xuWQvsf_!s9eUGs>{(?GUD|@L1j)n?1urh8v zgv!|R5HHvL!A&Ss=9W!biKgOJJ%c=nXn=GJYMRX@3~1(L<^@qK_Off7?MNMAEj81F zNLjf|Jb`P}c?t#6h&_*Pw}2CAubmAWWOAW#JE6yI4%ln&ArFkr4FdR2HmYzesjE_7 z7o{1@`4ABz+SI9h7WJ{a27LZTC7qKRiVH6g*;~j%D6W&>BX- zt$~)cDM-Y}DkA(2Z*WtJV6Xcrp^PJtAHWv*_u!^fgPg_wRgWpv5T4g#t~J1cw2=o! z;`@*UxkW=3d4hc-2J{F;kz=lzRDnTq(OMZX5x>U@{w)>=(LUfnxQ|W51Lcu1?9%~{ zWb&}E9;}SCM!v=ek(-a7H{pv}9m6dNy;oFDvq}&aknfr_1KhIN8!@AEvt#E#03Ogp z8N6&gwbERHtN%s6cf%hHW;*nL)aFGr_Iw|e#nI1j z3kKT=ZRHzJ4lwA`xh#knC_it&at&wn)gq)BT)9MIU&LCEwz^wfG!(o(dtJbYI{&uA zyq^z-H96l-k^RAMry1nsEWMk`y#amN10XgUPG#+e5HgX_&1sI`=ndsNTJg9i^SN}! zm4#&@4Q;5|>n3V?(>WP&gO&?>T^DS~guRa6eUKR)L!eFv z>ND;f*A7CpiDw1z!e@|nW)U+$b29BO)Do3nD{S5jiQBrv%369WdQ+wHCkdPf9Rl~8P)*%Rwpx`IsyWNfMztArf{JSo`Q1WJe%I!YP`m2A zxdtBQM$6#N=g@xOQO=>wIO#{3&@@V$$_4y_O|e{lhh8oVpvOuHexrx|$5r%TzKWp< zi2Q+0?_6wX|MIX3P6eHj6P-UZ@PUB-nW|WQ^h)_e-fGy>TG$^ofr=itutJ&`+=TgZ zO_0#8^s8RNhWss$a(W7e$|mp}ighwS4b8G{DxcD5Upv9RXL0)DJR@n|fov43$0-jJ zHGkxENDzBo%OS=qG#wL}3=o+d)uXEHr&_#fm`qpaDyWD?q-_-G z9ERHVQ`kE2y)B}s$A$y{L>(gYpvy8X9FVI*1uRCcF!w={iv1B?#p_d#K{dgjOX0Uz ziEw@h`rjW+bS;^^M5De0a#0!&h@agQ*k1pRQidIW4?tdb+v`4~FFh)`LNL4zf1<(4 z0$hde4<&~RC<289%WZ~W$LGOArWHT88R0Ka-qL@^4D7|kE&YY~%84GSU#KG^1J5Atwp|RVUy;we;lL+yDV(lG4?A!iGd;M7>Fccwke+ zX5ZHYPIj|Kjvd`))wALyGWIwqk)T9vEP$M>4#L{0lRDSr)5Ap*XH&BN;xA< z3T_73yM?&PMr&kzgIUFHPkE1h2a)DbtT-%w5$yuD{`^Ykq9Ip0JzR_pGDskFkRw7@ zXh_XET>GKDb_SMt*iu9zW=#Kc>3Pynjm^F_4c>w4&gzuF^$nZt_I)k(eF5sQxZFhV zuG{z3HopR=Kdw0{l(?F)uEL!H;y9((v6s01@cG>;7D`xqVQGfVI`$|KZtDC!V1O;i zoRTZZ%+lRKCQ1_v3#E~8+3Q|HaBzN9?0iA92%XPs7Gq}(EP?saK&Pbnm^!~nKG*NU zswCebKtM`y_tiBaHG6oW9=o^nY-c{~3Ox56A<@db++%>~%!DV2Vs%c{aojo_N4Gtk zgb*r3r@#?(4#YZhnc zURWC9X5KHS1U4I|%gJ-+0x*Eu?)(`-W@d5!`?!Dk)y?GJK>o|2P?x?d?X};c?;3k; zC4FUkt)IRd?6qH~?-G0M6Ba7fA+Xcdf{j2DY4$xWJ$bpt04cZ>!!m1VVUL3jHB6if z`~zOI;RQX#TFXSgVSk~3Ye_A)hXV$(EU~}P&TsPmiu~Ced#wT|8tn-fZ;;u*j>k%1 zMQ?sIQ-%l_?fjmn-9*xF z2gx32aia3v^qyAuceE7=$#_DuOS>3nCEyI>@RWxoCVkz$-`!UnuA`_p8oytge=!hh zmgw?zk;j7U32cd3ymYY8UYCM`P>K)$NZ_)e(S3#hVx62AIbmTvFK$MNKT114B$1Xr98EBW^kgW9dLfd+4f zRx`z&Zz4=i4qX3+?2f5Zd!W$(kevMPO=k4R{W}bB)O2rhqNiF)`E&MZm-%ds;V#7i z3rLMQRMSm)!2<7KunGU&A-z2s(ehY8?DiIi=I_SE+?k}8pOz0>KIJzQlc@n@kyw}r zDxsX%>QwHrh%_Kg z>m)btbHDrR{@J~&$F5aXv&ZN)x>wbln$C$!S0fU8G7`QkcNQnwMcco5Al~K4?DT;Q zF#_LFlyb!JBspVI0HdRx_eH?XF+py7aK#JpesY@O;96!rUk3evea<4MCDHyT_9a#6jBUt(ZcN{o{ifXVjU*b^y55LXjT5&OcH5T3Rxw1EuhTo@yf7bD*fp!^;A)TZ<_M+VELkUnRf_sZ z+&I&ItVMr-w&sF~14=;^54MC9O681+rD;|e7p$h7N#m0()-Jv(;h{|ka@yd%u^0EZ z5|VQ<{$?Ua+*mS8N7VB?g{`B%*@SK;5F4CZHjIANT6~iyTly_=vZXZ@nJ?y` zFpl^5F0T^Ml76r?{tN`%Z4MwIj9OKDLy-}8_k+1XX|5!KA76>oG%mY^$fn6N{`P<- zI4Xl9Ulrw)8%oxaeCxN0F!(!SJ43k^HG1mZdH)d~@@Zc5Yv?6^4fU8j{ff!la9b?h z_4d~iW-_(+pFF$+EX`GM?L~U}qo|H#)k0vM$2Vrhe-dy!r2s`x{Q}_l(>Bfi*aa0-LU5Fl)$PhZeqwM=N zlp~V#MPwcL6}RhCsdtkk_acmQJgD9!>ovj)inr@xuO(b9uX2C>dKh8Zgfx+XkA2iz zIWk%2=|To3TEUJZZ@hpJV_iLtI{X8n&x5`KpSp*IJ#ZpBf#Os zauVv=rhWORjzsAs1H;2-*k(fY->F_>u+_9=V|Vq10)o%>63G@gg(h(-NA0pq(!BQN zAVYKv81{36ERq6{1d-JKgs6&>%*E1@?sQ(yYQ8uf+}za5Glh zrCfdPWb%v*Bt!|TYC>5uZ06sDG@imb>lSDhwJi;>JxW zCce|oe5*8Vp0wW*k}v39u7Sco%6F9?aQ^DrFJ%V@Rh(4=vKkwIiD zMAFI3<`Qn$rE1etN|LN-s2)ARh*xkp_xN1C!ml$7dy2lgdjpJP{W%*q{^VnQEwRx6 zIBgnG-&A1Yv`R&st+A;dkqJN*ig@b&Bi$e9+OLVp7;&_&Q$lb^YdnbT&{5J}>|$^S zGRHNu0zA}VbK>dklT{veA7HKFkth_=H~ zepJY5GL#e-pZ=Ns{#yzO3CJ7QvxcAuz}VpKS)Ye0x~qK6WfSZvDA3O^pv!iq!gi*< zpG*ecDCI)<(vmi6S@U&1Qm=nbrdkmRFWgc2w$8smPPU+d)r&z8y01Ig3GGIO&wz5B zp~f6OQ4W>*HR*d!jSE7czn$qWuW=Pn5R}ascCODl$!EPqdej`nk+*#K_zSAm2oyry z`K)e}f8fQa;}(bse}Sa-HkC)56$~t3k$!4sP@Y)T;_+62P*=N|uyIP#>y{~DFcJ}% z(k)A&Ln2BP)F(og-5S0|1QC6Mj=ZfvFiZ4C-VuOZU_lD6Qt9#xoi~P%+eg7Wfw~Grt~oy8d#_M7akAM1K>f6wem1`zU{?eWC#ZQ0Zgzx@Ayp@8)j^YbSso2*8_xYl zz=m$CA%X==*}rrr_^H2`a{L|{yJ)NbDDvXcBl8?`{z9>|28ICjoCp_#SL;@`(yF5V z5&Y(qr<8(VNMCWu?`hZ#^_{A$P|__pc4Lp8g4dOeM_u$@wvuwJdfR$Jc;5*$CAio2 zk%_RHV<{|-J@;-yjLmoKP| z5HR)uU)IBz_)$ziVr>Zf>7lYkwoUk=0#IhKGyf&jp0yDo;y@?6J6gikCoENX7{>3R zA!P(`0S2p6rFHD+ z3OZ+|W&q?g{Pj%{= z@yPQ=Ct0Sjb7XpRC#DU7P<*N;q1s^*ddsI1efdjbcXAu0u^3gkhQVG*KPm-YnJU2y zAv`taE^D>v_8FHrwha$Mu9RFkGmXALE&i*81p3%A2c3@oGQaDxhWE4!O-}~dJq<=b zT@$6{2`qI57NXj+K|;q<@8++jv9)m&Zh0W5Gu%}w`nPB+-J=lBZmC@a0=GP-MfB<# z<;vsrQ(TA9c1{;=4?EE47f{tU{BKda=5^w2Yo$#8qy~p`9$g6WzDRmno9>l{e0VJf zZ_o!fSaPme`}MFO+02Vc4_#DADK_lD4Xr%zEqlTua??%S!XQH-+`?po6( zJ~gcf?5NTsGKgoNPcV5>>#H`0E#P&sp4%``5cTG1&Zm?1s=$6=R*-6f%Q$^EWcsrF z{o;1;v)#~uk}A|1JK4a*A)O9tA6eFrUv|8$s~4~*B}r2Y%+9gsyD1okNjnvKn!(M9 z6q^+$VYEb3|NbDEFyORPIX15si#eGA0@-1op@lAtAO+?ntX!2QrN$~xeog&-lae5q zl8pZXr+a3jTl#Qd587xH0Q-AOD<#7`E2Oi?v@^S4lN{-pDb9_|&0m7NpD~euh3XYw zgP+?IG75%lImWq&3AG1;y918SYTnV)+9?U1102spx$^{g>NV8MDX!rc5VNU|K4Nzv zY{7uiIRx{YNes^k?UN`eiKnHqd`H2yI60syubj8p5ppfP_|20pf;hh12hxupL74ym zR(D`R{pJv#8JbCmkOB!Kjql6eb!qakE{WWUw%eAU24Rfpnx_ncgl!1elFT^7o%S01 z9=dShyXz?lzSYHLS(40XgxHv;@3JjQ@dMnL|N6$;h=tL4j{s4-8B}^U@kwVTR^iwq z5ZrPs4a+y5Dwc1G>>e7EI-b%>bYO_B&628?Y{bE>Mr;|w931ciVV<}Jj;8^vJSEOn ztLWaRT3JMd8ao^^Fj`B9g&aW=WU7(G=uB+`byby+p;7Yt56){KqP`6#u6>$5*W5#= zNdBstF&4-cTAm%^knO0h$zXOqd#7)?Pe#fb4H%Q5&RwY;PFrtO@aOmt`ITH{YsR1f z^mMT67AZnS8PBh!FwLXu2C^QoIdNy87`s`c4G2nwXxJ8L6>h%aKDdVF_+<#2D32&z zlgG89=YdDY*(`n&u?a!c52q2nzy1Kz z!I~~Y`FD&CkH#MX5(7&lYed-)G)0B{M{{By>dtG?GXnpZrW@|<2mBgU_2h*bZ4VDp z*N@ymew}6@R&TYc&ZL&dE<+V~p%`U11?67@G-gU#OI>h~F&zxR+KkhMxk0`U@{kz& ztrDh7aFgYdmiJ~GO{VM1A!gZ(r2XQm5%UaL$xhB4SFn?F)q^syPIm{V0#J5F zBl+gMAcV>@`)Dc`YOToLtItT{!ogry|3U^5@x%Nv{@qXsut~%ZhQPK)jYUDC$!9Ey z{W=k)tJL`{RerO3@+p~g5g(xC0yAbqvRy14G;{_P1Krsc{z8T|+O4Z!G$ac5td5~| zv{TbAF?raabyPm8T0em`Rp*F2yK`sJ<{vG(Hm(~5J?FxANT(&)YE8fT@_+Fp$(Tor zGk0L-@Hz8W-k}88aNTZiU}u7-1?u+u7r4ZS+RGNNKDCeqjtfPN@VPt^zureXo9@t% zw>7C8T|BNN&7G^S8mm7B2;ek~sgg!e33R>y<+=LbQ4QOY;sl~Yn%$;ZTyHEW$h|$t zyC(gTh5uHSKYn0!M}pAa+jh3YnG$3a`x^QRw+KFP830u5{Sex6J@yVa#M*`4(i$-(xue|R2jHb5`Pd@w< zY_>ird|v(RzyvsJHLc3^BqnvG&D~+rx+O_%mwMN+9H6(&X}PKhTKrMN+9WHDaPD99 z>i5&)~>C|10 z6{&*}+VF2ghJwcw2K z70~bH;-TWN^l-$UH+}}dB0JzSeC9nGN!|vcvM@E7Y~^?YSqG<~Ea?g#-)H>=Fz}xL z>OEXj>IR|YCMYK%{XMT zT)q$KHC&)3(UkXSf|J;^1{mf)AY+z`knfD{MHQr~&&BdJNq&oYS7l=(_>Z$%+{i$l zp_d^+h_tKdaEBLYp%Gy7OC=Hs$>~$9m-m4PCUrlPuROFl@X)@|v)oDvCYn>X^GL(Xqso5*iQR;=nkmp)l zyPgKzw6n#GVclp~XkeG7rCTt2hLtzO-DlHNFD_$PbUs3Z?vDmzhy2-zU>VC_I9kEfqRle z_&-B;0ry)fvdd<6HIx?wc3U#bob4{SS_XT|nB(uDc0Li+@SE=}TAWT7v?eKSPil>| zhw2O*8Y2t2>KN9DmI=mciLU#f+os9(goWC@Tn^vRzLw&%gO1=ZaHjzW?z=n=yofrq zBsLQC)r;4hv82^D_3b-*FO)XSd>jKRbqCzO*_8X?;5=0JRRnE1uyPULrAoUT{I_A+ zhE{Y;DIf-mpuHvFrNbZ#RJY{(^{TMWBOp0wuZ;w!#{n1fPk|*W{rYpTskP|Qy_AUP z^6!YAq-P2>)By+u2v}FYVa^gJ$uPV$L;UKot-T2rt(tF;=Bor$GKrJH3;O!sqU-># zQranYhaUVB*o(R{zpJnrlx>MA_j4OYG^6Bf>p=i=xPi$4SO*1o6b+jhAO&BZ*9a{f zb|{E&$Ux+xPtNr&eyx`3l2-Xn7#z_;{^6Rp2~2h}6vSc+e#KPFOtdyTD4B<{%s?n> zIpLvn!>U@MeL6HTxuC#s9T#w9j&~gUM?xH2>8*Rrc{oTN78?k=pkuWG7#UG_VO3EF zKKSBDk=2XkqL~rLf9O6uN;fyJCN$%wQ8K^P7chG-`F{x%KK}CZJKDj8xuv=ea$0)A zU~=SS)mcp4$zigj22wu7D=++zAG0=G@=l_T;n`jfFyW0cE|Im&h zed{Hf|AuP(__VuhdFC|Yb~^gY*_i2y_sJ70{wxsFyY;%^2RF^R+M z9Gpa6EgpKbueDEOEM!5>wA3gP-AA*F40h+u$`I2sn;v5Kr$Shr#w?wH*A+?SH>xJg zrRM}V2!Oz5!aJSzqV^M)Ua|}H%Cs&EOz9k)i;D%}F&L>XZx*Z)=Hnqv>bd-w1S87t zaK=##M`AIze&q`U;UiafspmxOL~u}`nK8sRj?<4WSf=QAuwOHVmIV{728kPoyY!#Q zD+`y8T^FBaSI+))WUcL`AD?;-nj_gRToHA99g%?Egnft3AjQLkxCF`9--S?3}fm%56 zRdc}y8Ua9U-)28_bB0$aGveylm&@GYY?2B69RL*7ZLYk20_# zpGKcq9fR8l2H2(W5ho=xHs!A)1dTefLq0NY`!gsP=MO+8a|he^UuT;IPtjlffrPyj zkF%}=KnQ29$(RNXA9i2lj%j`zSbr9|)Tvs$D?`u=3PHkn2i(W#Nbdnji%N>NdIrfE z$Fa^ru>FJD5MNUMqkM2}Vzpn%qm~=`1uVo&e#NYglI9hdIQQWZx~1AZqq&)vd1Q7_c%z>A$o-AT&LRIcHtH%&|e5&?Wy>XWs7sO z*#adKrQSMZ^3IB3wikg*j6#RJJDpsg@?jmP;04WaSSVS=)$pvqM@EDfng+FNSVJxb&-*gisk%>8*{1(B8x3&c%mr|eU}CmoJ@?VyC738 z=u3Yo9Vw7=)@Y8))0_1!2S_!J!uRcAZq9-=U!}(AQXAa1r0p_+{r1Wb;MG3?NMpA53>!ps=NK|V?t)BJ3-ZA+b-etHQ_$C5k%_4yqxihTHTINDp_QupT6dA~g|2-1zwvm{l=8UOt6&?6nWuQVu~7KCrF*((L`m|N8vhxWpF4H3nt zYL!%SY&}5QZ{4(#@vkXQi2z+UF7p0ocuWE3Pe7%^1TQ7&9!b)ym*f2WNY|IU2Mi07 zr7ju$r_|`rkW-9vTci*zcq-K5JORK%8R&_5<_3YEcvjZw)lV1BqwRk4U{IMp20~ES ztmDds5lAr*h=vuoM!Hdm9W(D$j-QU#&uLWO2223b;A{Z$jbJt*~*E)boaLHe$BJcOjZwdP4L46mU z{1Jo*r6YX(GD=b@HebBfhxNbKQ&EaBo8tj^<;%oMB`Q}+(dHQD zjNZ@+z?*UK;oqWz+V7&Yrd<<#FqjIH7>Z z;thr9>AIp&eo2S2A#Q}4Fk@~83~kdK=pA@}v9$f`th-xS5l~7oQ*);)pGLsk+K^QJ zouRyruh2}e3yp~-iYV%}<}){) z;qAAW5fjJ%$^IEsyaPQ28(kpzF(BLYKCArq-$0<@w~ZXhZ4pVz)8R`2Fjq|S$D<*E zP+AjVkw=N2p}q%ZvSQ=NIj@JkzEP29`RmpHPcXFDHj2T3y8_aH4e4pXN>h7o>!PMMohW;!TVMiG&-vh5^fT;R~-qWFZ z+X4`N@~LOPsNrI+3D(yJ_mef^_*QKk2{l#NekO|`Pl@0izpjvtw1Y6cYlY?;b&n&D zvwsX0M1l~~61m1&AcqXaQH?iYgKmUqf>Wrc}jtDrS^>??87cU94lMjZv=S z4O%4;8Fm?b3j~Eh-OT3Z9sU!8sYv-4Z~jnVwNL=f3u{Iu}OymN!j&B5(%- zz6)#&pT*#fJ7w23nJ705?zn4miGh-p*R`V=CL}KT+^Cnbfa3@tIToG>)}-czFI}2{ z;tM-Y@a=B5WrU8;ZzZ!BcfM z4H-~OO0$C^f(uSo?j3a+(#;Va9)$ml%narq0@T-Aeo`fOQ6B+{-(n_{Pl1d+>O}^z zaB^2m?9jggF#j0<)OaU9p~kT@eOo}OQwt}3SCf$ECwq?a>Vf9 z0Oxk!QHS_fUb$&6Mj{+J+D$$mTay4`he4o4z^tb+o?2q@(4Evk5NS z0dFbf&opeNcjBdC#LeiTOWSTLB9uzo^^2-aI0!Q|jMiZofo?2e#jePyf#QX+Bxf?!|8-3^Y-w`mbY1_#q z^fuQ79RoF0tpoq|NHqbJ6lVw>flPTTqb)UgzE5kq*+1C>~9@5=57B=UQ^n0$Ip+ z>h;u2gj4AOnt4VL*cq@JyH&!xJIj5EwX9N12xaN zZWjk}+QXm5y!&WZx<|i~Nt#UJDlAo%%A0UuVJ0n1?D->cJ9mw9rAo)wz}AG7s^@JJs+W z*LB+iR3nQeR*z4D^5#U8#Or%iFc}y1+u$#6v*@2DuVa=Z&OLIpIfM7{2$$Wu$6lux-AjsH%&@nUaN9Ulo>& z6_ld%Vm64H%h5r|4$YSYHbWCFYj~Ohoyd4Zl#7IiH&<^2n}t&y*)@0$XIZrF`)4v+ zuH6x=Vc5ngGJJ@639MV(^SpR$w}1TThc`j+Tg+IGuj@{T{jGhPAv`X|^$OyZ-@EzM z?3Yb>Gjfk}cZ0>~Zo|LT)rNoOL-gR>#0KE*0*Sw$_IJMqsD15s5IDDhR^h4seQrk` zZiF5AvkC@wfmI|foGhqJ{)mBU2ZNMBnXk0`*P$gG}88=JHLVLXb`0 z-he9I5n-JWkuCUCj=F(D{ULPNtu3M5Ud&F}=eykA%A6Hy^QL@9WwUirZ4sc|XJD~V!bNviKrkA7R+<72~bQ)111bT9QjeTw3YX5n8Os2)w zI~Ce!&s`LK@SNFn#9IG_@BY-j22|Vh#=mkj0V&0Chx920?O$=a@&j* zfjf(#UuL72e4GHN#f+E#OtJqa`$%C$L2O2{Z|7`mApAMi1UH;R>cZ%qM&a6xN(Y5x zxsW_uX0Pc*N;gSgVJhv{6g1ZF{sZ*qU&ynZd<-ctsiFeV$4F$S3N&)mGXfHu_-C># z!@7)&j3t)FERz7-HCql$b;*)b%cv;lQQIfH#&uAK4-G{yD<}~s>|T6Ygu$NdnltP> zerbotT1DciD}I8Py(@x9;+)Nt;u?aGyi}M3{FXAG>0*fUyU`p2S+Z-e%*=5z4G8_{qK_F zE|S)hAJiJS`8ZSP+^cP@#bKUS$KK!a? z;xG^-4f=z`Ke{u2cr)m%UF0udDlGkpP#$3 zPI3z3y1I5>?2Lbz>AW|Y3rJ7zJGkZ9?#SXGxs$=;D2XKv$`n!yxv@&_ZhsNZ zO+deJjJrhQQ>M)?zmfG8dZN{6c~X_Bit%DtLfQ}Fq)3dPSMjMpHoWemxu85ndY5%S zv+AcA@j1kJmb#kh0K;gJTYw2eE8GzP@FrjH5o%!B0GO{C0m?TE))$yJ)_+2>bi9Pw zw9ew#ue4(|OET(IN=)yx&^R5+${kUiu0>i-ndCY!6^1e^hpi?B#hxGp32%TU!_0tI z#`Wk|B_GA?R;*$u*!v3dA=f$qxn9+yGh6cuUa=IlBiZw!^Js)0tp@WI+wSzS%MGDv zv}KP}OE-XLJYkxee0v+_Y9;-ia0DmBSI1=-Wo7qcKHW6fna`rCn){}DTm9ALT`PTc z(*hw>Y6>@Xo1%oTImT06PPT8pa!@q;S0fmycj7d($|)y+`+-zEU2yVOKc03GAY!zv}@P}Q*lSbm4|sS ze*?(Ce&j9J5z|*E>i}|kNO?Dq`LxqO4MBt|m09!f@#^h8YhRykZymp`Q!m7vt0<0b zIzZne^1mNKR+{y3>(FK|{AEj<@7`8*q%P#8P6*G(y@s%ez!#u(`2kf%ywA6A@uF2Z)9yoYGN=2fTKRhnPC8b4@i z*34J3i-NbXZk29kZ~6rXoWH3kA4de*Uc|_QBa()evY!wjOL>0=Gx6}r{7Us z&9*Dh+`AmT7PVJ?T(Zu4wE@*DJtUJxTnQ|$QX>2|?o9k?r=tCf#KmKLz29*o4RPLG zy$lTg>bP$En4mB}3KiobwhwyW-)O3cV!pT6bLo2KJ7(gO>!Y3-ndT)hJjr^C17Fv4 z+cX6#p>%!x)o4xkE?8@FN?a7{AYESKcbcOm5GZsvp&Ey z98?qTb{M%g($YY>Knp&PYv@9CCs^GaA2&jZ;^5K$;=*O#J1~;$n`j^AnrdCb@+he z9lrg!w~FH2YfdDhKPTS(Bc;aR*1xlIv?og-{E7#|=^cD~#Tll7M*4Z^L_cy}HQC6Tt=!%es zgu{#B*WYl&7a`v|KFRC;PoIIUpf~REt)R2-mdMS}?;XDd%FI_z_#Kn<(;A9F@N`5& zgn`RY5B#5ATA(SKbe42*rpHdUX_M11X@cJ@n=np@Q*!Af|9f9WE;OvP&ktt6$cAZd zoB}k68|FbWozw6Oy%hLZhspQn8F8i){|_VYn=t7xY-rNHM>!CLbT=c{!7jK5{PaIe z24Nm}Bk-*F#|Y_YSfEpw3d!)t{-|dIHX+b`QcR{y9!xJ>2^v_y6p=h0kRGeB53=bu z{i=i2{#qapP*XunNk(AlwW^2M$0YkMebu2Ap%r0o8tHmWABM4KPhV|cwlYgStws8y zgJgq`ibB3d3jLQsZ{$;ohAsWxkP?A!JaWv@xMnPJEOG{!iWDfOL0cx*uJ)ZUlM*5`S+l`%VVXQkPHsOOmgydcYS80 z%m{Qxb~<6YA9M37A5ARn>|PI7X$Ul#d3a1+e1EZKP6ZC*P>x(&2aD+_H~zZ;`nnn5 zKT@7sz@4O>O#4u;)$cL$sSS?y(Mz4EieIU`pQ!$rg`8Na^?c886a^-tn$9lMP)y0D zZL{9CGM|%?)>iX%`#L|O{pnwR@uta91zcAjHYiD*bd+g~AE`~7FOOBF@~%|t|CxJx za%@u{pQ%;Q>}{<4BrxyKl%b@#Ui(uukwdG&d(-`WU00W!J#${}t~{-FRMktYcB<*W zD{!(UGQzi)w?tdGOPT(4ZG zneLZOry0FmbF;3!j`CJt1-^uEiBM51@wNhi^O_isLA5(A_NBSZV$KQ2=*uMvL`Kd) zT&+heMhBa@X5?xi_0{xsldCq*MgOmuTZ8N0z(gPt1SIZ|@B%(#*yg$H&Z}#JI0D9p zRKm$7;!Dnh&ECGeNO(C0N?0^B1gx%`+$X8gc}xwDUDBpWcNG(sn7ZzBk5P;n%&fZl z$PpuEY9r<|6_vFW^19j@c{b_1zrO-Q(&*psjx^Zx+g~fmH4Gk-N+xUddiFamertLh z$aC&EUQ}+Vb8dYtunTq`Om|-QoNWJj+4_EPLF9Xldg}dL62&F(J)9f${r8HB>-TV2 zTIT!l$eNY+Z_7z1*KcpQruTbLcH`@{EUoqXEk(n?>t76~Ti4UGfosphikn;a%NHc! z*HuxRo8SG}&Wrc++x9VI&!^RnV9%G?ckB1(O27?53ltwxocMmjE=hhdRA5va+O0hp z8V0Ctu!_CI&{01>rUNwtV$z^-sy(toKcOTSqNv_bNgH1+UTPj`c9?@x@I$>9!@ja^ zZZaMdQ5#el5Z8dmYTnN}XIj>-mGe zJ-4o47u^@3G>LeWkQ{A=aP=DtvG&mdwk`VP`egdd zgtpN>F&JJm)o$;-2N1_vI|vL6iJH6-e8;>){=mC9ToO@;odC)Uc=j$2ND?|MeE889 zr(e`L7b&|__S!4{O8d0oeDA{+1+hG1qtX2AVGw6Ol;StotCV_<2}}cUap6aCR6Vbf z`j-XSwsP{e^Ev?R+Kgci1a|3LFD(M$#p4Heoc+7KH}B5i@&X900d^ZmGS8&DN}4(< z?CpE-)rN)|6)dk@4^rZty}D5uf;hT^Igd8U0t+=Z>|tcvHUi`WX*wbdPO>`{3~$1; z^^pc=VQ&mYBCfMc`>jBFOxI5+5bFb zyP8vj6RS|yilnp1Sanqwbwern(8liLWm`>XNv?21+fnM9i%#%Bp0$^&+2;5;0%eVB z|5l^t#kCMFm!m*kE(bg@jYnEkx7evWo5-_q(*QJhak8O=X6RDc2pet2+Akk%RabiY1Qgn9vs||e6%S}pTMTx3LXPz8h zKD>k>>wPW*Lu*|WG8B`*I1E)3HWX(RI21XQ0kY&IC1H`^U@BYVrCiRXtDsZ1hNRS46+ci6tWny9I_y?q+%xNBeEaqC}L_E zE25P~lK%iS%ek7Mii}cw}-?iBh3bsZz00 zxl)l*nNo>Tg;L>CX|wbxM;6+#=y+^$Rtckk0g@1Mm`OBss%mA;qIw0RpaF`IK{SRk zd+-oav{+>>i6fAdC{+ePyW9~>N|kCYpk3hzA|*?ep!D96rY`>;Dn+t_PXZl8EnJlt z5F&>TqgJk300>b)hfqsbMJ|nWtSrxugxV8oB#}T4AR!SaiyT7(P!%eR6@@Dx2a!;S z51>((Nr8)#fW2Tw095nKr2r9yEaK>qm1s*;l`4z*<6^x2}rubAOAD4!A;N-kx7ceqyIBAz)dg`u?J?% z;H?nkjtpc8@@6 zpv96Mtr5JxSE+qcp;G>%B1_*< zPGP$PLUCIW*n2#-ObQ)P*6H9!d+itMRjZ59+snj@ubV96wV|8BmTa&+*fyfP{h}|s zZeYt*`&e8z2%qtW={2u0ZKQ9f|NEFpE~c(az$fm)&HEb_BHMj_98{6}srmbCRJi8f z-RQ{WmxpBo<;?I7n1FyjKtsm>_ZM#2d#HU%>#d~Vy~02#SFE19bXV83R)cZ&%F=Wt ztcFgtZFfD7SV5YSe1j$$BI1d}MSVcuR}aC3EnN%gDyxPe z=U$Emc3ruNvpM)yJkZ}Y9>)svrI*MRrky~UrNQ+(%>`a=pDf$;9CUXs442gBaz}Yl zGzi=p3qy#><;Uqc5k}Rht6xM_IJCFL5Ah8|ovvNVHckQPVu{AsGK2>on4(Y(u;^Oe%Y)(Y+j|Fe*N1ak}4w0CDoezT)Lx zPk-@UW?^=?P8PqYgTZQIrSQa>mIHWdBo*mQf*)kPh_0^2$N0_Fr^Se5$c{-L z!62XVbNP{ZeSMSCj>q#VgIiRR$e z$+A$QS(jG;A>vx8sTs=MQRhtL0d!Es<6;Ihg%0H#DOx5l|6aN_RV2Pey|2@7upN)k zvbd}81U3h=8sq&nIZwGeUE{+_QX6+~Y-GTR6%s{vTEBOz#mtSsZ{@nI{!OVda(6CD z0zj`b^px?K?l>*siatOH`7mEjZ$`W=+;TW3RceAb9$$mSCG|>C7az1&pUMiRO{8-x zwP`DU4;3qHVSpC47p_)Vs&|nB(Z0Hkc79?^&-nui_NZI);0xJ?T{nl#IGtt2&NT9_ z-i~q*qqY>fHb**bxJ#Z>oiA31Tr0VKxcH`4r+@ZF#qUeFvpepE!sJ@5re|w(NFs(5 z>NQI0j@<|pFcL?I9uW;PaQx@)_Q_wVnM7NUpypRIbUM1OH%Tn=j{t~TyzJEPbZ|yF zX9ZDo6QWRhE+>gX2K}RK#uYVH5{B5+6?VffXZHbiIMXAhH#vr+aT8{4If#3DLl#Zn z)U>05M*GGBhCp07eLXxZ-d5}Ks*~o2qJ&H;ML9crrtJ1*uHZ%pN;4Ks{nWTSR)LYh zYu2#!Yn*pK&ze*R4}^ya?J84U?l6y%6)Qbr^seu?y0z~G*dKz?B}5Ggnv2{M$PkXt zFdOp^*VY0diQ|sLYWdtQW`G-fvS-@dn$y5<|7m^GY|UwcjA+>zw70P^FLHOh)VMP* zyXIz&xp+giT!n~&yLhZz^x>jjZ!7!l2ou?=OP5vH-j~A|YrTB5W#B>Wd^qsNKr0f{ z2zPm6FZa=H?BPrv?IRiK$+vrQHYc5D&x-^O%e^D#4$n@?8)cwRl1@#*jMDo(tQ!pi%2%5mMye-48w17e#O~B@2k16e%GS5Q^*H zSEQqgd9QNYGj+O7S{`R}HUiD14>9^$jREu%GH*$BXQ(I<^NT@skF4Qm&@Z)QQ1_40 z0CV<)yJ(Vt1H;USJc=os)+ogh58>rGw0xSZ<3sttWyN#Nk#htS8w=529-M(3gpGXo zW2+Hfwik(@t1F=+_o&X@I1UPsj-k8yl8qg}pQC0A>Cq^&>g)KEGTw33CAKEa*i}sy zmL415iH#M#L}upP)z!8+w;WCcrA7a8ZV#{I9^j@f(j~`svA3WVEg=+(QFEscE^lXg zmDIn?x24PY@s^KD9;fng%WT17mWb2Nl6Q78SGK=cCa>Uc?^tW!Y_H)>eFB&>&Uc<) z%=QU>I#J^o;K3gu>b*SZ5If`84t`I~%KyrXb#c;wm{}JHTP8e^9ljcT+**52O0cV{ z+OosOZvN*p|Goi}efM&iwa=@XC;wXQLntq)zak;)&-=B@bOip=lGZ99x{bqdQ^9fn z|B&_7L2(Apwm89q1cG~TcPAvc1$TFMTihKI+}+*X-Q8^=IEycC`*MHx-Kr;lebqfu zJySJR)8F(tCnH}n>`LuK^y)rpA>Z%jD&tWhIJt*A|xmpho&HUEPb&t)r2t9q=NnlTt{Ozw$ zM*3D8dT51&H}Qx(1=LdM=kOsO`1c0$5J1oj6LS#p@2lu2(?@!c7I-q;_H zQqGHY<#D&W3knc3_PvI<>MJk^x38GxRcd)mkt zkGnuEP;U;m+6Nl>ahy$rmGXAB%AEHdgbHQOns$p;_@|Ck*?zIU-=^gYV|tyvhTW95 zgwj+}Hnwjtd@l-&EkL7>F0>G_ChElftpaK6D4DJ7b>bv|eq^kH)z@&3XU_PWQuolr zn*lPaE>TZn)?ta&e>l)i->?2<)+@YO!+YuMod&u(^8tPj(6y08HqI&vT4onrs^*?b zQf8yQ_8n|Y?L{l|u4q&iDx8uOELCdP3W`UU_onni&~EgZChn>uRA9NXCKH~0r<{|N zE;4+NBasLK~kY$6$!6Z zRkce|OvzIAcr%?so79Mtz3X>;@3c^ibj2u%vw>=U5rJ?Ayqk`n4kM9I+^r@1gqygRb0C zj~`?cd|w$H*=jpW%Jw@6bcq@z3f(;M|zi3)R%bXG}I|GvlLVbWNo&TQ4({2!q;+K1p z?^tLwthsYRRd`vr^CIc7MMowzg#yYgxYC&Qe=V#eDN(SLv=ciBM_i`i1n8$rF(RxA zXy1nzxi(Fxu}!-!9OlBa4|sEL1!kOt-;z}PFNID}XbxkbmK?QP%gc|e6jHa4@C7NY zr(Qrgw#Y@kduw`hHc)!!Q#Z}OoH&=sE@4q*>t$U=ROUUy;$2s8-@afu$~(!*yTOfs z+FpVjshV+QSCn#90a&QH)Te2x9iJ&@r2YS>q%2f&?5w{fCoY~MvE5&)rz|u0=l`YW zB});xKSO+Zr)ZTpxhvYIUMXf0SXNIR#Ao%CNKjGcB{AQtnME)wnRR&eMNl+`{Qd3& z7hWt?3vCM(Lvl*aLWc4Cx8RabOL$Ar2mP*4A5DNi)Y=ROV&{vl3~9$eE^Qp9E(Ep{^=cx z#)Bfk-R~&Hjdc)Cj%A{ zojN8Kp9S^C7K;UEsT5fDZ=Q8O;JeQ06>5)w?TJvRa7#BG?#FMjT{9ZDo@~ATUwV5( zCfhMtQ5_K#fzzPIl+;HT1^=McE5)~u%(o9H+TzyN9Bky5p5LqHjI~3@Gil6}5n9`* zLvllUl0|;Y0)c7Cd<0GgD+)uSnDr3e;0`fGkb+WjD7_zlW<#|@!4RGNNo*yp!>B{NCO4!p6fi{DrRziJ z1N8CtY4_;`a0M&}=s+<*GeF5g%RPGr zhR4Lvp05e5-JJUu>khIP&j#B!t9rn{zJZe}eE#8&D*`a7y=;HZDvwx{ZT1!##_w`N z7Uuj@dgpT!Tk(Ilb2~)mMy(;X{eHZ%le-F7g)(6C4@N)=Knk!{3VCHZxD>e;Kh`8!LAFjHx?r#I%x``?LsB1PS%rMd61-p8E6#pE#2jcTi2 zeJ>(B>TPlL6up9*^2lTP-bH+4Kh%ktD(Bk3WiKiS<|HABOxZgCJ#_h5>C*6;A&ajZ2l%ajiML{ILo2VV+P%a2Hk~akTG3}@)^Y`M|H`vJ zGTeC^!E4H*Y4#4&MM3m40zCDtXY{{X`glUxxQ9 z(&tH6_k>=mqrRnpxS_yCYrub;PV;7=7Z8H?G|a|E6FH?=Py$^-?_x*O96Fk zYgo+f0pbA<9+q!{Hm;trk07FQh^=!zqZtUUYMN5ka`*9|eR_ za-p-%)(6rztwuwfELo8mk?3Cyke<2n*xpxRg5gT_^tU1fF0zKTk(j>;L3gDn{jQP7 zIE*dwf<}{@j0-Wfq5Dz;r_X+DzbK;Ll!tt`L8|G%?VcdTmIGgXf3>VFgXQGL&vMOr zYqo02yf8DGb37{+6Fw{v*Fkl;DVLM0?yNOxdL4!&B8v8A1WWc{@&(!%Io*h- zmQGeD_;--t$Sf7VP?9UB(teTv5-*6-=aASz$mV;s%0A#18KOr5UA5V`4NK*3kgd9Q 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 z z7Y{3-ok;7xUw~zX%YvAn86z|AM1O=XU^@bGYUmQ^fM8Y|98`=K#ca59ngV4Ye1nC# ztfeWx!C%)Drf2G-R{3DpgtFlr6$$P~Ysv$O^a#MXi<#sWv|4j$J4ewuuYJRTYoLDc zB3tX&a=p5xAr$CXI#pFcA*=~;L53-s-LZIP;~DwmOTy@^C=^6+daOP0_B3Tgl9l1tNc+_^!`TJxycEi<|8@G=SGuVVr1_6D)SUu{KOdJj!N=%J6C_A?~5 zNo#_PVF{S%8sF4#4n_gJwvq1W(d!oJ4L}_i042t-yL_mJ*f*HuwZ!P0XkAJ~Tc4i; zyVQJ`rLyJ_d~@0#8v-b_BZ^WVyV8fHwa{4?x3GZt)SAOC)?s()BnI0TLzX~VM)!+g zXiybw(0KQYKyRVR80V}mtm0+Xy)&ipYiHu&*3MzO7pgtG@CCQO9O~Zm_?N(r$vlHh zA?LBr74+i*zSiP{Y;gg$*^3HGPA7%MqsfR=bCC6Iqy0lih^DTN;Il znr3y-Na3;x%+qNCDwxXYjerW5o)}ip6i~Pfw&NU+uhf{=imEh7J336r`1OYnilXUu zNaB7o2Pu*lriwG&C8PT`NQ2O+QwSXmaqLr>&q6-Lt~5WKjeFo2W`_vvA;U?WLLIe6 z1%yL?tAKcbuw~~PQn7YyfzGE84(=!+*phGY)47~F=$myzya>YP5j3p%vvwy&lKp>l+SQSgnm={PGG8$%T$4@p*A+0-O|b`7Qd^tL!cA(JBSq1 z4P%iD*>7>z<)RwH&mUz{Oz0t*%)MRR*4zb5gE!Hu3TOv)^ppIrRgj_n- zn=NdWkboHHkZ~R?ew|hZ$!!Tux4D|pD~iG>p#{9HNip8s{G!nUnL|-SJkb6c#fFR3 zCpL!oxE~j3z=#6xr5^BEEw$243x12L#nha*%rYmo@F{BXEH2;Py@kHN|A)oYg!1Fp zwxXsa0cWLke@0PZE|y>uB{8dDOqP^YKDKCV*64~cWm(0AC8H6HG&3c!Dq8Oc7dFQt z*ivseH^}KaN8jPv^ofWq7*ka~238mO8SGB6>=F1^S5uRPg(TtCl+p`%0~_k8p4V7e`dUlXhsG%NauL+pXYzU^XbFS7tr@vyBx%U zcQ+f-;nx7AfE9ldvKX)kup!w&X5d|q@F-v|;8MVK00In7(uH&-?fWlm?NJ?sxM`?u zz_7p~a1^xMXig;JpGAF41BRHU;<6MUB}kMm6>7ueKhOX8voOIbe`m6j>~uQGl7z74 zW1VCd!Z=4q*cAwib#W3oA-$H zfL6dlz*4{}z#70y-B2Fj>u%P6ra2Ih3D5u)fDm8-Ujf;fE?u{y#O45 z2aE(10VV>w&44!m+W=qp0DeH%p1=|PhKsvw+ z$OlvarU7Dr1%M@h6@YbsmjK%UKLUCj1KI$*fH8ncfO47VBImu1K0}q8n748 zFB#4B-smC>(WD^3UyPfTvE--0Bt+=_10Ct^XKJj4^a18( zc*!Ho%`PQ~CnawZy5CgPP#v+ZZQ8n@mPg1b4*2tFq3k#`%acXJ3UC*7B-}(b+X>jz z_g7m8^JrX=KWgo&p$*i}ta9ktYC?*sABUk^Lae%0DR`#Q@KR&@r8I^%@3s8wV;%y))^u;wrZH+1 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%0A-1$4vtZ~{N96Ur2iuriwL1?|L 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%0Dy;|;D9Depyc}&2+)MK91q;b#&&jjlS6ft= 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 z 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¾K1pwOc}zLAIGckH&n4i*Ns059QfLa> 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

      5Ah#%Gv2e{YeI&Y*6(o+jHfoR1oNY1r`) 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

      REn!yoE>$_9s}A(OF%gJ(Jg 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 literal 0 HcmV?d00001 diff --git a/PowerEditor/bin/plugins/NPPTextFX.dll b/PowerEditor/bin/plugins/NPPTextFX.dll new file mode 100644 index 0000000000000000000000000000000000000000..e64e4c3016007b1473a2eb3f9f6583f71533a32d GIT binary patch literal 132096 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 literal 0 HcmV?d00001 diff --git a/PowerEditor/bin/plugins/NPPTextFX.ini b/PowerEditor/bin/plugins/NPPTextFX.ini new file mode 100644 index 00000000..5769c7c1 --- /dev/null +++ b/PowerEditor/bin/plugins/NPPTextFX.ini @@ -0,0 +1,29 @@ +[FindReplace] +RepositoryFolders=TextFX Original:%CSIDLX_TEXTFXDATA%\ReplaceSets;Most Recent Folder:;My Documents:%CSIDL_PERSONAL% +RepositorySelected=0 +[Settings] +SeparateQuickMenus=0 +BlockOverwrite=0 +AutoCloseBrace=0 +AutoCloseHTMLtag=0 +AutoSpace2Tab=0 +AutoConvertHTML=0 +SortAscending=1 +SortLinesUnique=0 +MarkWordFindCaseSensitive=0 +MarkWordFindWholeWord=0 +DisableSubclassing=0 +CaptureCutCopyPaste=0 +CtrlDAlsoDupsBlock=0 +[Viz] +VizCaseSensitive=0 +VizWholeWords=0 +VizRegex=0 +VizCutCopyAppend=0 +VizClipboardAlwaysCRLF=1 +VizClipboardReplaceNulls=0 +VizClipboardCopyAlsoUTF8=0 +VizClipboardNotUnicode=0 +VizPasteRetainsPosition=0 +VizPasteBinary=0 +VizPasteToEditorEOL=1 diff --git a/PowerEditor/bin/plugins/NPPTextFX/AsciiToEBCDIC.bin b/PowerEditor/bin/plugins/NPPTextFX/AsciiToEBCDIC.bin new file mode 100644 index 0000000000000000000000000000000000000000..0a2c2b2f6adf206171ee4e533ba70c607337fa09 GIT binary patch literal 512 zcmZQzWMVeg)zcSaRpsX4<>MC+6cV|V^%}0-)Jbm{3#mlu1_QvN{ zHa0c4w6?W(bWWT!dCJsj(`U?Fw0OzVWy@ErJm7y}A-jU2lCp{@o4AIimbMNjm$ZSQ zl(C7a8Ha_Xl{Jfq-9twwXBSsDcMs3Npx}_uu<(e;q~w&;wDgS3g2JNWlG3vBiiWQ4 zp5DIx3A1L;nLBU(f>o>6c&%H%VdJLFTefc7zGLUE-Fve3?LT$;%-M72Z{5Cg_ulIeD10pxxzap{gupe?Ly>=P!6 zfxN*oW9F>cBBJx86c#Lm`sb>ijfQrO+Df4PYeDuas%U9i$LZ?B-0@ULHQvr1=$gIz z_8&NSD8WkELETpAa3ah1MnEB9Pi-N?OfuRv7e9bK^A^ryd>b?H~ literal 0 HcmV?d00001 diff --git a/PowerEditor/bin/plugins/NPPTextFX/NPPTextFXdemo.TXT b/PowerEditor/bin/plugins/NPPTextFX/NPPTextFXdemo.TXT new file mode 100644 index 00000000..9fb22f5d --- /dev/null +++ b/PowerEditor/bin/plugins/NPPTextFX/NPPTextFXdemo.TXT @@ -0,0 +1,386 @@ +Bugs: Indent & Surround is messing up CRLF line endings +Bugs: Delete Blank lines won't delete every line if only blank lines are marked. + +To install this plugin, unpack NPPTextFX.DLL and NPPTextFX\*.HTM;*.TXT ;*.INI to the plugins folder in the N++ install folder then load N++. Delete those files without N++ running to remove the plugin. If everything is working, a Plugins menu will appear and the new tool should be listed under it. + +To develop this plugin if you have the source, unpack the entire structure to the plugins folder. Dev-C++ and Code::Blocks projects are provided. All the compilers are supported but OpenWatcom32 1.3 produces a DLL that is incompatible with Windows 98. + +To view this demo, load it into Notepad++ and perform the actions suggested to see how they work. If many tools are similar, only a few may be shown. No descriptions will be provided for tools that are totally obvious. + +**Demo: Characters Menu +**Demo: NPPTextFX + +Programmers waste lots of time and make lots of mistakes doing repetetive but simple tasks. TextFX performs a lot of very odd transforms the purpose and usage of which may not be immediately obvious from the menu descriptions even if you perform them manually on a regular basis. Because of the limited user interface implemented, some transforms require obscure actions on your part. This demo will show you in detail what the transforms do and how they are used. Always remember that no matter what happens, Notepad++ can undo it so you can try again, unless of course, you ask TextFX to erase the Undo Buffer. + +**Demo: Quote Changers & Text Converters all require some text to be selected + +You are often programming several languages at once and each may have different quote ("') rules. The Quote Changers allow you to alter quotes in large blocks in ways that are neither easy nor reliable with normal or regex search and replace. The rules are not tied to the current language selected since some languages are embedded in others. + +... This PHP code is incorrect since proper HTML tolerates ' but prefers ". +echo "\n"; +... We can use the Swap Quotes to alter it to this: +echo '\n'; +... but that is still not correct because \n does not expand inside of 'PHP' strings. +... Undo that and Escape ' to \" to get the correct result. +echo "\n"; +... Doing this is neither reliable nor easy with search and replace. + +**Demo: Zap all characters + +This tool is usually used with a rectangular selection on text that is in columns. All it does is convert every character to a space, useful for erasing columns so that new text can be written in. It easily zaps all characters in a non rectangular selection but I can't think of any reason why this would be useful. Zapping all non + +**Demo: Zap all non printable characters to # + +No compiler will accept following math but it's not immediately obvious where the problem is. Mark it and zap all characters to # and you'll immediately see what the compiler doesn't like. Any character that isn't a part of standard ASCII (32-126 TAB CR LF) is replaced with a # sign. Typically you'll want to undo any changes this tool makes and manually make the corrections. The purpose is to make it easy to find where the odd characters are. + +c=x­4; + +**Demo: Quick Menu (this menu can be pulled out of the Plugins menu by ticking Move quick ... in TextFX Settings) +**Demo: Mark word or find Reverse/Forward + +Programmers need fast and handy ways to jump to different points in a file. In this file, there are some printf statements. Search-Find is clumsy because it requires so many check boxes and text entries to get what you want. Instead, you can move to the nearest printf and hit Ctrl-Alt-DOWN ARROW. If nothing is marked, the nearest word will be marked, and when you hit the key again, the next occurance will be found and remarked to make it easy to find again. You can easily navigate between every such word in this file, including using Ctrl-Alt-UP ARROW to come right back up and continue the demo. If the automatic word selection is insufficient you can make a more precise selection and search for that. Some languages and situations will require that the search word be case sensitive. To make movement fast and easy, no beeps or screen flashes occur when the text is not found. For example, we want to write a new convert() all line but we have forgotten the proper calling sequence. I've written in "convertall" below so I can return to this point then we can find the next occurance to see how the function is used, make a copy, and bring it back. + +convertall + +**Demo: Matching Brace tools require a brace to the left or right of your cursor. The left will be used if there is a brace on each side. You may optionally select the brace but this is usually not necessary. + +Mark to matching brace is best used to grab () enclosed text. In the following, we would like to move (bktpos=...) somewhere else but it's hard to visually pick out the correct ending parenthesis because of the confusion. Place your cursor to the left of "(bkt..." and select "Mark to matching brace". We can be to the left because there is no other brace to the left of the carat that could be used instead. You could also place your carat to the right of the ) if you knew which one it was. + + if (curpos>0 && (bktpos=SendMessage(getCurrentHScintilla(currentEdit), SCI_BRACEMATCH, curpos-1, 0))>=0) { + +Mark lines to matching brace is best to grab complete function, do, while, and if code blocks. We want to move the following struct somewhere else. If we were to select Mark to matching brace, we would need to manually augment the selection to include the "struct NppData" and some whitespace at the end which is quite difficult. Place your cursor on either { or } and select Mark lines to matching brace. + +struct NppData { + HWND _nppHandle; + HWND _scintillaMainHandle; + HWND _scintillaSecondHandle; +}; + +... Notice that lines are marked after the end of the } up to the next non CR/LF so the entire function along with the trailing whitespace is marked. No whitespace left behind! If demand warrants I'll support crossing over "} else {" lines to reach the end of the if statement. + +**Demo: Edit Menu +**Demo: Fill down & insert + +We have just modified the convertall() function to take an additional integer parameter after the first char. I have modified the first line with the new desired value but I'd prefer not to hit the down-left sequence that everyone loves to hate. Having recently lined up the by a (,), I'd prefer making a rectangular selection around the text and the lines to which it is to be copied and having the editor insert the text for me when I pick Fill down & insert. Spreadsheets have done this for like, ever. Why can't editors do it? + + v Alt-Click before the 0 +convertall('c',0,"'" ,"\"" ,NULL,NULL);} +convertall('c',"\"" ,"'" ,NULL,NULL); } +convertall('C',"\"'","'\"",NULL,NULL);} + ^drag until after the slash (for demo above) + ^drag until after the 0 (for demo below) + +Thanks to us putting in the wrong value, we can demonstrate the other fill tool. We want all (1) ones to be in that newly created parameter. Change the first one to a (1) one then box out a single column for the 3 digits vertically. Select Fill down & overwrite and they will all switch to ones. + +**Demo: Insert (Clipboard) at column through lines + +This demo is tricky at first but is quite easy when you get used to it, much easier than hitting down-left-text-down-left-text... The first step is to specify the text to be inserted. The following lines need to have id changed to "testid". First, we mark the word test (<- you can mark that one if you want) and copy that to the clipboard. Then, we mark the following text without the Alt key starting just before the i of id and mark down to just before the i of the last id, then select Insert ... through lines. In standard editors, transforms typically do something to the entire selection. For a programmer's editor, we don't adhere to that rule for substantially greater functionality. + + v-start before this i + + + + + ^end before this i + +... inserting is not limited to static text. You can use # to specify incrementing +counters and $+-number$ to insert before, at, or after the end of line. Here are some +// Examples: +// "text" insert text +// "#" insert 0..1..2..3... +// "#5" insert 5..6..7..8..9... (the default increment is +1) +// "#5+2" insert 5..7..9..11... +// "$#5-2" insert 5..3..1..-1... at end of line +// "$$M$soft" insert M$soft at end of line +// "$4$text" insert text 4 characters beyond end of line. line will be ammended as necessary +// "$-3$#-5-2" insert -5..-7..-9..-11... 3 characters before end of line. lines that are too short will be skipped +This capability is likely to be expanded greatly when someone thinks of how. + +**Demo Reindent C++ code: + +This feature is begged for over and over in editor forums. It's a shame that more editors don't have it since it is easy enough to implement. It calculates the starting indent from the first marked line then simply counts { and } to increase and decrease the indent. This is not intended to be a full styler. All it does is reindent, particularly so you can find that bracket nesting error which is suddenly causing everything to crash. If you code doesn't compile, you might get some unexpected indent results. There are some special cases: + +1) Indents for /* stream comments */ are not changed. +2) goto labels and #preprocessor statements are always at the beginning of the line +3) switch..case statements are indented in a special way that allows them to follow the bracket count exactly. I've always manually written them this way and was very glad when the easiest numeric technique was the one I had been using from the beginning. +4) Since there are no braces, this case is too much extra work to implement properly. These lines will be flat. + if (cond) + stmt; + else + stmt; +5) + +There's some code not far down that needs some reindenting. + +**Demo: convert leading spaces or tabs to ... + +This will read tabwidth and Replace by Space under Settings-Tab Settings and perform the proper conversion of leading whitespace, destroying any non tabwidth multiples of spaces. If a lifetime of horrible editors has trained you to use spaces because tab handling and conversion is so bad, you can train yourself to use tabs by turning on [x]Autoconvert typed leading spaces to tabs and when ever you enter enough spaces, a tab will be substituted in their place. You will need to show Whitespace and Tabs if you want to see this in action. You must have Replace by Space unchecked for this conversion to take place. + +**Demo: trim trailing spaces + +The best programmer editors always trim trailing spaces and always allow the cursor to go beyond the end of the line. The built in editor in Borland C++ 3.1 DOS does this. When cirumstances prevent you from using an editor done right, extra spaces accumulate randomly on the end of lines. This tool kills them. I had considered removing this since Notepad++ implements it but there are two problems. The N++ implementation is substantially slower than mine, and N++ always trims spaces over the entire file. There might be areas where you don't want spaces removed. + +**Demo: Indent sticky... + +Every editor author thinks they know how to indent until someone else starts writing code. The following code needs some indenting. Which lines should and should not be indented? + +void indentfn(char *text,int tabwidth) { + char *d; + if (*text) { + for(d=text; *d; *d++) { +#ifdef DEBUG +/* Another Debug Routine */ + printf("."); +#endif + // Erase some text + *d=' '; + } + } +} + +Try marking the improperly indented lines from "for..." to the first "}" and indenting with the built in tool (Edit-Insert TAB (Indent)). Then undo and try the TextFX sticky indent. Which one is more desirable? Notice that undent does not present these complex problems. Now mark the entire function from "void..." to the last "}" and sticky indent to see that the indent is not sticky if the first marked line starts without any whitespace. + +**Demo: Indent and Surround with {} + +Same as indent but it ads a two lines with { and } around the text ready and waiting for a control statement. + +**Demo: Strip unquoted text. + +Initially you write nasty code. Later you decide to write a much better code to process some strings but now you need to get the strings now interspersed in code into an array. First copy a (,) into the clipboard as our separator, select the following lines, then select Strip unquoted text and you'll see the strings nicely separated by commas. A CRLF works good as a separator too. + +if (strcmp(s,"NASTY")) { +} else if (strcmp(s,"CODE")) { +} + +If you leave more than 20 characters in the clipboard, a comma (,) will be used as the separator. + +**Demo: Kill unquoted whitespace + +Lining up text by (,) or other characters can lead to whitespace getting out of hand. Sometimes you need to revert back to the original non spaced version. Select Kill unquoted whitespace to make the following lines small again. + +{"E:-" ,pfdummy ,0,FALSE}, +{"E:Sort lines case sensitive (at column)" ,pfqsortlinesc ,0,FALSE}, // this isn't handled right +{"E:Sort lines case insensitive (at column)" ,pfqsortlinesnc ,0,FALSE}, +{"E:+Sort ascending" ,pfSortAscending ,0,TRUE} , +{"E:+Sort outputs only UNIQUE (at column) lines",pfSortLinesUnique,0,TRUE} , +{"E:-" ,pfdummy ,0,FALSE}, + +**Demo: Split lines at clipboard character. + +Joining lines is easy. Splitting lines is more trouble. The following lines can be converted from a list on a single line to a list on multiple lines. Copy a (,) to the clipboard and select Split lines at clipboard character. This tool may be dropped when Replace is improved to where it can do the same thing. + +" Quick"," Edit"," Convert"," HTML Tidy"," Tools"," Viz"," Viz Settings"," Settings" + +**Demo: Line up multiple lines + +The following lines are hard to read and would be much easier to debug if all the commas (,) were lined up. Select the text and choose Line up ... by (,). Notice that the (,) embedded in the string is skipped. At this time I'm only detecting C-strings but VB/SQL and non escaped string detection is already available and used in some other tools should demand warrant its addition. Most of the time you can just manually fix any incorrectly detected characters. + +{"Escape \" to \\\"",convertescapesq,0,FALSE}, +{"Escape ' to \\\"",convertescape1qsq,0,FALSE}, +{"unEscape \\\" to \"",convertunescapesq,0,FALSE}, +{"1:Line up multiple lines by (,)",lineupcomma,0,FALSE}, + +... You may line up by equals (=) or any character of your choice by copying the desired lineup character to the clipboard and selecting Line up ... by (Clipboard). + +**Demo: Rewrap Text + +To rewrap text at any desired column number, copy the number to the clipboard and select Rewrap Text at (clipboard) column. If you use a number<8 or number>2048, the default width of 72 will be used. Rewrap text automatically assumes that blank lines are the start of a new paragraph. + +**Demo: Pad rectangular selection with spaces + +The Scintilla editor component copies a rectangular selection that includes uneven end of lines as a jagged edge. This is no good if where you want to paste it requires that the right edge be smooth. Use this tool on a rectangular selection in the following text from "Short" to "Longer Line" and you'll be able to copy and paste as a truly rectangular block. If the last line isn't long enough to envelope all the lines you will need to pad with spaces manually. + +Ignore This Short +Ignore This Long Line +Ignore This Longer Line + +**Demo: Convert Menu +**Demo: Encode HTML/URI compnent + +The following is an address we would like to embed in our web page. Upon submitting it to http://validator.w3.org/ we get a barrage of errors that indicate that we have used & inappropriately. We can fix that by selecting the latter part of the href and selecting Encode HTML. + + +Similar pages + + +This will convert the 4 characters <"&> to the appropriate &entity; If you would like special HTML characters converted as you type, enable Autoconvert typed HTML/XML. The Close Tag, and "quot; conversions are blocked depending on your position near an open or closed tag to allow tags to be typed without turning this feature off. Autoconvert HTML/XML only scans the current line for open/close tags so characters may convert in multi line tags unexpectantly. Use UNDO to revert any undesired automatic action. + +**Demo: Strip HTML tags + +This converts HTML to plain text, using or not using tabs for tables as desired. You can select the above HTML and see how little is left after Strip HTML tags. Some common &entity; characters are converted. Unlike most editors which only strip the tags, I try to produce the same amount of whitespace as would be produced from a browser rendered page. You may want to delete surplus blank lines and unwrap text on the text output. + +**Demo: Submit HTML to W3C + +Select the HTML above and select Submit HTML. The text will be launched in a browser ready to submit to the W3C. If you don't mark any text, the entire file will be sent. + +**Demo: Convert .. code command() + +We have the following embedded HTML that we need to change into program lines because we now need our server side scripting to calculate the values. Select the language you want the resulting code to run in then you can change the following into code: + + + + + + + + + +... I'll select Language=ASP which will produce the following VBScript compatible code, correctly terminated and escaped for VB: + + Response.Write(""&vbCrLf) + Response.Write(" "&vbCrLf) + Response.Write(" "&vbCrLf) + Response.Write(" "&vbCrLf) + Response.Write(" "&vbCrLf) + Response.Write(" "&vbCrLf) + Response.Write(""&vbCrLf) + +... Notice that the indentation was calculated from the first line processed and is preserved throughout all the lines processed. Pick an unsuported language like "Normal Text" and choose Convert ... code command() to see what languages are currently supported. + +**Demo: Convert text to hex + +There are lots of requests for a hex editor. Initially I though that a hex editor would be too difficult to implement as a plugin. Then I thought of simply converting the text to hex and edit it as text but it seemed too stupid to bother implementing. Now I use it constantly and would rather have it than most other hex editors. Later, I discovered the need to expand from 16 to 128 characters per line. You can pick as little or as much text as you want to convert to hex. Because this isn't a real hex editor you get to change the text pretty much any way you want and you are fully able to import or produce textual hex listings. When you go to convert hex back to text, you need to be aware of a few rules... + +**Demo: Convert hex to text + +Once you have modified hex or imported it from elsewhere and want to converted to characters, you need to know how it decodes so that you can make way for major unsafe hex. Characters are produced from hex codes that are exactly two and only two hex characters (0-9,A-F,a-f) followed by a space or a dash (-). The decoding jumps to the next line when 3 spaces or a vertical bar (|) is hit. This should be compatible with all DEBUG outputs and most common hex listings. Since it is real text you are editing, you can use the normal editor tools to doctor non compilant hex up so that it will convert to characters properly. There is no required number of hex on a line so you can add or remove hex or entire lines as desired. The offset number need not be present. The text decode on the right need not be present. The only warning you'll get is if you convert hex with offsets and the offsets don't match the original position in the file. Just think of the terrible things that can be accomplished with a binary safe editor. + +**Demo: Convert hex byte runs to LE-... + +It's a bit hard to read Little Endian WORD and DWORDS in one byte hexen. These tools will allow you to concatenate those Little Endian hexors 2 or 4 at a time in the correct order. Because the hex you are editing is nothing but text, you can select precisely the runs you want to see in a different word size. + +**Demo: Convert LE-words to hex byte runs + +Once you get your screen all doctored up with WORDS and DWORDS, you may wish to convert the whole thing back to characters. Don't start with converting hex to text because that only recognizes 2 character hex sequences. 4 and 8 character sequences will be discarded. You must first use this tool to convert them all back to 2 character hex runs. This tool autodetects the width which can be any even number of hex characters and it jumps to the next line when 3 spaces or a vertical bar (|) is detected. Note that the hex offset is always 9 hex characters so it is skipped. + +**Demo: ROT13 Text + +Vs lbh pna ernq guvf, V guvax lbh'ir svtherq guvf bar bhg! Move along, nothing to see here! + +**Demo: Ascii & EBCDIC + +Vedit is the only true EBCDIC editor I've heard of. All the rest including this one perform a lossy conversion back and forth. This is usually sufficient for minor uses and better than not having it at all. + +EBCDIC: ㈅@˜¤‰ƒ’@‚™–¦•@†–§@‰†Mð]@À£ˆ…@“©¨@„–‡KÐ + +There is a built in ASCII EBCDIC table and one provided in a disk file "AsciiToEBCDIC.bin". All of the conversion tables I found differed substantially so I picked the Microsoft table which may not be the best for everyone. If this table isn't good enough, load the .bin file into Notepad++, use the hex conversion, and build a table you like better. If the .bin file is not exactly 512 bytes it will be ignored and the internal table will be used instead. The first 256 bytes convert ASCII -> EBCDIC. The last 256 bytes convert EBCDIC to ASCII. + +**Demo: Tidy Menu +**Demo: HTML Tidy (Thanks to PSPAD, an excellent freeware editor, for the ready-made conversions) + +HTML Tidy is an optional component that may not be included with your Notepad++ distribution. If it is not present, most menu items will be disabled and a menu item to the download site will be provided. Select About Tidy to find out what went wrong during loading. The TextFX plugin source includes a project to compile Tidy sources into a DLL if you need a newer one than is available. You may also download the publically available libTidy.DLL which is very old and lacks many modern features. + +Once you get HTML Tidy installed and running the menus will open up and About Tidy will show you the Tidy version in use. If SubClassing is disabled, you can only run Tidy against a single configuration in HTMLTIDY.CFG which you may need to build and change yourself. If SubClassing is enabled, Tidycfg.ini is scanned to produce the menu items (limit 50) from which HTMLTIDY.CFG is automatically generated each time you select a Tidy Menu item. If you run the same Tidy over and over, the first Tidy option will run Tidy with the same configuration until another Tidy menu item alters it. If you add or alter the name of any Tidy menu options in Tidycfg.ini you can select Refresh Menu to update the menu from the file. + +Tidy will use the selected text or the entire file if no text is selected. Often times a Tidy run will produce a Htmltidy.err file which you can leave loaded in another Notepad++ tab and any time it changes, that tab will refresh the error text. + +**Demo: Sort lines + +You can sort lines on the the first character or at any column of the line. Entire lines will be sorted and where you start your mark on the line determines which column the sort starts on. Text before that column on every line is not considered in the sort or uniqueness test. + +v-start before the "P" marking entire lines to sort on the first column +v v-start marking before this character to sort on this column +PFUNCPLUGINCMD hex2decimal() { convertall('n',CAFLAG_DENYBLOCK,"h","d",NULL,NULL); } +PFUNCPLUGINCMD octal2decimal() { convertall('n',CAFLAG_DENYBLOCK,"o","d",NULL,NULL); } +PFUNCPLUGINCMD binary2decimal() { convertall('n',CAFLAG_DENYBLOCK,"b","d",NULL,NULL); } + +Line 1 XYZZY +Line 2 The Cave +Line 3 XYZZY +Line 4 XYZZY +Line 5 The Cave + +If you sort the above lines at the column starting XYZZY outputing only unique lines, only a two lines will be output. Since a tool to insert and remove line numbers is provided, you can sort unique lines then return them back to their original order in 4 steps. + +1) Insert line numbers +2) Sort unique after the line numbers +3) Sort the line numbers +4) Remove the line numbers + +**Demo: Tools Menu +**Demo: Insert Ascii chart or character. + +If you mark a single character, one line of the ascii chart is inserted +into the document for that character. Otherwise the entire 0-256 Ascii +chart is inserted. If you don't know the ascii code for the following, +you can select it and choose Insert Ascii ... and all of it's codes will +be inserted. + +¨ + +**Demo: Insert Ruler + +Notepad++ doesn't have a ruler so I built one that can be inserted into the document. Using rectangular copy and paste you can make this ruler as long as you need. + +--- 0---|--- 10---|--- 20---|--- 30---|--- 40---|--- 50---|--- 60---|--- 70---|--- 80---|--- 90---| +123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789| + +**Demo: add up numbers + +Most of my use of commerical spreadsheets is to type in a column of +numbers and add them up. I thought it would be nice if my plugin could +do the same thing. The following is a magic square. You can select each +line and column and use Add up Numbers to verify it. You may sum the +entire square to verify that it is 4 times what the line sum is. + + 16 3 2 13 + 5 10 11 8 + 9 6 7 12 + 4 15 14 1 + +**Demo: Viz Menu +**Demo: Hide/Show Lines + +Some editors implement code folding which takes too much manual labor to set up. Some editors can bookmark all found lines but this is little use if you need to see many lines of bounding text interspersed with undesired text. Viz can hide and show lines based on a search criteria or selected lines. You can run several viz operations in a row to generate a sequence that can be inserted as comment text and reused later. Select Show ... All/Reset Lines to start a new sequence. + +**Demo: For example, we would like to know what all the Demos are in this file. +**Demo: Copy **Demo to the clipboard then select Hide Lines Without (Clipboard) +**Demo: text. Now you can move around, make changes, search/replace, copy text +**Demo: from one place to another, perhaps return to your starting position, and +**Demo: when finished, select Show All Lines to continue the demo! The line you +**Demo: started on is always left visible no matter what rules may try to hide it +**Demo: Cut-Copy-Delete tools are provided to operate specifically on hidden +**Demo or visible text. Be careful since all other operations on selected text +**Demo: includes all the hidden text in between. + +**Demo: Viz Settings Menu +**Demo: Cut Copy Paste + +I have added many features to cut copy and paste so I have Subclassed Scintilla's. The original tools are still available in the edit menu in case you find a situation that isn't handled right. At this time Paste Binary cannot paste rectangular text. I expect to have this working in the near future. The default Viz Settings are selected to be both compatible with the Scintilla originals and to be more officially compatible with the Windows Clipboard. + +**Demo: Cut-Copy not in UNICODE + +Scintilla is a UTF-8 editor which is why there are no double byte Scintilla messages. UCS-2 is always handled through translation, such as copying to the Windows Clipboard. Unicode is preferred on the clipboard because Windows can paste it into any Unicode aware application. Windows cannot translate UTF-8 to UNICODE. In some cases it will be necessary to have the UTF-8 text on the clipboard without the UNICODE conversion. This option will only copy UTF-8 as 8 bit ANSI and Windows may convert it to a double byte padded UTF-8, any of which will paste as UTF-8 into any application. Depending on the OS and the editor mode, this and similar options may be autoselected or blocked to ensure compatibility. + +**Demo: Capture Keyboard Ctrl+C,X,V + +TextFX doesn't yet do the conversions from UNICODE to ansi codepages that Scintilla does. If this is a problem in your language you will want these keys to map to the built in Scintilla routines. If this is only a rare occurance then you may want to use Edit: Cut-Copy-Paste and let TextFX have these keys. + +**Demo: Paste/Append binary + +Paste binary disables EOL conversion and takes the entire contents without the last NUL character. Binary paste may behave unexpectedly depending on the copy-cut application and OS. Check operation carefully before using regularly. For example, Windows 9x pads the buffer with random trash. Many editors are not careful about how big the clipboard buffer is. + +**Demo: Settings Menu +**Demo: Cancel overwrite moving from current line + +Proper handling of Insert/Overwrite is ignored by editor authors but vexes programmers constantly. So far switching to insert moving away from the current line is the best way I have thought of to eliminate overwrite accidents without totally disabling overwrite mode. + +**Demo: Autoclose HTML tag + +This is copied and updated from the N++ supplied InsertPluginDemo. I hope it handles more strange cases than the original. You must have an appropriate language selected (HTML,XML) for this feature to perform. Any time you type a tag such as , a closing tag will be inserted after the cursor, unless you enter a close or self closing tag like or
      . A single UNDO will remove any undesired automatic action. + +**Demo: Autoclose brace + +Each time you type a ([{, it will be closed for you. ([ will be closed immediately after the cursor and the { will be closed on the next line with the same indent as the current line. A single UNDO will remove any undesired automatic action. You must have a supported language selected for this feature to perform and you must be at the end of a line. Braces will not be autoclosed when editing existing text. + +**Demo: Disable Subclassing and advanced features. + +At this time the extended Tidy menu and Ctrl-B require subclassing to capture. A future version of Notepad++ may cause Subclassing to fail to operate correctly. The features are still available in a more limited form if Subclassing is turned off. + +**Demo: Move quick menus out of 'Plugins' Menu + +TextFX Quick and TextFX Viz can be made into separate menus for easier use. They are left inside Plugins by default so that users know that TextFX is separate from Notepad++. + +**Demo: Improve Home-End ... + +Many people ask for Home and End to not go from BOL to EOL in line wrap mode. The ability to go EOL and BOL of screen lines is built in to Scintilla. This option enables it. diff --git a/PowerEditor/bin/plugins/NPPTextFX/TIDYCFG.INI b/PowerEditor/bin/plugins/NPPTextFX/TIDYCFG.INI new file mode 100644 index 00000000..c8aeec2e --- /dev/null +++ b/PowerEditor/bin/plugins/NPPTextFX/TIDYCFG.INI @@ -0,0 +1,190 @@ +; quick reference: http://tidy.sourceforge.net/docs/quickref.html +; cesky preklad: http://www.pspad.com/cz/tidy.htm +; sample config file for HTML tidy from http://www.w3.org/People/Raggett/tidy/ +[Sample from Web Page] +indent: auto +indent-spaces: 2 +wrap: 72 +markup: yes +output-xml: yes +input-xml: no +show-warnings: yes +numeric-entities: yes +quote-marks: yes +quote-nbsp: yes +quote-ampersand: no +break-before-br: no +uppercase-tags: no +uppercase-attributes: no +char-encoding: latin1 +new-inline-tags: cfif, cfelse, math, mroot, + mrow, mi, mn, mo, msqrt, mfrac, msubsup, munderover, + munder, mover, mmultiscripts, msup, msub, mtext, + mprescripts, mtable, mtr, mtd, mth +new-blocklevel-tags: cfoutput, cfquery +new-empty-tags: cfelse + +[TiDy clean Document - wrap] +bare:no +clean:no +fix-bad-comments:yes +fix-backslash:yes +indent:yes +indent-attributes:no +indent-spaces:2 +char-encoding:raw +replace-color:yes +wrap:80 +wrap-asp:yes +wrap-jste:yes +wrap-php:yes +write-back:yes + +[TiDy clean Document - nowrap] +bare:no +clean:no +fix-bad-comments:yes +fix-backslash:yes +indent:yes +indent-attributes:no +indent-spaces:2 +char-encoding:raw +replace-color:yes +wrap:0 +wrap-asp:no +wrap-jste:no +wrap-php:no +write-back:yes + +[TiDy clean Document - nowrap, no indent] +bare:no +clean:no +fix-bad-comments:yes +fix-backslash:yes +indent:no +indent-attributes:no +indent-spaces:2 +char-encoding:raw +replace-color:yes +wrap:0 +wrap-asp:no +wrap-jste:no +wrap-php:no +write-back:yes + +[TiDy clean Microsoft Word 2000 document] +doctype:auto +drop-empty-paras:yes +fix-bad-comments:yes +fix-uri:yes +join-styles:yes +lower-literals:yes +ncr:yes +quote-ampersand:yes +quote-nbsp:yes +word-2000:yes +markup:yes +wrap-jste:yes +wrap-php:yes +wrap-sections:yes +write-back:yes + +[TiDy clean Document - quote] +quote-ampersand:yes +quote-marks:yes +quote-nbsp:yes +write-back:yes + +[TiDy upgrade to CSS] +add-xml-decl:no +;add-xml-pi:no +alt-text:Image +break-before-br:no +clean:yes +doctype:auto +drop-empty-paras:no +drop-font-tags:yes +fix-backslash:yes +fix-bad-comments:yes +hide-endtags:no +char-encoding:raw +indent:yes +indent-spaces:2 +input-xml:no +markup:yes +quiet:yes +tidy-mark:no +uppercase-attributes:no +uppercase-tags:no +word-2000:yes +wrap:100 +wrap-asp:yes +wrap-attributes:yes +wrap-jste:yes +wrap-php:yes +write-back:yes + +[TiDy convert to XML] +add-xml-decl:yes +;add-xml-pi:yes +alt-text:Image +break-before-br:no +clean:yes +doctype:AUTO +drop-empty-paras:no +drop-font-tags:yes +fix-bad-comments:yes +hide-endtags:no +char-encoding:raw +indent:yes +indent-spaces:2 +input-xml:no +markup:yes +output-xml:yes +quiet:yes +tidy-mark:no +uppercase-attributes:no +uppercase-tags:no +word-2000:no +wrap:100 +wrap-asp:yes +wrap-attributes:yes +wrap-jste:yes +wrap-php:yes +write-back:yes + +[Tidy convert to XHTML] +add-xml-decl:no +;add-xml-pi:no +alt-text:Image +break-before-br:no +clean:yes +doctype:auto +drop-empty-paras:no +drop-font-tags:yes +error-file:error.log +fix-backslash:yes +fix-bad-comments:yes +hide-endtags:no +char-encoding:raw +indent:yes +indent-spaces:2 +input-xml:no +markup:yes +output-xhtml:yes +output-xml:no +quiet:yes +tidy-mark:no +uppercase-attributes:no +uppercase-tags:no +word-2000:no +wrap:100 +wrap-asp:yes +wrap-attributes:yes +wrap-jste:yes +wrap-php:yes +write-back:yes + +[Tidy: Reindent XML] +input-xml: yes +indent:yes diff --git a/PowerEditor/bin/plugins/NPPTextFX/W3C-CSSValidator.htm b/PowerEditor/bin/plugins/NPPTextFX/W3C-CSSValidator.htm new file mode 100644 index 00000000..da6d45e7 --- /dev/null +++ b/PowerEditor/bin/plugins/NPPTextFX/W3C-CSSValidator.htm @@ -0,0 +1,5 @@ + +

      +
      + + diff --git a/PowerEditor/bin/plugins/NPPTextFX/W3C-HTMLValidator.htm b/PowerEditor/bin/plugins/NPPTextFX/W3C-HTMLValidator.htm new file mode 100644 index 00000000..ac7ebfb2 --- /dev/null +++ b/PowerEditor/bin/plugins/NPPTextFX/W3C-HTMLValidator.htm @@ -0,0 +1,6 @@ + +
      +
      + +
      + diff --git a/PowerEditor/bin/plugins/NPPTextFX/libTidy.dll b/PowerEditor/bin/plugins/NPPTextFX/libTidy.dll new file mode 100644 index 0000000000000000000000000000000000000000..e0205d31496a9f88832570f44b4b11f7750cc46a GIT binary patch literal 250368 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�UF9MJvu2(~ z2KxQ^ouc1pa;@IA@$pw!C6jBJjdbi94a)ENmKeG(!6o$|=5}6)ldG@`<>O?26Y!%y z84rvbcxgBs#ruJH?GlqSVTO7bbwz5_O!*51JnvZ6 zy25AdVy$>{3r~e7Hrze@zTxgI$C$1R7}F){QBG?JM!j2JkM6yS-esG4gO#Oe4ELIT z8w7}@j?f(N`f>rP1vK6iAvzr^aO*m#eE{e^%-lZ~F{OCvW3wjiUV0`@grQ!-%SGl- zeaYt#nIIIPJQLTXW390vqOF*97r=( z|DBbv{G3aijn`YL-A~710`p(a(+@a}QWUIgwZ|T~z4i^~+b5@)e;Q-R5V|pZmQ^To zV@h#8OEXky~X9xs{d(C0g@i&UyHWhdb!752C?5O z(&IR1jsxAu_&|$Qb-`HioW7jre6ae2U?nfrFi|9bX$mc%oB4ZDL$;G>X8*p`P}@74 z)`z~%u-xJ-cY5!kjwf^Nz0Xxuj z{7bocsXF4+0iesy)X>QqUy4}3l2LD4IYMe^qoOx0FVe}m%>b^t{S=MZ?z7~X#&xKM zBsc4VAz4i+;bOxAn$B8TIAE08E*Hx~k=G%*PPhy?x{>bSV{o9lqx$v`XrU2+dahA@ z!c7{frjo|@ciGD!=P$L44@P1jL!KT=oq>LpN8f?|8yahz{*`0&pWJH1jQd8?k!PMv zVNcJ=lnL}g_8PcuxA>tysEdF?J3l5XGS@Hi?NA$hQuq%{~7Ez*9l`@c#Y} z05}IkbqIvr(-+bw?F4Jo39&ID>s{1nLkxupv=;w%K(qKrVa;z}LWa=SwQuUn^HMDu zi2LA2f~tNmmDI2cbwE-GRGEi&o_*v@6o$U)9pX*mZsU%h@T6*tBL$P?LEwv9r zPXL--6|YdMYN&-n8tFye1o^6-3a7yn}ArSP%d*rzVO&axlhA)FB zARR&p8_{66f_MbM`MF@cq+jN?ssDoI)JEiI!HD3qtrKZDcQPinoHIpUhh5AN>OR)?oW~R&w|UmyzczJJLz>ldX!gC-X(s!4*7Cem7Y*DR#`UU%F$l4@yC!)XAS-u zm5&{iBCoR4h>r!rxv6(D`!TElCF^a`!lCFV1sq&CfRq#6CjQ?NLr29w;{6{k;_lz- ze&-DQ5#F@{bk&o_B;Hs7kp@vDQ_Vqun-1h-V}*8~h@-BPHTGoIqBi5ha0ctIKQ3{2 z<)T~_3T#Ar243XhAg;;frJX#{T)7DWA!Fm9gKwCam;iH`;&lG z^i*!1BcW~o0+!hy15v&_7_yc@%l7@n#X;Yb5vD-MF{K{?F&mjbqFSj4(PS~-g9bR8 zX)JlyDZJ$ORIY}ZD+ipnZ`FApblFSm zj#js%xG}LpDE>zU15|#vqAe=ZC@$&eDBW7&C+7Nvndj@RT~v|Gaw`P*r8BY|B1Et1 zuanV?iLK^PV>5Sz`rSY~1=cJSJNjh=*mN7Ct?k{whe_D!-FLCy; zP@??sXwC6TSj)91<(vmNl9$ll5}afcWuL!DLyZ-Gvd)^9k3Mpa9a|e|N853o1Pbg0 zV(%{@-!-9(-&67kE9qi&bJ~JWciFWi%>`W7lw60SCS@Ich4_ASS{oJNJ=UpWn$e`< zAA}CqT0a_9o7Wq|kz1DqV)^AK!SGWy36i?HI<&pDq`vg~y&BL2!+SiZGm9dU4;_t$q7m{^MiIOg2uG4Fo2HXA@d7|4>*(#_1NBI zwC3-8fm-k-uZ-3-sc6ME$tc@44~gjbXpQ!0808Ry5&z7EHnYtM!Vp+9!)5WC7Pv1u z8Ap+vBh$gINb(Ar4^A-QlN#Vv1RVC=>bmCeJSF&gQe*fvFKvt0{G z8F_4yqqo)i|iKll~CT zZQy!#z8eU|bq%}mMmcyCeUh;2*_z)!&e!Yt`nyPcrXq{Vt42{nZ{q)n1zn|FKh9&0 zzd#z#lR&%63Rt?B3Uh*MH#teem2=CSd9}KY8|2v#IqH_Qx$xBAtMrgMY(o5!36b7w zhvn%;p7i7Dez5)xnDh`?xLAugDa4Q#`M(f_Y}%fy=Q;GM^cyarF6;1mAI57@i#*Ed zMsWK1^ekye7~MTwwL={`vp$@^@{lmj5}d+Zd(kuNF^ZhlH@!Q^OAH+nf7X1TGrw;~ zMW=&)TEA@wU{Q7EaW!}LOe#f@pQQm5bsnxowmV^XImm#-8%MeWEVm1#6zNZqtj~%P z{>|!H!I;9+N9jv~oZGK*m0uE8zSeSPo}|?B!$|a-lmkR&Uds7fNj_oJ3-;gck&^~H zAiWc}Dg10%p8k%G@wKF=f95>(OvW|YPFa8qlee}+6H<35I7EX%lFVW5^MZbZB)Lp4 zI&ElQ5mi0N9;hE~y#qlsnLfZwy@RX=Q!%;G*Gkx^C3ky$4bIVYgPMr%ZKq^h#CB(j zl13w3HCEGMlQT8%D~U3XS{b|+sZ!n1p+7Xzw=n92Y87k4!C(6uU!iQklc&!Ox}5Cg z*mh)@t=`wu2ou3Mz5V1-2qJqv*clz|fMig~24+L!=%KW0M|?K~W{*c+rX2wD46v-* z1x@GaV~+a$Zyw3P-RxLBgUhcShxGKAA{i~M2ZCEYb(?mGBH~7&;M96{)JOWIa_^18J`nFqatfA6YlvyTH>_1KBJeKwH6$V2dqYO}9qe>NN#cC;1 zkMe4{NVUY>{+*ruN`F-a3q#)y^}oIf5SR7OT5R(R|H{OznqMV(^DFBL^5ykLYz?vL z&i^EIT(p5x&(5c3ko{Y>qKHp5E@gm)MoMt{*24fMKzTkNkoXUlM|T9(#~;@EG2aS> zSyfi3+bNn=ZJ~lMueFK1hg-mO*D5DIM)90-`zTD&`@xLURboRG=sL+b!T8v9>|MqL z4yKJL^ruil+U5~rU^`mkFJ30$I}u=*eL!CJ*4NOMBbB=XC_L;6(>P0-P6 zr$Dbc3vY8^;T>6T{r5k-%>L`fIkM#Z@6Sj832dyGxj9@bfV0|%sCyt_g!*q4yAv*= z5gw{sW)rMP17B6USw55iQ&?^=^Mv|+dW7;kHvoHH7mV*Px58m_`!pm`u`iu48K{xTO1!s~ zPcDOXSD{d|8&&@+O)og~~ZEQ@Xs<)*#3BLRzxe3*#>D-{gzooED zXJ8IHU`0tl=jmR|FyTC0Hf4!u%&+W&A)sjz&qMOo6Gs@NX{Ilg`T{WM*vT}Leh}QM z7g>JQGL3{b2-t^wS>7f2>5vJ$MgHseQ-=;Pgz+Suzdy{*Fctp}eNO#iVqJwo$^3IDWgXI_|?g5y-Vu$mvr$V$G*hW9};@b%Mwk+f;ONpe)bWaQVx33oTsm)l; zMDW6*+%m?9LjDg5p=VcQPhx50NdJ9x7L}@ECuX6{aT?&rHO6Cl!nQ=J08{2oH}&H6 zrziq`HQhJs1k1e?O19!7UFB1&zd>@XtA>(lUN)FqKsc(>Q7kE6aX!Wo;wr7m#Z9u{En`4Ee&xc}`h0+vi#XfqoxG~uFc@laf6`?A4C#o8yx z_)^~b%+@jPN))oV0F0;GjUKvg&%c-aa1jf|w$z;@M9T`+xB30mNS@NJzd?M!_)Hs) zQtI(46+-A>0ZQ$ym3>^74!16?O9Zh1gU|k^i$Rov1;#cT{aaVD47X<94(Eg0KjeN< zf_7Cjw`<=CHwZ~1J)H$D6xQg(Kw|ztjwKH>ri{y`|26^_8hgv40%CNziZ3R{e{K(m z@%J=pRn4yq5`9wNBnfPhk|V~l^LT9t+Ij~jA??^gu+Y~ac_3yX_08Z4&w}Vaub__a zf?{VQe1oJETvRoEB}nPWI$vIA?n(N!vWWpO9VSA`?!y>yN2bpowG71(BKetv-MhJu z5|CA|kq{D)q9z_HT2|D=X!2wlS5iqfsm7KVLkFdHM9uEzJhIS_)f$*c8rZ=x0phzx zlRuXBFn>@XYVZ6ZVDp#246cg88?BA^24H`7H`8a1<`zbm?ZBsu*;6Tb{aZmsH+QYo zNvBdyRwVj?tBQ7?hf7od(47GucUKo?7H9dJd_rXQfg$@d2wK6++Q$|xSypp1{DD-9 zslCE-#JhR3i!y&kR?gdQ-2?8IAyDFf#lO|H2Av|fSfUla=IY1t` zi|;pPsqI!2c7v;LfB%m%75xc%sWb8g+F08K*nke8?I|9fQ4=8=2^ato68&M(sFS6FJ*1p9QIx)hwqF!KQl*#)vfWQf!`<6$al=T?W}+}SRNjc()! zz68tHuxthwp7bFUbmI?y4E(JuhC!@SDpd@Rb&g+?&P2r8{JHF=r3cirixjGmWOK((c!0OOBEVPJ;0VLPTV7^S(u zCBJuW78iQ1+exu2Sit?(NUxv~BeVz`*`rzspqmC@ESsKQ~R zk4zC`chO#X-^=yAOI|`B01P%x(%RJs6g1mEta8f3-_IW0s<`+vdjM{cEsO=XhM{Q3 z&g^=ccL$!|h2^Xb=TEh}5c@exl4gIdG1K^m*1y8o&+YE4r-fkR?#@v!v(ws8N$ne! z23_O%=VN%zw(!uUu7&u6-eT3kh*X6Gl|@+I=G`CA>V9Qd+AOgD@Eh=OdWZ)S9wH&M ziwW34@D;l+HSc7|6=&w4nW+kTQbAq>%BuSHx59`l2qpT5;zsMzLdfQ0{d~wGB3I6Au|5>zH1K(3dx-Y6 zKC!^M4h`o-xG|x}avgihbX{7wv3$dsD>) zQd@erQCunUhxnYD9!Z_h#v#J^kNE%JlPj;?4HPopc8Ooj>J|}NSxOx2(lb-1FD+w* z+}fJOca@}sK1N2=p1!D0;<};&%Wz#+Zb20{Ro`)6QkIpm-t$V!*Uc@-<8Qg_FKDZ|peo4U_y0A&@M~+pv`Udwh3p zxu|sGM`T}f91ijA=m}D45K(=gi8ZsR_N>BTm62Kd5$SsPbA*-{L7<5?q~XVy%isGo zZ#;m{)@x#Q#EdrS&f3Uk#* zSe-g65^QodjxH7fw`*U1V>|xBsA2FLS6q%QsltygMxqvYC)D;`j18tXvKUQ- zA<+IX6yI-Hb@QxoiD6~&edQd|fYQcj6)SZxsj+`7)#KrL^g&?uhDd6+#F_|SuKB_n z7qmuGlpR3JG&@ejmm)%Rz|8aPhmGT8(&rA%eDX{$&PrX;9|5`-t`Sw3z@4X{2~5S_@_$=I9M&WllCzdQ1010Qb@VBw;XlqQ1*DcY%&MW1(b-zc!dgB(p`c(`^|ot1_U09* zs~MO4wx));R+7uSD)R7Y{6O?p`%9Y#qU<$n8QT8p$WiH*XkTyIg3LNZ6vPYlcp8g*PFH_Y(7Eo5@%Rlcq$+LH)I2xp$~I(djMiJimio6rkm^AbBxuK%l^Vu_vX&kvWK zW#=JsyjqJJR`kW!lCN{SlcgR}{|On1^PhYzK6c?w)x!%5!Pe+q_-PTWFR_(08JA=x z@)DcuEgtm}zv8Lhr!+#KXZ`0q1oUVC`+o-AZN@gy+AF&F7%EA$c4bSL(uvlH^QTO- z_N3KB>+Zm~`#N2O`nY}W;ez{mp4yVh$fr2oCMkX0Id9IMiJb>W@0MfP&fOin*JzQq zy$?;_VUXg|`8s7xOGLr0+*33Vt$ER<71w^#H5 zovnPB^GNO3g^8B3=;Aplp1r@<`pc&IEZOMVQ1gqF(g<->@>HfWPZ)NkpL?F5bJ(L> zE5u(6p#n~)+YF!SKk&5FEw{dXXUh})$_fhNOP?s&Lq0pVQNh=*vcF~<`XLOTe{Icx zK@pdC|1Cf&lbL8J)qGe1{Wz)MVU=gq(po$AkwnX+=#uxTEAc5NxVL!l6lspwPh1OC zY#XCq!Y8?YhYfYKMnO~3iZ9S6qwGHPkA`)ehP&6)FrA6=_He-x?w6Bsp{9UWya<-G zkiEP)cFHI(@}9mjG5z%4NUSfsjoT3GcuMS?AH7Fo+gcd-3|dfFOiFb{%ALj%e)p~>3;YRNJhx~k*U#&X;h_BOIlT&3mA{c{ zn%yP!8cI;=?ab$GKb;$b*n9+CLAOoab!Nciz?+^P{TIW4oHjxj*+x@&J13?J4b{?7r`%~+qt zXVPu!1Af8dq#OFdK%G`y(5xYyt7{0*LW=fV|IPZu>Tax`sbRCMHlR{j;lnLrYg2b zE34YXdMPz!F?xi5-JAa}p)+qo~RWtS6wGy_+Xh&aM5AzvG zb+y0NViR|%+DMOK<0_+xUIvU3$$!()bRort(~=hDs@mjDXwo{ZZ-NWWQm3JGm5BP6 z0lGI)M(3Jmcm$-+z5sLy{$UkcqKjl%L*A?gPKMCQn?I8yRq-xzww=5Q1g+!gqs1-! zZ`q(9R{bvWb}Uyj3Q4l1(@crg7_Cu=DauV1947y**lLOeia=iK)1*@L`2P#`^H7|I zRTX30r*LBXA;c1@y7B!D(1(6bENZ~ejDPE!o*skIr2miUvor^~ zmsK|XADXfmUEHE3vOUgaXmlCothPY%nG+?gDVzm(IU%RA)SHHKwA6r~|Pk}xvxmd~DsV*&3w8PJm zEnpftxYk;wx$TewP#j^BF)_Eaz+{cPdB$_Q-#-T+a<2Q_0E5`mchLh^->il8<%?PE%qUtpjsqGN*Wfs@6JOL%zyF!iMIlrKwkaHSU&33Iq z{ShwfHw>B(l|BamqA!jt9DW$nX!r;~mO#ZgJYj1|I*Q(xy3HokSw-nr^;X=!t{YV> z-vgFPGcGVwdbXSDo6(c3;QKt}{A1R-8!>fX(9%08jCuNc%nAEAJ2dAHFOOZ8^XEux z=Yn$`zw>4lV;!A=gl0ZQoL}kYDTeCPyz`1Pfj-Ok(Bc>IU$O68d9U*4NrB!ncx_w$ z$7vGSv~J0K!R#fJ&xM+3W!T*Kp zfz@mF#k}^#-)rln6}oGhh8ur>h&IIA?-pBzt9!R@)5C-<-r^T{kO916lXtglJ1Mxq z8D-wI(=ntpMU&-9s(2TAVwN{nyh-kY^2$>0C#4VzwuMv${J2R>YzjFWE8bNGP5Ng4 z4@?vYzUPFkifo4s%kBY_g5^zEC+_+aJ&r>n#QLPK(7>(NkHR%*<3Z%T-cCVCz;ysF!A8#)auMC2f!c!K*QP~j*ruP*yBzv z6Ga*|DF0wyxY5-4(#Y`?vllyH$&I3HU5YibM59=@23023m8&hNA+!HrZ5|;M-;|Xq z$i)_r=A8BVel*#{tHZT<*r55M;Wc77ggtY*N&uH4-P9QG!lePt{w75`RL|wmVnq zFz)TeNK{Eetd@PQos9vY`a1WRy*Z6<0LM1w&42E%Y+C{)P^%C&>RNgP{M|~$f6JEJ zJK_CxP%z#*@7TR(zE6jN%r;!);+hNk$@;UtRJaIv_C!WF!aGoOc45nXtFx}#$~T>L@pdIUE^x065F`NMS1&Y;+JUsn_dE1UC9H#RqpyHvf={ma+P z=05VG@}@a~|3djkvrp#6LY6dLnF7akyrk(nI`cswpKWE+W}Q5&x@dNqJDRntlleQd z{7A67d^L{u%Z?YG*#org;6KjOc{9<6lZ5!^7F%c@BvF6w`Xj~65Q$^QKw2i-#JLLm z(8>%H_q!aV6&(~lXW|@gmJU=L8_sA$E+bs1z5BHVung4a&aIX zE$!+=*PQ-n+?@BU*d_}rnFb@@%6DAzR%kFa{V&wtMphO!kgsoka1}1=QZA?C0=6R6MxPYG<7a+tdwt|yo(*+d!k75-UlC0?< zQ}BmCW)sXbWB)#yufIrnTl|Rv+GfoQdeVtzJJ>4|2R8>XIS$eVLZfgWjwbsdZTOc1 zG|n6{c*W0w9q;drwa+@>%PSH2?N$D|K;aOElSwnj0&&P@}k+SFy#g+5p!wWs2L~5FVjOFQ$$3 zg(QUfZi|1ek`7Xm?5C>1A!Z>p)SstXTm1L73NeD-PPsA5tU2hOKKu@yrM}u_e432T zJ;mwM^;bL0ex(W+7q0Ve@t1@zeR$arzUa%9dNB;AABM0lT3Ua-EB^u?(q^nWOZh64 z?<^I+-=35b$q(q$OlqzQMJ(T5`UWRe!HEMFI0q+Up zZiz$}|4FYp+S^v13S$K@qQ{@<{bad0~59OIfI-JBt zek}|?q#MQK3f1F6Tvm;Bq%X~lzwvL~-)UQTVcgZ)Tw*x&2BR3qNw^hm*bx*pj{V)Q9tSsXO-)L=D+zV zq<=t;JpH8|d~?4GK&xtI`bes4!}j^FfKZ-TtNmhw$gf}Q$Yw6D;3cuMaKH75Prgj7 zHlZyF2k}k*zt|(Fzu9FyQ(0jmZNd4~$AI&qh&{`X6yG7l7cj#vuoyUJ1^6Z+dhvO&b4L5$L8&tlVT`m60y#5#T94(OU6-dMnQr2C@Z`0;o#;?tK*x5Tx zUv-ON#&7XMph&A?R)%oX7Vjrz^}|W>|3YPG4T{6zqW!Wi+B-9x0TNHwf>-O*C&=a4 zz#&;SFneR(M7;Lr!9>igTk74a#!!9s@a`@V7T9z6CI6;9m%>s8x3yQen~IW8QpjC- zVV7K)fgm1NaE4Rb;Y*A*bSj=FRby8DlxiP+K8z$U0|c$0k*4-4i*tIr>@w_NG<((`xa-ChN)(Z`(jEikuG@C9hu1=DtYV}%J?m)e9F1MlGuwYDIljx)J;%l`QaJOwq7elAyi+|z!u8QM9f~jc5b&t7H+2T%V>r45x zwmE`f4#(tzzaohqU?r>Wu4NG=?%H7*>HCJK5cif0;k~ za2)R%E3}Vfq*ldIwI=#V+_X~gT)Wu#Kg#6ZQ)c}1e3;t9mHMyRDg(WnD9tHs2iyJS zSVe_^ouYm%Gn&O0G|tWbZL$&KUgrYY^fR9EuI?^cqh=?WNqq&62(P+Z^)Ik5n{BRI z4O~HLcOyA(aYE->keF!ld`$Svi=M%&T`4z7f$hCB`r|C*jXbjOodN4=D+`fb*A0wB zYko=r%vqR`&VgC&~5o!OX)W2 zCF@1%jcC#~=5i&*sIwLCii}cWXXD3Rv{Wck#X1hw3^;$1y?pVVWC6aOPGL)GSVD`6 zXON#p){i&jLH;O!czX{DAirC04suWZlegg~WY(164`s~#GY?-s z+Dw|t`OL_~bbuR}qHYoAgbXVdrl{no> zjL(&j{iyD(wk7^2D3MT!F;-$kuEdR`3ds+Pl3?`otH}S-fu$|;m1*TL{$cvecquI~ z*SK@&)Qn>jD~XfiS4d=UEK3^Sdr-F77>6x&vx2*CR6$y5?vs>Q8UK+ty*P7_;>#5a z@iI}u9|L;58(g|k+T3Pkbu*OvbnKs?73Z>vKw3#Qjl1pcAg%pmIR$YatZ5FThdM%Xpn9rPB?>1{$<2xp!K8XQ zjQN6I$kYNUxkMVfsJl!2nXWg~#VUl`D*4oVX3{B?#njVYFrvCEO59 zjn<6fMFe!!FeO40P`dZvpZJBbm$spVifGNN9Z!K$P$s`;R|4;=}Km~6%R%GA`{pe z*_K?(Hc0GnuRA?1E5Eilc7Q{c?Hxt)TG&G@UETOQD@ro=G}`j9$7>rUD}KHqn~A*X z_&T#atiDcYLTT&^7V8TN%3L_xb>)WR?%p`U#>B?ApFM>dZ#8zUH5RS;T4Rzw?M{l; z{91KatP2^*TnUls#e>&o4t9uL*N)Q++(D%u8n20+CLIwbkeItkD-8DF-_TCQxkC-C zSKR(t9sDuJ{0}sc*Yibb`nv zfzfhY?1yApMnBvpVZCJ{?1y7KIVMAZwf`Y456`!KNN*+8Sa2hv3Kmd>RFXNaoznIg zZPg04VpGowHpaF=0Bw*ti110I1xmmp;3;5Tmu&}SbVGhIAeH+s0tnCGL;89lv_mfR z1&C=JXQ#T;^P%U&gy#JO{9JQ9qzKDAEkH{o2pr?ugK6T8(>_~`-QcWCy8@nj3ypCR zEG{>Tc=GPnMx9hM-Qb*uk}Ey{rWvFK{LfLkDx9v2P&gNU@&uJfYff)lc96;rb!py% zZiZ|XLZL4IP%uqRtCjY3CGG(UEKvD$b z`T&XPL+#zy##?UEj#8c9&yloWAByO#qi+CXcOhem@z3l;gt;`Y$!m$dAGv+TYRJM;B*c%N8wa`d~L3zhZ1;{MJ!|tss6&h~R_X zq1LGm*~hLCsk%_~L3M-K)3znLt-m!uJ%QyyUvTj`VU#SLzTq#U${egvGdy@lPCkn;j#3(s-3Op;*#l&E)fIy!%y)v z-@0pk`1`ZJF#^D~9z&vR2D zdMQD5m6Kj6fBqj-o^wRhn6ux0e}6FV3CaW1M0L?Qz+b{6{D}T?rW7e({glALkZ&(6p7s;zw;>t5}s1!S4i z-7CFo#vNoytqc9LRG#mPW&nAj<)AqS*VtTnjI+>6<^FAu^z1>`>s_VXBV`NEUUw-u%L0I5z^WQsOR+i zes+G{Mu1s%9#5LvwxRtoHi^(*gBw&4cwEL>U5raX?8wH^5%Mdtg?CzsqOZO->o5`2 zkfp7o$XpYwgIw)aVjUM@ml%NO0(xj&LUzXUoS|2Ka3~tt|6G`~4ct zpFT8i+a#JnI$7uc0kw&6Z1y2g0)MWWIbIUp{X4IXjIr~3dGuQBKN!%f88~a*G(L5! z=oJ^c|3a^Bz7+e@Iw-$CPF0i_y8auzv#f{Si~R$rLiAn&y*G|1b~Iip8V~gk=yT!r zR&{?J6cV{>#xIP>-F_(aqw|&QvO*o)=)_*w;ICOPq7t~BlU%aw_l{ zjbXxOFFAHV3IXH10aMpSI7CV^RAudBd7y4;^}gqP<^Oy8d!Xm_NbP4{hia#N&Ds9S zfz2BqNmUh9w|?B7pC(ogRFlTb{sQhemFcE?Hh#T!PbpvAae15X(HF6nor?4<_PTIk zD$RuRyDD2h_BXM=H>{0(exvhSQrl!~6EQaV7mExU6PWpUz&@n&A|zMxl4yZO@iA9Q z%c?C!h0Q0m?v&@*+oYVNlN|1T4YKzOvaiC0pRk9kwv?>;gnfv@*G_t6`R4`k;}bXZ zkHiiPRp_F+O4VtzYPbMB_Qw!X^;h;Cnc%iR8&a=R^AXf+fi4fyLlahZ)K~{>z7B>U z>z`=p3AM;#XNJb)>Uj4$oIMLN@7tf4Mf--Aji)Zl^G8+S_dv&-)7`jE=An8qA6FuX zPe)Wzftye%eN0~`pz`^76)xc#pGb$}v%18MzotAJCcBQ0?MDpMiSKxEVh0**f>ykJ z65F{MEU_JH)9t(`wxjI6ZV%W%_h7arwxerb%=}Ai?-s4u!l&9%-&h!HExT(+eWh;g zp4fqh`+g)CK7S7A;l34L>K0IHPLIsrMx3PiI)7_eEv{--ZfT^uKp!*u-i^1ih*5Dc+BM=t#K*Qz=dq;MbVm#Nq6 z@KzRpebdva#!U+cN%Xd}ND(whKThL*X>p(vI}YF;Olsrmbj7Y%awM4$deK z))cLI3~=Y1yl{u4SG49k{Vw?XHiuH~j$LLQYPY)^x3VmkuQCr|0s{rp%5b zq1DOJnQn zEK+)In8P1tPmP)NK`h7Gify?3qGs1}hFGFl3ml+%WFq52An>)(+wP-C>dU&%RoizM zYIuG{&&|2#w9XFI{f<;HexdSH#Z2=Ej-QjN-jY6+Q9_HQuhHaH%KMnhTh8;s9nw`| zKUug#dJRzl_1%`CU#9od^9wF-FFn8Po(p*fNfKAJwoE9hb&f)6cu9cCm%*DI8>_2x zrQQHyM%09yMsPXrf#A>SlZlF=fz|2bu=6lJ$TzLO%W$cNX?#R4k}H?-+Zw+R#wLFY z~8oL^;f020@D&CnT z^R9fmEwK{kXSI^!4umO0cKfld*iiuR-fiWk z3BfY=t3pEp*SYYTT9xKTY+_Ci_ePg_XN*a8!Qh%2(Q#drq%nf3p;;Y82yMohuiv!Xeg{2$Qcon0!+>-yBV zKGEA=BcYxA$1x)f>1og#qBVQ6E;1uUi}<#-nR-|XJ5Y_50)rb)C1&H$eq*BL;Msrj z=Jc0y2q^7_S=k-&+)E#KA_3&6pV&zSh4z5CqlNzINT&*LGBhZl0|h9)!RFUa95{3U zDtg;@mK&M!V_q*>T043HZAO_j$YRP9My*e&Gc zBVGbdlu!$+vmbdeY|R<&oizsgGCRFx4A3|Ykd8hqAg5;H1KQq^KQb3fU_+O~m7E!U zEVJ5P!%HnVK9szX5^foPg;(v%u=WdvtCbp?LJ6n&pfOwUD>@^~;Z@{FHDxvj8Pbzz zEwK}C38NpHpC_AYL;4%?jYy5_OF*F1xYD{Zp(u!0Ey%VOVvi^SAdza_1itcM2BVKg zz(B4PF;dwXuCgc9D6fZ@BXIm=m8}E#0(TWrL3C zp|~|@D!UOF%4_;-tnVfRk2+ zzNv9sU#qH;N=*xOjx9uHSQ(q@P2y7N+L5i_#G41O)5x(+hGBUbb!d5}A$G?pa>mia z=&`e2``7a*J5o1V@~XFqGPctQI88sUf9hVDc{Zy*2kR@eubzo-Bbqe1^Q3zwzU>j~ zmH4)&?o%vfiF1+mnSbZPn0hxpFL zAuEf$o0OIK0vU5J_ZH}N7kdb9et&1JG?%^^5d7^sr*-UGXL(K z%s;x5`Aa&P|APUb(QlldogGXJbj=0ClY z`48@7{sTLi|D;alFY9Ff{X3cel1}E|tCRUJ>ty~bJDGoGC-d*y$^3mfnZI`@^A~n9 z|H+-qU)0I`gFBi3f==e|*U9|7I+=e)C-YZ!GXKO*=AY2X{6jjKe?%wqckg8WicaQ_ zcQSwfPUauh$^7ScGJk0&^IzD>{8Kxb|I|+AKdh7aFYjdjXeaaU*2(;*bu#}!oy`B! zPUb(plldoiGXII4%zsoT^Z%fe`3H6~{|`HvKhnwkvpbo;x|8|$=w$wpoy>noC-bwz z+o|>137yRUlTPOUSts*f)5-j!I>;aTf23AnaTvTYQ|i|9#BWM9t=iIUK-0+DzFjQB z6Z;)a^&fZHw@$%_yI;EgkJvp15TV%Y54L}*c#N1FonHofd$B_?NfeRIpKu%-%7bu; z7#s0_Ap^*iB}EG6G?l+LKG}Kx1jN4@ywXJ&CyJK~_rN6xXR0{m@GChgXW#I;Vn5iQ z*d?KJ%xTA%N#W<-d5S~4W%+^!v>7ww>7SiHs~^R<={U^U&*dDFXee_TuKC299?1~+ zCYxpF(Nz4Ih<}QWDKJLx&!G-?7x}lc;$S%r_g~Hbg*{YUGHx@1%TzDQlh0Oz8H{-3Q7xJk+*v~ z4slq1QcILtb|b0NNhP6B2_vo{LH;>mIZHT62`<*A|L`DawZW{bW1wPMCMn ztRHCnh*2A16jRe8>2iu%`~uKg?JX$4aPH!ho{h(VOkQ3T5=gGi9GKWq7`r$e?;rOy z+d1gh0X}@P2PJlNiIvUXkk}E44NmMRif`h6(xTY=3$HUre(oo^I+A&fw366rJ-(cZ zx@fKzKiTp=NnUj)vwkV>g_-w3R5+gX>qL0$_%lh(DMkD8)h)G)jUX|BUQf3}6g^)Y*bMh&>GNoFjnQxw6v~ZCb2}T|H-F4h531Un7mJJUz>Me%mVzBSqd{+G1dm`) zQS&r)<=`dkRTu6_<`i$VW*uLmOYY;BRF28mssDKq%(-K+G3!juge}4S#@^J0Vhn?q z8b3Hn{9w3tS0er}#!cqe-&0MhdaGj#A7=NV2=|sL z_4-g-_Nwpu#s`i1ZA%8{y_d;TBD)D@l~_;-P_gnPom8x^A%pY2&@QCNoo|oYw=j8I z-EFD`5cTb*HsAa@jMCX}SG4)I)!i4a2vk;bB44$AAr@%&j2$S9izUYQ@s`xEqaf0| ziTb>8F%riw?ODBz1AD=-2 zfZ}B}N>(g(^61kHpvgR_x4N73$!0*2KY$Wpl}p_Pv4wS3HV^9&G8v4V{-O_=2Saj6Gv!dPYtY`=EfS29sfDR7}Zacz+#CUJA zf`A>)9OlAboT}ny*uE5w(W*In@5TeT;$)tzyF-*J_lu^+oL{0u8HF)urk~3LCtY21!8VWsf`GU@){pDqXl}O+`~dczm)5QmL(Of+dRz{qFq>3f5G7 zQsA7mo)>6=vzD0l+QW>*592wUDMfWF9Q+agDf=3q5ztfJ8uy`i`TKfcZ#JB4iyW-W z3{suoe0!*{6&s}t^@G(VCj1oU3e(z;^=~)iYJFqa=xhLHFrKU1N=jy_YRI+6hM$WK#|_=YTq8-h?0Km%GbrZE!9mg)#hcOD__u`a`l&b zm9}5ZN+~(2WS5!)eWgyivMs_)U^#~TBIAwYt;WNhy=1)2hdN-`cjtYVTSEKtvvc3W z-Xd{1Oc*a=|2^R!seYShOhdI-(B{3}{y+5KuoaZwi;extChFMUZO&e;{qO3-D0>BA z((Hd~GzsNaz@G?}KP?UTWBH>$WUu}Nbc0L`)UWdqF!C#qIQ~g21DWx97COWpx0B>2 zzaX8L3G%n$|F_}}dM8S_{*S+>wbieDi;s!Elnoujjo(*i?#rzog7)nEiM#gEOO#Rq z*_4z!ikIjUyfxUHYLny}L){FmXYVu^p+PnLrwst0nZfhA4-J_5F_eVSM*LF%-Ai0z z6~=#{EdROB!Mk?=f2|ICS37Tw^p-=U4a;vsEw1NHMP3hzd?G%|`%m(V{GLqU?jlB^ zZlRimh16Z=W_HBC3JV5b@6y*rd|e)VadCgo;H&Uoo&F3?9_lNMH?AP-W4lAPsYO$O z9g_is7_Jxd=C2oiZhIc2I(M?3s3`f=xpj#Uew?u19g39j8UB%yup;&whF(#Q7!fpt%W=y_;=;@PM< zk&AA)bL*d6eZzwKKKqT;cYv_F%=oV~8^+=pTxPQs*T1BSHSXg&s5r!5)_(`C9M-=i zuYQ|7A>b49>#ut)1pKr8b_G0FKdd5P6VpAxT|b4Pk9F}%WXZ|L_d`zzpY%T;-x@E~ z0Q-gI5$8xf(y{PGQ|oNo%5~@crYP^k?Y~FbeHT39_87RZ7RI}Avs6igoRG5X&G7qp zbvO9#u;S>!ec#8*$D%49D&^R7ay5ng-0|aJ62U01=QPNjvb)(V$;bavqxW|B58;L0 z?Ryr|p#B`bx`SwM%%bsBoi{&2R8hX{HpaJo`MmGV9ewXa{m(JL9n>GlZ=G*q5s>`a z)Q93&i4=hYiB8O5M7*gh#k|uUw$xbG&Q&U^>wvQne7jdxx!Wv|z=i6E)*o`I_MVt<|w(!~Fnme;VucG@XQ- ziMZ_Rb}h-%oCta?-VJ)mnSfOZiOrd90l_p@|dpR_oE1w77QfRM(`QrEs@Krwc-@iBiw!`lseuMLb z(vopK#*dWPCu<>2NWUfZT6nR0pvAw6_c7_Fx!R}HYw!{2uh5@kUQS+@?IN$$9*cC_ z!O+Hzl=IkCP}wURB%p3Y0RG5KBB@5gA(3t74DXx^yak~u^=$*AowsmZ+sJaRswlNc z8Bp5uE>3GO|J4{Xf(%;c7$R-8>M4;BR|? zck>|kRP5b8geQXBua9*LwJ0~yLiwMCFXBegSj=N^$Ut6eeDlxu{{OwVk*~XXiv&}C z`S#xh>3{n!`2XAYBint?n?DN<%DbpD>~G%p8Q6Fr;3mvY>m{E)o2 zH$b&7H(Lfw(^r&b{654yJPs0KE%8^T`0^=C$Yr*c&@`5B z`Tp0&KREeZqz$LhQ|W?o2O`}+Z55!Z*K5=_EY{8d=ijlCCt|&RCvK*@FSGKcI`bqG zGo%O6^LL4DLmQg}geenuxiI7tH9K)@zE~d#GyvDCv6dDp0 zY3_Gyj8}j4ilD;qKX$5#>L9vGD>b@S)y`lw39=gfB}%s#yjcdACvV%YcRR+n1#?j4 z{<&c*hH)JsqqS6n-%sgz7!U0;ZSh_AjhH?{{t~)j=&qwvDKPy4V`t!NXhB)Oegy^J zr5bF5X7I{?KjkbRKmba+%@9$OskjtE-x#}GL$F9kF0?RT!bBqRED~QKsUR2}%|Z>% zFITvBvV+rIeW-ZB1z0eFRE6l&7)>CnSMfrdG0KUTs$yY37~wB_?3xvOG?F5WM^RQ# zFd|y>GkQrh9bii>QZFEZ)S?S`u?OzoY22c+Ixwm>e6zV!@cLnTbE-; zdkJIy!PdE06_R`uEMOw$0?9pU0L=t;c^!+Ty7rqx-T!5>>~>H(wpz;sY0SlhWA*1m5q4RUk{eKD_u_ODC@W}zZ z>4K)BxhH|elVkNfdWKeUnEtxC4VL8UXj1n{2|?e0O1{?kf`|8g-?UXr83bCtUE~gx z_^bO_V$UGzsqRj;@Fl^1-dtbJ9;?&|TY~k1J0!+P64f?nYT!BtvuX1t(W%@_^lJE{ zYx#=Fg3M+Q^A98;e9K*!5+dNL+2UP_ho&1<{Xrk_nzw;SlsAide|Y=BUP9z16A7Au z*Fz2I@POIe_gGP_Q)TbG0Vv{tJTJM5EboXl^YZ$+y!<|Rsl8H2acA2?s6J#U!sjb5 z%02%9ah<+I1%t6Hn@&xWNYH&5Gqs^!vofgnuGd|?&*>c?_lC&RSa}4&;8qKH;J>}z z)!hMp0P~JHe7(`Z{{eVnA`>Q025LJ*sY;(?>)1)_^s!VO@;mqeiyQRw5*Y9<_9>lr z3L^Bf9A{FC*l#jIhS)Wo<%p2Dga@5Ym$A7E+6SR|-MPeY9zgYO9yECg(?F0UiAqX& z&yUdWa?L7*8BEw&--~k*wRo6B;Kj3c%~x~Jul$dk#SJle9?8is47TU zaSaK&*nouKkgru`v*6<=pusV&gRvusAO`aj(BqU)g0)6Om8q`!X zfo!MKO(3r<2KGFG9PsD1@;F#;x9DOfr(dki>K8|QXINF zE?{U@n}&6neKgO@8R6Dc7v@}LRX+>T!z09RjEp=;mM$e zMZ4CZ^_=AM2{f0J&o-Nhw8JKDI5vGwILKaBogR3jFi|n= z%&M~meh$@>Xo}_k8t(2q`vPy=4C##_Vg381EMYN>?`=1PX(azak2L$f+?}brL>d!S z&+w|7lN+!7|JZvM0K2N{{{MtG0Zhc8pooV+NTQiZCJ#tLz$B9iiRMKf0`k0b=g!O} zGjoTz_a+&I3Ia7LQsb-Q6R5PMt+rSZ-x|~cR;*F6KiXPN)&2^_R;mS(#3JhN-<#}N>+JVld+pcS>#Wm8#j{KO7x~^~*b!B)7dL!IhIti*$iv@Md!pS? z8$XLqH>%DbXOmDvMmOK8l0J8orW{QYVN3cQ)kR!MecncWG8e7!JhAWojrBmrgYK@& z>m)C)%kx%p%xjeAHHPmvK=`8#;dZ{|k}e}3l|JF(W9#;d?D?ps=fnJ2=b=zJgy%E% zm9IC1&pJT(+yjKC`-W%E=P73DMv#An?{jFpt)8e!L#K2Y(iRSuHEmfY-0*v1LEiS( zH5M}_Lo>``hiL+Ms&+{K6jWMJ+yA@4;7&ermC4 zzE&n$LNU7Yqp4M+S|jah8_)IrJ373dY)CF=uBTsC?B=r9(Id-)Duoql}iqkX&O@L#XB?>#rk%kBO?S|pWzZbq8Q z32b8X_eXDTAE#;hMlWgStFQn0-pVl(?m1$4DCI}@9l~vN{AQ`GH?a9@SeiHNlY3+_Et+P$+~^w~ac z2_$;Ln54OVHXCeUcM#$)y>?+z{TX`vORTRYZCx9#F@+;97R%{7wOJ$5t-t6a-1 zI&b-e&mGCsFJeE;DF8+B&mEzMukf(oiSQ+vzJ#kDHCV!}=(C zm_9KY-ZB5F2b(`8FuW)0o0$>vH_6=JXivos%UbeTJ#?rgXM|SQ+7m7iV|zLp+q2*D z;_Lv&?f40U_0%jqCwy*~C^+vgezAA^p$r~Ae_MS_WO-bSZu~cv^e5~mz1{C;?>`@a zoP70|HI5@?6pTiG2Fg6_GWI{tiCsQ zOwy6X)0oXle^r2`SBWi~!yfs_zUfWB=jM)w{eaAtyyKz!!$*i&8TcIDLukfh&`%!~ zzQ1F)EwWg|{5dw@{*M++-tIAB%{9B*o?LtV-sG_sK7h;jSzoB{%72mQe6VT9?kT&7 zd;P9!C){`!UiW_gi0i-i%H>CYbHP(@`1(!N2YHd?#W!DnNFwR_xUCZ?Ud6=ui4Os@ zt&pvr>tL0M$%J=F(6->FO%Jl-EV!w<`=&`ByX7y?aXRc{?*rU??Aumg8Ezuzj*bVm zKL6&!uEpxxBpxSRpC{j)p8fULJUH$qPRrbWt=_%kc{@(zGKu5sQ@ic6!Vgc`Llw^1 z#h(c`978g=b;{%N+GAd7yS$#3m;5K#_u%FAjJ)I@J_aJMU&u@T6K=SLyy|rHxn|IwjytjJ(qcRz{^QP64Zqf?2_k8r*Cftaii&<$BRvYnJf7p(Dk!D{1 z)4kh|#URpN6>-nkv-JKUUV+|6e{(tX{>Y=~fRF*^Uv64`;{Atc9=>0Oo>&9JCzYw) zp*+Hh*MEP)qc0)0*K$X7_oE!YdDPnh$@SlV*`xo>X_UvqV*Dc?eGH$oH$4!O{N04N zyqzRBFFLyRneek$@4n{MGH=MD!KNH$SvG#}&66g~zv1|k>7}icL0$?nbP}16akKra zC69g9C?<{r%(5u0HTPA9!?ny{=G%>Q1=f^HgWTJ@@L+Q776_kKP&TEkz+~ z=b?`xMo>$1k8M8V%r?^X*X$lQ;rB1H*v6DZ5v?ATy}RuB;(}*5J-_CYq6=G{MHtGd z9{ZC&@4o*?W^tsXNS^s}(UYVmLc*}BK6L%h-mtZck6YOGar^U;Puu(;i&XGX2#UdD1Nwb*(xW$oB)UwXLrkt2@X zwSC<7-KW3u*lV{h8TZ&5i39I!T@vD``|o|^*kku>AGc#Skv&?Bf5^>m^szeOO&ww% zr^y0vW%ROS>*A1+_~PD2jz9MCkkPT8Q6|$vLZ(VKG1$A41q0Yo9HPFux#MXq zJ-v-nNE54}n2=QFOM0r?F+P)EAWtixTZ1m+MvN`^~ zLw|H%`?$~F*M7)niD6^6<7re##(mMYmv&yb?wX@S;Y(2|-Nzo3o&PRvNxsb_wU^|s zb{gm3aKAwK!=r}VeOcXJvNlh;&!%#w(eo+8tEX`NcozfvQ%^C3KJiarHBm$_U3%~L z$KQOzoaFS|bbsi&5Jq3q*EI{k5Nk`y>?WhJ+&eOoj_+Ptd0tTNjrs+4>}cFS@%4h* z{Rc-&!VLdXjwOC>Nb>90YZol?&5^x(mUGHR8UQj!a?49&}1--iZB=k-$>dZaz zvycC`S!riSdd>|5C6A3?eACG{3gvZ_Cm#EpZ;xvBgYC5T(kuQ7TVnrMoo6Kl8XqS= z70Qb+6#6{%&%WjT9_3+O{fiCdO$z0GgYp_Fvgwn%|5Epp@%?4mebcz>?>%Z9f`lt_ z*ZowXL;uF%!+)D@-%TYD`d}b=??3N&a?_`lYEb;kh6x|vb^Q;!#8WqKx|0Jq!UC<4 zC+yh+&%KN|)&^`vBh5PUv2(_K`BmGVckR_LzjI0TiKD;5)9{b4KYL^KNaVMdK4VtG z=Th>go+9BVx>Um`H~Tb<0BLW*@6-ROY%Mh2v%jCvW_q%@y6%UcA?i)%sO}sej=H(< zgzcB_@3>_NzuPC0+s)V9a(~DB^mu>AZ2~(wK5_db0`Bj)BlzAKd_QyhiRSyE;Col_ z-F5rP=6iQ|{L<|ykL-bNKi%Miw@)*;`}P?IADZy-!)JkYbB%`_W$y{!hE7I9y#{pS zRSZ&EDc#UVPGVhChflcSE%-vzwl9Cqlt!gwi=gHa8K&nI(^+to5&8c1qh`IfGk5#7 zwD$f(74@bQZV(=<=#WOnw6EIn@Tm`& zuF&b}xGx{JWcv*-UqOmj4gagre23W}HY)G9v5x>F?T#An2;R%KIkIZCF$I$Cb z#U?kmANIjr29NsS9zkarUd29&XbT?R@#E@89{b26GME_$2k`tI|IFw)Cz+TeLldui zRPg$vlNQ0p9-V$K_>Mh09=z!&^jr4sA^zSeKcs>?cTyYs?VU1%k4R*n7dJgW(-eP2 zQ+V3++|~5FuIYJW)AQ*~&-0s}FKl|gqUrglrsq{n&rdhie_B)c6HVdEn!@KcJzvuF zyr}7UR@3vursqjb&q>qsiA~QZH$7{D%l4NBa`ssaSbt`{x%AQV{_4N?I?uqSdk3{D z@Dm=m;JN#I+Gjd*eSg!LtKxnKcLVMw+*@&ffO|jggSc2DefL^l$G#7DKkm!82mSeL z4iy&TGdk=Sp&oX9|B76EjxhQ!Mt#5%_@A9lo2*}?Q!~uQ`Coi&6lm=q>`7YtOIwoG zTzMORwiJ`r;+Agw+VJb|@8{3pY@vfW{VCWV(hTJYD)$qeKYje&N}{d!ZS5!G*8VM_ z0)w5o!*Szr6L6DoC*e-Porar^YsJmMEx?_NYsam`t--CwU4VOvgo+ScQWo&+!?qT zxY@YY-U?*mkEmw2{_>FT#-Bf+x$+=r57Zs(tCzMfRw2J(+#7H=;@*sVEACym_u+2G ziJtqW+}Gz?yrSC$9-Sto=;RlF*~#i!_Y{o&5ymh@$@)cq`9*)l(eGOO8~(&F`N`=Q z({%Rb@|%-#v2ROZDCrq03@2NAi@OsxzT%cbGF<5ED{V~%a$AOz&c13PsT6X3N$#quh_-8}Gj|{EtGI9A9>#qa_kG;I z;eL#J8u#D0L(A|vZUSx+?j&5XKi5-82761DQqnnGDU_3PWw@_U?kyB5Nx9ljJ%^J@ zu9FJ(Rw{!Fsd4uZ!O7*cY+!Rz>b$Z5dtN?J*qZd0h6+i(ubAJQ_7*_9l4VKfP-$zK zrmxtzdR4k^)6!Kd+sUZEFXGE{m0Vw17#b=KElj7B$0uv6m9*5I_7}))_|)VBv{7^L ztquVVzms@+=4A;x7$CZ!=lb&!K_nZmb^ps8ie`$}=`ioG;IP|akHcPvMTfCIZ}R6i z3sU|qzy$an!4vf-{9^qk^Z1XPV}ITC)H}}qKs`pQuUESURR4#)-h!g9py(?o`U;A^ zf}*dW=qo7t3W~mh-3~=xJ&V4AqOYLnDk!=NT0McI{fxf!X9Hb%eop(J@~oaf>wjq} z`0q&IFW`&gfNIYqp!n|uhmk)T>QDS%RsEa!RvUZOZ!~_$)+?bgv0iZ;jFygU?Wgvu zy(6|8|7`w>7xRC%$8AHqDM#&Ad874PsC}4wG``gi(diha10JY9Pxbh*ee*rt0-(m9 z#*y-g?cL!1&vv`Fk+16gdM~em4*19Z{{t`oK>bOyhTm^{|4In0eu(2R=Kp3s|DW>ru$L40 zce|e9@5sNJpH%OIou8~-q>JsbcJRDJ`9qv%yB)FqR_|C};Cm=9$?OaCsNZjT{jzk+ zuK%m3yZ9ouQ~OFiTmJyxt;X%A-3r#v+Mk(kf7N^z=gWqEqWsbLO7+veO>_`c{RG87 zg5n>+%N%MP==nL_|2~KG8!O!)gZ+Nf`Ma6_MqBUK&>F3`YaKpU>we_dTPb%O?u}l4 z?1!f9~Z?XbsTuS1=?6)t)Sie7>? z9|A{Pw-il3^{?Xp|Gj=gPKSe~+B8VYJop50xI7)ej|Ub_3+mUQrKkE;@X&{;xBK^+sXVEb$Z&>U8 zuLJI{Ka?!{i|x;jKebEw3;wF;@B#8yJ8yNUep7kkH$m$+;DLSz;xEzV7x3$^i_eX`>L_O z6fe#Xw|l(N<^zHoe$DM}Zs)VzuGk;39ohL!^S##LvCR9i5q3YqJVTclJr2Z=&vttn z+A)UtF4jB3=KGyE&zO9Jer@iL3rRTAKIsbg&k0hGUv?d8Xbw0#_-C|ws(uD1f5ds?H;w-e@%lzS)Hu>U@M!mc5m56> zb3Zria|wSX@%G?iJ74YT);f%QdlApSO8)Kl{Np`j?AJGXJtQAgdm^7V%O^FDD*P>; z&w|N+=@92(wOjXC+Fz=k+Fz>Pqm3`Jtj)U`FLV7_ z?bWl|DR`d4l@4F!Q0-Ls)ecoJJ-^9e+>fXp@^AhbovH70HQqiz1w=p9PxGwN4QTWM zzDE^A-WY$`dS&;EF`u^+@gJE)8t4nX<4^QeKV;jvhjK($m9O!(he+!^-m^WwM1Ilu zQ9YX5t$vaJ!M0y2pkvu5H?$wRWa*jRk3HM%j{Vcn-u;XNnls|>f9oIk^kC1!|4aYC zPXEh4zh3^)yt|XlQR-0huAaLbmK;joN&cEI1hp;*9_SbI*Se|rG5_=YS?i_zwO$IY zb$Gr*t()?{!QsJ{ul=9alS6@8PYwr;wBMWM{;FSg-d*kfs#k5lLOz!%9x&(7_A5Le z>^yL#(lZDK9LDwNHlDNV@bB@g{XyKvG_0qrucQ4$f2Ct;w{=YGi=NvYs=a#FIxCo6 z2lX8HCsrQM&A;rrEqWOJfXYwpdbZas^}otF(7q(r)9UvdysrMX)Ne8b{dLIC<9KN3 zclvXz{0|G(_m|HhAB?rWaeQX!t8v#nE;WwiuX#sM^NyhA9YM`If;uM&c025GsB@D1 zbxsoe08sNwmcH^o(0C_F!|%D~-?7p)R#H==<_oJQ@a6v8u+RPtny+HLBYdvu8~I|a zbUxDQ`Rjha;Cin|L%r$O_@05zapD7;H-PUEfive=J&yGIf4zOb>HPKEP(RI^abNYT zp0~x{2QyELe{1rU-@x^ct$oA%9OvZ*`Dl z&Pun#Vcc&@eky;-O$84$pG5wB3Gvkr;t!oKvg@w$vHbD3c}a_w|1?D@-LVdja~SiD z^ose$efM&Y*G!+$=+Z@e(bMFt)Tdj|z#fO%Kj>Ne2f>mc@gtpX;#u{K?RbYj8+}G- z7s2*ZQ$>#hwP&pD7;F6xcAfL;?gOme(4(Orc#i$>Y}Y%|JM!b0`0oJqOX$bT)H0y> zLr~*JP~%2WbQKg|2=+J>U+7tUA^0Xhjh`v^K=q^RZ9Z#0kG>Iq@za5R3yGlfy!c<` z$8+*~^epB&!0);4zY+OvKXi)ofml)k`pYAC%=gqc{8&>1_1nInuY8p8r!iM*g^!dX2+Hdd7Lx#uMcq6n{U5 z^*`A9KG*a;*!tP{gMKfhFS6^D#-GNS@x_rzqVcDBXf%DA_YtoC6d%gsW5aml`7-=9 zKCf_Se8jWuUx2oM0or&3c6+=YhqgZBuX$McRDh~avwn@nsp|bEhc-@$mmQ}{XZsxB z?Zi{PN8`I-U*oh{_H)}AJk94hTHQFUeU|;K|BjELmd{de0j9+VTp)m_B*VSJVdh}mXNq+ z*TZVbLz1NTV4DTkikpjDglosW8n+I2A?{LK0k;`f#tq}H!)?dy#Jvl5EA9^5hj4e{ zK7soz?yqqV;vT~NJ?@`zkK+Cl_au%g*snUUd7!j);M647**TQt^7+DG#X(EHH#bzq zT!?(j<;~bQ$>l3WtefPzx-Rd^VeKT>SM1@juZYEvTpuxq^1U)`lG|1+C!JVG=@}|j zv5eE%lP~p^hJb@ZrNP2brHDb2&eBj97DNK@@KU8xl5LWn;y{weKFT0P6)}V(ygZo8 z8&0(n)vbh8oLI+vZy~>#e#*-TOTI5xE{DHGy!r}CQ0gLpKhQEDm0^qug>v~zeEtmP zD7S>kA#9)IO9Pd{fFKnuCp0)`f4cj+0xS*n;}=2(F}G4Kz7FFk@*2tu7Ai9K(p8{3 zvYJxprnOx~xv~tebR~rWDx@ZXSZ%s+HVLKu=epoKLV|qt=EnuR?g(TI{Oy60ohWFwi5c z(1jJ8{z9d<)RpvC`zl3Q#~DyN2TE4!0qo2e4F^i)UK)k})*))@wrENNx$a6~s5)q@ zR~qOnK&e7?ps$qcN@|a_(7x&rzVOEY4Fi$=8ld_owj6M>=8#UKjUAdPU(Ds_+5>n~Ny1&?Jowy%`A;iYP&hRUFj zds}+4V+@uCFt`IZTA)84}NU$I7BlqCXl0Lsg6gC1r*c{Zq~}X!$!->ZA92l29rfLN_U(x3pEfSVOke zuwf=^28CrQJ}FmnkQ3iZZU{R>GD(!RMpPW=Ds00n(NGUft`xTMr&u9Mr8MZ3v|$1z z#lc&`^aH?nlKr(%2w2uEwZ%AfOBexx8;zZ|_4h3_wigmY!3N4nVT*=);LtKRXXUOO z9M&&Lr*;dLtIRpoA>FDa$@Y&kkM1$l{%AdWD}Guh(-#>_-?pCh2I{0a?`wfrhNp0Wz zclc%NEL$kwY4ST3zwdi~j}L_Wj>GRi+%J~#Jp7)-FH0A;1<9eG2sF5@8q!Y0Z#;g< zwe|WvAHNs6U;6qG?|A%9!%w=<$+qAp+Xge6{3Itn8^3HjPQY(*^z*dZZ>@-a;QC2d zZykQ>qgcNa@w?FD#rA4Xd1+JH7vq<2iYJ-OX8c6^yM{xZb)LA&{Xp%fv&ELCw5Q5LJ7r-Hm4KhY}EZ!&)G#V^~o)A0MC`^B`{cmBDjjeb)= z{t7?QG}7P<{63DK`YryZf_%QoZyJ6Nx?ilzbo~C_{bGJE$M2u<%l4bzE%`V1i~TVJ zzaKaGX^;GLO#6mF=T`ilX^J-!zr#OCoo&a-13%r%KM%j`xRk8mh4`u8;!pa-FTpQc zKiSTBS(D#f{HEY1or3tA2hxULvZvl3XX1BmliykREo<_dkKe2C%a*G%=z9FD&d$#| zA6(>qk)}E;T;^#PJ6&{c?eTcAKlDzNO1r1dyDRbg8h#oxkp{2A@7qm&(!qTMKhZhHTZP|`@yqtdYW$w|c!NI9*WkC; z{UWV&HaqH5A-|pFKvT(2j>Au5HO4z1ze)IshoYbK6JLs-=okGq;5VhoPx6Nu_^mhu z#DANBbMO=WcKZ798vK?t`CWkDx+XuJBQM8KXS$g7BK*3W{9cP+smbqR{I)jbcL{!P zYVx}jzgwF8bYA_lru;6)?_*8zuE6h$P4Toqex=E;6TfdY`RUBNr^&Aizek$)1Zo*IYnN{aF$G#cAX-)avj9)8$*}nXJ{O03l^O~z{IYG^ ziQh7hx7+uGZ^iG`9uL%hZ{zRz_^EBzdcVCLzl$y2xDbiI@4)5p%hvgw_!ZqRw)YS4 z8?>|_-rjeCZox0R9^Hc9>*be>OX6DgZv1X=KT!L%it{J{(oAtd_A| zJRFV6UQT}9$>oEHLpW$%u6%UR8!VM8ob@Rv*QaAC2U>(BIYb1AbA}M#5JP8HjOF4a zQW})7MlL+$I`bqTWjEO*xhghqhdI3tRgiB~hLS;~L0ggGAS^;i)LGh=4CT6tB@Ui; zW)25zJ1zIpB#iV1vBq>|1p={e`5oz?D^b2|qw4#)uQ zPcKbcTQA{%1=&nrvGWp6y_XQJyI5+?Cm`vm=cH>ktT>AJ;Zpf9COL_ALJJoBfr}+?lwAI6a>WY{#v@wJFY-bEhQp+NLCP z!RO2-;hC1Mk8q{A3RlGq)}7nMX)t z;(~Oc$qCYhCh0<`kuH>&6X6WGbq%MlAD^UYU6$Em%&{=74)sk-rk~vu7`x5<<3kW# zcq^uK(TpN&P_7ORmWC=Fh-Ze^<%WEV6{?zL}u3TjHPOu zth!1jOKm}niO@AXFf|Mo5Xg45?*VbVU!8@T5K}#0u0|e zgj~5rT%c~)%mgH%SIgGi&;SCla)M|T@`kn~%pwKq*;UCA5^469z775&ks2ujb zvyHbf8z`2yJ(938+`{Y(FLoEV(cG>U#Gw8357K&Mhnri1%(aE9g7RP=^2UK`e_^PY zr?m*`B-FpET7pobQN#xjJ-T-eGyX$mB!Je>+3Kj@TM#f72P?27QqCL#`QXWNfHcpa zWS-u)nveo&|u48fBpew+QsUQ#uF$VY0rG2rZdoeCX^e z=D_v zgsf_E|A9O*=P;f+OZ^%xn71dEUD_~H!bJsYnlQ#%iUS&EfhF~9RO&-^+E@1roMfD( zD5MTy;U=lrS%fgdRF&m8L0nrgz70JwSmiFHnp2;*sDF{ivOu)38ooegKzj8(H>3<6Ot3LX@ zHWRMrhdlgfJ@D%xJYekgAHE_N!^gX4DU*KB-(Qit)6*a0;n!!}3QNj^RSpI)WxcW)ISr1;3yTR)>k!SgT%ELwfZ20qemfyXj zgdb0s>i@M-@_zwg%Kux0DQdH9P)34gJNpFT?XOFVqeDB&l2_=-`&U+UqjM+ra0!#9i)&N113U897j z9)9g8;ir1|TRgm(KPG$lZKH&rM!5R_BctShx`*F8O1N#JiF5xb;b#!0-@~JXPYuDz z4?MiN{?k1CN27#KCtUU4J4*g9_wWh3N9Lbbc=+ia-dz3+51&0sc#DUhJxX}1hj)w; zK9g|$){GK9i!inC5)W70?D%h!2fu+)!e@uz-MNU;c8G z@H0LACr1fC%hP|+!<*?p-^0H;O8NyJ{(lJfqLS?Vz0f`X?HU#!O6T)(r+Yuf8U9ll}_8p z`5|qWs!}mOJ!wm)ts5$qIA;#0ZE3r<#^veB?2Pa1n(v&9@0^-%lF;_&|xw;)M-R7Ui0l=5j=u<%>PZrLEbRE71dz&}=MmmzGK<9SB8- zI#|(C1l#r++JWD+YH^@4y;duNR;*oZQ`EY@z9RP#+-GsZqx&-Ww{Snm_{A_mNu!YU z=7;Q0G9yif5|{aK*5#<3=#*chVW7vU=SVUt`ZNSiPLPdm?NoDXKgk&q7-EbWlB0Pq_ zd!-%KBc4N34`i^fTJA>~s5&@Xf99YBiTDUnIf61o%Y5@sf^bsiQE=;1ls4tbDcbTx zZ!h0ASE_vZw%G>e%uR|{RSS%-C1|T6XIv6;Tq0q2vZPY%LvXc3^;=>Lv7`en%cMPI z-w~2@gd`o7q(gC6hJckJV5J4DR6xhZ70H^A>DmxyZHTkh;;i)`MU{Y~oU9E}luaS> zrVx3PMc$-X7X_b6$A!Ra70`j(*eh&hi9fH- z4f2`FRk{Aou3WOZnyjfN7Z#JX#v}vDx?-}vx0Gxs_K?{|J{q~nvs%|%Oxkhl%8Fdz z+mAUbyHgqWSlL}xcEJ<8P62WiE4!$&H(S|#q3r%DGPz`1F=4WXK?jn-VlqV8WtEKz zn^mDg6{?=&AjPA!oA5{)Rl%|@5BFP?UNYFiy#*IDz3AW;2hk{$Rx4{2fBBFhw>I#0 zxi3KkUl?Ni*@p)a7Q#+kv*=ETd5qi;^fLwM&yfCf=?_w6G;{5_ZwY8se}?p@OMiOx z2YHvSg&1i_=FltVujG_yj-n&Z5`m^L<5quZ#1Oiri24|k188OBhl0qWyMjFNpp#au2ecf;_H0oz&P!y^?h|DVqnzO7nXp(Yiq%odI<5CauK?ky= zX+k`x5rmWz0kP(UzI=f>0f8NV`?{It{6D=r7sO*}yl^=~6^^0vCy4jhO@I7Y3OA3jO@4^djLLOkTHj;7a~nne?H=IMmml zpxcUgwBP>raivvChU{;-Q+QvO`Pko1``eZ4(K53v09vIFuJ)B}UPF$n=!Gh?;0V9P zdvxDBE}2YNhvPcat^|Juf1O{~xWCQ{=R2-_|3<^vuYzCX`0e1AJN}2@U5R`~JN_r&*ExPC_>GSLDfsU>{%7ECas1E0-|6^=z~Alohr!?P_+NnE z?)YDV|FPqDf&ZD~9|8Y}<9`KykK-Q&|Fq+GgWv1;$H4D*{2uTJ9sfA^Hy!^3_}@GJ zN$~GD{weV9JN{|#M;-qR_~VX$7W^s4KL`E`$3G8#_&@b^0YF!&!j z{`cU2>i9o^-{tr}g5Tr#x4}Q{_&cJR{GY+U?fCb=zvuY( z!5?+}2jKtV_`iTZ;rRar|C!_e3O??8p?@C%Kg#h(!6!KWZ{R05{uua+9seQtsgD0U z_%z4=1H9GoAA!$t{BiKJ9RE-7a~=ONc!%RZ0bk|#6X5F||1a>19Dfr0GRL0+FF5`* zc%S1x1ur}PGw|0r{&Vna9e)P=M#ujf{LPO40{m@`?*)GsxZcTn+qfiopW|;ml)jGs z;D6%y+rdBV_&dNq>i9dsKkfJ*fbVkrUEp7G{1))Pas1ujUvvCD;NNomz2M(={C(ix zb^QI{-*fx};Q!+It>FLe_-){iJAOO(6OMln{AZ5e0safe{|Nku?}xVkG5C1L{{;Mb zj^7D>yyJfgexlVfnT~%9{4B@s0bk_!$H5mn{t58qj(-yT z)sBA({Cvkh4Su2Hp8>zv@y~)^=J@BpbB=!=yy*BY@IJ@y1s`<$3*cKF|04J`j(-XK zI>-MSe23%rf#2--{orqP`~mQHI{szw_d5P{@H-s;2Kb*j{&(Pi;rQefUUK{l@J~5D z8+@1JbHML&{9Nz{9bX3i4aZMBl{Lcg=YxOO@sq)S;P_Udm3I3GhZv}tG z@wb7G`$6E7w}T(y_&dOlar|T8&v$$`_zNBXI`~T*{|0#K_&33)IQ|g$%N^GSqRsI` zz|VC2Q1C^L9}d3M@gu=kIDQoPYR8WT-{AN$;IDCf0{F#_KOg*Z$BzduIQ}B=KF41S zKIHgI!M8eo3ivgSr{LE)J{9~%$ESgBcYHedn;m~S_)f=P0saoh=Yqf2@kQXbI^F?( zhvO^2|IG0#z(4GG4*a8zcY)vIcme#Aj=vH7vyNX6ey`&Aap3)qKM(vW$0vYS9e)A%>m8p2ex2hdg1^b} zlfZ9w{KepJcl>1VcRT)4@LL@}1^ka3Pr*Or_^IF@b$k~1ryO4Zey`&T!5?t^L*Ut; zlzJqv5xjWTr4lAhJ!9$!I&e`#1gRL(oGIHlVs#a2@*jU^t6cN2@5;|^ot3oAoVl`N z_9UOFO4^w$e4mz;ooJ1fK-~ za4TSL>#S6QJS0r}ltY+B?A=FKYUBEu>pR+8qyjW|*32McZSATchTFJ$RjNEUX63DP zz(|=lL<&_-4pf%O;u?!uuD4G0&f$n<#LzM3k8Hp)Ybc^^eSOCbDHYk9PXqaxo=J5u1%vQDBrcA z*d}(g4yfm}KYkiH)_&TwZ<*Qafu@opjT-x?USty_#Jvst4%`E{ zLwQbd{{?=;6P>vfcR0_Bam&H4z-`AV|7&p{2H%DI0q$s?)!<|Qi*&eUxMSo;qql(X z#C-xcUVdcoIQU^tcIKwxj+Gx3yac=(cP;KX`BA|SgYUxa!O5%nhk|I!x%^oFLBqEBFCY!x@T+>(;uOND?)Uswj zp$Xk?{*Y^?7oge43)ks1B}G|!`i!((D5P~Q+KgsyEoFFTK3XR@Zv3%HdUVp#y72O3 zR@>}3bLX9T*8BzN=SwBNr?+_J=Dz-c(%@Cx>{YjH-8THXWXaO@WgW}UTe0$0uU@r! z&DwS6uivn7(`zoc@S@iySMp|j(864pEJ6=8m6EK#gB@P8MvAKU$=jDL*|_B5M7o#K zXEg$~oQsT>Wxm$hS!d;PZ*R@zR-c*6?U|Fy&B2{9E0-IbpUWjPbGh3Ip9uaP!XM`O zYTR7h4`%0b1>8Th<#LzdrsA6Wtvtw;fvgmyreK>!ny1sCV%k+IlvAX_X@8D4`&0C} zt6X%A5Hp!l#+#;bKPTO0Vsa~GTazhem6-|Ov~hXM{Iqiz-QjeaBDcnf)Axzjc4k`U z-l^1swqiP%D-P|Oq9Kjz(Prv^!X?t^fqX$a^qfVcU^|>no>HD{ts9tHq0MT2I`!fo`+Ee!xkj7p3U{itV4~$##i;SEs9zZ z**ud`C~u#*>Lg+@BjkwppBvC{)`hJdH8TBCDW%+36Q{q3CI$UE_1vjOQw(o9Qs4!c%L|W87emDGwZxKtY)!6Elq4m^rrp`!f zl&?2jbg;NS=`fB`%&ah*@bU*oL%T?%E`zFD82ZLqwH&ya<0Swl8-L#+)kNujSEU$6 zu@@I+q$miKix_)JQK2Zc(#L^&)rL}M8SMyq-(!;n6TC87G^Kp57#Fg2a?vNmrpSgM zwIXC1c)D2Dg26p1uNl}JZ0(CQ;<_{p9rmOa&)Yf*j%_?6Rfd;ieC}yu! zbfsz#)S%zu{tWsrI(6CF_Kg><>kvm}`@!rP#X4mP7yDzXnZKzw&i9X=U2P)}b~&{Y zW9m$~!3Y&98QdEu9x*ND(T!o1l~pC%OwfONGevxr>$;LRK-kRn4iENnvz%%!q-p+6 z3ODhZO2q;#Et*bsZ##9-)bthU)S3Frs8X)hwa#_AT@U+T4SjptW3(2Cud$D$?9FOh zhzwb!JA$WH{Bz5~Yam(>NQ749u)FfVzi`{ERg0>t~1uXQUjW zXQUl#(zs~b8(6kzCu{9(8K}lyQ8lXVIC(#4vk@ybTSrWmslTgJ8)fwc#MY_WgyvhD z+B&#={gTxk8#*>d4iN+UaDft~o&jF5>^c?sbz7_byL4f?sMz0gZf(h$%IGU-qg-$j%=!}uwA@IHL%(9pWUkVHpY(;B28wus*R0trq=ST(_&7h z>}lck;OV0f+uAla#Aj|}IMlm^UMUO>XzSr4krFKaybwRwI~zm%GcA6u%FE2PYN)qU z6TjHobm_FMxh;{_XBsUI5IYx90+Qy2(;=zzFhe)=u(fxA_ZR!=I`!-0LyTbY5ZD+KhNE&l>LLu+ z8P(6_7;mpF)_JEbFs{9%m!jVjt5N1;6cRBv8_yEavafA`(rGNHZ1ZeiG`*hCx>~GW zwsdftr8C=lW^Jz?m4ivX7o{Q17&alKrqhIO7Vma?yWqa&ax?p}I-_TcO)j?DS~^yV zDr7~)$_yjYoUpQLi#n`gsX(=-7pCXkZ}uX*@SjezMv50gJ{qgPR6b#hsn_YFke9~v zFO^pqe+_wwr+=xuLf1CrC4T><@-q2FpjG6NK{U#opqfii#H*y!)Ill{Iw+oKI$}Jr zP9~n{HDbK*I(!nR^uTZ0_;syc7KIJ zrL04YHLTR9T~!%&wG}_6i#+Q_Ftg{Ju*FnFDlkt~u=>iRXAxmgNRdvH#Q@PX#0j)& zjuVUsl#Ny)UZ7QTJk*UjVj<>GOfNUA8D1LAV;q#U?6YT!D>G#?lUx1tI(}L$V~dk< z6wcs_s(t5L{S-&_8!1jH6G#0rQk=e`^08UM%0l)S4#3E=u#ssy*Z4+osQ=trzeNAA z`PLizCVaE})OS`da*-9$%-P)AKyDYSr$Qg-E#`C)FZuTsYJ8Al*kdLWL$!avdj=UB z#}y-_r&SqaPTQtYp?(eJs=p2*Ewu@0BjYxv%`76p8UWJ0hPr$I8`l|a4w#-2W5Z*c zLWJr5_ojg5JXjlg@& zU4kAh$%idpqarknaXhTXq|*k_5LU&Zx8jQ4qsFz}yp5(>e68uD#?R~;ZOGKh3H%h( z)s8*r^y;7kw_E;kY}Mjry3faD4&%p#Ek&DJY&ldr;&_YcMvA)+0X$u{{rgXsA;!g4 zQyZHNb70)CAb7SD*EFArJ-)`p{^N&GKl?gwhO$)8v81h?QH=KNBO}lFzN%cRqU0Q@ zAwE!?&_A|c$ZR*_t|T=(x;i{ftFPXkPHh@Py87zs>C~Pvq^qy+q>JN>fy9df@I2-S zkPKbP4z66QYmN5xBGtw?_l+%Wz1Wym^&MN<0w!CuP>H8Qxwig}sm^usDs64N2hmCP zWWokEcs6WcJ&pQg-w3hK(`f^xaDcT+dKw!C`(#>A;|HKxyHq!|Yk%d`_aSGA3vIlZ zxByYQj65TDm{#khi$fgMy*W;;H$0B&+8n1wb&sREHOHw@*W+k^w@;h_Ho6j4_7uZm ziMVkLdE8F5YbG-;?*gX5LLwnxS7vFZvx!`Z{exdeQb^(${Gk(u?i~lfK?>oawy%2Ru)~jJk&n z=dcB}d0|mtrgLrYgQ@S%l7u>0YLy07%ewb6Y=GPR7}DB!8Ee{2gFXgAS{pZGNZT%k z&y;CnXAJ4AzH4c1Caw5(%xy*fWfi_S)YsPUv6j0UL9dmobF_C3w+Tqi!fkk5@7%gl zI_+{oNpP{p7h(4wpErZT(Z=6o}*G8A8BG{nzFtIuC?+fyq? z9XEz_wN?M(Hrp2aBo@TzT?I)xZMu+RLAof6hOnRU_^MyHTPVaCtCL(SG0K zhskY}{3Ylu3^n8*Cc07LGruTu%sWhYqr`2hhZtqldh2B_48UjeK5KvRx!|d0+BkoI zam&`cTAdf{H!fE@n+uj8wy{k@%26w>T8JJtrCVPviUKFUSusJr(JaKV$-(1T*oZt8 z;@V^|a@-6b&8{sLyiv|8k&-XkHy*h4*cR?#xW=+8%`AhO>?ovFoenN7662ChA=Y+{ z8`bq-^C-rBO`C1SjDA`S!%j|D2>sYMW24wz?F)1c@l@Y>Jm3BsjYGKVQV)-!WQ~as zE*`IkHiZBub!v`~+J-$!@on0y#aA8ojgM(7 zTf%2%7ko=-b+>7ggyqe}!Ia4qX_{<*NvtUP=(i5H_-CEDRlx1Q)ehGH@8o$ca5r#0 z@UWkEO6@tB1(c52I-qp4ZU9QB>u#X*xE=0mjG7+w*yxI9{`>Od>Z&F;EZ4JjU3=QpzM+i z0?!8C0(>>_0pKFwR?`Gl0@tTLF|# zTOUw5YrhYap4xkXsHrC(0zMCTFK`0zAAv6b{sede@Q6e5xs!k?@WsISz|(;j0Z~Cp zD!`e*cLBu*cL7liO1=u54E!PR`M^ns=5r?l=L2T|F9E&;cs1~)z}tYQ0CxdX;6p&J znUbf0x+_Z$%jZr5t^>XdI0&2q+zEU+a2HUzflmOB2fpO+eC~z7dBE7-M`5g0JpUW8 z0(=a32k?i$hk*YMJnV>k?s4E;;C}+UfIkLq2R;G33;18aJ-{b{6OYX2o&qigJ`EfM z{uFo{@Mpk>fIkNwc2qw13~(;+zkyxAUjTOk_X0lwl#byKf#ZND9-Yq}0$c|?6u1+3 z81Mn$;lPRG>385Iz$1Zo0*?Yd0X!PG=otDR*abWW_-5d-z|R1W13m_P9`M*>>385V z;6z{_@cF=M&r02sIz-7Q!0Ivnk0DcD80^9>^1)g|3{0m$MoCVwtYy*A?I2)L}AfKB9 zTm+m8+yBk z;H!a$otV$90?q}l1@;2h0dE1G58Mr04?OB5<{998;6`9Ca1-zr;A?R8RPO+M)=^wiZ++qid zA8FL%MEcyFnqI7{17V+&8>50<^=Gsf&<8;OEZnG@FiaQw+<}+^U2D2Vs$7*`Wb0(7 zl^F^I7G-jcelcjK0d*uau5!Yin!z$}@T@XS0#kr@BlEsKf*Osn>LCv9C|6 zD}3<`y_~MrbY&=^rUJlL$chY=(@i~=d`*q3l6Ipun@+Y>dh!euA`7OOM*Xl~!@)Kv z5kM4F`ml&Y6xBUj9dgU{ZOsh>Fi~w`H)rZ1;aIK&A_)o{P-0|$ z3lt7#zsX$5pF@*%cWz9`X})aA8EVqX)#q7zYC_PmH=`Sy!gl3JSL+Ie`%U_X=2d6{ zwM3kvY^p<)#U9P&D`xyOji!TJ(~C+~c5Veu7v(_=-I@SKywsoDEUF>(M_Z9EjhQ-I zEf?vtmD0fih9{(U$Tb-}tv#$1$kjFzca%?s5k_u*(|8M)K$bG9FQN_vrA;VAJy5x- z3{`_MUKJfr>0#*5Y8A>c5|ubvl1>>%YBhtAu?E99&3xR8pAlx6u$6nBVXECUX2m80 z8vbMFWxeS#nAS{K$H^rh-W#(qcmbw)G!f0JlXQmhu8-PqplYZ*mgzBgjP+ynhKIx2 z^cW39pHenSR8=FoY*eelBhy?_U<*v?iZ0E(W`cM`&ieFPYr51ldSwNFMmjk^nUh#iWbW32s_QrXpfRb^CL$u8_Rm2=C-2X#X^>aTo-6~N{p%iP*Pxv`2q zxrLZvj$rYIk-TE zoNQuLMv^1I0E1Oz*Ln1t{aP6L`|@=wr?;XUn$A2o{9VqBP}s(s1TxAWyj&MxVLF+Y z^_H}+?#R5f$pL+C+q?yOm1=S}8``N#gsLXbbah!y9`kw{n`MrF7^TU94! zPzDX{YfV*K@-uF2%8un1Mn}`XIU{?^fx)N69kW9$*Fi1chnr>y<{r(6OxqfQtg_aC z%p5D5_1YPfvBZ>iawkkIEjF?gh!wXjtR|v+>{hK3#`aKO`=D4=y&Dncb7qP~dYk3k zmKG;>s*$jWyLLRKE`i213e6s;*_?Zd?Ld#qkQ{kDHqAG#i0Rt3EG4oHHrT5neNgGO z@Gf7wChR1nH!qL&jx`%Q*4tui)0U)Jn%eS^+IEAY4mQHWQfi8snTe}$1=4!Srb6RF zQpZ7QcMnuxbLel`$ZVc(Q};I?HML(XgiwY`gW$Pu0t3_NE$(tBxr&2i<1IF*XZ%*?}WMqw=^S z`DR!*4hH;SR~gOgvQCFcXofQq+EI^6m!s^@8W!FWBPh&5u1@VQJuM8>Xh9tuXS5i7 z4R0DV_91{e|A%X26#`%Kx(VZl7g54~oJ|lm>iV)IP^Xe%7*_1cx@Go}S5C@#zI33W z+^@Zf_5WOUHlf;G``u$S)sMplEM*goe-2~p{i*5JXA!E+Bx7Gf2>q5h8;SE-6)L<) zVx`d!VPCaRKl%AnO%}K7$TO~WOIVLILo|zDo_2pS zfS`V~f|Omn4HRAx(;OM6NF%|))y+5a%tIqr%fcIL6y_p(bB-~*|H_PsPH`^LWN$Bf zgcnK~*6Qw+Hb~jq>!D+{J!veB9D8Xt_J)n?*RHWcF?&~*(Gu^;>0QQh5M0z(GHXWM z?J)P&w%;6pB)T90CAH+!X)S!WMLQ4X=xC9* zaSj+&WM*GV@mH&?Q!#^Ty%u*IlhxDinL!bN>1k#rB;u1B&L(yS+NX=Dw+LDs;2Tm6 z#fpXXm2+#YqA*Vpg$;6Rx+I(nXN*)`Tbg;Bw$?3SG=vK}J_ZwHZ}GeXo&2}=lH`H?qG4k3A=mNVwNf_BxY!+_+?E5H1E;xbwXPI%$#MZevIUC*1X z`hc4@xqK(9RO{8yL^~O=<0)`BB9gZlR;hofX@BdPXeE)?|2y;=eIKf}8o6w%srd?$ zO41y}o-jT~CBznaoeRbLWnPZsfWd(->?o%;$i(a0h3xSDEgiCU#G{$R9FTPxBU;%} zC$|NOyqXi>T1X~Glwxq@)cxSc9XZq*`+b7my zO*5kuGEBjIAVBGk=^{rnw|VPT%d@dS5HgFia#l30LiEaG&1eN{cYkZTRyHeY#WBea zB4E%<-lT1$wK?Ubms$W}dShy-pR?}X7EWLtmVaHbpvV8yC0Jj7yyrW%|shO?9*MYbG1S z3fn74)*q+pa4EjF^1=A#C=g`3vV^fmUe?D?KyGuuen zg#d<}$#i5#gyV}{;Yg^AVwo{oVPH#<_d)I88;B*_RuwK*HISlwDV?fZVwX^~<{oRv zX>%5wty4CaHf9=PYoW6yutpB84WAYc-5l_d+mJ>jsHJ1#GjHde&bKJZc0Gw7``XUr`#VhB+>!Fu(wO)5`ZA8?Yahzd?pvS9sSi3k&NI8z zMxm(3A>2Ma%T&?Y(`q(!DqF?K$Q|l2H2}v%mw2X+bBa$^j3iz`qeiu|&60^G@L+4n zgKdVD^vT2vW|GM(7BilFTDSdlp<1i^kyj>}aytMDN28Cv(}cm);nQAj6kVh?kgLdQx^ z=d&8wT$}_w>((B^0Ersl^yxr}InOL+anryJt%=m@5`lUrgxsL8oiAiPV*I8PS!@wiM(iKsww)C z35+|GzDB#CiH5@tfu$}3b zv7zj{`wS^1A2r#G)ZX*9o>`Pjdl4U;GdW}SGRGkb!$_^@^eLa24TW37%B_06VRCxz zk}kcm3Gp@-^1TC0V?D#^`hvex*v`yA)gY43==P2da&oA(vBVlyDJ`0rJ9pG^qEt+l zIxibJZ2t;vBF9({DaU@+^&p@59>@y8X4!60sy0EE4OOX~M;oL3Iw}Wc zlz?oE`xcTK)-JSiX}4q-m=ctw9!lcN&_+RY?M7a}$c z)`aLe&pxxfh!<=R9K}Z)S8iO@F(X~k*0SQv8R@E($hk1(BS$vt=zCrFYX5E5T8#zN zS1n44`hpE&xf($EeHk^zJNh90=W3U&m-!&JOMB;QjPnW_&eI+O!3KhOoXNV*L43??tBgi6HcgjMYA?A?*7wpNby$fg+3xVeod|6qFl+z@u|Vc) zxm0QFxJ-xG=E-Y0z{&TrNXllzwZXMXkO;PecQqT^P0SA-H72x^%Eys8Yo! zsE_+!bjdbT?q;;Qv|>y#ZR#l!)Z3JEu;n)o_8H-J0E^jlv!7idXhtpD*Gw%dnvxpS zcto?7@K!1&!C3B*mXF$}2T7AxVfcBBL^;ifa$1cj+3JrfvpZ0qtXnbGK6xcpn(IpL z2jBjn6h|iq0tS|?%f$kH>qj0aY@iN>1| z#P%uTtY?LW;@DF!Hrh03@7P`<@NYXyHQPW{AT&{*G|p;v%deRJPKD}d6R+z_s=(}hqBi`4m2_1Ofl~{gH(t46ZOi=m z^A@zUP0th-7WEmXRAw?jNL>@^*yz{suU0v&2iiATGSe$h+h(5?YQUQl+46md8+Q$z z+(av`O=^S%BYAzQovS&cEi$cUOXiYyyb>m$ZqBlasu zGkt9|N;Xq5?4l&DLX3+QU|Aavr%p|AqKbbG*@&VGS?#(){J>P|8xdLGOisIVT+P_o zz#`E|qDuf3W3;?#ouB-2d1E;L!g7{`-i65F5n|TW>1(~=np*$k-WzQ^kBKj9EUASu z@Nr9Qv(c({v}FkFyWa_wuVj{#`kbt+Yo@R2qd{*yYwD`xB>$XT7??cv`z{GnIWW{j zlS{EDpRP5<;MFM7*Eubnwsh@kuCjE&yLo_-F0Od3R{sl%T?ppZlv;; zEjE)j#7cOMQBOLTDomQv?7#IwLOkN{Q(52eEwKb_i~L2XD3(_B5vsYE(@O~>V$`;b zvVM%2-$E&4V7S%X6i!3V|E zMI38PuU7Z7E*8mz+PdgGz-*5C4syDogV5iJV(_{-_1bKQh%YG0U*bCPlbHliOt$~CxHDti{jI-Edru^1yhsv9si?~toA(6kQXmb>s*HB%ytWC7XXh`I z+oLyINL!T5C`z-ClQVXZ6DS)=u^37+tl+n~8i_gs+DW229 zCGRt|*~0~9kb`R}b>hp?sb*$YB z)h=djpU6Sq#3TABw4@1P&90x0LnK%QE;8#Wt(sCA8 zU#Pug3sEyKK&r3(whuBgRoLM=PBOOp9J#+W{+(x3!@#a=cfx7BE`5%eTt!nl-Yn~?@ia=kj;o$ zZOHLC5K|dK#MZCrO>(us1R~LnBi_1;ok?lNXf$ zqL?m_f}Q(=n7ff$>&{ZAB)@v!v?}&gkZFdI(Y|3rru9K;oRz6MNleNViibn$KiL6! z<}~bO^k5qSylYB$=icm#oDp!@YU!IAaM}BqH7($>sj|m$+51>FJ^0J^$>}c-xa@u0 z-4gH={0YZp@8fRnbO4ELvZONuE;}v{IWF5Ox6BIuvODsG-UlulIfIMxxi^E$uE`J1$>(kWm#vo{ zo*VL!9heob47hBYykkkgWjE$CO9L*OE|b~=E;}sGI4)Z-JD25i+sIRPZzgqwII?MT zx8t(M(zQJJ%ht<`^8zjd3XeFx7W|17!G8((##aSgHeMcf{50@OULE{pOXd^cgOn?~ zJ=0bP|8d|I@Lv37U+3HIFB>kGtO;?>2T#`q{B-c`jvoqsm*eXce_ef#&Ow@xq1UOEr|09@WmTL9N7%I6MP;1GB>ep6TAR^ zIQYa1vFQOWJ44&R0f}r0J>nG5FJt z%SO;)mj!>>HF~?_vUzl;>8Ek5pXjTfXsDn1TtD@(ei}#13`-J?cl|UbG!`@l z^o!3L2m0w*VevV}jnA=cr|<357RFU#eY zotMkC;7-CFf&20DT<-IPeHHjBHpS^#vI=lkGJDR#d2I{lot5|rD6#D(Z81$1t&&s9 zQ_y@JV)2#oT^CdRLO%O)cFu<<{|fK?FSnzSA^dU&R`4Um=1dN%#&==5r?OtJpN^&B8?bBpDr4K4BB21>sUv zbxZty_0)6HHJetgN=Ep=VJVM3((4L*F%$8Fp&7)S;O}L-5m~mqvL-9 zJYj7v_kDks|NflfFV4i(vz+pb`K|^}VbauoEhua7kwkrgF*n2ocweEL#>#GswkCOW z8c~Jd&KCVSI+^8JcY3m0?smH^ih8k@-$u!MJ-6zh4u^IDWa*s$-8Qsxx1`y$F)1CL zb7k0I6;9>b?OE8Zt9pel&Pcw0H4EYF)ol2Mwx!xlp>x5;d?+N!g?Eotu(oyf&ZOTW zqRYY7i~AM@X4|vA)>ig`Y@&kjo=i<}s%qHFCt^%+f7xAETeZuA@!r1FVpv66)dO{! zEvJH_e2Wa-+6|k*DEoM4jm6aS^)!5Z+nAKN%x!k9L82UQ zS2xwey&xliN1f*Zt5cug+%46q$2_gaSvn+z@}zbqW!S?L57 zrg#T(imN!W4CN=k58;Fh%I$V1zuzP`gZgZ~AeXz%-M==$=>NhC>v5vrvkgB?*-=K` z1&`Rv+3_1$$gUc`GiYqhv0dN2l#IYHmw8vrznL~Z(cMOlFlqVZ`g#zeRC-Ol+h5@} z34|3QZZ^3>kXG0Sak`98GeWw~0%8#);In4UZevhOgU8Q+LAxa*Vpo0?Ob+2zM~Tkr z@Y8T8J)98rAw-Q79SJ!`*4`qA$2*5r0oxw%q4qY$hS^9;m&#zM$v~rudkmRN$ZP~V zk{-}@8jTuBCCu01s#I2qb(5{_ga(`m-&J<)#=jvrSZWc8jTZGc-|YjAT(g?+%@o-* zzt-+UBu>*}f>9RjWo(XNGE*iQMZT?bTG_D7Tp1)|N|5WDxwZwlXAAUeF|#kG$v2*a zQhQYGrRoB4g8a#B*Vg3xW@-R+g?^LpkS1fqN;8?iwdkfPJMGt z8>Xma9*SvAmoPIUNhs^<+SEaMo>8MOTpf_wHM=Aaji2L^0%BkI$ObE$RL^qhnzi90 zZ1Du&sy2#-HKSf=eo0cxXG=^z%8m)E6Gm^-FRkfZ_7%pDK-3GCtekn?szgdaNsx0$ z2w`(*?CQ#p7%Zz>Qq{i)DShS5q-9CoA+%L)*ub^N>|g%p0{ygUDJw z4LX_Dwu@jglY^KNiY~mNirK5<{XvFk++-{wdH=b_-iu}$K0YxSCIcd95h6a6DA~q8 z-=YlhxysZefP}>(JEa->;}dD{wfc)*{`Jn-Z%Pm+mhfR8D_WVxt_kBu3?$Xe_&#sA z;;h}(X$-jnkm_NTu;nkbXFPmitqpr9+a1LfG&Vuou`pTLsMOl&#L$+@5}wNCTok*B zc2-TA4zJP>uYcsRkk_d&mLEA<+Gfw2&0aab9`k4ejK%ia>lnK2Epv%IUt13BBXQBf zj5U9j9)&I7$}dm=Iez_PpPHP`9-qW}1geazkGlh(o449WpQXfue3c4T2TY0IE&?=N z4&@4WKK+B0ir_B^ebwP)6z-NLfi`YY=iuH3Y4-Y3_uS?Bi6OGOhq zXBjzU&qFQn^95=(@}ja^JFn!ZkQeAXoW&wx?9tCFD=BiiOuyHk?+U8}>ts|=X{eU9 zmdB;{$@EE_)r?>HDpT!iJMvWxw^KFj6wzfUo7%}m%J}|gsz1rxM%_w}VL4n4d6J;2 zmXx5UYI!V@D1US&erz&u>wkJ*Nji08i!{S{en~;^Im@u6&KD9fu_h#`mWi+KFf^o9 z%T#0Ro13aa7`Cj>N)wqL%s1ERj$@LR^iex(VlE(se_`@0O2t9h5qVAZKX%psM;-9QeT7uUI!n<%>?{-NhI*fB{PPO> zSBq!uHcR_Ub^I^pL3zSf{m>>n|LV&E2BYy*1My7FQxm63=l^!1q&!mJMeMj+rl!^E zWTZgBEC)e|;0t-~_>zOms6+&7Eiw6C;CXy$eUS_Y{=*sWgL)Q1qrN&ZB!`z1zowB zlrJqG)s=-sWF$3%s^`-a=Rn=pI&&gVSrN%iY}*xckv=hmMV3+8)FPjR=Js=}u~gdY zpX8bBTTc|$TVwLk2uTT@Le2W>&G6JlqbbRu($e6gJy^D-WMDl@YGU`Q;;J{kWdu>1>6Qu_mGkJvYKx~?LjL#V zO3k3EQp6}y83oHtmeF9=>vj36YWb?k1__|f-d)?;ytbY}DHTJ6Ua2cn4T?ie>u+pF zmsHHJigScZbe_6`MOmcidh67hcmDf)rs`j*%eoaYN0RzQuhC}Oty)V^^M=()$vZD< zVAYOXt3wg<$EkZv^glFJKuY)r@P6PZ0Z{oO8Vr$JrNT1GL5y8CYg|i(dnzxbU8klc}>~CiwzA+ zLoIFc@{dH-&qb>25?9`Z@nNUhLlduMyMqYsgUyLUfP1Bz7#L2t9538l38k+$f>V5+iq?>Eu~K7;4xOl zt96#{D$Qd{+8VpaKRt)`6+0NK`t<456I)5uhC1((jdxosSu!Z{Zu_FHRU*U`GwDfl zhHZhv3P)K~NLC*tlP$EctQ?4b)tY*Y!+Juh-Z~T75*cY8slyXw%2~#fOryLHzM&Nh zR}KPgO{x_YD@&5JH8@Iq(v?L&Ip>$*Q@1WTL;Y7@npw^BqP4lNCL&HPwaUDJe$4rW z3|1l#Qqi(Hpx!&C4@w8(DZzH@v5$1AHI1o;RJ0UIWLL_a-jBvRn&^<+L1e?$erl{# z)g_;k`5&|v)r-L$<=)gPv#j;0^_2Nd{>%oIpL`Kk$((iOlIpLFbZlYC8(yiM9A(dN z+06FKq#7Atn5fdsFtm+{8c|c~AvRVN+j@|e^)acZu?;A>qwT#THkRasCR#?nxTI>n zhFr0a(Q4_dtZt#=j;A2&4O;s;(Y_Qpt+bYeu*)PLo7SLfSoUMwTOMZeC0c>CGNj6- z(w43v8c1qJP|Ca|Fm*Su$EBVq)vCEo_0!8sq*5-+8P?i~nttWn(hbh*Hy|9#Jw-}w zOy&B<8*jW)M=ZjMLtX*jgeEpsZxS+d^18xiUVv(9SVwbQZGG0w$%k`T5=pWiC~Yym zr>DBcOt$r;3fVC`@oruvW@FM4smA=@#z!M)mzUTr3-COZpE*-y7c_~a=rN3LBKMJe zrnX0|c?Hc#Ub>M_z_QXbv)wS3Ae)npBc{@t&?QBgq`OJNhH9hAaYaV$JNr86l{>wmkUL#JrFF>@1{nCnzTttwa%FXefjRS;Q*7`wwfd-4qRyje@~ z)<7YdvHfHYa{l8DOMPHu1DnK*V6AKNWe+IqbT@TGMDIZp)jp=phZoMmPP>P-X`}p@ zn2q|4hDdV0I`U1FvDPNzdOEJPCTsAO1dF9UO?`sJJXa_bn%5!XVRW>&gw^h>vTf$1 zXIs&%ODEs=;L4$ChNe?A&D8WHO;6S|OVd*|ovLXzG{Z2Avot+h(;Q9D(ezxX*gu@7 zX)aXk2+oJf9{mMS*{{D4D*n?oy$CA&i=o251S)(dRMNXt)5|oyT+KgY4`2g{aNk)oOX9<_vf|y4(+~EySugfF73WsyYJEN9__wYyYJKPFKG96?LMI0 zuW0wH+Wjl-KCaz=*KP+&#wnC5L(?gmW`(L7|srfOel&4p_--Am3jsM*$ zPXa3CG2gesxuBA+TT>5I!h1FKL8Tu2P>C1N?x1#uv^%Wb5$%p@cTBtE+MUqu0_`r; z?)lnXq}|2ZT>_QzEYNhJ=9g-InfAX*(?yz=Yq}UJg{GC7zf{vIO=~n=rs>t1 zF4uGgRO;&*sMO0xpi(c_YWGU*zD~P8s@ojeEN_x%OeZ8jZG1j~8-|55+8u*R`U$Ai z@3oqLo%Ua)-L=|X2bJ>IYySrA->ChYppuT^aHwz&O&^?MxrHUa>#mC%(bPfNhB4c? zVxBSY3S-_pQ>YRH?u#wHP-x|8n^0_m@RhJFB~&z;=Oclm(y$6V;eKy-}Dq4_|{?t;dF%+(8^72s5^ zuZCU+MAwn)Ch#GBy`Jl7T(?67V*l9zy%~ruBfrmaZCzo9YP(MP*{Sqr$-CrP@+xUa zJ|%yWFUgPOL+&s4mHV9z#5Oe>oC(C1^=u$E+UJ0C!FeDThz+{fCSM4qgNwk$;1b{j zmjdH5>IE_dIukkzoW^w?lqt|SkLwRZ=Yq4iz7jeQFl`tv;07Mx1wP;h0T2XYi!1iZ z5fBA25C;iRLRxoG@VmiRK@YeWJPPgsUjX-m7r+<617HXE5_k~wg6-fd;9<}Q9sy5- zuYoUvo!~xjE%)3BCuu5B7kkzz@M7 z*bROJo&kHokHO2}XW$25A9xacf_rTNH-RYkm-7GL{`Hc97s;FG?~UZC73++SAdog`z;7v7 z4z2?a;r9s0<~j#>!CWvM$l${?XZ#13&w!6`T?5vF)u0wsf)>yRe-sRXpMz(?J|J!K z3+Qv;d5}xkXQFEBm;_m{Fu9;CcZa4C>RN;)z{4i7lE_EslY1L z5@*aR42OTxbv!5Y3a+GaF18tkPSjjLM? zthT`oMkCIo(X`%Jy|$^PksTXD-I1LSyu>Kd`Y()Tm(lDtnmtCd*J$<`&3;4HT#e?9 ztZecOvesB@MOeFjjiFYm`7g?{?D}^Y>*^a(*)g>>_#P9R1gxC$*Sb!vpt2x~&faG5 zzQ`v2CF^*Mu}m_#(9aMX>aWL8)}TDROk$PCdaJ}}V^No^ia8Oq@j ztY;)uo!6jTgQD2u0achhIA|na@yb3~B!0waJ;#$u{$Kf9*{lR~moc?JN@Bu4-&J*y7W@N&b`mOz@RepQ@;{Mpk#8~(-c-{<~=U$3w0#4Yt-JJYJa9Ne?u zOZ_|HOMTkopMyJJ-@o&*$>l#6zFYH0zBZYE9{d1&$)5rL(-3?8=HiZMzH=w}>!d&3 zH(ve=;1{Rv|5e88&djv@T?l`njz9QleO)e3y7vAx9sVNtQhq1=iT(Q`_!aPfMfqzV zk@9C5{axetzZibCjz8Epxqe92SPoywkLGvYJ|5o*|09}T`>>UNd;Ttkf1TzJJ~TOh zm&31xFZJhyKe2sgz+Ver+HdeHljEbJ7_F)Fd&lDsU17EVEcos4yAjj^_zq`!`^<*F zS@TC8q<_M%e0;oodGK%6={wuYkWz^LxKEng3ziS9JW&`zN=L8~(%a572&w=G*1Zi}zzXePg@GzeCB-=;c=X`QU$3 z^9S!6=i{w@e*O=@SMmpcqI?A4?}jh^zxUqBfe6_jw#;3)&KP2&`eDIB} zyhrop@%t~qJ4eTNe$L{L^p5i@;9scuwVx&Z&UE>$gntoyHGaaMIR7k#e>r@q|7?jr zq5iAz&rhX)yOn=?`&7es!I%CsxNUO(sDbZ+FAJ5<6Y!V8_iKLVZIk0)4L_{;BezcG zFNYt~{DKqkSHLgO{NB$@j(-jOV$C;B!2byRGWgOzYPU{~e=Yn)@KyWXGMT>;ekFYA zzqRnE8ySYPudXgT&+32I!C$W9*WOHg#_|3K$J@6S{zrBE!B0<4zaD-ge5rru3HS~0 z*TPr&S?A>Vjquy_{YO4EncoEeMt%QI_+(Gzzjlt5|JAr}()^K6PL96@{--s+-~{|; z_@5Cz`7gN1>R;L0(Qjs3>92+VIrt(Uom*M5RHH>c|t>)`jm zSNhw>$sYx<%TEjZFX{AqH&0G~J^Y7t`kft<({F|UsE$8)+??0Hd>eoL0B;h}$ z`A+x~)4u`!kKoJrz!TP_@!>|ie+=IN9kPwD5?p?wukVL%6o|{(udt7w)9`yy_?^PF z!rS%B)A4&%_#?u#_A~7I*ZKI3*y2yj|7GwG+wPy5e1np_Z87|*!Y|;0-^BPO_?<2M5#dfQ{{sASZSg1OzZAaH z#uxp;p1(5qc{cvU`+pSvJR3hXe&MZttN8C1zSD9~eEzG$J8p|VvHmu}FA@HT6@Mb% z^8LsE+c!4w+@54TLl!E;ddyJA2N)QMu^J;U^RpDvwAyg7Qot8BH*U6@f?fZQHbTYB zE`6Ic-6fl(Y7N4&A>+e>YMF;sAz3WocP}q)-T`g{onSNA2qu__ZDGra zRWRrN%3DlgOPp+4!#mWNZe#hEALk#IzOjFJ_=lKswydpZaV!`Ev2+*mK^r1q?xvu2T@luOod^bYmJ0^$A?aEQNL@aqI0oPr!cpZ;~{4EaY59@T2Omr^WZWDb?Z!_+X5x2-^83@D#Yg^2v7FLxM%i|Z>n8)9mhK794mEJ3Tay1XzQ_jwrx7HK%&m+Bj zE4_RYw6eFbDOpJ0U&2yhp);?JOYCm>v+mJ8XO1+bd7={h&;5S)@>gV-GM;{RifZ>c zG`=8jaEh^?4bL_Z`+?37y(Z7myYmkisHOe4Ui=s7(vNVL>D1Mb(_k(WG z2CouDsUO+~uZ{TGxVyQ|mUN&)@P* zLQUauoh|p5d`Q|t@oU4+1Vbo|*h1iwyT65k0bLHAbNpW!~x+FJ;FGxx?_Ks)twT?=i44&j$gm~5^K z=4Tka(uP-N7$!6uI6(mz1VcaKUeL;Uge!&bzz^C9YQYFFU0j1UkPQa$8wHhM&>$^P zNxWXt7z71n#Jh?(&|YAGPLQ3$^@YUE#eFX6;T}4j{7mN_=TJU)gYe8Vh<`TMXA%EA z!gAdYYH<&p$-U0UA8O(@h&M{SY{JzNx0|@Npfa0ypx^@T1A4)bT+98$A8LYL@-Rqv zC;90o-AeM3O}GNmGf2Mx{s`eK;Sb7vF2bMi{kTV=Ciip_uZ{eSl9xe{&2=}lU-Cdb zjKJ?CU4yW-q)`j6P0EFTKmJ2f54gLz-zeyoG%0T{`KyGEo<`e}A22X=wa0vVt$oj<;<9sk11i&J2E!Y4)1?~cU;5%SHcoX~uOnYvMaXAQqO3(z7 z;5P68cno|WJO@U=C~!PK#W)jO4!ocQTn*NM8^Eog2RsUPgP((g;BD|em^L)UxCqPz zgPfW@F5bbv1K0QegCK6nls1V_O8;0z2( zE(TYE7+3;63R=M@!5!cMuoFB9o&hg_UxPn^_rbK6NCR8}LZAfHfCi8Rw}BnttKbLV zWpEh03$li%80Uf6zz^nwCE!}H2DF1ufxEzi;M?HG;3e>D@CR@VoPyEMnZOC$pb%7m zRbT`76u1*S0KNf!0Db{p0f)hR;8YBO&Ieb57`O_o1na>kz#ZTL@HOxquot`lUI%Z3 zzk_N2KE;?0=7A_E16P9v&<1V-UEqGO6MPr^7`zM)furE$15=E1!7Shb^Fa-$2T5=X zxEp*041k}41K>B{7&!HnDaJWqCh&myUO%F7PF=3p@p$1FwU(!F%BJSEm>k zf)9frSO}^?EocQ>!0q4x@HqH6cm*5*AAoayMVo>cr~8o6i~{4eDMmK97+eWrU@^D`G=WWE8~6g~1K$FJ z;Cb*mcn6&HI&}_ag8*0zR)I~R3w#OmgT3H+@EQ=!I>Qis_$1?G;}o73PsR4{L)iVD zhRxp@Xu)S<>vuMGe&=B0cOLeA=VRMLSw#BWE2}E#sXs@XLFVr zS8=Ljxv`jYB`b_dW2sSvVpC%*LmgRetT3)YHM-VViB;W4v8bzMqrKkX5yfB&+gM{X zvq62m!FIE;-e@&8uxZQ&F`L1%Lwkd9qtRh(Ha?DJ+!n0jKFI?`r}1gyX5$u?Nk3!U zYTRaQGj2CNYkbb=GCptIVccnS8+RFZ8}}GJ#=XXU#utq3#{I?@jR%Y!#+QsQ8xI=2 zSd%=2B}*TcD34;zvJ>l-$FL;Xg{96nvBv1fTIF%9a0akac@oQy-B{&(&-gxeO;2IJ z^F#ELA7TIT40bs`#>VBR*c1H>Taah57y1SEM9*Vu^n&ps)*r)Ip}dS0)d8%6Ud1}- zAXY)IV=*&=Mb(>FFCD^C=PfLC4r8hFdn~w)U}g0-mN}zX=DdSt&QUCl{)&~#F|2X^ z3u~O?SQfo6)+!E%Bf~Mpk?A(g)uz{0E+Vz>8MRI&SJL`CJjGa1pam*#pAoJ%}rMb(? zmMlv5sIfbFcB&|^NQ*LmbD3=2TQ?xdqSBJ0MJ2^)UKQmWfv_aqYe`MXlC-po3u_7& zl&3{pkbbMulCp)RX>m%cN*36YEv>1kTvf7kS=rTg-?Fqs%c>U_R;IDj@?T!KWTBla z?q!7wOVa!%)KYoHl7+=3)kXF&O9~gK#i?kWU%o7@<|u-L6@bKt)g{t#j@&>$?=u<;)<&$?zk2RxK<^%Vtf< zigdSpn=&oRHI->@>SaPtxVo@>Sz3^*C(6U}vf`Rjd!igVw`9B#%G%Q;3TIjZ;vUaq zS^GqBDr=u8J@`xz9`Q++owD|cqEpsh!l4n#v3!=b+a-xLmUKbF!!AcSCyP;8yG@F4 zqzMs=Gj^%5oM}RXmtAIXP86B4_B4qpYo8!6;*l;d;*%~e;xkcNv|qZgXir<;6`#qX zGUl5mDPz8NK^gb7%gLB;+O6c}U|ZwZg{G{1qRf=FPZAltY!ZVjO<-_Oke9Od3F3l> zU0QIa2@7t!tdzA+5S6m_bVto%#F^ei=jTwT|)$zn0Z6>_v% zgJOxJO-^bYb0w1;w3~9N_s`Qp7s*@sDRwcYapQqYS{o}?t64O~U%=XK>Y5o$J{6U6 zmNCPot}8dR*;$oL!?uviIOA;GL+;;N*xFdtBqwC46nKH2CBYIoWqW*9E>b7BDn7Zy zrmm@RVN+|<##e*wqxlyH)467>zI zx=&q;9OxvsEG zEp>7ya?Rg7)-Q--g(xSxsT4UEAT_ALuiV&lLyA+S>^g?WN+qyHxekw2S9!mBNZPp$3@#?4i|Rqqf-A;iG94Uh1;(OWk&d z$L{dj9X`9mZ+Daw+6!E2FRvUIVGoKtq1ulZt;~KsG3RBA?M+*@q*AMHRxOlOmn|tS zSz$|{yl}qO(5w*Zv@<*3ezyr7rM#@VhD{P%=#=_orG<*NbXkeL7cDMXvdkX5q{iNf zi+yNA8;Y1bM>@rtsY-D@RQ2OgXJwcFk-6UHrjdoHt=X?a>>u2?)?&E@=l1LeD+L1kcq_k?;7=Y%ZQq-H8BOXDgSZq!l6 zqY6Gwo=R3u=V?j{Q^m{6Nwlw;4HMc>G5(S7#D=ZL{$4bc)P2M~HkFf;>hy-kX=@E! zX<153T;*7=m`E>D?y*}bSM|7>V7b-VMPq@hdAWhN8kF0n^;KCPCsF?T8uiI4LDi<# z;W77Y5n^T_5^U(*!;Ti zJ7ROEf~IK88|)c@tswR5;kpkDfI+Yy8~}&F5pWD-zRCJKm=5LwFNlI-PzhFoM$iH} zKquG+dO$DO1$KkIUUoDcN8IGgiyD zl#EcuYIRJ8Bo^j+6TC!*oRlvnB?N71y+Pt_%#hc{m^}G)WUOym-_W*Mu0Jl<?ownfHa})|nGc!2Fb|sVm}k1?y6RmmuDe}3T&vwb zanJG`_gvwv_s$Ni3^WF=5BxfOZ(<-pL??D7kY5LW89p!ZT!PN3&ZOuv{}{e0+7tVF ztT6tnge$Plrudzi>B{$hJ-jbGJNnh=-slDKcN1(n(dRkyf)n&tm>uSJbGP}dIcy#? zFLf2UI>`adTI`V^b*|N}S3H07obP?hJLZ&|4D(<1Lp*u4g6>DXz;yYM(Ea1cjyMEg@LS>0@Vnvn!-?oX^g#5NvC-Jn_?&oY{JwZ^{HyVo<0J9k#?MVS z6MGW-6E7uRO&m`AG4WR^CpVXO1~SbLnP-{%T`##_bscv_-3#3JxWD55rTahJ0Z)nN z_nxDktG$ihcfBY1zUBKqxjfasDEwsj)JT8i7m?>Nu(P)2go|=lWAju18%@x_<5&aW(li`o0r*FW?H^5 z#Lr9w64xbeNj#Kb^NjsK?15cBba#0MJb(3=-tTz-iCvUqj;^YO36za3wcSem#s(Vf_xU|^CiVw_`MZg#jL?pwWo z^G@-_eER~cgFgyB8+<>wF0?81naEJ&PmwaI&mrqfkz(&Vfl%<8;LE}CP(x^I=+RJd z_+#O$$eEE#sIwnLPKo8jR>#_6e~Ja-1@R~2e~K3**sNp!l5Mrqo*H;z4DSj(Ccs%i9;oc9j~fLJ_GU4Ab2qvl@_fhhjOQ1g*F5jAaeS87 z>0RZW>bu_eGv6crm;A^5*?~&}p1_j8o53T&ztBRbgt9~K(62*hgf9)}Q9sv)Zwo&h z{zmx4@Snqu$c(5PY5Y|*JN9X$|MA%I*zAN0Ir(|w&BO=Dxdht&8=DY8|S-on)SC&ekQn%ltR< zH|ANcd9Etg2F9|xT#vh+M{YCRQ{8jufdTqpiTkJSvpq4-)t;L@4|*Q;JnnhQ^An^q z$7@F3jl3Ggz)7|3Ph3N;Gu*S>fA_78{5{6~Ivwh~pqu2n*Sh|w&lNEGt?S=Oo(3K2 zOd!K`imTkU(Yx1sF#cBjjKt!^)d^$Bq0aL;&HSACs2Oy%le-69&yc?-e0zK!_J6{E zZeU9IsmNKew__#ohZEnB^hO+NO!~8Vu4{|y>#l!yxjY~9O!c1Y3;K5YUh*yS-{^l4 z!-M9)J%LPGrzrfV@ZZA2kvpPWW4*CQV^79jj2(y_j%CKD#xIusIqFbn4&}J!M;1qx zMXrrBL|P*^M7BhFBReBYVjqh=7&|kbjDJ$XVmUFF{~q%VBqi$I;O+7LFmP_z6TU1q zKejlwGIn!pd+dqW>rx-s+KG%_8lTOm{Z2ef$w-E3pA0kCoMVQ~*UVF0_alS9@gDb{ zNB+O%`>SuRzlKuB18)S51?~y%4!*!Bmmf-mt_t;qz7bj)zL~y$LFD6++Spt4gv`Y0 zk}fuBPRQA2i@D!iA2=^k8TkmM*b=!QRxf!e$WU#t)V#vA(Em~Y&HhLHPxznn|JJ`G zU{q$Pb2f_Ii`-Yco7^Ar=6L@z@NVFgP)_KQP%u;-x-Qfj+8nw+^bq%dhMDU1(C-+V zE(klr?r>fBi{ZZT?(ow{{mG1kzQ`i(TpzhUvXQ&rPT&9c$ic{AdXW*$ie3SUKOv8Z;am@zdQa={PFnH@fYK7Qo9+6vl5pj+==;#sziNatJFzthMH>(Gto zT>FuoVb=lIL1gcc%jucn$@9$hm>#bu=!tp?JjI?;Pr0YkQ{!3TS?M7I{Tb@486%Jx z$O=pgWCwBrxq;~cXJAGkFEBS?2E2h_AQ~tL6bDKJ<$=mTO<)DOQ7zh0bD$;A7Dxs< z0$T!m(H@Rqe3KK)i>&EZF=S#|JU8x)&y9PT z!%E{d@#c72d`rALzCGT@__I5{KR(QSbC{l&mB>y^Pnd~dqByZ4QJZK)*Go{*^m%r9c6$ar`#r;+ z5zk?CqvM_|Z?<>3cZS#W2EE1Ja_) z7(7k$<@lVwJfGJW^_BW6eJg#9zBXTnZ>z7%x81kPH{cue?eh)$4*QP#GSLci{WH)C zgZ^@Vt-sly^l$NR^LP7q`1}0*{@wn){{8*~{t^EX|53)XEZToMEgz-5D{147Kxd#U z&=cql>NaG zG|#Ni^pF`UWln-)x zP^-<^(}IW>KTLsz!sDe-5>p$H$U_{!&KL6{=o4sMj9UKDAAaFQvl)B9d=1{kJ)NL?WO6{(oc9X%5;I?2-aC>lPaDe*V z7aR^A2p*=6k5S7xq1;ej$jeAt8mghTn?uP^M`&B9C$uv(5ZWEuhvt7EbU1VrjUp?Y z6V64W@rHxpQuLY?;pT8M+!5Xu?g{S<4=~Q|3lE16gb#<0hL53p=0tKMc@b}f(av)m6 zxUe!-8%r`WY>91+ZHw(hj~-^OJQy267deI=WyCwNacPs9NsD!<(YrssC%#XO z-bdoc&>Lj*&P#X`1!$2g5{-$r#FoT1#_wKQaW}0uM5`SZt#UL2TSRO8&Q)`#jNdh8 zEpuZB<99c6;ZAdaF?_#yfZ0$+@hn%4%gOV5kU6oExv-frywla?+OEcMnZ0D*k{L_p zDw(CaXwTk2pO&~i$lQK4qK&AQ70JsCW~p&)dQe)}RHIw5mO&ZgS{UUH(PBqJqe_;J zV|JPu&Z70Ql~hefUzvey%?(qQZ0uqoG7lzIZ|_3q-Vy7g$IFbkmpUD$-yez{i5;b0 zWnRpQPmj+~Gh>w6EoW|A8E=fYP{Ui0i7w<}hngb?sOPCKzjBfIm6Vy%%MjU#}kH=^&(^^lQ}d8 z9cG3(SIwiv=q@#CCT&4W*+Oe{nLV^eA9Lz}xyRf~n+&6+9701ms%F<|w9Ito*SRjQ zD@yCg9J>-trA5uMTWO;nHPh~L4Y>9&*X~DWIf%Y;#C4QagiQA|X5H!T8Sc4mubO$w z-8Jr&YVJ+Cx45^e*>{J#&%KNJcaM9odq3LkLFV8i%n`@cES%$+j_xD#a1@=VoS9;! zr_s~mNvheni}_-QnvVxOdpvv9jC{~z)J~CCRSeOQDhc0A=uS_Unz{Q4w@=O6M?A+o znQGR~V|EF83-r9*$Q;w=-J)jhF6Qp--d=B?cNg>bZZ&@&RCA5t%Vhq}_08~^YWA-2 z)%sePX|^zXcQf1UP_xaTZ@=$=?~rel8Qk#8Y~$2(c+_9aj8n;+vr^AFo&GLn^X+Oj z-=k+8naz*+GtuT&Fh11=8+Ff3GKXwotlG*~To5j1EGiFIsySjM zV^SkCMN7C%%@$k2os3V%)Oej4&!X>U(|dF2zfO8^9(~wEzYE5r=y=6wdF6~1HSrbn z=URGnGkv;^Ufn^z{%528ZuQ$@;URRxBk@ss{W1Ezk;qJB(f70I z{kimiClZi{446nk5IHD75=xPUN~B>0@=%LJG$RvjNJR&7(TQYiLpHjRj_t@tFA`#( zWsGj##Xv6l7=ij#j~_JmsXl)|Y38DrA5;B43%yc$zSEVb$EA_bzcyN=*Ler)FjBkQ z!d=V&J>l)l0=+x|H8LX07-Eee*7#wK9@f}ljT|yA%gAAk8`h{Hdi8)FF|6^z8ZE4` z!Wt>8aiT+y6V@nUjStrSfhb8 z7FZ)ehij`E3Hn?z4p^grH3nECfF=LMZjt^*^zNjVd`s>vsXw5lJ`>G5M@xKAOS~oT zTan-%E$fz~A7TycC^9?^4RMBdu9D(nbnhBgDqGMKw|Yf>MRr9`-0R(srg#Y5`=~cl z>E1JZbJ4wvedTD1jYw}&Y2H1)KBar_MRtdg-6Lpw<^)uU~f6wA|c@e!J>t z_uo16&Hp~QG4Xdo$AOIz!mGb?@5VcM9>eo4oj$yAJkJw4ez@^%{rvXEn123XlP5XHPjoDIIvhPF_WgHx zdiZN2PTu65Kf#myOFSKw<4iu{c;g?LByaL*g8P2sbbOcClAk#pDKOep^2ayM zvHfU=!}nFEqhMsph|us4oFi!joD}`Qf78NOtq7Cabrt;)_@u8I&QuYf!?ASQ4a=?! zU+HjI0pg|amG+ZI;$J1P(@Zu;+xf)y*mcP>?O!D+({8x&hR+da`U-$P0y_`OS2^v5 ztFFCXGEU`BIwJY@9hUDxVn6=(F$O-yz{eQ)7y}<;;A0GYjDe3a@G%BH#=yrI_!tBK z1_qiOO^(n$3aXm%4oB77ubj|R*|$CQ&syMjmG*Qz=l*6-lOq^99J6{O0Gn7XNWRw|=irKC$mvn2hGho@_J=1AgZ68pC6@Wm4Tg$`3b zTVM*-gsLR=E~z5hz#>f~>Yp!(w;o=90=_m$Z#+C*w`WP>g}OZ*?v(JkI-J&iRALLH zinR81{&qwuQ3<2hk~!E!pXf+x?f)=Sk^X4{tBg|4&MKi!0#vZF}r+b(cjEj83xVSZ{tTi}?hqgiS{dHP)?j)u)S>HXE^eoiB=rk@W>ZxCQ4(!IviTv={w68>_?YPl{{OjTxocGY zkv+lnYkQoY(k->t691xw*0uhnb@iq3z#Gw7{w3C%(H02X;`fF<_4Of*_s>#;H9X`2 zt)5`LVY@jJ_q4hmKTK?%KffA)g$Jyssl-1p%U>AhpYlnr1^(qA|61S2-dPYcGX)4-R-y2eqC)mudU7LiS%Uj4rf*N?#>FTf4mF``yyLh z9S6dnuC0sb?IS~|;;T*%@58*)un!muKu&&;Kz?;iu+Dl$HNGE@*QuXUoWc!_i-8&` zk*xVbC|}(|FkMT=Pm+xnmGC+o>CdeD4raiAT3;+d1TZt(wdP`s^dZMWJ+eMqLVWNtkjc2?^ zq@T!siCo|>uc>=>xH{vBpp{V{jOTf1Mko>4;xk-MDVH^Y=JK*h8pYgzNV?%)%LycT zF3FUpKDS#=VjaZV9n#@4-~?U6UEJ z6FF1mUq4cL%I^N)bkSeXrzw|CYG6|ovYaBRO_S}Ez8MY%ww04MG1xhtAFh0UH!+A7 zF&GKS7^IGv>|{*owiymW?(g+RdMB7-HpaxBxbJPa-?k?PcMZqmNo;C-3cYgb>a7-k zj)uiiF9h>LmU;eSBrSBIwhiRZmWcRPBbS>Y3Ft*O!}UG|*%`196e zsM%Cf9e+OB>RN1NH8!M?9C#uZIKsy?In9@nug=FPS?hfhLNbKJBmu68&97e|OQ}0qd2H zUCkb=TAPcDu@`l13$4!+5g4kAF7X%K>WW^AQbRMA9_ZNCdd84T#I2*J`RuNobGy73 zod0Y%>x7=j?r~L;XHMYFmOqksRA4APS?X}#-4kiwFMkjUpPBSpgv1=>}{TSMI+={{2Ao2w5Kbh+IoiZ z$|u8H=PZ9gP*u=eWH=t4R%hMpiiZ99Mf(D8wVbpGu6G0mTaU6n9V;8(<(+)K_qgV~ znSmWG`x#z*4Unziibh>+V8_Zml`Hn5XY(W5;(`8^M|Gju%e~{n<0}LGEeD3iSz99q z<8aV6SlTnRE(wrufhfCqj7Zy7W}Vy908d$U*|C|Fhfm8yg9pZv0Z*L9CD&H$JNo(n$zSAR@XBQ-|-$LCReMY zDM5a#&K12N+K}DvI@Zy+*wkvXq&+?|#0-W{rcd6E11pae)b0=G#FqITU2~js+I!%K z{T&CIPmQc}IAF)wH0JL3A5hlhuy!c19<138h$tL?nWH}POg!-F4ablVrVjk>#vJQV z(ZQmDz`oXT);?lo#LnmsT03|tP=k=9y(fG{M|`ErdTJ<>8Zw@tz6^2&dT*K*t2iex zaN`*r2VyxTV6~{LK7RQn^E;?vT-ucz5vweYA{9rF%N zVZZI?5%yOE_Pg7+pan5c#Fnv!1Bcve9wGvv^zm0%x|iQFgwxA2pTB~pcpa8sVgD?D zg_Cfx$`I%=Rs#F2{^rb$m1tH};R~q3NZjS_J`;hc1-L5WDOjvN2NMd_JtQDX6^~cS zNFB%Gs%R(rF2J@v6?iLr3er8XR;*0rfeTH$1vKeXYlSPtOc~iM^5Czn4pPLY-a90% zG@qXa6)MGFBdG<-ty9Ct28OIBY?vwR3918c#^Xbox^s~M*Q)peU~_jbg)a?!;R%vY zo&660ke9!bpU&Lf*RhvEWsdNKh3aoRjI1E;9X%+GGEo}t_7eIVR8N{jOe2g-swh|% z&DE6JQV10z@p10%6K#ymN?`094XwK)lZ113JuWa=@%CNr4jCvkuFmM#8=lmpO>*`B z$ZaD_G?rAZ8b$DJgmoN9(uwx{O%5AlPr({s>{IFKDUAL8prnS6#V8+%u`T<+*tmzB z8eL(Ht}E$p`z{+*E-<7~^#~b9qw3M^W1uQLA*eQ(gbzSdV1ELw;R$u>X1fxYi~Q&I zEFOW(!$ERlWC+HL$fcEA}nn4|4cO%eQ(H7P05q;fTr#?7VeC?82O)twm3xk@{nE zF%hdnQZ^_C{Wsr&T25YC4lsJ5QX3;%^5KMYd+e74{P)a$#p!A9sng0eyQwUszJ>|& zAU_E27Lm5$Ecfj_=s&EMO*@}=deo0UB?_ns!;CCj$&%7W+qbWGZP!NX6nfc1+CZj6 z0G2&tKxE6u&?jJ^9+c&%g1^(}u)ieqzfAT@<8=(OCGotC)FjF1;~aJHjd=XW4o8Ng z*$t0pI7Ie5>S!2Z{es<2PXJS)9{Y;ee6{zV#OC}7-Jvthr>MMC*F|SIfXmqP>+jOV zT8~GR^Fg>*8+iFeJ8PsjV4YS+&y)NEnLd6Uo$}`AO~ia4vyeCB zv?MyCgtus31-~0A`5DNZ#jnX!#aj^Z#>UK(`s?aL|HLe=i9b)Lb6{>Wj~?D@_^PoX z#nZmT{D<*G;~x46)_J7O7Q|n~d%XMAkle#1i z$iWJbX_A@yU_Ym(Nx&fEnapvfS7kS6S(Pq$wzNkEBKx16K2g#$E%9cINVdzjytIe_$RhVeRwV~;OA<&P^=)#%=3$SF;U7o;w`5JhOwHDX>w*fiDMw< znjWlXaQic?bY`ooQOuKUhs5kewiqR|9gSk@m^q8CKZhQmZO+@O)zHA49O3_gIa&+` z=6EHPkQwc^!gR^9&cQO6K7D?6a~XZiuC*4q>aFs%9dT>G9!hG1vH3abe!!4n+qwyN zK=ba##WKWWMcWXVd5Sf@qlb=eZO+^z1E-Z0*cvVpps?By`l@&V{ECp*v^P8iLT$sMoC4wN*Hi+TdfUCkNMDi?-uMzq@1@f?oT ziNZhF8+FQU`e<9dwbrY3Rw)(w>h=82YITwGhdSq9p3vBUCEjlSTVulj8WOg;NLz#h z7s+hbu{dcM+5{0(FPo8vA##oQ_|`j6h6LIlAkgHf-{e7OsGF#t&QG15nM1I7;(&fi zg+Y@c5A3YZCoPcqF0$RSWW8j>?<2(n{plrueFn&wAt}wJ*1v>_en!qZm1+9dU;`!d z-xMH?rf2ZWFRmTUFRS)cf`p_W@-F`(f(xVVe(?ydx+U9z60EZx_Aen=kHIQ7sNdaj z-vm8Qd(@Bq218!tDP`t$LiABxy4h!4l%t&u;mI?cXx{Mn8RK{~XGd@G4E9oyb(ZKf zTfe=?$mEd{Q2l}j1wX6PYpi|hM?{bf+jePWix=DBlV-fLW{4w1026oXE0Y-W;x9Kj=GTQ3 z6f)MuBhv&&FAp|=4;ycTHN0ErJxtlADe;$@j&eUf9Dixm-`c={`|%!7UxD)!Br>@8 zG(l?OHbF37>fG&rBx7WFk-PmR{c@4J<0rhVx+O=PNzKbjrHW$y3IVN9kX};FPrmx& zU$rq(7zq1|-D|!^nYFR&;tNUhs*L}Q$1B8@S{%-)m=Mmc$PK$HCZfmR3cPvitJA~& z!tkUzQ%%0Gm*y7h(wtQXrBQbW(`ScO>j~uDjy$#wQxxS z*k4D6Gn#*4=M4X>KXVrLn{()giS#?g&7^@p1>mJGUbTX^K&IF`?pPQ>hSfn!vjFE& z-`ztt$(OH|lTYFX+O-IfGp@G(B_1#BvAX?17zaDpHiC%|krR*j%wC||GLKMS>2reR zZ*HC&`SV55TF+oEHDC}&<1&{+McanOiwPOnOMFrx$s(AB?DX)2$Z(;%<10iMY=yy^ z$e_F9YJNN7?v4hY_SCMkhIcJA`Dz-_nm)JlX6*}{r+eLfHd&-+>OG>_=9PvbEy%I1V?6A{;8Qa=kpG zxjJ-8TAre0o*XMrbYe75t4`YRs`oXNGV}GSqlDRpbz>Cw5LZ%dw{tT-$&B~wC11XJ z@^wsmM*_}#^^Vjr%U^=bn`tuMMV;|aBuFhb=nmyMmwux81}@T;2x%io{ipvIk8cDo zj=@}^*QK7w!D->l$ieL9{G=}YqS1v{Yh4&_1cjm$-5o!m7&g>|$iX^y$F~HZX`+~5 zNhB;^S+rtEB<&ftT={u{MR^b@n-%{;+E8se&y>aujddk+NVfJFynRRBbA`@<-j=C0 zMB!s2w|KIfrwEUG)t#V>K`H~)tvM{$-SJpVyKVw+aiaiv3&FPsh@D`}K%phmDLM%gRE4%-lk_*-u_Gh z)sf_x*BG(}|HjG812ksc4&J-(Yjs>fH# zv_xiLEq*Wltmkb|TF>rsO|S5c(6X5`15dW7z*DV9R|}yE)M;47iL$W^M9h?xJ*mf{CoY{78V)L1S=ffwG>3HkOqODYOl%YTz1{_h#%AUaU?lnHq z9vX!|#c~CO!VAJ#Whxgci11;K_CMt6G?s@ghiEx*S7EU%GA@^L^>>DHF=b8)g@`eu!uZpS!m^7*mwSe;+f>d#pneNHf%lVB z2Io;M(cRl|Hp^bGP41C^C%TeU}$K42t3i7X*6T9i0-@ zt2K+e;}!y@UzoO9PYs47JtL4QQ(AY&b%d_Qs5`-h6!TuE%9+(e6{EYViAqdHcn->Z zDJ=}KvS&=8>E`L~U*k=v3KvwlJN_UVYZfbfY7b(UsEhRrw1TTzy*x5<#!*uK)Kx49 zE!`*D?`|nB8wAu(M&^tR&u>1KiuICVuv%RJ$}!KFvU)H`GMQ27Qa@sxp-~+@L#Fv8 zXlR}`)!F&S=@}UC+&LmTKT%C(dNqSsRLv8l?G2(Ebrs+N&idpRN88WUGG7b(UFt+6 zHPkl6;R#i80;S2-+J6m}oL?n@Of^LZ=1Cw+xd=dvZ02)GKb)-D9iMwwDd(s*LkIjKBwv$ zksG8*v_suUG;Vc((ALz6K7#aOWFOMlbGt02zgi!=be4MVcl3BTcBA*VNULKg%jmQE z*!+EJ{GZUrObg??MK90yr~~H3r}pv^>33b${4#Y^sXyrWOXsN1xZg&qRKAKBbb3?M3q%Qt)=skHxFY@yGzIn~(Rc0*27V!E{ z^XlXEE%WN)^?-TJ=Jjp!n!~GuCMo9O)oEVKcpYb6%X!T(uNAxwn_`u`9yG6hUf(gV zg}fdzuf@FXGp{AFFU%s8r7M~3;B~)AsEWTFyK!DL%gXcpiK!CnLTg{e{46986kL6k zkd<3PP<%UKLXb`SYJU3yk+EC+vfc#syz9#eKZck(p8sp?^4-=;r|zs#7g6BU^D0S^ zofqdxWwY-|+GN4l<@?l5h`=&WdZb4^B9S}tU$rNP*+F9J3vu6sA!af4%_mx|c||k*2I;X{r33ReNRL&RK2tB%((gyUF5ya59-dd^K!}z272cC zKTrDI#gQjW-bjDhZzI#sYCU16ce6T8<>R_3{sU@$GfU9(#?&>w5|yRj?YW&Fqw zY<0IkNFH%d+{QDq(&cP9M%MJ)Ya)aPX7i(GmP0o;RjOSN)3m)U<{E1f-j!;N-PTVB z-n3r2>9kmdGw}9}CwBD6y4rzw2q_FvOy@Tu~Y+kY{$dIHw z7?7ITWT0id)0>U`QY(x z+Aic{jZDQwMGG0!cVCpKY@*QM9;dQ&IL8i;Q-@H?u{APCOL~SH(qXS1cBx%DoNtFS z)pvy(#u&J4rGG^DVr!%x0WDKNTS`^2HL0d{9)~EUfzqSHDNrBO;Z#=~FC}^_pgYt) zx|TLLts=WXI%04FzWWcuA4&)Hnx=Ff_7@U?*75SN+Wo~mWWwNK2IW;%FUXA5xFzr{ zNTU2hGvuqgfJv-WuX>I**&^ZYuBOw*A0{#-?v?`OB~^Tw=aFU{Fq?@<)QZokmS9o8 zWD)CZhKw@q*mz!JLD>y6-_}1}^St>oA-F&$1k>9N7Kh8)nC70{b}$hBMBBmh!>6?! zJUi@bJGdl#LfgTX@G)%%PYF+vi9-$(hwylOdKq)Syealsr?pk@KbV!1&*Wq}E}-)& zio@qrObee?5eT1IK}{8Bhfl6p5}sPo5YkKK)&o&6^RMHQrfzpy*IE?_T6&!#(`0I0>}M7Tv1AzLiJEa!R`vK)%&KbgZPM$M1h0OJS>sasgRKcy@%iBG}jbOawch zknz0=%dXlZ(vl#(br&K+rbA-Pi-%SCwcdKvFH8zM2rs(ZcS7t{hm70nlf*>cpXP3t z4X=^+PcxflBJZE!ZvU~4nc!~E(s@n~Ule)2Fnj^aj=P^hTl_+X)OKtwI4t)*P!g=G ztw$r=hr*y2(i96?fc+rqcGVUE6TM=}o^FP#9upcSWZu?1CtS6%DDwX4IzkpX)g~gf z1{%6gUBP?Rib+9}{qAJSn#lVT!dHF}IH5RQLHT=X>fy{y?}~NLnvi?V-NakDLeKR= zS+e9rbNB4T9MKJIP`s)iW8GQ(gN2YU(f3~g@v1{kRIIyw7zG?TG`_ic`gwvEoDf9Z zvyYPOgIVxFAX$0C(u}ol{XcmILq7+Sdb8Wk^ey9MJ^Hi7&4e$aNuc;XmG@^#?T*1# z-Ey|OqnVdP>!0Tx^lP%@30bNk3l0S#OGw%bNrQUlG{`V5Qtw=f2|uA<{&ARoNzO;s zXyrRXKOcHVlvqlsePNV-UaZ3@{d_6mBkSJ}Zr>B6kys)!`}bB;dN)oZ45(93KrO$Msis&2FoSdlK|JGr5k!Hf4_z$*)xsK8shKq~( zVhgel2}YV6HIbeyS$O>hFmBo@s_vQ{Ape!esnikpW9vy+VRiL7r9aD|nn)C4jN^H6 z;84r!Aw?N`r`5iW1FeM%b&PrwyGi3=WsZ)Z%+uQ$ZF$b2?9j2iyhjA{ksR%iBK#A= zrQ13VxbN;2W42t~g~}uT35~xi`ZJ|1hu(f|7Ko8w-*uz?36VWzGS7U|V3gu_2sh31 z2TOMao&t%U=IlV9yL}$|tR4?yIe!)WRVL_KZv>pE1#GSGcb=rq1B}qTF7}uwxUM

      )lW#5I^6ATAfL`j0_>(Ux~T~U5QZmg2ti7s-07nqO}8k;iBnN zD=E@EeuMbqhNf7#6+Brz&eP8eT^r;X&y-A%-xufu?0K?VVEldBJf{J@JSh!o=&wyd zQAVWvX@sdiVetS(F}wp7g5%VKOeF!~_~{MV&8}$H&?GChZq1r?e2yHoDNeQc%^xLN z)ZLQG$&i0>VA$RL7g6zoyw8_|*6@V>%xoZb4tny{g_H^Bu-_0Im8r`OMCB4H zsos=B2_RdLp|b8l^^IuzxG~y>hI$LuJkdbm60`n2CnwOyBDi4aFF(}q)IRNYYjBO01AA!^9?t;Ne}n zxKS3ftnq<9dQ>sacJXSK#9Lw%Ve|OMg(Zi)P^B4P1#ldm>N5kxV)Ru}Fa(EJ$PUKSOa#prGR{=!aVF=Fl!JF< zseP|L@kpTELbqdhGAS`;}@5n0in;ZScQ)l}4p{*cCr zE>;`RXiafhJt$On>i1B)ovyw{7~J>*i9Lx;{?JkqgVuP6o!AxE@ixS%t5wlqax2la zds|wXWFPF`2IBFBJa6U6wCC%3?j!>CHm2tNZey6FTXrETc@L);e58C;{G>d0}h^bjD zxesN^$mOj`NND*u;NgcNSFWoEHX>15QaRr1FLp8ow zO3X4Ppl90t)70ES#&F2+=wb9+wMV9pw$ZW>s+!ULXF^7M=)!Q(2Na9Vfb|J$d{aqC zL6gut#)pb9I9H_LNQwX-Mt3tI35~@|H{mZNQGhIaa z;Gk;6180o;{j#cV9#2K&99Qv@{ZifWWZ8Ur+;x-k{;Q zc8$&q^~Sd~(~WB7{d;sPdd(@l9kqKZsubQzL#f(MZ`e8|R%Z!dHm3F`2uodo6}q14 zR&5dH5l#fmR}SMp4)MuYpt&yepiIon1Y>m}7K&4C+$Kf?C3O<`#3<2+8hPfc&&q^k zmYiUEny^oG9fWLz0|Si+N4^lgL4@NB(=CvklT>v1ebnl>{&4##AN|&&$0vv&N`gOG z7%jJV9Svf%h&fu`Z(xjG5PvbWM@Oy}sfn!<+co~8*s>WU4VffSL_}h|8k6mBdH;j-P=>@8hbV?Dh==6mX3LRH~I{^DlJ z%#eXU@LqVus#~+=mC@_soTM%V0Wx}(1a^cc8m~vE$gJeBF883Dy(34jcO+HH?67+6 z6mf-T&=PG-PPCC}-RfdnAaTu|_Xwew4IghLUqVbgk^F@eoJ+x>1+|)({h2@8fjz7G z|3Mo@g}0uF6{3!(S!EU`I+;T~H*{VU|knr4I<*5pv8&R(C2@#dy?!ZEEYyddDF#slFXmAWauCB`Yj_d{s=R(Z?!W zKOw@(vT|j&H=AshUheP&o34TJ?}hOr!_MY2nSjWd7N)@`F05CveTg|%wlsR(<7R&K zSDwPNO-{9#8rg~el&X=cfq}S-dBxzdo?;@EJ@|PvxO7eb8{uDL&=aqjWgKamtm0%7 zDQ3%!q;zXfn|RsX?SF=hRpG|7L^p)b!P9<;yW>tWX`4Z1B%JLH6p~s|jjK87k@A#@ zX`$}I?$@+T%hos|n|8*%xJ8hzJw?q$>SA!MPXi>q^J%3|PA`pn?SJXK0cp9s$*8A} zNxm)NZFKv8WJ^Q}Ox^xM-G1}QO-@r)GfZjxR*%Sd=w!#az%ul(iTvSX0&dF>89iKV zs?t?_pSXmxtBzK!JaNRW7Z+Sj(0~<(wY1whyV^voA;P>Z0|4{(KfH~G_^fn@*#rCth(m&-RxrE z9G82|@5mP!9_RkLY(J8W9JWhaFA=G;6$U4ga}aQ|jp1CjF%+0>40_*|a46d{QwuF) z6cqVs{vyaMPaS8w*MffCyOHSm5o*)|u zvM)50ZRt}dvh*xLN*OD>)>^m^CD&WjlrvKtM-`s(V{BeZ}N;siNU{P}Ghw)4#)enTQY zyr;3DuZshr?b{kT2_t8&iIBGCpWY&T>tW}SiDCam`gvqx=&v1yZ>8;;ot^Y5XNsTzj^!kHRJLISvekEe&fd2h)B`T1C9wmveEG@DH;)J zg*b`yrnOpD0N5f>h@xXJuC>NPxO7)_be$v+afgd%O>~{a6I`9mGZ9JwE7FeN$UJZd3=2Zd8>lt zl07Z3rZ9^+ooLRBq}T6j^Npx~$=LOGnEL+?^^aWtMi4{7_t*^hvkq%A( zxBIh6MnBUlM>C5D$&Lhv3gF>v*-CK_;HITu4CmJv1kl5Gfse;k08$mSz9wC@J4#9E zsMW38Xhct_m%gdB1Z^b;{8f8qAzBH4FFs9R3KFB&qyvd)ZkMFV`WM^f&JJf*eRgJz^k&a=nZ z9L#HV?ALMPtaDtZWn`4&&T&ECFn`x?>feP z7+e;$tTlq0(C+Cn#y6#n@n>0gNILlW76bsY0&7h$mjZb&Jm>Vh{ptzZB7e%(2bb<5 zJ*5joWUK4wsNA?hD{G{d(4G|2iZB5C1Z%adxix&I&syy>FSfLA-_Ck~6=@gl!u$`5 zyTL<;Dafgp*dv`JY;uFS;Qk-P^SqLRmC>;clTjC1%p~8b?-oehqtHc@ovUu56|)7O zZYDa_l{*LHy!5&DZC38>=mIuwbKotWcRQU*@)zo$Yqb=YL$rE;SS>tCFHTLzB0Sr6 zuHf-%8dysOQJu}QGl#FVw|<**V0TCrHJDthMGcsGLRqLso9Fv=i_Q-Pu}uc?TI&li zY&y8AX{QNJs}y80^fYIHcSf8F!aPL9nZe*QnoIO%o230$QY(E5*}NecgoL7t^|-@X z!<){Cl_8bLSk483-W!k0=;wIP8P=EHjSRZ5u;)fgn*V{W%5ii&XFU_1yw*A=S`z7T zMS5LxoA>L4BOZAXdobWkyIo_rbX1BFC}}BoPmuj|>%$zQ9T6ejFyLD=1bDfJDzZB}SWRv#Pk>x6u)Y1e6P}CwnM++H zI@c$KMye#@8`s}U_Ku#0)`k?)O{;aQy>XnwTGY#VGUt?b^ zMeJD%>Z@;^E~_!Er9fy9*xr(xZ=SVX`s?(CXfWLEbit zT^bfR#Fsgrt2weTDC~2tqMvK)L-%5M$dUh_BQ@45GJn_=K3T48vACcMr<;m1p^I$6 zv)ND^cB?_M(HqVQFGkg=-`T+joe~@&ALz@u12e@N=NOm?!`NR)__7Dh8J#JLuZLyr zuHL>n>l{5_smPibK3eNhJGsH68-1Fk_36lz5$y^6=X+T@vg$lDqrA;`U6Qdm(0l7- z>zK9*58Al0GSJ(aLG#>ZG$&`}q=7jeR6pMJhCV^m2_QzT6%H@c ztgTPcNhXZXto$(lXJY?{aHep&pg}nFb(X_GBXr3glS`8hv4r;DzFn4~xj=ej)_UZkC@DUIeDsgWRm!Ffy@9of{*akN>@m@sLF<|5 z>P5V$nIPTzsp!wZPbFgIj9Lrtvm~vJ8a8&p#wS>pyJm7Pk(xq&+Mi_AyR7lig0=CB zU6!tCc0jcZEHW71XEg!ZMtF=gpPYA~WJ_I`9LYld8)#U(#- zcFr7A|I)9S8piDzVS+Gwh_tTYwk4KjJuO!U8eFZMm48~zBA#mpJ9f2B=YAe*c1}hw ztlU*lPFJ2*r;|!o@=yfUF`WhD!;rZJ;1Y!C<7ooza7;%9#7uuf~+|%Blrzh z!2U)9a8}eQYa}zXO*a5=>0$iK{Ww%wOy6XXV@tLyW4POY4h!0=$=r7nM48J%v+R8E zDX;WPeEg_1bJ(O1aofYT1+m}(U;%s;O5}u`TS!AGypT9!Z<|{i{J=IJi`#sWD zXyF1meq_*Ix|a_E_3HW6Mj_}{&=h4_tkD#|NhbJZHV9;CE0PFN zs*1ICPVgQWN>#B?-E1eA`(H{&-2al2!VjQ-KKqnP+-Bx_AD?nT4+E5V?+QiZsy5;vdO_M96n5Qd zF$|kNO;heu`h^f($QN!%zwXDl6oual)uTGk$_p$F9h$`5{dtI{X@0)|?7pjyBagBy za)nU%&2~-Ujsrkdtf^aFH#En(P4~j}KbDnG8K&EzTnrWFX`=Xsereq%(OiEbu~>!@ z3uK_l{ms5aO+j_Lsa*KBv4M+|lH-Rzsb`_@iZSHdTf5L2v^t~}D<*CPj*NzU)iPVW zs+wgRUvkC3-Ek}wtgAn_r&O+ZJ6h9{3$H}#tzU*Hy6Oq}4eTeT*xmjdm_NU-`ReJ{ zjoS4Q7+}rJ7SIB<06eDc_$WwUGxMo_Nrh?H!BfyW9&E}UDXH;hy`uvjI=cBg=l6v} z;N5E*(kB>uljZClM#9i*{D3)G(jJ;g))}bLH{M`h$hs9k8=j{1a%_#5x9a7eunEMR z9BfG}h_I(jP7YG)Ajb~_hZ0y9q83E#0a4^KZQqBF`*`D_A0CEp_6OiuO4!+@yNsKw zj5s!c*tq1WRia>#zY;d{+~uz%3)D#N;VHkn9C&3(n*^u3T@IC7zb;Oo-{)>;vBF`^ z&yIafM{XUt@h0#DB(Sd!^Qvbb96^Fn%a#}YoK%_){JKQ&dS?pQG?}o7gDozo;cgMzCpZZ%ni!9Z&mxn5Vvw}VGXrOye{<; z$z>vjK6M^#bZTS_Wtkev?_MBqR>`(~%B8iCsN2+G>bBciD|MT8Xrinp_Vo%XQD9d;s$#Q%J))PcS`OL=@Hm(@<{mnB`wo+EdTMU^xTyJc1Sc zRq`hXsKVq#U{7e87|&ZE(=qyQeO0E6dP%69t8?W)IUPCA!M}K3kX#IUvdgZlqvz&H zU9(w)=7u(O5R6{NfuB1!vyAZECb7Ag|1I5rKW&wT&ysbW3XMmrQyK`x@$rGsYil6H zys>Nj9hMa!mFc}7%do`zXL&;owf(1{RJVVV+&6cE6Dx>p6{WjySF@ANy=J`>%xbI1 zpBO%|ZKa2cP4p3j@Dz60T@?7EWNP`-;4S2mJl0d7Cm7C*UFsZ~jCD1+ttFp1#rW8z zaY?`oHkS?rHq#XrA-97Gd^7DEcrvKXa<+H@r&0zX@icH0X|R(g2b~IT1rGc8)(VrS z^>RT(V4wB$O=kdfWvpTxC%6hao{PE8wYG+*$@#6u_~lh|JM%fe1)xJGn1W%kBP!5% zl|}ts-t5jPGvy?gQ%t*xp!!LxCcrFgaOhkC!DdwoEUt3|gM$1jJ%Y_5rHTan{U|h4 znR%=|$ zTOQba)0yTL)l(9;s1|lLaE0n6oyRBch@5xk3fCY)!lJ?me_lV3!(XHhT`iSHzLE__ zncFS0HV;(7Dx~Y9V^v`E$(1RLmV=CWmfX&IqQ3pd+`TDB6OaENdNDqz?j*NNrY?6y zKQ(Z1b|qEyyCzF>LAqWpmg}wOOkcMs7ZJ{xzD^wA?v6_`X<~tY37=sLdrhPyF4c*} zB$_xq;<($#5dl9Xw^Ir^*g$DyORjlLZoRa*2r;SD7G#Oa0NK;m$vTUjf1JDhe?(n# z7t5;mML^tZ9tCEWFH7XZaxJHsSo&RPEZxT>69g~r|C+ox2Juv~K;wnJ_q0%vxv4b# z71`0nya$t|wHj;onVUWl^PU)Z=f+dH(bIJSd?(t$8#Ct@yFQEmwKG4CP1C%8=y=?G z$6I}n`lUpAL3ZbHGv_wHEw#ddwd!oz5L3(i1Ur zWz8tou7iOAcl$4aTzCytCQ?=6Y{_Mh_8KI}!48L^uR#1Ax1_q%L{}~W*@b~&x^rsG zn?-jD65T13?u_h59{rdi1*9ikXgRUk_melf&pG$T0if!9R3ya8ATW-CD%R)30yw$>HngQzN9-yBCqu?{f z6MXswpS#>^&=VS;Uk0Bmzd}W}db$e5R~2|0wRAenUl6M}8ntvn$F7*G6!tj7dVYjf z@(ty|PJ+&YqJHa8QXhej0?=8nrc$-hMcQvyDXqFng|in>Xpxy3`oU!(DGqh;K8?#! zX1K;Bl;Jp~x#TU4k*aZ(?6#M+-R&8mL@YiTi{7O|gEGOpyM2#@7l7momx&Jhy#zN~ zl}j;}Uun*KL|-1q9>u^P%oUcfNyx?*kowR=pW#Tt&;q@JqL$tZpu_d*!Y`*#H{H%B zw;~p>4`yq1jm#>G)oni@GbjqG$&wut+(ro;<`>m$cB`h)@Q)u+09evy773ObfrivQ zq@dyVf3(pMmeKHN>8l*Zs1kf!80pPv@8Mc%FAT>e5MLK33rLr{JQ6xeyiV7x(Bu+e z1O0HB$WJkUash@I3EDMviOFQ}Ok#3dXILh66)7%+UxVt0f5K_Di-aJ+ETLEPn4YiO z%+~xV?$}%$N7Qoy&ZB%i+_X*+xq^z0{@Gj*@`blGoR}EyuQi%?>St4=03&vl0KMsE z19Z3lT4GbC)iOdjqIN7+QF2&+xq_vsbdM62)X-s;)T%vxGW zou0whQ52jB#{+S!^=T$g<5{eb6~EA)uak-~;+TF?^AwuUkuON(&xw>TI{1Szv#lZa zm@EWPFj@6R$rqKX?~tW}!1LCpoAc6Zzeh5J$PhRLH4r$ z0X!^OylD!+V-YUee?JUSQWI;}^cLH4=`87=S&otE%GFG3#FC13`(-&c`hZ!lc|c>e zb6p$8rZL{ZSXniAT2fOhxa3BocC%#9!L214OYU}&TN-3nses4LM*ve63IipMa=ot7 zxh_l>`&Y|ai&Nh}z?wCxgHmPIj75}USHa6-H1el!a;9A`Fjl}6og5ue=OgGsuVZBg zuxEu2xMQN<@iazcy1i?V*tzQT#25_vy~cR@t8S!lA?mtF*(U%r-rCtP8JT$a}I z>Tji5euwvD%V*JYC|~1WolNb5Oo%VY6v%1uV%FwIq`j5j${tWOsUj?6d->OM%-YQ}i~;WJOBguIZ67ev>VD(+a#L$H8=_ zsLm97NVZnQ9(i2~|GjjZHBj`1`M!eZd~ad%gqf9*gB3UYW9YP4M3z2-O%-*aoJ4)` zJfCKg@OZscxBmwg3k1^qR;g`*ONgmJD^CW;N+92stw6MTs>Lsv(JZ)zSNDkoxSVPyDb z63ddgFNqAVAfhChyF4=dWpWow?lU68Um>wDnfrvu@GV66les6FcElvK)y!>z5RvV| zU}&FE{RMtlWVHkbQA^_>BD06-k$EEW=gA^+7(c`UZh01FsfoV?zHG$8@FmqDpP=?N zQ_pQuHhP;b8>7^Hi>kC5Zqp{}ZBojLi0w5!a;;s%5qhy8 ztp;5xs!Nr!*_?qzZ+cc=t-F1- zQTqkevD^I*!cn26w8I#cSl*BOAWQgq+{3k4d-=|m39PbK$xP!SEaT5zPXqSksgwk< z(%I>}Fet7gpZd*r5iNElRjc#JXr>Gv2D1E0TIzS5Er)KTelq71T|lfu<*lR8D4<2T z=c_~C)2l#<5^9JrmNYjuCs!hDvIQC79;ULO;ha2?J6&gD0xeOvE-Hl4*1V?^U9I<<|UnnY3T`F4JfhBNJb+*r8sKA!0TQ+d*>ENo#U+ zC990CN^0+SxgDm;!@D&9U3I4216k?;bp@4?{+!6L3u~#s-F@Nv)Qd)4)yG_1>>7<9 zv3YF&eFlWBO?Pw2_d-k56|lb=HC#SxPq|IjgfG(fWi zlb`q2rq6yndiHY?bsJMZjVq>&$rW*7CF$^`i4JS$K)(7b32AJkUXqM(VY->^Th*)e zK@cVvwx~&G3o1=;#ics~y|G(%y4xQUoN!g0m{pNmUXfdRE_y*`MPDOg;G!4!bqJ5# z0)iT^O(EzD+Rd_1XFkH+L$?1QdH>J{+&y&BPJjujgI_RgHOf0Pa51(EO^-qf2F&xq zkV%f}OK_BMj=Q`6JrYGYzsF^Q22q#@7#7870x>M~(UK0k&2Bx;r{)X=WWs(}MDnUF zQX=V%)%L>+%SYP}+}|ztQ0c`1=0Z7Y&KjBTXbW+jIM$=<#3>$KSH^E_jrfe2o#i{# zW1l0em#vvAG`gaV+0k{fI1*iVt^QrEe=E^&(RH)*Zxz3xwT*Hm-7txrD*)?QL>2y;us@GCF*U6$pbe&iK=Ih@A{p;g5p0`Z&7z#DI zTKvYH>%{9nVp^s5F`4a4qwYJ`>nSZ?8k0T{Cfm|gimMMz<7MiAHyDKxk``AB_OF7=F&S5tZ|_3TyEo5N3IdP>AL{OtCb^C?hu6Qn*g)a=SHL?Ddo>pmylwu7Sie? z)?R($dw)nvL2Qj-g3*Kr>D~;r?fdYw-Zo}Rj??qsL`h+;=(;8Pcd7ne#;=rgs`xd+ ze!`H7m+U|tPk|PikdIh z6Jw_IJj?krs}9WH$wbh{pP#?NuH4DraC%tZKT#hhcx;c1nveRoqUQJi;OZY-y*`Iz zEAJJe?=?9#njH7(99Hgb;Xp3??#lgN-l(X~%6&lMy8Z2tB;3wvh4V3*I&{Yj8Z)!W#grmQc)+x?xqTY29y3Eh%#m&v}w$_w#!^$)0H>H2F;WXQ@3^CtclP~^Oq zv}=KMIq-$=SwV_*)+?}V>>*M3b^7zNv2OoP0@Zp-(b=vWjK5gdv_ecC5^8ipG~$Ed zh>u46ys)r?vpuMjhz!XwDJl|NnTn#3LX*E~8D{3vL?y+EO3HbG@hTmRz%q;^t7@vG zo(H8KG4-R73Nnh#yu#$5XFVh$>@6aC5n=S$L;APde;)~azu~mx#+XI7%jic(9w3Ed zn2EhHJBha}0cImTq|C~R0}%;IKc+_nIEj(xG9oQYpx7v>WX&=_**IiyP0rv1ZA>%8 z6qN~GRL}oRWO5D`)l)hXnVe@u^|VbQE24U?6}#qlMnl8 zW*6^5V5i7~xDB9zgM~YUK zn|hk0&n|EGofTI~HjNW7lL z+4eq=*O_}MZM|dmYuxT1CZjQhM+$*8-WG#2Rr8G6`}Gm3<{8`mR9CG<)v&sl_`uA? zI|Ex|*Y8YzWM+qYh>`;rYoqzFkId{)r%8D_QyCesEmg0(yM!S(7RfgAo_y&iie7&- zRwk;thccr{O;l~4f$682^B9?@E7H$uZSs%mCyQU!oOhYhQKwd|nEnsbmdv1T=c(s~ zUgm}FH8NGS=Z3=m*!|Zm6&1wvg}HGP8x5IA*64}hjKD$b4Nhy6IRo$Cc#Pc6S1377<(L*%Muc*56?rH>g5&~VTu(f z2a;HPFn7LR@*-^JKy3DqT=t`GROZX9L{rQR%wZ3GS@H3Wt^Ro3KO{xMzs=NfL zPD>-waWG+?Fk#G|kEZitzTw3jfD5XdX=N;4MC154wDB@9S&7d&5yv+W**1F__Hrzu zr+9PBSD2=+kjtn_xQwdG6`gDaUC|p{R#mnk(9Gy^SF|cyJM&p^5v&gxtjF%f5hC|F z)FR8m`L??;LEr>wlf*NmO;K8JO-dAf(U$d^m?iT8b;oDGAeMGuz^08}!|PaLdW?n6 z%@|mWSNyCg0RMk5lXB?S57=x^m^CFikEjcCY&9Vw>8mFuA)H_&uGC&d!rM8^?9l zXISUSMzGNB%mYGloL9Dc$$OCZfy_#NE3b8UI;U3g7M(GVUvg-p=pLP8Ex-G&lpNoZ z98>QyIhK9H>3Lk=*S=4pXYA&;bE=Z}seAaPlHfOJrjj#B1DPfKmMoD<%6W@Ut>Bj& z<&tBq&e6v2a-E}7=jb*$e3E0g&aso<2X&5DbdJ|d4h?Dv2;!r7{5t+iS}Ei$I<=Tz zTJcC7Z4xtMIlrA#SLoCho!Z#YId!WJZ|8R)vxnb%KI2*yWK6Z8w{Euu?(S=fh&J$gpZSN==fZ^e}5BDK7 z8wY3t`M}wD>q7Y)S|;Cz;}gOY>#Q5}=g>TS4y_~*O#2+#mt5>A7#E#fqsAMU?C+o@ zP%5Xb`Iue!_&VGFxtxzQytc@IFH8M@Zx~>!nha`sSY#)YgzT?{>GOvva5B#A>HF7! z`HE=)VA5n+U`pP{@XD8<6WI17zlodE(W9>>ad*qK0AE}&ml?NzM&8+vD&L2`jQ5qE zh3Zr7jA(qm+T9+IRHpj%Y`zN&w4BJc;-^*i*Yx!uvTHr35^+ezmPC9Yk>Li9t%%*a6?rJ&n;BM~)9T>f8Qb78 zUNdxKd_ytj`b4U=b*5(KbM^pFqjKa*4rZxUlE@Iikt=Ew=dfSo-o#7Vtv!x1o)``cH+cM!NX$uE}<5G3r@=golE?m z;+Z^lA*U%=;_j9#OIYo`)~tMU!JawQq2_b|GO>IW>QAVSrx;}9)%<01Xz`CvLk%b&~p;?JS zXOAkB9g?Jxg`Tnuc)>)WcUFxAkJ0w9LU&L|Z2Pp&M5pf^_p5KxvflCUPycFizFyua zRO5veuEjh_?GIk8AH3x&C`Ezjp{8XF2%`kS0Z z1ETo~V>zG7*jml*LcRA-_1?-2>~A0p{vpkXe)ThfNNT0V8PwQ?bkTl$PwY|s5}vTu zzL8}(W|E4AjgibZ?~k&!){9yxRKrv=_#Opm)Mxi0@>D#q6D62a7BKYQ2Y@3Q-MjJE&S=rc(q>gRw7uUK*p)LG>8KH^oWMMpQ_E+Y0&f?Q)hXa z4ycQiU0%pNxD5F~8;5g)!SD3Wx=2F%=EU zJ^P}O(uniy4JU$u{Fpb}CN^78bF4oWy$Y4gpPFlhm_#>Eu$rPuYh7p zu$)Lsv5GCh*<%Q>M_46YfIkKE4ZZ_eMJCdC)^nTM0&qRMIVjy z_JQe9WJ<|ZPD*;e`{gmDcQuh8LV7dRUuf+}(tDn%a4hLPKCP`0();FP0AWjSLLOC) z5LHWW80ih|OiHa@E09Y(Bq}Mozn97-d-qxygE_DA!Q<~EN08obQK%nMdS|W}Exl(8 z@V4}xKbG{4IsP6dzALEa-xlBd!N@4S7*l*BH;*B{*Ae+4#5YUrptU23?^ILaSmHY_ zt*sH_`|6__i2p!*e{|DG@x2pDeI(-h2P*n##MeblqsTO-_`cRWhWHK;`60x2ygFSF zU~HsRD`|u8O{T)J#CLI8TO-8x+(!Vy7T<(Ss>{H<5#Jj{e0Lu%z7mxb-xCwryT2jg z%lgU@H3Z23(HrHTn;did4yyYF!Mm8hir zHYBqDEAso>k63`O&A%w zM0FXh9Z7z_XDS>^e!rU5)(H9i%r7+%|AG9TLDlKz^Re*YMEQualmQ^k2Op;QZ(ETMqmE+w%JbU>L<1W6JME*N!2-(}?^K<8O|N z(b|#Z_xE4W6^Z{_XykVbm>xx@G3EEJ zrZMFAYeaqs`OQ^-rL`l;?B2QDd*Kceg+V>{3e7_90g3<@XO#xt{+13-!PMn zWExX`U%Pq?`5hqgi1Pc?LRra3IG^3>bV0xo?B|Z=Ggw3i(1={aB*zqJFk#u?iTLLk&wh z3!F1qa9h&Pw-DywG#(i81>Ra&kh-4^k8xW?)|uf6l=06A>}%P}YI?B*iuTU|hc|TW zYPpU*1WiSKEK)7&IM7nZ7jkO^ilY8l&WYB}jAvr5K%n;~U#xga;E5ZL<2sofkJTGK z&3cFX&KJfnyX11cKW_>f1*Q~jwfohVc*r6VOi3WU%=6)oq*`2{fw;{eKdZmXRD#5Mkc$>b6R9~qiKlsUNNUh_CRB5ePK+w5<78d273eSz}|x%=Dw^)skqeKD`r zya(TvU6$>5>Dgc@%f;+Z=pIjc%IE*Ezl~&;hvqovq%RNcbGIMG+E;+p;+A9UVyWe! zLRA60gKyz`Ot}5oyzuf3awmeHEt0I=XOF=8o*+I^weHvN!CP%S|Baar%;=;vp}qm>z3K z(N^)tYTC-}KveVuph}ORPid^X%)H)M$Q|AX!k>nF%yMbb=C11aCG$JI^3iy1Bmgk~ z;3)#of$(v54MjU*_I^5D|9p5Sk#m>^^m>#Q8VX-4=lkk1hUDW%*V^k*Q`FJ)RCXJ# zBRge_i-u#~{8&y_%yk?W2o=PN&xd#O5?wsG>k7@cbdlRe;@md!B;6B#6_>Z5wC2J=O4a#d88W}SRie4nioEm5Gdmcca^@u&!I z%q$JdwwK;97Zu+q8cbs#78NxE$)e%{Rs1=_Ko?M%FwidydcCo91}ZQNl*I0-DFzxk z7VI9andiF{{fPJ{fAFW7{~G_~54Mw2^UrcR6y|RQ{NuIxXNAo_N2%xk>m%YHXOe%G z|2zDXe`Nm2*Zi}5H2+L2)%*j`EaxxG--e`h&h*pO%@!-~RR&)AxYOS_&#GYuX=Gd;i5FxHQ4&GZw) zSPU{5TpyLOS!4WsrCsTTO)rT)J6tu% zeUpgrQAyQg>Q2{5{{+}kYvd`NlrU3{R=3he(MjJieH*2d=&Ix-0LGJQiY zbrqy|YS#b7Q)i5+lTM;TxuTN}>x<^6S)=*sHzn!%Xcqib#oxRm@JdP_9c_3eT_4@l z2(KIhum7<=x~svk%};H%`Oo!{6I7&Fp z7_YjBj(#NLS&Dbc|1aK2jb~|H8?BE7UnyBI`lx&~|9oXyLLbTHZx#Gif+{R6d(hLL z!(3=GvC*r9>tE9h=_QPSOBex{_^(w@Ef#}XUj$U_j{WSPgxE#X#g0P8Q7@kZ`2V!M z4}4VBneac!Op;5OFrx$r8YEy;EU3|7O`Mrn*I#i_j*Rc#}56 zWt4Vp>vpv(OS@~|_T9Q`Yq51TA(((#L~#|X)!3pvaZqEWAxPxD-{;(!Bq-hYefRzS z;4``Rp8w}L&-0w;Jm)#j8QL1&=AYAgA}^BGdSZf^RvPMUejicxGGgY2df`>sEwU6D zti?>SM&0xUP8U-`JiuLQ%U8R_Nl~>R%o3{ zxoe8{U74e%jLR6Gj+N$eXGN?gZA(#JretZirh8E8w@ErTV z+^(qI0!8vvas#&h8;`UgZh2-vV8=zZU3N!;|)8O3MQ6;tff& zqIpoVSl;&rVm|{JTTABT1v%Gu3`&?m_N8 zPsoG*V5gz+O=|IY%6l_r(;>NPR#1<>xaDJr@5-l%cezzJC&Ae3yENInOFfUK#JA`M z*1M@{HK4;O2*7xxyEN2?bT}0A7a#zizpc)>0f|*k9Zh4jJ|n*f{!_Iyq?|@^>|?e& z-0`W&x~VR+WOc+>a+%2~4B)Rp-@g46ql}@_LIQXM+A9dy#?T08EkN7;nt4~EOS9+7hCbyjI_`fTJLF_6z$ zs4b0Ejn1Rdo_<8KPJ2edY!B4aUOg5?}NNL*FDM2e+c>a-_zHcyUr+d==*Q8O{!g&OuIH6tM`!y&kk1X#Y4H2VFIKef*HzQ6;!_gfK*= z`EB1YB&m6wy%>Z0gmE(W85c9Gt~2v&b(J8FMB7WnjGUa@&gS~5O*jzwv7~5*Y0?i^ z$URM@!K(W&qt>`pF`5c9!Ik_AG;@2tSjBM9N9cfk7{0zLa!Kef$@^>f)uI!U^VpI> z7BKqaR<&?k9idMG9q-VJp&ld9@q1oEzYnxuJ6QsPk;~goi3xFJ>$omNbeY<;SPG;U z+7XO8N_f0xsK+O{#KbvLF)r6NZmxt?^jNOPB-hNL9;iYaQ^zxhdQu`6CT+E|)!Vd{ zF2INy^YPlPI>;~zpD~Y$RjwN0TRX6&n0FuM>H6?e4xcoTBNLoaYdTvxXO@kJrJHO8 z$$+Zd+gjCF#TdG320N>QcO9_8O}H6N^uTP&0XTv7=OL8FIaDUCQzJLhFol`&Oor{= z9n@HpjLcEb*Nn9~3A${x|FkS}nL^W@ z+1D5x1;S*K4%|){mdS0Wq`h~tth}o2V|m?l)^Fr7_YF>JB+OqErmxvxe4hH|N_TF$ z7EXfc>wG~=Zjq_Q$BwYVJar3wVB21IRSbCZ6rSy5gyc?u?12FJ^dx#4#p!jTlu+Y+ zLzG4ls4f?(^QoUx4N9x)bmc22QV#`X3;C+v z@6*{I$W%b6#E!=NOk!Gz(O?j?PJlsP0fRjLDj4pncERvf@}Ch54Kzr=Af>oqSe9s_ z21AH^fWdX9z+*4y!DAnfQFv_Ep9zqpsRyVMkW`%plH*nM%q`^%PCPph#5sx_#bLGof?L#YCw7Y5St|b08z&jAhLOGvEa0s7e}`Ub z8FiTyz~?g~%9S+tbb2{oI*_E7e3xF@T~C@=?z@O`|LKS#p9w@sR~xDFGl+6vIfc5V zoB>fDkysZ|gi)P_DDC%w3lAnKXuEF6D588>B1efxz?>i=d4-7N@mGoHYS2?)^H+&z zI?WQ;NGUE6Wh5GUIuZTC1PCkk`%;lY^3-KgXuI}uaE2i`D^Vp}Lf12X2;TlS zJ%4cwJte{D5bTr4UlOUoBG9^1gGJuJPI>%Q?0kT67wnWn9-K-%JZ`Q_0%yxo7dTRm zi=SU61d%)!e?Qp+t>gq4huz2P?xUZ_IMB#v0yGoU<5US~t~zZ(&6XnFQqBOHq3el7 z5zRs+8}LY7qrHD-2hC$gjC=Nk@v1KfCW{#P88PYRZ;^6TdT^%PCP(3b@<2J#HNse+ z{hia$H&1FEm2G7CIu3rAOaN*x{sH5jKcx>OyEGK`XyCk$Q$G#kH1PDEuesaCQSA-a*oxsNgVIKoW9y~Mf;y~ z?lMUXlr~Qt5Q^laV<@Q@NF2iyHQ787pQ}^|*+)pl$2JW;Dcfnhl@eSS+DC87ww8+X zNk1`-JN^#GHJpv40PT)b6CO@_@C&exC~6IoOm66QT?1qUI=b21z`geohKz@DA4lEC zp!+!HK8EFS8$0vt%<*eXk}Rkzo{bod9K`m3dY=Br*uk$#M67t+&(bS_4?%S^Y>Ai= zO51igF@yp2I~$bbsCpi-WC4D2$7?7{=Cj_*Bb~=}B^oyp>aHD0OM!XnJ5rhWHI_9< zqk0ti2~eV$+nPfg<{)v`JT5DFb>e*)GKT`~#Rh3_4t1Lu_D$SHX#N{H(6ej}kM>AL zrAUU6B1Ta(F)F%P3RtEtWKej?lOZZm##1mFLA&>)^hC!dsc%c7?Hay`Ft55@@U?=T z{x{fKH>fAH`(@DmuS{(}Ec-NL+fK+RW4n@^&}=(!<HQ-dl#p2}kzf=wFG}R!5vf5V1n06fd4sLV zjjP8c8q;nqNuePl+5wQ&wj1I+-V#^WB9Q z--(6TK9J0n3kbWB+JvapjnJ8FnEZ=$3Pl$wAQvH3P4l<0W%>Meon(6z;X?Fjb?EnzO1Q^L_;Z-v z<>>>prRt*J=z8-ixJH)Ht!GhJ-U{IxrD`s5@f>+CQUA!hu-;{=gLZHSPd=@MtV2%+ z?s*unq48bCP23L(1W6zIZJ=HJUD+!PDk};dG}G*be!b0*R}p$zSCti8P0S(lwkR=Q zrtBiMUs^*Yq2J=$YoS4RD?)qhSIw|}mVKReW0Hej)d;N;HzrlS(0`(Az1~Oa)aY4g z9XaTaF1R=w9meT5iCfiW!I3M>7|ZnV!jgC8B*z zRsZs99Z;GGNKxOcbO%81Z%G>M56MJ7DPCfR@DU+_fE+z{ty<%T+uQSfgsvTPgd|$y zhQj9xyVN|AwCy#B#{Wywmy0|H=2G{#03_+d8$YdowvLwKNkuNu94H(DSF_O<&qLxU z;5Q#X!d#Sr=#a-VpWhsQMf^(mmGUd&SHW+Y9nS9V&%nnMXpy=#Q#5HMD&9)p!+v{C z=mU@^+ZHG4;^;Id&@LOi@k!uk(B|9qHxqg#(EdlkURDCd*UOcRi^i_nMD1L_J(`om z@p*yjE(M5W)G6%i<<8Gh2kcV!e0AAE1}e3&1XZBEW>5X=;{=SZCFZM1B%oEepBnSJ zQJ}qUl&aJYTtM;Wa%K&8gVkOsLd22b&{OZ!$5 zmq`=E0U2YYV{+(jkS5LxbYvhmlMcy9aAX=4$$%OnDeq86wWIfZ26k3%ejYV!CnXB0Q8FNdsEJ+6R)*JaOzUNfeX!pP;U`n~dnE2&WinsW?Dyu#ao6^~b*E543Z6w45&%Cqg!_vUe2bLeSA^jm)`tV7ibfcdDl>cB(ayv zwn!e?PTLmASNBK?SS7yN#@(Ey2P4JMwL+6i{Gr|?#Za^Mweo&MySm6z7lWZXg?&R%kaPS_P`>&H zi6swy{I-cUa<31n&Wf)0N7o0V>$B~{(zVbV40{2>u58_OycfeZ=(kDded*%6?_LS- ziri*x#c$tay<4|+ZNjBtFO9C&B&M!`G25y}0%w8N;z{OPMysl~S+Jt~i!nZ1gSGY5I_9Nm*gw zv(p#N!5trjFj;)^)r&j6h0#^wh_7%+7+7(gVNT}OK)oGT6zH&pH~`V3DFbtO9ml=( z{^94(fX@ZhpmX7ia<`^vZSq0mIsD{sNEyEZe)IVi*_Yc}{8zk&{V)+JjE=q%InchA z#ZV1(R)Gw3Dl{BuUrJDDFj8K;+%Ol8$Mn!1u>8dYmd{gHhiL5>md}%Zk00^^^{}J} zGhTM(Y4-{gsO5~0Ean~pX236x4OY!(106wG{oLi(hSB+4wIH8ja8Uq7Ud9xXL)&u$ z?FMU9aC1IjTv=Re2)46RIgTuGBUjAra4ty}shAA&SYwMm-PjU!Qc_5X6ea$|ULZ+v zix7KwjMyRcD@O@^p1Ml%NHk0r8ax9Cek>`Z#Qk=6l5k{6>+(O5FTmy%^dgU5=Jzhj zNhuCPXk2+``t4`Op?+i@3ElhJy9Ic!CH;7gMFM-iMtX$)spAc!$O60D_U+OTAR47BS9VFtP<*&D%5d@OC9W~vsS@7KTm&lEwk0S5c zQgN@kiGLqieF&MmL1k z=L#_jcV@oCENI~8u;M1asw07|WW4C?7lc_$XCeB+7o#{6kh$J)dHXz7c@;w`+~4Kx^G+x9 zrzDm<@b-TdRi)U{h zm}-Z87-ldw(!tUwJeXJDP<(@7&d@is!VYr+9V5bP6X1R{1+>2ol*$p5(xCuf1_I-p z%h~n^VT=$oIyxO|=qGp`iT{1VzaSlP@ki%G8-3A617IStg#H3xurYbhrBe3} zC8*WDHuMQpn;)qHhy}$<3^OZsgI`v?+3H`e(W~B|I7eJcJ1F%WxlP>{O{WDoGd7@H zX+gQqDHk@O^Jf5iHh3SQ2y}%@{i^k6nyt36s)BOS;4@>58s1l(g7aMHXp){B=e#M^`w`aiSp$ zHRMwn8F!e*#)tdvWjzK}0}m#2@xUym2YL48Tn+RUf2`im*SyY^`IFgsWPoG=@+BE4 zX6q7RTgep-v-P~tE0IiD0OhJ!A$^lrL{ceoJpJY=+$;;Dp0CBx(Gv6|m8bscat+PP zNswJ!K29WEBk#8h+P_EJXltPTRiPhRK5&b}5<(|v5k){Vw{klysh(Hu3^9)u9(Agj z>0eMCPTFG@+N%t^$mOI$`P`_U7)y(3o_BPN^OCEOF%b?eOTE9wo{LUsb-oeVp#9d?x;^*WEeJe_0W3Qr z=O_HHHu%8BsYp<@s>ZDbh44q_pWw4W?jL+UnjscxOAK`df_0s`oHUdsq}XGg-52%? zE8{hT5$br){9eP_H8<5KnS+aeo6mrM$dj+t*aLdiznYmFrp|93zXE>q`IRd0!NCRf zuaSLYm43D7CmMMwkf=emIh|{A)CYG8$^_b90x|W)g`+o9YYrKt7=4W;dNYxv`BTu# zF&?;vTDe7M-M*fzpiLee@?_wi9Qj(ApS#T;9B;te*Ze;Bxo#JaXE^kZ{h4QLN$~1G zhbZx56)B--1KYI`*zG(-PU1Z#jr! z3^%sF)$0xFIad=$G%V8=PUsDrxeLA)_BmmL>AsQv>Y4N0a6zYGfJT$o^*T2+}R+tvk2xx*B@&z%c{ zp_7aPLf?cs^#@=il!=%X>RH>lI=`$z$VEU$FuC&}1e6Fc)qgTIY>LLM!b?7j|M0tA zpTV~kTwg^`e3T_-e;)Pn2spLePcwoZ^%c6ur7OJadaidxX`^A3%z`~lMq}xHDC%Cu zh|RiX1jSubifTqjQePj>DC{cjv2RgU<%rYdb*7A-?X0zc~$+l zeECklWaBojx^*@Ov=B?pk-qTo{qJ#8md7#ujydd@hHB#8Yl=pqwfaA?8N`LYb@l>X z@S2fmXkAoSwzfeROo`S}A4QJPj>4`gF6cE!95dT7gStdRH6j69d-I4Uiya=}lHr~a zM$BNH>Gm_?=hJ6Z_zZysPSl+B+0J@DZDM)utPjdV&2o#8o?A!fSGTno=Q9@O*}H%H zz9%THOd<2YKhaF-SQk> z`bRvGX`_Q-uQ?or*=lITC)mmI?C^6p?RN)oM1$D~rO9YB?=WrveV>6o51>nb+TEJ< zSlk*3kiM@}TyJ75Q5tXJ0`0KhS)Zf-X6wHKH8ZGR8304Qdya-a0oLYxk2#Sr#zlSf z37kXlQ2&pGN2(eHoa%?rn6)=ohDk6e*Zyjr(@$NA7F#WT4`Xe&81|ihdu`C}Wmu!8 z(OhJma?CXKH|GJU%HZ;t@3ENADz5Ogq=hPst!WbL7l<)VI)fC{@~l)-nOz>e+^)=t zri7OGSqu$sN>k@j%v#E5pb%;nWYLDv(RB3}`eV21y|8kh`V(K#N94=yZRk;lM3SWbZhdCO-tXmYl20aD=b2NMmMRRFi_~>!yDq1;Ahm%O9VqxVXm1E|t zV4T!#QsO>48Ekj&?|BXk2gWrrG>!8<^yp!H`Rg7JBH>L!JaBm5@r9gF;I<|~1<*pM z2~HnP-Oc>!>5(B4M&5L)aXtmCb2POlq-$dGL0ySGAA~FlkI;LX-=ec ztNBs-dv;?ArQ2nX8mg2+ot2Lo@t$?}B5(>u`DqLwU1y_^Lbt!gCl!HsEByA2{^AwL zT)J&N)hm8;AIQylW%otkwA4U0XD6ioCKzySotibBdN!{MEy(SL3^LSD1&f9mCckyp zoRq+0=_r_usybzB7T}L(+BZ}L9`h}<`dL*)yyfx3fyXA5TPH5DUx=hxC+3d=36L9;=i{(zGQ8KnR@(i&%j1F?Q_7^sH?8s zb{3O*u>Hlz*S6h}(moWav5(8Vx-G-%O({AUnT91-*0yx_Ba@@gA2r;x7W{I92F-!k zR%hE6Q`?V3=15R#QNQ`*wuN4DM&9kgof4$4S>EFd{dwc^$2|rD!iO7E?E~He+-?69rF3-F*PGL< z-e9tX|B(z#ZRl|enwur%?2ap@Xx)r-5CH-ykH&)5Kb_ykpnw2N4cfI+>-8ufsd`}O zKJ^r7jvqd^>-gdNik_zI#+#+2Ux>PgLY&Ir=1JhnTo^{B;nZZu-_wOXPdry2*x{p^ zpC7S3n!ES66@6*r?fsD;e4pxwe_iI(__OLCz^&(K=Xxon4HWv zM?&FX%Ve9956}lMn=`QA@R9i2ec}GoYmlsavYA5qbqzU=c_cA^z6DE`8g@tx_mNEf z`Fyxu_y}w*puWg^pGPzTgfO~lvtG?g+Q ze)*~I(i>>IM|0ac>v?CW+;2tZ*Q$3fKt#5O)vtIun}RBvCkZ>cTGB`rKie+Pg%l@N zsR{uxvtqqdc506 zF^#!Pd;_8_urusB!#+IscSGIY=$he3iT#Fsp!;N+o%>+v02gt*H8bYlKU8M>T2bab z6WX^itF<`O^g7|;g`vQPk7SxRXWHT6f#+#j`~J=EtJeTzpJytc);?!oH_xFZek`1{ zGV=z`>X^o?%3*zb_uM_+Zc+C1b`Ph;ayz6#yVvTU8Jpi_d%NFB9V$zw-lnEhnaGc+ z`{%fQ36F?gNHEm9FFv8QNVmr*-({&4-K+TG~6a0KibU z5lI_*+86QKOOS*N+bh-Zi5$~AY4QbjeN9# zkE4T=B<`z72}&7i+DsWDjXx~pAGYcucfd-;{{bJ-a=)2Xt1h9u z6jsLdg{&d(2A#>*-c`TFu=+1(B@%qti1>&0`pk^J@*L?~9q5`Zh`9M8Fn>Q? zwT7L*ce}5%yW^A8GVo+{I9wF$lK#}9vyw*UjrAuj^yhW~^em>eV439Dq+y2GKP6(=$8dGYtbfP(_De54HcoqC_CH-Q1;MEm!&vGo)iGuJ%DiT$915BfUxN@O)CPv z8<`O19uD8Y(!8`v`uVAe-25Q-_!S&EHDc;qf=BQ29{*A6*+kOZon z>v7>ZDDZ^1G)Vgeq%WWo65#y9xn~0D^JfO>D`e6j{gvbzQ;;kWwAwi7_+jr}tIOBn zxzF}g^@ygzXd95IOXN>Siks}{+g3Yon7*44TboA4U-S_cFp(k{=$zS|d88N?tbk+um{R0!k-RqgR#@67jbk z@U${f>96j7!@H*`Wmg3;Dto>jl0bXE)R)ORn5isNEhl*3w-U6XP--?f60&PEl7^aj zg~zkYFIk_>lf=!Js;0~JOP;!v(IaFU$Dj94lh=9{IcWxo2fia^eSbE8?nRV||Bzbd z73-+2UvaV|NpV^;e_6OZ#|)}&lceiNs(NTZyw(~{HOm^eQwq!V4=$nq>=1wh^N_A~ zBh)%m=8(Iit2UCYt|wc)GsQ=nt>r!kP4F}&cZ=0CEpxS#*EDG0U_b|y#%>vDSi|8< zsBBPB;z>9fi!A5}$pj4^gjl>l+81bll-i>$Bj|ltM5UUS?`#Gjp}q)mU+Bhj8lzJ+~oP_c;vs&<94YLr$W`)AN=EZKpw+RAN z-e`*y9GRS~GE+zE3Pqeix{05IAOmGI}T`5}FKbe)8!QecYK%Kftj_7G+Md z7Ub}m0>octO`_$%8ZtIIbkmvg2taj}8`e>G?G9hdSg`z^(%+cNYh&SIEa-B8ux*YM zqN|va&3oaX3w3!0^>-{hNIJiy3m+>C4;Btauhi<4%s#!)mf{-r_cV&Ou2Fpt_+P`D zd%X2&8G}my&Rkkq_#(>b8PS>%R%*bRH9ox_5KhEcY4P%X7(_*6>Qj3uq_5*JKo9cv zRm z$e3AsOPaju?kULE&pn5dXLOf9mY!^#1Y`W>_KTbr9;W6hR{O9^xC>}F%pkcd;U2qk zFrg}|7vW3RW#HDA1Z7Lzco?84)&)m+D1tpyQ`P6bLM$j2QtfqKijtY%soI zRI5#N8`a;$uE;lJdD{~6Z?enomGAo6n%Gy777OhSor7x{P;wA+?dA%d*BTTV zz(=auYPDN`801IGQg$zEnhzNa-@VbrXshlu#+O58sb>DY@$Dk|dE)1T7oyJ6OW^nv zskaHMs9W43*XZEnYQ9F6oc6``!rUr*VNR7QO(bGz40{+B^!!Ib1CwLnkyX}$JOoCs zS=!`N8CMHdXo1<3S5OynnZR`QZTZybsu0InRIqHB0TRbE$#!lrkv-f?>s*;jS`SBfn~sxwOEco$$(EH3fdcu zC~K+Jq)L-SPGS`t44K)Hbs*u^w9uWt<}?*1FJgbc7c&y?KKt^h*`E*}tSvrIWJ+|S z(ddOaR1@z+Qhe$LG6<;S(_ypf%XC$NTpww*kQ*-?LdH`7GdZflQ^?R0gl%;k- zYdt#I5%nZ;thHPBVXI#~!k61tLv+&x(wnPE4cY?6bM1;;EL#zu&XU?!pkP!_3_u#P znqMx37Iqbd{ekatd)_T-pqT1v@zs{%?UjBsqXY8U*BSQwD{TKH?=#+RmVl*=rBcVs z@F4qDL}x}mx~AW{Ww(b5UZdfC&ZeAL_>n4g_E8zmXn3#6qKS5Cb2QwgQsuR^mHtJ; zPpD%Em(lgj>L^b!BJ7k1X=ehKj+u*ctr`idPOYLiYj3u!e@QU#b5hELMLDuIcgNVg zoL6fzG&M)UHfQIh{oQml()xWC@1jj5L9XbO868gqp>MpB0SzW*!J-?cUrTs7Y_AAL zYhDtQhvz~o{2TLQ^S@)Sc_}vkQM-X{udNG0<;Gn_vBfEpwC14g+rvxMiozjOVGn^* zvSOE!9RW%j=Ik2K?tb+m`}94F;t#t3w8Q(NOIY#kRTp3o%D&AwQ3 zv0ui4os5k+Ea8dZ3#k;jR;)%?3%zVepqd2z~N~=}3Q!N_?@cm}n%&ij{O?DHg zLlUaKKhX{*>Ji8=6dvAKTOGQpc@g~Zt_9fXV5QUD@AG!s702jbx?qrb0kt3nlRvg< zkRl5ACu=j*F+DHkT6=RG(O8UFeNyO#pWU<;c}|N9`GT0G25Yt6up@NdjLIY@v{3l( z(@=%1-P=M!5VduIj(-9=);EIQr-UK`9p4iCSe%X2oFI-Z);DrJ=0+vXS**>?orZsM96DK*#0e6~RDwO|D%!uAWIc zn5xoLo{(;`je!msKWSm0V`#K-6E)=qI*v$)c_bF@2js^_LB5g^u`7=Wz$^Qak^F*x@GoW|4)Mk|kQ1(t($k+U&3 z+VZ;k0XQjh@(ic)s1+Xc6^D=B^(KOyQ>jolTP@0S*Kgu;Wb9hlM9i}*UmwMjYSe3N zIb8)2(K80m?sM2Ap^06|Cf>akVZIeXJZdPc-nHZmjdSWW(o8o6`bjG{oQa$b-&Kp-@e=_h|& zlv?Mu5V-=oj2>r7KJpL3-A-9Siq2sYi4cj;*#rXVuOiqyO=xkg<&ldSF<^^#AmQ6ss1aZv5^MypJ)at*G#V()cel2&u=DS~|?pKNXb%py? z=6>b7Uls1xRQGG;0_m+3n2TpEvc_gV-4N|?j<|D^pG&$9PFq@^GL`#4;%DZ3vyZf$( zRW_c^mr;dLW^k%g#;!{JJ^W1M@G)gVk9q@D6NwBx?;?KI);0c&VQ{9D%D~`?Ir3He z$`aliA0oJpJFoAP=dL_TJL#;I4@fZB+#=3&Ysh(hQrKSs|Y`)DCnJ!|2%H-3jy6rRziGi#|47JgCP%?dsOgo>T zNz7uCC5vtaj_1gKHb?->)I8 z#*Vk05FU()GsEv$q2`fdO+BU$eqlCJ4hB4K8g#pNPOz`52>i;oFutKk<|z6y1^S+~JE=PQsv#85EJB zcp=PR&#kHZdjh`-PdYyw+@I8~mtcPvO1q7PP~=OX`C8}@JY8j%3jyZxniEQUPACOD zdlW!9n@ZHT%fL=3wqPvD!9XJl^A0xPfMT;^8{Gr~8k=+KGql%%_}Fr?%SN_VL1Jy@TEp)`t%2kizE+ zd#ydbwzoVfDQ#x%1@ed-k_X#qZSPQYtGSnL1o)J_Xr$DpWEg|r^we6Tl9(h7?B6N!0QE)|N0&X(SnX8bkfXXepQ($MFyfW z_n7|BN9M#j)eo=-OhPPIBZ41EKB8;TZ}tbiRm(f7g}3Jb3EfWGq-F`%~ z6B>ccJe{4*4L5LG?pv(BU0h;JHi zR?yhuHT~vn3ieX)SgCcR#g@6nvP{L2^2^0DL^~2$TdS@{DI=?^j<>;8^w7&VZomql zMYJwcE+VccQE2VyWl_qkL@Cp2)iIRsvYvSo$Zk4NtB&wp*j2B}SRVE?ZfCsQxrroG z8=Lt=o{{;9?{rb!I0yA#*RZY0P*u8SUcPgoGy&BC#yaVwPIV4iy*}(wj13<&^z4kF z=q5D7Eu+4+?(sZW{ZsS#gSF-J_J?@g>@u&_$E8vcz{q-h!+QkHYyA0TAkp{VbetzW zq_%sX%H|R%g@N$%ujDMmeQ8p zMf_1I@Q3=wW%6An-yaG~(W9OtquvrUXGL}W)ULiGW9UeeT7nUSc2-{?;8Xv>dL5fN zZ64@X1r!M`_cW!5`H-5G{0ufeEM2T2ae`pXtHFZ3QijZ&NG!GLGU+)e4b&&vn?|hn zCy07U77n^m`7}z~CrqY2W9q|YKn3pIs|uwhB&OV7k+!~P=goQuYn!qg%nZFH9Z$#a zW`^CnOJbUQNI=={QfXJ|yMXz;CQO{KlsMITT0~mYIjb7jQG5L6J=hYZ?Ud9}f2!4; zC*0{o|K5~f^Sg!nf4!b)loQ?Tr+1%9v*-U(w%236F5CA_5w%77@>-dWwI^?3+s6k< z-24JYI6dmC>2R_IGL)W3+Q3z%$lJn+b#-j9Pg~GM4R;3TcC%@3bupRQx`S3%9{5lN z0CaL|IJ;${j=oJt3;X_5lD}SJ`}qPgH~GrXmUxSf9xG8N5eWoyPW#HkP`vD}Zp$cq zt>lZ?G{E#C=ag)S1WN7d_0ATAns?Y{6I?Fczl9z&I751FD@E*g<%aH3bg-@ zXW+>$Yk1{dcSQciQgb6qEHyn+WT{D!nHBinCBAsgNT8#Wm!#ryf1WmKAl!_Mh6M*K zk_>g1nm1efOXFLHx>L#bAPJ0sTq)V2ey#Kyn0TW?M7GfO7!W6h=hCQ@DznQN(u zk+Ut8ZeBR_beB1+ZNI0Kv{x0c88)*qRi)J)_8Ff-UvfTS5nthp@pF>l2Xxwrl2MV7 zT9$0fxVk6MaUN9A_#^Tn=*eD=I=qmXWFL#Y(6cR=S;{t6wv*P*@XKK!?3giTHlnL? zIc%owA=F(gj;t=DM{UwC7|5vGcoWq<_Hvve@&83|FmhhGb?TB0A6h3SZ^*Y!Ln!0E0S$jF>uGXm$;}3Y}p{(@r4PMFveHw(k+r{5j z*|Bm^c+MLNp)&x{v)+YoJrKzCv!{Ah#xKB-|FD<_}|;Z@h@Vg(p02OB@$4U zrbXYRM2>XoD{Fj+jZQ&jb*Pj|s71$`lb!kL>OxdPZu!yN^mvZ#OCO^Vw~&%_`W8AF zIU9qX=vsettr49WU7Ks&5Oj6WsKqfYQavcGdTb4aC3!+TuGJDV6vGR-*GEd&>~!}{ zr#7Xk-xADT&am3c3$sCeB)3-W=Di*wp3^F`jhX2#vgstJq-xc<#A-_&+ovsctatEt zSReCqPOK9hg1=51($-`2BX;kurO7@Sq@za|=ru-YMm`K^VJDj#=ER9Gf3=zi-ijC!52&vL{yxtHIxZ$unjH&{Fy+T*QBSpcLGt&g z8%NWrDqgKTF-TH>PivCv25fR7GtjtS|m<|Y%M{u=7G zBA3be)3d77tpaPABhC~1yyCs~&8hcD_FwZ`M$yNAuHI3#oDXSl9ix^(yq!;Y|XhrpJT7Bpx)kO@2DA)|KAp3m^ z1`jfK^`!{{BhH2(R zT6!}rMeHcCpS3l4_`14Jq}l$Mp1^p)hSRht$R~ zP)fcn*Nv@9qT5NcOa4RCrZy*ymE0Rod#a+B zMZ*og*0=6%J#qJ1b3)rQo;+5Owf;7?qA1tQ#@bDcHT@WCy2g$y3hhZ1)D?J)tI;Mk z^k|&zhvb73FwTXqY6hwmTWqg!mZb&l0fr6OT_Dx{8cu?a3uyvvs*W(Wkz!CjBRBFX;@)nJeU!yPD#jEy#!`*X9U{~qBP66 z(V1W1Oj+j6oy9IDHKjG+eIr}-4ULZ8)4WCt#188AK>HkOs#3opNU&_+T;0H9b|57@ zJXChMuN7|!1c8ge)=(zSUAi%1@wFO0j?iT2*SwRm$x}J(-50`=R*qOe&kP>sAlp18 z=LFh+%1237WMZdxu@eps+{5Q}#g)O0oRA5Yis@{+6%MAxnOcMK^`vk+#F4YGQ)Oq2 z?@~e>KrpDVT8?=li`*HzB69Y&uv3y5ncC~kvICuEm#4))7h2;tC$_dYnPytAH#2?? zOE3=SiMV-4h;naG;vznBET-|aCvf-mV0#=eiWE?4X2c?NbW-YEId9LNnaCjU3fCUj z^8*O&d$0dr5}LO47%x?f654Yj9V7`Y7ma&@(9Ypiq=qvS+E=yhh&qbuJCXifUL`$* zR!Hl{EE8QV6==!%ZIlk^S6d9!OD}kPL#H+wc<{KpnPEPz9g&#X-2?z{`&e0{%W&El~Jd>i~$zt_9Z$?xFsQ_#tel@PsyXBVG4s`%5)?;(EYzpyR6 zGlL81I+vtuD^I1^&LycywXuJVL$uE~FOc_^UvAGq04D9Fr67n9P+id5*S_LK5$Iop%o}bNFp5 z_n!Yk=Mt~=zJ}fh8hZaeu4rjnBF)%Xy`O4*phux|T*@8e($NEYm>9G7z19aZvVps6 zp`~#-D7%?9wDa4}?>>GH@cR+JpYeN&AF$2^*10@$cw!WEPc~0(&bcSZQ{w$RG55O1 z;K@P$dwe_*n#PZf3!}r7*UxW|pYNh^V^i)00^`O)f79D><3Qg?TbeNA@;NU)odZP9nDAPbuBmd z7d~Aa`vnZ6&i;=_ctkrMlD{qO(aP=7%1&)*-XwEP$Il3_wjY#-Oo}JdYGqb*&weD1 zU=+~i?55NeE1X|SGIf@=Dhw9xx4qt8dc-6pX2EWS(Uu+2%KHP~6sa1Py+2xcpIy0Q zZe@Ec{6I)IY2!t9%?>BLW82vaTR+ZZks0pn^<5|p{@ng9I1oXc)N?|f#V@xAeLS(R>)td!MqUjO=B_K#9tkIEZMe_kRz zbJ>?^ooHP0q^UEdsg-R1Z<^fHzY4ql4?|)9#^iaAz|SlFoDVnqwcVp$qoOIl^OmHZ zb;+p8-d@umnxQQz3(=8QAlcQ=Y8k0k-$UIi>wLX*tfb{AHCPgy&0atg8w~~E^^Wbi`w3O8pDCDlSrlBe6?KHa+mz z3qyCiy-KH_rB1r;Z#)oqZ2wT38{s9?NiQ8}1WDYYJrqr^2V~CxzKa0vg?JpV91;>( zi{F4kr+9&24tR6xY)rz%mi@_2Mx?f`H*NbLnfqOf_MLKUBh(kYay@a83_xNZHdF04 zWMjK7W)8zhdsK)W4J`Q)boEN4O64=a;s#GpU1QY+l0N3YMzWA0Q!<1{D(ZKwq*(B8 z6_137ykf=99n>#=Y3v29vdn%BwQNsQ>KgMB=M{Sp_Y;21|4AY^5{ zzbWe_FK00Ese%Egzp>y4kkN{RuN!uWf4tkortI+oqv+2_03EbD! zD4PT5DU_b~c8Q^SrGRC81N!W2GS@2gh%kz<| z#=ayMpll7ZX=3mVvb;oktJmM?DFvZD)a!iSd8N_Qin3V0I-6)xqVWH;db1aYW=KiR z2i7(?x{R^dH8+iKgr*vZMlJjuW5nub(5_v%a|D^lex|rMk`>D>wYvSW+#iIV-S9!o zR~qx(%~?|)Q3w%YReLt5YS$YbuSM4wfp(!a>tq@m%U?8Ljim!4!edTy%Jgks?DAEd zgg(y4@cjwc12|I-GH7~fyjyHJ1#K`CKm%5#z6Fy2+ra>l64!$k73~{QjN*@uU+LHQB zv*q&=rdW{y+btDp@_L8$p`JP=_ky56s8d!?(?T%aB7LR=C1g2r`3VgJ_A zwM$Y*nj2TT0ga{d-1Pu~V)mxF&8~;|f@S27=6P81WHtKTfL%Z0bEo`)1C}@k`8y+4 zIkKY3AFCY1kvbih3mJ$Ekghh`nJB+@%+G?*eLvAAI?7%+Lc;SgxjE-2jJhW>i3iHx)c9{>Tby`SY|AN} zEN=M(r@323#Pldp$Bb=fNgXdnZta|gz9Ui5yYaLrpFUj|2R+={Y?3DGdy5?N@sn}U z@jbe>v*oF)>x)j4P3yHix4JLAOHw_fA8UI$6R}AMNK@*B_rVf8wbdLJ;hgtzJWw<0 zc;qlAvhL>+a6aP~X>S{y8KRaMNQum)zn8fw&A07WNoRi1`lA=9aRezvCnLpGRy@Ug zPqq_oYFOLjYCa-UlZ6D@g*_znA@90{MBGTS4c*k>c16QN>ikC+An8efOhqT}4#4XG zWF7!HF98t03lMW}bXq*8?GFz73cO9?jS6{VBU_h>(-O+{<3xgf`FJ;n=tQ6c7g*x@ zPPaM^J)kAxv3T1WFlVPV(}#!!#fJa^qrRyHg>#m9hndwLaVc7q>J`Fim*2oI{WxBA(1 z!MvCW?F|Ct)Qn;G*oIil8lh(bR+vz6z@wcNERq@Ol}-Ixw$8T8heP3!z}>S+!bQQB z7&`2H1gf%6w*AR7$d2I<-pS7{F8Sqd0t4-0r&t~uY<|BfSFGkC!F@0m*%7;$oNX<` z#B*VQIGG#@AA1g`eU(RUZ7Z()LZCyRYgt(0?QSco3d8O@3pcu}i)XH!b!Fzs=sJm=Ql;fP?H zB@M?S|AnoS(J=jjkK&?;aXpqq9WUN>jHSpWO@W(2&)$`4zgqZW$7{`J$9&(FZrKHk zLWiP7_NlG!TPK1o84IJjq$ba}O7zuo@F=e04czl>scnYToovV(w5BER`XFobc z$Fu}bAE!mHiD%TQKU1%388(6PfQ0JZE8=*js)RA1>rTmvGa)>|tb`j>`P)7gQF_A!Ipfj2;aw5Ogg;DH zskvLQk{s#&AYecLmHj@1oY?l1G8z`G9JD80#|AO{BGB;)5!JEW%k9b0nqzkDNVI0y zt~tia8OOwCr2Avv_14GNZt^x=`vttehL#%UBJ1NkS%9~0oNhmJC>~pu>N|dD*6Q75 zrzV)^(|}pi^`{@!Rrs}0&@ zzi?WuYlf{q(wJj`4kTO8T-K^}LoaFbqb`r16INo_7h97nJ`_yYv`8kE}M`OzgQ;<0@iV<>V16w zT6%Tp-B`PB_XKphBUqZ06|h(tbXcVvCw`|OoABY+rGZ&FeA!pZ!c4Eqy59m*%n8=bzEe8H+RUlA zuT(<{>;2BlItY)0W0WDQMUCY46piA(R#`pm(+TJ9i!D3r=!#fHHtx3;L7C7X3vVY& zh$56GecI%+Za1{s+uNhHNyp;{t>uQpO#@qfPMUPeE)Qb&!SSHALe48zfC`*_WzN5Yw!aqlzRVKju9TwAWu!4X)wo zYgN3+N1CV-t}~ytaU&2OP7@nKJUNR?YA*A+o)_`8Xs!EU8Hae5M4$MfAkMb(#oP9s z>Td61ygHXJ#`0&gPvaW2`R?%-XH_Ah=($WYHFh_Jsfp;LtuXCZ=B|LTP3wL)U_bLI z#&*oUVZ?f8@Vd~4vh`-qjBSZ9PwWtuMqq7mKYE2{w0*5alpphvsuTgwI_lTw{8CrqvCf8;g8khjecotGmIV zG`aNQ2A_SG5#7RZ$>7`rDV2B%8u0|~`7x<&j$l>#yB*&RmUC@v+2td`YuDOqj>U3M z;us!2Df#gbUyo})pD>oC27g2KhFQ05Sq98xGR(w*nPm7j=C-y>7H0DNI5sgoR<@(e zemiEl-Iq9f_?j3Fb?RF2ZogD_sbL6bK7o!_>9RSJh?c%K zh(7@wvoEqvjm|3vm^~utNqA2hn^%_Wc}2&32H4Ci!23?kbMG`LRoJe{aZr3{Cfnmy zSa~ew|Ipqdpp1S)!xzWq^+sZX1FY!@9(@Y1rfaZj9(~{`THku;1L4ud8mtEdti;jz z{&A68e6a*rmyZK0))d}oSq_JikhNUBuXR+e7aGR`t?p^oTZ7fi(O@Q5lDF1@o_Vp7 zyD^Q!{P}=$=zXhlm^CJ-hsakrbVxz|J4J%9596mT^kzJpe%PV&D~HcNHSu|KqScd) z!zPqm8~((TBc#8JpLJS_Oi6KA5~$GOK>L04F*-vRxHxDBt&bfTL?qkZuJOcf-cgn; z`t!C9I=^OEG@P-DGW+uL&0`Z^w#{SaH2d4_6hs_{iCM|o#kA&?$bj&P&rGsD^K|B%(+NKA11N3a(Js?rku&t zZaTSfjO(aYLuQ(=S}wGo7rJMIzX&9at~q-C>dvw#zf%ERm{%S}ESNPhJ`bXDlWo@% zrki@!^iu(HV0(ieu=41vrM`q1G3>FgH|($bqFa3S^*;OS!Y=~t==b1LNrb)Lh?0PV z#MkrJ;IFi+!A01K@BtTLTh4E7nF!!CM%o7seJ~+pkKyjfgyzmN5h+NLHHNnnz9AA> z>#U@8C`ak@B&z*Ip}>s$eo}op!Q>OOeD4?1w+1bLNjCr zHqWN4kQOz}jD)mHNYsce@@d@PS@pKaBv_^DLoA}N(wb^SS=YT?dg6$1u0GMt4Irm` zR!CDbSr+VE<(86NrQ{r;lrjO$yo8E*PXlL18y_o|mBtgy!@DG$3Y;tD#SJ^nq(-D` z#Ph_tE?nuSUY%lIn%Nb(@aiw7m=|OoiOk^C)zu4A&FKW5b@dm$CT>uCoRY{qV!mjD zT0J|??Ruf#>PqQ3zJ~^Ra7miV*)WRv6Ph0~y?%TT0=Fmfqg!nvr2GSf_DcCrQ~rP8 zzBJxh3sA6om%ruCl-)EPNZ}Y=-0+?r*Y%k=Zt@_{FHQ?j>NJ>7|6BG#tFME*oWWjb zeFb35kKIPJ*b5EvxucaoKjU|h->41He`PNug=0@Lnl@p3@+o^EN%hz5g%V{{lc<=wV)gS#nIq z+Y61*7REvn@9^`dfZr;9NgJOt+6zf)%1fsCFYJYMx#QCP@9l*WW&eySe!=evetY>n z$L}S6uk-tWA7k_XfxVDaW;@1G#+zRrzxn(|$L9aVUg#3Bu!zh?V}xap%8K|aB3=l7 zx6j9Urrl@jzdnrDdv>2C?{!V3?65!8|4vHqqo4kd!meFM{saelozGn_@#m>QK7abZ z+IttUD66i2_#QwdM8&fy)$O6wJT&L?0Tc)fa1ul<6cGj)1!kIqN@<~JiAY&lY5A0v znw6E68I>6xQc5Z-pR)2XE1w#|jMS9O}_xt|eb-fJNVxQLDd+oLN zUVH81{lW`S^|6ssh&#HAPY%G6qV!POveifgkFu3votaU2IG1< z#S5^v^n*AcGKf=1XK+QlgS}}-BwJNeP??&znhvY?D_c%`=P@f*cA}*5Vt4>TJeF<= z#0Wt=1tG-SacvA;)_mQib(cHW;YX8t{&XtffU%Fg{jXLu~7D?@2@~TXYH= zU8IFqrTwy^=h9DmEPWA<9y{Wjd+hkM9$SGd6)AV799-{TR$W_GOIMac7za=HD=!^>g43{y=_hJF#M1*HI z&7G-c4|Jk73W|j%0;($N5V!JI)?PPlVr_R*Lyo}72;2~#cQ!u0th5RzK57gi|8H-xcjZ$yuTyYJVsv4;qG;}julZ`N_o>Id;p~r zxu_`3eYc|bG>j^5`m?q7HuCOM-gMF5BZ$3WE23dt-PDN~(qk#Tk_wLWI?)*v;u@qI)KV?q8z%{rsI&B)>Bs_(+(YiUYh3lynW+5$nm{Kzn z9P?|c5>MFa&|%>^w(r+>ouGw8;w%%w8~O&1h2XJB@&XIF4P?PBkRD5af(siBOTU8& zN!Mc;wI8q+r@svT0scs_UIt|00T|lnL+A7JcqpwZ;yof4hvo+~_g#-XE1N179a+}g zV=3vdY;F>3!_61rsm9^YYV|0%fRmhvU|gX+dxfwK=J9;ZyFh_v8_u#`J=HG0LIo(#hE58?rCxU(m~a0>KZ zFl-v`EH#u=PLDMm!y@A~>rnp6MFVgw2lsiX>16~)60>pnfh{S~yDrz#h2yF;x?mZN zx3cUAr>B01l7C?xRC>fo-1^+ecz`fu*q3E^pvqAjXnYYB&$Mf7R4iQ#@^ShiaP}qi zTijMV$;{}$31-Fwjxw`P;4m`>1nS7t2Hs;%KJX4RhXr0|=7_+H%p4uq#7ueMAIww- z9$_XvKE+IZU>P&bfkiOO_r*2Oiwk&|S3+P8Gm`_en3)>5jhXhqBxYs?CNOhqU>q~E z14d@f3@DkIAGnd3g@GZ=ED8){raRD!nZ7_2GZzHHn7J@;0sJ5mc9fwa11I5X-m#Rd z-!dy5F$jFlth5gwILNH4$Xdg!G*b?|&aAYv8F-#q*OB!pW?fI#)y%q)tQE|_dTT z#K1R%zyVU=018|u20ktX#!7*)6u4dtTqFeYQXo%(8^yqxEO6d1v0%dxrrE;6vH}Sd zHiOOEFrUd{U&Xt*mnqDP+RENH*1$1@Sb zyr*!HeIJjf&7|28_IopNFB97{I1xBec2{e&H6VOJafBj_4CJ%llV=9xH2cbYccyMBR)KK*kf zOng08bT{_!PsNrx?YjqLzH3%=U(sLxi9c~gx@^T18EhuHMuEvuAk6%-1}Qn?!^0a{r6_v)*%nN<|lc!i4kwJHf+g=z{%hL3N= zsB>})Mjfp3&=u_*+@Yi`z&YVL80btEdf#ACR^@q|dK53C(xvHf?6xYdo7O>zU^h|m zIRAS=7F#*F zPezvN+|o~R1dui(yz<%1Ex414?s@wA> zhmp{2lq=zd zKPWqN>VxLkmf^=ZVI~R(Lgcc?WGr!eK=`&JWz^;G>v_*rn&DbuoBuA zKBtCmK4KFx=>+5rN1+gbTAfhsGT*R}2iqXW`W9XUJ?OY}XzdvhIjZ{E+e8;>f5MS4 zdRqN>1D;*P6SeG-T2a-*G2Q-jLK3gO2=DV@qDCa|*$7f;G%$4=R!`^Uypt>Gg%atZ z0eS|7J}W{uJ-4u%ca}&yr{l&3kIQd9y1sGMv5AH$xJLFTh`?su@)) zWpAhK?UcPen0#!j(gj!P&Nyx=M=Zuo9U1Q5b9)2E zU=sS4Ba7Oo}_&_0^3rBhXnq+Uz?s{BWMTn6umv!@`c5|-07Z+bumRUJ6} zG}R}bXNn5U!;ui&*gyfVP_Tr>6pK!#&|EW_O0W=7>CWbyt^qqmrM>jU$P@14QUW8uxWM(WR?UdU$tx-}CGWcy4k}Ce{$cfgD7cl2 zj^bSfWac@F1ooD9$A0rDfwr}ChD|&FJF4m1PV^C-6X>SR{^>W@4@I?2=#|tWZhJS9_=cZzxPp$1Gkh3J9aO= z_o2XhALNIcU5?&|{JTomwN5ldFiA#2>FU4&9JR%{w2H`p12&;swor=IJ&X=`zybti z1a?w_djpmr9YsgxC0|;0fG|0S8(FJ_>~wR&X3@ceO-g!$^o>I#Y{5 z3x%W?2ypBmvB}?GC?{&Hn?3Lh@TXNCsQjYgx;785;MEoMmk4@%08jr<#*z#BGN32{ zJhakzd0*+V3-1+_AIJRybD^6mE8{6r%na8Y|2LKc^cfi#ytCM1Kp~B+Xo_bU^L>#O z8bWEaB0yfm1jF<`cMqb6zY}9p^aFhO4%0y#)WrAYYMV#xmL>MtK!|L`fSwGeN9PX1 zWGe3qww0gvk;?EPje8%!V8YT1AnmkqFvQ-`wwOX*m**bl2B zwBowKFKdN$gMH#%vW7w801{XSjfbhDB#bH-9j^4((Q9?Fh>ORc(IDvh8IhUC(%pyu zq;8;h(S>nZIS>gTx$*-7Gw53&2&U=0z%yFWI7}zB4S3japCBRFsA|TNPmwOEWlF8n!wVEX_yI%&0WXTPn?Q{{Y0bv(-_yy0zCA zcObErN1 zW@J>Q^+Csgn&9UHeW1i*?F6sFV_tBWH469(tX@hZGh59=E7**vkg6iX8Xps?|6;|W z>a2_@fkSv;6N*#=jV)}&=ut>WdO3<30rbtG&Hkf-ZLBOfy698DiCB*du?{5G5bNLv zrl1kv;Che%dJl0gR({Sk+$b=vD)A^ijmS6qcLuUhP`2_@;Xic#*r0Pm{YSAS>)&pe zjsxja0>l3S<~0ly;tB05H0jDl!}KG><|BbW*Abf&4}l5zkl6rQYxs$I?XPld3B30N z4VK;5b(%d>4DJYAs4=JDcyN{ZEquV~R8@3JRrCte?i_C?3dCOP-Z^~XnoW=a6A_iJ z>Ea^*k;%!vIe;YEG>I<{gyYR9*lxrVWHh^BCy}V8cAZ4ER$AzPL*g#nR)&NAH|TdY zG6(%{7!}Cc4B?EE3P&q5G9eZNx6^>uh!dujR@M6reRrK;$n+ocFJf@zbUZ0^9A85d zE|Zvk_jkbx=4dP(8`4hruDUfa7}qDK5w$qIghk^>d`GRRE9S0E5&l7y8B_70fr?wE z!ryPG%*d{oeCWXVY+4Hn?x`Oiss;P3(aZpH?5l{H==;=4Op$Bc4F2|u}+K|(;GEJhTGpem( zJT^}P*FKJF!mPUdWVE<(G^aBL33@@KFajeC(%PSR0n6WOgh7wp`-`IBz;~5Y|7jOh z9|lg|%NEuX3b$-R{XGE5AniiYCzE0-{5vr}t4Q2N-;qtLA@N#Qv1ohcfQsqW6^rnB z)ks{}?XmO@FuW@5(5)DKXsZe$U`Y9*Lo$d#e9xB}q2%2aJ;soD2%kVotTimE^$nnV z?h)9$h{_7AI7C!6;)TzB)U5X*+&^#%9?$L zJz6n+D~Vp*&lz=!byBK;hW=7V{TVfZw;sP{(i-V}AMOm18~h7u0IMW!Ojg6H-fPAgQ=3Hz#6hU<4G$%CmGt{|IeT)e2QL zAMLOzaXaeHMi5dVbP_h@Km1z0zh{q^e+@rlx`d;0o;VD; zzHA7|w@IH75~U9%O3CujmSl++mrW1&zB`xrGhXaEg68S#gsNyrFg1B`6d0~IsAcEF(-_00{bbL!h}nN z^n@gP+U+jJt&FN=bf^-ywwK{)RCY*{BGKbyG;v;b7J;TeD)%l5!`(Fj7e$W@Oy4E6 zX*`V-Ny**wRl|V5ZY*h+>pS_o23~^g0M`vv;ILTp>y!$`x);gfd+5oFlCXu#2AjZe zkViqiPg8<4hjvrlH&RWXKbDSLx&s38k3$V{<*(qg*4?@NOK2SeV7f9=F&C!wgFeC=Y|%B9VY|N#>#-vtG9qgiSH^MI12}^ZuU2=h z>{XQ-6;U?$o`&9w7Y>W&;;`P+PxQR1j2^7Ip2Gr7I1UE|wqbF+<=dQCxNW|kLv=~~ zs7edeFF13lxhm~wy&Gor)MxP_zsD9!@3>c`9j{N`1pkHPe@~0Q6dz~Gv4UC#L9@4d zJ)vZ`MyaaW{s*2$=!7Jyst%JiigK%}CTsKQ7VBANWeD}mdV&y+!CHNilItj z>m^qoay79~DtyKK%~BZ4e=Oy3 zl9GAv9w85^@4|gl--qhU@cuE?`vTE)!>k_h9Izh~vFqvxU(fK5*4r80q55RP%O*Tm z3tkKTz#k!|$BX6w!e2%Bw#)IWSVjNVNG;(A75#&~WUV9XH_Vq=55rnrM``?VcaU2G zebp4!NMYZ!3L~1Rd}}Bf(6x&2VxI@z8!dQMY0>qOKfphZ{GV#^m&(KVP4V(6{GQ9g zDSf?|zMSw@5#E#*Jj!H#X~&7P6kOcy~6r^hk`wD8g{yK{uf)?h zjh%e(wFkZ~r`{UszmfUxz0ChG^MBzo|A_9C&coziT}uV|9yGE3v3NJ5{~;V*U{o>s zeY->HzxS?C`WKuErGJ8i$>`5USSvaO`UhP`k3fI;W&Q&F4H)_MR*&8aI!%nuVEu2u zi2CqT6RO%m)}Qc^-^yicV1@VsozwP0hEl*M2&gWkB%0tYCP3}0ngUi*z&F7FDZFYG zHL6E|QdPB-tSgvx3t8`B*6n2V1$~`C-x)#QjG%9F(AN_5RR(>B2Yq9MzCDA!orAuA zoFvK^4UNo7r)BE@&8&yX`W3StC+o*S+&W^bno?C&GFgAvMb;B!{iA`bMPzMc)}>_qH>}lXsZ7zW%S3X!mhjT{)z>f+ z@&^f5k9djdzqBm_sC}#f9?qBGy%z*yoX#ZF?E)&3|16zAy_@0H+5;CC5ME{CK6~I- zX02XDQ5GW#rI!r6>h0v?x$gztf=-^LyRUu#;Rgucb{Rg&*CX$+{)e|Y>Zd!J zA<CWVK!4d3=5 zd^;aRxSPVigNzONymQ@~hdzVv=4hzjWfZ=rZFmgwumAj&OJWCP^wggNJt6tmZ$|#2 zoARsghx|l0rCv!g99BL=-|Nr+Z@Q;A>-Tt`gMnS z>2(7N8#3%?k^Vc0h#&03gGqKsPs)qsxx#{m}rQEwnVzz9eJOajaR zlmPAqEC)Oa*a+AG_yBMOa1zi2h^dxwBLGIg1i)0l9KaI5YQRf?{ea_ua{&4s0?+pV zwgMgptOAq)Jb;;ibig=(8gK((03Zr*5!+9v07n5I0d@hl0oDWV2b2Ly0J8vDfFyt# zFbvQOZ~=7^pn3t+0^S19PY*swzvHeOlE_ZS111CFHp>`vi{iKu<+7MqKp#LP;NlWl z%vr!uKpmh4unn*VupHn63>%Sdx923JOiCP|IdRf7I-147FFq|X#~we4z7$CAq{*qN zIpZf!nv|HH3IEJw$v-7EF^7;vcj8nErf9=PNa#~0PD%)Mx6Ny)f+7lQUe{PE*mC0aud|r_w*VBUN&GR@MCEcP5 z9Yt;y>@9T7=X2-fI*W2=g(TE1YJBFT)KTLZj?dvKc9!J&kdNQvag_M@yh3MDKJWIp z@*G~Th&yglV*D+C4_~5^zu8gZ@Z=UvrTh3!IL8Ucl`Z6^vcrEOPw4xP&Rhbh#ZRyg3+igvT+G`2{ngK;Buxr@MR(cW(Zu zQ9?|Q9}z|3gj~tTu>dSAK{-W^-6UcNalEnzEh?9+TU1ojc!rh zqAYEGJi2AVG`@|m1;S)}XeZ{KUf%0-qU^bOKIc5g*r?24uMb7ENpi_(9AD(}Iz$nK z^jd@rrR{M*USt-+$R9D1FMxb;3b*tZ*H>`STq-gd&`Ry*Sr9 z7d2$;7RBGlkI3}`*Xf-*k}u9hr$AfIEh**YyvxHEyFBQJE$IQ@#*ete?*M;XB|!JI ziR1Z>+zu=XaYlK zIc7UchA^@nAYJf;Z3vRda25H90m@{Pa_B|!N~?u_J*A>dw+7o?0=k#ak->%q zYIFro59$z{;kY5Zjf+R^v0msGE%S3Bv(Q)aSv=GLwRIMo+5$g>@`G0{?{Rn?o_XlE zCAq~8PRxMp6byQNrPOA{aoK3hfV>uwrULCau6 z83_YvRG;rG$#>01{f*%>OWh8hlmKenm*Y_Bybd(?%La0>DP2K!k3~MB){sl>J=g0P z<1FzyO1w@c0H_hg=jX%WqM^%KQs5HV%*vJtLfu7vG*`$*8Y{p+Bva(dL&s->&k#Ec z_GYsxnmvT~`ezlmit-&Ep-3Q^l#eTvCf65~yh8UF<9Cln2~my6c3y6g-$CMec$U-a z#5gp(Wke$O+%EEOIwC-pq06FJP6&e`V$F?pmNs#O(GMaaRKOTMrB%^0!OADiVAw3}^3UjhJW2N>inZzAV zWFaS(Npes0``mtClCuc1lM|T0amfzn>_Q(7t_hXFO-xMVk{}_dFN`nFPj-4~)a1Ct z64Du93bHxAs3?(jDbbzacMEP&T&6)XNVv={`lmv4USEX4M2y$sZp91a&D<>o#oGY0 z@LASTv$$-8iEUCcvu_-GBkQ+JmE%W<4P_)R^=qk1iV9qCw1j#`!xt+n8}safQXDeq znayTi^hHN0ae50K`C}1*{96XuU^I`z=l78QmK2|wkqE@l_>eL z)yfrS`0`UqCSl~YJ0UeJd^)B-$WQQ};&J*MtpbFxn!HAsSyXFqz@|8;^ve~Q&gIS9nh4rMSW-tTiI%qqIoPr_Z)ouoJ!G=Tfvp|NhdiTXv6`=5LbIjMS8F&@Q9o)K3WPAEAx`*OM0ZQ?!ohQrrV>JeGq=b! zo0T8)C6>>XG;}K8m2_~yKd5mF?x2b-xLXu!nsZ-a9^Q5iJ(SIZrMWM~2%Qs4^W=<> zxwAB^Ep^G}9 z=v}URNOT!_yUWXlKpLMRTQD^)a=F~Zt`=TH#rE=Uhlj>*hzO?L`p_16bS|E#@M54r zJB1P|C@M5$VsvGCk~mYfb&DEdhkE4Yr(vMS$dk+PL14OzoOx)>&Jv8uEh&sd*-9|P z`=Q|qg<;bh&}HN~gkj9`l}ht?&ItX#8NcwKxtJ~hqMzJkHl7K(b!WMl+X12BFST*U z{MI`B&Nl9m=URt*W%=5Ust^yyAQP2-{Y5b^B z{3OU6u$NDD<yYXokq3#zrjQqM+zf$27YIPo{P9{*t*RuK6Waj*ExNU4Y3D@0y1R z6P6JQQIE5*d;>++C(JK}2?Y7)xq#v(&5IhCnBs76l(Ph#f%G?w5Rd~rpBW6Mc1lgp zn_J+3{&{&FGUc(@@AXB2q}Cm4Y!o-HHFXkEgQ=YKizofdkKv|NnD9}X5=)1iY4Y|L z1&V5?KxpTGw?IguZKG@{5Sr%Y1p>{J1?~qar1a9$cy~l#%@aWW1G~s#t_6gqUmGoik>BUAClz^< zu)4>=#0)Eolw`8s9Abyg<;o-cxo8xQqTrZHew5Gk-DNQ&0g`(X>{+6l=UV?2awEjQ z*8W#^C4*Ui^|zF}{I50sVp;G{_BVf_DJ+o%|H5Q{?@x-)gCVl8@Q6;GyF^|U)it_X z_Z~4ld-d+qw_pDOR}UN%d(E}i@q>p99d`WmH#05^DsF847u^0Wv;b1Bg)hpqR z?b|xuCvDvE16zkD3~KHEIaY8}T03Ev(v9a^<2^sLwR_%;t=%(61>I|I!nZsDlqRKj z6!zl)h&v`a*-8=5aha(TGcp7*!qx{eQqpe@adHV0)8bRoLw%qVYUN4;n?liqKiBOp za$;^ugPSP#NT&K}@rKDvVcm;|to61GfDS$=*vFNWyc6=#k?Uq?3{OXRB(EJM zF8^$-8@Y4ypjRO6BG-IpNJLi1U_5QR@w~qLzlf)ycy1DYSUvF3pjO~75hm1mxkXsK z73o*En|_X~#DP|M6Gk2wypQI8Ep#bZ-2}_c7TCd1wxN;lnCGM=Kx9E>SBN}vEWk=X z4RXYp(Ap*(#vea&6mg3EMLsO5(GnyrOU!MH-#%Z&Ncp+GT#(Q$Dzj|^qJhifU`vAH zh%1ftsK6HOlPPZ{7;{j&ex?=7&n+GMKiPKVjE7fj6OQ0|J<0(7$Qci>h@0z~&6b?8 zl_T(5uB19GC~~1Gp?kPp7x-;j#6FrxtGR=tqC#~W3_7ALn!*;bFh!!C z$H9Lx)+Q#-nuB^w2`(wcBSD0vVpTSttv}mcZoixP32q@7E)6PZ?rg_6*MfMC7CAyk zFi9R+O+k4=bPloy-Ktw=wsQ|0Y=Qv!_9q z0VFu`9L2MQ`DQwFGRZy>y8`5$;eh@nddB-_Lv7-?3H~CM#ssuWN-N&&and9w3G>MCi)OBm;&O<`0iOdN;cy72WdB$HF4t!yy=O!l zjp%Yr^7$Xoe7MCee=_dx{Yjb&nM*?c!m#)LcmAaK{Qv5@7YcuQz5eggeJ?Nnf6eDV z^#E#Xeefr>IdTQ;RIG&LIV|e{3rA28Q zj|ngI%%Tio?;*YrD|BqIHp z(aNMj>fu|%;O{VI=j0^jLIG0s~b7O$p0j~nI#W?2#cmZ%4z?b0s7+?WlC*TNxbK$%c zKo6J+SOC}z_yo`Z=<3F~Fu=k)WZb)eBY-bFNYe{DAl!$10Lg#_fM)=0e^g&FMM7N- zfXR1yn7%X0B|j_ph2j&gT*RT2eC^=aLvYr#gX0$Syh}9i70m}>h9m8DFmVfydln|q z)EV}j?W9#B#;t`(bRC09WjG6y(uyh;(&Ay_1sHA=OiB|k19FkLR0^ZjkIESb9P&(t zNoi)mq%`wkQkou^L|++9iN5T1(poR#P&!-M!Kncbg1K6lg!eg2%I}02m-4D>CoWea z#Elfq7||R6lW3#3k+@b0qt%bqr--YEN%_W!aj1+5?ZlZW#wip{cSxKC?ZjCH9Lnzr zn3T_E(R@XWOEhk6C+;B;hvEg=!D$2zg1IIUmv|SA%ctZQ`Xd@*TmoMxJ$*Yk@(`Tt zc5v*#p|q!pxRhsEJGkzU^tQHxvr0_wiIDUTwS&7&#C;nkm1DmchwANOJ8_PSID{|9 zRZ|$Pe#9Hj9pp`BJ2*UWDB@U{l$IGLm3;zC%6}?Ms?P$L)ZctCssFBoNquf3%t)9! zVN&~~3EqNs@;VM21aqfgQeGEfQeIJa2zd>FNqOA>lk!r-q`XpLQeOEmDUYjQKhaJe ztAK-G?g^Nb$7Yzsi|t}uN-I4A+F!6#Xw*n^7*c0}m z7q46wHNZhIR|}J9JS4^;`eI(Xa-2pnPLqgBZ7ZQ2+!&vb#sHXMLbSLgI!3@^e_ zJS>&RbKDNW?k0d&W?WItb&7kO~5I3JL9=WWo+foIS)&|SOBDr-wdC} zpGRrke|cC+2?ADM?vFTFcSM{ggnaCtE2g-%olqg}SdMM-C*!aks7w^kq$Wtmc#-;h zToP6%85Z|GvnM&R=|ZJKsGsOcbLIPs9ORRZU3`iYHp$_|YN>FxmE&+$ikNy<6dw#gjXOxbfIz5lE%lj_01_gdi+_g9o|A@m!;9qN6y|Ma4iq2BhW4o15k+ z@w2Q(Q%>aK_J}pu5`?=qLaP;06qDnAKs(5H7L*cRJokCnd@q)(OMC_K+~kbJNm6Su zigD=xQ%Z?&EIyul034uWxne`*9--U?2WZ$k!$7wS$8#vXcn$|n z@{49mdEG>O$5IMAMu6&Lr*>VQgxtI$PKmZ7ZIxY)g0=R9ta!VW3HLJ2LIpQSKM0%T zE1Fy~AKjm`5^dv!n=L{wPRYmYjQI*DWa)@uJoi}Gt$v56)GnN)$;A zF^q;u4k2qJVTk+@OT+bI7#Y~4RgWQZeIQGoFEQGQ%cC=*_&)q4uwYEujr<5t4oi?m!r{-rS|3dDr2qTL(o=c-t zFAv~OwG(3scORr@zJoejrYnv17RQyM2T#0mI#VzoVmuOM4j0K>La*bvdEr^Yo+_)c zncJ~FQFXMTxnV6l%5+JL<6du#2QC$nPbyB07deE=<}Qpcy|x?3~~Q>YvHmr9&N)235Z9QQV(k@Ztnws6V?f_Y*A zCEQx0mhLl7z$4Bw1krq#U;x~s0dasD95^n+Wk)w)6+jNif`2Z+1(**g2jGMWc4or4 zh?bMsbl`QCBi-d=m)p46Xx!L=_r`lX*usO0v<436_h?I$dM4*}uuWAY)$!}#KnDjp zIPm{52m0bnp|`HwXRi?H9E77yW6C=?Xs* zlsE?ujSxp;(;f4#fPyvi<+7OcAL8DoHJ~dZ!1HF%!9LeaYpmUIhE7Ce8MGHE1g9+? zeMBuZ+L86(!~23?E%v!6tZkf7e911+A-Vr=ng4&GLn{Bwp9CI~DGOy}E3OOJwB{Cy zBBddj6i(3b>)^oOK%;RmdbiGHGvx z!ny*aFiMx=l1Xxp@}Oo-ezd;cO9b*C3?P3EfZXw-oBAuc?Es212|#!mq6uY}r9TZO zkE0u%jDFYDAi$!w@Oe#w`fWnsoD4hoZBLPo}?hP=Bo{a#? z?^yuhy#XNlJ_1nq7XS($0HzRsXrHHyoiK#sFMd+D2j6QbKK-tNo$7;rkA~Q*U?*PF z@BR?`10nWRA$F9d1^=NC`@zjK`8Zh+hI zEaniP4p0l&2dDw;1Z)Rv1#ASY0jvZp1uOvg0B%4Lpb(G`mx+ZJ>oA^XOq&C7)EYNQ}Qo^fFye(zN$kw_KZw2{@Xu$!v9(PMwC^4P}mojh#=V+ zYQGi^6W}%g$&1GTuLBMP&H#F%KypAj07ssf?4>xkj>pkBF&_Xq%54XH1~?6%jniBhVpo0S)9B9LV2>N_4Cx=KTz1R-3JIv)UNg-Je6Gq4{jLFt&_>&%W=(6xm zoCE#=_!m$tJV!Sh#sHXwFd@Ur=D!puaBPYy1R^K(9!W7!|gk5Ch`G|XXmKp{ek@W*or_)qmO{eWbD zgmZC9t~)qD<5(Ftk-J3-7EPJ`por4|x(FwO%jM>UmMxj5~S$@rPOo&E+;vT$|9xo6Y`wI zr69FroS;a6EvU1!&Oeg%bL{z3pJ%_nnNVMcn^XcbLQ3=|;?ppj@aMY8QE!2Rkt*_92xL)KM{VYF#^FsGF509_uK=`g8xy5XPCjlv(#dXErO zjhIsG5n`+6VN$6meOem`{RwpS16{pa=o*2RHWH~)4<~6rtwN4JEo@@|@yMGf5qx#r zXxMo!3pGWw7QrlqJAvgmo6$fN%mt8d7B~!bh}}BNMWUB*k3xKpwQY&~_+qqO1fy?Q?WA!fgaxg})e38Vp^I;%iy_-`kC^V)13| z#!q7LFSHwfJc}RJZu~43|BrU#XR!F;?Z%(Ytw#!H#P}qGL;05vPEu>7zC*o%T0XYd z;pbygg+fR^cw2FX6M5t1o9z#zK5nwvWfJTzmuL&*DFxhw{pLVw5A~E(DeRu zT|drvb+%nzJ;r!-k%eEWuAgV|e``1Xvn>9f?Z$tL#Xr|>{5M$qOYO%0fW<%GZu|o* ze)DDV1$n)b8^}G+?dCeM`d9)^`dPisMIB5+Es)eCc`4{}LWQmlSHqHpu|Eg@6M>fj zeP<#@y&Rb7kTDY(;yV$)V4aQ5Y6w5c>@T{JWlNao#hnI{4C(ohE48B8qQr6_}LMnGz()P{MCJCejr z#;r;z9U8$)(5lm6l4e7{B=AURr7kAR(-4-=Qt~oMP8863*etBFi4-aw)rY&b9zmokI?1I)QhkTPUo(f|DN#3H6 zQnsdv!@cO6fS-!=Nn0plTy}#mRGQfs{YV#+bdtZXk^FsqgvuI+T@M-BmXIg44x&Wj zFS&#oYEAoC)D6`Zt?f~L*b$$`b3f|B7gFN?vwASHdT5w)B% ze^>!!Tun_4P%s6hStzEW%)oz|l|nCur}(?4`GKZp> zH*VZG&R{TbWeb}*ySO95yp04=P@prrtr7a*eo zBw7Gk7#k2+080UADF7{uEuf*@Jg7r{b)c;dbkrd~R<%S2 zcu)sA>WB^$j8!)x)q$2e&{78?>X0F80-&W15$k}2uj2vWPtApBL7mirmOA1GqlH=n z)dKuLLo;Y-1`W-ip&2wZg9g@|Ktmm9Xa)_-OanWarQ1=!=?#O37VkZ9oUz4u=3(MKQU4jw#+ zZ>GG;eeuN?+`s(`?nmw~&~2gpEr%th&v zlU%KT+gtsx*K<1Lx1HR=ssa5!ePwqq`ZhQHr0`z&$asjm*LlI&5-vJLcboj$(sT7y z;_uX{G|Io#uXS0-)y#HfFZcf|A0ZCubTPP>Nuvy{oZ_1?5U3bc6LK{g?V<`g;92z1r}arO~3d+N^f#9P7*0kE|!Hoo!2O zkK2yhkT8#>X_~*vua#@$zsNf)9#m{lY*xIe*rhn6_*QXJaas|s)GB8veaaQeRmw+{ zuPNVDeyyxmo>HDsHYvkZSE;(Iu2l_FjZlqM=~d%Y$*MF}hHAPhSLIY~RlTMCgTNTFVi)q8%;NxZZ+L$iZu5!yUiQS z+s(D+Pt9MMkDE`L&zUcoBP@e0a!ZOO$I{a})%u?GnDxAsw=K0jXj@}@+V-C9TjGJ7 zosHmn$;Zfll%JCSChwx?sfbmKRG1WTiiwKb6mt}JgDbBp-cU3uhAYiVpQ>E-jB1N& zkLrNxnCg4g1x!mb)N9l)tM{w_rCy;~ui2tms(nzqUi-TCJ?%HzGulYq5S>~#MK@1Z zu6scDrtU}G&$`zPU5tZ`V~ugfX-2QHx9K%go#`fv+H%06vEFQ*WWB?BkF~=3xV75) zx%FFXgzYL@Z`;+jYi$Z!nr*7hY4h3cL_I!WTW#BD+hIFsJ7%l5owA*=VeyMQiDJp* zz2y(fXDc31e5klrc~tow>Wo(zRhg>WR0XQ}sx_(_)n_WRdb~PSU7&tUy-oeG`g`?H z>eK2A>M%{DMyq*Cb5i5gexUtW`#DN+Qp@S$bWUBF?or)7ol3t@zfS+E{!RT}eY3u+ zVW?q@AJP3B?}8M~Y*LF3O(DLCSH;Ny=>H z9OWI#Wy%MY>y#UmThNO4DnC@pR0fq>^_=Q+)g@Jbb*y@*+Jb&|3;Nj%}9hT|tNBMuyHRyWiuhS3HYxME@bbXfoA@JiR{Vx4S`rq|RL#n}P zSZF9WR2d#KJY)FEaKgZ`+SV9t#uVdZW2v#ixXQS}_^k0IW3^FX)|tXBF zw&Av18wratu;qaKSA|U3Tlu(hw(6W}pjxT^OkJQU*6i1O2>H>ZiPL_jouMnxy^a3& zq3##mO#M9lYx<-5pY&S8?S_qp=M38n9~izioHPtInvHK7j~Oo-`=GC7m~Jx_m^`LO zOwXBinD&@HGR2#xndh5#n2(y3mctfo?9h24ZlHXCVz}a*;!njqF;{@YGw6wd>(heFA89z6kF@~FZ znQkx{O(~#vu4%q$xoNFw6QlS;(=pTcrf_o)^9^W)x0(yh#pZ|2&zoO1{}VFfS95>M zSc}SXhviYrKP;Oqovk-m^^lwn>s;%6>+jYHwqo?V#Wu!dw7XcjNuDOplP{Dnkypv> ziq902mA64wmMR}su2H_Kd_&owRH?kGO{yKLw;>CEQbnL9PO8Uh%$hV!hGqupWWHvx z=6*=V=QOWr-qF-)KGz)A{G>Un;k4bfS8IoA$7=Q3N!qE}JG3hx@!vvkY}EGB@w(@A zFGG^-0*5}+eXk4X2I_CrEA^A~C3>%ZfqoUZwiSH)O#hp{Kb8`2H!LzdW!ME7deJb* z__nde_<`|bE-Y$!1P6&oaBri_Ft4H(GDEI<0QV zqx-Efwoj?wt-`r_7*TSw{1*9bawnu_FUZW{3cF%5BxbInKvAS{E9NN{D#{hh756J1 zQmj!tso11=Uh%Txb;a9?-HKYsrOy;!DE_7RUh$LS7sYRi-xbY@PReNX+5YIYgO$UT zW0fkUL1|HrSEeZK%E`*xmAT5<=*RPwim34r)tk&B(v&M^tb9uArqpFubF-TKd&{+S6nyKn;RfXzd)f=j5no>=LW;I6p`MNg@Nye_`o2^H!r)*q}FjhUSd`bB* z#@DOW3Uz{dl6s+fqq@K5CbTJsW(iu;(~#XYnh!J|YZ^7@G?Ciw+CFGY*J*XyOzj-> zwr8}@Y2QIhI;{Osdm8=Crh7_vO82{t(m;PV}Iii z<4B_mvOs0Bni5TwrVFM_^qz9_M)TX|_sn(X?v_QCPc26+-&;mm*I3`jsP&`uqP4e8 zZcDP|+3v9|v#mneciL)gpF{ijk=oHAynzT~jC`H^SNR|EFh#QBCB-mhymAV9(L?A% zZ!7m;3C7)LM4Z%|A^Ykm~%_GiT;v_OM;mU;t5{HwIj=>F6V(cAPxjl)b2 zqt*1XTy0ruky*#1-^{djp>j3~cXoEmkIH%Ujt>+kkV<#u)vD{!T5ngCsC=qY)iPC; zYNP5^)cMJO0h-pHRwE}&_R+dQ`M_p)SNN?VeDe+X1dli z)}%I>AvN+$C8oPf51F1cMVr;;HRh+xC(KRe&X#D)^_EcjgFKU5!9A60*+KBI0@heOvHqM4)dL;CL39K+~%6?)4MtsK22 zNjniE)Ix2Q_9^Waj7~plf7M>l_R|@3H|tjFKY)Hc7Fz1<&{5YK_8JZv>d{lW8e=fF zKWu!#_?hur<1fZx=9|&)z2-e;8o$Sb3lCc!x4dBa5_J@5<j1S|it}HG0jH7+>~j4r&f*4nqU@T{BcWS(}ZrU76+iTaiL5r*3gZo_ZT>v|g3Lx($URAXdKGL>Rf-DNsx z3Nv>@4;pS(nwOeyvv@79S@v1#ET2K2J8sdT^`%;~pv&E5y$_?uTh?gX5Y%i5bl1hU zS0M-Av;AhfWTV5zv^vbohs(7XQ8VN->QE zUO88JAM~3|%4+4e%AcXxYM|K`s647A&}?5oFZ!qI1azMP>cQ&a;FDRMq)t;$R^P79 zL(g)n?^G{_%)Vd!g8FTY$S2f)sx$P3`Z9f!{*pf0aJ9i^$TCbf&WbfjBNcR-rlXS(0?gz0J17SlH98@o;KnUdRchO&6Wc6_(v>HS~gm~u+&?wvi7jb!I4C?jSOqHwG=I5wRN5K z8S6{dFRW)Em%7>ppq<=g)7#=P+bOqI+8#!q*kk+J)?hnNe6Ztt=rC@O>*Ukrb0DG1 z1^=;}R^?cO-YV~II zD@-1Irag=K%?&!0POnSC2=a#h3;hJc6vHfVW}RU&W-xCV_ZdHec6k(9(@Ep6n1MDM zm8N9VRMh)pkjaNlXHEUgv)S0<>(?GCQp=4Lz^#^--~jrlW&y2jP~9|F-oyju^+m;A7kOC%5RhkwCrx` zc(mZ>FyGvv-l^V;aiURuPMxDE)Rbs`);7MpFdF4}&?|{F?cF^Ec+-%v~X^AFyn-oUshHrl3~dv3`lVxY}mG%%arx zEHuB9#CtcL?w~oBA3EHOl7{ZP+6pO(^b1w zc-I*Q$+@ZOe9RvfsF!25y+vIOS$9MoP@jbqKZ&uQL+j^tBXpxN*VgNjb#`5*E?YNK z=hiL6jICC8Sa(EMXjouakJ(L);gI1t<~L1-NaFzG2=r(@W)jK9BeRI^gE3N!t!nr#|2H1t&DH4{4KQr$YNY}6pPL&)to z^zyU1Xnh}jEM|(MSuIenEY!QvC(HE9^{b(!SL+YykLZtM-Qz4|Pai`pbQZZG86(S7 z^vs2ZrG}M;HK4f~RM#2~Gpb`i^)SrMl8rNsMaHG*scVeej602o(LMv{p^>H-Q!Ga4 zIJD1v(?Ziy(@N87^wy20t?02k(OwUk0?;9vFdL6F$CwA0dGiR2->GQ7+2(w#rYtwF zHgCm>%1-k>=yr!O!#jZ)(pmFGtg1v?`d~IX%rYADQ5xS<^;wE?p(K}YqHt;^RHVTEiVYG51gz+8#rt@VmOMHZ~}VnNkbzfU=wCY zf((qtNZtp0jy3Y&^$6o=qnx!9Go(MYl~kkMm}#79%tjsL8w-sKj0;f{%P*6f+l_9M nkFE@M{5m+$!GR7Aba0@9105Xb;6MilIylh5fesF|%Ypv~D6VsC literal 0 HcmV?d00001 diff --git a/PowerEditor/bin/plugins/QuickText.dll b/PowerEditor/bin/plugins/QuickText.dll new file mode 100644 index 0000000000000000000000000000000000000000..99dd92466707fc619f332391e8a572299b2c68b1 GIT binary patch literal 184320 zcmeGFe|(h1wZM<>W;bDhg)A5~YSf@>jV^kl37WXkCXx+N2yBQX1PrlNG)AjPb^(?UoN$8BwE{n2Y%xh=i6^|n~4jjhE%FbRr?Xf=qx>gC!=H);?XqEPnpKJ)A*8&KQV z_xt(pBQLVg^UO1IX6DS9Gv}N+bDoMt_gQQfi^a}gEM~EEaFu_>`uB@}hIu{t%s)=H zY#RUKv<~Z>7pGm*aC1}kvgNnmwESz|$iDt-x7~JoAp7e}vzG^N%f9)x?9zEv+26SR zhNTxynl!;32mRl-=a2v2$%_^x{x~Pe3wsqX1_jSI-i|*0s zIg8%a*X%{_>FZbG*R%9>{>|4n2+Ysxf!}Ab%(13gPAIydERpA3OUkr~RtJwM7E7m@ z`oq_`y5x^ExzqP1z9d2LrvDA{o_81j#wMlt$Ajb@xtfpn-I!weF{wM2q*#jN^~My- zjx@PB=3i%u<(X3~mR(a)ELq3AN`CAtOtBOvC(zCttjP&u?=K82T@@hd(oe~x+h?{r zIajvDa@~c?Z}?i^YZl7|HN26&Ul+e}N&G8@OfEFDS)M5*bs71x<5w<;f5l+)!sSiN zuO~tGl|Jjb@8g>EuUOzMUwZ59WK8=CFTjB%m+Pa)<-0Pe*q66oV&F>*e2IZCG4Le@ zzQn+n82AzcUt-`(419@!FEQ|MU|@kU5DR9+g05K584Eg;>rWPo;d6wxx$3%(efPf) zj=t-$9-NZm>M#6}#ZqnT?@5y<<>6_l)a|ea##O5=f3#R?jqW8|?Ut@ad&i|mtu8h3 z1t9DX2M5(f4_hpurAI8(8JX+sNz0f@`B_tW-L3viE=mEn(b8xgecdpf*E^T=Z=)

      1&bto4zho?{IB!&q#6A zbo-9j)uQjxn_8ns)ky2?7P_?JpMYH^V1th89x_2U>XiujO#ClYAD(X^ql`t7dT-=D zTfH`NZ&%NAAF4PK11V2ahdKm6fgc}wm%x{yr|mWBmynVSf2hY*-pZVCT*6`heGiL|Ze&fjBO zE2R9bf5u{wwgyR2>%Iq&!N}c?4I4Jp#dXegdbUU?gRwlQUKYgfSA zP@E{fc}(%1R$UzPqeVUbSs77w6Z7p#3Yb~V`9{g=p0sCZ znmXy*dZBY#Yh~8H{^Uqm_z%R}H~}VjHcjX9yj;4M)OJx+YOU~s%ejuQwYzwR)v$(( z?fh7b@!_i+p&OlK)r&v|9T;ib%2D_|Rsj+zvG-4hSB{MPp|qrNUj}O9!yayRH}F(d zU6VuyYe|XIL7gK!$DOajS6D2qoq?Q-J3*m-9Y5B5$a7T zT$B^Eg?jB(^Nn6rBrHU7fQ(Z6wU4C*E)LzR0mmZux*rF=YN0Y{SnmB$&_=F$B<^hk z_x&^BPmSsIRpfTkobWSlHy1VSKe)fvoylJof7#uw8fZ$quEq(GQu{)`T2%<_dl6fJ zP1i`dz67YXhQqkZZtI1cyVHjHPU}3htBuLhYGW<5k}ty_dBp9aP zsz@qUuh2t!l9}H6Y>L?v55*d@9=t^%@q=lYw7jbbhsibpFO@LKou00i#N;KlSns(OS(in;@J@+z3B3=$|f-Mh@O zJXJLdxK=%H{G=9ChdS+k_5BG9y$YPHu}NdgslSpL+j&NE*%Hczy0iL&Ohdu0nNM}Z zk$tawI>q9MN>S@crUseqi5WOFD&0)=7 zGQC}a6PP+#Y6!-_O{U8F4b?DJUDkeB`Y55QBMdT)%=C80i*zN5^wZf|P0=!^!U1FJv{kl^#flDsl3qAz0tP>A$RsWTbSyCE!j%u$2DYVAyKo6W!(tKF`) z7_(-T(>TC=v?slrIOKCmo-IWEPY@5rkCQ5?(Dg6&^bDE`I{3RWonIjz;&mt}h zg{&X>=G))$)|e@^=Tp19C{WXM?ZHN2Qf)(2yiPK$c4v88q#3K_Nhp4mJ+jhC!Yw2; zUas5aH+Du^vefTrMs2NMt-i!;-+%E;gZwI$meoo{>PP38UF#1BqUodZN(xv8c6R^6 z2(wRG`^&g!n!E;@ygGA~CjZRB0!=bE(G2XBYARdfqC{qO%!WGE3+U~}ez6%;^r@Rz zSwvy+hq~?6N~O|TSz9Xlj6rodd*29LPT&g}iEn zq*4&48I%m~N*RZP{|z|@ol<9HNseE=b|M6)-@L&av$@&vK^4A`t;#jf;IF}OhA{`S zDiJu33mljofZTGW@qfd^})v zw6Ffu&Lu}X7jKWFb09O`W8bhwI?TGdl@VqgC}V!?YDb$P!J_Wemp6YCm8$P~~=D86`(xG(Dw`BQ8YwuExxc z8|{$x*&Wn{ePmz6_h#N+hCr$RgfE8cjuh0r8yw%`Q+B!+oxg5@13Qk@NCSv5CpSku za4OSaI2Ifi&q9glbfaRQVI_xci&5?fZMTP3X->Kw(cG_I+#ic|96j5D9V56eZ!e(y zcH3)(bt*8vDi%~~Ar*-whnDzNkVY_*&ZBt@y(sunv#oom*pU`I(wJr?x&a*S@5G58T8k$qp4* z0^^LzTw^LGncZ!>Tha`y2bM0w8oSPA%+1d0EVKqvjj~(=L|R);;4bDc%Ccjy@$7ik zoyyAKN+)d-JG+dX{Xb_!L%lI@!ml=bq{aL$$zY$@xuh!r!*E0@tzlRCQ&!E@Ff%m9 zG=2HA=q&7`Qk%h=T^0;dEnlxWu)S@~jh<+XGhT}MGiXa7z1=o5<~tIraD}L1%?9|E??}Cn z;b_%PUG)v|s@*2G=H(mXsd{_ccB-y$8vCVkXLVI&ELZjROV#;OwOdy$HV|F)$>~qo zjFVZqV)MoF7MNsK?hG|MEo*+3sGLE@_+m^Nz-AnFoZn-e6U`X-k#dra%j_ylB&k+mB&J9f8pqxyC{}$k#Tx8l2=Z<8_xLtyQ~FsLRw6-{%0C?t6W87egjC~hNAzT4rep0Yp6tda(Fukx z!`o%7as*ebT{FXCG}(i;@JhQ;fhpBqxRB*6yviP(Sa?Rz9=;-K3%59oN_*j{!7RxQ zgq=~B5IsogHLM!yP#BmF7+c{YNAT{EY*UR{4)Udvuf(kWAK|MV(M91ByD>5B@XmAu z?Z#mARNabYW-G#17_%Wzhy0R_HeF>etd%yE*rSt;+4jOyXqJ^`VfLME50~55RpqZM z&u{nVx6jUBdw0Gyy=^KYWd9cEXYCq!j0ta??ENIT(wOU5duP5Scp|HBcS*k0*x6l{ zZ&A+(5y-0-5PwP5+okAasS==q9qKzPUhk;_+&F5iunSg;?FfnKZMm?(=%w)- zQY5({pR#frlgGA0dMC{|gPOW$l8tUxZT9MDBtY?&Q~KVRxdlNp#6y2)W-4qg&o;V@O20hh>nPAt=rX-xdRh&Ign z2Y*6|5izAMA*rOH7BS&ZGAfRUMR$u+{Ta}t2x&P-gp)|cpfN=daFxA2?4nUD=m{~( ztZQ0QT^_Tp>YBJvG*a6`lLU7ClHkds^;MYlrA8`-Kf6L*pH$cA=s1wdoP74Tbfwu5 zS~_Uy8MlzNvS-%9ZOlwPBUd`|_EyiV5h?8VFf(KV=0~x;y2n258nUX3WHxs9q-FBZ zT~==CE-SI9HWJroJp_mw=U75F7Foh&rEC;kh_MZ(%XY){vi~%Tdcz>1#oQ&Mb1 zI~~WqTimoA8n`ZD--OMN<@(D;ESsU7G4I>PCt<8_!L#x@VT#L=nIb$Ao2K<{TB9X- z)-uDvuFmPKY=+DBviJF>sYn59+{U;_xiy^Lo@sPN|7gsbgQjXXx}(1httny(`O`Od z`IQ?mwchSpqbvAe^gV?0IVkcct1}pA)`3;BHeAP|ktv)W96buTA<~LEX!P08IE2-+ zI?PeuGT*exn|Y!*W>r^FFq>r}+pzLHy_%n#>PSr~S5Ni)@HOsY*82X}K|8`r`gfz; z0Io=b6Lp`8E)j6pKs|i{Pi*BJUYDCju!ZVGGe-tF{OU0%mZjX=m)`bW6U@mNkFvXG zmB6!pLrUA;m8W3Nye_+GIZ~cuF{`FuEfWhjSWfPwuKj7cPwgEdB#-UpPt7+!kvH>- zj45VE#o&lp6V+ROJbpS|6r0a>QhH>XNLxD*;kE7V8dXQL`&XbvhK6my_tQ6*x=*HK ze)XSs(gOy*yS6s4o9)c#i^zWl)`cqi?+Bb{RJsaNn$E%s8(?#(IOgpVUYCoccU5+5 zywO#B2s`iDUD5N65(YYuEg4S>-N{Iw=udx&k@np$c#Z+y4n1JOjxAG6}xz9+eL8s<{ zw;ofOCZv;re4lw;+cvbOKmDoTE79L4)O}}_IpQ^u zmg2m;n<+Y;)nD=9v!gc~T znG3PI{4yGgsIIM(Jx(tJ57bkPxvp>_8cL+BB+TOJ>4gA7TS{0HS%lE^MJkzt0ju0; z%q4li_s7dpcWU2%Jb-hRXqQdx<-Rb2xcMiVo9nR&6omO0!z(_8No z0ueI7@YNa;{gN)k3b7J=q9%U@5Q9cqtxRq^1C0<;#8$V_6JA-Q3LvU_aehI` zfRjv#t#GI{aM{=jyZQxlvo>@ilJ<=b{+vwUa(mnMpbhl~_W;ipbJt*W@e7Ua>xKpz z#;$m)j?r^Y!t|B5*L#5R6g_7H!}fW4PI{`0vzVStU1zRSJ;x-Gp^q^1vcco-VJ*>I z<5hOx7;@5z*#VY$sUAe(X3Voiv$+=gz9d@JJ)~C0pAz~_sc>{tzsUibQGo1VE{qqJ2pA7+}4J>CmfiVAFi`Ja>^YQFm4)uk6qTQc_%Vc^GSe z(VVe%jW1bqnNAavHJ5Ameun1KfOSeVmma3Ek-qj$Afy`gqPfgMIOfT2>@hW$9%G?s zE_eGZIF6vXG$k~bRiY&<6wT!dRD?575teApq3noAE+Ib0KY1bGb`2mqfOy z=u6~FXf9+N)m+liTxKOS7iopoT$-rSn5SnHzayH&i>p z{iW^mO4qI_9izG2Est@{WlvmlDNSfDrCM_-wW#N1Vu|MBOVV6Q6PinDLUSP{p}CZz zxlr(Bv*5b2Qmwg^c9#Lu)Lcrfs!0}nQ*)tCQ*#-q^8qP}=Hg3eEe!oya0{v(#=Tk;o;;bv@kHs9spc z7ppRF{#>gvvYL#lDN9(D6KcvJ{PQ!^lzOztv1-amSZV)%P*Xm}u$ic<)vW7yHDy1u z`B*jO7tBZM`}fq8Cqzxj#HcW$rZi|Z<(g47#Xh2@yk;M(rraQE$~u{P$EqoBllU2G z%D1V=R8#z7vUn8xj#g71H`SEK1>mTf@{I#X0cEBoHdk9>RT%)fj5L_F-8&9_`Rk9LY@Ps32&0f9mA0_hfzLkmeMLw zqSVeCl1qIzsTBTRr$m$dQ<_HKRcbZ97OQthiCB)GT2DKJD1!KIm1U`N7M?ggUTT9$ z-wq-~M8#hISY)Ma0$%(v3_9+~GRJIzOFUU>)FfRCQmHA^s#)Y5aYGpdAMs9UIUL%5 zEoG#x7r13@jNJKnWTout1Z0aRUdi9C*WHX)@|cEWR+4PFZ$c>mu-MgGxn)5;snK!q z?!4_7?@p0-@@6hKnD<$YJ+m+wtxQ!*ZW3BvF}>PYnbBym9jHcHEj7!ZyzUz0n|T>k zXtA%eu*s`Qyjo)P&_Sjj%07!JA{G#kEN+uHJWy7lN6MG239Z zTFIPX5j0+Cw5VISkIrngRI9(}MKf?|XpQ!QStDLBJ$7SuX6O^~ikZoC1e4nWXSMCq z8r@RE)Z?p|J z3VCLDdb~bolP!$d0we2+Vq>ntq2H2{+V|iM%vS7nVpDme|#M=;)%gEY{l`l~QHUp4S<@ zt=eeHXd9|oab021xpHw{XR%Z_C~iUYJnS2$1xV|T^v&a|D>23RqvwhE7{nEH#%*!= zF>nF4X-`iikQPIRP2X&(p5;ePsZkx@rqW>%mSe%~jC{Q|yJ(lAafWZ$a71lJ#jw%i z*%I9+a(Q`%cV|ZWm5CS?ock!A2WnKmg_#*#zQonca5C)JJ;MpUIe1?zJC(Ryo-nF~)^%Lcr8z zMg4)y?-?n3hVX_TNm+BlhK(RZOm=Lh!{NrUou2zX<8QtTt#UAq8?Dh(^mb9o=ys9C zuYU4+EOv3HIv2=YBfBXjXr&@Nw{@~#f&z_AObir$Yj{dxYbC=diEk#9HR*jx+Y54%@XGc zEF5$zoS{yq>WCNWjn8`CmE(Bbet1Z>)~!h$dsy zhVVVcp`aTD27dL9H1ZPKh!+6W*QhtvVNGtC!OCzn@Mc`kgeDQ(T;WQ7*4~9Z*%rRq zj>SIgw;R{6^E2P>y;`KuE5&|ZY4=V*3Qa*czS0pEL6zyp=A~a+=6C#y^666kYKH)G zL{q{kvX`VGgzgmHb!P_5>nfS}coV=F)SGO^u&dRX{>YYfTV&_B<9v}8mW#RJ?m3oV zU1KpA5(>MRMN2E_fvXsvVdH>eaYP{ylkyzIAX#tyYP^`R#wvl=YbCHN+*G7p$RZU^ zwc};5)+O^ry-Q6@?n)f8m1ob(vRlP`n|^<1ds#Vazs%(IlB|t? zSc$5z5^amk&kQL`;FR*fspaK?6<-Vg@B{XL7FViZ)`1#2ECL0I4&9Tq{88c3{{% zCx&6uw^5WxUSDCpzMR*7^>SE760>ITap_JVt8H(3+k6PQN=%r|yVP&Qv8cJX{|eHc zv_{)ET2%$85LU!87-X9*km?O)A`{lIG8=VS%rEZ?0oksrVbhA0rwfgJ$)Tgh;4MR0 zw*B6B0;h*7vd$x;FH0N`sv^!zb+5SZbY*$p3HDPkw#>m;eM4rU&k^P!=&FaI$Yw|G z61El)2r^~O7q69n!3$p(*8jP@@ce%q%M1UC|D5RfpT`S_59$(QdEw*nLSM`azol~> z!wcsKuO8ur*PB^Jc%e@VRG-fa^UVC8!wb)c;|VV;)oo7Zg@>8xtN|muFka7R@xs3_ zoj;owCi5}0%m2Ul*cX=nTs|gz;tb3lZ-r=MnZ01)jKDaxi-+iiEJg*jGlHif zd2=W{*B(8|m}~czJAxBA^#a-@{R6q}Ufh)cc3%RR4`88DV7^gczRv;X8vzFIw26#y ziCCDL9pOv0FkzJDCOkFNZP%J?GFi%)JSu?v_AREJ2q2-=xt!;Ke{u4rM{Ne4Fr_&7 z*Rk@%)f@F60EA7BGbXEN8F;;0ly(h3FD@9rYlDDtFqp^^qCJ*|N*%5g zIPLc_$*CuK)7A0ga$J?FYVu+=)i{f=jI}s>%3M|y&YrT2G!PMP$qct-vBs&7cOXpJ z)pNq8`@HYe22NBj)sVrajw~RlSM_bDNhvrzVeM|rt`09@QOpUqOjk{Grm!Way(~AF zZj^CE!OjTvs`UU2x7h1tmj{acgY4A!Fw;YkxEPtvN2(UYNC&8Sw$zNPo7B8OY96P) zY1X{NteF)(+)|)U(c`Cf0}9ASae+Rgav6EhZX^E8us=KE&kFn95r0nDpBoVu8CS$V zJ?ziV+Z_>anGD3Ea<}~C%a2QbviT{_4ZBPsI+L{vKPGgRRj6P`Hd@<#!%>zbky=GY z-7_Q{l0@u~Uqy#n8bDk%nh#1_OzHM(y54~J<-~%+(Ps_cVAvME zTZ(YZu4{BtJwr?OVwpOK+$D-Y-9fd;to~{(!IPd5PruSkzt}je`rZMJ2^HztScWi-8b$=KN0 zF%F|y_al7^(zOsh!3Nkg zRmuc2#rvfDO7e+&gLe0@KsV9zyoDyHo4*K@lb48@hIVF2Z$(nXv=Fb)D%f0T59g|V z--X)ofW#32r4`Ep`X;+Ikus;M002alYOHWz3qNXHB05FjuVQOperP$!)wX@*- zY|pAx`(R(S+r;UP}zE>E)E$H8Ql?%SjJyk-$dLUnKl&A;pb7 z(7TGjoit~I7+dTZA8KN`aKb^7<&^161auivMnfB~r;9HQVghbV(SxKzgBpn}^!hzI zTJ!*`JI*mt2i`8^Kv(Tn_fjFv2hZwixFX%Ns9%w`L*wmVv4Pzf`Hp1+Y%lyPHn1B9 z#Lr>_SA7l}D5GU#*uWxP?-#Ry#Jt;mFNI~^oqg5!?Md_Q`d1T!W6rxDY#AAx(Rue% z)G2T^GVd~BNdNE8yVB%&w+*3N&pY-g;`6R_WZwOam*%`uKiUAI+^j|z8)`A*3HVV9d)5R}8%T4NfKx;6&nVJi5@c)!Vz$7RjHWxm+3hPkxn! z*1{phKAcq;=%uX9j$+dB4o^`QdB&)nY*R(y^KOmp@&b53&% z6B-j4zcy0gz>x5*PP0L2vf-Yo9ti8EG#04WRnmG^FhJyo$IBi4XSs!3?F%xIkxT^*Y`a7xyT=pwcUj~c! zfcii70VFtrMa?A9WV4?sto+aa>FKrfSYhRdW_ktb;>!4f`igKzEaj-lGwtGl3wxJG z2fv>!$K=93N97pjUq|GaLKF69$}#F7+!?`DjvwQ{e9ZA<2X1=Kjt?Zl#r@da8_U&d z9NRt@M-@ppI?=>Y3aE|aXv>NOj?N@;2Y|PT1my*Ag8bLEuvd+7$~O@FYWh=iODnO| zR$>XlxEK%#qR;RR=$&?37}7<+u8Lj47S0pAs|wr1Ao-FKKm0IT;|Qj0fQB|1Ajng_ zN>B9=JxcNp`mzyD^@UVY3YGZ8QPCq*QZJG`6DtjYSr`x2-4>juUt-A)H#^jS5~o9& z6za)}%+9J&F|0f5d>QR!xZL8w+^r5#9t{!#*SmBs0k`K10A8H{*p*cknU|$5<5>e_ zCmb|&t6!J^S<@@Ef+;=?VGPQLf(2EA3j$ocD_FaP&FOmCoSvPfX8a9(NH(WmQ0H@7 zqdY+|*ZQ=%_W8xKlY-de=vZT+$KPlZjEVg8`t10yUv7CY#kJW_s15avXMjCO2h>Th z31bl7^J2`5cH>aApfOX;huaIsY3tOJXrj@leyH=IZOOdC>K>jU(9{9|RjbR86KeG- z6Y6WHK6?Sx&=NtBY^%JxXfjAIAn-EYNZ&8nD5>A ziJ6-}f*9n)%)a#2mqiXqY<;jNW?f^?i^1^jj7bBHV%IsHVnP@$4&-w5CB2R94U6}1 z%h~ZV>-@P!aSj^bCE!htbtKN$%!}^QS>*7|x&=;k(lPG=7F+DH#(?6NOK~-Ga{H}%FD&GM1 zR7?Nw_|Z6&#$fLm#pJno^{qJl*p45BAxX#24pj`;3!4XmH+h@)HC^hxJA zq6bWX(?uPz3KjjMY?e+&3o+(gl(R0QKs^};aH9YSH4j(-)vPSX*R(F4ai(O%cpk^r zs!aNjKv?rYU_74T1L}?!5(uNC-}yiz>`HLdHLL$x=8?4I;V&GZHVC<+tTsMCvFMKz z6UmKsVos#*lqV*VT_#dC&eh8ObYddCsPD#1B!?Og-!$}+6km_VD=c6nB~K)QrkoV7 zR{MQP6X~ne$GG231H=YE^EvT>-ZU|9d!_m3SgTNbE}=Acq<1DK65i?s!;u`j79Sm$Vr7HOYi<22vM%~Lj zE&PBY7|lC23uT_mgYiicW#)vIDt17+eIH?ZcvBzyQq$t7RN4O)AsE%DP2y<{R7L2&|vELIwCcAef#iu)8xy`_PUSM*#M1B z2(8IDx_o@7LZtvWdX-<@{|>Fip;BaXBVg58pBEzy0^7zfB#wqZLLApGHi=_x^G9fP z0yj>DLcW0sqLC=oFLpf%oaB4ctY`GBo0>68kLRz~n&WxTfCHXoI=?@MNr$D09TVCS zjtsN6m)?3huglZh&f>!UU4w;dr0oc={FSj2iR0`tpEeh@rnqFwe;xgM_J&Id4yCp( z6?WUF2G163CSKO4U&Yh=M$(r{p$1(jA}{?l4CvX@pq^DEHWWacJ*lhsz36%i@-9@D zx3|&We)?LH)cH*o%g_!7{5oy|(Eb2a zwk_k?0TS9z-^FkE^jG=qPR-}n+J5@|bV|L+vRVDKB1OH$5EyNOnEE9@%Oz!T)ES#0 zbt?C5(%Fh5d7XJL7OTToTP$)W4oefh0na+fL5L%KvpX^`l{1J~M|&&?XqFD?n>MbQ z$B8+uhZ29m>*Me(sY!2r(!~BevaY>cT7ybTuh0E#XHm4GC^G_ z_p`IDj>K^`RY6MhvGwf~ZR<2ne2A;@aUk88bT44?c4ne%sAwY{mRK3bbaNUx@FV@aZl>`1_-+m~j_Kx2nWNoYEcdgs&l~OL zjime=-Fyg`N!>ip(f>0BMajruU9M^9V<0(Sd15gq6OF$0GFIKC?sO|26L%PsWYA2M zebV%GZ&t_ZMWlnuq;yc3FLg-C(B*=4OC-M|a6%m4lO#oO{s|c;CNdg2*>FB>o9x}Q zCRJ**%!(Qq*3;!&%mp;c+*rr|xLByKGJ*$9qorX$nma?t)ogO8`G}>%$zve3!^K61 zItvYCCo>G;_3tVVMy$}~E|w$L`Xl6QO6`zKRZVP$lf=B;{z&t?>eg%qhGU#(B(`GT zRr}s#PE{PKU)PoQ;$pRR789q7Ez@_URqU1asXA6pgXlKZ)eUku+i$ka(;dht4@@Wz zp3(5or75ncv*CWZq&D2gMS7!7Kn|#_-TVm8)#{S330uKJ$tHjf3lo@E)0iUuQbTXB zl<53Ai`*LBq%S(dTm#r^2z94m1HRyNizNzSsK%rQUmxkRJ%a^RA*XX^pMgId;+$`i+#v@T`c%g9k54OL@9OXljlLl z=7o$sEVpeB7~-gOx9Wv6)#4YONooWDq05(%#kKxgei;zC7?W=0H#mbdSqM< zvt))29}T2qqDb=+0{}94<|ZZudt5{fa;LY>WfsC7GSy{>L~9G&>22a0@~pIh8go#b zPLmoBvt=Ea1QfgX3}CEEz$mi^R+2AQ+_tmSgBgGxR3GgVP}c_CBo>%&nt6i)8_Ojr z)6eGJrBe|Q@nVoe&Jubcqe@bzk;+4{=xcQU*lMluYCRaf^Zn+jR7yps=u+jBx-DL6 zINsPZY3vI(njQAcvfF&l&6xl>c`Ek^jlp>TK|I}T~K#!+g|qc zz733c?5c#9-fXNCoFT|!OYdgh#y~*-*Yz4AF(0}X+%xcq;PzJck;JrWlZ3`)9Y55Y zS(t*5eIV?|X62^f=Dq7Wn%`*KIJmeYKLE5Ju zTRF4yj9;(0q86w((few|59673-vRZzJ`j$0qf=Vd&v;zhe1L_*OYO=}V>z2->G7H2 z8*W1mBLpR>ETOWlld+u#5c6ikia1vM4HDl;(B)6U)W8U)d|63o;sN;TQOx+y?x5E- zs_$Ci2Q}=YHCt5sX(o@GATrNO>H)HeST>LVEDs}NkcSwnMz0JQ~WDkvum>)w%!A=RCIKVi7NsWU?)lX%&==jM_qwg~N6`J%ALm7+Iz1yt^ z)v9Q+STjJXMO{bns3$IA5aX%tU3EFHqnU}p-9q5CKWfcdL4@g9WUh`g5_A4!x zd!BoghwWX)Bw4cBwpXXOZUUAmh%w3v|7qiLq4|ct3q9q(>+VW|N_xa^6m8OdeaGf=hzcC?i z^h;(frNlE&P5kbkFgW4rE~Rh?p`Si9&wfI zk$SuL?Ld~c)Qz61zYI#&OH%|943A@zdnAG_-R($<*q3XgUuK|2BKGC*#Ig}jkN|AO zq{L78_?#C=Tqp!j;uvJ5w>C}C0{?0!X+c-|A9i*OkeN_n-`&9#A1*RqWyTfb@-R>L z^ef&3oIG}N(_cc-Eg!n(rnhb3E$ni-UzLE9X9bBh1f$}#kDrVtH)}+K&Jk3+R#PSS zS^B;qrvTwWp0o9HRaHYPz+y8p6OZlsF+)Gf(ox`7cTh2%Q@oLsTy-zCa&D-c%B=qN zG89kC4`DUfAT!2S5$4Fv47k@lND+<=x!cW_sd)@Ckh0+#CZsDzA*CD#iB(i$JY@kc zN1!OjF1+0PPVKBZ+Nr_k0H?jweP#mu;486M0q1!GSK|$lr4J#^yAFhKCf7WORKioJ zg+RV+U%K!$>~>XGHLM*)fR-nvN_98lQ-39^qu`m?Rnpg(dY?gzmaV;fI=!_7W;EtE z9K4iCbcCO(*oiWOL&IsobE2np2tJ+_N>!`=$xc@hBo5Om+=R|UPCq#j5&M?`Plh!3 zu{oT}Cy5G1I4r4-|2mSMog0#}xPUE-I`|fxFB|;NA;qqqmDP2|LLk<1Y!kUqMjdoz z%OVvYW^UZ1>J*a@Od_eOdRE4p*XDp%iCih9K>6vh*ANXd{SDz!{78xj3lPP%G+o{^ z$~k0E-|WysyDu@c@%E*vdiq2rH<>EqiD_ep+OM8LvyMjrbkZp`fq~A8Rn4lQ-~bTS zNxQKm%Tqi+ozS^mSxD6^gcq+0YW^wqi&pn8?qxa(=HgY3Q#N)*YBh{L$+`_sPieoN z4CX{3=wBu!T!vYacz))M|BEJ&G|C}uZUSKcP6qp){ttLgZxvWq1unhns`R#R!TlKL z8}B)4v8A`AAfz7k*NR>r|X5;@BD zl8H5SIleObasyYrKpUQ2M*bR=tzXt8-aNq@aGOsq!L77W<5q4O-Fgbi8H${d z8Dw%elH7o3(7n}ik4bJ$A-5Br(j&c4lUu6}rx_pVsp^G9 zq{5o66S8`i?wF6ls}mSfk4f@a&PYRglj>4o>L9<&(~Pmyd<+ZRMJZukBfw_^9BA@M zEuqotq&MDCXeS;A?Kn1Q#U7f>1|I^Hu)&ck6r#*Ad~nv{WIkBP)4#_Dn-F38D;RW> zY|OPLY0iA%;-V3)iKChp(OIF~{@;8$O5KOJhq@1c4Qgu4)+F{3_uORl*xh2vQSZn* zGtQ{YXI^C|bHn!$Q{#{&j-c>FCYwc_D*~Fy-r{%}e>~;8kK=BcjoFQp5-VrYOn?}( zjNt}pk-RsVs3by4(k#`_pwJHC+G@^zKx{=9JmgALzA}|Csp|% zOY+;3Xo5ydUnZzC=?Ik+gSxTQJW-wdM1p*sf~oy%ESS_>PUb|f)f*&JnQ-bs!A#%p zbY(@ySLRf|LmVXE0QnNkdXhvcX(OQ0$AUU;M*X&D z?2Ot3oTM2wUOfPOJ)`E0NEZLVX>e4s_#03E-i(@t45X3SKbvupfidZlC|TcS*hWM# zf5W$u9*-5=;v^qOl|#*;#pc-S#pr#;qyI;TWZKR_GH8$$sj7#dCY?`e3tvHpc`f># zc`bg@yq5Nu*YeHgbfd5sulc=sUHFuFy>_d4z3xxu^@eWq+R$ZQZ++IhE_=_s z2A(#rtG1cf)z8Vb)x8!n`Ga}e%IzP`+jegMY~J3>?K9@>ecbk%xA$|q-MoE>+vm+& zQT$#oZy)7$hj}ZT4=(S!1apMp{cxyQhv@_iNraJgzKu^SBK{lQURVKScCr9#6Sx3;86>MVlTG}h#jRoH| zD&Dkp`NP3o?8bHbc36xfkzntJ4G~|je?x43*4pMBL@12MZ+BzfC z3tOC(Rh2cW?jl&?HdpvIM}6I50x#y`K_wo}fkHM?Q`PS&ZZ--rx@*Ul~bNx5|q&^DG6nz&Z`r-o;Boj*SD4 zcyN-Q1&W&>}mH)DXdIFosv{TS|4fZI-y>|kA!Y2CLGu!B!TV# zHH&|TyuMix{OTEDYiF^u9sD4 zIGZiwCR=0n!aTkSvqCocV{1IP3pUwbR>A!wO|fy@(9f=|`Z_z*c7c||a3tJPBvFCf@`LX``R&27M5rK11bNY$ z0BpSEaTxDd=N56esmzUE>D&y@R?i#OQz#5>ICSdiwc$ZjmLGNq6oOZAV6cE_J)vwS zQEs>(nk@x!Lneq8p?f?j;meHbY+H|~H=IHSi9|%C!6dXnFYS)_QBolj9egWLNZc)N z%8HBS^k?YPSYYC1Xl7|cCB-ShGtBT?CD}2Dexr-DyNs<-#tK`C4zWri2d^c7FwgZ} z#B!}NPOUZ$+1~aZkRV&*qL%>79=yP~!);uG@21;(Xk}{Qokc57E4-tK)A4r{5mK|H z$kR=;rA?es*07f>*48|u(rv(G0*=BG$z4)3sN4(yN*t#Y<3tHv z8ca26i=t-arwj_DaM<`AzU1V|BvPvFKy(sWCB)0e9IXgC+lE$O%}dZ&Tjc5U9#~UE zFFZZA?(2MN~TWaEvb_Dq!a;4Kz!4Tw)_jmxvusLa=`xyo&|64&NXG|iYH5SjAzoV$@z zi5xPS9FbsMg>-8EpaQZQIqWa!p#p1$?lbYsZpwpIn^(No>t zGO)31O#NS%`g4=8;ZEUvrHP5aEIk6pVIdc&DIAxg;=oxz{Nf&^7>5XcOSoCM{76qY zKb1{L$vYm0TV97;I}+@|Hdk1Z{(6}NwKzz)7kFbTX8eTIG8INi_IOZ>S1KgGd0GLk zq%z1k0_-XMQUjAXbWYs&*v?1J0b~zyI}X^VjTK!y!&Tx`aVy4{=ylM%hl5pJD<*Kh zij$Lf+%TiPD@u$OiF$EZK+Q!u2h@e;@`oH$Ee^ibcBXw53PFZvi{JKqr5gWz z&1R&8g%Wa#Y%!97?BG@wuFP0IQ5;^1GbF4;s`@I`n9m-c)9WK5M%d?)1`&P3=OX;Z zJ7=@tL0IYEdRfSIR))=o0g9~@j^(IlaFvmhrcdctvM5(!EMGp3SgRFBv_l(7I15k2 zS@;E`Cd2dEeE6HE+v9WDUYl>*X{&JgD^=iov{HYQj#D!EgwgPR+?0wxrfruoOJF7d z$Zd*o8k?(h)6?y@yx!A%%MHAl$jN9qq#r4PooC6TCA%7i}i4^(US<4T&V*j z*HqyH`H7l>Nf=Zg?@8_HtEy2?V2SHrPoF_2I6Qn7D2k)Z3CbRqX9?D^Mx)C)g02WP z0=2>H*1w4=&qH1;X`SeVJ z+67LI7g!(9+T$GzoH{r9@)$S*!szyF(X1GE8zDi$wRm5ys&1NT)U(CyBHAm%n+AP! z+qUq`^2zfVJil#w!`s)CmA=^~4#V_O-8VB)d-_ao-I3+{XtxQi}%XegUL8zudowVmRZteJa0@XSS06cS@M`ycG@A4gyUxz z9MLySKZqK3%m3$~d>l?o3+IeTwntR^aayW(Wf5A}2HDITD zfaZ)8dT$nO3uzST+VJ{BjtKovH5XA8Q z8?2Am9}q#XwBu&+*ZZJWmo@ywd3%Sp5-BAd+!U_c7@TjEy9-YV%r?dw%Zj}F8J_(x z0;8ac_=<_(kuM^RdJe%8iKsY5B-4sbqCg@1sCLv6F&6OV&wrFDyD56-&{liU$H7Fv zUSZ%;d$H{zTyMvMyekRhW}N>4nKuN`GBlSBRf9sMPZ=;-n7()Q!7*~SzUlq?PaR-v33 zM>cHGDp`L%!d@h}3(e_IKVa8jNVlbZDqNoU0%6|{HT+%Hf+WOj(k8|a%Fi~VZvY&uf05gx{*mT`$!$X5p=3pQ;~UvbKNfbo&i%=#tb zhU8@p+Wv1$jfB-J@|b-a@q zpWVrl#!2HeTobDBOvDe)C_{`679b>F0aMINOns7|DAET3OJ>45s0i z531ln{(4wD_dadOwpi9U+R9zT-%ML%eB9_>3+vW4ee~w1){3=zw)gE87$tZ2zty+r`My0Sz%#x3SD*G)Y5|4K zBx}&=J>2B*?C;xd`y~3;wawqQytOAVZqK_>8||p9d@GBC&BGV(#bTjeuxsqKH{R-3 zrB`WEHzKQ1?EDg2d~JLdE@&U6&<$!IWfE9)o8QlT2JSRt!5zV|l2Mg`xxNq>_@j1L*h@E}mI;RM8#|h-GWom(ZAu_sF^sx}4 z>i-cBDMY#}j|mN@4OF8Nx*W4ZwXbv74tuuLXes^rZ^cE?BZvbFfl|-e!0pKC9Hcr& z%t{|)8W=rD#gU`YgH-uR2dT!1x4L@n1YW0M@D8u&fiGC0Jj8j{Vk zZcalyRHz-ME}zcTQjWu@cY68|WN_Wv7>&hfbL^`Uw3xFu;PI!NhvdxzyeTHac<9^A zeX*Q)2GQZgrjlao&oZ*UL6@fqUZQi`yl~*Ea z+0ontg}p>(Rm+8S6185+4$`_Z)82V;u_$PKt;qRMc%C!j+!!V(>MVP|*!qo?4h9`b zR1A(pQEw`V%(hn{LwrSGt;BjMUZ#1w_4_M5yVMVc7@S!SJ0TMyvyOQCj2F;tG0aRM z%#^n`craQLDI;2!69EM%@4{Hae0PGNf>Hq?)23{BH^pD&_Y796?_|l0kSKXkIl>j5 z$oDgeRCG|=s}mm=K!$S>2XTuOQ)(tXNjm#(Z+c%F@o1!+-4geuOfbh7OyA7MNUBtTXBbag zXV~|6&^FEI4mIyWIC@5eqi5C@tVwT`6O3aME$QE}kO&xr(JECkh(JF?h@m=nW3B{9 zU->_fSlyelWv17Y9$HF-nYvAlxv`+zIO;h}NOV=s&Y|IZysfh_H#mvh z0wa&SQC6I6Pgi7>m0Yw>ohcccAD6;e`V(lOrP&xbbH+T0FxD=ColOyT*~3*0lwemK388ysioEPKFd(>Za=Z z!@f<3iF6?B%P}gl31em3V)MBeZ38QuaF@@f%$mbjaKhSv6y3tRiPaEVxN8r0{9(->^bjl-AL zY*7EBSDMFQ71o6Cyn!%;?Y_svH}^4sjLF_YcIZeXyJI2AX=T9p9#6or^_}OFp5;KB z>Og+HwShH>mOl0wEj>VwbxYmH!MEv_-Y+9W3x-Nu_NUuf^n$5R-^<0s^Png&8qHfa zs9Qu7p+S$u8Z^J@;Ln1JrrJ>LX4jz}Z_Ys|>*jtp+zUQQ)$ zP<7-bTU-zP{o^BQ*{`@oXjcbjv$Y_sXxurGc_XaIVX`6!a!$bBZjDatwq6BOx`e;{ zYUAU3-nXD?l;G$@D`85vM>DyHe*{w3Rgt^%J=@UkweMxGeSV?IpNt-ki57SKN?6oU z5qv-4!vw;hdW|>FdU;-+8m`zC zO+zn3!!v?e(PCz-kF~O5hdE;lJ&aqHr@Po6DaxzCsWFf5w#g^(4BswRiM%FHtr@8($*wJKBBQP!2VLp`dO`BCyOj74>TR z-Ze@^*JWD9P|^m4C?!Oc&?|5Ml}S1s$l!WUvN_AL;>-|-4+5@r3o?nBr|$bTLprQA zR~MRVR`9RT8X`)wNt_(!!gU|>64Yu~Wo;6#Qgbism}HDFdW#DyE~lz{(iD?ReI&~X zAF%(MzGkR*^m5`%e9C@ZiL+~6$t1IeJ7hOhs!-2iB1o>}4vDv^-~9U6HyMdH-y3}+ zcH|XEHY0ZA+o&~el$J)Dae#j;I=Cs2`mheEx$@lXu&lUQ?|Rm;s8%6DUWAV*f@oEI zZ*;C$VW)%_h!wWth-obxZ&YV^Ue^}b9*@sKj9}YKwh9M!#gFgiEcycZ%$wj3o1JPG zk2k<>=DOJE7QvJzf$%{#iL(luGuE9XCWQ=j=$B&#CbO)tIdkPZj0=d-d?PV5A^k~7 zmc=S@xzAKv|3hd%Y>BBJU#8JFhN-ig?1R~a!H%^qb95~sZ;kA>yB?trh26CxYqpQxYh_X^-}; zk=E=M>9|`>mezPm-S%pP+lal5@*H||1k!Z`YpCbfQ)DFBkk&DlR(JS>Dc?-9Kj+M_ z9c5ijg5=b<5j$}xh@Tw}R}&|SWa|74rMntecT5#fXM8>=J$bj@Mbov3?Od9+wq=qf zI9^Q$ba&aL>2cV+wx~fe0=!ZKw|AT?;aZGRI*D=l7BAOfcBl#eprfjacK0_7dZKeI z11>Mr>pXWjFoi1)<&ff1&q<0)Qs(HC4E3ax8Mn^TPSmUa*5&Q;FiCY&lWeW?!9ub>A?aVqfJ1)5u4*3Q+Mz4k47f%M;%j zamiK{>guSYO{G6?w|Jr)R+lL-$mR)H{0sesBjZn(5p;Nm(_4Q_0-hE`EcatQk+1OP ztC!Fe#4D4dT7KkCr%{imNic01=i8#`#w-*j^HV6~$waC9%a8Cl;kHSC#+wPg(xHL~ zn`l?ja~KG3pJc>~lGuya3b-45(&%!AWJ_;6c5KL70v%eM&9G z_^Rg+A0PWr*uQAtgKF!;Bijt;kL(z1{11R6Z8JQ|GoSqN^qAN*`ed(Rry1c!-5}$V zaKBkW&Rh0ovE5)hoV43euK|qRZICw9;qko(57+Q6KEcHI;EuC2+MzDXZ zU9WOGrpgJq4JGo@VeCg;-4zb*Q2urd?0eZk5NDegST@R>iBI5Qx#(8!JcMiGRo{1y z7k>rQm@pq_Q{Fts8*NPZv-ClX3Bwro62^pXwZVLkF`-*M%)Mz$_{|eyE^rA)phiQi z`IyC34TMCCDmkGikEfGKhgHE)9bV9@3V02e`2uDb_n%p;O!})nzZ7tM)n^wt!osiv z^xYE6vh~@9!%Lies*>O_{ePo{~4t1BVeTP~v*|l9IRt#i5X<6qo%t*quhd!wh zGsLZtsw|8jn<-3VZG2WG;@jmnw#clgfA|ow?=VKpuT;y~Zi0x<4>rAPa7;UFwhQ$fy(P8eVtD zl8SsOQi%ZwN{2Rd2%4XWi_+;|)wCg<;Z&sFB+Zi@u?pPy$j+y=LOw@U^nD{Z5S3W) zJ5?3cNXk9eJ>OoK^-<6;azMq!G!oGu$ zK+!jiU~jyIPYC{{g*)OcOs5vDAMH{<_>GY&w|Y5kDRzk>&wplMV8r z?oW*aa!d5bpiVRH$iNOCUY0@dt#Bpxnc-#JAQT@ltYMM@y7#7sKstsK`>bR(f0gxIFOXt*LKK_WldJKx?g~=aJLQB^3mp<>WP5J z754)O7f}2s)e;hbPw05Yw>LIbhhNa2)|;ZPJocRsmIyyblpA%ep_ED#-r%v&IdUs| zbw`wkH`}|`OG4NGL)^Q-M^#;m|1-%XOklzcl0cAGkf2z!1tUrv(I89+N-!~y5H(<{ zq-n$!VGfTRh)z^oH_l{WE;LZ!i!gk}I_SW5`Bq;rq)Sxwl)m^fqkV~#M%LHN z1~Uc9VGOAZ{u0+1YX=E0ajU<;Q^axnF!t$*XP0_Dj(zb}jOTfcS68OFw$QOU!(6*i zY-MwE*?n)y#hrlq{f%JZUK!WU7AgJ`k$Ch?oq2czW-*NJtXGRa_`~vT3b-phIJXNg z$Y@J;^U|1?re2fvbF1nlrHm@q&Le^-y$_KF#LQ9a{M3V#Q8*yiC}k+?VR4t|5I?EU z0xvgeE3|)S7C-kgF~-D}xaj)~vb1hjPMCHX_i6R#7)aG&6O3LRytwL0^(4##*$58M zuvZ3faBzuAmwu?7>WFOUP;xp-3X|t!cse*HlEwK)^&KP*@m!TJjqe@4)Qkg(4 zR^80#97wI4x`Lr|BAPx1w=JmHN0sbaL9Qk0V3Kee^dATLEL;B>XG@p1Xy|BqriQKV zgZ=$iVeJmko=EkElJ9QHND`cd>VE(it6a-@CU~O+_uT?rz+$2DN@;U0f9|ZMEQ|*^ zKQ5O)kNR$(=gl*2Q76$r`{Q0!hf4A}vE;w~O7gevA^BJDj{b-g`%9`a=n6++5QU*+ z^{NYsgi`4s(W}$}zIiO1EWuo{K25a=guLw4FP%@KZ-PzK9nO@Vp-m1qU5&y`g z;f8klVRp1I^sKz7+S}|glv*nPRA7?KQfa1+bOuGpDK1fm%TW8wuS^7GNu`XAa6<=) z3rp1#!~oBLmV0q7s~TQhl_qP?QuS}~7~><5NLVb9n!QNU;QK$uvPE&HSD_duiIn%2 zb<+IMRrhf%J*|6pZZOe&(b>J*El;j!ulvAHSI%ylg||bGtZ~cJtbj{xv06 zV}=_fPRw~!)Fz55;h_3$nuF7bCfB8DTT0^s75z5D4!5H0FdpEQ-IHYAnQP4IV+apj z+^&p6lB1R!#~_f!V%b=l6eT5*vznFHY!{a?7ilz;oCR7#d?sc~V* z2&6zG8E00#ks;*$Wp>l1WxYe1m)^#LphSIHAvGWu!Q-V+?d7W~LA!iH;#51UY$gQ5 z4vyCc%v2q?xysY6jsr?_w&ls0M@Ph?zAd?O4<*1dw7yc)KhgQ;eIk<OvzaH~7yc~I)9vmCawt)5{*dnI)uJUL{-&EGCTAy30Gcxy`}gE1*@j7c2< z4@qn2B0#4!dj_w3uZ8Kr6-}S&1KxhU^33auGq2amD;(j^nU);$<;eGCgorQ3V1}$! zu2bKi0Y_5b97TPKiTQCuv7cCXDr0kkZ~Xx=VXOSF-ykr&jbI_(6wA!^j23^Yj8!Ay zXiMj&yEU`a*Tafyz~J1RYPT_3&G-(TYs8Y!RGTSYHbH7Fjg{!7In};kdk(guL)CBr zx~L4P<4EKU7PFdp+_YRk(OZZHw#rl46JR2}!jMD8q4EyS4PlRQluNg`i8)ifT*=Jq zK+Vk=Oa7_nGj%?wH#Yr@6Pk&dK-SN!=4NhhNdC-^%C`%{eBv0O8uPo z=ANYRwGFi>u<+F*aTIv`-A$7d2St*0ZZ)td$<5ke1W=#!LvmL?B#Xa-B>y}}YJ+3c z@UKvx9HYLVBbrm*VN8fFaIGC`4MlQlCi z3dyX63Mx@Q{vIGLRvjNDsU-^Ud^HzA9&vSzo&~QjQYRWkB98X zJp1v-H0aZA{W;KfYv)SlS8J+&T5!Ghsj1$lMol>yOwWFsWAVRi3Ew_CY8{mm^4|f- z`_u|rs?0ecK)wx-06@Zk0GHSRi2x)5Fzl=>#G9jJlOVLLaQW|b1#8I81+Z&CY;Q6N z0>Ej9vZMh4cG>_;7iGx<0{p8DFbIG_=cQ*QKyW$#y>3kpx1^W32gEkd#+Cv=%76fq zZGgc53?2|*kPX1hRyO3k^n8FUVXg4^@AYVUJOFzJ#P&x3sh?B;QU?T(^Xvd{YkJwx z0Rh(70A2vR=cVTsO^?riuTSVHja>4K!D3_fKLGUWIzCq4G;k!a$a&imUTzrVSmx#I5~$0MD`qTkn<_XJ{=I?7dF6W z0DLweK(!63#oGyP+SDc)#0g+9$ksSfqkpTg`Hh|Rc7Xt!(#wv&c9R=X% zdCA!ekX3lhUvx|cTG25Q92*eZRvX(t0Q$#(02^$8ZUDLm1XyAN90%a|dFjc~^z`_P zdg9g7Ga#~IHnI~SJ24u6Il>FhC8rrUx(4IF=se@!2KXoA-v)?}|AEQ5Rg-hv zUvylv8+gGA;RWZ?GtI`<13d#X0G|zTeg^P)k1kQ10SrvfivU@Lr~E~y;?*O(;9PS4 z-A2|6Il=(W1*o$D;%wktfIDn}I5QZS9KQydM@!_w61?>e*w0yPq4P7{+duFZeGn)3 zg8}I|f-y6d`ym7m%q$Mt0Ow~GzqbM6%wk}IHvwc7e&jFuC{B(D4d<5rTQ;(|;BYR$ zEF0kb%p%hUh%<|U$vK5ZwN?0uzvz=VIRgt0uL4Ky#07_Q$@zl~aDHa-BO4&jECwcL zxhCf`f6-@gat0P0=Ge&Mg2TDwOtb;c&nyybfH<=ln4EY2A+_^`zvzoNIRgt0PXb5n z#07_Q$$8KQI6t#kWdp>S#lYk&(ByRci@G&0fN`uCSa6u6u@#-4S-5Nfn8k{LnZ<|4 zq(nt9ixna*3{1~1fULrk{-Trd>KRyY_!o_AMO<(=w|Wd4;QY*Dp$!mc76X&>4S*`F z!qXN0qSM~`W4inEhCDIl3vd1F@PV`B32(!2bO4>ZG=F&CU-Z7N)c1jZf4~uW@ThL& z52%)bImqvAfb(;Z2W)^i2N}2&-vP)f{JX#C@9|2NCC9mSHp@m9mpsk|$g}~@&q1PJ z=mNz#$iU>h1&~$P=`ZSxlQZzr;}15nxa4szIX|)i&d)(s*Z^@3GB7zeX>vaG7kwHh zXW*sBL>pOL@;H~A1RLP|9OV5Yx_06mWMFch0mv#m;x9U)I}hAs#lUNiAKTdCqQ|-P zth52n&q9i9fH(^on4ZftJ^%0*{UcsI11~*XHnO#FrlD0_?T{;^M}@ z@l<$Y=vn#z)d0Retz z1E8r~kSNm2&-gxDdI=Ho6+)zJ{RuHD$s+pSpZ!h1Y`M#F#tvejP+9w>o%{v{w|9HmX8^-q$ z^7xWG#_|2Y?;XBx@%>%CA0SUQGcxkn%vg3iRb#l>gE7pRx3krdXw2p&;Q8M~Q!P8> zCF)P|ihdtuc?vrC*X6S;uIwK|&6?F64&!R}0wRM+dCeWfx0GN8J-z9NY{91Iv&qAf za)kQNo5`vR*K7n7s!F~>$z|$N2x!@F{}T=V@n%#>j$qa%r`hbp=6iu1V0@lLup|6P zR=6*lYW>++OH^MeebA-(4kDC8EJ?i_|VyI`%xShWv#F*Z>p@=xue-NXc84_@Ed99LH^lI|2UxpdoR zH2t@aQmALyJ{kt<7D=#360~qqI|siIWKcy0{fl1Sm%&nYT)0#QJHD}M&R3wW?t_Yq z5%U%GKiDi3tD5AAFG8DtPpHHdMD4L;X}mMiCB?N`G5!7)tZKQ$Y!lvZj_=mpbHt{> z=5FT|`+_S?)l%C!;)7N?p&bSM5z9=^oCMMf{hkwtK5JVh=kj4y6$5!k<5 zgR}QNr~B{;^GG!NC3Cl{?tR^f+pQaW!9VeeNN`khr;k?;uL+SoOT#xrZ)*wPaC)iy z{Zjw!Jee?Wuh~G5hV>6A8xk6_2@{IIzm&4)g1#aI<&KWu=8BDt9quFI2x| z>yGU-f16wy?xB~k_5UT!92sOT@MN0%IJL`N;&L@s@)D~>+|{vJj}|wjL}7(3CT}H* z1CbcKl?BDO)smKq<9QxOZZNGxy<5t5y&82dU}dsbyM*gsIH$vThMY{{UfPaeBDYOft7oM05-ZwavA-Y<}Xd#m97V+pw98_(`D z8_$bxj1M_`DHt%fe!)&bx^|6iTQL^zo*ka?$IV&_Y0{8lrY$p$} z;VhZ5;p{F^7fE?rN@xc9vX$?O z&EW_2qkKih=D_lb&C4n)Hs5pC!#`|zh+yl<$3YWrkiQ{)Lq}WSkQ2j`(34vvI=8o~ zFx0S_*KnY=ic$3|$mf;QaoDdhfZGDKsSZa|$k-eTyv8*T%&%C&GSe>RO)P!!e`-&{ zVleBjN>Ejlu&h!N;dfuA<7oPP9#&WiBt8Xx{T^j~;ZeS{DHjfSsRi{LlF49CERVK> zB}=fBcWMi?rb79r4$|XkJn6Dc(q)qu4%}sbHTUdBf5=WJwi3UWGGpG|;|iwuTY^Km zMnSN9=VSS5q&cV(}qXn30%B=2kWOfSxm*o2o9vvfGdZZ zGp|M7;t*(O0;FOGVV-oYoOb+8^Zmr2XUfZsgUmLk+37U8@gmypPHdKkkH?GV2Z_y{ z3Blx}zXS1L8}1Wqqxwz6>Iq+CF(=8 zn_{+gz1%QnoeHLK-lyfb(L3d&U?@>n2)8IyKl+X?q;Rug{x<8SHF(Ez7PzOpiI>*F~Mkv;Cmc~ zQSCQT0xeVZyVSTwwsWyT1-l7r!MpJ#s&jBrQd4PTz2d zI6*m?K``L?grt22JhCqrw=`y$nawFhW)p^|cfui#A1cEnEf>=uTM}c$Awp?k^ywSU z7FmA_gNo6A15&pcyt+iqWUR_vZmVFbNa*m9LbV3Iz}drwrs^b6MTT*#0jsvbh3Y!= zE@h#bF`*h{axsjfLuE?k{R`=Ye~D?DTZX*!k~XUFN=UFDQ@%{?jc*bwvKE=h;6A5NkbWr3V{4Dhp>@*ul%)t9_Q3o=B>+ zfJsqg>hQ`(CL=>WKHA&Toiv%5#kp$?e~nRQs{Z0+#c#;9a^hf$ByQTv@Ktt9O#^$( zImnqiUN>NGwjaB6wb!i`@k6v4qm-H7JejgOsdhKKq;~gIP8BvZt@)_c>6o`^ z#3pCsuz8KidHy3SzgS|Q{-u)-W>g!4sqN${XVu_Hk{spb^o~dU9AX%zi>-W-WMW?IN>dfj5B)@jUkIvF{SahmKh`cpBagGd^6j;=Eq%ly0#bWuj<>e zFV0Dt{~&UNXK65Xk$QmvD=f4wGDv;G34_oK^`U-fYd8$2)pj7t)Byt99AW{O-BjMP zU%T>)d^fgexAe-pG`7GW9$(OVhD%EkItH$sd7RabD!>RlI{i^ztuF3T%~018VDAB5rNkNhW?X?%S!W~0}9(`if^+z}kxtbEtZN-#zdIP98lCK^6k zl|}X74&xOIuGq3=bkoc2W|On!xY(XKf*G3hx}R zWv%)QgV^UYv4sZQytX|X8lMG5lp>Q zqo+VgQ%TeLIF+DoV7(C8D@NVM^qiRz?tS1G0!}nl-g9O)@|VH2jQ)dAYTT!WkwAsX zMg1$}Mykx71fxvdLO^924b0kl;Wc_39WSFKkAVvQ*R>jj<@Br{LFqGhGBlzGQT~i9 zEm3u(D=Ukp-$j|s1+FOCv5XS66WO4w^B$42;H-m6)r&Ho;I$&@$#o6r1Y{66p@jpC zUvQv+NKvJB8=jnWU5fe_D4q-sT+Ak!rxT2?Z%ab}AzybXx1w>pw?p)+-ui!$zED!E zn;nXMQC|%$bVNzXQtan z`}{Bu%Q02FopG5qqgWpW?LU>9I9J1@NEwD%U zn_hkGXH=ssP+xqDfZAGu(G!FN`wNN1d;g->P|a}Lhb)hRBm3IJDnArTj8#}91y`)` z2HF#IGEyuzxLf(|Y$T-B2Sh@`^EUNf!3oZQr!7}*w_`HMjVzB;aT*ryz$-HJU+pP) zh13_~l?3ZW=E!lnt_d*LW(hxIb%**liC!ZI6Yc-v%&t=EQTvLa*Gou*7a^YdvWBI*0tV?TyCDm1;6^aOrHh43#`_=o6=ZK7x;4WUDZkce0L3l zB5I^?Oq+p~^?XHcYY2bBK^N0FP&wJwKoWJ%{PMhVD}Os+a$2TtyE5S4TtI#lcf~zabVJips&+}x)9rA}Jvql5 zxj%JMC)5yxcW}W@G<_}e%3e9FqIaEq*2ZUOhwM-NFO&wqH!}@k5x43ag;n@p2rkK) zY}{&X+-ZM};M8B^mv!?`~I>tq>v4owxO2Q^P z;T$mMS{t9|>+;k5DO7s^ur}`J{kdBH;0i@Ose=y2zJ8;THSwh$=9Q&uc-L!uS%YTg zuA>kma~>6{43zL|)-pR>tqj1*%BqsXHHEj;ZRpv9m<;zAL@|euJvaR<6o8!X^>Vw% zT-TZ4nG$Ta`ED}ymZ+)np*Ox_^;c@mlyk==(KqZ`V>V4Jln<%2z7HX#@1yC=2h=Pn zEU&xIrY1$7OOoW~eelP@oE(ZJGFyBF#vyB?lrTw<0i&si?UMvI6fc4jIo16C2PNfr zw$cZUneInJ@<_DY!%M5K!pGv#UzwS-=K-0JaeIJb?P>tBxsJ$xJUF?O)!ly)B~A`T z+v|Vs4JtFd9NL!lK?T1Mp#hf)vZw(hTT3vm~j} z(Xvgz;C`XhN|ve2LZQ^<^3wPyprO>qCALvoCY0Jk*RvXBY=lx};bk@M(eIn(y;j7_ z?Y)5Daig+H3UUkbLQH!S{2mfCDwi<`&GzYZ10{@Wru+L+4~6QfcIqMLy5QB2HcCo? z#srn*DP29uB)lMJhB0)eU2TPGtf-ITWx9}zccymz$DhzB=ebH$mEckrlDTYRfUqkU zge_d9u|6v;`)&WJns1bF4Q~c_Hb<{Q#K@4J8if!jE3u|vs=fJh%g0)`bhGis5;g^4 zP4H!A!pbdV$BmJt>f4=+V#Bj3nPjM=WjS$@xNE;|Tp7-DviW;?mA5ebgIdC>*r&f# zXCMM;EQ2E-=?ofw`9mNg&6T-n^l$tMtItqM`CB^wonV)!e>FNGylxlHbnnLs%WP6_9(T335&X^<;ZV4+pHICO|)5|?0n3)gO|%JJ-)RD0?& zW1$`IOR5zlYRmmnav{tcTZ5?*n>2vE^^@p9_1r@=_jVP?lr{Gmwe4sUqi?leB7Tzet z&B$1Cn?TIz50Py{l((3NeZ|>t&#qjQNRPZd%cnM>wSgkMKl!}%H##}QS{h#KY8~VV zWrV-$6OeFuel)wX5OmS$^-M2SiIqj9E>-W*)9^LeHYdv?;g$0NiA6=B#O@h=^>dY7 zf~c`Lnyr419goxlYk|A6(i~B8M~d;8pz<`gyTX@E<$um?3heN=tz`e^@m=B$Bv(6+->HV9N}y^f&#>%nyF_n( zpi3m@BXW#qf;peHNzBXL}uY6N^N{}p!^;S=~;T?utVYuOWc~nXr zh69HSi|g7Bl1hE_rO=DNQOyE>lmOEYte1{IW@>a*zCfzYpT=uheBJ1vvbRaql*ERt z0;_t-R#udSvgh?ks?F;43EqZdREnkR$^4aMD@zt@F0PU@ZThS>?qTx# zf>&9-s4g+*W8dg}|%_g_`tl&rr{X`(vzYw{|(rKVKBkXFkd?-yx zQ0nSKlJANoF_z&{Vs%=$;V>!j@>E#0p|VLBofD1FcQ*>fnV`8UyQ!k?k$?tr=9)bl zR(4g2Y#N=ukjdOmU8uH7Cwbl@>cd>Tq}#{Esa-BU#LfIhkq{`o(@3#PE`B2d>+f#z zltj1Gk|zTuIL*>c7=2P4qfnb_{~>7&ZI5BsG8fS4CZfVRpP?(&Ju7Xl1z2{L*V9L& zFI_t|dUc=ZkdDAx51#0%g=#%d^UnDqsTZt|H*-?+`b2>t9$dpp5j=(gmLk(|>w(KuNaFbi0 z!&|>w()s<~`akm07HAjDyJRMk{o4-M$yKVWUiUY~St?(nD0fbv1NT|cK)c!MsXHw* zNX;v=_0(0Y9z&;wr^;^8d>cuiMhK{GPug&OX))tZ58^`g6IL)b_la@S^7o|0QQWj! z#ybq6);Ti|bE&h<{ep?nfJ!`7dp*+oT>g3+CesG&p$1g23i!w!c$fJm(o-LcC{lYl z=EF$C>>xi}laJe&OQKin@xKn~Nza9#?VLMKkw)CV`cN8^2O2ukGjQ}HN8r8U?>&SkatlmT6fXdP6;QbZ-9vNDy!emscnh|Ht*rj?% zY6aTWzG+&V?l3D>eBRRLyo0{ndBZN*X~iLge5ot>>f7Iak(!R}?;b|or5RP!BM`Mq*==2Uh2A-0N|W8FkbYBaey-b&Qqku`(Lo4zF<4WTSM3eT%ZLz#YAJ zjFntSmrO)^q;Avl3oAck@J*}<8{XdVPK2wkqRyzOoqGI(*8k^{+cpKFd&MW7N4x=7 zA7=XhbiP#hgHVO#k@}&gfw8tqUhoOmIgJ;!2Ou&OoolF3U{wa9(Eh5+DtAh4PW?L3 zZ;HoT10PZy;y~V-ixT~v=xVM&c)n15Dmx=^l0&LSFx57K0-dv3p}#ikuY>Aae1&#M zoGO)w0$-?6;-oDYDC}IJIOEy_l#qy$X{BmPM7VMqGmq|p-(xpI{grBvrcr62Ftq8n3*Cp*H>4WWeQb~|RBWE)5vC1t3m z>7v4iQIY#f)F@%v+DNor+D4pFX1@|z#J+*(NBl2(>lZs&k`}qW^*8f^s>J`I;W;iv zsP)!gD?wBk{b;Q#9GvFCq?W~LF(y2-P#Z+oWT>lZWJ-|@r!Po@|F}tg0q;u{%*_ZT z<1AemVxjt*NF8ONi4+zFYQ&Zy$!;6kO6sD=B0?rFKhI-f8L4zWm_$eB(-d zN#?l=g_NHnR+N?D?kuBNeTn8ak`a&D&@bjgV&bgo19m=PRW@Pwlxs&=W_1R449MtV zf#_Cc@M`iht21TBHxf$_Sa4hQh-ikdW_;=1^eY4(IE?nh#?V7ilZJdO2L zj*SDovZfC7th%k(fA#vgOmQ1-z!A4~vkxZ9W>5YxW`N{cTsIkC3oq{KPRunfk~?lh zhm$G$QGFD+)t_k^@_~k^-2T^Vwh88yzqw5uT5Dc@8B!Bo;xbSP&y-S@lnNggelt(_ z%{;exBFe_fdTv!>rp?lHyPuO0pL3nJVP68Z!?^#m40&(Er7{rZUasH;_UIp?N58j0 zMHrw8~im3sq|nmPJIN>b7C3 zo^zdXv1T`!c5Y|$njw-CkZXWcyJ@D_RN<`;fl*)5W9`%v!mo&=KVY)ILw}E>qxUQ}a-n(=H!&?!Q&YlkRjIl5tsCIDn5)xu(<2 z?z~TZ@Lw2ujbS*+T_$aT*R-JaFVe)unfhzg_2NtPHlS}AxayWkgxztx8=s>9Vb&z! zKo`T0-D0}UE4CI!dQO+0^^Ezi05N&y4D$Z4j#vL&*M{|MBFg+b7Z%CZSj}=PPiE-w zVnjFzIb1U_x_XSo4uNqD*;%!4Dj4R)ynJC4r_C*{oWS7???wxh892t^Q;rS0B9o=l zl^=r!Jz=v26z_SAB9F?2Z&6g;^}6VHo#hNs3R26}A;H14tIERivaGDOI!d?re}v{i zqVF89dye=1hb3gg7`gTPN4#Rc062|fGgI}+9Gdd)@~53Yu^ITUyqeYApA?^kON=B2 zqVR|;Rf}%gGBUXOQ;$&A0=kg+V;-Y^Ax5C(8RmW534F0o=xrFo(20-f9+|pfEqYMD zs+mWos+7!hKN2BiaGArQcTr2w{^5U5<^Ms<2&L88!r1K+52$Fd)fGCGJ;QUUMuFWI zc1gkitY=EDL-oHAys%C@$JMf98! zS4C+%Xyi%*S$aJ0!(3!7yhbCaJ1KMV%EcmM25-s9F|IJz`4U%NmQ$9t`Vy;XjCG3} zD{MTf7+J!K;F&fuDR5Er74#O7@pd>h(l1K=(XI=4wpKu6EV5W8kk_)9RAPrbs@<&N zw0FTVYE{PBi^2*_?O}E-JJ$90Ll}G=d3Bsl6x^r2woc?O?*21U)fE~6e;kn)S^3Qv z5APq>hqUUnjEhR~rKra0<+UfW9da=_R5!5OO|A6XkBM7tEr(cbJ-Y*I2i5_sYp_PL zjrP#upDL9EYa z&aM7ync#5|+KpRRBhAcTkw6x5(YqVWxh{!}_Z0K+WqrDlUQzLKa?5`dHLoXR912yx z7Ak)yRNfWzE|X0Q7qqJj z_~HOg{f~vi80|Sr(u`6NuD-OQ?s~@L4?d)tH+ii^hY$u?j#OCQxpOO+d&cH+@i>C= z$~R_|9~SMZGVfUNB|utUBFt8)aC4#g%@tpEJ_Q(k8Vebj{(Y;*T5T0M8NsC7 z+<8W~TsXj&;hxg=au3o94700{0Y~RM#NX0lRB6%lEY$JLE4Sp7cNqm%!J!$q!+L+* zDHBUS_^N0>a7+(R1yd!#nDE?a=baQ+KD_qnO|$3w_V`inrXyOGA8vCXerRp6E)Sb3 zeeQs7e>}<(#Lnj_DT!=-3-5oeKXFt^@DGy1fB0M0KW6qMt$8Hunc*++t;x!M#otns zzG;5?v1|5Wh0^Gm5%k?K*T3kU^$|1hT7tjYw{qKAmDv`#9|=EaaT^^U6@`u<&!CLMEvfAT6ts#ZA zRODQ3zrUys1a02Z3U7IRxM0w{WiN(V6*<{3mu4L(N}T@8rO6Ox;)!e%=2BX$My)v? zbMZp1W-i5}g}JDsHzILhP^NC2$IJ9uVO8nZ#!R212SM6W*~pv`O|PZHBcP6`T+1h0 zx9jciWJw)8Xd9TmOzo8Efb@Ez_gA@9Dcp>Olv}NyC@;9Q$3{n19tmJ?b@`c`R(>A4 zC4kEDGQ|(GhBB%XqA%O=o|O@_I~etF_RN0(p7QJkOuzCk##45@sN0(ZGD}*viNPh? zJ#UF6n5`6&WO9gh<5!Zc>z6ENx}*!fZKZ0}?JC9rbGF!l$x@JC7S&|=}jlG4h&1*iw=U*p=-yNI(|pWDoX4X0J!{^dWu@`yR} ziO0xj>5|~+N_kWF#j^6CE5NaKG+jb%tAK~3&n1nc`Q56Q1(@FA&+g94nZ8*HaCd0B zSZ!_!`2M|~r)(J;b7SVv*Iff!?XeA_)ige|hgs|tMws_>xN@pHR;IEN6ZtFnS@dA! zlgcLO-T8!+OIB26mHXxUdHKFdzT>MTW+{Xm9Ewj4X(FI((*&@KBr5wsP^WL6aT9T` zM6@We7!=R=PU_O5M9PwmCi@cXOpJ(qvck-PVl1P7gp9&5nfv7Lvu$z?EnC0uWhO3B zf26aQsNbU+Dp5Bvnk&EKpyE4b$PmcdESxv+kXnBiMReGDndBqT$!{+!>lX3 zPr0U5ga*wRGc7oN*4(+UUe05!{QHdZ9+{?&+0#^S=ldi)E3CQm06{XAkq)a;

      Fk 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ð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℞)Id z)j&zN9@OzbhBlc%ML8U&#?+Z+Oeq|4CFX3W1Gv=5$;gg$C?um~HZQdSNftbyY7zzc?0JhUtwy~=@R zMfc5>(Eny=Q6IEtAG(r;$(W!gS#W}dPKi_Q)H)4LpEKyhyNPbPOWYhc-z~#Nv)*mO z9NYs<8bHrdpgxnKHF;2&di1RWs<8`tktkDS4w6DK`d5km)gmD_A*c1q6znlQ>@oAa zLiDZ`nz0KxDh+zzVE)ZTzO7JIm`|FJ9eZL<8Skh18okShN|gCEvHrC|8T$PsD1wf8 zMhWsv4V0iAyUm_p2pW(GU+}>GLR}2b*TCHxbdzq;ZQy;E?$P}^%{b`lH1xIDl%luG z!1O53+e}BSyM1OC($|oQ#~hbzQ^EIWhkxyFL9DY?w#~Lj_u$1NBIz-%Mz<9X<{u5F zW+7*0$M~9uE*AU`)|TU5!vNU_t|o)4sWgqIV=A8v);j2K7WQDjGPfLkuB2)3p~092 zC(2}`uyi?DI#SCl%)YtUIuv5#P$J9Z5@eGqStIK(12)MPnSp9g`!`#DRqm*6XR0hU z4K+Wg!uhH|6=K3z2-cLq`^(_|OVEpD;7}DZKn+qr9dbYe7}bO<(1JA3hCC2uR~Irt z4^lxNa>1a&+AMT{Yz=H@LG7}`oG>@4XXPXCR1uyaq>0Egt+X2{CYd=b7jE6b5}+dG z$RqoB5|HQsi#1M*(+vcsU?Y^&aGT~kw0>5PVYq$c#6&S9-a0P}dFkFG*3Jh0Z nxB|l!7_Pu@1%@jyT!G;V3|C;d0>c#;uE1~whAZ%YRN%h>E7n5m literal 0 HcmV?d00001 diff --git a/PowerEditor/bin/plugins/SpellChecker.dll b/PowerEditor/bin/plugins/SpellChecker.dll new file mode 100644 index 0000000000000000000000000000000000000000..bc07219d27f5373c3b95ff75a09d846648a4d9df GIT binary patch literal 77824 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 - execute commands from specified script + * npp_exec - execute commands from specified file (*) + * npp_open - open a file in Notepad++ + * npp_run - run external process/command + * npp_save - save current file in Notepad++ + * npp_save - save a file in Notepad++ (if it's opened) (*) + * npp_switch - switch to specified opened file (*) + * (*) these commands work with a partial file path/name also + * i.e. npp_save c:\dir\f.txt is the same as npp_save f.txt + * 4) Additional console commands (Console Dlg only): + * cls - clear Console screen + * help - show available commands + * CTRL+C - terminate current child process + * CTRL+BREAK - terminate current child process + * 5) All Notepad++ environment variables are supported: + * $(FULL_CURRENT_PATH) : E:\my Web\main\welcome.html + * $(CURRENT_DIRECTORY) : E:\my Web\main\ + * $(FILE_NAME) : welcome.html + * $(NAME_PART) : welcome + * $(EXT_PART) : html + * $(NPP_DIRECTORY) : the full path of notepad++'s directory + * $(CURRENT_WORD) : word(s) you selected in Notepad++ + * 6) Additional environment variables: + * $(#0) : C:\Program Files\Notepad++\notepad++.exe + * $(#N), N=1,2,3... : full path of the Nth opened document + * + **************************************************************************** + + + ************* + * HISTORY * + ************* + + v0.2 beta3 - April 2007 + ----------------------- + - fixed: Delete button (Script name dialog) was not enabled sometimes + + Menu: Show Console Dialog + + Console Output Filter: Exclude all empty lines + + Comment delimiter can be user-defined, // in :// is no more comment + + + v0.2 beta2 - March 2007 + ----------------------- + + Menu: Console Commands History. + When enabled, previous commands can be scrolled by pressing + arrow keys Up and Down. + + Menu: Console Output Filter. + When enabled, output messages from running console process + can be filtered (i.e. particular lines can be excluded) + - ConsoleDlg: Ctrl+A is unlocked + - ConsoleDlg: Quotes "" are no more added automatically for paths + with spaces (because of a bug with executables w/o extension + such as "cmd /c calc.exe") + - Several internal fixes + - Several additional internal fixes :-) + * Thanks to Jim Granville for his suggestions + + + v0.1 - March 2007 + ----------------- + * initial version + + \ No newline at end of file diff --git a/PowerEditor/bin/plugins/doc/NppExec_TechInfo.txt b/PowerEditor/bin/plugins/doc/NppExec_TechInfo.txt new file mode 100644 index 00000000..68cd2012 --- /dev/null +++ b/PowerEditor/bin/plugins/doc/NppExec_TechInfo.txt @@ -0,0 +1,139 @@ + **************************************************************************** + * NppExec plugin ver. 0.2 for Notepad++ 4.0.2 (and above) + * by DV, December 2006 - April 2007 + **************************************************************************** + + + *************************** + * Technical Information * + *************************** + + NppExec has advanced "hidden" settings which can be set manually. + You need to edit NppExec's ini-file: "\Plugins\Config\NppExec.ini". + + -------------------------------------------------------------- + | KEY | DEFAULT VALUE | TYPE | + |--------------------------------------------------------------| + | ChildProcess_StartupTimeout_ms | 240 | int | + | ChildProcess_CycleTimeout_ms | 120 | int | + | Path_AutoDblQuotes | 0 (FALSE) | BOOL | + | CmdHistory_MaxItems | 256 | int | + | Exec_MaxCount | 100 | int | + | RichEdit_MaxTextLength | 4194304 (4 MB) | int | + | CommentDelimiter | // | string | + -------------------------------------------------------------- + + The purpose of each key is described below. + You can add specified keys to [Console] section of this ini-file. + For example, you can modify it in the following way: + + [Console] + Visible=0 + OEM=1 + CmdHistory=1 + ChildProcess_StartupTimeout_ms=240 + ChildProcess_CycleTimeout_ms=120 + Path_AutoDblQuotes=0 + CmdHistory_MaxItems=256 + Exec_MaxCount=100 + RichEdit_MaxTextLength=4194304 + CommentDelimiter=// + + + ChildProcess_StartupTimeout_ms + ------------------------------ + This parameter is important when a child console process is created. + The child process usually can't be created immediately, therefore + we must give some time to this process to be started. + Here is a general implementation of this part of code: + + if ( CreateProcess( ... , &ProcInfo ) ) + { + CloseHandle( ProcInfo.hThread ); + WaitForSingleObject( ProcInfo.hProcess, STARTUP_TIMEOUT ); + ... + } + + When the process is started, WaitForSingleObject returns. + But, if the value of STARTUP_TIMEOUT is too low, WaitForSingleObject + may return before the process is started. + If default value of ChildProcess_StartupTimeout_ms is not enough for + your PC, you can increase it. IMHO, it can not exceed 400 ms. + + + ChildProcess_CycleTimeout_ms + ---------------------------- + The only purpose of this parameter is to decrease the CPU usage. + The bigger value you set, the less CPU usage you get :-) + Here is an implementation of this part of code in outline: + + do { + // reading from the process'es pipe + ... + } while ( WaitForSingleObject( ProcInfo.hProcess, + CYCLE_TIMEOUT ) == WAIT_TIMEOUT ); + + Don't forget that actually the value of ChildProcess_CycleTimeout_ms + is a pause between requests to the child console process'es output, + so values > 500 ms are not recommened. + + + Path_AutoDblQuotes + ------------------ + If you enable this option (set it to 1), then path to executable + which contains spaces (for example, "my program 1.exe") will be + automatically enclosed in quotes "". + It is disabled by default because of a bug with executables w/o + extension. For example, this line + + cmd /c calc.exe + + will be modified (if this option is enabled) to this one: + + "cmd /c calc.exe" + + because "cmd" is given without extension ".exe". + Therefore don't forget to enclose paths with spaces in quotes + manually, when this option is disabled. + + + CmdHistory_MaxItems + ------------------- + Specifies maximum number of items in the console commands history. + + + Exec_MaxCount + ------------- + Specifies maximum number of NPP_EXEC calls within one script. + This value is needed to prevent the infinite loop of several scripts + which call each other, e.g. + + ::script1 + npp_exec script2 + + ::script2 + npp_exec script1 + + + RichEdit_MaxTextLength + ---------------------- + Specifies maximum number of characters which can be stored or + pasted into the Console dialog's rich edit control. + + + CommentDelimiter + ---------------- + Specifies a comment delimiter :-) I.e. all characters after + this delimiter are understood as a comment, and the text line + (command) is truncated at the position of this delimiter. + Exception: + - when the comment delimiter is // then :// is not truncated + at the position of // (because :// can be a part of http://). + Note: + - if you specify empty comment delimiter i.e. + + CommentDelimiter= + + then you can not use comments in your commands/scripts because + there is no comment delimiter in this case. + diff --git a/PowerEditor/bin/plugins/doc/quickText_README.txt b/PowerEditor/bin/plugins/doc/quickText_README.txt new file mode 100644 index 00000000..4d227f7f --- /dev/null +++ b/PowerEditor/bin/plugins/doc/quickText_README.txt @@ -0,0 +1,100 @@ +/* QuickText - Quick editing tags for Notepad++ + Copyright (C) 2006 João Moreno (alph.pt@gmail.com) + + 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., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +Name: QuickText +Version: 0.2 +Link: http://sourceforge.net/projects/quicktext/ +Author: João Moreno + +DESCRIPTION + +Quicktext is a Notepad++ plugin for quick text substitution, including multi +field inputs. It's similar to Tab Triggers in TextMate. + +INSTALLATION + +Just copy the QuickText.dll into Notepad++'s plugin directory +(mine is C:\Program Files\Notepad++\plugins), and the QuickText.ini file into +Notepad++'s directory (C:\Program Files\Notepad++). + +USAGE + +Use the key shortcut CTRL+Enter to use QuickText tags. + +CUSTOMIZATION + +To make you're own tags: + - First make sure the tag's Language Section already exists. This is done by + creating a new section with the code corresponding to the Language. + (See LANGUAGE CODES). + - Then, for the key of the tag, use only lower/upper case and numbers. + - Special chars: + - $ hotspots + - \$ for writing actual '$' + - \n break line. + +Or just use the Options GUI. (v0.2) :) + +EXAMPLE + + *** (8 is the Language Code for HTML) + +[8] +link=$ + +LANGUAGE CODES + +00 TXT +01 PHP +02 C +03 CPP +04 CS +05 OBJC +06 JAVA +07 RC +08 HTML +09 XML +10 MAKEFILE +11 PASCAL +12 BATCH +13 INI +14 NFO +15 USER +16 ASP +17 SQL +18 VB +19 JS +20 CSS +21 PERL +22 PYTHON +23 LUA +24 TEX +25 FORTRAN +26 BASH +27 FLASH +28 NSIS +29 TCL +30 LISP +31 SCHEME +32 ASM +33 DIFF +34 PROPS +35 PS +36 RUBY +37 SMALLTALK +38 VHDL \ No newline at end of file diff --git a/PowerEditor/bin/readme.txt b/PowerEditor/bin/readme.txt new file mode 100644 index 00000000..8b1b810a --- /dev/null +++ b/PowerEditor/bin/readme.txt @@ -0,0 +1,45 @@ +Notepad++ release Note : + +What is Notepad++? +****************** + +Notepad++ is a generic source editor (it tries to be anyway) and Notepad replacement written in C++ with the win32 API. The aim of Notepad++ is to offer a slim and efficient binary with a totally customizable GUI. This project is under the GPL Licence (http://www.gnu.org/copyleft/gpl.html). + + +Why another source editor? +************************** + +I worked for a big smart card company as an engineer developer. On 2003, I took charge of looking for an alternative solution for an internal tool coded in Java. The internal tool needed an edit component, and I discovered Scintilla (which allows me to develop in C++) on the Internet. I began my conception and development on this project. + +In the mean time, the company where I worked began to use a new development environment, and a property language as well, to re-develop all internal tools. All the developers were forced to use this unstable and uncomfortable IDE and the incoherent property language. This project was unfortunately abandoned (or on the contrary?). + +As a C++/Java developer, I decided to continue the project in my spare time. The prototype of project was already done, I removed the components which depend on the specification of the abandoned project - It made a generic code editor. Then I made it available on sourceforge : that's the beginning of Notepad++. + +Time moves on, and I continue to improve Notepad++. Two things make me continue this project : my need to work on a coherent project by using my beloved language C++ and the encouragement from Notepad++ users. So you asked me "Why another source editor", the answer that I can give you is : "Why not? Since I enjoy myself doing it." + + +How to install : +**************** + +From the installer : + Just follow the install wizard. +From the zip : + just unzip all the files into a directory you want then launch it. + + +Project web sites : +******************* + +Notepad++ official site : + http://notepad-plus.sourceforge.net/ + + Here you can find all the informations about Notepad++, such as FAQ/tutorial, plugins/extension download, news, shops, etc... + +Notepad++ project site : + http://sourceforge.net/projects/notepad-plus/ + + It is Notepad++ project site. The source codes and binaries are distributed here. You can do your feature requests or bug reports by using the trackers, you can ask your question regarding Notepad++ in the divers forums as well. + + +Don HO +********************** diff --git a/PowerEditor/bin/session.xml b/PowerEditor/bin/session.xml new file mode 100644 index 00000000..aad1d887 --- /dev/null +++ b/PowerEditor/bin/session.xml @@ -0,0 +1,5 @@ + + + C:\Users\Don\sources\notepad++\PowerEditor\bin\change.log + + diff --git a/PowerEditor/bin/shortcuts.xml b/PowerEditor/bin/shortcuts.xml new file mode 100644 index 00000000..38ea73e4 --- /dev/null +++ b/PowerEditor/bin/shortcuts.xml @@ -0,0 +1,23 @@ + + + + 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) -multiInst + + + + + + + + + + + + + diff --git a/PowerEditor/bin/stylers.xml b/PowerEditor/bin/stylers.xml new file mode 100644 index 00000000..fd52701d --- /dev/null +++ b/PowerEditor/bin/stylers.xml @@ -0,0 +1,709 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + if else for while + bool long int char + + + + + + + + + + + + + + + + + + + + + diff --git a/PowerEditor/bin/todo.txt b/PowerEditor/bin/todo.txt new file mode 100644 index 00000000..bd61b3a6 --- /dev/null +++ b/PowerEditor/bin/todo.txt @@ -0,0 +1,6 @@ +TODO: + +1. A generic code formatter (for C, C++ and HTML...). (can be done by plugin) +2. A FTP client. (can be done by plugin) +3. A smart indent (TAB) for C or/and for HTML. (can be done by plugin) +4. Improve save file dialog. (when the filter is set, add the extension) diff --git a/PowerEditor/bin/userDefineLang.xml b/PowerEditor/bin/userDefineLang.xml new file mode 100644 index 00000000..5897a17e --- /dev/null +++ b/PowerEditor/bin/userDefineLang.xml @@ -0,0 +1,36 @@ + + + + + + + + + 000000 + + + + + toto tot + + + + + + + + + + + + + + + + + + + + + + diff --git a/PowerEditor/gcc/makefile b/PowerEditor/gcc/makefile new file mode 100644 index 00000000..eda0a579 --- /dev/null +++ b/PowerEditor/gcc/makefile @@ -0,0 +1,283 @@ +# 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++ +CC=gcc +RC = windres + +#UserDefineDialog_res.o +MAINOBJS = winmain.o Parameters.o Notepad_plus.o Notepad_plus_res.o Utf8_16.o PluginsManager.o + +SCINTILLAOBJS = ScintillaEditView.o DocTabView.o FindReplaceDlg.o UserDefineDialog.o Printer.o UserDefineDialog_res.o GoToLineDlg.o + +WINCTRLOBJS = TabBar.o ControlsTab.o ToolBar.o StatusBar.o ImageListSet.o FileDialog.o Splitter.o SplitterContainer.o StaticDialog.o \ +URLCtrl.o AboutDlg.o RunDlg.o trayIconControler.o shortcut.o ShortcutMapper.o BabyGridWrapper.o BabyGrid.o ShortcutMapper_rc.o \ +regExtDlg_res.o regExtDlg.o preference_rc.o preferenceDlg.o WindowsDlg_rc.o SizeableDlg.o WinMgr.o WinRect.o WindowsDlg.o + +WORDSTYLESDLG = WordStyleDlg_rc.o WordStyleDlg.o ColourPicker.o ColourPopup_rc.o ColourPopup.o +MISCOBJS = SysMsg.o Process.o +TINYXMLOBJS = tinystr.o tinyxml.o tinyxmlerror.o tinyxmlparser.o + +OBJS = $(MAINOBJS) $(SCINTILLAOBJS) $(WINCTRLOBJS) $(MISCOBJS) $(TINYXMLOBJS) $(WORDSTYLESDLG) +# +# the paths +INCLUDEDIR = ../../scintilla/include +SRCDIR = ../src +TARGETDIR=../bin + +WINCTRLDIR = $(SRCDIR)/WinControls + +SCINTILLADIR = $(SRCDIR)/ScitillaComponent + +TINYXMLDIR = $(SRCDIR)/TinyXml + +TABBARDIR = $(WINCTRLDIR)/TabBar +TOOLBARDIR = $(WINCTRLDIR)/ToolBar +STATUSBARDIR = $(WINCTRLDIR)/StatusBar +IMGLSTSETDIR = $(WINCTRLDIR)/ImageListSet +FILEDIALOGDIR = $(WINCTRLDIR)/OpenSaveFileDialog +SPLITTERDIR = $(WINCTRLDIR)/SplitterContainer +STATICDLGDIR = $(WINCTRLDIR)/StaticDialog +ABOUTDLGDIR = $(WINCTRLDIR)/AboutDlg +RUNDLGDIR = $(STATICDLGDIR)/RunDlg +SHORTCUTDIR = $(WINCTRLDIR)/shortcut +MISCDIR = $(SRCDIR)/MISC +SYSMSGDIR = $(MISCDIR)/SysMsg +PROCESSDIR = $(MISCDIR)/Process +REGEXTDIR = $(MISCDIR)/RegExt +PLUGINSMANAGERDIR = $(MISCDIR)/PluginsManager +WORDSTYLESDLGDIR = $(WINCTRLDIR)/ColourPicker +SYSTRAYDIR = $(WINCTRLDIR)/TrayIcon +CONTEXTMENUDIR = $(WINCTRLDIR)/ContextMenu +SHORTCUTMAPPERDIR = $(WINCTRLDIR)/Grid +PREFERENCEDLGDIR = $(WINCTRLDIR)/Preference +WINDOWSDLGDIR = $(WINCTRLDIR)/WindowsDlg + +PROG = $(TARGETDIR)/npp.exe +FONT_SRC=$(SRCDIR)/font/LINEDRAW.TTF +FONT_TARGET=$(TARGETDIR)/LINEDRAW.TTF + +XMLUSERFILE_SRC=$(SRCDIR)/config.xml +XMLUSERFILE_TARGET=$(TARGETDIR)/config.xml +XMLLANGFILE_SRC=$(SRCDIR)/langs.xml +XMLLANGFILE_TARGET=$(TARGETDIR)/langs.xml + +INCLUDEFLAGS = -I$(INCLUDEDIR) -I$(SCINTILLADIR) -I$(WINCTRLDIR) \ +-I$(TABBARDIR) -I$(TOOLBARDIR) -I$(STATUSBARDIR) -I$(IMGLSTSETDIR) \ +-I$(FILEDIALOGDIR) -I$(SPLITTERDIR) -I$(STATICDLGDIR) -I$(ABOUTDLGDIR) \ +-I$(SYSMSGDIR) -I$(PROCESSDIR) -I$(MISCDIR) -I$(RUNDLGDIR) -I$(SRCDIR) \ +-I$(TINYXMLDIR) -I$(WORDSTYLESDLGDIR) -I$(REGEXTDIR) -I$(PLUGINSMANAGERDIR) \ +-I$(SYSTRAYDIR) -I$(SHORTCUTDIR) -I$(CONTEXTMENUDIR) -I$(SHORTCUTMAPPERDIR) \ +-I$(PREFERENCEDLGDIR) -I$(WINDOWSDLGDIR) + +DEFINEFLAGS = -D_WIN32_IE=0x0600 +CFLAGS = -Wall -Os -DNDEBUG +#CFLAGS = -Wall -Os -DDEBUG +LDFLAGS = -mwindows -Wl,-s -Wl,--gc-sections -lcomctl32 -lshlwapi -lodbc32 -lodbccp32 -Os -s +#LDFLAGS = -mwindows -lcomctl32 -lshlwapi -llibshell32 + +ALL: $(PROG) $(FONT_TARGET) $(XMLLANGFILE_TARGET) + +$(PROG): $(OBJS) + $(CPP) -Xlinker --subsystem -Xlinker windows -o $@ $(OBJS) $(LDFLAGS) + + +winmain.o : $(SRCDIR)/winmain.cpp $(SRCDIR)/Notepad_plus.h $(SYSMSGDIR)/SysMsg.h $(CONTEXTMENUDIR)/ContextMenu.h + $(CPP) $(CFLAGS) -c $(SRCDIR)/winmain.cpp -o $@ $(INCLUDEFLAGS) + +Notepad_plus.o : $(SRCDIR)/Notepad_plus.h $(SRCDIR)/Notepad_plus.cpp $(SRCDIR)/Parameters.h \ +$(SCINTILLADIR)/ScintillaEditView.h $(SCINTILLADIR)/DocTabView.h $(SCINTILLADIR)/FindReplaceDlg.h \ +$(SCINTILLADIR)/UserDefineDialog.h $(SCINTILLADIR)/printer.h $(WINCTRLDIR)/Window.h \ +$(TOOLBARDIR)/ToolBar.h $(FILEDIALOGDIR)/FileDialog.h $(SRCDIR)/resource.h \ +$(STATUSBARDIR)/StatusBar.h $(ABOUTDLGDIR)/AboutDlg.h $(IMGLSTSETDIR)/ImageListSet.h \ +$(STATICDLGDIR)/StaticDialog.h $(SPLITTERDIR)/SplitterContainer.h $(SYSMSGDIR)/SysMsg.h \ +$(MISCDIR)/FileNameStringSplitter.h $(SRCDIR)/lastRecentFileList.h $(SRCDIR)/lesDlgs.h $(SHORTCUTDIR)/shortcut.h $(CONTEXTMENUDIR)/ContextMenu.h + $(CPP) $(CFLAGS) $(DEFINEFLAGS) -c $(SRCDIR)/Notepad_plus.cpp -o $@ $(INCLUDEFLAGS) +#$(PROCESSDIR)/Process.h +Parameters.o : $(SRCDIR)/Parameters.h $(SRCDIR)/Parameters.cpp $(CONTEXTMENUDIR)/ContextMenu.h + $(CPP) $(CFLAGS) $(DEFINEFLAGS) -c $(SRCDIR)/Parameters.cpp -o $@ $(INCLUDEFLAGS) + +Notepad_plus_res.o : $(SRCDIR)/resource.h $(SRCDIR)/Notepad_plus.rc $(SCINTILLADIR)/UserDefineDialog.rc \ +$(RUNDLGDIR)/RunDlg.rc $(SHORTCUTDIR)/shortcut.rc + $(RC) --include-dir=$(SRCDIR) -o $@ $(SRCDIR)/Notepad_plus.rc + +Utf8_16.o : $(SRCDIR)/Utf8_16.h $(SRCDIR)/Utf8_16.cpp + $(CPP) $(CFLAGS) $(DEFINEFLAGS) -c $(SRCDIR)/Utf8_16.cpp -o $@ $(INCLUDEFLAGS) + +ScintillaEditView.o : $(SCINTILLADIR)/ScintillaEditView.h $(SCINTILLADIR)/ScintillaEditView.cpp $(SRCDIR)/Parameters.h \ +$(WINCTRLDIR)/Window.h $(INCLUDEDIR)/Scintilla.h $(INCLUDEDIR)/SciLexer.h $(SCINTILLADIR)/Buffer.h \ +$(SCINTILLADIR)/colors.h $(SYSMSGDIR)/SysMsg.h $(STATICDLGDIR)/StaticDialog.h + $(CPP) $(CFLAGS) -c $(SCINTILLADIR)/ScintillaEditView.cpp -o $@ $(INCLUDEFLAGS) + +DocTabView.o : $(SCINTILLADIR)/DocTabView.h $(SCINTILLADIR)/DocTabView.cpp \ +$(TABBARDIR)/TabBar.h $(IMGLSTSETDIR)/ImageListSet.h $(SCINTILLADIR)/ScintillaEditView.cpp + $(CPP) $(CFLAGS) -c $(SCINTILLADIR)/DocTabView.cpp -o $@ $(INCLUDEFLAGS) + +FindReplaceDlg.o : $(STATICDLGDIR)/StaticDialog.h $(SRCDIR)/resource.h \ +$(SCINTILLADIR)/FindReplaceDlg.h $(SCINTILLADIR)/FindReplaceDlg.cpp + $(CPP) $(CFLAGS) -c $(SCINTILLADIR)/FindReplaceDlg.cpp -o $@ $(INCLUDEFLAGS) + +UserDefineDialog.o : $(STATICDLGDIR)/StaticDialog.h $(SCINTILLADIR)/ScintillaEditView.h \ +$(SCINTILLADIR)/UserDefineResource.h $(SCINTILLADIR)/UserDefineDialog.h \ +$(SCINTILLADIR)/UserDefineDialog.cpp + $(CPP) $(CFLAGS) -c $(SCINTILLADIR)/UserDefineDialog.cpp -o $@ $(INCLUDEFLAGS) + +Printer.o : $(SCINTILLADIR)/Printer.h $(SCINTILLADIR)/Printer.cpp $(SCINTILLADIR)/ScintillaEditView.h + $(CPP) $(CFLAGS) -c $(SCINTILLADIR)/Printer.cpp -o $@ $(INCLUDEFLAGS) + +UserDefineDialog_res.o : $(SCINTILLADIR)/UserDefineDialog.rc $(SCINTILLADIR)/UserDefineResource.h + $(RC) -o $@ $(SCINTILLADIR)/UserDefineDialog.rc + +GoToLineDlg.o : $(SCINTILLADIR)/GoToLineDlg.h + $(CPP) $(CFLAGS) -c $(SCINTILLADIR)/GoToLineDlg.cpp -o $@ $(INCLUDEFLAGS) + +TabBar.o : $(WINCTRLDIR)/Window.h $(TABBARDIR)/TabBar.h $(TABBARDIR)/TabBar.cpp $(SYSMSGDIR)/SysMsg.h + $(CPP) $(CFLAGS) -c $(TABBARDIR)/TabBar.cpp -o $@ $(INCLUDEFLAGS) + +ControlsTab.o : $(TABBARDIR)/ControlsTab.h $(TABBARDIR)/ControlsTab.cpp + $(CPP) $(CFLAGS) $(DEFINEFLAGS) -c $(TABBARDIR)/ControlsTab.cpp -o $@ $(INCLUDEFLAGS) + +ToolBar.o: $(WINCTRLDIR)/Window.h $(TOOLBARDIR)/ToolBar.h $(TOOLBARDIR)/ToolBar.cpp \ +$(IMGLSTSETDIR)/ImageListSet.h $(SYSMSGDIR)/SysMsg.h + $(CPP) $(CFLAGS) -c $(TOOLBARDIR)/ToolBar.cpp -o $@ $(INCLUDEFLAGS) + +StatusBar.o: $(WINCTRLDIR)/Window.h $(STATUSBARDIR)/StatusBar.h $(STATUSBARDIR)/StatusBar.cpp $(SYSMSGDIR)/SysMsg.h + $(CPP) $(CFLAGS) -c $(STATUSBARDIR)/StatusBar.cpp -o $@ $(INCLUDEFLAGS) + +ImageListSet.o: $(IMGLSTSETDIR)/ImageListSet.h $(IMGLSTSETDIR)/ImageListSet.cpp + $(CPP) $(CFLAGS) -c $(IMGLSTSETDIR)/ImageListSet.cpp -o $@ $(INCLUDEFLAGS) + +FileDialog.o: $(FILEDIALOGDIR)/FileDialog.h $(FILEDIALOGDIR)/FileDialog.cpp + $(CPP) $(CFLAGS) -c $(FILEDIALOGDIR)/FileDialog.cpp -o $@ $(INCLUDEFLAGS) + +Splitter.o: $(WINCTRLDIR)/Window.h $(SPLITTERDIR)/Splitter.h $(SPLITTERDIR)/Splitter.cpp $(SYSMSGDIR)/SysMsg.h + $(CPP) $(CFLAGS) -c $(SPLITTERDIR)/Splitter.cpp -o $@ $(INCLUDEFLAGS) + +SplitterContainer.o: $(WINCTRLDIR)/Window.h $(SPLITTERDIR)/SplitterContainer.h $(SPLITTERDIR)/SplitterContainer.cpp $(SPLITTERDIR)/Splitter.h $(SYSMSGDIR)/SysMsg.h + $(CPP) $(CFLAGS) -c $(SPLITTERDIR)/SplitterContainer.cpp -o $@ $(INCLUDEFLAGS) + +StaticDialog.o: $(WINCTRLDIR)/Window.h $(STATICDLGDIR)/StaticDialog.h $(STATICDLGDIR)/StaticDialog.cpp + $(CPP) $(CFLAGS) -c $(STATICDLGDIR)/StaticDialog.cpp -o $@ $(INCLUDEFLAGS) + +URLCtrl.o: $(WINCTRLDIR)/Window.h $(ABOUTDLGDIR)/URLCtrl.h $(ABOUTDLGDIR)/URLCtrl.cpp + $(CPP) $(CFLAGS) -c $(ABOUTDLGDIR)/URLCtrl.cpp -o $@ $(INCLUDEFLAGS) + +AboutDlg.o: $(WINCTRLDIR)/Window.h $(ABOUTDLGDIR)/AboutDlg.h $(ABOUTDLGDIR)/AboutDlg.cpp URLCtrl.o + $(CPP) $(CFLAGS) -c $(ABOUTDLGDIR)/AboutDlg.cpp -o $@ $(INCLUDEFLAGS) + +RunDlg.o: $(WINCTRLDIR)/Window.h $(RUNDLGDIR)/RunDlg.h $(RUNDLGDIR)/RunDlg.cpp $(RUNDLGDIR)/RunDlg.rc + $(CPP) $(CFLAGS) -c $(RUNDLGDIR)/RunDlg.cpp -o $@ $(INCLUDEFLAGS) + +shortcut.o: $(WINCTRLDIR)/Window.h $(SHORTCUTDIR)/shortcut.h $(SHORTCUTDIR)/shortcut.rc + $(CPP) $(CFLAGS) -c $(SHORTCUTDIR)/shortcut.cpp -o $@ $(INCLUDEFLAGS) + +trayIconControler.o: $(SYSTRAYDIR)/trayIconControler.h + $(CPP) $(CFLAGS) -c $(SYSTRAYDIR)/trayIconControler.cpp -o $@ $(INCLUDEFLAGS) + +RunDlg_res.o : $(RUNDLGDIR)/RunDlg_rc.h $(RUNDLGDIR)/RunDlg.rc + $(RC) --include-dir=$(SRCDIR) -o $@ $(RunDlg)/RunDlg.rc + +SysMsg.o: $(SYSMSGDIR)/SysMsg.h $(SYSMSGDIR)/SysMsg.cpp + $(CPP) $(CFLAGS) -c $(SYSMSGDIR)/SysMsg.cpp -o $@ $(INCLUDEFLAGS) + +Process.o: $(PROCESSDIR)/Process.h $(PROCESSDIR)/Process.cpp + $(CPP) $(CFLAGS) -c $(PROCESSDIR)/Process.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) +#WebCtrl.o: +#WebControl.o: +WordStyleDlg_rc.o : $(WORDSTYLESDLGDIR)/wordstyledlgres.h + $(RC) --include-dir=$(SRCDIR) -o $@ $(WORDSTYLESDLGDIR)/WordStyleDlg.rc + +WordStyleDlg.o : $(WORDSTYLESDLGDIR)/WordStyleDlg.h $(SYSMSGDIR)/SysMsg.h + $(CPP) $(CFLAGS) -c $(WORDSTYLESDLGDIR)/WordStyleDlg.cpp -o $@ $(INCLUDEFLAGS) + +ColourPicker.o : $(WORDSTYLESDLGDIR)/ColourPicker.h $(SYSMSGDIR)/SysMsg.h + $(CPP) $(CFLAGS) -c $(WORDSTYLESDLGDIR)/ColourPicker.cpp -o $@ $(INCLUDEFLAGS) + +ColourPopup_rc.o : $(WORDSTYLESDLGDIR)/ColourPopupResource.h + $(RC) --include-dir=$(SRCDIR) -o $@ $(WORDSTYLESDLGDIR)/ColourPopup.rc + +ColourPopup.o : $(WORDSTYLESDLGDIR)/ColourPopup.h $(SYSMSGDIR)/SysMsg.h + $(CPP) $(CFLAGS) -c $(WORDSTYLESDLGDIR)/ColourPopup.cpp -o $@ $(INCLUDEFLAGS) + +regExtDlg_res.o : $(REGEXTDIR)/regExtDlgRc.h $(REGEXTDIR)/regExtDlg.rc + $(RC) --include-dir=$(SRCDIR) -o $@ $(SRCDIR)/Notepad_plus.rc + +regExtDlg.o : $(REGEXTDIR)/regExtDlg.h $(REGEXTDIR)/regExtDlg.cpp + $(CPP) $(CFLAGS) -c $(REGEXTDIR)/regExtDlg.cpp -o $@ $(INCLUDEFLAGS) + +PluginsManager.o : $(PLUGINSMANAGERDIR)/PluginsManager.h $(PLUGINSMANAGERDIR)/PluginInterface.h + $(CPP) $(CFLAGS) -c $(PLUGINSMANAGERDIR)/PluginsManager.cpp -o $@ $(INCLUDEFLAGS) + +BabyGrid.o : $(SHORTCUTMAPPERDIR)/BabyGrid.h + $(CPP) $(CFLAGS) -c $(SHORTCUTMAPPERDIR)/BabyGrid.cpp -o $@ $(INCLUDEFLAGS) + +BabyGridWrapper.o : $(SHORTCUTMAPPERDIR)/BabyGridWrapper.h $(SHORTCUTMAPPERDIR)/BabyGrid.h + $(CPP) $(CFLAGS) -c $(SHORTCUTMAPPERDIR)/BabyGridWrapper.cpp -o $@ $(INCLUDEFLAGS) + +ShortcutMapper_rc.o : $(SHORTCUTMAPPERDIR)/ShortcutMapper.rc $(SHORTCUTMAPPERDIR)/ShortcutMapper_rc.h + $(RC) -o $@ $(SHORTCUTMAPPERDIR)/ShortcutMapper.rc + +ShortcutMapper.o : $(SHORTCUTMAPPERDIR)/ShortcutMapper.h + $(CPP) $(CFLAGS) -c $(SHORTCUTMAPPERDIR)/ShortcutMapper.cpp -o $@ $(INCLUDEFLAGS) + +preference_rc.o : $(PREFERENCEDLGDIR)/preference_rc.h $(PREFERENCEDLGDIR)/preference.rc + $(RC) -o $@ $(PREFERENCEDLGDIR)/preference.rc + +preferenceDlg.o : $(PREFERENCEDLGDIR)/preferenceDlg.h + $(CPP) $(CFLAGS) -c $(PREFERENCEDLGDIR)/preferenceDlg.cpp -o $@ $(INCLUDEFLAGS) + +WindowsDlg_rc.o : $(WINDOWSDLGDIR)/WindowsDlgRc.h $(WINDOWSDLGDIR)/WindowsDlg.rc + $(RC) -o $@ $(WINDOWSDLGDIR)/WindowsDlg.rc + +SizeableDlg.o : $(WINDOWSDLGDIR)/SizeableDlg.h + $(CPP) $(CFLAGS) -c $(WINDOWSDLGDIR)/SizeableDlg.cpp -o $@ $(INCLUDEFLAGS) + +WinMgr.o : $(WINDOWSDLGDIR)/WinMgr.h + $(CPP) $(CFLAGS) -c $(WINDOWSDLGDIR)/WinMgr.cpp -o $@ $(INCLUDEFLAGS) + +WinRect.o : $(WINDOWSDLGDIR)/WinMgr.h + $(CPP) $(CFLAGS) -c $(WINDOWSDLGDIR)/WinRect.cpp -o $@ $(INCLUDEFLAGS) + +WindowsDlg.o : $(WINDOWSDLGDIR)/WindowsDlg.h + $(CPP) $(CFLAGS) -c $(WINDOWSDLGDIR)/WindowsDlg.cpp -o $@ $(INCLUDEFLAGS) + +$(FONT_TARGET): $(FONT_SRC) + cp $^ $@ + +$(XMLUSERFILE_TARGET) : $(XMLUSERFILE_SRC) + cp $^ $@ + +$(XMLLANGFILE_TARGET) : $(XMLLANGFILE_SRC) + cp $^ $@ + + +clean: + rm -f $(OBJS) $(PROG) $(XMLLANGFILE_TARGET) $(FONT_TARGET) + 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/images/Thumbs.db b/PowerEditor/installer/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..4647d569e9a148513c568ed2f292dafc6cd1daad GIT binary patch literal 34304 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 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> z@GT0`3fm`UHdtZd0%1%p`NsK7ba8R7Z}^nSiLVduD4h_mLyyrjvj!oCbBHIAb5on! zj?RQF6O0g#AQ!cgi@U$Kt!MyxxKEN0!>60Cqi-gg*ql6Se#!(-h^GX9d69mTY)Can z=^2>_jkIk5;;0^oDj6t^+ErDJm3N^dtK1|ZACnW$ueP>NnCOyvue^eiu9dsW0x>i~ zfVod0ay>a!{bZ)$^dmsY;*v&hU6E8anN!&>r13Un+StONkdIQwr^p$ z;7_ITkZ&uQHuqR1d@QP`Zfj`z@`TaB^>FMO+cE)!7(U&c zwsGPc>x6hp@Jvz*jU1(5Kyu_2JN}8@rRN7*(o5yHOfW(W$F7}B)3*<9NAH9!6H$aXBE+ra(vjq{<^`uVJl@=? zw`3FIt>@23s&fW;)$knRScDh|@$TgHWJ4M`N~2yU5c0T=Oh`{@PLiB-Q$es!{jE$n z@`F+C{Ay)3wW3rEf4kc!WENT=fKrGn^6D(M9S_~LH5$&58eweNey6*UAZ9Z7Q$t9} zO{ID(7BK?3y(6h0%Zb}JZ&(vc61&P;kxXd#ZLGybf7);crOsm>abaVgD4qg0j|I_gJkj4M@ixJ;noEjk> z8_Z~!wQMrrv_bHY$%i?Tgm_9Y`zHFYR4tS;Z4SZQAQFu%NgR^0DfLDZ#s27+Kq>M^WX-%R*0E_j2kR&IQ~GBJ&Wt2~jVWSb%sv{X1|sc`Jl;rOM)2}{$7%h1Wo&?(E%smsz8mZd9pp(}Nv zt8}5OcBQLzrE7GhYj&e+b)&!NM%V66*Xd5z?M~NQj;_BP-C#MoVGp`d5BlpK^fx`} z#y#mKJ?W;s=w`j>=Dp|^(WjeJBg8<6`_WyrE&42dS2aQ$5n?!Y4c@5BYWGz7OtfW! zMTjK{am)N^Z09jQH2jYIWqhFd>E_f3F%aV41b@wvUn$=%S>cCf`Ei85D>tpAU97NS z&rix`5{9WvHi}F!mkU~1;g|&DV}P?itq8{OmzPk(;<1H?I9#f?NYjvt=`NK}`Hlv& zQ8J-N&iJ7(StrYJu`tjxMT@6RL!GY;bGC z!~NLM$$HTX^xxJAF>vCu$p5&+EhU7J|vZlils`T5wvDb zm0BTWDn01TG-BQ+jjYxM`Kr;TOxfCLhf?%Qbq7U^aOXk_(}_Uw)Jv5pX&Qf$&&*}3 zP(YHKrb-xP>X9>fR%Ev`M(Bae0*%C%l=jZb8cV%5nY#xso5?yMf=dY&jWvMSC|0ie z#`&x$Ww8?9@F|)Te-M7$KU~>|2ys8U>t{%S z`zHi{o>=)kFfn*=V(`$!;NeNZBkjLOCk2m94j!KzJkkEEe7YG9A#VTu1zxIyJ;cC< z+kek_zHvf{wJ5Pe`58CWxVaRklM!=?i~58YNu?Jg%bnhA&8CJRry{Rp~8aAHJRv)49Dk)o?5`HyBZ(YF3)|4WFVp@gCt(o)F^xbhpjuStdr^ zo!+EJh@)fIuAwgrTECONy<%|VsNkC9r<>tRbW!FxP7dIj`S$~)CD2l zhP)~eTmDk+w8{nr)kG}VCKgGFEh*KU+OA!#H6}c`MHSDeJV>6Z5uceGL6m7)rXjvj znY7`s8xvc}4OF=oza)_1g&Leg$>(FbSN?2klv&;Jipba~Sw^q3BeiKmZoio~zLvvfRT~zN!i_0Fe{N0Ezu+9iKuuF$9VI zA;kUZ?q|_^O#J>l`nX1fn4Lomr%cQZ=L-b*I9#wVc`WtA9B>XX5aNNK9Sa9d#9ZX( zKkx6cLGXz62=Ub5`FrRW0+}T*xfuN!4oaKYphvMAa}&V%Bo)jmW;i~^Bvc}2AQHr) zOlWJCQY>Ey%$P3xpBfW6lOZdiN3eLQSXz~}D{-$_q%(JKj|S&3Hxu;Ve5H&x7K3{; z%;gjEtjN(QWa7PWue_!*C1dWC)jMMOddO$VBX5zI81Sd+(3* zh|BwiPobQ6kMNk%U#f#G6A&Q=LfoJ1aTdK-Y%THC*TYX$w@ffX9GyeFF}Y3L1YG?m z{pvLG!Y_ln#{@S<5#rYGuk88W?hTI*%Nm0qzx$gzyCB5>6TCP-402`8Ens)d?SzBk z<1o@+81l@&VPr z8}I-oKX95{sgxFhP_wz2fV#=dWUzSPbzw?LCiLV~;t;CcKi3vff!v-VK)~Yo0K%xQ z-y*>(OjPk5Tmdo~%QhY#LCwiahHdff+Dgmxl%ygoN6DXU$y{VTzTs0GCx#%gSA@7f z+3RdGP7HoCft)G7hd4%vqhr^OppQ%XUnS7>_|S$~%dp;(nRtAJ3qlM*;uFZblG2Kc zRdh-43@bURaS^>q5k_7mR>Y%WH#!A;i?3XeHXM4uI=L##5I9*Yw>3t@3mQ%SfZ&4R z;HN|fEqa~mepw|qR(7_IaILWZLN zFBN!2s$Q{7m}t!zAqo+bO*nDXy3!CF;Ui^AIrSwc8^c`_k)}yb4AZR+ zYmrkeY22(FdH!K>h?iWAupR+eWyv4Q2T0jnkdUM%O3O2I93r;|mxu|U`lmK6)00y* zGU{kV($*S`Zl%LUwvg`~yw^e6;xGl0Xrm$NW6bfA!&FQ!{!eySJtv@-@tE*wy$)F2 zVDkFAOYadLTjGZ~k`ZDc!~@8_v+3K0D$fglFo_WJ=MZm7?uM7@#PZ~f4lW7t^1%x) zQqdcMV#)cd?z)*ILF9!o=fr{mg>NX9wm1#vG5}kVFd%2V7G(v7QwLnh8Q0w0to0ak z<&nus%da1Jn@UCv!5s1nLUYO$F%Nm#Bx#@+bU7nl#^Oq2nJT&PVAhvP7;K9NVCB6< zER2SuGAl^>o>+kBsmsm3hCr#Mj|`4+-%=vY$C82GIUM z?;A!=A4bk-A!jDfAr@?z;0f`l;A%K_ZN=c`>*zlOh7ip_5BDE2{|ZMDVj#qOk~al{ z$zQ6dkTH{)=STCjyf9GG3Q6J_jC||1hMU}grLBfyL#MgDY}O#nKOk&ot6f!|2jwN3 zj@2wlkK}hy$V-wXFmnd^)tyo#JL*TOd?=DOw?`y9DU3@l)_6(_m6%jkhNcJ*y#Xqc z$Kq;1V|)e~lzl*D^Gud|*Hu32%P|jxKW)t&)r4mf1?xGd(CKA;x;ZOC41{vB)tY3BtZ7I{vfJ46?$lnN z3M>Tn_~x?G7JQFm9+FDICT3MyEU!3^2HcgUxFElRiM_)Xm^?943Is@AG7slRVn}*L zQUJ)Y*k1r%4R)?Eg2}rXGgCb$kP~;Zerh+cnE6dOe*j%`89HSdI(1pP!m@P5E_9_X zbd@f2)vk24u5^vAbj@ybt#0%e-RRog={nu%y4~q|%hC0hqZ=$oH|#+->Op_qgZ`!` z-MA;+q$l097u~EE-MkmwqBq^LH{Gf?-MSCmrVrh=58b{m-Jvhtu`k`JAKkeh-9=1@ z2a*G9sks)p)G$KK2=VCPhS8NX*KS-nn0XX=?om2-e)tnFXQvUWt)b!h)kn;~+%+LS zl>8qrgGt(Al&+H>1DoL{X(b8c^(Yb}xLqSI6-lT!6=lYNs?R@>6L+$^z+J3dY7Y|oNQeiK z1Fa|sm7GtXX(4B~kaLEUbBB}j;M2`YTPBi(nEz58e7bqPVAjs$i8ILGFDC!EnEZ3C zxhHpjbH_oSoj5*dbMd7*cFIH)A%-CFC!Kk@32x>yaVPiXW&(}THc}+3Liv2XxKz|S z#2V!r$|{*P=V?qQSxrRwyy+$Bow!2FS3ACH&dZsawgNi{FPKhJ+l5R?mctllRFC}f z2~-0vmDM`SH(%25R8Qdvds`#8B@;uOkk^`bBn_i5F&uey%$lsZ+=P`btnol2CYY^= zHJC}>`jHG82xN_iF{R*7-fikOE$A=iqeS(gn)DKjIqgB>wLFXv10fzn4zi``yzobN zgm`Rl+t^^{xZw72!5!m*JI4igjSuc_{}n`tFC(AW0tzMucRhrkp_K$S7s-SZS1>Vu zVw({oS70jK>OufWEFf)*SqfTIy(Ial+M+9}&he5_>e#%l5GtP8AhSNyqno@rc&JtP zAW25@^r)C%j+Yr3oIJ~tUaci1)B}OH6r^RANy(=999x|o)`UvJXmDbA2Z*6mpMMJA zLQc$g0SoCH!h5_W#DmDe7BuXr;&A$)iwJS)g!q4hSFL=wF2c!t8WxOMF}l`anf(73 z)G2vMn~q1qNs=V7FiDc3N>jx3M^|I~&myywXlB6=8 zn6KX3Js(_!X_uSO;KU$jZnaT?EV$|_A31R+b4$98Ua>LsH@@v5jv~ZBh?~eEdP=3< zH8-4Real4Ygn0SjC0no7MWES=G<5Rd_CeNU7EIQrnj=ZVQavZi)SLTxIg>N46{^iQ z0qLZsj-EBg+Ew~fFvQ19V9Ozs3zAqvu|FjvkukJYxsjN8SXnZ~7NV+nf~8_L@IXl} z9#VaSuSX*dO{?mXDn=|bccGFcs(CLHJ405xv3&D&6axg7)3M64{?y^b(s6MnPdz6D z1E%@JRDHl^Iih(!1c`kn#7*Q-a~=5_4yO-~Ak#*W3rCQPTFJ%Hr<<$xC1?9%t>ee3yZ~tkH_(2%u4O?cE~q4MVT1O01GjZ!2e2x}8_2Oz;t6 zAjD1Nu-8LtJ7obh2o+Bym)8s--Z*&8;;sq6$2`;_=wRA24G1QvR`QY{)+OJY^oD+3 zLLkAcxe7axctEdOCTphgjTQ?=c?MCGu;rFn#4gqx`%~&MblM|eRU#|s8s<9$l3MHG z2}(g#d_Ssm2ZJZ|3}=&soxT2vZkW}H#G;z-QxexNf7RS=qG3m7^9)F(H!#A2N=75q z0k9^^3r0)i#4=taRpzPiCC>?Q6FL0Z>|=nXluQ)5fX=Cn2=NNRU*DwPC-gJQa7vr_ z*;G|Z^I=Z4#jNt?F&H)zn8erwfFwB()5WQM1tMi#l4l;aB$t0244_F8i&!8QZq%R% zS+v;PNm6H16Fh+&L!IW2IG9@+CY;b>#RKV>3MRlpH&OCW)@U+eF@m0S?__g&qoQD> z;+x1CJ?bhywHHSyAt&a&#VEZs{ewT}5GNzVK!^vEBc7%28Y!7}^V;NwRx-V+w@d&b zzL$QPrkqipNz_L?Lcu(0BAK}I+^c+a)jZwtN8~ zos#CTHODJ?g5*q}s)Zz<=CMkR$(e^9p@~$G9l0N`kvN?ym0qR`S`0&$(q@}T^2);> zgV=f2(ntdqLrE6dPU0&bl09Wno$X_nfamf0#_p=mKLuDJC+59HKm9@YFaHVgU~;4j zPW(LmM1>IFJSKqOEn|Zja1OB#dx(J$pFlp)w|&N)R%YL<0Sm$>8O`QrYed~*Vh9G5 z{N@uSV5T&g_A0WqH5$f~VhZwqia9Z8qxa~XZ^B|)o_5&cJ*m_)VdP4NyyGRc&|@U2 z-Ne+{GNO+b+&E)ZCg~ojm}_U+at~g3ST-arn=7FnL5$j!cg|cfpnxq*a&gd8S#p8O zTcmE&f+-9+u}ojcFS8dt$&)YDWkraA5Dz9tx!}Zr&Z%^^+)H&n65>6{+xZ4oFX1$T zXcGUBrzTk=W-d)sMax{IEK$w#Wt6owS(-}=NXmmR`QBTuRFd8(Z{^eq^@sw@a4{aH z5ps?p09`v3-z!o5|7VQiUl~9*ue7Pn(cCN0KW?k*h`pSC0y= zNjqi2M?$KQAg)^#x5I2)!&ZUnjsU~0epW&A)k{gf^ zGsHUioY_;+SXGAepZ0*u#83)GGC*<@Fj=xD{7DF=u9!wH2!tvQsS(zgoUuRcz%D_H zVVPrs6mro|o57H3k@R4~WK%&q#T3$IqC#g$NT2l%Q9kY82h-14?e zoYh;kLzOZkvnqf!Szgdzw85`ppmIH4wZJ&KSy#GRSGq=5x@I@JRyX>KZglPLbe-;W z-R^X~<>>m$(G8ZP8}^_Z^`O7*L4VVeZrqb@(vxo5i*DA7Zr+P-(VK4Bn{L&cZrz7& z(}!-`hi>1O?$DR+*q83qkM7)$?$VF$+Mn*$pYGnD?9rd>HGu3rfb27X>^qR`H<0W< zkQ|U3AqGO+OpbHMi2<}b>Dy@$;+xtx5PP?W*j=J+fmgQ|=RqC{R?;ag)*hn89WWAJ-l=N1q@cfOgI~pP zF}JpoxHo*NS_pA7`Qz5~8Y^07RdOMDd312y=-~R%!40E>8^;9oNQeO(^H{8)gJne* zvWybThbWhz^4v?}AX%&})j#!KrOK7rq<|7927O%+2ub;~!mGJfu(%q@f(x2Za=a{Z zuUbzGI@r+!HE0toR$DIlFmHmjC6fTXa;P*2tt zc&uuV5Rgu|WMWVt9OiLx8Ludk7R$)P%%PV64>89rW;i8Utk=5J)dKi=Oe4KNW8SV; z3EU;)2HKU^(v5;yOm(EH1z7Y(gw(s>2sUX#{J$k`nTQDS5OTrVz_vbOwzE<(X%EGT`Vn6ixZ+fcS9%3&D@ep$2P;!z;AA8r1BF}kv z4sql2>&I5)_B38plgXea?#Xb~Fzlf>ukcbi+Ml-wzV?)znMOSd&TAT_wH?MSA8Koa zu^WESibac9r^QJ;C3D2Hy9;tADcH}&q?e{{-Jrw6wY@af?{fbHJ&zK1MzzR zBqfiEX;0y)vH|f0-lHvyyyVbOssIINia9Z;Q=#u#49V7A@>`h9J6*2K1vm!pLe@2c zXs(P3dQob5OYu4?r7N`9;Cp*N+qbRJupXJ&E!UUop@0A=LA8;r&%dh=-C> z9;9z}Qp4pRchUD&4(=Ko%p4coJ}$UpTyW>O;I8q(-R-}&@xeXggL@|g_e}_9O$hFv z5d3*!<@dnE;K7N(Llc9CCk2nR{~nzbJT^Iad~)za`|rug!BbO$r`vyjnG!rRC73-m zc((ob+|=OtsllA(E58?(4_<8lz0~W?0~*>ISXXx)Q*qj<429R5R2X!SaOp4cx~)&W zydpAb!w0VxJ;7oyIF54SZ#!`>Gs2q7i9zaeS4~P5aVo0Q*IpCe@pFcCjX;as^|oFN z)o{$rLLip!!!s5E)nn4ijC(a-MgWw>LAz>TWX@rjScC4GckG&95n>?3L&>S<)29s; zSGxTT`t|1Ik+KMJB|QB2*qCby`h${cS%obG46^w|R--cc5Q&LFq57w5=#pBLON(I+ zPKqR-1Cy~T!dc}32l;l*OO{THWjHaYX}-qG0z5ZgQbJ}6caRqB8=W*V4~}*o>%`B& z^tOJ9>tyPfCmOLyoBDcqP)}+`v_?MoI^eWw~pV zFY|CYS04EShL3T@y5wG!oEIw_RBY3-T-l-m8lBM*q)@HAS?!i|5gY|zvvxb^kqJp( zvVshBQh4P<(uJ%SE9Hqn5;r|FF*J&_S5o)_a(u(b4kzB5o+11&hmR3rAjHGS>Axm! zk0{P^sW<31zaxJcA2{DK0c^PIt2^_XC0J);361$IORreIUL=DFCQcYqQW$H*_2*tK zYxXUL7F(HMDm18bBux9y;=y;pcqG-ApBF76EGgU1#iU=e?T7!I2;eP#YMA8FNGksD!T#B*K7H_qo;U)B13!^Z+AhPUem)Bnx>Qk}nq zco;dOrI6#;vb^MO`q2i#qmK3vkDY(_(tq1r%!b)m1Adt$q)EP0_NKIjF{uTt1ep4I z3G=vVQYy(Dz3EU-&FC(9S|(5d7=x`qrn`llKzVoFD+QgX}`-7RY}O0I<^+iCNjiCGW@gB zJ(tM*agR8 zp+zOkEAecD(3IZ2h5;>e66r&i?Ll6@lzj9e zofi{TgLzmVD-C^JJh&T5YaXq%NE2hWQ~I-rdAF_6ZbTMrCpNC^RkL-G63)rO+7GW~ zwd)|Yz^jt2=jJ%w%Acx&d5-`$Gw}`UtNL7!a|^&?Mk73t3a_n9!;v#r<=g@=WSLl5 z35Q%^3MgPW4;n5t3sBIo3E%KB<-|wQOR6_Q41{<%Iro3bjfO@o;PyA^f*0x6?Z0nc zq~FN2s4*5ps79t{$udq!gW*VF9=|DlYGGDzJ?|Pq&E#YWi@QGTdMuMrGEo`L-3Pt2 z!{G%7vu*VVy-=ccFO~EGnPP=K&ynGaw#+1>xS))lm1Pv<%LoK0?2>PsuQ0_W8}bbw zQ%>AW|6i4EnTQDSaB|*oa{j#VM@jotQ8A5Bv6Zt07(`B|WRn-{fJE}+rgoZX>O;cO zybCU&`ruv$4O>)FFNP{3p=22V$92#P;%bt@#EOAz1#c{l384KaNUroG$2>%>Evn>= z1^9{NIHtYClGIeb7|c*k=Li5qUKn>JedB!YG}WuwH++no=DzTm8X&|Y$ORA6cl6BZ z`Ca9Pik;5KFvn}S9AmQfV1gwRN{ojAo|@36j7h1qbKC{J z45NAgPAX`QGEI7A5`5@i6+aP2;@cVl{N%lU=D70{d4s~}=M^|0kNH!(EcJcR)Ns1- z`2mO(czwgih!by5PpHP1>i7sT5aJPJ+9}0;&CZG^$y8Ees2FC)tZ~Xb-!PsHql~!> zP=jx?OXLz3Cm3MZGH#|(M#D3+Oy)_95HzyBAhF_O7I&&-nSkZH=n*iIfC^yc*cu!B z96GXH7OvsRs<$}u6J`Q&!f=VDs;qo@FmcSjVnrmc$_wDGq;H(hou+y<`-YD`Cx&B* zYl9GvAQx^-X6TvI|GUZx6&pIbc*ry4YPKGB`?-Rz&`oh@t>fh_G00GfQ^H}(3ZR8k zIhFc2xV^hMoI!-Oq)Jc&>y-LBBCgT-*Q_iz7pBa|IOejq??tvQiVi;iJ!q*QEPZ*Ez%jLflF&xr4r; zWXLKitPv%GQOQt2iyKCh1HB1dv$(_3Rv6C^>eSl}@h^sD+KLHTS;eKoXp#vl6O&lD z-JRS(HEf}s?2jy`7`HJoif{Kq%tB*)W`Ij3U_}HC`KEi8JQZIxUeZT3WHnJ_zHgkb zNZn=H@(mwNPW)l`SuGLbRx*7b`k;*csQ3+@~RmUcivCTS8?)UE0u)a2WqN4C~s?Yp-yErX!XG~kAIX#PORh`tgusNTy;jV z@|Y`fNQQ8U3EwzhiBP0A?HfLtoOpV8cNKl9P8=ZyLflF&U4dMaYOvbK)Cffw&dSO8 z(pHXPP|zX|1C4xk4_G;9JTZq`OqLuVq-Sp|ga};QC8E@fOq-fybE&!~(IxWWGVx6cOqmtg*7r=xOScxD)VdzkWJ?C)& z9S9$DD(yc#d3NL*=W}5-lRACFM~4$1MX%^dH||L{=}9;3MK|k3H}6Ha=uNlmO}FYz zx9&r?=|i{eL$~iscj!xZ>`Qm*M|bW=cj-rW?N4{>Pj~N6_UKRc8bJ0QK=v6x_8my} z8%XvaNDdf84je=d8bl6mB8N1QLz~E9P2}*wF76RbaFzCTh1CPimkGZ)10wfr6;1Vp(Ys2|1E|QTGXL*!Y`L)1_ zC)3?(j}VU{SB(m;euRGLmAlv#Mq?t><9wA(lUj4C%v~m!7Pbi2#2%{t#2v~GWPaM*4(y93|%{P3M zl6)QdO%i=ew`B1Y7+VCtgwOZ{=PljDdOuzwP zgpHkn0Dl&+ja48aw62YR>_$&^5DJv_>XJqN0fwle^`Tc*Kw)?UGS}_g(l^%Yv;Opi zP5Q?9c(i>;`-YD)Cq9~9Sz}u!q6je%;!(l1D+RaA3xD##Q5?wt!$j5yl9jJ9vSd|d zo)5FQ2{Ib$i)A+C=q9?D+zT`mo>2lCp6ou1(R4B9;;W#M2{QF|uSHr6b6dTkhx*z@ zz~b^4MhT6X%dR?6ZN70n7do2M=^H-EoOm+bqn7p%^MrVGaNX$O`a9`6CI3__^5H>SHt(55#m1-|59C&5RVRS*pWP}ZQZK4Q6pBW6rF{Ui19`13Ftp2 zAOm5tE|Q5ncyEM2WvQnAY&7eZa<_t1qfIM)HfyiBoL!WLh-!ogWi9{#yPNI|CktEp z`o{Te>1C@P-|$i6#K+L9-JCMv3n3mI+&Ct<>ErNQTlV&_9-UC}%m(>WmNYnb7P(30 z8{+AL6MHi98X{Br?RKJ-?F0__nT9oCAz{)xC7NUa4F)$C@ zy)A|jugV}`edC18Y$YR@c^Th0pSebMYw!&p1x~y+{e#sn)%i<^#|F2q7tFG2c;9N% z3l)R=iWM>RZ!uBMZCxxITt!Zt3sJcR1oTVn8_BEY-cl|UzO@c`!Vgw}?C1Z7&3(fV z<;g-oBSw?#@_ddzp$h0VykM$ne-z2GongLj_{ehN55q6&hY*hqZW|lSyoQX3`c_iJmM%< zBi6caoR10SNy0aLWI6Gr;jG?t>ppawK6KkYbo;(^hrV>jzI3O4bmx9_mwt5D{&ctg zboc&bkN#w@0c7t1WS;?K-+^Smfn@)ILIzk)~;&H+4o0FWF zs3$I^Ee3>&HAW)wSY!8qNuJ_Z*&l|SSle5Qxl!-&1@9+(8fq&>Y-|M)Km@cAFl0r1 zmuG2zw)7ZkhjC(N)6|4@d}KNCj`ZxhBE;i@JH`cf&Y@pu_w%Z_QDX-u&}e~bE=Xt8 z6Rd>&T!?3dtP3Emw@Vg7#p3l_y#b5*A_9IQ0AqV9-7(4ZM^og)Vq5rzj}#~VCj7Pz z3Guk#uHTWrh|O68S2aS#f_L5A9XcUsRNe|MI57;|@&aJVTm&qJimitba)rkNhyWs> zgg~Xg+kPz@#(5w{_<|?{H zBUB8;H}$Esi_wh@m(X*}QAJK{j$r{c*a{URCoaHP*aRYAf`E%xP+$w6iAZ+u^^Nn{ z)y}*&-|&&*#J{JP*2x~?7$F`Xv~5A2G`G6vHE4v2Q`v^0b2Ivzny`YQqwUVAD+DV7 z*JmY_#g*Boh9ehB_0sx;6tzYK{6s)w_DP)}_)M=(L@}HeYkm;(4Ie2^Jc8~~4=>dv z3Gw*gp7FuGchisj98GLVr4uSn``R<~UVdP*n6|ZN*O7$Kt8Li=>xmH1^U0XY)%jUlb1!s4E2YCY{_F#H-E3U{FIfYyM%EZ}{YM;&te;wS5k8E+L)}{CV}@ zk@?|&YkR=bShDjg^2#1i+piC^3T+)W>4+0sITNF{y-QC!a4MMLw3#t{FjlW!ybBRP z1Y9GaG2^fqL6GojGcjQ38|QOvR@M4_!zYIme-nO(gm_}`=ZV1s$CB4nja^;k^<0zD zLA~1rLmPj|7Lty(uhslg-WLAa^#HpCPg5huZH?N^;f;s@BH$DOSM!B`z1~pMnx9;J z!zYIm-ygnI!(XbCi4aGGcw+G2#NeS9=vPjMiP9_A*}>UyE}NqeEHGmTC)h&9u>0{e zoln>Nuw@H>^Ll_BOCBC#YY)1)%vb{=fC$78a1(ojiNV8Lk>`u=QAM^0goCGglIe(i=5;L<1mcRw%$Cks4omwFhOYl04s~acvzKh_~dZn73g98=&t?g zZvE-*{mCBv$zB7<-UG-!1IWGu$$kUL{sYMYgUEq{$U%e1!A<0lCh~_Sa##~Nd@wm; zFgbECIjWf)-As;YCdW0CKMog4sxTgjy($z>zS=-!I32cB zDQUD>nHSG6ttx;_dE~@~M#0+=0Yso45RiO9R%Xzcye;^)SL9%+Vcjc5d_=fBaYnraMtg#zVvsomCbrEn;8NVhyWsh2-F4w zj$Y@8CLP~C)lnNJt3xd^Iq_@ZM@WdX2=SEQ>8;7%=7$Sw*kjziGpEFxt#1r`bgrGiQm`TDHG94b+HIB5aKDp zU*Px0n*QLkqt9C?5n|YRX1$l{9juWnwskqNLPP)&Km=+A0f)OLte#09}E=M8NTz<(4xOk7)(Hn$SVNetj5kLeG zf#MNx9bvJ)#jbdWutiT0$mGPM$syc1#7Kx!2=Ub5+5ZV%sNs#pPPczC;wwnNwr1=7 z#L-r1>vCd+hyWsh2-E-quFv;`Eg3a{5~|<{0_mI>HWMQu&e}2&MTmhAxBs5ohP*mI z3_LNXbuk?6G!XD${*v|0#DI?@qHi5}tPl}E1Q3C0M*y}F!z;-AsBS%tLE>t660hV> z=ftE?PN#FILIsZKIN91-H>gE`9wFI+}GsU^4I zb#b%-H5CKG>&Jl1V8>0&c+1gQ&kkQ002t|$f~fC%`20BmUx z4DWU>VUXAdOV^eRDV%s-_&pNh=))YbQzqCRVm?9~5#r^8msSY=`X>Fpw%p@qZHgG( z5<4_pY$lHMadDmoa^jlwd{hb%Km;@pC}zsQox~cZ!CS-#q;TQ~=qq({4zc-`37!zI z5d3ZJ;FVgX#V&ZHC{*C!WMbA6U{{8y=>$8MDU6($!HWq*01>EX1d1WVc-%xi`6h4kM=xBc~4|XS9$rTgX{0aB|*oa{dT%!3Z*K z1i5eoxu}&~+)6HKCDU8Ur6b8@Bgy3>$rU5Xm7~a2qk^kP1=oxUt{oj*H#)d}ba2Dy z;Knh*O=E(a+kdx=4Q7lDZXFxkHa3_!F1USMaL2gd&T+wA}s^Tf*Ufr-I`6N87W6Jp@RD+DjE9lTbP$4~(0lc9#T%DCH141LMP4r%1X z?glBW84*APss(`p_7F$23=X-~;u6&*X9_3Yl3s{}IQmju?AW!eEfei*xI&0m2>uSg z?a13TNs9{`>|n@q`cTY87y}3B>Kgb^T0{U5u!{h^dE(*`Txy)fY0$(jELdB0A&|m} zkr0~@;uV8eRt#RPNm^Xw%XUsbUhg92jhwi;20oM)5kLeiA^-!R>vM<~k>j>TrxS!l zSg@+9LmJgO?L!QClrtoK?EY#=9Q*kS?^Km=+V z0ob}=eFzm#3O`@PT@$tKSRQB>=fqpm>3GV7$(D(q3Gu=TA#VS@v3>CV{E&EHYilAv z99L@m(mK?vm=kuaA3cGb*qVD`MTh_*;41>~R*Ch&Q+_sa`tG%_kfU6MA`s`qNQmtc z;*}P@vC_gfcL+YHC0gwCWxHa?rS+pHiV?feu>l)H1P}p4fI|S@nt+&vJcYGe5)MA% zWWgjN-~@qAocQ(d6Fi5wofAJNdF)zp5AjM|gg7F^D=&NtewzmGzeRs^V#6{jg~8G8 zc*klh=7nPGJ3x>Vm*IxkCL(|c6oEi#n5Q`~7Rcxca5$ME;Z=)~bhdHJO z_6hOI3*Uy{x(na6PK)2B3;#-g`YZh}{1$|?NN09&6lIajlCf|ri6SL0(#qHtB7g|g zIRcgAhT0mfjFXy`;5OnqcfkVH@5G5up!edJ>a0hIBSO6L!v9-&;XCUseD6Lo-`u|c zqQQ~D*Q+o5yyN%9>I>obZ}{yTe7%1#?<(@$Q}m~QQHT4OA#z}OploX_G7@0-01f2C z=3b38AOeVhR|u3I9WF8pSYc_t{%S`zHi{o>=)kFfn*=V(`$U;NeNZ zBkjLOCk2m94j!KzJkkDpa&qw0l;COeFV#gK=FlL-t1NsEekYTE>%Dac8zgoPzU&AO z=MZAx#O=TTtg*22`_;m)PbJ^oPkyqv%fi+UiUPjV5$iK{2|aS+7`*r=B7g`~H3D{{ z270?DkPuh33ss}=i#YK|;eU`2yN(b?gm{&O@567W;9viu3ss%wR5DMG5VzCfuh&@k z^_uO!U4jKylON23$F|O(fS2A>p)f3O_cc4@#D?a;+Ytdoz$*kwJYpgu&`5~A@`pMR zW)UZTmcEA(Vy9asctX7D!VloL{=&I`r9a5K+EesLD};E>h2OB>Z-e>M$PZ7evvVf4 z=@}FcjF|MwDW@*@VgGNw+x$P@uJ*DG1j_j;N5?@ENQi5|g{o17MV$Ct`WSARaJPpzNr+cn_+k6+qbtcbGOhy~9yX|K z9gg0s6YU|6ZJCHgh#4E^67$wvIB&y+^G_q+>ycxPuXrr>#JYoDzi`FRK3e_D`IXkNm^%0tA9Pe!iJ>@F>vBlKc2tp-1$d* z`Tcy`TPaL;eRMqLgJB&xv2Q~g%7X|X0_F%5`KBENR`A$0bCY2WCI~Fz#7KxsB*egp zS6lcA{LUxy-lp-G=&j_t;tBDZ|DDHvzy0rmtAihNPdkR;EcNW3C7;=R%BQbZ*sv}k z22Q-{NAq|3^ji~OPu^SM@f@!;Nh2pt!izbG03uKW2*BWGGB!%y3r83gc|Ls&*acN^ zfxyq4cy9PL9=m4!9Ae1`F(bsQE&Nye@6+`ce!gGu6&x`EALiI%(aCG}_Ym_@;ZA9e z5U=^uyq|wR&fDduZ|@KOyMSiC`c|RE9LsEH!>_FVO*AUfXJ+g{);4KZT`$l3BqOaf^UZH&zJ2%j zeCOz%cul3cmgG>^>0LS2JJbzrZp>lSAvVgcnN=o?MRi6FapMSaN*H3V;4^fSzz+3? z=2Wa!l|P)Qt@e={jB{ zDR+XWJ#pWLx#(0^slpI{pF`YSgxEC1Uf!pP)AW?c&r_88K;S8X_mUfqjUgsa-0zqa z^=B+9Q#>a3s9zWC5ClLVISEj$w02IL6ms6l?MlwG!>BTuz-dqX`-YFvx)~AT@3SVF zNttNU5PMmlCPr5*4Y7MSvr15-{o(&^IU0FE{W`Zs6VAz%m!wc0Bh3dzJ>c~R%lOlCg zk@~5w&x+O0i`CJ^>X>46Y>7IqL>*tEPAE|)ma3CT=vQ_Iw8W$IVu znx>blUze*hD%6=3>MUKeE7Wf+>bDkkj;^^Db)Hq7Z&erQT4+@l+0@0lme|y#Hg#D% zTQ{e1%0zI4IG%?1`h8KZJ7GNhQAwYGC(iJh6sHdYnMr^QZdmo&CjWpwMw4x3Qo>oM z3W3v}7={=*#HWMA$r>T9+7*)^vGJg`^WOm}^B9qjRGIQHP7nZrs1u+Scoa4!*BesF zhhEZ~RJJ1ON5l?6AQl8PPh9)mDMW~|sIG-76A4e5AVYkAU6dcU zH!hebwm|>{KmY_lAms>Xo_I;aKBP>b%0xtq>f)I)L58^dZnj8XY&pUGskXh z*fR)#00@8p2!KEw2xy*oT*G?g5bK^8W!HREggCekaWX`Rt9CMeBxSSfMM zbnc*4dX0C8cR&CHKmY_l00dHqfaZz&H7vlQI@BT7;>1a5h@Utp#NmmeP0-Fo-t zJ=ClYW!I`tGSw$^9cQYK={m}INJkjYVO@t9&p}=FjHgbM`vBvv)wQ2-@6)xHp{^X7 zb~BViOeqtTM!ZdmVH$DBBd28*PyRuev0>w5WTQiNf|now0w4eaAOHfXNI>(%*91OJ zR2||n)FD<5S1U(!9j#V0d6i>lblj_$I^k7Jo%AXvYfkG_jS?bXjncgQZR}JR=S6j7 zh)I2qM!#!a%TMVm+usP^6T=X<3==;E0T2KI5CDM`BA|I<7-B?-y^_x>>JogX*VP5J zZcd0HuG+!eUmL^vYt22SVP;Uk5H|-9?}GpcfB*=9Kq?Z@JaIxg)geM$jRmSJTX1bWQ#9dbY-X&)(f$bT}FG-l%Dc1cn|;q5C8!XXp%sOB@MMX zfquDxcX9*o<_6x&4ZNQh_#iLPKQAyKFYsZ0U|@b=P<~)=eqcyJU}%9ltU&#!KpkGF zjwn<=E>uSrs-G08ql(l|b$wQ>eqOAOE>_1Bt7A*laV6^b5_Lj}ISMwN-=$swkc z339`lwz7Q>$9s)k`YX*>L(VImgQ>22!JsZMvp$zh1E+rcwxoLV|Z z>si8nKmY_l00a_F;N&UAw7I6o4K}!BE)(TzV|rY&>|~mI-Mo&@+K50W{92^k06N^( zFbP#A(7IU*5+_ZBn1aMBIW^^;B@7q@KmY_lAf^N;AZqyCci!J`_+7GqM)WjYoo+jA zG+{AZGI5LPrAd#SlP8{xvTH77hfCR6rD>P0-Bk){56P|U)wR#9koN1Ubt|W^n@gD>LpxfadclO61VVW>k4L!2Zz#I&vshPb(B z74L%p2!KFJ6EKr^VR;j7lqr5p`6MvMArDlCXd7bc%7Mllh!8XG{Y;pRIj9b?v8ax6 zh_{J>kQ)>)K>!3m00dHnfSJo1;(8Nq0WpB)2-vHZQeZw+Zm?L7vqMxn)xi)`)&vZ3 zTMRK(nZTmDSU>I9KL~&T2(+Jok<@EuI3T^DIlGxc?^D>A{*0kNY1)5#r1T!h6Gy9c zGYl~dG2^a{*bu*1FV*`I9!}|L1cL_w5J)!y!N%7t+K@sf4?}GO0m|FXaA!=OcyNAT zNI_s|fjX=}{ir}4UZ{>JR6j0MM;5A|6se<%)K7JNR;+$rtd1^L#}un$OVn{C>i80M zLWw%DRGp;fOCV(e5#k68arf;UwQhzRPPbpAI3ExIfz%;jq&iTITO-v05#KiW$n^V4 zCOc#D#4yCDG7-PV9Nl+tFCCQTvYGx5G^z7T6C(uy5J-6f!9ic6m;)-8rJt9L?ippK zGwy&0G0LvRx>H^E-R%7b_`%1dZ4z=MQvR1KP5=ZzAZZC0-q)zzYZUH96|?9%#Z229 z-9L0YCG8C#^?`Lj$^_~VN4IrzkA3U|2l;--q`@boRf1Ztzz0YDvBeHS00c6c0K9Le zdDFz6Fa4`RhP3=3PmCO5H0EHcPcqdfbRB1^kLfzfct}SW&tYAM7|%gn^^B)Zlly?a zqE25_cjrN_-wA0hufPFk^e<|hJP3e5R0$XbeG&IftRuwH4FdEp4|GFD^#)J6oslQT zqB?Y{Yl|W7QOCY?LY&I^nLtC*-Pafp2!H?xqz-}LwQk7wg$GSq0%@O0(E(K^(7HL& z2=N0)`KdgtaO(WN#YjN_1d@h8aN2`W=OJkg5C#SUO%kB{HeCb8P>Jp%Uaawl2BTtMv#4yBR2pE|UMqf9h+C%Dk z9gG|V!Y4p~?4?=jJMzS6%z+4T>x=4Oh!gbN7Ka4^5J(~d!HeFI`4GN&!Y9*}fW2yI zI@#h5=v0T439ZmXYgH!tosyF1_Y#Hz0w4eaF(wdVf9ZFBy4o6?7YMY60Oe6omVAsK z$2jetJTY1~BZoMwvTIaj0wpHm^jzXFAOHe!Bmn!{9!r#j-zAr3MDc_F_mRi987-_s z{+E(oDDyi^H8y`n=1e$W4>>N4CwO>Ch%x*jrHw5%Jn?76>gUDk=wfwDu{yRy9ao}` zFHt9ys1r-oNu}y!U0;-`UzVv;%G9Z4>a;TTt8z`#%hj*T)fpA)%nEguuGtmpHx~6< zi#kWwT#Gu-s?N8n3v?~Cs*7yuVqHsY>QbA!%&uv~RQeCZUO{Kb);ZPs|0w54g0+!fzUOgT#LlUk5l^gAWxjw9O9LB6*A z@BUW0`y1)aRq}xK{>i(P<%d*8ZfNIZfv7P5&g9&-!xV3JEA{!M+ma>i|?0uVrm8T-eGv3Ms2JVpmyi~MJ z<7`to+Z4|BC1?ABvrXn28)C~C-ZGlEe9l`w<1L@^mQlRr6TV_3U-2>T{YB84i)&Jor2aq#^;s6Ms>rep#kY zDO0DGsng2TugWz|FIT@VS7%hHGb_|tx@K3X-&oXdE$SRyb1mvTt2*DRF3`2msxGpr zi*+rrsY`9@GP|bbc69|6Ax0hI?~4#q<+ao=yJl9IFc;OCImBklgc%_=4KaCQ$70s8 zh`n!vxRqhh7gy`&$ zu-TF$UFs0G(-1ora+M3X%K6;$TctYj`>Y1q{`QF4XPf-n1-yL*XaAauogpqC#Fq~g z%0Cp!1_)*Sg|ZKXviF6u_k^-{gwlROX`QKut93`49ntJ}-C_vqTqn5~=5 zPIbYJIkY0gdL81nMTkv9Tse=coXb_t(e*87|Aw>A=IpaL`%Es`3~|ZpLdk1F$*V%i zD?(Kt@xd|viEEI3(T<4+UyUPy5C>wU1k#NFdE%v5REHd5Eo%aXxJ`z* z=xMR&Ut-Zy;$^Q(6IQ?(r`r^nROgd64%n#ZWb~~-j&D-kV;BqwWHNyc{R7)kWdadm z7~;l@>cWW-n})dPNwM$=vG8&6H?K+)mctom@}wHIb5C^#Y-Bqa<;;xM6{zYEwVMMw z0s#<+0Ri&FJ5YA*Oo<7qHDQ*RpbfLc1Z`w?m5Iz=R2Q5>9Go)I*bo;!CKmofEPPb_ z&5P26rEtbEn6c7#m&Qss${9$xEC?g$Yh*hZL0_zIOW*qxX9fc4OrXQahP|jme8v;Q z5HnTV8Lh+wX)Ej6!k(_Vmcdmf+F*za|1K6hEEYT@-tn$~>2|EZOXmr+&F7YKwIG6* zxFP7<=If3xf&d64Gl34v8;+wfhwh1Ch+&AeI>c>DnJ^>7rXeo)n^f?iRPccG7L&8J6?gbnN1VA8V2y~#4qIGkSCq@o2QYN&<9PLS& zFeAiU^uZK-WU6y2z$3*0sc@F14x4 z?3$L_)fIMiC8<(fRjIDlwWd;COLC~|9O`;q8yxCJl2h5_R5t6{;#5dmUCK6H+g%E2 zhfCR6rD>P0-Bk){56P|U)wR#9koN1Ubt|2i?0=O$nt_0EYR|TmOJF!)>KII!290fKLf#?oYj!Y(_f73P z45J4D5J(UK%@f}pSOr6jDic^#XS8mPMTFQe#Cg4?ygy2LcS^Ut>PLogf@Zvk51VY| zAk4Tg7P>`zE%5~q009tak$~ZeS0h3k+P%NX7=nzww; zTR!70pYoPbyyX+VVkBSjF<&u)uNcl(e8g7_53zI>oi{-IDdKq%`k zlzkv1Lxfl}#CK_iIPVTA_jbwlXKCgNl%!~Ja!Sw-DacB8GvSSqP47!78HoEP=w85K zK>!3Yi-6{d2LyH_W#Wt{h9QO_7K>jH!>mKxxXMIG4)OO9;vhqudz+MdtCV|-^zsPg zQ6zZ6O?WCWyl;Z<0303!KmY{J5YRmFCk?g8A=W)H3^5FG{0wpK@8z7E<=;N$uRV-~ zcV{M~82^88XSg`00teSPLt~2=UuWzd1V8`;+Co6{#48$3T2w5mgCT|?j<+Gsxk=8s zQMTS8FWG=Rinh#Ot$ru|i4egJjZxpX)eD3VfB*=9K=KgKJTdc~f+`c#y}9PJPSq$O z^3^EK%kQf(CHra&NxmA%=Ou}{1fSOs@AHy4U98VbVs!a@)udA-ruw9=6HN7SUB{Se z(ox1kI>LAk>pH}E4(h6BJawAf2N-v)uKjw6iG7TFFXP^$Yd2H1i>cbFYX=&0#H2At zL@5(SgxD~|IXB2Tz2xlcnxkI>asK5I1RvvwO#qoj*u znwBvZ5C8!X0D%M$IPHl?HPoR~-Pv(s7-AUWxJHN#L!5QFoYh0V`o2uG#j#iq*EsY` z85aqdXmLmo009sHfutvJ+7qv6IEB{DL7o_f7=}1uhB&LcoOPLe)t{C0PNE3zkW952 z+TRa3Bm^cIn;Fyb-k_)4s|2Rscdp8n{{n*Dx|G0Wt*<;E`_wirR=QIv`g3SDuuL%>A3hC8q3}S!E(Phd4MwY#8D$-TYlH^>69OP1jb|wS{$UW?h?fZDd^=Sl4>iwN8_B zE$dvvI#=r@CSZu;TV*h?I$DJuwXNLauTFS2>@noX1t74srYH5F2IJ!ZF01J^s#a|Hf@e*ZkS64cvyJ z5R~~qqJj@bs|$)KXTVI0Qv?AJ009t4b^_mf;;jula)_Ju#4yA##1BZ(twS8XA?{q| zzv{Ncmr9@|Ym~f8MwaX>6>|tDA=s$-K&F|#WhDNh=0mdoLcsVy00clFg9&`^i3vhi zb#*!}s?%1~Wm4;Aq)Z4UuL~uw2_>%zC9eo2FAK#liN!Cbz@oa~lnEn3Ooq6#)8EPA zANyszGboHDan!(qOmM3XIJo2)5`Q!J7Ya@t1V8`;QkcM5p7)%OJQSF z{5^Z}#48X00T2Lzv?6epC*Im1q){DW7-AUWbchfehWHYT|Lp{}LE(GjvTFvV? z84v&g5CDP537qAL>FbxO>nhbWXv_ga3`3k&hWL_l|J(f|@WjD&AwqH?V1FZ@C-Dss z009sHf%GR3>WTjm*q!>F>R^arh||pwUsC4ZxTU4s3A0sla9s%4-}IltafToO0w4ea zQ6doPi9c;PlH#qKVTfUf)6ft<`gCaB2_qqx*18#WAwnuYAon*)GbDBc0w4eaAdo2p zLOpTacd|oW=TO({+Tc((lAOvWr?Oes7NQc7p+U`WS%y zJ=Lu+#5J-{lcdQ@5_JhauOZ&&C2_h~pO?hw^7*Psr$|ioNnIzH>f^eOG1a7_jE8iD z@f_B5i18fMRnK_pG`SBj?pj^@8TUS2dl~m0UAvj8T};(ZT|1bn?U_-BI8zOA$1>rL z`;I^M&)r6+479z7{bYzEfB*=900?9>fhIih+ktwAiU=_bF<1F5Xa9z?&*tp2IQvY_ zK7+G=&Dp1Owy!wbG|o1avrXY_UvjoDINM~-I*GGRv-Nej<=5GEn|4gXx{QU zZ~2V3e9Bu!@s>~cijjQ9$9%;IzG66E@eyA!j4vO`mk;5~2lM5F`0{~5`G-Q;0HLhE zQ1*dPmcfSj*Lg?RZ4fega>B`j00@8p2!KEw2{hq}w>5}JnLvaXhB)s}QeJN)kSa?TBMPA@t8Iyt+ioPDjFeT|%bwH#6F zW}{P`S%=t2nV>~=Lp~18A&%qBfJ1=*2!H?xfIwyuXu=Z{fNm-!4I_sbDHDhgC(ICE zQmS~mM^Jn%v*s* zRyr0b(`U6*e=XXx0rm$1AOHd&00NmyplMG$r-4D03C$B@Q5|xKW0o?}sv+)Js66r{ z(kC)^cE*{500@8p2*i^>)1H_{@Ec`2%C4cx1QylBD2F&4L)rab& zUU21`+4n6i{S9A9d;4`PLcf z5g{f+d~p^$aRyJ%ICT&J0T2LzI1*^d6Aum?L+fU(Ssgmn#icRFudjT%HOCw7&wrBN zGyks#Q#xhBFvJ&kfhUgRbcjQN00@8p2xKsUmOOENgWsj>a49>hH0{#0yGkMLA-R>k zy7svh(tcgFZl%_v9MDzgQAqW=4tf+#)yg4VhpQDsN2(RlQA1wk*cl!7DyB|&6+@s+I#;Jn<2!H?x#F0Qto|uMlzgh=F>}7nKe7`LaU7K`mWL+Cr*Lv2qPLp#j>s-S+SF_Glx>mBz6|7@9>sZD*ma>i|x)!sJMXX~X zSGj4ymc&Z8N*vf^Onzf%V)ghQ{FO) zw|v4^jN~gm<|{_<6~p<8kNApVeECqmd6;TJgj*lI~ij1X3nq z6CvKsxHCIK9H!Z|*=)~0|NNv$lja2dM=$BkZr!@Ix|5$3-I)?)*Fp^OMHegk_oI(p z9H&DZ3Isp^1VA8z3AFBs`v#67hd3rF6EMWBnc3{@Y;wJO_Uvi-2|ao8BBAT z?`MT~CV3s=#)i0icO*`|5C8!X009t)8iCe5aeae=MRn27Ax?-P{x*pg)wP^M zeBOEIksBtn8_}Ik&X~T~oHM?l>yV^v%+c5oUv!Z&dNdLzBD((gFbIGE2!H?xw4Fff zo|yK1zj_c=CbV^R(OOiO*@n369iina6O<{@YHYZ%} z%DYR-yHm=$L(08fN^I+9qf=dzhPbd0RoI%l$ao(FKmY_l00g2>AS_Qjw}D65H5lTk zEUF_z+;Sb_-o1NA8Xj)^SkO+Iw8j5@QP-3(#1~zt^m!9O;>H&i?|=XZfB*=9K&%La z<%#Lwz0^9?A=WCdwX^J6#z%;YUOU)A)&zOkXx-_}+2W2@%uMnKF&W~*e8qPvS|qR^ z5C8!X009sHfz}Cx>xriZI5g&fA#P9EHHr|I_7i^9e6u=AnP~lnjpP$e+T#ECNmeqa zOpqbI=-0~V&rxn7k}HkRf&d7B00@9Uy9tEriJ9*LJ(L5~rVgFz+Sr&Q<0Hgmh>Kor zHb_is+kIGcXs{QOUu_yj< zr|Xi|5MT5wbp^BMlN$QbfOg{ix;|HL;`rZTahK)~soK+zY(p zk}YL|46)O$p2E_)I8A*x3y9T=5ZKF^n%C%9jt}%Lnu2 zgZT1+LivY6*#M!ezfkspQ1+fs_O1|Yh)drRI{$G@V{c0DP$uzNw`6NC$m2F{Sx1rP z7SfR$XBGdv;Gv|-Atpn7;V;z<>yb6l+U3X3K>!3m00clFHUuK`#59JN11FI(p#_N% zA&$flm-Z2U)#K?VJ#j?!*U0!b*Qu_B1Plr)haCFcUw2KOMRkTD9y9=kI5v|U_6hIGktUOa&E1ms zZE{ylrcWeEl?lTT_r3#Z#7$m0ya@sz00JNY0&yY`u_vZ+4GFO1iLs~-ImF?lOc;i^ zujg2Y26VZ*{n%MLcSaFvIS2}KMMKqMV^@nY|LR8;tS7LznY3P;&84!J_72!H?xv_PQko|ty}pn4LW z>d=@Yqz-YDhPdQq;YT@5*PUqL?ric$)S)9dHf(OU+_|Ii;yf7QCh_7;5C8!X009ul zOakrl#M>Jbv~EVHy3#YPo2fBJbB4J1CGn>vJx%`_yg{MgNS{6WN^lYdZBwfdB}A00@9U0tmFr z6VrHK39w$}*cl!7DyB|&6+8G2pO+-+5`11m zyw6MGbg@1!iP7crRg+GUnCg?dPB7KSbsb}>NkhG_$an00MoU7K0gCS4m@*9O+Lo^`F$sZb@ma&ed ztYe9;#jIly>sZKDF5oKXbCvVB%DG(S9Io@zs~*PMMiXZwn? zP2+4+IolM@_9bWgg0oHLtdltFM9w;aw~ptn<9O>>-ZF-_jOHz$^Onze%cs0$6mR*2 zuNcW!e9Tvj;45Ndh>KqkFS(`Z-p&-|jmoXu!cJ)IU5F?CS=K{|iV(vPw{WHKBM<-q z5C8!XNECtgdSV*)w15OdT(yI#+Rj#O)3p_bSfE99ltWA@6BHpPLtOlvSn$Nb5Mye- zq}+y>J^+o|LI2t^E+HusFvKyv(AYT$fB*=900^|1KomSN9s5C*Ib(|vA%-Dt!Vnif zD;ED-{NaTb(+3A{JpcUjZN7tB{bG}A@;Y}t9OoS33(rGuj#jS~J^%tB00JNY0tq7! z9Zy`}5V+#|d@3<4kk0w4eaAkZ3t=y+l}%4jWv0*mU9LmZkiVH)D1r^Wn751w=G&rK^FywSUN z@7C_sw)~tT(7{JBwlB2Lif5GxiV$D;Gj;SRwC8Bc6~uQy00ck)1VA7@1fu4NX}Ed@ z1tP?V5H}GaCPQ5GFR|z;@s~ACSDzraO4T8vd(%^aw#J#n|8Z_s{0(tICl#5*(Y?6X z8wh{^2!H?xM3+D`J+YoaaSCPET&OakFRBZU5F3WL=t(jE;e+S=u<1}S`PY`q3`cb9 zQ!+;5tO;`77uaUStq!pfA->?J>YJ~kAaO)j4<7~r5C8!X0D*WDh^8l|u}=%gs6&jh zYgA>TNkd%tgjo2v_>1ahL&edu#bk(WHe2JYiF41pH2#M8GA|5qyyrC>4+KB}1V8`; zA|()IPfUk@O63}L<)9`V&3EOXADLY_XakKoQoIgv%Z9k{F|qI;;tzk_bO8!-vF*3T z6l`wN5TElO=XG@Nh)<_FGeUg9kJSz9kVzcryoAq#00@8p2!KGm2}Iu$Qx}ilsm$57 z7>1a2W=3O$}&lOO;BAOHd&kVpbC@x*jOV*-+Hi(!ai zh?_9P1rLb@f0Hh}Y)G(eZE~BOF@=8j?Ag=YQ$jzY4>Xx9VeSxyxH)=w9|S-E1V8`; zK)@gnD^E;&e@f+BN+U)N@j|Y00arPntDMJGW}$Rm$XT7~f+y==0wglUD1jf5EDH(x=77;`KLfB*=900^WKff#yXN-XZJt+#6` zR18B5L;Qf0f4`Lf7wLjahn(|Y=Y<&AXubSdr-$R5GEvY`{pw5P5U0{4h_QkI2!H?x zfB+GQp(m!jQ)2Oz3az(0+ZMwR!w{b_#QFD0`S(hldoBCnFRjt?!Nz{5%EYhA#>d$Z zKm3;fdUIf61pyEM0T2LzR3s2vPfSEsHz;R$Vi;l=;G??$3Fy6b1fBTK#Um#KmY_l00ayIG55rDm}vq3XjHiLFR)=f@`h7;`ori!00ck)1VF$f5GPMe$9q*hV~aDYQymPkUUto>GGQ#L zGjfQ{lnEn3Y#QR++oarErQBPj+~3Qcui5@9=a8Rf-F5D-x}Ni&q3iI@{YBRwU2xs` zg>PN#UY^xm?(!Qsx`w#NRq9)B2S|P13iRm{7(6JjXi>xd{pPcS4G;hU5C8!X0D<%& z5I;{$%z7(aX0>jHA#R5u&be96xk=8sQO>zR&gms*Unghxl(Vmuv#*h}ua>i~lC!Rq zvo4pjddN{X#6=a#=&>lKmOj%Q&IANN00ck)1X?8!S5K@}XY=c}Sn}0KJ}*hsCHTCC zc%PTV>0*6e5~IuKt0tWyG1Vt^onWeu>pI3%la4YT(h)OD&*0Zj4nw)D{ z=Ni_znsu(y)wp#t3~_22;^$rr_5EtWYLV*59o zeKu#G#o1?a_8FZ0YtBBMvwg+crg65ZoNWqc`;xPL!PzEr)=8XoB4?ezTgUU(alCab zZyCc|M)Q`>dCOezI+H@KA0~b#Fq~g z%0Cp!1_)*Sg|ZKXviF3tcZITdgwlROXhQ2dfu{GwR=f>`{VSp2M5{BN=78L{YTvFKl7(Nkj4lVaf$&33A5TgpVDBE&b{ zs_w5vif~#@a5xzd009sH0T2k2K)gLM4U25?A7u^^Vi@8kbBGgSh}~V)#Y^CZ!<;nm zF%SR&5C8!XNJ9b%@We!sZP0BoQYH`~zFi7lR2P3kTx?gyj7REl8cuCEB@h4s5C8!X zh=@R9JTVPXv&9mpr4b{C7%3Bam5KNp;TpEU1wIS{AOHd&00L=CAYq=Eh-$W2 z}Oz4K#`J6OsqiQ@B?@d=yC_?PMOdT@;sl#bL zqv7;G00ck)1VEr|1QPFwjd8ys3R)>*)FDpVvTM2_{>^LB=DO3il7hs}r=*lfnJ957 zZ@-V!;kHc?_!bC&00@8p2xJ6-WbwoVd#EI#F-MZtA=VA?_5Eb>!RBK@LE@Mi;wV#&fN|IA+RwQ6>DtS<_b~3=nyPj&RXcUs+O4CF@+lI+nAJWvpW<>sZ1%7VBEX zIu>%33%JVpT;)8jaxPanhpYTnQ<}7HZpIKFINsoRQY!eH6pPl)?Tiq6u29BI!a}-` z#~d#~00ck)1V8`;S|N~(p4b@jJDj9>Vi@92_==Hy#m9Wb2)<%CU-1!NF^n%C%9jt} z%Lnu2gZT1+LivY6*#M!ezfkspQ1+fs_O4L&j!@c9DD5khzAco#C6x9NO5YSp-VjP& z7fN0eN?sL8UJ*)O7K&dIi(eFrUl5C*6N{e}i~lVaJtG!9Ef)PtENaFO)7AOsC?yFE zaY>DT$R}{atvvAfF$jPF2!H?xfIyQ3lGhW{aOcTNk7Fz%#ECM*6IPtAxfXouY_4rc zHbY$cKmNA|s8~oBe3`Hf0w4eaAOHd&5D|f-_QZ51lt=N`lf0HSfs~2(Mu?j<#B@dO zc*mbqDHD%AtJc;bbvUA@9v=n)5C8!X009sPC6Mf%*ck64Y%!)$G1QL1V8`;KmY`q zAdoVi*ckf|MnaW|*e$B-^^R<|scU?*Ojx2O+z{V!3m00ck)1lmO)RXs7CG!tkTa#BKLj&{}|?)7d<`4Yy>MM2`qM-z}kT-L)6H{7o0 z8(#(i5C8!X009sPk3b50V&eoUmEws*0y@>Ttue>@vy>L{CCppsm9a{k7uAs)?mGk} zhs`U14G;hU5C8!X0D;&NNO@0e;8`W8_aETVx;gw#b-mt`H`j-ikZ|BwLp%*}*%ki2 zLscIe+xs4S2LTWO0T2KI5CDN-0%_ujjZ<31tM}ImRa;rt7S^?yb#2nMk#%igUF%ub zI!(^CtaA_hO^J+?6WxgOwK-ovwzLmr*pQiINLPNHkGqY;cQ=Wwl6r_WX?K?vrgo!6L{-* z-a3xAj^!<5c*|(s@;Pt$jJJHsTSoDgxVLV0y(EoT*h=2qivc*UGPi8x97K zZ4dwf5C8!X0D<@sNGnflU|UJfc&`9MT>O$){GwR=f>`{VSp2M5{BN=78S(wuicgH7 zmYEhLj(r{C@~ixPhaol`zsDX&0s#;J0T2KI5C|cVhMw3s!< z)CB*56A`#!1LG@Wl$bW=D8CwRIOLJUOAr775C8!X0D%M$NLx>Au&kE@ee0#mHgadB zOk|iL{#TpaFah-O-&OuSR-Nj~f9vo25n{s$c;<0P5C8!X009sHfyM;V+!Gro%%}}h zj{9%h!fQFi8DofDuSxHJt1yvdN`%}W!)K|nXx&_Xt-tSZxZx1kcnJa^00JNY0w9n` z0vX|nO~BiPz}x$!->l}+dr@7lf%3#Ps(IFJ-njIia{k>?-k+qr-csIOQr?|X-W^iz z?NaV-Qtqu%?k!U8@8z7E<(!-3oEznw8|0i`a`ts{c27C`S~>d~Is0lk>nb_x3OVa? zIje`9)m`@f!9R9-05v7rd`0j@5C8!X009sHffy0UEKh7goO42XVVBfx1(!}$Cc3{T zz4o=T*x%uxdG#S5C8!X009sH0T5_2feiJ;Ca*ci zl^1qMJy-ClTXwDLE%E6u<=I=K5EwSG(8iO)l&D0AZ+T3au@G)J7%jFz00ck)1V8`; zl8!*8dt&o~Y~=z2_saLK6;q`S@eRYI*Jt^c?TwY)v_IJ1l!?dQQkJZZ)$q&jX;wBibJgE-cE#JFJOt!`xmk$!3o+eLRuO2uRaaFY@&a?TqHt%Z) zH;4H8&>Z55o8%V^0Oez;X8-LpWvXTBK4*3G>qNxdgX{g?Vju2GiP2I6UgLnypEQE9!( z#2G_uxkY}wpR!~<(j-DC;w1=x00@8p2!KG!5P&C+&ZXLVGO*%^y5g`pdABlPgMYw! zUF-Y<*6Ld0A3$2IssAcnEB%wVDa-2uq&g;k0pKvtR`bLymtE5h@il+w3500ck)1V8`;5<#HD{|85& 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..2178f0ec --- /dev/null +++ b/PowerEditor/installer/nppSetup.nsi @@ -0,0 +1,978 @@ +;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 APPNAMEANDVERSION "Notepad++ v4.1.2" + +; Main Install settings +Name "${APPNAMEANDVERSION}" +InstallDir "$PROGRAMFILES\Notepad++" +InstallDirRegKey HKLM "Software\${APPNAME}" "" +OutFile "..\bin\npp.4.1.2.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 + + +; Modern interface settings +!include "MUI.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 + +!define MUI_FINISHPAGE_RUN "$INSTDIR\notepad++.exe" + + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "..\license.txt" +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_INSTFILES +!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 "Thai" + ;!insertmacro MUI_LANGUAGE "Latvian" + ;!insertmacro MUI_LANGUAGE "Macedonian" + ;!insertmacro MUI_LANGUAGE "Estonian" + ;!insertmacro MUI_LANGUAGE "Serbian" + ; + +!insertmacro MUI_RESERVEFILE_LANGDLL + +;Installer Functions + + +Function .onInit + + !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" + +;-------------------------------- +;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\" + + ;Test if window9x + Call GetWindowsVersion + Pop $R0 + + StrCmp $R0 "95" 0 +2 + StrCpy $IS_LOCAL "1" + + StrCmp $R0 "98" 0 +2 + StrCpy $IS_LOCAL "1" + + StrCmp $R0 "ME" 0 +2 + StrCpy $IS_LOCAL "1" + + + ; if isLocal -> copy file "doLocalConf.xml" + StrCmp $IS_LOCAL "1" 0 IS_NOT_LOCAL + File "..\bin\doLocalConf.xml" + goto LANGS_XML + +IS_NOT_LOCAL: + IfFileExists $INSTDIR\doLocalConf.xml 0 +2 + Delete $INSTDIR\doLocalConf.xml + + StrCpy $UPDATE_PATH "$APPDATA\Notepad++" + CreateDirectory $UPDATE_PATH\plugins\config + +LANGS_XML: + IfFileExists $INSTDIR\langs.xml 0 COPY_LANGS_XML + SetOutPath "$TEMP\" + File "langsModel.xml" + File "..\bin\langs.xml" + ;UPGRATE $INSTDIR\langs.xml + nsExec::ExecToStack '"$TEMP\xmlUpdater.exe" "$TEMP\langsModel.xml" "$TEMP\langs.xml" "$INSTDIR\langs.xml"' + Pop $0 + ;MessageBox MB_OK "$0" + StrCmp $0 "0" 0 COPY_LANGS_XML + + goto CONFIG_XML +COPY_LANGS_XML: + ;SetOutPath "$INSTDIR\" + File /oname=$INSTDIR\langs.xml "..\bin\langs.xml" + +CONFIG_XML: + StrCmp $UPDATE_PATH "$APPDATA\Notepad++" 0 +2 + File /oname=$INSTDIR\config.xml "..\bin\config.xml" + + IfFileExists $UPDATE_PATH\config.xml 0 COPY_CONFIG_XML + SetOutPath "$TEMP\" + File "configModel.xml" + File "..\bin\config.xml" + nsExec::ExecToStack '"$TEMP\xmlUpdater.exe" "$TEMP\configModel.xml" "$TEMP\config.xml" "$UPDATE_PATH\config.xml"' + Pop $0 + ;MessageBox MB_OK "$0" + StrCmp $0 "0" 0 COPY_CONFIG_XML + + goto STYLES_XML +COPY_CONFIG_XML: + ;SetOutPath "$INSTDIR\" + File /oname=$INSTDIR\config.xml "..\bin\config.xml" + +STYLES_XML: + StrCmp $UPDATE_PATH "$APPDATA\Notepad++" 0 +2 + File /oname=$INSTDIR\stylers.xml "..\bin\stylers.xml" + + IfFileExists $UPDATE_PATH\stylers.xml 0 COPY_STYLERS_XML + SetOutPath "$TEMP\" + File "stylesLexerModel.xml" + File "stylesGlobalModel.xml" + File "..\bin\stylers.xml" + nsExec::ExecToStack '"$TEMP\xmlUpdater.exe" "$TEMP\stylesLexerModel.xml" "$TEMP\stylers.xml" "$UPDATE_PATH\stylers.xml"' + Pop $0 + ;MessageBox MB_OK "$0" + StrCmp $0 "0" 0 COPY_STYLERS_XML + nsExec::ExecToStack '"$TEMP\xmlUpdater.exe" "$TEMP\stylesGlobalModel.xml" "$TEMP\stylers.xml" "$UPDATE_PATH\stylers.xml"' + Pop $0 + ;MessageBox MB_OK "$0" + StrCmp $0 "0" 0 COPY_STYLERS_XML + goto ALL_XML +COPY_STYLERS_XML: + ;SetOutPath "$INSTDIR\" + File /oname=$INSTDIR\stylers.xml "..\bin\stylers.xml" + +ALL_XML: + SetOutPath "$INSTDIR\" + SetOverwrite off + 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" + + StrCmp $LANGUAGE ${LANG_ENGLISH} noLang 0 + StrCmp $LANGUAGE ${LANG_FRENCH} 0 +3 + File ".\nativeLang\french.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_TRADCHINESE} 0 +3 + File ".\nativeLang\chinese.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_SPANISH} 0 +3 + File ".\nativeLang\spanish.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_HUNGARIAN} 0 +3 + File ".\nativeLang\hungarian.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +3 + File ".\nativeLang\russian.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_GERMAN} 0 +3 + File ".\nativeLang\german.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_DUTCH} 0 +3 + File ".\nativeLang\dutch.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +3 + File ".\nativeLang\chineseSimplified.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_ITALIAN} 0 +3 + File ".\nativeLang\italian.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_DANISH} 0 +3 + File ".\nativeLang\danish.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_POLISH} 0 +3 + File ".\nativeLang\polish.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_CZECH} 0 +3 + File ".\nativeLang\czech.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_SLOVENIAN} 0 +3 + File ".\nativeLang\slovenian.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_SLOVAK} 0 +3 + File ".\nativeLang\slovak.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_SWEDISH} 0 +3 + File ".\nativeLang\swedish.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_NORWEGIAN} 0 +3 + File ".\nativeLang\norwegian.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_PORTUGUESEBR} 0 +3 + File ".\nativeLang\brazilian_portuguese.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_UKRAINIAN} 0 +3 + File ".\nativeLang\ukrainian.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_TURKISH} 0 +3 + File ".\nativeLang\turkish.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_CATALAN} 0 +3 + File ".\nativeLang\catalan.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_ARABIC} 0 +3 + File ".\nativeLang\arabic.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_LITHUANIAN} 0 +3 + File ".\nativeLang\lithuanian.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_FINNISH} 0 +3 + File ".\nativeLang\finnish.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_GREEK} 0 +3 + File ".\nativeLang\greek.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_ROMANIAN} 0 +3 + File ".\nativeLang\romanian.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_KOREAN} 0 +3 + File ".\nativeLang\korean.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_HEBREW} 0 +3 + File ".\nativeLang\hebrew.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_PORTUGUESE} 0 +3 + File ".\nativeLang\portuguese.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_FARSI} 0 +3 + File ".\nativeLang\farsi.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_BULGARIAN} 0 +3 + File ".\nativeLang\bulgarian.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_INDONESIAN} 0 +3 + File ".\nativeLang\indonesian.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_JAPANESE} 0 +3 + File ".\nativeLang\japanese.xml" + Goto finLang + StrCmp $LANGUAGE ${LANG_CROATIAN} 0 +3 + File ".\nativeLang\croatian.xml" + Goto finLang + finLang: + + IfFileExists "$UPDATE_PATH\nativeLang.xml" 0 +2 + Delete "$UPDATE_PATH\nativeLang.xml" + + IfFileExists "$INSTDIR\nativeLang.xml" 0 +2 + Delete "$INSTDIR\nativeLang.xml" + + Rename "$INSTDIR\$(langFileName)" "$INSTDIR\nativeLang.xml" + Goto commun + + noLang: + IfFileExists "$UPDATE_PATH\nativeLang.xml" 0 +2 + Delete "$UPDATE_PATH\nativeLang.xml" + + commun: + + ; 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" + + Delete "$INSTDIR\plugins\Explorer.dll" + Delete "$INSTDIR\plugins\HexEditor.dll" + Delete "$INSTDIR\plugins\HexEditorPlugin.dll" + Delete "$INSTDIR\plugins\NppSearchInFiles.dll" + + CreateDirectory "$SMPROGRAMS\Notepad++" + CreateShortCut "$SMPROGRAMS\Notepad++\Uninstall.lnk" "$INSTDIR\uninstall.exe" + + ; 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 off + SetOutPath "$INSTDIR\" + File "..\bin\nppcm.dll" + 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.api" + SectionEnd + + Section C++ + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\cpp.api" + SectionEnd + + Section Java + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\java.api" + SectionEnd + + Section C# + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\cs.api" + SectionEnd + + Section PHP + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\php.api" + SectionEnd + + Section CSS + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\css.api" + SectionEnd + + Section VB + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\vb.api" + SectionEnd + + Section Perl + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\perl.api" + SectionEnd + + Section JavaScript + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\javascript.api" + SectionEnd + + Section Python + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\python.api" + SectionEnd + + Section ActionScript + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\flash.api" + SectionEnd + + Section LISP + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\lisp.api" + SectionEnd + + Section VHDL + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\vhdl.api" + SectionEnd + + Section TeX + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\tex.api" + SectionEnd + + Section DocBook + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\xml.api" + SectionEnd + + Section NSIS + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\nsis.api" + SectionEnd + +SubSectionEnd + +SubSection "Plugins" Plugins + + SetOverwrite on + + Section "NPPTextFX" NPPTextFX + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\NPPTextFX.dll" + StrCmp $IS_LOCAL "1" 0 NOT_LOCAL + SetOutPath "$INSTDIR\plugins" + goto LOCAL + NOT_LOCAL: + SetOutPath "$APPDATA\Notepad++" + LOCAL: + File "..\bin\plugins\NPPTextFX.ini" + + SetOutPath "$INSTDIR\plugins\NPPTextFX" + File "..\bin\plugins\NPPTextFX\AsciiToEBCDIC.bin" + File "..\bin\plugins\NPPTextFX\libTidy.dll" + File "..\bin\plugins\NPPTextFX\NPPTextFXdemo.TXT" + File "..\bin\plugins\NPPTextFX\W3C-CSSValidator.htm" + File "..\bin\plugins\NPPTextFX\W3C-HTMLValidator.htm" + SectionEnd + + Section "Function List" FunctionList + Delete "$INSTDIR\plugins\FunctionListPlugin.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\FunctionList.dll" + SectionEnd + /* + Section "File Browser" FileBrowser + Delete "$INSTDIR\plugins\ExplorerPlugin.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\Explorer.dll" + SectionEnd + + Section "Hex Editor" HexEditor + Delete "$INSTDIR\plugins\HexEditorPlugin.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\HexEditor.dll" + SectionEnd + */ + Section "ConvertExt" ConvertExt + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\ConvertExt.dll" + + StrCmp $IS_LOCAL "1" 0 NOT_LOCAL2 + SetOutPath "$INSTDIR" + goto LOCAL2 + NOT_LOCAL2: + SetOutPath "$APPDATA\Notepad++" + LOCAL2: + File "..\bin\ConvertExt.ini" + File "..\bin\ConvertExt.enc" + File "..\bin\ConvertExt.lng" + 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_TechInfo.txt" + SectionEnd + + Section "QuickText" QuickText + Delete "$INSTDIR\plugins\QuickText.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\QuickText.dll" + SetOutPath "$INSTDIR\" + File "..\bin\QuickText.ini" + SetOutPath "$INSTDIR\plugins\doc" + File "..\bin\plugins\doc\quickText_README.txt" + SectionEnd +/* + Section "XMLTools" XMLTools + Delete "$INSTDIR\plugins\XMLTools.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\XMLTools.dll" + SetOutPath "$INSTDIR\plugins\doc" + File "..\bin\plugins\doc\XMLToolsReadMe.txt" + 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 + + +;-------------------------------- +;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_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" + WriteUninstaller "$INSTDIR\uninstall.exe" + +SectionEnd + + +;Uninstall section + +SubSection un.autoCompletionComponent + Section un.PHP + Delete "$INSTDIR\plugins\APIs\php.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.CSS + Delete "$INSTDIR\plugins\APIs\css.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.VB + Delete "$INSTDIR\plugins\APIs\vb.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.Perl + Delete "$INSTDIR\plugins\APIs\perl.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.C + Delete "$INSTDIR\plugins\APIs\c.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.C++ + Delete "$INSTDIR\plugins\APIs\cpp.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.Java + Delete "$INSTDIR\plugins\APIs\java.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.C# + Delete "$INSTDIR\plugins\APIs\cs.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.JavaScript + Delete "$INSTDIR\plugins\APIs\javascript.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.Python + Delete "$INSTDIR\plugins\APIs\python.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.ActionScript + Delete "$INSTDIR\plugins\APIs\flash.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.LISP + Delete "$INSTDIR\plugins\APIs\lisp.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.VHDL + Delete "$INSTDIR\plugins\APIs\vhdl.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.TeX + Delete "$INSTDIR\plugins\APIs\tex.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.DocBook + Delete "$INSTDIR\plugins\APIs\xml.api" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.NSIS + Delete "$INSTDIR\plugins\APIs\nsis.api" + 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\NPPTextFX\AsciiToEBCDIC.bin" + Delete "$INSTDIR\plugins\NPPTextFX\libTidy.dll" + Delete "$INSTDIR\plugins\NPPTextFX\NPPTextFXdemo.TXT" + Delete "$INSTDIR\plugins\NPPTextFX\W3C-CSSValidator.htm" + Delete "$INSTDIR\plugins\NPPTextFX\W3C-HTMLValidator.htm" + + RMDir "$INSTDIR\plugins\NPPTextFX\" + RMDir "$INSTDIR\plugins\" + SectionEnd + + Section un.FunctionList + Delete "$INSTDIR\plugins\FunctionList.dll" + RMDir "$INSTDIR\plugins\" + SectionEnd + /* + Section un.FileBrowser + Delete "$INSTDIR\plugins\Explorer.dll" + Delete "$INSTDIR\plugins\Config\Explorer.ini" + RMDir "$INSTDIR\plugins\Config" + 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" + RMDir "$INSTDIR\plugins\" + 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.XMLTools + Delete "$INSTDIR\plugins\XMLTools.dll" + Delete "$INSTDIR\plugins\doc\XMLToolsReadMe.txt" + RMDir "$INSTDIR\plugins\" + SectionEnd +*/ +SubSectionEnd + +Section un.htmlViewer + DeleteRegKey HKLM "SOFTWARE\Microsoft\Internet Explorer\View Source Editor" + Delete "$INSTDIR\nppIExplorerShell.exe" +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\langs.xml" + Delete "$INSTDIR\stylers.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 \ No newline at end of file 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..4d560c79 --- /dev/null +++ b/PowerEditor/src/CMakeLists.txt @@ -0,0 +1,176 @@ +# @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(objs ./winmain.cpp + ./Notepad_plus.cpp + ./Notepad_plus.h + ./Parameters.cpp + ./Parameters.h + ./UniConversion.cpp + ./UniConversion.h + ./Utf8_16.cpp + ./Utf8_16.h + ./ScitillaComponent/Buffer.cpp + ./ScitillaComponent/Buffer.h + ./ScitillaComponent/ScintillaEditView.cpp + ./ScitillaComponent/ScintillaEditView.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 + ./TinyXml/tinystr.cpp + ./TinyXml/tinystr.h + ./TinyXml/tinyxml.cpp + ./TinyXml/tinyxml.h + ./TinyXml/tinyxmlerror.cpp + ./TinyXml/tinyxmlparser.cpp +) + +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/IExplorerShell/makefile b/PowerEditor/src/IExplorerShell/makefile new file mode 100644 index 00000000..109e4a77 --- /dev/null +++ b/PowerEditor/src/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/IExplorerShell/nppIExplorerShell.cpp b/PowerEditor/src/IExplorerShell/nppIExplorerShell.cpp new file mode 100644 index 00000000..8823f453 --- /dev/null +++ b/PowerEditor/src/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/MISC/FileNameStringSplitter.h b/PowerEditor/src/MISC/FileNameStringSplitter.h new file mode 100644 index 00000000..9c82b6d1 --- /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 char *fileNameStr) { + //if (!fileNameStr) return; + char *pStr = NULL; + bool isInsideQuotes = false; + char str[256]; + int i = 0; + bool fini = false; + for (pStr = (char *)fileNameStr ; !fini ; ) + { + switch (*pStr) + { + case '"' : + if (isInsideQuotes) + { + str[i] = '\0'; + if (str[0]) + _fileNames.push_back(std::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::string(str)); + i = 0; + } + pStr++; + break; + + case '\0' : + str[i] = *pStr; + if (str[0]) + _fileNames.push_back(std::string(str)); + fini = true; + break; + + default : + str[i] = *pStr; + i++; pStr++; + break; + } + } + }; + + const char * 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..8fab3772 --- /dev/null +++ b/PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h @@ -0,0 +1,195 @@ +//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 + +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,\ + // The end of enumated language type, so it should be always at the end + L_END}; +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 { + char* sessionFilePathName; + int nbFile; + char** 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 index2Activate, int view) + + #define NPPM_LAUNCHFINDINFILESDLG (NPPMSG + 29) + //void NPPM_LAUNCHFINDINFILESDLG(char * dir2Search, char * 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 char* file name) + + #define NPPM_DMMVIEWOTHERTAB (NPPMSG + 35) + //void WM_DMM_VIEWOTHERTAB(0, tTbData->hClient) + + #define NPPM_RELOADFILE (NPPMSG + 36) + //BOOL NPPM_RELOADFILE(BOOL withAlert, char *filePathName2Reload) + + #define NPPM_SWITCHTOFILE (NPPMSG + 37) + //BOOL NPPM_SWITCHTOFILE(0, char *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 char *windowName, const char *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, char *str) + +#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) + + #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 + + +// 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 = 0; + + + + + +#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..f69b1414 --- /dev/null +++ b/PowerEditor/src/MISC/PluginsManager/PluginInterface.h @@ -0,0 +1,64 @@ +//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 char * (__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; + unsigned char _key; +}; + +struct FuncItem { + char _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 char * 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); + +#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..423d7745 --- /dev/null +++ b/PowerEditor/src/MISC/PluginsManager/PluginsManager.cpp @@ -0,0 +1,163 @@ +//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" + +#define USERMSG "This plugin is not compatible with current version of Notepad++.\n\ +Remove this plugin from plugins directory if you don't want to see this message on the next launch time." + +bool PluginsManager::loadPlugins(const char *dir) +{ + vector dllNames; + const char *pNppPath = (NppParameters::getInstance())->getNppPath(); + + string pluginsFullPathFilter = (dir && dir[0])?dir:pNppPath; + + pluginsFullPathFilter += "\\plugins\\*.dll"; + + WIN32_FIND_DATA foundData; + HANDLE hFindFile = ::FindFirstFile(pluginsFullPathFilter.c_str(), &foundData); + if (hFindFile != INVALID_HANDLE_VALUE) + { + string plugins1stFullPath = (dir && dir[0])?dir:pNppPath; + plugins1stFullPath += "\\plugins\\"; + plugins1stFullPath += foundData.cFileName; + dllNames.push_back(plugins1stFullPath); + + while (::FindNextFile(hFindFile, &foundData)) + { + string fullPath = (dir && dir[0])?dir:pNppPath; + fullPath += "\\plugins\\"; + fullPath += foundData.cFileName; + dllNames.push_back(fullPath); + } + ::FindClose(hFindFile); + + size_t i = 0; + + for ( ; i < dllNames.size() ; i++) + { + PluginInfo *pi = new PluginInfo; + try { + char tmpStr[MAX_PATH]; + strcpy(tmpStr, dllNames[i].c_str()); + strcpy(pi->_moduleName, PathFindFileName(tmpStr)); + + pi->_hLib = ::LoadLibrary(dllNames[i].c_str()); + if (!pi->_hLib) + throw string("Load Library is failed"); + + pi->_pFuncSetInfo = (PFUNCSETINFO)GetProcAddress(pi->_hLib, "setInfo"); + + if (!pi->_pFuncSetInfo) + throw string("Missing \"setInfo\" function"); + + pi->_pFuncGetName = (PFUNCGETNAME)GetProcAddress(pi->_hLib, "getName"); + if (!pi->_pFuncGetName) + throw string("Missing \"getName\" function"); + + pi->_pBeNotified = (PBENOTIFIED)GetProcAddress(pi->_hLib, "beNotified"); + if (!pi->_pBeNotified) + throw string("Missing \"beNotified\" function"); + + pi->_pMessageProc = (PMESSAGEPROC)GetProcAddress(pi->_hLib, "messageProc"); + if (!pi->_pMessageProc) + throw string("Missing \"messageProc\" function"); + + pi->_pFuncGetFuncsArray = (PFUNCGETFUNCSARRAY)GetProcAddress(pi->_hLib, "getFuncsArray"); + if (!pi->_pFuncGetFuncsArray) + throw string("Missing \"getFuncsArray\" function"); + + pi->_funcItems = pi->_pFuncGetFuncsArray(&pi->_nbFuncItem); + + if ((!pi->_funcItems) || (pi->_nbFuncItem <= 0)) + throw string("Missing \"FuncItems\" array, or the nb of Function Item is not set correctly"); + + getCustomizedShortcuts(pi->_moduleName, pi->_funcItems, pi->_nbFuncItem); + + for (int i = 0 ; i < pi->_nbFuncItem ; i++) + if (!pi->_funcItems[i]._pFunc) + throw string("\"FuncItems\" array is not set correctly"); + + pi->_pluginMenu = ::CreateMenu(); + + pi->_pFuncSetInfo(_nppData); + + _pluginInfos.push_back(pi); + + } + catch(string s) + { + s += "\n\n"; + s += USERMSG; + ::MessageBox(NULL, s.c_str(), dllNames[i].c_str(), MB_OK); + delete pi; + } + catch(...) + { + string msg = "Fail loaded"; + msg += "\n\n"; + msg += USERMSG; + ::MessageBox(NULL, msg.c_str(), dllNames[i].c_str(), MB_OK); + delete pi; + } + } + } + + return true; +} + +void PluginsManager::setMenu(HMENU hMenu, const char *menuName) +{ + if (hasPlugins()) + { + vector & pluginCmdSCList = (NppParameters::getInstance())->getPluginCommandList(); + const char *nom_menu = (menuName && menuName[0])?menuName:"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++) + { + _pluginsCommands.push_back(PluginCommand(_pluginInfos[i]->_moduleName, j, _pluginInfos[i]->_funcItems[j]._pFunc)); + int cmdID = ID_PLUGINS_CMD + (_pluginsCommands.size() - 1); + //printInt(cmdID); + _pluginInfos[i]->_funcItems[j]._cmdID = cmdID; + string itemName = _pluginInfos[i]->_funcItems[j]._itemName; + + if (_pluginInfos[i]->_funcItems[j]._pShKey) + { + ShortcutKey & sKey = *(_pluginInfos[i]->_funcItems[j]._pShKey); + //CommandShortcut cmdShortcut(itemName.c_str(), cmdID, sKey._isCtrl, sKey._isAlt, sKey._isShift, sKey._key); + //printInt(cmdID); + PluginCmdShortcut pcs(Shortcut(itemName.c_str(), sKey._isCtrl, sKey._isAlt, sKey._isShift, sKey._key), cmdID, _pluginInfos[i]->_moduleName, j); + pluginCmdSCList.push_back(pcs); + itemName += "\t"; + itemName += pcs.toString(); + } + ::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.cpp.bak b/PowerEditor/src/MISC/PluginsManager/PluginsManager.cpp.bak new file mode 100644 index 00000000..c0afc65f --- /dev/null +++ b/PowerEditor/src/MISC/PluginsManager/PluginsManager.cpp.bak @@ -0,0 +1,164 @@ +//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" + +#define USERMSG "This plugin is not compatible with current version of Notepad++.\n\ +Remove this plugin from plugins directory if you don't want to see this message on the next launch time." + +bool PluginsManager::loadPlugins() +{ + vector dllNames; + const char *pNppPath = (NppParameters::getInstance())->getNppPath(); + + string pluginsFullPathFilter = pNppPath; + pluginsFullPathFilter += "\\plugins\\*.dll"; + + WIN32_FIND_DATA foundData; + HANDLE hFindFile = ::FindFirstFile(pluginsFullPathFilter.c_str(), &foundData); + if (hFindFile != INVALID_HANDLE_VALUE) + { + string plugins1stFullPath = pNppPath; + plugins1stFullPath += "\\plugins\\"; + plugins1stFullPath += foundData.cFileName; + dllNames.push_back(plugins1stFullPath); + + while (::FindNextFile(hFindFile, &foundData)) + { + string fullPath = pNppPath; + fullPath += "\\plugins\\"; + fullPath += foundData.cFileName; + dllNames.push_back(fullPath); + } + ::FindClose(hFindFile); + + size_t i = 0; + + for ( ; i < dllNames.size() ; i++) + { + PluginInfo *pi = new PluginInfo; + try { + char tmpStr[MAX_PATH]; + strcpy(tmpStr, dllNames[i].c_str()); + strcpy(pi->_moduleName, PathFindFileName(tmpStr)); + + pi->_hLib = ::LoadLibrary(dllNames[i].c_str()); + if (!pi->_hLib) + throw string("Load Library is failed"); + + pi->_pFuncSetInfo = (PFUNCSETINFO)GetProcAddress(pi->_hLib, "setInfo"); + + if (!pi->_pFuncSetInfo) + throw string("Missing \"setInfo\" function"); + + pi->_pFuncGetName = (PFUNCGETNAME)GetProcAddress(pi->_hLib, "getName"); + if (!pi->_pFuncGetName) + throw string("Missing \"getName\" function"); + + pi->_pBeNotified = (PBENOTIFIED)GetProcAddress(pi->_hLib, "beNotified"); + if (!pi->_pBeNotified) + throw string("Missing \"beNotified\" function"); + + pi->_pMessageProc = (PMESSAGEPROC)GetProcAddress(pi->_hLib, "messageProc"); + if (!pi->_pMessageProc) + throw string("Missing \"messageProc\" function"); + + pi->_pFuncGetFuncsArray = (PFUNCGETFUNCSARRAY)GetProcAddress(pi->_hLib, "getFuncsArray"); + if (!pi->_pFuncGetFuncsArray) + throw string("Missing \"getFuncsArray\" function"); + + pi->_funcItems = pi->_pFuncGetFuncsArray(&pi->_nbFuncItem); + + if ((!pi->_funcItems) || (pi->_nbFuncItem <= 0)) + throw string("Missing \"FuncItems\" array, or the nb of Function Item is not set correctly"); + + getCustomizedShortcuts(pi->_moduleName, pi->_funcItems, pi->_nbFuncItem); + + for (int i = 0 ; i < pi->_nbFuncItem ; i++) + if (!pi->_funcItems[i]._pFunc) + throw string("\"FuncItems\" array is not set correctly"); + + pi->_pluginMenu = ::CreateMenu(); + + pi->_pFuncSetInfo(_nppData); + + _pluginInfos.push_back(pi); + + } + catch(string s) + { + s += "\n\n"; + s += USERMSG; + ::MessageBox(NULL, s.c_str(), dllNames[i].c_str(), MB_OK); + delete pi; + } + catch(...) + { + string msg = "Fail loaded"; + msg += "\n\n"; + msg += USERMSG; + ::MessageBox(NULL, msg.c_str(), dllNames[i].c_str(), MB_OK); + delete pi; + } + } + } + + //pi._pFuncSetInfo(_nppData); + //const char * pluginName = _pFuncGetName(); + return true; +} +#include "SysMsg.h" +void PluginsManager::setMenu(HMENU hMenu, const char *menuName) +{ + if (hasPlugins()) + { + vector & pluginCmdSCList = (NppParameters::getInstance())->getPluginCommandList(); + const char *nom_menu = (menuName && menuName[0])?menuName:"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++) + { + _pluginsCommands.push_back(PluginCommand(_pluginInfos[i]->_moduleName, j, _pluginInfos[i]->_funcItems[j]._pFunc)); + int cmdID = ID_PLUGINS_CMD + (_pluginsCommands.size() - 1); + //printInt(cmdID); + _pluginInfos[i]->_funcItems[j]._cmdID = cmdID; + string itemName = _pluginInfos[i]->_funcItems[j]._itemName; + + if (_pluginInfos[i]->_funcItems[j]._pShKey) + { + ShortcutKey & sKey = *(_pluginInfos[i]->_funcItems[j]._pShKey); + //CommandShortcut cmdShortcut(itemName.c_str(), cmdID, sKey._isCtrl, sKey._isAlt, sKey._isShift, sKey._key); + //printInt(cmdID); + PluginCmdShortcut pcs(Shortcut(itemName.c_str(), sKey._isCtrl, sKey._isAlt, sKey._isShift, sKey._key), cmdID, _pluginInfos[i]->_moduleName, j); + pluginCmdSCList.push_back(pcs); + itemName += "\t"; + itemName += pcs.toString(); + } + ::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..d0d96405 --- /dev/null +++ b/PowerEditor/src/MISC/PluginsManager/PluginsManager.h @@ -0,0 +1,141 @@ +//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" + +struct PluginCommand { + char _pluginName[64]; + int _funcID; + PFUNCPLUGINCMD _pFunc; + PluginCommand(const char *pluginName, int funcID, PFUNCPLUGINCMD pFunc): _funcID(funcID), _pFunc(pFunc){ + strcpy(_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; + + FuncItem *_funcItems; + int _nbFuncItem; + char _moduleName[64]; +}; + +class PluginsManager { +public: + PluginsManager() : _hPluginsMenu(NULL) {}; + ~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 char *dir = NULL); + + void runPluginCommand(size_t i) { + if (i < _pluginsCommands.size()) + _pluginsCommands[i]._pFunc(); + }; + + void runPluginCommand(const char *pluginName, int commandID) { + for (size_t i = 0 ; i < _pluginsCommands.size() ; i++) + { + if (!stricmp(_pluginsCommands[i]._pluginName, pluginName)) + { + if (_pluginsCommands[i]._funcID == commandID) + _pluginsCommands[i]._pFunc(); + } + } + }; + + void setMenu(HMENU hMenu, const char *menuName); + + void notify(SCNotification *notification) { + for (size_t i = 0 ; i < _pluginInfos.size() ; i++) + { + _pluginInfos[i]->_pBeNotified(notification); + } + }; + + void relayNppMessages(UINT Message, WPARAM wParam, LPARAM lParam) { + for (size_t i = 0 ; i < _pluginInfos.size() ; i++) + { + _pluginInfos[i]->_pMessageProc(Message, wParam, lParam); + } + }; + + HMENU getMenuHandle() { + return _hPluginsMenu; + }; + + void getCustomizedShortcuts(char *pluginName, FuncItem *funcItems, int nbFuncItem) { + vector & pluginCustomizedCmds = (NppParameters::getInstance())->getPluginCustomizedCmds(); + + for (size_t i = 0 ; i < pluginCustomizedCmds.size() ; i++) + { + if (strcmp(pluginName, pluginCustomizedCmds[i].getModuleName()) == 0) + { + int id = pluginCustomizedCmds[i].getInternalID(); + if ((id < nbFuncItem) && (funcItems[id]._pShKey != NULL)) + { + funcItems[id]._pShKey->_isAlt = pluginCustomizedCmds[i]._isAlt; + funcItems[id]._pShKey->_isCtrl = pluginCustomizedCmds[i]._isCtrl; + funcItems[id]._pShKey->_isShift = pluginCustomizedCmds[i]._isShift; + funcItems[id]._pShKey->_key = pluginCustomizedCmds[i]._key; + } + } + } + }; + +private: + NppData _nppData; + + HMENU _hPluginsMenu; + + vector _pluginInfos; + vector _pluginsCommands; + bool hasPlugins(){return (_pluginInfos.size()!= 0);}; +}; + +#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..3ff3f529 --- /dev/null +++ b/PowerEditor/src/MISC/Process/Process.cpp @@ -0,0 +1,292 @@ +//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 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("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 = (_type == WIN32_PROG)?SW_SHOW:SW_HIDE; // hidden console window + startup.hStdInput = NULL; // not used + startup.hStdOutput = hPipeOutW; + startup.hStdError = hPipeErrW; + + BOOL started = ::CreateProcess((_type == WIN32_PROG)?_command:NULL, // command is part of input string + (_type == WIN32_PROG)?NULL:_command, // (writeable) command 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("CreateProcess", result, 1002); + + if (_type == CONSOLE_PROG) + { + 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); + + + // The process is running so we set this to FALSE + _bProcessEnd = FALSE; + + hWaitForProcessEndThread = ::CreateThread(NULL, 0, staticWaitForProcessEnd, this, 0, NULL); + if (!hWaitForProcessEndThread) + error("CreateThread", result, 1005); + + hListenerStdOutThread = ::CreateThread(NULL, 0, staticListenerStdOut, this, 0, NULL); + if (!hListenerStdOutThread) + error("CreateThread", result, 1006); + + hListenerStdErrThread = ::CreateThread(NULL, 0, staticListenerStdErr, this, 0, NULL); + if (!hListenerStdErrThread) + error("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){ + char str[10]; + ::MessageBox(NULL, itoa(coderr, str, 10), "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, "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 + } + } + + if(!::SetEvent(hListenerEvent)) + { + systemMessage("Thread stdout listener"); + } +} + +void Process::waitForProcessEnd() +{ + HANDLE hListenerEvent[2]; + hListenerEvent[0] = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "listenerEvent"); + hListenerEvent[1] = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "listenerStdErrEvent"); + + ::WaitForSingleObject(_hProcess, INFINITE); + ::WaitForMultipleObjects(2, hListenerEvent, TRUE, INFINITE); + + _bProcessEnd = TRUE; +} + +void Process::error(const char *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..82805235 --- /dev/null +++ b/PowerEditor/src/MISC/Process/Process.h @@ -0,0 +1,107 @@ +//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; + +enum progType {WIN32_PROG, CONSOLE_PROG}; + +class Process +{ +public: + Process(progType pt = WIN32_PROG) : _type(pt) {}; + Process(const char *cmd, const char *cDir, progType pt = WIN32_PROG) + : _type(pt), _stdoutStr(""), _stderrStr(""), _hPipeOutR(NULL), + _hPipeErrR(NULL), _hProcess(NULL), _hProcessThread(NULL) { + + strcpy(_command, cmd); + strcpy(_curDir, cDir); + //_pid = id; + + _bProcessEnd = TRUE; + }; + + 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("") != 0); + }; + + bool hasStderr() { + return (_stderrStr.compare("") != 0); + }; + +protected: + progType _type; + + // 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; + + 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 char *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..a3ef8940 --- /dev/null +++ b/PowerEditor/src/MISC/RegExt/regExtDlg.cpp @@ -0,0 +1,358 @@ +/* +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" + +const char *nppName = "Notepad++_file"; +const char *nppBackup = "Notepad++_backup"; +const char *nppDoc = "Notepad++ Document"; + +const int nbSupportedLang = 9; +const int nbExtMax = 10; +const int extNameMax = 18; + +char defExtArray[nbSupportedLang][nbExtMax][extNameMax] = { + {"Notepad", ".txt", ".log", ".ini"}, + {"c, c++, objc", ".h", ".hpp", ".hxx", ".c", ".cpp", ".cxx", ".cc", ".m"}, + {"java, c#, pascal", ".java", ".cs", ".pas", ".inc"}, + {"web(html) script", ".html", ".htm", ".php", ".phtml", ".js", ".jsp", ".asp", ".css", ".xml"}, + {"public script", ".sh", ".bsh", ".nsi", ".nsh", ".lua", ".pl", ".pm", ".py"}, + {"property script", ".rc", ".as", ".mx", ".vb", ".vbs", ".bat", ".cmd", ".nt"}, + {"fortran, TeX, SQL", ".f", ".for", ".f90", ".f95", ".f2k", ".tex", ".sql"}, + {"misc", ".nfo", ".mak"}, + {"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(); + writeNppPath(); + //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 : + { + //int index2Add; + char ext2Add[extNameMax] = ""; + 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)""); + } + ::SendDlgItemMessage(_hSelf, IDC_REGEXT_REGISTEREDEXTS_LIST, LB_ADDSTRING, 0, (LPARAM)ext2Add); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_ADDFROMLANGEXT_BUTTON), false); + return TRUE; + } + + case IDC_REMOVEEXT_BUTTON : + { + char ext2Sup[extNameMax] = ""; + 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 (!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) + { + char text[extNameMax] = ""; + ::SendDlgItemMessage(_hSelf, IDC_CUSTOMEXT_EDIT, WM_GETTEXT, extNameMax, (LPARAM)text); + if ((strlen(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), (strlen(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) + { + char itemName[32]; + ::SendDlgItemMessage(_hSelf, LOWORD(wParam), LB_GETTEXT, i, (LPARAM)itemName); + + if (!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 (strcmp("", 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++) + { + char 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] == '.')) + { + //char valName[extNameLen]; + char valData[extNameLen]; + int valDataLen = extNameLen; + int valType; + HKEY hKey2Check; + extNameActualLen = extNameLen; + ::RegOpenKeyEx(HKEY_CLASSES_ROOT, extName, 0, KEY_ALL_ACCESS, &hKey2Check); + ::RegQueryValueEx(hKey2Check, "", NULL, (LPDWORD)&valType, (LPBYTE)valData, (LPDWORD)&valDataLen); + //::RegEnumValue(hKey2Check, 0, valName, (LPDWORD)&extNameActualLen, NULL, (LPDWORD)&valType, (LPBYTE)valData, (LPDWORD)&valDataLen); + if ((valType == REG_SZ) && (!strcmp(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(char *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) + { + int valDataLen = 256; + char valData[256]; + + + if (dwDisp == REG_OPENED_EXISTING_KEY) + { + int res = ::RegQueryValueEx(hKey, "", NULL, NULL, (LPBYTE)valData, (LPDWORD)&valDataLen); + if (res == ERROR_SUCCESS) + ::RegSetValueEx(hKey, nppBackup, 0, REG_SZ, (LPBYTE)valData, valDataLen+1); + } + ::RegSetValueEx(hKey, NULL, 0, REG_SZ, (LPBYTE)nppName, strlen(nppName)+1); + + ::RegCloseKey(hKey); + } +} + +bool RegExtDlg::deleteExts(const char *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)) + { + char subKey[32] = "\\"; + strcat(subKey, ext2Delete); + ::RegDeleteKey(HKEY_CLASSES_ROOT, subKey); + } + else + { + char valData[extNameLen]; + int valDataLen = extNameLen; + 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; + char regStr[MAX_PATH] = ""; + strcat(strcat(regStr, nppName), "\\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, strlen(nppDoc)+1); + + char nppPath[MAX_PATH]; + ::GetModuleFileName(_hInst, nppPath, MAX_PATH); + + char nppPathParam[256] = "\""; + strcat(strcat(nppPathParam, nppPath), "\" \"%1\""); + + ::RegSetValueEx(hKey, NULL, 0, REG_SZ, (LPBYTE)nppPathParam, strlen(nppPathParam)+1); + } + RegCloseKey(hKey); + } +} diff --git a/PowerEditor/src/MISC/RegExt/regExtDlg.h b/PowerEditor/src/MISC/RegExt/regExtDlg.h new file mode 100644 index 00000000..b2acbf32 --- /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(char *ext); + bool deleteExts(const char *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..407493f6 --- /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, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LISTBOX IDC_REGEXT_LANGEXT_LIST,103,17,29,122,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP + LISTBOX IDC_REGEXT_REGISTEREDEXTS_LIST,173,16,48,123,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "->",IDC_ADDFROMLANGEXT_BUTTON,140,73,26,14 + EDITTEXT IDC_CUSTOMEXT_EDIT,103,73,30,14,ES_AUTOHSCROLL | NOT WS_VISIBLE + PUSHBUTTON "->",IDC_REMOVEEXT_BUTTON,228,72,26,14 + CONTROL "",IDC_POUPELLE_STATIC,"Static",SS_OWNERDRAW,263,68,20,20 + LTEXT "Supported exts :",IDC_SUPPORTEDEXTS_STATIC,35,4,77,8 + LTEXT "Registered exts :",IDC_REGISTEREDEXTS_STATIC,174,4,72,8 + LISTBOX IDC_REGEXT_LANG_LIST,35,17,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/SysMsg/SysMsg.cpp b/PowerEditor/src/MISC/SysMsg/SysMsg.cpp new file mode 100644 index 00000000..a76d80e6 --- /dev/null +++ b/PowerEditor/src/MISC/SysMsg/SysMsg.cpp @@ -0,0 +1,179 @@ +//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 "SysMsg.h" +#include +#include +#include + +/* +DWORD ShortToLongPathName(LPCTSTR lpszShortPath, LPTSTR lpszLongPath, DWORD cchBuffer) +{ + // Catch null pointers. + if (!lpszShortPath || !lpszLongPath) + { + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + + // Check whether the input path is valid. + if (0xffffffff == GetFileAttributes(lpszShortPath)) + return 0; + + // Special characters. + char const sep = '\\'; + char const colon = ':'; + + // Make some short aliases for basic_strings of TCHAR. + typedef std::basic_string tstring; + typedef tstring::traits_type traits; + typedef tstring::size_type size; + size const npos = tstring::npos; + + // Copy the short path into the work buffer and convert forward + // slashes to backslashes. + tstring path = lpszShortPath; + std::replace(path.begin(), path.end(), '/', sep); + + // We need a couple of markers for stepping through the path. + size left = 0; + size right = 0; + + // Parse the first bit of the path. + if (path.length() >= 2 && isalpha(path[0]) && colon == path[1]) // Drive letter? + { + if (2 == path.length()) // 'bare' drive letter + { + right = npos; // skip main block + } + else if (sep == path[2]) // drive letter + backslash + { + // FindFirstFile doesn't like "X:\" + if (3 == path.length()) + { + right = npos; // skip main block + } + else + { + left = right = 3; + } + } + else return 0; // parsing failure + } + else if (path.length() >= 1 && sep == path[0]) + { + if (1 == path.length()) // 'bare' backslash + { + right = npos; // skip main block + } + else + { + if (sep == path[1]) // is it UNC? + { + // Find end of machine name + right = path.find_first_of(sep, 2); + if (npos == right) + return 0; + + // Find end of share name + right = path.find_first_of(sep, right + 1); + if (npos == right) + return 0; + } + ++right; + } + } + // else FindFirstFile will handle relative paths + + // The data block for FindFirstFile. + WIN32_FIND_DATA fd; + + // Main parse block - step through path. + while (npos != right) + { + left = right; // catch up + + // Find next separator. + right = path.find_first_of(sep, right); + + // Temporarily replace the separator with a null character so that + // the path so far can be passed to FindFirstFile. + if (npos != right) + path[right] = 0; + + // See what FindFirstFile makes of the path so far. + HANDLE hf = FindFirstFile(path.c_str(), &fd); + if (INVALID_HANDLE_VALUE == hf) + return 0; + FindClose(hf); + + // Put back the separator. + if (npos != right) + path[right] = sep; + + // The file was found - replace the short name with the long. + size old_len = (npos == right) ? path.length() - left : right - left; + size new_len = traits::length(fd.cFileName); + path.replace(left, old_len, fd.cFileName, new_len); + + // More to do? + if (npos != right) + { + // Yes - move past separator . + right = left + new_len + 1; + + // Did we overshoot the end? (i.e. path ends with a separator). + if (right >= path.length()) + right = npos; + } + } + + // If buffer is too small then return the required size. + if (cchBuffer <= path.length()) + return path.length() + 1; + + // Copy the buffer and return the number of characters copied. + traits::copy(lpszLongPath, path.c_str(), path.length() + 1); + return path.length(); +} +*/ + +void systemMessage(const char *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) +{ + char str[32]; + itoa(int2print, str, 10); + ::MessageBox(NULL, str, "", MB_OK); +} + +void printStr(const char *str2print) +{ + ::MessageBox(NULL, str2print, "", MB_OK); +} diff --git a/PowerEditor/src/MISC/SysMsg/SysMsg.h b/PowerEditor/src/MISC/SysMsg/SysMsg.h new file mode 100644 index 00000000..89da5264 --- /dev/null +++ b/PowerEditor/src/MISC/SysMsg/SysMsg.h @@ -0,0 +1,27 @@ +//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 + +void systemMessage(const char *title); +//DWORD ShortToLongPathName(LPCTSTR lpszShortPath, LPTSTR lpszLongPath, DWORD cchBuffer); +void printInt(int int2print); +void printStr(const char *str2print); +#endif //M30_IDE_COMMUN_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.aps b/PowerEditor/src/Notepad_plus.aps new file mode 100644 index 0000000000000000000000000000000000000000..131234e002694897dd3bb2c97858969f9171ba20 GIT binary patch literal 360976 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 +#include "Notepad_plus.h" +#include "SysMsg.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 + +const char Notepad_plus::_className[32] = NOTEPAD_PP_CLASS_NAME; +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}; + +struct SortTaskListPred +{ + ScintillaEditView *_views[2]; + + SortTaskListPred(ScintillaEditView &p, ScintillaEditView &s) + { + _views[MAIN_VIEW] = &p; + _views[SUB_VIEW] = &s; + } + + bool operator()(const TaskLstFnStatus &l, const TaskLstFnStatus &r) const { + return _views[l._iView]->getBufferAt(l._docIndex).getRecentTag() > _views[r._iView]->getBufferAt(r._docIndex).getRecentTag(); + } +}; + +Notepad_plus::Notepad_plus(): Window(), _mainWindowStatus(0), _pDocTab(NULL), _pEditView(NULL), + _pMainSplitter(NULL), _isfullScreen(false), + _recordingMacro(false), _pTrayIco(NULL), _isUDDocked(false),\ + _isCmdScModified(false), _isMacrosScModified(false), _isUserCmdScModified(false),\ + _isScintillaKeyModified(false), _isPluginCmdScModified(false), _isRTL(false), \ + _linkTriggered(true), _isDocModifing(false), _isHotspotDblClicked(false) +{ + TiXmlDocument *nativeLangDocRoot = (NppParameters::getInstance())->getNativeLang(); + if (nativeLangDocRoot) + { + _nativeLang = nativeLangDocRoot->FirstChild("NotepadPlus"); + if (_nativeLang) + { + _nativeLang = _nativeLang->FirstChild("Native-Langue"); + if (_nativeLang) + { + TiXmlElement *element = _nativeLang->ToElement(); + const char *rtl = element->Attribute("RTL"); + if (rtl) + _isRTL = (strcmp(rtl, "yes") == 0); + } + } + } + else + _nativeLang = NULL; + + TiXmlDocument *toolIconsDocRoot = (NppParameters::getInstance())->getToolIcons(); + if (toolIconsDocRoot) + { + _toolIcons = toolIconsDocRoot->FirstChild("NotepadPlus"); + if (_toolIcons) + { + if ((_toolIcons = _toolIcons->FirstChild("ToolBarIcons"))) + { + if ((_toolIcons = _toolIcons->FirstChild("Theme"))) + { + const char *themeDir = (_toolIcons->ToElement())->Attribute("pathPrefix"); + + for (TiXmlNode *childNode = _toolIcons->FirstChildElement("Icon"); + childNode ; + childNode = childNode->NextSibling("Icon") ) + { + int iIcon; + const char *res = (childNode->ToElement())->Attribute("id", &iIcon); + if (res) + { + TiXmlNode *grandChildNode = childNode->FirstChildElement("normal"); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + string locator = themeDir?themeDir:""; + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(0, iIcon, locator)); + } + } + + grandChildNode = childNode->FirstChildElement("hover"); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + string locator = themeDir?themeDir:""; + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(1, iIcon, locator)); + } + } + + grandChildNode = childNode->FirstChildElement("disabled"); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + string locator = themeDir?themeDir:""; + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(2, iIcon, locator)); + } + } + } + } + } + } + } + } + else + _toolIcons = NULL; +} + + +void Notepad_plus::init(HINSTANCE hInst, HWND parent, const char *cmdLine) +{ + Window::init(hInst, parent); + + _winVersion = getWindowsVersion(); + + WNDCLASS nppClass; + + nppClass.style = CS_BYTEALIGNWINDOW | CS_DBLCLKS;//CS_HREDRAW | CS_VREDRAW; + nppClass.lpfnWndProc = Notepad_plus_Proc; + nppClass.cbClsExtra = 0; + nppClass.cbWndExtra = 0; + nppClass.hInstance = _hInst; + nppClass.hIcon = ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)); + nppClass.hCursor = NULL; + nppClass.hbrBackground = ::CreateSolidBrush(::GetSysColor(COLOR_MENU)); + nppClass.lpszMenuName = MAKEINTRESOURCE(IDR_M30_MENU); + nppClass.lpszClassName = _className; + + if (!::RegisterClass(&nppClass)) + { + systemMessage("System Err"); + throw int(98); + } + + RECT workAreaRect; + ::SystemParametersInfo(SPI_GETWORKAREA,0,&workAreaRect,0); + + const NppGUI & nppGUI = (NppParameters::getInstance())->getNppGUI(); + + _hSelf = ::CreateWindowEx( + WS_EX_ACCEPTFILES | (_isRTL?WS_EX_LAYOUTRTL:0),\ + _className,\ + "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("System Err"); + throw int(777); + } + + // the routine ShowWindow should be called here immediately + // Otherwise (if we call it after opening the files) the Scintilla + // View contained the opened document will shift down one line. + ::MoveWindow(_hSelf, nppGUI._appPos.left + workAreaRect.left, nppGUI._appPos.top + workAreaRect.top, nppGUI._appPos.right, nppGUI._appPos.bottom, TRUE); + //::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); + + if (nppGUI._rememberLastSession) + { + Session lastSession = (NppParameters::getInstance())->getSession(); + ScintillaEditView *cureentEditView = getCurrentEditView(); + for (size_t i = 0 ; i < lastSession._files.size() ; ) + { + const char *pFn = lastSession._files[i]._fileName.c_str(); + if (PathFileExists(pFn)) + { + doOpen(pFn); + cureentEditView->getCurrentBuffer().setPosition(lastSession._files[i]); + cureentEditView->restoreCurrentPos(lastSession._files[i]); + + for (size_t j = 0 ; j < lastSession._files[i].marks.size() ; j++) + bookmarkAdd(lastSession._files[i].marks[j]); + + i++; + } + else + { + vector::iterator posIt = lastSession._files.begin() + i; + lastSession._files.erase(posIt); + } + } + + if (lastSession._actifIndex < lastSession._files.size()) + _mainDocTab.activate(lastSession._actifIndex); + } + + if (cmdLine) + { + LangType lt = (NppParameters::getInstance())->getDefLang(); + int ln = (NppParameters::getInstance())->getLineNumber2go(); + + if (PathFileExists(cmdLine)) + { + doOpen(cmdLine); + + if (lt != L_TXT) + _pEditView->setCurrentDocType(lt); + if (ln > 0) + _pEditView->execute(SCI_GOTOLINE, ln-1); + } + else + { + FileNameStringSplitter fnss(cmdLine); + char *pFn = NULL; + + for (int i = 0 ; i < fnss.size() ; i++) + { + pFn = (char *)fnss.getFileName(i); + doOpen((const char *)pFn); + + if (lt != L_TXT) + _pEditView->setCurrentDocType(lt); + if (ln > 0) + _pEditView->execute(SCI_GOTOLINE, ln-1); + } + } + // restore the doc type to L_TXT + (NppParameters::getInstance())->setDefLang(L_TXT); + + } + + ::GetModuleFileName(NULL, _nppPath, MAX_PATH); + + setTitleWith(_pEditView->getCurrentTitle()); + + setLangStatus(_pEditView->getCurrentDocType()); + checkDocState(); + + // Notify plugins that Notepad++ is ready + SCNotification scnN; + scnN.nmhdr.code = NPPN_READY; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = 0; + _pluginsManager.notify(&scnN); + + ::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); +} + +bool Notepad_plus::doSimpleOpen(const char *fileName) +{ + Utf8_16_Read UnicodeConvertor; + + FILE *fp = fopen(fileName, "rb"); + + if (fp) + { + _pEditView->execute(SCI_CLEARALL, 0); + _pEditView->setCurrentTitle(fileName); + + char data[blockSize]; + + size_t lenFile = fread(data, 1, sizeof(data), fp); + bool isNotEmpty = (lenFile != 0); + + while (lenFile > 0) + { + lenFile = UnicodeConvertor.convert(data, lenFile); + _pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast(UnicodeConvertor.getNewBuf())); + lenFile = int(fread(data, 1, sizeof(data), fp)); + } + fclose(fp); + + UniMode unicodeMode = static_cast(UnicodeConvertor.getEncoding()); + (_pEditView->getCurrentBuffer()).setUnicodeMode(unicodeMode); + + if (unicodeMode != uni8Bit) + // Override the code page if Unicode + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + // Then replace the caret to the begining + _pEditView->execute(SCI_GOTOPOS, 0); + return true; + } + else + { + char msg[MAX_PATH + 100]; + strcpy(msg, "Can not open file \""); + strcat(msg, fileName); + strcat(msg, "\"."); + ::MessageBox(_hSelf, msg, "Open File error", MB_OK); + return false; + } +} + + +bool Notepad_plus::doOpen(const char *fileName, bool isReadOnly) +{ + char longFileName[MAX_PATH]; + ::GetFullPathName(fileName, MAX_PATH, longFileName, NULL); + + if (switchToFile(longFileName)) + { + if (_pTrayIco) + { + if (_pTrayIco->isInTray()) + { + ::ShowWindow(_hSelf, SW_SHOW); + _pTrayIco->doTrayIcon(REMOVE); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + } + } + return false; + } + + if (!PathFileExists(longFileName)) + { + char str2display[128]; + sprintf(str2display, "%s doesn't exist. Create it?", longFileName); + + if (::MessageBox(_hSelf, str2display, "Create new file", MB_YESNO) == IDYES) + { + FILE *f = fopen(longFileName, "w"); + fclose(f); + } + else + { + _lastRecentFileList.remove(longFileName); + return false; + } + } + + + Utf8_16_Read UnicodeConvertor; + + bool isNewDoc2Close = false; + FILE *fp = fopen(longFileName, "rb"); + + if (fp) + { + if ((_pEditView->getNbDoc() == 1) + && Buffer::isUntitled(_pEditView->getCurrentTitle()) + && (!_pEditView->isCurrentDocDirty()) && (_pEditView->getCurrentDocLen() == 0)) + { + isNewDoc2Close = true; + } + setTitleWith(_pDocTab->newDoc(longFileName)); + + // It's VERY IMPORTANT to reset the view + _pEditView->execute(SCI_CLEARALL); + + char data[blockSize]; + size_t lenFile = fread(data, 1, sizeof(data), fp); + bool isNotEmpty = (lenFile != 0); + + while (lenFile > 0) + { + lenFile = UnicodeConvertor.convert(data, lenFile); + _pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast(UnicodeConvertor.getNewBuf())); + lenFile = int(fread(data, 1, sizeof(data), fp)); + } + fclose(fp); + + // 3 formats : WIN_FORMAT, UNIX_FORMAT and MAC_FORMAT + (_pEditView->getCurrentBuffer()).determinateFormat(isNotEmpty?UnicodeConvertor.getNewBuf():(char *)("")); + _pEditView->execute(SCI_SETEOLMODE, _pEditView->getCurrentBuffer().getFormat()); + + UniMode unicodeMode = static_cast(UnicodeConvertor.getEncoding()); + (_pEditView->getCurrentBuffer()).setUnicodeMode(unicodeMode); + + if (unicodeMode != uni8Bit) + // Override the code page if Unicode + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + if (isReadOnly) + (_pEditView->getCurrentBuffer()).setReadOnly(true); + + _pEditView->getFocus(); + _pEditView->execute(SCI_SETSAVEPOINT); + _pEditView->execute(EM_EMPTYUNDOBUFFER); + + // if file is read only, we set the view read only + _pEditView->execute(SCI_SETREADONLY, _pEditView->isCurrentBufReadOnly()); + if (isNewDoc2Close) + _pDocTab->closeDocAt(0); + + int numLines = int(_pEditView->execute(SCI_GETLINECOUNT)); + + char numLineStr[32]; + itoa(numLines, numLineStr, 10); + int nbDigit = strlen(numLineStr); + + if (_pEditView->increaseMaxNbDigit(nbDigit)) + _pEditView->setLineNumberWidth(_pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER)); + + int maxLen = 0; + int maxPixel = 0; + int pixel = int(_pEditView->execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P")); + + for( int i = 0 ; i < numLines ; i++ ) + { + int len = _pEditView->getLineLength(i); + if (maxLen < len) + { + maxLen = len; + maxPixel = pixel * maxLen; + } + } + + int currentWidth = int(_pEditView->execute(SCI_GETSCROLLWIDTH)); + if (currentWidth < maxPixel) + _pEditView->execute(SCI_SETSCROLLWIDTH, maxPixel); + + // Then replace the caret to the begining + _pEditView->execute(SCI_GOTOPOS, 0); + dynamicCheckMenuAndTB(); + _lastRecentFileList.remove(longFileName); + if (_pTrayIco) + { + if (_pTrayIco->isInTray()) + { + ::ShowWindow(_hSelf, SW_SHOW); + _pTrayIco->doTrayIcon(REMOVE); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + } + } + PathRemoveFileSpec(longFileName); + _linkTriggered = true; + _isDocModifing = false; + setWorkingDir(longFileName); + return true; + } + else + { + char msg[MAX_PATH + 100]; + strcpy(msg, "Can not open file \""); + //strcat(msg, fullPath); + strcat(msg, longFileName); + strcat(msg, "\"."); + ::MessageBox(_hSelf, msg, "ERR", MB_OK); + _lastRecentFileList.remove(longFileName); + return false; + } +} + +void Notepad_plus::fileOpen() +{ + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + fDlg.setExtFilter("c/c++ src file", ".c", ".cpp", ".cxx", ".cc", ".h", NULL); + fDlg.setExtFilter("Window Resource File", ".rc", NULL); + + fDlg.setExtFilter("Java src file", ".java", NULL); + fDlg.setExtFilter("HTML file", ".html", ".htm", NULL); + fDlg.setExtFilter("XML file", ".xml", NULL); + fDlg.setExtFilter("Makefile", "makefile", "GNUmakefile", ".makefile", NULL); + fDlg.setExtFilter("php file", ".php", ".php3", ".phtml", NULL); + fDlg.setExtFilter("asp file", ".asp", NULL); + fDlg.setExtFilter("ini file", ".ini", NULL); + fDlg.setExtFilter("nfo file", ".nfo", NULL); + fDlg.setExtFilter("VB/VBS file", ".vb", ".vbs", NULL); + fDlg.setExtFilter("SQL file", ".sql", NULL); + fDlg.setExtFilter("Objective C file", ".m", ".h", NULL); + if (stringVector *pfns = fDlg.doOpenMultiFilesDlg()) + { + int sz = int(pfns->size()); + for (int i = 0 ; i < sz ; i++) + doOpen((pfns->at(i)).c_str(), fDlg.isReadOnly()); + + setLangStatus(_pEditView->getCurrentDocType()); + } +} + + + +bool Notepad_plus::doReload(const char *fileName, bool alert) +{ + char longFileName[MAX_PATH] =""; + ::GetFullPathName(fileName, MAX_PATH, longFileName, NULL); + + if (switchToFile(longFileName)) + { + if (alert) + { + if (::MessageBox(_hSelf, "Do you want to reload the current file?", "Reload", MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL) == IDYES) + reload(longFileName); + } + else + reload(longFileName); + + return true; + } + return false; +} + +bool Notepad_plus::doSave(const char *filename, UniMode mode) +{ + bool isHidden = false; + bool isSys = false; + DWORD attrib; + + if (PathFileExists(filename)) + { + attrib = ::GetFileAttributes(filename); + + 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); + + } + } + + if (mode == uniCookie) + mode = uni8Bit; + + Utf8_16_Write UnicodeConvertor; + if (_pEditView->execute(SCI_GETCODEPAGE) != 0) + UnicodeConvertor.setEncoding(static_cast(mode)); + + FILE *fp = UnicodeConvertor.fopen(filename, "wb"); + + if (fp) + { + char data[blockSize + 1]; + int lengthDoc = _pEditView->getCurrentDocLen(); + for (int i = 0; i < lengthDoc; i += blockSize) + { + int grabSize = lengthDoc - i; + if (grabSize > blockSize) + grabSize = blockSize; + + _pEditView->getText(data, i, i + grabSize); + UnicodeConvertor.fwrite(data, grabSize); + } + UnicodeConvertor.fclose(); + + _pEditView->updateCurrentBufTimeStamp(); + _pEditView->execute(SCI_SETSAVEPOINT); + + if (isHidden) + ::SetFileAttributes(filename, attrib | FILE_ATTRIBUTE_HIDDEN); + + if (isSys) + ::SetFileAttributes(filename, attrib | FILE_ATTRIBUTE_SYSTEM); + return true; + } + ::MessageBox(_hSelf, "Please check whether if this file is opened in another program", "Save failed", MB_OK); + return false; +} + +bool Notepad_plus::fileSave() +{ + if (_pEditView->isCurrentDocDirty()) + { + const char *fn = _pEditView->getCurrentTitle(); + if (Buffer::isUntitled(fn)) + { + return fileSaveAs(); + } + else + { + const NppGUI & nppgui = (NppParameters::getInstance())->getNppGUI(); + BackupFeature backup = nppgui._backup; + if (backup == bak_simple) + { + //copy fn to fn.backup + string fn_bak(fn); + if ((nppgui._useDir) && (nppgui._backupDir[0] != '\0')) + { + char path[MAX_PATH]; + char *name; + + strcpy(path, fn); + name = ::PathFindFileName(path); + fn_bak = nppgui._backupDir; + fn_bak += "\\"; + fn_bak += name; + } + else + { + fn_bak = fn; + } + fn_bak += ".bak"; + ::CopyFile(fn, fn_bak.c_str(), FALSE); + } + else if (backup == bak_verbose) + { + char path[MAX_PATH]; + char *name; + string fn_dateTime_bak; + + strcpy(path, fn); + + name = ::PathFindFileName(path); + ::PathRemoveFileSpec(path); + + if ((nppgui._useDir) && (nppgui._backupDir[0] != '\0')) + {//printStr(nppgui._backupDir); + fn_dateTime_bak = nppgui._backupDir; + fn_dateTime_bak += "\\"; + } + else + { + const char *bakDir = "nppBackup"; + fn_dateTime_bak = path; + fn_dateTime_bak += "\\"; + fn_dateTime_bak += bakDir; + fn_dateTime_bak += "\\"; + + if (!::PathFileExists(fn_dateTime_bak.c_str())) + { + ::CreateDirectory(bakDir, NULL); + } + } + + fn_dateTime_bak += name; + + const int temBufLen = 32; + char tmpbuf[temBufLen]; + time_t ltime = time(0); + struct tm *today; + + today = localtime(<ime); + strftime(tmpbuf, temBufLen, "%Y-%m-%d_%H%M%S", today); + + fn_dateTime_bak += "."; + fn_dateTime_bak += tmpbuf; + fn_dateTime_bak += ".bak"; + + ::CopyFile(fn, fn_dateTime_bak.c_str(), FALSE); + } + return doSave(fn, _pEditView->getCurrentBuffer().getUnicodeMode()); + } + } + return false; +} + +bool Notepad_plus::fileSaveAll() { + + int iCurrent = _pEditView->getCurrentDocIndex(); + + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + int iCur = _pEditView->getCurrentDocIndex(); + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + fileSave(); + } + + _pDocTab->activate(iCur); + + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + fileSave(); + } + + _pDocTab->activate(iCurrent); + return true; +} + +bool Notepad_plus::replaceAllFiles() { + + int iCurrent = _pEditView->getCurrentDocIndex(); + int nbTotal = 0; + const bool isEntireDoc = true; + + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + int iCur = _pEditView->getCurrentDocIndex(); + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + { + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(REPLACE_ALL, isEntireDoc); + _pEditView->execute(SCI_ENDUNDOACTION); + } + } + _pDocTab->activate(iCur); + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + { + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(REPLACE_ALL, isEntireDoc); + _pEditView->execute(SCI_ENDUNDOACTION); + } + } + + _pDocTab->activate(iCurrent); + + char result[64]; + if (nbTotal < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbTotal, result, 10); + strcat(result, " tokens are replaced."); + + } + ::MessageBox(_hSelf, result, "", MB_OK); + + return true; +} + +bool Notepad_plus::matchInList(const char *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::getMatchedFileNames(const char *dir, const vector & patterns, vector & fileNames, bool isRecursive) +{ + string dirFilter(dir); + dirFilter += "*.*"; + WIN32_FIND_DATA foundData; + + HANDLE hFile = ::FindFirstFile(dirFilter.c_str(), &foundData); + + if (hFile != INVALID_HANDLE_VALUE) + { + + if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (isRecursive) + { + if ((strcmp(foundData.cFileName, ".")) && (strcmp(foundData.cFileName, ".."))) + { + string pathDir(dir); + pathDir += foundData.cFileName; + pathDir += "\\"; + getMatchedFileNames(pathDir.c_str(), patterns, fileNames, isRecursive); + } + } + } + else + { + if (matchInList(foundData.cFileName, patterns)) + { + string pathFile(dir); + pathFile += foundData.cFileName; + fileNames.push_back(pathFile.c_str()); + } + } + } + while (::FindNextFile(hFile, &foundData)) + { + + if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (isRecursive) + { + if ((strcmp(foundData.cFileName, ".")) && (strcmp(foundData.cFileName, ".."))) + { + string pathDir(dir); + pathDir += foundData.cFileName; + pathDir += "\\"; + getMatchedFileNames(pathDir.c_str(), patterns, fileNames, isRecursive); + } + } + } + else + { + if (matchInList(foundData.cFileName, patterns)) + { + string pathFile(dir); + pathFile += foundData.cFileName; + fileNames.push_back(pathFile.c_str()); + } + } + } + ::FindClose(hFile); +} + +bool Notepad_plus::findInFiles(bool isRecursive) +{ + int nbTotal = 0; + ScintillaEditView *pOldView = _pEditView; + + _pEditView = &_invisibleEditView; + _findReplaceDlg.setFinderReadOnly(false); + + if (!_findReplaceDlg.isFinderEmpty()) + _findReplaceDlg.clearFinder(); + + const char *dir2Search = _findReplaceDlg.getDir2Search(); + + if (!dir2Search[0] || !::PathFileExists(dir2Search)) + { + return false; + } + vector patterns2Match; + if (_findReplaceDlg.getFilters() == "") + _findReplaceDlg.setFindInFilesDirFilter(NULL, "*.*"); + _findReplaceDlg.getPatterns(patterns2Match); + vector fileNames; + getMatchedFileNames(dir2Search, patterns2Match, fileNames, isRecursive); + + for (size_t i = 0 ; i < fileNames.size() ; i++) + { + const char *fn = fileNames[i].c_str(); + if (doSimpleOpen(fn)) + nbTotal += _findReplaceDlg.processAll(FIND_ALL, true, fn); + } + _findReplaceDlg.setFinderReadOnly(); + _findReplaceDlg.putFindResult(nbTotal); + + _pEditView = pOldView; + return true; +} + +bool Notepad_plus::findInOpenedFiles() { + + int iCurrent = _pEditView->getCurrentDocIndex(); + int nbTotal = 0; + const bool isEntireDoc = true; + + _findReplaceDlg.setFinderReadOnly(false); + //_findReplaceDlg.setFinderStyle(); + //_pFinder->defineDocType(L_TXT); + //_pFinder->execute(SCI_STYLESETSIZE, STYLE_DEFAULT, 8); + + if (!_findReplaceDlg.isFinderEmpty()) + _findReplaceDlg.clearFinder(); + + _findReplaceDlg.setSearchWord2Finder(); + + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + int iCur = _pEditView->getCurrentDocIndex(); + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(FIND_ALL, isEntireDoc, _pEditView->getCurrentTitle()); + _pEditView->execute(SCI_ENDUNDOACTION); + + } + _pDocTab->activate(iCur); + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(FIND_ALL, isEntireDoc, _pEditView->getCurrentTitle()); + _pEditView->execute(SCI_ENDUNDOACTION); + } + + _pDocTab->activate(iCurrent); + + _findReplaceDlg.setFinderReadOnly(); + + _findReplaceDlg.putFindResult(nbTotal); + + return true; +} + +bool Notepad_plus::fileSaveAs() +{ + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + + fDlg.setExtFilter("c src file", ".c", NULL); + fDlg.setExtFilter("c++ src file", ".cpp", NULL); + fDlg.setExtFilter("Window Resource File", ".rc", NULL); + fDlg.setExtFilter("c/c++ header file", ".h", NULL); + fDlg.setExtFilter("Java src file", ".java", NULL); + fDlg.setExtFilter("HTML file", ".html", NULL); + fDlg.setExtFilter("XML file", ".xml", NULL); + fDlg.setExtFilter("php file", ".php",NULL); + fDlg.setExtFilter("ini file", ".ini", NULL); + fDlg.setExtFilter("bat file", ".bat", NULL); + fDlg.setExtFilter("Normal text file", ".txt", NULL); + char str[MAX_PATH]; + strcpy(str, _pEditView->getCurrentTitle()); + + fDlg.setDefFileName(PathFindFileName(str)); + + if (char *pfn = fDlg.doSaveDlg()) + { + int i = _pEditView->findDocIndexByName(pfn); + if ((i == -1) || (i == _pEditView->getCurrentDocIndex())) + { + doSave(pfn, _pEditView->getCurrentBuffer().getUnicodeMode()); + _pEditView->setCurrentTitle(pfn); + _pEditView->setCurrentDocReadOnly(false); + _pDocTab->updateCurrentTabItem(PathFindFileName(pfn)); + setTitleWith(pfn); + setLangStatus(_pEditView->getCurrentDocType()); + checkLangsMenu(-1); + return true; + } + else + { + ::MessageBox(_hSelf, "The file is already opened in the Notepad++.", "ERROR", MB_OK | MB_ICONSTOP); + _pDocTab->activate(i); + return false; + } + checkModifiedDocument(); + } + else // cancel button is pressed + { + checkModifiedDocument(); + return false; + } +} + +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_STREAM_COMMENT, hasSelection, MENU); +} + +void Notepad_plus::checkDocState() +{ + bool isCurrentDirty = _pEditView->isCurrentDocDirty(); + bool isSeveralDirty = (!_pEditView->isAllDocsClean()) || (!getNonCurrentEditView()->isAllDocsClean()); + + enableCommand(IDM_FILE_SAVE, isCurrentDirty, MENU | TOOLBAR); + enableCommand(IDM_FILE_SAVEALL, isSeveralDirty, MENU | TOOLBAR); + + bool isSysReadOnly = _pEditView->isCurrentBufSysReadOnly(); + if (isSysReadOnly) + { + HMENU hMenu = ::GetMenu(_hSelf); + ::CheckMenuItem(hMenu, 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 = _pEditView->isCurrentBufUserReadOnly(); + HMENU hMenu = ::GetMenu(_hSelf); + ::CheckMenuItem(hMenu, IDM_EDIT_SETREADONLY, MF_BYCOMMAND | (isUserReadOnly?MF_CHECKED:MF_UNCHECKED)); + } + + enableConvertMenuItems((_pEditView->getCurrentBuffer()).getFormat()); + 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_EDIT_STARTRECORDINGMACRO, !_recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_EDIT_STOPRECORDINGMACRO, _recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_EDIT_PLAYBACKRECORDEDMACRO, !_macro.empty() && !_recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_EDIT_SAVECURRENTMACRO, !_macro.empty() && !_recordingMacro, MENU | TOOLBAR); + + enableCommand(IDM_EDIT_RUNMULTIMACRODLG, (!_macro.empty() && !_recordingMacro) || !((NppParameters::getInstance())->getMacroList()).empty(), MENU | TOOLBAR); +} + +void Notepad_plus::checkSyncState() +{ + bool canDoSync = _mainDocTab.isVisible() && _subDocTab.isVisible(); + 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::synchronise() +{ + Buffer & bufSrc = _pEditView->getCurrentBuffer(); + + const char *fn = bufSrc.getFileName(); + + int i = getNonCurrentDocTab()->find(fn); + if (i != -1) + { + Buffer & bufDest = getNonCurrentEditView()->getBufferAt(i); + bufDest.synchroniseWith(bufSrc); + getNonCurrentDocTab()->updateTabItem(i); + } +} + + +void Notepad_plus::checkLangsMenu(int id) const +{ + if (id == -1) + { + id = (NppParameters::getInstance())->langTypeToCommandID(_pEditView->getCurrentDocType()); + if (id == IDM_LANG_USER) + { + if (_pEditView->getCurrentBuffer().isUserDefineLangExt()) + { + const char *userLangName = _pEditView->getCurrentBuffer().getUserDefineLangName(); + char menuLangName[16]; + + for (int i = IDM_LANG_USER + 1 ; i <= IDM_LANG_USER_LIMIT ; i++) + { + if (::GetMenuString(::GetMenu(_hSelf), i, menuLangName, sizeof(menuLangName), MF_BYCOMMAND)) + if (!strcmp(userLangName, menuLangName)) + { + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_LANG_C, IDM_LANG_USER_LIMIT, i, MF_BYCOMMAND); + return; + } + } + } + } + } + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_LANG_C, IDM_LANG_USER_LIMIT, id, MF_BYCOMMAND); +} +void Notepad_plus::setLangStatus(LangType langType) +{ + string str2Show; + + switch (langType) + { + case L_C: + str2Show = "c source file"; break; + + case L_CPP: + str2Show = "c++ source file"; break; + + case L_OBJC: + str2Show = "Objective C source file"; break; + + case L_JAVA: + str2Show = "Java source file"; break; + + case L_CS: + str2Show = "C# source file"; break; + + case L_RC : + str2Show = "Windows Resource file"; break; + + case L_MAKEFILE: + str2Show = "Makefile"; break; + + case L_HTML: + str2Show = "Hyper Text Markup Language file"; break; + + case L_XML: + str2Show = "eXtensible Markup Language file"; break; + + case L_JS: + str2Show = "Javascript file"; break; + + case L_PHP: + str2Show = "PHP Hypertext Preprocessor file"; break; + + case L_ASP: + str2Show = "Active Server Pages script file"; break; + + case L_CSS: + str2Show = "Cascade Style Sheets File"; break; + + case L_LUA: + str2Show = "Lua source File"; break; + + case L_NFO: + str2Show = "MSDOS Style"; break; + + case L_SQL: + str2Show = "Structure Query Language file"; break; + + case L_VB: + str2Show = "Visual Basic file"; break; + + case L_BATCH : + str2Show = "Batch file"; break; + + case L_PASCAL : + str2Show = "Pascal source file"; break; + + case L_PERL : + str2Show = "Perl source file"; break; + + case L_PYTHON : + str2Show = "Python file"; break; + + case L_TEX : + str2Show = "TeX file"; break; + + case L_FORTRAN : + str2Show = "Fortran source file"; break; + + case L_BASH : + str2Show = "Unix script file"; break; + + case L_FLASH : + str2Show = "Flash Action script file"; break; + + case L_NSIS : + str2Show = "Nullsoft Scriptable Install System script file"; break; + + case L_TCL : + str2Show = "Tool Command Language file"; break; + + case L_LISP : + str2Show = "List Processing language file"; break; + + case L_SCHEME : + str2Show = "Sheme file"; break; + + case L_ASM : + str2Show = "Assembler file"; break; + + case L_DIFF : + str2Show = "Diff file"; break; + + case L_PROPS : + str2Show = "Properties file"; break; + + case L_PS : + str2Show = "Postscript file"; break; + + case L_RUBY : + str2Show = "Ruby file"; break; + + case L_SMALLTALK : + str2Show = "Smalltalk file"; break; + + case L_VHDL : + str2Show = "VHSIC Hardware Description Language file"; break; + + case L_VERILOG : + str2Show = "Verilog file"; break; + + case L_KIX : + str2Show = "KiXtart file"; break; + + case L_ADA : + str2Show = "Ada file"; break; + + case L_CAML : + str2Show = "Categorical Abstract Machine Language"; break; + + case L_AU3 : + str2Show = "AutoIt"; break; + + case L_MATLAB : + str2Show = "MATrix LABoratory"; break; + + case L_HASKELL : + str2Show = "Haskell"; break; + + case L_INNO : + str2Show = "Inno Setup script"; break; + + case L_CMAKE : + str2Show = "CMAKEFILE"; break; + + case L_USER: + { + str2Show = "User Define File"; + Buffer & currentBuf = _pEditView->getCurrentBuffer(); + if (currentBuf.isUserDefineLangExt()) + { + str2Show += " - "; + str2Show += currentBuf.getUserDefineLangName(); + } + break; + } + + default: + str2Show = "Normal text file"; + + } + _statusBar.setText(str2Show.c_str(), STATUSBAR_DOC_TYPE); +} + +void Notepad_plus::getApiFileName(LangType langType, string &fn) +{ + + switch (langType) + { + case L_C: fn = "c"; break; + + case L_CPP: fn = "cpp"; break; + + case L_OBJC: fn = "objC"; break; + + case L_JAVA: fn = "java"; break; + + case L_CS : fn = "cs"; break; + + case L_XML: fn = "xml"; break; + + case L_JS: fn = "javascript"; break; + + case L_PHP: fn = "php"; break; + + case L_VB: + case L_ASP: fn = "vb"; break; + + case L_CSS: fn = "css"; break; + + case L_LUA: fn = "lua"; break; + + case L_PERL: fn = "perl"; break; + + case L_PASCAL: fn = "pascal"; break; + + case L_PYTHON: fn = "python"; break; + + case L_TEX : fn = "tex"; break; + + case L_FORTRAN : fn = "fortran"; break; + + case L_BASH : fn = "bash"; break; + + case L_FLASH : fn = "flash"; break; + + case L_NSIS : fn = "nsis"; break; + + case L_TCL : fn = "tcl"; break; + + case L_LISP : fn = "lisp"; break; + + case L_SCHEME : fn = "sheme"; break; + + case L_ASM : + fn = "asm"; break; + + case L_DIFF : + fn = "diff"; break; +/* + case L_PROPS : + fn = "Properties file"; break; +*/ + case L_PS : + fn = "postscript"; break; + + case L_RUBY : + fn = "ruby"; break; + + case L_SMALLTALK : + fn = "smalltalk"; break; + + case L_VHDL : + fn = "vhdl"; break; + + case L_KIX : + fn = "kix"; break; + + case L_AU3 : + fn = "autoit"; break; + + case L_CAML : + fn = "caml"; break; + + case L_ADA : + fn = "ada"; break; + + case L_VERILOG : + fn = "verilog"; break; + + case L_MATLAB : + fn = "matlab"; break; + + case L_HASKELL : + fn = "haskell"; break; + + case L_INNO : + fn = "inno"; break; + + case L_CMAKE : + fn = "cmake"; break; + + case L_USER : + { + Buffer & currentBuf = _pEditView->getCurrentBuffer(); + if (currentBuf.isUserDefineLangExt()) + { + fn = currentBuf.getUserDefineLangName(); + } + break; + } + default: + fn = "text"; + + } +} + + +BOOL Notepad_plus::notify(SCNotification *notification) +{ + switch (notification->nmhdr.code) + { + + case SCN_MODIFIED: + { + if ((notification->modificationType & SC_MOD_DELETETEXT) || (notification->modificationType & SC_MOD_INSERTTEXT)) + { + _linkTriggered = true; + _isDocModifing = true; + ::InvalidateRect(_pEditView->getHSelf(), NULL, TRUE); + } + } + break; + + case SCN_DOUBLECLICK : + { + if (_isHotspotDblClicked) + { + int pos = _pEditView->execute(SCI_GETCURRENTPOS); + _pEditView->execute(SCI_SETCURRENTPOS, pos); + _pEditView->execute(SCI_SETANCHOR, pos); + _isHotspotDblClicked = false; + } + } + // + break; + + case SCN_SAVEPOINTREACHED: + _pEditView->setCurrentDocState(false); + _pDocTab->updateCurrentTabItem(); + checkDocState(); + synchronise(); + break; + + case SCN_SAVEPOINTLEFT: + _pEditView->setCurrentDocState(true); + _pDocTab->updateCurrentTabItem(); + checkDocState(); + synchronise(); + 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); + int destIndex = sender->getTabDraggedIndex(); + int scrIndex = sender->getSrcTabIndex(); + + // if the dragNdrop tab is not the current view tab, + // we have to set it to the current view tab + if (notification->nmhdr.hwndFrom != _pDocTab->getHSelf()) + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + _pEditView->sortBuffer(destIndex, scrIndex); + _pEditView->setCurrentIndex(destIndex); + + 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()) + { + char goToView[64] = "Go to another View"; + char cloneToView[64] = "Clone to another View"; + const char *pGoToView = goToView; + const char *pCloneToView = cloneToView; + + if (_nativeLang) + { + TiXmlNode *tabBarMenu = _nativeLang->FirstChild("Menu"); + tabBarMenu = tabBarMenu->FirstChild("TabBar"); + if (tabBarMenu) + { + for (TiXmlNode *childNode = tabBarMenu->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int ordre; + element->Attribute("order", &ordre); + if (ordre == 5) + pGoToView = element->Attribute("name"); + else if (ordre == 6) + pCloneToView = element->Attribute("name"); + } + } + if (!pGoToView || !pGoToView[0]) + pGoToView = goToView; + if (!pCloneToView || !pCloneToView[0]) + pCloneToView = cloneToView; + } + vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_GOTO_ANOTHER_VIEW, pGoToView)); + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_CLONE_TO_ANOTHER_VIEW, pCloneToView)); + _tabPopupDropMenu.create(_hSelf, itemUnitArray); + } + _tabPopupDropMenu.display(p); + } + else if ((hWin == getNonCurrentDocTab()->getHSelf()) || + (hWin == getNonCurrentEditView()->getHSelf())) // In the another view group + { + if (::GetKeyState(VK_LCONTROL) & 0x80000000) + docGotoAnotherEditView(MODE_CLONE); + else + docGotoAnotherEditView(MODE_TRANSFER); + } + //else on fout rien!!! // It's non view group + } + break; + } + + case TCN_TABDELETE: + { + if (notification->nmhdr.hwndFrom != _pDocTab->getHSelf()) + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + fileClose(); + break; + + } + + case TCN_SELCHANGE: + { + char fullPath[MAX_PATH]; + + if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf()) + { + strcpy(fullPath, _mainDocTab.clickedUpdate()); + switchEditViewTo(MAIN_VIEW); + + } + else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf()) + { + strcpy(fullPath, _subDocTab.clickedUpdate()); + switchEditViewTo(SUB_VIEW); + } + + PathRemoveFileSpec(fullPath); + setWorkingDir(fullPath); + //_pEditView->execute(SCI_SETLEXER, SCLEX_CONTAINER) + _linkTriggered = true; + 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))?"OVR":"INS", STATUSBAR_TYPING_MODE); + } + } + 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, clientPoint; + ::GetCursorPos(&p); + clientPoint.x = p.x; + clientPoint.y = p.y; + + if (!_tabPopupMenu.isCreated()) + { + char close[32] = "Close me"; + char closeBut[32] = "Close all but me"; + char save[32] = "Save me"; + char saveAs[32] = "Save me As..."; + char print[32] = "Print me"; + char readOnly[32] = "Read only"; + char clearReadOnly[32] = "Clear read only flag"; + char goToView[32] = "Go to another View"; + char cloneToView[32] = "Clone to another View"; + char cilpFullPath[32] = "Full file path to Clipboard"; + char cilpFileName[32] = "File name to Clipboard"; + char cilpCurrentDir[32] = "Current dir path to Clipboard"; + + + const char *pClose = close; + const char *pCloseBut = closeBut; + const char *pSave = save; + const char *pSaveAs = saveAs; + const char *pPrint = print; + const char *pReadOnly = readOnly; + const char *pClearReadOnly = clearReadOnly; + const char *pGoToView = goToView; + const char *pCloneToView = cloneToView; + const char *pCilpFullPath = cilpFullPath; + const char *pCilpFileName = cilpFileName; + const char *pCilpCurrentDir = cilpCurrentDir; + if (_nativeLang) + { + TiXmlNode *tabBarMenu = _nativeLang->FirstChild("Menu"); + if (tabBarMenu) + { + tabBarMenu = tabBarMenu->FirstChild("TabBar"); + if (tabBarMenu) + { + for (TiXmlNode *childNode = tabBarMenu->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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; + + } + } + } + } + if (!pClose || !pClose[0]) + pClose = close; + if (!pCloseBut || !pCloseBut[0]) + pCloseBut = cloneToView; + if (!pSave || !pSave[0]) + pSave = save; + if (!pSaveAs || !pSaveAs[0]) + pSaveAs = saveAs; + if (!pPrint || !pPrint[0]) + pPrint = print; + if (!pGoToView || !pGoToView[0]) + pGoToView = goToView; + if (!pCloneToView || !pCloneToView[0]) + pCloneToView = cloneToView; + } + vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSE, pClose)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSEALL_BUT_CURRENT, pCloseBut)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVE, pSave)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVEAS, pSaveAs)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_PRINT, pPrint)); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_SETREADONLY, pReadOnly)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CLEARREADONLY, pClearReadOnly)); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FULLPATHTOCLIP, pCilpFullPath)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FILENAMETOCLIP, pCilpFileName)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CURRENTDIRTOCLIP, pCilpCurrentDir)); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_GOTO_ANOTHER_VIEW, pGoToView)); + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_CLONE_TO_ANOTHER_VIEW, pCloneToView)); + + _tabPopupMenu.create(_hSelf, itemUnitArray); + + } + ::ScreenToClient(_pDocTab->getHSelf(), &clientPoint); + ::SendMessage(_pDocTab->getHSelf(), WM_LBUTTONDOWN, 2, MAKELONG(clientPoint.x, clientPoint.y)); + + bool isEnable = ((::GetMenuState(::GetMenu(_hSelf), IDM_FILE_SAVE, MF_BYCOMMAND)&MF_DISABLED) == 0); + _tabPopupMenu.enableItem(IDM_FILE_SAVE, isEnable); + + bool isUserReadOnly = _pEditView->isCurrentBufUserReadOnly(); + _tabPopupMenu.checkItem(IDM_EDIT_SETREADONLY, isUserReadOnly); + + bool isSysReadOnly = _pEditView->isCurrentBufSysReadOnly(); + _tabPopupMenu.enableItem(IDM_EDIT_SETREADONLY, !isSysReadOnly); + _tabPopupMenu.enableItem(IDM_EDIT_CLEARREADONLY, isSysReadOnly); + + _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) + { + + int lineClick = int(_pEditView->execute(SCI_LINEFROMPOSITION, notification->position)); + bookmarkToggle(lineClick); + + } + break; + } + + + case SCN_CHARADDED: + charAdded(static_cast(notification->ch)); + break; + + case SCN_UPDATEUI: + braceMatch(); + updateStatusBar(); + break; + + case TTN_GETDISPINFO: + { + LPTOOLTIPTEXT lpttt; + + lpttt = (LPTOOLTIPTEXT)notification; + lpttt->hinst = _hInst; + + // Specify the resource identifier of the descriptive + // text for the given button. + int idButton = int(lpttt->hdr.idFrom); + static string tip; + getNameStrFromCmd(idButton, tip); + lpttt->lpszText = (LPSTR)tip.c_str(); + } + break; + + case SCN_ZOOM: + _pEditView->setLineNumberWidth(_pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER)); + break; + + case SCN_MACRORECORD: + _macro.push_back(recordedMacroStep(notification->message, notification->wParam, notification->lParam)); + break; + +/* + case SCN_STYLENEEDED: + { + + } + break; +*/ + case SCN_PAINTED: + { + if (_syncInfo.doSync()) + doSynScorll(HWND(notification->nmhdr.hwndFrom)); + + if (_linkTriggered) + { + int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL; + if ((urlAction == 1) || (urlAction == 2)) + addHotSpot(_isDocModifing); + _linkTriggered = false; + _isDocModifing = false; + } + break; + } + + + case SCN_HOTSPOTDOUBLECLICK : + { + _pEditView->execute(SCI_SETWORDCHARS, 0, (LPARAM)"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-+.:?&@=/%#"); + + int pos = _pEditView->execute(SCI_GETCURRENTPOS); + int startPos = static_cast(_pEditView->execute(SCI_WORDSTARTPOSITION, pos, false)); + int endPos = static_cast(_pEditView->execute(SCI_WORDENDPOSITION, pos, false)); + + _pEditView->execute(SCI_SETTARGETSTART, startPos); + _pEditView->execute(SCI_SETTARGETEND, endPos); + + int posFound = _pEditView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRegExpr), (LPARAM)urlHttpRegExpr); + if (posFound != -1) + { + startPos = int(_pEditView->execute(SCI_GETTARGETSTART)); + endPos = int(_pEditView->execute(SCI_GETTARGETEND)); + } + + char currentWord[MAX_PATH*2]; + _pEditView->getText(currentWord, startPos, endPos); + + ::ShellExecute(_hSelf, "open", currentWord, NULL, NULL, SW_SHOW); + _isHotspotDblClicked = true; + _pEditView->execute(SCI_SETCHARSDEFAULT); + break; + } + + default : + break; + + } + return FALSE; +} +void Notepad_plus::findMatchingBracePos(int & braceAtCaret, int & braceOpposite) +{ + int caretPos = int(_pEditView->execute(SCI_GETCURRENTPOS, 0, 0)); + braceAtCaret = -1; + braceOpposite = -1; + char charBefore = '\0'; + //char styleBefore = '\0'; + int lengthDoc = int(_pEditView->execute(SCI_GETLENGTH, 0, 0)); + + if ((lengthDoc > 0) && (caretPos > 0)) + { + charBefore = char(_pEditView->execute(SCI_GETCHARAT, caretPos - 1, 0)); + } + // Priority goes to character before caret + if (charBefore && strchr("[](){}", charBefore)) + { + braceAtCaret = caretPos - 1; + } + + if (lengthDoc > 0 && (braceAtCaret < 0)) + { + // No brace found so check other side + char charAfter = char(_pEditView->execute(SCI_GETCHARAT, caretPos, 0)); + if (charAfter && strchr("[](){}", 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(char 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--; + unsigned char ch = (unsigned char)_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 = (unsigned char)_pEditView->execute(SCI_GETCHARAT, posBegin2style); + while ((posBegin2style > 0) && ((ch != 0x0A) && (ch != 0x0D))) + { + ch = (unsigned char)_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; + + //char *regExprStr0 = "http://[a-z0-9_-+.:?=/%]*";//"http://[^ \\t\\\"]*"; + //char *regExprStr1 = "[a-zA-Z0-9._]+@[a-zA-Z0-9_]+.[a-zA-Z0-9_]+"; + + 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; + + char fontName[256]; + + _pEditView->execute(SCI_STYLEGETFONT, idStyle, (LPARAM)fontName); + int fg = _pEditView->execute(SCI_STYLEGETFORE, idStyle); + int bg = _pEditView->execute(SCI_STYLEGETBACK, idStyle); + int 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); + + int fontStyle = (isBold?FONTSTYLE_BOLD:0) | (isItalic?FONTSTYLE_ITALIC:0) | (isUnderline?FONTSTYLE_UNDERLINE:0); + int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL; + if (urlAction == 2) + fontStyle |= FONTSTYLE_UNDERLINE; + + _pEditView->setStyle(style_hotspot, fg, bg, fontName, fontStyle, fontSize); + + _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(char 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_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 + 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, _hSelf, svp._edgeNbColumn, "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(); + checkSyncState(); + break; + + case IDM_FILE_CLOSEALL: + fileCloseAll(); + checkSyncState(); + break; + + case IDM_FILE_CLOSEALL_BUT_CURRENT : + fileCloseAllButCurrent(); + checkSyncState(); + break; + + case IDM_FILE_SAVE : + fileSave(); + break; + + case IDM_FILE_SAVEALL : + fileSaveAll(); + break; + + case IDM_FILE_SAVEAS : + fileSaveAs(); + break; + + case IDM_FILE_LOADSESSION: + fileLoadSession(); + break; + + case IDM_FILE_SAVESESSION: + fileSaveSession(); + break; + + case IDC_BUTTON_PRINT : + 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); + break; + + case IDM_EDIT_COPY: + _pEditView->execute(WM_COPY); + checkClipboard(); + break; + + case IDM_EDIT_PASTE: + { + int eolMode = int(_pEditView->execute(SCI_GETEOLMODE)); + _pEditView->execute(WM_PASTE); + _pEditView->execute(SCI_CONVERTEOLS, eolMode); + } + break; + + case IDM_EDIT_DELETE: + _pEditView->execute(WM_CLEAR); + break; + + case IDM_EDIT_STARTRECORDINGMACRO: + case IDM_EDIT_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_EDIT_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_EDIT_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_EDIT_SAVECURRENTMACRO : + { + if (addCurrentMacro()) + _runMacroDlg.initMacroList(); + break; + } + case IDM_EDIT_FULLPATHTOCLIP : + { + str2Cliboard(_pEditView->getCurrentTitle()); + } + break; + + case IDM_EDIT_CURRENTDIRTOCLIP : + { + char dir[MAX_PATH]; + strcpy(dir, _pEditView->getCurrentTitle()); + PathRemoveFileSpec((LPSTR)dir); + + str2Cliboard(dir); + } + break; + + case IDM_EDIT_FILENAMETOCLIP : + { + str2Cliboard(PathFindFileName((LPSTR)_pEditView->getCurrentTitle())); + } + break; + + case IDM_SEARCH_FIND : + case IDM_SEARCH_REPLACE : + { + const int strSize = 64; + char str[strSize]; + + bool isFirstTime = !_findReplaceDlg.isCreated(); + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + _pEditView->expandWordSelection(); + + if (_nativeLang) + { + TiXmlNode *dlgNode = _nativeLang->FirstChild("Dialog"); + if (dlgNode) + { + 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) + { + pNppParam->getFindDlgTabTitiles()._find = titre1; + pNppParam->getFindDlgTabTitiles()._replace = titre2; + pNppParam->getFindDlgTabTitiles()._findInFiles = titre3; + } + } + } + } + _findReplaceDlg.doDialog((id == IDM_SEARCH_FIND)?FIND_DLG:REPLACE_DLG, _isRTL); + + if (_pEditView->getSelectedText(str, strSize, true)) + _findReplaceDlg.setSearchText(str, _pEditView->getCurrentBuffer()._unicodeMode != uni8Bit); + + if (isFirstTime) + changeDlgLang(_findReplaceDlg.getHSelf(), "Find"); + break; + } + + case IDM_SEARCH_FINDINFILES : + { + ::SendMessage(_hSelf, NPPM_LAUNCHFINDINFILESDLG, 0, 0); + break; + } + case IDM_SEARCH_FINDINCREMENT : + { + const int strSize = 64; + char str[strSize]; + + _incrementFindDlg.doDialog(_isRTL); + + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + { + _pEditView->expandWordSelection(); + } + _pEditView->getSelectedText(str, strSize); + _incrementFindDlg.setSearchText(str, _pEditView->getCurrentBuffer()._unicodeMode != uni8Bit); + } + break; + + case IDM_SEARCH_FINDNEXT : + case IDM_SEARCH_FINDPREV : + { + if (!_findReplaceDlg.isCreated()) + return; + + _findReplaceDlg.setSearchDirection(id == IDM_SEARCH_FINDNEXT?DIR_DOWN:DIR_UP); + + string s = _findReplaceDlg.getText2search(); + _findReplaceDlg.processFindNext(s.c_str()); + break; + } + break; + + case IDM_SEARCH_VOLATILE_FINDNEXT : + case IDM_SEARCH_VOLATILE_FINDPREV : + { + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + { + _pEditView->expandWordSelection(); + } + else + { + char text2Find[MAX_PATH]; + _pEditView->getSelectedText(text2Find, sizeof(text2Find)); + + FindOption op; + op._isWholeWord = false; + op._whichDirection = (id == IDM_SEARCH_VOLATILE_FINDNEXT?DIR_DOWN:DIR_UP); + _findReplaceDlg.processFindNext(text2Find, &op); + } + break; + } + case IDM_SEARCH_MARKALL : + { + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + { + _pEditView->expandWordSelection(); + } + char text2Find[MAX_PATH]; + _pEditView->getSelectedText(text2Find, sizeof(text2Find)); + + FindOption op; + op._isWholeWord = false; + //op._whichDirection = (id == IDM_SEARCH_VOLATILE_FINDNEXT?DIR_DOWN:DIR_UP); + _findReplaceDlg.markAll(text2Find); + + break; + } + + case IDM_SEARCH_UNMARKALL : + { + LangType lt = _pEditView->getCurrentDocType(); + if (lt == L_TXT) + _pEditView->defineDocType(L_CPP); + _pEditView->defineDocType(lt); + _pEditView->execute(SCI_MARKERDELETEALL, MARK_SYMBOLE); + 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 (_mainWindowStatus & TWO_VIEWS_MASK) + _pMainWindow = &_subSplitter; + else + _pMainWindow = _pDocTab; + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + udd->display(false); + _mainWindowStatus &= ~DOCK_MASK; + } + else if ((isUDDlgDocked)&&(!isUDDlgVisible)) + { + if (!_pMainSplitter) + { + _pMainSplitter = new SplitterContainer; + _pMainSplitter->init(_hInst, _hSelf); + + Window *pWindow; + if (_mainWindowStatus & TWO_VIEWS_MASK) + pWindow = &_subSplitter; + else + pWindow = _pDocTab; + + _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45); + } + + _pMainWindow = _pMainSplitter; + + _pMainSplitter->setWin0((_mainWindowStatus & TWO_VIEWS_MASK)?(Window *)&_subSplitter:(Window *)_pDocTab); + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + _pMainWindow->display(); + + _mainWindowStatus |= DOCK_MASK; + } + 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_TRANSPOSE_LINE: + _pEditView->execute(SCI_LINETRANSPOSE); + 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(); + break; + + case IDM_EDIT_STREAM_COMMENT: + doStreamComment(); + break; + + case IDM_EDIT_TRIMTRAILING: + doTrimTrailing(); + break; + + case IDM_EDIT_SETREADONLY: + { + HMENU hMenu = ::GetMenu(_hSelf); + int check = (::GetMenuState(hMenu, id, MF_BYCOMMAND) == MF_CHECKED)?MF_UNCHECKED:MF_CHECKED; + ::CheckMenuItem(hMenu, id, MF_BYCOMMAND | check); + _pEditView->setCurrentDocReadOnlyByUser(check == MF_CHECKED); + _pDocTab->updateCurrentTabItem(); + } + break; + + case IDM_EDIT_CLEARREADONLY: + { + DWORD dwFileAttribs = ::GetFileAttributes(_pEditView->getCurrentBuffer().getFileName()); + dwFileAttribs ^= FILE_ATTRIBUTE_READONLY; + + ::SetFileAttributes(_pEditView->getCurrentBuffer().getFileName(), dwFileAttribs); + + //_pEditView->getCurrentBuffer().setReadOnly(false); + _pEditView->execute(SCI_SETREADONLY,false); + _pEditView->updateCurrentDocSysReadOnlyStat(); + + _pDocTab->updateCurrentTabItem(); + + HMENU hMenu = ::GetMenu(_hSelf); + enableCommand(IDM_EDIT_SETREADONLY, true, MENU); + } + break; + + case IDM_VIEW_FULLSCREENTOGGLE : + fullScreenToggle(); + break; + + case IDM_VIEW_ALWAYSONTOP: + { + HMENU hMenu = ::GetMenu(_hSelf); + int check = (::GetMenuState(hMenu, id, MF_BYCOMMAND) == MF_CHECKED)?MF_UNCHECKED:MF_CHECKED; + ::CheckMenuItem(hMenu, 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_HIDE: + { + int checkedID = getToolBarState(); + + if (checkedID != IDM_VIEW_TOOLBAR_HIDE) + { + RECT rc; + getClientRect(rc); + _toolBar.display(false); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_TOOLBAR_REDUCE: + { + int checkedID = getToolBarState(); + + if (checkedID != IDM_VIEW_TOOLBAR_REDUCE) + { + RECT rc; + getClientRect(rc); + _toolBar.reduce(); + _toolBar.display(); + _rebar.reNew(); + _rebar.display(); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + //changeToolBarIcons(); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_TOOLBAR_ENLARGE: + { + int checkedID = getToolBarState(); + if (checkedID != IDM_VIEW_TOOLBAR_ENLARGE) + { + RECT rc; + getClientRect(rc); + _toolBar.enlarge(); + _toolBar.display(); + _rebar.reNew(); + _rebar.display(); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + changeToolBarIcons(); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_TOOLBAR_STANDARD: + { + int checkedID = getToolBarState(); + if (checkedID != IDM_VIEW_TOOLBAR_STANDARD) + { + RECT rc; + getClientRect(rc); + _toolBar.setToUglyIcons(); + _toolBar.display(); + _rebar.reNew(); + _rebar.display(); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_REDUCETABBAR : + { + _toReduceTabBar = !_toReduceTabBar; + + //Resize the icon + int iconSize = _toReduceTabBar?12:20; + + //Resize the tab height + int tabHeight = _toReduceTabBar?20:25; + + //change the font + int stockedFont = _toReduceTabBar?DEFAULT_GUI_FONT:SYSTEM_FONT; + + TabCtrl_SetItemSize(_mainDocTab.getHSelf(), 45, tabHeight); + TabCtrl_SetItemSize(_subDocTab.getHSelf(), 45, tabHeight); + + _docTabIconList.setIconSize(iconSize); + + 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)); + } + RECT rc; + + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + break; + } + + case IDM_VIEW_REFRESHTABAR : + { + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + 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); + } + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + break; + } + + case IDM_VIEW_DRAWTABBAR_DBCLK2CLOSE : + { + TabBarPlus::setDbClk2Close(!TabBarPlus::isDbClk2Close()); + break; + } + + case IDM_VIEW_STATUSBAR: + { + RECT rc; + getClientRect(rc); + NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI(); + nppGUI._statusBarShow = !nppGUI._statusBarShow; + _statusBar.display(nppGUI._statusBarShow); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + break; + } + case IDM_VIEW_TAB_SPACE: + { + HMENU hMenu = ::GetMenu(_hSelf); + bool isChecked = !(::GetMenuState(hMenu, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND) == MF_CHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_EOL, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_ALL_CHARACTERS, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, 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: + { + HMENU hMenu = ::GetMenu(_hSelf); + bool isChecked = !(::GetMenuState(hMenu, IDM_VIEW_EOL, MF_BYCOMMAND) == MF_CHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_EOL, MF_BYCOMMAND | (isChecked?MF_CHECKED:MF_UNCHECKED)); + ::CheckMenuItem(hMenu, 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: + { + HMENU hMenu = ::GetMenu(_hSelf); + bool isChecked = !(::GetMenuState(hMenu, id, MF_BYCOMMAND) == MF_CHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_EOL, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, 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: + { + _pEditView->wrap(!_pEditView->isWrap()); + _toolBar.setCheck(IDM_VIEW_WRAP, _pEditView->isWrap()); + checkMenuItem(IDM_VIEW_WRAP, _pEditView->isWrap()); + break; + } + case IDM_VIEW_WRAP_SYMBOL: + { + _pEditView->showWrapSymbol(!_pEditView->isWrapSymbolVisible()); + //_toolBar.setCheck(IDM_VIEW_WRAP, _pEditView->isWrap()); + checkMenuItem(IDM_VIEW_WRAP_SYMBOL, _pEditView->isWrapSymbolVisible()); + break; + } + case IDM_VIEW_ZOOMIN: + { + _pEditView->execute(SCI_ZOOMIN); + break; + } + case IDM_VIEW_ZOOMOUT: + _pEditView->execute(SCI_ZOOMOUT); + break; + + case IDM_VIEW_ZOOMRESTORE: + _pEditView->execute(SCI_SETZOOM, _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 : + { + int f = int((id == IDM_FORMAT_TODOS)?SC_EOL_CRLF:(id == IDM_FORMAT_TOUNIX)?SC_EOL_LF:SC_EOL_CR); + _pEditView->execute(SCI_SETEOLMODE, f); + _pEditView->execute(SCI_CONVERTEOLS, f); + (_pEditView->getCurrentBuffer()).setFormat((formatType)f); + enableConvertMenuItems((formatType)f); + setDisplayFormat((formatType)f); + 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 : + { + UniMode um; + bool isUnicodeMode = true; + switch (id) + { + case IDM_FORMAT_ANSI: + um = uni8Bit; + isUnicodeMode = false; + 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_AS_UTF_8 + { + bool wasChecked = (_pEditView->getCurrentBuffer().getUnicodeMode() == uniCookie); + if (wasChecked) + { + um = uni8Bit; + isUnicodeMode = false; + } + else + { + um = uniCookie; + checkMenuItem(IDM_FORMAT_AS_UTF_8, false); + } + } + } + _pEditView->getCurrentBuffer().setUnicodeMode(um); + _pDocTab->updateCurrentTabItem(); + checkDocState(); + synchronise(); + + _pEditView->execute(SCI_SETCODEPAGE, isUnicodeMode?SC_CP_UTF8:0); + checkUnicodeMenuItems(um); + setUniModeText(um); + 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, _hSelf, nppgui._tabSize, "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_HISTORY_SIZE : + { + ValueDlg nbHistoryDlg; + NppParameters *pNppParam = NppParameters::getInstance(); + nbHistoryDlg.init(_hInst, _hSelf, pNppParam->getNbMaxFile(), "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_HISTORY_DONT_CHECK : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._checkHistoryFiles = !nppgui._checkHistoryFiles; + checkMenuItem(IDM_SETTING_HISTORY_DONT_CHECK, !nppgui._checkHistoryFiles); + 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); + shortcutMapper.doDialog(_isRTL); + shortcutMapper.destroy(); + break; + } + case IDM_SETTING_FILE_AUTODETECTION_ENABLE : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._fileAutoDetection = cdEnabled; + break; + } + + case IDM_SETTING_FILE_AUTODETECTION_DISABLE : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._fileAutoDetection = cdDisabled; + break; + } + case IDM_SETTING_FILE_AUTODETECTION_ENABLESILENTLY : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._fileAutoDetection = cdAutoUpdate; + break; + } + + case IDM_SETTING_TRAYICON : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._isMinimizedToTray = !nppgui._isMinimizedToTray; + checkMenuItem(IDM_SETTING_TRAYICON, nppgui._isMinimizedToTray); + break; + } + + case IDM_SETTING_REMEMBER_LAST_SESSION : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._rememberLastSession = !nppgui._rememberLastSession; + checkMenuItem(IDM_SETTING_REMEMBER_LAST_SESSION, nppgui._rememberLastSession); + break; + } + + case IDM_SETTING_PREFERECE : + { + bool isFirstTime = !_preference.isCreated(); + _preference.doDialog(_isRTL); + + if (isFirstTime) + { + changePrefereceDlgLang(); + } + break; + } + + case IDC_DOC_GOTO_ANOTHER_VIEW: + docGotoAnotherEditView(MODE_TRANSFER); + checkSyncState(); + break; + + case IDC_DOC_CLONE_TO_ANOTHER_VIEW: + docGotoAnotherEditView(MODE_CLONE); + checkSyncState(); + break; + + case IDM_ABOUT: + { + bool isFirstTime = !_aboutDlg.isCreated(); + _aboutDlg.doDialog(); + if (isFirstTime && _nativeLang) + { + const char *lang = (_nativeLang->ToElement())->Attribute("name"); + if (lang && !strcmp(lang, "¤¤¤åÁcÅé")) + { + char *authorName = "«J¤µ§^"; + HWND hItem = ::GetDlgItem(_aboutDlg.getHSelf(), IDC_AUTHOR_NAME); + ::SetWindowText(hItem, authorName); + } + } + break; + } + + case IDM_HOMESWEETHOME : + { + ::ShellExecute(NULL, "open", "http://notepad-plus.sourceforge.net/", NULL, NULL, SW_SHOWNORMAL); + break; + } + case IDM_PROJECTPAGE : + { + ::ShellExecute(NULL, "open", "http://sourceforge.net/projects/notepad-plus/", NULL, NULL, SW_SHOWNORMAL); + break; + } + + case IDM_ONLINEHELP: + { + ::ShellExecute(NULL, "open", "http://notepad-plus.sourceforge.net/uk/generalFAQ.php", NULL, NULL, SW_SHOWNORMAL); + break; + } + + case IDM_FORUM: + { + ::ShellExecute(NULL, "open", "http://sourceforge.net/forum/?group_id=95717", NULL, NULL, SW_SHOWNORMAL); + break; + } + + case IDC_AUTOCOMPLETE : + showAutoComp(); + break; + + case IDC_AUTOCOMPLETE_CURRENTFILE : + //MessageBox(NULL, "IDC_AUTOCOMPLETE_CURRENTFILE", "", MB_OK); + autoCompFromCurrentFile(); + break; + + case IDM_LANGSTYLE_CONFIG_DLG : + { + bool isFirstTime = !_configStyleDlg.isCreated(); + _configStyleDlg.doDialog(_isRTL); + if (isFirstTime) + changeConfigLang(); + break; + } + + case IDM_LANG_C : + setLanguage(id, L_C); + break; + + case IDM_LANG_CPP : + setLanguage(id, L_CPP); + break; + + case IDM_LANG_JAVA : + setLanguage(id, L_JAVA); + break; + + case IDM_LANG_CS : + setLanguage(id, L_CS); + break; + + case IDM_LANG_HTML : + setLanguage(id, L_HTML); + break; + + case IDM_LANG_XML : + setLanguage(id, L_XML); + break; + + case IDM_LANG_JS : + setLanguage(id, L_JS); + break; + + case IDM_LANG_PHP : + setLanguage(id, L_PHP); + break; + + case IDM_LANG_ASP : + setLanguage(id, L_ASP); + break; + + case IDM_LANG_CSS : + setLanguage(id, L_CSS); + break; + + case IDM_LANG_LUA : + setLanguage(id, L_LUA); + break; + + case IDM_LANG_PERL : + setLanguage(id, L_PERL); + break; + + case IDM_LANG_PYTHON : + setLanguage(id, L_PYTHON); + break; + + case IDM_LANG_PASCAL : + setLanguage(id, L_PASCAL); + break; + + case IDM_LANG_BATCH : + setLanguage(id, L_BATCH); + break; + + case IDM_LANG_OBJC : + setLanguage(id, L_OBJC); + break; + + case IDM_LANG_VB : + setLanguage(id, L_VB); + break; + + case IDM_LANG_SQL : + setLanguage(id, L_SQL); + break; + + case IDM_LANG_ASCII : + setLanguage(id, L_NFO); + break; + + case IDM_LANG_TEXT : + setLanguage(id, L_TXT); + break; + + case IDM_LANG_RC : + setLanguage(id, L_RC); + break; + + case IDM_LANG_MAKEFILE : + setLanguage(id, L_MAKEFILE); + break; + + case IDM_LANG_INI : + setLanguage(id, L_INI); + break; + + case IDM_LANG_TEX : + setLanguage(id, L_TEX); + break; + + case IDM_LANG_FORTRAN : + setLanguage(id, L_FORTRAN); + break; + + case IDM_LANG_SH : + setLanguage(id, L_BASH); + break; + + case IDM_LANG_FLASH : + setLanguage(id, L_FLASH); + break; + + case IDM_LANG_NSIS : + setLanguage(id, L_NSIS); + break; + + case IDM_LANG_TCL : + setLanguage(id, L_TCL); + break; + + case IDM_LANG_LISP : + setLanguage(id, L_LISP); + break; + + case IDM_LANG_SCHEME : + setLanguage(id, L_SCHEME); + break; + + case IDM_LANG_ASM : + setLanguage(id, L_ASM); + break; + + case IDM_LANG_DIFF : + setLanguage(id, L_DIFF); + break; + + case IDM_LANG_PROPS : + setLanguage(id, L_PROPS); + break; + + case IDM_LANG_PS: + setLanguage(id, L_PS); + break; + + case IDM_LANG_RUBY: + setLanguage(id, L_RUBY); + break; + + case IDM_LANG_SMALLTALK: + setLanguage(id, L_SMALLTALK); + break; + case IDM_LANG_VHDL : + setLanguage(id, L_VHDL); + break; + + case IDM_LANG_KIX : + setLanguage(id, L_KIX); + break; + + case IDM_LANG_CAML : + setLanguage(id, L_CAML); + break; + + case IDM_LANG_ADA : + setLanguage(id, L_ADA); + break; + + case IDM_LANG_VERILOG : + setLanguage(id, L_VERILOG); + break; + + case IDM_LANG_MATLAB : + setLanguage(id, L_MATLAB); + break; + + case IDM_LANG_HASKELL : + setLanguage(id, L_HASKELL); + break; + + case IDM_LANG_AU3 : + setLanguage(id, L_AU3); + break; + + case IDM_LANG_INNO : + setLanguage(id, L_INNO); + break; + + case IDM_LANG_CMAKE : + setLanguage(id, L_CMAKE); + break; + + case IDM_LANG_USER : + setLanguage(id, L_USER); + break; + + case IDC_PREV_DOC : + case IDC_NEXT_DOC : + { + int nbDoc = _mainDocTab.isVisible()?_mainEditView.getNbDoc():0; + nbDoc += _subDocTab.isVisible()?_subEditView.getNbDoc():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 : + for (int i = IDM_FILEMENU_LASTONE + 1 ; i < (IDM_FILEMENU_LASTONE + _lastRecentFileList.getMaxNbLRF() + 1) ; i++) + { + char fn[MAX_PATH]; + int res = ::GetMenuString(::GetMenu(_hSelf), i, fn, sizeof(fn), MF_BYCOMMAND); + if (res) + { + doOpen(fn); + } + } + break; + + case IDM_EDIT_RTL : + case IDM_EDIT_LTR : + { + long exStyle = ::GetWindowLong(_pEditView->getHSelf(), GWL_EXSTYLE); + exStyle = (id == IDM_EDIT_RTL)?exStyle|WS_EX_LAYOUTRTL:exStyle&(~WS_EX_LAYOUTRTL); + ::SetWindowLong(_pEditView->getHSelf(), GWL_EXSTYLE, exStyle); + _pEditView->defineDocType(_pEditView->getCurrentDocType()); + _pEditView->redraw(); + } + break; + + case IDM_WINDOW_WINDOWS : + { + WindowsDlg _windowsDlg; + _windowsDlg.init(_hInst, _hSelf, _pEditView); + + TiXmlNode *dlgNode = NULL; + if (_nativeLang) + { + dlgNode = _nativeLang->FirstChild("Dialog"); + if (dlgNode) + dlgNode = searchDlgNode(dlgNode, "Window"); + } + _windowsDlg.doDialog(dlgNode); + + //changeDlgLang(_windowsDlg.getHSelf(), "Window"); + } + break; + + case IDC_KEY_HOME : + _pEditView->execute(SCI_VCHOMEWRAP); + break; + + case IDC_KEY_END : + _pEditView->execute(SCI_LINEENDWRAP); + break; + + case IDC_KEY_SELECT_2_HOME : + _pEditView->execute(SCI_VCHOMEWRAPEXTEND); + break; + + case IDC_KEY_SELECT_2_END : + _pEditView->execute(SCI_LINEENDWRAPEXTEND); + break; + + default : + if (id > IDM_FILE_EXIT && id < (IDM_FILE_EXIT + _lastRecentFileList.getMaxNbLRF() + 1)) + { + char fn[MAX_PATH]; + int res = ::GetMenuString(::GetMenu(_hSelf), id, fn, sizeof(fn), MF_BYCOMMAND); + if (res) + { + if (doOpen(fn)) + { + setLangStatus(_pEditView->getCurrentDocType()); + } + } + } + else if ((id > IDM_LANG_USER) && (id < IDM_LANG_USER_LIMIT)) + { + char langName[langNameLenMax]; + ::GetMenuString(::GetMenu(_hSelf), id, langName, sizeof(langName), MF_BYCOMMAND); + _pEditView->setCurrentDocUserType(langName); + setLangStatus(L_USER); + checkLangsMenu(id); + } + 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_MARKALL : + case IDM_SEARCH_UNMARKALL : + 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_STREAM_COMMENT: + case IDM_EDIT_TRIMTRAILING: + case IDM_EDIT_SETREADONLY : + 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 IDC_DOC_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::setTitleWith(const char *filePath) +{ + if (!filePath || !strcmp(filePath, "")) + return; + + char str2concat[MAX_PATH]; + strcat(strcpy(str2concat, _className), " - "); + strcat(str2concat, filePath); + ::SetWindowText(_hSelf, str2concat); +} + +void Notepad_plus::activateNextDoc(bool direction) +{ + int nbDoc = _pEditView->getNbDoc(); + if (!nbDoc) return; + + int curIndex = _pEditView->getCurrentDocIndex(); + curIndex += (direction == dirUp)?-1:1; + + if (curIndex >= nbDoc) + { + if (getNonCurrentDocTab()->isVisible()) + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + curIndex = 0; + } + else if (curIndex < 0) + { + if (getNonCurrentDocTab()->isVisible()) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + nbDoc = _pEditView->getNbDoc(); + } + curIndex = nbDoc - 1; + } + + char *fullPath = _pDocTab->activate(curIndex); + setTitleWith(fullPath); + checkDocState(); + + char dirPath[MAX_PATH]; + + strcpy(dirPath, fullPath); + PathRemoveFileSpec(dirPath); + setWorkingDir(dirPath); +} + + +void Notepad_plus::activateDoc(int pos) +{ + int nbDoc = _pEditView->getNbDoc(); + if (!nbDoc) return; + + if (pos == _pEditView->getCurrentDocIndex()) + { + (_pEditView->getCurrentBuffer()).increaseRecentTag(); + return; + } + + if (pos >= 0 && pos < nbDoc) + { + char *fullPath = _pDocTab->activate(pos); + setTitleWith(fullPath); + checkDocState(); + char dirPath[MAX_PATH]; + + strcpy(dirPath, fullPath); + PathRemoveFileSpec(dirPath); + setWorkingDir(dirPath); + } +} + +void Notepad_plus::updateStatusBar() +{ + char strLnCol[64]; + sprintf(strLnCol, "Ln : %d Col : %d Sel : %d",\ + (_pEditView->getCurrentLineNumber() + 1), \ + (_pEditView->getCurrentColumnNumber() + 1),\ + (_pEditView->getSelectedByteNumber())); + + _statusBar.setText(strLnCol, STATUSBAR_CUR_POS); + + char strDonLen[64]; + sprintf(strDonLen, "nb char : %d", _pEditView->getCurrentDocLen()); + _statusBar.setText(strDonLen, STATUSBAR_DOC_SIZE); + + setDisplayFormat((_pEditView->getCurrentBuffer()).getFormat()); + setUniModeText(_pEditView->getCurrentBuffer().getUnicodeMode()); + _statusBar.setText(_pEditView->execute(SCI_GETOVERTYPE) ? "OVR" : "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 = ::ChildWindowFromPoint(_hSelf, p); + if (hWin) + { + if ((_mainEditView.getHSelf() == hWin) || (_mainDocTab.getHSelf() == hWin)) + switchEditViewTo(MAIN_VIEW); + else if ((_subEditView.getHSelf() == hWin) || (_subDocTab.getHSelf() == hWin)) + switchEditViewTo(SUB_VIEW); + } + + int filesDropped = ::DragQueryFile(hdrop, 0xffffffff, NULL, 0); + for (int i = 0 ; i < filesDropped ; ++i) + { + char pathDropped[MAX_PATH]; + ::DragQueryFile(hdrop, i, pathDropped, sizeof(pathDropped)); + doOpen(pathDropped); + setLangStatus(_pEditView->getCurrentDocType()); + } + ::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() +{ + const int NB_VIEW = 2; + ScintillaEditView * pScintillaArray[NB_VIEW]; + DocTabView * pDocTabArray[NB_VIEW]; + + int currentView = getCurrentView(); + int currentIndex = _pEditView->getCurrentDocIndex(); + + // the oder (1.current view 2.non current view) is important + // to synchronize with "hideCurrentView" function + pScintillaArray[0] = _pEditView; + pScintillaArray[1] = getNonCurrentEditView(); + + pDocTabArray[0] = _pDocTab; + pDocTabArray[1] = getNonCurrentDocTab(); + + NppParameters *pNppParam = NppParameters::getInstance(); + const NppGUI & nppGUI = pNppParam->getNppGUI(); + bool autoUpdate = (nppGUI._fileAutoDetection == cdAutoUpdate); + + for (int j = 0 ; j < NB_VIEW ; j++) + { + for (int i = (pScintillaArray[j]->getNbDoc()-1) ; i >= 0 ; i--) + { + Buffer & docBuf = pScintillaArray[j]->getBufferAt(i); + docFileStaus fStatus = docBuf.checkFileState(); + pDocTabArray[j]->updateTabItem(i); + bool update = !docBuf.isDirty() && autoUpdate; + + if (fStatus == MODIFIED_FROM_OUTSIDE) + { + // If npp is minimized, bring it up to the top + if (::IsIconic(_hSelf)) + ::ShowWindow(_hSelf, SW_SHOWNORMAL); + + if (update || doReloadOrNot(docBuf.getFileName()) == IDYES) + { + pDocTabArray[j]->activate(i); + // if it's a non current view, make it as the current view + if (j == 1) + switchEditViewTo(getNonCurrentView()); + + if (pScintillaArray[j]->isCurrentBufReadOnly()) + pScintillaArray[j]->execute(SCI_SETREADONLY, FALSE); + + reload(docBuf.getFileName()); + + if (pScintillaArray[j]->isCurrentBufReadOnly()) + pScintillaArray[j]->execute(SCI_SETREADONLY, TRUE); + } + docBuf.updatTimeStamp(); + } + else if (fStatus == FILE_DELETED) + { + if (::IsIconic(_hSelf)) + ::ShowWindow(_hSelf, SW_SHOWNORMAL); + + if (doCloseOrNot(docBuf.getFileName()) == IDNO) + { + pDocTabArray[j]->activate(i); + if ((pScintillaArray[j]->getNbDoc() == 1) && (_mainWindowStatus & TWO_VIEWS_MASK)) + { + pDocTabArray[j]->closeCurrentDoc(); + hideCurrentView(); + } + else + pDocTabArray[j]->closeCurrentDoc(); + } + } + + bool isReadOnly = pScintillaArray[j]->isCurrentBufReadOnly(); + pScintillaArray[j]->execute(SCI_SETREADONLY, isReadOnly); + //_pDocTab->updateCurrentTabItem(); + } + } + + if (autoUpdate) + { + switchEditViewTo(currentView); + _pDocTab->activate(currentIndex); + } +} + +void Notepad_plus::hideCurrentView() +{ + if (_mainWindowStatus & DOCK_MASK) + { + _pMainSplitter->setWin0(getNonCurrentDocTab()); + } + else // otherwise the main window is the spltter container that we just created + _pMainWindow = getNonCurrentDocTab(); + + _subSplitter.display(false); + _pEditView->display(false); + _pDocTab->display(false); + + // resize the main window + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + //setTitleWith(_pEditView->getCurrentTitle()); + + _mainWindowStatus &= ~TWO_VIEWS_MASK; +} + +bool Notepad_plus::fileClose() +{ + // Notify plugins that current file is about to be closed + SCNotification scnN; + scnN.nmhdr.code = NPPN_FILEBEFORECLOSE; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = 0; + _pluginsManager.notify(&scnN); + + + int res; + bool isDirty = _pEditView->isCurrentDocDirty(); + + //process the fileNamePath into LRF + const char *fileNamePath = _pEditView->getCurrentTitle(); + + if ((!isDirty) && (Buffer::isUntitled(fileNamePath)) && (_pEditView->getNbDoc() == 1) && (!getNonCurrentDocTab()->isVisible())) + return true; + + if (isDirty) + { + if ((res = doSaveOrNot(_pEditView->getCurrentTitle())) == IDYES) + { + if (!fileSave()) // the cancel button of savdialog is pressed + return false; + } + else if (res == IDCANCEL) + return false; + // else IDNO we continue + } + + //si ce n'est pas untited(avec prefixe "new "), on fait le traitement + if (!Buffer::isUntitled(fileNamePath)) + { + _lastRecentFileList.add(fileNamePath); + } + + + if ((_pEditView->getNbDoc() == 1) && (_mainWindowStatus & TWO_VIEWS_MASK)) + { + _pDocTab->closeCurrentDoc(); + hideCurrentView(); + return true; + } + + char fullPath[MAX_PATH]; + strcpy(fullPath, _pDocTab->closeCurrentDoc()); + setTitleWith(fullPath); + + PathRemoveFileSpec(fullPath); + setWorkingDir(fullPath); + + updateStatusBar(); + dynamicCheckMenuAndTB(); + checkDocState(); + _linkTriggered = true; + + return true; +} + +bool Notepad_plus::fileCloseAll() +{ + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + + if (!fileClose()) + return false; + } + + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + return fileClose(); +} + +bool Notepad_plus::fileCloseAllButCurrent() +{ + int curIndex = _pEditView->getCurrentDocIndex(); + _pEditView->activateDocAt(0); + + for (int i = 0 ; i < curIndex ; i++) + if (!fileClose()) + return false; + + if (_pEditView->getNbDoc() > 1) + { + _pDocTab->activate(1); + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + } + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo(getNonCurrentView()); + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + return fileClose(); + } + return true; +} + +void Notepad_plus::reload(const char *fileName) +{ + Utf8_16_Read UnicodeConvertor; + Buffer & buffer = _pEditView->getCurrentBuffer(); + Position pos = buffer._pos; + + FILE *fp = fopen(fileName, "rb"); + if (fp) + { + // It's VERY IMPORTANT to reset the view + _pEditView->execute(SCI_CLEARALL); + + char data[blockSize]; + + size_t lenFile = fread(data, 1, sizeof(data), fp); + while (lenFile > 0) { + lenFile = UnicodeConvertor.convert(data, lenFile); + _pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast(UnicodeConvertor.getNewBuf())); + lenFile = int(fread(data, 1, sizeof(data), fp)); + } + fclose(fp); + + UniMode unicodeMode = static_cast(UnicodeConvertor.getEncoding()); + buffer.setUnicodeMode(unicodeMode); + + if (unicodeMode != uni8Bit) + // Override the code page if Unicode + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + _pEditView->getFocus(); + _pEditView->execute(SCI_SETSAVEPOINT); + _pEditView->execute(EM_EMPTYUNDOBUFFER); + _pEditView->restoreCurrentPos(pos); + } + else + { + char msg[MAX_PATH + 100]; + strcpy(msg, "Can not open file \""); + strcat(msg, fileName); + strcat(msg, "\"."); + ::MessageBox(_hSelf, msg, "ERR", MB_OK); + } +} + +void Notepad_plus::getMainClientRect(RECT &rc) const +{ + Window::getClientRect(rc); + rc.top += _toolBar.getHeight() + 2; + rc.bottom -= _toolBar.getHeight() + 2 +_statusBar.getHeight(); +} + +void Notepad_plus::getToolBarClientRect(RECT &rc) const +{ + Window::getClientRect(rc); + rc.bottom = _toolBar.getHeight(); +} + +void Notepad_plus::getStatusBarClientRect(RECT & rc) const +{ + RECT rectMain; + + getMainClientRect(rectMain); + getClientRect(rc); + rc.top = rectMain.top + rectMain.bottom; + rc.bottom = rc.bottom - rc.top; +} + +void Notepad_plus::dockUserDlg() +{ + if (!_pMainSplitter) + { + _pMainSplitter = new SplitterContainer; + _pMainSplitter->init(_hInst, _hSelf); + + Window *pWindow; + if (_mainWindowStatus & TWO_VIEWS_MASK) + pWindow = &_subSplitter; + else + pWindow = _pDocTab; + + _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45); + } + + if (_mainWindowStatus & TWO_VIEWS_MASK) + _pMainSplitter->setWin0(&_subSplitter); + else + _pMainSplitter->setWin0(_pDocTab); + + _pMainSplitter->display(); + + _mainWindowStatus |= DOCK_MASK; + _pMainWindow = _pMainSplitter; + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); +} + +void Notepad_plus::undockUserDlg() +{ + // a cause de surchargement de "display" + ::ShowWindow(_pMainSplitter->getHSelf(), SW_HIDE); + + if (_mainWindowStatus & TWO_VIEWS_MASK) + _pMainWindow = &_subSplitter; + else + _pMainWindow = _pDocTab; + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + _mainWindowStatus &= ~DOCK_MASK; + (ScintillaEditView::getUserDefineDlg())->display(); + //(_pEditView->getUserDefineDlg())->display(); +} + +void Notepad_plus::docGotoAnotherEditView(bool mode) +{ + if (!(_mainWindowStatus & TWO_VIEWS_MASK)) + { + // if there's dock dialog, it means there's also a splitter container + // we replace the right window by sub-spltter container that we just created + if (_mainWindowStatus & DOCK_MASK) + { + _pMainSplitter->setWin0(&_subSplitter); + _pMainWindow = _pMainSplitter; + } + else // otherwise the main window is the spltter container that we just created + _pMainWindow = &_subSplitter; + + // resize the main window + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + getNonCurrentEditView()->display(); + getNonCurrentDocTab()->display(); + + _pMainWindow->display(); + + // update the main window status + _mainWindowStatus |= TWO_VIEWS_MASK; + } + + // Bon, define the source view and the dest view + // source view + DocTabView *pSrcDocTab; + ScintillaEditView *pSrcEditView; + if (getCurrentView() == MAIN_VIEW) + { + // make dest view + switchEditViewTo(SUB_VIEW); + + // make source view + pSrcDocTab = &_mainDocTab; + pSrcEditView = &_mainEditView; + + } + else + { + // make dest view : _pDocTab & _pEditView + switchEditViewTo(MAIN_VIEW); + + // make source view + pSrcDocTab = &_subDocTab; + pSrcEditView = &_subEditView; + } + + // Maintenant, we begin to manipulate the source and the dest: + // 1. Save the current position of the source view to transfer + pSrcEditView->saveCurrentPos(); + + // 2. Retrieve the current buffer from the source + Buffer & buf = pSrcEditView->getCurrentBuffer(); + + // 3. See if the file to transfer exist in the dest view + // if so, we don't transfer the file(buffer) + // but activate the opened document in the dest view then beat it + int i; + if ( (i = _pDocTab->find(buf.getFileName())) != -1) + { + setTitleWith(_pDocTab->activate(i)); + _pDocTab->getFocus(); + return; + } + + // 4. Transfer the file (buffer) into the dest view + bool isNewDoc2Close = false; + + if ((_pEditView->getNbDoc() == 1) + && Buffer::isUntitled(_pEditView->getCurrentTitle()) + && (!_pEditView->isCurrentDocDirty()) && (_pEditView->getCurrentDocLen() == 0)) + { + isNewDoc2Close = true; + } + + setTitleWith(_pDocTab->newDoc(buf)); + _pDocTab->updateCurrentTabItem(NULL); + + if (isNewDoc2Close) + _pDocTab->closeDocAt(0); + + // 5. If it's the clone mode, we keep the document to transfer + // in the source view (do nothing). If it's the transfer mode + // we remove the file (buffer) from the source view + + if (mode != MODE_CLONE) + { + // Make focus to the source view + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + if (_pEditView->getNbDoc() == 1) + { + // close the current doc in the dest view + _pDocTab->closeCurrentDoc(); + hideCurrentView(); + } + else + { + // close the current doc in the dest view + _pDocTab->closeCurrentDoc(); + + // return to state where the focus is on dest view + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + } + _linkTriggered = true; +} + +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_SYMBOLE)); + if (nextLine < 0) + nextLine = int(_pEditView->execute(sci_marker, lineRetry, 1 << MARK_SYMBOLE)); + + if (nextLine < 0) + return; + + _pEditView->execute(SCI_ENSUREVISIBLEENFORCEPOLICY, nextLine); + _pEditView->execute(SCI_GOTOLINE, nextLine); +} + +int Notepad_plus::switchEditViewTo(int gid) +{ + int oldView = getCurrentView(); + _pDocTab = (gid == MAIN_VIEW)?&_mainDocTab:&_subDocTab; + _pEditView = (gid == MAIN_VIEW)?&_mainEditView:&_subEditView; + _pEditView->beSwitched(); + _pEditView->getFocus(); + + checkDocState(); + setTitleWith(_pEditView->getCurrentTitle()); + setLangStatus(_pEditView->getCurrentDocType()); + updateStatusBar(); + dynamicCheckMenuAndTB(); + return oldView; +} + +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 uni8Bit : id = IDM_FORMAT_ANSI; break; + case uniUTF8 : id = IDM_FORMAT_UTF_8; break; + case uni16BE : id = IDM_FORMAT_UCS_2BE; break; + case uni16LE : id = IDM_FORMAT_UCS_2LE; break; + } + if (id != -1) + { + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_FORMAT_ANSI, IDM_FORMAT_UCS_2LE, id, MF_BYCOMMAND); + + //if (um != uni8Bit) + checkMenuItem(IDM_FORMAT_AS_UTF_8, FALSE); + enableCommand(IDM_FORMAT_AS_UTF_8, (um == uni8Bit), MENU); + } + else + { + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_FORMAT_ANSI, IDM_FORMAT_UCS_2LE, IDM_FORMAT_ANSI, MF_BYCOMMAND); + enableCommand(IDM_FORMAT_AS_UTF_8, true, MENU); + checkMenuItem(IDM_FORMAT_AS_UTF_8, true); + } +} + +static bool isInList(string word, const vector & wordArray) +{ + for (size_t i = 0 ; i < wordArray.size() ; i++) + if (wordArray[i] == word) + return true; + return false; +}; + +void Notepad_plus::autoCompFromCurrentFile() +{ + int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS)); + int startPos = int(_pEditView->execute(SCI_WORDSTARTPOSITION, curPos, true)); + + if (curPos == startPos) + return; + + char beginChars[256]; + + _pEditView->getText(beginChars, startPos, curPos); + + string expr("\\<"); + expr += beginChars; + expr += "[^ \\t.,;:\"()=<>'+!\\[\\]]*"; + + //::MessageBox(NULL, expr.c_str(), "", MB_OK); + + int docLength = int(_pEditView->execute(SCI_GETLENGTH)); + + int flags = SCFIND_WORDSTART | SCFIND_MATCHCASE | SCFIND_REGEXP | SCFIND_POSIX; + + _pEditView->execute(SCI_SETTARGETSTART, 0); + _pEditView->execute(SCI_SETTARGETEND, docLength); + _pEditView->execute(SCI_SETSEARCHFLAGS, flags); + + vector wordArray; + + int posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str())); + + while (posFind != -1) + { + int wordStart = int(_pEditView->execute(SCI_GETTARGETSTART)); + int wordEnd = int(_pEditView->execute(SCI_GETTARGETEND)); + //int foundTextLen = wordEnd - wordStart; + char w[256]; + _pEditView->getText(w, wordStart, wordEnd); + + if (strcmp(w, beginChars)) + if (!isInList(w, wordArray)) + wordArray.push_back(w); + + _pEditView->execute(SCI_SETTARGETSTART, wordEnd/*posFind + foundTextLen*/); + _pEditView->execute(SCI_SETTARGETEND, docLength); + posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str())); + } + if (wordArray.size() == 0) return; + + if (wordArray.size() == 1) + { + _pEditView->execute(SCI_SETTARGETSTART, startPos); + _pEditView->execute(SCI_SETTARGETEND, curPos); + _pEditView->execute(SCI_REPLACETARGETRE, wordArray[0].length(), (LPARAM)wordArray[0].c_str()); + + _pEditView->execute(SCI_GOTOPOS, startPos + wordArray[0].length()); + return; + } + + sort(wordArray.begin(), wordArray.end()); + + string words(""); + + for (size_t i = 0 ; i < wordArray.size() ; i++) + { + words += wordArray[i]; + if (i != wordArray.size()-1) + words += " "; + } + + _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' ')); + _pEditView->execute(SCI_AUTOCSETIGNORECASE, 3); + _pEditView->execute(SCI_AUTOCSHOW, curPos - startPos, WPARAM(words.c_str())); + +} + +void Notepad_plus::showAutoComp() +{ + int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS)); + int line = _pEditView->getCurrentLineNumber(); + int debutLinePos = int(_pEditView->execute(SCI_POSITIONFROMLINE, line )); + int debutMotPos = curPos; + + + char c = char(_pEditView->execute(SCI_GETCHARAT, debutMotPos-1)); + while ((debutMotPos>0)&&(debutMotPos>=debutLinePos)&&((isalnum(c))||(c=='_'))) + { + debutMotPos--; + c = char(_pEditView->execute(SCI_GETCHARAT, debutMotPos-1)); + } + LangType langType = _pEditView->getCurrentDocType(); + if ((langType == L_RC) || (langType == L_HTML) || (langType == L_SQL)) + { + int typeIndex = LANG_INDEX_INSTR; + + const char *pKeywords = (NppParameters::getInstance())->getWordList(langType, typeIndex); + if (pKeywords) + { + _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' ')); + //_pEditView->execute(SCI_AUTOCSETTYPESEPARATOR, WPARAM('(')); + _pEditView->execute(SCI_AUTOCSETIGNORECASE, 3); + _pEditView->execute(SCI_AUTOCSHOW, curPos-debutMotPos, WPARAM(pKeywords)); + } + } + else + { + char nppPath[MAX_PATH]; + strcpy(nppPath, _nppPath); + PathRemoveFileSpec(nppPath); + string fullFileName = nppPath; + string fileName; + getApiFileName(langType, fileName); + fileName += ".api"; + fullFileName += "\\plugins\\APIs\\"; + fullFileName += fileName; + + FILE* f = fopen( fullFileName.c_str(), "r" ); + + if (f) + { + fseek( f, 0, SEEK_END ); + size_t sz = ftell( f ); + fseek( f, 0, SEEK_SET ); + char* pData = new char[sz+1]; + size_t nbChar = fread(pData, 1, sz, f); + pData[nbChar] = '\0'; + fclose( f ); + + _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM('\n')); + //_pEditView->execute(SCI_AUTOCSETTYPESEPARATOR, WPARAM('(')); + _pEditView->execute(SCI_AUTOCSETIGNORECASE, 3); + _pEditView->execute(SCI_AUTOCSHOW, curPos-debutMotPos, WPARAM(pData)); + delete[] pData; + } + } +} + +void Notepad_plus::changeMenuLang(string & pluginsTrans, string & windowTrans) +{ + if (!_nativeLang) return; + + HMENU hMenu = ::GetMenu(_hSelf); + TiXmlNode *mainMenu = _nativeLang->FirstChild("Menu"); + if (!mainMenu) return; + + mainMenu = mainMenu->FirstChild("Main"); + if (!mainMenu) return; + + TiXmlNode *entriesRoot = mainMenu->FirstChild("Entries"); + if (!entriesRoot) return; + + const char *idName = NULL; + for (TiXmlNode *childNode = entriesRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int id; + if (element->Attribute("id", &id)) + { + const char *name = element->Attribute("name"); + ::ModifyMenu(hMenu, id, MF_BYPOSITION, 0, name); + } + else if (idName = element->Attribute("idName")) + { + const char *name = element->Attribute("name"); + if (!strcmp(idName, "Plugins")) + { + pluginsTrans = name; + } + else if (!strcmp(idName, "Window")) + { + windowTrans = name; + } + } + } + + TiXmlNode *menuCommandsRoot = mainMenu->FirstChild("Commands"); + + for (TiXmlNode *childNode = menuCommandsRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int id; + element->Attribute("id", &id); + const char *name = element->Attribute("name"); + ::ModifyMenu(hMenu, id, MF_BYCOMMAND, id, name); + } + + TiXmlNode *subEntriesRoot = mainMenu->FirstChild("SubEntries"); + + for (TiXmlNode *childNode = subEntriesRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int x, y; + element->Attribute("posX", &x); + element->Attribute("posY", &y); + const char *name = element->Attribute("name"); + ::ModifyMenu(::GetSubMenu(hMenu, x), y, MF_BYPOSITION, 0, name); + } + ::DrawMenuBar(_hSelf); +} +/* +const char * Notepad_plus::getNativeTip(int btnID) +{ + if (!_nativeLang) return NULL; + + TiXmlNode *tips = _nativeLang->FirstChild("Tips"); + if (!tips) return NULL; + + for (TiXmlNode *childNode = tips->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int id; + element->Attribute("id", &id); + if (id == btnID) + return element->Attribute("name"); + } + return NULL; +} +*/ + +void Notepad_plus::changeConfigLang() +{ + if (!_nativeLang) return; + + TiXmlNode *styleConfDlgNode = _nativeLang->FirstChild("Dialog"); + if (!styleConfDlgNode) return; + + styleConfDlgNode = styleConfDlgNode->FirstChild("StyleConfig"); + if (!styleConfDlgNode) return; + + HWND hDlg = _configStyleDlg.getHSelf(); + // Set Title + const char *titre = (styleConfDlgNode->ToElement())->Attribute("title"); + if ((titre && titre[0]) && hDlg) + ::SetWindowText(hDlg, titre); + + for (TiXmlNode *childNode = styleConfDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } + hDlg = _configStyleDlg.getHSelf(); + styleConfDlgNode = styleConfDlgNode->FirstChild("SubDialog"); + + for (TiXmlNode *childNode = styleConfDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } +} + +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) + ::SetWindowText(hItem, translatedText[i]); + } + } +} + +void Notepad_plus::changeUserDefineLang() +{ + if (!_nativeLang) return; + + TiXmlNode *userDefineDlgNode = _nativeLang->FirstChild("Dialog"); + if (!userDefineDlgNode) return; + + userDefineDlgNode = userDefineDlgNode->FirstChild("UserDefine"); + if (!userDefineDlgNode) return; + + UserDefineDialog *userDefineDlg = _pEditView->getUserDefineDlg(); + + HWND hDlg = userDefineDlg->getHSelf(); + // Set Title + const char *titre = (userDefineDlgNode->ToElement())->Attribute("title"); + if (titre && titre[0]) + ::SetWindowText(hDlg, titre); + + // pour ses propres controls + const int nbControl = 9; + const char *translatedText[nbControl]; + for (int i = 0 ; i < nbControl ; i++) + translatedText[i] = NULL; + + for (TiXmlNode *childNode = userDefineDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + 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"}; + + //int **idArrays[nbDlg] = {(int **)folderID, (int **)keywordsID, (int **)commentID, (int **)operatorID}; + + 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; + } + } + TiXmlNode *node = userDefineDlgNode->FirstChild(nodeNameArray[i]); + + if (node) + { + // Set Title + titre = (node->ToElement())->Attribute("title"); + if (titre &&titre[0]) + userDefineDlg->setTabName(i, titre); + + for (TiXmlNode *childNode = node->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } + } + } +} + +void Notepad_plus::changePrefereceDlgLang() +{ + changeDlgLang(_preference.getHSelf(), "Preference"); + + char title[64]; + + changeDlgLang(_preference._barsDlg.getHSelf(), "Global", title); + if (*title) + _preference._ctrlTab.renameTab("Global", title); + + changeDlgLang(_preference._marginsDlg.getHSelf(), "Scintillas", title); + if (*title) + _preference._ctrlTab.renameTab("Scintillas", title); + + changeDlgLang(_preference._defaultNewDocDlg.getHSelf(), "NewDoc", title); + if (*title) + _preference._ctrlTab.renameTab("NewDoc", title); + + changeDlgLang(_preference._fileAssocDlg.getHSelf(), "FileAssoc", title); + if (*title) + _preference._ctrlTab.renameTab("FileAssoc", title); + + changeDlgLang(_preference._langMenuDlg.getHSelf(), "LangMenu", title); + if (*title) + _preference._ctrlTab.renameTab("LangMenu", title); + + changeDlgLang(_preference._printSettingsDlg.getHSelf(), "Print1", title); + if (*title) + _preference._ctrlTab.renameTab("Print1", title); + + changeDlgLang(_preference._printSettings2Dlg.getHSelf(), "Print2", title); + if (*title) + _preference._ctrlTab.renameTab("Print2", title); + + changeDlgLang(_preference._settingsDlg.getHSelf(), "MISC", title); + if (*title) + _preference._ctrlTab.renameTab("MISC", title); + +} + +TiXmlNode * searchDlgNode(TiXmlNode *node, const char *dlgTagName) +{ + TiXmlNode *dlgNode = node->FirstChild(dlgTagName); + if (dlgNode) return dlgNode; + for (TiXmlNode *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 (!_nativeLang) return false; + + TiXmlNode *dlgNode = _nativeLang->FirstChild("Dialog"); + if (!dlgNode) return false; + + dlgNode = searchDlgNode(dlgNode, dlgTagName); + if (!dlgNode) return false; + + // Set Title + const char *titre = (dlgNode->ToElement())->Attribute("title"); + if ((titre && titre[0]) && hDlg) + { + ::SetWindowText(hDlg, titre); + if (title) + strcpy(title, titre); + } + + // Set the text of child control + for (TiXmlNode *childNode = dlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } + return true; +} + +static string extractSymbol(char prefix, const char *str2extract) +{ + bool found = false; + char extracted[128] = ""; + + for (size_t i = 0, j = 0 ; i < strlen(str2extract) ; i++) + { + if (found) + { + if (!str2extract[i] || str2extract[i] == ' ') + { + extracted[j] = '\0'; + return string(extracted); + } + extracted[j++] = str2extract[i]; + + } + else + { + if (!str2extract[i]) + return ""; + + if (str2extract[i] == prefix) + found = true; + } + } + return string(extracted); +}; + +bool Notepad_plus::doBlockComment() +{ + const char *commentLineSybol; + string symbol; + + Buffer & buf = _pEditView->getCurrentBuffer(); + if (buf._lang == L_USER) + { + UserLangContainer & userLangContainer = NppParameters::getInstance()->getULCFromName(buf._userLangExt); + //::MessageBox(NULL, userLangContainer._keywordLists[4], "User", MB_OK); + symbol = extractSymbol('0', userLangContainer._keywordLists[4]); + commentLineSybol = symbol.c_str(); + } + else + commentLineSybol = buf.getCommentLineSymbol(); + + + if ((!commentLineSybol) || (!commentLineSybol[0])) + return false; + + string comment(commentLineSybol); + comment += " "; + string long_comment = comment; + + char linebuf[1000]; + 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) >= static_cast(sizeof(linebuf))) // Avoid buffer size problems + continue; + /*if (props.GetInt(comment_at_line_start.c_str())) { + GetRange(wEditor, lineIndent, lineEnd, linebuf); + } else*/ + { + lineIndent = _pEditView->execute(SCI_GETLINEINDENTPOSITION, i); + _pEditView->getText(linebuf, lineIndent, lineEnd); + } + // empty lines are not commented + if (strlen(linebuf) < 1) + continue; + if (memcmp(linebuf, comment.c_str(), comment_length - 1) == 0) + { + if (memcmp(linebuf, long_comment.c_str(), comment_length) == 0) + { + // removing comment with space after it + _pEditView->execute(SCI_SETSEL, lineIndent, lineIndent + comment_length); + _pEditView->execute(SCI_REPLACESEL, 0, (WPARAM)""); + if (i == selStartLine) // is this the first selected line? + selectionStart -= comment_length; + selectionEnd -= comment_length; // every iteration + continue; + } + else + { + // removing comment _without_ space + _pEditView->execute(SCI_SETSEL, lineIndent, lineIndent + comment_length - 1); + _pEditView->execute(SCI_REPLACESEL, 0, (WPARAM)""); + if (i == selStartLine) // is this the first selected line? + selectionStart -= (comment_length - 1); + selectionEnd -= (comment_length - 1); // every iteration + continue; + } + } + if (i == selStartLine) // is this the first selected line? + selectionStart += comment_length; + selectionEnd += comment_length; // every iteration + _pEditView->execute(SCI_INSERTTEXT, lineIndent, (WPARAM)long_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 char *commentStart; + const char *commentEnd; + + string symbolStart; + string symbolEnd; + + Buffer & buf = _pEditView->getCurrentBuffer(); + if (buf._lang == L_USER) + { + UserLangContainer & userLangContainer = NppParameters::getInstance()->getULCFromName(buf._userLangExt); + symbolStart = extractSymbol('1', userLangContainer._keywordLists[4]); + commentStart = symbolStart.c_str(); + symbolEnd = extractSymbol('2', userLangContainer._keywordLists[4]); + commentEnd = symbolEnd.c_str(); + } + else + { + commentStart = _pEditView->getCurrentBuffer().getCommentStart(); + commentEnd = _pEditView->getCurrentBuffer().getCommentEnd(); + } + + if ((!commentStart) || (!commentStart[0])) + return false; + if ((!commentEnd) || (!commentEnd[0])) + return false; + + string start_comment(commentStart); + string end_comment(commentEnd); + string white_space(" "); + + 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); + + char linebuf[1000]; + _pEditView->getText(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->execute(SCI_INSERTTEXT, selectionStart, (WPARAM)start_comment.c_str()); + selectionEnd += start_comment_length; + selectionStart += start_comment_length; + _pEditView->execute(SCI_INSERTTEXT, selectionEnd, (WPARAM)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::addCurrentMacro() +{ + vector & theMacros = (NppParameters::getInstance())->getMacroList(); + + MacroShortcut ms(_macro); + ms.init(_hInst, _hSelf); + if (ms.doDialog() != -1) + { + theMacros.push_back(ms); + HMENU hMacroMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_MACRO); + int const posBase = 3; + int nbMacro = theMacros.size(); + if (nbMacro == 1) + ::InsertMenu(hMacroMenu, posBase + 1, MF_BYPOSITION, (unsigned int)-1, 0); + //char menuString[64]; + //sprintf(menuString, "%s%s%s", ms._name, "\t", ms.toString().c_str()); + ::InsertMenu(hMacroMenu, posBase + 1 + nbMacro, MF_BYPOSITION, ID_MACRO + nbMacro - 1, ms.toMenuItemString().c_str()); + _isMacrosScModified = true; + _accelerator.uptdateShortcuts(); + 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(const char *fileName) +{ + if (!fileName) return false; + int i = - 1; + int iView; + + if ((i = _mainDocTab.find(fileName)) != -1) + { + iView = MAIN_VIEW; + } + else if ((i = _subDocTab.find(fileName)) != -1) + { + iView = SUB_VIEW; + } + + if (i != -1) + { + switchEditViewTo(iView); + setTitleWith(_pDocTab->activate(i)); + _pEditView->getFocus(); + return true; + } + return false; +} + +ToolBarButtonUnit toolBarIcons[] = { + //{IDM_FILE_NEW, IDI_NEW_OFF_ICON, IDI_NEW_ON_ICON, IDI_NEW_OFF_ICON, STD_FILENEW}, + {IDM_FILE_NEW, IDI_NEW_OFF_ICON, IDI_NEW_ON_ICON, IDI_NEW_OFF_ICON, -1}, + //{IDM_FILE_OPEN, IDI_OPEN_OFF_ICON, IDI_OPEN_ON_ICON, IDI_NEW_OFF_ICON, STD_FILEOPEN}, + {IDM_FILE_OPEN, IDI_OPEN_OFF_ICON, IDI_OPEN_ON_ICON, IDI_NEW_OFF_ICON, -1}, + //{IDM_FILE_SAVE, IDI_SAVE_OFF_ICON, IDI_SAVE_ON_ICON, IDI_SAVE_DISABLE_ICON, STD_FILESAVE}, + {IDM_FILE_SAVE, IDI_SAVE_OFF_ICON, IDI_SAVE_ON_ICON, IDI_SAVE_DISABLE_ICON, -1}, + {IDM_FILE_SAVEALL, IDI_SAVEALL_OFF_ICON, IDI_SAVEALL_ON_ICON, IDI_SAVEALL_DISABLE_ICON, -1}, + {IDM_FILE_CLOSE, IDI_CLOSE_OFF_ICON, IDI_CLOSE_ON_ICON, IDI_CLOSE_OFF_ICON, -1}, + {IDM_FILE_CLOSEALL, IDI_CLOSEALL_OFF_ICON, IDI_CLOSEALL_ON_ICON, IDI_CLOSEALL_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, STD_CUT}, + //{IDM_EDIT_COPY, IDI_COPY_OFF_ICON, IDI_COPY_ON_ICON, IDI_COPY_DISABLE_ICON, STD_COPY}, + //{IDM_EDIT_PASTE, IDI_PASTE_OFF_ICON, IDI_PASTE_ON_ICON, IDI_PASTE_DISABLE_ICON, STD_PASTE}, + {IDM_EDIT_CUT, IDI_CUT_OFF_ICON, IDI_CUT_ON_ICON, IDI_CUT_DISABLE_ICON, -1}, + {IDM_EDIT_COPY, IDI_COPY_OFF_ICON, IDI_COPY_ON_ICON, IDI_COPY_DISABLE_ICON, -1}, + {IDM_EDIT_PASTE, IDI_PASTE_OFF_ICON, IDI_PASTE_ON_ICON, IDI_PASTE_DISABLE_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, STD_UNDO}, + //{IDM_EDIT_REDO, IDI_REDO_OFF_ICON, IDI_REDO_ON_ICON, IDI_REDO_DISABLE_ICON, STD_REDOW}, + {IDM_EDIT_UNDO, IDI_UNDO_OFF_ICON, IDI_UNDO_ON_ICON, IDI_UNDO_DISABLE_ICON, -1}, + {IDM_EDIT_REDO, IDI_REDO_OFF_ICON, IDI_REDO_ON_ICON, IDI_REDO_DISABLE_ICON, -1}, + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_SEARCH_REPLACE, IDI_REPLACE_OFF_ICON, IDI_REPLACE_ON_ICON, IDI_REPLACE_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_VIEW_ZOOMOUT, IDI_ZOOMOUT_OFF_ICON, IDI_ZOOMOUT_ON_ICON, IDI_ZOOMOUT_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_VIEW_SYNSCROLLH, IDI_SYNCH_OFF_ICON, IDI_SYNCH_ON_ICON, IDI_SYNCH_DISABLE_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_VIEW_ALL_CHARACTERS, IDI_VIEW_ALL_CHAR_OFF_ICON, IDI_VIEW_ALL_CHAR_ON_ICON, IDI_VIEW_ALL_CHAR_OFF_ICON, -1}, + {IDM_VIEW_INDENT_GUIDE, IDI_VIEW_INDENT_OFF_ICON, IDI_VIEW_INDENT_ON_ICON, IDI_VIEW_INDENT_OFF_ICON, -1}, + {IDM_VIEW_USER_DLG, IDI_VIEW_UD_DLG_OFF_ICON, IDI_VIEW_UD_DLG_ON_ICON, IDI_VIEW_UD_DLG_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + + {IDM_EDIT_STARTRECORDINGMACRO, IDI_STARTRECORD_OFF_ICON, IDI_STARTRECORD_ON_ICON, IDI_STARTRECORD_DISABLE_ICON, -1}, + {IDM_EDIT_STOPRECORDINGMACRO, IDI_STOPRECORD_OFF_ICON, IDI_STOPRECORD_ON_ICON, IDI_STOPRECORD_DISABLE_ICON, -1}, + {IDM_EDIT_PLAYBACKRECORDEDMACRO, IDI_PLAYRECORD_OFF_ICON, IDI_PLAYRECORD_ON_ICON, IDI_PLAYRECORD_DISABLE_ICON, -1}, + {IDM_EDIT_RUNMULTIMACRODLG, IDI_MMPLAY_OFF_ICON, IDI_MMPLAY_ON_ICON, IDI_MMPLAY_DIS_ICON, -1}, + {IDM_EDIT_SAVECURRENTMACRO, IDI_SAVERECORD_OFF_ICON, IDI_SAVERECORD_ON_ICON, IDI_SAVERECORD_DISABLE_ICON, -1}, + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + + //{IDC_BUTTON_PRINT, IDI_PRINT_OFF_ICON, IDI_PRINT_ON_ICON, IDI_PRINT_OFF_ICON, STD_PRINT} + {IDC_BUTTON_PRINT, IDI_PRINT_OFF_ICON, IDI_PRINT_ON_ICON, IDI_PRINT_OFF_ICON, -1} +}; + +int stdIcons[] = {IDR_FILENEW, IDR_FILEOPEN, IDR_FILESAVE, IDR_SAVEALL, IDR_CLOSEFILE, IDR_CLOSEALL, IDR_CUT, IDR_COPY, IDR_PASTE,\ +IDR_UNDO, IDR_REDO, IDR_FIND, IDR_REPLACE, IDR_ZOOMIN, IDR_ZOOMOUT, IDR_SYNCV, IDR_SYNCH,\ +IDR_WRAP, IDR_INVISIBLECHAR, IDR_INDENTGUIDE, IDR_SHOWPANNEL, IDR_STARTRECORD, IDR_STOPRECORD, IDR_PLAYRECORD, IDR_M_PLAYRECORD, IDR_SAVERECORD, IDR_PRINT}; + +void Notepad_plus::getTaskListInfo(TaskListInfo *tli) +{ + int iView = getCurrentView(); + ScintillaEditView & currentView = (iView == MAIN_VIEW)?_mainEditView:_subEditView; + ScintillaEditView & nonCurrentView = (iView == MAIN_VIEW)?_subEditView:_mainEditView; + int nonCurrentiView = (iView == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW; + + size_t currentNbDoc = currentView.getNbDoc(); + size_t nonCurrentNbDoc; + + tli->_currentIndex = 0; + + if (iView == MAIN_VIEW) + { + nonCurrentNbDoc = _subDocTab.isVisible()?_subEditView.getNbDoc():0; + } + else + { + nonCurrentNbDoc = _mainDocTab.isVisible()?_mainEditView.getNbDoc():0; + } + + for (size_t i = 0 ; i < currentNbDoc ; i++) + { + Buffer & b = currentView.getBufferAt(i); + int status = b.isReadOnly()?tb_ro:(b.isDirty()?tb_unsaved:tb_saved); + tli->_tlfsLst.push_back(TaskLstFnStatus(iView,i,b._fullPathName, status)); + } + for (size_t i = 0 ; i < nonCurrentNbDoc ; i++) + { + Buffer & b = nonCurrentView.getBufferAt(i); + int status = b.isReadOnly()?tb_ro:(b.isDirty()?tb_unsaved:tb_saved); + tli->_tlfsLst.push_back(TaskLstFnStatus(nonCurrentiView,i,b._fullPathName, 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: + { + pNppParam->setFontList(hwnd); + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); +/* + OSVERSIONINFO vInfo; + vInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + ::GetVersionEx(&vInfo); + if (vInfo.dwMajorVersion == 4) + nppGUI._doTaskList = false; + else if ((vInfo.dwMajorVersion == 5) && (vInfo.dwMinorVersion == 0)) + nppGUI._doTaskList = false; +*/ + // Menu + string pluginsTrans, windowTrans; + changeMenuLang(pluginsTrans, windowTrans); + + _windowsMenu.init(_hInst, GetMenu(_hSelf), windowTrans.c_str()); + + + vector & shortcuts = pNppParam->getUserShortcuts(); + for (size_t i = 0 ; i < shortcuts.size() ; i++) + { + changeMenuShortcut(shortcuts[i].getID(), shortcuts[i].toString().c_str()); + } + ::DrawMenuBar(_hSelf); + + + _pDocTab = &_mainDocTab; + _pEditView = &_mainEditView; + + const ScintillaViewParams & svp1 = pNppParam->getSVP(SCIV_PRIMARY); + const ScintillaViewParams & svp2 = pNppParam->getSVP(SCIV_SECOND); + + _mainEditView.init(_hInst, hwnd); + _subEditView.init(_hInst, hwnd); + + _mainEditView.display(); + + _invisibleEditView.init(_hInst, hwnd); + _invisibleEditView.execute(SCI_SETUNDOCOLLECTION); + _invisibleEditView.execute(SCI_EMPTYUNDOBUFFER); + _invisibleEditView.attatchDefaultDoc(0); + + // 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.showIndentGuideLine(svp1._indentGuideLineShow); + _subEditView.showIndentGuideLine(svp2._indentGuideLineShow); + + _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.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); + + checkMenuItem(IDM_SETTING_HISTORY_DONT_CHECK, !nppGUI._checkHistoryFiles); + checkMenuItem(IDM_SETTING_TRAYICON, nppGUI._isMinimizedToTray); + checkMenuItem(IDM_SETTING_REMEMBER_LAST_SESSION, nppGUI._rememberLastSession); + + _mainEditView.performGlobalStyles(); + _subEditView.performGlobalStyles(); + + if (pNppParam->hasCustomContextMenu()) + { + _mainEditView.execute(SCI_USEPOPUP, FALSE); + _subEditView.execute(SCI_USEPOPUP, FALSE); + } + + _zoomOriginalValue = _pEditView->execute(SCI_GETZOOM); + _mainEditView.execute(SCI_SETZOOM, svp1._zoom); + _subEditView.execute(SCI_SETZOOM, svp2._zoom); + + int tabBarStatus = nppGUI._tabStatus; + _toReduceTabBar = ((tabBarStatus & TAB_REDUCE) != 0); + _docTabIconList.create(_toReduceTabBar?13:20, _hInst, docTabIconIDs, sizeof(docTabIconIDs)/sizeof(int)); + + _subDocTab.init(_hInst, hwnd, &_subEditView, &_docTabIconList); + + const char * str = _mainDocTab.init(_hInst, hwnd, &_mainEditView, &_docTabIconList); + setTitleWith(str); + + 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); + + //--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, 100); + _statusBar.setPartWidth(STATUSBAR_CUR_POS, 180); + _statusBar.setPartWidth(STATUSBAR_EOF_FORMAT, 80); + _statusBar.setPartWidth(STATUSBAR_UNICODE_TYPE, 100); + _statusBar.setPartWidth(STATUSBAR_TYPING_MODE, 30); + _statusBar.display(willBeShown); + // + checkMenuItem(IDM_VIEW_STATUSBAR, willBeShown); + + _findReplaceDlg.init(_hInst, hwnd, &_pEditView); + _incrementFindDlg.init(_hInst, hwnd, &_findReplaceDlg); + _goToLineDlg.init(_hInst, hwnd, &_pEditView); + _colEditorDlg.init(_hInst, hwnd, &_pEditView); + _aboutDlg.init(_hInst, hwnd); + _runDlg.init(_hInst, hwnd); + _runMacroDlg.init(_hInst, hwnd); + + checkMenuItem(IDM_SETTING_TAB_REPLCESPACE, nppGUI._tabReplacedBySpace); + + _pMainWindow = &_mainDocTab; + + _dockingManager.init(_hInst, hwnd, &_pMainWindow); + + + + //--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); + + dynamicCheckMenuAndTB(); + _mainEditView.defineDocType(L_TXT); + HMENU hMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_FILE); + + int nbLRFile = pNppParam->getNbLRFile(); + + int pos = 16; + _lastRecentFileList.initMenu(hMenu, IDM_FILEMENU_LASTONE + 1, pos); + + for (int i = 0 ; i < nbLRFile ; i++) + { + string * stdStr = pNppParam->getLRFile(i); + if (nppGUI._checkHistoryFiles) + { + if (PathFileExists(stdStr->c_str())) + { + _lastRecentFileList.add(stdStr->c_str()); + } + } + else + { + _lastRecentFileList.add(stdStr->c_str()); + } + } + + if (nppGUI._isMinimizedToTray) + _pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)), ""); + + checkSyncState(); + + + //Languages Menu + hMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_LANGUAGE); + if (nppGUI._excludedLangList.size() > 0) + { + for (size_t i = 0 ; i < nppGUI._excludedLangList.size() ; i++) + { + int cmdID = pNppParam->langTypeToCommandID(nppGUI._excludedLangList[i]._langType); + char itemName[256]; + ::GetMenuString(hMenu, cmdID, itemName, sizeof(itemName), MF_BYCOMMAND); + nppGUI._excludedLangList[i]._cmdID = cmdID; + nppGUI._excludedLangList[i]._langName = itemName; + ::DeleteMenu(hMenu, cmdID, MF_BYCOMMAND); + DrawMenuBar(_hSelf); + } + } + + // Add User Define Languages Entry + pos = ::GetMenuItemCount(hMenu) - 1; + + for (int i = 0 ; i < pNppParam->getNbUserLang() ; i++) + { + UserLangContainer & userLangContainer = pNppParam->getULCFromIndex(i); + ::InsertMenu(hMenu, pos + i , MF_BYPOSITION, IDM_LANG_USER + i + 1, userLangContainer.getName()); + } + + // Macro Menu + std::vector & macros = pNppParam->getMacroList(); + HMENU hMacroMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_MACRO); + size_t const posBase = 4; + 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 + 2, MF_BYPOSITION, ID_MACRO + i, macros[i].toMenuItemString().c_str()); + } + // Run Menu + std::vector & userCommands = pNppParam->getUserCommandList(); + HMENU hRunMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_RUN); + int const runPosBase = 1; + 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 + 2, MF_BYPOSITION, ID_USER_CMD + i, userCommands[i].toMenuItemString().c_str()); + } + + _scintillaCtrls4Plugins.init(_hInst, hwnd); + + // Plugin Manager + NppData nppData; + nppData._nppHandle = _hSelf; + nppData._scintillaMainHandle = _mainEditView.getHSelf(); + nppData._scintillaSecondHandle = _subEditView.getHSelf(); + + _pluginsManager.init(nppData); + _pluginsManager.loadPlugins(); + const char *appDataNpp = pNppParam->getAppDataNppDir(); + if (appDataNpp[0]) + _pluginsManager.loadPlugins(appDataNpp); + + _pluginsManager.setMenu(::GetMenu(_hSelf), pluginsTrans.c_str()); + + // 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); + + // Shortcut Accelerator : should be the last one since it will cacpture all the shortcut + _accelerator.init(::LoadAccelerators(_hInst, MAKEINTRESOURCE(IDR_NPP_ACCELERATORS))); + + if (_accelerator.uptdateShortcuts(hwnd)) + _isCmdScModified = true; + + pNppParam->setAccelerator(&_accelerator); + + //-- Tool Bar Section --// + toolBarStatusType tbStatus = nppGUI._toolBarStatus; + + // TB_LARGE par default + int iconSize = 32; + int menuID = IDM_VIEW_TOOLBAR_ENLARGE; + + if (tbStatus == TB_HIDE) + { + willBeShown = false; + menuID = IDM_VIEW_TOOLBAR_HIDE; + } + else if (tbStatus == TB_SMALL) + { + iconSize = 16; + menuID = IDM_VIEW_TOOLBAR_REDUCE; + } + else if (tbStatus == TB_STANDARD) + { + iconSize = 16; + menuID = IDM_VIEW_TOOLBAR_STANDARD; + } + + _toolBar.init(_hInst, hwnd, iconSize, toolBarIcons, sizeof(toolBarIcons)/sizeof(ToolBarButtonUnit), (tbStatus == TB_STANDARD), stdIcons, sizeof(stdIcons)/sizeof(int)); + _toolBar.display(willBeShown); + checkToolBarMenu(menuID); + changeToolBarIcons(); + + _rebar.init(_hInst, hwnd, &_toolBar); + _rebar.display(tbStatus != TB_HIDE); + + //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); + } + ::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: + { + char name[256]; + strcpy(name, (char *)lParam); + _mainEditView.removeUserLang(name); + _subEditView.removeUserLang(name); + return TRUE; + } + + case WM_RENAME_USERLANG: + { + char oldName[256]; + char newName[256]; + strcpy(oldName, (char *)lParam); + strcpy(newName, (char *)wParam); + _mainEditView.renameUserLang(oldName, newName); + _subEditView.renameUserLang(oldName, 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_FINDINFILES : + { + bool isRecursive = lParam == TRUE; + findInFiles(isRecursive); + return TRUE; + } + + case NPPM_LAUNCHFINDINFILESDLG : + { + const int strSize = 64; + char str[strSize]; + + bool isFirstTime = !_findReplaceDlg.isCreated(); + _findReplaceDlg.doDialog(FIND_DLG, _isRTL); + //if () + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + _pEditView->expandWordSelection(); + + _pEditView->getSelectedText(str, strSize); + _findReplaceDlg.setSearchText(str); + if (isFirstTime) + changeDlgLang(_findReplaceDlg.getHSelf(), "Find"); + _findReplaceDlg.launchFindInFilesDlg(); + + const char *dir = NULL; + char currentDir[MAX_PATH]; + + if (wParam) + dir = (const char *)wParam; + else + { + ::GetCurrentDirectory(MAX_PATH, currentDir); + dir = currentDir; + } + if (lParam) + { + const char *filtre = (const char *)lParam; + _findReplaceDlg.setFindInFilesDirFilter(dir, filtre); + } + else + { + LangType lt = _pEditView->getCurrentDocType(); + + const char *ext = NppParameters::getInstance()->getLangExtFromLangType(lt); + if (ext && ext[0]) + { + string filtres = ""; + vector vStr; + cutString(ext, vStr); + for (size_t i = 0 ; i < vStr.size() ; i++) + { + filtres += "*."; + filtres += vStr[i] + " "; + } + //::SetDlgItemText(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filtres.c_str()); + _findReplaceDlg.setFindInFilesDirFilter(currentDir, filtres.c_str()); + } + else + _findReplaceDlg.setFindInFilesDirFilter(currentDir, "*.*"); + } + return TRUE; + } + + case WM_DOOPEN: + { + doOpen((const char *)lParam); + } + break; + + case NPPM_RELOADFILE: + { + doReload((const char *)lParam, wParam != 0); + } + break; + + case NPPM_SWITCHTOFILE : + { + return switchToFile((const char *)lParam); + } + + case NPPM_SAVECURRENTFILE: + { + return fileSave(); + } + break; + + case NPPM_SAVEALLFILES: + { + return fileSaveAll(); + } + break; + + case WM_GETMINMAXINFO: + { + MINMAXINFO *pmmi = reinterpret_cast(lParam); + + if (_isfullScreen) + { + pmmi->ptMaxSize.x = ::GetSystemMetrics(SM_CXSCREEN) + 2 * ::GetSystemMetrics(SM_CXSIZEFRAME) + 2; + pmmi->ptMaxSize.y = ::GetSystemMetrics(SM_CYSCREEN) + + ::GetSystemMetrics(SM_CYCAPTION) + + ::GetSystemMetrics(SM_CYMENU) + + 2 * ::GetSystemMetrics(SM_CYSIZEFRAME) + + _toolBar.getHeight() + 2 + + 13; + + pmmi->ptMaxTrackSize.x = pmmi->ptMaxSize.x; + pmmi->ptMaxTrackSize.y = pmmi->ptMaxSize.y; + result = 0; // Je sais, c'est bizarre, mais selons le doc... + } + else + { + result = ::DefWindowProc(_hSelf, Message, wParam, lParam); + } + } + break; + + case WM_SIZE: + { + RECT rc; + getToolBarClientRect(rc); + _toolBar.reSizeTo(rc); + + ::SetWindowPos(_rebar.getHSelf(), NULL, 0, 0, LOWORD(lParam), rc.bottom - rc.top, SWP_NOZORDER); + + getStatusBarClientRect(rc); + _statusBar.reSizeTo(rc); + + getMainClientRect(rc); + //_pMainWindow->reSizeTo(rc); + _dockingManager.reSizeTo(rc); + + mkPosIncFindDlg(); + result = TRUE; + } + break; + + case WM_MOVE: + { + redraw(); + mkPosIncFindDlg(); + result = TRUE; + } + break; + + case WM_MOVING: + { + result = FALSE; + } + break; + + case WM_SIZING: + { + result = FALSE; + } + break; + + case WM_COPYDATA : + { + const DWORD LASTBYTEMASK = 0x000000FF; + COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT *)lParam; + LangType lt = LangType(pCopyData->dwData & LASTBYTEMASK); + int ln = pCopyData->dwData >> 8; +//::MessageBox(NULL, (const char *)pCopyData->lpData, "WM_COPYDATA", MB_OK); + FileNameStringSplitter fnss((const char *)pCopyData->lpData); + char *pFn = NULL; + for (int i = 0 ; i < fnss.size() ; i++) + { + pFn = (char *)fnss.getFileName(i); + doOpen((const char *)pFn); + if (lt != L_TXT) + _pEditView->setCurrentDocType(lt); + _pEditView->execute(SCI_GOTOLINE, ln-1); + } + setLangStatus(_pEditView->getCurrentDocType()); + return TRUE; + } + + case WM_COMMAND: + if (HIWORD(wParam) == SCEN_SETFOCUS) + { + switchEditViewTo((lParam == (LPARAM)_mainEditView.getHSelf())?MAIN_VIEW:SUB_VIEW); + } + else + { + if ((lParam == 1) || (lParam == 2)) + { + specialCmd(LOWORD(wParam), lParam); + } + else + command(LOWORD(wParam)); + } + return TRUE; + + case NPPM_GETFULLCURRENTPATH : + case NPPM_GETCURRENTDIRECTORY : + case NPPM_GETFILENAME : + case NPPM_GETNAMEPART : + case NPPM_GETEXTPART : + { + char str[MAX_PATH]; + // par defaut : NPPM_GETCURRENTDIRECTORY + char *fileStr = strcpy(str, _pEditView->getCurrentTitle()); + + 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); + + strcpy((char *)lParam, fileStr); + return TRUE; + } + + case NPPM_GETCURRENTWORD : + { + const int strSize = MAX_PATH; + char str[strSize]; + + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + _pEditView->expandWordSelection(); + + _pEditView->getSelectedText(str, strSize, true); + strcpy((char *)lParam, str); + return TRUE; + } + + case NPPM_GETNPPDIRECTORY : + { + const int strSize = MAX_PATH; + char str[strSize]; + + ::GetModuleFileName(NULL, str, strSize); + PathRemoveFileSpec(str); + strcpy((char *)lParam, str); + return TRUE; + } + + case NPPM_GETCURRENTSCINTILLA : + { + *((int *)lParam) = (_pEditView == &_mainEditView)?0:1; + return TRUE; + } + + case NPPM_GETCURRENTLANGTYPE : + { + *((LangType *)lParam) = _pEditView->getCurrentDocType(); + return TRUE; + } + + case NPPM_SETCURRENTLANGTYPE : + { + _pEditView->setCurrentDocType((LangType)lParam); + return TRUE; + } + + case NPPM_GETNBOPENFILES : + { + int nbDocPrimary = _mainEditView.getNbDoc(); + int nbDocSecond = _subEditView.getNbDoc(); + 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 : + { + if (!wParam) return 0; + + char **fileNames = (char **)wParam; + size_t nbFileNames = lParam; + size_t i = 0; + + for ( ; i < nbFileNames ; i++) + { + strcpy(fileNames[i], _mainEditView.getBufferAt(i).getFileName()); + } + return i; + } + + case NPPM_GETOPENFILENAMESSECOND : + { + if (!wParam) return 0; + + char **fileNames = (char **)wParam; + size_t nbFileNames = lParam; + size_t i = 0; + + for ( ; i < nbFileNames ; i++) + { + strcpy(fileNames[i], _subEditView.getBufferAt(i).getFileName()); + } + return i; + } + + case NPPM_GETOPENFILENAMES : + { + if (!wParam) return 0; + + char **fileNames = (char **)wParam; + int nbFileNames = lParam; + + int j = 0; + for (size_t i = 0 ; i < _mainEditView.getNbDoc() && j < nbFileNames ; i++) + { + strcpy(fileNames[j++], _mainEditView.getBufferAt(i).getFileName()); + } + for (size_t i = 0 ; i < _subEditView.getNbDoc() && j < nbFileNames ; i++) + { + strcpy(fileNames[j++], _subEditView.getBufferAt(i).getFileName()); + } + 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(_mainEditView,_subEditView)); + } + else + { + for(int idx = 0; idx < (int)tli->_tlfsLst.size(); ++idx) + { + if(tli->_tlfsLst[idx]._iView == getCurrentView() && + tli->_tlfsLst[idx]._docIndex == getCurrentEditView()->getCurrentDocIndex()) + { + 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 NPPM_GETNBSESSIONFILES : + { + const char *sessionFileName = (const char *)lParam; + if ((!sessionFileName) || (sessionFileName[0] == '\0')) return 0; + Session session2Load; + if (pNppParam->loadSession(session2Load, sessionFileName)) + { + return session2Load._files.size(); + } + return 0; + } + + case NPPM_GETSESSIONFILES : + { + const char *sessionFileName = (const char *)lParam; + char **sessionFileArray = (char **)wParam; + + if ((!sessionFileName) || (sessionFileName[0] == '\0')) return FALSE; + + Session session2Load; + if (pNppParam->loadSession(session2Load, sessionFileName)) + { + for (size_t i = 0 ; i < session2Load._files.size() ; ) + { + const char *pFn = session2Load._files[i]._fileName.c_str(); + // + // To add : position + // + strcpy(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, 0, 0); + pSci->execute(SCI_ADDTEXT, length, (LPARAM)UnicodeConvertor.getNewBuf()); + pSci->execute(SCI_EMPTYUNDOBUFFER, 0, 0); + + pSci->execute(SCI_SETCODEPAGE, 0, 0); + + /* set cursor position */ + pSci->execute(SCI_GOTOPOS, 0, 0); + + /* 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 = (char*)new char[length]; + pSci->execute(SCI_GETTEXT, length, (LPARAM)buffer); + + length = UnicodeConvertor.convert(buffer, length-1); + + /* set text in target */ + pSci->execute(SCI_CLEARALL, 0, 0); + pSci->execute(SCI_ADDTEXT, length, (LPARAM)UnicodeConvertor.getNewBuf()); + + pSci->execute(SCI_EMPTYUNDOBUFFER, 0, 0); + + /* set cursor position */ + pSci->execute(SCI_GOTOPOS, 0, 0); + + /* clean buffer */ + delete [] buffer; + + /* set new encoding if BOM was changed by other programms */ + UniMode um = UnicodeConvertor.getEncoding(); + (pSci->getCurrentBuffer()).setUnicodeMode(um); + checkUnicodeMenuItems(um); + + // Override the code page if Unicode + if (um != uni8Bit) + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + return um; + } + + case NPPM_ACTIVATEDOC : + { + int whichView = ((wParam != MAIN_VIEW) && (wParam != SUB_VIEW))?getCurrentView():wParam; + int index = lParam; + + switchEditViewTo(whichView); + activateDoc(index); + + return TRUE; + } + + 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(); + + 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 + { + if ( currLine == _pEditView->getCurrentLineNumber() ) // line no. not changed? + break; // exit + + // save current line + currLine = _pEditView->getCurrentLineNumber(); + + // eof? + if ((currLine >= lastLine) || (currLine <= 0)) + 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 (!_subDocTab.isVisible()) + return -1; + return _subEditView.getCurrentDocIndex(); + } + else //MAIN_VIEW + { + if (!_mainDocTab.isVisible()) + return -1; + return _mainEditView.getCurrentDocIndex(); + } + } + + case NPPM_SETSTATUSBAR : + { + char *str2set = (char *)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 char *)lParam); + return TRUE; + } + + case NPPM_SAVECURRENTSESSION : + { + return (LRESULT)fileSaveSession(0, NULL, (const char *)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 : + { + _isCmdScModified = true; + changeMenuShortcut(lParam, (const char *)wParam); + ::DrawMenuBar(_hSelf); + return TRUE; + } + + case NPPM_INTERNAL_MACROLIST_MODIFIED : + { + _isMacrosScModified = true; + return TRUE; + } + + case NPPM_INTERNAL_USERCMDLIST_MODIFIED : + { + _isUserCmdScModified = true; + return TRUE; + } + + case NPPM_INTERNAL_SCINTILLAKEYMODIFIED : + { + _isScintillaKeyModified = true; + return TRUE; + } + + case NPPM_INTERNAL_PLUGINCMDLIST_MODIFIED : + { + _isPluginCmdScModified = true; + return TRUE; + } + + // 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())) + { + POINT p; + ::GetCursorPos(&p); + ContextMenu scintillaContextmenu; + vector tmp = pNppParam->getContextMenuItems(); + vector isEnable; + for (size_t i = 0 ; i < tmp.size() ; i++) + { + if (tmp[i]._itemName == "") + getNameStrFromCmd(tmp[i]._cmdID, tmp[i]._itemName); + isEnable.push_back((::GetMenuState(::GetMenu(_hSelf), 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 WM_CHECKTORENEW : + //printStr("bourges ton cul !!!"); + //checkModifiedDocument(); + //return TRUE; + + case WM_ACTIVATEAPP : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + if (LOWORD(wParam) && (nppgui._fileAutoDetection != cdDisabled)) + { + checkModifiedDocument(); + return FALSE; + } + //return ::DefWindowProc(hwnd, Message, wParam, lParam); + break; + } + + + case WM_ACTIVATE : + _pEditView->getFocus(); + return TRUE; + + case WM_DROPFILES: + { + dropFiles(reinterpret_cast(wParam)); + return TRUE; + } + + case WM_UPDATESCINTILLAS: + { + _mainEditView.defineDocType(_mainEditView.getCurrentDocType()); + _subEditView.defineDocType(_subEditView.getCurrentDocType()); + _mainEditView.performGlobalStyles(); + _subEditView.performGlobalStyles(); + return TRUE; + } + + //case WM_ENDSESSION: + case WM_QUERYENDSESSION: + case WM_CLOSE: + { + if (_isfullScreen) + fullScreenToggle(); + + const NppGUI & nppgui = pNppParam->getNppGUI(); + + Session currentSession; + if (nppgui._rememberLastSession) + getCurrentOpenedFiles(currentSession); + + if (fileCloseAll()) + { + _lastRecentFileList.saveLRFL(); + + saveScintillaParams(SCIV_PRIMARY); + saveScintillaParams(SCIV_SECOND); + saveGUIParams(); + saveUserDefineLangs(); + saveShortcuts(); + if (nppgui._rememberLastSession) + saveSession(currentSession); + + ::DestroyWindow(hwnd); + } + return TRUE; + } + + case WM_DESTROY: + { + killAllChildren(); + ::PostQuitMessage(0); + 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)), ""); + + _pTrayIco->doTrayIcon(ADD); + ::ShowWindow(hwnd, SW_HIDE); + return 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 WM_INITMENU: + _windowsMenu.initMenu((HMENU)wParam, _pEditView); + return TRUE; +*/ + case WM_INITMENUPOPUP: + _windowsMenu.initPopupMenu((HMENU)wParam, _pEditView); + return TRUE; +/* + case WM_UNINITMENUPOPUP: + _windowsMenu.uninitPopupMenu((HMENU)wParam, _pEditView); + 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((char*)lParam, SW_SHOW); + return TRUE; + } + + case NPPM_DMMGETPLUGINHWNDBYNAME : //(const char *windowName, const char *moduleName) + { + if (!lParam) return NULL; + + char *moduleName = (char *)lParam; + char *windowName = (char *)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 (stricmp(moduleName, tbData[j]->pszModuleName) == 0) + { + if (!windowName) + return (LRESULT)tbData[j]->hClient; + else if (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(::GetMenu(_hSelf), (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->setCurrentDocState(true); + return TRUE; + } + + case NPPM_GETENABLETHEMETEXTUREFUNC : + { + return (LRESULT)pNppParam->getEnableThemeDlgTexture(); + } + + case NPPM_GETPLUGINSCONFIGDIR : + { + if (!lParam || !wParam) + return FALSE; + + const char *pluginsConfigDirPrefix = pNppParam->getAppDataNppDir(); + + if (!pluginsConfigDirPrefix[0]) + pluginsConfigDirPrefix = pNppParam->getNppPath(); + + const char *secondPart = "plugins\\Config"; + + size_t len = (size_t)wParam; + if (len < strlen(pluginsConfigDirPrefix) + strlen(secondPart)) + return FALSE; + + char *pluginsConfigDir = (char *)lParam; + strcpy(pluginsConfigDir, pluginsConfigDirPrefix); + + ::PathAppend(pluginsConfigDir, secondPart); + return TRUE; + } + + 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: + { + int origPos = _pEditView->getCurrentDocIndex(); + for (int i=0, n=nmdlg->nItems; iItems[i]); + fileSave(); + } + activateDoc(origPos); + nmdlg->processed = TRUE; + } + break; + case WDT_CLOSE: + { + for (int i=0, n=nmdlg->nItems; iItems[i]; + activateDoc(pos); + if (!fileClose()) + break; + for (int j=i+1; jItems[j] > pos) + --nmdlg->Items[j]; + nmdlg->Items[i] = 0xFFFFFFFF; // indicate file was closed + } + nmdlg->processed = TRUE; + } + break; + case WDT_SORT: + _pEditView->arrangeBuffers(nmdlg->nItems, nmdlg->Items); + nmdlg->processed = TRUE; + for (int i = _pEditView->getNbDoc()-1 ; i >= 0 ; --i) + { + Buffer & docBuf = _pEditView->getBufferAt(i); + _pDocTab->updateTabItem(i, PathFindFileName(docBuf.getFileName())); + } + activateDoc(nmdlg->curSel); + 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_GETMINMAXINFO : // It's the 1st? msg (even before WM_NCCREATE) + { + if (isFirstGetMinMaxInfoMsg) + { + isFirstGetMinMaxInfoMsg = false; + return ::DefWindowProc(hwnd, Message, wParam, lParam); + } + else + return ((Notepad_plus *)::GetWindowLong(hwnd, GWL_USERDATA))->runProc(hwnd, Message, wParam, lParam); + } + + 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; + ::SetWindowLong(hwnd, GWL_USERDATA, (LONG)pM30ide); + + return TRUE; + } + + default : + { + return ((Notepad_plus *)::GetWindowLong(hwnd, GWL_USERDATA))->runProc(hwnd, Message, wParam, lParam); + } + } +} + +void Notepad_plus::fullScreenToggle() +{ + HWND wTaskBar = FindWindow("Shell_TrayWnd", ""); + _isfullScreen = !_isfullScreen; + if (_isfullScreen) + { + ::SystemParametersInfo(SPI_GETWORKAREA, 0, &_rcWorkArea, 0); + ::SystemParametersInfo(SPI_SETWORKAREA, 0, 0, SPIF_SENDCHANGE); + ::ShowWindow(wTaskBar, SW_HIDE); + + _winPlace.length = sizeof(_winPlace); + ::GetWindowPlacement(_hSelf, &_winPlace); + + int topStuff = ::GetSystemMetrics(SM_CYMENU) + ::GetSystemMetrics(SM_CYEDGE); + topStuff += ::GetSystemMetrics(SM_CYCAPTION); + topStuff += _toolBar.getHeight() + 2; + + ::SetWindowPos(_hSelf, HWND_TOP, + -::GetSystemMetrics(SM_CXSIZEFRAME) - 1, + -topStuff - 2, + ::GetSystemMetrics(SM_CXSCREEN) + 2 * ::GetSystemMetrics(SM_CXSIZEFRAME) + 2, + ::GetSystemMetrics(SM_CYSCREEN) + topStuff + ::GetSystemMetrics(SM_CYSIZEFRAME) + 3, + 0); + } + else + { + ::ShowWindow(wTaskBar, SW_SHOW); + if (_winPlace.length) + { + ::SystemParametersInfo(SPI_SETWORKAREA, 0, &_rcWorkArea, 0); + if (_winPlace.showCmd == SW_SHOWMAXIMIZED) + { + ::ShowWindow(_hSelf, SW_RESTORE); + ::ShowWindow(_hSelf, SW_SHOWMAXIMIZED); + } + else + { + ::SetWindowPlacement(_hSelf, &_winPlace); + } + } + } + ::SetForegroundWindow(_hSelf); +} + + +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 (!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::changeMenuShortcut(unsigned long cmdID, const char *shortcutStr) +{ + char cmdName[64]; + HMENU hMenu = ::GetMenu(_hSelf); + ::GetMenuString(hMenu, cmdID, cmdName, sizeof(cmdName), MF_BYCOMMAND); + + size_t i = 0; + for ( ; i < strlen(cmdName) ; i++) + { + if (cmdName[i] == '\t') + break; + } + cmdName[++i] = '\0'; + string itemStr = cmdName; + itemStr += shortcutStr; + ::ModifyMenu(hMenu, cmdID, MF_BYCOMMAND, cmdID, itemStr.c_str()); +} + +void Notepad_plus::getCurrentOpenedFiles(Session & session) +{ + _pEditView->saveCurrentPos(); + session._actifIndex = _mainEditView.getCurrentDocIndex(); + + int currentDocIndex = _mainEditView.getCurrentDocIndex(); + + for (size_t i = 0 ; i < _mainEditView.getNbDoc() ; i++) + { + const Buffer & buf = _mainEditView.getBufferAt((size_t)i); + if (PathFileExists(buf._fullPathName)) + { + sessionFileInfo sfi(buf._fullPathName, buf._pos); + + _mainEditView.activateDocAt(i); + int maxLine = _mainEditView.execute(SCI_GETLINECOUNT); + for (int j = 0 ; j < maxLine ; j++) + { + if ((_mainEditView.execute(SCI_MARKERGET, j)&(1 << MARK_SYMBOLE)) != 0) + { + sfi.marks.push_back(j); + } + } + + session._files.push_back(sfi); + } + } + _mainEditView.activateDocAt(currentDocIndex); + + currentDocIndex = _subEditView.getCurrentDocIndex(); + for (size_t i = 0 ; i < _subEditView.getNbDoc() ; i++) + { + const Buffer & buf = _subEditView.getBufferAt((size_t)i); + if (PathFileExists(buf._fullPathName)) + { + sessionFileInfo sfi(buf._fullPathName, buf._pos); + + _subEditView.activateDocAt(i); + int maxLine = _subEditView.execute(SCI_GETLINECOUNT); + for (int j = 0 ; j < maxLine ; j++) + { + if ((_subEditView.execute(SCI_MARKERGET, j)&(1 << MARK_SYMBOLE)) != 0) + { + sfi.marks.push_back(j); + } + } + session._files.push_back(sfi); + } + } + _subEditView.activateDocAt(currentDocIndex); +} + +void Notepad_plus::fileLoadSession(const char *fn) +{ + const char *sessionFileName = NULL; + if (fn == NULL) + { + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + fDlg.setExtFilter("Session file", ".session", NULL); + sessionFileName = fDlg.doOpenSingleFileDlg(); + } + else + { + if (PathFileExists(fn)) + sessionFileName = fn; + } + bool shouldBeResaved = false; + if (sessionFileName) + { + bool shouldBeResaved = false; + Session session2Load; + if ((NppParameters::getInstance())->loadSession(session2Load, sessionFileName)) + { + ScintillaEditView *cureentEditView = getCurrentEditView(); + + for (size_t i = 0 ; i < session2Load._files.size() ; ) + { + const char *pFn = session2Load._files[i]._fileName.c_str(); + if (doOpen(pFn)) + { + cureentEditView->getCurrentBuffer().setPosition(session2Load._files[i]); + cureentEditView->restoreCurrentPos(session2Load._files[i]); + + for (size_t j = 0 ; j < session2Load._files[i].marks.size() ; j++) + { + bookmarkAdd(session2Load._files[i].marks[j]); + } + + i++; + } + else + { + vector::iterator posIt = session2Load._files.begin() + i; + session2Load._files.erase(posIt); + shouldBeResaved = true; + } + } + + if (session2Load._actifIndex < session2Load._files.size()) + _pDocTab->activate(session2Load._actifIndex); + } + if (shouldBeResaved) + (NppParameters::getInstance())->writeSession(session2Load, sessionFileName); + } +} + +const char * Notepad_plus::fileSaveSession(size_t nbFile, char ** fileNames, const char *sessionFile2save) +{ + if (sessionFile2save) + { + Session currentSession; + if ((nbFile) && (!fileNames)) + { + for (size_t i = 0 ; i < nbFile ; i++) + { + if (PathFileExists(fileNames[i])) + currentSession._files.push_back(string(fileNames[i])); + } + } + else + getCurrentOpenedFiles(currentSession); + + (NppParameters::getInstance())->writeSession(currentSession, sessionFile2save); + return sessionFile2save; + } + return NULL; +} + +const char * Notepad_plus::fileSaveSession(size_t nbFile, char ** fileNames) +{ + const char *sessionFileName = NULL; + + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + fDlg.setExtFilter("Session file", ".session", NULL); + sessionFileName = fDlg.doSaveDlg(); + + return fileSaveSession(nbFile, fileNames, sessionFileName); +} + + +bool Notepad_plus::str2Cliboard(const char *str2cpy) +{ + if (!str2cpy) + return false; + + if (!::OpenClipboard(_hSelf)) + return false; + + ::EmptyClipboard(); + + HGLOBAL hglbCopy = ::GlobalAlloc(GMEM_MOVEABLE, strlen(str2cpy) + 1); + + if (hglbCopy == NULL) + { + ::CloseClipboard(); + return false; + } + + // Lock the handle and copy the text to the buffer. + char *pStr = (char *)::GlobalLock(hglbCopy); + strcpy(pStr, str2cpy); + ::GlobalUnlock(hglbCopy); + + // Place the handle on the clipboard. + ::SetClipboardData(CF_TEXT, hglbCopy); + ::CloseClipboard(); + return true; +} + + +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; +} + diff --git a/PowerEditor/src/Notepad_plus.cpp.bak b/PowerEditor/src/Notepad_plus.cpp.bak new file mode 100644 index 00000000..80832b7e --- /dev/null +++ b/PowerEditor/src/Notepad_plus.cpp.bak @@ -0,0 +1,7188 @@ +//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 + +#include +#include "Notepad_plus.h" +#include "SysMsg.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 + +const char Notepad_plus::_className[32] = NOTEPAD_PP_CLASS_NAME; +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}; + +struct SortTaskListPred +{ + ScintillaEditView *_views[2]; + + SortTaskListPred(ScintillaEditView &p, ScintillaEditView &s) + { + _views[MAIN_VIEW] = &p; + _views[SUB_VIEW] = &s; + } + + bool operator()(const TaskLstFnStatus &l, const TaskLstFnStatus &r) const { + return _views[l._iView]->getBufferAt(l._docIndex).getRecentTag() > _views[r._iView]->getBufferAt(r._docIndex).getRecentTag(); + } +}; + +Notepad_plus::Notepad_plus(): Window(), _mainWindowStatus(0), _pDocTab(NULL), _pEditView(NULL), + _pMainSplitter(NULL), _isfullScreen(false), + _recordingMacro(false), _pTrayIco(NULL), _isUDDocked(false),\ + _isCmdScModified(false), _isMacrosScModified(false), _isUserCmdScModified(false),\ + _isScintillaKeyModified(false), _isPluginCmdScModified(false), _isRTL(false), \ + _linkTriggered(true), _isDocModifing(false), _isHotspotDblClicked(false) +{ + TiXmlDocument *nativeLangDocRoot = (NppParameters::getInstance())->getNativeLang(); + if (nativeLangDocRoot) + { + _nativeLang = nativeLangDocRoot->FirstChild("NotepadPlus"); + if (_nativeLang) + { + _nativeLang = _nativeLang->FirstChild("Native-Langue"); + if (_nativeLang) + { + TiXmlElement *element = _nativeLang->ToElement(); + const char *rtl = element->Attribute("RTL"); + if (rtl) + _isRTL = (strcmp(rtl, "yes") == 0); + } + } + } + else + _nativeLang = NULL; + + TiXmlDocument *toolIconsDocRoot = (NppParameters::getInstance())->getToolIcons(); + if (toolIconsDocRoot) + { + _toolIcons = toolIconsDocRoot->FirstChild("NotepadPlus"); + if (_toolIcons) + { + if ((_toolIcons = _toolIcons->FirstChild("ToolBarIcons"))) + { + if ((_toolIcons = _toolIcons->FirstChild("Theme"))) + { + const char *themeDir = (_toolIcons->ToElement())->Attribute("pathPrefix"); + + for (TiXmlNode *childNode = _toolIcons->FirstChildElement("Icon"); + childNode ; + childNode = childNode->NextSibling("Icon") ) + { + int iIcon; + const char *res = (childNode->ToElement())->Attribute("id", &iIcon); + if (res) + { + TiXmlNode *grandChildNode = childNode->FirstChildElement("normal"); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + string locator = themeDir?themeDir:""; + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(0, iIcon, locator)); + } + } + + grandChildNode = childNode->FirstChildElement("hover"); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + string locator = themeDir?themeDir:""; + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(1, iIcon, locator)); + } + } + + grandChildNode = childNode->FirstChildElement("disabled"); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + string locator = themeDir?themeDir:""; + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(2, iIcon, locator)); + } + } + } + } + } + } + } + } + else + _toolIcons = NULL; +} + + +void Notepad_plus::init(HINSTANCE hInst, HWND parent, const char *cmdLine) +{ + Window::init(hInst, parent); + + _winVersion = getWindowsVersion(); + + WNDCLASS nppClass; + + nppClass.style = CS_BYTEALIGNWINDOW | CS_DBLCLKS;//CS_HREDRAW | CS_VREDRAW; + nppClass.lpfnWndProc = Notepad_plus_Proc; + nppClass.cbClsExtra = 0; + nppClass.cbWndExtra = 0; + nppClass.hInstance = _hInst; + nppClass.hIcon = ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)); + nppClass.hCursor = NULL; + nppClass.hbrBackground = ::CreateSolidBrush(::GetSysColor(COLOR_MENU)); + nppClass.lpszMenuName = MAKEINTRESOURCE(IDR_M30_MENU); + nppClass.lpszClassName = _className; + + if (!::RegisterClass(&nppClass)) + { + systemMessage("System Err"); + throw int(98); + } + + RECT workAreaRect; + ::SystemParametersInfo(SPI_GETWORKAREA,0,&workAreaRect,0); + + const NppGUI & nppGUI = (NppParameters::getInstance())->getNppGUI(); + + _hSelf = ::CreateWindowEx( + WS_EX_ACCEPTFILES | (_isRTL?WS_EX_LAYOUTRTL:0),\ + _className,\ + "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("System Err"); + throw int(777); + } + + // the routine ShowWindow should be called here immediately + // Otherwise (if we call it after opening the files) the Scintilla + // View contained the opened document will shift down one line. + ::MoveWindow(_hSelf, nppGUI._appPos.left + workAreaRect.left, nppGUI._appPos.top + workAreaRect.top, nppGUI._appPos.right, nppGUI._appPos.bottom, TRUE); + //::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); + + if (nppGUI._rememberLastSession) + { + Session lastSession = (NppParameters::getInstance())->getSession(); + ScintillaEditView *cureentEditView = getCurrentEditView(); + for (size_t i = 0 ; i < lastSession._files.size() ; ) + { + const char *pFn = lastSession._files[i]._fileName.c_str(); + if (PathFileExists(pFn)) + { + doOpen(pFn); + cureentEditView->getCurrentBuffer().setPosition(lastSession._files[i]); + cureentEditView->restoreCurrentPos(lastSession._files[i]); + + for (size_t j = 0 ; j < lastSession._files[i].marks.size() ; j++) + bookmarkAdd(lastSession._files[i].marks[j]); + + i++; + } + else + { + vector::iterator posIt = lastSession._files.begin() + i; + lastSession._files.erase(posIt); + } + } + + if (lastSession._actifIndex < lastSession._files.size()) + _mainDocTab.activate(lastSession._actifIndex); + } + + if (cmdLine) + { + LangType lt = (NppParameters::getInstance())->getDefLang(); + int ln = (NppParameters::getInstance())->getLineNumber2go(); + + if (PathFileExists(cmdLine)) + { + doOpen(cmdLine); + + if (lt != L_TXT) + _pEditView->setCurrentDocType(lt); + if (ln > 0) + _pEditView->execute(SCI_GOTOLINE, ln-1); + } + else + { + FileNameStringSplitter fnss(cmdLine); + char *pFn = NULL; + + for (int i = 0 ; i < fnss.size() ; i++) + { + pFn = (char *)fnss.getFileName(i); + doOpen((const char *)pFn); + + if (lt != L_TXT) + _pEditView->setCurrentDocType(lt); + if (ln > 0) + _pEditView->execute(SCI_GOTOLINE, ln-1); + } + } + // restore the doc type to L_TXT + (NppParameters::getInstance())->setDefLang(L_TXT); + + } + + ::GetModuleFileName(NULL, _nppPath, MAX_PATH); + + setTitleWith(_pEditView->getCurrentTitle()); + + setLangStatus(_pEditView->getCurrentDocType()); + checkDocState(); + + // Notify plugins that Notepad++ is ready + SCNotification scnN; + scnN.nmhdr.code = NPPN_READY; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = 0; + _pluginsManager.notify(&scnN); + + ::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); +} + +bool Notepad_plus::doSimpleOpen(const char *fileName) +{ + Utf8_16_Read UnicodeConvertor; + + FILE *fp = fopen(fileName, "rb"); + + if (fp) + { + _pEditView->execute(SCI_CLEARALL, 0); + _pEditView->setCurrentTitle(fileName); + + char data[blockSize]; + + size_t lenFile = fread(data, 1, sizeof(data), fp); + bool isNotEmpty = (lenFile != 0); + + while (lenFile > 0) + { + lenFile = UnicodeConvertor.convert(data, lenFile); + _pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast(UnicodeConvertor.getNewBuf())); + lenFile = int(fread(data, 1, sizeof(data), fp)); + } + fclose(fp); + + UniMode unicodeMode = static_cast(UnicodeConvertor.getEncoding()); + (_pEditView->getCurrentBuffer()).setUnicodeMode(unicodeMode); + + if (unicodeMode != uni8Bit) + // Override the code page if Unicode + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + // Then replace the caret to the begining + _pEditView->execute(SCI_GOTOPOS, 0); + return true; + } + else + { + char msg[MAX_PATH + 100]; + strcpy(msg, "Can not open file \""); + strcat(msg, fileName); + strcat(msg, "\"."); + ::MessageBox(_hSelf, msg, "Open File error", MB_OK); + return false; + } +} + + +bool Notepad_plus::doOpen(const char *fileName, bool isReadOnly) +{ + char longFileName[MAX_PATH]; + ::GetFullPathName(fileName, MAX_PATH, longFileName, NULL); + + if (switchToFile(longFileName)) + { + if (_pTrayIco) + { + if (_pTrayIco->isInTray()) + { + ::ShowWindow(_hSelf, SW_SHOW); + _pTrayIco->doTrayIcon(REMOVE); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + } + } + return false; + } + + if (!PathFileExists(longFileName)) + { + char str2display[128]; + sprintf(str2display, "%s doesn't exist. Create it?", longFileName); + + if (::MessageBox(_hSelf, str2display, "Create new file", MB_YESNO) == IDYES) + { + FILE *f = fopen(longFileName, "w"); + fclose(f); + } + else + { + _lastRecentFileList.remove(longFileName); + return false; + } + } + + + Utf8_16_Read UnicodeConvertor; + + bool isNewDoc2Close = false; + FILE *fp = fopen(longFileName, "rb"); + + if (fp) + { + if ((_pEditView->getNbDoc() == 1) + && Buffer::isUntitled(_pEditView->getCurrentTitle()) + && (!_pEditView->isCurrentDocDirty()) && (_pEditView->getCurrentDocLen() == 0)) + { + isNewDoc2Close = true; + } + setTitleWith(_pDocTab->newDoc(longFileName)); + + // It's VERY IMPORTANT to reset the view + _pEditView->execute(SCI_CLEARALL); + + char data[blockSize]; + size_t lenFile = fread(data, 1, sizeof(data), fp); + bool isNotEmpty = (lenFile != 0); + + while (lenFile > 0) + { + lenFile = UnicodeConvertor.convert(data, lenFile); + _pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast(UnicodeConvertor.getNewBuf())); + lenFile = int(fread(data, 1, sizeof(data), fp)); + } + fclose(fp); + + // 3 formats : WIN_FORMAT, UNIX_FORMAT and MAC_FORMAT + (_pEditView->getCurrentBuffer()).determinateFormat(isNotEmpty?UnicodeConvertor.getNewBuf():(char *)("")); + _pEditView->execute(SCI_SETEOLMODE, _pEditView->getCurrentBuffer().getFormat()); + + UniMode unicodeMode = static_cast(UnicodeConvertor.getEncoding()); + (_pEditView->getCurrentBuffer()).setUnicodeMode(unicodeMode); + + if (unicodeMode != uni8Bit) + // Override the code page if Unicode + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + if (isReadOnly) + (_pEditView->getCurrentBuffer()).setReadOnly(true); + + _pEditView->getFocus(); + _pEditView->execute(SCI_SETSAVEPOINT); + _pEditView->execute(EM_EMPTYUNDOBUFFER); + + // if file is read only, we set the view read only + _pEditView->execute(SCI_SETREADONLY, _pEditView->isCurrentBufReadOnly()); + if (isNewDoc2Close) + _pDocTab->closeDocAt(0); + + int numLines = int(_pEditView->execute(SCI_GETLINECOUNT)); + + char numLineStr[32]; + itoa(numLines, numLineStr, 10); + int nbDigit = strlen(numLineStr); + + if (_pEditView->increaseMaxNbDigit(nbDigit)) + _pEditView->setLineNumberWidth(_pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER)); + + int maxLen = 0; + int maxPixel = 0; + int pixel = int(_pEditView->execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P")); + + for( int i = 0 ; i < numLines ; i++ ) + { + int len = _pEditView->getLineLength(i); + if (maxLen < len) + { + maxLen = len; + maxPixel = pixel * maxLen; + } + } + + int currentWidth = int(_pEditView->execute(SCI_GETSCROLLWIDTH)); + if (currentWidth < maxPixel) + _pEditView->execute(SCI_SETSCROLLWIDTH, maxPixel); + + // Then replace the caret to the begining + _pEditView->execute(SCI_GOTOPOS, 0); + dynamicCheckMenuAndTB(); + _lastRecentFileList.remove(longFileName); + if (_pTrayIco) + { + if (_pTrayIco->isInTray()) + { + ::ShowWindow(_hSelf, SW_SHOW); + _pTrayIco->doTrayIcon(REMOVE); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + } + } + PathRemoveFileSpec(longFileName); + _linkTriggered = true; + _isDocModifing = false; + setWorkingDir(longFileName); + return true; + } + else + { + char msg[MAX_PATH + 100]; + strcpy(msg, "Can not open file \""); + //strcat(msg, fullPath); + strcat(msg, longFileName); + strcat(msg, "\"."); + ::MessageBox(_hSelf, msg, "ERR", MB_OK); + _lastRecentFileList.remove(longFileName); + return false; + } +} + +void Notepad_plus::fileOpen() +{ + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + fDlg.setExtFilter("c/c++ src file", ".c", ".cpp", ".cxx", ".cc", ".h", NULL); + fDlg.setExtFilter("Window Resource File", ".rc", NULL); + + fDlg.setExtFilter("Java src file", ".java", NULL); + fDlg.setExtFilter("HTML file", ".html", ".htm", NULL); + fDlg.setExtFilter("XML file", ".xml", NULL); + fDlg.setExtFilter("Makefile", "makefile", "GNUmakefile", ".makefile", NULL); + fDlg.setExtFilter("php file", ".php", ".php3", ".phtml", NULL); + fDlg.setExtFilter("asp file", ".asp", NULL); + fDlg.setExtFilter("ini file", ".ini", NULL); + fDlg.setExtFilter("nfo file", ".nfo", NULL); + fDlg.setExtFilter("VB/VBS file", ".vb", ".vbs", NULL); + fDlg.setExtFilter("SQL file", ".sql", NULL); + fDlg.setExtFilter("Objective C file", ".m", ".h", NULL); + if (stringVector *pfns = fDlg.doOpenMultiFilesDlg()) + { + int sz = int(pfns->size()); + for (int i = 0 ; i < sz ; i++) + doOpen((pfns->at(i)).c_str(), fDlg.isReadOnly()); + + setLangStatus(_pEditView->getCurrentDocType()); + } +} + + + +bool Notepad_plus::doReload(const char *fileName, bool alert) +{ + char longFileName[MAX_PATH] =""; + ::GetFullPathName(fileName, MAX_PATH, longFileName, NULL); + + if (switchToFile(longFileName)) + { + if (alert) + { + if (::MessageBox(_hSelf, "Do you want to reload the current file?", "Reload", MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL) == IDYES) + reload(longFileName); + } + else + reload(longFileName); + + return true; + } + return false; +} + +bool Notepad_plus::doSave(const char *filename, UniMode mode) +{ + bool isHidden = false; + bool isSys = false; + DWORD attrib; + + if (PathFileExists(filename)) + { + attrib = ::GetFileAttributes(filename); + + 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); + + } + } + + if (mode == uniCookie) + mode = uni8Bit; + + Utf8_16_Write UnicodeConvertor; + if (_pEditView->execute(SCI_GETCODEPAGE) != 0) + UnicodeConvertor.setEncoding(static_cast(mode)); + + FILE *fp = UnicodeConvertor.fopen(filename, "wb"); + + if (fp) + { + char data[blockSize + 1]; + int lengthDoc = _pEditView->getCurrentDocLen(); + for (int i = 0; i < lengthDoc; i += blockSize) + { + int grabSize = lengthDoc - i; + if (grabSize > blockSize) + grabSize = blockSize; + + _pEditView->getText(data, i, i + grabSize); + UnicodeConvertor.fwrite(data, grabSize); + } + UnicodeConvertor.fclose(); + + _pEditView->updateCurrentBufTimeStamp(); + _pEditView->execute(SCI_SETSAVEPOINT); + + if (isHidden) + ::SetFileAttributes(filename, attrib | FILE_ATTRIBUTE_HIDDEN); + + if (isSys) + ::SetFileAttributes(filename, attrib | FILE_ATTRIBUTE_SYSTEM); + return true; + } + ::MessageBox(_hSelf, "Please check whether if this file is opened in another program", "Save failed", MB_OK); + return false; +} + +bool Notepad_plus::fileSave() +{ + if (_pEditView->isCurrentDocDirty()) + { + const char *fn = _pEditView->getCurrentTitle(); + if (Buffer::isUntitled(fn)) + { + return fileSaveAs(); + } + else + { + BackupFeature backup = ((NppParameters::getInstance())->getNppGUI())._backup; + if (backup == bak_simple) + { + //copy fn to fn.backup + string fn_bak(fn); + fn_bak += ".bak"; + ::CopyFile(fn, fn_bak.c_str(), FALSE); + } + else if (backup == bak_verbose) + { + //copy fn to fn.backup.dateTime + const char *bakDir = "nppBackup"; + char path[MAX_PATH]; + char *name; + + strcpy(path, fn); + //strcpy(name, fn); + + name = ::PathFindFileName(path); + ::PathRemoveFileSpec(path); + + + string fn_dateTime_bak(path); + fn_dateTime_bak += "\\"; + fn_dateTime_bak += bakDir; + fn_dateTime_bak += "\\"; + + if (!::PathFileExists(fn_dateTime_bak.c_str())) + { + ::CreateDirectory(bakDir, NULL); + } + + fn_dateTime_bak += name; + + const int temBufLen = 32; + char tmpbuf[temBufLen]; + time_t ltime = time(0); + struct tm *today; + + today = localtime(<ime); + strftime(tmpbuf, temBufLen, "%Y-%m-%d_%H%M%S", today); + + fn_dateTime_bak += "."; + fn_dateTime_bak += tmpbuf; + fn_dateTime_bak += ".bak"; + + ::CopyFile(fn, fn_dateTime_bak.c_str(), FALSE); + } + return doSave(fn, _pEditView->getCurrentBuffer().getUnicodeMode()); + } + } + return false; +} + +bool Notepad_plus::fileSaveAll() { + + int iCurrent = _pEditView->getCurrentDocIndex(); + + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + int iCur = _pEditView->getCurrentDocIndex(); + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + fileSave(); + } + + _pDocTab->activate(iCur); + + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + fileSave(); + } + + _pDocTab->activate(iCurrent); + return true; +} + +bool Notepad_plus::replaceAllFiles() { + + int iCurrent = _pEditView->getCurrentDocIndex(); + int nbTotal = 0; + const bool isEntireDoc = true; + + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + int iCur = _pEditView->getCurrentDocIndex(); + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + { + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(REPLACE_ALL, isEntireDoc); + _pEditView->execute(SCI_ENDUNDOACTION); + } + } + _pDocTab->activate(iCur); + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + { + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(REPLACE_ALL, isEntireDoc); + _pEditView->execute(SCI_ENDUNDOACTION); + } + } + + _pDocTab->activate(iCurrent); + + char result[64]; + if (nbTotal < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbTotal, result, 10); + strcat(result, " tokens are replaced."); + + } + ::MessageBox(_hSelf, result, "", MB_OK); + + return true; +} + +bool Notepad_plus::matchInList(const char *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::getMatchedFileNames(const char *dir, const vector & patterns, vector & fileNames, bool isRecursive) +{ + string dirFilter(dir); + dirFilter += "*.*"; + WIN32_FIND_DATA foundData; + + HANDLE hFile = ::FindFirstFile(dirFilter.c_str(), &foundData); + + if (hFile != INVALID_HANDLE_VALUE) + { + + if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (isRecursive) + { + if ((strcmp(foundData.cFileName, ".")) && (strcmp(foundData.cFileName, ".."))) + { + string pathDir(dir); + pathDir += foundData.cFileName; + pathDir += "\\"; + getMatchedFileNames(pathDir.c_str(), patterns, fileNames, isRecursive); + } + } + } + else + { + if (matchInList(foundData.cFileName, patterns)) + { + string pathFile(dir); + pathFile += foundData.cFileName; + fileNames.push_back(pathFile.c_str()); + } + } + } + while (::FindNextFile(hFile, &foundData)) + { + + if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (isRecursive) + { + if ((strcmp(foundData.cFileName, ".")) && (strcmp(foundData.cFileName, ".."))) + { + string pathDir(dir); + pathDir += foundData.cFileName; + pathDir += "\\"; + getMatchedFileNames(pathDir.c_str(), patterns, fileNames, isRecursive); + } + } + } + else + { + if (matchInList(foundData.cFileName, patterns)) + { + string pathFile(dir); + pathFile += foundData.cFileName; + fileNames.push_back(pathFile.c_str()); + } + } + } + ::FindClose(hFile); +} + +bool Notepad_plus::findInFiles(bool isRecursive) +{ + int nbTotal = 0; + ScintillaEditView *pOldView = _pEditView; + + _pEditView = &_invisibleEditView; + _findReplaceDlg.setFinderReadOnly(false); + + if (!_findReplaceDlg.isFinderEmpty()) + _findReplaceDlg.clearFinder(); + + const char *dir2Search = _findReplaceDlg.getDir2Search(); + + if (!dir2Search[0] || !::PathFileExists(dir2Search)) + { + return false; + } + vector patterns2Match; + if (_findReplaceDlg.getFilters() == "") + _findReplaceDlg.setFindInFilesDirFilter(NULL, "*.*"); + _findReplaceDlg.getPatterns(patterns2Match); + vector fileNames; + getMatchedFileNames(dir2Search, patterns2Match, fileNames, isRecursive); + + for (size_t i = 0 ; i < fileNames.size() ; i++) + { + const char *fn = fileNames[i].c_str(); + if (doSimpleOpen(fn)) + nbTotal += _findReplaceDlg.processAll(FIND_ALL, true, fn); + } + _findReplaceDlg.setFinderReadOnly(); + _findReplaceDlg.putFindResult(nbTotal); + + _pEditView = pOldView; + return true; +} + +bool Notepad_plus::findInOpenedFiles() { + + int iCurrent = _pEditView->getCurrentDocIndex(); + int nbTotal = 0; + const bool isEntireDoc = true; + + _findReplaceDlg.setFinderReadOnly(false); + //_findReplaceDlg.setFinderStyle(); + //_pFinder->defineDocType(L_TXT); + //_pFinder->execute(SCI_STYLESETSIZE, STYLE_DEFAULT, 8); + + if (!_findReplaceDlg.isFinderEmpty()) + _findReplaceDlg.clearFinder(); + + _findReplaceDlg.setSearchWord2Finder(); + + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + int iCur = _pEditView->getCurrentDocIndex(); + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(FIND_ALL, isEntireDoc, _pEditView->getCurrentTitle()); + _pEditView->execute(SCI_ENDUNDOACTION); + + } + _pDocTab->activate(iCur); + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(FIND_ALL, isEntireDoc, _pEditView->getCurrentTitle()); + _pEditView->execute(SCI_ENDUNDOACTION); + } + + _pDocTab->activate(iCurrent); + + _findReplaceDlg.setFinderReadOnly(); + + _findReplaceDlg.putFindResult(nbTotal); + + return true; +} + +bool Notepad_plus::fileSaveAs() +{ + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + + fDlg.setExtFilter("c src file", ".c", NULL); + fDlg.setExtFilter("c++ src file", ".cpp", NULL); + fDlg.setExtFilter("Window Resource File", ".rc", NULL); + fDlg.setExtFilter("c/c++ header file", ".h", NULL); + fDlg.setExtFilter("Java src file", ".java", NULL); + fDlg.setExtFilter("HTML file", ".html", NULL); + fDlg.setExtFilter("XML file", ".xml", NULL); + fDlg.setExtFilter("php file", ".php",NULL); + fDlg.setExtFilter("ini file", ".ini", NULL); + fDlg.setExtFilter("bat file", ".bat", NULL); + fDlg.setExtFilter("Normal text file", ".txt", NULL); + char str[MAX_PATH]; + strcpy(str, _pEditView->getCurrentTitle()); + + fDlg.setDefFileName(PathFindFileName(str)); + + if (char *pfn = fDlg.doSaveDlg()) + { + int i = _pEditView->findDocIndexByName(pfn); + if ((i == -1) || (i == _pEditView->getCurrentDocIndex())) + { + doSave(pfn, _pEditView->getCurrentBuffer().getUnicodeMode()); + _pEditView->setCurrentTitle(pfn); + _pEditView->setCurrentDocReadOnly(false); + _pDocTab->updateCurrentTabItem(PathFindFileName(pfn)); + setTitleWith(pfn); + setLangStatus(_pEditView->getCurrentDocType()); + checkLangsMenu(-1); + return true; + } + else + { + ::MessageBox(_hSelf, "The file is already opened in the Notepad++.", "ERROR", MB_OK | MB_ICONSTOP); + _pDocTab->activate(i); + return false; + } + checkModifiedDocument(); + } + else // cancel button is pressed + { + checkModifiedDocument(); + return false; + } +} + +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_STREAM_COMMENT, hasSelection, MENU); +} + +void Notepad_plus::checkDocState() +{ + bool isCurrentDirty = _pEditView->isCurrentDocDirty(); + bool isSeveralDirty = (!_pEditView->isAllDocsClean()) || (!getNonCurrentEditView()->isAllDocsClean()); + + enableCommand(IDM_FILE_SAVE, isCurrentDirty, MENU | TOOLBAR); + enableCommand(IDM_FILE_SAVEALL, isSeveralDirty, MENU | TOOLBAR); + + bool isSysReadOnly = _pEditView->isCurrentBufSysReadOnly(); + if (isSysReadOnly) + { + HMENU hMenu = ::GetMenu(_hSelf); + ::CheckMenuItem(hMenu, 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 = _pEditView->isCurrentBufUserReadOnly(); + HMENU hMenu = ::GetMenu(_hSelf); + ::CheckMenuItem(hMenu, IDM_EDIT_SETREADONLY, MF_BYCOMMAND | (isUserReadOnly?MF_CHECKED:MF_UNCHECKED)); + } + + enableConvertMenuItems((_pEditView->getCurrentBuffer()).getFormat()); + 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_EDIT_STARTRECORDINGMACRO, !_recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_EDIT_STOPRECORDINGMACRO, _recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_EDIT_PLAYBACKRECORDEDMACRO, !_macro.empty() && !_recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_EDIT_SAVECURRENTMACRO, !_macro.empty() && !_recordingMacro, MENU | TOOLBAR); + + enableCommand(IDM_EDIT_RUNMULTIMACRODLG, (!_macro.empty() && !_recordingMacro) || !((NppParameters::getInstance())->getMacroList()).empty(), MENU | TOOLBAR); +} + +void Notepad_plus::checkSyncState() +{ + bool canDoSync = _mainDocTab.isVisible() && _subDocTab.isVisible(); + 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::synchronise() +{ + Buffer & bufSrc = _pEditView->getCurrentBuffer(); + + const char *fn = bufSrc.getFileName(); + + int i = getNonCurrentDocTab()->find(fn); + if (i != -1) + { + Buffer & bufDest = getNonCurrentEditView()->getBufferAt(i); + bufDest.synchroniseWith(bufSrc); + getNonCurrentDocTab()->updateTabItem(i); + } +} + + +void Notepad_plus::checkLangsMenu(int id) const +{ + if (id == -1) + { + id = (NppParameters::getInstance())->langTypeToCommandID(_pEditView->getCurrentDocType()); + if (id == IDM_LANG_USER) + { + if (_pEditView->getCurrentBuffer().isUserDefineLangExt()) + { + const char *userLangName = _pEditView->getCurrentBuffer().getUserDefineLangName(); + char menuLangName[16]; + + for (int i = IDM_LANG_USER + 1 ; i <= IDM_LANG_USER_LIMIT ; i++) + { + if (::GetMenuString(::GetMenu(_hSelf), i, menuLangName, sizeof(menuLangName), MF_BYCOMMAND)) + if (!strcmp(userLangName, menuLangName)) + { + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_LANG_C, IDM_LANG_USER_LIMIT, i, MF_BYCOMMAND); + return; + } + } + } + } + } + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_LANG_C, IDM_LANG_USER_LIMIT, id, MF_BYCOMMAND); +} +void Notepad_plus::setLangStatus(LangType langType) +{ + string str2Show; + + switch (langType) + { + case L_C: + str2Show = "c source file"; break; + + case L_CPP: + str2Show = "c++ source file"; break; + + case L_OBJC: + str2Show = "Objective C source file"; break; + + case L_JAVA: + str2Show = "Java source file"; break; + + case L_CS: + str2Show = "C# source file"; break; + + case L_RC : + str2Show = "Windows Resource file"; break; + + case L_MAKEFILE: + str2Show = "Makefile"; break; + + case L_HTML: + str2Show = "Hyper Text Markup Language file"; break; + + case L_XML: + str2Show = "eXtensible Markup Language file"; break; + + case L_JS: + str2Show = "Javascript file"; break; + + case L_PHP: + str2Show = "PHP Hypertext Preprocessor file"; break; + + case L_ASP: + str2Show = "Active Server Pages script file"; break; + + case L_CSS: + str2Show = "Cascade Style Sheets File"; break; + + case L_LUA: + str2Show = "Lua source File"; break; + + case L_NFO: + str2Show = "MSDOS Style"; break; + + case L_SQL: + str2Show = "Structure Query Language file"; break; + + case L_VB: + str2Show = "Visual Basic file"; break; + + case L_BATCH : + str2Show = "Batch file"; break; + + case L_PASCAL : + str2Show = "Pascal source file"; break; + + case L_PERL : + str2Show = "Perl source file"; break; + + case L_PYTHON : + str2Show = "Python file"; break; + + case L_TEX : + str2Show = "TeX file"; break; + + case L_FORTRAN : + str2Show = "Fortran source file"; break; + + case L_BASH : + str2Show = "Unix script file"; break; + + case L_FLASH : + str2Show = "Flash Action script file"; break; + + case L_NSIS : + str2Show = "Nullsoft Scriptable Install System script file"; break; + + case L_TCL : + str2Show = "Tool Command Language file"; break; + + case L_LISP : + str2Show = "List Processing language file"; break; + + case L_SCHEME : + str2Show = "Sheme file"; break; + + case L_ASM : + str2Show = "Assembler file"; break; + + case L_DIFF : + str2Show = "Diff file"; break; + + case L_PROPS : + str2Show = "Properties file"; break; + + case L_PS : + str2Show = "Postscript file"; break; + + case L_RUBY : + str2Show = "Ruby file"; break; + + case L_SMALLTALK : + str2Show = "Smalltalk file"; break; + + case L_VHDL : + str2Show = "VHSIC Hardware Description Language file"; break; + + case L_VERILOG : + str2Show = "Verilog file"; break; + + case L_KIX : + str2Show = "KiXtart file"; break; + + case L_ADA : + str2Show = "Ada file"; break; + + case L_CAML : + str2Show = "Categorical Abstract Machine Language"; break; + + case L_AU3 : + str2Show = "AutoIt"; break; + + case L_MATLAB : + str2Show = "MATrix LABoratory"; break; + + case L_HASKELL : + str2Show = "Haskell"; break; + + case L_INNO : + str2Show = "Inno Setup script"; break; + + case L_CMAKE : + str2Show = "CMAKEFILE"; break; + + case L_USER: + { + str2Show = "User Define File"; + Buffer & currentBuf = _pEditView->getCurrentBuffer(); + if (currentBuf.isUserDefineLangExt()) + { + str2Show += " - "; + str2Show += currentBuf.getUserDefineLangName(); + } + break; + } + + default: + str2Show = "Normal text file"; + + } + _statusBar.setText(str2Show.c_str(), STATUSBAR_DOC_TYPE); +} + +void Notepad_plus::getApiFileName(LangType langType, string &fn) +{ + + switch (langType) + { + case L_C: fn = "c"; break; + + case L_CPP: fn = "cpp"; break; + + case L_OBJC: fn = "objC"; break; + + case L_JAVA: fn = "java"; break; + + case L_CS : fn = "cs"; break; + + case L_XML: fn = "xml"; break; + + case L_JS: fn = "javascript"; break; + + case L_PHP: fn = "php"; break; + + case L_VB: + case L_ASP: fn = "vb"; break; + + case L_CSS: fn = "css"; break; + + case L_LUA: fn = "lua"; break; + + case L_PERL: fn = "perl"; break; + + case L_PASCAL: fn = "pascal"; break; + + case L_PYTHON: fn = "python"; break; + + case L_TEX : fn = "tex"; break; + + case L_FORTRAN : fn = "fortran"; break; + + case L_BASH : fn = "bash"; break; + + case L_FLASH : fn = "flash"; break; + + case L_NSIS : fn = "nsis"; break; + + case L_TCL : fn = "tcl"; break; + + case L_LISP : fn = "lisp"; break; + + case L_SCHEME : fn = "sheme"; break; + + case L_ASM : + fn = "asm"; break; + + case L_DIFF : + fn = "diff"; break; +/* + case L_PROPS : + fn = "Properties file"; break; +*/ + case L_PS : + fn = "postscript"; break; + + case L_RUBY : + fn = "ruby"; break; + + case L_SMALLTALK : + fn = "smalltalk"; break; + + case L_VHDL : + fn = "vhdl"; break; + + case L_KIX : + fn = "kix"; break; + + case L_AU3 : + fn = "autoit"; break; + + case L_CAML : + fn = "caml"; break; + + case L_ADA : + fn = "ada"; break; + + case L_VERILOG : + fn = "verilog"; break; + + case L_MATLAB : + fn = "matlab"; break; + + case L_HASKELL : + fn = "haskell"; break; + + case L_INNO : + fn = "inno"; break; + + case L_CMAKE : + fn = "cmake"; break; + + case L_USER : + { + Buffer & currentBuf = _pEditView->getCurrentBuffer(); + if (currentBuf.isUserDefineLangExt()) + { + fn = currentBuf.getUserDefineLangName(); + } + break; + } + default: + fn = "text"; + + } +} + + +BOOL Notepad_plus::notify(SCNotification *notification) +{ + switch (notification->nmhdr.code) + { + + case SCN_MODIFIED: + { + if ((notification->modificationType & SC_MOD_DELETETEXT) || (notification->modificationType & SC_MOD_INSERTTEXT)) + { + _linkTriggered = true; + _isDocModifing = true; + ::InvalidateRect(_pEditView->getHSelf(), NULL, TRUE); + } + } + break; + + case SCN_DOUBLECLICK : + { + if (_isHotspotDblClicked) + { + int pos = _pEditView->execute(SCI_GETCURRENTPOS); + _pEditView->execute(SCI_SETCURRENTPOS, pos); + _pEditView->execute(SCI_SETANCHOR, pos); + _isHotspotDblClicked = false; + } + } + // + break; + + case SCN_SAVEPOINTREACHED: + _pEditView->setCurrentDocState(false); + _pDocTab->updateCurrentTabItem(); + checkDocState(); + synchronise(); + break; + + case SCN_SAVEPOINTLEFT: + _pEditView->setCurrentDocState(true); + _pDocTab->updateCurrentTabItem(); + checkDocState(); + synchronise(); + 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); + int destIndex = sender->getTabDraggedIndex(); + int scrIndex = sender->getSrcTabIndex(); + + // if the dragNdrop tab is not the current view tab, + // we have to set it to the current view tab + if (notification->nmhdr.hwndFrom != _pDocTab->getHSelf()) + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + _pEditView->sortBuffer(destIndex, scrIndex); + _pEditView->setCurrentIndex(destIndex); + + 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()) + { + char goToView[64] = "Go to another View"; + char cloneToView[64] = "Clone to another View"; + const char *pGoToView = goToView; + const char *pCloneToView = cloneToView; + + if (_nativeLang) + { + TiXmlNode *tabBarMenu = _nativeLang->FirstChild("Menu"); + tabBarMenu = tabBarMenu->FirstChild("TabBar"); + if (tabBarMenu) + { + for (TiXmlNode *childNode = tabBarMenu->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int ordre; + element->Attribute("order", &ordre); + if (ordre == 5) + pGoToView = element->Attribute("name"); + else if (ordre == 6) + pCloneToView = element->Attribute("name"); + } + } + if (!pGoToView || !pGoToView[0]) + pGoToView = goToView; + if (!pCloneToView || !pCloneToView[0]) + pCloneToView = cloneToView; + } + vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_GOTO_ANOTHER_VIEW, pGoToView)); + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_CLONE_TO_ANOTHER_VIEW, pCloneToView)); + _tabPopupDropMenu.create(_hSelf, itemUnitArray); + } + _tabPopupDropMenu.display(p); + } + else if ((hWin == getNonCurrentDocTab()->getHSelf()) || + (hWin == getNonCurrentEditView()->getHSelf())) // In the another view group + { + if (::GetKeyState(VK_LCONTROL) & 0x80000000) + docGotoAnotherEditView(MODE_CLONE); + else + docGotoAnotherEditView(MODE_TRANSFER); + } + //else on fout rien!!! // It's non view group + } + break; + } + + case TCN_TABDELETE: + { + if (notification->nmhdr.hwndFrom != _pDocTab->getHSelf()) + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + fileClose(); + break; + + } + + case TCN_SELCHANGE: + { + char fullPath[MAX_PATH]; + + if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf()) + { + strcpy(fullPath, _mainDocTab.clickedUpdate()); + switchEditViewTo(MAIN_VIEW); + + } + else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf()) + { + strcpy(fullPath, _subDocTab.clickedUpdate()); + switchEditViewTo(SUB_VIEW); + } + + PathRemoveFileSpec(fullPath); + setWorkingDir(fullPath); + //_pEditView->execute(SCI_SETLEXER, SCLEX_CONTAINER) + _linkTriggered = true; + 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))?"OVR":"INS", STATUSBAR_TYPING_MODE); + } + } + 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, clientPoint; + ::GetCursorPos(&p); + clientPoint.x = p.x; + clientPoint.y = p.y; + + if (!_tabPopupMenu.isCreated()) + { + char close[32] = "Close me"; + char closeBut[32] = "Close all but me"; + char save[32] = "Save me"; + char saveAs[32] = "Save me As..."; + char print[32] = "Print me"; + char readOnly[32] = "Read only"; + char clearReadOnly[32] = "Clear read only flag"; + char goToView[32] = "Go to another View"; + char cloneToView[32] = "Clone to another View"; + char cilpFullPath[32] = "Full file path to Clipboard"; + char cilpFileName[32] = "File name to Clipboard"; + char cilpCurrentDir[32] = "Current dir path to Clipboard"; + + + const char *pClose = close; + const char *pCloseBut = closeBut; + const char *pSave = save; + const char *pSaveAs = saveAs; + const char *pPrint = print; + const char *pReadOnly = readOnly; + const char *pClearReadOnly = clearReadOnly; + const char *pGoToView = goToView; + const char *pCloneToView = cloneToView; + const char *pCilpFullPath = cilpFullPath; + const char *pCilpFileName = cilpFileName; + const char *pCilpCurrentDir = cilpCurrentDir; + if (_nativeLang) + { + TiXmlNode *tabBarMenu = _nativeLang->FirstChild("Menu"); + if (tabBarMenu) + { + tabBarMenu = tabBarMenu->FirstChild("TabBar"); + if (tabBarMenu) + { + for (TiXmlNode *childNode = tabBarMenu->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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; + + } + } + } + } + if (!pClose || !pClose[0]) + pClose = close; + if (!pCloseBut || !pCloseBut[0]) + pCloseBut = cloneToView; + if (!pSave || !pSave[0]) + pSave = save; + if (!pSaveAs || !pSaveAs[0]) + pSaveAs = saveAs; + if (!pPrint || !pPrint[0]) + pPrint = print; + if (!pGoToView || !pGoToView[0]) + pGoToView = goToView; + if (!pCloneToView || !pCloneToView[0]) + pCloneToView = cloneToView; + } + vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSE, pClose)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSEALL_BUT_CURRENT, pCloseBut)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVE, pSave)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVEAS, pSaveAs)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_PRINT, pPrint)); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_SETREADONLY, pReadOnly)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CLEARREADONLY, pClearReadOnly)); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FULLPATHTOCLIP, pCilpFullPath)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FILENAMETOCLIP, pCilpFileName)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CURRENTDIRTOCLIP, pCilpCurrentDir)); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_GOTO_ANOTHER_VIEW, pGoToView)); + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_CLONE_TO_ANOTHER_VIEW, pCloneToView)); + + _tabPopupMenu.create(_hSelf, itemUnitArray); + + } + ::ScreenToClient(_pDocTab->getHSelf(), &clientPoint); + ::SendMessage(_pDocTab->getHSelf(), WM_LBUTTONDOWN, 2, MAKELONG(clientPoint.x, clientPoint.y)); + + bool isEnable = ((::GetMenuState(::GetMenu(_hSelf), IDM_FILE_SAVE, MF_BYCOMMAND)&MF_DISABLED) == 0); + _tabPopupMenu.enableItem(IDM_FILE_SAVE, isEnable); + + bool isUserReadOnly = _pEditView->isCurrentBufUserReadOnly(); + _tabPopupMenu.checkItem(IDM_EDIT_SETREADONLY, isUserReadOnly); + + bool isSysReadOnly = _pEditView->isCurrentBufSysReadOnly(); + _tabPopupMenu.enableItem(IDM_EDIT_SETREADONLY, !isSysReadOnly); + _tabPopupMenu.enableItem(IDM_EDIT_CLEARREADONLY, isSysReadOnly); + + _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) + { + + int lineClick = int(_pEditView->execute(SCI_LINEFROMPOSITION, notification->position)); + bookmarkToggle(lineClick); + + } + break; + } + + + case SCN_CHARADDED: + charAdded(static_cast(notification->ch)); + break; + + case SCN_UPDATEUI: + braceMatch(); + updateStatusBar(); + break; + + case TTN_GETDISPINFO: + { + LPTOOLTIPTEXT lpttt; + + lpttt = (LPTOOLTIPTEXT)notification; + lpttt->hinst = _hInst; + + // Specify the resource identifier of the descriptive + // text for the given button. + int idButton = int(lpttt->hdr.idFrom); + static string tip; + getNameStrFromCmd(idButton, tip); + lpttt->lpszText = (LPSTR)tip.c_str(); + } + break; + + case SCN_ZOOM: + _pEditView->setLineNumberWidth(_pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER)); + break; + + case SCN_MACRORECORD: + _macro.push_back(recordedMacroStep(notification->message, notification->wParam, notification->lParam)); + break; + +/* + case SCN_STYLENEEDED: + { + + } + break; +*/ + case SCN_PAINTED: + { + if (_syncInfo.doSync()) + doSynScorll(HWND(notification->nmhdr.hwndFrom)); + + if (_linkTriggered) + { + int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL; + if ((urlAction == 1) || (urlAction == 2)) + addHotSpot(_isDocModifing); + _linkTriggered = false; + _isDocModifing = false; + } + break; + } + + + case SCN_HOTSPOTDOUBLECLICK : + { + _pEditView->execute(SCI_SETWORDCHARS, 0, (LPARAM)"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-+.:?&@=/%#"); + + int pos = _pEditView->execute(SCI_GETCURRENTPOS); + int startPos = static_cast(_pEditView->execute(SCI_WORDSTARTPOSITION, pos, false)); + int endPos = static_cast(_pEditView->execute(SCI_WORDENDPOSITION, pos, false)); + + _pEditView->execute(SCI_SETTARGETSTART, startPos); + _pEditView->execute(SCI_SETTARGETEND, endPos); + + int posFound = _pEditView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRegExpr), (LPARAM)urlHttpRegExpr); + if (posFound != -1) + { + startPos = int(_pEditView->execute(SCI_GETTARGETSTART)); + endPos = int(_pEditView->execute(SCI_GETTARGETEND)); + } + + char currentWord[MAX_PATH*2]; + _pEditView->getText(currentWord, startPos, endPos); + + ::ShellExecute(_hSelf, "open", currentWord, NULL, NULL, SW_SHOW); + _isHotspotDblClicked = true; + _pEditView->execute(SCI_SETCHARSDEFAULT); + break; + } + + default : + break; + + } + return FALSE; +} +void Notepad_plus::findMatchingBracePos(int & braceAtCaret, int & braceOpposite) +{ + int caretPos = int(_pEditView->execute(SCI_GETCURRENTPOS, 0, 0)); + braceAtCaret = -1; + braceOpposite = -1; + char charBefore = '\0'; + //char styleBefore = '\0'; + int lengthDoc = int(_pEditView->execute(SCI_GETLENGTH, 0, 0)); + + if ((lengthDoc > 0) && (caretPos > 0)) + { + charBefore = char(_pEditView->execute(SCI_GETCHARAT, caretPos - 1, 0)); + } + // Priority goes to character before caret + if (charBefore && strchr("[](){}", charBefore)) + { + braceAtCaret = caretPos - 1; + } + + if (lengthDoc > 0 && (braceAtCaret < 0)) + { + // No brace found so check other side + char charAfter = char(_pEditView->execute(SCI_GETCHARAT, caretPos, 0)); + if (charAfter && strchr("[](){}", 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(char 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--; + unsigned char ch = (unsigned char)_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 = (unsigned char)_pEditView->execute(SCI_GETCHARAT, posBegin2style); + while ((posBegin2style > 0) && ((ch != 0x0A) && (ch != 0x0D))) + { + ch = (unsigned char)_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; + + //char *regExprStr0 = "http://[a-z0-9_-+.:?=/%]*";//"http://[^ \\t\\\"]*"; + //char *regExprStr1 = "[a-zA-Z0-9._]+@[a-zA-Z0-9_]+.[a-zA-Z0-9_]+"; + + 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; + + char fontName[256]; + + _pEditView->execute(SCI_STYLEGETFONT, idStyle, (LPARAM)fontName); + int fg = _pEditView->execute(SCI_STYLEGETFORE, idStyle); + int bg = _pEditView->execute(SCI_STYLEGETBACK, idStyle); + int 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); + + int fontStyle = (isBold?FONTSTYLE_BOLD:0) | (isItalic?FONTSTYLE_ITALIC:0) | (isUnderline?FONTSTYLE_UNDERLINE:0); + int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL; + if (urlAction == 2) + fontStyle |= FONTSTYLE_UNDERLINE; + + _pEditView->setStyle(style_hotspot, fg, bg, fontName, fontStyle, fontSize); + + _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(char 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_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 + 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, _hSelf, svp._edgeNbColumn, "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(); + checkSyncState(); + break; + + case IDM_FILE_CLOSEALL: + fileCloseAll(); + checkSyncState(); + break; + + case IDM_FILE_CLOSEALL_BUT_CURRENT : + fileCloseAllButCurrent(); + checkSyncState(); + break; + + case IDM_FILE_SAVE : + fileSave(); + break; + + case IDM_FILE_SAVEALL : + fileSaveAll(); + break; + + case IDM_FILE_SAVEAS : + fileSaveAs(); + break; + + case IDM_FILE_LOADSESSION: + fileLoadSession(); + break; + + case IDM_FILE_SAVESESSION: + fileSaveSession(); + break; + + case IDC_BUTTON_PRINT : + 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); + break; + + case IDM_EDIT_COPY: + _pEditView->execute(WM_COPY); + checkClipboard(); + break; + + case IDM_EDIT_PASTE: + { + int eolMode = int(_pEditView->execute(SCI_GETEOLMODE)); + _pEditView->execute(WM_PASTE); + _pEditView->execute(SCI_CONVERTEOLS, eolMode); + } + break; + + case IDM_EDIT_DELETE: + _pEditView->execute(WM_CLEAR); + break; + + case IDM_EDIT_STARTRECORDINGMACRO: + case IDM_EDIT_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_EDIT_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_EDIT_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_EDIT_SAVECURRENTMACRO : + { + if (addCurrentMacro()) + _runMacroDlg.initMacroList(); + break; + } + case IDM_EDIT_FULLPATHTOCLIP : + { + str2Cliboard(_pEditView->getCurrentTitle()); + } + break; + + case IDM_EDIT_CURRENTDIRTOCLIP : + { + char dir[MAX_PATH]; + strcpy(dir, _pEditView->getCurrentTitle()); + PathRemoveFileSpec((LPSTR)dir); + + str2Cliboard(dir); + } + break; + + case IDM_EDIT_FILENAMETOCLIP : + { + str2Cliboard(PathFindFileName((LPSTR)_pEditView->getCurrentTitle())); + } + break; + + case IDM_SEARCH_FIND : + case IDM_SEARCH_REPLACE : + { + const int strSize = 64; + char str[strSize]; + + bool isFirstTime = !_findReplaceDlg.isCreated(); + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + _pEditView->expandWordSelection(); + + if (_nativeLang) + { + TiXmlNode *dlgNode = _nativeLang->FirstChild("Dialog"); + if (dlgNode) + { + 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) + { + pNppParam->getFindDlgTabTitiles()._find = titre1; + pNppParam->getFindDlgTabTitiles()._replace = titre2; + pNppParam->getFindDlgTabTitiles()._findInFiles = titre3; + } + } + } + } + _findReplaceDlg.doDialog((id == IDM_SEARCH_FIND)?FIND_DLG:REPLACE_DLG, _isRTL); + + if (_pEditView->getSelectedText(str, strSize, true)) + _findReplaceDlg.setSearchText(str, _pEditView->getCurrentBuffer()._unicodeMode != uni8Bit); + + if (isFirstTime) + changeDlgLang(_findReplaceDlg.getHSelf(), "Find"); + break; + } + + case IDM_SEARCH_FINDINFILES : + { + ::SendMessage(_hSelf, NPPM_LAUNCHFINDINFILESDLG, 0, 0); + break; + } + case IDM_SEARCH_FINDINCREMENT : + { + const int strSize = 64; + char str[strSize]; + + _incrementFindDlg.doDialog(_isRTL); + + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + { + _pEditView->expandWordSelection(); + } + _pEditView->getSelectedText(str, strSize); + _incrementFindDlg.setSearchText(str, _pEditView->getCurrentBuffer()._unicodeMode != uni8Bit); + } + break; + + case IDM_SEARCH_FINDNEXT : + case IDM_SEARCH_FINDPREV : + { + if (!_findReplaceDlg.isCreated()) + return; + + _findReplaceDlg.setSearchDirection(id == IDM_SEARCH_FINDNEXT?DIR_DOWN:DIR_UP); + + string s = _findReplaceDlg.getText2search(); + _findReplaceDlg.processFindNext(s.c_str()); + break; + } + break; + + case IDM_SEARCH_VOLATILE_FINDNEXT : + case IDM_SEARCH_VOLATILE_FINDPREV : + { + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + { + _pEditView->expandWordSelection(); + } + else + { + char text2Find[MAX_PATH]; + _pEditView->getSelectedText(text2Find, sizeof(text2Find)); + + FindOption op; + op._isWholeWord = false; + op._whichDirection = (id == IDM_SEARCH_VOLATILE_FINDNEXT?DIR_DOWN:DIR_UP); + _findReplaceDlg.processFindNext(text2Find, &op); + } + break; + } + case IDM_SEARCH_MARKALL : + { + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + { + _pEditView->expandWordSelection(); + } + char text2Find[MAX_PATH]; + _pEditView->getSelectedText(text2Find, sizeof(text2Find)); + + FindOption op; + op._isWholeWord = false; + //op._whichDirection = (id == IDM_SEARCH_VOLATILE_FINDNEXT?DIR_DOWN:DIR_UP); + _findReplaceDlg.markAll(text2Find); + + break; + } + + case IDM_SEARCH_UNMARKALL : + { + LangType lt = _pEditView->getCurrentDocType(); + if (lt == L_TXT) + _pEditView->defineDocType(L_CPP); + _pEditView->defineDocType(lt); + _pEditView->execute(SCI_MARKERDELETEALL, MARK_SYMBOLE); + 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 (_mainWindowStatus & TWO_VIEWS_MASK) + _pMainWindow = &_subSplitter; + else + _pMainWindow = _pDocTab; + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + udd->display(false); + _mainWindowStatus &= ~DOCK_MASK; + } + else if ((isUDDlgDocked)&&(!isUDDlgVisible)) + { + if (!_pMainSplitter) + { + _pMainSplitter = new SplitterContainer; + _pMainSplitter->init(_hInst, _hSelf); + + Window *pWindow; + if (_mainWindowStatus & TWO_VIEWS_MASK) + pWindow = &_subSplitter; + else + pWindow = _pDocTab; + + _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45); + } + + _pMainWindow = _pMainSplitter; + + _pMainSplitter->setWin0((_mainWindowStatus & TWO_VIEWS_MASK)?(Window *)&_subSplitter:(Window *)_pDocTab); + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + _pMainWindow->display(); + + _mainWindowStatus |= DOCK_MASK; + } + 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_TRANSPOSE_LINE: + _pEditView->execute(SCI_LINETRANSPOSE); + 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(); + break; + + case IDM_EDIT_STREAM_COMMENT: + doStreamComment(); + break; + + case IDM_EDIT_TRIMTRAILING: + doTrimTrailing(); + break; + + case IDM_EDIT_SETREADONLY: + { + HMENU hMenu = ::GetMenu(_hSelf); + int check = (::GetMenuState(hMenu, id, MF_BYCOMMAND) == MF_CHECKED)?MF_UNCHECKED:MF_CHECKED; + ::CheckMenuItem(hMenu, id, MF_BYCOMMAND | check); + _pEditView->setCurrentDocReadOnlyByUser(check == MF_CHECKED); + _pDocTab->updateCurrentTabItem(); + } + break; + + case IDM_EDIT_CLEARREADONLY: + { + DWORD dwFileAttribs = ::GetFileAttributes(_pEditView->getCurrentBuffer().getFileName()); + dwFileAttribs ^= FILE_ATTRIBUTE_READONLY; + + ::SetFileAttributes(_pEditView->getCurrentBuffer().getFileName(), dwFileAttribs); + + //_pEditView->getCurrentBuffer().setReadOnly(false); + _pEditView->execute(SCI_SETREADONLY,false); + _pEditView->updateCurrentDocSysReadOnlyStat(); + + _pDocTab->updateCurrentTabItem(); + + HMENU hMenu = ::GetMenu(_hSelf); + enableCommand(IDM_EDIT_SETREADONLY, true, MENU); + } + break; + + case IDM_VIEW_FULLSCREENTOGGLE : + fullScreenToggle(); + break; + + case IDM_VIEW_ALWAYSONTOP: + { + HMENU hMenu = ::GetMenu(_hSelf); + int check = (::GetMenuState(hMenu, id, MF_BYCOMMAND) == MF_CHECKED)?MF_UNCHECKED:MF_CHECKED; + ::CheckMenuItem(hMenu, 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_HIDE: + { + int checkedID = getToolBarState(); + + if (checkedID != IDM_VIEW_TOOLBAR_HIDE) + { + RECT rc; + getClientRect(rc); + _toolBar.display(false); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_TOOLBAR_REDUCE: + { + int checkedID = getToolBarState(); + + if (checkedID != IDM_VIEW_TOOLBAR_REDUCE) + { + RECT rc; + getClientRect(rc); + _toolBar.reduce(); + _toolBar.display(); + _rebar.reNew(); + _rebar.display(); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + //changeToolBarIcons(); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_TOOLBAR_ENLARGE: + { + int checkedID = getToolBarState(); + if (checkedID != IDM_VIEW_TOOLBAR_ENLARGE) + { + RECT rc; + getClientRect(rc); + _toolBar.enlarge(); + _toolBar.display(); + _rebar.reNew(); + _rebar.display(); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + changeToolBarIcons(); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_TOOLBAR_STANDARD: + { + int checkedID = getToolBarState(); + if (checkedID != IDM_VIEW_TOOLBAR_STANDARD) + { + RECT rc; + getClientRect(rc); + _toolBar.setToUglyIcons(); + _toolBar.display(); + _rebar.reNew(); + _rebar.display(); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_REDUCETABBAR : + { + _toReduceTabBar = !_toReduceTabBar; + + //Resize the icon + int iconSize = _toReduceTabBar?12:20; + + //Resize the tab height + int tabHeight = _toReduceTabBar?20:25; + + //change the font + int stockedFont = _toReduceTabBar?DEFAULT_GUI_FONT:SYSTEM_FONT; + + TabCtrl_SetItemSize(_mainDocTab.getHSelf(), 45, tabHeight); + TabCtrl_SetItemSize(_subDocTab.getHSelf(), 45, tabHeight); + + _docTabIconList.setIconSize(iconSize); + + 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)); + } + RECT rc; + + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + break; + } + + case IDM_VIEW_REFRESHTABAR : + { + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + 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); + } + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + break; + } + + case IDM_VIEW_DRAWTABBAR_DBCLK2CLOSE : + { + TabBarPlus::setDbClk2Close(!TabBarPlus::isDbClk2Close()); + break; + } + + case IDM_VIEW_STATUSBAR: + { + RECT rc; + getClientRect(rc); + NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI(); + nppGUI._statusBarShow = !nppGUI._statusBarShow; + _statusBar.display(nppGUI._statusBarShow); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + break; + } + case IDM_VIEW_TAB_SPACE: + { + HMENU hMenu = ::GetMenu(_hSelf); + bool isChecked = !(::GetMenuState(hMenu, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND) == MF_CHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_EOL, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_ALL_CHARACTERS, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, 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: + { + HMENU hMenu = ::GetMenu(_hSelf); + bool isChecked = !(::GetMenuState(hMenu, IDM_VIEW_EOL, MF_BYCOMMAND) == MF_CHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_EOL, MF_BYCOMMAND | (isChecked?MF_CHECKED:MF_UNCHECKED)); + ::CheckMenuItem(hMenu, 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: + { + HMENU hMenu = ::GetMenu(_hSelf); + bool isChecked = !(::GetMenuState(hMenu, id, MF_BYCOMMAND) == MF_CHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_EOL, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, 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: + { + _pEditView->wrap(!_pEditView->isWrap()); + _toolBar.setCheck(IDM_VIEW_WRAP, _pEditView->isWrap()); + checkMenuItem(IDM_VIEW_WRAP, _pEditView->isWrap()); + break; + } + case IDM_VIEW_WRAP_SYMBOL: + { + _pEditView->showWrapSymbol(!_pEditView->isWrapSymbolVisible()); + //_toolBar.setCheck(IDM_VIEW_WRAP, _pEditView->isWrap()); + checkMenuItem(IDM_VIEW_WRAP_SYMBOL, _pEditView->isWrapSymbolVisible()); + break; + } + case IDM_VIEW_ZOOMIN: + { + _pEditView->execute(SCI_ZOOMIN); + break; + } + case IDM_VIEW_ZOOMOUT: + _pEditView->execute(SCI_ZOOMOUT); + break; + + case IDM_VIEW_ZOOMRESTORE: + _pEditView->execute(SCI_SETZOOM, _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 : + { + int f = int((id == IDM_FORMAT_TODOS)?SC_EOL_CRLF:(id == IDM_FORMAT_TOUNIX)?SC_EOL_LF:SC_EOL_CR); + _pEditView->execute(SCI_SETEOLMODE, f); + _pEditView->execute(SCI_CONVERTEOLS, f); + (_pEditView->getCurrentBuffer()).setFormat((formatType)f); + enableConvertMenuItems((formatType)f); + setDisplayFormat((formatType)f); + 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 : + { + UniMode um; + bool isUnicodeMode = true; + switch (id) + { + case IDM_FORMAT_ANSI: + um = uni8Bit; + isUnicodeMode = false; + 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_AS_UTF_8 + { + bool wasChecked = (_pEditView->getCurrentBuffer().getUnicodeMode() == uniCookie); + if (wasChecked) + { + um = uni8Bit; + isUnicodeMode = false; + } + else + { + um = uniCookie; + checkMenuItem(IDM_FORMAT_AS_UTF_8, false); + } + } + } + _pEditView->getCurrentBuffer().setUnicodeMode(um); + _pDocTab->updateCurrentTabItem(); + checkDocState(); + synchronise(); + + _pEditView->execute(SCI_SETCODEPAGE, isUnicodeMode?SC_CP_UTF8:0); + checkUnicodeMenuItems(um); + setUniModeText(um); + 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, _hSelf, nppgui._tabSize, "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_HISTORY_SIZE : + { + ValueDlg nbHistoryDlg; + NppParameters *pNppParam = NppParameters::getInstance(); + nbHistoryDlg.init(_hInst, _hSelf, pNppParam->getNbMaxFile(), "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_HISTORY_DONT_CHECK : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._checkHistoryFiles = !nppgui._checkHistoryFiles; + checkMenuItem(IDM_SETTING_HISTORY_DONT_CHECK, !nppgui._checkHistoryFiles); + 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); + shortcutMapper.doDialog(_isRTL); + shortcutMapper.destroy(); + break; + } + case IDM_SETTING_FILE_AUTODETECTION_ENABLE : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._fileAutoDetection = cdEnabled; + break; + } + + case IDM_SETTING_FILE_AUTODETECTION_DISABLE : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._fileAutoDetection = cdDisabled; + break; + } + case IDM_SETTING_FILE_AUTODETECTION_ENABLESILENTLY : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._fileAutoDetection = cdAutoUpdate; + break; + } + + case IDM_SETTING_TRAYICON : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._isMinimizedToTray = !nppgui._isMinimizedToTray; + checkMenuItem(IDM_SETTING_TRAYICON, nppgui._isMinimizedToTray); + break; + } + + case IDM_SETTING_REMEMBER_LAST_SESSION : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._rememberLastSession = !nppgui._rememberLastSession; + checkMenuItem(IDM_SETTING_REMEMBER_LAST_SESSION, nppgui._rememberLastSession); + break; + } + + case IDM_SETTING_PREFERECE : + { + bool isFirstTime = !_preference.isCreated(); + _preference.doDialog(_isRTL); + + if (isFirstTime) + { + changePrefereceDlgLang(); + } + break; + } + + case IDC_DOC_GOTO_ANOTHER_VIEW: + docGotoAnotherEditView(MODE_TRANSFER); + checkSyncState(); + break; + + case IDC_DOC_CLONE_TO_ANOTHER_VIEW: + docGotoAnotherEditView(MODE_CLONE); + checkSyncState(); + break; + + case IDM_ABOUT: + { + bool isFirstTime = !_aboutDlg.isCreated(); + _aboutDlg.doDialog(); + if (isFirstTime && _nativeLang) + { + const char *lang = (_nativeLang->ToElement())->Attribute("name"); + if (lang && !strcmp(lang, "¤¤¤åÁcÅé")) + { + char *authorName = "«J¤µ§^"; + HWND hItem = ::GetDlgItem(_aboutDlg.getHSelf(), IDC_AUTHOR_NAME); + ::SetWindowText(hItem, authorName); + } + } + break; + } + + case IDM_HOMESWEETHOME : + { + ::ShellExecute(NULL, "open", "http://notepad-plus.sourceforge.net/", NULL, NULL, SW_SHOWNORMAL); + break; + } + case IDM_PROJECTPAGE : + { + ::ShellExecute(NULL, "open", "http://sourceforge.net/projects/notepad-plus/", NULL, NULL, SW_SHOWNORMAL); + break; + } + + case IDM_ONLINEHELP: + { + ::ShellExecute(NULL, "open", "http://notepad-plus.sourceforge.net/uk/generalFAQ.php", NULL, NULL, SW_SHOWNORMAL); + break; + } + + case IDM_FORUM: + { + ::ShellExecute(NULL, "open", "http://sourceforge.net/forum/?group_id=95717", NULL, NULL, SW_SHOWNORMAL); + break; + } + + case IDC_AUTOCOMPLETE : + showAutoComp(); + break; + + case IDC_AUTOCOMPLETE_CURRENTFILE : + //MessageBox(NULL, "IDC_AUTOCOMPLETE_CURRENTFILE", "", MB_OK); + autoCompFromCurrentFile(); + break; + + case IDM_LANGSTYLE_CONFIG_DLG : + { + bool isFirstTime = !_configStyleDlg.isCreated(); + _configStyleDlg.doDialog(_isRTL); + if (isFirstTime) + changeConfigLang(); + break; + } + + case IDM_LANG_C : + setLanguage(id, L_C); + break; + + case IDM_LANG_CPP : + setLanguage(id, L_CPP); + break; + + case IDM_LANG_JAVA : + setLanguage(id, L_JAVA); + break; + + case IDM_LANG_CS : + setLanguage(id, L_CS); + break; + + case IDM_LANG_HTML : + setLanguage(id, L_HTML); + break; + + case IDM_LANG_XML : + setLanguage(id, L_XML); + break; + + case IDM_LANG_JS : + setLanguage(id, L_JS); + break; + + case IDM_LANG_PHP : + setLanguage(id, L_PHP); + break; + + case IDM_LANG_ASP : + setLanguage(id, L_ASP); + break; + + case IDM_LANG_CSS : + setLanguage(id, L_CSS); + break; + + case IDM_LANG_LUA : + setLanguage(id, L_LUA); + break; + + case IDM_LANG_PERL : + setLanguage(id, L_PERL); + break; + + case IDM_LANG_PYTHON : + setLanguage(id, L_PYTHON); + break; + + case IDM_LANG_PASCAL : + setLanguage(id, L_PASCAL); + break; + + case IDM_LANG_BATCH : + setLanguage(id, L_BATCH); + break; + + case IDM_LANG_OBJC : + setLanguage(id, L_OBJC); + break; + + case IDM_LANG_VB : + setLanguage(id, L_VB); + break; + + case IDM_LANG_SQL : + setLanguage(id, L_SQL); + break; + + case IDM_LANG_ASCII : + setLanguage(id, L_NFO); + break; + + case IDM_LANG_TEXT : + setLanguage(id, L_TXT); + break; + + case IDM_LANG_RC : + setLanguage(id, L_RC); + break; + + case IDM_LANG_MAKEFILE : + setLanguage(id, L_MAKEFILE); + break; + + case IDM_LANG_INI : + setLanguage(id, L_INI); + break; + + case IDM_LANG_TEX : + setLanguage(id, L_TEX); + break; + + case IDM_LANG_FORTRAN : + setLanguage(id, L_FORTRAN); + break; + + case IDM_LANG_SH : + setLanguage(id, L_BASH); + break; + + case IDM_LANG_FLASH : + setLanguage(id, L_FLASH); + break; + + case IDM_LANG_NSIS : + setLanguage(id, L_NSIS); + break; + + case IDM_LANG_TCL : + setLanguage(id, L_TCL); + break; + + case IDM_LANG_LISP : + setLanguage(id, L_LISP); + break; + + case IDM_LANG_SCHEME : + setLanguage(id, L_SCHEME); + break; + + case IDM_LANG_ASM : + setLanguage(id, L_ASM); + break; + + case IDM_LANG_DIFF : + setLanguage(id, L_DIFF); + break; + + case IDM_LANG_PROPS : + setLanguage(id, L_PROPS); + break; + + case IDM_LANG_PS: + setLanguage(id, L_PS); + break; + + case IDM_LANG_RUBY: + setLanguage(id, L_RUBY); + break; + + case IDM_LANG_SMALLTALK: + setLanguage(id, L_SMALLTALK); + break; + case IDM_LANG_VHDL : + setLanguage(id, L_VHDL); + break; + + case IDM_LANG_KIX : + setLanguage(id, L_KIX); + break; + + case IDM_LANG_CAML : + setLanguage(id, L_CAML); + break; + + case IDM_LANG_ADA : + setLanguage(id, L_ADA); + break; + + case IDM_LANG_VERILOG : + setLanguage(id, L_VERILOG); + break; + + case IDM_LANG_MATLAB : + setLanguage(id, L_MATLAB); + break; + + case IDM_LANG_HASKELL : + setLanguage(id, L_HASKELL); + break; + + case IDM_LANG_AU3 : + setLanguage(id, L_AU3); + break; + + case IDM_LANG_INNO : + setLanguage(id, L_INNO); + break; + + case IDM_LANG_CMAKE : + setLanguage(id, L_CMAKE); + break; + + case IDM_LANG_USER : + setLanguage(id, L_USER); + break; + + case IDC_PREV_DOC : + case IDC_NEXT_DOC : + { + int nbDoc = _mainDocTab.isVisible()?_mainEditView.getNbDoc():0; + nbDoc += _subDocTab.isVisible()?_subEditView.getNbDoc():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 : + for (int i = IDM_FILEMENU_LASTONE + 1 ; i < (IDM_FILEMENU_LASTONE + _lastRecentFileList.getMaxNbLRF() + 1) ; i++) + { + char fn[MAX_PATH]; + int res = ::GetMenuString(::GetMenu(_hSelf), i, fn, sizeof(fn), MF_BYCOMMAND); + if (res) + { + doOpen(fn); + } + } + break; + + case IDM_EDIT_RTL : + case IDM_EDIT_LTR : + { + long exStyle = ::GetWindowLong(_pEditView->getHSelf(), GWL_EXSTYLE); + exStyle = (id == IDM_EDIT_RTL)?exStyle|WS_EX_LAYOUTRTL:exStyle&(~WS_EX_LAYOUTRTL); + ::SetWindowLong(_pEditView->getHSelf(), GWL_EXSTYLE, exStyle); + _pEditView->defineDocType(_pEditView->getCurrentDocType()); + _pEditView->redraw(); + } + break; + + case IDM_WINDOW_WINDOWS : + { + WindowsDlg _windowsDlg; + _windowsDlg.init(_hInst, _hSelf, _pEditView); + + TiXmlNode *dlgNode = NULL; + if (_nativeLang) + { + dlgNode = _nativeLang->FirstChild("Dialog"); + if (dlgNode) + dlgNode = searchDlgNode(dlgNode, "Window"); + } + _windowsDlg.doDialog(dlgNode); + + //changeDlgLang(_windowsDlg.getHSelf(), "Window"); + } + break; + + case IDC_KEY_HOME : + _pEditView->execute(SCI_VCHOMEWRAP); + break; + + case IDC_KEY_END : + _pEditView->execute(SCI_LINEENDWRAP); + break; + + case IDC_KEY_SELECT_2_HOME : + _pEditView->execute(SCI_VCHOMEWRAPEXTEND); + break; + + case IDC_KEY_SELECT_2_END : + _pEditView->execute(SCI_LINEENDWRAPEXTEND); + break; + + default : + if (id > IDM_FILE_EXIT && id < (IDM_FILE_EXIT + _lastRecentFileList.getMaxNbLRF() + 1)) + { + char fn[MAX_PATH]; + int res = ::GetMenuString(::GetMenu(_hSelf), id, fn, sizeof(fn), MF_BYCOMMAND); + if (res) + { + if (doOpen(fn)) + { + setLangStatus(_pEditView->getCurrentDocType()); + } + } + } + else if ((id > IDM_LANG_USER) && (id < IDM_LANG_USER_LIMIT)) + { + char langName[langNameLenMax]; + ::GetMenuString(::GetMenu(_hSelf), id, langName, sizeof(langName), MF_BYCOMMAND); + _pEditView->setCurrentDocUserType(langName); + setLangStatus(L_USER); + checkLangsMenu(id); + } + 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_MARKALL : + case IDM_SEARCH_UNMARKALL : + 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_STREAM_COMMENT: + case IDM_EDIT_TRIMTRAILING: + case IDM_EDIT_SETREADONLY : + 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 IDC_DOC_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::setTitleWith(const char *filePath) +{ + if (!filePath || !strcmp(filePath, "")) + return; + + char str2concat[MAX_PATH]; + strcat(strcpy(str2concat, _className), " - "); + strcat(str2concat, filePath); + ::SetWindowText(_hSelf, str2concat); +} + +void Notepad_plus::activateNextDoc(bool direction) +{ + int nbDoc = _pEditView->getNbDoc(); + if (!nbDoc) return; + + int curIndex = _pEditView->getCurrentDocIndex(); + curIndex += (direction == dirUp)?-1:1; + + if (curIndex >= nbDoc) + { + if (getNonCurrentDocTab()->isVisible()) + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + curIndex = 0; + } + else if (curIndex < 0) + { + if (getNonCurrentDocTab()->isVisible()) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + nbDoc = _pEditView->getNbDoc(); + } + curIndex = nbDoc - 1; + } + + char *fullPath = _pDocTab->activate(curIndex); + setTitleWith(fullPath); + checkDocState(); + + char dirPath[MAX_PATH]; + + strcpy(dirPath, fullPath); + PathRemoveFileSpec(dirPath); + setWorkingDir(dirPath); +} + + +void Notepad_plus::activateDoc(int pos) +{ + int nbDoc = _pEditView->getNbDoc(); + if (!nbDoc) return; + + if (pos == _pEditView->getCurrentDocIndex()) + { + (_pEditView->getCurrentBuffer()).increaseRecentTag(); + return; + } + + if (pos >= 0 && pos < nbDoc) + { + char *fullPath = _pDocTab->activate(pos); + setTitleWith(fullPath); + checkDocState(); + char dirPath[MAX_PATH]; + + strcpy(dirPath, fullPath); + PathRemoveFileSpec(dirPath); + setWorkingDir(dirPath); + } +} + +void Notepad_plus::updateStatusBar() +{ + char strLnCol[64]; + sprintf(strLnCol, "Ln : %d Col : %d Sel : %d",\ + (_pEditView->getCurrentLineNumber() + 1), \ + (_pEditView->getCurrentColumnNumber() + 1),\ + (_pEditView->getSelectedByteNumber())); + + _statusBar.setText(strLnCol, STATUSBAR_CUR_POS); + + char strDonLen[64]; + sprintf(strDonLen, "nb char : %d", _pEditView->getCurrentDocLen()); + _statusBar.setText(strDonLen, STATUSBAR_DOC_SIZE); + + setDisplayFormat((_pEditView->getCurrentBuffer()).getFormat()); + setUniModeText(_pEditView->getCurrentBuffer().getUnicodeMode()); + _statusBar.setText(_pEditView->execute(SCI_GETOVERTYPE) ? "OVR" : "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 = ::ChildWindowFromPoint(_hSelf, p); + if (hWin) + { + if ((_mainEditView.getHSelf() == hWin) || (_mainDocTab.getHSelf() == hWin)) + switchEditViewTo(MAIN_VIEW); + else if ((_subEditView.getHSelf() == hWin) || (_subDocTab.getHSelf() == hWin)) + switchEditViewTo(SUB_VIEW); + } + + int filesDropped = ::DragQueryFile(hdrop, 0xffffffff, NULL, 0); + for (int i = 0 ; i < filesDropped ; ++i) + { + char pathDropped[MAX_PATH]; + ::DragQueryFile(hdrop, i, pathDropped, sizeof(pathDropped)); + doOpen(pathDropped); + setLangStatus(_pEditView->getCurrentDocType()); + } + ::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() +{ + const int NB_VIEW = 2; + ScintillaEditView * pScintillaArray[NB_VIEW]; + DocTabView * pDocTabArray[NB_VIEW]; + + int currentView = getCurrentView(); + int currentIndex = _pEditView->getCurrentDocIndex(); + + // the oder (1.current view 2.non current view) is important + // to synchronize with "hideCurrentView" function + pScintillaArray[0] = _pEditView; + pScintillaArray[1] = getNonCurrentEditView(); + + pDocTabArray[0] = _pDocTab; + pDocTabArray[1] = getNonCurrentDocTab(); + + NppParameters *pNppParam = NppParameters::getInstance(); + const NppGUI & nppGUI = pNppParam->getNppGUI(); + bool autoUpdate = (nppGUI._fileAutoDetection == cdAutoUpdate); + + for (int j = 0 ; j < NB_VIEW ; j++) + { + for (int i = (pScintillaArray[j]->getNbDoc()-1) ; i >= 0 ; i--) + { + Buffer & docBuf = pScintillaArray[j]->getBufferAt(i); + docFileStaus fStatus = docBuf.checkFileState(); + pDocTabArray[j]->updateTabItem(i); + bool update = !docBuf.isDirty() && autoUpdate; + + if (fStatus == MODIFIED_FROM_OUTSIDE) + { + // If npp is minimized, bring it up to the top + if (::IsIconic(_hSelf)) + ::ShowWindow(_hSelf, SW_SHOWNORMAL); + + if (update || doReloadOrNot(docBuf.getFileName()) == IDYES) + { + pDocTabArray[j]->activate(i); + // if it's a non current view, make it as the current view + if (j == 1) + switchEditViewTo(getNonCurrentView()); + + if (pScintillaArray[j]->isCurrentBufReadOnly()) + pScintillaArray[j]->execute(SCI_SETREADONLY, FALSE); + + reload(docBuf.getFileName()); + + if (pScintillaArray[j]->isCurrentBufReadOnly()) + pScintillaArray[j]->execute(SCI_SETREADONLY, TRUE); + } + docBuf.updatTimeStamp(); + } + else if (fStatus == FILE_DELETED) + { + if (::IsIconic(_hSelf)) + ::ShowWindow(_hSelf, SW_SHOWNORMAL); + + if (doCloseOrNot(docBuf.getFileName()) == IDNO) + { + pDocTabArray[j]->activate(i); + if ((pScintillaArray[j]->getNbDoc() == 1) && (_mainWindowStatus & TWO_VIEWS_MASK)) + { + pDocTabArray[j]->closeCurrentDoc(); + hideCurrentView(); + } + else + pDocTabArray[j]->closeCurrentDoc(); + } + } + + bool isReadOnly = pScintillaArray[j]->isCurrentBufReadOnly(); + pScintillaArray[j]->execute(SCI_SETREADONLY, isReadOnly); + //_pDocTab->updateCurrentTabItem(); + } + } + + if (autoUpdate) + { + switchEditViewTo(currentView); + _pDocTab->activate(currentIndex); + } +} + +void Notepad_plus::hideCurrentView() +{ + if (_mainWindowStatus & DOCK_MASK) + { + _pMainSplitter->setWin0(getNonCurrentDocTab()); + } + else // otherwise the main window is the spltter container that we just created + _pMainWindow = getNonCurrentDocTab(); + + _subSplitter.display(false); + _pEditView->display(false); + _pDocTab->display(false); + + // resize the main window + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + //setTitleWith(_pEditView->getCurrentTitle()); + + _mainWindowStatus &= ~TWO_VIEWS_MASK; +} + +bool Notepad_plus::fileClose() +{ + // Notify plugins that current file is about to be closed + SCNotification scnN; + scnN.nmhdr.code = NPPN_FILEBEFORECLOSE; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = 0; + _pluginsManager.notify(&scnN); + + + int res; + bool isDirty = _pEditView->isCurrentDocDirty(); + + //process the fileNamePath into LRF + const char *fileNamePath = _pEditView->getCurrentTitle(); + + if ((!isDirty) && (Buffer::isUntitled(fileNamePath)) && (_pEditView->getNbDoc() == 1) && (!getNonCurrentDocTab()->isVisible())) + return true; + + if (isDirty) + { + if ((res = doSaveOrNot(_pEditView->getCurrentTitle())) == IDYES) + { + if (!fileSave()) // the cancel button of savdialog is pressed + return false; + } + else if (res == IDCANCEL) + return false; + // else IDNO we continue + } + + //si ce n'est pas untited(avec prefixe "new "), on fait le traitement + if (!Buffer::isUntitled(fileNamePath)) + { + _lastRecentFileList.add(fileNamePath); + } + + + if ((_pEditView->getNbDoc() == 1) && (_mainWindowStatus & TWO_VIEWS_MASK)) + { + _pDocTab->closeCurrentDoc(); + hideCurrentView(); + return true; + } + + char fullPath[MAX_PATH]; + strcpy(fullPath, _pDocTab->closeCurrentDoc()); + setTitleWith(fullPath); + + PathRemoveFileSpec(fullPath); + setWorkingDir(fullPath); + + updateStatusBar(); + dynamicCheckMenuAndTB(); + checkDocState(); + _linkTriggered = true; + + return true; +} + +bool Notepad_plus::fileCloseAll() +{ + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + + if (!fileClose()) + return false; + } + + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + return fileClose(); +} + +bool Notepad_plus::fileCloseAllButCurrent() +{ + int curIndex = _pEditView->getCurrentDocIndex(); + _pEditView->activateDocAt(0); + + for (int i = 0 ; i < curIndex ; i++) + if (!fileClose()) + return false; + + if (_pEditView->getNbDoc() > 1) + { + _pDocTab->activate(1); + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + } + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo(getNonCurrentView()); + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + return fileClose(); + } + return true; +} + +void Notepad_plus::reload(const char *fileName) +{ + Utf8_16_Read UnicodeConvertor; + Buffer & buffer = _pEditView->getCurrentBuffer(); + Position pos = buffer._pos; + + FILE *fp = fopen(fileName, "rb"); + if (fp) + { + // It's VERY IMPORTANT to reset the view + _pEditView->execute(SCI_CLEARALL); + + char data[blockSize]; + + size_t lenFile = fread(data, 1, sizeof(data), fp); + while (lenFile > 0) { + lenFile = UnicodeConvertor.convert(data, lenFile); + _pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast(UnicodeConvertor.getNewBuf())); + lenFile = int(fread(data, 1, sizeof(data), fp)); + } + fclose(fp); + + UniMode unicodeMode = static_cast(UnicodeConvertor.getEncoding()); + buffer.setUnicodeMode(unicodeMode); + + if (unicodeMode != uni8Bit) + // Override the code page if Unicode + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + _pEditView->getFocus(); + _pEditView->execute(SCI_SETSAVEPOINT); + _pEditView->execute(EM_EMPTYUNDOBUFFER); + _pEditView->restoreCurrentPos(pos); + } + else + { + char msg[MAX_PATH + 100]; + strcpy(msg, "Can not open file \""); + strcat(msg, fileName); + strcat(msg, "\"."); + ::MessageBox(_hSelf, msg, "ERR", MB_OK); + } +} + +void Notepad_plus::getMainClientRect(RECT &rc) const +{ + Window::getClientRect(rc); + rc.top += _toolBar.getHeight() + 2; + rc.bottom -= _toolBar.getHeight() + 2 +_statusBar.getHeight(); +} + +void Notepad_plus::getToolBarClientRect(RECT &rc) const +{ + Window::getClientRect(rc); + rc.bottom = _toolBar.getHeight(); +} + +void Notepad_plus::getStatusBarClientRect(RECT & rc) const +{ + RECT rectMain; + + getMainClientRect(rectMain); + getClientRect(rc); + rc.top = rectMain.top + rectMain.bottom; + rc.bottom = rc.bottom - rc.top; +} + +void Notepad_plus::dockUserDlg() +{ + if (!_pMainSplitter) + { + _pMainSplitter = new SplitterContainer; + _pMainSplitter->init(_hInst, _hSelf); + + Window *pWindow; + if (_mainWindowStatus & TWO_VIEWS_MASK) + pWindow = &_subSplitter; + else + pWindow = _pDocTab; + + _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45); + } + + if (_mainWindowStatus & TWO_VIEWS_MASK) + _pMainSplitter->setWin0(&_subSplitter); + else + _pMainSplitter->setWin0(_pDocTab); + + _pMainSplitter->display(); + + _mainWindowStatus |= DOCK_MASK; + _pMainWindow = _pMainSplitter; + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); +} + +void Notepad_plus::undockUserDlg() +{ + // a cause de surchargement de "display" + ::ShowWindow(_pMainSplitter->getHSelf(), SW_HIDE); + + if (_mainWindowStatus & TWO_VIEWS_MASK) + _pMainWindow = &_subSplitter; + else + _pMainWindow = _pDocTab; + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + _mainWindowStatus &= ~DOCK_MASK; + (ScintillaEditView::getUserDefineDlg())->display(); + //(_pEditView->getUserDefineDlg())->display(); +} + +void Notepad_plus::docGotoAnotherEditView(bool mode) +{ + if (!(_mainWindowStatus & TWO_VIEWS_MASK)) + { + // if there's dock dialog, it means there's also a splitter container + // we replace the right window by sub-spltter container that we just created + if (_mainWindowStatus & DOCK_MASK) + { + _pMainSplitter->setWin0(&_subSplitter); + _pMainWindow = _pMainSplitter; + } + else // otherwise the main window is the spltter container that we just created + _pMainWindow = &_subSplitter; + + // resize the main window + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + getNonCurrentEditView()->display(); + getNonCurrentDocTab()->display(); + + _pMainWindow->display(); + + // update the main window status + _mainWindowStatus |= TWO_VIEWS_MASK; + } + + // Bon, define the source view and the dest view + // source view + DocTabView *pSrcDocTab; + ScintillaEditView *pSrcEditView; + if (getCurrentView() == MAIN_VIEW) + { + // make dest view + switchEditViewTo(SUB_VIEW); + + // make source view + pSrcDocTab = &_mainDocTab; + pSrcEditView = &_mainEditView; + + } + else + { + // make dest view : _pDocTab & _pEditView + switchEditViewTo(MAIN_VIEW); + + // make source view + pSrcDocTab = &_subDocTab; + pSrcEditView = &_subEditView; + } + + // Maintenant, we begin to manipulate the source and the dest: + // 1. Save the current position of the source view to transfer + pSrcEditView->saveCurrentPos(); + + // 2. Retrieve the current buffer from the source + Buffer & buf = pSrcEditView->getCurrentBuffer(); + + // 3. See if the file to transfer exist in the dest view + // if so, we don't transfer the file(buffer) + // but activate the opened document in the dest view then beat it + int i; + if ( (i = _pDocTab->find(buf.getFileName())) != -1) + { + setTitleWith(_pDocTab->activate(i)); + _pDocTab->getFocus(); + return; + } + + // 4. Transfer the file (buffer) into the dest view + bool isNewDoc2Close = false; + + if ((_pEditView->getNbDoc() == 1) + && Buffer::isUntitled(_pEditView->getCurrentTitle()) + && (!_pEditView->isCurrentDocDirty()) && (_pEditView->getCurrentDocLen() == 0)) + { + isNewDoc2Close = true; + } + + setTitleWith(_pDocTab->newDoc(buf)); + _pDocTab->updateCurrentTabItem(NULL); + + if (isNewDoc2Close) + _pDocTab->closeDocAt(0); + + // 5. If it's the clone mode, we keep the document to transfer + // in the source view (do nothing). If it's the transfer mode + // we remove the file (buffer) from the source view + + if (mode != MODE_CLONE) + { + // Make focus to the source view + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + if (_pEditView->getNbDoc() == 1) + { + // close the current doc in the dest view + _pDocTab->closeCurrentDoc(); + hideCurrentView(); + } + else + { + // close the current doc in the dest view + _pDocTab->closeCurrentDoc(); + + // return to state where the focus is on dest view + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + } + _linkTriggered = true; +} + +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_SYMBOLE)); + if (nextLine < 0) + nextLine = int(_pEditView->execute(sci_marker, lineRetry, 1 << MARK_SYMBOLE)); + + if (nextLine < 0) + return; + + _pEditView->execute(SCI_ENSUREVISIBLEENFORCEPOLICY, nextLine); + _pEditView->execute(SCI_GOTOLINE, nextLine); +} + +int Notepad_plus::switchEditViewTo(int gid) +{ + int oldView = getCurrentView(); + _pDocTab = (gid == MAIN_VIEW)?&_mainDocTab:&_subDocTab; + _pEditView = (gid == MAIN_VIEW)?&_mainEditView:&_subEditView; + _pEditView->beSwitched(); + _pEditView->getFocus(); + + checkDocState(); + setTitleWith(_pEditView->getCurrentTitle()); + setLangStatus(_pEditView->getCurrentDocType()); + updateStatusBar(); + dynamicCheckMenuAndTB(); + return oldView; +} + +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 uni8Bit : id = IDM_FORMAT_ANSI; break; + case uniUTF8 : id = IDM_FORMAT_UTF_8; break; + case uni16BE : id = IDM_FORMAT_UCS_2BE; break; + case uni16LE : id = IDM_FORMAT_UCS_2LE; break; + } + if (id != -1) + { + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_FORMAT_ANSI, IDM_FORMAT_UCS_2LE, id, MF_BYCOMMAND); + + //if (um != uni8Bit) + checkMenuItem(IDM_FORMAT_AS_UTF_8, FALSE); + enableCommand(IDM_FORMAT_AS_UTF_8, (um == uni8Bit), MENU); + } + else + { + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_FORMAT_ANSI, IDM_FORMAT_UCS_2LE, IDM_FORMAT_ANSI, MF_BYCOMMAND); + enableCommand(IDM_FORMAT_AS_UTF_8, true, MENU); + checkMenuItem(IDM_FORMAT_AS_UTF_8, true); + } +} + +static bool isInList(string word, const vector & wordArray) +{ + for (size_t i = 0 ; i < wordArray.size() ; i++) + if (wordArray[i] == word) + return true; + return false; +}; + +void Notepad_plus::autoCompFromCurrentFile() +{ + int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS)); + int startPos = int(_pEditView->execute(SCI_WORDSTARTPOSITION, curPos, true)); + + if (curPos == startPos) + return; + + char beginChars[256]; + + _pEditView->getText(beginChars, startPos, curPos); + + string expr("\\<"); + expr += beginChars; + expr += "[^ \\t.,;:\"()=<>'+!\\[\\]]*"; + + //::MessageBox(NULL, expr.c_str(), "", MB_OK); + + int docLength = int(_pEditView->execute(SCI_GETLENGTH)); + + int flags = SCFIND_WORDSTART | SCFIND_MATCHCASE | SCFIND_REGEXP | SCFIND_POSIX; + + _pEditView->execute(SCI_SETTARGETSTART, 0); + _pEditView->execute(SCI_SETTARGETEND, docLength); + _pEditView->execute(SCI_SETSEARCHFLAGS, flags); + + vector wordArray; + + int posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str())); + + while (posFind != -1) + { + int wordStart = int(_pEditView->execute(SCI_GETTARGETSTART)); + int wordEnd = int(_pEditView->execute(SCI_GETTARGETEND)); + //int foundTextLen = wordEnd - wordStart; + char w[256]; + _pEditView->getText(w, wordStart, wordEnd); + + if (strcmp(w, beginChars)) + if (!isInList(w, wordArray)) + wordArray.push_back(w); + + _pEditView->execute(SCI_SETTARGETSTART, wordEnd/*posFind + foundTextLen*/); + _pEditView->execute(SCI_SETTARGETEND, docLength); + posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str())); + } + if (wordArray.size() == 0) return; + + if (wordArray.size() == 1) + { + _pEditView->execute(SCI_SETTARGETSTART, startPos); + _pEditView->execute(SCI_SETTARGETEND, curPos); + _pEditView->execute(SCI_REPLACETARGETRE, wordArray[0].length(), (LPARAM)wordArray[0].c_str()); + + _pEditView->execute(SCI_GOTOPOS, startPos + wordArray[0].length()); + return; + } + + sort(wordArray.begin(), wordArray.end()); + + string words(""); + + for (size_t i = 0 ; i < wordArray.size() ; i++) + { + words += wordArray[i]; + if (i != wordArray.size()-1) + words += " "; + } + + _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' ')); + _pEditView->execute(SCI_AUTOCSETIGNORECASE, 3); + _pEditView->execute(SCI_AUTOCSHOW, curPos - startPos, WPARAM(words.c_str())); + +} + +void Notepad_plus::showAutoComp() +{ + int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS)); + int line = _pEditView->getCurrentLineNumber(); + int debutLinePos = int(_pEditView->execute(SCI_POSITIONFROMLINE, line )); + int debutMotPos = curPos; + + + char c = char(_pEditView->execute(SCI_GETCHARAT, debutMotPos-1)); + while ((debutMotPos>0)&&(debutMotPos>=debutLinePos)&&((isalnum(c))||(c=='_'))) + { + debutMotPos--; + c = char(_pEditView->execute(SCI_GETCHARAT, debutMotPos-1)); + } + LangType langType = _pEditView->getCurrentDocType(); + if ((langType == L_RC) || (langType == L_HTML) || (langType == L_SQL)) + { + int typeIndex = LANG_INDEX_INSTR; + + const char *pKeywords = (NppParameters::getInstance())->getWordList(langType, typeIndex); + if (pKeywords) + { + _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' ')); + //_pEditView->execute(SCI_AUTOCSETTYPESEPARATOR, WPARAM('(')); + _pEditView->execute(SCI_AUTOCSETIGNORECASE, 3); + _pEditView->execute(SCI_AUTOCSHOW, curPos-debutMotPos, WPARAM(pKeywords)); + } + } + else + { + char nppPath[MAX_PATH]; + strcpy(nppPath, _nppPath); + PathRemoveFileSpec(nppPath); + string fullFileName = nppPath; + string fileName; + getApiFileName(langType, fileName); + fileName += ".api"; + fullFileName += "\\plugins\\APIs\\"; + fullFileName += fileName; + + FILE* f = fopen( fullFileName.c_str(), "r" ); + + if (f) + { + fseek( f, 0, SEEK_END ); + size_t sz = ftell( f ); + fseek( f, 0, SEEK_SET ); + char* pData = new char[sz+1]; + size_t nbChar = fread(pData, 1, sz, f); + pData[nbChar] = '\0'; + fclose( f ); + + _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM('\n')); + //_pEditView->execute(SCI_AUTOCSETTYPESEPARATOR, WPARAM('(')); + _pEditView->execute(SCI_AUTOCSETIGNORECASE, 3); + _pEditView->execute(SCI_AUTOCSHOW, curPos-debutMotPos, WPARAM(pData)); + delete[] pData; + } + } +} + +void Notepad_plus::changeMenuLang(string & pluginsTrans, string & windowTrans) +{ + if (!_nativeLang) return; + + HMENU hMenu = ::GetMenu(_hSelf); + TiXmlNode *mainMenu = _nativeLang->FirstChild("Menu"); + if (!mainMenu) return; + + mainMenu = mainMenu->FirstChild("Main"); + if (!mainMenu) return; + + TiXmlNode *entriesRoot = mainMenu->FirstChild("Entries"); + if (!entriesRoot) return; + + const char *idName = NULL; + for (TiXmlNode *childNode = entriesRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int id; + if (element->Attribute("id", &id)) + { + const char *name = element->Attribute("name"); + ::ModifyMenu(hMenu, id, MF_BYPOSITION, 0, name); + } + else if (idName = element->Attribute("idName")) + { + const char *name = element->Attribute("name"); + if (!strcmp(idName, "Plugins")) + { + pluginsTrans = name; + } + else if (!strcmp(idName, "Window")) + { + windowTrans = name; + } + } + } + + TiXmlNode *menuCommandsRoot = mainMenu->FirstChild("Commands"); + + for (TiXmlNode *childNode = menuCommandsRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int id; + element->Attribute("id", &id); + const char *name = element->Attribute("name"); + ::ModifyMenu(hMenu, id, MF_BYCOMMAND, id, name); + } + + TiXmlNode *subEntriesRoot = mainMenu->FirstChild("SubEntries"); + + for (TiXmlNode *childNode = subEntriesRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int x, y; + element->Attribute("posX", &x); + element->Attribute("posY", &y); + const char *name = element->Attribute("name"); + ::ModifyMenu(::GetSubMenu(hMenu, x), y, MF_BYPOSITION, 0, name); + } + ::DrawMenuBar(_hSelf); +} +/* +const char * Notepad_plus::getNativeTip(int btnID) +{ + if (!_nativeLang) return NULL; + + TiXmlNode *tips = _nativeLang->FirstChild("Tips"); + if (!tips) return NULL; + + for (TiXmlNode *childNode = tips->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int id; + element->Attribute("id", &id); + if (id == btnID) + return element->Attribute("name"); + } + return NULL; +} +*/ + +void Notepad_plus::changeConfigLang() +{ + if (!_nativeLang) return; + + TiXmlNode *styleConfDlgNode = _nativeLang->FirstChild("Dialog"); + if (!styleConfDlgNode) return; + + styleConfDlgNode = styleConfDlgNode->FirstChild("StyleConfig"); + if (!styleConfDlgNode) return; + + HWND hDlg = _configStyleDlg.getHSelf(); + // Set Title + const char *titre = (styleConfDlgNode->ToElement())->Attribute("title"); + if ((titre && titre[0]) && hDlg) + ::SetWindowText(hDlg, titre); + + for (TiXmlNode *childNode = styleConfDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } + hDlg = _configStyleDlg.getHSelf(); + styleConfDlgNode = styleConfDlgNode->FirstChild("SubDialog"); + + for (TiXmlNode *childNode = styleConfDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } +} + +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) + ::SetWindowText(hItem, translatedText[i]); + } + } +} + +void Notepad_plus::changeUserDefineLang() +{ + if (!_nativeLang) return; + + TiXmlNode *userDefineDlgNode = _nativeLang->FirstChild("Dialog"); + if (!userDefineDlgNode) return; + + userDefineDlgNode = userDefineDlgNode->FirstChild("UserDefine"); + if (!userDefineDlgNode) return; + + UserDefineDialog *userDefineDlg = _pEditView->getUserDefineDlg(); + + HWND hDlg = userDefineDlg->getHSelf(); + // Set Title + const char *titre = (userDefineDlgNode->ToElement())->Attribute("title"); + if (titre && titre[0]) + ::SetWindowText(hDlg, titre); + + // pour ses propres controls + const int nbControl = 9; + const char *translatedText[nbControl]; + for (int i = 0 ; i < nbControl ; i++) + translatedText[i] = NULL; + + for (TiXmlNode *childNode = userDefineDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + 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"}; + + //int **idArrays[nbDlg] = {(int **)folderID, (int **)keywordsID, (int **)commentID, (int **)operatorID}; + + 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; + } + } + TiXmlNode *node = userDefineDlgNode->FirstChild(nodeNameArray[i]); + + if (node) + { + // Set Title + titre = (node->ToElement())->Attribute("title"); + if (titre &&titre[0]) + userDefineDlg->setTabName(i, titre); + + for (TiXmlNode *childNode = node->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } + } + } +} + +void Notepad_plus::changePrefereceDlgLang() +{ + changeDlgLang(_preference.getHSelf(), "Preference"); + + char title[64]; + + changeDlgLang(_preference._barsDlg.getHSelf(), "Global", title); + if (*title) + _preference._ctrlTab.renameTab("Global", title); + + changeDlgLang(_preference._marginsDlg.getHSelf(), "Scintillas", title); + if (*title) + _preference._ctrlTab.renameTab("Scintillas", title); + + changeDlgLang(_preference._defaultNewDocDlg.getHSelf(), "NewDoc", title); + if (*title) + _preference._ctrlTab.renameTab("NewDoc", title); + + changeDlgLang(_preference._fileAssocDlg.getHSelf(), "FileAssoc", title); + if (*title) + _preference._ctrlTab.renameTab("FileAssoc", title); + + changeDlgLang(_preference._langMenuDlg.getHSelf(), "LangMenu", title); + if (*title) + _preference._ctrlTab.renameTab("LangMenu", title); + + changeDlgLang(_preference._printSettingsDlg.getHSelf(), "Print1", title); + if (*title) + _preference._ctrlTab.renameTab("Print1", title); + + changeDlgLang(_preference._printSettings2Dlg.getHSelf(), "Print2", title); + if (*title) + _preference._ctrlTab.renameTab("Print2", title); + + changeDlgLang(_preference._settingsDlg.getHSelf(), "MISC", title); + if (*title) + _preference._ctrlTab.renameTab("MISC", title); + +} + +TiXmlNode * searchDlgNode(TiXmlNode *node, const char *dlgTagName) +{ + TiXmlNode *dlgNode = node->FirstChild(dlgTagName); + if (dlgNode) return dlgNode; + for (TiXmlNode *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 (!_nativeLang) return false; + + TiXmlNode *dlgNode = _nativeLang->FirstChild("Dialog"); + if (!dlgNode) return false; + + dlgNode = searchDlgNode(dlgNode, dlgTagName); + if (!dlgNode) return false; + + // Set Title + const char *titre = (dlgNode->ToElement())->Attribute("title"); + if ((titre && titre[0]) && hDlg) + { + ::SetWindowText(hDlg, titre); + if (title) + strcpy(title, titre); + } + + // Set the text of child control + for (TiXmlNode *childNode = dlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } + return true; +} + +static string extractSymbol(char prefix, const char *str2extract) +{ + bool found = false; + char extracted[128] = ""; + + for (size_t i = 0, j = 0 ; i < strlen(str2extract) ; i++) + { + if (found) + { + if (!str2extract[i] || str2extract[i] == ' ') + { + extracted[j] = '\0'; + return string(extracted); + } + extracted[j++] = str2extract[i]; + + } + else + { + if (!str2extract[i]) + return ""; + + if (str2extract[i] == prefix) + found = true; + } + } + return string(extracted); +}; + +bool Notepad_plus::doBlockComment() +{ + const char *commentLineSybol; + string symbol; + + Buffer & buf = _pEditView->getCurrentBuffer(); + if (buf._lang == L_USER) + { + UserLangContainer & userLangContainer = NppParameters::getInstance()->getULCFromName(buf._userLangExt); + //::MessageBox(NULL, userLangContainer._keywordLists[4], "User", MB_OK); + symbol = extractSymbol('0', userLangContainer._keywordLists[4]); + commentLineSybol = symbol.c_str(); + } + else + commentLineSybol = buf.getCommentLineSymbol(); + + + if ((!commentLineSybol) || (!commentLineSybol[0])) + return false; + + string comment(commentLineSybol); + comment += " "; + string long_comment = comment; + + char linebuf[1000]; + 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) >= static_cast(sizeof(linebuf))) // Avoid buffer size problems + continue; + /*if (props.GetInt(comment_at_line_start.c_str())) { + GetRange(wEditor, lineIndent, lineEnd, linebuf); + } else*/ + { + lineIndent = _pEditView->execute(SCI_GETLINEINDENTPOSITION, i); + _pEditView->getText(linebuf, lineIndent, lineEnd); + } + // empty lines are not commented + if (strlen(linebuf) < 1) + continue; + if (memcmp(linebuf, comment.c_str(), comment_length - 1) == 0) + { + if (memcmp(linebuf, long_comment.c_str(), comment_length) == 0) + { + // removing comment with space after it + _pEditView->execute(SCI_SETSEL, lineIndent, lineIndent + comment_length); + _pEditView->execute(SCI_REPLACESEL, 0, (WPARAM)""); + if (i == selStartLine) // is this the first selected line? + selectionStart -= comment_length; + selectionEnd -= comment_length; // every iteration + continue; + } + else + { + // removing comment _without_ space + _pEditView->execute(SCI_SETSEL, lineIndent, lineIndent + comment_length - 1); + _pEditView->execute(SCI_REPLACESEL, 0, (WPARAM)""); + if (i == selStartLine) // is this the first selected line? + selectionStart -= (comment_length - 1); + selectionEnd -= (comment_length - 1); // every iteration + continue; + } + } + if (i == selStartLine) // is this the first selected line? + selectionStart += comment_length; + selectionEnd += comment_length; // every iteration + _pEditView->execute(SCI_INSERTTEXT, lineIndent, (WPARAM)long_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 char *commentStart; + const char *commentEnd; + + string symbolStart; + string symbolEnd; + + Buffer & buf = _pEditView->getCurrentBuffer(); + if (buf._lang == L_USER) + { + UserLangContainer & userLangContainer = NppParameters::getInstance()->getULCFromName(buf._userLangExt); + symbolStart = extractSymbol('1', userLangContainer._keywordLists[4]); + commentStart = symbolStart.c_str(); + symbolEnd = extractSymbol('2', userLangContainer._keywordLists[4]); + commentEnd = symbolEnd.c_str(); + } + else + { + commentStart = _pEditView->getCurrentBuffer().getCommentStart(); + commentEnd = _pEditView->getCurrentBuffer().getCommentEnd(); + } + + if ((!commentStart) || (!commentStart[0])) + return false; + if ((!commentEnd) || (!commentEnd[0])) + return false; + + string start_comment(commentStart); + string end_comment(commentEnd); + string white_space(" "); + + 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); + + char linebuf[1000]; + _pEditView->getText(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->execute(SCI_INSERTTEXT, selectionStart, (WPARAM)start_comment.c_str()); + selectionEnd += start_comment_length; + selectionStart += start_comment_length; + _pEditView->execute(SCI_INSERTTEXT, selectionEnd, (WPARAM)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::addCurrentMacro() +{ + vector & theMacros = (NppParameters::getInstance())->getMacroList(); + + MacroShortcut ms(_macro); + ms.init(_hInst, _hSelf); + if (ms.doDialog() != -1) + { + theMacros.push_back(ms); + HMENU hMacroMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_MACRO); + int const posBase = 3; + int nbMacro = theMacros.size(); + if (nbMacro == 1) + ::InsertMenu(hMacroMenu, posBase + 1, MF_BYPOSITION, (unsigned int)-1, 0); + //char menuString[64]; + //sprintf(menuString, "%s%s%s", ms._name, "\t", ms.toString().c_str()); + ::InsertMenu(hMacroMenu, posBase + 1 + nbMacro, MF_BYPOSITION, ID_MACRO + nbMacro - 1, ms.toMenuItemString().c_str()); + _isMacrosScModified = true; + _accelerator.uptdateShortcuts(); + 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(const char *fileName) +{ + if (!fileName) return false; + int i = - 1; + int iView; + + if ((i = _mainDocTab.find(fileName)) != -1) + { + iView = MAIN_VIEW; + } + else if ((i = _subDocTab.find(fileName)) != -1) + { + iView = SUB_VIEW; + } + + if (i != -1) + { + switchEditViewTo(iView); + setTitleWith(_pDocTab->activate(i)); + _pEditView->getFocus(); + return true; + } + return false; +} + +ToolBarButtonUnit toolBarIcons[] = { + //{IDM_FILE_NEW, IDI_NEW_OFF_ICON, IDI_NEW_ON_ICON, IDI_NEW_OFF_ICON, STD_FILENEW}, + {IDM_FILE_NEW, IDI_NEW_OFF_ICON, IDI_NEW_ON_ICON, IDI_NEW_OFF_ICON, -1}, + //{IDM_FILE_OPEN, IDI_OPEN_OFF_ICON, IDI_OPEN_ON_ICON, IDI_NEW_OFF_ICON, STD_FILEOPEN}, + {IDM_FILE_OPEN, IDI_OPEN_OFF_ICON, IDI_OPEN_ON_ICON, IDI_NEW_OFF_ICON, -1}, + //{IDM_FILE_SAVE, IDI_SAVE_OFF_ICON, IDI_SAVE_ON_ICON, IDI_SAVE_DISABLE_ICON, STD_FILESAVE}, + {IDM_FILE_SAVE, IDI_SAVE_OFF_ICON, IDI_SAVE_ON_ICON, IDI_SAVE_DISABLE_ICON, -1}, + {IDM_FILE_SAVEALL, IDI_SAVEALL_OFF_ICON, IDI_SAVEALL_ON_ICON, IDI_SAVEALL_DISABLE_ICON, -1}, + {IDM_FILE_CLOSE, IDI_CLOSE_OFF_ICON, IDI_CLOSE_ON_ICON, IDI_CLOSE_OFF_ICON, -1}, + {IDM_FILE_CLOSEALL, IDI_CLOSEALL_OFF_ICON, IDI_CLOSEALL_ON_ICON, IDI_CLOSEALL_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, STD_CUT}, + //{IDM_EDIT_COPY, IDI_COPY_OFF_ICON, IDI_COPY_ON_ICON, IDI_COPY_DISABLE_ICON, STD_COPY}, + //{IDM_EDIT_PASTE, IDI_PASTE_OFF_ICON, IDI_PASTE_ON_ICON, IDI_PASTE_DISABLE_ICON, STD_PASTE}, + {IDM_EDIT_CUT, IDI_CUT_OFF_ICON, IDI_CUT_ON_ICON, IDI_CUT_DISABLE_ICON, -1}, + {IDM_EDIT_COPY, IDI_COPY_OFF_ICON, IDI_COPY_ON_ICON, IDI_COPY_DISABLE_ICON, -1}, + {IDM_EDIT_PASTE, IDI_PASTE_OFF_ICON, IDI_PASTE_ON_ICON, IDI_PASTE_DISABLE_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, STD_UNDO}, + //{IDM_EDIT_REDO, IDI_REDO_OFF_ICON, IDI_REDO_ON_ICON, IDI_REDO_DISABLE_ICON, STD_REDOW}, + {IDM_EDIT_UNDO, IDI_UNDO_OFF_ICON, IDI_UNDO_ON_ICON, IDI_UNDO_DISABLE_ICON, -1}, + {IDM_EDIT_REDO, IDI_REDO_OFF_ICON, IDI_REDO_ON_ICON, IDI_REDO_DISABLE_ICON, -1}, + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_SEARCH_REPLACE, IDI_REPLACE_OFF_ICON, IDI_REPLACE_ON_ICON, IDI_REPLACE_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_VIEW_ZOOMOUT, IDI_ZOOMOUT_OFF_ICON, IDI_ZOOMOUT_ON_ICON, IDI_ZOOMOUT_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_VIEW_SYNSCROLLH, IDI_SYNCH_OFF_ICON, IDI_SYNCH_ON_ICON, IDI_SYNCH_DISABLE_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_VIEW_ALL_CHARACTERS, IDI_VIEW_ALL_CHAR_OFF_ICON, IDI_VIEW_ALL_CHAR_ON_ICON, IDI_VIEW_ALL_CHAR_OFF_ICON, -1}, + {IDM_VIEW_INDENT_GUIDE, IDI_VIEW_INDENT_OFF_ICON, IDI_VIEW_INDENT_ON_ICON, IDI_VIEW_INDENT_OFF_ICON, -1}, + {IDM_VIEW_USER_DLG, IDI_VIEW_UD_DLG_OFF_ICON, IDI_VIEW_UD_DLG_ON_ICON, IDI_VIEW_UD_DLG_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + + {IDM_EDIT_STARTRECORDINGMACRO, IDI_STARTRECORD_OFF_ICON, IDI_STARTRECORD_ON_ICON, IDI_STARTRECORD_DISABLE_ICON, -1}, + {IDM_EDIT_STOPRECORDINGMACRO, IDI_STOPRECORD_OFF_ICON, IDI_STOPRECORD_ON_ICON, IDI_STOPRECORD_DISABLE_ICON, -1}, + {IDM_EDIT_PLAYBACKRECORDEDMACRO, IDI_PLAYRECORD_OFF_ICON, IDI_PLAYRECORD_ON_ICON, IDI_PLAYRECORD_DISABLE_ICON, -1}, + {IDM_EDIT_RUNMULTIMACRODLG, IDI_MMPLAY_OFF_ICON, IDI_MMPLAY_ON_ICON, IDI_MMPLAY_DIS_ICON, -1}, + {IDM_EDIT_SAVECURRENTMACRO, IDI_SAVERECORD_OFF_ICON, IDI_SAVERECORD_ON_ICON, IDI_SAVERECORD_DISABLE_ICON, -1}, + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + + //{IDC_BUTTON_PRINT, IDI_PRINT_OFF_ICON, IDI_PRINT_ON_ICON, IDI_PRINT_OFF_ICON, STD_PRINT} + {IDC_BUTTON_PRINT, IDI_PRINT_OFF_ICON, IDI_PRINT_ON_ICON, IDI_PRINT_OFF_ICON, -1} +}; + +int stdIcons[] = {IDR_FILENEW, IDR_FILEOPEN, IDR_FILESAVE, IDR_SAVEALL, IDR_CLOSEFILE, IDR_CLOSEALL, IDR_CUT, IDR_COPY, IDR_PASTE,\ +IDR_UNDO, IDR_REDO, IDR_FIND, IDR_REPLACE, IDR_ZOOMIN, IDR_ZOOMOUT, IDR_SYNCV, IDR_SYNCH,\ +IDR_WRAP, IDR_INVISIBLECHAR, IDR_INDENTGUIDE, IDR_SHOWPANNEL, IDR_STARTRECORD, IDR_STOPRECORD, IDR_PLAYRECORD, IDR_M_PLAYRECORD, IDR_SAVERECORD, IDR_PRINT}; + +void Notepad_plus::getTaskListInfo(TaskListInfo *tli) +{ + int iView = getCurrentView(); + ScintillaEditView & currentView = (iView == MAIN_VIEW)?_mainEditView:_subEditView; + ScintillaEditView & nonCurrentView = (iView == MAIN_VIEW)?_subEditView:_mainEditView; + int nonCurrentiView = (iView == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW; + + size_t currentNbDoc = currentView.getNbDoc(); + size_t nonCurrentNbDoc; + + tli->_currentIndex = 0; + + if (iView == MAIN_VIEW) + { + nonCurrentNbDoc = _subDocTab.isVisible()?_subEditView.getNbDoc():0; + } + else + { + nonCurrentNbDoc = _mainDocTab.isVisible()?_mainEditView.getNbDoc():0; + } + + for (size_t i = 0 ; i < currentNbDoc ; i++) + { + Buffer & b = currentView.getBufferAt(i); + int status = b.isReadOnly()?tb_ro:(b.isDirty()?tb_unsaved:tb_saved); + tli->_tlfsLst.push_back(TaskLstFnStatus(iView,i,b._fullPathName, status)); + } + for (size_t i = 0 ; i < nonCurrentNbDoc ; i++) + { + Buffer & b = nonCurrentView.getBufferAt(i); + int status = b.isReadOnly()?tb_ro:(b.isDirty()?tb_unsaved:tb_saved); + tli->_tlfsLst.push_back(TaskLstFnStatus(nonCurrentiView,i,b._fullPathName, 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: + { + pNppParam->setFontList(hwnd); + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); +/* + OSVERSIONINFO vInfo; + vInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + ::GetVersionEx(&vInfo); + if (vInfo.dwMajorVersion == 4) + nppGUI._doTaskList = false; + else if ((vInfo.dwMajorVersion == 5) && (vInfo.dwMinorVersion == 0)) + nppGUI._doTaskList = false; +*/ + // Menu + string pluginsTrans, windowTrans; + changeMenuLang(pluginsTrans, windowTrans); + + _windowsMenu.init(_hInst, GetMenu(_hSelf), windowTrans.c_str()); + + + vector & shortcuts = pNppParam->getUserShortcuts(); + for (size_t i = 0 ; i < shortcuts.size() ; i++) + { + changeMenuShortcut(shortcuts[i].getID(), shortcuts[i].toString().c_str()); + } + ::DrawMenuBar(_hSelf); + + + _pDocTab = &_mainDocTab; + _pEditView = &_mainEditView; + + const ScintillaViewParams & svp1 = pNppParam->getSVP(SCIV_PRIMARY); + const ScintillaViewParams & svp2 = pNppParam->getSVP(SCIV_SECOND); + + _mainEditView.init(_hInst, hwnd); + _subEditView.init(_hInst, hwnd); + + _mainEditView.display(); + + _invisibleEditView.init(_hInst, hwnd); + _invisibleEditView.execute(SCI_SETUNDOCOLLECTION); + _invisibleEditView.execute(SCI_EMPTYUNDOBUFFER); + _invisibleEditView.attatchDefaultDoc(0); + + // 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.showIndentGuideLine(svp1._indentGuideLineShow); + _subEditView.showIndentGuideLine(svp2._indentGuideLineShow); + + _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.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); + + checkMenuItem(IDM_SETTING_HISTORY_DONT_CHECK, !nppGUI._checkHistoryFiles); + checkMenuItem(IDM_SETTING_TRAYICON, nppGUI._isMinimizedToTray); + checkMenuItem(IDM_SETTING_REMEMBER_LAST_SESSION, nppGUI._rememberLastSession); + + _mainEditView.performGlobalStyles(); + _subEditView.performGlobalStyles(); + + if (pNppParam->hasCustomContextMenu()) + { + _mainEditView.execute(SCI_USEPOPUP, FALSE); + _subEditView.execute(SCI_USEPOPUP, FALSE); + } + + _zoomOriginalValue = _pEditView->execute(SCI_GETZOOM); + _mainEditView.execute(SCI_SETZOOM, svp1._zoom); + _subEditView.execute(SCI_SETZOOM, svp2._zoom); + + int tabBarStatus = nppGUI._tabStatus; + _toReduceTabBar = ((tabBarStatus & TAB_REDUCE) != 0); + _docTabIconList.create(_toReduceTabBar?13:20, _hInst, docTabIconIDs, sizeof(docTabIconIDs)/sizeof(int)); + + _subDocTab.init(_hInst, hwnd, &_subEditView, &_docTabIconList); + + const char * str = _mainDocTab.init(_hInst, hwnd, &_mainEditView, &_docTabIconList); + setTitleWith(str); + + 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); + + //--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, 100); + _statusBar.setPartWidth(STATUSBAR_CUR_POS, 180); + _statusBar.setPartWidth(STATUSBAR_EOF_FORMAT, 80); + _statusBar.setPartWidth(STATUSBAR_UNICODE_TYPE, 100); + _statusBar.setPartWidth(STATUSBAR_TYPING_MODE, 30); + _statusBar.display(willBeShown); + // + checkMenuItem(IDM_VIEW_STATUSBAR, willBeShown); + + _findReplaceDlg.init(_hInst, hwnd, &_pEditView); + _incrementFindDlg.init(_hInst, hwnd, &_findReplaceDlg); + _goToLineDlg.init(_hInst, hwnd, &_pEditView); + _colEditorDlg.init(_hInst, hwnd, &_pEditView); + _aboutDlg.init(_hInst, hwnd); + _runDlg.init(_hInst, hwnd); + _runMacroDlg.init(_hInst, hwnd); + + checkMenuItem(IDM_SETTING_TAB_REPLCESPACE, nppGUI._tabReplacedBySpace); + + _pMainWindow = &_mainDocTab; + + _dockingManager.init(_hInst, hwnd, &_pMainWindow); + + + + //--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); + + dynamicCheckMenuAndTB(); + _mainEditView.defineDocType(L_TXT); + HMENU hMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_FILE); + + int nbLRFile = pNppParam->getNbLRFile(); + + int pos = 16; + _lastRecentFileList.initMenu(hMenu, IDM_FILEMENU_LASTONE + 1, pos); + + for (int i = 0 ; i < nbLRFile ; i++) + { + string * stdStr = pNppParam->getLRFile(i); + if (nppGUI._checkHistoryFiles) + { + if (PathFileExists(stdStr->c_str())) + { + _lastRecentFileList.add(stdStr->c_str()); + } + } + else + { + _lastRecentFileList.add(stdStr->c_str()); + } + } + + if (nppGUI._isMinimizedToTray) + _pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)), ""); + + checkSyncState(); + + + //Languages Menu + hMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_LANGUAGE); + if (nppGUI._excludedLangList.size() > 0) + { + for (size_t i = 0 ; i < nppGUI._excludedLangList.size() ; i++) + { + int cmdID = pNppParam->langTypeToCommandID(nppGUI._excludedLangList[i]._langType); + char itemName[256]; + ::GetMenuString(hMenu, cmdID, itemName, sizeof(itemName), MF_BYCOMMAND); + nppGUI._excludedLangList[i]._cmdID = cmdID; + nppGUI._excludedLangList[i]._langName = itemName; + ::DeleteMenu(hMenu, cmdID, MF_BYCOMMAND); + DrawMenuBar(_hSelf); + } + } + + // Add User Define Languages Entry + pos = ::GetMenuItemCount(hMenu) - 1; + + for (int i = 0 ; i < pNppParam->getNbUserLang() ; i++) + { + UserLangContainer & userLangContainer = pNppParam->getULCFromIndex(i); + ::InsertMenu(hMenu, pos + i , MF_BYPOSITION, IDM_LANG_USER + i + 1, userLangContainer.getName()); + } + + // Macro Menu + std::vector & macros = pNppParam->getMacroList(); + HMENU hMacroMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_MACRO); + size_t const posBase = 4; + 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 + 2, MF_BYPOSITION, ID_MACRO + i, macros[i].toMenuItemString().c_str()); + } + // Run Menu + std::vector & userCommands = pNppParam->getUserCommandList(); + HMENU hRunMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_RUN); + int const runPosBase = 1; + 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 + 2, MF_BYPOSITION, ID_USER_CMD + i, userCommands[i].toMenuItemString().c_str()); + } + + _scintillaCtrls4Plugins.init(_hInst, hwnd); + + // Plugin Manager + NppData nppData; + nppData._nppHandle = _hSelf; + nppData._scintillaMainHandle = _mainEditView.getHSelf(); + nppData._scintillaSecondHandle = _subEditView.getHSelf(); + + _pluginsManager.init(nppData); + _pluginsManager.loadPlugins(); + const char *appDataNpp = pNppParam->getAppDataNppDir(); + if (appDataNpp[0]) + _pluginsManager.loadPlugins(appDataNpp); + + _pluginsManager.setMenu(::GetMenu(_hSelf), pluginsTrans.c_str()); + + // 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); + + // Shortcut Accelerator : should be the last one since it will cacpture all the shortcut + _accelerator.init(::LoadAccelerators(_hInst, MAKEINTRESOURCE(IDR_NPP_ACCELERATORS))); + + if (_accelerator.uptdateShortcuts(hwnd)) + _isCmdScModified = true; + + pNppParam->setAccelerator(&_accelerator); + + //-- Tool Bar Section --// + toolBarStatusType tbStatus = nppGUI._toolBarStatus; + + // TB_LARGE par default + int iconSize = 32; + int menuID = IDM_VIEW_TOOLBAR_ENLARGE; + + if (tbStatus == TB_HIDE) + { + willBeShown = false; + menuID = IDM_VIEW_TOOLBAR_HIDE; + } + else if (tbStatus == TB_SMALL) + { + iconSize = 16; + menuID = IDM_VIEW_TOOLBAR_REDUCE; + } + else if (tbStatus == TB_STANDARD) + { + iconSize = 16; + menuID = IDM_VIEW_TOOLBAR_STANDARD; + } + + _toolBar.init(_hInst, hwnd, iconSize, toolBarIcons, sizeof(toolBarIcons)/sizeof(ToolBarButtonUnit), (tbStatus == TB_STANDARD), stdIcons, sizeof(stdIcons)/sizeof(int)); + _toolBar.display(willBeShown); + checkToolBarMenu(menuID); + changeToolBarIcons(); + + _rebar.init(_hInst, hwnd, &_toolBar); + _rebar.display(tbStatus != TB_HIDE); + + //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); + } + ::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: + { + char name[256]; + strcpy(name, (char *)lParam); + _mainEditView.removeUserLang(name); + _subEditView.removeUserLang(name); + return TRUE; + } + + case WM_RENAME_USERLANG: + { + char oldName[256]; + char newName[256]; + strcpy(oldName, (char *)lParam); + strcpy(newName, (char *)wParam); + _mainEditView.renameUserLang(oldName, newName); + _subEditView.renameUserLang(oldName, 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_FINDINFILES : + { + bool isRecursive = lParam == TRUE; + findInFiles(isRecursive); + return TRUE; + } + + case NPPM_LAUNCHFINDINFILESDLG : + { + const int strSize = 64; + char str[strSize]; + + bool isFirstTime = !_findReplaceDlg.isCreated(); + _findReplaceDlg.doDialog(FIND_DLG, _isRTL); + //if () + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + _pEditView->expandWordSelection(); + + _pEditView->getSelectedText(str, strSize); + _findReplaceDlg.setSearchText(str); + if (isFirstTime) + changeDlgLang(_findReplaceDlg.getHSelf(), "Find"); + _findReplaceDlg.launchFindInFilesDlg(); + + const char *dir = NULL; + char currentDir[MAX_PATH]; + + if (wParam) + dir = (const char *)wParam; + else + { + ::GetCurrentDirectory(MAX_PATH, currentDir); + dir = currentDir; + } + const char *filtre = (lParam?(const char *)lParam:"*.*"); + _findReplaceDlg.setFindInFilesDirFilter(dir, filtre); + return TRUE; + } + + case WM_DOOPEN: + { + doOpen((const char *)lParam); + } + break; + + case NPPM_RELOADFILE: + { + doReload((const char *)lParam, wParam != 0); + } + break; + + case NPPM_SWITCHTOFILE : + { + return switchToFile((const char *)lParam); + } + + case NPPM_SAVECURRENTFILE: + { + return fileSave(); + } + break; + + case NPPM_SAVEALLFILES: + { + return fileSaveAll(); + } + break; + + case WM_GETMINMAXINFO: + { + MINMAXINFO *pmmi = reinterpret_cast(lParam); + + if (_isfullScreen) + { + pmmi->ptMaxSize.x = ::GetSystemMetrics(SM_CXSCREEN) + 2 * ::GetSystemMetrics(SM_CXSIZEFRAME) + 2; + pmmi->ptMaxSize.y = ::GetSystemMetrics(SM_CYSCREEN) + + ::GetSystemMetrics(SM_CYCAPTION) + + ::GetSystemMetrics(SM_CYMENU) + + 2 * ::GetSystemMetrics(SM_CYSIZEFRAME) + + _toolBar.getHeight() + 2 + + 13; + + pmmi->ptMaxTrackSize.x = pmmi->ptMaxSize.x; + pmmi->ptMaxTrackSize.y = pmmi->ptMaxSize.y; + result = 0; // Je sais, c'est bizarre, mais selons le doc... + } + else + { + result = ::DefWindowProc(_hSelf, Message, wParam, lParam); + } + } + break; + + case WM_SIZE: + { + RECT rc; + getToolBarClientRect(rc); + _toolBar.reSizeTo(rc); + + ::SetWindowPos(_rebar.getHSelf(), NULL, 0, 0, LOWORD(lParam), rc.bottom - rc.top, SWP_NOZORDER); + + getStatusBarClientRect(rc); + _statusBar.reSizeTo(rc); + + getMainClientRect(rc); + //_pMainWindow->reSizeTo(rc); + _dockingManager.reSizeTo(rc); + + mkPosIncFindDlg(); + result = TRUE; + } + break; + + case WM_MOVE: + { + redraw(); + mkPosIncFindDlg(); + result = TRUE; + } + break; + + case WM_MOVING: + { + result = FALSE; + } + break; + + case WM_SIZING: + { + result = FALSE; + } + break; + + case WM_COPYDATA : + { + const DWORD LASTBYTEMASK = 0x000000FF; + COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT *)lParam; + LangType lt = LangType(pCopyData->dwData & LASTBYTEMASK); + int ln = pCopyData->dwData >> 8; +//::MessageBox(NULL, (const char *)pCopyData->lpData, "WM_COPYDATA", MB_OK); + FileNameStringSplitter fnss((const char *)pCopyData->lpData); + char *pFn = NULL; + for (int i = 0 ; i < fnss.size() ; i++) + { + pFn = (char *)fnss.getFileName(i); + doOpen((const char *)pFn); + if (lt != L_TXT) + _pEditView->setCurrentDocType(lt); + _pEditView->execute(SCI_GOTOLINE, ln-1); + } + setLangStatus(_pEditView->getCurrentDocType()); + return TRUE; + } + + case WM_COMMAND: + if (HIWORD(wParam) == SCEN_SETFOCUS) + { + switchEditViewTo((lParam == (LPARAM)_mainEditView.getHSelf())?MAIN_VIEW:SUB_VIEW); + } + else + { + if ((lParam == 1) || (lParam == 2)) + { + specialCmd(LOWORD(wParam), lParam); + } + else + command(LOWORD(wParam)); + } + return TRUE; + + case NPPM_GETFULLCURRENTPATH : + case NPPM_GETCURRENTDIRECTORY : + case NPPM_GETFILENAME : + case NPPM_GETNAMEPART : + case NPPM_GETEXTPART : + { + char str[MAX_PATH]; + // par defaut : NPPM_GETCURRENTDIRECTORY + char *fileStr = strcpy(str, _pEditView->getCurrentTitle()); + + 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); + + strcpy((char *)lParam, fileStr); + return TRUE; + } + + case NPPM_GETCURRENTWORD : + { + const int strSize = MAX_PATH; + char str[strSize]; + + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + _pEditView->expandWordSelection(); + + _pEditView->getSelectedText(str, strSize, true); + strcpy((char *)lParam, str); + return TRUE; + } + + case NPPM_GETNPPDIRECTORY : + { + const int strSize = MAX_PATH; + char str[strSize]; + + ::GetModuleFileName(NULL, str, strSize); + PathRemoveFileSpec(str); + strcpy((char *)lParam, str); + return TRUE; + } + + case NPPM_GETCURRENTSCINTILLA : + { + *((int *)lParam) = (_pEditView == &_mainEditView)?0:1; + return TRUE; + } + + case NPPM_GETCURRENTLANGTYPE : + { + *((LangType *)lParam) = _pEditView->getCurrentDocType(); + return TRUE; + } + + case NPPM_SETCURRENTLANGTYPE : + { + _pEditView->setCurrentDocType((LangType)lParam); + return TRUE; + } + + case NPPM_GETNBOPENFILES : + { + int nbDocPrimary = _mainEditView.getNbDoc(); + int nbDocSecond = _subEditView.getNbDoc(); + 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 : + { + if (!wParam) return 0; + + char **fileNames = (char **)wParam; + size_t nbFileNames = lParam; + size_t i = 0; + + for ( ; i < nbFileNames ; i++) + { + strcpy(fileNames[i], _mainEditView.getBufferAt(i).getFileName()); + } + return i; + } + + case NPPM_GETOPENFILENAMESSECOND : + { + if (!wParam) return 0; + + char **fileNames = (char **)wParam; + size_t nbFileNames = lParam; + size_t i = 0; + + for ( ; i < nbFileNames ; i++) + { + strcpy(fileNames[i], _subEditView.getBufferAt(i).getFileName()); + } + return i; + } + + case NPPM_GETOPENFILENAMES : + { + if (!wParam) return 0; + + char **fileNames = (char **)wParam; + int nbFileNames = lParam; + + int j = 0; + for (size_t i = 0 ; i < _mainEditView.getNbDoc() && j < nbFileNames ; i++) + { + strcpy(fileNames[j++], _mainEditView.getBufferAt(i).getFileName()); + } + for (size_t i = 0 ; i < _subEditView.getNbDoc() && j < nbFileNames ; i++) + { + strcpy(fileNames[j++], _subEditView.getBufferAt(i).getFileName()); + } + 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(_mainEditView,_subEditView)); + } + else + { + for(int idx = 0; idx < (int)tli->_tlfsLst.size(); ++idx) + { + if(tli->_tlfsLst[idx]._iView == getCurrentView() && + tli->_tlfsLst[idx]._docIndex == getCurrentEditView()->getCurrentDocIndex()) + { + 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 NPPM_GETNBSESSIONFILES : + { + const char *sessionFileName = (const char *)lParam; + if ((!sessionFileName) || (sessionFileName[0] == '\0')) return 0; + Session session2Load; + if (pNppParam->loadSession(session2Load, sessionFileName)) + { + return session2Load._files.size(); + } + return 0; + } + + case NPPM_GETSESSIONFILES : + { + const char *sessionFileName = (const char *)lParam; + char **sessionFileArray = (char **)wParam; + + if ((!sessionFileName) || (sessionFileName[0] == '\0')) return FALSE; + + Session session2Load; + if (pNppParam->loadSession(session2Load, sessionFileName)) + { + for (size_t i = 0 ; i < session2Load._files.size() ; ) + { + const char *pFn = session2Load._files[i]._fileName.c_str(); + // + // To add : position + // + strcpy(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, 0, 0); + pSci->execute(SCI_ADDTEXT, length, (LPARAM)UnicodeConvertor.getNewBuf()); + pSci->execute(SCI_EMPTYUNDOBUFFER, 0, 0); + + pSci->execute(SCI_SETCODEPAGE, 0, 0); + + /* set cursor position */ + pSci->execute(SCI_GOTOPOS, 0, 0); + + /* 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 = (char*)new char[length]; + pSci->execute(SCI_GETTEXT, length, (LPARAM)buffer); + + length = UnicodeConvertor.convert(buffer, length-1); + + /* set text in target */ + pSci->execute(SCI_CLEARALL, 0, 0); + pSci->execute(SCI_ADDTEXT, length, (LPARAM)UnicodeConvertor.getNewBuf()); + + pSci->execute(SCI_EMPTYUNDOBUFFER, 0, 0); + + /* set cursor position */ + pSci->execute(SCI_GOTOPOS, 0, 0); + + /* clean buffer */ + delete [] buffer; + + /* set new encoding if BOM was changed by other programms */ + UniMode um = UnicodeConvertor.getEncoding(); + (pSci->getCurrentBuffer()).setUnicodeMode(um); + checkUnicodeMenuItems(um); + + // Override the code page if Unicode + if (um != uni8Bit) + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + return um; + } + + case NPPM_ACTIVATEDOC : + { + int whichView = ((wParam != MAIN_VIEW) && (wParam != SUB_VIEW))?getCurrentView():wParam; + int index = lParam; + + switchEditViewTo(whichView); + activateDoc(index); + + return TRUE; + } + + 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(); + + 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 + { + if ( currLine == _pEditView->getCurrentLineNumber() ) // line no. not changed? + break; // exit + + // save current line + currLine = _pEditView->getCurrentLineNumber(); + + // eof? + if ((currLine >= lastLine) || (currLine <= 0)) + 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 (!_subDocTab.isVisible()) + return -1; + return _subEditView.getCurrentDocIndex(); + } + else //MAIN_VIEW + { + if (!_mainDocTab.isVisible()) + return -1; + return _mainEditView.getCurrentDocIndex(); + } + } + + case NPPM_SETSTATUSBAR : + { + char *str2set = (char *)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 char *)lParam); + return TRUE; + } + + case NPPM_SAVECURRENTSESSION : + { + return (LRESULT)fileSaveSession(0, NULL, (const char *)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 : + { + _isCmdScModified = true; + changeMenuShortcut(lParam, (const char *)wParam); + ::DrawMenuBar(_hSelf); + return TRUE; + } + + case NPPM_INTERNAL_MACROLIST_MODIFIED : + { + _isMacrosScModified = true; + return TRUE; + } + + case NPPM_INTERNAL_USERCMDLIST_MODIFIED : + { + _isUserCmdScModified = true; + return TRUE; + } + + case NPPM_INTERNAL_SCINTILLAKEYMODIFIED : + { + _isScintillaKeyModified = true; + return TRUE; + } + + case NPPM_INTERNAL_PLUGINCMDLIST_MODIFIED : + { + _isPluginCmdScModified = true; + return TRUE; + } + + // 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())) + { + POINT p; + ::GetCursorPos(&p); + ContextMenu scintillaContextmenu; + vector tmp = pNppParam->getContextMenuItems(); + vector isEnable; + for (size_t i = 0 ; i < tmp.size() ; i++) + { + if (tmp[i]._itemName == "") + getNameStrFromCmd(tmp[i]._cmdID, tmp[i]._itemName); + isEnable.push_back((::GetMenuState(::GetMenu(_hSelf), 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 WM_CHECKTORENEW : + //printStr("bourges ton cul !!!"); + //checkModifiedDocument(); + //return TRUE; + + case WM_ACTIVATEAPP : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + if (LOWORD(wParam) && (nppgui._fileAutoDetection != cdDisabled)) + { + checkModifiedDocument(); + return FALSE; + } + //return ::DefWindowProc(hwnd, Message, wParam, lParam); + break; + } + + + case WM_ACTIVATE : + _pEditView->getFocus(); + return TRUE; + + case WM_DROPFILES: + { + dropFiles(reinterpret_cast(wParam)); + return TRUE; + } + + case WM_UPDATESCINTILLAS: + { + _mainEditView.defineDocType(_mainEditView.getCurrentDocType()); + _subEditView.defineDocType(_subEditView.getCurrentDocType()); + _mainEditView.performGlobalStyles(); + _subEditView.performGlobalStyles(); + return TRUE; + } + + //case WM_ENDSESSION: + case WM_QUERYENDSESSION: + case WM_CLOSE: + { + if (_isfullScreen) + fullScreenToggle(); + + const NppGUI & nppgui = pNppParam->getNppGUI(); + + Session currentSession; + if (nppgui._rememberLastSession) + getCurrentOpenedFiles(currentSession); + + if (fileCloseAll()) + { + _lastRecentFileList.saveLRFL(); + + saveScintillaParams(SCIV_PRIMARY); + saveScintillaParams(SCIV_SECOND); + saveGUIParams(); + saveUserDefineLangs(); + saveShortcuts(); + if (nppgui._rememberLastSession) + saveSession(currentSession); + + ::DestroyWindow(hwnd); + } + return TRUE; + } + + case WM_DESTROY: + { + killAllChildren(); + ::PostQuitMessage(0); + 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)), ""); + + _pTrayIco->doTrayIcon(ADD); + ::ShowWindow(hwnd, SW_HIDE); + return 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 WM_INITMENU: + _windowsMenu.initMenu((HMENU)wParam, _pEditView); + return TRUE; +*/ + case WM_INITMENUPOPUP: + _windowsMenu.initPopupMenu((HMENU)wParam, _pEditView); + return TRUE; +/* + case WM_UNINITMENUPOPUP: + _windowsMenu.uninitPopupMenu((HMENU)wParam, _pEditView); + 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: + { + _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((char*)lParam, SW_SHOW); + return TRUE; + } + + case NPPM_DMMGETPLUGINHWNDBYNAME : //(const char *windowName, const char *moduleName) + { + if (!lParam) return NULL; + + char *moduleName = (char *)lParam; + char *windowName = (char *)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 (stricmp(moduleName, tbData[j]->pszModuleName) == 0) + { + if (!windowName) + return (LRESULT)tbData[j]->hClient; + else if (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(::GetMenu(_hSelf), (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->setCurrentDocState(true); + return TRUE; + } + + case NPPM_GETENABLETHEMETEXTUREFUNC : + { + return (LRESULT)pNppParam->getEnableThemeDlgTexture(); + } + + case NPPM_GETPLUGINSCONFIGDIR : + { + if (!lParam || !wParam) + return FALSE; + + const char *pluginsConfigDirPrefix = pNppParam->getAppDataNppDir(); + + if (!pluginsConfigDirPrefix[0]) + pluginsConfigDirPrefix = pNppParam->getNppPath(); + + const char *secondPart = "plugins\\Config"; + + size_t len = (size_t)wParam; + if (len < strlen(pluginsConfigDirPrefix) + strlen(secondPart)) + return FALSE; + + char *pluginsConfigDir = (char *)lParam; + strcpy(pluginsConfigDir, pluginsConfigDirPrefix); + + ::PathAppend(pluginsConfigDir, secondPart); + return TRUE; + } + + 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: + { + int origPos = _pEditView->getCurrentDocIndex(); + for (int i=0, n=nmdlg->nItems; iItems[i]); + fileSave(); + } + activateDoc(origPos); + nmdlg->processed = TRUE; + } + break; + case WDT_CLOSE: + { + for (int i=0, n=nmdlg->nItems; iItems[i]; + activateDoc(pos); + if (!fileClose()) + break; + for (int j=i+1; jItems[j] > pos) + --nmdlg->Items[j]; + nmdlg->Items[i] = 0xFFFFFFFF; // indicate file was closed + } + nmdlg->processed = TRUE; + } + break; + case WDT_SORT: + _pEditView->arrangeBuffers(nmdlg->nItems, nmdlg->Items); + nmdlg->processed = TRUE; + for (int i = _pEditView->getNbDoc()-1 ; i >= 0 ; --i) + { + Buffer & docBuf = _pEditView->getBufferAt(i); + _pDocTab->updateTabItem(i, PathFindFileName(docBuf.getFileName())); + } + activateDoc(nmdlg->curSel); + 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_GETMINMAXINFO : // It's the 1st? msg (even before WM_NCCREATE) + { + if (isFirstGetMinMaxInfoMsg) + { + isFirstGetMinMaxInfoMsg = false; + return ::DefWindowProc(hwnd, Message, wParam, lParam); + } + else + return ((Notepad_plus *)::GetWindowLong(hwnd, GWL_USERDATA))->runProc(hwnd, Message, wParam, lParam); + } + + 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; + ::SetWindowLong(hwnd, GWL_USERDATA, (LONG)pM30ide); + + return TRUE; + } + + default : + { + return ((Notepad_plus *)::GetWindowLong(hwnd, GWL_USERDATA))->runProc(hwnd, Message, wParam, lParam); + } + } +} + +void Notepad_plus::fullScreenToggle() +{ + HWND wTaskBar = FindWindow("Shell_TrayWnd", ""); + _isfullScreen = !_isfullScreen; + if (_isfullScreen) + { + ::SystemParametersInfo(SPI_GETWORKAREA, 0, &_rcWorkArea, 0); + ::SystemParametersInfo(SPI_SETWORKAREA, 0, 0, SPIF_SENDCHANGE); + ::ShowWindow(wTaskBar, SW_HIDE); + + _winPlace.length = sizeof(_winPlace); + ::GetWindowPlacement(_hSelf, &_winPlace); + + int topStuff = ::GetSystemMetrics(SM_CYMENU) + ::GetSystemMetrics(SM_CYEDGE); + topStuff += ::GetSystemMetrics(SM_CYCAPTION); + topStuff += _toolBar.getHeight() + 2; + + ::SetWindowPos(_hSelf, HWND_TOP, + -::GetSystemMetrics(SM_CXSIZEFRAME) - 1, + -topStuff - 2, + ::GetSystemMetrics(SM_CXSCREEN) + 2 * ::GetSystemMetrics(SM_CXSIZEFRAME) + 2, + ::GetSystemMetrics(SM_CYSCREEN) + topStuff + ::GetSystemMetrics(SM_CYSIZEFRAME) + 3, + 0); + } + else + { + ::ShowWindow(wTaskBar, SW_SHOW); + if (_winPlace.length) + { + ::SystemParametersInfo(SPI_SETWORKAREA, 0, &_rcWorkArea, 0); + if (_winPlace.showCmd == SW_SHOWMAXIMIZED) + { + ::ShowWindow(_hSelf, SW_RESTORE); + ::ShowWindow(_hSelf, SW_SHOWMAXIMIZED); + } + else + { + ::SetWindowPlacement(_hSelf, &_winPlace); + } + } + } + ::SetForegroundWindow(_hSelf); +} + + +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 (!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::changeMenuShortcut(unsigned long cmdID, const char *shortcutStr) +{ + char cmdName[64]; + HMENU hMenu = ::GetMenu(_hSelf); + ::GetMenuString(hMenu, cmdID, cmdName, sizeof(cmdName), MF_BYCOMMAND); + + size_t i = 0; + for ( ; i < strlen(cmdName) ; i++) + { + if (cmdName[i] == '\t') + break; + } + cmdName[++i] = '\0'; + string itemStr = cmdName; + itemStr += shortcutStr; + ::ModifyMenu(hMenu, cmdID, MF_BYCOMMAND, cmdID, itemStr.c_str()); +} + +void Notepad_plus::getCurrentOpenedFiles(Session & session) +{ + _pEditView->saveCurrentPos(); + session._actifIndex = _mainEditView.getCurrentDocIndex(); + + int currentDocIndex = _mainEditView.getCurrentDocIndex(); + + for (size_t i = 0 ; i < _mainEditView.getNbDoc() ; i++) + { + const Buffer & buf = _mainEditView.getBufferAt((size_t)i); + if (PathFileExists(buf._fullPathName)) + { + sessionFileInfo sfi(buf._fullPathName, buf._pos); + + _mainEditView.activateDocAt(i); + int maxLine = _mainEditView.execute(SCI_GETLINECOUNT); + for (int j = 0 ; j < maxLine ; j++) + { + if (_mainEditView.execute(SCI_MARKERGET, j)) + { + sfi.marks.push_back(j); + } + } + + session._files.push_back(sfi); + } + } + _mainEditView.activateDocAt(currentDocIndex); + + currentDocIndex = _subEditView.getCurrentDocIndex(); + for (size_t i = 0 ; i < _subEditView.getNbDoc() ; i++) + { + const Buffer & buf = _subEditView.getBufferAt((size_t)i); + if (PathFileExists(buf._fullPathName)) + { + sessionFileInfo sfi(buf._fullPathName, buf._pos); + + _subEditView.activateDocAt(i); + int maxLine = _subEditView.execute(SCI_GETLINECOUNT); + for (int j = 0 ; j < maxLine ; j++) + { + if (_subEditView.execute(SCI_MARKERGET, j)) + { + sfi.marks.push_back(j); + } + } + session._files.push_back(sfi); + } + } + _subEditView.activateDocAt(currentDocIndex); +} + +void Notepad_plus::fileLoadSession(const char *fn) +{ + const char *sessionFileName = NULL; + if (fn == NULL) + { + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + fDlg.setExtFilter("Session file", ".session", NULL); + sessionFileName = fDlg.doOpenSingleFileDlg(); + } + else + { + if (PathFileExists(fn)) + sessionFileName = fn; + } + bool shouldBeResaved = false; + if (sessionFileName) + { + bool shouldBeResaved = false; + Session session2Load; + if ((NppParameters::getInstance())->loadSession(session2Load, sessionFileName)) + { + ScintillaEditView *cureentEditView = getCurrentEditView(); + + for (size_t i = 0 ; i < session2Load._files.size() ; ) + { + const char *pFn = session2Load._files[i]._fileName.c_str(); + if (doOpen(pFn)) + { + cureentEditView->getCurrentBuffer().setPosition(session2Load._files[i]); + cureentEditView->restoreCurrentPos(session2Load._files[i]); + + for (size_t j = 0 ; j < session2Load._files[i].marks.size() ; j++) + { + bookmarkAdd(session2Load._files[i].marks[j]); + } + + i++; + } + else + { + vector::iterator posIt = session2Load._files.begin() + i; + session2Load._files.erase(posIt); + shouldBeResaved = true; + } + } + + if (session2Load._actifIndex < session2Load._files.size()) + _pDocTab->activate(session2Load._actifIndex); + } + if (shouldBeResaved) + (NppParameters::getInstance())->writeSession(session2Load, sessionFileName); + } +} + +const char * Notepad_plus::fileSaveSession(size_t nbFile, char ** fileNames, const char *sessionFile2save) +{ + if (sessionFile2save) + { + Session currentSession; + if ((nbFile) && (!fileNames)) + { + for (size_t i = 0 ; i < nbFile ; i++) + { + if (PathFileExists(fileNames[i])) + currentSession._files.push_back(string(fileNames[i])); + } + } + else + getCurrentOpenedFiles(currentSession); + + (NppParameters::getInstance())->writeSession(currentSession, sessionFile2save); + return sessionFile2save; + } + return NULL; +} + +const char * Notepad_plus::fileSaveSession(size_t nbFile, char ** fileNames) +{ + const char *sessionFileName = NULL; + + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + fDlg.setExtFilter("Session file", ".session", NULL); + sessionFileName = fDlg.doSaveDlg(); + + return fileSaveSession(nbFile, fileNames, sessionFileName); +} + + +bool Notepad_plus::str2Cliboard(const char *str2cpy) +{ + if (!str2cpy) + return false; + + if (!::OpenClipboard(_hSelf)) + return false; + + ::EmptyClipboard(); + + HGLOBAL hglbCopy = ::GlobalAlloc(GMEM_MOVEABLE, strlen(str2cpy) + 1); + + if (hglbCopy == NULL) + { + ::CloseClipboard(); + return false; + } + + // Lock the handle and copy the text to the buffer. + char *pStr = (char *)::GlobalLock(hglbCopy); + strcpy(pStr, str2cpy); + ::GlobalUnlock(hglbCopy); + + // Place the handle on the clipboard. + ::SetClipboardData(CF_TEXT, hglbCopy); + ::CloseClipboard(); + return true; +} + + +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; +} + diff --git a/PowerEditor/src/Notepad_plus.cpp.internalDockingDlg b/PowerEditor/src/Notepad_plus.cpp.internalDockingDlg new file mode 100644 index 00000000..8b576323 --- /dev/null +++ b/PowerEditor/src/Notepad_plus.cpp.internalDockingDlg @@ -0,0 +1,6559 @@ +//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 + +#include +#include "Notepad_plus.h" +#include "SysMsg.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 + +const char Notepad_plus::_className[32] = NOTEPAD_PP_CLASS_NAME; + +int docTabIconIDs[] = {IDI_SAVED_ICON, IDI_UNSAVED_ICON, IDI_READONLY_ICON}; +enum tb_stat {tb_saved, tb_unsaved, tb_ro}; + +struct SortTaskListPred +{ + ScintillaEditView *_views[2]; + + SortTaskListPred(ScintillaEditView &p, ScintillaEditView &s) + { + _views[MAIN_VIEW] = &p; + _views[SUB_VIEW] = &s; + } + + bool operator()(const TaskLstFnStatus &l, const TaskLstFnStatus &r) const { + return _views[l._iView]->getBufferAt(l._docIndex).getRecentTag() > _views[r._iView]->getBufferAt(r._docIndex).getRecentTag(); + } +}; + +Notepad_plus::Notepad_plus(): Window(), _mainWindowStatus(0), _pDocTab(NULL), _pEditView(NULL), + _pMainSplitter(NULL), _isfullScreen(false), + _recordingMacro(false), _pTrayIco(NULL), _isUDDocked(false),\ + _isCmdScModified(false), _isMacrosScModified(false), _isUserCmdScModified(false),\ + _isScintillaKeyModified(false), _isRTL(false) +{ + + TiXmlDocument *nativeLangDocRoot = (NppParameters::getInstance())->getNativeLang(); + if (nativeLangDocRoot) + { + _nativeLang = nativeLangDocRoot->FirstChild("NotepadPlus"); + if (_nativeLang) + { + _nativeLang = _nativeLang->FirstChild("Native-Langue"); + if (_nativeLang) + { + TiXmlElement *element = _nativeLang->ToElement(); + const char *rtl = element->Attribute("RTL"); + if (rtl) + _isRTL = (strcmp(rtl, "yes") == 0); + } + } + } + else + _nativeLang = NULL; + + TiXmlDocument *toolIconsDocRoot = (NppParameters::getInstance())->getToolIcons(); + if (toolIconsDocRoot) + { + _toolIcons = toolIconsDocRoot->FirstChild("NotepadPlus"); + if (_toolIcons) + { + if ((_toolIcons = _toolIcons->FirstChild("ToolBarIcons"))) + { + if ((_toolIcons = _toolIcons->FirstChild("Theme"))) + { + const char *themeDir = (_toolIcons->ToElement())->Attribute("pathPrefix"); + + for (TiXmlNode *childNode = _toolIcons->FirstChildElement("Icon"); + childNode ; + childNode = childNode->NextSibling("Icon") ) + { + int iIcon; + const char *res = (childNode->ToElement())->Attribute("id", &iIcon); + if (res) + { + TiXmlNode *grandChildNode = childNode->FirstChildElement("normal"); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + string locator = themeDir?themeDir:""; + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(0, iIcon, locator)); + } + } + + grandChildNode = childNode->FirstChildElement("hover"); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + string locator = themeDir?themeDir:""; + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(1, iIcon, locator)); + } + } + + grandChildNode = childNode->FirstChildElement("disabled"); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + string locator = themeDir?themeDir:""; + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(2, iIcon, locator)); + } + } + } + } + } + } + } + } + else + _toolIcons = NULL; +} + + +void Notepad_plus::init(HINSTANCE hInst, HWND parent, const char *cmdLine) +{ + Window::init(hInst, parent); + + WNDCLASS nppClass; + + nppClass.style = CS_BYTEALIGNWINDOW | CS_DBLCLKS;//CS_HREDRAW | CS_VREDRAW; + nppClass.lpfnWndProc = Notepad_plus_Proc; + nppClass.cbClsExtra = 0; + nppClass.cbWndExtra = 0; + nppClass.hInstance = _hInst; + nppClass.hIcon = ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)); + nppClass.hCursor = NULL; + nppClass.hbrBackground = ::CreateSolidBrush(::GetSysColor(COLOR_MENU)); + nppClass.lpszMenuName = MAKEINTRESOURCE(IDR_M30_MENU); + nppClass.lpszClassName = _className; + + if (!::RegisterClass(&nppClass)) + { + systemMessage("System Err"); + throw int(98); + } + + RECT workAreaRect; + ::SystemParametersInfo(SPI_GETWORKAREA,0,&workAreaRect,0); + + const NppGUI & nppGUI = (NppParameters::getInstance())->getNppGUI(); + + _hSelf = ::CreateWindowEx( + WS_EX_ACCEPTFILES | (_isRTL?WS_EX_LAYOUTRTL:0),\ + _className,\ + "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("System Err"); + throw int(777); + } + + // the routine ShowWindow should be called here immediately + // Otherwise (if we call it after opening the files) the Scintilla + // View contained the opened document will shift down one line. + ::MoveWindow(_hSelf, nppGUI._appPos.left + workAreaRect.left, nppGUI._appPos.top + workAreaRect.top, nppGUI._appPos.right, nppGUI._appPos.bottom, TRUE); + ::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); + + if (nppGUI._rememberLastSession) + { + Session lastSession = (NppParameters::getInstance())->getSession(); + ScintillaEditView *cureentEditView = getCurrentEditView(); + for (size_t i = 0 ; i < lastSession._files.size() ; ) + { + const char *pFn = lastSession._files[i]._fileName.c_str(); + if (PathFileExists(pFn)) + { + doOpen(pFn); + cureentEditView->getCurrentBuffer().setPosition(lastSession._files[i]); + cureentEditView->restoreCurrentPos(lastSession._files[i]); + + for (size_t j = 0 ; j < lastSession._files[i].marks.size() ; j++) + bookmarkAdd(lastSession._files[i].marks[j]); + + i++; + } + else + { + vector::iterator posIt = lastSession._files.begin() + i; + lastSession._files.erase(posIt); + } + } + + if (lastSession._actifIndex < lastSession._files.size()) + _mainDocTab.activate(lastSession._actifIndex); + } + + if (cmdLine) + { + LangType lt = (NppParameters::getInstance())->getDefLang(); + int ln = (NppParameters::getInstance())->getLineNumber2go(); + + if (PathFileExists(cmdLine)) + { + doOpen(cmdLine); + + if (lt != L_TXT) + _pEditView->setCurrentDocType(lt); + if (ln > 0) + _pEditView->execute(SCI_GOTOLINE, ln-1); + } + else + { + FileNameStringSplitter fnss(cmdLine); + char *pFn = NULL; + + for (int i = 0 ; i < fnss.size() ; i++) + { + pFn = (char *)fnss.getFileName(i); + doOpen((const char *)pFn); + + if (lt != L_TXT) + _pEditView->setCurrentDocType(lt); + if (ln > 0) + _pEditView->execute(SCI_GOTOLINE, ln-1); + } + } + // restore the doc type to L_TXT + (NppParameters::getInstance())->setDefLang(L_TXT); + + } + + ::GetModuleFileName(NULL, _nppPath, MAX_PATH); + + setTitleWith(_pEditView->getCurrentTitle()); + + setLangStatus(_pEditView->getCurrentDocType()); + checkDocState(); + + // Notify plugins that Notepad++ is ready + SCNotification scnN; + scnN.nmhdr.code = NPPN_READY; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = 0; + _pluginsManager.notify(&scnN); +} + +bool Notepad_plus::doSimpleOpen(const char *fileName) +{ + Utf8_16_Read UnicodeConvertor; + + FILE *fp = fopen(fileName, "rb"); + + if (fp) + { + _pEditView->execute(SCI_CLEARALL, 0); + _pEditView->setCurrentTitle(fileName); + + char data[blockSize]; + + size_t lenFile = fread(data, 1, sizeof(data), fp); + bool isNotEmpty = (lenFile != 0); + + while (lenFile > 0) + { + lenFile = UnicodeConvertor.convert(data, lenFile); + _pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast(UnicodeConvertor.getNewBuf())); + lenFile = int(fread(data, 1, sizeof(data), fp)); + } + fclose(fp); + + UniMode unicodeMode = static_cast(UnicodeConvertor.getEncoding()); + (_pEditView->getCurrentBuffer()).setUnicodeMode(unicodeMode); + + if (unicodeMode != uni8Bit) + // Override the code page if Unicode + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + // Then replace the caret to the begining + _pEditView->execute(SCI_GOTOPOS, 0); + return true; + } + else + { + char msg[MAX_PATH + 100]; + strcpy(msg, "Can not open file \""); + strcat(msg, fileName); + strcat(msg, "\"."); + ::MessageBox(_hSelf, msg, "ERR", MB_OK); + return false; + } +} + + +bool Notepad_plus::doOpen(const char *fileName, bool isReadOnly) +{ + int i = - 1; + int iView; + + char longFileName[MAX_PATH]; + //::ShortToLongPathName(fileName, longFileName, 256); + ::GetFullPathName(fileName, MAX_PATH, longFileName, NULL); + + if ((i = _mainDocTab.find(longFileName)) != -1) + { + iView = MAIN_VIEW; + } + else if ((i = _subDocTab.find(longFileName)) != -1) + { + iView = SUB_VIEW; + } + if (i != -1) + { + switchEditViewTo(iView); + setTitleWith(_pDocTab->activate(i)); + _pEditView->getFocus(); + if (_pTrayIco) + { + if (_pTrayIco->isInTray()) + { + ::ShowWindow(_hSelf, SW_SHOW); + _pTrayIco->doTrayIcon(REMOVE); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + } + } + return false; + } + + if (!PathFileExists(longFileName)) + { + if (::MessageBox(_hSelf, "File doesn't exist. Create it?", "Create new file", MB_YESNO) == IDYES) + { + FILE *f = fopen(longFileName, "w"); + fclose(f); + } + else + return false; + } + + + Utf8_16_Read UnicodeConvertor; + + bool isNewDoc2Close = false; + FILE *fp = fopen(longFileName, "rb"); + + if (fp) + { + if ((_pEditView->getNbDoc() == 1) + && Buffer::isUntitled(_pEditView->getCurrentTitle()) + && (!_pEditView->isCurrentDocDirty()) && (_pEditView->getCurrentDocLen() == 0)) + { + isNewDoc2Close = true; + } + setTitleWith(_pDocTab->newDoc(longFileName)); + + // It's VERY IMPORTANT to reset the view + _pEditView->execute(SCI_CLEARALL); + + char data[blockSize]; + + size_t lenFile = fread(data, 1, sizeof(data), fp); + bool isNotEmpty = (lenFile != 0); + + while (lenFile > 0) + { + lenFile = UnicodeConvertor.convert(data, lenFile); + _pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast(UnicodeConvertor.getNewBuf())); + lenFile = int(fread(data, 1, sizeof(data), fp)); + } + fclose(fp); + + // 3 formats : WIN_FORMAT, UNIX_FORMAT and MAC_FORMAT + (_pEditView->getCurrentBuffer()).determinateFormat(isNotEmpty?UnicodeConvertor.getNewBuf():(char *)("")); + _pEditView->execute(SCI_SETEOLMODE, _pEditView->getCurrentBuffer().getFormat()); + + UniMode unicodeMode = static_cast(UnicodeConvertor.getEncoding()); + (_pEditView->getCurrentBuffer()).setUnicodeMode(unicodeMode); + + if (unicodeMode != uni8Bit) + // Override the code page if Unicode + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + if (isReadOnly) + (_pEditView->getCurrentBuffer()).setReadOnly(true); + + _pEditView->getFocus(); + _pEditView->execute(SCI_SETSAVEPOINT); + _pEditView->execute(EM_EMPTYUNDOBUFFER); + + // if file is read only, we set the view read only + _pEditView->execute(SCI_SETREADONLY, _pEditView->isCurrentBufReadOnly()); + if (isNewDoc2Close) + _pDocTab->closeDocAt(0); + + int numLines = int(_pEditView->execute(SCI_GETLINECOUNT)); + + char numLineStr[32]; + itoa(numLines, numLineStr, 10); + int nbDigit = strlen(numLineStr); + + if (_pEditView->increaseMaxNbDigit(nbDigit)) + _pEditView->setLineNumberWidth(_pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER)); + + int maxLen = 0; + int maxPixel = 0; + int pixel = int(_pEditView->execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P")); + + for( int i = 0 ; i < numLines ; i++ ) + { + int len = _pEditView->getLineLength(i); + if (maxLen < len) + { + maxLen = len; + maxPixel = pixel * maxLen; + } + } + int currentWidth = int(_pEditView->execute(SCI_GETSCROLLWIDTH)); + if (currentWidth < maxPixel) + _pEditView->execute(SCI_SETSCROLLWIDTH, maxPixel); + + // Then replace the caret to the begining + _pEditView->execute(SCI_GOTOPOS, 0); + dynamicCheckMenuAndTB(); + _lastRecentFileList.remove(longFileName); + if (_pTrayIco) + { + if (_pTrayIco->isInTray()) + { + ::ShowWindow(_hSelf, SW_SHOW); + _pTrayIco->doTrayIcon(REMOVE); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + } + } + + PathRemoveFileSpec(longFileName); + setWorkingDir(longFileName); + return true; + } + else + { + char msg[MAX_PATH + 100]; + strcpy(msg, "Can not open file \""); + //strcat(msg, fullPath); + strcat(msg, longFileName); + strcat(msg, "\"."); + ::MessageBox(_hSelf, msg, "ERR", MB_OK); + _lastRecentFileList.remove(longFileName); + return false; + } +} + +void Notepad_plus::fileOpen() +{ + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + fDlg.setExtFilter("c/c++ src file", ".c", ".cpp", ".cxx", ".cc", ".h", NULL); + fDlg.setExtFilter("Window Resource File", ".rc", NULL); + + fDlg.setExtFilter("Java src file", ".java", NULL); + fDlg.setExtFilter("HTML file", ".html", ".htm", NULL); + fDlg.setExtFilter("XML file", ".xml", NULL); + fDlg.setExtFilter("Makefile", "makefile", "GNUmakefile", ".makefile", NULL); + fDlg.setExtFilter("php file", ".php", ".php3", ".phtml", NULL); + fDlg.setExtFilter("asp file", ".asp", NULL); + fDlg.setExtFilter("ini file", ".ini", NULL); + fDlg.setExtFilter("nfo file", ".nfo", NULL); + fDlg.setExtFilter("VB/VBS file", ".vb", ".vbs", NULL); + fDlg.setExtFilter("SQL file", ".sql", NULL); + fDlg.setExtFilter("Objective C file", ".m", ".h", NULL); + if (stringVector *pfns = fDlg.doOpenMultiFilesDlg()) + { + int sz = int(pfns->size()); + for (int i = 0 ; i < sz ; i++) + doOpen((pfns->at(i)).c_str(), fDlg.isReadOnly()); + + setLangStatus(_pEditView->getCurrentDocType()); + } +} + +bool Notepad_plus::doSave(const char *filename, UniMode mode) +{ + bool isHidden = false; + bool isSys = false; + DWORD attrib; + + if (PathFileExists(filename)) + { + attrib = ::GetFileAttributes(filename); + + 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); + + } + } + + if (mode == uniCookie) + mode = uni8Bit; + + Utf8_16_Write UnicodeConvertor; + if (_pEditView->execute(SCI_GETCODEPAGE) != 0) + UnicodeConvertor.setEncoding(static_cast(mode)); + + FILE *fp = UnicodeConvertor.fopen(filename, "wb"); + + if (fp) + { + char data[blockSize + 1]; + int lengthDoc = _pEditView->getCurrentDocLen(); + for (int i = 0; i < lengthDoc; i += blockSize) + { + int grabSize = lengthDoc - i; + if (grabSize > blockSize) + grabSize = blockSize; + + _pEditView->getText(data, i, i + grabSize); + UnicodeConvertor.fwrite(data, grabSize); + } + UnicodeConvertor.fclose(); + + _pEditView->updateCurrentBufTimeStamp(); + _pEditView->execute(SCI_SETSAVEPOINT); + + if (isHidden) + ::SetFileAttributes(filename, attrib | FILE_ATTRIBUTE_HIDDEN); + + if (isSys) + ::SetFileAttributes(filename, attrib | FILE_ATTRIBUTE_SYSTEM); + return true; + } + return false; +} + +bool Notepad_plus::fileSave() +{ + if (_pEditView->isCurrentDocDirty()) + { + const char *fn = _pEditView->getCurrentTitle(); + if (Buffer::isUntitled(fn)) + { + return fileSaveAs(); + } + else + { + BackupFeature backup = ((NppParameters::getInstance())->getNppGUI())._backup; + if (backup == bak_simple) + { + //copy fn to fn.backup + string fn_bak(fn); + fn_bak += ".bak"; + ::CopyFile(fn, fn_bak.c_str(), FALSE); + } + else if (backup == bak_verbose) + { + //copy fn to fn.backup.dateTime + string fn_dateTime_bak(fn); + + const int temBufLen = 32; + char tmpbuf[temBufLen]; + time_t ltime = time(0); + struct tm *today; + + today = localtime(<ime); + strftime(tmpbuf, temBufLen, "%Y-%m-%d_%H%M%S", today); + + fn_dateTime_bak += "."; + fn_dateTime_bak += tmpbuf; + fn_dateTime_bak += ".bak"; + + ::CopyFile(fn, fn_dateTime_bak.c_str(), FALSE); + } + return doSave(fn, _pEditView->getCurrentBuffer().getUnicodeMode()); + } + //return (Buffer::isUntitled(fn))?fileSaveAs():doSave(fn, _pEditView->getCurrentBuffer().getUnicodeMode()); + } + return false; +} + +bool Notepad_plus::fileSaveAll() { + + int iCurrent = _pEditView->getCurrentDocIndex(); + + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + int iCur = _pEditView->getCurrentDocIndex(); + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + fileSave(); + } + + _pDocTab->activate(iCur); + + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + fileSave(); + } + + _pDocTab->activate(iCurrent); + return true; +} + +bool Notepad_plus::replaceAllFiles() { + + int iCurrent = _pEditView->getCurrentDocIndex(); + int nbTotal = 0; + const bool isEntireDoc = true; + + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + int iCur = _pEditView->getCurrentDocIndex(); + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + { + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(REPLACE_ALL, isEntireDoc); + _pEditView->execute(SCI_ENDUNDOACTION); + } + } + _pDocTab->activate(iCur); + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + if (!_pEditView->getCurrentBuffer().isReadOnly()) + { + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(REPLACE_ALL, isEntireDoc); + _pEditView->execute(SCI_ENDUNDOACTION); + } + } + + _pDocTab->activate(iCurrent); + + char result[64]; + if (nbTotal < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbTotal, result, 10); + strcat(result, " tokens are replaced."); + + } + ::MessageBox(_hSelf, result, "", MB_OK); + + return true; +} + +bool Notepad_plus::matchInList(const char *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::getMatchedFileNames(const char *dir, const vector & patterns, vector & fileNames) +{ + string dirFilter(dir); + dirFilter += "*.*"; + WIN32_FIND_DATA foundData; + + HANDLE hFile = ::FindFirstFile(dirFilter.c_str(), &foundData); + + if (hFile != INVALID_HANDLE_VALUE) + { + + if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if ((strcmp(foundData.cFileName, ".")) && (strcmp(foundData.cFileName, ".."))) + { + string pathDir(dir); + pathDir += foundData.cFileName; + pathDir += "\\"; + getMatchedFileNames(pathDir.c_str(), patterns, fileNames); + } + } + else + { + if (matchInList(foundData.cFileName, patterns)) + { + string pathFile(dir); + pathFile += foundData.cFileName; + fileNames.push_back(pathFile.c_str()); + } + } + } + while (::FindNextFile(hFile, &foundData)) + { + + if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if ((strcmp(foundData.cFileName, ".")) && (strcmp(foundData.cFileName, ".."))) + { + string pathDir(dir); + pathDir += foundData.cFileName; + pathDir += "\\"; + getMatchedFileNames(pathDir.c_str(), patterns, fileNames); + } + } + else + { + if (matchInList(foundData.cFileName, patterns)) + { + string pathFile(dir); + pathFile += foundData.cFileName; + fileNames.push_back(pathFile.c_str()); + } + } + } + ::FindClose(hFile); +} + +bool Notepad_plus::findInFiles() +{ + int nbTotal = 0; + ScintillaEditView *pOldView = _pEditView; + + _pEditView = &_invisibleEditView; + _findReplaceDlg.setFinderReadOnly(false); + + if (!_findReplaceDlg.isFinderEmpty()) + _findReplaceDlg.clearFinder(); + + const char *dir2Search = _findReplaceDlg.getDir2Search(); + vector patterns2Match; + _findReplaceDlg.getPatterns(patterns2Match); + vector fileNames; + getMatchedFileNames(dir2Search, patterns2Match, fileNames); + + for (size_t i = 0 ; i < fileNames.size() ; i++) + { + doSimpleOpen(fileNames[i].c_str()); + nbTotal += _findReplaceDlg.processAll(FIND_ALL, true, _findReplaceDlg.getDir2Search()); + } + _findReplaceDlg.setFinderReadOnly(); + _findReplaceDlg.putFindResult(nbTotal); + + _pEditView = pOldView; + return true; +} + +bool Notepad_plus::findInOpenedFiles() { + + int iCurrent = _pEditView->getCurrentDocIndex(); + int nbTotal = 0; + const bool isEntireDoc = true; + + _findReplaceDlg.setFinderReadOnly(false); + //_findReplaceDlg.setFinderStyle(); + //_pFinder->defineDocType(L_TXT); + //_pFinder->execute(SCI_STYLESETSIZE, STYLE_DEFAULT, 8); + + if (!_findReplaceDlg.isFinderEmpty()) + _findReplaceDlg.clearFinder(); + + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + int iCur = _pEditView->getCurrentDocIndex(); + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(FIND_ALL, isEntireDoc); + _pEditView->execute(SCI_ENDUNDOACTION); + + } + _pDocTab->activate(iCur); + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + + for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++) + { + _pDocTab->activate(i); + + _pEditView->execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(FIND_ALL, isEntireDoc); + _pEditView->execute(SCI_ENDUNDOACTION); + } + + _pDocTab->activate(iCurrent); + + _findReplaceDlg.setFinderReadOnly(); + + _findReplaceDlg.putFindResult(nbTotal); + + return true; +} + +bool Notepad_plus::fileSaveAs() +{ + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + + fDlg.setExtFilter("c src file", ".c", NULL); + fDlg.setExtFilter("c++ src file", ".cpp", NULL); + fDlg.setExtFilter("Window Resource File", ".rc", NULL); + fDlg.setExtFilter("c/c++ header file", ".h", NULL); + fDlg.setExtFilter("Java src file", ".java", NULL); + fDlg.setExtFilter("HTML file", ".html", NULL); + fDlg.setExtFilter("XML file", ".xml", NULL); + fDlg.setExtFilter("php file", ".php",NULL); + fDlg.setExtFilter("ini file", ".ini", NULL); + fDlg.setExtFilter("bat file", ".bat", NULL); + fDlg.setExtFilter("Normal text file", ".txt", NULL); + char str[MAX_PATH]; + strcpy(str, _pEditView->getCurrentTitle()); + + fDlg.setDefFileName(PathFindFileName(str)); + + if (char *pfn = fDlg.doSaveDlg()) + { + int i = _pEditView->findDocIndexByName(pfn); + if ((i == -1) || (i == _pEditView->getCurrentDocIndex())) + { + doSave(pfn, _pEditView->getCurrentBuffer().getUnicodeMode()); + _pEditView->setCurrentTitle(pfn); + _pEditView->setCurrentDocReadOnly(false); + _pDocTab->updateCurrentTabItem(PathFindFileName(pfn)); + setTitleWith(pfn); + setLangStatus(_pEditView->getCurrentDocType()); + checkLangsMenu(-1); + return true; + } + else + { + ::MessageBox(_hSelf, "The file is already opened in the Notepad++.", "ERROR", MB_OK | MB_ICONSTOP); + _pDocTab->activate(i); + return false; + } + checkModifiedDocument(); + } + else // cancel button is pressed + { + checkModifiedDocument(); + return false; + } +} + +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_STREAM_COMMENT, hasSelection, MENU); +} + +void Notepad_plus::checkDocState() +{ + bool isCurrentDirty = _pEditView->isCurrentDocDirty(); + bool isSeveralDirty = (!_pEditView->isAllDocsClean()) || (!getNonCurrentEditView()->isAllDocsClean()); + + enableCommand(IDM_FILE_SAVE, isCurrentDirty, MENU | TOOLBAR); + enableCommand(IDM_FILE_SAVEALL, isSeveralDirty, MENU | TOOLBAR); + + bool isSysReadOnly = _pEditView->isCurrentBufSysReadOnly(); + if (isSysReadOnly) + { + HMENU hMenu = ::GetMenu(_hSelf); + ::CheckMenuItem(hMenu, 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 = _pEditView->isCurrentBufUserReadOnly(); + HMENU hMenu = ::GetMenu(_hSelf); + ::CheckMenuItem(hMenu, IDM_EDIT_SETREADONLY, MF_BYCOMMAND | (isUserReadOnly?MF_CHECKED:MF_UNCHECKED)); + } + + enableConvertMenuItems((_pEditView->getCurrentBuffer()).getFormat()); + 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_EDIT_STARTRECORDINGMACRO, !_recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_EDIT_STOPRECORDINGMACRO, _recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_EDIT_PLAYBACKRECORDEDMACRO, !_macro.empty() && !_recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_EDIT_SAVECURRENTMACRO, !_macro.empty() && !_recordingMacro, MENU | TOOLBAR); + + enableCommand(IDM_EDIT_RUNMULTIMACRODLG, (!_macro.empty() && !_recordingMacro) || !((NppParameters::getInstance())->getMacroList()).empty(), MENU | TOOLBAR); +} + +void Notepad_plus::checkSyncState() +{ + bool canDoSync = _mainDocTab.isVisible() && _subDocTab.isVisible(); + 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::synchronise() +{ + Buffer & bufSrc = _pEditView->getCurrentBuffer(); + + const char *fn = bufSrc.getFileName(); + + int i = getNonCurrentDocTab()->find(fn); + if (i != -1) + { + Buffer & bufDest = getNonCurrentEditView()->getBufferAt(i); + bufDest.synchroniseWith(bufSrc); + getNonCurrentDocTab()->updateTabItem(i); + } +} + + +void Notepad_plus::checkLangsMenu(int id) const +{ + if (id == -1) + { + id = (NppParameters::getInstance())->langTypeToCommandID(_pEditView->getCurrentDocType()); + if (id == IDM_LANG_USER) + { + if (_pEditView->getCurrentBuffer().isUserDefineLangExt()) + { + const char *userLangName = _pEditView->getCurrentBuffer().getUserDefineLangName(); + char menuLangName[16]; + + for (int i = IDM_LANG_USER + 1 ; i <= IDM_LANG_USER_LIMIT ; i++) + { + if (::GetMenuString(::GetMenu(_hSelf), i, menuLangName, sizeof(menuLangName), MF_BYCOMMAND)) + if (!strcmp(userLangName, menuLangName)) + { + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_LANG_C, IDM_LANG_USER_LIMIT, i, MF_BYCOMMAND); + return; + } + } + } + } + } + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_LANG_C, IDM_LANG_USER_LIMIT, id, MF_BYCOMMAND); +} +void Notepad_plus::setLangStatus(LangType langType) +{ + string str2Show; + + switch (langType) + { + case L_C: + str2Show = "c source file"; break; + + case L_CPP: + str2Show = "c++ source file"; break; + + case L_OBJC: + str2Show = "Objective C source file"; break; + + case L_JAVA: + str2Show = "Java source file"; break; + + case L_CS: + str2Show = "C# source file"; break; + + case L_RC : + str2Show = "Windows Resource file"; break; + + case L_MAKEFILE: + str2Show = "Makefile"; break; + + case L_HTML: + str2Show = "Hyper Text Markup Language file"; break; + + case L_XML: + str2Show = "eXtensible Markup Language file"; break; + + case L_JS: + str2Show = "Javascript file"; break; + + case L_PHP: + str2Show = "PHP Hypertext Preprocessor file"; break; + + case L_ASP: + str2Show = "Active Server Pages script file"; break; + + case L_CSS: + str2Show = "Cascade Style Sheets File"; break; + + case L_LUA: + str2Show = "Lua source File"; break; + + case L_NFO: + str2Show = "MSDOS Style"; break; + + case L_SQL: + str2Show = "Structure Query Language file"; break; + + case L_VB: + str2Show = "Visual Basic file"; break; + + case L_BATCH : + str2Show = "Batch file"; break; + + case L_PASCAL : + str2Show = "Pascal source file"; break; + + case L_PERL : + str2Show = "Perl source file"; break; + + case L_PYTHON : + str2Show = "Python file"; break; + + case L_TEX : + str2Show = "TeX file"; break; + + case L_FORTRAN : + str2Show = "Fortran source file"; break; + + case L_BASH : + str2Show = "Unix script file"; break; + + case L_FLASH : + str2Show = "Flash Action script file"; break; + + case L_NSIS : + str2Show = "Nullsoft Scriptable Install System script file"; break; + + case L_TCL : + str2Show = "Tool Command Language file"; break; + + case L_LISP : + str2Show = "List Processing language file"; break; + + case L_SCHEME : + str2Show = "Sheme file"; break; + + case L_ASM : + str2Show = "Assembler file"; break; + + case L_DIFF : + str2Show = "Diff file"; break; + + case L_PROPS : + str2Show = "Properties file"; break; + + case L_PS : + str2Show = "Postscript file"; break; + + case L_RUBY : + str2Show = "Ruby file"; break; + + case L_SMALLTALK : + str2Show = "Smalltalk file"; break; + + case L_VHDL : + str2Show = "VHSIC Hardware Description Language file"; break; + + case L_VERILOG : + str2Show = "Verilog file"; break; + + case L_KIX : + str2Show = "KiXtart file"; break; + + case L_ADA : + str2Show = "Ada file"; break; + + case L_CAML : + str2Show = "Categorical Abstract Machine Language"; break; + + case L_AU3 : + str2Show = "AutoIt"; break; + + case L_MATLAB : + str2Show = "MATrix LABoratory"; break; + + case L_HASKELL : + str2Show = "Haskell"; break; + + case L_USER: + { + str2Show = "User Define File"; + Buffer & currentBuf = _pEditView->getCurrentBuffer(); + if (currentBuf.isUserDefineLangExt()) + { + str2Show += " - "; + str2Show += currentBuf.getUserDefineLangName(); + } + break; + } + + default: + str2Show = "Normal text file"; + + } + _statusBar.setText(str2Show.c_str(), STATUSBAR_DOC_TYPE); +} + +void Notepad_plus::getApiFileName(LangType langType, string &fn) +{ + + switch (langType) + { + case L_C: fn = "c"; break; + + case L_CPP: fn = "cpp"; break; + + case L_OBJC: fn = "objC"; break; + + case L_JAVA: fn = "java"; break; + + case L_CS : fn = "cs"; break; + + case L_XML: fn = "xml"; break; + + case L_JS: fn = "javascript"; break; + + case L_PHP: fn = "php"; break; + + case L_VB: + case L_ASP: fn = "vb"; break; + + case L_CSS: fn = "css"; break; + + case L_LUA: fn = "lua"; break; + + case L_PERL: fn = "perl"; break; + + case L_PASCAL: fn = "pascal"; break; + + case L_PYTHON: fn = "python"; break; + + case L_TEX : fn = "tex"; break; + + case L_FORTRAN : fn = "fortran"; break; + + case L_BASH : fn = "bash"; break; + + case L_FLASH : fn = "flash"; break; + + case L_NSIS : fn = "nsis"; break; + + case L_TCL : fn = "tcl"; break; + + case L_LISP : fn = "lisp"; break; + + case L_SCHEME : fn = "sheme"; break; + + case L_ASM : + fn = "asm"; break; + + case L_DIFF : + fn = "diff"; break; +/* + case L_PROPS : + fn = "Properties file"; break; +*/ + case L_PS : + fn = "postscript"; break; + + case L_RUBY : + fn = "ruby"; break; + + case L_SMALLTALK : + fn = "smalltalk"; break; + + case L_VHDL : + fn = "vhdl"; break; + + case L_KIX : + fn = "kix"; break; + + case L_AU3 : + fn = "autoit"; break; + + case L_CAML : + fn = "caml"; break; + + case L_ADA : + fn = "ada"; break; + + case L_VERILOG : + fn = "verilog"; break; + + case L_MATLAB : + fn = "matlab"; break; + + case L_HASKELL : + fn = "haskell"; break; + + case L_USER : + { + Buffer & currentBuf = _pEditView->getCurrentBuffer(); + if (currentBuf.isUserDefineLangExt()) + { + fn = currentBuf.getUserDefineLangName(); + } + break; + } + default: + fn = "text"; + + } +} + +BOOL Notepad_plus::notify(SCNotification *notification) +{ + switch (notification->nmhdr.code) + { + /* + case SCN_MODIFIED: + if (notification->modificationType & SC_MOD_DELETETEXT) + MessageBox(NULL, "text deleted", "SC_MOD_DELETETEXT", MB_OK); + else if (notification->modificationType & SC_MOD_INSERTTEXT) + MessageBox(NULL, "text inseted", "SC_MOD_INSERTTEXT", MB_OK); + break; + + case SCN_DOUBLECLICK : + //MessageBox(NULL, "DBL click", "SCN_DOUBLECLICK", MB_OK); + break; +*/ + case SCN_SAVEPOINTREACHED: + _pEditView->setCurrentDocState(false); + _pDocTab->updateCurrentTabItem(); + checkDocState(); + synchronise(); + break; + + case SCN_SAVEPOINTLEFT: + _pEditView->setCurrentDocState(true); + _pDocTab->updateCurrentTabItem(); + checkDocState(); + synchronise(); + 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); + int destIndex = sender->getTabDraggedIndex(); + int scrIndex = sender->getSrcTabIndex(); + + // if the dragNdrop tab is not the current view tab, + // we have to set it to the current view tab + if (notification->nmhdr.hwndFrom != _pDocTab->getHSelf()) + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + _pEditView->sortBuffer(destIndex, scrIndex); + _pEditView->setCurrentIndex(destIndex); + + 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()) + { + char goToView[64] = "Go to another View"; + char cloneToView[64] = "Clone to another View"; + const char *pGoToView = goToView; + const char *pCloneToView = cloneToView; + + if (_nativeLang) + { + TiXmlNode *tabBarMenu = _nativeLang->FirstChild("Menu"); + tabBarMenu = tabBarMenu->FirstChild("TabBar"); + if (tabBarMenu) + { + for (TiXmlNode *childNode = tabBarMenu->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int ordre; + element->Attribute("order", &ordre); + if (ordre == 5) + pGoToView = element->Attribute("name"); + else if (ordre == 6) + pCloneToView = element->Attribute("name"); + } + } + if (!pGoToView || !pGoToView[0]) + pGoToView = goToView; + if (!pCloneToView || !pCloneToView[0]) + pCloneToView = cloneToView; + } + vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_GOTO_ANOTHER_VIEW, pGoToView)); + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_CLONE_TO_ANOTHER_VIEW, pCloneToView)); + _tabPopupDropMenu.create(_hSelf, itemUnitArray); + } + _tabPopupDropMenu.display(p); + } + else if ((hWin == getNonCurrentDocTab()->getHSelf()) || + (hWin == getNonCurrentEditView()->getHSelf())) // In the another view group + { + if (::GetKeyState(VK_LCONTROL) & 0x80000000) + docGotoAnotherEditView(MODE_CLONE); + else + docGotoAnotherEditView(MODE_TRANSFER); + } + //else on fout rien!!! // It's non view group + } + break; + } + + case TCN_TABDELETE: + { + if (notification->nmhdr.hwndFrom != _pDocTab->getHSelf()) + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + fileClose(); + break; + + } + + case TCN_SELCHANGE: + { + char fullPath[MAX_PATH]; + + if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf()) + { + strcpy(fullPath, _mainDocTab.clickedUpdate()); + switchEditViewTo(MAIN_VIEW); + + } + else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf()) + { + strcpy(fullPath, _subDocTab.clickedUpdate()); + switchEditViewTo(SUB_VIEW); + } + + PathRemoveFileSpec(fullPath); + setWorkingDir(fullPath); + + 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))?"OVR":"INS", STATUSBAR_TYPING_MODE); + } + } + 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(); + if (isFirstTime) + { + tTbData data = {0}; + _goToLineDlg.create(&data, _isRTL); + _dockingManager.createDockableDlg(data); + + changeDlgLang(_goToLineDlg.getHSelf(), "GoToLine"); + } + else + { + _goToLineDlg.display(); + } + } + } + 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, clientPoint; + ::GetCursorPos(&p); + clientPoint.x = p.x; + clientPoint.y = p.y; + + if (!_tabPopupMenu.isCreated()) + { + char close[32] = "Close me"; + char closeBut[32] = "Close all but me"; + char save[32] = "Save me"; + char saveAs[32] = "Save me As..."; + char print[32] = "Print me"; + char readOnly[32] = "Read only"; + char clearReadOnly[32] = "Clear read only flag"; + char goToView[32] = "Go to another View"; + char cloneToView[32] = "Clone to another View"; + char cilpFullPath[32] = "Full file path to Clipboard"; + char cilpFileName[32] = "File name to Clipboard"; + char cilpCurrentDir[32] = "Current dir path to Clipboard"; + + + const char *pClose = close; + const char *pCloseBut = closeBut; + const char *pSave = save; + const char *pSaveAs = saveAs; + const char *pPrint = print; + const char *pReadOnly = readOnly; + const char *pClearReadOnly = clearReadOnly; + const char *pGoToView = goToView; + const char *pCloneToView = cloneToView; + const char *pCilpFullPath = cilpFullPath; + const char *pCilpFileName = cilpFileName; + const char *pCilpCurrentDir = cilpCurrentDir; + if (_nativeLang) + { + TiXmlNode *tabBarMenu = _nativeLang->FirstChild("Menu"); + if (tabBarMenu) + { + tabBarMenu = tabBarMenu->FirstChild("TabBar"); + if (tabBarMenu) + { + for (TiXmlNode *childNode = tabBarMenu->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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; + + } + } + } + } + if (!pClose || !pClose[0]) + pClose = close; + if (!pCloseBut || !pCloseBut[0]) + pCloseBut = cloneToView; + if (!pSave || !pSave[0]) + pSave = save; + if (!pSaveAs || !pSaveAs[0]) + pSaveAs = saveAs; + if (!pPrint || !pPrint[0]) + pPrint = print; + if (!pGoToView || !pGoToView[0]) + pGoToView = goToView; + if (!pCloneToView || !pCloneToView[0]) + pCloneToView = cloneToView; + } + vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSE, pClose)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSEALL_BUT_CURRENT, pCloseBut)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVE, pSave)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVEAS, pSaveAs)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_PRINT, pPrint)); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_SETREADONLY, pReadOnly)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CLEARREADONLY, pClearReadOnly)); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FULLPATHTOCLIP, pCilpFullPath)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FILENAMETOCLIP, pCilpFileName)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CURRENTDIRTOCLIP, pCilpCurrentDir)); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_GOTO_ANOTHER_VIEW, pGoToView)); + itemUnitArray.push_back(MenuItemUnit(IDC_DOC_CLONE_TO_ANOTHER_VIEW, pCloneToView)); + + _tabPopupMenu.create(_hSelf, itemUnitArray); + + } + ::ScreenToClient(_pDocTab->getHSelf(), &clientPoint); + ::SendMessage(_pDocTab->getHSelf(), WM_LBUTTONDOWN, 2, MAKELONG(clientPoint.x, clientPoint.y)); + + bool isEnable = ((::GetMenuState(::GetMenu(_hSelf), IDM_FILE_SAVE, MF_BYCOMMAND)&MF_DISABLED) == 0); + _tabPopupMenu.enableItem(IDM_FILE_SAVE, isEnable); + + bool isUserReadOnly = _pEditView->isCurrentBufUserReadOnly(); + _tabPopupMenu.checkItem(IDM_EDIT_SETREADONLY, isUserReadOnly); + + bool isSysReadOnly = _pEditView->isCurrentBufSysReadOnly(); + _tabPopupMenu.enableItem(IDM_EDIT_SETREADONLY, !isSysReadOnly); + _tabPopupMenu.enableItem(IDM_EDIT_CLEARREADONLY, isSysReadOnly); + + _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) + { + + int lineClick = int(_pEditView->execute(SCI_LINEFROMPOSITION, notification->position)); + bookmarkToggle(lineClick); + + } + break; + } + + + case SCN_CHARADDED: + charAdded(static_cast(notification->ch)); + break; + + case SCN_UPDATEUI: + braceMatch(); + updateStatusBar(); + break; + + case TTN_GETDISPINFO: + { + LPTOOLTIPTEXT lpttt; + + lpttt = (LPTOOLTIPTEXT)notification; + lpttt->hinst = _hInst; + + // Specify the resource identifier of the descriptive + // text for the given button. + int idButton = int(lpttt->hdr.idFrom); + static string tip; + getNameStrFromCmd(idButton, tip); + lpttt->lpszText = (LPSTR)tip.c_str(); + } + break; + + case SCN_ZOOM: + _pEditView->setLineNumberWidth(_pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER)); + break; + + case SCN_MACRORECORD: + _macro.push_back(recordedMacroStep(notification->message, notification->wParam, notification->lParam)); + break; + + case SCN_PAINTED: + if (_syncInfo.doSync()) + doSynScorll(HWND(notification->nmhdr.hwndFrom)); + break; + + default : + break; + + } + return FALSE; +} +void Notepad_plus::findMatchingBracePos(int & braceAtCaret, int & braceOpposite) +{ + int caretPos = int(_pEditView->execute(SCI_GETCURRENTPOS, 0, 0)); + braceAtCaret = -1; + braceOpposite = -1; + char charBefore = '\0'; + //char styleBefore = '\0'; + int lengthDoc = int(_pEditView->execute(SCI_GETLENGTH, 0, 0)); + + if ((lengthDoc > 0) && (caretPos > 0)) + { + charBefore = char(_pEditView->execute(SCI_GETCHARAT, caretPos - 1, 0)); + } + // Priority goes to character before caret + if (charBefore && strchr("[](){}", charBefore)) + { + braceAtCaret = caretPos - 1; + } + + if (lengthDoc > 0 && (braceAtCaret < 0)) + { + // No brace found so check other side + char charAfter = char(_pEditView->execute(SCI_GETCHARAT, caretPos, 0)); + if (charAfter && strchr("[](){}", 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(char chAdded) +{ + bool indentMaintain = NppParameters::getInstance()->getNppGUI()._maitainIndent; + if (indentMaintain) + MaintainIndentation(chAdded); + + hotSpot(chAdded); + +} + +void Notepad_plus::hotSpot(char chAdded) +{ + +} + +void Notepad_plus::MaintainIndentation(char 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_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 + 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, _hSelf, svp._edgeNbColumn, "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_CLOSE: + fileClose(); + checkSyncState(); + break; + + case IDM_FILE_CLOSEALL: + fileCloseAll(); + checkSyncState(); + break; + + case IDM_FILE_CLOSEALL_BUT_CURRENT : + fileCloseAllButCurrent(); + checkSyncState(); + break; + + case IDM_FILE_SAVE : + fileSave(); + break; + + case IDM_FILE_SAVEALL : + fileSaveAll(); + break; + + case IDM_FILE_SAVEAS : + fileSaveAs(); + break; + + case IDM_FILE_LOADSESSION: + fileLoadSession(); + break; + + case IDM_FILE_SAVESESSION: + fileSaveSession(); + break; + + case IDC_BUTTON_PRINT : + 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); + break; + + case IDM_EDIT_COPY: + _pEditView->execute(WM_COPY); + checkClipboard(); + break; + + case IDM_EDIT_PASTE: + { + int eolMode = int(_pEditView->execute(SCI_GETEOLMODE)); + _pEditView->execute(WM_PASTE); + _pEditView->execute(SCI_CONVERTEOLS, eolMode); + } + break; + + case IDM_EDIT_DELETE: + _pEditView->execute(WM_CLEAR); + break; + + case IDM_EDIT_STARTRECORDINGMACRO: + case IDM_EDIT_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_EDIT_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_EDIT_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_EDIT_SAVECURRENTMACRO : + { + if (addCurrentMacro()) + _runMacroDlg.initMacroList(); + break; + } + case IDM_EDIT_FULLPATHTOCLIP : + { + str2Cliboard(_pEditView->getCurrentTitle()); + } + break; + + case IDM_EDIT_CURRENTDIRTOCLIP : + { + char dir[MAX_PATH]; + strcpy(dir, _pEditView->getCurrentTitle()); + PathRemoveFileSpec((LPSTR)dir); + + str2Cliboard(dir); + } + break; + + case IDM_EDIT_FILENAMETOCLIP : + { + str2Cliboard(PathFindFileName((LPSTR)_pEditView->getCurrentTitle())); + } + break; + + case IDM_SEARCH_FIND : + case IDM_SEARCH_REPLACE : + { + const int strSize = 64; + char str[strSize]; + + bool isFirstTime = !_findReplaceDlg.isCreated(); + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + _pEditView->expandWordSelection(); + + _findReplaceDlg.doDialog((id == IDM_SEARCH_FIND)?FIND:REPLACE, _isRTL); + + if (_pEditView->getSelectedText(str, strSize, true)) + _findReplaceDlg.setSearchText(str, _pEditView->getCurrentBuffer()._unicodeMode != uni8Bit); + + if (isFirstTime) + changeDlgLang(_findReplaceDlg.getHSelf(), "Find"); + break; + } + + case IDM_SEARCH_FINDINFILES : + { + ::SendMessage(_hSelf, WM_LAUNCH_FINDINFILESDLG, 0, 0); + break; + } + case IDM_SEARCH_FINDINCREMENT : + { + const int strSize = 64; + char str[strSize]; + + _incrementFindDlg.doDialog(_isRTL); + + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + { + _pEditView->expandWordSelection(); + } + _pEditView->getSelectedText(str, strSize); + _incrementFindDlg.setSearchText(str, _pEditView->getCurrentBuffer()._unicodeMode != uni8Bit); + } + break; + + case IDM_SEARCH_FINDNEXT : + case IDM_SEARCH_FINDPREV : + { + if (!_findReplaceDlg.isCreated()) + return; + + _findReplaceDlg.setSearchDirection(id == IDM_SEARCH_FINDNEXT?DIR_DOWN:DIR_UP); + + string s = _findReplaceDlg.getText2search(); + _findReplaceDlg.processFindNext(s.c_str()); + break; + } + break; + + case IDM_SEARCH_VOLATILE_FINDNEXT : + case IDM_SEARCH_VOLATILE_FINDPREV : + { + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + { + _pEditView->expandWordSelection(); + } + else + { + char text2Find[MAX_PATH]; + _pEditView->getSelectedText(text2Find, sizeof(text2Find)); + + FindOption op; + op._isWholeWord = false; + op._whichDirection = (id == IDM_SEARCH_VOLATILE_FINDNEXT?DIR_DOWN:DIR_UP); + _findReplaceDlg.processFindNext(text2Find, &op); + } + break; + } + + case IDM_SEARCH_GOTOLINE : + { + /* + bool isFirstTime = !_goToLineDlg.isCreated(); + _goToLineDlg.doDialog(_isRTL); + if (isFirstTime) + changeDlgLang(_goToLineDlg.getHSelf(), "GoToLine"); + break; + */ + bool isFirstTime = !_goToLineDlg.isCreated(); + if (isFirstTime) + { + tTbData data = {0}; + _goToLineDlg.create(&data, _isRTL); + _dockingManager.createDockableDlg(data); + + changeDlgLang(_goToLineDlg.getHSelf(), "GoToLine"); + } + else + { + _goToLineDlg.display(); + } + } + + 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 (_mainWindowStatus & TWO_VIEWS_MASK) + _pMainWindow = &_subSplitter; + else + _pMainWindow = _pDocTab; + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + udd->display(false); + _mainWindowStatus &= ~DOCK_MASK; + } + else if ((isUDDlgDocked)&&(!isUDDlgVisible)) + { + if (!_pMainSplitter) + { + _pMainSplitter = new SplitterContainer; + _pMainSplitter->init(_hInst, _hSelf); + + Window *pWindow; + if (_mainWindowStatus & TWO_VIEWS_MASK) + pWindow = &_subSplitter; + else + pWindow = _pDocTab; + + _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45); + } + + _pMainWindow = _pMainSplitter; + + _pMainSplitter->setWin0((_mainWindowStatus & TWO_VIEWS_MASK)?(Window *)&_subSplitter:(Window *)_pDocTab); + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + _pMainWindow->display(); + + _mainWindowStatus |= DOCK_MASK; + } + 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_TRANSPOSE_LINE: + _pEditView->execute(SCI_LINETRANSPOSE); + 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(); + break; + + case IDM_EDIT_STREAM_COMMENT: + doStreamComment(); + break; + + case IDM_EDIT_TRIMTRAILING: + doTrimTrailing(); + break; + + case IDM_EDIT_SETREADONLY: + { + HMENU hMenu = ::GetMenu(_hSelf); + int check = (::GetMenuState(hMenu, id, MF_BYCOMMAND) == MF_CHECKED)?MF_UNCHECKED:MF_CHECKED; + ::CheckMenuItem(hMenu, id, MF_BYCOMMAND | check); + _pEditView->setCurrentDocReadOnlyByUser(check == MF_CHECKED); + _pDocTab->updateCurrentTabItem(); + } + break; + + case IDM_EDIT_CLEARREADONLY: + { + DWORD dwFileAttribs = ::GetFileAttributes(_pEditView->getCurrentBuffer().getFileName()); + dwFileAttribs ^= FILE_ATTRIBUTE_READONLY; + + ::SetFileAttributes(_pEditView->getCurrentBuffer().getFileName(), dwFileAttribs); + + //_pEditView->getCurrentBuffer().setReadOnly(false); + _pEditView->execute(SCI_SETREADONLY,false); + _pEditView->updateCurrentDocSysReadOnlyStat(); + + _pDocTab->updateCurrentTabItem(); + + HMENU hMenu = ::GetMenu(_hSelf); + enableCommand(IDM_EDIT_SETREADONLY, true, MENU); + } + break; + + case IDM_VIEW_FULLSCREENTOGGLE : + fullScreenToggle(); + break; + + case IDM_VIEW_ALWAYSONTOP: + { + HMENU hMenu = ::GetMenu(_hSelf); + int check = (::GetMenuState(hMenu, id, MF_BYCOMMAND) == MF_CHECKED)?MF_UNCHECKED:MF_CHECKED; + ::CheckMenuItem(hMenu, 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_HIDE: + { + int checkedID = getToolBarState(); + + if (checkedID != IDM_VIEW_TOOLBAR_HIDE) + { + RECT rc; + getClientRect(rc); + _toolBar.display(false); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_TOOLBAR_REDUCE: + { + int checkedID = getToolBarState(); + + if (checkedID != IDM_VIEW_TOOLBAR_REDUCE) + { + RECT rc; + getClientRect(rc); + _toolBar.reduce(); + _toolBar.display(); + _rebar.reNew(); + _rebar.display(); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + //changeToolBarIcons(); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_TOOLBAR_ENLARGE: + { + int checkedID = getToolBarState(); + if (checkedID != IDM_VIEW_TOOLBAR_ENLARGE) + { + RECT rc; + getClientRect(rc); + _toolBar.enlarge(); + _toolBar.display(); + _rebar.reNew(); + _rebar.display(); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + changeToolBarIcons(); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_TOOLBAR_STANDARD: + { + int checkedID = getToolBarState(); + if (checkedID != IDM_VIEW_TOOLBAR_STANDARD) + { + RECT rc; + getClientRect(rc); + _toolBar.setToUglyIcons(); + _toolBar.display(); + _rebar.reNew(); + _rebar.display(); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + checkToolBarMenu(id); + } + } + break; + + case IDM_VIEW_REDUCETABBAR : + { + _toReduceTabBar = !_toReduceTabBar; + + //Resize the icon + int iconSize = _toReduceTabBar?12:20; + + //Resize the tab height + int tabHeight = _toReduceTabBar?20:25; + + //change the font + int stockedFont = _toReduceTabBar?DEFAULT_GUI_FONT:SYSTEM_FONT; + + TabCtrl_SetItemSize(_mainDocTab.getHSelf(), 45, tabHeight); + TabCtrl_SetItemSize(_subDocTab.getHSelf(), 45, tabHeight); + + _docTabIconList.setIconSize(iconSize); + + 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)); + } + RECT rc; + + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + break; + } + + case IDM_VIEW_REFRESHTABAR : + { + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + 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()); + 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); + } + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + break; + } + + case IDM_VIEW_DRAWTABBAR_DBCLK2CLOSE : + { + TabBarPlus::setDbClk2Close(!TabBarPlus::isDbClk2Close()); + break; + } + + case IDM_VIEW_STATUSBAR: + { + RECT rc; + getClientRect(rc); + NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI(); + nppGUI._statusBarShow = !nppGUI._statusBarShow; + _statusBar.display(nppGUI._statusBarShow); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + break; + } + case IDM_VIEW_TAB_SPACE: + case IDM_VIEW_EOL: + case IDM_VIEW_ALL_CHARACTERS: + { + HMENU hMenu = ::GetMenu(_hSelf); + bool isChecked = !(::GetMenuState(hMenu, id, MF_BYCOMMAND) == MF_CHECKED); + if (id == IDM_VIEW_TAB_SPACE) + { + ::CheckMenuItem(hMenu, IDM_VIEW_EOL, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_ALL_CHARACTERS, MF_BYCOMMAND | MF_UNCHECKED); + _toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, !isChecked); + _pEditView->showEOL(false); + _pEditView->showWSAndTab(isChecked); + } + else if (id == IDM_VIEW_EOL) + { + ::CheckMenuItem(hMenu, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_ALL_CHARACTERS, MF_BYCOMMAND | MF_UNCHECKED); + _toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, !isChecked); + _pEditView->showEOL(isChecked); + _pEditView->showWSAndTab(false); + } + else + { + ::CheckMenuItem(hMenu, IDM_VIEW_EOL, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(hMenu, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | MF_UNCHECKED); + _pEditView->showInvisibleChars(isChecked); + _toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, isChecked); + } + ::CheckMenuItem(hMenu, id, MF_BYCOMMAND | (isChecked?MF_CHECKED:MF_UNCHECKED)); + break; + } +/* + case IDM_DOCKTEST : + { + tTbData data = {0}; + PluginDialog *pPlugin = new PluginDialog; + pPlugin->init(_hInst, _hSelf, &data); + _dockingManager.createDockableDlg(data); + 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: + { + _pEditView->wrap(!_pEditView->isWrap()); + _toolBar.setCheck(IDM_VIEW_WRAP, _pEditView->isWrap()); + checkMenuItem(IDM_VIEW_WRAP, _pEditView->isWrap()); + break; + } + case IDM_VIEW_WRAP_SYMBOL: + { + _pEditView->showWrapSymbol(!_pEditView->isWrapSymbolVisible()); + //_toolBar.setCheck(IDM_VIEW_WRAP, _pEditView->isWrap()); + checkMenuItem(IDM_VIEW_WRAP_SYMBOL, _pEditView->isWrapSymbolVisible()); + break; + } + case IDM_VIEW_ZOOMIN: + { + _pEditView->execute(SCI_ZOOMIN); + break; + } + case IDM_VIEW_ZOOMOUT: + _pEditView->execute(SCI_ZOOMOUT); + break; + + case IDM_VIEW_ZOOMRESTORE: + _pEditView->execute(SCI_SETZOOM, _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 : + { + int f = int((id == IDM_FORMAT_TODOS)?SC_EOL_CRLF:(id == IDM_FORMAT_TOUNIX)?SC_EOL_LF:SC_EOL_CR); + _pEditView->execute(SCI_SETEOLMODE, f); + _pEditView->execute(SCI_CONVERTEOLS, f); + (_pEditView->getCurrentBuffer()).setFormat((formatType)f); + enableConvertMenuItems((formatType)f); + setDisplayFormat((formatType)f); + 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 : + { + UniMode um; + bool isUnicodeMode = true; + switch (id) + { + case IDM_FORMAT_ANSI: + um = uni8Bit; + isUnicodeMode = false; + 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_AS_UTF_8 + { + bool wasChecked = (_pEditView->getCurrentBuffer().getUnicodeMode() == uniCookie); + if (wasChecked) + { + um = uni8Bit; + isUnicodeMode = false; + } + else + { + um = uniCookie; + checkMenuItem(IDM_FORMAT_AS_UTF_8, false); + } + } + } + _pEditView->getCurrentBuffer().setUnicodeMode(um); + _pDocTab->updateCurrentTabItem(); + checkDocState(); + synchronise(); + + _pEditView->execute(SCI_SETCODEPAGE, isUnicodeMode?SC_CP_UTF8:0); + checkUnicodeMenuItems(um); + setUniModeText(um); + 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, _hSelf, nppgui._tabSize, "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_HISTORY_SIZE : + { + ValueDlg nbHistoryDlg; + NppParameters *pNppParam = NppParameters::getInstance(); + nbHistoryDlg.init(_hInst, _hSelf, pNppParam->getNbMaxFile(), "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_HISTORY_DONT_CHECK : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._checkHistoryFiles = !nppgui._checkHistoryFiles; + checkMenuItem(IDM_SETTING_HISTORY_DONT_CHECK, !nppgui._checkHistoryFiles); + 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); + shortcutMapper.doDialog(_isRTL); + shortcutMapper.destroy(); + break; + } + case IDM_SETTING_FILE_AUTODETECTION_ENABLE : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._fileAutoDetection = cdEnabled; + break; + } + + case IDM_SETTING_FILE_AUTODETECTION_DISABLE : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._fileAutoDetection = cdDisabled; + break; + } + case IDM_SETTING_FILE_AUTODETECTION_ENABLESILENTLY : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._fileAutoDetection = cdAutoUpdate; + break; + } + + case IDM_SETTING_TRAYICON : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._isMinimizedToTray = !nppgui._isMinimizedToTray; + checkMenuItem(IDM_SETTING_TRAYICON, nppgui._isMinimizedToTray); + break; + } + + case IDM_SETTING_REMEMBER_LAST_SESSION : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._rememberLastSession = !nppgui._rememberLastSession; + checkMenuItem(IDM_SETTING_REMEMBER_LAST_SESSION, nppgui._rememberLastSession); + break; + } + + case IDM_SETTING_PREFERECE : + { + bool isFirstTime = !_preference.isCreated(); + _preference.doDialog(_isRTL); + + if (isFirstTime) + { + changePrefereceDlgLang(); + } + break; + } + + case IDC_DOC_GOTO_ANOTHER_VIEW: + docGotoAnotherEditView(MODE_TRANSFER); + checkSyncState(); + break; + + case IDC_DOC_CLONE_TO_ANOTHER_VIEW: + docGotoAnotherEditView(MODE_CLONE); + checkSyncState(); + break; + + case IDM_ABOUT: + { + bool isFirstTime = !_aboutDlg.isCreated(); + _aboutDlg.doDialog(); + if (isFirstTime && _nativeLang) + { + const char *lang = (_nativeLang->ToElement())->Attribute("name"); + if (lang && !strcmp(lang, "¤¤¤åÁcÅé")) + { + char *authorName = "«J¤µ§^"; + HWND hItem = ::GetDlgItem(_aboutDlg.getHSelf(), IDC_AUTHOR_NAME); + ::SetWindowText(hItem, authorName); + } + } + } + break; + + case IDC_AUTOCOMPLETE : + showAutoComp(); + break; + + case IDC_AUTOCOMPLETE_CURRENTFILE : + //MessageBox(NULL, "IDC_AUTOCOMPLETE_CURRENTFILE", "", MB_OK); + autoCompFromCurrentFile(); + break; + + case IDM_LANGSTYLE_CONFIG_DLG : + { + /* + bool isFirstTime = !_configStyleDlg.isCreated(); + _configStyleDlg.doDialog(_isRTL); + if (isFirstTime) + changeConfigLang(); + */ + if (!_configStyleDlg.isCreated()) + { + tTbData data = {0}; + _configStyleDlg.create(&data); + //_dockingManager.createDockableDlg(data); + + changeConfigLang(); + } + else + { + _configStyleDlg.display(); + } + break; + } + + case IDM_LANG_C : + setLanguage(id, L_C); + break; + + case IDM_LANG_CPP : + setLanguage(id, L_CPP); + break; + + case IDM_LANG_JAVA : + setLanguage(id, L_JAVA); + break; + + case IDM_LANG_CS : + setLanguage(id, L_CS); + break; + + case IDM_LANG_HTML : + setLanguage(id, L_HTML); + break; + + case IDM_LANG_XML : + setLanguage(id, L_XML); + break; + + case IDM_LANG_JS : + setLanguage(id, L_JS); + break; + + case IDM_LANG_PHP : + setLanguage(id, L_PHP); + break; + + case IDM_LANG_ASP : + setLanguage(id, L_ASP); + break; + + case IDM_LANG_CSS : + setLanguage(id, L_CSS); + break; + + case IDM_LANG_LUA : + setLanguage(id, L_LUA); + break; + + case IDM_LANG_PERL : + setLanguage(id, L_PERL); + break; + + case IDM_LANG_PYTHON : + setLanguage(id, L_PYTHON); + break; + + case IDM_LANG_PASCAL : + setLanguage(id, L_PASCAL); + break; + + case IDM_LANG_BATCH : + setLanguage(id, L_BATCH); + break; + + case IDM_LANG_OBJC : + setLanguage(id, L_OBJC); + break; + + case IDM_LANG_VB : + setLanguage(id, L_VB); + break; + + case IDM_LANG_SQL : + setLanguage(id, L_SQL); + break; + + case IDM_LANG_ASCII : + setLanguage(id, L_NFO); + break; + + case IDM_LANG_TEXT : + setLanguage(id, L_TXT); + break; + + case IDM_LANG_RC : + setLanguage(id, L_RC); + break; + + case IDM_LANG_MAKEFILE : + setLanguage(id, L_MAKEFILE); + break; + + case IDM_LANG_INI : + setLanguage(id, L_INI); + break; + + case IDM_LANG_TEX : + setLanguage(id, L_TEX); + break; + + case IDM_LANG_FORTRAN : + setLanguage(id, L_FORTRAN); + break; + + case IDM_LANG_SH : + setLanguage(id, L_BASH); + break; + + case IDM_LANG_FLASH : + setLanguage(id, L_FLASH); + break; + + case IDM_LANG_NSIS : + setLanguage(id, L_NSIS); + break; + + case IDM_LANG_TCL : + setLanguage(id, L_TCL); + break; + + case IDM_LANG_LISP : + setLanguage(id, L_LISP); + break; + + case IDM_LANG_SCHEME : + setLanguage(id, L_SCHEME); + break; + + case IDM_LANG_ASM : + setLanguage(id, L_ASM); + break; + + case IDM_LANG_DIFF : + setLanguage(id, L_DIFF); + break; + + case IDM_LANG_PROPS : + setLanguage(id, L_PROPS); + break; + + case IDM_LANG_PS: + setLanguage(id, L_PS); + break; + + case IDM_LANG_RUBY: + setLanguage(id, L_RUBY); + break; + + case IDM_LANG_SMALLTALK: + setLanguage(id, L_SMALLTALK); + break; + case IDM_LANG_VHDL : + setLanguage(id, L_VHDL); + break; + + case IDM_LANG_KIX : + setLanguage(id, L_KIX); + break; + + case IDM_LANG_CAML : + setLanguage(id, L_CAML); + break; + + case IDM_LANG_ADA : + setLanguage(id, L_ADA); + break; + + case IDM_LANG_VERILOG : + setLanguage(id, L_VERILOG); + break; + + case IDM_LANG_MATLAB : + setLanguage(id, L_MATLAB); + break; + + case IDM_LANG_HASKELL : + setLanguage(id, L_HASKELL); + break; + + case IDM_LANG_AU3 : + setLanguage(id, L_AU3); + break; + + + case IDM_LANG_USER : + setLanguage(id, L_USER); + break; + + case IDC_PREV_DOC : + case IDC_NEXT_DOC : + { + int nbDoc = _mainDocTab.isVisible()?_mainEditView.getNbDoc():0; + nbDoc += _subDocTab.isVisible()?_subEditView.getNbDoc():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(); + } + } + } + break; + + case IDM_OPEN_ALL_RECENT_FILE : + for (int i = IDM_FILEMENU_LASTONE + 1 ; i < (IDM_FILEMENU_LASTONE + _lastRecentFileList.getMaxNbLRF() + 1) ; i++) + { + char fn[MAX_PATH]; + int res = ::GetMenuString(::GetMenu(_hSelf), i, fn, sizeof(fn), MF_BYCOMMAND); + if (res) + { + doOpen(fn); + } + } + break; + + case IDM_EDIT_RTL : + case IDM_EDIT_LTR : + { + long exStyle = ::GetWindowLong(_pEditView->getHSelf(), GWL_EXSTYLE); + exStyle = (id == IDM_EDIT_RTL)?exStyle|WS_EX_LAYOUTRTL:exStyle&(~WS_EX_LAYOUTRTL); + ::SetWindowLong(_pEditView->getHSelf(), GWL_EXSTYLE, exStyle); + _pEditView->defineDocType(_pEditView->getCurrentDocType()); + _pEditView->redraw(); + } + break; + + case IDM_WINDOW_WINDOWS : + { + WindowsDlg _windowsDlg; + _windowsDlg.init(_hInst, _hSelf, _pEditView); + + TiXmlNode *dlgNode = NULL; + if (_nativeLang) + { + dlgNode = _nativeLang->FirstChild("Dialog"); + if (dlgNode) + dlgNode = searchDlgNode(dlgNode, "Window"); + } + _windowsDlg.doDialog(dlgNode); + + //changeDlgLang(_windowsDlg.getHSelf(), "Window"); + } + break; + + case IDC_KEY_HOME : + _pEditView->execute(SCI_VCHOMEWRAP); + break; + + case IDC_KEY_END : + _pEditView->execute(SCI_LINEENDWRAP); + break; + + case IDC_KEY_SELECT_2_HOME : + _pEditView->execute(SCI_VCHOMEWRAPEXTEND); + break; + + case IDC_KEY_SELECT_2_END : + _pEditView->execute(SCI_LINEENDWRAPEXTEND); + break; + + default : + if (id > IDM_FILE_EXIT && id < (IDM_FILE_EXIT + _lastRecentFileList.getMaxNbLRF() + 1)) + { + char fn[MAX_PATH]; + int res = ::GetMenuString(::GetMenu(_hSelf), id, fn, sizeof(fn), MF_BYCOMMAND); + if (res) + { + if (doOpen(fn)) + { + setLangStatus(_pEditView->getCurrentDocType()); + } + } + } + else if ((id > IDM_LANG_USER) && (id < IDM_LANG_USER_LIMIT)) + { + char langName[langNameLenMax]; + ::GetMenuString(::GetMenu(_hSelf), id, langName, sizeof(langName), MF_BYCOMMAND); + _pEditView->setCurrentDocUserType(langName); + setLangStatus(L_USER); + checkLangsMenu(id); + } + 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_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_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_STREAM_COMMENT: + case IDM_EDIT_TRIMTRAILING: + 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 IDC_DOC_GOTO_ANOTHER_VIEW: + case IDC_PREV_DOC : + case IDC_NEXT_DOC : + _macro.push_back(recordedMacroStep(id)); + break; + } + +} + +void Notepad_plus::setTitleWith(const char *filePath) +{ + if (!filePath || !strcmp(filePath, "")) + return; + + char str2concat[MAX_PATH]; + strcat(strcpy(str2concat, _className), " - "); + strcat(str2concat, filePath); + ::SetWindowText(_hSelf, str2concat); +} + +void Notepad_plus::activateNextDoc(bool direction) +{ + int nbDoc = _pEditView->getNbDoc(); + if (!nbDoc) return; + + int curIndex = _pEditView->getCurrentDocIndex(); + curIndex += (direction == dirUp)?-1:1; +/* + if (((NppParameters::getInstance())->getNppGUI())._styleMRU) + { + int highestWeight = (_pEditView->getCurrentBuffer()).getRecentTag(); + //printInt(highestWeight); + int currentWeight; + int currentViewHeaviestIndex = _pEditView->getNextPriorityIndex(currentWeight, highestWeight); + //printInt(currentWeight); + int nonCurWeight; + int nonCurViewHeaviestIndex = getNonCurrentEditView()->getNextPriorityIndex(nonCurWeight, highestWeight); + + if (nonCurWeight > currentWeight) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + curIndex = nonCurViewHeaviestIndex; + } + else + curIndex = currentViewHeaviestIndex; + + //printInt(curIndex); + } + else // For non MRU +*/ + { + if (curIndex >= nbDoc) + { + if (getNonCurrentDocTab()->isVisible()) + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + curIndex = 0; + } + else if (curIndex < 0) + { + if (getNonCurrentDocTab()->isVisible()) + { + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + nbDoc = _pEditView->getNbDoc(); + } + curIndex = nbDoc - 1; + } + } + char *fullPath = _pDocTab->activate(curIndex); + setTitleWith(fullPath); + checkDocState(); + + char dirPath[MAX_PATH]; + + strcpy(dirPath, fullPath); + PathRemoveFileSpec(dirPath); + setWorkingDir(dirPath); +} + + +void Notepad_plus::activateDoc(int pos) +{ + int nbDoc = _pEditView->getNbDoc(); + if (!nbDoc) return; + + if (pos == _pEditView->getCurrentDocIndex()) + { + (_pEditView->getCurrentBuffer()).increaseRecentTag(); + return; + } + + if (pos >= 0 && pos < nbDoc) + { + char *fullPath = _pDocTab->activate(pos); + setTitleWith(fullPath); + checkDocState(); + char dirPath[MAX_PATH]; + + strcpy(dirPath, fullPath); + PathRemoveFileSpec(dirPath); + setWorkingDir(dirPath); + } +} + +void Notepad_plus::updateStatusBar() +{ + char strLnCol[64]; + sprintf(strLnCol, "Ln : %d Col : %d Sel : %d",\ + (_pEditView->getCurrentLineNumber() + 1), \ + (_pEditView->getCurrentColumnNumber() + 1),\ + (_pEditView->getSelectedByteNumber())); + + _statusBar.setText(strLnCol, STATUSBAR_CUR_POS); + + char strDonLen[64]; + sprintf(strDonLen, "nb char : %d", _pEditView->getCurrentDocLen()); + _statusBar.setText(strDonLen, STATUSBAR_DOC_SIZE); + + setDisplayFormat((_pEditView->getCurrentBuffer()).getFormat()); + setUniModeText(_pEditView->getCurrentBuffer().getUnicodeMode()); + _statusBar.setText(_pEditView->execute(SCI_GETOVERTYPE) ? "OVR" : "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 = ::ChildWindowFromPoint(_hSelf, p); + if (hWin) + { + if ((_mainEditView.getHSelf() == hWin) || (_mainDocTab.getHSelf() == hWin)) + switchEditViewTo(MAIN_VIEW); + else if ((_subEditView.getHSelf() == hWin) || (_subDocTab.getHSelf() == hWin)) + switchEditViewTo(SUB_VIEW); + } + + int filesDropped = ::DragQueryFile(hdrop, 0xffffffff, NULL, 0); + for (int i = 0 ; i < filesDropped ; ++i) + { + char pathDropped[MAX_PATH]; + ::DragQueryFile(hdrop, i, pathDropped, sizeof(pathDropped)); + doOpen(pathDropped); + setLangStatus(_pEditView->getCurrentDocType()); + } + ::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() +{ + const int NB_VIEW = 2; + ScintillaEditView * pScintillaArray[NB_VIEW]; + DocTabView * pDocTabArray[NB_VIEW]; + + int currentView = getCurrentView(); + int currentIndex = _pEditView->getCurrentDocIndex(); + + // the oder (1.current view 2.non current view) is important + // to synchronize with "hideCurrentView" function + pScintillaArray[0] = _pEditView; + pScintillaArray[1] = getNonCurrentEditView(); + + pDocTabArray[0] = _pDocTab; + pDocTabArray[1] = getNonCurrentDocTab(); + + NppParameters *pNppParam = NppParameters::getInstance(); + const NppGUI & nppGUI = pNppParam->getNppGUI(); + bool autoUpdate = (nppGUI._fileAutoDetection == cdAutoUpdate); + + for (int j = 0 ; j < NB_VIEW ; j++) + { + for (int i = (pScintillaArray[j]->getNbDoc()-1) ; i >= 0 ; i--) + { + Buffer & docBuf = pScintillaArray[j]->getBufferAt(i); + docFileStaus fStatus = docBuf.checkFileState(); + pDocTabArray[j]->updateTabItem(i); + bool update = !docBuf.isDirty() && autoUpdate; + + if (fStatus == MODIFIED_FROM_OUTSIDE) + { + // If npp is minimized, bring it up to the top + if (::IsIconic(_hSelf)) + ::ShowWindow(_hSelf, SW_SHOWNORMAL); + + if (update || doReloadOrNot(docBuf.getFileName()) == IDYES) + { + pDocTabArray[j]->activate(i); + // if it's a non current view, make it as the current view + if (j == 1) + switchEditViewTo(getNonCurrentView()); + + if (pScintillaArray[j]->isCurrentBufReadOnly()) + pScintillaArray[j]->execute(SCI_SETREADONLY, FALSE); + + reload(docBuf.getFileName()); + + if (pScintillaArray[j]->isCurrentBufReadOnly()) + pScintillaArray[j]->execute(SCI_SETREADONLY, TRUE); + } + docBuf.updatTimeStamp(); + } + else if (fStatus == FILE_DELETED) + { + if (::IsIconic(_hSelf)) + ::ShowWindow(_hSelf, SW_SHOWNORMAL); + + if (doCloseOrNot(docBuf.getFileName()) == IDNO) + { + pDocTabArray[j]->activate(i); + if ((pScintillaArray[j]->getNbDoc() == 1) && (_mainWindowStatus & TWO_VIEWS_MASK)) + { + pDocTabArray[j]->closeCurrentDoc(); + hideCurrentView(); + } + else + pDocTabArray[j]->closeCurrentDoc(); + } + } + + bool isReadOnly = pScintillaArray[j]->isCurrentBufReadOnly(); + pScintillaArray[j]->execute(SCI_SETREADONLY, isReadOnly); + //_pDocTab->updateCurrentTabItem(); + } + } + + if (autoUpdate) + { + switchEditViewTo(currentView); + _pDocTab->activate(currentIndex); + } +} + +void Notepad_plus::hideCurrentView() +{ + if (_mainWindowStatus & DOCK_MASK) + { + _pMainSplitter->setWin0(getNonCurrentDocTab()); + } + else // otherwise the main window is the spltter container that we just created + _pMainWindow = getNonCurrentDocTab(); + + _subSplitter.display(false); + _pEditView->display(false); + _pDocTab->display(false); + + // resize the main window + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + //setTitleWith(_pEditView->getCurrentTitle()); + + _mainWindowStatus &= ~TWO_VIEWS_MASK; +} + +bool Notepad_plus::fileClose() +{ + int res; + bool isDirty = _pEditView->isCurrentDocDirty(); + + //process the fileNamePath into LRF + const char *fileNamePath = _pEditView->getCurrentTitle(); + + if ((!isDirty) && (Buffer::isUntitled(fileNamePath)) && (_pEditView->getNbDoc() == 1) && (!getNonCurrentDocTab()->isVisible())) + return true; + + if (isDirty) + { + if ((res = doSaveOrNot(_pEditView->getCurrentTitle())) == IDYES) + { + if (!fileSave()) // the cancel button of savdialog is pressed + return false; + } + else if (res == IDCANCEL) + return false; + // else IDNO we continue + } + + //si ce n'est pas untited(avec prefixe "new "), on fait le traitement + if (!Buffer::isUntitled(fileNamePath)) + { + _lastRecentFileList.add(fileNamePath); + } + + + if ((_pEditView->getNbDoc() == 1) && (_mainWindowStatus & TWO_VIEWS_MASK)) + { + _pDocTab->closeCurrentDoc(); + hideCurrentView(); + return true; + } + + char fullPath[MAX_PATH]; + strcpy(fullPath, _pDocTab->closeCurrentDoc()); + setTitleWith(fullPath); + + PathRemoveFileSpec(fullPath); + setWorkingDir(fullPath); + + updateStatusBar(); + dynamicCheckMenuAndTB(); + checkDocState(); + + return true; +} + +bool Notepad_plus::fileCloseAll() +{ + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + + if (!fileClose()) + return false; + } + + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + return fileClose(); +} + +bool Notepad_plus::fileCloseAllButCurrent() +{ + int curIndex = _pEditView->getCurrentDocIndex(); + _pEditView->activateDocAt(0); + + for (int i = 0 ; i < curIndex ; i++) + if (!fileClose()) + return false; + + if (_pEditView->getNbDoc() > 1) + { + _pEditView->activateDocAt(1); + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + } + if (_mainWindowStatus & TWO_VIEWS_MASK) + { + switchEditViewTo(getNonCurrentView()); + while (_pEditView->getNbDoc() > 1) + if (!fileClose()) + return false; + return fileClose(); + } + return true; +} + +void Notepad_plus::reload(const char *fileName) +{ + Utf8_16_Read UnicodeConvertor; + Buffer & buffer = _pEditView->getCurrentBuffer(); + Position pos = buffer._pos; + + FILE *fp = fopen(fileName, "rb"); + if (fp) + { + // It's VERY IMPORTANT to reset the view + _pEditView->execute(SCI_CLEARALL); + + char data[blockSize]; + + size_t lenFile = fread(data, 1, sizeof(data), fp); + while (lenFile > 0) { + lenFile = UnicodeConvertor.convert(data, lenFile); + _pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast(UnicodeConvertor.getNewBuf())); + lenFile = int(fread(data, 1, sizeof(data), fp)); + } + fclose(fp); + + UniMode unicodeMode = static_cast(UnicodeConvertor.getEncoding()); + buffer.setUnicodeMode(unicodeMode); + + if (unicodeMode != uni8Bit) + // Override the code page if Unicode + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + _pEditView->getFocus(); + _pEditView->execute(SCI_SETSAVEPOINT); + _pEditView->execute(EM_EMPTYUNDOBUFFER); + _pEditView->restoreCurrentPos(pos); + } + else + { + char msg[MAX_PATH + 100]; + strcpy(msg, "Can not open file \""); + strcat(msg, fileName); + strcat(msg, "\"."); + ::MessageBox(_hSelf, msg, "ERR", MB_OK); + } +} + +void Notepad_plus::getMainClientRect(RECT &rc) const +{ + Window::getClientRect(rc); + rc.top += _toolBar.getHeight() + 2; + rc.bottom -= _toolBar.getHeight() + 2 +_statusBar.getHeight(); +} + +void Notepad_plus::getToolBarClientRect(RECT &rc) const +{ + Window::getClientRect(rc); + rc.bottom = _toolBar.getHeight(); +} + +void Notepad_plus::getStatusBarClientRect(RECT & rc) const +{ + RECT rectMain; + + getMainClientRect(rectMain); + getClientRect(rc); + rc.top = rectMain.top + rectMain.bottom; + rc.bottom = rc.bottom - rc.top; +} + +void Notepad_plus::dockUserDlg() +{ + if (!_pMainSplitter) + { + _pMainSplitter = new SplitterContainer; + _pMainSplitter->init(_hInst, _hSelf); + + Window *pWindow; + if (_mainWindowStatus & TWO_VIEWS_MASK) + pWindow = &_subSplitter; + else + pWindow = _pDocTab; + + _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45); + } + + if (_mainWindowStatus & TWO_VIEWS_MASK) + _pMainSplitter->setWin0(&_subSplitter); + else + _pMainSplitter->setWin0(_pDocTab); + + _pMainSplitter->display(); + + _mainWindowStatus |= DOCK_MASK; + _pMainWindow = _pMainSplitter; + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); +} + +void Notepad_plus::undockUserDlg() +{ + // a cause de surchargement de "display" + ::ShowWindow(_pMainSplitter->getHSelf(), SW_HIDE); + + if (_mainWindowStatus & TWO_VIEWS_MASK) + _pMainWindow = &_subSplitter; + else + _pMainWindow = _pDocTab; + + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + _mainWindowStatus &= ~DOCK_MASK; + (ScintillaEditView::getUserDefineDlg())->display(); + //(_pEditView->getUserDefineDlg())->display(); +} + +void Notepad_plus::docGotoAnotherEditView(bool mode) +{ + if (!(_mainWindowStatus & TWO_VIEWS_MASK)) + { + // if there's dock dialog, it means there's also a splitter container + // we replace the right window by sub-spltter container that we just created + if (_mainWindowStatus & DOCK_MASK) + { + _pMainSplitter->setWin0(&_subSplitter); + _pMainWindow = _pMainSplitter; + } + else // otherwise the main window is the spltter container that we just created + _pMainWindow = &_subSplitter; + + // resize the main window + RECT rc; + getMainClientRect(rc); + _dockingManager.reSizeTo(rc); + + getNonCurrentEditView()->display(); + getNonCurrentDocTab()->display(); + + _pMainWindow->display(); + + // update the main window status + _mainWindowStatus |= TWO_VIEWS_MASK; + } + + // Bon, define the source view and the dest view + // source view + DocTabView *pSrcDocTab; + ScintillaEditView *pSrcEditView; + if (getCurrentView() == MAIN_VIEW) + { + // make dest view + switchEditViewTo(SUB_VIEW); + + // make source view + pSrcDocTab = &_mainDocTab; + pSrcEditView = &_mainEditView; + + } + else + { + // make dest view : _pDocTab & _pEditView + switchEditViewTo(MAIN_VIEW); + + // make source view + pSrcDocTab = &_subDocTab; + pSrcEditView = &_subEditView; + } + + // Maintenant, we begin to manipulate the source and the dest: + // 1. Save the current position of the source view to transfer + pSrcEditView->saveCurrentPos(); + + // 2. Retrieve the current buffer from the source + Buffer & buf = pSrcEditView->getCurrentBuffer(); + + // 3. See if the file to transfer exist in the dest view + // if so, we don't transfer the file(buffer) + // but activate the opened document in the dest view then beat it + int i; + if ( (i = _pDocTab->find(buf.getFileName())) != -1) + { + setTitleWith(_pDocTab->activate(i)); + _pDocTab->getFocus(); + return; + } + + // 4. Transfer the file (buffer) into the dest view + bool isNewDoc2Close = false; + + if ((_pEditView->getNbDoc() == 1) + && Buffer::isUntitled(_pEditView->getCurrentTitle()) + && (!_pEditView->isCurrentDocDirty()) && (_pEditView->getCurrentDocLen() == 0)) + { + isNewDoc2Close = true; + } + + setTitleWith(_pDocTab->newDoc(buf)); + _pDocTab->updateCurrentTabItem(NULL); + + if (isNewDoc2Close) + _pDocTab->closeDocAt(0); + + // 5. If it's the clone mode, we keep the document to transfer + // in the source view (do nothing). If it's the transfer mode + // we remove the file (buffer) from the source view + + if (mode != MODE_CLONE) + { + // Make focus to the source view + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + + if (_pEditView->getNbDoc() == 1) + { + // close the current doc in the dest view + _pDocTab->closeCurrentDoc(); + hideCurrentView(); + } + else + { + // close the current doc in the dest view + _pDocTab->closeCurrentDoc(); + + // return to state where the focus is on dest view + switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW); + } + } +} + +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_SYMBOLE)); + if (nextLine < 0) + nextLine = int(_pEditView->execute(sci_marker, lineRetry, 1 << MARK_SYMBOLE)); + + if (nextLine < 0) + return; + + _pEditView->execute(SCI_ENSUREVISIBLEENFORCEPOLICY, nextLine); + _pEditView->execute(SCI_GOTOLINE, nextLine); +} + +int Notepad_plus::switchEditViewTo(int gid) +{ + int oldView = getCurrentView(); + _pDocTab = (gid == MAIN_VIEW)?&_mainDocTab:&_subDocTab; + _pEditView = (gid == MAIN_VIEW)?&_mainEditView:&_subEditView; + _pEditView->beSwitched(); + _pEditView->getFocus(); + + checkDocState(); + setTitleWith(_pEditView->getCurrentTitle()); + setLangStatus(_pEditView->getCurrentDocType()); + updateStatusBar(); + dynamicCheckMenuAndTB(); + return oldView; +} + +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 uni8Bit : id = IDM_FORMAT_ANSI; break; + case uniUTF8 : id = IDM_FORMAT_UTF_8; break; + case uni16BE : id = IDM_FORMAT_UCS_2BE; break; + case uni16LE : id = IDM_FORMAT_UCS_2LE; break; + } + if (id != -1) + { + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_FORMAT_ANSI, IDM_FORMAT_UCS_2LE, id, MF_BYCOMMAND); + + //if (um != uni8Bit) + checkMenuItem(IDM_FORMAT_AS_UTF_8, FALSE); + enableCommand(IDM_FORMAT_AS_UTF_8, (um == uni8Bit), MENU); + } + else + { + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_FORMAT_ANSI, IDM_FORMAT_UCS_2LE, IDM_FORMAT_ANSI, MF_BYCOMMAND); + enableCommand(IDM_FORMAT_AS_UTF_8, true, MENU); + checkMenuItem(IDM_FORMAT_AS_UTF_8, true); + } +} + +static bool isInList(string word, const vector & wordArray) +{ + for (size_t i = 0 ; i < wordArray.size() ; i++) + if (wordArray[i] == word) + return true; + return false; +}; + +void Notepad_plus::autoCompFromCurrentFile() +{ + int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS)); + int startPos = int(_pEditView->execute(SCI_WORDSTARTPOSITION, curPos, true)); + + if (curPos == startPos) + return; + + char beginChars[256]; + + _pEditView->getText(beginChars, startPos, curPos); + + string expr("\\<"); + expr += beginChars; + expr += "[^ \\t.,;:\"()=<>'+!\\[\\]]*"; + + //::MessageBox(NULL, expr.c_str(), "", MB_OK); + + int docLength = int(_pEditView->execute(SCI_GETLENGTH)); + + int flags = SCFIND_WORDSTART | SCFIND_MATCHCASE | SCFIND_REGEXP | SCFIND_POSIX; + + _pEditView->execute(SCI_SETTARGETSTART, 0); + _pEditView->execute(SCI_SETTARGETEND, docLength); + _pEditView->execute(SCI_SETSEARCHFLAGS, flags); + + vector wordArray; + + int posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str())); + + while (posFind != -1) + { + int wordStart = int(_pEditView->execute(SCI_GETTARGETSTART)); + int wordEnd = int(_pEditView->execute(SCI_GETTARGETEND)); + //int foundTextLen = wordEnd - wordStart; + char w[256]; + _pEditView->getText(w, wordStart, wordEnd); + + if (strcmp(w, beginChars)) + if (!isInList(w, wordArray)) + wordArray.push_back(w); + + _pEditView->execute(SCI_SETTARGETSTART, wordEnd/*posFind + foundTextLen*/); + _pEditView->execute(SCI_SETTARGETEND, docLength); + posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str())); + } + if (wordArray.size() == 0) return; + + if (wordArray.size() == 1) + { + _pEditView->execute(SCI_SETTARGETSTART, startPos); + _pEditView->execute(SCI_SETTARGETEND, curPos); + _pEditView->execute(SCI_REPLACETARGETRE, wordArray[0].length(), (LPARAM)wordArray[0].c_str()); + + _pEditView->execute(SCI_GOTOPOS, startPos + wordArray[0].length()); + return; + } + + sort(wordArray.begin(), wordArray.end()); + + string words(""); + + for (size_t i = 0 ; i < wordArray.size() ; i++) + { + words += wordArray[i]; + if (i != wordArray.size()-1) + words += " "; + } + + _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' ')); + _pEditView->execute(SCI_AUTOCSETIGNORECASE, 3); + _pEditView->execute(SCI_AUTOCSHOW, curPos - startPos, WPARAM(words.c_str())); + +} + +void Notepad_plus::showAutoComp() +{ + int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS)); + int line = _pEditView->getCurrentLineNumber(); + int debutLinePos = int(_pEditView->execute(SCI_POSITIONFROMLINE, line )); + int debutMotPos = curPos; + + + char c = char(_pEditView->execute(SCI_GETCHARAT, debutMotPos-1)); + while ((debutMotPos>0)&&(debutMotPos>=debutLinePos)&&((isalnum(c))||(c=='_'))) + { + debutMotPos--; + c = char(_pEditView->execute(SCI_GETCHARAT, debutMotPos-1)); + } + LangType langType = _pEditView->getCurrentDocType(); + if ((langType == L_RC) || (langType == L_HTML) || (langType == L_SQL)) + { + int typeIndex = LANG_INDEX_INSTR; + + const char *pKeywords = (NppParameters::getInstance())->getWordList(langType, typeIndex); + if (pKeywords) + { + _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' ')); + //_pEditView->execute(SCI_AUTOCSETTYPESEPARATOR, WPARAM('(')); + _pEditView->execute(SCI_AUTOCSETIGNORECASE, 3); + _pEditView->execute(SCI_AUTOCSHOW, curPos-debutMotPos, WPARAM(pKeywords)); + } + } + else + { + char nppPath[MAX_PATH]; + strcpy(nppPath, _nppPath); + PathRemoveFileSpec(nppPath); + string fullFileName = nppPath; + string fileName; + getApiFileName(langType, fileName); + fileName += ".api"; + fullFileName += "\\plugins\\APIs\\"; + fullFileName += fileName; + + FILE* f = fopen( fullFileName.c_str(), "r" ); + + if (f) + { + fseek( f, 0, SEEK_END ); + size_t sz = ftell( f ); + fseek( f, 0, SEEK_SET ); + char* pData = new char[sz+1]; + size_t nbChar = fread(pData, 1, sz, f); + pData[nbChar] = '\0'; + fclose( f ); + + _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM('\n')); + //_pEditView->execute(SCI_AUTOCSETTYPESEPARATOR, WPARAM('(')); + _pEditView->execute(SCI_AUTOCSETIGNORECASE, 3); + _pEditView->execute(SCI_AUTOCSHOW, curPos-debutMotPos, WPARAM(pData)); + delete[] pData; + } + } +} + +void Notepad_plus::changeMenuLang(string & pluginsTrans, string & windowTrans) +{ + if (!_nativeLang) return; + + HMENU hMenu = ::GetMenu(_hSelf); + TiXmlNode *mainMenu = _nativeLang->FirstChild("Menu"); + if (!mainMenu) return; + + mainMenu = mainMenu->FirstChild("Main"); + if (!mainMenu) return; + + TiXmlNode *entriesRoot = mainMenu->FirstChild("Entries"); + if (!entriesRoot) return; + + const char *idName = NULL; + for (TiXmlNode *childNode = entriesRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int id; + if (element->Attribute("id", &id)) + { + const char *name = element->Attribute("name"); + ::ModifyMenu(hMenu, id, MF_BYPOSITION, 0, name); + } + else if (idName = element->Attribute("idName")) + { + const char *name = element->Attribute("name"); + if (!strcmp(idName, "Plugins")) + { + pluginsTrans = name; + } + else if (!strcmp(idName, "Window")) + { + windowTrans = name; + } + } + } + + TiXmlNode *menuCommandsRoot = mainMenu->FirstChild("Commands"); + + for (TiXmlNode *childNode = menuCommandsRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int id; + element->Attribute("id", &id); + const char *name = element->Attribute("name"); + ::ModifyMenu(hMenu, id, MF_BYCOMMAND, id, name); + } + + TiXmlNode *subEntriesRoot = mainMenu->FirstChild("SubEntries"); + + for (TiXmlNode *childNode = subEntriesRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int x, y; + element->Attribute("posX", &x); + element->Attribute("posY", &y); + const char *name = element->Attribute("name"); + ::ModifyMenu(::GetSubMenu(hMenu, x), y, MF_BYPOSITION, 0, name); + } + ::DrawMenuBar(_hSelf); +} +/* +const char * Notepad_plus::getNativeTip(int btnID) +{ + if (!_nativeLang) return NULL; + + TiXmlNode *tips = _nativeLang->FirstChild("Tips"); + if (!tips) return NULL; + + for (TiXmlNode *childNode = tips->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *element = childNode->ToElement(); + int id; + element->Attribute("id", &id); + if (id == btnID) + return element->Attribute("name"); + } + return NULL; +} +*/ + +void Notepad_plus::changeConfigLang() +{ + if (!_nativeLang) return; + + TiXmlNode *styleConfDlgNode = _nativeLang->FirstChild("Dialog"); + if (!styleConfDlgNode) return; + + styleConfDlgNode = styleConfDlgNode->FirstChild("StyleConfig"); + if (!styleConfDlgNode) return; + + HWND hDlg = _configStyleDlg.getHSelf(); + // Set Title + const char *titre = (styleConfDlgNode->ToElement())->Attribute("title"); + if ((titre && titre[0]) && hDlg) + ::SetWindowText(hDlg, titre); + + for (TiXmlNode *childNode = styleConfDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } + hDlg = _configStyleDlg.getHSelf(); + styleConfDlgNode = styleConfDlgNode->FirstChild("SubDialog"); + + for (TiXmlNode *childNode = styleConfDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } +} + +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) + ::SetWindowText(hItem, translatedText[i]); + } + } +} + +void Notepad_plus::changeUserDefineLang() +{ + if (!_nativeLang) return; + + TiXmlNode *userDefineDlgNode = _nativeLang->FirstChild("Dialog"); + if (!userDefineDlgNode) return; + + userDefineDlgNode = userDefineDlgNode->FirstChild("UserDefine"); + if (!userDefineDlgNode) return; + + UserDefineDialog *userDefineDlg = _pEditView->getUserDefineDlg(); + + HWND hDlg = userDefineDlg->getHSelf(); + // Set Title + const char *titre = (userDefineDlgNode->ToElement())->Attribute("title"); + if (titre && titre[0]) + ::SetWindowText(hDlg, titre); + + // pour ses propres controls + const int nbControl = 9; + const char *translatedText[nbControl]; + for (int i = 0 ; i < nbControl ; i++) + translatedText[i] = NULL; + + for (TiXmlNode *childNode = userDefineDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + 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"}; + + //int **idArrays[nbDlg] = {(int **)folderID, (int **)keywordsID, (int **)commentID, (int **)operatorID}; + + 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; + } + } + TiXmlNode *node = userDefineDlgNode->FirstChild(nodeNameArray[i]); + + if (node) + { + // Set Title + titre = (node->ToElement())->Attribute("title"); + if (titre &&titre[0]) + userDefineDlg->setTabName(i, titre); + + for (TiXmlNode *childNode = node->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } + } + } +} + +void Notepad_plus::changePrefereceDlgLang() +{ + changeDlgLang(_preference.getHSelf(), "Preference"); + + char title[64]; + + changeDlgLang(_preference._barsDlg.getHSelf(), "Global", title); + if (*title) + _preference._ctrlTab.renameTab("Global", title); + + changeDlgLang(_preference._marginsDlg.getHSelf(), "Scintillas", title); + if (*title) + _preference._ctrlTab.renameTab("Scintillas", title); + + changeDlgLang(_preference._defaultNewDocDlg.getHSelf(), "NewDoc", title); + if (*title) + _preference._ctrlTab.renameTab("NewDoc", title); + + changeDlgLang(_preference._fileAssocDlg.getHSelf(), "FileAssoc", title); + if (*title) + _preference._ctrlTab.renameTab("FileAssoc", title); + + changeDlgLang(_preference._langMenuDlg.getHSelf(), "LangMenu", title); + if (*title) + _preference._ctrlTab.renameTab("LangMenu", title); + + changeDlgLang(_preference._printSettingsDlg.getHSelf(), "Print1", title); + if (*title) + _preference._ctrlTab.renameTab("Print1", title); + + changeDlgLang(_preference._printSettings2Dlg.getHSelf(), "Print2", title); + if (*title) + _preference._ctrlTab.renameTab("Print2", title); + + changeDlgLang(_preference._settingsDlg.getHSelf(), "MISC", title); + if (*title) + _preference._ctrlTab.renameTab("MISC", title); + +} + +TiXmlNode * searchDlgNode(TiXmlNode *node, const char *dlgTagName) +{ + TiXmlNode *dlgNode = node->FirstChild(dlgTagName); + if (dlgNode) return dlgNode; + for (TiXmlNode *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 (!_nativeLang) return false; + + TiXmlNode *dlgNode = _nativeLang->FirstChild("Dialog"); + if (!dlgNode) return false; + + dlgNode = searchDlgNode(dlgNode, dlgTagName); + if (!dlgNode) return false; + + // Set Title + const char *titre = (dlgNode->ToElement())->Attribute("title"); + if ((titre && titre[0]) && hDlg) + { + ::SetWindowText(hDlg, titre); + if (title) + strcpy(title, titre); + } + + // Set the text of child control + for (TiXmlNode *childNode = dlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } + return true; +} + +static string extractSymbol(char prefix, const char *str2extract) +{ + bool found = false; + char extracted[128] = ""; + + for (size_t i = 0, j = 0 ; i < strlen(str2extract) ; i++) + { + if (found) + { + if (!str2extract[i] || str2extract[i] == ' ') + { + extracted[j] = '\0'; + return string(extracted); + } + extracted[j++] = str2extract[i]; + + } + else + { + if (!str2extract[i]) + return ""; + + if (str2extract[i] == prefix) + found = true; + } + } + return string(extracted); +}; + +bool Notepad_plus::doBlockComment() +{ + const char *commentLineSybol; + string symbol; + + Buffer & buf = _pEditView->getCurrentBuffer(); + if (buf._lang == L_USER) + { + UserLangContainer & userLangContainer = NppParameters::getInstance()->getULCFromName(buf._userLangExt); + //::MessageBox(NULL, userLangContainer._keywordLists[4], "User", MB_OK); + symbol = extractSymbol('0', userLangContainer._keywordLists[4]); + commentLineSybol = symbol.c_str(); + } + else + commentLineSybol = buf.getCommentLineSymbol(); + + + if ((!commentLineSybol) || (!commentLineSybol[0])) + return false; + + string comment(commentLineSybol); + comment += " "; + string long_comment = comment; + + char linebuf[1000]; + 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) >= static_cast(sizeof(linebuf))) // Avoid buffer size problems + continue; + /*if (props.GetInt(comment_at_line_start.c_str())) { + GetRange(wEditor, lineIndent, lineEnd, linebuf); + } else*/ + { + lineIndent = _pEditView->execute(SCI_GETLINEINDENTPOSITION, i); + _pEditView->getText(linebuf, lineIndent, lineEnd); + } + // empty lines are not commented + if (strlen(linebuf) < 1) + continue; + if (memcmp(linebuf, comment.c_str(), comment_length - 1) == 0) + { + if (memcmp(linebuf, long_comment.c_str(), comment_length) == 0) + { + // removing comment with space after it + _pEditView->execute(SCI_SETSEL, lineIndent, lineIndent + comment_length); + _pEditView->execute(SCI_REPLACESEL, 0, (WPARAM)""); + if (i == selStartLine) // is this the first selected line? + selectionStart -= comment_length; + selectionEnd -= comment_length; // every iteration + continue; + } + else + { + // removing comment _without_ space + _pEditView->execute(SCI_SETSEL, lineIndent, lineIndent + comment_length - 1); + _pEditView->execute(SCI_REPLACESEL, 0, (WPARAM)""); + if (i == selStartLine) // is this the first selected line? + selectionStart -= (comment_length - 1); + selectionEnd -= (comment_length - 1); // every iteration + continue; + } + } + if (i == selStartLine) // is this the first selected line? + selectionStart += comment_length; + selectionEnd += comment_length; // every iteration + _pEditView->execute(SCI_INSERTTEXT, lineIndent, (WPARAM)long_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 char *commentStart; + const char *commentEnd; + + string symbolStart; + string symbolEnd; + + Buffer & buf = _pEditView->getCurrentBuffer(); + if (buf._lang == L_USER) + { + UserLangContainer & userLangContainer = NppParameters::getInstance()->getULCFromName(buf._userLangExt); + symbolStart = extractSymbol('1', userLangContainer._keywordLists[4]); + commentStart = symbolStart.c_str(); + symbolEnd = extractSymbol('2', userLangContainer._keywordLists[4]); + commentEnd = symbolEnd.c_str(); + } + else + { + commentStart = _pEditView->getCurrentBuffer().getCommentStart(); + commentEnd = _pEditView->getCurrentBuffer().getCommentEnd(); + } + + if ((!commentStart) || (!commentStart[0])) + return false; + if ((!commentEnd) || (!commentEnd[0])) + return false; + + string start_comment(commentStart); + string end_comment(commentEnd); + string white_space(" "); + + 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); + + char linebuf[1000]; + _pEditView->getText(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->execute(SCI_INSERTTEXT, selectionStart, (WPARAM)start_comment.c_str()); + selectionEnd += start_comment_length; + selectionStart += start_comment_length; + _pEditView->execute(SCI_INSERTTEXT, selectionEnd, (WPARAM)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::addCurrentMacro() +{ + vector & theMacros = (NppParameters::getInstance())->getMacroList(); + + MacroShortcut ms(_macro); + ms.init(_hInst, _hSelf); + if (ms.doDialog() != -1) + { + theMacros.push_back(ms); + HMENU hMacroMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_MACRO); + int const posBase = 3; + int nbMacro = theMacros.size(); + if (nbMacro == 1) + ::InsertMenu(hMacroMenu, posBase + 1, MF_BYPOSITION, (unsigned int)-1, 0); + //char menuString[64]; + //sprintf(menuString, "%s%s%s", ms._name, "\t", ms.toString().c_str()); + ::InsertMenu(hMacroMenu, posBase + 1 + nbMacro, MF_BYPOSITION, ID_MACRO + nbMacro - 1, ms.toMenuItemString().c_str()); + _isMacrosScModified = true; + _accelerator.uptdateShortcuts(); + 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()); +} + +ToolBarButtonUnit toolBarIcons[] = { + //{IDM_FILE_NEW, IDI_NEW_OFF_ICON, IDI_NEW_ON_ICON, IDI_NEW_OFF_ICON, STD_FILENEW}, + {IDM_FILE_NEW, IDI_NEW_OFF_ICON, IDI_NEW_ON_ICON, IDI_NEW_OFF_ICON, -1}, + //{IDM_FILE_OPEN, IDI_OPEN_OFF_ICON, IDI_OPEN_ON_ICON, IDI_NEW_OFF_ICON, STD_FILEOPEN}, + {IDM_FILE_OPEN, IDI_OPEN_OFF_ICON, IDI_OPEN_ON_ICON, IDI_NEW_OFF_ICON, -1}, + //{IDM_FILE_SAVE, IDI_SAVE_OFF_ICON, IDI_SAVE_ON_ICON, IDI_SAVE_DISABLE_ICON, STD_FILESAVE}, + {IDM_FILE_SAVE, IDI_SAVE_OFF_ICON, IDI_SAVE_ON_ICON, IDI_SAVE_DISABLE_ICON, -1}, + {IDM_FILE_SAVEALL, IDI_SAVEALL_OFF_ICON, IDI_SAVEALL_ON_ICON, IDI_SAVEALL_DISABLE_ICON, -1}, + {IDM_FILE_CLOSE, IDI_CLOSE_OFF_ICON, IDI_CLOSE_ON_ICON, IDI_CLOSE_OFF_ICON, -1}, + {IDM_FILE_CLOSEALL, IDI_CLOSEALL_OFF_ICON, IDI_CLOSEALL_ON_ICON, IDI_CLOSEALL_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, STD_CUT}, + //{IDM_EDIT_COPY, IDI_COPY_OFF_ICON, IDI_COPY_ON_ICON, IDI_COPY_DISABLE_ICON, STD_COPY}, + //{IDM_EDIT_PASTE, IDI_PASTE_OFF_ICON, IDI_PASTE_ON_ICON, IDI_PASTE_DISABLE_ICON, STD_PASTE}, + {IDM_EDIT_CUT, IDI_CUT_OFF_ICON, IDI_CUT_ON_ICON, IDI_CUT_DISABLE_ICON, -1}, + {IDM_EDIT_COPY, IDI_COPY_OFF_ICON, IDI_COPY_ON_ICON, IDI_COPY_DISABLE_ICON, -1}, + {IDM_EDIT_PASTE, IDI_PASTE_OFF_ICON, IDI_PASTE_ON_ICON, IDI_PASTE_DISABLE_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, STD_UNDO}, + //{IDM_EDIT_REDO, IDI_REDO_OFF_ICON, IDI_REDO_ON_ICON, IDI_REDO_DISABLE_ICON, STD_REDOW}, + {IDM_EDIT_UNDO, IDI_UNDO_OFF_ICON, IDI_UNDO_ON_ICON, IDI_UNDO_DISABLE_ICON, -1}, + {IDM_EDIT_REDO, IDI_REDO_OFF_ICON, IDI_REDO_ON_ICON, IDI_REDO_DISABLE_ICON, -1}, + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_SEARCH_REPLACE, IDI_REPLACE_OFF_ICON, IDI_REPLACE_ON_ICON, IDI_REPLACE_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_VIEW_ZOOMOUT, IDI_ZOOMOUT_OFF_ICON, IDI_ZOOMOUT_ON_ICON, IDI_ZOOMOUT_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_VIEW_SYNSCROLLH, IDI_SYNCH_OFF_ICON, IDI_SYNCH_ON_ICON, IDI_SYNCH_DISABLE_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {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, -1}, + {IDM_VIEW_ALL_CHARACTERS, IDI_VIEW_ALL_CHAR_OFF_ICON, IDI_VIEW_ALL_CHAR_ON_ICON, IDI_VIEW_ALL_CHAR_OFF_ICON, -1}, + {IDM_VIEW_INDENT_GUIDE, IDI_VIEW_INDENT_OFF_ICON, IDI_VIEW_INDENT_ON_ICON, IDI_VIEW_INDENT_OFF_ICON, -1}, + {IDM_VIEW_USER_DLG, IDI_VIEW_UD_DLG_OFF_ICON, IDI_VIEW_UD_DLG_ON_ICON, IDI_VIEW_UD_DLG_OFF_ICON, -1}, + + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + + {IDM_EDIT_STARTRECORDINGMACRO, IDI_STARTRECORD_OFF_ICON, IDI_STARTRECORD_ON_ICON, IDI_STARTRECORD_DISABLE_ICON, -1}, + {IDM_EDIT_STOPRECORDINGMACRO, IDI_STOPRECORD_OFF_ICON, IDI_STOPRECORD_ON_ICON, IDI_STOPRECORD_DISABLE_ICON, -1}, + {IDM_EDIT_PLAYBACKRECORDEDMACRO, IDI_PLAYRECORD_OFF_ICON, IDI_PLAYRECORD_ON_ICON, IDI_PLAYRECORD_DISABLE_ICON, -1}, + {IDM_EDIT_RUNMULTIMACRODLG, IDI_MMPLAY_OFF_ICON, IDI_MMPLAY_ON_ICON, IDI_MMPLAY_DIS_ICON, -1}, + {IDM_EDIT_SAVECURRENTMACRO, IDI_SAVERECORD_OFF_ICON, IDI_SAVERECORD_ON_ICON, IDI_SAVERECORD_DISABLE_ICON, -1}, + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + + //{IDC_BUTTON_PRINT, IDI_PRINT_OFF_ICON, IDI_PRINT_ON_ICON, IDI_PRINT_OFF_ICON, STD_PRINT} + {IDC_BUTTON_PRINT, IDI_PRINT_OFF_ICON, IDI_PRINT_ON_ICON, IDI_PRINT_OFF_ICON, -1} +}; + +int stdIcons[] = {IDR_FILENEW, IDR_FILEOPEN, IDR_FILESAVE, IDR_SAVEALL, IDR_CLOSEFILE, IDR_CLOSEALL, IDR_CUT, IDR_COPY, IDR_PASTE,\ +IDR_UNDO, IDR_REDO, IDR_FIND, IDR_REPLACE, IDR_ZOOMIN, IDR_ZOOMOUT, IDR_SYNCV, IDR_SYNCH,\ +IDR_WRAP, IDR_INVISIBLECHAR, IDR_INDENTGUIDE, IDR_SHOWPANNEL, IDR_STARTRECORD, IDR_STOPRECORD, IDR_PLAYRECORD, IDR_M_PLAYRECORD, IDR_SAVERECORD, IDR_PRINT}; + +void Notepad_plus::getTaskListInfo(TaskListInfo *tli) +{ + int iView = getCurrentView(); + ScintillaEditView & currentView = (iView == MAIN_VIEW)?_mainEditView:_subEditView; + ScintillaEditView & nonCurrentView = (iView == MAIN_VIEW)?_subEditView:_mainEditView; + int nonCurrentiView = (iView == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW; + + size_t currentNbDoc = currentView.getNbDoc(); + size_t nonCurrentNbDoc; + + tli->_currentIndex = 0; + + if (iView == MAIN_VIEW) + { + nonCurrentNbDoc = _subDocTab.isVisible()?_subEditView.getNbDoc():0; + } + else + { + nonCurrentNbDoc = _mainDocTab.isVisible()?_mainEditView.getNbDoc():0; + } + + for (size_t i = 0 ; i < currentNbDoc ; i++) + { + Buffer & b = currentView.getBufferAt(i); + int status = b.isReadOnly()?tb_ro:(b.isDirty()?tb_unsaved:tb_saved); + tli->_tlfsLst.push_back(TaskLstFnStatus(iView,i,b._fullPathName, status)); + } + for (size_t i = 0 ; i < nonCurrentNbDoc ; i++) + { + Buffer & b = nonCurrentView.getBufferAt(i); + int status = b.isReadOnly()?tb_ro:(b.isDirty()?tb_unsaved:tb_saved); + tli->_tlfsLst.push_back(TaskLstFnStatus(nonCurrentiView,i,b._fullPathName, 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: + { + pNppParam->setFontList(hwnd); + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + + OSVERSIONINFO vInfo; + vInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + ::GetVersionEx(&vInfo); + if (vInfo.dwMajorVersion == 4) + nppGUI._doTaskList = false; + else if ((vInfo.dwMajorVersion == 5) && (vInfo.dwMinorVersion == 0)) + nppGUI._doTaskList = false; + + // Menu + string pluginsTrans, windowTrans; + changeMenuLang(pluginsTrans, windowTrans); + + _windowsMenu.init(_hInst, GetMenu(_hSelf), windowTrans.c_str()); + + + vector & shortcuts = pNppParam->getUserShortcuts(); + for (size_t i = 0 ; i < shortcuts.size() ; i++) + { + changeMenuShortcut(shortcuts[i].getID(), shortcuts[i].toString().c_str()); + } + ::DrawMenuBar(_hSelf); + + + //-- Tool Bar Section --// + toolBarStatusType tbStatus = nppGUI._toolBarStatus; + + // TB_LARGE par default + int iconSize = 32; + bool willBeShown = true; + int menuID = IDM_VIEW_TOOLBAR_ENLARGE; + + if (tbStatus == TB_HIDE) + { + willBeShown = false; + menuID = IDM_VIEW_TOOLBAR_HIDE; + } + else if (tbStatus == TB_SMALL) + { + iconSize = 16; + menuID = IDM_VIEW_TOOLBAR_REDUCE; + } + else if (tbStatus == TB_STANDARD) + { + iconSize = 16; + menuID = IDM_VIEW_TOOLBAR_STANDARD; + } + _toolBar.init(_hInst, hwnd, iconSize, toolBarIcons, sizeof(toolBarIcons)/sizeof(ToolBarButtonUnit), (tbStatus == TB_STANDARD), stdIcons, sizeof(stdIcons)/sizeof(int)); + _toolBar.display(willBeShown); + checkToolBarMenu(menuID); + changeToolBarIcons(); + + _pDocTab = &_mainDocTab; + _pEditView = &_mainEditView; + + const ScintillaViewParams & svp1 = pNppParam->getSVP(SCIV_PRIMARY); + const ScintillaViewParams & svp2 = pNppParam->getSVP(SCIV_SECOND); + + _mainEditView.init(_hInst, hwnd); + _subEditView.init(_hInst, hwnd); + _mainEditView.display(); + + _invisibleEditView.init(_hInst, hwnd); + _invisibleEditView.attatchDefaultDoc(0); + + // 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.showIndentGuideLine(svp1._indentGuideLineShow); + _subEditView.showIndentGuideLine(svp2._indentGuideLineShow); + + _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.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); + + checkMenuItem(IDM_SETTING_HISTORY_DONT_CHECK, !nppGUI._checkHistoryFiles); + checkMenuItem(IDM_SETTING_TRAYICON, nppGUI._isMinimizedToTray); + checkMenuItem(IDM_SETTING_REMEMBER_LAST_SESSION, nppGUI._rememberLastSession); + + _mainEditView.performGlobalStyles(); + _subEditView.performGlobalStyles(); + + if (pNppParam->hasCustomContextMenu()) + { + _mainEditView.execute(SCI_USEPOPUP, FALSE); + _subEditView.execute(SCI_USEPOPUP, FALSE); + } + + _zoomOriginalValue = _pEditView->execute(SCI_GETZOOM); + _mainEditView.execute(SCI_SETZOOM, svp1._zoom); + _subEditView.execute(SCI_SETZOOM, svp2._zoom); + + int tabBarStatus = nppGUI._tabStatus; + _toReduceTabBar = ((tabBarStatus & TAB_REDUCE) != 0); + _docTabIconList.create(_toReduceTabBar?13:20, _hInst, docTabIconIDs, sizeof(docTabIconIDs)/sizeof(int)); + + const char * str = _mainDocTab.init(_hInst, hwnd, &_mainEditView, &_docTabIconList); + setTitleWith(str); + _subDocTab.init(_hInst, hwnd, &_subEditView, &_docTabIconList); + 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); + + //--Splitter Section--// + bool isVertical = (nppGUI._splitterPos == POS_VERTICAL); + + _subSplitter.init(_hInst, _hSelf); + _subSplitter.create(&_mainDocTab, &_subDocTab, 8, DYNAMIC, 50, isVertical); + + //--Status Bar Section--// + willBeShown = nppGUI._statusBarShow; + _statusBar.init(_hInst, hwnd, 6); + _statusBar.setPartWidth(STATUSBAR_DOC_SIZE, 100); + _statusBar.setPartWidth(STATUSBAR_CUR_POS, 180); + _statusBar.setPartWidth(STATUSBAR_EOF_FORMAT, 80); + _statusBar.setPartWidth(STATUSBAR_UNICODE_TYPE, 100); + _statusBar.setPartWidth(STATUSBAR_TYPING_MODE, 30); + _statusBar.display(willBeShown); + // + checkMenuItem(IDM_VIEW_STATUSBAR, willBeShown); + + _findReplaceDlg.init(_hInst, hwnd, &_pEditView); + _incrementFindDlg.init(_hInst, hwnd, &_findReplaceDlg); + + + + _aboutDlg.init(_hInst, hwnd); + _runDlg.init(_hInst, hwnd); + _runMacroDlg.init(_hInst, hwnd); + + checkMenuItem(IDM_SETTING_TAB_REPLCESPACE, nppGUI._tabReplacedBySpace); + + _pMainWindow = &_mainDocTab; + + _dockingManager.init(_hInst, hwnd, &_pMainWindow); + + + _goToLineDlg.init(_hInst, hwnd, &_pEditView); + + //--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); + + dynamicCheckMenuAndTB(); + _mainEditView.defineDocType(L_TXT); + HMENU hMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_FILE); + + int nbLRFile = pNppParam->getNbLRFile(); + + int pos = 15; + _lastRecentFileList.initMenu(hMenu, IDM_FILEMENU_LASTONE + 1, pos); + + for (int i = 0 ; i < nbLRFile ; i++) + { + string * stdStr = pNppParam->getLRFile(i); + if (nppGUI._checkHistoryFiles) + { + if (PathFileExists(stdStr->c_str())) + { + _lastRecentFileList.add(stdStr->c_str()); + } + } + else + { + _lastRecentFileList.add(stdStr->c_str()); + } + } + + if (nppGUI._isMinimizedToTray) + _pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)), ""); + + checkSyncState(); + + _rebar.init(_hInst, hwnd, &_toolBar); + _rebar.display(tbStatus != TB_HIDE); + + + //Languages Menu + hMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_LANGUAGE); + if (nppGUI._excludedLangList.size() > 0) + { + for (size_t i = 0 ; i < nppGUI._excludedLangList.size() ; i++) + { + int cmdID = pNppParam->langTypeToCommandID(nppGUI._excludedLangList[i]._langType); + char itemName[256]; + ::GetMenuString(hMenu, cmdID, itemName, sizeof(itemName), MF_BYCOMMAND); + nppGUI._excludedLangList[i]._cmdID = cmdID; + nppGUI._excludedLangList[i]._langName = itemName; + ::DeleteMenu(hMenu, cmdID, MF_BYCOMMAND); + DrawMenuBar(_hSelf); + } + } + + // Add User Define Languages Entry + pos = ::GetMenuItemCount(hMenu) - 1; + + for (int i = 0 ; i < pNppParam->getNbUserLang() ; i++) + { + UserLangContainer & userLangContainer = pNppParam->getULCFromIndex(i); + ::InsertMenu(hMenu, pos + i , MF_BYPOSITION, IDM_LANG_USER + i + 1, userLangContainer.getName()); + } + + // Macro Menu + std::vector & macros = pNppParam->getMacroList(); + HMENU hMacroMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_MACRO); + size_t const posBase = 4; + 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 + 2, MF_BYPOSITION, ID_MACRO + i, macros[i].toMenuItemString().c_str()); + } + // Run Menu + std::vector & userCommands = pNppParam->getUserCommandList(); + HMENU hRunMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_RUN); + int const runPosBase = 1; + 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 + 2, MF_BYPOSITION, ID_USER_CMD + i, userCommands[i].toMenuItemString().c_str()); + } + + _scintillaCtrls4Plugins.init(_hInst, hwnd); + + // Plugin Manager + NppData nppData; + nppData._nppHandle = _hSelf; + nppData._scintillaMainHandle = _mainEditView.getHSelf(); + nppData._scintillaSecondHandle = _subEditView.getHSelf(); + + _pluginsManager.init(nppData); + _pluginsManager.loadPlugins(); + _pluginsManager.setMenu(::GetMenu(_hSelf), pluginsTrans.c_str()); + + // Shortcut Accelerator : should be the last one since it will cacpture all the shortcut + _accelerator.init(::LoadAccelerators(_hInst, MAKEINTRESOURCE(IDR_NPP_ACCELERATORS))); + + if (_accelerator.uptdateShortcuts(hwnd)) + _isCmdScModified = true; + + pNppParam->setAccelerator(&_accelerator); + + //launch the plugin dlg memorized at the last session + _pluginsManager.runPluginCommand("NppInsertPlugin.dll", 9); + + 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: + { + char name[256]; + strcpy(name, (char *)lParam); + _mainEditView.removeUserLang(name); + _subEditView.removeUserLang(name); + return TRUE; + } + + case WM_RENAME_USERLANG: + { + char oldName[256]; + char newName[256]; + strcpy(oldName, (char *)lParam); + strcpy(newName, (char *)wParam); + _mainEditView.renameUserLang(oldName, newName); + _subEditView.renameUserLang(oldName, 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_FINDINFILES : + { + findInFiles(); + return TRUE; + } + + case WM_LAUNCH_FINDINFILESDLG : + { + const int strSize = 64; + char str[strSize]; + + bool isFirstTime = !_findReplaceDlg.isCreated(); + _findReplaceDlg.doDialog(FIND, _isRTL); + if (_pEditView->getSelectedText(str, strSize)) + _findReplaceDlg.setSearchText(str); + if (isFirstTime) + changeDlgLang(_findReplaceDlg.getHSelf(), "Find"); + _findReplaceDlg.launchFindInFilesDlg(); + + const char *dir = (const char *)wParam; + const char *filtre = (const char *)lParam; + _findReplaceDlg.setFindInFilesDirFilter(dir, filtre); + return TRUE; + } + + case WM_DOOPEN: + { + doOpen((const char *)lParam); + } + break; + + case WM_GETMINMAXINFO: + { + MINMAXINFO *pmmi = reinterpret_cast(lParam); + + if (_isfullScreen) + { + pmmi->ptMaxSize.x = ::GetSystemMetrics(SM_CXSCREEN) + 2 * ::GetSystemMetrics(SM_CXSIZEFRAME) + 2; + pmmi->ptMaxSize.y = ::GetSystemMetrics(SM_CYSCREEN) + + ::GetSystemMetrics(SM_CYCAPTION) + + ::GetSystemMetrics(SM_CYMENU) + + 2 * ::GetSystemMetrics(SM_CYSIZEFRAME) + + _toolBar.getHeight() + 2 + + 13; + + pmmi->ptMaxTrackSize.x = pmmi->ptMaxSize.x; + pmmi->ptMaxTrackSize.y = pmmi->ptMaxSize.y; + result = 0; // Je sais, c'est bizarre, mais selons le doc... + } + else + { + result = ::DefWindowProc(_hSelf, Message, wParam, lParam); + } + } + break; + + case WM_SIZE: + { + RECT rc; + getToolBarClientRect(rc); + _toolBar.reSizeTo(rc); + + ::SetWindowPos(_rebar.getHSelf(), NULL, 0, 0, LOWORD(lParam), rc.bottom - rc.top, SWP_NOZORDER); + + getStatusBarClientRect(rc); + _statusBar.reSizeTo(rc); + + getMainClientRect(rc); + //_pMainWindow->reSizeTo(rc); + _dockingManager.reSizeTo(rc); + + mkPosIncFindDlg(); + result = TRUE; + } + break; + + case WM_MOVE: + { + redraw(); + mkPosIncFindDlg(); + result = TRUE; + } + break; + + case WM_MOVING: + { + result = FALSE; + } + break; + + case WM_SIZING: + { + result = FALSE; + } + break; + + case WM_COPYDATA : + { + const DWORD LASTBYTEMASK = 0x000000FF; + COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT *)lParam; + LangType lt = LangType(pCopyData->dwData & LASTBYTEMASK); + int ln = pCopyData->dwData >> 8; + + FileNameStringSplitter fnss((const char *)pCopyData->lpData); + char *pFn = NULL; + for (int i = 0 ; i < fnss.size() ; i++) + { + pFn = (char *)fnss.getFileName(i); + doOpen((const char *)pFn); + if (lt != L_TXT) + _pEditView->setCurrentDocType(lt); + _pEditView->execute(SCI_GOTOLINE, ln-1); + } + setLangStatus(_pEditView->getCurrentDocType()); + return TRUE; + } + + case WM_COMMAND: + if (HIWORD(wParam) == SCEN_SETFOCUS) + { + switchEditViewTo((lParam == (LPARAM)_mainEditView.getHSelf())?MAIN_VIEW:SUB_VIEW); + } + else + { + if ((lParam == 1) || (lParam == 2)) + { + specialCmd(LOWORD(wParam), lParam); + } + else + command(LOWORD(wParam)); + } + return TRUE; + + case WM_GET_FULLCURRENTPATH : + case WM_GET_CURRENTDIRECTORY : + case WM_GET_FILENAME : + case WM_GET_NAMEPART : + case WM_GET_EXTPART : + { + char str[MAX_PATH]; + // par defaut : WM_GET_FULLCURRENTPATH + char *fileStr = strcpy(str, _pEditView->getCurrentTitle()); + + if (Message == WM_GET_CURRENTDIRECTORY) + PathRemoveFileSpec(str); + else if (Message == WM_GET_FILENAME) + fileStr = PathFindFileName(str); + else if (Message == WM_GET_NAMEPART) + { + fileStr = PathFindFileName(str); + PathRemoveExtension(fileStr); + } + else if (Message == WM_GET_EXTPART) + fileStr = PathFindExtension(str); + + strcpy((char *)lParam, fileStr); + return TRUE; + } + + case WM_GET_CURRENTWORD : + { + const int strSize = MAX_PATH; + char str[strSize]; + + CharacterRange range = _pEditView->getSelection(); + if (range.cpMin == range.cpMax) + _pEditView->expandWordSelection(); + + _pEditView->getSelectedText(str, strSize, true); + strcpy((char *)lParam, str); + return TRUE; + } + + case WM_GET_NPPDIRECTORY : + { + const int strSize = MAX_PATH; + char str[strSize]; + + ::GetModuleFileName(NULL, str, strSize); + PathRemoveFileSpec(str); + strcpy((char *)lParam, str); + return TRUE; + } + + case WM_GETCURRENTSCINTILLA : + { + *((int *)lParam) = (_pEditView == &_mainEditView)?0:1; + return TRUE; + } + + case WM_GETCURRENTLANGTYPE : + { + *((LangType *)lParam) = _pEditView->getCurrentDocType(); + return TRUE; + } + + case WM_SETCURRENTLANGTYPE : + { + _pEditView->setCurrentDocType((LangType)lParam); + return TRUE; + } + + case WM_NBOPENFILES : + { + int nbDocPrimary = _mainEditView.getNbDoc(); + int nbDocSecond = _subEditView.getNbDoc(); + if (!lParam) + return nbDocPrimary + nbDocSecond; + else if (lParam == 1) + return nbDocPrimary; + else if (lParam == 2) + return nbDocSecond; + } + + case WM_GETOPENFILENAMES_PRIMARY : + { + if (!wParam) return 0; + + char **fileNames = (char **)wParam; + size_t nbFileNames = lParam; + size_t i = 0; + + for ( ; i < nbFileNames ; i++) + { + strcpy(fileNames[i], _mainEditView.getBufferAt(i).getFileName()); + } + return i; + } + + case WM_GETOPENFILENAMES_SECOND : + { + if (!wParam) return 0; + + char **fileNames = (char **)wParam; + size_t nbFileNames = lParam; + size_t i = 0; + + for ( ; i < nbFileNames ; i++) + { + strcpy(fileNames[i], _subEditView.getBufferAt(i).getFileName()); + } + return i; + } + + case WM_GETOPENFILENAMES : + { + if (!wParam) return 0; + + char **fileNames = (char **)wParam; + int nbFileNames = lParam; + + int j = 0; + for (size_t i = 0 ; i < _mainEditView.getNbDoc() && j < nbFileNames ; i++) + { + strcpy(fileNames[j++], _mainEditView.getBufferAt(i).getFileName()); + } + for (size_t i = 0 ; i < _subEditView.getNbDoc() && j < nbFileNames ; i++) + { + strcpy(fileNames[j++], _subEditView.getBufferAt(i).getFileName()); + } + 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(_mainEditView,_subEditView)); + } + else + { + for(int idx = 0; idx < (int)tli->_tlfsLst.size(); ++idx) + { + if(tli->_tlfsLst[idx]._iView == getCurrentView() && + tli->_tlfsLst[idx]._docIndex == getCurrentEditView()->getCurrentDocIndex()) + { + 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_NBSESSIONFILES : + { + const char *sessionFileName = (const char *)lParam; + if ((!sessionFileName) || (sessionFileName[0] == '\0')) return 0; + Session session2Load; + if (pNppParam->loadSession(session2Load, sessionFileName)) + { + return session2Load._files.size(); + } + return 0; + } + + case WM_GETSESSIONFILES : + { + const char *sessionFileName = (const char *)lParam; + char **sessionFileArray = (char **)wParam; + + if ((!sessionFileName) || (sessionFileName[0] == '\0')) return FALSE; + + Session session2Load; + if (pNppParam->loadSession(session2Load, sessionFileName)) + { + for (size_t i = 0 ; i < session2Load._files.size() ; ) + { + const char *pFn = session2Load._files[i]._fileName.c_str(); + // + // To add : position + // + strcpy(sessionFileArray[i++], pFn); + } + return TRUE; + } + return FALSE; + } + + case WM_DECODE_SCI: + { + /* 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, 0, 0); + pSci->execute(SCI_ADDTEXT, length, (LPARAM)UnicodeConvertor.getNewBuf()); + pSci->execute(SCI_EMPTYUNDOBUFFER, 0, 0); + + pSci->execute(SCI_SETCODEPAGE, 0, 0); + + /* set cursor position */ + pSci->execute(SCI_GOTOPOS, 0, 0); + + /* clean buffer */ + delete [] buffer; + + return unicodeMode; + } + + case WM_ENCODE_SCI: + { + /* 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 = (char*)new char[length]; + pSci->execute(SCI_GETTEXT, length, (LPARAM)buffer); + + length = UnicodeConvertor.convert(buffer, length-1); + + /* set text in target */ + pSci->execute(SCI_CLEARALL, 0, 0); + pSci->execute(SCI_ADDTEXT, length, (LPARAM)UnicodeConvertor.getNewBuf()); + + pSci->execute(SCI_EMPTYUNDOBUFFER, 0, 0); + + /* set cursor position */ + pSci->execute(SCI_GOTOPOS, 0, 0); + + /* clean buffer */ + delete [] buffer; + + /* set new encoding if BOM was changed by other programms */ + UniMode um = UnicodeConvertor.getEncoding(); + (pSci->getCurrentBuffer()).setUnicodeMode(um); + checkUnicodeMenuItems(um); + + // Override the code page if Unicode + if (um != uni8Bit) + _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + + return um; + } + + case WM_ACTIVATE_DOC : + { + int whichView = ((wParam != MAIN_VIEW) && (wParam != SUB_VIEW))?getCurrentView():wParam; + int index = lParam; + + switchEditViewTo(whichView); + activateDoc(index); + + return TRUE; + } + + 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(); + + 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 + { + if ( currLine == _pEditView->getCurrentLineNumber() ) // line no. not changed? + break; // exit + + // save current line + currLine = _pEditView->getCurrentLineNumber(); + + // eof? + if ((currLine >= lastLine) || (currLine <= 0)) + break; + } + } + _pEditView->execute(SCI_ENDUNDOACTION); + } + } + break; + + case WM_CREATESCINTILLAHANDLE : + { + return (LRESULT)_scintillaCtrls4Plugins.createSintilla((lParam == NULL?_hSelf:(HWND)lParam)); + } + + case WM_DESTROYSCINTILLAHANDLE : + { + return _scintillaCtrls4Plugins.destroyScintilla((HWND)lParam); + } + + case WM_GETNBUSERLANG : + { + if (lParam) + *((int *)lParam) = IDM_LANG_USER; + return pNppParam->getNbUserLang(); + } + + case WM_GETCURRENTDOCINDEX : + { + if (lParam == SUB_VIEW) + { + if (!_subDocTab.isVisible()) + return -1; + return _subEditView.getCurrentDocIndex(); + } + else //MAIN_VIEW + { + if (!_mainDocTab.isVisible()) + return -1; + return _mainEditView.getCurrentDocIndex(); + } + } + + case WM_SETSTATUSBAR : + { + char *str2set = (char *)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 WM_GETMENUHANDLE : + { + if (wParam == NPPPLUGINMENU) + return (LRESULT)_pluginsManager.getMenuHandle(); + else + return NULL; + } + + case WM_LOADSESSION : + { + fileLoadSession((const char *)lParam); + } + + case WM_SAVECURRENTSESSION : + { + return (LRESULT)fileSaveSession(0, NULL, (const char *)lParam); + } + + case WM_SAVESESSION : + { + sessionInfo *pSi = (sessionInfo *)lParam; + return (LRESULT)fileSaveSession(pSi->nbFile, pSi->files, pSi->sessionFilePathName); + } + + case WM_CANCEL_SCINTILLAKEY : + { + _mainEditView.execute(SCI_CLEARCMDKEY, wParam); + _subEditView.execute(SCI_CLEARCMDKEY, wParam); + return TRUE; + } + case WM_BIND_SCINTILLAKEY : + { + _mainEditView.execute(SCI_ASSIGNCMDKEY, wParam, lParam); + _subEditView.execute(SCI_ASSIGNCMDKEY, wParam, lParam); + + return TRUE; + } + case WM_CMDLIST_MODIFIED : + { + _isCmdScModified = true; + changeMenuShortcut(lParam, (const char *)wParam); + ::DrawMenuBar(_hSelf); + return TRUE; + } + + case WM_MACROLIST_MODIFIED : + { + _isMacrosScModified = true; + return TRUE; + } + + case WM_USERCMDLIST_MODIFIED : + { + _isUserCmdScModified = true; + return TRUE; + } + + case WM_SCINTILLAKEY_MODIFIED : + { + _isScintillaKeyModified = true; + return TRUE; + } + + // ADD: success->hwnd; failure->NULL + // REMOVE: success->NULL; failure->hwnd + case WM_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())) + { + POINT p; + ::GetCursorPos(&p); + ContextMenu scintillaContextmenu; + vector tmp = pNppParam->getContextMenuItems(); + vector isEnable; + for (size_t i = 0 ; i < tmp.size() ; i++) + { + if (tmp[i]._itemName == "") + getNameStrFromCmd(tmp[i]._cmdID, tmp[i]._itemName); + isEnable.push_back((::GetMenuState(::GetMenu(_hSelf), 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 WM_ACTIVATEAPP : + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + if (LOWORD(wParam) && (nppgui._fileAutoDetection != cdDisabled)) + { + checkModifiedDocument(); + return FALSE; + } + return ::DefWindowProc(hwnd, Message, wParam, lParam); + } + + + case WM_ACTIVATE : + _pEditView->getFocus(); + return TRUE; + + case WM_DROPFILES: + { + dropFiles(reinterpret_cast(wParam)); + return TRUE; + } + + case WM_UPDATESCINTILLAS: + { + _mainEditView.defineDocType(_mainEditView.getCurrentDocType()); + _subEditView.defineDocType(_subEditView.getCurrentDocType()); + _mainEditView.performGlobalStyles(); + _subEditView.performGlobalStyles(); + return TRUE; + } + + case WM_CLOSE: + { + if (_isfullScreen) + fullScreenToggle(); + + const NppGUI & nppgui = pNppParam->getNppGUI(); + + Session currentSession; + if (nppgui._rememberLastSession) + getCurrentOpenedFiles(currentSession); + + if (fileCloseAll()) + { + _lastRecentFileList.saveLRFL(); + + saveScintillaParams(SCIV_PRIMARY); + saveScintillaParams(SCIV_SECOND); + saveGUIParams(); + saveUserDefineLangs(); + saveShortcuts(); + if (nppgui._rememberLastSession) + saveSession(currentSession); + ::DestroyWindow(hwnd); + } + return TRUE; + } + + case WM_DESTROY: + { + killAllChildren(); + ::PostQuitMessage(0); + 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)), ""); + + _pTrayIco->doTrayIcon(ADD); + ::ShowWindow(hwnd, SW_HIDE); + return 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 WM_INITMENU: + _windowsMenu.initMenu((HMENU)wParam, _pEditView); + return TRUE; +*/ + case WM_INITMENUPOPUP: + _windowsMenu.initPopupMenu((HMENU)wParam, _pEditView); + return TRUE; +/* + case WM_UNINITMENUPOPUP: + _windowsMenu.uninitPopupMenu((HMENU)wParam, _pEditView); + return TRUE; +*/ + case WM_DMM_SHOW: + { + _dockingManager.showDockableDlg((HWND)lParam, SW_SHOW); + break; + } + case WM_DMM_HIDE: + { + _dockingManager.showDockableDlg((HWND)lParam, SW_HIDE); + break; + } + case WM_DMM_UPDATEDISPINFO: + { + _dockingManager.updateContainerInfo((HWND)lParam); + break; + } + case WM_REGASDCKDLG: + { + tTbData *pData = (tTbData *)lParam; + + getIntegralDockingData(*pData); + pData->uMask = DWS_DF_CONT_LEFT; + + //printStr(pData->moduleName); + + pData->rcFloat.left = 300; + pData->rcFloat.top = 300; + pData->rcFloat.right = 300; + pData->rcFloat.bottom = 300; + + _dockingManager.createDockableDlg(*pData, -1); + break; + } + + 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: + { + int origPos = _pEditView->getCurrentDocIndex(); + for (int i=0, n=nmdlg->nItems; iItems[i]); + fileSave(); + } + activateDoc(origPos); + nmdlg->processed = TRUE; + } + break; + case WDT_CLOSE: + { + for (int i=0, n=nmdlg->nItems; iItems[i]; + activateDoc(pos); + if (!fileClose()) + break; + for (int j=i+1; jItems[j] > pos) + --nmdlg->Items[j]; + nmdlg->Items[i] = 0xFFFFFFFF; // indicate file was closed + } + nmdlg->processed = TRUE; + } + break; + case WDT_SORT: + _pEditView->arrangeBuffers(nmdlg->nItems, nmdlg->Items); + nmdlg->processed = TRUE; + for (int i = _pEditView->getNbDoc()-1 ; i >= 0 ; --i) + { + Buffer & docBuf = _pEditView->getBufferAt(i); + _pDocTab->updateTabItem(i, PathFindFileName(docBuf.getFileName())); + } + activateDoc(nmdlg->curSel); + 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_GETMINMAXINFO : // It's the 1st? msg (even before WM_NCCREATE) + { + if (isFirstGetMinMaxInfoMsg) + { + isFirstGetMinMaxInfoMsg = false; + return ::DefWindowProc(hwnd, Message, wParam, lParam); + } + else + return ((Notepad_plus *)::GetWindowLong(hwnd, GWL_USERDATA))->runProc(hwnd, Message, wParam, lParam); + } + + 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; + ::SetWindowLong(hwnd, GWL_USERDATA, (LONG)pM30ide); + + return TRUE; + } + + default : + { + return ((Notepad_plus *)::GetWindowLong(hwnd, GWL_USERDATA))->runProc(hwnd, Message, wParam, lParam); + } + } +} + +void Notepad_plus::fullScreenToggle() +{ + HWND wTaskBar = FindWindow("Shell_TrayWnd", ""); + _isfullScreen = !_isfullScreen; + if (_isfullScreen) + { + ::SystemParametersInfo(SPI_GETWORKAREA, 0, &_rcWorkArea, 0); + ::SystemParametersInfo(SPI_SETWORKAREA, 0, 0, SPIF_SENDCHANGE); + ::ShowWindow(wTaskBar, SW_HIDE); + + _winPlace.length = sizeof(_winPlace); + ::GetWindowPlacement(_hSelf, &_winPlace); + + int topStuff = ::GetSystemMetrics(SM_CYMENU) + ::GetSystemMetrics(SM_CYEDGE); + topStuff += ::GetSystemMetrics(SM_CYCAPTION); + topStuff += _toolBar.getHeight() + 2; + + ::SetWindowPos(_hSelf, HWND_TOP, + -::GetSystemMetrics(SM_CXSIZEFRAME) - 1, + -topStuff - 2, + ::GetSystemMetrics(SM_CXSCREEN) + 2 * ::GetSystemMetrics(SM_CXSIZEFRAME) + 2, + ::GetSystemMetrics(SM_CYSCREEN) + topStuff + ::GetSystemMetrics(SM_CYSIZEFRAME) + 3, + 0); + } + else + { + ::ShowWindow(wTaskBar, SW_SHOW); + if (_winPlace.length) + { + ::SystemParametersInfo(SPI_SETWORKAREA, 0, &_rcWorkArea, 0); + if (_winPlace.showCmd == SW_SHOWMAXIMIZED) + { + ::ShowWindow(_hSelf, SW_RESTORE); + ::ShowWindow(_hSelf, SW_SHOWMAXIMIZED); + } + else + { + ::SetWindowPlacement(_hSelf, &_winPlace); + } + } + } + ::SetForegroundWindow(_hSelf); +} + + +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) +{ + DockingManagerData & dockingData = (DockingManagerData &)(NppParameters::getInstance())->getNppGUI()._dockingData; + for (size_t i = 0 ; i < dockingData._pluginDockInfo.size() ; i++) + { + const PluginDockingInfo & pdi = dockingData._pluginDockInfo[i]; + if (!strcmp(pdi._name, dockData.pszName)) + { + for (size_t j = 0 ; j < pdi._pluginDlgDockInfo.size() ; j++) + { + const PlugingDlgDockingInfo & pddi = pdi._pluginDlgDockInfo[j]; + if (pddi._internalID == dockData.dlgID) + { + if (pddi._position < 4) + dockData.uMask = pddi._position; + else + { + RECT *pRc = dockingData.getFloatingRCFrom(pddi._internalID); + if (pRc) + dockData.rcFloat = *pRc; + } + return true; + } + } + } + } + return false; +} + +void Notepad_plus::changeMenuShortcut(unsigned long cmdID, const char *shortcutStr) +{ + char cmdName[64]; + HMENU hMenu = ::GetMenu(_hSelf); + ::GetMenuString(hMenu, cmdID, cmdName, sizeof(cmdName), MF_BYCOMMAND); + + size_t i = 0; + for ( ; i < strlen(cmdName) ; i++) + { + if (cmdName[i] == '\t') + break; + } + cmdName[++i] = '\0'; + string itemStr = cmdName; + itemStr += shortcutStr; + ::ModifyMenu(hMenu, cmdID, MF_BYCOMMAND, cmdID, itemStr.c_str()); +} + +void Notepad_plus::fileLoadSession(const char *fn) +{ + const char *sessionFileName = NULL; + if (fn == NULL) + { + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + fDlg.setExtFilter("Session file", ".session", NULL); + sessionFileName = fDlg.doOpenSingleFileDlg(); + } + else + { + if (PathFileExists(fn)) + sessionFileName = fn; + } + bool shouldBeResaved = false; + if (sessionFileName) + { + bool shouldBeResaved = false; + Session session2Load; + if ((NppParameters::getInstance())->loadSession(session2Load, sessionFileName)) + { + ScintillaEditView *cureentEditView = getCurrentEditView(); + + for (size_t i = 0 ; i < session2Load._files.size() ; ) + { + const char *pFn = session2Load._files[i]._fileName.c_str(); + if (doOpen(pFn)) + { + cureentEditView->getCurrentBuffer().setPosition(session2Load._files[i]); + cureentEditView->restoreCurrentPos(session2Load._files[i]); + + for (size_t j = 0 ; j < session2Load._files[i].marks.size() ; j++) + { + bookmarkAdd(session2Load._files[i].marks[j]); + } + + i++; + } + else + { + vector::iterator posIt = session2Load._files.begin() + i; + session2Load._files.erase(posIt); + shouldBeResaved = true; + } + } + + if (session2Load._actifIndex < session2Load._files.size()) + _pDocTab->activate(session2Load._actifIndex); + } + if (shouldBeResaved) + (NppParameters::getInstance())->writeSession(session2Load, sessionFileName); + } +} + +const char * Notepad_plus::fileSaveSession(size_t nbFile, char ** fileNames, const char *sessionFile2save) +{ + if (sessionFile2save) + { + Session currentSession; + if ((nbFile) && (!fileNames)) + { + for (size_t i = 0 ; i < nbFile ; i++) + { + if (PathFileExists(fileNames[i])) + currentSession._files.push_back(string(fileNames[i])); + } + } + else + getCurrentOpenedFiles(currentSession); + + (NppParameters::getInstance())->writeSession(currentSession, sessionFile2save); + return sessionFile2save; + } + return NULL; +} + +const char * Notepad_plus::fileSaveSession(size_t nbFile, char ** fileNames) +{ + const char *sessionFileName = NULL; + + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter("All types", ".*", NULL); + fDlg.setExtFilter("Session file", ".session", NULL); + sessionFileName = fDlg.doSaveDlg(); + + return fileSaveSession(nbFile, fileNames, sessionFileName); +} + + +bool Notepad_plus::str2Cliboard(const char *str2cpy) +{ + if (!str2cpy) + return false; + + if (!::OpenClipboard(_hSelf)) + return false; + + ::EmptyClipboard(); + + HGLOBAL hglbCopy = ::GlobalAlloc(GMEM_MOVEABLE, strlen(str2cpy) + 1); + + if (hglbCopy == NULL) + { + ::CloseClipboard(); + return false; + } + + // Lock the handle and copy the text to the buffer. + char *pStr = (char *)::GlobalLock(hglbCopy); + strcpy(pStr, str2cpy); + ::GlobalUnlock(hglbCopy); + + // Place the handle on the clipboard. + ::SetClipboardData(CF_TEXT, hglbCopy); + ::CloseClipboard(); + return true; +} diff --git a/PowerEditor/src/Notepad_plus.h b/PowerEditor/src/Notepad_plus.h new file mode 100644 index 00000000..292e989d --- /dev/null +++ b/PowerEditor/src/Notepad_plus.h @@ -0,0 +1,803 @@ +//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 "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" + +#define NOTEPAD_PP_CLASS_NAME "Notepad++" + + + +#define MENU 0x01 +#define TOOLBAR 0x02 + +//#define WM_LOADFILEBYPATH WM_USER + +const bool MODE_TRANSFER = true; +const bool MODE_CLONE = false; + +const unsigned char DOCK_MASK = 1; +const unsigned char TWO_VIEWS_MASK = 2; + +const int blockSize = 128 * 1024 + 4; +struct TaskListInfo; +static TiXmlNode * searchDlgNode(TiXmlNode *node, const char *dlgTagName); +static winVer getWindowsVersion(); +struct iconLocator { + int listIndex; + int iconIndex; + std::string iconLocation; + + iconLocator(int iList, int iIcon, const std::string iconLoc) + : listIndex(iList), iconIndex(iIcon), iconLocation(iconLoc){}; +}; + +class Notepad_plus : public Window { +public: + Notepad_plus(); + + void init(HINSTANCE, HWND, const char *cmdLine); + + // 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! + virtual ~Notepad_plus(){ + (NppParameters::getInstance())->destroyInstance(); + if (_pTrayIco) + delete _pTrayIco; + }; + + void killAllChildren() { + _toolBar.destroy(); + _rebar.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(); + }; + + virtual void destroy() { + ::DestroyWindow(_hSelf); + }; + + static const char * getClassName() { + return _className; + }; + + void setTitleWith(const char *filePath); + + void getTaskListInfo(TaskListInfo *tli); + + // For filtering the modeless Dialog message + bool isDlgsMsg(MSG *msg) const { + for (size_t i = 0; i < _hModelessDlgs.size(); i++) + { + if (::IsDialogMessage(_hModelessDlgs[i], msg)) + return true; + } + + return false; + }; + bool doOpen(const char *fileName, bool isReadOnly = false); + bool doSimpleOpen(const char *fileName); + + bool doReload(const char *fileName, bool alert = true); + + void 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._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(); + (NppParameters::getInstance())->writeScintillaParams(svp, whichOne); + }; + + void saveGUIParams(){ + NppGUI & nppGUI = (NppGUI &)(NppParameters::getInstance())->getNppGUI(); + nppGUI._statusBarShow = _statusBar.isVisible(); + 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); + 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(); + + (NppParameters::getInstance())->writeGUIParams(); + }; + + void 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 + unsigned char 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]); + } + } +//printInt(5); + //delete [] floatContArray; +//printInt(6); + nppGUI._dockingData._pluginDockInfo = vPluginDockInfo; +//printInt(7); + nppGUI._dockingData._flaotingWindowInfo = vFloatingWindowInfo; + }; + + void saveUserDefineLangs() { + if (ScintillaEditView::getUserDefineDlg()->isDirty()) + (NppParameters::getInstance())->writeUserDefinedLang(); + }; + + void saveShortcuts() { + if (_isCmdScModified || _isMacrosScModified || _isUserCmdScModified || _isScintillaKeyModified || _isPluginCmdScModified) + (NppParameters::getInstance())->writeShortcuts(_isCmdScModified, _isMacrosScModified, _isUserCmdScModified, _isScintillaKeyModified, _isPluginCmdScModified); + }; + + void saveSession(const Session & session){ + (NppParameters::getInstance())->writeSession(session); + }; + + void getCurrentOpenedFiles(Session & session); + + void fileLoadSession(const char *fn = NULL); + const char * fileSaveSession(size_t nbFile, char ** fileNames, const char *sessionFile2save); + const char * fileSaveSession(size_t nbFile = 0, char ** fileNames = NULL); + + + bool changeDlgLang(HWND hDlg, const char *dlgTagName, char *title = NULL); + + void changeConfigLang(); + void changeUserDefineLang(); + void changeMenuLang(string & pluginsTrans, string & windowTrans); + void changePrefereceDlgLang(); + + const char * getNativeTip(int btnID); + void changeToolBarIcons(); + + bool doBlockComment(); + bool doStreamComment(); + void 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->execute(SCI_SETTARGETSTART, i + 1); + _pEditView->execute(SCI_SETTARGETEND, lineEnd); + _pEditView->execute(SCI_REPLACETARGET, 0, (LPARAM)""); + } + } + _pEditView->execute(SCI_ENDUNDOACTION); + }; + + HACCEL getAccTable() const { + return _accelerator.getAccTable(); + }; + + bool addCurrentMacro(); + bool switchToFile(const char *fileName); + +private: + static const char _className[32]; + char _nppPath[MAX_PATH]; + Window *_pMainWindow; + DockingManager _dockingManager; + + TiXmlNode *_nativeLang, *_toolIcons; + + unsigned char _mainWindowStatus; + + DocTabView _mainDocTab; + DocTabView _subDocTab; + DocTabView *_pDocTab; + + ScintillaEditView _subEditView; + ScintillaEditView _mainEditView; + + ScintillaEditView _invisibleEditView; + + ScintillaEditView *_pEditView; + + SplitterContainer *_pMainSplitter; + SplitterContainer _subSplitter; + + ContextMenu _tabPopupMenu, _tabPopupDropMenu; + + ToolBar _toolBar; + IconList _docTabIconList; + + StatusBar _statusBar; + bool _toReduceTabBar; + ReBar _rebar; + + // 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; + + // For FullScreen feature + bool _isfullScreen; + RECT _rcWorkArea; + WINDOWPLACEMENT _winPlace; + void fullScreenToggle(); + + // For restore real window size + //RECT _normalWindowRect; + + // Keystroke macro recording and playback + Macro _macro; + bool _recordingMacro; + RunMacroDlg _runMacroDlg; + + // For hotspot + bool _linkTriggered; + bool _isDocModifing; + bool _isHotspotDblClicked; + + //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; + + bool _isCmdScModified; + bool _isMacrosScModified; + bool _isUserCmdScModified; + bool _isScintillaKeyModified; + bool _isPluginCmdScModified; + + PluginsManager _pluginsManager; + + bool _isRTL; + winVer _winVersion; + + class ScintillaCtrls { + public : + //ScintillaCtrls(); + void init(HINSTANCE hInst, HWND hNpp) { + _hInst = hInst; + _hParent = hNpp; + }; + + HWND createSintilla(HWND hParent) { + //if (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++) + { + delete _scintVector[i]; + } + }; + private: + vector _scintVector; + HINSTANCE _hInst; + HWND _hParent; + } _scintillaCtrls4Plugins; + + 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); + + void fileNew(){ + setTitleWith(_pDocTab->newDoc(NULL)); + updateStatusBar(); + dynamicCheckMenuAndTB(); + checkDocState(); + setLangStatus(_pEditView->getCurrentDocType()); + setWorkingDir(NULL); + }; + + void fileOpen(); + bool fileReload() { + const char * fn = _pEditView->getCurrentTitle(); + if (Buffer::isUntitled(fn)) return false; + if (::MessageBox(_hSelf, "Do you want to reload the current file?", "Reload", MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL) == IDYES) + reload(fn); + return true; + }; + bool fileClose(); + bool fileCloseAll(); + bool fileCloseAllButCurrent(); + + void hideCurrentView(); + + int doSaveOrNot(const char *fn) { + char phrase[512] = "Save file \""; + strcat(strcat(phrase, fn), "\" ?"); + return ::MessageBox(_hSelf, phrase, "Save", MB_YESNOCANCEL | MB_ICONQUESTION | MB_APPLMODAL); + }; + + int doReloadOrNot(const char *fn) { + char phrase[512] = "The file \""; + strcat(strcat(phrase, fn), "\" is modified by another program. Reload this file?"); + return ::MessageBox(_hSelf, phrase, "Reload", MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL); + }; + + int doCloseOrNot(const char *fn) { + char phrase[512] = "The file \""; + strcat(strcat(phrase, fn), "\" doesn't exist anymore. Keep this file in editor ?"); + return ::MessageBox(_hSelf, phrase, "Keep non existing file", MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL); + }; + + bool fileSave(); + bool fileSaveAll(); + bool fileSaveAs(); + void filePrint(bool showDialog); + bool doSave(const char *filename, UniMode mode); + void enableMenu(int cmdID, bool doEnable) const { + int flag = doEnable?MF_ENABLED | MF_BYCOMMAND:MF_DISABLED | MF_GRAYED | MF_BYCOMMAND; + ::EnableMenuItem(::GetMenu(_hSelf), 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 reload(const char *fileName); + + void docGotoAnotherEditView(bool mode); + void dockUserDlg(); + void undockUserDlg(); + + void getToolBarClientRect(RECT &rc) const; + void getMainClientRect(RECT & rc) const; + void getStatusBarClientRect(RECT & rc) const; + + int switchEditViewTo(int gid); + + 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; + + int getCurrentView() const { + return (_pEditView == &_mainEditView)?MAIN_VIEW:SUB_VIEW; + }; + + int getNonCurrentView() const { + return (_pEditView == &_mainEditView)?SUB_VIEW:MAIN_VIEW; + }; + + DocTabView * getNonCurrentDocTab() { + return (_pDocTab == &_mainDocTab)?&_subDocTab:&_mainDocTab; + }; + + ScintillaEditView * getCurrentEditView() { + return (_pEditView == &_mainEditView)?&_mainEditView:&_subEditView; + }; + + ScintillaEditView * getNonCurrentEditView() { + return (_pEditView == &_mainEditView)?&_subEditView:&_mainEditView; + }; + + void synchronise(); + + void setLangStatus(LangType langType); + + void setDisplayFormat(formatType f) { + std::string str; + switch (f) + { + case MAC_FORMAT : + str = "MAC"; + break; + case UNIX_FORMAT : + str = "UNIX"; + break; + default : + str = "Dos\\Windows"; + } + _statusBar.setText(str.c_str(), STATUSBAR_EOF_FORMAT); + }; + + void setUniModeText(UniMode um) + { + char *uniModeText; + switch (um) + { + case uniUTF8: + uniModeText = "UTF-8"; break; + case uni16BE: + uniModeText = "UCS-2 Big Endian"; break; + case uni16LE: + uniModeText = "UCS-2 little Endian"; break; + case uniCookie: + uniModeText = "ANSI as UTF-8"; break; + default : + uniModeText = "ANSI"; + } + _statusBar.setText(uniModeText, STATUSBAR_UNICODE_TYPE); + }; + + void checkLangsMenu(int id) const ; + + void setLanguage(int id, LangType langType) { + _pEditView->setCurrentDocType(langType); + setLangStatus(langType); + checkLangsMenu(id); + }; + + int getToolBarState() const { + HMENU hMenu = ::GetMenu(_hSelf); + + if (::GetMenuState(hMenu, IDM_VIEW_TOOLBAR_HIDE, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_TOOLBAR_HIDE; + + if (::GetMenuState(hMenu, IDM_VIEW_TOOLBAR_REDUCE, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_TOOLBAR_REDUCE; + + if (::GetMenuState(hMenu, IDM_VIEW_TOOLBAR_ENLARGE, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_TOOLBAR_ENLARGE; + + if (::GetMenuState(hMenu, IDM_VIEW_TOOLBAR_STANDARD, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_TOOLBAR_STANDARD; + + return -1; + }; + + int getFolderMarginStyle() const { + HMENU hMenu = ::GetMenu(_hSelf); + + if (::GetMenuState(hMenu, IDM_VIEW_FOLDERMAGIN_SIMPLE, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_FOLDERMAGIN_SIMPLE; + + if (::GetMenuState(hMenu, IDM_VIEW_FOLDERMAGIN_ARROW, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_FOLDERMAGIN_ARROW; + + if (::GetMenuState(hMenu, IDM_VIEW_FOLDERMAGIN_CIRCLE, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_FOLDERMAGIN_CIRCLE; + + if (::GetMenuState(hMenu, IDM_VIEW_FOLDERMAGIN_BOX, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_FOLDERMAGIN_BOX; + + return 0; + }; + + void checkToolBarMenu(int id2Check) const { + ::CheckMenuRadioItem(::GetMenu(_hSelf), IDM_VIEW_TOOLBAR_HIDE, IDM_VIEW_TOOLBAR_STANDARD, id2Check, MF_BYCOMMAND); + }; + + void checkFolderMarginStyleMenu(int id2Check) const { + ::CheckMenuRadioItem(::GetMenu(_hSelf), 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(::GetMenu(_hSelf), itemID, MF_BYCOMMAND | (willBeChecked?MF_CHECKED:MF_UNCHECKED)); + }; + void charAdded(char chAdded); + void MaintainIndentation(char ch); + + void addHotSpot(bool docIsModifing = false); + //void styleHotSpotForWholeDoc(); + //void styleHotSpotModifyMode(); + + void bookmarkAdd(int lineno) const { + if (lineno == -1) + lineno = _pEditView->getCurrentLineNumber(); + if (!bookmarkPresent(lineno)) + _pEditView->execute(SCI_MARKERADD, lineno, MARK_SYMBOLE); + }; + void bookmarkDelete(int lineno) const { + if (lineno == -1) + lineno = _pEditView->getCurrentLineNumber(); + if ( bookmarkPresent(lineno)) + _pEditView->execute(SCI_MARKERDELETE, lineno, MARK_SYMBOLE); + }; + bool bookmarkPresent(int lineno) const { + if (lineno == -1) + lineno = _pEditView->getCurrentLineNumber(); + LRESULT state = _pEditView->execute(SCI_MARKERGET, lineno); + return ((state & (1 << MARK_SYMBOLE)) != 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_SYMBOLE); + }; + + void findMatchingBracePos(int & braceAtCaret, int & braceOpposite); + void braceMatch(); + + void activateNextDoc(bool direction); + void activateDoc(int pos); + + void updateStatusBar(); + void showAutoComp(); + void autoCompFromCurrentFile(); + void getApiFileName(LangType langType, std::string &fn); + + void changeStyleCtrlsLang(HWND hDlg, int *idArray, const char **translatedText); + bool replaceAllFiles(); + bool findInOpenedFiles(); + bool findInFiles(bool isRecursive); + + bool matchInList(const char *fileName, const vector & patterns); + void getMatchedFileNames(const char *dir, const vector & patterns, vector & fileNames, bool isRecursive); + + void doSynScorll(HWND hW); + void changeMenuShortcut(unsigned long cmdID, const char *shortcutStr); + void setWorkingDir(char *dir) { + if (NppParameters::getInstance()->getNppGUI()._saveOpenKeepInSameDir) + return; + + if (!dir || !PathIsDirectory(dir)) + { + return; + } + else + ::SetCurrentDirectory(dir); + } + bool str2Cliboard(const char *str2cpy); + void mkPosIncFindDlg() { + if (!_incrementFindDlg.isCreated()) + return; + if (!_incrementFindDlg.isVisible()) + return; + _incrementFindDlg.goToLowerLeft(); + }; + + bool getIntegralDockingData(tTbData & dockData, int & iCont, bool & isVisible); +}; + +#endif //NOTEPAD_PLUS_H diff --git a/PowerEditor/src/Notepad_plus.rc b/PowerEditor/src/Notepad_plus.rc new file mode 100644 index 00000000..acbdec76 --- /dev/null +++ b/PowerEditor/src/Notepad_plus.rc @@ -0,0 +1,619 @@ +/* +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" + +#define NOTEPAD_PLUS_VERSION "Notepad++ v4.2" + +VS_VERSION_INFO VERSIONINFO +FILEVERSION 4, 2, 0, 0 +PRODUCTVERSION 4, 2, 0, 0 +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", "4.1.2\0" + 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", "4.1.2\0" + END + END +END + +// The GCC resouce compiler has different behavior the M$ resource compiler +#ifdef __GNUC__ +#include ".\\ScitillaComponent\\UserDefineDialog.rc" +#include ".\\ScitillaComponent\\FindReplaceDlg.rc" +#include ".\\WinControls\\StaticDialog\\RunDlg\\RunDlg.rc" +#include ".\\WinControls\\ColourPicker\\ColourPopup.rc" +#include ".\\WinControls\\ColourPicker\\WordStyleDlg.rc" +#include ".\\MISC\\RegExt\\regExtDlg.rc" +#include ".\\WinControls\\shortcut\\shortcut.rc" +#include ".\\WinControls\\Grid\\ShortcutMapper.rc" +#include ".\\WinControls\\Preference\\preference.rc" +#include ".\\WinControls\\WindowsDlg\\WindowsDlg.rc" + +#else +1 TEXTINCLUDE DISCARDABLE +BEGIN + "#include "".\\ScitillaComponent\\UserDefineDialog.rc""\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include "".\\ScitillaComponent\\FindReplaceDlg.rc""\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "#include "".\\WinControls\\StaticDialog\\RunDlg\\RunDlg.rc""\0" +END + +4 TEXTINCLUDE DISCARDABLE +BEGIN + "#include "".\\WinControls\\ColourPicker\\ColourPopup.rc""\0" +END + +5 TEXTINCLUDE DISCARDABLE +BEGIN + "#include "".\\WinControls\\ColourPicker\\WordStyleDlg.rc""\0" +END + +6 TEXTINCLUDE DISCARDABLE +BEGIN + "#include "".\\WinControls\\MISC\\RegExt\\regExtDlg.rc""\0" +END + +7 TEXTINCLUDE DISCARDABLE +BEGIN + "#include "".\\WinControls\\shortcut\\shortcut.rc""\0" +END + +8 TEXTINCLUDE DISCARDABLE +BEGIN + "#include "".\\WinControls\\Grid\\ShortcutMapper.rc""\0" +END + +9 TEXTINCLUDE DISCARDABLE +BEGIN + "#include "".\\WinControls\\Preference\\preference.rc""\0" +END + +10 TEXTINCLUDE DISCARDABLE +BEGIN + "#include "".\\WinControls\\WindowsDlg\\WindowsDlg.rc""\0" +END + +#endif //__GNUC__ + + +// 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" + +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\tCtrl+N", IDM_FILE_NEW + MENUITEM "&Open...\tCtrl+O", IDM_FILE_OPEN + MENUITEM "Re&load from disk", IDM_FILE_RELOAD + MENUITEM "&Save\tCtrl+S", IDM_FILE_SAVE + MENUITEM "Save &As...\tCtrl+Alt+S", IDM_FILE_SAVEAS + MENUITEM "Sav&e All\tCtrl+Shift+S", IDM_FILE_SAVEALL + MENUITEM "&Close\tCtrl+W", IDM_FILE_CLOSE + MENUITEM "Cl&ose All", IDM_FILE_CLOSEALL + MENUITEM "Close All but Active Document", IDM_FILE_CLOSEALL_BUT_CURRENT + MENUITEM SEPARATOR + MENUITEM "Load Session...", IDM_FILE_LOADSESSION + MENUITEM "Save Session...", IDM_FILE_SAVESESSION + MENUITEM SEPARATOR + MENUITEM "Print...\tCtrl+P", IDM_FILE_PRINT + MENUITEM "Print Now!", IDC_BUTTON_PRINT + MENUITEM SEPARATOR + MENUITEM "E&xit\tAlt+F4", IDM_FILE_EXIT + END + + POPUP "&Edit" + BEGIN + MENUITEM "&Undo\tCtrl+Z", IDM_EDIT_UNDO + MENUITEM "&Redo\tCtrl+Y", IDM_EDIT_REDO + MENUITEM SEPARATOR + MENUITEM "Cu&t\tCtrl+X", IDM_EDIT_CUT + MENUITEM "&Copy\tCtrl+C", IDM_EDIT_COPY + MENUITEM "&Paste\tCtrl+V", IDM_EDIT_PASTE + MENUITEM "&Delete\tDel", IDM_EDIT_DELETE + MENUITEM "Select A&ll\tCtrl+A", IDM_EDIT_SELECTALL + MENUITEM SEPARATOR + MENUITEM "Copy Current full file path to Clipboard", IDM_EDIT_FULLPATHTOCLIP + MENUITEM "Copy Current file name to Clipboard", IDM_EDIT_FILENAMETOCLIP + MENUITEM "Copy Current dir path to Clipboard", IDM_EDIT_CURRENTDIRTOCLIP + MENUITEM SEPARATOR + MENUITEM "Insert TAB (Indent)\tTAB", IDM_EDIT_INS_TAB + MENUITEM "Remove TAB (Outdent)\tShift+TAB", IDM_EDIT_RMV_TAB + MENUITEM "Duplicate current line\tCtrl+D", IDM_EDIT_DUP_LINE + MENUITEM "Split lines\tCtrl+I", IDM_EDIT_SPLIT_LINES + MENUITEM "Join lines\tCtrl+J", IDM_EDIT_JOIN_LINES + MENUITEM "Move Up current line\tCtrl+Shift+Up", IDM_EDIT_LINE_UP + MENUITEM "Move Down current line\tCtrl+Shift+Down", IDM_EDIT_LINE_DOWN + MENUITEM "Trim Trailing Space", IDM_EDIT_TRIMTRAILING + MENUITEM SEPARATOR + MENUITEM "Column Editor...\tAlt+C", IDM_EDIT_COLUMNMODE + MENUITEM SEPARATOR + MENUITEM "to &Upper case\tCtrl+Shift+U", IDM_EDIT_UPPERCASE + MENUITEM "to &Lower case\tCtrl+U", IDM_EDIT_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Block comment/uncomment\tCtrl+Q", IDM_EDIT_BLOCK_COMMENT + MENUITEM "Stream comment\tCtrl+Shift+Q", IDM_EDIT_STREAM_COMMENT + MENUITEM SEPARATOR + MENUITEM "Function completion\tCtrl+SPACE", IDC_AUTOCOMPLETE + MENUITEM "Word completion\tCtrl+Shift+SPACE", IDC_AUTOCOMPLETE_CURRENTFILE + MENUITEM SEPARATOR + MENUITEM "Set Read Only", IDM_EDIT_SETREADONLY + MENUITEM "Clear Read Only Flag", IDM_EDIT_CLEARREADONLY + MENUITEM SEPARATOR + MENUITEM "Text Direction RTL\tCtrl+Alt+R", IDM_EDIT_RTL + MENUITEM "Text Direction LTR\tCtrl+Alt+L", IDM_EDIT_LTR + END + + POPUP "&Search" + BEGIN + MENUITEM "&Find...\tCtrl+F", IDM_SEARCH_FIND + MENUITEM "Find in files...\tCtrl+Shift+F", IDM_SEARCH_FINDINFILES + MENUITEM "Find &Next\tF3", IDM_SEARCH_FINDNEXT + MENUITEM "Find &Previous\tShift+F3", IDM_SEARCH_FINDPREV + MENUITEM "Find (volatile) Next\tCtrl+F3", IDM_SEARCH_VOLATILE_FINDNEXT + MENUITEM "Find (volatile) Previous\tCtrl+Shift+F3", IDM_SEARCH_VOLATILE_FINDPREV + MENUITEM "Mark all\tCtrl+M", IDM_SEARCH_MARKALL + MENUITEM "Unmark all\tCtrl+Shift+M", IDM_SEARCH_UNMARKALL + MENUITEM "&Replace...\tCtrl+H", IDM_SEARCH_REPLACE + MENUITEM "&Incremental Search...\tCtrl+Alt+I", IDM_SEARCH_FINDINCREMENT + MENUITEM "&Go to line...\tCtrl+G", IDM_SEARCH_GOTOLINE + MENUITEM SEPARATOR + MENUITEM "Go to matching brace\tCtrl+B", IDM_SEARCH_GOTOMATCHINGBRACE + MENUITEM SEPARATOR + MENUITEM "Toggle Bookmark\tCtrl+F2" , IDM_SEARCH_TOGGLE_BOOKMARK + MENUITEM "Next Bookmark\tF2", IDM_SEARCH_NEXT_BOOKMARK + MENUITEM "Previous Bookmark\tShift+F2", IDM_SEARCH_PREV_BOOKMARK + MENUITEM "Clear all Bookmarks", IDM_SEARCH_CLEAR_BOOKMARKS + END + + POPUP "&View" + BEGIN + MENUITEM "Toggle Full Screen Mode\tF11", IDM_VIEW_FULLSCREENTOGGLE + MENUITEM "Always on top", IDM_VIEW_ALWAYSONTOP + + MENUITEM SEPARATOR + 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 "Wrap", IDM_VIEW_WRAP + MENUITEM "Show wrap symbol", IDM_VIEW_WRAP_SYMBOL + MENUITEM "User Define Dialog...", IDM_VIEW_USER_DLG + MENUITEM SEPARATOR + MENUITEM "Zoom &in\tCtrl-Mouse Wheel Up", IDM_VIEW_ZOOMIN + MENUITEM "Zoom &out\tCtrl-Mouse Wheel Down", IDM_VIEW_ZOOMOUT + MENUITEM "Restore default zoom setting\tCtrl-/(Keypad)", IDM_VIEW_ZOOMRESTORE + MENUITEM SEPARATOR + MENUITEM "Fold all\tAlt+0", IDM_VIEW_TOGGLE_FOLDALL + MENUITEM "Collapse the current level\tCtrl+Alt+F", IDM_VIEW_FOLD_CURRENT + MENUITEM "Uncollapse the current level\tCtrl+Alt+Shift+F", IDM_VIEW_UNFOLD_CURRENT + POPUP "Collapse the level" + BEGIN + MENUITEM "1\tAlt+1" , IDM_VIEW_FOLD_1 + MENUITEM "2\tAlt+2", IDM_VIEW_FOLD_2 + MENUITEM "3\tAlt+3", IDM_VIEW_FOLD_3 + MENUITEM "4\tAlt+4", IDM_VIEW_FOLD_4 + MENUITEM "5\tAlt+5" , IDM_VIEW_FOLD_5 + MENUITEM "6\tAlt+6", IDM_VIEW_FOLD_6 + MENUITEM "7\tAlt+7", IDM_VIEW_FOLD_7 + MENUITEM "8\tAlt+8", IDM_VIEW_FOLD_8 + END + POPUP "Uncollapse the level" + BEGIN + MENUITEM "1\tAlt+Shift+1" , IDM_VIEW_UNFOLD_1 + MENUITEM "2\tAlt+Shift+2", IDM_VIEW_UNFOLD_2 + MENUITEM "3\tAlt+Shift+3", IDM_VIEW_UNFOLD_3 + MENUITEM "4\tAlt+Shift+4", IDM_VIEW_UNFOLD_4 + MENUITEM "5\tAlt+Shift+5" , IDM_VIEW_UNFOLD_5 + MENUITEM "6\tAlt+Shift+6", IDM_VIEW_UNFOLD_6 + MENUITEM "7\tAlt+Shift+7", IDM_VIEW_UNFOLD_7 + MENUITEM "8\tAlt+Shift+8", IDM_VIEW_UNFOLD_8 + END + MENUITEM "Unfold all\tAlt+Shift+0", IDM_VIEW_TOGGLE_UNFOLDALL + MENUITEM SEPARATOR + MENUITEM "Go to another view", IDC_DOC_GOTO_ANOTHER_VIEW + MENUITEM "Clone to another view", IDC_DOC_CLONE_TO_ANOTHER_VIEW + MENUITEM "Synchronize Vertical Scrolling", IDM_VIEW_SYNSCROLLV + MENUITEM "Synchronize Horizontal Scrolling", IDM_VIEW_SYNSCROLLH + 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", 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 "UTF-8 without BOM", IDM_FORMAT_AS_UTF_8 + END + + POPUP "&Language" + BEGIN + + MENUITEM "ADA", IDM_LANG_ADA + MENUITEM "ASP", IDM_LANG_ASP + MENUITEM "Assembler", 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 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 Recording\tCtrl+Shift+R", IDM_EDIT_STARTRECORDINGMACRO + MENUITEM "&Stop Recording\tCtrl+Shift+R", IDM_EDIT_STOPRECORDINGMACRO + MENUITEM "&Playback\tCtrl+Shift+P", IDM_EDIT_PLAYBACKRECORDEDMACRO + MENUITEM "&Save current recorded macro", IDM_EDIT_SAVECURRENTMACRO + MENUITEM "&Run a macro multiple times...", IDM_EDIT_RUNMULTIMACRODLG + END + + POPUP "Run" + BEGIN + MENUITEM "&Run...\tF5", IDM_EXECUTE + END + + POPUP "&?" + BEGIN + MENUITEM "Notepad++ Home", IDM_HOMESWEETHOME + MENUITEM "Notepad++ Project Page", IDM_PROJECTPAGE + MENUITEM "Online help", IDM_ONLINEHELP + MENUITEM "Forum", IDM_FORUM + MENUITEM "About Notepad++\tF1", 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, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT NOTEPAD_PLUS_VERSION, IDC_STATIC,50,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 + CONTROL "",IDI_M30ICON,"Static",SS_OWNERDRAW,21,10,20,20 + //LTEXT "Documents",IDC_ONLINEHELP_ADDR,78,67,40,8 + //LTEXT "Forums",IDC_EMAIL_ADDR,120,67,35,8 + //LTEXT "Online Help :",IDC_STATIC,21,67,47,8 +END + +IDD_GOLINE DIALOGEX 26, 41, 223, 67 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE +CAPTION "Go To Line #" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "You are here :", ID_URHERE_STATIC,5,8,95,8,NOT WS_GROUP + LTEXT "0123456789",ID_CURRLINE,100,8,40,8,NOT WS_GROUP + LTEXT "You want to go :", ID_UGO_STATIC,5,21,95,8 + EDITTEXT ID_GOLINE_EDIT,100,20,35,12,ES_NUMBER + LTEXT "You can't go further than :", ID_NOMORETHAN_STATIC,5,49,92,8,NOT WS_GROUP + LTEXT "0123456789",ID_LASTLINE,99,49,40,8,NOT WS_GROUP + DEFPUSHBUTTON "&Go !",IDOK,145,21,70,14,BS_NOTIFY + PUSHBUTTON "I'm going nowhere",IDCANCEL,145,43,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, "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" + +IDR_NPP_ACCELERATORS ACCELERATORS +BEGIN + + "N", IDM_FILE_NEW, VIRTKEY, CONTROL + "O", IDM_FILE_OPEN, VIRTKEY, CONTROL + //VK_F4, IDM_FILE_CLOSE, VIRTKEY, CONTROL + "W", IDM_FILE_CLOSE, VIRTKEY, CONTROL + "S", IDM_FILE_SAVE, VIRTKEY, CONTROL + "S", IDM_FILE_SAVEALL, VIRTKEY, CONTROL, SHIFT + "S", IDM_FILE_SAVEAS, VIRTKEY, CONTROL, ALT + "P", IDM_FILE_PRINT, VIRTKEY, CONTROL + VK_F4, IDM_FILE_EXIT, ALT, VIRTKEY + "F", IDM_SEARCH_FIND, VIRTKEY, CONTROL + "F", IDM_SEARCH_FINDINFILES, VIRTKEY, CONTROL, SHIFT + "I", IDM_SEARCH_FINDINCREMENT, VIRTKEY, CONTROL, ALT + "H", IDM_SEARCH_REPLACE, VIRTKEY, CONTROL + "G", IDM_SEARCH_GOTOLINE, VIRTKEY, CONTROL + "B", IDM_SEARCH_GOTOMATCHINGBRACE, VIRTKEY, CONTROL + //"R", IDM_EXECUTE, VIRTKEY, CONTROL + "I", IDM_EDIT_SPLIT_LINES, VIRTKEY, CONTROL + "J", IDM_EDIT_JOIN_LINES, VIRTKEY, CONTROL + VK_F1, IDM_ABOUT, VIRTKEY + VK_F2, IDM_SEARCH_TOGGLE_BOOKMARK, VIRTKEY, CONTROL + VK_F2, IDM_SEARCH_NEXT_BOOKMARK, VIRTKEY + VK_F2, IDM_SEARCH_PREV_BOOKMARK, VIRTKEY, SHIFT + VK_F3, IDM_SEARCH_FINDNEXT, VIRTKEY + VK_F3, IDM_SEARCH_FINDPREV, VIRTKEY, SHIFT + + VK_F3, IDM_SEARCH_VOLATILE_FINDNEXT, VIRTKEY, CONTROL + VK_F3, IDM_SEARCH_VOLATILE_FINDPREV, VIRTKEY, CONTROL, SHIFT + + "M", IDM_SEARCH_MARKALL, VIRTKEY, CONTROL + "M", IDM_SEARCH_UNMARKALL, VIRTKEY, CONTROL, SHIFT + + //VK_F3, IDC_SEARCH_FINDNEXTSELECTED, VIRTKEY, CONTROL + //VK_F3, IDC_SEARCH_FINDPREVSELECTED, VIRTKEY, CONTROL, SHIFT + VK_F5, IDM_EXECUTE, VIRTKEY + VK_F11, IDM_VIEW_FULLSCREENTOGGLE, VIRTKEY + VK_TAB, IDC_PREV_DOC, VIRTKEY, CONTROL, SHIFT + VK_TAB, IDC_NEXT_DOC, VIRTKEY, CONTROL + + VK_SPACE, IDC_AUTOCOMPLETE, VIRTKEY, CONTROL + VK_SPACE, IDC_AUTOCOMPLETE_CURRENTFILE, VIRTKEY, CONTROL, SHIFT + VK_UP, IDM_EDIT_LINE_UP, VIRTKEY, CONTROL, SHIFT + VK_DOWN, IDM_EDIT_LINE_DOWN, VIRTKEY, CONTROL, SHIFT + "U", IDM_EDIT_UPPERCASE, VIRTKEY, CONTROL, SHIFT + "U", IDM_EDIT_LOWERCASE, VIRTKEY, CONTROL + "R", IDC_EDIT_TOGGLEMACRORECORDING, VIRTKEY, CONTROL, SHIFT + "P", IDM_EDIT_PLAYBACKRECORDEDMACRO, VIRTKEY, CONTROL, SHIFT + "Q", IDM_EDIT_BLOCK_COMMENT, VIRTKEY, CONTROL + "Q", IDM_EDIT_STREAM_COMMENT, VIRTKEY, CONTROL, SHIFT + "V", IDM_EDIT_PASTE, VIRTKEY, CONTROL + + "0", IDM_VIEW_TOGGLE_FOLDALL, ALT, VIRTKEY + "1", IDM_VIEW_FOLD_1, ALT, VIRTKEY + "2", IDM_VIEW_FOLD_2, ALT, VIRTKEY + "3", IDM_VIEW_FOLD_3, ALT, VIRTKEY + "4", IDM_VIEW_FOLD_4, ALT, VIRTKEY + "5", IDM_VIEW_FOLD_5, ALT, VIRTKEY + "6", IDM_VIEW_FOLD_6, ALT, VIRTKEY + "7", IDM_VIEW_FOLD_7, ALT, VIRTKEY + "8", IDM_VIEW_FOLD_8, ALT, VIRTKEY + + "0", IDM_VIEW_TOGGLE_UNFOLDALL, VIRTKEY, ALT, SHIFT + "1", IDM_VIEW_UNFOLD_1, VIRTKEY, ALT, SHIFT + "2", IDM_VIEW_UNFOLD_2, VIRTKEY, ALT, SHIFT + "3", IDM_VIEW_UNFOLD_3, VIRTKEY, ALT, SHIFT + "4", IDM_VIEW_UNFOLD_4, VIRTKEY, ALT, SHIFT + "5", IDM_VIEW_UNFOLD_5, VIRTKEY, ALT, SHIFT + "6", IDM_VIEW_UNFOLD_6, VIRTKEY, ALT, SHIFT + "7", IDM_VIEW_UNFOLD_7, VIRTKEY, ALT, SHIFT + "8", IDM_VIEW_UNFOLD_8, VIRTKEY, ALT, SHIFT + + "F", IDM_VIEW_FOLD_CURRENT, VIRTKEY, CONTROL, ALT + "F", IDM_VIEW_UNFOLD_CURRENT, VIRTKEY, CONTROL, ALT, SHIFT + "L", IDM_EDIT_LTR, VIRTKEY, CONTROL, ALT + "R", IDM_EDIT_RTL, VIRTKEY, CONTROL, ALT + "C", IDM_EDIT_COLUMNMODE, VIRTKEY, ALT + + VK_HOME, IDC_KEY_HOME, VIRTKEY + VK_END, IDC_KEY_END, VIRTKEY + VK_HOME, IDC_KEY_SELECT_2_HOME, VIRTKEY, SHIFT + VK_END, IDC_KEY_SELECT_2_END, VIRTKEY, SHIFT + /* + VK_HOME, IDC_KEY_HOME_WRAP, VIRTKEY, ALT + VK_END, IDC_KEY_END_WRAP, VIRTKEY, ALT + "D", IDC_KEY_LINE_DUP, VIRTKEY, CONTROL + */ +END + diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp new file mode 100644 index 00000000..b2385b96 --- /dev/null +++ b/PowerEditor/src/Parameters.cpp @@ -0,0 +1,3003 @@ +//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 "ScintillaEditView.h" +#include + +//#include + + +NppParameters * NppParameters::_pSelf = new NppParameters; + +NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserStylerDoc(NULL),\ + _pXmlUserLangDoc(NULL), _pXmlNativeLangDoc(NULL),\ + _nbLang(0), _nbFile(0), _nbMaxFile(10), _pXmlToolIconsDoc(NULL),\ + _pXmlShortcutDoc(NULL), _pXmlContextMenuDoc(NULL), _pXmlSessionDoc(NULL),\ + _nbUserLang(0), _hUser32(NULL), _hUXTheme(NULL),\ + _transparentFuncAddr(NULL), _enableThemeDialogTextureFuncAddr(NULL),\ + _isTaskListRBUTTONUP_Active(false) +{ + _appdataNppDir[0] = '\0'; +} + +void cutString(const char *str2cut, vector & patternVect) +{ + char str2scan[MAX_PATH]; + strcpy(str2scan, str2cut); + size_t len = strlen(str2scan); + bool isProcessing = false; + char *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::load(/*bool noUserPath*/) +{ + bool isAllLaoded = true; + for (int i = 0 ; i < NB_LANG ; _langList[i] = NULL, i++); + char nppPath[MAX_PATH]; + char userPath[MAX_PATH]; + + // Prepare for default path + ::GetModuleFileName(NULL, nppPath, sizeof(nppPath)); + + PathRemoveFileSpec(nppPath); + strcpy(_nppPath, nppPath); + + // Make localConf.xml path + char localConfPath[MAX_PATH]; + strcpy(localConfPath, _nppPath); + PathAppend(localConfPath, localConfFile); + + // Test if localConf.xml exist + bool isLocal = (PathFileExists(localConfPath) == TRUE); + + if (isLocal) + { + strcpy(userPath, _nppPath); + } + else + { + ITEMIDLIST *pidl; + SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); + SHGetPathFromIDList(pidl, userPath); + + PathAppend(userPath, "Notepad++"); + + strcpy(_appdataNppDir, userPath); + + if (!PathFileExists(userPath)) + { + ::CreateDirectory(userPath, NULL); + } + } + + //-------------------------------------// + // Transparent function for w2k and xp // + //-------------------------------------// + _hUser32 = ::GetModuleHandle("User32"); + if (_hUser32) + _transparentFuncAddr = (WNDPROC)::GetProcAddress(_hUser32, "SetLayeredWindowAttributes"); + + //---------------------------------------------// + // Dlg theme texture function for xp and vista // + //---------------------------------------------// + _hUXTheme = ::LoadLibrary("uxtheme.dll"); + if (_hUXTheme) + _enableThemeDialogTextureFuncAddr = (WNDPROC)::GetProcAddress(_hUXTheme, "EnableThemeDialogTexture"); + + //---------------------------------------// + // langs.xml : for every user statically // + //---------------------------------------// + char langs_xml_path[MAX_PATH]; + strcpy(langs_xml_path, nppPath); + + PathAppend(langs_xml_path, "langs.xml"); + + _pXmlDoc = new TiXmlDocument(langs_xml_path); + bool loadOkay = _pXmlDoc->LoadFile(); + if (!loadOkay) + { + ::MessageBox(NULL, "Load langs.xml failed!", "Configurator",MB_OK); + delete _pXmlDoc; + _pXmlDoc = NULL; + isAllLaoded = false; + } + else + getLangKeywordsFromXmlTree(); + + //---------------------------// + // config.xml : for per user // + //---------------------------// + char configPath[MAX_PATH]; + strcpy(configPath, userPath); + PathAppend(configPath, "config.xml"); + + if (!PathFileExists(configPath)) + { + char srcConfigPath[MAX_PATH]; + strcpy(srcConfigPath, nppPath); + PathAppend(srcConfigPath, "config.xml"); + + ::CopyFile(srcConfigPath, configPath, TRUE); + } + + _pXmlUserDoc = new TiXmlDocument(configPath); + loadOkay = _pXmlUserDoc->LoadFile(); + if (!loadOkay) + { + ::MessageBox(NULL, "Load config.xml failed!", "Configurator",MB_OK); + delete _pXmlUserDoc; + _pXmlUserDoc = NULL; + isAllLaoded = false; + } + else + getUserParametersFromXmlTree(); + + //----------------------------// + // stylers.xml : for per user // + //----------------------------// + char stylerPath[MAX_PATH]; + strcpy(stylerPath, userPath); + PathAppend(stylerPath, "stylers.xml"); + + if (!PathFileExists(stylerPath)) + { + char srcStylersPath[MAX_PATH]; + strcpy(srcStylersPath, nppPath); + PathAppend(srcStylersPath, "stylers.xml"); + + ::CopyFile(srcStylersPath, stylerPath, TRUE); + } + + _pXmlUserStylerDoc = new TiXmlDocument(stylerPath); + loadOkay = _pXmlUserStylerDoc->LoadFile(); + if (!loadOkay) + { + ::MessageBox(NULL, "Load stylers.xml failed!", "Configurator",MB_OK); + delete _pXmlUserStylerDoc; + _pXmlUserStylerDoc = NULL; + isAllLaoded = false; + } + else + getUserStylersFromXmlTree(); + + //-----------------------------------// + // userDefineLang.xml : for per user // + //-----------------------------------// + strcpy(_userDefineLangPath, userPath); + PathAppend(_userDefineLangPath, "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. // + //----------------------------------------------// + char nativeLangPath[MAX_PATH]; + strcpy(nativeLangPath, userPath); + PathAppend(nativeLangPath, "nativeLang.xml"); + + if (!PathFileExists(nativeLangPath)) + { + strcpy(nativeLangPath, nppPath); + PathAppend(nativeLangPath, "nativeLang.xml"); + } + + _pXmlNativeLangDoc = new TiXmlDocument(nativeLangPath); + loadOkay = _pXmlNativeLangDoc->LoadFile(); + if (!loadOkay) + { + delete _pXmlNativeLangDoc; + _pXmlNativeLangDoc = NULL; + isAllLaoded = false; + } + + //---------------------------------// + // toolbarIcons.xml : for per user // + //---------------------------------// + char toolbarIconsPath[MAX_PATH]; + strcpy(toolbarIconsPath, userPath); + PathAppend(toolbarIconsPath, "toolbarIcons.xml"); + + _pXmlToolIconsDoc = new TiXmlDocument(toolbarIconsPath); + loadOkay = _pXmlToolIconsDoc->LoadFile(); + if (!loadOkay) + { + delete _pXmlToolIconsDoc; + _pXmlToolIconsDoc = NULL; + isAllLaoded = false; + } + + //------------------------------// + // shortcuts.xml : for per user // + //------------------------------// + strcpy(_shortcutsPath, userPath); + PathAppend(_shortcutsPath, "shortcuts.xml"); + + if (!PathFileExists(_shortcutsPath)) + { + char srcShortcutsPath[MAX_PATH]; + strcpy(srcShortcutsPath, nppPath); + PathAppend(srcShortcutsPath, "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(); + getPluginCmdsFromXmlTree(); + + // fill out _scintillaModifiedKeys : + // those user defined Scintilla key will be used remap Scintilla Key Array + getScintKeysFromXmlTree(); + + // initialize entire Scintilla Key Array + initScintillaKeys(); + } + + //---------------------------------// + // contextMenu.xml : for per user // + //---------------------------------// + strcpy(_contextMenuPath, userPath); + PathAppend(_contextMenuPath, "contextMenu.xml"); + + if (!PathFileExists(_contextMenuPath)) + { + char srcContextMenuPath[MAX_PATH]; + strcpy(srcContextMenuPath, nppPath); + PathAppend(srcContextMenuPath, "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 // + //----------------------------// + strcpy(_sessionPath, userPath); + PathAppend(_sessionPath, "session.xml"); + + _pXmlSessionDoc = new TiXmlDocument(_sessionPath); + loadOkay = _pXmlSessionDoc->LoadFile(); + if (!loadOkay) + isAllLaoded = false; + else + getSessionFromXmlTree(); + + delete _pXmlSessionDoc; + _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 (_pXmlNativeLangDoc) + delete _pXmlNativeLangDoc; + + if (_pXmlToolIconsDoc) + delete _pXmlToolIconsDoc; + + if (_pXmlShortcutDoc) + delete _pXmlShortcutDoc; + + if (_pXmlContextMenuDoc) + delete _pXmlContextMenuDoc; + + if (_pXmlSessionDoc) + delete _pXmlSessionDoc; + + delete _pSelf; +} + +void NppParameters::setFontList(HWND hWnd) +{ + ::AddFontResource(LINEDRAW_FONT); + + //---------------// + // Sys font list // + //---------------// + + LOGFONT lf; + _fontlist.push_back(""); + + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfFaceName[0]='\0'; + HDC hDC = ::GetDC(hWnd); + ::EnumFontFamiliesEx(hDC, + &lf, + (FONTENUMPROC) EnumFontFamExProc, + (LPARAM) &_fontlist, 0); +} + +void NppParameters::getLangKeywordsFromXmlTree() +{ + TiXmlNode *root = _pXmlDoc->FirstChild("NotepadPlus"); + if (!root) return; + feedKeyWordsParameters(root); +} + +bool NppParameters::getUserStylersFromXmlTree() +{ + TiXmlNode *root = _pXmlUserStylerDoc->FirstChild("NotepadPlus"); + if (!root) return false; + return feedStylerArray(root); +} + +bool NppParameters::getUserParametersFromXmlTree() +{ + if (!_pXmlUserDoc) + return false; + + TiXmlNode *root = _pXmlUserDoc->FirstChild("NotepadPlus"); + if (!root) return false; + + // GUI + feedGUIParameters(root); + + //History + feedFileListParameters(root); + + // Raser tout + TiXmlNode *node = root->FirstChildElement("History"); + root->RemoveChild(node); + + // Repartir de zero + TiXmlElement HistoryNode("History"); + + root->InsertEndChild(HistoryNode); + return true; +} + +bool NppParameters::getUserDefineLangsFromXmlTree() +{ + if (!_pXmlUserLangDoc) + return false; + + TiXmlNode *root = _pXmlUserLangDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedUserLang(root); + return true; +} + +bool NppParameters::getShortcutsFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedShortcut(root); + return true; +} + +bool NppParameters::getMacrosFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedMacros(root); + return true; +} + +bool NppParameters::getUserCmdsFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedUserCmds(root); + return true; +} + + +bool NppParameters::getPluginCmdsFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedPluginCustomizedCmds(root); + return true; +} + + +bool NppParameters::getScintKeysFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedScintKeys(root); + return true; +} + +void NppParameters::initScintillaKeys() +{ + // Cut/Copy/Paste + _scintillaKeyCommands.push_back(ScintillaKeyMap("CUT", IDSCINTILLA_KEY_CUT, SCI_CUT, true, false, false, 0x58/*VK_X*/, IDM_EDIT_CUT)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("COPY", IDSCINTILLA_KEY_COPY, SCI_COPY, true, false, false, 0x43/*VK_C*/, IDM_EDIT_COPY)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("PASTE", IDSCINTILLA_KEY_PASTE, SCI_PASTE, true, false, false, 0x56/*VK_V*/, IDM_EDIT_PASTE)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("DEL", IDSCINTILLA_KEY_DEL, SCI_CLEAR, false, false, false, VK_DELETE, IDM_EDIT_DELETE)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("SELECT ALL", IDSCINTILLA_KEY_SELECTALL, SCI_SELECTALL, true, false, false, 0x41/*VK_A*/, IDM_EDIT_SELECTALL)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("OUTDENT", IDSCINTILLA_KEY_OUTDENT, SCI_BACKTAB, false, false, true, VK_TAB, IDM_EDIT_RMV_TAB)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("UNDO", IDSCINTILLA_KEY_UNDO, SCI_UNDO, true, false, false, 0x5A/*VK_Z*/, IDM_EDIT_UNDO)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("REDO", IDSCINTILLA_KEY_REDO, SCI_REDO, true, false, false, 0x59/*VK_Y*/, IDM_EDIT_REDO)); + + // Line operation + _scintillaKeyCommands.push_back(ScintillaKeyMap("DUPLICATE LINE", IDSCINTILLA_KEY_LINE_DUP, SCI_LINEDUPLICATE, true, false, false, 0x44/*VK_D*/, IDM_EDIT_DUP_LINE)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("CUT LINE", IDSCINTILLA_KEY_LINE_CUT, SCI_LINECUT, true, false, false, 0x4C/*VK_L*/)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("DELETE LINE", IDSCINTILLA_KEY_LINE_DEL, SCI_LINEDELETE, true, false, true, 0x4C/*VK_L*/)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("TRANSPOSE LINE", IDSCINTILLA_KEY_LINE_TRANS, SCI_LINETRANSPOSE, true, false, false, 0x54/*VK_T*/)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("COPY LINE", IDSCINTILLA_KEY_LINE_COPY, SCI_LINECOPY, true, false, true, 0x54/*VK_T*/)); + //SCI_DELETEBACK + //SCI_DELETEBACKNOTLINE + + //SCI_DELWORDLEFT + //SCI_DELWORDRIGHT + //SCI_DELLINELEFT + //SCI_DELLINERIGHT +} + +bool NppParameters::getContextMenuFromXmlTree() +{ + if (!_pXmlContextMenuDoc) + return false; + + TiXmlNode *root = _pXmlContextMenuDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + TiXmlNode *contextMenuRoot = root->FirstChildElement("ScintillaContextMenu"); + if (contextMenuRoot) + { + for (TiXmlNode *childNode = contextMenuRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + int id; + const char *idStr = (childNode->ToElement())->Attribute("id", &id); + if (idStr) + { + _contextMenuItems.push_back(MenuItemUnit(id, "")); + } + } + } + + return true; +} + +bool NppParameters::loadSession(Session & session, const char *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("NotepadPlus"); + if (!root) + return false; + + TiXmlNode *sessionRoot = root->FirstChildElement("Session"); + if (!sessionRoot) + return false; + + + TiXmlElement *actIndex = sessionRoot->ToElement(); + size_t index; + const char *str = actIndex->Attribute("actifIndex", (int *)&index); + if (str) + { + (*ptrSession)._actifIndex = index; + } + for (TiXmlNode *childNode = sessionRoot->FirstChildElement("File"); + childNode ; + childNode = childNode->NextSibling("File") ) + { + TiXmlNode *fnNode = childNode->FirstChild(); + const char *fileName = fnNode->Value(); + Position position; + (childNode->ToElement())->Attribute("firstVisibleLine", &position._firstVisibleLine); + (childNode->ToElement())->Attribute("xOffset", &position._xOffset); + (childNode->ToElement())->Attribute("startPos", &position._startPos); + (childNode->ToElement())->Attribute("endPos", &position._endPos); + + sessionFileInfo sfi(fileName, position); + + for (TiXmlNode *markNode = fnNode->NextSibling("Mark"); + markNode ; + markNode = markNode->NextSibling("Mark") ) + { + int lineNumber; + const char *lineNumberStr = (markNode->ToElement())->Attribute("line", &lineNumber); + if (lineNumberStr) + { + sfi.marks.push_back(lineNumber); + //::MessageBox(NULL, "coucou", "", MB_OK); + } + } + + if (fileName) + (*ptrSession)._files.push_back(sfi); + } + + return true; +} +void NppParameters::feedFileListParameters(TiXmlNode *node) +{ + _nbMaxFile = 10; + + TiXmlNode *historyRoot = node->FirstChildElement("History"); + if (!historyRoot) return; + + (historyRoot->ToElement())->Attribute("nbMaxFile", &_nbMaxFile); + if ((_nbMaxFile < 0) || (_nbMaxFile > 30)) + return; + + for (TiXmlNode *childNode = historyRoot->FirstChildElement("File"); + childNode && (_nbFile < NB_MAX_LRF_FILE); + childNode = childNode->NextSibling("File") ) + { + _LRFileList[_nbFile] = new string((childNode->FirstChild())->Value()); + _nbFile++; + } +} + +void NppParameters::feedShortcut(TiXmlNode *node) +{ + TiXmlNode *shortcutsRoot = node->FirstChildElement("InternalCommands"); + if (!shortcutsRoot) return; + + for (TiXmlNode *childNode = shortcutsRoot->FirstChildElement("Shortcut"); + childNode ; + childNode = childNode->NextSibling("Shortcut") ) + { + int id; + const char *idStr = (childNode->ToElement())->Attribute("id", &id); + if (idStr) + { + Shortcut sc; + if (getShortcuts(childNode, sc) && sc.isValid()) + { + _shortcuts.push_back(CommandShortcut(id, sc)); + } + } + } +} + +void NppParameters::feedMacros(TiXmlNode *node) +{ + TiXmlNode *macrosRoot = node->FirstChildElement("Macros"); + if (!macrosRoot) return; + + for (TiXmlNode *childNode = macrosRoot->FirstChildElement("Macro"); + childNode ; + childNode = childNode->NextSibling("Macro") ) + { + Shortcut sc; + if (getShortcuts(childNode, sc) && sc.isValid()) + { + MacroShortcut ms(sc); + getActions(childNode, ms); + if (ms.isValid()) + _macros.push_back(ms); + } + } +} + + +void NppParameters::getActions(TiXmlNode *node, MacroShortcut & macroShortcut) +{ + for (TiXmlNode *childNode = node->FirstChildElement("Action"); + childNode ; + childNode = childNode->NextSibling("Action") ) + { + int type; + const char *typeStr = (childNode->ToElement())->Attribute("type", &type); + if ((!typeStr) || (type > 2)) + continue; + + int msg = 0; + const char *msgStr = (childNode->ToElement())->Attribute("message", &msg); + + int wParam = 0; + const char *wParamStr = (childNode->ToElement())->Attribute("wParam", &wParam); + + int lParam = 0; + const char *lParamStr = (childNode->ToElement())->Attribute("lParam", &lParam); + + const char *sParam = (childNode->ToElement())->Attribute("sParam"); + if (!sParam) + sParam = ""; + recordedMacroStep step(type, msg, wParam, lParam, sParam); + if (step.isValid()) + (macroShortcut.getMacro()).push_back(step); + + } +} + +void NppParameters::feedUserCmds(TiXmlNode *node) +{ + TiXmlNode *userCmdsRoot = node->FirstChildElement("UserDefinedCommands"); + if (!userCmdsRoot) return; + + for (TiXmlNode *childNode = userCmdsRoot->FirstChildElement("Command"); + childNode ; + childNode = childNode->NextSibling("Command") ) + { + Shortcut sc; + if (getShortcuts(childNode, sc) && sc.isValid()) + { + UserCommand uc(sc); + uc._cmd = (childNode->FirstChild())->Value(); + if (uc.isValid()) + _userCommands.push_back(uc); + } + } +} + +void NppParameters::feedPluginCustomizedCmds(TiXmlNode *node) +{ + TiXmlNode *pluginCustomizedCmdsRoot = node->FirstChildElement("PluginCommands"); + if (!pluginCustomizedCmdsRoot) return; + + for (TiXmlNode *childNode = pluginCustomizedCmdsRoot->FirstChildElement("PluginCommand"); + childNode ; + childNode = childNode->NextSibling("PluginCommand") ) + { + Shortcut sc; + if (getShortcuts(childNode, sc) && sc.isValid()) + { + const char *moduleName = (childNode->ToElement())->Attribute("moduleName"); + if (!moduleName) + moduleName = ""; + + int internalID = -1; + const char *internalIDStr = (childNode->ToElement())->Attribute("internalID", &internalID); + + PluginCmdShortcut pcs(sc, -1, moduleName, internalID); + if (pcs.isValid()) + _pluginCustomizedCmds.push_back(pcs); + } + } +} + +void NppParameters::feedScintKeys(TiXmlNode *node) +{ + TiXmlNode *scintKeysRoot = node->FirstChildElement("ScintillaKeys"); + if (!scintKeysRoot) return; + + for (TiXmlNode *childNode = scintKeysRoot->FirstChildElement("ScintKey"); + childNode ; + childNode = childNode->NextSibling("ScintKey") ) + { + int id; + const char *idStr = (childNode->ToElement())->Attribute("id", &id); + if (idStr) + { + ScintillaKeyMap skmm(id); + if (getScintKey(childNode, skmm) && skmm.isValid()) + { + _scintillaModifiedKeys.push_back(skmm); + } + } + } +} + +bool NppParameters::getShortcuts(TiXmlNode *node, Shortcut & sc) +{ + if (!node) return false; + + const char *name = (node->ToElement())->Attribute("name"); + if (!name) + name = ""; + + bool isCtrl = false; + const char *isCtrlStr = (node->ToElement())->Attribute("Ctrl"); + if (isCtrlStr) + isCtrl = !strcmp("yes", isCtrlStr); + + bool isAlt = false; + const char *isAltStr = (node->ToElement())->Attribute("Alt"); + if (isAltStr) + isAlt = !strcmp("yes", isAltStr); + + bool isShift = false; + const char *isShiftStr = (node->ToElement())->Attribute("Shift"); + if (isShiftStr) + isShift = !strcmp("yes", isShiftStr); + + int key; + const char *keyStr = (node->ToElement())->Attribute("Key", &key); + if (!keyStr) + return false; + + strcpy(sc._name, name); + sc._isCtrl = isCtrl; + sc._isAlt = isAlt; + sc._isShift = isShift; + sc._key = (unsigned char)key; + return true; +} + +bool NppParameters::getScintKey(TiXmlNode *node, ScintillaKeyMap & skm) +{ + if (getShortcuts(node, skm)) + { + int scintKey; + const char *keyStr = (node->ToElement())->Attribute("ScintID", &scintKey); + if (!keyStr) + return false; + + int menuID; + keyStr = (node->ToElement())->Attribute("menuCmdID", &menuID); + if (!keyStr) + return false; + skm.setScintKey(scintKey); + skm.setMenuID(menuID); + return true; + } + return false; +} + +const int loadFailed = 100; +const int missingName = 101; +void NppParameters::feedUserLang(TiXmlNode *node) +{ + for (TiXmlNode *childNode = node->FirstChildElement("UserLang"); + childNode && (_nbUserLang < NB_MAX_USER_LANG); + childNode = childNode->NextSibling("UserLang") ) + { + const char *name = (childNode->ToElement())->Attribute("name"); + const char *ext = (childNode->ToElement())->Attribute("ext"); + try { + if (!name || !name[0] || !ext) throw int(missingName); + + _userLangArray[_nbUserLang] = new UserLangContainer(name, ext); + _nbUserLang++; + + TiXmlNode *settingsRoot = childNode->FirstChildElement("Settings"); + if (!settingsRoot) throw int(loadFailed); + feedUserSettings(settingsRoot); + + TiXmlNode *keywordListsRoot = childNode->FirstChildElement("KeywordLists"); + if (!keywordListsRoot) throw int(loadFailed); + feedUserKeywordList(keywordListsRoot); + + TiXmlNode *stylesRoot = childNode->FirstChildElement("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 char * which will be destroyed + stylerStrOp(DUP); + + TiXmlNode *root = _pXmlUserLangDoc->FirstChild("NotepadPlus"); + if (root) + { + _pXmlUserLangDoc->RemoveChild(root); + } + + _pXmlUserLangDoc->InsertEndChild(TiXmlElement("NotepadPlus")); + + root = _pXmlUserLangDoc->FirstChild("NotepadPlus"); + + for (int i = 0 ; i < _nbUserLang ; i++) + { + insertUserLang2Tree(root, _userLangArray[i]); + } + _pXmlUserLangDoc->SaveFile(); + stylerStrOp(FREE); +} + +void NppParameters::insertCmd(TiXmlNode *shortcutsRoot, const CommandShortcut & cmd) +{ + TiXmlNode *sc = shortcutsRoot->InsertEndChild(TiXmlElement("Shortcut")); + sc->ToElement()->SetAttribute("name", cmd._name); + sc->ToElement()->SetAttribute("id", cmd.getID()); + sc->ToElement()->SetAttribute("Ctrl", cmd._isCtrl?"yes":"no"); + sc->ToElement()->SetAttribute("Alt", cmd._isAlt?"yes":"no"); + sc->ToElement()->SetAttribute("Shift", cmd._isShift?"yes":"no"); + sc->ToElement()->SetAttribute("Key", cmd._key); +} + +void NppParameters::insertMacro(TiXmlNode *macrosRoot, const MacroShortcut & macro) +{ + TiXmlNode *macroRoot = macrosRoot->InsertEndChild(TiXmlElement("Macro")); + + macroRoot->ToElement()->SetAttribute("name", macro._name); + macroRoot->ToElement()->SetAttribute("Ctrl", macro._isCtrl?"yes":"no"); + macroRoot->ToElement()->SetAttribute("Alt", macro._isAlt?"yes":"no"); + macroRoot->ToElement()->SetAttribute("Shift", macro._isShift?"yes":"no"); + macroRoot->ToElement()->SetAttribute("Key", macro._key); + for (size_t i = 0 ; i < macro._macro.size() ; i++) + { + TiXmlNode *actionNode = macroRoot->InsertEndChild(TiXmlElement("Action")); + const recordedMacroStep & action = macro._macro[i]; + actionNode->ToElement()->SetAttribute("type", action.MacroType); + actionNode->ToElement()->SetAttribute("message", action.message); + actionNode->ToElement()->SetAttribute("wParam", action.wParameter); + actionNode->ToElement()->SetAttribute("lParam", action.lParameter); + actionNode->ToElement()->SetAttribute("sParam", action.sParameter.c_str()); + } +} + +void NppParameters::insertUserCmd(TiXmlNode *userCmdRoot, const UserCommand & userCmd) +{ + TiXmlNode *cmdRoot = userCmdRoot->InsertEndChild(TiXmlElement("Command")); + cmdRoot->ToElement()->SetAttribute("name", userCmd._name); + cmdRoot->ToElement()->SetAttribute("Ctrl", userCmd._isCtrl?"yes":"no"); + cmdRoot->ToElement()->SetAttribute("Alt", userCmd._isAlt?"yes":"no"); + cmdRoot->ToElement()->SetAttribute("Shift", userCmd._isShift?"yes":"no"); + cmdRoot->ToElement()->SetAttribute("Key", userCmd._key); + cmdRoot->InsertEndChild(TiXmlText(userCmd._cmd.c_str())); +} + +void NppParameters::insertPluginCmd(TiXmlNode *pluginCmdRoot, const PluginCmdShortcut & pluginCmd) +{ + TiXmlNode *pluginCmdNode = pluginCmdRoot->InsertEndChild(TiXmlElement("PluginCommand")); + pluginCmdNode->ToElement()->SetAttribute("moduleName", pluginCmd._moduleName); + pluginCmdNode->ToElement()->SetAttribute("internalID", pluginCmd._internalID); + pluginCmdNode->ToElement()->SetAttribute("Ctrl", pluginCmd._isCtrl?"yes":"no"); + pluginCmdNode->ToElement()->SetAttribute("Alt", pluginCmd._isAlt?"yes":"no"); + pluginCmdNode->ToElement()->SetAttribute("Shift", pluginCmd._isShift?"yes":"no"); + pluginCmdNode->ToElement()->SetAttribute("Key", pluginCmd._key); +} + +void NppParameters::insertScintKey(TiXmlNode *scintKeyRoot, const ScintillaKeyMap & scintKeyMap) +{ + TiXmlNode *keyRoot = scintKeyRoot->InsertEndChild(TiXmlElement("ScintKey")); + + keyRoot->ToElement()->SetAttribute("name", scintKeyMap._name); + keyRoot->ToElement()->SetAttribute("id", scintKeyMap.getID()); + keyRoot->ToElement()->SetAttribute("Ctrl", scintKeyMap._isCtrl?"yes":"no"); + keyRoot->ToElement()->SetAttribute("Alt", scintKeyMap._isAlt?"yes":"no"); + keyRoot->ToElement()->SetAttribute("Shift", scintKeyMap._isShift?"yes":"no"); + keyRoot->ToElement()->SetAttribute("Key", scintKeyMap._key); + keyRoot->ToElement()->SetAttribute("ScintID", scintKeyMap.getScintillaKey()); + keyRoot->ToElement()->SetAttribute("menuCmdID", scintKeyMap.getMenuCmdID()); +} + +void NppParameters::writeSession(const Session & session, const char *fileName) +{ + const char *pathName = fileName?fileName:_sessionPath; + + _pXmlSessionDoc = new TiXmlDocument(pathName); + TiXmlNode *root = _pXmlSessionDoc->InsertEndChild(TiXmlElement("NotepadPlus")); + + if (root) + { + TiXmlNode *sessionNode = root->InsertEndChild(TiXmlElement("Session")); + (sessionNode->ToElement())->SetAttribute("actifIndex", (int)session._actifIndex); + for (size_t i = 0 ; i < session._files.size() ; i++) + { + TiXmlNode *fileNameNode = sessionNode->InsertEndChild(TiXmlElement("File")); + + (fileNameNode->ToElement())->SetAttribute("firstVisibleLine", session._files[i]._firstVisibleLine); + (fileNameNode->ToElement())->SetAttribute("xOffset", session._files[i]._xOffset); + (fileNameNode->ToElement())->SetAttribute("startPos", session._files[i]._startPos); + (fileNameNode->ToElement())->SetAttribute("endPos", session._files[i]._endPos); + + TiXmlText fileNameFullPath(session._files[i]._fileName.c_str()); + fileNameNode->InsertEndChild(fileNameFullPath); + for (size_t j = 0 ; j < session._files[i].marks.size() ; j++) + { + size_t markLine = session._files[i].marks[j]; + TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement("Mark")); + markNode->ToElement()->SetAttribute("line", markLine); + } + } + } + _pXmlSessionDoc->SaveFile(); + +} + +void NppParameters::writeShortcuts(bool rewriteCmdSc, bool rewriteMacrosSc, bool rewriteUserCmdSc, bool rewriteScintillaKey, bool rewritePluginCmdSc) +{ + if (!_pXmlShortcutDoc) + { + //do the treatment + _pXmlShortcutDoc = new TiXmlDocument(_shortcutsPath); + } + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + { + root = _pXmlShortcutDoc->InsertEndChild(TiXmlElement("NotepadPlus")); + //root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + } + + if (rewriteCmdSc) + { + TiXmlNode *cmdRoot = root->FirstChild("InternalCommands"); + if (cmdRoot) + root->RemoveChild(cmdRoot); + + cmdRoot = root->InsertEndChild(TiXmlElement("InternalCommands")); + + for (size_t i = 0 ; i < _shortcuts.size() ; i++) + { + insertCmd(cmdRoot, _shortcuts[i]); + } + } + + if (rewriteMacrosSc) + { + TiXmlNode *macrosRoot = root->FirstChild("Macros"); + if (macrosRoot) + root->RemoveChild(macrosRoot); + + macrosRoot = root->InsertEndChild(TiXmlElement("Macros")); + + for (size_t i = 0 ; i < _macros.size() ; i++) + { + insertMacro(macrosRoot, _macros[i]); + } + } + + if (rewriteUserCmdSc) + { + TiXmlNode *userCmdRoot = root->FirstChild("UserDefinedCommands"); + if (userCmdRoot) + root->RemoveChild(userCmdRoot); + + userCmdRoot = root->InsertEndChild(TiXmlElement("UserDefinedCommands")); + + for (size_t i = 0 ; i < _userCommands.size() ; i++) + { + insertUserCmd(userCmdRoot, _userCommands[i]); + } + } + + if (rewriteScintillaKey) + { + TiXmlNode *scitillaKeyRoot = root->FirstChild("ScintillaKeys"); + if (scitillaKeyRoot) + root->RemoveChild(scitillaKeyRoot); + + scitillaKeyRoot = root->InsertEndChild(TiXmlElement("ScintillaKeys")); + for (size_t i = 0 ; i < _scintillaModifiedKeys.size() ; i++) + { + insertScintKey(scitillaKeyRoot, _scintillaModifiedKeys[i]); + } + } + + if (rewritePluginCmdSc) + { + TiXmlNode *pluginCmdRoot = root->FirstChild("PluginCommands"); + if (pluginCmdRoot) + root->RemoveChild(pluginCmdRoot); + + pluginCmdRoot = root->InsertEndChild(TiXmlElement("PluginCommands")); + for (size_t i = 0 ; i < _pluginCustomizedCmds.size() ; i++) + { + insertPluginCmd(pluginCmdRoot, _pluginCustomizedCmds[i]); + } + } + if (rewriteCmdSc || rewriteMacrosSc || rewriteUserCmdSc || rewriteScintillaKey || rewritePluginCmdSc) + _pXmlShortcutDoc->SaveFile(); +} + +int NppParameters::addUserLangToEnd(const UserLangContainer & userLang, const char *newName) +{ + if (isExistingUserLangName(newName)) + return -1; + _userLangArray[_nbUserLang] = new UserLangContainer(); + *(_userLangArray[_nbUserLang]) = userLang; + strcpy(_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 char *name) +{ + if (!name) return -1; + if (!strcmp(name, "Folder+")) return 1; + else if (!strcmp(name, "Folder-")) return 2; + else if (!strcmp(name, "Operators"))return 3; + else if (!strcmp(name, "Comment")) return 4; + else if (!strcmp(name, "Words1")) return 5; + else if (!strcmp(name, "Words2")) return 6; + else if (!strcmp(name, "Words3")) return 7; + else if (!strcmp(name, "Words4")) return 8; + else if (!strcmp(name, "Delimiters")) return 0; + else return -1; +} +void NppParameters::feedUserSettings(TiXmlNode *settingsRoot) +{ + const char *boolStr; + TiXmlNode *globalSettingNode = settingsRoot->FirstChildElement("Global"); + if (globalSettingNode) + { + boolStr = (globalSettingNode->ToElement())->Attribute("caseIgnored"); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isCaseIgnored = !strcmp("yes", boolStr); + } + TiXmlNode *treatAsSymbolNode = settingsRoot->FirstChildElement("TreatAsSymbol"); + if (treatAsSymbolNode) + { + boolStr = (treatAsSymbolNode->ToElement())->Attribute("comment"); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isCommentSymbol = !strcmp("yes", boolStr); + + boolStr = (treatAsSymbolNode->ToElement())->Attribute("commentLine"); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isCommentLineSymbol = !strcmp("yes", boolStr); + } + TiXmlNode *prefixNode = settingsRoot->FirstChildElement("Prefix"); + if (prefixNode) + { + char names[nbPrefixListAllowed][7] = {"words1","words2","words3","words4"}; + for (int i = 0 ; i < nbPrefixListAllowed ; i++) + { + boolStr = (prefixNode->ToElement())->Attribute(names[i]); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isPrefix[i] = !strcmp("yes", boolStr); + } + } +} + +void NppParameters::feedUserKeywordList(TiXmlNode *node) +{ + for (TiXmlNode *childNode = node->FirstChildElement("Keywords"); + childNode ; + childNode = childNode->NextSibling("Keywords")) + { + const char *keywordsName = (childNode->ToElement())->Attribute("name"); + int i = getIndexFromKeywordListName(keywordsName); + if (i != -1) + { + TiXmlNode *valueNode = childNode->FirstChild(); + const char *kwl = (valueNode)?valueNode->Value():(strcmp(keywordsName, "Delimiters")?"":"000000"); + strcpy(_userLangArray[_nbUserLang - 1]->_keywordLists[i], kwl); + } + } +} + +void NppParameters::feedUserStyles(TiXmlNode *node) +{ + for (TiXmlNode *childNode = node->FirstChildElement("WordsStyle"); + childNode ; + childNode = childNode->NextSibling("WordsStyle")) + { + int id; + const char *styleIDStr = (childNode->ToElement())->Attribute("styleID", &id); + if (styleIDStr) + { + _userLangArray[_nbUserLang - 1]->_styleArray.addStyler(id, childNode); + } + } +} + +bool NppParameters::feedStylerArray(TiXmlNode *node) +{ + TiXmlNode *styleRoot = node->FirstChildElement("LexerStyles"); + if (!styleRoot) return false; + + // For each lexer + for (TiXmlNode *childNode = styleRoot->FirstChildElement("LexerType"); + childNode ; + childNode = childNode->NextSibling("LexerType") ) + { + if (!_lexerStylerArray.hasEnoughSpace()) return false; + + TiXmlElement *element = childNode->ToElement(); + const char *lexerName = element->Attribute("name"); + const char *lexerDesc = element->Attribute("desc"); + const char *lexerUserExt = element->Attribute("ext"); + if (lexerName) + { + _lexerStylerArray.addLexerStyler(lexerName, lexerDesc, lexerUserExt, childNode); + } + } + + // The global styles for all lexers + TiXmlNode *globalStyleRoot = node->FirstChildElement("GlobalStyles"); + if (!globalStyleRoot) return false; + + for (TiXmlNode *childNode = globalStyleRoot->FirstChildElement("WidgetStyle"); + childNode ; + childNode = childNode->NextSibling("WidgetStyle") ) + { + if (!_widgetStyleArray.hasEnoughSpace()) return false; + + TiXmlElement *element = childNode->ToElement(); + const char *styleIDStr = element->Attribute("styleID"); + + int styleID = -1; + if ((styleID = decStrVal(styleIDStr)) != -1) + { + _widgetStyleArray.addStyler(styleID, childNode); + } + } + return true; +} + +void LexerStylerArray::addLexerStyler(const char *lexerName, const char *lexerDesc, const char *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("WordsStyle"); + childNode ; + childNode = childNode->NextSibling("WordsStyle") ) + { + + if (!ls.hasEnoughSpace()) return; + + TiXmlElement *element = childNode->ToElement(); + const char *styleIDStr = element->Attribute("styleID"); + + if (styleIDStr) + { + int styleID = -1; + if ((styleID = decStrVal(styleIDStr)) != -1) + { + ls.addStyler(styleID, childNode); + } + } + } +} + +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 char *str = element->Attribute("name"); + if (str) + { + _styleArray[_nbStyler]._styleDesc = str; + } + + str = element->Attribute("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("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("fontName"); + _styleArray[_nbStyler]._fontName = str; + + str = element->Attribute("fontStyle"); + if (str) + { + _styleArray[_nbStyler]._fontStyle = decStrVal(str); + } + + str = element->Attribute("fontSize"); + if (str) + { + _styleArray[_nbStyler]._fontSize = decStrVal(str); + } + + str = element->Attribute("keywordClass"); + if (str) + { + _styleArray[_nbStyler]._keywordClass = getKwClassFromName(str); + } + + TiXmlNode *v = styleNode->FirstChild(); + if (v) + { + //const char *keyWords = v->Value(); + //if (keyWords) + _styleArray[_nbStyler]._keywords = new string(v->Value()); + } + } + _nbStyler++; +} + +void NppParameters::writeHistory(const char *fullpath) +{ + TiXmlNode *historyNode = (_pXmlUserDoc->FirstChild("NotepadPlus"))->FirstChildElement("History"); + TiXmlElement recentFileNode("File"); + TiXmlText fileNameFullPath(fullpath); + recentFileNode.InsertEndChild(fileNameFullPath); + + (historyNode->ToElement())->InsertEndChild(recentFileNode); +} + +TiXmlNode * NppParameters::getChildElementByAttribut(TiXmlNode *pere, const char *childName,\ + const char *attributName, const char *attributVal) const +{ + for (TiXmlNode *childNode = pere->FirstChildElement(childName); + childNode ; + childNode = childNode->NextSibling(childName)) + { + TiXmlElement *element = childNode->ToElement(); + const char *val = element->Attribute(attributName); + if (val) + { + if (!strcmp(val, attributVal)) + return childNode; + } + } + return NULL; +} + +// 2 restes : L_H, L_USER +LangType NppParameters::getLangIDFromStr(const char *langName) +{ + if (!strcmp("c", langName)) return L_C; + if (!strcmp("cpp", langName)) return L_CPP; + if (!strcmp("java", langName)) return L_JAVA; + if (!strcmp("cs", langName)) return L_CS; + if (!strcmp("objc", langName)) return L_OBJC; + if (!strcmp("rc", langName)) return L_RC; + if (!strcmp("html", langName)) return L_HTML; + if (!strcmp("javascript", langName)) return L_JS; + if (!strcmp("php", langName)) return L_PHP; + if (!strcmp("vb", langName)) return L_VB; + if (!strcmp("sql", langName)) return L_SQL; + if (!strcmp("xml", langName)) return L_XML; + if (!strcmp("asp", langName)) return L_ASP; + if (!strcmp("perl", langName)) return L_PERL; + if (!strcmp("pascal", langName)) return L_PASCAL; + if (!strcmp("python", langName)) return L_PYTHON; + if (!strcmp("css", langName)) return L_CSS; + if (!strcmp("lua", langName)) return L_LUA; + if (!strcmp("batch", langName)) return L_BATCH; + if (!strcmp("ini", langName)) return L_INI; + if (!strcmp("nfo", langName)) return L_NFO; + if (!strcmp("makefile", langName)) return L_MAKEFILE; + if (!strcmp("tex", langName)) return L_TEX; + if (!strcmp("fortran", langName)) return L_FORTRAN; + if (!strcmp("bash", langName)) return L_BASH; + if (!strcmp("actionscript", langName)) return L_FLASH; + if (!strcmp("nsis", langName)) return L_NSIS; + if (!strcmp("tcl", langName)) return L_TCL; + + if (!strcmp("lisp", langName)) return L_LISP; + if (!strcmp("scheme", langName)) return L_SCHEME; + if (!strcmp("asm", langName)) return L_ASM; + if (!strcmp("diff", langName)) return L_DIFF; + if (!strcmp("props", langName)) return L_PROPS; + if (!strcmp("postscript", langName)) return L_PS; + if (!strcmp("ruby", langName)) return L_RUBY; + if (!strcmp("smalltalk", langName)) return L_SMALLTALK; + if (!strcmp("vhdl", langName)) return L_VHDL; + + if (!strcmp("caml", langName)) return L_CAML; + if (!strcmp("verilog", langName)) return L_VERILOG; + if (!strcmp("kix", langName)) return L_KIX; + if (!strcmp("autoit", langName)) return L_AU3; + if (!strcmp("ada", langName)) return L_ADA; + if (!strcmp("matlab", langName)) return L_MATLAB; + if (!strcmp("haskell", langName)) return L_HASKELL; + if (!strcmp("inno", langName)) return L_INNO; + if (!strcmp("searchResult", langName)) return L_SEARCHRESULT; + if (!strcmp("cmake", langName)) return L_CMAKE; + return L_TXT; +} + +int NppParameters::getIndexFromStr(const char *indexName) const +{ + string str(indexName); + + if (str == "instre1") + return LANG_INDEX_INSTR; + else if (str == "instre2") + return LANG_INDEX_INSTR2; + else if (str == "type1") + return LANG_INDEX_TYPE; + else if (str == "type2") + return LANG_INDEX_TYPE2; + else if (str == "type3") + return LANG_INDEX_TYPE3; + else if (str == "type4") + return LANG_INDEX_TYPE4; + else + return -1; +} + +void NppParameters::feedKeyWordsParameters(TiXmlNode *node) +{ + + TiXmlNode *langRoot = node->FirstChildElement("Languages"); + if (!langRoot) return; + + for (TiXmlNode *langNode = langRoot->FirstChildElement("Language"); + langNode ; + langNode = langNode->NextSibling("Language") ) + { + if (_nbLang < NB_LANG) + { + TiXmlElement *element = langNode->ToElement(); + const char *name = element->Attribute("name"); + if (name) + { + _langList[_nbLang] = new Lang(getLangIDFromStr(name), name); + _langList[_nbLang]->setDefaultExtList(element->Attribute("ext")); + _langList[_nbLang]->setCommentLineSymbol(element->Attribute("commentLine")); + _langList[_nbLang]->setCommentStart(element->Attribute("commentStart")); + _langList[_nbLang]->setCommentEnd(element->Attribute("commentEnd")); + + for (TiXmlNode *kwNode = langNode->FirstChildElement("Keywords"); + kwNode ; + kwNode = kwNode->NextSibling("Keywords") ) + { + const char *indexName = (kwNode->ToElement())->Attribute("name"); + TiXmlNode *kwVal = kwNode->FirstChild(); + const char *keyWords = ""; + if ((indexName) && (kwVal)) + keyWords = kwVal->Value(); + + int i = getIndexFromStr(indexName); + + if (i != -1) + _langList[_nbLang]->setWords(keyWords, i); + } + _nbLang++; + } + } + } +} + +void NppParameters::feedGUIParameters(TiXmlNode *node) +{ + TiXmlNode *GUIRoot = node->FirstChildElement("GUIConfigs"); + if (!GUIRoot) return; + + for (TiXmlNode *childNode = GUIRoot->FirstChildElement("GUIConfig"); + childNode ; + childNode = childNode->NextSibling("GUIConfig") ) + { + TiXmlElement *element = childNode->ToElement(); + const char *nm = element->Attribute("name"); + if (!nm) return; + + const char *val; + + if (!strcmp(nm, "ToolBar")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "hide")) + _nppGUI._toolBarStatus = TB_HIDE; + else if (!strcmp(val, "small")) + _nppGUI._toolBarStatus = TB_SMALL; + else if (!strcmp(val, "large")) + _nppGUI._toolBarStatus = TB_LARGE; + else if (!strcmp(val, "standard")) + _nppGUI._toolBarStatus = TB_STANDARD; + } + else if (!strcmp(nm, "StatusBar")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "hide")) + _nppGUI._statusBarShow = false; + else if (!strcmp(val, "show")) + _nppGUI._statusBarShow = true; + } + else if (!strcmp(nm, "TabBar")) + { + bool isFailed = false; + int oldValue = _nppGUI._tabStatus; + val = element->Attribute("dragAndDrop"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus = TAB_DRAGNDROP; + else if (!strcmp(val, "no")) + _nppGUI._tabStatus = 0; + else + isFailed = true; + } + + val = element->Attribute("drawTopBar"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus |= TAB_DRAWTOPBAR; + else if (!strcmp(val, "no")) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + + val = element->Attribute("drawInactiveTab"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus |= TAB_DRAWINACTIVETAB; + else if (!strcmp(val, "no")) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + + val = element->Attribute("reduce"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus |= TAB_REDUCE; + else if (!strcmp(val, "no")) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + + val = element->Attribute("closeButton"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus |= TAB_CLOSEBUTTON; + } + + val = element->Attribute("doubleClick2Close"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus |= TAB_DBCLK2CLOSE; + } + if (isFailed) + _nppGUI._tabStatus = oldValue; + } + else if (!strcmp(nm, "Auto-detection")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "no")) + _nppGUI._fileAutoDetection = cdDisabled; + else if (!strcmp(val, "auto")) + _nppGUI._fileAutoDetection = cdAutoUpdate; + else + _nppGUI._fileAutoDetection = cdEnabled; + } + else if (!strcmp(nm, "TrayIcon")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "yes")) + _nppGUI._isMinimizedToTray = true; + } + else if (!strcmp(nm, "RememberLastSession")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "yes")) + _nppGUI._rememberLastSession = true; + else + _nppGUI._rememberLastSession = false; + } + + else if (!strcmp(nm, "MaitainIndent")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "yes")) + _nppGUI._maitainIndent = true; + else + _nppGUI._maitainIndent = false; + } + + else if (!strcmp(nm, "TaskList")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + _nppGUI._doTaskList = (!strcmp(val, "yes"))?true:false; + } + + else if (!strcmp(nm, "SaveOpenFileInSameDir")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + _nppGUI._saveOpenKeepInSameDir = (!strcmp(val, "yes"))?true:false; + } + + else if (!strcmp(nm, "MRU")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + _nppGUI._styleMRU = (!strcmp(val, "yes"))?true:false; + } + + else if (!strcmp(nm, "URL")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + if (!strcmp(val, "1")) + _nppGUI._styleURL = 1; + else if (!strcmp(val, "2")) + _nppGUI._styleURL = 2; + else + _nppGUI._styleURL = 0; + } + + else if (!strcmp(nm, "CheckHistoryFiles")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "no")) + _nppGUI._checkHistoryFiles = false; + } + else if (!strcmp(nm, "ScintillaViewsSplitter")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "vertical")) + _nppGUI._splitterPos = POS_VERTICAL; + else if (!strcmp(val, "horizontal")) + _nppGUI._splitterPos = POS_HORIZOTAL; + } + else if (!strcmp(nm, "UserDefineDlg")) + { + bool isFailed = false; + int oldValue = _nppGUI._userDefineDlgStatus; + + val = (childNode->FirstChild())->Value(); + if (val) + { + if (!strcmp(val, "hide")) + _nppGUI._userDefineDlgStatus = 0; + else if (!strcmp(val, "show")) + _nppGUI._userDefineDlgStatus = UDD_SHOW; + else + isFailed = true; + } + val = element->Attribute("position"); + if (val) + { + if (!strcmp(val, "docked")) + _nppGUI._userDefineDlgStatus |= UDD_DOCKED; + else if (!strcmp(val, "undocked")) + _nppGUI._userDefineDlgStatus |= 0; + else + isFailed = true; + } + if (isFailed) + _nppGUI._userDefineDlgStatus = oldValue; + } + else if (!strcmp(nm, "TabSetting")) + { + val = element->Attribute("size"); + if (val) + _nppGUI._tabSize = decStrVal(val); + + if ((_nppGUI._tabSize == -1) || (_nppGUI._tabSize == 0)) + _nppGUI._tabSize = 8; + //bool isFailed = false; + val = element->Attribute("replaceBySpace"); + if (val) + _nppGUI._tabReplacedBySpace = (!strcmp(val, "yes")); + } + else if (!strcmp(nm, "AppPosition")) + { + RECT oldRect = _nppGUI._appPos; + bool fuckUp = true; + int i; + + if (element->Attribute("x", &i)) + { + _nppGUI._appPos.left = i; + + if (element->Attribute("y", &i)) + { + _nppGUI._appPos.top = i; + + if (element->Attribute("width", &i)) + { + _nppGUI._appPos.right = i; + + if (element->Attribute("height", &i)) + { + _nppGUI._appPos.bottom = i; + fuckUp = false; + } + } + } + } + if (fuckUp) + _nppGUI._appPos = oldRect; + + + if (val = element->Attribute("isMaximized")) + { + _nppGUI._isMaximized = (strcmp(val, "yes") == 0); + } + } + else if (!strcmp(nm, "NewDocDefaultSettings")) + { + int i; + if (element->Attribute("format", &i)) + _nppGUI._newDocDefaultSettings._format = (formatType)i; + + if (element->Attribute("encoding", &i)) + _nppGUI._newDocDefaultSettings._encoding = (UniMode)i; + + if (element->Attribute("lang", &i)) + _nppGUI._newDocDefaultSettings._lang = (LangType)i; + } + else if (!strcmp(nm, "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("gr0", &i)) + if (i <= 255) + g0 = i; + if (element->Attribute("gr1", &i)) + if (i <= 255) + g1 = i; + if (element->Attribute("gr2", &i)) + if (i <= 255) + g2 = i; + if (element->Attribute("gr3", &i)) + if (i <= 255) + g3 = i; + if (element->Attribute("gr4", &i)) + if (i <= 255) + g4 = i; + if (element->Attribute("gr5", &i)) + if (i <= 255) + g5 = i; + if (element->Attribute("gr6", &i)) + if (i <= 255) + g6 = i; + if (element->Attribute("gr7", &i)) + if (i <= 255) + g7 = i; + + bool langArray[nbMax]; + for (int i = 0 ; i < nbMax ; i++) langArray[i] = false; + + unsigned char 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; + } + } + + else if (!strcmp(nm, "Print")) + { + val = element->Attribute("lineNumber"); + if (val) + _nppGUI._printSettings._printLineNumber = (!strcmp(val, "yes")); + + int i; + if (element->Attribute("printOption", &i)) + _nppGUI._printSettings._printOption = i; + + val = element->Attribute("headerLeft"); + if (val) + _nppGUI._printSettings._headerLeft = val; + + val = element->Attribute("headerMiddle"); + if (val) + _nppGUI._printSettings._headerMiddle = val; + + val = element->Attribute("headerRight"); + if (val) + _nppGUI._printSettings._headerRight = val; + + + val = element->Attribute("footerLeft"); + if (val) + _nppGUI._printSettings._footerLeft = val; + + val = element->Attribute("footerMiddle"); + if (val) + _nppGUI._printSettings._footerMiddle = val; + + val = element->Attribute("footerRight"); + if (val) + _nppGUI._printSettings._footerRight = val; + + + val = element->Attribute("headerFontName"); + if (val) + _nppGUI._printSettings._headerFontName = val; + + val = element->Attribute("footerFontName"); + if (val) + _nppGUI._printSettings._footerFontName = val; + + if (element->Attribute("headerFontStyle", &i)) + _nppGUI._printSettings._headerFontStyle = i; + + if (element->Attribute("footerFontStyle", &i)) + _nppGUI._printSettings._footerFontStyle = i; + + if (element->Attribute("headerFontSize", &i)) + _nppGUI._printSettings._headerFontSize = i; + + if (element->Attribute("footerFontSize", &i)) + _nppGUI._printSettings._footerFontSize = i; + + + if (element->Attribute("margeLeft", &i)) + _nppGUI._printSettings._marge.left = i; + + if (element->Attribute("margeTop", &i)) + _nppGUI._printSettings._marge.top = i; + + if (element->Attribute("margeRight", &i)) + _nppGUI._printSettings._marge.right = i; + + if (element->Attribute("margeBottom", &i)) + _nppGUI._printSettings._marge.bottom = i; + } + + else if (!strcmp(nm, "ScintillaPrimaryView")) + { + feedScintillaParam(SCIV_PRIMARY, element); + } + else if (!strcmp(nm, "ScintillaSecondaryView")) + { + feedScintillaParam(SCIV_SECOND, element); + } + else if (!strcmp(nm, "Backup")) + { + int i; + if (element->Attribute("action", &i)) + _nppGUI._backup = (BackupFeature)i; + + const char *bDir = element->Attribute("useCustumDir"); + if (bDir && !strcmp(bDir, "yes")) + { + _nppGUI._useDir = true; + } + const char *pDir = element->Attribute("dir"); + if (pDir) + strcpy(_nppGUI._backupDir, pDir); + } + else if (!strcmp(nm, "DockingManager")) + { + feedDockingManager(element); + } + } +} + +void NppParameters::feedScintillaParam(bool whichOne, TiXmlNode *node) +{ + TiXmlElement *element = node->ToElement(); + + // Line Number Margin + const char *nm = element->Attribute("lineNumberMargin"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._lineNumberMarginShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._lineNumberMarginShow = false; + } + + // Bookmark Margin + nm = element->Attribute("bookMarkMargin"); + if (nm) + { + + if (!strcmp(nm, "show")) + _svp[whichOne]._bookMarkMarginShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._bookMarkMarginShow = false; + } + + // Indent GuideLine + nm = element->Attribute("indentGuideLine"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._indentGuideLineShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._indentGuideLineShow= false; + } + + // Folder Mark Style + nm = element->Attribute("folderMarkStyle"); + if (nm) + { + if (!strcmp(nm, "box")) + _svp[whichOne]._folderStyle = FOLDER_STYLE_BOX; + else if (!strcmp(nm, "circle")) + _svp[whichOne]._folderStyle = FOLDER_STYLE_CIRCLE; + else if (!strcmp(nm, "arrow")) + _svp[whichOne]._folderStyle = FOLDER_STYLE_ARROW; + else if (!strcmp(nm, "simple")) + _svp[whichOne]._folderStyle = FOLDER_STYLE_SIMPLE; + } + + // Current Line Highlighting State + nm = element->Attribute("currentLineHilitingShow"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._currentLineHilitingShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._currentLineHilitingShow = false; + } + + // Current wrap symbol visibility State + nm = element->Attribute("wrapSymbolShow"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._wrapSymbolShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._wrapSymbolShow = false; + } + + // Do Wrap + nm = element->Attribute("Wrap"); + if (nm) + { + if (!strcmp(nm, "yes")) + _svp[whichOne]._doWrap = true; + else if (!strcmp(nm, "no")) + _svp[whichOne]._doWrap = false; + } + + // Do Edge + nm = element->Attribute("edge"); + if (nm) + { + if (!strcmp(nm, "background")) + _svp[whichOne]._edgeMode = EDGE_BACKGROUND; + else if (!strcmp(nm, "line")) + _svp[whichOne]._edgeMode = EDGE_LINE; + else + _svp[whichOne]._edgeMode = EDGE_NONE; + } + + int val; + nm = element->Attribute("edgeNbColumn", &val); + if (nm) + { + _svp[whichOne]._edgeNbColumn = val; + } + + nm = element->Attribute("zoom", &val); + if (nm) + { + _svp[whichOne]._zoom = val; + } + + // White Space visibility State + nm = element->Attribute("whiteSpaceShow"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._whiteSpaceShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._whiteSpaceShow = false; + } + + // EOL visibility State + nm = element->Attribute("eolShow"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._eolShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._eolShow = false; + } +} + + +void NppParameters::feedDockingManager(TiXmlNode *node) +{ + TiXmlElement *element = node->ToElement(); + + int i; + if (element->Attribute("leftWidth", &i)) + _nppGUI._dockingData._leftWidth = i; + + if (element->Attribute("rightWidth", &i)) + _nppGUI._dockingData._rightWidth = i; + + if (element->Attribute("topHeight", &i)) + _nppGUI._dockingData._topHeight = i; + + if (element->Attribute("bottomHeight", &i)) + _nppGUI._dockingData._bottomHight = i; + + + + for (TiXmlNode *childNode = node->FirstChildElement("FloatingWindow"); + childNode ; + childNode = childNode->NextSibling("FloatingWindow") ) + { + TiXmlElement *floatElement = childNode->ToElement(); + int cont; + if (floatElement->Attribute("cont", &cont)) + { + int x = 0; + int y = 0; + int w = 100; + int h = 100; + + floatElement->Attribute("x", &x); + floatElement->Attribute("y", &y); + floatElement->Attribute("width", &w); + floatElement->Attribute("height", &h); + _nppGUI._dockingData._flaotingWindowInfo.push_back(FloatingWindowInfo(cont, x, y, w, h)); + } + } + + for (TiXmlNode *childNode = node->FirstChildElement("PluginDlg"); + childNode ; + childNode = childNode->NextSibling("PluginDlg") ) + { + TiXmlElement *dlgElement = childNode->ToElement(); + const char *name = dlgElement->Attribute("pluginName"); + + int id; + const char *idStr = dlgElement->Attribute("id", &id); + if (name && idStr) + { + int curr = 0; // on left + int prev = 0; // on left + + dlgElement->Attribute("curr", &curr); + dlgElement->Attribute("prev", &prev); + + bool isVisible = false; + const char *val = NULL; + if (val = dlgElement->Attribute("isVisible")) + { + isVisible = (strcmp(val, "yes") == 0); + } + + _nppGUI._dockingData._pluginDockInfo.push_back(PlugingDlgDockingInfo(name, id, curr, prev, isVisible)); + } + } + + for (TiXmlNode *childNode = node->FirstChildElement("ActiveTabs"); + childNode ; + childNode = childNode->NextSibling("ActiveTabs") ) + { + TiXmlElement *dlgElement = childNode->ToElement(); + + int cont; + if (dlgElement->Attribute("cont", &cont)) + { + int activeTab = 0; + dlgElement->Attribute("activeTab", &activeTab); + _nppGUI._dockingData._containerTabInfo.push_back(ContainerTabInfo(cont, activeTab)); + } + } +} + +void NppParameters::writeScintillaParams(const ScintillaViewParams & svp, bool whichOne) +{ + if (!_pXmlUserDoc) return; + + const char *pViewName = (whichOne == SCIV_PRIMARY)?"ScintillaPrimaryView":"ScintillaSecondaryView"; + TiXmlNode *configsRoot = (_pXmlUserDoc->FirstChild("NotepadPlus"))->FirstChildElement("GUIConfigs"); + TiXmlNode *scintNode = getChildElementByAttribut(configsRoot, "GUIConfig", "name", pViewName); + if (scintNode) + { + (scintNode->ToElement())->SetAttribute("lineNumberMargin", svp._lineNumberMarginShow?"show":"hide"); + (scintNode->ToElement())->SetAttribute("bookMarkMargin", svp._bookMarkMarginShow?"show":"hide"); + (scintNode->ToElement())->SetAttribute("indentGuideLine", svp._indentGuideLineShow?"show":"hide"); + const char *pFolderStyleStr = (svp._folderStyle == FOLDER_STYLE_SIMPLE)?"simple": + (svp._folderStyle == FOLDER_STYLE_ARROW)?"arrow": + (svp._folderStyle == FOLDER_STYLE_CIRCLE)?"circle":"box"; + (scintNode->ToElement())->SetAttribute("folderMarkStyle", pFolderStyleStr); + (scintNode->ToElement())->SetAttribute("currentLineHilitingShow", svp._currentLineHilitingShow?"show":"hide"); + (scintNode->ToElement())->SetAttribute("wrapSymbolShow", svp._wrapSymbolShow?"show":"hide"); + (scintNode->ToElement())->SetAttribute("Wrap", svp._doWrap?"yes":"no"); + char *edgeStr = NULL; + if (svp._edgeMode == EDGE_NONE) + edgeStr = "no"; + else if (svp._edgeMode == EDGE_LINE) + edgeStr = "line"; + else + edgeStr = "background"; + (scintNode->ToElement())->SetAttribute("edge", edgeStr); + (scintNode->ToElement())->SetAttribute("edgeNbColumn", svp._edgeNbColumn); + (scintNode->ToElement())->SetAttribute("zoom", svp._zoom); + (scintNode->ToElement())->SetAttribute("whiteSpaceShow", svp._whiteSpaceShow?"show":"hide"); + (scintNode->ToElement())->SetAttribute("eolShow", svp._eolShow?"show":"hide"); + } + else {/*create one*/} +} + +void NppParameters::writeGUIParams() +{ + if (!_pXmlUserDoc) return; + + TiXmlNode *GUIRoot = (_pXmlUserDoc->FirstChild("NotepadPlus"))->FirstChildElement("GUIConfigs"); + if (!GUIRoot) + { + return; + } + + 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; + + TiXmlNode *dockingParamNode = NULL; + + for (TiXmlNode *childNode = GUIRoot->FirstChildElement("GUIConfig"); + childNode ; + childNode = childNode->NextSibling("GUIConfig")) + { + TiXmlElement *element = childNode->ToElement(); + const char *nm = element->Attribute("name"); + if (!nm) {return;} + + if (!strcmp(nm, "ToolBar")) + { + const char *pStr = _nppGUI._toolBarStatus == TB_HIDE?"hide":(_nppGUI._toolBarStatus == TB_SMALL?"small":(_nppGUI._toolBarStatus == TB_STANDARD?"standard":"large")); + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "StatusBar")) + { + const char *pStr = _nppGUI._statusBarShow?"show":"hide"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "TabBar")) + { + const char *pStr = (_nppGUI._tabStatus & TAB_DRAWTOPBAR)?"yes":"no"; + element->SetAttribute("dragAndDrop", pStr); + + pStr = (_nppGUI._tabStatus & TAB_DRAGNDROP)?"yes":"no"; + element->SetAttribute("drawTopBar", pStr); + + pStr = (_nppGUI._tabStatus & TAB_DRAWINACTIVETAB)?"yes":"no"; + element->SetAttribute("drawInactiveTab", pStr); + + pStr = (_nppGUI._tabStatus & TAB_REDUCE)?"yes":"no"; + element->SetAttribute("reduce", pStr); + + pStr = (_nppGUI._tabStatus & TAB_CLOSEBUTTON)?"yes":"no"; + element->SetAttribute("closeButton", pStr); + + pStr = (_nppGUI._tabStatus & TAB_DBCLK2CLOSE)?"yes":"no"; + element->SetAttribute("doubleClick2Close", pStr); + } + else if (!strcmp(nm, "ScintillaViewsSplitter")) + { + const char *pStr = _nppGUI._splitterPos == POS_VERTICAL?"vertical":"horizontal"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "UserDefineDlg")) + { + const char *pStr = _nppGUI._userDefineDlgStatus & UDD_SHOW?"show":"hide"; + (childNode->FirstChild())->SetValue(pStr); + + pStr = (_nppGUI._userDefineDlgStatus & UDD_DOCKED)?"docked":"undocked"; + element->SetAttribute("position", pStr); + } + else if (!strcmp(nm, "TabSetting")) + { + const char *pStr = _nppGUI._tabReplacedBySpace?"yes":"no"; + element->SetAttribute("replaceBySpace", pStr); + element->SetAttribute("size", _nppGUI._tabSize); + } + else if (!strcmp(nm, "Auto-detection")) + { + autoDetectionExist = true; + const char *pStr = (cdEnabled == _nppGUI._fileAutoDetection)?"yes":((cdAutoUpdate == _nppGUI._fileAutoDetection)?"auto":"no"); + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "TrayIcon")) + { + trayIconExist = true; + const char *pStr = _nppGUI._isMinimizedToTray?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "RememberLastSession")) + { + rememberLastSessionExist = true; + const char *pStr = _nppGUI._rememberLastSession?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + + else if (!strcmp(nm, "MaitainIndent")) + { + maitainIndentExist = true; + const char *pStr = _nppGUI._maitainIndent?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + + else if (!strcmp(nm, "SaveOpenFileInSameDir")) + { + saveOpenFileInSameDirExist = true; + const char *pStr = _nppGUI._saveOpenKeepInSameDir?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + + else if (!strcmp(nm, "TaskList")) + { + doTaskListExist = true; + const char *pStr = _nppGUI._doTaskList?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "CheckHistoryFiles")) + { + checkHistoryFilesExist = true; + const char *pStr = _nppGUI._checkHistoryFiles?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "AppPosition")) + { + element->SetAttribute("x", _nppGUI._appPos.left); + element->SetAttribute("y", _nppGUI._appPos.top); + element->SetAttribute("width", _nppGUI._appPos.right); + element->SetAttribute("height", _nppGUI._appPos.bottom); + element->SetAttribute("isMaximized", _nppGUI._isMaximized?"yes":"no"); + } + else if (!strcmp(nm, "NewDocDefaultSettings")) + { + element->SetAttribute("format", _nppGUI._newDocDefaultSettings._format); + element->SetAttribute("encoding", _nppGUI._newDocDefaultSettings._encoding); + element->SetAttribute("lang", _nppGUI._newDocDefaultSettings._lang); + newDocDefaultSettingsExist = true; + } + else if (!strcmp(nm, "langsExcluded")) + { + writeExcludedLangList(element); + langsExcludedLstExist = true; + } + else if (!strcmp(nm, "Print")) + { + writePrintSetting(element); + printSettingExist = true; + } + else if (!strcmp(nm, "Backup")) + { + element->SetAttribute("action", _nppGUI._backup); + element->SetAttribute("useCustumDir", _nppGUI._useDir?"yes":"no"); + element->SetAttribute("dir", _nppGUI._backupDir); + backExist = true; + } + else if (!strcmp(nm, "MRU")) + { + MRUExist = true; + const char *pStr = _nppGUI._styleMRU?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "URL")) + { + URLExist = true; + const char *pStr = "0"; + if (_nppGUI._styleURL == 1) + pStr = "1"; + else if (_nppGUI._styleURL == 2) + pStr = "2"; + + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "DockingManager")) + { + dockingParamNode = childNode; + } + } + + if (!autoDetectionExist) + { + //insertGUIConfigBoolNode(GUIRoot, "Auto-detection", _nppGUI._fileAutoDetection); + const char *pStr = _nppGUI._fileAutoDetection==0?"no":(_nppGUI._fileAutoDetection==1?"yes":"auto"); + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "Auto-detection"); + GUIConfigElement->InsertEndChild(TiXmlText(pStr)); + } + if (!checkHistoryFilesExist) + { + insertGUIConfigBoolNode(GUIRoot, "CheckHistoryFiles", _nppGUI._checkHistoryFiles); + } + if (!trayIconExist) + { + insertGUIConfigBoolNode(GUIRoot, "TrayIcon", _nppGUI._isMinimizedToTray); + } + + if (!maitainIndentExist) + { + insertGUIConfigBoolNode(GUIRoot, "MaitainIndent", _nppGUI._maitainIndent); + } + + if (!rememberLastSessionExist) + { + insertGUIConfigBoolNode(GUIRoot, "RememberLastSession", _nppGUI._rememberLastSession); + } + + if (!newDocDefaultSettingsExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "NewDocDefaultSettings"); + GUIConfigElement->SetAttribute("format", _nppGUI._newDocDefaultSettings._format); + GUIConfigElement->SetAttribute("encoding", _nppGUI._newDocDefaultSettings._encoding); + GUIConfigElement->SetAttribute("lang", _nppGUI._newDocDefaultSettings._lang); + } + + if (!langsExcludedLstExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "langsExcluded"); + writeExcludedLangList(GUIConfigElement); + } + if (!printSettingExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "Print"); + writePrintSetting(GUIConfigElement); + } + if (!backExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "Backup"); + GUIConfigElement->SetAttribute("action", _nppGUI._backup); + GUIConfigElement->SetAttribute("useCustumDir", _nppGUI._useDir?"yes":"no"); + GUIConfigElement->SetAttribute("dir", _nppGUI._backupDir); + } + + if (!doTaskListExist) + { + insertGUIConfigBoolNode(GUIRoot, "TaskList", _nppGUI._doTaskList); + } + + if (!MRUExist) + { + insertGUIConfigBoolNode(GUIRoot, "MRU", _nppGUI._styleMRU); + } + + if (!URLExist) + { + const char *pStr = "0"; + if (_nppGUI._styleURL == 1) + pStr = "1"; + else if (_nppGUI._styleURL == 2) + pStr = "2"; + + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "URL"); + GUIConfigElement->InsertEndChild(TiXmlText(pStr)); + } + + if (!saveOpenFileInSameDirExist) + { + insertGUIConfigBoolNode(GUIRoot, "SaveOpenFileInSameDir", _nppGUI._saveOpenKeepInSameDir); + } + + if (dockingParamNode) + { + // Rase tout + GUIRoot->RemoveChild(dockingParamNode); + } + insertDockingParamNode(GUIRoot); + +} + +void NppParameters::insertDockingParamNode(TiXmlNode *GUIRoot) +{ + TiXmlElement DMNode("GUIConfig"); + DMNode.SetAttribute("name", "DockingManager"); + DMNode.SetAttribute("leftWidth", _nppGUI._dockingData._leftWidth); + DMNode.SetAttribute("rightWidth", _nppGUI._dockingData._rightWidth); + DMNode.SetAttribute("topHeight", _nppGUI._dockingData._topHeight); + DMNode.SetAttribute("bottomHeight", _nppGUI._dockingData._bottomHight); + + for (size_t i = 0 ; i < _nppGUI._dockingData._flaotingWindowInfo.size() ; i++) + { + FloatingWindowInfo & fwi = _nppGUI._dockingData._flaotingWindowInfo[i]; + TiXmlElement FWNode("FloatingWindow"); + FWNode.SetAttribute("cont", fwi._cont); + FWNode.SetAttribute("x", fwi._pos.left); + FWNode.SetAttribute("y", fwi._pos.top); + FWNode.SetAttribute("width", fwi._pos.right); + FWNode.SetAttribute("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("PluginDlg"); + PDNode.SetAttribute("pluginName", pdi._name); + PDNode.SetAttribute("id", pdi._internalID); + PDNode.SetAttribute("curr", pdi._currContainer); + PDNode.SetAttribute("prev", pdi._prevContainer); + PDNode.SetAttribute("isVisible", pdi._isVisible?"yes":"no"); + + DMNode.InsertEndChild(PDNode); + }//printStr("in writeGUIParams"); + + for (size_t i = 0 ; i < _nppGUI._dockingData._containerTabInfo.size() ; i++) + { + ContainerTabInfo & cti = _nppGUI._dockingData._containerTabInfo[i]; + TiXmlElement CTNode("ActiveTabs"); + CTNode.SetAttribute("cont", cti._cont); + CTNode.SetAttribute("activeTab", cti._activeTab); + DMNode.InsertEndChild(CTNode); + } + + GUIRoot->InsertEndChild(DMNode); +} + +void NppParameters::writePrintSetting(TiXmlElement *element) +{ + const char *pStr = _nppGUI._printSettings._printLineNumber?"yes":"no"; + element->SetAttribute("lineNumber", pStr); + + element->SetAttribute("printOption", _nppGUI._printSettings._printOption); + + element->SetAttribute("headerLeft", _nppGUI._printSettings._headerLeft.c_str()); + element->SetAttribute("headerMiddle", _nppGUI._printSettings._headerMiddle.c_str()); + element->SetAttribute("headerRight", _nppGUI._printSettings._headerRight.c_str()); + element->SetAttribute("footerLeft", _nppGUI._printSettings._footerLeft.c_str()); + element->SetAttribute("footerMiddle", _nppGUI._printSettings._footerMiddle.c_str()); + element->SetAttribute("footerRight", _nppGUI._printSettings._footerRight.c_str()); + + element->SetAttribute("headerFontName", _nppGUI._printSettings._headerFontName.c_str()); + element->SetAttribute("headerFontStyle", _nppGUI._printSettings._headerFontStyle); + element->SetAttribute("headerFontSize", _nppGUI._printSettings._headerFontSize); + element->SetAttribute("footerFontName", _nppGUI._printSettings._footerFontName.c_str()); + element->SetAttribute("footerFontStyle", _nppGUI._printSettings._footerFontStyle); + element->SetAttribute("footerFontSize", _nppGUI._printSettings._footerFontSize); + + element->SetAttribute("margeLeft", _nppGUI._printSettings._marge.left); + element->SetAttribute("margeRight", _nppGUI._printSettings._marge.right); + element->SetAttribute("margeTop", _nppGUI._printSettings._marge.top); + element->SetAttribute("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++) + { + int nGrp = _nppGUI._excludedLangList[i]._langType / 8; + int nMask = 1 << _nppGUI._excludedLangList[i]._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("gr0", g0); + element->SetAttribute("gr1", g1); + element->SetAttribute("gr2", g2); + element->SetAttribute("gr3", g3); + element->SetAttribute("gr4", g4); + element->SetAttribute("gr5", g5); + element->SetAttribute("gr6", g6); + element->SetAttribute("gr7", g7); +} + +void NppParameters::insertGUIConfigBoolNode(TiXmlNode *r2w, const char *name, bool bVal) +{ + const char *pStr = bVal?"yes":"no"; + TiXmlElement *GUIConfigElement = (r2w->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", name); + GUIConfigElement->InsertEndChild(TiXmlText(pStr)); +} + +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_TXT : + id = IDM_LANG_TEXT; break; + default : + id = IDM_LANG_TEXT; + } + return id; +} + +void NppParameters::writeStyles(LexerStylerArray & lexersStylers, StyleArray & globalStylers) +{ + TiXmlNode *lexersRoot = (_pXmlUserStylerDoc->FirstChild("NotepadPlus"))->FirstChildElement("LexerStyles"); + for (TiXmlNode *childNode = lexersRoot->FirstChildElement("LexerType"); + childNode ; + childNode = childNode->NextSibling("LexerType")) + { + TiXmlElement *element = childNode->ToElement(); + const char *nm = element->Attribute("name"); + + LexerStyler *pLs = _lexerStylerArray.getLexerStylerByName(nm); + LexerStyler *pLs2 = lexersStylers.getLexerStylerByName(nm); + + const char *extStr = pLs->getLexerUserExt(); + //pLs2->setLexerUserExt(extStr); + element->SetAttribute("ext", extStr); + + + if (pLs) + { + for (TiXmlNode *grChildNode = childNode->FirstChildElement("WordsStyle"); + grChildNode ; + grChildNode = grChildNode->NextSibling("WordsStyle")) + { + TiXmlElement *grElement = grChildNode->ToElement(); + const char *styleName = grElement->Attribute("name"); + + int i = pLs->getStylerIndexByName(styleName); + if (i != -1) + { + Style & style = pLs->getStyler(i); + Style & style2Sync = pLs2->getStyler(i); + + writeStyle2Element(style, style2Sync, grElement); + } + } + } + } + + TiXmlNode *globalStylesRoot = (_pXmlUserStylerDoc->FirstChild("NotepadPlus"))->FirstChildElement("GlobalStyles"); + + for (TiXmlNode *childNode = globalStylesRoot->FirstChildElement("WidgetStyle"); + childNode ; + childNode = childNode->NextSibling("WidgetStyle")) + { + TiXmlElement *pElement = childNode->ToElement(); + const char *styleName = pElement->Attribute("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 char *styleName = element->Attribute("name"); + + if (HIBYTE(HIWORD(style2Wite._fgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._fgColor); + char fgStr[7]; + sprintf(fgStr, "%.6X", rgbVal); + element->SetAttribute("fgColor", fgStr); + } + + if (HIBYTE(HIWORD(style2Wite._bgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._bgColor); + char bgStr[7]; + sprintf(bgStr, "%.6X", rgbVal); + element->SetAttribute("bgColor", bgStr); + } + + if (style2Wite._fontName) + { + const char *oldFontName = element->Attribute("fontName"); + if (strcmp(oldFontName, style2Wite._fontName)) + { + element->SetAttribute("fontName", style2Wite._fontName); + style2Sync._fontName = style2Wite._fontName = element->Attribute("fontName"); + } + } + + if (style2Wite._fontSize != -1) + { + if (!style2Wite._fontSize) + element->SetAttribute("fontSize", ""); + else + element->SetAttribute("fontSize", style2Wite._fontSize); + } + + if (style2Wite._fontStyle != -1) + { + element->SetAttribute("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("UserLang")))->ToElement(); + + rootElement->SetAttribute("name", userLang->_name); + rootElement->SetAttribute("ext", userLang->_ext); + TiXmlElement *settingsElement = (rootElement->InsertEndChild(TiXmlElement("Settings")))->ToElement(); + { + TiXmlElement *globalElement = (settingsElement->InsertEndChild(TiXmlElement("Global")))->ToElement(); + globalElement->SetAttribute("caseIgnored", userLang->_isCaseIgnored?"yes":"no"); + + TiXmlElement *treatAsSymbolElement = (settingsElement->InsertEndChild(TiXmlElement("TreatAsSymbol")))->ToElement(); + treatAsSymbolElement->SetAttribute("comment", userLang->_isCommentSymbol?"yes":"no"); + treatAsSymbolElement->SetAttribute("commentLine", userLang->_isCommentLineSymbol?"yes":"no"); + + TiXmlElement *prefixElement = (settingsElement->InsertEndChild(TiXmlElement("Prefix")))->ToElement(); + char names[nbPrefixListAllowed][7] = {"words1","words2","words3","words4"}; + for (int i = 0 ; i < nbPrefixListAllowed ; i++) + prefixElement->SetAttribute(names[i], userLang->_isPrefix[i]?"yes":"no"); + } + + TiXmlElement *kwlElement = (rootElement->InsertEndChild(TiXmlElement("KeywordLists")))->ToElement(); + + const int nbKWL = 9; + char kwn[nbKWL][16] = {"Delimiters", "Folder+","Folder-","Operators","Comment","Words1","Words2","Words3","Words4"}; + for (int i = 0 ; i < nbKWL ; i++) + { + TiXmlElement *kwElement = (kwlElement->InsertEndChild(TiXmlElement("Keywords")))->ToElement(); + kwElement->SetAttribute("name", kwn[i]); + kwElement->InsertEndChild(TiXmlText(userLang->_keywordLists[i])); + } + + TiXmlElement *styleRootElement = (rootElement->InsertEndChild(TiXmlElement("Styles")))->ToElement(); + + for (int i = 0 ; i < userLang->_styleArray.getNbStyler() ; i++) + { + TiXmlElement *styleElement = (styleRootElement->InsertEndChild(TiXmlElement("WordsStyle")))->ToElement(); + Style style2Wite = userLang->_styleArray.getStyler(i); + + styleElement->SetAttribute("name", style2Wite._styleDesc); + + styleElement->SetAttribute("styleID", style2Wite._styleID); + + //if (HIBYTE(HIWORD(style2Wite._fgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._fgColor); + char fgStr[7]; + sprintf(fgStr, "%.6X", rgbVal); + styleElement->SetAttribute("fgColor", fgStr); + } + + //if (HIBYTE(HIWORD(style2Wite._bgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._bgColor); + char bgStr[7]; + sprintf(bgStr, "%.6X", rgbVal); + styleElement->SetAttribute("bgColor", bgStr); + } + + if (style2Wite._fontName) + { + styleElement->SetAttribute("fontName", style2Wite._fontName); + } + + if (style2Wite._fontStyle == -1) + { + styleElement->SetAttribute("fontStyle", "0"); + } + else + { + styleElement->SetAttribute("fontStyle", style2Wite._fontStyle); + } + + if (style2Wite._fontSize != -1) + { + if (!style2Wite._fontSize) + styleElement->SetAttribute("fontSize", ""); + else + styleElement->SetAttribute("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) + { + char *str = new char[strlen(style._styleDesc) + 1]; + style._styleDesc = strcpy(str, style._styleDesc); + if (style._fontName) + { + str = new char[strlen(style._fontName) + 1]; + style._fontName = strcpy(str, style._fontName); + } + else + { + str = new char[2]; + str[0] = str[1] = '\0'; + style._fontName = str; + } + } + else + { + delete [] style._styleDesc; + delete [] style._fontName; + } + } + } +} + diff --git a/PowerEditor/src/Parameters.cpp.bak b/PowerEditor/src/Parameters.cpp.bak new file mode 100644 index 00000000..965f11a6 --- /dev/null +++ b/PowerEditor/src/Parameters.cpp.bak @@ -0,0 +1,2990 @@ +//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 "ScintillaEditView.h" +#include + +//#include + + +NppParameters * NppParameters::_pSelf = new NppParameters; + +NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserStylerDoc(NULL),\ + _pXmlUserLangDoc(NULL), _pXmlNativeLangDoc(NULL),\ + _nbLang(0), _nbFile(0), _nbMaxFile(10), _pXmlToolIconsDoc(NULL),\ + _pXmlShortcutDoc(NULL), _pXmlContextMenuDoc(NULL), _pXmlSessionDoc(NULL),\ + _nbUserLang(0), _hUser32(NULL), _hUXTheme(NULL),\ + _transparentFuncAddr(NULL), _enableThemeDialogTextureFuncAddr(NULL),\ + _isTaskListRBUTTONUP_Active(false) +{ + _appdataNppDir[0] = '\0'; +} + +void cutString(const char *str2cut, vector & patternVect) +{ + char str2scan[MAX_PATH]; + strcpy(str2scan, str2cut); + size_t len = strlen(str2scan); + bool isProcessing = false; + char *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::load(/*bool noUserPath*/) +{ + bool isAllLaoded = true; + for (int i = 0 ; i < NB_LANG ; _langList[i] = NULL, i++); + char nppPath[MAX_PATH]; + char userPath[MAX_PATH]; + + // Prepare for default path + ::GetModuleFileName(NULL, nppPath, sizeof(nppPath)); + + PathRemoveFileSpec(nppPath); + strcpy(_nppPath, nppPath); + + // Make localConf.xml path + char localConfPath[MAX_PATH]; + strcpy(localConfPath, _nppPath); + PathAppend(localConfPath, localConfFile); + + // Test if localConf.xml exist + bool isLocal = (PathFileExists(localConfPath) == TRUE); + + if (isLocal) + { + strcpy(userPath, _nppPath); + } + else + { + ITEMIDLIST *pidl; + SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); + SHGetPathFromIDList(pidl, userPath); + + PathAppend(userPath, "Notepad++"); + + strcpy(_appdataNppDir, userPath); + + if (!PathFileExists(userPath)) + { + ::CreateDirectory(userPath, NULL); + } + } + + //-------------------------------------// + // Transparent function for w2k and xp // + //-------------------------------------// + _hUser32 = ::GetModuleHandle("User32"); + if (_hUser32) + _transparentFuncAddr = (WNDPROC)::GetProcAddress(_hUser32, "SetLayeredWindowAttributes"); + + //---------------------------------------------// + // Dlg theme texture function for xp and vista // + //---------------------------------------------// + _hUXTheme = ::LoadLibrary("uxtheme.dll"); + if (_hUXTheme) + _enableThemeDialogTextureFuncAddr = (WNDPROC)::GetProcAddress(_hUXTheme, "EnableThemeDialogTexture"); + + //---------------------------------------// + // langs.xml : for every user statically // + //---------------------------------------// + char langs_xml_path[MAX_PATH]; + strcpy(langs_xml_path, nppPath); + + PathAppend(langs_xml_path, "langs.xml"); + + _pXmlDoc = new TiXmlDocument(langs_xml_path); + bool loadOkay = _pXmlDoc->LoadFile(); + if (!loadOkay) + { + ::MessageBox(NULL, "Load langs.xml failed!", "Configurator",MB_OK); + delete _pXmlDoc; + _pXmlDoc = NULL; + isAllLaoded = false; + } + else + getLangKeywordsFromXmlTree(); + + //---------------------------// + // config.xml : for per user // + //---------------------------// + char configPath[MAX_PATH]; + strcpy(configPath, userPath); + PathAppend(configPath, "config.xml"); + + if (!PathFileExists(configPath)) + { + char srcConfigPath[MAX_PATH]; + strcpy(srcConfigPath, nppPath); + PathAppend(srcConfigPath, "config.xml"); + + ::CopyFile(srcConfigPath, configPath, TRUE); + } + + _pXmlUserDoc = new TiXmlDocument(configPath); + loadOkay = _pXmlUserDoc->LoadFile(); + if (!loadOkay) + { + ::MessageBox(NULL, "Load config.xml failed!", "Configurator",MB_OK); + delete _pXmlUserDoc; + _pXmlUserDoc = NULL; + isAllLaoded = false; + } + else + getUserParametersFromXmlTree(); + + //----------------------------// + // stylers.xml : for per user // + //----------------------------// + char stylerPath[MAX_PATH]; + strcpy(stylerPath, userPath); + PathAppend(stylerPath, "stylers.xml"); + + if (!PathFileExists(stylerPath)) + { + char srcStylersPath[MAX_PATH]; + strcpy(srcStylersPath, nppPath); + PathAppend(srcStylersPath, "stylers.xml"); + + ::CopyFile(srcStylersPath, stylerPath, TRUE); + } + + _pXmlUserStylerDoc = new TiXmlDocument(stylerPath); + loadOkay = _pXmlUserStylerDoc->LoadFile(); + if (!loadOkay) + { + ::MessageBox(NULL, "Load stylers.xml failed!", "Configurator",MB_OK); + delete _pXmlUserStylerDoc; + _pXmlUserStylerDoc = NULL; + isAllLaoded = false; + } + else + getUserStylersFromXmlTree(); + + //-----------------------------------// + // userDefineLang.xml : for per user // + //-----------------------------------// + strcpy(_userDefineLangPath, userPath); + PathAppend(_userDefineLangPath, "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. // + //----------------------------------------------// + char nativeLangPath[MAX_PATH]; + strcpy(nativeLangPath, userPath); + PathAppend(nativeLangPath, "nativeLang.xml"); + + if (!PathFileExists(nativeLangPath)) + { + strcpy(nativeLangPath, nppPath); + PathAppend(nativeLangPath, "nativeLang.xml"); + } + + _pXmlNativeLangDoc = new TiXmlDocument(nativeLangPath); + loadOkay = _pXmlNativeLangDoc->LoadFile(); + if (!loadOkay) + { + delete _pXmlNativeLangDoc; + _pXmlNativeLangDoc = NULL; + isAllLaoded = false; + } + + //---------------------------------// + // toolbarIcons.xml : for per user // + //---------------------------------// + char toolbarIconsPath[MAX_PATH]; + strcpy(toolbarIconsPath, userPath); + PathAppend(toolbarIconsPath, "toolbarIcons.xml"); + + _pXmlToolIconsDoc = new TiXmlDocument(toolbarIconsPath); + loadOkay = _pXmlToolIconsDoc->LoadFile(); + if (!loadOkay) + { + delete _pXmlToolIconsDoc; + _pXmlToolIconsDoc = NULL; + isAllLaoded = false; + } + + //------------------------------// + // shortcuts.xml : for per user // + //------------------------------// + strcpy(_shortcutsPath, userPath); + PathAppend(_shortcutsPath, "shortcuts.xml"); + + if (!PathFileExists(_shortcutsPath)) + { + char srcShortcutsPath[MAX_PATH]; + strcpy(srcShortcutsPath, nppPath); + PathAppend(srcShortcutsPath, "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(); + getPluginCmdsFromXmlTree(); + + // fill out _scintillaModifiedKeys : + // those user defined Scintilla key will be used remap Scintilla Key Array + getScintKeysFromXmlTree(); + + // initialize entire Scintilla Key Array + initScintillaKeys(); + } + + //---------------------------------// + // contextMenu.xml : for per user // + //---------------------------------// + strcpy(_contextMenuPath, userPath); + PathAppend(_contextMenuPath, "contextMenu.xml"); + + if (!PathFileExists(_contextMenuPath)) + { + char srcContextMenuPath[MAX_PATH]; + strcpy(srcContextMenuPath, nppPath); + PathAppend(srcContextMenuPath, "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 // + //----------------------------// + strcpy(_sessionPath, userPath); + PathAppend(_sessionPath, "session.xml"); + + _pXmlSessionDoc = new TiXmlDocument(_sessionPath); + loadOkay = _pXmlSessionDoc->LoadFile(); + if (!loadOkay) + isAllLaoded = false; + else + getSessionFromXmlTree(); + + delete _pXmlSessionDoc; + _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 (_pXmlNativeLangDoc) + delete _pXmlNativeLangDoc; + + if (_pXmlToolIconsDoc) + delete _pXmlToolIconsDoc; + + if (_pXmlShortcutDoc) + delete _pXmlShortcutDoc; + + if (_pXmlContextMenuDoc) + delete _pXmlContextMenuDoc; + + if (_pXmlSessionDoc) + delete _pXmlSessionDoc; + + delete _pSelf; +} + +void NppParameters::setFontList(HWND hWnd) +{ + ::AddFontResource(LINEDRAW_FONT); + + //---------------// + // Sys font list // + //---------------// + + LOGFONT lf; + _fontlist.push_back(""); + + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfFaceName[0]='\0'; + HDC hDC = ::GetDC(hWnd); + ::EnumFontFamiliesEx(hDC, + &lf, + (FONTENUMPROC) EnumFontFamExProc, + (LPARAM) &_fontlist, 0); +} + +void NppParameters::getLangKeywordsFromXmlTree() +{ + TiXmlNode *root = _pXmlDoc->FirstChild("NotepadPlus"); + if (!root) return; + feedKeyWordsParameters(root); +} + +bool NppParameters::getUserStylersFromXmlTree() +{ + TiXmlNode *root = _pXmlUserStylerDoc->FirstChild("NotepadPlus"); + if (!root) return false; + return feedStylerArray(root); +} + +bool NppParameters::getUserParametersFromXmlTree() +{ + if (!_pXmlUserDoc) + return false; + + TiXmlNode *root = _pXmlUserDoc->FirstChild("NotepadPlus"); + if (!root) return false; + + // GUI + feedGUIParameters(root); + + //History + feedFileListParameters(root); + + // Raser tout + TiXmlNode *node = root->FirstChildElement("History"); + root->RemoveChild(node); + + // Repartir de zero + TiXmlElement HistoryNode("History"); + + root->InsertEndChild(HistoryNode); + return true; +} + +bool NppParameters::getUserDefineLangsFromXmlTree() +{ + if (!_pXmlUserLangDoc) + return false; + + TiXmlNode *root = _pXmlUserLangDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedUserLang(root); + return true; +} + +bool NppParameters::getShortcutsFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedShortcut(root); + return true; +} + +bool NppParameters::getMacrosFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedMacros(root); + return true; +} + +bool NppParameters::getUserCmdsFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedUserCmds(root); + return true; +} + + +bool NppParameters::getPluginCmdsFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedPluginCustomizedCmds(root); + return true; +} + + +bool NppParameters::getScintKeysFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + feedScintKeys(root); + return true; +} + +void NppParameters::initScintillaKeys() +{ + // Cut/Copy/Paste + _scintillaKeyCommands.push_back(ScintillaKeyMap("CUT", IDSCINTILLA_KEY_CUT, SCI_CUT, true, false, false, 0x58/*VK_X*/, IDM_EDIT_CUT)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("COPY", IDSCINTILLA_KEY_COPY, SCI_COPY, true, false, false, 0x43/*VK_C*/, IDM_EDIT_COPY)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("PASTE", IDSCINTILLA_KEY_PASTE, SCI_PASTE, true, false, false, 0x56/*VK_V*/, IDM_EDIT_PASTE)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("DEL", IDSCINTILLA_KEY_DEL, SCI_CLEAR, false, false, false, VK_DELETE, IDM_EDIT_DELETE)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("SELECT ALL", IDSCINTILLA_KEY_SELECTALL, SCI_SELECTALL, true, false, false, 0x41/*VK_A*/, IDM_EDIT_SELECTALL)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("OUTDENT", IDSCINTILLA_KEY_OUTDENT, SCI_BACKTAB, false, false, true, VK_TAB, IDM_EDIT_RMV_TAB)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("UNDO", IDSCINTILLA_KEY_UNDO, SCI_UNDO, true, false, false, 0x5A/*VK_Z*/, IDM_EDIT_UNDO)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("REDO", IDSCINTILLA_KEY_REDO, SCI_REDO, true, false, false, 0x59/*VK_Y*/, IDM_EDIT_REDO)); + + // Line operation + _scintillaKeyCommands.push_back(ScintillaKeyMap("DUPLICATE LINE", IDSCINTILLA_KEY_LINE_DUP, SCI_LINEDUPLICATE, true, false, false, 0x44/*VK_D*/, IDM_EDIT_DUP_LINE)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("CUT LINE", IDSCINTILLA_KEY_LINE_CUT, SCI_LINECUT, true, false, false, 0x4C/*VK_L*/)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("DELETE LINE", IDSCINTILLA_KEY_LINE_DEL, SCI_LINEDELETE, true, false, true, 0x4C/*VK_L*/)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("TRANSPOSE LINE", IDSCINTILLA_KEY_LINE_TRANS, SCI_LINETRANSPOSE, true, false, false, 0x54/*VK_T*/)); + _scintillaKeyCommands.push_back(ScintillaKeyMap("COPY LINE", IDSCINTILLA_KEY_LINE_COPY, SCI_LINECOPY, true, false, true, 0x54/*VK_T*/)); + //SCI_DELETEBACK + //SCI_DELETEBACKNOTLINE + + //SCI_DELWORDLEFT + //SCI_DELWORDRIGHT + //SCI_DELLINELEFT + //SCI_DELLINERIGHT +} + +bool NppParameters::getContextMenuFromXmlTree() +{ + if (!_pXmlContextMenuDoc) + return false; + + TiXmlNode *root = _pXmlContextMenuDoc->FirstChild("NotepadPlus"); + if (!root) + return false; + + TiXmlNode *contextMenuRoot = root->FirstChildElement("ScintillaContextMenu"); + if (contextMenuRoot) + { + for (TiXmlNode *childNode = contextMenuRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + int id; + const char *idStr = (childNode->ToElement())->Attribute("id", &id); + if (idStr) + { + _contextMenuItems.push_back(MenuItemUnit(id, "")); + } + } + } + + return true; +} + +bool NppParameters::loadSession(Session & session, const char *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("NotepadPlus"); + if (!root) + return false; + + TiXmlNode *sessionRoot = root->FirstChildElement("Session"); + if (!sessionRoot) + return false; + + + TiXmlElement *actIndex = sessionRoot->ToElement(); + size_t index; + const char *str = actIndex->Attribute("actifIndex", (int *)&index); + if (str) + { + (*ptrSession)._actifIndex = index; + } + for (TiXmlNode *childNode = sessionRoot->FirstChildElement("File"); + childNode ; + childNode = childNode->NextSibling("File") ) + { + TiXmlNode *fnNode = childNode->FirstChild(); + const char *fileName = fnNode->Value(); + Position position; + (childNode->ToElement())->Attribute("firstVisibleLine", &position._firstVisibleLine); + (childNode->ToElement())->Attribute("xOffset", &position._xOffset); + (childNode->ToElement())->Attribute("startPos", &position._startPos); + (childNode->ToElement())->Attribute("endPos", &position._endPos); + + sessionFileInfo sfi(fileName, position); + + for (TiXmlNode *markNode = fnNode->NextSibling("Mark"); + markNode ; + markNode = markNode->NextSibling("Mark") ) + { + int lineNumber; + const char *lineNumberStr = (markNode->ToElement())->Attribute("line", &lineNumber); + if (lineNumberStr) + { + sfi.marks.push_back(lineNumber); + //::MessageBox(NULL, "coucou", "", MB_OK); + } + } + + if (fileName) + (*ptrSession)._files.push_back(sfi); + } + + return true; +} +void NppParameters::feedFileListParameters(TiXmlNode *node) +{ + _nbMaxFile = 10; + + TiXmlNode *historyRoot = node->FirstChildElement("History"); + if (!historyRoot) return; + + (historyRoot->ToElement())->Attribute("nbMaxFile", &_nbMaxFile); + if ((_nbMaxFile < 0) || (_nbMaxFile > 30)) + return; + + for (TiXmlNode *childNode = historyRoot->FirstChildElement("File"); + childNode && (_nbFile < NB_MAX_LRF_FILE); + childNode = childNode->NextSibling("File") ) + { + _LRFileList[_nbFile] = new string((childNode->FirstChild())->Value()); + _nbFile++; + } +} + +void NppParameters::feedShortcut(TiXmlNode *node) +{ + TiXmlNode *shortcutsRoot = node->FirstChildElement("InternalCommands"); + if (!shortcutsRoot) return; + + for (TiXmlNode *childNode = shortcutsRoot->FirstChildElement("Shortcut"); + childNode ; + childNode = childNode->NextSibling("Shortcut") ) + { + int id; + const char *idStr = (childNode->ToElement())->Attribute("id", &id); + if (idStr) + { + Shortcut sc; + if (getShortcuts(childNode, sc) && sc.isValid()) + { + _shortcuts.push_back(CommandShortcut(id, sc)); + } + } + } +} + +void NppParameters::feedMacros(TiXmlNode *node) +{ + TiXmlNode *macrosRoot = node->FirstChildElement("Macros"); + if (!macrosRoot) return; + + for (TiXmlNode *childNode = macrosRoot->FirstChildElement("Macro"); + childNode ; + childNode = childNode->NextSibling("Macro") ) + { + Shortcut sc; + if (getShortcuts(childNode, sc) && sc.isValid()) + { + MacroShortcut ms(sc); + getActions(childNode, ms); + if (ms.isValid()) + _macros.push_back(ms); + } + } +} + + +void NppParameters::getActions(TiXmlNode *node, MacroShortcut & macroShortcut) +{ + for (TiXmlNode *childNode = node->FirstChildElement("Action"); + childNode ; + childNode = childNode->NextSibling("Action") ) + { + int type; + const char *typeStr = (childNode->ToElement())->Attribute("type", &type); + if ((!typeStr) || (type > 2)) + continue; + + int msg = 0; + const char *msgStr = (childNode->ToElement())->Attribute("message", &msg); + + int wParam = 0; + const char *wParamStr = (childNode->ToElement())->Attribute("wParam", &wParam); + + int lParam = 0; + const char *lParamStr = (childNode->ToElement())->Attribute("lParam", &lParam); + + const char *sParam = (childNode->ToElement())->Attribute("sParam"); + if (!sParam) + sParam = ""; + recordedMacroStep step(type, msg, wParam, lParam, sParam); + if (step.isValid()) + (macroShortcut.getMacro()).push_back(step); + + } +} + +void NppParameters::feedUserCmds(TiXmlNode *node) +{ + TiXmlNode *userCmdsRoot = node->FirstChildElement("UserDefinedCommands"); + if (!userCmdsRoot) return; + + for (TiXmlNode *childNode = userCmdsRoot->FirstChildElement("Command"); + childNode ; + childNode = childNode->NextSibling("Command") ) + { + Shortcut sc; + if (getShortcuts(childNode, sc) && sc.isValid()) + { + UserCommand uc(sc); + uc._cmd = (childNode->FirstChild())->Value(); + if (uc.isValid()) + _userCommands.push_back(uc); + } + } +} + +void NppParameters::feedPluginCustomizedCmds(TiXmlNode *node) +{ + TiXmlNode *pluginCustomizedCmdsRoot = node->FirstChildElement("PluginCommands"); + if (!pluginCustomizedCmdsRoot) return; + + for (TiXmlNode *childNode = pluginCustomizedCmdsRoot->FirstChildElement("PluginCommand"); + childNode ; + childNode = childNode->NextSibling("PluginCommand") ) + { + Shortcut sc; + if (getShortcuts(childNode, sc) && sc.isValid()) + { + const char *moduleName = (childNode->ToElement())->Attribute("moduleName"); + if (!moduleName) + moduleName = ""; + + int internalID = -1; + const char *internalIDStr = (childNode->ToElement())->Attribute("internalID", &internalID); + + PluginCmdShortcut pcs(sc, -1, moduleName, internalID); + if (pcs.isValid()) + _pluginCustomizedCmds.push_back(pcs); + } + } +} + +void NppParameters::feedScintKeys(TiXmlNode *node) +{ + TiXmlNode *scintKeysRoot = node->FirstChildElement("ScintillaKeys"); + if (!scintKeysRoot) return; + + for (TiXmlNode *childNode = scintKeysRoot->FirstChildElement("ScintKey"); + childNode ; + childNode = childNode->NextSibling("ScintKey") ) + { + int id; + const char *idStr = (childNode->ToElement())->Attribute("id", &id); + if (idStr) + { + ScintillaKeyMap skmm(id); + if (getScintKey(childNode, skmm) && skmm.isValid()) + { + _scintillaModifiedKeys.push_back(skmm); + } + } + } +} + +bool NppParameters::getShortcuts(TiXmlNode *node, Shortcut & sc) +{ + if (!node) return false; + + const char *name = (node->ToElement())->Attribute("name"); + if (!name) + name = ""; + + bool isCtrl = false; + const char *isCtrlStr = (node->ToElement())->Attribute("Ctrl"); + if (isCtrlStr) + isCtrl = !strcmp("yes", isCtrlStr); + + bool isAlt = false; + const char *isAltStr = (node->ToElement())->Attribute("Alt"); + if (isAltStr) + isAlt = !strcmp("yes", isAltStr); + + bool isShift = false; + const char *isShiftStr = (node->ToElement())->Attribute("Shift"); + if (isShiftStr) + isShift = !strcmp("yes", isShiftStr); + + int key; + const char *keyStr = (node->ToElement())->Attribute("Key", &key); + if (!keyStr) + return false; + + strcpy(sc._name, name); + sc._isCtrl = isCtrl; + sc._isAlt = isAlt; + sc._isShift = isShift; + sc._key = (unsigned char)key; + return true; +} + +bool NppParameters::getScintKey(TiXmlNode *node, ScintillaKeyMap & skm) +{ + if (getShortcuts(node, skm)) + { + int scintKey; + const char *keyStr = (node->ToElement())->Attribute("ScintID", &scintKey); + if (!keyStr) + return false; + + int menuID; + keyStr = (node->ToElement())->Attribute("menuCmdID", &menuID); + if (!keyStr) + return false; + skm.setScintKey(scintKey); + skm.setMenuID(menuID); + return true; + } + return false; +} + +const int loadFailed = 100; +const int missingName = 101; +void NppParameters::feedUserLang(TiXmlNode *node) +{ + for (TiXmlNode *childNode = node->FirstChildElement("UserLang"); + childNode && (_nbUserLang < NB_MAX_USER_LANG); + childNode = childNode->NextSibling("UserLang") ) + { + const char *name = (childNode->ToElement())->Attribute("name"); + const char *ext = (childNode->ToElement())->Attribute("ext"); + try { + if (!name || !name[0] || !ext) throw int(missingName); + + _userLangArray[_nbUserLang] = new UserLangContainer(name, ext); + _nbUserLang++; + + TiXmlNode *settingsRoot = childNode->FirstChildElement("Settings"); + if (!settingsRoot) throw int(loadFailed); + feedUserSettings(settingsRoot); + + TiXmlNode *keywordListsRoot = childNode->FirstChildElement("KeywordLists"); + if (!keywordListsRoot) throw int(loadFailed); + feedUserKeywordList(keywordListsRoot); + + TiXmlNode *stylesRoot = childNode->FirstChildElement("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 char * which will be destroyed + stylerStrOp(DUP); + + TiXmlNode *root = _pXmlUserLangDoc->FirstChild("NotepadPlus"); + if (root) + { + _pXmlUserLangDoc->RemoveChild(root); + } + + _pXmlUserLangDoc->InsertEndChild(TiXmlElement("NotepadPlus")); + + root = _pXmlUserLangDoc->FirstChild("NotepadPlus"); + + for (int i = 0 ; i < _nbUserLang ; i++) + { + insertUserLang2Tree(root, _userLangArray[i]); + } + _pXmlUserLangDoc->SaveFile(); + stylerStrOp(FREE); +} + +void NppParameters::insertCmd(TiXmlNode *shortcutsRoot, const CommandShortcut & cmd) +{ + TiXmlNode *sc = shortcutsRoot->InsertEndChild(TiXmlElement("Shortcut")); + sc->ToElement()->SetAttribute("name", cmd._name); + sc->ToElement()->SetAttribute("id", cmd.getID()); + sc->ToElement()->SetAttribute("Ctrl", cmd._isCtrl?"yes":"no"); + sc->ToElement()->SetAttribute("Alt", cmd._isAlt?"yes":"no"); + sc->ToElement()->SetAttribute("Shift", cmd._isShift?"yes":"no"); + sc->ToElement()->SetAttribute("Key", cmd._key); +} + +void NppParameters::insertMacro(TiXmlNode *macrosRoot, const MacroShortcut & macro) +{ + TiXmlNode *macroRoot = macrosRoot->InsertEndChild(TiXmlElement("Macro")); + + macroRoot->ToElement()->SetAttribute("name", macro._name); + macroRoot->ToElement()->SetAttribute("Ctrl", macro._isCtrl?"yes":"no"); + macroRoot->ToElement()->SetAttribute("Alt", macro._isAlt?"yes":"no"); + macroRoot->ToElement()->SetAttribute("Shift", macro._isShift?"yes":"no"); + macroRoot->ToElement()->SetAttribute("Key", macro._key); + for (size_t i = 0 ; i < macro._macro.size() ; i++) + { + TiXmlNode *actionNode = macroRoot->InsertEndChild(TiXmlElement("Action")); + const recordedMacroStep & action = macro._macro[i]; + actionNode->ToElement()->SetAttribute("type", action.MacroType); + actionNode->ToElement()->SetAttribute("message", action.message); + actionNode->ToElement()->SetAttribute("wParam", action.wParameter); + actionNode->ToElement()->SetAttribute("lParam", action.lParameter); + actionNode->ToElement()->SetAttribute("sParam", action.sParameter.c_str()); + } +} + +void NppParameters::insertUserCmd(TiXmlNode *userCmdRoot, const UserCommand & userCmd) +{ + TiXmlNode *cmdRoot = userCmdRoot->InsertEndChild(TiXmlElement("Command")); + cmdRoot->ToElement()->SetAttribute("name", userCmd._name); + cmdRoot->ToElement()->SetAttribute("Ctrl", userCmd._isCtrl?"yes":"no"); + cmdRoot->ToElement()->SetAttribute("Alt", userCmd._isAlt?"yes":"no"); + cmdRoot->ToElement()->SetAttribute("Shift", userCmd._isShift?"yes":"no"); + cmdRoot->ToElement()->SetAttribute("Key", userCmd._key); + cmdRoot->InsertEndChild(TiXmlText(userCmd._cmd.c_str())); +} + +void NppParameters::insertPluginCmd(TiXmlNode *pluginCmdRoot, const PluginCmdShortcut & pluginCmd) +{ + TiXmlNode *pluginCmdNode = pluginCmdRoot->InsertEndChild(TiXmlElement("PluginCommand")); + pluginCmdNode->ToElement()->SetAttribute("moduleName", pluginCmd._moduleName); + pluginCmdNode->ToElement()->SetAttribute("internalID", pluginCmd._internalID); + pluginCmdNode->ToElement()->SetAttribute("Ctrl", pluginCmd._isCtrl?"yes":"no"); + pluginCmdNode->ToElement()->SetAttribute("Alt", pluginCmd._isAlt?"yes":"no"); + pluginCmdNode->ToElement()->SetAttribute("Shift", pluginCmd._isShift?"yes":"no"); + pluginCmdNode->ToElement()->SetAttribute("Key", pluginCmd._key); +} + +void NppParameters::insertScintKey(TiXmlNode *scintKeyRoot, const ScintillaKeyMap & scintKeyMap) +{ + TiXmlNode *keyRoot = scintKeyRoot->InsertEndChild(TiXmlElement("ScintKey")); + + keyRoot->ToElement()->SetAttribute("name", scintKeyMap._name); + keyRoot->ToElement()->SetAttribute("id", scintKeyMap.getID()); + keyRoot->ToElement()->SetAttribute("Ctrl", scintKeyMap._isCtrl?"yes":"no"); + keyRoot->ToElement()->SetAttribute("Alt", scintKeyMap._isAlt?"yes":"no"); + keyRoot->ToElement()->SetAttribute("Shift", scintKeyMap._isShift?"yes":"no"); + keyRoot->ToElement()->SetAttribute("Key", scintKeyMap._key); + keyRoot->ToElement()->SetAttribute("ScintID", scintKeyMap.getScintillaKey()); + keyRoot->ToElement()->SetAttribute("menuCmdID", scintKeyMap.getMenuCmdID()); +} + +void NppParameters::writeSession(const Session & session, const char *fileName) +{ + const char *pathName = fileName?fileName:_sessionPath; + + _pXmlSessionDoc = new TiXmlDocument(pathName); + TiXmlNode *root = _pXmlSessionDoc->InsertEndChild(TiXmlElement("NotepadPlus")); + + if (root) + { + TiXmlNode *sessionNode = root->InsertEndChild(TiXmlElement("Session")); + (sessionNode->ToElement())->SetAttribute("actifIndex", (int)session._actifIndex); + for (size_t i = 0 ; i < session._files.size() ; i++) + { + TiXmlNode *fileNameNode = sessionNode->InsertEndChild(TiXmlElement("File")); + + (fileNameNode->ToElement())->SetAttribute("firstVisibleLine", session._files[i]._firstVisibleLine); + (fileNameNode->ToElement())->SetAttribute("xOffset", session._files[i]._xOffset); + (fileNameNode->ToElement())->SetAttribute("startPos", session._files[i]._startPos); + (fileNameNode->ToElement())->SetAttribute("endPos", session._files[i]._endPos); + + TiXmlText fileNameFullPath(session._files[i]._fileName.c_str()); + fileNameNode->InsertEndChild(fileNameFullPath); + for (size_t j = 0 ; j < session._files[i].marks.size() ; j++) + { + size_t markLine = session._files[i].marks[j]; + TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement("Mark")); + markNode->ToElement()->SetAttribute("line", markLine); + } + } + } + _pXmlSessionDoc->SaveFile(); + +} + +void NppParameters::writeShortcuts(bool rewriteCmdSc, bool rewriteMacrosSc, bool rewriteUserCmdSc, bool rewriteScintillaKey, bool rewritePluginCmdSc) +{ + if (!_pXmlShortcutDoc) + { + //do the treatment + _pXmlShortcutDoc = new TiXmlDocument(_shortcutsPath); + } + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + if (!root) + { + root = _pXmlShortcutDoc->InsertEndChild(TiXmlElement("NotepadPlus")); + //root = _pXmlShortcutDoc->FirstChild("NotepadPlus"); + } + + if (rewriteCmdSc) + { + TiXmlNode *cmdRoot = root->FirstChild("InternalCommands"); + if (cmdRoot) + root->RemoveChild(cmdRoot); + + cmdRoot = root->InsertEndChild(TiXmlElement("InternalCommands")); + + for (size_t i = 0 ; i < _shortcuts.size() ; i++) + { + insertCmd(cmdRoot, _shortcuts[i]); + } + } + + if (rewriteMacrosSc) + { + TiXmlNode *macrosRoot = root->FirstChild("Macros"); + if (macrosRoot) + root->RemoveChild(macrosRoot); + + macrosRoot = root->InsertEndChild(TiXmlElement("Macros")); + + for (size_t i = 0 ; i < _macros.size() ; i++) + { + insertMacro(macrosRoot, _macros[i]); + } + } + + if (rewriteUserCmdSc) + { + TiXmlNode *userCmdRoot = root->FirstChild("UserDefinedCommands"); + if (userCmdRoot) + root->RemoveChild(userCmdRoot); + + userCmdRoot = root->InsertEndChild(TiXmlElement("UserDefinedCommands")); + + for (size_t i = 0 ; i < _userCommands.size() ; i++) + { + insertUserCmd(userCmdRoot, _userCommands[i]); + } + } + + if (rewriteScintillaKey) + { + TiXmlNode *scitillaKeyRoot = root->FirstChild("ScintillaKeys"); + if (scitillaKeyRoot) + root->RemoveChild(scitillaKeyRoot); + + scitillaKeyRoot = root->InsertEndChild(TiXmlElement("ScintillaKeys")); + for (size_t i = 0 ; i < _scintillaModifiedKeys.size() ; i++) + { + insertScintKey(scitillaKeyRoot, _scintillaModifiedKeys[i]); + } + } + + if (rewritePluginCmdSc) + { + TiXmlNode *pluginCmdRoot = root->FirstChild("PluginCommands"); + if (pluginCmdRoot) + root->RemoveChild(pluginCmdRoot); + + pluginCmdRoot = root->InsertEndChild(TiXmlElement("PluginCommands")); + for (size_t i = 0 ; i < _pluginCustomizedCmds.size() ; i++) + { + insertPluginCmd(pluginCmdRoot, _pluginCustomizedCmds[i]); + } + } + if (rewriteCmdSc || rewriteMacrosSc || rewriteUserCmdSc || rewriteScintillaKey || rewritePluginCmdSc) + _pXmlShortcutDoc->SaveFile(); +} + +int NppParameters::addUserLangToEnd(const UserLangContainer & userLang, const char *newName) +{ + if (isExistingUserLangName(newName)) + return -1; + _userLangArray[_nbUserLang] = new UserLangContainer(); + *(_userLangArray[_nbUserLang]) = userLang; + strcpy(_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 char *name) +{ + if (!name) return -1; + if (!strcmp(name, "Folder+")) return 1; + else if (!strcmp(name, "Folder-")) return 2; + else if (!strcmp(name, "Operators"))return 3; + else if (!strcmp(name, "Comment")) return 4; + else if (!strcmp(name, "Words1")) return 5; + else if (!strcmp(name, "Words2")) return 6; + else if (!strcmp(name, "Words3")) return 7; + else if (!strcmp(name, "Words4")) return 8; + else if (!strcmp(name, "Delimiters")) return 0; + else return -1; +} +void NppParameters::feedUserSettings(TiXmlNode *settingsRoot) +{ + const char *boolStr; + TiXmlNode *globalSettingNode = settingsRoot->FirstChildElement("Global"); + if (globalSettingNode) + { + boolStr = (globalSettingNode->ToElement())->Attribute("caseIgnored"); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isCaseIgnored = !strcmp("yes", boolStr); + } + TiXmlNode *treatAsSymbolNode = settingsRoot->FirstChildElement("TreatAsSymbol"); + if (treatAsSymbolNode) + { + boolStr = (treatAsSymbolNode->ToElement())->Attribute("comment"); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isCommentSymbol = !strcmp("yes", boolStr); + + boolStr = (treatAsSymbolNode->ToElement())->Attribute("commentLine"); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isCommentLineSymbol = !strcmp("yes", boolStr); + } + TiXmlNode *prefixNode = settingsRoot->FirstChildElement("Prefix"); + if (prefixNode) + { + char names[nbPrefixListAllowed][7] = {"words1","words2","words3","words4"}; + for (int i = 0 ; i < nbPrefixListAllowed ; i++) + { + boolStr = (prefixNode->ToElement())->Attribute(names[i]); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isPrefix[i] = !strcmp("yes", boolStr); + } + } +} + +void NppParameters::feedUserKeywordList(TiXmlNode *node) +{ + for (TiXmlNode *childNode = node->FirstChildElement("Keywords"); + childNode ; + childNode = childNode->NextSibling("Keywords")) + { + const char *keywordsName = (childNode->ToElement())->Attribute("name"); + int i = getIndexFromKeywordListName(keywordsName); + if (i != -1) + { + TiXmlNode *valueNode = childNode->FirstChild(); + const char *kwl = (valueNode)?valueNode->Value():(strcmp(keywordsName, "Delimiters")?"":"000000"); + strcpy(_userLangArray[_nbUserLang - 1]->_keywordLists[i], kwl); + } + } +} + +void NppParameters::feedUserStyles(TiXmlNode *node) +{ + for (TiXmlNode *childNode = node->FirstChildElement("WordsStyle"); + childNode ; + childNode = childNode->NextSibling("WordsStyle")) + { + int id; + const char *styleIDStr = (childNode->ToElement())->Attribute("styleID", &id); + if (styleIDStr) + { + _userLangArray[_nbUserLang - 1]->_styleArray.addStyler(id, childNode); + } + } +} + +bool NppParameters::feedStylerArray(TiXmlNode *node) +{ + TiXmlNode *styleRoot = node->FirstChildElement("LexerStyles"); + if (!styleRoot) return false; + + // For each lexer + for (TiXmlNode *childNode = styleRoot->FirstChildElement("LexerType"); + childNode ; + childNode = childNode->NextSibling("LexerType") ) + { + if (!_lexerStylerArray.hasEnoughSpace()) return false; + + TiXmlElement *element = childNode->ToElement(); + const char *lexerName = element->Attribute("name"); + const char *lexerDesc = element->Attribute("desc"); + const char *lexerUserExt = element->Attribute("ext"); + if (lexerName) + { + _lexerStylerArray.addLexerStyler(lexerName, lexerDesc, lexerUserExt, childNode); + } + } + + // The global styles for all lexers + TiXmlNode *globalStyleRoot = node->FirstChildElement("GlobalStyles"); + if (!globalStyleRoot) return false; + + for (TiXmlNode *childNode = globalStyleRoot->FirstChildElement("WidgetStyle"); + childNode ; + childNode = childNode->NextSibling("WidgetStyle") ) + { + if (!_widgetStyleArray.hasEnoughSpace()) return false; + + TiXmlElement *element = childNode->ToElement(); + const char *styleIDStr = element->Attribute("styleID"); + + int styleID = -1; + if ((styleID = decStrVal(styleIDStr)) != -1) + { + _widgetStyleArray.addStyler(styleID, childNode); + } + } + return true; +} + +void LexerStylerArray::addLexerStyler(const char *lexerName, const char *lexerDesc, const char *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("WordsStyle"); + childNode ; + childNode = childNode->NextSibling("WordsStyle") ) + { + + if (!ls.hasEnoughSpace()) return; + + TiXmlElement *element = childNode->ToElement(); + const char *styleIDStr = element->Attribute("styleID"); + + if (styleIDStr) + { + int styleID = -1; + if ((styleID = decStrVal(styleIDStr)) != -1) + { + ls.addStyler(styleID, childNode); + } + } + } +} + +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 char *str = element->Attribute("name"); + if (str) + { + _styleArray[_nbStyler]._styleDesc = str; + } + + str = element->Attribute("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("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("fontName"); + _styleArray[_nbStyler]._fontName = str; + + str = element->Attribute("fontStyle"); + if (str) + { + _styleArray[_nbStyler]._fontStyle = decStrVal(str); + } + + str = element->Attribute("fontSize"); + if (str) + { + _styleArray[_nbStyler]._fontSize = decStrVal(str); + } + + str = element->Attribute("keywordClass"); + if (str) + { + _styleArray[_nbStyler]._keywordClass = getKwClassFromName(str); + } + + TiXmlNode *v = styleNode->FirstChild(); + if (v) + { + //const char *keyWords = v->Value(); + //if (keyWords) + _styleArray[_nbStyler]._keywords = new string(v->Value()); + } + } + _nbStyler++; +} + +void NppParameters::writeHistory(const char *fullpath) +{ + TiXmlNode *historyNode = (_pXmlUserDoc->FirstChild("NotepadPlus"))->FirstChildElement("History"); + TiXmlElement recentFileNode("File"); + TiXmlText fileNameFullPath(fullpath); + recentFileNode.InsertEndChild(fileNameFullPath); + + (historyNode->ToElement())->InsertEndChild(recentFileNode); +} + +TiXmlNode * NppParameters::getChildElementByAttribut(TiXmlNode *pere, const char *childName,\ + const char *attributName, const char *attributVal) const +{ + for (TiXmlNode *childNode = pere->FirstChildElement(childName); + childNode ; + childNode = childNode->NextSibling(childName)) + { + TiXmlElement *element = childNode->ToElement(); + const char *val = element->Attribute(attributName); + if (val) + { + if (!strcmp(val, attributVal)) + return childNode; + } + } + return NULL; +} + +// 2 restes : L_H, L_USER +LangType NppParameters::getLangIDFromStr(const char *langName) +{ + if (!strcmp("c", langName)) return L_C; + if (!strcmp("cpp", langName)) return L_CPP; + if (!strcmp("java", langName)) return L_JAVA; + if (!strcmp("cs", langName)) return L_CS; + if (!strcmp("objc", langName)) return L_OBJC; + if (!strcmp("rc", langName)) return L_RC; + if (!strcmp("html", langName)) return L_HTML; + if (!strcmp("javascript", langName)) return L_JS; + if (!strcmp("php", langName)) return L_PHP; + if (!strcmp("vb", langName)) return L_VB; + if (!strcmp("sql", langName)) return L_SQL; + if (!strcmp("xml", langName)) return L_XML; + if (!strcmp("asp", langName)) return L_ASP; + if (!strcmp("perl", langName)) return L_PERL; + if (!strcmp("pascal", langName)) return L_PASCAL; + if (!strcmp("python", langName)) return L_PYTHON; + if (!strcmp("css", langName)) return L_CSS; + if (!strcmp("lua", langName)) return L_LUA; + if (!strcmp("batch", langName)) return L_BATCH; + if (!strcmp("ini", langName)) return L_INI; + if (!strcmp("nfo", langName)) return L_NFO; + if (!strcmp("makefile", langName)) return L_MAKEFILE; + if (!strcmp("tex", langName)) return L_TEX; + if (!strcmp("fortran", langName)) return L_FORTRAN; + if (!strcmp("bash", langName)) return L_BASH; + if (!strcmp("actionscript", langName)) return L_FLASH; + if (!strcmp("nsis", langName)) return L_NSIS; + if (!strcmp("tcl", langName)) return L_TCL; + + if (!strcmp("lisp", langName)) return L_LISP; + if (!strcmp("scheme", langName)) return L_SCHEME; + if (!strcmp("asm", langName)) return L_ASM; + if (!strcmp("diff", langName)) return L_DIFF; + if (!strcmp("props", langName)) return L_PROPS; + if (!strcmp("postscript", langName)) return L_PS; + if (!strcmp("ruby", langName)) return L_RUBY; + if (!strcmp("smalltalk", langName)) return L_SMALLTALK; + if (!strcmp("vhdl", langName)) return L_VHDL; + + if (!strcmp("caml", langName)) return L_CAML; + if (!strcmp("verilog", langName)) return L_VERILOG; + if (!strcmp("kix", langName)) return L_KIX; + if (!strcmp("autoit", langName)) return L_AU3; + if (!strcmp("ada", langName)) return L_ADA; + if (!strcmp("matlab", langName)) return L_MATLAB; + if (!strcmp("haskell", langName)) return L_HASKELL; + if (!strcmp("inno", langName)) return L_INNO; + if (!strcmp("searchResult", langName)) return L_SEARCHRESULT; + if (!strcmp("cmake", langName)) return L_CMAKE; + return L_TXT; +} + +int NppParameters::getIndexFromStr(const char *indexName) const +{ + string str(indexName); + + if (str == "instre1") + return LANG_INDEX_INSTR; + else if (str == "instre2") + return LANG_INDEX_INSTR2; + else if (str == "type1") + return LANG_INDEX_TYPE; + else if (str == "type2") + return LANG_INDEX_TYPE2; + else if (str == "type3") + return LANG_INDEX_TYPE3; + else if (str == "type4") + return LANG_INDEX_TYPE4; + else + return -1; +} + +void NppParameters::feedKeyWordsParameters(TiXmlNode *node) +{ + + TiXmlNode *langRoot = node->FirstChildElement("Languages"); + if (!langRoot) return; + + for (TiXmlNode *langNode = langRoot->FirstChildElement("Language"); + langNode ; + langNode = langNode->NextSibling("Language") ) + { + if (_nbLang < NB_LANG) + { + TiXmlElement *element = langNode->ToElement(); + const char *name = element->Attribute("name"); + if (name) + { + _langList[_nbLang] = new Lang(getLangIDFromStr(name), name); + _langList[_nbLang]->setDefaultExtList(element->Attribute("ext")); + _langList[_nbLang]->setCommentLineSymbol(element->Attribute("commentLine")); + _langList[_nbLang]->setCommentStart(element->Attribute("commentStart")); + _langList[_nbLang]->setCommentEnd(element->Attribute("commentEnd")); + + for (TiXmlNode *kwNode = langNode->FirstChildElement("Keywords"); + kwNode ; + kwNode = kwNode->NextSibling("Keywords") ) + { + const char *indexName = (kwNode->ToElement())->Attribute("name"); + TiXmlNode *kwVal = kwNode->FirstChild(); + const char *keyWords = ""; + if ((indexName) && (kwVal)) + keyWords = kwVal->Value(); + + int i = getIndexFromStr(indexName); + + if (i != -1) + _langList[_nbLang]->setWords(keyWords, i); + } + _nbLang++; + } + } + } +} + +void NppParameters::feedGUIParameters(TiXmlNode *node) +{ + TiXmlNode *GUIRoot = node->FirstChildElement("GUIConfigs"); + if (!GUIRoot) return; + + for (TiXmlNode *childNode = GUIRoot->FirstChildElement("GUIConfig"); + childNode ; + childNode = childNode->NextSibling("GUIConfig") ) + { + TiXmlElement *element = childNode->ToElement(); + const char *nm = element->Attribute("name"); + if (!nm) return; + + const char *val; + + if (!strcmp(nm, "ToolBar")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "hide")) + _nppGUI._toolBarStatus = TB_HIDE; + else if (!strcmp(val, "small")) + _nppGUI._toolBarStatus = TB_SMALL; + else if (!strcmp(val, "large")) + _nppGUI._toolBarStatus = TB_LARGE; + else if (!strcmp(val, "standard")) + _nppGUI._toolBarStatus = TB_STANDARD; + } + else if (!strcmp(nm, "StatusBar")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "hide")) + _nppGUI._statusBarShow = false; + else if (!strcmp(val, "show")) + _nppGUI._statusBarShow = true; + } + else if (!strcmp(nm, "TabBar")) + { + bool isFailed = false; + int oldValue = _nppGUI._tabStatus; + val = element->Attribute("dragAndDrop"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus = TAB_DRAGNDROP; + else if (!strcmp(val, "no")) + _nppGUI._tabStatus = 0; + else + isFailed = true; + } + + val = element->Attribute("drawTopBar"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus |= TAB_DRAWTOPBAR; + else if (!strcmp(val, "no")) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + + val = element->Attribute("drawInactiveTab"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus |= TAB_DRAWINACTIVETAB; + else if (!strcmp(val, "no")) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + + val = element->Attribute("reduce"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus |= TAB_REDUCE; + else if (!strcmp(val, "no")) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + + val = element->Attribute("closeButton"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus |= TAB_CLOSEBUTTON; + } + + val = element->Attribute("doubleClick2Close"); + if (val) + { + if (!strcmp(val, "yes")) + _nppGUI._tabStatus |= TAB_DBCLK2CLOSE; + } + if (isFailed) + _nppGUI._tabStatus = oldValue; + } + else if (!strcmp(nm, "Auto-detection")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "no")) + _nppGUI._fileAutoDetection = cdDisabled; + else if (!strcmp(val, "auto")) + _nppGUI._fileAutoDetection = cdAutoUpdate; + else + _nppGUI._fileAutoDetection = cdEnabled; + } + else if (!strcmp(nm, "TrayIcon")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "yes")) + _nppGUI._isMinimizedToTray = true; + } + else if (!strcmp(nm, "RememberLastSession")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "yes")) + _nppGUI._rememberLastSession = true; + else + _nppGUI._rememberLastSession = false; + } + + else if (!strcmp(nm, "MaitainIndent")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "yes")) + _nppGUI._maitainIndent = true; + else + _nppGUI._maitainIndent = false; + } + + else if (!strcmp(nm, "TaskList")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + _nppGUI._doTaskList = (!strcmp(val, "yes"))?true:false; + } + + else if (!strcmp(nm, "SaveOpenFileInSameDir")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + _nppGUI._saveOpenKeepInSameDir = (!strcmp(val, "yes"))?true:false; + } + + else if (!strcmp(nm, "MRU")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + _nppGUI._styleMRU = (!strcmp(val, "yes"))?true:false; + } + + else if (!strcmp(nm, "URL")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + if (!strcmp(val, "1")) + _nppGUI._styleURL = 1; + else if (!strcmp(val, "2")) + _nppGUI._styleURL = 2; + else + _nppGUI._styleURL = 0; + } + + else if (!strcmp(nm, "CheckHistoryFiles")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "no")) + _nppGUI._checkHistoryFiles = false; + } + else if (!strcmp(nm, "ScintillaViewsSplitter")) + { + val = (childNode->FirstChild())->Value(); + if (!val) return; + + if (!strcmp(val, "vertical")) + _nppGUI._splitterPos = POS_VERTICAL; + else if (!strcmp(val, "horizontal")) + _nppGUI._splitterPos = POS_HORIZOTAL; + } + else if (!strcmp(nm, "UserDefineDlg")) + { + bool isFailed = false; + int oldValue = _nppGUI._userDefineDlgStatus; + + val = (childNode->FirstChild())->Value(); + if (val) + { + if (!strcmp(val, "hide")) + _nppGUI._userDefineDlgStatus = 0; + else if (!strcmp(val, "show")) + _nppGUI._userDefineDlgStatus = UDD_SHOW; + else + isFailed = true; + } + val = element->Attribute("position"); + if (val) + { + if (!strcmp(val, "docked")) + _nppGUI._userDefineDlgStatus |= UDD_DOCKED; + else if (!strcmp(val, "undocked")) + _nppGUI._userDefineDlgStatus |= 0; + else + isFailed = true; + } + if (isFailed) + _nppGUI._userDefineDlgStatus = oldValue; + } + else if (!strcmp(nm, "TabSetting")) + { + val = element->Attribute("size"); + if (val) + _nppGUI._tabSize = decStrVal(val); + + if ((_nppGUI._tabSize == -1) || (_nppGUI._tabSize == 0)) + _nppGUI._tabSize = 8; + //bool isFailed = false; + val = element->Attribute("replaceBySpace"); + if (val) + _nppGUI._tabReplacedBySpace = (!strcmp(val, "yes")); + } + else if (!strcmp(nm, "AppPosition")) + { + RECT oldRect = _nppGUI._appPos; + bool fuckUp = true; + int i; + + if (element->Attribute("x", &i)) + { + _nppGUI._appPos.left = i; + + if (element->Attribute("y", &i)) + { + _nppGUI._appPos.top = i; + + if (element->Attribute("width", &i)) + { + _nppGUI._appPos.right = i; + + if (element->Attribute("height", &i)) + { + _nppGUI._appPos.bottom = i; + fuckUp = false; + } + } + } + } + if (fuckUp) + _nppGUI._appPos = oldRect; + + + if (val = element->Attribute("isMaximized")) + { + _nppGUI._isMaximized = (strcmp(val, "yes") == 0); + } + } + else if (!strcmp(nm, "NewDocDefaultSettings")) + { + int i; + if (element->Attribute("format", &i)) + _nppGUI._newDocDefaultSettings._format = (formatType)i; + + if (element->Attribute("encoding", &i)) + _nppGUI._newDocDefaultSettings._encoding = (UniMode)i; + + if (element->Attribute("lang", &i)) + _nppGUI._newDocDefaultSettings._lang = (LangType)i; + } + else if (!strcmp(nm, "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("gr0", &i)) + if (i <= 255) + g0 = i; + if (element->Attribute("gr1", &i)) + if (i <= 255) + g1 = i; + if (element->Attribute("gr2", &i)) + if (i <= 255) + g2 = i; + if (element->Attribute("gr3", &i)) + if (i <= 255) + g3 = i; + if (element->Attribute("gr4", &i)) + if (i <= 255) + g4 = i; + if (element->Attribute("gr5", &i)) + if (i <= 255) + g5 = i; + if (element->Attribute("gr6", &i)) + if (i <= 255) + g6 = i; + if (element->Attribute("gr7", &i)) + if (i <= 255) + g7 = i; + + bool langArray[nbMax]; + for (int i = 0 ; i < nbMax ; i++) langArray[i] = false; + + unsigned char 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; + } + } + + else if (!strcmp(nm, "Print")) + { + val = element->Attribute("lineNumber"); + if (val) + _nppGUI._printSettings._printLineNumber = (!strcmp(val, "yes")); + + int i; + if (element->Attribute("printOption", &i)) + _nppGUI._printSettings._printOption = i; + + val = element->Attribute("headerLeft"); + if (val) + _nppGUI._printSettings._headerLeft = val; + + val = element->Attribute("headerMiddle"); + if (val) + _nppGUI._printSettings._headerMiddle = val; + + val = element->Attribute("headerRight"); + if (val) + _nppGUI._printSettings._headerRight = val; + + + val = element->Attribute("footerLeft"); + if (val) + _nppGUI._printSettings._footerLeft = val; + + val = element->Attribute("footerMiddle"); + if (val) + _nppGUI._printSettings._footerMiddle = val; + + val = element->Attribute("footerRight"); + if (val) + _nppGUI._printSettings._footerRight = val; + + + val = element->Attribute("headerFontName"); + if (val) + _nppGUI._printSettings._headerFontName = val; + + val = element->Attribute("footerFontName"); + if (val) + _nppGUI._printSettings._footerFontName = val; + + if (element->Attribute("headerFontStyle", &i)) + _nppGUI._printSettings._headerFontStyle = i; + + if (element->Attribute("footerFontStyle", &i)) + _nppGUI._printSettings._footerFontStyle = i; + + if (element->Attribute("headerFontSize", &i)) + _nppGUI._printSettings._headerFontSize = i; + + if (element->Attribute("footerFontSize", &i)) + _nppGUI._printSettings._footerFontSize = i; + + + if (element->Attribute("margeLeft", &i)) + _nppGUI._printSettings._marge.left = i; + + if (element->Attribute("margeTop", &i)) + _nppGUI._printSettings._marge.top = i; + + if (element->Attribute("margeRight", &i)) + _nppGUI._printSettings._marge.right = i; + + if (element->Attribute("margeBottom", &i)) + _nppGUI._printSettings._marge.bottom = i; + } + + else if (!strcmp(nm, "ScintillaPrimaryView")) + { + feedScintillaParam(SCIV_PRIMARY, element); + } + else if (!strcmp(nm, "ScintillaSecondaryView")) + { + feedScintillaParam(SCIV_SECOND, element); + } + else if (!strcmp(nm, "Backup")) + { + int i; + if (element->Attribute("action", &i)) + _nppGUI._backup = (BackupFeature)i; + } + else if (!strcmp(nm, "DockingManager")) + { + feedDockingManager(element); + } + } +} + +void NppParameters::feedScintillaParam(bool whichOne, TiXmlNode *node) +{ + TiXmlElement *element = node->ToElement(); + + // Line Number Margin + const char *nm = element->Attribute("lineNumberMargin"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._lineNumberMarginShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._lineNumberMarginShow = false; + } + + // Bookmark Margin + nm = element->Attribute("bookMarkMargin"); + if (nm) + { + + if (!strcmp(nm, "show")) + _svp[whichOne]._bookMarkMarginShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._bookMarkMarginShow = false; + } + + // Indent GuideLine + nm = element->Attribute("indentGuideLine"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._indentGuideLineShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._indentGuideLineShow= false; + } + + // Folder Mark Style + nm = element->Attribute("folderMarkStyle"); + if (nm) + { + if (!strcmp(nm, "box")) + _svp[whichOne]._folderStyle = FOLDER_STYLE_BOX; + else if (!strcmp(nm, "circle")) + _svp[whichOne]._folderStyle = FOLDER_STYLE_CIRCLE; + else if (!strcmp(nm, "arrow")) + _svp[whichOne]._folderStyle = FOLDER_STYLE_ARROW; + else if (!strcmp(nm, "simple")) + _svp[whichOne]._folderStyle = FOLDER_STYLE_SIMPLE; + } + + // Current Line Highlighting State + nm = element->Attribute("currentLineHilitingShow"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._currentLineHilitingShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._currentLineHilitingShow = false; + } + + // Current wrap symbol visibility State + nm = element->Attribute("wrapSymbolShow"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._wrapSymbolShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._wrapSymbolShow = false; + } + + // Do Wrap + nm = element->Attribute("Wrap"); + if (nm) + { + if (!strcmp(nm, "yes")) + _svp[whichOne]._doWrap = true; + else if (!strcmp(nm, "no")) + _svp[whichOne]._doWrap = false; + } + + // Do Edge + nm = element->Attribute("edge"); + if (nm) + { + if (!strcmp(nm, "background")) + _svp[whichOne]._edgeMode = EDGE_BACKGROUND; + else if (!strcmp(nm, "line")) + _svp[whichOne]._edgeMode = EDGE_LINE; + else + _svp[whichOne]._edgeMode = EDGE_NONE; + } + + int val; + nm = element->Attribute("edgeNbColumn", &val); + if (nm) + { + _svp[whichOne]._edgeNbColumn = val; + } + + nm = element->Attribute("zoom", &val); + if (nm) + { + _svp[whichOne]._zoom = val; + } + + // White Space visibility State + nm = element->Attribute("whiteSpaceShow"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._whiteSpaceShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._whiteSpaceShow = false; + } + + // EOL visibility State + nm = element->Attribute("eolShow"); + if (nm) + { + if (!strcmp(nm, "show")) + _svp[whichOne]._eolShow = true; + else if (!strcmp(nm, "hide")) + _svp[whichOne]._eolShow = false; + } +} + + +void NppParameters::feedDockingManager(TiXmlNode *node) +{ + TiXmlElement *element = node->ToElement(); + + int i; + if (element->Attribute("leftWidth", &i)) + _nppGUI._dockingData._leftWidth = i; + + if (element->Attribute("rightWidth", &i)) + _nppGUI._dockingData._rightWidth = i; + + if (element->Attribute("topHeight", &i)) + _nppGUI._dockingData._topHeight = i; + + if (element->Attribute("bottomHeight", &i)) + _nppGUI._dockingData._bottomHight = i; + + + + for (TiXmlNode *childNode = node->FirstChildElement("FloatingWindow"); + childNode ; + childNode = childNode->NextSibling("FloatingWindow") ) + { + TiXmlElement *floatElement = childNode->ToElement(); + int cont; + if (floatElement->Attribute("cont", &cont)) + { + int x = 0; + int y = 0; + int w = 100; + int h = 100; + + floatElement->Attribute("x", &x); + floatElement->Attribute("y", &y); + floatElement->Attribute("width", &w); + floatElement->Attribute("height", &h); + _nppGUI._dockingData._flaotingWindowInfo.push_back(FloatingWindowInfo(cont, x, y, w, h)); + } + } + + for (TiXmlNode *childNode = node->FirstChildElement("PluginDlg"); + childNode ; + childNode = childNode->NextSibling("PluginDlg") ) + { + TiXmlElement *dlgElement = childNode->ToElement(); + const char *name = dlgElement->Attribute("pluginName"); + + int id; + const char *idStr = dlgElement->Attribute("id", &id); + if (name && idStr) + { + int curr = 0; // on left + int prev = 0; // on left + + dlgElement->Attribute("curr", &curr); + dlgElement->Attribute("prev", &prev); + + bool isVisible = false; + const char *val = NULL; + if (val = dlgElement->Attribute("isVisible")) + { + isVisible = (strcmp(val, "yes") == 0); + } + + _nppGUI._dockingData._pluginDockInfo.push_back(PlugingDlgDockingInfo(name, id, curr, prev, isVisible)); + } + } + + for (TiXmlNode *childNode = node->FirstChildElement("ActiveTabs"); + childNode ; + childNode = childNode->NextSibling("ActiveTabs") ) + { + TiXmlElement *dlgElement = childNode->ToElement(); + + int cont; + if (dlgElement->Attribute("cont", &cont)) + { + int activeTab = 0; + dlgElement->Attribute("activeTab", &activeTab); + _nppGUI._dockingData._containerTabInfo.push_back(ContainerTabInfo(cont, activeTab)); + } + } +} + +void NppParameters::writeScintillaParams(const ScintillaViewParams & svp, bool whichOne) +{ + if (!_pXmlUserDoc) return; + + const char *pViewName = (whichOne == SCIV_PRIMARY)?"ScintillaPrimaryView":"ScintillaSecondaryView"; + TiXmlNode *configsRoot = (_pXmlUserDoc->FirstChild("NotepadPlus"))->FirstChildElement("GUIConfigs"); + TiXmlNode *scintNode = getChildElementByAttribut(configsRoot, "GUIConfig", "name", pViewName); + if (scintNode) + { + (scintNode->ToElement())->SetAttribute("lineNumberMargin", svp._lineNumberMarginShow?"show":"hide"); + (scintNode->ToElement())->SetAttribute("bookMarkMargin", svp._bookMarkMarginShow?"show":"hide"); + (scintNode->ToElement())->SetAttribute("indentGuideLine", svp._indentGuideLineShow?"show":"hide"); + const char *pFolderStyleStr = (svp._folderStyle == FOLDER_STYLE_SIMPLE)?"simple": + (svp._folderStyle == FOLDER_STYLE_ARROW)?"arrow": + (svp._folderStyle == FOLDER_STYLE_CIRCLE)?"circle":"box"; + (scintNode->ToElement())->SetAttribute("folderMarkStyle", pFolderStyleStr); + (scintNode->ToElement())->SetAttribute("currentLineHilitingShow", svp._currentLineHilitingShow?"show":"hide"); + (scintNode->ToElement())->SetAttribute("wrapSymbolShow", svp._wrapSymbolShow?"show":"hide"); + (scintNode->ToElement())->SetAttribute("Wrap", svp._doWrap?"yes":"no"); + char *edgeStr = NULL; + if (svp._edgeMode == EDGE_NONE) + edgeStr = "no"; + else if (svp._edgeMode == EDGE_LINE) + edgeStr = "line"; + else + edgeStr = "background"; + (scintNode->ToElement())->SetAttribute("edge", edgeStr); + (scintNode->ToElement())->SetAttribute("edgeNbColumn", svp._edgeNbColumn); + (scintNode->ToElement())->SetAttribute("zoom", svp._zoom); + (scintNode->ToElement())->SetAttribute("whiteSpaceShow", svp._whiteSpaceShow?"show":"hide"); + (scintNode->ToElement())->SetAttribute("eolShow", svp._eolShow?"show":"hide"); + } + else {/*create one*/} +} + +void NppParameters::writeGUIParams() +{ + if (!_pXmlUserDoc) return; + + TiXmlNode *GUIRoot = (_pXmlUserDoc->FirstChild("NotepadPlus"))->FirstChildElement("GUIConfigs"); + if (!GUIRoot) + { + return; + } + + 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; + + TiXmlNode *dockingParamNode = NULL; + + for (TiXmlNode *childNode = GUIRoot->FirstChildElement("GUIConfig"); + childNode ; + childNode = childNode->NextSibling("GUIConfig")) + { + TiXmlElement *element = childNode->ToElement(); + const char *nm = element->Attribute("name"); + if (!nm) {return;} + + if (!strcmp(nm, "ToolBar")) + { + const char *pStr = _nppGUI._toolBarStatus == TB_HIDE?"hide":(_nppGUI._toolBarStatus == TB_SMALL?"small":(_nppGUI._toolBarStatus == TB_STANDARD?"standard":"large")); + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "StatusBar")) + { + const char *pStr = _nppGUI._statusBarShow?"show":"hide"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "TabBar")) + { + const char *pStr = (_nppGUI._tabStatus & TAB_DRAWTOPBAR)?"yes":"no"; + element->SetAttribute("dragAndDrop", pStr); + + pStr = (_nppGUI._tabStatus & TAB_DRAGNDROP)?"yes":"no"; + element->SetAttribute("drawTopBar", pStr); + + pStr = (_nppGUI._tabStatus & TAB_DRAWINACTIVETAB)?"yes":"no"; + element->SetAttribute("drawInactiveTab", pStr); + + pStr = (_nppGUI._tabStatus & TAB_REDUCE)?"yes":"no"; + element->SetAttribute("reduce", pStr); + + pStr = (_nppGUI._tabStatus & TAB_CLOSEBUTTON)?"yes":"no"; + element->SetAttribute("closeButton", pStr); + + pStr = (_nppGUI._tabStatus & TAB_DBCLK2CLOSE)?"yes":"no"; + element->SetAttribute("doubleClick2Close", pStr); + } + else if (!strcmp(nm, "ScintillaViewsSplitter")) + { + const char *pStr = _nppGUI._splitterPos == POS_VERTICAL?"vertical":"horizontal"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "UserDefineDlg")) + { + const char *pStr = _nppGUI._userDefineDlgStatus & UDD_SHOW?"show":"hide"; + (childNode->FirstChild())->SetValue(pStr); + + pStr = (_nppGUI._userDefineDlgStatus & UDD_DOCKED)?"docked":"undocked"; + element->SetAttribute("position", pStr); + } + else if (!strcmp(nm, "TabSetting")) + { + const char *pStr = _nppGUI._tabReplacedBySpace?"yes":"no"; + element->SetAttribute("replaceBySpace", pStr); + element->SetAttribute("size", _nppGUI._tabSize); + } + else if (!strcmp(nm, "Auto-detection")) + { + autoDetectionExist = true; + const char *pStr = (cdEnabled == _nppGUI._fileAutoDetection)?"yes":((cdAutoUpdate == _nppGUI._fileAutoDetection)?"auto":"no"); + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "TrayIcon")) + { + trayIconExist = true; + const char *pStr = _nppGUI._isMinimizedToTray?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "RememberLastSession")) + { + rememberLastSessionExist = true; + const char *pStr = _nppGUI._rememberLastSession?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + + else if (!strcmp(nm, "MaitainIndent")) + { + maitainIndentExist = true; + const char *pStr = _nppGUI._maitainIndent?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + + else if (!strcmp(nm, "SaveOpenFileInSameDir")) + { + saveOpenFileInSameDirExist = true; + const char *pStr = _nppGUI._saveOpenKeepInSameDir?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + + else if (!strcmp(nm, "TaskList")) + { + doTaskListExist = true; + const char *pStr = _nppGUI._doTaskList?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "CheckHistoryFiles")) + { + checkHistoryFilesExist = true; + const char *pStr = _nppGUI._checkHistoryFiles?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "AppPosition")) + { + element->SetAttribute("x", _nppGUI._appPos.left); + element->SetAttribute("y", _nppGUI._appPos.top); + element->SetAttribute("width", _nppGUI._appPos.right); + element->SetAttribute("height", _nppGUI._appPos.bottom); + element->SetAttribute("isMaximized", _nppGUI._isMaximized?"yes":"no"); + } + else if (!strcmp(nm, "NewDocDefaultSettings")) + { + element->SetAttribute("format", _nppGUI._newDocDefaultSettings._format); + element->SetAttribute("encoding", _nppGUI._newDocDefaultSettings._encoding); + element->SetAttribute("lang", _nppGUI._newDocDefaultSettings._lang); + newDocDefaultSettingsExist = true; + } + else if (!strcmp(nm, "langsExcluded")) + { + writeExcludedLangList(element); + langsExcludedLstExist = true; + } + else if (!strcmp(nm, "Print")) + { + writePrintSetting(element); + printSettingExist = true; + } + else if (!strcmp(nm, "Backup")) + { + element->SetAttribute("action", _nppGUI._backup); + backExist = true; + } + else if (!strcmp(nm, "MRU")) + { + MRUExist = true; + const char *pStr = _nppGUI._styleMRU?"yes":"no"; + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "URL")) + { + URLExist = true; + const char *pStr = "0"; + if (_nppGUI._styleURL == 1) + pStr = "1"; + else if (_nppGUI._styleURL == 2) + pStr = "2"; + + (childNode->FirstChild())->SetValue(pStr); + } + else if (!strcmp(nm, "DockingManager")) + { + dockingParamNode = childNode; + } + } + + if (!autoDetectionExist) + { + //insertGUIConfigBoolNode(GUIRoot, "Auto-detection", _nppGUI._fileAutoDetection); + const char *pStr = _nppGUI._fileAutoDetection==0?"no":(_nppGUI._fileAutoDetection==1?"yes":"auto"); + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "Auto-detection"); + GUIConfigElement->InsertEndChild(TiXmlText(pStr)); + } + if (!checkHistoryFilesExist) + { + insertGUIConfigBoolNode(GUIRoot, "CheckHistoryFiles", _nppGUI._checkHistoryFiles); + } + if (!trayIconExist) + { + insertGUIConfigBoolNode(GUIRoot, "TrayIcon", _nppGUI._isMinimizedToTray); + } + + if (!maitainIndentExist) + { + insertGUIConfigBoolNode(GUIRoot, "MaitainIndent", _nppGUI._maitainIndent); + } + + if (!rememberLastSessionExist) + { + insertGUIConfigBoolNode(GUIRoot, "RememberLastSession", _nppGUI._rememberLastSession); + } + + if (!newDocDefaultSettingsExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "NewDocDefaultSettings"); + GUIConfigElement->SetAttribute("format", _nppGUI._newDocDefaultSettings._format); + GUIConfigElement->SetAttribute("encoding", _nppGUI._newDocDefaultSettings._encoding); + GUIConfigElement->SetAttribute("lang", _nppGUI._newDocDefaultSettings._lang); + } + + if (!langsExcludedLstExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "langsExcluded"); + writeExcludedLangList(GUIConfigElement); + } + if (!printSettingExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "Print"); + writePrintSetting(GUIConfigElement); + } + if (!backExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "Backup"); + GUIConfigElement->SetAttribute("action", _nppGUI._backup); + } + + if (!doTaskListExist) + { + insertGUIConfigBoolNode(GUIRoot, "TaskList", _nppGUI._doTaskList); + } + + if (!MRUExist) + { + insertGUIConfigBoolNode(GUIRoot, "MRU", _nppGUI._styleMRU); + } + + if (!URLExist) + { + const char *pStr = "0"; + if (_nppGUI._styleURL == 1) + pStr = "1"; + else if (_nppGUI._styleURL == 2) + pStr = "2"; + + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", "URL"); + GUIConfigElement->InsertEndChild(TiXmlText(pStr)); + } + + if (!saveOpenFileInSameDirExist) + { + insertGUIConfigBoolNode(GUIRoot, "SaveOpenFileInSameDir", _nppGUI._saveOpenKeepInSameDir); + } + + if (dockingParamNode) + { + // Rase tout + GUIRoot->RemoveChild(dockingParamNode); + } + insertDockingParamNode(GUIRoot); + +} + +void NppParameters::insertDockingParamNode(TiXmlNode *GUIRoot) +{ + TiXmlElement DMNode("GUIConfig"); + DMNode.SetAttribute("name", "DockingManager"); + DMNode.SetAttribute("leftWidth", _nppGUI._dockingData._leftWidth); + DMNode.SetAttribute("rightWidth", _nppGUI._dockingData._rightWidth); + DMNode.SetAttribute("topHeight", _nppGUI._dockingData._topHeight); + DMNode.SetAttribute("bottomHeight", _nppGUI._dockingData._bottomHight); + + for (size_t i = 0 ; i < _nppGUI._dockingData._flaotingWindowInfo.size() ; i++) + { + FloatingWindowInfo & fwi = _nppGUI._dockingData._flaotingWindowInfo[i]; + TiXmlElement FWNode("FloatingWindow"); + FWNode.SetAttribute("cont", fwi._cont); + FWNode.SetAttribute("x", fwi._pos.left); + FWNode.SetAttribute("y", fwi._pos.top); + FWNode.SetAttribute("width", fwi._pos.right); + FWNode.SetAttribute("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("PluginDlg"); + PDNode.SetAttribute("pluginName", pdi._name); + PDNode.SetAttribute("id", pdi._internalID); + PDNode.SetAttribute("curr", pdi._currContainer); + PDNode.SetAttribute("prev", pdi._prevContainer); + PDNode.SetAttribute("isVisible", pdi._isVisible?"yes":"no"); + + DMNode.InsertEndChild(PDNode); + }//printStr("in writeGUIParams"); + + for (size_t i = 0 ; i < _nppGUI._dockingData._containerTabInfo.size() ; i++) + { + ContainerTabInfo & cti = _nppGUI._dockingData._containerTabInfo[i]; + TiXmlElement CTNode("ActiveTabs"); + CTNode.SetAttribute("cont", cti._cont); + CTNode.SetAttribute("activeTab", cti._activeTab); + DMNode.InsertEndChild(CTNode); + } + + GUIRoot->InsertEndChild(DMNode); +} + +void NppParameters::writePrintSetting(TiXmlElement *element) +{ + const char *pStr = _nppGUI._printSettings._printLineNumber?"yes":"no"; + element->SetAttribute("lineNumber", pStr); + + element->SetAttribute("printOption", _nppGUI._printSettings._printOption); + + element->SetAttribute("headerLeft", _nppGUI._printSettings._headerLeft.c_str()); + element->SetAttribute("headerMiddle", _nppGUI._printSettings._headerMiddle.c_str()); + element->SetAttribute("headerRight", _nppGUI._printSettings._headerRight.c_str()); + element->SetAttribute("footerLeft", _nppGUI._printSettings._footerLeft.c_str()); + element->SetAttribute("footerMiddle", _nppGUI._printSettings._footerMiddle.c_str()); + element->SetAttribute("footerRight", _nppGUI._printSettings._footerRight.c_str()); + + element->SetAttribute("headerFontName", _nppGUI._printSettings._headerFontName.c_str()); + element->SetAttribute("headerFontStyle", _nppGUI._printSettings._headerFontStyle); + element->SetAttribute("headerFontSize", _nppGUI._printSettings._headerFontSize); + element->SetAttribute("footerFontName", _nppGUI._printSettings._footerFontName.c_str()); + element->SetAttribute("footerFontStyle", _nppGUI._printSettings._footerFontStyle); + element->SetAttribute("footerFontSize", _nppGUI._printSettings._footerFontSize); + + element->SetAttribute("margeLeft", _nppGUI._printSettings._marge.left); + element->SetAttribute("margeRight", _nppGUI._printSettings._marge.right); + element->SetAttribute("margeTop", _nppGUI._printSettings._marge.top); + element->SetAttribute("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++) + { + int nGrp = _nppGUI._excludedLangList[i]._langType / 8; + int nMask = 1 << _nppGUI._excludedLangList[i]._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("gr0", g0); + element->SetAttribute("gr1", g1); + element->SetAttribute("gr2", g2); + element->SetAttribute("gr3", g3); + element->SetAttribute("gr4", g4); + element->SetAttribute("gr5", g5); + element->SetAttribute("gr6", g6); + element->SetAttribute("gr7", g7); +} + +void NppParameters::insertGUIConfigBoolNode(TiXmlNode *r2w, const char *name, bool bVal) +{ + const char *pStr = bVal?"yes":"no"; + TiXmlElement *GUIConfigElement = (r2w->InsertEndChild(TiXmlElement("GUIConfig")))->ToElement(); + GUIConfigElement->SetAttribute("name", name); + GUIConfigElement->InsertEndChild(TiXmlText(pStr)); +} + +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_TXT : + id = IDM_LANG_TEXT; break; + default : + id = IDM_LANG_TEXT; + } + return id; +} + +void NppParameters::writeStyles(LexerStylerArray & lexersStylers, StyleArray & globalStylers) +{ + TiXmlNode *lexersRoot = (_pXmlUserStylerDoc->FirstChild("NotepadPlus"))->FirstChildElement("LexerStyles"); + for (TiXmlNode *childNode = lexersRoot->FirstChildElement("LexerType"); + childNode ; + childNode = childNode->NextSibling("LexerType")) + { + TiXmlElement *element = childNode->ToElement(); + const char *nm = element->Attribute("name"); + + LexerStyler *pLs = _lexerStylerArray.getLexerStylerByName(nm); + LexerStyler *pLs2 = lexersStylers.getLexerStylerByName(nm); + + const char *extStr = pLs->getLexerUserExt(); + //pLs2->setLexerUserExt(extStr); + element->SetAttribute("ext", extStr); + + + if (pLs) + { + for (TiXmlNode *grChildNode = childNode->FirstChildElement("WordsStyle"); + grChildNode ; + grChildNode = grChildNode->NextSibling("WordsStyle")) + { + TiXmlElement *grElement = grChildNode->ToElement(); + const char *styleName = grElement->Attribute("name"); + + int i = pLs->getStylerIndexByName(styleName); + if (i != -1) + { + Style & style = pLs->getStyler(i); + Style & style2Sync = pLs2->getStyler(i); + + writeStyle2Element(style, style2Sync, grElement); + } + } + } + } + + TiXmlNode *globalStylesRoot = (_pXmlUserStylerDoc->FirstChild("NotepadPlus"))->FirstChildElement("GlobalStyles"); + + for (TiXmlNode *childNode = globalStylesRoot->FirstChildElement("WidgetStyle"); + childNode ; + childNode = childNode->NextSibling("WidgetStyle")) + { + TiXmlElement *pElement = childNode->ToElement(); + const char *styleName = pElement->Attribute("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 char *styleName = element->Attribute("name"); + + if (HIBYTE(HIWORD(style2Wite._fgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._fgColor); + char fgStr[7]; + sprintf(fgStr, "%.6X", rgbVal); + element->SetAttribute("fgColor", fgStr); + } + + if (HIBYTE(HIWORD(style2Wite._bgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._bgColor); + char bgStr[7]; + sprintf(bgStr, "%.6X", rgbVal); + element->SetAttribute("bgColor", bgStr); + } + + if (style2Wite._fontName) + { + const char *oldFontName = element->Attribute("fontName"); + if (strcmp(oldFontName, style2Wite._fontName)) + { + element->SetAttribute("fontName", style2Wite._fontName); + style2Sync._fontName = style2Wite._fontName = element->Attribute("fontName"); + } + } + + if (style2Wite._fontSize != -1) + { + if (!style2Wite._fontSize) + element->SetAttribute("fontSize", ""); + else + element->SetAttribute("fontSize", style2Wite._fontSize); + } + + if (style2Wite._fontStyle != -1) + { + element->SetAttribute("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("UserLang")))->ToElement(); + + rootElement->SetAttribute("name", userLang->_name); + rootElement->SetAttribute("ext", userLang->_ext); + TiXmlElement *settingsElement = (rootElement->InsertEndChild(TiXmlElement("Settings")))->ToElement(); + { + TiXmlElement *globalElement = (settingsElement->InsertEndChild(TiXmlElement("Global")))->ToElement(); + globalElement->SetAttribute("caseIgnored", userLang->_isCaseIgnored?"yes":"no"); + + TiXmlElement *treatAsSymbolElement = (settingsElement->InsertEndChild(TiXmlElement("TreatAsSymbol")))->ToElement(); + treatAsSymbolElement->SetAttribute("comment", userLang->_isCommentSymbol?"yes":"no"); + treatAsSymbolElement->SetAttribute("commentLine", userLang->_isCommentLineSymbol?"yes":"no"); + + TiXmlElement *prefixElement = (settingsElement->InsertEndChild(TiXmlElement("Prefix")))->ToElement(); + char names[nbPrefixListAllowed][7] = {"words1","words2","words3","words4"}; + for (int i = 0 ; i < nbPrefixListAllowed ; i++) + prefixElement->SetAttribute(names[i], userLang->_isPrefix[i]?"yes":"no"); + } + + TiXmlElement *kwlElement = (rootElement->InsertEndChild(TiXmlElement("KeywordLists")))->ToElement(); + + const int nbKWL = 9; + char kwn[nbKWL][16] = {"Delimiters", "Folder+","Folder-","Operators","Comment","Words1","Words2","Words3","Words4"}; + for (int i = 0 ; i < nbKWL ; i++) + { + TiXmlElement *kwElement = (kwlElement->InsertEndChild(TiXmlElement("Keywords")))->ToElement(); + kwElement->SetAttribute("name", kwn[i]); + kwElement->InsertEndChild(TiXmlText(userLang->_keywordLists[i])); + } + + TiXmlElement *styleRootElement = (rootElement->InsertEndChild(TiXmlElement("Styles")))->ToElement(); + + for (int i = 0 ; i < userLang->_styleArray.getNbStyler() ; i++) + { + TiXmlElement *styleElement = (styleRootElement->InsertEndChild(TiXmlElement("WordsStyle")))->ToElement(); + Style style2Wite = userLang->_styleArray.getStyler(i); + + styleElement->SetAttribute("name", style2Wite._styleDesc); + + styleElement->SetAttribute("styleID", style2Wite._styleID); + + //if (HIBYTE(HIWORD(style2Wite._fgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._fgColor); + char fgStr[7]; + sprintf(fgStr, "%.6X", rgbVal); + styleElement->SetAttribute("fgColor", fgStr); + } + + //if (HIBYTE(HIWORD(style2Wite._bgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._bgColor); + char bgStr[7]; + sprintf(bgStr, "%.6X", rgbVal); + styleElement->SetAttribute("bgColor", bgStr); + } + + if (style2Wite._fontName) + { + styleElement->SetAttribute("fontName", style2Wite._fontName); + } + + if (style2Wite._fontStyle == -1) + { + styleElement->SetAttribute("fontStyle", "0"); + } + else + { + styleElement->SetAttribute("fontStyle", style2Wite._fontStyle); + } + + if (style2Wite._fontSize != -1) + { + if (!style2Wite._fontSize) + styleElement->SetAttribute("fontSize", ""); + else + styleElement->SetAttribute("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) + { + char *str = new char[strlen(style._styleDesc) + 1]; + style._styleDesc = strcpy(str, style._styleDesc); + if (style._fontName) + { + str = new char[strlen(style._fontName) + 1]; + style._fontName = strcpy(str, style._fontName); + } + else + { + str = new char[2]; + str[0] = str[1] = '\0'; + style._fontName = str; + } + } + else + { + delete [] style._styleDesc; + delete [] style._fontName; + } + } + } +} + diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h new file mode 100644 index 00000000..bfbbeafc --- /dev/null +++ b/PowerEditor/src/Parameters.h @@ -0,0 +1,1048 @@ +//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 PARAMETERS_H +#define PARAMETERS_H + +#include +#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" +//#include "Buffer.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 + +enum formatType {WIN_FORMAT, MAC_FORMAT, UNIX_FORMAT}; + +enum UniMode {uni8Bit=0, uniUTF8=1, uni16BE=2, uni16LE=3, uniCookie=4, uniEnd}; + +enum ChangeDetect {cdDisabled=0, cdEnabled=1, cdAutoUpdate=2}; + +enum BackupFeature {bak_none = 0, bak_simple = 1, bak_verbose = 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 bool SCIV_PRIMARY = false; +const bool SCIV_SECOND = true; + +const char fontSizeStrs[][3] = {"", "8", "9", "10", "11", "12", "14", "16", "18", "20", "22", "24", "26", "28"}; + +#define LINEDRAW_FONT "LINEDRAW.TTF" +const char localConfFile[] = "doLocalConf.xml"; + +void cutString(const char *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; +}; + +struct sessionFileInfo : public Position { + string _fileName; + sessionFileInfo(const char *fn) { + if (fn) _fileName = fn; + }; + sessionFileInfo(const char *fn, Position pos) : Position(pos) { + if (fn) _fileName = fn; + }; + sessionFileInfo(string fn) : _fileName(fn){}; + sessionFileInfo(string fn, Position pos) : Position(pos), _fileName(fn){}; + vector marks; +}; + +struct Session { + int nbFiles() const {return _files.size();}; + size_t _actifIndex; + vector _files; +}; + +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 { + char _name[MAX_PATH]; + int _internalID; + + int _currContainer; + int _prevContainer; + bool _isVisible; + + PlugingDlgDockingInfo(const char *pluginName, int id, int curr, int prev, bool isVis) : _internalID(id), _currContainer(curr), _prevContainer(prev), _isVisible(isVis){ + strcpy(_name, pluginName); + }; + + friend inline const bool operator==(const PlugingDlgDockingInfo & a, const PlugingDlgDockingInfo & b) { + if ((strcmp(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 char *str, int base) { + if (!str) return -1; + if (!str[0]) return 0; + + char *finStr; + int result = strtol(str, &finStr, base); + if (*finStr != '\0') + return -1; + return result; +}; + +static int decStrVal(const char *str) { + return strVal(str, 10); +}; + +static int hexStrVal(const char *str) { + return strVal(str, 16); +}; + + +static int getKwClassFromName(const char *str) { + if (!strcmp("instre1", str)) return LANG_INDEX_INSTR; + if (!strcmp("instre2", str)) return LANG_INDEX_INSTR2; + if (!strcmp("type1", str)) return LANG_INDEX_TYPE; + if (!strcmp("type2", str)) return LANG_INDEX_TYPE2; + if (!strcmp("type3", str)) return LANG_INDEX_TYPE3; + if (!strcmp("type4", str)) return LANG_INDEX_TYPE4; + if (!strcmp("type5", str)) return LANG_INDEX_TYPE5; + return -1; +}; + +const int FONTSTYLE_BOLD = 1; +const int FONTSTYLE_ITALIC = 2; +const int FONTSTYLE_UNDERLINE = 4; + +struct Style +{ + int _styleID; + const char *_styleDesc; + + COLORREF _fgColor; + COLORREF _bgColor; + const char *_fontName; + int _fontStyle; + int _fontSize; + + int _keywordClass; + string *_keywords; + + Style():_styleID(-1), _fgColor(COLORREF(-1)), _bgColor(COLORREF(-1)), _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; + _fontName = style._fontName; + _fontSize = style._fontSize; + _fontStyle = style._fontStyle; + _keywordClass = style._keywordClass; + if (style._keywords) + _keywords = new 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->_fontName = style._fontName; + this->_fontSize = style._fontSize; + this->_fontStyle = style._fontStyle; + this->_keywordClass = style._keywordClass; + + if (!(this->_keywords) && style._keywords) + this->_keywords = new 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 char *str) { + if (!_keywords) + _keywords = new string(str); + else + *_keywords = str; + }; +}; + +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, char *styleName) { + _styleArray[_nbStyler]._styleID = styleID; + _styleArray[_nbStyler]._styleDesc = styleName; + _nbStyler++; + }; + + int getStylerIndexByID(int id) { + for (int i = 0 ; i < _nbStyler ; i++) + if (_styleArray[i]._styleID == id) + return i; + return -1; + }; + + int getStylerIndexByName(const char *name) const { + if (!name) + return -1; + for (int i = 0 ; i < _nbStyler ; i++) + if (!strcmp(_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; + strcpy(this->_lexerName, ls._lexerName); + strcpy(this->_lexerDesc, ls._lexerDesc); + strcpy(this->_lexerUserExt, ls._lexerUserExt); + } + return *this; + } + + void setLexerName(const char *lexerName) { + strcpy(_lexerName, lexerName); + }; + + void setLexerDesc(const char *lexerDesc) { + strcpy(_lexerDesc, lexerDesc); + }; + + void setLexerUserExt(const char *lexerUserExt) { + strcpy(_lexerUserExt, lexerUserExt); + }; + + const char * getLexerName() const {return _lexerName;}; + const char * getLexerDesc() const {return _lexerDesc;}; + const char * getLexerUserExt() const {return _lexerUserExt;}; + +private : + char _lexerName[16]; + char _lexerDesc[32]; + char _lexerUserExt[256]; +}; + +const int MAX_LEXER_STYLE = 50; + +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 char * getLexerNameFromIndex(int index) const {return _lexerStylerArray[index].getLexerName();} + const char * getLexerDescFromIndex(int index) const {return _lexerStylerArray[index].getLexerDesc();} + + LexerStyler * getLexerStylerByName(const char *lexerName) { + if (!lexerName) return NULL; + for (int i = 0 ; i < _nbLexerStyler ; i++) + { + if (!strcmp(_lexerStylerArray[i].getLexerName(), lexerName)) + return &(_lexerStylerArray[i]); + } + return NULL; + }; + bool hasEnoughSpace() {return (_nbLexerStyler < MAX_LEXER_STYLE);}; + void addLexerStyler(const char *lexerName, const char *lexerDesc, const char *lexerUserExt, TiXmlNode *lexerNode); + +private : + LexerStyler _lexerStylerArray[MAX_LEXER_STYLE]; + int _nbLexerStyler; +}; + +struct NewDocDefaultSettings +{ + formatType _format; + UniMode _encoding; + LangType _lang; + NewDocDefaultSettings():_format(WIN_FORMAT), _encoding(uni8Bit), _lang(L_TXT){}; +}; + +struct LangMenuItem { + LangType _langType; + int _cmdID; + string _langName; + + LangMenuItem(LangType lt, int cmdID = 0, string langName = ""): + _langType(lt), _cmdID(cmdID), _langName(langName){}; +}; + +struct PrintSettings { + bool _printLineNumber; + int _printOption; + + string _headerLeft; + string _headerMiddle; + string _headerRight; + string _headerFontName; + int _headerFontStyle; + int _headerFontSize; + + string _footerLeft; + string _footerMiddle; + string _footerRight; + string _footerFontName; + int _footerFontStyle; + int _footerFontSize; + + RECT _marge; + + PrintSettings() : _printLineNumber(true), _printOption(SC_PRINT_NORMAL), _headerLeft(""), _headerMiddle(""), _headerRight(""),\ + _headerFontName(""), _headerFontStyle(0), _headerFontSize(0), _footerLeft(""), _footerMiddle(""), _footerRight(""),\ + _footerFontName(""), _footerFontStyle(0), _footerFontSize(0) { + _marge.left = 0; _marge.top = 0; _marge.right = 0; _marge.bottom = 0; + }; + + bool isHeaderPresent() const { + return ((_headerLeft != "") || (_headerMiddle != "") || (_headerRight != "")); + }; + + bool isFooterPresent() const { + return ((_footerLeft != "") || (_footerMiddle != "") || (_footerRight != "")); + }; + + bool isUserMargePresent() const { + return ((_marge.left != 0) || (_marge.top != 0) || (_marge.right != 0) || (_marge.bottom != 0)); + }; + + +}; + +struct NppGUI +{ + NppGUI() : _toolBarStatus(TB_LARGE), _statusBarShow(true), \ + _tabStatus(TAB_DRAWTOPBAR | TAB_DRAWINACTIVETAB | TAB_DRAGNDROP),\ + _splitterPos(POS_HORIZOTAL), _userDefineDlgStatus(UDD_DOCKED), _tabSize(8),\ + _tabReplacedBySpace(false), _fileAutoDetection(cdEnabled), _checkHistoryFiles(true),\ + _isMaximized(false), _isMinimizedToTray(false), _rememberLastSession(true), _backup(bak_none), _useDir(false),\ + _doTaskList(true), _maitainIndent(true), _saveOpenKeepInSameDir(false), _styleMRU(true), _styleURL(0) { + _appPos.left = 0; + _appPos.top = 0; + _appPos.right = 700; + _appPos.bottom = 500; + + _backupDir[0] = '\0'; + }; + toolBarStatusType _toolBarStatus; // small, large ou hide + bool _statusBarShow; // show ou hide + + // 1er bit : draw top bar; + // 2nd bit : draw inactive tabs + // 3eme bit : enable drag&drop + // 4eme bit : reduce the height + // 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; + bool _checkHistoryFiles; + + RECT _appPos; + + bool _isMaximized; + bool _isMinimizedToTray; + bool _rememberLastSession; + bool _doTaskList; + bool _maitainIndent; + bool _saveOpenKeepInSameDir; + 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; + PrintSettings _printSettings; + BackupFeature _backup; + bool _useDir; + char _backupDir[MAX_PATH]; + DockingManagerData _dockingData; +}; + +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; + folderStyle _folderStyle; //"simple", "arrow", "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 LANG_NAME_LEN = 32; + +struct Lang +{ + LangType _langID; + char _langName[LANG_NAME_LEN]; + const char *_defaultExtList; + const char *_langKeyWordList[NB_LIST]; + const char *_pCommentLineSymbol; + const char *_pCommentStart; + const char *_pCommentEnd; + + Lang() {for (int i = 0 ; i < NB_LIST ; _langKeyWordList[i] = NULL ,i++);}; + Lang(LangType langID, const char *name) : _langID(langID){ + _langName[0] = '\0'; + if (name) + strcpy(_langName, name); + for (int i = 0 ; i < NB_LIST ; _langKeyWordList[i] = NULL ,i++); + }; + ~Lang() {}; + void setDefaultExtList(const char *extLst){ + _defaultExtList = extLst; + }; + + void setCommentLineSymbol(const char *commentLine){ + _pCommentLineSymbol = commentLine; + }; + + void setCommentStart(const char *commentStart){ + _pCommentStart = commentStart; + }; + + void setCommentEnd(const char *commentEnd){ + _pCommentEnd = commentEnd; + }; + + const char * getDefaultExtList() const { + return _defaultExtList; + }; + + void setWords(const char *words, int index) { + _langKeyWordList[index] = words; + }; + + const char * getWords(int index) const { + return _langKeyWordList[index]; + }; + + LangType getLangID() const {return _langID;}; + const char * 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(){ + strcpy(_name, "new user define"); + _ext[0] = '\0'; + + // Keywords list of Delimiters (index 0) + strcpy(_keywordLists[0], "000000"); + for (int i = 1 ; i < nbKeywodList ; i++) + *_keywordLists[i] = '\0'; + }; + UserLangContainer(const char *name, const char *ext){ + //si le nom est trop long, on le tranche! + int minSize = ((sizeof(_name) - 1) < strlen(name))?(sizeof(_name) - 1):strlen(name); + int i = 0; + for ( ; i < minSize ; i++) + _name[i] = name[i]; + _name[i] = '\0'; + + strcpy(_ext, ext); + + // Keywords list of Delimiters (index 0) + strcpy(_keywordLists[0], "000000"); + for (int j = 1 ; j < nbKeywodList ; j++) + *_keywordLists[j] = '\0'; + }; + + UserLangContainer & operator=(const UserLangContainer & ulc) { + if (this != &ulc) + { + strcpy(this->_name, ulc._name); + strcpy(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++) + strcpy(this->_keywordLists[i], ulc._keywordLists[i]); + } + return *this; + }; + + int getNbKeywordList() {return nbKeywodList;}; + char * getName() {return _name;}; + +private: + char _name[langNameLenMax]; + char _ext[extsLenMax]; + + StyleArray _styleArray; + char _keywordLists[nbKeywodList][max_char]; + + bool _isCaseIgnored; + bool _isCommentLineSymbol; + bool _isCommentSymbol; + bool _isPrefix[nbPrefixListAllowed]; +}; + +const int NB_LANG = 50; + +const bool DUP = true; +const bool FREE = false; + +class NppParameters +{ +public: + static NppParameters * getInstance() {return _pSelf;}; + static LangType getLangIDFromStr(const char *langName); + bool load(/*bool noUserPath = false*/); + void destroyInstance(); + + bool _isTaskListRBUTTONUP_Active; + + const NppGUI & getNppGUI() const { + return _nppGUI; + }; + + const char * 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]; + }; + + const char * getLangExtFromName(const char *langName) const { + for (int i = 0 ; i < _nbLang ; i++) + { + if (!strcmp(_langList[i]->_langName, langName)) + return _langList[i]->_defaultExtList; + } + return NULL; + }; + + const char * 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;}; + + 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]; + }; + + void writeNbHistoryFile(int nb) { + if (!_pXmlUserDoc) return; + + TiXmlNode *historyNode = (_pXmlUserDoc->FirstChild("NotepadPlus"))->FirstChildElement("History"); + if (historyNode) + (historyNode->ToElement())->SetAttribute("nbMaxFile", nb); + }; + + void writeHistory(const char *fullpath); + + TiXmlNode * getChildElementByAttribut(TiXmlNode *pere, const char *childName,\ + const char *attributName, const char *attributVal) const; + + void writeScintillaParams(const ScintillaViewParams & svp, bool whichOne); + + void writeGUIParams(); + + void writeStyles(LexerStylerArray & lexersStylers, StyleArray & globalStylers); + + LexerStylerArray & getLStylerArray() {return _lexerStylerArray;}; + StyleArray & getGlobalStylers() {return _widgetStyleArray;}; + + StyleArray & getMiscStylerArray() {return _widgetStyleArray;}; + + COLORREF getCurLineHilitingColour() { + int i = _widgetStyleArray.getStylerIndexByName("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("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 char *userLangName) { + for (int i = 0 ; i < _nbUserLang ; i++) + if (!strcmp(userLangName, _userLangArray[i]->_name)) + return *_userLangArray[i]; + //qui doit etre jamais passer + return *_userLangArray[0]; + }; + + void writeUserDefinedLang(); + void writeShortcuts(bool rewriteCmdSc, bool rewriteMacrosSc, bool rewriteUserCmdSc, bool rewriteScintillaKey, bool rewritePluginCmdSc); + void writeSession(const Session & session, const char *fileName = NULL); + + + bool isExistingUserLangName(const char *newName) const { + if ((!newName) || (!newName[0])) + return true; + + for (int i = 0 ; i < _nbUserLang ; i++) + { + if (!strcmp(_userLangArray[i]->_name, newName)) + return true; + } + return false; + }; + + const char * getLangNameFromExt(char *ext) { + if ((!ext) || (!ext[0])) + return NULL; + + for (int i = 0 ; i < _nbUserLang ; i++) + { + vector extVect; + cutString(_userLangArray[i]->_ext, extVect); + for (size_t j = 0 ; j < extVect.size() ; j++) + if (!strcmp(extVect[j].c_str(), ext)) + return _userLangArray[i]->_name; + } + return NULL; + }; + + int addUserLangToEnd(const UserLangContainer & userLang, const char *newName); + void removeUserLang(int index); + TiXmlDocument * getNativeLang() const {return _pXmlNativeLangDoc;}; + TiXmlDocument * getToolIcons() const {return _pXmlToolIconsDoc;}; + + bool isTransparentAvailable() const { + return (_transparentFuncAddr != NULL); + }; + + void SetTransparent(HWND hwnd, int percent) { + //WNDPROC transparentFunc = (NppParameters::getInstance())->getTransparentFunc(); + if (!_transparentFuncAddr) return; + ::SetWindowLong(hwnd, GWL_EXSTYLE, ::GetWindowLong(hwnd, GWL_EXSTYLE) | /*WS_EX_LAYERED*/0x00080000); + + _transparentFuncAddr(hwnd, 0, percent, 0x00000002); + }; + + void removeTransparent(HWND hwnd) { + ::SetWindowLong(hwnd, GWL_EXSTYLE, ::GetWindowLong(hwnd, GWL_EXSTYLE) & ~/*WS_EX_LAYERED*/0x00080000); + }; + + void setDefLang(LangType langType) {_defLangType = langType;}; + LangType getDefLang() const {return _defLangType;}; + + void setLineNumber2go(int ln) {_lineNumber2Go = ln;}; + int getLineNumber2go() const {return _lineNumber2Go;}; + + bool isRemappingShortcut() const {return _shortcuts.size() != 0;}; + + vector & getUserShortcuts() {return _shortcuts;}; + vector & getMacroList() {return _macros;}; + vector & getUserCommandList() {return _userCommands;}; + vector & getPluginCommandList() {return _pluginCommands;}; + vector & getPluginCustomizedCmds() {return _pluginCustomizedCmds;}; + + vector & getScintillaKeyList() {return _scintillaKeyCommands;}; + vector & getScintillaModifiedKeys() {return _scintillaModifiedKeys;}; + + //vector & getNoMenuCmdNames() {return _noMenuCmdNames;}; + + 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;}; + const char * getNppPath() const {return _nppPath;}; + const char * getAppDataNppDir() const {return _appdataNppDir;}; + + bool loadSession(Session & session, const char *sessionFileName); + int langTypeToCommandID(LangType lt) const; + WNDPROC getEnableThemeDlgTexture() const {return _enableThemeDialogTextureFuncAddr;}; + + struct FindDlgTabTitiles { + string _find; + string _replace; + string _findInFiles; + FindDlgTabTitiles() : _find(""), _replace(""), _findInFiles("") {}; + bool isWellFilled() { + return (strcmp(_find.c_str(), "") != 0 && strcmp(_replace.c_str(), "") && strcmp(_findInFiles.c_str(), "")); + }; + }; + + FindDlgTabTitiles & getFindDlgTabTitiles() { return _findDlgTabTitiles;}; + +private: + 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); + }; + static NppParameters *_pSelf; + + TiXmlDocument *_pXmlDoc, *_pXmlUserDoc, *_pXmlUserStylerDoc, *_pXmlUserLangDoc, *_pXmlNativeLangDoc,\ + *_pXmlToolIconsDoc, *_pXmlShortcutDoc, *_pXmlContextMenuDoc, *_pXmlSessionDoc; + + NppGUI _nppGUI; + ScintillaViewParams _svp[2]; + Lang *_langList[NB_LANG]; + int _nbLang; + + string *_LRFileList[NB_MAX_LRF_FILE]; + int _nbFile; + int _nbMaxFile; + + UserLangContainer *_userLangArray[NB_MAX_USER_LANG]; + int _nbUserLang; + char _userDefineLangPath[MAX_PATH]; + + LangType _defLangType; + int _lineNumber2Go; + + // All Styles (colours & fonts) + LexerStylerArray _lexerStylerArray; + StyleArray _widgetStyleArray; + + vector _fontlist; + + HMODULE _hUser32; + HMODULE _hUXTheme; + + WNDPROC _transparentFuncAddr; + WNDPROC _enableThemeDialogTextureFuncAddr; + + + vector _shortcuts; + vector _macros; + vector _userCommands; + vector _pluginCommands; + vector _pluginCustomizedCmds; + + vector _scintillaKeyCommands; + vector _scintillaModifiedKeys; + + //vector _noMenuCmdNames; + vector _contextMenuItems; + Session _session; + + char _shortcutsPath[MAX_PATH]; + char _contextMenuPath[MAX_PATH]; + char _sessionPath[MAX_PATH]; + char _nppPath[MAX_PATH]; + char _appdataNppDir[MAX_PATH]; // sentinel of the absence of "doLocalConf.xml" : (_appdataNppDir == "")?"doLocalConf.xml present":"doLocalConf.xml absent" + + Accelerator *_pAccelerator; + + FindDlgTabTitiles _findDlgTabTitiles; + + static int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, int FontType, LPARAM lParam) { + vector *pStrVect = (vector *)lParam; + size_t vectSize = pStrVect->size(); + if (vectSize == 0) + pStrVect->push_back((char *)lpelfe->elfFullName); + else + { + const char *lastFontName = pStrVect->at(vectSize - 1).c_str(); + if (strcmp(lastFontName, (const char *)lpelfe->elfFullName)) + pStrVect->push_back((char *)lpelfe->elfFullName); + } + return 1; // I want to get all fonts + }; + + void getLangKeywordsFromXmlTree(); + bool getUserParametersFromXmlTree(); + bool getUserStylersFromXmlTree(); + bool getUserDefineLangsFromXmlTree(); + bool getShortcutsFromXmlTree(); + void initScintillaKeys(); + + bool getMacrosFromXmlTree(); + bool getUserCmdsFromXmlTree(); + bool getPluginCmdsFromXmlTree(); + bool getScintKeysFromXmlTree(); + bool getContextMenuFromXmlTree(); + 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); + + bool feedStylerArray(TiXmlNode *node); + void getAllWordStyles(char *lexerName, TiXmlNode *lexerNode); + + void feedUserLang(TiXmlNode *node); + int getIndexFromKeywordListName(const char *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, MacroShortcut & macroShortcut); + bool getShortcuts(TiXmlNode *node, Shortcut & sc); + bool getScintKey(TiXmlNode *node, ScintillaKeyMap & skm); + + int getIndexFromStr(const char *indexName) const; + 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); + void insertGUIConfigBoolNode(TiXmlNode *r2w, const char *name, bool bVal); + void insertDockingParamNode(TiXmlNode *GUIRoot); + void writeExcludedLangList(TiXmlElement *element); + void writePrintSetting(TiXmlElement *element); +}; + +#endif //PARAMETERS_H diff --git a/PowerEditor/src/Parameters.h.bak b/PowerEditor/src/Parameters.h.bak new file mode 100644 index 00000000..644d1db3 --- /dev/null +++ b/PowerEditor/src/Parameters.h.bak @@ -0,0 +1,1044 @@ +//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 PARAMETERS_H +#define PARAMETERS_H + +#include +#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" +//#include "Buffer.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 + +enum formatType {WIN_FORMAT, MAC_FORMAT, UNIX_FORMAT}; + +enum UniMode {uni8Bit=0, uniUTF8=1, uni16BE=2, uni16LE=3, uniCookie=4, uniEnd}; + +enum ChangeDetect {cdDisabled=0, cdEnabled=1, cdAutoUpdate=2}; + +enum BackupFeature {bak_none = 0, bak_simple = 1, bak_verbose = 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 bool SCIV_PRIMARY = false; +const bool SCIV_SECOND = true; + +const char fontSizeStrs[][3] = {"", "8", "9", "10", "11", "12", "14", "16", "18", "20", "22", "24", "26", "28"}; + +#define LINEDRAW_FONT "LINEDRAW.TTF" +const char localConfFile[] = "doLocalConf.xml"; + +void cutString(const char *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; +}; + +struct sessionFileInfo : public Position { + string _fileName; + sessionFileInfo(const char *fn) { + if (fn) _fileName = fn; + }; + sessionFileInfo(const char *fn, Position pos) : Position(pos) { + if (fn) _fileName = fn; + }; + sessionFileInfo(string fn) : _fileName(fn){}; + sessionFileInfo(string fn, Position pos) : Position(pos), _fileName(fn){}; + vector marks; +}; + +struct Session { + int nbFiles() const {return _files.size();}; + size_t _actifIndex; + vector _files; +}; + +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 { + char _name[MAX_PATH]; + int _internalID; + + int _currContainer; + int _prevContainer; + bool _isVisible; + + PlugingDlgDockingInfo(const char *pluginName, int id, int curr, int prev, bool isVis) : _internalID(id), _currContainer(curr), _prevContainer(prev), _isVisible(isVis){ + strcpy(_name, pluginName); + }; + + friend inline const bool operator==(const PlugingDlgDockingInfo & a, const PlugingDlgDockingInfo & b) { + if ((strcmp(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 char *str, int base) { + if (!str) return -1; + if (!str[0]) return 0; + + char *finStr; + int result = strtol(str, &finStr, base); + if (*finStr != '\0') + return -1; + return result; +}; + +static int decStrVal(const char *str) { + return strVal(str, 10); +}; + +static int hexStrVal(const char *str) { + return strVal(str, 16); +}; + + +static int getKwClassFromName(const char *str) { + if (!strcmp("instre1", str)) return LANG_INDEX_INSTR; + if (!strcmp("instre2", str)) return LANG_INDEX_INSTR2; + if (!strcmp("type1", str)) return LANG_INDEX_TYPE; + if (!strcmp("type2", str)) return LANG_INDEX_TYPE2; + if (!strcmp("type3", str)) return LANG_INDEX_TYPE3; + if (!strcmp("type4", str)) return LANG_INDEX_TYPE4; + if (!strcmp("type5", str)) return LANG_INDEX_TYPE5; + return -1; +}; + +const int FONTSTYLE_BOLD = 1; +const int FONTSTYLE_ITALIC = 2; +const int FONTSTYLE_UNDERLINE = 4; + +struct Style +{ + int _styleID; + const char *_styleDesc; + + COLORREF _fgColor; + COLORREF _bgColor; + const char *_fontName; + int _fontStyle; + int _fontSize; + + int _keywordClass; + string *_keywords; + + Style():_styleID(-1), _fgColor(COLORREF(-1)), _bgColor(COLORREF(-1)), _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; + _fontName = style._fontName; + _fontSize = style._fontSize; + _fontStyle = style._fontStyle; + _keywordClass = style._keywordClass; + if (style._keywords) + _keywords = new 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->_fontName = style._fontName; + this->_fontSize = style._fontSize; + this->_fontStyle = style._fontStyle; + this->_keywordClass = style._keywordClass; + + if (!(this->_keywords) && style._keywords) + this->_keywords = new 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 char *str) { + if (!_keywords) + _keywords = new string(str); + else + *_keywords = str; + }; +}; + +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, char *styleName) { + _styleArray[_nbStyler]._styleID = styleID; + _styleArray[_nbStyler]._styleDesc = styleName; + _nbStyler++; + }; + + int getStylerIndexByID(int id) { + for (int i = 0 ; i < _nbStyler ; i++) + if (_styleArray[i]._styleID == id) + return i; + return -1; + }; + + int getStylerIndexByName(const char *name) const { + if (!name) + return -1; + for (int i = 0 ; i < _nbStyler ; i++) + if (!strcmp(_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; + strcpy(this->_lexerName, ls._lexerName); + strcpy(this->_lexerDesc, ls._lexerDesc); + strcpy(this->_lexerUserExt, ls._lexerUserExt); + } + return *this; + } + + void setLexerName(const char *lexerName) { + strcpy(_lexerName, lexerName); + }; + + void setLexerDesc(const char *lexerDesc) { + strcpy(_lexerDesc, lexerDesc); + }; + + void setLexerUserExt(const char *lexerUserExt) { + strcpy(_lexerUserExt, lexerUserExt); + }; + + const char * getLexerName() const {return _lexerName;}; + const char * getLexerDesc() const {return _lexerDesc;}; + const char * getLexerUserExt() const {return _lexerUserExt;}; + +private : + char _lexerName[16]; + char _lexerDesc[32]; + char _lexerUserExt[256]; +}; + +const int MAX_LEXER_STYLE = 50; + +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 char * getLexerNameFromIndex(int index) const {return _lexerStylerArray[index].getLexerName();} + const char * getLexerDescFromIndex(int index) const {return _lexerStylerArray[index].getLexerDesc();} + + LexerStyler * getLexerStylerByName(const char *lexerName) { + if (!lexerName) return NULL; + for (int i = 0 ; i < _nbLexerStyler ; i++) + { + if (!strcmp(_lexerStylerArray[i].getLexerName(), lexerName)) + return &(_lexerStylerArray[i]); + } + return NULL; + }; + bool hasEnoughSpace() {return (_nbLexerStyler < MAX_LEXER_STYLE);}; + void addLexerStyler(const char *lexerName, const char *lexerDesc, const char *lexerUserExt, TiXmlNode *lexerNode); + +private : + LexerStyler _lexerStylerArray[MAX_LEXER_STYLE]; + int _nbLexerStyler; +}; + +struct NewDocDefaultSettings +{ + formatType _format; + UniMode _encoding; + LangType _lang; + NewDocDefaultSettings():_format(WIN_FORMAT), _encoding(uni8Bit), _lang(L_TXT){}; +}; + +struct LangMenuItem { + LangType _langType; + int _cmdID; + string _langName; + + LangMenuItem(LangType lt, int cmdID = 0, string langName = ""): + _langType(lt), _cmdID(cmdID), _langName(langName){}; +}; + +struct PrintSettings { + bool _printLineNumber; + int _printOption; + + string _headerLeft; + string _headerMiddle; + string _headerRight; + string _headerFontName; + int _headerFontStyle; + int _headerFontSize; + + string _footerLeft; + string _footerMiddle; + string _footerRight; + string _footerFontName; + int _footerFontStyle; + int _footerFontSize; + + RECT _marge; + + PrintSettings() : _printLineNumber(true), _printOption(SC_PRINT_NORMAL), _headerLeft(""), _headerMiddle(""), _headerRight(""),\ + _headerFontName(""), _headerFontStyle(0), _headerFontSize(0), _footerLeft(""), _footerMiddle(""), _footerRight(""),\ + _footerFontName(""), _footerFontStyle(0), _footerFontSize(0) { + _marge.left = 0; _marge.top = 0; _marge.right = 0; _marge.bottom = 0; + }; + + bool isHeaderPresent() const { + return ((_headerLeft != "") || (_headerMiddle != "") || (_headerRight != "")); + }; + + bool isFooterPresent() const { + return ((_footerLeft != "") || (_footerMiddle != "") || (_footerRight != "")); + }; + + bool isUserMargePresent() const { + return ((_marge.left != 0) || (_marge.top != 0) || (_marge.right != 0) || (_marge.bottom != 0)); + }; + + +}; + +struct NppGUI +{ + NppGUI() : _toolBarStatus(TB_LARGE), _statusBarShow(true), \ + _tabStatus(TAB_DRAWTOPBAR | TAB_DRAWINACTIVETAB | TAB_DRAGNDROP),\ + _splitterPos(POS_HORIZOTAL), _userDefineDlgStatus(UDD_DOCKED), _tabSize(8),\ + _tabReplacedBySpace(false), _fileAutoDetection(cdEnabled), _checkHistoryFiles(true),\ + _isMaximized(false), _isMinimizedToTray(false), _rememberLastSession(true), _backup(bak_none),\ + _doTaskList(true), _maitainIndent(true), _saveOpenKeepInSameDir(false), _styleMRU(true), _styleURL(0) { + _appPos.left = 0; + _appPos.top = 0; + _appPos.right = 700; + _appPos.bottom = 500; + }; + toolBarStatusType _toolBarStatus; // small, large ou hide + bool _statusBarShow; // show ou hide + + // 1er bit : draw top bar; + // 2nd bit : draw inactive tabs + // 3eme bit : enable drag&drop + // 4eme bit : reduce the height + // 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; + bool _checkHistoryFiles; + + RECT _appPos; + + bool _isMaximized; + bool _isMinimizedToTray; + bool _rememberLastSession; + bool _doTaskList; + bool _maitainIndent; + bool _saveOpenKeepInSameDir; + 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; + PrintSettings _printSettings; + BackupFeature _backup; + DockingManagerData _dockingData; +}; + +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; + folderStyle _folderStyle; //"simple", "arrow", "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 LANG_NAME_LEN = 32; + +struct Lang +{ + LangType _langID; + char _langName[LANG_NAME_LEN]; + const char *_defaultExtList; + const char *_langKeyWordList[NB_LIST]; + const char *_pCommentLineSymbol; + const char *_pCommentStart; + const char *_pCommentEnd; + + Lang() {for (int i = 0 ; i < NB_LIST ; _langKeyWordList[i] = NULL ,i++);}; + Lang(LangType langID, const char *name) : _langID(langID){ + _langName[0] = '\0'; + if (name) + strcpy(_langName, name); + for (int i = 0 ; i < NB_LIST ; _langKeyWordList[i] = NULL ,i++); + }; + ~Lang() {}; + void setDefaultExtList(const char *extLst){ + _defaultExtList = extLst; + }; + + void setCommentLineSymbol(const char *commentLine){ + _pCommentLineSymbol = commentLine; + }; + + void setCommentStart(const char *commentStart){ + _pCommentStart = commentStart; + }; + + void setCommentEnd(const char *commentEnd){ + _pCommentEnd = commentEnd; + }; + + const char * getDefaultExtList() const { + return _defaultExtList; + }; + + void setWords(const char *words, int index) { + _langKeyWordList[index] = words; + }; + + const char * getWords(int index) const { + return _langKeyWordList[index]; + }; + + LangType getLangID() const {return _langID;}; + const char * 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(){ + strcpy(_name, "new user define"); + _ext[0] = '\0'; + + // Keywords list of Delimiters (index 0) + strcpy(_keywordLists[0], "000000"); + for (int i = 1 ; i < nbKeywodList ; i++) + *_keywordLists[i] = '\0'; + }; + UserLangContainer(const char *name, const char *ext){ + //si le nom est trop long, on le tranche! + int minSize = ((sizeof(_name) - 1) < strlen(name))?(sizeof(_name) - 1):strlen(name); + int i = 0; + for ( ; i < minSize ; i++) + _name[i] = name[i]; + _name[i] = '\0'; + + strcpy(_ext, ext); + + // Keywords list of Delimiters (index 0) + strcpy(_keywordLists[0], "000000"); + for (int j = 1 ; j < nbKeywodList ; j++) + *_keywordLists[j] = '\0'; + }; + + UserLangContainer & operator=(const UserLangContainer & ulc) { + if (this != &ulc) + { + strcpy(this->_name, ulc._name); + strcpy(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++) + strcpy(this->_keywordLists[i], ulc._keywordLists[i]); + } + return *this; + }; + + int getNbKeywordList() {return nbKeywodList;}; + char * getName() {return _name;}; + +private: + char _name[langNameLenMax]; + char _ext[extsLenMax]; + + StyleArray _styleArray; + char _keywordLists[nbKeywodList][max_char]; + + bool _isCaseIgnored; + bool _isCommentLineSymbol; + bool _isCommentSymbol; + bool _isPrefix[nbPrefixListAllowed]; +}; + +const int NB_LANG = 50; + +const bool DUP = true; +const bool FREE = false; + +class NppParameters +{ +public: + static NppParameters * getInstance() {return _pSelf;}; + static LangType getLangIDFromStr(const char *langName); + bool load(/*bool noUserPath = false*/); + void destroyInstance(); + + bool _isTaskListRBUTTONUP_Active; + + const NppGUI & getNppGUI() const { + return _nppGUI; + }; + + const char * 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]; + }; + + const char * getLangExtFromName(const char *langName) const { + for (int i = 0 ; i < _nbLang ; i++) + { + if (!strcmp(_langList[i]->_langName, langName)) + return _langList[i]->_defaultExtList; + } + return NULL; + }; + + const char * 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;}; + + 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]; + }; + + void writeNbHistoryFile(int nb) { + if (!_pXmlUserDoc) return; + + TiXmlNode *historyNode = (_pXmlUserDoc->FirstChild("NotepadPlus"))->FirstChildElement("History"); + if (historyNode) + (historyNode->ToElement())->SetAttribute("nbMaxFile", nb); + }; + + void writeHistory(const char *fullpath); + + TiXmlNode * getChildElementByAttribut(TiXmlNode *pere, const char *childName,\ + const char *attributName, const char *attributVal) const; + + void writeScintillaParams(const ScintillaViewParams & svp, bool whichOne); + + void writeGUIParams(); + + void writeStyles(LexerStylerArray & lexersStylers, StyleArray & globalStylers); + + LexerStylerArray & getLStylerArray() {return _lexerStylerArray;}; + StyleArray & getGlobalStylers() {return _widgetStyleArray;}; + + StyleArray & getMiscStylerArray() {return _widgetStyleArray;}; + + COLORREF getCurLineHilitingColour() { + int i = _widgetStyleArray.getStylerIndexByName("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("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 char *userLangName) { + for (int i = 0 ; i < _nbUserLang ; i++) + if (!strcmp(userLangName, _userLangArray[i]->_name)) + return *_userLangArray[i]; + //qui doit etre jamais passer + return *_userLangArray[0]; + }; + + void writeUserDefinedLang(); + void writeShortcuts(bool rewriteCmdSc, bool rewriteMacrosSc, bool rewriteUserCmdSc, bool rewriteScintillaKey, bool rewritePluginCmdSc); + void writeSession(const Session & session, const char *fileName = NULL); + + + bool isExistingUserLangName(const char *newName) const { + if ((!newName) || (!newName[0])) + return true; + + for (int i = 0 ; i < _nbUserLang ; i++) + { + if (!strcmp(_userLangArray[i]->_name, newName)) + return true; + } + return false; + }; + + const char * getLangNameFromExt(char *ext) { + if ((!ext) || (!ext[0])) + return NULL; + + for (int i = 0 ; i < _nbUserLang ; i++) + { + vector extVect; + cutString(_userLangArray[i]->_ext, extVect); + for (size_t j = 0 ; j < extVect.size() ; j++) + if (!strcmp(extVect[j].c_str(), ext)) + return _userLangArray[i]->_name; + } + return NULL; + }; + + int addUserLangToEnd(const UserLangContainer & userLang, const char *newName); + void removeUserLang(int index); + TiXmlDocument * getNativeLang() const {return _pXmlNativeLangDoc;}; + TiXmlDocument * getToolIcons() const {return _pXmlToolIconsDoc;}; + + bool isTransparentAvailable() const { + return (_transparentFuncAddr != NULL); + }; + + void SetTransparent(HWND hwnd, int percent) { + //WNDPROC transparentFunc = (NppParameters::getInstance())->getTransparentFunc(); + if (!_transparentFuncAddr) return; + ::SetWindowLong(hwnd, GWL_EXSTYLE, ::GetWindowLong(hwnd, GWL_EXSTYLE) | /*WS_EX_LAYERED*/0x00080000); + + _transparentFuncAddr(hwnd, 0, percent, 0x00000002); + }; + + void removeTransparent(HWND hwnd) { + ::SetWindowLong(hwnd, GWL_EXSTYLE, ::GetWindowLong(hwnd, GWL_EXSTYLE) & ~/*WS_EX_LAYERED*/0x00080000); + }; + + void setDefLang(LangType langType) {_defLangType = langType;}; + LangType getDefLang() const {return _defLangType;}; + + void setLineNumber2go(int ln) {_lineNumber2Go = ln;}; + int getLineNumber2go() const {return _lineNumber2Go;}; + + bool isRemappingShortcut() const {return _shortcuts.size() != 0;}; + + vector & getUserShortcuts() {return _shortcuts;}; + vector & getMacroList() {return _macros;}; + vector & getUserCommandList() {return _userCommands;}; + vector & getPluginCommandList() {return _pluginCommands;}; + vector & getPluginCustomizedCmds() {return _pluginCustomizedCmds;}; + + vector & getScintillaKeyList() {return _scintillaKeyCommands;}; + vector & getScintillaModifiedKeys() {return _scintillaModifiedKeys;}; + + //vector & getNoMenuCmdNames() {return _noMenuCmdNames;}; + + 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;}; + const char * getNppPath() const {return _nppPath;}; + const char * getAppDataNppDir() const {return _appdataNppDir;}; + + bool loadSession(Session & session, const char *sessionFileName); + int langTypeToCommandID(LangType lt) const; + WNDPROC getEnableThemeDlgTexture() const {return _enableThemeDialogTextureFuncAddr;}; + + struct FindDlgTabTitiles { + string _find; + string _replace; + string _findInFiles; + FindDlgTabTitiles() : _find(""), _replace(""), _findInFiles("") {}; + bool isWellFilled() { + return (strcmp(_find.c_str(), "") != 0 && strcmp(_replace.c_str(), "") && strcmp(_findInFiles.c_str(), "")); + }; + }; + + FindDlgTabTitiles & getFindDlgTabTitiles() { return _findDlgTabTitiles;}; + +private: + 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); + }; + static NppParameters *_pSelf; + + TiXmlDocument *_pXmlDoc, *_pXmlUserDoc, *_pXmlUserStylerDoc, *_pXmlUserLangDoc, *_pXmlNativeLangDoc,\ + *_pXmlToolIconsDoc, *_pXmlShortcutDoc, *_pXmlContextMenuDoc, *_pXmlSessionDoc; + + NppGUI _nppGUI; + ScintillaViewParams _svp[2]; + Lang *_langList[NB_LANG]; + int _nbLang; + + string *_LRFileList[NB_MAX_LRF_FILE]; + int _nbFile; + int _nbMaxFile; + + UserLangContainer *_userLangArray[NB_MAX_USER_LANG]; + int _nbUserLang; + char _userDefineLangPath[MAX_PATH]; + + LangType _defLangType; + int _lineNumber2Go; + + // All Styles (colours & fonts) + LexerStylerArray _lexerStylerArray; + StyleArray _widgetStyleArray; + + vector _fontlist; + + HMODULE _hUser32; + HMODULE _hUXTheme; + + WNDPROC _transparentFuncAddr; + WNDPROC _enableThemeDialogTextureFuncAddr; + + + vector _shortcuts; + vector _macros; + vector _userCommands; + vector _pluginCommands; + vector _pluginCustomizedCmds; + + vector _scintillaKeyCommands; + vector _scintillaModifiedKeys; + + //vector _noMenuCmdNames; + vector _contextMenuItems; + Session _session; + + char _shortcutsPath[MAX_PATH]; + char _contextMenuPath[MAX_PATH]; + char _sessionPath[MAX_PATH]; + char _nppPath[MAX_PATH]; + char _appdataNppDir[MAX_PATH]; // sentinel of the absence of "doLocalConf.xml" : (_appdataNppDir == "")?"doLocalConf.xml present":"doLocalConf.xml absent" + + Accelerator *_pAccelerator; + + FindDlgTabTitiles _findDlgTabTitiles; + + static int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, int FontType, LPARAM lParam) { + vector *pStrVect = (vector *)lParam; + size_t vectSize = pStrVect->size(); + if (vectSize == 0) + pStrVect->push_back((char *)lpelfe->elfFullName); + else + { + const char *lastFontName = pStrVect->at(vectSize - 1).c_str(); + if (strcmp(lastFontName, (const char *)lpelfe->elfFullName)) + pStrVect->push_back((char *)lpelfe->elfFullName); + } + return 1; // I want to get all fonts + }; + + void getLangKeywordsFromXmlTree(); + bool getUserParametersFromXmlTree(); + bool getUserStylersFromXmlTree(); + bool getUserDefineLangsFromXmlTree(); + bool getShortcutsFromXmlTree(); + void initScintillaKeys(); + + bool getMacrosFromXmlTree(); + bool getUserCmdsFromXmlTree(); + bool getPluginCmdsFromXmlTree(); + bool getScintKeysFromXmlTree(); + bool getContextMenuFromXmlTree(); + 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); + + bool feedStylerArray(TiXmlNode *node); + void getAllWordStyles(char *lexerName, TiXmlNode *lexerNode); + + void feedUserLang(TiXmlNode *node); + int getIndexFromKeywordListName(const char *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, MacroShortcut & macroShortcut); + bool getShortcuts(TiXmlNode *node, Shortcut & sc); + bool getScintKey(TiXmlNode *node, ScintillaKeyMap & skm); + + int getIndexFromStr(const char *indexName) const; + 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); + void insertGUIConfigBoolNode(TiXmlNode *r2w, const char *name, bool bVal); + void insertDockingParamNode(TiXmlNode *GUIRoot); + void writeExcludedLangList(TiXmlElement *element); + void writePrintSetting(TiXmlElement *element); +}; + +#endif //PARAMETERS_H diff --git a/PowerEditor/src/RCa02172 b/PowerEditor/src/RCa02172 new file mode 100644 index 0000000000000000000000000000000000000000..0a7271f3a4f0dea2bfb953c43e5933df6cce1caf GIT binary patch literal 56926 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 z^|9getLangNameFromExt(ext))) + { + _lang = L_USER; + strcpy(_userLangExt, langName); + isExtSet = true; + } + else // if it's not user lang, then check if it's supported lang + { + _lang = getLangFromExt(ext); + if (_lang == L_TXT) + { + char *fileName = PathFindFileName(_fullPathName); + + if ((!_stricmp(fileName, "makefile")) || (!_stricmp(fileName, "GNUmakefile"))) + _lang = L_MAKEFILE; + else if (!_stricmp(fileName, "CmakeLists.txt")) + _lang = L_CMAKE; + } + } + + if (!isExtSet) + _userLangExt[0] = '\0'; + // for _timeStamp + updatTimeStamp(); + } + else // new doc + { + _lang = defaultLang; + _timeStamp = 0; + } +} + +LangType Buffer::getLangFromExt(const char *ext) +{ + int i = 0; + Lang *l = NppParameters::getInstance()->getLangFromIndex(i++); + while (l) + { + const char *defList = l->getDefaultExtList(); + const char *userList = NULL; + + LexerStylerArray &lsa = (NppParameters::getInstance())->getLStylerArray(); + const char *lName = l->getLangName(); + LexerStyler *pLS = lsa.getLexerStylerByName(lName); + + if (pLS) + userList = pLS->getLexerUserExt(); + + std::string list(""); + if (defList) + list += defList; + if (userList) + { + list += " "; + list += userList; + } + if (isInList(ext, list.c_str())) + return l->getLangID(); + l = (NppParameters::getInstance())->getLangFromIndex(i++); + } + return L_TXT; +} diff --git a/PowerEditor/src/ScitillaComponent/Buffer.h b/PowerEditor/src/ScitillaComponent/Buffer.h new file mode 100644 index 00000000..2fa61a81 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/Buffer.h @@ -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. + +#ifndef BUFFER_H +#define BUFFER_H + +#include +#include +#include +#include "Scintilla.h" +#include "Parameters.h" + +const char UNTITLED_STR[] = "new "; +typedef sptr_t Document; + +// 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; + +enum docFileStaus{NEW_DOC, FILE_DELETED, NO_PROBLEM, MODIFIED_FROM_OUTSIDE}; + +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; +}; +*/ +//#define USER_LANG_CURRENT "" +const int userLangNameMax = 16; + +static bool isInList(const char *token, const char *list) { + if ((!token) || (!list)) + return false; + char word[64]; + int i = 0; + int j = 0; + for (; i <= int(strlen(list)) ; i++) + { + if ((list[i] == ' ')||(list[i] == '\0')) + { + if (j != 0) + { + word[j] = '\0'; + j = 0; + + if (!stricmp(token, word)) + return true; + } + } + else + { + word[j] = list[i]; + j++; + } + } + return false; +}; + + +class Buffer +{ +friend class ScintillaEditView; +friend class Notepad_plus; +public : + Buffer(Document doc, const char *fileName) + : _isDirty(false), _doc(doc), _isReadOnly(false), _isSetReadOnly(false), _recentTag(-1) + { + NppParameters *pNppParamInst = NppParameters::getInstance(); + const NewDocDefaultSettings & ndds = (pNppParamInst->getNppGUI()).getNewDocDefaultSettings(); + _format = ndds._format; + _unicodeMode = ndds._encoding; + + _pos._firstVisibleLine = 0; + _pos._startPos = 0; + _pos._endPos = 0; + _pos._xOffset = 0; + setFileName(fileName, ndds._lang); + //_userLangExt[0] = '\0'; + }; + + Buffer(const Buffer & buf) : _isDirty(buf._isDirty), _doc(buf._doc), _lang(buf._lang), + _timeStamp(buf._timeStamp), _isReadOnly(buf._isReadOnly), _isSetReadOnly(buf._isSetReadOnly), _pos(buf._pos), + _format(buf._format),_unicodeMode(buf._unicodeMode), _foldState(buf._foldState), _recentTag(buf._recentTag) + { + strcpy(_fullPathName, buf._fullPathName); + strcpy(_userLangExt, buf._userLangExt); + }; + + Buffer & operator=(const Buffer & buf) + { + if (this != &buf) + { + this->_isDirty = buf._isDirty; + this->_doc = buf._doc; + this->_lang = buf._lang; + this->_timeStamp = buf._timeStamp; + this->_isReadOnly = buf._isReadOnly; + this->_isSetReadOnly = buf._isSetReadOnly; + this->_pos = buf._pos; + this->_format = buf._format; + this->_unicodeMode = buf._unicodeMode; + this->_foldState = buf._foldState; + this->_recentTag = buf._recentTag; + + strcpy(this->_fullPathName, buf._fullPathName); + strcpy(this->_userLangExt, buf._userLangExt); + } + return *this; + } + + LangType getLangFromExt(const char *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 char *fn, LangType defaultLang = L_TXT); + + const char * getFileName() const {return _fullPathName;}; + + void updatTimeStamp() { + struct _stat buf; + _timeStamp = (_stat(_fullPathName, &buf)==0)?buf.st_mtime:0; + }; + + void increaseRecentTag() { + _recentTag = ++_recentTagCtr; + } + + long getRecentTag() const { + return _recentTag; + } + + docFileStaus checkFileState() { + if (isUntitled(_fullPathName)) + { + _isReadOnly = false; + return NEW_DOC; + } + if (!PathFileExists(_fullPathName)) + { + _isReadOnly = false; + return FILE_DELETED; + } + struct _stat buf; + if (!_stat(_fullPathName, &buf)) + { + _isReadOnly = (bool)(!(buf.st_mode & _S_IWRITE)); + + if (_timeStamp != buf.st_mtime) + return MODIFIED_FROM_OUTSIDE; + } + return NO_PROBLEM; + }; + + // to use this method with open and save + void checkIfReadOnlyFile() { + struct _stat buf; + if (!_stat(_fullPathName, &buf)) + { + _isReadOnly = (bool)(!(buf.st_mode & _S_IWRITE)); + } + }; + + bool isDirty() const { + return _isDirty; + }; + + bool isReadOnly() const { + return (_isReadOnly || _isSetReadOnly); + }; + + bool isSystemReadOnly() const { + return _isReadOnly; + }; + + bool isUserReadOnly() const { + return _isSetReadOnly; + }; + + bool setReadOnly(bool ro) { + bool oldVal = _isSetReadOnly; + _isSetReadOnly = ro; + return oldVal; + }; + + time_t getTimeStamp() const { + return _timeStamp; + }; + + void synchroniseWith(const Buffer & buf) { + _isDirty = buf.isDirty(); + _timeStamp = buf.getTimeStamp(); + }; + + // that is : the prefix of the string is "new " + static bool isUntitled(const char *str2Test) { + return (strncmp(str2Test, UNTITLED_STR, sizeof(UNTITLED_STR)-1) == 0); + } + + void setFormat(formatType format) { + _format = format; + }; + + void determinateFormat(char *data) { + 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; + return; + } + else + { + _format = MAC_FORMAT; + return; + } + } + if (data[i] == LF) + { + _format = UNIX_FORMAT; + return; + } + } + _format = WIN_FORMAT; + }; + + formatType getFormat() const { + return _format; + }; + + bool isUserDefineLangExt() const { + return (_userLangExt[0] != '\0'); + }; + + const char * getUserDefineLangName() const {return _userLangExt;}; + + void setUnicodeMode(UniMode mode) { + if ((_unicodeMode != mode) && !((_unicodeMode == uni8Bit) && (mode == uniCookie)) && \ + !((_unicodeMode == uniCookie) && (mode == uni8Bit))) + _isDirty = true; + _unicodeMode = mode; + }; + UniMode getUnicodeMode() const {return _unicodeMode;}; + + const char * getCommentLineSymbol() const { + Lang *l = getCurrentLang(); + if (!l) + return NULL; + return l->_pCommentLineSymbol; + + }; + const char * getCommentStart() const { + Lang *l = getCurrentLang(); + if (!l) + return NULL; + return l->_pCommentStart; + }; + const char * getCommentEnd() const { + Lang *l = getCurrentLang(); + if (!l) + return NULL; + return l->_pCommentEnd; + }; + /* + const Position& getPosition() const { + return _pos; + } + */ + LangType getLangType() const { + return _lang; + } + + void setPosition(const Position& pos) { + _pos = pos; + } + +private : + bool _isDirty; + Document _doc; + LangType _lang; + char _userLangExt[userLangNameMax]; // it's useful if only (_lang == L_USER) + + time_t _timeStamp; // 0 if it's a new doc + bool _isReadOnly; + bool _isSetReadOnly; + Position _pos; + char _fullPathName[MAX_PATH]; + formatType _format; + UniMode _unicodeMode; + std::vector _foldState; + long _recentTag; + static long _recentTagCtr; + + Lang * getCurrentLang() const { + int i = 0 ; + Lang *l = NppParameters::getInstance()->getLangFromIndex(i++); + while (l) + { + if (l->_langID == _lang) + return l; + + l = (NppParameters::getInstance())->getLangFromIndex(i++); + } + return NULL; + }; +}; + +#endif //BUFFER_H diff --git a/PowerEditor/src/ScitillaComponent/DocTabView.cpp b/PowerEditor/src/ScitillaComponent/DocTabView.cpp new file mode 100644 index 00000000..33a1c3ee --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/DocTabView.cpp @@ -0,0 +1,166 @@ +//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 + +unsigned short DocTabView::_nbNewTitle = 0; + + +// return the index if fn is found in DocTabView +// otherwise -1 +int DocTabView::find(const char *fn) const +{ + return _pView->findDocIndexByName(fn); +} + +char * DocTabView::newDocInit() +{ + // create the new entry for this doc + char * newTitle = _pView->attatchDefaultDoc(_nbNewTitle++); + + // create a new (the first) sub tab then hightlight it + TabBar::insertAtEnd(newTitle); + + return newTitle; +} + +const char * DocTabView::newDoc(const char *fn) +{ + char *completName; + if ((!fn) || (!strcmp(fn, ""))) + completName = _pView->createNewDoc(_nbNewTitle++); + else + completName = _pView->createNewDoc(fn); + // for the title of sub tab + fn = PathFindFileName(completName); + char fnConformToTab[MAX_PATH]; + + for (int i = 0, j = 0 ; ; i++) + { + fnConformToTab[j++] = fn[i]; + if (fn[i] == '&') + fnConformToTab[j++] = '&'; + if (fn[i] == '\0') + break; + } + //fnConformToTab[j] = '\0'; + + TabBar::insertAtEnd(fnConformToTab); + TabBar::activateAt(_nbItem - 1); + return (const char *)completName; +} + +const char * DocTabView::newDoc(Buffer & buf) +{ + const char *completName = buf.getFileName(); + int i = _pView->addBuffer(buf); + _pView->activateDocAt(i); + + // for the title of sub tab + TabBar::insertAtEnd(PathFindFileName(completName)); + TabBar::activateAt(_nbItem - 1); + return completName; +} + +//! \brief this method activates the doc and the corresponding sub tab +//! \brief return the index of previeus current doc +char * DocTabView::activate(int index) +{ + TabBar::activateAt(index); + return _pView->activateDocAt(index); + + //char *title = _pView->activateDocAt(index); + //_pView->execute(SCI_SETLEXER, SCLEX_CONTAINER); + //return title; +} + +// this method updates the doc when user clicks a sub tab +// return Null if the user clicks on an active sub tab, +// otherwize the name of new activated doc +char * DocTabView::clickedUpdate() +{ + int indexClicked = int(::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0)); + if (indexClicked == _pView->getCurrentDocIndex()) return NULL; + + return _pView->activateDocAt(indexClicked); +} + +const char * DocTabView::closeCurrentDoc() +{ + if (_nbItem == 1) + { + newDoc(); + closeDocAt(0); + } + else + { + int i2activate; + int i2close = _pView->closeCurrentDoc(i2activate); + + TabBar::deletItemAt(i2close); + TabBar::activateAt(i2activate); + } + return _pView->getCurrentTitle(); +} + +const char * DocTabView::closeAllDocs() +{ + _pView->removeAllUnusedDocs(); + TabBar::deletAllItem(); + _nbNewTitle = 0; + newDocInit(); + return _pView->getCurrentTitle(); +} + +void DocTabView::closeDocAt(int index2Close) +{ + _pView->closeDocAt(index2Close); + TabBar::deletItemAt(index2Close); +} + +void DocTabView::updateCurrentTabItem(const char *title) +{ + //char str[32]; + int currentIndex = TabCtrl_GetCurSel(_hSelf); + + updateTabItem(currentIndex, title); +} + +void DocTabView::updateTabItem(int index, const char *title) +{ + char str[MAX_PATH]; + TCITEM tie; + tie.mask = TCIF_TEXT | TCIF_IMAGE; + tie.pszText = str; + tie.cchTextMax = (sizeof(str)-1); + + TabCtrl_GetItem(_hSelf, index, &tie); + if ((title)&&(strcmp(title, ""))) + tie.pszText = (char *)title; + + bool isDirty = (_pView->getBufferAt(index)).isDirty();//isCurrentBufReadOnly(); + bool isReadOnly = (_pView->getBufferAt(index)).isReadOnly();//getCurrentDocStat(); + tie.iImage = isReadOnly?REDONLY_IMG_INDEX:(isDirty?UNSAVED_IMG_INDEX:SAVED_IMG_INDEX); + TabCtrl_SetItem(_hSelf, index, &tie); +} diff --git a/PowerEditor/src/ScitillaComponent/DocTabView.h b/PowerEditor/src/ScitillaComponent/DocTabView.h new file mode 100644 index 00000000..819effe6 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/DocTabView.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 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(); + }; + + char * init(HINSTANCE hInst, HWND parent, ScintillaEditView *pView, IconList *pIconList = NULL) + { + TabBarPlus::init(hInst, parent); + _pView = pView; + + if (pIconList) + TabBar::setImageList(pIconList->getHandle()); + return newDocInit(); + }; + + char * newDocInit(); + int find(const char *) const; + char * activate(int index); + + const char * newDoc(const char *fn = NULL); + const char * newDoc(Buffer & buf); + + char * clickedUpdate(); + + const char * closeCurrentDoc(); + const char * closeAllDocs(); + void closeDocAt(int index); + + //void setCurrentTabItem(const char *title, bool isDirty); + void updateCurrentTabItem(const char *title = NULL); + void updateTabItem(int index, const char *title = NULL); + + virtual void reSizeTo(RECT & rc) + { + TabBar::reSizeTo(rc); + //rc.left += 3; + rc.top += 2; + rc.right -= 4; + rc.bottom -= 26; + + _pView->reSizeTo(rc); + }; + +private : + static unsigned short _nbNewTitle; + ScintillaEditView *_pView; +}; + +#endif //DOCTABVIEW_H diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg b/PowerEditor/src/ScitillaComponent/FindReplaceDlg new file mode 100644 index 00000000..ad28b893 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg @@ -0,0 +1,1291 @@ +//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 "common_func.h" +#include + +#include "UniConversion.h" + +typedef HRESULT (WINAPI * ETDTProc) (HWND, DWORD); + + +void addText2Combo(const char * txt2add, HWND hCombo, bool isUTF8) +{ + if (!hCombo) return; + if (!strcmp(txt2add, "")) return; + + char text[MAX_PATH]; + WCHAR textW[MAX_PATH*2]; + + int count = ::SendMessage(hCombo, CB_GETCOUNT, 0, 0); + bool hasFound = false; + int i = 0; + + WCHAR wchars2Add[256]; + if (isUTF8) + ::MultiByteToWideChar(CP_UTF8, 0, txt2add, -1, wchars2Add, 256 / sizeof(WCHAR)); + + for ( ; i < count ; i++) + { + + if (isUTF8) + { + ::SendMessageW(hCombo, CB_GETLBTEXT, i, (LPARAM)textW); + if (!wcscmp(wchars2Add, textW)) + { + hasFound = true; + break; + } + } + else + { + ::SendMessage(hCombo, CB_GETLBTEXT, i, (LPARAM)text); + if (!strcmp(txt2add, text)) + { + hasFound = true; + break; + } + } + } + + if (!hasFound) + { + if (!isUTF8) + i = ::SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)txt2add); + else + { + i = ::SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)wchars2Add); + } + } + + ::SendMessage(hCombo, CB_SETCURSEL, i, 0); +} + +string getTextFromCombo(HWND hCombo, bool isUnicode) +{ + char str[MAX_PATH]; + if (isUnicode) + { + WCHAR wchars[MAX_PATH]; + ::SendMessageW(hCombo, WM_GETTEXT, MAX_PATH, (LPARAM)wchars); + ::WideCharToMultiByte(CP_UTF8, 0, wchars, -1, str, 256, NULL, NULL); + } + else + { + ::SendMessage(hCombo, WM_GETTEXT, MAX_PATH, (LPARAM)str); + } + return string(str); +} +/* +// 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; +}; +*/ +// important : to activate all styles +const int STYLING_MASK = 255; + +void FindReplaceDlg::create(int dialogID, bool isRTL) +{ + StaticDialog::create(dialogID, isRTL); + _currentStatus = REPLACE_DLG; + + initOptionsFromDlg(); + + if ((NppParameters::getInstance())->isTransparentAvailable()) + { + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_CHECK), 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, 150); + if (!isCheckedOrNot(IDC_PERCENTAGE_SLIDER)) + ::EnableWindow(::GetDlgItem(_hSelf, IDC_PERCENTAGE_SLIDER), FALSE); + } + RECT rect; + //::GetWindowRect(_hSelf, &rect); + getClientRect(rect); + _tab.init(_hInst, _hSelf, false, false, true); + _tab.setFont("Tahoma", 13); + + const char *find = "Find"; + const char *replace = "Replace"; + const char *findInFiles = "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::updateCombos() +{ + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + HWND hReplaceCombo = ::GetDlgItem(_hSelf, IDREPLACEWITH); + addText2Combo(getTextFromCombo(hReplaceCombo, isUnicode).c_str(), hReplaceCombo, isUnicode); + + HWND hFindCombo = ::GetDlgItem(_hSelf, IDFINDWHAT); + addText2Combo(getTextFromCombo(hFindCombo, isUnicode).c_str(), hFindCombo, isUnicode); +} + +bool Finder::notify(SCNotification *notification) +{ + switch (notification->nmhdr.code) + { + case SCN_MARGINCLICK: + { + if (notification->margin == ScintillaEditView::_SC_MARGE_FOLDER) + { + _scintView.marginClick(notification->position, notification->modifiers); + } + break; + } + + case SCN_DOUBLECLICK : + { + try { + int currentPos = _scintView.execute(SCI_GETCURRENTPOS); + if (currentPos) + { + char prevChar = (char)_scintView.execute(SCI_GETCHARAT, currentPos - 1); + if (prevChar == 0x0A) + currentPos -= 2; + } + + int lno = _scintView.execute(SCI_LINEFROMPOSITION, currentPos); + int start = _scintView.execute(SCI_POSITIONFROMLINE, lno); + int end = _scintView.execute(SCI_GETLINEENDPOSITION, lno); + + if (_scintView.execute(SCI_GETFOLDLEVEL, lno) & SC_FOLDLEVELHEADERFLAG) + { + _scintView.execute(SCI_TOGGLEFOLD, lno); + _scintView.execute(SCI_SETCURRENTPOS, start); + _scintView.execute(SCI_SETANCHOR, start); + return false; + } + + // in getInfo() method the previous line is renew as current for next call + const FoundInfo &fInfo = getInfo(lno); + + int markedLine = getCurrentMarkedLine(); + + // now we clean the previous mark + if (markedLine != -1) + (*_ppEditView)->execute(SCI_MARKERDELETE, markedLine, MARK_SYMBOLE); + + // After cleaning the previous mark, we can swich to another document + + int cmd = getMode()==FILES_IN_DIR?WM_DOOPEN:NPPM_SWITCHTOFILE; + + ::SendMessage(::GetParent(_hParent), cmd, 0, (LPARAM)fInfo._fullPath.c_str()); + (*_ppEditView)->execute(SCI_SETSEL, fInfo._start, fInfo._end); + + // we set the current mark here + int nb = (*_ppEditView)->getCurrentLineNumber(); + setCurrentMarkedLine(nb); + (*_ppEditView)->execute(SCI_MARKERADD, nb, MARK_SYMBOLE); + + // Then we colourise the double clicked line + setFinderStyle(); + _scintView.showMargin(ScintillaEditView::_SC_MARGE_FOLDER, true); + _scintView.execute(SCI_SETLEXER, SCLEX_NULL); + _scintView.execute(SCI_STYLESETEOLFILLED, SCE_SEARCHRESULT_KWORD3, true); + + // + _scintView.execute(SCI_STARTSTYLING, start, STYLING_MASK); + _scintView.execute(SCI_SETSTYLING, end - start + 2, SCE_SEARCHRESULT_KWORD3); + _scintView.execute(SCI_COLOURISE, start, end + 1); + _scintView.execute(SCI_SETCURRENTPOS, start); + _scintView.execute(SCI_SETANCHOR, start); + return true; + + } catch(...){ + printStr("SCN_DOUBLECLICK problem"); + } + break; + } + + default : + break; + } + return false; +} + + +BOOL CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + + case WM_INITDIALOG : + { + // Wrap arround active by default + ::SendDlgItemMessage(_hSelf, IDWRAP, BM_SETCHECK, BST_CHECKED, 0); + if (_isRecursive) + ::SendDlgItemMessage(_hSelf, IDD_FINDINFILES_RECURSIVE_CHECK, BM_SETCHECK, BST_CHECKED, 0); + + 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, IDREPLACE)); + _findInFilesClosePos.left = p.x; + _findInFilesClosePos.top = p.y; + + p = getLeftTopPoint(::GetDlgItem(_hSelf, IDC_REPLACE_OPENEDFILES)); + _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); + (NppParameters::getInstance())->SetTransparent(_hSelf, percent); + } + return TRUE; + } +/* + case WM_SIZE: + { + //resizeFinder(); + //resizeStatusBar(); + return FALSE; + } +*/ + 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); + if ((DIALOG_TYPE)indexClicked == FINDINFILES_DLG) + { + char currentDir[MAX_PATH]; + ::GetCurrentDirectory(MAX_PATH, currentDir); + setFindInFilesDirFilter(currentDir, NULL); + } + } + return TRUE; + } + break; + } + case WM_ACTIVATE : + { + CharacterRange cr = (*_ppEditView)->getSelection(); + bool isSelected = (cr.cpMax - cr.cpMin) != 0; + if (!isSelected) + { + ::SendDlgItemMessage(_hSelf, IDC_IN_SELECTION_CHECK, BM_SETCHECK, BST_UNCHECKED, 0); + _isInSelection = false; + } + ::EnableWindow(::GetDlgItem(_hSelf, IDC_IN_SELECTION_CHECK), isSelected); + return TRUE; + } + case NPPM_MODELESSDIALOG : + return ::SendMessage(_hParent, NPPM_MODELESSDIALOG, wParam, lParam); + + case WM_COMMAND : + { + switch (wParam) + { + case IDCANCEL : // Close + display(false); + return TRUE; + + case IDOK : // Find Next + { + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + HWND hFindCombo = ::GetDlgItem(_hSelf, IDFINDWHAT); + string str2Search = getTextFromCombo(hFindCombo, isUnicode); + addText2Combo(str2Search.c_str(), hFindCombo, isUnicode); + processFindNext(str2Search.c_str()); + } + return TRUE; + + case IDREPLACE : + { + updateCombos(); + + processReplace(); + return TRUE; + } + + case IDREPLACEALL : + { + updateCombos(); + + (*_ppEditView)->execute(SCI_BEGINUNDOACTION); + int nbReplaced = processAll(REPLACE_ALL); + (*_ppEditView)->execute(SCI_ENDUNDOACTION); + + char result[64]; + if (nbReplaced < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbReplaced, result, 10); + strcat(result, " tokens are replaced."); + } + ::MessageBox(_hSelf, result, "", MB_OK); + return TRUE; + } + + case IDC_REPLACE_OPENEDFILES : + updateCombos(); + replaceAllInOpenedDocs(); + return TRUE; + + case IDC_FINDALL_OPENEDFILES : + updateCombo(IDFINDWHAT); + findAllIn(ALL_OPEN_DOCS); + return TRUE; + + case IDD_FINDINFILES_GOBACK_BUTTON : + doDialog(FIND_DLG); + return TRUE; + + case IDC_GETCURRENTDOCTYPE : + *((LangType *)lParam) = (*_ppEditView)->getCurrentDocType(); + return TRUE; + + case IDCMARKALL : + { + updateCombo(IDFINDWHAT); + int nbMarked = processAll(MARK_ALL); + char result[64]; + if (nbMarked < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbMarked, result, 10); + strcat(result, " tokens are found and marked"); + } + + ::MessageBox(_hSelf, result, "", MB_OK); + return TRUE; + } + + case IDC_CLEAR_ALL : + { + LangType lt = (*_ppEditView)->getCurrentDocType(); + if (lt == L_TXT) + (*_ppEditView)->defineDocType(L_CPP); + (*_ppEditView)->defineDocType(lt); + (*_ppEditView)->execute(SCI_MARKERDELETEALL, MARK_SYMBOLE); + return TRUE; + } + + case IDCCOUNTALL : + { + int nbCounted = processAll(COUNT_ALL); + char result[64]; + if (nbCounted < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbCounted, result, 10); + strcat(result, " tokens are found."); + } + ::MessageBox(_hSelf, result, "", MB_OK); + return TRUE; + } + + case IDWHOLEWORD : + _options._isWholeWord = isCheckedOrNot(IDWHOLEWORD); + return TRUE; + + case IDMATCHCASE : + _options._isMatchCase = isCheckedOrNot(IDMATCHCASE); + return TRUE; + + case IDREGEXP : + _options._isRegExp = isCheckedOrNot(IDREGEXP); + + if (_options._isRegExp) + _options._isWholeWord = false; + ::SendDlgItemMessage(_hSelf, IDWHOLEWORD, BM_SETCHECK, _options._isWholeWord?BST_CHECKED:BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDWHOLEWORD), (BOOL)!_options._isRegExp); + + ::SendDlgItemMessage(_hSelf, IDDIRECTIONUP, BM_SETCHECK, BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDDIRECTIONUP), (BOOL)!_options._isRegExp); + ::SendDlgItemMessage(_hSelf, IDDIRECTIONDOWN, BM_SETCHECK, BST_CHECKED, 0); + _options._whichDirection = DIR_DOWN; + return TRUE; + + case IDWRAP : + _options._isWrapAround = isCheckedOrNot(IDWRAP); + return TRUE; + + case IDDIRECTIONUP : + case IDDIRECTIONDOWN : + _options._whichDirection = (BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, IDDIRECTIONDOWN), BM_GETCHECK, BST_CHECKED, 0)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_STATIC), (BOOL)(_options._whichDirection == DIR_DOWN)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_TOP), (BOOL)(_options._whichDirection == DIR_DOWN)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_MIDDLE), (BOOL)(_options._whichDirection == DIR_DOWN)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_BOTTOM), (BOOL)(_options._whichDirection == DIR_DOWN)); + return TRUE; + + case IDC_PURGE_CHECK : + _doPurge = isCheckedOrNot(IDC_PURGE_CHECK); + return TRUE; + + case IDC_MARKLINE_CHECK : + _doMarkLine = isCheckedOrNot(IDC_MARKLINE_CHECK); + ::EnableWindow(::GetDlgItem(_hSelf, IDCMARKALL), (_doMarkLine || _doStyleFoundToken)); + return TRUE; + + case IDC_STYLEFOUND_CHECK : + _doStyleFoundToken = isCheckedOrNot(IDC_STYLEFOUND_CHECK); + ::EnableWindow(::GetDlgItem(_hSelf, IDCMARKALL), (_doMarkLine || _doStyleFoundToken)); + return TRUE; + + case IDC_IN_SELECTION_CHECK : + _isInSelection = isCheckedOrNot(IDC_IN_SELECTION_CHECK); + return TRUE; + + case IDC_TRANSPARENT_CHECK : + { + bool isChecked = isCheckedOrNot(IDC_TRANSPARENT_CHECK); + if (isChecked) + { + int percent = ::SendDlgItemMessage(_hSelf, IDC_PERCENTAGE_SLIDER, TBM_GETPOS, 0, 0); + (NppParameters::getInstance())->SetTransparent(_hSelf, percent); + } + else + (NppParameters::getInstance())->removeTransparent(_hSelf); + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_PERCENTAGE_SLIDER), isChecked); + return TRUE; + } + + // + // Find in Files + // + + case IDD_FINDINFILES_FIND_BUTTON : + { + char filters[256]; + char directory[MAX_PATH]; + ::GetDlgItemText(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filters, sizeof(filters)); + addText2Combo(filters, ::GetDlgItem(_hSelf, IDD_FINDINFILES_FILTERS_COMBO)); + _filters = filters; + + ::GetDlgItemText(_hSelf, IDD_FINDINFILES_DIR_COMBO, directory, sizeof(directory)); + addText2Combo(directory, ::GetDlgItem(_hSelf, IDD_FINDINFILES_DIR_COMBO)); + _directory = directory; + + if ((strlen(directory) > 0) && (directory[strlen(directory)-1] != '\\')) + _directory += "\\"; + + //::SendMessage(_hParent, WM_COMMAND, IDC_FINDINFILES_LAUNCH, 0); + updateCombo(IDFINDWHAT); + + // thread to launch : + findAllIn(FILES_IN_DIR); + +//Thread + //HANDLE hEvent = ::CreateEvent(NULL, FALSE, FALSE, "findInFilesEvent"); + //--HANDLE hFindInFilesThread = ::CreateThread(NULL, 0, staticFindInFilesFunc, this, 0, NULL); + + + //::WaitForSingleObject(hEvent, INFINITE); + + //::CloseHandle(hFindInFilesThread); + //::CloseHandle(hEvent); + //::MessageBox(NULL, "Fin de thread", "", MB_OK); + + //display(false); + return TRUE; + } + + case IDD_FINDINFILES_RECURSIVE_CHECK : + { + _isRecursive = isCheckedOrNot(IDD_FINDINFILES_RECURSIVE_CHECK); + return TRUE; + } + + case IDD_FINDINFILES_BROWSE_BUTTON : + { + folderBrowser(_hSelf, IDD_FINDINFILES_DIR_COMBO); + return TRUE; + } + default : + break; + } + } + } + return FALSE; +} + +// return value : +// true : the text2find is found +// false : the text2find is not found +bool FindReplaceDlg::processFindNext(const char *txt2find, FindOption *options) +{ + if (!txt2find || !txt2find[0]) + return false; + + const char *pText = txt2find; + FindOption *pOptions = options?options:&_options; + + int docLength = int((*_ppEditView)->execute(SCI_GETLENGTH)); + CharacterRange cr = (*_ppEditView)->getSelection(); + + int startPosition = cr.cpMax; + int endPosition = docLength; + + if (pOptions->_whichDirection == DIR_UP) + { + startPosition = cr.cpMin - 1; + endPosition = 0; + } + + if (pOptions->_isIncremental) + { + startPosition = 0; + endPosition = docLength; + } + + int flags = (pOptions->_isWholeWord ? SCFIND_WHOLEWORD : 0) | + (pOptions->_isMatchCase ? SCFIND_MATCHCASE : 0) | + (pOptions->_isRegExp ? SCFIND_REGEXP|SCFIND_POSIX : 0); + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + + + //char translatedText[FIND_REPLACE_STR_MAX]; + + /* + if (_isRegExp) + { + formatType f = (*_ppEditView)->getCurrentBuffer().getFormat(); + pText = translate2SlashN(translatedText, f); + } + */ + + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, strlen(pText), (LPARAM)pText)); + if (posFind == -1) //return; + { + if (pOptions->_isWrapAround) + { + if (pOptions->_whichDirection == DIR_DOWN) + { + startPosition = 0; + endPosition = docLength; + } + else + { + startPosition = docLength; + endPosition = 0; + } + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, strlen(pText), (LPARAM)pText)); + if (posFind == -1) + { + if (pOptions->_isIncremental) + return false; + + ::MessageBox(_hSelf, "Can't find the word", "Find", MB_OK); + // if the dialog is not shown, pass the focus to his parent(ie. Notepad++) + if (!::IsWindowVisible(_hSelf)) + ::SetFocus((*_ppEditView)->getHSelf()); + + return false; + } + int start = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int end = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + (*_ppEditView)->execute(SCI_SETSEL, start, end); + + // to make sure the found result is visible + int lineno = (*_ppEditView)->getCurrentLineNumber(); + (*_ppEditView)->execute(SCI_ENSUREVISIBLEENFORCEPOLICY, lineno); + } + else + { + if (pOptions->_isIncremental) + return false; + + ::MessageBox(_hSelf, "Can't find the word", "Find", MB_OK); + + // if the dialog is not shown, pass the focus to his parent(ie. Notepad++) + if (!::IsWindowVisible(_hSelf)) + ::SetFocus((*_ppEditView)->getHSelf()); + + return false; + } + } + + + int start = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int end = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + + int displayPos = getDisplayPos(); + (*_ppEditView)->execute(SCI_SETSEL, start, end); + + // to make sure the found result is visible + int lineno = (*_ppEditView)->getCurrentLineNumber(); + (*_ppEditView)->execute(SCI_ENSUREVISIBLEENFORCEPOLICY, lineno); + + if ((displayPos != DISPLAY_POS_BOTTOM) && (_options._whichDirection == DIR_DOWN)) + { + int firstVisibleLine = (*_ppEditView)->execute(EM_GETFIRSTVISIBLELINE); + int currentlineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, posFind); + int nbColumn2Scroll; + + if (displayPos == DISPLAY_POS_TOP) + nbColumn2Scroll = currentlineNumber-firstVisibleLine; + else //(displayPos == DISPLAY_POS_MIDDLE) + nbColumn2Scroll = (currentlineNumber-firstVisibleLine)/2; + + (*_ppEditView)->scroll(0, nbColumn2Scroll); + } + 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() +{ + if ((*_ppEditView)->getCurrentBuffer().isReadOnly()) return false; + + //getSearchTexts(); + //getReplaceTexts(); + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + string str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDFINDWHAT), isUnicode); + if (str2Search == "") + return false; + + string str2Relace = getTextFromCombo(::GetDlgItem(_hSelf, IDREPLACEWITH), isUnicode); + + + int flags = (_options._isWholeWord ? SCFIND_WHOLEWORD : 0) | + (_options._isMatchCase ? SCFIND_MATCHCASE : 0) | + (_options._isRegExp ? SCFIND_REGEXP|SCFIND_POSIX : 0); + + CharacterRange cr = (*_ppEditView)->getSelection(); + + (*_ppEditView)->execute(SCI_SETTARGETSTART, cr.cpMin); + (*_ppEditView)->execute(SCI_SETTARGETEND, cr.cpMax); + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, (WPARAM)str2Search.length(), (LPARAM)str2Search.c_str())); + + if (posFind != -1) + { + if (_options._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)->execute(SCI_REPLACETARGETRE, str2Relace.length(), (LPARAM)str2Relace.c_str()); + + if (!foundTextLen) + (*_ppEditView)->execute(SCI_SETSEL, start, start + replacedLen); + } + else + { + (*_ppEditView)->execute(SCI_REPLACESEL, str2Relace.length(), (LPARAM)str2Relace.c_str()); + } + } + return processFindNext(str2Search.c_str()); +} + +int FindReplaceDlg::markAll(const char *str2find) +{ + _doStyleFoundToken = true; + + int nbFound = processAll(MARK_ALL, true, NULL, str2find); + + return nbFound; +} + +int FindReplaceDlg::processAll(int op, bool isEntire, const char *fileName, const char *str2find) +{ + int nbReplaced = 0; + + if (!isCreated() && !str2find) return nbReplaced; + + if ((op == REPLACE_ALL) && (*_ppEditView)->getCurrentBuffer().isReadOnly()) + return nbReplaced; + + FindOption *pOptions = &_options; + + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + string str2Search; + if (str2find) + str2Search = str2find; + else + str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDFINDWHAT), isUnicode); + string str2Relace = getTextFromCombo(::GetDlgItem(_hSelf, IDREPLACEWITH), isUnicode); + + int docLength = int((*_ppEditView)->execute(SCI_GETLENGTH)); + + CharacterRange cr = (*_ppEditView)->getSelection(); + + // Par default : + // direction : bas + // commence par : cursor pos + // fini par : fin doc + int startPosition = cr.cpMin; + int endPosition = docLength; + + + if (pOptions->_whichDirection == DIR_UP) + { + startPosition = cr.cpMax; + endPosition = 0; + } + + bool direction = pOptions->_whichDirection; + + if ((pOptions->_isWrapAround || isEntire) || (op == COUNT_ALL)) + { + startPosition = 0; + endPosition = docLength; + direction = DIR_DOWN; + } + + if ((_isInSelection) && ((op == MARK_ALL) || ((op == REPLACE_ALL) && (!isEntire)))) + { + CharacterRange cr = (*_ppEditView)->getSelection(); + startPosition = cr.cpMin; + endPosition = cr.cpMax; + } + + int flags = (pOptions->_isWholeWord ? SCFIND_WHOLEWORD : 0) | + (pOptions->_isMatchCase ? SCFIND_MATCHCASE : 0) | + (pOptions->_isRegExp ? SCFIND_REGEXP|SCFIND_POSIX : 0); + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + + if (op == MARK_ALL) + { + if (_doStyleFoundToken) + { + if (_doPurge) + { + LangType lt = (*_ppEditView)->getCurrentDocType(); + if (lt == L_TXT) + (*_ppEditView)->defineDocType(L_CPP); + (*_ppEditView)->defineDocType(lt); + } + (*_ppEditView)->execute(SCI_SETLEXER, SCLEX_NULL); + } + if ((_doMarkLine) && (_doPurge)) + { + (*_ppEditView)->execute(SCI_MARKERDELETEALL, MARK_SYMBOLE); + } + } + + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, (WPARAM)str2Search.length(), (LPARAM)str2Search.c_str())); + + if ((posFind != -1) && (op == FIND_ALL)) + { + const int fileNameLen = strlen(fileName); + + if (fileNameLen > _fileNameLenMax) + { + _fileNameLenMax = fileNameLen; + + delete [] _uniFileName; + _uniFileName = new char[(fileNameLen + 3) * 2 + 1]; + } + ascii_to_utf8(fileName, fileNameLen, _uniFileName); + _pFinder->addFileNameTitle(_uniFileName); + } + while (posFind != -1) + { + //int posFindBefore = posFind; + int start = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int end = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + int foundTextLen = (end >= start)?end - start:start - end; + + // Si on a trouvé une occurence vide, y'a un pb!!! + if (!foundTextLen) + return -1; + + if (op == REPLACE_ALL) + { + (*_ppEditView)->execute(SCI_SETTARGETSTART, start); + (*_ppEditView)->execute(SCI_SETTARGETEND, end); + int replacedLength = (*_ppEditView)->execute(pOptions->_isRegExp?SCI_REPLACETARGETRE:SCI_REPLACETARGET, (WPARAM)-1, (LPARAM)str2Relace.c_str()); + + startPosition = (direction == DIR_UP)?posFind - replacedLength:posFind + replacedLength; + if ((_isInSelection) && (!isEntire)) + { + endPosition = endPosition - foundTextLen + replacedLength; + } + else + { + if (direction == DIR_DOWN) + endPosition = docLength = docLength - foundTextLen + replacedLength; + } + } + else if (op == MARK_ALL) + { + if (_doStyleFoundToken) + { + (*_ppEditView)->execute(SCI_STARTSTYLING, start, STYLING_MASK); + (*_ppEditView)->execute(SCI_SETSTYLING, end - start, SCE_UNIVERSAL_FOUND_STYLE); + (*_ppEditView)->execute(SCI_COLOURISE, start, end+1); + } + + if (_doMarkLine) + { + int lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, posFind); + int state = (*_ppEditView)->execute(SCI_MARKERGET, lineNumber); + + if (!(state & (1 << MARK_SYMBOLE))) + (*_ppEditView)->execute(SCI_MARKERADD, lineNumber, MARK_SYMBOLE); + } + startPosition = (direction == DIR_UP)?posFind - foundTextLen:posFind + foundTextLen; + } + else if (op == COUNT_ALL) + { + startPosition = posFind + foundTextLen; + } + else if (op == FIND_ALL) + { + int lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, posFind); + int lend = (*_ppEditView)->execute(SCI_GETLINEENDPOSITION, lineNumber); + int lstart = (*_ppEditView)->execute(SCI_POSITIONFROMLINE, lineNumber); + int nbChar = lend - lstart; + bool isRealloc = false; + + if (_maxNbCharAllocated < nbChar) + { + isRealloc = true; + _maxNbCharAllocated = nbChar; + //if (_line) + delete [] _line; + _line = new char[_maxNbCharAllocated + 3]; + } + //char *line = new char[nbChar + 3]; + (*_ppEditView)->execute(SCI_GETLINE, lineNumber, (LPARAM)_line); + + _line[nbChar] = 0x0D; + _line[nbChar+1] = 0x0A; + _line[nbChar+2] = '\0'; + + const char *pLine; + if ((*_ppEditView)->getCurrentBuffer().getUnicodeMode() == uni8Bit) + { + //char *uniChars = new char[uniCharLen]; + if (isRealloc) + { + const int uniCharLen = (_maxNbCharAllocated + 3) * 2 + 1; + //if (_uniCharLine) + delete [] _uniCharLine; + _uniCharLine = new char[uniCharLen]; + } + ascii_to_utf8(_line, (nbChar + 3), _uniCharLine); +/* + const int fileNameLen = strlen(fileName); + + if (fileNameLen > _fileNameLenMax) + { + _fileNameLenMax = fileNameLen; + delete [] _uniFileName; + _uniFileName = new char[(fileNameLen + 3) * 2 + 1]; + } + ascii_to_utf8(fileName, fileNameLen, _uniFileName); +*/ + pLine = _uniCharLine; + //_pFinder->add(FoundInfo(start, end, _uniCharLine, _uniFileName, _pFinder->_lineCounter), lineNumber + 1); + } + else + { + pLine = _line; + } + _pFinder->add(FoundInfo(start, end, pLine, fileName, _pFinder->_lineCounter), lineNumber + 1); + + startPosition = posFind + foundTextLen; + } + else + return nbReplaced; + + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + + posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, (WPARAM)str2Search.length(), (LPARAM)str2Search.c_str())); + nbReplaced++; + } + + return nbReplaced; +} + +void FindReplaceDlg::replaceAllInOpenedDocs() +{ + ::SendMessage(_hParent, WM_REPLACEALL_INOPENEDDOC, 0, 0); +} + +void FindReplaceDlg::findAllIn(InWhat op) +{ + //HANDLE hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "findInFilesEvent"); + if (!_pFinder) + { + _pFinder = new Finder; + _pFinder->init(_hInst, _hSelf, _ppEditView); + + tTbData data = {0}; + _pFinder->create(&data); + // 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 = "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()); + _pFinder->_scintView.execute(SCI_SETCODEPAGE, SC_CP_UTF8); + _pFinder->_scintView.execute(SCI_USEPOPUP, FALSE); + + //_statusBar.init(_hInst, _hSelf, 0); + RECT findRect; + + //const int scintEditInitHeight = 130; + + // get the width of FindDlg + ::GetWindowRect(_pFinder->getHSelf(), &findRect); + + // overwrite some default settings + _pFinder->_scintView.showMargin(ScintillaEditView::_SC_MARGE_SYBOLE, false); + + _pFinder->_scintView.setMakerStyle(FOLDER_STYLE_SIMPLE); + + //_pFinder->_scintView.execute(SCI_SETZOOM, _pFinder->_scintView.execute(SCI_GETZOOM) - 2); + _pFinder->_scintView.display(); + _pFinder->display(); + } + _pFinder->setFinderStyle(); + _pFinder->setMode(op); + + ::SendMessage(_pFinder->getHSelf(), WM_SIZE, 0, 0); + ::SendMessage(_hParent, (op==ALL_OPEN_DOCS)?WM_FINDALL_INOPENEDDOC:WM_FINDINFILES, 0, (op!=ALL_OPEN_DOCS)?_isRecursive:0); + //char *pDataToWrite = _findAllResultStr + strlen(FIND_RESULT_DEFAULT_TITLE); + sprintf(_findAllResultStr, "%d hits", _findAllResult); + ::SendMessage(_hParent, NPPM_DMMSHOW, 0, (LPARAM)_pFinder->getHSelf()); +} + +void FindReplaceDlg::enableReplaceFunc(bool isEnable) +{ + _currentStatus = isEnable?REPLACE_DLG:FIND_DLG; + int hideOrShow = isEnable?SW_SHOW:SW_HIDE; + RECT *pClosePos = isEnable?&_replaceClosePos:&_findClosePos; + + //::EnableWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_FIND_BUTTON), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), TRUE); + 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_FINDINFILES),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_STATIC),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_TOP),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_MIDDLE),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_BOTTOM),!hideOrShow); + + gotoCorrectTab(); + + ::MoveWindow(::GetDlgItem(_hSelf, IDCANCEL), pClosePos->left, pClosePos->top, pClosePos->right, pClosePos->bottom, TRUE); + + char label[MAX_PATH]; + _tab.getCurrentTitle(label, sizeof(label)); + ::SetWindowText(_hSelf, label); +} + +void FindReplaceDlg::enableFindInFilesControls(bool isEnable) +{ + // Hide Items + ::ShowWindow(::GetDlgItem(_hSelf, IDWRAP), isEnable?SW_HIDE:SW_SHOW); + //::ShowWindow(::GetDlgItem(_hSelf, IDC_FINDINFILES), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDREPLACEWITH), 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, 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); + + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_STATIC), SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_TOP), SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_MIDDLE), SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_BOTTOM), SW_HIDE); + + // Show Items + ::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); + + char label[MAX_PATH]; + _tab.getCurrentTitle(label, sizeof(label)); + ::SetWindowText(_hSelf, label); +} + +void FindReplaceDlg::getPatterns(vector & patternVect) +{ + cutString(_filters.c_str(), patternVect); +} + +void Finder::setFinderStyle() +{ + StyleArray & stylers = (_scintView.getParameter())->getMiscStylerArray(); + int iStyleDefault = stylers.getStylerIndexByID(STYLE_DEFAULT); + if (iStyleDefault != -1) + { + Style & styleDefault = stylers.getStyler(iStyleDefault); + _scintView.setStyle(styleDefault._styleID, styleDefault._fgColor, styleDefault._bgColor, styleDefault._fontName, styleDefault._fontStyle, styleDefault._fontSize); + } + + _scintView.execute(SCI_STYLECLEARALL); + _scintView.execute(SCI_SETSTYLEBITS, 5); + _scintView.setSearchResultLexer(); + _scintView.execute(SCI_COLOURISE, 0, -1); + _scintView.execute(SCI_SETEOLMODE, SC_EOL_LF); +} + +BOOL CALLBACK Finder::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + /* + case WM_INITDIALOG : + { + goToCenter(); + return TRUE; + } +*/ + 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; + } + default : + { + break; + } + } + } + + case WM_CONTEXTMENU : + { + if (HWND(wParam) == _scintView.getHSelf()) + { + POINT p; + ::GetCursorPos(&p); + ContextMenu scintillaContextmenu; + vector tmp; + tmp.push_back(MenuItemUnit(NPPM_INTERNAL_SCINTILLAFINFERCOLLAPSE, "Collapse all")); + tmp.push_back(MenuItemUnit(NPPM_INTERNAL_SCINTILLAFINFERUNCOLLAPSE, "Uncollapse 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; +} + + + +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 : + 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; + + string str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode); + _pFRDlg->processFindNext(str2Search.c_str(), &fo); + } + return TRUE; + + case IDC_INCFINDTEXT : + if ((wParam >> 16) == 0x0300) + { + if (_doSearchFromBegin) + { + FindOption fo; + fo._isWholeWord = false; + fo._isIncremental = true; + fo._isMatchCase = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDMATCHCASE, BM_GETCHECK, 0, 0)); + + string str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode); + _pFRDlg->processFindNext(str2Search.c_str(), &fo); + } + else + _doSearchFromBegin = true; + } + return TRUE; + + } + } + } + return FALSE; +} + +void FindIncrementDlg::goToLowerLeft() +{ + RECT rc; + ::GetClientRect(_hParent, &rc); + //RECT rcSelf; + //::GetClientRect(_hSelf, &rcSelf); + int selfHeight = _rc.bottom - _rc.top; + int selfWidth = _rc.right - _rc.left; + + POINT llpoint; + llpoint.x = rc.left; + llpoint.y = rc.bottom - selfHeight; + ::ClientToScreen(_hParent, &llpoint); + + ::SetWindowPos(_hSelf, HWND_TOP, llpoint.x, llpoint.y, selfWidth, selfHeight, SWP_SHOWWINDOW); +} diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.aps b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.aps new file mode 100644 index 0000000000000000000000000000000000000000..6718d30b346a3e30bef6383f1a48f877827f49c8 GIT binary patch literal 43892 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 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp new file mode 100644 index 00000000..d717bf4b --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp @@ -0,0 +1,1277 @@ +//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 "common_func.h" +#include "UniConversion.h" + + + +void addText2Combo(const char * txt2add, HWND hCombo, bool isUTF8) +{ + if (!hCombo) return; + if (!strcmp(txt2add, "")) return; + + char text[MAX_PATH]; + WCHAR textW[MAX_PATH*2]; + + int count = ::SendMessage(hCombo, CB_GETCOUNT, 0, 0); + bool hasFound = false; + int i = 0; + + WCHAR wchars2Add[256]; + if (isUTF8) + ::MultiByteToWideChar(CP_UTF8, 0, txt2add, -1, wchars2Add, 256 / sizeof(WCHAR)); + + for ( ; i < count ; i++) + { + + if (isUTF8) + { + ::SendMessageW(hCombo, CB_GETLBTEXT, i, (LPARAM)textW); + if (!wcscmp(wchars2Add, textW)) + { + hasFound = true; + break; + } + } + else + { + ::SendMessage(hCombo, CB_GETLBTEXT, i, (LPARAM)text); + if (!strcmp(txt2add, text)) + { + hasFound = true; + break; + } + } + } + + if (!hasFound) + { + if (!isUTF8) + i = ::SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)txt2add); + else + { + i = ::SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)wchars2Add); + } + } + + ::SendMessage(hCombo, CB_SETCURSEL, i, 0); +} + +string getTextFromCombo(HWND hCombo, bool isUnicode) +{ + char str[MAX_PATH]; + if (isUnicode) + { + WCHAR wchars[MAX_PATH]; + ::SendMessageW(hCombo, WM_GETTEXT, MAX_PATH, (LPARAM)wchars); + ::WideCharToMultiByte(CP_UTF8, 0, wchars, -1, str, 256, NULL, NULL); + } + else + { + ::SendMessage(hCombo, WM_GETTEXT, MAX_PATH, (LPARAM)str); + } + return string(str); +} + +// important : to activate all styles +const int STYLING_MASK = 255; + +void FindReplaceDlg::create(int dialogID, bool isRTL) +{ + StaticDialog::create(dialogID, isRTL); + _currentStatus = REPLACE_DLG; + + initOptionsFromDlg(); + + if ((NppParameters::getInstance())->isTransparentAvailable()) + { + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_CHECK), 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, 150); + if (!isCheckedOrNot(IDC_PERCENTAGE_SLIDER)) + ::EnableWindow(::GetDlgItem(_hSelf, IDC_PERCENTAGE_SLIDER), FALSE); + } + RECT rect; + //::GetWindowRect(_hSelf, &rect); + getClientRect(rect); + _tab.init(_hInst, _hSelf, false, false, true); + _tab.setFont("Tahoma", 13); + + const char *find = "Find"; + const char *replace = "Replace"; + const char *findInFiles = "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::updateCombos() +{ + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + HWND hReplaceCombo = ::GetDlgItem(_hSelf, IDREPLACEWITH); + addText2Combo(getTextFromCombo(hReplaceCombo, isUnicode).c_str(), hReplaceCombo, isUnicode); + + HWND hFindCombo = ::GetDlgItem(_hSelf, IDFINDWHAT); + addText2Combo(getTextFromCombo(hFindCombo, isUnicode).c_str(), hFindCombo, isUnicode); +} + +bool Finder::notify(SCNotification *notification) +{ + switch (notification->nmhdr.code) + { + case SCN_MARGINCLICK: + { + if (notification->margin == ScintillaEditView::_SC_MARGE_FOLDER) + { + _scintView.marginClick(notification->position, notification->modifiers); + } + break; + } + + case SCN_DOUBLECLICK : + { + try { + int currentPos = _scintView.execute(SCI_GETCURRENTPOS); + if (currentPos) + { + char prevChar = (char)_scintView.execute(SCI_GETCHARAT, currentPos - 1); + if (prevChar == 0x0A) + currentPos -= 2; + } + + int lno = _scintView.execute(SCI_LINEFROMPOSITION, currentPos); + int start = _scintView.execute(SCI_POSITIONFROMLINE, lno); + int end = _scintView.execute(SCI_GETLINEENDPOSITION, lno); + + if (_scintView.execute(SCI_GETFOLDLEVEL, lno) & SC_FOLDLEVELHEADERFLAG) + { + _scintView.execute(SCI_TOGGLEFOLD, lno); + _scintView.execute(SCI_SETCURRENTPOS, start); + _scintView.execute(SCI_SETANCHOR, start); + return false; + } + + // in getInfo() method the previous line is renew as current for next call + const FoundInfo &fInfo = getInfo(lno); + + int markedLine = getCurrentMarkedLine(); + + // now we clean the previous mark + if (markedLine != -1) + (*_ppEditView)->execute(SCI_MARKERDELETE, markedLine, MARK_SYMBOLE); + + // After cleaning the previous mark, we can swich to another document + + int cmd = getMode()==FILES_IN_DIR?WM_DOOPEN:NPPM_SWITCHTOFILE; + + ::SendMessage(::GetParent(_hParent), cmd, 0, (LPARAM)fInfo._fullPath.c_str()); + (*_ppEditView)->execute(SCI_SETSEL, fInfo._start, fInfo._end); + + // we set the current mark here + int nb = (*_ppEditView)->getCurrentLineNumber(); + setCurrentMarkedLine(nb); + (*_ppEditView)->execute(SCI_MARKERADD, nb, MARK_SYMBOLE); + + // Then we colourise the double clicked line + setFinderStyle(); + _scintView.showMargin(ScintillaEditView::_SC_MARGE_FOLDER, true); + _scintView.execute(SCI_SETLEXER, SCLEX_NULL); + _scintView.execute(SCI_STYLESETEOLFILLED, SCE_SEARCHRESULT_KWORD3, true); + + // + _scintView.execute(SCI_STARTSTYLING, start, STYLING_MASK); + _scintView.execute(SCI_SETSTYLING, end - start + 2, SCE_SEARCHRESULT_KWORD3); + _scintView.execute(SCI_COLOURISE, start, end + 1); + _scintView.execute(SCI_SETCURRENTPOS, start); + _scintView.execute(SCI_SETANCHOR, start); + return true; + + } catch(...){ + printStr("SCN_DOUBLECLICK problem"); + } + break; + } + + default : + break; + } + return false; +} + + +BOOL CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + // Wrap arround active by default + ::SendDlgItemMessage(_hSelf, IDWRAP, BM_SETCHECK, BST_CHECKED, 0); + if (_isRecursive) + ::SendDlgItemMessage(_hSelf, IDD_FINDINFILES_RECURSIVE_CHECK, BM_SETCHECK, BST_CHECKED, 0); + + 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, IDREPLACE)); + _findInFilesClosePos.left = p.x; + _findInFilesClosePos.top = p.y; + + p = getLeftTopPoint(::GetDlgItem(_hSelf, IDC_REPLACE_OPENEDFILES)); + _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); + (NppParameters::getInstance())->SetTransparent(_hSelf, percent); + } + return TRUE; + } +/* + case WM_SIZE: + { + //resizeFinder(); + //resizeStatusBar(); + return FALSE; + } +*/ + 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); + if ((DIALOG_TYPE)indexClicked == FINDINFILES_DLG) + { + char currentDir[MAX_PATH]; + ::GetCurrentDirectory(MAX_PATH, currentDir); + setFindInFilesDirFilter(currentDir, NULL); + } + } + return TRUE; + } + break; + } + case WM_ACTIVATE : + { + CharacterRange cr = (*_ppEditView)->getSelection(); + bool isSelected = (cr.cpMax - cr.cpMin) != 0; + if (!isSelected) + { + ::SendDlgItemMessage(_hSelf, IDC_IN_SELECTION_CHECK, BM_SETCHECK, BST_UNCHECKED, 0); + _isInSelection = false; + } + ::EnableWindow(::GetDlgItem(_hSelf, IDC_IN_SELECTION_CHECK), isSelected); + return TRUE; + } + case NPPM_MODELESSDIALOG : + return ::SendMessage(_hParent, NPPM_MODELESSDIALOG, wParam, lParam); + + case WM_COMMAND : + { + switch (wParam) + { + case IDCANCEL : // Close + display(false); + return TRUE; + + case IDOK : // Find Next + { + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + HWND hFindCombo = ::GetDlgItem(_hSelf, IDFINDWHAT); + string str2Search = getTextFromCombo(hFindCombo, isUnicode); + addText2Combo(str2Search.c_str(), hFindCombo, isUnicode); + processFindNext(str2Search.c_str()); + } + return TRUE; + + case IDREPLACE : + { + updateCombos(); + + processReplace(); + return TRUE; + } + + case IDREPLACEALL : + { + updateCombos(); + + (*_ppEditView)->execute(SCI_BEGINUNDOACTION); + int nbReplaced = processAll(REPLACE_ALL); + (*_ppEditView)->execute(SCI_ENDUNDOACTION); + + char result[64]; + if (nbReplaced < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbReplaced, result, 10); + strcat(result, " tokens are replaced."); + } + ::MessageBox(_hSelf, result, "", MB_OK); + return TRUE; + } + + case IDC_REPLACE_OPENEDFILES : + updateCombos(); + replaceAllInOpenedDocs(); + return TRUE; + + case IDC_FINDALL_OPENEDFILES : + updateCombo(IDFINDWHAT); + findAllIn(ALL_OPEN_DOCS); + return TRUE; + + case IDD_FINDINFILES_GOBACK_BUTTON : + doDialog(FIND_DLG); + return TRUE; + + case IDC_GETCURRENTDOCTYPE : + *((LangType *)lParam) = (*_ppEditView)->getCurrentDocType(); + return TRUE; + + case IDCMARKALL : + { + updateCombo(IDFINDWHAT); + int nbMarked = processAll(MARK_ALL); + char result[64]; + if (nbMarked < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbMarked, result, 10); + strcat(result, " tokens are found and marked"); + } + + ::MessageBox(_hSelf, result, "", MB_OK); + return TRUE; + } + + case IDC_CLEAR_ALL : + { + LangType lt = (*_ppEditView)->getCurrentDocType(); + if (lt == L_TXT) + (*_ppEditView)->defineDocType(L_CPP); + (*_ppEditView)->defineDocType(lt); + (*_ppEditView)->execute(SCI_MARKERDELETEALL, MARK_SYMBOLE); + return TRUE; + } + + case IDCCOUNTALL : + { + int nbCounted = processAll(COUNT_ALL); + char result[64]; + if (nbCounted < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbCounted, result, 10); + strcat(result, " tokens are found."); + } + ::MessageBox(_hSelf, result, "", MB_OK); + return TRUE; + } + + case IDWHOLEWORD : + _options._isWholeWord = isCheckedOrNot(IDWHOLEWORD); + return TRUE; + + case IDMATCHCASE : + _options._isMatchCase = isCheckedOrNot(IDMATCHCASE); + return TRUE; + + case IDREGEXP : + _options._isRegExp = isCheckedOrNot(IDREGEXP); + + if (_options._isRegExp) + _options._isWholeWord = false; + ::SendDlgItemMessage(_hSelf, IDWHOLEWORD, BM_SETCHECK, _options._isWholeWord?BST_CHECKED:BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDWHOLEWORD), (BOOL)!_options._isRegExp); + + ::SendDlgItemMessage(_hSelf, IDDIRECTIONUP, BM_SETCHECK, BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDDIRECTIONUP), (BOOL)!_options._isRegExp); + ::SendDlgItemMessage(_hSelf, IDDIRECTIONDOWN, BM_SETCHECK, BST_CHECKED, 0); + _options._whichDirection = DIR_DOWN; + return TRUE; + + case IDWRAP : + _options._isWrapAround = isCheckedOrNot(IDWRAP); + return TRUE; + + case IDDIRECTIONUP : + case IDDIRECTIONDOWN : + _options._whichDirection = (BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, IDDIRECTIONDOWN), BM_GETCHECK, BST_CHECKED, 0)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_STATIC), (BOOL)(_options._whichDirection == DIR_DOWN)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_TOP), (BOOL)(_options._whichDirection == DIR_DOWN)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_MIDDLE), (BOOL)(_options._whichDirection == DIR_DOWN)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_BOTTOM), (BOOL)(_options._whichDirection == DIR_DOWN)); + return TRUE; + + case IDC_PURGE_CHECK : + _doPurge = isCheckedOrNot(IDC_PURGE_CHECK); + return TRUE; + + case IDC_MARKLINE_CHECK : + _doMarkLine = isCheckedOrNot(IDC_MARKLINE_CHECK); + ::EnableWindow(::GetDlgItem(_hSelf, IDCMARKALL), (_doMarkLine || _doStyleFoundToken)); + return TRUE; + + case IDC_STYLEFOUND_CHECK : + _doStyleFoundToken = isCheckedOrNot(IDC_STYLEFOUND_CHECK); + ::EnableWindow(::GetDlgItem(_hSelf, IDCMARKALL), (_doMarkLine || _doStyleFoundToken)); + return TRUE; + + case IDC_IN_SELECTION_CHECK : + _isInSelection = isCheckedOrNot(IDC_IN_SELECTION_CHECK); + return TRUE; + + case IDC_TRANSPARENT_CHECK : + { + bool isChecked = isCheckedOrNot(IDC_TRANSPARENT_CHECK); + if (isChecked) + { + int percent = ::SendDlgItemMessage(_hSelf, IDC_PERCENTAGE_SLIDER, TBM_GETPOS, 0, 0); + (NppParameters::getInstance())->SetTransparent(_hSelf, percent); + } + else + (NppParameters::getInstance())->removeTransparent(_hSelf); + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_PERCENTAGE_SLIDER), isChecked); + return TRUE; + } + + // + // Find in Files + // + + case IDD_FINDINFILES_FIND_BUTTON : + { + char filters[256]; + char directory[MAX_PATH]; + ::GetDlgItemText(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filters, sizeof(filters)); + addText2Combo(filters, ::GetDlgItem(_hSelf, IDD_FINDINFILES_FILTERS_COMBO)); + _filters = filters; + + ::GetDlgItemText(_hSelf, IDD_FINDINFILES_DIR_COMBO, directory, sizeof(directory)); + addText2Combo(directory, ::GetDlgItem(_hSelf, IDD_FINDINFILES_DIR_COMBO)); + _directory = directory; + + if ((strlen(directory) > 0) && (directory[strlen(directory)-1] != '\\')) + _directory += "\\"; + + //::SendMessage(_hParent, WM_COMMAND, IDC_FINDINFILES_LAUNCH, 0); + updateCombo(IDFINDWHAT); + + // thread to launch : + findAllIn(FILES_IN_DIR); + +//Thread + //HANDLE hEvent = ::CreateEvent(NULL, FALSE, FALSE, "findInFilesEvent"); + //--HANDLE hFindInFilesThread = ::CreateThread(NULL, 0, staticFindInFilesFunc, this, 0, NULL); + + + //::WaitForSingleObject(hEvent, INFINITE); + + //::CloseHandle(hFindInFilesThread); + //::CloseHandle(hEvent); + //::MessageBox(NULL, "Fin de thread", "", MB_OK); + + //display(false); + return TRUE; + } + + case IDD_FINDINFILES_RECURSIVE_CHECK : + { + _isRecursive = isCheckedOrNot(IDD_FINDINFILES_RECURSIVE_CHECK); + return TRUE; + } + + case IDD_FINDINFILES_BROWSE_BUTTON : + { + folderBrowser(_hSelf, IDD_FINDINFILES_DIR_COMBO); + return TRUE; + } + default : + break; + } + } + } + return FALSE; +} + +// return value : +// true : the text2find is found +// false : the text2find is not found +bool FindReplaceDlg::processFindNext(const char *txt2find, FindOption *options) +{ + if (!txt2find || !txt2find[0]) + return false; + + const char *pText = txt2find; + FindOption *pOptions = options?options:&_options; + + int docLength = int((*_ppEditView)->execute(SCI_GETLENGTH)); + CharacterRange cr = (*_ppEditView)->getSelection(); + + int startPosition = cr.cpMax; + int endPosition = docLength; + + if (pOptions->_whichDirection == DIR_UP) + { + startPosition = cr.cpMin - 1; + endPosition = 0; + } + + if (pOptions->_isIncremental) + { + startPosition = 0; + endPosition = docLength; + } + + int flags = (pOptions->_isWholeWord ? SCFIND_WHOLEWORD : 0) | + (pOptions->_isMatchCase ? SCFIND_MATCHCASE : 0) | + (pOptions->_isRegExp ? SCFIND_REGEXP|SCFIND_POSIX : 0); + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + + + //char translatedText[FIND_REPLACE_STR_MAX]; + + /* + if (_isRegExp) + { + formatType f = (*_ppEditView)->getCurrentBuffer().getFormat(); + pText = translate2SlashN(translatedText, f); + } + */ + + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, strlen(pText), (LPARAM)pText)); + if (posFind == -1) //return; + { + if (pOptions->_isWrapAround) + { + if (pOptions->_whichDirection == DIR_DOWN) + { + startPosition = 0; + endPosition = docLength; + } + else + { + startPosition = docLength; + endPosition = 0; + } + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, strlen(pText), (LPARAM)pText)); + if (posFind == -1) + { + if (pOptions->_isIncremental) + return false; + + ::MessageBox(_hSelf, "Can't find the word", "Find", MB_OK); + // if the dialog is not shown, pass the focus to his parent(ie. Notepad++) + if (!::IsWindowVisible(_hSelf)) + ::SetFocus((*_ppEditView)->getHSelf()); + + return false; + } + int start = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int end = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + (*_ppEditView)->execute(SCI_SETSEL, start, end); + + // to make sure the found result is visible + int lineno = (*_ppEditView)->getCurrentLineNumber(); + (*_ppEditView)->execute(SCI_ENSUREVISIBLEENFORCEPOLICY, lineno); + } + else + { + if (pOptions->_isIncremental) + return false; + + ::MessageBox(_hSelf, "Can't find the word", "Find", MB_OK); + + // if the dialog is not shown, pass the focus to his parent(ie. Notepad++) + if (!::IsWindowVisible(_hSelf)) + ::SetFocus((*_ppEditView)->getHSelf()); + + return false; + } + } + + + int start = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int end = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + + int displayPos = getDisplayPos(); + (*_ppEditView)->execute(SCI_SETSEL, start, end); + + // to make sure the found result is visible + int lineno = (*_ppEditView)->getCurrentLineNumber(); + (*_ppEditView)->execute(SCI_ENSUREVISIBLEENFORCEPOLICY, lineno); + + if ((displayPos != DISPLAY_POS_BOTTOM) && (_options._whichDirection == DIR_DOWN)) + { + int firstVisibleLine = (*_ppEditView)->execute(EM_GETFIRSTVISIBLELINE); + int currentlineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, posFind); + int nbColumn2Scroll; + + if (displayPos == DISPLAY_POS_TOP) + nbColumn2Scroll = currentlineNumber-firstVisibleLine; + else //(displayPos == DISPLAY_POS_MIDDLE) + nbColumn2Scroll = (currentlineNumber-firstVisibleLine)/2; + + (*_ppEditView)->scroll(0, nbColumn2Scroll); + } + 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() +{ + if ((*_ppEditView)->getCurrentBuffer().isReadOnly()) return false; + + //getSearchTexts(); + //getReplaceTexts(); + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + string str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDFINDWHAT), isUnicode); + if (str2Search == "") + return false; + + string str2Relace = getTextFromCombo(::GetDlgItem(_hSelf, IDREPLACEWITH), isUnicode); + + + int flags = (_options._isWholeWord ? SCFIND_WHOLEWORD : 0) | + (_options._isMatchCase ? SCFIND_MATCHCASE : 0) | + (_options._isRegExp ? SCFIND_REGEXP|SCFIND_POSIX : 0); + + CharacterRange cr = (*_ppEditView)->getSelection(); + + (*_ppEditView)->execute(SCI_SETTARGETSTART, cr.cpMin); + (*_ppEditView)->execute(SCI_SETTARGETEND, cr.cpMax); + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, (WPARAM)str2Search.length(), (LPARAM)str2Search.c_str())); + + if (posFind != -1) + { + if (_options._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)->execute(SCI_REPLACETARGETRE, str2Relace.length(), (LPARAM)str2Relace.c_str()); + + if (!foundTextLen) + (*_ppEditView)->execute(SCI_SETSEL, start, start + replacedLen); + } + else + { + (*_ppEditView)->execute(SCI_REPLACESEL, str2Relace.length(), (LPARAM)str2Relace.c_str()); + } + } + return processFindNext(str2Search.c_str()); +} + +int FindReplaceDlg::markAll(const char *str2find) +{ + _doStyleFoundToken = true; + + int nbFound = processAll(MARK_ALL, true, NULL, str2find); + + return nbFound; +} + +int FindReplaceDlg::processAll(int op, bool isEntire, const char *fileName, const char *str2find) +{ + int nbReplaced = 0; + + if (!isCreated() && !str2find) return nbReplaced; + + if ((op == REPLACE_ALL) && (*_ppEditView)->getCurrentBuffer().isReadOnly()) + return nbReplaced; + + FindOption *pOptions = &_options; + + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + string str2Search; + if (str2find) + str2Search = str2find; + else + str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDFINDWHAT), isUnicode); + string str2Relace = getTextFromCombo(::GetDlgItem(_hSelf, IDREPLACEWITH), isUnicode); + + int docLength = int((*_ppEditView)->execute(SCI_GETLENGTH)); + + CharacterRange cr = (*_ppEditView)->getSelection(); + + // Par default : + // direction : bas + // commence par : cursor pos + // fini par : fin doc + int startPosition = cr.cpMin; + int endPosition = docLength; + + + if (pOptions->_whichDirection == DIR_UP) + { + startPosition = cr.cpMax; + endPosition = 0; + } + + bool direction = pOptions->_whichDirection; + + if ((pOptions->_isWrapAround || isEntire) || (op == COUNT_ALL)) + { + startPosition = 0; + endPosition = docLength; + direction = DIR_DOWN; + } + + if ((_isInSelection) && ((op == MARK_ALL) || ((op == REPLACE_ALL) && (!isEntire)))) + { + CharacterRange cr = (*_ppEditView)->getSelection(); + startPosition = cr.cpMin; + endPosition = cr.cpMax; + } + + int flags = (pOptions->_isWholeWord ? SCFIND_WHOLEWORD : 0) | + (pOptions->_isMatchCase ? SCFIND_MATCHCASE : 0) | + (pOptions->_isRegExp ? SCFIND_REGEXP|SCFIND_POSIX : 0); + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + + if (op == MARK_ALL) + { + if (_doStyleFoundToken) + { + if (_doPurge) + { + LangType lt = (*_ppEditView)->getCurrentDocType(); + if (lt == L_TXT) + (*_ppEditView)->defineDocType(L_CPP); + (*_ppEditView)->defineDocType(lt); + } + (*_ppEditView)->execute(SCI_SETLEXER, SCLEX_NULL); + } + if ((_doMarkLine) && (_doPurge)) + { + (*_ppEditView)->execute(SCI_MARKERDELETEALL, MARK_SYMBOLE); + } + } + + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, (WPARAM)str2Search.length(), (LPARAM)str2Search.c_str())); + + if ((posFind != -1) && (op == FIND_ALL)) + { + const int fileNameLen = strlen(fileName); + + if (fileNameLen > _fileNameLenMax) + { + _fileNameLenMax = fileNameLen; + + delete [] _uniFileName; + _uniFileName = new char[(fileNameLen + 3) * 2 + 1]; + } + ascii_to_utf8(fileName, fileNameLen, _uniFileName); + _pFinder->addFileNameTitle(_uniFileName); + } + while (posFind != -1) + { + //int posFindBefore = posFind; + int start = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int end = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + int foundTextLen = (end >= start)?end - start:start - end; + + // Si on a trouvé une occurence vide, y'a un pb!!! + if (!foundTextLen) + return -1; + + if (op == REPLACE_ALL) + { + (*_ppEditView)->execute(SCI_SETTARGETSTART, start); + (*_ppEditView)->execute(SCI_SETTARGETEND, end); + int replacedLength = (*_ppEditView)->execute(pOptions->_isRegExp?SCI_REPLACETARGETRE:SCI_REPLACETARGET, (WPARAM)-1, (LPARAM)str2Relace.c_str()); + + startPosition = (direction == DIR_UP)?posFind - replacedLength:posFind + replacedLength; + if ((_isInSelection) && (!isEntire)) + { + endPosition = endPosition - foundTextLen + replacedLength; + } + else + { + if (direction == DIR_DOWN) + endPosition = docLength = docLength - foundTextLen + replacedLength; + } + } + else if (op == MARK_ALL) + { + if (_doStyleFoundToken) + { + (*_ppEditView)->execute(SCI_STARTSTYLING, start, STYLING_MASK); + (*_ppEditView)->execute(SCI_SETSTYLING, end - start, SCE_UNIVERSAL_FOUND_STYLE); + (*_ppEditView)->execute(SCI_COLOURISE, start, end+1); + } + + if (_doMarkLine) + { + int lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, posFind); + int state = (*_ppEditView)->execute(SCI_MARKERGET, lineNumber); + + if (!(state & (1 << MARK_SYMBOLE))) + (*_ppEditView)->execute(SCI_MARKERADD, lineNumber, MARK_SYMBOLE); + } + startPosition = (direction == DIR_UP)?posFind - foundTextLen:posFind + foundTextLen; + } + else if (op == COUNT_ALL) + { + startPosition = posFind + foundTextLen; + } + else if (op == FIND_ALL) + { + int lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, posFind); + int lend = (*_ppEditView)->execute(SCI_GETLINEENDPOSITION, lineNumber); + int lstart = (*_ppEditView)->execute(SCI_POSITIONFROMLINE, lineNumber); + int nbChar = lend - lstart; + bool isRealloc = false; + + if (_maxNbCharAllocated < nbChar) + { + isRealloc = true; + _maxNbCharAllocated = nbChar; + //if (_line) + delete [] _line; + _line = new char[_maxNbCharAllocated + 3]; + } + //char *line = new char[nbChar + 3]; + (*_ppEditView)->execute(SCI_GETLINE, lineNumber, (LPARAM)_line); + + _line[nbChar] = 0x0D; + _line[nbChar+1] = 0x0A; + _line[nbChar+2] = '\0'; + + const char *pLine; + if ((*_ppEditView)->getCurrentBuffer().getUnicodeMode() == uni8Bit) + { + //char *uniChars = new char[uniCharLen]; + if (isRealloc) + { + const int uniCharLen = (_maxNbCharAllocated + 3) * 2 + 1; + //if (_uniCharLine) + delete [] _uniCharLine; + _uniCharLine = new char[uniCharLen]; + } + ascii_to_utf8(_line, (nbChar + 3), _uniCharLine); +/* + const int fileNameLen = strlen(fileName); + + if (fileNameLen > _fileNameLenMax) + { + _fileNameLenMax = fileNameLen; + delete [] _uniFileName; + _uniFileName = new char[(fileNameLen + 3) * 2 + 1]; + } + ascii_to_utf8(fileName, fileNameLen, _uniFileName); +*/ + pLine = _uniCharLine; + //_pFinder->add(FoundInfo(start, end, _uniCharLine, _uniFileName, _pFinder->_lineCounter), lineNumber + 1); + } + else + { + pLine = _line; + } + _pFinder->add(FoundInfo(start, end, pLine, fileName, _pFinder->_lineCounter), lineNumber + 1); + + startPosition = posFind + foundTextLen; + } + else + return nbReplaced; + + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + + posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, (WPARAM)str2Search.length(), (LPARAM)str2Search.c_str())); + nbReplaced++; + } + + return nbReplaced; +} + +void FindReplaceDlg::replaceAllInOpenedDocs() +{ + ::SendMessage(_hParent, WM_REPLACEALL_INOPENEDDOC, 0, 0); +} + +void FindReplaceDlg::findAllIn(InWhat op) +{ + //HANDLE hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "findInFilesEvent"); + if (!_pFinder) + { + _pFinder = new Finder; + _pFinder->init(_hInst, _hSelf, _ppEditView); + + tTbData data = {0}; + _pFinder->create(&data); + // 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 = "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()); + _pFinder->_scintView.execute(SCI_SETCODEPAGE, SC_CP_UTF8); + _pFinder->_scintView.execute(SCI_USEPOPUP, FALSE); + + //_statusBar.init(_hInst, _hSelf, 0); + RECT findRect; + + //const int scintEditInitHeight = 130; + + // get the width of FindDlg + ::GetWindowRect(_pFinder->getHSelf(), &findRect); + + // overwrite some default settings + _pFinder->_scintView.showMargin(ScintillaEditView::_SC_MARGE_SYBOLE, false); + + _pFinder->_scintView.setMakerStyle(FOLDER_STYLE_SIMPLE); + + //_pFinder->_scintView.execute(SCI_SETZOOM, _pFinder->_scintView.execute(SCI_GETZOOM) - 2); + _pFinder->_scintView.display(); + _pFinder->display(); + } + _pFinder->setFinderStyle(); + _pFinder->setMode(op); + + ::SendMessage(_pFinder->getHSelf(), WM_SIZE, 0, 0); + ::SendMessage(_hParent, (op==ALL_OPEN_DOCS)?WM_FINDALL_INOPENEDDOC:WM_FINDINFILES, 0, (op!=ALL_OPEN_DOCS)?_isRecursive:0); + //char *pDataToWrite = _findAllResultStr + strlen(FIND_RESULT_DEFAULT_TITLE); + sprintf(_findAllResultStr, "%d hits", _findAllResult); + ::SendMessage(_hParent, NPPM_DMMSHOW, 0, (LPARAM)_pFinder->getHSelf()); +} + +void FindReplaceDlg::enableReplaceFunc(bool isEnable) +{ + _currentStatus = isEnable?REPLACE_DLG:FIND_DLG; + int hideOrShow = isEnable?SW_SHOW:SW_HIDE; + RECT *pClosePos = isEnable?&_replaceClosePos:&_findClosePos; + + //::EnableWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_FIND_BUTTON), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), TRUE); + 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_FINDINFILES),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_STATIC),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_TOP),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_MIDDLE),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_BOTTOM),!hideOrShow); + + gotoCorrectTab(); + + ::MoveWindow(::GetDlgItem(_hSelf, IDCANCEL), pClosePos->left, pClosePos->top, pClosePos->right, pClosePos->bottom, TRUE); + + char label[MAX_PATH]; + _tab.getCurrentTitle(label, sizeof(label)); + ::SetWindowText(_hSelf, label); +} + +void FindReplaceDlg::enableFindInFilesControls(bool isEnable) +{ + // Hide Items + ::ShowWindow(::GetDlgItem(_hSelf, IDWRAP), isEnable?SW_HIDE:SW_SHOW); + //::ShowWindow(::GetDlgItem(_hSelf, IDC_FINDINFILES), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDREPLACEWITH), 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, 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); + + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_STATIC), SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_TOP), SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_MIDDLE), SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_BOTTOM), SW_HIDE); + + // Show Items + ::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); + + char label[MAX_PATH]; + _tab.getCurrentTitle(label, sizeof(label)); + ::SetWindowText(_hSelf, label); +} + +void FindReplaceDlg::getPatterns(vector & patternVect) +{ + cutString(_filters.c_str(), patternVect); +} + +void Finder::setFinderStyle() +{ + StyleArray & stylers = (_scintView.getParameter())->getMiscStylerArray(); + int iStyleDefault = stylers.getStylerIndexByID(STYLE_DEFAULT); + if (iStyleDefault != -1) + { + Style & styleDefault = stylers.getStyler(iStyleDefault); + _scintView.setStyle(styleDefault._styleID, styleDefault._fgColor, styleDefault._bgColor, styleDefault._fontName, styleDefault._fontStyle, styleDefault._fontSize); + } + + _scintView.execute(SCI_STYLECLEARALL); + _scintView.execute(SCI_SETSTYLEBITS, 5); + _scintView.setSearchResultLexer(); + _scintView.execute(SCI_COLOURISE, 0, -1); + _scintView.execute(SCI_SETEOLMODE, SC_EOL_LF); +} + +BOOL CALLBACK Finder::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + /* + case WM_INITDIALOG : + { + goToCenter(); + return TRUE; + } +*/ + 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; + } + default : + { + break; + } + } + } + + case WM_CONTEXTMENU : + { + if (HWND(wParam) == _scintView.getHSelf()) + { + POINT p; + ::GetCursorPos(&p); + ContextMenu scintillaContextmenu; + vector tmp; + tmp.push_back(MenuItemUnit(NPPM_INTERNAL_SCINTILLAFINFERCOLLAPSE, "Collapse all")); + tmp.push_back(MenuItemUnit(NPPM_INTERNAL_SCINTILLAFINFERUNCOLLAPSE, "Uncollapse 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; +} + + + +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 : + 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; + + string str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode); + _pFRDlg->processFindNext(str2Search.c_str(), &fo); + } + return TRUE; + + case IDC_INCFINDTEXT : + if ((wParam >> 16) == 0x0300) + { + if (_doSearchFromBegin) + { + FindOption fo; + fo._isWholeWord = false; + fo._isIncremental = true; + fo._isMatchCase = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDMATCHCASE, BM_GETCHECK, 0, 0)); + + string str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode); + _pFRDlg->processFindNext(str2Search.c_str(), &fo); + } + else + _doSearchFromBegin = true; + } + return TRUE; + + } + } + } + return FALSE; +} + +void FindIncrementDlg::goToLowerLeft() +{ + RECT rc; + ::GetClientRect(_hParent, &rc); + //RECT rcSelf; + //::GetClientRect(_hSelf, &rcSelf); + int selfHeight = _rc.bottom - _rc.top; + int selfWidth = _rc.right - _rc.left; + + POINT llpoint; + llpoint.x = rc.left; + llpoint.y = rc.bottom - selfHeight; + ::ClientToScreen(_hParent, &llpoint); + + ::SetWindowPos(_hSelf, HWND_TOP, llpoint.x, llpoint.y, selfWidth, selfHeight, SWP_SHOWWINDOW); +} diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp.bak b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp.bak new file mode 100644 index 00000000..8d7870ec --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp.bak @@ -0,0 +1,1319 @@ +//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 "common_func.h" +#include "UniConversion.h" + + + +void addText2Combo(const char * txt2add, HWND hCombo, bool isUTF8) +{ + if (!hCombo) return; + if (!strcmp(txt2add, "")) return; + + char text[MAX_PATH]; + WCHAR textW[MAX_PATH*2]; + + int count = ::SendMessage(hCombo, CB_GETCOUNT, 0, 0); + bool hasFound = false; + int i = 0; + + WCHAR wchars2Add[256]; + if (isUTF8) + ::MultiByteToWideChar(CP_UTF8, 0, txt2add, -1, wchars2Add, 256 / sizeof(WCHAR)); + + for ( ; i < count ; i++) + { + + if (isUTF8) + { + ::SendMessageW(hCombo, CB_GETLBTEXT, i, (LPARAM)textW); + if (!wcscmp(wchars2Add, textW)) + { + hasFound = true; + break; + } + } + else + { + ::SendMessage(hCombo, CB_GETLBTEXT, i, (LPARAM)text); + if (!strcmp(txt2add, text)) + { + hasFound = true; + break; + } + } + } + + if (!hasFound) + { + if (!isUTF8) + i = ::SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)txt2add); + else + { + i = ::SendMessageW(hCombo, CB_ADDSTRING, 0, (LPARAM)wchars2Add); + } + } + + ::SendMessage(hCombo, CB_SETCURSEL, i, 0); +} + +string getTextFromCombo(HWND hCombo, bool isUnicode) +{ + char str[MAX_PATH]; + if (isUnicode) + { + WCHAR wchars[MAX_PATH]; + ::SendMessageW(hCombo, WM_GETTEXT, MAX_PATH, (LPARAM)wchars); + ::WideCharToMultiByte(CP_UTF8, 0, wchars, -1, str, 256, NULL, NULL); + } + else + { + ::SendMessage(hCombo, WM_GETTEXT, MAX_PATH, (LPARAM)str); + } + return string(str); +} + +// important : to activate all styles +const int STYLING_MASK = 255; + +void FindReplaceDlg::create(int dialogID, bool isRTL) +{ + StaticDialog::create(dialogID, isRTL); + _currentStatus = REPLACE_DLG; + + initOptionsFromDlg(); + + if ((NppParameters::getInstance())->isTransparentAvailable()) + { + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_CHECK), 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, 150); + if (!isCheckedOrNot(IDC_PERCENTAGE_SLIDER)) + ::EnableWindow(::GetDlgItem(_hSelf, IDC_PERCENTAGE_SLIDER), FALSE); + } + RECT rect; + //::GetWindowRect(_hSelf, &rect); + getClientRect(rect); + _tab.init(_hInst, _hSelf, false, false, true); + _tab.setFont("Tahoma", 13); + + const char *find = "Find"; + const char *replace = "Replace"; + const char *findInFiles = "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::updateCombos() +{ + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + HWND hReplaceCombo = ::GetDlgItem(_hSelf, IDREPLACEWITH); + addText2Combo(getTextFromCombo(hReplaceCombo, isUnicode).c_str(), hReplaceCombo, isUnicode); + + HWND hFindCombo = ::GetDlgItem(_hSelf, IDFINDWHAT); + addText2Combo(getTextFromCombo(hFindCombo, isUnicode).c_str(), hFindCombo, isUnicode); +} + +bool Finder::notify(SCNotification *notification) +{ + switch (notification->nmhdr.code) + { + case SCN_MARGINCLICK: + { + if (notification->margin == ScintillaEditView::_SC_MARGE_FOLDER) + { + _scintView.marginClick(notification->position, notification->modifiers); + } + break; + } + + case SCN_DOUBLECLICK : + { + try { + int currentPos = _scintView.execute(SCI_GETCURRENTPOS); + if (currentPos) + { + char prevChar = (char)_scintView.execute(SCI_GETCHARAT, currentPos - 1); + if (prevChar == 0x0A) + currentPos -= 2; + } + + int lno = _scintView.execute(SCI_LINEFROMPOSITION, currentPos); + int start = _scintView.execute(SCI_POSITIONFROMLINE, lno); + int end = _scintView.execute(SCI_GETLINEENDPOSITION, lno); + + if (_scintView.execute(SCI_GETFOLDLEVEL, lno) & SC_FOLDLEVELHEADERFLAG) + { + _scintView.execute(SCI_TOGGLEFOLD, lno); + _scintView.execute(SCI_SETCURRENTPOS, start); + _scintView.execute(SCI_SETANCHOR, start); + return false; + } + + // in getInfo() method the previous line is renew as current for next call + const FoundInfo &fInfo = getInfo(lno); + + int markedLine = getCurrentMarkedLine(); + + // now we clean the previous mark + if (markedLine != -1) + (*_ppEditView)->execute(SCI_MARKERDELETE, markedLine, MARK_SYMBOLE); + + // After cleaning the previous mark, we can swich to another document + + int cmd = getMode()==FILES_IN_DIR?WM_DOOPEN:NPPM_SWITCHTOFILE; + + ::SendMessage(::GetParent(_hParent), cmd, 0, (LPARAM)fInfo._fullPath.c_str()); + (*_ppEditView)->execute(SCI_SETSEL, fInfo._start, fInfo._end); + + // we set the current mark here + int nb = (*_ppEditView)->getCurrentLineNumber(); + setCurrentMarkedLine(nb); + (*_ppEditView)->execute(SCI_MARKERADD, nb, MARK_SYMBOLE); + + // Then we colourise the double clicked line + setFinderStyle(); + _scintView.showMargin(ScintillaEditView::_SC_MARGE_FOLDER, true); + _scintView.execute(SCI_SETLEXER, SCLEX_NULL); + _scintView.execute(SCI_STYLESETEOLFILLED, SCE_SEARCHRESULT_KWORD3, true); + + // + _scintView.execute(SCI_STARTSTYLING, start, STYLING_MASK); + _scintView.execute(SCI_SETSTYLING, end - start + 2, SCE_SEARCHRESULT_KWORD3); + _scintView.execute(SCI_COLOURISE, start, end + 1); + _scintView.execute(SCI_SETCURRENTPOS, start); + _scintView.execute(SCI_SETANCHOR, start); + return true; + + } catch(...){ + printStr("SCN_DOUBLECLICK problem"); + } + break; + } + + default : + break; + } + return false; +} + + +BOOL CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + // Wrap arround active by default + ::SendDlgItemMessage(_hSelf, IDWRAP, BM_SETCHECK, BST_CHECKED, 0); + if (_isRecursive) + ::SendDlgItemMessage(_hSelf, IDD_FINDINFILES_RECURSIVE_CHECK, BM_SETCHECK, BST_CHECKED, 0); + + 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, IDREPLACE)); + _findInFilesClosePos.left = p.x; + _findInFilesClosePos.top = p.y; + + p = getLeftTopPoint(::GetDlgItem(_hSelf, IDC_REPLACE_OPENEDFILES)); + _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); + (NppParameters::getInstance())->SetTransparent(_hSelf, percent); + } + return TRUE; + } +/* + case WM_SIZE: + { + //resizeFinder(); + //resizeStatusBar(); + return FALSE; + } +*/ + 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); + if ((DIALOG_TYPE)indexClicked == FINDINFILES_DLG) + { + char currentDir[MAX_PATH]; + ::GetCurrentDirectory(MAX_PATH, currentDir); + setFindInFilesDirFilter(currentDir, NULL); + } + } + return TRUE; + } + break; + } + case WM_ACTIVATE : + { + CharacterRange cr = (*_ppEditView)->getSelection(); + bool isSelected = (cr.cpMax - cr.cpMin) != 0; + if (!isSelected) + { + ::SendDlgItemMessage(_hSelf, IDC_IN_SELECTION_CHECK, BM_SETCHECK, BST_UNCHECKED, 0); + _isInSelection = false; + } + ::EnableWindow(::GetDlgItem(_hSelf, IDC_IN_SELECTION_CHECK), isSelected); + return TRUE; + } + case NPPM_MODELESSDIALOG : + return ::SendMessage(_hParent, NPPM_MODELESSDIALOG, wParam, lParam); + + case WM_COMMAND : + { + switch (wParam) + { + case IDCANCEL : // Close + display(false); + return TRUE; + + case IDOK : // Find Next + { + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + HWND hFindCombo = ::GetDlgItem(_hSelf, IDFINDWHAT); + string str2Search = getTextFromCombo(hFindCombo, isUnicode); + addText2Combo(str2Search.c_str(), hFindCombo, isUnicode); + processFindNext(str2Search.c_str()); + } + return TRUE; + + case IDREPLACE : + { + updateCombos(); + + processReplace(); + return TRUE; + } + + case IDREPLACEALL : + { + updateCombos(); + + (*_ppEditView)->execute(SCI_BEGINUNDOACTION); + int nbReplaced = processAll(REPLACE_ALL); + (*_ppEditView)->execute(SCI_ENDUNDOACTION); + + char result[64]; + if (nbReplaced < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbReplaced, result, 10); + strcat(result, " tokens are replaced."); + } + ::MessageBox(_hSelf, result, "", MB_OK); + return TRUE; + } + + case IDC_REPLACE_OPENEDFILES : + updateCombos(); + replaceAllInOpenedDocs(); + return TRUE; + + case IDC_FINDALL_OPENEDFILES : + updateCombo(IDFINDWHAT); + findAllIn(ALL_OPEN_DOCS); + return TRUE; + + case IDD_FINDINFILES_GOBACK_BUTTON : + doDialog(FIND_DLG); + return TRUE; + + case IDC_GETCURRENTDOCTYPE : + *((LangType *)lParam) = (*_ppEditView)->getCurrentDocType(); + return TRUE; + + case IDCMARKALL : + { + updateCombo(IDFINDWHAT); + int nbMarked = processAll(MARK_ALL); + char result[64]; + if (nbMarked < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbMarked, result, 10); + strcat(result, " tokens are found and marked"); + } + + ::MessageBox(_hSelf, result, "", MB_OK); + return TRUE; + } + + case IDC_CLEAR_ALL : + { + LangType lt = (*_ppEditView)->getCurrentDocType(); + if (lt == L_TXT) + (*_ppEditView)->defineDocType(L_CPP); + (*_ppEditView)->defineDocType(lt); + (*_ppEditView)->execute(SCI_MARKERDELETEALL, MARK_SYMBOLE); + return TRUE; + } + + case IDCCOUNTALL : + { + int nbCounted = processAll(COUNT_ALL); + char result[64]; + if (nbCounted < 0) + strcpy(result, "The regular expression to search is formed badly"); + else + { + itoa(nbCounted, result, 10); + strcat(result, " tokens are found."); + } + ::MessageBox(_hSelf, result, "", MB_OK); + return TRUE; + } + + case IDWHOLEWORD : + _options._isWholeWord = isCheckedOrNot(IDWHOLEWORD); + return TRUE; + + case IDMATCHCASE : + _options._isMatchCase = isCheckedOrNot(IDMATCHCASE); + return TRUE; + + case IDREGEXP : + _options._isRegExp = isCheckedOrNot(IDREGEXP); + + if (_options._isRegExp) + _options._isWholeWord = false; + ::SendDlgItemMessage(_hSelf, IDWHOLEWORD, BM_SETCHECK, _options._isWholeWord?BST_CHECKED:BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDWHOLEWORD), (BOOL)!_options._isRegExp); + + ::SendDlgItemMessage(_hSelf, IDDIRECTIONUP, BM_SETCHECK, BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDDIRECTIONUP), (BOOL)!_options._isRegExp); + ::SendDlgItemMessage(_hSelf, IDDIRECTIONDOWN, BM_SETCHECK, BST_CHECKED, 0); + _options._whichDirection = DIR_DOWN; + return TRUE; + + case IDWRAP : + _options._isWrapAround = isCheckedOrNot(IDWRAP); + return TRUE; + + case IDDIRECTIONUP : + case IDDIRECTIONDOWN : + _options._whichDirection = (BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, IDDIRECTIONDOWN), BM_GETCHECK, BST_CHECKED, 0)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_STATIC), (BOOL)(_options._whichDirection == DIR_DOWN)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_TOP), (BOOL)(_options._whichDirection == DIR_DOWN)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_MIDDLE), (BOOL)(_options._whichDirection == DIR_DOWN)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_BOTTOM), (BOOL)(_options._whichDirection == DIR_DOWN)); + return TRUE; + + case IDC_PURGE_CHECK : + _doPurge = isCheckedOrNot(IDC_PURGE_CHECK); + return TRUE; + + case IDC_MARKLINE_CHECK : + _doMarkLine = isCheckedOrNot(IDC_MARKLINE_CHECK); + ::EnableWindow(::GetDlgItem(_hSelf, IDCMARKALL), (_doMarkLine || _doStyleFoundToken)); + return TRUE; + + case IDC_STYLEFOUND_CHECK : + _doStyleFoundToken = isCheckedOrNot(IDC_STYLEFOUND_CHECK); + ::EnableWindow(::GetDlgItem(_hSelf, IDCMARKALL), (_doMarkLine || _doStyleFoundToken)); + return TRUE; + + case IDC_IN_SELECTION_CHECK : + _isInSelection = isCheckedOrNot(IDC_IN_SELECTION_CHECK); + return TRUE; + + case IDC_TRANSPARENT_CHECK : + { + bool isChecked = isCheckedOrNot(IDC_TRANSPARENT_CHECK); + if (isChecked) + { + int percent = ::SendDlgItemMessage(_hSelf, IDC_PERCENTAGE_SLIDER, TBM_GETPOS, 0, 0); + (NppParameters::getInstance())->SetTransparent(_hSelf, percent); + } + else + (NppParameters::getInstance())->removeTransparent(_hSelf); + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_PERCENTAGE_SLIDER), isChecked); + return TRUE; + } + + // + // Find in Files + // + + case IDD_FINDINFILES_FIND_BUTTON : + { + char filters[256]; + char directory[MAX_PATH]; + ::GetDlgItemText(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filters, sizeof(filters)); + addText2Combo(filters, ::GetDlgItem(_hSelf, IDD_FINDINFILES_FILTERS_COMBO)); + _filters = filters; + + ::GetDlgItemText(_hSelf, IDD_FINDINFILES_DIR_COMBO, directory, sizeof(directory)); + addText2Combo(directory, ::GetDlgItem(_hSelf, IDD_FINDINFILES_DIR_COMBO)); + _directory = directory; + + if ((strlen(directory) > 0) && (directory[strlen(directory)-1] != '\\')) + _directory += "\\"; + + //::SendMessage(_hParent, WM_COMMAND, IDC_FINDINFILES_LAUNCH, 0); + updateCombo(IDFINDWHAT); + + // thread to launch : + findAllIn(FILES_IN_DIR); + +//Thread + //HANDLE hEvent = ::CreateEvent(NULL, FALSE, FALSE, "findInFilesEvent"); + //--HANDLE hFindInFilesThread = ::CreateThread(NULL, 0, staticFindInFilesFunc, this, 0, NULL); + + + //::WaitForSingleObject(hEvent, INFINITE); + + //::CloseHandle(hFindInFilesThread); + //::CloseHandle(hEvent); + //::MessageBox(NULL, "Fin de thread", "", MB_OK); + + //display(false); + return TRUE; + } + + case IDD_FINDINFILES_RECURSIVE_CHECK : + { + _isRecursive = isCheckedOrNot(IDD_FINDINFILES_RECURSIVE_CHECK); + return TRUE; + } + + case IDD_FINDINFILES_BROWSE_BUTTON : + { + // 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 = _hSelf; + info.pidlRoot = NULL; + char szDisplayName[MAX_PATH]; + info.pszDisplayName = szDisplayName; + string title = "Select a folder to search from"; + info.lpszTitle = title.c_str(); + info.ulFlags = 0; + info.lpfn = BrowseCallbackProc; + char directory[MAX_PATH]; + ::GetDlgItemText(_hSelf, IDD_FINDINFILES_DIR_COMBO, directory, sizeof(directory)); + 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 string. + // Return is true if success. + char szDir[MAX_PATH]; + if (::SHGetPathFromIDList(pidl, szDir)) + // Set edit control to the directory path. + ::SetDlgItemText(_hSelf, IDD_FINDINFILES_DIR_COMBO, szDir); + pShellMalloc->Free(pidl); + } + pShellMalloc->Release(); + } + return TRUE; + } + default : + break; + } + } + } + return FALSE; +} + +// return value : +// true : the text2find is found +// false : the text2find is not found +bool FindReplaceDlg::processFindNext(const char *txt2find, FindOption *options) +{ + if (!txt2find || !txt2find[0]) + return false; + + const char *pText = txt2find; + FindOption *pOptions = options?options:&_options; + + int docLength = int((*_ppEditView)->execute(SCI_GETLENGTH)); + CharacterRange cr = (*_ppEditView)->getSelection(); + + int startPosition = cr.cpMax; + int endPosition = docLength; + + if (pOptions->_whichDirection == DIR_UP) + { + startPosition = cr.cpMin - 1; + endPosition = 0; + } + + if (pOptions->_isIncremental) + { + startPosition = 0; + endPosition = docLength; + } + + int flags = (pOptions->_isWholeWord ? SCFIND_WHOLEWORD : 0) | + (pOptions->_isMatchCase ? SCFIND_MATCHCASE : 0) | + (pOptions->_isRegExp ? SCFIND_REGEXP|SCFIND_POSIX : 0); + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + + + //char translatedText[FIND_REPLACE_STR_MAX]; + + /* + if (_isRegExp) + { + formatType f = (*_ppEditView)->getCurrentBuffer().getFormat(); + pText = translate2SlashN(translatedText, f); + } + */ + + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, strlen(pText), (LPARAM)pText)); + if (posFind == -1) //return; + { + if (pOptions->_isWrapAround) + { + if (pOptions->_whichDirection == DIR_DOWN) + { + startPosition = 0; + endPosition = docLength; + } + else + { + startPosition = docLength; + endPosition = 0; + } + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, strlen(pText), (LPARAM)pText)); + if (posFind == -1) + { + if (pOptions->_isIncremental) + return false; + + ::MessageBox(_hSelf, "Can't find the word", "Find", MB_OK); + // if the dialog is not shown, pass the focus to his parent(ie. Notepad++) + if (!::IsWindowVisible(_hSelf)) + ::SetFocus((*_ppEditView)->getHSelf()); + + return false; + } + int start = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int end = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + (*_ppEditView)->execute(SCI_SETSEL, start, end); + + // to make sure the found result is visible + int lineno = (*_ppEditView)->getCurrentLineNumber(); + (*_ppEditView)->execute(SCI_ENSUREVISIBLEENFORCEPOLICY, lineno); + } + else + { + if (pOptions->_isIncremental) + return false; + + ::MessageBox(_hSelf, "Can't find the word", "Find", MB_OK); + + // if the dialog is not shown, pass the focus to his parent(ie. Notepad++) + if (!::IsWindowVisible(_hSelf)) + ::SetFocus((*_ppEditView)->getHSelf()); + + return false; + } + } + + + int start = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int end = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + + int displayPos = getDisplayPos(); + (*_ppEditView)->execute(SCI_SETSEL, start, end); + + // to make sure the found result is visible + int lineno = (*_ppEditView)->getCurrentLineNumber(); + (*_ppEditView)->execute(SCI_ENSUREVISIBLEENFORCEPOLICY, lineno); + + if ((displayPos != DISPLAY_POS_BOTTOM) && (_options._whichDirection == DIR_DOWN)) + { + int firstVisibleLine = (*_ppEditView)->execute(EM_GETFIRSTVISIBLELINE); + int currentlineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, posFind); + int nbColumn2Scroll; + + if (displayPos == DISPLAY_POS_TOP) + nbColumn2Scroll = currentlineNumber-firstVisibleLine; + else //(displayPos == DISPLAY_POS_MIDDLE) + nbColumn2Scroll = (currentlineNumber-firstVisibleLine)/2; + + (*_ppEditView)->scroll(0, nbColumn2Scroll); + } + 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() +{ + if ((*_ppEditView)->getCurrentBuffer().isReadOnly()) return false; + + //getSearchTexts(); + //getReplaceTexts(); + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + string str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDFINDWHAT), isUnicode); + if (str2Search == "") + return false; + + string str2Relace = getTextFromCombo(::GetDlgItem(_hSelf, IDREPLACEWITH), isUnicode); + + + int flags = (_options._isWholeWord ? SCFIND_WHOLEWORD : 0) | + (_options._isMatchCase ? SCFIND_MATCHCASE : 0) | + (_options._isRegExp ? SCFIND_REGEXP|SCFIND_POSIX : 0); + + CharacterRange cr = (*_ppEditView)->getSelection(); + + (*_ppEditView)->execute(SCI_SETTARGETSTART, cr.cpMin); + (*_ppEditView)->execute(SCI_SETTARGETEND, cr.cpMax); + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, (WPARAM)str2Search.length(), (LPARAM)str2Search.c_str())); + + if (posFind != -1) + { + if (_options._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)->execute(SCI_REPLACETARGETRE, str2Relace.length(), (LPARAM)str2Relace.c_str()); + + if (!foundTextLen) + (*_ppEditView)->execute(SCI_SETSEL, start, start + replacedLen); + } + else + { + (*_ppEditView)->execute(SCI_REPLACESEL, str2Relace.length(), (LPARAM)str2Relace.c_str()); + } + } + return processFindNext(str2Search.c_str()); +} + +int FindReplaceDlg::markAll(const char *str2find) +{ + _doStyleFoundToken = true; + + int nbFound = processAll(MARK_ALL, true, NULL, str2find); + + return nbFound; +} + +int FindReplaceDlg::processAll(int op, bool isEntire, const char *fileName, const char *str2find) +{ + int nbReplaced = 0; + + if (!isCreated() && !str2find) return nbReplaced; + + if ((op == REPLACE_ALL) && (*_ppEditView)->getCurrentBuffer().isReadOnly()) + return nbReplaced; + + FindOption *pOptions = &_options; + + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + string str2Search; + if (str2find) + str2Search = str2find; + else + str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDFINDWHAT), isUnicode); + string str2Relace = getTextFromCombo(::GetDlgItem(_hSelf, IDREPLACEWITH), isUnicode); + + int docLength = int((*_ppEditView)->execute(SCI_GETLENGTH)); + + CharacterRange cr = (*_ppEditView)->getSelection(); + + // Par default : + // direction : bas + // commence par : cursor pos + // fini par : fin doc + int startPosition = cr.cpMin; + int endPosition = docLength; + + + if (pOptions->_whichDirection == DIR_UP) + { + startPosition = cr.cpMax; + endPosition = 0; + } + + bool direction = pOptions->_whichDirection; + + if ((pOptions->_isWrapAround || isEntire) || (op == COUNT_ALL)) + { + startPosition = 0; + endPosition = docLength; + direction = DIR_DOWN; + } + + if ((_isInSelection) && ((op == MARK_ALL) || ((op == REPLACE_ALL) && (!isEntire)))) + { + CharacterRange cr = (*_ppEditView)->getSelection(); + startPosition = cr.cpMin; + endPosition = cr.cpMax; + } + + int flags = (pOptions->_isWholeWord ? SCFIND_WHOLEWORD : 0) | + (pOptions->_isMatchCase ? SCFIND_MATCHCASE : 0) | + (pOptions->_isRegExp ? SCFIND_REGEXP|SCFIND_POSIX : 0); + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + + if (op == MARK_ALL) + { + if (_doStyleFoundToken) + { + if (_doPurge) + { + LangType lt = (*_ppEditView)->getCurrentDocType(); + if (lt == L_TXT) + (*_ppEditView)->defineDocType(L_CPP); + (*_ppEditView)->defineDocType(lt); + } + (*_ppEditView)->execute(SCI_SETLEXER, SCLEX_NULL); + } + if ((_doMarkLine) && (_doPurge)) + { + (*_ppEditView)->execute(SCI_MARKERDELETEALL, MARK_SYMBOLE); + } + } + + int posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, (WPARAM)str2Search.length(), (LPARAM)str2Search.c_str())); + + if ((posFind != -1) && (op == FIND_ALL)) + { + const int fileNameLen = strlen(fileName); + + if (fileNameLen > _fileNameLenMax) + { + _fileNameLenMax = fileNameLen; + + delete [] _uniFileName; + _uniFileName = new char[(fileNameLen + 3) * 2 + 1]; + } + ascii_to_utf8(fileName, fileNameLen, _uniFileName); + _pFinder->addFileNameTitle(_uniFileName); + } + while (posFind != -1) + { + //int posFindBefore = posFind; + int start = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int end = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + int foundTextLen = (end >= start)?end - start:start - end; + + // Si on a trouvé une occurence vide, y'a un pb!!! + if (!foundTextLen) + return -1; + + if (op == REPLACE_ALL) + { + (*_ppEditView)->execute(SCI_SETTARGETSTART, start); + (*_ppEditView)->execute(SCI_SETTARGETEND, end); + int replacedLength = (*_ppEditView)->execute(pOptions->_isRegExp?SCI_REPLACETARGETRE:SCI_REPLACETARGET, (WPARAM)-1, (LPARAM)str2Relace.c_str()); + + startPosition = (direction == DIR_UP)?posFind - replacedLength:posFind + replacedLength; + if ((_isInSelection) && (!isEntire)) + { + endPosition = endPosition - foundTextLen + replacedLength; + } + else + { + if (direction == DIR_DOWN) + endPosition = docLength = docLength - foundTextLen + replacedLength; + } + } + else if (op == MARK_ALL) + { + if (_doStyleFoundToken) + { + (*_ppEditView)->execute(SCI_STARTSTYLING, start, STYLING_MASK); + (*_ppEditView)->execute(SCI_SETSTYLING, end - start, SCE_UNIVERSAL_FOUND_STYLE); + (*_ppEditView)->execute(SCI_COLOURISE, start, end+1); + } + + if (_doMarkLine) + { + int lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, posFind); + int state = (*_ppEditView)->execute(SCI_MARKERGET, lineNumber); + + if (!(state & (1 << MARK_SYMBOLE))) + (*_ppEditView)->execute(SCI_MARKERADD, lineNumber, MARK_SYMBOLE); + } + startPosition = (direction == DIR_UP)?posFind - foundTextLen:posFind + foundTextLen; + } + else if (op == COUNT_ALL) + { + startPosition = posFind + foundTextLen; + } + else if (op == FIND_ALL) + { + int lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, posFind); + int lend = (*_ppEditView)->execute(SCI_GETLINEENDPOSITION, lineNumber); + int lstart = (*_ppEditView)->execute(SCI_POSITIONFROMLINE, lineNumber); + int nbChar = lend - lstart; + bool isRealloc = false; + + if (_maxNbCharAllocated < nbChar) + { + isRealloc = true; + _maxNbCharAllocated = nbChar; + //if (_line) + delete [] _line; + _line = new char[_maxNbCharAllocated + 3]; + } + //char *line = new char[nbChar + 3]; + (*_ppEditView)->execute(SCI_GETLINE, lineNumber, (LPARAM)_line); + + _line[nbChar] = 0x0D; + _line[nbChar+1] = 0x0A; + _line[nbChar+2] = '\0'; + + const char *pLine; + if ((*_ppEditView)->getCurrentBuffer().getUnicodeMode() == uni8Bit) + { + //char *uniChars = new char[uniCharLen]; + if (isRealloc) + { + const int uniCharLen = (_maxNbCharAllocated + 3) * 2 + 1; + //if (_uniCharLine) + delete [] _uniCharLine; + _uniCharLine = new char[uniCharLen]; + } + ascii_to_utf8(_line, (nbChar + 3), _uniCharLine); +/* + const int fileNameLen = strlen(fileName); + + if (fileNameLen > _fileNameLenMax) + { + _fileNameLenMax = fileNameLen; + delete [] _uniFileName; + _uniFileName = new char[(fileNameLen + 3) * 2 + 1]; + } + ascii_to_utf8(fileName, fileNameLen, _uniFileName); +*/ + pLine = _uniCharLine; + //_pFinder->add(FoundInfo(start, end, _uniCharLine, _uniFileName, _pFinder->_lineCounter), lineNumber + 1); + } + else + { + pLine = _line; + } + _pFinder->add(FoundInfo(start, end, pLine, fileName, _pFinder->_lineCounter), lineNumber + 1); + + startPosition = posFind + foundTextLen; + } + else + return nbReplaced; + + + (*_ppEditView)->execute(SCI_SETTARGETSTART, startPosition); + (*_ppEditView)->execute(SCI_SETTARGETEND, endPosition); + + posFind = int((*_ppEditView)->execute(SCI_SEARCHINTARGET, (WPARAM)str2Search.length(), (LPARAM)str2Search.c_str())); + nbReplaced++; + } + + return nbReplaced; +} + +void FindReplaceDlg::replaceAllInOpenedDocs() +{ + ::SendMessage(_hParent, WM_REPLACEALL_INOPENEDDOC, 0, 0); +} + +void FindReplaceDlg::findAllIn(InWhat op) +{ + //HANDLE hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "findInFilesEvent"); + if (!_pFinder) + { + _pFinder = new Finder; + _pFinder->init(_hInst, _hSelf, _ppEditView); + + tTbData data = {0}; + _pFinder->create(&data); + // 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 = "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()); + _pFinder->_scintView.execute(SCI_SETCODEPAGE, SC_CP_UTF8); + _pFinder->_scintView.execute(SCI_USEPOPUP, FALSE); + + //_statusBar.init(_hInst, _hSelf, 0); + RECT findRect; + + //const int scintEditInitHeight = 130; + + // get the width of FindDlg + ::GetWindowRect(_pFinder->getHSelf(), &findRect); + + // overwrite some default settings + _pFinder->_scintView.showMargin(ScintillaEditView::_SC_MARGE_SYBOLE, false); + + _pFinder->_scintView.setMakerStyle(FOLDER_STYLE_SIMPLE); + + //_pFinder->_scintView.execute(SCI_SETZOOM, _pFinder->_scintView.execute(SCI_GETZOOM) - 2); + _pFinder->_scintView.display(); + _pFinder->display(); + } + _pFinder->setFinderStyle(); + _pFinder->setMode(op); + + ::SendMessage(_pFinder->getHSelf(), WM_SIZE, 0, 0); + ::SendMessage(_hParent, (op==ALL_OPEN_DOCS)?WM_FINDALL_INOPENEDDOC:WM_FINDINFILES, 0, (op!=ALL_OPEN_DOCS)?_isRecursive:0); + //char *pDataToWrite = _findAllResultStr + strlen(FIND_RESULT_DEFAULT_TITLE); + sprintf(_findAllResultStr, "%d hits", _findAllResult); + ::SendMessage(_hParent, NPPM_DMMSHOW, 0, (LPARAM)_pFinder->getHSelf()); +} + +void FindReplaceDlg::enableReplaceFunc(bool isEnable) +{ + _currentStatus = isEnable?REPLACE_DLG:FIND_DLG; + int hideOrShow = isEnable?SW_SHOW:SW_HIDE; + RECT *pClosePos = isEnable?&_replaceClosePos:&_findClosePos; + + //::EnableWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_FIND_BUTTON), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), TRUE); + 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_FINDINFILES),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_STATIC),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_TOP),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_MIDDLE),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_BOTTOM),!hideOrShow); + + gotoCorrectTab(); + + ::MoveWindow(::GetDlgItem(_hSelf, IDCANCEL), pClosePos->left, pClosePos->top, pClosePos->right, pClosePos->bottom, TRUE); + + char label[MAX_PATH]; + _tab.getCurrentTitle(label, sizeof(label)); + ::SetWindowText(_hSelf, label); +} + +void FindReplaceDlg::enableFindInFilesControls(bool isEnable) +{ + // Hide Items + ::ShowWindow(::GetDlgItem(_hSelf, IDWRAP), isEnable?SW_HIDE:SW_SHOW); + //::ShowWindow(::GetDlgItem(_hSelf, IDC_FINDINFILES), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDREPLACEWITH), 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, 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); + + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_STATIC), SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_TOP), SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_MIDDLE), SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_BOTTOM), SW_HIDE); + + // Show Items + ::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); + + char label[MAX_PATH]; + _tab.getCurrentTitle(label, sizeof(label)); + ::SetWindowText(_hSelf, label); +} + +void FindReplaceDlg::getPatterns(vector & patternVect) +{ + cutString(_filters.c_str(), patternVect); +} + +void Finder::setFinderStyle() +{ + StyleArray & stylers = (_scintView.getParameter())->getMiscStylerArray(); + int iStyleDefault = stylers.getStylerIndexByID(STYLE_DEFAULT); + if (iStyleDefault != -1) + { + Style & styleDefault = stylers.getStyler(iStyleDefault); + _scintView.setStyle(styleDefault._styleID, styleDefault._fgColor, styleDefault._bgColor, styleDefault._fontName, styleDefault._fontStyle, styleDefault._fontSize); + } + + _scintView.execute(SCI_STYLECLEARALL); + _scintView.execute(SCI_SETSTYLEBITS, 5); + _scintView.setSearchResultLexer(); + _scintView.execute(SCI_COLOURISE, 0, -1); + _scintView.execute(SCI_SETEOLMODE, SC_EOL_LF); +} + +BOOL CALLBACK Finder::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + /* + case WM_INITDIALOG : + { + goToCenter(); + return TRUE; + } +*/ + 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; + } + default : + { + break; + } + } + } + + case WM_CONTEXTMENU : + { + if (HWND(wParam) == _scintView.getHSelf()) + { + POINT p; + ::GetCursorPos(&p); + ContextMenu scintillaContextmenu; + vector tmp; + tmp.push_back(MenuItemUnit(NPPM_INTERNAL_SCINTILLAFINFERCOLLAPSE, "Collapse all")); + tmp.push_back(MenuItemUnit(NPPM_INTERNAL_SCINTILLAFINFERUNCOLLAPSE, "Uncollapse 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; +} + + + +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 : + 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; + + string str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode); + _pFRDlg->processFindNext(str2Search.c_str(), &fo); + } + return TRUE; + + case IDC_INCFINDTEXT : + if ((wParam >> 16) == 0x0300) + { + if (_doSearchFromBegin) + { + FindOption fo; + fo._isWholeWord = false; + fo._isIncremental = true; + fo._isMatchCase = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDMATCHCASE, BM_GETCHECK, 0, 0)); + + string str2Search = getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode); + _pFRDlg->processFindNext(str2Search.c_str(), &fo); + } + else + _doSearchFromBegin = true; + } + return TRUE; + + } + } + } + return FALSE; +} + +void FindIncrementDlg::goToLowerLeft() +{ + RECT rc; + ::GetClientRect(_hParent, &rc); + //RECT rcSelf; + //::GetClientRect(_hSelf, &rcSelf); + int selfHeight = _rc.bottom - _rc.top; + int selfWidth = _rc.right - _rc.left; + + POINT llpoint; + llpoint.x = rc.left; + llpoint.y = rc.bottom - selfHeight; + ::ClientToScreen(_hParent, &llpoint); + + ::SetWindowPos(_hSelf, HWND_TOP, llpoint.x, llpoint.y, selfWidth, selfHeight, SWP_SHOWWINDOW); +} diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.h b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.h new file mode 100644 index 00000000..955f0fad --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.h @@ -0,0 +1,411 @@ +//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" + +/* +typedef bool DIALOG_TYPE; +#define REPLACE true +#define FIND false +*/ +enum DIALOG_TYPE {FIND_DLG, REPLACE_DLG, FINDINFILES_DLG}; + +#define DIR_DOWN true +#define DIR_UP false + +//#define FIND_REPLACE_STR_MAX 256 + +typedef bool InWhat; +#define ALL_OPEN_DOCS true +#define FILES_IN_DIR false + +const int REPLACE_ALL = 0; +const int MARK_ALL = 1; +const int COUNT_ALL = 2; +const int FIND_ALL = 3; + +const int DISPLAY_POS_TOP = 2; +const int DISPLAY_POS_MIDDLE = 1; +const int DISPLAY_POS_BOTTOM = 0; + + +struct FoundInfo { + FoundInfo(int start, int end, const char *foundLine, const char *fullPath, size_t lineNum) + : _start(start), _end(end), _foundLine(foundLine), _fullPath(fullPath), _scintLineNumber(lineNum){}; + int _start; + int _end; + std::string _foundLine; + std::string _fullPath; + size_t _scintLineNumber; +}; + +class Finder : public DockingDlgInterface { +friend class FindReplaceDlg; +public: + Finder() : DockingDlgInterface(IDD_FINDRESULT), _markedLine(-1), _lineCounter(0) {}; + + ~Finder() { + _scintView.destroy(); + } + void init(HINSTANCE hInst, HWND hPere, ScintillaEditView **ppEditView) { + DockingDlgInterface::init(hInst, hPere); + _ppEditView = ppEditView; + }; + + void addFileNameTitle(const char *fileName) { + string str = "["; + str += fileName; + str += "]\n"; + + _scintView.execute(SCI_APPENDTEXT, str.length(), (LPARAM)str.c_str()); + _lineCounter++; + }; + + void add(FoundInfo fi, int lineNb) { + _foundInfos.push_back(fi); + std::string str = "Line "; + + char lnb[16]; + str += itoa(lineNb, lnb, 10); + str += " : "; + str += fi._foundLine; + _scintView.execute(SCI_APPENDTEXT, str.length(), (LPARAM)str.c_str()); + _lineCounter++; + }; + + void setFinderStyle(); + + void removeAll() { + _markedLine = -1; + _foundInfos.clear(); + _scintView.execute(SCI_CLEARALL); + _lineCounter = 0; + }; + + FoundInfo & getInfo(int curLineNum) { + int nbInfo = _foundInfos.size(); + + for (size_t i = (nbInfo <= curLineNum)?nbInfo -1:curLineNum ; i > 0 ; i--) + { + if (_foundInfos[i]._scintLineNumber == curLineNum) + return _foundInfos[i]; + } + return _foundInfos[0]; // should never be reached + }; + + bool isEmpty() const { + return _foundInfos.empty(); + }; + + int getCurrentMarkedLine() const {return _markedLine;}; + void setCurrentMarkedLine(int line) {_markedLine = line;}; + InWhat getMode() const {return _mode;}; + void setMode(InWhat mode) {_mode = mode;}; + + void setSearchWord(const char *word2search) { + _scintView.setKeywords(L_SEARCHRESULT, word2search, 0); + }; + + + +protected : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + bool notify(SCNotification *notification); + +private: + ScintillaEditView **_ppEditView; + std::vector _foundInfos; + ScintillaEditView _scintView; + int _markedLine; + InWhat _mode; + size_t _lineCounter; +}; + +struct FindOption { + bool _isWholeWord; + bool _isMatchCase; + bool _isRegExp; + bool _isWrapAround; + bool _whichDirection; + bool _isIncremental; + FindOption() :_isWholeWord(true), _isMatchCase(true), _isRegExp(false),\ + _isWrapAround(true), _whichDirection(DIR_DOWN), _isIncremental(false){}; +}; + +void addText2Combo(const char * txt2add, HWND comboID, bool isUTF8 = false); +string getTextFromCombo(HWND hCombo, bool isUnicode); + +class FindReplaceDlg : public StaticDialog +{ +friend class FindIncrementDlg; +public : + FindReplaceDlg() : StaticDialog(), _pFinder(NULL), _isRTL(false), _isRecursive(true), _maxNbCharAllocated(1024), _fileNameLenMax(1024) { + _line = new char[_maxNbCharAllocated + 3]; + _uniCharLine = new char[(_maxNbCharAllocated + 3) * 2]; + _uniFileName = new char[(_fileNameLenMax + 3) * 2]; + + //strcpy(_findAllResultStr, FIND_RESULT_DEFAULT_TITLE); + }; + ~FindReplaceDlg() { + _tab.destroy(); + if (_pFinder) + delete _pFinder; + + delete [] _line; + delete [] _uniCharLine; + 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._isRegExp = isCheckedOrNot(IDREGEXP); + _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)); + ::SendMessage(::GetDlgItem(_hSelf, IDC_DISPLAYPOS_BOTTOM), BM_SETCHECK, BST_CHECKED, 0); + }; + + 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 char *txt2find, FindOption *options = NULL); + bool processReplace(); + + int markAll(const char *str2find); + int processAll(int op, bool isEntire = false, const char *dir2search = NULL, const char *str2find = NULL); + void replaceAllInOpenedDocs(); + void findAllIn(InWhat op); + void setSearchText(const char * txt2find, bool isUTF8 = false) { + addText2Combo(txt2find, ::GetDlgItem(_hSelf, IDFINDWHAT), isUTF8); + } + + void setFinderReadOnly(bool isReadOnly = true) { + _pFinder->_scintView.execute(SCI_SETREADONLY, isReadOnly); + }; + + bool isFinderEmpty() const { + return _pFinder->isEmpty(); + }; + + void clearFinder() { + _pFinder->removeAll(); + }; + + void putFindResult(int result) { + _findAllResult = result; + }; + + void setSearchWord2Finder(){ + string str2Search = getText2search(); + _pFinder->setSearchWord(str2Search.c_str()); + }; + + /// Sets the direction in which to search. + /// \param dir Direction to search (DIR_UP or DIR_DOWN) + /// + void setSearchDirection(bool dir) { + _options._whichDirection = dir; + }; + + const char * getDir2Search() const {return _directory.c_str();}; + + void getPatterns(vector & patternVect); + + void launchFindInFilesDlg() { + //::SendMessage(_hSelf, WM_COMMAND, IDC_FINDINFILES, 0); + doDialog(FINDINFILES_DLG); + }; + + void setFindInFilesDirFilter(const char *dir, const char *filters) { + if (dir) + { + _directory = dir; + ::SetDlgItemText(_hSelf, IDD_FINDINFILES_DIR_COMBO, dir); + } + if (filters) + { + _filters = filters; + ::SetDlgItemText(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filters); + } + }; + + string getText2search() const { + bool isUnicode = (*_ppEditView)->getCurrentBuffer().getUnicodeMode() != uni8Bit; + return getTextFromCombo(::GetDlgItem(_hSelf, IDFINDWHAT), isUnicode); + }; + + const string & getFilters() const {return _filters;}; + const string & getDirectory() const {return _directory;}; + +protected : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + +private : + DIALOG_TYPE _currentStatus; + FindOption _options; + + bool _doPurge; + bool _doMarkLine; + bool _doStyleFoundToken; + bool _isInSelection; + + + RECT _findClosePos, _replaceClosePos, _findInFilesClosePos; + + ScintillaEditView **_ppEditView; + Finder *_pFinder; + //StatusBar _statusBar; + bool _isRTL; + //FindInFilesDlg _findInFilesDlg; + + int _findAllResult; + char _findAllResultStr[128]; + + string _filters; + string _directory; + bool _isRecursive; + + int _maxNbCharAllocated; + int _fileNameLenMax; + char *_line; + char *_uniCharLine; + char *_uniFileName; + + TabBar _tab; + + void enableReplaceFunc(bool isEnable); + void enableFindInFilesControls(bool isEnable = true); + void enableFindInFilesFunc() { + enableFindInFilesControls(); + + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), FALSE); + + _currentStatus = FINDINFILES_DLG; + gotoCorrectTab(); + ::MoveWindow(::GetDlgItem(_hSelf, IDCANCEL), _findInFilesClosePos.left, _findInFilesClosePos.top, _findInFilesClosePos.right, _findInFilesClosePos.bottom, TRUE); + }; + + 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)); + }; + + int getDisplayPos() const { + if (isCheckedOrNot(IDC_DISPLAYPOS_TOP)) + return DISPLAY_POS_TOP; + else if (isCheckedOrNot(IDC_DISPLAYPOS_MIDDLE)) + return DISPLAY_POS_MIDDLE; + else //IDC_DISPLAYPOS_BOTTOM + return DISPLAY_POS_BOTTOM; + }; + + 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); + }; +}; + +class FindIncrementDlg : public StaticDialog +{ +public : + //FindIncrementDlg() : _doSearchFromBegin() + void init(HINSTANCE hInst, HWND hPere, FindReplaceDlg *pFRDlg) { + Window::init(hInst, hPere); + if (!pFRDlg) + throw int(9910); + _pFRDlg = pFRDlg; + }; + + void doDialog(bool isRTL = false) { + if (!isCreated()) + { + create(IDD_INCREMENT_FIND, isRTL); + _isRTL = isRTL; + } + + goToLowerLeft(); + ::SetFocus(::GetDlgItem(_hSelf, IDC_INCFINDTEXT)); + display(); + _doSearchFromBegin = true; + }; + void goToLowerLeft(); + void setSearchText(const char * txt2find, bool isUTF8 = false) { + _doSearchFromBegin = false; + if (!isUTF8) + { + ::SendDlgItemMessage(_hSelf, IDC_INCFINDTEXT, WM_SETTEXT, 0, (LPARAM)txt2find); + return; + } + WCHAR wchars[256]; + ::MultiByteToWideChar(CP_UTF8, 0, txt2find, -1, wchars, 256 / sizeof(WCHAR)); + ::SendDlgItemMessageW(_hSelf, IDC_INCFINDTEXT, WM_SETTEXT, 0, (LPARAM)wchars); + } + +private : + bool _isRTL; + FindReplaceDlg *_pFRDlg; + bool _doSearchFromBegin; + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); +}; + +#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..efd00054 --- /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, 321, 179 +//STYLE DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | 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 "Re&place with :",ID_STATICTEXT_REPLACE,6,40,75,8 + COMBOBOX IDREPLACEWITH,83,39,125,50,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_TABSTOP + CONTROL "Mark Line",IDC_MARKLINE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,38,88,10 + CONTROL "Style found token",IDC_STYLEFOUND_CHECK,"Button", BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,13,50,100,15 + GROUPBOX "",IDC_FINDALL_STATIC,7,31,204,54 + CONTROL "Purge for each search",IDC_PURGE_CHECK,"Button", BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,13,64,99,16 + PUSHBUTTON "Find All",IDCMARKALL,131,40,75,14 + GROUPBOX "",IDC_REPLACEINSELECTION,141,50,170,23 + CONTROL "In selection",IDC_IN_SELECTION_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,59,59,10 + PUSHBUTTON "Clear",IDC_CLEAR_ALL,156,71,50,11, WS_TABSTOP + RTEXT "Filters :", IDD_FINDINFILES_FILTERS_STATIC,6,40,75,8 + COMBOBOX IDD_FINDINFILES_FILTERS_COMBO,83,39,125,150, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_TABSTOP + + RTEXT "Directory :",IDD_FINDINFILES_DIR_STATIC,7,58,40,8 + COMBOBOX IDD_FINDINFILES_DIR_COMBO,49,57,141,150, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDD_FINDINFILES_BROWSE_BUTTON,193,56,16,14 + CONTROL "In all sub-folders",IDD_FINDINFILES_RECURSIVE_CHECK, "Button", BS_AUTOCHECKBOX | WS_TABSTOP,49,70,110,15 + CONTROL "Match &whole word only",IDWHOLEWORD,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,6,88,110,15 + + CONTROL "Match &case",IDMATCHCASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,103,110,12 + CONTROL "Regular &expression",IDREGEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,116,110,12 + CONTROL "Wrap aroun&d",IDWRAP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,6,129,102,16 + CONTROL "&Up",IDDIRECTIONUP,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,155,94,45,12 + CONTROL "&Down",IDDIRECTIONDOWN,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,155,106,45,12 + GROUPBOX "Direction",IDC_DIR_STATIC,150,86,60,34,WS_GROUP + CONTROL "Top",IDC_DISPLAYPOS_TOP,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,156,137,28,10 + CONTROL "Middle",IDC_DISPLAYPOS_MIDDLE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,156,149,36,10 + CONTROL "Bottom",IDC_DISPLAYPOS_BOTTOM,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,156,161,39,10 + GROUPBOX "Display Position",IDC_DISPLAYPOS_STATIC,150,125,60,48 + + PUSHBUTTON "Find Next",IDOK,217,20,90,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "Count",IDCCOUNTALL,217,38,90,14, WS_TABSTOP + PUSHBUTTON "Find all in all opened documents",IDC_FINDALL_OPENEDFILES,217,56,90,21,BS_MULTILINE | WS_TABSTOP + PUSHBUTTON "&Replace",IDREPLACE,217,38,90,14, WS_TABSTOP + PUSHBUTTON "Replace &All",IDREPLACEALL,217,56,90,14, WS_TABSTOP + PUSHBUTTON "Replace all in all opened documents",IDC_REPLACE_OPENEDFILES,217,74,90,21,BS_MULTILINE | WS_TABSTOP + PUSHBUTTON "Find them all",IDD_FINDINFILES_FIND_BUTTON,217,20,90,14,WS_GROUP + PUSHBUTTON "Close",IDCANCEL,217,99,90,14, WS_TABSTOP + + CONTROL "Transparency",IDC_TRANSPARENT_CHECK,"Button", BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,258,153,55,10 + CONTROL "",IDC_PERCENTAGE_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | NOT WS_VISIBLE | WS_TABSTOP,257,165,53,10 + +END + +IDD_INCREMENT_FIND DIALOGEX 0, 0, 330, 14 +STYLE DS_SYSMODAL | DS_MODALFRAME | DS_CONTROL | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP +FONT 8, "MS Shell Dlg" +BEGIN + DEFPUSHBUTTON "X",IDCANCEL,2,1,12,12 + LTEXT "Find :",IDC_INCSTATIC,20,2,40,8 + EDITTEXT IDC_INCFINDTEXT,45,1,175,12,ES_AUTOHSCROLL | ES_WANTRETURN | NOT WS_BORDER,WS_EX_STATICEDGE + DEFPUSHBUTTON "<",IDC_INCFINDPREVOK,223,0,16,14 + DEFPUSHBUTTON ">",IDC_INCFINDNXTOK,243,0,16,14 + CONTROL "Match case", IDC_INCFINDMATCHCASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,270,2,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, "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..619328e6 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg_rc.h @@ -0,0 +1,64 @@ + + +#define IDD_FIND_REPLACE_DLG 1600 +#define IDFINDWHAT 1601 +#define IDREPLACEWITH 1602 +#define IDWHOLEWORD 1603 +#define IDMATCHCASE 1604 +#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_CHECK 1623 + +#define IDC_DISPLAYPOS_STATIC 1624 +#define IDC_DISPLAYPOS_TOP 1625 +#define IDC_DISPLAYPOS_MIDDLE 1626 +#define IDC_DISPLAYPOS_BOTTOM 1627 + +#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 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_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 diff --git a/PowerEditor/src/ScitillaComponent/GoToLineDlg.cpp b/PowerEditor/src/ScitillaComponent/GoToLineDlg.cpp new file mode 100644 index 00000000..a6558396 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/GoToLineDlg.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 "GoToLineDlg.h" + + +BOOL CALLBACK GoToLineDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + 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(); + (*_ppEditView)->execute(SCI_GOTOLINE, line-1); + } + (*_ppEditView)->getFocus(); + 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..e74e8da9 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/GoToLineDlg.h @@ -0,0 +1,78 @@ +//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() {}; + + 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 : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + +private : + + ScintillaEditView **_ppEditView; + + void updateLinesNumbers() const { + ::SetDlgItemInt(_hSelf, ID_CURRLINE, (unsigned int)((*_ppEditView)->getCurrentLineNumber() + 1), FALSE); + ::SetDlgItemInt(_hSelf, ID_LASTLINE, (unsigned int)((*_ppEditView)->execute(SCI_GETLINECOUNT)), FALSE); + }; + + void cleanLineEdit() const { + ::SetDlgItemText(_hSelf, ID_GOLINE_EDIT, ""); + }; + + 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..5431f0f1 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/Printer.cpp @@ -0,0 +1,500 @@ +//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(string & str, string str2BeReplaced, 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 char *fontFace = (nppGUI._printSettings._headerFontName != "")?nppGUI._printSettings._headerFontName.c_str():"Arial"; + + int headerLineHeight = ::MulDiv(fontSize, ptDpi.y, 72); + //char toto[10]; + //::MessageBox(NULL, itoa(nppGUI._printSettings._headerFontStyle, toto, 10), "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 != "")?nppGUI._printSettings._footerFontName.c_str():"Arial"; + //::MessageBox(NULL, itoa(nppGUI._printSettings._footerFontStyle, , 10), "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->getCurrentTitle(); + docInfo.lpszOutput = NULL; + + if (::StartDoc(_pdlg.hDC, &docInfo) < 0) + { + MessageBox(NULL, "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; + + char headerL[256] = ""; + char headerM[256] = ""; + char headerR[256] = ""; + char footerL[256] = ""; + char footerM[256] = ""; + char footerR[256] = ""; + + + const char shortDateVar[] = "$(SHORT_DATE)"; + const char longDateVar[] = "$(LONG_DATE)"; + const char timeVar[] = "$(TIME)"; + + char shortDate[64]; + char longDate[64]; + char time[64]; + + SYSTEMTIME st; + ::GetLocalTime(&st); + ::GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, shortDate, sizeof(shortDate)); + ::GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, longDate, sizeof(longDate)); + ::GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, time, sizeof(time)); + + if (nppGUI._printSettings.isHeaderPresent()) + { + frPrint.rc.top += headerLineHeight + headerLineHeight / 2; + + string headerLeftPart = nppGUI._printSettings._headerLeft; + if (headerLeftPart != "") + { + replaceStr(headerLeftPart, shortDateVar, shortDate); + replaceStr(headerLeftPart, longDateVar, longDate); + replaceStr(headerLeftPart, timeVar, time); + expandNppEnvironmentStrs(headerLeftPart.c_str(), headerL, sizeof(headerL), _pdlg.hwndOwner); + } + + string headerMiddlePart = nppGUI._printSettings._headerMiddle; + if (headerMiddlePart != "") + { + replaceStr(headerMiddlePart, shortDateVar, shortDate); + replaceStr(headerMiddlePart, longDateVar, longDate); + replaceStr(headerMiddlePart, timeVar, time); + expandNppEnvironmentStrs(headerMiddlePart.c_str(), headerM, sizeof(headerM), _pdlg.hwndOwner); + } + + string headerRightPart = nppGUI._printSettings._headerRight; + if (headerRightPart != "") + { + replaceStr(headerRightPart, shortDateVar, shortDate); + replaceStr(headerRightPart, longDateVar, longDate); + replaceStr(headerRightPart, timeVar, time); + expandNppEnvironmentStrs(headerRightPart.c_str(), headerR, sizeof(headerR), _pdlg.hwndOwner); + } + + } + + if (nppGUI._printSettings.isFooterPresent()) + { + frPrint.rc.bottom -= footerLineHeight + footerLineHeight / 2; + + string footerLeftPart = nppGUI._printSettings._footerLeft; + if (footerLeftPart != "") + { + replaceStr(footerLeftPart, shortDateVar, shortDate); + replaceStr(footerLeftPart, longDateVar, longDate); + replaceStr(footerLeftPart, timeVar, time); + expandNppEnvironmentStrs(footerLeftPart.c_str(), footerL, sizeof(footerL), _pdlg.hwndOwner); + } + + string footerMiddlePart = nppGUI._printSettings._footerMiddle; + if (footerMiddlePart != "") + { + replaceStr(footerMiddlePart, shortDateVar, shortDate); + replaceStr(footerMiddlePart, longDateVar, longDate); + replaceStr(footerMiddlePart, timeVar, time); + expandNppEnvironmentStrs(footerMiddlePart.c_str(), footerM, sizeof(footerM), _pdlg.hwndOwner); + } + + string footerRightPart = nppGUI._printSettings._footerRight; + if (footerRightPart != "") + { + replaceStr(footerRightPart, shortDateVar, shortDate); + replaceStr(footerRightPart, longDateVar, longDate); + replaceStr(footerRightPart, timeVar, time); + expandNppEnvironmentStrs(footerRightPart.c_str(), footerR, sizeof(footerR), _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 char pageVar[] = "$(CURRENT_PRINTING_PAGE)"; + + while (lengthPrinted < lengthDoc) + { + printPage = (!(_pdlg.Flags & PD_PAGENUMS) || + (pageNum >= _pdlg.nFromPage) && (pageNum <= _pdlg.nToPage)); + + if (!justDoIt) + printPage = false; + + char pageString[32]; + sprintf(pageString, "%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') + { + string headerLeft(headerL); + size_t pos = headerLeft.find(pageVar); + + if (pos != headerLeft.npos) + headerLeft.replace(pos, strlen(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') + { + string headerMiddle(headerM); + size_t pos = headerMiddle.find(pageVar); + if (pos != headerMiddle.npos) + headerMiddle.replace(pos, strlen(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') + { + string headerRight(headerR); + size_t pos = headerRight.find(pageVar); + if (pos != headerRight.npos) + headerRight.replace(pos, strlen(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') + { + string footerLeft(footerL); + size_t pos = footerLeft.find(pageVar); + if (pos != footerLeft.npos) + footerLeft.replace(pos, strlen(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') + { + string footerMiddle(footerM); + size_t pos = footerMiddle.find(pageVar); + if (pos != footerMiddle.npos) + footerMiddle.replace(pos, strlen(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') + { + string footerRight(footerR); + size_t pos = footerRight.find(pageVar); + if (pos != footerRight.npos) + footerRight.replace(pos, strlen(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; + } + + //char toto[10]; + //::MessageBox(NULL, itoa(pageNum, toto, 10), "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/RCa02172 b/PowerEditor/src/ScitillaComponent/RCa02172 new file mode 100644 index 0000000000000000000000000000000000000000..5ed81600c0e19c544f7b9d1a65e03f1a31783909 GIT binary patch literal 11212 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 anW7rM2J+us@w<;`kMfyxtnJe8lKv0s{{jR6 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp new file mode 100644 index 00000000..ce3802c1 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp @@ -0,0 +1,1576 @@ +//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("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::_MARGE_LINENUMBER_NB_CHIFFRE = 5; + +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} +}; + +//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, "Can not load the dynamic library", "SCINTILLA ERROR : ", MB_OK | MB_ICONSTOP); + throw int(106901); + } + + Window::init(hInst, hPere); + _hSelf = ::CreateWindowEx( + WS_EX_CLIENTEDGE,\ + "Scintilla",\ + "Notepad++",\ + WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN | WS_EX_RTLREADING,\ + 0, 0, 100, 100,\ + _hParent,\ + NULL,\ + _hInst,\ + NULL); + + if (!_hSelf) + { + systemMessage("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("System Err"); + throw int(106901); + } + + execute(SCI_SETMARGINMASKN, _SC_MARGE_FOLDER, SC_MASK_FOLDERS); + showMargin(_SC_MARGE_FOLDER, true); + + execute(SCI_SETMARGINSENSITIVEN, _SC_MARGE_FOLDER, true); + execute(SCI_SETMARGINSENSITIVEN, _SC_MARGE_SYBOLE, true); + + execute(SCI_SETPROPERTY, reinterpret_cast("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, 0); + + _pParameter = NppParameters::getInstance(); + + _codepage = ::GetACP(); + _oemCodepage = ::GetOEMCP(); + + ::SetWindowLong(_hSelf, GWL_USERDATA, reinterpret_cast(this)); + _scintillaDefaultProc = reinterpret_cast(::SetWindowLong(_hSelf, GWL_WNDPROC, reinterpret_cast(scintillaStatic_Proc))); +} + +LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_CHAR : + { + //bool isAltHeld = lParam & 0x8000; + if (execute(SCI_SELECTIONISRECTANGLE) && !(::GetKeyState(VK_LCONTROL) & 0x80000000)) + { + execute(SCI_BEGINUNDOACTION); + + ColumnModeInfo colInfos = getColumnModeSelectInfo(); + columnReplace(colInfos, (char)wParam); + + execute(SCI_ENDUNDOACTION); + execute(SCI_SETCURRENTPOS,colInfos[colInfos.size()-1].second); + //execute(SCI_SETSEL, colInfos[0].first, colInfos[colInfos.size()-1].second); + //execute(SCI_SETSELECTIONMODE, 1); + return TRUE; + } + break; + } + + case WM_MOUSEWHEEL : + //case WM_RBUTTONDOWN : + { + if (LOWORD(wParam) & MK_RBUTTON) + { + ::SendMessage(_hParent, Message, wParam, lParam); + return TRUE; + } + } + } + return ::CallWindowProc(_scintillaDefaultProc, hwnd, Message, wParam, lParam); +} + +void ScintillaEditView::setStyle(int styleID, COLORREF fgColour, COLORREF bgColour, const char *fontName, int fontStyle, int fontSize) +{ + if (!((fgColour >> 24) & 0xFF)) + execute(SCI_STYLESETFORE, styleID, fgColour); + + if (!((bgColour >> 24) & 0xFF)) + execute(SCI_STYLESETBACK, styleID, bgColour); + + if ((!fontName)||(strcmp(fontName, ""))) + execute(SCI_STYLESETFONT, (WPARAM)styleID, (LPARAM)fontName); + + if ((fontStyle != -1) && (fontStyle != 0)) + { + if (fontStyle & FONTSTYLE_BOLD) + execute(SCI_STYLESETBOLD, (WPARAM)styleID, (LPARAM)true); + if (fontStyle & FONTSTYLE_ITALIC) + execute(SCI_STYLESETITALIC, (WPARAM)styleID, (LPARAM)true); + if (fontStyle & FONTSTYLE_UNDERLINE) + execute(SCI_STYLESETUNDERLINE, (WPARAM)styleID, (LPARAM)true); + } + + if (fontSize > 0) + execute(SCI_STYLESETSIZE, styleID, fontSize); + +} + + +void ScintillaEditView::setXmlLexer(LangType type) +{ + + execute(SCI_SETSTYLEBITS, 7, 0); + + if (type == L_XML) + { + execute(SCI_SETLEXER, SCLEX_HTML); + for (int i = 0 ; i < 4 ; i++) + execute(SCI_SETKEYWORDS, i, reinterpret_cast("")); + + makeStyle("xml"); + } + else if ((type == L_HTML) || (type == L_PHP) || (type == L_ASP)) + { + + execute(SCI_SETLEXER, SCLEX_XML); + + const char *htmlKeyWords =_pParameter->getWordList(L_HTML, LANG_INDEX_INSTR); + execute(SCI_SETKEYWORDS, 0, reinterpret_cast(htmlKeyWords?htmlKeyWords:"")); + + makeStyle("html"); + + setEmbeddedJSLexer(); + setPhpEmbeddedLexer(); + setEmbeddedAspLexer(); + } + +} + +void ScintillaEditView::setEmbeddedJSLexer() +{ + const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + makeStyle("javascript", pKwArray); + + std::string keywordList(""); + if (pKwArray[LANG_INDEX_INSTR]) + keywordList = pKwArray[LANG_INDEX_INSTR]; + + 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 char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + makeStyle("php", pKwArray); + + std::string keywordList(""); + if (pKwArray[LANG_INDEX_INSTR]) + keywordList = pKwArray[LANG_INDEX_INSTR]; + + 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 char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + makeStyle("asp", pKwArray); + + std::string keywordList(""); + if (pKwArray[LANG_INDEX_INSTR]) + keywordList = pKwArray[LANG_INDEX_INSTR]; + + execute(SCI_SETKEYWORDS, 2, (LPARAM)getCompleteKeywordList(keywordList, L_VB, LANG_INDEX_INSTR)); + + execute(SCI_STYLESETEOLFILLED, SCE_HBA_DEFAULT, true); +} + +void ScintillaEditView::setUserLexer() +{ + execute(SCI_SETLEXER, SCLEX_USER); + UserLangContainer & userLangContainer = *(_userDefineDlg._pCurrentUserLang); + 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++) + { + execute(SCI_SETKEYWORDS, i, reinterpret_cast(userLangContainer._keywordLists[i])); + } + + for (int i = 0 ; i < userLangContainer._styleArray.getNbStyler() ; i++) + { + Style & style = userLangContainer._styleArray.getStyler(i); + setStyle(style._styleID, style._fgColor, style._bgColor, style._fontName, style._fontStyle, style._fontSize); + } +} + +void ScintillaEditView::setUserLexer(const char *userLangName) +{ + + execute(SCI_SETLEXER, SCLEX_USER); + + UserLangContainer & userLangContainer = NppParameters::getInstance()->getULCFromName(userLangName); + 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++) + { + execute(SCI_SETKEYWORDS, i, reinterpret_cast(userLangContainer._keywordLists[i])); + } + + for (int i = 0 ; i < userLangContainer._styleArray.getNbStyler() ; i++) + { + Style & style = userLangContainer._styleArray.getStyler(i); + setStyle(style._styleID, style._fgColor, style._bgColor, style._fontName, style._fontStyle, style._fontSize); + } +} + +void ScintillaEditView::setCppLexer(LangType langType) +{ + const char *cppInstrs; + const char *cppTypes; + const char *doxygenKeyWords = _pParameter->getWordList(L_CPP, LANG_INDEX_TYPE2); + + char *lexerName; + switch (langType) + { + case L_C: + lexerName = "c"; break; + + case L_CPP: + lexerName = "cpp"; break; + + case L_JAVA: + lexerName = "java"; break; + + case L_JS: + lexerName = "javascript"; break; + + case L_RC: + lexerName = "rc"; break; + + case L_CS: + lexerName = "cs"; break; + + case L_TCL: + lexerName = "tcl"; break; + + default: + return; + } + + 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) + execute(SCI_SETKEYWORDS, 2, (LPARAM)doxygenKeyWords); + } + + if (langType == L_JS) + { + LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName("javascript"); + if (pStyler) + { + for (int i = 0 ; i < pStyler->getNbStyler() ; i++) + { + Style & style = pStyler->getStyler(i); + 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; + } + setStyle(cppID, style._fgColor, style._bgColor, style._fontName, style._fontStyle, style._fontSize); + } + } + 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 char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + makeStyle(lexerName, pKwArray); + + std::string instr1(""); + if (pKwArray[LANG_INDEX_INSTR]) + instr1 = pKwArray[LANG_INDEX_INSTR]; + cppInstrs = getCompleteKeywordList(instr1, langType, LANG_INDEX_INSTR); + + std::string type1(""); + if (pKwArray[LANG_INDEX_TYPE]) + type1 = pKwArray[LANG_INDEX_TYPE]; + cppTypes = getCompleteKeywordList(type1, 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 char *doxygenKeyWords = _pParameter->getWordList(L_CPP, LANG_INDEX_TYPE2); + + const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + + const char *lexerName = "objc"; + if (langType == L_FLASH) + lexerName = "actionscript"; + + makeStyle(lexerName, pKwArray); + + std::string objcInstr1Kwl(""); + if (pKwArray[LANG_INDEX_INSTR]) + objcInstr1Kwl = pKwArray[LANG_INDEX_INSTR]; + const char *objcInstrs = getCompleteKeywordList(objcInstr1Kwl, langType, LANG_INDEX_INSTR); + + std::string objcInstr2Kwl(""); + if (pKwArray[LANG_INDEX_INSTR2]) + objcInstr2Kwl = pKwArray[LANG_INDEX_INSTR2]; + const char *objCDirective = getCompleteKeywordList(objcInstr2Kwl, langType, LANG_INDEX_INSTR2); + + std::string objcTypeKwl(""); + if (pKwArray[LANG_INDEX_TYPE]) + objcTypeKwl = pKwArray[LANG_INDEX_TYPE]; + const char *objcTypes = getCompleteKeywordList(objcTypeKwl, langType, LANG_INDEX_TYPE); + + std::string objcType2Kwl(""); + if (pKwArray[LANG_INDEX_TYPE2]) + objcType2Kwl = pKwArray[LANG_INDEX_TYPE2]; + const char *objCQualifier = getCompleteKeywordList(objcType2Kwl, langType, LANG_INDEX_TYPE2); + + execute(SCI_SETKEYWORDS, 0, (LPARAM)objcInstrs); + execute(SCI_SETKEYWORDS, 1, (LPARAM)objcTypes); + execute(SCI_SETKEYWORDS, 2, (LPARAM)(doxygenKeyWords?doxygenKeyWords:"")); + execute(SCI_SETKEYWORDS, 3, (LPARAM)objCDirective); + execute(SCI_SETKEYWORDS, 4, (LPARAM)objCQualifier); +} + +void ScintillaEditView::setKeywords(LangType langType, const char *keywords, int index) +{ + std::string wordList; + wordList = (keywords)?keywords:""; + execute(SCI_SETKEYWORDS, index, (LPARAM)getCompleteKeywordList(wordList, langType, index)); +} + +void ScintillaEditView::setLexer(int lexerID, LangType langType, const char *lexerName, int whichList) +{ + execute(SCI_SETLEXER, lexerID); + + const char *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + + makeStyle(lexerName, pKwArray); + + if (whichList & LIST_0) + { + setKeywords(langType, pKwArray[LANG_INDEX_INSTR], LANG_INDEX_INSTR); + } + + if (whichList & LIST_1) + { + setKeywords(langType, pKwArray[LANG_INDEX_INSTR2], LANG_INDEX_INSTR2); + } + + if (whichList & LIST_2) + { + setKeywords(langType, pKwArray[LANG_INDEX_TYPE], LANG_INDEX_TYPE); + } + + if (whichList & LIST_3) + { + setKeywords(langType, pKwArray[LANG_INDEX_TYPE2], LANG_INDEX_TYPE2); + } + + if (whichList & LIST_4) + { + setKeywords(langType, pKwArray[LANG_INDEX_TYPE3], LANG_INDEX_TYPE3); + } + + if (whichList & LIST_5) + { + setKeywords(langType, pKwArray[LANG_INDEX_TYPE4], LANG_INDEX_TYPE4); + } + + if (whichList & LIST_6) + { + setKeywords(langType, pKwArray[LANG_INDEX_TYPE5], LANG_INDEX_TYPE5); + } +} + +void ScintillaEditView::defineDocType(LangType typeDoc) +{ + //setStyle(STYLE_DEFAULT, black, white, "Verdana", 0, 9); + + StyleArray & stylers = _pParameter->getMiscStylerArray(); + int iStyleDefault = stylers.getStylerIndexByID(STYLE_DEFAULT); + if (iStyleDefault != -1) + { + Style & styleDefault = stylers.getStyler(iStyleDefault); + setStyle(styleDefault._styleID, styleDefault._fgColor, styleDefault._bgColor, styleDefault._fontName, styleDefault._fontStyle, styleDefault._fontSize); + } + + execute(SCI_STYLECLEARALL); + + int iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE); + if (iFind != -1) + { + Style & styleFind = stylers.getStyler(iFind); + setStyle(styleFind._styleID, styleFind._fgColor, styleFind._bgColor, styleFind._fontName, styleFind._fontStyle, styleFind._fontSize); + } + + iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_SELECT_STYLE); + if (iFind != -1) + { + Style & styleFind = stylers.getStyler(iFind); + setStyle(styleFind._styleID, styleFind._fgColor, styleFind._bgColor, styleFind._fontName, styleFind._fontStyle, styleFind._fontSize); + } + + 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()._unicodeMode == uni8Bit) + execute(SCI_SETCODEPAGE, _codepage); + + } + + execute(SCI_SETSTYLEBITS, 5); + + 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 : + if (_buffers[_currentIndex]._userLangExt[0]) + setUserLexer(_buffers[_currentIndex]._userLangExt); + else + setUserLexer(); + break; + + case L_NFO : + { + LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName("nfo"); + COLORREF bg = black; + COLORREF fg = liteGrey; + if (pStyler) + { + int i = pStyler->getStylerIndexByName("DEFAULT"); + if (i != -1) + { + Style & style = pStyler->getStyler(i); + bg = style._bgColor; + fg = style._fgColor; + } + } + + setStyle(STYLE_DEFAULT, fg, bg, "MS LineDraw"); + 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 : + setShemeLexer(); 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_TXT : + default : + execute(SCI_SETLEXER, (_codepage == CP_CHINESE_TRADITIONAL)?SCLEX_MAKEFILE:SCLEX_NULL); break; + + } + + //All the global styles should put here + static int indexOfIndentGuide = stylers.getStylerIndexByID(STYLE_INDENTGUIDE); + if (indexOfIndentGuide != -1) + { + static Style & styleIG = stylers.getStyler(indexOfIndentGuide); + setStyle(styleIG._styleID, styleIG._fgColor, styleIG._bgColor, styleIG._fontName, styleIG._fontStyle, styleIG._fontSize); + } + + static int indexOfBraceLight = stylers.getStylerIndexByID(STYLE_BRACELIGHT); + if (indexOfBraceLight != -1) + { + static Style & styleBL = stylers.getStyler(indexOfBraceLight); + setStyle(styleBL._styleID, styleBL._fgColor, styleBL._bgColor, styleBL._fontName, styleBL._fontStyle, styleBL._fontSize); + } + //setStyle(STYLE_CONTROLCHAR, liteGrey); + + static int indexBadBrace = stylers.getStylerIndexByID(STYLE_BRACEBAD); + if (indexBadBrace != -1) + { + static Style & styleBB = stylers.getStyler(indexBadBrace); + setStyle(styleBB._styleID, styleBB._fgColor, styleBB._bgColor, styleBB._fontName, styleBB._fontStyle, styleBB._fontSize); + } + + static int indexLineNumber = stylers.getStylerIndexByID(STYLE_LINENUMBER); + if (indexLineNumber != -1) + { + static Style & styleLN = stylers.getStyler(indexLineNumber); + setStyle(styleLN._styleID, styleLN._fgColor, styleLN._bgColor, styleLN._fontName, styleLN._fontStyle, styleLN._fontSize); + } + + execute(SCI_SETTABWIDTH, ((NppParameters::getInstance())->getNppGUI())._tabSize); + execute(SCI_SETUSETABS, !((NppParameters::getInstance())->getNppGUI())._tabReplacedBySpace); + + execute(SCI_COLOURISE, 0, -1); +} + +char * ScintillaEditView::attatchDefaultDoc(int nb) +{ + char title[10]; + char nb_str[4]; + strcat(strcpy(title, UNTITLED_STR), _itoa(nb, nb_str, 10)); + + // get the doc pointer attached (by default) on the view Scintilla + Document doc = execute(SCI_GETDOCPOINTER, 0, 0); + + // create the entry for our list + _buffers.push_back(Buffer(doc, title)); + + // set current index to 0 + _currentIndex = 0; + + return _buffers[_currentIndex]._fullPathName; +} + + +int ScintillaEditView::findDocIndexByName(const char *fn) const +{ + int index = -1; + for (int i = 0 ; i < int(_buffers.size()) ; i++) + { + if (!stricmp(_buffers[i]._fullPathName, fn)) + { + index = i; + break; + } + } + return index; +} + +void ScintillaEditView::saveCurrentPos() +{ + int displayedLine = static_cast(execute(SCI_GETFIRSTVISIBLELINE)); + + int docLine = execute(SCI_DOCLINEFROMVISIBLE, displayedLine); + + int nbInvisibleLine = 0; + + //Calculate nb of invisible line + for (int i = 0 ; i < docLine ; i++) + if (execute(SCI_GETLINEVISIBLE, i) == FALSE) + nbInvisibleLine++; + + Buffer & buf = _buffers[_currentIndex]; + + // the correct visible line number + buf._pos._firstVisibleLine = docLine - nbInvisibleLine; + buf._pos._startPos = static_cast(execute(SCI_GETSELECTIONSTART)); + buf._pos._endPos = static_cast(execute(SCI_GETSELECTIONEND)); + buf._pos._xOffset = static_cast(execute(SCI_GETXOFFSET)); +} + +void ScintillaEditView::restoreCurrentPos(const Position & prevPos) +{ + int scroll2Top = 0 - (int(execute(SCI_GETLINECOUNT)) + 1); + scroll(0, scroll2Top); + Buffer & buf = _buffers[_currentIndex]; + + scroll(0, buf._pos._firstVisibleLine); + execute(SCI_SETSELECTIONSTART, buf._pos._startPos); + execute(SCI_SETSELECTIONEND, buf._pos._endPos); + execute(SCI_SETXOFFSET, buf._pos._xOffset); +} + +//! \brief this method activates the doc and the corresponding sub tab +//! \brief return the index of previeus current doc +char * ScintillaEditView::activateDocAt(int index) +{ + // before activating another document, we get the current position + // from the Scintilla view then save it to the current document + saveCurrentPos(); + Position & prevDocPos = _buffers[_currentIndex]._pos; + + // get foldStateIOnfo 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 + _buffers[_currentIndex]._foldState = lineStateVector; + + // increase current doc ref count to 2 + execute(SCI_ADDREFDOCUMENT, 0, _buffers[_currentIndex]._doc); + + // change the doc, this operation will decrease + // the ref count of old current doc to 1 + // then increase the new current doc to 2 + execute(SCI_SETDOCPOINTER, 0, _buffers[index]._doc); + + // Important : to avoid the leak of memory + // Now keep the ref counter of new current doc as 1 + int refCtr = execute(SCI_RELEASEDOCUMENT, 0, _buffers[index]._doc); + + // NOW WE TAKE NEW DOC AND WE THROW OUT THE OLD ONE + _currentIndex = index; + + _buffers[_currentIndex].increaseRecentTag(); + + // restore the collapsed info + int nbLineState = _buffers[_currentIndex]._foldState.size(); + for (int i = 0 ; i < nbLineState ; i++) + { + HeaderLineState &hls = _buffers[_currentIndex]._foldState[i]; + bool expanded = (execute(SCI_GETFOLDEXPANDED, hls._headerLineNumber) != 0); + // set line to state folded + if (hls._isCollapsed && !expanded) + execute(SCI_TOGGLEFOLD, hls._headerLineNumber); + + if (!hls._isCollapsed && expanded) + execute(SCI_TOGGLEFOLD, hls._headerLineNumber); + } + + //if (isDocTypeDiff) + defineDocType(_buffers[_currentIndex]._lang); + + restoreCurrentPos(prevDocPos); + + execute(SCI_SETEOLMODE, _buffers[_currentIndex]._format); + + return _buffers[_currentIndex]._fullPathName; +} + +// this method creates a new doc ,and adds it into +// the end of the doc list and a last sub tab, then activate it +// it returns the name of this created doc (that's the current doc also) +char * ScintillaEditView::createNewDoc(const char *fn) +{ + Document newDoc = execute(SCI_CREATEDOCUMENT); + _buffers.push_back(Buffer(newDoc, fn)); + _buffers[_buffers.size()-1].checkIfReadOnlyFile(); + return activateDocAt(int(_buffers.size())-1); +} + +char * ScintillaEditView::createNewDoc(int nbNew) +{ + char title[10]; + char nb[4]; + strcat(strcpy(title, UNTITLED_STR), _itoa(nbNew, nb, 10)); + char * newTitle = createNewDoc(title); + if (getCurrentBuffer()._unicodeMode != uni8Bit) + execute(SCI_SETCODEPAGE, SC_CP_UTF8); + return newTitle; +} + +void ScintillaEditView::collapse(int level2Collapse, bool mode) +{ + execute(SCI_COLOURISE, 0, -1); + 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); + } + } +} + +void ScintillaEditView::foldCurrentPos(bool mode) +{ + execute(SCI_COLOURISE, 0, -1); + 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) +{ + execute(SCI_COLOURISE, 0, -1); + 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); + } +} + +// return the index to close then (argument) the index to activate +int ScintillaEditView::closeCurrentDoc(int & i2Activate) +{ + int oldCurrent = _currentIndex; + + Position & prevDocPos = _buffers[_currentIndex]._pos; + + // if the file 2 delete is the last one + if (_currentIndex == int(_buffers.size()) - 1) + { + // if current index is 0, ie. the current is the only one + if (!_currentIndex) + { + _currentIndex = 0; + } + // the current is NOT the only one and it is the last one, + // we set it to the index which precedes it + else + _currentIndex -= 1; + } + // else the next current index will be the same, + // we do nothing + + // get the iterator and calculate its position with the old current index value + buf_vec_t::iterator posIt = _buffers.begin() + oldCurrent; + + // erase the position given document from our list + _buffers.erase(posIt); + + // set another document, so the ref count of old active document owned + // by Scintilla view will be decreased to 0 by SCI_SETDOCPOINTER message + // then increase the new current doc to 2 + execute(SCI_SETDOCPOINTER, 0, _buffers[_currentIndex]._doc); + + // Important : to avoid the leak of memory + // Now keep the ref counter of new current doc as 1 + execute(SCI_RELEASEDOCUMENT, 0, _buffers[_currentIndex]._doc); + + defineDocType(_buffers[_currentIndex]._lang); + restoreCurrentPos(prevDocPos); + + // restore the collapsed info + int nbLineState = _buffers[_currentIndex]._foldState.size(); + for (int i = 0 ; i < nbLineState ; i++) + { + HeaderLineState &hls = _buffers[_currentIndex]._foldState[i]; + bool expanded = (execute(SCI_GETFOLDEXPANDED, hls._headerLineNumber) != 0); + // set line to state folded + if (hls._isCollapsed && !expanded) + execute(SCI_TOGGLEFOLD, hls._headerLineNumber); + + if (!hls._isCollapsed && expanded) + execute(SCI_TOGGLEFOLD, hls._headerLineNumber); + } + + i2Activate = _currentIndex; + + return oldCurrent; +} + +void ScintillaEditView::closeDocAt(int i2Close) +{ + execute(SCI_RELEASEDOCUMENT, 0, _buffers[i2Close]._doc); + + // get the iterator and calculate its position with the old current index value + buf_vec_t::iterator posIt = _buffers.begin() + i2Close; + + // erase the position given document from our list + _buffers.erase(posIt); + + _currentIndex -= (i2Close < _currentIndex)?1:0; +} + +void ScintillaEditView::removeAllUnusedDocs() +{ + // unreference all docs from list of Scintilla + // by sending SCI_RELEASEDOCUMENT message + for (int i = 0 ; i < int(_buffers.size()) ; i++) + if (i != _currentIndex) + execute(SCI_RELEASEDOCUMENT, 0, _buffers[i]._doc); + + // remove all docs except the current doc from list + _buffers.clear(); +} + +void ScintillaEditView::getText(char *dest, int start, int end) +{ + TextRange tr; + tr.chrg.cpMin = start; + tr.chrg.cpMax = end; + tr.lpstrText = dest; + execute(SCI_GETTEXTRANGE, 0, reinterpret_cast(&tr)); +} + +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); + } + } +} + +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++; + } + } +} + +void ScintillaEditView::makeStyle(const char *lexerName, const char **keywordArray) +{ + LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(lexerName); + if (pStyler) + { + for (int i = 0 ; i < pStyler->getNbStyler() ; i++) + { + Style & style = pStyler->getStyler(i); + setStyle(style._styleID, style._fgColor, style._bgColor, style._fontName, style._fontStyle, style._fontSize); + if (keywordArray) + { + if ((style._keywordClass != -1) && (style._keywords)) + keywordArray[style._keywordClass] = style._keywords->c_str(); + } + } + } +} + +void ScintillaEditView::performGlobalStyles() +{ + StyleArray & stylers = _pParameter->getMiscStylerArray(); + + int i = stylers.getStylerIndexByName("Current line background colour"); + if (i != -1) + { + Style & style = stylers.getStyler(i); + execute(SCI_SETCARETLINEBACK, style._bgColor); + } + + i = stylers.getStylerIndexByName("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("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("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("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); + + //StyleArray & stylers = _pParameter->getMiscStylerArray(); + COLORREF foldfgColor = white; + COLORREF foldbgColor = grey; + i = stylers.getStylerIndexByName("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 wsSymbolFgColor = black; + //COLORREF wsSymbolBgColor = white; + i = stylers.getStylerIndexByName("White space symbol"); + if (i != -1) + { + Style & style = stylers.getStyler(i); + wsSymbolFgColor = style._fgColor; + //wsSymbolBgColor = style._bgColor; + } + execute(SCI_SETWHITESPACEFORE, true, wsSymbolFgColor); + //execute(SCI_SETWHITESPACEBACK, true, wsSymbolBgColor); + +} + +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::string & kwl, LangType langType, int keywordIndex) +{ + kwl += " "; + const char *defKwl = _pParameter->getWordList(langType, keywordIndex); + kwl += defKwl?defKwl:""; + 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); + + ColumnModeInfo cmi = getColumnModeSelectInfo(); + const int len = cmi[0].second - cmi[0].first; + char *srcStr = new char[len]; + wchar_t *destStr = new wchar_t[len]; + 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_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]; + int strWSize = strSize * 2; + WCHAR *selectedStrW = new WCHAR[strWSize]; + + 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; +} + + +void ScintillaEditView::arrangeBuffers(UINT nItems, UINT *items) { + // Do nothing if item size mismatches + if (nItems != getNbDoc()) + return; + int ncurpos = getCurrentDocIndex(); + int newpos = 0; + UINT i; + buf_vec_t tmp; + for (i=0; i= strLen) return NULL; + char f[64]; + char fStr[2] = "d"; + if (base == 16) + fStr[0] = 'X'; + else if (base == 8) + fStr[0] = 'o'; + else if (base == 2) + { + //printInt(nbChiffre); + 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) + { + char *j = str; + for ( ; *j != '\0' ; j++) + if (*j == '1') + break; + strcpy(str, j); + } + else + { + sprintf(f, "%%%s", fStr); + sprintf(str, f, number); + } + int i = strlen(str); + for ( ; i < nbChiffre ; i++) + str[i] = ' '; + str[i] = '\0'; + } + else + { + if (base != 2) + { + sprintf(f, "%%.%d%s", nbChiffre, fStr); + sprintf(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 char *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 = strlen(str) - len2beReplace; + + cmi[i].first += totalDiff; + cmi[i].second += totalDiff; + + execute(SCI_SETTARGETSTART, cmi[i].first); + execute(SCI_SETTARGETEND, cmi[i].second); + execute(SCI_REPLACETARGET, -1, (LPARAM)str); + + totalDiff += diff; + cmi[i].second += diff; + //printStr("fin"); + } +} + + + + + + +void ScintillaEditView::columnReplace(ColumnModeInfo & cmi, int initial, int incr, unsigned char 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 unsigned char MASK_FORMAT = 0x03; + //const unsigned char MASK_ZERO_LEADING = 0x04; + + unsigned char 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); + + char str[512]; + + 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, sizeof(str), initial, base, nb, isZeroLeading); + + execute(SCI_SETTARGETSTART, cmi[i].first); + execute(SCI_SETTARGETEND, cmi[i].second); + execute(SCI_REPLACETARGET, -1, (LPARAM)str); + + initial += incr; + + totalDiff += diff; + cmi[i].second += diff; + } +} + + +void ScintillaEditView::columnReplace(const ColumnModeInfo & cmi, const char ch) +{ + for (size_t i = 0 ; i < cmi.size() ; i++) + { + int len = cmi[i].second - cmi[i].first; + string str(len, ch); + execute(SCI_SETTARGETSTART, cmi[i].first); + execute(SCI_SETTARGETEND, cmi[i].second); + execute(SCI_REPLACETARGET, -1, (LPARAM)str.c_str()); + } +} \ No newline at end of file diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.h b/PowerEditor/src/ScitillaComponent/ScintillaEditView.h new file mode 100644 index 00000000..683ea9f2 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.h @@ -0,0 +1,829 @@ +//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 "SysMsg.h" +#include "UserDefineDialog.h" +#include "resource.h" + +#ifndef WM_MOUSEWHEEL +#define WM_MOUSEWHEEL 0x020A +#endif //WM_MOUSEWHEEL + +class NppParameters; + +#define NB_WORD_LIST 4 +#define WORD_LIST_LEN 256 + +typedef int (* SCINTILLA_FUNC) (void*, int, int, int); +typedef void * SCINTILLA_PTR; +typedef std::vector buf_vec_t; + +#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 LINEDRAW_FONT "LINEDRAW.TTF" + +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 unsigned char MASK_FORMAT = 0x03; +const unsigned char MASK_ZERO_LEADING = 0x04; +const unsigned char BASE_10 = 0x00; // Dec +const unsigned char BASE_16 = 0x01; // Hex +const unsigned char BASE_08 = 0x02; // Oct +const unsigned char BASE_02 = 0x03; // Bin + +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; +}; + +char * int2str(char *str, int strLen, int number, int base, int nbChiffre, bool isZeroLeading); + +class ScintillaEditView : public Window +{ + friend class Notepad_plus; + friend class Finder; +public: + ScintillaEditView() + : Window(), _pScintillaFunc(NULL),_pScintillaPtr(NULL), + _currentIndex(0), _folderStyle(FOLDER_STYLE_BOX), _maxNbDigit(_MARGE_LINENUMBER_NB_CHIFFRE) + { + ++_refCount; + }; + + virtual ~ScintillaEditView() + { + --_refCount; + + if ((!_refCount)&&(_hLib)) + { + ::FreeLibrary(_hLib); + } + }; + virtual void destroy() + { + removeAllUnusedDocs(); + ::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 defineDocType(LangType typeDoc); + + void setCurrentDocType(LangType typeDoc) { + if ((_buffers[_currentIndex]._lang == typeDoc) && (typeDoc != L_USER)) + return; + if (typeDoc == L_USER) + _buffers[_currentIndex]._userLangExt[0] = '\0'; + + _buffers[_currentIndex]._lang = typeDoc; + defineDocType(typeDoc); + }; + + void setCurrentDocUserType(const char *userLangName) { + strcpy(_buffers[_currentIndex]._userLangExt, userLangName); + _buffers[_currentIndex]._lang = L_USER; + defineDocType(L_USER); + }; + + char * attatchDefaultDoc(int nb); + + int findDocIndexByName(const char *fn) const; + char * activateDocAt(int index); + char * createNewDoc(const char *fn); + char * createNewDoc(int nbNew); + int getCurrentDocIndex() const {return _currentIndex;}; + const char * getCurrentTitle() const {return _buffers[_currentIndex]._fullPathName;}; + int setCurrentTitle(const char *fn) { + _buffers[_currentIndex].setFileName(fn); + defineDocType(_buffers[_currentIndex]._lang); + return _currentIndex; + }; + int closeCurrentDoc(int & i2Activate); + void closeDocAt(int i2Close); + + void removeAllUnusedDocs(); + + void getText(char *dest, int start, int end); + + void setCurrentDocState(bool isDirty) { + _buffers[_currentIndex]._isDirty = isDirty; + }; + + bool isCurrentDocDirty() const { + return _buffers[_currentIndex]._isDirty; + }; + + void setCurrentDocReadOnly(bool isReadOnly) { + _buffers[_currentIndex]._isReadOnly = isReadOnly; + execute(SCI_SETREADONLY, isReadOnly); + }; + + bool setCurrentDocReadOnlyByUser(bool ro) { + execute(SCI_SETREADONLY, ro); + return _buffers[_currentIndex].setReadOnly(ro); + }; + + void updateCurrentDocSysReadOnlyStat() { + _buffers[_currentIndex].checkIfReadOnlyFile(); + }; + + bool isCurrentBufReadOnly() const { + return _buffers[_currentIndex].isReadOnly(); + }; + + bool isCurrentBufSysReadOnly() const { + return _buffers[_currentIndex].isSystemReadOnly(); + }; + + bool isCurrentBufUserReadOnly() const { + return _buffers[_currentIndex].isUserReadOnly(); + }; + + bool isAllDocsClean() const { + for (int i = 0 ; i < static_cast(_buffers.size()) ; i++) + if (_buffers[i]._isDirty) + return false; + return true; + }; + + size_t getNbDoc() const { + return _buffers.size(); + }; + + void saveCurrentPos(); + void restoreCurrentPos(const Position & prevPos); + + Buffer & getBufferAt(size_t index) { + if (index >= _buffers.size()) + throw int(index); + return _buffers[index]; + }; + + void updateCurrentBufTimeStamp() { + _buffers[_currentIndex].updatTimeStamp(); + }; + + 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; + }; + + LangType getCurrentDocType() const { + return _buffers[_currentIndex]._lang; + }; + + 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); + }; + + // if we use this method, it must be via the + // gotoAnotherView or cloneToAnotherEditView + // So the ref counter of document should increase + int addBuffer(Buffer & buffer) { + _buffers.push_back(buffer); + execute(SCI_ADDREFDOCUMENT, 0, buffer._doc); + return (int(_buffers.size()) - 1); + }; + + Buffer & getCurrentBuffer() { + return getBufferAt(_currentIndex); + }; + + void beSwitched() { + _userDefineDlg.setScintilla(this); + }; + + //Marge memeber and method + static const int _SC_MARGE_LINENUMBER; + static const int _SC_MARGE_SYBOLE; + static const int _SC_MARGE_FOLDER; + + static const int _MARGE_LINENUMBER_NB_CHIFFRE; + + void showMargin(int witchMarge, bool willBeShowed = true) { + if (witchMarge == _SC_MARGE_LINENUMBER) + setLineNumberWidth(willBeShowed); + else + execute(SCI_SETMARGINWIDTHN, witchMarge, willBeShowed?14: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); + }; + + void sortBuffer(int destIndex, int scrIndex) { + // Do nothing if there's no change of the position + if (scrIndex == destIndex) + return; + + Buffer buf2Insert = _buffers.at(scrIndex); + _buffers.erase(_buffers.begin() + scrIndex); + _buffers.insert(_buffers.begin() + destIndex, buf2Insert); + }; + + int getSelectedTextCount() { + CharacterRange range = getSelection(); + return (range.cpMax - range.cpMin); + }; + + char * getSelectedText(char * txt, int size, bool expand=false) { + CharacterRange range = getSelection(); + if (size <= (range.cpMax - range.cpMin)) + return NULL; + if (expand && range.cpMax == range.cpMin) + { + expandWordSelection(); + range = getSelection(); + if (size <= (range.cpMax - range.cpMin)) + return NULL; + } + getText(txt, range.cpMin, range.cpMax); + return txt; + }; + + long getCurrentLineNumber()const { + return long(execute(SCI_LINEFROMPOSITION, execute(SCI_GETCURRENTPOS))); + }; + + 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 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 setLineNumberWidth(bool willBeShowed = true) { + // The 4 here allows for spacing: 1 poxel on left and 3 on right. + int pixelWidth = int((willBeShowed)?(8 + _maxNbDigit * execute(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)"8")):0); + execute(SCI_SETMARGINWIDTHN, 0, pixelWidth); + }; + + void setCurrentIndex(int index2Set) {_currentIndex = index2Set;}; + + 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); + }; + + inline void makeStyle(const char *lexerName, const char **keywordArray = NULL); + + void performGlobalStyles(); + + void expand(int &line, bool doExpand, bool force = false, int visLevels = 0, int level = -1); + void removeUserLang(const char *name) { + for (int i = 0 ; i < int(_buffers.size()) ; i++) + { + if ((_buffers[i]._lang == L_USER) && (!strcmp(name, _buffers[i]._userLangExt))) + { + _buffers[i]._userLangExt[0] = '\0'; + } + } + }; + void renameUserLang(const char *oldName, const char *newName) { + for (int i = 0 ; i < int(_buffers.size()) ; i++) + { + if ((_buffers[i]._lang == L_USER) && (!strcmp(oldName, _buffers[i]._userLangExt))) + { + strcpy(_buffers[i]._userLangExt, newName); + } + } + }; + + + + void currentLineUp() const { + execute(SCI_BEGINUNDOACTION); + + int currentLine = getCurrentLineNumber(); + if (currentLine == 0) + return; + currentLine--; + execute(SCI_LINETRANSPOSE); + execute(SCI_GOTOLINE, currentLine); + + execute(SCI_ENDUNDOACTION); + }; + + void currentLineDown() const { + execute(SCI_BEGINUNDOACTION); + + int currentLine = getCurrentLineNumber(); + if (currentLine == (execute(SCI_GETLINECOUNT) - 1)) + return; + 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 getCodpage() const {return _codepage;}; + + //int getMaxNbDigit const () {return _maxNbDigit;}; + + bool increaseMaxNbDigit(int newValue) { + if (newValue > _maxNbDigit) + { + _maxNbDigit = newValue; + return true; + } + return false; + }; + + int getNextPriorityIndex(int & weight, int heavest) { + weight = 0; + if (_buffers.size() <= 0) + return -1; + if (_buffers[0]._recentTag < heavest) + weight = _buffers[0]._recentTag; + + int maxIndex = 0; + + for (size_t i = 1 ; i < _buffers.size() ; i++) + { + if ((_buffers[i]._recentTag < heavest) && (weight < _buffers[i]._recentTag)) + { + weight = _buffers[i]._recentTag; + maxIndex = i; + } + } + return maxIndex; + }; + + NppParameters * getParameter() { + return _pParameter; + }; + + ColumnModeInfo getColumnModeSelectInfo(); + + void columnReplace(ColumnModeInfo & cmi, const char *str); + void columnReplace(const ColumnModeInfo & cmi, const char ch); + void columnReplace(ColumnModeInfo & cmi, int initial, int incr, unsigned char format); + +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 *)(::GetWindowLong(hwnd, GWL_USERDATA)); + // + 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; + + // the current active buffer index of _buffers + int _currentIndex; + static WNDPROC _scintillaDefaultProc; + + // the list of docs + buf_vec_t _buffers; + + // For the file nfo + //int _MSLineDrawFont; + + folderStyle _folderStyle; + + NppParameters *_pParameter; + + int _codepage; + int _oemCodepage; + + int _maxNbDigit; // For Line Number Marge + + void setStyle(int styleID, COLORREF fgColor, COLORREF bgColor = -1, const char *fontName = NULL, int fontStyle = -1, int fontSize = 0); + void setCppLexer(LangType type); + void setXmlLexer(LangType type); + void setUserLexer(); + void setUserLexer(const char *userLangName); + void setEmbeddedJSLexer(); + void setPhpEmbeddedLexer(); + void setEmbeddedAspLexer(); + void setCssLexer() { + setLexer(SCLEX_CSS, L_CSS, "css", LIST_0 | LIST_1); + }; + + void setLuaLexer() { + setLexer(SCLEX_LUA, L_LUA, "lua", LIST_0 | LIST_1 | LIST_2 | LIST_3); + }; + + void setMakefileLexer() { + execute(SCI_SETLEXER, SCLEX_MAKEFILE); + makeStyle("makefile"); + }; + + void setIniLexer() { + execute(SCI_SETLEXER, SCLEX_PROPERTIES); + execute(SCI_STYLESETEOLFILLED, SCE_PROPS_SECTION, true); + makeStyle("ini"); + }; + + void setObjCLexer(LangType type); + + void setSqlLexer() { + setLexer(SCLEX_SQL, L_SQL, "sql", LIST_0); + }; + + void setBashLexer() { + setLexer(SCLEX_BASH, L_BASH, "bash", LIST_0); + }; + + void setVBLexer() { + setLexer(SCLEX_VB, L_VB, "vb", LIST_0); + }; + + void setPascalLexer() { + setLexer(SCLEX_PASCAL, L_PASCAL, "pascal", LIST_0); + }; + + void setPerlLexer() { + setLexer(SCLEX_PERL, L_PERL, "perl", LIST_0); + }; + + void setPythonLexer() { + setLexer(SCLEX_PYTHON, L_PYTHON, "python", LIST_0); + }; + + void setBatchLexer() { + setLexer(SCLEX_BATCH, L_BATCH, "batch", LIST_0); + }; + + void setTeXLexer() { + setLexer(SCLEX_TEX, L_TEX, "tex", 0); + //execute(SCI_SETLEXER, SCLEX_TEX); + //makeStyle("tex"); + }; + + void setNsisLexer() { + setLexer(SCLEX_NSIS, L_NSIS, "nsis", LIST_0 | LIST_1 | LIST_2 | LIST_3); + }; + + void setFortranLexer() { + setLexer(SCLEX_F77, L_FORTRAN, "fortran", LIST_0 | LIST_1 | LIST_2); + }; + + void setLispLexer(){ + setLexer(SCLEX_LISP, L_LISP, "lisp", LIST_0); + }; + + void setShemeLexer(){ + setLexer(SCLEX_LISP, L_SCHEME, "lisp", LIST_0); + }; + + void setAsmLexer(){ + setLexer(SCLEX_ASM, L_ASM, "asm", LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5); + }; + + void setDiffLexer(){ + setLexer(SCLEX_DIFF, L_DIFF, "diff", LIST_NONE); + }; + + void setPropsLexer(){ + setLexer(SCLEX_PROPERTIES, L_PROPS, "props", LIST_NONE); + }; + + void setPostscriptLexer(){ + setLexer(SCLEX_PS, L_PS, "postscript", LIST_0 | LIST_1 | LIST_2 | LIST_3); + }; + + void setRubyLexer(){ + setLexer(SCLEX_RUBY, L_RUBY, "ruby", LIST_0); + execute(SCI_STYLESETEOLFILLED, SCE_RB_POD, true); + }; + + void setSmalltalkLexer(){ + setLexer(SCLEX_SMALLTALK, L_SMALLTALK, "smalltalk", LIST_0); + }; + + void setVhdlLexer(){ + setLexer(SCLEX_VHDL, L_VHDL, "vhdl", LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5 | LIST_6); + }; + + void setKixLexer(){ + setLexer(SCLEX_KIX, L_KIX, "kix", LIST_0 | LIST_1 | LIST_2); + }; + + void setAutoItLexer(){ + setLexer(SCLEX_AU3, L_AU3, "autoit", LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5 | LIST_6); + }; +/* +LIST_0 : LANG_INDEX_INSTR +LIST_1 : LANG_INDEX_INSTR2 +LIST_2 : LANG_INDEX_TYPE +LIST_3 : LANG_INDEX_TYPE2 +LIST_4 : LANG_INDEX_TYPE3 +LIST_5 : LANG_INDEX_TYPE4 +LIST_6 : LANG_INDEX_TYPE5 +*/ + void setCamlLexer(){ + setLexer(SCLEX_CAML, L_CAML, "caml", LIST_0 | LIST_1 | LIST_2); + }; + + void setAdaLexer(){ + setLexer(SCLEX_ADA, L_ADA, "ada", LIST_0); + }; + + void setVerilogLexer(){ + setLexer(SCLEX_VERILOG, L_VERILOG, "verilog", LIST_0 | LIST_1); + }; + + void setMatlabLexer(){ + setLexer(SCLEX_MATLAB, L_MATLAB, "matlab", LIST_0); + }; + + void setHaskellLexer(){ + setLexer(SCLEX_HASKELL, L_HASKELL, "haskell", LIST_0); + }; + + void setInnoLexer() { + setLexer(SCLEX_INNOSETUP, L_INNO, "inno", LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5); + }; + + void setCmakeLexer() { + setLexer(SCLEX_CMAKE, L_CMAKE, "cmake", LIST_0 | LIST_1 | LIST_2); + }; + + void setSearchResultLexer() { + //execute(SCI_SETLEXER, SCLEX_SEARCHRESULT); + execute(SCI_STYLESETEOLFILLED, SCE_SEARCHRESULT_HEARDER, true); + //makeStyle("searchResult"); + setLexer(SCLEX_SEARCHRESULT, L_SEARCHRESULT, "searchResult", LIST_1 | LIST_2 | LIST_3); + }; + + 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 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; + } + }; + 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; + } + }; + + const char * getCompleteKeywordList(std::string & kwl, LangType langType, int keywordIndex); + void setKeywords(LangType langType, const char *keywords, int index); + void setLexer(int lexerID, LangType langType, const char *lexerName, int whichList); + + bool expandWordSelection(); + void arrangeBuffers(UINT nItems, UINT *items); +}; + +#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/UserDefineDialog.aps b/PowerEditor/src/ScitillaComponent/UserDefineDialog.aps new file mode 100644 index 0000000000000000000000000000000000000000..00c49b99412a6a461fdafb6fb5d5bd364652ac69 GIT binary patch literal 66736 zcmd752biQsaXwzF42WdFAdyZeuHvLk$`f}-H#;*-xWq}z-QJ#ba6#OikT75r2@2$7 zG9oEqf(a5)1e0uou|&?!#$*f%1pVK)s{8x;`(|df=f8i?!|)v1uF$c%y1Kf$KM|2t z_;=rZ_78t1el4Vq!oN9LD<%B*zWc@;{?G&5A9DKsW3uJcjontiQ?7P5?%cI^>B3E0 zPB>v>d)LKFyQ^Ea?cKF|jBDDRLC%gH<}E^kb0Yo#|t&OQb;JW0@W7q>;^|mF2r9u@z-kn z_gQi=u)BfXqd70hUi@zx@IkH*W7hk%A1g1FQ{@o(C(ZYA&38BQI3N7GrpQF-i$_HA-4THcg9mH(;liX98cNx*hM-%L-<_(T`ez$OdKNLRzB;0E31k6 z?LbMZ(7(aY@!g3U9tpnh4DjtioBm>u4_O=_Z$&--P7WV?oP1aLE(CPn5-QPS=%T(+?=UEuC_wzFM^bDwsoV~#=nPZu|T$t zk<(DeoxyzAH$8Ty^6zr|`z~8Ys2;me`G?8YlEnP7})3ZpAMrTXofUdmP>J zvh{Fi2~arNmC4q_F~jR}k>gpZY`sXH1pRu5JX87hMYd+JDjp&i5AcnaE$Z{HqmHMc zznK1*ND7MT9u z*aA+E9xjK;H2Q4K8tUkM*Q19+(#XHo@$ajw-ztZztglo4L0P|Bj#pVuv&UHL1mGu|OV|C3wPx_hp+L2W|WfiOuv*9ibr$Qt{ zFH{-$NKlu3(U*tI89hCVaEcYiW;yUNgKm2a2~ z?STyKl-pc8a?bK!UWV>g8F<3l|E(T+@EG;b6CMA)%h0_lL#vd3m<&B|jP~3SL-CZM zL)D&plH!+>p~sG$2pKxk(Je1SKUF<+l%rjl4E&w=Xhu=ot0T zu>*YfCqt*GJ$Ib)4U?gNQ5kx?YeydT+Xb-WmY1QYjm@Agmj`v(H$C(`<-fx5@4E~= zUH1f6D*rGUdbY~YRYUQVq35b>JYVt4$mGL!+vE~R-wwd){Hg6&)G+hk%H!Nu*+lL^~x$;n+{R_VR|K_ z_RRx^;;C11YPUR4@yqFzqS8Ic(Jil69)Y##EIHKCu1v2y0`n&)4|Y5&)hpM^5oq5b z@(|_Q7rl~G`{tnoeD|kUHmH5`Fy%|>75GmN5c(P}mIH%!>`?!jdD|N4U1KB%C#%ot z`VA|SB@?1hj;hN4HpjoOa`a);nm((yEB~Mz-6f~%`t**W__6jia)z!u?^OI~Il4yX zmF``RZaF!+LRRVebc3T^i5xu`JiD-_-RO8$Do5AINoe08a+C6{T#oKQyJ_RxJis?v zj_Ci~U;Yg1PhZ~Z>e+-hYKLsb`msA2+E_=tNoc#A8I-Xvw##GSk0Ae9j(=Ze<5qdI z>X@^Ye^55=miMTRDGtR`$Gi{r;{&Cn_|dX)t$a##Oxe*bCmUDF%b{b=mWrcYiEKOs zJk&8&$Fow|xK`exI;N(4E0>Ks(QeAd>;T_r*|2^1zsXhdIGIzvVLIk2%+@RAjG!H% zjwz}4oTnqnAM<{r{F_{Zyw4euH_vGvF5i|7sB_)bnSB)I9iIT5n#>%$ZvyW+@U9-g z8+!HA+-4^=alZ6GX(<1t(o_3tllo|%j+qgkH?4yAmS;|T0OPFTSxoY0`Td>dH-EqR zF|WZK_aw7a8}JUuDE)NrcX_VFcDYlE%JXoyCai?#4r!=A@Rs{2=lc%`?Va1tWtEq+ zcXIz5dk1;$Klavk1#9g%M&r2ixJF%(>YcIn^U%(mJVeG7e<^%#XAYq`Pic;KG^c|q z{IQ(RXgPc2n4#tD*Zz?FnXG}F9j*AwQR*UUwN0LhG29C|;Yp&&>28JaJTX0%l=ah) z4`uz>C?Dpq4YITeGR4z3o(IGdmdL}c+lR@Gs#{NVc~B4Si*7zlZdd-39RI%R<`2sa zs+&(%{z2V*m)xql`IMn}uG_b%Zq6uvv~IpeKCg6HN4K1AzCvCP-F%wl9PLVU^Mk>& z3p{zpvr^ss0`x!kl?CNnxo*A#?WS&?7~mVNn{C}b5W4r9a)PU8TFw%(tox(S>)fAo z^vllu$Y*+}`m3%D>b5U3b+{a%{MR}DeU+(O<$-DozD)TCWvVYfRhfF_P(0WB$Em;T zC5j&{Q`gD~WAwYf)X^;`Q&-9#AXBHyHI8;AGW8Jf&=$Pf@vKy)UMLSzU&V`+Z{;%e z0QtF`1DSe-<714#Me5(&1fB3KXp>!0{KToDpx|%YOP`=R|K+Z}%gT!K9MP6B8;e&d zPcT+amTo|us4HJRvQCR?E!bImvQ`Jf=fA(u*LJSF$kmBwr#$)Efq&Gsj0(wyZHZ*~ z87hN6bLH-b-CA9=FOamEm6~f6yx~@)K9N4`BAde&6X8#^R~j+KJjU98jn&{x*nLkz>5LicAkUq!p%_(^{EfArRCQr`<4?a_|5i*}K26|BxZ>6$uuJy0G4?-%S!<+(iQcm&#@B$BjK2r9MQCQ~t|hw9Ef4oXa19{KsAXRrsG7$CA|Ex~81{YOE|J ztg$D!`g2dkI_$wp#8rtSwTQJT{5?j-&i*R+Cct+*_;!Gr7WQ`hcLD!p4(#{MnnNCA zlKgQkdk^|x7W^l=a_eaCPV_NLWSk#&TV6VT2=-O@XFl5-HsQ~aGW-Sk!lf2y`5Jgm z?WfW@c0ciruI~;)blUOgyBkpoV;Z{HWft+T4&VM@4_?;J%6{0>K16O(`paC2{y$^w zN6O(UlVbo;_FIToOa8{%YaI=z9BImEJ$s!iDSxlNEge((1%+qi&;xXuB6Wm9j*yGD z?cB2K;you{ASiKdy}72^k<2BTiA+}hoK(Q?UP5ds2*A1kihORNUiCDGMKEA0t+ibu z3fYW2K14KoMxSA^n&(A`OFen_1rQ49^cLoe&3dic?Mbd6k3f87r&{b)+npAoUAqx- zp;NU8*oArpCc+~{>fKhO*sHgi#kIvwbvR*89yLJNY;}9!E7#}St)TQo0eLomzTT|Q z_veYIcGgrY!;8p5J;;1<-AYI&A;!{OyD(R;pbyzgNOb2~Yn!dke6fLcJwZWH@`(|J zR;Iq8T7i75ilHo5p?P*La?_dsB6(~`;_Qp%UVRO^6;gg=1jdv^@G+U#QZh}-(GeEF zW=r|1G9|}E@MaOm=f`RiJ=1G-s@QTK7ojWFTCv~g38Y|LfwdOmmZK7~SxgvLQ9$T^vFW1U2QsGmNuaR>*baQ=BOwXSnD?$T}Vx}iALuGc2|9CHl{aP z+J>k!d*w!}TW`)H+ZlzndUMszhE{7Hc|z?)bgTpE^4N3{s&xIPQWmfkkTt6p8l`@( z*J@J4vy9;es1t*7n4Scci_LPiL83eYr3smji3*5{Bxs$1vN~O4E`;R>n}l8=U8z`J z&GfXiHQg(gn4FO(YqH#^7Ihkz5miq5PPNzXXbmgSK7@4V>NULR2A=?QtNrss;y*=k=& zCZMKBLXd}SR>(R1<~hnW1uaIBTD@u6PQ&@)c#L9(THeYzr_O?Aa9~P6wTs$l?MiT9 z5CTboHq%Cy5`y4tKTna46k^jvFR`3qRAm~K>c4001#1exx)Nj-_> zoT*NIc20Aff`vc;rU%C`Hw~MH>29@AEi1(gR%}90A=S0HB9~wQs_UxdJ|;c5N{Fsj zu4b`~S)+VqdA7ppO(-~pROC4dsUUCTt0F?2d~?-?R<9<1sp$shCi0yq$@4Ycap|(W zK-0x`o2$V@MP8`sZlhXd1`{=ejx)n%f4*I;V7^~6nL#vv45Ii?X60o8h|)iqgTFnd z$`h2AR|KE}K?Qkb0Gc3ZLS7YsCJCC9R|lXef~Mp(0ce__X?bk`njvUL{z^gfP;vEk zV?AL-d7Z+F6%O}g3BD)Rvs;C-DMCLISVrKN0{f+22TGN&3WCuHgRs@9{Q;`Vn+#N6 zqf5jklQo={kf_FPnaappEX5v~%F0_U#m<<@;m(0lvLB}M@-|Dc3#JP2b|{XmpPG<& zSc(mwn#5fM#j(v(Q}QlLvAI*z@CRDy9H^-oxW_E1wJFL?E~(Wi$;~dQ^(o6OE~yo& z$h%!qYgCoLc1f*L4TnCKGwU>+k@vbJD>a?P(T8DKtLdD)-;$V$Nak@MrC3ZvBn$EZ zmt?J`C**@J$y!ZM%7;ge$I+K?#hL|2M^|V$irXXJmF^$%G>cp7| z+62IPfI4Uj#S2CNE~>8w%+}kgR;uXrT0*axdoOTSgVY@;GSGyqv}_7UVld zy$KT4orLr^mmXXKxg za4chGtT-A znp(=k394gI>^IAEu;S{Jyi!4amH=x#BE?^tfIBYWg3jd(C{4;QQee)6(v zE6P0)pxx-RH%leCH-eR0^YawKQdxc%0b$7*Wkr4;0ozrqg&g-%6<$(SiG^sXHTh!% z;0!Eh1ef6)1?OO;Bo7$#0P2QH86IN~pmu;>eNY6Tet`9SXat~!sMO@a5umsZkScaC z5hR;oRjN68w1Qwo`t_`um&Zh~4An`sAcrZ$?LbynspP8@@Itdrzbf zk7QGFq(azy?i&<1gJ=NXo^!D5k+3KyN3eF0!%;2CDFH}pT$W4#V)tPKkc~iVyX9Vo zf>NzYE`pXJQwpp}J^~hdJ+9Zaj1(dm>?~+3LbEavLCdW+TU^V@WCSbrdsJ+-yi7%~ zYO}GHumbKH_}0-fHEXmsAu|g01y9Opnl5*&cC{(QfRL}c&H<(o{GfnNwN+!zGjgT^ zI8~S~%2}FL`y1&JZY7cdc3n|Tt6Eu##-Tl0t4K+c91TBcwW^fIWGyr~whhQNgP$}N zVmnWRWu>LC3br^YfH8iTgnU^Okq|4otLMEi6kZ8xH&`Ie5T3mo-%bgf# zWt{?CGArvfS#H$Js~s#S8#E_KQLTkRwfv`Kqe55L8;t-wE$1q@+ANkDt|~=2&u7r7 zRysuv7wTM+1rP3-#R_0qo~ppvYA*&>WK#%iRGYIs$_wbLvRP5>qS>4P)nrjY++A4> zu)Wx#peOgMo%Jw>yV%lW$F5mmqp>wca;s(FyqvG#H2I`l;K=KoRhbNSCQmcUPO)1p zt)5kL8}NcWUE$sJ-Eyme?Wecpft!%+hQl7y?>U**wCqqgVEA9iQIws=fu6x;(4ine z3DOIdrczy#*gPQPlI&HKmj@_mt9@B6QbY}_b68$Qo~iI&eLmiWAfu{WtZ>^(vKY&! zCYLB2Vp8sRx@vD`GBAyvrQrD%)PXNtIbbIJh2=C?Z&Z?~oIG1m7_fe|yS@npgxp$Iz@%Aplj7zf_b80{766d~#E8zv>Kx^i>+O<(|z$>})Pm zc(>hZHL4xDX`Iw!M{~KND8*R#=dF;ET%pkUYO&kzRAWS0t~7Gp$Hef8T&3_e(CWQb z46ovRh&94EbV7JdUZ8NDg67A{Pn22K&24 z`{lTkvg7hb19bacOz=tvrZYW#S$R_m-i3_@@5`GFT!wX5FBcnFLJ7~yTU=Y(>np_` zZ4$JwDAyZQeJkg{ls2~kP$hYrqQZt($YvyLEKU zdo0z58sa3+$$JS{P+37&yiZeF?aq4m^WLx7(w@h3au$0gGgXogD5Be24?h7lpdaI@ zvV1Uwa^pKykq;@RQtxunwI0&ePgUi^ih|Tf!a7xxTP>#mh|Sw=3T&2x1r>X^k2z?# zq+&1kaZg-ql%r)7o4QXp_*@+;5@d!0gw5S29XMWiu*JLG0Tap$d%aI7995>8@fs7G zzE3Nh`Yp(2T0ZNtQJonr^4MB^&LNz$&utnq8JHQLPoi|=00g#xNkpa8C^yt?mnmWw z=#b7;7-xuWU=rms#6~cQ2s6ZX&>@{$G0t#G{vnC-8BWWWlZY_G8TpDsI;UiuVM*>x zqI`yB`C1YYW>}H0D-xQqR)=cmaAsk7ecwZU0R;ZQ11;+;JgYxc5CpPgoH_ZCLMqi_ zC5GnZpB0Lg9|gr(7UW+7xX*P${?$X{EGFgOJTRH}l>ECQka45v8!#R2x}?QI@#=` z{5}C~x7x0^vs3a1MNvgXTUg|d4Ppe3h5_cweF}xQ9(&7*nY3A$E;xw7Ld{Iv+;REC z>$-o0;*zRz0?P%5UXB5JAYM7Muv`vQ6cnv%LtI-pWe*AkT!geb;d4wfdL5#AU>pW6nH9bZ0 zJAkYl7C`CJrcITT!>z8ph8n{2-Pux$yW>n2mdQ~G99#=FDf4+bI)Q1RjS*WxaMn*t z$z@s6Z6)%XkYf`FXk063QjSX?Oo&QuBE#MpPonj3&RD1A`2A$QxqyM2^DA2xJNpxq zL$!3IOmfg0C&h5Dy$L>9!71IHgHkyqM3@}q=qd=ou@cK+x0h8^N^9pb1<8d7pVfrq zLvWbYq!bjD($~4nluU#OpVhQXhTt%(8JRK^E&a7~RXbLQkdGq@J?baa!W%FJIbw! z!=A8S4t8=m99nI&oGSI$Ldv1*wtH}3BITg-c6fMb-{he2c6x+AiADG2p!0TlxI2;p zupk$DV01>T)D!XykLcA+&*q@zc6%UNR4&?PGY1v7$HQp_7CRkkL5^Au+qbJo+PXwvqJW-azp&oUH7Gl|K`Unr*1X|-#pu=+)E&|1&-WjJ4R zTuworqc~lqu}wBxS!)fu^wJ0yNE!^&%OW@#>~u7fgJpVofQVLmo!u7GXzfzV zZP4=2rtdT?{01r1w7g4Ex&uhzX5^CAmpa#qR2I$?EBRljxeV z+^k459m*yAR}WEvs>m&ha&}iL*Q&f*v1&aut83du9MAgRt;t_2(gEv<4SgOO^F1Nj z%2t(@hsu1fl^S_0@^GrX&*TOG0Ed#__LN-ZCy-1iM^MHMx@wweqMnVA`(+$>-nVs5iv~Hl9Z81dh9ww}%5W;(zVz)y0e&_x+ z%DnvEr5$lW{y>21P^`&+jFZMPDfh)7$2G<1MRIkZS_EP{#w2{=eMEGig;BltBV3Oc z0F5fYKcSrLCTXr22Y9H8nXi+Tcp!0ZuYuWss~#K{y2Y`|AHtM+jIgvnV1Mb(_gXl^ z&pNE;^y{BRxo|Jn>I03nET)*2NA8axHN?8O zFtDsVHUYpyMbsUHL}C+ea2%j z28luC$Vm?5qrn)-cd~~?p=>!hC5AD=3)3wVLo|4aApmx%fPX{*tmm*Thh6dnyKXz~fjm$G7S^tC({1<5F|{s5o4- zWm{UQ5@#{=i4Zr+VM~EQkQ)tlTY&|>|`7K2AY zd($4VgsIDdvE8vKN1Q^spIm@W>@E=7zaxmJ&N@H1)pC-_A0#0gBUDBz5)%o zNa0>+fx>|5uOZJ=)S7y?ZU=o30Ef9)G4S2;2vC=JS5QMPv2tJ>kq!G7wVqsg4S80C z)~aBA;iBluY{*|I+RqT8T%iqlwsE>ehEiH~wRw(WoX$1zC8iOzQsfQw zmx}Vs3Yn}94SAko{Q5(TRiPo5D#ovC#9*S}*O1E;)0@MQYFw0+)sV{-iS^IyXID}~ zt}v!z$%SnoCoQQVS1QJjiSvj=e9t$m(_#_U@xH)v#df8Vl9HtIj|tL{n&&Y#1$+40Lf&&A%ElXjb0~-XATYdK!iu6Yr^ek)dI-}J&D#U zO=H=7$kVu`#M!^ve{Oo+>PhI0g|{W@KUE(Mxy|FDnZxc^z0;77c=XV@0?~_y#UvM? zcqGQ<o~|<4|7k2 zS^ENg`bAGXv#400IJtybFSpoIh&1QZKEU5cmMb4q!jP2;c_l zKuutjs~vY%tX+l?JXA52Zd;3{1i;1iU=MUXr(itp;K9CD+JlPB%R@afthM5*@-W3A z-ko<^qWwQ**5hjdLl$-1N zX~lWN+bYim{Zxh1w}F$W5>_uenkNC5^V4E<0>{Ptbj9_XSmhBx6iEQ9c&4IK2#Us8 ziimd&EQgA!Atl8m%vUvf8&a{%?BWF(sG}NERj{s?=k&W#V2?-7Dq3B-vGW;>kN_~B zqu4+`Rd5@G_Hcl$eGaL2e?8gYuFC;;e{~F==sjQ)>25%yUFZok(KBp3X28aYzF|8s zIa(?wzLRy*tTAjXn^vQyy< zhY#S0tJ{VcVFjZqv#6=2>56NmgsC=dZdvMkBgqsb^qG1;+6qYFN6Vl{RI2v||!lNL*S{99Z zmco1&GXpg1*$SM8>k0Db1LbO2wCy>Hp%sg6b0&H%i}pQN5wQ%jeF&%hO9gXl$g%Sq zFS$~|>ZK&u56o2uNUOv+XSx~lxhX`PU1Oj=tStC>6_}T64Orpfodf3NIs24>_Xj?$c`D5o$ZFEyA}iI8b|nWs|UA4@Jw$;&;Ee%FcuC*>6}uYo4ym7dNy z4#{1RR~ghb#%S~MYJtn)TL~*_CZ80JkRa}L8dyEK1b}}#Th!Mf);)>ln4N+2eH=Br?c<(ZpDPn>UB^iL= z2*4RE;1jqW=Gk%4vIE=D;L~!G!P!RaXy|n({gm7s!@clKOv)`W)K6KGBTf>Ca>x71 z^SKF_yYDqvy;LpEBi9L>>%Y%HYm10zAp|j!20<_ajD3P89g_l8+gzNqL;a6#KZP5r#xbp2Rf#q(NYSYA71*Cm^7wJ`F@2+P^s8 zhH20C=Hzn*bL{N4&l?2ZQ0t?De8C_kobfBygnZE;I9#xNCgn>8fwo5w8tXQJy~5u+ zV6mh3r&+jW@(%{LV=Y3p_%9ojG37kioHc7 zau5H6U`)xq{L7YrY56@9y3WkVANV)2DbDiD8B5~WfuzJ*g!^3B?%`z$0^IQtI)f&{ z!3RpU>+dPkh-%0~6;#%U4J?g-VVCeQ1qQAqY!4o;Fuf-Wf3q`_VXXg|!u!}Hbr4zN z;Mf>ELg5VtmPc?J>W@@7q6xZdVa{ohG|(TVVBSlL4G5aR4f*p36I&6sKYO%dnk}By z*qtNWo;^n4*ovb&;J#OHif*P3Qv?jwN~@`NeQ8BEf%V{;^g-f4-!r z%Iw32JRZP#hOoIJGq^fC&5+0;|%Pt zt>U83gp4bU1K=XDIApjWczi&MaCW_?2E>${pa|3!u2z3%pfoKf8hsLsdu^VYC6rrz zcN?OF+ii*=7!NyCHRdo=!VNc{52uI)8)Zsx6#0BYFird{28;2dg|SGcM02?z*<-;ULh^f=qcvPE`!X8<*pFu3$Ufa!F3}2ru9ZQ9t!NDq~P6Ir#uJCZl!?i1lz|$1r5BiafE*ei)XmFkngf1J~6|p9n z5l%}RvO_WK!$y6zTN0gnXs4o5%cye@?NVGEv}iRzeitgDhUbx715rM}&rq;7&4&z&3fTVctBsMALRZ2GN+BaxMpiU}`e*J0SQ{0nRf5zxQ)2-Rk2g+UGeT&s8WJ ziv1r-bNM~bx0;H0dot@kEHBxZ>!wKpp~F$ptJW^Yk&2}|<;m@5r=tK#TqOQN96 zu2<1TbXNhHbmvoSpMq(=`C4h%wk1)Pk>CeKZ`}_y^0;s$XOKmK1IQdXmEGTJ%bB| z)~u;&KcEyieMjhZ-HbirsBAyvP=TY`)a|W`FbRt%0l3u3dz+O>FE0JGzLlzBKVmpn zp9HTe+K(!}+i$LRcgnr5{bP#YO_yXN%uxThVKJK;8YknACCu&q3B|UHblfG-rdvO$ zXbM3J&2X58+-`Y0&S1?m^rsG#N_PRap&n(ju^6u}Dv&1wjCvpt!}KKu+993Y*x|zX zcSagrNamRQy}}X^6C96!P%zGqVSeL25VF<9@5^xxoht1Fcoj72s3BibRK9`>6>g=* z+`U7A80=~VHDu*5+zq+Y<<1Mh@!bXtctgIXsG#F@EWd8hXg{d~_>BOlUSF#vGWlkd zN$f(k(fgKSu&^*boZ+$PP+b_BJ)E&4;p;js-#JhkSoy+*6W#sq2E_$>CvE8M|L~M9 zh)$b{*8iu$-78ShW`jNOUxte2ycVnd!%p~d3cIG*sYeesa3ufR2f$0;f8K|8HRR`p;${|(bd8+X3(~By z4$v=*0Nu^Ne7xYGlBmPx#vJBlPb{N80z~B%7brzM^x7^ zIY_BJ+#L%*vayhj8E(Y5?w7(2jO+eJK%+l&OK@NhaJ&isgX+!$4dX>pC+a~4OA3gp z%!3UxObT=)4>A1UaG81f07HkK8Jk%TGDPT_u~9qpAnBrWgH;G_9D~J+54!u227{p- zsW=qY!4m54qa85zicq+Y3A1QgjEhR$u@1ok zT8Q}3NBAI+=!xST3i=?(47SsFjL<4Y`2lx)SkSs&a4wDpp5Tyh! zoq*?bCV|m6K@mUMz>6hX2e?vCJ&2B1EHGAu+;joQ31=8^zK$nwnzNC#5Sf)T4LMuI zp$XmMlqa`GBSB8iG6Jl?Oy}inOM9;|UUcoud)KD)cPYsZeoy}P%& zcX#KoA_fyz9*%cd0kSgPdX9Sq2F0nTfA@^C$Jck2zh0?$3u~G$<`T%O*BVj8@j$Z= zGcd#L{jF^18@yqx)Q~b*`2I35y8ZEZ5*Rv#0dja?Q7ZzqCr29?YBgTkpq=-|tX7RyVf~nK^ zCt6a&+&sN>C3ec_dc6rMVlKBh;!Ma&9byCn!puhg$p z)<+L%L!ww_j5gaMIT>v3ks05(eUUkD;tYDa|HZSgX>Tn=P6) zj?3k~Xm-UqNt3xQ8kZ|X8f&_IgV0{t!XUiBKsfb?_AOaHxl1~|mlYG^GrI;4>{_|n zK*@bSo~Lp-V5PzhYj>7{vAov7aVrZ@Q*0`0kiqL54i&+baqJd+03YNKZ~khHfWz5a zh=ee{#AnL)uIMCV1x@-Omv|ePtWCW3UaB^t`2)FpnPI4|5uxHQqEj?qZW!+Ll}j_@ z^u&9?%*?EK+m?Vn!xw_BkZ2D>+m}xQ6U^Sxca+@5ed{7{e`PoovskwI_%B%$>}Mzy z=^FyL-~Th4HyV6!UqPjTw|}i#wriWiNo2h6;3;5NXY^`>LRlHU3yjN|IEU^g7WAy( z8DNKqPp;rC#CyO5E363bj=m3#j0$`kn3!ZwQscbK5Iz6;A!4HT^YG#2o3Fe{<%PuTW$<)7n>H-w2$;{@e6Pay{y&j}MlQwuLouWLh} zsWt-YeTL$}yjznwKJPau?G)(BC^MA~yf4hmf*r0(2i_Sra1)CFjB~f=R;vJy4jV4s z?dize3OE#riCL=+D>RBB&B`YY8S1^9+-|^N8OX_}45oH;R8<|XPaB55|HRNw%ilT- zje9BuFPvN^J|Ez8!bC`n*B1<#Faj}JUovp0>p50`XJGm$Ofh8S9}E=Khhz6;gW3p1 z2bVy6#Sq#!59g5nqrtT!eC(zg{TcbHp>$1Oizo)Q4>*DT$?+6tXYm52cZzVl?{F-9 zS+nKtEjwp`j`^L2ADEXq@?SG#Ag4O$Uk~!6OmGd+QODEFMT~mrPS5hyWda9o6y^B* zGBH$a?(I_@+wVFC98|j1X!Sx*Tv-A_8LxVAOv6 z0v<*K4;C}0MyolSM&b@dik02i@2n4VD9f*nhyg4iVn%*r2t*KJvjo$iYgIz^e`^>O zi`ZI##NP!oW;V6jqmuU;I5L_rD6nMsHZrMo*Wf*1ih^CiHQ=+yaFt!~ zuAk{v>*uVD@o_(>hv*R`=CPjvxhh&fqDp-MU(r-zn^%6M4ltnJ$i75vzyl2e#~~e~ za4fpRel+x;v1os|Wy_M=8e->+eI0gA?wPiHHN)?+IIulMg$>GaA>BClgbom&MI}g1 zz-y3?iinC8ge;^oIRVcc{CPytZw{r&kMn~ot|-36oh+m<&Tp(ZwC>uI_=$1uNFCn4 zw~{289Ov%Tk+fT@)3ux$m&ZnU|A~cU7SrSSD6Y>!FO>}7vC;Kgb9`lI=U&(Oe3%k1 zjrXAy)X}P&QU&7cJaiUoh|SbiZb}tgtaa+Ei+C0S0+64?*DD>kfju#(0nIM*tEfiY zDVA^}9`b{W_Yn+E6{E~;mQy^mi)cYuexNOE!PR}ozX9$EfO3ntxo@CSv5Sa1!nWW- zl!L)E?DV@X(>&tXJiIxJiN-u9a7OHa{RYBxjTXW_;lK#?E27Sz#bYs(9yrHHCY`_q zZke@Fm~#jWw5D#t?I{PvNtG@Gc!=78D(De??;4NBoa$kCjCqbVLLBXB9@fX{8bFAN zJl%ot@-e2L<~Ji}cpyS~e9ukr>$F;(TCv(`StSuQd{zYQ;Bim%(u`mWZiM*2j>~hi z6g?1kudUvT+>$FH`>bpYM09M~L#r)B*=V!zh*~9rB7{9urnt%1g666S2hvxfxA5~b27`BvWC)6`dk|iph(>G)AE`7-+`9w^uD^mhvy~nK z%>evZ2D~t2=_W8ZoxV0|8JTy$bBeIktn=VUYdR=CD+6V~GlarsIt!G4b+J1)UsrKN zL~=WVZqTbd`K@#p7-6f44A=%l9Csoh&NFp({BCHr`MlFR4wNnBBeKZIKSIdQW2Vz%?^mDE8j7=Cb;OKeK z_!&Akv@G}-x~p;8&K}rG&xS$a4s@iO=+-bGgh<LPRBZ63mqH=To3g`sh;3h2o2UN&g&-{5O%#Y z0^tErW>??`f|RpYZJ_4}+awoy7+!q>B)dd!iBa`Ct6ia6=`B%Ue{~0ux=xgG{A7@U zI~C@KwR^9JY$)mMhEw<=2U=6F_W10Sj#!SL7?dsoaR!!_OJjI^i3Ll;WicFwyU`sY zOzRwd6+SO$5UeH$EAKNxn+biHIV)EV(9}D{C!^ZnziI$ion5crUxJ>0{s6L3FR6@T zEBb-~Bz&=0kF?MUIz3Vqn{Oemv8?ZlP15&~Licb-7E;M-P0=v~Y~oi0NG|pZ{KlR#BHk#CE2E_dX;6iakfRul z7Z9k$xwnA}1_AwM%w+l5C119u(X-ilt?qoN^tq%-=Ai0U;~(pv=SP{+1l&Xx;Q@1& z0bDa_3aI8HCk|eddtHpJxRo9<|N0bk0nR3;G9k5Zh_TKTSg;7vEFCz$un48AZH^yv zN~7?>7i$GvJ82yDC&U%xErYnG2Kr3Uvy*14)~(&RAvB1@M-zK<3p5hTPSW2tNOTTv zMmYR5T}0^;5FuVK;ew45`F9LbptGDib`xDj=?oakfJ+VPg4s;hQJP>weZEvIt<~{c zr1vOI(59|#w<%Waqb>9zc^Z6K$k|L;evv8(PLAWv188(QWYn6L=O?RD?A^6Eu(M%# z_W-idUsuHqv3^HIbAtY;6g%z#7QG63PmG1$a_R+d@TI{EQJHv*ZvY7iLU;NKzkdLq ztW$v>$MSWuQsL%|R^I6dC9vMd{`qMFUjKYVj ziW?xmz6U-N6EW->@L0{}(7nV^c$FU(<*-oZ4w(&EilR1!zB zZCEL`oZt@GASrCS>V`gc8O&^&e#LZVeCB%I*&#D@F{TM{aI4F}Cb}8ZNL*WhYYB0* z%zrZ-j%f;fPZ5`a)cdwbuVWg|r+-w5ZK3NijqP_JD!LQMEYSg(#=|>R^aNYw&Ow3_ z%yVok1w(?lN>)9m#zf|L+e3`JU=3rrfB1H zK6tYbqfX+mf1-r1i ztHv1psUbKl=9doT7K1kAp$h${v7K4EQI(NzN9rCw(NDh_!1l0|P++J#v-GGc_pI|x zqzyp1J57N2)T%0=tlSfO#I|fdpC6^(Uu1Fb_S&}Hd-k$h>Ck_Sf*P9~Wb0PC^Df+T z0l%Q81W(Xp&XQSqq9*f}%*iTE7A&dXOa`xxSpjy}lN8HO&LOJ_IZ~7S;2e^Za+D^g zEjh)I6!6Yia+;AStVYJtGmJlB+SO|l!%moX72C{@BQx!4wn%>-)2?b;7*@ixtJ@MC zdq~eMZNJdLPci~m+pYBHEna{zU~N&2ye6$U)S{qCD-D&H(4-ZHI!tQP%0d<3SwmKq zGiorcN$Usf|7SF5{eZi^r)tvr0b71J(O3=Z2fTfHx}{ycHqm)TysOw|y3Lq&HCv>^ zjA>W3EpoP{UEP-GC?nogZY!N+yEkpI?6E7J)uiQ)=T+x4X_@1_^tvW3Z#{=FnyzA->4#$4 z)ohVID5hQ2w$T5?w5!_^T~AEA%59~~>HOUnTK0Ig0!|?$EqA<~zEP8wIllC8t|l#S zJd}Q($kyFE9B+ZXA0!>Gx_yvzyz1>i((z8w&$D}Ruj5q*50Z{oT{}oR-c9uBAnABF z)0?wxahKy=q$3AO$Ge3-93&m@5`8yFI^M1H+U(i8XuNRG?b4+2!hLh0CXE-ta?jAD z@xm>#Ta(t6aL(+}r1d2H(0es$!;Gu<7irRl8E;lRQ!{aj*cSFcTs zTwyg`#Wpiug=tr_MaHNw?W(qgAt_9|x-BsXg=ts0t&BTi+G+0^}~w_S6bTY2j}utmbUuAUHW`WTm9gXe1WB{ zesIRU(9*7co9Ja>`L2GO=~iLd)o+om6r>@rTE8vyo-pm|w?u~t)2@D7=_1*_$B7%f zysyxtVd39=r6#TNc)a3OnzXv(k&9Pr(yETfFyL1}R#tO3`(LX`t2iFl_$y6Xz47|S z>ojTA#&@7!uSqxT_z3hHEN#`E+(aJ$tLZAXnHztmUCkC5$HBC#+7@|>rCr^YxT`1L zRcO<*lh$l}cLCcoR>PV-J;Mzd)7I?iP27Jm?JBmJ`!1$k%@(=O zV%k-03pZ9wySgp$6VOb%%5CMIY0u(r%O1}fVPk@%<&Lj9{G%oYx4^Mc$C!xYc!nk_L$o6h)c4O3Gi&$sV`!E} zD^I9nP>x6ccA9TMD2nU^H2SYn;0(b98n18&#Qb=*9#!IJXcBdTmcI)}@71-*Rzcg} z9k;5w&e{bff6qWB^ZcM9%7jL~7qNT%$msm+d|Y#A=HDesSd+8dprU^to4Gjnedf|` zGjtJO#OlCP0m~lS6GV^br&1qEE@q$rehu2otO>GUZ4gE@izve2hIStJ0arO1 zlwInp=gUGG5Y!2iS=kqG6R?ATtmuUgQXsMuHnhVR^#&u?0sA3<^XLd^4?C9n_AIue zKm_M8o`SuEe|Sj7+{Q}63s%Q^3Vd%8XQue*Qg)JumLkvu>vu7T<|-t@U{J9`ZgN zcsx=#Y~0Q=6heGrc|vv1HgF~S&a+jc=)j#dF*V9B894f+D~Pq+vccD^Q=f%G`P@Rq zz!s?km#RHaqG()0t|~S+w6=2&SLv+5G~t!KPFxXGyB^>XvmJfS#)?Kio)Zx8P_OUr zl`93BvN|BZab_GtMgnwYBf$Inm6khOHXmS{xRBH81P?Ue{&h3J<9N`2jaM^3(^~-= zkAT3NjEF)XNk$^f<90xU6AE(&Sq*U8=*a<=51_`q12;n_KjQEh5@~8&J>r7rJ;4@|h=R+_EJ#?SlpaLz(Q-Q*B zzzbL{5#DLt?z3BTID{r3`Wl}Os^TFwL+VunFyejVdHtGJTz5#~R%OJ?gDA>EVr+~! zna?*|w}aI$=zU1n1%|=%L0CTgH%iEefqz-l)E z#`P834&+WlvTuV9W064aG9(VdS~d8~z3$Z|4{v1{mJh#oyKCx*GS|n$+`0tKg?BTI zgyV;E#sM1Wrv~?!>_)h;5kDE+eAYSuzbC{eUIM1-#D^e4JkGQHml15O!3QBiyz%pC zIIAW#Bt8sbB-+k-JSmJf!wfyG=!?S~_$CmB&IsJn|Ex4Y#Y?1H?y#9<8;6J=3P1&( z6K2rB$M6~(ybfm-K!NRT+)Jb=BWM6RM(d%~01@`QN4QICGNykE|G&RyX?JC5>$aUs zouxgyF511g1j7k+ON%=@Bsb_?UhrCCrS= z6O5w|)s9EwaB_onaG{HD*kD0jwo%#4xWI^ItH2xtVA~ag`(cKFKt2;)Vvq9i-MSU! z0BL!W<-nj}i~{Z|ucVi5)O_!G;cK!P714+fqJo8O%{mI-|yu47J(el<1h_la!^Ql&A-~0_J*94%&q^ zJQC@kd^8;`5>=kjc*8>UD$$;Z-k=EouvHiq*8TaK_Ktsi@82nR+Ma{;@M zkbyUa5}gDp3@f%IAr(wMd?yL2e|SGp(6Lt`hlwDa5;iS|h$QsSIrn;!6ob1Ckj@|<9!NEe6lX?KQFo#caP zU`LoLFBa}3F~kDf#1!#R8Bg*-I_a3w8MCY3%uup#ABbE<{K{Zo(D3Iy>FUll+b%F zNImw%X|DSfd(RHJ$Cf$Ge*c2+`62n(Q>Xct5q-}{*~dhv54I4}V=ra02lA5cT|&rMMe z%6&i&p@$nH(bQ!mK465n!%vZ5Tu#;lP6#^O7zxgyQXa5S#5WD$8IbRg2g1EM#S=?* zNQmKv?<7$nd*Lp$T0#a4`IZ#J&`A*TVBnV$Jh{;#u9glwFF}=Z%ZqrxYu1kZ30 zCo$T*Ek!(B#7T_y!lRSSIc0^rrji;hg@hu3yMJQ(uJQ#=DAu7nuwD^i3b zMO+y$!Ais7H!8=^^4TPSM}Lh?5Z_ z{*n~q3PhZo5b>9$IF}P~vQWfdHiT!Ch$|0<{N*X00TEY14EHNigd;^<88GCpOff7c z;>v@8e^r9Vy<$?r-La9fjuUQt6_{*rpy4bJUfR&Y=h-h~uPD|IZFvpQY9Au6*C&Wa zOdH2do^b|i1=%m8CQVF=PJCmMG&N-$sZN+TB`MSMCC(MS_U1v_^lXW;#$0(zk~}?C zB2rA0wAR$br$lIl<9gjvB*zOM)7a2SYrp_Tme($H>0h7z{Rg*6E((Jt6IgNoN@$ z?{NkSa>^MbJ>xtbM&^A9y3}+tI#d?J^8N&2dbar-F(!XAK$xCtQMMS94p0!Zf=z!8LT2MdX}iw++w_OtP3B1No5z z{r$)k2K1vw@8notZ_=f~0bON6MD$?Nm63Gw9-^n5oeMU4i2 z#Zj-pOZ|+`a#f1no=RqqcKzchh9UW55`5K>qbuT&hM>Zb_kS`H`~3BADoFSpM&){G z_))VVbuVydf;^=Wj1JueA^uu|Fr^0~LP+b^6NKs6A5l^~zcE0Xp7b#}Wb&H{^7LFc zQV0V^>stxR!5JQBi;?7lE>pP(N)31fPU>kmSD=Sww$#OkAF&5uG_EIjzon4ZIDL7JXq>d6}C%X)DaV9$ck z@Ax1-H-Zl%_%8{*l+;{k zw_5+QhcICOnV>aU9YKxZ`mY2vs{&ddm*n*YbH+^kae_7yg%O!^LjHGxqtqJJLg|KHPv?0Pw!Z49It2yp3u~s3?B3Iw3;!&B!!@$ zxA3B7Ka6dn5LV10R0G`#g+&|&tw=|EwW9^x+6GWtaByAO6Kei=FRfc^9@!t8hG z0cC_1ZNv%xZk$G)kN@ZEWUCM$vJHo3OE}iqh_HoiIKd=-5B_b%$;~R<9Nvc1MWEh} zR2Q&|aA>&=_*Dpo+6a7EbKMS#z2Mme{vDvJAlzaj=yoER83!%sOoW=>N)u^X9 z$EvFH_NsQ(TAn=IlKe-h5CF#avFclg~y@;v8cdW(B)^#sT*-W3c>B&jXQVkUAl17 zmJ?3c*xq&V((dY(ZF_g^-neJ?;>Pacw!Pc7Z{Jkjwd2BFJC}Cu-5B4MsBGJ`eb@OX z?_R`>0WM5&{NbRV?W>&>MZA0dr!*?wFW-?yaiMkQ*`331!It=IX?(B;{(2gh*!6xR zjn(Bnva-Ax@y#?@%Bu2o-%8UlyD(Dv+rtRLjq7*P1iJQrH-Oq@GD7iu?{8ACHbZerEz6clxdbJm~NX2M|GLKO=z*I(l~kk?7<-3Doco-kYEq z(YY5Th|(SV%mHlJsTU`(k?rrcNzYPjpi$BU-wOy#w9^#D?oluop#nA3lPb^!)BL~D zfmPLku83@KFtuh4Ct-w$2YhW35sdh{K};~@>yy}E%r_)4i9vr#5;uI*HztWj4EwoB zs`R*@H;4`gej$n0sr1w&Y(SCqLwqji+>ay?ap!(Ci3mFPV}qEWb3dNM2A%tfBqq_h zpG@M0ckb;;q7j|@sU%gpb3Z+Z4mBG7bU6EoqP2l zI_%tQl4$MRYm=~n&b=(eXZbJ)KGWk?kWHaf<4uSV_qQP~pTv!ac@~nm>yo(iiu2+S zogWC3I6g#Y2hf|tO7VGzWRS(@*0|+NKX3qA<8M#HgU)_Ohzt7pogqBY#qSC+!+ZCJkYq&1 z-WbxP`}C$XGVIQqL*zi0y;ZS(TErIjnF)B@X=f$iL9d-XfC#z`&n?H&kJnA3>${}{ zBGGZ>1ZsHCRT4BKx~`faO7~rD02_ARY>176+U7#=;5O!r5FG@qofE<}H|M*qhX`YE znAIU>AWE$fV%@osoteysm;uH3{t(Mt2PhsMPNlS7y=8;bs~SV0F8XwM#s8tFVCI|>;)02j3E_!(lMOM$r%f&-88K_}Ax(PH6w=6W&P;^J0floyh)oOD zWQeTAN9Nat@Zc!@x)9Dv`or0mg$SNAL&M>1jaMeY@v-?!LWFfEc=Yt~r6DTWpV7(d zH6cx^LnETALn7a!5%$F)HaHo7MF@}j%UAB@A+{79e7`CUcJlh_5I!Wn;zc1oI4=HK z2oKJNe;&fwB!B$(ix3f?`u;Krj*obM6(X$v{fXwULsYW=qvOf{329RO9})c~B=Y?q zVSgK9gCp3xLU`2wzH)bm*!XDmo;29?|GgnR?*B*#ej4JntwF%SYlb6T)~_9g^~3SI z;Yi2&`}3SS$JuHI%68NPKL3Y0{U@r^lP~%_3Ew11KiG4m!otUbj!;PS`i;%&V-#pg zKYX_5D1|3qRzTLwM$4G5(Ja6uJEnkN-tKjsG%mKYWD8 ze{+2r|NRGu{Nv+1{`Paz`0G*ae>}$HS2ff49|G`7L_%2oZrGH@zxp +// +//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 ; 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->getCurrentDocType() == L_USER) + _pScintilla->defineDocType(L_USER); + 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->redraw(); + pBgColourPicker->setColour((style._bgColor == COLORREF(-1))?white:style._bgColor); + 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); + + char size[10]; + if (style._fontSize == -1) + size[0] = '\0'; + else + itoa(style._fontSize, size, 10); + + 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->getCurrentDocType() == L_USER) + _pScintilla->defineDocType(L_USER); + + 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) + { + char intStr[5]; + if (i != 0) + { + ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETLBTEXT, i, (LPARAM)intStr); + if ((!intStr) || (!intStr[0])) + style._fontSize = -1; + else + { + char *finStr; + style._fontSize = strtol(intStr, &finStr, 10); + if (*finStr != '\0') + style._fontSize = -1; + } + } + } + else + { + style._fontName = (char *)::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETITEMDATA, i, 0); + } + if (_pScintilla->getCurrentDocType() == L_USER) + _pScintilla->defineDocType(L_USER); + 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(); + else + style._bgColor = pCP->getColour(); + } + + // 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, "Bingo!!!", "", MB_OK); + } + } + if (_pScintilla->getCurrentDocType() == L_USER) + _pScintilla->defineDocType(L_USER); + 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) + { + char commentOpen[max_char]; + char commentClose[max_char]; + char commentLine[max_char]; + char newList[max_char] = ""; + ::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'); + strcpy(_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(char *dest, const char *toConvert, char prefix) const +{ + int index = strlen(dest); + dest[index++] = ' '; + dest[index++] = prefix; + for (int i = 0 ; i < int(strlen(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(char *dest, const char *toRetrieve, char prefix) const +{ + int j = 0; + bool begin2Copy = false; + + for (int i = 0 ; i < int(strlen(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() +{ + char commentOpen[256] = ""; + char commentClose[256] = ""; + char commentLine[256] = ""; + + 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); +} + +char symbolesArray[] = "+-*/.?!:;,%^$&\"'(_)=}]@\\`|[{#~<>"; +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 char * to have the compatibility with the old xml +const char *SymbolsStyleDialog::_delimTag1 = "DELIMINER1"; +const char *SymbolsStyleDialog::_delimTag2 = "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); + char 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->getCurrentDocType() == L_USER) + _pScintilla->defineDocType(L_USER); +} + +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 char *symbols = _pUserLang->_keywordLists[KWL_OPERATOR_INDEX]; + + for (int i = 0 ; i < int(strlen(symbols)) ; i++) + { + if (symbols[i] != ' ') + { + char 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 char *delims = _pUserLang->_keywordLists[KWL_DELIM_INDEX]; + // ICI LE TRAITEMENT POUR REMPLIR LES 4 COMBO BOX + char 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 (strlen(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)""); + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BC2_COMBO, CB_ADDSTRING, 0, (LPARAM)""); + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BO3_COMBO, CB_ADDSTRING, 0, (LPARAM)""); + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BC3_COMBO, CB_ADDSTRING, 0, (LPARAM)""); + + for (int i = 0 ; i < int(sizeof(symbolesArray)-1) ; i++) + { + char 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->getCurrentDocType() == L_USER) + _pScintilla->defineDocType(L_USER); + 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)) + { + char charStr[5] = ""; + 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; + + char *delims = _pUserLang->_keywordLists[KWL_DELIM_INDEX]; + delims[symbIndex] = charStr[0]?charStr[0]:'0'; + + if (_pScintilla->getCurrentDocType() == L_USER) + _pScintilla->defineDocType(L_USER); + 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; + } +} + +char styleName[][32] = {"DEFAULT", "FOLDEROPEN", "FOLDERCLOSE", "KEYWORD1", "KEYWORD2", "KEYWORD3", "KEYWORD4", "COMMENT", "COMMENT LINE", "NUMBER", "OPERATOR", "DELIMINER1", "DELIMINER2", "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)?"Undock":"Dock"); + + long style = ::GetWindowLong(_hSelf, GWL_STYLE); + if (!style) + ::MessageBox(NULL,"echou GetWindowLong", "", 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 = ::SetWindowLong(_hSelf, GWL_STYLE, style); + if (!result) + ::MessageBox(NULL,"echou SetWindowLong", "", 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); + + ::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("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, "Folder && Default")); + _wVector.push_back(DlgInfo(&_keyWordsStyleDlg, "Keywords Lists")); + _wVector.push_back(DlgInfo(&_commentStyleDlg, "Comment && Number")); + _wVector.push_back(DlgInfo(&_symbolsStyleDlg, "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)"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) + { + ::SendDlgItemMessage(_hSelf, IDC_EXT_EDIT, WM_GETTEXT, extsLenMax, (LPARAM)(_pUserLang->_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, "Are you sure?", "Remove the current language", MB_YESNO); + if (result == IDYES) + { + int i = ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETCURSEL, 0, 0); + char 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(::GetMenu(hNpp), MENUINDEX_LANGUAGE), IDM_LANG_USER + i, MF_BYCOMMAND); + ::DrawMenuBar(hNpp); + ::SendMessage(_hParent, WM_REMOVE_USERLANG, 0, (LPARAM)langName); + } + return TRUE; + } + case IDC_RENAME_BUTTON : + { + char 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, "Rename Current Language Name", "Name : ", langName, langNameLenMax-1); + + char *newName = (char *)strDlg.doDialog(); + + if (newName) + { + if (pNppParam->isExistingUserLangName(newName)) + { + ::MessageBox(_hSelf, "This name is used by another language,\rplease give another one.", "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); + strcpy(userLangContainer._name, newName); + + //rename current language name in langMenu + HWND hNpp = ::GetParent(_hSelf); + ::ModifyMenu(::GetSubMenu(::GetMenu(hNpp), 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 : + { + //char 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, "Save Current Language Name As...", "Name : ", "", langNameLenMax-1); + else + strDlg.init(_hInst, _hSelf, "Create New Language...", "Name : ", "", langNameLenMax-1); + + char *tmpName = (char *)strDlg.doDialog(); + //const char *newName = newNameString.c_str(); + + if (tmpName) + { + string newNameString(tmpName); + const char *newName = newNameString.c_str(); + + if (pNppParam->isExistingUserLangName(newName)) + { + ::MessageBox(_hSelf, "This name is used by another language,\rplease give another one.", "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(::GetMenu(hNpp), 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..2a4900e9 --- /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(char *dest, const char *toConvert, char prefix) const; + void retrieve(char *dest, const char *toRetrieve, char 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 char * to have the compatibility with the old xml + static const char *_delimTag1; + static const char *_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 char *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, char *title, char *staticName, char *text2Set, int txtLen = 0) { + Window::init(hInst, parent); + strcpy(_title, title); + strcpy(_static, staticName); + strcpy(_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 : + char _title[64]; + char _textValue[256]; + char _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..806a7a95 --- /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, "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, "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 "3th 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, "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, "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, "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,284,23,40,14,ES_AUTOHSCROLL + LTEXT "Ext :",IDC_EXT_STATIC,247,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,71,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, "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..459bdc54 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/colors.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 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 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.aps b/PowerEditor/src/ScitillaComponent/columnEditor.aps new file mode 100644 index 0000000000000000000000000000000000000000..11f1c8325745ffdfa7ae43f428167ad27ac4bfc0 GIT binary patch literal 40328 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 + 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); + + char str[1024]; + + bool isTextMode = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_COL_TEXT_RADIO, BM_GETCHECK, 0, 0)); + + if (isTextMode) + { + ::SendDlgItemMessage(_hSelf, IDC_COL_TEXT_EDIT, WM_GETTEXT, sizeof(str), (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; + char *line = new char[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 char[lineLen]; + } + (*_ppEditView)->getText(line, lineBegin, lineEnd); + string s2r(line); + + if (lineEndCol < cursorCol) + { + 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)->execute(SCI_SETTARGETSTART, lineBegin); + (*_ppEditView)->execute(SCI_SETTARGETEND, lineEnd); + (*_ppEditView)->execute(SCI_REPLACETARGET, -1, (LPARAM)s2r.c_str()); + } + delete [] line; + } + } + else + { + int initialNumber = ::GetDlgItemInt(_hSelf, IDC_COL_INITNUM_EDIT, NULL, TRUE); + int increaseNumber = ::GetDlgItemInt(_hSelf, IDC_COL_INCREASENUM_EDIT, NULL, TRUE); + unsigned char 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; + char *line = new char[lineAllocatedLen]; + + + unsigned char 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 char[lineLen]; + } + (*_ppEditView)->getText(line, lineBegin, lineEnd); + string s2r(line); + + /* + Calcule string + */ + int2str(str, sizeof(str), initialNumber, base, nb, isZeroLeading); + initialNumber += increaseNumber; + + if (lineEndCol < cursorCol) + { + 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)->execute(SCI_SETTARGETSTART, lineBegin); + (*_ppEditView)->execute(SCI_SETTARGETEND, lineEnd); + (*_ppEditView)->execute(SCI_REPLACETARGET, -1, (LPARAM)s2r.c_str()); + } + 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..4571f88d --- /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); + + unsigned char getFormat() { + bool isLeadingZeros = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_COL_LEADZERO_CHECK, BM_GETCHECK, 0, 0)); + unsigned char 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..551c3dbf --- /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, "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 "Leadng 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,28,10 + CONTROL "Hex",IDC_COL_HEX_RADIO,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,124,148,29,10 + CONTROL "Oct",IDC_COL_OCT_RADIO,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,30,167,27,10 + CONTROL "Bin",IDC_COL_BIN_RADIO,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,124,167,25,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/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/tinystr.cpp b/PowerEditor/src/TinyXml/tinystr.cpp new file mode 100644 index 00000000..7d83a443 --- /dev/null +++ b/PowerEditor/src/TinyXml/tinystr.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 "tinyxml.h" + +#ifndef TIXML_USE_STL + + +#include +#include +#include + +#include "tinystr.h" + +// TiXmlString constructor, based on a C string +TiXmlString::TiXmlString (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; +} + +// TiXmlString copy constructor +TiXmlString::TiXmlString (const TiXmlString& 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; +} + +// TiXmlString = operator. Safe when assign own content +void TiXmlString ::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 TiXmlString ::operator = (const TiXmlString & 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 TiXmlString contains only whitespace (same rules as isspace) +//bool TiXmlString::isblank () const +//{ +// char * lookup; +// for (lookup = cstring; * lookup; lookup++) +// if (! isspace (* lookup)) +// return false; +// return true; +//} + +// append a const char * to an existing TiXmlString +void TiXmlString::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 TiXmlString +void TiXmlString::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 TiXmlString equuivalence +//bool TiXmlString::operator == (const TiXmlString & compare) const +//{ +// return (! strcmp (c_str (), compare . c_str ())); +//} + +//unsigned TiXmlString::length () const +//{ +// if (allocated) +// // return strlen (cstring); +// return current_length; +// return 0; +//} + + +unsigned TiXmlString::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 TiXmlString::operator == (const TiXmlString & compare) const +{ + if ( allocated && compare.allocated ) + { + assert( cstring ); + assert( compare.cstring ); + return ( strcmp( cstring, compare.cstring ) == 0 ); + } + return false; +} + + +bool TiXmlString::operator < (const TiXmlString & compare) const +{ + if ( allocated && compare.allocated ) + { + assert( cstring ); + assert( compare.cstring ); + return ( strcmp( cstring, compare.cstring ) > 0 ); + } + return false; +} + + +bool TiXmlString::operator > (const TiXmlString & compare) const +{ + if ( allocated && compare.allocated ) + { + assert( cstring ); + assert( compare.cstring ); + return ( strcmp( 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..64e6934b --- /dev/null +++ b/PowerEditor/src/TinyXml/tinystr.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 "tinyxml.h" + + +#ifndef TIXML_USE_STL + +#ifndef TIXML_STRING_INCLUDED +#define TIXML_STRING_INCLUDED + +#pragma warning( disable : 4514 ) + +#include + +/* + TiXmlString 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 TiXmlString +{ + public : + // TiXmlString constructor, based on a string + TiXmlString (const char * 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 char * + const char * c_str () const + { + if (allocated) + return cstring; + return ""; + } + + // Return the length of a TiXmlString + unsigned length () const + { + return ( allocated ) ? current_length : 0; + } + + // TiXmlString = operator + void operator = (const char * content); + + // = operator + void operator = (const TiXmlString & copy); + + // += operator. Maps to append + TiXmlString& operator += (const char * suffix) + { + append (suffix); + return *this; + } + + // += operator. Maps to append + TiXmlString& operator += (char 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, "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 TiXmlString::notfound if not found + unsigned find (char lookup) const + { + return find (lookup, 0); + } + + // find a char in a string from an offset. Return TiXmlString::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 TiXmlString if any exists. + */ + void reserve (unsigned size) + { + empty_it (); + if (size) + { + allocated = size; + 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 TiXmlString + void empty_it () + { + if (cstring) + delete [] cstring; + cstring = NULL; + allocated = 0; + current_length = 0; + } + + void append (const char *suffix ); + + // append function for another TiXmlString + void append (const TiXmlString & 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); + } + +} ; + +/* + 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 char * 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..42d08b4a --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyxml.cpp @@ -0,0 +1,1258 @@ +/* +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. + 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 +TiXmlBase::StringToBuffer::StringToBuffer( const TIXML_STRING& str ) +{ + buffer = new char[ str.length()+1 ]; + if ( buffer ) + { + strcpy( 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 char * _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 char * _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 char * val, TiXmlNode* previous ) const +{ + if ( !previous ) + { + return FirstChild( val ); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling( val ); + } +} + +TiXmlNode* TiXmlNode::NextSibling( const char * _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 char * _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 char * 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 char * _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 char * _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 char * _value) +: TiXmlNode( TiXmlNode::ELEMENT ) +{ + firstChild = lastChild = 0; + value = _value; +} + +TiXmlElement::~TiXmlElement() +{ + while( attributeSet.First() ) + { + TiXmlAttribute* node = attributeSet.First(); + attributeSet.Remove( node ); + delete node; + } +} + +const char * TiXmlElement::Attribute( const char * name ) const +{ + TiXmlAttribute* node = attributeSet.Find( name ); + + if ( node ) + return node->Value(); + + return 0; +} + + +const char * TiXmlElement::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 * TiXmlElement::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 TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const +{ + TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + return node->QueryIntValue( ival ); +} + + +int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const +{ + TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + return node->QueryDoubleValue( dval ); +} + + +void TiXmlElement::SetAttribute( const char * name, int val ) +{ + char buf[64]; + sprintf( buf, "%d", val ); + SetAttribute( name, buf ); +} + + +void TiXmlElement::SetAttribute( const char * name, const char * _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() ) + { + 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. + TiXmlNode* 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 TiXmlElement::StreamOut( TIXML_OSTREAM * stream ) const +{ + (*stream) << "<" << value; + + TiXmlAttribute* 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. + TiXmlNode* node; + if ( firstChild ) + { + (*stream) << ">"; + + for ( node = firstChild; node; node=node->NextSibling() ) + { + node->StreamOut( stream ); + } + (*stream) << ""; + } + else + { + (*stream) << " />"; + } +} + +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 char * 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 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. + TIXML_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( TIXML_ERROR_OPENING_FILE, 0, 0 ); + return false; +} + +bool TiXmlDocument::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; +} + + +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 ); + fprintf( cfile, "\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) + fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); + else + fprintf (cfile, "%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) << "=" << "'"; + PutString( value, stream ); + (*stream) << "'"; + } + else + { + PutString( name, stream ); + (*stream) << "=" << "\""; + PutString( value, stream ); + (*stream) << "\""; + } +} + +int TiXmlAttribute::QueryIntValue( int* ival ) const +{ + if ( sscanf( value.c_str(), "%d", ival ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; +} + +int TiXmlAttribute::QueryDoubleValue( double* dval ) const +{ + if ( sscanf( value.c_str(), "%lf", dval ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; +} + +void TiXmlAttribute::SetIntValue( int _value ) +{ + char buf [64]; + sprintf (buf, "%d", _value); + SetValue (buf); +} + +void TiXmlAttribute::SetDoubleValue( double _value ) +{ + char buf [64]; + sprintf (buf, "%lf", _value); + SetValue (buf); +} + +const int TiXmlAttribute::IntValue() const +{ + return atoi (value.c_str ()); +} + +const double TiXmlAttribute::DoubleValue() const +{ + return 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) << ""; +} + +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 ); + fprintf( cfile, "%s", buffer.c_str() ); +} + + +void TiXmlText::StreamOut( TIXML_OSTREAM * stream ) const +{ + PutString( value, stream ); +} + + +TiXmlNode* TiXmlText::Clone() const +{ + TiXmlText* clone = 0; + clone = new TiXmlText( "" ); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + return clone; +} + + +TiXmlDeclaration::TiXmlDeclaration( const char * _version, + const char * _encoding, + const char * _standalone ) +: TiXmlNode( TiXmlNode::DECLARATION ) +{ + version = _version; + encoding = _encoding; + standalone = _standalone; +} + + +void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/ ) const +{ + fprintf (cfile, ""); +} + +void TiXmlDeclaration::StreamOut( TIXML_OSTREAM * stream ) const +{ + (*stream) << ""; +} + +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 char * 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::string & operator<< (std::string& out, const TiXmlNode& base ) +{ + std::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 char * 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 char * 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 char* 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 char* 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..da438d32 --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyxml.h @@ -0,0 +1,1259 @@ +/* +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 + +// Help out windows: +#if defined( _DEBUG ) && !defined( DEBUG ) +#define DEBUG +#endif + +#if defined( DEBUG ) && defined( _MSC_VER ) +#include +#define TIXML_LOG OutputDebugString +#else +#define TIXML_LOG printf +#endif + +#ifdef TIXML_USE_STL + #include + #include + //#include + #define TIXML_STRING std::string + #define TIXML_ISTREAM std::istream + #define TIXML_OSTREAM std::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(); + char* buffer; + }; + + static const char* SkipWhiteSpace( const char* ); + 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 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, 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 char* ReadText( const char* in, // where to start + TIXML_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, TiXmlParsingData* 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 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 char* p, + const char* 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 char* errorString[ TIXML_ERROR_STRING_COUNT ]; + + TiXmlCursor 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 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::istream& operator >> (std::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::ostream& operator<< (std::ostream& out, const TiXmlNode& base); + + /// Appends the XML node or attribute to a std::string. + friend std::string& operator<< (std::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 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 TIXML_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. + 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 char * 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 char * 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::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* 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. + */ + TiXmlNode* IterateChildren( TiXmlNode* previous ) const; + + /// This flavor of IterateChildren searches for children with a particular 'value' + TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous ) const; + + #ifdef TIXML_USE_STL + TiXmlNode* IterateChildren( const std::string& _value, TiXmlNode* 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. + */ + 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 char * ) const; + + #ifdef TIXML_USE_STL + TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::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 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. + */ + 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 char * ) const; + + #ifdef TIXML_USE_STL + TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Convenience function to get through elements. + TiXmlElement* FirstChildElement() const; + + /// Convenience function to get through elements. + TiXmlElement* FirstChildElement( const char * value ) const; + + #ifdef TIXML_USE_STL + TiXmlElement* 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. + */ + 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 char* 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::string constructor. + TiXmlAttribute( 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. + TiXmlAttribute( 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 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 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 TIXML_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. + 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 char after the value end quote + */ + virtual const char* Parse( const char* 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 char * 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 char * in_value); + + #ifdef TIXML_USE_STL + /// std::string constructor. + TiXmlElement( const std::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 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 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 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 TIXML_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 TIXML_USE_STL + void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::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 char past '<' + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* 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, 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 char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data ); +}; + + +/** XML text. Contained in an element. +*/ +class TiXmlText : public TiXmlNode +{ + friend class TiXmlElement; +public: + /// Constructor. + TiXmlText (const char * initValue) : TiXmlNode (TiXmlNode::TEXT) + { + SetValue( initValue ); + } + virtual ~TiXmlText() {} + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlText( const std::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 char of the text + returns: next char past '>' + */ + virtual const char* Parse( const char* 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::string& _version, + const std::string& _encoding, + const std::string& _standalone ) + : TiXmlNode( TiXmlNode::DECLARATION ) + { + version = _version; + encoding = _encoding; + standalone = _standalone; + } +#endif + + /// Construct. + TiXmlDeclaration( const char* _version, + const char* _encoding, + const char* _standalone ); + + virtual ~TiXmlDeclaration() {} + + /// 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 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 char past '<' + // returns: next char past '>' + + virtual const char* Parse( const char* 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 char of the text + returns: next char past '>' + */ + virtual const char* Parse( const char* 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 char * documentName ); + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlDocument( const std::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 char * filename ); + /// Save a file using the given filename. Returns true if successful. + bool SaveFile( const char * filename ) const; + + #ifdef TIXML_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, 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 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 + 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 = ""; + 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, 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 char * 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 char * 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 char* 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 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. + */ + TiXmlHandle ChildElement( int index ) const; + + #ifdef TIXML_USE_STL + TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } + TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } + + TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } + TiXmlHandle ChildElement( const std::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..d0492cba --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyxmlerror.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 "tinyxml.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* TiXmlBase::errorString[ TIXML_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/tinyxmlparser.cpp b/PowerEditor/src/TinyXml/tinyxmlparser.cpp new file mode 100644 index 00000000..86ed57c3 --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyxmlparser.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 "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 ] = +{ + { "&", 5, '&' }, + { "<", 4, '<' }, + { ">", 4, '>' }, + { """, 6, '\"' }, + { "'", 6, '\'' } +}; + + +class TiXmlParsingData +{ + friend class TiXmlDocument; + public: + //TiXmlParsingData( const char* now, const TiXmlParsingData* prevData ); + void Stamp( const char* now ); + + const TiXmlCursor& Cursor() { return cursor; } + //void Update( const char* now ); + + private: + // Only used by the document! + TiXmlParsingData( const char* start, int _tabsize, int row, int col ) + { + assert( start ); + stamp = start; + tabsize = _tabsize; + cursor.row = row; + cursor.col = col; + } + + TiXmlCursor cursor; + const char* stamp; + int tabsize; +}; + + +void TiXmlParsingData::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* TiXmlBase::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 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 char* TiXmlBase::ReadName( const char* p, TIXML_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* TiXmlBase::GetEntity( const char* p, char* value ) +{ + // Presume an entity, and pull it out. + TIXML_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( TIXML_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. + 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 char* TiXmlDocument::Parse( const char* 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 char* 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 char* 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 += strlen( startTag ); + p = ReadText( p, &value, false, endTag, false ); + return p; +} + + +const char* TiXmlAttribute::Parse( const char* 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 char* 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 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 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 char* TiXmlText::Parse( const char* p, TiXmlParsingData* data ) +{ + value = ""; +// TiXmlParsingData 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 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 char* TiXmlDeclaration::Parse( const char* 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, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0 ); + return 0; + } +// TiXmlParsingData 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 ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data ); + version = attrib.Value(); + } + else if ( StringEqual( p, "encoding", true ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data ); + encoding = attrib.Value(); + } + else if ( StringEqual( p, "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 unsigned char *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..7ccc0e2c --- /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..2e13723d --- /dev/null +++ b/PowerEditor/src/Utf8_16.cpp @@ -0,0 +1,505 @@ +// 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; + } +} + +int Utf8_16_Read::isUTF8_16() +{ + 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; + } + } + return(ASCII7only?0:rv); +} + +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 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) + { + if (m_pBuf[0] == k_Boms[uni16BE][0] && m_pBuf[1] == k_Boms[uni16BE][1]) { + m_eEncoding = uni16BE; + m_nSkip = 2; + } else if (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 if (isUTF8_16()) { + m_eEncoding = uniCookie; + 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 char *_name, const char *_type) +{ + m_pFile = ::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 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 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..ab1740f5 --- /dev/null +++ b/PowerEditor/src/Utf8_16.h @@ -0,0 +1,151 @@ +// 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 +//////////////////////////////////////////////////////////////////////////////// + +#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 unsigned char utf8; // 8 bits + typedef unsigned char 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 +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(); + int isUTF8_16(); +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 char *_name, const char *_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..dca2a56d --- /dev/null +++ b/PowerEditor/src/WinControls/AboutDlg/AboutDlg.cpp @@ -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. + +#include "AboutDlg.h" +#include "Parameters.h" + +BOOL CALLBACK AboutDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + 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), "mailto:don.h@free.fr"); + + _pageLink.init(_hInst, _hSelf); + _pageLink.create(::GetDlgItem(_hSelf, IDC_HOME_ADDR), "http://notepad-plus.sourceforge.net/"); + + //_onLineHelp.init(_hInst, _hSelf); + //_onLineHelp.create(::GetDlgItem(_hSelf, IDC_ONLINEHELP_ADDR), "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 IDOK : // Find Next + 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..ca4ef684 --- /dev/null +++ b/PowerEditor/src/WinControls/AboutDlg/AboutDlg.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. + +#ifndef ABOUT_DLG_H +#define ABOUT_DLG_H + +#include "URLCtrl.h" +#include "StaticDialog.h" +#include "ColourPicker.h" +#include "..\\..\\resource.h" + +#define LICENCE_TXT \ +"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(); + //_onLineHelp.destroy(); + }; + +protected : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + +private : + URLCtrl _emailLink; + URLCtrl _pageLink; + //URLCtrl _onLineHelp; +}; + +#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..d9b603c1 --- /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, char * link, COLORREF linkColor) +{ + // turn on notify style + ::SetWindowLong(itemHandle, GWL_STYLE, ::GetWindowLong(itemHandle, GWL_STYLE) | SS_NOTIFY); + + // set the URL text (not the display text) + if (link) + strcpy(_URL, link); + + // set the hyperlink colour + _linkColor = linkColor; + + // set the visited colour + _visitedColor = RGB(128,0,128); + + // subclass the static control + _oldproc = (WNDPROC)::SetWindowLong(itemHandle, GWL_WNDPROC, (LONG)URLCtrlProc); + + // associate the URL structure with the static control + ::SetWindowLong(itemHandle, GWL_USERDATA, (LONG)this); + +} +void URLCtrl::create(HWND itemHandle, int cmd, HWND msgDest) +{ + // turn on notify style + ::SetWindowLong(itemHandle, GWL_STYLE, ::GetWindowLong(itemHandle, GWL_STYLE) | SS_NOTIFY); + + _cmdID = cmd; + _msgDest = msgDest; + + // set the hyperlink colour + _linkColor = RGB(0,0,255); + + // subclass the static control + _oldproc = (WNDPROC)::SetWindowLong(itemHandle, GWL_WNDPROC, (LONG)URLCtrlProc); + + // associate the URL structure with the static control + ::SetWindowLong(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 = ::GetWindowLong(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! + char szWinText[MAX_PATH]; + ::GetWindowText(hwnd, szWinText, sizeof szWinText); + ::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, "open", _URL, NULL, NULL, SW_SHOWNORMAL); + } + else + { + char szWinText[MAX_PATH]; + ::GetWindowText(hwnd, szWinText, sizeof szWinText); + ::ShellExecute(NULL, "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..3ad18afc --- /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, char * 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 : + char _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 *)(::GetWindowLong(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..57b7a20e --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp @@ -0,0 +1,135 @@ +/* +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 "SysMsg.h" + + + +void ColourPicker::init(HINSTANCE hInst, HWND parent) +{ + Window::init(hInst, parent); + + _hSelf = ::CreateWindowEx( + 0, + "Button", + "F", + WS_CHILD | WS_VISIBLE, + 0, 0, 25, 25, + _hParent, + NULL, + _hInst, + (LPVOID)0); + if (!_hSelf) + { + systemMessage("System Err"); + throw int(6969); + } + + + ::SetWindowLong(_hSelf, GWL_USERDATA, reinterpret_cast(this)); + _buttonDefaultProc = reinterpret_cast(::SetWindowLong(_hSelf, GWL_WNDPROC, reinterpret_cast(staticWinProc))); + +} + +void ColourPicker::drawSelf(HDC hDC) +{ + PAINTSTRUCT ps; + RECT rc; + + HDC hdc = hDC?hDC:(::BeginPaint(_hSelf, &ps)); + getClientRect(rc); + HBRUSH hbrush = ::CreateSolidBrush(_currentColour); + FillRect(hdc, &rc, hbrush); + ::DeleteObject(hbrush); + ::EndPaint(_hSelf, &ps); +} + +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; + _pColourPopup->init(_hInst, _hSelf); + _pColourPopup->doDialog(p); + } + return TRUE; + } + + case WM_PAINT : + { + drawSelf((HDC)wParam); + 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..6717a784 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.h @@ -0,0 +1,57 @@ +/* +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){}; + ~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;}; + +private : + COLORREF _currentColour; + WNDPROC _buttonDefaultProc; + ColourPopup *_pColourPopup; + + static LRESULT CALLBACK staticWinProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + return (((ColourPicker *)(::GetWindowLong(hwnd, GWL_USERDATA)))->runProc(Message, wParam, lParam)); + }; + LRESULT runProc(UINT Message, WPARAM wParam, LPARAM lParam); + inline void drawSelf(HDC hDC); +}; + +#endif // COLOUR_PICKER_H diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPopup.aps b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.aps new file mode 100644 index 0000000000000000000000000000000000000000..f9917b619f493808e247c1189b6af61aaf67a8e9 GIT binary patch literal 38912 zcmd6Qd7NBFb?%X68}i~LBw=3?5o|1BYeQ*aA|l)Hd+eC~;?Ien3lTaMzjLxEHT-+**cQj1a-#b~9{Ey{)pPa? zx}$zQ8tgf^eq`;?^6D99?CGsvxwa9l?mx1=vFGr{%AUpj2kYwxk8G?TIJ~F6eqjCR zMsNShWosKguzu+1p|dttnD49cyA8j`j-76tMOI#fO^M_lv^zI?|kfYL-5)vIdc3p-Q*&|KTR*{D)@=&>Q|H0Mu zD-WM_DW9;|>MTTk$z7EzaiT{SY*i4>~&&wkeMnMIEGcdqW8|+%>K&X@) zSk%b4+lx95%%frqY}LCS3{VjUHb-$hK(C29cZeeEfl84l>KM}EE_ z7g?IH*BYYN0xHU56q*mwI}k3(#TuRqJG0S9qm*PhfjqKTk)5N?PEA#j6$P5Dj%8bw zRiDOU%s}?BEO^e&79TVt`xJ-<^{}U4*HKr8*-VVVZ9#p zG+qRW%B1aXBdTlB`G}@muIQi_*7<}W2eGRa(r1!V0f?%gQ{Gq;XxEfb&WA2 zS1Ho#w^Y^!ph7 zQLM#l%9Au4V{9VdQca$&;l2ykIp@O_H0~HAs_Zq6 zYsjkeD5G$h+$m=b{dZ-lS z1`DwYDn)sNh4}WBlDyGEeDO+I-ee)ZbEP6TT8OV(sme_jf}lWfM&9g#TAEPa;(}V7 zn%wMyTAsSx;(}VBhP>4UwM3D;%>}hcO?kTuvP{*S-0FfXR5dTRxgbkb4dfjb#85=A zAb;b6ELF8A?{qv6tjwPX0xaeuCuX%N7Sh&k6T1kgr&*3|5e@T0AH5!=il6 zB6*-BUss^khmIHZ$8G`&%kr%W98*1XF^+<;BHx~%`cV_w!W^lpd}o4!4nfHf&d7Hs zaZF=%O%clXCYWZp(CxQ|(SXTn^8E?YiP^9&|El;xHy*X2ADSQx8}jd2*h$qelK;rU zDvQIW{HKELsL=}1^t*;*j$Tf_wVeD{hU@jCg_O(74>Fv4zgi%-XV6|8E+unntsp;C zE)GYX`W&>l7JFW;C_kEjwH%4yua)G-SsF5zBcN86pG?6V3AKv+RAF{wjTg$D3DAp2 ztj$_Y?n^ZQ8cq4V1b||hyDGv8CPDH!79|Sg zehNX09J~1}D#-m4EJtw?73BenxE08JL?IuQ@1F`zB0LUlM;-Eh4v!g_j1PNM)o~B?^ z3JDkvhn%mQIVmO>^ejj$qIoGLXuaFx8#e& zmSjd@|KPHmtKoXzO4qE&c?v|k98i@<8PJcqP3Al!k5+&~h2c=n*Rbl}2-oBS4MVRB zRkdo?CA1V;qs@lYG|1NQjn<5$zC{)x$+2uet~vZjM-f|j8kU!?Vht>DAao53q^DrJ zyFjH1DGPF;A_K0T6e&qxkz~cCXjz6p!!a~luEY>mb}8V3d0En6J#N+K9Tv!L%?Z7z z*+rvT{uSAy=zJ@VGjLTdQaI{_wb&IUl*jlC`cb1Fvbj*^nv6X>G>sKtT`pE|HX5d2 zLzc5(9Cc=g>@SEP$zG*;q3N7}nzEu0S65a7Xbr0hT{w#ROHhXgSkhy~u32EAu`eaL z)H1jrmnb|Py)2iy=q-+_Tn;Of$6CyOIEZTVv#M?bFUn<#50(b?Zj9xp*X6;LJL=k%;lgOU9E7t3vu8dt|_oy zdA#K`*NPjHR3J}K3Jo@j21^|XAk+?)FxM!I-U0bf8$+i_fdHx~Pf|)d0@vpTm*vR{ z6Nx6#?GFs#5I5nE2cFkeXblXgdlA zqkfbUb-CW6>pCXI8}c;87a-M#-4u`H>58Kr`dPdw&rn>4pxLoV5Y_Gd$ zmcm>Si=-{mTkMa!^RTD9(*ABzf7yO!euuoufWc^h0p93Cb*7~+FRz}$2hh=AeR+++ zb!d03dKhC0C0>x%x_9XR&s`{I$@s93Ah8x3O^ zCT!68A~DNSPHsA09DQCXFK=`{P}urp|(YTj<45yTJ&c_6nE7;9faRotc_Ep~qi_Plp!w$$e_oSep< z%T;RfP9+AzCD;il0eu@+>hi8B%C&E$A@5eE(Hd~lwHng5uSD{D%h!KCRD89KH$*ol!~?72Yuu)t|!wd7IhzT_*@G!68a1q2#dQ9J2;(qu*Ca_ z11E$T)_Q-ZIEqX$<0U2*eIHev@-351RX*;rQJI-c@>p8^y(65l&n+5qIj9+*n51;! z00K+ENup7U>#>^cav@fMj&!ENG(#){Cn=vH7J`#RHbX229qG)9X@(W~>?Gwgtjgym ziEM^5@_9!(17w@MA6f-{_lxA6!?`3eGYe~NE(KL&){Hq5i^RCFhDS?dR z(7!-cZdVX<^%(P2e@L+n<1+Upte_3~NfHARa1$TNPZNF<*_59p#^+R*Prk6_qIgrkrd1x*tDFs36-XSe5jIt*u>9Umx`|LfG zKv8MiZc$57O)L++=65Z_9wwTzgPiwoee&iE3^jL*LmkN$cjEC9TRMPLOtIjE0-@ zGg}@j`!h6!O6f$H1dtnNrnr~hgwIlVN_GbjDraX2>qh}i1z9*1VgXird8MYLc91Jd zkR^OpB`IX#Y*u9{Dm5jqgIq;QS;A*km2wu&W;G)fqp0aG&PBG*6y!pgQG7~*2Uq}} zmnHlo>hh>8oP9(?9-ThIOTQr3kPtARIL3~_FqAyT?YxJ2;Viag)QGx$gjFKly6~(Zbge^0-{8A|zVCA@~9C}s~zbtEtsXh$rDCQzJH3V2u z?o$qH!d5-Ak_)hDwcm1Tv{DTzK-C@aa7IN6AoDKwcvim&An^`*!tcbQ`U1$jb&tC( zDS$;elTBCFQbR9=2L~nya+#h6#q=o&&IGnQnhT(rJ~cxmvpsjAEyto zx&UhG^$G4Lx&TV*(-JhZ7740Vd1gXnl$ih<6wl5QZunxC;yDVdSe%1}N~iPyD(dr7 z99zR?x(c9#zCiI#eL6)>UX*1rX##n%GT2q*yA~i^Ut@q74T0q4wTkpG5VZLV7|yS= zNPc6w07?3Kg+|!*x15S{gCf|UZ$$lceN@Pm1 zMOpzO^HzImVzDT|sCJvhcbmz%0yMXGrVxsT;i_#05%(@7VAIOzNCgPE_gcPCL9sM$ zB$ITZRF#iSP<}EgU}N~>mRWOG8o!LSmq(MRSayCwL30sFV`J(0=?sx1s5a#@mWvwS zs+eNr^9pd8&UYyS`7)8gZrhj7%QsxmHsS;MrVDeosvzG=L%NS&ly9eqB`L{w98~MV zMWhYyn(s~kny@0@n*c3sRla|M%t7_-!=AVO%wUJy&M=2rytjnO6VWWe4Oo$xM(Sgq)Mzjl9H%!2&J zgLP|V5ylLjqGS&pTUOH~oLnlV)$qD9bcw=f8s_y`^yc*CUJClJ@|1)xdc zw-V)Gx1Q!+<3x{YH}hq(C!R#ktu-(j?!lm$#WBm@lOeSjVQT-Ktukm2yO?^^0}Ne} zo%3D}t+`EUV0kzUTGSBl0ejxu$eH>eU;ik{g=@L)2sGxhG)7hKy%kPs<3xYR%Y!BW z3{-gCp_4pV;f&{0K^`&%xwu97ldVD}U_5~L0_Hw>m-Aa)@vSMV$YfKY+ zrKllQi@QiM;zs~VWLd1RWRe^Muoknp!YpMe=W*|3T1RByn*x;%s9WXf(8msEDKOQqbzDG160kz zR)I)@GnG?tI9^z)vEhlbVt61I8&2P^WahFYIoWHRSyppb;f?i2Rt-;__Nty(!_eh} zvD`5)N9;nnAGs8jI2e+h~jl_#9$io1&HOS;=a>@LWAm0 zELSMC&>FOCqYoXxF;^-B+by>Mb&7WnisdSM4wNG%!}>+FC-=Nqu1;tz3g#D1itd@Q zJYH!(LP)uX#_|M9=_VQW(z+|nHOe@dYu%SjEKgJd_JL;Kwr$zvje3$&ep+E7D?=<# zR>sdiWUL6WT&s+q*T`U?;3t-+C^MYHmTLMadsZw@RTA@`>Cf&-v0P_~!kTm2Ku-Fk zSgu#bw~4ceB(V~Ma>a6`G1W_+rHm6*=s-SydA1UiFU$-~=0%>9X6H6B zC%T@)o~yCa9_iri6LBdE2JlZ+Ex`h=E-jEg)xy4fD3k-zSKc8n)kkVS&pb`T7TfxR z{q3H!Ltde&wCiP3X&5_5N=CcJ=rP#!4C72&vYqp>yxvFYbf--QjDh|Y%MCsb1aliM z;OxcrQ;p>fo-}9BWLc>Z^5{x$^bxWen9m_Vgg5yJZ7k~DaJKA=U~ls55IdXh6@BU| z_&0mrxTs-kYG!~A6w6yYZ!#>)V}QhRbHdxwHrbCt1{hnh+~Omovx)WVSZ?!FGBsJb zV|j;X`a|r*g$=)fWPLuCzwvxL>`(H{A(nS0JUm?|%zjoZM0uBwqUD;7W7)jh$8l4M z(|@)8-0*sjk3wrKtSw3XsrZQHy`G0;&Q`z5omk%I>En(SbiK4$tmgtsTVjWN(5H86 zF!u-!wBsjEyFrql>y|s@Lq0QXz(K25IqpQ7e9Uv5ZmR>GzlDv=C8&GanYAuZr=RkX zj6>ro?PctzJ)KeVP?st**=ql^Rq6w;8`vm;C!vBFwF7-XzM`Pn33Wc<1pie9;j0Wc zE;bP+@~wy<)90 zwBRYqGzL9=G^>t&74(l#GV6P; z=`dhod8BgYA?C!2lChkn%xoVLCqrOnJzI&aN~tMw0c46&bXSew{g_FHCk4uFVldMd zEY$!8aU`?u;ADrZlcL6e*Ihc@@R_lcmB{oUEefXgiW1ft6E8Pc^;PA(;%$ZJgno|V zv~6G~s)pIiw&odu)A_k6J;8A@KTo+)2eUl9bCMpwB0gHFDS}<&d?nIV1D``d6-!N- z3H4Q#-dGxznH{`f0?MdZB87Fn+&LN~jy;~9Ra#BDsqq;J(F2fpr?Q#;sU0^aI>ZLH z);W5;`|Co(U6liOfAtNYs6DU~;Xx*jR-uoefuXT!n}JOOBV+qeIl9_Ud?o9kSui&3 z<4BtZ7F}8%pD}w6Wrp@Gy#KBY>uV3mCu(zvaR%e*(NKtGk1@$`$V9uyDBtCgr~mUY z#<)%a!u>Ti+z&?({?ChzNrx7=G_dU1G{>Yb?lsQ$GouAC@?`k1Q;)MXR(A&*tW z?YK128|5-Xu-UAK0T~ao_W?tlmanO?adWw%++IrN)+Rcr98{d{@EII_RqKlTX}y_) zVfT0+;$!}*rSDVVPFn&_aip`i9@wMMdJ*akVQF!n|~h!G`66ihd!nskads$jZF z*5pRz6$%bvs^<0m|UgYCB!y!`_<;8}&m$A47d5NL! zZ43?Mr7j119Ygc-*M_?HF*GMHGqj!72V5;*ZXl-LT9*YaROJ;0x#zbOt;j14b5em zB{D5rF31~GBGbA!V)rH^YHIH0E8-;HjfR;ZCIm0Z3$3e?JbVI|d z@)pDSj#$yq>dyETxjDss=P8xtmK60vmeJuS38LQjw(>$yg1URFVXayewvlTI`}(&T zv>3vpg$R5k4S_QPlzl=a`5S{^{b9H)@3gS1?=nXGyA09sR|v}RsC{=Dr-Oq~NLelh z^0yf@8gQ7Eiv@X4iY{8rqP#c7IxI)ISd#ap7_I08%kq8$@o2boD^`&Y7}jBbEMtg$ z(86#-Voxq(7=G9gD4^^S%b`PpO-#3uIH_RnxwSB@6SVOIjitNxtfG#x`}o zHJI0um*s1QPQK1J9Ozz$1O1PJT z8PgJ$2Y;xTo|A>W*{R7;*8fQH5f({(c$PRE3xhvaJf>rLf>Tkyx8m?77%W1a(??Q4 zzmLK^my{|HRDol;Z^EQngsso+r%b2Iy&5}nWXrSrD~_c&ssrYGwWjD|>H$hXVQq9f zde)a(bSw{4crk=ih(B3xy8MIe0i$+Jca>R(u{;D|n=WkbkvSY4JXJCH!X#K;PV@1& z1EcSW6N3-;5mT@rr)R;A9Vfw2!R-e7W2-pmQ<5Euu>qVX7MlzQ1Rs%!3wL%srv{=T zXDETv!qn=|4AiRfNQ*xS<6N7M%_r2mBX=62hSP1z5XQw0k@_6wYB=HM^WhLNXQNyV zh9aL&7RK(Nhq0B});kVzIA9ngS!WI;)$>wNydS}H9ao2#7hJ9$NYUq#^uu~lN-mQ& zz0393K6WljQdSsa(L1K(>Sd`Ym?9OaD$;BZwPv-k>Q$L>d3JEtwcCb)KwS%R^%*%w z8MHSJ$8lf5R=o9^oa+hS!P8WAIZw%`-5W0P;k8k-Y2FICdP5$iBpOPM8E!i$eZxo| z?X%AI-(0;Z=X-(!N|(Mo>ZmV)^Y|C|e2>HCCG_m3@-_mg`Hb6PAEyoMB^$W#!Y7)* zaqESTA7jB`&47`T2AV!y3bFe(N;0bq3?LH~-6+eP60Afrh+wZ(k(PfJta~&PyMslI zsTACHGjTvT3_rergSDIpqnDMi_}nZ_z} zNoigDPCpm&bGNdE#O;`Q;@n9rf1czzO_s58RZ@4mCQ4I@QnI5-1 zGqH>{hE{^P7F&UEK>lK7(p9~!!$H?#Sypbi)QfO9J~h4Mnz8IviklJ1z+{#b`YV>o zk5_wAENcp@p5~vyiC~|?Q}!YnV=hUapuGdxsFm(gg)_658VzFEuXuLK!?7!NfyXN0 zH~Nu{P8ydfn%U0>q0`0zB^D+#!ft6Smn*|Mj9c?=N_6I-gGxgIdL;LPcs}6ADXcH(ni}0Zspt)`9d2uwHBYY6u$_;AH>QT1$pJ2y8cggCaK2Q) zSw>*@zQ)4c5w@azo+WvrqI^-T|L`=I-;-T#DUsxSt>t5fXON;Xk>gX8gx*gkml)^|4X|U%OHUG9v$bjO?^Oy<_EpvOUaiE$C{dyI8pS6DVGhFVwF=iT zCC?`+44#Xz63gq9qn&M%f-rl%Qj0kIg)K0r4rwyTvK!JYr?!G2&EAmYImJPky)n&n zii8|{ladsJ$&pKaAOzWsN)2#fm}_VyAjNJ{f^`QMJWQsGee4QZlOakS`??z8I3lot zJzM3b#8VDx%PmSw?|SGnAs*jqEIV#vuG`<8Jdeuq+cKorWHn(PGt%2L?Vnv$0Ki33Ti~m)iKu$&KX*>rl@_V#=!17T(4WE?2)6eeYc}BhH4YH?@_{fSUL!h zN{zhlwP(_bOFON9OO>$iGtQM~BCQJA_bWdbb>`ifa&K$@fD%0EGWimwsDIE{jHX!q zWc;>-ncY96Y%iqYZh|)1`eCKn38rYe!^H9t%iE>Q%y~xt-AU3IjG-IqRwiE-?e!@I zxidho2ZCs(Pb+AfbarBg6XRzrYH}c%ZSoI_O?XVOJwB^2_K%@{<2(?u)yeO3X%78} zdIGEp>U9*$=aninaG=7?)EK+}tRNaYYM_KH9GW|pFSy)!060C{fCi7{i%MlGUfc3Z zh9>JtZNPuYfNJ%%QX-QtCz+%sRBOGjD1(WG{^4|wMTP3b&>3Qn9RXj~9rCr4B*x5_ zoj6h5|7Iu-(7WD-+WvPR(>c-UYvS$y!*F*CRI=D$4g9B3$(Yy2YW=Vh{%eX|2>Y$% z!UneF4=lnQ*1NhJV^z!cyxkZ`sEI`c+w_M<(J5ev#tY-Q$lV@hL+wY#YjJT9Y}EGd zU9tSwC@yAUNLSB!Js`~zYXkknBA~kIn2#GAv?ppa{nRKo>Em8Szx1@#@Xw6yp!Z_e z+FaOT`MF0eCmUS9Fi_2{rk~oVy2Efxyx982>VJFMZfH~n*j(mA;p_kwFgK$ea_31> zXRM6uMpGX%lpEjvjHu3GaJ<+9| zus^8mJjoc}C3T>lY}jN6QIUBMV~*Dgv?cFp{O0B|_4Id)&RS+{Wc{uYS<{TQ+9@Z? z0F|4WgK~KL{f*%ig)W4L zZO-=r6HzSt z9GF@~*ts5_&7xyIF52r(cLX2Mg~yLx!iNrtn%M3r$b(E~(4BUqgcd2u58NZN585@% z?2F?C&u}EnuyxGiUfF?i^hn1*M6fz=AUl>bldRGs#eBoF9F9#Vo>@(j;OS>ON(GT4 za1Ij^#SwTHSYF+-9p^1^C2H~%tz5U$hZ2B{&WkcS`10CFoq2c?(z^L|z;7VY~6gtS^f<-L| z#GagHFvMy)wLv=ZT3SZO=0d|nzNUb9;tjQAbo!-Mrj3J^ZrGij)p4VJ=#e7BA@YkC!zJuV zsL05}Uax3YTMl5lcOWi9#x?~Pl{_2=5M0-wk8vJH9iMBM-(5%bo`?Ht zQLCK!c0(g@k49-P@I+1z#yt}zHq3vfuZJ40X-u*q)LB= zp^@4#G6rN+<0#22F*lwOO+*wPw)1?cFyI_qJrjV28FdaPJC&I?C`LZwxelQ_E z!E@$Rn$Zpz0rT5679nhKMVV;bB&m5n(I>adSKWjHk~$hLy=7t3?#>*6Uu(EF#daS9 zDyVzm9r6^5V2wB(!(MQQJk>v%Rk2H^qq!>DA=in-3xjdS$imxp31QbGS-0eQtleG;+VVLL$Ehr!CfKyEp$|USaVQ9mjAOOn z9r(}>ap$j=2psm_vLrg=^L(bf?}|n;7SMVh`X%lLX3`FBd#^=tGJeo6UtkQyH9S=O zL3DP_zcPj^eNCmAad_gsU}k1oye&%*KgSz_?IFn;hPp4W1SZVd(R-BK!hPQgxR)8H z-7M|fy!@9*6!s&Og7lRc+^_$c&8rOGysn_oz}>%AEL*kBVJ9-3cyJZ4D>G^}q42C6 z?*+!;OzcAsCMNW};2K~@q&ruz7UDi&!it5k?&$r{$f(G>fyqqPBqh#`MtEPi?5vOW zzR6e~nVakt@{^w9v$dG%p`EGAs82`G|p;X&{ilGfeg9q^R0n zA2o)y|B0rr%Kvr@m3s;W-#Ix=d?Lf?fJsQS*C&mfPy*3fpEfuv>)BSHF_<72d@F9y{QIDr0-OB2q{ z;s#7_6k&V+vrEF8HM{QIvNHx~n}5OhP2*Bq{)PjC*=R>#%MAzD3a zPS5k!WrCYd6a~C~nG6M+yZcnz_UkSIHY(lhRF!Yy;}eM5pn{p0|MT))gEw`MfHx^K z!D1B6a9L5A@Z{Q-zGRk(QW=+qyhbQl(C}Vh=hS0`Z#py za==lE1jZCVul@7}JhTQbEM`t|w=+9U;ta)9QdZ-rzm(0PE$hM6$!=vr7_wqQf&b}{tl=yvs1G@3VD~oiPD5dfhNPdkr`W84c-E#6!Z$-kxY_H zA6$Q^OAW{2D7)ZZKa;Ii&w1Ix%l#l8l1q@7#|Z{~cwrAt* z;F{0@>0Z=ClrwM}g^?A6#*d;$7U64=L{8H&z_2 ztM*C0w1X>B$NT$MCZm*haCPdU^t$uYrL63b2PM4!#KL42)gAKSB#Is?*~DX^>zC&E z%Fe+fuJU;?C2krYK`N-BRTrfS;_Ey#7ORU*Wgi!%3Wv>pYd*xa5au$eAAPhc%ptNB_aW`vikg#bO3~DRBH1v2*)q zAgWh)F0hD8{n;gMs6x9LIt+T$f|U|? zVvRi5fd_qV4F&zk z1e}RsolvNU9JQOnLH6PV>kmh>@T%pwgQxVe$NAl!ns%YG>~$c#u6)JdnBa;>M=*NY z<7a5x&}YHMFqp?~J8NJcEgOcy9O$Ah)2v}2I+4CVe9SNLSlnIErq1uBIm6-sON3dG zCJlqpsodyYrZvOB#gOhNe0rXr0&*Z$I#vOzG;kQW1o6aPU0UY1fD{{sZT&<8+^!EM z5H0{^c13<5$YMn?YL3{l9P$`$eFBnSqqW3hjr#NMq5EhpQE)Whho`RVN&!C^WN^R1 z{4jSP@yPC)j&2x*k2+|f6%Bdql(tx~%nt|+;E1znYPmMW(?cwn8lIBk*xXId5Mfvc zv{m@LAVDyjz^!~l4{ZkYX6C$HzbQ_uA6|%JBmL7hanbCOet!va{^^^@xK-0Wilyi? zHj%K!Vm{J`mT2^tDpcqH4 zyT}w(3+LFISg3t8j!e-PVyl1QCdF^JdqmDi$T6U(BMJ;=8oDkYf;-iVfxiOW*y6fpTY>u=OCnFqR zrHN?z3Gfha)o{SZb@?}Lj)BT@=GbMLjHWZ7D+3NSs0n5-O-IuacDLHKu(qh}w?gaD zbc7ydb+5;6#X4H070JiJmxY|pl;;vN?i|?uvY}n#C$oGce$&ropXax;rtoax-kq{u8^eKl)F$gIkoRS1 zj7=+YUf!R=I6$2$QW%6ENGa8saJmtilM~W;ewfRb#^_pqgaZb!eqgl$-zn9m@Zb-n z@k|}cmI_8Tp9xOVm|lcErFrDYV&~-}$BWQeLS*w)R`Z+Bf@b$bIl`kqnkG)EajhTj zM*sCS@Ub)!-L8SBVm6SEZ)UTCwm?gse>^S&^qNgx{(cjVBiXw!uyx!9wDL`*(@!1R zry&cp^G(yUBUox!)iwY=wK+zeUsJ_4ok^Dxt%B2;poow!%%M!{;56On@?CAY|b=&D7Gc++yN5ICdP6Nv{GftB@wgA%-{Aii~ zUK$*yW8iy=I1HrLw-s6)r+Hreqe5(zrpIY^)JIp*l|XKd2FPh1)~V1(*e74u9H9pF z9Lo_D4^#CQH}klN8N*<~6%i|_FKv#4$+R)T7g?A|z>mgFmx7I<$>^R@4`)_$mVwY6o*8}EZ~>nCeqZpJ?xq4_jd}kwkkQV0(Lw< zP-Tqv)GVBR%ugNVCW9XOLj?J!zMXlRQ8gj&j?^{&L_Pgt6FbCI!VW{(nWsfnQ_niv z#Iyn^znYE!|I|nYP+sm#En=$&F5yS1w~DMBIndm{arg+Ul?MI$D-gXOh#I5vm*4aKU0>UoI_S6d6)+I!8ruWa;gTa z7Oc=E1!-q2SfwWli;=VN4E;|ScI8^8+X=(2V0-y-WQJYIR%p*-*cEM+ZY2!6vaQju zhw$9mfkO^I(;~Ri?xQ_#;?4js~qBu;hmkjm5Bfz}=_kS=g0pnZ`5nu3&pR>iX#wA^vM>YN5GbKIBS(xByyYtnaW(6Yt_ z>GK-2obdsOScCT3F#fbPXs->MPe+6H+PM0>t3mhLF!J>*?8>!FV-$<&3bvPaD283h zR%nA_*cEM+_9up2+16-!V%QaKA5Bh|Y#g%eacc#PLI_&!xI2B11}$@Z>ER*`THd%Q z{V^i@HZFH*i?sb9=+dg$2SJxstvv|3v=!QUHdcZumC^5I61>nv>L!;K2pTiD76-wI7B2&2Pl`BrH?Vc3;#jRq5jUHSIWL~`J;>u#{} zzEFe4!oK+;4O-!GdBux0Xl2JG7cbGE6&;shz^;I-tmH8E|Fs6K;J94lWg4_{dCvp z?c+jzZ`PpYj4wamqCtCY zeERvV8noBOx1ZmpL3?d{{22>Y7Q3Wi@k(>o0~~!S-_9#jq>c3fEZ- zyP~afVa2d3+ZsOs&9E!nKCYP#uWVTMxYh^@69g@HeAVF}HE5aR%hLa(LCYJTlg26o zkuB?)A{P}1TF&@(^cOT}uRT-diUF*>_DqF~1E^Q_Tzus0Ya(>|=9f5Oq{NMY*iQTb z_Wk*(^C_Ytw_{(MUkJdZtS)kuifXTq`|^fx2uR==s;G3)P9TWyAH!$X&grLUo=Pis zs8cB5*1zrM8wf#>FF~UJYzod1E>d}gK_E?!TkBCIeuieEOpx+-VCy|voO~-t`(LGR z745S3f{?#+QzmVGP!Z3BM7|5Yd;G{~d$ygH9FqCh6HizOEH{Yg-=u0THh!;I+b~5J z{zWVfEEUk~u{?qIh<+;dKKNL&x*{-SEIw_lAP*~2J%>>Y%?0K7ehN36E%-gn;xs5e zVFN+ij3QjkRl||P2c`V5KdSpjKo-+c06#JHWtIe4urzQZnuQl(=7e?u=K;65ICyq# zq?RvpX@FBFRAx;+#!0|F9I}!dJ{SX@ozS5jALmEF;`?7+jYSJ=;*6aHy+|fFGPxB4-5L*lll{ zD1LB{q9c$5zDWcBc#^2>f@6E_EP+}sCWJ2+Q^0+;G?`zPMg5nJ#p}BZZ<7bIbKrqk z2(aoh5qu7efE=(iU<9qHaat@^7m9_If@2E-Sf3VW=~=dOjm3AO+}nDdwTHaV1CL7z zkJoPJ8wD4iv_GM^7Z}_~zVmFw2p!yCNMqyqHG`8+x+1bZw{G~tF11-G%Ig*y2Aii2 zOsaN0iPAWR94Q+dx3qJPYxEZ|On79kpB4ngZe@7*Y$so{u}7mGcV;4RQ*Y$Ym1_*V z%6ujQwlh;7GDbjE#u?t9ue99xX6+2y!GWA^KXX9?&R=&jJhlh@*LXDpym~i7;}Q^9 zli^Y5J;@jet@;p=duTxI8Mk# zjm>q91KL9uldV36QEa*`7PI^U{7c>Em9?yBid|VAGBu*Ba9Uop#S&vQagpp`fLlo- zd<)0dg)Y;;jd8~pBse^bEg?Q+rfF0H<8~%56Yv=`!+8-5To2u6Hz+`haxo}e2Rz1X z3HMH`cAwpf4;Z(|G*l zxG4_gQ_M9cs}W{w_)lg|K5H4kAI|a=wHO_=aducnBDe3u5F;ZU4sA9Q)C<5t@fkiuA%k! zK&dN_WdePvj*+rN<~%?>q_K$76;+S&L$lZAqU*X2buUy-RR`(xS-`I0_V`b0c{)6@PgGV;j4;dHq;>1#{9m~< B|B?Uz literal 0 HcmV?d00001 diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPopup.cpp b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.cpp new file mode 100644 index 00000000..3da5e9d0 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.cpp @@ -0,0 +1,238 @@ +/* +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 "SysMsg.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("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; + ::SetWindowLong(hwnd, GWL_USERDATA, (long)lParam); + pColourPopup->run_dlgProc(message, wParam, lParam); + return TRUE; + } + + default : + { + ColourPopup *pColourPopup = reinterpret_cast(::GetWindowLong(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.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..c40b7580 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.h @@ -0,0 +1,66 @@ +/* +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(){}; + + 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..a21061f9 --- /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, "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/FontPreviewCombo.cpp b/PowerEditor/src/WinControls/ColourPicker/FontPreviewCombo.cpp new file mode 100644 index 00000000..0ce3f584 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/FontPreviewCombo.cpp @@ -0,0 +1,183 @@ +/* +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. +*/ + +void FontPreviewCombo::DrawItem(LPDRAWITEMSTRUCT lpDIS) +{ + ASSERT(lpDIS->CtlType == ODT_COMBOBOX); + + CRect rc = lpDIS->rcItem; + + CDC dc; + dc.Attach(lpDIS->hDC); + + if (lpDIS->itemState & ODS_FOCUS) + dc.DrawFocusRect(&rc); + + if (lpDIS->itemID == -1) + return; + + int nIndexDC = dc.SaveDC(); + + CBrush br; + + COLORREF clrSample = m_clrSample; + + if (lpDIS->itemState & ODS_SELECTED) + { + br.CreateSolidBrush(::GetSysColor(COLOR_HIGHLIGHT)); + dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); + clrSample = ::GetSysColor(COLOR_HIGHLIGHTTEXT); + } + else + { + br.CreateSolidBrush(dc.GetBkColor()); + } + + dc.SetBkMode(TRANSPARENT); + dc.FillRect(&rc, &br); + + // which one are we working on? + CString csCurFontName; + GetLBText(lpDIS->itemID, csCurFontName); + + // draw the cute glyph + DWORD dwData = GetItemData(lpDIS->itemID); + + if (dwData & OPENTYPE_FONTTYPE) + { + m_OpenType.Draw(&dc, 0, CPoint(rc.left+5, rc.top+1),ILD_TRANSPARENT); + } + else if (dwData & TRUETYPE_FONTTYPE) + { + m_TrueType.Draw(&dc, 0, CPoint(rc.left+5, rc.top+1),ILD_TRANSPARENT); + } + + rc.left += GLYPH_WIDTH; + + int iOffsetX = SPACING; + + // i feel bad creating this font on each draw. but i can't think of a + // better way (other than creating ALL fonts at once and saving them - yuck) + CFont cf; + if (m_style != NAME_GUI_FONT) + { + if (!cf.CreateFont(m_iFontHeight,0,0,0,FW_NORMAL,FALSE, FALSE, + FALSE,DEFAULT_CHARSET ,OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY, + DEFAULT_PITCH, csCurFontName)) + { + ASSERT(0); + return; + } + } + + // draw the text + CSize sz; + int iPosY = 0; + HFONT hf = NULL; + switch (m_style) + { + case NAME_GUI_FONT: + { + // font name in GUI font + sz = dc.GetTextExtent(csCurFontName); + iPosY = (rc.Height() - sz.cy) / 2; + dc.TextOut(rc.left + iOffsetX, rc.top + iPosY, csCurFontName); + } + break; + + case NAME_ONLY: + { + // font name in current font + hf = (HFONT)dc.SelectObject(cf); + sz = dc.GetTextExtent(csCurFontName); + iPosY = (rc.Height() - sz.cy) / 2; + dc.TextOut(rc.left+iOffsetX, rc.top + iPosY,csCurFontName); + dc.SelectObject(hf); + } + break; + + case NAME_THEN_SAMPLE: + { + // font name in GUI font + sz = dc.GetTextExtent(csCurFontName); + iPosY = (rc.Height() - sz.cy) / 2; + dc.TextOut(rc.left + iOffsetX, rc.top + iPosY, csCurFontName); + + // condense, for edit + int iSep = m_iMaxNameWidth; + if ((lpDIS->itemState & ODS_COMBOBOXEDIT) == ODS_COMBOBOXEDIT) + { + iSep = sz.cx; + } + + // sample in current font + hf = (HFONT)dc.SelectObject(cf); + sz = dc.GetTextExtent(m_csSample); + iPosY = (rc.Height() - sz.cy) / 2; + COLORREF clr = dc.SetTextColor(clrSample); + dc.TextOut(rc.left + iOffsetX + iSep + iOffsetX, rc.top + iPosY, + m_csSample); + dc.SetTextColor(clr); + dc.SelectObject(hf); + } + break; + + case SAMPLE_THEN_NAME: + { + // sample in current font + hf = (HFONT)dc.SelectObject(cf); + sz = dc.GetTextExtent(m_csSample); + iPosY = (rc.Height() - sz.cy) / 2; + COLORREF clr = dc.SetTextColor(clrSample); + dc.TextOut(rc.left+iOffsetX, rc.top + iPosY, m_csSample); + dc.SetTextColor(clr); + dc.SelectObject(hf); + + // condense, for edit + int iSep = m_iMaxSampleWidth; + if ((lpDIS->itemState & ODS_COMBOBOXEDIT) == ODS_COMBOBOXEDIT) + { + iSep = sz.cx; + } + + // font name in GUI font + sz = dc.GetTextExtent(csCurFontName); + iPosY = (rc.Height() - sz.cy) / 2; + dc.TextOut(rc.left + iOffsetX + iSep + iOffsetX, rc.top + iPosY, + csCurFontName); + } + break; + + case SAMPLE_ONLY: + { + // sample in current font + hf = (HFONT)dc.SelectObject(cf); + sz = dc.GetTextExtent(m_csSample); + iPosY = (rc.Height() - sz.cy) / 2; + dc.TextOut(rc.left+iOffsetX, rc.top + iPosY, m_csSample); + dc.SelectObject(hf); + } + break; + } + + dc.RestoreDC(nIndexDC); + + dc.Detach(); +} \ No newline at end of file diff --git a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.aps b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.aps new file mode 100644 index 0000000000000000000000000000000000000000..14e898ba8a429a71430a25b119d83ef9ba09ae2a GIT binary patch literal 42568 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 + +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" +#include "SysMsg.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! + char text[MAX_PATH]; + ::GetWindowText(hwnd, text, sizeof(text)); + ::DrawText(hdc, text, -1, &rect, DT_LEFT); + + ::SelectObject(hdc, hOld); + + ::EndPaint(hwnd, &ps); + + return TRUE; + } + } + return ::CallWindowProc(_oldProc, hwnd, Message, wParam, lParam); +} + + +BOOL CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_INITDIALOG : + { + _lsArray = (NppParameters::getInstance())->getLStylerArray(); + _globalStyles = (NppParameters::getInstance())->getGlobalStylers(); + + + ::SendDlgItemMessage(_hSelf, IDC_LANGUAGES_LIST, LB_ADDSTRING, 0, (LPARAM)"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)); + } + + _hStyleList = ::GetDlgItem(_hSelf, IDC_STYLES_LIST); + _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); + + _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_STYLEDEFAULT_WARNING_STATIC); + + colourHooker.setColour(RGB(0xFF, 0x00, 0x00)); + colourHooker.hookOn(_hStyleInfoStaticText); + + for(int i = 0 ; i < sizeof(fontSizeStrs)/3 ; 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(); + + const int index2Begin = 0; + ::SendDlgItemMessage(_hSelf, IDC_LANGUAGES_LIST, LB_SETCURSEL, 0, index2Begin); + setStyleListFromLexer(index2Begin); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), _isDirty); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), !_isSync); + + NppParameters *pNppParam = NppParameters::getInstance(); + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + { + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + redraw(); + } + + goToCenter(); + return TRUE; + } + + case WM_DESTROY: + { + _pFgColour->destroy(); + _pBgColour->destroy(); + delete _pFgColour; + delete _pBgColour; + return TRUE; + } + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + int editID = LOWORD(wParam); + if (editID == IDC_USER_KEYWORDS_EDIT) + { + updateUserKeywords(); + notifyDataModified(); + } + else if (editID == IDC_USER_EXT_EDIT) + { + updateExtension(); + notifyDataModified(); + } + } + else + { + switch (wParam) + { + case IDC_BOLD_CHECK : + updateFontStyleStatus(BOLD_STATUS); + notifyDataModified(); + break; + + case IDC_ITALIC_CHECK : + updateFontStyleStatus(ITALIC_STATUS); + notifyDataModified(); + break; + + case IDC_UNDERLINE_CHECK : + updateFontStyleStatus(UNDERLINE_STATUS); + notifyDataModified(); + break; + + case IDCANCEL : + if (_isDirty) + { + _lsArray = (NppParameters::getInstance())->getLStylerArray(); + _globalStyles = (NppParameters::getInstance())->getGlobalStylers(); + _isDirty = false; + setVisualFromStyleList(); + } + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), !_isSync); + display(false); + return TRUE; + + case IDOK : //_isDirty == true; + { + 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); + return TRUE; + } + + case IDC_SAVECLOSE_BUTTON : + { + if (_isDirty) + { + LexerStylerArray & lsa = (NppParameters::getInstance())->getLStylerArray(); + StyleArray & globalStyles = (NppParameters::getInstance())->getGlobalStylers(); + + lsa = _lsArray; + globalStyles = _globalStyles; + + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), FALSE); + _isDirty = 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; + } + + default: + switch (HIWORD(wParam)) + { + case CBN_SELCHANGE : // == case LBN_SELCHANGE : + { + switch (LOWORD(wParam)) + { + case IDC_FONT_COMBO : + updateFontName(); + notifyDataModified(); + break; + case IDC_FONTSIZE_COMBO : + updateFontSize(); + notifyDataModified(); + break; + case IDC_LANGUAGES_LIST : + { + int i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), LB_GETCURSEL, 0, 0); + if (i != LB_ERR) + setStyleListFromLexer(i); + break; + } + case IDC_STYLES_LIST : + setVisualFromStyleList(); + break; + } + return TRUE; + } + + case CPN_COLOURPICKED: + { + if ((HWND)lParam == _pFgColour->getHSelf()) + { + updateColour(C_FOREGROUND); + notifyDataModified(); + return TRUE; + } + else if ((HWND)lParam == _pBgColour->getHSelf()) + { + updateColour(C_BACKGROUND); + notifyDataModified(); + return TRUE; + } + else + return FALSE; + } + + default : + { + return FALSE; + } + } + return TRUE; + } + } + + } + default : + return FALSE; + } + return FALSE; +} + +void WordStyleDlg::updateColour(bool which) +{ + Style & style = getCurrentStyler(); + if (which == C_FOREGROUND) + { + style._fgColor = _pFgColour->getColour(); + } + else //(which == C_BACKGROUND) + { + style._bgColor = _pBgColour->getColour(); + } +} + +void WordStyleDlg::updateFontSize() +{ + Style & style = getCurrentStyler(); + int iFontSizeSel = ::SendMessage(_hFontSizeCombo, CB_GETCURSEL, 0, 0); + + char intStr[5]; + if (iFontSizeSel != 0) + { + ::SendMessage(_hFontSizeCombo, CB_GETLBTEXT, iFontSizeSel, (LPARAM)intStr); + if ((!intStr) || (!intStr[0])) + style._fontSize = -1; + else + { + char *finStr; + style._fontSize = strtol(intStr, &finStr, 10); + if (*finStr != '\0') + style._fontSize = -1; + } + } + else + style._fontSize = 0; +} + +void WordStyleDlg::updateExtension() +{ + const int NB_MAX = 256; + char 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; + //char kw[NB_MAX]; + int len = ::SendDlgItemMessage(_hSelf, IDC_USER_KEYWORDS_EDIT, WM_GETTEXTLENGTH, 0, 0); + len +=1; + char *kw = new char[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); + char *fnStr = (char *)::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::setStyleListFromLexer(int index) +{ + _currentLexerIndex = index; + + // Fill out Styles listbox + // Before filling out, we clean it + ::SendMessage(_hStyleList, LB_RESETCONTENT, 0, 0); + + if (index) + { + const char *langName = _lsArray.getLexerNameFromIndex(index - 1); + const char *ext = NppParameters::getInstance()->getLangExtFromName(langName); + const char *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)); + //::SetWindowText(::GetDlgItem(_hSelf, IDC_USER_EXT_EDIT), 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); + ::SendMessage(_hStyleList, LB_ADDSTRING, 0, (LPARAM)style._styleDesc); + } + ::SendMessage(_hStyleList, LB_SETCURSEL, 0, 0); + setVisualFromStyleList(); +} + +void WordStyleDlg::setVisualFromStyleList() +{ + + Style & style = getCurrentStyler(); + + //--Warning text + bool showWarning = ((_currentLexerIndex == 0) && (style._styleID == STYLE_DEFAULT));//?SW_SHOW:SW_HIDE; + + COLORREF c = RGB(0xFF, 0x00, 0x00); + char str[256]; + strcpy(str, _originalWarning); + if (!showWarning) + { + if (!_originalWarning[0]) + // Get the original text for the usage afterward + ::GetWindowText(_hStyleInfoStaticText, _originalWarning, sizeof(_originalWarning)); + + str[0] = '\0'; + c = RGB(0x00, 0x00, 0xFF); + 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; + char styleName[64]; + ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_GETTEXT, i, (LPARAM)styleName); + + strcat(strcat(str, " : "), styleName); + } + else + { + if (!str[0]) + { + ::GetWindowText(_hStyleInfoStaticText, _originalWarning, sizeof(_originalWarning)); + strcpy(str, _originalWarning); + } + } + // PAD for fix a display glitch + strcat(str, " "); + colourHooker.setColour(c); + ::SetWindowText(_hStyleInfoStaticText, str); + + //-- 2 couleurs : fg et bg + bool isEnable = false; + if (HIBYTE(HIWORD(style._fgColor)) != 0xFF) + { + _pFgColour->setColour(style._fgColor); + isEnable = true; + } + enableFg(isEnable); + + isEnable = false; + if (HIBYTE(HIWORD(style._bgColor)) != 0xFF) + { + _pBgColour->setColour(style._bgColor); + 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; + char intStr[5] = ""; + int iFontSize = 0; + if (style._fontSize != -1) + { + sprintf(intStr, "%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) + { + string str = lexerStyler.getLexerName(); + str += " is not defined in NppParameters::getLangIDFromStr()"; + printStr(str.c_str()); + } + const char *kws = pNppParams->getWordList(lType, style._keywordClass); + if (!kws) + kws = ""; + ::SendDlgItemMessage(_hSelf, IDC_DEF_KEYWORDS_EDIT, WM_SETTEXT, 0, (LPARAM)(kws)); + + const char *ckwStr = (style._keywords)?style._keywords->c_str():""; + ::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); + } +} + diff --git a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp.dockable b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp.dockable new file mode 100644 index 00000000..ca8b66db --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp.dockable @@ -0,0 +1,608 @@ +/* +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" +#include "SysMsg.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); + ::SetBkColor(hdc, ::GetSysColor(COLOR_3DFACE)); + // Create a font + if(_hFont == 0) + { + // Get the default GUI font + LOGFONT lf; + HFONT hf = (HFONT)::GetStockObject(DEFAULT_GUI_FONT); + + // Add UNDERLINE attribute + //lf.lfUnderline = TRUE; + + ::GetObject(hf, sizeof lf, &lf); + + // Create a new font + _hFont = ::CreateFontIndirect(&lf); + } + + HANDLE hOld = SelectObject(hdc, _hFont); + + // Draw the text! + char text[MAX_PATH]; + ::GetWindowText(hwnd, text, sizeof(text)); + ::DrawText(hdc, text, -1, &rect, DT_LEFT); + + ::SelectObject(hdc, hOld); + + ::EndPaint(hwnd, &ps); + + return 0; + } + } + return ::CallWindowProc(_oldProc, hwnd, Message, wParam, lParam); +} + + +BOOL CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_INITDIALOG : + { + _lsArray = (NppParameters::getInstance())->getLStylerArray(); + _globalStyles = (NppParameters::getInstance())->getGlobalStylers(); + + + ::SendDlgItemMessage(_hSelf, IDC_LANGUAGES_LIST, LB_ADDSTRING, 0, (LPARAM)"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)); + } + + _hStyleList = ::GetDlgItem(_hSelf, IDC_STYLES_LIST); + _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); + + _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_STYLEDEFAULT_WARNING_STATIC); + + colourHooker.setColour(RGB(0xFF, 0x00, 0x00)); + colourHooker.hookOn(_hStyleInfoStaticText); + + for(int i = 0 ; i < sizeof(fontSizeStrs)/3 ; 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(); + + const int index2Begin = 0; + ::SendDlgItemMessage(_hSelf, IDC_LANGUAGES_LIST, LB_SETCURSEL, 0, index2Begin); + setStyleListFromLexer(index2Begin); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), _isDirty); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), !_isSync); + + goToCenter(); + return TRUE; + } + + case WM_DESTROY: + { + _pFgColour->destroy(); + _pBgColour->destroy(); + delete _pFgColour; + delete _pBgColour; + return TRUE; + } + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + int editID = LOWORD(wParam); + if (editID == IDC_USER_KEYWORDS_EDIT) + { + updateUserKeywords(); + notifyDataModified(); + } + else if (editID == IDC_USER_EXT_EDIT) + { + updateExtension(); + notifyDataModified(); + } + } + else + { + switch (wParam) + { + case IDC_BOLD_CHECK : + updateFontStyleStatus(BOLD_STATUS); + notifyDataModified(); + break; + + case IDC_ITALIC_CHECK : + updateFontStyleStatus(ITALIC_STATUS); + notifyDataModified(); + break; + + case IDC_UNDERLINE_CHECK : + updateFontStyleStatus(UNDERLINE_STATUS); + notifyDataModified(); + break; + + case IDCANCEL : + if (_isDirty) + { + _lsArray = (NppParameters::getInstance())->getLStylerArray(); + _globalStyles = (NppParameters::getInstance())->getGlobalStylers(); + _isDirty = false; + setVisualFromStyleList(); + } + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), !_isSync); + display(false); + return TRUE; + + case IDOK : //_isDirty == true; + { + 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); + return TRUE; + } + + case IDC_SAVECLOSE_BUTTON : + { + if (_isDirty) + { + LexerStylerArray & lsa = (NppParameters::getInstance())->getLStylerArray(); + StyleArray & globalStyles = (NppParameters::getInstance())->getGlobalStylers(); + + lsa = _lsArray; + globalStyles = _globalStyles; + + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), FALSE); + _isDirty = 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; + } + + default: + switch (HIWORD(wParam)) + { + case CBN_SELCHANGE : // == case LBN_SELCHANGE : + { + switch (LOWORD(wParam)) + { + case IDC_FONT_COMBO : + updateFontName(); + notifyDataModified(); + break; + case IDC_FONTSIZE_COMBO : + updateFontSize(); + notifyDataModified(); + break; + case IDC_LANGUAGES_LIST : + { + int i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), LB_GETCURSEL, 0, 0); + if (i != LB_ERR) + setStyleListFromLexer(i); + break; + } + case IDC_STYLES_LIST : + setVisualFromStyleList(); + break; + } + return TRUE; + } + + case CPN_COLOURPICKED: + { + if ((HWND)lParam == _pFgColour->getHSelf()) + { + updateColour(C_FOREGROUND); + notifyDataModified(); + return TRUE; + } + else if ((HWND)lParam == _pBgColour->getHSelf()) + { + updateColour(C_BACKGROUND); + notifyDataModified(); + return TRUE; + } + else + return FALSE; + } + + default : + { + return FALSE; + } + } + return TRUE; + } + } + + } + default : + return FALSE; + } + return FALSE; +} + +void WordStyleDlg::updateColour(bool which) +{ + Style & style = getCurrentStyler(); + if (which == C_FOREGROUND) + { + style._fgColor = _pFgColour->getColour(); + } + else //(which == C_BACKGROUND) + { + style._bgColor = _pBgColour->getColour(); + } +} + +void WordStyleDlg::updateFontSize() +{ + Style & style = getCurrentStyler(); + int iFontSizeSel = ::SendMessage(_hFontSizeCombo, CB_GETCURSEL, 0, 0); + + char intStr[5]; + if (iFontSizeSel != 0) + { + ::SendMessage(_hFontSizeCombo, CB_GETLBTEXT, iFontSizeSel, (LPARAM)intStr); + if ((!intStr) || (!intStr[0])) + style._fontSize = -1; + else + { + char *finStr; + style._fontSize = strtol(intStr, &finStr, 10); + if (*finStr != '\0') + style._fontSize = -1; + } + } + else + style._fontSize = 0; +} + +void WordStyleDlg::updateExtension() +{ + const int NB_MAX = 256; + char 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; + //char kw[NB_MAX]; + int len = ::SendDlgItemMessage(_hSelf, IDC_USER_KEYWORDS_EDIT, WM_GETTEXTLENGTH, 0, 0); + + char *kw = new char[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); + char *fnStr = (char *)::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::setStyleListFromLexer(int index) +{ + _currentLexerIndex = index; + + // Fill out Styles listbox + // Before filling out, we clean it + ::SendMessage(_hStyleList, LB_RESETCONTENT, 0, 0); + + if (index) + { + const char *langName = _lsArray.getLexerNameFromIndex(index - 1); + const char *ext = NppParameters::getInstance()->getLangExtFromName(langName); + const char *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)); + //::SetWindowText(::GetDlgItem(_hSelf, IDC_USER_EXT_EDIT), 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); + ::SendMessage(_hStyleList, LB_ADDSTRING, 0, (LPARAM)style._styleDesc); + } + ::SendMessage(_hStyleList, LB_SETCURSEL, 0, 0); + setVisualFromStyleList(); +} + +void WordStyleDlg::setVisualFromStyleList() +{ + + Style & style = getCurrentStyler(); + + //--Warning text + bool showWarning = ((_currentLexerIndex == 0) && (style._styleID == STYLE_DEFAULT));//?SW_SHOW:SW_HIDE; + + COLORREF c = RGB(0xFF, 0x00, 0x00); + char str[256]; + strcpy(str, _originalWarning); + if (!showWarning) + { + if (!_originalWarning[0]) + // Get the original text for the usage afterward + ::GetWindowText(_hStyleInfoStaticText, _originalWarning, sizeof(_originalWarning)); + + str[0] = '\0'; + c = RGB(0x00, 0x00, 0xFF); + 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; + char styleName[64]; + ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_GETTEXT, i, (LPARAM)styleName); + + strcat(strcat(str, " : "), styleName); + } + else + { + if (!str[0]) + { + ::GetWindowText(_hStyleInfoStaticText, _originalWarning, sizeof(_originalWarning)); + strcpy(str, _originalWarning); + } + } + colourHooker.setColour(c); + ::SetWindowText(_hStyleInfoStaticText, str); + //::InvalidateRect(hColourTextStatic, NULL, TRUE); + //::UpdateWindow(hColourTextStatic); + + //::ShowWindow(_hStyleInfoStaticText, showWarning); + + //-- 2 couleurs : fg et bg + bool isEnable = false; + if (HIBYTE(HIWORD(style._fgColor)) != 0xFF) + { + _pFgColour->setColour(style._fgColor); + isEnable = true; + } + enableFg(isEnable); + + isEnable = false; + if (HIBYTE(HIWORD(style._bgColor)) != 0xFF) + { + _pBgColour->setColour(style._bgColor); + 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; + char intStr[5] = ""; + int iFontSize = 0; + if (style._fontSize != -1) + { + sprintf(intStr, "%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) + { + string str = lexerStyler.getLexerName(); + str += " is not defined in NppParameters::getLangIDFromStr()"; + printStr(str.c_str()); + } + const char *kws = pNppParams->getWordList(lType, style._keywordClass); + if (!kws) + kws = ""; + ::SendDlgItemMessage(_hSelf, IDC_DEF_KEYWORDS_EDIT, WM_SETTEXT, 0, (LPARAM)(kws)); + + const char *ckwStr = (style._keywords)?style._keywords->c_str():""; + ::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(tTbData * data, bool isRTL) +{ + DockingDlgInterface::create(data, 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); + } +} + diff --git a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h new file mode 100644 index 00000000..1214e5ce --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h @@ -0,0 +1,176 @@ +/* +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 +#define WM_DATA_MODIFIED (WORDSTYLE_USER + 2) //WordStyleDlg's msg 2 send 2 its parent(GlobalStyleDlg) + +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) { + ::SetWindowLong(staticHandle, GWL_USERDATA, (LONG)this); + _oldProc = (WNDPROC)::SetWindowLong(staticHandle, GWL_WNDPROC, (LONG)staticProc); + }; +private : + COLORREF _colour; + WNDPROC _oldProc; + //HFONT _hFont; + + static BOOL CALLBACK staticProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ + ColourStaticTextHooker *pColourStaticTextHooker = reinterpret_cast(::GetWindowLong(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), _isSync(true){_originalWarning[0] = '\0';}; + + 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); + display(); + }; + + virtual void redraw() const { + _pFgColour->redraw(); + _pBgColour->redraw(); + //StaticDialog::redraw(); + ::InvalidateRect(_hStyleInfoStaticText, NULL, TRUE); + ::UpdateWindow(_hStyleInfoStaticText); + }; + + + +private : + ColourPicker *_pFgColour; + ColourPicker *_pBgColour; + + int _currentLexerIndex; + + HWND _hStyleList; + HWND _hCheckBold; + HWND _hCheckItalic; + HWND _hCheckUnderline; + HWND _hFontNameCombo; + HWND _hFontSizeCombo; + + HWND _hFgColourStaticText; + HWND _hBgColourStaticText; + HWND _hFontNameStaticText; + HWND _hFontSizeStaticText; + HWND _hStyleInfoStaticText; + char _originalWarning[256]; + + LexerStylerArray _lsArray; + StyleArray _globalStyles; + + ColourStaticTextHooker colourHooker; + + bool _isDirty; + bool _isSync; + + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + + + Style & getCurrentStyler() { + int styleIndex = int(::SendMessage(_hStyleList, LB_GETCURSEL, 0, 0)); + if (_currentLexerIndex == 0) + return _globalStyles.getStyler(styleIndex); + else + { + LexerStyler & lexerStyler = _lsArray.getLexerFromIndex(_currentLexerIndex - 1); + return lexerStyler.getStyler(styleIndex); + } + }; + + void updateColour(bool which); + void updateFontStyleStatus(fontStyleType whitchStyle); + void updateExtension(); + void updateFontName(); + void updateFontSize(); + void updateUserKeywords(); + + 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; + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), TRUE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), TRUE); + return TRUE; + } + void setStyleListFromLexer(int index); + void setVisualFromStyleList(); +}; + +#endif //WORD_STYLE_H diff --git a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h.dockable b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h.dockable new file mode 100644 index 00000000..76f91314 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h.dockable @@ -0,0 +1,179 @@ +/* +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 "DockingDlgInterface.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 +#define WM_DATA_MODIFIED (WORDSTYLE_USER + 2) //WordStyleDlg's msg 2 send 2 its parent(GlobalStyleDlg) + +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) { + ::SetWindowLong(staticHandle, GWL_USERDATA, (LONG)this); + _oldProc = (WNDPROC)::SetWindowLong(staticHandle, GWL_WNDPROC, (LONG)staticProc); + }; +private : + COLORREF _colour; + WNDPROC _oldProc; + HFONT _hFont; + + static BOOL CALLBACK staticProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ + ColourStaticTextHooker *pColourStaticTextHooker = reinterpret_cast(::GetWindowLong(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 +class WordStyleDlg : public DockingDlgInterface +{ +public : + WordStyleDlg():DockingDlgInterface(IDD_STYLER_DLG), _isDirty(false), _isSync(true){_originalWarning[0] = '\0';}; + + void init(HINSTANCE hInst, HWND parent) { + Window::init(hInst, parent); + }; + + void create(tTbData * data, bool isRTL = false); +/* + void doDialog(bool isRTL = false) { + if (!isCreated()) + create(IDD_STYLER_DLG, isRTL); + display(); + }; +*/ + virtual void redraw() const { + _pFgColour->redraw(); + _pBgColour->redraw(); + //StaticDialog::redraw(); + ::InvalidateRect(_hStyleInfoStaticText, NULL, TRUE); + ::UpdateWindow(_hStyleInfoStaticText); + }; + + + +private : + ColourPicker *_pFgColour; + ColourPicker *_pBgColour; + + int _currentLexerIndex; + + HWND _hStyleList; + HWND _hCheckBold; + HWND _hCheckItalic; + HWND _hCheckUnderline; + HWND _hFontNameCombo; + HWND _hFontSizeCombo; + + HWND _hFgColourStaticText; + HWND _hBgColourStaticText; + HWND _hFontNameStaticText; + HWND _hFontSizeStaticText; + HWND _hStyleInfoStaticText; + char _originalWarning[256]; + + LexerStylerArray _lsArray; + StyleArray _globalStyles; + + ColourStaticTextHooker colourHooker; + + bool _isDirty; + bool _isSync; + + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + + + Style & getCurrentStyler() { + int styleIndex = int(::SendMessage(_hStyleList, LB_GETCURSEL, 0, 0)); + if (_currentLexerIndex == 0) + return _globalStyles.getStyler(styleIndex); + else + { + LexerStyler & lexerStyler = _lsArray.getLexerFromIndex(_currentLexerIndex - 1); + return lexerStyler.getStyler(styleIndex); + } + }; + + void updateColour(bool which); + void updateFontStyleStatus(fontStyleType whitchStyle); + void updateExtension(); + void updateFontName(); + void updateFontSize(); + void updateUserKeywords(); + + 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; + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), TRUE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), TRUE); + return TRUE; + } + void setStyleListFromLexer(int index); + void setVisualFromStyleList(); +}; + +#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..3a49e677 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.rc @@ -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. +*/ + +#include "windows.h" +#include "wordstyledlgres.h" + +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif + +IDD_STYLER_DLG DIALOGEX 36, 44, 500, 227 +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 "Foreground color",IDC_FG_STATIC,203,48,59,8,0, WS_EX_RIGHT + LTEXT "Background color",IDC_BG_STATIC,203,75,59,8,0, WS_EX_RIGHT + COMBOBOX IDC_FONT_COMBO,371,44,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FONTSIZE_COMBO,435,71,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_BOLD_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,327,64,63,10 + CONTROL "Italic",IDC_ITALIC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,327,76,62,10 + GROUPBOX "Font style",IDC_FONTGROUP_STATIC,311,28,169,77 + GROUPBOX "Colour style",IDC_COLOURGROUP_STATIC,191,28,111,77 + LTEXT "Font Name :",IDC_FONTNAME_STATIC,315,47,52,8,0, WS_EX_RIGHT + LTEXT "Font size :",IDC_FONTSIZE_STATIC,381,73,51,8,0, WS_EX_RIGHT + LTEXT "Style :",IDC_STYLEDESC_STATIC,87,10,68,8 + LTEXT "Attention : The definition of this style will be the default definition for all non defined styles", IDC_STYLEDEFAULT_WARNING_STATIC,190,6,295,22 + EDITTEXT IDC_DEF_EXT_EDIT,17,191,61,14,ES_AUTOHSCROLL | ES_READONLY + LTEXT "Default ext : ",IDC_DEF_EXT_STATIC,20,179,61,8 + EDITTEXT IDC_USER_EXT_EDIT,93,191,71,14, ES_AUTOHSCROLL + LTEXT "User ext :",IDC_USER_EXT_STATIC,95,180,71,8 + CONTROL "Underline",IDC_UNDERLINE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,327,88,80,10 + EDITTEXT IDC_DEF_KEYWORDS_EDIT,191,127,136,43,ES_MULTILINE | ES_READONLY | WS_VSCROLL + EDITTEXT IDC_USER_KEYWORDS_EDIT,347,126,134,43,ES_MULTILINE | WS_VSCROLL + LTEXT "Default keywords",IDC_DEF_KEYWORDS_STATIC,193,117,122,8 + LTEXT "User Define keywords",IDC_USER_KEYWORDS_STATIC,349,116,126,8 + LTEXT "+",IDC_PLUSSYMBOL_STATIC,335,142,8,8 + PUSHBUTTON "Cancel",IDCANCEL,332,198,57,14 + PUSHBUTTON "Apply",IDOK,264,198,60,14 + PUSHBUTTON "Save && Close",IDC_SAVECLOSE_BUTTON,188,198,69,14 + CONTROL "",IDC_SC_PERCENTAGE_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | NOT WS_VISIBLE | WS_TABSTOP,441,208,53,10 + CONTROL "Transparency",IDC_SC_TRANSPARENT_CHECK,"Button", BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,431,197,63, 10 + LISTBOX IDC_LANGUAGES_LIST,17,22,59,146,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LISTBOX IDC_STYLES_LIST,87,22,76,146,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP + GROUPBOX "",IDC_STATIC,7,0,166,212 + LTEXT "Language :",IDC_LANGDESC_STATIC,19,10,61,8 + GROUPBOX "",IDC_STATIC,181,0,310,184 + LTEXT "+",IDC_PLUSSYMBOL2_STATIC,83,193,8,8 +END + diff --git a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlgRes.h b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlgRes.h new file mode 100644 index 00000000..b67a3965 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlgRes.h @@ -0,0 +1,54 @@ +/* +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) + #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 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) diff --git a/PowerEditor/src/WinControls/ContextMenu/ContextMenu.h b/PowerEditor/src/WinControls/ContextMenu/ContextMenu.h new file mode 100644 index 00000000..f1da557a --- /dev/null +++ b/PowerEditor/src/WinControls/ContextMenu/ContextMenu.h @@ -0,0 +1,78 @@ +/* +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; + string _itemName; + MenuItemUnit() : _cmdID(0), _itemName("") {}; + MenuItemUnit(unsigned long cmdID, string itemName) : _cmdID(cmdID), _itemName(itemName) {}; + MenuItemUnit(unsigned long cmdID, const char *itemName) : _cmdID(cmdID){ + if (!itemName) + _itemName = ""; + 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)); + }; + +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 + char *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 + char *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 char* 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..8157027c --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp @@ -0,0 +1,1224 @@ +//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 "SysMsg.h" +#include +#include +#include "common_func.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; + _vTbData.clear(); +} + +DockingCont::~DockingCont() +{ + ::DeleteObject(_hFont); +} + + +void DockingCont::doDialog(bool willBeShown, bool isFloating) +{ + if (!isCreated()) + { + create(IDD_CONTAINER_DLG); + + _isFloating = isFloating; + + if (_isFloating == true) + { + ::SetWindowLong(_hSelf, GWL_STYLE, POPUP_STYLES); + ::SetWindowLong(_hSelf, GWL_EXSTYLE, POPUP_EXSTYLES); + ::ShowWindow(_hCaption, SW_HIDE); + } + else + { + ::SetWindowLong(_hSelf, GWL_STYLE, CHILD_STYLES); + ::SetWindowLong(_hSelf, GWL_EXSTYLE, CHILD_EXSTYLES); + ::ShowWindow(_hCaption, SW_SHOW); + } + + _hFont = ::CreateFont(14, 0, 0, 0, + FW_NORMAL, FALSE, FALSE, FALSE, + ANSI_CHARSET, OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, + DEFAULT_PITCH | FF_ROMAN, + "MS Shell Dlg"); + } + + display(willBeShown); +} + + +tTbData* DockingCont::createToolbar(tTbData data, Window **ppWin) +{ + tTbData *pTbData = new tTbData; + + *pTbData = data; + + /* force window style of client window */ + ::SetWindowLong(pTbData->hClient, GWL_STYLE, CHILD_STYLES); + ::SetWindowLong(pTbData->hClient, GWL_EXSTYLE, CHILD_EXSTYLES); + + /* restore position if plugin is in floating state */ + if ((_isFloating == true) && (::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; +} + + +tTbData DockingCont::destroyToolbar(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 */ + hideToolbar(_vTbData[iTb]); + + /* release client from container */ + ::SetParent(TbData.hClient, NULL); + + /* free resources */ + delete _vTbData[iTb]; + vector::iterator itr = _vTbData.begin() + iTb; + _vTbData.erase(itr); + } + } + return TbData; +} + + +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(char* pszName) +{ + tTbData* pTbData = NULL; + + /* find entry by handle */ + for (size_t iTb = 0; iTb < _vTbData.size(); iTb++) + { + if (strcmp(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) +{ + switch (Message) + { + case WM_LBUTTONDOWN: + { + _isMouseDown = TRUE; + + if (isInRect(hwnd, LOWORD(lParam), HIWORD(lParam)) == posClose) + { + _isMouseClose = TRUE; + _isMouseOver = TRUE; + + /* start hooking */ + hWndServer = _hCaption; + if (GetVersion() & 0x80000000) + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)hookProcMouse, _hInst, 0); + } + else + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)hookProcMouse, _hInst, 0); + } + + if (!hookMouse) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, "GetLastError() returned %lu", dwError); + ::MessageBox(NULL, str, "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); + } + } + } + return TRUE; + } + case WM_SIZE: + { + ::GetWindowRect(hwnd, &_rcCaption); + ScreenToClient(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) +{ + RECT rc = pDrawItemStruct->rcItem; + HDC hDc = pDrawItemStruct->hDC; + HBRUSH bgbrush = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE)); + HPEN hPen = ::CreatePen(PS_SOLID, 1, RGB(0xC0,0xC0,0xC0)); + BITMAP bmp = {0}; + HBITMAP hBmpCur = NULL; + HBITMAP hBmpOld = NULL; + HBITMAP hBmpNew = NULL; + UINT length = strlen(_pszCaption); + + int nSavedDC = ::SaveDC(hDc); + + /* begin with paint */ + ::SetBkMode(hDc, TRANSPARENT); + + /* set text and/or caption grid */ + if (_isTopCaption == TRUE) + { + SIZE size; + + /* fill background */ + rc.left += 1; + rc.top += 2; + rc.right -= 16; + ::FillRect(hDc, &rc, bgbrush); + + /* draw text */ + ::SelectObject(hDc, _hFont); + ::ExtTextOut(hDc, rc.left, 2, ETO_CLIPPED, &rc, _pszCaption, length, NULL); + + /* calculate beginning of grid lines */ + GetTextExtentPoint32(hDc, _pszCaption, length, &size); + rc.left += (size.cx + 2); + + if (rc.left < rc.right) + { + /* draw grid lines */ + HPEN hOldPen = (HPEN)::SelectObject(hDc, hPen); + + MoveToEx(hDc, rc.left , rc.top+1 , NULL); + LineTo (hDc, rc.right, rc.top+1 ); + MoveToEx(hDc, rc.left , rc.top+4 , NULL); + LineTo (hDc, rc.right, rc.top+4 ); + MoveToEx(hDc, rc.left , rc.top+7 , NULL); + LineTo (hDc, rc.right, rc.top+7 ); + MoveToEx(hDc, rc.left , rc.top+10, NULL); + LineTo (hDc, rc.right, rc.top+10); + } + } + else + { + /* create local font for vertical draw */ + HFONT hFont; + SIZE size; + + /* fill background */ + rc.left += 2; + rc.top += 16; + rc.bottom -= 1; + ::FillRect(hDc, &rc, bgbrush); + + /* draw text */ + 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, + "MS Shell Dlg"); + ::SelectObject(hDc, hFont); + ::ExtTextOut(hDc, 3, rc.bottom, ETO_CLIPPED, &rc, _pszCaption, length, NULL); + + /* calculate beginning of grid lines */ + GetTextExtentPoint32(hDc, _pszCaption, length, &size); + rc.bottom -= (size.cx + 2); + + ::DeleteObject(hFont); + + if (rc.bottom < rc.top) + { + /* draw grid lines */ + HPEN hOldPen = (HPEN)::SelectObject(hDc, hPen); + MoveToEx(hDc, rc.left+1 , rc.top, NULL); + LineTo (hDc, rc.left+1 , rc.bottom); + MoveToEx(hDc, rc.left+4 , rc.top, NULL); + LineTo (hDc, rc.left+4 , rc.bottom); + MoveToEx(hDc, rc.left+7 , rc.top, NULL); + LineTo (hDc, rc.left+7 , rc.bottom); + MoveToEx(hDc, rc.left+10, rc.top, NULL); + LineTo (hDc, rc.left+10, rc.bottom); + } + } + ::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-2, 2, bmp.bmWidth, bmp.bmHeight, dcMem, 0, 0, SRCCOPY); + else + ::BitBlt(hDc, 2, 2, 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); + ScreenToClient(hwnd, &rc); + + if (_isTopCaption == TRUE) + { + if ((x > rc.left) && (x < rc.right-16) && (y > rc.top) && (y < rc.bottom)) + { + ret = posCaption; + } + else if ((x > rc.right-14) && (x < rc.right-2) && (y > rc.top+2) && (y < rc.bottom-2)) + { + ret = posClose; + } + } + else + { + if ((x > rc.left) && (x < rc.right) && (y > rc.top+16) && (y < rc.bottom)) + { + ret = posCaption; + } + else if ((x > rc.left-2) && (x < rc.right-2) && (y > rc.top+2) && (y < rc.top+14)) + { + ret = posClose; + } + } + + return ret; +} + + +/********************************************************************************* + * Process function of tab + */ +LRESULT DockingCont::runProcTab(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + 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: + { + if ((_beginDrag == TRUE) && (wParam == MK_LBUTTON)) + { + 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); + + /* send moving message to parent window */ + _dragFromTab = TRUE; + NotifyParent(DMM_MOVE); + _beginDrag = FALSE; + } + else + { + _beginDrag = 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); + + char* text = ((tTbData*)tcItem.lParam)->pszName; + int length = strlen(((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 (isSelected == true) + { + 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 */ + SIZE size = {0}; + IMAGEINFO info = {0}; + RECT & imageRect = info.rcImage; + + ImageList_GetImageInfo(hImageList, iPosImage, &info); + + /* calculate position of rect */ + ::GetTextExtentPoint(hDc, text, length, &size); + rc.left += ((rc.right - rc.left) - (imageRect.right - imageRect.left) - size.cx - 2) / 2; + + ImageList_Draw(hImageList, iPosImage, hDc, rc.left, ((isSelected == true)?2:3), ILD_NORMAL); + + rc.left += imageRect.right - imageRect.left - ((isSelected == true)?3:0); + } + } + + 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_CENTER); + + ::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 */ + ::SetWindowLong(_hCaption, GWL_USERDATA, reinterpret_cast(this)); + _hDefaultCaptionProc = reinterpret_cast(::SetWindowLong(_hCaption, GWL_WNDPROC, reinterpret_cast(wndCaptionProc))); + + /* intial subclassing of tab */ + ::SetWindowLong(_hContTab, GWL_USERDATA, reinterpret_cast(this)); + _hDefaultTabProc = reinterpret_cast(::SetWindowLong(_hContTab, GWL_WNDPROC, reinterpret_cast(wndTabProc))); + 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); + ClientToScreen(_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); + + 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, 16, SWP_NOZORDER | SWP_NOACTIVATE); + rc.top += 16; + rc.bottom -= 16; + } + else + { + ::SetWindowPos(_hCaption, NULL, rc.left, rc.top, 16, rc.bottom, SWP_NOZORDER | SWP_NOACTIVATE); + rc.left += 16; + rc.right -= 16; + } + + if (iItemCnt >= 2) + { + /* resize tab and plugin control if tabs exceeds one */ + /* resize tab */ + rcTemp = rc; + rcTemp.top = (rcTemp.bottom + rcTemp.top) - 22; + rcTemp.bottom = 20; + + ::SetWindowPos(_hContTab, NULL, + rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, + SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE); + + /* resize client area for plugin */ + rcTemp = rc; + rcTemp.top += 2; + rcTemp.bottom -= 22; + } + else + { + /* resize client area for plugin */ + rcTemp = rc; + rcTemp.top += 2; + rcTemp.bottom -= 2; + } + + /* 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 - 22; + rcTemp.bottom = 20; + + ::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:20); + + ::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) +{ + 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 == false) + { + ::SendMessage(_hParent, WM_SIZE, 0, 0); + } + } + + /* keep sure, that client is hide!!! */ + ::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 exist */ + int iTabPos = SearchPosInTab(pTbData); + if (iTabPos == -1) + { + /* set only params and text even if icon available */ + tcItem.mask = TCIF_PARAM | TCIF_TEXT; + + tcItem.lParam = (LPARAM)pTbData; + + if (pTbData->uMask & DWS_ICONTAB) + { + /* fake here a icon before the text ... */ + char szText[64]; + + strcpy(szText, " "); + strcat(szText, pTbData->pszName); + + tcItem.pszText = szText; + tcItem.cchTextMax = strlen(szText); + } + else + { + /* ... but here put text normal into the tab */ + tcItem.pszText = pTbData->pszName; + tcItem.cchTextMax = strlen(pTbData->pszName); + } + + ::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 iItem) +{ + if (iItem != -1) + { + TCITEM tcItem = {0}; + + /* get data of new active dialog */ + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + /* show active dialog */ + ::ShowWindow(((tTbData*)tcItem.lParam)->hClient, SW_SHOW); + ::SetFocus(((tTbData*)tcItem.lParam)->hClient); + + if (iItem != _prevItem) + { + /* hide previous dialog */ + ::SendMessage(_hContTab, TCM_GETITEM, _prevItem, (LPARAM)&tcItem); + ::ShowWindow(((tTbData*)tcItem.lParam)->hClient, SW_HIDE); + } + + /* selects the pressed tab and store previous tab */ + ::SendMessage(_hContTab, TCM_SETCURSEL, iItem, 0); + _prevItem = iItem; + + /* update caption text */ + updateCaption(); + + onSize(); + } +} + +void DockingCont::updateCaption(void) +{ + TCITEM tcItem = {0}; + int iItem = 0; + + /* get active tab */ + iItem = getActiveTb(); + + /* get data of new active dialog */ + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + /* update caption text */ + strcpy(_pszCaption, ((tTbData*)tcItem.lParam)->pszName); + + /* test if additional information are available */ + if ((((tTbData*)tcItem.lParam)->uMask & DWS_ADDINFO) && + (strlen(((tTbData*)tcItem.lParam)->pszAddInfo) != 0)) + { + strcat(_pszCaption, " - "); + strcat(_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.cpp.bak b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp.bak new file mode 100644 index 00000000..05e4956d --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp.bak @@ -0,0 +1,1221 @@ +//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 "SysMsg.h" +#include +#include +#include "common_func.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; + _vTbData.clear(); +} + +DockingCont::~DockingCont() +{ + ::DeleteObject(_hFont); +} + + +void DockingCont::doDialog(bool willBeShown, bool isFloating) +{ + if (!isCreated()) + { + create(IDD_CONTAINER_DLG); + + _isFloating = isFloating; + + if (_isFloating == true) + { + ::SetWindowLong(_hSelf, GWL_STYLE, POPUP_STYLES); + ::SetWindowLong(_hSelf, GWL_EXSTYLE, POPUP_EXSTYLES); + ::ShowWindow(_hCaption, SW_HIDE); + } + else + { + ::SetWindowLong(_hSelf, GWL_STYLE, CHILD_STYLES); + ::SetWindowLong(_hSelf, GWL_EXSTYLE, CHILD_EXSTYLES); + ::ShowWindow(_hCaption, SW_SHOW); + } + + _hFont = ::CreateFont(14, 0, 0, 0, + FW_NORMAL, FALSE, FALSE, FALSE, + ANSI_CHARSET, OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, + DEFAULT_PITCH | FF_ROMAN, + "MS Shell Dlg"); + } + + display(willBeShown); +} + + +tTbData* DockingCont::createToolbar(tTbData data, Window **ppWin) +{ + tTbData *pTbData = new tTbData; + + *pTbData = data; + + /* force window style of client window */ + ::SetWindowLong(pTbData->hClient, GWL_STYLE, CHILD_STYLES); + ::SetWindowLong(pTbData->hClient, GWL_EXSTYLE, CHILD_EXSTYLES); + + /* restore position if plugin is in floating state */ + if ((_isFloating == true) && (::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; +} + + +tTbData DockingCont::destroyToolbar(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 */ + hideToolbar(_vTbData[iTb]); + + /* release client from container */ + ::SetParent(TbData.hClient, NULL); + + /* free resources */ + delete _vTbData[iTb]; + vector::iterator itr = _vTbData.begin() + iTb; + _vTbData.erase(itr); + } + } + return TbData; +} + + +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(char* pszName) +{ + tTbData* pTbData = NULL; + + /* find entry by handle */ + for (size_t iTb = 0; iTb < _vTbData.size(); iTb++) + { + if (strcmp(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) +{ + switch (Message) + { + case WM_LBUTTONDOWN: + { + _isMouseDown = TRUE; + + if (isInRect(hwnd, LOWORD(lParam), HIWORD(lParam)) == posClose) + { + _isMouseClose = TRUE; + _isMouseOver = TRUE; + + /* start hooking */ + hWndServer = _hCaption; + if (GetVersion() & 0x80000000) + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)hookProcMouse, _hInst, 0); + } + else + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)hookProcMouse, _hInst, 0); + } + + if (!hookMouse) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, "GetLastError() returned %lu", dwError); + ::MessageBox(NULL, str, "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); + } + } + } + return TRUE; + } + case WM_SIZE: + { + ::GetWindowRect(hwnd, &_rcCaption); + ScreenToClient(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) +{ + RECT rc = pDrawItemStruct->rcItem; + HDC hDc = pDrawItemStruct->hDC; + HBRUSH bgbrush = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE)); + HPEN hPen = ::CreatePen(PS_SOLID, 1, RGB(0xC0,0xC0,0xC0)); + BITMAP bmp = {0}; + HBITMAP hBmpCur = NULL; + HBITMAP hBmpOld = NULL; + HBITMAP hBmpNew = NULL; + UINT length = strlen(_pszCaption); + + int nSavedDC = ::SaveDC(hDc); + + /* begin with paint */ + ::SetBkMode(hDc, TRANSPARENT); + + /* set text and/or caption grid */ + if (_isTopCaption == TRUE) + { + SIZE size; + + /* fill background */ + rc.left += 1; + rc.top += 2; + rc.right -= 16; + ::FillRect(hDc, &rc, bgbrush); + + /* draw text */ + ::SelectObject(hDc, _hFont); + ::ExtTextOut(hDc, rc.left, 2, ETO_CLIPPED, &rc, _pszCaption, length, NULL); + + /* calculate beginning of grid lines */ + GetTextExtentPoint32(hDc, _pszCaption, length, &size); + rc.left += (size.cx + 2); + + if (rc.left < rc.right) + { + /* draw grid lines */ + HPEN hOldPen = (HPEN)::SelectObject(hDc, hPen); + + MoveToEx(hDc, rc.left , rc.top+1 , NULL); + LineTo (hDc, rc.right, rc.top+1 ); + MoveToEx(hDc, rc.left , rc.top+4 , NULL); + LineTo (hDc, rc.right, rc.top+4 ); + MoveToEx(hDc, rc.left , rc.top+7 , NULL); + LineTo (hDc, rc.right, rc.top+7 ); + MoveToEx(hDc, rc.left , rc.top+10, NULL); + LineTo (hDc, rc.right, rc.top+10); + } + } + else + { + /* create local font for vertical draw */ + HFONT hFont; + SIZE size; + + /* fill background */ + rc.left += 2; + rc.top += 16; + rc.bottom -= 1; + ::FillRect(hDc, &rc, bgbrush); + + /* draw text */ + 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, + "MS Shell Dlg"); + ::SelectObject(hDc, hFont); + ::ExtTextOut(hDc, 3, rc.bottom, ETO_CLIPPED, &rc, _pszCaption, length, NULL); + + /* calculate beginning of grid lines */ + GetTextExtentPoint32(hDc, _pszCaption, length, &size); + rc.bottom -= (size.cx + 2); + + ::DeleteObject(hFont); + + if (rc.bottom < rc.top) + { + /* draw grid lines */ + HPEN hOldPen = (HPEN)::SelectObject(hDc, hPen); + MoveToEx(hDc, rc.left+1 , rc.top, NULL); + LineTo (hDc, rc.left+1 , rc.bottom); + MoveToEx(hDc, rc.left+4 , rc.top, NULL); + LineTo (hDc, rc.left+4 , rc.bottom); + MoveToEx(hDc, rc.left+7 , rc.top, NULL); + LineTo (hDc, rc.left+7 , rc.bottom); + MoveToEx(hDc, rc.left+10, rc.top, NULL); + LineTo (hDc, rc.left+10, rc.bottom); + } + } + ::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-2, 2, bmp.bmWidth, bmp.bmHeight, dcMem, 0, 0, SRCCOPY); + else + ::BitBlt(hDc, 2, 2, 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); + ScreenToClient(hwnd, &rc); + + if (_isTopCaption == TRUE) + { + if ((x > rc.left) && (x < rc.right-16) && (y > rc.top) && (y < rc.bottom)) + { + ret = posCaption; + } + else if ((x > rc.right-14) && (x < rc.right-2) && (y > rc.top+2) && (y < rc.bottom-2)) + { + ret = posClose; + } + } + else + { + if ((x > rc.left) && (x < rc.right) && (y > rc.top+16) && (y < rc.bottom)) + { + ret = posCaption; + } + else if ((x > rc.left-2) && (x < rc.right-2) && (y > rc.top+2) && (y < rc.top+14)) + { + ret = posClose; + } + } + + return ret; +} + + +/********************************************************************************* + * Process function of tab + */ +LRESULT DockingCont::runProcTab(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + 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: + { + if ((_beginDrag == TRUE) && (wParam == MK_LBUTTON)) + { + 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); + + /* send moving message to parent window */ + _dragFromTab = TRUE; + NotifyParent(DMM_MOVE); + _beginDrag = FALSE; + } + else + { + _beginDrag = 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); + + char* text = ((tTbData*)tcItem.lParam)->pszName; + int length = strlen(((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 (isSelected == true) + { + 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 */ + SIZE size = {0}; + IMAGEINFO info = {0}; + RECT & imageRect = info.rcImage; + + ImageList_GetImageInfo(hImageList, iPosImage, &info); + + /* calculate position of rect */ + ::GetTextExtentPoint(hDc, text, length, &size); + rc.left += ((rc.right - rc.left) - (imageRect.right - imageRect.left) - size.cx - 2) / 2; + + ImageList_Draw(hImageList, iPosImage, hDc, rc.left, ((isSelected == true)?2:3), ILD_NORMAL); + + rc.left += imageRect.right - imageRect.left - ((isSelected == true)?3:0); + } + } + + 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_CENTER); + + ::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 */ + ::SetWindowLong(_hCaption, GWL_USERDATA, reinterpret_cast(this)); + _hDefaultCaptionProc = reinterpret_cast(::SetWindowLong(_hCaption, GWL_WNDPROC, reinterpret_cast(wndCaptionProc))); + + /* intial subclassing of tab */ + ::SetWindowLong(_hContTab, GWL_USERDATA, reinterpret_cast(this)); + _hDefaultTabProc = reinterpret_cast(::SetWindowLong(_hContTab, GWL_WNDPROC, reinterpret_cast(wndTabProc))); + 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); + ClientToScreen(_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); + + 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, 16, SWP_NOZORDER); + rc.top += 16; + rc.bottom -= 16; + } + else + { + ::SetWindowPos(_hCaption, NULL, rc.left, rc.top, 16, rc.bottom, SWP_NOZORDER); + rc.left += 16; + rc.right -= 16; + } + + if (iItemCnt >= 2) + { + /* resize tab and plugin control if tabs exceeds one */ + /* resize tab */ + rcTemp = rc; + rcTemp.top = (rcTemp.bottom + rcTemp.top) - 22; + rcTemp.bottom = 20; + + ::SetWindowPos(_hContTab, NULL, + rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, + SWP_NOZORDER | SWP_SHOWWINDOW); + + /* resize client area for plugin */ + rcTemp = rc; + rcTemp.top += 2; + rcTemp.bottom -= 22; + } + else + { + /* resize client area for plugin */ + rcTemp = rc; + rcTemp.top += 2; + rcTemp.bottom -= 2; + } + + /* set position of client area */ + ::SetWindowPos(::GetDlgItem(_hSelf, IDC_CLIENT_TAB), NULL, + rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, + SWP_NOZORDER); + } + /* 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 - 22; + rcTemp.bottom = 20; + + ::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:20); + + ::SetWindowPos(::GetDlgItem(_hSelf, IDC_CLIENT_TAB), NULL, + rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, + SWP_NOZORDER); + } + + + /* get active item data */ + UINT iItem = getActiveTb(); + + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + /* resize plugin window */ + ::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) +{ + 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 == false) + { + ::SendMessage(_hParent, WM_SIZE, 0, 0); + } + } + + /* keep sure, that client is hide!!! */ + ::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 exist */ + int iTabPos = SearchPosInTab(pTbData); + if (iTabPos == -1) + { + /* set only params and text even if icon available */ + tcItem.mask = TCIF_PARAM | TCIF_TEXT; + + tcItem.lParam = (LPARAM)pTbData; + + if (pTbData->uMask & DWS_ICONTAB) + { + /* fake here a icon before the text ... */ + char szText[64]; + + strcpy(szText, " "); + strcat(szText, pTbData->pszName); + + tcItem.pszText = szText; + tcItem.cchTextMax = strlen(szText); + } + else + { + /* ... but here put text normal into the tab */ + tcItem.pszText = pTbData->pszName; + tcItem.cchTextMax = strlen(pTbData->pszName); + } + + ::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 iItem) +{ + if (iItem != -1) + { + TCITEM tcItem = {0}; + + /* get data of new active dialog */ + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + /* show active dialog */ + ::ShowWindow(((tTbData*)tcItem.lParam)->hClient, SW_SHOW); + ::SetFocus(((tTbData*)tcItem.lParam)->hClient); + + if (iItem != _prevItem) + { + /* hide previous dialog */ + ::SendMessage(_hContTab, TCM_GETITEM, _prevItem, (LPARAM)&tcItem); + ::ShowWindow(((tTbData*)tcItem.lParam)->hClient, SW_HIDE); + } + + /* selects the pressed tab and store previous tab */ + ::SendMessage(_hContTab, TCM_SETCURSEL, iItem, 0); + _prevItem = iItem; + + /* update caption text */ + updateCaption(); + + onSize(); + } +} + +void DockingCont::updateCaption(void) +{ + TCITEM tcItem = {0}; + int iItem = 0; + + /* get active tab */ + iItem = getActiveTb(); + + /* get data of new active dialog */ + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + /* update caption text */ + strcpy(_pszCaption, ((tTbData*)tcItem.lParam)->pszName); + + /* test if additional information are available */ + if ((((tTbData*)tcItem.lParam)->uMask & DWS_ADDINFO) && + (strlen(((tTbData*)tcItem.lParam)->pszAddInfo) != 0)) + { + strcat(_pszCaption, " - "); + strcat(_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..148d4d6a --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.h @@ -0,0 +1,213 @@ +// 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|WS_VISIBLE) +#define CHILD_EXSTYLES (0x00000000L) + + +enum eMousePos { + posOutside, + posCaption, + posClose +}; + + + +class DockingCont : public StaticDialog +{ +public: + DockingCont(); + ~DockingCont(); + + void init(HINSTANCE hInst, HWND hWnd) { + Window::init(hInst, hWnd); + }; + + HWND getTabWnd(void) { + HWND hRet = NULL; + if (isCreated()) + hRet = _hContTab; + + return hRet; + }; + HWND getCaptionWnd(void) { + HWND hRet = NULL; + if (isCreated()) + { + if (_isFloating == false) + hRet = _hCaption; + else + hRet = _hSelf; + } + + return hRet; + }; + + tTbData* createToolbar(tTbData data, Window **ppWin); + tTbData destroyToolbar(tTbData data); + tTbData* findToolbarByWnd(HWND hClient); + tTbData* findToolbarByName(char* 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); + + 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 *)(::GetWindowLong(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 *)(::GetWindowLong(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 item); + + int hideToolbar(tTbData* pTbData); + void viewToolbar(tTbData *pTbData); + + void updateCaption(void); + LPARAM NotifyParent(UINT message); + +private: + /* handles */ + bool _isFloating; + HWND _hCaption; + HWND _hContTab; + + /* horizontal font for caption and tab */ + HFONT _hFont; + + /* caption params */ + BOOL _isTopCaption; + char _pszCaption[256]; + BOOL _isMouseDown; + BOOL _isMouseClose; + BOOL _isMouseOver; + RECT _rcCaption; + + /* 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; + + /* data of added windows */ + vector _vTbData; +}; + + + +#endif // DOCKINGCONT diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingCont.h.bak b/PowerEditor/src/WinControls/DockingWnd/DockingCont.h.bak new file mode 100644 index 00000000..70df0941 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.h.bak @@ -0,0 +1,213 @@ +// 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|WS_VISIBLE +#define CHILD_EXSTYLES 0x00000000L + + +enum eMousePos { + posOutside, + posCaption, + posClose +}; + + + +class DockingCont : public StaticDialog +{ +public: + DockingCont(); + ~DockingCont(); + + void init(HINSTANCE hInst, HWND hWnd) { + Window::init(hInst, hWnd); + }; + + HWND getTabWnd(void) { + HWND hRet = NULL; + if (isCreated()) + hRet = _hContTab; + + return hRet; + }; + HWND getCaptionWnd(void) { + HWND hRet = NULL; + if (isCreated()) + { + if (_isFloating == false) + hRet = _hCaption; + else + hRet = _hSelf; + } + + return hRet; + }; + + tTbData* createToolbar(tTbData data, Window **ppWin); + tTbData destroyToolbar(tTbData data); + tTbData* findToolbarByWnd(HWND hClient); + tTbData* findToolbarByName(char* 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); + + 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 *)(::GetWindowLong(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 *)(::GetWindowLong(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 item); + + int hideToolbar(tTbData* pTbData); + void viewToolbar(tTbData *pTbData); + + void updateCaption(void); + LPARAM NotifyParent(UINT message); + +private: + /* handles */ + bool _isFloating; + HWND _hCaption; + HWND _hContTab; + + /* horizontal font for caption and tab */ + HFONT _hFont; + + /* caption params */ + BOOL _isTopCaption; + char _pszCaption[256]; + BOOL _isMouseDown; + BOOL _isMouseClose; + BOOL _isMouseOver; + RECT _rcCaption; + + /* 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; + + /* 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..ca7c1b97 --- /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); + strcpy(_moduleName, PathFindFileName(_moduleName)); + } + + void create(tTbData * data, bool isRTL = false){ + StaticDialog::create(_dlgID, isRTL); + ::GetWindowText(_hSelf, _pluginName, sizeof(_pluginName)); + + // 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 char * 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, "Close Dialog", "Plugin Message", MB_OK); + break; + } + case DMN_FLOAT: + { + //::MessageBox(_hSelf, "Float Dialog", "Plugin Message", MB_OK); + _isFloating = true; + break; + } + case DMN_DOCK: + { + //char test[256]; + //sprintf(test, "Dock Dialog to %d", HIWORD(pnmh->code)); + //::MessageBox(_hSelf, test, "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; + char _moduleName[MAX_PATH]; + char _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..3ea06f81 --- /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, "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..79c79274 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingManager.cpp @@ -0,0 +1,811 @@ +//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 "windows.h" + + + +BOOL DockingManager::_isRegistered = FALSE; + + +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 = NULL; + clz.hbrBackground = NULL; + clz.lpszMenuName = NULL; + clz.lpszClassName = DSPC_CLASS_NAME; + + if (!::RegisterClass(&clz)) + { + systemMessage("System Err"); + throw int(98); + } + _isRegistered = TRUE; + } + + _hSelf = ::CreateWindowEx( + 0, + DSPC_CLASS_NAME, + "", + WS_CHILD | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + _hParent, + NULL, + _hInst, + (LPVOID)this); + + if (!_hSelf) + { + systemMessage("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); + } + + _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; + ::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast(pDockingManager)); + return TRUE; + + default : + pDockingManager = (DockingManager *)::GetWindowLong(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: + { + /* 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]; + } + break; + } + 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; + } + + /* remove toolbar from anywhere */ + TbData = _vContainer[iContSrc]->destroyToolbar(TbData); + + 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))); + + 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; + } + + /* remove toolbar from anywhere */ + TbData = _vContainer[iContSrc]->destroyToolbar(TbData); + + 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))); + } + + _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); + + /* remove toolbar from anywhere */ + TbData = _vContainer[iContSrc]->destroyToolbar(TbData); + + /* 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)); + + pContTgt->createToolbar(TbData, _ppMainWindow); +} + +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.cpp.bak b/PowerEditor/src/WinControls/DockingWnd/DockingManager.cpp.bak new file mode 100644 index 00000000..f65f7c12 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingManager.cpp.bak @@ -0,0 +1,811 @@ +//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 "windows.h" + + + +BOOL DockingManager::_isRegistered = FALSE; + + +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 = NULL; + clz.hbrBackground = NULL; + clz.lpszMenuName = NULL; + clz.lpszClassName = DSPC_CLASS_NAME; + + if (!::RegisterClass(&clz)) + { + systemMessage("System Err"); + throw int(98); + } + _isRegistered = TRUE; + } + + _hSelf = ::CreateWindowEx( + 0, + DSPC_CLASS_NAME, + "", + WS_CHILD | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + _hParent, + NULL, + _hInst, + (LPVOID)this); + + if (!_hSelf) + { + systemMessage("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); + } + + _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; + ::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast(pDockingManager)); + return TRUE; + + default : + pDockingManager = (DockingManager *)::GetWindowLong(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: + { + /* 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]; + } + break; + } + 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]; + } + } + + /* notify client app */ + if (iCont < DOCKCONT_MAX) + SendNotify(data.hClient, MAKELONG(DMN_DOCK, iCont)); + else + SendNotify(data.hClient, MAKELONG(DMN_FLOAT, iCont)); + + /* attach toolbar */ + _vContainer[iCont]->createToolbar(data, _ppMainWindow); +} + +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; + } + + /* remove toolbar from anywhere */ + TbData = _vContainer[iContSrc]->destroyToolbar(TbData); + + 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))); + + 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; + } + + /* remove toolbar from anywhere */ + TbData = _vContainer[iContSrc]->destroyToolbar(TbData); + + 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))); + } + + _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); + + /* remove toolbar from anywhere */ + TbData = _vContainer[iContSrc]->destroyToolbar(TbData); + + /* 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)); + + pContTgt->createToolbar(TbData, _ppMainWindow); +} + +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..89deaf24 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingManager.h @@ -0,0 +1,209 @@ +//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 "SysMsg.h" +#include +#include +#include "SplitterContainer.h" +#include "dockingResource.h" +#include "Parameters.h" + +#define DSPC_CLASS_NAME "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(char* 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); + }; + + 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 ::GetWindowLong(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/DockingManager.h.bak b/PowerEditor/src/WinControls/DockingWnd/DockingManager.h.bak new file mode 100644 index 00000000..261153e5 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingManager.h.bak @@ -0,0 +1,209 @@ +//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 "SysMsg.h" +#include +#include +#include "SplitterContainer.h" +#include "dockingResource.h" +#include "Parameters.h" + +#define DSPC_CLASS_NAME "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(char* 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); + DockingCont* toggleVisTb(DockingCont* pContSrc, UINT message); + 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); + }; + + 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 ::GetWindowLong(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..75ccce7a --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp @@ -0,0 +1,210 @@ +//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" + + +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 = "nsdockspliter"; + } + else + { + // double sided arrow pointing east-west as cursor + wc.hCursor = ::LoadCursor(NULL,IDC_SIZEWE); + wc.lpszClassName = "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("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, "", WS_CHILD | WS_VISIBLE, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + _hParent, NULL, _hInst, (LPVOID)this); + + if (!_hSelf) + { + systemMessage("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; + ::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast(pDockingSplitter)); + return TRUE; + + default : + pDockingSplitter = (DockingSplitter *)::GetWindowLong(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; + + if (GetVersion() & 0x80000000) + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)hookProcMouse, _hInst, 0); + } + else + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)hookProcMouse, _hInst, 0); + } + + if (!hookMouse) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, "GetLastError() returned %lu", dwError); + ::MessageBox(NULL, str, "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.cpp.bak b/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp.bak new file mode 100644 index 00000000..8c7fbe36 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp.bak @@ -0,0 +1,206 @@ +//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" + + +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 = "nsdockspliter"; + } + else + { + // double sided arrow pointing east-west as cursor + wc.hCursor = ::LoadCursor(NULL,IDC_SIZEWE); + wc.lpszClassName = "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("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, "", WS_CHILD | WS_VISIBLE, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + _hParent, NULL, _hInst, (LPVOID)this); + + if (!_hSelf) + { + systemMessage("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; + ::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast(pDockingSplitter)); + return TRUE; + + default : + pDockingSplitter = (DockingSplitter *)::GetWindowLong(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; + + if (GetVersion() & 0x80000000) + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)hookProcMouse, _hInst, 0); + } + else + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)hookProcMouse, _hInst, 0); + } + + if (!hookMouse) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, "GetLastError() returned %lu", dwError); + ::MessageBox(NULL, str, "SetWindowsHookEx(MOUSE) failed", MB_OK | MB_ICONERROR); + } + + ::GetCursorPos(&_ptOldPos); + _isLeftButtonDown = TRUE; + break; + } + case WM_LBUTTONUP: + case WM_NCLBUTTONUP: + { + /* end hooking */ + if (hookMouse) + { + ::UnhookWindowsHookEx(hookMouse); + 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..1f33b646 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.h @@ -0,0 +1,60 @@ +//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 "SysMsg.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 b/PowerEditor/src/WinControls/DockingWnd/DropData.cpp new file mode 100644 index 00000000..bf820039 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DropData.cpp @@ -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..9a576492 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp @@ -0,0 +1,802 @@ +//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 = NULL; + + clz.hbrBackground = NULL; + clz.lpszMenuName = NULL; + clz.lpszClassName = MDLG_CLASS_NAME; + + if (!::RegisterClass(&clz)) + { + systemMessage("System Err"); + throw int(98); + } + _isRegistered = TRUE; + } + + _hSelf = ::CreateWindowEx( + 0, + MDLG_CLASS_NAME, + "", 0, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + NULL, + NULL, + _hInst, + (LPVOID)this); + hWndServer = _hSelf; + + if (!_hSelf) + { + systemMessage("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; + ::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast(pDlgMoving)); + return TRUE; + + default : + pDlgMoving = (Gripper *)::GetWindowLong(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); + + if (GetVersion() & 0x80000000) + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)hookProcMouse, _hInst, 0); + } + else + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)hookProcMouse, _hInst, 0); + } + + if (!hookMouse) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, "GetLastError() returned %lu", dwError); + ::MessageBox(NULL, str, "SetWindowsHookEx(MOUSE) failed", MB_OK | MB_ICONERROR); + } + + winVer winVersion = (winVer)::SendMessage(_hParent, NPPM_GETWINDOWSVERSION, 0, 0); + if (winVersion < WV_VISTA) + { + hookKeyboard = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)hookProcKeyboard, _hInst, 0); + if (!hookKeyboard) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, "GetLastError() returned %lu", dwError); + ::MessageBox(NULL, str, "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); + ClientToScreen(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)) + { + ::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; + char str[128]; + sprintf(str, "Size: %i", vCont.size()); + ::SetWindowText(g_hMainWnd, str); +#endif + + ::UpdateWindow(_hParent); +} + + +void Gripper::drawRectangle(POINT pt) +{ + HANDLE hbrushOrig = NULL; + RECT rc = {0}; + //BOOL isRcTab = FALSE; + //RECT rcTab = {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()) == TRUE) + { + /* 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) == TRUE) + { + 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; + } + ClientToScreen(_dockData.hWnd, &rcCont); + + if (::PtInRect(&rcCont, pt) == TRUE) + { + if (rc != NULL) + { + ClientToScreen(_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 char 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.cpp.bak b/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp.bak new file mode 100644 index 00000000..4c71dbed --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp.bak @@ -0,0 +1,794 @@ +//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); + break; + case WM_LBUTTONUP: + case WM_NCLBUTTONUP: + ::PostMessage(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; + + 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 = NULL; + + clz.hbrBackground = NULL; + clz.lpszMenuName = NULL; + clz.lpszClassName = MDLG_CLASS_NAME; + + if (!::RegisterClass(&clz)) + { + systemMessage("System Err"); + throw int(98); + } + _isRegistered = TRUE; + } + + _hSelf = ::CreateWindowEx( + 0, + MDLG_CLASS_NAME, + "", 0, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + NULL, + NULL, + _hInst, + (LPVOID)this); + hWndServer = _hSelf; + + if (!_hSelf) + { + systemMessage("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; + ::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast(pDlgMoving)); + return TRUE; + + default : + pDlgMoving = (Gripper *)::GetWindowLong(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); + + if (GetVersion() & 0x80000000) + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)hookProcMouse, _hInst, 0); + } + else + { + hookMouse = ::SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)hookProcMouse, _hInst, 0); + } + + if (!hookMouse) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, "GetLastError() returned %lu", dwError); + ::MessageBox(NULL, str, "SetWindowsHookEx(MOUSE) failed", MB_OK | MB_ICONERROR); + } + + hookKeyboard = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)hookProcKeyboard, _hInst, 0); + if (!hookKeyboard) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, "GetLastError() returned %lu", dwError); + ::MessageBox(NULL, str, "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); + ClientToScreen(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)) + { + ::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; + char str[128]; + sprintf(str, "Size: %i", vCont.size()); + ::SetWindowText(g_hMainWnd, str); +#endif + + ::UpdateWindow(_hParent); +} + + +void Gripper::drawRectangle(POINT pt) +{ + HDC hdc = NULL; + HBITMAP hbm = NULL; + HBRUSH hbrush = NULL; + HANDLE hbrushOrig = NULL; + RECT rc = {0}; + BOOL isRcTab = FALSE; + RECT rcTab = {0}; + + + hdc = ::GetDC(NULL); + + /* Determine whether to draw a solid drag rectangle or checkered */ + getMovingRect(pt, &rc); + + /* Create a brush with the appropriate bitmap pattern to draw our drag rectangle */ + hbm = ::CreateBitmap(8, 8, 1, 1, DotPattern); + hbrush = ::CreatePatternBrush(hbm); + + ::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); + ::DeleteObject(hbrush); + ::DeleteObject(hbm); + ::ReleaseDC(0, hdc); +} + + +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()) == TRUE) + { + /* 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) == TRUE) + { + 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; + } + ClientToScreen(_dockData.hWnd, &rcCont); + + if (::PtInRect(&rcCont, pt) == TRUE) + { + if (rc != NULL) + { + ClientToScreen(_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 char 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..ef6964b2 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/Gripper.h @@ -0,0 +1,140 @@ +//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" +#include "sysmsg.h" +#include "common_func.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 "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) { + ClientToScreen(hWnd, rc); + ShrinkRcToSize(rc); + }; + void CalcRectToClient(HWND hWnd, RECT *rc) { + ScreenToClient(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/Gripper.h.bak b/PowerEditor/src/WinControls/DockingWnd/Gripper.h.bak new file mode 100644 index 00000000..516e4141 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/Gripper.h.bak @@ -0,0 +1,126 @@ +//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" +#include "sysmsg.h" +#include "common_func.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 "moveDlg" + + +class Gripper +{ +public: + Gripper(); + + void init(HINSTANCE hInst, HWND hParent) { + _hInst = hInst; + _hParent = hParent; + }; + + void startGrip(DockingCont* pCont, DockingManager* pDockMgr, void* pRes); + + +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) { + ClientToScreen(hWnd, rc); + ShrinkRcToSize(rc); + }; + void CalcRectToClient(HWND hWnd, RECT *rc) { + ScreenToClient(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; + + /* is class registered */ + static BOOL _isRegistered; +}; + + + +#endif // GRIPPER_H \ No newline at end of file diff --git a/PowerEditor/src/WinControls/DockingWnd/RCa02172 b/PowerEditor/src/WinControls/DockingWnd/RCa02172 new file mode 100644 index 0000000000000000000000000000000000000000..d8a1bcbf4031308028a417a379f1a80effb27392 GIT binary patch literal 1694 zcmbu9Z;KL96vof%pzpA_FB8e#42cMw(KX3camKU=WK-KDvshi+pby{gIoCqWM++NrRR$_e{+0bHZv6p0R-)xKBce}yr2}{xe(jC$} z?B+z;a=vrThVRUGW6uzyS);$>yRwaIn(Sxx#r3x~Mn5l*w?WcDyF`0SuB}x(cF7*w zBRfB;;9@UPMKk30c&M_MV3cf5z8$$M_Ss(j#a0{~qZ$%ngXG?GF5LIe%r%eJu_kK@ zYklikY7KDrU}lJ{XptUmV08mz|nPVE{56L4Jfdyid&m5?Y-uoxg2;5pb!#dOfbAn72F z?KR&nk(H^J^Nxu>0Aa@w9>-0nBq6UnMme9<F3nPBXr=Pk0=nR|$(7?$egIx*LkD35uyK0$-1BzLGLF5tF!OWgZdOre1lN zH1(qa4}tX_nv}ip1m@n7BjFc;sYOQBpkFq5nmbu{@e|APE?T7=-Y^yFYU+Jy5MMDh z%NNYF_BB7%JX?k=YZILq;?w+_x><8To*7^765>)a|VOad> z2BfS$oe#{3gG{Tr%Cma~gA@44?p3~?B95!}%vq?zLm5WuUaJ^u`Y!*Dg&t@cLQQ%v zbnEqw1T;lGi9nT7fo@-s{#2$3Tro)-rdx0Ejw!5gE50(7;bs&e2(Q9vtZ@Dx1S7KM Gv;P9mz~(#v literal 0 HcmV?d00001 diff --git a/PowerEditor/src/WinControls/DockingWnd/common_func.cpp b/PowerEditor/src/WinControls/DockingWnd/common_func.cpp new file mode 100644 index 00000000..338a9c94 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/common_func.cpp @@ -0,0 +1,86 @@ +#include "common_func.h" +#include + +using namespace std; + +void ClientToScreen(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; +}; + + +void ScreenToClient(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; +}; + +void folderBrowser(HWND parent, int outputCtrlID) +{ + // 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; + char szDisplayName[MAX_PATH]; + info.pszDisplayName = szDisplayName; + string title = "Select a folder to search from"; + info.lpszTitle = title.c_str(); + info.ulFlags = 0; + info.lpfn = BrowseCallbackProc; + char directory[MAX_PATH]; + ::GetDlgItemText(parent, outputCtrlID, directory, sizeof(directory)); + 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 string. + // Return is true if success. + char szDir[MAX_PATH]; + if (::SHGetPathFromIDList(pidl, szDir)) + // Set edit control to the directory path. + ::SetDlgItemText(parent, outputCtrlID, szDir); + pShellMalloc->Free(pidl); + } + pShellMalloc->Release(); + } +} diff --git a/PowerEditor/src/WinControls/DockingWnd/common_func.cpp.bak b/PowerEditor/src/WinControls/DockingWnd/common_func.cpp.bak new file mode 100644 index 00000000..280fe84f --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/common_func.cpp.bak @@ -0,0 +1,36 @@ +#include "common_func.h" + +void ClientToScreen(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; +}; + + +void ScreenToClient(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; +}; diff --git a/PowerEditor/src/WinControls/DockingWnd/common_func.h b/PowerEditor/src/WinControls/DockingWnd/common_func.h new file mode 100644 index 00000000..70b61ab6 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/common_func.h @@ -0,0 +1,20 @@ +#ifndef COMMON_FUNC_H +#define COMMON_FUNC_H + +#include "windows.h" +// need this header for SHBrowseForFolder +#include + +void ClientToScreen(HWND hWnd, RECT* rect); +void ScreenToClient(HWND hWnd, RECT* rect); +void folderBrowser(HWND parent, int outputCtrlID); + +// 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; +}; +#endif //COMMON_FUNC_H diff --git a/PowerEditor/src/WinControls/DockingWnd/common_func.h.bak b/PowerEditor/src/WinControls/DockingWnd/common_func.h.bak new file mode 100644 index 00000000..b4f6bea6 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/common_func.h.bak @@ -0,0 +1,9 @@ +#ifndef COMMON_FUNC_H +#define COMMON_FUNC_H + +#include "windows.h" + +void ClientToScreen(HWND hWnd, RECT* rect); +void ScreenToClient(HWND hWnd, RECT* rect); + +#endif //COMMON_FUNC_H diff --git a/PowerEditor/src/WinControls/DockingWnd/dockingResource.h b/PowerEditor/src/WinControls/DockingWnd/dockingResource.h new file mode 100644 index 00000000..0781aa0a --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/dockingResource.h @@ -0,0 +1,45 @@ +#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 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..9d87dd0b --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/BabyGrid.cpp @@ -0,0 +1,3262 @@ +//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" + + +#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; + char protect[2]; + char title[305]; + char editstring[305]; + char 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; +char data[1000]; + + + + + + + +CREATESTRUCT cs,*lpcs; + + +int AddGrid(UINT); +int FindGrid(UINT); +void ShowVscroll(HWND,int); +void ShowHscroll(HWND,int); +int BinarySearchListBox(HWND,char*); +void DisplayEditString(HWND ,int ,char*); +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,""); + } + + } + +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(char* 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; + char tbuffer[1000]; + BOOL DIGIT,ALPHA,PERIOD,WHITESPACE,SYMBOL,POSITIVE,NEGATIVE; + strcpy(tbuffer,data); + k=strlen(tbuffer); + strupr(tbuffer); + //is it boolean? + if(!strcmp(tbuffer,"TRUE")) + { + return 3; + } + if(!strcmp(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,"%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); + strcpy(buffer,""); + SendMessage(hWnd,BGM_GETCELLDATA,(WPARAM)&BGcell,(LPARAM)buffer); + if((c==0)&&(BGHS[SI].ROWSNUMBERED)) + { + wsprintf(buffer,"%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 = atoi(buffer); + wParam=MAKEWPARAM((UINT)::GetMenu(hWnd),BGN_OWNERDRAW); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,(LPARAM)&rect); + } + + if(BGHS[SI].EDITING) + { + DisplayEditString(hWnd,SI,""); + } + + 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; + } + + } + + + +char GetASCII(WPARAM wParam, LPARAM lParam) + { + int returnvalue; + char mbuffer[100]; + int result; + BYTE keys[256]; + WORD dwReturnedValue; + GetKeyboardState(keys); + result=ToAscii(wParam,(lParam >> 16) && 0xff,keys,&dwReturnedValue,0); + returnvalue = (char) dwReturnedValue; + if(returnvalue < 0){returnvalue = 0;} + wsprintf(mbuffer,"return value = %d",returnvalue); + if(result!=1){returnvalue = 0;} + return (char)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); + strcpy(BGHS[SI].editstring,""); + RefreshGrid(hWnd); + BGHS[SI].EDITING = FALSE; + HideCaret(hWnd); + NotifyEditEnd(hWnd,SI); + } + +void DisplayEditString(HWND hWnd,int SI,char* 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=strtok('\0',"\n"); + } + + //MessageBox(NULL,text,"FindLongestLine",MB_OK); + return longest; + } + + +LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + int wmId, wmEvent; + PAINTSTRUCT ps; + HDC hdc; + char 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(strlen((char*)lParam)>300) + { + strcpy(BGHS[SelfIndex].title,"Title too long (300 chars max)"); + } + else + { + strcpy(BGHS[SelfIndex].title,(char*)lParam); + } + + gdc=GetDC(hWnd); + //get linecount of title; + if(strlen(BGHS[SelfIndex].title) > 0) + { + linecount=1; + for(j=0;j<(int)strlen(BGHS[SelfIndex].title);j++) + { + if(BGHS[SelfIndex].title[j]=='\n') + { + linecount++; + } + + } + holdfont=(HFONT)SelectObject(gdc,BGHS[SelfIndex].htitlefont); + GetTextExtentPoint32(gdc,BGHS[SelfIndex].title,strlen(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,"%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; + strcat(buffer,"|"); + if((BOOL)lParam) + { + strcat(buffer,"PA"); + } + else + { + strcat(buffer,"UA"); + } + strcat(buffer,"|"); + 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) + { + strcpy(BGHS[SelfIndex].protect,"P"); + } + else + { + strcpy(BGHS[SelfIndex].protect,"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,"%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 + strcat(buffer,"|"); + strcat(buffer,BGHS[SelfIndex].protect); + //determine data type (text,numeric, or boolean)(1,2,3) + //iDataType=DetermineDataType((char*)lParam); + + iDataType = 1; + if(iDataType==1){strcat(buffer,"A");} + if(iDataType==2){strcat(buffer,"N");} + if(iDataType==3){strcat(buffer,"T");} + if(iDataType==4){strcat(buffer,"F");} + if(iDataType==5){strcat(buffer,"G");} + + strcat(buffer,"|"); + strcat(buffer,(char*)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=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 string, find the longest line + longestline=FindLongestLine(hdc,(char*)lParam,&size); + //GetTextExtentPoint32(hdc,(char*)lParam,strlen((char*)lParam),&size); + required_width = longestline+15; + required_height = size.cy; + //count lines + { + int count=1; + char tbuffer[255]; + strcpy(tbuffer,(char*)lParam); + for(int j=0;j<(int)strlen(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,"%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; + char tbuffer[1000]; + //it was found, get it + SendMessage(BGHS[SelfIndex].hlist1,LB_GETTEXT,FindResult,(long)lParam); + strcpy(tbuffer,(char*)lParam); + k=strlen(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,"%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,"%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; + strcpy(BGHS[SelfIndex].editstring,""); + 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; + strcpy(BGHS[SelfIndex].editstring,""); + 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)) + { + char 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(strlen(BGHS[SelfIndex].editstring)==0) + { + DisplayEditString(hWnd,SelfIndex,""); + break; + } + else + { + int j; + j=strlen(BGHS[SelfIndex].editstring); + BGHS[SelfIndex].editstring[j-1]=0x00; + DisplayEditString(hWnd,SelfIndex,""); + } + 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; + strcpy(BGHS[SelfIndex].protect,"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,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,VARIABLE_PITCH|FF_MODERN ,"MS Shell Dlg"); + hfontheader=CreateFont(18,0,0, 0,FW_HEAVY,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,VARIABLE_PITCH|FF_MODERN ,"MS Shell Dlg"); + hfonttitle=CreateFont(20,0,0, 0,FW_HEAVY,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,VARIABLE_PITCH|FF_MODERN ,"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,"LISTBOX","", + 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; + strcpy(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=strcmp(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.cpp.bak b/PowerEditor/src/WinControls/Grid/BabyGrid.cpp.bak new file mode 100644 index 00000000..16dd6fb1 --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/BabyGrid.cpp.bak @@ -0,0 +1,3262 @@ +//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" + + +#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; + char protect[2]; + char title[305]; + char editstring[305]; + char 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; +char data[1000]; + + + + + + + +CREATESTRUCT cs,*lpcs; + + +int AddGrid(UINT); +int FindGrid(UINT); +void ShowVscroll(HWND,int); +void ShowHscroll(HWND,int); +int BinarySearchListBox(HWND,char*); +void DisplayEditString(HWND ,int ,char*); +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,""); + } + + } + +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(char* 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; + char tbuffer[1000]; + BOOL DIGIT,ALPHA,PERIOD,WHITESPACE,SYMBOL,POSITIVE,NEGATIVE; + strcpy(tbuffer,data); + k=strlen(tbuffer); + strupr(tbuffer); + //is it boolean? + if(!strcmp(tbuffer,"TRUE")) + { + return 3; + } + if(!strcmp(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,"%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); + strcpy(buffer,""); + SendMessage(hWnd,BGM_GETCELLDATA,(WPARAM)&BGcell,(LPARAM)buffer); + if((c==0)&&(BGHS[SI].ROWSNUMBERED)) + { + wsprintf(buffer,"%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 = atoi(buffer); + wParam=MAKEWPARAM((UINT)::GetMenu(hWnd),BGN_OWNERDRAW); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,(LPARAM)&rect); + } + + if(BGHS[SI].EDITING) + { + DisplayEditString(hWnd,SI,""); + } + + 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; + } + + } + + + +char GetASCII(WPARAM wParam, LPARAM lParam) + { + int returnvalue; + char mbuffer[100]; + int result; + BYTE keys[256]; + WORD dwReturnedValue; + GetKeyboardState(keys); + result=ToAscii(wParam,(lParam >> 16) && 0xff,keys,&dwReturnedValue,0); + returnvalue = (char) dwReturnedValue; + if(returnvalue < 0){returnvalue = 0;} + wsprintf(mbuffer,"return value = %d",returnvalue); + if(result!=1){returnvalue = 0;} + return (char)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); + strcpy(BGHS[SI].editstring,""); + RefreshGrid(hWnd); + BGHS[SI].EDITING = FALSE; + HideCaret(hWnd); + NotifyEditEnd(hWnd,SI); + } + +void DisplayEditString(HWND hWnd,int SI,char* 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=strtok('\0',"\n"); + } + + //MessageBox(NULL,text,"FindLongestLine",MB_OK); + return longest; + } + + +LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + int wmId, wmEvent; + PAINTSTRUCT ps; + HDC hdc; + char 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(strlen((char*)lParam)>300) + { + strcpy(BGHS[SelfIndex].title,"Title too long (300 chars max)"); + } + else + { + strcpy(BGHS[SelfIndex].title,(char*)lParam); + } + + gdc=GetDC(hWnd); + //get linecount of title; + if(strlen(BGHS[SelfIndex].title) > 0) + { + linecount=1; + for(j=0;j<(int)strlen(BGHS[SelfIndex].title);j++) + { + if(BGHS[SelfIndex].title[j]=='\n') + { + linecount++; + } + + } + holdfont=(HFONT)SelectObject(gdc,BGHS[SelfIndex].htitlefont); + GetTextExtentPoint32(gdc,BGHS[SelfIndex].title,strlen(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,"%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; + strcat(buffer,"|"); + if((BOOL)lParam) + { + strcat(buffer,"PA"); + } + else + { + strcat(buffer,"UA"); + } + strcat(buffer,"|"); + 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) + { + strcpy(BGHS[SelfIndex].protect,"P"); + } + else + { + strcpy(BGHS[SelfIndex].protect,"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,"%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 + strcat(buffer,"|"); + strcat(buffer,BGHS[SelfIndex].protect); + //determine data type (text,numeric, or boolean)(1,2,3) + //iDataType=DetermineDataType((char*)lParam); + + iDataType = 1; + if(iDataType==1){strcat(buffer,"A");} + if(iDataType==2){strcat(buffer,"N");} + if(iDataType==3){strcat(buffer,"T");} + if(iDataType==4){strcat(buffer,"F");} + if(iDataType==5){strcat(buffer,"G");} + + strcat(buffer,"|"); + strcat(buffer,(char*)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=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 string, find the longest line + longestline=FindLongestLine(hdc,(char*)lParam,&size); + //GetTextExtentPoint32(hdc,(char*)lParam,strlen((char*)lParam),&size); + required_width = longestline+15; + required_height = size.cy; + //count lines + { + int count=1; + char tbuffer[255]; + strcpy(tbuffer,(char*)lParam); + for(int j=0;j<(int)strlen(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,"%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; + char tbuffer[1000]; + //it was found, get it + SendMessage(BGHS[SelfIndex].hlist1,LB_GETTEXT,FindResult,(long)lParam); + strcpy(tbuffer,(char*)lParam); + k=strlen(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,"%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,"%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; + strcpy(BGHS[SelfIndex].editstring,""); + 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; + strcpy(BGHS[SelfIndex].editstring,""); + 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)) + { + char 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(strlen(BGHS[SelfIndex].editstring)==0) + { + DisplayEditString(hWnd,SelfIndex,""); + break; + } + else + { + int j; + j=strlen(BGHS[SelfIndex].editstring); + BGHS[SelfIndex].editstring[j-1]=0x00; + DisplayEditString(hWnd,SelfIndex,""); + } + 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; + strcpy(BGHS[SelfIndex].protect,"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,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,VARIABLE_PITCH|FF_MODERN ,NULL); + hfontheader=CreateFont(18,0,0, 0,FW_HEAVY,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,VARIABLE_PITCH|FF_MODERN ,NULL); + hfonttitle=CreateFont(20,0,0, 0,FW_HEAVY,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,VARIABLE_PITCH|FF_MODERN ,NULL); + } + + + 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,"LISTBOX","", + 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; + strcpy(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=strcmp(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..6ff03dfa --- /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 char *babyGridClassName = "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,\ + "",\ + 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..9e414480 --- /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 char *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 *)(::GetWindowLong(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..bf7b61ad --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/ShortcutMapper.cpp @@ -0,0 +1,359 @@ +/* +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::initBabyGrid() { + RECT rect; + getClientRect(rect); + + _babygrid.init(_hInst, _hSelf, IDD_BABYGRID_ID1); + _babygrid.reSizeTo(rect); + _babygrid.hideCursor(); + _babygrid.makeColAutoWidth(); + _babygrid.setColsNumbered(false); + _babygrid.setColWidth(0, 30); + _babygrid.setColWidth(1, 250); +} + +void ShortcutMapper::fillOutBabyGrid() +{ + NppParameters *nppParam = NppParameters::getInstance(); + vector &skms = nppParam->getScintillaKeyList(); + int nbScitillaMsg = skms.size(); + _pAccel = nppParam->getAccelerator(); + _babygrid.setLineColNumber(_pAccel->_nbAccelItems + nbScitillaMsg, 2); + _babygrid.setText(0, 1, "Name"); + _babygrid.setText(0, 2, "Shortcut"); + + int i = 0 ; + for ( ; i < _pAccel->_nbAccelItems ; i++) + { + unsigned char vFlg = _pAccel->_pAccelArray[i].fVirt; + string shortcut = (vFlg & FCONTROL)?"Ctrl+":""; + shortcut += (vFlg & FALT)?"Alt+":""; + shortcut += (vFlg & FSHIFT)?"Shift+":""; + string key; + getKeyStrFromVal((unsigned char)_pAccel->_pAccelArray[i].key, key); + shortcut += key; + _babygrid.setText(i+1, 2, shortcut.c_str()); + + string shortcutName; + getNameStrFromCmd(_pAccel->_pAccelArray[i].cmd, shortcutName); + _babygrid.setText(i+1, 1, shortcutName.c_str()); + } + + for (size_t j = 0 ; i < _pAccel->_nbAccelItems + nbScitillaMsg ; i++, j++) + { + _babygrid.setText(i+1, 1, skms[j]._name); + _babygrid.setText(i+1, 2, skms[j].toString().c_str()); + } +} + +BOOL CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + initBabyGrid(); + fillOutBabyGrid(); + _babygrid.display(); + goToCenter(); + return TRUE; + } + + case WM_COMMAND : + { + switch (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(); + + if (row <= _pAccel->_nbAccelItems) + { + ACCEL accel = _pAccel->_pAccelArray[row-1]; + string shortcutName; + DWORD cmdID = _pAccel->_pAccelArray[row-1].cmd; + ShortcutType st = getNameStrFromCmd(cmdID, shortcutName); + + Shortcut shortcut(shortcutName.c_str(), (accel.fVirt & FCONTROL) != 0, (accel.fVirt & FALT) != 0, (accel.fVirt & FSHIFT) != 0, (unsigned char)accel.key); + shortcut.init(_hInst, _hSelf); + shortcut.setNameReadOnly((st != TYPE_CMD) && (st != TYPE_PLUGINCMD)); + + Shortcut oldSc = shortcut; + + if ((shortcut.doDialog() != -1) && (oldSc != shortcut)) + { + // Update the key map + _pAccel->_pAccelArray[row-1].fVirt = FVIRTKEY | (shortcut._isCtrl?FCONTROL:0) | (shortcut._isAlt?FALT:0) | (shortcut._isShift?FSHIFT:0); + _pAccel->_pAccelArray[row-1].key = shortcut._key; + _pAccel->reNew(); + + // Update the GUI + string sc = shortcut.toString(); + _babygrid.setText(row, 2, sc.c_str()); + + // Add (or update) shortcut to vector in order to save what we have done + if (st == TYPE_CMD) + { + int index = -1; + vector & shortcutList = nppParam->getUserShortcuts(); + + for (size_t i = 0 ; i < shortcutList.size() ; i++) + { + if (cmdID == shortcutList[i].getID()) + { + index = i; + break; + } + } + + if (index != -1) + shortcutList[index].copyShortcut(shortcut); + else + shortcutList.push_back(CommandShortcut(cmdID, shortcut)); + + ::SendMessage(_hParent, NPPM_INTERNAL_CMDLIST_MODIFIED, (WPARAM)sc.c_str(), cmdID); + } + else if (st == TYPE_MACRO) + { + vector & theMacros = nppParam->getMacroList(); + const int i = cmdID - ID_MACRO; + theMacros[i].copyShortcut(shortcut); + + HMENU hMenu = ::GetSubMenu(::GetMenu(_hParent), MENUINDEX_MACRO); + ::ModifyMenu(hMenu, cmdID, MF_BYCOMMAND, cmdID, theMacros[i].toMenuItemString().c_str()); + + ::SendMessage(_hParent, NPPM_INTERNAL_MACROLIST_MODIFIED, 0, 0); + } + else if (st == TYPE_USERCMD) + { + vector & theUserCmds = nppParam->getUserCommandList(); + const int i = cmdID - ID_USER_CMD; + theUserCmds[i].copyShortcut(shortcut); + + HMENU hMenu = ::GetSubMenu(::GetMenu(_hParent), MENUINDEX_RUN); + ::ModifyMenu(hMenu, cmdID, MF_BYCOMMAND, cmdID, theUserCmds[i].toMenuItemString().c_str()); + + ::SendMessage(_hParent, NPPM_INTERNAL_USERCMDLIST_MODIFIED, 0, 0); + } + + else if (st == TYPE_PLUGINCMD) + { + vector & thePluginCmds = (NppParameters::getInstance())->getPluginCommandList(); + int i = -1; + for (size_t j = 0 ; j < thePluginCmds.size() ; j++) + { + if (cmdID == thePluginCmds[j].getID()) + { + i = j; + break; + } + } + + thePluginCmds[i].copyShortcut(shortcut); + + HMENU hMenu = ::GetMenu(_hParent); + ::ModifyMenu(hMenu, cmdID, MF_BYCOMMAND, cmdID, thePluginCmds[i].toMenuItemString().c_str()); + + vector & theModifyedPluginCmds = (NppParameters::getInstance())->getPluginCustomizedCmds(); + + int k = -1; + for (size_t j = 0 ; j < theModifyedPluginCmds.size() ; j++) + { + if (cmdID == theModifyedPluginCmds[j].getID()) + { + k = j; + break; + } + } + if (k != -1) + theModifyedPluginCmds[k].copyShortcut(thePluginCmds[i]); + else + theModifyedPluginCmds.push_back(thePluginCmds[i]); + + ::SendMessage(_hParent, NPPM_INTERNAL_PLUGINCMDLIST_MODIFIED, 0, 0); + } + _babygrid.setText(row, 1, shortcut._name); + } + } + else // Scintilla Key shortcut + { + vector & scintillaShortcuts = nppParam->getScintillaKeyList(); + const int index = row - _pAccel->_nbAccelItems - 1; + ScintillaKeyMap scintillaSc = scintillaShortcuts[index]; + scintillaSc.init(_hInst, _hSelf); + scintillaSc.setNameReadOnly(false); + + if (scintillaSc.doDialog() != -1) + { + // Add this modification into the list to save it later + bool found = false; + vector & userDefScintillaKeys = nppParam->getScintillaModifiedKeys(); + for (size_t i = 0 ; i < userDefScintillaKeys.size() ; i++) + { + if (scintillaSc.getID() == userDefScintillaKeys[i].getID()) + { + userDefScintillaKeys[i].copyShortcut(scintillaSc); + found = true; + } + } + if (!found) + userDefScintillaKeys.push_back(scintillaSc); + + // remap the key + ::SendMessage(_hParent, NPPM_INTERNAL_BINDSCINTILLAKEY, scintillaSc.toKeyDef(), scintillaSc.getScintillaKey()); + ::SendMessage(_hParent, NPPM_INTERNAL_CLEARSCINTILLAKEY, scintillaShortcuts[index].toKeyDef(), 0); + + // update the key in the scintilla key list + scintillaShortcuts[index].copyShortcut(scintillaSc); + + // if this shortcut is linked to a menu item, change to shortcut string in menu item + if (int cmdID = scintillaShortcuts[index].getMenuCmdID()) + { + HMENU hMenu = ::GetMenu(_hParent); + ::ModifyMenu(hMenu, cmdID, MF_BYCOMMAND, cmdID, scintillaShortcuts[index].toMenuItemString(cmdID).c_str()); + } + + // Update UI + _babygrid.setText(row, 2, scintillaSc.toString().c_str()); + + ::SendMessage(_hParent, NPPM_INTERNAL_SCINTILLAKEYMODIFIED, 0, 0); + } + } + return TRUE; + } + case IDM_BABYGRID_DELETE : + { + NppParameters *nppParam = NppParameters::getInstance(); + if (::MessageBox(_hSelf, "Are you sure to delete this shortcut?", "Are you sure?", MB_OKCANCEL) == IDOK) + { + const int row = _babygrid.getSelectedRow(); + DWORD cmdID = _pAccel->_pAccelArray[row-1].cmd; + + // Menu data + int erasePos; + size_t posBase; + size_t nbElem; + HMENU hMenu; + + if ((cmdID >= ID_MACRO) && (cmdID < ID_MACRO_LIMIT)) + { + vector & theMacros = nppParam->getMacroList(); + vector::iterator it = theMacros.begin(); + erasePos = cmdID - ID_MACRO; + theMacros.erase(it + erasePos); + _pAccel->uptdateShortcuts(); + _babygrid.clear(); + fillOutBabyGrid(); + + // preparing to remove from menu + posBase = 3; + nbElem = theMacros.size(); + hMenu = ::GetSubMenu(::GetMenu(_hParent), MENUINDEX_MACRO); + + ::SendMessage(_hParent, NPPM_INTERNAL_MACROLIST_MODIFIED, 0, 0); + } + else if ((cmdID >= ID_USER_CMD) && (cmdID < ID_USER_CMD_LIMIT)) + { + vector & theUserCmds = nppParam->getUserCommandList(); + vector::iterator it = theUserCmds.begin(); + erasePos = cmdID - ID_USER_CMD; + theUserCmds.erase(it + erasePos); + _pAccel->uptdateShortcuts(); + _babygrid.clear(); + fillOutBabyGrid(); + + // preparing to remove from menu + posBase = 0; + nbElem = theUserCmds.size(); + hMenu = ::GetSubMenu(::GetMenu(_hParent), MENUINDEX_RUN); + + ::SendMessage(_hParent, NPPM_INTERNAL_USERCMDLIST_MODIFIED, 0, 0); + } + else // should never happen + { + return FALSE; + } + + // remove from menu + ::RemoveMenu(hMenu, cmdID++, MF_BYCOMMAND); + + for (size_t i = erasePos ; i < nbElem ; i++) + { + char cmdName[64]; + ::GetMenuString(hMenu, cmdID, cmdName, sizeof(cmdName), MF_BYCOMMAND); + ::ModifyMenu(hMenu, cmdID, MF_BYCOMMAND, cmdID-1, cmdName); + cmdID++; + } + if (nbElem == 0) + ::RemoveMenu(hMenu, posBase + 1, MF_BYPOSITION); + + } + return TRUE; + } + default : + if (LOWORD(wParam) == 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 + { + int row = LOWORD(lParam); + DWORD cmdID = _pAccel->_pAccelArray[row-1].cmd; + + POINT p; + ::GetCursorPos(&p); + if (!_rightClickMenu.isCreated()) + { + vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_MODIFY, "Modify")); + itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_DELETE, "Delete")); + _rightClickMenu.create(_hSelf, itemUnitArray); + } + bool b = (!((cmdID >= ID_MACRO) && (cmdID < ID_MACRO_LIMIT))) && (!((cmdID >= ID_USER_CMD) && (cmdID < ID_USER_CMD_LIMIT))); + _rightClickMenu.enableItem(IDM_BABYGRID_DELETE, !b); + _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..b9298c1a --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/ShortcutMapper.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 SHORTCUTMAPPER +#define SHORTCUTMAPPER + +#include "BabyGridWrapper.h" +#include "ShortcutMapper_rc.h" +#include "shortcut.h" +#include "ContextMenu.h" + +class ShortcutMapper : public StaticDialog { +public: + ShortcutMapper() : StaticDialog() {}; + ~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.bottom -= 20; + }; + +protected : + BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + +private: + BabyGridWrapper _babygrid; + Accelerator *_pAccel; + ContextMenu _rightClickMenu; + + 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..2606d27d --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/ShortcutMapper.rc @@ -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. +*/ + + +#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, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Close",IDOK,172,319,47,14 +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..6db79f13 --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/ShortcutMapper_rc.h @@ -0,0 +1,23 @@ +/* +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) diff --git a/PowerEditor/src/WinControls/ImageListSet/ImageListSet.cpp b/PowerEditor/src/WinControls/ImageListSet/ImageListSet.cpp new file mode 100644 index 00000000..d3390049 --- /dev/null +++ b/PowerEditor/src/WinControls/ImageListSet/ImageListSet.cpp @@ -0,0 +1,70 @@ +//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]); +} + +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); + + for (size_t i = 0 ; i < _tbiis.size() ; i++) + { + _cmdArray[_nbCmd++] = _tbiis[i]._cmdID; + if (_tbiis[i]._defaultIcon != IDI_SEPARATOR_ICON) + { + _iconListVector[HLIST_DEFAULT].addIcon(_tbiis[i]._defaultIcon); + _iconListVector[HLIST_HOT].addIcon(_tbiis[i]._hotIcon); + _iconListVector[HLIST_DISABLE].addIcon(_tbiis[i]._grayIcon); + //_iconListVector[HLIST_UGLY].addImage(_tbiis[i]._uglyIcon); + } + } +} + +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 char *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..3cde5a64 --- /dev/null +++ b/PowerEditor/src/WinControls/ImageListSet/ImageListSet.h @@ -0,0 +1,203 @@ +//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) {_iconSize = iconSize; + _hInst = hInst; + InitCommonControls(); + _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)); + //HBITMAP hBmp = (HBITMAP)::LoadImage(_hInst, MAKEINTRESOURCE(iconID), IMAGE_ICON, _iconSize, _iconSize, LR_LOADMAP3DCOLORS); + if (!hIcon) + throw int(26); + ImageList_AddIcon(_hImglst, hIcon); + //ImageList_AddMasked(_hImglst, (HBITMAP)hBmp, RGB(0, 0, 0)); + ::DeleteObject(hIcon); + //::DeleteObject(hBmp); + }; + + bool changeIcon(int index, const char *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); + }; +/* + bool changeIcon(int index, const char *iconLocation, int size) const{ + HBITMAP hBmp = (HBITMAP)::LoadImage(_hInst, iconLocation, IMAGE_ICON, size, size, LR_LOADFROMFILE | LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT); + if (!hBmp) + return false; + int i = ImageList_ReplaceIcon(_hImglst, index, (HICON)hBmp); + ::DeleteObject(hBmp); + return (i == index); + };*/ + +/* + void addImage(int iconID) const { + HBITMAP hBmp = ::LoadBitmap(_hInst, MAKEINTRESOURCE("STD_FILEOPEN")); + //HBITMAP hBmp = (HBITMAP)::LoadImage(_hInst, MAKEINTRESOURCE(iconID), IMAGE_ICON, _iconSize, _iconSize, LR_LOADMAP3DCOLORS); + ImageList_Add(_hImglst, hBmp, NULL); + ::DeleteObject(hBmp); + }; +*/ + 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 _uglyIcon; +}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 getUglyIconAt(int i) const { + return _tbiis[i]._uglyIcon; + }; + + bool replaceIcon(int witchList, int iconIndex, const char *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..f4021c21 --- /dev/null +++ b/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.cpp @@ -0,0 +1,201 @@ +//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; + +FileDialog::FileDialog(HWND hwnd, HINSTANCE hInst) + : _nbCharFileExt(0), _nbExt(0) +{//staticThis = this; + for (int i = 0 ; i < nbExtMax ; i++) + _extArray[i][0] = '\0'; + + memset(_fileExt, 0x00, sizeof(_fileExt)); + _fileName[0] = '\0'; + + _ofn.lStructSize = sizeof(_ofn); + _ofn.hwndOwner = hwnd; + _ofn.hInstance = hInst; + _ofn.lpstrFilter = _fileExt; + _ofn.lpstrCustomFilter = (LPTSTR) NULL; + _ofn.nMaxCustFilter = 0L; + _ofn.nFilterIndex = 1L; + _ofn.lpstrFile = _fileName; + _ofn.nMaxFile = sizeof(_fileName); + _ofn.lpstrFileTitle = NULL; + _ofn.nMaxFileTitle = 0; + _ofn.lpstrInitialDir = NULL; + _ofn.lpstrTitle = NULL; + _ofn.nFileOffset = 0; + _ofn.nFileExtension = 0; + _ofn.lpstrDefExt = NULL; // No default extension + _ofn.lCustData = 0; + _ofn.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_LONGNAMES | DS_CENTER | OFN_HIDEREADONLY; + +} + +// 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("c/c++ src file", ".c", ".cpp", ".cxx", ".h", NULL); +// FileDialog.setExtFilter("Makeile", "makefile", "GNUmakefile", NULL); +void FileDialog::setExtFilter(const char *extText, const char *ext, ...) +{ + // fill out the ext array for save as file dialog + if (_nbExt < nbExtMax) + strcpy(_extArray[_nbExt++], ext); + // + std::string extFilter = extText; + + va_list pArg; + va_start(pArg, ext); + + std::string exts; + + if (ext[0] == '.') + exts += "*"; + exts += ext; + exts += ";"; + + const char *ext2Concat; + + while ((ext2Concat = va_arg(pArg, const char *))) + { + if (ext2Concat[0] == '.') + exts += "*"; + exts += ext2Concat; + exts += ";"; + } + va_end(pArg); + + // remove the last ';' + exts = exts.substr(0, exts.length()-1); + + extFilter += " ("; + extFilter += exts + ")"; + + char *pFileExt = _fileExt + _nbCharFileExt; + memcpy(pFileExt, extFilter.c_str(), extFilter.length() + 1); + _nbCharFileExt += extFilter.length() + 1; + + pFileExt = _fileExt + _nbCharFileExt; + memcpy(pFileExt, exts.c_str(), exts.length() + 1); + _nbCharFileExt += exts.length() + 1; +} + +char * FileDialog::doOpenSingleFileDlg() +{ + char dir[MAX_PATH]; + ::GetCurrentDirectory(sizeof(dir), dir); + _ofn.lpstrInitialDir = dir; + + _ofn.Flags |= OFN_FILEMUSTEXIST; + + char *fn = NULL; + try { + fn = ::GetOpenFileName(&_ofn)?_fileName:NULL; + } + catch(...) { + ::MessageBox(NULL, "GetSaveFileName crashes!!!", "", MB_OK); + } + return (fn); +} + +stringVector * FileDialog::doOpenMultiFilesDlg() +{ + char dir[MAX_PATH]; + ::GetCurrentDirectory(sizeof(dir), dir); + _ofn.lpstrInitialDir = dir; + + _ofn.Flags |= OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT; + + if (::GetOpenFileName(&_ofn)) + { + //if (isReadOnly()) + //::MessageBox(NULL, "read only", "", MB_OK); + + char fn[MAX_PATH]; + char *pFn = _fileName + strlen(_fileName) + 1; + if (!(*pFn)) + _fileNames.push_back(std::string(_fileName)); + else + { + strcpy(fn, _fileName); + if (fn[strlen(fn)-1] != '\\') + strcat(fn, "\\"); + } + int term = int(strlen(fn)); + + while (*pFn) + { + fn[term] = '\0'; + strcat(fn, pFn); + _fileNames.push_back(std::string(fn)); + pFn += strlen(pFn) + 1; + } + + return &_fileNames; + } + else + return NULL; +} + +char * FileDialog::doSaveDlg() +{ + char dir[MAX_PATH]; + ::GetCurrentDirectory(sizeof(dir), dir); + _ofn.lpstrInitialDir = dir; + + _ofn.Flags |= OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; + + char *fn = NULL; + try { + fn = ::GetSaveFileName(&_ofn)?_fileName:NULL; + } + catch(...) { + ::MessageBox(NULL, "GetSaveFileName crashes!!!", "", MB_OK); + } + return (fn); +} + +/* +UINT_PTR CALLBACK FileDialog::OFNHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG : + { + ::SetWindowLong(hWnd, GWL_USERDATA, (long)staticThis); + //pStaticDlg->run_dlgProc(message, wParam, lParam); + return TRUE; + } + + default : + { + FileDialog *pFileDialog = reinterpret_cast(::GetWindowLong(hWnd, GWL_USERDATA)); + if (!pFileDialog) + return FALSE; + return pFileDialog->run(hWnd, uMsg, wParam, lParam); + } + } + //::OFNHookProc(hWnd, uMsg, wParam, lParam); + return FALSE; +} +*/ diff --git a/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.h b/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.h new file mode 100644 index 00000000..97c0490c --- /dev/null +++ b/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.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 FILE_DIALOG_H +#define FILE_DIALOG_H + +#include +#include +//#include + +#include +#include + +const int nbExtMax = 10; +const int extLenMax = 10; + +typedef std::vector stringVector; +//const bool styleOpen = true; +//const bool styleSave = false; + +class FileDialog +{ +public: + FileDialog(HWND hwnd, HINSTANCE hInst); + void setExtFilter(const char *, const char *, ...); + void setDefFileName(const char *fn){strcpy(_fileName, fn);} + + char * doSaveDlg(); + stringVector * doOpenMultiFilesDlg(); + char * doOpenSingleFileDlg(); + bool isReadOnly() {return _ofn.Flags & OFN_READONLY;}; +/* +protected : + static UINT APIENTRY OFNHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + BOOL APIENTRY run(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + switch (uMsg) + { + case WM_NOTIFY : + { + LPNMHDR pNmhdr = (LPNMHDR)lParam; + switch(pNmhdr->code) + { + case CDN_FILEOK : + { + if ((_fileName)&&(!strrchr(_extArray[_ofn.nFilterIndex - 1], '*')) + && (strcmp(_extArray[_ofn.nFilterIndex - 1], _fileName + _ofn.nFileExtension - 1))) + { + strcat(_fileName, _extArray[_ofn.nFilterIndex - 1]); + } + } + + default : + return FALSE; + } + return TRUE; + } + default : + return FALSE; + } + }; +*/ +private: + char _fileName[MAX_PATH*8]; + + char _fileExt[MAX_PATH*2]; + int _nbCharFileExt; + //bool _isMultiSel; + + stringVector _fileNames; + OPENFILENAME _ofn; + + char _extArray[nbExtMax][extLenMax]; + int _nbExt; + + static FileDialog *staticThis; +}; + +#endif //FILE_DIALOG_H diff --git a/PowerEditor/src/WinControls/Preference/RCa02240 b/PowerEditor/src/WinControls/Preference/RCa02240 new file mode 100644 index 0000000000000000000000000000000000000000..e9c6f1d689b87c170158e51f691d90fddab3c50a GIT binary patch literal 23084 zcmeI4X-^!<9me~0q6CR`|kOwxG3HgSH)S;D`twR;~)O8<i!d{_r4KNP>{%6G-jT8rzy*4b~0C&gpEp6c^zz@%4fh(^8QNBy0KGjH|( zFWTiocR`V>;*ri=Yn@*4=R0uEhBN!O@PhMuU3;w+E_Fx50!o0zjlMnC%AW%sXT_g% z?iZc=r1uk@yV5(?!i5`M2L{Lb7FbvfOt|V)v;r!yz0?ucpKGOf&8Kh;@b`4j+i zxeRnQ_2M_rix-lUUh!PlAw@ucq0c+o`8aUtM4$TF1KwU~g|o2pQCRE4?Nv8nr&C>f z9AJs-uWLo)zc++`uUHS*gVB*7eWy=XfhuPKTOc=<{|HAngDZOCWR!upOBufD@ICl{ z9afHX<_yvi_xeVkp(wPw2v?eF<^3Mr;rxu`2&6i#&P)mQ=tC2Xns*l2M8=5z2czQ6g0^5OTG7sC2{qQ-Vb!Ns~4a5bq1MZRp^G~ zvDaAvzBxqiBv&7_$2*+|UP~;Jf&N1+WC#ju$!cI@HU>K^70ZI8AE04>yRxx znLTvXb-m(yVeYHZL)&wI&Uc;<*RaB>cG{7CtcfG&-f7#ByHN3 zj;w_xwR?DyV3fK|+5Lg3m4vp94?4efJ)~g@v-3#r%t)qN3UxhV{ z-vT8xVC7*brUVlfpd7#44CEzYz7S|NC7A}-JxRuyB<@1TtNQ=5u1C6a3O_Es40yV% zy`KkofB?I;Cu_N^_x*qk)JU%>!H9O_Wmz@KOMd;Ku7R^y#%b;HOdRBWA-q2eoaL-( z2^~1f?b*`-&zock%iLb39uH)Sy)COb7m*e8V;q^nzu;Aj$t3vlT$tiJcWyN(@r0u( z@#?)^@cdX-?7GCAD3!~Sawzs(tCVd4{FxD#ux?m6ju-Sktt+7m+KZN<&6ZSa9Z>Z% z`G`P7@dVCc$BYI?abSp`9+8Ju$2l{#u39$CGt{sLPIJ!XpENCUP2aEQw zFAHM)Yct%$JLvbr!8|+A=f?wSv8U@sZ}JD{3dpKs&SnnayRa8X@#=%ne_rxq*|+2y zmp0mVBt5IvHDb)sn)WPE&O1iyNPJPJZMkinm6Wv8z+GwIsWgj-FPCbp)tcntCut$R zc~yFbez%k7ba(XS_+9%z_=EIgZ*~G*X9w0E4~2Bc_jVZcrIRPc-?jeN;yZERs-)#8 zNIrgvPsFa@)Z&L90@KOi_B2>YY-TqNHYT5iMT~8U!H$G4*`MQebmVx*CMEhG3V$q= zqlqQqNnH18qMUp-;NbnSCAYx>5M@IH_*kV+IllG|~BVmgFuC%074;{1?ZR0-|p+ zJK}Kk_oMK;(Whk{m!q--710H?5v-{5Goo<&kV(k7eIC_DNHV%?!M7#L%2(&%3$ToMIF39-VuE#cr^} z!2kao%sCkKCu(l4(vn?Jn@1|p3M!NMhTO`nhn&4GBO_X(>SQlOMPyzta(PR8_pEGB z(71M5hNGP6YznHK;BVSUWV$!c&+@8Ail@N`3>-DhcFZ7_L{B2V&m|hB{n3A_$yn0y zA&0((vZt8N^}e}aBk5qZwUR5MG<7;h16V(*!#VGBxL2fa)T#0D?0?szMV?0sm+sD~ zp2I#jsCUc>8_u_feOWaAqC0Y^Qw=fg9QFR8AYKTvPK_3s?*j3vsC^T90!M>xNvvpI zh4_O01fD3@$@++kNP}(w6~8U%8dZ;E@!DbA#RGvUQI;{bhEox^FBOi($M=f8j5RUX zF#c8XCLVKJah5TT@6;&U=u{WHjrEM=(;j%XV)lbZ;V+S4bfFSxdYp%_aosgw59YFp@mj`P>_r4zbWl?n$^ofQ| zUMoUB7vymhT2sV@b=}tSYwfid^ordU!~U*wuMDgwbt@`_?vK6DDw|q2_V8Rwd=++b z^}a8->Z**$SY98c3&6SR>;`D~c64^*E)W<}Yl=}$bJz0M-eGdhn>mMSTN~@Y)Tt8n zsx2?}$raO?AnCSS$zpW3y41Uw3c-?5d-9wQQK8S|8j?o>XgS#q71T9JC>>*_KKS(T zQGokZF$Rb=n6@#1t0!cW?}~p0EPoKDIcAXuo5f!R|FHj^3EF7CJDYjmuKvEf%PUc< ze`l}xY_D#fp57t(GBsl6Qr7j^c~rgZVVm7~*cAus{JrBH%blZ5B+jxoZca_b^Q!oR z;HA1r@7?uIPf8(=_*1?iqayzPOv545#bgqn-JDqp4!~1w1#|=>;<9l0)+!B7| zisd}ZGm?peX;!ivp^{^~7RJlsG5(}VV(Hf75s4My7Tr=Jo$(^oyE|4(?-NOHoLgXb zN3HDN98KjF(p)zaR}XLTjgb)%AaRAeIPLq(Y0Vfn*Llj=E1wrO(L=Y7v9=_+S3!EC z<#9d#MjA@yL9Kw?yAI#2;7y-MN3pN;<(G8y@b=ZR5oKgXvePXR#*3h#DbtGmx#75y z85kzWJQteg_K5ty1Z$A%K6F8PQcP9u!ZKkLYYoI7dwMY`Q9WnSM&H@3t}p9+`$^C# zJd!&B*7@d4EVsvbk0VvW$r_m7b6g(hI&%D@zSqnDUEc*K?X}=CFuPViuH}BI*ub;B z#0zi|FGDBlVuU0!g~JR2+6s@bTG;IVMC94=f@h~3RY#p|=2Oh-J_*mBWGPJ+=UPgi ziM|?mjrN<7_V%2nJv<$k{`BTqJ6;x4FML|#OjZt;1{F>q}Rzv5ZGrnsXG2Nr|x zUL5#zbD%m`^Grpw8TB)zRJIO6E=jMjoO?u{*fekY>(1QhOI^#O5s~H+%cP?*}1A2 zPI|Pp1201a^kpREF9o-2AmeI_Aq0BQ%BFcc&NW*rBJz`wFcJe(8M+^YrXDc4JJ#MW z5g${zW|DlkUW+XNM>N*emvS`=+vm94F^glD`^~B{Rfx5&lgRk}xD*>Dk9a0@$~EX{ z;oD0j6Y$^5tEFcxsNa%{V*9pgabmuEUH9=E1K9iODh%Op8?AGe1TL0fVl;BLC>PC= zYnZ^MjuR2;Dmc5rX#K*nxj)(kO8m?dQTSN$%M>m#BeKjqTRr5y%k#KZ@OP(kvR_br z91L!PSMUsU7c9~=^uu7{o(mW_GqLJ0u5e~{s>74zyn%`e+9&&9@BUg5sZy~yhy@`lxxkHksBI0$2AsdYInya@mM&?T0(RMygS5lvt)-|?W+Ff$*JbgGbEn3iBS0Y4eC9^a16^(JtW8!UTheaI$On4oXxh1 zrx2}Czl|aUyf8gFD(a+%3oa+iUauv@IMshBEG_tZfP zhvOX2_^=vIAm$liGT!K&IoC|tWoe`DqSJ= zGd0HpsLQh-o-87lC{L~DQi8u?2IL_yh_%hKe5B01+HdhZDictKv%ba&_n3lWs)NY` z>K(%|AN4_=JjP193+CB{#Eb4dX`bID$8~JV5iw~#$(2h+>gD+PXyNPoNj)#XNuhnrslZrP|0&Sy# zed%Ah7QR)fVXpeRe&cAkZ4Y-hWZL{%POdLo(&k}2_~ihkz<79ysx2POJ^MN2%b|U$ zo|ld_Y(F`j)n!Up#?B{zOk6xZqLLZ}K+kLcF(|XM|tfYc%(Ro@zGpUy09#-@okOTyN6Q z(-Zgn=5Wo#&$swlsob8YsD$RhOl{_!ENfabj5(UC&z%}SpRMIJ{$5o{Kg*h^f?9_(#0xImtr{j zX4K3bZ&iDc=ITL=NqUMJ@PlQqj(x21>S&@pI}o(>>C7#i>g8%l^?qA-_QN`|SKJW_ zwB0eqDs}i(MJ@J$aX+dc-mklVSr`4v{>8EQWc>?IG7kF}Y-HWu{|W!HF8g!WztlmL zuAQ8JS+Dgkabj&Dcose(<&(D2U3(b`{<4R$g>WVreGK{Zq~X7xk6E9vk8!Nvh;9;I z#=l!Qc`t)Bf=islb#0*8&oFo5-*heene`EV#u;|2xY+^PzU?dBI8A zfadvV6y#V)Pm#ocKEw{|4#=>E!?b literal 0 HcmV?d00001 diff --git a/PowerEditor/src/WinControls/Preference/preference.rc b/PowerEditor/src/WinControls/Preference/preference.rc new file mode 100644 index 00000000..f01a2022 --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preference.rc @@ -0,0 +1,237 @@ +/* +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, 325, 206 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE +CAPTION "Preferences" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + PUSHBUTTON "Close",IDC_BUTTON_CLOSE,146,186,45,14 +END + +IDD_PREFERENCE_BAR_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Tool bar",IDC_TOOLBAR_GB_STATIC,11,5,131,68,BS_CENTER + CONTROL "Hide",IDC_RADIO_HIDE,"Button",BS_AUTORADIOBUTTON,18,15,94,10 + CONTROL "Small icons",IDC_RADIO_SMALLICON,"Button",BS_AUTORADIOBUTTON,18,29,114,10 + CONTROL "Big icons",IDC_RADIO_BIGICON,"Button",BS_AUTORADIOBUTTON,18,43,109,10 + CONTROL "Small standard icons",IDC_RADIO_STANDARD,"Button",BS_AUTORADIOBUTTON,18,57,119,10 + + GROUPBOX "Tab bar",IDC_TABBAR_GB_STATIC,149,5,146,102,BS_CENTER + CONTROL "Reduce",IDC_CHECK_REDUCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,14,108,10 + CONTROL "Lock (No Drag N Drop)",IDC_CHECK_LOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,29,134,10 + CONTROL "Draw the inactive tabs",IDC_CHECK_DRAWINACTIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,44,134,10 + CONTROL "Draw the orange top bar",IDC_CHECK_ORANGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,59,133,10 + CONTROL "Enable close button on each tab", IDC_CHECK_ENABLETABCLOSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,74,133,10 + CONTROL "Double click to close document",IDC_CHECK_DBCLICK2CLOSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,89,133,10 + + CONTROL "Show Status Bar",IDC_CHECK_SHOWSTATUSBAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,80,130,10 + CONTROL "Auto-indent",IDC_CHECK_MAINTAININDENT,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,12,95,130,10 + CONTROL "Remember the last operation directory",IDC_CHECK_KEEPINSAMEDIR,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,12,110,210,10 + CONTROL "Enable document switcher (Ctrl+Tab)",IDC_CHECK_ENABLEDOCSWITCHER,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,12,125,180,10 + CONTROL "Enable MRU behaviour for document switcher",IDC_CHECK_STYLEMRU,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,23,140,210,10 +END + +IDD_PREFERENCE_MARGEIN_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Folder margin style",IDC_FMS_GB_STATIC,18,21,105,77, BS_CENTER + CONTROL "Simple",IDC_RADIO_SIMPLE,"Button", BS_AUTORADIOBUTTON | WS_GROUP,27,33,59,10 + CONTROL "Arrow",IDC_RADIO_ARROW,"Button", BS_AUTORADIOBUTTON, 27, 49, 60, 10 + CONTROL "Circle tree",IDC_RADIO_CIRCLE, "Button", BS_AUTORADIOBUTTON, 27, 65, 62, 10 + CONTROL "Box tree", IDC_RADIO_BOX, "Button", BS_AUTORADIOBUTTON, 27, 81, 61, 10 + CONTROL "Display line number margin", IDC_CHECK_LINENUMBERMARGE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 13, 107, 141, 10 + CONTROL "Display bookmark margin",IDC_CHECK_BOOKMARKMARGE,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,122,150,10 + CONTROL "Show vertical edge",IDC_CHECK_SHOWVERTICALEDGE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,149,33,122,10 + RTEXT "Number of columns :",IDC_NBCOLONE_STATIC,144,81,83,8 + LTEXT "0",IDC_COLONENUMBER_STATIC,235,81,18,8 + GROUPBOX "Vertical Edge Setting",IDC_VES_GB_STATIC,138,21,148,77, + BS_CENTER + CONTROL "Line mode",IDC_RADIO_LNMODE,"Button",BS_AUTORADIOBUTTON, + 152,49,91,10 + CONTROL "Background mode",IDC_RADIO_BGMODE,"Button", + BS_AUTORADIOBUTTON,152,64,91,10 + CONTROL "Active current line highlight",IDC_CHECK_CURRENTLINEHILITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,165,107,129,10 + GROUPBOX "",IDC_STATIC,6,6,293,136 + COMBOBOX IDC_COMBO_SCINTILLAVIEWCHOIX,98,3,96,40,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + +END + +IDD_PREFERENCE_SETTING_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Tab Setting",IDC_TABSETTING_GB_STATIC,11,4,119,44,BS_CENTER + CONTROL "Replace by space",IDC_CHECK_REPLACEBYSPACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,31,100,10 + RTEXT "Tab size : ",IDC_TABSIZE_STATIC,16,18,58,8 + LTEXT "0",IDC_TABSIZEVAL_STATIC,76,18,18,8 + GROUPBOX "History File Setting",IDC_HISTORY_GB_STATIC,144,4,150,44,BS_CENTER + CONTROL "Don't check at launch time",IDC_CHECK_DONTCHECKHISTORY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,31,133,10 + RTEXT "Max number history file :",IDC_MAXNBFILE_STATIC,147,18,112,8 + LTEXT "0",IDC_MAXNBFILEVAL_STATIC,266,18,15,8 + CONTROL "Enable",IDC_CHECK_FILEAUTODETECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,65,98,10 + CONTROL "Minimize to sys tray",IDC_CHECK_MIN2SYSTRAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,101,130,10 + CONTROL "Remember the current session for next launch",IDC_CHECK_REMEMBERSESSION, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,11,111,160,23 + GROUPBOX "File Status Auto-detection",IDC_FILEAUTODETECTION_STATIC,11,54,120,39,BS_CENTER + CONTROL "Update silently",IDC_CHECK_UPDATESILENTLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,78,98,10 + //GROUPBOX "Backup Option",IDC_BACKUP_GB_STATIC,11,98,120,46,BS_CENTER + + CONTROL "Enable",IDC_CHECK__CLICKABLELINK_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,157,65,98,10 + GROUPBOX "Clickable link setting",IDC_CLICKABLELINK_STATIC,144,54,150,39,BS_CENTER + CONTROL "Don't draw underline",IDC_CHECK__CLICKABLELINK_NOUNDERLINE, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,157,78,119,10 +END + +IDD_PREFERENCE_NEWDOCSETTING_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Format",IDC_FORMAT_GB_STATIC,28,9,95,83,BS_CENTER + CONTROL "Windows",IDC_RADIO_F_WIN,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,35,27,63,10 + CONTROL "Unix",IDC_RADIO_F_UNIX,"Button",BS_AUTORADIOBUTTON,35, + 45,56,10 + CONTROL "Mac",IDC_RADIO_F_MAC,"Button",BS_AUTORADIOBUTTON,35,63, + 60,10 + GROUPBOX "Encoding",IDC_ENCODING_STATIC,146,10,140,83,BS_CENTER + CONTROL "ANSI",IDC_RADIO_ANSI,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,153,21,80,10 + CONTROL "UTF-8 without BOM",IDC_RADIO_UTF8SANSBOM,"Button", + BS_AUTORADIOBUTTON,153,35,128,10 + CONTROL "UTF-8",IDC_RADIO_UTF8,"Button",BS_AUTORADIOBUTTON,153, + 49,62,10 + CONTROL "UCS2 big endian",IDC_RADIO_UCS2BIG,"Button", + BS_AUTORADIOBUTTON,153,63,103,10 + CONTROL "UCS2 small endian",IDC_RADIO_UCS2SMALL,"Button", + BS_AUTORADIOBUTTON,153,77,102,10 + RTEXT "Default Language :",IDC_DEFAULTLANG_STATIC,16,110,80,8 + COMBOBOX IDC_COMBO_DEFAULTLANG,100,108,72,140,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP +END + +IDD_PREFERENCE_LANG_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LISTBOX IDC_LIST_ENABLEDLANG,54,21,78,117,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + LISTBOX IDC_LIST_DISABLEDLANG,200,21,78,117,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "->",IDC_BUTTON_REMOVE,141,53,50,14 + PUSHBUTTON "<-",IDC_BUTTON_RESTORE,142,84,50,14 + CTEXT "Available items",IDC_ENABLEDITEMS_STATIC,57,8,72,8 + CTEXT "Disabled items",IDC_DISABLEDITEMS_STATIC,203,8,72,8 +END + +IDD_PREFERENCE_PRINT_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "WYSIWYG",IDC_RADIO_WYSIWYG,"Button",BS_AUTORADIOBUTTON, + 16,52,123,10 + CONTROL "Invert",IDC_RADIO_INVERT,"Button",BS_AUTORADIOBUTTON,16, + 67,90,10 + CONTROL "Black on white",IDC_RADIO_BW,"Button", + BS_AUTORADIOBUTTON,16,82,90,10 + CONTROL "No background colour",IDC_RADIO_NOBG,"Button", + BS_AUTORADIOBUTTON,16,98,123,10 + GROUPBOX "Colour Option",IDC_COLOUROPT_STATIC,11,32,133,96, + BS_CENTER + CONTROL "Print Line Number",IDC_CHECK_PRINTLINENUM,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,12,17,145,10 + EDITTEXT IDC_EDIT_ML,194,75,17,14,ES_NUMBER + EDITTEXT IDC_EDIT_MT,215,56,17,14,ES_NUMBER + EDITTEXT IDC_EDIT_MR,235,75,17,14,ES_NUMBER + EDITTEXT IDC_EDIT_MB,215,96,17,14,ES_NUMBER + RTEXT "Left",IDC_ML_STATIC,161,78,30,8 + CTEXT "Top",IDC_MT_STATIC,197,46,54,8 + LTEXT "Right",IDC_MR_STATIC,257,78,29,8 + CTEXT "Bottom",IDC_MB_STATIC,197,111,54,8 + GROUPBOX "Marge Setting (Unit:mm)",IDC_MARGESETTINGS_STATIC,153, + 32,144,96,BS_CENTER +END + +IDD_PREFERENCE_PRINT2_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + EDITTEXT IDC_EDIT_HLEFT,23,36,83,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_HMIDDLE,113,36,83,14,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_HRIGHT,203,36,83,14,ES_RIGHT | ES_AUTOHSCROLL + COMBOBOX IDC_COMBO_HFONTNAME,23,54,84,104,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_HFONTSIZE,113,54,31,72,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_CHECK_HBOLD,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,153,54,46,10 + CONTROL "Italic",IDC_CHECK_HITALIC,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,213,54,43,10 + GROUPBOX "Header",IDC_HGB_STATIC,15,17,279,56,BS_CENTER + CTEXT "Left part",IDC_HL_STATIC,25,27,79,8 + CTEXT "Middle part",IDC_HM_STATIC,117,27,75,8 + CTEXT "Right part",IDC_HR_STATIC,205,27,78,8 + EDITTEXT IDC_EDIT_FLEFT,23,94,83,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_FMIDDLE,114,94,83,14,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_FRIGHT,203,94,83,14,ES_RIGHT | ES_AUTOHSCROLL + COMBOBOX IDC_COMBO_FFONTNAME,23,112,84,119,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_FFONTSIZE,115,112,31,71,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_CHECK_FBOLD,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,154,114,46,10 + CONTROL "Italic",IDC_CHECK_FITALIC,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,213,114,47,10 + GROUPBOX "Footer",IDC_FGB_STATIC,15,75,279,58,BS_CENTER + CTEXT "Left part",IDC_FL_STATIC,25,85,78,8 + CTEXT "Middle part",IDC_FM_STATIC,114,85,82,8 + CTEXT "Right part",IDC_FR_STATIC,205,85,79,8 + COMBOBOX IDC_COMBO_VARLIST,77,2,70,58,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Add",IDC_BUTTON_ADDVAR,155,2,44,12 + RTEXT "Variable :",IDC_VAR_STATIC,16,4,59,8 + RTEXT "Which part :",IDC_WHICHPART_STATIC,2,137,80,8 + LTEXT "",IDC_VIEWPANEL_STATIC,85,137,213,8 +END + +IDD_PREFERENCE_BACKUP_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "None",IDC_RADIO_BKNONE,"Button",BS_AUTORADIOBUTTON,34,19,87,10 + CONTROL "Simple Backup",IDC_RADIO_BKSIMPLE,"Button",BS_AUTORADIOBUTTON,34,31,111,10 + CONTROL "Verbose Backup",IDC_RADIO_BKVERBOSE,"Button",BS_AUTORADIOBUTTON,34,43,111,10 + GROUPBOX "User custom backup directory",IDC_BACKUPDIRGRP_STATIC,25,65,260,51 + CONTROL "",IDC_BACKUPDIR_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,21,65,8,10 + RTEXT "Directory :",IDD_BACKUPDIR_STATIC,29,87,40,8 + EDITTEXT IDC_BACKUPDIR_EDIT,76,85,179,14,ES_AUTOHSCROLL + PUSHBUTTON "...",IDD_BACKUPDIR_BROWSE_BUTTON,262,85,16,14 +END diff --git a/PowerEditor/src/WinControls/Preference/preference.rc.bak b/PowerEditor/src/WinControls/Preference/preference.rc.bak new file mode 100644 index 00000000..82b03b66 --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preference.rc.bak @@ -0,0 +1,225 @@ +/* +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, 325, 206 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE +CAPTION "Preferences" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + PUSHBUTTON "Close",IDC_BUTTON_CLOSE,146,186,45,14 +END + +IDD_PREFERENCE_BAR_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Tool bar",IDC_TOOLBAR_GB_STATIC,11,5,131,68,BS_CENTER + CONTROL "Hide",IDC_RADIO_HIDE,"Button",BS_AUTORADIOBUTTON,18,15,94,10 + CONTROL "Small icons",IDC_RADIO_SMALLICON,"Button",BS_AUTORADIOBUTTON,18,29,114,10 + CONTROL "Big icons",IDC_RADIO_BIGICON,"Button",BS_AUTORADIOBUTTON,18,43,109,10 + CONTROL "Small standard icons",IDC_RADIO_STANDARD,"Button",BS_AUTORADIOBUTTON,18,57,119,10 + + GROUPBOX "Tab bar",IDC_TABBAR_GB_STATIC,149,5,146,102,BS_CENTER + CONTROL "Reduce",IDC_CHECK_REDUCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,14,108,10 + CONTROL "Lock (No Drag N Drop)",IDC_CHECK_LOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,29,134,10 + CONTROL "Draw the inactive tabs",IDC_CHECK_DRAWINACTIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,44,134,10 + CONTROL "Draw the orange top bar",IDC_CHECK_ORANGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,59,133,10 + CONTROL "Enable close button on each tab", IDC_CHECK_ENABLETABCLOSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,74,133,10 + CONTROL "Double click to close document",IDC_CHECK_DBCLICK2CLOSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155,89,133,10 + + CONTROL "Show Status Bar",IDC_CHECK_SHOWSTATUSBAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,80,130,10 + CONTROL "Auto-indent",IDC_CHECK_MAINTAININDENT,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,12,95,130,10 + CONTROL "Remember the last operation directory",IDC_CHECK_KEEPINSAMEDIR,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,12,110,210,10 + CONTROL "Enable document switcher (Ctrl+Tab)",IDC_CHECK_ENABLEDOCSWITCHER,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,12,125,180,10 + CONTROL "Enable MRU behaviour for document switcher",IDC_CHECK_STYLEMRU,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,23,140,210,10 +END + +IDD_PREFERENCE_MARGEIN_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Folder margin style",IDC_FMS_GB_STATIC,18,21,105,77, BS_CENTER + CONTROL "Simple",IDC_RADIO_SIMPLE,"Button", BS_AUTORADIOBUTTON | WS_GROUP,27,33,59,10 + CONTROL "Arrow",IDC_RADIO_ARROW,"Button", BS_AUTORADIOBUTTON, 27, 49, 60, 10 + CONTROL "Circle tree",IDC_RADIO_CIRCLE, "Button", BS_AUTORADIOBUTTON, 27, 65, 62, 10 + CONTROL "Box tree", IDC_RADIO_BOX, "Button", BS_AUTORADIOBUTTON, 27, 81, 61, 10 + CONTROL "Display line number margin", IDC_CHECK_LINENUMBERMARGE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 13, 107, 141, 10 + CONTROL "Display bookmark margin",IDC_CHECK_BOOKMARKMARGE,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,122,150,10 + CONTROL "Show vertical edge",IDC_CHECK_SHOWVERTICALEDGE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,149,33,122,10 + RTEXT "Number of columns :",IDC_NBCOLONE_STATIC,144,81,83,8 + LTEXT "0",IDC_COLONENUMBER_STATIC,235,81,18,8 + GROUPBOX "Vertical Edge Setting",IDC_VES_GB_STATIC,138,21,148,77, + BS_CENTER + CONTROL "Line mode",IDC_RADIO_LNMODE,"Button",BS_AUTORADIOBUTTON, + 152,49,91,10 + CONTROL "Background mode",IDC_RADIO_BGMODE,"Button", + BS_AUTORADIOBUTTON,152,64,91,10 + CONTROL "Active current line highlight",IDC_CHECK_CURRENTLINEHILITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,165,107,129,10 + GROUPBOX "",IDC_STATIC,6,6,293,136 + COMBOBOX IDC_COMBO_SCINTILLAVIEWCHOIX,98,3,96,40,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + +END + +IDD_PREFERENCE_SETTING_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Tab Setting",IDC_TABSETTING_GB_STATIC,11,4,119,44,BS_CENTER + CONTROL "Replace by space",IDC_CHECK_REPLACEBYSPACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,31,100,10 + RTEXT "Tab size : ",IDC_TABSIZE_STATIC,16,18,58,8 + LTEXT "0",IDC_TABSIZEVAL_STATIC,76,18,18,8 + GROUPBOX "History File Setting",IDC_HISTORY_GB_STATIC,144,4,150,44,BS_CENTER + CONTROL "Don't check at launch time",IDC_CHECK_DONTCHECKHISTORY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,31,133,10 + RTEXT "Max number history file :",IDC_MAXNBFILE_STATIC,147,18,112,8 + LTEXT "0",IDC_MAXNBFILEVAL_STATIC,266,18,15,8 + CONTROL "Enable",IDC_CHECK_FILEAUTODETECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,65,98,10 + CONTROL "Minimize to sys tray",IDC_CHECK_MIN2SYSTRAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,144,101,130,10 + CONTROL "Remember the current session for next launch",IDC_CHECK_REMEMBERSESSION, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,144,111,160,23 + GROUPBOX "File Status Auto-detection",IDC_FILEAUTODETECTION_STATIC,11,54,120,39,BS_CENTER + CONTROL "Update silently",IDC_CHECK_UPDATESILENTLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,78,98,10 + GROUPBOX "Backup Option",IDC_BACKUP_GB_STATIC,11,98,120,46,BS_CENTER + CONTROL "None",IDC_RADIO_BKNONE,"Button",BS_AUTORADIOBUTTON,18,107,87,10 + CONTROL "Simple Backup",IDC_RADIO_BKSIMPLE,"Button",BS_AUTORADIOBUTTON,18,119,111,10 + CONTROL "Verbose Backup",IDC_RADIO_BKVERBOSE,"Button",BS_AUTORADIOBUTTON,18,131,111,10 + CONTROL "Enable",IDC_CHECK__CLICKABLELINK_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,157,65,98,10 + GROUPBOX "Clickable link setting",IDC_CLICKABLELINK_STATIC,144,54,150,39,BS_CENTER + CONTROL "Don't draw underline",IDC_CHECK__CLICKABLELINK_NOUNDERLINE, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,157,78,119,10 +END + +IDD_PREFERENCE_NEWDOCSETTING_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Format",IDC_FORMAT_GB_STATIC,28,9,95,83,BS_CENTER + CONTROL "Windows",IDC_RADIO_F_WIN,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,35,27,63,10 + CONTROL "Unix",IDC_RADIO_F_UNIX,"Button",BS_AUTORADIOBUTTON,35, + 45,56,10 + CONTROL "Mac",IDC_RADIO_F_MAC,"Button",BS_AUTORADIOBUTTON,35,63, + 60,10 + GROUPBOX "Encoding",IDC_ENCODING_STATIC,146,10,140,83,BS_CENTER + CONTROL "ANSI",IDC_RADIO_ANSI,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,153,21,80,10 + CONTROL "UTF-8 without BOM",IDC_RADIO_UTF8SANSBOM,"Button", + BS_AUTORADIOBUTTON,153,35,128,10 + CONTROL "UTF-8",IDC_RADIO_UTF8,"Button",BS_AUTORADIOBUTTON,153, + 49,62,10 + CONTROL "UCS2 big endian",IDC_RADIO_UCS2BIG,"Button", + BS_AUTORADIOBUTTON,153,63,103,10 + CONTROL "UCS2 small endian",IDC_RADIO_UCS2SMALL,"Button", + BS_AUTORADIOBUTTON,153,77,102,10 + RTEXT "Default Language :",IDC_DEFAULTLANG_STATIC,16,110,80,8 + COMBOBOX IDC_COMBO_DEFAULTLANG,100,108,72,140,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP +END + +IDD_PREFERENCE_LANG_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LISTBOX IDC_LIST_ENABLEDLANG,54,21,78,117,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + LISTBOX IDC_LIST_DISABLEDLANG,200,21,78,117,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "->",IDC_BUTTON_REMOVE,141,53,50,14 + PUSHBUTTON "<-",IDC_BUTTON_RESTORE,142,84,50,14 + CTEXT "Available items",IDC_ENABLEDITEMS_STATIC,57,8,72,8 + CTEXT "Disabled items",IDC_DISABLEDITEMS_STATIC,203,8,72,8 +END + +IDD_PREFERENCE_PRINT_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "WYSIWYG",IDC_RADIO_WYSIWYG,"Button",BS_AUTORADIOBUTTON, + 16,52,123,10 + CONTROL "Invert",IDC_RADIO_INVERT,"Button",BS_AUTORADIOBUTTON,16, + 67,90,10 + CONTROL "Black on white",IDC_RADIO_BW,"Button", + BS_AUTORADIOBUTTON,16,82,90,10 + CONTROL "No background colour",IDC_RADIO_NOBG,"Button", + BS_AUTORADIOBUTTON,16,98,123,10 + GROUPBOX "Colour Option",IDC_COLOUROPT_STATIC,11,32,133,96, + BS_CENTER + CONTROL "Print Line Number",IDC_CHECK_PRINTLINENUM,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,12,17,145,10 + EDITTEXT IDC_EDIT_ML,194,75,17,14,ES_NUMBER + EDITTEXT IDC_EDIT_MT,215,56,17,14,ES_NUMBER + EDITTEXT IDC_EDIT_MR,235,75,17,14,ES_NUMBER + EDITTEXT IDC_EDIT_MB,215,96,17,14,ES_NUMBER + RTEXT "Left",IDC_ML_STATIC,161,78,30,8 + CTEXT "Top",IDC_MT_STATIC,197,46,54,8 + LTEXT "Right",IDC_MR_STATIC,257,78,29,8 + CTEXT "Bottom",IDC_MB_STATIC,197,111,54,8 + GROUPBOX "Marge Setting (Unit:mm)",IDC_MARGESETTINGS_STATIC,153, + 32,144,96,BS_CENTER +END + +IDD_PREFERENCE_PRINT2_BOX DIALOGEX 0, 0, 305, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + EDITTEXT IDC_EDIT_HLEFT,23,36,83,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_HMIDDLE,113,36,83,14,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_HRIGHT,203,36,83,14,ES_RIGHT | ES_AUTOHSCROLL + COMBOBOX IDC_COMBO_HFONTNAME,23,54,84,104,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_HFONTSIZE,113,54,31,72,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_CHECK_HBOLD,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,153,54,46,10 + CONTROL "Italic",IDC_CHECK_HITALIC,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,213,54,43,10 + GROUPBOX "Header",IDC_HGB_STATIC,15,17,279,56,BS_CENTER + CTEXT "Left part",IDC_HL_STATIC,25,27,79,8 + CTEXT "Middle part",IDC_HM_STATIC,117,27,75,8 + CTEXT "Right part",IDC_HR_STATIC,205,27,78,8 + EDITTEXT IDC_EDIT_FLEFT,23,94,83,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_FMIDDLE,114,94,83,14,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_FRIGHT,203,94,83,14,ES_RIGHT | ES_AUTOHSCROLL + COMBOBOX IDC_COMBO_FFONTNAME,23,112,84,119,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_FFONTSIZE,115,112,31,71,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_CHECK_FBOLD,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,154,114,46,10 + CONTROL "Italic",IDC_CHECK_FITALIC,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,213,114,47,10 + GROUPBOX "Footer",IDC_FGB_STATIC,15,75,279,58,BS_CENTER + CTEXT "Left part",IDC_FL_STATIC,25,85,78,8 + CTEXT "Middle part",IDC_FM_STATIC,114,85,82,8 + CTEXT "Right part",IDC_FR_STATIC,205,85,79,8 + COMBOBOX IDC_COMBO_VARLIST,77,2,70,58,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Add",IDC_BUTTON_ADDVAR,155,2,44,12 + RTEXT "Variable :",IDC_VAR_STATIC,16,4,59,8 + RTEXT "Which part :",IDC_WHICHPART_STATIC,2,137,80,8 + LTEXT "",IDC_VIEWPANEL_STATIC,85,137,213,8 +END diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp new file mode 100644 index 00000000..34cb6dce --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp @@ -0,0 +1,1296 @@ +#include +#include "preferenceDlg.h" +#include "SysMsg.h" +#include "common_func.h" + +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("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, "Global", "Global")); + _wVector.push_back(DlgInfo(&_marginsDlg, "Edit Components", "Scintillas")); + _wVector.push_back(DlgInfo(&_defaultNewDocDlg, "New Document", "NewDoc")); + _wVector.push_back(DlgInfo(&_fileAssocDlg, "File Association", "FileAssoc")); + _wVector.push_back(DlgInfo(&_langMenuDlg, "Language Menu", "LangMenu")); + _wVector.push_back(DlgInfo(&_printSettingsDlg, "Print - Colour and Marge", "Print1")); + _wVector.push_back(DlgInfo(&_printSettings2Dlg, "Print - Header and Footer", "Print2")); + _wVector.push_back(DlgInfo(&_backupDlg, "Backup", "Backup")); + _wVector.push_back(DlgInfo(&_settingsDlg, "MISC", "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 showStatus = nppGUI._statusBarShow; + bool enableTaskList = nppGUI._doTaskList; + bool enableMaintainIndent = nppGUI._maitainIndent; + bool saveOpenKeepInSameDir = nppGUI._saveOpenKeepInSameDir; + bool styleMRU = nppGUI._styleMRU; + + int ID2Check = 0; + switch (tbStatus) + { + case TB_HIDE : + ID2Check = IDC_RADIO_HIDE; + break; + case TB_SMALL : + ID2Check = IDC_RADIO_SMALLICON; + break; + case TB_LARGE : + ID2Check = IDC_RADIO_BIGICON; + break; + + default : //TB_STANDARD + 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_SHOWSTATUSBAR, BM_SETCHECK, showStatus, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLEDOCSWITCHER, BM_SETCHECK, enableTaskList, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_MAINTAININDENT, BM_SETCHECK, enableMaintainIndent, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_KEEPINSAMEDIR, BM_SETCHECK, saveOpenKeepInSameDir, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_STYLEMRU, BM_SETCHECK, styleMRU, 0); + if (!nppGUI._doTaskList) + { + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_STYLEMRU), FALSE); + } + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + + return TRUE; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_CHECK_SHOWSTATUSBAR : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_STATUSBAR, 0); + return TRUE; + + case IDC_CHECK_ENABLEDOCSWITCHER : + { + NppGUI & nppGUI = (NppGUI &)NppParameters::getInstance()->getNppGUI(); + 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_KEEPINSAMEDIR : + { + NppGUI & nppGUI = (NppGUI &)NppParameters::getInstance()->getNppGUI(); + nppGUI._saveOpenKeepInSameDir = !nppGUI._saveOpenKeepInSameDir; + return TRUE; + } + + case IDC_CHECK_MAINTAININDENT : + { + NppGUI & nppGUI = (NppGUI &)NppParameters::getInstance()->getNppGUI(); + nppGUI._maitainIndent = !nppGUI._maitainIndent; + return TRUE; + } + + case IDC_CHECK_STYLEMRU : + { + NppGUI & nppGUI = (NppGUI &)NppParameters::getInstance()->getNppGUI(); + nppGUI._styleMRU = !nppGUI._styleMRU; + 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_RADIO_HIDE : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_TOOLBAR_HIDE, 0); + 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; + } + } + } + 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_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); + + char nbColStr[10]; + itoa(svp._edgeNbColumn, nbColStr, 10); + ::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) +{ + switch (Message) + { + case WM_INITDIALOG : + { + _verticalEdgeLineNbColVal.init(_hInst, _hSelf); + _verticalEdgeLineNbColVal.create(::GetDlgItem(_hSelf, IDC_COLONENUMBER_STATIC), IDM_SETTING_EDGE_SIZE); + + ::SendDlgItemMessage(_hSelf, IDC_COMBO_SCINTILLAVIEWCHOIX, CB_ADDSTRING, 0, (LPARAM)"Primary View"); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_SCINTILLAVIEWCHOIX, CB_ADDSTRING, 0, (LPARAM)"Second View"); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_SCINTILLAVIEWCHOIX, CB_SETCURSEL, 0, 0); + + changePanelTo(SCIV_PRIMARY); + + NppParameters *pNppParam = NppParameters::getInstance(); + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + return TRUE; + } + case WM_COMMAND : + { + NppParameters *pNppParam = NppParameters::getInstance(); + + 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 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_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); + char nbColStr[10]; + itoa(svp._edgeNbColumn, nbColStr, 10); + ::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; + } + 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 : + { + char nbStr[10]; + itoa(nppGUI._tabSize, nbStr, 10); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); + + _tabSizeVal.init(_hInst, _hSelf); + _tabSizeVal.create(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), IDM_SETTING_TAB_SIZE); + + itoa(pNppParam->getNbMaxFile(), nbStr, 10); + ::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_REPLACEBYSPACE, BM_SETCHECK, nppGUI._tabReplacedBySpace, 0); + ::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 //cdDisabled + { + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_UPDATESILENTLY), FALSE); + } + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_MIN2SYSTRAY, BM_SETCHECK, nppGUI._isMinimizedToTray, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_REMEMBERSESSION, BM_SETCHECK, nppGUI._rememberLastSession, 0); + + 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); + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + + return TRUE; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_CHECK_REPLACEBYSPACE: + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_TAB_REPLCESPACE, 0); + return TRUE; + case IDC_CHECK_DONTCHECKHISTORY: + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_HISTORY_DONT_CHECK, 0); + return TRUE; + + case IDC_CHECK_FILEAUTODETECTION: + { + bool isChecked = isCheckedOrNot(IDC_CHECK_FILEAUTODETECTION); + if (!isChecked) + ::SendDlgItemMessage(_hSelf, IDC_CHECK_UPDATESILENTLY, BM_SETCHECK, BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_UPDATESILENTLY), isChecked); + ::SendMessage(_hParent, WM_COMMAND, isChecked?IDM_SETTING_FILE_AUTODETECTION_ENABLE:IDM_SETTING_FILE_AUTODETECTION_DISABLE, 0); + } + return TRUE; + + case IDC_CHECK_UPDATESILENTLY: + { + bool isChecked = isCheckedOrNot(IDC_CHECK_UPDATESILENTLY); + ::SendMessage(_hParent, WM_COMMAND, isChecked?IDM_SETTING_FILE_AUTODETECTION_ENABLESILENTLY:IDM_SETTING_FILE_AUTODETECTION_ENABLE, 0); + } + 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_MIN2SYSTRAY: + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_TRAYICON, 0); + return TRUE; + case IDC_CHECK_REMEMBERSESSION: + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_REMEMBER_LAST_SESSION, 0); + return TRUE; + case IDM_SETTING_TAB_SIZE: + { + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_TAB_SIZE, 0); + char nbStr[10]; + itoa(nppGUI._tabSize, nbStr, 10); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); + return TRUE; + } + case IDM_SETTING_HISTORY_SIZE: + { + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_HISTORY_SIZE, 0); + char nbStr[10]; + itoa(pNppParam->getNbMaxFile(), nbStr, 10); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_MAXNBFILEVAL_STATIC), nbStr); + return TRUE; + } + } + } + } + return FALSE; +} + +BOOL CALLBACK DefaultNewDocDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + const 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); + + int index = 0; + for (int i = L_TXT ; i < L_END ; i++) + { + string str; + //if ((LangType)i != L_END) + { + int cmdID = pNppParam->langTypeToCommandID((LangType)i); + if (getNameStrFromCmd(cmdID, str) == TYPE_CMD) + { + _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); + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_RADIO_UCS2BIG: + ndds._encoding = uni16BE; + return TRUE; + case IDC_RADIO_UCS2SMALL: + ndds._encoding = uni16LE; + return TRUE; + case IDC_RADIO_UTF8: + ndds._encoding = uniUTF8; + return TRUE; + case IDC_RADIO_UTF8SANSBOM: + ndds._encoding = uniCookie; + return TRUE; + case IDC_RADIO_ANSI: + ndds._encoding = uni8Bit; + 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; + + 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 < L_END ; i++) + { + string str; + if ((LangType)i != L_USER) + { + int cmdID = pNppParam->langTypeToCommandID((LangType)i); + if (getNameStrFromCmd(cmdID, str) == TYPE_CMD) + { + _langList.push_back(LangMenuItem((LangType)i, cmdID, str)); + ::SendDlgItemMessage(_hSelf, IDC_LIST_ENABLEDLANG, LB_ADDSTRING, 0, (LPARAM)str.c_str()); + //printStr(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()); + } + + + ::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_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); + char 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); + + HWND grandParent; + //::SendMessage(_hParent, WM_GETPARENTOF, (WPARAM)&grandParent, 0); + grandParent = ::GetParent(_hParent); + + if (LOWORD(wParam)==IDC_BUTTON_REMOVE) + { + ::DeleteMenu(::GetMenu(grandParent), lmi._cmdID, MF_BYCOMMAND); + } + else + { + ::InsertMenu(::GetSubMenu(::GetMenu(grandParent), 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); + + char valStr[10]; + ::SendDlgItemMessage(_hSelf, IDC_EDIT_ML, WM_SETTEXT, 0, (LPARAM)itoa(nppGUI._printSettings._marge.left, valStr, 10)); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_MR, WM_SETTEXT, 0, (LPARAM)itoa(nppGUI._printSettings._marge.right, valStr, 10)); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_MT, WM_SETTEXT, 0, (LPARAM)itoa(nppGUI._printSettings._marge.top, valStr, 10)); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_MB, WM_SETTEXT, 0, (LPARAM)itoa(nppGUI._printSettings._marge.bottom, valStr, 10)); + + 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(string & str) +{ + string::size_type pos = str.find_last_not_of(' '); + + if (pos != string::npos) + { + str.erase(pos + 1); + pos = str.find_first_not_of(' '); + if(pos != 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()); + + char intStr[5]; + for(size_t i = 6 ; i < 15 ; i++) + { + + itoa(i, intStr, 10); + ::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); + + itoa(nppGUI._printSettings._headerFontSize, intStr, 10); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_HFONTSIZE, CB_SELECTSTRING, -1, (LPARAM)intStr); + itoa(nppGUI._printSettings._footerFontSize, intStr, 10); + ::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("Full file name path", "$(FULL_CURRENT_PATH)")); + varList.push_back(strCouple("File name", "$(FILE_NAME)")); + varList.push_back(strCouple("File directory", "$(FULL_CURRENT_PATH)")); + varList.push_back(strCouple("Page", "$(CURRENT_PRINTING_PAGE)")); + varList.push_back(strCouple("Short date format", "$(SHORT_DATE)")); + varList.push_back(strCouple("Long date format", "$(LONG_DATE)")); + varList.push_back(strCouple("Time", "$(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) + { + char str[256]; + _focusedEditCtrl = LOWORD(wParam); + ::GetDlgItemText(_hSelf, _focusedEditCtrl, str, sizeof(str)); + ::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) + { + char str[256]; + _focusedEditCtrl = LOWORD(wParam); + ::GetDlgItemText(_hSelf, _focusedEditCtrl, str, sizeof(str)); + //_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, sizeof(str)); + string title = str; + title += " "; + ::GetDlgItemText(_hSelf, focusedEditStatic, str, sizeof(str)); + title += str; + title += " : "; + + ::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 : + { + char *fnStr = (char *)::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 : + { + char 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 = 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); + char *varStr = (char *)::SendDlgItemMessage(_hSelf, IDC_COMBO_VARLIST, CB_GETITEMDATA, iSel, 0); + + ::SendDlgItemMessage(_hSelf, _focusedEditCtrl, EM_GETSEL, (WPARAM)&_selStart, (LPARAM)&_selEnd); +/* + char toto[32]; + sprintf(toto, "_selStart = %d\r_selEnd = %d", _selStart, _selEnd); + ::MessageBox(NULL, toto, "", MB_OK); +*/ + char str[256]; + ::SendDlgItemMessage(_hSelf, _focusedEditCtrl, WM_GETTEXT, sizeof(str), (LPARAM)str); + //::MessageBox(NULL, str, "", MB_OK); + + 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 : + { + + 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); + + updateGUI(); + return TRUE; + } + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + switch (LOWORD(wParam)) + { + case IDC_BACKUPDIR_EDIT: + { + char inputDir[MAX_PATH]; + ::SendDlgItemMessage(_hSelf, IDC_BACKUPDIR_EDIT, WM_GETTEXT, sizeof(inputDir), (LPARAM)inputDir); + strcpy(nppGUI._backupDir, inputDir); + return TRUE; + } + } + } + + switch (wParam) + { + case IDC_RADIO_BKSIMPLE: + { + nppGUI._backup = bak_simple; + updateGUI(); + return TRUE; + } + + case IDC_RADIO_BKVERBOSE: + { + nppGUI._backup = bak_verbose; + updateGUI(); + return TRUE; + } + + case IDC_RADIO_BKNONE: + { + nppGUI._backup = bak_none; + updateGUI(); + return TRUE; + } + + case IDC_BACKUPDIR_CHECK: + { + nppGUI._useDir = !nppGUI._useDir; + updateGUI(); + return TRUE; + } + case IDD_BACKUPDIR_BROWSE_BUTTON : + { + folderBrowser(_hSelf, IDC_BACKUPDIR_EDIT); + return TRUE; + } + + default : + return FALSE; + } + + } + } + return FALSE; +} + +void BackupDlg::updateGUI() +{ + 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_BACKUPDIRGRP_STATIC), 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); +} \ No newline at end of file diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp.bak b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp.bak new file mode 100644 index 00000000..050e4ae7 --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp.bak @@ -0,0 +1,1213 @@ +#include +#include "preferenceDlg.h" +#include "SysMsg.h" + +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("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); + + _wVector.push_back(DlgInfo(&_barsDlg, "Global", "Global")); + _wVector.push_back(DlgInfo(&_marginsDlg, "Edit Components", "Scintillas")); + _wVector.push_back(DlgInfo(&_defaultNewDocDlg, "New Document", "NewDoc")); + _wVector.push_back(DlgInfo(&_fileAssocDlg, "File Association", "FileAssoc")); + _wVector.push_back(DlgInfo(&_langMenuDlg, "Language Menu", "LangMenu")); + _wVector.push_back(DlgInfo(&_printSettingsDlg, "Print - Colour and Marge", "Print1")); + _wVector.push_back(DlgInfo(&_printSettings2Dlg, "Print - Header and Footer", "Print2")); + _wVector.push_back(DlgInfo(&_settingsDlg, "MISC", "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); + + 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 showStatus = nppGUI._statusBarShow; + bool enableTaskList = nppGUI._doTaskList; + bool enableMaintainIndent = nppGUI._maitainIndent; + bool saveOpenKeepInSameDir = nppGUI._saveOpenKeepInSameDir; + bool styleMRU = nppGUI._styleMRU; + + int ID2Check = 0; + switch (tbStatus) + { + case TB_HIDE : + ID2Check = IDC_RADIO_HIDE; + break; + case TB_SMALL : + ID2Check = IDC_RADIO_SMALLICON; + break; + case TB_LARGE : + ID2Check = IDC_RADIO_BIGICON; + break; + + default : //TB_STANDARD + 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_SHOWSTATUSBAR, BM_SETCHECK, showStatus, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLEDOCSWITCHER, BM_SETCHECK, enableTaskList, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_MAINTAININDENT, BM_SETCHECK, enableMaintainIndent, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_KEEPINSAMEDIR, BM_SETCHECK, saveOpenKeepInSameDir, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_STYLEMRU, BM_SETCHECK, styleMRU, 0); + if (!nppGUI._doTaskList) + { + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_STYLEMRU), FALSE); + } + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + + return TRUE; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_CHECK_SHOWSTATUSBAR : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_STATUSBAR, 0); + return TRUE; + + case IDC_CHECK_ENABLEDOCSWITCHER : + { + NppGUI & nppGUI = (NppGUI &)NppParameters::getInstance()->getNppGUI(); + 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_KEEPINSAMEDIR : + { + NppGUI & nppGUI = (NppGUI &)NppParameters::getInstance()->getNppGUI(); + nppGUI._saveOpenKeepInSameDir = !nppGUI._saveOpenKeepInSameDir; + return TRUE; + } + + case IDC_CHECK_MAINTAININDENT : + { + NppGUI & nppGUI = (NppGUI &)NppParameters::getInstance()->getNppGUI(); + nppGUI._maitainIndent = !nppGUI._maitainIndent; + return TRUE; + } + + case IDC_CHECK_STYLEMRU : + { + NppGUI & nppGUI = (NppGUI &)NppParameters::getInstance()->getNppGUI(); + nppGUI._styleMRU = !nppGUI._styleMRU; + 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_RADIO_HIDE : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_TOOLBAR_HIDE, 0); + 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; + } + } + } + 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_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); + + char nbColStr[10]; + itoa(svp._edgeNbColumn, nbColStr, 10); + ::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) +{ + switch (Message) + { + case WM_INITDIALOG : + { + _verticalEdgeLineNbColVal.init(_hInst, _hSelf); + _verticalEdgeLineNbColVal.create(::GetDlgItem(_hSelf, IDC_COLONENUMBER_STATIC), IDM_SETTING_EDGE_SIZE); + + ::SendDlgItemMessage(_hSelf, IDC_COMBO_SCINTILLAVIEWCHOIX, CB_ADDSTRING, 0, (LPARAM)"Primary View"); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_SCINTILLAVIEWCHOIX, CB_ADDSTRING, 0, (LPARAM)"Second View"); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_SCINTILLAVIEWCHOIX, CB_SETCURSEL, 0, 0); + + changePanelTo(SCIV_PRIMARY); + + NppParameters *pNppParam = NppParameters::getInstance(); + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + return TRUE; + } + case WM_COMMAND : + { + NppParameters *pNppParam = NppParameters::getInstance(); + + 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 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_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); + char nbColStr[10]; + itoa(svp._edgeNbColumn, nbColStr, 10); + ::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; + } + 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 : + { + char nbStr[10]; + itoa(nppGUI._tabSize, nbStr, 10); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); + + _tabSizeVal.init(_hInst, _hSelf); + _tabSizeVal.create(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), IDM_SETTING_TAB_SIZE); + + itoa(pNppParam->getNbMaxFile(), nbStr, 10); + ::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_REPLACEBYSPACE, BM_SETCHECK, nppGUI._tabReplacedBySpace, 0); + ::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 //cdDisabled + { + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_UPDATESILENTLY), FALSE); + } + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_MIN2SYSTRAY, BM_SETCHECK, nppGUI._isMinimizedToTray, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_REMEMBERSESSION, BM_SETCHECK, nppGUI._rememberLastSession, 0); + + 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); + + + 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); + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + + return TRUE; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_CHECK_REPLACEBYSPACE: + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_TAB_REPLCESPACE, 0); + return TRUE; + case IDC_CHECK_DONTCHECKHISTORY: + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_HISTORY_DONT_CHECK, 0); + return TRUE; + + case IDC_CHECK_FILEAUTODETECTION: + { + bool isChecked = isCheckedOrNot(IDC_CHECK_FILEAUTODETECTION); + if (!isChecked) + ::SendDlgItemMessage(_hSelf, IDC_CHECK_UPDATESILENTLY, BM_SETCHECK, BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_UPDATESILENTLY), isChecked); + ::SendMessage(_hParent, WM_COMMAND, isChecked?IDM_SETTING_FILE_AUTODETECTION_ENABLE:IDM_SETTING_FILE_AUTODETECTION_DISABLE, 0); + } + return TRUE; + + case IDC_CHECK_UPDATESILENTLY: + { + bool isChecked = isCheckedOrNot(IDC_CHECK_UPDATESILENTLY); + ::SendMessage(_hParent, WM_COMMAND, isChecked?IDM_SETTING_FILE_AUTODETECTION_ENABLESILENTLY:IDM_SETTING_FILE_AUTODETECTION_ENABLE, 0); + } + 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_MIN2SYSTRAY: + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_TRAYICON, 0); + return TRUE; + case IDC_CHECK_REMEMBERSESSION: + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_REMEMBER_LAST_SESSION, 0); + return TRUE; + case IDM_SETTING_TAB_SIZE: + { + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_TAB_SIZE, 0); + char nbStr[10]; + itoa(nppGUI._tabSize, nbStr, 10); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); + return TRUE; + } + case IDM_SETTING_HISTORY_SIZE: + { + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_HISTORY_SIZE, 0); + char nbStr[10]; + itoa(pNppParam->getNbMaxFile(), nbStr, 10); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_MAXNBFILEVAL_STATIC), nbStr); + return TRUE; + } + case IDC_RADIO_BKSIMPLE: + { + nppGUI._backup = bak_simple; + return TRUE; + } + + case IDC_RADIO_BKVERBOSE: + { + nppGUI._backup = bak_verbose; + return TRUE; + } + + case IDC_RADIO_BKNONE: + { + nppGUI._backup = bak_none; + return TRUE; + } + } + } + } + return FALSE; +} + +BOOL CALLBACK DefaultNewDocDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + const 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); + + int index = 0; + for (int i = L_TXT ; i < L_END ; i++) + { + string str; + //if ((LangType)i != L_END) + { + int cmdID = pNppParam->langTypeToCommandID((LangType)i); + if (getNameStrFromCmd(cmdID, str) == TYPE_CMD) + { + _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); + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_RADIO_UCS2BIG: + ndds._encoding = uni16BE; + return TRUE; + case IDC_RADIO_UCS2SMALL: + ndds._encoding = uni16LE; + return TRUE; + case IDC_RADIO_UTF8: + ndds._encoding = uniUTF8; + return TRUE; + case IDC_RADIO_UTF8SANSBOM: + ndds._encoding = uniCookie; + return TRUE; + case IDC_RADIO_ANSI: + ndds._encoding = uni8Bit; + 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; + + 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 < L_END ; i++) + { + string str; + if ((LangType)i != L_USER) + { + int cmdID = pNppParam->langTypeToCommandID((LangType)i); + if (getNameStrFromCmd(cmdID, str) == TYPE_CMD) + { + _langList.push_back(LangMenuItem((LangType)i, cmdID, str)); + ::SendDlgItemMessage(_hSelf, IDC_LIST_ENABLEDLANG, LB_ADDSTRING, 0, (LPARAM)str.c_str()); + //printStr(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()); + } + + + ::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_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); + char 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); + + HWND grandParent; + //::SendMessage(_hParent, WM_GETPARENTOF, (WPARAM)&grandParent, 0); + grandParent = ::GetParent(_hParent); + + if (LOWORD(wParam)==IDC_BUTTON_REMOVE) + { + ::DeleteMenu(::GetMenu(grandParent), lmi._cmdID, MF_BYCOMMAND); + } + else + { + ::InsertMenu(::GetSubMenu(::GetMenu(grandParent), 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); + + char valStr[10]; + ::SendDlgItemMessage(_hSelf, IDC_EDIT_ML, WM_SETTEXT, 0, (LPARAM)itoa(nppGUI._printSettings._marge.left, valStr, 10)); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_MR, WM_SETTEXT, 0, (LPARAM)itoa(nppGUI._printSettings._marge.right, valStr, 10)); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_MT, WM_SETTEXT, 0, (LPARAM)itoa(nppGUI._printSettings._marge.top, valStr, 10)); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_MB, WM_SETTEXT, 0, (LPARAM)itoa(nppGUI._printSettings._marge.bottom, valStr, 10)); + + 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(string & str) +{ + string::size_type pos = str.find_last_not_of(' '); + + if (pos != string::npos) + { + str.erase(pos + 1); + pos = str.find_first_not_of(' '); + if(pos != 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()); + + char intStr[5]; + for(size_t i = 6 ; i < 15 ; i++) + { + + itoa(i, intStr, 10); + ::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); + + itoa(nppGUI._printSettings._headerFontSize, intStr, 10); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_HFONTSIZE, CB_SELECTSTRING, -1, (LPARAM)intStr); + itoa(nppGUI._printSettings._footerFontSize, intStr, 10); + ::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("Full file name path", "$(FULL_CURRENT_PATH)")); + varList.push_back(strCouple("File name", "$(FILE_NAME)")); + varList.push_back(strCouple("File directory", "$(FULL_CURRENT_PATH)")); + varList.push_back(strCouple("Page", "$(CURRENT_PRINTING_PAGE)")); + varList.push_back(strCouple("Short date format", "$(SHORT_DATE)")); + varList.push_back(strCouple("Long date format", "$(LONG_DATE)")); + varList.push_back(strCouple("Time", "$(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) + { + char str[256]; + _focusedEditCtrl = LOWORD(wParam); + ::GetDlgItemText(_hSelf, _focusedEditCtrl, str, sizeof(str)); + ::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) + { + char str[256]; + _focusedEditCtrl = LOWORD(wParam); + ::GetDlgItemText(_hSelf, _focusedEditCtrl, str, sizeof(str)); + //_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, sizeof(str)); + string title = str; + title += " "; + ::GetDlgItemText(_hSelf, focusedEditStatic, str, sizeof(str)); + title += str; + title += " : "; + + ::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 : + { + char *fnStr = (char *)::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 : + { + char 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 = 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); + char *varStr = (char *)::SendDlgItemMessage(_hSelf, IDC_COMBO_VARLIST, CB_GETITEMDATA, iSel, 0); + + ::SendDlgItemMessage(_hSelf, _focusedEditCtrl, EM_GETSEL, (WPARAM)&_selStart, (LPARAM)&_selEnd); +/* + char toto[32]; + sprintf(toto, "_selStart = %d\r_selEnd = %d", _selStart, _selEnd); + ::MessageBox(NULL, toto, "", MB_OK); +*/ + char str[256]; + ::SendDlgItemMessage(_hSelf, _focusedEditCtrl, WM_GETTEXT, sizeof(str), (LPARAM)str); + //::MessageBox(NULL, str, "", MB_OK); + + string str2Set(str); + str2Set.replace(_selStart, _selEnd - _selStart, varStr); + + ::SetDlgItemText(_hSelf, _focusedEditCtrl, str2Set.c_str()); + } + break; + + } + return TRUE; + } + } + return FALSE; +} \ No newline at end of file diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.h b/PowerEditor/src/WinControls/Preference/preferenceDlg.h new file mode 100644 index 00000000..3c3562c4 --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.h @@ -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. +*/ + +#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() { + _tabSizeVal.destroy(); + _nbHistoryVal.destroy(); + }; +private : + URLCtrl _tabSizeVal; + 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() { + _verticalEdgeLineNbColVal.destroy(); + }; + +private : + URLCtrl _verticalEdgeLineNbColVal; + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + void changePanelTo(int index); +}; + +struct LangID_Name +{ + LangType _id; + string _name; + LangID_Name(LangType id, string name) : _id(id), _name(name){}; +}; + +class DefaultNewDocDlg : public StaticDialog +{ +public : + DefaultNewDocDlg() {}; +private : + std::vector _langList; + 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 : + void updateGUI(); + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); +}; + +struct strCouple { + string _varDesc; + string _var; + strCouple(char *varDesc, char *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/preferenceDlg.h.bak b/PowerEditor/src/WinControls/Preference/preferenceDlg.h.bak new file mode 100644 index 00000000..2d175231 --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.h.bak @@ -0,0 +1,171 @@ +/* +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() { + _tabSizeVal.destroy(); + _nbHistoryVal.destroy(); + }; +private : + URLCtrl _tabSizeVal; + 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() { + _verticalEdgeLineNbColVal.destroy(); + }; + +private : + URLCtrl _verticalEdgeLineNbColVal; + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + void changePanelTo(int index); +}; + +struct LangID_Name +{ + LangType _id; + string _name; + LangID_Name(LangType id, string name) : _id(id), _name(name){}; +}; + +class DefaultNewDocDlg : public StaticDialog +{ +public : + DefaultNewDocDlg() {}; +private : + std::vector _langList; + 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); +}; + +struct strCouple { + string _varDesc; + string _var; + strCouple(char *varDesc, char *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; +}; + + + +#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..b03b7868 --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preference_rc.h @@ -0,0 +1,160 @@ +/* +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_RADIO_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 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 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 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 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 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_BACKUPDIRGRP_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_EDIT (IDD_PREFERENCE_BACKUP_BOX + 4) + #define IDD_BACKUPDIR_BROWSE_BUTTON (IDD_PREFERENCE_BACKUP_BOX + 5) diff --git a/PowerEditor/src/WinControls/Preference/preference_rc.h.bak b/PowerEditor/src/WinControls/Preference/preference_rc.h.bak new file mode 100644 index 00000000..47f51fbf --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preference_rc.h.bak @@ -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. +*/ + +#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_RADIO_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 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 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 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 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 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) diff --git a/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp b/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp new file mode 100644 index 00000000..e0536330 --- /dev/null +++ b/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp @@ -0,0 +1,692 @@ +//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 "SysMsg.h" +#include "Splitter.h" +//#include "resource.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, "pas de pere?", "Splitter::init", MB_OK); + throw int(96); + } + if (iSplitRatio < 0) + { + ::MessageBox(NULL, "it shoulds be 0 < ratio < 100", "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, "it shoulds be 0 < ratio < 100", "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 = "fxdnsspliter"; + else + wcex.lpszClassName = "fxdwespliter"; + } + else + { + if (_dwFlags & SV_HORIZONTAL) + { + //double sided arrow pointing north-south as cursor + wcex.hCursor = ::LoadCursor(NULL,IDC_SIZENS); + wcex.lpszClassName = "nsspliter"; + } + else + { + // double sided arrow pointing east-west as cursor + wcex.hCursor = ::LoadCursor(NULL,IDC_SIZEWE); + wcex.lpszClassName = "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, + "", + dwStyle, + _rect.left, + _rect.top, + _rect.right, + _rect.bottom, + _hParent, + NULL, + _hInst, + (LPVOID)this); + + if (!_hSelf) + { + systemMessage("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; + ::SetWindowLong(hWnd, GWL_USERDATA, (long)pSplitter); + return TRUE; + } + default: + { + Splitter * pSplitter = (Splitter *)::GetWindowLong(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, "", "", 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..12d86495 --- /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 "SysMsg.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 = NULL; + + // 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("System Err"); + throw int(98); + } + _isRegistered = true; + } + + _hSelf = ::CreateWindowEx( + 0, + SPC_CLASS_NAME, + "a koi sert?", + WS_CHILD | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + _hParent, + NULL, + _hInst, + (LPVOID)this); + + if (!_hSelf) + { + systemMessage("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; + ::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast(pSplitterContainer)); + return TRUE; + + default : + pSplitterContainer = (SplitterContainer *)::GetWindowLong(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); + + 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, "Rotate to left"); + ::InsertMenu(_hPopupMenu, 0, MF_BYPOSITION, ROTATION_A_DROITE, "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..6adccde7 --- /dev/null +++ b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.h @@ -0,0 +1,100 @@ +//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 "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); + _splitter.display(toShow); + _pWin0->display(toShow); + _pWin1->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..3535b143 --- /dev/null +++ b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.cpp @@ -0,0 +1,266 @@ +//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(char *cmd2Exec, char *args, const char *cmdEntier) +{ + int i = 0; + for ( ; i < int(strlen(cmdEntier)) ; i++) + { + if (cmdEntier[i] != ' ') + cmd2Exec[i] = cmdEntier[i]; + else + break; + } + cmd2Exec[i] = '\0'; + + if (i < int(strlen(cmdEntier))) + { + for ( ; (i < int(strlen(cmdEntier))) && (cmdEntier[i] == ' ') ; i++); + if (i < int(strlen(cmdEntier))) + { + for (int k = 0 ; i <= int(strlen(cmdEntier)) ; i++, k++) + { + args[k] = cmdEntier[i]; + } + } + + int l = strlen(args); + if (args[l-1] == ' ') + { + for (l -= 2 ; (l > 0) && (args[l] == ' ') ; l--); + args[l+1] = '\0'; + } + + } + else + args[0] = '\0'; +} + + +int whichVar(char *str) +{ + if (!strcmp(fullCurrentPath, str)) + return FULL_CURRENT_PATH; + else if (!strcmp(currentDirectory, str)) + return CURRENT_DIRECTORY; + else if (!strcmp(onlyFileName, str)) + return FILE_NAME; + else if (!strcmp(fileNamePart, str)) + return NAME_PART; + else if (!strcmp(fileExtPart, str)) + return EXT_PART; + else if (!strcmp(currentWord, str)) + return CURRENT_WORD; + else if (!strcmp(nppDir, str)) + return NPP_DIRECTORY; + return VAR_NOT_RECOGNIZED; +} + +// Since I'm sure the length will be 256, I won't check the strlen : watch out! +void expandNppEnvironmentStrs(const char *strSrc, char *stringDest, size_t strDestLen, HWND hWnd) +{ + size_t j = 0; + for (size_t i = 0 ; i < strlen(strSrc) ; i++) + { + int iBegin = -1; + int iEnd = -1; + if ((strSrc[i] == '$') && (strSrc[i+1] == '(')) + { + iBegin = i += 2; + for ( ; i < strlen(strSrc) ; i++) + { + if (strSrc[i] == ')') + { + iEnd = i - 1; + break; + } + } + } + if (iBegin != -1) + { + if (iEnd != -1) + { + char str[256]; + 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; + stringDest[j++] = strSrc[i]; + } + else + { + char expandedStr[256]; + ::SendMessage(hWnd, RUNCOMMAND_USER + internalVar, MAX_PATH, (LPARAM)expandedStr); + for (size_t p = 0 ; p < strlen(expandedStr) ; p++) + stringDest[j++] = expandedStr[p]; + } + } + else + { + i = iBegin - 2; + stringDest[j++] = strSrc[i]; + } + } + else + stringDest[j++] = strSrc[i]; + } + stringDest[j] = '\0'; +} + +HINSTANCE Command::run(HWND hWnd) +{ + char cmdPure[MAX_PATH]; + char cmdIntermediate[MAX_PATH]; + char cmd2Exec[MAX_PATH]; + char args[MAX_PATH]; + char argsIntermediate[MAX_PATH]; + char args2Exec[MAX_PATH]; + + extractArgs(cmdPure, args, _cmdLine.c_str()); + ::ExpandEnvironmentStrings(cmdPure, cmdIntermediate, sizeof(cmd2Exec)); + ::ExpandEnvironmentStrings(args, argsIntermediate, sizeof(args)); + expandNppEnvironmentStrs(cmdIntermediate, cmd2Exec, sizeof(cmd2Exec), hWnd); + expandNppEnvironmentStrs(argsIntermediate, args2Exec, sizeof(args2Exec), hWnd); + + return ::ShellExecute(hWnd, "open", cmd2Exec, args2Exec, ".", SW_SHOW); +} + +BOOL CALLBACK RunDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + {/* + case WM_INITDIALOG : + { + getClientRect(_rc); + return TRUE; + } + */ + + case WM_COMMAND : + { + switch (wParam) + { + case IDCANCEL : + display(false); + return TRUE; + + case IDOK : + { + char 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(); + + char cmd[MAX_PATH]; + ::GetDlgItemText(_hSelf, IDC_COMBO_RUN_PATH, cmd, MAX_PATH); + UserCommand uc(cmd); + uc.init(_hInst, _hSelf); + + if (uc.doDialog() != -1) + { + theUserCmds.push_back(uc); + + std::vector & userCommands = (NppParameters::getInstance())->getUserCommandList(); + HMENU hRunMenu = ::GetSubMenu(::GetMenu(_hParent), MENUINDEX_RUN); + int const posBase = 0; + int nbCmd = userCommands.size(); + if (nbCmd == 1) + ::InsertMenu(hRunMenu, posBase + 1, MF_BYPOSITION, (unsigned int)-1, 0); + //char menuString[64]; + //sprintf(menuString, "%s%s%s", uc._name, "\t", uc.toString().c_str()); + ::InsertMenu(hRunMenu, posBase + 1 + nbCmd, MF_BYPOSITION, ID_USER_CMD + nbCmd - 1, uc.toMenuItemString().c_str()); + + Accelerator *pAccel = (NppParameters::getInstance())->getAccelerator(); + pAccel->uptdateShortcuts(); + ::SendMessage(_hParent, NPPM_INTERNAL_USERCMDLIST_MODIFIED, 0, 0); + } + return TRUE; + } + case IDC_BUTTON_FILE_BROWSER : + { + FileDialog fd(_hSelf, _hInst); + fd.setExtFilter("Executable file : ", ".exe", ".com", ".cmd", ".bat", NULL); + fd.setExtFilter("All files : ", ".*", NULL); + + if (const char *fn = fd.doOpenSingleFileDlg()) + addTextToCombo(fn); + return TRUE; + } + + default : + break; + } + } + } + return FALSE; +} + +void RunDlg::addTextToCombo(const char *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 char *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..8d511b79 --- /dev/null +++ b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.h @@ -0,0 +1,72 @@ +//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 + +//static void extractArgs(char *cmd2Exec, char *args, const char *cmdEntier); + +using namespace std; + +const char fullCurrentPath[] = "FULL_CURRENT_PATH"; +const char currentDirectory[] = "CURRENT_DIRECTORY"; +const char onlyFileName[] = "FILE_NAME"; +const char fileNamePart[] = "NAME_PART"; +const char fileExtPart[] = "EXT_PART"; +const char currentWord[] = "CURRENT_WORD"; +const char nppDir[] = "NPP_DIRECTORY"; + +int whichVar(char *str); +void expandNppEnvironmentStrs(const char *strSrc, char *stringDest, size_t strDestLen, HWND hWnd); + +class Command { +public : + Command(){}; + Command(char *cmd) : _cmdLine(cmd){}; + Command(string cmd) : _cmdLine(cmd){}; + HINSTANCE run(HWND hWnd); + +protected : + string _cmdLine; +private : + void extractArgs(char *cmd2Exec, char *args, const char *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 char *txt2Add) const; + void removeTextFromCombo(const char *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..96d850e8 --- /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, "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..6d177550 --- /dev/null +++ b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp @@ -0,0 +1,137 @@ +//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 "SysMsg.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); +} + +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("StaticDialog"); + throw int(666); + } + + ::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; + ::SetWindowLong(hwnd, GWL_USERDATA, (long)lParam); + ::GetWindowRect(hwnd, &(pStaticDlg->_rc)); + pStaticDlg->run_dlgProc(message, wParam, lParam); + + return TRUE; + } + + default : + { + StaticDialog *pStaticDlg = reinterpret_cast(::GetWindowLong(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..3c094b2b --- /dev/null +++ b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.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 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()) + destroy(); + }; + virtual void create(int dialogID, bool isRTL = false); + + virtual bool isCreated() const { + return (_hSelf != NULL); + }; + + void goToCenter(); + + 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..3fbe0952 --- /dev/null +++ b/PowerEditor/src/WinControls/StatusBar/StatusBar.cpp @@ -0,0 +1,76 @@ +//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" + +//#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, + "", + WS_CHILD | SBARS_SIZEGRIP , + 0, 0, 0, 0, + _hParent, + NULL, + _hInst, + 0); + + if (!_hSelf) + { + systemMessage("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); +} + +void StatusBar::adjustParts(RECT & myRc) +{ + // Calculate the right edge coordinate for each part, and + // copy the coordinates to the array. + int nWidth = myRc.right - 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..9eeb02ed --- /dev/null +++ b/PowerEditor/src/WinControls/StatusBar/StatusBar.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 STATUS_BAR_H +#define STATUS_BAR_H +#include "Window.h" + +#ifndef _WIN32_IE +#define _WIN32_IE 0x0600 +#endif //_WIN32_IE + +#include +#include "SysMsg.h" + +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); + redraw(); + }; + + + int getHeight() const { + if (!::IsWindowVisible(_hSelf)) + return 0; + return Window::getHeight(); + }; + + bool setText(const char *str, int whichPart) const { + if (whichPart > _nbParts) + return false; + return (::SendMessage(_hSelf, SB_SETTEXT, whichPart, (LPARAM)str) == TRUE); + }; + +private : + int _nbParts; + int *_partWidthArray; + + HLOCAL _hloc; + LPINT _lpParts; + + void adjustParts(RECT & myRc); +}; + +#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..80944358 --- /dev/null +++ b/PowerEditor/src/WinControls/TabBar/ControlsTab.h @@ -0,0 +1,111 @@ +/* +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; + char _name[64]; + char _internalName[32]; + + DlgInfo(Window *dlg, char *name, char *internalName = NULL): _dlg(dlg) { + strcpy(_name, name); + if (!internalName) + _internalName[0] = '\0'; + else + strcpy(_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 char *newName) { + TCITEM tie; + tie.mask = TCIF_TEXT; + tie.pszText = (LPSTR)newName; + tie.cchTextMax = (sizeof(newName)); + TabCtrl_SetItem(_hSelf, index, &tie); + }; + + bool renameTab(const char *internalName, const char *newName) { + bool foundIt = false; + size_t i = 0; + for ( ; i < _pWinVector->size() ; i++) + { + if (!strcmp((*_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..47142aa4 --- /dev/null +++ b/PowerEditor/src/WinControls/TabBar/TabBar.cpp @@ -0,0 +1,623 @@ +//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 "SysMsg.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 + +bool TabBarPlus::_doDragNDrop = false; + +bool TabBarPlus::_drawTopBar = true; +bool TabBarPlus::_drawInactiveTab = true; +bool TabBarPlus::_drawTabCloseButton = false; +bool TabBarPlus::_isDbClk2Close = false; + +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; + 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, + "Tab", + style, + 0, 0, 0, 0, + _hParent, + NULL, + _hInst, + 0); + + if (!_hSelf) + { + systemMessage("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, "The nb of Tab Control is over its limit", "Tab Control err", MB_OK); + destroy(); + throw int(96); + } + _hwndArray[i] = _hSelf; + _ctrlID = i; + } + _nbCtrl++; + } + */ +} + +int TabBar::insertAtEnd(const char *subTabName) +{ + TCITEM tie; + tie.mask = TCIF_TEXT | TCIF_IMAGE; + int index = -1; + + if (_hasImgLst) + index = 0; + tie.iImage = index; + tie.pszText = (char *)subTabName; + return int(::SendMessage(_hSelf, TCM_INSERTITEM, _nbItem++, reinterpret_cast(&tie))); +} + +void TabBar::getCurrentTitle(char *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::reSizeTo(RECT & rc2Ajust) +{ + // Important to do that! + // Otherwise, the window(s) it contains will take all the resouce of CPU + // We don't need to resiz the contained windows if they are even invisible anyway! + display(rc2Ajust.right > 10); + + RECT rc = rc2Ajust; + + Window::reSizeTo(rc); + TabCtrl_AdjustRect(_hSelf, FALSE, &rc2Ajust); +} + +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; + 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_FOCUSNEVER | TCS_TABS | vertical | multiLine; + + //if (isOwnerDrawTab() && (!_isTraditional)) + { + style |= TCS_OWNERDRAWFIXED; + //printStr("ownerDraw"); + } + _hSelf = ::CreateWindowEx( + /*TCS_EX_FLATSEPARATORS */0, + WC_TABCONTROL, + "Tab", + style, + 0, 0, 0, 0, + _hParent, + NULL, + _hInst, + 0); + + if (!_hSelf) + { + systemMessage("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, "The nb of Tab Control is over its limit", "Tab Control err", MB_OK); + destroy(); + throw int(96); + } + _hwndArray[i] = _hSelf; + _ctrlID = i; + } + _nbCtrl++; + + ::SetWindowLong(_hSelf, GWL_USERDATA, reinterpret_cast(this)); + _tabBarDefaultProc = reinterpret_cast(::SetWindowLong(_hSelf, GWL_WNDPROC, reinterpret_cast(TabBarPlus_Proc))); + } + + if (vertical) + { + _hFont = ::CreateFont( 14, 0, 0, 0, + FW_NORMAL, + 0, 0, 0, 0, + 0, 0, 0, 0, + "Comic Sans MS"); + if (_hFont) + ::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast(_hFont), 0); + } +/* + if (isOwnerDrawTab() && (!_isTraditional)) + ::SendMessage(_hSelf, TCM_SETPADDING, 0, MAKELPARAM(6, 5)); +*/ +} + +LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + 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); + if (wParam == 2) + return TRUE; + + + + if (_doDragNDrop) + { + _nSrcTab = _nTabDragged = ::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0); + + 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); + return TRUE; + } + break; + } + else + 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) + { + ::SendMessage(_hSelf, TCM_GETITEMRECT, index, (LPARAM)&_currentHoverTabRect); + _currentHoverTabItem = index; + } + bool oldVal = _isCloseHover; + _isCloseHover = _closeButtonZone.isHit(xPos, yPos, _currentHoverTabRect); + if (oldVal != _isCloseHover) + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_REFRESHTABAR, 0); + + } + + break; + } + + case WM_LBUTTONUP : + { + 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 + NMHDR nmhdr; + nmhdr.hwndFrom = _hSelf; + nmhdr.code = _isDraggingInside?TCN_TABDROPPED:TCN_TABDROPPEDOUTSIDE; + nmhdr.idFrom = reinterpret_cast(this); + + ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); + return TRUE; + } + + if (_drawTabCloseButton) + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + + int currentTabOn = getTabIndexAt(xPos, yPos); + + if ((_whichCloseClickDown == currentTabOn) && _closeButtonZone.isHit(xPos, yPos, _currentHoverTabRect)) + { + NMHDR nmhdr; + nmhdr.hwndFrom = _hSelf; + nmhdr.code = TCN_TABDELETE; + nmhdr.idFrom = reinterpret_cast(this); + + ::CallWindowProc(_tabBarDefaultProc, hwnd, WM_LBUTTONDOWN, wParam, lParam); + ::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: + { + ::CallWindowProc(_tabBarDefaultProc, hwnd, WM_LBUTTONDOWN, wParam, lParam); + + NMHDR nmhdr; + nmhdr.hwndFrom = _hSelf; + nmhdr.code = TCN_TABDELETE; + nmhdr.idFrom = reinterpret_cast(this); + + ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); + return TRUE; + } + + case WM_LBUTTONDBLCLK : + { + ::CallWindowProc(_tabBarDefaultProc, hwnd, WM_LBUTTONDOWN, wParam, lParam); + if (_isDbClk2Close) + { + NMHDR nmhdr; + nmhdr.hwndFrom = _hSelf; + nmhdr.code = TCN_TABDELETE; + nmhdr.idFrom = reinterpret_cast(this); + + ::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, "nTab < 0", "", MB_OK); + //return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam); + } + bool isSelected = (nTab == ::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0)); + + char 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, "! TCM_GETITEM", "", MB_OK); + //return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam); + } + 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". + rect.top += ::GetSystemMetrics(SM_CYEDGE); + + ::SetBkMode(hDC, TRANSPARENT); + HBRUSH hBrush = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE)); + ::FillRect(hDC, &rect, hBrush); + ::DeleteObject((HGDIOBJ)hBrush); + + if (isSelected) + { + if (_drawTopBar) + { + RECT barRect = rect; + barRect.bottom = 6; + + hBrush = ::CreateSolidBrush(RGB(250, 170, 60)); + ::FillRect(hDC, &barRect, hBrush); + ::DeleteObject((HGDIOBJ)hBrush); + } + } + else + { + if (_drawInactiveTab) + { + RECT barRect = rect; + + hBrush = ::CreateSolidBrush(RGB(192, 192, 192)); + ::FillRect(hDC, &barRect, hBrush); + ::DeleteObject((HGDIOBJ)hBrush); + } + } + + if (_drawTabCloseButton) + { + RECT closeButtonRect = _closeButtonZone.getButtonRectFrom(rect); + if (isSelected) + 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); + + ::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, " ", 1, &charPixel); + int spaceUnit = charPixel.cx; + + if (hImgLst && tci.iImage >= 0) + { + IMAGEINFO info; + + ImageList_GetImageInfo(hImgLst, tci.iImage, &info); + + RECT & imageRect = info.rcImage; + int yPos = (rect.top + (rect.bottom - rect.top)/2 + (isSelected?0:2)) - (imageRect.bottom - imageRect.top)/2; + + int marge = 0; + + if (isSelected) + { + marge = spaceUnit*2; + } + else + { + marge = spaceUnit; + } + + rect.left += marge; + ImageList_Draw(hImgLst, tci.iImage, hDC, rect.left, yPos, isSelected?ILD_TRANSPARENT:ILD_SELECTED); + rect.left += imageRect.right - imageRect.left; + } + + if (isSelected) + { + COLORREF selectedColor = RGB(0, 0, 0); + ::SetTextColor(hDC, selectedColor); + rect.top -= ::GetSystemMetrics(SM_CYEDGE); + rect.top += 1; + rect.left += _drawTabCloseButton?spaceUnit:0; + ::DrawText(hDC, label, strlen(label), &rect, DT_SINGLELINE | DT_VCENTER | (_drawTabCloseButton?DT_LEFT:DT_CENTER)); + } + else + { + COLORREF unselectedColor = grey; + ::SetTextColor(hDC, unselectedColor); + rect.left += _drawTabCloseButton?spaceUnit:0; + ::DrawText(hDC, label, strlen(label), &rect, DT_SINGLELINE| DT_BOTTOM | (_drawTabCloseButton?DT_LEFT:DT_CENTER)); + } + ::RestoreDC(hDC, nSavedDC); +} + + +void TabBarPlus::draggingCursor(POINT screenPoint) +{ + HWND hWin = ::WindowFromPoint(screenPoint); + if (_hSelf == hWin) + ::SetCursor(::LoadCursor(NULL, IDC_ARROW)); + else + { + char className[256]; + ::GetClassName(hWin, className, 256); + if ((!strcmp(className, "Scintilla")) || (!strcmp(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 + ::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_INTERDIT_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; + char str1[256]; + char str2[256]; + + itemData_nDraggedTab.pszText = str1; + itemData_nDraggedTab.cchTextMax = (sizeof(str1)); + + itemData_shift.pszText = str2; + itemData_shift.cchTextMax = (sizeof(str2)); + + ::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.cpp.bak b/PowerEditor/src/WinControls/TabBar/TabBar.cpp.bak new file mode 100644 index 00000000..0bb9363f --- /dev/null +++ b/PowerEditor/src/WinControls/TabBar/TabBar.cpp.bak @@ -0,0 +1,612 @@ +//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 "SysMsg.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 + +bool TabBarPlus::_doDragNDrop = false; + +bool TabBarPlus::_drawTopBar = true; +bool TabBarPlus::_drawInactiveTab = true; +bool TabBarPlus::_drawTabCloseButton = false; +bool TabBarPlus::_isDbClk2Close = false; + +HWND TabBar::_hwndArray[nbCtrlMax] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; +int TabBar::_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; + 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( + TCS_EX_FLATSEPARATORS , + WC_TABCONTROL, + "Tab", + style, + 0, 0, 0, 0, + _hParent, + NULL, + _hInst, + 0); + + if (!_hSelf) + { + systemMessage("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, "The nb of Tab Control is over its limit", "Tab Control err", MB_OK); + destroy(); + throw int(96); + } + _hwndArray[i] = _hSelf; + _ctrlID = i; + } + _nbCtrl++; + } +} + +int TabBar::insertAtEnd(char *subTabName) +{ + TCITEM tie; + tie.mask = TCIF_TEXT | TCIF_IMAGE; + int index = -1; + + if (_hasImgLst) + index = 0; + tie.iImage = index; + tie.pszText = subTabName; + return int(::SendMessage(_hSelf, TCM_INSERTITEM, _nbItem++, reinterpret_cast(&tie))); +} + +void TabBar::reSizeTo(RECT & rc2Ajust) +{ + // Important to do that! + // Otherwise, the window(s) it contains will take all the resouce of CPU + // We don't need to resiz the contained windows if they are even invisible anyway! + display(rc2Ajust.right > 10); + + RECT rc = rc2Ajust; + + Window::reSizeTo(rc); + TabCtrl_AdjustRect(_hSelf, FALSE, &rc2Ajust); +} + +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; + 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; + + //if (isOwnerDrawTab() && (!_isTraditional)) + { + style |= TCS_OWNERDRAWFIXED; + //printStr("ownerDraw"); + } + _hSelf = ::CreateWindowEx( + TCS_EX_FLATSEPARATORS , + WC_TABCONTROL, + "Tab", + style, + 0, 0, 0, 0, + _hParent, + NULL, + _hInst, + 0); + + if (!_hSelf) + { + systemMessage("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, "The nb of Tab Control is over its limit", "Tab Control err", MB_OK); + destroy(); + throw int(96); + } + _hwndArray[i] = _hSelf; + _ctrlID = i; + } + _nbCtrl++; + + ::SetWindowLong(_hSelf, GWL_USERDATA, reinterpret_cast(this)); + _tabBarDefaultProc = reinterpret_cast(::SetWindowLong(_hSelf, GWL_WNDPROC, reinterpret_cast(TabBarPlus_Proc))); + } + + if (vertical) + { + _hFont = ::CreateFont( 14, 0, 0, 0, + FW_NORMAL, + 0, 0, 0, 0, + 0, 0, 0, 0, + "Comic Sans MS"); + if (_hFont) + ::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast(_hFont), 0); + } +/* + if (isOwnerDrawTab() && (!_isTraditional)) + ::SendMessage(_hSelf, TCM_SETPADDING, 0, MAKELPARAM(6, 5)); +*/ +} + +LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + 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); + if (wParam == 2) + return TRUE; + + + + if (_doDragNDrop) + { + _nSrcTab = _nTabDragged = ::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0); + + 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); + return TRUE; + } + break; + } + else + 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) + { + ::SendMessage(_hSelf, TCM_GETITEMRECT, index, (LPARAM)&_currentHoverTabRect); + _currentHoverTabItem = index; + } + bool oldVal = _isCloseHover; + _isCloseHover = _closeButtonZone.isHit(xPos, yPos, _currentHoverTabRect); + if (oldVal != _isCloseHover) + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_REFRESHTABAR, 0); + + } + + break; + } + + case WM_LBUTTONUP : + { + 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 + NMHDR nmhdr; + nmhdr.hwndFrom = _hSelf; + nmhdr.code = _isDraggingInside?TCN_TABDROPPED:TCN_TABDROPPEDOUTSIDE; + nmhdr.idFrom = reinterpret_cast(this); + + ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); + return TRUE; + } + + if (_drawTabCloseButton) + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + + int currentTabOn = getTabIndexAt(xPos, yPos); + + if ((_whichCloseClickDown == currentTabOn) && _closeButtonZone.isHit(xPos, yPos, _currentHoverTabRect)) + { + NMHDR nmhdr; + nmhdr.hwndFrom = _hSelf; + nmhdr.code = TCN_TABDELETE; + nmhdr.idFrom = reinterpret_cast(this); + + ::CallWindowProc(_tabBarDefaultProc, hwnd, WM_LBUTTONDOWN, wParam, lParam); + ::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: + { + ::CallWindowProc(_tabBarDefaultProc, hwnd, WM_LBUTTONDOWN, wParam, lParam); + + NMHDR nmhdr; + nmhdr.hwndFrom = _hSelf; + nmhdr.code = TCN_TABDELETE; + nmhdr.idFrom = reinterpret_cast(this); + + ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); + return TRUE; + } + + case WM_LBUTTONDBLCLK : + { + ::CallWindowProc(_tabBarDefaultProc, hwnd, WM_LBUTTONDOWN, wParam, lParam); + if (_isDbClk2Close) + { + NMHDR nmhdr; + nmhdr.hwndFrom = _hSelf; + nmhdr.code = TCN_TABDELETE; + nmhdr.idFrom = reinterpret_cast(this); + + ::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, "nTab < 0", "", MB_OK); + //return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam); + } + bool isSelected = (nTab == ::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0)); + + char label[64]; + TCITEM tci; + tci.mask = TCIF_TEXT|TCIF_IMAGE; + tci.pszText = label; + tci.cchTextMax = MAX_PATH; + + if (!::SendMessage(_hSelf, TCM_GETITEM, nTab, reinterpret_cast(&tci))) + { + ::MessageBox(NULL, "! TCM_GETITEM", "", MB_OK); + //return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam); + } + 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". + rect.top += ::GetSystemMetrics(SM_CYEDGE); + + ::SetBkMode(hDC, TRANSPARENT); + HBRUSH hBrush = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE)); + ::FillRect(hDC, &rect, hBrush); + ::DeleteObject((HGDIOBJ)hBrush); + + if (isSelected) + { + if (_drawTopBar) + { + RECT barRect = rect; + barRect.bottom = 6; + + hBrush = ::CreateSolidBrush(RGB(250, 170, 60)); + ::FillRect(hDC, &barRect, hBrush); + ::DeleteObject((HGDIOBJ)hBrush); + } + } + else + { + if (_drawInactiveTab) + { + RECT barRect = rect; + + hBrush = ::CreateSolidBrush(RGB(192, 192, 192)); + ::FillRect(hDC, &barRect, hBrush); + ::DeleteObject((HGDIOBJ)hBrush); + } + } + + if (_drawTabCloseButton) + { + RECT closeButtonRect = _closeButtonZone.getButtonRectFrom(rect); + if (isSelected) + 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); + + ::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, " ", 1, &charPixel); + int spaceUnit = charPixel.cx; + + if (hImgLst && tci.iImage >= 0) + { + IMAGEINFO info; + + ImageList_GetImageInfo(hImgLst, tci.iImage, &info); + + RECT & imageRect = info.rcImage; + int yPos = (rect.top + (rect.bottom - rect.top)/2 + (isSelected?0:2)) - (imageRect.bottom - imageRect.top)/2; + + int marge = 0; + + if (isSelected) + { + marge = spaceUnit*2; + } + else + { + marge = spaceUnit; + } + + rect.left += marge; + ImageList_Draw(hImgLst, tci.iImage, hDC, rect.left, yPos, isSelected?ILD_TRANSPARENT:ILD_SELECTED); + rect.left += imageRect.right - imageRect.left; + } + + if (isSelected) + { + COLORREF selectedColor = RGB(0, 0, 0); + ::SetTextColor(hDC, selectedColor); + rect.top -= ::GetSystemMetrics(SM_CYEDGE); + rect.top += 1; + rect.left += _drawTabCloseButton?spaceUnit:0; + ::DrawText(hDC, label, strlen(label), &rect, DT_SINGLELINE | DT_VCENTER | (_drawTabCloseButton?DT_LEFT:DT_CENTER)); + } + else + { + COLORREF unselectedColor = grey; + ::SetTextColor(hDC, unselectedColor); + rect.left += _drawTabCloseButton?spaceUnit:0; + ::DrawText(hDC, label, strlen(label), &rect, DT_SINGLELINE| DT_BOTTOM | (_drawTabCloseButton?DT_LEFT:DT_CENTER)); + } + ::RestoreDC(hDC, nSavedDC); +} + + +void TabBarPlus::draggingCursor(POINT screenPoint) +{ + HWND hWin = ::WindowFromPoint(screenPoint); + if (_hSelf == hWin) + ::SetCursor(::LoadCursor(NULL, IDC_ARROW)); + else + { + char className[256]; + ::GetClassName(hWin, className, 256); + if ((!strcmp(className, "Scintilla")) || (!strcmp(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 + ::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_INTERDIT_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; + char str1[256]; + char str2[256]; + + itemData_nDraggedTab.pszText = str1; + itemData_nDraggedTab.cchTextMax = (sizeof(str1)); + + itemData_shift.pszText = str2; + itemData_shift.cchTextMax = (sizeof(str2)); + + ::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..dc481c15 --- /dev/null +++ b/PowerEditor/src/WinControls/TabBar/TabBar.h @@ -0,0 +1,279 @@ +//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) + +const int marge = 8; +const int nbCtrlMax = 10; + +#include +#include "resource.h" + +class TabBar : public Window +{ +public: + TabBar() : Window(), _nbItem(0), _hasImgLst(false), _hFont(NULL){}; + + virtual ~TabBar() {}; + + virtual void destroy(){ + if (_hFont) + DeleteObject(_hFont); + + ::DestroyWindow(_hSelf); + _hSelf = NULL; + + /* + if ((!_isTraditional) && (_ctrlID != -1)) + { + _hwndArray[_ctrlID] = NULL; + _nbCtrl--; + } + */ + }; + + virtual void init(HINSTANCE hInst, HWND hwnd, bool isVertical = false, bool isTraditional = false, bool isMultiLine = false); + + virtual void reSizeTo(RECT & rc2Ajust); + + int insertAtEnd(const char *subTabName); + + void activateAt(int index) const { + ::SendMessage(_hSelf, TCM_SETCURSEL, index, 0); + }; + void getCurrentTitle(char *title, int titleLen); + + int getCurrentTabIndex() const { + return ::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0); + }; + void deletItemAt(int index) { + ::SendMessage(_hSelf, TCM_DELETEITEM, index, 0); + _nbItem--; + }; + + 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(char *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); + }; + +protected: + size_t _nbItem; + bool _hasImgLst; + HFONT _hFont; + + int _ctrlID; + bool _isTraditional; + + //static int _nbCtrl; + //static HWND _hwndArray[nbCtrlMax]; + + 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) {}; + 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 = ::GetWindowLong(_hwndArray[i], GWL_STYLE); + if (isOwnerDrawTab()) + style |= TCS_OWNERDRAWFIXED; + else + style &= ~TCS_OWNERDRAWFIXED; + + ::SetWindowLong(_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 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 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; + }; + +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 *)(::GetWindowLong(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 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); + }; +}; + +#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..fb037a4b --- /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 "SysMsg.h" +#include "TaskListDlg_rc.h" +#include "colors.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, + "", + WS_CHILD | listViewStyles, + 0, + 0, + 0, + 0, + _hParent, + (HMENU) NULL, + hInst, + NULL); + if (!_hSelf) + { + systemMessage("System Err"); + throw int(69); + } + + ::SetWindowLong(_hSelf, GWL_USERDATA, reinterpret_cast(this)); + _defaultProc = reinterpret_cast(::SetWindowLong(_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++) + { + char buf[MAX_PATH]; + ListView_GetItemText(_hSelf, i, 0, buf, sizeof(buf)); + 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("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("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..c9b0baf4 --- /dev/null +++ b/PowerEditor/src/WinControls/TaskList/TaskList.h @@ -0,0 +1,90 @@ +//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 +#include "SysMsg.h" + +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(char *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 *)(::GetWindowLong(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..e26980db --- /dev/null +++ b/PowerEditor/src/WinControls/TaskList/TaskListDlg.h @@ -0,0 +1,261 @@ +//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; + string _fn; + int _status; + TaskLstFnStatus(string str, int status) : _fn(str), _status(status){}; + TaskLstFnStatus(int iView, int docIndex, string str, int status) : _iView(iView), _docIndex(docIndex), _fn(str), _status(status) {}; +}; + +struct TaskListInfo { + vector _tlfsLst; + //int _indexPrimary; + //int _indexSecondary; + int _currentIndex; + //TaskListInfo() : _indexPrimary(0), _indexSecondary(0) {}; +}; + +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); + //NppParameters::getInstance()->_isTaskListRBUTTONUP_Active = true; + } + + 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("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 = (winVer)::SendMessage(_hParent, NPPM_GETWINDOWSVERSION, 0, 0); + _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 = (char *)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 char *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, " ", 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, strlen(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..1c5f69da --- /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, "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..48946e66 --- /dev/null +++ b/PowerEditor/src/WinControls/ToolBar/ToolBar.cpp @@ -0,0 +1,361 @@ +//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 "SysMsg.h" + +const bool ToolBar::REDUCED = true; +const bool ToolBar::ENLARGED = false; +const int WS_TOOLBARSTYLE = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS |TBSTYLE_FLAT | CCS_TOP | BTNS_AUTOSIZE; + +bool ToolBar::init(HINSTANCE hInst, HWND hPere, int iconSize, + ToolBarButtonUnit *buttonUnitArray, int arraySize, + bool doUglyStandardIcon, int *bmpArray, int bmpArraySize) +{ + Window::init(hInst, hPere); + _state = doUglyStandardIcon?TB_STANDARD:(iconSize >= 32?TB_LARGE:TB_SMALL); + _bmpArray = bmpArray; + _bmpArraySize = bmpArraySize; + + _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); + + _hSelf = ::CreateWindowEx( + WS_EX_PALETTEWINDOW , + TOOLBARCLASSNAME, + "", + WS_TOOLBARSTYLE, + 0, 0, + 0, 0, + _hParent, + NULL, + _hInst, + 0); + + if (!_hSelf) + { + systemMessage("System Err"); + throw int(9); + } + + // Send the TB_BUTTONSTRUCTSIZE message, which is required for + // backward compatibility. + ::SendMessage(_hSelf, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); + + if (!doUglyStandardIcon) + { + setDefaultImageList(); + setHotImageList(); + setDisableImageList(); + } + else + { + ::SendMessage(_hSelf, TB_LOADIMAGES, IDB_STD_SMALL_COLOR, reinterpret_cast(HINST_COMMCTRL)); + + if (bmpArray) + { + TBADDBITMAP addbmp = {_hInst, 0}; + for (int i = 0 ; i < _bmpArraySize ; i++) + { + if ((i == _bmpArraySize - 1) && (_vDynBtnReg.size() != 0)) + { + TBADDBITMAP addbmpdyn = {0, 0}; + for (size_t j = 0; j < _vDynBtnReg.size(); j++) + { + addbmpdyn.nID = (INT_PTR)_vDynBtnReg[j].hBmp; + ::SendMessage(_hSelf, TB_ADDBITMAP, 1, (LPARAM)&addbmpdyn); + } + } + + addbmp.nID = _bmpArray[i]; + ::SendMessage(_hSelf, TB_ADDBITMAP, 1, (LPARAM)&addbmp); + } + } + + } + + _pTBB = new TBBUTTON[_toolBarIcons.getNbCommand() + (_vDynBtnReg.size() ? _vDynBtnReg.size() + 1 : 0)]; + unsigned int nbElement = _toolBarIcons.getNbCommand(); + unsigned int nbDynIncPos = nbElement; + + if (doUglyStandardIcon) + { + nbDynIncPos -= 2; + nbElement += (_vDynBtnReg.size() ? _vDynBtnReg.size() + 1 : 0); + } + + int inc = 1; + + for (size_t i = 0, j = 0, k = 0; i < nbElement; i++) + { + int cmd = 0; + int bmpIndex, style; + + if ((i > nbDynIncPos) && (_vDynBtnReg.size() != 0) && (j <= _vDynBtnReg.size())) + { + if (j < _vDynBtnReg.size()) + { + cmd = _vDynBtnReg[j].message; + bmpIndex = (STD_PRINT + (inc++)); + style = BTNS_BUTTON; + } + else + { + bmpIndex = 0; + style = BTNS_SEP; + } + j++; + } + else + { + if ((cmd = _toolBarIcons.getCommandAt(i - j)) != 0) + { + if (doUglyStandardIcon) + { + int ibmp = _toolBarIcons.getUglyIconAt(i - j); + bmpIndex = (ibmp == -1)?(STD_PRINT + (inc++)):ibmp; + } + else + bmpIndex = k++; + + style = BTNS_BUTTON; + } + else + { + bmpIndex = 0; + style = BTNS_SEP; + } + } + _pTBB[i].iBitmap = bmpIndex; + _pTBB[i].idCommand = cmd; + _pTBB[i].fsState = TBSTATE_ENABLED; + _pTBB[i].fsStyle = style; + _pTBB[i].dwData = 0; + _pTBB[i].iString = 0; + + } + + setButtonSize(iconSize, iconSize); + + ::SendMessage(_hSelf, TB_ADDBUTTONS, (WPARAM)nbElement, (LPARAM)_pTBB); + ::SendMessage(_hSelf, TB_AUTOSIZE, 0, 0); + + return true; +} + +void ToolBar::reset() +{ + setDefaultImageList(); + setHotImageList(); + setDisableImageList(); + + if (_state == TB_STANDARD) + { + int cmdElement = _toolBarIcons.getNbCommand(); + int nbElement = cmdElement + (_vDynBtnReg.size() ? _vDynBtnReg.size() + 1 : 0); + + for (int i = 0, j = 0, k = nbElement-1 ; i < nbElement ; i++, k--) + { + int cmd = 0; + int bmpIndex, style; + + ::SendMessage(_hSelf, TB_DELETEBUTTON, k, 0); + + if (i >= cmdElement) + { + bmpIndex = -1; + cmd = 0; + style = 0; + } + else if ((cmd = _toolBarIcons.getCommandAt(i)) != 0) + { + bmpIndex = j++; + style = BTNS_BUTTON; + } + else + { + bmpIndex = 0; + style = BTNS_SEP; + } + _pTBB[i].iBitmap = bmpIndex; + _pTBB[i].idCommand = cmd; + _pTBB[i].fsState = TBSTATE_ENABLED; + _pTBB[i].fsStyle = style; + _pTBB[i].dwData = 0; + _pTBB[i].iString = 0; + } + + ::SendMessage(_hSelf, TB_ADDBUTTONS, (WPARAM)nbElement, (LPARAM)_pTBB); + } + + ::SendMessage(_hSelf, TB_AUTOSIZE, 0, 0); +} + +void ToolBar::setToUglyIcons() +{ + if (_state == TB_STANDARD) + return; + + // Due to the drawback of toolbar control (in-coexistence of Imagelist - custom icons and Bitmap - Std icons), + // We have to destroy the control then re-initialize it + ::DestroyWindow(_hSelf); + + //_state = REDUCED; + + _hSelf = ::CreateWindowEx( + WS_EX_PALETTEWINDOW , + TOOLBARCLASSNAME, + "", + WS_TOOLBARSTYLE, + 0, 0, + 0, 0, + _hParent, + NULL, + _hInst, + 0); + + if (!_hSelf) + { + systemMessage("System Err"); + throw int(9); + } + + // Send the TB_BUTTONSTRUCTSIZE message, which is required for + // backward compatibility. + ::SendMessage(_hSelf, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); + + ::SendMessage(_hSelf, TB_LOADIMAGES, IDB_STD_SMALL_COLOR, reinterpret_cast(HINST_COMMCTRL)); + + if (_bmpArray) + { + TBADDBITMAP addbmp = {_hInst, 0}; + for (int i = 0 ; i < _bmpArraySize ; i++) + { + if ((i == _bmpArraySize - 1) && (_vDynBtnReg.size() != 0)) + { + TBADDBITMAP addbmpdyn = {0, 0}; + for (size_t j = 0; j < _vDynBtnReg.size(); j++) + { + addbmpdyn.nID = (INT_PTR)_vDynBtnReg[j].hBmp; + ::SendMessage(_hSelf, TB_ADDBITMAP, 1, (LPARAM)&addbmpdyn); + } + } + + addbmp.nID = _bmpArray[i]; + ::SendMessage(_hSelf, TB_ADDBITMAP, 1, (LPARAM)&addbmp); + } + } + + unsigned int nbElement = _toolBarIcons.getNbCommand() + (_vDynBtnReg.size() ? _vDynBtnReg.size() + 1 : 0); + unsigned int nbDynIncPos = _toolBarIcons.getNbCommand() - 2; + int inc = 1; + + for (size_t i = 0, j = 0 ; i < nbElement ; i++) + { + int cmd = 0; + int bmpIndex, style; + + if ((i > nbDynIncPos) && (_vDynBtnReg.size() != 0) && (j <= _vDynBtnReg.size())) + { + if (j < _vDynBtnReg.size()) + { + cmd = _vDynBtnReg[j].message; + bmpIndex = (STD_PRINT + (inc++)); + style = BTNS_BUTTON; + } + else + { + bmpIndex = 0; + style = BTNS_SEP; + } + j++; + } + else + { + if ((cmd = _toolBarIcons.getCommandAt(i - j)) != 0) + { + int ibmp = _toolBarIcons.getUglyIconAt(i - j); + bmpIndex = (ibmp == -1)?(STD_PRINT + (inc++)):ibmp; + style = BTNS_BUTTON; + } + else + { + bmpIndex = 0; + style = BTNS_SEP; + } + } + _pTBB[i].iBitmap = bmpIndex; + _pTBB[i].idCommand = cmd; + _pTBB[i].fsState = TBSTATE_ENABLED; + _pTBB[i].fsStyle = style; + _pTBB[i].dwData = 0; + _pTBB[i].iString = 0; + + } + + setButtonSize(16, 16); + + ::SendMessage(_hSelf, TB_ADDBUTTONS, (WPARAM)nbElement, (LPARAM)_pTBB); + ::SendMessage(_hSelf, TB_AUTOSIZE, 0, 0); + _state = TB_STANDARD; +} + +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 ReBar::init(HINSTANCE hInst, HWND hPere, ToolBar *pToolBar) +{ + Window::init(hInst, hPere); + _pToolBar = pToolBar; + _hSelf = CreateWindowEx(WS_EX_TOOLWINDOW, + REBARCLASSNAME, + NULL, + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS| + WS_CLIPCHILDREN|RBS_VARHEIGHT| + CCS_NODIVIDER, + 0,0,0,0, _hParent, NULL, _hInst, NULL); + + + ::SendMessage(_hSelf, RB_SETBARINFO, 0, (LPARAM)&_rbi); + + + _rbBand.hwndChild = _pToolBar->getHSelf(); + + int dwBtnSize = SendMessage(_pToolBar->getHSelf(), TB_GETBUTTONSIZE, 0,0); + + _rbBand.cxMinChild = 34;//nbElement; + _rbBand.cyMinChild = HIWORD(dwBtnSize); + _rbBand.cx = 250; + ::SendMessage(_hSelf, RB_INSERTBAND, (WPARAM)0, (LPARAM)&_rbBand); +} + diff --git a/PowerEditor/src/WinControls/ToolBar/ToolBar.cpp.new b/PowerEditor/src/WinControls/ToolBar/ToolBar.cpp.new new file mode 100644 index 00000000..ce663f31 --- /dev/null +++ b/PowerEditor/src/WinControls/ToolBar/ToolBar.cpp.new @@ -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. + +//#include "..\..\resource.h" +#include "ToolBar.h" +#include "SysMsg.h" + +const bool ToolBar::REDUCED = true; +const bool ToolBar::ENLARGED = false; +const int WS_TOOLBARSTYLE = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS |TBSTYLE_FLAT | CCS_TOP | BTNS_AUTOSIZE; + +bool ToolBar::init(HINSTANCE hInst, HWND hPere, int iconSize, + ToolBarButtonUnit *buttonUnitArray, int arraySize, + bool doUglyStandardIcon, int *bmpArray, int bmpArraySize) +{ + Window::init(hInst, hPere); + _state = doUglyStandardIcon?TB_STANDARD:(iconSize >= 32?TB_LARGE:TB_SMALL); + _bmpArray = bmpArray; + _bmpArraySize = bmpArraySize; + + _toolBarIcons.init(buttonUnitArray, arraySize); + _toolBarIcons.create(_hInst, iconSize); + +// _state = (iconSize < 32)?REDUCED:ENLARGED; + + INITCOMMONCONTROLSEX icex; + icex.dwSize = sizeof(INITCOMMONCONTROLSEX); + icex.dwICC = ICC_BAR_CLASSES|ICC_COOL_CLASSES; + InitCommonControlsEx(&icex); + + + + _hToolBar = ::CreateWindowEx( + WS_EX_PALETTEWINDOW , + TOOLBARCLASSNAME, + "", + WS_TOOLBARSTYLE, + 0, 0, + 0, 0, + _hParent, + NULL, + _hInst, + 0); + + if (!_hToolBar) + { + systemMessage("System Err"); + throw int(9); + } + + // Send the TB_BUTTONSTRUCTSIZE message, which is required for + // backward compatibility. + ::SendMessage(_hToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); + + if (!doUglyStandardIcon) + { + setDefaultImageList(); + setHotImageList(); + setDisableImageList(); + } + else + { + ::SendMessage(_hToolBar, TB_LOADIMAGES, IDB_STD_SMALL_COLOR, reinterpret_cast(HINST_COMMCTRL)); + + TBADDBITMAP addbmp = {_hInst, 0}; + if (bmpArray) + { + for (int i = 0 ; i < _bmpArraySize ; i++) + { + addbmp.nID = _bmpArray[i]; + ::SendMessage(_hToolBar, TB_ADDBITMAP, 1, (LPARAM)&addbmp); + } + } + + } + int nbElement = _toolBarIcons.getNbCommand(); + + _pTBB = new TBBUTTON[nbElement]; + int inc = 1; + + for (int i = 0, j = 0; i < nbElement ; i++) + { + int cmd = 0; + int bmpIndex, style; + + if ((cmd = _toolBarIcons.getCommandAt(i)) != 0) + { + if (doUglyStandardIcon) + { + int ibmp = _toolBarIcons.getUglyIconAt(i); + bmpIndex = (ibmp == -1)?(STD_PRINT + (inc++)):ibmp; + } + else + bmpIndex = j++; + + style = BTNS_BUTTON; + } + else + { + bmpIndex = 0; + style = BTNS_SEP; + } + _pTBB[i].iBitmap = bmpIndex; + _pTBB[i].idCommand = cmd; + _pTBB[i].fsState = TBSTATE_ENABLED; + _pTBB[i].fsStyle = style; + _pTBB[i].dwData = 0; + _pTBB[i].iString = 0; + + } + + setButtonSize(iconSize, iconSize); + + ::SendMessage(_hToolBar, TB_ADDBUTTONS, (WPARAM)nbElement, (LPARAM)_pTBB); + ::SendMessage(_hToolBar, TB_AUTOSIZE, 0, 0); + + + REBARINFO rbi; + REBARBANDINFO rbBand; + _hSelf = CreateWindowEx(WS_EX_TOOLWINDOW, + REBARCLASSNAME, + NULL, + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS| + WS_CLIPCHILDREN|RBS_VARHEIGHT| + CCS_NODIVIDER, + 0,0,0,0, _hParent, NULL, _hInst, NULL); + + rbi.cbSize = sizeof(REBARINFO); + rbi.fMask = 0; + rbi.himl = (HIMAGELIST)NULL; + SendMessage(_hSelf, RB_SETBARINFO, 0, (LPARAM)&rbi); + + //rbBand.cbSize = sizeof(REBARBANDINFO); + rbBand.fMask = RBBIM_COLORS | RBBIM_TEXT | RBBIM_BACKGROUND | \ + RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | \ + RBBIM_SIZE; + + rbBand.fStyle = RBBS_FIXEDSIZE | RBBS_CHILDEDGE; + rbBand.hbmBack = NULL; + rbBand.lpText = "Toolbar"; + rbBand.hwndChild = _hToolBar; + + int dwBtnSize = SendMessage(_hToolBar, TB_GETBUTTONSIZE, 0,0); + + rbBand.cxMinChild = 34;//nbElement; + rbBand.cyMinChild = HIWORD(dwBtnSize); + rbBand.cx = 250; + SendMessage(_hSelf, RB_INSERTBAND, (WPARAM)0, (LPARAM)&rbBand); + + return true; +} + +void ToolBar::reset() +{ + setDefaultImageList(); + setHotImageList(); + setDisableImageList(); + + if (_state == TB_STANDARD) + { + int nbElement = _toolBarIcons.getNbCommand(); + for (int i = 0, j = 0, k = nbElement-1 ; i < nbElement ; i++, k--) + { + int cmd = 0; + int bmpIndex, style; + + ::SendMessage(_hToolBar, TB_DELETEBUTTON, k, 0); + + if ((cmd = _toolBarIcons.getCommandAt(i)) != 0) + { + bmpIndex = j++; + style = BTNS_BUTTON; + } + else + { + bmpIndex = 0; + style = BTNS_SEP; + } + _pTBB[i].iBitmap = bmpIndex; + _pTBB[i].idCommand = cmd; + _pTBB[i].fsState = TBSTATE_ENABLED; + _pTBB[i].fsStyle = style; + _pTBB[i].dwData = 0; + _pTBB[i].iString = 0; + + } + + ::SendMessage(_hToolBar, TB_ADDBUTTONS, (WPARAM)nbElement, (LPARAM)_pTBB); + } + + ::SendMessage(_hToolBar, TB_AUTOSIZE, 0, 0); +} + +void ToolBar::setToUglyIcons() +{ + if (_state == TB_STANDARD) + return; + + // Due to the drawback of toolbar control (in-coexistence of Imagelist - custom icons and Bitmap - Std icons), + // We have to destroy the control then re-initialize it + ::DestroyWindow(_hToolBar); + + //_state = REDUCED; + + _hToolBar = ::CreateWindowEx( + WS_EX_PALETTEWINDOW , + TOOLBARCLASSNAME, + "", + WS_TOOLBARSTYLE, + 0, 0, + 0, 0, + _hParent, + NULL, + _hInst, + 0); + + if (!_hToolBar) + { + systemMessage("System Err"); + throw int(9); + } + + // Send the TB_BUTTONSTRUCTSIZE message, which is required for + // backward compatibility. + ::SendMessage(_hToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); + + ::SendMessage(_hToolBar, TB_LOADIMAGES, IDB_STD_SMALL_COLOR, reinterpret_cast(HINST_COMMCTRL)); + + TBADDBITMAP addbmp = {_hInst, 0}; + if (_bmpArray) + { + for (int i = 0 ; i < _bmpArraySize ; i++) + { + addbmp.nID = _bmpArray[i]; + ::SendMessage(_hToolBar, TB_ADDBITMAP, 1, (LPARAM)&addbmp); + } + } + + int nbElement = _toolBarIcons.getNbCommand(); + int inc = 1; + + for (int i = 0 ; i < nbElement ; i++) + { + int cmd = 0; + int bmpIndex, style; + + if ((cmd = _toolBarIcons.getCommandAt(i)) != 0) + { + int ibmp = _toolBarIcons.getUglyIconAt(i); + bmpIndex = (ibmp == -1)?(STD_PRINT + (inc++)):ibmp; + style = BTNS_BUTTON; + } + else + { + bmpIndex = 0; + style = BTNS_SEP; + } + _pTBB[i].iBitmap = bmpIndex; + _pTBB[i].idCommand = cmd; + _pTBB[i].fsState = TBSTATE_ENABLED; + _pTBB[i].fsStyle = style; + _pTBB[i].dwData = 0; + _pTBB[i].iString = 0; + + } + + setButtonSize(16, 16); + + ::SendMessage(_hToolBar, TB_ADDBUTTONS, (WPARAM)nbElement, (LPARAM)_pTBB); + ::SendMessage(_hToolBar, TB_AUTOSIZE, 0, 0); + _state = TB_STANDARD; +} + diff --git a/PowerEditor/src/WinControls/ToolBar/ToolBar.h b/PowerEditor/src/WinControls/ToolBar/ToolBar.h new file mode 100644 index 00000000..92b4155a --- /dev/null +++ b/PowerEditor/src/WinControls/ToolBar/ToolBar.h @@ -0,0 +1,201 @@ +//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 "resource.h" +#include "Notepad_plus_msgs.h" + + + +#ifndef _WIN32_IE +#define _WIN32_IE 0x0600 +#endif //_WIN32_IE + +#include +#include +using namespace std; + + +#ifndef TB_SETIMAGELIST +#define TB_SETIMAGELIST (WM_USER+48) +#endif + +#ifndef TB_SETHOTIMAGELIST +#define TB_SETHOTIMAGELIST (WM_USER+52) +#endif + +#ifndef TB_SETDISABLEDIMAGELIST +#define TB_SETDISABLEDIMAGELIST (WM_USER+54) +#endif + +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 ToolBar : public Window +{ +public : + const static bool REDUCED; + const static bool ENLARGED; + ToolBar():Window(), _pTBB(NULL){}; + virtual ~ToolBar(){}; + + virtual bool init(HINSTANCE hInst, HWND hPere, int iconSize, + ToolBarButtonUnit *buttonUnitArray, int arraySize, + bool doUglyStandardIcon = false, int *bmpArray = NULL, int bmpArraySize = 0); + + virtual void destroy() { + delete [] _pTBB; + ::DestroyWindow(_hSelf); + _hSelf = NULL; + _toolBarIcons.destroy(); + }; + void enable(int cmdID, bool doEnable) const { + ::SendMessage(_hSelf, TB_ENABLEBUTTON, cmdID, (LPARAM)doEnable); + }; + + int getHeight() const { + if (!::IsWindowVisible(_hSelf)) + return 0; + return Window::getHeight(); + }; + + void reduce() { + if (_state == TB_SMALL) + return; + // I really don't know why we have to enlarge then reduce + // to take the effect. + if (_state == TB_STANDARD) + _toolBarIcons.resizeIcon(32); + + _toolBarIcons.resizeIcon(16); + reset(); + + Window::redraw(); + _state = TB_SMALL; + }; + void enlarge() { + if (_state == TB_LARGE) + return; + _toolBarIcons.resizeIcon(32); + reset(); + Window::redraw(); + _state = TB_LARGE; + }; + + void display(bool toShow = true) { + Window::display(toShow); + if (!toShow) + _state = TB_HIDE; + }; + + 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;}; + + void setToUglyIcons(); + + bool changeIcons(int whichLst, int iconIndex, const char *iconLocation){ + return _toolBarIcons.replaceIcon(whichLst, iconIndex, iconLocation); + }; + + void registerDynBtn(UINT message, toolbarIcons* hBmp); + +private : + TBBUTTON *_pTBB; + ToolBarIcons _toolBarIcons; + toolBarStatusType _state; + int *_bmpArray; + int _bmpArraySize; + vector _vDynBtnReg; + + + 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 setButtonSize(int w, int h) { + ::SendMessage(_hSelf, TB_SETBUTTONSIZE , (WPARAM)0, (LPARAM)MAKELONG (w, h)); + }; + + void reset(); + +}; + +class ReBar : public Window +{ +public : + ReBar():Window(), _pToolBar(NULL) { + _rbi.cbSize = sizeof(REBARINFO); + _rbi.fMask = 0; + _rbi.himl = (HIMAGELIST)NULL; + + _rbBand.cbSize = sizeof(REBARBANDINFO); + _rbBand.fMask = /*RBBIM_COLORS | RBBIM_TEXT | RBBIM_BACKGROUND | \*/ + RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | \ + RBBIM_SIZE; + + _rbBand.fStyle = RBBS_FIXEDSIZE | RBBS_CHILDEDGE; + _rbBand.hbmBack = NULL; + _rbBand.lpText = "Toolbar"; + }; + + virtual void destroy() { + ::DestroyWindow(_hSelf); + _hSelf = NULL; + }; + + void init(HINSTANCE hInst, HWND hPere, ToolBar *pToolBar); + void reNew() { + _rbBand.hwndChild = _pToolBar->getHSelf(); + int dwBtnSize = SendMessage(_pToolBar->getHSelf(), TB_GETBUTTONSIZE, 0,0); + _rbBand.cyMinChild = HIWORD(dwBtnSize); + ::SendMessage(_hSelf, RB_INSERTBAND, (WPARAM)0, (LPARAM)&_rbBand); + }; + +private: + REBARINFO _rbi; + REBARBANDINFO _rbBand; + ToolBar *_pToolBar; +}; + +#endif // TOOL_BAR_H diff --git a/PowerEditor/src/WinControls/ToolBar/ToolBar.h.new b/PowerEditor/src/WinControls/ToolBar/ToolBar.h.new new file mode 100644 index 00000000..083c0ea4 --- /dev/null +++ b/PowerEditor/src/WinControls/ToolBar/ToolBar.h.new @@ -0,0 +1,150 @@ +//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" + +#ifndef _WIN32_IE +#define _WIN32_IE 0x0600 +#endif //_WIN32_IE + +#include + +#ifndef TB_SETIMAGELIST +#define TB_SETIMAGELIST (WM_USER+48) +#endif + +#ifndef TB_SETHOTIMAGELIST +#define TB_SETHOTIMAGELIST (WM_USER+52) +#endif + +#ifndef TB_SETDISABLEDIMAGELIST +#define TB_SETDISABLEDIMAGELIST (WM_USER+54) +#endif + +enum toolBarStatusType {TB_HIDE, TB_SMALL, TB_LARGE, TB_STANDARD}; + +#include "ImageListSet.h" + +class ToolBar : public Window +{ +public : + const static bool REDUCED; + const static bool ENLARGED; + ToolBar():Window(), _pTBB(NULL){}; + virtual ~ToolBar(){}; + + virtual bool init(HINSTANCE hInst, HWND hPere, int iconSize, + ToolBarButtonUnit *buttonUnitArray, int arraySize, + bool doUglyStandardIcon = false, int *bmpArray = NULL, int bmpArraySize = 0); + + virtual void destroy() { + delete [] _pTBB; + ::DestroyWindow(_hSelf); + ::DestroyWindow(_hToolBar); + _hSelf = NULL; + _hToolBar = NULL; + _toolBarIcons.destroy(); + }; + void enable(int cmdID, bool doEnable) const { + ::SendMessage(_hToolBar, TB_ENABLEBUTTON, cmdID, (LPARAM)doEnable); + }; + + int getHeight() const { + if (!::IsWindowVisible(_hSelf)) + return 0; + RECT rc; + ::GetClientRect(_hToolBar, &rc); + return (rc.bottom - rc.top); + }; + + void reduce() { + if (_state == TB_SMALL) + return; + // I really don't know why we have to enlarge then reduce + // to take the effect. + if (_state == TB_STANDARD) + _toolBarIcons.resizeIcon(32); + + _toolBarIcons.resizeIcon(16); + reset(); + + Window::redraw(); + _state = TB_SMALL; + }; + void enlarge() { + if (_state == TB_LARGE) + return; + _toolBarIcons.resizeIcon(32); + reset(); + Window::redraw(); + _state = TB_LARGE; + }; + + void display(bool toShow = true) { + Window::display(toShow); + if (!toShow) + _state = TB_HIDE; + }; + + bool getCheckState(int ID2Check) const { + return bool(::SendMessage(_hToolBar, TB_GETSTATE, (WPARAM)ID2Check, 0) & TBSTATE_CHECKED); + }; + + void setCheck(int ID2Check, bool willBeChecked) const { + ::SendMessage(_hToolBar, TB_CHECKBUTTON, (WPARAM)ID2Check, (LPARAM)MAKELONG(willBeChecked, 0)); + }; + + toolBarStatusType getState() const {return _state;}; + + void setToUglyIcons(); + + bool changeIcons(int whichLst, int iconIndex, const char *iconLocation){ + return _toolBarIcons.replaceIcon(whichLst, iconIndex, iconLocation); + }; + +private : + TBBUTTON *_pTBB; + ToolBarIcons _toolBarIcons; + toolBarStatusType _state; + int *_bmpArray; + int _bmpArraySize; +HWND _hToolBar; + + void setDefaultImageList() { + ::SendMessage(_hToolBar, TB_SETIMAGELIST , (WPARAM)0, (LPARAM)_toolBarIcons.getDefaultLst()); + }; + void setHotImageList() { + ::SendMessage(_hToolBar, TB_SETHOTIMAGELIST , (WPARAM)0, (LPARAM)_toolBarIcons.getHotLst()); + }; + void setDisableImageList() { + ::SendMessage(_hToolBar, TB_SETDISABLEDIMAGELIST, (WPARAM)0, (LPARAM)_toolBarIcons.getDisableLst()); + }; + + + + void setButtonSize(int w, int h) { + ::SendMessage(_hToolBar, TB_SETBUTTONSIZE , (WPARAM)0, (LPARAM)MAKELONG (w, h)); + }; + + void reset(); + +}; + +#endif // TOOL_BAR_H diff --git a/PowerEditor/src/WinControls/TrayIcon/trayIconControler.cpp b/PowerEditor/src/WinControls/TrayIcon/trayIconControler.cpp new file mode 100644 index 00000000..08448772 --- /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, char *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; + strcpy(_nid.szTip, tip); + + ::RegisterWindowMessage("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..ccd28ecc --- /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, char *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..22b0dea5 --- /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, char *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, + "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, "MAOCS30 Command", 0); + Root=Parent; + Before=Parent; + + Parent = insertTo(Parent, "Native command", 0); + insertTo(Parent, "Power On", 0); + insertTo(Parent, "Power off", 0); + insertTo(Parent, "Entrant", 0); + insertTo(Parent, "Sortant", 0); + Parent = insertTo(Before, "Macro", 0); + insertTo(Parent, "ChangeCode", 0); + insertTo(Parent, "CipherData", 0); + + insertTo(NULL, "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..059e66c8 --- /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, char *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..396b5d8a --- /dev/null +++ b/PowerEditor/src/WinControls/Window.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 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); + return (rc.bottom - rc.top); + }; + + virtual bool isVisible() const { + return (::IsWindowVisible(_hSelf)?true:false); + }; + + HWND getHSelf() const { + if (!_hSelf) + { + ::MessageBox(NULL, "_hSelf == NULL", "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, "_hInst == NULL", "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/Window.h.bak b/PowerEditor/src/WinControls/Window.h.bak new file mode 100644 index 00000000..bddaebc6 --- /dev/null +++ b/PowerEditor/src/WinControls/Window.h.bak @@ -0,0 +1,108 @@ +//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_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); + return (rc.bottom - rc.top); + }; + + virtual bool isVisible() const { + return (::IsWindowVisible(_hSelf)?true:false); + }; + + HWND getHSelf() const { + return _hSelf; + }; + + HWND getHParent() const { + return _hParent; + }; + + void getFocus() const { + ::SetFocus(_hSelf); + }; + + HINSTANCE getHinst() const { + if (!_hInst) + { + ::MessageBox(NULL, "_hInst == NULL", "class Window", MB_OK); + } + 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..14fdccc2 --- /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)GetWindowLong(hWnd, GWL_STYLE); +} + +inline static DWORD GetExStyle(HWND hWnd) { + return (DWORD)GetWindowLong(hWnd, GWL_EXSTYLE); +} + +const UINT WM_WINMGR = RegisterWindowMessage("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..8b06155e --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/WinMgr.h @@ -0,0 +1,301 @@ +//////////////////////////////////////////////////////////////// +// 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 + +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.aps b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.aps new file mode 100644 index 0000000000000000000000000000000000000000..f1a3a2d3dc7161982eca5f34a2e2c1412e9fbcef GIT binary patch literal 39912 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 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp new file mode 100644 index 00000000..65f278a7 --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp @@ -0,0 +1,841 @@ +#include +#include "WindowsDlg.h" +#include "WindowsDlgRc.h" +#include "ScintillaEditView.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 char *readonlyString = " [Read Only]"; +const UINT WDN_NOTIFY = RegisterWindowMessage("WDN_NOTIFY"); + +inline static DWORD GetStyle(HWND hWnd) { + return (DWORD)GetWindowLong(hWnd, GWL_STYLE); +} +inline static DWORD GetExStyle(HWND hWnd) { + return (DWORD)GetWindowLong(hWnd, GWL_EXSTYLE); +} + +inline static BOOL ModifyStyle(HWND hWnd, DWORD dwRemove, DWORD dwAdd) { + DWORD dwStyle = ::GetWindowLong(hWnd, GWL_STYLE); + DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd; + if(dwStyle == dwNewStyle) + return FALSE; + ::SetWindowLong(hWnd, GWL_STYLE, dwNewStyle); + return TRUE; +} + +inline static BOOL ModifyStyleEx(HWND hWnd, DWORD dwRemove, DWORD dwAdd) { + DWORD dwStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE); + DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd; + if(dwStyle == dwNewStyle) + return FALSE; + ::SetWindowLong(hWnd, GWL_EXSTYLE, dwNewStyle); + return TRUE; +} + + +struct NumericStringEquivalence +{ + bool operator()(const char* s1, const char* s2) const + { return numstrcmp(s1, s2) < 0; } + static inline int numstrcmp_get(const char **str, int *length) + { + const char *p = *str; + int value = 0; + for (*length = 0; isdigit(*p); (*length)++) + value = value * 10 + *p++ - '0'; + *str = p; + return (value); + } + static int numstrcmp(const char *str1, const char *str2) + { + char *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 = strtol(str1, &p1, 10) - 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; + ScintillaEditView *_pView; + int _iColumn; + bool _reverse; + BufferEquivalent(ScintillaEditView *pView, int iColumn, bool reverse) + : _pView(pView), _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 + { + const Buffer& b1 = _pView->getBufferAt(i1); + const Buffer& b2 = _pView->getBufferAt(i2); + if (_iColumn == 0) + { + const char *s1 = PathFindFileName(b1.getFileName()); + const char *s2 = PathFindFileName(b2.getFileName()); + return _strequiv(s1, s2); + } + else if (_iColumn == 1) + { + char buf1[MAX_PATH]; + char buf2[MAX_PATH]; + const char *f1 = b1.getFileName(); + const char *f2 = b2.getFileName(); + const char *s1 = PathFindFileName(b1.getFileName()); + const char *s2 = PathFindFileName(b2.getFileName()); + int l1 = min((s1 - f1), (_countof(buf1)-1)); + int l2 = min((s2 - f2), (_countof(buf2)-1)); + strncpy(buf1, f1, l1); buf1[l1] = 0; + strncpy(buf2, f2, l2); buf2[l2] = 0; + return _strequiv(buf1, buf2); + } + 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) +{ + _szMinButton = SIZEZERO; + _szMinListCtrl = SIZEZERO; +} + +void WindowsDlg::init(HINSTANCE hInst, HWND parent, ScintillaEditView *pView) +{ + MyBaseClass::init(hInst, parent); + _pView = pView; +} + +void WindowsDlg::init(HINSTANCE hInst, HWND parent) +{ + assert(!"Call other initialize method"); + MyBaseClass::init(hInst, parent); + _pView = 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(); + 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; + size_t index = pLvdi->item.iItem; + if (index >= _pView->getNbDoc() || index >= _idxMap.size()) + return FALSE; + index = _idxMap[index]; + + const Buffer& buffer = _pView->getBufferAt(index); + if (pLvdi->item.iSubItem == 0) // file name + { + int len = pLvdi->item.cchTextMax; + const char *fullName = buffer.getFileName(); + strncpy(pLvdi->item.pszText, PathFindFileName(fullName), len-1); + pLvdi->item.pszText[len-1] = 0; + len = strlen(pLvdi->item.pszText); + if (buffer.isDirty()) + { + if (len < pLvdi->item.cchTextMax) + { + pLvdi->item.pszText[len++] = '*'; + pLvdi->item.pszText[len] = 0; + } + } + else if (buffer.isReadOnly()) + { + len += strlen(readonlyString); + if (len <= pLvdi->item.cchTextMax) + strcat(pLvdi->item.pszText, readonlyString); + } + } + else if (pLvdi->item.iSubItem == 1) // directory + { + const char *fullName = buffer.getFileName(); + const char *fileName = PathFindFileName(fullName); + int len = fileName-fullName+1; + if (pLvdi->item.cchTextMax < len) + len = pLvdi->item.cchTextMax; + 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(buffer.getLangType()); + if (NULL != lang) + { + 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); iToElement())->Attribute("title"); + if (titre && titre[0]) + { + ::SetWindowText(_hSelf, titre); + } + + // Set the text of child control + for (TiXmlNode *childNode = _dlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElement *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) + ::SetWindowText(hItem, name); + } + } + 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 = "Name"; + lvColumn.cx = width/4; + SendMessage(_hList, LVM_INSERTCOLUMN, 0, LPARAM(&lvColumn)); + + lvColumn.pszText = "Path"; + lvColumn.cx = 300; + SendMessage(_hList, LVM_INSERTCOLUMN, 1, LPARAM(&lvColumn)); + + lvColumn.fmt = LVCFMT_CENTER; + lvColumn.pszText = "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 = (_pView != NULL) ? _pView->getNbDoc() : 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; igetCurrentDocIndex(); + 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; + 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 (_pView->getNbDoc() != _idxMap.size()) + doRefresh(true); + else + { + ListView_RedrawItems(_hList, 0, ListView_GetSelectedCount(_hList)); + ListView_SetItemCount(_hList, _idxMap.size()); + } +} + +void WindowsDlg::doSortToTabs() +{ + int curSel = ListView_GetNextItem(_hList, -1, LVNI_SELECTED); + 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 char *translation) +{ + _hMenu = ::LoadMenu(hInst, MAKEINTRESOURCE(IDR_WINDOWS_MENU)); + + if (translation && translation[0]) + { + string windowStr(translation); + windowStr += "..."; + ::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; + + char buffer[32]; + LoadString(hInst, IDR_WINDOWS_MENU, buffer, 32); + mii.dwTypeData = (LPSTR)((translation && translation[0])?translation:buffer); + mii.hSubMenu = _hMenu; + InsertMenuItem(hMainMenu, pos, TRUE, &mii); +} + +void WindowsMenu::initPopupMenu(HMENU hMenu, ScintillaEditView *pView) +{ + if (hMenu == _hMenu) + { + int curDoc = pView->getCurrentDocIndex(); + int nMaxDoc = IDM_WINDOW_MRU_LIMIT - IDM_WINDOW_MRU_FIRST + 1; + int nDoc = pView->getNbDoc(); + nDoc = min(nDoc, nMaxDoc); + int id, pos; + for (id=IDM_WINDOW_MRU_FIRST, pos=0; idgetBufferAt(pos); + + 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, scbuf.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 char* convertFileName(char *buffer, const char *filename) +{ + char *b = buffer; + const char *p = filename; + while (*p) + { + if (*p == '&') *b++ = '&'; + *b++ = *p++; + } + *b = 0; + return buffer; +} + +char *WindowsMenu::buildFileName(char *buffer, int len, int pos, const char *filename) +{ + char cwd[MAX_PATH]; + buffer[0] = 0; + GetCurrentDirectory(_countof(cwd), cwd); + strcat(cwd, "\\"); + + char *itr = buffer; + char *end = buffer + len - 1; + if (pos < 9) + { + *itr++ = '&'; + *itr++ = '1' + pos; + } + else if (pos == 9) + { + *itr++ = '1'; + *itr++ = '&'; + *itr++ = '0'; + } + else + { + itr = itoa(pos+1, itr, 10) + strlen(itr); + } + *itr++ = ':'; + *itr++ = ' '; + if (0 == strnicmp(filename, cwd, strlen(cwd))) + { + char cnvName[MAX_PATH]; + const char *s1 = PathFindFileName(filename); + int len = strlen(s1); + if (len < (end-itr)) + { + strcpy(cnvName, s1); + } + else + { + int n = (len-3-(itr-buffer))/2; + strncpy(cnvName, s1, n); + strcpy(cnvName+n, "..."); + strcat(cnvName, s1 + strlen(s1) - n); + } + convertFileName(itr, cnvName); + } + else + { + char cnvName[MAX_PATH*2]; + const char *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..ceb09477 --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.h @@ -0,0 +1,113 @@ +//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 ScintillaEditView; + +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::string fullname; + int index; + }; + +public : + WindowsDlg(); + int doDialog(TiXmlNode *dlgNode); + virtual void init(HINSTANCE hInst, HWND parent, ScintillaEditView *pView); + + 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; + ScintillaEditView *_pView; + std::vector _idxMap; + int _lastSort; + TiXmlNode *_dlgNode; + +private: + virtual void init(HINSTANCE hInst, HWND parent); +}; + +class WindowsMenu +{ +public: + WindowsMenu(); + ~WindowsMenu(); + void init(HINSTANCE hInst, HMENU hMainMenu, const char *translation); + //void initMenu(HMENU hMenu, ScintillaEditView *pView); + void initPopupMenu(HMENU hMenu, ScintillaEditView *pView); + //void uninitPopupMenu(HMENU hMenu, ScintillaEditView *pView); +private: + char *buildFileName(char *buffer, int len, int pos, const char *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..176f4219 --- /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, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + CONTROL "", IDC_WINDOWS_LIST, "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..7aa2c806 --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/RunMacroDlg.cpp @@ -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. + +// 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(); + + char str[512]; + ltoa(m_Times, str, 10); + + ::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) ) + { + //char str[512]; + + 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..87d55bd5 --- /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)"Current recorded macro"); + + for (size_t i = 0 ; i < macroList.size() ; i++) + ::SendDlgItemMessage(_hSelf, IDC_MACRO_COMBO, CB_ADDSTRING, 0, (LPARAM)macroList[i]._name); + + ::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..ea7ea868 --- /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, "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,39,10 + CONTROL "Run until &end of file", IDC_M_RUN_EOF,"Button", BS_AUTORADIOBUTTON,21,56,85,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,36,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..6c604d8a --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/shortcut.cpp @@ -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. + +#include "shortcut.h" +#include "Parameters.h" +#include "ScintillaEditView.h" +#include "resource.h" +#include "Notepad_plus.h" + +//const int NB_VKEY = 77; +const int KEY_STR_LEN = 16; + +char vKeyArray[][KEY_STR_LEN] = \ +{"", "BACKSPACE", "TAB", "ENTER", "PAUSE", "CAPS LOCK", "ESC", "SPACEBAR", "PAGE UP", "PAGE DOWN",\ +"END", "HOME", "LEFT ARROW", "UP ARROW", "RIGHT ARROW", "DOWN ARROW", "INS", "DEL",\ +"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",\ +"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",\ +"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",\ +"NUMPAD0", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD4",\ +"NUMPAD5", "NUMPAD6", "NUMPAD7", "NUMPAD8", "NUMPAD9",\ +"F1", "F2", "F3", "F4", "F5", "F6",\ +"F7", "F8", "F9", "F10", "F11", "F12"}; + +unsigned char 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}; + +string Shortcut::toString() const +{ + string sc = _isCtrl?"Ctrl+":""; + sc += _isAlt?"Alt+":""; + sc += _isShift?"Shift+":""; + string key; + getKeyStrFromVal(_key, key); + sc += key; + return sc; +} + +void getKeyStrFromVal(unsigned char keyVal, string & str) +{ + str = ""; + bool found = false; + int i = 0; + for (; i < sizeof(vkeyValue) ; i++) + { + if (keyVal == vkeyValue[i]) + { + found = true; + break; + } + } + if (found) + str = vKeyArray[i]; +} + +ShortcutType getNameStrFromCmd(DWORD cmd, string & str) +{ + ShortcutType st; + + if ((cmd >= ID_MACRO) && (cmd < ID_MACRO_LIMIT)) + { + vector & theMacros = (NppParameters::getInstance())->getMacroList(); + int i = cmd - ID_MACRO; + str = theMacros[i]._name; + st = TYPE_MACRO; + } + 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]._name; + st = TYPE_USERCMD; + } + 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]._name; + //printStr(str.c_str()); + st = TYPE_PLUGINCMD; + } + /*else if ((cmd >= IDCMD) && (cmd < IDCMD_LIMIT)) + { + + vector & cmds = (NppParameters::getInstance())->getNoMenuCmdNames(); + + size_t idcmdIndex = cmd - IDCMD; + if (idcmdIndex < cmds.size()) + str = cmds[idcmdIndex]; + + st = TYPE_CMD; + }*/ + else + { + HWND hNotepad_plus = ::FindWindow(Notepad_plus::getClassName(), NULL); + char cmdName[64]; + char filteredCmdName[64]; + int nbChar = ::GetMenuString(::GetMenu(hNotepad_plus), cmd, cmdName, sizeof(cmdName), MF_BYCOMMAND); + if (!nbChar) + return TYPE_INVALID; + bool fin = false; + int j = 0; + for (size_t i = 0 ; i < strlen(cmdName) ; i++) + { + switch(cmdName[i]) + { + case '\t': + filteredCmdName[j] = '\0'; + fin = true; + break; + + case '&': + break; + + default : + filteredCmdName[j++] = cmdName[i]; + } + if (fin) + break; + } + filteredCmdName[j] = '\0'; + str = filteredCmdName; + st = TYPE_CMD; + } + return st; +} + +BOOL CALLBACK Shortcut::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + + switch (Message) + { + case WM_INITDIALOG : + { + ::SetDlgItemText(_hSelf, IDC_NAME_EDIT, _name); + if (!_canModifyName) + ::SendDlgItemMessage(_hSelf, IDC_NAME_EDIT, EM_SETREADONLY, TRUE, 0); + + ::SendDlgItemMessage(_hSelf, IDC_CTRL_CHECK, BM_SETCHECK, _isCtrl?BST_CHECKED:BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_ALT_CHECK, BM_SETCHECK, _isAlt?BST_CHECKED:BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_SHIFT_CHECK, BM_SETCHECK, _isShift?BST_CHECKED:BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), isValid()); + int iFound = -1; + for (size_t i = 0 ; i < sizeof(vkeyValue) ; i++) + { + ::SendDlgItemMessage(_hSelf, IDC_KEY_COMBO, CB_ADDSTRING, 0, (LPARAM)vKeyArray[i]); + + if (_key == vkeyValue[i]) + iFound = i; + } + + if (iFound != -1) + ::SendDlgItemMessage(_hSelf, IDC_KEY_COMBO, CB_SETCURSEL, iFound, 0); + + goToCenter(); + return TRUE; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_CTRL_CHECK : + _isCtrl = BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), isValid()); + return TRUE; + + case IDC_ALT_CHECK : + _isAlt = BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), isValid()); + return TRUE; + + case IDC_SHIFT_CHECK : + _isShift = BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0); + return TRUE; + + case IDOK : + ::EndDialog(_hSelf, 0); + return TRUE; + + case IDCANCEL : + ::EndDialog(_hSelf, -1); + return TRUE; + + default: + if (HIWORD(wParam) == EN_CHANGE) + { + if (LOWORD(wParam) == IDC_NAME_EDIT) + { + ::SendDlgItemMessage(_hSelf, LOWORD(wParam), WM_GETTEXT, nameLenMax, (LPARAM)_name); + return TRUE; + } + } + else if (HIWORD(wParam) == CBN_SELCHANGE) + { + if (LOWORD(wParam) == IDC_KEY_COMBO) + { + int i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETCURSEL, 0, 0); + _key = vkeyValue[i]; + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), isValid()); + return TRUE; + } + } + return FALSE; + } + } + default : + return FALSE; + } + + return FALSE; +} + +// return true if one of CommandShortcuts is deleted. Otherwise false. +bool Accelerator::uptdateShortcuts(HWND nppHandle) +{ + bool isCmdScModified = false; + NppParameters *pNppParam = NppParameters::getInstance(); + + vector & shortcuts = pNppParam->getUserShortcuts(); + vector & macros = pNppParam->getMacroList(); + vector & userCommands = pNppParam->getUserCommandList(); + vector & pluginCommands = pNppParam->getPluginCommandList(); + + vector & scintillaScs = pNppParam->getScintillaKeyList(); + vector & scintillaModifScs = pNppParam->getScintillaModifiedKeys(); + + size_t nbMacro = macros.size(); + size_t nbUserCmd = userCommands.size(); + size_t nbPluginCmd = pluginCommands.size(); + + size_t totalShorcut = copyAccelArray(nbMacro, nbUserCmd, nbPluginCmd); + + int m = 0; + size_t i = totalShorcut - nbMacro - nbUserCmd - nbPluginCmd; + for (vector::iterator ms = macros.begin() ; i < (totalShorcut - nbUserCmd - nbPluginCmd) ; i++, ms++) + { + _pAccelArray[i].cmd = ID_MACRO + m++; + _pAccelArray[i].fVirt = FVIRTKEY | (ms->_isCtrl?FCONTROL:0) | (ms->_isAlt?FALT:0) | (ms->_isShift?FSHIFT:0); + _pAccelArray[i].key = ms->_key; + } + + m = 0; + for (vector::iterator uc = userCommands.begin() ; i < (totalShorcut - nbPluginCmd); i++, uc++) + { + _pAccelArray[i].cmd = ID_USER_CMD + m++; + _pAccelArray[i].fVirt = FVIRTKEY | (uc->_isCtrl?FCONTROL:0) | (uc->_isAlt?FALT:0) | (uc->_isShift?FSHIFT:0); + _pAccelArray[i].key = uc->_key; + } + + for (vector::iterator pc = pluginCommands.begin() ; i < totalShorcut; i++, pc++) + { + _pAccelArray[i].cmd = (unsigned short)pc->getID(); + _pAccelArray[i].fVirt = FVIRTKEY | (pc->_isCtrl?FCONTROL:0) | (pc->_isAlt?FALT:0) | (pc->_isShift?FSHIFT:0); + _pAccelArray[i].key = pc->_key; + } + + // search all the command shortcuts modified by user from xml + for (vector::iterator csc = shortcuts.begin() ; csc != shortcuts.end() ; ) + { + bool found = false; + int nbCmdShortcut = totalShorcut - nbMacro - nbUserCmd - nbPluginCmd; + for (int j = 0 ; j < nbCmdShortcut ; j++) + { + if (_pAccelArray[j].cmd == csc->getID()) + { + _pAccelArray[j].fVirt = FVIRTKEY | (csc->_isCtrl?FCONTROL:0)\ + | (csc->_isAlt?FALT:0) | (csc->_isShift?FSHIFT:0); + _pAccelArray[j].key = csc->_key; + found = true; + break; + } + } + if (!found) + { + csc = shortcuts.erase(csc); + isCmdScModified = true; + } + else + csc++; + } + + + if (nppHandle) + { + for (vector::iterator skmm = scintillaModifScs.begin() ; skmm != scintillaModifScs.end() ; skmm++) + { + for (vector::iterator skm = scintillaScs.begin() ; skm != scintillaScs.end() ; skm++) + { + if (skmm->getScintillaKey() == skm->getScintillaKey()) + { + // remap the key + ::SendMessage(nppHandle, NPPM_INTERNAL_BINDSCINTILLAKEY, skmm->toKeyDef(), skmm->getScintillaKey()); + ::SendMessage(nppHandle, NPPM_INTERNAL_CLEARSCINTILLAKEY, skm->toKeyDef(), 0); + + // update the global ScintillaKeyList + skm->copyShortcut(*skmm); + + // if this shortcut is linked to a menu item, change to shortcut string in menu item + if (int cmdID = skm->getMenuCmdID()) + { + HMENU hMenu = ::GetMenu(nppHandle); + ::ModifyMenu(hMenu, cmdID, MF_BYCOMMAND, cmdID, skm->toMenuItemString(cmdID).c_str()); + } + break; + } + } + } + } + reNew(); + return isCmdScModified; +} + +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); + } +} diff --git a/PowerEditor/src/WinControls/shortcut/shortcut.h b/PowerEditor/src/WinControls/shortcut/shortcut.h new file mode 100644 index 00000000..9a5968c0 --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/shortcut.h @@ -0,0 +1,303 @@ +//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" + +using namespace std; + +const size_t nameLenMax = 64; + +enum ShortcutType {TYPE_CMD, TYPE_MACRO, TYPE_USERCMD, TYPE_PLUGINCMD, TYPE_INVALID}; + +void getKeyStrFromVal(unsigned char keyVal, string & str); +ShortcutType getNameStrFromCmd(DWORD cmd, 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 Shortcut : public StaticDialog { + char _name[nameLenMax]; + bool _isCtrl; + bool _isAlt; + bool _isShift; + unsigned char _key; + bool _canModifyName; + + Shortcut():_isCtrl(false), _isAlt(false), _isShift(false), _key(0), _canModifyName(true) {_name[0] = '\0';}; + Shortcut(const Shortcut & shortcut) { + this->_isCtrl = shortcut._isCtrl; + this->_isAlt = shortcut._isAlt; + this->_isShift = shortcut._isShift; + this->_key = shortcut._key; + strcpy(this->_name, shortcut._name); + }; + Shortcut(const char *name, bool isCtrl, bool isAlt, bool isShift, unsigned char key) :\ + _isCtrl(isCtrl), _isAlt(isAlt), _isShift(isShift), _key(key){ + _name[0] = '\0'; + if (name) + strcpy(_name, name); + }; + + friend inline const bool operator==(const Shortcut & a, const Shortcut & b) { + return ((strcmp(a._name, b._name) == 0) && (a._isCtrl == b._isCtrl) && (a._isAlt == b._isAlt) && (a._isShift == b._isShift) && (a._key == b._key)); + }; + + friend inline const bool operator!=(const Shortcut & a, const Shortcut & b) { + return !((strcmp(a._name, b._name) == 0) && (a._isCtrl == b._isCtrl) && (a._isAlt == b._isAlt) && (a._isShift == b._isShift) && (a._key == b._key)); + }; + + void copyShortcut(const Shortcut & sc) { + if (this != &sc) + { + strcpy(this->_name, sc._name); + this->_isAlt = sc._isAlt; + this->_isCtrl = sc._isCtrl; + this->_isShift = sc._isShift; + this->_key = sc._key; + this->_canModifyName = sc._canModifyName; + } + }; + + int doDialog() { + return ::DialogBoxParam(_hInst, MAKEINTRESOURCE(IDD_SHORTCUT_DLG), _hParent, (DLGPROC)dlgProc, (LPARAM)this); + }; + + bool isValid() const { + if (_key == 0) + return false; + // the following keys are always valid (NUMPAD & F1~F12 + ESC + HOME + END) + if (((_key >= 0x60) && (_key <= 0x69)) || ((_key >= 0x70) && (_key <= 0x7B)) || (_key == 0x1B) || (_key == 0x24) || (_key == 0x23)) + return true; + // the remain keys need at least Ctrl or Alt + if ((_isCtrl) || (_isAlt)) + return true; + return false; + }; + void setNameReadOnly(bool canBeModified = false) {_canModifyName = canBeModified;}; + string toString() const; + string toMenuItemString(int cmdID = 0) { + string str = _name; + if (cmdID) + getNameStrFromCmd(cmdID, str); + str += "\t"; + str += toString(); + return str; + }; +protected : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + +}; + +class CommandShortcut : public Shortcut { +public: + CommandShortcut() : _id(0){}; + CommandShortcut(const char *name, unsigned long id, bool isCtrl, bool isAlt, bool isShift, unsigned char key) :\ + Shortcut(name, isCtrl, isAlt, isShift, key), _id(id) {}; + CommandShortcut(long id, Shortcut sc) : Shortcut(sc), _id(id) {}; + unsigned long getID() const {return _id;}; + +protected : + unsigned long _id; +}; + + +class ScintillaKeyMap : public CommandShortcut { +public: + ScintillaKeyMap():_scintillaKeyID(0), _menuCmdID(0){}; + ScintillaKeyMap(unsigned long id): _scintillaKeyID(0), _menuCmdID(0){ _id = id;}; + ScintillaKeyMap(const char *name, unsigned long id, unsigned long scintillaKeyID,\ + bool isCtrl, bool isAlt, bool isShift, unsigned char key, int cmdID = 0) :\ + CommandShortcut(name, id, isCtrl, isAlt, isShift, key), _scintillaKeyID(scintillaKeyID), _menuCmdID(cmdID){}; + unsigned long getScintillaKeyID() const {return _scintillaKeyID;}; + int toKeyDef() const { + int keymod = (_isCtrl?SCMOD_CTRL:0) | (_isAlt?SCMOD_ALT:0) | (_isShift?SCMOD_SHIFT:0); + return keyTranslate((int)_key) + (keymod << 16); + }; + unsigned long getScintillaKey() const {return _scintillaKeyID;}; + int getMenuCmdID() const {return _menuCmdID;}; + void setScintKey(int key) {_scintillaKeyID = key;}; + void setMenuID(int id) {_menuCmdID = id;}; + +private: + unsigned long _scintillaKeyID; + int _menuCmdID; +}; + + +class Window; +class ScintillaEditView; + +struct recordedMacroStep { + enum MacroTypeIndex {mtUseLParameter, mtUseSParameter, mtMenuCommand}; + + int message; + long wParameter; + long lParameter; + 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 char *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 Shortcut { +friend class NppParameters; +public: + MacroShortcut(Shortcut sc) : Shortcut(sc) {}; + MacroShortcut(Macro macro) : _macro(macro) {}; + MacroShortcut(Shortcut sc, Macro macro) : Shortcut(sc), _macro(macro) {}; + Macro & getMacro() {return _macro;}; +private: + Macro _macro; +}; + + +class UserCommand : public Shortcut { +friend class NppParameters; +public: + UserCommand(Shortcut sc) : Shortcut(sc) {}; + UserCommand(char *cmd) : _cmd(cmd) {}; + UserCommand(Shortcut sc, char *cmd) : Shortcut(sc), _cmd(cmd) {}; + const char* getCmd() const {return _cmd.c_str();}; +private: + string _cmd; +}; + +class PluginCmdShortcut : public Shortcut { +friend class NppParameters; +public: + PluginCmdShortcut(Shortcut sc) : Shortcut(sc), _id(0), _internalID(-1) {_moduleName[0] = '\0';}; + PluginCmdShortcut(Shortcut sc, int cmdID) : Shortcut(sc), _id(cmdID), _internalID(-1) {_moduleName[0] = '\0';}; + PluginCmdShortcut(Shortcut sc, int cmdID, const char *moduleName, unsigned short internalID) :\ + Shortcut(sc), _id(cmdID), _internalID(internalID) { + strcpy(_moduleName, moduleName); + }; + bool isValid() const { + if (!Shortcut::isValid()) + return false; + if ((!_moduleName[0]) || (_internalID == -1)) + return false; + return true; + } + const char * getModuleName() const {return _moduleName;}; + int getInternalID() const {return _internalID;}; + unsigned long getID() const {return _id;}; + +protected : + unsigned long _id; + char _moduleName[nameLenMax]; + int _internalID; +}; + +class Accelerator { +friend class ShortcutMapper; +public: + Accelerator():_hAccTable(NULL), _didCopy(false), _pAccelArray(NULL), _nbAccelItems(0){ + }; + ~Accelerator(){ + if (_didCopy) + ::DestroyAcceleratorTable(_hAccTable); + }; + void init(HACCEL hAccel) { + _hAccTable = hAccel; + _nbOriginalAccelItem = ::CopyAcceleratorTable(_hAccTable, NULL, 0); + }; + HACCEL getAccTable() const {return _hAccTable;}; + + bool uptdateShortcuts(HWND nppHandle = NULL); + + void coloneAccelTable() { + copyAccelArray(); + reNew(); + }; + + +private: + HACCEL _hAccTable; + bool _didCopy; + + ACCEL *_pAccelArray; + int _nbOriginalAccelItem; + int _nbAccelItems; + + + size_t copyAccelArray(int nbMacro2add = 0, int nbUserCmd2add = 0, int nbPluginCmd2add = 0) { + int newSize = _nbOriginalAccelItem + nbMacro2add + nbUserCmd2add + nbPluginCmd2add; + _nbAccelItems = newSize; + + if (_pAccelArray) + delete [] _pAccelArray; + _pAccelArray = new ACCEL[_nbAccelItems]; + + ::CopyAcceleratorTable(_hAccTable, _pAccelArray, _nbOriginalAccelItem); + return newSize; + }; + + void reNew() { + if (!_didCopy) + _didCopy = true; + else + ::DestroyAcceleratorTable(_hAccTable); + + _hAccTable = ::CreateAcceleratorTable(_pAccelArray, _nbAccelItems); + }; +}; + +#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..e43c4e13 --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/shortcut.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. +*/ + +#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, "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 +END diff --git a/PowerEditor/src/WinControls/shortcut/shortcutRc.h b/PowerEditor/src/WinControls/shortcut/shortcutRc.h new file mode 100644 index 00000000..b787766d --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/shortcutRc.h @@ -0,0 +1,31 @@ +/* +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 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) + +#endif //IDD_SHORTCUT_DLG diff --git a/PowerEditor/src/config.xml b/PowerEditor/src/config.xml new file mode 100644 index 00000000..35111dbe --- /dev/null +++ b/PowerEditor/src/config.xml @@ -0,0 +1,77 @@ + + + + + standard + + show + + + + vertical + + hide + + + + + + + + yes + no + no + yes + + + + + + + + yes + no + + + + + + + diff --git a/PowerEditor/src/constant.h b/PowerEditor/src/constant.h new file mode 100644 index 00000000..5a8c11ec --- /dev/null +++ b/PowerEditor/src/constant.h @@ -0,0 +1,6 @@ +#ifndef CONSTANT_H +#define CONSTANT_H + +const int MARK_SYMBOLE = 1; + +#endif //CONSTANT_H diff --git a/PowerEditor/src/contextMenu.xml b/PowerEditor/src/contextMenu.xml new file mode 100644 index 00000000..2d42b4b6 --- /dev/null +++ b/PowerEditor/src/contextMenu.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ 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..fd97c6eef0739295abb23164874f7ae1e0b26d12 GIT binary patch literal 766 zcmbu5F%p6>5Jf+zgI%a>q4XAdD@xNz=arc8Fj~g3&~E)33?yls!NAMz=O@c1K#2lv zTVuoQUIIG+d(x64DX``YSbAa9A@R}DWMb_YI5WjC42)`se<7k7;iI2)S~`qNcjh`T zo#}MBL8e{0++>|nOZb>!3`Oa~fdWNkf03V` zq)EUcJLzN`_wtDMxf3~v$TJwh3+Uv5TO^{jvu}>uh=>zoG2FPaEDP2I^;cBQ13VV8 z>py2(zTqL?H{bI6^z5_UDzv4CGNx*22X%+(y@APrGH8ukr|)Ci&Sdt@t)47G#>=-% zRyjw_M-P|`vWCJ<&S8#OD>pe1YTT;MbDUS)X45sFIcxq`oqS)ejBL9yU?mvms|4pa z`4`VJ>p5ZHD%kl8d<>WHKIA@4sY^Y0;*Sc8$N;7_65PNL(*-c@r0EA1972}R8c{mJ1xeP^8A)ainy-5KB$o{+f{#r?^ zv9wX8rrGHV?`)9vzR&zVO+D$<300sG_Jb^rhX literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/CVS/Entries b/PowerEditor/src/icons/CVS/Entries new file mode 100644 index 00000000..83bf66a8 --- /dev/null +++ b/PowerEditor/src/icons/CVS/Entries @@ -0,0 +1,98 @@ +/allChars_off.ico/1.1/Thu Nov 13 14:06:18 2003/-kb/ +/allChars_on.ico/1.1/Thu Nov 13 14:06:18 2003/-kb/ +/cut_dis.ico/1.1/Tue Apr 22 17:06:14 2003/-kb/ +/cut_off.ico/1.1/Thu Apr 10 09:19:26 2003/-kb/ +/cut_on.ico/1.1/Thu Apr 10 09:18:50 2003/-kb/ +/delete.ico/1.1/Sat Apr 12 18:19:14 1997/-kb/ +/dupli_dis.ico/1.1/Tue Apr 22 17:21:16 2003/-kb/ +/dupli_off.ico/1.1/Wed Apr 23 09:50:54 2003/-kb/ +/dupli_on.ico/1.1/Thu Apr 10 10:29:22 2003/-kb/ +/find_off.ico/1.1/Thu Apr 10 09:42:18 2003/-kb/ +/find_on.ico/1.1/Thu Apr 10 09:49:18 2003/-kb/ +/findrep_off.ico/1.1/Thu Apr 10 09:59:12 2003/-kb/ +/findrep_on.ico/1.1/Thu Apr 10 10:31:08 2003/-kb/ +/imprim_off.ico/1.1/Thu Apr 10 12:21:44 2003/-kb/ +/imprim_on.ico/1.1/Thu Apr 10 12:22:26 2003/-kb/ +/indentGuide.bmp/1.1/Sun May 2 00:48:32 2004/-kb/ +/indentGuide_off.ico/1.1/Fri Nov 14 17:14:42 2003/-kb/ +/indentGuide_on.ico/1.1/Fri Nov 14 17:11:06 2003/-kb/ +/new_off.ico/1.1/Thu Apr 10 07:58:18 2003/-kb/ +/new_on.ico/1.1/Thu Apr 10 07:59:00 2003/-kb/ +/open_off.ico/1.1/Thu Apr 10 08:00:48 2003/-kb/ +/open_on.ico/1.1/Thu Apr 10 07:59:50 2003/-kb/ +/paste_dis.ico/1.1/Tue Apr 22 17:21:16 2003/-kb/ +/paste_off.ico/1.1/Thu Apr 10 13:00:34 2003/-kb/ +/paste_on.ico/1.1/Thu Apr 10 14:52:58 2003/-kb/ +/playrecord_dis.ico/1.1/Wed May 18 18:51:40 2005/-kb/ +/playrecord_off.ico/1.1/Wed May 18 18:51:48 2005/-kb/ +/playrecord_on.ico/1.1/Wed May 18 18:55:40 2005/-kb/ +/redo_dis.ico/1.1/Tue Apr 22 17:28:36 2003/-kb/ +/redo_off.ico/1.1/Thu Apr 10 09:07:00 2003/-kb/ +/redo_on.ico/1.1/Thu Apr 10 09:04:28 2003/-kb/ +/save_dis.ico/1.1/Tue Apr 22 17:21:16 2003/-kb/ +/save_off.ico/1.1/Thu Apr 10 13:19:52 2003/-kb/ +/save_on.ico/1.1/Thu Apr 10 13:20:48 2003/-kb/ +/saveall_dis.ico/1.1/Tue Apr 22 17:21:16 2003/-kb/ +/saveall_off.ico/1.1/Thu Apr 10 13:36:00 2003/-kb/ +/saveall_on.ico/1.1/Thu Apr 10 13:36:34 2003/-kb/ +/saverecord_dis.ico/1.1/Wed May 18 18:51:44 2005/-kb/ +/saverecord_off.ico/1.1/Wed May 18 18:51:56 2005/-kb/ +/saverecord_on.ico/1.1/Wed May 18 18:51:36 2005/-kb/ +/startrecord_dis.ico/1.1/Wed May 18 18:51:42 2005/-kb/ +/startrecord_off.ico/1.1/Wed May 18 18:51:54 2005/-kb/ +/startrecord_on.ico/1.1/Wed May 18 18:51:34 2005/-kb/ +/stoprecord_dis.ico/1.1/Wed May 18 18:51:46 2005/-kb/ +/stoprecord_off.ico/1.1/Wed May 18 18:51:58 2005/-kb/ +/stoprecord_on.ico/1.1/Wed May 18 18:51:26 2005/-kb/ +/supp_off.ico/1.1/Thu Apr 10 08:06:56 2003/-kb/ +/supp_on.ico/1.1/Thu Apr 10 08:12:02 2003/-kb/ +/suppall_off.ico/1.1/Thu Apr 10 10:15:42 2003/-kb/ +/suppall_on.ico/1.1/Thu Apr 10 10:16:46 2003/-kb/ +/undo_dis.ico/1.1/Tue Apr 22 17:28:36 2003/-kb/ +/undo_off.ico/1.1/Thu Apr 10 09:06:02 2003/-kb/ +/undo_on.ico/1.1/Thu Apr 10 09:03:14 2003/-kb/ +/userDefineDlg_off.ico/1.1/Fri Nov 14 14:31:38 2003/-kb/ +/userDefineDlg_on.ico/1.1/Fri Nov 14 14:31:38 2003/-kb/ +/wrap_dis.ico/1.1/Mon Jan 5 19:13:08 2004/-kb/ +/wrap_off.ico/1.1/Mon Jan 5 19:12:52 2004/-kb/ +/wrap_on.ico/1.1/Mon Jan 5 19:12:20 2004/-kb/ +/zoomIn_off.ico/1.1/Tue Apr 22 17:00:20 2003/-kb/ +/zoomIn_on.ico/1.1/Tue Apr 22 17:00:20 2003/-kb/ +/zoomOut_off.ico/1.1/Tue Apr 22 17:00:20 2003/-kb/ +/zoomOut_on.ico/1.1/Tue Apr 22 17:00:20 2003/-kb/ +/syncH_dis.ico/1.1/Thu Dec 22 19:08:26 2005/-kb/ +/syncH_off.ico/1.1/Thu Dec 22 19:08:16 2005/-kb/ +/syncH_on.ico/1.1/Thu Dec 22 19:08:30 2005/-kb/ +/syncV_dis.ico/1.1/Thu Dec 22 19:08:22 2005/-kb/ +/syncV_off.ico/1.1/Thu Dec 22 19:08:20 2005/-kb/ +/syncV_on.ico/1.1/Thu Dec 22 19:08:28 2005/-kb/ +/npp.ico/1.2/Sun Jan 8 16:36:46 2006/-kb/ +/find.bmp/1.2/Sun Feb 12 12:27:18 2006/-kb/ +/findReplace.bmp/1.2/Sun Feb 12 12:59:20 2006/-kb/ +/invisibleChar.bmp/1.2/Sun Feb 12 23:51:44 2006/-kb/ +/saveAll.bmp/1.2/Sun Feb 12 22:59:06 2006/-kb/ +/saveRecord.bmp/1.2/Sun Feb 12 15:28:36 2006/-kb/ +/showPannel.bmp/1.2/Sun Feb 12 22:34:06 2006/-kb/ +/zoomIn.bmp/1.2/Sun Feb 12 12:55:28 2006/-kb/ +/zoomOut.bmp/1.2/Sun Feb 12 12:48:40 2006/-kb/ +/copy.bmp/1.1/Sun Feb 12 22:44:26 2006/-kb/ +/openFile.bmp/1.1/Sun Feb 12 14:16:38 2006/-kb/ +/paste.bmp/1.1/Sun Feb 12 22:56:52 2006/-kb/ +/print.bmp/1.1/Sun Feb 12 15:10:04 2006/-kb/ +/redo.bmp/1.1/Sun Feb 12 17:12:12 2006/-kb/ +/undo.bmp/1.1/Sun Feb 12 17:14:12 2006/-kb/ +/playRecord.bmp/1.3/Fri Feb 17 00:47:08 2006/-kb/ +/startRecord.bmp/1.2/Fri Feb 17 00:50:42 2006/-kb/ +/stopRecord.bmp/1.2/Fri Feb 17 00:49:28 2006/-kb/ +/syncV.bmp/1.2/Sat Feb 18 01:37:00 2006/-kb/ +/wrap.bmp/1.2/Sat Feb 18 00:51:40 2006/-kb/ +/cut.bmp/1.2/Tue Feb 21 23:40:40 2006/-kb/ +/saveFile.bmp/1.2/Tue Feb 21 23:44:16 2006/-kb/ +/syncH.bmp/1.3/Tue Feb 21 23:46:10 2006/-kb/ +/closeAll.bmp/1.3/Sat Mar 11 02:42:22 2006/-kb/ +/closeFile.bmp/1.3/Sat Mar 11 02:57:00 2006/-kb/ +/newFile.bmp/1.2/Sat Mar 11 02:12:38 2006/-kb/ +/readonly.ico/1.2/Sun Sep 24 21:30:32 2006/-kb/ +/saved.ico/1.2/Sat Sep 23 23:36:40 2006/-kb/ +/unsaved.ico/1.2/Sun Sep 24 21:27:28 2006/-kb/ +D diff --git a/PowerEditor/src/icons/CVS/Entries.Extra b/PowerEditor/src/icons/CVS/Entries.Extra new file mode 100644 index 00000000..76ff0762 --- /dev/null +++ b/PowerEditor/src/icons/CVS/Entries.Extra @@ -0,0 +1,97 @@ +/allChars_off.ico////*/// +/allChars_on.ico////*/// +/cut_dis.ico////*/// +/cut_off.ico////*/// +/cut_on.ico////*/// +/delete.ico////*/// +/dupli_dis.ico////*/// +/dupli_off.ico////*/// +/dupli_on.ico////*/// +/find_off.ico////*/// +/find_on.ico////*/// +/findrep_off.ico////*/// +/findrep_on.ico////*/// +/imprim_off.ico////*/// +/imprim_on.ico////*/// +/indentGuide.bmp////*/// +/indentGuide_off.ico////*/// +/indentGuide_on.ico////*/// +/new_off.ico////*/// +/new_on.ico////*/// +/open_off.ico////*/// +/open_on.ico////*/// +/paste_dis.ico////*/// +/paste_off.ico////*/// +/paste_on.ico////*/// +/playrecord_dis.ico////*/// +/playrecord_off.ico////*/// +/playrecord_on.ico////*/// +/redo_dis.ico////*/// +/redo_off.ico////*/// +/redo_on.ico////*/// +/save_dis.ico////*/// +/save_off.ico////*/// +/save_on.ico////*/// +/saveall_dis.ico////*/// +/saveall_off.ico////*/// +/saveall_on.ico////*/// +/saverecord_dis.ico////*/// +/saverecord_off.ico////*/// +/saverecord_on.ico////*/// +/startrecord_dis.ico////*/// +/startrecord_off.ico////*/// +/startrecord_on.ico////*/// +/stoprecord_dis.ico////*/// +/stoprecord_off.ico////*/// +/stoprecord_on.ico////*/// +/supp_off.ico////*/// +/supp_on.ico////*/// +/suppall_off.ico////*/// +/suppall_on.ico////*/// +/undo_dis.ico////*/// +/undo_off.ico////*/// +/undo_on.ico////*/// +/userDefineDlg_off.ico////*/// +/userDefineDlg_on.ico////*/// +/wrap_dis.ico////*/// +/wrap_off.ico////*/// +/wrap_on.ico////*/// +/zoomIn_off.ico////*/// +/zoomIn_on.ico////*/// +/zoomOut_off.ico////*/// +/zoomOut_on.ico////*/// +/syncH_dis.ico////*/// +/syncH_off.ico////*/// +/syncH_on.ico////*/// +/syncV_dis.ico////*/// +/syncV_off.ico////*/// +/syncV_on.ico////*/// +/npp.ico////*/// +/find.bmp////*/// +/findReplace.bmp////*/// +/invisibleChar.bmp////*/// +/saveAll.bmp////*/// +/saveRecord.bmp////*/// +/showPannel.bmp////*/// +/zoomIn.bmp////*/// +/zoomOut.bmp////*/// +/copy.bmp////*/// +/openFile.bmp////*/// +/paste.bmp////*/// +/print.bmp////*/// +/redo.bmp////*/// +/undo.bmp////*/// +/playRecord.bmp////*/// +/startRecord.bmp////*/// +/stopRecord.bmp////*/// +/syncV.bmp////*/// +/wrap.bmp////*/// +/cut.bmp////*/// +/saveFile.bmp////*/// +/syncH.bmp////*/// +/closeAll.bmp////*/// +/closeFile.bmp////*/// +/newFile.bmp////*/// +/readonly.ico////*/// +/saved.ico////*/// +/unsaved.ico////*/// diff --git a/PowerEditor/src/icons/CVS/Entries.Extra.Old b/PowerEditor/src/icons/CVS/Entries.Extra.Old new file mode 100644 index 00000000..a431de5d --- /dev/null +++ b/PowerEditor/src/icons/CVS/Entries.Extra.Old @@ -0,0 +1,97 @@ +/allChars_off.ico////*/// +/allChars_on.ico////*/// +/cut_dis.ico////*/// +/cut_off.ico////*/// +/cut_on.ico////*/// +/delete.ico////*/// +/dupli_dis.ico////*/// +/dupli_off.ico////*/// +/dupli_on.ico////*/// +/find_off.ico////*/// +/find_on.ico////*/// +/findrep_off.ico////*/// +/findrep_on.ico////*/// +/imprim_off.ico////*/// +/imprim_on.ico////*/// +/indentGuide.bmp////*/// +/indentGuide_off.ico////*/// +/indentGuide_on.ico////*/// +/new_off.ico////*/// +/new_on.ico////*/// +/open_off.ico////*/// +/open_on.ico////*/// +/paste_dis.ico////*/// +/paste_off.ico////*/// +/paste_on.ico////*/// +/playrecord_dis.ico////*/// +/playrecord_off.ico////*/// +/playrecord_on.ico////*/// +/readonly.ico////*/// +/redo_dis.ico////*/// +/redo_off.ico////*/// +/redo_on.ico////*/// +/save_dis.ico////*/// +/save_off.ico////*/// +/save_on.ico////*/// +/saveall_dis.ico////*/// +/saveall_off.ico////*/// +/saveall_on.ico////*/// +/saved.ico////*/// +/saverecord_dis.ico////*/// +/saverecord_off.ico////*/// +/saverecord_on.ico////*/// +/startrecord_dis.ico////*/// +/startrecord_off.ico////*/// +/startrecord_on.ico////*/// +/stoprecord_dis.ico////*/// +/stoprecord_off.ico////*/// +/stoprecord_on.ico////*/// +/supp_off.ico////*/// +/supp_on.ico////*/// +/suppall_off.ico////*/// +/suppall_on.ico////*/// +/undo_dis.ico////*/// +/undo_off.ico////*/// +/undo_on.ico////*/// +/unsaved.ico////*/// +/userDefineDlg_off.ico////*/// +/userDefineDlg_on.ico////*/// +/wrap_dis.ico////*/// +/wrap_off.ico////*/// +/wrap_on.ico////*/// +/zoomIn_off.ico////*/// +/zoomIn_on.ico////*/// +/zoomOut_off.ico////*/// +/zoomOut_on.ico////*/// +/syncH_dis.ico////*/// +/syncH_off.ico////*/// +/syncH_on.ico////*/// +/syncV_dis.ico////*/// +/syncV_off.ico////*/// +/syncV_on.ico////*/// +/npp.ico////*/// +/find.bmp////*/// +/findReplace.bmp////*/// +/invisibleChar.bmp////*/// +/saveAll.bmp////*/// +/saveRecord.bmp////*/// +/showPannel.bmp////*/// +/zoomIn.bmp////*/// +/zoomOut.bmp////*/// +/copy.bmp////*/// +/openFile.bmp////*/// +/paste.bmp////*/// +/print.bmp////*/// +/redo.bmp////*/// +/undo.bmp////*/// +/playRecord.bmp////*/// +/startRecord.bmp////*/// +/stopRecord.bmp////*/// +/syncV.bmp////*/// +/wrap.bmp////*/// +/cut.bmp////*/// +/saveFile.bmp////*/// +/syncH.bmp////*/// +/closeAll.bmp////*/// +/closeFile.bmp////*/// +/newFile.bmp////*/// diff --git a/PowerEditor/src/icons/CVS/Entries.Old b/PowerEditor/src/icons/CVS/Entries.Old new file mode 100644 index 00000000..f7a8e6b9 --- /dev/null +++ b/PowerEditor/src/icons/CVS/Entries.Old @@ -0,0 +1,98 @@ +/allChars_off.ico/1.1/Thu Nov 13 14:06:18 2003/-kb/ +/allChars_on.ico/1.1/Thu Nov 13 14:06:18 2003/-kb/ +/cut_dis.ico/1.1/Tue Apr 22 17:06:14 2003/-kb/ +/cut_off.ico/1.1/Thu Apr 10 09:19:26 2003/-kb/ +/cut_on.ico/1.1/Thu Apr 10 09:18:50 2003/-kb/ +/delete.ico/1.1/Sat Apr 12 18:19:14 1997/-kb/ +/dupli_dis.ico/1.1/Tue Apr 22 17:21:16 2003/-kb/ +/dupli_off.ico/1.1/Wed Apr 23 09:50:54 2003/-kb/ +/dupli_on.ico/1.1/Thu Apr 10 10:29:22 2003/-kb/ +/find_off.ico/1.1/Thu Apr 10 09:42:18 2003/-kb/ +/find_on.ico/1.1/Thu Apr 10 09:49:18 2003/-kb/ +/findrep_off.ico/1.1/Thu Apr 10 09:59:12 2003/-kb/ +/findrep_on.ico/1.1/Thu Apr 10 10:31:08 2003/-kb/ +/imprim_off.ico/1.1/Thu Apr 10 12:21:44 2003/-kb/ +/imprim_on.ico/1.1/Thu Apr 10 12:22:26 2003/-kb/ +/indentGuide.bmp/1.1/Sun May 2 00:48:32 2004/-kb/ +/indentGuide_off.ico/1.1/Fri Nov 14 17:14:42 2003/-kb/ +/indentGuide_on.ico/1.1/Fri Nov 14 17:11:06 2003/-kb/ +/new_off.ico/1.1/Thu Apr 10 07:58:18 2003/-kb/ +/new_on.ico/1.1/Thu Apr 10 07:59:00 2003/-kb/ +/open_off.ico/1.1/Thu Apr 10 08:00:48 2003/-kb/ +/open_on.ico/1.1/Thu Apr 10 07:59:50 2003/-kb/ +/paste_dis.ico/1.1/Tue Apr 22 17:21:16 2003/-kb/ +/paste_off.ico/1.1/Thu Apr 10 13:00:34 2003/-kb/ +/paste_on.ico/1.1/Thu Apr 10 14:52:58 2003/-kb/ +/playrecord_dis.ico/1.1/Wed May 18 18:51:40 2005/-kb/ +/playrecord_off.ico/1.1/Wed May 18 18:51:48 2005/-kb/ +/playrecord_on.ico/1.1/Wed May 18 18:55:40 2005/-kb/ +/readonly.ico/1.1/Fri Apr 25 15:56:44 2003/-kb/ +/redo_dis.ico/1.1/Tue Apr 22 17:28:36 2003/-kb/ +/redo_off.ico/1.1/Thu Apr 10 09:07:00 2003/-kb/ +/redo_on.ico/1.1/Thu Apr 10 09:04:28 2003/-kb/ +/save_dis.ico/1.1/Tue Apr 22 17:21:16 2003/-kb/ +/save_off.ico/1.1/Thu Apr 10 13:19:52 2003/-kb/ +/save_on.ico/1.1/Thu Apr 10 13:20:48 2003/-kb/ +/saveall_dis.ico/1.1/Tue Apr 22 17:21:16 2003/-kb/ +/saveall_off.ico/1.1/Thu Apr 10 13:36:00 2003/-kb/ +/saveall_on.ico/1.1/Thu Apr 10 13:36:34 2003/-kb/ +/saved.ico/1.1/Sun Apr 20 01:36:20 2003/-kb/ +/saverecord_dis.ico/1.1/Wed May 18 18:51:44 2005/-kb/ +/saverecord_off.ico/1.1/Wed May 18 18:51:56 2005/-kb/ +/saverecord_on.ico/1.1/Wed May 18 18:51:36 2005/-kb/ +/startrecord_dis.ico/1.1/Wed May 18 18:51:42 2005/-kb/ +/startrecord_off.ico/1.1/Wed May 18 18:51:54 2005/-kb/ +/startrecord_on.ico/1.1/Wed May 18 18:51:34 2005/-kb/ +/stoprecord_dis.ico/1.1/Wed May 18 18:51:46 2005/-kb/ +/stoprecord_off.ico/1.1/Wed May 18 18:51:58 2005/-kb/ +/stoprecord_on.ico/1.1/Wed May 18 18:51:26 2005/-kb/ +/supp_off.ico/1.1/Thu Apr 10 08:06:56 2003/-kb/ +/supp_on.ico/1.1/Thu Apr 10 08:12:02 2003/-kb/ +/suppall_off.ico/1.1/Thu Apr 10 10:15:42 2003/-kb/ +/suppall_on.ico/1.1/Thu Apr 10 10:16:46 2003/-kb/ +/undo_dis.ico/1.1/Tue Apr 22 17:28:36 2003/-kb/ +/undo_off.ico/1.1/Thu Apr 10 09:06:02 2003/-kb/ +/undo_on.ico/1.1/Thu Apr 10 09:03:14 2003/-kb/ +/unsaved.ico/1.1/Sun Apr 20 01:37:54 2003/-kb/ +/userDefineDlg_off.ico/1.1/Fri Nov 14 14:31:38 2003/-kb/ +/userDefineDlg_on.ico/1.1/Fri Nov 14 14:31:38 2003/-kb/ +/wrap_dis.ico/1.1/Mon Jan 5 19:13:08 2004/-kb/ +/wrap_off.ico/1.1/Mon Jan 5 19:12:52 2004/-kb/ +/wrap_on.ico/1.1/Mon Jan 5 19:12:20 2004/-kb/ +/zoomIn_off.ico/1.1/Tue Apr 22 17:00:20 2003/-kb/ +/zoomIn_on.ico/1.1/Tue Apr 22 17:00:20 2003/-kb/ +/zoomOut_off.ico/1.1/Tue Apr 22 17:00:20 2003/-kb/ +/zoomOut_on.ico/1.1/Tue Apr 22 17:00:20 2003/-kb/ +/syncH_dis.ico/1.1/Thu Dec 22 19:08:26 2005/-kb/ +/syncH_off.ico/1.1/Thu Dec 22 19:08:16 2005/-kb/ +/syncH_on.ico/1.1/Thu Dec 22 19:08:30 2005/-kb/ +/syncV_dis.ico/1.1/Thu Dec 22 19:08:22 2005/-kb/ +/syncV_off.ico/1.1/Thu Dec 22 19:08:20 2005/-kb/ +/syncV_on.ico/1.1/Thu Dec 22 19:08:28 2005/-kb/ +/npp.ico/1.2/Sun Jan 8 16:36:46 2006/-kb/ +/find.bmp/1.2/Sun Feb 12 12:27:18 2006/-kb/ +/findReplace.bmp/1.2/Sun Feb 12 12:59:20 2006/-kb/ +/invisibleChar.bmp/1.2/Sun Feb 12 23:51:44 2006/-kb/ +/saveAll.bmp/1.2/Sun Feb 12 22:59:06 2006/-kb/ +/saveRecord.bmp/1.2/Sun Feb 12 15:28:36 2006/-kb/ +/showPannel.bmp/1.2/Sun Feb 12 22:34:06 2006/-kb/ +/zoomIn.bmp/1.2/Sun Feb 12 12:55:28 2006/-kb/ +/zoomOut.bmp/1.2/Sun Feb 12 12:48:40 2006/-kb/ +/copy.bmp/1.1/Sun Feb 12 22:44:26 2006/-kb/ +/openFile.bmp/1.1/Sun Feb 12 14:16:38 2006/-kb/ +/paste.bmp/1.1/Sun Feb 12 22:56:52 2006/-kb/ +/print.bmp/1.1/Sun Feb 12 15:10:04 2006/-kb/ +/redo.bmp/1.1/Sun Feb 12 17:12:12 2006/-kb/ +/undo.bmp/1.1/Sun Feb 12 17:14:12 2006/-kb/ +/playRecord.bmp/1.3/Fri Feb 17 00:47:08 2006/-kb/ +/startRecord.bmp/1.2/Fri Feb 17 00:50:42 2006/-kb/ +/stopRecord.bmp/1.2/Fri Feb 17 00:49:28 2006/-kb/ +/syncV.bmp/1.2/Sat Feb 18 01:37:00 2006/-kb/ +/wrap.bmp/1.2/Sat Feb 18 00:51:40 2006/-kb/ +/cut.bmp/1.2/Tue Feb 21 23:40:40 2006/-kb/ +/saveFile.bmp/1.2/Tue Feb 21 23:44:16 2006/-kb/ +/syncH.bmp/1.3/Tue Feb 21 23:46:10 2006/-kb/ +/closeAll.bmp/1.3/Sat Mar 11 02:42:22 2006/-kb/ +/closeFile.bmp/1.3/Sat Mar 11 02:57:00 2006/-kb/ +/newFile.bmp/1.2/Sat Mar 11 02:12:38 2006/-kb/ +D diff --git a/PowerEditor/src/icons/CVS/Repository b/PowerEditor/src/icons/CVS/Repository new file mode 100644 index 00000000..1e77f34f --- /dev/null +++ b/PowerEditor/src/icons/CVS/Repository @@ -0,0 +1 @@ +notepad-plus/PowerEditor/src/icons diff --git a/PowerEditor/src/icons/CVS/Root b/PowerEditor/src/icons/CVS/Root new file mode 100644 index 00000000..83fc7ccc --- /dev/null +++ b/PowerEditor/src/icons/CVS/Root @@ -0,0 +1 @@ +:ext:donho@notepad-plus.cvs.sourceforge.net:/cvsroot/notepad-plus diff --git a/PowerEditor/src/icons/allChars_off.ico b/PowerEditor/src/icons/allChars_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..425a9adfb87b20d21a30b4b4f59e7b6d8ce596b6 GIT binary patch literal 4022 zcmeHKF;c@Y5WFOm3`3dH6+`bT9k0nZ&^Po0p5X`RA(VLl!?E&Vaam?eMx#K1E;@PF zx?9C3$&-j|WGlmPFWFwVA`iF@LuMi`w<32tkw@SG{siC14SJD)*u^Y+VF81{A=m{y zpiI+*YaY_v$Bp&zlyQWyymrQj7> z660|!4e{l^>ke=a{Ha~;^XFkL63@VDXxlb+L1>&R!y+iOOfzPQpwJju zhDA_lnP$uqL7_3S42z)9GR>GJf4Sz9rIY^Jc4l~0mXA(2Qd z5=o}sF1)QwwSMVM4!rZelgs5!U&me4HSPdUbkcv+f+9gnzUpUnCVB20o);htL)dQ| z!GeQxj<3%Ttk-MU?-AWah@uF#8zYWmJbMX}B*DZ_k)|o&W|%KCWLXB=&#_qL$nzZV z3t(12CryF^MNz;FOZdwY0WVROC1nKkN;3g_F7UDtSS12H6%b;(FpYL*cJzCxa$%9!)O7`t>NB!4ixx9_eL z3CSOx3?FZf&5dUr>Tha|x2(Z{HJ&Ur-1wSWs?p?$s)qcyrK??4ZFh~|VTe(-8eU_6 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/npp.ico.new b/PowerEditor/src/icons/npp.ico.new new file mode 100644 index 0000000000000000000000000000000000000000..4db817fd9ff6865bf5d0ea8df1313199d9ef79e9 GIT binary patch literal 90022 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 Wh<8>?65>^{Ng(Sv?j;aE`~LwrA_YwV 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 + + + + + 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 + + + + 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 + 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 $ @ \ & < > # { } + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + !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 compact content coords data datafld dataformatas datapagesize datasrc datetime dd declare defer del dfn dir disabled div dl dt em 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 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 + + + + 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 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 + + + + 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 + + + + 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 + + + + 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 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 + + + + 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 + + + + rem set if else exist errorlevel for in do break call 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 + + + + + + + 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 + + + + + + + + + + + + + + + + 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 + + + + 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 + + + + 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 + + + + + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + + - * / = < > <= >= => 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? + + + + __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 + + + + $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 + + + 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 + + + + + ifTrue: ifFalse: whileTrue: whileFalse: ifNil: ifNotNil: whileTrue whileFalse repeat isNil notNil + + + + ? 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 + + + + 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 + + + + + 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 + + + + 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 + + + + 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 + + + + + break case catch continue else elseif end for function global if otherwise persistent return switch try while + + + + 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 _ + + + + 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 + + + + + + + + + + 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 + + + + + diff --git a/PowerEditor/src/lastRecentFileList.h b/PowerEditor/src/lastRecentFileList.h new file mode 100644 index 00000000..28f6543a --- /dev/null +++ b/PowerEditor/src/lastRecentFileList.h @@ -0,0 +1,163 @@ +#ifndef LASTRECENTFILELIST_H +#define LASTRECENTFILELIST_H + +#include +#include + +typedef std::list stringList; + +class LastRecentFileList +{ +public : + LastRecentFileList() : _hasSeparators(false){ + _userMax = (NppParameters::getInstance())->getNbMaxFile(); + }; + + void 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 add(const char *fn) { + if (_userMax == 0) + return; + + int size = _lrfl.size(); + + if (size >= _userMax) + { + _lrfl.erase(_lrfl.begin()); + + int id = ::GetMenuItemID(_hMenu, 0 + _posBase); + ::RemoveMenu(_hMenu, id, MF_BYCOMMAND); + setAvailable(id); + size--; + } + _lrfl.push_back(fn); + ::InsertMenu(_hMenu, _posBase + size, MF_BYPOSITION, popFirstAvailableID() + _idBase, fn); + + if (!_hasSeparators) + { + ::InsertMenu(_hMenu, _posBase + size + 1, MF_BYPOSITION, UINT(-1), 0); + ::InsertMenu(_hMenu, _posBase + size + 2, MF_BYPOSITION, IDM_OPEN_ALL_RECENT_FILE, "Open All Recent Files"); + ::InsertMenu(_hMenu, _posBase + size + 3, MF_BYPOSITION, UINT(-1), 0); + _hasSeparators = true; + } + }; + + void remove(const char *fn) { + if (find2Remove(fn)) + { + int id = 0; + char filename[MAX_PATH]; + for (size_t i = 0 ; i < _lrfl.size() + 1 ; i++) + { + ::GetMenuString(_hMenu, i + _posBase, filename, sizeof(filename), MF_BYPOSITION); + + if (!strcmp(fn, filename)) + { + id = ::GetMenuItemID(_hMenu, i + _posBase); + break; + } + } + ::RemoveMenu(_hMenu, id, MF_BYCOMMAND); + setAvailable(id); + + int size; + if (!(size = _lrfl.size())) + { + ::RemoveMenu(_hMenu, _posBase + 2, MF_BYPOSITION); + ::RemoveMenu(_hMenu, _posBase + 0, MF_BYPOSITION); + ::RemoveMenu(_hMenu, IDM_OPEN_ALL_RECENT_FILE, MF_BYCOMMAND); + _hasSeparators = false; + } + } + }; + /* + int getNbLRF() const { + return _lrfl.size(); + }; +*/ + int getMaxNbLRF() const { + return NB_MAX_LRF_FILE; + }; + + void setUserMaxNbLRF(int size) { + _userMax = size; + }; + + int getUserMaxNbLRF() const { + return _userMax; + }; + + void saveLRFL() const { + NppParameters *pNppParams = NppParameters::getInstance(); + pNppParams->writeNbHistoryFile(_userMax); + + // if user defined nb recent files smaller than the size of list, + // we just keep the newest ones + int decal = _lrfl.size() - _userMax; + decal = (decal >= 0)?decal:0; + stringList::const_iterator it = _lrfl.begin(); + for (int i = 0 ; i < decal ; i++, it++); + + for (int i = 0 ; it != _lrfl.end() && (i < _userMax) ; it++, i++) + { + pNppParams->writeHistory(((const std::string)*it).c_str()); + } + }; + +private: + stringList _lrfl; + int _userMax; + + // For the menu + HMENU _hMenu; + int _posBase; + int _idBase; + bool _idFreeArray[NB_MAX_LRF_FILE]; + bool _hasSeparators; + + bool find(const char *fn) const { + for (stringList::const_iterator it = _lrfl.begin() ; it != _lrfl.end() ; it++) + if (*it == fn) + return true; + return false; + }; + + bool find2Remove(const char *fn) { + for (stringList::iterator it = _lrfl.begin() ; it != _lrfl.end() ; it++) + { + if (*it == fn) + { + _lrfl.erase(it); + return true; + } + } + return false; + }; + + int popFirstAvailableID() { + for (int i = 0 ; i < NB_MAX_LRF_FILE ; i++) + { + if (_idFreeArray[i]) + { + _idFreeArray[i] = false; + return i; + } + } + return 0; + }; + + void setAvailable(int id) { + int index = id - _idBase; + _idFreeArray[index] = true; + }; +}; + +#endif //LASTRECENTFILELIST_H diff --git a/PowerEditor/src/lesDlgs.h b/PowerEditor/src/lesDlgs.h new file mode 100644 index 00000000..7decb9a0 --- /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, char *text) { + Window::init(hInst, parent); + _defaultValue = valueToSet; + strcpy(_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; + char _name[32]; + POINT _p; + +}; + +#endif //TABSIZE_DLG_H diff --git a/PowerEditor/src/notepad++.exe.manifest b/PowerEditor/src/notepad++.exe.manifest new file mode 100644 index 00000000..80a8b774 --- /dev/null +++ b/PowerEditor/src/notepad++.exe.manifest @@ -0,0 +1,23 @@ + + + +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..fff3448e --- /dev/null +++ b/PowerEditor/src/resource.h @@ -0,0 +1,551 @@ +//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 + +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif + +#define IDI_M30ICON 100 +#define IDR_MENU1 101 +#define IDR_ACCELERATOR1 102 +#define IDR_RT_MANIFEST 103 + +#define IDI_NEW_OFF_ICON 201 +#define IDI_OPEN_OFF_ICON 202 +#define IDI_CLOSE_OFF_ICON 203 +#define IDI_CLOSEALL_OFF_ICON 204 +#define IDI_SAVE_OFF_ICON 205 +#define IDI_SAVEALL_OFF_ICON 206 +#define IDI_CUT_OFF_ICON 207 +#define IDI_COPY_OFF_ICON 208 +#define IDI_PASTE_OFF_ICON 209 +#define IDI_UNDO_OFF_ICON 210 +#define IDI_REDO_OFF_ICON 211 +#define IDI_FIND_OFF_ICON 212 +#define IDI_REPLACE_OFF_ICON 213 +#define IDI_ZOOMIN_OFF_ICON 214 +#define IDI_ZOOMOUT_OFF_ICON 215 +#define IDI_VIEW_UD_DLG_OFF_ICON 216 +#define IDI_PRINT_OFF_ICON 217 +#define IDI_VIEW_ALL_CHAR_ON_ICON 218 +#define IDI_VIEW_INDENT_ON_ICON 219 +#define IDI_VIEW_WRAP_ON_ICON 220 + +#define IDI_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_MACRO_RECORDING 1407 + +#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 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_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) + + // A mettre à jour si on ajoute nouveau menu item dans le menu "File" + #define IDM_FILEMENU_LASTONE IDM_FILE_RELOAD + +#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_STARTRECORDINGMACRO (IDM_EDIT + 18) + #define IDM_EDIT_STOPRECORDINGMACRO (IDM_EDIT + 19) + #define IDM_EDIT_TOGGLEMACRORECORDING (IDM_EDIT + 20) + #define IDM_EDIT_PLAYBACKRECORDEDMACRO (IDM_EDIT + 21) + #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_SAVECURRENTMACRO (IDM_EDIT + 25) + #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_RUNMULTIMACRODLG (IDM_EDIT+32) + #define IDM_EDIT_CLEARREADONLY (IDM_EDIT+33) + #define IDM_EDIT_COLUMNMODE (IDM_EDIT+34) + //Belong to MENU FILE + #define IDM_OPEN_ALL_RECENT_FILE (IDM_EDIT + 40) + +#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_MARKALL (IDM_SEARCH + 16) + #define IDM_SEARCH_UNMARKALL (IDM_SEARCH + 17) + +#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_STATUSBAR (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_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_FORMAT (IDM + 5000) + #define IDM_FORMAT_TODOS (IDM_FORMAT + 1) + #define IDM_FORMAT_TOUNIX (IDM_FORMAT + 2) + #define IDM_FORMAT_TOMAC (IDM_FORMAT + 3) + //NEW + #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) + //WEN + +#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_USER (IDM_LANG + 50) //46050 + #define IDM_LANG_USER_LIMIT (IDM_LANG + 80) //46080 + + +#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 IDC_MINIMIZED_TRAY (IDM + 7001) + +#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_FILE_AUTODETECTION (IDM_SETTING + 6) + #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_FILE_AUTODETECTION_ENABLE (IDM_SETTING + 12) + #define IDM_SETTING_FILE_AUTODETECTION_DISABLE (IDM_SETTING + 13) + #define IDM_SETTING_FILE_AUTODETECTION_ENABLESILENTLY (IDM_SETTING + 14) +/* + #define IDM_SETTING_SETUTF8SANSBOM (IDM_SETTING + 15) + #define IDM_SETTING_SETANSI (IDM_SETTING + 16) +*/ + +#define IDM_EXECUTE (IDM + 9000) + +#define IDC_DOC_GOTO_ANOTHER_VIEW 10001 +#define IDC_DOC_CLONE_TO_ANOTHER_VIEW 10002 + +#define IDCMD 50000 + #define IDC_AUTOCOMPLETE (IDCMD+0) + #define IDC_AUTOCOMPLETE_CURRENTFILE (IDCMD+1) + //#define IDC_SEARCH_FINDPREVSELECTED (IDCMD+2) + #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_BUTTON_PRINT 1001 + +#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 IDR_NPP_ACCELERATORS 1501 +//#define IDR_NPP_ACCELERATORS_98 1502 + +// #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 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) + +// 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) +// See Notepad_plus_msgs.h +//#define NOTEPADPLUS_USER (WM_USER + 1000) +#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..38ea73e4 --- /dev/null +++ b/PowerEditor/src/shortcuts.xml @@ -0,0 +1,23 @@ + + + + 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) -multiInst + + + + + + + + + + + + + diff --git a/PowerEditor/src/stylers.xml b/PowerEditor/src/stylers.xml new file mode 100644 index 00000000..fd52701d --- /dev/null +++ b/PowerEditor/src/stylers.xml @@ -0,0 +1,709 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + if else for while + bool long int char + + + + + + + + + + + + + + + + + + + + + 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/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..1a9b481b --- /dev/null +++ b/PowerEditor/src/winmain.cpp @@ -0,0 +1,309 @@ +//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 "Notepad_plus.h" +#include "SysMsg.h" +#include + +//const char localConfFile[] = "doLocalConf.xml"; + +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; +}; + + +static LangType getLangTypeFromParam(char *list2Clean) { + char word[1024]; + bool checkDash = true; + bool checkL = false; + bool action = false; + bool isFileNamePart = false; + int pos2Erase = 0; + + for (int i = 0, j = 0 ; i <= int(strlen(list2Clean)) ; i++) + { + if ((list2Clean[i] == ' ') || (list2Clean[i] == '\0')) + { + if (action) + { + word[j] = '\0'; + j = 0; + action = false; + + for (i = i + 1 ; i <= int(strlen(list2Clean)) ; i++, pos2Erase++) + list2Clean[pos2Erase] = list2Clean[i]; + + list2Clean[pos2Erase] = '\0'; + + return NppParameters::getLangIDFromStr(word); + } + checkDash = true; + } + else if (list2Clean[i] == '"') + { + isFileNamePart = !isFileNamePart; + } + + if (!isFileNamePart) + { + if (action) + { + word[j++] = list2Clean[i]; + } + else if (checkDash) + { + if (list2Clean[i] == '-') + checkL = true; + + if (list2Clean[i] != ' ') + checkDash = false; + } + else if (checkL) + { + if (list2Clean[i] == 'l') + { + action = true; + pos2Erase = i-1; + } + checkL = false; + } + } + } + return L_TXT; +}; + +static int getLn2GoFromParam(char *list2Clean) { + char word[16]; + bool checkDash = true; + bool checkN = false; + bool action = false; + bool isFileNamePart = false; + int pos2Erase = 0; + + for (int i = 0, j = 0 ; i <= int(strlen(list2Clean)) ; i++) + { + if ((list2Clean[i] == ' ') || (list2Clean[i] == '\0')) + { + if (action) + { + word[j] = '\0'; + j = 0; + action = false; + + for (i = i + 1 ; i <= int(strlen(list2Clean)) ; i++, pos2Erase++) + list2Clean[pos2Erase] = list2Clean[i]; + + list2Clean[pos2Erase] = '\0'; + return atoi(word); + } + checkDash = true; + } + else if (list2Clean[i] == '"') + { + isFileNamePart = !isFileNamePart; + } + + if (!isFileNamePart) + { + if (action) + { + word[j++] = list2Clean[i]; + } + else if (checkDash) + { + if (list2Clean[i] == '-') + checkN = true; + + if (list2Clean[i] != ' ') + checkDash = false; + } + else if (checkN) + { + if (list2Clean[i] == 'n') + { + action = true; + pos2Erase = i-1; + } + checkN = false; + } + } + } + return -1; +}; + +const char FLAG_MULTI_INSTANCE[] = "-multiInst"; + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, int nCmdShow) +{ + bool TheFirstOne = true; + + ::SetLastError(NO_ERROR); + ::CreateMutex(NULL, false, "nppInstance"); + if (::GetLastError() == ERROR_ALREADY_EXISTS) + TheFirstOne = false; + + bool multiInstance = isInList(FLAG_MULTI_INSTANCE, lpszCmdLine); + LangType langType = getLangTypeFromParam(lpszCmdLine); + int lineNumber = getLn2GoFromParam(lpszCmdLine); + + NppParameters *pNppParameters = NppParameters::getInstance(); + + if ((!multiInstance) && (!TheFirstOne)) + { + HWND hNotepad_plus = ::FindWindow(Notepad_plus::getClassName(), NULL); + for (;!(hNotepad_plus = ::FindWindow(Notepad_plus::getClassName(), NULL));) + Sleep(100); + + // First of all, destroy static object NppParameters + pNppParameters->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 (lpszCmdLine[0]) + { + COPYDATASTRUCT copyData; + DWORD ln = 0; + if (lineNumber != -1) + ln = lineNumber; + copyData.dwData = (ln << 8) | DWORD(langType); + + string quotFileName = "\""; + // tell the other running instance the FULL path to the new file to load + if (lpszCmdLine[0] == '"') + { + copyData.cbData = long(strlen(lpszCmdLine) + 1); + copyData.lpData = lpszCmdLine; + } + else + { + char longFileName[MAX_PATH]; + ::GetFullPathName(lpszCmdLine, MAX_PATH, longFileName, NULL); + quotFileName += longFileName; + quotFileName += "\""; + copyData.cbData = long(quotFileName.length() + 1); + copyData.lpData = (void *)quotFileName.c_str(); + } + + ::SendMessage(hNotepad_plus, WM_COPYDATA, (WPARAM)hInstance, (LPARAM)©Data); + } + return 0; + } + + pNppParameters->load(); + Notepad_plus notepad_plus_plus; + MSG msg; + msg.wParam = 0; + + try { + char *pPathNames = NULL; + if (lpszCmdLine[0]) + { + pPathNames = lpszCmdLine; + } + pNppParameters->setDefLang(langType); + pNppParameters->setLineNumber2go(lineNumber); + + notepad_plus_plus.init(hInstance, NULL, pPathNames); + + while (::GetMessage(&msg, NULL, 0, 0)) + { + // if the message doesn't belong to the notepad_plus_plus's dialog + if (!notepad_plus_plus.isDlgsMsg(&msg)) + { + if (::TranslateAccelerator(notepad_plus_plus.getHSelf(), notepad_plus_plus.getAccTable(), &msg) == 0) + { + try { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } catch(std::exception ex) { + ::MessageBox(NULL, ex.what(), "Exception", MB_OK); + } catch(...) { + systemMessage("System Error"); + } + } + } + } + + } catch(int i) { + if (i == 106901) + ::MessageBox(NULL, "Scintilla.init is failed!", "106901", MB_OK); + else { + char str[50] = "God Damn Exception : "; + char code[10]; + itoa(i, code, 10); + ::MessageBox(NULL, strcat(str, code), "int exception", MB_OK); + } + } +/* + catch(std::exception ex) { + ::MessageBox(NULL, ex.what(), "Exception", MB_OK); + } + catch(...) { + systemMessage("System Err"); + } +*/ + return (UINT)msg.wParam; +} + diff --git a/PowerEditor/src/xmlUpdater/Debug/BuildLog.htm b/PowerEditor/src/xmlUpdater/Debug/BuildLog.htm new file mode 100644 index 00000000..7252939d --- /dev/null +++ b/PowerEditor/src/xmlUpdater/Debug/BuildLog.htm @@ -0,0 +1,54 @@ + + + + + +

      +
      +Build Log +
        
      +

      ------- Build started: Project: xmlUpdater, Configuration: Debug|Win32 ------- +

      +
      +Command Lines +
        
      Creating temporary file "e:\Sources\notepad++\PowerEditor\src\xmlUpdater\Debug\RSP000002.rsp" with contents
      +[
      +/Od /I "E:\Sources\notepad++\PowerEditor\src\TinyXml" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Gm /EHsc /RTC1 /MLd /Fo"Debug/" /Fd"Debug/vc70.pdb" /W3 /c /Wp64 /ZI /TP
      +".\xmlUpdater.cpp"
      +"\Sources\notepad++\PowerEditor\src\TinyXml\tinyxmlparser.cpp"
      +"\Sources\notepad++\PowerEditor\src\TinyXml\tinyxmlerror.cpp"
      +"\Sources\notepad++\PowerEditor\src\TinyXml\tinyxml.cpp"
      +"\Sources\notepad++\PowerEditor\src\TinyXml\tinystr.cpp"
      +]
      +Creating command line "cl.exe @"e:\Sources\notepad++\PowerEditor\src\xmlUpdater\Debug\RSP000002.rsp" /nologo"
      +Creating temporary file "e:\Sources\notepad++\PowerEditor\src\xmlUpdater\Debug\RSP000003.rsp" with contents
      +[
      +/OUT:"Debug/xmlUpdater.exe" /INCREMENTAL /NOLOGO /DEBUG /PDB:"Debug/xmlUpdater.pdb" /SUBSYSTEM:WINDOWS /MACHINE:X86  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
      +".\Debug\tinystr.obj"
      +".\Debug\tinyxml.obj"
      +".\Debug\tinyxmlerror.obj"
      +".\Debug\tinyxmlparser.obj"
      +".\Debug\xmlUpdater.obj"
      +]
      +Creating command line "link.exe @"e:\Sources\notepad++\PowerEditor\src\xmlUpdater\Debug\RSP000003.rsp""
      +
      +Output Window +
        
      Compiling...
      +xmlUpdater.cpp
      +tinyxmlparser.cpp
      +tinyxmlerror.cpp
      +tinyxml.cpp
      +e:\Sources\notepad++\PowerEditor\src\TinyXml\tinyxml.cpp(96) : warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data
      +tinystr.cpp
      +e:\Sources\notepad++\PowerEditor\src\TinyXml\tinystr.cpp(49) : warning C4267: '=' : conversion from 'size_t' to 'unsigned int', possible loss of data
      +e:\Sources\notepad++\PowerEditor\src\TinyXml\tinystr.cpp(95) : warning C4267: '=' : conversion from 'size_t' to 'unsigned int', possible loss of data
      +e:\Sources\notepad++\PowerEditor\src\TinyXml\tinystr.cpp(143) : warning C4267: '=' : conversion from 'size_t' to 'unsigned int', possible loss of data
      +e:\Sources\notepad++\PowerEditor\src\TinyXml\tinystr.cpp(262) : warning C4244: 'return' : conversion from '__w64 int' to 'unsigned int', possible loss of data
      +Generating Code...
      +Linking...
      +
      +Results +
        
      +Build log was saved at "file://e:\Sources\notepad++\PowerEditor\src\xmlUpdater\Debug\BuildLog.htm"
      +xmlUpdater - 0 error(s), 5 warning(s)
      +
      \ No newline at end of file diff --git a/PowerEditor/src/xmlUpdater/configModel.xml b/PowerEditor/src/xmlUpdater/configModel.xml new file mode 100644 index 00000000..bcef6f65 --- /dev/null +++ b/PowerEditor/src/xmlUpdater/configModel.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/PowerEditor/src/xmlUpdater/langsModel.xml b/PowerEditor/src/xmlUpdater/langsModel.xml new file mode 100644 index 00000000..ba690cfa --- /dev/null +++ b/PowerEditor/src/xmlUpdater/langsModel.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/PowerEditor/src/xmlUpdater/makefile b/PowerEditor/src/xmlUpdater/makefile new file mode 100644 index 00000000..8ca132df --- /dev/null +++ b/PowerEditor/src/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/xmlUpdater/stylesGlobalModel.xml b/PowerEditor/src/xmlUpdater/stylesGlobalModel.xml new file mode 100644 index 00000000..67054406 --- /dev/null +++ b/PowerEditor/src/xmlUpdater/stylesGlobalModel.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/PowerEditor/src/xmlUpdater/stylesLexerModel.xml b/PowerEditor/src/xmlUpdater/stylesLexerModel.xml new file mode 100644 index 00000000..cb4a9ce5 --- /dev/null +++ b/PowerEditor/src/xmlUpdater/stylesLexerModel.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/PowerEditor/src/xmlUpdater/xmlUpdater.cpp b/PowerEditor/src/xmlUpdater/xmlUpdater.cpp new file mode 100644 index 00000000..766e82db --- /dev/null +++ b/PowerEditor/src/xmlUpdater/xmlUpdater.cpp @@ -0,0 +1,326 @@ +/* +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; +}; + + +int update(TiXmlNode *modelNode, TiXmlNode *srcNode, TiXmlNode *destNode) { + TiXmlNode *srcChildNode = NULL; + TiXmlNode *destChildNode = NULL; + TiXmlNode *modelChildNode = modelNode->FirstChild("Node"); + + if (!modelChildNode) + return 0; + + const char *nodeName = (modelChildNode->ToElement())->Attribute("nodeName"); + const char *name = (modelChildNode->ToElement())->Attribute("name"); + if (nodeName) + { + srcChildNode = srcNode->FirstChild(nodeName); + if (!srcChildNode) + throw int(4); + + destChildNode = destNode->FirstChild(nodeName); + if (!destChildNode) + { + //Insertion + destNode->InsertEndChild(*srcChildNode); + return 0; + } + else + { + if (name && name[0]) + { + srcChildNode = srcNode->FirstChild(nodeName); + while (srcChildNode) + { + const char *attrib = (srcChildNode->ToElement())->Attribute(name); + if (attrib) + { + bool found = false; + 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 (!found) + { + // Insertion + destNode->InsertEndChild(*srcChildNode); + //return 0; + } + } + srcChildNode = srcChildNode->NextSibling(nodeName); + } + } + } + } + return 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/xmlUpdater/xmlUpdater.vcproj b/PowerEditor/src/xmlUpdater/xmlUpdater.vcproj new file mode 100644 index 00000000..db226a82 --- /dev/null +++ b/PowerEditor/src/xmlUpdater/xmlUpdater.vcproj @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PowerEditor/visual.net/Debug/BuildLog.htm b/PowerEditor/visual.net/Debug/BuildLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..2e096e3f4d0dd572c859273405edd1682b80cb48 GIT binary patch literal 27736 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 as}}p8pjkU)R%BbrL-Frh+?)K9*#7`VbA!GB literal 0 HcmV?d00001 diff --git a/PowerEditor/visual.net/Release/BuildLog.htm b/PowerEditor/visual.net/Release/BuildLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..370acc6fa20de2917bdea15fab30a505df51d0aa GIT binary patch literal 37528 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 literal 0 HcmV?d00001 diff --git a/PowerEditor/visual.net/no_ms_shit.vsprops b/PowerEditor/visual.net/no_ms_shit.vsprops new file mode 100644 index 00000000..b19234ab --- /dev/null +++ b/PowerEditor/visual.net/no_ms_shit.vsprops @@ -0,0 +1,11 @@ + + + + diff --git a/PowerEditor/visual.net/notepadPlus.7.0.vcproj b/PowerEditor/visual.net/notepadPlus.7.0.vcproj new file mode 100644 index 00000000..e5691421 --- /dev/null +++ b/PowerEditor/visual.net/notepadPlus.7.0.vcproj @@ -0,0 +1,803 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PowerEditor/visual.net/notepadPlus.vcproj b/PowerEditor/visual.net/notepadPlus.vcproj new file mode 100644 index 00000000..da873687 --- /dev/null +++ b/PowerEditor/visual.net/notepadPlus.vcproj @@ -0,0 +1,1081 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/readmeFirst.txt b/readmeFirst.txt new file mode 100644 index 00000000..dd0d3034 --- /dev/null +++ b/readmeFirst.txt @@ -0,0 +1,33 @@ +What is Notepad++ ? + +Notepad++ is a free source editor with the syntax highlighting. It gives also the extra functionality +to the general user : colourise the user defined words. You can print your source code in color +(or whatever you want) if you have a color printer (WYSIWYG).Furthermore, Notepad++ have +the multi-view feature, that allows user to edit the different document in the same time, +and even to edit the same document synchronizely in 2 different views. Notepad++ support +the fully drag and drop : not only you can drop the file from explorer to open it, but also you +can drag and drop a document from a view to another. With all the functionalities, +Notepad++ runs as fast as Notepad provided by MS Windows. + + +Notepad++ source note: + +To build this package: + +For generating the executable file, you can use VC++ 7 or MinGW 3.0 / 2.X +For generating the the dll files, you have 2 choices as well : VC++ 6 (from v2.5) or MinGW 3.0 / 2.X + + +All the binaries will be builded in the directory notepad++\PowerEditor\bin + +Note that the executable file npp.exe builded by MinGW 3.0, for the reason of +the runtime lib static-link, has almost 160KB more than the one builded by VC++ 7. + +There's no remedy for the moment. If you can reduce the exe size by adding/changing +the compiler flag or linker flag, please let me know. + +Go to Notepad++ official site for more information : +http://notepad-plus.sourceforge.net/ + +Don +don.h@free.fr diff --git a/scintilla/License.txt b/scintilla/License.txt new file mode 100644 index 00000000..8d286121 --- /dev/null +++ b/scintilla/License.txt @@ -0,0 +1,20 @@ +License for Scintilla and SciTE + +Copyright 1998-2003 by Neil Hodgson + +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation. + +NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE +OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/scintilla/README b/scintilla/README new file mode 100644 index 00000000..9775d703 --- /dev/null +++ b/scintilla/README @@ -0,0 +1,69 @@ +README for building of Scintilla and SciTE + +Scintilla can be built by itself. +To build SciTE, Scintilla must first be built. + + +*** GTK+/Linux version *** + +You must first have GTK+ 1.2 or later and GCC (3.1 or better) installed. +GTK+ 1.0x will not work and when it did it was very slow. +Other C++ compilers may work but may require tweaking the make file. + +To build Scintilla, use the makefile located in the scintilla/gtk directory + cd scintilla/gtk + make + cd ../.. + +To build and install SciTE, use the makefile located in the scite/gtk directory + cd scite/gtk + make + make install + +This installs SciTE into $prefix/bin. The value of $prefix is determined from +the location of Gnome if it is installed. This is usually /usr if installed +with Linux or /usr/local if built from source. If Gnome is not installed +/usr/bin is used as the prefix. The prefix can be overridden on the command +line like "make prefix=/opt" but the same value should be used for both make +and make install as this location is compiled into the executable. The global +properties file is installed at $prefix/share/scite/SciTEGlobal.properties. +The language specific properties files are also installed into this directory. + +To build Scintilla for GTK+ 1 rather than the default GTK+ 2, define GTK1 on +the make command line: + make GTK1=1 + +To remove SciTE + make uninstall + +To clean the object files which may be needed to change $prefix + make clean + +The current make file only supports static linking between SciTE and Scintilla. + + +*** Windows version *** + +A C++ compiler is required. Visual Studio .NET 2003 is the development system +used for most development although Mingw32 3.1 and Borland C++ are also +supported. +For older versions of Borland make such as version 5.02, add the -l option. + +To build Scintilla, make in the scintilla/win32 directory + cd scintilla\win32 +GCC: mingw32-make +VS .NET: nmake -f scintilla.mak +VC++ 6: nmake -f scintilla_vc6.mak +Borland: make -fscintilla.mak + cd ..\.. + +To build SciTE, use the makefiles located in the scite/win32 directory + cd scite\win32 +GCC: mingw32-make +VS .NET: nmake -f scite.mak +Borland: make -fscite.mak + +An executable SciTE will now be in scite\bin. + +The Visual C++ 6.0 project (.dsp) files are no longer supported but are left +in the download for people that are prepared to update them. diff --git a/scintilla/bin/empty.txt b/scintilla/bin/empty.txt new file mode 100644 index 00000000..66183855 --- /dev/null +++ b/scintilla/bin/empty.txt @@ -0,0 +1 @@ +This empty files ensures that the directory is created. \ No newline at end of file diff --git a/scintilla/delbin.bat b/scintilla/delbin.bat new file mode 100644 index 00000000..8d29322f --- /dev/null +++ b/scintilla/delbin.bat @@ -0,0 +1 @@ +del /S /Q *.a *.aps *.bsc *.dll *.dsw *.exe *.idb *.ilc *.ild *.ilf *.ilk *.ils *.lib *.map *.ncb *.obj *.o *.opt *.pdb *.plg *.res *.sbr *.tds *.exp >NUL: diff --git a/scintilla/delcvs.bat b/scintilla/delcvs.bat new file mode 100644 index 00000000..d3ed21ce --- /dev/null +++ b/scintilla/delcvs.bat @@ -0,0 +1 @@ +del /S /Q .cvsignore diff --git a/scintilla/doc/Design.html b/scintilla/doc/Design.html new file mode 100644 index 00000000..d426cb36 --- /dev/null +++ b/scintilla/doc/Design.html @@ -0,0 +1,249 @@ + + + + + + + + + Scintilla and SciTE + + + + + + + + +
      + Scintilla icon + + Scintilla + Component Design +
      +

      + Top level structure +

      +

      + Scintilla consists of three major layers of C++ code +

      +
        +
      • + Portability Library +
      • +
      • + Core Code +
      • +
      • + Platform Events and API +
      • +
      +

      + The primary purpose of this structure is to separate the platform dependent code from the + platform independent core code. This makes it easier to port Scintilla to a new platform and + ensures that most readers of the code do not have to deal with platform details. To minimise + portability problems and avoid code bloat, a conservative subset of C++ is used in Scintilla + with no exception handling, run time type information or use of the standard C++ + library and with limited use of templates. +

      +
      +
      +

      + Portability Library +

      +

      + This is a fairly small and thin layer over the platform's native capabilities. +

      +

      + The portability library is defined in Platform.h and is implemented once for each platform. + PlatWin.cxx defines the Windows variants of the methods and PlatGTK.cxx the GTK+ variants. +

      +

      + Several of the classes here hold platform specific object identifiers and act as proxies to + these platform objects. Most client code can thus manipulate the platform objects without + caring which is the current platform. Sometimes client code needs access to the underlying + object identifiers and this is provided by the GetID method. The underlying types of the + platform specific identifiers are typedefed to common names to allow them to be transferred + around in client code where needed. +

      +

      + Point, PRectangle +

      +

      + These are simple classes provided to hold the commonly used geometric primitives. A + PRectangle follows the Mac / Windows convention of not including its bottom and right sides + instead of including all its sides as is normal in GTK+. It is not called Rectangle as this may be + the name of a macro on Windows. +

      +

      + Colour, ColourPair, Palette +

      +

      + Colour holds a platform specific colour identifier - COLORREF for Windows and GdkColor for + GTK+. The red, green and blue components that make up the colour are limited to the 8 bits of + precision available on Windows. ColourPairs are used because not all possible colours are + always available. Using an 8 bit colour mode, which is a common setting for both Windows and + GTK+, only 256 colours are possible on the display. Thus when an application asks for a dull + red, say #400000, it may only be allocated an already available colour such as #800000 or + #330000. With 16 or 2 colour modes even less choice is available and the application will + have to use the limited set of already available colours. +

      + A Palette object holds a set of colour pairs and can make the appropriate calls to ask to + allocate these colours and to see what the platform has decided will be allowed. +

      + Font +

      +

      + Font holds a platform specific font identifier - HFONT for Windows, GdkFont* for GTK+. It + does not own the identifier and so will not delete the platform font object in its + destructor. Client code should call Destroy at appropriate times. +

      +

      + Surface +

      +

      + Surface is an abstraction over each platform's concept of somewhere that graphical drawing + operations can be done. It may wrap an already created drawing place such as a window or be + used to create a bitmap that can be drawn into and later copied onto another surface. On + Windows it wraps a HDC and possibly a HBITMAP. On GTK+ it wraps a GdkDrawable* and possibly a + GdkPixmap*. Other platform specific objects are created (and correctly destroyed) whenever + required to perform drawing actions. +

      +

      + Drawing operations provided include drawing filled and unfilled polygons, lines, rectangles, + ellipses and text. The height and width of text as well as other details can be measured. + Operations can be clipped to a rectangle. Most of the calls are stateless with all parameters + being passed at each call. The exception to this is line drawing which is performed by + calling MoveTo and then LineTo. +

      +

      + Window +

      +

      + Window acts as a proxy to a platform window allowing operations such as showing, moving, + redrawing, and destroying to be performed. It contains a platform specific window identifier + - HWND for Windows, GtkWidget* for GTK+. +

      +

      + ListBox +

      +

      + ListBox is a subclass of Window and acts as a proxy to a platform listbox adding methods for + operations such as adding, retrieving, and selecting items. +

      +

      + Menu +

      +

      + Menu is a small helper class for constructing popup menus. It contains the platform specific + menu identifier - HMENU for Windows, GtkItemFactory* for GTK+. Most of the work in + constructing menus requires access to platform events and so is done in the Platform Events + and API layer. +

      +

      + Platform +

      +

      + The Platform class is used to access the facilities of the platform. System wide parameters + such as double click speed and chrome colour are available from Platform. Utility functions + such as DebugPrintf are also available from Platform. +

      +

      + Core Code +

      +

      + The bulk of Scintilla's code is platform independent. This is made up of the CellBuffer, + ContractionState, Document, Editor, Indicator, LineMarker, Style, ViewStyle, KeyMap, + ScintillaBase, CallTip, + and AutoComplete primary classes. +

      +

      + CellBuffer +

      +

      + A CellBuffer holds text and styling information, the undo stack, the assignment of line + markers to lines, and the fold structure. +

      +

      + A cell contains a character byte and its associated style byte. The current state of the + cell buffer is the sequence of cells that make up the text and a sequence of line information + containing the starting position of each line and any markers assigned to each line. +

      +

      + The undo stack holds a sequence of actions on the cell buffer. Each action is one of a text + insertion, a text deletion or an undo start action. The start actions are used to group + sequences of text insertions and deletions together so they can be undone together. To + perform an undo operation, each insertion or deletion is undone in reverse sequence. + Similarly, redo reapplies each action to the buffer in sequence. Whenever a character is + inserted in the buffer either directly through a call such as InsertString or through undo or + redo, its styling byte is initially set to zero. Client code is responsible for styling each + character whenever convenient. Styling information is not stored in undo actions. +

      +

      + Document +

      +

      + A document contains a CellBuffer and deals with some higher level abstractions such as + words, DBCS character sequences and line end character sequences. It is responsible for + managing the styling process and for notifying other objects when changes occur to the + document. +

      +

      + Editor +

      +

      + The Editor object is central to Scintilla. It is responsible for displaying a document and + responding to user actions and requests from the container. It uses ContractionState, Indicator, + LineMarker, Style, and ViewStyle objects to display the document and a KeyMap class to + map key presses to functions. + The visibility of each line is kept in the ContractionState which is also responsible for mapping + from display lines to documents lines and vice versa. +

      +

      + There may be multiple Editor objects attached to one Document object. Changes to a + document are broadcast to the editors through the DocWatcher mechanism. +

      +

      + ScintillaBase +

      +

      + ScintillaBase is a subclass of Editor and adds extra windowing features including display of + calltips, autocompletion lists and context menus. These features use CallTip and AutoComplete + objects. This class is optional so a lightweight implementation of Scintilla may bypass it if + the added functionality is not required. +

      +

      + Platform Events and API +

      +

      + Each platform uses different mechanisms for receiving events. On Windows, events are + received through messages and COM. On GTK+, callback functions are used. +

      +

      + For each platform, a class is derived from ScintillaBase (and thus from Editor). This is + ScintillaWin on Windows and ScintillaGTK on GTK+. These classes are responsible for + connecting to the platforms event mechanism and also to implement some virtual methods in + Editor and ScintillaBase which are different on the platforms. For example, this layer has to + support this difference between the synchronous Windows clipboard and the asynchronous GTK+ + clipboard. +

      +

      + The external API is defined in this layer as each platform has different preferred styles of + API - messages on Windows and function calls on GTK+. This also allows multiple APIs to be + defined on a platform. The currently available API on GTK+ is similar to the Windows API and + does not follow platform conventions well. A second API could be implemented here that did + follow platform conventions. +

      + + + diff --git a/scintilla/doc/Icons.html b/scintilla/doc/Icons.html new file mode 100644 index 00000000..0d8b8bf5 --- /dev/null +++ b/scintilla/doc/Icons.html @@ -0,0 +1,56 @@ + + + + + + + + + Scintilla icons + + + + + + + + +
      + Scintilla icon + + Scintilla + and SciTE +
      +

      + Icons +

      +

      + These images may be used under the same license as Scintilla. +

      +

      + Drawn by Iago Rubio, Philippe Lhoste, and Neil Hodgson. +

      +

      + zip format (70K) +

      + + + + + + + + + + + + + + + + + +
      For autocompletion listsFor margin markers
      12x1216x1624x2432x32
      + + diff --git a/scintilla/doc/Lexer.txt b/scintilla/doc/Lexer.txt new file mode 100644 index 00000000..5f118e73 --- /dev/null +++ b/scintilla/doc/Lexer.txt @@ -0,0 +1,226 @@ +How to write a scintilla lexer + +A lexer for a particular language determines how a specified range of +text shall be colored. Writing a lexer is relatively straightforward +because the lexer need only color given text. The harder job of +determining how much text actually needs to be colored is handled by +Scintilla itself, that is, the lexer's caller. + + +Parameters + +The lexer for language LLL has the following prototype: + + static void ColouriseLLLDoc ( + unsigned int startPos, int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler); + +The styler parameter is an Accessor object. The lexer must use this +object to access the text to be colored. The lexer gets the character +at position i using styler.SafeGetCharAt(i); + +The startPos and length parameters indicate the range of text to be +recolored; the lexer must determine the proper color for all characters +in positions startPos through startPos+length. + +The initStyle parameter indicates the initial state, that is, the state +at the character before startPos. States also indicate the coloring to +be used for a particular range of text. + +Note: the character at StartPos is assumed to start a line, so if a +newline terminates the initStyle state the lexer should enter its +default state (or whatever state should follow initStyle). + +The keywordlists parameter specifies the keywords that the lexer must +recognize. A WordList class object contains methods that make simplify +the recognition of keywords. Present lexers use a helper function +called classifyWordLLL to recognize keywords. These functions show how +to use the keywordlists parameter to recognize keywords. This +documentation will not discuss keywords further. + + +The lexer code + +The task of a lexer can be summarized briefly: for each range r of +characters that are to be colored the same, the lexer should call + + styler.ColourTo(i, state) + +where i is the position of the last character of the range r. The lexer +should set the state variable to the coloring state of the character at +position i and continue until the entire text has been colored. + +Note 1: the styler (Accessor) object remembers the i parameter in the +previous calls to styler.ColourTo, so the single i parameter suffices to +indicate a range of characters. + +Note 2: As a side effect of calling styler.ColourTo(i,state), the +coloring states of all characters in the range are remembered so that +Scintilla may set the initStyle parameter correctly on future calls to +the +lexer. + + +Lexer organization + +There are at least two ways to organize the code of each lexer. Present +lexers use what might be called a "character-based" approach: the outer +loop iterates over characters, like this: + + lengthDoc = startPos + length ; + for (unsigned int i = startPos; i < lengthDoc; i++) { + chNext = styler.SafeGetCharAt(i + 1); + << handle special cases >> + switch(state) { + // Handlers examine only ch and chNext. + // Handlers call styler.ColorTo(i,state) if the state changes. + case state_1: << handle ch in state 1 >> + case state_2: << handle ch in state 2 >> + ... + case state_n: << handle ch in state n >> + } + chPrev = ch; + } + styler.ColourTo(lengthDoc - 1, state); + + +An alternative would be to use a "state-based" approach. The outer loop +would iterate over states, like this: + + lengthDoc = startPos+lenth ; + for ( unsigned int i = startPos ;; ) { + char ch = styler.SafeGetCharAt(i); + int new_state = 0 ; + switch ( state ) { + // scanners set new_state if they set the next state. + case state_1: << scan to the end of state 1 >> break ; + case state_2: << scan to the end of state 2 >> break ; + case default_state: + << scan to the next non-default state and set new_state >> + } + styler.ColourTo(i, state); + if ( i >= lengthDoc ) break ; + if ( ! new_state ) { + ch = styler.SafeGetCharAt(i); + << set state based on ch in the default state >> + } + } + styler.ColourTo(lengthDoc - 1, state); + +This approach might seem to be more natural. State scanners are simpler +than character scanners because less needs to be done. For example, +there is no need to test for the start of a C string inside the scanner +for a C comment. Also this way makes it natural to define routines that +could be used by more than one scanner; for example, a scanToEndOfLine +routine. + +However, the special cases handled in the main loop in the +character-based approach would have to be handled by each state scanner, +so both approaches have advantages. These special cases are discussed +below. + +Special case: Lead characters + +Lead bytes are part of DBCS processing for languages such as Japanese +using an encoding such as Shift-JIS. In these encodings, extended +(16-bit) characters are encoded as a lead byte followed by a trail byte. + +Lead bytes are rarely of any lexical significance, normally only being +allowed within strings and comments. In such contexts, lexers should +ignore ch if styler.IsLeadByte(ch) returns TRUE. + +Note: UTF-8 is simpler than Shift-JIS, so no special handling is +applied for it. All UTF-8 extended characters are >= 128 and none are +lexically significant in programming languages which, so far, use only +characters in ASCII for operators, comment markers, etc. + + +Special case: Folding + +Folding may be performed in the lexer function. It is better to use a +separate folder function as that avoids some troublesome interaction +between styling and folding. The folder function will be run after the +lexer function if folding is enabled. The rest of this section explains +how to perform folding within the lexer function. + +During initialization, lexers that support folding set + + bool fold = styler.GetPropertyInt("fold"); + +If folding is enabled in the editor, fold will be TRUE and the lexer +should call: + + styler.SetLevel(line, level); + +at the end of each line and just before exiting. + +The line parameter is simply the count of the number of newlines seen. +It's initial value is styler.GetLine(startPos) and it is incremented +(after calling styler.SetLevel) whenever a newline is seen. + +The level parameter is the desired indentation level in the low 12 bits, +along with flag bits in the upper four bits. The indentation level +depends on the language. For C++, it is incremented when the lexer sees +a '{' and decremented when the lexer sees a '}' (outside of strings and +comments, of course). + +The following flag bits, defined in Scintilla.h, may be set or cleared +in the flags parameter. The SC_FOLDLEVELWHITEFLAG flag is set if the +lexer considers that the line contains nothing but whitespace. The +SC_FOLDLEVELHEADERFLAG flag indicates that the line is a fold point. +This normally means that the next line has a greater level than present +line. However, the lexer may have some other basis for determining a +fold point. For example, a lexer might create a header line for the +first line of a function definition rather than the last. + +The SC_FOLDLEVELNUMBERMASK mask denotes the level number in the low 12 +bits of the level param. This mask may be used to isolate either flags +or level numbers. + +For example, the C++ lexer contains the following code when a newline is +seen: + + if (fold) { + int lev = levelPrev; + + // Set the "all whitespace" bit if the line is blank. + if (visChars == 0) + lev |= SC_FOLDLEVELWHITEFLAG; + + // Set the "header" bit if needed. + if ((levelCurrent > levelPrev) && (visChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + styler.SetLevel(lineCurrent, lev); + + // reinitialize the folding vars describing the present line. + lineCurrent++; + visChars = 0; // Number of non-whitespace characters on the line. + levelPrev = levelCurrent; + } + +The following code appears in the C++ lexer just before exit: + + // Fill in the real level of the next line, keeping the current flags + // as they will be filled in later. + if (fold) { + // Mask off the level number, leaving only the previous flags. + int flagsNext = styler.LevelAt(lineCurrent); + flagsNext &= ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); + } + + +Don't worry about performance + +The writer of a lexer may safely ignore performance considerations: the +cost of redrawing the screen is several orders of magnitude greater than +the cost of function calls, etc. Moreover, Scintilla performs all the +important optimizations; Scintilla ensures that a lexer will be called +only to recolor text that actually needs to be recolored. Finally, it +is not necessary to avoid extra calls to styler.ColourTo: the sytler +object buffers calls to ColourTo to avoid multiple updates of the +screen. + +Page contributed by Edward K. Ream \ No newline at end of file diff --git a/scintilla/doc/SciBreak.jpg b/scintilla/doc/SciBreak.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b63b09f9a7c14a916f07915d6eba32b8d8332260 GIT binary patch literal 33592 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�loFt(b7SKu7H@pW%D7+aTJc`Xo5S38riu_-@e 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 literal 0 HcmV?d00001 diff --git a/scintilla/doc/SciCoding.html b/scintilla/doc/SciCoding.html new file mode 100644 index 00000000..c7d072b8 --- /dev/null +++ b/scintilla/doc/SciCoding.html @@ -0,0 +1,251 @@ + + + + + + + + Scintilla and SciTE Code Style Preferences + + + + + + + + + +
      + Scintilla icon + + Scintilla + and SciTE +
      +

      + Code Style +

      +

      + Introduction +

      +

      + The source code of Scintilla and SciTE follow my preferences. + Some of these decisions are arbitrary and based on my sense of aesthetics + but its good to have all the code look the same even if its not exactly how + everyone would prefer. +

      +

      + Code that does not follow these conventions will be accepted, but will be modified + as time goes by to fit the conventions. Scintilla code follows the conventions more + closely than SciTE except for lexers which are relatively independent modules. + Lexers that are maintained by others are left as they are submitted except that + warnings will be fixed so the whole project can compile cleanly. +

      +

      + The AStyle formatting + program with a '-tapO' argument formats code in much the right way although + there are a few bugs in AStyle. The scite/scripts/Fixer.py script will run AStyle + over a C++ source file and fix up some of those bugs. +

      +

      + Language features +

      +

      + Design goals for Scintilla and SciTE include portability to currently available C++ + compilers on diverse platforms with high performance and low resource usage. + Scintilla has stricter portability requirements to SciTE as it may be ported to + low capability platforms such as Windows CE or PalmOS but it is less likely + SciTE will be. +

      +

      + To achieve portability, only a subset of C++ features are used. Exceptions are + not available on some platforms such as Windows CE so exceptions are not used + and thus the standard C++ library can not be used. + Template support differs between compilers so is not used in Scintilla but there + are some simple uses in SciTE. + Run-time type information adds to memory use so is turned off. + Name spaces are not used. +

      +

      + The goto statement is not used because of bad memories from my first job + maintaining FORTRAN programs. The union feature is not used as it can lead to + non-type-safe value access. +

      +

      + Casting +

      +

      + Do not use old C style casts like (char *)s. Instead use the most strict form of C++ + cast possible like const_cast<char *>(s). Use static_cast and const_cast + where possible rather than reinterpret_cast. Because the code is compiled with + run-time type information turned off, dynamic_cast will not work. +

      +

      + The benefit to using the new style casts is that they explicitly detail what evil is + occurring and act as signals that something potentially unsafe is being done. +

      +

      + Code that treats const seriously is easier to reason about both for humans + and compilers, so use const parameters and avoid const_cast. +

      +

      + Warnings +

      +

      + To help ensure code is well written and portable, it is compiled with almost all + warnings turned on. This sometimes results in warnings about code that is + completely good (false positives) but changing the code to avoid the warnings + is generally fast and has little impact on readability. +

      +

      + Initialise all variables and minimise the scope of variables. If a variable is defined + just before its use then it can't be misused by code before that point. + Use loop declarations that are compatible with both the C++ standard and currently + available compilers. +

      +

      + Allocation +

      +

      + As exceptions are not used, memory exhaustion can occur. + This should be checked for and handled but there is quite a lot of Scintilla and + SciTE code that doesn't yet. + Fixed length buffers are often used as these are simple and avoid the need to + worry about memory exhaustion but then require that buffer lengths are + respected. +

      +

      + The C++ new and delete operators are preferred over C's malloc and free + as new and delete are type safe. +

      +

      + Bracketing +

      +

      + Start brackets, '{', should be located on the line of the control structure they + start and end brackets, '}', should be at the indented start of a line. When there is + an else clause, this occurs on the same line as the '}'. + This format uses less lines than alternatives, allowing more code to be seen on screen. + Fully bracketed control + structures are preferred because this makes it more likely that modifications will + be correct and it allows Scintilla's folder to work. No braces on returned + expressions as return is a keyword, not a function call. +

      +bool fn(int a) {
      +        
      if (a) {
      +                
      s();
      +                
      t();
      +        
      } else {
      +                
      u();
      +        
      }
      +        
      return !a;
      +
      }
      +

      + Spacing +

      +

      + Spaces on both sides of '=' and comparison operators and no attempt to line up '='. + No space before or after '(', when used in calls, but a space after every ','. + No spaces between tokens in short expressions but may be present in + longer expressions. Space before '{'. No space before ';'. + No space after '*' when used to mean pointer and no space after '[' or ']'. + One space between keywords and '('. +

      +void StoreConditionally(int c, const char *s) {
      +        
      if (c && (baseSegment == trustSegment["html"])) {
      +                
      baseSegment = s+1;
      +                
      Store(s, baseSegment, "html");
      +        
      }
      +
      } +

      + Names +

      +

      + Identifiers use mixed case and no underscores. + Class, function and method names start with an uppercase letter and use + further upper case letters to distinguish words. Variables start with a lower + case letter and use upper case letters to distinguish words. + Loop counters and similar variables can have simple names like 'i'. + Function calls should be differentiated from method calls with an initial '::' + global scope modifier. +

      +class StorageZone {
      +
      public:
      +        
      void Store(const char *s) {
      +                
      Media *mediaStore = ::GetBaseMedia(zoneDefault);
      +                
      for (int i=mediaStore->cursor; mediaStore[i], i++) {
      +                        
      mediaStore->Persist(s[i]);
      +                
      }
      +        
      }
      +
      }; + + diff --git a/scintilla/doc/SciRest.jpg b/scintilla/doc/SciRest.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b052239cd953c92a5ec4bc22fb9aed2cc545a1b GIT binary patch literal 16680 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 Uw^L7}bKU68RwQB4@Net?2Xk}R0ssI2 literal 0 HcmV?d00001 diff --git a/scintilla/doc/SciTEIco.png b/scintilla/doc/SciTEIco.png new file mode 100644 index 0000000000000000000000000000000000000000..d0cc869b8c56c3d77ba76ff1a81b22609836022e GIT binary patch literal 10091 zcmV-xCzRNUP)001X4NklsIgHai8_TXkQ#@3Nfg>!{R=dP=^gaE z<)SDk$~4>w*xnNfM9jy)Vw{0R*Jr#~>_-te#3jGU*~2glLJ)!CN#{s>BjVVC>0!|+ zQ+T2&JYSy3U*Dr6kqA7IjKLOg_@zjLPnbpTT zoU79ax?IBnJ8%TDzkHc**rGs1EQ96k%@bk~i0$b)W;WAk6bxvlP)HJgS+}lM7Cy)P zX3&c_l}e>isZ1OKh=Y|xin~yz@(GQ{5LqAuLJsKjEG7farN_l>Fzm1cz%+RrXKEOo zPNOs2`#YNA)T^6n&P)pqV=^haChg+oYSYN8q2A6#i7VfY40b-ao477Z-~EJ0aubNe zmbU{iXc77;a2U`&`iAEpDGFb~7SFK*AOa(k6v4@ja}IZ15d;7L5}i9gar?mYhpPBQ z!$9YYCr!D9rz+2uGFZHAyRvUro~6;)LLWYl&wFpuH&$!&PoBrYNJa7fhURM_qIi8Ndj|6s+riuhDB4u{=l<4QuJ z6H*(lpUyf^eD79eS9|M`lc#TL%X&Nhh>TXblL%NM%Vx6-_dZVgIyvBrCAF31HmfCN z<0hk_|EHX_q4EWphs%a~9+n?nZ66<1Z#~ZT_GxQ4XXw@W$(M43K`3(wf^BviGQsfw zAt4X|AQ%x%S476H)}H+Dj@-jfb&YM0S{EmzhKKl8S6*-<()^@8EFx?%_CTPmxxP7i zzQWrRXEOHh%UH?r=KfH6g+lWfqyAm>fnU|3Hw7KHX zOMA#vkJ-ruLD88G4CO0ITbdQFu2yOf+-iF9V?@5Mb2uLLW1@Bp`>g~v|YH4a% zfbdpLHH9JIi@szrNq8KVK%_5RvgxG(7$1jYq9OyzgFQ z(jhWKVzpX7Xvrx9*9oA7Lt8c`DFcKFTw#EERZ^8!L!fYG%Vl;utRFGi#?T>q4;_iV zQfb7jWi72ue>I-3t80{qz4MQqovBRee|9H-|K{sA8scN;75;oqu3RsbMV1xs-LWQx z=Oa3Cr6DP8pEO|J>zB{UkEBJFahAIOc(t}TGy6={ljl(f%=Vrv`!+3X# z)dIWF67C;9tpptEuI8< zq!6Wg>_wuGWZxOanEiZ5-tYac>-*m8JJ)etuKR5F^1GMwKl2}{P-wiG9!`nY*VX6~ zxV!gT$HF3)y*OfNX*@YGBOxj*;4Lwki}UjW3K`F$|C$^Bh7v-xb#}wG?vADd?XMW~ z<2)Ys^x2Gx%1^G&>wMfyzPFZfIqa_Xy2LPl`t-PG@PWXXb6f%UM@Mzrrzcs*)_2xD zv-6GJo7y6+tT#T;*j}ApoNCON9kvd7CN70tSeRc?`~NGzzau7_?H75f^j@kkM#$C8 z>D{XrtoZ@-Dk%a?w+O+=NRN!H!Zwe?!()?hK3P*kL|kr-saHv9UB&BqaWTx5tJy?N zQ*+zH(pdH5$In!~ZL+a3$u20?*4vJA`ivxYB@4O`W7p(lX!Z zl9u-di&JuT599z~Y-X#ycC#kUe13s9JUl~QyVZ5ic?D(dtgJf#fbQ-gH@_sBzJshR zR!`4#dU_EOiyptzAREfcVP$0HRaD83U;Z;A0KXW(J2(T2Q-(x2dAz!&!KrI?Ma|&m zTXsm?6K%cqSR4T^!4uT1z5YIYb1oul%HIF_cCVC8c3}zxWfF<9%q02WodzpW)c?x1 z(l|AML~r-q*H}}EM2lH&azqFa8YCKvIl)<);q!q!R$5ha!-v;5ILyhnwYAGC&{RaS z1}BF;BT*=EY2w`nulan0r~7*U-GM?v7+E?c%~n+XrwIti)#jT^4qphD_KQ1Lp*cEdxG`+mByO|Sotqj!03a);y3Kj_fr!|D>buZFh%-r% z`$OW5Ot-svpIxBOKDZIJ&)KT%(F;*Ak>C@5N1ZQmJy>D00xyg?APTBwd z)<80J@HkOxu``2axWmaSWq;Q>j!p1QUr5P<(+0j;$b2hQA)m&e~Mu05Ao z0M)jdMgQ%$ z_q37<6&j5~)&E%E0qGnbcv;=At!uvQ(=zhV8dSXv7Ym!K`ap3Tc+d<2q95Q1>aub; z7zSWhR32-R>4!| zXNDMytd)@ZKNe6{Q9E|&g^}fUCGy7R-wTNu1q5|th~4a)%YpJj#x3~28f{C&$>%q2 z7XP^b1OM=A_AXISB~YV#_5@GPEE|E#6&#LA!r_%|w+7ldM{VC3PSrBbe^52e2g6+O z{@YA)`bT&FOfn5x0}l-%k5zQ=jLWKIU4IKMzX6wCfPFEqH{1GA^sL~{&g$|N z1Ye#!cpC(q>o>8FQc=?*sAx;e$gNmlSpW?UGELt+v!Y)?MT?-K)i$z}eDMa3pe~P7 zepJ>90QjfAO(rdzM=!Odm2%IO zf|G^Jjc$nwilh|}hKkcQwBO=%(DUerkZbdidB89EyOxRDvO?8JD+175ckhMbKKjCw zSAffK?L!N>g)eb2hA`EntZDi>4~Y=>etsdkCa!mjs#VFB zaEIOg5s-U0#8_ne`X7VQ14bB2>%ics0{6h|&?D)e`k2jQ;B61@99KjB($N_L;4UzVb(wzXeY_|2sw zg}`oivWlwOzXaHS@G$h7$1M!V1niyT^vaK4mC5Tj1UyzIYW4Jv0svAjJzZ9bJi+@w z{@ur)>2ww((&v}lgYzKwP@T|gH*P(2>tP3n!-qo?Q_S7_Py2@D1|E87Z0Q9hmy^Sr zSU8ur(rfy_s~_O`XTf%_1eomM+Lf+AP&F`fIh*|x$`Jn$#6AFjmxF_6-8OjS*A$*Ubiih3UReMF&4UNS2UOTBfL}Yo1I^ zTWhhcvY)4@N+IglU%pku0Kn^DK2*69Q9Iy79fu2GJACqCKwK$aSr=-{a+BxuEPKUk zW8%(xgxro!sZ}ECLBy*NsfDFoa0L^95hj1{ffRMJfm2{%{DtCYj6sx+jgD2 zS+#Jt0o?ik(#!c-#Zzv6X*LdlDr&kb!4w`%B%8Y)Dm#?NIeZr!x&wB`)UId&aa(NFrqXaUW7C(qCPi&Xm9U^ zl;EK4ovm+qOB2GPGJL$tky8Z>1{;k=o=S?=py(E6hco9#Ww6Rx>yJLK>^ph-4t+_0 zT7`;9j!Dn2RVH8yazg6gq|VKZ2>9Hw2?lF;Xl7o(7a)X1P>fYl;>voxeVs7=!h?j+ ztNxN9sH*9(hHDTbpCyH7&}f8`&IWVu3%0>|B!dm#+uy%0OCB3&;=}bi`s?D7FDR($ zv@8L0J8$TDhNfHQ1fcwFBSBTqJ#m;wvGn#01Ap4y{mZU-CGYK?&49f%|&kE1nCK}B-%iV6f`X!NCiHt1deZByXV{RR@n7{*OUx5%*5t+$^1-tLo1 z(YCPjJe^v?xKII7%Rt;cy8qGqUBPK-c|+&(hEnrKqs~+vOf2`mL?%s2+Og1^eyr!tAg3vSCka#%{i&t%(nfKa%5PFFU*`j@5c9z9=+JE25^(;J< zq-E7V$pZik3{IJEJ?e1ilY%l00?E-c=F6`om=j=Y?;1jG=?`(zXhb9kq6%9NCe2rWI+q)T^j3QC_E8`HD% zh-xIN(e_KXpD_TqT{WdbUI(`@b-fgy`I-NR(ce=%Yqto?6DcwOIT;}P!=e9vs_L76{=jk(RbYx-Yyf#MGE zpcTa5Xg--)oLVxUTi)XybXtS5_K%wJupHXrm3$dZD0=_{piKol&5{x&U+D1sJpLQ2uh^jxHKjJelbNW*`T2d0vH^O zIqT^EcX)CQJivIJ-5(o({-Ig7kjtKFlXw-a<%r~YY5$d>cV9*(1z?yDnx=uR=NUL3 z77JT_&wC##+O$0aMjr12*9w|=1+5^z2^4(=K?%i>V<;iq0WzdcHQTZKRP_1hX~h%8 zo#09xNU8v5szBNYaHmU<@pAe=;#04Kw>?AC@B|eSRsTq8=@z#bO>GN=qLNC^^LnC& zu92nF_!95_%LZ7G!s}aJ)ii*p7@TZd`%jrTB- zL+&YBCNW9(<5QkmZgN#3YWc?&+^FZ?Yz5gZ;6}sJ{rBTr-GU$vp*mJlGBgW34x+%o ze8aU{1#kM9Z)ZXE1SstRY0rn;LN01h4VPU4M}PvLR*TDYHZ~bBi!shH+5k|5u#!UyPfMCeIv-amRzdMURIHX(uXz|HjiYQ2yC3H*FZY+I0D-uW{UYO3sHmi>g-hm#r+b<6BWo&jaS7v@bjp?v9+ny4y=^mL1Es=NblaT$Q{1^lG36qK4O-MV6$1Q zk=g2sw_1jdKY#vSB`!HLJ0&hEB0vHu$weJ?g}z0pxshoBMj0S5EEbQsz^u5w0WB%5 z)ZN+0S>!|R7w9vO?mzPM+uiW(aYy?X4u^C9Wv@0(eWRr@LzsFYH5Kv%B#dg`_xygJ zeEa4l2?^1NK*zpLzX`te&+l~$vxBm*S~ZFAbNAo1d*`10ej*}5IHH1YL=Xb74D{A4 zE`c{?+21-^;Wo0exYnj0x_X0hB-KUCszn9@AVv6M3RsFk&c*1Swn{#q3k3XsKZ>D* zV8Z|aNV*oQWwg|E9gr9qAP^u-EVt_#I|d!O;puh zTv++5esI2n4!+RAHwJiI-KRlb19za%46o%pss7j>pOmvN=!lx8zUgMKlsk>LJ_>R^ zfXo_jxk7N@?|+Op`4N;g@dVYCJh0s5S2`Y|AJUbHG?=xJ@P_rgoQ=mMAqWeiKF4eV+c7} zLSj-@&kSXeu?VdyFD3e@=*h8&sHsW7nnwqPAB#GExwriV00JBLVJh|BeU zX?=Dpf9yAlK8+BQB=Ygw>RNhVJ};V>93#_=5)#ja$K1GizZ`0fAcy?fR6hD8r?>4b zeR^tYYL3Gdnq`x)d;#woPA7NC?&3&pQ>lkulSwzpJgI#G22c zAHLeJkDn8ll!Y$a@bTTVN10Z3VfU`>5fK&HwI`wE;nmrhp}14m{!+A<=SuN-2mzlz zJ2ST3N~EIVJ&(~{^|oPn@W^*sYXiGn5(lEG2b^qjG(CKwSZKA#6I0@+1^#mV6g zH6pGgKS^3vVPdFVLP8t`R}KCAhoWoU-dqO1BT#9kkWyNb)BXLkyGJCEAR#0y30kIS_KA-Ke`$SvI zn~Cv051%7HyL(QCThzZw7so6z8FSDbpTB4So)RgoYVYZ8WwV!Lv8w76LsN?_TKaYb zWs0y6vh!1JZBfYQ%5&qt>X#TZOHBIWB4@QUWo%B$Y{vx!vYn)a1Y{Kr|DawW=8%A0 z^ZJgB^O5!%5e|DPH~U1~iCiyh;zX~(kBNE~8vmyD7MD4>!!_8}+H;99H;kD2Isjn>sAYO5dzrdcCnd<=r$-`}I5WjQ&`L?J<4?Gp(M>vQWpHj61u zSOZ_k;cWyZBs@RfCV=LGNTO1;mu-gyl&!s+tE=moq}Z{s5%-;*I8{rOsM65Hk^q6`!^u4M%tY_6jxvZ4 z9(M_eL`nXIS5&3Ki;b0i08&D|wIl{I$z(2deXB>J&>~`TJk}%zy$mbV$`29v90rm- zAR?|%T71RWd>dXt4FM3)#^kY$8Ev03-dyMnR0oYH?JO#GMCsaHbGp(Z+9#P z$w5g_;gKj|F_?*}D<99YII~lOZ04Limgwpe_oeNtk;xVvU9GSXzeToCP*`F|M@K>K z*(+yUK9r_R4z}>v3p_4cTuM>PEYQd{PEE&2R02CcH`e*(ZF~LG%+t=d6U-;ZevXa| zusO`l+YZ5<=coG+0v=)|5>aW|E6*NWK2p!r<6~vEwY|Tx3gynN6Fe?wwU}gNR6b6g z@Zx#apme}M*z8f!h;-e)>`pKGYR5_lkW zZhD5xNALvzC%^hyMzo`YqpXZbc6N@qn7ECN4NcE{dI`VTT&aJ0uC?LkuMs8y2#92X zV3{2jV`6&b>(p=?b7B0yAH4wlVmUoMDUBmf4Yi4_7KYPS1khP|xZ&}5>NK0Nq0WiX zp1`oop}vN)7dbHhsp~oi2A;+UajRP=Tbiq;JJL71o%`0&tf?SkYZCz704B_jZOzqB zPHu8ZseTe;Wf$69S4jP@O06}vZR-k)6e*H=%eG`Gk!8oP`XSqLC$g5pn z+tLgekfHn4wfi+}7>51ner8C13|m)VUD~d|fUOJKWUJHW(Ij(Tj+?~sBe7*$mL*v) z>p_YXA0l^1$#x7Q19oMIyfAU^_nmvrcaC_kf49G98-kiKoRmtSBJ%X)b-kQ=?e#Yy z^eOTHUTH4@)PQY^ac37df|PiZ{T~c{NSs9|M}tAb-kY0|Ksz6eus{%z8R#?of@=S zt9p+9;p)fVeQw~5ecw4z;_{Njel_$bnW|e_c;NQ7jNkoy@ZejS#4OJh{N2yvgq;`o zl8h9K+~bLFP??TIqI>qg)aY}^7_%AYW~Qfkj(Ie3i_WDjjyk)m4K_+tdC;Mn@!^VV z0A*1q#3w!iA=V*kQx&Mj=~^Lx;5e3C3UzHgI5B!w#N5yC+!Kq;=JToLc*xV@MP)3| z?KFGaMlXMCF&in*!Lh5S@ahhGb(1X6b>3%6#btxNZg%oocmL~&Xwd2M=`sE6%(y7z z6d4>=T?a>Xox6UgZ_AccWMXvmUNSaaWN8#PJ>%~`dhEUCt{qONYkcI(*zDDOa++h} z5S&(9l_(TR$_z@Hnj4b%yyp8z<-1*50p*GP$;}PhB#{kAVx4X6y*&fxzW5*>5Bc}J zZ8Ligyu7cu)pP0G-#uB z5E3dz6m4wn4~HfdSpu!6C`v0OD)c%qhb8cSEt|mg|F|InRIk<^rV0A*S>}>i!g<#hqpM~MBTl610_rp zK_nKZ+`i_LPymFYkVjBbr^89JQ_c%r?XbQ!e`}R7mnlM`SG5+ya(FI}Rq5BtfT>owb{nBJ=Pv zuf&FN{fdjM5&*R839RwZBw1!TDbRN?v=C(S3Ew7fd&jQHi5ruX!|*Qy2^*!o+xERh zQRYmRzCUs`HFpu!i69qM&Q?TkFk-yTYC#b|1J;mj?)ItsmwL7zy8OlOnmYG-n_swb z;q-EH_VBCkbnH0($*DJKnxV`t5L2(OC7oqtS;fXn3cOt|B<^6SgrcZsaSgQAlrn*i z&hE0+E1cGE*+b3^^c{)DLdjIjVZ?d@`;t%uKDZ=`JQ&Pqa`f&xQB_ro;*NMCj>u7y zk$5=v0F~12rrq&{ky=li0bwORTPmr#&Wlplz=`u8z2n~G-TVFbuYLCJqlw#;(bn$o zi!Fv?(HWSusoC$^+P`aWafYdH9TeF_Jeh!)gIzj=PjYNN9Dc;mnerSktHa@P zRC!Q6E|)}x$uaaYD5k%6&&YJ*(1WHA`?%N15%LWCc$z zO~UY1HQriJt5D2mvvE-RzP;~)mIojFGm{F{xEg?qz|#b2g=N7o10)3~Z*a1P%g?h+ zQZ5NFg26z5R+i@~!!5@ve3w0EZ5UfC<|~)5>Mw-P#Zhk{!Dx-9v+1dA}B{g`{3hyXF`K$}B1>q-Y!}ln`Vskv+xs8?PHfLy;s=5Y&w}^*x#1q(ccdw_q~YRJl7OJ_E== z1K`0-YEG+1C2jRVUEmLv179<_HnG-O>A_uPmh~KDxf0M70_$!6e;&hERzKxmMY5WD z5K$E28}KTMDwlv2x~OJ0sIdXZ>bOtbS5$sI1zj0*MIkC2V91In{TKO-zBFLW%eMdk N002ovPDHLkV1k*@zUlw~ literal 0 HcmV?d00001 diff --git a/scintilla/doc/SciWord.jpg b/scintilla/doc/SciWord.jpg new file mode 100644 index 0000000000000000000000000000000000000000..60e70e897b41b1943952b42aab2592cfe6452883 GIT binary patch literal 6164 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 literal 0 HcmV?d00001 diff --git a/scintilla/doc/ScintillaDoc.html b/scintilla/doc/ScintillaDoc.html new file mode 100644 index 00000000..5c014b9f --- /dev/null +++ b/scintilla/doc/ScintillaDoc.html @@ -0,0 +1,5406 @@ + + + + + + + + + + Scintilla and SciTE + + + + + + + + + + + +
      Scintilla iconScintilla
      + +

      Scintilla Documentation

      + +

      Last edited 4/February/2006 NH

      + +

      There is an overview of the internal design of + Scintilla.
      + Some notes on using Scintilla.
      + How to use the Scintilla Edit Control on Windows.
      + A simple sample using Scintilla from + C++ on Windows.
      + A simple sample using Scintilla from + Visual Basic.
      + Bait is a tiny sample using Scintilla + on GTK+.
      + A detailed description of how to write a lexer, including a + discussion of folding.
      + + How to implement a lexer in the container.
      + + How to implement folding.
      + The coding style used in Scintilla and SciTE is + worth following if you want to contribute code to Scintilla but is not compulsory.

      + +

      Introduction

      + +

      The Windows version of Scintilla is a Windows Control. As such, its primary programming + interface is through Windows messages. Early versions of Scintilla emulated much of the API + defined by the standard Windows Edit and RichEdit controls but those APIs are now deprecated in + favour of Scintilla's own, more consistent API. In addition to messages performing the actions + of a normal Edit control, Scintilla allows control of syntax styling, folding, markers, autocompletion + and call tips.

      + +

      The GTK+ version also uses messages in a similar way to the Windows version. This is + different to normal GTK+ practice but made it easier to implement rapidly.

      + +

      This documentation describes the individual messages and notifications used by Scintilla. It + does not describe how to link them together to form a useful editor. For now, the best way to + work out how to develop using Scintilla is to see how SciTE uses it. SciTE exercises most of + Scintilla's facilities.

      + +

      In the descriptions that follow, the messages are described as function calls with zero, one + or two arguments. These two arguments are the standard wParam and + lParam familiar to Windows programmers. These parameters are integers that + are large enough to hold pointers, and the return value is also an integer large enough to contain a + pointer. + Although the commands only use the + arguments described, because all messages have two arguments whether Scintilla uses them or + not, it is strongly recommended that any unused arguments are set to 0. This allows future + enhancement of messages without the risk of breaking existing code. Common argument types + are:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      boolArguments expect the values 0 for false and 1 for + true.
      intArguments are 32-bit signed integers.
      const char *Arguments point at text that is being passed to Scintilla but not modified. The text + may be zero terminated or another argument may specify the character count, the + description will make this clear.
      char *Arguments point at text buffers that Scintilla will fill with text. In some cases, + another argument will tell Scintilla the buffer size. In others, you must make sure that + the buffer is big enough to hold the requested text. If a NULL pointer (0) is passed + then, for SCI_* calls, the length that should be allocated is returned.
      colourColours are set using the RGB format (Red, Green, Blue). The intensity of each colour + is set in the range 0 to 255. If you have three such intensities, they are combined as: + red | (green << 8) | (blue << 16). If you set all intensities to 255, the + colour is white. If you set all intensities to 0, the colour is black. When you set a + colour, you are making a request. What you will get depends on the capabilities of the + system and the current screen mode.
      alphaTranslucency is set using an alpha value. + Alpha ranges from 0 (SC_ALPHA_TRANSPARENT) which is completely transparent to + 255 (SC_ALPHA_OPAQUE) which is opaque. The value 256 (SC_ALPHA_NOALPHA) + is opaque and uses code that is not alpha-aware and may be faster. Not all platforms support + translucency and only some Scintilla features implement translucency. + The default alpha value for most features is SC_ALPHA_NOALPHA.
      <unused>This is an unused argument. Setting it to 0 will ensure compatibility with future + enhancements.
      + +

      Contents

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      o Text retrieval and + modificationo Searching and replacingo Overtype
      o Cut, copy and pasteo Error handlingo Undo and Redo
      o Selection and informationo Scrolling and automatic + scrollingo White space
      o Cursoro Mouse captureo Line endings
      o Stylingo Style definitiono Caret, selection, and hotspot styles
      o Marginso Other settingso Brace highlighting
      o Tabs and Indentation + Guideso Markerso Indicators
      o Autocompletiono User listso Call tips
      o Keyboard commandso Key bindingso Popup edit menu
      o Macro recordingo Printingo Direct access
      o Multiple viewso Foldingo Line wrapping
      o Zoomingo Long lineso Lexer
      o Notificationso GTK+o Deprecated messages
      o Edit messages never + supported by Scintillao Building Scintilla
      + +

      Messages with names of the form SCI_SETxxxxx often have a companion + SCI_GETxxxxx. To save tedious repetition, if the SCI_GETxxxxx message + returns the value set by the SCI_SETxxxxx message, the SET routine is + described and the GET routine is left to your imagination.

      + +

      Text retrieval and modification

      + +

      Each character in a Scintilla document is followed by an associated byte of styling + information. The combination of a character byte and a style byte is called a cell. Style bytes + are interpreted as a style index in the low 5 bits and as 3 individual bits of indicators. This allows 32 fundamental styles, which is enough for most + languages, and three independent indicators so that, for example, syntax errors, deprecated + names and bad indentation could all be displayed at once. The number of bits used for styles + can be altered with SCI_SETSTYLEBITS up to a maximum of 7 bits. + The remaining bits can be used for indicators.

      + +

      Positions within the Scintilla document refer to a character or the gap before that + character. The first character in a document is 0, the second 1 and so on. If a document + contains nLen characters, the last character is numbered nLen-1. + The caret exists between character positions and can be located from before the first character (0) + to after the last character (nLen).

      + +

      There are places where the caret can not go where two character bytes make up one character. + This occurs when a DBCS character from a language like Japanese is included in the document or + when line ends are marked with the CP/M standard of a carriage return followed by a line feed. + The INVALID_POSITION constant (-1) represents an invalid position within the + document.

      + +

      All lines of text in Scintilla are the same height, and this height is calculated from the + largest font in any current style. This restriction is for performance; if lines differed in + height then calculations involving positioning of text would require the text to be styled + first.

      + SCI_GETTEXT(int length, char *text)
      + SCI_SETTEXT(<unused>, const char *text)
      + SCI_SETSAVEPOINT
      + SCI_GETLINE(int line, char *text)
      + SCI_REPLACESEL(<unused>, const char + *text)
      + SCI_SETREADONLY(bool readOnly)
      + SCI_GETREADONLY
      + SCI_GETTEXTRANGE(<unused>, TextRange + *tr)
      + SCI_ALLOCATE(int bytes, <unused>)
      + SCI_ADDTEXT(int length, const char *s)
      + SCI_ADDSTYLEDTEXT(int length, cell *s)
      + SCI_APPENDTEXT(int length, const char *s)
      + SCI_INSERTTEXT(int pos, const char *text)
      + SCI_CLEARALL
      + SCI_CLEARDOCUMENTSTYLE
      + SCI_GETCHARAT(int position)
      + SCI_GETSTYLEAT(int position)
      + SCI_GETSTYLEDTEXT(<unused>, TextRange + *tr)
      + SCI_SETSTYLEBITS(int bits)
      + SCI_GETSTYLEBITS
      + SCI_TARGETASUTF8(<unused>, char *s)
      + SCI_ENCODEDFROMUTF8(const char *utf8, char *encoded)
      + SCI_SETLENGTHFORENCODE(int bytes)
      +
      + +

      SCI_GETTEXT(int length, char *text)
      + This returns length-1 characters of text from the start of the document plus one + terminating 0 character. To collect all the text in a document, use SCI_GETLENGTH + to get the number of characters in the document (nLen), allocate a character + buffer of length nLen+1 bytes, then call SCI_GETTEXT(nLen+1, char + *text). If the text argument is 0 then the length that should be allocated to store the + entire document is returned. + If you then save the text, you should use SCI_SETSAVEPOINT to mark + the text as unmodified.

      + +

      See also: SCI_GETSELTEXT, SCI_GETCURLINE, SCI_GETLINE, SCI_GETSTYLEDTEXT, SCI_GETTEXTRANGE

      + +

      SCI_SETTEXT(<unused>, const char *text)
      + This replaces all the text in the document with the zero terminated text string you pass + in.

      + +

      SCI_SETSAVEPOINT
      + This message tells Scintilla that the current state of the document is unmodified. This is + usually done when the file is saved or loaded, hence the name "save point". As Scintilla + performs undo and redo operations, it notifies the container that it has entered or left the + save point with SCN_SAVEPOINTREACHED and SCN_SAVEPOINTLEFT notification messages, allowing the container to know if the file + should be considered dirty or not.

      + +

      See also: SCI_EMPTYUNDOBUFFER, SCI_GETMODIFY

      + +

      SCI_GETLINE(int line, char *text)
      + This fills the buffer defined by text with the contents of the nominated line (lines start at + 0). The buffer is not terminated by a 0 character. It is up to you to make sure that the buffer + is long enough for the text, use SCI_LINELENGTH(int line). The returned value is the + number of characters copied to the buffer. The returned text includes any end of line + characters. If you ask for a line number outside the range of lines in the document, 0 + characters are copied. If the text argument is 0 then the length that should be allocated + to store the entire line is returned.

      + +

      See also: SCI_GETCURLINE, SCI_GETSELTEXT, SCI_GETTEXTRANGE, SCI_GETSTYLEDTEXT, SCI_GETTEXT

      + +

      SCI_REPLACESEL(<unused>, const char *text)
      + The currently selected text between the anchor + and the current position is replaced by the 0 terminated text string. If the anchor and + current position are the same, the text is inserted at the caret position. The caret is + positioned after the inserted text and the caret is scrolled into view.

      + +

      SCI_SETREADONLY(bool readOnly)
      + SCI_GETREADONLY
      + These messages set and get the read-only flag for the document. If you mark a document as read + only, attempts to modify the text cause the SCN_MODIFYATTEMPTRO notification.

      + +

      SCI_GETTEXTRANGE(<unused>, TextRange *tr)
      + This collects the text between the positions cpMin and cpMax and + copies it to lpstrText (see struct TextRange in + Scintilla.h). If cpMax is -1, text is returned to the end of the + document. The text is 0 terminated, so you must supply a buffer that is at least 1 character + longer than the number of characters you wish to read. The return value is the length of the + returned text not including the terminating 0.

      + +

      See also: SCI_GETSELTEXT, SCI_GETLINE, SCI_GETCURLINE, SCI_GETSTYLEDTEXT, SCI_GETTEXT

      + +

      SCI_GETSTYLEDTEXT(<unused>, TextRange *tr)
      + This collects styled text into a buffer using two bytes for each cell, with the character at + the lower address of each pair and the style byte at the upper address. Characters between the + positions cpMin and cpMax are copied to lpstrText (see + struct TextRange in Scintilla.h). Two 0 bytes are added to the end of + the text, so the buffer that lpstrText points at must be at least + 2*(cpMax-cpMin)+2 bytes long. No check is made for sensible values of + cpMin or cpMax. Positions outside the document return character codes + and style bytes of 0.

      + +

      See also: SCI_GETSELTEXT, SCI_GETLINE, SCI_GETCURLINE, SCI_GETTEXTRANGE, SCI_GETTEXT

      + +

      SCI_ALLOCATE(int bytes, <unused>)
      + Allocate a document buffer large enough to store a given number of bytes. + The document will not be made smaller than its current contents.

      + +

      SCI_ADDTEXT(int length, const char *s)
      + This inserts the first length characters from the string s + at the current position. This will include any 0's in the string that you might have expected + to stop the insert operation. The current position is set at the end of the inserted text, + but it is not scrolled into view.

      + +

      SCI_ADDSTYLEDTEXT(int length, cell *s)
      + This behaves just like SCI_ADDTEXT, but inserts styled text.

      + +

      SCI_APPENDTEXT(int length, const char *s)
      + This adds the first length characters from the string s to the end + of the document. This will include any 0's in the string that you might have expected to stop + the operation. The current selection is not changed and the new text is not scrolled into + view.

      + +

      SCI_INSERTTEXT(int pos, const char *text)
      + This inserts the zero terminated text string at position pos or at + the current position if pos is -1. If the current position is after the insertion point + then it is moved along with its surrounding text but no scrolling is performed.

      + +

      SCI_CLEARALL
      + Unless the document is read-only, this deletes all the text.

      + +

      SCI_CLEARDOCUMENTSTYLE
      + When wanting to completely restyle the document, for example after choosing a lexer, the + SCI_CLEARDOCUMENTSTYLE can be used to clear all styling information and reset the + folding state.

      + +

      SCI_GETCHARAT(int pos)
      + This returns the character at pos in the document or 0 if pos is + negative or past the end of the document.

      + +

      SCI_GETSTYLEAT(int pos)
      + This returns the style at pos in the document, or 0 if pos is + negative or past the end of the document.

      + +

      SCI_SETSTYLEBITS(int bits)
      + SCI_GETSTYLEBITS
      + This pair of routines sets and reads back the number of bits in each cell to use for styling, + to a maximum of 7 style bits. The remaining bits can be used as indicators. The standard + setting is SCI_SETSTYLEBITS(5). + The number of styling bits needed by the current lexer can be found with + SCI_GETSTYLEBITSNEEDED.

      + +

      TextRange and CharacterRange
      + These structures are defined to be exactly the same shape as the Win32 TEXTRANGE + and CHARRANGE, so that older code that treats Scintilla as a RichEdit will + work.

      +
      +struct CharacterRange {
      +    long cpMin;
      +    long cpMax;
      +};
      +
      +struct TextRange {
      +    struct CharacterRange chrg;
      +    char *lpstrText;
      +};
      +
      + +

      GTK+-specific: Access to encoded text

      + +

      SCI_TARGETASUTF8(<unused>, char *s)
      + This method retrieves the value of the target encoded as UTF-8 which is the default + encoding of GTK+ so is useful for retrieving text for use in other parts of the user interface, + such as find and replace dialogs. The length of the encoded text in bytes is returned. +

      + +

      SCI_ENCODEDFROMUTF8(const char *utf8, char *encoded)
      + SCI_SETLENGTHFORENCODE(int bytes)
      + SCI_ENCODEDFROMUTF8 converts a UTF-8 string into the document's + encoding which is useful for taking the results of a find dialog, for example, and receiving + a string of bytes that can be searched for in the document. Since the text can contain nul bytes, + the SCI_SETLENGTHFORENCODE method can be used to set the + length that will be converted. If set to -1, the length is determined by finding a nul byte. + The length of the converted string is returned. +

      + + +

      Searching

      + SCI_FINDTEXT(int flags, TextToFind + *ttf)
      + SCI_SEARCHANCHOR
      + SCI_SEARCHNEXT(int searchFlags, const char + *text)
      + SCI_SEARCHPREV(int searchFlags, const char + *text)
      + Search and replace using the + target
      +
      + +

      searchFlags
      + Several of the search routines use flag options, which include a simple regular expression + search. Combine the flag options by adding them:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SCFIND_MATCHCASEA match only occurs with text that matches the case of the search string.
      SCFIND_WHOLEWORDA match only occurs if the characters before and after are not word characters.
      SCFIND_WORDSTARTA match only occurs if the character before is not a word character.
      SCFIND_REGEXPThe search string should be interpreted as a regular expression.
      SCFIND_POSIXTreat regular expression in a more POSIX compatible manner + by interpreting bare ( and ) for tagged sections rather than \( and \).
      + +

      If SCFIND_REGEXP is not included in the searchFlags, you can + search backwards to find the previous occurrence of a search string by setting the end of the + search range before the start. If SCFIND_REGEXP is included, searches are always + from a lower position to a higher position, even if the search range is backwards.

      + +

      In a regular expression, special characters interpreted are:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      .Matches any character
      \(This marks the start of a region for tagging a match.
      \)This marks the end of a tagged region.
      \nWhere n is 1 through 9 refers to the first through ninth tagged region + when replacing. For example, if the search string was Fred\([1-9]\)XXX and + the replace string was Sam\1YYY, when applied to Fred2XXX this + would generate Sam2YYY.
      \<This matches the start of a word using Scintilla's definitions of words.
      \>This matches the end of a word using Scintilla's definition of words.
      \xThis allows you to use a character x that would otherwise have a special meaning. For + example, \[ would be interpreted as [ and not as the start of a character set.
      [...]This indicates a set of characters, for example, [abc] means any of the characters a, + b or c. You can also use ranges, for example [a-z] for any lower case character.
      [^...]The complement of the characters in the set. For example, [^A-Za-z] means any + character except an alphabetic character.
      ^This matches the start of a line (unless used inside a set, see above).
      $This matches the end of a line.
      *This matches 0 or more times. For example, Sa*m matches Sm, + Sam, Saam, Saaam and so on.
      +This matches 1 or more times. For example, Sa+m matches + Sam, Saam, Saaam and so on.
      + +

      SCI_FINDTEXT(int searchFlags, TextToFind *ttf)
      + This message searches for text in the document. It does not use or move the current selection. + The searchFlags argument controls the + search type, which includes regular expression searches.

      + +

      The TextToFind structure is defined in Scintilla.h; set + chrg.cpMin and chrg.cpMax with the range of positions in the document + to search. If SCFIND_REGEXP is not included in the flags, you can search backwards by + setting chrg.cpMax less than chrg.cpMin. If SCFIND_REGEXP + is included, the search is always forwards (even if chrg.cpMax is less than chrg.cpMin). + Set the lpstrText member of TextToFind to point at a zero terminated + text string holding the search pattern. If your language makes the use of TextToFind + difficult, you should consider using SCI_SEARCHINTARGET instead.

      + +

      The return value is -1 if the search fails or the position of the start of the found text if + it succeeds. The chrgText.cpMin and chrgText.cpMax members of + TextToFind are filled in with the start and end positions of the found text.

      + +

      See also: SCI_SEARCHINTARGET

      + +

      TextToFind
      + This structure is defined to have exactly the same shape as the Win32 structure + FINDTEXTEX for old code that treated Scintilla as a RichEdit control.

      +
      +struct TextToFind {
      +    struct CharacterRange chrg;     // range to search
      +    char *lpstrText;                // the search pattern (zero terminated)
      +    struct CharacterRange chrgText; // returned as position of matching text
      +};
      +
      + +

      SCI_SEARCHANCHOR
      + SCI_SEARCHNEXT(int searchFlags, const char *text)
      + SCI_SEARCHPREV(int searchFlags, const char *text)
      + These messages provide relocatable search support. This allows multiple incremental + interactive searches to be macro recorded while still setting the selection to found text so + the find/select operation is self-contained. These three messages send SCN_MACRORECORD notifications if macro recording is enabled.

      + +

      SCI_SEARCHANCHOR sets the search start point used by + SCI_SEARCHNEXT and SCI_SEARCHPREV to the start of the current + selection, that is, the end of the selection that is nearer to the start of the document. You + should always call this before calling either of SCI_SEARCHNEXT or + SCI_SEARCHPREV.

      + +

      SCI_SEARCHNEXT and SCI_SEARCHPREV search for the next and previous + occurrence of the zero terminated search string pointed at by text. The search is modified by + the searchFlags. If you request a regular + expression, SCI_SEARCHPREV finds the first occurrence of the search string in the + document, not the previous one before the anchor point.

      + +

      The return value is -1 if nothing is found, otherwise the return value is the start position + of the matching text. The selection is updated to show the matched text, but is not scrolled + into view.

      + +

      See also: SCI_SEARCHINTARGET, + SCI_FINDTEXT

      + +

      Search and replace using the target

      + +

      Using SCI_REPLACESEL, + modifications cause scrolling and other visible changes, which may take some time and cause + unwanted display updates. If performing many changes, such as a replace all command, the target + can be used instead. First, set the target, ie. the range to be replaced. Then call + SCI_REPLACETARGET or SCI_REPLACETARGETRE.

      + +

      Searching can be performed within the target range with SCI_SEARCHINTARGET, + which uses a counted string to allow searching for null characters. It returns the length of + range or -1 for failure, in which case the target is not moved. The flags used by + SCI_SEARCHINTARGET such as SCFIND_MATCHCASE, + SCFIND_WHOLEWORD, SCFIND_WORDSTART, and SCFIND_REGEXP + can be set with SCI_SETSEARCHFLAGS. SCI_SEARCHINTARGET may be simpler + for some clients to use than SCI_FINDTEXT, as that requires using a pointer to a + structure.

      + SCI_SETTARGETSTART(int pos)
      + SCI_GETTARGETSTART
      + SCI_SETTARGETEND(int pos)
      + SCI_GETTARGETEND
      + SCI_TARGETFROMSELECTION
      + SCI_SETSEARCHFLAGS(int searchFlags)
      + SCI_GETSEARCHFLAGS
      + SCI_SEARCHINTARGET(int length, const char + *text)
      + SCI_REPLACETARGET(int length, const char + *text)
      + SCI_REPLACETARGETRE(int length, const char + *text)
      +
      + +

      SCI_SETTARGETSTART(int pos)
      + SCI_GETTARGETSTART
      + SCI_SETTARGETEND(int pos)
      + SCI_GETTARGETEND
      + These functions set and return the start and end of the target. When searching in non-regular + expression mode, you can set start greater than end to find the last matching text in the + target rather than the first matching text. The target is also set by a successful + SCI_SEARCHINTARGET.

      + +

      SCI_TARGETFROMSELECTION
      + Set the target start and end to the start and end positions of the selection.

      + +

      SCI_SETSEARCHFLAGS(int searchFlags)
      + SCI_GETSEARCHFLAGS
      + These get and set the searchFlags used by + SCI_SEARCHINTARGET. There are several option flags including a simple regular + expression search.

      + +

      SCI_SEARCHINTARGET(int length, const char *text)
      + This searches for the first occurrence of a text string in the target defined by + SCI_SETTARGETSTART and SCI_SETTARGETEND. The text string is not zero + terminated; the size is set by length. The search is modified by the search flags + set by SCI_SETSEARCHFLAGS. If the search succeeds, the target is set to the found + text and the return value is the position of the start of the matching text. If the search + fails, the result is -1.

      + +

      SCI_REPLACETARGET(int length, const char *text)
      + If length is -1, text is a zero terminated string, otherwise + length sets the number of character to replace the target with. + After replacement, the target range refers to the replacement text. + The return value + is the length of the replacement string.
      + Note that the recommended way to delete text in the document is to set the target to the text to be removed, + and to perform a replace target with an empty string.

      + +

      SCI_REPLACETARGETRE(int length, const char *text)
      + This replaces the target using regular expressions. If length is -1, + text is a zero terminated string, otherwise length is the number of + characters to use. The replacement string is formed from the text string with any sequences of + \1 through \9 replaced by tagged matches from the most recent regular + expression search. + After replacement, the target range refers to the replacement text. + The return value is the length of the replacement string.

      + +

      See also: SCI_FINDTEXT

      + +

      Overtype

      + +

      SCI_SETOVERTYPE(bool overType)
      + SCI_GETOVERTYPE
      + When overtype is enabled, each typed character replaces the character to the right of the text + caret. When overtype is disabled, characters are inserted at the caret. + SCI_GETOVERTYPE returns TRUE (1) if overtyping is active, otherwise + FALSE (0) will be returned. Use SCI_SETOVERTYPE to set the overtype + mode.

      + +

      Cut, copy and paste

      + + SCI_CUT
      + SCI_COPY
      + SCI_PASTE
      + SCI_CLEAR
      + SCI_CANPASTE
      + SCI_COPYRANGE(int start, int end)
      + SCI_COPYTEXT(int length, + const char *text)
      + SCI_SETPASTECONVERTENDINGS(bool convert)
      + SCI_GETPASTECONVERTENDINGS
      +
      + +

      SCI_CUT
      + SCI_COPY
      + SCI_PASTE
      + SCI_CLEAR
      + SCI_CANPASTE
      + These commands perform the standard tasks of cutting and copying data to the clipboard, + pasting from the clipboard into the document, and clearing the document. + SCI_CANPASTE returns non-zero if the document isn't read-only and if the selection + doesn't contain protected text. If you need a "can copy" or "can cut", use + SCI_GETSELECTIONSTART()-SCI_GETSELECTIONEND(), which will be non-zero if you can + copy or cut to the clipboard.

      + +

      GTK+ does not really support SCI_CANPASTE and always returns TRUE + unless the document is read-only.

      + +

      On X, the clipboard is asynchronous and may require several messages between + the destination and source applications. Data from SCI_PASTE will not arrive in the + document immediately.

      + + SCI_COPYRANGE(int start, int end)
      + SCI_COPYTEXT(int length, const char *text)
      +

      SCI_COPYRANGE copies a range of text from the document to + the system clipboard and SCI_COPYTEXT copies a supplied piece of + text to the system clipboard.

      + +

      SCI_SETPASTECONVERTENDINGS(bool convert)
      + SCI_GETPASTECONVERTENDINGS
      + If this property is set then when text is pasted any line ends are converted to match the document's + end of line mode as set with + SCI_SETEOLMODE. + Currently only changeable on Windows. On GTK+ pasted text is always converted.

      + +

      Error handling

      + +

      SCI_SETSTATUS(int status)
      + SCI_GETSTATUS
      + If an error occurs, Scintilla may set an internal error number that can be retrieved with + SCI_GETSTATUS. Not currently used but will be in the future. To clear the error + status call SCI_SETSTATUS(0).

      + +

      Undo and Redo

      + +

      Scintilla has multiple level undo and redo. It will continue to collect undoable actions + until memory runs out. Scintilla saves actions that change the document. Scintilla does not + save caret and selection movements, view scrolling and the like. Sequences of typing or + deleting are compressed into single transactions to make it easier to undo and redo at a sensible + level of detail. Sequences of actions can be combined into transactions that are undone as a unit. + These sequences occur between SCI_BEGINUNDOACTION and + SCI_ENDUNDOACTION messages. These transactions can be nested and only the top-level + sequences are undone as units.

      + SCI_UNDO
      + SCI_CANUNDO
      + SCI_EMPTYUNDOBUFFER
      + SCI_REDO
      + SCI_CANREDO
      + SCI_SETUNDOCOLLECTION(bool + collectUndo)
      + SCI_GETUNDOCOLLECTION
      + SCI_BEGINUNDOACTION
      + SCI_ENDUNDOACTION
      +
      + +

      SCI_UNDO
      + SCI_CANUNDO
      + SCI_UNDO undoes one action, or if the undo buffer has reached a + SCI_ENDUNDOACTION point, all the actions back to the corresponding + SCI_BEGINUNDOACTION.

      + +

      SCI_CANUNDO returns 0 if there is nothing to undo, and 1 if there is. You would + typically use the result of this message to enable/disable the Edit menu Undo command.

      + +

      SCI_REDO
      + SCI_CANREDO
      + SCI_REDO undoes the effect of the last SCI_UNDO operation.

      + +

      SCI_CANREDO returns 0 if there is no action to redo and 1 if there are undo + actions to redo. You could typically use the result of this message to enable/disable the Edit + menu Redo command.

      + +

      SCI_EMPTYUNDOBUFFER
      + This command tells Scintilla to forget any saved undo or redo history. It also sets the save + point to the start of the undo buffer, so the document will appear to be unmodified. This does + not cause the SCN_SAVEPOINTREACHED notification to be sent to the + container.

      + +

      See also: SCI_SETSAVEPOINT

      + +

      SCI_SETUNDOCOLLECTION(bool collectUndo)
      + SCI_GETUNDOCOLLECTION
      + You can control whether Scintilla collects undo information with + SCI_SETUNDOCOLLECTION. Pass in true (1) to collect information and + false (0) to stop collecting. If you stop collection, you should also use + SCI_EMPTYUNDOBUFFER to avoid the undo buffer being unsynchronized with the data in + the buffer.

      + +

      You might wish to turn off saving undo information if you use the Scintilla to store text + generated by a program (a Log view) or in a display window where text is often deleted and + regenerated.

      + +

      SCI_BEGINUNDOACTION
      + SCI_ENDUNDOACTION
      + Send these two messages to Scintilla to mark the beginning and end of a set of operations that + you want to undo all as one operation but that you have to generate as several operations. + Alternatively, you can use these to mark a set of operations that you do not want to have + combined with the preceding or following operations if they are undone.

      + +

      Selection and information

      + +

      Scintilla maintains a selection that stretches between two points, the anchor and the + current position. If the anchor and the current position are the same, there is no selected + text. Positions in the document range from 0 (before the first character), to the document size + (after the last character). If you use messages, there is nothing to stop you setting a + position that is in the middle of a CRLF pair, or in the middle of a 2 byte character. However, + keyboard commands will not move the caret into such positions.

      + SCI_GETTEXTLENGTH
      + SCI_GETLENGTH
      + SCI_GETLINECOUNT
      + SCI_GETFIRSTVISIBLELINE
      + SCI_LINESONSCREEN
      + SCI_GETMODIFY
      + SCI_SETSEL(int anchorPos, int currentPos)
      + SCI_GOTOPOS(int position)
      + SCI_GOTOLINE(int line)
      + SCI_SETCURRENTPOS(int position)
      + SCI_GETCURRENTPOS
      + SCI_SETANCHOR(int position)
      + SCI_GETANCHOR
      + SCI_SETSELECTIONSTART(int position)
      + SCI_GETSELECTIONSTART
      + SCI_SETSELECTIONEND(int position)
      + SCI_GETSELECTIONEND
      + SCI_SELECTALL
      + SCI_LINEFROMPOSITION(int position)
      + SCI_POSITIONFROMLINE(int line)
      + SCI_GETLINEENDPOSITION(int line)
      + SCI_LINELENGTH(int line)
      + SCI_GETCOLUMN(int position)
      + SCI_FINDCOLUMN(int line, int column)
      + SCI_POSITIONFROMPOINT(int x, int y)
      + SCI_POSITIONFROMPOINTCLOSE(int x, int + y)
      + SCI_POINTXFROMPOSITION(<unused>, int + position)
      + SCI_POINTYFROMPOSITION(<unused>, int + position)
      + SCI_HIDESELECTION(bool hide)
      + SCI_GETSELTEXT(<unused>, char *text)
      + SCI_GETCURLINE(int textLen, char *text)
      + SCI_SELECTIONISRECTANGLE
      + SCI_SETSELECTIONMODE(int mode)
      + SCI_GETSELECTIONMODE
      + SCI_GETLINESELSTARTPOSITION(int line)
      + SCI_GETLINESELENDPOSITION(int line)
      + SCI_MOVECARETINSIDEVIEW
      + SCI_WORDENDPOSITION(int position, bool + onlyWordCharacters)
      + SCI_WORDSTARTPOSITION(int position, bool + onlyWordCharacters)
      + SCI_POSITIONBEFORE(int position)
      + SCI_POSITIONAFTER(int position)
      + SCI_TEXTWIDTH(int styleNumber, const char *text)
      + SCI_TEXTHEIGHT(int line)
      + SCI_CHOOSECARETX
      +
      + +

      SCI_GETTEXTLENGTH
      + SCI_GETLENGTH
      + Both these messages return the length of the document in characters.

      + +

      SCI_GETLINECOUNT
      + This returns the number of lines in the document. An empty document contains 1 line. A + document holding only an end of line sequence has 2 lines.

      + +

      SCI_GETFIRSTVISIBLELINE
      + This returns the line number of the first visible line in the Scintilla view. The first line + in the document is numbered 0. The value is a visible line rather than a document line.

      + +

      SCI_LINESONSCREEN
      + This returns the number of complete lines visible on the screen. With a constant line height, + this is the vertical space available divided by the line separation. Unless you arrange to size + your window to an integral number of lines, there may be a partial line visible at the bottom + of the view.

      + +

      SCI_GETMODIFY
      + This returns non-zero if the document is modified and 0 if it is unmodified. The modified + status of a document is determined by the undo position relative to the save point. The save + point is set by SCI_SETSAVEPOINT, + usually when you have saved data to a file.

      + +

      If you need to be notified when the document becomes modified, Scintilla notifies the + container that it has entered or left the save point with the SCN_SAVEPOINTREACHED and SCN_SAVEPOINTLEFT notification messages.

      + +

      SCI_SETSEL(int anchorPos, int currentPos)
      + This message sets both the anchor and the current position. If currentPos is + negative, it means the end of the document. If anchorPos is negative, it means + remove any selection (i.e. set the anchor to the same position as currentPos). The + caret is scrolled into view after this operation.

      + +

      SCI_GOTOPOS(int pos)
      + This removes any selection, sets the caret at pos and scrolls the view to make + the caret visible, if necessary. It is equivalent to + SCI_SETSEL(pos, pos). The anchor position is set the same as the current + position.

      + +

      SCI_GOTOLINE(int line)
      + This removes any selection and sets the caret at the start of line number line + and scrolls the view (if needed) to make it visible. The anchor position is set the same as the + current position. If line is outside the lines in the document (first line is 0), + the line set is the first or last.

      + +

      SCI_SETCURRENTPOS(int pos)
      + This sets the current position and creates a selection between the anchor and the current + position. The caret is not scrolled into view.

      + +

      See also: SCI_SCROLLCARET

      + +

      SCI_GETCURRENTPOS
      + This returns the current position.

      + +

      SCI_SETANCHOR(int pos)
      + This sets the anchor position and creates a selection between the anchor position and the + current position. The caret is not scrolled into view.

      + +

      See also: SCI_SCROLLCARET

      + +

      SCI_GETANCHOR
      + This returns the current anchor position.

      + +

      SCI_SETSELECTIONSTART(int pos)
      + SCI_SETSELECTIONEND(int pos)
      + These set the selection based on the assumption that the anchor position is less than the + current position. They do not make the caret visible. The table shows the positions of the + anchor and the current position after using these messages.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + anchorcurrent
      SCI_SETSELECTIONSTARTposMax(pos, current)
      SCI_SETSELECTIONENDMin(anchor, pos)pos
      + +

      See also: SCI_SCROLLCARET

      + +

      SCI_GETSELECTIONSTART
      + SCI_GETSELECTIONEND
      + These return the start and end of the selection without regard to which end is the current + position and which is the anchor. SCI_GETSELECTIONSTART returns the smaller of the + current position or the anchor position. SCI_GETSELECTIONEND returns the larger of + the two values.

      + +

      SCI_SELECTALL
      + This selects all the text in the document. The current position is not scrolled into view.

      + +

      SCI_LINEFROMPOSITION(int pos)
      + This message returns the line that contains the position pos in the document. The + return value is 0 if pos <= 0. The return value is the last line if + pos is beyond the end of the document.

      + +

      SCI_POSITIONFROMLINE(int line)
      + This returns the document position that corresponds with the start of the line. If + line is negative, the position of the line holding the start of the selection is + returned. If line is greater than the lines in the document, the return value is + -1. If line is equal to the number of lines in the document (i.e. 1 line past the + last line), the return value is the end of the document.

      + +

      SCI_GETLINEENDPOSITION(int line)
      + This returns the position at the end of the line, before any line end characters. If line + is the last line in the document (which does not have any end of line characters), the result is the size of the + document. If line is negative or line >= SCI_GETLINECOUNT(), the result is undefined.

      + +

      SCI_LINELENGTH(int line)
      + This returns the length of the line, including any line end characters. If line + is negative or beyond the last line in the document, the result is 0. If you want the length of + the line not including any end of line characters, use SCI_GETLINEENDPOSITION(line) - SCI_POSITIONFROMLINE(line).

      + SCI_GETSELTEXT(<unused>, char *text)
      + This copies the currently selected text and a terminating 0 byte to the text + buffer. The buffer must be at least + SCI_GETSELECTIONEND()-SCI_GETSELECTIONSTART()+1 bytes long.
      + If the text argument is 0 then the length that should be allocated + to store the entire selection is returned.
      + +

      See also: SCI_GETCURLINE, SCI_GETLINE, SCI_GETTEXT, SCI_GETSTYLEDTEXT, SCI_GETTEXTRANGE

      + +

      SCI_GETCURLINE(int textLen, char *text)
      + This retrieves the text of the line containing the caret and returns the position within the + line of the caret. Pass in char* text pointing at a buffer large enough to hold + the text you wish to retrieve and a terminating 0 character. + Set textLen to the + length of the buffer which must be at least 1 to hold the terminating 0 character. + If the text argument is 0 then the length that should be allocated + to store the entire current line is returned.

      + +

      See also: SCI_GETSELTEXT, SCI_GETLINE, SCI_GETTEXT, SCI_GETSTYLEDTEXT, SCI_GETTEXTRANGE

      + +

      SCI_SELECTIONISRECTANGLE
      + This returns 1 if the current selection is in rectangle mode, 0 if not.

      + +

      SCI_SETSELECTIONMODE(int mode)
      + SCI_GETSELECTIONMODE
      + The two functions set and get the selection mode, which can be + stream (SC_SEL_STREAM=0) or + rectangular (SC_SEL_RECTANGLE=1) + or by lines (SC_SEL_LINES=2). + When set in these modes, regular caret moves will extend or reduce the selection, + until the mode is cancelled by a call with same value or with SCI_CANCEL. + The get function returns the current mode even if the selection was made by mouse + or with regular extended moves.

      + +

      SCI_GETLINESELSTARTPOSITION(int line)
      + SCI_GETLINESELENDPOSITION(int line)
      + Retrieve the position of the start and end of the selection at the given line with + INVALID_POSITION returned if no selection on this line.

      + +

      SCI_MOVECARETINSIDEVIEW
      + If the caret is off the top or bottom of the view, it is moved to the nearest line that is + visible to its current position. Any selection is lost.

      + +

      SCI_WORDENDPOSITION(int position, bool + onlyWordCharacters)
      + SCI_WORDSTARTPOSITION(int position, bool + onlyWordCharacters)
      + These messages return the start and end of words using the same definition of words as used + internally within Scintilla. You can set your own list of characters that count as words with + SCI_SETWORDCHARS. The position + sets the start or the search, which is forwards when searching for the end and backwards when + searching for the start.

      + +

      Set onlyWordCharacters to true (1) to stop searching at the first + non-word character in the search direction. If onlyWordCharacters is + false (0), the first character in the search direction sets the type of the search + as word or non-word and the search stops at the first non-matching character. Searches are also + terminated by the start or end of the document.

      + +

      If "w" represents word characters and "." represents non-word characters and "|" represents + the position and true or false is the state of + onlyWordCharacters:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Initial stateend, trueend, falsestart, truestart, false
      ..ww..|..ww....ww..|..ww....ww....|ww....ww..|..ww....ww|....ww..
      ....ww|ww........wwww|........wwww|........|wwww........|wwww....
      ..ww|....ww....ww|....ww....ww....|ww....|ww....ww....|ww....ww..
      ..ww....|ww....ww....ww|....ww....ww|....ww....|ww....ww|....ww..
      + +

      SCI_POSITIONBEFORE(int position)
      + SCI_POSITIONAFTER(int position)
      + These messages return the position before and after another position + in the document taking into account the current code page. The minimum + position returned is 0 and the maximum is the last position in the document. + If called with a position within a multi byte character will return the position + of the start/end of that character.

      + +

      SCI_TEXTWIDTH(int styleNumber, const char *text)
      + This returns the pixel width of a string drawn in the given styleNumber which can + be used, for example, to decide how wide to make the line number margin in order to display a + given number of numerals.

      + +

      SCI_TEXTHEIGHT(int line)
      + This returns the height in pixels of a particular line. Currently all lines are the same + height.

      + +

      SCI_GETCOLUMN(int pos)
      + This message returns the column number of a position pos within the document + taking the width of tabs into account. This returns the column number of the last tab on the + line before pos, plus the number of characters between the last tab and + pos. If there are no tab characters on the line, the return value is the number of + characters up to the position on the line. In both cases, double byte characters count as a + single character. This is probably only useful with monospaced fonts.

      + +

      SCI_FINDCOLUMN(int line, int column)
      + This message returns the position of a column on a line + taking the width of tabs into account. It treats a multi-byte character as a single column. + Column numbers, like lines start at 0.

      + +

      SCI_POSITIONFROMPOINT(int x, int y)
      + SCI_POSITIONFROMPOINTCLOSE(int x, int y)
      + SCI_POSITIONFROMPOINT finds the closest character position to a point and + SCI_POSITIONFROMPOINTCLOSE is similar but returns -1 if the point is outside the + window or not close to any characters.

      + +

      SCI_POINTXFROMPOSITION(<unused>, int pos)
      + SCI_POINTYFROMPOSITION(<unused>, int pos)
      + These messages return the x and y display pixel location of text at position pos + in the document.

      + +

      SCI_HIDESELECTION(bool hide)
      + The normal state is to make the selection visible by drawing it as set by SCI_SETSELFORE and SCI_SETSELBACK. However, if you hide the selection, it + is drawn as normal text.

      + +

      SCI_CHOOSECARETX
      + Scintilla remembers the x value of the last position horizontally moved to explicitly by the + user and this value is then used when moving vertically such as by using the up and down keys. + This message sets the current x position of the caret as the remembered value.

      + +

      Scrolling and automatic scrolling

      + SCI_LINESCROLL(int column, int line)
      + SCI_SCROLLCARET
      + SCI_SETXCARETPOLICY(int caretPolicy, int + caretSlop)
      + SCI_SETYCARETPOLICY(int caretPolicy, int + caretSlop)
      + SCI_SETVISIBLEPOLICY(int caretPolicy, int + caretSlop)
      + SCI_SETHSCROLLBAR(bool visible)
      + SCI_GETHSCROLLBAR
      + SCI_SETVSCROLLBAR(bool visible)
      + SCI_GETVSCROLLBAR
      + SCI_GETXOFFSET
      + SCI_SETXOFFSET(int xOffset)
      + SCI_SETSCROLLWIDTH(int pixelWidth)
      + SCI_GETSCROLLWIDTH
      + SCI_SETENDATLASTLINE(bool + endAtLastLine)
      + SCI_GETENDATLASTLINE
      +
      + +

      SCI_LINESCROLL(int column, int line)
      + This will attempt to scroll the display by the number of columns and lines that you specify. + Positive line values increase the line number at the top of the screen (i.e. they move the text + upwards as far as the user is concerned), Negative line values do the reverse.

      + +

      The column measure is the width of a space in the default style. Positive values increase + the column at the left edge of the view (i.e. they move the text leftwards as far as the user + is concerned). Negative values do the reverse.

      + +

      See also: SCI_SETXOFFSET

      + +

      SCI_SCROLLCARET
      + If the current position (this is the caret if there is no selection) is not visible, the view + is scrolled to make it visible according to the current caret policy.

      + +

      SCI_SETXCARETPOLICY(int caretPolicy, int caretSlop)
      + SCI_SETYCARETPOLICY(int caretPolicy, int caretSlop)
      + These set the caret policy. The value of caretPolicy is a combination of + CARET_SLOP, CARET_STRICT, CARET_JUMPS and + CARET_EVEN.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      CARET_SLOPIf set, we can define a slop value: caretSlop. This value defines an + unwanted zone (UZ) where the caret is... unwanted. This zone is defined as a number of + pixels near the vertical margins, and as a number of lines near the horizontal margins. + By keeping the caret away from the edges, it is seen within its context. This makes it + likely that the identifier that the caret is on can be completely seen, and that the + current line is seen with some of the lines following it, which are often dependent on + that line.
      CARET_STRICTIf set, the policy set by CARET_SLOP is enforced... strictly. The caret + is centred on the display if caretSlop is not set, and cannot go in the UZ + if caretSlop is set.
      CARET_JUMPSIf set, the display is moved more energetically so the caret can move in the same + direction longer before the policy is applied again. '3UZ' notation is used to indicate + three time the size of the UZ as a distance to the margin.
      CARET_EVENIf not set, instead of having symmetrical UZs, the left and bottom UZs are extended + up to right and top UZs respectively. This way, we favour the displaying of useful + information: the beginning of lines, where most code reside, and the lines after the + caret, for example, the body of a function.
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      slopstrictjumpsevenCaret can go to the marginOn reaching limit (going out of visibility
      + or going into the UZ) display is...
      0000Yesmoved to put caret on top/on right
      0001Yesmoved by one position
      0010Yesmoved to put caret on top/on right
      0011Yescentred on the caret
      01-0Caret is always on top/on right of display-
      01-1No, caret is always centred-
      1000Yesmoved to put caret out of the asymmetrical UZ
      1001Yesmoved to put caret out of the UZ
      1010Yesmoved to put caret at 3UZ of the top or right margin
      1011Yesmoved to put caret at 3UZ of the margin
      11-0Caret is always at UZ of top/right margin-
      1101No, kept out of UZmoved by one position
      1110No, kept out of UZmoved to put caret at 3UZ of the margin
      + +

      SCI_SETVISIBLEPOLICY(int caretPolicy, int caretSlop)
      + This determines how the vertical positioning is determined when SCI_ENSUREVISIBLEENFORCEPOLICY is + called. It takes VISIBLE_SLOP and VISIBLE_STRICT flags for the policy + parameter. It is similar in operation to SCI_SETYCARETPOLICY(int caretPolicy, int + caretSlop).

      + +

      SCI_SETHSCROLLBAR(bool visible)
      + SCI_GETHSCROLLBAR
      + The horizontal scroll bar is only displayed if it is needed for the assumed width. + If you never wish to see it, call + SCI_SETHSCROLLBAR(0). Use SCI_SETHSCROLLBAR(1) to enable it again. + SCI_GETHSCROLLBAR returns the current state. The default state is to display it + when needed. + See also: SCI_SETSCROLLWIDTH.

      + +

      SCI_SETVSCROLLBAR(bool visible)
      + SCI_GETVSCROLLBAR
      + By default, the vertical scroll bar is always displayed when required. You can choose to hide + or show it with SCI_SETVSCROLLBAR and get the current state with + SCI_GETVSCROLLBAR.

      + +

      SCI_SETXOFFSET(int xOffset)
      + SCI_GETXOFFSET
      + The xOffset is the horizontal scroll position in pixels of the start of the text + view. A value of 0 is the normal position with the first text column visible at the left of the + view.

      + +

      See also: SCI_LINESCROLL

      + +

      SCI_SETSCROLLWIDTH(int pixelWidth)
      + SCI_GETSCROLLWIDTH
      + For performance, Scintilla does not measure the display width of the document to determine + the properties of the horizontal scroll bar. Instead, an assumed width is used. + These messages set and get the document width in pixels assumed by Scintilla. + The default value is 2000.

      + +

      SCI_SETENDATLASTLINE(bool endAtLastLine)
      + SCI_GETENDATLASTLINE
      + SCI_SETENDATLASTLINE sets the scroll range so that maximum scroll position has + the last line at the bottom of the view (default). Setting this to false allows + scrolling one page below the last line.

      + +

      White space

      + SCI_SETVIEWWS(int wsMode)
      + SCI_GETVIEWWS
      + SCI_SETWHITESPACEFORE(bool + useWhitespaceForeColour, int colour)
      + SCI_SETWHITESPACEBACK(bool + useWhitespaceBackColour, int colour)
      +
      + +

      SCI_SETVIEWWS(int wsMode)
      + SCI_GETVIEWWS
      + White space can be made visible which may useful for languages in which white space is + significant, such as Python. Space characters appear as small centred dots and tab characters + as light arrows pointing to the right. There are also ways to control the display of end of line characters. The two messages set and get the + white space display mode. The wsMode argument can be one of:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SCWS_INVISIBLE0The normal display mode with white space displayed as an empty background + colour.
      SCWS_VISIBLEALWAYS1White space characters are drawn as dots and arrows,
      SCWS_VISIBLEAFTERINDENT2White space used for indentation is displayed normally but after the first visible + character, it is shown as dots and arrows.
      + +

      The effect of using any other wsMode value is undefined.

      + +

      SCI_SETWHITESPACEFORE<(bool useWhitespaceForeColour, int colour)
      + SCI_SETWHITESPACEBACK(bool useWhitespaceBackColour, int colour)
      + By default, the colour of visible white space is determined by the lexer in use. The + foreground and/or background colour of all visible white space can be set globally, overriding + the lexer's colours with SCI_SETWHITESPACEFORE and + SCI_SETWHITESPACEBACK.

      + +

      Cursor

      + +

      SCI_SETCURSOR(int curType)
      + SCI_GETCURSOR
      + The cursor is normally chosen in a context sensitive way, so it will be different over the + margin than when over the text. When performing a slow action, you may wish to change to a wait + cursor. You set the cursor type with SCI_SETCURSOR. The curType + argument can be:

      + + + + + + + + + + + + + + + + + + + +
      SC_CURSORNORMAL-1The normal cursor is displayed.
      SC_CURSORWAIT 4The wait cursor is displayed when the mouse is over or owned by the Scintilla + window.
      + +

      Cursor values 1 through 7 have defined cursors, but only SC_CURSORWAIT is + usefully controllable. Other values of curType cause a pointer to be displayed. + The SCI_GETCURSOR message returns the last cursor type you set, or + SC_CURSORNORMAL (-1) if you have not set a cursor type.

      + +

      Mouse capture

      + +

      SCI_SETMOUSEDOWNCAPTURES(bool captures)
      + SCI_GETMOUSEDOWNCAPTURES
      + When the mouse is pressed inside Scintilla, it is captured so future mouse movement events are + sent to Scintilla. This behavior may be turned off with + SCI_SETMOUSEDOWNCAPTURES(0).

      + +

      Line endings

      + +

      Scintilla can interpret any of the three major line end conventions, Macintosh (\r), Unix + (\n) and CP/M / DOS / Windows (\r\n). When the user presses the Enter key, one of these line + end strings is inserted into the buffer. The default is \r\n in Windows and \n in Unix, but + this can be changed with the SCI_SETEOLMODE message. You can also convert the + entire document to one of these line endings with SCI_CONVERTEOLS. Finally, you + can choose to display the line endings with SCI_SETVIEWEOL.

      + SCI_SETEOLMODE(int eolMode)
      + SCI_GETEOLMODE
      + SCI_CONVERTEOLS(int eolMode)
      + SCI_SETVIEWEOL(bool visible)
      + SCI_GETVIEWEOL
      +
      + +

      SCI_SETEOLMODE(int eolMode)
      + SCI_GETEOLMODE
      + SCI_SETEOLMODE sets the characters that are added into the document when the user + presses the Enter key. You can set eolMode to one of SC_EOL_CRLF (0), + SC_EOL_CR (1), or SC_EOL_LF (2). The SCI_GETEOLMODE + message retrieves the current state.

      + +

      SCI_CONVERTEOLS(int eolMode)
      + This message changes all the end of line characters in the document to match + eolMode. Valid values are: SC_EOL_CRLF (0), SC_EOL_CR + (1), or SC_EOL_LF (2).

      + +

      SCI_SETVIEWEOL(bool visible)
      + SCI_GETVIEWEOL
      + Normally, the end of line characters are hidden, but SCI_SETVIEWEOL allows you to + display (or hide) them by setting visible true (or + false). The visible rendering of the end of line characters is similar to + (CR), (LF), or (CR)(LF). SCI_GETVIEWEOL + returns the current state.

      + +

      Styling

      + +

      The styling messages allow you to assign styles to text. The standard Scintilla settings + divide the 8 style bits available for each character into 5 bits (0 to 4 = styles 0 to 31) that set a style and three bits (5 to 7) that + define indicators. You can change the balance between + styles and indicators with SCI_SETSTYLEBITS. If your styling needs can be met by + one of the standard lexers, or if you can write your own, then a lexer is probably the easiest + way to style your document. If you choose to use the container to do the styling you can use + the SCI_SETLEXER command to select + SCLEX_CONTAINER, in which case the container is sent a SCN_STYLENEEDED notification each time text needs styling for display. As another + alternative, you might use idle time to style the document. Even if you use a lexer, you might + use the styling commands to mark errors detected by a compiler. The following commands can be + used.

      + SCI_GETENDSTYLED
      + SCI_STARTSTYLING(int position, int mask)
      + SCI_SETSTYLING(int length, int style)
      + SCI_SETSTYLINGEX(int length, const char + *styles)
      + SCI_SETLINESTATE(int line, int value)
      + SCI_GETLINESTATE(int line)
      + SCI_GETMAXLINESTATE
      +
      + +

      SCI_GETENDSTYLED
      + Scintilla keeps a record of the last character that is likely to be styled correctly. This is + moved forwards when characters after it are styled and moved backwards if changes are made to + the text of the document before it. Before drawing text, this position is checked to see if any + styling is needed and, if so, a SCN_STYLENEEDED notification message is sent to the + container. The container can send SCI_GETENDSTYLED to work out where it needs to + start styling. Scintilla will always ask to style whole lines.

      + +

      SCI_STARTSTYLING(int pos, int mask)
      + This prepares for styling by setting the styling position pos to start at and a + mask indicating which bits of the style bytes can be set. The mask allows styling + to occur over several passes, with, for example, basic styling done on an initial pass to + ensure that the text of the code is seen quickly and correctly, and then a second slower pass, + detecting syntax errors and using indicators to show where these are. For example, with the + standard settings of 5 style bits and 3 indicator bits, you would use a mask value + of 31 (0x1f) if you were setting text styles and did not want to change the indicators. After + SCI_STARTSTYLING, send multiple SCI_SETSTYLING messages for each + lexical entity to style.

      + +

      SCI_SETSTYLING(int length, int style)
      + This message sets the style of length characters starting at the styling position + and then increases the styling position by length, ready for the next call. If + sCell is the style byte, the operation is:
      + if ((sCell & mask) != style) sCell = (sCell & ~mask) | (style & + mask);
      +

      + +

      SCI_SETSTYLINGEX(int length, const char *styles)
      + As an alternative to SCI_SETSTYLING, which applies the same style to each byte, + you can use this message which specifies the styles for each of length bytes from + the styling position and then increases the styling position by length, ready for + the next call. The length styling bytes pointed at by styles should + not contain any bits not set in mask.

      + +

      SCI_SETLINESTATE(int line, int value)
      + SCI_GETLINESTATE(int line)
      + As well as the 8 bits of lexical state stored for each character there is also an integer + stored for each line. This can be used for longer lived parse states such as what the current + scripting language is in an ASP page. Use SCI_SETLINESTATE to set the integer + value and SCI_GETLINESTATE to get the value.

      + +

      SCI_GETMAXLINESTATE
      + This returns the last line that has any line state.

      + +

      Style definition

      + +

      While the style setting messages mentioned above change the style numbers associated with + text, these messages define how those style numbers are interpreted visually. There are 128 + lexer styles that can be set, numbered 0 to STYLEMAX (127). Unless you use SCI_SETSTYLEBITS to change the number + of style bits, styles 0 to 31 are used to set the text attributes. There are also some + predefined numbered styles starting at 32, The following STYLE_* constants are + defined.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      STYLE_DEFAULT32This style defines the attributes that all styles receive when the + SCI_STYLECLEARALL message is used.
      STYLE_LINENUMBER33This style sets the attributes of the text used to display line numbers in a line + number margin. The background colour set for this style also sets the background colour + for all margins that do not have any folding mask bits set. That is, any margin for which + mask & SC_MASK_FOLDERS is 0. See SCI_SETMARGINMASKN for more about masks.
      STYLE_BRACELIGHT34This style sets the attributes used when highlighting braces with the SCI_BRACEHIGHLIGHT message and + when highlighting the corresponding indentation with SCI_SETHIGHLIGHTGUIDE.
      STYLE_BRACEBAD35This style sets the display attributes used when marking an unmatched brace with the + SCI_BRACEBADLIGHT + message.
      STYLE_CONTROLCHAR36This style sets the font used when drawing control characters. + Only the font, size, bold, italics, and character set attributes are used and not + the colour attributes. See + also: SCI_SETCONTROLCHARSYMBOL.
      STYLE_INDENTGUIDE37This style sets the foreground and background colours used when drawing the + indentation guides.
      STYLE_CALLTIP38 Call tips normally use the font attributes defined by STYLE_DEFAULT. + Use of SCI_CALLTIPUSESTYLE + causes call tips to use this style instead. Only the font face name, font size, + foreground and background colours and character set attributes are used.
      STYLE_LASTPREDEFINED39To make it easier for client code to discover the range of styles that are + predefined, this is set to the style number of the last predefined style. This is + currently set to 39 and the last style with an identifier is 38, which reserves space + for one future predefined style.
      STYLE_MAX127This is not a style but is the number of the maximum style that can be set. Styles + between STYLE_LASTPREDEFINED and STYLE_MAX would be appropriate + if you used SCI_SETSTYLEBITS + to set more than 5 style bits.
      + +

      For each style you can set the font name, size and use of bold, italic and underline, + foreground and background colour and the character set. You can also choose to hide text with a + given style, display all characters as upper or lower case and fill from the last character on + a line to the end of the line (for embedded languages). There is also an experimental attribute + to make text read-only.

      + +

      It is entirely up to you how you use styles. If you want to use syntax colouring you might + use style 0 for white space, style 1 for numbers, style 2 for keywords, style 3 for strings, + style 4 for preprocessor, style 5 for operators, and so on.

      + SCI_STYLERESETDEFAULT
      + SCI_STYLECLEARALL
      + SCI_STYLESETFONT(int styleNumber, char + *fontName)
      + SCI_STYLEGETFONT(int styleNumber, char *fontName)
      + SCI_STYLESETSIZE(int styleNumber, int + sizeInPoints)
      + SCI_STYLEGETSIZE(int styleNumber)
      + SCI_STYLESETBOLD(int styleNumber, bool + bold)
      + SCI_STYLEGETBOLD(int styleNumber)
      + SCI_STYLESETITALIC(int styleNumber, bool + italic)
      + SCI_STYLEGETITALIC(int styleNumber)
      + SCI_STYLESETUNDERLINE(int styleNumber, bool + underline)
      + SCI_STYLEGETUNDERLINE(int styleNumber)
      + SCI_STYLESETFORE(int styleNumber, int + colour)
      + SCI_STYLEGETFORE(int styleNumber)
      + SCI_STYLESETBACK(int styleNumber, int + colour)
      + SCI_STYLESETBACK(int styleNumber)
      + SCI_STYLESETEOLFILLED(int styleNumber, bool + eolFilled)
      + SCI_STYLEGETEOLFILLED(int styleNumber)
      + SCI_STYLESETCHARACTERSET(int styleNumber, + int charSet)
      + SCI_STYLEGETCHARACTERSET(int styleNumber)
      + SCI_STYLESETCASE(int styleNumber, int + caseMode)
      + SCI_STYLEGETCASE(int styleNumber)
      + SCI_STYLESETVISIBLE(int styleNumber, bool + visible)
      + SCI_STYLEGETVISIBLE(int styleNumber)
      + SCI_STYLESETCHANGEABLE(int styleNumber, bool + changeable)
      + SCI_STYLEGETCHANGEABLE(int styleNumber)
      + SCI_STYLESETHOTSPOT(int styleNumber, bool + hotspot)
      + SCI_STYLEGETHOTSPOT(int styleNumber)
      +
      + +

      SCI_STYLERESETDEFAULT
      + This message resets STYLE_DEFAULT to its state when Scintilla was + initialised.

      + +

      SCI_STYLECLEARALL
      + This message sets all styles to have the same attributes as STYLE_DEFAULT. If you + are setting up Scintilla for syntax colouring, it is likely that the lexical styles you set + will be very similar. One way to set the styles is to:
      + 1. Set STYLE_DEFAULT to the common features of all styles.
      + 2. Use SCI_STYLECLEARALL to copy this to all styles.
      + 3. Set the style attributes that make your lexical styles different.

      + +

      SCI_STYLESETFONT(int styleNumber, const char *fontName)
      + SCI_STYLEGETFONT(int styleNumber, char *fontName)
      + SCI_STYLESETSIZE(int styleNumber, int sizeInPoints)
      + SCI_STYLEGETSIZE(int styleNumber)
      + SCI_STYLESETBOLD(int styleNumber, bool bold)
      + SCI_STYLEGETBOLD(int styleNumber)
      + SCI_STYLESETITALIC(int styleNumber, bool italic)
      + SCI_STYLEGETITALIC(int styleNumber)
      + These messages (plus SCI_STYLESETCHARACTERSET) set the font + attributes that are used to match the fonts you request to those available. The + fontName is a zero terminated string holding the name of a font. Under Windows, + only the first 32 characters of the name are used and the name is not case sensitive. For + internal caching, Scintilla tracks fonts by name and does care about the casing of font names, + so please be consistent. On GTK+ 2.x, either GDK or Pango can be used to display text. + Pango antialiases text, works well with Unicode and is better supported in recent versions of GTK+ + but GDK is faster. + Prepend a '!' character to the font name to use Pango.

      + +

      SCI_STYLESETUNDERLINE(int styleNumber, bool + underline)
      + SCI_STYLEGETUNDERLINE(int styleNumber)
      + You can set a style to be underlined. The underline is drawn in the foreground colour. All + characters with a style that includes the underline attribute are underlined, even if they are + white space.

      + +

      SCI_STYLESETFORE(int styleNumber, int colour)
      + SCI_STYLEGETFORE(int styleNumber)
      + SCI_STYLESETBACK(int styleNumber, int colour)
      + SCI_STYLEGETBACK(int styleNumber)
      + Text is drawn in the foreground colour. The space in each character cell that is not occupied + by the character is drawn in the background colour.

      + +

      SCI_STYLESETEOLFILLED(int styleNumber, bool + eolFilled)
      + SCI_STYLEGETEOLFILLED(int styleNumber)
      + If the last character in the line has a style with this attribute set, the remainder of the + line up to the right edge of the window is filled with the background colour set for the last + character. This is useful when a document contains embedded sections in another language such + as HTML pages with embedded JavaScript. By setting eolFilled to true + and a consistent background colour (different from the background colour set for the HTML + styles) to all JavaScript styles then JavaScript sections will be easily distinguished from + HTML.

      + +

      SCI_STYLESETCHARACTERSET(int styleNumber, int + charSet)
      + SCI_STYLEGETCHARACTERSET(int styleNumber)
      + You can set a style to use a different character set than the default. The places where such + characters sets are likely to be useful are comments and literal strings. For example, + SCI_STYLESETCHARACTERSET(SCE_C_STRING, SC_CHARSET_RUSSIAN) would ensure that + strings in Russian would display correctly in C and C++ (SCE_C_STRING is the style + number used by the C and C++ lexer to display literal strings; it has the value 6). This + feature works differently on Windows and GTK+.

      + +

      The character sets supported on Windows are:
      + SC_CHARSET_ANSI, SC_CHARSET_ARABIC, SC_CHARSET_BALTIC, + SC_CHARSET_CHINESEBIG5, SC_CHARSET_DEFAULT, + SC_CHARSET_EASTEUROPE, SC_CHARSET_GB2312, + SC_CHARSET_GREEK, SC_CHARSET_HANGUL, SC_CHARSET_HEBREW, + SC_CHARSET_JOHAB, SC_CHARSET_MAC, SC_CHARSET_OEM, + SC_CHARSET_RUSSIAN (code page 1251), + SC_CHARSET_SHIFTJIS, SC_CHARSET_SYMBOL, SC_CHARSET_THAI, + SC_CHARSET_TURKISH, and SC_CHARSET_VIETNAMESE.

      + +

      The character sets supported on GTK+ are:
      + SC_CHARSET_ANSI, SC_CHARSET_CYRILLIC (code page 1251), + SC_CHARSET_EASTEUROPE, + SC_CHARSET_GB2312, SC_CHARSET_HANGUL, + SC_CHARSET_RUSSIAN (KOI8-R), SC_CHARSET_SHIFTJIS, and + SC_CHARSET_8859_15.

      + +

      SCI_STYLESETCASE(int styleNumber, int caseMode)
      + SCI_STYLEGETCASE(int styleNumber)
      + The value of caseMode determines how text is displayed. You can set upper case + (SC_CASE_UPPER, 1) or lower case (SC_CASE_LOWER, 2) or display + normally (SC_CASE_MIXED, 0). This does not change the stored text, only how it is + displayed.

      + +

      SCI_STYLESETVISIBLE(int styleNumber, bool visible)
      + SCI_STYLEGETVISIBLE(int styleNumber)
      + Text is normally visible. However, you can completely hide it by giving it a style with the + visible set to 0. This could be used to hide embedded formatting instructions or + hypertext keywords in HTML or XML.

      + +

      SCI_STYLESETCHANGEABLE(int styleNumber, bool + changeable)
      + SCI_STYLEGETCHANGEABLE(int styleNumber)
      + This is an experimental and incompletely implemented style attribute. The default setting is + changeable set true but when set false it makes text + read-only. Currently it only stops the caret from being within not-changeable text and does not + yet stop deleting a range that contains not-changeable text.

      + +

      SCI_STYLESETHOTSPOT(int styleNumber, bool + hotspot)
      + SCI_STYLEGETHOTSPOT(int styleNumber)
      + This style is used to mark ranges of text that can detect mouse clicks. + The cursor changes to a hand over hotspots, and the foreground, and background colours + may change and an underline appear to indicate that these areas are sensitive to clicking. + This may be used to allow hyperlinks to other documents.

      + +

      Caret, selection, and hotspot styles

      + +

      The selection is shown by changing the foreground and/or background colours. If one of these + is not set then that attribute is not changed for the selection. The default is to show the + selection by changing the background to light gray and leaving the foreground the same as when + it was not selected. When there is no selection, the current insertion point is marked by the + text caret. This is a vertical line that is normally blinking on and off to attract the users + attention.

      + SCI_SETSELFORE(bool useSelectionForeColour, + int colour)
      + SCI_SETSELBACK(bool useSelectionBackColour, + int colour)
      + SCI_SETSELALPHA(int alpha)
      + SCI_GETSELALPHA
      + SCI_SETSELEOLFILLED(bool filled)
      + SCI_GETSELEOLFILLED
      + SCI_SETCARETFORE(int colour)
      + SCI_GETCARETFORE
      + SCI_SETCARETLINEVISIBLE(bool + show)
      + SCI_GETCARETLINEVISIBLE
      + SCI_SETCARETLINEBACK(int colour)
      + SCI_GETCARETLINEBACK
      + SCI_SETCARETLINEBACKALPHA(int alpha)
      + SCI_GETCARETLINEBACKALPHA
      + SCI_SETCARETPERIOD(int milliseconds)
      + SCI_GETCARETPERIOD
      + SCI_SETCARETWIDTH(int pixels)
      + SCI_GETCARETWIDTH
      + SCI_SETHOTSPOTACTIVEFORE(bool useSetting, + int colour)
      + SCI_GETHOTSPOTACTIVEFORE
      + SCI_SETHOTSPOTACTIVEBACK(bool useSetting, + int colour)
      + SCI_GETHOTSPOTACTIVEBACK
      + SCI_SETHOTSPOTACTIVEUNDERLINE(bool underline)
      + SCI_GETHOTSPOTACTIVEUNDERLINE
      + SCI_SETHOTSPOTSINGLELINE(bool singleLine)
      + SCI_GETHOTSPOTSINGLELINE
      + SCI_SETCONTROLCHARSYMBOL(int + symbol)
      + SCI_GETCONTROLCHARSYMBOL
      + SCI_SETCARETSTICKY(bool useCaretStickyBehaviour)
      + SCI_GETCARETSTICKY
      + SCI_TOGGLECARETSTICKY
      +
      + +

      SCI_SETSELFORE(bool useSelectionForeColour, int colour)
      + SCI_SETSELBACK(bool useSelectionBackColour, int colour)
      + You can choose to override the default selection colouring with these two messages. The colour + you provide is used if you set useSelection*Colour to true. If it is + set to false, the default styled colouring is used and the colour + argument has no effect.

      +

      SCI_SETSELALPHA(int alpha)
      + SCI_GETSELALPHA
      + The selection can be drawn translucently in the selection background colour by + setting an alpha value.

      + +

      SCI_SETSELEOLFILLED(bool filled)
      + SCI_GETSELEOLFILLED
      + The selection can be drawn up to the right hand border by setting this property.

      + +

      SCI_SETCARETFORE(int colour)
      + SCI_GETCARETFORE
      + The colour of the caret can be set with SCI_SETCARETFORE and retrieved with + SCI_CETCARETFORE.

      + +

      SCI_SETCARETLINEVISIBLE(bool show)
      + SCI_GETCARETLINEVISIBLE
      + SCI_SETCARETLINEBACK(int colour)
      + SCI_GETCARETLINEBACK
      + SCI_SETCARETLINEBACKALPHA(int alpha)
      + SCI_GETCARETLINEBACKALPHA
      + You can choose to make the background colour of the line containing the caret different with + these messages. To do this, set the desired background colour with + SCI_SETCARETLINEBACK, then use SCI_SETCARETLINEVISIBLE(true) to + enable the effect. You can cancel the effect with SCI_SETCARETLINEVISIBLE(false). + The two SCI_GETCARET* functions return the state and the colour. This form of + background colouring has highest priority when a line has markers that would otherwise change + the background colour. + The caret line may also be drawn translucently which allows other background colours to show + through. This is done by setting the alpha (translucency) value by calling + SCI_SETCARETLINEBACKALPHA. When the alpha is not SC_ALPHA_NOALPHA, + the caret line is drawn after all other features so will affect the colour of all other features. +

      + +

      SCI_SETCARETPERIOD(int milliseconds)
      + SCI_GETCARETPERIOD
      + The rate at which the caret blinks can be set with SCI_SETCARETPERIOD which + determines the time in milliseconds that the caret is visible or invisible before changing + state. Setting the period to 0 stops the caret blinking. The default value is 500 milliseconds. + SCI_GETCARETPERIOD returns the current setting.

      + +

      SCI_SETCARETWIDTH(int pixels)
      + SCI_GETCARETWIDTH
      + The width of the caret can be set with SCI_SETCARETWIDTH to a value of 0, 1, 2 or + 3 pixels. The default width is 1 pixel. You can read back the current width with + SCI_GETCARETWIDTH. A width of 0 makes the caret invisible (added at version + 1.50).

      + +

      SCI_SETHOTSPOTACTIVEFORE(bool useHotSpotForeColour, int colour)
      + SCI_GETHOTSPOTACTIVEFORE
      + SCI_SETHOTSPOTACTIVEBACK(bool useHotSpotBackColour, int colour)
      + SCI_GETHOTSPOTACTIVEBACK
      + SCI_SETHOTSPOTACTIVEUNDERLINE(bool underline)
      + SCI_GETHOTSPOTACTIVEUNDERLINE
      + SCI_SETHOTSPOTSINGLELINE(bool singleLine)
      + SCI_GETHOTSPOTSINGLELINE
      + While the cursor hovers over text in a style with the hotspot attribute set, + the default colouring can be modified and an underline drawn with these settings. + Single line mode stops a hotspot from wrapping onto next line.

      + +

      SCI_SETCONTROLCHARSYMBOL(int symbol)
      + SCI_GETCONTROLCHARSYMBOL
      + By default, Scintilla displays control characters (characters with codes less than 32) in a + rounded rectangle as ASCII mnemonics: "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", + "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI", "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", + "SYN", "ETB", "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US". These mnemonics come from the + early days of signaling, though some are still used (LF = Line Feed, BS = Back Space, CR = + Carriage Return, for example).

      + +

      You can choose to replace these mnemonics by a nominated symbol with an ASCII code in the + range 32 to 255. If you set a symbol value less than 32, all control characters are displayed + as mnemonics. The symbol you set is rendered in the font of the style set for the character. + You can read back the current symbol with the SCI_GETCONTROLCHARSYMBOL message. + The default symbol value is 0.

      + +

      SCI_SETCARETSTICKY(bool useCaretStickyBehaviour)
      + SCI_GETCARETSTICKY
      + SCI_TOGGLECARETSTICKY
      + These messages set, get or toggle the caretSticky flag which controls when the last position + of the caret on the line is saved. When set to true, the position is not saved when you type + a character, a tab, paste the clipboard content or press backspace.

      + +

      Margins

      + +

      There may be up to five margins to the left of the text display, plus a gap either side of + the text. Each margin can be set to display either symbols or line numbers with SCI_SETMARGINTYPEN. The markers + that can be displayed in each margin are set with SCI_SETMARGINMASKN. Any markers not associated with + a visible margin will be displayed as changes in background colour in the text. A width in + pixels can be set for each margin. Margins with a zero width are ignored completely. You can + choose if a mouse click in a margin sends a SCN_MARGINCLICK notification to the container or + selects a line of text.

      + +

      The margins are numbered 0 to 4. Using a margin number outside the valid range has no + effect. By default, margin 0 is set to display line numbers, but is given a width of 0, so it + is hidden. Margin 1 is set to display non-folding symbols and is given a width of 16 pixels, so + it is visible. Margin 2 is set to display the folding symbols, but is given a width of 0, so it + is hidden. Of course, you can set the margins to be whatever you wish.

      + SCI_SETMARGINTYPEN(int margin, int + type)
      + SCI_GETMARGINTYPEN(int margin)
      + SCI_SETMARGINWIDTHN(int margin, int + pixelWidth)
      + SCI_GETMARGINWIDTHN(int margin)
      + SCI_SETMARGINMASKN(int margin, int + mask)
      + SCI_GETMARGINMASKN(int margin)
      + SCI_SETMARGINSENSITIVEN(int margin, bool + sensitive)
      + SCI_GETMARGINSENSITIVEN(int + margin)
      + SCI_SETMARGINLEFT(<unused>, int + pixels)
      + SCI_GETMARGINLEFT
      + SCI_SETMARGINRIGHT(<unused>, int + pixels)
      + SCI_GETMARGINRIGHT
      + SCI_SETFOLDMARGINCOLOUR(bool useSetting, int colour)
      + SCI_SETFOLDMARGINHICOLOUR(bool useSetting, int colour)
      +
      + +

      SCI_SETMARGINTYPEN(int margin, int iType)
      + SCI_GETMARGINTYPEN(int margin)
      + These two routines set and get the type of a margin. The margin argument should be 0, 1, 2, 3 or 4. + You can use the predefined constants SC_MARGIN_SYMBOL (0) and + SC_MARGIN_NUMBER (1) to set a margin as either a line number or a symbol margin. + By convention, margin 0 is used for line numbers and the next two are used for symbols. You can + also use the constants SC_MARGIN_BACK (2) and SC_MARGIN_FORE (3) for + symbol margins that set their background colour to match the STYLE_DEFAULT background and + foreground colours.

      + +

      SCI_SETMARGINWIDTHN(int margin, int pixelWidth)
      + SCI_GETMARGINWIDTHN(int margin)
      + These routines set and get the width of a margin in pixels. A margin with zero width is + invisible. By default, Scintilla sets margin 1 for symbols with a width of 16 pixels, so this + is a reasonable guess if you are not sure what would be appropriate. Line number margins widths + should take into account the number of lines in the document and the line number style. You + could use something like SCI_TEXTWIDTH(STYLE_LINENUMBER, "_99999") to get a + suitable width.

      + +

      SCI_SETMARGINMASKN(int margin, int mask)
      + SCI_GETMARGINMASKN(int margin)
      + The mask is a 32-bit value. Each bit corresponds to one of 32 logical symbols that can be + displayed in a margin that is enabled for symbols. There is a useful constant, + SC_MASK_FOLDERS (0xFE000000 or -33554432), that is a mask for the 7 logical + symbols used to denote folding. You can assign a wide range of symbols and colours to each of + the 32 logical symbols, see Markers for more information. If (mask + & SC_MASK_FOLDERS)==0, the margin background colour is controlled by style 33 (STYLE_LINENUMBER).

      + +

      You add logical markers to a line with SCI_MARKERADD. If a line has an associated marker that + does not appear in the mask of any margin with a non-zero width, the marker changes the + background colour of the line. For example, suppose you decide to use logical marker 10 to mark + lines with a syntax error and you want to show such lines by changing the background colour. + The mask for this marker is 1 shifted left 10 times (1<<10) which is 0x400. If you make + sure that no symbol margin includes 0x400 in its mask, any line with the marker gets the + background colour changed.

      + +

      To set a non-folding margin 1 use SCI_SETMARGINMASKN(1, ~SC_MASK_FOLDERS); to + set a folding margin 2 use SCI_SETMARGINMASKN(2, SC_MASK_FOLDERS). This is the + default set by Scintilla. ~SC_MASK_FOLDERS is 0x1FFFFFF in hexadecimal or 33554431 + decimal. Of course, you may need to display all 32 symbols in a margin, in which case use + SCI_SETMARGINMASKN(margin, -1).

      + +

      SCI_SETMARGINSENSITIVEN(int margin, bool + sensitive)
      + SCI_GETMARGINSENSITIVEN(int margin)
      + Each of the five margins can be set sensitive or insensitive to mouse clicks. A click in a + sensitive margin sends a SCN_MARGINCLICK notification to the container. Margins that are not sensitive act as + selection margins which make it easy to select ranges of lines. By default, all margins are + insensitive.

      + +

      SCI_SETMARGINLEFT(<unused>, int pixels)
      + SCI_GETMARGINLEFT
      + SCI_SETMARGINRIGHT(<unused>, int pixels)
      + SCI_GETMARGINRIGHT
      + These messages set and get the width of the blank margin on both sides of the text in pixels. + The default is to one pixel on each side.

      + +

      SCI_SETFOLDMARGINCOLOUR(bool useSetting, int colour)
      + SCI_SETFOLDMARGINHICOLOUR(bool useSetting, int colour)
      + These messages allow changing the colour of the fold margin and fold margin highlight. + On Windows the fold margin colour defaults to ::GetSysColor(COLOR_3DFACE) and the fold margin highlight + colour to ::GetSysColor(COLOR_3DHIGHLIGHT).

      + +

      Other settings

      + SCI_SETUSEPALETTE(bool + allowPaletteUse)
      + SCI_GETUSEPALETTE
      + SCI_SETBUFFEREDDRAW(bool isBuffered)
      + SCI_GETBUFFEREDDRAW
      + SCI_SETTWOPHASEDRAW(bool twoPhase)
      + SCI_GETTWOPHASEDRAW
      + SCI_SETCODEPAGE(int codePage)
      + SCI_GETCODEPAGE
      + SCI_SETWORDCHARS(<unused>, const char + *chars)
      + SCI_SETWHITESPACECHARS(<unused>, const char + *chars)
      + SCI_SETCHARSDEFAULT
      + SCI_GRABFOCUS
      + SCI_SETFOCUS(bool focus)
      + SCI_GETFOCUS
      +
      + +

      SCI_SETUSEPALETTE(bool allowPaletteUse)
      + SCI_GETUSEPALETTE
      + On 8 bit displays, which can only display a maximum of 256 colours, the graphics environment + mediates between the colour needs of applications through the use of palettes. On GTK+, + Scintilla always uses a palette.

      + +

      On Windows, there are some problems with visual flashing when switching between applications + with palettes and it is also necessary for the application containing the Scintilla control to + forward some messages to Scintilla for its palette code to work. Because of this, by default, + the palette is not used and the application must tell Scintilla to use one. If Scintilla is not + using a palette, it will only display in those colours already available, which are often the + 20 Windows system colours.

      + +

      To see an example of how to enable palette support in Scintilla, search the text of SciTE + for WM_PALETTECHANGED, WM_QUERYNEWPALETTE and + SCI_SETUSEPALETTE. The Windows messages to forward are:
      + WM_SYSCOLORCHANGE, WM_PALETTECHANGED, + WM_QUERYNEWPALETTE (should return TRUE).

      + +

      To forward a message (WM_XXXX, WPARAM, LPARAM) to Scintilla, you can use + SendMessage(hScintilla, WM_XXXX, WPARAM, LPARAM) where hScintilla is + the handle to the Scintilla window you created as your editor.

      + +

      While we are on the subject of forwarding messages in Windows, the top level window should + forward any WM_SETTINGCHANGE messages to Scintilla (this is currently used to + collect changes to mouse settings, but could be used for other user interface items in the + future).

      + +

      SCI_SETBUFFEREDDRAW(bool isBuffered)
      + SCI_GETBUFFEREDDRAW
      + These messages turn buffered drawing on or off and report the buffered drawing state. Buffered + drawing draws each line into a bitmap rather than directly to the screen and then copies the + bitmap to the screen. This avoids flickering although it does take longer. The default is for + drawing to be buffered.

      + +

      SCI_SETTWOPHASEDRAW(bool twoPhase)
      + SCI_GETTWOPHASEDRAW
      + Two phase drawing is a better but slower way of drawing text. + In single phase drawing each run of characters in one style is drawn along with its background. + If a character overhangs the end of a run, such as in "V_" where the + "V" is in a different style from the "_", then this can cause the right hand + side of the "V" to be overdrawn by the background of the "_" which + cuts it off. Two phase drawing + fixes this by drawing all the backgrounds first and then drawing the text in + transparent mode. Two phase drawing may flicker more than single phase + unless buffered drawing is on. The default is for drawing to be two phase.

      + +

      SCI_SETCODEPAGE(int codePage)
      + SCI_GETCODEPAGE
      + Scintilla has some support for Japanese, Chinese and Korean DBCS. Use this message with + codePage set to the code page number to set Scintilla to use code page information + to ensure double byte characters are treated as one character rather than two. This also stops + the caret from moving between the two bytes in a double byte character. + Do not use this message to choose between different single byte character sets: it doesn't do that. + Call with + codePage set to zero to disable DBCS support. The default is + SCI_SETCODEPAGE(0).

      + +

      Code page SC_CP_UTF8 (65001) sets Scintilla into Unicode mode with the document + treated as a sequence of characters expressed in UTF-8. The text is converted to the platform's + normal Unicode encoding before being drawn by the OS and thus can display Hebrew, Arabic, + Cyrillic, and Han characters. Languages which can use two characters stacked vertically in one + horizontal space, such as Thai, will mostly work but there are some issues where the characters + are drawn separately leading to visual glitches. Bi-directional text is not supported. Characters outside the + Basic Multilingual Plane are unlikely to work.

      + +

      On Windows, code page can be set to 932 (Japanese Shift-JIS), 936 (Simplified Chinese GBK), + 949 (Korean Unified Hangul Code), 950 (Traditional Chinese Big5), or 1361 (Korean Johab) + although these may require installation of language specific support.

      + +

      On GTK+, code page SC_CP_DBCS (1) sets Scintilla into + multi byte character mode as is required for Japanese language processing with + the EUC encoding.

      + +

      For GTK+ 1.x, the locale should be set to a Unicode locale with a call similar to + setlocale(LC_CTYPE, "en_US.UTF-8"). Fonts with an "iso10646" registry + should be used in a font set. Font sets are a comma separated list of partial font + specifications where each partial font specification can be in the form: + foundry-fontface-charsetregistry-encoding or + fontface-charsetregistry-encoding or foundry-fontface or + fontface. An example is "misc-fixed-iso10646-1,*". + On GTK+ 2.x, Pango fonts should be used rather than font sets.

      + +

      Setting codePage to a non-zero value that is not SC_CP_UTF8 is + operating system dependent.

      + +

      SCI_SETWORDCHARS(<unused>, const char *chars)
      + Scintilla has several functions that operate on words, which are defined to be contiguous + sequences of characters from a particular set of characters. This message defines which + characters are members of that set. The character sets are set to default values before processing this + function. + For example, if you don't allow '_' in your set of characters + use:
      + SCI_SETWORDCHARS(0, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");

      + +

      SCI_SETWHITESPACECHARS(<unused>, const char *chars)
      + Similar to SCI_SETWORDCHARS, this message allows the user to define which chars Scintilla considers + as whitespace. Setting the whitespace chars allows the user to fine-tune Scintilla's behaviour doing + such things as moving the cursor to the start or end of a word; for example, by defining punctuation chars + as whitespace, they will be skipped over when the user presses ctrl+left or ctrl+right. + This function should be called after SCI_SETWORDCHARS as it will + reset the whitespace characters to the default set.

      +

      SCI_SETCHARSDEFAULT
      + Use the default sets of word and whitespace characters. This sets whitespace to space, tab and other + characters with codes less than 0x20, with word characters set to alphanumeric and '_'. +

      + + +

      SCI_GRABFOCUS
      + SCI_SETFOCUS(bool focus)
      + SCI_GETFOCUS
      + Scintilla can be told to grab the focus with this message. This is needed more on GTK+ where + focus handling is more complicated than on Windows.

      + +

      The internal focus flag can be set with SCI_SETFOCUS. This is used by clients + that have complex focus requirements such as having their own window that gets the real focus + but with the need to indicate that Scintilla has the logical focus.

      + +

      Brace highlighting

      + SCI_BRACEHIGHLIGHT(int pos1, int + pos2)
      + SCI_BRACEBADLIGHT(int pos1)
      + SCI_BRACEMATCH(int position, int + maxReStyle)
      +
      + +

      SCI_BRACEHIGHLIGHT(int pos1, int pos2)
      + Up to two characters can be highlighted in a 'brace highlighting style', which is defined as + style number STYLE_BRACELIGHT (34). + If you have enabled indent guides, you may also wish to highlight the indent that corresponds + with the brace. You can locate the column with SCI_GETCOLUMN and highlight the indent with SCI_SETHIGHLIGHTGUIDE.

      + +

      SCI_BRACEBADLIGHT(int pos1)
      + If there is no matching brace then the brace + badlighting style, style BRACE_BADLIGHT (35), can be used to show the brace + that is unmatched. Using a position of INVALID_POSITION (-1) removes the + highlight.

      + +

      SCI_BRACEMATCH(int pos, int maxReStyle)
      + The SCI_BRACEMATCH message finds a corresponding matching brace given + pos, the position of one brace. The brace characters handled are '(', ')', '[', + ']', '{', '}', '<', and '>'. The search is forwards from an opening brace and backwards + from a closing brace. If the character at position is not a brace character, or a matching + brace cannot be found, the return value is -1. Otherwise, the return value is the position of + the matching brace.

      + +

      A match only occurs if the style of the matching brace is the same as the starting brace or + the matching brace is beyond the end of styling. Nested braces are handled correctly. The + maxReStyle parameter must currently be 0 - it may be used in the future to limit + the length of brace searches.

      + +

      Tabs and Indentation Guides

      + +

      Indentation (the white space at the start of a line) is often used by programmers to clarify + program structure and in some languages, for example Python, it may be part of the language + syntax. Tabs are normally used in editors to insert a tab character or to pad text with spaces + up to the next tab.

      + +

      Scintilla can be set to treat tab and backspace in the white space at the start of a line in + a special way: inserting a tab indents the line to the next indent position rather than just + inserting a tab at the current character position and backspace unindents the line rather than + deleting a character. Scintilla can also display indentation guides (vertical lines) to help + you to generate code.

      + SCI_SETTABWIDTH(int widthInChars)
      + SCI_GETTABWIDTH
      + SCI_SETUSETABS(bool useTabs)
      + SCI_GETUSETABS
      + SCI_SETINDENT(int widthInChars)
      + SCI_GETINDENT
      + SCI_SETTABINDENTS(bool tabIndents)
      + SCI_GETTABINDENTS
      + SCI_SETBACKSPACEUNINDENTS(bool + bsUnIndents)
      + SCI_GETBACKSPACEUNINDENTS
      + SCI_SETLINEINDENTATION(int line, int + indentation)
      + SCI_GETLINEINDENTATION(int line)
      + SCI_GETLINEINDENTPOSITION(int + line)
      + SCI_SETINDENTATIONGUIDES(bool + view)
      + SCI_GETINDENTATIONGUIDES
      + SCI_SETHIGHLIGHTGUIDE(int column)
      + SCI_GETHIGHLIGHTGUIDE
      +
      + +

      SCI_SETTABWIDTH(int widthInChars)
      + SCI_GETTABWIDTH
      + SCI_SETTABWIDTH sets the size of a tab as a multiple of the size of a space + character in STYLE_DEFAULT. The default tab width is 8 characters. There are no + limits on tab sizes, but values less than 1 or large values may have undesirable effects.

      + +

      SCI_SETUSETABS(bool useTabs)
      + SCI_GETUSETABS
      + SCI_SETUSETABS determines whether indentation should be created out of a mixture + of tabs and spaces or be based purely on spaces. Set useTabs to false + (0) to create all tabs and indents out of spaces. The default is true. You can use + SCI_GETCOLUMN to get the column of a + position taking the width of a tab into account.

      + SCI_SETINDENT(int widthInChars)
      + SCI_GETINDENT
      + SCI_SETINDENT sets the size of indentation in terms of the width of a space in STYLE_DEFAULT. If you set a width of + 0, the indent size is the same as the tab size. There are no limits on indent sizes, but values + less than 0 or large values may have undesirable effects.
      +
      + + +

      SCI_SETTABINDENTS(bool tabIndents)
      + SCI_GETTABINDENTS
      + SCI_SETBACKSPACEUNINDENTS(bool bsUnIndents)
      + SCI_GETBACKSPACEUNINDENTS
      +

      + +

      Inside indentation white space, the tab and backspace keys can be made to indent and + unindent rather than insert a tab character or delete a character with the + SCI_SETTABINDENTS and SCI_SETBACKSPACEUNINDENTS functions.

      + +

      SCI_SETLINEINDENTATION(int line, int indentation)
      + SCI_GETLINEINDENTATION(int line)
      + The amount of indentation on a line can be discovered and set with + SCI_GETLINEINDENTATION and SCI_SETLINEINDENTATION. The indentation is + measured in character columns, which correspond to the width of space characters.

      + +

      SCI_GETLINEINDENTPOSITION(int line)
      + This returns the position at the end of indentation of a line.

      + +

      SCI_SETINDENTATIONGUIDES(bool view)
      + SCI_GETINDENTATIONGUIDES
      + Indentation guides are dotted vertical lines that appear within indentation white space every + indent size columns. They make it easy to see which constructs line up especially when they + extend over multiple pages. Style STYLE_INDENTGUIDE (37) is used to specify the + foreground and background colour of the indentation guides.

      + +

      SCI_SETHIGHLIGHTGUIDE(int column)
      + SCI_GETHIGHLIGHTGUIDE
      + When brace highlighting occurs, the indentation guide corresponding to the braces may be + highlighted with the brace highlighting style, STYLE_BRACELIGHT (34). Set column to 0 to + cancel this highlight.

      + +

      Markers

      + +

      There are 32 markers, numbered 0 to 31, and you can assign any combination of them to each + line in the document. Markers appear in the selection + margin to the left of the text. If the selection margin is set to zero width, the + background colour of the whole line is changed instead. Marker numbers 25 to 31 are used by + Scintilla in folding margins, and have symbolic names of the form SC_MARKNUM_*, + for example SC_MARKNUM_FOLDEROPEN.

      + +

      Marker numbers 0 to 24 have no pre-defined function; you can use them to mark syntax errors + or the current point of execution, break points, or whatever you need marking. If you do not + need folding, you can use all 32 for any purpose you wish.

      + +

      Each marker number has a symbol associated with it. You can also set the foreground and + background colour for each marker number, so you can use the same symbol more than once with + different colouring for different uses. Scintilla has a set of symbols you can assign + (SC_MARK_*) or you can use characters. By default, all 32 markers are set to + SC_MARK_CIRCLE with a black foreground and a white background.

      + +

      The markers are drawn in the order of their numbers, so higher numbered markers appear on + top of lower numbered ones. Markers try to move with their text by tracking where the start of + their line moves. When a line is deleted, its markers are combined, by an OR + operation, with the markers of the previous line.

      + SCI_MARKERDEFINE(int markerNumber, int + markerSymbols)
      + SCI_MARKERDEFINEPIXMAP(int markerNumber, + const char *xpm)
      + SCI_MARKERSETFORE(int markerNumber, int + colour)
      + SCI_MARKERSETBACK(int markerNumber, int + colour)
      + SCI_MARKERSETALPHA(int markerNumber, int + alpha)
      + SCI_MARKERADD(int line, int markerNumber)
      + SCI_MARKERADDSET(int line, int markerMask)
      + SCI_MARKERDELETE(int line, int + markerNumber)
      + SCI_MARKERDELETEALL(int markerNumber)
      + SCI_MARKERGET(int line)
      + SCI_MARKERNEXT(int lineStart, int + markerMask)
      + SCI_MARKERPREVIOUS(int lineStart, int + markerMask)
      + SCI_MARKERLINEFROMHANDLE(int + handle)
      + SCI_MARKERDELETEHANDLE(int handle)
      +
      + +

      SCI_MARKERDEFINE(int markerNumber, int markerSymbols)
      + This message associates a marker number in the range 0 to 31 with one of the marker symbols or + an ASCII character. The general-purpose marker symbols currently available are:
      + SC_MARK_CIRCLE, SC_MARK_ROUNDRECT, SC_MARK_ARROW, + SC_MARK_SMALLRECT, SC_MARK_SHORTARROW, SC_MARK_EMPTY, + SC_MARK_ARROWDOWN, SC_MARK_MINUS, SC_MARK_PLUS, + SC_MARK_ARROWS, SC_MARK_DOTDOTDOT, SC_MARK_EMPTY, + SC_MARK_BACKGROUND and SC_MARK_FULLRECT.

      + +

      The SC_MARK_BACKGROUND marker changes the background colour of the line only. + The SC_MARK_FULLRECT symbol mirrors this, changing only the margin background colour. + The SC_MARK_EMPTY symbol is invisible, allowing client code to track the movement + of lines. You would also use it if you changed the folding style and wanted one or more of the + SC_FOLDERNUM_* markers to have no associated symbol.

      + +

      There are also marker symbols designed for use in the folding margin in a flattened tree + style.
      + SC_MARK_BOXMINUS, SC_MARK_BOXMINUSCONNECTED, + SC_MARK_BOXPLUS, SC_MARK_BOXPLUSCONNECTED, + SC_MARK_CIRCLEMINUS, SC_MARK_CIRCLEMINUSCONNECTED, + SC_MARK_CIRCLEPLUS, SC_MARK_CIRCLEPLUSCONNECTED, + SC_MARK_LCORNER, SC_MARK_LCORNERCURVE, SC_MARK_TCORNER, + SC_MARK_TCORNERCURVE, and SC_MARK_VLINE.

      + Characters can be used as markers by adding the ASCII value of the character to + SC_MARK_CHARACTER (10000). For example, to use 'A' (ASCII code 65) as marker + number 1 use:
      + SCI_MARKERDEFINE(1, SC_MARK_CHARACTER+65).
      + +

      The marker numbers SC_MARKNUM_FOLDER and SC_MARKNUM_FOLDEROPEN are + used for showing that a fold is present and open or closed. Any symbols may be assigned for + this purpose although the (SC_MARK_PLUS, SC_MARK_MINUS) pair or the + (SC_MARK_ARROW, SC_MARK_ARROWDOWN) pair are good choices. As well as + these two, more assignments are needed for the flattened tree style: + SC_MARKNUM_FOLDEREND, SC_MARKNUM_FOLDERMIDTAIL, + SC_MARKNUM_FOLDEROPENMID, SC_MARKNUM_FOLDERSUB, and + SC_MARKNUM_FOLDERTAIL. The bits used for folding are specified by + SC_MASK_FOLDERS, which is commonly used as an argument to + SCI_SETMARGINMASKN when defining a margin to be used for folding.

      + +

      This table shows which SC_MARK_* symbols should be assigned to which + SC_MARKNUM_* marker numbers to obtain four folding styles: Arrow (mimics + Macintosh), plus/minus shows folded lines as '+' and opened folds as '-', Circle tree, Box + tree.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SC_MARKNUM_*ArrowPlus/minusCircle treeBox tree
      FOLDEROPENARROWDOWNMINUSCIRCLEMINUSBOXMINUS
      FOLDERARROWPLUSCIRCLEPLUSBOXPLUS
      FOLDERSUBEMPTYEMPTYVLINEVLINE
      FOLDERTAILEMPTYEMPTYLCORNERCURVELCORNER
      FOLDERENDEMPTYEMPTYCIRCLEPLUSCONNECTEDBOXPLUSCONNECTED
      FOLDEROPENMIDEMPTYEMPTYCIRCLEMINUSCONNECTEDBOXMINUSCONNECTED
      FOLDERMIDTAILEMPTYEMPTYTCORNERCURVETCORNER
      + +

      SCI_MARKERDEFINEPIXMAP(int markerNumber, const char + *xpm)
      + Markers can be set to pixmaps with this message. The XPM format is used for the pixmap and it + is limited to pixmaps that use one character per pixel. The data should be null terminated. + Pixmaps use the SC_MARK_PIXMAP marker symbol. You can find the full description of + the XPM format here.

      + +

      SCI_MARKERSETFORE(int markerNumber, int colour)
      + SCI_MARKERSETBACK(int markerNumber, int colour)
      + These two messages set the foreground and background colour of a marker number.

      +

      SCI_MARKERSETALPHA(int markerNumber, int alpha)
      + When markers are drawn in the content area, either because there is no margin for them or + they are of SC_MARK_BACKGROUND type, they may be drawn translucently by + setting an alpha value.

      + +

      SCI_MARKERADD(int line, int markerNumber)
      + This message adds marker number markerNumber to a line. The message returns -1 if + this fails (illegal line number, out of memory) or it returns a marker handle number that + identifies the added marker. You can use this returned handle with SCI_MARKERLINEFROMHANDLE to find where a + marker is after moving or combining lines and with SCI_MARKERDELETEHANDLE to delete the marker + based on its handle. The message does not check the value of markerNumber, nor does it + check if the line already contains the marker.

      + +

      SCI_MARKERADDSET(int line, int markerMask)
      + This message can add one or more markers to a line with a single call, specified in the same "one-bit-per-marker" 32-bit integer format returned by + SCI_MARKERGET + (and used by the mask-based marker search functions + SCI_MARKERNEXT and + SCI_MARKERPREVIOUS). + As with + SCI_MARKERADD, no check is made + to see if any of the markers are already present on the targeted line.

      + +

      SCI_MARKERDELETE(int line, int markerNumber)
      + This searches the given line number for the given marker number and deletes it if it is + present. If you added the same marker more than once to the line, this will delete one copy + each time it is used. If you pass in a marker number of -1, all markers are deleted from the + line.

      + +

      SCI_MARKERDELETEALL(int markerNumber)
      + This removes markers of the given number from all lines. If markerNumber is -1, it deletes all + markers from all lines.

      + +

      SCI_MARKERGET(int line)
      + This returns a 32-bit integer that indicates which markers were present on the line. Bit 0 is + set if marker 0 is present, bit 1 for marker 1 and so on.

      + +

      SCI_MARKERNEXT(int lineStart, int markerMask)
      + SCI_MARKERPREVIOUS(int lineStart, int markerMask)
      + These messages search efficiently for lines that include a given set of markers. The search + starts at line number lineStart and continues forwards to the end of the file + (SCI_MARKERNEXT) or backwards to the start of the file + (SCI_MARKERPREVIOUS). The markerMask argument should have one bit set + for each marker you wish to find. Set bit 0 to find marker 0, bit 1 for marker 1 and so on. The + message returns the line number of the first line that contains one of the markers in + markerMask or -1 if no marker is found.

      + +

      SCI_MARKERLINEFROMHANDLE(int markerHandle)
      + The markerHandle argument is an identifier for a marker returned by SCI_MARKERADD. This function searches + the document for the marker with this handle and returns the line number that contains it or -1 + if it is not found.

      + +

      SCI_MARKERDELETEHANDLE(int markerHandle)
      + The markerHandle argument is an identifier for a marker returned by SCI_MARKERADD. This function searches + the document for the marker with this handle and deletes the marker if it is found.

      + +

      Indicators

      + +

      By default, Scintilla organizes the style byte associated with each text byte as 5 bits of + style information (for 32 styles) and 3 bits of indicator information for 3 independent + indicators so that, for example, syntax errors, deprecated names and bad indentation could all + be displayed at once. Indicators may be displayed as simple underlines, squiggly underlines, a + line of small 'T' shapes, a line of diagonal hatching, a strike-out or a rectangle around the text.

      + +

      The indicators are set using SCI_STARTSTYLING with a INDICS_MASK mask + and SCI_SETSTYLING with the values + INDIC0_MASK, INDIC1_MASK and INDIC2_MASK.

      + +

      If you are using indicators in a buffer that has a lexer active + (see SCI_SETLEXER), + you must save lexing state information before setting any indicators and restore it afterwards. + Use SCI_GETENDSTYLED + to retrieve the current "styled to" position and + SCI_STARTSTYLING + to reset the styling position and mask (0x1f in the default layout of 5 style bits and 3 indicator bits) + when you are done.

      + +

      The number of bits used for styles can be altered with SCI_SETSTYLEBITS from 0 to 7 bits. The remaining bits + can be used for indicators, so there can be from 1 to 8 indicators. However, the + INDIC*_MASK constants defined in Scintilla.h all assume 5 bits of + styling information and 3 indicators. If you use a different arrangement, you must define your + own constants.

      + +

      The SCI_INDIC* messages allow you to get and set the visual appearance of the + indicators. They all use an indicatorNumber argument in the range 0 to 7 to set + the indicator to style. With the default settings, only indicators 0, 1 and 2 will have any + visible effect.

      + SCI_INDICSETSTYLE(int indicatorNumber, int + indicatorStyle)
      + SCI_INDICGETSTYLE(int indicatorNumber)
      + SCI_INDICSETFORE(int indicatorNumber, int + colour)
      + SCI_INDICGETFORE(int indicatorNumber)
      +
      + +

      SCI_INDICSETSTYLE(int indicatorNumber, int + indicatorStyle)
      + SCI_INDICGETSTYLE(int indicatorNumber)
      + These two messages set and get the style for a particular indicator. The indicator styles + currently available are:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SymbolValueVisual effect
      INDIC_PLAIN0Underlined with a single, straight line.
      INDIC_SQUIGGLE1A squiggly underline.
      INDIC_TT2A line of small T shapes.
      INDIC_DIAGONAL3Diagonal hatching.
      INDIC_STRIKE4Strike out.
      INDIC_HIDDEN5An indicator with no visual effect.
      INDIC_BOX6A rectangle around the text.
      INDIC_ROUNDBOX7A rectangle with rounded corners around the text using translucent drawing with the + interior more transparent than the border.
      + +

      The default indicator styles are equivalent to:
      + SCI_INDICSETSTYLE(0, INDIC_SQUIGGLE);
      + SCI_INDICSETSTYLE(1, INDIC_TT);
      + SCI_INDICSETSTYLE(2, INDIC_PLAIN);

      + +

      SCI_INDICSETFORE(int indicatorNumber, int colour)
      + SCI_INDICGETFORE(int indicatorNumber)
      + These two messages set and get the colour used to draw an indicator. The default indicator + colours are equivalent to:
      + SCI_INDICSETFORE(0, 0x007f00); (dark green)
      + SCI_INDICSETFORE(1, 0xff0000); (light blue)
      + SCI_INDICSETFORE(2, 0x0000ff); (light red)

      + +

      Autocompletion

      + +

      Autocompletion displays a list box showing likely identifiers based upon the user's typing. + The user chooses the currently selected item by pressing the tab character or another character + that is a member of the fillup character set defined with SCI_AUTOCSETFILLUPS. + Autocompletion is triggered by your application. For example, in C if you detect that the user + has just typed fred. you could look up fred, and if it has a known + list of members, you could offer them in an autocompletion list. Alternatively, you could + monitor the user's typing and offer a list of likely items once their typing has narrowed down + the choice to a reasonable list. As yet another alternative, you could define a key code to + activate the list.

      + +

      When the user makes a selection from the list the container is sent a SCN_AUTOCSELECTION notification message. On return from the notification Scintilla will insert + the selected text unless the autocompletion list has been cancelled, for example by the container sending + SCI_AUTOCCANCEL.

      + +

      To make use of autocompletion you must monitor each character added to the document. See + SciTEBase::CharAdded() in SciTEBase.cxx for an example of autocompletion.

      + SCI_AUTOCSHOW(int lenEntered, const char + *list)
      + SCI_AUTOCCANCEL
      + SCI_AUTOCACTIVE
      + SCI_AUTOCPOSSTART
      + SCI_AUTOCCOMPLETE
      + SCI_AUTOCSTOPS(<unused>, const char + *chars)
      + SCI_AUTOCSETSEPARATOR(char + separator)
      + SCI_AUTOCGETSEPARATOR
      + SCI_AUTOCSELECT(<unused>, const char + *select)
      + SCI_AUTOCGETCURRENT
      + SCI_AUTOCSETCANCELATSTART(bool + cancel)
      + SCI_AUTOCGETCANCELATSTART
      + SCI_AUTOCSETFILLUPS(<unused>, const char + *chars)
      + SCI_AUTOCSETCHOOSESINGLE(bool + chooseSingle)
      + SCI_AUTOCGETCHOOSESINGLE
      + SCI_AUTOCSETIGNORECASE(bool + ignoreCase)
      + SCI_AUTOCGETIGNORECASE
      + SCI_AUTOCSETAUTOHIDE(bool autoHide)
      + SCI_AUTOCGETAUTOHIDE
      + SCI_AUTOCSETDROPRESTOFWORD(bool + dropRestOfWord)
      + SCI_AUTOCGETDROPRESTOFWORD
      + SCI_REGISTERIMAGE
      + SCI_CLEARREGISTEREDIMAGES
      + SCI_AUTOCSETTYPESEPARATOR(char separatorCharacter)
      + SCI_AUTOCGETTYPESEPARATOR
      + SCI_AUTOCSETMAXHEIGHT(int rowCount)
      + SCI_AUTOCGETMAXHEIGHT
      + SCI_AUTOCSETMAXWIDTH(int characterCount)
      + SCI_AUTOCGETMAXWIDTH
      +
      + +

      SCI_AUTOCSHOW(int lenEntered, const char *list)
      + This message causes a list to be displayed. lenEntered is the number of + characters of the word already entered and list is the list of words separated by + separator characters. The initial separator character is a space but this can be set or got + with SCI_AUTOCSETSEPARATOR + and SCI_AUTOCGETSEPARATOR.

      + +

      The list of words should be in sorted order. If set to ignore case mode with SCI_AUTOCSETIGNORECASE, then + strings are matched after being converted to upper case. One result of this is that the list + should be sorted with the punctuation characters '[', '\', ']', '^', '_', and '`' sorted after + letters.

      + +

      SCI_AUTOCCANCEL
      + This message cancels any displayed autocompletion list. When in autocompletion mode, the list + should disappear when the user types a character that can not be part of the autocompletion, + such as '.', '(' or '[' when typing an identifier. A set of characters that will cancel + autocompletion can be specified with SCI_AUTOCSTOPS.

      + +

      SCI_AUTOCACTIVE
      + This message returns non-zero if there is an active autocompletion list and zero if there is + not.

      + +

      SCI_AUTOCPOSSTART
      + This returns the value of the current position when SCI_AUTOCSHOW started display + of the list.

      + +

      SCI_AUTOCCOMPLETE
      + This message triggers autocompletion. This has the same effect as the tab key.

      + +

      SCI_AUTOCSTOPS(<unused>, const char *chars)
      + The chars argument is a string containing a list of characters that will + automatically cancel the autocompletion list. When you start the editor, this list is + empty.

      + +

      SCI_AUTOCSETSEPARATOR(char separator)
      + SCI_AUTOCGETSEPARATOR
      + These two messages set and get the separator character used to separate words in the + SCI_AUTOCSHOW list. The default is the space character.

      + +

      SCI_AUTOCSELECT(<unused>, const char *select)
      + SCI_AUTOCGETCURRENT
      + This message selects an item in the autocompletion list. It searches the list of words for the + first that matches select. By default, comparisons are case sensitive, but you can + change this with SCI_AUTOCSETIGNORECASE. The match is character + by character for the length of the select string. That is, if select is "Fred" it + will match "Frederick" if this is the first item in the list that begins with "Fred". If an + item is found, it is selected. If the item is not found, the autocompletion list closes if + auto-hide is true (see SCI_AUTOCSETAUTOHIDE).
      + The current selection can be retrieved with SCI_AUTOCGETCURRENT +

      + +

      SCI_AUTOCSETCANCELATSTART(bool cancel)
      + SCI_AUTOCGETCANCELATSTART
      + The default behavior is for the list to be cancelled if the caret moves before the location it + was at when the list was displayed. By calling this message with a false argument, + the list is not cancelled until the caret moves before the first character of the word being + completed.

      + +

      SCI_AUTOCSETFILLUPS(<unused>, const char *chars)
      + If a fillup character is typed with an autocompletion list active, the currently selected item + in the list is added into the document, then the fillup character is added. Common fillup + characters are '(', '[' and '.' but others are possible depending on the language. By default, + no fillup characters are set.

      + +

      SCI_AUTOCSETCHOOSESINGLE(bool chooseSingle)
      + SCI_AUTOCGETCHOOSESINGLE
      + If you use SCI_AUTOCSETCHOOSESINGLE(1) and a list has only one item, it is + automatically added and no list is displayed. The default is to display the list even if there + is only a single item.

      + +

      SCI_AUTOCSETIGNORECASE(bool ignoreCase)
      + SCI_AUTOCGETIGNORECASE
      + By default, matching of characters to list members is case sensitive. These messages let you + set and get case sensitivity.

      + +

      SCI_AUTOCSETAUTOHIDE(bool autoHide)
      + SCI_AUTOCGETAUTOHIDE
      + By default, the list is cancelled if there are no viable matches (the user has typed + characters that no longer match a list entry). If you want to keep displaying the original + list, set autoHide to false. This also effects SCI_AUTOCSELECT.

      + +

      SCI_AUTOCSETDROPRESTOFWORD(bool dropRestOfWord)
      + SCI_AUTOCGETDROPRESTOFWORD
      + When an item is selected, any word characters following the caret are first erased if + dropRestOfWord is set true. The default is false.

      + +

      + SCI_REGISTERIMAGE(int type, const char *xpmData)
      + SCI_CLEARREGISTEREDIMAGES
      + SCI_AUTOCSETTYPESEPARATOR(char separatorCharacter)
      + SCI_AUTOCGETTYPESEPARATOR
      + + Autocompletion list items may display an image as well as text. Each image is first registered with an integer + type. Then this integer is included in the text of the list separated by a '?' from the text. For example, + "fclose?2 fopen" displays image 2 before the string "fclose" and no image before "fopen". + The images are in XPM format as is described for + SCI_MARKERDEFINEPIXMAP + The set of registered images can be cleared with SCI_CLEARREGISTEREDIMAGES and the '?' separator changed + with SCI_AUTOCSETTYPESEPARATOR. +

      + +

      + SCI_AUTOCSETMAXHEIGHT(int rowCount)
      + SCI_AUTOCGETMAXHEIGHT
      + + Get or set the maximum number of rows that will be visible in an autocompletion list. If there are more rows in the list, then a vertical + scrollbar is shown. The default is 5. +

      + +

      + SCI_AUTOCSETMAXWIDTH(int characterCount)
      + SCI_AUTOCGETMAXWIDTH
      + + Get or set the maximum width of an autocompletion list expressed as the number of characters in the longest item that will be totally visible. + If zero (the default) then the list's width is calculated to fit the item with the most characters. Any items that cannot be fully displayed within + the available width are indicated by the presence of ellipsis. +

      + +

      User lists

      + +

      User lists use the same internal mechanisms as autocompletion lists, and all the calls + listed for autocompletion work on them; you cannot display a user list at the same time as an + autocompletion list is active. They differ in the following respects:

      + +

      o The SCI_AUTOCSETCHOOSESINGLE message has no + effect.
      + o When the user makes a selection you are sent a SCN_USERLISTSELECTION notification message rather than SCN_AUTOCSELECTION.

      + +

      BEWARE: if you have set fillup characters or stop characters, these will still be active + with the user list, and may result in items being selected or the user list cancelled due to + the user typing into the editor.

      + +

      SCI_USERLISTSHOW(int listType, const char *list)
      + The listType parameter is returned to the container as the wParam + field of the SCNotification + structure. It must be greater than 0 as this is how Scintilla tells the difference between an + autocompletion list and a user list. If you have different types of list, for example a list of + buffers and a list of macros, you can use listType to tell which one has returned + a selection.

      + +

      Call tips

      + +

      Call tips are small windows displaying the arguments to a function and are displayed after + the user has typed the name of the function. They normally display characters using the font + facename, size and character set defined by + STYLE_DEFAULT. You can choose to + use STYLE_CALLTIP to define the + facename, size, foreground and background colours and character set with + SCI_CALLTIPUSESTYLE. + This also enables support for Tab characters. + + There is some interaction between call tips and autocompletion lists in that showing a + call tip cancels any active autocompletion list, and vice versa.

      + +

      Call tips can highlight part of the text within them. You could use this to highlight the + current argument to a function by counting the number of commas (or whatever separator your + language uses). See SciTEBase::CharAdded() in SciTEBase.cxx for an + example of call tip use.

      + +

      The mouse may be clicked on call tips and this causes a + SCN_CALLTIPCLICK + notification to be sent to the container. Small up an down arrows may be displayed within + a call tip by, respectively, including the characters '\001', or '\002'. This is useful + for showing that there are overloaded variants of one function name and that the user can + click on the arrows to cycle through the overloads.

      + +

      Alternatively, call tips can be displayed when you leave the mouse pointer for a while over + a word in response to the SCN_DWELLSTART notification and cancelled in response to SCN_DWELLEND. This method could be used in a debugger to give + the value of a variable, or during editing to give information about the word under the + pointer.

      + SCI_CALLTIPSHOW(int posStart, const char + *definition)
      + SCI_CALLTIPCANCEL
      + SCI_CALLTIPACTIVE
      + SCI_CALLTIPPOSSTART
      + SCI_CALLTIPSETHLT(int highlightStart, int + highlightEnd)
      + SCI_CALLTIPSETBACK(int colour)
      + SCI_CALLTIPSETFORE(int colour)
      + SCI_CALLTIPSETFOREHLT(int colour)
      + SCI_CALLTIPUSESTYLE(int tabsize)
      +
      + +

      SCI_CALLTIPSHOW(int posStart, const char *definition)
      + This message starts the process by displaying the call tip window. If a call tip is already + active, this has no effect.
      + posStart is the position in the document at which to align the call tip. The call + tip text is aligned to start 1 line below this character unless you have included up and/or + down arrows in the call tip text in which case the tip is aligned to the right-hand edge of + the rightmost arrow. The assumption is that you will start the text with something like + "\001 1 of 3 \002".
      + definition is the call tip text. This can contain multiple lines separated by + '\n' (Line Feed, ASCII code 10) characters. Do not include '\r' (Carriage Return, ASCII + code 13), as this will most likely print as an empty box. '\t' (Tab, ASCII code 9) is + supported if you set a tabsize with + SCI_CALLTIPUSESTYLE.

      + +

      SCI_CALLTIPCANCEL
      + This message cancels any displayed call tip. Scintilla will also cancel call tips for you if + you use any keyboard commands that are not compatible with editing the argument list of a + function.

      + +

      SCI_CALLTIPACTIVE
      + This returns 1 if a call tip is active and 0 if it is not active.

      + +

      SCI_CALLTIPPOSSTART
      + This message returns the value of the current position when SCI_CALLTIPSHOW + started to display the tip.

      + +

      SCI_CALLTIPSETHLT(int hlStart, int hlEnd)
      + This sets the region of the call tips text to display in a highlighted style. + hlStart is the zero-based index into the string of the first character to + highlight and hlEnd is the index of the first character after the highlight. + hlEnd must be greater than hlStart; hlEnd-hlStart is the + number of characters to highlight. Highlights can extend over line ends if this is + required.

      + +

      Unhighlighted text is drawn in a mid gray. Selected text is drawn in a dark blue. The + background is white. These can be changed with + SCI_CALLTIPSETBACK, + SCI_CALLTIPSETFORE, and + SCI_CALLTIPSETFOREHLT. +

      + +

      SCI_CALLTIPSETBACK(int colour)
      + The background colour of call tips can be set with this message; the default colour is white. + It is not a good idea to set a dark colour as the background as the default colour for normal + calltip text is mid gray and the defaultcolour for highlighted text is dark blue. This also + sets the background colour of STYLE_CALLTIP.

      + +

      SCI_CALLTIPSETFORE(int colour)
      + The colour of call tip text can be set with this message; the default colour is mid gray. + This also sets the foreground colour of STYLE_CALLTIP.

      + +

      SCI_CALLTIPSETFOREHLT(int colour)
      + The colour of highlighted call tip text can be set with this message; the default colour + is dark blue.

      + +

      SCI_CALLTIPUSESTYLE(int tabsize)
      + This message changes the style used for call tips from STYLE_DEFAULT to + STYLE_CALLTIP and sets a tab size in screen pixels. If tabsize is + less than 1, Tab characters are not treated specially. Once this call has been used, the + call tip foreground and background colours are also taken from the style.

      + + +

      Keyboard commands

      + +

      To allow the container application to perform any of the actions available to the user with + keyboard, all the keyboard actions are messages. They do not take any parameters. These + commands are also used when redefining the key bindings with the SCI_ASSIGNCMDKEY message.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SCI_LINEDOWNSCI_LINEDOWNEXTENDSCI_LINEDOWNRECTEXTENDSCI_LINESCROLLDOWN
      SCI_LINEUPSCI_LINEUPEXTENDSCI_LINEUPRECTEXTENDSCI_LINESCROLLUP
      SCI_PARADOWNSCI_PARADOWNEXTENDSCI_PARAUPSCI_PARAUPEXTEND
      SCI_CHARLEFTSCI_CHARLEFTEXTENDSCI_CHARLEFTRECTEXTEND
      SCI_CHARRIGHTSCI_CHARRIGHTEXTENDSCI_CHARRIGHTRECTEXTEND
      SCI_WORDLEFTSCI_WORDLEFTEXTENDSCI_WORDRIGHTSCI_WORDRIGHTEXTEND
      SCI_WORDLEFTENDSCI_WORDLEFTENDEXTENDSCI_WORDRIGHTENDSCI_WORDRIGHTENDEXTEND
      SCI_WORDPARTLEFTSCI_WORDPARTLEFTEXTENDSCI_WORDPARTRIGHTSCI_WORDPARTRIGHTEXTEND
      SCI_HOMESCI_HOMEEXTEND[SCI_HOMERECTEXTEND]
      SCI_HOMEDISPLAYSCI_HOMEDISPLAYEXTENDSCI_HOMEWRAPSCI_HOMEWRAPEXTEND
      SCI_VCHOMESCI_VCHOMEEXTENDSCI_VCHOMERECTEXTEND
      SCI_VCHOMEWRAPSCI_VCHOMEWRAPEXTEND
      SCI_LINEENDSCI_LINEENDEXTENDSCI_LINEENDRECTEXTEND
      SCI_LINEENDDISPLAYSCI_LINEENDDISPLAYEXTENDSCI_LINEENDWRAPSCI_LINEENDWRAPEXTEND
      SCI_DOCUMENTSTARTSCI_DOCUMENTSTARTEXTENDSCI_DOCUMENTENDSCI_DOCUMENTENDEXTEND
      SCI_PAGEUPSCI_PAGEUPEXTENDSCI_PAGEUPRECTEXTEND
      SCI_PAGEDOWNSCI_PAGEDOWNEXTENDSCI_PAGEDOWNRECTEXTEND
      SCI_STUTTEREDPAGEUPSCI_STUTTEREDPAGEUPEXTEND
      SCI_STUTTEREDPAGEDOWNSCI_STUTTEREDPAGEDOWNEXTEND
      SCI_DELETEBACKSCI_DELETEBACKNOTLINESCI_DELWORDLEFTSCI_DELWORDRIGHT
      SCI_DELLINELEFTSCI_DELLINERIGHTSCI_LINEDELETE
      SCI_LINECUTSCI_LINECOPYSCI_LINETRANSPOSESCI_LINEDUPLICATE
      SCI_LOWERCASESCI_UPPERCASESCI_CANCELSCI_EDITTOGGLEOVERTYPE
      SCI_NEWLINESCI_FORMFEEDSCI_TABSCI_BACKTAB
      SCI_SELECTIONDUPLICATE
      + +

      The SCI_*EXTEND messages extend the selection.

      + +

      The SCI_*RECTEXTEND messages extend the rectangular selection + (and convert regular selection to rectangular one, if any).

      + +

      The SCI_WORDPART* commands are used to move between word segments marked by + capitalisation (aCamelCaseIdentifier) or underscores (an_under_bar_ident).

      + +

      The SCI_HOME* commands move the caret to the start of the line, while the + SCI_VCHOME*commands move the caret to the first non-blank character of the line + (ie. just after the indentation) unless it is already there; in this case, it acts as SCI_HOME*.

      + +

      The SCI_[HOME|LINEEND]DISPLAY* commands are used when in line wrap mode to + allow movement to the start or end of display lines as opposed to the normal + SCI_[HOME|LINEEND] commands which move to the start or end of document lines.

      + +

      The SCI_[[VC]HOME|LINEEND]WRAP* commands are like their namesakes + SCI_[[VC]HOME|LINEEND]* except they behave differently when word-wrap is enabled: + They go first to the start / end of the display line, like SCI_[HOME|LINEEND]DISPLAY*, + but if the cursor is already at the point, it goes on to the start or end of the document line, + as appropriate for SCI_[[VC]HOME|LINEEND]*. +

      + +

      Key bindings

      + +

      There is a default binding of keys to commands that is defined in the Scintilla source in + the file KeyMap.cxx by the constant KeyMap::MapDefault[]. This table + maps key definitions to SCI_* messages with no parameters (mostly the keyboard commands discussed above, but any Scintilla + command that has no arguments can be mapped). You can change the mapping to suit your own + requirements.

      + SCI_ASSIGNCMDKEY(int keyDefinition, int + sciCommand)
      + SCI_CLEARCMDKEY(int keyDefinition)
      + SCI_CLEARALLCMDKEYS
      + SCI_NULL
      +
      + +

      keyDefinition
      + A key definition contains the key code in the low 16-bits and the key modifiers in the high + 16-bits. To combine keyCode and keyMod set:
      +
      + keyDefinition = keyCode + (keyMod << 16)

      + +

      The key code is a visible or control character or a key from the SCK_* + enumeration, which contains:
      + SCK_ADD, SCK_BACK, SCK_DELETE, SCK_DIVIDE, + SCK_DOWN, SCK_END, SCK_ESCAPE, SCK_HOME, + SCK_INSERT, SCK_LEFT, SCK_MENU, SCK_NEXT (Page Down), + SCK_PRIOR (Page Up), SCK_RETURN, SCK_RIGHT, + SCK_RWIN, + SCK_SUBTRACT, SCK_TAB, SCK_UP, and + SCK_WIN.

      + +

      The modifiers are a combination of zero or more of SCMOD_ALT, + SCMOD_CTRL, and SCMOD_SHIFT. If you are building a table, you might + want to use SCMOD_NORM, which has the value 0, to mean no modifiers.

      + +

      SCI_ASSIGNCMDKEY(int keyDefinition, int sciCommand)
      + This assigns the given key definition to a Scintilla command identified by + sciCommand. sciCommand can be any SCI_* command that has + no arguments.

      + +

      SCI_CLEARCMDKEY(int keyDefinition)
      + This makes the given key definition do nothing by assigning the action SCI_NULL + to it.

      + +

      SCI_CLEARALLCMDKEYS
      + This command removes all keyboard command mapping by setting an empty mapping table.

      + +

      SCI_NULL
      + The SCI_NULL does nothing and is the value assigned to keys that perform no + action. SCI_NULL ensures that keys do not propagate to the parent window as that may + cause focus to move. If you want the standard platform behaviour use the constant 0 instead.

      + +

      Popup edit menu

      + +

      SCI_USEPOPUP(bool bEnablePopup)
      + Clicking the wrong button on the mouse pops up a short default editing menu. This may be + turned off with SCI_USEPOPUP(0). If you turn it off, context menu commands (in + Windows, WM_CONTEXTMENU) will not be handled by Scintilla, so the parent of the + Scintilla window will have the opportunity to handle the message.

      + +

      Macro recording

      + +

      Start and stop macro recording mode. In macro recording mode, actions are reported to the + container through SCN_MACRORECORD + notifications. It is then up to the container to + record these actions for future replay.

      + +

      SCI_STARTRECORD
      + SCI_STOPRECORD
      + These two messages turn macro recording on and off.

      + +

      Printing

      + +

      On Windows SCI_FORMATRANGE can be used to draw the text onto a display context + which can include a printer display context. Printed output shows text styling as on the + screen, but it hides all margins except a line number margin. All special marker effects are + removed and the selection and caret are hidden.

      + SCI_FORMATRANGE(bool bDraw, RangeToFormat + *pfr)
      + SCI_SETPRINTMAGNIFICATION(int + magnification)
      + SCI_GETPRINTMAGNIFICATION
      + SCI_SETPRINTCOLOURMODE(int mode)
      + SCI_GETPRINTCOLOURMODE
      + SCI_SETPRINTWRAPMODE
      + SCI_GETPRINTWRAPMODE
      +
      + +

      SCI_FORMATRANGE(bool bDraw, RangeToFormat *pfr)
      + This call allows Windows users to render a range of text into a device context. If you use + this for printing, you will probably want to arrange a page header and footer; Scintilla does + not do this for you. See SciTEWin::Print() in SciTEWinDlg.cxx for an + example. Each use of this message renders a range of text into a rectangular area and returns + the position in the document of the next character to print.

      + +

      bDraw controls if any output is done. Set this to false if you are paginating + (for example, if you use this with MFC you will need to paginate in + OnBeginPrinting() before you output each page.

      +
      +struct RangeToFormat {
      +    SurfaceID hdc;        // The HDC (device context) we print to
      +    SurfaceID hdcTarget;  // The HDC we use for measuring (may be same as hdc)
      +    PRectangle rc;        // Rectangle in which to print
      +    PRectangle rcPage;    // Physically printable page size
      +    CharacterRange chrg;  // Range of characters to print
      +};
      +
      + +

      hdc and hdcTarget should both be set to the device context handle + of the output device (usually a printer). If you print to a metafile these will not be the same + as Windows metafiles (unlike extended metafiles) do not implement the full API for returning + information. In this case, set hdcTarget to the screen DC.
      + rcPage is the rectangle {0, 0, maxX, maxY} where maxX+1 + and maxY+1 are the number of physically printable pixels in x and y.
      + rc is the rectangle to render the text in (which will, of course, fit within the + rectangle defined by rcPage).
      + chrg.cpMin and chrg.cpMax define the start position and maximum + position of characters to output. All of each line within this character range is drawn.

      + +

      When printing, the most tedious part is always working out what the margins should be to + allow for the non-printable area of the paper and printing a header and footer. If you look at + the printing code in SciTE, you will find that most of it is taken up with this. The loop that + causes Scintilla to render text is quite simple if you strip out all the margin, non-printable + area, header and footer code.

      + +

      SCI_SETPRINTMAGNIFICATION(int magnification)
      + SCI_GETPRINTMAGNIFICATION
      + SCI_GETPRINTMAGNIFICATION lets you to print at a different size than the screen + font. magnification is the number of points to add to the size of each screen + font. A value of -3 or -4 gives reasonably small print. You can get this value with + SCI_GETPRINTMAGNIFICATION.

      + +

      SCI_SETPRINTCOLOURMODE(int mode)
      + SCI_GETPRINTCOLOURMODE
      + These two messages set and get the method used to render coloured text on a printer that is + probably using white paper. It is especially important to consider the treatment of colour if + you use a dark or black screen background. Printing white on black uses up toner and ink very + many times faster than the other way around. You can set the mode to one of:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SymbolValuePurpose
      SC_PRINT_NORMAL0Print using the current screen colours. This is the default.
      SC_PRINT_INVERTLIGHT1If you use a dark screen background this saves ink by inverting the light value of + all colours and printing on a white background.
      SC_PRINT_BLACKONWHITE2Print all text as black on a white background.
      SC_PRINT_COLOURONWHITE3Everything prints in its own colour on a white background.
      SC_PRINT_COLOURONWHITEDEFAULTBG4Everything prints in its own colour on a white background except that line numbers + use their own background colour.
      + +

      SCI_SETPRINTWRAPMODE(int wrapMode)
      + SCI_GETPRINTWRAPMODE
      + These two functions get and set the printer wrap mode. wrapMode can be + set to SC_WRAP_NONE (0), SC_WRAP_WORD (1) or + SC_WRAP_CHAR (2). The default is + SC_WRAP_WORD, which wraps printed output so that all characters fit + into the print rectangle. If you set SC_WRAP_NONE, each line of text + generates one line of output and the line is truncated if it is too long to fit + into the print area.
      + SC_WRAP_WORD tries to wrap only between words as indicated by + white space or style changes although if a word is longer than a line, it will be wrapped before + the line end. SC_WRAP_CHAR is preferred to + SC_WRAP_WORD for Asian languages where there is no white space + between words.

      + +

      Direct access

      + SCI_GETDIRECTFUNCTION
      + SCI_GETDIRECTPOINTER
      +
      + +

      On Windows, the message-passing scheme used to communicate between the container and + Scintilla is mediated by the operating system SendMessage function and can lead to + bad performance when calling intensively. To avoid this overhead, Scintilla provides messages + that allow you to call the Scintilla message function directly. The code to do this in C/C++ is + of the form:

      +
      +#include "Scintilla.h"
      +SciFnDirect pSciMsg = (SciFnDirect)SendMessage(hSciWnd, SCI_GETDIRECTFUNCTION, 0, 0);
      +sptr_t pSciWndData = (sptr_t)SendMessage(hSciWnd, SCI_GETDIRECTPOINTER, 0, 0);
      +
      +// now a wrapper to call Scintilla directly
      +sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
      +    return pSciMsg(pSciWndData, iMessage, wParam, lParam);
      +}
      +
      + +

      SciFnDirect, sptr_t and uptr_t are declared in + Scintilla.h. hSciWnd is the window handle returned when you created + the Scintilla window.

      + +

      While faster, this direct calling will cause problems if performed from a different thread + to the native thread of the Scintilla window in which case SendMessage(hSciWnd, SCI_*, + wParam, lParam) should be used to synchronize with the window's thread.

      + +

      This feature also works on GTK+ but has no significant impact on speed.

      + +

      From version 1.47 on Windows, Scintilla exports a function called + Scintilla_DirectFunction that can be used the same as the function returned by + SCI_GETDIRECTFUNCTION. This saves you the call to + SCI_GETDIRECTFUNCTION and the need to call Scintilla indirectly via the function + pointer.

      + +

      SCI_GETDIRECTFUNCTION
      + This message returns the address of the function to call to handle Scintilla messages without + the overhead of passing through the Windows messaging system. You need only call this once, + regardless of the number of Scintilla windows you create.

      + +

      SCI_GETDIRECTPOINTER
      + This returns a pointer to data that identifies which Scintilla window is in use. You must call + this once for each Scintilla window you create. When you call the direct function, you must + pass in the direct pointer associated with the target window.

      + +

      Multiple views

      + +

      A Scintilla window and the document that it displays are separate entities. When you create + a new window, you also create a new, empty document. Each document has a reference count that + is initially set to 1. The document also has a list of the Scintilla windows that are linked to + it so when any window changes the document, all other windows in which it appears are notified + to cause them to update. The system is arranged in this way so that you can work with many + documents in a single Scintilla window and so you can display a single document in multiple + windows (for use with splitter windows).

      + +

      Although these messages use document *pDoc, to ensure compatibility with future + releases of Scintilla you should treat pDoc as an opaque void*. That + is, you can use and store the pointer as described in this section but you should not + dereference it.

      + SCI_GETDOCPOINTER
      + SCI_SETDOCPOINTER(<unused>, document + *pDoc)
      + SCI_CREATEDOCUMENT
      + SCI_ADDREFDOCUMENT(<unused>, document + *pDoc)
      + SCI_RELEASEDOCUMENT(<unused>, document + *pDoc)
      +
      + +

      SCI_GETDOCPOINTER
      + This returns a pointer to the document currently in use by the window. It has no other + effect.

      + +

      SCI_SETDOCPOINTER(<unused>, document *pDoc)
      + This message does the following:
      + 1. It removes the current window from the list held by the current document.
      + 2. It reduces the reference count of the current document by 1.
      + 3. If the reference count reaches 0, the document is deleted.
      + 4. pDoc is set as the new document for the window.
      + 5. If pDoc was 0, a new, empty document is created and attached to the + window.
      + 6. If pDoc was not 0, its reference count is increased by 1.

      + +

      SCI_CREATEDOCUMENT
      + This message creates a new, empty document and returns a pointer to it. This document is not + selected into the editor and starts with a reference count of 1. This means that you have + ownership of it and must either reduce its reference count by 1 after using + SCI_SETDOCPOINTER so that the Scintilla window owns it or you must make sure that + you reduce the reference count by 1 with SCI_RELEASEDOCUMENT before you close the + application to avoid memory leaks.

      + +

      SCI_ADDREFDOCUMENT(<unused>, document *pDoc)
      + This increases the reference count of a document by 1. If you want to replace the current + document in the Scintilla window and take ownership of the current document, for example if you + are editing many documents in one window, do the following:
      + 1. Use SCI_GETDOCPOINTER to get a pointer to the document, + pDoc.
      + 2. Use SCI_ADDREFDOCUMENT(0, pDoc) to increment the reference count.
      + 3. Use SCI_SETDOCPOINTER(0, pNewDoc) to set a different document or + SCI_SETDOCPOINTER(0, 0) to set a new, empty document.

      + +

      SCI_RELEASEDOCUMENT(<unused>, document *pDoc)
      + This message reduces the reference count of the document identified by pDoc. pDoc + must be the result of SCI_GETDOCPOINTER or SCI_CREATEDOCUMENT and + must point at a document that still exists. If you call this on a document with a reference + count of 1 that is still attached to a Scintilla window, bad things will happen. To keep the + world spinning in its orbit you must balance each call to SCI_CREATEDOCUMENT or + SCI_ADDREFDOCUMENT with a call to SCI_RELEASEDOCUMENT.

      + +

      Folding

      + +

      The fundamental operation in folding is making lines invisible or visible. Line visibility + is a property of the view rather than the document so each view may be displaying a different + set of lines. From the point of view of the user, lines are hidden and displayed using fold + points. Generally, the fold points of a document are based on the hierarchical structure of the + document contents. In Python, the hierarchy is determined by indentation and in C++ by brace + characters. This hierarchy can be represented within a Scintilla document object by attaching a + numeric "fold level" to each line. The fold level is most easily set by a lexer, but you can + also set it with messages.

      + +

      It is up to your code to set the connection between user actions and folding and unfolding. + The best way to see how this is done is to search the SciTE source code for the messages used + in this section of the documentation and see how they are used. You will also need to use + markers and a folding margin to complete your folding implementation. + The "fold" property should be set to "1" with + SCI_SETPROPERTY("fold", "1") to enable folding.

      + SCI_VISIBLEFROMDOCLINE(int + docLine)
      + SCI_DOCLINEFROMVISIBLE(int + displayLine)
      + SCI_SHOWLINES(int lineStart, int lineEnd)
      + SCI_HIDELINES(int lineStart, int lineEnd)
      + SCI_GETLINEVISIBLE(int line)
      + SCI_SETFOLDLEVEL(int line, int level)
      + SCI_GETFOLDLEVEL(int line)
      + SCI_SETFOLDFLAGS(int flags)
      + SCI_GETLASTCHILD(int line, int level)
      + SCI_GETFOLDPARENT(int line)
      + SCI_SETFOLDEXPANDED(int line, bool + expanded)
      + SCI_GETFOLDEXPANDED(int line)
      + SCI_TOGGLEFOLD(int line)
      + SCI_ENSUREVISIBLE(int line)
      + SCI_ENSUREVISIBLEENFORCEPOLICY(int + line)
      +
      + +

      SCI_VISIBLEFROMDOCLINE(int docLine)
      + When some lines are folded, then a particular line in the document may be displayed at a + different position to its document position. If no lines are folded, this message returns + docLine. Otherwise, this returns the display line (counting the very first visible + line as 0). The display line of an invisible line is the same as the previous visible line. The + display line number of the first line in the document is 0. If there is folding and + docLine is outside the range of lines in the document, the return value is -1. + Lines can occupy more than one display line if they wrap.

      + +

      SCI_DOCLINEFROMVISIBLE(int displayLine)
      + When some lines are hidden, then a particular line in the document may be displayed at a + different position to its document position. This message returns the document line number that + corresponds to a display line (counting the display line of the first line in the document as + 0). If displayLine is less than or equal to 0, the result is 0. If + displayLine is greater than or equal to the number of displayed lines, the result + is the number of lines in the document.

      + +

      SCI_SHOWLINES(int lineStart, int lineEnd)
      + SCI_HIDELINES(int lineStart, int lineEnd)
      + SCI_GETLINEVISIBLE(int line)
      + The first two messages mark a range of lines as visible or invisible and then redraw the + display. The third message reports on the visible state of a line and returns 1 if it is + visible and 0 if it is not visible. These messages have no effect on fold levels or fold + flags.

      + +

      SCI_SETFOLDLEVEL(int line, int level)
      + SCI_GETFOLDLEVEL(int line)
      + These two messages set and get a 32-bit value that contains the fold level of a line and some + flags associated with folding. The fold level is a number in the range 0 to + SC_FOLDLEVELNUMBERMASK (4095). However, the initial fold level is set to + SC_FOLDLEVELBASE (1024) to allow unsigned arithmetic on folding levels. There are + two addition flag bits. SC_FOLDLEVELWHITEFLAG indicates that the line is blank and + allows it to be treated slightly different then its level may indicate. For example, blank + lines should generally not be fold points and will be considered part of the preceding section even though + they may have a lesser fold level. + SC_FOLDLEVELHEADERFLAG indicates that + the line is a header (fold point).

      + +

      Use SCI_GETFOLDLEVEL(line) & SC_FOLDLEVELNUMBERMASK to get the fold level + of a line. Likewise, use SCI_GETFOLDLEVEL(line) & SC_FOLDLEVEL*FLAG to get the + state of the flags. To set the fold level you must or in the associated flags. For instance, to + set the level to thisLevel and mark a line as being a fold point use: + SCI_SETFOLDLEVEL(line, thisLevel | SC_FOLDLEVELHEADERFLAG).

      + If you use a lexer, you should not need to use SCI_SETFOLDLEVEL as this is far + better handled by the lexer. You will need to use SCI_GETFOLDLEVEL to decide how + to handle user folding requests. If you do change the fold levels, the folding margin will + update to match your changes. + +

      SCI_SETFOLDFLAGS(int flags)
      + In addition to showing markers in the folding margin, you can indicate folds to the user by + drawing lines in the text area. The lines are drawn in the foreground colour set for STYLE_DEFAULT. Bits set in + flags determine where folding lines are drawn:
      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ValueEffect
      1Experimental - draw boxes if expanded
      2Draw above if expanded
      4Draw above if not expanded
      8Draw below if expanded
      16Draw below if not expanded
      64display hexadecimal fold levels in line margin to aid debugging of + folding. This feature needs to be redesigned to be sensible.
      + +

      This message causes the display to redraw.

      + +

      SCI_GETLASTCHILD(int startLine, int level)
      + This message searches for the next line after startLine, that has a folding level + that is less than or equal to level and then returns the previous line number. If + you set level to -1, level is set to the folding level of line + startLine. If from is a fold point, SCI_GETLASTCHILD(from, + -1) returns the last line that would be in made visible or hidden by toggling the fold + state.

      + +

      SCI_GETFOLDPARENT(int startLine)
      + This message returns the line number of the first line before startLine that is + marked as a fold point with SC_FOLDLEVELHEADERFLAG and has a fold level less than + the startLine. If no line is found, or if the header flags and fold levels are + inconsistent, the return value is -1.

      + +

      SCI_TOGGLEFOLD(int line)
      + Each fold point may be either expanded, displaying all its child lines, or contracted, hiding + all the child lines. This message toggles the folding state of the given line as long as it has + the SC_FOLDLEVELHEADERFLAG set. This message takes care of folding or expanding + all the lines that depend on the line. The display updates after this message.

      + +

      SCI_SETFOLDEXPANDED(int line, bool expanded)
      + SCI_GETFOLDEXPANDED(int line)
      + These messages set and get the expanded state of a single line. The set message has no effect + on the visible state of the line or any lines that depend on it. It does change the markers in + the folding margin. If you ask for the expansion state of a line that is outside the document, + the result is false (0).

      + +

      If you just want to toggle the fold state of one line and handle all the lines that are + dependent on it, it is much easier to use SCI_TOGGLEFOLD. You would use the + SCI_SETFOLDEXPANDED message to process many folds without updating the display + until you had finished. See SciTEBase::FoldAll() and + SciTEBase::Expand() for examples of the use of these messages.

      + +

      SCI_ENSUREVISIBLE(int line)
      + SCI_ENSUREVISIBLEENFORCEPOLICY(int line)
      + A line may be hidden because more than one of its parent lines is contracted. Both these + message travels up the fold hierarchy, expanding any contracted folds until they reach the top + level. The line will then be visible. If you use SCI_ENSUREVISIBLEENFORCEPOLICY, + the vertical caret policy set by SCI_SETVISIBLEPOLICY is then applied.

      + +

      Line wrapping

      + + SCI_SETWRAPMODE(int wrapMode)
      + SCI_GETWRAPMODE
      + SCI_SETWRAPVISUALFLAGS(int wrapVisualFlags)
      + SCI_GETWRAPVISUALFLAGS
      + SCI_SETWRAPSTARTINDENT(int indent)
      + SCI_GETWRAPSTARTINDENT
      + SCI_SETLAYOUTCACHE(int cacheMode)
      + SCI_GETLAYOUTCACHE
      + SCI_LINESSPLIT(int pixelWidth)
      + SCI_LINESJOIN
      + SCI_WRAPCOUNT(int docLine)
      +
      + +

      By default, Scintilla does not wrap lines of text. If you enable line wrapping, lines wider + than the window width are continued on the following lines. Lines are broken after space or tab + characters or between runs of different styles. If this is not possible because a word in one + style is wider than the window then the break occurs after the last character that completely + fits on the line. The horizontal scroll bar does not appear when wrap mode is on.

      + +

      For wrapped lines Scintilla can draw visual flags (little arrows) at end of a a subline of a + wrapped line and at begin of the next subline. These can be enabled individually, but if Scintilla + draws the visual flag at begin of the next subline this subline will be indented by one char. + Independent from drawing a visual flag at the begin the subline can have an indention.

      + +

      Much of the time used by Scintilla is spent on laying out and drawing text. The same text + layout calculations may be performed many times even when the data used in these calculations + does not change. To avoid these unnecessary calculations in some circumstances, the line layout + cache can store the results of the calculations. The cache is invalidated whenever the + underlying data, such as the contents or styling of the document changes. Caching the layout of + the whole document has the most effect, making dynamic line wrap as much as 20 times faster but + this requires 7 times the memory required by the document contents plus around 80 bytes per + line.

      + +

      Wrapping is not performed immediately there is a change but is delayed until the display + is redrawn. This delay improves peformance by allowing a set of changes to be performed + and then wrapped and displayed once. Because of this, some operations may not occur as + expected. If a file is read and the scroll position moved to a particular line in the text, + such as occurs when a container tries to restore a previous editing session, then + the scroll position will have been determined before wrapping so an unexpected range + of text will be displayed. To scroll to the position correctly, delay the scroll until the + wrapping has been performed by waiting for an initial + SCN_PAINTED notification.

      + +

      SCI_SETWRAPMODE(int wrapMode)
      + SCI_GETWRAPMODE
      + Set wrapMode to SC_WRAP_WORD (1) to enable wrapping + on word boundaries, SC_WRAP_CHAR (2) to enable wrapping + between any characters, and to SC_WRAP_NONE (0) to disable line + wrapping. SC_WRAP_CHAR is preferred to + SC_WRAP_WORD for Asian languages where there is no white space + between words.

      + + +

      SCI_SETWRAPVISUALFLAGS(int wrapVisualFlags)
      + SCI_GETWRAPVISUALFLAGS
      + You can enable the drawing of visual flags to indicate a line is wrapped. Bits set in + wrapVisualFlags determine which visual flags are drawn. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SymbolValueEffect
      SC_WRAPVISUALFLAG_NONE0No visual flags
      SC_WRAPVISUALFLAG_END1Visual flag at end of subline of a wrapped line.
      SC_WRAPVISUALFLAG_START2Visual flag at begin of subline of a wrapped line.
      + Subline is indented by at least 1 to make room for the flag.
      +
      + +

      SCI_SETWRAPVISUALFLAGSLOCATION(int wrapVisualFlagsLocation)
      + SCI_GETWRAPVISUALFLAGSLOCATION
      + You can set wether the visual flags to indicate a line is wrapped are drawn near the border or near the text. + Bits set in wrapVisualFlagsLocation set the location to near the text for the corresponding visual flag. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SymbolValueEffect
      SC_WRAPVISUALFLAGLOC_DEFAULT0Visual flags drawn near border
      SC_WRAPVISUALFLAGLOC_END_BY_TEXT1Visual flag at end of subline drawn near text
      SC_WRAPVISUALFLAGLOC_START_BY_TEXT2Visual flag at begin of subline drawn near text
      + +
      + +

      SCI_SETWRAPSTARTINDENT(int indent)
      + SCI_GETWRAPSTARTINDENT
      + SCI_SETWRAPSTARTINDENT sets the size of indentation of sublines for + wrapped lines in terms of the width of a space in + STYLE_DEFAULT. + There are no limits on indent sizes, but values less than 0 or large values may have + undesirable effects.
      + The indention of sublines is independent of visual flags, but if + SC_WRAPVISUALFLAG_START is set an indent of at least 1 is used. +

      + +

      SCI_SETLAYOUTCACHE(int cacheMode)
      + SCI_GETLAYOUTCACHE
      + You can set cacheMode to one of the symbols in the table:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SymbolValueLayout cached for these lines
      SC_CACHE_NONE0No lines are cached.
      SC_CACHE_CARET1The line containing the text caret. This is the default.
      SC_CACHE_PAGE2Visible lines plus the line containing the caret.
      SC_CACHE_DOCUMENT3All lines in the document.
      +
      + +

      SCI_LINESSPLIT(int pixelWidth)
      + Split a range of lines indicated by the target into lines that are at most pixelWidth wide. + Splitting occurs on word boundaries wherever possible in a similar manner to line wrapping. + When pixelWidth is 0 then the width of the window is used. +

      + +

      SCI_LINESJOIN
      + Join a range of lines indicated by the target into one line by + removing line end characters. + Where this would lead to no space between words, an extra space is inserted. +

      + +

      SCI_WRAPCOUNT(int docLine)
      + Document lines can occupy more than one display line if they wrap and this + returns the number of display lines needed to wrap a document line.

      + +

      Zooming

      + +

      Scintilla incorporates a "zoom factor" that lets you make all the text in the document + larger or smaller in steps of one point. The displayed point size never goes below 2, whatever + zoom factor you set. You can set zoom factors in the range -10 to +20 points.

      + SCI_ZOOMIN
      + SCI_ZOOMOUT
      + SCI_SETZOOM(int zoomInPoints)
      + SCI_GETZOOM
      +
      + +

      SCI_ZOOMIN
      + SCI_ZOOMOUT
      + SCI_ZOOMIN increases the zoom factor by one point if the current zoom factor is + less than 20 points. SCI_ZOOMOUT decreases the zoom factor by one point if the + current zoom factor is greater than -10 points.

      + +

      SCI_SETZOOM(int zoomInPoints)
      + SCI_GETZOOM
      + These messages let you set and get the zoom factor directly. There is no limit set on the + factors you can set, so limiting yourself to -10 to +20 to match the incremental zoom functions + is a good idea.

      + +

      Long lines

      + +

      You can choose to mark lines that exceed a given length by drawing a vertical line or by + colouring the background of characters that exceed the set length.

      + SCI_SETEDGEMODE(int mode)
      + SCI_GETEDGEMODE
      + SCI_SETEDGECOLUMN(int column)
      + SCI_GETEDGECOLUMN
      + SCI_SETEDGECOLOUR(int colour)
      + SCI_GETEDGECOLOUR
      +
      + +

      SCI_SETEDGEMODE(int edgeMode)
      + SCI_GETEDGEMODE
      + These two messages set and get the mode used to display long lines. You can set one of the + values in the table:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SymbolValueLong line display mode
      EDGE_NONE0Long lines are not marked. This is the default state.
      EDGE_LINE1A vertical line is drawn at the column number set by SCI_SETEDGECOLUMN. + This works well for monospaced fonts. The line is drawn at a position based on the width + of a space character in STYLE_DEFAULT, so it may not work very well if + your styles use proportional fonts or if your style have varied font sizes or you use a + mixture of bold, italic and normal text. .
      EDGE_BACKGROUND2The background colour of characters after the column limit is changed to the colour + set by SCI_SETEDGECOLOUR. This is recommended for proportional fonts.
      +
      +
      + + +

      SCI_SETEDGECOLUMN(int column)
      + SCI_GETEDGECOLUMN
      + These messages set and get the column number at which to display the long line marker. When + drawing lines, the column sets a position in units of the width of a space character in + STYLE_DEFAULT. When setting the background colour, the column is a character count + (allowing for tabs) into the line.

      + +

      SCI_SETEDGECOLOUR(int colour)
      + SCI_GETEDGECOLOUR
      + These messages set and get the colour of the marker used to show that a line has exceeded the + length set by SCI_SETEDGECOLUMN.

      + +

      Lexer

      + +

      If you define the symbol SCI_LEXER when building Scintilla, (this is sometimes + called the SciLexer version of Scintilla), lexing support for a wide range programming + languages is included and the messages in this section are supported. If you want to set + styling and fold points for an unsupported language you can either do this in the container or + better still, write your own lexer following the pattern of one of the existing ones.

      + +

      Scintilla also supports external lexers. These are DLLs (on Windows) or .so modules (on GTK+/Linux) that export four + functions: GetLexerCount, GetLexerName, Lex and + Fold. See externalLexer.cxx for more.

      + SCI_SETLEXER(int lexer)
      + SCI_GETLEXER
      + SCI_SETLEXERLANGUAGE(<unused>, char + *name)
      + SCI_LOADLEXERLIBRARY(<unused>, char + *path)
      + SCI_COLOURISE(int start, int end)
      + SCI_SETPROPERTY(const char *key, const char *value)
      + SCI_GETPROPERTY(const char *key, char *value)
      + SCI_GETPROPERTYEXPANDED(const char *key, char *value)
      + SCI_GETPROPERTYINT(const char *key, int default)
      + SCI_SETKEYWORDS(int keyWordSet, const char + *keyWordList)
      + SCI_GETSTYLEBITSNEEDED +
      +
      + +

      SCI_SETLEXER(int lexer)
      + SCI_GETLEXER
      + You can select the lexer to use with an integer code from the SCLEX_* enumeration + in Scintilla.h. There are two codes in this sequence that do not use lexers: + SCLEX_NULL to select no lexing action and SCLEX_CONTAINER which sends + the SCN_STYLENEEDED notification to + the container whenever a range of text needs to be styled. You cannot use the + SCLEX_AUTOMATIC value; this identifies additional external lexers that Scintilla + assigns unused lexer numbers to.

      + +

      SCI_SETLEXERLANGUAGE(<unused>, const char *name)
      + This message lets you select a lexer by name, and is the only method if you are using an + external lexer or if you have written a lexer module for a language of your own and do not wish + to assign it an explicit lexer number. To select an existing lexer, set name to + match the (case sensitive) name given to the module, for example "ada" or "python", not "Ada" + or "Python". To locate the name for the built-in lexers, open the relevant + Lex*.cxx file and search for LexerModule. The third argument in the + LexerModule constructor is the name to use.

      + +

      To test if your lexer assignment worked, use SCI_GETLEXER before and after setting the new lexer to + see if the lexer number changed.

      + +

      SCI_LOADLEXERLIBRARY(<unused>, const char *path)
      + Load a lexer implemented in a shared library. This is a .so file on GTK+/Linux or a .DLL file on Windows. +

      + +

      SCI_COLOURISE(int startPos, int endPos)
      + 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.

      + +

      SCI_SETPROPERTY(const char *key, const char *value)
      + You can communicate settings to lexers with keyword:value string pairs. There is no limit to + the number of keyword pairs you can set, other than available memory. key is a + case sensitive keyword, value is a string that is associated with the keyword. If + there is already a value string associated with the keyword, it is replaced. If you pass a zero + length string, the message does nothing. Both key and value are used + without modification; extra spaces at the beginning or end of key are + significant.

      + +

      The value string can refer to other keywords. For example, + SCI_SETPROPERTY("foldTimes10", "$(fold)0") stores the string + "$(fold)0", but when this is accessed, the $(fold) is replaced by the + value of the "fold" keyword (or by nothing if this keyword does not exist).

      + +

      Currently the "fold" property is defined for most of the lexers to set the fold structure if + set to "1". SCLEX_PYTHON understands "tab.timmy.whinge.level" as a + setting that determines how to indicate bad indentation. Most keywords have values that are + interpreted as integers. Search the lexer sources for GetPropertyInt to see how + properties are used.

      + +

      SCI_GETPROPERTY(const char *key, char *value)
      + Lookup a keyword:value pair using the specified key; if found, copy the value to the user-supplied + buffer and return the length (not including the terminating 0). If not found, copy an empty string + to the buffer and return 0.

      + +

      Note that "keyword replacement" as described in + SCI_SETPROPERTY will not be performed.

      + +

      If the value argument is 0 then the length that should be allocated to store the value is returned; + again, the terminating 0 is not included.

      + +

      SCI_GETPROPERTYEXPANDED(const char *key, char *value)
      + Lookup a keyword:value pair using the specified key; if found, copy the value to the user-supplied + buffer and return the length (not including the terminating 0). If not found, copy an empty string + to the buffer and return 0.

      + +

      Note that "keyword replacement" as described in + SCI_SETPROPERTY will be performed.

      + +

      If the value argument is 0 then the length that should be allocated to store the value (including any indicated keyword replacement) + is returned; again, the terminating 0 is not included.

      + +

      SCI_GETPROPERTYINT(const char *key, int default)
      + Lookup a keyword:value pair using the specified key; if found, interpret the value as an integer and return it. + If not found (or the value is an empty string) then return the supplied default. If the keyword:value pair is found but is not + a number, then return 0.

      + +

      Note that "keyword replacement" as described in + SCI_SETPROPERTY will be performed before any numeric interpretation.

      + +

      SCI_SETKEYWORDS(int keyWordSet, const char *keyWordList)
      + You can set up to 9 lists of keywords for use by the current lexer. This was increased from 6 + at revision 1.50. keyWordSet can be 0 to 8 (actually 0 to KEYWORDSET_MAX) + and selects which keyword list to replace. keyWordList is a list of keywords + separated by spaces, tabs, "\n" or "\r" or any combination of these. + It is expected that the keywords will be composed of standard ASCII printing characters, + but there is nothing to stop you using any non-separator character codes from 1 to 255 + (except common sense).

      + +

      How these keywords are used is entirely up to the lexer. Some languages, such as HTML may + contain embedded languages, VBScript and JavaScript are common for HTML. For HTML, key word set + 0 is for HTML, 1 is for JavaScript and 2 is for VBScript, 3 is for Python, 4 is for PHP and 5 + is for SGML and DTD keywords. Review the lexer code to see examples of keyword list. A fully + conforming lexer sets the fourth argument of the LexerModule constructor to be a + list of strings that describe the uses of the keyword lists.

      + +

      Alternatively, you might use set 0 for general keywords, set 1 for keywords that cause + indentation and set 2 for keywords that cause unindentation. Yet again, you might have a simple + lexer that colours keywords and you could change languages by changing the keywords in set 0. + There is nothing to stop you building your own keyword lists into the lexer, but this means + that the lexer must be rebuilt if more keywords are added.

      + +

      SCI_GETSTYLEBITSNEEDED
      + Retrieve the number of bits the current lexer needs for styling. This should normally be the argument + to SCI_SETSTYLEBITS. +

      + +

      Notifications

      + +

      Notifications are sent (fired) from the Scintilla control to its container when an event has + occurred that may interest the container. Notifications are sent using the + WM_NOTIFY message on Windows and the "notify" signal on GTK+. The container is + passed a SCNotification structure containing information about the event.

      +
      +struct NotifyHeader {   // This matches the Win32 NMHDR structure
      +    void *hwndFrom;     // environment specific window handle/pointer
      +    uptr_t idFrom;	// CtrlID of the window issuing the notification
      +    unsigned int code;  // The SCN_* notification code
      +};
      +
      +struct SCNotification {
      +    struct NotifyHeader nmhdr;
      +    int position;
      +    // SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_DWELLSTART,
      +    // SCN_DWELLEND, SCN_CALLTIPCLICK,
      +    // SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK
      +    int ch;             // SCN_CHARADDED, SCN_KEY
      +    int modifiers;      // SCN_KEY, SCN_DOUBLECLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK
      +    int modificationType; // SCN_MODIFIED
      +    const char *text;   // SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION
      +    int length;         // SCN_MODIFIED
      +    int linesAdded;     // SCN_MODIFIED
      +    int message;        // SCN_MACRORECORD
      +    uptr_t wParam;      // SCN_MACRORECORD
      +    sptr_t lParam;      // SCN_MACRORECORD
      +    int line;           // SCN_MODIFIED, SCN_DOUBLECLICK
      +    int foldLevelNow;   // SCN_MODIFIED
      +    int foldLevelPrev;  // SCN_MODIFIED
      +    int margin;         // SCN_MARGINCLICK
      +    int listType;       // SCN_USERLISTSELECTION, SCN_AUTOCSELECTION
      +    int x;              // SCN_DWELLSTART, SCN_DWELLEND
      +    int y;              // SCN_DWELLSTART, SCN_DWELLEND
      +};
      +
      + +

      The notification messages that your container can choose to handle and the messages + associated with them are:

      + SCN_STYLENEEDED
      + SCN_CHARADDED
      + SCN_SAVEPOINTREACHED
      + SCN_SAVEPOINTLEFT
      + SCN_MODIFYATTEMPTRO
      + SCN_KEY
      + SCN_DOUBLECLICK
      + SCN_UPDATEUI
      + SCN_MODIFIED
      + SCN_MACRORECORD
      + SCN_MARGINCLICK
      + SCN_NEEDSHOWN
      + SCN_PAINTED
      + SCN_USERLISTSELECTION
      + SCN_URIDROPPED
      + SCN_DWELLSTART
      + SCN_DWELLEND
      + SCN_ZOOM
      + SCN_HOTSPOTCLICK
      + SCN_HOTSPOTDOUBLECLICK
      + SCN_CALLTIPCLICK
      + SCN_AUTOCSELECTION
      +
      + +

      The following SCI_* messages are associated with these notifications:

      + SCI_SETMODEVENTMASK(int + eventMask)
      + SCI_GETMODEVENTMASK
      + SCI_SETMOUSEDWELLTIME
      + SCI_GETMOUSEDWELLTIME
      +
      + +

      The following additional notifications are sent using the WM_COMMAND message on + Windows and the "Command" signal on GTK+. This emulates the Windows Edit control. Only the lower + 16 bits of the control's ID is passed in these notifications.

      + SCEN_CHANGE
      + SCEN_SETFOCUS
      + SCEN_KILLFOCUS
      +
      + +

      SCN_STYLENEEDED
      + If you used SCI_SETLEXER(SCLEX_CONTAINER) to make the container act as the + lexer, you will receive this notification when Scintilla is about to display or print text that + requires styling. You are required to style the text from the line that contains the position + returned by SCI_GETENDSTYLED up to + the position passed in SCNotification.position. Symbolically, you need code of the + form:

      +
      +    startPos = SCI_GETENDSTYLED()
      +    lineNumber = SCI_LINEFROMPOSITION(startPos);
      +    startPos = SCI_POSITIONFROMLINE(lineNumber);
      +    MyStyleRoutine(startPos, SCNotification.position);
      +
      + +

      SCN_CHARADDED
      + This is sent when the user types an ordinary text character (as opposed to a command + character) that is entered into the text. The container can use this to decide to display a call tip or an auto + completion list. The character is in SCNotification.ch. + This notification is sent before the character has been styled so processing that depends on + styling should instead be performed in the SCN_UPDATEUI notification.

      + +

      SCN_SAVEPOINTREACHED
      + SCN_SAVEPOINTLEFT
      + Sent to the container when the save point is entered or left, allowing the container to + display a "document dirty" indicator and change its menus.
      + See also: SCI_SETSAVEPOINT, SCI_GETMODIFY

      + +

      SCN_MODIFYATTEMPTRO
      + When in read-only mode, this notification is sent to the container if the user tries to change + the text. This can be used to check the document out of a version control system. You can set + the read-only state of a document with SCI_SETREADONLY.

      + +

      SCN_KEY
      + Reports all keys pressed but not consumed by Scintilla. Used on GTK+ because of + some problems with keyboard focus and is not sent by the Windows version. SCNotification.ch holds the key code and + SCNotification.modifiers holds the modifiers. This notification is sent if the + modifiers include SCMOD_ALT or SCMOD_CTRL and the key code is less + than 256.

      + +

      SCN_DOUBLECLICK
      + The mouse button was double clicked in editor. The position field is set to the text position of the + double click and the line field is set to the line of the double click.

      + +

      SCN_UPDATEUI
      + Either the text or styling of the document has changed or the selection range has changed. Now + would be a good time to update any container UI elements that depend on document or view state. + This was previously called SCN_CHECKBRACE because a common use is to check whether the + caret is next to a brace and set highlights on this brace and its corresponding matching brace. + This also replaces SCN_POSCHANGED, + which is now deprecated.

      + +

      SCN_MODIFIED
      + This notification is sent when the text or styling of the document changes or is about to + change. You can set a mask for the notifications that are sent to the container with SCI_SETMODEVENTMASK. The + notification structure contains information about what changed, how the change occurred and + whether this changed the number of lines in the document. No modifications may be performed + while in a SCN_MODIFIED event. The SCNotification fields used + are:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      FieldUsage
      modificationTypeA set of flags that identify the change(s) made. See the next + table.
      positionStart position of a text or styling change. Set to 0 if not used.
      lengthLength of the change in cells or characters when the text or styling + changes. Set to 0 if not used.
      linesAddedNumber of added lines. If negative, the number of deleted lines. Set to + 0 if not used or no lines added or deleted.
      textValid for text changes, not for style changes. If we are collecting undo + information this holds a pointer to the text that is handed to the Undo system, otherwise + it is zero. For user performed SC_MOD_BEFOREDELETE the text field is 0 and + for user performed SC_MOD_BEFOREINSERT the text field points to an array of cells, + not bytes and the length is the number of cells.
      lineThe line number at which a fold level or marker change occurred. This is + 0 if unused and may be -1 if more than one line changed.
      foldLevelNowThe new fold level applied to the line or 0 if this field is + unused.
      foldLevelPrevThe previous folding level of the line or 0 if this field is + unused.
      + +

      The SCNotification.modificationType field has bits set to tell you what has + been done. The SC_MOD_* bits correspond to actions. The + SC_PERFORMED_* bits tell you if the action was done by the user, or the result of + Undo or Redo of a previous action.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SymbolValueMeaningSCNotification fields
      SC_MOD_INSERTTEXT0x01Text has been inserted into the document.position, length, text, linesAdded
      SC_MOD_DELETETEXT0x02Text has been removed from the document.position, length, text, linesAdded
      SC_MOD_CHANGESTYLE0x04A style change has occurred.position, length
      SC_MOD_CHANGEFOLD0x08A folding change has occurred.line, foldLevelNow, foldLevelPrev
      SC_PERFORMED_USER0x10Information: the operation was done by the user.None
      SC_PERFORMED_UNDO0x20Information: this was the result of an Undo.None
      SC_PERFORMED_REDO0x40Information: this was the result of a Redo.None
      SC_MULTISTEPUNDOREDO0x80This is part of a multi-step Undo or Redo transaction.None
      SC_LASTSTEPINUNDOREDO0x100This is the final step in an Undo or Redo transaction.None
      SC_MOD_CHANGEMARKER0x200One or more markers has changed in a line.line
      SC_MOD_BEFOREINSERT0x400Text is about to be inserted into the document.position, if performed by user then text in cells, length in cells
      SC_MOD_BEFOREDELETE0x800Text is about to be deleted from the document.position, length
      SC_MULTILINEUNDOREDO0x1000This is part of an Undo or Redo with multi-line changes.None
      SC_STARTACTION0x2000This is set on a SC_PERFORMED_USER action when it is the + first or only step in an undo transaction. This can be used to integrate the Scintilla + undo stack with an undo stack in the container application by adding a Scintilla + action to the container's stack for the currently opened container transaction or + to open a new container transaction if there is no open container transaction. + None
      SC_MODEVENTMASKALL0x1fffThis is a mask for all valid flags. This is the default mask state set by SCI_SETMODEVENTMASK.None
      + +

      SCEN_CHANGE
      + SCEN_CHANGE (768) is fired when the text (not the style) of the document changes. + This notification is sent using the WM_COMMAND message on Windows and the + "Command" signal on GTK+ as this is the behavior of the standard Edit control + (SCEN_CHANGE has the same value as the Windows Edit control + EN_CHANGE). No other information is sent. If you need more detailed information + use SCN_MODIFIED. You can filter the + types of changes you are notified about with SCI_SETMODEVENTMASK.

      + +

      SCI_SETMODEVENTMASK(int eventMask)
      + SCI_GETMODEVENTMASK
      + These messages set and get an event mask that determines which document change events are + notified to the container with SCN_MODIFIED and SCEN_CHANGE. For example, a container may decide to see + only notifications about changes to text and not styling changes by calling + SCI_SETMODEVENTMASK(SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT).

      + +

      The possible notification types are the same as the modificationType bit flags + used by SCN_MODIFIED: SC_MOD_INSERTTEXT, + SC_MOD_DELETETEXT, SC_MOD_CHANGESTYLE, + SC_MOD_CHANGEFOLD, SC_PERFORMED_USER, SC_PERFORMED_UNDO, + SC_PERFORMED_REDO, SC_MULTISTEPUNDOREDO, + SC_LASTSTEPINUNDOREDO, SC_MOD_CHANGEMARKER, + SC_MOD_BEFOREINSERT, SC_MOD_BEFOREDELETE, + SC_MULTILINEUNDOREDO, and SC_MODEVENTMASKALL.

      + +

      SCEN_SETFOCUS
      + SCEN_KILLFOCUS
      + SCEN_SETFOCUS (512) is fired when Scintilla receives focus and + SCEN_KILLFOCUS (256) when it loses focus. These notifications are sent using the + WM_COMMAND message on Windows and the "Command" signal on GTK+ as this is the + behavior of the standard Edit control. Unfortunately, these codes do not match the Windows Edit + notification codes EN_SETFOCUS (256) and EN_KILLFOCUS (512). It is + now too late to change the Scintilla codes as clients depend on the current values.

      + +

      SCN_MACRORECORD
      + The SCI_STARTRECORD and SCI_STOPRECORD messages enable and + disable macro recording. When enabled, each time a recordable change occurs, the + SCN_MACRORECORD notification is sent to the container. It is up to the container + to record the action. To see the complete list of SCI_* messages that are + recordable, search the Scintilla source Editor.cxx for + Editor::NotifyMacroRecord. The fields of SCNotification set in this + notification are:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      FieldUsage
      messageThe SCI_* message that caused the notification.
      wParamThe value of wParam in the SCI_* message.
      lParamThe value of lParam in the SCI_* message.
      + +

      SCN_MARGINCLICK
      + This notification tells the container that the mouse was clicked inside a margin that was marked as sensitive (see SCI_SETMARGINSENSITIVEN). This can be used to + perform folding or to place breakpoints. The following SCNotification fields are + used:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      FieldUsage
      modifiersThe appropriate combination of SCI_SHIFT, + SCI_CTRL and SCI_ALT to indicate the keys that were held down + at the time of the margin click.
      positionThe position of the start of the line in the document that corresponds + to the margin click.
      marginThe margin number that was clicked.
      + +

      SCN_NEEDSHOWN
      + Scintilla has determined that a range of lines that is currently invisible should be made + visible. An example of where this may be needed is if the end of line of a contracted fold + point is deleted. This message is sent to the container in case it wants to make the line + visible in some unusual way such as making the whole document visible. Most containers will + just ensure each line in the range is visible by calling SCI_ENSUREVISIBLE. The position and + length fields of SCNotification indicate the range of the document + that should be made visible. The container code will be similar to the following code + skeleton:

      +
      +firstLine = SCI_LINEFROMPOSITION(scn.position)
      +lastLine = SCI_LINEFROMPOSITION(scn.position+scn.length-1)
      +for line = lineStart to lineEnd do SCI_ENSUREVISIBLE(line) next
      +
      + +

      SCN_PAINTED
      + Painting has just been done. Useful when you want to update some other widgets based on a + change in Scintilla, but want to have the paint occur first to appear more responsive. There is + no other information in SCNotification.

      + +

      SCN_USERLISTSELECTION
      + The user has selected an item in a user list. The + SCNotification fields used are:

      + + + + + + + + + + + + + + + + + + + + + + + +
      FieldUsage
      wParamThis is set to the listType parameter from the SCI_USERLISTSHOW message that + initiated the list.
      textThe text of the selection.
      +
      +
      + + +

      SCN_URIDROPPED
      + Only on the GTK+ version. Indicates that the user has dragged a URI such as a file name or Web + address onto Scintilla. The container could interpret this as a request to open the file. The + text field of SCNotification points at the URI text.

      + +

      SCN_DWELLSTART
      + SCN_DWELLEND
      + SCN_DWELLSTART is generated when the user keeps the mouse in one position for the + dwell period (see SCI_SETMOUSEDWELLTIME). SCN_DWELLEND is + generated after a SCN_DWELLSTART and the mouse is moved or other activity such as + key press indicates the dwell is over. Both notifications set the same fields in + SCNotification:

      + + + + + + + + + + + + + + + + + + + + + + + +
      FieldUsage
      positionThis is the nearest position in the document to the position where the + mouse pointer was lingering.
      x, yWhere the pointer lingered. The position field is set to + SCI_POSITIONFROMPOINTCLOSE(x, y).
      +
      +
      + +

      SCI_SETMOUSEDWELLTIME
      + SCI_GETMOUSEDWELLTIME
      + These two messages set and get the time the mouse must sit still, in milliseconds, to generate + a SCN_DWELLSTART notification. If + set to SC_TIME_FOREVER, the default, no dwell events are generated.

      + +

      SCN_ZOOM
      + This notification is generated when the user zooms the display using the keyboard or the + SCI_SETZOOM method is called. This + notification can be used to recalculate positions, such as the width of the line number margin + to maintain sizes in terms of characters rather than pixels. SCNotification has no + additional information.

      + +

      + SCN_HOTSPOTCLICK
      + SCN_HOTSPOTDOUBLECLICK
      + These notifications are generated when the user clicks or double clicks on + text that is in a style with the hotspot attribute set. + This notification can be used to link to variable definitions or web pages. + The position field is set the text position of the click or + double click and the modifiers field set to the key modifiers + held down in a similar manner to SCN_KEY.

      + +

      SCN_CALLTIPCLICK
      + This notification is generated when the user clicks on a calltip. + This notification can be used to display the next function prototype when a + function name is overloaded with different arguments. + The position field is set to 1 if the click is in an up arrow, + 2 if in a down arrow, and 0 if elsewhere.

      + +

      SCN_AUTOCSELECTION
      + The user has selected an item in an autocompletion list. The + notification is sent before the selection is inserted. Automatic insertion can be cancelled by sending a + SCI_AUTOCCANCEL message + before returning from the notification. The SCNotification fields used are:

      + + + + + + + + + + + + + + + + + + + + + + +
      FieldUsage
      lParamThe start position of the word being completed.
      textThe text of the selection.
      + +

      GTK+

      +

      On GTK+, the following functions create a Scintilla widget, communicate with it and allow + resources to be released after all Scintilla widgets hace been destroyed.

      + GtkWidget *scintilla_new()
      + void scintilla_set_id(ScintillaObject *sci, uptr_t id)
      + sptr_t scintilla_send_message(ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam)
      + void scintilla_release_resources()
      +
      + +

      + The currently supported platforms, Windows, GTK+/Linux and wxWindows are fairly similar in + many ways. + Each has windows, menus and bitmaps. These features generally work in similar ways so each + has a way to move a window or draw a red line. Sometimes one platform requires a sequence of + calls rather than a single call. At other times, the differences are more profound. Reading + the Windows clipboard occurs synchronously but reading the GTK+ clipboard requires a request + call that will be asynchronously answered with a message containing the clipboard data. + The wxWindows platform is available from the wxWindows site +

      + +

      GtkWidget *scintilla_new()
      + Create a new Scintilla widget. The returned pointer can be added to a container and displayed in the same way as other + widgets.

      void scintilla_set_id(ScintillaObject *sci, uptr_t id)
      + Set the control ID which will be used in the idFrom field of the NotifyHeader structure of all + notifications for this instance. When an application creates multiple Scintilla widgets, this allows + the source of each notification to be found. The value should be small, preferrably less than 16 bits, + rather than a pointer as some of the functions will only transmit 16 or 32 bits.

      + +

      sptr_t scintilla_send_message(ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam)
      + The main entry point allows sending any of the messages described in this document.

      + +

      void scintilla_release_resources()
      + Call this to free any remaining resources after all the Scintilla widgets have been destroyed.

      + +

      Deprecated messages and notifications

      + +

      The following messages are currently supported to emulate existing Windows controls, but + they will be removed in future versions of Scintilla. If you use these messages you should + replace them with the Scintilla equivalent.

      +
      +WM_GETTEXT(int length, char *text)
      +WM_SETTEXT(<unused>, const char *text)
      +EM_GETLINE(int line, char *text)
      +EM_REPLACESEL(<unused>, const char *text)
      +EM_SETREADONLY
      +EM_GETTEXTRANGE(<unused>, TEXTRANGE *tr)
      +WM_CUT
      +WM_COPY
      +WM_PASTE
      +WM_CLEAR
      +WM_UNDO
      +EM_CANUNDO
      +EM_EMPTYUNDOBUFFER
      +WM_GETTEXTLENGTH
      +EM_GETFIRSTVISIBLELINE
      +EM_GETLINECOUNT
      +EM_GETMODIFY
      +EM_SETMODIFY(bool isModified)
      +EM_GETRECT(RECT *rect)
      +EM_GETSEL(int *start, int *end)
      +EM_EXGETSEL(<unused>, CHARRANGE *cr)
      +EM_SETSEL(int start, int end)
      +EM_EXSETSEL(<unused>, CHARRANGE *cr)
      +EM_GETSELTEXT(<unused>, char *text)
      +EM_LINEFROMCHAR(int position)
      +EM_EXLINEFROMCHAR(int position)
      +EM_LINEINDEX(int line)
      +EM_LINELENGTH(int position)
      +EM_SCROLL(int line)
      +EM_LINESCROLL(int column, int line)
      +EM_SCROLLCARET()
      +EM_CANPASTE
      +EM_CHARFROMPOS(<unused>, POINT *location)
      +EM_POSFROMCHAR(int position, POINT *location)
      +EM_SELECTIONTYPE
      +EM_HIDESELECTION(bool hide)
      +EM_FINDTEXT(int flags, FINDTEXTEX *ft)
      +EM_FINDTEXTEX(int flags, FINDTEXTEX *ft)
      +EM_GETMARGINS
      +EM_SETMARGINS(EC_LEFTMARGIN or EC_RIGHTMARGIN or EC_USEFONTINFO, int val)
      +EM_FORMATRANGE
      +
      + +

      The following are features that are only included if you define + INCLUDE_DEPRECATED_FEATURES in Scintilla.h. To ensure future + compatibility you should change them as indicated.

      + +

      SCN_POSCHANGED() Deprecated
      + Fired when the user moves the cursor to a different position in the text. Use SCN_UPDATEUI instead.

      + +

      SCN_CHECKBRACE Deprecated
      + Either the text or styling of the document has changed or the selection range has changed. + This is replaced by SCN_UPDATEUI. You + can also use SCN_MODIFIED for more + detailed information on text and styling changes,

      + +

      Edit messages never supported by Scintilla

      +
      +EM_GETWORDBREAKPROC EM_GETWORDBREAKPROCEX
      +EM_SETWORDBREAKPROC EM_SETWORDBREAKPROCEX
      +EM_GETWORDWRAPMODE EM_SETWORDWRAPMODE
      +EM_LIMITTEXT EM_EXLIMITTEXT
      +EM_SETRECT EM_SETRECTNP
      +EM_FMTLINES
      +EM_GETHANDLE EM_SETHANDLE
      +EM_GETPASSWORDCHAR EM_SETPASSWORDCHAR
      +EM_SETTABSTOPS
      +EM_FINDWORDBREAK
      +EM_GETCHARFORMAT EM_SETCHARFORMAT
      +EM_GETOLEINTERFACE EM_SETOLEINTERFACE
      +EM_SETOLECALLBACK
      +EM_GETPARAFORMAT EM_SETPARAFORMAT
      +EM_PASTESPECIAL
      +EM_REQUESTRESIZE
      +EM_GETBKGNDCOLOR EM_SETBKGNDCOLOR
      +EM_STREAMIN EM_STREAMOUT
      +EM_GETIMECOLOR EM_SETIMECOLOR
      +EM_GETIMEOPTIONS EM_SETIMEOPTIONS
      +EM_GETOPTIONS EM_SETOPTIONS
      +EM_GETPUNCTUATION EM_SETPUNCTUATION
      +EM_GETTHUMB
      +EM_GETEVENTMASK
      +EM_SETEVENTMASK
      +EM_DISPLAYBAND
      +EM_SETTARGETDEVICE
      +
      + +

      Scintilla tries to be a superset of the standard windows Edit and RichEdit controls wherever + that makes sense. As it is not intended for use in a word processor, some edit messages can not + be sensibly handled. Unsupported messages have no effect.

      + +

      Building Scintilla

      + +

      To build Scintilla or SciTE, see the README file present in both the Scintilla and SciTE + directories. For Windows, GCC 3.2, Borland C++ or Microsoft Visual Studio .NET can be used + for building. There is a make file for building Scintilla but not SciTE with Visual C++ 6 at + scintilla/win32/scintilla_vc6.mak. For GTK+, GCC 3.1 should be used. GTK+ 1.2x and 2.0x are + supported. The version of GTK+ installed should be detected automatically. + When both GTK+ 1 and GTK+ 2 are present, building for GTK+ 1.x requires defining GTK1 + on the command line.

      + +

      Static linking

      + +

      On Windows, Scintilla is normally used as a dynamic library as a .DLL file. If you want to + link Scintilla directly into your application .EXE or .DLL file, then the + STATIC_BUILD preprocessor symbol should be defined and + Scintilla_RegisterClasses called. STATIC_BUILD prevents compiling the + DllMain function which will conflict with any DllMain defined in your + code. Scintilla_RegisterClasses takes the HINSTANCE of your + application and ensures that the "Scintilla" window class is registered. To make sure that the + right pointing arrow cursor used in the margin is displayed by Scintilla add the + scintilla/win32/Margin.cur file to your application's resources with the ID + IDC_MARGIN which is defined in scintilla/win32/platfromRes.h as + 400.

      + +

      Ensuring lexers are linked into Scintilla

      + +

      Depending on the compiler and linker used, the lexers may be stripped out. This is most + often caused when building a static library. To ensure the lexers are linked in, the + Scintilla_LinkLexers() function may be called.

      + +

      Changing set of lexers

      + +

      To change the set of lexers in Scintilla, add and remove lexer source files + (Lex*.cxx) from the scintilla/src directory and run the + src/LexGen.py script from the src directory to update the make files + and KeyWords.cxx. LexGen.py requires Python 2.1 or later. If you do + not have access to Python, you can hand edit KeyWords.cxx in a simple-minded way, + following the patterns of other lexers. The important thing is to include + LINK_LEXER(lmMyLexer); to correspond with the LexerModule + lmMyLexer(...); in your lexer source code.

      + + + diff --git a/scintilla/doc/ScintillaDownload.html b/scintilla/doc/ScintillaDownload.html new file mode 100644 index 00000000..0385071d --- /dev/null +++ b/scintilla/doc/ScintillaDownload.html @@ -0,0 +1,70 @@ + + + + + + + + + Download Scintilla + + + + + + + + +
      + Scintilla icon + + Download + Scintilla +
      + + + + +
      + + Windows   + + GTK+/Linux   + +
      +

      + Download. +

      +

      + The license for using Scintilla or SciTE is similar to that of Python + containing very few restrictions. +

      +

      + Release 1.73 +

      +

      + Source Code +

      + The source code package contains all of the source code for Scintilla but no binary + executable code and is available in +
        +
      • zip format (740K) commonly used on Windows
      • +
      • tgz format (640K) commonly used on Linux and compatible operating systems
      • +
      + Instructions for building on both Windows and Linux are included in the readme file. +

      + Windows Executable Code +

      + There is no download available containing only the Scintilla DLL. + However, it is included in the SciTE + executable full download as SciLexer.DLL. +

      + SciTE is a good demonstration of Scintilla. +

      +

      + Previous versions can be downloaded from the history + page. +

      + + diff --git a/scintilla/doc/ScintillaHistory.html b/scintilla/doc/ScintillaHistory.html new file mode 100644 index 00000000..af9a30ab --- /dev/null +++ b/scintilla/doc/ScintillaHistory.html @@ -0,0 +1,5512 @@ + + + + + + + + + Scintilla and SciTE + + + + + + + + +
      + Scintilla icon + + Scintilla + and SciTE +
      +

      + History of Scintilla and SciTE +

      +

      + Contributors +

      +

      + Thanks to all the people that have contributed patches, bug reports and suggestions. +

      +

      + Source code and documentation have been contributed by +

      +
        +
      • Atsuo Ishimoto
      • +
      • Mark Hammond
      • +
      • Francois Le Coguiec
      • +
      • Dale Nagata
      • +
      • Ralf Reinhardt
      • +
      • Philippe Lhoste
      • +
      • Andrew McKinlay
      • +
      • Stephan R. A. Deibel
      • +
      • Hans Eckardt
      • +
      • Vassili Bourdo
      • +
      • Maksim Lin
      • +
      • Robin Dunn
      • +
      • John Ehresman
      • +
      • Steffen Goeldner
      • +
      • Deepak S.
      • +
      • Yann Gaillard
      • +
      • Aubin Paul
      • +
      • Jason Diamond
      • +
      • Ahmad Baitalmal
      • +
      • Paul Winwood
      • +
      • Maxim Baranov
      • +
      • Ragnar Højland
      • +
      • Christian Obrecht
      • +
      • Andreas Neukoetter
      • +
      • Adam Gates
      • +
      • Steve Lhomme
      • +
      • Ferdinand Prantl
      • +
      • Jan Dries
      • +
      • Markus Gritsch
      • +
      • Tahir Karaca
      • +
      • Ahmad Zawawi
      • +
      • Laurent le Tynevez
      • +
      • Walter Braeu
      • +
      • Ashley Cambrell
      • +
      • Garrett Serack
      • +
      • Holger Schmidt
      • +
      • ActiveState
      • +
      • James Larcombe
      • +
      • Alexey Yutkin
      • +
      • Jan Hercek
      • +
      • Richard Pecl
      • +
      • Edward K. Ream
      • +
      • Valery Kondakoff
      • +
      • Smári McCarthy
      • +
      • Clemens Wyss
      • +
      • Simon Steele
      • +
      • Serge A. Baranov
      • +
      • Xavier Nodet
      • +
      • Willy Devaux
      • +
      • David Clain
      • +
      • Brendon Yenson
      • +
      • Vamsi Potluru
      • +
      • Praveen Ambekar
      • +
      • Alan Knowles
      • +
      • Kengo Jinno
      • +
      • Valentin Valchev
      • +
      • Marcos E. Wurzius
      • +
      • Martin Alderson
      • +
      • Robert Gustavsson
      • +
      • José Fonseca
      • +
      • Holger Kiemes
      • +
      • Francis Irving
      • +
      • Scott Kirkwood
      • +
      • Brian Quinlan
      • +
      • Ubi
      • +
      • Michael R. Duerig
      • +
      • Deepak T
      • +
      • Don Paul Beletsky
      • +
      • Gerhard Kalab
      • +
      • Olivier Dagenais
      • +
      • Josh Wingstrom
      • +
      • Bruce Dodson
      • +
      • Sergey Koshcheyev
      • +
      • Chuan-jian Shen
      • +
      • Shane Caraveo
      • +
      • Alexander Scripnik
      • +
      • Ryan Christianson
      • +
      • Martin Steffensen
      • +
      • Jakub Vrána
      • +
      • The Black Horus
      • +
      • Bernd Kreuss
      • +
      • Thomas Lauer
      • +
      • Mike Lansdaal
      • +
      • Yukihiro Nakai
      • +
      • Jochen Tucht
      • +
      • Greg Smith
      • +
      • Steve Schoettler
      • +
      • Mauritius Thinnes
      • +
      • Darren Schroeder
      • +
      • Pedro Guerreiro
      • +
      • Dan Petitt
      • +
      • Biswapesh Chattopadhyay
      • +
      • Kein-Hong Man
      • +
      • Patrizio Bekerle
      • +
      • Nigel Hathaway
      • +
      • Hrishikesh Desai
      • +
      • Sergey Puljajev
      • +
      • Mathias Rauen
      • +
      • Angelo Mandato
      • +
      • Denis Sureau
      • +
      • Kaspar Schiess
      • +
      • Christoph Hösler
      • +
      • João Paulo F Farias
      • +
      • Ron Schofield
      • +
      • Stefan Wosnik
      • +
      • Marius Gheorghe
      • +
      • Naba Kumar
      • +
      • Sean O'Dell
      • +
      • Stefanos Togoulidis
      • +
      • Hans Hagen
      • +
      • Jim Cape
      • +
      • Roland Walter
      • +
      • Brian Mosher
      • +
      • Nicholas Nemtsev
      • +
      • Roy Wood
      • +
      • Peter-Henry Mander
      • +
      • Robert Boucher
      • +
      • Christoph Dalitz
      • +
      • April White
      • +
      • S. Umar
      • +
      • Trent Mick
      • +
      • Filip Yaghob
      • +
      • Avi Yegudin
      • +
      • Vivi Orunitia
      • +
      • Manfred Becker
      • +
      • Dimitris Keletsekis
      • +
      • Yuiga
      • +
      • Davide Scola
      • +
      • Jason Boggs
      • +
      • Reinhold Niesner
      • +
      • Jos van der Zande
      • +
      • Pescuma
      • +
      • Pavol Bosik
      • +
      • Johannes Schmid
      • +
      • Blair McGlashan
      • +
      • Mikael Hultgren
      • +
      • Florian Balmer
      • +
      • Hadar Raz
      • +
      • Herr Pfarrer
      • +
      • Ben Key
      • +
      • Gene Barry
      • +
      • Niki Spahiev
      • +
      • Carsten Sperber
      • +
      • Phil Reid
      • +
      • Iago Rubio
      • +
      • Régis Vaquette
      • +
      • Massimo Corà
      • +
      • Elias Pschernig
      • +
      • Chris Jones
      • +
      • Josiah Reynolds
      • +
      • Robert Roessler rftp.com
      • +
      • Steve Donovan
      • +
      • Jan Martin Pettersen
      • +
      • Sergey Philippov
      • +
      • Borujoa
      • +
      • Michael Owens
      • +
      • Franck Marcia
      • +
      • Massimo Maria Ghisalberti
      • +
      • Frank Wunderlich
      • +
      • Josepmaria Roca
      • +
      • Tobias Engvall
      • +
      • Suzumizaki Kimitaka
      • +
      • Michael Cartmell
      • +
      • Pascal Hurni
      • +
      • Andre
      • +
      • Randy Butler
      • +
      • Georg Ritter
      • +
      • Michael Goffioul
      • +
      • Ben Harper
      • +
      • Adam Strzelecki
      • +
      • Kamen Stanev
      • +
      • Steve Menard
      • +
      • Oliver Yeoh
      • +
      • Eric Promislow
      • +
      • Joseph Galbraith
      • +
      • Jeffrey Ren
      • +
      • Armel Asselin
      • +
      • Jim Pattee
      • +
      • Friedrich Vedder
      • +
      • Sebastian Pipping
      • +
      • Andre Arpin
      • +
      • Stanislav Maslovski
      • +
      • Martin Stone
      • +
      • Fabien Proriol
      • +
      • mimir
      • +
      • Nicola Civran
      • +
      • Snow
      • +
      • Mitchell Foral
      • +
      • Pieter Holtzhausen
      • +
      • Waldemar Augustyn
      • +
      • Jason Haslam
      • +
      • Sebastian Steinlechner
      • +
      • Chris Rickard
      • +
      • Rob McMullen
      • +
      • Stefan Schwendeler
      • +
      • Cristian Adam
      • +
      +

      + Images used in GTK+ version +

      +
        +
      • + + Icons Copyright(C) 1998 by Dean S. Jones
        +
      • +
      +

      + Release 1.73 +

      +
        +
      • + Released on 31 March 2007. +
      • +
      • + SciTE adds a Directory properties file to configure behaviour for files in a directory and its subdirectories. +
      • +
      • + Style changes may be made during text modification events. +
      • +
      • + Regular expressions recognize \d, \D, \s, \S, \w, \W, and \xHH. +
      • +
      • + Support for cmake language added. +
      • +
      • + More Scintilla properties can be queried. +
      • +
      • + Edge line drawn under text. +
      • +
      • + A savesession command added to SciTE director interface. +
      • +
      • + SciTE File | Encoding menu item names changed to be less confusing. +
      • +
      • + SciTE on GTK+ dialog buttons reordered to follow guidelines. +
      • +
      • + SciTE on GTK+ removed GTK+ 1.x compatible file dialog code. +
      • +
      • + SciTE on GTK+ recognizes key names KeypadMultiply and KeypadDivide. +
      • +
      • + Background colour of line wrapping visual flag changed to STYLE_DEFAULT. +
      • +
      • + Makefile lexing enhanced for ':=' operator and when lines start with tab. +
      • +
      • + TADS3 lexer and folder improved. +
      • +
      • + SCN_DOUBLECLICK notification may set SCI_SHIFT, SCI_CTRL, and SCI_ALT flags on modifiers field. +
      • +
      • + Slow folding of large constructs in Python fixed. +
      • +
      • + MSSQL folding fixed to be case-insensitive and fold at more keywords. +
      • +
      • + SciTE's brace matching works better for HTML. +
      • +
      • + Determining API list items checks for specified parameters start character before default '('. +
      • +
      • + Hang fixed in HTML lexer. +
      • +
      • + Bug fixed in with LineTranspose command where markers could move to different line. +
      • +
      • + Memory released when buffer completely emptied. +
      • +
      • + If translucency not available on Windows, draw rectangular outline instead. +
      • +
      • + Bash lexer handles "-x" in "--x-includes..." better. +
      • +
      • + AutoIt3 lexer fixes string followed by '+'. +
      • +
      • + LinesJoin fixed where it stopped early due to not adjusting for inserted spaces.. +
      • +
      • + StutteredPageDown fixed when lines wrapped. +
      • +
      • + FormatRange fixed to not double count line number width which could lead to a large space. +
      • +
      • + SciTE Export As PDF and Latex commands fixed to format floating point numbers with '.' even in locales + that use ','. +
      • +
      • + SciTE bug fixed where File | New could produce buffer with contents of previous file when using read-only mode. +
      • +
      • + SciTE retains current scroll position when switching buffers and fold.on.open set. +
      • +
      • + SciTE crash fixed where '*' used to invoke parameters dialog. +
      • +
      • + SciTE bugs when writing large UCS-2 files fixed. +
      • +
      • + Bug fixed when scrolling inside a SCN_PAINTED event by invalidating window + rather than trying to perform synchronous painting. +
      • +
      • + SciTE for GTK+ View | Full Screen works on recent versions of GTK+. +
      • +
      • + SciTE for Windows enables and disables toolbar commands correctly. +
      • +
      +

      + Release 1.72 +

      +
        +
      • + Released on 15 January 2007. +
      • +
      • + Performance of per-line data improved. +
      • +
      • + SC_STARTACTION flag set on the first modification notification in an undo + transaction to help synchronize the container's undo stack with Scintilla's. +
      • +
      • + On GTK+ drag and drop defaults to move rather than copy. +
      • +
      • + Scintilla supports extending appearance of selection to right hand margin. +
      • +
      • + Incremental search available on GTK+. +
      • +
      • + Find in Files can optionally ignore binary files or directories that start with ".". +
      • +
      • + Lexer added for "D" language. +
      • +
      • + Export as HTML shows folding with underline lines and +/- symbols. +
      • +
      • + Ruby lexer interprets interpolated strings as expressions. +
      • +
      • + Lua lexer fixes some cases of numeric literals. +
      • +
      • + C++ folder fixes bug with "@" in doc comments. +
      • +
      • + NSIS folder handles !if and related commands. +
      • +
      • + Inno setup lexer adds styling for single and double quoted strings. +
      • +
      • + Matlab lexer handles backslashes in string literals correctly. +
      • +
      • + HTML lexer fixed to allow "?>" in comments in Basic script. +
      • +
      • + Added key codes for Windows key and Menu key. +
      • +
      • + Lua script method scite.MenuCommand(x) performs a menu command. +
      • +
      • + SciTE bug fixed with box comment command near start of file setting selection to end of file. +
      • +
      • + SciTE on GTK+, fixed loop that occurred with automatic loading for an unreadable file. +
      • +
      • + SciTE asks whether to save files when Windows shuts down. +
      • +
      • + Save Session on Windows now defaults the extension to "ses". +
      • +
      • + Bug fixed with single character keywords. +
      • +
      • + Fixed infinite loop for SCI_GETCOLUMN for position beyond end of document. +
      • +
      • + Fixed failure to accept typing on Solaris/GTK+ when using default ISO-8859-1 encoding. +
      • +
      • + Fixed warning from Lua in SciTE when creating a new buffer when already have + maximum number of buffers open. +
      • +
      • + Crash fixed with "%%" at end of batch file. +
      • +
      +

      + Release 1.71 +

      +
        +
      • + Released on 21 August 2006. +
      • + +
      • + Double click notification includes line and position. +
      • +
      • + VB lexer bugs fixed for preprocessor directive below a comment or some other states and + to use string not closed style back to the starting quote when there are internal doubled quotes. +
      • +
      • + C++ lexer allows identifiers to contain '$' and non-ASCII characters such as UTF-8. + The '$' character can be disallowed with lexer.cpp.allow.dollars=0. +
      • +
      • + Perl lexer allows UTF-8 identifiers and has some other small improvements. +
      • +
      • + SciTE's $(CurrentWord) uses word.characters.<filepattern> to define the word + rather than a hardcoded list of word characters. +
      • +
      • + SciTE Export as HTML adds encoding information for UTF-8 file and fixes DOCTYPE. +
      • +
      • + SciTE session and .recent files default to the user properties directory rather than global + properties directory. +
      • +
      • + Left and right scroll events handled correctly on GTK+ and horizontal scroll bar has more sensible + distances for page and arrow clicks. +
      • +
      • + SciTE on GTK+ tab bar fixed to work on recent versions of GTK+. +
      • +
      • + On GTK+, if the approximate character set conversion is unavailable, a second attempt is made + without approximations. This may allow keyboard input and paste to work on older systems. +
      • +
      • + SciTE on GTK+ can redefine the Insert key. +
      • +
      • + SciTE scripting interface bug fixed where some string properties could not be changed. +
      • +
      +

      + Release 1.70 +

      +
        +
      • + Released on 20 June 2006. +
      • +
      • + On GTK+, character set conversion is performed using an option that allows approximate conversions rather + than failures when a character can not be converted. This may lead to similar characters being inserted or + when no similar character is available a '?' may be inserted. +
      • +
      • + On GTK+, the internationalised IM (Input Method) feature is used for all typed input for all character sets. +
      • +
      • + Scintilla has new margin types SC_MARGIN_BACK and SC_MARGIN_FORE that use the default + style's background and foreground colours (normally white and black) as the background to the margin. +
      • +
      • + Scintilla/GTK+ allows file drops on Windows when drop is of type DROPFILES_DND + as well as text/uri-list. +
      • +
      • + Code page can only be set to one of the listed valid values. +
      • +
      • + Text wrapping fixed for cases where insertion was not wide enough to trigger + wrapping before being styled but was after styling. +
      • +
      • + SciTE find marks are removed before printing or exporting to avoid producing incorrect styles. +
      • +
      +

      + Release 1.69 +

      +
        +
      • + Released on 29 May 2006. +
      • +
      • + SciTE supports z-order based buffer switching on Ctrl+Tab. +
      • +
      • + Translucent support for selection and whole line markers. +
      • +
      • + SciTE may have per-language abbreviations files. +
      • +
      • + Support for Spice language. +
      • +
      • + On GTK+ autocompletion lists are optimised and use correct selection colours. +
      • +
      • + On GTK+ the URI data type is preferred in drag and drop so that applications + will see files dragged from the shell rather than dragging the text of the file name + into the document. +
      • +
      • + Increased number of margins to 5. +
      • +
      • + Basic lexer allows include directive $include: "file name". +
      • +
      • + SQL lexer no longer bases folding on indentation. +
      • +
      • + Line ends are transformed when copied to clipboard on + Windows/GTK+2 as well as Windows/GTK+ 1. +
      • +
      • + Lexing code masks off the indicator bits on the start style before calling the lexer + to avoid confusing the lexer when an application has used an indicator. +
      • +
      • + SciTE savebefore:yes only saves the file when it has been changed. +
      • +
      • + SciTE adds output.initial.hide setting to allow setting the size of the output pane + without it showing initially. +
      • +
      • + SciTE on Windows Go To dialog allows line number with more digits. +
      • +
      • + Bug in HTML lexer fixed where a segment of PHP could switch scripting language + based on earlier text on that line. +
      • +
      • + Memory bug fixed when freeing regions on GTK+. + Other minor bugs fixed on GTK+. +
      • +
      • + Deprecated GTK+ calls in Scintilla replaced with current calls. +
      • +
      • + Fixed a SciTE bug where closing the final buffer, if read-only, left the text present in an + untitled buffer. +
      • +
      • + Bug fixed in bash lexer that prevented folding. +
      • +
      • + Crash fixed in bash lexer when backslash at end of file. +
      • +
      • + Crash on recent releases of GTK+ 2.x avoided by changing default font from X + core font to Pango font "!Sans". +
      • +
      • + Fix for SciTE properties files where multiline properties continued over completely blank lines. +
      • +
      • + Bug fixed in SciTE/GTK+ director interface where more data available than + buffer size. +
      • +
      • + Minor visual fixes to SciTE splitter on GTK+. +
      • +
      +

      + Release 1.68 +

      +
        +
      • + Released on 9 March 2006. +
      • +
      • + Translucent drawing implemented for caret line and box indicators. +
      • +
      • + Lexer specifically for TCL is much more accurate than reusing C++ lexer. +
      • +
      • + Support for Inno Setup scripts. +
      • +
      • + Support for Opal language. +
      • +
      • + Calltips may use a new style, STYLE_CALLTIP which allows choosing a + different font for calltips. +
      • +
      • + Python lexer styles comments on decorators. +
      • +
      • + HTML lexer refined handling of "?>" and "%>" within server + side scripts. +
      • +
      • + Batch file lexer improved. +
      • +
      • + Eiffel lexer doesn't treat '.' as a name character. +
      • +
      • + Lua lexer handles length operator, #, and hex literals. +
      • +
      • + Properties file lexer has separate style for keys. +
      • +
      • + PL/SQL folding improved. +
      • +
      • + SciTE Replace dialog always searches in forwards direction. +
      • +
      • + SciTE can detect language of file from initial #! line. +
      • +
      • + SciTE on GTK+ supports output.scroll=2 setting. +
      • +
      • + SciTE can perform an import a properties file from the command line. +
      • +
      • + Set of word characters used for regular expression \< and \>. +
      • +
      • + Bug fixed with SCI_COPYTEXT stopping too early. +
      • +
      • + Bug fixed with splitting lines so that all lines are split. +
      • +
      • + SciTE calls OnSwitchFile when closing one buffer causes a switch to another. +
      • +
      • + SciTE bug fixed where properties were being reevaluated without good reason + after running a macro. +
      • +
      • + Crash fixed when clearing document with some lines contracted in word wrap mode. +
      • +
      • + Palette expands as more entries are needed. +
      • +
      • + SCI_POSITIONFROMPOINT returns more reasonable value when close to + last text on a line. +
      • +
      • + On Windows, long pieces of text may be drawn in segments if they fail to draw + as a whole. +
      • +
      • + Bug fixed with bad drawing when some visual changes made inside SCN_UPDATEUI + notification. +
      • +
      • + SciTE bug fixed with groupundo setting. +
      • +
      +

      + Release 1.67 +

      +
        +
      • + Released on 17 December 2005. +
      • +
      • + Scintilla checks the paint region more accurately when seeing if an area is being + repainted. Platform layer implementations may need to change for this to take + effect. This fixes some drawing and styling bugs. Also optimized some parts of + marker code to only redraw the line of the marker rather than whole of the margin. +
      • +
      • + Quoted identifier style for SQL. SQL folding performed more simply. +
      • +
      • + Ruby lexer improved to better handle here documents and non-ASCII + characters. +
      • +
      • + Lua lexer supports long string and block comment syntax from Lua 5.1. +
      • +
      • + Bash lexer handles here documents better. +
      • +
      • + JavaScript lexing recognises regular expressions more accurately and includes flag + characters in the regular expression style. This is both in JavaScript files and when + JavaScript is embedded in HTML. +
      • +
      • + Scintilla API provided to reveal how many style bits are needed for the + current lexer. +
      • +
      • + Selection duplicate added. +
      • +
      • + Scintilla API for adding a set of markers to a line. +
      • +
      • + DBCS encodings work on Windows 9x. +
      • +
      • + Convention defined for property names to be used by lexers and folders + so they can be automatically discovered and forwarded from containers. +
      • +
      • + Default bookmark in SciTE changed to a blue sphere image. +
      • +
      • + SciTE stores the time of last asking for a save separately for each buffer + which fixes bugs with automatic reloading. +
      • +
      • + On Windows, pasted text has line ends converted to current preference. + GTK+ already did this. +
      • +
      • + Kid template language better handled by HTML lexer by finishing ASP Python + mode when a ?> is found. +
      • +
      • + SciTE counts number of characters in a rectangular selection correctly. +
      • +
      • + 64-bit compatibility improved. One change that may affect user code is that + the notification message header changed to include a pointer-sized id field + to match the current Windows definition. +
      • +
      • + Empty ranges can no longer be dragged. +
      • +
      • + Crash fixed when calls made that use layout inside the painted notification. +
      • +
      • + Bug fixed where Scintilla created pixmap buffers that were too large leading + to failures when many instances used. +
      • +
      • + SciTE sets the directory of a new file to the directory of the currently + active file. +
      • +
      • + SciTE allows choosing a code page for the output pane. +
      • +
      • + SciTE HTML exporter no longer honours monospaced font setting. +
      • +
      • + Line layout cache in page mode caches the line of the caret. An assertion is + now used to ensure that the layout reentrancy problem that caused this + is easier to find. +
      • +
      • + Speed optimized for long lines and lines containing many control characters. +
      • +
      • + Bug fixed in brace matching in DBCS files where byte inside character + is same as brace. +
      • +
      • + Indent command does not indent empty lines. +
      • +
      • + SciTE bug fixed for commands that operate on files with empty extensions. +
      • +
      • + SciTE bug fixed where monospaced option was copied for subsequently opened files. +
      • +
      • + SciTE on Windows bug fixed in the display of a non-ASCII search string + which can not be found. +
      • +
      • + Bugs fixed with nested calls displaying a new calltip while one is already + displayed. +
      • +
      • + Bug fixed when styling PHP strings. +
      • +
      • + Bug fixed when styling C++ continued preprocessor lines. +
      • +
      • + SciTE bug fixed where opening file from recently used list reset choice of + language. +
      • +
      • + SciTE bug fixed when compiled with NO_EXTENSIONS and + closing one file closes the application. +
      • +
      • + SciTE crash fixed for error messages that look like Lua messages but aren't + in the same order. +
      • +
      • + Remaining fold box support deprecated. The symbols SC_FOLDLEVELBOXHEADERFLAG, + SC_FOLDLEVELBOXFOOTERFLAG, SC_FOLDLEVELCONTRACTED, + SC_FOLDLEVELUNINDENT, and SC_FOLDFLAG_BOX are deprecated. +
      • +
      +

      + Release 1.66 +

      +
        +
      • + Released on 26 August 2005. +
      • +
      • + New, more ambitious Ruby lexer. +
      • +
      • + SciTE Find in Files dialog has options for matching case and whole words which are + enabled when the internal find command is used. +
      • +
      • + SciTE output pane can display automatic completion after "$(" typed. + An initial ">" on a line is ignored when Enter pressed. +
      • +
      • + C++ lexer recognises keywords within line doc comments. It continues styles over line + end characters more consistently so that eolfilled style can be used for preprocessor lines + and line comments. +
      • +
      • + VB lexer improves handling of file numbers and date literals. +
      • +
      • + Lua folder handles repeat until, nested comments and nested strings. +
      • +
      • + POV lexer improves handling of comment lines. +
      • +
      • + AU3 lexer and folder updated. COMOBJ style added. +
      • +
      • + Bug fixed with text display on GTK+ with Pango 1.8. +
      • +
      • + Caret painting avoided when not focused. +
      • +
      • + SciTE on GTK+ handles file names used to reference properties as case-sensitive. +
      • +
      • + SciTE on GTK+ Save As and Export commands set the file name field. + On GTK+ the Export commands modify the file name in the same way as on Windows. +
      • +
      • + Fixed SciTE problem where confirmation was not displaying when closing a file where all + contents had been deleted. +
      • +
      • + Middle click on SciTE tab now closes correct buffer on Windows when tool bar is visible. +
      • +
      • + SciTE bugs fixed where files contained in directory that includes '.' character. +
      • +
      • + SciTE bug fixed where import in user options was reading file from directory of + global options. +
      • +
      • + SciTE calltip bug fixed where single line calltips had arrow displayed incorrectly. +
      • +
      • + SciTE folding bug fixed where empty lines were shown for no reason. +
      • +
      • + Bug fixed where 2 byte per pixel XPM images caused crash although they are still not + displayed. +
      • +
      • + Autocompletion list size tweaked. +
      • +
      +

      + Release 1.65 +

      +
        +
      • + Released on 1 August 2005. +
      • +
      • + FreeBasic support. +
      • +
      • + SciTE on Windows handles command line arguments + "-" (read standard input into buffer), + "--" (read standard input into output pane) and + "-@" (read file names from standard input and open each). +
      • +
      • + SciTE includes a simple implementation of Find in Files which is used if no find.command is set. +
      • +
      • + SciTE can close tabs with a mouse middle click. +
      • +
      • + SciTE includes a save.all.for.build setting. +
      • +
      • + Folder for MSSQL. +
      • +
      • + Batch file lexer understands more of the syntax and the behaviour of built in commands. +
      • +
      • + Perl lexer handles here docs better; disambiguates barewords, quote-like delimiters, and repetition operators; + handles Pods after __END__; recognises numbers better; and handles some typeglob special variables. +
      • +
      • + Lisp adds more lexical states. +
      • +
      • + PHP allows spaces after <<<. +
      • +
      • + TADS3 has a simpler set of states and recognizes identifiers. +
      • +
      • + Avenue elseif folds better. +
      • +
      • + Errorlist lexer treats lines starting with '+++' and '---' as separate + styles from '+' and '-' as they indicate file names in diffs. +
      • +
      • + SciTE error recogniser handles file paths in extra explanatory lines from MSVC + and in '+++' and '---' lines from diff. +
      • +
      • + Bugs fixed in SciTE and Scintilla folding behaviour when text pasted before + folded text caused unnecessary + unfolding and cutting text could lead to text being irretrievably hidden. +
      • +
      • + SciTE on Windows uses correct font for dialogs and better font for tab bar + allowing better localisation +
      • +
      • + When Windows is used with a secondary monitor before the primary + monitor, autocompletion lists are not forced onto the primary monitor. +
      • +
      • + Scintilla calltip bug fixed where down arrow setting wrong value in notification + if not in first line. SciTE bug fixed where second arrow only shown on multiple line + calltip and was therefore misinterpreting the notification value. +
      • +
      • + Lexers will no longer be re-entered recursively during, for example, fold level setting. +
      • +
      • + Undo of typing in overwrite mode undoes one character at a time rather than requiring a removal + and addition step for each character. +
      • +
      • + EM_EXSETSEL(0,-1) fixed. +
      • +
      • + Bug fixed where part of a rectangular selection was not shown as selected. +
      • +
      • + Autocomplete window size fixed. +
      • +
      +

      + Release 1.64 +

      +
        +
      • + Released on 6 June 2005. +
      • +
      • + TADS3 support +
      • +
      • + Smalltalk support. +
      • +
      • + Rebol support. +
      • +
      • + Flagship (Clipper / XBase) support. +
      • +
      • + CSound support. +
      • +
      • + SQL enhanced to support SQL*Plus. +
      • +
      • + SC_MARK_FULLRECT margin marker fills the whole marker margin for marked + lines with a colour. +
      • +
      • + Performance improved for some large undo and redo operations and modification flags + added in notifications. +
      • +
      • + SciTE adds command equivalents for fold margin mouse actions. +
      • +
      • + SciTE adds OnUpdateUI to set of events that can be handled by a Lua script. +
      • +
      • + Properties set in Scintilla can be read. +
      • +
      • + GTK+ SciTE exit confirmation adds Cancel button. +
      • +
      • + More accurate lexing of numbers in PHP and Caml. +
      • +
      • + Perl can fold POD and package sections. POD verbatim section style. + Globbing syntax recognized better. +
      • +
      • + Context menu moved slightly on GTK+ so that it will be under the mouse and will + stay open if just clicked rather than held. +
      • +
      • + Rectangular selection paste works the same whichever direction the selection was dragged in. +
      • +
      • + EncodedFromUTF8 handles -1 length argument as documented. +
      • +
      • + Undo and redo can cause SCN_MODIFYATTEMPTRO notifications. +
      • +
      • + Indicators display correctly when they start at the second character on a line. +
      • +
      • + SciTE Export As HTML uses standards compliant CSS. +
      • +
      • + SciTE automatic indentation handles keywords for indentation better. +
      • +
      • + SciTE fold.comment.python property removed as does not work. +
      • +
      • + Fixed problem with character set conversion when pasting on GTK+. +
      • +
      • + SciTE default character set changed from ANSI_CHARSET to DEFAULT_CHARSET. +
      • +
      • + Fixed crash when creating empty autocompletion list. +
      • +
      • + Autocomplete window size made larger under some conditions to make truncation less common. +
      • +
      • + Bug fixed where changing case of a selection did not affect initial character of lines + in multi-byte encodings. +
      • +
      • + Bug fixed where rectangular selection not displayed after Alt+Shift+Click. +
      • +
      +

      + Release 1.63 +

      +
        +
      • + Released on 4 April 2005. +
      • +
      • + Autocompletion on Windows changed to use popup window, be faster, + allow choice of maximum width and height, and to highlight only the text of the + selected item rather than both the text and icon if any. +
      • +
      • + Extra items can be added to the context menu in SciTE. +
      • +
      • + Character wrap mode in Scintilla helps East Asian languages. +
      • +
      • + Lexer added for Haskell. +
      • +
      • + Objective Caml support. +
      • +
      • + BlitzBasic and PureBasic support. +
      • +
      • + CSS support updated to handle CSS2. +
      • +
      • + C++ lexer is more selective about document comment keywords. +
      • +
      • + AutoIt 3 lexer improved. +
      • +
      • + Lua lexer styles end of line characters on comment and preprocessor + lines so that the eolfilled style can be applied to them. +
      • +
      • + NSIS support updated for line continuations, box comments, SectionGroup and + PageEx, and with more up-to-date properties. +
      • +
      • + Clarion lexer updated to perform folding and have more styles. +
      • +
      • + SQL lexer gains second set of keywords. +
      • +
      • + Errorlist lexer recognises Borland Delphi error messages. +
      • +
      • + Method added for determining number of visual lines occupied by a document + line due to wrapping. +
      • +
      • + Sticky caret mode does not modify the preferred caret x position when typing + and may be useful for typing columns of text. +
      • +
      • + Dwell end notification sent when scroll occurs. +
      • +
      • + On GTK+, Scintilla requisition height is screen height rather than large fixed value. +
      • +
      • + Case insensitive autocompletion prefers exact case match. +
      • +
      • + SCI_PARADOWN and SCI_PARAUP treat lines containing only white + space as empty and handle text hidden by folding. +
      • +
      • + Scintilla on Windows supports WM_PRINTCLIENT although there are some + limitations. +
      • +
      • + SCN_AUTOCSELECTION notification sent when user selects from autoselection list. +
      • +
      • + SciTE's standard properties file sets buffers to 10, uses Pango fonts on GTK+ and + has dropped several languages to make the menu fit on screen. +
      • +
      • + SciTE's encoding cookie detection loosened so that common XML files will load + in UTF-8 if that is their declared encoding. +
      • +
      • + SciTE on GTK+ changes menus and toolbars to not be detachable unless turned + on with a property. Menus no longer tear off. The toolbar may be set to use the + default theme icons rather than SciTE's set. Changed key for View | End of Line + because of a conflict. Language menu can contain more items. +
      • +
      • + SciTE on GTK+ 2.x allows the height and width of the file open file chooser to + be set, for the show hidden files check box to be set from an option and for it + to be opened in the directory of the current file explicitly. Enter key works in + save chooser. +
      • +
      • + Scintilla lexers should no longer see bits in style bytes that are outside the set + they modify so should be able to correctly lex documents where the container + has used indicators. +
      • +
      • + SciTE no longer asks to save before performing a revert. +
      • +
      • + SciTE director interface adds a reloadproperties command to reload properties + from files. +
      • +
      • + Allow build on CYGWIN platform. +
      • +
      • + Allow use from LccWin compiler. +
      • +
      • + SCI_COLOURISE for SCLEX_CONTAINER causes a + SCN_STYLENEEDED notification. +
      • +
      • + Bugs fixed in lexing of HTML/ASP/JScript. +
      • +
      • + Fix for folding becoming confused. +
      • +
      • + On Windows, fixes for Japanese Input Method Editor and for 8 bit Katakana + characters. +
      • +
      • + Fixed buffer size bug avoided when typing long words by making buffer bigger. +
      • +
      • + Undo after automatic indentation more sensible. +
      • +
      • + SciTE menus on GTK+ uses Shift and Ctrl rather than old style abbreviations. +
      • +
      • + SciTE full screen mode on Windows calculates size more correctly. +
      • +
      • + SciTE on Windows menus work better with skinning applications. +
      • +
      • + Searching bugs fixed. +
      • +
      • + Colours reallocated when changing image using SCI_REGISTERIMAGE. +
      • +
      • + Caret stays visible when Enter held down. +
      • +
      • + Undo of automatic indentation more reasonable. +
      • +
      • + High processor usage fixed in background wrapping under some + circumstances. +
      • +
      • + Crashing bug fixed on AMD64. +
      • +
      • + SciTE crashing bug fixed when position.height or position.width not set. +
      • +
      • + Crashing bug on GTK+ fixed when setting cursor and window is NULL. +
      • +
      • + Crashing bug on GTK+ preedit window fixed. +
      • +
      • + SciTE crashing bug fixed in incremental search on Windows ME. +
      • +
      • + SciTE on Windows has a optional find and replace dialogs that can search through + all buffers and search within a particular style number. +
      • +
      +

      + Release 1.62 +

      +
        +
      • + Released on 31 October 2004. +
      • +
      • + Lexer added for ASN.1. +
      • +
      • + Lexer added for VHDL. +
      • +
      • + On Windows, an invisible system caret is used to allow screen readers to determine + where the caret is. The visible caret is still drawn by the painting code. +
      • +
      • + On GTK+, Scintilla has methods to read the target as UTF-8 and to convert + a string from UTF-8 to the document encoding. This eases integration with + containers that use the UTF-8 encoding which is the API encoding for GTK+ 2. +
      • +
      • + SciTE on GTK+2 and Windows NT/2000/XP allows search and replace of Unicode text. +
      • +
      • + SciTE calltips allow setting the characters used to start and end parameter lists and + to separate parameters. +
      • +
      • + FindColumn method converts a line and column into a position, taking into account + tabs and multi-byte characters. +
      • +
      • + On Windows, when Scintilla copies text to the clipboard as Unicode, it avoids + adding an ANSI copy as the system will automatically convert as required in + a context-sensitive manner. +
      • +
      • + SciTE indent.auto setting automatically determines indent.size and use.tabs from + document contents. +
      • +
      • + SciTE defines a CurrentMessage property that holds the most recently selected + output pane message. +
      • +
      • + SciTE Lua scripting enhanced with +
          +
        • A Lua table called 'buffer' is associated with each buffer and can be used to + maintain buffer-specific state.
        • +
        • A 'scite' object allows interaction with the application such as opening + files from script.
        • +
        • Dynamic properties can be reset by assigning nil to a given key in + the props table.
        • +
        • An 'OnClear' event fires whenever properties and extension scripts are + about to be reloaded.
        • +
        • On Windows, loadlib is enabled and can be used to access Lua + binary modules / DLLs.
        +
      • +
      • + SciTE Find in Files on Windows can be used in a modeless way and gains a '..' + button to move up to the parent directory. It is also wider so that longer paths + can be seen. +
      • +
      • + Close buttons added to dialogs in SciTE on Windows. +
      • +
      • + SciTE on GTK+ 2 has a "hidden files" check box in file open dialog. +
      • +
      • + SciTE use.monospaced setting removed. More information in the + FAQ. +
      • +
      • + APDL lexer updated with more lexical classes +
      • +
      • + AutoIt3 lexer updated. +
      • +
      • + Ada lexer fixed to support non-ASCII text. +
      • +
      • + Cpp lexer now only matches exactly three slashes as starting a doc-comment so that + lines of slashes are seen as a normal comment. + Line ending characters are appear in default style on preprocessor and single line + comment lines. +
      • +
      • + CSS lexer updated to support CSS2 including second set of keywords. +
      • +
      • + Errorlist lexer now understands Java stack trace lines. +
      • +
      • + SciTE's handling of HTML Tidy messages jumps to column as well as line indicated. +
      • +
      • + Lisp lexer allows multiline strings. +
      • +
      • + Lua lexer treats .. as an operator when between identifiers. +
      • +
      • + PHP lexer handles 'e' in numerical literals. +
      • +
      • + PowerBasic lexer updated for macros and optimised. +
      • +
      • + Properties file folder changed to leave lines before a header at the base level + and thus avoid a vertical line when using connected folding symbols. +
      • +
      • + GTK+ on Windows version uses Alt for rectangular selection to be compatible with + platform convention. +
      • +
      • + SciTE abbreviations file moved from system directory to user directory + so each user can have separate abbreviations. +
      • +
      • + SciTE on GTK+ has improved .desktop file and make install support that may + lead to better integration with system shell. +
      • +
      • + Disabling of themed background drawing on GTK+ extended to all cases. +
      • +
      • + SciTE date formatting on Windows performed with the user setting rather than the + system setting. +
      • +
      • + GTK+ 2 redraw while scrolling fixed. +
      • +
      • + Recursive property definitions are safer, avoiding expansion when detected. +
      • +
      • + SciTE thread synchronization for scripts no longer uses HWND_MESSAGE + so is compatible with older versions of Windows. + Other Lua scripting bugs fixed. +
      • +
      • + SciTE on Windows localisation of menu accelerators changed to be compatible + with alternative UI themes. +
      • +
      • + SciTE on Windows full screen mode now fits better when menu different height + to title bar height. +
      • +
      • + SC_MARK_EMPTY marker is now invisible and does not change the background + colour. +
      • +
      • + Bug fixed in HTML lexer to allow use of <?xml in strings in scripts without + triggering xml mode. +
      • +
      • + Bug fixed in SciTE abbreviation expansion that could break indentation or crash. +
      • +
      • + Bug fixed when searching for a whole word string that ends one character before + end of document. +
      • +
      • + Drawing bug fixed when indicators drawn on wrapped lines. +
      • +
      • + Bug fixed when double clicking a hotspot. +
      • +
      • + Bug fixed where autocompletion would remove typed text if no match found. +
      • +
      • + Bug fixed where display does not scroll when inserting in long wrapped line. +
      • +
      • + Bug fixed where SCI_MARKERDELETEALL would only remove one of the markers + on a line that contained multiple markers with the same number. +
      • +
      • + Bug fixed where markers would move when converting line endings. +
      • +
      • + Bug fixed where SCI_LINEENDWRAP would move too far when line ends are visible. +
      • +
      • + Bugs fixed where calltips with unicode or other non-ASCII text would display + incorrectly. +
      • +
      • + Bug fixed in determining if at save point after undoing from save point and then + performing changes. +
      • +
      • + Bug fixed on GTK+ using unsupported code pages where extraneous text could + be drawn. +
      • +
      • + Bug fixed in drag and drop code on Windows where dragging from SciTE to + Firefox could hang both applications. +
      • +
      • + Crashing bug fixed on GTK+ when no font allocation succeeds. +
      • +
      • + Crashing bug fixed when autocompleting word longer than 1000 characters. +
      • +
      • + SciTE crashing bug fixed when both Find and Replace dialogs shown by disallowing + this situation. +
      • +
      +

      + Release 1.61 +

      +
        +
      • + Released on 29 May 2004. +
      • +
      • + Improvements to selection handling on GTK+. +
      • +
      • + SciTE on GTK+ 2.4 uses the improved file chooser which allows + file extension filters, multiple selection, and remembers favourite + directories. +
      • +
      • + SciTE Load Session and Save Session commands available on GTK+. +
      • +
      • + SciTE lists Lua Startup Script in Options menu when loaded. +
      • +
      • + In SciTE, OnUserListSelection can be implemented in Lua. +
      • +
      • + SciTE on Windows has a context menu on the file tabs. +
      • +
      • + SQL lexer allows '#' comments and optionally '\' quoting inside strings. +
      • +
      • + Mssql lexer improved. +
      • +
      • + AutoIt3 lexer updated. +
      • +
      • + Perl lexer recognizes regular expression use better. +
      • +
      • + Errorlist lexer understands Lua tracebacks and copes with findstr + output for file names that end with digits. +
      • +
      • + Drawing of lines on GTK+ improved and made more like Windows + without final point. +
      • +
      • + SciTE on GTK+ uses a high resolution window icon. +
      • +
      • + SciTE can be set to warn before loading files larger than a particular size. +
      • +
      • + SciTE Lua scripting bugs fixed included a crashing bug when using + an undefined function name that would go before first actual name. +
      • +
      • + SciTE bug fixed where a modified buffer was not saved if it was + the last buffer and was not current when the New command used. +
      • +
      • + SciTE monofont mode no longer affects line numbers. +
      • +
      • + Crashing bug in SciTE avoided by not allowing both the Find and Replace + dialogs to be visible at one time. +
      • +
      • + Crashing bug in SciTE fixed when Lua scripts were being run + concurrently. +
      • +
      • + Bug fixed that caused incorrect line number width in SciTE. +
      • +
      • + PHP folding bug fixed. +
      • +
      • + Regression fixed when setting word characters to not include + some of the standard word characters. +
      • +
      +

      + Release 1.60 +

      +
        +
      • + Released on 1 May 2004. +
      • +
      • + SciTE can be scripted using the Lua programming language. +
      • +
      • + command.mode is a better way to specify tool command options in SciTE. +
      • +
      • + Continuation markers can be displayed so that you can see which lines are wrapped. +
      • +
      • + Lexer for Gui4Cli language. +
      • +
      • + Lexer for Kix language. +
      • +
      • + Lexer for Specman E language. +
      • +
      • + Lexer for AutoIt3 language. +
      • +
      • + Lexer for APDL language. +
      • +
      • + Lexer for Bash language. Also reasonable for other Unix shells. +
      • +
      • + SciTE can load lexers implemented in external shared libraries. +
      • +
      • + Perl treats "." not as part of an identifier and interprets '/' and '->' + correctly in more circumstances. +
      • +
      • + PHP recognises variables within strings. +
      • +
      • + NSIS has properties "nsis.uservars" and "nsis.ignorecase". +
      • +
      • + MSSQL lexer adds keyword list for operators and stored procedures, + defines '(', ')', and ',' as operators and changes some other details. +
      • +
      • + Input method preedit window on GTK+ 2 may support some Asian languages. +
      • +
      • + Platform interface adds an extra platform-specific flag to Font::Create. + Used on wxWidgets to choose antialiased text display but may be used for + any task that a platform needs. +
      • +
      • + OnBeforeSave method added to Extension interface. +
      • +
      • + Scintilla methods that return strings can be called with a NULL pointer + to find out how long the string should be. +
      • +
      • + Visual Studio .NET project file now in VS .NET 2003 format so can not be used + directly in VS .NET 2002. +
      • +
      • + Scintilla can be built with GTK+ 2 on Windows. +
      • +
      • + Updated RPM spec for SciTE on GTK+. +
      • +
      • + GTK+ makefile for SciTE allows selection of destination directory, creates destination + directories and sets file modes and owners better. +
      • +
      • + Tab indents now go to next tab multiple rather than add tab size. +
      • +
      • + SciTE abbreviations now use the longest possible match rather than the shortest. +
      • +
      • + Autocompletion does not remove prefix when actioned with no choice selected. +
      • +
      • + Autocompletion cancels when moving beyond the start position, not at the start position. +
      • +
      • + SciTE now shows only calltips for functions that match exactly, not + those that match as a prefix. +
      • +
      • + SciTE can repair box comment sections where some lines were added without + the box comment middle line prefix. +
      • +
      • + Alt+ works in user.shortcuts on Windows. +
      • +
      • + SciTE on GTK+ enables replace in selection for rectangular selections. +
      • +
      • + Key bindings for command.shortcut implemented in a way that doesn't break + when the menus are localised. +
      • +
      • + Drawing of background on GTK+ faster as theme drawing disabled. +
      • +
      • + On GTK+, calltips are moved back onto the screen if they extend beyond the screen bounds. +
      • +
      • + On Windows, the Scintilla object is destroyed on WM_NCDESTROY rather than + WM_DESTROY which arrives earlier. This fixes some problems when Scintilla was subclassed. +
      • +
      • + The zorder switching feature removed due to number of crashing bugs. +
      • +
      • + Code for XPM images made more robust. +
      • +
      • + Bug fixed with primary selection on GTK+. +
      • +
      • + On GTK+ 2, copied or cut text can still be pasted after the Scintilla widget is destroyed. +
      • +
      • + Styling change not visible problem fixed when line was cached. +
      • +
      • + Bug in SciTE on Windows fixed where clipboard commands stopped working. +
      • +
      • + Crashing bugs in display fixed in line layout cache. +
      • +
      • + Crashing bug may be fixed on AMD64 processor on GTK+. +
      • +
      • + Rare hanging crash fixed in Python lexer. +
      • +
      • + Display bugs fixed with DBCS characters on GTK+. +
      • +
      • + Autocompletion lists on GTK+ 2 are not sorted by the ListModel as the + contents are sorted correctly by Scintilla. +
      • +
      • + SciTE fixed to not open extra untitled buffers with check.if.already.open. +
      • +
      • + Sizing bug fixed on GTK+ when window resized while unmapped. +
      • +
      • + Text drawing crashing bug fixed on GTK+ with non-Pango fonts and long strings. +
      • +
      • + Fixed some issues if characters are unsigned. +
      • +
      • + Fixes in NSIS support. +
      • +
      +

      + Release 1.59 +

      +
        +
      • + Released on 19 February 2004. +
      • +
      • + SciTE Options and Language menus reduced in length by commenting + out some languages. Languages can be enabled by editing the global + properties file. +
      • +
      • + Verilog language supported. +
      • +
      • + Lexer for Microsoft dialect of SQL. SciTE properties file available from extras page. +
      • +
      • + Perl lexer disambiguates '/' better. +
      • +
      • + NSIS lexer improved with a lexical class for numbers, option for ignoring case + of keywords, and folds only occurring when folding keyword first on line. +
      • +
      • + PowerBasic lexer improved with styles for constants and assembler and + folding improvements. +
      • +
      • + On GTK+, input method support only invoked for Asian languages and not + European languages as the old European keyboard code works better. +
      • +
      • + Scintilla can be requested to allocate a certain amount and so avoid repeated + reallocations and memory inefficiencies. SciTE uses this and so should require + less memory. +
      • +
      • + SciTE's "toggle current fold" works when invoked on child line as well as + fold header. +
      • +
      • + SciTE output pane scrolling can be set to not scroll back to start after + completion of command. +
      • +
      • + SciTE has a $(SessionPath) property. +
      • +
      • + SciTE on Windows can use VK_* codes for keys in user.shortcuts. +
      • +
      • + Stack overwrite bug fixed in SciTE's command to move to the end of a + preprocessor conditional. +
      • +
      • + Bug fixed where vertical selection appeared to select a different set of characters + then would be used by, for example, a copy. +
      • +
      • + SciTE memory leak fixed in fold state remembering. +
      • +
      • + Bug fixed where changing the style of some text outside the + standard StyleNeeded notification would not be visible. +
      • +
      • + On GTK+ 2 g_iconv is used in preference to iconv, as it is provided by GTK+ + so should avoid problems finding the iconv library. +
      • +
      • + On GTK+ fixed a style reference count bug. +
      • +
      • + Memory corruption bug fixed with GetSelText. +
      • +
      • + On Windows Scintilla deletes memory on WM_NCDESTROY rather than + the earlier WM_DESTROY to avoid problems when the window is subclassed. +
      • +
      +

      + Release 1.58 +

      +
        +
      • + Released on 11 January 2004. +
      • +
      • + Method to discover the currently highlighted element in an autocompletion list. +
      • +
      • + On GTK+, the lexers are now included in the scintilla.a library file. This + will require changes to the make files of dependent projects. +
      • +
      • + Octave support added alongside related Matlab language and Matlab support improved. +
      • +
      • + VB lexer gains an unterminated string state and 4 sets of keywords. +
      • +
      • + Ruby lexer handles $' correctly. +
      • +
      • + Error line handling improved for FORTRAN compilers from Absoft and Intel. +
      • +
      • + International input enabled on GTK+ 2 although there is no way to choose an + input method. +
      • +
      • + MultiplexExtension in SciTE allows multiple extensions to be used at once. +
      • +
      • + Regular expression replace interprets backslash expressions \a, \b, \f, \n, \r, \t, + and \v in the replacement value. +
      • +
      • + SciTE Replace dialog displays number of replacements made when Replace All or + Replace in Selection performed. +
      • +
      • + Localisation files may contain a translation.encoding setting which is used + on GTK+ 2 to automatically reencode the translation to UTF-8 so it will be + the localised text will be displayed correctly. +
      • +
      • + SciTE on GTK+ implements check.if.already.open. +
      • +
      • + Make files for Mac OS X made more robust. +
      • +
      • + Performance improved in SciTE when switching buffers when there + is a rectangular selection. +
      • +
      • + Fixed failure to display some text when wrapped. +
      • +
      • + SciTE crashes from Ctrl+Tab buffer cycling fixed. + May still be some rare bugs here. +
      • +
      • + Crash fixed when decoding an error message that appears similar to a + Borland error message. +
      • +
      • + Fix to auto-scrolling allows containers to implement enhanced double click selection. +
      • +
      • + Hang fixed in idle word wrap. +
      • +
      • + Crash fixed in hotspot display code.. +
      • +
      • + SciTE on Windows Incremental Search no longer moves caret back. +
      • +
      • + SciTE hang fixed when performing a replace with a find string that + matched zero length strings such as ".*". +
      • +
      • + SciTE no longer styles the whole file when saving buffer fold state + as that was slow. +
      • +
      +

      + Release 1.57 +

      +
        +
      • + Released on 27 November 2003. +
      • +
      • + SciTE remembers folding of each buffer. +
      • +
      • + Lexer for Erlang language. +
      • +
      • + Scintilla allows setting the set of white space characters. +
      • +
      • + Scintilla has 'stuttered' page movement commands to first move + to top or bottom within current visible lines before scrolling. +
      • +
      • + Scintilla commands for moving to end of words. +
      • +
      • + Incremental line wrap enabled on Windows. +
      • +
      • + SciTE PDF exporter produces output that is more compliant with reader + applications, is smaller and allows more configuration. + HTML exporter optimizes size of output files. +
      • +
      • + SciTE defines properties PLAT_WINNT and PLAT_WIN95 on the + corresponding platforms. +
      • +
      • + SciTE can adjust the line margin width to fit the largest line number. + The line.numbers property is split between line.margin.visible and + line.margin.width. +
      • +
      • + SciTE on GTK+ allows user defined menu accelerators. + Alt can be included in user.shortcuts. +
      • +
      • + SciTE Language menu can have items commented out. +
      • +
      • + SciTE on Windows Go to dialog allows choosing a column number as + well as a line number. +
      • +
      • + SciTE on GTK+ make file uses prefix setting more consistently. +
      • +
      • + Bug fixed that caused word wrapping to fail to display all text. +
      • +
      • + Crashing bug fixed in GTK+ version of Scintilla when using GDK fonts + and opening autocompletion. +
      • +
      • + Bug fixed in Scintilla SCI_GETSELTEXT where an extra NUL + was included at end of returned string +
      • +
      • + Crashing bug fixed in SciTE z-order switching implementation. +
      • +
      • + Hanging bug fixed in Perl lexer. +
      • +
      • + SciTE crashing bug fixed for using 'case' without argument in style definition. +
      • +
      +

      + Release 1.56 +

      +
        +
      • + Released on 25 October 2003. +
      • +
      • + Rectangular selection can be performed using the keyboard. + Greater programmatic control over rectangular selection. + This has caused several changes to key bindings. +
      • +
      • + SciTE Replace In Selection works on rectangular selections. +
      • +
      • + Improved lexer for TeX, new lexer for Metapost and other support for these + languages. +
      • +
      • + Lexer for PowerBasic. +
      • +
      • + Lexer for Forth. +
      • +
      • + YAML lexer improved to include error styling. +
      • +
      • + Perl lexer improved to correctly handle more cases. +
      • +
      • + Assembler lexer updated to support single-quote strings and fix some + problems. +
      • +
      • + SciTE on Windows can switch between buffers in order of use (z-order) rather + than static order. +
      • +
      • + SciTE supports adding an extension for "Open Selected Filename". + The openpath setting works on GTK+. +
      • +
      • + SciTE can Export as XML. +
      • +
      • + SciTE $(SelHeight) variable gives a more natural result for empty and whole line + selections. +
      • +
      • + Fixes to wrapping problems, such as only first display line being visible in some + cases. +
      • +
      • + Fixes to hotspot to only highlight when over the hotspot, only use background + colour when set and option to limit hotspots to a single line. +
      • +
      • + Small fixes to FORTRAN lexing and folding. +
      • +
      • + SQL lexer treats single quote strings as a separate class to double quote strings.. +
      • +
      • + Scintilla made compatible with expectations of container widget in GTK+ 2.3. +
      • +
      • + Fix to strip out pixmap ID when automatically choosing from an autocompletion + list with only one element. +
      • +
      • + SciTE bug fixed where UTF-8 files longer than 128K were gaining more than one + BOM. +
      • +
      • + Crashing bug fixed in SciTE on GTK+ where using "Stop Executing" twice leads + to all applications exiting. +
      • +
      • + Bug fixed in autocompletion scrolling on GTK+ 2 with a case sensitive list. + The ListBox::Sort method is no longer needed or available so platform + maintainers should remove it. +
      • +
      • + SciTE check.if.already.open setting removed from GTK+ version as unmaintained. +
      • +
      +

      + Release 1.55 +

      +
        +
      • + Released on 25 September 2003. +
      • +
      • + Fix a crashing bug in indicator display in Scintilla. +
      • +
      • + GTK+ version now defaults to building for GTK+ 2 rather than 1. +
      • +
      • + Mingw make file detects compiler version and avoids options + that are cause problems for some versions. +
      • +
      • + Large performance improvement on GTK+ 2 for long lines. +
      • +
      • + Incremental line wrap on GTK+. +
      • +
      • + International text entry works much better on GTK+ with particular + improvements for Baltic languages and languages that use 'dead' accents. + NUL key events such as those generated by some function keys, ignored. +
      • +
      • + Unicode clipboard support on GTK+. +
      • +
      • + Indicator type INDIC_BOX draws a rectangle around the text. +
      • +
      • + Clarion language support. +
      • +
      • + YAML language support. +
      • +
      • + MPT LOG language support. +
      • +
      • + On Windows, SciTE can switch buffers based on activation order rather + than buffer number. +
      • +
      • + SciTE save.on.deactivate saves all buffers rather than just the current buffer. +
      • +
      • + Lua lexer handles non-ASCII characters correctly. +
      • +
      • + Error lexer understands Borland errors with pathnames that contain space. +
      • +
      • + On GTK+ 2, autocompletion uses TreeView rather than deprecated CList. +
      • +
      • + SciTE autocompletion removed when expand abbreviation command used. +
      • +
      • + SciTE calltips support overloaded functions. +
      • +
      • + When Save fails in SciTE, choice offered to Save As. +
      • +
      • + SciTE message boxes on Windows may be moved to front when needed. +
      • +
      • + Indicators drawn correctly on wrapped lines. +
      • +
      • + Regular expression search no longer matches characters with high bit + set to characters without high bit set. +
      • +
      • + Hang fixed in backwards search in multi byte character documents. +
      • +
      • + Hang fixed in SciTE Mark All command when wrap around turned off. +
      • +
      • + SciTE Incremental Search no longer uses hot keys on Windows. +
      • +
      • + Calltips draw non-ASCII characters correctly rather than as arrows. +
      • +
      • + SciTE crash fixed when going to an error message with empty file name. +
      • +
      • + Bugs fixed in XPM image handling code. +
      • +
      +

      + Release 1.54 +

      +
        +
      • + Released on 12 August 2003. +
      • +
      • + SciTE on GTK+ 2.x can display a tab bar. +
      • +
      • + SciTE on Windows provides incremental search. +
      • +
      • + Lexer for PostScript. +
      • +
      • + Lexer for the NSIS scripting language. +
      • +
      • + New lexer for POV-Ray Scene Description Language + replaces previous implementation. +
      • +
      • + Lexer for the MMIX Assembler language. +
      • +
      • + Lexer for the Scriptol language. +
      • +
      • + Incompatibility: SQL keywords are specified in lower case rather than upper case. + SQL lexer allows double quoted strings. +
      • +
      • + Pascal lexer: character constants that start with '#' understood, + '@' only allowed within assembler blocks, + '$' can be the start of a number, + initial '.' in 0..constant not treated as part of a number, + and assembler blocks made more distinctive. +
      • +
      • + Lua lexer allows '.' in keywords. + Multi-line strings and comments can be folded. +
      • +
      • + CSS lexer handles multiple psuedoclasses. +
      • +
      • + Properties file folder works for INI file format. +
      • +
      • + Hidden indicator style allows the container to mark text within Scintilla + without there being any visual effect. +
      • +
      • + SciTE does not prompt to save changes when the buffer is empty and untitled. +
      • +
      • + Modification notifications caused by SCI_INSERTSTYLEDSTRING + now include the contents of the insertion. +
      • +
      • + SCI_MARKERDELETEALL deletes all the markers on a line + rather than just the first match. +
      • +
      • + Better handling of 'dead' accents on GTK+ 2 for languages + that use accented characters. +
      • +
      • + SciTE now uses value of output.vertical.size property. +
      • +
      • + Crash fixed in SciTE autocompletion on long lines. +
      • +
      • + Crash fixed in SciTE comment command on long lines. +
      • +
      • + Bug fixed with backwards regular expression search skipping + every second match. +
      • +
      • + Hang fixed with regular expression replace where both target and replacement were empty. +
      • +
      +

      + Release 1.53 +

      +
        +
      • + Released on 16 May 2003. +
      • +
      • + On GTK+ 2, encodings other than ASCII, Latin1, and Unicode are + supported for both display and input using iconv. +
      • +
      • + External lexers supported on GTK+/Linux. + External lexers must now be explicitly loaded with SCI_LOADLEXERLIBRARY + rather than relying upon a naming convention and automatic loading. +
      • +
      • + Support of Lout typesetting language. +
      • +
      • + Support of E-Scripts language used in the POL Ultima Online Emulator. +
      • +
      • + Scrolling and drawing performance on GTK+ enhanced, particularly for GTK+ 2.x + with an extra window for the text area avoiding conflicts with the scroll bars. +
      • +
      • + CopyText and CopyRange methods in Scintilla allow container to + easily copy to the system clipboard. +
      • +
      • + Line Copy command implemented and bound to Ctrl+Shift+T. +
      • +
      • + Scintilla APIs PositionBefore and PositionAfter can be used to iterate through + a document taking into account the encoding and multi-byte characters. +
      • +
      • + C++ folder can fold on the "} else {" line of an if statement by setting + fold.at.else property to 1. +
      • +
      • + C++ lexer allows an extra set of keywords. +
      • +
      • + Property names and thus abbreviations may be non-ASCII. +
      • +
      • + Removed attempt to load a file when setting properties that was + part of an old scripting experiment. +
      • +
      • + SciTE no longer warns about a file not existing when opening + properties files from the Options menu as there is a good chance + the user wants to create one. +
      • +
      • + Bug fixed with brace recognition in multi-byte encoded files where a partial + character matched a brace byte. +
      • +
      • + More protection against infinite loops or recursion with recursive property definitions. +
      • +
      • + On Windows, cursor will no longer disappear over margins in custom builds when + cursor resource not present. The Windows default cursor is displayed instead. +
      • +
      • + load.on.activate fixed in SciTE as was broken in 1.52. +
      • +
      +

      + Release 1.52 +

      +
        +
      • + Released on 17 April 2003. +
      • +
      • + Pango font support on GTK+ 2. + Unicode input improved on GTK+ 2. +
      • +
      • + Hotspot style implemented in Scintilla. +
      • +
      • + Small up and down arrows can be displayed in calltips and the container + is notified when the mouse is clicked on a calltip. + Normal and selected calltip text colours can be set. +
      • +
      • + POSIX compatibility flag in Scintilla regular expression search + interprets bare ( and ) as tagged sections. +
      • +
      • + Error message lexer tightened to yield fewer false matches. + Recognition of Lahey and Intel FORTRAN error formats. +
      • +
      • + Scintilla keyboard commands for moving to start and end of + screen lines rather than document lines, unless already there + where these keys move to the start or end of the document line. +
      • +
      • + Line joining command. +
      • +
      • + Lexer for POV-Ray. +
      • +
      • + Calltips on Windows are no longer clipped by the parent window. +
      • +
      • + Autocompletion lists are cancelled when focus leaves their parent window. +
      • +
      • + Move to next/previous empty line delimited paragraph key commands. +
      • +
      • + SciTE hang fixed with recursive property definitions by placing limit + on number of substitutions performed. +
      • +
      • + SciTE Export as PDF reenabled and works. +
      • +
      • + Added loadsession: command line command to SciTE. +
      • +
      • + SciTE option to quit application when last document closed. +
      • +
      • + SciTE option to ask user if it is OK to reload a file that has been + modified outside SciTE. +
      • +
      • + SciTE option to automatically save before running particular command tools + or to ask user or to not save. +
      • +
      • + SciTE on Windows 9x will write a Ctrl+Z to the process input pipe before + closing the pipe when running tool commands that take input. +
      • +
      • + Added a manifest resource to SciTE on Windows to enable Windows XP + themed UI. +
      • +
      • + SciTE calltips handle nested calls and other situations better. +
      • +
      • + CSS lexer improved. +
      • +
      • + Interface to platform layer changed - Surface initialisation now requires + a WindowID parameter. +
      • +
      • + Bug fixed with drawing or measuring long pieces of text on Windows 9x + by truncating the pieces. +
      • +
      • + Bug fixed with SciTE on GTK+ where a user shortcut for a visible character + inserted the character as well as executing the command. +
      • +
      • + Bug fixed where primary selection on GTK+ was reset by + Scintilla during creation. +
      • +
      • + Bug fixed where SciTE would close immediately on startup + when using save.session. +
      • +
      • + Crash fixed when entering '\' in LaTeX file. +
      • +
      • + Hang fixed when '#' last character in VB file. +
      • +
      • + Crash fixed in error message lexer. +
      • +
      • + Crash fixed when searching for long regular expressions. +
      • +
      • + Pressing return when nothing selected in user list sends notification with + empty text rather than random text. +
      • +
      • + Mouse debouncing disabled on Windows as it interfered with some + mouse utilities. +
      • +
      • + Bug fixed where overstrike mode inserted before rather than replaced last + character in document. +
      • +
      • + Bug fixed with syntax highlighting of Japanese text. +
      • +
      • + Bug fixed in split lines function. +
      • +
      • + Cosmetic fix to SciTE tab bar on Windows when window resized. + Focus sticks to either pane more consistently. +
      • +
      +

      + Release 1.51 +

      +
        +
      • + Released on 16 February 2003. +
      • +
      • + Two phase drawing avoids cutting off text that overlaps runs by drawing + all the backgrounds of a line then drawing all the text transparently. + Single phase drawing is an option. +
      • +
      • + Scintilla method to split lines at a particular width by adding new line + characters. +
      • +
      • + The character used in autocompletion lists to separate the text from the image + number can be changed. +
      • +
      • + The scrollbar range will automatically expand when the caret is moved + beyond the current range. + The scroll bar is updated when SCI_SETXOFFSET is called. +
      • +
      • + Mouse cursors on GTK+ improved to be consistent with other applications + and the Windows version. +
      • +
      • + Horizontal scrollbar on GTK+ now disappears in wrapped mode. +
      • +
      • + Scintilla on GTK+ 2: mouse wheel scrolling, cursor over scrollbars, focus, + and syntax highlighting now work. + gtk_selection_notify avoided for compatibility with GTK+ 2.2. +
      • +
      • + Fold margin colours can now be set. +
      • +
      • + SciTE can be built for GTK+ 2. +
      • +
      • + SciTE can optionally preserve the undo history over an automatic file reload. +
      • +
      • + Tags can optionally be case insensitive in XML and HTML. +
      • +
      • + SciTE on Windows handles input to tool commands in a way that should avoid + deadlock. Output from tools can be used to replace the selection. +
      • +
      • + SciTE on GTK+ automatically substitutes '|' for '/' in menu items as '/' + is used to define the menu hierarchy. +
      • +
      • + Optional buffer number in SciTE title bar. +
      • +
      • + Crash fixed in SciTE brace matching. +
      • +
      • + Bug fixed where automatic scrolling past end of document + flipped back to the beginning. +
      • +
      • + Bug fixed where wrapping caused text to disappear. +
      • +
      • + Bug fixed on Windows where images in autocompletion lists were + shown on the wrong item. +
      • +
      • + Crash fixed due to memory bug in autocompletion lists on Windows. +
      • +
      • + Crash fixed when double clicking some error messages. +
      • +
      • + Bug fixed in word part movement where sometimes no movement would occur. +
      • +
      • + Bug fixed on Windows NT where long text runs were truncated by + treating NT differently to 9x where there is a limitation. +
      • +
      • + Text in not-changeable style works better but there remain some cases where + it is still possible to delete text protected this way. +
      • +
      +

      + Release 1.50 +

      +
        +
      • + Released on 24 January 2003. +
      • +
      • + Autocompletion lists may have a per-item pixmap. +
      • +
      • + Autocompletion lists allow Unicode text on Windows. +
      • +
      • + Scintilla documentation rewritten. +
      • +
      • + Additional DBCS encoding support in Scintilla on GTK+ primarily aimed at + Japanese EUC encoding. +
      • +
      • + CSS (Cascading Style Sheets) lexer added. +
      • +
      • + diff lexer understands some more formats. +
      • +
      • + Fold box feature is an alternative way to show the structure of code. +
      • +
      • + Avenue lexer supports multiple keyword lists. +
      • +
      • + The caret may now be made invisible by setting the caret width to 0. +
      • +
      • + Python folder attaches comments before blocks to the next block rather + than the previous block. +
      • +
      • + SciTE openpath property on Windows searches a path for files that are + the subject of the Open Selected Filename command. +
      • +
      • + The localisation file name can be changed with the locale.properties property. +
      • +
      • + On Windows, SciTE can pipe the result of a string expression into a command line tool. +
      • +
      • + On Windows, SciTE's Find dialog has a Mark All button. +
      • +
      • + On Windows, there is an Insert Abbreviation command that allows a choice from + the defined abbreviations and inserts the selection into the abbreviation at the + position of a '|'. +
      • +
      • + Minor fixes to Fortran lexer. +
      • +
      • + fold.html.preprocessor decides whether to fold <? and ?>. + Minor improvements to PHP folding. +
      • +
      • + Maximum number of keyword lists allowed increased from 6 to 9. +
      • +
      • + Duplicate line command added with default assignment to Ctrl+D. +
      • +
      • + SciTE sets $(Replacements) to the number of replacements made by the + Replace All command. $(CurrentWord) is set to the word before the caret if the caret + is at the end of a word. +
      • +
      • + Opening a SciTE session now loads files in remembered order, sets the current file + as remembered, and moves the caret to the remembered line. +
      • +
      • + Bugs fixed with printing on Windows where line wrapping was causing some text + to not print. +
      • +
      • + Bug fixed with Korean Input Method Editor on Windows. +
      • +
      • + Bugs fixed with line wrap which would sometimes choose different break positions + after switching focus away and back. +
      • +
      • + Bug fixed where wheel scrolling had no effect on GTK+ after opening a fold. +
      • +
      • + Bug fixed with file paths containing non-ASCII characters on Windows. +
      • +
      • + Crash fixed with printing on Windows after defining pixmap marker. +
      • +
      • + Crash fixed in makefile lexer when first character on line was '='. +
      • +
      • + Bug fixed where local properties were not always being applied. +
      • +
      • + Ctrl+Keypad* fold command works on GTK+. +
      • +
      • + Hangs fixed in SciTE's Replace All command when replacing regular expressions '^' + or '$'. +
      • +
      • + SciTE monospace setting behaves more sensibly. +
      • +
      +

      + Release 1.49 +

      +
        +
      • + Released on 1 November 2002. +
      • +
      • + Unicode supported on GTK+. To perform well, this added a font cache to GTK+ + and to make that safe, a mutex is used. The mutex requires the application to link in + the threading library by evaluating `glib-config --libs gthread`. A Unicode locale + should also be set up by a call like setlocale(LC_CTYPE, "en_US.UTF-8"). + scintilla_release_resources function added to release mutex. +
      • +
      • + FORTRAN and assembler lexers added along with other support for these + languages in SciTE. +
      • +
      • + Ada lexer improved handling of based numbers, identifier validity and attributes + distinguished from character literals. +
      • +
      • + Lua lexer handles block comments and a deep level of nesting for literal strings + and block comments. +
      • +
      • + Errorlist lexer recognises PHP error messages. +
      • +
      • + Variant of the C++ lexer with case insensitive keywords + called cppnocase. Whitespace in preprocessor text handled more correctly. +
      • +
      • + Folder added for Perl. +
      • +
      • + Compilation with GCC 3.2 supported. +
      • +
      • + Markers can be pixmaps. +
      • +
      • + Lines are wrapped when printing. + Bug fixed which printed line numbers in different styles. +
      • +
      • + Text can be appended to end with AppendText method. +
      • +
      • + ChooseCaretX method added. +
      • +
      • + Vertical scroll bar can be turned off with SetVScrollBar method. +
      • +
      • + SciTE Save All command saves all buffers. +
      • +
      • + SciTE localisation compares keys case insensitively to make translations more flexible. +
      • +
      • + SciTE detects a utf-8 coding cookie "coding: utf-8" in first two + lines and goes into Unicode mode. +
      • +
      • + SciTE key bindings are definable. +
      • +
      • + SciTE Find in Files dialog can display directory browser to + choose directory to search. +
      • +
      • + SciTE enabling of undo and redo toolbar buttons improved. +
      • +
      • + SciTE on Windows file type filters in open dialog sorted. +
      • +
      • + Fixed crashing bug when using automatic tag closing in XML or HTML. +
      • +
      • + Fixed bug on Windows causing very long (>64K) lines to not display. +
      • +
      • + Fixed bug in backwards regular expression searching. +
      • +
      • + Fixed bug in calltips where wrong argument was highlighted. +
      • +
      • + Fixed bug in tab timmy feature when file has line feed line endings. +
      • +
      • + Fixed bug in compiling without INCLUDE_DEPRECATED_FEATURES + defined. +
      • +
      +

      + Release 1.48 +

      +
        +
      • + Released on 9 September 2002. +
      • +
      • + Improved Pascal lexer with context sensitive keywords + and separate folder which handles //{ and //} folding comments and + {$region} and {$end} folding directives. + The "case" statement now folds correctly. +
      • +
      • + C++ lexer correctly handles comments on preprocessor lines. +
      • +
      • + New commands for moving to beginning and end of display lines when in line + wrap mode. Key bindings added for these commands. +
      • +
      • + New marker symbols that look like ">>>" and "..." which can be used for + interactive shell prompts for Python. +
      • +
      • + The foreground and background colours of visible whitespace can be chosen + independent of the colours chosen for the lexical class of that whitespace. +
      • +
      • + Per line data optimised by using an exponential allocation scheme. +
      • +
      • + SciTE API file loading optimised. +
      • +
      • + SciTE for GTK+ subsystem 2 documented. The exit status of commands + is decoded into more understandable fields. +
      • +
      • + SciTE find dialog remembers previous find string when there is no selection. + Find in Selection button disabled when selection is rectangular as command + did not work. +
      • +
      • + Shift+Enter made equivalent to Enter to avoid users having to let go of + the shift key when typing. Avoids the possibility of entering single carriage + returns in a file that contains CR+LF line ends. +
      • +
      • + Autocompletion does not immediately disappear when the length parameter + to SCI_AUTOCSHOW is 0. +
      • +
      • + SciTE focuses on the editor pane when File | New executed and when the + output pane is closed with F8. Double clicking on a non-highlighted output + pane line selects the word under the cursor rather than seeking the next + highlighted line. +
      • +
      • + SciTE director interface implements an "askproperty" command. +
      • +
      • + SciTE's Export as LaTeX output improved. +
      • +
      • + Better choice of autocompletion displaying above the caret rather then + below when that is more sensible. +
      • +
      • + Bug fixed where context menu would not be completely visible if invoked + when cursor near bottom or left of screen. +
      • +
      • + Crashing bug fixed when displaying long strings on GTK+ caused failure of X server + by displaying long text in segments. +
      • +
      • + Crashing bug fixed on GTK+ when a Scintilla window was removed from its parent + but was still the selection owner. +
      • +
      • + Bug fixed on Windows in Unicode mode where not all characters on a line + were displayed when that line contained some characters not in ASCII. +
      • +
      • + Crashing bug fixed in SciTE on Windows with clearing output while running command. +
      • +
      • + Bug fixed in SciTE for GTK+ with command completion not detected when + no output was produced by the command. +
      • +
      • + Bug fixed in SciTE for Windows where menus were not shown translated. +
      • +
      • + Bug fixed where words failed to display in line wrapping mode with visible + line ends. +
      • +
      • + Bug fixed in SciTE where files opened from a session file were not closed. +
      • +
      • + Cosmetic flicker fixed when using Ctrl+Up and Ctrl+Down with some caret policies. +
      • +
      +

      + Release 1.47 +

      +
        +
      • + Released on 1 August 2002. +
      • +
      • + Support for GTK+ 2 in Scintilla. International input methods not supported + on GTK+2. +
      • +
      • + Line wrapping performance improved greatly. +
      • +
      • + New caret policy implementation that treats horizontal and vertical + positioning equivalently and independently. Old caret policy methods + deprecated and not all options work correctly with old methods. +
      • +
      • + Extra fold points for C, C++, Java, ... for fold comments //{ .. //} and + #if / #ifdef .. #endif and the #region .. #endregion feature of C#. +
      • +
      • + Scintilla method to find the height in pixels of a line. Currently returns the + same result for every line as all lines are same height. +
      • +
      • + Separate make file, scintilla_vc6.mak, for Scintilla to use Visual C++ + version 6 since main makefile now assumes VS .NET. + VS .NET project files available for combined Scintilla and + SciTE in scite/boundscheck. +
      • +
      • + SciTE automatically recognises Unicode files based + on their Byte Order Marks and switches to Unicode mode. + On Windows, where SciTE supports Unicode display, this + allows display of non European characters. + The file is saved back into the same character encoding unless + the user decides to switch using the File | Encoding menu. +
      • +
      • + Handling of character input changed so that a fillup character, typically '(' + displays a calltip when an autocompletion list was being displayed. +
      • +
      • + Multiline strings lexed better for C++ and Lua. +
      • +
      • + Regular expressions in JavaScript within hypertext files are lexed better. +
      • +
      • + On Windows, Scintilla exports a function called Scintilla_DirectFunction + that can be used the same as the function returned by GetDirectFunction. +
      • +
      • + Scintilla converts line endings of text obtained from the clipboard to + the current default line endings. +
      • +
      • + New SciTE property ensure.final.line.end can ensure that saved files + always end with a new line as this is required by some tools. + The ensure.consistent.line.ends property ensures all line ends are the + current default when saving files. + The strip.trailing.spaces property now works on the buffer so the + buffer in memory and the file on disk are the same after a save is performed. +
      • +
      • + The SciTE expand abbreviation command again allows '|' characters + in expansions to be quoted by using '||'. +
      • +
      • + SciTE on Windows can send data to the find tool through standard + input rather than using a command line argument to avoid problems + with quoting command line arguments. +
      • +
      • + The Stop Executing command in SciTE on Windows improved to send + a Ctrl+Z character to the tool. Better messages when stopping a tool. +
      • +
      • + Autocompletion can automatically "fill up" when one of a set of characters is + type with the autocomplete.<lexer>.fillups property. +
      • +
      • + New predefined properties in SciTE, SelectionStartColumn, SelectionStartLine, + SelectionEndColumn, SelectionEndLine can be used to integrate with other + applications. +
      • +
      • + Environment variables are available as properties in SciTE. +
      • +
      • + SciTE on Windows keeps status line more current. +
      • +
      • + Abbreviations work in SciTE on Linux when first opened. +
      • +
      • + File saving fixed in SciTE to ensure files are not closed when they can not be + saved because of file permissions. Also fixed a problem with buffers that + caused files to not be saved. +
      • +
      • + SciTE bug fixed where monospace mode not remembered when saving files. + Some searching options now remembered when switching files. +
      • +
      • + SciTE on Linux now waits on child termination when it shuts a child down + to avoid zombies. +
      • +
      • + SciTE on Linux has a Print menu command that defaults to invoking a2ps. +
      • +
      • + Fixed incorrect highlighting of indentation guides in SciTE for Python. +
      • +
      • + Crash fixed in Scintilla when calling GetText for 0 characters. +
      • +
      • + Exporting as LaTeX improved when processing backslashes and tabs + and setting up font. +
      • +
      • + Crash fixed in SciTE when exporting or copying as RTF. +
      • +
      • + SciTE session loading fixed to handle more than 10 files in session. +
      • +
      +

      + Release 1.46 +

      +
        +
      • + Released on 10 May 2002. +
      • +
      • + Set of lexers compiled into Scintilla can now be changed by adding and + removing lexer source files from scintilla/src and running LexGen.py. +
      • +
      • + SCN_ZOOM notification provided by Scintilla when user changes zoom level. + Method to determine width of strings in pixels so that elements can be sized + relative to text size. + SciTE changed to keep line number column displaying a given + number of characters. +
      • +
      • + The logical width of the document used to determine scroll bar range can be set. +
      • +
      • + Setting to allow vertical scrolling to display last line at top rather than + bottom of window. +
      • +
      • + Read-only mode improved to avoid changing the selection in most cases + when a modification is attempted. Drag and drop cursors display correctly + for read-only in some cases. +
      • +
      • + Visual C++ options in make files changed to suit Visual Studio .NET. +
      • +
      • + Scintilla.iface includes feature types for enumerations and lexers. +
      • +
      • + Lua lexer improves handling of literal strings and copes with nested literal strings. +
      • +
      • + Diff lexer changed to treat lines starting with "***" similarly to "---". + Symbolic names defined for lexical classes. +
      • +
      • + nncrontab lexer improved. +
      • +
      • + Turkish fonts (iso8859-9) supported on GTK+. +
      • +
      • + Automatic close tag feature for XML and HTML in SciTE. +
      • +
      • + Automatic indentation in SciTE improved. +
      • +
      • + Maximum number of buffers available in SciTE increased. May be up to 100 + although other restrictions on menu length limit the real maximum. +
      • +
      • + Save a Copy command added to SciTE. +
      • +
      • + Export as TeX command added to SciTE. +
      • +
      • + Export as HTML command in SciTE respects Use Monospaced Font and + background colour settings. +
      • +
      • + Compilation problem on Solaris fixed. +
      • +
      • + Order of files displayed for SciTE's previous and next menu and key commands + are now consistent. +
      • +
      • + Saving of MRU in recent file changed so files open when SciTE quit + are remembered. +
      • +
      • + More variants of ctags tags handled by Open Selected Filename in SciTE. +
      • +
      • + JavaScript embedded in XML highlighted again. +
      • +
      • + SciTE status bar updated after changing parameters in case they are being + displayed in status bar. +
      • +
      • + Crash fixed when handling some multi-byte languages. +
      • +
      • + Crash fixed when replacing end of line characters. +
      • +
      • + Bug in SciTE fixed in multiple buffer mode where automatic loading + turned on could lead to losing file contents. +
      • +
      • + Bug in SciTE on GTK+ fixed where dismissing dialogs with close box led to + those dialogs never being shown again. +
      • +
      • + Bug in SciTE on Windows fixed where position.tile with default positions + led to SciTE being positioned off-screen. +
      • +
      • + Bug fixed in read-only mode, clearing all deletes contraction state data + leading to it not being synchronized with text. +
      • +
      • + Crash fixed in SciTE on Windows when tab bar displayed. +
      • +
      +

      + Release 1.45 +

      +
        +
      • + Released on 15 March 2002. +
      • +
      • + Line layout cache implemented to improve performance by maintaining + the positioning of characters on lines. Can be set to cache nothing, + the line with the caret, the visible page or the whole document. +
      • +
      • + Support, including a new lexer, added for Matlab programs. +
      • +
      • + Lua folder supports folding {} ranges and compact mode. + Lua lexer styles floating point numbers in number style instead of + setting the '.' in operator style. + Up to 6 sets of keywords. + Better support for [[ although only works well + when all on one line. +
      • +
      • + Python lexer improved to handle floating point numbers that contain negative + exponents and that start with '.'. +
      • +
      • + When performing a rectangular paste, the caret now remains at the + insertion point. +
      • +
      • + On Windows with a wheel mouse, page-at-a-time mode is recognised. +
      • +
      • + Read-only mode added to SciTE with a property to initialise it and another property, + $(ReadOnly) available to show this mode in the status bar. +
      • +
      • + SciTE status bar can show the number of lines in the selection + with the $(SelHeight) property. +
      • +
      • + SciTE's "Export as HTML" command uses the current character set to produce + correct output for non-Western-European character sets, such as Russian. +
      • +
      • + SciTE's "Export as RTF" fixed to produce correct output when file contains '\'. +
      • +
      • + SciTE goto command accepts a column as well as a line. + If given a column, it selects the word at that column. +
      • +
      • + SciTE's Build, Compile and Go commands are now disabled if no + action has been assigned to them. +
      • +
      • + The Refresh button in the status bar has been removed from SciTE on Windows. +
      • +
      • + Bug fixed in line wrap mode where cursor up or down command did not work. +
      • +
      • + Some styling bugs fixed that were due to a compilation problem with + gcc and inline functions with same name but different code. +
      • +
      • + The way that lexers loop over text was changed to avoid accessing beyond the + end or setting beyond the end. May fix some bugs and make the code safer but + may also cause new bugs. +
      • +
      • + Bug fixed in HTML lexer's handling of SGML. +
      • +
      • + Bug fixed on GTK+/X where lines wider than 32767 pixels did not display. +
      • +
      • + SciTE bug fixed with file name generation for standard property files. +
      • +
      • + SciTE bug fixed with Open Selected Filename command when used with + file name and line number combination. +
      • +
      • + In SciTE, indentation and tab settings stored with buffers so maintained correctly + as buffers selected. + The properties used to initialise these settings can now be set separately for different + file patterns. +
      • +
      • + Thread safety improved on Windows with a critical section protecting the font + cache and initialisation of globals performed within Scintilla_RegisterClasses. + New Scintilla_ReleaseResources call provided to allow explicit freeing of resources + when statically bound into another application. Resources automatically freed + in DLL version. The window classes are now unregistered as part of resource + freeing which fixes bugs that occurred in some containers such as Internet Explorer. +
      • +
      • + 'make install' fixed on Solaris. +
      • +
      • + Bug fixed that could lead to a file being opened twice in SciTE. +
      • +
      +

      + Release 1.44 +

      +
        +
      • + Released on 4 February 2002. +
      • +
      • + Crashing bug fixed in Editor::Paint. +
      • +
      • + Lua lexer no longer treats '.' as a word character and + handles 6 keyword sets. +
      • +
      • + WordStartPosition and WordEndPosition take an onlyWordCharacters + argument. +
      • +
      • + SciTE option for simplified automatic indentation which repeats + the indentation of the previous line. +
      • +
      • + Compilation fix on Alpha because of 64 bit. +
      • +
      • + Compilation fix for static linking. +
      • +
      • + Limited maximum line length handled to 8000 characters as previous + value of 16000 was causing stack exhaustion crashes for some. +
      • +
      • + When whole document line selected, only the last display line gets + the extra selected rectangle at the right hand side rather than + every display line. +
      • +
      • + Caret disappearing bug fixed for the case that the caret was not on the + first display line of a document line. +
      • +
      • + SciTE bug fixed where untitled buffer containing text was sometimes + deleted without chance to save. +
      • +
      • + SciTE bug fixed where use.monospaced not working with + multiple buffers. +
      • +
      +

      + Release 1.43 +

      +
        +
      • + Released on 19 January 2002. +
      • +
      • + Line wrapping robustness and performance improved in Scintilla. +
      • +
      • + Line wrapping option added to SciTE for both edit and output panes. +
      • +
      • + Static linking on Windows handles cursor resource better. + Documentation of static linking improved. +
      • +
      • + Autocompletion has an option to delete any word characters after the caret + upon selecting an item. +
      • +
      • + FOX version identified by PLAT_FOX in Platform.h. +
      • +
      • + Calltips in SciTE use the calltip.<lexer>.word.characters setting to + correctly find calltips for functions that include characters like '$' which + is not normally considered a word character. +
      • +
      • + SciTE has a command to show help on itself which gets hooked up to displaying + SciTEDoc.html. +
      • +
      • + SciTE option calltip.<lexer>.end.definition to display help text on a + second line of calltip. +
      • +
      • + Fixed the handling of the Buffers menu on GTK+ to ensure current buffer + indicated and no warnings occur. + Changed some menu items on GTK+ version to be same as Windows version. +
      • +
      • + use.monospaced property for SciTE determines initial state of Use Monospaced Font + setting. +
      • +
      • + The SciTE Complete Symbol command now works when there are no word + characters before the caret, even though it is slow to display the whole set of + symbols. +
      • +
      • + Function names removed from SciTE's list of PHP keywords. The full list of + predefined functions is available from another web site mentioned on the + Extras page. +
      • +
      • + Crashing bug at startup on GTK+ for some configurations fixed. +
      • +
      • + Crashing bug on GTK+ on 64 bit platforms fixed. +
      • +
      • + Compilation problem with some compilers fixed in GTK+. +
      • +
      • + Japanese text entry improved on Windows 9x. +
      • +
      • + SciTE recent files directory problem on Windows when HOME and SciTE_HOME + environment variables not set is now the directory of the executable. +
      • +
      • + Session files no longer include untitled buffers. +
      • +
      +

      + Release 1.42 +

      +
        +
      • + Released on 24 December 2001. +
      • +
      • + Better localisation support including context menus and most messages. + Translations of the SciTE user interface available for Bulgarian, + French, German, Italian, Russian, and Turkish. +
      • +
      • + Can specify a character to use to indicate control characters + rather than having them displayed as mnemonics. +
      • +
      • + Scintilla key command for backspace that will not delete line + end characters. +
      • +
      • + Scintilla method to find start and end of words. +
      • +
      • + SciTE on GTK+ now supports the load.on.activate and save.on.deactivate + properties in an equivalent way to the Windows version. +
      • +
      • + The output pane of SciTE on Windows is now interactive so command line + utilities that prompt for input or confirmation can be used. +
      • +
      • + SciTE on Windows can choose directory for a "Find in Files" + command like the GTK+ version could. +
      • +
      • + SciTE can now load a set of API files rather than just one file. +
      • +
      • + ElapsedTime class added to Platform for accurate measurement of durations. + Used for debugging and for showing the user how long commands take in SciTE. +
      • +
      • + Baan lexer added. +
      • +
      • + In C++ lexer, document comment keywords no longer have to be at the start + of the line. +
      • +
      • + PHP lexer changed to match keywords case insensitively. +
      • +
      • + More shell keywords added. +
      • +
      • + SciTE support for VoiceXML added to xml.properties. +
      • +
      • + In SciTE the selection is not copied to the find field of the Search and Replace + dialogs if it contains end of line characters. +
      • +
      • + SciTE on Windows has a menu item to decide whether to respond to other + instances which are performing their check.if.already.open check. +
      • +
      • + SciTE accelerator key for Box Comment command changed to avoid problems + in non-English locales. +
      • +
      • + SciTE context menu includes Close command for the editor pane and + Hide command for the output pane. +
      • +
      • + output: command added to SciTE director interface to add text to the + output pane. The director interface can execute commands (such as tool + commands with subsystem set to 3) by sending a macro:run message. +
      • +
      • + SciTE on GTK+ will defer to the Window Manager for position if position.left or + position.top not set and for size if position.width or position.height not set. +
      • +
      • + SciTE on Windows has a position.tile property to place a second instance + to the right of the first. +
      • +
      • + Scintilla on Windows again supports EM_GETSEL and EM_SETSEL. +
      • +
      • + Problem fixed in Scintilla on Windows where control ID is no longer cached + as it could be changed by external code. +
      • +
      • + Problems fixed in SciTE on Windows when finding any other open instances at + start up when check.if.already.open is true. +
      • +
      • + Bugs fixed in SciTE where command strings were not always having + variables evaluated. +
      • +
      • + Bugs fixed with displaying partial double-byte and Unicode characters + in rectangular selections and at the edge when edge mode is EDGE_BACKGROUND. + Column numbers reported by GetColumn treat multiple byte characters as one column + rather than counting bytes. +
      • +
      • + Bug fixed with caret movement over folded lines. +
      • +
      • + Another bug fixed with tracking selection in secondary views when performing + modifications. +
      • +
      • + Horizontal scrolling and display of long lines optimised. +
      • +
      • + Cursor setting in Scintilla on GTK+ optimised. +
      • +
      • + Experimental changeable style attribute. + Set to false to make text read-only. + Currently only stops caret from being within not-changeable + text and does not yet stop deleting a range that contains + not-changeable text. + Can be used from SciTE by adding notchangeable to style entries. +
      • +
      • + Experimental line wrapping. + Currently has performance and appearence problems. +
      • +
      +

      + Release 1.41 +

      +
        +
      • + Released on 6 November 2001. +
      • +
      • + Changed Platform.h to not include platform headers. This lessens likelihood and impact of + name clashes from system headers and also speeds up compilation. + Renamed DrawText to DrawTextNoClip to avoid name clash. +
      • +
      • + Changed way word functions work to treat a sequence of punctuation as + a word. This is more sensible and also more compatible with other editors. +
      • +
      • + Cursor changes over the margins and selection on GTK+ platform. +
      • +
      • + SC_MARK_BACKGROUND is a marker that only changes the line's background colour. +
      • +
      • + Enhanced Visual Basic lexer handles character date and octal literals, + and bracketed keywords for VB.NET. There are two VB lexers, vb and vbscript + with type indication characters like ! and $ allowed at the end of identifiers + in vb but not vbscript. Lexer states now separate from those used for C++ and + names start with SCE_B. +
      • +
      • + Lexer added for Bullant language. +
      • +
      • + The horizontal scroll position, xOffset, is now exposed through the API. +
      • +
      • + The SCN_POSCHANGED notification is deprecated as it was causing confusion. + Use SCN_UPDATEUI instead. +
      • +
      • + Compilation problems fixed for some versions of gcc. +
      • +
      • + Support for WM_GETTEXT restored on Windows. +
      • +
      • + Double clicking on an autocompletion list entry works on GTK+. +
      • +
      • + Bug fixed with case insensitive sorts for autocompletion lists. +
      • +
      • + Bug fixed with tracking selection in secondary views when performing modifications. +
      • +
      • + SciTE's abbreviation expansion feature will now indent expansions to the current + indentation level if indent.automatic is on. +
      • +
      • + SciTE allows setting up of parameters to commands from a dialog and can also + show this dialog automatically to prompt for arguments when running a command. +
      • +
      • + SciTE's Language menu (formerly Options | Use Lexer) is now defined by the + menu.language property rather than being hardcoded. +
      • +
      • + The user interface of SciTE can be localised to a particular language by editing + a locale.properties file. +
      • +
      • + On Windows, SciTE will try to move to the front when opening a new file from + the shell and using check.if.already.open. +
      • +
      • + SciTE can display the file name and directory in the title bar in the form + "file @ directory" when title.full.path=2. +
      • +
      • + The SciTE time.commands property reports the time taken by a command as well + as its status when completed. +
      • +
      • + The SciTE find.files property is now a list separated by '|' characters and this list is + added into the Files pull down of the Find in Files dialog. +
      • +
      +

      + Release 1.40 +

      +
        +
      • + Released on 23 September 2001. +
      • +
      • + Removal of emulation of Win32 RichEdit control in core of Scintilla. + This change may be incompatible with existing client code. + Some emulation still done in Windows platform layer. +
      • +
      • + SGML support in the HTML/XML lexer. +
      • +
      • + SciTE's "Stop Executing" command will terminate GUI programs on + Windows NT and Windows 2000. +
      • +
      • + StyleContext class helps construct lexers that are simple and accurate. + Used in the C++, Eiffel, and Python lexers. +
      • +
      • + Clipboard operations in GTK+ version convert between platform '\n' line endings and + currently chosen line endings. +
      • +
      • + Any character in range 0..255 can be used as a marker. + This can be used to support numbered bookmarks, for example. +
      • +
      • + The default scripting language for ASP can be set. +
      • +
      • + New lexer and other support for crontab files used with the nncron scheduler. +
      • +
      • + Folding of Python improved. +
      • +
      • + The ` character is treated as a Python operator. +
      • +
      • + Line continuations ("\" at end of line) handled inside Python strings. +
      • +
      • + More consistent handling of line continuation ('\' at end of line) in + C++ lexer. + This fixes macro definitions that span more than one line. +
      • +
      • + C++ lexer can understand Doxygen keywords in doc comments. +
      • +
      • + SciTE on Windows allows choosing to open the "open" dialog on the directory + of the current file rather than in the default directory. +
      • +
      • + SciTE on Windows handles command line arguments in "check.if.already.open" + correctly when the current directory of the new instance is different to the + already open instance of SciTE. +
      • +
      • + "cwd" command (change working directory) defined for SciTE director interface. +
      • +
      • + SciTE "Export As HTML" produces better, more compliant, and shorter files. +
      • +
      • + SciTE on Windows allows several options for determining default file name + for exported files. +
      • +
      • + Automatic indentation of Python in SciTE fixed. +
      • +
      • + Exported HTML can support folding. +
      • +
      • + Bug fixed in SCI_GETTEXT macro command of director interface. +
      • +
      • + Cursor leak fixed on GTK+. +
      • +
      • + During SciTE shutdown, "identity" messages are no longer sent over the director interface. +
      • +
      +

      + Release 1.39 +

      +
        +
      • + Released on 22 August 2001. +
      • +
      • + Windows version requires msvcrt.dll to be available so will not work + on original Windows 95 version 1. The msvcrt.dll file is installed + by almost everything including Internet Explorer so should be available. +
      • +
      • + Flattened tree control style folding margin. The SciTE fold.plus option is + now fold.symbols and has more values for the new styles. +
      • +
      • + Mouse dwell events are generated when the user holds the mouse steady + over Scintilla. +
      • +
      • + PositionFromPointClose is like PositionFromPoint but returns + INVALID_POSITION when point outside window or after end of line. +
      • +
      • + Input of Hungarian and Russian characters in GTK+ version works by + truncating input to 8 bits if in the range of normal characters. +
      • +
      • + Better choices for font descriptors on GTK+ for most character sets. +
      • +
      • + GTK+ Scintilla is destroyed upon receiving destroy signal rather than + destroy_event signal. +
      • +
      • + Style setting that force upper or lower case text. +
      • +
      • + Case-insensitive autocompletion lists work correctly. +
      • +
      • + Keywords can be prefix based so ^GTK_ will treat all words that start + with GTK_ as keywords. +
      • +
      • + Horizontal scrolling can be jumpy rather than gradual. +
      • +
      • + GetSelText places a '\0' in the buffer if the selection is empty.. +
      • +
      • + EnsureVisible split into two methods EnsureVisible which will not scroll to show + the line and EnsureVisibleEnforcePolicy which may scroll. +
      • +
      • + Python folder has options to fold multi-line comments and triple quoted strings. +
      • +
      • + C++ lexer handles keywords before '.' like "this.x" in Java as keywords. + Compact folding mode option chooses whether blank lines after a structure are + folded with that structure. Second set of keywords with separate style supported. +
      • +
      • + Ruby lexer handles multi-line comments. +
      • +
      • + VB has folder. +
      • +
      • + PHP lexer has an operator style, handles "<?" and "?>" inside strings + and some comments. +
      • +
      • + TCL lexer which is just an alias for the C++ lexer so does not really + understand TCL syntax. +
      • +
      • + Error lines lexer has styles for Lua error messages and .NET stack traces. +
      • +
      • + Makefile lexer has a target style. +
      • +
      • + Lua lexer handles some [[]] string literals. +
      • +
      • + HTML and XML lexer have a SCE_H_SGML state for tags that + start with "<!". +
      • +
      • + Fixed Scintilla bugs with folding. When modifications were performed near + folded regions sometimes no unfolding occurred when it should have. Deleting a + fold causing character sometimes failed to update fold information correctly. +
      • +
      • + Better support for Scintilla on GTK+ for Win32 including separate + PLAT_GTK_WIN32 definition and correct handling of rectangular selection + with clipboard operations. +
      • +
      • + SciTE has a Tools | Switch Pane (Ctrl+F6) command to switch focus between + edit and output panes. +
      • +
      • + SciTE option output.scroll allows automatic scrolling of output pane to + be turned off. +
      • +
      • + Commands can be typed into the SciTE output pane similar to a shell window. +
      • +
      • + SciTE properties magnification and output magnification set initial zoom levels. +
      • +
      • + Option for SciTE comment block command to place comments at start of line. +
      • +
      • + SciTE for Win32 has an option to minimize to the tray rather than the task bar. +
      • +
      • + Close button on SciTE tool bar for Win32. +
      • +
      • + SciTE compiles with GCC 3.0. +
      • +
      • + SciTE's automatic indentation of C++ handles braces without preceding keyword + correctly. +
      • +
      • + Bug fixed with GetLine method writing past the end of where it should. +
      • +
      • + Bug fixed with mouse drag automatic scrolling when some lines were folded. +
      • +
      • + Bug fixed because caret XEven setting was inverted. +
      • +
      • + Bug fixed where caret was initially visible even though window was not focussed. +
      • +
      • + Bug fixed where some file names could end with "\\" which caused slow + downs on Windows 9x. +
      • +
      • + On Win32, SciTE Replace dialog starts with focus on replacement text. +
      • +
      • + SciTE Go to dialog displays correct current line. +
      • +
      • + Fixed bug with SciTE opening multiple files at once. +
      • +
      • + Fixed bug with Unicode key values reported to container truncated. +
      • +
      • + Fixed bug with unnecessary save point notifications. +
      • +
      • + Fixed bugs with indenting and unindenting at start of line. +
      • +
      • + Monospace Font setting behaves more consistently. +
      • +
      +

      + Release 1.38 +

      +
        +
      • + Released on 23 May 2001. +
      • +
      • + Loadable lexer plugins on Windows. +
      • +
      • + Ruby lexer and support. +
      • +
      • + Lisp lexer and support. +
      • +
      • + Eiffel lexer and support. +
      • +
      • + Modes for better handling of Tab and BackSpace keys within + indentation. Mode to avoid autocompletion list cancelling when + there are no viable matches. +
      • +
      • + ReplaceTarget replaced with two calls ReplaceTarget + (which is incompatible with previous ReplaceTarget) and + ReplaceTargetRE. Both of these calls have a count first + parameter which allows using strings containing nulls. + SearchInTarget and SetSearchFlags functions allow + specifying a search in several simple steps which helps + some clients which can not create structs or pointers easily. +
      • +
      • + Asian language input through an Input Method Editor works + on Windows 2000. +
      • +
      • + On Windows, control characters can be entered through use of + the numeric keypad in conjunction with the Alt key. +
      • +
      • + Document memory allocation changed to grow exponentially + which reduced time to load a 30 Megabyte file from + 1000 seconds to 25. Change means more memory may be used. +
      • +
      • + Word part movement keys now handled in Scintilla rather than + SciTE. +
      • +
      • + Regular expression '^' and '$' work more often allowing insertion + of text at start or end of line with a replace command. + Backslash quoted control characters \a, \b, \f, \t, and \v + recognised within sets. +
      • +
      • + Session files for SciTE. +
      • +
      • + Export as PDF command hidden in SciTE as it often failed. + Code still present so can be turned on by those willing to cope. +
      • +
      • + Bug fixed in HTML lexer handling % before > as end ASP + even when no start ASP encountered. + Bug fixed when scripts ended with a quoted string and + end tag was not seen. +
      • +
      • + Bug fixed on Windows where context menu key caused menu to + appear in corner of screen rather than within window. +
      • +
      • + Bug fixed in SciTE's Replace All command not processing + whole file when replace string longer than search string. +
      • +
      • + Bug fixed in SciTE's MRU list repeating entries if Ctrl+Tab + used when all entries filled. +
      • +
      • + ConvertEOLs call documentation fixed. +
      • +
      +

      + Release 1.37 +

      +
        +
      • + Released on 17 April 2001. +
      • +
      • + Bug fixed with scroll bars being invisible on GTK+ 1.2.9. +
      • +
      • + Scintilla and SciTE support find and replace using simple regular + expressions with tagged expressions. SciTE supports C '\' escapes + in the Find and Replace dialogs. + Replace in Selection available in SciTE. +
      • +
      • + Scintilla has a 'target' feature for replacing code rapidly without + causing display updates. +
      • +
      • + Scintilla and SciTE on GTK+ support file dropping from file managers + such as Nautilus and gmc. Files or other URIs dropped on Scintilla + result in a URIDropped notification. +
      • +
      • + Lexers may have separate Lex and Fold functions. +
      • +
      • + Lexer infrastructure improved to allow for plug in lexers and for referring + to lexers by name rather than by ID. +
      • +
      • + Ada lexer and support added. +
      • +
      • + Option in both Scintilla and SciTE to treat both left and right margin + as equally important when repositioning visible area in response to + caret movement. Default is to prefer visible area positioning which + minimises the horizontal scroll position thus favouring the left margin. +
      • +
      • + Caret line highlighting. +
      • +
      • + Commands to delete from the caret to the end of line and + from the caret to the beginning of line. +
      • +
      • + SciTE has commands for inserting and removing block comments and + for inserting stream comments. +
      • +
      • + SciTE Director interface uses C++ '\' escapes to send control characters. +
      • +
      • + SciTE Director interface adds more commands including support for macros. +
      • +
      • + SciTE has menu options for recording and playing macros which are visible + when used with a companion program that supports these features. +
      • +
      • + SciTE has an Expand Abbreviation command. + Abbreviations are stored in a global abbrev.properties file. +
      • +
      • + SciTE has a Full Screen command to switch between a normal window + size and using the full screen. On Windows, the menu bar can be turned + off when in full screen mode. +
      • +
      • + SciTE has a Use monospaced font command to switch between the normal + set of fonts and one size of a particular fixed width font. +
      • +
      • + SciTE's use of tabs can be controlled for particular file names + as well as globally. +
      • +
      • + The contents of SciTE's status bar can be defined by a property and + include variables. On Windows, several status bar definitions can be active + with a click on the status bar cycling through them. +
      • +
      • + Copy as RTF command in SciTE on Windows to allow pasting + styled text into word processors. +
      • +
      • + SciTE can allow the use of non-alphabetic characters in + Complete Symbol lists and can automatically display this autocompletion + list when a trigger character such as '.' is typed. + Complete word can be set to pop up when the user is typing a word and + there is only one matching word in the document. +
      • +
      • + SciTE lists the imported properties files on a menu to allow rapid + access to them. +
      • +
      • + SciTE on GTK+ improvements to handling accelerator keys and focus + in dialogs. Message boxes respond to key presses without the Alt key as + they have no text entries to accept normal keystrokes. +
      • +
      • + SciTE on GTK+ sets the application icon. +
      • +
      • + SciTE allows setting the colours used to indicate the current + error line. +
      • +
      • + Variables within PHP strings have own style. Keyword list updated. +
      • +
      • + Keyword list for Lua updated for Lua 4.0. +
      • +
      • + Bug fixed in rectangular selection where rectangle still appeared + selected after using cursor keys to move caret. +
      • +
      • + Bug fixed in C++ lexer when deleting a '{' controlling a folded range + led to that range becoming permanently invisible. +
      • +
      • + Bug fixed in Batch lexer where comments were not recognised. +
      • +
      • + Bug fixed with undo actions coalescing into steps incorrectly. +
      • +
      • + Bug fixed with Scintilla on GTK+ positioning scroll bars 1 pixel + over the Scintilla window leading to their sides being chopped off. +
      • +
      • + Bugs fixed in SciTE when doing some actions led to the start + or end of the file being displayed rather than the current location. +
      • +
      • + Appearance of calltips fixed to look like document text including + any zoom factor. Positioned to be outside current line even when + multiple fonts and sizes used. +
      • +
      • + Bug fixed in Scintilla macro support where typing Enter caused both a newline + command and newline character insertion to be recorded. +
      • +
      • + Bug fixed in SciTE on GTK+ where focus was moving + between widgets incorrectly. +
      • +
      • + Bug fixed with fold symbols sometimes not updating when + the text changed. +
      • +
      • + Bugs fixed in SciTE's handling of folding commands. +
      • +
      • + Deprecated undo collection enumeration removed from API. +
      • +
      +

      + Release 1.36 +

      +
        +
      • + Released on 1 March 2001. +
      • +
      • + Scintilla supports GTK+ on Win32. +
      • +
      • + Some untested work on making Scintilla and SciTE 64 bit compatible. + For users on GTK+ this requires including Scintilla.h before + ScintillaWidget.h. +
      • +
      • + HTML lexer allows folding HTML. +
      • +
      • + New lexer for Avenue files which are used in the ESRI ArcView GIS. +
      • +
      • + DOS Batch file lexer has states for '@', external commands, variables and + operators. +
      • +
      • + C++ lexer can fold comments of /* .. */ form. +
      • +
      • + Better disabling of popup menu items in Scintilla when in read-only mode. +
      • +
      • + Starting to move to Doxygen compatible commenting. +
      • +
      • + Director interface on Windows enables another application to control SciTE. +
      • +
      • + Opening SciTE on Windows 9x sped up greatly for some cases. +
      • +
      • + The command.build.directory property allows SciTE to run the build + command in a different directory to the source files. +
      • +
      • + SciTE on Windows allows setting foreground and background colours + for printed headers and footers. +
      • +
      • + Bug fixed in finding calltips in SciTE which led to no calltips for some identifiers. +
      • +
      • + Documentation added for lexers and for the extension and director interfaces. +
      • +
      • + SciTE menus rearranged with new View menu taking over some of the items that + were under the Options menu. Clear All Bookmarks command added. +
      • +
      • + Clear Output command in SciTE. +
      • +
      • + SciTE on Windows gains an Always On Top command. +
      • +
      • + Bug fixed in SciTE with attempts to define properties recursively. +
      • +
      • + Bug fixed in SciTE properties where only one level of substitution was done. +
      • +
      • + Bug fixed in SciTE properties where extensions were not being + matched in a case insensitive manner. +
      • +
      • + Bug fixed in SciTE on Windows where the Go to dialog displays the correct + line number. +
      • +
      • + In SciTE, if fold.on.open set then switching buffers also performs fold. +
      • +
      • + Bug fixed in Scintilla where ensuring a line was visible in the presence of folding + operated on the document line instead of the visible line. +
      • +
      • + SciTE command line processing modified to operate on arguments in order and in + two phases. First any arguments before the first file name are processed, then the + UI is opened, then the remaining arguments are processed. Actions defined for the + Director interface (currently only "open") may also be used on the command line. + For example, "SciTE -open:x.txt" will start SciTE and open x.txt. +
      • +
      • + Numbered menu items SciTE's Buffers menu and the Most Recently Used portion + of the File menu go from 1..0 rather than 0..9. +
      • +
      • + The tab bar in SciTE for Windows has numbers. + The tab.hide.one option hides the tab bar until there is more than one buffer open. +
      • +
      +

      + Release 1.35 +

      +
        +
      • + Released on 29 January 2001. +
      • +
      • + Rewritten and simplified widget code for the GTK+ version to enhance + solidity and make more fully compliant with platform norms. This includes more + normal handling of keystrokes so they are forwarded to containers correctly. +
      • +
      • + User defined lists can be shown. +
      • +
      • + Many fixes to the Perl lexer. +
      • +
      • + Pascal lexer handles comments more correctly. +
      • +
      • + C/C++/Java/JavaScipt lexer has a state for line doc comments. +
      • +
      • + Error output lexer understands Sun CC messages. +
      • +
      • + Make file lexer has variable, preprocessor, and operator states. +
      • +
      • + Wider area given to an italics character that is at the end of a line to prevent it + being cut off. +
      • +
      • + Call to move the caret inside the currently visible area. +
      • +
      • + Paste Rectangular will space fill on the left hand side of the pasted text as + needed to ensure it is kept rectangular. +
      • +
      • + Cut and Paste Rectangular does nothing in read-only mode. +
      • +
      • + Undo batching changed so that a paste followed by typing creates two undo actions.. +
      • +
      • + A "visibility policy" setting for Scintilla determines which range of lines are displayed + when a particular line is moved to. Also exposed as a property in SciTE. +
      • +
      • + SciTE command line allows property settings. +
      • +
      • + SciTE has a View Output command to hide or show the output pane. +
      • +
      • + SciTE's Edit menu has been split in two with searching commands moved to a + new Search menu. Find Previous and Previous Bookmark are in the Search menu. +
      • +
      • + SciTE on Windows has options for setting print margins, headers and footers. +
      • +
      • + SciTE on Windows has tooltips for toolbar. +
      • +
      • + SciTE on GTK+ has properties for setting size of file selector. +
      • +
      • + Visual and audio cues in SciTE on Windows enhanced. +
      • +
      • + Fixed performance problem in SciTE for GTK+ by dropping the extra 3D + effect on the content windows. +
      • +
      • + Fixed problem in SciTE where choosing a specific lexer then meant + that no lexer was chosen when files opened. +
      • +
      • + Default selection colour changed to be visible on low colour displays. +
      • +
      • + Fixed problems with automatically reloading changed documents in SciTE on + Windows. +
      • +
      • + Fixed problem with uppercase file extensions in SciTE. +
      • +
      • + Fixed some problems when using characters >= 128, some of which were being + incorrectly treated as spaces. +
      • +
      • + Fixed handling multiple line tags, non-inline scripts, and XML end tags /> in HTML/XML lexer. +
      • +
      • + Bookmarks in SciTE no longer disappear when switching between buffers. +
      • +
      +

      + Release 1.34 +

      +
        +
      • + Released on 28 November 2000. +
      • +
      • + Pascal lexer. +
      • +
      • + Export as PDF in SciTE. +
      • +
      • + Support for the OpenVMS operating system in SciTE. +
      • +
      • + SciTE for GTK+ can check for another instance of SciTE + editing a file and switch to it rather than open a second instance + on one file. +
      • +
      • + Fixes to quoting and here documents in the Perl lexer. +
      • +
      • + SciTE on Windows can give extra visual and audio cues when a + warning is shown or find restarts from beginning of file. +
      • +
      • + Open Selected Filename command in SciTE. Also understands some + warning message formats. +
      • +
      • + Wider area for line numbers when printing. +
      • +
      • + Better scrolling performance on GTK+. +
      • +
      • + Fixed problem where rectangles with negative coordinates were + invalidated leading to trouble with platforms that use + unsigned coordinates. +
      • +
      • + GTK+ Scintilla uses more compliant signalling code so that keyboard + events should propagate to containers. +
      • +
      • + Bug fixed with opening full or partial paths. +
      • +
      • + Improved handling of paths in error messages in SciTE. +
      • +
      • + Better handling of F6 in SciTE. +
      • +
      +

      + Release 1.33 +

      +
        +
      • + Released on 6 November 2000. +
      • +
      • + XIM support for the GTK+ version of Scintilla ensures that more non-English + characters can be typed. +
      • +
      • + Caret may be 1, 2, or 3 pixels wide. +
      • +
      • + Cursor may be switched to wait image during lengthy processing. +
      • +
      • + Scintilla's internal focus flag is exposed for clients where focus is handled in + complex ways. +
      • +
      • + Error status defined for Scintilla to hold indication that an operation failed and the reason + for that failure. No detection yet implemented but clients may start using the interface + so as to be ready for when it does. +
      • +
      • + Context sensitive help in SciTE. +
      • +
      • + CurrentWord property available in SciTE holding the value of the word the + caret is within or near. +
      • +
      • + Apache CONF file lexer. +
      • +
      • + Changes to Python lexer to allow 'as' as a context sensitive keyword and the + string forms starting with u, r, and ur to be recognised. +
      • +
      • + SCN_POSCHANGED notification now working and SCN_PAINTED notification added. +
      • +
      • + Word part movement commands for cursoring between the parts of reallyLongCamelIdentifiers and + other_ways_of_making_words. +
      • +
      • + When text on only one line is selected, Shift+Tab moves to the previous tab stop. +
      • +
      • + Tab control available for Windows version of SciTE listing all the buffers + and making it easy to switch between them. +
      • +
      • + SciTE can be set to automatically determine the line ending type from the contents of a + file when it is opened. +
      • +
      • + Dialogs in GTK+ version of SciTE made more modal and have accelerator keys. +
      • +
      • + Find in Files command in GTK+ version of SciTE allows choice of directory. +
      • +
      • + On Windows, multiple files can be opened at once. +
      • +
      • + SciTE source broken up into more files. +
      • +
      • + Scintilla headers made safe for C language, not just C++. +
      • +
      • + New printing modes - force background to white and force default background to white. +
      • +
      • + Automatic unfolding not occurring when Enter pressed at end of line bug fixed. +
      • +
      • + Bugs fixed in line selection. +
      • +
      • + Bug fixed with escapes in PHP strings in the HTML lexer. +
      • +
      • + Bug fixed in SciTE for GTK+ opening files when given full paths. +
      • +
      • + Bug fixed in autocompletion where user backspaces into existing text. +
      • +
      • + Bugs fixed in opening files and ensuring they are saved before running. + A case bug also fixed here. +
      • +
      +

      + Release 1.32 +

      +
        +
      • + Released on 8 September 2000. +
      • +
      • + Fixes bugs in complete word and related code. Protection against a bug when + receiving a bad argument. +
      • +
      +

      + Release 1.31 +

      +
        +
      • + Released on 6 September 2000. +
      • +
      • + Scintilla is available as a COM control from the scintillactrl module in CVS. +
      • +
      • + Style setting to underline text. Exposed in SciTE as "underlined". +
      • +
      • + Style setting to make text invisible. +
      • +
      • + SciTE has an extensibility interface that can be used to implement features such as + a scripting language or remote control. An example use of this is the extlua module + available from CVS which allows SciTE to be scripted in Lua. +
      • +
      • + Many minor fixes to all of the lexers. +
      • +
      • + New lexer for diff and patch files. +
      • +
      • + Error message lexer understands Perl error messages. +
      • +
      • + C/C++/Java lexer now supports C#, specifically verbatim strings and + @ quoting of identifiers that are the same as keywords. SciTE has + a set of keywords for C# and a build command set up for C#. +
      • +
      • + Scintilla property to see whether in overtype or insert state. +
      • +
      • + PosChanged notification fired when caret moved. +
      • +
      • + Comboboxes in dialogs in SciTE on Windows can be horizontally scrolled. +
      • +
      • + Autocompletion and calltips can treat the document as case sensitive or + case insensitive. +
      • +
      • + Autocompletion can be set to automatically choose the only + element in a single element list. +
      • +
      • + Set of characters that automatically complete an autocompletion list + can be set. +
      • +
      • + SciTE command to display calltip - useful when dropped because of + editing. +
      • +
      • + SciTE has a Revert command to go back to the last saved version. +
      • +
      • + SciTE has an Export as RTF command. Save as HTML is renamed + to Export as HTML and is located on the Export sub menu. +
      • +
      • + SciTE command "Complete Word" searches document for any + words starting with characters before caret. +
      • +
      • + SciTE options for changing aspects of the formatting of files exported + as HTML or RTF. +
      • +
      • + SciTE "character.set" option for choosing the character + set for all fonts. +
      • +
      • + SciTE has a "Toggle all folds" command. +
      • +
      • + The makefiles have changed. The makefile_vc and + makefile_bor files in scintilla/win32 and scite/win32 have been + merged into scintilla/win32/scintilla.mak and scite/win32/scite.mak. + DEBUG may be defined for all make files and this will turn on + assertions and for some make files will choose other debugging + options. +
      • +
      • + To make debugging easier and allow good use of BoundsChecker + there is a Visual C++ project file in scite/boundscheck that builds + all of Scintilla and SciTE into one executable. +
      • +
      • + The size of the SciTE output window can be set with the + output.horizontal.size and output.vertical.size settings. +
      • +
      • + SciTE status bar indicator for insert or overwrite mode. +
      • +
      • + Performance improvements to autocompletion and calltips. +
      • +
      • + A caret redraw problem when undoing is fixed. +
      • +
      • + Crash with long lines fixed. +
      • +
      • + Bug fixed with merging markers when lines merged. +
      • +
      +

      + Release 1.30 +

      +
        +
      • + Released on 26 July 2000. +
      • +
      • + Much better support for PHP which is now an integral part of the HTML support. +
      • +
      • + Start replacement of Windows-specific APIs with cross platform APIs. + In 1.30, the new APIs are introduced but the old APIs are still available. + For the GTK+ version, may have to include "WinDefs.h" explicitly to + use the old APIs. +
      • +
      • + "if" and "import" statements in SciTE properties files allows modularisation into + language-specific properties files and choices based upon platform. + This means that SciTE is delivered with 9 language-specific properties files + as well as the standard SciTEGlobal.properties file. +
      • +
      • + Much lower resource usage on Windows 9x. +
      • +
      • + "/p" option in SciTE on Windows for printing a file and then exiting. +
      • +
      • + Options for printing with inverted brightness (when the screen is set to use + a dark background) and to force black on white printing. +
      • +
      • + Option for printing magnified or miniaturised from screen settings. +
      • +
      • + In SciTE, Ctrl+F3 and Ctrl+Shift+F3 find the selection in the forwards and backwards + directions respectively. +
      • +
      • + Auto-completion lists may be set to cancel when the cursor goes before + its start position or before the start of string being completed. +
      • +
      • + Auto-completion lists automatically size more sensibly. +
      • +
      • + SCI_CLEARDOCUMENTSTYLE zeroes all style bytes, ensures all + lines are shown and deletes all folding information. +
      • +
      • + On Windows, auto-completion lists are visually outdented rather than indented. +
      • +
      • + Close all command in SciTE. +
      • +
      • + On Windows multiple files can be dragged into SciTE. +
      • +
      • + When saving a file, the SciTE option save.deletes.first deletes it before doing the save. + This allows saving with a different capitalisation on Windows. +
      • +
      • + When use tabs option is off pressing the tab key inserts spaces. +
      • +
      • + Bug in indicators leading to extra line drawn fixed. +
      • +
      +

      + Release 1.28 +

      +
        +
      • + Released on 27 June 2000. +
      • +
      • + Fixes crash in indentation guides when indent size set to 0. +
      • +
      • + Fixes to installation on GTK+/Linux. User properties file on GTK+ has a dot at front of name: + .SciTEUser.properties. Global properties file location configurable at compile time + defaulting to $prefix/share/scite. $prefix determined from Gnome if present else its + /usr/local and can be overridden by installer. Gnome menu integration performed in + make install if Gnome present. +
      • +
      +

      + Release 1.27 +

      +
        +
      • + Released on 23 June 2000. +
      • +
      • + Indentation guides. View whitespace mode may be set to not display whitespace + in indentation. +
      • +
      • + Set methods have corresponding gets for UndoCollection, BufferedDraw, + CodePage, UsePalette, ReadOnly, CaretFore, and ModEventMask. +
      • +
      • + Caret is continuously on rather than blinking while typing or holding down + delete or backspace. And is now always shown if non blinking when focused on GTK+. +
      • +
      • + Bug fixed in SciTE with file extension comparison now done in case insensitive way. +
      • +
      • + Bugs fixed in SciTE's file path handling on Windows. +
      • +
      • + Bug fixed with preprocessor '#' last visible character causing hang. +
      • +
      +

      + Release 1.26 +

      +
        +
      • + Released on 13 June 2000. +
      • +
      • + Support for the Lua language in both Scintilla and SciTE. +
      • +
      • + Multiple buffers may be open in SciTE. +
      • +
      • + Each style may have a character set configured. This may determine + the characters that are displayed by the style. +
      • +
      • + In the C++ lexer, lexing of preprocessor source may either treat it all as being in + the preprocessor class or only the initial # and preprocessor command word as + being in the preprocessor class. +
      • +
      • + Scintilla provides SCI_CREATEDOCUMENT, SCI_ADDREFDOCUMENT, and + SCI_RELEASEDOCUMENT to make it easier for a container to deal with multiple + documents. +
      • +
      • + GTK+ specific definitions in Scintilla.h were removed to ScintillaWidget.h. All GTK+ clients will need to + #include "ScintillaWidget.h". +
      • +
      • + For GTK+, tools can be executed in the background by setting subsystem to 2. +
      • +
      • + Keys in the properties files are now case sensitive. This leads to a performance increase. +
      • +
      • + Menu to choose which lexer to use on a file. +
      • +
      • + Tab size dialog on Windows. +
      • +
      • + File dialogs enlarged on GTK+. +
      • +
      • + Match Brace command bound to Ctrl+E on both platforms with Ctrl+] a synonym on Windows. + Ctrl+Shift+E is select to matching brace. Brace matching tries to match to either the inside or the + outside, depending on whether the cursor is inside or outside the braces initially. + View End of Line bound to Ctrl+Shift+O. +
      • +
      • + The Home key may be bound to move the caret to either the start of the line or the start of the + text on the line. +
      • +
      • + Visual C++ project file for SciTE. +
      • +
      • + Bug fixed with current x location after Tab key. +
      • +
      • + Bug fixed with hiding fold margin by setting fold.margin.width to 0. +
      • +
      • + Bugs fixed with file name confusion on Windows when long and short names used, or different capitalisations, + or relative paths. +
      • +
      +

      + Release 1.25 +

      +
        +
      • + Released on 9 May 2000. +
      • +
      • + Some Unicode support on Windows. Treats buffer and API as UTF-8 and displays + through UCS-2 of Windows. +
      • +
      • + Automatic indentation. Indentation size can be different to tab size. +
      • +
      • + Tool bar. +
      • +
      • + Status bar now on Windows as well as GTK+. +
      • +
      • + Input fields in Find and Replace dialogs now have history on both Windows and + GTK+. +
      • +
      • + Auto completion list items may be separated by a chosen character to allow spaces + in items. The selected item may be changed through the API. +
      • +
      • + Horizontal scrollbar can be turned off. +
      • +
      • + Property to remove trailing spaces when saving file. +
      • +
      • + On Windows, changed font size calculation to be more compatible with + other applications. +
      • +
      • + On GTK+, SciTE's global properties files are looked for in the directory specified in the + SCITE_HOME environment variable if it is set. This allows hiding in a dot directory. +
      • +
      • + Keyword lists in SciTE updated for JavaScript to include those destined to be used in + the future. IDL includes XPIDL keywords as well as MSIDL keywords. +
      • +
      • + Zoom level can be set and queried through API. +
      • +
      • + New notification sent before insertions and deletions. +
      • +
      • + LaTeX lexer. +
      • +
      • + Fixes to folding including when deletions and additions are performed. +
      • +
      • + Fix for crash with very long lines. +
      • +
      • + Fix to affect all of rectangular selections with deletion and case changing. +
      • +
      • + Removed non-working messages that had been included only for Richedit compatibility. +
      • +
      +

      + Release 1.24 +

      +
        +
      • + Released on 29 March 2000. +
      • +
      • + Added lexing of IDL based on C++ lexer with extra UUID lexical class. +
      • +
      • + Functions and associated keys for Line Delete, Line Cut, Line Transpose, + Selection Lower Case and Selection Upper Case. +
      • +
      • + Property setting for SciTE, eol.mode, chooses initial state of line end characters. +
      • +
      • + Fixed bugs in undo history with small almost-contiguous changes being incorrectly coalesced. +
      • +
      • + Fixed bugs with incorrect expansion of ContractionState data structures causing crash. +
      • +
      • + Fixed bugs relating to null fonts. +
      • +
      • + Fixed bugs where recolourisation was not done sometimes when required. +
      • +
      • + Fixed compilation problems with SVector.h. +
      • +
      • + Fixed bad setting of fold points in Python. +
      • +
      +

      + Release 1.23 +

      +
        +
      • + Released on 21 March 2000. +
      • +
      • + Directory structure to separate on basis of product (Scintilla, SciTE, DMApp) + and environment (Cross-platform, Win32, GTK+). +
      • +
      • + Download packaging to allow download of the source or platform dependent executables. +
      • +
      • + Source code now available from CVS at SourceForge. +
      • +
      • + Very simple Windows-only demonstration application DMApp is available from cvs as dmapp. +
      • +
      • + Lexing functionality may optionally be included in Scintilla rather than be provided by + the container. +
      • +
      • + Set of lexers included is determined at link time by defining which of the Lex* object files + are linked in. +
      • +
      • + On Windows, the SciLexer.DLL extends Scintilla.DLL with the standard lexers. +
      • +
      • + Enhanced HTML lexer styles embedded VBScript and Python. + ASP segments are styled and ASP scripts in JavaScript, VBScript and Python are styled. +
      • +
      • + PLSQL and PHP supported. +
      • +
      • + Maximum number of lexical states extended to 128. +
      • +
      • + Lexers may store per line parse state for multiple line features such as ASP script language choice. +
      • +
      • + Lexing API simplified. +
      • +
      • + Project file for Visual C++. +
      • +
      • + Can now cycle through all recent files with Ctrl+Tab in SciTE. +
      • +
      • + Bookmarks in SciTE. +
      • +
      • + Drag and drop copy works when dragging to the edge of the selection. +
      • +
      • + Fixed bug with value sizes in properties file. +
      • +
      • + Fixed bug with last line in properties file not being used. +
      • +
      • + Bug with multiple views of one document fixed. +
      • +
      • + Keypad now works on GTK+. +
      • +
      +

      + Release 1.22 +

      +
        +
      • + Released on 27 February 2000. +
      • +
      • + wxWindows platform defined. + Implementation for wxWindows will be available separately + from main Scintilla distribution. +
      • +
      • + Line folding in Scintilla. +
      • +
      • + SciTE performs syntax directed folding for C/C++/Java/JavaScript and for Python. +
      • +
      • + Optional macro recording support. +
      • +
      • + User properties file (SciTEUser.properties) allows for customisation by the user + that is not overwritten with each installation of SciTE. +
      • +
      • + Python lexer detects and highlights inconsistent indentation. +
      • +
      • + Margin API made more orthogonal. SCI_SETMARGINWIDTH and SCI_SETLINENUMBERWIDTH + are deprecated in favour of this new API. +
      • +
      • + Margins may be made sensitive to forward mouse click events to container. +
      • +
      • + SQL lexer and styles included. +
      • +
      • + Perl lexer handles regular expressions better. +
      • +
      • + Caret policy determines how closely caret is tracked by visible area. +
      • +
      • + New marker shapes: arrow pointing down, plus and minus. +
      • +
      • + Optionally display full path in title rather than just file name. +
      • +
      • + Container is notified when Scintilla gains or loses focus. +
      • +
      • + SciTE handles focus in a more standard way and applies the main + edit commands to the focused pane. +
      • +
      • + Container is notified when Scintilla determines that a line needs to be made visible. +
      • +
      • + Document watchers receive notification when document about to be deleted. +
      • +
      • + Document interface allows access to list of watchers. +
      • +
      • + Line end determined correctly for lines ending with only a '\n'. +
      • +
      • + Search variant that searches form current selection and sets selection. +
      • +
      • + SciTE understands format of diagnostic messages from WScript. +
      • +
      • + SciTE remembers top line of window for each file in MRU list so switching to a recent file + is more likely to show the same text as when the file was previously visible. +
      • +
      • + Document reference count now initialised correctly. +
      • +
      • + Setting a null document pointer creates an empty document. +
      • +
      • + WM_GETTEXT can no longer overrun buffer. +
      • +
      • + Polygon drawing bug fixed on GTK+. +
      • +
      • + Java and JavaScript lexers merged into C++ lexer. +
      • +
      • + C++ lexer indicates unterminated strings by colouring the end of the line + rather than changing the rest of the file to string style. This is less + obtrusive and helps the folding. +
      • +
      +

      + Release 1.21 +

      +
        +
      • + Released on 2 February 2000. +
      • +
      • + Blank margins on left and right side of text. +
      • +
      • + SCN_CHECKBRACE renamed SCN_UPDATEUI and made more efficient. +
      • +
      • + SciTE source code refactored into platform independent and platform specific classes. +
      • +
      • + XML and Perl subset lexers in SciTE. +
      • +
      • + Large improvement to lexing speed. +
      • +
      • + A new subsystem, 2, allows use of ShellExec on Windows. +
      • +
      • + Borland compatible makefile. +
      • +
      • + Status bar showing caret position in GTK+ version of SciTE. +
      • +
      • + Bug fixes to selection drawing when part of selection outside window, mouse release over + scroll bars, and scroll positioning after deletion. +
      • +
      +

      + Release 1.2 +

      +
        +
      • + Released on 21 January 2000. +
      • +
      • + Multiple views of one document. +
      • +
      • + Rectangular selection, cut, copy, paste, drag and drop. +
      • +
      • + Long line indication. +
      • +
      • + Reverse searching +
      • +
      • + Line end conversion. +
      • +
      • + Generic autocompletion and calltips in SciTE. +
      • +
      • + Call tip background colour can be set. +
      • +
      • + SCI_MARKERPREV for moving to a previous marker. +
      • +
      • + Caret kept more within window where possible. +
      • +
      +

      + Release 1.15 +

      +
        +
      • + Released on 15 December 1999. +
      • +
      • + Brace highlighting and badlighting (for mismatched braces). +
      • +
      • + Visible line ends. +
      • +
      • + Multiple line call tips. +
      • +
      • + Printing now works from SciTE on Windows. +
      • +
      • + SciTE has a global "*" lexer style that is used as the basis for all the lexers' styles. +
      • +
      • + Fixes some warnings on GTK+ 1.2.6. +
      • +
      • + Better handling of modal dialogs on GTK+. +
      • +
      • + Resize handle drawn on pane splitter in SciTE on GTK+ so it looks more like a regular GTK+ + *paned widget. +
      • +
      • + SciTE does not place window origin offscreen if no properties file found on GTK+. +
      • +
      • + File open filter remembered in SciTE on Windows. +
      • +
      • + New mechanism using style numbers 32 to 36 standardises the setting of styles for brace + highlighting, brace badlighting, line numbers, control characters and the default style. +
      • +
      • + Old messages SCI_SETFORE .. SCI_SETFONT have been replaced by the default style 32. The old + messages are deprecated and will disappear in a future version. +
      • +
      +

      + Release 1.14 +

      +
        +
      • + Released on 20 November 1999. +
      • +
      • + Fixes a scrolling bug reported on GTK+. +
      • +
      +

      + Release 1.13 +

      +
        +
      • + Released on 18 November 1999. +
      • +
      • + Fixes compilation problems with the mingw32 GCC 2.95.2 on Windows. +
      • +
      • + Control characters are now visible. +
      • +
      • + Performance has improved, particularly for scrolling. +
      • +
      • + Windows RichEdit emulation is more accurate. This may break client code that uses these + messages: EM_GETLINE, EM_GETLINECOUNT, EM_EXGETSEL, EM_EXSETSEL, EM_EXLINEFROMCHAR, + EM_LINELENGTH, EM_LINEINDEX, EM_CHARFROMPOS, EM_POSFROMCHAR, and EM_GETTEXTRANGE. +
      • +
      • + Menus rearranged and accelerator keys set for all static items. +
      • +
      • + Placement of space indicators in view whitespace mode is more accurate with some fonts. +
      • +
      +

      + Release 1.12 +

      +
        +
      • + Released on 9 November 1999. +
      • +
      • + Packaging error in 1.11 meant that the compilation error was not fixed in that release. + Linux/GTK+ should compile with GCC 2.95 this time. +
      • +
      +

      + Release 1.11 +

      +
        +
      • + Released on 7 November 1999. +
      • +
      • + Fixed a compilation bug in ScintillaGTK.cxx. +
      • +
      • + Added a README file to explain how to build. +
      • +
      • + GTK+/Linux downloads now include documentation. +
      • +
      • + Binary only Sc1.EXE one file download for Windows. +
      • +
      +

      + Release 1.1 +

      +
        +
      • + Released on 6 November 1999. +
      • +
      • + Major restructuring for better modularity and platform independence. +
      • +
      • + Inter-application drag and drop. +
      • +
      • + Printing support in Scintilla on Windows. +
      • +
      • + Styles can select colouring to end of line. This can be used when a file contains more than + one language to differentiate between the areas in each language. An example is the HTML + + JavaScript styling in SciTE. +
      • +
      • + Actions can be grouped in the undo stack, so they will be undone together. This grouping is + hierarchical so higher level actions such as replace all can be undone in one go. Call to + discover whether there are any actions to redo. +
      • +
      • + The set of characters that define words can be changed. +
      • +
      • + Markers now have identifiers and can be found and deleted by their identifier. The empty + marker type can be used to make a marker that is invisible and which is only used to trace + where a particular line moves to. +
      • +
      • + Double click notification. +
      • +
      • + HTML styling in SciTE also styles embedded JavaScript. +
      • +
      • + Additional tool commands can be added to SciTE. +
      • +
      • + SciTE option to allow reloading if changed upon application activation and saving on + application deactivation. Not yet working on GTK+ version. +
      • +
      • + Entry fields in search dialogs remember last 10 user entries. Not working in all cases in + Windows version. +
      • +
      • + SciTE can save a styled copy of the current file in HTML format. As SciTE does not yet + support printing, this can be used to print a file by then using a browser to print the + HTML file. +
      • +
      +

      + Release 1.02 +

      +
        +
      • + Released on 1 October 1999. +
      • +
      • + GTK+ version compiles with GCC 2.95. +
      • +
      • + Properly deleting objects when window destroyed under GTK+. +
      • +
      • + If the selection is not empty backspace deletes the selection. +
      • +
      • + Some X style middle mouse button handling for copying the primary selection to and from + Scintilla. Does not work in all cases. +
      • +
      • + HTML styling in SciTE. +
      • +
      • + Stopped dirty flag being set in SciTE when results pane modified. +
      • +
      +

      + Release 1.01 +

      +
        +
      • + Released on 28 September 1999. +
      • +
      • + Better DBCS support on Windows including IME. +
      • +
      • + Wheel mouse support for scrolling and zooming on Windows. Zooming with Ctrl+KeypadPlus and + Ctrl+KeypadMinus. +
      • +
      • + Performance improvements especially on GTK+. +
      • +
      • + Caret blinking and settable colour on both GTK+ and Windows. +
      • +
      • + Drag and drop within a Scintilla window. On Windows, files can be dragged into SciTE. +
      • +
      +

      + Release 1.0 +

      +
        +
      • + Released on 17 May 1999. +
      • +
      • + Changed name of "Tide" to "SciTE" to avoid clash with a TCL based IDE. "SciTE" is a + SCIntilla based Text Editor and is Latin meaning something like "understanding in a neat + way" and is also an Old English version of the word "shit". +
      • +
      • + There is a SCI_AUTOCSTOPS message for defining a string of characters that will stop + autocompletion mode. Autocompletion mode is cancelled when any cursor movement occurs apart + from backspace. +
      • +
      • + GTK+ version now splits horizontally as well as vertically and all dialogs cancel when the + escape key is pressed. +
      • +
      +

      + Beta release 0.93 +

      +
        +
      • + Released on 12 May 1999. +
      • +
      • + A bit more robust than 0.92 and supports SCI_MARKERNEXT message. +
      • +
      +

      + Beta release 0.92 +

      +
        +
      • + Released on 11 May 1999. +
      • +
      • + GTK+ version now contains all features of Windows version with some very small differences. + Executing programs works much better now. +
      • +
      • + New palette code to allow more colours to be displayed in 256 colour screen modes. A line + number column can be displayed to the left of the selection margin. +
      • +
      • + The code that maps from line numbers to text positions and back has been completely + rewritten to be faster, and to allow markers to move with the text. +
      • +
      +

      + Beta release 0.91 +

      +
        +
      • + Released on 30 April 1999, containing fixes to text measuring to make Scintilla work better + with bitmap fonts. Also some small fixes to make compiling work with Visual C++. +
      • +
      +

      + Beta release 0.90 +

      +
        +
      • + Released on 29 April 1999, containing working GTK+/Linux version. +
      • +
      • + The Java, C++ and Python lexers recognise operators as distinct from default allowing them + to be highlighted. +
      • +
      +

      + Beta release 0.82 +

      +
        +
      • + Released on 1 April 1999, to fix a problem with handling the Enter key in PythonWin. Also + fixes some problems with cmd key mapping. +
      • +
      +

      + Beta release 0.81 +

      +
        +
      • + Released on 30th March 1999, containing bug fixes and a few more features. +
      • +
      • + Static linking supported and Tidy.EXE, a statically linked version of Tide.EXE. Changes to + compiler flags in the makefiles to optimise for size. +
      • +
      • + Scintilla supports a 'savepoint' in the undo stack which can be set by the container when + the document is saved. Notifications are sent to the container when the savepoint is + entered or left, allowing the container to to display a dirty indicator and change its + menus. +
      • +
      • + When Scintilla is set to read-only mode, a notification is sent to the container should the + user try to edit the document. This can be used to check the document out of a version + control system. +
      • +
      • + There is an API for setting the appearance of indicators. +
      • +
      • + The keyboard mapping can be redefined or removed so it can be implemented completely by the + container. All of the keyboard commands are now commands which can be sent by the + container. +
      • +
      • + A home command like Visual C++ with one hit going to the start of the text on the line and + the next going to the left margin is available. I do not personally like this but my + fingers have become trained to it by much repetition. +
      • +
      • + SCI_MARKERDELETEALL has an argument in wParam which is the number of the type marker to + delete with -1 performing the old action of removing all marker types. +
      • +
      • + Tide now understands both the file name and line numbers in error messages in most cases. +
      • +
      • + Tide remembers the current lines of files in the recently used list. +
      • +
      • + Tide has a Find in Files command. +
      • +
      +

      + Beta release 0.80 +

      +
        +
      • + This was the first public release on 14th March 1999, containing a mostly working Win32 + Scintilla DLL and Tide EXE. +
      • +
      +

      + Beta releases of SciTE were called Tide +

      + + + diff --git a/scintilla/doc/ScintillaRelated.html b/scintilla/doc/ScintillaRelated.html new file mode 100644 index 00000000..64e24f6a --- /dev/null +++ b/scintilla/doc/ScintillaRelated.html @@ -0,0 +1,485 @@ + + + + + + + + + Scintilla and SciTE Related Sites + + + + + + + + +
      + Scintilla icon + + Scintilla + and SciTE +
      +

      + Related Sites +

      +

      + Ports and Bindings of Scintilla +

      +

      + Editawy + is an ActiveX Control wrapper that support all Scintilla functions and additional high level functions. +

      +

      + Jintilla + is a JNI wrapper that allows Scintilla to be used in Java with + both SWT and AWT. +

      +

      + Delphi Scintilla Interface Components + is a FREE collection of components that makes it easy to use the + Scintilla source code editing control from within Delphi and C++ Builder. +

      +

      + wxStEdit + is a library and sample program that provides extra features over wxStyledTextControl. +

      +

      + CScintillaCtrl, CScintillaView & CScintillaDoc + are freeware MFC classes to encapsulate Scintilla. +

      +

      + ScintillaNet + is an encapsulation of Scintilla for use within the .NET framework. +

      +

      + QScintilla + is a port of Scintilla to the Qt platform. It has a similar license to Qt: GPL for use in + free software and commercial for use in close-source applications. +

      +

      + + GWindows is a Win32 RAD GUI Framework for Ada 95 that + includes a binding of Scintilla. +

      +

      + + DolphinScintilla is a DolphinSmalltalk wrapper for Scintilla. +

      +

      + ScintillaVB + is an ActiveX control written in VB that encapsulates Scintilla. +

      +

      + FXScintilla + is a port of Scintilla to the FOX platform. FXRuby includes Ruby + bindings for FXScintilla. +

      +

      + Delphi wrapper for + Scintilla which is also usable from Borland C++ Builder. +

      +

      + The wxStyledTextCtrl editor component in the + wxWindows cross platform toolkit is based on Scintilla.
      + A Python binding for wxStyledTextCtrl is part of wxPython. +

      +

      + gtkscintilla + is an alternative GTK class implementation for scintilla. + This implementation acts more like a Gtk+ object, with many methods rather + than just scintilla_send_message() and is available as a shared library. + This implementation works with GTK 1.x. +

      +

      + gtkscintilla2 + is an alternative GTK class implementation for scintilla + similar to the above, but for GTK 2.x. +

      +

      + pyscintilla + is the original Python binding for Scintilla's default GTK + 1.x class. Includes some additional support, such as native printing on + Windows. The binding is hand-written rather than auto-generated from the + Scintilla.iface file. +

      +

      + pygtkscintilla + is a Python binding for gtk1.x scintilla that uses + gtkscintilla instead of the default GTK class. +

      +

      + pyscintilla2 + is a Python binding for GTK 2.x scintilla that uses + gtkscintilla2. +

      +

      + ScintillaCtrl + is an unmaintained ActiveX control wrapper for Scintilla. +

      +

      + Projects using Scintilla +

      +

      + ECMerge + is a commercial graphical and batch diff / merge tool for Windows, Linux and Solaris + (aiming to target all major platforms). +

      +

      + PyPE + is an editor written in Python with the wxPython GUI toolkit. +

      +

      + Sciboo + is an editor based on ScintillaNET. +

      +

      + The Scite Config Tool + is a graphical user interface for changing SciTE properties files. +

      +

      + Scintilla Lister + is a plugin for Total Commander allowing viewing all documents with syntax highlighting + inside Total Commander. +

      +

      + ChSciTE + is a free IDE for C/C++ interpreter Ch. It runs cross platform. + Ch is for cross-platform scripting, shell + programming, 2D/3D plotting, numerical computing, and embedded + scripting. +

      +

      + + Code::Blocks is an open source, cross platform free C++ IDE. +

      +

      + + Notepad++ is a free source code editor under Windows. +

      +

      + + Gubed is a cross platform program to debug PHP scripts. +

      +

      + + LSW DotNet-Lab is a development environment for the .NET platform. +

      +

      + + GLIntercept is an OpenGL function call interceptor that uses SciTE as a + run-time shader editor. +

      +

      + + Xin is an open-source XML editor for Windows. +

      +

      + + wyoEditor is "A nice editor with a well designed and consistent look and feel". +

      +

      + + Notepad2 is "Yet another Notepad replacement". +

      +

      + + PyCrash Viewer can examine crash dumps of Python programs. +

      +

      + + MPT series Wire Analyzers use Scintilla and SciTE. +

      +

      + MyGeneration + is a .NET based code generator. +

      +

      + CSSED + is a tiny GTK2 CSS editor. +

      +

      + DIDE + is a free IDE for the D language on Windows. +

      +

      + + IdePS + is a free Integrated Development Environment for PostScript +

      +

      + + CUTE + is a user-friendly source code editor easily extended using Python. +

      +

      + + Venis IX, + the Visual Environment for NSIS (Nullsoft Scriptable Install System). +

      +

      + + MinGW Developer Studio + is a simple C/C++ IDE for the MinGW compiler on Windows. +

      +

      + Eric3 + is a Python IDE written using PyQt and QScintilla. +

      +

      + TemplateTamer + is a tool for development of template based PHP web pages. +

      +

      + SciTE|Flash + is a free Scintilla-based ActionScript editor for Windows. +

      +

      + CPPIDE + is part of some commercial high-school oriented programming course software. +

      +

      + Instant Source + is a commercial tool for looking at the HTML on web sites. +

      +

      + RAD.On++ + is a free C++ Rapid Application Developer for Win32. +

      +

      + wxBasic is an open source + Basic interpreter that uses the wxWindows toolkit. A small IDE is under construction. +

      +

      + FreeRIDE will be a + cross-platform IDE for the Ruby programming language. +

      +

      + Visual MinGW is an + IDE for the MinGW compiler system.This runs on Windows with gcc. +

      +

      + The Wing IDE is a + complete integrated development environment for the Python programming + language. + Available on Intel based Linux and Windows and on MacOS X through XDarwin. +

      +

      + LuaIDE + is an IDE for Lua on Windows. +

      +

      + Sphere + is 2D RPG engine with a development environment. +

      +

      + Practical Ruby + is an IDE for Ruby on Windows. +

      +

      + GNUe + is a suite of tools and applications for solving the needs of the enterprise. +

      +

      + SilverCity + is a lexing package that can provide lexical analysis for over 20 programming + and markup languages. +

      +

      + Php mole + is an integrated development enviroment for developing (primarily) + web based and phpgtk based applications. +

      +

      + HAP Python Remote Debugger + is a Python debugger that can run on one Windows machine debugging a Python program running + on either the same or another machine. +

      +

      + pyeditor and wxEditor + are scriptable editors implemented in Python. pyeditor is based on GTK+ and + the pyscintilla wrapper. wxEditor is based on wxWindows, wxPython and + wxStyledTextControl. +

      +

      + Ruby installation + that includes SciTE set up for Ruby using an included copy of the "Programming Ruby" book for help. +

      +

      + Interactive LuaSpace Development + is a graphical environment for LuaSpace which combines the CORBA platform + with the language Lua. +

      +

      + PyCrust is an interactive + Python shell based on wxPython. +

      +

      + Black Adder is a + Qt based development environment for Python and Ruby. +

      +

      + Komodo + is a cross-platform multi-language development environment built + as an application of Mozilla. +

      +

      + titmouse + is a Lua editor/debugger for Windows. It is available as both a component + and an application. +

      +

      + Filerx + is a project manager for SciTE on Windows. + Open source and includes an implementation of SciTE's Director interface so + will be of interest to others wanting to control SciTE. +

      +

      + Anjuta + is an open source C/C++ IDE for Linux/GNOME. +

      +

      + A version of SciTE for Win32 enhanced + with a tab control to allow easy movement between buffers. + Go to the "Goodies" area on this site. +

      +

      + + Suneido is an integrated application platform currently available for Win32 that includes an + object-oriented language, client-server database, and user interface and reporting frameworks. +

      +

      + + BitLeaf is a new GNOME based development environment. + Currently at an early stage of development. +

      +

      + + Agast is an authoring system for adventure games which includes + a customised version of SciTE. +

      +

      + Boa Constructor is a RAD GUI + Building IDE for the wxWindows cross platform platform. Written using wxPython with the + wxStyledTextCtrl used as its editor. +

      +

      + PythonWin, a Win32 IDE for Python, uses + Scintilla for both its editing and interactive windows. +

      +

      + Editing Components +

      +

      + GtkSourceView + is a text widget that extends the standard GTK+ 2.x text widget and improves it + by implementing syntax highlighting and other features typical of a source editor. +

      +

      + AEditor + is a free source code editing component implemented in Ruby. +

      +

      + SyntaxEditor + is a commercial native .Net source code editing component. +

      +

      + jEdit is a good Open Source syntax colouring + editor written in and for Java. +

      +

      + GTK+, the GIMP Toolkit, contains a rich text editing + widget.
      + Gedit is an editor for GTK+/GNOME.
      + +

      +

      + CodeGuru has source code for several Win32 MFC based + editors. +

      + SynEdit is a Win32 edit control written + in Delphi. +

      + SourceView is a commercial editing + component for Win32. +

      +

      + CodeMax is another commercial component for Win32. +

      +

      + Documents +

      +

      + The Craft of Text Editing + describes how EMACS works, Craig A. Finseth +

      +

      + Span Tables + are another data structure that can be used to represent documents in memory in a way + that performs well when data is inserted and deleted, James Brown +

      +

      + Data Structures in a Bit-Mapped Text + Editor, Wilfred J. Hanson, Byte January 1987 +

      +

      + Text Editors: Algorithms and Architectures, Ray Valdés, Dr. Dobbs Journal + April 1993 +

      +

      + Macintosh User Interface Guidelines and TextEdit chapters of Inside Macintosh +

      +

      + Development Tools +

      +

      + Scintilla and SciTE were developed using the + Mingw version of GCC. +

      +

      + AStyle is a source code formatter for C++ and + Java code. SciTE has an Indent command defined for .cxx files that uses AStyle. +

      +

      + WinMerge is an interactive diff / merge + for Windows. I prefer code submissions in the form of source files rather than diffs and then run + WinMerge over the files to work out how to merge. +

      +

      + Python is my favourite programming language. Scintilla + was started after I tried to improve the editor built into PythonWin, but was frustrated by the limitations of + the Windows Richedit control which PythonWin used. +

      +

      + regex is a public domain + implementation of regular expression pattern matching used in Scintilla. +

      + +

      + + Inspirational coding soundscapes by David Bridie. +

      +

      + Get away from hacking without any of that tedious standing up bother: Virtually There ;). +

      + + + diff --git a/scintilla/doc/ScintillaToDo.html b/scintilla/doc/ScintillaToDo.html new file mode 100644 index 00000000..a8098006 --- /dev/null +++ b/scintilla/doc/ScintillaToDo.html @@ -0,0 +1,178 @@ + + + + + + + + + Scintilla and SciTE To Do + + + + + + + + +
      + Scintilla icon + + Scintilla + and SciTE +
      +

      + Bugs and To Do List +

      +

      + Feedback +

      +

      + Issues can be reported on the Bug Tracker + and features requested on the Feature Request Tracker. +

      +

      + Scintilla Bugs +

      +

      + At the end of italics style runs characters can be chopped off. An example + is using Verdana 12 point italics for strings makes an ending double quote + half visible and an ending single quote invisible. This is hard to solve + completely, may be better to avoid these situations by, for example, + choosing a font like Times New Roman for strings. There is a specific kluge + for the end of line which adds some room for italics but this does not + work elsewhere. +

      +

      + Dragging over bold text in some fonts will ripple because of the difference in + size between drawing all of a string at once and drawing it in parts. +

      +

      + Automatic scrolling when text dragged near edge of window. +

      +

      + GTK+ Version Bugs +

      +

      + Scintilla To Do +

      +

      + Folding for languages that don't have it yet and good folding for languages + that inherited poor folding from another languages folding code. +

      +

      + Simple pattern based styling. +

      +

      + Different height lines based upon tallest text on the line rather than on the tallest style + possible. +

      +

      + Composition of lexing for mixed languages (such as ASP+ over COBOL) by + combining lexers. +

      +

      + Printing support on GTK+. Maybe Postscript output or use Gnome? +

      +

      + Stream folding which could be used to fold up the contents of HTML elements. +

      +

      + Persisting view state such as current folding into a stream or blob so it is easy + to restore. +

      +

      + Move line up and move line down keys or move selected lines up / down. +

      +

      + Printing of highlight lines and folding margin. +

      +

      + Flow diagrams inside editor similar to + + GRASP. +

      +

      + A VCL component wrapper around Scintilla so it can be used with Delphi or + Borland C++ Builder. + There is some work + on this available. +

      +

      + Port to MacOS X. +

      +

      + More lexers for other languages. +

      +

      + Automatically calculated range for horizontal scrolling. +

      +

      + Virtual space at the end of lines so the caret can be moved beyond the end + of lines with the cursor keys. May also make rectangular operations easier + to perform. +

      +

      + SciTE To Do +

      +

      + Good regular expression support through a plugin. +

      +

      + Allow tools to transform the selection, performing an operation like + indentation or sorting. +

      +

      + Allow file name based selection on all properties rather than just a chosen few. +

      +

      + Opening from and saving to FTP servers. +

      +

      + Setting to fold away comments upon opening. +

      +

      + User defined fold ranges. +

      +

      + Silent mode that does not display any message boxes. +

      +

      + Features I am unlikely to do +

      +

      + These are features I don't like or don't think are important enough to work on. + Implementations are welcome from others though. +

      +

      + Automatically saving modified menu shortcuts on exit. +

      +

      + Mouse wheel panning (press the mouse wheel and then move the mouse) on + Windows. +

      +

      + Adding options to the save dialog to save in a particular encoding or with a + chosen line ending. +

      +

      + Directions +

      +

      + The main point of this development is Scintilla, and this is where most effort will + go. SciTE will get new features, but only when they make my life easier - I am + not intending to make it grow up to be a huge full-function IDE like Visual + Cafe. The lines I've currently decided not to step over in SciTE are any sort of + project facility and any configuration dialogs. SciTE for Windows now has a + Director interface for communicating with a separate project manager + application. +

      +

      + If you are interested in contributing code, do not feel any need to make it cross + platform. + Just code it for your platform and I'll either reimplement for the other platform or + ensure that there is no effect on the other platform. +

      + + diff --git a/scintilla/doc/ScintillaUsage.html b/scintilla/doc/ScintillaUsage.html new file mode 100644 index 00000000..c19cbc55 --- /dev/null +++ b/scintilla/doc/ScintillaUsage.html @@ -0,0 +1,375 @@ + + + + + + + + + Scintilla Usage Notes + + + + + + + + + +
      + Scintilla icon + + Scintilla + Usage Notes +
      +

      + Implementing Auto-Indent +

      +

      + The key idea is to use the SCN_CHARADDED notification to add indentation after a newline. +

      +

      + The lParam on the notification is a pointer to a SCNotification structure whose ch member + specifies the character added. If a newline was added, the previous line can be retrieved and + the same indentation can be added to the new line. +

      +

      + Here is the relevant portion of code from SciTE: (SciTE.cxx SciTEWindow::CharAdded) +

      + if  (ch  ==  '\r'  ||  ch  ==  '\n')  {
      +     
      char  + linebuf[1000];
      +     
      int  + curLine  =  GetCurrentLineNumber();
      +     
      int  + lineLength  + =  SendEditor(SCI_LINELENGTH,  curLine);
      +     
      + //Platform::DebugPrintf("[CR] %d len = %d\n", curLine, lineLength);
      +     
      if  (curLine  >  0  &&  + lineLength  + <=  2)  {
      +     
      int  + prevLineLength  + =  SendEditor(SCI_LINELENGTH,  curLine  -  1);
      +     
      if  (prevLineLength  <  sizeof(linebuf))  {
      +         
      WORD  buflen  =  sizeof(linebuf);
      +         
      memcpy(linebuf,  &buflen,  sizeof(buflen));
      +         
      + SendEditor(EM_GETLINE,  curLine  -  1,
      +                    
      + reinterpret_cast<LPARAM>(static_cast<char  *>(linebuf)));
      +         
      linebuf[prevLineLength]  =  '\0';
      +         
      for  (int  pos  =  0;  linebuf[pos];  pos++)  {
      +             
      if  (linebuf[pos]  !=  ' '  &&  + linebuf[pos]  !=  '\t')
      +                 
      + linebuf[pos]  =  '\0';
      +         
      }
      +         
      + SendEditor(EM_REPLACESEL,  0,  + reinterpret_cast<LPARAM>(static_cast<char  *>(linebuf)));
      +     
      }
      +
      }
      + +

      + Of course, fancier handling could be implemented. For example, if the previous line was the + start of a control construct, the next line could be automatically indented one tab further. + (Assuming that is your indenting style.) +

      +

      + Implementing Syntax Styling +

      +

      + Syntax styling is handled by the SCN_STYLENEEDED notification. Scintilla keeps track of the + end of the styled text - this is retrieved with SCI_GETENDSTYLED. In response to the + SCN_STYLENEEDED notification, you should apply styles to the text from ENDSTYLED to the + position specified by the notification. +

      +

      + Here is the relevant portion of code from SciTE: (SciTE.cxx) +

      + void  + SciTEWindow::Notify(SCNotification  *notification)  {
      +     
      switch  + (notification->nmhdr.code)  {
      +     
      case  + SCN_STYLENEEDED:  {
      +             
      if  (notification->nmhdr.idFrom  ==  IDM_SRCWIN)  {
      +                 
      + int  + endStyled  =  SendEditor(SCI_GETENDSTYLED);
      +                 
      + int  + lineEndStyled  =  SendEditor(EM_LINEFROMCHAR,  + endStyled);
      +                 
      + endStyled  + =  SendEditor(EM_LINEINDEX,  lineEndStyled);
      +                 
      + Colourise(endStyled,  notification->position);
      + +

      + Colourize(start, end) retrieves the specified range of text and then calls ColourizeDoc in + keywords.cxx. It starts the process by calling: +

      +     SendMessage(hwnd,  SCI_STARTSTYLING,  + startPos,  31);
      + +

      + and then for each token of the text, calling: +

      +     SendMessage(hwnd,  SCI_SETSTYLING,  length,  style);
      + +

      + where style is a number from 0 to 31 whose appearance has been defined using the + SCI_STYLESET... messages. +

      +

      + Implementing Calltips +

      +

      + Again, the SCN_CHARADDED notification is used to catch when an opening parenthesis is added. + The preceding word can then be retrieved from the current line: +

      +     char  linebuf[1000];
      +
          int  current  =  SendEditor(SCI_GETCURLINE,  sizeof(linebuf),
      +         
      + reinterpret_cast<LPARAM>(static_cast<char  *>(linebuf)));
      +
          int  pos  =  SendEditor(SCI_GETCURRENTPOS);
      +
      +
          int  startword  =  current  -  1;
      +
          while  + (startword  + >  0  &&  + isalpha(linebuf[startword  -  1]))
      +         
      + startword--;
      +
          linebuf[current  -  1]  =  '\0';
      +
          char*  word  =  linebuf  +  startword;
      + +

      + Then if a calltip is available it can be displayed. The calltip appears immediately below + the position specified. The calltip can be multiple lines separated by newlines (\n). +

      +     pos  =  SendMessage(hwnd,  SCI_GETCURRENTPOS,  0,  0);
      +
          SendMessageText(hwnd,  SCI_CALLTIPSHOW,  pos  -  wordLen  -  1,  calltip);
      + +

      + The calltip can be removed when a closing parenthesis is entered: +

      +     if  (SendMessage(hwnd,  SCI_CALLTIPACTIVE,  + 0,  0))
      +         
      + SendMessage(hwnd,  + SCI_CALLTIPCANCEL,  0,  + 0);
      + +

      + Obviously, it is up the application to look after supplying the appropriate calltip text. +

      +

      + SciTE goes one step further, counting the commas between arguments and highlighting the + corresponding part of the calltip. This code is in ContinueCallTip. +

      +

      + Page contributed by Andrew McKinlay. +

      + + + diff --git a/scintilla/doc/Steps.html b/scintilla/doc/Steps.html new file mode 100644 index 00000000..765268da --- /dev/null +++ b/scintilla/doc/Steps.html @@ -0,0 +1,142 @@ + +How to use the Scintilla Edit Control in windows? +

      How to use the Scintilla Edit Control in windows?

      +

      + This should be a little step by step explanation how to use Scintilla in the windows environment. +

      +

      +

      How to create Scintilla Edit Control?

      +

      + First of all, load the Scintilla DLL with something like: +

      +
      +
      +	hmod = LoadLibrary("SciLexer.DLL");
      +		if (hmod==NULL)
      +		{
      +			MessageBox(hwndParent,
      +			"The Scintilla DLL could not be loaded.",
      +			"Error loading Scintilla",
      +			MB_OK | MB_ICONERROR);
      +		}
      +		
      +

      + If the DLL was loaded successfully, then the DLL has registered (yes, by itself) a new + window class. The new class called "Scintilla" is the new scintilla edit control. +

      +

      + Now you can use this new control just like any other windows control. +

      +
      +
      +	hwndScintilla = CreateWindowEx(0,
      +		"Scintilla","", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPCHILDREN,
      +		10,10,500,400,hwndParent,(HMENU)GuiID, hInstance,NULL);
      +		
      +

      + Note the new window class name: "Scintilla". By reaching this point you actually included + a Scintilla Edit Control to your windows program. +

      +

      +

      How to control the Scintilla Edit Control?

      +

      + You can control Scintilla by sending commands to the Edit Control. + There a 2 ways of doing this. A simple and fast way. +

      +

      The simple way to control Scintilla

      +

      + The simple way is just like with any other windows control. You can send messages to the + Scintilla Edit Control and receive notifications from the control. (Note that the notifications + are sent to the parent window of the Scintilla Edit Control.) +

      +

      + The Scintilla Edit Control knows a special message for each command. + To send commands to the Scintilla Edit Control you can use the SendMessage function. +

      +
      +
      +	SendMessage(hwndScintilla,sci_command,wparam,lparam);
      +			
      +

      + like: +

      +
      +
      +	SendMessage(hwndScintilla,SCI_CREATEDOCUMENT, 0, 0);
      +			
      +

      + Some of the commands will return a value and unused parameters should be set to NULL. +

      +

      +

      The fast way to control Scintilla

      +

      + The fast way of controlling the Scintilla Edit Control is to call message handling function by yourself. + You can retrieve a pointer to the message handling function of the Scintilla Edit Control and + call it directly to execute a command. This way is much more faster than the SendMessage() way. +

      +

      + 1st you have to use the SCI_GETDIRECTFUNCTION and SCI_GETDIRECTPOINTER commands to + retrieve the pointer to the function and a pointer which must be the first parameter when calling the retrieved + function pointer. + You have to do this with the SendMessage way :) +

      +

      + The whole thing has to look like this: +

      +
      +
      +	int (*fn)(void*,int,int,int);
      +	void * ptr;
      +	int canundo;
      +
      +	fn = (int (__cdecl *)(void *,int,int,int))SendMessage(
      +		hwndScintilla,SCI_GETDIRECTFUNCTION,0,0);
      +	ptr = (void *)SendMessage(hwndScintilla,SCI_GETDIRECTPOINTER,0,0);
      +
      +	canundo = fn(ptr,SCI_CANUNDO,0,0);
      +			
      +

      + with "fn" as the function pointer to the message handling function of the Scintilla Control + and "ptr" as the pointer that must be used as 1st parameter. + The next parameters are the Scintilla Command with its two (optional) parameters. +

      + +

      +

      How will I receive notifications?

      +

      + Whenever an event occurs where Scintilla wants to inform you about something, the Scintilla Edit Control + will send notification to the parent window. This is done by a WM_NOTITY message. + When receiving that message, you have to look in the xxx struct for the actual message. +

      +

      + So in Scintillas parent window message handling function you have to include some code like this: +

      +
      +	NMHDR *lpnmhdr;
      +
      +	[...]
      +
      +	case WM_NOTIFY:
      +		lpnmhdr = (LPNMHDR) lParam;
      +
      +		if(lpnmhdr->hwndFrom==hwndScintilla)
      +		{
      +			switch(lpnmhdr->code)
      +			{
      +				case SCN_CHARADDED:
      +					/* Hey, Scintilla just told me that a new */
      +					/* character was added to the Edit Control.*/
      +					/* Now i do something cool with that char. */
      +				break;
      +			}
      +		}
      +	break;
      +			
      +

      +

      + +

      + Page contributed by Holger Schmidt. +

      + + diff --git a/scintilla/doc/index.html b/scintilla/doc/index.html new file mode 100644 index 00000000..c4654e6c --- /dev/null +++ b/scintilla/doc/index.html @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + Scintilla and SciTE + + + + + + + + + + +
      + Scintilla + + A free source code editing component for Win32 and + GTK+ + + Release version 1.73
      + Site last modified March 31 2007
      +
      +   +
      + + + + +
      +   +
      + + + + + + + + + + + + + + + + + + + + + + + + + +
      + Version 1.73 allows style changes to be made during text modification events. +
      + Version 1.72 is more efficient at handling per-line information. +
      + Version 1.71 has some internationalisation fixes. +
      + Version 1.70 allows, on GTK+, approximate character set conversions + for pasting and uses internationalised input at all times. +
      + Version 1.69 supports the Spice language and can draw + the selection and whole line markers translucently. +
      + Version 1.68 can draw the caret line + and box indicators translucently and has an accurate TCL lexer. +
      + Version 1.67 enhances some lexers and fixes bugs. +
      + Version 1.66 has a new Ruby lexer and fixes bugs on GTK+ + with Pango 1.8. +
      + + + + +
      + + + Documentation   + Bugs   + + + History   Related   +
      +

      + Scintilla is a free source code editing component. + It comes with complete source code and a license that + permits use in any free project or commercial product. +

      +

      + As well as features found in standard text editing components, Scintilla includes features + especially useful when editing and debugging source code. + These include support for syntax styling, error indicators, code completion and call tips. + The selection margin can contain markers like those used in debuggers to indicate + breakpoints and the current line. Styling choices are more open than with many editors, + allowing the use of proportional fonts, bold and italics, multiple foreground and background + colours and multiple fonts. +

      +

      + The SinkWorld project + investigates possible future directions for Scintilla to make it more flexible, robust, perform + better and run on the .NET and Java virtual machines. +

      +

      + SciTE is a SCIntilla based Text Editor. Originally built to + demonstrate Scintilla, it has grown to be a generally useful editor with facilities for + building and running programs. It is best used for jobs with simple configurations - I use it + for building test and demonstration programs as well as SciTE and Scintilla, themselves. +

      +

      + Development of Scintilla started as an effort to improve the text editor in PythonWin. After + being frustrated by problems in the Richedit control used by PythonWin, it looked like the + best way forward was to write a new edit control. The biggest problem with Richedit and other + similar controls is that they treat styling changes as important persistent changes to the + document so they are saved into the undo stack and set the document's dirty flag. For source + code, styling should not be persisted as it can be mechanically recreated. +

      +

      + Scintilla and SciTE are currently available for Intel Win32 and Linux compatible operating + systems with GTK+. They have been run on Windows 95, NT 4.0, Windows 2000, and on Red Hat + Linux 8 and 9 with GTK+ 1.2 and 2.0. Here is a screenshot of + SciTE.
      +

      +

      + You can download Scintilla. +

      +

      + The source code can be downloaded via CVS at the Source Forge + Scintilla project page. +

      +

      + Related sites. +

      +

      + Bugs and To Do list. +

      +

      + History and contribution credits. +

      +

      + Icons that can be used with Scintilla. +

      +

      + Questions and comments about Scintilla should be directed to the + scintilla-interest + mailing list, + which is for discussion of Scintilla and related projects, their bugs and future features. + This is a low traffic list, averaging less than 50 messages per week. + To avoid spam, only list members can write to the list. + Announcements of new versions of Scintilla go to both the scintilla-interest list and + scintilla-announce. + Messages sent to my personal email address that could have been sent to the list + may receive no response. +
      +

      + + + + diff --git a/scintilla/gtk/Converter.h b/scintilla/gtk/Converter.h new file mode 100644 index 00000000..aeb5e159 --- /dev/null +++ b/scintilla/gtk/Converter.h @@ -0,0 +1,87 @@ +// Scintilla source code edit control +// Converter.h - Encapsulation of iconv +// Copyright 2004 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#if GTK_MAJOR_VERSION >= 2 + typedef GIConv ConverterHandle; +#else + typedef iconv_t ConverterHandle; +#endif +const ConverterHandle iconvhBad = (ConverterHandle)(-1); +// Since various versions of iconv can not agree on whether the src argument +// is char ** or const char ** provide a templatised adaptor. +template +size_t iconv_adaptor(size_t(*f_iconv)(ConverterHandle, T, size_t *, char **, size_t *), + ConverterHandle cd, char** src, size_t *srcleft, + char **dst, size_t *dstleft) { + return f_iconv(cd, (T)src, srcleft, dst, dstleft); +} +/** + * Encapsulate iconv safely and avoid iconv_adaptor complexity in client code. + */ +class Converter { + ConverterHandle iconvh; + void OpenHandle(const char *fullDestination, const char *charSetSource) { +#if GTK_MAJOR_VERSION >= 2 + iconvh = g_iconv_open(fullDestination, charSetSource); +#else + iconvh = iconv_open(fullDestination, charSetSource); +#endif + } + bool Succeeded() const { + return iconvh != iconvhBad; + } +public: + Converter() { + iconvh = iconvhBad; + } + Converter(const char *charSetDestination, const char *charSetSource, bool transliterations) { + iconvh = iconvhBad; + Open(charSetDestination, charSetSource, transliterations); + } + ~Converter() { + Close(); + } + operator bool() const { + return Succeeded(); + } + void Open(const char *charSetDestination, const char *charSetSource, bool transliterations=true) { + Close(); + if (*charSetSource) { + // Try allowing approximate transliterations + if (transliterations) { + char fullDest[200]; + strcpy(fullDest, charSetDestination); + strcat(fullDest, "//TRANSLIT"); + OpenHandle(fullDest, charSetSource); + } + if (!Succeeded()) { + // Transliterations failed so try basic name + OpenHandle(charSetDestination, charSetSource); + } + } + } + void Close() { + if (Succeeded()) { +#if GTK_MAJOR_VERSION >= 2 + g_iconv_close(iconvh); +#else + iconv_close(iconvh); +#endif + iconvh = iconvhBad; + } + } + size_t Convert(char** src, size_t *srcleft, char **dst, size_t *dstleft) const { + if (!Succeeded()) { + return (size_t)(-1); + } else { +#if GTK_MAJOR_VERSION >= 2 + return iconv_adaptor(g_iconv, iconvh, src, srcleft, dst, dstleft); +#else + return iconv_adaptor(iconv, iconvh, src, srcleft, dst, dstleft); +#endif + } + } +}; diff --git a/scintilla/gtk/PlatGTK.cxx b/scintilla/gtk/PlatGTK.cxx new file mode 100644 index 00000000..d48d574b --- /dev/null +++ b/scintilla/gtk/PlatGTK.cxx @@ -0,0 +1,2711 @@ +// Scintilla source code edit control +// PlatGTK.cxx - implementation of platform facilities on GTK+/Linux +// Copyright 1998-2004 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "Scintilla.h" +#include "ScintillaWidget.h" +#include "UniConversion.h" +#include "XPM.h" + +/* GLIB must be compiled with thread support, otherwise we + will bail on trying to use locks, and that could lead to + problems for someone. `glib-config --libs gthread` needs + to be used to get the glib libraries for linking, otherwise + g_thread_init will fail */ +#define USE_LOCK defined(G_THREADS_ENABLED) && !defined(G_THREADS_IMPL_NONE) +/* Use fast way of getting char data on win32 to work around problems + with gdk_string_extents. */ +#define FAST_WAY + +#ifdef G_OS_WIN32 +#define snprintf _snprintf +#endif + +#if GTK_MAJOR_VERSION >= 2 +#define USE_PANGO 1 +#include "Converter.h" +#endif + +#ifdef _MSC_VER +// Ignore unreferenced local functions in GTK+ headers +#pragma warning(disable: 4505) +#endif + +enum encodingType { singleByte, UTF8, dbcs}; + +struct LOGFONT { + int size; + bool bold; + bool italic; + int characterSet; + char faceName[300]; +}; + +#if USE_LOCK +static GMutex *fontMutex = NULL; + +static void InitializeGLIBThreads() { + if (!g_thread_supported()) { + g_thread_init(NULL); + } +} +#endif + +static void FontMutexAllocate() { +#if USE_LOCK + if (!fontMutex) { + InitializeGLIBThreads(); + fontMutex = g_mutex_new(); + } +#endif +} + +static void FontMutexFree() { +#if USE_LOCK + if (fontMutex) { + g_mutex_free(fontMutex); + fontMutex = NULL; + } +#endif +} + +static void FontMutexLock() { +#if USE_LOCK + g_mutex_lock(fontMutex); +#endif +} + +static void FontMutexUnlock() { +#if USE_LOCK + if (fontMutex) { + g_mutex_unlock(fontMutex); + } +#endif +} + +// On GTK+ 1.x holds a GdkFont* but on GTK+ 2.x can hold a GdkFont* or a +// PangoFontDescription*. +class FontHandle { + int width[128]; + encodingType et; +public: + int ascent; + GdkFont *pfont; +#ifdef USE_PANGO + PangoFontDescription *pfd; + int characterSet; +#endif + FontHandle(GdkFont *pfont_) { + et = singleByte; + ascent = 0; + pfont = pfont_; +#ifdef USE_PANGO + pfd = 0; + characterSet = -1; +#endif + ResetWidths(et); + } +#ifdef USE_PANGO + FontHandle(PangoFontDescription *pfd_, int characterSet_) { + et = singleByte; + ascent = 0; + pfont = 0; + pfd = pfd_; + characterSet = characterSet_; + ResetWidths(et); + } +#endif + ~FontHandle() { + if (pfont) + gdk_font_unref(pfont); + pfont = 0; +#ifdef USE_PANGO + if (pfd) + pango_font_description_free(pfd); + pfd = 0; +#endif + } + void ResetWidths(encodingType et_) { + et = et_; + for (int i=0; i<=127; i++) { + width[i] = 0; + } + } + int CharWidth(unsigned char ch, encodingType et_) { + int w = 0; + FontMutexLock(); + if ((ch <= 127) && (et == et_)) { + w = width[ch]; + } + FontMutexUnlock(); + return w; + } + void SetCharWidth(unsigned char ch, int w, encodingType et_) { + if (ch <= 127) { + FontMutexLock(); + if (et != et_) { + ResetWidths(et_); + } + width[ch] = w; + FontMutexUnlock(); + } + } +}; + +// X has a 16 bit coordinate space, so stop drawing here to avoid wrapping +static const int maxCoordinate = 32000; + +static FontHandle *PFont(Font &f) { + return reinterpret_cast(f.GetID()); +} + +static GtkWidget *PWidget(WindowID id) { + return reinterpret_cast(id); +} + +static GtkWidget *PWidget(Window &w) { + return PWidget(w.GetID()); +} + +Point Point::FromLong(long lpoint) { + return Point( + Platform::LowShortFromLong(lpoint), + Platform::HighShortFromLong(lpoint)); +} + +Palette::Palette() { + used = 0; + allowRealization = false; + allocatedPalette = 0; + allocatedLen = 0; + size = 100; + entries = new ColourPair[size]; +} + +Palette::~Palette() { + Release(); + delete []entries; + entries = 0; +} + +void Palette::Release() { + used = 0; + delete [](reinterpret_cast(allocatedPalette)); + allocatedPalette = 0; + allocatedLen = 0; + delete []entries; + size = 100; + entries = new ColourPair[size]; +} + +// This method either adds a colour to the list of wanted colours (want==true) +// or retrieves the allocated colour back to the ColourPair. +// This is one method to make it easier to keep the code for wanting and retrieving in sync. +void Palette::WantFind(ColourPair &cp, bool want) { + if (want) { + for (int i=0; i < used; i++) { + if (entries[i].desired == cp.desired) + return; + } + + if (used >= size) { + int sizeNew = size * 2; + ColourPair *entriesNew = new ColourPair[sizeNew]; + for (int j=0; j(allocatedPalette), + allocatedLen); + delete [](reinterpret_cast(allocatedPalette)); + allocatedPalette = 0; + allocatedLen = 0; + } + GdkColor *paletteNew = new GdkColor[used]; + allocatedPalette = paletteNew; + gboolean *successPalette = new gboolean[used]; + if (paletteNew) { + allocatedLen = used; + int iPal = 0; + for (iPal = 0; iPal < used; iPal++) { + paletteNew[iPal].red = entries[iPal].desired.GetRed() * (65535 / 255); + paletteNew[iPal].green = entries[iPal].desired.GetGreen() * (65535 / 255); + paletteNew[iPal].blue = entries[iPal].desired.GetBlue() * (65535 / 255); + paletteNew[iPal].pixel = entries[iPal].desired.AsLong(); + } + gdk_colormap_alloc_colors(gtk_widget_get_colormap(PWidget(w)), + paletteNew, allocatedLen, FALSE, TRUE, + successPalette); + for (iPal = 0; iPal < used; iPal++) { + entries[iPal].allocated.Set(paletteNew[iPal].pixel); + } + } + delete []successPalette; +} + +static const char *CharacterSetName(int characterSet) { + switch (characterSet) { + case SC_CHARSET_ANSI: + return "iso8859-*"; + case SC_CHARSET_DEFAULT: + return "iso8859-*"; + case SC_CHARSET_BALTIC: + return "iso8859-13"; + case SC_CHARSET_CHINESEBIG5: + return "*-*"; + case SC_CHARSET_EASTEUROPE: + return "*-2"; + case SC_CHARSET_GB2312: + return "gb2312.1980-*"; + case SC_CHARSET_GREEK: + return "*-7"; + case SC_CHARSET_HANGUL: + return "ksc5601.1987-*"; + case SC_CHARSET_MAC: + return "*-*"; + case SC_CHARSET_OEM: + return "*-*"; + case SC_CHARSET_RUSSIAN: + return "*-r"; + case SC_CHARSET_CYRILLIC: + return "*-cp1251"; + case SC_CHARSET_SHIFTJIS: + return "jisx0208.1983-*"; + case SC_CHARSET_SYMBOL: + return "*-*"; + case SC_CHARSET_TURKISH: + return "*-9"; + case SC_CHARSET_JOHAB: + return "*-*"; + case SC_CHARSET_HEBREW: + return "*-8"; + case SC_CHARSET_ARABIC: + return "*-6"; + case SC_CHARSET_VIETNAMESE: + return "*-*"; + case SC_CHARSET_THAI: + return "iso8859-11"; + case SC_CHARSET_8859_15: + return "iso8859-15"; + default: + return "*-*"; + } +} + +static bool IsDBCSCharacterSet(int characterSet) { + switch (characterSet) { + case SC_CHARSET_GB2312: + case SC_CHARSET_HANGUL: + case SC_CHARSET_SHIFTJIS: + case SC_CHARSET_CHINESEBIG5: + return true; + default: + return false; + } +} + +static void GenerateFontSpecStrings(const char *fontName, int characterSet, + char *foundary, int foundary_len, + char *faceName, int faceName_len, + char *charset, int charset_len) { + // supported font strings include: + // foundary-fontface-isoxxx-x + // fontface-isoxxx-x + // foundary-fontface + // fontface + if (strchr(fontName, '-')) { + char tmp[300]; + char *d1 = NULL, *d2 = NULL, *d3 = NULL; + strncpy(tmp, fontName, sizeof(tmp) - 1); + d1 = strchr(tmp, '-'); + // we know the first dash exists + d2 = strchr(d1 + 1, '-'); + if (d2) + d3 = strchr(d2 + 1, '-'); + if (d3) { + // foundary-fontface-isoxxx-x + *d2 = '\0'; + foundary[0] = '-'; + foundary[1] = '\0'; + strncpy(faceName, tmp, foundary_len - 1); + strncpy(charset, d2 + 1, charset_len - 1); + } else if (d2) { + // fontface-isoxxx-x + *d1 = '\0'; + strcpy(foundary, "-*-"); + strncpy(faceName, tmp, faceName_len - 1); + strncpy(charset, d1 + 1, charset_len - 1); + } else { + // foundary-fontface + foundary[0] = '-'; + foundary[1] = '\0'; + strncpy(faceName, tmp, faceName_len - 1); + strncpy(charset, CharacterSetName(characterSet), charset_len - 1); + } + } else { + strncpy(foundary, "-*-", foundary_len); + strncpy(faceName, fontName, faceName_len - 1); + strncpy(charset, CharacterSetName(characterSet), charset_len - 1); + } +} + +static void SetLogFont(LOGFONT &lf, const char *faceName, int characterSet, int size, bool bold, bool italic) { + memset(&lf, 0, sizeof(lf)); + lf.size = size; + lf.bold = bold; + lf.italic = italic; + lf.characterSet = characterSet; + strncpy(lf.faceName, faceName, sizeof(lf.faceName) - 1); +} + +/** + * Create a hash from the parameters for a font to allow easy checking for identity. + * If one font is the same as another, its hash will be the same, but if the hash is the + * same then they may still be different. + */ +static int HashFont(const char *faceName, int characterSet, int size, bool bold, bool italic) { + return + size ^ + (characterSet << 10) ^ + (bold ? 0x10000000 : 0) ^ + (italic ? 0x20000000 : 0) ^ + faceName[0]; +} + +class FontCached : Font { + FontCached *next; + int usage; + LOGFONT lf; + int hash; + FontCached(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_); + ~FontCached() {} + bool SameAs(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_); + virtual void Release(); + static FontID CreateNewFont(const char *fontName, int characterSet, + int size, bool bold, bool italic); + static FontCached *first; +public: + static FontID FindOrCreate(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_); + static void ReleaseId(FontID id_); +}; + +FontCached *FontCached::first = 0; + +FontCached::FontCached(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_) : +next(0), usage(0), hash(0) { + ::SetLogFont(lf, faceName_, characterSet_, size_, bold_, italic_); + hash = HashFont(faceName_, characterSet_, size_, bold_, italic_); + id = CreateNewFont(faceName_, characterSet_, size_, bold_, italic_); + usage = 1; +} + +bool FontCached::SameAs(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_) { + return + lf.size == size_ && + lf.bold == bold_ && + lf.italic == italic_ && + lf.characterSet == characterSet_ && + 0 == strcmp(lf.faceName, faceName_); +} + +void FontCached::Release() { + if (id) + delete PFont(*this); + id = 0; +} + +FontID FontCached::FindOrCreate(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_) { + FontID ret = 0; + FontMutexLock(); + int hashFind = HashFont(faceName_, characterSet_, size_, bold_, italic_); + for (FontCached *cur = first; cur; cur = cur->next) { + if ((cur->hash == hashFind) && + cur->SameAs(faceName_, characterSet_, size_, bold_, italic_)) { + cur->usage++; + ret = cur->id; + } + } + if (ret == 0) { + FontCached *fc = new FontCached(faceName_, characterSet_, size_, bold_, italic_); + if (fc) { + fc->next = first; + first = fc; + ret = fc->id; + } + } + FontMutexUnlock(); + return ret; +} + +void FontCached::ReleaseId(FontID id_) { + FontMutexLock(); + FontCached **pcur = &first; + for (FontCached *cur = first; cur; cur = cur->next) { + if (cur->id == id_) { + cur->usage--; + if (cur->usage == 0) { + *pcur = cur->next; + cur->Release(); + cur->next = 0; + delete cur; + } + break; + } + pcur = &cur->next; + } + FontMutexUnlock(); +} + +static GdkFont *LoadFontOrSet(const char *fontspec, int characterSet) { + if (IsDBCSCharacterSet(characterSet)) { + return gdk_fontset_load(fontspec); + } else { + return gdk_font_load(fontspec); + } +} + +FontID FontCached::CreateNewFont(const char *fontName, int characterSet, + int size, bool bold, bool italic) { + char fontset[1024]; + char fontspec[300]; + char foundary[50]; + char faceName[100]; + char charset[50]; + fontset[0] = '\0'; + fontspec[0] = '\0'; + foundary[0] = '\0'; + faceName[0] = '\0'; + charset[0] = '\0'; + +#ifdef USE_PANGO + if (fontName[0] == '!') { + PangoFontDescription *pfd = pango_font_description_new(); + if (pfd) { + pango_font_description_set_family(pfd, fontName+1); + pango_font_description_set_size(pfd, size * PANGO_SCALE); + pango_font_description_set_weight(pfd, bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL); + pango_font_description_set_style(pfd, italic ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL); + return new FontHandle(pfd, characterSet); + } + } +#endif + + GdkFont *newid = 0; + // If name of the font begins with a '-', assume, that it is + // a full fontspec. + if (fontName[0] == '-') { + if (strchr(fontName, ',') || IsDBCSCharacterSet(characterSet)) { + newid = gdk_fontset_load(fontName); + } else { + newid = gdk_font_load(fontName); + } + if (!newid) { + // Font not available so substitute a reasonable code font + // iso8859 appears to only allow western characters. + newid = LoadFontOrSet("-*-*-*-*-*-*-*-*-*-*-*-*-iso8859-*", + characterSet); + } + return new FontHandle(newid); + } + + // it's not a full fontspec, build one. + + // This supports creating a FONT_SET + // in a method that allows us to also set size, slant and + // weight for the fontset. The expected input is multiple + // partial fontspecs seperated by comma + // eg. adobe-courier-iso10646-1,*-courier-iso10646-1,*-*-*-* + if (strchr(fontName, ',')) { + // build a fontspec and use gdk_fontset_load + int remaining = sizeof(fontset); + char fontNameCopy[1024]; + strncpy(fontNameCopy, fontName, sizeof(fontNameCopy) - 1); + char *fn = fontNameCopy; + char *fp = strchr(fn, ','); + for (;;) { + const char *spec = "%s%s%s%s-*-*-*-%0d-*-*-*-*-%s"; + if (fontset[0] != '\0') { + // if this is not the first font in the list, + // append a comma seperator + spec = ",%s%s%s%s-*-*-*-%0d-*-*-*-*-%s"; + } + + if (fp) + *fp = '\0'; // nullify the comma + GenerateFontSpecStrings(fn, characterSet, + foundary, sizeof(foundary), + faceName, sizeof(faceName), + charset, sizeof(charset)); + + snprintf(fontspec, + sizeof(fontspec) - 1, + spec, + foundary, faceName, + bold ? "-bold" : "-medium", + italic ? "-i" : "-r", + size * 10, + charset); + + // if this is the first font in the list, and + // we are doing italic, add an oblique font + // to the list + if (italic && fontset[0] == '\0') { + strncat(fontset, fontspec, remaining - 1); + remaining -= strlen(fontset); + + snprintf(fontspec, + sizeof(fontspec) - 1, + ",%s%s%s-o-*-*-*-%0d-*-*-*-*-%s", + foundary, faceName, + bold ? "-bold" : "-medium", + size * 10, + charset); + } + + strncat(fontset, fontspec, remaining - 1); + remaining -= strlen(fontset); + + if (!fp) + break; + + fn = fp + 1; + fp = strchr(fn, ','); + } + + newid = gdk_fontset_load(fontset); + if (newid) + return new FontHandle(newid); + + // if fontset load failed, fall through, we'll use + // the last font entry and continue to try and + // get something that matches + } + + // single fontspec support + + GenerateFontSpecStrings(fontName, characterSet, + foundary, sizeof(foundary), + faceName, sizeof(faceName), + charset, sizeof(charset)); + + snprintf(fontspec, + sizeof(fontspec) - 1, + "%s%s%s%s-*-*-*-%0d-*-*-*-*-%s", + foundary, faceName, + bold ? "-bold" : "-medium", + italic ? "-i" : "-r", + size * 10, + charset); + newid = LoadFontOrSet(fontspec, characterSet); + if (!newid) { + // some fonts have oblique, not italic + snprintf(fontspec, + sizeof(fontspec) - 1, + "%s%s%s%s-*-*-*-%0d-*-*-*-*-%s", + foundary, faceName, + bold ? "-bold" : "-medium", + italic ? "-o" : "-r", + size * 10, + charset); + newid = LoadFontOrSet(fontspec, characterSet); + } + if (!newid) { + snprintf(fontspec, + sizeof(fontspec) - 1, + "-*-*-*-*-*-*-*-%0d-*-*-*-*-%s", + size * 10, + charset); + newid = gdk_font_load(fontspec); + } + if (!newid) { + // Font not available so substitute a reasonable code font + // iso8859 appears to only allow western characters. + newid = LoadFontOrSet("-*-*-*-*-*-*-*-*-*-*-*-*-iso8859-*", + characterSet); + } + return new FontHandle(newid); +} + +Font::Font() : id(0) {} + +Font::~Font() {} + +void Font::Create(const char *faceName, int characterSet, int size, + bool bold, bool italic, bool) { + Release(); + id = FontCached::FindOrCreate(faceName, characterSet, size, bold, italic); +} + +void Font::Release() { + if (id) + FontCached::ReleaseId(id); + id = 0; +} + +class SurfaceImpl : public Surface { + encodingType et; + GdkDrawable *drawable; + GdkGC *gc; + GdkPixmap *ppixmap; + int x; + int y; + bool inited; + bool createdGC; +#ifdef USE_PANGO + PangoContext *pcontext; + PangoLayout *layout; + Converter conv; + int characterSet; + void SetConverter(int characterSet_); +#endif +public: + SurfaceImpl(); + virtual ~SurfaceImpl(); + + void Init(WindowID wid); + void Init(SurfaceID sid, WindowID wid); + void InitPixMap(int width, int height, Surface *surface_, WindowID wid); + + void Release(); + bool Initialised(); + void PenColour(ColourAllocated fore); + int LogPixelsY(); + int DeviceHeightFont(int points); + void MoveTo(int x_, int y_); + void LineTo(int x_, int y_); + void Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back); + void RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back); + void FillRectangle(PRectangle rc, ColourAllocated back); + void FillRectangle(PRectangle rc, Surface &surfacePattern); + void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back); + void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, + ColourAllocated outline, int alphaOutline, int flags); + void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back); + void Copy(PRectangle rc, Point from, Surface &surfaceSource); + + void DrawTextBase(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore); + void DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back); + void DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back); + void DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore); + void MeasureWidths(Font &font_, const char *s, int len, int *positions); + int WidthText(Font &font_, const char *s, int len); + int WidthChar(Font &font_, char ch); + int Ascent(Font &font_); + int Descent(Font &font_); + int InternalLeading(Font &font_); + int ExternalLeading(Font &font_); + int Height(Font &font_); + int AverageCharWidth(Font &font_); + + int SetPalette(Palette *pal, bool inBackGround); + void SetClip(PRectangle rc); + void FlushCachedState(); + + void SetUnicodeMode(bool unicodeMode_); + void SetDBCSMode(int codePage); +}; + +const char *CharacterSetID(int characterSet) { + switch (characterSet) { + case SC_CHARSET_ANSI: + return ""; + case SC_CHARSET_DEFAULT: + return "ISO-8859-1"; + case SC_CHARSET_BALTIC: + return "ISO-8859-13"; + case SC_CHARSET_CHINESEBIG5: + return "BIG-5"; + case SC_CHARSET_EASTEUROPE: + return "ISO-8859-2"; + case SC_CHARSET_GB2312: + return "GB2312"; + case SC_CHARSET_GREEK: + return "ISO-8859-7"; + case SC_CHARSET_HANGUL: + return ""; + case SC_CHARSET_MAC: + return "MACINTOSH"; + case SC_CHARSET_OEM: + return "ASCII"; + case SC_CHARSET_RUSSIAN: + return "KOI8-R"; + case SC_CHARSET_CYRILLIC: + return "CP1251"; + case SC_CHARSET_SHIFTJIS: + return "SHIFT-JIS"; + case SC_CHARSET_SYMBOL: + return ""; + case SC_CHARSET_TURKISH: + return "ISO-8859-9"; + case SC_CHARSET_JOHAB: + return "JOHAB"; + case SC_CHARSET_HEBREW: + return "ISO-8859-8"; + case SC_CHARSET_ARABIC: + return "ISO-8859-6"; + case SC_CHARSET_VIETNAMESE: + return ""; + case SC_CHARSET_THAI: + return "ISO-8859-11"; + case SC_CHARSET_8859_15: + return "ISO-8859-15"; + default: + return ""; + } +} + +#ifdef USE_PANGO + +void SurfaceImpl::SetConverter(int characterSet_) { + if (characterSet != characterSet_) { + characterSet = characterSet_; + conv.Open("UTF-8", CharacterSetID(characterSet), false); + } +} +#endif + +SurfaceImpl::SurfaceImpl() : et(singleByte), drawable(0), gc(0), ppixmap(0), +x(0), y(0), inited(false), createdGC(false) +#ifdef USE_PANGO +, pcontext(0), layout(0), characterSet(-1) +#endif +{ +} + +SurfaceImpl::~SurfaceImpl() { + Release(); +} + +void SurfaceImpl::Release() { + et = singleByte; + drawable = 0; + if (createdGC) { + createdGC = false; + gdk_gc_unref(gc); + } + gc = 0; + if (ppixmap) + gdk_pixmap_unref(ppixmap); + ppixmap = 0; +#ifdef USE_PANGO + if (layout) + g_object_unref(layout); + layout = 0; + if (pcontext) + g_object_unref(pcontext); + pcontext = 0; + conv.Close(); + characterSet = -1; +#endif + x = 0; + y = 0; + inited = false; + createdGC = false; +} + +bool SurfaceImpl::Initialised() { + return inited; +} + +// The WindowID argument is only used for Pango builds +#ifdef USE_PANGO +#define WID_NAME wid +#else +#define WID_NAME +#endif + +void SurfaceImpl::Init(WindowID WID_NAME) { + Release(); +#ifdef USE_PANGO + PLATFORM_ASSERT(wid); + pcontext = gtk_widget_create_pango_context(PWidget(wid)); + PLATFORM_ASSERT(pcontext); + layout = pango_layout_new(pcontext); + PLATFORM_ASSERT(layout); +#endif + inited = true; +} + +void SurfaceImpl::Init(SurfaceID sid, WindowID WID_NAME) { + PLATFORM_ASSERT(sid); + GdkDrawable *drawable_ = reinterpret_cast(sid); + Release(); +#ifdef USE_PANGO + PLATFORM_ASSERT(wid); + pcontext = gtk_widget_create_pango_context(PWidget(wid)); + layout = pango_layout_new(pcontext); +#endif + drawable = drawable_; + gc = gdk_gc_new(drawable_); + // Ask for lines that do not paint the last pixel so is like Win32 + gdk_gc_set_line_attributes(gc, 0, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER); + createdGC = true; + inited = true; +} + +void SurfaceImpl::InitPixMap(int width, int height, Surface *surface_, WindowID WID_NAME) { + PLATFORM_ASSERT(surface_); + Release(); + SurfaceImpl *surfImpl = static_cast(surface_); + PLATFORM_ASSERT(surfImpl->drawable); +#ifdef USE_PANGO + PLATFORM_ASSERT(wid); + pcontext = gtk_widget_create_pango_context(PWidget(wid)); + PLATFORM_ASSERT(pcontext); + layout = pango_layout_new(pcontext); + PLATFORM_ASSERT(layout); +#endif + if (height > 0 && width > 0) + ppixmap = gdk_pixmap_new(surfImpl->drawable, width, height, -1); + drawable = ppixmap; + gc = gdk_gc_new(surfImpl->drawable); + // Ask for lines that do not paint the last pixel so is like Win32 + gdk_gc_set_line_attributes(gc, 0, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER); + createdGC = true; + inited = true; +} + +void SurfaceImpl::PenColour(ColourAllocated fore) { + if (gc) { + GdkColor co; + co.pixel = fore.AsLong(); + gdk_gc_set_foreground(gc, &co); + } +} + +int SurfaceImpl::LogPixelsY() { + return 72; +} + +int SurfaceImpl::DeviceHeightFont(int points) { + int logPix = LogPixelsY(); + return (points * logPix + logPix / 2) / 72; +} + +void SurfaceImpl::MoveTo(int x_, int y_) { + x = x_; + y = y_; +} + +void SurfaceImpl::LineTo(int x_, int y_) { + if (drawable && gc) { + gdk_draw_line(drawable, gc, + x, y, + x_, y_); + } + x = x_; + y = y_; +} + +void SurfaceImpl::Polygon(Point *pts, int npts, ColourAllocated fore, + ColourAllocated back) { + GdkPoint gpts[20]; + if (npts < static_cast((sizeof(gpts) / sizeof(gpts[0])))) { + for (int i = 0;i < npts;i++) { + gpts[i].x = pts[i].x; + gpts[i].y = pts[i].y; + } + PenColour(back); + gdk_draw_polygon(drawable, gc, 1, gpts, npts); + PenColour(fore); + gdk_draw_polygon(drawable, gc, 0, gpts, npts); + } +} + +void SurfaceImpl::RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back) { + if (gc && drawable) { + PenColour(back); + gdk_draw_rectangle(drawable, gc, 1, + rc.left + 1, rc.top + 1, + rc.right - rc.left - 2, rc.bottom - rc.top - 2); + + PenColour(fore); + // The subtraction of 1 off the width and height here shouldn't be needed but + // otherwise a different rectangle is drawn than would be done if the fill parameter == 1 + gdk_draw_rectangle(drawable, gc, 0, + rc.left, rc.top, + rc.right - rc.left - 1, rc.bottom - rc.top - 1); + } +} + +void SurfaceImpl::FillRectangle(PRectangle rc, ColourAllocated back) { + PenColour(back); + if (drawable && (rc.left < maxCoordinate)) { // Protect against out of range + gdk_draw_rectangle(drawable, gc, 1, + rc.left, rc.top, + rc.right - rc.left, rc.bottom - rc.top); + } +} + +void SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern) { + if (static_cast(surfacePattern).drawable) { + // Tile pattern over rectangle + // Currently assumes 8x8 pattern + int widthPat = 8; + int heightPat = 8; + for (int xTile = rc.left; xTile < rc.right; xTile += widthPat) { + int widthx = (xTile + widthPat > rc.right) ? rc.right - xTile : widthPat; + for (int yTile = rc.top; yTile < rc.bottom; yTile += heightPat) { + int heighty = (yTile + heightPat > rc.bottom) ? rc.bottom - yTile : heightPat; + gdk_draw_pixmap(drawable, + gc, + static_cast(surfacePattern).drawable, + 0, 0, + xTile, yTile, + widthx, heighty); + } + } + } else { + // Something is wrong so try to show anyway + // Shows up black because colour not allocated + FillRectangle(rc, ColourAllocated(0)); + } +} + +void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back) { + if (((rc.right - rc.left) > 4) && ((rc.bottom - rc.top) > 4)) { + // Approximate a round rect with some cut off corners + Point pts[] = { + Point(rc.left + 2, rc.top), + Point(rc.right - 2, rc.top), + Point(rc.right, rc.top + 2), + Point(rc.right, rc.bottom - 2), + Point(rc.right - 2, rc.bottom), + Point(rc.left + 2, rc.bottom), + Point(rc.left, rc.bottom - 2), + Point(rc.left, rc.top + 2), + }; + Polygon(pts, sizeof(pts) / sizeof(pts[0]), fore, back); + } else { + RectangleDraw(rc, fore, back); + } +} + +#if GTK_MAJOR_VERSION >= 2 + +// Plot a point into a guint32 buffer symetrically to all 4 qudrants +static void AllFour(guint32 *pixels, int stride, int width, int height, int x, int y, guint32 val) { + pixels[y*stride+x] = val; + pixels[y*stride+width-1-x] = val; + pixels[(height-1-y)*stride+x] = val; + pixels[(height-1-y)*stride+width-1-x] = val; +} + +static unsigned int GetRValue(unsigned int co) { + return (co >> 16) & 0xff; +} + +static unsigned int GetGValue(unsigned int co) { + return (co >> 8) & 0xff; +} + +static unsigned int GetBValue(unsigned int co) { + return co & 0xff; +} + +#endif + +#if GTK_MAJOR_VERSION < 2 +void SurfaceImpl::AlphaRectangle(PRectangle rc, int , ColourAllocated , int , ColourAllocated outline, int , int ) { + if (gc && drawable) { + // Can't use GdkPixbuf on GTK+ 1.x, so draw an outline rather than use alpha. + PenColour(outline); + gdk_draw_rectangle(drawable, gc, 0, + rc.left, rc.top, + rc.right - rc.left - 1, rc.bottom - rc.top - 1); + } +} +#else +void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, + ColourAllocated outline, int alphaOutline, int flags) { + if (gc && drawable) { + int width = rc.Width(); + int height = rc.Height(); + // Ensure not distorted too much by corners when small + cornerSize = Platform::Minimum(cornerSize, (Platform::Minimum(width, height) / 2) - 2); + // Make a 32 bit deep pixbuf with alpha + GdkPixbuf *pixalpha = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); + + guint8 pixVal[4] = {0}; + guint32 valEmpty = *(reinterpret_cast(pixVal)); + pixVal[0] = GetRValue(fill.AsLong()); + pixVal[1] = GetGValue(fill.AsLong()); + pixVal[2] = GetBValue(fill.AsLong()); + pixVal[3] = alphaFill; + guint32 valFill = *(reinterpret_cast(pixVal)); + pixVal[0] = GetRValue(outline.AsLong()); + pixVal[1] = GetGValue(outline.AsLong()); + pixVal[2] = GetBValue(outline.AsLong()); + pixVal[3] = alphaOutline; + guint32 valOutline = *(reinterpret_cast(pixVal)); + guint32 *pixels = reinterpret_cast(gdk_pixbuf_get_pixels(pixalpha)); + int stride = gdk_pixbuf_get_rowstride(pixalpha) / 4; + for (int y=0; y(surfaceSource).drawable) { + gdk_draw_pixmap(drawable, + gc, + static_cast(surfaceSource).drawable, + from.x, from.y, + rc.left, rc.top, + rc.right - rc.left, rc.bottom - rc.top); + } +} + +static size_t UTF8Len(char ch) { + unsigned char uch = static_cast(ch); + if (uch < 0x80) + return 1; + else if (uch < (0x80 + 0x40 + 0x20)) + return 2; + else + return 3; +} + +char *UTF8FromLatin1(const char *s, int &len) { + char *utfForm = new char[len*2+1]; + size_t lenU = 0; + for (int i=0;i(s[i]); + if (uch < 0x80) { + utfForm[lenU++] = uch; + } else { + utfForm[lenU++] = static_cast(0xC0 | (uch >> 6)); + utfForm[lenU++] = static_cast(0x80 | (uch & 0x3f)); + } + } + utfForm[lenU] = '\0'; + len = lenU; + return utfForm; +} + +#ifdef USE_PANGO +static char *UTF8FromIconv(const Converter &conv, const char *s, int &len) { + if (conv) { + char *utfForm = new char[len*3+1]; + char *pin = const_cast(s); + size_t inLeft = len; + char *pout = utfForm; + size_t outLeft = len*3+1; + size_t conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); + if (conversions != ((size_t)(-1))) { + *pout = '\0'; + len = pout - utfForm; + return utfForm; + } + delete []utfForm; + } + return 0; +} + +// Work out how many bytes are in a character by trying to convert using iconv, +// returning the first length that succeeds. +static size_t MultiByteLenFromIconv(const Converter &conv, const char *s, size_t len) { + for (size_t lenMB=1; (lenMB<4) && (lenMB <= len); lenMB++) { + char wcForm[2]; + char *pin = const_cast(s); + size_t inLeft = lenMB; + char *pout = wcForm; + size_t outLeft = 2; + size_t conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); + if (conversions != ((size_t)(-1))) { + return lenMB; + } + } + return 1; +} + +static char *UTF8FromGdkWChar(GdkWChar *wctext, int wclen) { + char *utfForm = new char[wclen*3+1]; // Maximum of 3 UTF-8 bytes per character + size_t lenU = 0; + for (int i = 0; i < wclen && wctext[i]; i++) { + unsigned int uch = wctext[i]; + if (uch < 0x80) { + utfForm[lenU++] = static_cast(uch); + } else if (uch < 0x800) { + utfForm[lenU++] = static_cast(0xC0 | (uch >> 6)); + utfForm[lenU++] = static_cast(0x80 | (uch & 0x3f)); + } else { + utfForm[lenU++] = static_cast(0xE0 | (uch >> 12)); + utfForm[lenU++] = static_cast(0x80 | ((uch >> 6) & 0x3f)); + utfForm[lenU++] = static_cast(0x80 | (uch & 0x3f)); + } + } + utfForm[lenU] = '\0'; + return utfForm; +} + +static char *UTF8FromDBCS(const char *s, int &len) { + GdkWChar *wctext = new GdkWChar[len + 1]; + GdkWChar *wcp = wctext; + int wclen = gdk_mbstowcs(wcp, s, len); + if (wclen < 1) { + // In the annoying case when non-locale chars in the line. + // e.g. latin1 chars in Japanese locale. + delete []wctext; + return 0; + } + + char *utfForm = UTF8FromGdkWChar(wctext, wclen); + delete []wctext; + len = strlen(utfForm); + return utfForm; +} + +static size_t UTF8CharLength(const char *s) { + const unsigned char *us = reinterpret_cast(s); + unsigned char ch = *us; + if (ch < 0x80) { + return 1; + } else if (ch < 0x80 + 0x40 + 0x20) { + return 2; + } else { + return 3; + } +} + +#endif + +// On GTK+, wchar_t is 4 bytes + +const int maxLengthTextRun = 10000; + +void SurfaceImpl::DrawTextBase(PRectangle rc, Font &font_, int ybase, const char *s, int len, + ColourAllocated fore) { + PenColour(fore); + if (gc && drawable) { + int x = rc.left; +#ifdef USE_PANGO + if (PFont(font_)->pfd) { + char *utfForm = 0; + bool useGFree = false; + if (et == UTF8) { + pango_layout_set_text(layout, s, len); + } else { + if (!utfForm) { + SetConverter(PFont(font_)->characterSet); + utfForm = UTF8FromIconv(conv, s, len); + } + if (!utfForm) { // iconv failed so try DBCS if DBCS mode + if (et == dbcs) { + // Convert to utf8 + utfForm = UTF8FromDBCS(s, len); + } + } + if (!utfForm) { // iconv and DBCS failed so treat as Latin1 + utfForm = UTF8FromLatin1(s, len); + } + pango_layout_set_text(layout, utfForm, len); + } + pango_layout_set_font_description(layout, PFont(font_)->pfd); + PangoLayoutLine *pll = pango_layout_get_line(layout,0); + gdk_draw_layout_line(drawable, gc, x, ybase, pll); + if (useGFree) { + g_free(utfForm); + } else { + delete []utfForm; + } + return; + } +#endif + // Draw text as a series of segments to avoid limitations in X servers + const int segmentLength = 1000; + bool draw8bit = true; + if (et != singleByte) { + GdkWChar wctext[maxLengthTextRun]; + if (len >= maxLengthTextRun) + len = maxLengthTextRun-1; + int wclen; + if (et == UTF8) { + wclen = UCS2FromUTF8(s, len, + static_cast(static_cast(wctext)), maxLengthTextRun - 1); + } else { // dbcs, so convert using current locale + char sMeasure[maxLengthTextRun]; + memcpy(sMeasure, s, len); + sMeasure[len] = '\0'; + wclen = gdk_mbstowcs( + wctext, sMeasure, maxLengthTextRun - 1); + } + if (wclen > 0) { + draw8bit = false; + wctext[wclen] = L'\0'; + GdkWChar *wcp = wctext; + while ((wclen > 0) && (x < maxCoordinate)) { + int lenDraw = Platform::Minimum(wclen, segmentLength); + gdk_draw_text_wc(drawable, PFont(font_)->pfont, gc, + x, ybase, wcp, lenDraw); + wclen -= lenDraw; + if (wclen > 0) { // Avoid next calculation if possible as may be expensive + x += gdk_text_width_wc(PFont(font_)->pfont, + wcp, lenDraw); + } + wcp += lenDraw; + } + } + } + if (draw8bit) { + while ((len > 0) && (x < maxCoordinate)) { + int lenDraw = Platform::Minimum(len, segmentLength); + gdk_draw_text(drawable, PFont(font_)->pfont, gc, + x, ybase, s, lenDraw); + len -= lenDraw; + if (len > 0) { // Avoid next calculation if possible as may be expensive + x += gdk_text_width(PFont(font_)->pfont, s, lenDraw); + } + s += lenDraw; + } + } + } +} + +void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, + ColourAllocated fore, ColourAllocated back) { + FillRectangle(rc, back); + DrawTextBase(rc, font_, ybase, s, len, fore); +} + +// On GTK+, exactly same as DrawTextNoClip +void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, + ColourAllocated fore, ColourAllocated back) { + FillRectangle(rc, back); + DrawTextBase(rc, font_, ybase, s, len, fore); +} + +void SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, + ColourAllocated fore) { + // Avoid drawing spaces in transparent mode + for (int i=0;ipfd) { + if (len == 1) { + int width = PFont(font_)->CharWidth(*s, et); + if (width) { + positions[0] = width; + return; + } + } + PangoRectangle pos; + pango_layout_set_font_description(layout, PFont(font_)->pfd); + if (et == UTF8) { + // Simple and direct as UTF-8 is native Pango encoding + pango_layout_set_text(layout, s, len); + PangoLayoutIter *iter = pango_layout_get_iter(layout); + pango_layout_iter_get_cluster_extents(iter, NULL, &pos); + int i = 0; + while (pango_layout_iter_next_cluster(iter)) { + pango_layout_iter_get_cluster_extents(iter, NULL, &pos); + int position = PANGO_PIXELS(pos.x); + int curIndex = pango_layout_iter_get_index(iter); + while (i < curIndex) { + positions[i++] = position; + } + } + while (i < lenPositions) + positions[i++] = PANGO_PIXELS(pos.x + pos.width); + pango_layout_iter_free(iter); + PLATFORM_ASSERT(i == lenPositions); + } else { + int positionsCalculated = 0; + if (et == dbcs) { + SetConverter(PFont(font_)->characterSet); + char *utfForm = UTF8FromIconv(conv, s, len); + if (utfForm) { + // Convert to UTF-8 so can ask Pango for widths, then + // Loop through UTF-8 and DBCS forms, taking account of different + // character byte lengths. + Converter convMeasure("UCS-2", CharacterSetID(characterSet), false); + pango_layout_set_text(layout, utfForm, strlen(utfForm)); + int i = 0; + int utfIndex = 0; + PangoLayoutIter *iter = pango_layout_get_iter(layout); + pango_layout_iter_get_cluster_extents(iter, NULL, &pos); + while (pango_layout_iter_next_cluster(iter)) { + pango_layout_iter_get_cluster_extents (iter, NULL, &pos); + int position = PANGO_PIXELS(pos.x); + int utfIndexNext = pango_layout_iter_get_index(iter); + while (utfIndex < utfIndexNext) { + size_t lenChar = MultiByteLenFromIconv(convMeasure, s+i, len-i); + //size_t lenChar = mblen(s+i, MB_CUR_MAX); + while (lenChar--) { + positions[i++] = position; + positionsCalculated++; + } + utfIndex += UTF8CharLength(utfForm+utfIndex); + } + } + while (i < lenPositions) + positions[i++] = PANGO_PIXELS(pos.x + pos.width); + pango_layout_iter_free(iter); + delete []utfForm; + PLATFORM_ASSERT(i == lenPositions); + } + } + if (positionsCalculated < 1 ) { + // Either Latin1 or DBCS conversion failed so treat as Latin1. + bool useGFree = false; + SetConverter(PFont(font_)->characterSet); + char *utfForm = UTF8FromIconv(conv, s, len); + if (!utfForm) { + utfForm = UTF8FromLatin1(s, len); + } + pango_layout_set_text(layout, utfForm, len); + int i = 0; + PangoLayoutIter *iter = pango_layout_get_iter(layout); + pango_layout_iter_get_cluster_extents(iter, NULL, &pos); + while (pango_layout_iter_next_cluster(iter)) { + pango_layout_iter_get_cluster_extents(iter, NULL, &pos); + positions[i++] = PANGO_PIXELS(pos.x); + } + while (i < lenPositions) + positions[i++] = PANGO_PIXELS(pos.x + pos.width); + pango_layout_iter_free(iter); + if (useGFree) { + g_free(utfForm); + } else { + delete []utfForm; + } + PLATFORM_ASSERT(i == lenPositions); + } + } + if (len == 1) { + PFont(font_)->SetCharWidth(*s, positions[0], et); + } + return; + } +#endif + GdkFont *gf = PFont(font_)->pfont; + bool measure8bit = true; + if (et != singleByte) { + GdkWChar wctext[maxLengthTextRun]; + if (len >= maxLengthTextRun) + len = maxLengthTextRun-1; + int wclen; + if (et == UTF8) { + wclen = UCS2FromUTF8(s, len, + static_cast(static_cast(wctext)), maxLengthTextRun - 1); + } else { // dbcsMode, so convert using current locale + char sDraw[maxLengthTextRun]; + memcpy(sDraw, s, len); + sDraw[len] = '\0'; + wclen = gdk_mbstowcs( + wctext, sDraw, maxLengthTextRun - 1); + } + if (wclen > 0) { + measure8bit = false; + wctext[wclen] = L'\0'; + // Map widths back to utf-8 or DBCS input string + int i = 0; + for (int iU = 0; iU < wclen; iU++) { + int width = gdk_char_width_wc(gf, wctext[iU]); + totalWidth += width; + int lenChar; + if (et == UTF8) { + lenChar = UTF8Len(s[i]); + } else { + lenChar = mblen(s+i, MB_CUR_MAX); + if (lenChar < 0) + lenChar = 1; + } + while (lenChar--) { + positions[i++] = totalWidth; + } + } + while (i < len) { // In case of problems with lengths + positions[i++] = totalWidth; + } + } + } + if (measure8bit) { + // Either Latin1 or conversion failed so treat as Latin1. + for (int i = 0; i < len; i++) { + int width = gdk_char_width(gf, s[i]); + totalWidth += width; + positions[i] = totalWidth; + } + } + } else { + // No font so return an ascending range of values + for (int i = 0; i < len; i++) { + positions[i] = i + 1; + } + } +} + +int SurfaceImpl::WidthText(Font &font_, const char *s, int len) { + if (font_.GetID()) { +#ifdef USE_PANGO + if (PFont(font_)->pfd) { + char *utfForm = 0; + pango_layout_set_font_description(layout, PFont(font_)->pfd); + PangoRectangle pos; + bool useGFree = false; + if (et == UTF8) { + pango_layout_set_text(layout, s, len); + } else { + if (et == dbcs) { + // Convert to utf8 + utfForm = UTF8FromDBCS(s, len); + } + if (!utfForm) { // DBCS failed so treat as iconv + SetConverter(PFont(font_)->characterSet); + utfForm = UTF8FromIconv(conv, s, len); + } + if (!utfForm) { // g_locale_to_utf8 failed so treat as Latin1 + utfForm = UTF8FromLatin1(s, len); + } + pango_layout_set_text(layout, utfForm, len); + } + PangoLayoutLine *pangoLine = pango_layout_get_line(layout, 0); + pango_layout_line_get_extents(pangoLine, NULL, &pos); + if (useGFree) { + g_free(utfForm); + } else { + delete []utfForm; + } + return PANGO_PIXELS(pos.width); + } +#endif + if (et == UTF8) { + GdkWChar wctext[maxLengthTextRun]; + size_t wclen = UCS2FromUTF8(s, len, static_cast(static_cast(wctext)), + sizeof(wctext) / sizeof(GdkWChar) - 1); + wctext[wclen] = L'\0'; + return gdk_text_width_wc(PFont(font_)->pfont, wctext, wclen); + } else { + return gdk_text_width(PFont(font_)->pfont, s, len); + } + } else { + return 1; + } +} + +int SurfaceImpl::WidthChar(Font &font_, char ch) { + if (font_.GetID()) { +#ifdef USE_PANGO + if (PFont(font_)->pfd) { + return WidthText(font_, &ch, 1); + } +#endif + return gdk_char_width(PFont(font_)->pfont, ch); + } else { + return 1; + } +} + +// Three possible strategies for determining ascent and descent of font: +// 1) Call gdk_string_extents with string containing all letters, numbers and punctuation. +// 2) Use the ascent and descent fields of GdkFont. +// 3) Call gdk_string_extents with string as 1 but also including accented capitals. +// Smallest values given by 1 and largest by 3 with 2 in between. +// Techniques 1 and 2 sometimes chop off extreme portions of ascenders and +// descenders but are mostly OK except for accented characters like Å which are +// rarely used in code. + +// This string contains a good range of characters to test for size. +//const char largeSizeString[] = "ÂÃÅÄ `~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890" +// "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; +#ifndef FAST_WAY +const char sizeString[] = "`~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890" + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; +#endif + +int SurfaceImpl::Ascent(Font &font_) { + if (!(font_.GetID())) + return 1; +#ifdef FAST_WAY + FontMutexLock(); + int ascent = PFont(font_)->ascent; +#ifdef USE_PANGO + if ((ascent == 0) && (PFont(font_)->pfd)) { + PangoFontMetrics *metrics = pango_context_get_metrics(pcontext, + PFont(font_)->pfd, pango_context_get_language(pcontext)); + PFont(font_)->ascent = + PANGO_PIXELS(pango_font_metrics_get_ascent(metrics)); + pango_font_metrics_unref(metrics); + ascent = PFont(font_)->ascent; + } +#endif + if ((ascent == 0) && (PFont(font_)->pfont)) { + ascent = PFont(font_)->pfont->ascent; + } + if (ascent == 0) { + ascent = 1; + } + FontMutexUnlock(); + return ascent; +#else + + gint lbearing; + gint rbearing; + gint width; + gint ascent; + gint descent; + + gdk_string_extents(PFont(font_)->pfont, sizeString, + &lbearing, &rbearing, &width, &ascent, &descent); + return ascent; +#endif +} + +int SurfaceImpl::Descent(Font &font_) { + if (!(font_.GetID())) + return 1; +#ifdef FAST_WAY + +#ifdef USE_PANGO + if (PFont(font_)->pfd) { + PangoFontMetrics *metrics = pango_context_get_metrics(pcontext, + PFont(font_)->pfd, pango_context_get_language(pcontext)); + int descent = PANGO_PIXELS(pango_font_metrics_get_descent(metrics)); + pango_font_metrics_unref(metrics); + return descent; + } +#endif + return PFont(font_)->pfont->descent; +#else + + gint lbearing; + gint rbearing; + gint width; + gint ascent; + gint descent; + + gdk_string_extents(PFont(font_)->pfont, sizeString, + &lbearing, &rbearing, &width, &ascent, &descent); + return descent; +#endif +} + +int SurfaceImpl::InternalLeading(Font &) { + return 0; +} + +int SurfaceImpl::ExternalLeading(Font &) { + return 0; +} + +int SurfaceImpl::Height(Font &font_) { + return Ascent(font_) + Descent(font_); +} + +int SurfaceImpl::AverageCharWidth(Font &font_) { + return WidthChar(font_, 'n'); +} + +int SurfaceImpl::SetPalette(Palette *, bool) { + // Handled in palette allocation for GTK so this does nothing + return 0; +} + +void SurfaceImpl::SetClip(PRectangle rc) { + GdkRectangle area = {rc.left, rc.top, + rc.right - rc.left, rc.bottom - rc.top}; + gdk_gc_set_clip_rectangle(gc, &area); +} + +void SurfaceImpl::FlushCachedState() {} + +void SurfaceImpl::SetUnicodeMode(bool unicodeMode_) { + if (unicodeMode_) + et = UTF8; +} + +void SurfaceImpl::SetDBCSMode(int codePage) { + if (codePage && (codePage != SC_CP_UTF8)) + et = dbcs; +} + +Surface *Surface::Allocate() { + return new SurfaceImpl; +} + +Window::~Window() {} + +void Window::Destroy() { + if (id) + gtk_widget_destroy(GTK_WIDGET(id)); + id = 0; +} + +bool Window::HasFocus() { + return GTK_WIDGET_HAS_FOCUS(id); +} + +PRectangle Window::GetPosition() { + // Before any size allocated pretend its 1000 wide so not scrolled + PRectangle rc(0, 0, 1000, 1000); + if (id) { + rc.left = PWidget(id)->allocation.x; + rc.top = PWidget(id)->allocation.y; + if (PWidget(id)->allocation.width > 20) { + rc.right = rc.left + PWidget(id)->allocation.width; + rc.bottom = rc.top + PWidget(id)->allocation.height; + } + } + return rc; +} + +void Window::SetPosition(PRectangle rc) { +#if 1 + //gtk_widget_set_uposition(id, rc.left, rc.top); + GtkAllocation alloc; + alloc.x = rc.left; + alloc.y = rc.top; + alloc.width = rc.Width(); + alloc.height = rc.Height(); + gtk_widget_size_allocate(PWidget(id), &alloc); +#else + + gtk_widget_set_uposition(id, rc.left, rc.top); + gtk_widget_set_usize(id, rc.right - rc.left, rc.bottom - rc.top); +#endif +} + +void Window::SetPositionRelative(PRectangle rc, Window relativeTo) { + int ox = 0; + int oy = 0; + gdk_window_get_origin(PWidget(relativeTo.id)->window, &ox, &oy); + ox += rc.left; + if (ox < 0) + ox = 0; + oy += rc.top; + if (oy < 0) + oy = 0; + + /* do some corrections to fit into screen */ + int sizex = rc.right - rc.left; + int sizey = rc.bottom - rc.top; + int screenWidth = gdk_screen_width(); + int screenHeight = gdk_screen_height(); + if (sizex > screenWidth) + ox = 0; /* the best we can do */ + else if (ox + sizex > screenWidth) + ox = screenWidth - sizex; + if (oy + sizey > screenHeight) + oy = screenHeight - sizey; + + gtk_widget_set_uposition(PWidget(id), ox, oy); +#if 0 + + GtkAllocation alloc; + alloc.x = rc.left + ox; + alloc.y = rc.top + oy; + alloc.width = rc.right - rc.left; + alloc.height = rc.bottom - rc.top; + gtk_widget_size_allocate(id, &alloc); +#endif + gtk_widget_set_usize(PWidget(id), sizex, sizey); +} + +PRectangle Window::GetClientPosition() { + // On GTK+, the client position is the window position + return GetPosition(); +} + +void Window::Show(bool show) { + if (show) + gtk_widget_show(PWidget(id)); +} + +void Window::InvalidateAll() { + if (id) { + gtk_widget_queue_draw(PWidget(id)); + } +} + +void Window::InvalidateRectangle(PRectangle rc) { + if (id) { + gtk_widget_queue_draw_area(PWidget(id), + rc.left, rc.top, + rc.right - rc.left, rc.bottom - rc.top); + } +} + +void Window::SetFont(Font &) { + // Can not be done generically but only needed for ListBox +} + +void Window::SetCursor(Cursor curs) { + // We don't set the cursor to same value numerous times under gtk because + // it stores the cursor in the window once it's set + if (curs == cursorLast) + return; + + cursorLast = curs; + GdkCursor *gdkCurs; + switch (curs) { + case cursorText: + gdkCurs = gdk_cursor_new(GDK_XTERM); + break; + case cursorArrow: + gdkCurs = gdk_cursor_new(GDK_LEFT_PTR); + break; + case cursorUp: + gdkCurs = gdk_cursor_new(GDK_CENTER_PTR); + break; + case cursorWait: + gdkCurs = gdk_cursor_new(GDK_WATCH); + break; + case cursorHand: + gdkCurs = gdk_cursor_new(GDK_HAND2); + break; + case cursorReverseArrow: + gdkCurs = gdk_cursor_new(GDK_RIGHT_PTR); + break; + default: + gdkCurs = gdk_cursor_new(GDK_LEFT_PTR); + cursorLast = cursorArrow; + break; + } + + if (PWidget(id)->window) + gdk_window_set_cursor(PWidget(id)->window, gdkCurs); + gdk_cursor_destroy(gdkCurs); +} + +void Window::SetTitle(const char *s) { + gtk_window_set_title(GTK_WINDOW(id), s); +} + +struct ListImage { + const char *xpm_data; +#if GTK_MAJOR_VERSION < 2 + GdkPixmap *pixmap; + GdkBitmap *bitmap; +#else + GdkPixbuf *pixbuf; +#endif +}; + +static void list_image_free(gpointer, gpointer value, gpointer) { + ListImage *list_image = (ListImage *) value; +#if GTK_MAJOR_VERSION < 2 + if (list_image->pixmap) + gdk_pixmap_unref(list_image->pixmap); + if (list_image->bitmap) + gdk_bitmap_unref(list_image->bitmap); +#else + if (list_image->pixbuf) + gdk_pixbuf_unref (list_image->pixbuf); +#endif + g_free(list_image); +} + +ListBox::ListBox() { +} + +ListBox::~ListBox() { +} + +#if GTK_MAJOR_VERSION >= 2 +enum { + PIXBUF_COLUMN, + TEXT_COLUMN, + N_COLUMNS +}; +#endif + +class ListBoxX : public ListBox { + WindowID list; + WindowID scroller; +#if GTK_MAJOR_VERSION < 2 + int current; +#endif + void *pixhash; + int lineHeight; + XPMSet xset; + bool unicodeMode; + int desiredVisibleRows; + unsigned int maxItemCharacters; + unsigned int aveCharWidth; +public: + CallBackAction doubleClickAction; + void *doubleClickActionData; + + ListBoxX() : list(0), pixhash(NULL), desiredVisibleRows(5), maxItemCharacters(0), + doubleClickAction(NULL), doubleClickActionData(NULL) { +#if GTK_MAJOR_VERSION < 2 + current = 0; +#endif + } + virtual ~ListBoxX() { + if (pixhash) { + g_hash_table_foreach((GHashTable *) pixhash, list_image_free, NULL); + g_hash_table_destroy((GHashTable *) pixhash); + } + } + virtual void SetFont(Font &font); + virtual void Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_); + virtual void SetAverageCharWidth(int width); + virtual void SetVisibleRows(int rows); + virtual int GetVisibleRows() const; + virtual PRectangle GetDesiredRect(); + virtual int CaretFromEdge(); + virtual void Clear(); + virtual void Append(char *s, int type = -1); + virtual int Length(); + virtual void Select(int n); + virtual int GetSelection(); + virtual int Find(const char *prefix); + virtual void GetValue(int n, char *value, int len); + virtual void RegisterImage(int type, const char *xpm_data); + virtual void ClearRegisteredImages(); + virtual void SetDoubleClickAction(CallBackAction action, void *data) { + doubleClickAction = action; + doubleClickActionData = data; + } + virtual void SetList(const char* list, char separator, char typesep); +}; + +ListBox *ListBox::Allocate() { + ListBoxX *lb = new ListBoxX(); + return lb; +} + +#if GTK_MAJOR_VERSION < 2 +static void UnselectionAC(GtkWidget *, gint, gint, + GdkEventButton *, gpointer p) { + int *pi = reinterpret_cast(p); + *pi = -1; +} +static void SelectionAC(GtkWidget *, gint row, gint, + GdkEventButton *, gpointer p) { + int *pi = reinterpret_cast(p); + *pi = row; +} +#endif + +static gboolean ButtonPress(GtkWidget *, GdkEventButton* ev, gpointer p) { + ListBoxX* lb = reinterpret_cast(p); + if (ev->type == GDK_2BUTTON_PRESS && lb->doubleClickAction != NULL) { + lb->doubleClickAction(lb->doubleClickActionData); + return TRUE; + } + + return FALSE; +} + +#if GTK_MAJOR_VERSION >= 2 +/* Change the active color to the selected color so the listbox uses the color +scheme that it would use if it had the focus. */ +static void StyleSet(GtkWidget *w, GtkStyle*, void*) { + GtkStyle* style; + + g_return_if_fail(w != NULL); + + /* Copy the selected color to active. Note that the modify calls will cause + recursive calls to this function after the value is updated and w->style to + be set to a new object */ + style = gtk_widget_get_style(w); + if (style == NULL) + return; + if (!gdk_color_equal(&style->base[GTK_STATE_SELECTED], &style->base[GTK_STATE_ACTIVE])) + gtk_widget_modify_base(w, GTK_STATE_ACTIVE, &style->base[GTK_STATE_SELECTED]); + + style = gtk_widget_get_style(w); + if (style == NULL) + return; + if (!gdk_color_equal(&style->text[GTK_STATE_SELECTED], &style->text[GTK_STATE_ACTIVE])) + gtk_widget_modify_text(w, GTK_STATE_ACTIVE, &style->text[GTK_STATE_SELECTED]); +} +#endif + +void ListBoxX::Create(Window &, int, Point, int, bool) { + id = gtk_window_new(GTK_WINDOW_POPUP); + + GtkWidget *frame = gtk_frame_new(NULL); + gtk_widget_show(frame); + gtk_container_add(GTK_CONTAINER(GetID()), frame); + gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); + gtk_container_set_border_width(GTK_CONTAINER(frame), 0); + + scroller = gtk_scrolled_window_new(NULL, NULL); + gtk_container_set_border_width(GTK_CONTAINER(scroller), 0); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroller), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(frame), PWidget(scroller)); + gtk_widget_show(PWidget(scroller)); + +#if GTK_MAJOR_VERSION < 2 + list = gtk_clist_new(1); + GtkWidget *wid = PWidget(list); // No code inside the GTK_OBJECT macro + gtk_widget_show(wid); + gtk_container_add(GTK_CONTAINER(PWidget(scroller)), wid); + gtk_clist_set_column_auto_resize(GTK_CLIST(wid), 0, TRUE); + gtk_clist_set_selection_mode(GTK_CLIST(wid), GTK_SELECTION_BROWSE); + gtk_signal_connect(GTK_OBJECT(wid), "unselect_row", + GTK_SIGNAL_FUNC(UnselectionAC), ¤t); + gtk_signal_connect(GTK_OBJECT(wid), "select_row", + GTK_SIGNAL_FUNC(SelectionAC), ¤t); + gtk_signal_connect(GTK_OBJECT(wid), "button_press_event", + GTK_SIGNAL_FUNC(ButtonPress), this); + gtk_clist_set_shadow_type(GTK_CLIST(wid), GTK_SHADOW_NONE); +#else + /* Tree and its model */ + GtkListStore *store = + gtk_list_store_new(N_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING); + + list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + g_signal_connect(G_OBJECT(list), "style-set", G_CALLBACK(StyleSet), NULL); + + GtkTreeSelection *selection = + gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE); + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(list), FALSE); + + /* Columns */ + GtkTreeViewColumn *column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_title(column, "Autocomplete"); + + GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_add_attribute(column, renderer, + "pixbuf", PIXBUF_COLUMN); + + renderer = gtk_cell_renderer_text_new(); + gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_add_attribute(column, renderer, + "text", TEXT_COLUMN); + + gtk_tree_view_append_column(GTK_TREE_VIEW(list), column); + if (g_object_class_find_property(G_OBJECT_GET_CLASS(list), "fixed-height-mode")) + g_object_set(G_OBJECT(list), "fixed-height-mode", TRUE, NULL); + + GtkWidget *wid = PWidget(list); // No code inside the G_OBJECT macro + gtk_container_add(GTK_CONTAINER(PWidget(scroller)), wid); + gtk_widget_show(wid); + g_signal_connect(G_OBJECT(wid), "button_press_event", + G_CALLBACK(ButtonPress), this); +#endif + gtk_widget_realize(PWidget(id)); +} + +void ListBoxX::SetFont(Font &scint_font) { +#if GTK_MAJOR_VERSION < 2 + GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(PWidget(list))); + if (!gdk_font_equal(style->font, PFont(scint_font)->pfont)) { + style = gtk_style_copy(style); + gdk_font_unref(style->font); + style->font = PFont(scint_font)->pfont; + gdk_font_ref(style->font); + gtk_widget_set_style(GTK_WIDGET(PWidget(list)), style); + gtk_style_unref(style); + } +#else + // Only do for Pango font as there have been crashes for GDK fonts + if (Created() && PFont(scint_font)->pfd) { + // Current font is Pango font + gtk_widget_modify_font(PWidget(list), PFont(scint_font)->pfd); + } +#endif +} + +void ListBoxX::SetAverageCharWidth(int width) { + aveCharWidth = width; +} + +void ListBoxX::SetVisibleRows(int rows) { + desiredVisibleRows = rows; +} + +int ListBoxX::GetVisibleRows() const { + return desiredVisibleRows; +} + +PRectangle ListBoxX::GetDesiredRect() { + // Before any size allocated pretend its 100 wide so not scrolled + PRectangle rc(0, 0, 100, 100); + if (id) { + int rows = Length(); + if ((rows == 0) || (rows > desiredVisibleRows)) + rows = desiredVisibleRows; + + GtkRequisition req; + int height; + + // First calculate height of the clist for our desired visible + // row count otherwise it tries to expand to the total # of rows +#if GTK_MAJOR_VERSION < 2 + int ythickness = PWidget(list)->style->klass->ythickness; + height = (rows * GTK_CLIST(list)->row_height + + rows + 1 + + 2 * (ythickness + + GTK_CONTAINER(PWidget(list))->border_width)); +#else + // Get cell height + int row_width=0; + int row_height=0; + GtkTreeViewColumn * column = + gtk_tree_view_get_column(GTK_TREE_VIEW(list), 0); + gtk_tree_view_column_cell_get_size(column, NULL, + NULL, NULL, &row_width, &row_height); + int ythickness = PWidget(list)->style->ythickness; + height = (rows * row_height + + 2 * (ythickness + + GTK_CONTAINER(PWidget(list))->border_width + 1)); +#endif + gtk_widget_set_usize(GTK_WIDGET(PWidget(list)), -1, height); + + // Get the size of the scroller because we set usize on the window + gtk_widget_size_request(GTK_WIDGET(scroller), &req); + rc.right = req.width; + rc.bottom = req.height; + + gtk_widget_set_usize(GTK_WIDGET(list), -1, -1); + int width = maxItemCharacters; + if (width < 12) + width = 12; + rc.right = width * (aveCharWidth + aveCharWidth / 3); + if (Length() > rows) + rc.right = rc.right + 16; + } + return rc; +} + +int ListBoxX::CaretFromEdge() { + return 4 + xset.GetWidth(); +} + +void ListBoxX::Clear() { +#if GTK_MAJOR_VERSION < 2 + gtk_clist_clear(GTK_CLIST(list)); +#else + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(list)); + gtk_list_store_clear(GTK_LIST_STORE(model)); +#endif + maxItemCharacters = 0; +} + +#if GTK_MAJOR_VERSION < 2 +static void init_pixmap(ListImage *list_image, GtkWidget *window) { +#else +static void init_pixmap(ListImage *list_image) { +#endif + const char *textForm = list_image->xpm_data; + const char * const * xpm_lineform = reinterpret_cast(textForm); + const char **xpm_lineformfromtext = 0; + // The XPM data can be either in atext form as will be read from a file + // or in a line form (array of char *) as will be used for images defined in code. + // Test for text form and convert to line form + if ((0 == memcmp(textForm, "/* X", 4)) && (0 == memcmp(textForm, "/* XPM */", 9))) { + // Test done is two parts to avoid possibility of overstepping the memory + // if memcmp implemented strangely. Must be 4 bytes at least at destination. + xpm_lineformfromtext = XPM::LinesFormFromTextForm(textForm); + xpm_lineform = xpm_lineformfromtext; + } + + // Drop any existing pixmap/bitmap as data may have changed +#if GTK_MAJOR_VERSION < 2 + if (list_image->pixmap) + gdk_pixmap_unref(list_image->pixmap); + list_image->pixmap = NULL; + if (list_image->bitmap) + gdk_bitmap_unref(list_image->bitmap); + list_image->bitmap = NULL; + + list_image->pixmap = gdk_pixmap_colormap_create_from_xpm_d(NULL + , gtk_widget_get_colormap(window), &(list_image->bitmap), NULL + , (gchar **) xpm_lineform); + if (NULL == list_image->pixmap) { + if (list_image->bitmap) + gdk_bitmap_unref(list_image->bitmap); + list_image->bitmap = NULL; + } +#else + if (list_image->pixbuf) + gdk_pixbuf_unref(list_image->pixbuf); + list_image->pixbuf = + gdk_pixbuf_new_from_xpm_data((const gchar**)xpm_lineform); +#endif + delete []xpm_lineformfromtext; +} + +#define SPACING 5 + +void ListBoxX::Append(char *s, int type) { + ListImage *list_image = NULL; + if ((type >= 0) && pixhash) { + list_image = (ListImage *) g_hash_table_lookup((GHashTable *) pixhash + , (gconstpointer) GINT_TO_POINTER(type)); + } +#if GTK_MAJOR_VERSION < 2 + char * szs[] = { s, NULL }; + int rownum = gtk_clist_append(GTK_CLIST(list), szs); + if (list_image) { + if (NULL == list_image->pixmap) + init_pixmap(list_image, (GtkWidget *) list); + gtk_clist_set_pixtext(GTK_CLIST(list), rownum, 0, s, SPACING + , list_image->pixmap, list_image->bitmap); + } +#else + GtkTreeIter iter; + GtkListStore *store = + GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list))); + gtk_list_store_append(GTK_LIST_STORE(store), &iter); + if (list_image) { + if (NULL == list_image->pixbuf) + init_pixmap(list_image); + if (list_image->pixbuf) { + gtk_list_store_set(GTK_LIST_STORE(store), &iter, + PIXBUF_COLUMN, list_image->pixbuf, + TEXT_COLUMN, s, -1); + } else { + gtk_list_store_set(GTK_LIST_STORE(store), &iter, + TEXT_COLUMN, s, -1); + } + } else { + gtk_list_store_set(GTK_LIST_STORE(store), &iter, + TEXT_COLUMN, s, -1); + } +#endif + size_t len = strlen(s); + if (maxItemCharacters < len) + maxItemCharacters = len; +} + +int ListBoxX::Length() { + if (id) +#if GTK_MAJOR_VERSION < 2 + return GTK_CLIST(list)->rows; +#else + return gtk_tree_model_iter_n_children(gtk_tree_view_get_model + (GTK_TREE_VIEW(list)), NULL); +#endif + return 0; +} + +void ListBoxX::Select(int n) { +#if GTK_MAJOR_VERSION < 2 + if (n == -1) { + gtk_clist_unselect_row(GTK_CLIST(list), current, 0); + } else { + gtk_clist_select_row(GTK_CLIST(list), n, 0); + gtk_clist_moveto(GTK_CLIST(list), n, 0, 0.5, 0.5); + } +#else + GtkTreeIter iter; + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(list)); + GtkTreeSelection *selection = + gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); + + if (n < 0) { + gtk_tree_selection_unselect_all(selection); + return; + } + + bool valid = gtk_tree_model_iter_nth_child(model, &iter, NULL, n) != FALSE; + if (valid) { + gtk_tree_selection_select_iter(selection, &iter); + + // Move the scrollbar to show the selection. + int total = Length(); + GtkAdjustment *adj = + gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(list)); + gfloat value = ((gfloat)n / total) * (adj->upper - adj->lower) + + adj->lower - adj->page_size / 2; + + // Get cell height + int row_width; + int row_height; + GtkTreeViewColumn * column = + gtk_tree_view_get_column(GTK_TREE_VIEW(list), 0); + gtk_tree_view_column_cell_get_size(column, NULL, NULL, + NULL, &row_width, &row_height); + + int rows = Length(); + if ((rows == 0) || (rows > desiredVisibleRows)) + rows = desiredVisibleRows; + if (rows & 0x1) { + // Odd rows to display -- We are now in the middle. + // Align it so that we don't chop off rows. + value += (gfloat)row_height / 2.0; + } + // Clamp it. + value = (value < 0)? 0 : value; + value = (value > (adj->upper - adj->page_size))? + (adj->upper - adj->page_size) : value; + + // Set it. + gtk_adjustment_set_value(adj, value); + } else { + gtk_tree_selection_unselect_all(selection); + } +#endif +} + +int ListBoxX::GetSelection() { +#if GTK_MAJOR_VERSION < 2 + return current; +#else + GtkTreeIter iter; + GtkTreeModel *model; + GtkTreeSelection *selection; + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); + if (gtk_tree_selection_get_selected(selection, &model, &iter)) { + GtkTreePath *path = gtk_tree_model_get_path(model, &iter); + int *indices = gtk_tree_path_get_indices(path); + // Don't free indices. + if (indices) + return indices[0]; + } + return -1; +#endif +} + +int ListBoxX::Find(const char *prefix) { +#if GTK_MAJOR_VERSION < 2 + int count = Length(); + for (int i = 0; i < count; i++) { + char *s = 0; + gtk_clist_get_text(GTK_CLIST(list), i, 0, &s); + if (s && (0 == strncmp(prefix, s, strlen(prefix)))) { + return i; + } + } +#else + GtkTreeIter iter; + GtkTreeModel *model = + gtk_tree_view_get_model(GTK_TREE_VIEW(list)); + bool valid = gtk_tree_model_get_iter_first(model, &iter) != FALSE; + int i = 0; + while(valid) { + gchar *s; + gtk_tree_model_get(model, &iter, TEXT_COLUMN, &s, -1); + if (s && (0 == strncmp(prefix, s, strlen(prefix)))) { + return i; + } + valid = gtk_tree_model_iter_next(model, &iter) != FALSE; + i++; + } +#endif + return -1; +} + +void ListBoxX::GetValue(int n, char *value, int len) { + char *text = NULL; +#if GTK_MAJOR_VERSION < 2 + GtkCellType type = gtk_clist_get_cell_type(GTK_CLIST(list), n, 0); + switch (type) { + case GTK_CELL_TEXT: + gtk_clist_get_text(GTK_CLIST(list), n, 0, &text); + break; + case GTK_CELL_PIXTEXT: + gtk_clist_get_pixtext(GTK_CLIST(list), n, 0, &text, NULL, NULL, NULL); + break; + default: + break; + } +#else + GtkTreeIter iter; + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(list)); + bool valid = gtk_tree_model_iter_nth_child(model, &iter, NULL, n) != FALSE; + if (valid) { + gtk_tree_model_get(model, &iter, TEXT_COLUMN, &text, -1); + } +#endif + if (text && len > 0) { + strncpy(value, text, len); + value[len - 1] = '\0'; + } else { + value[0] = '\0'; + } +} + +// g_return_if_fail causes unnecessary compiler warning in release compile. +#ifdef _MSC_VER +#pragma warning(disable: 4127) +#endif + +void ListBoxX::RegisterImage(int type, const char *xpm_data) { + g_return_if_fail(xpm_data); + + // Saved and use the saved copy so caller's copy can disappear. + xset.Add(type, xpm_data); + XPM *pxpm = xset.Get(type); + xpm_data = reinterpret_cast(pxpm->InLinesForm()); + + if (!pixhash) { + pixhash = g_hash_table_new(g_direct_hash, g_direct_equal); + } + ListImage *list_image = (ListImage *) g_hash_table_lookup((GHashTable *) pixhash, + (gconstpointer) GINT_TO_POINTER(type)); + if (list_image) { + // Drop icon already registered +#if GTK_MAJOR_VERSION < 2 + if (list_image->pixmap) + gdk_pixmap_unref(list_image->pixmap); + list_image->pixmap = 0; + if (list_image->bitmap) + gdk_bitmap_unref(list_image->bitmap); + list_image->bitmap = 0; +#else + if (list_image->pixbuf) + gdk_pixbuf_unref(list_image->pixbuf); + list_image->pixbuf = NULL; +#endif + list_image->xpm_data = xpm_data; + } else { + list_image = g_new0(ListImage, 1); + list_image->xpm_data = xpm_data; + g_hash_table_insert((GHashTable *) pixhash, GINT_TO_POINTER(type), + (gpointer) list_image); + } +} + +void ListBoxX::ClearRegisteredImages() { + xset.Clear(); +} + +void ListBoxX::SetList(const char* list, char separator, char typesep) { + Clear(); + int count = strlen(list) + 1; + char *words = new char[count]; + if (words) { + memcpy(words, list, count); + char *startword = words; + char *numword = NULL; + int i = 0; + for (; words[i]; i++) { + if (words[i] == separator) { + words[i] = '\0'; + if (numword) + *numword = '\0'; + Append(startword, numword?atoi(numword + 1):-1); + startword = words + i + 1; + numword = NULL; + } else if (words[i] == typesep) { + numword = words + i; + } + } + if (startword) { + if (numword) + *numword = '\0'; + Append(startword, numword?atoi(numword + 1):-1); + } + delete []words; + } +} + +Menu::Menu() : id(0) {} + +void Menu::CreatePopUp() { + Destroy(); + id = gtk_item_factory_new(GTK_TYPE_MENU, "
      ", NULL); +} + +void Menu::Destroy() { + if (id) +#if GTK_MAJOR_VERSION < 2 + gtk_object_unref(GTK_OBJECT(id)); +#else + g_object_unref(G_OBJECT(id)); +#endif + id = 0; +} + +void Menu::Show(Point pt, Window &) { + int screenHeight = gdk_screen_height(); + int screenWidth = gdk_screen_width(); + GtkItemFactory *factory = reinterpret_cast(id); + GtkWidget *widget = gtk_item_factory_get_widget(factory, "
      "); + gtk_widget_show_all(widget); + GtkRequisition requisition; + gtk_widget_size_request(widget, &requisition); + if ((pt.x + requisition.width) > screenWidth) { + pt.x = screenWidth - requisition.width; + } + if ((pt.y + requisition.height) > screenHeight) { + pt.y = screenHeight - requisition.height; + } +#if GTK_MAJOR_VERSION >= 2 + gtk_item_factory_popup(factory, pt.x - 4, pt.y - 4, 3, + gtk_get_current_event_time()); +#else + gtk_item_factory_popup(factory, pt.x - 4, pt.y - 4, 3, 0); +#endif +} + +ElapsedTime::ElapsedTime() { + GTimeVal curTime; + g_get_current_time(&curTime); + bigBit = curTime.tv_sec; + littleBit = curTime.tv_usec; +} + +class DynamicLibraryImpl : public DynamicLibrary { +protected: + GModule* m; +public: + DynamicLibraryImpl(const char *modulePath) { + m = g_module_open(modulePath, G_MODULE_BIND_LAZY); + } + + virtual ~DynamicLibraryImpl() { + if (m != NULL) + g_module_close(m); + } + + // Use g_module_symbol to get a pointer to the relevant function. + virtual Function FindFunction(const char *name) { + if (m != NULL) { + gpointer fn_address = NULL; + gboolean status = g_module_symbol(m, name, &fn_address); + if (status) + return static_cast(fn_address); + else + return NULL; + } else + return NULL; + } + + virtual bool IsValid() { + return m != NULL; + } +}; + +DynamicLibrary *DynamicLibrary::Load(const char *modulePath) { + return static_cast( new DynamicLibraryImpl(modulePath) ); +} + +double ElapsedTime::Duration(bool reset) { + GTimeVal curTime; + g_get_current_time(&curTime); + long endBigBit = curTime.tv_sec; + long endLittleBit = curTime.tv_usec; + double result = 1000000.0 * (endBigBit - bigBit); + result += endLittleBit - littleBit; + result /= 1000000.0; + if (reset) { + bigBit = endBigBit; + littleBit = endLittleBit; + } + return result; +} + +ColourDesired Platform::Chrome() { + return ColourDesired(0xe0, 0xe0, 0xe0); +} + +ColourDesired Platform::ChromeHighlight() { + return ColourDesired(0xff, 0xff, 0xff); +} + +const char *Platform::DefaultFont() { +#ifdef G_OS_WIN32 + return "Lucida Console"; +#else +#ifdef USE_PANGO + return "!Sans"; +#else + return "lucidatypewriter"; +#endif +#endif +} + +int Platform::DefaultFontSize() { +#ifdef G_OS_WIN32 + return 10; +#else + return 12; +#endif +} + +unsigned int Platform::DoubleClickTime() { + return 500; // Half a second +} + +bool Platform::MouseButtonBounce() { + return true; +} + +void Platform::DebugDisplay(const char *s) { + printf("%s", s); +} + +bool Platform::IsKeyDown(int) { + // TODO: discover state of keys in GTK+/X + return false; +} + +long Platform::SendScintilla( + WindowID w, unsigned int msg, unsigned long wParam, long lParam) { + return scintilla_send_message(SCINTILLA(w), msg, wParam, lParam); +} + +long Platform::SendScintillaPointer( + WindowID w, unsigned int msg, unsigned long wParam, void *lParam) { + return scintilla_send_message(SCINTILLA(w), msg, wParam, + reinterpret_cast(lParam)); +} + +bool Platform::IsDBCSLeadByte(int /* codePage */, char /* ch */) { + return false; +} + +int Platform::DBCSCharLength(int, const char *s) { + int bytes = mblen(s, MB_CUR_MAX); + if (bytes >= 1) + return bytes; + else + return 1; +} + +int Platform::DBCSCharMaxLength() { + return MB_CUR_MAX; + //return 2; +} + +// These are utility functions not really tied to a platform + +int Platform::Minimum(int a, int b) { + if (a < b) + return a; + else + return b; +} + +int Platform::Maximum(int a, int b) { + if (a > b) + return a; + else + return b; +} + +//#define TRACE + +#ifdef TRACE +void Platform::DebugPrintf(const char *format, ...) { + char buffer[2000]; + va_list pArguments; + va_start(pArguments, format); + vsprintf(buffer, format, pArguments); + va_end(pArguments); + Platform::DebugDisplay(buffer); +} +#else +void Platform::DebugPrintf(const char *, ...) {} + +#endif + +// Not supported for GTK+ +static bool assertionPopUps = true; + +bool Platform::ShowAssertionPopUps(bool assertionPopUps_) { + bool ret = assertionPopUps; + assertionPopUps = assertionPopUps_; + return ret; +} + +void Platform::Assert(const char *c, const char *file, int line) { + char buffer[2000]; + sprintf(buffer, "Assertion [%s] failed at %s %d", c, file, line); + strcat(buffer, "\r\n"); + Platform::DebugDisplay(buffer); + abort(); +} + +int Platform::Clamp(int val, int minVal, int maxVal) { + if (val > maxVal) + val = maxVal; + if (val < minVal) + val = minVal; + return val; +} + +void Platform_Initialise() { + FontMutexAllocate(); +} + +void Platform_Finalise() { + FontMutexFree(); +} diff --git a/scintilla/gtk/ScintillaGTK.cxx b/scintilla/gtk/ScintillaGTK.cxx new file mode 100644 index 00000000..b330a19b --- /dev/null +++ b/scintilla/gtk/ScintillaGTK.cxx @@ -0,0 +1,2671 @@ +// Scintilla source code edit control +// ScintillaGTK.cxx - GTK+ specific subclass of ScintillaBase +// Copyright 1998-2004 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include +#include + +#include "Platform.h" + +#if PLAT_GTK_WIN32 +#include "Windows.h" +#endif + +#include "Scintilla.h" +#include "ScintillaWidget.h" +#ifdef SCI_LEXER +#include "SciLexer.h" +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#endif +#include "ContractionState.h" +#include "SVector.h" +#include "SplitVector.h" +#include "Partitioning.h" +#include "CellBuffer.h" +#include "CallTip.h" +#include "KeyMap.h" +#include "Indicator.h" +#include "XPM.h" +#include "LineMarker.h" +#include "Style.h" +#include "AutoComplete.h" +#include "ViewStyle.h" +#include "CharClassify.h" +#include "Document.h" +#include "Editor.h" +#include "SString.h" +#include "ScintillaBase.h" +#include "UniConversion.h" + +#include "gtk/gtksignal.h" +#include "gtk/gtkmarshal.h" +#if GLIB_MAJOR_VERSION >= 2 +#include "scintilla-marshal.h" +#endif + +#ifdef SCI_LEXER +#include +#include +#include "ExternalLexer.h" +#endif + +#define INTERNATIONAL_INPUT + +#if !PLAT_GTK_WIN32 || GTK_MAJOR_VERSION >= 2 +#define USE_CONVERTER +#endif + +#ifdef USE_CONVERTER +#include "Converter.h" +#endif + +#ifdef _MSC_VER +// Constant conditional expressions are because of GTK+ headers +#pragma warning(disable: 4127) +// Ignore unreferenced local functions in GTK+ headers +#pragma warning(disable: 4505) +#endif + +#if GTK_CHECK_VERSION(2,2,0) +#define USE_GTK_CLIPBOARD +#endif + +#if GLIB_MAJOR_VERSION < 2 +#define OBJECT_CLASS GtkObjectClass +#else +#define OBJECT_CLASS GObjectClass +#endif + +extern char *UTF8FromLatin1(const char *s, int &len); + +class ScintillaGTK : public ScintillaBase { + _ScintillaObject *sci; + Window wText; + Window scrollbarv; + Window scrollbarh; + GtkObject *adjustmentv; + GtkObject *adjustmenth; + int scrollBarWidth; + int scrollBarHeight; + + // Because clipboard access is asynchronous, copyText is created by Copy +#ifndef USE_GTK_CLIPBOARD + SelectionText copyText; +#endif + + SelectionText primary; + + GdkEventButton evbtn; + bool capturedMouse; + bool dragWasDropped; + int lastKey; + + GtkWidgetClass *parentClass; + + static GdkAtom atomClipboard; + static GdkAtom atomUTF8; + static GdkAtom atomString; + static GdkAtom atomUriList; + static GdkAtom atomDROPFILES_DND; + GdkAtom atomSought; + +#if PLAT_GTK_WIN32 + CLIPFORMAT cfColumnSelect; +#endif + +#ifdef INTERNATIONAL_INPUT +#if GTK_MAJOR_VERSION < 2 + // Input context used for supporting internationalized key entry + GdkIC *ic; + GdkICAttr *ic_attr; +#else + Window wPreedit; + Window wPreeditDraw; + GtkIMContext *im_context; +#endif +#endif + + // Wheel mouse support + unsigned int linesPerScroll; + GTimeVal lastWheelMouseTime; + gint lastWheelMouseDirection; + gint wheelMouseIntensity; + + GdkRegion *rgnUpdate; + + // Private so ScintillaGTK objects can not be copied + ScintillaGTK(const ScintillaGTK &) : ScintillaBase() {} + ScintillaGTK &operator=(const ScintillaGTK &) { return * this; } + +public: + ScintillaGTK(_ScintillaObject *sci_); + virtual ~ScintillaGTK(); + static void ClassInit(OBJECT_CLASS* object_class, GtkWidgetClass *widget_class, GtkContainerClass *container_class); +private: + virtual void Initialise(); + virtual void Finalise(); + virtual void DisplayCursor(Window::Cursor c); + virtual void StartDrag(); + int TargetAsUTF8(char *text); + int EncodedFromUTF8(char *utf8, char *encoded); + virtual bool ValidCodePage(int codePage) const; +public: // Public for scintilla_send_message + virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); +private: + virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); + virtual void SetTicking(bool on); + virtual bool SetIdle(bool on); + virtual void SetMouseCapture(bool on); + virtual bool HaveMouseCapture(); + virtual bool PaintContains(PRectangle rc); + void FullPaint(); + virtual PRectangle GetClientRectangle(); + void SyncPaint(PRectangle rc); + virtual void ScrollText(int linesToMove); + virtual void SetVerticalScrollPos(); + virtual void SetHorizontalScrollPos(); + virtual bool ModifyScrollBars(int nMax, int nPage); + void ReconfigureScrollBars(); + virtual void NotifyChange(); + virtual void NotifyFocus(bool focus); + virtual void NotifyParent(SCNotification scn); + void NotifyKey(int key, int modifiers); + void NotifyURIDropped(const char *list); + const char *CharacterSetID() const; + virtual int KeyDefault(int key, int modifiers); + virtual void CopyToClipboard(const SelectionText &selectedText); + virtual void Copy(); + virtual void Paste(); + virtual void CreateCallTipWindow(PRectangle rc); + virtual void AddToPopUp(const char *label, int cmd = 0, bool enabled = true); + bool OwnPrimarySelection(); + virtual void ClaimSelection(); + void GetGtkSelectionText(GtkSelectionData *selectionData, SelectionText &selText); + void ReceivedSelection(GtkSelectionData *selection_data); + void ReceivedDrop(GtkSelectionData *selection_data); + static void GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *selected); +#ifdef USE_GTK_CLIPBOARD + static void ClipboardGetSelection(GtkClipboard* clip, GtkSelectionData *selection_data, guint info, void *data); + static void ClipboardClearSelection(GtkClipboard* clip, void *data); +#endif + + void UnclaimSelection(GdkEventSelection *selection_event); + void Resize(int width, int height); + + // Callback functions + void RealizeThis(GtkWidget *widget); + static void Realize(GtkWidget *widget); + void UnRealizeThis(GtkWidget *widget); + static void UnRealize(GtkWidget *widget); + void MapThis(); + static void Map(GtkWidget *widget); + void UnMapThis(); + static void UnMap(GtkWidget *widget); + static gint CursorMoved(GtkWidget *widget, int xoffset, int yoffset, ScintillaGTK *sciThis); + static gint FocusIn(GtkWidget *widget, GdkEventFocus *event); + static gint FocusOut(GtkWidget *widget, GdkEventFocus *event); + static void SizeRequest(GtkWidget *widget, GtkRequisition *requisition); + static void SizeAllocate(GtkWidget *widget, GtkAllocation *allocation); + gint Expose(GtkWidget *widget, GdkEventExpose *ose); + static gint ExposeMain(GtkWidget *widget, GdkEventExpose *ose); + static void Draw(GtkWidget *widget, GdkRectangle *area); + void ForAll(GtkCallback callback, gpointer callback_data); + static void MainForAll(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); + + static void ScrollSignal(GtkAdjustment *adj, ScintillaGTK *sciThis); + static void ScrollHSignal(GtkAdjustment *adj, ScintillaGTK *sciThis); + gint PressThis(GdkEventButton *event); + static gint Press(GtkWidget *widget, GdkEventButton *event); + static gint MouseRelease(GtkWidget *widget, GdkEventButton *event); +#if PLAT_GTK_WIN32 || (GTK_MAJOR_VERSION >= 2) + static gint ScrollEvent(GtkWidget *widget, GdkEventScroll *event); +#endif + static gint Motion(GtkWidget *widget, GdkEventMotion *event); + gboolean KeyThis(GdkEventKey *event); + static gboolean KeyPress(GtkWidget *widget, GdkEventKey *event); + static gboolean KeyRelease(GtkWidget *widget, GdkEventKey *event); +#if GTK_MAJOR_VERSION >= 2 + static gboolean ExposePreedit(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis); + gboolean ExposePreeditThis(GtkWidget *widget, GdkEventExpose *ose); + static void Commit(GtkIMContext *context, char *str, ScintillaGTK *sciThis); + void CommitThis(char *str); + static void PreeditChanged(GtkIMContext *context, ScintillaGTK *sciThis); + void PreeditChangedThis(); +#endif + static gint StyleSetText(GtkWidget *widget, GtkStyle *previous, void*); + static gint RealizeText(GtkWidget *widget, void*); +#if GLIB_MAJOR_VERSION < 2 + static void Destroy(GtkObject *object); +#else + static void Destroy(GObject *object); +#endif + static void SelectionReceived(GtkWidget *widget, GtkSelectionData *selection_data, + guint time); + static void SelectionGet(GtkWidget *widget, GtkSelectionData *selection_data, + guint info, guint time); + static gint SelectionClear(GtkWidget *widget, GdkEventSelection *selection_event); +#if GTK_MAJOR_VERSION < 2 + static gint SelectionNotify(GtkWidget *widget, GdkEventSelection *selection_event); +#endif + static void DragBegin(GtkWidget *widget, GdkDragContext *context); + static gboolean DragMotion(GtkWidget *widget, GdkDragContext *context, + gint x, gint y, guint time); + static void DragLeave(GtkWidget *widget, GdkDragContext *context, + guint time); + static void DragEnd(GtkWidget *widget, GdkDragContext *context); + static gboolean Drop(GtkWidget *widget, GdkDragContext *context, + gint x, gint y, guint time); + static void DragDataReceived(GtkWidget *widget, GdkDragContext *context, + gint x, gint y, GtkSelectionData *selection_data, guint info, guint time); + static void DragDataGet(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, guint time); + static gint TimeOut(ScintillaGTK *sciThis); + static gint IdleCallback(ScintillaGTK *sciThis); + static void PopUpCB(ScintillaGTK *sciThis, guint action, GtkWidget *widget); + + gint ExposeTextThis(GtkWidget *widget, GdkEventExpose *ose); + static gint ExposeText(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis); + + static gint ExposeCT(GtkWidget *widget, GdkEventExpose *ose, CallTip *ct); + static gint PressCT(GtkWidget *widget, GdkEventButton *event, ScintillaGTK *sciThis); + + static sptr_t DirectFunction(ScintillaGTK *sciThis, + unsigned int iMessage, uptr_t wParam, sptr_t lParam); +}; + +enum { + COMMAND_SIGNAL, + NOTIFY_SIGNAL, + LAST_SIGNAL +}; + +static gint scintilla_signals[LAST_SIGNAL] = { 0 }; +#if GLIB_MAJOR_VERSION < 2 +static GtkWidgetClass *parent_class = NULL; +#endif + +enum { + TARGET_STRING, + TARGET_TEXT, + TARGET_COMPOUND_TEXT, + TARGET_UTF8_STRING, + TARGET_URI +}; + +GdkAtom ScintillaGTK::atomClipboard = 0; +GdkAtom ScintillaGTK::atomUTF8 = 0; +GdkAtom ScintillaGTK::atomString = 0; +GdkAtom ScintillaGTK::atomUriList = 0; +GdkAtom ScintillaGTK::atomDROPFILES_DND = 0; + +static const GtkTargetEntry clipboardTargets[] = { + { "text/uri-list", 0, TARGET_URI }, + { "UTF8_STRING", 0, TARGET_UTF8_STRING }, + { "STRING", 0, TARGET_STRING }, +}; +static const gint nClipboardTargets = sizeof(clipboardTargets) / sizeof(clipboardTargets[0]); + +static GtkWidget *PWidget(Window &w) { + return reinterpret_cast(w.GetID()); +} + +static ScintillaGTK *ScintillaFromWidget(GtkWidget *widget) { + ScintillaObject *scio = reinterpret_cast(widget); + return reinterpret_cast(scio->pscin); +} + +ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) : + adjustmentv(0), adjustmenth(0), + scrollBarWidth(30), scrollBarHeight(30), + capturedMouse(false), dragWasDropped(false), + lastKey(0), parentClass(0), +#ifdef INTERNATIONAL_INPUT +#if GTK_MAJOR_VERSION < 2 + ic(NULL), + ic_attr(NULL), +#else + im_context(NULL), +#endif +#endif + lastWheelMouseDirection(0), + wheelMouseIntensity(0), + rgnUpdate(0) { + sci = sci_; + wMain = GTK_WIDGET(sci); + +#if PLAT_GTK_WIN32 + // There does not seem to be a real standard for indicating that the clipboard + // contains a rectangular selection, so copy Developer Studio. + cfColumnSelect = static_cast( + ::RegisterClipboardFormat("MSDEVColumnSelect")); + + // Get intellimouse parameters when running on win32; otherwise use + // reasonable default +#ifndef SPI_GETWHEELSCROLLLINES +#define SPI_GETWHEELSCROLLLINES 104 +#endif + ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &linesPerScroll, 0); +#else + linesPerScroll = 4; +#endif + lastWheelMouseTime.tv_sec = 0; + lastWheelMouseTime.tv_usec = 0; + + Initialise(); +} + +ScintillaGTK::~ScintillaGTK() { +} + +void ScintillaGTK::RealizeThis(GtkWidget *widget) { + //Platform::DebugPrintf("ScintillaGTK::realize this\n"); + GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); + GdkWindowAttr attrs; + attrs.window_type = GDK_WINDOW_CHILD; + attrs.x = widget->allocation.x; + attrs.y = widget->allocation.y; + attrs.width = widget->allocation.width; + attrs.height = widget->allocation.height; + attrs.wclass = GDK_INPUT_OUTPUT; + attrs.visual = gtk_widget_get_visual(widget); + attrs.colormap = gtk_widget_get_colormap(widget); + attrs.event_mask = gtk_widget_get_events(widget) | GDK_EXPOSURE_MASK; + GdkCursor *cursor = gdk_cursor_new(GDK_XTERM); + attrs.cursor = cursor; + widget->window = gdk_window_new(gtk_widget_get_parent_window(widget), &attrs, + GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_CURSOR); + gdk_window_set_user_data(widget->window, widget); + gdk_window_set_background(widget->window, &widget->style->bg[GTK_STATE_NORMAL]); + gdk_window_show(widget->window); + gdk_cursor_destroy(cursor); + widget->style = gtk_style_attach(widget->style, widget->window); +#ifdef INTERNATIONAL_INPUT +#if GTK_MAJOR_VERSION < 2 + if (gdk_im_ready() && (ic_attr = gdk_ic_attr_new()) != NULL) { + gint width, height; + GdkColormap *colormap; + GdkEventMask mask; + GdkICAttr *attr = ic_attr; + GdkICAttributesType attrmask = GDK_IC_ALL_REQ; + GdkIMStyle style; + GdkIMStyle supported_style = (GdkIMStyle) (GDK_IM_PREEDIT_NONE | + GDK_IM_PREEDIT_NOTHING | + GDK_IM_PREEDIT_POSITION | + GDK_IM_STATUS_NONE | + GDK_IM_STATUS_NOTHING); + + if (widget->style && widget->style->font->type != GDK_FONT_FONTSET) + supported_style = (GdkIMStyle) ((int) supported_style & ~GDK_IM_PREEDIT_POSITION); + + attr->style = style = gdk_im_decide_style(supported_style); + attr->client_window = widget->window; + + if ((colormap = gtk_widget_get_colormap (widget)) != gtk_widget_get_default_colormap ()) { + attrmask = (GdkICAttributesType) ((int) attrmask | GDK_IC_PREEDIT_COLORMAP); + attr->preedit_colormap = colormap; + } + + switch (style & GDK_IM_PREEDIT_MASK) { + case GDK_IM_PREEDIT_POSITION: + if (widget->style && widget->style->font->type != GDK_FONT_FONTSET) { + g_warning("over-the-spot style requires fontset"); + break; + } + + attrmask = (GdkICAttributesType) ((int) attrmask | GDK_IC_PREEDIT_POSITION_REQ); + gdk_window_get_size(widget->window, &width, &height); + attr->spot_location.x = 0; + attr->spot_location.y = height; + attr->preedit_area.x = 0; + attr->preedit_area.y = 0; + attr->preedit_area.width = width; + attr->preedit_area.height = height; + attr->preedit_fontset = widget->style->font; + + break; + } + ic = gdk_ic_new(attr, attrmask); + + if (ic == NULL) { + g_warning("Can't create input context."); + } else { + mask = gdk_window_get_events(widget->window); + mask = (GdkEventMask) ((int) mask | gdk_ic_get_events(ic)); + gdk_window_set_events(widget->window, mask); + + if (GTK_WIDGET_HAS_FOCUS(widget)) + gdk_im_begin(ic, widget->window); + } + } +#else + wPreedit = gtk_window_new(GTK_WINDOW_POPUP); + wPreeditDraw = gtk_drawing_area_new(); + GtkWidget *predrw = PWidget(wPreeditDraw); // No code inside the G_OBJECT macro + g_signal_connect(G_OBJECT(predrw), "expose_event", + G_CALLBACK(ExposePreedit), this); + gtk_container_add(GTK_CONTAINER(PWidget(wPreedit)), predrw); + gtk_widget_realize(PWidget(wPreedit)); + gtk_widget_realize(predrw); + gtk_widget_show(predrw); + + im_context = gtk_im_multicontext_new(); + g_signal_connect(G_OBJECT(im_context), "commit", + G_CALLBACK(Commit), this); + g_signal_connect(G_OBJECT(im_context), "preedit_changed", + G_CALLBACK(PreeditChanged), this); + gtk_im_context_set_client_window(im_context, widget->window); +#endif +#endif + GtkWidget *widtxt = PWidget(wText); // // No code inside the G_OBJECT macro +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_connect_after(GTK_OBJECT(widtxt), "style_set", + GtkSignalFunc(ScintillaGTK::StyleSetText), NULL); + gtk_signal_connect_after(GTK_OBJECT(widtxt), "realize", + GtkSignalFunc(ScintillaGTK::RealizeText), NULL); +#else + g_signal_connect_after(G_OBJECT(widtxt), "style_set", + G_CALLBACK(ScintillaGTK::StyleSetText), NULL); + g_signal_connect_after(G_OBJECT(widtxt), "realize", + G_CALLBACK(ScintillaGTK::RealizeText), NULL); +#endif + gtk_widget_realize(widtxt); + gtk_widget_realize(PWidget(scrollbarv)); + gtk_widget_realize(PWidget(scrollbarh)); +} + +void ScintillaGTK::Realize(GtkWidget *widget) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + sciThis->RealizeThis(widget); +} + +void ScintillaGTK::UnRealizeThis(GtkWidget *widget) { + if (GTK_WIDGET_MAPPED(widget)) { + gtk_widget_unmap(widget); + } + GTK_WIDGET_UNSET_FLAGS(widget, GTK_REALIZED); + gtk_widget_unrealize(PWidget(wText)); + gtk_widget_unrealize(PWidget(scrollbarv)); + gtk_widget_unrealize(PWidget(scrollbarh)); +#ifdef INTERNATIONAL_INPUT +#if GTK_MAJOR_VERSION < 2 + if (ic) { + gdk_ic_destroy(ic); + ic = NULL; + } + if (ic_attr) { + gdk_ic_attr_destroy(ic_attr); + ic_attr = NULL; + } +#else + gtk_widget_unrealize(PWidget(wPreedit)); + gtk_widget_unrealize(PWidget(wPreeditDraw)); + g_object_unref(im_context); + im_context = NULL; +#endif +#endif + if (GTK_WIDGET_CLASS(parentClass)->unrealize) + GTK_WIDGET_CLASS(parentClass)->unrealize(widget); + + Finalise(); +} + +void ScintillaGTK::UnRealize(GtkWidget *widget) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + sciThis->UnRealizeThis(widget); +} + +static void MapWidget(GtkWidget *widget) { + if (widget && + GTK_WIDGET_VISIBLE(widget) && + !GTK_WIDGET_MAPPED(widget)) { + gtk_widget_map(widget); + } +} + +void ScintillaGTK::MapThis() { + //Platform::DebugPrintf("ScintillaGTK::map this\n"); + GTK_WIDGET_SET_FLAGS(PWidget(wMain), GTK_MAPPED); + MapWidget(PWidget(wText)); + MapWidget(PWidget(scrollbarh)); + MapWidget(PWidget(scrollbarv)); + wMain.SetCursor(Window::cursorArrow); + scrollbarv.SetCursor(Window::cursorArrow); + scrollbarh.SetCursor(Window::cursorArrow); + ChangeSize(); + gdk_window_show(PWidget(wMain)->window); +} + +void ScintillaGTK::Map(GtkWidget *widget) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + sciThis->MapThis(); +} + +void ScintillaGTK::UnMapThis() { + //Platform::DebugPrintf("ScintillaGTK::unmap this\n"); + GTK_WIDGET_UNSET_FLAGS(PWidget(wMain), GTK_MAPPED); + DropGraphics(); + gdk_window_hide(PWidget(wMain)->window); + gtk_widget_unmap(PWidget(wText)); + gtk_widget_unmap(PWidget(scrollbarh)); + gtk_widget_unmap(PWidget(scrollbarv)); +} + +void ScintillaGTK::UnMap(GtkWidget *widget) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + sciThis->UnMapThis(); +} + +void ScintillaGTK::ForAll(GtkCallback callback, gpointer callback_data) { + (*callback) (PWidget(wText), callback_data); + (*callback) (PWidget(scrollbarv), callback_data); + (*callback) (PWidget(scrollbarh), callback_data); +} + +void ScintillaGTK::MainForAll(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) { + ScintillaGTK *sciThis = ScintillaFromWidget((GtkWidget *)container); + + if (callback != NULL && include_internals) { + sciThis->ForAll(callback, callback_data); + } +} + +#ifdef INTERNATIONAL_INPUT +#if GTK_MAJOR_VERSION < 2 +gint ScintillaGTK::CursorMoved(GtkWidget *widget, int xoffset, int yoffset, ScintillaGTK *sciThis) { + if (GTK_WIDGET_HAS_FOCUS(widget) && gdk_im_ready() && sciThis->ic && + (gdk_ic_get_style(sciThis->ic) & GDK_IM_PREEDIT_POSITION)) { + sciThis->ic_attr->spot_location.x = xoffset; + sciThis->ic_attr->spot_location.y = yoffset; + gdk_ic_set_attr(sciThis->ic, sciThis->ic_attr, GDK_IC_SPOT_LOCATION); + } + return FALSE; +} +#else +gint ScintillaGTK::CursorMoved(GtkWidget *, int xoffset, int yoffset, ScintillaGTK *sciThis) { + GdkRectangle area; + area.x = xoffset; + area.y = yoffset; + area.width = 1; + area.height = 1; + gtk_im_context_set_cursor_location(sciThis->im_context, &area); + return FALSE; +} +#endif +#else +gint ScintillaGTK::CursorMoved(GtkWidget *, int, int, ScintillaGTK *) { + return FALSE; +} +#endif + +gint ScintillaGTK::FocusIn(GtkWidget *widget, GdkEventFocus * /*event*/) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + //Platform::DebugPrintf("ScintillaGTK::focus in %x\n", sciThis); + GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_FOCUS); + sciThis->SetFocusState(true); + +#ifdef INTERNATIONAL_INPUT +#if GTK_MAJOR_VERSION < 2 + if (sciThis->ic) + gdk_im_begin(sciThis->ic, widget->window); +#else + if (sciThis->im_context != NULL) { + gchar *str = NULL; + gint cursor_pos; + + gtk_im_context_get_preedit_string(sciThis->im_context, &str, NULL, &cursor_pos); + if (PWidget(sciThis->wPreedit) != NULL) { + if (strlen(str) > 0) { + gtk_widget_show(PWidget(sciThis->wPreedit)); + } else { + gtk_widget_hide(PWidget(sciThis->wPreedit)); + } + } + g_free(str); + gtk_im_context_focus_in(sciThis->im_context); + } +#endif +#endif + + return FALSE; +} + +gint ScintillaGTK::FocusOut(GtkWidget *widget, GdkEventFocus * /*event*/) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + //Platform::DebugPrintf("ScintillaGTK::focus out %x\n", sciThis); + GTK_WIDGET_UNSET_FLAGS(widget, GTK_HAS_FOCUS); + sciThis->SetFocusState(false); + +#ifdef INTERNATIONAL_INPUT +#if GTK_MAJOR_VERSION < 2 + gdk_im_end(); +#else + if (PWidget(sciThis->wPreedit) != NULL) + gtk_widget_hide(PWidget(sciThis->wPreedit)); + if (sciThis->im_context != NULL) + gtk_im_context_focus_out(sciThis->im_context); +#endif +#endif + + return FALSE; +} + +void ScintillaGTK::SizeRequest(GtkWidget *widget, GtkRequisition *requisition) { + requisition->width = 600; + requisition->height = gdk_screen_height(); + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + GtkRequisition child_requisition; + gtk_widget_size_request(PWidget(sciThis->scrollbarh), &child_requisition); + gtk_widget_size_request(PWidget(sciThis->scrollbarv), &child_requisition); +} + +void ScintillaGTK::SizeAllocate(GtkWidget *widget, GtkAllocation *allocation) { + widget->allocation = *allocation; + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + if (GTK_WIDGET_REALIZED(widget)) + gdk_window_move_resize(widget->window, + widget->allocation.x, + widget->allocation.y, + widget->allocation.width, + widget->allocation.height); + + sciThis->Resize(allocation->width, allocation->height); + +#ifdef INTERNATIONAL_INPUT +#if GTK_MAJOR_VERSION < 2 + if (sciThis->ic && (gdk_ic_get_style(sciThis->ic) & GDK_IM_PREEDIT_POSITION)) { + gint width, height; + + gdk_window_get_size(widget->window, &width, &height); + sciThis->ic_attr->preedit_area.width = width; + sciThis->ic_attr->preedit_area.height = height; + + gdk_ic_set_attr(sciThis->ic, sciThis->ic_attr, GDK_IC_PREEDIT_AREA); + } +#endif +#endif +} + +void ScintillaGTK::Initialise() { + //Platform::DebugPrintf("ScintillaGTK::Initialise\n"); + parentClass = reinterpret_cast( + gtk_type_class(gtk_container_get_type())); + + GTK_WIDGET_SET_FLAGS(PWidget(wMain), GTK_CAN_FOCUS); + GTK_WIDGET_SET_FLAGS(GTK_WIDGET(PWidget(wMain)), GTK_SENSITIVE); + gtk_widget_set_events(PWidget(wMain), + GDK_EXPOSURE_MASK + | GDK_STRUCTURE_MASK + | GDK_KEY_PRESS_MASK + | GDK_KEY_RELEASE_MASK + | GDK_FOCUS_CHANGE_MASK + | GDK_LEAVE_NOTIFY_MASK + | GDK_BUTTON_PRESS_MASK + | GDK_BUTTON_RELEASE_MASK + | GDK_POINTER_MOTION_MASK + | GDK_POINTER_MOTION_HINT_MASK); + + wText = gtk_drawing_area_new(); + gtk_widget_set_parent(PWidget(wText), PWidget(wMain)); + GtkWidget *widtxt = PWidget(wText); // No code inside the G_OBJECT macro + gtk_widget_show(widtxt); +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_connect(GTK_OBJECT(widtxt), "expose_event", + GtkSignalFunc(ScintillaGTK::ExposeText), this); +#else + g_signal_connect(G_OBJECT(widtxt), "expose_event", + G_CALLBACK(ScintillaGTK::ExposeText), this); +#endif + gtk_widget_set_events(widtxt, GDK_EXPOSURE_MASK); +#if GTK_MAJOR_VERSION >= 2 + // Avoid background drawing flash + gtk_widget_set_double_buffered(widtxt, FALSE); +#endif + gtk_drawing_area_size(GTK_DRAWING_AREA(widtxt), + 100,100); + adjustmentv = gtk_adjustment_new(0.0, 0.0, 201.0, 1.0, 20.0, 20.0); + scrollbarv = gtk_vscrollbar_new(GTK_ADJUSTMENT(adjustmentv)); + GTK_WIDGET_UNSET_FLAGS(PWidget(scrollbarv), GTK_CAN_FOCUS); +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_connect(adjustmentv, "value_changed", + GtkSignalFunc(ScrollSignal), this); +#else + g_signal_connect(G_OBJECT(adjustmentv), "value_changed", + G_CALLBACK(ScrollSignal), this); +#endif + gtk_widget_set_parent(PWidget(scrollbarv), PWidget(wMain)); + gtk_widget_show(PWidget(scrollbarv)); + + adjustmenth = gtk_adjustment_new(0.0, 0.0, 101.0, 1.0, 20.0, 20.0); + scrollbarh = gtk_hscrollbar_new(GTK_ADJUSTMENT(adjustmenth)); + GTK_WIDGET_UNSET_FLAGS(PWidget(scrollbarh), GTK_CAN_FOCUS); +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_connect(adjustmenth, "value_changed", + GtkSignalFunc(ScrollHSignal), this); +#else + g_signal_connect(G_OBJECT(adjustmenth), "value_changed", + G_CALLBACK(ScrollHSignal), this); +#endif + gtk_widget_set_parent(PWidget(scrollbarh), PWidget(wMain)); + gtk_widget_show(PWidget(scrollbarh)); + + gtk_widget_grab_focus(PWidget(wMain)); + + gtk_selection_add_targets(GTK_WIDGET(PWidget(wMain)), GDK_SELECTION_PRIMARY, + clipboardTargets, nClipboardTargets); + +#ifndef USE_GTK_CLIPBOARD + gtk_selection_add_targets(GTK_WIDGET(PWidget(wMain)), atomClipboard, + clipboardTargets, nClipboardTargets); +#endif + + gtk_drag_dest_set(GTK_WIDGET(PWidget(wMain)), + GTK_DEST_DEFAULT_ALL, clipboardTargets, nClipboardTargets, + static_cast(GDK_ACTION_COPY | GDK_ACTION_MOVE)); + + SetTicking(true); +} + +void ScintillaGTK::Finalise() { + SetTicking(false); + ScintillaBase::Finalise(); +} + +void ScintillaGTK::DisplayCursor(Window::Cursor c) { + if (cursorMode == SC_CURSORNORMAL) + wText.SetCursor(c); + else + wText.SetCursor(static_cast(cursorMode)); +} + +void ScintillaGTK::StartDrag() { + dragWasDropped = false; + static const GtkTargetEntry targets[] = { + { "UTF8_STRING", 0, TARGET_UTF8_STRING }, + { "STRING", 0, TARGET_STRING }, + }; + static const gint n_targets = sizeof(targets) / sizeof(targets[0]); + GtkTargetList *tl = gtk_target_list_new(targets, n_targets); + gtk_drag_begin(GTK_WIDGET(PWidget(wMain)), + tl, + static_cast(GDK_ACTION_COPY | GDK_ACTION_MOVE), + evbtn.button, + reinterpret_cast(&evbtn)); +} + +#ifdef USE_CONVERTER +static char *ConvertText(int *lenResult, char *s, size_t len, const char *charSetDest, + const char *charSetSource, bool transliterations) { + *lenResult = 0; + char *destForm = 0; + Converter conv(charSetDest, charSetSource, transliterations); + if (conv) { + destForm = new char[len*3+1]; + char *pin = s; + size_t inLeft = len; + char *pout = destForm; + size_t outLeft = len*3+1; + size_t conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); + if (conversions == ((size_t)(-1))) { +fprintf(stderr, "iconv %s->%s failed for %s\n", charSetSource, charSetDest, static_cast(s)); + delete []destForm; + destForm = 0; + } else { +//fprintf(stderr, "iconv OK %s %d\n", destForm, pout - destForm); + *pout = '\0'; + *lenResult = pout - destForm; + } + } else { +fprintf(stderr, "Can not iconv %s %s\n", charSetDest, charSetSource); + } + if (!destForm) { + destForm = new char[1]; + destForm[0] = '\0'; + *lenResult = 0; + } + return destForm; +} +#endif + +// Returns the target converted to UTF8. +// Return the length in bytes. +int ScintillaGTK::TargetAsUTF8(char *text) { + int targetLength = targetEnd - targetStart; + if (IsUnicodeMode()) { + if (text) { + pdoc->GetCharRange(text, targetStart, targetLength); + } + } else { + // Need to convert +#ifdef USE_CONVERTER + const char *charSetBuffer = CharacterSetID(); + if (*charSetBuffer) { +//~ fprintf(stderr, "AsUTF8 %s %d %0d-%0d\n", charSetBuffer, targetLength, targetStart, targetEnd); + char *s = new char[targetLength]; + if (s) { + pdoc->GetCharRange(s, targetStart, targetLength); +//~ fprintf(stderr, " \"%s\"\n", s); + if (text) { + char *tmputf = ConvertText(&targetLength, s, targetLength, "UTF-8", charSetBuffer, false); + memcpy(text, tmputf, targetLength); + delete []tmputf; +//~ fprintf(stderr, " \"%s\"\n", text); + } + delete []s; + } + } else { + if (text) { + pdoc->GetCharRange(text, targetStart, targetLength); + } + } +#else + // Fail + return 0; +#endif + } +//~ fprintf(stderr, "Length = %d bytes\n", targetLength); + return targetLength; +} + +// Translates a nul terminated UTF8 string into the document encoding. +// Return the length of the result in bytes. +int ScintillaGTK::EncodedFromUTF8(char *utf8, char *encoded) { + int inputLength = (lengthForEncode >= 0) ? lengthForEncode : strlen(utf8); + if (IsUnicodeMode()) { + if (encoded) { + memcpy(encoded, utf8, inputLength); + } + return inputLength; + } else { + // Need to convert +#ifdef USE_CONVERTER + const char *charSetBuffer = CharacterSetID(); + if (*charSetBuffer) { +//~ fprintf(stderr, "Encode %s %d\n", charSetBuffer, inputLength); + int outLength = 0; + char *tmpEncoded = ConvertText(&outLength, utf8, inputLength, charSetBuffer, "UTF-8", true); + if (tmpEncoded) { +//~ fprintf(stderr, " \"%s\"\n", tmpEncoded); + if (encoded) { + memcpy(encoded, tmpEncoded, outLength); + } + delete []tmpEncoded; + } + return outLength; + } else { + if (encoded) { + memcpy(encoded, utf8, inputLength); + } + return inputLength; + } +#endif + } + // Fail + return 0; +} + +bool ScintillaGTK::ValidCodePage(int codePage) const { + return codePage == 0 || codePage == SC_CP_UTF8 || codePage == SC_CP_DBCS; +} + +sptr_t ScintillaGTK::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { + switch (iMessage) { + + case SCI_GRABFOCUS: + gtk_widget_grab_focus(PWidget(wMain)); + break; + + case SCI_GETDIRECTFUNCTION: + return reinterpret_cast(DirectFunction); + + case SCI_GETDIRECTPOINTER: + return reinterpret_cast(this); + +#ifdef SCI_LEXER + case SCI_LOADLEXERLIBRARY: + LexerManager::GetInstance()->Load(reinterpret_cast(wParam)); + break; +#endif + case SCI_TARGETASUTF8: + return TargetAsUTF8(reinterpret_cast(lParam)); + + case SCI_ENCODEDFROMUTF8: + return EncodedFromUTF8(reinterpret_cast(wParam), + reinterpret_cast(lParam)); + + default: + return ScintillaBase::WndProc(iMessage, wParam, lParam); + } + return 0l; +} + +sptr_t ScintillaGTK::DefWndProc(unsigned int, uptr_t, sptr_t) { + return 0; +} + +void ScintillaGTK::SetTicking(bool on) { + if (timer.ticking != on) { + timer.ticking = on; + if (timer.ticking) { + timer.tickerID = reinterpret_cast(gtk_timeout_add(timer.tickSize, (GtkFunction)TimeOut, this)); + } else { + gtk_timeout_remove(GPOINTER_TO_UINT(timer.tickerID)); + } + } + timer.ticksToWait = caret.period; +} + +bool ScintillaGTK::SetIdle(bool on) { + if (on) { + // Start idler, if it's not running. + if (idler.state == false) { + idler.state = true; + idler.idlerID = reinterpret_cast + (gtk_idle_add((GtkFunction)IdleCallback, this)); + } + } else { + // Stop idler, if it's running + if (idler.state == true) { + idler.state = false; + gtk_idle_remove(GPOINTER_TO_UINT(idler.idlerID)); + } + } + return true; +} + +void ScintillaGTK::SetMouseCapture(bool on) { + if (mouseDownCaptures) { + if (on) { + gtk_grab_add(GTK_WIDGET(PWidget(wMain))); + } else { + gtk_grab_remove(GTK_WIDGET(PWidget(wMain))); + } + } + capturedMouse = on; +} + +bool ScintillaGTK::HaveMouseCapture() { + return capturedMouse; +} + +bool ScintillaGTK::PaintContains(PRectangle rc) { + bool contains = true; + if (paintState == painting) { + if (!rcPaint.Contains(rc)) { + contains = false; + } else if (rgnUpdate) { + GdkRectangle grc = {rc.left, rc.top, + rc.right - rc.left, rc.bottom - rc.top}; + if (gdk_region_rect_in(rgnUpdate, &grc) != GDK_OVERLAP_RECTANGLE_IN) { + contains = false; + } + } + } + return contains; +} + +// Redraw all of text area. This paint will not be abandoned. +void ScintillaGTK::FullPaint() { +#if GTK_MAJOR_VERSION < 2 + paintState = painting; + rcPaint = GetClientRectangle(); + //Platform::DebugPrintf("ScintillaGTK::FullPaint %0d,%0d %0d,%0d\n", + // rcPaint.left, rcPaint.top, rcPaint.right, rcPaint.bottom); + paintingAllText = true; + if ((PWidget(wText))->window) { + Surface *sw = Surface::Allocate(); + if (sw) { + sw->Init(PWidget(wText)->window, PWidget(wText)); + Paint(sw, rcPaint); + sw->Release(); + delete sw; + } + } + paintState = notPainting; +#else + wText.InvalidateAll(); +#endif +} + +PRectangle ScintillaGTK::GetClientRectangle() { + PRectangle rc = wMain.GetClientPosition(); + if (verticalScrollBarVisible) + rc.right -= scrollBarWidth; + if (horizontalScrollBarVisible && (wrapState == eWrapNone)) + rc.bottom -= scrollBarHeight; + // Move to origin + rc.right -= rc.left; + rc.bottom -= rc.top; + rc.left = 0; + rc.top = 0; + return rc; +} + +// Synchronously paint a rectangle of the window. +void ScintillaGTK::SyncPaint(PRectangle rc) { + paintState = painting; + rcPaint = rc; + PRectangle rcClient = GetClientRectangle(); + paintingAllText = rcPaint.Contains(rcClient); + if ((PWidget(wText))->window) { + Surface *sw = Surface::Allocate(); + if (sw) { + sw->Init(PWidget(wText)->window, PWidget(wText)); + Paint(sw, rc); + sw->Release(); + delete sw; + } + } + if (paintState == paintAbandoned) { + // Painting area was insufficient to cover new styling or brace highlight positions + FullPaint(); + } + paintState = notPainting; +} + +void ScintillaGTK::ScrollText(int linesToMove) { + int diff = vs.lineHeight * -linesToMove; + //Platform::DebugPrintf("ScintillaGTK::ScrollText %d %d %0d,%0d %0d,%0d\n", linesToMove, diff, + // rc.left, rc.top, rc.right, rc.bottom); + GtkWidget *wi = PWidget(wText); + +#if GTK_MAJOR_VERSION < 2 + PRectangle rc = GetClientRectangle(); + GdkGC *gc = gdk_gc_new(wi->window); + + // Set up gc so we get GraphicsExposures from gdk_draw_pixmap + // which calls XCopyArea + gdk_gc_set_exposures(gc, TRUE); + + // Redraw exposed bit : scrolling upwards + if (diff > 0) { + gdk_draw_pixmap(wi->window, + gc, wi->window, + 0, diff, + 0, 0, + rc.Width()-1, rc.Height() - diff); + SyncPaint(PRectangle(0, rc.Height() - diff, + rc.Width(), rc.Height()+1)); + + // Redraw exposed bit : scrolling downwards + } else { + gdk_draw_pixmap(wi->window, + gc, wi->window, + 0, 0, + 0, -diff, + rc.Width()-1, rc.Height() + diff); + SyncPaint(PRectangle(0, 0, rc.Width(), -diff)); + } + + // Look for any graphics expose + GdkEvent* event; + while ((event = gdk_event_get_graphics_expose(wi->window)) != NULL) { + gtk_widget_event(wi, event); + if (event->expose.count == 0) { + gdk_event_free(event); + break; + } + gdk_event_free(event); + } + + gdk_gc_unref(gc); +#else + gdk_window_scroll(wi->window, 0, -diff); + gdk_window_process_updates(wi->window, FALSE); +#endif +} + +void ScintillaGTK::SetVerticalScrollPos() { + DwellEnd(true); + gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustmentv), topLine); +} + +void ScintillaGTK::SetHorizontalScrollPos() { + DwellEnd(true); + gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustmenth), xOffset / 2); +} + +bool ScintillaGTK::ModifyScrollBars(int nMax, int nPage) { + bool modified = false; + int pageScroll = LinesToScroll(); + + if (GTK_ADJUSTMENT(adjustmentv)->upper != (nMax + 1) || + GTK_ADJUSTMENT(adjustmentv)->page_size != nPage || + GTK_ADJUSTMENT(adjustmentv)->page_increment != pageScroll) { + GTK_ADJUSTMENT(adjustmentv)->upper = nMax + 1; + GTK_ADJUSTMENT(adjustmentv)->page_size = nPage; + GTK_ADJUSTMENT(adjustmentv)->page_increment = pageScroll; + gtk_adjustment_changed(GTK_ADJUSTMENT(adjustmentv)); + modified = true; + } + + PRectangle rcText = GetTextRectangle(); + int horizEndPreferred = scrollWidth; + if (horizEndPreferred < 0) + horizEndPreferred = 0; + unsigned int pageWidth = rcText.Width(); + unsigned int pageIncrement = pageWidth / 3; + unsigned int charWidth = vs.styles[STYLE_DEFAULT].aveCharWidth; + if (GTK_ADJUSTMENT(adjustmenth)->upper != horizEndPreferred || + GTK_ADJUSTMENT(adjustmenth)->page_size != pageWidth || + GTK_ADJUSTMENT(adjustmenth)->page_increment != pageIncrement || + GTK_ADJUSTMENT(adjustmenth)->step_increment != charWidth) { + GTK_ADJUSTMENT(adjustmenth)->upper = horizEndPreferred; + GTK_ADJUSTMENT(adjustmenth)->step_increment = charWidth; + GTK_ADJUSTMENT(adjustmenth)->page_size = pageWidth; + GTK_ADJUSTMENT(adjustmenth)->page_increment = pageIncrement; + gtk_adjustment_changed(GTK_ADJUSTMENT(adjustmenth)); + modified = true; + } + return modified; +} + +void ScintillaGTK::ReconfigureScrollBars() { + PRectangle rc = wMain.GetClientPosition(); + Resize(rc.Width(), rc.Height()); +} + +void ScintillaGTK::NotifyChange() { +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_emit(GTK_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], + Platform::LongFromTwoShorts(GetCtrlID(), SCEN_CHANGE), PWidget(wMain)); +#else + g_signal_emit(G_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], 0, + Platform::LongFromTwoShorts(GetCtrlID(), SCEN_CHANGE), PWidget(wMain)); +#endif +} + +void ScintillaGTK::NotifyFocus(bool focus) { +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_emit(GTK_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], + Platform::LongFromTwoShorts + (GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS), PWidget(wMain)); +#else + g_signal_emit(G_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], 0, + Platform::LongFromTwoShorts + (GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS), PWidget(wMain)); +#endif +} + +void ScintillaGTK::NotifyParent(SCNotification scn) { + scn.nmhdr.hwndFrom = PWidget(wMain); + scn.nmhdr.idFrom = GetCtrlID(); +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_emit(GTK_OBJECT(sci), scintilla_signals[NOTIFY_SIGNAL], + GetCtrlID(), &scn); +#else + g_signal_emit(G_OBJECT(sci), scintilla_signals[NOTIFY_SIGNAL], 0, + GetCtrlID(), &scn); +#endif +} + +void ScintillaGTK::NotifyKey(int key, int modifiers) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_KEY; + scn.ch = key; + scn.modifiers = modifiers; + + NotifyParent(scn); +} + +void ScintillaGTK::NotifyURIDropped(const char *list) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_URIDROPPED; + scn.text = list; + + NotifyParent(scn); +} + +const char *CharacterSetID(int characterSet); + +const char *ScintillaGTK::CharacterSetID() const { + return ::CharacterSetID(vs.styles[STYLE_DEFAULT].characterSet); +} + +int ScintillaGTK::KeyDefault(int key, int modifiers) { + if (!(modifiers & SCI_CTRL) && !(modifiers & SCI_ALT)) { + if (key < 256) { + NotifyKey(key, modifiers); + return 0; + } else { + // Pass up to container in case it is an accelerator + NotifyKey(key, modifiers); + return 0; + } + } else { + // Pass up to container in case it is an accelerator + NotifyKey(key, modifiers); + return 0; + } + //Platform::DebugPrintf("SK-key: %d %x %x\n",key, modifiers); +} + +void ScintillaGTK::CopyToClipboard(const SelectionText &selectedText) { +#ifndef USE_GTK_CLIPBOARD + copyText.Copy(selectedText); + gtk_selection_owner_set(GTK_WIDGET(PWidget(wMain)), + atomClipboard, + GDK_CURRENT_TIME); +#else + GtkClipboard *clipBoard; + clipBoard = gtk_widget_get_clipboard(GTK_WIDGET(PWidget(wMain)), atomClipboard); + if (clipBoard == NULL) // Occurs if widget isn't in a toplevel + return; + + SelectionText *clipText = new SelectionText(); + clipText->Copy(selectedText); + + gtk_clipboard_set_with_data(clipBoard, clipboardTargets, nClipboardTargets, + ClipboardGetSelection, ClipboardClearSelection, clipText); + +#endif +} + +void ScintillaGTK::Copy() { + if (currentPos != anchor) { +#ifndef USE_GTK_CLIPBOARD + CopySelectionRange(©Text); + gtk_selection_owner_set(GTK_WIDGET(PWidget(wMain)), + atomClipboard, + GDK_CURRENT_TIME); +#else + GtkClipboard *clipBoard; + clipBoard = gtk_widget_get_clipboard(GTK_WIDGET(PWidget(wMain)), atomClipboard); + if (clipBoard == NULL) // Occurs if widget isn't in a toplevel + return; + + SelectionText *clipText = new SelectionText(); + CopySelectionRange(clipText); + + gtk_clipboard_set_with_data(clipBoard, clipboardTargets, nClipboardTargets, + ClipboardGetSelection, ClipboardClearSelection, clipText); + +#endif +#if PLAT_GTK_WIN32 + if (selType == selRectangle) { + ::OpenClipboard(NULL); + ::SetClipboardData(cfColumnSelect, 0); + ::CloseClipboard(); + } +#endif + } +} + +void ScintillaGTK::Paste() { + atomSought = atomUTF8; + gtk_selection_convert(GTK_WIDGET(PWidget(wMain)), + atomClipboard, atomSought, GDK_CURRENT_TIME); +} + +void ScintillaGTK::CreateCallTipWindow(PRectangle rc) { + if (!ct.wCallTip.Created()) { + ct.wCallTip = gtk_window_new(GTK_WINDOW_POPUP); + ct.wDraw = gtk_drawing_area_new(); + GtkWidget *widcdrw = PWidget(ct.wDraw); // // No code inside the G_OBJECT macro + gtk_container_add(GTK_CONTAINER(PWidget(ct.wCallTip)), widcdrw); +#if GLIB_MAJOR_VERSION < 2 + gtk_signal_connect(GTK_OBJECT(widcdrw), "expose_event", + GtkSignalFunc(ScintillaGTK::ExposeCT), &ct); + gtk_signal_connect(GTK_OBJECT(widcdrw), "button_press_event", + GtkSignalFunc(ScintillaGTK::PressCT), static_cast(this)); +#else + g_signal_connect(G_OBJECT(widcdrw), "expose_event", + G_CALLBACK(ScintillaGTK::ExposeCT), &ct); + g_signal_connect(G_OBJECT(widcdrw), "button_press_event", + G_CALLBACK(ScintillaGTK::PressCT), static_cast(this)); +#endif + gtk_widget_set_events(widcdrw, + GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); + } + gtk_drawing_area_size(GTK_DRAWING_AREA(PWidget(ct.wDraw)), + rc.Width(), rc.Height()); + ct.wDraw.Show(); + if (PWidget(ct.wCallTip)->window) { + gdk_window_resize(PWidget(ct.wCallTip)->window, rc.Width(), rc.Height()); + } +} + +void ScintillaGTK::AddToPopUp(const char *label, int cmd, bool enabled) { + char fulllabel[200]; + strcpy(fulllabel, "/"); + strcat(fulllabel, label); + GtkItemFactoryCallback menuSig = GtkItemFactoryCallback(PopUpCB); + GtkItemFactoryEntry itemEntry = { + fulllabel, NULL, + menuSig, + cmd, + const_cast(label[0] ? "" : ""), +#if GTK_MAJOR_VERSION >= 2 + NULL +#endif + }; + gtk_item_factory_create_item(GTK_ITEM_FACTORY(popup.GetID()), + &itemEntry, this, 1); + if (cmd) { + GtkWidget *item = gtk_item_factory_get_widget_by_action( + reinterpret_cast(popup.GetID()), cmd); + if (item) + gtk_widget_set_sensitive(item, enabled); + } +} + +bool ScintillaGTK::OwnPrimarySelection() { + return ((gdk_selection_owner_get(GDK_SELECTION_PRIMARY) + == GTK_WIDGET(PWidget(wMain))->window) && + (GTK_WIDGET(PWidget(wMain))->window != NULL)); +} + +void ScintillaGTK::ClaimSelection() { + // X Windows has a 'primary selection' as well as the clipboard. + // Whenever the user selects some text, we become the primary selection + if (currentPos != anchor && GTK_WIDGET_REALIZED(GTK_WIDGET(PWidget(wMain)))) { + primarySelection = true; + gtk_selection_owner_set(GTK_WIDGET(PWidget(wMain)), + GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); + primary.Free(); + } else if (OwnPrimarySelection()) { + primarySelection = true; + if (primary.s == NULL) + gtk_selection_owner_set(NULL, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); + } else { + primarySelection = false; + primary.Free(); + } +} + +// Detect rectangular text, convert line ends to current mode, convert from or to UTF-8 +void ScintillaGTK::GetGtkSelectionText(GtkSelectionData *selectionData, SelectionText &selText) { + char *data = reinterpret_cast(selectionData->data); + int len = selectionData->length; + GdkAtom selectionType = selectionData->type; + + // Return empty string if selection is not a string + if ((selectionType != GDK_TARGET_STRING) && (selectionType != atomUTF8)) { + char *empty = new char[1]; + empty[0] = '\0'; + selText.Set(empty, 0, SC_CP_UTF8, 0, false); + return; + } + + // Check for "\n\0" ending to string indicating that selection is rectangular + bool isRectangular; +#if PLAT_GTK_WIN32 + isRectangular = ::IsClipboardFormatAvailable(cfColumnSelect) != 0; +#else + isRectangular = ((len > 2) && (data[len - 1] == 0 && data[len - 2] == '\n')); +#endif + + char *dest; + if (selectionType == GDK_TARGET_STRING) { + dest = Document::TransformLineEnds(&len, data, len, pdoc->eolMode); + if (IsUnicodeMode()) { + // Unknown encoding so assume in Latin1 + char *destPrevious = dest; + dest = UTF8FromLatin1(dest, len); + selText.Set(dest, len, SC_CP_UTF8, 0, selText.rectangular); + delete []destPrevious; + } else { + // Assume buffer is in same encoding as selection + selText.Set(dest, len, pdoc->dbcsCodePage, + vs.styles[STYLE_DEFAULT].characterSet, isRectangular); + } + } else { // UTF-8 + dest = Document::TransformLineEnds(&len, data, len, pdoc->eolMode); + selText.Set(dest, len, SC_CP_UTF8, 0, isRectangular); +#ifdef USE_CONVERTER + const char *charSetBuffer = CharacterSetID(); + if (!IsUnicodeMode() && *charSetBuffer) { +//fprintf(stderr, "Convert to locale %s\n", CharacterSetID()); + // Convert to locale + dest = ConvertText(&len, selText.s, selText.len, charSetBuffer, "UTF-8", true); + selText.Set(dest, len, pdoc->dbcsCodePage, + vs.styles[STYLE_DEFAULT].characterSet, selText.rectangular); + } +#endif + } +} + +void ScintillaGTK::ReceivedSelection(GtkSelectionData *selection_data) { + if ((selection_data->selection == atomClipboard) || + (selection_data->selection == GDK_SELECTION_PRIMARY)) { + if ((atomSought == atomUTF8) && (selection_data->length <= 0)) { + atomSought = atomString; + gtk_selection_convert(GTK_WIDGET(PWidget(wMain)), + selection_data->selection, atomSought, GDK_CURRENT_TIME); + } else if ((selection_data->length > 0) && + ((selection_data->type == GDK_TARGET_STRING) || (selection_data->type == atomUTF8))) { + SelectionText selText; + GetGtkSelectionText(selection_data, selText); + + pdoc->BeginUndoAction(); + if (selection_data->selection != GDK_SELECTION_PRIMARY) { + ClearSelection(); + } + int selStart = SelectionStart(); + + if (selText.rectangular) { + PasteRectangular(selStart, selText.s, selText.len); + } else { + pdoc->InsertString(currentPos, selText.s, selText.len); + SetEmptySelection(currentPos + selText.len); + } + pdoc->EndUndoAction(); + EnsureCaretVisible(); + } + } +// else fprintf(stderr, "Target non string %d %d\n", (int)(selection_data->type), +// (int)(atomUTF8)); + Redraw(); +} + +void ScintillaGTK::ReceivedDrop(GtkSelectionData *selection_data) { + dragWasDropped = true; + if (selection_data->type == atomUriList || selection_data->type == atomDROPFILES_DND) { + char *ptr = new char[selection_data->length + 1]; + ptr[selection_data->length] = '\0'; + memcpy(ptr, selection_data->data, selection_data->length); + NotifyURIDropped(ptr); + delete []ptr; + } else if ((selection_data->type == GDK_TARGET_STRING) || (selection_data->type == atomUTF8)) { + if (selection_data->length > 0) { + SelectionText selText; + GetGtkSelectionText(selection_data, selText); + DropAt(posDrop, selText.s, false, selText.rectangular); + } + } else if (selection_data->length > 0) { + //~ fprintf(stderr, "ReceivedDrop other %p\n", static_cast(selection_data->type)); + } + Redraw(); +} + + + +void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *text) { +#if PLAT_GTK_WIN32 + // Many native win32 programs require \n line endings, so make a copy of + // the clip text now with newlines converted. Use { } to hide symbols + // from code below + SelectionText *newline_normalized = NULL; + { + int tmpstr_len; + char *tmpstr = Document::TransformLineEnds(&tmpstr_len, text->s, text->len, SC_EOL_LF); + newline_normalized = new SelectionText(); + newline_normalized->Set(tmpstr, tmpstr_len, SC_CP_UTF8, 0, text->rectangular); + text = newline_normalized; + } +#endif + +#if GTK_MAJOR_VERSION >= 2 + // Convert text to utf8 if it isn't already + SelectionText *converted = 0; + if ((text->codePage != SC_CP_UTF8) && (info == TARGET_UTF8_STRING)) { + const char *charSet = ::CharacterSetID(text->characterSet); + if (*charSet) { + int new_len; + char* tmputf = ConvertText(&new_len, text->s, text->len, "UTF-8", charSet, false); + converted = new SelectionText(); + converted->Set(tmputf, new_len, SC_CP_UTF8, 0, text->rectangular); + text = converted; + } + } + + // Here is a somewhat evil kludge. + // As I can not work out how to store data on the clipboard in multiple formats + // and need some way to mark the clipping as being stream or rectangular, + // the terminating \0 is included in the length for rectangular clippings. + // All other tested aplications behave benignly by ignoring the \0. + // The #if is here because on Windows cfColumnSelect clip entry is used + // instead as standard indicator of rectangularness (so no need to kludge) + int len = strlen(text->s); +#if PLAT_GTK_WIN32 == 0 + if (text->rectangular) + len++; +#endif + + if (info == TARGET_UTF8_STRING) { + gtk_selection_data_set_text(selection_data, text->s, len); + } else { + gtk_selection_data_set(selection_data, + static_cast(GDK_SELECTION_TYPE_STRING), + 8, reinterpret_cast(text->s), len); + } + delete converted; + +#else /* Gtk 1 */ + char *selBuffer = text->s; + + char *tmputf = 0; + if ((info == TARGET_UTF8_STRING) || (info == TARGET_STRING)) { + int len = strlen(selBuffer); +#ifdef USE_CONVERTER + // Possible character set conversion + const char *charSetBuffer = ::CharacterSetID(text->characterSet); + if (info == TARGET_UTF8_STRING) { + //fprintf(stderr, "Copy to clipboard as UTF-8\n"); + if (text->codePage != SC_CP_UTF8) { + // Convert to UTF-8 + //fprintf(stderr, "Convert to UTF-8 from %s\n", charSetBuffer); + tmputf = ConvertText(&len, selBuffer, len, "UTF-8", charSetBuffer, false); + selBuffer = tmputf; + } + } else if (info == TARGET_STRING) { + if (text->codePage == SC_CP_UTF8) { + //fprintf(stderr, "Convert to locale %s\n", charSetBuffer); + // Convert to locale + tmputf = ConvertText(&len, selBuffer, len, charSetBuffer, "UTF-8", true); + selBuffer = tmputf; + } + } +#endif + + // Here is a somewhat evil kludge. + // As I can not work out how to store data on the clipboard in multiple formats + // and need some way to mark the clipping as being stream or rectangular, + // the terminating \0 is included in the length for rectangular clippings. + // All other tested aplications behave benignly by ignoring the \0. + // The #if is here because on Windows cfColumnSelect clip entry is used + // instead as standard indicator of rectangularness (so no need to kludge) +#if PLAT_GTK_WIN32 == 0 + if (text->rectangular) + len++; +#endif + gtk_selection_data_set(selection_data, + (info == TARGET_STRING) ? + static_cast(GDK_SELECTION_TYPE_STRING) : atomUTF8, + 8, reinterpret_cast(selBuffer), + len); + } else if ((info == TARGET_TEXT) || (info == TARGET_COMPOUND_TEXT)) { + guchar *text; + GdkAtom encoding; + gint format; + gint new_length; + + gdk_string_to_compound_text(reinterpret_cast(selBuffer), + &encoding, &format, &text, &new_length); + gtk_selection_data_set(selection_data, encoding, format, text, new_length); + gdk_free_compound_text(text); + } + + delete []tmputf; +#endif /* Gtk >= 2 */ + +#if PLAT_GTK_WIN32 + delete newline_normalized; +#endif +} + +#ifdef USE_GTK_CLIPBOARD +void ScintillaGTK::ClipboardGetSelection(GtkClipboard *, GtkSelectionData *selection_data, guint info, void *data) { + GetSelection(selection_data, info, static_cast(data)); +} + +void ScintillaGTK::ClipboardClearSelection(GtkClipboard *, void *data) { + SelectionText *obj = static_cast(data); + delete obj; +} +#endif + +void ScintillaGTK::UnclaimSelection(GdkEventSelection *selection_event) { + //Platform::DebugPrintf("UnclaimSelection\n"); + if (selection_event->selection == GDK_SELECTION_PRIMARY) { + //Platform::DebugPrintf("UnclaimPrimarySelection\n"); + if (!OwnPrimarySelection()) { + primary.Free(); + primarySelection = false; + FullPaint(); + } + } +} + +void ScintillaGTK::Resize(int width, int height) { + //Platform::DebugPrintf("Resize %d %d\n", width, height); + //printf("Resize %d %d\n", width, height); + + // Not always needed, but some themes can have different sizes of scrollbars + scrollBarWidth = GTK_WIDGET(PWidget(scrollbarv))->requisition.width; + scrollBarHeight = GTK_WIDGET(PWidget(scrollbarh))->requisition.height; + + // These allocations should never produce negative sizes as they would wrap around to huge + // unsigned numbers inside GTK+ causing warnings. + bool showSBHorizontal = horizontalScrollBarVisible && (wrapState == eWrapNone); + int horizontalScrollBarHeight = scrollBarHeight; + if (!showSBHorizontal) + horizontalScrollBarHeight = 0; + int verticalScrollBarHeight = scrollBarWidth; + if (!verticalScrollBarVisible) + verticalScrollBarHeight = 0; + + GtkAllocation alloc; + if (showSBHorizontal) { + gtk_widget_show(GTK_WIDGET(PWidget(scrollbarh))); + alloc.x = 0; + alloc.y = height - scrollBarHeight; + alloc.width = Platform::Maximum(1, width - scrollBarWidth) + 1; + alloc.height = horizontalScrollBarHeight; + gtk_widget_size_allocate(GTK_WIDGET(PWidget(scrollbarh)), &alloc); + } else { + gtk_widget_hide(GTK_WIDGET(PWidget(scrollbarh))); + } + + if (verticalScrollBarVisible) { + gtk_widget_show(GTK_WIDGET(PWidget(scrollbarv))); + alloc.x = width - scrollBarWidth; + alloc.y = 0; + alloc.width = scrollBarWidth; + alloc.height = Platform::Maximum(1, height - scrollBarHeight) + 1; + if (!showSBHorizontal) + alloc.height += scrollBarWidth-1; + gtk_widget_size_allocate(GTK_WIDGET(PWidget(scrollbarv)), &alloc); + } else { + gtk_widget_hide(GTK_WIDGET(PWidget(scrollbarv))); + } + if (GTK_WIDGET_MAPPED(PWidget(wMain))) { + ChangeSize(); + } + + alloc.x = 0; + alloc.y = 0; + alloc.width = Platform::Maximum(1, width - scrollBarWidth); + alloc.height = Platform::Maximum(1, height - scrollBarHeight); + if (!showSBHorizontal) + alloc.height += scrollBarHeight; + if (!verticalScrollBarVisible) + alloc.width += scrollBarWidth; + gtk_widget_size_allocate(GTK_WIDGET(PWidget(wText)), &alloc); +} + +static void SetAdjustmentValue(GtkObject *object, int value) { + GtkAdjustment *adjustment = GTK_ADJUSTMENT(object); + int maxValue = static_cast( + adjustment->upper - adjustment->page_size); + if (value > maxValue) + value = maxValue; + if (value < 0) + value = 0; + gtk_adjustment_set_value(adjustment, value); +} + +gint ScintillaGTK::PressThis(GdkEventButton *event) { + //Platform::DebugPrintf("Press %x time=%d state = %x button = %x\n",this,event->time, event->state, event->button); + // Do not use GTK+ double click events as Scintilla has its own double click detection + if (event->type != GDK_BUTTON_PRESS) + return FALSE; + + evbtn = *event; + Point pt; + pt.x = int(event->x); + pt.y = int(event->y); + PRectangle rcClient = GetClientRectangle(); + //Platform::DebugPrintf("Press %0d,%0d in %0d,%0d %0d,%0d\n", + // pt.x, pt.y, rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); + if ((pt.x > rcClient.right) || (pt.y > rcClient.bottom)) { + Platform::DebugPrintf("Bad location\n"); + return FALSE; + } + + bool ctrl = (event->state & GDK_CONTROL_MASK) != 0; + + gtk_widget_grab_focus(PWidget(wMain)); + if (event->button == 1) { + // On X, instead of sending literal modifiers use control instead of alt + // This is because most X window managers grab alt + click for moving +#if !PLAT_GTK_WIN32 + ButtonDown(pt, event->time, + (event->state & GDK_SHIFT_MASK) != 0, + (event->state & GDK_CONTROL_MASK) != 0, + (event->state & GDK_CONTROL_MASK) != 0); +#else + ButtonDown(pt, event->time, + (event->state & GDK_SHIFT_MASK) != 0, + (event->state & GDK_CONTROL_MASK) != 0, + (event->state & GDK_MOD1_MASK) != 0); +#endif + } else if (event->button == 2) { + // Grab the primary selection if it exists + Position pos = PositionFromLocation(pt); + if (OwnPrimarySelection() && primary.s == NULL) + CopySelectionRange(&primary); + + SetSelection(pos, pos); + atomSought = atomUTF8; + gtk_selection_convert(GTK_WIDGET(PWidget(wMain)), GDK_SELECTION_PRIMARY, + atomSought, event->time); + } else if (event->button == 3) { + if (displayPopupMenu) { + // PopUp menu + // Convert to screen + int ox = 0; + int oy = 0; + gdk_window_get_origin(PWidget(wMain)->window, &ox, &oy); + ContextMenu(Point(pt.x + ox, pt.y + oy)); + } else { + return FALSE; + } + } else if (event->button == 4) { + // Wheel scrolling up (only GTK 1.x does it this way) + if (ctrl) + SetAdjustmentValue(adjustmenth, (xOffset / 2) - 6); + else + SetAdjustmentValue(adjustmentv, topLine - 3); + } else if (event->button == 5) { + // Wheel scrolling down (only GTK 1.x does it this way) + if (ctrl) + SetAdjustmentValue(adjustmenth, (xOffset / 2) + 6); + else + SetAdjustmentValue(adjustmentv, topLine + 3); + } +#if GTK_MAJOR_VERSION >= 2 + return TRUE; +#else + return FALSE; +#endif +} + +gint ScintillaGTK::Press(GtkWidget *widget, GdkEventButton *event) { + if (event->window != widget->window) + return FALSE; + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + return sciThis->PressThis(event); +} + +gint ScintillaGTK::MouseRelease(GtkWidget *widget, GdkEventButton *event) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + //Platform::DebugPrintf("Release %x %d %d\n",sciThis,event->time,event->state); + if (!sciThis->HaveMouseCapture()) + return FALSE; + if (event->button == 1) { + Point pt; + pt.x = int(event->x); + pt.y = int(event->y); + //Platform::DebugPrintf("Up %x %x %d %d %d\n", + // sciThis,event->window,event->time, pt.x, pt.y); + if (event->window != PWidget(sciThis->wMain)->window) + // If mouse released on scroll bar then the position is relative to the + // scrollbar, not the drawing window so just repeat the most recent point. + pt = sciThis->ptMouseLast; + sciThis->ButtonUp(pt, event->time, (event->state & 4) != 0); + } + return FALSE; +} + +// win32gtk and GTK >= 2 use SCROLL_* events instead of passing the +// button4/5/6/7 events to the GTK app +#if PLAT_GTK_WIN32 || (GTK_MAJOR_VERSION >= 2) +gint ScintillaGTK::ScrollEvent(GtkWidget *widget, + GdkEventScroll *event) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + + if (widget == NULL || event == NULL) + return FALSE; + + // Compute amount and direction to scroll (even tho on win32 there is + // intensity of scrolling info in the native message, gtk doesn't + // support this so we simulate similarly adaptive scrolling) + // Note that this is disabled on OS X (Darwin) where the X11 server already has + // and adaptive scrolling algorithm that fights with this one + int cLineScroll; +#if defined(__MWERKS__) || defined(__APPLE_CPP__) || defined(__APPLE_CC__) + cLineScroll = sciThis->linesPerScroll; + if (cLineScroll == 0) + cLineScroll = 4; + sciThis->wheelMouseIntensity = cLineScroll; +#else + int timeDelta = 1000000; + GTimeVal curTime; + g_get_current_time(&curTime); + if (curTime.tv_sec == sciThis->lastWheelMouseTime.tv_sec) + timeDelta = curTime.tv_usec - sciThis->lastWheelMouseTime.tv_usec; + else if (curTime.tv_sec == sciThis->lastWheelMouseTime.tv_sec + 1) + timeDelta = 1000000 + (curTime.tv_usec - sciThis->lastWheelMouseTime.tv_usec); + if ((event->direction == sciThis->lastWheelMouseDirection) && (timeDelta < 250000)) { + if (sciThis->wheelMouseIntensity < 12) + sciThis->wheelMouseIntensity++; + cLineScroll = sciThis->wheelMouseIntensity; + } else { + cLineScroll = sciThis->linesPerScroll; + if (cLineScroll == 0) + cLineScroll = 4; + sciThis->wheelMouseIntensity = cLineScroll; + } +#endif + if (event->direction == GDK_SCROLL_UP || event->direction == GDK_SCROLL_LEFT) { + cLineScroll *= -1; + } + g_get_current_time(&sciThis->lastWheelMouseTime); + sciThis->lastWheelMouseDirection = event->direction; + + // Note: Unpatched versions of win32gtk don't set the 'state' value so + // only regular scrolling is supported there. Also, unpatched win32gtk + // issues spurious button 2 mouse events during wheeling, which can cause + // problems (a patch for both was submitted by archaeopteryx.com on 13Jun2001) + + // Data zoom not supported + if (event->state & GDK_SHIFT_MASK) { + return FALSE; + } + + // Horizontal scrolling + if (event->direction == GDK_SCROLL_LEFT || event->direction == GDK_SCROLL_RIGHT) { + sciThis->HorizontalScrollTo(sciThis->xOffset + cLineScroll); + + // Text font size zoom + } else if (event->state & GDK_CONTROL_MASK) { + if (cLineScroll < 0) { + sciThis->KeyCommand(SCI_ZOOMIN); + } else { + sciThis->KeyCommand(SCI_ZOOMOUT); + } + + // Regular scrolling + } else { + sciThis->ScrollTo(sciThis->topLine + cLineScroll); + } + return TRUE; +} +#endif + +gint ScintillaGTK::Motion(GtkWidget *widget, GdkEventMotion *event) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + //Platform::DebugPrintf("Motion %x %d\n",sciThis,event->time); + if (event->window != widget->window) + return FALSE; + int x = 0; + int y = 0; + GdkModifierType state; + if (event->is_hint) { + gdk_window_get_pointer(event->window, &x, &y, &state); + } else { + x = static_cast(event->x); + y = static_cast(event->y); + state = static_cast(event->state); + } + //Platform::DebugPrintf("Move %x %x %d %c %d %d\n", + // sciThis,event->window,event->time,event->is_hint? 'h' :'.', x, y); + Point pt(x, y); + sciThis->ButtonMove(pt); + return FALSE; +} + +// Map the keypad keys to their equivalent functions +static int KeyTranslate(int keyIn) { + switch (keyIn) { + case GDK_ISO_Left_Tab: + return SCK_TAB; + case GDK_KP_Down: + return SCK_DOWN; + case GDK_KP_Up: + return SCK_UP; + case GDK_KP_Left: + return SCK_LEFT; + case GDK_KP_Right: + return SCK_RIGHT; + case GDK_KP_Home: + return SCK_HOME; + case GDK_KP_End: + return SCK_END; + case GDK_KP_Page_Up: + return SCK_PRIOR; + case GDK_KP_Page_Down: + return SCK_NEXT; + case GDK_KP_Delete: + return SCK_DELETE; + case GDK_KP_Insert: + return SCK_INSERT; + case GDK_KP_Enter: + return SCK_RETURN; + + case GDK_Down: + return SCK_DOWN; + case GDK_Up: + return SCK_UP; + case GDK_Left: + return SCK_LEFT; + case GDK_Right: + return SCK_RIGHT; + case GDK_Home: + return SCK_HOME; + case GDK_End: + return SCK_END; + case GDK_Page_Up: + return SCK_PRIOR; + case GDK_Page_Down: + return SCK_NEXT; + case GDK_Delete: + return SCK_DELETE; + case GDK_Insert: + return SCK_INSERT; + case GDK_Escape: + return SCK_ESCAPE; + case GDK_BackSpace: + return SCK_BACK; + case GDK_Tab: + return SCK_TAB; + case GDK_Return: + return SCK_RETURN; + case GDK_KP_Add: + return SCK_ADD; + case GDK_KP_Subtract: + return SCK_SUBTRACT; + case GDK_KP_Divide: + return SCK_DIVIDE; + case GDK_Super_L: + return SCK_WIN; + case GDK_Super_R: + return SCK_RWIN; + case GDK_Menu: + return SCK_MENU; + default: + return keyIn; + } +} + +gboolean ScintillaGTK::KeyThis(GdkEventKey *event) { + //fprintf(stderr, "SC-key: %d %x [%s]\n", + // event->keyval, event->state, (event->length > 0) ? event->string : "empty"); +#if GTK_MAJOR_VERSION >= 2 + if (gtk_im_context_filter_keypress(im_context, event)) { + return 1; + } +#endif + if (!event->keyval) { + return true; + } + + bool shift = (event->state & GDK_SHIFT_MASK) != 0; + bool ctrl = (event->state & GDK_CONTROL_MASK) != 0; + bool alt = (event->state & GDK_MOD1_MASK) != 0; + guint key = event->keyval; + if (ctrl && (key < 128)) + key = toupper(key); + else if (!ctrl && (key >= GDK_KP_Multiply && key <= GDK_KP_9)) + key &= 0x7F; + // Hack for keys over 256 and below command keys but makes Hungarian work. + // This will have to change for Unicode + else if (key >= 0xFE00) + key = KeyTranslate(key); +#if GTK_MAJOR_VERSION < 2 + else if (!IsUnicodeMode() && (key >= 0x100) && (key < 0x1000)) + key &= 0xff; +#endif + + bool consumed = false; + bool added = KeyDown(key, shift, ctrl, alt, &consumed) != 0; + if (!consumed) + consumed = added; + //fprintf(stderr, "SK-key: %d %x %x\n",event->keyval, event->state, consumed); + if (event->keyval == 0xffffff && event->length > 0) { + ClearSelection(); + if (pdoc->InsertCString(CurrentPosition(), event->string)) { + MovePositionTo(CurrentPosition() + event->length); + } + } + return consumed; +} + +gboolean ScintillaGTK::KeyPress(GtkWidget *widget, GdkEventKey *event) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + return sciThis->KeyThis(event); +} + +gboolean ScintillaGTK::KeyRelease(GtkWidget *, GdkEventKey * /*event*/) { + //Platform::DebugPrintf("SC-keyrel: %d %x %3s\n",event->keyval, event->state, event->string); + return FALSE; +} + +#if GTK_MAJOR_VERSION >= 2 +gboolean ScintillaGTK::ExposePreedit(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis) { + return sciThis->ExposePreeditThis(widget, ose); +} + +gboolean ScintillaGTK::ExposePreeditThis(GtkWidget *widget, GdkEventExpose *ose) { + gchar *str; + gint cursor_pos; + PangoAttrList *attrs; + + gtk_im_context_get_preedit_string(im_context, &str, &attrs, &cursor_pos); + PangoLayout *layout = gtk_widget_create_pango_layout(PWidget(wText), str); + pango_layout_set_attributes(layout, attrs); + + GdkGC *gc = gdk_gc_new(widget->window); + GdkColor color[2] = { {0, 0x0000, 0x0000, 0x0000}, + {0, 0xffff, 0xffff, 0xffff}}; + gdk_color_alloc(gdk_colormap_get_system(), color); + gdk_color_alloc(gdk_colormap_get_system(), color + 1); + + gdk_gc_set_foreground(gc, color + 1); + gdk_draw_rectangle(widget->window, gc, TRUE, ose->area.x, ose->area.y, + ose->area.width, ose->area.height); + + gdk_gc_set_foreground(gc, color); + gdk_gc_set_background(gc, color + 1); + gdk_draw_layout(widget->window, gc, 0, 0, layout); + + gdk_gc_unref(gc); + g_free(str); + pango_attr_list_unref(attrs); + g_object_unref(layout); + return TRUE; +} + +void ScintillaGTK::Commit(GtkIMContext *, char *str, ScintillaGTK *sciThis) { + sciThis->CommitThis(str); +} + +void ScintillaGTK::CommitThis(char *utfVal) { + //~ fprintf(stderr, "Commit '%s'\n", utfVal); + if (IsUnicodeMode()) { + AddCharUTF(utfVal,strlen(utfVal)); + } else { + const char *source = CharacterSetID(); + if (*source) { + Converter conv(source, "UTF-8", true); + if (conv) { + char localeVal[4]="\0\0\0"; + char *pin = utfVal; + size_t inLeft = strlen(utfVal); + char *pout = localeVal; + size_t outLeft = sizeof(localeVal); + size_t conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); + if (conversions != ((size_t)(-1))) { + *pout = '\0'; + for (int i=0; localeVal[i]; i++) { + AddChar(localeVal[i]); + } + } else { + fprintf(stderr, "Conversion failed '%s'\n", utfVal); + } + } + } + } +} + +void ScintillaGTK::PreeditChanged(GtkIMContext *, ScintillaGTK *sciThis) { + sciThis->PreeditChangedThis(); +} + +void ScintillaGTK::PreeditChangedThis() { + gchar *str; + PangoAttrList *attrs; + gint cursor_pos; + gtk_im_context_get_preedit_string(im_context, &str, &attrs, &cursor_pos); + if (strlen(str) > 0){ + PangoLayout *layout = gtk_widget_create_pango_layout(PWidget(wText), str); + pango_layout_set_attributes(layout, attrs); + + gint w, h; + pango_layout_get_pixel_size(layout, &w, &h); + g_object_unref(layout); + + gint x, y; + gdk_window_get_origin((PWidget(wText))->window, &x, &y); + + Point pt = LocationFromPosition(currentPos); + if (pt.x < 0) + pt.x = 0; + if (pt.y < 0) + pt.y = 0; + + gtk_window_move(GTK_WINDOW(PWidget(wPreedit)), x+pt.x, y+pt.y); + gtk_window_resize(GTK_WINDOW(PWidget(wPreedit)), w, h); + gtk_widget_show(PWidget(wPreedit)); + gtk_widget_queue_draw_area(PWidget(wPreeditDraw), 0, 0, w, h); + } else { + gtk_widget_hide(PWidget(wPreedit)); + } + g_free(str); + pango_attr_list_unref(attrs); +} +#endif + +gint ScintillaGTK::StyleSetText(GtkWidget *widget, GtkStyle *, void*) { + if (widget->window != NULL) + gdk_window_set_back_pixmap(widget->window, NULL, FALSE); + return FALSE; +} + +gint ScintillaGTK::RealizeText(GtkWidget *widget, void*) { + if (widget->window != NULL) + gdk_window_set_back_pixmap(widget->window, NULL, FALSE); + return FALSE; +} + +#if GLIB_MAJOR_VERSION < 2 +void ScintillaGTK::Destroy(GtkObject *object) +#else +void ScintillaGTK::Destroy(GObject *object) +#endif +{ + ScintillaObject *scio = reinterpret_cast(object); + // This avoids a double destruction + if (!scio->pscin) + return; + ScintillaGTK *sciThis = reinterpret_cast(scio->pscin); + //Platform::DebugPrintf("Destroying %x %x\n", sciThis, object); + sciThis->Finalise(); + +#if GLIB_MAJOR_VERSION < 2 + if (GTK_OBJECT_CLASS(parent_class)->destroy) + (* GTK_OBJECT_CLASS(parent_class)->destroy)(object); +#else + // IS ANYTHING NEEDED ? +#endif + + delete sciThis; + scio->pscin = 0; +} + +static void DrawChild(GtkWidget *widget, GdkRectangle *area) { + GdkRectangle areaIntersect; + if (widget && + GTK_WIDGET_DRAWABLE(widget) && + gtk_widget_intersect(widget, area, &areaIntersect)) { + gtk_widget_draw(widget, &areaIntersect); + } +} + +void ScintillaGTK::Draw(GtkWidget *widget, GdkRectangle *area) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + //Platform::DebugPrintf("Draw %p %0d,%0d %0d,%0d\n", widget, area->x, area->y, area->width, area->height); + PRectangle rcPaint(area->x, area->y, area->x + area->width, area->y + area->height); + sciThis->SyncPaint(rcPaint); + if (GTK_WIDGET_DRAWABLE(PWidget(sciThis->wMain))) { + DrawChild(PWidget(sciThis->scrollbarh), area); + DrawChild(PWidget(sciThis->scrollbarv), area); + } + +#ifdef INTERNATIONAL_INPUT + Point pt = sciThis->LocationFromPosition(sciThis->currentPos); + pt.y += sciThis->vs.lineHeight - 2; + if (pt.x < 0) pt.x = 0; + if (pt.y < 0) pt.y = 0; + CursorMoved(widget, pt.x, pt.y, sciThis); +#endif +} + +gint ScintillaGTK::ExposeTextThis(GtkWidget * /*widget*/, GdkEventExpose *ose) { + paintState = painting; + + rcPaint.left = ose->area.x; + rcPaint.top = ose->area.y; + rcPaint.right = ose->area.x + ose->area.width; + rcPaint.bottom = ose->area.y + ose->area.height; + + PLATFORM_ASSERT(rgnUpdate == NULL); +#if GTK_MAJOR_VERSION >= 2 + rgnUpdate = gdk_region_copy(ose->region); +#endif + PRectangle rcClient = GetClientRectangle(); + paintingAllText = rcPaint.Contains(rcClient); + Surface *surfaceWindow = Surface::Allocate(); + if (surfaceWindow) { + surfaceWindow->Init(PWidget(wText)->window, PWidget(wText)); + Paint(surfaceWindow, rcPaint); + surfaceWindow->Release(); + delete surfaceWindow; + } + if (paintState == paintAbandoned) { + // Painting area was insufficient to cover new styling or brace highlight positions + FullPaint(); + } + paintState = notPainting; + + if (rgnUpdate) { + gdk_region_destroy(rgnUpdate); + } + rgnUpdate = 0; + + return FALSE; +} + +gint ScintillaGTK::ExposeText(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis) { + return sciThis->ExposeTextThis(widget, ose); +} + +gint ScintillaGTK::ExposeMain(GtkWidget *widget, GdkEventExpose *ose) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + //Platform::DebugPrintf("Expose Main %0d,%0d %0d,%0d\n", + //ose->area.x, ose->area.y, ose->area.width, ose->area.height); + return sciThis->Expose(widget, ose); +} + +gint ScintillaGTK::Expose(GtkWidget *, GdkEventExpose *ose) { + //fprintf(stderr, "Expose %0d,%0d %0d,%0d\n", + //ose->area.x, ose->area.y, ose->area.width, ose->area.height); + +#if GTK_MAJOR_VERSION < 2 + + paintState = painting; + + rcPaint.left = ose->area.x; + rcPaint.top = ose->area.y; + rcPaint.right = ose->area.x + ose->area.width; + rcPaint.bottom = ose->area.y + ose->area.height; + + PRectangle rcClient = GetClientRectangle(); + paintingAllText = rcPaint.Contains(rcClient); + Surface *surfaceWindow = Surface::Allocate(); + if (surfaceWindow) { + surfaceWindow->Init(PWidget(wMain)->window, PWidget(wMain)); + + // Fill the corner between the scrollbars + if (verticalScrollBarVisible) { + if (horizontalScrollBarVisible && (wrapState == eWrapNone)) { + PRectangle rcCorner = wMain.GetClientPosition(); + rcCorner.left = rcCorner.right - scrollBarWidth + 1; + rcCorner.top = rcCorner.bottom - scrollBarHeight + 1; + //fprintf(stderr, "Corner %0d,%0d %0d,%0d\n", + //rcCorner.left, rcCorner.top, rcCorner.right, rcCorner.bottom); + surfaceWindow->FillRectangle(rcCorner, + vs.styles[STYLE_LINENUMBER].back.allocated); + } + } + + //Paint(surfaceWindow, rcPaint); + surfaceWindow->Release(); + delete surfaceWindow; + } + if (paintState == paintAbandoned) { + // Painting area was insufficient to cover new styling or brace highlight positions + FullPaint(); + } + paintState = notPainting; + +#else + // For GTK+ 2, the text is painted in ExposeText + gtk_container_propagate_expose( + GTK_CONTAINER(PWidget(wMain)), PWidget(scrollbarh), ose); + gtk_container_propagate_expose( + GTK_CONTAINER(PWidget(wMain)), PWidget(scrollbarv), ose); +#endif + + return FALSE; +} + +void ScintillaGTK::ScrollSignal(GtkAdjustment *adj, ScintillaGTK *sciThis) { + sciThis->ScrollTo(static_cast(adj->value), false); +} + +void ScintillaGTK::ScrollHSignal(GtkAdjustment *adj, ScintillaGTK *sciThis) { + sciThis->HorizontalScrollTo(static_cast(adj->value * 2)); +} + +void ScintillaGTK::SelectionReceived(GtkWidget *widget, + GtkSelectionData *selection_data, guint) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + //Platform::DebugPrintf("Selection received\n"); + sciThis->ReceivedSelection(selection_data); +} + +void ScintillaGTK::SelectionGet(GtkWidget *widget, + GtkSelectionData *selection_data, guint info, guint) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + //Platform::DebugPrintf("Selection get\n"); + if (selection_data->selection == GDK_SELECTION_PRIMARY) { + if (sciThis->primary.s == NULL) { + sciThis->CopySelectionRange(&sciThis->primary); + } + sciThis->GetSelection(selection_data, info, &sciThis->primary); + } +#ifndef USE_GTK_CLIPBOARD + else { + sciThis->GetSelection(selection_data, info, &sciThis->copyText); + } +#endif +} + +gint ScintillaGTK::SelectionClear(GtkWidget *widget, GdkEventSelection *selection_event) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + //Platform::DebugPrintf("Selection clear\n"); + sciThis->UnclaimSelection(selection_event); + return gtk_selection_clear(widget, selection_event); +} + +#if GTK_MAJOR_VERSION < 2 +gint ScintillaGTK::SelectionNotify(GtkWidget *widget, GdkEventSelection *selection_event) { + //Platform::DebugPrintf("Selection notify\n"); + return gtk_selection_notify(widget, selection_event); +} +#endif + +void ScintillaGTK::DragBegin(GtkWidget *, GdkDragContext *) { + //Platform::DebugPrintf("DragBegin\n"); +} + +gboolean ScintillaGTK::DragMotion(GtkWidget *widget, GdkDragContext *context, + gint x, gint y, guint dragtime) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + Point npt(x, y); + sciThis->inDragDrop = true; + sciThis->SetDragPosition(sciThis->PositionFromLocation(npt)); + GdkDragAction preferredAction = context->suggested_action; + if (context->actions == static_cast + (GDK_ACTION_COPY | GDK_ACTION_MOVE)) { + preferredAction = GDK_ACTION_MOVE; + } + gdk_drag_status(context, preferredAction, dragtime); + return FALSE; +} + +void ScintillaGTK::DragLeave(GtkWidget *widget, GdkDragContext * /*context*/, guint) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + sciThis->SetDragPosition(invalidPosition); + //Platform::DebugPrintf("DragLeave %x\n", sciThis); +} + +void ScintillaGTK::DragEnd(GtkWidget *widget, GdkDragContext * /*context*/) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + // If drag did not result in drop here or elsewhere + if (!sciThis->dragWasDropped) + sciThis->SetEmptySelection(sciThis->posDrag); + sciThis->SetDragPosition(invalidPosition); + //Platform::DebugPrintf("DragEnd %x %d\n", sciThis, sciThis->dragWasDropped); +} + +gboolean ScintillaGTK::Drop(GtkWidget *widget, GdkDragContext * /*context*/, + gint, gint, guint) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + //Platform::DebugPrintf("Drop %x\n", sciThis); + sciThis->SetDragPosition(invalidPosition); + return FALSE; +} + +void ScintillaGTK::DragDataReceived(GtkWidget *widget, GdkDragContext * /*context*/, + gint, gint, GtkSelectionData *selection_data, guint /*info*/, guint) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + sciThis->ReceivedDrop(selection_data); + sciThis->SetDragPosition(invalidPosition); +} + +void ScintillaGTK::DragDataGet(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, guint) { + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + sciThis->dragWasDropped = true; + if (sciThis->currentPos != sciThis->anchor) { + sciThis->GetSelection(selection_data, info, &sciThis->drag); + } + if (context->action == GDK_ACTION_MOVE) { + int selStart = sciThis->SelectionStart(); + int selEnd = sciThis->SelectionEnd(); + if (sciThis->posDrop > selStart) { + if (sciThis->posDrop > selEnd) + sciThis->posDrop = sciThis->posDrop - (selEnd - selStart); + else + sciThis->posDrop = selStart; + sciThis->posDrop = sciThis->pdoc->ClampPositionIntoDocument(sciThis->posDrop); + } + sciThis->ClearSelection(); + } + sciThis->SetDragPosition(invalidPosition); +} + +int ScintillaGTK::TimeOut(ScintillaGTK *sciThis) { + sciThis->Tick(); + return 1; +} + +int ScintillaGTK::IdleCallback(ScintillaGTK *sciThis) { + // Idler will be automatically stoped, if there is nothing + // to do while idle. + bool ret = sciThis->Idle(); + if (ret == false) { + // FIXME: This will remove the idler from GTK, we don't want to + // remove it as it is removed automatically when this function + // returns false (although, it should be harmless). + sciThis->SetIdle(false); + } + return ret; +} + +void ScintillaGTK::PopUpCB(ScintillaGTK *sciThis, guint action, GtkWidget *) { + if (action) { + sciThis->Command(action); + } +} + +gint ScintillaGTK::PressCT(GtkWidget *widget, GdkEventButton *event, ScintillaGTK *sciThis) { + if (event->window != widget->window) + return FALSE; + if (event->type != GDK_BUTTON_PRESS) + return FALSE; + Point pt; + pt.x = int(event->x); + pt.y = int(event->y); + sciThis->ct.MouseClick(pt); + sciThis->CallTipClick(); +#if GTK_MAJOR_VERSION >= 2 + return TRUE; +#else + return FALSE; +#endif +} + +gint ScintillaGTK::ExposeCT(GtkWidget *widget, GdkEventExpose * /*ose*/, CallTip *ctip) { + Surface *surfaceWindow = Surface::Allocate(); + if (surfaceWindow) { + surfaceWindow->Init(widget->window, widget); + ctip->PaintCT(surfaceWindow); + surfaceWindow->Release(); + delete surfaceWindow; + } + return TRUE; +} + +sptr_t ScintillaGTK::DirectFunction( + ScintillaGTK *sciThis, unsigned int iMessage, uptr_t wParam, sptr_t lParam) { + return sciThis->WndProc(iMessage, wParam, lParam); +} + +sptr_t scintilla_send_message(ScintillaObject *sci, unsigned int iMessage, uptr_t wParam, sptr_t lParam) { + ScintillaGTK *psci = reinterpret_cast(sci->pscin); + return psci->WndProc(iMessage, wParam, lParam); +} + +static void scintilla_class_init(ScintillaClass *klass); +static void scintilla_init(ScintillaObject *sci); + +extern void Platform_Initialise(); +extern void Platform_Finalise(); + +#if GLIB_MAJOR_VERSION < 2 +GtkType scintilla_get_type() { + static GtkType scintilla_type = 0; + + if (!scintilla_type) { + Platform_Initialise(); + static GtkTypeInfo scintilla_info = { + "Scintilla", + sizeof (ScintillaObject), + sizeof (ScintillaClass), + (GtkClassInitFunc) scintilla_class_init, + (GtkObjectInitFunc) scintilla_init, + (gpointer) NULL, + (gpointer) NULL, + 0 + }; + + scintilla_type = gtk_type_unique(gtk_container_get_type(), &scintilla_info); + } + + return scintilla_type; +} +#else +GType scintilla_get_type() { + static GType scintilla_type = 0; + + if (!scintilla_type) { + scintilla_type = g_type_from_name("Scintilla"); + if (!scintilla_type) { + static GTypeInfo scintilla_info = { + (guint16) sizeof (ScintillaClass), + NULL, //(GBaseInitFunc) + NULL, //(GBaseFinalizeFunc) + (GClassInitFunc) scintilla_class_init, + NULL, //(GClassFinalizeFunc) + NULL, //gconstpointer data + (guint16) sizeof (ScintillaObject), + 0, //n_preallocs + (GInstanceInitFunc) scintilla_init, + NULL //(GTypeValueTable*) + }; + + scintilla_type = g_type_register_static( + GTK_TYPE_CONTAINER, "Scintilla", &scintilla_info, (GTypeFlags) 0); + } + } + + return scintilla_type; +} +#endif + +void ScintillaGTK::ClassInit(OBJECT_CLASS* object_class, GtkWidgetClass *widget_class, GtkContainerClass *container_class) { +#if GLIB_MAJOR_VERSION >= 2 + Platform_Initialise(); +#endif + atomClipboard = gdk_atom_intern("CLIPBOARD", FALSE); + atomUTF8 = gdk_atom_intern("UTF8_STRING", FALSE); + atomString = GDK_SELECTION_TYPE_STRING; + atomUriList = gdk_atom_intern("text/uri-list", FALSE); + atomDROPFILES_DND = gdk_atom_intern("DROPFILES_DND", FALSE); + + // Define default signal handlers for the class: Could move more + // of the signal handlers here (those that currently attached to wDraw + // in Initialise() may require coordinate translation?) + +#if GLIB_MAJOR_VERSION < 2 + object_class->destroy = Destroy; +#else + object_class->finalize = Destroy; +#endif + widget_class->size_request = SizeRequest; + widget_class->size_allocate = SizeAllocate; + widget_class->expose_event = ExposeMain; +#if GTK_MAJOR_VERSION < 2 + widget_class->draw = Draw; +#endif + widget_class->motion_notify_event = Motion; + widget_class->button_press_event = Press; + widget_class->button_release_event = MouseRelease; +#if PLAT_GTK_WIN32 || (GTK_MAJOR_VERSION >= 2) + widget_class->scroll_event = ScrollEvent; +#endif + widget_class->key_press_event = KeyPress; + widget_class->key_release_event = KeyRelease; + widget_class->focus_in_event = FocusIn; + widget_class->focus_out_event = FocusOut; + widget_class->selection_received = SelectionReceived; + widget_class->selection_get = SelectionGet; + widget_class->selection_clear_event = SelectionClear; +#if GTK_MAJOR_VERSION < 2 + widget_class->selection_notify_event = SelectionNotify; +#endif + + widget_class->drag_data_received = DragDataReceived; + widget_class->drag_motion = DragMotion; + widget_class->drag_leave = DragLeave; + widget_class->drag_end = DragEnd; + widget_class->drag_drop = Drop; + widget_class->drag_data_get = DragDataGet; + + widget_class->realize = Realize; + widget_class->unrealize = UnRealize; + widget_class->map = Map; + widget_class->unmap = UnMap; + + container_class->forall = MainForAll; +} + +#if GLIB_MAJOR_VERSION < 2 +#define GTK_CLASS_TYPE(c) (c->type) +#define SIG_MARSHAL gtk_marshal_NONE__INT_POINTER +#define MARSHAL_ARGUMENTS GTK_TYPE_INT, GTK_TYPE_POINTER +#else +#define SIG_MARSHAL scintilla_marshal_NONE__INT_POINTER +#define MARSHAL_ARGUMENTS G_TYPE_INT, G_TYPE_POINTER +#endif + +static void scintilla_class_init(ScintillaClass *klass) { + OBJECT_CLASS *object_class = (OBJECT_CLASS*) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass*) klass; + GtkContainerClass *container_class = (GtkContainerClass*) klass; + +#if GLIB_MAJOR_VERSION < 2 + parent_class = (GtkWidgetClass*) gtk_type_class(gtk_container_get_type()); + + scintilla_signals[COMMAND_SIGNAL] = gtk_signal_new( + "command", + GTK_RUN_LAST, + GTK_CLASS_TYPE(object_class), + GTK_SIGNAL_OFFSET(ScintillaClass, command), + SIG_MARSHAL, + GTK_TYPE_NONE, + 2, MARSHAL_ARGUMENTS); + + scintilla_signals[NOTIFY_SIGNAL] = gtk_signal_new( + SCINTILLA_NOTIFY, + GTK_RUN_LAST, + GTK_CLASS_TYPE(object_class), + GTK_SIGNAL_OFFSET(ScintillaClass, notify), + SIG_MARSHAL, + GTK_TYPE_NONE, + 2, MARSHAL_ARGUMENTS); + gtk_object_class_add_signals(object_class, + reinterpret_cast(scintilla_signals), LAST_SIGNAL); +#else + GSignalFlags sigflags = GSignalFlags(G_SIGNAL_ACTION | G_SIGNAL_RUN_LAST); + scintilla_signals[COMMAND_SIGNAL] = g_signal_new( + "command", + G_TYPE_FROM_CLASS(object_class), + sigflags, + G_STRUCT_OFFSET(ScintillaClass, command), + NULL, //(GSignalAccumulator) + NULL, //(gpointer) + SIG_MARSHAL, + G_TYPE_NONE, + 2, MARSHAL_ARGUMENTS); + + scintilla_signals[NOTIFY_SIGNAL] = g_signal_new( + SCINTILLA_NOTIFY, + G_TYPE_FROM_CLASS(object_class), + sigflags, + G_STRUCT_OFFSET(ScintillaClass, notify), + NULL, + NULL, + SIG_MARSHAL, + G_TYPE_NONE, + 2, MARSHAL_ARGUMENTS); +#endif + klass->command = NULL; + klass->notify = NULL; + + ScintillaGTK::ClassInit(object_class, widget_class, container_class); +} + +static void scintilla_init(ScintillaObject *sci) { + GTK_WIDGET_SET_FLAGS(sci, GTK_CAN_FOCUS); + sci->pscin = new ScintillaGTK(sci); +} + +GtkWidget* scintilla_new() { +#if GLIB_MAJOR_VERSION < 2 + return GTK_WIDGET(gtk_type_new(scintilla_get_type())); +#else + return GTK_WIDGET(g_object_new(scintilla_get_type(), NULL)); +#endif +} + +void scintilla_set_id(ScintillaObject *sci, uptr_t id) { + ScintillaGTK *psci = reinterpret_cast(sci->pscin); + psci->ctrlID = id; +} + +void scintilla_release_resources(void) { + Platform_Finalise(); +} diff --git a/scintilla/gtk/deps.mak b/scintilla/gtk/deps.mak new file mode 100644 index 00000000..288404d5 --- /dev/null +++ b/scintilla/gtk/deps.mak @@ -0,0 +1,191 @@ +PlatGTK.o: PlatGTK.cxx Converter.h \ + ../include/Platform.h \ + ../include/Scintilla.h ../include/ScintillaWidget.h \ + ../src/UniConversion.h ../src/XPM.h +ScintillaGTK.o: ScintillaGTK.cxx Converter.h \ + ../include/Platform.h \ + ../include/Scintilla.h ../include/ScintillaWidget.h \ + ../include/SciLexer.h ../include/PropSet.h ../include/SString.h \ + ../include/Accessor.h ../include/KeyWords.h ../src/ContractionState.h \ + ../src/SVector.h ../src/CellBuffer.h ../src/CallTip.h ../src/KeyMap.h \ + ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h ../src/Style.h \ + ../src/AutoComplete.h ../src/ViewStyle.h ../src/CharClassify.h ../src/Document.h \ + ../src/Editor.h ../src/ScintillaBase.h ../src/UniConversion.h \ + ../src/ExternalLexer.h +AutoComplete.o: ../src/AutoComplete.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../src/AutoComplete.h +CallTip.o: ../src/CallTip.cxx ../include/Platform.h \ + ../include/Scintilla.h ../src/CallTip.h +CellBuffer.o: ../src/CellBuffer.cxx ../include/Platform.h \ + ../include/Scintilla.h ../src/SVector.h ../src/CellBuffer.h +CharClassify.o: ../src/CharClassify.cxx ../src/CharClassify.h +ContractionState.o: ../src/ContractionState.cxx ../include/Platform.h \ + ../src/ContractionState.h +DocumentAccessor.o: ../src/DocumentAccessor.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../src/SVector.h \ + ../include/Accessor.h ../src/DocumentAccessor.h ../src/CellBuffer.h \ + ../include/Scintilla.h ../src/CharClassify.h ../src/Document.h +Document.o: ../src/Document.cxx ../include/Platform.h \ + ../include/Scintilla.h ../src/SVector.h ../src/CellBuffer.h \ + ../src/CharClassify.h ../src/Document.h ../src/RESearch.h +Editor.o: ../src/Editor.cxx ../include/Platform.h ../include/Scintilla.h \ + ../src/ContractionState.h ../src/SVector.h ../src/CellBuffer.h \ + ../src/KeyMap.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ + ../src/Style.h ../src/ViewStyle.h ../src/CharClassify.h ../src/Document.h ../src/Editor.h +ExternalLexer.o: ../src/ExternalLexer.cxx ../include/Platform.h \ + ../include/SciLexer.h ../include/PropSet.h ../include/SString.h \ + ../include/Accessor.h ../src/DocumentAccessor.h ../include/KeyWords.h \ + ../src/ExternalLexer.h +Indicator.o: ../src/Indicator.cxx ../include/Platform.h \ + ../include/Scintilla.h ../src/Indicator.h +KeyMap.o: ../src/KeyMap.cxx ../include/Platform.h ../include/Scintilla.h \ + ../src/KeyMap.h +KeyWords.o: ../src/KeyWords.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexAda.o: ../src/LexAda.cxx ../include/Platform.h ../include/Accessor.h \ + ../src/StyleContext.h ../include/PropSet.h ../include/SString.h \ + ../include/KeyWords.h ../include/SciLexer.h +LexAsm.o: ../src/LexAsm.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexAVE.o: ../src/LexAVE.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexBaan.o: ../src/LexBaan.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexBullant.o: ../src/LexBullant.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexCLW.o: ../src/LexCLW.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexConf.o: ../src/LexConf.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../include/KeyWords.h \ + ../include/Scintilla.h ../include/SciLexer.h +LexCPP.o: ../src/LexCPP.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexCrontab.o: ../src/LexCrontab.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexCSS.o: ../src/LexCSS.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexEiffel.o: ../src/LexEiffel.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../src/StyleContext.h ../include/KeyWords.h ../include/Scintilla.h \ + ../include/SciLexer.h +LexErlang.o: ../src/LexErlang.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../src/StyleContext.h ../include/KeyWords.h ../include/Scintilla.h \ + ../include/SciLexer.h +LexEScript.o: ../src/LexEScript.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../src/StyleContext.h ../include/KeyWords.h ../include/Scintilla.h \ + ../include/SciLexer.h +LexForth.o: ../src/LexForth.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexFortran.o: ../src/LexFortran.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../src/StyleContext.h ../include/KeyWords.h ../include/Scintilla.h \ + ../include/SciLexer.h +LexHTML.o: ../src/LexHTML.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexLisp.o: ../src/LexLisp.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../include/KeyWords.h \ + ../include/Scintilla.h ../include/SciLexer.h +LexLout.o: ../src/LexLout.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexLua.o: ../src/LexLua.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexMatlab.o: ../src/LexMatlab.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../src/StyleContext.h ../include/KeyWords.h ../include/Scintilla.h \ + ../include/SciLexer.h +LexMetapost.o: ../src/LexMetapost.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h \ + ../src/StyleContext.h +LexMMIXAL.o: ../src/LexMMIXAL.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../src/StyleContext.h ../include/KeyWords.h ../include/Scintilla.h \ + ../include/SciLexer.h +LexMPT.o: ../src/LexMPT.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../include/KeyWords.h \ + ../include/Scintilla.h ../include/SciLexer.h +LexNsis.o: ../src/LexNsis.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../include/KeyWords.h \ + ../include/Scintilla.h ../include/SciLexer.h +LexOthers.o: ../src/LexOthers.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexPascal.o: ../src/LexPascal.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h \ + ../src/StyleContext.h +LexPB.o: ../src/LexPB.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexPerl.o: ../src/LexPerl.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../include/KeyWords.h \ + ../include/Scintilla.h ../include/SciLexer.h +LexPOV.o: ../src/LexPOV.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexPS.o: ../src/LexPS.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexPython.o: ../src/LexPython.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../src/StyleContext.h ../include/KeyWords.h ../include/Scintilla.h \ + ../include/SciLexer.h +LexRuby.o: ../src/LexRuby.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../include/KeyWords.h \ + ../include/Scintilla.h ../include/SciLexer.h +LexScriptol.o: ../src/LexScriptol.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexSQL.o: ../src/LexSQL.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../include/KeyWords.h \ + ../include/Scintilla.h ../include/SciLexer.h +LexTeX.o: ../src/LexTeX.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../include/KeyWords.h \ + ../include/Scintilla.h ../include/SciLexer.h ../src/StyleContext.h +LexVB.o: ../src/LexVB.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LexYAML.o: ../src/LexYAML.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h ../include/Accessor.h ../src/StyleContext.h \ + ../include/KeyWords.h ../include/Scintilla.h ../include/SciLexer.h +LineMarker.o: ../src/LineMarker.cxx ../include/Platform.h \ + ../include/Scintilla.h ../src/XPM.h ../src/LineMarker.h +PropSet.o: ../src/PropSet.cxx ../include/Platform.h ../include/PropSet.h \ + ../include/SString.h +RESearch.o: ../src/RESearch.cxx ../src/RESearch.h +ScintillaBase.o: ../src/ScintillaBase.cxx ../include/Platform.h \ + ../include/Scintilla.h ../include/PropSet.h ../include/SString.h \ + ../include/SciLexer.h ../include/Accessor.h ../src/DocumentAccessor.h \ + ../include/KeyWords.h ../src/ContractionState.h ../src/SVector.h \ + ../src/CellBuffer.h ../src/CallTip.h ../src/KeyMap.h ../src/Indicator.h \ + ../src/XPM.h ../src/LineMarker.h ../src/Style.h ../src/ViewStyle.h \ + ../src/AutoComplete.h ../src/CharClassify.h ../src/Document.h ../src/Editor.h \ + ../src/ScintillaBase.h +StyleContext.o: ../src/StyleContext.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../src/StyleContext.h +Style.o: ../src/Style.cxx ../include/Platform.h ../include/Scintilla.h \ + ../src/Style.h +UniConversion.o: ../src/UniConversion.cxx ../src/UniConversion.h +ViewStyle.o: ../src/ViewStyle.cxx ../include/Platform.h \ + ../include/Scintilla.h ../src/Indicator.h ../src/XPM.h \ + ../src/LineMarker.h ../src/Style.h ../src/ViewStyle.h +WindowAccessor.o: ../src/WindowAccessor.cxx ../include/Platform.h \ + ../include/PropSet.h ../include/SString.h ../include/Accessor.h \ + ../include/WindowAccessor.h ../include/Scintilla.h +XPM.o: ../src/XPM.cxx ../include/Platform.h ../src/XPM.h diff --git a/scintilla/gtk/makefile b/scintilla/gtk/makefile new file mode 100644 index 00000000..e48a8470 --- /dev/null +++ b/scintilla/gtk/makefile @@ -0,0 +1,95 @@ +# Make file for Scintilla on Linux or compatible OS +# Copyright 1998-2001 by Neil Hodgson +# The License.txt file describes the conditions under which this software may be distributed. +# This makefile assumes GCC 3.1 is used and changes will be needed to use other compilers. +# GNU make does not like \r\n line endings so should be saved to CVS in binary form. +# Builds for GTK+ 2 if available else GTK+ 1. +# To force GTK+ 2 build, define GTK2 on the make command line. +# To force GTK+ 1 build, define GTK1 on the make command line. + +.SUFFIXES: .cxx .c .o .h .a +CC = g++ +CCOMP = gcc +AR = ar +RANLIB = touch + +ifeq ($(shell uname),Darwin) +RANLIB = ranlib +endif + +COMPLIB=../bin/scintilla.a + +vpath %.h ../src ../include +vpath %.cxx ../src + +INCLUDEDIRS=-I ../include -I ../src +CXXBASEFLAGS=-Wall -Wno-missing-braces -Wno-char-subscripts -pedantic -Os -DGTK -DSCI_LEXER $(INCLUDEDIRS) + +ifdef NOTHREADS +THREADFLAGS=-DG_THREADS_IMPL_NONE +else +THREADFLAGS= +endif + +ifdef DEBUG +CXXFLAGS=-DDEBUG -g $(CXXBASEFLAGS) $(THREADFLAGS) +else +CXXFLAGS=-DNDEBUG -Os $(CXXBASEFLAGS) $(THREADFLAGS) +endif + +# If explicit setting of GTK1 or GTK2 then use that else look for +# pkg-config which is an OK indication that GTK2 is available +ifdef GTK2 +CONFIGFLAGS=pkg-config --cflags gtk+-2.0 +MARSHALLER=scintilla-marshal.o +else +ifdef GTK1 +CONFIGFLAGS=gtk-config --cflags +else +ifneq (,$(findstring /,$(shell whereis pkg-config))) +CONFIGFLAGS=pkg-config --cflags gtk+-2.0 +MARSHALLER=scintilla-marshal.o +else +CONFIGFLAGS=gtk-config --cflags +endif +endif +endif + +.cxx.o: + $(CC) `$(CONFIGFLAGS)` $(CXXFLAGS) -c $< +.c.o: + $(CCOMP) `$(CONFIGFLAGS)` $(CXXFLAGS) -w -c $< + +#++Autogenerated -- run src/LexGen.py to regenerate +#**LEXOBJS=\\\n\(\*.o \) +LEXOBJS=\ +LexAda.o LexAPDL.o LexAsm.o LexAsn1.o LexAU3.o LexAVE.o LexBaan.o LexBash.o \ +LexBasic.o LexBullant.o LexCaml.o LexCLW.o LexCmake.o LexConf.o LexCPP.o \ +LexCrontab.o LexCsound.o LexCSS.o LexD.o LexEiffel.o LexErlang.o LexEScript.o \ +LexFlagship.o LexForth.o LexFortran.o LexGui4Cli.o LexHaskell.o LexHTML.o \ +LexInno.o LexKix.o LexLisp.o LexLout.o LexLua.o LexMatlab.o LexMetapost.o \ +LexMMIXAL.o LexMPT.o LexMSSQL.o LexNsis.o LexOpal.o LexOthers.o LexPascal.o \ +LexPB.o LexPerl.o LexPOV.o LexPS.o LexPython.o LexRebol.o LexRuby.o \ +LexScriptol.o LexSmalltalk.o LexSpecman.o LexSpice.o LexSQL.o LexTADS3.o \ +LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.o +#--Autogenerated -- end of automatically generated section + +all: $(COMPLIB) + +clean: + rm -f *.o $(COMPLIB) + +deps: + $(CC) -MM `$(CONFIGFLAGS)` $(CXXFLAGS) *.cxx ../src/*.cxx >deps.mak + +$(COMPLIB): DocumentAccessor.o WindowAccessor.o KeyWords.o StyleContext.o \ + CharClassify.o Document.o CallTip.o \ + ScintillaBase.o ContractionState.o Editor.o ExternalLexer.o PropSet.o PlatGTK.o \ + KeyMap.o LineMarker.o ScintillaGTK.o CellBuffer.o ViewStyle.o \ + RESearch.o Style.o Indicator.o AutoComplete.o UniConversion.o XPM.o \ + $(MARSHALLER) $(LEXOBJS) + $(AR) rc $@ $^ + $(RANLIB) $@ + +# Automatically generate header dependencies with "make deps" +include deps.mak diff --git a/scintilla/gtk/scintilla-marshal.c b/scintilla/gtk/scintilla-marshal.c new file mode 100644 index 00000000..02da1843 --- /dev/null +++ b/scintilla/gtk/scintilla-marshal.c @@ -0,0 +1,86 @@ + +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_int +#define g_marshal_value_peek_flags(v) (v)->data[0].v_uint +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* NONE:INT,POINTER (scintilla-marshal.list:1) */ +void +scintilla_marshal_VOID__INT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__INT_POINTER) (gpointer data1, + gint arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__INT_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__INT_POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_int (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); +} + diff --git a/scintilla/gtk/scintilla-marshal.h b/scintilla/gtk/scintilla-marshal.h new file mode 100644 index 00000000..28e94ccc --- /dev/null +++ b/scintilla/gtk/scintilla-marshal.h @@ -0,0 +1,21 @@ + +#ifndef __scintilla_marshal_MARSHAL_H__ +#define __scintilla_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* NONE:INT,POINTER (scintilla-marshal.list:1) */ +extern void scintilla_marshal_VOID__INT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +#define scintilla_marshal_NONE__INT_POINTER scintilla_marshal_VOID__INT_POINTER + +G_END_DECLS + +#endif /* __scintilla_marshal_MARSHAL_H__ */ + diff --git a/scintilla/gtk/scintilla-marshal.list b/scintilla/gtk/scintilla-marshal.list new file mode 100644 index 00000000..b3cd2aa8 --- /dev/null +++ b/scintilla/gtk/scintilla-marshal.list @@ -0,0 +1 @@ +NONE:INT,POINTER diff --git a/scintilla/gtk/scintilla.mak b/scintilla/gtk/scintilla.mak new file mode 100644 index 00000000..f8f45425 --- /dev/null +++ b/scintilla/gtk/scintilla.mak @@ -0,0 +1,497 @@ +# Make file for GTK+/Scintilla on Windows Visual C++ +# Borland C++ does not work +# Copyright 1998-2000 by Neil Hodgson +# The License.txt file describes the conditions under which this software may be distributed. +# This makefile is for using Visual C++ with nmake or Borland C++ with make depending on +# the setting of the VENDOR macro. If no VENDOR is defined n the command line then +# the tool used is automatically detected. +# Usage for Microsoft: +# nmake -f scintilla.mak +# Usage for Borland: +# make -f scintilla.mak +# For debug versions define DEBUG on the command line, for Borland: +# make DEBUG=1 -f scintilla.mak +# The main makefile uses mingw32 gcc and may be more current than this file. + +.SUFFIXES: .cxx + +DIR_O=. +DIR_BIN=..\bin + +COMPONENT=$(DIR_BIN)\Scintilla.dll +LEXCOMPONENT=$(DIR_BIN)\SciLexer.dll +STATIC_LIB=$(DIR_BIN)\Scintilla-static.lib + +!IFNDEF VENDOR +!IFDEF _NMAKE_VER +#Microsoft nmake so make default VENDOR MICROSOFT +VENDOR=MICROSOFT +!ELSE +VENDOR=BORLAND +!ENDIF +!ENDIF + +!IF "$(VENDOR)"=="MICROSOFT" + +CC=cl +RC=rc +LD=link + +!IFDEF USE_GTK2 +MARSHALLER=$(DIR_O)\scintilla-marshal.obj +GTK_TOP= ../../gtk2 +TOP = $(GTK_TOP) +!INCLUDE $(TOP)/glib/build/win32/make.msc + +GTK_INCLUDES= -I$(GTK_TOP)/gtk+ \ + -I$(GTK_TOP)/gtk+/gdk \ + -I$(GTK_TOP)/glib/glib \ + -I$(GTK_TOP)/glib/gmodule \ + -I$(GTK_TOP)/glib \ + -I$(GTK_TOP)\libiconv\include \ + -I$(GTK_TOP)\pango \ + -I$(GTK_TOP)\atk +ALL_GTK_LIBS=$(GTK2_LIBS) $(GLIB_LIBS) $(LIBICONV_LIBS) +!ELSE +GTK_TOP= ../../win32gtk +GTK_INCLUDES= -I $(GTK_TOP)/gtk+ -I $(GTK_TOP)/gtk+/gdk -I $(GTK_TOP)/glib -I $(GTK_TOP)/glib/gmodule +ALL_GTK_LIBS=$(GTK_TOP)/gtk+/gtk/gtk-1.3.lib \ + $(GTK_TOP)/gtk+/gdk/gdk-1.3.lib \ + $(GTK_TOP)/glib/gmodule/gmodule-1.3.lib \ + $(GTK_TOP)/glib/glib-1.3.lib +!ENDIF + +INCLUDEDIRS=-I ../include -I ../src $(GTK_INCLUDES) +CXXFLAGS=/TP /W4 -DGTK -D_CRT_SECURE_NO_DEPRECATE=1 +CFLAGS=/W4 -DGTK +# For something scary:/Wp64 +CXXDEBUG=/Zi /Od /MDd -DDEBUG +CXXNDEBUG=/Ox /MD -DNDEBUG +NAMEFLAG=-Fo +LDFLAGS=/opt:nowin98 +LDDEBUG=/DEBUG +#LIBS=KERNEL32.lib USER32.lib GDI32.lib IMM32.lib OLE32.LIB +LIBS=$(ALL_GTK_LIBS) + +!IFDEF QUIET +CC=@$(CC) +CXXDEBUG=$(CXXDEBUG) /nologo +CXXNDEBUG=$(CXXNDEBUG) /nologo +LDFLAGS=$(LDFLAGS) /nologo +!ENDIF + +!ELSE +# BORLAND +!error Borland C++ not supported + +CC=bcc32 +RC=brcc32 -r +LD=ilink32 + +INCLUDEDIRS=-I../include -I../src +CXXFLAGS = -v +CXXFLAGS=-P -tWM -w -w-prc -w-inl -RT- -x- +# Above turns off warnings for clarfying parentheses and inlines with for not expanded +CXXDEBUG=-v -DDEBUG +CXXNDEBUG=-O1 -DNDEBUG +NAMEFLAG=-o +LDFLAGS= +LDDEBUG=-v +LIBS=import32 cw32mt + +!ENDIF + +!IFDEF DEBUG +CXXFLAGS=$(CXXFLAGS) $(CXXDEBUG) +LDFLAGS=$(LDDEBUG) $(LDFLAGS) +!ELSE +CXXFLAGS=$(CXXFLAGS) $(CXXNDEBUG) +!ENDIF + +#ALL: $(STATIC_LIB) $(COMPONENT) $(LEXCOMPONENT) $(DIR_O)\ScintillaGTKS.obj $(DIR_O)\WindowAccessor.obj +ALL: $(STATIC_LIB) $(DIR_O)\ScintillaGTKS.obj $(DIR_O)\WindowAccessor.obj + +clean:: + -del /q $(DIR_O)\*.obj $(DIR_O)\*.pdb $(COMPONENT) $(LEXCOMPONENT) $(DIR_O)\*.res $(DIR_BIN)\*.map + +SOBJS=\ + $(DIR_O)\AutoComplete.obj \ + $(DIR_O)\CallTip.obj \ + $(DIR_O)\CellBuffer.obj \ + $(DIR_O)\ContractionState.obj \ + $(DIR_O)\CharClassify.obj \ + $(DIR_O)\Document.obj \ + $(DIR_O)\Editor.obj \ + $(DIR_O)\ExternalLexer.obj \ + $(DIR_O)\Indicator.obj \ + $(DIR_O)\KeyMap.obj \ + $(DIR_O)\LineMarker.obj \ + $(DIR_O)\PlatGTK.obj \ + $(MARSHALLER) \ + $(DIR_O)\RESearch.obj \ + $(DIR_O)\PropSet.obj \ + $(DIR_O)\ScintillaBase.obj \ + $(DIR_O)\ScintillaGTK.obj \ + $(DIR_O)\Style.obj \ + $(DIR_O)\UniConversion.obj \ + $(DIR_O)\ViewStyle.obj \ + $(DIR_O)\XPM.obj + +#++Autogenerated -- run src/LexGen.py to regenerate +#**LEXOBJS=\\\n\(\t$(DIR_O)\\\*.obj \\\n\) +LEXOBJS=\ + $(DIR_O)\LexAda.obj \ + $(DIR_O)\LexAPDL.obj \ + $(DIR_O)\LexAsm.obj \ + $(DIR_O)\LexAsn1.obj \ + $(DIR_O)\LexAU3.obj \ + $(DIR_O)\LexAVE.obj \ + $(DIR_O)\LexBaan.obj \ + $(DIR_O)\LexBash.obj \ + $(DIR_O)\LexBasic.obj \ + $(DIR_O)\LexBullant.obj \ + $(DIR_O)\LexCaml.obj \ + $(DIR_O)\LexCLW.obj \ + $(DIR_O)\LexCmake.obj \ + $(DIR_O)\LexConf.obj \ + $(DIR_O)\LexCPP.obj \ + $(DIR_O)\LexCrontab.obj \ + $(DIR_O)\LexCsound.obj \ + $(DIR_O)\LexCSS.obj \ + $(DIR_O)\LexD.obj \ + $(DIR_O)\LexEiffel.obj \ + $(DIR_O)\LexErlang.obj \ + $(DIR_O)\LexEScript.obj \ + $(DIR_O)\LexFlagship.obj \ + $(DIR_O)\LexForth.obj \ + $(DIR_O)\LexFortran.obj \ + $(DIR_O)\LexGui4Cli.obj \ + $(DIR_O)\LexHaskell.obj \ + $(DIR_O)\LexHTML.obj \ + $(DIR_O)\LexInno.obj \ + $(DIR_O)\LexKix.obj \ + $(DIR_O)\LexLisp.obj \ + $(DIR_O)\LexLout.obj \ + $(DIR_O)\LexLua.obj \ + $(DIR_O)\LexMatlab.obj \ + $(DIR_O)\LexMetapost.obj \ + $(DIR_O)\LexMMIXAL.obj \ + $(DIR_O)\LexMPT.obj \ + $(DIR_O)\LexMSSQL.obj \ + $(DIR_O)\LexNsis.obj \ + $(DIR_O)\LexOpal.obj \ + $(DIR_O)\LexOthers.obj \ + $(DIR_O)\LexPascal.obj \ + $(DIR_O)\LexPB.obj \ + $(DIR_O)\LexPerl.obj \ + $(DIR_O)\LexPOV.obj \ + $(DIR_O)\LexPS.obj \ + $(DIR_O)\LexPython.obj \ + $(DIR_O)\LexRebol.obj \ + $(DIR_O)\LexRuby.obj \ + $(DIR_O)\LexScriptol.obj \ + $(DIR_O)\LexSmalltalk.obj \ + $(DIR_O)\LexSpecman.obj \ + $(DIR_O)\LexSpice.obj \ + $(DIR_O)\LexSQL.obj \ + $(DIR_O)\LexTADS3.obj \ + $(DIR_O)\LexTCL.obj \ + $(DIR_O)\LexTeX.obj \ + $(DIR_O)\LexVB.obj \ + $(DIR_O)\LexVerilog.obj \ + $(DIR_O)\LexVHDL.obj \ + $(DIR_O)\LexYAML.obj \ + +#--Autogenerated -- end of automatically generated section + +LOBJS=\ + $(DIR_O)\AutoComplete.obj \ + $(DIR_O)\CallTip.obj \ + $(DIR_O)\CellBuffer.obj \ + $(DIR_O)\ContractionState.obj \ + $(DIR_O)\CharClassify.obj \ + $(DIR_O)\Document.obj \ + $(DIR_O)\DocumentAccessor.obj \ + $(DIR_O)\Editor.obj \ + $(DIR_O)\Indicator.obj \ + $(DIR_O)\KeyMap.obj \ + $(DIR_O)\KeyWords.obj \ + $(DIR_O)\LineMarker.obj \ + $(DIR_O)\PlatGTK.obj \ + $(MARSHALLER) \ + $(DIR_O)\RESearch.obj \ + $(DIR_O)\PropSet.obj \ + $(DIR_O)\ScintillaBaseL.obj \ + $(DIR_O)\ScintillaGTKL.obj \ + $(DIR_O)\Style.obj \ + $(DIR_O)\StyleContext.obj \ + $(DIR_O)\UniConversion.obj \ + $(DIR_O)\ViewStyle.obj \ + $(DIR_O)\XPM.obj \ + $(DIR_O)\ExternalLexer.obj \ + $(LEXOBJS) + +!IF "$(VENDOR)"=="MICROSOFT" + +$(STATIC_LIB): $(LOBJS) #$(DIR_O)\ScintRes.res + lib.exe /OUT:$@ $(LOBJS) $(LIBS) + +$(COMPONENT): $(SOBJS) #$(DIR_O)\ScintRes.res + $(LD) $(LDFLAGS) /DLL /OUT:$@ $(SOBJS) $(LIBS) + +$(DIR_O)\ScintRes.res : ScintRes.rc + $(RC) /fo$@ $(*B).rc + +$(LEXCOMPONENT): $(LOBJS) #$(DIR_O)\ScintRes.res + $(LD) $(LDFLAGS) /DLL /OUT:$@ $(LOBJS) $(LIBS) + +!ELSE + +$(STATIC_LIB): $(LOBJS) #$(DIR_O)\ScintRes.res + $(LD) /OUT:$@ $(LOBJS) $(LIBS) + +$(COMPONENT): $(SOBJS) ScintRes.res + $(LD) $(LDFLAGS) -Tpd -c c0d32 $(SOBJS), $@, , $(LIBS), , ScintRes.res + +$(DIR_O)\ScintRes.res: ScintRes.rc + $(RC) $*.rc + +$(LEXCOMPONENT): $(LOBJS) + $(LD) $(LDFLAGS) -Tpd -c c0d32 $(LOBJS), $@, , $(LIBS), , ScintRes.res + +!ENDIF + +# Define how to build all the objects and what they depend on + +# Most of the source is in ..\src with a couple in this directory +{..\src}.cxx{$(DIR_O)}.obj: + $(CC) $(INCLUDEDIRS) $(CXXFLAGS) -c $(NAMEFLAG)$@ $< +{.}.cxx{$(DIR_O)}.obj: + $(CC) $(INCLUDEDIRS) $(CXXFLAGS) -c $(NAMEFLAG)$@ $< +{.}.c{$(DIR_O)}.obj: + $(CC) $(INCLUDEDIRS) $(CFLAGS) -c $(NAMEFLAG)$@ $< + +# Some source files are compiled into more than one object because of different conditional compilation +$(DIR_O)\ScintillaBaseL.obj: ..\src\ScintillaBase.cxx + $(CC) $(INCLUDEDIRS) $(CXXFLAGS) -DSCI_LEXER -c $(NAMEFLAG)$@ ..\src\ScintillaBase.cxx + +$(DIR_O)\ScintillaGTKL.obj: ScintillaGTK.cxx + $(CC) $(INCLUDEDIRS) $(CXXFLAGS) -DSCI_LEXER -c $(NAMEFLAG)$@ ScintillaGTK.cxx + +$(DIR_O)\ScintillaGTKS.obj: ScintillaGTK.cxx + $(CC) $(INCLUDEDIRS) $(CXXFLAGS) -DSTATIC_BUILD -c $(NAMEFLAG)$@ ScintillaGTK.cxx + +# Dependencies + +# All lexers depend on this set of headers +LEX_HEADERS=..\include\Platform.h ..\include\PropSet.h \ + ..\include\SString.h ..\include\Accessor.h ..\include\KeyWords.h \ + ..\include\Scintilla.h ..\include\SciLexer.h ..\src\StyleContext.h + +$(DIR_O)\AutoComplete.obj: ..\src\AutoComplete.cxx ..\include\Platform.h ..\src\AutoComplete.h + +$(DIR_O)\CallTip.obj: ..\src\CallTip.cxx ..\include\Platform.h ..\src\CallTip.h + +$(DIR_O)\CellBuffer.obj: ..\src\CellBuffer.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\CellBuffer.h + +$(DIR_O)\CharClassify.obj: ..\src\CharClassify.cxx ..\src\CharClassify.h + +$(DIR_O)\ContractionState.obj: ..\src\ContractionState.cxx ..\include\Platform.h ..\src\ContractionState.h + +$(DIR_O)\Document.obj: ..\src\Document.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\RESearch.h \ + ..\src\CellBuffer.h ..\src\CharClassify.h ..\src\Document.h + +$(DIR_O)\DocumentAccessor.obj: ..\src\DocumentAccessor.cxx ..\include\Platform.h ..\include\PropSet.h \ + ..\include\Accessor.h ..\src\DocumentAccessor.h ..\src\CharClassify.h ..\include\Scintilla.h + +$(DIR_O)\Editor.obj: ..\src\Editor.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\ContractionState.h \ + ..\src\CellBuffer.h ..\src\KeyMap.h ..\src\Indicator.h ..\src\LineMarker.h ..\src\Style.h ..\src\ViewStyle.h \ + ..\src\CharClassify.h ..\src\Document.h ..\src\Editor.h + +$(DIR_O)\ExternalLexer.obj: ..\src\ExternalLexer.cxx ..\include\Platform.h ..\include\Scintilla.h ..\include\SciLexer.h \ + ..\include\PropSet.h ..\include\Accessor.h ..\src\DocumentAccessor.h ..\include\Keywords.h ..\src\ExternalLexer.h + +$(DIR_O)\Indicator.obj: ..\src\Indicator.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\Indicator.h + +$(DIR_O)\KeyMap.obj: ..\src\KeyMap.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\KeyMap.h + +$(DIR_O)\KeyWords.obj: ..\src\KeyWords.cxx ..\include\Platform.h ..\include\PropSet.h ..\include\Accessor.h ..\include\KeyWords.h \ + ..\include\Scintilla.h ..\include\SciLexer.h + +#++Autogenerated -- run src/LexGen.py to regenerate +#**\n\($(DIR_O)\\\*.obj: ..\\src\\\*.cxx $(LEX_HEADERS)\n\n\) + +$(DIR_O)\LexAda.obj: ..\src\LexAda.cxx $(LEX_HEADERS) + +$(DIR_O)\LexAPDL.obj: ..\src\LexAPDL.cxx $(LEX_HEADERS) + +$(DIR_O)\LexAsm.obj: ..\src\LexAsm.cxx $(LEX_HEADERS) + +$(DIR_O)\LexAsn1.obj: ..\src\LexAsn1.cxx $(LEX_HEADERS) + +$(DIR_O)\LexAU3.obj: ..\src\LexAU3.cxx $(LEX_HEADERS) + +$(DIR_O)\LexAVE.obj: ..\src\LexAVE.cxx $(LEX_HEADERS) + +$(DIR_O)\LexBaan.obj: ..\src\LexBaan.cxx $(LEX_HEADERS) + +$(DIR_O)\LexBash.obj: ..\src\LexBash.cxx $(LEX_HEADERS) + +$(DIR_O)\LexBasic.obj: ..\src\LexBasic.cxx $(LEX_HEADERS) + +$(DIR_O)\LexBullant.obj: ..\src\LexBullant.cxx $(LEX_HEADERS) + +$(DIR_O)\LexCaml.obj: ..\src\LexCaml.cxx $(LEX_HEADERS) + +$(DIR_O)\LexCLW.obj: ..\src\LexCLW.cxx $(LEX_HEADERS) + +$(DIR_O)\LexCmake.obj: ..\src\LexCmake.cxx $(LEX_HEADERS) + +$(DIR_O)\LexConf.obj: ..\src\LexConf.cxx $(LEX_HEADERS) + +$(DIR_O)\LexCPP.obj: ..\src\LexCPP.cxx $(LEX_HEADERS) + +$(DIR_O)\LexCrontab.obj: ..\src\LexCrontab.cxx $(LEX_HEADERS) + +$(DIR_O)\LexCsound.obj: ..\src\LexCsound.cxx $(LEX_HEADERS) + +$(DIR_O)\LexCSS.obj: ..\src\LexCSS.cxx $(LEX_HEADERS) + +$(DIR_O)\LexD.obj: ..\src\LexD.cxx $(LEX_HEADERS) + +$(DIR_O)\LexEiffel.obj: ..\src\LexEiffel.cxx $(LEX_HEADERS) + +$(DIR_O)\LexErlang.obj: ..\src\LexErlang.cxx $(LEX_HEADERS) + +$(DIR_O)\LexEScript.obj: ..\src\LexEScript.cxx $(LEX_HEADERS) + +$(DIR_O)\LexFlagship.obj: ..\src\LexFlagship.cxx $(LEX_HEADERS) + +$(DIR_O)\LexForth.obj: ..\src\LexForth.cxx $(LEX_HEADERS) + +$(DIR_O)\LexFortran.obj: ..\src\LexFortran.cxx $(LEX_HEADERS) + +$(DIR_O)\LexGui4Cli.obj: ..\src\LexGui4Cli.cxx $(LEX_HEADERS) + +$(DIR_O)\LexHaskell.obj: ..\src\LexHaskell.cxx $(LEX_HEADERS) + +$(DIR_O)\LexHTML.obj: ..\src\LexHTML.cxx $(LEX_HEADERS) + +$(DIR_O)\LexInno.obj: ..\src\LexInno.cxx $(LEX_HEADERS) + +$(DIR_O)\LexKix.obj: ..\src\LexKix.cxx $(LEX_HEADERS) + +$(DIR_O)\LexLisp.obj: ..\src\LexLisp.cxx $(LEX_HEADERS) + +$(DIR_O)\LexLout.obj: ..\src\LexLout.cxx $(LEX_HEADERS) + +$(DIR_O)\LexLua.obj: ..\src\LexLua.cxx $(LEX_HEADERS) + +$(DIR_O)\LexMatlab.obj: ..\src\LexMatlab.cxx $(LEX_HEADERS) + +$(DIR_O)\LexMetapost.obj: ..\src\LexMetapost.cxx $(LEX_HEADERS) + +$(DIR_O)\LexMMIXAL.obj: ..\src\LexMMIXAL.cxx $(LEX_HEADERS) + +$(DIR_O)\LexMPT.obj: ..\src\LexMPT.cxx $(LEX_HEADERS) + +$(DIR_O)\LexMSSQL.obj: ..\src\LexMSSQL.cxx $(LEX_HEADERS) + +$(DIR_O)\LexNsis.obj: ..\src\LexNsis.cxx $(LEX_HEADERS) + +$(DIR_O)\LexOpal.obj: ..\src\LexOpal.cxx $(LEX_HEADERS) + +$(DIR_O)\LexOthers.obj: ..\src\LexOthers.cxx $(LEX_HEADERS) + +$(DIR_O)\LexPascal.obj: ..\src\LexPascal.cxx $(LEX_HEADERS) + +$(DIR_O)\LexPB.obj: ..\src\LexPB.cxx $(LEX_HEADERS) + +$(DIR_O)\LexPerl.obj: ..\src\LexPerl.cxx $(LEX_HEADERS) + +$(DIR_O)\LexPOV.obj: ..\src\LexPOV.cxx $(LEX_HEADERS) + +$(DIR_O)\LexPS.obj: ..\src\LexPS.cxx $(LEX_HEADERS) + +$(DIR_O)\LexPython.obj: ..\src\LexPython.cxx $(LEX_HEADERS) + +$(DIR_O)\LexRebol.obj: ..\src\LexRebol.cxx $(LEX_HEADERS) + +$(DIR_O)\LexRuby.obj: ..\src\LexRuby.cxx $(LEX_HEADERS) + +$(DIR_O)\LexScriptol.obj: ..\src\LexScriptol.cxx $(LEX_HEADERS) + +$(DIR_O)\LexSmalltalk.obj: ..\src\LexSmalltalk.cxx $(LEX_HEADERS) + +$(DIR_O)\LexSpecman.obj: ..\src\LexSpecman.cxx $(LEX_HEADERS) + +$(DIR_O)\LexSpice.obj: ..\src\LexSpice.cxx $(LEX_HEADERS) + +$(DIR_O)\LexSQL.obj: ..\src\LexSQL.cxx $(LEX_HEADERS) + +$(DIR_O)\LexTADS3.obj: ..\src\LexTADS3.cxx $(LEX_HEADERS) + +$(DIR_O)\LexTCL.obj: ..\src\LexTCL.cxx $(LEX_HEADERS) + +$(DIR_O)\LexTeX.obj: ..\src\LexTeX.cxx $(LEX_HEADERS) + +$(DIR_O)\LexVB.obj: ..\src\LexVB.cxx $(LEX_HEADERS) + +$(DIR_O)\LexVerilog.obj: ..\src\LexVerilog.cxx $(LEX_HEADERS) + +$(DIR_O)\LexVHDL.obj: ..\src\LexVHDL.cxx $(LEX_HEADERS) + +$(DIR_O)\LexYAML.obj: ..\src\LexYAML.cxx $(LEX_HEADERS) + + +#--Autogenerated -- end of automatically generated section + +$(DIR_O)\LineMarker.obj: ..\src\LineMarker.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\LineMarker.h + +$(DIR_O)\PlatWin.obj: PlatWin.cxx ..\include\Platform.h PlatformRes.h ..\src\UniConversion.h + +$(DIR_O)\PropSet.obj: ..\src\PropSet.cxx ..\include\Platform.h ..\include\PropSet.h \ + ..\include\SString.h + +$(DIR_O)\RESearch.obj: ..\src\RESearch.cxx ..\src\RESearch.h + +$(DIR_O)\ScintillaBase.obj: ..\src\ScintillaBase.cxx ..\include\Platform.h ..\include\Scintilla.h \ + ..\src\ContractionState.h ..\src\CellBuffer.h ..\src\CallTip.h ..\src\KeyMap.h ..\src\Indicator.h \ + ..\src\LineMarker.h ..\src\Style.h ..\src\ViewStyle.h ..\src\AutoComplete.h ..\src\CharClassify.h \ + ..\src\Document.h ..\src\Editor.h ..\src\ScintillaBase.h + +$(DIR_O)\ScintillaBaseL.obj: ..\src\ScintillaBase.cxx ..\include\Platform.h ..\include\Scintilla.h ..\include\SciLexer.h \ + ..\src\ContractionState.h ..\src\CellBuffer.h ..\src\CallTip.h ..\src\KeyMap.h ..\src\Indicator.h \ + ..\src\LineMarker.h ..\src\Style.h ..\src\AutoComplete.h ..\src\ViewStyle.h ..\src\CharClassify.h \ + ..\src\Document.h ..\src\Editor.h \ + ..\src\ScintillaBase.h ..\include\PropSet.h ..\include\Accessor.h ..\src\DocumentAccessor.h ..\include\KeyWords.h + +$(DIR_O)\ScintillaWin.obj: ScintillaWin.cxx ..\include\Platform.h ..\include\Scintilla.h \ + ..\src\ContractionState.h ..\src\CellBuffer.h ..\src\CallTip.h ..\src\KeyMap.h ..\src\Indicator.h \ + ..\src\LineMarker.h ..\src\Style.h ..\src\AutoComplete.h ..\src\ViewStyle.h ..\src\CharClassify.h \ + ..\src\Document.h ..\src\Editor.h \ + ..\src\ScintillaBase.h ..\src\UniConversion.h + +$(DIR_O)\ScintillaWinL.obj: ScintillaWin.cxx ..\include\Platform.h ..\include\Scintilla.h ..\include\SciLexer.h \ + ..\src\ContractionState.h ..\src\CellBuffer.h ..\src\CallTip.h ..\src\KeyMap.h ..\src\Indicator.h \ + ..\src\LineMarker.h ..\src\Style.h ..\src\AutoComplete.h ..\src\ViewStyle.h ..\src\CharClassify.h \ + ..\src\Document.h ..\src\Editor.h \ + ..\src\ScintillaBase.h ..\include\PropSet.h ..\include\Accessor.h ..\include\KeyWords.h ..\src\UniConversion.h + +$(DIR_O)\ScintillaWinS.obj: ScintillaWin.cxx ..\include\Platform.h ..\include\Scintilla.h \ + ..\src\ContractionState.h ..\src\CellBuffer.h ..\src\CallTip.h ..\src\KeyMap.h ..\src\Indicator.h \ + ..\src\LineMarker.h ..\src\Style.h ..\src\AutoComplete.h ..\src\ViewStyle.h ..\src\CharClassify.h \ + ..\src\Document.h ..\src\Editor.h \ + ..\src\ScintillaBase.h ..\src\UniConversion.h + +$(DIR_O)\Style.obj: ..\src\Style.cxx ..\include\Platform.h ..\src\Style.h + +$(DIR_O)\StyleContext.obj: ..\src\StyleContext.cxx ..\include\Platform.h ..\include\Accessor.h ..\include\PropSet.h ..\src\StyleContext.h + +$(DIR_O)\ViewStyle.obj: ..\src\ViewStyle.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\Indicator.h \ + ..\src\LineMarker.h ..\src\Style.h ..\src\ViewStyle.h + +$(DIR_O)\UniConversion.obj: ..\src\UniConversion.cxx ..\src\UniConversion.h + +$(DIR_O)\WindowAccessor.obj: ..\src\WindowAccessor.cxx ..\include\Platform.h ..\include\PropSet.h \ + ..\include\Accessor.h ..\include\WindowAccessor.h ..\include\Scintilla.h diff --git a/scintilla/include/Accessor.h b/scintilla/include/Accessor.h new file mode 100644 index 00000000..5364b9e3 --- /dev/null +++ b/scintilla/include/Accessor.h @@ -0,0 +1,78 @@ +// Scintilla source code edit control +/** @file Accessor.h + ** Rapid easy access to contents of a Scintilla. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +enum { wsSpace = 1, wsTab = 2, wsSpaceTab = 4, wsInconsistent=8}; + +class Accessor; + +typedef bool (*PFNIsCommentLeader)(Accessor &styler, int pos, int len); + +/** + * Interface to data in a Scintilla. + */ +class Accessor { +protected: + enum {extremePosition=0x7FFFFFFF}; + /** @a bufferSize is a trade off between time taken to copy the characters + * and retrieval overhead. + * @a slopSize positions the buffer before the desired position + * in case there is some backtracking. */ + enum {bufferSize=4000, slopSize=bufferSize/8}; + char buf[bufferSize+1]; + int startPos; + int endPos; + int codePage; + + virtual bool InternalIsLeadByte(char ch)=0; + virtual void Fill(int position)=0; + +public: + Accessor() : startPos(extremePosition), endPos(0), codePage(0) {} + virtual ~Accessor() {} + char operator[](int position) { + if (position < startPos || position >= endPos) { + Fill(position); + } + return buf[position - startPos]; + } + /** Safe version of operator[], returning a defined value for invalid position. */ + char SafeGetCharAt(int position, char chDefault=' ') { + if (position < startPos || position >= endPos) { + Fill(position); + if (position < startPos || position >= endPos) { + // Position is outside range of document + return chDefault; + } + } + return buf[position - startPos]; + } + bool IsLeadByte(char ch) { + return codePage && InternalIsLeadByte(ch); + } + void SetCodePage(int codePage_) { codePage = codePage_; } + + virtual bool Match(int pos, const char *s)=0; + virtual char StyleAt(int position)=0; + virtual int GetLine(int position)=0; + virtual int LineStart(int line)=0; + virtual int LevelAt(int line)=0; + virtual int Length()=0; + virtual void Flush()=0; + virtual int GetLineState(int line)=0; + virtual int SetLineState(int line, int state)=0; + virtual int GetPropertyInt(const char *key, int defaultValue=0)=0; + virtual char *GetProperties()=0; + + // Style setting + virtual void StartAt(unsigned int start, char chMask=31)=0; + virtual void SetFlags(char chFlags_, char chWhile_)=0; + virtual unsigned int GetStartSegment()=0; + virtual void StartSegment(unsigned int pos)=0; + virtual void ColourTo(unsigned int pos, int chAttr)=0; + virtual void SetLevel(int line, int level)=0; + virtual int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0)=0; +}; diff --git a/scintilla/include/Face.py b/scintilla/include/Face.py new file mode 100644 index 00000000..59ada3dc --- /dev/null +++ b/scintilla/include/Face.py @@ -0,0 +1,107 @@ +# Module for reading and parsing Scintilla.iface file +import string + +def sanitiseLine(line): + if line[-1:] == '\n': line = line[:-1] + if string.find(line, "##") != -1: + line = line[:string.find(line, "##")] + line = string.strip(line) + return line + +def decodeFunction(featureVal): + retType, rest = string.split(featureVal, " ", 1) + nameIdent, params = string.split(rest, "(") + name, value = string.split(nameIdent, "=") + params, rest = string.split(params, ")") + param1, param2 = string.split(params, ",")[0:2] + return retType, name, value, param1, param2 + +def decodeEvent(featureVal): + retType, rest = string.split(featureVal, " ", 1) + nameIdent, params = string.split(rest, "(") + name, value = string.split(nameIdent, "=") + return retType, name, value + +def decodeParam(p): + param = string.strip(p) + type = "" + name = "" + value = "" + if " " in param: + type, nv = string.split(param, " ") + if "=" in nv: + name, value = string.split(nv, "=") + else: + name = nv + return type, name, value + +class Face: + + def __init__(self): + self.order = [] + self.features = {} + self.values = {} + self.events = {} + + def ReadFromFile(self, name): + currentCategory = "" + currentComment = [] + currentCommentFinished = 0 + file = open(name) + for line in file.readlines(): + line = sanitiseLine(line) + if line: + if line[0] == "#": + if line[1] == " ": + if currentCommentFinished: + currentComment = [] + currentCommentFinished = 0 + currentComment.append(line[2:]) + else: + currentCommentFinished = 1 + featureType, featureVal = string.split(line, " ", 1) + if featureType in ["fun", "get", "set"]: + retType, name, value, param1, param2 = decodeFunction(featureVal) + p1 = decodeParam(param1) + p2 = decodeParam(param2) + self.features[name] = { + "FeatureType": featureType, + "ReturnType": retType, + "Value": value, + "Param1Type": p1[0], "Param1Name": p1[1], "Param1Value": p1[2], + "Param2Type": p2[0], "Param2Name": p2[1], "Param2Value": p2[2], + "Category": currentCategory, "Comment": currentComment + } + if self.values.has_key(value): + raise "Duplicate value " + value + " " + name + self.values[value] = 1 + self.order.append(name) + elif featureType == "evt": + retType, name, value = decodeEvent(featureVal) + self.features[name] = { + "FeatureType": featureType, + "ReturnType": retType, + "Value": value, + "Category": currentCategory, "Comment": currentComment + } + if self.events.has_key(value): + raise "Duplicate event " + value + " " + name + self.events[value] = 1 + self.order.append(name) + elif featureType == "cat": + currentCategory = featureVal + elif featureType == "val": + name, value = string.split(featureVal, "=", 1) + self.features[name] = { + "FeatureType": featureType, + "Category": currentCategory, + "Value": value } + self.order.append(name) + elif featureType == "enu" or featureType == "lex": + name, value = string.split(featureVal, "=", 1) + self.features[name] = { + "FeatureType": featureType, + "Category": currentCategory, + "Value": value } + self.order.append(name) + diff --git a/scintilla/include/HFacer.py b/scintilla/include/HFacer.py new file mode 100644 index 00000000..5639bcf7 --- /dev/null +++ b/scintilla/include/HFacer.py @@ -0,0 +1,76 @@ +# HFacer.py - regenerate the Scintilla.h and SciLexer.h files from the Scintilla.iface interface +# definition file. +# The header files are copied to a temporary file apart from the section between a //++Autogenerated +# comment and a //--Autogenerated comment which is generated by the printHFile and printLexHFile +# functions. After the temporary file is created, it is copied back to the original file name. + +import string +import sys +import os +import Face + +def Contains(s,sub): + return string.find(s, sub) != -1 + +def printLexHFile(f,out): + for name in f.order: + v = f.features[name] + if v["FeatureType"] in ["val"]: + if Contains(name, "SCE_") or Contains(name, "SCLEX_"): + out.write("#define " + name + " " + v["Value"] + "\n") + +def printHFile(f,out): + for name in f.order: + v = f.features[name] + if v["Category"] != "Deprecated": + if v["FeatureType"] in ["fun", "get", "set"]: + featureDefineName = "SCI_" + string.upper(name) + out.write("#define " + featureDefineName + " " + v["Value"] + "\n") + elif v["FeatureType"] in ["evt"]: + featureDefineName = "SCN_" + string.upper(name) + out.write("#define " + featureDefineName + " " + v["Value"] + "\n") + elif v["FeatureType"] in ["val"]: + if not (Contains(name, "SCE_") or Contains(name, "SCLEX_")): + out.write("#define " + name + " " + v["Value"] + "\n") + +def CopyWithInsertion(input, output, genfn, definition): + copying = 1 + for line in input.readlines(): + if copying: + output.write(line) + if Contains(line, "//++Autogenerated"): + copying = 0 + genfn(definition, output) + if Contains(line, "//--Autogenerated"): + copying = 1 + output.write(line) + +def contents(filename): + f = file(filename) + t = f.read() + f.close() + return t + +def Regenerate(filename, genfn, definition): + inText = contents(filename) + tempname = "HFacer.tmp" + out = open(tempname,"w") + hfile = open(filename) + CopyWithInsertion(hfile, out, genfn, definition) + out.close() + hfile.close() + outText = contents(tempname) + if inText == outText: + os.unlink(tempname) + else: + os.unlink(filename) + os.rename(tempname, filename) + +f = Face.Face() +try: + f.ReadFromFile("Scintilla.iface") + Regenerate("Scintilla.h", printHFile, f) + Regenerate("SciLexer.h", printLexHFile, f) + print "Maximum ID is", max(x for x in f.values if int(x) < 3000) +except: + raise diff --git a/scintilla/include/KeyWords.h b/scintilla/include/KeyWords.h new file mode 100644 index 00000000..2f173e0e --- /dev/null +++ b/scintilla/include/KeyWords.h @@ -0,0 +1,82 @@ +// Scintilla source code edit control +/** @file KeyWords.h + ** Colourise for particular languages. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +typedef void (*LexerFunction)(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler); + +/** + * A LexerModule is responsible for lexing and folding a particular language. + * The class maintains a list of LexerModules which can be searched to find a + * module appropriate to a particular language. + */ +class LexerModule { +protected: + const LexerModule *next; + int language; + LexerFunction fnLexer; + LexerFunction fnFolder; + const char * const * wordListDescriptions; + int styleBits; + + static const LexerModule *base; + static int nextLanguage; + +public: + const char *languageName; + LexerModule(int language_, + LexerFunction fnLexer_, + const char *languageName_=0, + LexerFunction fnFolder_=0, + const char * const wordListDescriptions_[] = NULL, + int styleBits_=5); + virtual ~LexerModule() { + } + int GetLanguage() const { return language; } + + // -1 is returned if no WordList information is available + int GetNumWordLists() const; + const char *GetWordListDescription(int index) const; + + int GetStyleBitsNeeded() const; + + virtual void Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const; + virtual void Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const; + static const LexerModule *Find(int language); + static const LexerModule *Find(const char *languageName); +}; + +/** + * Check if a character is a space. + * This is ASCII specific but is safe with chars >= 0x80. + */ +inline bool isspacechar(unsigned char ch) { + return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); +} + +inline bool iswordchar(char ch) { + return isascii(ch) && (isalnum(ch) || ch == '.' || ch == '_'); +} + +inline bool iswordstart(char ch) { + return isascii(ch) && (isalnum(ch) || ch == '_'); +} + +inline bool isoperator(char ch) { + if (isascii(ch) && isalnum(ch)) + return false; + // '.' left out as it is used to make up numbers + if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || + ch == '(' || ch == ')' || ch == '-' || ch == '+' || + ch == '=' || ch == '|' || ch == '{' || ch == '}' || + ch == '[' || ch == ']' || ch == ':' || ch == ';' || + ch == '<' || ch == '>' || ch == ',' || ch == '/' || + ch == '?' || ch == '!' || ch == '.' || ch == '~') + return true; + return false; +} diff --git a/scintilla/include/Platform.h b/scintilla/include/Platform.h new file mode 100644 index 00000000..cd412856 --- /dev/null +++ b/scintilla/include/Platform.h @@ -0,0 +1,526 @@ +// Scintilla source code edit control +/** @file Platform.h + ** Interface to platform facilities. Also includes some basic utilities. + ** Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef PLATFORM_H +#define PLATFORM_H + +// PLAT_GTK = GTK+ on Linux or Win32 +// PLAT_GTK_WIN32 is defined additionally when running PLAT_GTK under Win32 +// PLAT_WIN = Win32 API on Win32 OS +// PLAT_WX is wxWindows on any supported platform + +//*******************************************************// + +// TODO: add your specific platform header here: + +// Win32 example: +#include + +//*******************************************************// + +#define PLAT_GTK 0 +#define PLAT_GTK_WIN32 0 +#define PLAT_WIN 0 +#define PLAT_WX 0 +#define PLAT_FOX 0 + +#if defined(FOX) +#undef PLAT_FOX +#define PLAT_FOX 1 + +#elif defined(__WX__) +#undef PLAT_WX +#define PLAT_WX 1 + +#elif defined(GTK) +#undef PLAT_GTK +#define PLAT_GTK 1 + +#ifdef _MSC_VER +#undef PLAT_GTK_WIN32 +#define PLAT_GTK_WIN32 1 +#endif + +#else +#undef PLAT_WIN +#define PLAT_WIN 1 + +#endif + + +// Underlying the implementation of the platform classes are platform specific types. +// Sometimes these need to be passed around by client code so they are defined here + +typedef void *FontID; +typedef void *SurfaceID; +typedef void *WindowID; +typedef void *MenuID; +typedef void *TickerID; +typedef void *Function; +typedef void *IdlerID; + +/** + * A geometric point class. + * Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably. + */ +class Point { +public: + int x; + int y; + + explicit Point(int x_=0, int y_=0) : x(x_), y(y_) { + } + + // Other automatically defined methods (assignment, copy constructor, destructor) are fine + + static Point FromLong(long lpoint); +}; + +/** + * A geometric rectangle class. + * PRectangle is exactly the same as the Win32 RECT so can be used interchangeably. + * PRectangles contain their top and left sides, but not their right and bottom sides. + */ +class PRectangle { +public: + int left; + int top; + int right; + int bottom; + + PRectangle(int left_=0, int top_=0, int right_=0, int bottom_ = 0) : + left(left_), top(top_), right(right_), bottom(bottom_) { + } + + // Other automatically defined methods (assignment, copy constructor, destructor) are fine + + bool operator==(PRectangle &rc) { + return (rc.left == left) && (rc.right == right) && + (rc.top == top) && (rc.bottom == bottom); + } + bool Contains(Point pt) { + return (pt.x >= left) && (pt.x <= right) && + (pt.y >= top) && (pt.y <= bottom); + } + bool Contains(PRectangle rc) { + return (rc.left >= left) && (rc.right <= right) && + (rc.top >= top) && (rc.bottom <= bottom); + } + bool Intersects(PRectangle other) { + return (right > other.left) && (left < other.right) && + (bottom > other.top) && (top < other.bottom); + } + void Move(int xDelta, int yDelta) { + left += xDelta; + top += yDelta; + right += xDelta; + bottom += yDelta; + } + int Width() { return right - left; } + int Height() { return bottom - top; } +}; + +/** + * In some circumstances, including Win32 in paletted mode and GTK+, each colour + * must be allocated before use. The desired colours are held in the ColourDesired class, + * and after allocation the allocation entry is stored in the ColourAllocated class. In other + * circumstances, such as Win32 in true colour mode, the allocation process just copies + * the RGB values from the desired to the allocated class. + * As each desired colour requires allocation before it can be used, the ColourPair class + * holds both a ColourDesired and a ColourAllocated + * The Palette class is responsible for managing the palette of colours which contains a + * list of ColourPair objects and performs the allocation. + */ + +/** + * Holds a desired RGB colour. + */ +class ColourDesired { + long co; +public: + ColourDesired(long lcol=0) { + co = lcol; + } + + ColourDesired(unsigned int red, unsigned int green, unsigned int blue) { + Set(red, green, blue); + } + + bool operator==(const ColourDesired &other) const { + return co == other.co; + } + + void Set(long lcol) { + co = lcol; + } + + void Set(unsigned int red, unsigned int green, unsigned int blue) { + co = red | (green << 8) | (blue << 16); + } + + static inline unsigned int ValueOfHex(const char ch) { + if (ch >= '0' && ch <= '9') + return ch - '0'; + else if (ch >= 'A' && ch <= 'F') + return ch - 'A' + 10; + else if (ch >= 'a' && ch <= 'f') + return ch - 'a' + 10; + else + return 0; + } + + void Set(const char *val) { + if (*val == '#') { + val++; + } + unsigned int r = ValueOfHex(val[0]) * 16 + ValueOfHex(val[1]); + unsigned int g = ValueOfHex(val[2]) * 16 + ValueOfHex(val[3]); + unsigned int b = ValueOfHex(val[4]) * 16 + ValueOfHex(val[5]); + Set(r, g, b); + } + + long AsLong() const { + return co; + } + + unsigned int GetRed() { + return co & 0xff; + } + + unsigned int GetGreen() { + return (co >> 8) & 0xff; + } + + unsigned int GetBlue() { + return (co >> 16) & 0xff; + } +}; + +/** + * Holds an allocated RGB colour which may be an approximation to the desired colour. + */ +class ColourAllocated { + long coAllocated; + +public: + + ColourAllocated(long lcol=0) { + coAllocated = lcol; + } + + void Set(long lcol) { + coAllocated = lcol; + } + + long AsLong() const { + return coAllocated; + } +}; + +/** + * Colour pairs hold a desired colour and an allocated colour. + */ +struct ColourPair { + ColourDesired desired; + ColourAllocated allocated; + + ColourPair(ColourDesired desired_=ColourDesired(0,0,0)) { + desired = desired_; + allocated.Set(desired.AsLong()); + } + void Copy() { + allocated.Set(desired.AsLong()); + } +}; + +class Window; // Forward declaration for Palette + +/** + * Colour palette management. + */ +class Palette { + int used; + int size; + ColourPair *entries; +#if PLAT_GTK + void *allocatedPalette; // GdkColor * + int allocatedLen; +#endif + // Private so Palette objects can not be copied + Palette(const Palette &) {} + Palette &operator=(const Palette &) { return *this; } +public: +#if PLAT_WIN + void *hpal; +#endif + bool allowRealization; + + Palette(); + ~Palette(); + + void Release(); + + /** + * This method either adds a colour to the list of wanted colours (want==true) + * or retrieves the allocated colour back to the ColourPair. + * This is one method to make it easier to keep the code for wanting and retrieving in sync. + */ + void WantFind(ColourPair &cp, bool want); + + void Allocate(Window &w); +}; + +/** + * Font management. + */ +class Font { +protected: + FontID id; +#if PLAT_WX + int ascent; +#endif + // Private so Font objects can not be copied + Font(const Font &) {} + Font &operator=(const Font &) { id=0; return *this; } +public: + Font(); + virtual ~Font(); + + virtual void Create(const char *faceName, int characterSet, int size, + bool bold, bool italic, bool extraFontFlag=false); + virtual void Release(); + + FontID GetID() { return id; } + // Alias another font - caller guarantees not to Release + void SetID(FontID id_) { id = id_; } + friend class Surface; + friend class SurfaceImpl; +}; + +/** + * A surface abstracts a place to draw. + */ +class Surface { +private: + // Private so Surface objects can not be copied + Surface(const Surface &) {} + Surface &operator=(const Surface &) { return *this; } +public: + Surface() {}; + virtual ~Surface() {}; + static Surface *Allocate(); + + virtual void Init(WindowID wid)=0; + virtual void Init(SurfaceID sid, WindowID wid)=0; + virtual void InitPixMap(int width, int height, Surface *surface_, WindowID wid)=0; + + virtual void Release()=0; + virtual bool Initialised()=0; + virtual void PenColour(ColourAllocated fore)=0; + virtual int LogPixelsY()=0; + virtual int DeviceHeightFont(int points)=0; + virtual void MoveTo(int x_, int y_)=0; + virtual void LineTo(int x_, int y_)=0; + virtual void Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back)=0; + virtual void RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0; + virtual void FillRectangle(PRectangle rc, ColourAllocated back)=0; + virtual void FillRectangle(PRectangle rc, Surface &surfacePattern)=0; + virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0; + virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, + ColourAllocated outline, int alphaOutline, int flags)=0; + virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0; + virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0; + + virtual void DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back)=0; + virtual void DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back)=0; + virtual void DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore)=0; + virtual void MeasureWidths(Font &font_, const char *s, int len, int *positions)=0; + virtual int WidthText(Font &font_, const char *s, int len)=0; + virtual int WidthChar(Font &font_, char ch)=0; + virtual int Ascent(Font &font_)=0; + virtual int Descent(Font &font_)=0; + virtual int InternalLeading(Font &font_)=0; + virtual int ExternalLeading(Font &font_)=0; + virtual int Height(Font &font_)=0; + virtual int AverageCharWidth(Font &font_)=0; + + virtual int SetPalette(Palette *pal, bool inBackGround)=0; + virtual void SetClip(PRectangle rc)=0; + virtual void FlushCachedState()=0; + + virtual void SetUnicodeMode(bool unicodeMode_)=0; + virtual void SetDBCSMode(int codePage)=0; +}; + +/** + * A simple callback action passing one piece of untyped user data. + */ +typedef void (*CallBackAction)(void*); + +/** + * Class to hide the details of window manipulation. + * Does not own the window which will normally have a longer life than this object. + */ +class Window { +protected: + WindowID id; +public: + Window() : id(0), cursorLast(cursorInvalid) {} + Window(const Window &source) : id(source.id), cursorLast(cursorInvalid) {} + virtual ~Window(); + Window &operator=(WindowID id_) { + id = id_; + return *this; + } + WindowID GetID() const { return id; } + bool Created() const { return id != 0; } + void Destroy(); + bool HasFocus(); + PRectangle GetPosition(); + void SetPosition(PRectangle rc); + void SetPositionRelative(PRectangle rc, Window relativeTo); + PRectangle GetClientPosition(); + void Show(bool show=true); + void InvalidateAll(); + void InvalidateRectangle(PRectangle rc); + virtual void SetFont(Font &font); + enum Cursor { cursorInvalid, cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow, cursorHand }; + void SetCursor(Cursor curs); + void SetTitle(const char *s); +private: + Cursor cursorLast; +}; + +/** + * Listbox management. + */ + +class ListBox : public Window { +public: + ListBox(); + virtual ~ListBox(); + static ListBox *Allocate(); + + virtual void SetFont(Font &font)=0; + virtual void Create(Window &parent, int ctrlID, Point location, int lineHeight_, bool unicodeMode_)=0; + virtual void SetAverageCharWidth(int width)=0; + virtual void SetVisibleRows(int rows)=0; + virtual int GetVisibleRows() const=0; + virtual PRectangle GetDesiredRect()=0; + virtual int CaretFromEdge()=0; + virtual void Clear()=0; + virtual void Append(char *s, int type = -1)=0; + virtual int Length()=0; + virtual void Select(int n)=0; + virtual int GetSelection()=0; + virtual int Find(const char *prefix)=0; + virtual void GetValue(int n, char *value, int len)=0; + virtual void RegisterImage(int type, const char *xpm_data)=0; + virtual void ClearRegisteredImages()=0; + virtual void SetDoubleClickAction(CallBackAction, void *)=0; + virtual void SetList(const char* list, char separator, char typesep)=0; +}; + +/** + * Menu management. + */ +class Menu { + MenuID id; +public: + Menu(); + MenuID GetID() { return id; } + void CreatePopUp(); + void Destroy(); + void Show(Point pt, Window &w); +}; + +class ElapsedTime { + long bigBit; + long littleBit; +public: + ElapsedTime(); + double Duration(bool reset=false); +}; + +/** + * Dynamic Library (DLL/SO/...) loading + */ +class DynamicLibrary { +public: + virtual ~DynamicLibrary() {}; + + /// @return Pointer to function "name", or NULL on failure. + virtual Function FindFunction(const char *name) = 0; + + /// @return true if the library was loaded successfully. + virtual bool IsValid() = 0; + + /// @return An instance of a DynamicLibrary subclass with "modulePath" loaded. + static DynamicLibrary *Load(const char *modulePath); +}; + +/** + * Platform class used to retrieve system wide parameters such as double click speed + * and chrome colour. Not a creatable object, more of a module with several functions. + */ +class Platform { + // Private so Platform objects can not be copied + Platform(const Platform &) {} + Platform &operator=(const Platform &) { return *this; } +public: + // Should be private because no new Platforms are ever created + // but gcc warns about this + Platform() {} + ~Platform() {} + static ColourDesired Chrome(); + static ColourDesired ChromeHighlight(); + static const char *DefaultFont(); + static int DefaultFontSize(); + static unsigned int DoubleClickTime(); + static bool MouseButtonBounce(); + static void DebugDisplay(const char *s); + static bool IsKeyDown(int key); + static long SendScintilla( + WindowID w, unsigned int msg, unsigned long wParam=0, long lParam=0); + static long SendScintillaPointer( + WindowID w, unsigned int msg, unsigned long wParam=0, void *lParam=0); + static bool IsDBCSLeadByte(int codePage, char ch); + static int DBCSCharLength(int codePage, const char *s); + static int DBCSCharMaxLength(); + + // These are utility functions not really tied to a platform + static int Minimum(int a, int b); + static int Maximum(int a, int b); + // Next three assume 16 bit shorts and 32 bit longs + static long LongFromTwoShorts(short a,short b) { + return (a) | ((b) << 16); + } + static short HighShortFromLong(long x) { + return static_cast(x >> 16); + } + static short LowShortFromLong(long x) { + return static_cast(x & 0xffff); + } + static void DebugPrintf(const char *format, ...); + static bool ShowAssertionPopUps(bool assertionPopUps_); + static void Assert(const char *c, const char *file, int line); + static int Clamp(int val, int minVal, int maxVal); +}; + +#ifdef NDEBUG +#define PLATFORM_ASSERT(c) ((void)0) +#else +#define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Platform::Assert(#c, __FILE__, __LINE__)) +#endif + +// Shut up annoying Visual C++ warnings: +#ifdef _MSC_VER +#pragma warning(disable: 4244 4309 4514 4710) +#endif + +#endif diff --git a/scintilla/include/Platform.h.bak b/scintilla/include/Platform.h.bak new file mode 100644 index 00000000..b713a528 --- /dev/null +++ b/scintilla/include/Platform.h.bak @@ -0,0 +1,517 @@ +// Scintilla source code edit control +/** @file Platform.h + ** Interface to platform facilities. Also includes some basic utilities. + ** Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef PLATFORM_H +#define PLATFORM_H + +// PLAT_GTK = GTK+ on Linux or Win32 +// PLAT_GTK_WIN32 is defined additionally when running PLAT_GTK under Win32 +// PLAT_WIN = Win32 API on Win32 OS +// PLAT_WX is wxWindows on any supported platform + +#define PLAT_GTK 0 +#define PLAT_GTK_WIN32 0 +#define PLAT_WIN 0 +#define PLAT_WX 0 +#define PLAT_FOX 0 + +#if defined(FOX) +#undef PLAT_FOX +#define PLAT_FOX 1 + +#elif defined(__WX__) +#undef PLAT_WX +#define PLAT_WX 1 + +#elif defined(GTK) +#undef PLAT_GTK +#define PLAT_GTK 1 + +#ifdef _MSC_VER +#undef PLAT_GTK_WIN32 +#define PLAT_GTK_WIN32 1 +#endif + +#else +#undef PLAT_WIN +#define PLAT_WIN 1 + +#endif + + +// Underlying the implementation of the platform classes are platform specific types. +// Sometimes these need to be passed around by client code so they are defined here + +typedef void *FontID; +typedef void *SurfaceID; +typedef void *WindowID; +typedef void *MenuID; +typedef void *TickerID; +typedef void *Function; +typedef void *IdlerID; + +/** + * A geometric point class. + * Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably. + */ +class Point { +public: + int x; + int y; + + explicit Point(int x_=0, int y_=0) : x(x_), y(y_) { + } + + // Other automatically defined methods (assignment, copy constructor, destructor) are fine + + static Point FromLong(long lpoint); +}; + +/** + * A geometric rectangle class. + * PRectangle is exactly the same as the Win32 RECT so can be used interchangeably. + * PRectangles contain their top and left sides, but not their right and bottom sides. + */ +class PRectangle { +public: + int left; + int top; + int right; + int bottom; + + PRectangle(int left_=0, int top_=0, int right_=0, int bottom_ = 0) : + left(left_), top(top_), right(right_), bottom(bottom_) { + } + + // Other automatically defined methods (assignment, copy constructor, destructor) are fine + + bool operator==(PRectangle &rc) { + return (rc.left == left) && (rc.right == right) && + (rc.top == top) && (rc.bottom == bottom); + } + bool Contains(Point pt) { + return (pt.x >= left) && (pt.x <= right) && + (pt.y >= top) && (pt.y <= bottom); + } + bool Contains(PRectangle rc) { + return (rc.left >= left) && (rc.right <= right) && + (rc.top >= top) && (rc.bottom <= bottom); + } + bool Intersects(PRectangle other) { + return (right > other.left) && (left < other.right) && + (bottom > other.top) && (top < other.bottom); + } + void Move(int xDelta, int yDelta) { + left += xDelta; + top += yDelta; + right += xDelta; + bottom += yDelta; + } + int Width() { return right - left; } + int Height() { return bottom - top; } +}; + +/** + * In some circumstances, including Win32 in paletted mode and GTK+, each colour + * must be allocated before use. The desired colours are held in the ColourDesired class, + * and after allocation the allocation entry is stored in the ColourAllocated class. In other + * circumstances, such as Win32 in true colour mode, the allocation process just copies + * the RGB values from the desired to the allocated class. + * As each desired colour requires allocation before it can be used, the ColourPair class + * holds both a ColourDesired and a ColourAllocated + * The Palette class is responsible for managing the palette of colours which contains a + * list of ColourPair objects and performs the allocation. + */ + +/** + * Holds a desired RGB colour. + */ +class ColourDesired { + long co; +public: + ColourDesired(long lcol=0) { + co = lcol; + } + + ColourDesired(unsigned int red, unsigned int green, unsigned int blue) { + Set(red, green, blue); + } + + bool operator==(const ColourDesired &other) const { + return co == other.co; + } + + void Set(long lcol) { + co = lcol; + } + + void Set(unsigned int red, unsigned int green, unsigned int blue) { + co = red | (green << 8) | (blue << 16); + } + + static inline unsigned int ValueOfHex(const char ch) { + if (ch >= '0' && ch <= '9') + return ch - '0'; + else if (ch >= 'A' && ch <= 'F') + return ch - 'A' + 10; + else if (ch >= 'a' && ch <= 'f') + return ch - 'a' + 10; + else + return 0; + } + + void Set(const char *val) { + if (*val == '#') { + val++; + } + unsigned int r = ValueOfHex(val[0]) * 16 + ValueOfHex(val[1]); + unsigned int g = ValueOfHex(val[2]) * 16 + ValueOfHex(val[3]); + unsigned int b = ValueOfHex(val[4]) * 16 + ValueOfHex(val[5]); + Set(r, g, b); + } + + long AsLong() const { + return co; + } + + unsigned int GetRed() { + return co & 0xff; + } + + unsigned int GetGreen() { + return (co >> 8) & 0xff; + } + + unsigned int GetBlue() { + return (co >> 16) & 0xff; + } +}; + +/** + * Holds an allocated RGB colour which may be an approximation to the desired colour. + */ +class ColourAllocated { + long coAllocated; + +public: + + ColourAllocated(long lcol=0) { + coAllocated = lcol; + } + + void Set(long lcol) { + coAllocated = lcol; + } + + long AsLong() const { + return coAllocated; + } +}; + +/** + * Colour pairs hold a desired colour and an allocated colour. + */ +struct ColourPair { + ColourDesired desired; + ColourAllocated allocated; + + ColourPair(ColourDesired desired_=ColourDesired(0,0,0)) { + desired = desired_; + allocated.Set(desired.AsLong()); + } + void Copy() { + allocated.Set(desired.AsLong()); + } +}; + +class Window; // Forward declaration for Palette + +/** + * Colour palette management. + */ +class Palette { + int used; + int size; + ColourPair *entries; +#if PLAT_GTK + void *allocatedPalette; // GdkColor * + int allocatedLen; +#endif + // Private so Palette objects can not be copied + Palette(const Palette &) {} + Palette &operator=(const Palette &) { return *this; } +public: +#if PLAT_WIN + void *hpal; +#endif + bool allowRealization; + + Palette(); + ~Palette(); + + void Release(); + + /** + * This method either adds a colour to the list of wanted colours (want==true) + * or retrieves the allocated colour back to the ColourPair. + * This is one method to make it easier to keep the code for wanting and retrieving in sync. + */ + void WantFind(ColourPair &cp, bool want); + + void Allocate(Window &w); +}; + +/** + * Font management. + */ +class Font { +protected: + FontID id; +#if PLAT_WX + int ascent; +#endif + // Private so Font objects can not be copied + Font(const Font &) {} + Font &operator=(const Font &) { id=0; return *this; } +public: + Font(); + virtual ~Font(); + + virtual void Create(const char *faceName, int characterSet, int size, + bool bold, bool italic, bool extraFontFlag=false); + virtual void Release(); + + FontID GetID() { return id; } + // Alias another font - caller guarantees not to Release + void SetID(FontID id_) { id = id_; } + friend class Surface; + friend class SurfaceImpl; +}; + +/** + * A surface abstracts a place to draw. + */ +class Surface { +private: + // Private so Surface objects can not be copied + Surface(const Surface &) {} + Surface &operator=(const Surface &) { return *this; } +public: + Surface() {}; + virtual ~Surface() {}; + static Surface *Allocate(); + + virtual void Init(WindowID wid)=0; + virtual void Init(SurfaceID sid, WindowID wid)=0; + virtual void InitPixMap(int width, int height, Surface *surface_, WindowID wid)=0; + + virtual void Release()=0; + virtual bool Initialised()=0; + virtual void PenColour(ColourAllocated fore)=0; + virtual int LogPixelsY()=0; + virtual int DeviceHeightFont(int points)=0; + virtual void MoveTo(int x_, int y_)=0; + virtual void LineTo(int x_, int y_)=0; + virtual void Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back)=0; + virtual void RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0; + virtual void FillRectangle(PRectangle rc, ColourAllocated back)=0; + virtual void FillRectangle(PRectangle rc, Surface &surfacePattern)=0; + virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0; + virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, + ColourAllocated outline, int alphaOutline, int flags)=0; + virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0; + virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0; + + virtual void DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back)=0; + virtual void DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back)=0; + virtual void DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore)=0; + virtual void MeasureWidths(Font &font_, const char *s, int len, int *positions)=0; + virtual int WidthText(Font &font_, const char *s, int len)=0; + virtual int WidthChar(Font &font_, char ch)=0; + virtual int Ascent(Font &font_)=0; + virtual int Descent(Font &font_)=0; + virtual int InternalLeading(Font &font_)=0; + virtual int ExternalLeading(Font &font_)=0; + virtual int Height(Font &font_)=0; + virtual int AverageCharWidth(Font &font_)=0; + + virtual int SetPalette(Palette *pal, bool inBackGround)=0; + virtual void SetClip(PRectangle rc)=0; + virtual void FlushCachedState()=0; + + virtual void SetUnicodeMode(bool unicodeMode_)=0; + virtual void SetDBCSMode(int codePage)=0; +}; + +/** + * A simple callback action passing one piece of untyped user data. + */ +typedef void (*CallBackAction)(void*); + +/** + * Class to hide the details of window manipulation. + * Does not own the window which will normally have a longer life than this object. + */ +class Window { +protected: + WindowID id; +public: + Window() : id(0), cursorLast(cursorInvalid) {} + Window(const Window &source) : id(source.id), cursorLast(cursorInvalid) {} + virtual ~Window(); + Window &operator=(WindowID id_) { + id = id_; + return *this; + } + WindowID GetID() const { return id; } + bool Created() const { return id != 0; } + void Destroy(); + bool HasFocus(); + PRectangle GetPosition(); + void SetPosition(PRectangle rc); + void SetPositionRelative(PRectangle rc, Window relativeTo); + PRectangle GetClientPosition(); + void Show(bool show=true); + void InvalidateAll(); + void InvalidateRectangle(PRectangle rc); + virtual void SetFont(Font &font); + enum Cursor { cursorInvalid, cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow, cursorHand }; + void SetCursor(Cursor curs); + void SetTitle(const char *s); +private: + Cursor cursorLast; +}; + +/** + * Listbox management. + */ + +class ListBox : public Window { +public: + ListBox(); + virtual ~ListBox(); + static ListBox *Allocate(); + + virtual void SetFont(Font &font)=0; + virtual void Create(Window &parent, int ctrlID, Point location, int lineHeight_, bool unicodeMode_)=0; + virtual void SetAverageCharWidth(int width)=0; + virtual void SetVisibleRows(int rows)=0; + virtual int GetVisibleRows() const=0; + virtual PRectangle GetDesiredRect()=0; + virtual int CaretFromEdge()=0; + virtual void Clear()=0; + virtual void Append(char *s, int type = -1)=0; + virtual int Length()=0; + virtual void Select(int n)=0; + virtual int GetSelection()=0; + virtual int Find(const char *prefix)=0; + virtual void GetValue(int n, char *value, int len)=0; + virtual void RegisterImage(int type, const char *xpm_data)=0; + virtual void ClearRegisteredImages()=0; + virtual void SetDoubleClickAction(CallBackAction, void *)=0; + virtual void SetList(const char* list, char separator, char typesep)=0; +}; + +/** + * Menu management. + */ +class Menu { + MenuID id; +public: + Menu(); + MenuID GetID() { return id; } + void CreatePopUp(); + void Destroy(); + void Show(Point pt, Window &w); +}; + +class ElapsedTime { + long bigBit; + long littleBit; +public: + ElapsedTime(); + double Duration(bool reset=false); +}; + +/** + * Dynamic Library (DLL/SO/...) loading + */ +class DynamicLibrary { +public: + virtual ~DynamicLibrary() {}; + + /// @return Pointer to function "name", or NULL on failure. + virtual Function FindFunction(const char *name) = 0; + + /// @return true if the library was loaded successfully. + virtual bool IsValid() = 0; + + /// @return An instance of a DynamicLibrary subclass with "modulePath" loaded. + static DynamicLibrary *Load(const char *modulePath); +}; + +/** + * Platform class used to retrieve system wide parameters such as double click speed + * and chrome colour. Not a creatable object, more of a module with several functions. + */ +class Platform { + // Private so Platform objects can not be copied + Platform(const Platform &) {} + Platform &operator=(const Platform &) { return *this; } +public: + // Should be private because no new Platforms are ever created + // but gcc warns about this + Platform() {} + ~Platform() {} + static ColourDesired Chrome(); + static ColourDesired ChromeHighlight(); + static const char *DefaultFont(); + static int DefaultFontSize(); + static unsigned int DoubleClickTime(); + static bool MouseButtonBounce(); + static void DebugDisplay(const char *s); + static bool IsKeyDown(int key); + static long SendScintilla( + WindowID w, unsigned int msg, unsigned long wParam=0, long lParam=0); + static long SendScintillaPointer( + WindowID w, unsigned int msg, unsigned long wParam=0, void *lParam=0); + static bool IsDBCSLeadByte(int codePage, char ch); + static int DBCSCharLength(int codePage, const char *s); + static int DBCSCharMaxLength(); + + // These are utility functions not really tied to a platform + static int Minimum(int a, int b); + static int Maximum(int a, int b); + // Next three assume 16 bit shorts and 32 bit longs + static long LongFromTwoShorts(short a,short b) { + return (a) | ((b) << 16); + } + static short HighShortFromLong(long x) { + return static_cast(x >> 16); + } + static short LowShortFromLong(long x) { + return static_cast(x & 0xffff); + } + static void DebugPrintf(const char *format, ...); + static bool ShowAssertionPopUps(bool assertionPopUps_); + static void Assert(const char *c, const char *file, int line); + static int Clamp(int val, int minVal, int maxVal); +}; + +#ifdef NDEBUG +#define PLATFORM_ASSERT(c) ((void)0) +#else +#define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Platform::Assert(#c, __FILE__, __LINE__)) +#endif + +// Shut up annoying Visual C++ warnings: +#ifdef _MSC_VER +#pragma warning(disable: 4244 4309 4514 4710) +#endif + +#endif diff --git a/scintilla/include/PropSet.h b/scintilla/include/PropSet.h new file mode 100644 index 00000000..563a3291 --- /dev/null +++ b/scintilla/include/PropSet.h @@ -0,0 +1,114 @@ +// Scintilla source code edit control +/** @file PropSet.h + ** A Java style properties file module. + **/ +// Copyright 1998-2002 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef PROPSET_H +#define PROPSET_H +#include "SString.h" + +bool EqualCaseInsensitive(const char *a, const char *b); + +bool isprefix(const char *target, const char *prefix); + +struct Property { + unsigned int hash; + char *key; + char *val; + Property *next; + Property() : hash(0), key(0), val(0), next(0) {} +}; + +/** + */ +class PropSet { +protected: + enum { hashRoots=31 }; + Property *props[hashRoots]; + Property *enumnext; + int enumhash; + static bool caseSensitiveFilenames; + static unsigned int HashString(const char *s, size_t len) { + unsigned int ret = 0; + while (len--) { + ret <<= 4; + ret ^= *s; + s++; + } + return ret; + } + static bool IncludesVar(const char *value, const char *key); + +public: + PropSet *superPS; + PropSet(); + ~PropSet(); + void Set(const char *key, const char *val, int lenKey=-1, int lenVal=-1); + void Set(const char *keyVal); + void Unset(const char *key, int lenKey=-1); + void SetMultiple(const char *s); + SString Get(const char *key); + SString GetExpanded(const char *key); + SString Expand(const char *withVars, int maxExpands=100); + int GetInt(const char *key, int defaultValue=0); + SString GetWild(const char *keybase, const char *filename); + SString GetNewExpand(const char *keybase, const char *filename=""); + void Clear(); + char *ToString(); // Caller must delete[] the return value + bool GetFirst(char **key, char **val); + bool GetNext(char **key, char **val); + static void SetCaseSensitiveFilenames(bool caseSensitiveFilenames_) { + caseSensitiveFilenames = caseSensitiveFilenames_; + } + +private: + // copy-value semantics not implemented + PropSet(const PropSet ©); + void operator=(const PropSet &assign); +}; + +/** + */ +class WordList { +public: + // Each word contains at least one character - a empty word acts as sentinel at the end. + char **words; + char **wordsNoCase; + char *list; + int len; + bool onlyLineEnds; ///< Delimited by any white space or only line ends + bool sorted; + bool sortedNoCase; + int starts[256]; + WordList(bool onlyLineEnds_ = false) : + words(0), wordsNoCase(0), list(0), len(0), onlyLineEnds(onlyLineEnds_), + sorted(false), sortedNoCase(false) {} + ~WordList() { Clear(); } + operator bool() { return len ? true : false; } + char *operator[](int ind) { return words[ind]; } + void Clear(); + void Set(const char *s); + char *Allocate(int size); + void SetFromAllocated(); + bool InList(const char *s); + bool InListAbbreviated(const char *s, const char marker); + const char *GetNearestWord(const char *wordStart, int searchLen, + bool ignoreCase = false, SString wordCharacters="", int wordIndex = -1); + char *GetNearestWords(const char *wordStart, int searchLen, + bool ignoreCase=false, char otherSeparator='\0', bool exactLen=false); +}; + +inline bool IsAlphabetic(unsigned int ch) { + return ((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z')); +} + + +#ifdef _MSC_VER +// Visual C++ doesn't like the private copy idiom for disabling +// the default copy constructor and operator=, but it's fine. +#pragma warning(disable: 4511 4512) +#endif + +#endif diff --git a/scintilla/include/SString.h b/scintilla/include/SString.h new file mode 100644 index 00000000..780d1a11 --- /dev/null +++ b/scintilla/include/SString.h @@ -0,0 +1,280 @@ +// SciTE - Scintilla based Text Editor +/** @file SString.h + ** A simple string class. + **/ +// Copyright 1998-2004 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef SSTRING_H +#define SSTRING_H + +// These functions are implemented because each platform calls them something different. +int CompareCaseInsensitive(const char *a, const char *b); +int CompareNCaseInsensitive(const char *a, const char *b, size_t len); +bool EqualCaseInsensitive(const char *a, const char *b); + +// Define another string class. +// While it would be 'better' to use std::string, that doubles the executable size. +// An SString may contain embedded nul characters. + +/** + * Base class from which the two other classes (SBuffer & SString) + * are derived. + */ +class SContainer { +public: + /** Type of string lengths (sizes) and positions (indexes). */ + typedef size_t lenpos_t; + /** Out of bounds value indicating that the string argument should be measured. */ + enum { measure_length=0xffffffffU}; + +protected: + char *s; ///< The C string + lenpos_t sSize; ///< The size of the buffer, less 1: ie. the maximum size of the string + + SContainer() : s(0), sSize(0) {} + ~SContainer() { + delete []s; // Suppose it was allocated using StringAllocate + s = 0; + sSize = 0; + } + /** Size of buffer. */ + lenpos_t size() const { + if (s) { + return sSize; + } else { + return 0; + } + } +public: + /** + * Allocate uninitialized memory big enough to fit a string of the given length. + * @return the pointer to the new string + */ + static char *StringAllocate(lenpos_t len); + /** + * Duplicate a buffer/C string. + * Allocate memory of the given size, or big enough to fit the string if length isn't given; + * then copy the given string in the allocated memory. + * @return the pointer to the new string + */ + static char *StringAllocate( + const char *s, ///< The string to duplicate + lenpos_t len=measure_length); ///< The length of memory to allocate. Optional. +}; + + +/** + * @brief A string buffer class. + * + * Main use is to ask an API the length of a string it can provide, + * then to allocate a buffer of the given size, and to provide this buffer + * to the API to put the string. + * This class is intended to be shortlived, to be transformed as SString + * as soon as it holds the string, so it has little members. + * Note: we assume the buffer is filled by the API. If the length can be shorter, + * we should set sLen to strlen(sb.ptr()) in related SString constructor and assignment. + */ +class SBuffer : protected SContainer { +public: + SBuffer(lenpos_t len) { + s = StringAllocate(len); + if (s) { + *s = '\0'; + sSize = len; + } else { + sSize = 0; + } + } +private: + /// Copy constructor + // Here only to be on the safe size, user should avoid returning SBuffer values. + SBuffer(const SBuffer &source) : SContainer() { + s = StringAllocate(source.s, source.sSize); + sSize = (s) ? source.sSize : 0; + } + /// Default assignment operator + // Same here, shouldn't be used + SBuffer &operator=(const SBuffer &source) { + if (this != &source) { + delete []s; + s = StringAllocate(source.s, source.sSize); + sSize = (s) ? source.sSize : 0; + } + return *this; + } +public: + /** Provide direct read/write access to buffer. */ + char *ptr() { + return s; + } + /** Ownership of the buffer have been taken, so release it. */ + void reset() { + s = 0; + sSize = 0; + } + /** Size of buffer. */ + lenpos_t size() const { + return SContainer::size(); + } +}; + + +/** + * @brief A simple string class. + * + * Hold the length of the string for quick operations, + * can have a buffer bigger than the string to avoid too many memory allocations and copies. + * May have embedded zeroes as a result of @a substitute, but relies too heavily on C string + * functions to allow reliable manipulations of these strings, other than simple appends, etc. + */ +class SString : protected SContainer { + lenpos_t sLen; ///< The size of the string in s + lenpos_t sizeGrowth; ///< Minimum growth size when appending strings + enum { sizeGrowthDefault = 64 }; + + bool grow(lenpos_t lenNew); + SString &assign(const char *sOther, lenpos_t sSize_=measure_length); + +public: + SString() : sLen(0), sizeGrowth(sizeGrowthDefault) {} + SString(const SString &source) : SContainer(), sizeGrowth(sizeGrowthDefault) { + s = StringAllocate(source.s, source.sLen); + sSize = sLen = (s) ? source.sLen : 0; + } + SString(const char *s_) : sizeGrowth(sizeGrowthDefault) { + s = StringAllocate(s_); + sSize = sLen = (s) ? strlen(s) : 0; + } + SString(SBuffer &buf) : sizeGrowth(sizeGrowthDefault) { + s = buf.ptr(); + sSize = sLen = buf.size(); + // Consumes the given buffer! + buf.reset(); + } + SString(const char *s_, lenpos_t first, lenpos_t last) : sizeGrowth(sizeGrowthDefault) { + // note: expects the "last" argument to point one beyond the range end (a la STL iterators) + s = StringAllocate(s_ + first, last - first); + sSize = sLen = (s) ? last - first : 0; + } + SString(int i); + SString(double d, int precision); + ~SString() { + sLen = 0; + } + void clear() { + if (s) { + *s = '\0'; + } + sLen = 0; + } + /** Size of buffer. */ + lenpos_t size() const { + return SContainer::size(); + } + /** Size of string in buffer. */ + lenpos_t length() const { + return sLen; + } + /** Read access to a character of the string. */ + char operator[](lenpos_t i) const { + return (s && i < sSize) ? s[i] : '\0'; + } + SString &operator=(const char *source) { + return assign(source); + } + SString &operator=(const SString &source) { + if (this != &source) { + assign(source.s, source.sLen); + } + return *this; + } + bool operator==(const SString &sOther) const; + bool operator!=(const SString &sOther) const { + return !operator==(sOther); + } + bool operator==(const char *sOther) const; + bool operator!=(const char *sOther) const { + return !operator==(sOther); + } + bool contains(char ch) const { + return (s && *s) ? strchr(s, ch) != 0 : false; + } + void setsizegrowth(lenpos_t sizeGrowth_) { + sizeGrowth = sizeGrowth_; + } + const char *c_str() const { + return s ? s : ""; + } + /** Give ownership of buffer to caller which must use delete[] to free buffer. */ + char *detach() { + char *sRet = s; + s = 0; + sSize = 0; + sLen = 0; + return sRet; + } + SString substr(lenpos_t subPos, lenpos_t subLen=measure_length) const; + SString &lowercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length); + SString &uppercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length); + SString &append(const char *sOther, lenpos_t sLenOther=measure_length, char sep = '\0'); + SString &operator+=(const char *sOther) { + return append(sOther, static_cast(measure_length)); + } + SString &operator+=(const SString &sOther) { + return append(sOther.s, sOther.sLen); + } + SString &operator+=(char ch) { + return append(&ch, 1); + } + SString &appendwithseparator(const char *sOther, char sep) { + return append(sOther, strlen(sOther), sep); + } + SString &insert(lenpos_t pos, const char *sOther, lenpos_t sLenOther=measure_length); + + /** + * Remove @a len characters from the @a pos position, included. + * Characters at pos + len and beyond replace characters at pos. + * If @a len is 0, or greater than the length of the string + * starting at @a pos, the string is just truncated at @a pos. + */ + void remove(lenpos_t pos, lenpos_t len); + + SString &change(lenpos_t pos, char ch) { + if (pos < sLen) { // character changed must be in string bounds + *(s + pos) = ch; + } + return *this; + } + /** Read an integral numeric value from the string. */ + int value() const { + return s ? atoi(s) : 0; + } + bool startswith(const char *prefix); + bool endswith(const char *suffix); + int search(const char *sFind, lenpos_t start=0) const; + bool contains(const char *sFind) const { + return search(sFind) >= 0; + } + int substitute(char chFind, char chReplace); + int substitute(const char *sFind, const char *sReplace); + int remove(const char *sFind) { + return substitute(sFind, ""); + } +}; + + +/** + * Duplicate a C string. + * Allocate memory of the given size, or big enough to fit the string if length isn't given; + * then copy the given string in the allocated memory. + * @return the pointer to the new string + */ +inline char *StringDup( + const char *s, ///< The string to duplicate + SContainer::lenpos_t len=SContainer::measure_length) ///< The length of memory to allocate. Optional. +{ + return SContainer::StringAllocate(s, len); +} + +#endif diff --git a/scintilla/include/SciLexer.h b/scintilla/include/SciLexer.h new file mode 100644 index 00000000..53e549a2 --- /dev/null +++ b/scintilla/include/SciLexer.h @@ -0,0 +1,1145 @@ +// Scintilla source code edit control +/** @file SciLexer.h + ** Interface to the added lexer functions in the SciLexer version of the edit control. + **/ +// Copyright 1998-2002 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +// Most of this file is automatically generated from the Scintilla.iface interface definition +// file which contains any comments about the definitions. HFacer.py does the generation. + +#ifndef SCILEXER_H +#define SCILEXER_H + +// SciLexer features - not in standard Scintilla + +//++Autogenerated -- start of section automatically generated from Scintilla.iface +#define SCLEX_CONTAINER 0 +#define SCLEX_NULL 1 +#define SCLEX_PYTHON 2 +#define SCLEX_CPP 3 +#define SCLEX_HTML 4 +#define SCLEX_XML 5 +#define SCLEX_PERL 6 +#define SCLEX_SQL 7 +#define SCLEX_VB 8 +#define SCLEX_PROPERTIES 9 +#define SCLEX_ERRORLIST 10 +#define SCLEX_MAKEFILE 11 +#define SCLEX_BATCH 12 +#define SCLEX_XCODE 13 +#define SCLEX_LATEX 14 +#define SCLEX_LUA 15 +#define SCLEX_DIFF 16 +#define SCLEX_CONF 17 +#define SCLEX_PASCAL 18 +#define SCLEX_AVE 19 +#define SCLEX_ADA 20 +#define SCLEX_LISP 21 +#define SCLEX_RUBY 22 +#define SCLEX_EIFFEL 23 +#define SCLEX_EIFFELKW 24 +#define SCLEX_TCL 25 +#define SCLEX_NNCRONTAB 26 +#define SCLEX_BULLANT 27 +#define SCLEX_VBSCRIPT 28 +#define SCLEX_BAAN 31 +#define SCLEX_MATLAB 32 +#define SCLEX_SCRIPTOL 33 +#define SCLEX_ASM 34 +#define SCLEX_CPPNOCASE 35 +#define SCLEX_FORTRAN 36 +#define SCLEX_F77 37 +#define SCLEX_CSS 38 +#define SCLEX_POV 39 +#define SCLEX_LOUT 40 +#define SCLEX_ESCRIPT 41 +#define SCLEX_PS 42 +#define SCLEX_NSIS 43 +#define SCLEX_MMIXAL 44 +#define SCLEX_CLW 45 +#define SCLEX_CLWNOCASE 46 +#define SCLEX_LOT 47 +#define SCLEX_YAML 48 +#define SCLEX_TEX 49 +#define SCLEX_METAPOST 50 +#define SCLEX_POWERBASIC 51 +#define SCLEX_FORTH 52 +#define SCLEX_ERLANG 53 +#define SCLEX_OCTAVE 54 +#define SCLEX_MSSQL 55 +#define SCLEX_VERILOG 56 +#define SCLEX_KIX 57 +#define SCLEX_GUI4CLI 58 +#define SCLEX_SPECMAN 59 +#define SCLEX_AU3 60 +#define SCLEX_APDL 61 +#define SCLEX_BASH 62 +#define SCLEX_ASN1 63 +#define SCLEX_VHDL 64 +#define SCLEX_CAML 65 +#define SCLEX_BLITZBASIC 66 +#define SCLEX_PUREBASIC 67 +#define SCLEX_HASKELL 68 +#define SCLEX_PHPSCRIPT 69 +#define SCLEX_TADS3 70 +#define SCLEX_REBOL 71 +#define SCLEX_SMALLTALK 72 +#define SCLEX_FLAGSHIP 73 +#define SCLEX_CSOUND 74 +#define SCLEX_FREEBASIC 75 +#define SCLEX_INNOSETUP 76 +#define SCLEX_OPAL 77 +#define SCLEX_SPICE 78 +#define SCLEX_D 79 +#define SCLEX_CMAKE 80 +#define SCLEX_SEARCHRESULT 98 +#define SCLEX_OBJC 99 +#define SCLEX_USER 100 +#define SCLEX_AUTOMATIC 1000 + +//For All lexer +#define SCE_UNIVERSAL_SELECT_STYLE 30 +#define SCE_UNIVERSAL_FOUND_STYLE 31 +#define SCE_P_DEFAULT 0 +#define SCE_P_COMMENTLINE 1 +#define SCE_P_NUMBER 2 +#define SCE_P_STRING 3 +#define SCE_P_CHARACTER 4 +#define SCE_P_WORD 5 +#define SCE_P_TRIPLE 6 +#define SCE_P_TRIPLEDOUBLE 7 +#define SCE_P_CLASSNAME 8 +#define SCE_P_DEFNAME 9 +#define SCE_P_OPERATOR 10 +#define SCE_P_IDENTIFIER 11 +#define SCE_P_COMMENTBLOCK 12 +#define SCE_P_STRINGEOL 13 +#define SCE_P_WORD2 14 +#define SCE_P_DECORATOR 15 +#define SCE_C_DEFAULT 0 +#define SCE_C_COMMENT 1 +#define SCE_C_COMMENTLINE 2 +#define SCE_C_COMMENTDOC 3 +#define SCE_C_NUMBER 4 +#define SCE_C_WORD 5 +#define SCE_C_STRING 6 +#define SCE_C_CHARACTER 7 +#define SCE_C_UUID 8 +#define SCE_C_PREPROCESSOR 9 +#define SCE_C_OPERATOR 10 +#define SCE_C_IDENTIFIER 11 +#define SCE_C_STRINGEOL 12 +#define SCE_C_VERBATIM 13 +#define SCE_C_REGEX 14 +#define SCE_C_COMMENTLINEDOC 15 +#define SCE_C_WORD2 16 +#define SCE_C_COMMENTDOCKEYWORD 17 +#define SCE_C_COMMENTDOCKEYWORDERROR 18 +#define SCE_C_GLOBALCLASS 19 +#define SCE_D_DEFAULT 0 +#define SCE_D_COMMENT 1 +#define SCE_D_COMMENTLINE 2 +#define SCE_D_COMMENTDOC 3 +#define SCE_D_COMMENTNESTED 4 +#define SCE_D_NUMBER 5 +#define SCE_D_WORD 6 +#define SCE_D_WORD2 7 +#define SCE_D_WORD3 8 +#define SCE_D_TYPEDEF 9 +#define SCE_D_STRING 10 +#define SCE_D_STRINGEOL 11 +#define SCE_D_CHARACTER 12 +#define SCE_D_OPERATOR 13 +#define SCE_D_IDENTIFIER 14 +#define SCE_D_COMMENTLINEDOC 15 +#define SCE_D_COMMENTDOCKEYWORD 16 +#define SCE_D_COMMENTDOCKEYWORDERROR 17 + +#define SCE_SEARCHRESULT_DEFAULT 0 +#define SCE_SEARCHRESULT_HEARDER 1 +#define SCE_SEARCHRESULT_NUMBER 2 +#define SCE_SEARCHRESULT_WORD2SEARCH 3 +#define SCE_SEARCHRESULT_KWORD1 4 +#define SCE_SEARCHRESULT_KWORD2 5 +#define SCE_SEARCHRESULT_KWORD3 6 + +#define SCE_OBJC_DIRECTIVE 20 +#define SCE_OBJC_QUALIFIER 21 + +#define SCE_USER_DEFAULT 0 +#define SCE_USER_COMMENT 1 +#define SCE_USER_COMMENTLINE 2 +#define SCE_USER_NUMBER 4 +#define SCE_USER_WORD1 5 +#define SCE_USER_WORD2 6 +#define SCE_USER_WORD3 7 +#define SCE_USER_WORD4 8 +#define SCE_USER_OPERATOR 10 +#define SCE_USER_IDENTIFIER 11 +#define SCE_USER_BLOCK_OPERATOR_OPEN 12 +#define SCE_USER_BLOCK_OPERATOR_CLOSE 13 +#define SCE_USER_DELIMITER1 14 +#define SCE_USER_DELIMITER2 15 +#define SCE_USER_DELIMITER3 16 + +#define SCE_TCL_DEFAULT 0 +#define SCE_TCL_COMMENT 1 +#define SCE_TCL_COMMENTLINE 2 +#define SCE_TCL_NUMBER 3 +#define SCE_TCL_WORD_IN_QUOTE 4 +#define SCE_TCL_IN_QUOTE 5 +#define SCE_TCL_OPERATOR 6 +#define SCE_TCL_IDENTIFIER 7 +#define SCE_TCL_SUBSTITUTION 8 +#define SCE_TCL_SUB_BRACE 9 +#define SCE_TCL_MODIFIER 10 +#define SCE_TCL_EXPAND 11 +#define SCE_TCL_WORD 12 +#define SCE_TCL_WORD2 13 +#define SCE_TCL_WORD3 14 +#define SCE_TCL_WORD4 15 +#define SCE_TCL_WORD5 16 +#define SCE_TCL_WORD6 17 +#define SCE_TCL_WORD7 18 +#define SCE_TCL_WORD8 19 +#define SCE_TCL_COMMENT_BOX 20 +#define SCE_TCL_BLOCK_COMMENT 21 +#define SCE_H_DEFAULT 0 +#define SCE_H_TAG 1 +#define SCE_H_TAGUNKNOWN 2 +#define SCE_H_ATTRIBUTE 3 +#define SCE_H_ATTRIBUTEUNKNOWN 4 +#define SCE_H_NUMBER 5 +#define SCE_H_DOUBLESTRING 6 +#define SCE_H_SINGLESTRING 7 +#define SCE_H_OTHER 8 +#define SCE_H_COMMENT 9 +#define SCE_H_ENTITY 10 +#define SCE_H_TAGEND 11 +#define SCE_H_XMLSTART 12 +#define SCE_H_XMLEND 13 +#define SCE_H_SCRIPT 14 +#define SCE_H_ASP 15 +#define SCE_H_ASPAT 16 +#define SCE_H_CDATA 17 +#define SCE_H_QUESTION 18 +#define SCE_H_VALUE 19 +#define SCE_H_XCCOMMENT 20 +#define SCE_H_SGML_DEFAULT 21 +#define SCE_H_SGML_COMMAND 22 +#define SCE_H_SGML_1ST_PARAM 23 +#define SCE_H_SGML_DOUBLESTRING 24 +#define SCE_H_SGML_SIMPLESTRING 25 +#define SCE_H_SGML_ERROR 26 +#define SCE_H_SGML_SPECIAL 27 +#define SCE_H_SGML_ENTITY 28 +#define SCE_H_SGML_COMMENT 29 +#define SCE_H_SGML_1ST_PARAM_COMMENT 30 +#define SCE_H_SGML_BLOCK_DEFAULT 31 +#define SCE_HJ_START 40 +#define SCE_HJ_DEFAULT 41 +#define SCE_HJ_COMMENT 42 +#define SCE_HJ_COMMENTLINE 43 +#define SCE_HJ_COMMENTDOC 44 +#define SCE_HJ_NUMBER 45 +#define SCE_HJ_WORD 46 +#define SCE_HJ_KEYWORD 47 +#define SCE_HJ_DOUBLESTRING 48 +#define SCE_HJ_SINGLESTRING 49 +#define SCE_HJ_SYMBOLS 50 +#define SCE_HJ_STRINGEOL 51 +#define SCE_HJ_REGEX 52 +#define SCE_HJA_START 55 +#define SCE_HJA_DEFAULT 56 +#define SCE_HJA_COMMENT 57 +#define SCE_HJA_COMMENTLINE 58 +#define SCE_HJA_COMMENTDOC 59 +#define SCE_HJA_NUMBER 60 +#define SCE_HJA_WORD 61 +#define SCE_HJA_KEYWORD 62 +#define SCE_HJA_DOUBLESTRING 63 +#define SCE_HJA_SINGLESTRING 64 +#define SCE_HJA_SYMBOLS 65 +#define SCE_HJA_STRINGEOL 66 +#define SCE_HJA_REGEX 67 +#define SCE_HB_START 70 +#define SCE_HB_DEFAULT 71 +#define SCE_HB_COMMENTLINE 72 +#define SCE_HB_NUMBER 73 +#define SCE_HB_WORD 74 +#define SCE_HB_STRING 75 +#define SCE_HB_IDENTIFIER 76 +#define SCE_HB_STRINGEOL 77 +#define SCE_HBA_START 80 +#define SCE_HBA_DEFAULT 81 +#define SCE_HBA_COMMENTLINE 82 +#define SCE_HBA_NUMBER 83 +#define SCE_HBA_WORD 84 +#define SCE_HBA_STRING 85 +#define SCE_HBA_IDENTIFIER 86 +#define SCE_HBA_STRINGEOL 87 +#define SCE_HP_START 90 +#define SCE_HP_DEFAULT 91 +#define SCE_HP_COMMENTLINE 92 +#define SCE_HP_NUMBER 93 +#define SCE_HP_STRING 94 +#define SCE_HP_CHARACTER 95 +#define SCE_HP_WORD 96 +#define SCE_HP_TRIPLE 97 +#define SCE_HP_TRIPLEDOUBLE 98 +#define SCE_HP_CLASSNAME 99 +#define SCE_HP_DEFNAME 100 +#define SCE_HP_OPERATOR 101 +#define SCE_HP_IDENTIFIER 102 +#define SCE_HPHP_COMPLEX_VARIABLE 104 +#define SCE_HPA_START 105 +#define SCE_HPA_DEFAULT 106 +#define SCE_HPA_COMMENTLINE 107 +#define SCE_HPA_NUMBER 108 +#define SCE_HPA_STRING 109 +#define SCE_HPA_CHARACTER 110 +#define SCE_HPA_WORD 111 +#define SCE_HPA_TRIPLE 112 +#define SCE_HPA_TRIPLEDOUBLE 113 +#define SCE_HPA_CLASSNAME 114 +#define SCE_HPA_DEFNAME 115 +#define SCE_HPA_OPERATOR 116 +#define SCE_HPA_IDENTIFIER 117 +#define SCE_HPHP_DEFAULT 118 +#define SCE_HPHP_HSTRING 119 +#define SCE_HPHP_SIMPLESTRING 120 +#define SCE_HPHP_WORD 121 +#define SCE_HPHP_NUMBER 122 +#define SCE_HPHP_VARIABLE 123 +#define SCE_HPHP_COMMENT 124 +#define SCE_HPHP_COMMENTLINE 125 +#define SCE_HPHP_HSTRING_VARIABLE 126 +#define SCE_HPHP_OPERATOR 127 +#define SCE_PL_DEFAULT 0 +#define SCE_PL_ERROR 1 +#define SCE_PL_COMMENTLINE 2 +#define SCE_PL_POD 3 +#define SCE_PL_NUMBER 4 +#define SCE_PL_WORD 5 +#define SCE_PL_STRING 6 +#define SCE_PL_CHARACTER 7 +#define SCE_PL_PUNCTUATION 8 +#define SCE_PL_PREPROCESSOR 9 +#define SCE_PL_OPERATOR 10 +#define SCE_PL_IDENTIFIER 11 +#define SCE_PL_SCALAR 12 +#define SCE_PL_ARRAY 13 +#define SCE_PL_HASH 14 +#define SCE_PL_SYMBOLTABLE 15 +#define SCE_PL_VARIABLE_INDEXER 16 +#define SCE_PL_REGEX 17 +#define SCE_PL_REGSUBST 18 +#define SCE_PL_LONGQUOTE 19 +#define SCE_PL_BACKTICKS 20 +#define SCE_PL_DATASECTION 21 +#define SCE_PL_HERE_DELIM 22 +#define SCE_PL_HERE_Q 23 +#define SCE_PL_HERE_QQ 24 +#define SCE_PL_HERE_QX 25 +#define SCE_PL_STRING_Q 26 +#define SCE_PL_STRING_QQ 27 +#define SCE_PL_STRING_QX 28 +#define SCE_PL_STRING_QR 29 +#define SCE_PL_STRING_QW 30 +#define SCE_PL_POD_VERB 31 +#define SCE_RB_DEFAULT 0 +#define SCE_RB_ERROR 1 +#define SCE_RB_COMMENTLINE 2 +#define SCE_RB_POD 3 +#define SCE_RB_NUMBER 4 +#define SCE_RB_WORD 5 +#define SCE_RB_STRING 6 +#define SCE_RB_CHARACTER 7 +#define SCE_RB_CLASSNAME 8 +#define SCE_RB_DEFNAME 9 +#define SCE_RB_OPERATOR 10 +#define SCE_RB_IDENTIFIER 11 +#define SCE_RB_REGEX 12 +#define SCE_RB_GLOBAL 13 +#define SCE_RB_SYMBOL 14 +#define SCE_RB_MODULE_NAME 15 +#define SCE_RB_INSTANCE_VAR 16 +#define SCE_RB_CLASS_VAR 17 +#define SCE_RB_BACKTICKS 18 +#define SCE_RB_DATASECTION 19 +#define SCE_RB_HERE_DELIM 20 +#define SCE_RB_HERE_Q 21 +#define SCE_RB_HERE_QQ 22 +#define SCE_RB_HERE_QX 23 +#define SCE_RB_STRING_Q 24 +#define SCE_RB_STRING_QQ 25 +#define SCE_RB_STRING_QX 26 +#define SCE_RB_STRING_QR 27 +#define SCE_RB_STRING_QW 28 +#define SCE_RB_WORD_DEMOTED 29 +#define SCE_RB_STDIN 30 +#define SCE_RB_STDOUT 31 +#define SCE_RB_STDERR 40 +#define SCE_RB_UPPER_BOUND 41 +#define SCE_B_DEFAULT 0 +#define SCE_B_COMMENT 1 +#define SCE_B_NUMBER 2 +#define SCE_B_KEYWORD 3 +#define SCE_B_STRING 4 +#define SCE_B_PREPROCESSOR 5 +#define SCE_B_OPERATOR 6 +#define SCE_B_IDENTIFIER 7 +#define SCE_B_DATE 8 +#define SCE_B_STRINGEOL 9 +#define SCE_B_KEYWORD2 10 +#define SCE_B_KEYWORD3 11 +#define SCE_B_KEYWORD4 12 +#define SCE_B_CONSTANT 13 +#define SCE_B_ASM 14 +#define SCE_B_LABEL 15 +#define SCE_B_ERROR 16 +#define SCE_B_HEXNUMBER 17 +#define SCE_B_BINNUMBER 18 +#define SCE_PROPS_DEFAULT 0 +#define SCE_PROPS_COMMENT 1 +#define SCE_PROPS_SECTION 2 +#define SCE_PROPS_ASSIGNMENT 3 +#define SCE_PROPS_DEFVAL 4 +#define SCE_PROPS_KEY 5 +#define SCE_L_DEFAULT 0 +#define SCE_L_COMMAND 1 +#define SCE_L_TAG 2 +#define SCE_L_MATH 3 +#define SCE_L_COMMENT 4 +#define SCE_LUA_DEFAULT 0 +#define SCE_LUA_COMMENT 1 +#define SCE_LUA_COMMENTLINE 2 +#define SCE_LUA_COMMENTDOC 3 +#define SCE_LUA_NUMBER 4 +#define SCE_LUA_WORD 5 +#define SCE_LUA_STRING 6 +#define SCE_LUA_CHARACTER 7 +#define SCE_LUA_LITERALSTRING 8 +#define SCE_LUA_PREPROCESSOR 9 +#define SCE_LUA_OPERATOR 10 +#define SCE_LUA_IDENTIFIER 11 +#define SCE_LUA_STRINGEOL 12 +#define SCE_LUA_WORD2 13 +#define SCE_LUA_WORD3 14 +#define SCE_LUA_WORD4 15 +#define SCE_LUA_WORD5 16 +#define SCE_LUA_WORD6 17 +#define SCE_LUA_WORD7 18 +#define SCE_LUA_WORD8 19 +#define SCE_ERR_DEFAULT 0 +#define SCE_ERR_PYTHON 1 +#define SCE_ERR_GCC 2 +#define SCE_ERR_MS 3 +#define SCE_ERR_CMD 4 +#define SCE_ERR_BORLAND 5 +#define SCE_ERR_PERL 6 +#define SCE_ERR_NET 7 +#define SCE_ERR_LUA 8 +#define SCE_ERR_CTAG 9 +#define SCE_ERR_DIFF_CHANGED 10 +#define SCE_ERR_DIFF_ADDITION 11 +#define SCE_ERR_DIFF_DELETION 12 +#define SCE_ERR_DIFF_MESSAGE 13 +#define SCE_ERR_PHP 14 +#define SCE_ERR_ELF 15 +#define SCE_ERR_IFC 16 +#define SCE_ERR_IFORT 17 +#define SCE_ERR_ABSF 18 +#define SCE_ERR_TIDY 19 +#define SCE_ERR_JAVA_STACK 20 +#define SCE_BAT_DEFAULT 0 +#define SCE_BAT_COMMENT 1 +#define SCE_BAT_WORD 2 +#define SCE_BAT_LABEL 3 +#define SCE_BAT_HIDE 4 +#define SCE_BAT_COMMAND 5 +#define SCE_BAT_IDENTIFIER 6 +#define SCE_BAT_OPERATOR 7 +#define SCE_MAKE_DEFAULT 0 +#define SCE_MAKE_COMMENT 1 +#define SCE_MAKE_PREPROCESSOR 2 +#define SCE_MAKE_IDENTIFIER 3 +#define SCE_MAKE_OPERATOR 4 +#define SCE_MAKE_TARGET 5 +#define SCE_MAKE_IDEOL 9 +#define SCE_DIFF_DEFAULT 0 +#define SCE_DIFF_COMMENT 1 +#define SCE_DIFF_COMMAND 2 +#define SCE_DIFF_HEADER 3 +#define SCE_DIFF_POSITION 4 +#define SCE_DIFF_DELETED 5 +#define SCE_DIFF_ADDED 6 +#define SCE_CONF_DEFAULT 0 +#define SCE_CONF_COMMENT 1 +#define SCE_CONF_NUMBER 2 +#define SCE_CONF_IDENTIFIER 3 +#define SCE_CONF_EXTENSION 4 +#define SCE_CONF_PARAMETER 5 +#define SCE_CONF_STRING 6 +#define SCE_CONF_OPERATOR 7 +#define SCE_CONF_IP 8 +#define SCE_CONF_DIRECTIVE 9 +#define SCE_AVE_DEFAULT 0 +#define SCE_AVE_COMMENT 1 +#define SCE_AVE_NUMBER 2 +#define SCE_AVE_WORD 3 +#define SCE_AVE_STRING 6 +#define SCE_AVE_ENUM 7 +#define SCE_AVE_STRINGEOL 8 +#define SCE_AVE_IDENTIFIER 9 +#define SCE_AVE_OPERATOR 10 +#define SCE_AVE_WORD1 11 +#define SCE_AVE_WORD2 12 +#define SCE_AVE_WORD3 13 +#define SCE_AVE_WORD4 14 +#define SCE_AVE_WORD5 15 +#define SCE_AVE_WORD6 16 +#define SCE_ADA_DEFAULT 0 +#define SCE_ADA_WORD 1 +#define SCE_ADA_IDENTIFIER 2 +#define SCE_ADA_NUMBER 3 +#define SCE_ADA_DELIMITER 4 +#define SCE_ADA_CHARACTER 5 +#define SCE_ADA_CHARACTEREOL 6 +#define SCE_ADA_STRING 7 +#define SCE_ADA_STRINGEOL 8 +#define SCE_ADA_LABEL 9 +#define SCE_ADA_COMMENTLINE 10 +#define SCE_ADA_ILLEGAL 11 +#define SCE_BAAN_DEFAULT 0 +#define SCE_BAAN_COMMENT 1 +#define SCE_BAAN_COMMENTDOC 2 +#define SCE_BAAN_NUMBER 3 +#define SCE_BAAN_WORD 4 +#define SCE_BAAN_STRING 5 +#define SCE_BAAN_PREPROCESSOR 6 +#define SCE_BAAN_OPERATOR 7 +#define SCE_BAAN_IDENTIFIER 8 +#define SCE_BAAN_STRINGEOL 9 +#define SCE_BAAN_WORD2 10 +#define SCE_LISP_DEFAULT 0 +#define SCE_LISP_COMMENT 1 +#define SCE_LISP_NUMBER 2 +#define SCE_LISP_KEYWORD 3 +#define SCE_LISP_KEYWORD_KW 4 +#define SCE_LISP_SYMBOL 5 +#define SCE_LISP_STRING 6 +#define SCE_LISP_STRINGEOL 8 +#define SCE_LISP_IDENTIFIER 9 +#define SCE_LISP_OPERATOR 10 +#define SCE_LISP_SPECIAL 11 +#define SCE_LISP_MULTI_COMMENT 12 +#define SCE_EIFFEL_DEFAULT 0 +#define SCE_EIFFEL_COMMENTLINE 1 +#define SCE_EIFFEL_NUMBER 2 +#define SCE_EIFFEL_WORD 3 +#define SCE_EIFFEL_STRING 4 +#define SCE_EIFFEL_CHARACTER 5 +#define SCE_EIFFEL_OPERATOR 6 +#define SCE_EIFFEL_IDENTIFIER 7 +#define SCE_EIFFEL_STRINGEOL 8 +#define SCE_NNCRONTAB_DEFAULT 0 +#define SCE_NNCRONTAB_COMMENT 1 +#define SCE_NNCRONTAB_TASK 2 +#define SCE_NNCRONTAB_SECTION 3 +#define SCE_NNCRONTAB_KEYWORD 4 +#define SCE_NNCRONTAB_MODIFIER 5 +#define SCE_NNCRONTAB_ASTERISK 6 +#define SCE_NNCRONTAB_NUMBER 7 +#define SCE_NNCRONTAB_STRING 8 +#define SCE_NNCRONTAB_ENVIRONMENT 9 +#define SCE_NNCRONTAB_IDENTIFIER 10 +#define SCE_FORTH_DEFAULT 0 +#define SCE_FORTH_COMMENT 1 +#define SCE_FORTH_COMMENT_ML 2 +#define SCE_FORTH_IDENTIFIER 3 +#define SCE_FORTH_CONTROL 4 +#define SCE_FORTH_KEYWORD 5 +#define SCE_FORTH_DEFWORD 6 +#define SCE_FORTH_PREWORD1 7 +#define SCE_FORTH_PREWORD2 8 +#define SCE_FORTH_NUMBER 9 +#define SCE_FORTH_STRING 10 +#define SCE_FORTH_LOCALE 11 +#define SCE_MATLAB_DEFAULT 0 +#define SCE_MATLAB_COMMENT 1 +#define SCE_MATLAB_COMMAND 2 +#define SCE_MATLAB_NUMBER 3 +#define SCE_MATLAB_KEYWORD 4 +#define SCE_MATLAB_STRING 5 +#define SCE_MATLAB_OPERATOR 6 +#define SCE_MATLAB_IDENTIFIER 7 +#define SCE_MATLAB_DOUBLEQUOTESTRING 8 +#define SCE_SCRIPTOL_DEFAULT 0 +#define SCE_SCRIPTOL_WHITE 1 +#define SCE_SCRIPTOL_COMMENTLINE 2 +#define SCE_SCRIPTOL_PERSISTENT 3 +#define SCE_SCRIPTOL_CSTYLE 4 +#define SCE_SCRIPTOL_COMMENTBLOCK 5 +#define SCE_SCRIPTOL_NUMBER 6 +#define SCE_SCRIPTOL_STRING 7 +#define SCE_SCRIPTOL_CHARACTER 8 +#define SCE_SCRIPTOL_STRINGEOL 9 +#define SCE_SCRIPTOL_KEYWORD 10 +#define SCE_SCRIPTOL_OPERATOR 11 +#define SCE_SCRIPTOL_IDENTIFIER 12 +#define SCE_SCRIPTOL_TRIPLE 13 +#define SCE_SCRIPTOL_CLASSNAME 14 +#define SCE_SCRIPTOL_PREPROCESSOR 15 +#define SCE_ASM_DEFAULT 0 +#define SCE_ASM_COMMENT 1 +#define SCE_ASM_NUMBER 2 +#define SCE_ASM_STRING 3 +#define SCE_ASM_OPERATOR 4 +#define SCE_ASM_IDENTIFIER 5 +#define SCE_ASM_CPUINSTRUCTION 6 +#define SCE_ASM_MATHINSTRUCTION 7 +#define SCE_ASM_REGISTER 8 +#define SCE_ASM_DIRECTIVE 9 +#define SCE_ASM_DIRECTIVEOPERAND 10 +#define SCE_ASM_COMMENTBLOCK 11 +#define SCE_ASM_CHARACTER 12 +#define SCE_ASM_STRINGEOL 13 +#define SCE_ASM_EXTINSTRUCTION 14 +#define SCE_F_DEFAULT 0 +#define SCE_F_COMMENT 1 +#define SCE_F_NUMBER 2 +#define SCE_F_STRING1 3 +#define SCE_F_STRING2 4 +#define SCE_F_STRINGEOL 5 +#define SCE_F_OPERATOR 6 +#define SCE_F_IDENTIFIER 7 +#define SCE_F_WORD 8 +#define SCE_F_WORD2 9 +#define SCE_F_WORD3 10 +#define SCE_F_PREPROCESSOR 11 +#define SCE_F_OPERATOR2 12 +#define SCE_F_LABEL 13 +#define SCE_F_CONTINUATION 14 +#define SCE_CSS_DEFAULT 0 +#define SCE_CSS_TAG 1 +#define SCE_CSS_CLASS 2 +#define SCE_CSS_PSEUDOCLASS 3 +#define SCE_CSS_UNKNOWN_PSEUDOCLASS 4 +#define SCE_CSS_OPERATOR 5 +#define SCE_CSS_IDENTIFIER 6 +#define SCE_CSS_UNKNOWN_IDENTIFIER 7 +#define SCE_CSS_VALUE 8 +#define SCE_CSS_COMMENT 9 +#define SCE_CSS_ID 10 +#define SCE_CSS_IMPORTANT 11 +#define SCE_CSS_DIRECTIVE 12 +#define SCE_CSS_DOUBLESTRING 13 +#define SCE_CSS_SINGLESTRING 14 +#define SCE_CSS_IDENTIFIER2 15 +#define SCE_CSS_ATTRIBUTE 16 +#define SCE_POV_DEFAULT 0 +#define SCE_POV_COMMENT 1 +#define SCE_POV_COMMENTLINE 2 +#define SCE_POV_NUMBER 3 +#define SCE_POV_OPERATOR 4 +#define SCE_POV_IDENTIFIER 5 +#define SCE_POV_STRING 6 +#define SCE_POV_STRINGEOL 7 +#define SCE_POV_DIRECTIVE 8 +#define SCE_POV_BADDIRECTIVE 9 +#define SCE_POV_WORD2 10 +#define SCE_POV_WORD3 11 +#define SCE_POV_WORD4 12 +#define SCE_POV_WORD5 13 +#define SCE_POV_WORD6 14 +#define SCE_POV_WORD7 15 +#define SCE_POV_WORD8 16 +#define SCE_LOUT_DEFAULT 0 +#define SCE_LOUT_COMMENT 1 +#define SCE_LOUT_NUMBER 2 +#define SCE_LOUT_WORD 3 +#define SCE_LOUT_WORD2 4 +#define SCE_LOUT_WORD3 5 +#define SCE_LOUT_WORD4 6 +#define SCE_LOUT_STRING 7 +#define SCE_LOUT_OPERATOR 8 +#define SCE_LOUT_IDENTIFIER 9 +#define SCE_LOUT_STRINGEOL 10 +#define SCE_ESCRIPT_DEFAULT 0 +#define SCE_ESCRIPT_COMMENT 1 +#define SCE_ESCRIPT_COMMENTLINE 2 +#define SCE_ESCRIPT_COMMENTDOC 3 +#define SCE_ESCRIPT_NUMBER 4 +#define SCE_ESCRIPT_WORD 5 +#define SCE_ESCRIPT_STRING 6 +#define SCE_ESCRIPT_OPERATOR 7 +#define SCE_ESCRIPT_IDENTIFIER 8 +#define SCE_ESCRIPT_BRACE 9 +#define SCE_ESCRIPT_WORD2 10 +#define SCE_ESCRIPT_WORD3 11 +#define SCE_PS_DEFAULT 0 +#define SCE_PS_COMMENT 1 +#define SCE_PS_DSC_COMMENT 2 +#define SCE_PS_DSC_VALUE 3 +#define SCE_PS_NUMBER 4 +#define SCE_PS_NAME 5 +#define SCE_PS_KEYWORD 6 +#define SCE_PS_LITERAL 7 +#define SCE_PS_IMMEVAL 8 +#define SCE_PS_PAREN_ARRAY 9 +#define SCE_PS_PAREN_DICT 10 +#define SCE_PS_PAREN_PROC 11 +#define SCE_PS_TEXT 12 +#define SCE_PS_HEXSTRING 13 +#define SCE_PS_BASE85STRING 14 +#define SCE_PS_BADSTRINGCHAR 15 +#define SCE_NSIS_DEFAULT 0 +#define SCE_NSIS_COMMENT 1 +#define SCE_NSIS_STRINGDQ 2 +#define SCE_NSIS_STRINGLQ 3 +#define SCE_NSIS_STRINGRQ 4 +#define SCE_NSIS_FUNCTION 5 +#define SCE_NSIS_VARIABLE 6 +#define SCE_NSIS_LABEL 7 +#define SCE_NSIS_USERDEFINED 8 +#define SCE_NSIS_SECTIONDEF 9 +#define SCE_NSIS_SUBSECTIONDEF 10 +#define SCE_NSIS_IFDEFINEDEF 11 +#define SCE_NSIS_MACRODEF 12 +#define SCE_NSIS_STRINGVAR 13 +#define SCE_NSIS_NUMBER 14 +#define SCE_NSIS_SECTIONGROUP 15 +#define SCE_NSIS_PAGEEX 16 +#define SCE_NSIS_FUNCTIONDEF 17 +#define SCE_NSIS_COMMENTBOX 18 +#define SCE_MMIXAL_LEADWS 0 +#define SCE_MMIXAL_COMMENT 1 +#define SCE_MMIXAL_LABEL 2 +#define SCE_MMIXAL_OPCODE 3 +#define SCE_MMIXAL_OPCODE_PRE 4 +#define SCE_MMIXAL_OPCODE_VALID 5 +#define SCE_MMIXAL_OPCODE_UNKNOWN 6 +#define SCE_MMIXAL_OPCODE_POST 7 +#define SCE_MMIXAL_OPERANDS 8 +#define SCE_MMIXAL_NUMBER 9 +#define SCE_MMIXAL_REF 10 +#define SCE_MMIXAL_CHAR 11 +#define SCE_MMIXAL_STRING 12 +#define SCE_MMIXAL_REGISTER 13 +#define SCE_MMIXAL_HEX 14 +#define SCE_MMIXAL_OPERATOR 15 +#define SCE_MMIXAL_SYMBOL 16 +#define SCE_MMIXAL_INCLUDE 17 +#define SCE_CLW_DEFAULT 0 +#define SCE_CLW_LABEL 1 +#define SCE_CLW_COMMENT 2 +#define SCE_CLW_STRING 3 +#define SCE_CLW_USER_IDENTIFIER 4 +#define SCE_CLW_INTEGER_CONSTANT 5 +#define SCE_CLW_REAL_CONSTANT 6 +#define SCE_CLW_PICTURE_STRING 7 +#define SCE_CLW_KEYWORD 8 +#define SCE_CLW_COMPILER_DIRECTIVE 9 +#define SCE_CLW_RUNTIME_EXPRESSIONS 10 +#define SCE_CLW_BUILTIN_PROCEDURES_FUNCTION 11 +#define SCE_CLW_STRUCTURE_DATA_TYPE 12 +#define SCE_CLW_ATTRIBUTE 13 +#define SCE_CLW_STANDARD_EQUATE 14 +#define SCE_CLW_ERROR 15 +#define SCE_CLW_DEPRECATED 16 +#define SCE_LOT_DEFAULT 0 +#define SCE_LOT_HEADER 1 +#define SCE_LOT_BREAK 2 +#define SCE_LOT_SET 3 +#define SCE_LOT_PASS 4 +#define SCE_LOT_FAIL 5 +#define SCE_LOT_ABORT 6 +#define SCE_YAML_DEFAULT 0 +#define SCE_YAML_COMMENT 1 +#define SCE_YAML_IDENTIFIER 2 +#define SCE_YAML_KEYWORD 3 +#define SCE_YAML_NUMBER 4 +#define SCE_YAML_REFERENCE 5 +#define SCE_YAML_DOCUMENT 6 +#define SCE_YAML_TEXT 7 +#define SCE_YAML_ERROR 8 +#define SCE_TEX_DEFAULT 0 +#define SCE_TEX_SPECIAL 1 +#define SCE_TEX_GROUP 2 +#define SCE_TEX_SYMBOL 3 +#define SCE_TEX_COMMAND 4 +#define SCE_TEX_TEXT 5 +#define SCE_METAPOST_DEFAULT 0 +#define SCE_METAPOST_SPECIAL 1 +#define SCE_METAPOST_GROUP 2 +#define SCE_METAPOST_SYMBOL 3 +#define SCE_METAPOST_COMMAND 4 +#define SCE_METAPOST_TEXT 5 +#define SCE_METAPOST_EXTRA 6 +#define SCE_ERLANG_DEFAULT 0 +#define SCE_ERLANG_COMMENT 1 +#define SCE_ERLANG_VARIABLE 2 +#define SCE_ERLANG_NUMBER 3 +#define SCE_ERLANG_KEYWORD 4 +#define SCE_ERLANG_STRING 5 +#define SCE_ERLANG_OPERATOR 6 +#define SCE_ERLANG_ATOM 7 +#define SCE_ERLANG_FUNCTION_NAME 8 +#define SCE_ERLANG_CHARACTER 9 +#define SCE_ERLANG_MACRO 10 +#define SCE_ERLANG_RECORD 11 +#define SCE_ERLANG_SEPARATOR 12 +#define SCE_ERLANG_NODE_NAME 13 +#define SCE_ERLANG_UNKNOWN 31 +#define SCE_MSSQL_DEFAULT 0 +#define SCE_MSSQL_COMMENT 1 +#define SCE_MSSQL_LINE_COMMENT 2 +#define SCE_MSSQL_NUMBER 3 +#define SCE_MSSQL_STRING 4 +#define SCE_MSSQL_OPERATOR 5 +#define SCE_MSSQL_IDENTIFIER 6 +#define SCE_MSSQL_VARIABLE 7 +#define SCE_MSSQL_COLUMN_NAME 8 +#define SCE_MSSQL_STATEMENT 9 +#define SCE_MSSQL_DATATYPE 10 +#define SCE_MSSQL_SYSTABLE 11 +#define SCE_MSSQL_GLOBAL_VARIABLE 12 +#define SCE_MSSQL_FUNCTION 13 +#define SCE_MSSQL_STORED_PROCEDURE 14 +#define SCE_MSSQL_DEFAULT_PREF_DATATYPE 15 +#define SCE_MSSQL_COLUMN_NAME_2 16 +#define SCE_V_DEFAULT 0 +#define SCE_V_COMMENT 1 +#define SCE_V_COMMENTLINE 2 +#define SCE_V_COMMENTLINEBANG 3 +#define SCE_V_NUMBER 4 +#define SCE_V_WORD 5 +#define SCE_V_STRING 6 +#define SCE_V_WORD2 7 +#define SCE_V_WORD3 8 +#define SCE_V_PREPROCESSOR 9 +#define SCE_V_OPERATOR 10 +#define SCE_V_IDENTIFIER 11 +#define SCE_V_STRINGEOL 12 +#define SCE_V_USER 19 +#define SCE_KIX_DEFAULT 0 +#define SCE_KIX_COMMENT 1 +#define SCE_KIX_STRING1 2 +#define SCE_KIX_STRING2 3 +#define SCE_KIX_NUMBER 4 +#define SCE_KIX_VAR 5 +#define SCE_KIX_MACRO 6 +#define SCE_KIX_KEYWORD 7 +#define SCE_KIX_FUNCTIONS 8 +#define SCE_KIX_OPERATOR 9 +#define SCE_KIX_IDENTIFIER 31 +#define SCE_GC_DEFAULT 0 +#define SCE_GC_COMMENTLINE 1 +#define SCE_GC_COMMENTBLOCK 2 +#define SCE_GC_GLOBAL 3 +#define SCE_GC_EVENT 4 +#define SCE_GC_ATTRIBUTE 5 +#define SCE_GC_CONTROL 6 +#define SCE_GC_COMMAND 7 +#define SCE_GC_STRING 8 +#define SCE_GC_OPERATOR 9 +#define SCE_SN_DEFAULT 0 +#define SCE_SN_CODE 1 +#define SCE_SN_COMMENTLINE 2 +#define SCE_SN_COMMENTLINEBANG 3 +#define SCE_SN_NUMBER 4 +#define SCE_SN_WORD 5 +#define SCE_SN_STRING 6 +#define SCE_SN_WORD2 7 +#define SCE_SN_WORD3 8 +#define SCE_SN_PREPROCESSOR 9 +#define SCE_SN_OPERATOR 10 +#define SCE_SN_IDENTIFIER 11 +#define SCE_SN_STRINGEOL 12 +#define SCE_SN_REGEXTAG 13 +#define SCE_SN_SIGNAL 14 +#define SCE_SN_USER 19 +#define SCE_AU3_DEFAULT 0 +#define SCE_AU3_COMMENT 1 +#define SCE_AU3_COMMENTBLOCK 2 +#define SCE_AU3_NUMBER 3 +#define SCE_AU3_FUNCTION 4 +#define SCE_AU3_KEYWORD 5 +#define SCE_AU3_MACRO 6 +#define SCE_AU3_STRING 7 +#define SCE_AU3_OPERATOR 8 +#define SCE_AU3_VARIABLE 9 +#define SCE_AU3_SENT 10 +#define SCE_AU3_PREPROCESSOR 11 +#define SCE_AU3_SPECIAL 12 +#define SCE_AU3_EXPAND 13 +#define SCE_AU3_COMOBJ 14 +#define SCE_AU3_UDF 15 +#define SCE_APDL_DEFAULT 0 +#define SCE_APDL_COMMENT 1 +#define SCE_APDL_COMMENTBLOCK 2 +#define SCE_APDL_NUMBER 3 +#define SCE_APDL_STRING 4 +#define SCE_APDL_OPERATOR 5 +#define SCE_APDL_WORD 6 +#define SCE_APDL_PROCESSOR 7 +#define SCE_APDL_COMMAND 8 +#define SCE_APDL_SLASHCOMMAND 9 +#define SCE_APDL_STARCOMMAND 10 +#define SCE_APDL_ARGUMENT 11 +#define SCE_APDL_FUNCTION 12 +#define SCE_SH_DEFAULT 0 +#define SCE_SH_ERROR 1 +#define SCE_SH_COMMENTLINE 2 +#define SCE_SH_NUMBER 3 +#define SCE_SH_WORD 4 +#define SCE_SH_STRING 5 +#define SCE_SH_CHARACTER 6 +#define SCE_SH_OPERATOR 7 +#define SCE_SH_IDENTIFIER 8 +#define SCE_SH_SCALAR 9 +#define SCE_SH_PARAM 10 +#define SCE_SH_BACKTICKS 11 +#define SCE_SH_HERE_DELIM 12 +#define SCE_SH_HERE_Q 13 +#define SCE_ASN1_DEFAULT 0 +#define SCE_ASN1_COMMENT 1 +#define SCE_ASN1_IDENTIFIER 2 +#define SCE_ASN1_STRING 3 +#define SCE_ASN1_OID 4 +#define SCE_ASN1_SCALAR 5 +#define SCE_ASN1_KEYWORD 6 +#define SCE_ASN1_ATTRIBUTE 7 +#define SCE_ASN1_DESCRIPTOR 8 +#define SCE_ASN1_TYPE 9 +#define SCE_ASN1_OPERATOR 10 +#define SCE_VHDL_DEFAULT 0 +#define SCE_VHDL_COMMENT 1 +#define SCE_VHDL_COMMENTLINEBANG 2 +#define SCE_VHDL_NUMBER 3 +#define SCE_VHDL_STRING 4 +#define SCE_VHDL_OPERATOR 5 +#define SCE_VHDL_IDENTIFIER 6 +#define SCE_VHDL_STRINGEOL 7 +#define SCE_VHDL_KEYWORD 8 +#define SCE_VHDL_STDOPERATOR 9 +#define SCE_VHDL_ATTRIBUTE 10 +#define SCE_VHDL_STDFUNCTION 11 +#define SCE_VHDL_STDPACKAGE 12 +#define SCE_VHDL_STDTYPE 13 +#define SCE_VHDL_USERWORD 14 +#define SCE_CAML_DEFAULT 0 +#define SCE_CAML_IDENTIFIER 1 +#define SCE_CAML_TAGNAME 2 +#define SCE_CAML_KEYWORD 3 +#define SCE_CAML_KEYWORD2 4 +#define SCE_CAML_KEYWORD3 5 +#define SCE_CAML_LINENUM 6 +#define SCE_CAML_OPERATOR 7 +#define SCE_CAML_NUMBER 8 +#define SCE_CAML_CHAR 9 +#define SCE_CAML_STRING 11 +#define SCE_CAML_COMMENT 12 +#define SCE_CAML_COMMENT1 13 +#define SCE_CAML_COMMENT2 14 +#define SCE_CAML_COMMENT3 15 +#define SCE_HA_DEFAULT 0 +#define SCE_HA_IDENTIFIER 1 +#define SCE_HA_KEYWORD 2 +#define SCE_HA_NUMBER 3 +#define SCE_HA_STRING 4 +#define SCE_HA_CHARACTER 5 +#define SCE_HA_CLASS 6 +#define SCE_HA_MODULE 7 +#define SCE_HA_CAPITAL 8 +#define SCE_HA_DATA 9 +#define SCE_HA_IMPORT 10 +#define SCE_HA_OPERATOR 11 +#define SCE_HA_INSTANCE 12 +#define SCE_HA_COMMENTLINE 13 +#define SCE_HA_COMMENTBLOCK 14 +#define SCE_HA_COMMENTBLOCK2 15 +#define SCE_HA_COMMENTBLOCK3 16 +#define SCE_T3_DEFAULT 0 +#define SCE_T3_X_DEFAULT 1 +#define SCE_T3_PREPROCESSOR 2 +#define SCE_T3_BLOCK_COMMENT 3 +#define SCE_T3_LINE_COMMENT 4 +#define SCE_T3_OPERATOR 5 +#define SCE_T3_KEYWORD 6 +#define SCE_T3_NUMBER 7 +#define SCE_T3_IDENTIFIER 8 +#define SCE_T3_S_STRING 9 +#define SCE_T3_D_STRING 10 +#define SCE_T3_X_STRING 11 +#define SCE_T3_LIB_DIRECTIVE 12 +#define SCE_T3_MSG_PARAM 13 +#define SCE_T3_HTML_TAG 14 +#define SCE_T3_HTML_DEFAULT 15 +#define SCE_T3_HTML_STRING 16 +#define SCE_T3_USER1 17 +#define SCE_T3_USER2 18 +#define SCE_T3_USER3 19 +#define SCE_T3_BRACE 20 +#define SCE_REBOL_DEFAULT 0 +#define SCE_REBOL_COMMENTLINE 1 +#define SCE_REBOL_COMMENTBLOCK 2 +#define SCE_REBOL_PREFACE 3 +#define SCE_REBOL_OPERATOR 4 +#define SCE_REBOL_CHARACTER 5 +#define SCE_REBOL_QUOTEDSTRING 6 +#define SCE_REBOL_BRACEDSTRING 7 +#define SCE_REBOL_NUMBER 8 +#define SCE_REBOL_PAIR 9 +#define SCE_REBOL_TUPLE 10 +#define SCE_REBOL_BINARY 11 +#define SCE_REBOL_MONEY 12 +#define SCE_REBOL_ISSUE 13 +#define SCE_REBOL_TAG 14 +#define SCE_REBOL_FILE 15 +#define SCE_REBOL_EMAIL 16 +#define SCE_REBOL_URL 17 +#define SCE_REBOL_DATE 18 +#define SCE_REBOL_TIME 19 +#define SCE_REBOL_IDENTIFIER 20 +#define SCE_REBOL_WORD 21 +#define SCE_REBOL_WORD2 22 +#define SCE_REBOL_WORD3 23 +#define SCE_REBOL_WORD4 24 +#define SCE_REBOL_WORD5 25 +#define SCE_REBOL_WORD6 26 +#define SCE_REBOL_WORD7 27 +#define SCE_REBOL_WORD8 28 +#define SCE_SQL_DEFAULT 0 +#define SCE_SQL_COMMENT 1 +#define SCE_SQL_COMMENTLINE 2 +#define SCE_SQL_COMMENTDOC 3 +#define SCE_SQL_NUMBER 4 +#define SCE_SQL_WORD 5 +#define SCE_SQL_STRING 6 +#define SCE_SQL_CHARACTER 7 +#define SCE_SQL_SQLPLUS 8 +#define SCE_SQL_SQLPLUS_PROMPT 9 +#define SCE_SQL_OPERATOR 10 +#define SCE_SQL_IDENTIFIER 11 +#define SCE_SQL_SQLPLUS_COMMENT 13 +#define SCE_SQL_COMMENTLINEDOC 15 +#define SCE_SQL_WORD2 16 +#define SCE_SQL_COMMENTDOCKEYWORD 17 +#define SCE_SQL_COMMENTDOCKEYWORDERROR 18 +#define SCE_SQL_USER1 19 +#define SCE_SQL_USER2 20 +#define SCE_SQL_USER3 21 +#define SCE_SQL_USER4 22 +#define SCE_SQL_QUOTEDIDENTIFIER 23 +#define SCE_ST_DEFAULT 0 +#define SCE_ST_STRING 1 +#define SCE_ST_NUMBER 2 +#define SCE_ST_COMMENT 3 +#define SCE_ST_SYMBOL 4 +#define SCE_ST_BINARY 5 +#define SCE_ST_BOOL 6 +#define SCE_ST_SELF 7 +#define SCE_ST_SUPER 8 +#define SCE_ST_NIL 9 +#define SCE_ST_GLOBAL 10 +#define SCE_ST_RETURN 11 +#define SCE_ST_SPECIAL 12 +#define SCE_ST_KWSEND 13 +#define SCE_ST_ASSIGN 14 +#define SCE_ST_CHARACTER 15 +#define SCE_ST_SPEC_SEL 16 +#define SCE_FS_DEFAULT 0 +#define SCE_FS_COMMENT 1 +#define SCE_FS_COMMENTLINE 2 +#define SCE_FS_COMMENTDOC 3 +#define SCE_FS_COMMENTLINEDOC 4 +#define SCE_FS_COMMENTDOCKEYWORD 5 +#define SCE_FS_COMMENTDOCKEYWORDERROR 6 +#define SCE_FS_KEYWORD 7 +#define SCE_FS_KEYWORD2 8 +#define SCE_FS_KEYWORD3 9 +#define SCE_FS_KEYWORD4 10 +#define SCE_FS_NUMBER 11 +#define SCE_FS_STRING 12 +#define SCE_FS_PREPROCESSOR 13 +#define SCE_FS_OPERATOR 14 +#define SCE_FS_IDENTIFIER 15 +#define SCE_FS_DATE 16 +#define SCE_FS_STRINGEOL 17 +#define SCE_FS_CONSTANT 18 +#define SCE_FS_ASM 19 +#define SCE_FS_LABEL 20 +#define SCE_FS_ERROR 21 +#define SCE_FS_HEXNUMBER 22 +#define SCE_FS_BINNUMBER 23 +#define SCE_CSOUND_DEFAULT 0 +#define SCE_CSOUND_COMMENT 1 +#define SCE_CSOUND_NUMBER 2 +#define SCE_CSOUND_OPERATOR 3 +#define SCE_CSOUND_INSTR 4 +#define SCE_CSOUND_IDENTIFIER 5 +#define SCE_CSOUND_OPCODE 6 +#define SCE_CSOUND_HEADERSTMT 7 +#define SCE_CSOUND_USERKEYWORD 8 +#define SCE_CSOUND_COMMENTBLOCK 9 +#define SCE_CSOUND_PARAM 10 +#define SCE_CSOUND_ARATE_VAR 11 +#define SCE_CSOUND_KRATE_VAR 12 +#define SCE_CSOUND_IRATE_VAR 13 +#define SCE_CSOUND_GLOBAL_VAR 14 +#define SCE_CSOUND_STRINGEOL 15 +#define SCE_INNO_DEFAULT 0 +#define SCE_INNO_COMMENT 1 +#define SCE_INNO_KEYWORD 2 +#define SCE_INNO_PARAMETER 3 +#define SCE_INNO_SECTION 4 +#define SCE_INNO_PREPROC 5 +#define SCE_INNO_PREPROC_INLINE 6 +#define SCE_INNO_COMMENT_PASCAL 7 +#define SCE_INNO_KEYWORD_PASCAL 8 +#define SCE_INNO_KEYWORD_USER 9 +#define SCE_INNO_STRING_DOUBLE 10 +#define SCE_INNO_STRING_SINGLE 11 +#define SCE_INNO_IDENTIFIER 12 +#define SCE_OPAL_SPACE 0 +#define SCE_OPAL_COMMENT_BLOCK 1 +#define SCE_OPAL_COMMENT_LINE 2 +#define SCE_OPAL_INTEGER 3 +#define SCE_OPAL_KEYWORD 4 +#define SCE_OPAL_SORT 5 +#define SCE_OPAL_STRING 6 +#define SCE_OPAL_PAR 7 +#define SCE_OPAL_BOOL_CONST 8 +#define SCE_OPAL_DEFAULT 32 +#define SCE_SPICE_DEFAULT 0 +#define SCE_SPICE_IDENTIFIER 1 +#define SCE_SPICE_KEYWORD 2 +#define SCE_SPICE_KEYWORD2 3 +#define SCE_SPICE_KEYWORD3 4 +#define SCE_SPICE_NUMBER 5 +#define SCE_SPICE_DELIMITER 6 +#define SCE_SPICE_VALUE 7 +#define SCE_SPICE_COMMENTLINE 8 +#define SCE_CMAKE_DEFAULT 0 +#define SCE_CMAKE_COMMENT 1 +#define SCE_CMAKE_STRINGDQ 2 +#define SCE_CMAKE_STRINGLQ 3 +#define SCE_CMAKE_STRINGRQ 4 +#define SCE_CMAKE_COMMANDS 5 +#define SCE_CMAKE_PARAMETERS 6 +#define SCE_CMAKE_VARIABLE 7 +#define SCE_CMAKE_USERDEFINED 8 +#define SCE_CMAKE_WHILEDEF 9 +#define SCE_CMAKE_FOREACHDEF 10 +#define SCE_CMAKE_IFDEFINEDEF 11 +#define SCE_CMAKE_MACRODEF 12 +#define SCE_CMAKE_STRINGVAR 13 +#define SCE_CMAKE_NUMBER 14 +#define SCLEX_ASP 29 +#define SCLEX_PHP 30 +//--Autogenerated -- end of section automatically generated from Scintilla.iface + +#endif diff --git a/scintilla/include/SciLexer.h.bak b/scintilla/include/SciLexer.h.bak new file mode 100644 index 00000000..6c064ca4 --- /dev/null +++ b/scintilla/include/SciLexer.h.bak @@ -0,0 +1,1141 @@ +// Scintilla source code edit control +/** @file SciLexer.h + ** Interface to the added lexer functions in the SciLexer version of the edit control. + **/ +// Copyright 1998-2002 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +// Most of this file is automatically generated from the Scintilla.iface interface definition +// file which contains any comments about the definitions. HFacer.py does the generation. + +#ifndef SCILEXER_H +#define SCILEXER_H + +// SciLexer features - not in standard Scintilla + +//++Autogenerated -- start of section automatically generated from Scintilla.iface +#define SCLEX_CONTAINER 0 +#define SCLEX_NULL 1 +#define SCLEX_PYTHON 2 +#define SCLEX_CPP 3 +#define SCLEX_HTML 4 +#define SCLEX_XML 5 +#define SCLEX_PERL 6 +#define SCLEX_SQL 7 +#define SCLEX_VB 8 +#define SCLEX_PROPERTIES 9 +#define SCLEX_ERRORLIST 10 +#define SCLEX_MAKEFILE 11 +#define SCLEX_BATCH 12 +#define SCLEX_XCODE 13 +#define SCLEX_LATEX 14 +#define SCLEX_LUA 15 +#define SCLEX_DIFF 16 +#define SCLEX_CONF 17 +#define SCLEX_PASCAL 18 +#define SCLEX_AVE 19 +#define SCLEX_ADA 20 +#define SCLEX_LISP 21 +#define SCLEX_RUBY 22 +#define SCLEX_EIFFEL 23 +#define SCLEX_EIFFELKW 24 +#define SCLEX_TCL 25 +#define SCLEX_NNCRONTAB 26 +#define SCLEX_BULLANT 27 +#define SCLEX_VBSCRIPT 28 +#define SCLEX_BAAN 31 +#define SCLEX_MATLAB 32 +#define SCLEX_SCRIPTOL 33 +#define SCLEX_ASM 34 +#define SCLEX_CPPNOCASE 35 +#define SCLEX_FORTRAN 36 +#define SCLEX_F77 37 +#define SCLEX_CSS 38 +#define SCLEX_POV 39 +#define SCLEX_LOUT 40 +#define SCLEX_ESCRIPT 41 +#define SCLEX_PS 42 +#define SCLEX_NSIS 43 +#define SCLEX_MMIXAL 44 +#define SCLEX_CLW 45 +#define SCLEX_CLWNOCASE 46 +#define SCLEX_LOT 47 +#define SCLEX_YAML 48 +#define SCLEX_TEX 49 +#define SCLEX_METAPOST 50 +#define SCLEX_POWERBASIC 51 +#define SCLEX_FORTH 52 +#define SCLEX_ERLANG 53 +#define SCLEX_OCTAVE 54 +#define SCLEX_MSSQL 55 +#define SCLEX_VERILOG 56 +#define SCLEX_KIX 57 +#define SCLEX_GUI4CLI 58 +#define SCLEX_SPECMAN 59 +#define SCLEX_AU3 60 +#define SCLEX_APDL 61 +#define SCLEX_BASH 62 +#define SCLEX_ASN1 63 +#define SCLEX_VHDL 64 +#define SCLEX_CAML 65 +#define SCLEX_BLITZBASIC 66 +#define SCLEX_PUREBASIC 67 +#define SCLEX_HASKELL 68 +#define SCLEX_PHPSCRIPT 69 +#define SCLEX_TADS3 70 +#define SCLEX_REBOL 71 +#define SCLEX_SMALLTALK 72 +#define SCLEX_FLAGSHIP 73 +#define SCLEX_CSOUND 74 +#define SCLEX_FREEBASIC 75 +#define SCLEX_INNOSETUP 76 +#define SCLEX_OPAL 77 +#define SCLEX_SPICE 78 +#define SCLEX_D 79 +#define SCLEX_CMAKE 80 +#define SCLEX_SEARCHRESULT 98 +#define SCLEX_OBJC 99 +#define SCLEX_USER 100 +#define SCLEX_AUTOMATIC 1000 +#define SCE_P_DEFAULT 0 +#define SCE_P_COMMENTLINE 1 +#define SCE_P_NUMBER 2 +#define SCE_P_STRING 3 +#define SCE_P_CHARACTER 4 +#define SCE_P_WORD 5 +#define SCE_P_TRIPLE 6 +#define SCE_P_TRIPLEDOUBLE 7 +#define SCE_P_CLASSNAME 8 +#define SCE_P_DEFNAME 9 +#define SCE_P_OPERATOR 10 +#define SCE_P_IDENTIFIER 11 +#define SCE_P_COMMENTBLOCK 12 +#define SCE_P_STRINGEOL 13 +#define SCE_P_WORD2 14 +#define SCE_P_DECORATOR 15 +#define SCE_C_DEFAULT 0 +#define SCE_C_COMMENT 1 +#define SCE_C_COMMENTLINE 2 +#define SCE_C_COMMENTDOC 3 +#define SCE_C_NUMBER 4 +#define SCE_C_WORD 5 +#define SCE_C_STRING 6 +#define SCE_C_CHARACTER 7 +#define SCE_C_UUID 8 +#define SCE_C_PREPROCESSOR 9 +#define SCE_C_OPERATOR 10 +#define SCE_C_IDENTIFIER 11 +#define SCE_C_STRINGEOL 12 +#define SCE_C_VERBATIM 13 +#define SCE_C_REGEX 14 +#define SCE_C_COMMENTLINEDOC 15 +#define SCE_C_WORD2 16 +#define SCE_C_COMMENTDOCKEYWORD 17 +#define SCE_C_COMMENTDOCKEYWORDERROR 18 +#define SCE_C_GLOBALCLASS 19 +#define SCE_D_DEFAULT 0 +#define SCE_D_COMMENT 1 +#define SCE_D_COMMENTLINE 2 +#define SCE_D_COMMENTDOC 3 +#define SCE_D_COMMENTNESTED 4 +#define SCE_D_NUMBER 5 +#define SCE_D_WORD 6 +#define SCE_D_WORD2 7 +#define SCE_D_WORD3 8 +#define SCE_D_TYPEDEF 9 +#define SCE_D_STRING 10 +#define SCE_D_STRINGEOL 11 +#define SCE_D_CHARACTER 12 +#define SCE_D_OPERATOR 13 +#define SCE_D_IDENTIFIER 14 +#define SCE_D_COMMENTLINEDOC 15 +#define SCE_D_COMMENTDOCKEYWORD 16 +#define SCE_D_COMMENTDOCKEYWORDERROR 17 + +#define SCE_SEARCHRESULT_DEFAULT 0 +#define SCE_SEARCHRESULT_HEARDER 1 +#define SCE_SEARCHRESULT_NUMBER 2 +#define SCE_SEARCHRESULT_WORD2SEARCH 3 +#define SCE_SEARCHRESULT_KWORD1 4 +#define SCE_SEARCHRESULT_KWORD2 5 +#define SCE_SEARCHRESULT_KWORD3 6 + +#define SCE_OBJC_DIRECTIVE 20 +#define SCE_OBJC_QUALIFIER 21 + +#define SCE_USER_DEFAULT 0 +#define SCE_USER_COMMENT 1 +#define SCE_USER_COMMENTLINE 2 +#define SCE_USER_NUMBER 4 +#define SCE_USER_WORD1 5 +#define SCE_USER_WORD2 6 +#define SCE_USER_WORD3 7 +#define SCE_USER_WORD4 8 +#define SCE_USER_OPERATOR 10 +#define SCE_USER_IDENTIFIER 11 +#define SCE_USER_BLOCK_OPERATOR_OPEN 12 +#define SCE_USER_BLOCK_OPERATOR_CLOSE 13 +#define SCE_USER_DELIMITER1 14 +#define SCE_USER_DELIMITER2 15 +#define SCE_USER_DELIMITER3 16 + +#define SCE_TCL_DEFAULT 0 +#define SCE_TCL_COMMENT 1 +#define SCE_TCL_COMMENTLINE 2 +#define SCE_TCL_NUMBER 3 +#define SCE_TCL_WORD_IN_QUOTE 4 +#define SCE_TCL_IN_QUOTE 5 +#define SCE_TCL_OPERATOR 6 +#define SCE_TCL_IDENTIFIER 7 +#define SCE_TCL_SUBSTITUTION 8 +#define SCE_TCL_SUB_BRACE 9 +#define SCE_TCL_MODIFIER 10 +#define SCE_TCL_EXPAND 11 +#define SCE_TCL_WORD 12 +#define SCE_TCL_WORD2 13 +#define SCE_TCL_WORD3 14 +#define SCE_TCL_WORD4 15 +#define SCE_TCL_WORD5 16 +#define SCE_TCL_WORD6 17 +#define SCE_TCL_WORD7 18 +#define SCE_TCL_WORD8 19 +#define SCE_TCL_COMMENT_BOX 20 +#define SCE_TCL_BLOCK_COMMENT 21 +#define SCE_H_DEFAULT 0 +#define SCE_H_TAG 1 +#define SCE_H_TAGUNKNOWN 2 +#define SCE_H_ATTRIBUTE 3 +#define SCE_H_ATTRIBUTEUNKNOWN 4 +#define SCE_H_NUMBER 5 +#define SCE_H_DOUBLESTRING 6 +#define SCE_H_SINGLESTRING 7 +#define SCE_H_OTHER 8 +#define SCE_H_COMMENT 9 +#define SCE_H_ENTITY 10 +#define SCE_H_TAGEND 11 +#define SCE_H_XMLSTART 12 +#define SCE_H_XMLEND 13 +#define SCE_H_SCRIPT 14 +#define SCE_H_ASP 15 +#define SCE_H_ASPAT 16 +#define SCE_H_CDATA 17 +#define SCE_H_QUESTION 18 +#define SCE_H_VALUE 19 +#define SCE_H_XCCOMMENT 20 +#define SCE_H_SGML_DEFAULT 21 +#define SCE_H_SGML_COMMAND 22 +#define SCE_H_SGML_1ST_PARAM 23 +#define SCE_H_SGML_DOUBLESTRING 24 +#define SCE_H_SGML_SIMPLESTRING 25 +#define SCE_H_SGML_ERROR 26 +#define SCE_H_SGML_SPECIAL 27 +#define SCE_H_SGML_ENTITY 28 +#define SCE_H_SGML_COMMENT 29 +#define SCE_H_SGML_1ST_PARAM_COMMENT 30 +#define SCE_H_SGML_BLOCK_DEFAULT 31 +#define SCE_HJ_START 40 +#define SCE_HJ_DEFAULT 41 +#define SCE_HJ_COMMENT 42 +#define SCE_HJ_COMMENTLINE 43 +#define SCE_HJ_COMMENTDOC 44 +#define SCE_HJ_NUMBER 45 +#define SCE_HJ_WORD 46 +#define SCE_HJ_KEYWORD 47 +#define SCE_HJ_DOUBLESTRING 48 +#define SCE_HJ_SINGLESTRING 49 +#define SCE_HJ_SYMBOLS 50 +#define SCE_HJ_STRINGEOL 51 +#define SCE_HJ_REGEX 52 +#define SCE_HJA_START 55 +#define SCE_HJA_DEFAULT 56 +#define SCE_HJA_COMMENT 57 +#define SCE_HJA_COMMENTLINE 58 +#define SCE_HJA_COMMENTDOC 59 +#define SCE_HJA_NUMBER 60 +#define SCE_HJA_WORD 61 +#define SCE_HJA_KEYWORD 62 +#define SCE_HJA_DOUBLESTRING 63 +#define SCE_HJA_SINGLESTRING 64 +#define SCE_HJA_SYMBOLS 65 +#define SCE_HJA_STRINGEOL 66 +#define SCE_HJA_REGEX 67 +#define SCE_HB_START 70 +#define SCE_HB_DEFAULT 71 +#define SCE_HB_COMMENTLINE 72 +#define SCE_HB_NUMBER 73 +#define SCE_HB_WORD 74 +#define SCE_HB_STRING 75 +#define SCE_HB_IDENTIFIER 76 +#define SCE_HB_STRINGEOL 77 +#define SCE_HBA_START 80 +#define SCE_HBA_DEFAULT 81 +#define SCE_HBA_COMMENTLINE 82 +#define SCE_HBA_NUMBER 83 +#define SCE_HBA_WORD 84 +#define SCE_HBA_STRING 85 +#define SCE_HBA_IDENTIFIER 86 +#define SCE_HBA_STRINGEOL 87 +#define SCE_HP_START 90 +#define SCE_HP_DEFAULT 91 +#define SCE_HP_COMMENTLINE 92 +#define SCE_HP_NUMBER 93 +#define SCE_HP_STRING 94 +#define SCE_HP_CHARACTER 95 +#define SCE_HP_WORD 96 +#define SCE_HP_TRIPLE 97 +#define SCE_HP_TRIPLEDOUBLE 98 +#define SCE_HP_CLASSNAME 99 +#define SCE_HP_DEFNAME 100 +#define SCE_HP_OPERATOR 101 +#define SCE_HP_IDENTIFIER 102 +#define SCE_HPHP_COMPLEX_VARIABLE 104 +#define SCE_HPA_START 105 +#define SCE_HPA_DEFAULT 106 +#define SCE_HPA_COMMENTLINE 107 +#define SCE_HPA_NUMBER 108 +#define SCE_HPA_STRING 109 +#define SCE_HPA_CHARACTER 110 +#define SCE_HPA_WORD 111 +#define SCE_HPA_TRIPLE 112 +#define SCE_HPA_TRIPLEDOUBLE 113 +#define SCE_HPA_CLASSNAME 114 +#define SCE_HPA_DEFNAME 115 +#define SCE_HPA_OPERATOR 116 +#define SCE_HPA_IDENTIFIER 117 +#define SCE_HPHP_DEFAULT 118 +#define SCE_HPHP_HSTRING 119 +#define SCE_HPHP_SIMPLESTRING 120 +#define SCE_HPHP_WORD 121 +#define SCE_HPHP_NUMBER 122 +#define SCE_HPHP_VARIABLE 123 +#define SCE_HPHP_COMMENT 124 +#define SCE_HPHP_COMMENTLINE 125 +#define SCE_HPHP_HSTRING_VARIABLE 126 +#define SCE_HPHP_OPERATOR 127 +#define SCE_PL_DEFAULT 0 +#define SCE_PL_ERROR 1 +#define SCE_PL_COMMENTLINE 2 +#define SCE_PL_POD 3 +#define SCE_PL_NUMBER 4 +#define SCE_PL_WORD 5 +#define SCE_PL_STRING 6 +#define SCE_PL_CHARACTER 7 +#define SCE_PL_PUNCTUATION 8 +#define SCE_PL_PREPROCESSOR 9 +#define SCE_PL_OPERATOR 10 +#define SCE_PL_IDENTIFIER 11 +#define SCE_PL_SCALAR 12 +#define SCE_PL_ARRAY 13 +#define SCE_PL_HASH 14 +#define SCE_PL_SYMBOLTABLE 15 +#define SCE_PL_VARIABLE_INDEXER 16 +#define SCE_PL_REGEX 17 +#define SCE_PL_REGSUBST 18 +#define SCE_PL_LONGQUOTE 19 +#define SCE_PL_BACKTICKS 20 +#define SCE_PL_DATASECTION 21 +#define SCE_PL_HERE_DELIM 22 +#define SCE_PL_HERE_Q 23 +#define SCE_PL_HERE_QQ 24 +#define SCE_PL_HERE_QX 25 +#define SCE_PL_STRING_Q 26 +#define SCE_PL_STRING_QQ 27 +#define SCE_PL_STRING_QX 28 +#define SCE_PL_STRING_QR 29 +#define SCE_PL_STRING_QW 30 +#define SCE_PL_POD_VERB 31 +#define SCE_RB_DEFAULT 0 +#define SCE_RB_ERROR 1 +#define SCE_RB_COMMENTLINE 2 +#define SCE_RB_POD 3 +#define SCE_RB_NUMBER 4 +#define SCE_RB_WORD 5 +#define SCE_RB_STRING 6 +#define SCE_RB_CHARACTER 7 +#define SCE_RB_CLASSNAME 8 +#define SCE_RB_DEFNAME 9 +#define SCE_RB_OPERATOR 10 +#define SCE_RB_IDENTIFIER 11 +#define SCE_RB_REGEX 12 +#define SCE_RB_GLOBAL 13 +#define SCE_RB_SYMBOL 14 +#define SCE_RB_MODULE_NAME 15 +#define SCE_RB_INSTANCE_VAR 16 +#define SCE_RB_CLASS_VAR 17 +#define SCE_RB_BACKTICKS 18 +#define SCE_RB_DATASECTION 19 +#define SCE_RB_HERE_DELIM 20 +#define SCE_RB_HERE_Q 21 +#define SCE_RB_HERE_QQ 22 +#define SCE_RB_HERE_QX 23 +#define SCE_RB_STRING_Q 24 +#define SCE_RB_STRING_QQ 25 +#define SCE_RB_STRING_QX 26 +#define SCE_RB_STRING_QR 27 +#define SCE_RB_STRING_QW 28 +#define SCE_RB_WORD_DEMOTED 29 +#define SCE_RB_STDIN 30 +#define SCE_RB_STDOUT 31 +#define SCE_RB_STDERR 40 +#define SCE_RB_UPPER_BOUND 41 +#define SCE_B_DEFAULT 0 +#define SCE_B_COMMENT 1 +#define SCE_B_NUMBER 2 +#define SCE_B_KEYWORD 3 +#define SCE_B_STRING 4 +#define SCE_B_PREPROCESSOR 5 +#define SCE_B_OPERATOR 6 +#define SCE_B_IDENTIFIER 7 +#define SCE_B_DATE 8 +#define SCE_B_STRINGEOL 9 +#define SCE_B_KEYWORD2 10 +#define SCE_B_KEYWORD3 11 +#define SCE_B_KEYWORD4 12 +#define SCE_B_CONSTANT 13 +#define SCE_B_ASM 14 +#define SCE_B_LABEL 15 +#define SCE_B_ERROR 16 +#define SCE_B_HEXNUMBER 17 +#define SCE_B_BINNUMBER 18 +#define SCE_PROPS_DEFAULT 0 +#define SCE_PROPS_COMMENT 1 +#define SCE_PROPS_SECTION 2 +#define SCE_PROPS_ASSIGNMENT 3 +#define SCE_PROPS_DEFVAL 4 +#define SCE_PROPS_KEY 5 +#define SCE_L_DEFAULT 0 +#define SCE_L_COMMAND 1 +#define SCE_L_TAG 2 +#define SCE_L_MATH 3 +#define SCE_L_COMMENT 4 +#define SCE_LUA_DEFAULT 0 +#define SCE_LUA_COMMENT 1 +#define SCE_LUA_COMMENTLINE 2 +#define SCE_LUA_COMMENTDOC 3 +#define SCE_LUA_NUMBER 4 +#define SCE_LUA_WORD 5 +#define SCE_LUA_STRING 6 +#define SCE_LUA_CHARACTER 7 +#define SCE_LUA_LITERALSTRING 8 +#define SCE_LUA_PREPROCESSOR 9 +#define SCE_LUA_OPERATOR 10 +#define SCE_LUA_IDENTIFIER 11 +#define SCE_LUA_STRINGEOL 12 +#define SCE_LUA_WORD2 13 +#define SCE_LUA_WORD3 14 +#define SCE_LUA_WORD4 15 +#define SCE_LUA_WORD5 16 +#define SCE_LUA_WORD6 17 +#define SCE_LUA_WORD7 18 +#define SCE_LUA_WORD8 19 +#define SCE_ERR_DEFAULT 0 +#define SCE_ERR_PYTHON 1 +#define SCE_ERR_GCC 2 +#define SCE_ERR_MS 3 +#define SCE_ERR_CMD 4 +#define SCE_ERR_BORLAND 5 +#define SCE_ERR_PERL 6 +#define SCE_ERR_NET 7 +#define SCE_ERR_LUA 8 +#define SCE_ERR_CTAG 9 +#define SCE_ERR_DIFF_CHANGED 10 +#define SCE_ERR_DIFF_ADDITION 11 +#define SCE_ERR_DIFF_DELETION 12 +#define SCE_ERR_DIFF_MESSAGE 13 +#define SCE_ERR_PHP 14 +#define SCE_ERR_ELF 15 +#define SCE_ERR_IFC 16 +#define SCE_ERR_IFORT 17 +#define SCE_ERR_ABSF 18 +#define SCE_ERR_TIDY 19 +#define SCE_ERR_JAVA_STACK 20 +#define SCE_BAT_DEFAULT 0 +#define SCE_BAT_COMMENT 1 +#define SCE_BAT_WORD 2 +#define SCE_BAT_LABEL 3 +#define SCE_BAT_HIDE 4 +#define SCE_BAT_COMMAND 5 +#define SCE_BAT_IDENTIFIER 6 +#define SCE_BAT_OPERATOR 7 +#define SCE_MAKE_DEFAULT 0 +#define SCE_MAKE_COMMENT 1 +#define SCE_MAKE_PREPROCESSOR 2 +#define SCE_MAKE_IDENTIFIER 3 +#define SCE_MAKE_OPERATOR 4 +#define SCE_MAKE_TARGET 5 +#define SCE_MAKE_IDEOL 9 +#define SCE_DIFF_DEFAULT 0 +#define SCE_DIFF_COMMENT 1 +#define SCE_DIFF_COMMAND 2 +#define SCE_DIFF_HEADER 3 +#define SCE_DIFF_POSITION 4 +#define SCE_DIFF_DELETED 5 +#define SCE_DIFF_ADDED 6 +#define SCE_CONF_DEFAULT 0 +#define SCE_CONF_COMMENT 1 +#define SCE_CONF_NUMBER 2 +#define SCE_CONF_IDENTIFIER 3 +#define SCE_CONF_EXTENSION 4 +#define SCE_CONF_PARAMETER 5 +#define SCE_CONF_STRING 6 +#define SCE_CONF_OPERATOR 7 +#define SCE_CONF_IP 8 +#define SCE_CONF_DIRECTIVE 9 +#define SCE_AVE_DEFAULT 0 +#define SCE_AVE_COMMENT 1 +#define SCE_AVE_NUMBER 2 +#define SCE_AVE_WORD 3 +#define SCE_AVE_STRING 6 +#define SCE_AVE_ENUM 7 +#define SCE_AVE_STRINGEOL 8 +#define SCE_AVE_IDENTIFIER 9 +#define SCE_AVE_OPERATOR 10 +#define SCE_AVE_WORD1 11 +#define SCE_AVE_WORD2 12 +#define SCE_AVE_WORD3 13 +#define SCE_AVE_WORD4 14 +#define SCE_AVE_WORD5 15 +#define SCE_AVE_WORD6 16 +#define SCE_ADA_DEFAULT 0 +#define SCE_ADA_WORD 1 +#define SCE_ADA_IDENTIFIER 2 +#define SCE_ADA_NUMBER 3 +#define SCE_ADA_DELIMITER 4 +#define SCE_ADA_CHARACTER 5 +#define SCE_ADA_CHARACTEREOL 6 +#define SCE_ADA_STRING 7 +#define SCE_ADA_STRINGEOL 8 +#define SCE_ADA_LABEL 9 +#define SCE_ADA_COMMENTLINE 10 +#define SCE_ADA_ILLEGAL 11 +#define SCE_BAAN_DEFAULT 0 +#define SCE_BAAN_COMMENT 1 +#define SCE_BAAN_COMMENTDOC 2 +#define SCE_BAAN_NUMBER 3 +#define SCE_BAAN_WORD 4 +#define SCE_BAAN_STRING 5 +#define SCE_BAAN_PREPROCESSOR 6 +#define SCE_BAAN_OPERATOR 7 +#define SCE_BAAN_IDENTIFIER 8 +#define SCE_BAAN_STRINGEOL 9 +#define SCE_BAAN_WORD2 10 +#define SCE_LISP_DEFAULT 0 +#define SCE_LISP_COMMENT 1 +#define SCE_LISP_NUMBER 2 +#define SCE_LISP_KEYWORD 3 +#define SCE_LISP_KEYWORD_KW 4 +#define SCE_LISP_SYMBOL 5 +#define SCE_LISP_STRING 6 +#define SCE_LISP_STRINGEOL 8 +#define SCE_LISP_IDENTIFIER 9 +#define SCE_LISP_OPERATOR 10 +#define SCE_LISP_SPECIAL 11 +#define SCE_LISP_MULTI_COMMENT 12 +#define SCE_EIFFEL_DEFAULT 0 +#define SCE_EIFFEL_COMMENTLINE 1 +#define SCE_EIFFEL_NUMBER 2 +#define SCE_EIFFEL_WORD 3 +#define SCE_EIFFEL_STRING 4 +#define SCE_EIFFEL_CHARACTER 5 +#define SCE_EIFFEL_OPERATOR 6 +#define SCE_EIFFEL_IDENTIFIER 7 +#define SCE_EIFFEL_STRINGEOL 8 +#define SCE_NNCRONTAB_DEFAULT 0 +#define SCE_NNCRONTAB_COMMENT 1 +#define SCE_NNCRONTAB_TASK 2 +#define SCE_NNCRONTAB_SECTION 3 +#define SCE_NNCRONTAB_KEYWORD 4 +#define SCE_NNCRONTAB_MODIFIER 5 +#define SCE_NNCRONTAB_ASTERISK 6 +#define SCE_NNCRONTAB_NUMBER 7 +#define SCE_NNCRONTAB_STRING 8 +#define SCE_NNCRONTAB_ENVIRONMENT 9 +#define SCE_NNCRONTAB_IDENTIFIER 10 +#define SCE_FORTH_DEFAULT 0 +#define SCE_FORTH_COMMENT 1 +#define SCE_FORTH_COMMENT_ML 2 +#define SCE_FORTH_IDENTIFIER 3 +#define SCE_FORTH_CONTROL 4 +#define SCE_FORTH_KEYWORD 5 +#define SCE_FORTH_DEFWORD 6 +#define SCE_FORTH_PREWORD1 7 +#define SCE_FORTH_PREWORD2 8 +#define SCE_FORTH_NUMBER 9 +#define SCE_FORTH_STRING 10 +#define SCE_FORTH_LOCALE 11 +#define SCE_MATLAB_DEFAULT 0 +#define SCE_MATLAB_COMMENT 1 +#define SCE_MATLAB_COMMAND 2 +#define SCE_MATLAB_NUMBER 3 +#define SCE_MATLAB_KEYWORD 4 +#define SCE_MATLAB_STRING 5 +#define SCE_MATLAB_OPERATOR 6 +#define SCE_MATLAB_IDENTIFIER 7 +#define SCE_MATLAB_DOUBLEQUOTESTRING 8 +#define SCE_SCRIPTOL_DEFAULT 0 +#define SCE_SCRIPTOL_WHITE 1 +#define SCE_SCRIPTOL_COMMENTLINE 2 +#define SCE_SCRIPTOL_PERSISTENT 3 +#define SCE_SCRIPTOL_CSTYLE 4 +#define SCE_SCRIPTOL_COMMENTBLOCK 5 +#define SCE_SCRIPTOL_NUMBER 6 +#define SCE_SCRIPTOL_STRING 7 +#define SCE_SCRIPTOL_CHARACTER 8 +#define SCE_SCRIPTOL_STRINGEOL 9 +#define SCE_SCRIPTOL_KEYWORD 10 +#define SCE_SCRIPTOL_OPERATOR 11 +#define SCE_SCRIPTOL_IDENTIFIER 12 +#define SCE_SCRIPTOL_TRIPLE 13 +#define SCE_SCRIPTOL_CLASSNAME 14 +#define SCE_SCRIPTOL_PREPROCESSOR 15 +#define SCE_ASM_DEFAULT 0 +#define SCE_ASM_COMMENT 1 +#define SCE_ASM_NUMBER 2 +#define SCE_ASM_STRING 3 +#define SCE_ASM_OPERATOR 4 +#define SCE_ASM_IDENTIFIER 5 +#define SCE_ASM_CPUINSTRUCTION 6 +#define SCE_ASM_MATHINSTRUCTION 7 +#define SCE_ASM_REGISTER 8 +#define SCE_ASM_DIRECTIVE 9 +#define SCE_ASM_DIRECTIVEOPERAND 10 +#define SCE_ASM_COMMENTBLOCK 11 +#define SCE_ASM_CHARACTER 12 +#define SCE_ASM_STRINGEOL 13 +#define SCE_ASM_EXTINSTRUCTION 14 +#define SCE_F_DEFAULT 0 +#define SCE_F_COMMENT 1 +#define SCE_F_NUMBER 2 +#define SCE_F_STRING1 3 +#define SCE_F_STRING2 4 +#define SCE_F_STRINGEOL 5 +#define SCE_F_OPERATOR 6 +#define SCE_F_IDENTIFIER 7 +#define SCE_F_WORD 8 +#define SCE_F_WORD2 9 +#define SCE_F_WORD3 10 +#define SCE_F_PREPROCESSOR 11 +#define SCE_F_OPERATOR2 12 +#define SCE_F_LABEL 13 +#define SCE_F_CONTINUATION 14 +#define SCE_CSS_DEFAULT 0 +#define SCE_CSS_TAG 1 +#define SCE_CSS_CLASS 2 +#define SCE_CSS_PSEUDOCLASS 3 +#define SCE_CSS_UNKNOWN_PSEUDOCLASS 4 +#define SCE_CSS_OPERATOR 5 +#define SCE_CSS_IDENTIFIER 6 +#define SCE_CSS_UNKNOWN_IDENTIFIER 7 +#define SCE_CSS_VALUE 8 +#define SCE_CSS_COMMENT 9 +#define SCE_CSS_ID 10 +#define SCE_CSS_IMPORTANT 11 +#define SCE_CSS_DIRECTIVE 12 +#define SCE_CSS_DOUBLESTRING 13 +#define SCE_CSS_SINGLESTRING 14 +#define SCE_CSS_IDENTIFIER2 15 +#define SCE_CSS_ATTRIBUTE 16 +#define SCE_POV_DEFAULT 0 +#define SCE_POV_COMMENT 1 +#define SCE_POV_COMMENTLINE 2 +#define SCE_POV_NUMBER 3 +#define SCE_POV_OPERATOR 4 +#define SCE_POV_IDENTIFIER 5 +#define SCE_POV_STRING 6 +#define SCE_POV_STRINGEOL 7 +#define SCE_POV_DIRECTIVE 8 +#define SCE_POV_BADDIRECTIVE 9 +#define SCE_POV_WORD2 10 +#define SCE_POV_WORD3 11 +#define SCE_POV_WORD4 12 +#define SCE_POV_WORD5 13 +#define SCE_POV_WORD6 14 +#define SCE_POV_WORD7 15 +#define SCE_POV_WORD8 16 +#define SCE_LOUT_DEFAULT 0 +#define SCE_LOUT_COMMENT 1 +#define SCE_LOUT_NUMBER 2 +#define SCE_LOUT_WORD 3 +#define SCE_LOUT_WORD2 4 +#define SCE_LOUT_WORD3 5 +#define SCE_LOUT_WORD4 6 +#define SCE_LOUT_STRING 7 +#define SCE_LOUT_OPERATOR 8 +#define SCE_LOUT_IDENTIFIER 9 +#define SCE_LOUT_STRINGEOL 10 +#define SCE_ESCRIPT_DEFAULT 0 +#define SCE_ESCRIPT_COMMENT 1 +#define SCE_ESCRIPT_COMMENTLINE 2 +#define SCE_ESCRIPT_COMMENTDOC 3 +#define SCE_ESCRIPT_NUMBER 4 +#define SCE_ESCRIPT_WORD 5 +#define SCE_ESCRIPT_STRING 6 +#define SCE_ESCRIPT_OPERATOR 7 +#define SCE_ESCRIPT_IDENTIFIER 8 +#define SCE_ESCRIPT_BRACE 9 +#define SCE_ESCRIPT_WORD2 10 +#define SCE_ESCRIPT_WORD3 11 +#define SCE_PS_DEFAULT 0 +#define SCE_PS_COMMENT 1 +#define SCE_PS_DSC_COMMENT 2 +#define SCE_PS_DSC_VALUE 3 +#define SCE_PS_NUMBER 4 +#define SCE_PS_NAME 5 +#define SCE_PS_KEYWORD 6 +#define SCE_PS_LITERAL 7 +#define SCE_PS_IMMEVAL 8 +#define SCE_PS_PAREN_ARRAY 9 +#define SCE_PS_PAREN_DICT 10 +#define SCE_PS_PAREN_PROC 11 +#define SCE_PS_TEXT 12 +#define SCE_PS_HEXSTRING 13 +#define SCE_PS_BASE85STRING 14 +#define SCE_PS_BADSTRINGCHAR 15 +#define SCE_NSIS_DEFAULT 0 +#define SCE_NSIS_COMMENT 1 +#define SCE_NSIS_STRINGDQ 2 +#define SCE_NSIS_STRINGLQ 3 +#define SCE_NSIS_STRINGRQ 4 +#define SCE_NSIS_FUNCTION 5 +#define SCE_NSIS_VARIABLE 6 +#define SCE_NSIS_LABEL 7 +#define SCE_NSIS_USERDEFINED 8 +#define SCE_NSIS_SECTIONDEF 9 +#define SCE_NSIS_SUBSECTIONDEF 10 +#define SCE_NSIS_IFDEFINEDEF 11 +#define SCE_NSIS_MACRODEF 12 +#define SCE_NSIS_STRINGVAR 13 +#define SCE_NSIS_NUMBER 14 +#define SCE_NSIS_SECTIONGROUP 15 +#define SCE_NSIS_PAGEEX 16 +#define SCE_NSIS_FUNCTIONDEF 17 +#define SCE_NSIS_COMMENTBOX 18 +#define SCE_MMIXAL_LEADWS 0 +#define SCE_MMIXAL_COMMENT 1 +#define SCE_MMIXAL_LABEL 2 +#define SCE_MMIXAL_OPCODE 3 +#define SCE_MMIXAL_OPCODE_PRE 4 +#define SCE_MMIXAL_OPCODE_VALID 5 +#define SCE_MMIXAL_OPCODE_UNKNOWN 6 +#define SCE_MMIXAL_OPCODE_POST 7 +#define SCE_MMIXAL_OPERANDS 8 +#define SCE_MMIXAL_NUMBER 9 +#define SCE_MMIXAL_REF 10 +#define SCE_MMIXAL_CHAR 11 +#define SCE_MMIXAL_STRING 12 +#define SCE_MMIXAL_REGISTER 13 +#define SCE_MMIXAL_HEX 14 +#define SCE_MMIXAL_OPERATOR 15 +#define SCE_MMIXAL_SYMBOL 16 +#define SCE_MMIXAL_INCLUDE 17 +#define SCE_CLW_DEFAULT 0 +#define SCE_CLW_LABEL 1 +#define SCE_CLW_COMMENT 2 +#define SCE_CLW_STRING 3 +#define SCE_CLW_USER_IDENTIFIER 4 +#define SCE_CLW_INTEGER_CONSTANT 5 +#define SCE_CLW_REAL_CONSTANT 6 +#define SCE_CLW_PICTURE_STRING 7 +#define SCE_CLW_KEYWORD 8 +#define SCE_CLW_COMPILER_DIRECTIVE 9 +#define SCE_CLW_RUNTIME_EXPRESSIONS 10 +#define SCE_CLW_BUILTIN_PROCEDURES_FUNCTION 11 +#define SCE_CLW_STRUCTURE_DATA_TYPE 12 +#define SCE_CLW_ATTRIBUTE 13 +#define SCE_CLW_STANDARD_EQUATE 14 +#define SCE_CLW_ERROR 15 +#define SCE_CLW_DEPRECATED 16 +#define SCE_LOT_DEFAULT 0 +#define SCE_LOT_HEADER 1 +#define SCE_LOT_BREAK 2 +#define SCE_LOT_SET 3 +#define SCE_LOT_PASS 4 +#define SCE_LOT_FAIL 5 +#define SCE_LOT_ABORT 6 +#define SCE_YAML_DEFAULT 0 +#define SCE_YAML_COMMENT 1 +#define SCE_YAML_IDENTIFIER 2 +#define SCE_YAML_KEYWORD 3 +#define SCE_YAML_NUMBER 4 +#define SCE_YAML_REFERENCE 5 +#define SCE_YAML_DOCUMENT 6 +#define SCE_YAML_TEXT 7 +#define SCE_YAML_ERROR 8 +#define SCE_TEX_DEFAULT 0 +#define SCE_TEX_SPECIAL 1 +#define SCE_TEX_GROUP 2 +#define SCE_TEX_SYMBOL 3 +#define SCE_TEX_COMMAND 4 +#define SCE_TEX_TEXT 5 +#define SCE_METAPOST_DEFAULT 0 +#define SCE_METAPOST_SPECIAL 1 +#define SCE_METAPOST_GROUP 2 +#define SCE_METAPOST_SYMBOL 3 +#define SCE_METAPOST_COMMAND 4 +#define SCE_METAPOST_TEXT 5 +#define SCE_METAPOST_EXTRA 6 +#define SCE_ERLANG_DEFAULT 0 +#define SCE_ERLANG_COMMENT 1 +#define SCE_ERLANG_VARIABLE 2 +#define SCE_ERLANG_NUMBER 3 +#define SCE_ERLANG_KEYWORD 4 +#define SCE_ERLANG_STRING 5 +#define SCE_ERLANG_OPERATOR 6 +#define SCE_ERLANG_ATOM 7 +#define SCE_ERLANG_FUNCTION_NAME 8 +#define SCE_ERLANG_CHARACTER 9 +#define SCE_ERLANG_MACRO 10 +#define SCE_ERLANG_RECORD 11 +#define SCE_ERLANG_SEPARATOR 12 +#define SCE_ERLANG_NODE_NAME 13 +#define SCE_ERLANG_UNKNOWN 31 +#define SCE_MSSQL_DEFAULT 0 +#define SCE_MSSQL_COMMENT 1 +#define SCE_MSSQL_LINE_COMMENT 2 +#define SCE_MSSQL_NUMBER 3 +#define SCE_MSSQL_STRING 4 +#define SCE_MSSQL_OPERATOR 5 +#define SCE_MSSQL_IDENTIFIER 6 +#define SCE_MSSQL_VARIABLE 7 +#define SCE_MSSQL_COLUMN_NAME 8 +#define SCE_MSSQL_STATEMENT 9 +#define SCE_MSSQL_DATATYPE 10 +#define SCE_MSSQL_SYSTABLE 11 +#define SCE_MSSQL_GLOBAL_VARIABLE 12 +#define SCE_MSSQL_FUNCTION 13 +#define SCE_MSSQL_STORED_PROCEDURE 14 +#define SCE_MSSQL_DEFAULT_PREF_DATATYPE 15 +#define SCE_MSSQL_COLUMN_NAME_2 16 +#define SCE_V_DEFAULT 0 +#define SCE_V_COMMENT 1 +#define SCE_V_COMMENTLINE 2 +#define SCE_V_COMMENTLINEBANG 3 +#define SCE_V_NUMBER 4 +#define SCE_V_WORD 5 +#define SCE_V_STRING 6 +#define SCE_V_WORD2 7 +#define SCE_V_WORD3 8 +#define SCE_V_PREPROCESSOR 9 +#define SCE_V_OPERATOR 10 +#define SCE_V_IDENTIFIER 11 +#define SCE_V_STRINGEOL 12 +#define SCE_V_USER 19 +#define SCE_KIX_DEFAULT 0 +#define SCE_KIX_COMMENT 1 +#define SCE_KIX_STRING1 2 +#define SCE_KIX_STRING2 3 +#define SCE_KIX_NUMBER 4 +#define SCE_KIX_VAR 5 +#define SCE_KIX_MACRO 6 +#define SCE_KIX_KEYWORD 7 +#define SCE_KIX_FUNCTIONS 8 +#define SCE_KIX_OPERATOR 9 +#define SCE_KIX_IDENTIFIER 31 +#define SCE_GC_DEFAULT 0 +#define SCE_GC_COMMENTLINE 1 +#define SCE_GC_COMMENTBLOCK 2 +#define SCE_GC_GLOBAL 3 +#define SCE_GC_EVENT 4 +#define SCE_GC_ATTRIBUTE 5 +#define SCE_GC_CONTROL 6 +#define SCE_GC_COMMAND 7 +#define SCE_GC_STRING 8 +#define SCE_GC_OPERATOR 9 +#define SCE_SN_DEFAULT 0 +#define SCE_SN_CODE 1 +#define SCE_SN_COMMENTLINE 2 +#define SCE_SN_COMMENTLINEBANG 3 +#define SCE_SN_NUMBER 4 +#define SCE_SN_WORD 5 +#define SCE_SN_STRING 6 +#define SCE_SN_WORD2 7 +#define SCE_SN_WORD3 8 +#define SCE_SN_PREPROCESSOR 9 +#define SCE_SN_OPERATOR 10 +#define SCE_SN_IDENTIFIER 11 +#define SCE_SN_STRINGEOL 12 +#define SCE_SN_REGEXTAG 13 +#define SCE_SN_SIGNAL 14 +#define SCE_SN_USER 19 +#define SCE_AU3_DEFAULT 0 +#define SCE_AU3_COMMENT 1 +#define SCE_AU3_COMMENTBLOCK 2 +#define SCE_AU3_NUMBER 3 +#define SCE_AU3_FUNCTION 4 +#define SCE_AU3_KEYWORD 5 +#define SCE_AU3_MACRO 6 +#define SCE_AU3_STRING 7 +#define SCE_AU3_OPERATOR 8 +#define SCE_AU3_VARIABLE 9 +#define SCE_AU3_SENT 10 +#define SCE_AU3_PREPROCESSOR 11 +#define SCE_AU3_SPECIAL 12 +#define SCE_AU3_EXPAND 13 +#define SCE_AU3_COMOBJ 14 +#define SCE_AU3_UDF 15 +#define SCE_APDL_DEFAULT 0 +#define SCE_APDL_COMMENT 1 +#define SCE_APDL_COMMENTBLOCK 2 +#define SCE_APDL_NUMBER 3 +#define SCE_APDL_STRING 4 +#define SCE_APDL_OPERATOR 5 +#define SCE_APDL_WORD 6 +#define SCE_APDL_PROCESSOR 7 +#define SCE_APDL_COMMAND 8 +#define SCE_APDL_SLASHCOMMAND 9 +#define SCE_APDL_STARCOMMAND 10 +#define SCE_APDL_ARGUMENT 11 +#define SCE_APDL_FUNCTION 12 +#define SCE_SH_DEFAULT 0 +#define SCE_SH_ERROR 1 +#define SCE_SH_COMMENTLINE 2 +#define SCE_SH_NUMBER 3 +#define SCE_SH_WORD 4 +#define SCE_SH_STRING 5 +#define SCE_SH_CHARACTER 6 +#define SCE_SH_OPERATOR 7 +#define SCE_SH_IDENTIFIER 8 +#define SCE_SH_SCALAR 9 +#define SCE_SH_PARAM 10 +#define SCE_SH_BACKTICKS 11 +#define SCE_SH_HERE_DELIM 12 +#define SCE_SH_HERE_Q 13 +#define SCE_ASN1_DEFAULT 0 +#define SCE_ASN1_COMMENT 1 +#define SCE_ASN1_IDENTIFIER 2 +#define SCE_ASN1_STRING 3 +#define SCE_ASN1_OID 4 +#define SCE_ASN1_SCALAR 5 +#define SCE_ASN1_KEYWORD 6 +#define SCE_ASN1_ATTRIBUTE 7 +#define SCE_ASN1_DESCRIPTOR 8 +#define SCE_ASN1_TYPE 9 +#define SCE_ASN1_OPERATOR 10 +#define SCE_VHDL_DEFAULT 0 +#define SCE_VHDL_COMMENT 1 +#define SCE_VHDL_COMMENTLINEBANG 2 +#define SCE_VHDL_NUMBER 3 +#define SCE_VHDL_STRING 4 +#define SCE_VHDL_OPERATOR 5 +#define SCE_VHDL_IDENTIFIER 6 +#define SCE_VHDL_STRINGEOL 7 +#define SCE_VHDL_KEYWORD 8 +#define SCE_VHDL_STDOPERATOR 9 +#define SCE_VHDL_ATTRIBUTE 10 +#define SCE_VHDL_STDFUNCTION 11 +#define SCE_VHDL_STDPACKAGE 12 +#define SCE_VHDL_STDTYPE 13 +#define SCE_VHDL_USERWORD 14 +#define SCE_CAML_DEFAULT 0 +#define SCE_CAML_IDENTIFIER 1 +#define SCE_CAML_TAGNAME 2 +#define SCE_CAML_KEYWORD 3 +#define SCE_CAML_KEYWORD2 4 +#define SCE_CAML_KEYWORD3 5 +#define SCE_CAML_LINENUM 6 +#define SCE_CAML_OPERATOR 7 +#define SCE_CAML_NUMBER 8 +#define SCE_CAML_CHAR 9 +#define SCE_CAML_STRING 11 +#define SCE_CAML_COMMENT 12 +#define SCE_CAML_COMMENT1 13 +#define SCE_CAML_COMMENT2 14 +#define SCE_CAML_COMMENT3 15 +#define SCE_HA_DEFAULT 0 +#define SCE_HA_IDENTIFIER 1 +#define SCE_HA_KEYWORD 2 +#define SCE_HA_NUMBER 3 +#define SCE_HA_STRING 4 +#define SCE_HA_CHARACTER 5 +#define SCE_HA_CLASS 6 +#define SCE_HA_MODULE 7 +#define SCE_HA_CAPITAL 8 +#define SCE_HA_DATA 9 +#define SCE_HA_IMPORT 10 +#define SCE_HA_OPERATOR 11 +#define SCE_HA_INSTANCE 12 +#define SCE_HA_COMMENTLINE 13 +#define SCE_HA_COMMENTBLOCK 14 +#define SCE_HA_COMMENTBLOCK2 15 +#define SCE_HA_COMMENTBLOCK3 16 +#define SCE_T3_DEFAULT 0 +#define SCE_T3_X_DEFAULT 1 +#define SCE_T3_PREPROCESSOR 2 +#define SCE_T3_BLOCK_COMMENT 3 +#define SCE_T3_LINE_COMMENT 4 +#define SCE_T3_OPERATOR 5 +#define SCE_T3_KEYWORD 6 +#define SCE_T3_NUMBER 7 +#define SCE_T3_IDENTIFIER 8 +#define SCE_T3_S_STRING 9 +#define SCE_T3_D_STRING 10 +#define SCE_T3_X_STRING 11 +#define SCE_T3_LIB_DIRECTIVE 12 +#define SCE_T3_MSG_PARAM 13 +#define SCE_T3_HTML_TAG 14 +#define SCE_T3_HTML_DEFAULT 15 +#define SCE_T3_HTML_STRING 16 +#define SCE_T3_USER1 17 +#define SCE_T3_USER2 18 +#define SCE_T3_USER3 19 +#define SCE_T3_BRACE 20 +#define SCE_REBOL_DEFAULT 0 +#define SCE_REBOL_COMMENTLINE 1 +#define SCE_REBOL_COMMENTBLOCK 2 +#define SCE_REBOL_PREFACE 3 +#define SCE_REBOL_OPERATOR 4 +#define SCE_REBOL_CHARACTER 5 +#define SCE_REBOL_QUOTEDSTRING 6 +#define SCE_REBOL_BRACEDSTRING 7 +#define SCE_REBOL_NUMBER 8 +#define SCE_REBOL_PAIR 9 +#define SCE_REBOL_TUPLE 10 +#define SCE_REBOL_BINARY 11 +#define SCE_REBOL_MONEY 12 +#define SCE_REBOL_ISSUE 13 +#define SCE_REBOL_TAG 14 +#define SCE_REBOL_FILE 15 +#define SCE_REBOL_EMAIL 16 +#define SCE_REBOL_URL 17 +#define SCE_REBOL_DATE 18 +#define SCE_REBOL_TIME 19 +#define SCE_REBOL_IDENTIFIER 20 +#define SCE_REBOL_WORD 21 +#define SCE_REBOL_WORD2 22 +#define SCE_REBOL_WORD3 23 +#define SCE_REBOL_WORD4 24 +#define SCE_REBOL_WORD5 25 +#define SCE_REBOL_WORD6 26 +#define SCE_REBOL_WORD7 27 +#define SCE_REBOL_WORD8 28 +#define SCE_SQL_DEFAULT 0 +#define SCE_SQL_COMMENT 1 +#define SCE_SQL_COMMENTLINE 2 +#define SCE_SQL_COMMENTDOC 3 +#define SCE_SQL_NUMBER 4 +#define SCE_SQL_WORD 5 +#define SCE_SQL_STRING 6 +#define SCE_SQL_CHARACTER 7 +#define SCE_SQL_SQLPLUS 8 +#define SCE_SQL_SQLPLUS_PROMPT 9 +#define SCE_SQL_OPERATOR 10 +#define SCE_SQL_IDENTIFIER 11 +#define SCE_SQL_SQLPLUS_COMMENT 13 +#define SCE_SQL_COMMENTLINEDOC 15 +#define SCE_SQL_WORD2 16 +#define SCE_SQL_COMMENTDOCKEYWORD 17 +#define SCE_SQL_COMMENTDOCKEYWORDERROR 18 +#define SCE_SQL_USER1 19 +#define SCE_SQL_USER2 20 +#define SCE_SQL_USER3 21 +#define SCE_SQL_USER4 22 +#define SCE_SQL_QUOTEDIDENTIFIER 23 +#define SCE_ST_DEFAULT 0 +#define SCE_ST_STRING 1 +#define SCE_ST_NUMBER 2 +#define SCE_ST_COMMENT 3 +#define SCE_ST_SYMBOL 4 +#define SCE_ST_BINARY 5 +#define SCE_ST_BOOL 6 +#define SCE_ST_SELF 7 +#define SCE_ST_SUPER 8 +#define SCE_ST_NIL 9 +#define SCE_ST_GLOBAL 10 +#define SCE_ST_RETURN 11 +#define SCE_ST_SPECIAL 12 +#define SCE_ST_KWSEND 13 +#define SCE_ST_ASSIGN 14 +#define SCE_ST_CHARACTER 15 +#define SCE_ST_SPEC_SEL 16 +#define SCE_FS_DEFAULT 0 +#define SCE_FS_COMMENT 1 +#define SCE_FS_COMMENTLINE 2 +#define SCE_FS_COMMENTDOC 3 +#define SCE_FS_COMMENTLINEDOC 4 +#define SCE_FS_COMMENTDOCKEYWORD 5 +#define SCE_FS_COMMENTDOCKEYWORDERROR 6 +#define SCE_FS_KEYWORD 7 +#define SCE_FS_KEYWORD2 8 +#define SCE_FS_KEYWORD3 9 +#define SCE_FS_KEYWORD4 10 +#define SCE_FS_NUMBER 11 +#define SCE_FS_STRING 12 +#define SCE_FS_PREPROCESSOR 13 +#define SCE_FS_OPERATOR 14 +#define SCE_FS_IDENTIFIER 15 +#define SCE_FS_DATE 16 +#define SCE_FS_STRINGEOL 17 +#define SCE_FS_CONSTANT 18 +#define SCE_FS_ASM 19 +#define SCE_FS_LABEL 20 +#define SCE_FS_ERROR 21 +#define SCE_FS_HEXNUMBER 22 +#define SCE_FS_BINNUMBER 23 +#define SCE_CSOUND_DEFAULT 0 +#define SCE_CSOUND_COMMENT 1 +#define SCE_CSOUND_NUMBER 2 +#define SCE_CSOUND_OPERATOR 3 +#define SCE_CSOUND_INSTR 4 +#define SCE_CSOUND_IDENTIFIER 5 +#define SCE_CSOUND_OPCODE 6 +#define SCE_CSOUND_HEADERSTMT 7 +#define SCE_CSOUND_USERKEYWORD 8 +#define SCE_CSOUND_COMMENTBLOCK 9 +#define SCE_CSOUND_PARAM 10 +#define SCE_CSOUND_ARATE_VAR 11 +#define SCE_CSOUND_KRATE_VAR 12 +#define SCE_CSOUND_IRATE_VAR 13 +#define SCE_CSOUND_GLOBAL_VAR 14 +#define SCE_CSOUND_STRINGEOL 15 +#define SCE_INNO_DEFAULT 0 +#define SCE_INNO_COMMENT 1 +#define SCE_INNO_KEYWORD 2 +#define SCE_INNO_PARAMETER 3 +#define SCE_INNO_SECTION 4 +#define SCE_INNO_PREPROC 5 +#define SCE_INNO_PREPROC_INLINE 6 +#define SCE_INNO_COMMENT_PASCAL 7 +#define SCE_INNO_KEYWORD_PASCAL 8 +#define SCE_INNO_KEYWORD_USER 9 +#define SCE_INNO_STRING_DOUBLE 10 +#define SCE_INNO_STRING_SINGLE 11 +#define SCE_INNO_IDENTIFIER 12 +#define SCE_OPAL_SPACE 0 +#define SCE_OPAL_COMMENT_BLOCK 1 +#define SCE_OPAL_COMMENT_LINE 2 +#define SCE_OPAL_INTEGER 3 +#define SCE_OPAL_KEYWORD 4 +#define SCE_OPAL_SORT 5 +#define SCE_OPAL_STRING 6 +#define SCE_OPAL_PAR 7 +#define SCE_OPAL_BOOL_CONST 8 +#define SCE_OPAL_DEFAULT 32 +#define SCE_SPICE_DEFAULT 0 +#define SCE_SPICE_IDENTIFIER 1 +#define SCE_SPICE_KEYWORD 2 +#define SCE_SPICE_KEYWORD2 3 +#define SCE_SPICE_KEYWORD3 4 +#define SCE_SPICE_NUMBER 5 +#define SCE_SPICE_DELIMITER 6 +#define SCE_SPICE_VALUE 7 +#define SCE_SPICE_COMMENTLINE 8 +#define SCE_CMAKE_DEFAULT 0 +#define SCE_CMAKE_COMMENT 1 +#define SCE_CMAKE_STRINGDQ 2 +#define SCE_CMAKE_STRINGLQ 3 +#define SCE_CMAKE_STRINGRQ 4 +#define SCE_CMAKE_COMMANDS 5 +#define SCE_CMAKE_PARAMETERS 6 +#define SCE_CMAKE_VARIABLE 7 +#define SCE_CMAKE_USERDEFINED 8 +#define SCE_CMAKE_WHILEDEF 9 +#define SCE_CMAKE_FOREACHDEF 10 +#define SCE_CMAKE_IFDEFINEDEF 11 +#define SCE_CMAKE_MACRODEF 12 +#define SCE_CMAKE_STRINGVAR 13 +#define SCE_CMAKE_NUMBER 14 +#define SCLEX_ASP 29 +#define SCLEX_PHP 30 +//--Autogenerated -- end of section automatically generated from Scintilla.iface + +#endif diff --git a/scintilla/include/Scintilla.h b/scintilla/include/Scintilla.h new file mode 100644 index 00000000..f2765577 --- /dev/null +++ b/scintilla/include/Scintilla.h @@ -0,0 +1,803 @@ +// Scintilla source code edit control +/** @file Scintilla.h + ** Interface to the edit control. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +// Most of this file is automatically generated from the Scintilla.iface interface definition +// file which contains any comments about the definitions. HFacer.py does the generation. + +#ifndef SCINTILLA_H +#define SCINTILLA_H + +#if LCCWIN +typedef BOOL bool; +#endif + +#if PLAT_WIN +// Return false on failure: +bool Scintilla_RegisterClasses(void *hInstance); +bool Scintilla_ReleaseResources(); +#endif +int Scintilla_LinkLexers(); + +// Here should be placed typedefs for uptr_t, an unsigned integer type large enough to +// hold a pointer and sptr_t, a signed integer large enough to hold a pointer. +// May need to be changed for 64 bit platforms. +#if _MSC_VER >= 1300 +#include +#endif +#ifdef MAXULONG_PTR +typedef ULONG_PTR uptr_t; +typedef LONG_PTR sptr_t; +#else +typedef unsigned long uptr_t; +typedef long sptr_t; +#endif + +typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam); + +//++Autogenerated -- start of section automatically generated from Scintilla.iface +#define INVALID_POSITION -1 +#define SCI_START 2000 +#define SCI_OPTIONAL_START 3000 +#define SCI_LEXER_START 4000 +#define SCI_ADDTEXT 2001 +#define SCI_ADDSTYLEDTEXT 2002 +#define SCI_INSERTTEXT 2003 +#define SCI_CLEARALL 2004 +#define SCI_CLEARDOCUMENTSTYLE 2005 +#define SCI_GETLENGTH 2006 +#define SCI_GETCHARAT 2007 +#define SCI_GETCURRENTPOS 2008 +#define SCI_GETANCHOR 2009 +#define SCI_GETSTYLEAT 2010 +#define SCI_REDO 2011 +#define SCI_SETUNDOCOLLECTION 2012 +#define SCI_SELECTALL 2013 +#define SCI_SETSAVEPOINT 2014 +#define SCI_GETSTYLEDTEXT 2015 +#define SCI_CANREDO 2016 +#define SCI_MARKERLINEFROMHANDLE 2017 +#define SCI_MARKERDELETEHANDLE 2018 +#define SCI_GETUNDOCOLLECTION 2019 +#define SCWS_INVISIBLE 0 +#define SCWS_VISIBLEALWAYS 1 +#define SCWS_VISIBLEAFTERINDENT 2 +#define SCI_GETVIEWWS 2020 +#define SCI_SETVIEWWS 2021 +#define SCI_POSITIONFROMPOINT 2022 +#define SCI_POSITIONFROMPOINTCLOSE 2023 +#define SCI_GOTOLINE 2024 +#define SCI_GOTOPOS 2025 +#define SCI_SETANCHOR 2026 +#define SCI_GETCURLINE 2027 +#define SCI_GETENDSTYLED 2028 +#define SC_EOL_CRLF 0 +#define SC_EOL_CR 1 +#define SC_EOL_LF 2 +#define SCI_CONVERTEOLS 2029 +#define SCI_GETEOLMODE 2030 +#define SCI_SETEOLMODE 2031 +#define SCI_STARTSTYLING 2032 +#define SCI_SETSTYLING 2033 +#define SCI_GETBUFFEREDDRAW 2034 +#define SCI_SETBUFFEREDDRAW 2035 +#define SCI_SETTABWIDTH 2036 +#define SCI_GETTABWIDTH 2121 +#define SC_CP_UTF8 65001 +#define SC_CP_DBCS 1 +#define SCI_SETCODEPAGE 2037 +#define SCI_SETUSEPALETTE 2039 +#define MARKER_MAX 31 +#define SC_MARK_CIRCLE 0 +#define SC_MARK_ROUNDRECT 1 +#define SC_MARK_ARROW 2 +#define SC_MARK_SMALLRECT 3 +#define SC_MARK_SHORTARROW 4 +#define SC_MARK_EMPTY 5 +#define SC_MARK_ARROWDOWN 6 +#define SC_MARK_MINUS 7 +#define SC_MARK_PLUS 8 +#define SC_MARK_VLINE 9 +#define SC_MARK_LCORNER 10 +#define SC_MARK_TCORNER 11 +#define SC_MARK_BOXPLUS 12 +#define SC_MARK_BOXPLUSCONNECTED 13 +#define SC_MARK_BOXMINUS 14 +#define SC_MARK_BOXMINUSCONNECTED 15 +#define SC_MARK_LCORNERCURVE 16 +#define SC_MARK_TCORNERCURVE 17 +#define SC_MARK_CIRCLEPLUS 18 +#define SC_MARK_CIRCLEPLUSCONNECTED 19 +#define SC_MARK_CIRCLEMINUS 20 +#define SC_MARK_CIRCLEMINUSCONNECTED 21 +#define SC_MARK_BACKGROUND 22 +#define SC_MARK_DOTDOTDOT 23 +#define SC_MARK_ARROWS 24 +#define SC_MARK_PIXMAP 25 +#define SC_MARK_FULLRECT 26 +#define SC_MARK_CHARACTER 10000 +#define SC_MARKNUM_FOLDEREND 25 +#define SC_MARKNUM_FOLDEROPENMID 26 +#define SC_MARKNUM_FOLDERMIDTAIL 27 +#define SC_MARKNUM_FOLDERTAIL 28 +#define SC_MARKNUM_FOLDERSUB 29 +#define SC_MARKNUM_FOLDER 30 +#define SC_MARKNUM_FOLDEROPEN 31 +#define SC_MASK_FOLDERS 0xFE000000 +#define SCI_MARKERDEFINE 2040 +#define SCI_MARKERSETFORE 2041 +#define SCI_MARKERSETBACK 2042 +#define SCI_MARKERADD 2043 +#define SCI_MARKERDELETE 2044 +#define SCI_MARKERDELETEALL 2045 +#define SCI_MARKERGET 2046 +#define SCI_MARKERNEXT 2047 +#define SCI_MARKERPREVIOUS 2048 +#define SCI_MARKERDEFINEPIXMAP 2049 +#define SCI_MARKERADDSET 2466 +#define SCI_MARKERSETALPHA 2476 +#define SC_MARGIN_SYMBOL 0 +#define SC_MARGIN_NUMBER 1 +#define SC_MARGIN_BACK 2 +#define SC_MARGIN_FORE 3 +#define SCI_SETMARGINTYPEN 2240 +#define SCI_GETMARGINTYPEN 2241 +#define SCI_SETMARGINWIDTHN 2242 +#define SCI_GETMARGINWIDTHN 2243 +#define SCI_SETMARGINMASKN 2244 +#define SCI_GETMARGINMASKN 2245 +#define SCI_SETMARGINSENSITIVEN 2246 +#define SCI_GETMARGINSENSITIVEN 2247 +#define STYLE_DEFAULT 32 +#define STYLE_LINENUMBER 33 +#define STYLE_BRACELIGHT 34 +#define STYLE_BRACEBAD 35 +#define STYLE_CONTROLCHAR 36 +#define STYLE_INDENTGUIDE 37 +#define STYLE_CALLTIP 38 +#define STYLE_LASTPREDEFINED 39 +#define STYLE_MAX 127 +#define SC_CHARSET_ANSI 0 +#define SC_CHARSET_DEFAULT 1 +#define SC_CHARSET_BALTIC 186 +#define SC_CHARSET_CHINESEBIG5 136 +#define SC_CHARSET_EASTEUROPE 238 +#define SC_CHARSET_GB2312 134 +#define SC_CHARSET_GREEK 161 +#define SC_CHARSET_HANGUL 129 +#define SC_CHARSET_MAC 77 +#define SC_CHARSET_OEM 255 +#define SC_CHARSET_RUSSIAN 204 +#define SC_CHARSET_CYRILLIC 1251 +#define SC_CHARSET_SHIFTJIS 128 +#define SC_CHARSET_SYMBOL 2 +#define SC_CHARSET_TURKISH 162 +#define SC_CHARSET_JOHAB 130 +#define SC_CHARSET_HEBREW 177 +#define SC_CHARSET_ARABIC 178 +#define SC_CHARSET_VIETNAMESE 163 +#define SC_CHARSET_THAI 222 +#define SC_CHARSET_8859_15 1000 +#define SCI_STYLECLEARALL 2050 +#define SCI_STYLESETFORE 2051 +#define SCI_STYLESETBACK 2052 +#define SCI_STYLESETBOLD 2053 +#define SCI_STYLESETITALIC 2054 +#define SCI_STYLESETSIZE 2055 +#define SCI_STYLESETFONT 2056 +#define SCI_STYLESETEOLFILLED 2057 +#define SCI_STYLERESETDEFAULT 2058 +#define SCI_STYLESETUNDERLINE 2059 +#define SC_CASE_MIXED 0 +#define SC_CASE_UPPER 1 +#define SC_CASE_LOWER 2 +#define SCI_STYLEGETFORE 2481 +#define SCI_STYLEGETBACK 2482 +#define SCI_STYLEGETBOLD 2483 +#define SCI_STYLEGETITALIC 2484 +#define SCI_STYLEGETSIZE 2485 +#define SCI_STYLEGETFONT 2486 +#define SCI_STYLEGETEOLFILLED 2487 +#define SCI_STYLEGETUNDERLINE 2488 +#define SCI_STYLEGETCASE 2489 +#define SCI_STYLEGETCHARACTERSET 2490 +#define SCI_STYLEGETVISIBLE 2491 +#define SCI_STYLEGETCHANGEABLE 2492 +#define SCI_STYLEGETHOTSPOT 2493 +#define SCI_STYLESETCASE 2060 +#define SCI_STYLESETCHARACTERSET 2066 +#define SCI_STYLESETHOTSPOT 2409 +#define SCI_SETSELFORE 2067 +#define SCI_SETSELBACK 2068 +#define SCI_GETSELALPHA 2477 +#define SCI_SETSELALPHA 2478 +#define SCI_GETSELEOLFILLED 2479 +#define SCI_SETSELEOLFILLED 2480 +#define SCI_SETCARETFORE 2069 +#define SCI_ASSIGNCMDKEY 2070 +#define SCI_CLEARCMDKEY 2071 +#define SCI_CLEARALLCMDKEYS 2072 +#define SCI_SETSTYLINGEX 2073 +#define SCI_STYLESETVISIBLE 2074 +#define SCI_GETCARETPERIOD 2075 +#define SCI_SETCARETPERIOD 2076 +#define SCI_SETWORDCHARS 2077 +#define SCI_BEGINUNDOACTION 2078 +#define SCI_ENDUNDOACTION 2079 +#define INDIC_MAX 7 +#define INDIC_PLAIN 0 +#define INDIC_SQUIGGLE 1 +#define INDIC_TT 2 +#define INDIC_DIAGONAL 3 +#define INDIC_STRIKE 4 +#define INDIC_HIDDEN 5 +#define INDIC_BOX 6 +#define INDIC_ROUNDBOX 7 +#define INDIC0_MASK 0x20 +#define INDIC1_MASK 0x40 +#define INDIC2_MASK 0x80 +#define INDICS_MASK 0xE0 +#define SCI_INDICSETSTYLE 2080 +#define SCI_INDICGETSTYLE 2081 +#define SCI_INDICSETFORE 2082 +#define SCI_INDICGETFORE 2083 +#define SCI_SETWHITESPACEFORE 2084 +#define SCI_SETWHITESPACEBACK 2085 +#define SCI_SETSTYLEBITS 2090 +#define SCI_GETSTYLEBITS 2091 +#define SCI_SETLINESTATE 2092 +#define SCI_GETLINESTATE 2093 +#define SCI_GETMAXLINESTATE 2094 +#define SCI_GETCARETLINEVISIBLE 2095 +#define SCI_SETCARETLINEVISIBLE 2096 +#define SCI_GETCARETLINEBACK 2097 +#define SCI_SETCARETLINEBACK 2098 +#define SCI_STYLESETCHANGEABLE 2099 +#define SCI_AUTOCSHOW 2100 +#define SCI_AUTOCCANCEL 2101 +#define SCI_AUTOCACTIVE 2102 +#define SCI_AUTOCPOSSTART 2103 +#define SCI_AUTOCCOMPLETE 2104 +#define SCI_AUTOCSTOPS 2105 +#define SCI_AUTOCSETSEPARATOR 2106 +#define SCI_AUTOCGETSEPARATOR 2107 +#define SCI_AUTOCSELECT 2108 +#define SCI_AUTOCSETCANCELATSTART 2110 +#define SCI_AUTOCGETCANCELATSTART 2111 +#define SCI_AUTOCSETFILLUPS 2112 +#define SCI_AUTOCSETCHOOSESINGLE 2113 +#define SCI_AUTOCGETCHOOSESINGLE 2114 +#define SCI_AUTOCSETIGNORECASE 2115 +#define SCI_AUTOCGETIGNORECASE 2116 +#define SCI_USERLISTSHOW 2117 +#define SCI_AUTOCSETAUTOHIDE 2118 +#define SCI_AUTOCGETAUTOHIDE 2119 +#define SCI_AUTOCSETDROPRESTOFWORD 2270 +#define SCI_AUTOCGETDROPRESTOFWORD 2271 +#define SCI_REGISTERIMAGE 2405 +#define SCI_CLEARREGISTEREDIMAGES 2408 +#define SCI_AUTOCGETTYPESEPARATOR 2285 +#define SCI_AUTOCSETTYPESEPARATOR 2286 +#define SCI_AUTOCSETMAXWIDTH 2208 +#define SCI_AUTOCGETMAXWIDTH 2209 +#define SCI_AUTOCSETMAXHEIGHT 2210 +#define SCI_AUTOCGETMAXHEIGHT 2211 +#define SCI_SETINDENT 2122 +#define SCI_GETINDENT 2123 +#define SCI_SETUSETABS 2124 +#define SCI_GETUSETABS 2125 +#define SCI_SETLINEINDENTATION 2126 +#define SCI_GETLINEINDENTATION 2127 +#define SCI_GETLINEINDENTPOSITION 2128 +#define SCI_GETCOLUMN 2129 +#define SCI_SETHSCROLLBAR 2130 +#define SCI_GETHSCROLLBAR 2131 +#define SCI_SETINDENTATIONGUIDES 2132 +#define SCI_GETINDENTATIONGUIDES 2133 +#define SCI_SETHIGHLIGHTGUIDE 2134 +#define SCI_GETHIGHLIGHTGUIDE 2135 +#define SCI_GETLINEENDPOSITION 2136 +#define SCI_GETCODEPAGE 2137 +#define SCI_GETCARETFORE 2138 +#define SCI_GETUSEPALETTE 2139 +#define SCI_GETREADONLY 2140 +#define SCI_SETCURRENTPOS 2141 +#define SCI_SETSELECTIONSTART 2142 +#define SCI_GETSELECTIONSTART 2143 +#define SCI_SETSELECTIONEND 2144 +#define SCI_GETSELECTIONEND 2145 +#define SCI_SETPRINTMAGNIFICATION 2146 +#define SCI_GETPRINTMAGNIFICATION 2147 +#define SC_PRINT_NORMAL 0 +#define SC_PRINT_INVERTLIGHT 1 +#define SC_PRINT_BLACKONWHITE 2 +#define SC_PRINT_COLOURONWHITE 3 +#define SC_PRINT_COLOURONWHITEDEFAULTBG 4 +#define SCI_SETPRINTCOLOURMODE 2148 +#define SCI_GETPRINTCOLOURMODE 2149 +#define SCFIND_WHOLEWORD 2 +#define SCFIND_MATCHCASE 4 +#define SCFIND_WORDSTART 0x00100000 +#define SCFIND_REGEXP 0x00200000 +#define SCFIND_POSIX 0x00400000 +#define SCI_FINDTEXT 2150 +#define SCI_FORMATRANGE 2151 +#define SCI_GETFIRSTVISIBLELINE 2152 +#define SCI_GETLINE 2153 +#define SCI_GETLINECOUNT 2154 +#define SCI_SETMARGINLEFT 2155 +#define SCI_GETMARGINLEFT 2156 +#define SCI_SETMARGINRIGHT 2157 +#define SCI_GETMARGINRIGHT 2158 +#define SCI_GETMODIFY 2159 +#define SCI_SETSEL 2160 +#define SCI_GETSELTEXT 2161 +#define SCI_GETTEXTRANGE 2162 +#define SCI_HIDESELECTION 2163 +#define SCI_POINTXFROMPOSITION 2164 +#define SCI_POINTYFROMPOSITION 2165 +#define SCI_LINEFROMPOSITION 2166 +#define SCI_POSITIONFROMLINE 2167 +#define SCI_LINESCROLL 2168 +#define SCI_SCROLLCARET 2169 +#define SCI_REPLACESEL 2170 +#define SCI_SETREADONLY 2171 +#define SCI_NULL 2172 +#define SCI_CANPASTE 2173 +#define SCI_CANUNDO 2174 +#define SCI_EMPTYUNDOBUFFER 2175 +#define SCI_UNDO 2176 +#define SCI_CUT 2177 +#define SCI_COPY 2178 +#define SCI_PASTE 2179 +#define SCI_CLEAR 2180 +#define SCI_SETTEXT 2181 +#define SCI_GETTEXT 2182 +#define SCI_GETTEXTLENGTH 2183 +#define SCI_GETDIRECTFUNCTION 2184 +#define SCI_GETDIRECTPOINTER 2185 +#define SCI_SETOVERTYPE 2186 +#define SCI_GETOVERTYPE 2187 +#define SCI_SETCARETWIDTH 2188 +#define SCI_GETCARETWIDTH 2189 +#define SCI_SETTARGETSTART 2190 +#define SCI_GETTARGETSTART 2191 +#define SCI_SETTARGETEND 2192 +#define SCI_GETTARGETEND 2193 +#define SCI_REPLACETARGET 2194 +#define SCI_REPLACETARGETRE 2195 +#define SCI_SEARCHINTARGET 2197 +#define SCI_SETSEARCHFLAGS 2198 +#define SCI_GETSEARCHFLAGS 2199 +#define SCI_CALLTIPSHOW 2200 +#define SCI_CALLTIPCANCEL 2201 +#define SCI_CALLTIPACTIVE 2202 +#define SCI_CALLTIPPOSSTART 2203 +#define SCI_CALLTIPSETHLT 2204 +#define SCI_CALLTIPSETBACK 2205 +#define SCI_CALLTIPSETFORE 2206 +#define SCI_CALLTIPSETFOREHLT 2207 +#define SCI_CALLTIPUSESTYLE 2212 +#define SCI_VISIBLEFROMDOCLINE 2220 +#define SCI_DOCLINEFROMVISIBLE 2221 +#define SCI_WRAPCOUNT 2235 +#define SC_FOLDLEVELBASE 0x400 +#define SC_FOLDLEVELWHITEFLAG 0x1000 +#define SC_FOLDLEVELHEADERFLAG 0x2000 +#define SC_FOLDLEVELBOXHEADERFLAG 0x4000 +#define SC_FOLDLEVELBOXFOOTERFLAG 0x8000 +#define SC_FOLDLEVELCONTRACTED 0x10000 +#define SC_FOLDLEVELUNINDENT 0x20000 +#define SC_FOLDLEVELNUMBERMASK 0x0FFF +#define SCI_SETFOLDLEVEL 2222 +#define SCI_GETFOLDLEVEL 2223 +#define SCI_GETLASTCHILD 2224 +#define SCI_GETFOLDPARENT 2225 +#define SCI_SHOWLINES 2226 +#define SCI_HIDELINES 2227 +#define SCI_GETLINEVISIBLE 2228 +#define SCI_SETFOLDEXPANDED 2229 +#define SCI_GETFOLDEXPANDED 2230 +#define SCI_TOGGLEFOLD 2231 +#define SCI_ENSUREVISIBLE 2232 +#define SC_FOLDFLAG_LINEBEFORE_EXPANDED 0x0002 +#define SC_FOLDFLAG_LINEBEFORE_CONTRACTED 0x0004 +#define SC_FOLDFLAG_LINEAFTER_EXPANDED 0x0008 +#define SC_FOLDFLAG_LINEAFTER_CONTRACTED 0x0010 +#define SC_FOLDFLAG_LEVELNUMBERS 0x0040 +#define SC_FOLDFLAG_BOX 0x0001 +#define SCI_SETFOLDFLAGS 2233 +#define SCI_ENSUREVISIBLEENFORCEPOLICY 2234 +#define SCI_SETTABINDENTS 2260 +#define SCI_GETTABINDENTS 2261 +#define SCI_SETBACKSPACEUNINDENTS 2262 +#define SCI_GETBACKSPACEUNINDENTS 2263 +#define SC_TIME_FOREVER 10000000 +#define SCI_SETMOUSEDWELLTIME 2264 +#define SCI_GETMOUSEDWELLTIME 2265 +#define SCI_WORDSTARTPOSITION 2266 +#define SCI_WORDENDPOSITION 2267 +#define SC_WRAP_NONE 0 +#define SC_WRAP_WORD 1 +#define SC_WRAP_CHAR 2 +#define SCI_SETWRAPMODE 2268 +#define SCI_GETWRAPMODE 2269 +#define SC_WRAPVISUALFLAG_NONE 0x0000 +#define SC_WRAPVISUALFLAG_END 0x0001 +#define SC_WRAPVISUALFLAG_START 0x0002 +#define SCI_SETWRAPVISUALFLAGS 2460 +#define SCI_GETWRAPVISUALFLAGS 2461 +#define SC_WRAPVISUALFLAGLOC_DEFAULT 0x0000 +#define SC_WRAPVISUALFLAGLOC_END_BY_TEXT 0x0001 +#define SC_WRAPVISUALFLAGLOC_START_BY_TEXT 0x0002 +#define SCI_SETWRAPVISUALFLAGSLOCATION 2462 +#define SCI_GETWRAPVISUALFLAGSLOCATION 2463 +#define SCI_SETWRAPSTARTINDENT 2464 +#define SCI_GETWRAPSTARTINDENT 2465 +#define SC_CACHE_NONE 0 +#define SC_CACHE_CARET 1 +#define SC_CACHE_PAGE 2 +#define SC_CACHE_DOCUMENT 3 +#define SCI_SETLAYOUTCACHE 2272 +#define SCI_GETLAYOUTCACHE 2273 +#define SCI_SETSCROLLWIDTH 2274 +#define SCI_GETSCROLLWIDTH 2275 +#define SCI_TEXTWIDTH 2276 +#define SCI_SETENDATLASTLINE 2277 +#define SCI_GETENDATLASTLINE 2278 +#define SCI_TEXTHEIGHT 2279 +#define SCI_SETVSCROLLBAR 2280 +#define SCI_GETVSCROLLBAR 2281 +#define SCI_APPENDTEXT 2282 +#define SCI_GETTWOPHASEDRAW 2283 +#define SCI_SETTWOPHASEDRAW 2284 +#define SCI_TARGETFROMSELECTION 2287 +#define SCI_LINESJOIN 2288 +#define SCI_LINESSPLIT 2289 +#define SCI_SETFOLDMARGINCOLOUR 2290 +#define SCI_SETFOLDMARGINHICOLOUR 2291 +#define SCI_LINEDOWN 2300 +#define SCI_LINEDOWNEXTEND 2301 +#define SCI_LINEUP 2302 +#define SCI_LINEUPEXTEND 2303 +#define SCI_CHARLEFT 2304 +#define SCI_CHARLEFTEXTEND 2305 +#define SCI_CHARRIGHT 2306 +#define SCI_CHARRIGHTEXTEND 2307 +#define SCI_WORDLEFT 2308 +#define SCI_WORDLEFTEXTEND 2309 +#define SCI_WORDRIGHT 2310 +#define SCI_WORDRIGHTEXTEND 2311 +#define SCI_HOME 2312 +#define SCI_HOMEEXTEND 2313 +#define SCI_LINEEND 2314 +#define SCI_LINEENDEXTEND 2315 +#define SCI_DOCUMENTSTART 2316 +#define SCI_DOCUMENTSTARTEXTEND 2317 +#define SCI_DOCUMENTEND 2318 +#define SCI_DOCUMENTENDEXTEND 2319 +#define SCI_PAGEUP 2320 +#define SCI_PAGEUPEXTEND 2321 +#define SCI_PAGEDOWN 2322 +#define SCI_PAGEDOWNEXTEND 2323 +#define SCI_EDITTOGGLEOVERTYPE 2324 +#define SCI_CANCEL 2325 +#define SCI_DELETEBACK 2326 +#define SCI_TAB 2327 +#define SCI_BACKTAB 2328 +#define SCI_NEWLINE 2329 +#define SCI_FORMFEED 2330 +#define SCI_VCHOME 2331 +#define SCI_VCHOMEEXTEND 2332 +#define SCI_ZOOMIN 2333 +#define SCI_ZOOMOUT 2334 +#define SCI_DELWORDLEFT 2335 +#define SCI_DELWORDRIGHT 2336 +#define SCI_LINECUT 2337 +#define SCI_LINEDELETE 2338 +#define SCI_LINETRANSPOSE 2339 +#define SCI_LINEDUPLICATE 2404 +#define SCI_LOWERCASE 2340 +#define SCI_UPPERCASE 2341 +#define SCI_LINESCROLLDOWN 2342 +#define SCI_LINESCROLLUP 2343 +#define SCI_DELETEBACKNOTLINE 2344 +#define SCI_HOMEDISPLAY 2345 +#define SCI_HOMEDISPLAYEXTEND 2346 +#define SCI_LINEENDDISPLAY 2347 +#define SCI_LINEENDDISPLAYEXTEND 2348 +#define SCI_HOMEWRAP 2349 +#define SCI_HOMEWRAPEXTEND 2450 +#define SCI_LINEENDWRAP 2451 +#define SCI_LINEENDWRAPEXTEND 2452 +#define SCI_VCHOMEWRAP 2453 +#define SCI_VCHOMEWRAPEXTEND 2454 +#define SCI_LINECOPY 2455 +#define SCI_MOVECARETINSIDEVIEW 2401 +#define SCI_LINELENGTH 2350 +#define SCI_BRACEHIGHLIGHT 2351 +#define SCI_BRACEBADLIGHT 2352 +#define SCI_BRACEMATCH 2353 +#define SCI_GETVIEWEOL 2355 +#define SCI_SETVIEWEOL 2356 +#define SCI_GETDOCPOINTER 2357 +#define SCI_SETDOCPOINTER 2358 +#define SCI_SETMODEVENTMASK 2359 +#define EDGE_NONE 0 +#define EDGE_LINE 1 +#define EDGE_BACKGROUND 2 +#define SCI_GETEDGECOLUMN 2360 +#define SCI_SETEDGECOLUMN 2361 +#define SCI_GETEDGEMODE 2362 +#define SCI_SETEDGEMODE 2363 +#define SCI_GETEDGECOLOUR 2364 +#define SCI_SETEDGECOLOUR 2365 +#define SCI_SEARCHANCHOR 2366 +#define SCI_SEARCHNEXT 2367 +#define SCI_SEARCHPREV 2368 +#define SCI_LINESONSCREEN 2370 +#define SCI_USEPOPUP 2371 +#define SCI_SELECTIONISRECTANGLE 2372 +#define SCI_SETZOOM 2373 +#define SCI_GETZOOM 2374 +#define SCI_CREATEDOCUMENT 2375 +#define SCI_ADDREFDOCUMENT 2376 +#define SCI_RELEASEDOCUMENT 2377 +#define SCI_GETMODEVENTMASK 2378 +#define SCI_SETFOCUS 2380 +#define SCI_GETFOCUS 2381 +#define SCI_SETSTATUS 2382 +#define SCI_GETSTATUS 2383 +#define SCI_SETMOUSEDOWNCAPTURES 2384 +#define SCI_GETMOUSEDOWNCAPTURES 2385 +#define SC_CURSORNORMAL -1 +#define SC_CURSORWAIT 4 +#define SCI_SETCURSOR 2386 +#define SCI_GETCURSOR 2387 +#define SCI_SETCONTROLCHARSYMBOL 2388 +#define SCI_GETCONTROLCHARSYMBOL 2389 +#define SCI_WORDPARTLEFT 2390 +#define SCI_WORDPARTLEFTEXTEND 2391 +#define SCI_WORDPARTRIGHT 2392 +#define SCI_WORDPARTRIGHTEXTEND 2393 +#define VISIBLE_SLOP 0x01 +#define VISIBLE_STRICT 0x04 +#define SCI_SETVISIBLEPOLICY 2394 +#define SCI_DELLINELEFT 2395 +#define SCI_DELLINERIGHT 2396 +#define SCI_SETXOFFSET 2397 +#define SCI_GETXOFFSET 2398 +#define SCI_CHOOSECARETX 2399 +#define SCI_GRABFOCUS 2400 +#define CARET_SLOP 0x01 +#define CARET_STRICT 0x04 +#define CARET_JUMPS 0x10 +#define CARET_EVEN 0x08 +#define SCI_SETXCARETPOLICY 2402 +#define SCI_SETYCARETPOLICY 2403 +#define SCI_SETPRINTWRAPMODE 2406 +#define SCI_GETPRINTWRAPMODE 2407 +#define SCI_SETHOTSPOTACTIVEFORE 2410 +#define SCI_GETHOTSPOTACTIVEFORE 2494 +#define SCI_SETHOTSPOTACTIVEBACK 2411 +#define SCI_GETHOTSPOTACTIVEBACK 2495 +#define SCI_SETHOTSPOTACTIVEUNDERLINE 2412 +#define SCI_GETHOTSPOTACTIVEUNDERLINE 2496 +#define SCI_SETHOTSPOTSINGLELINE 2421 +#define SCI_GETHOTSPOTSINGLELINE 2497 +#define SCI_PARADOWN 2413 +#define SCI_PARADOWNEXTEND 2414 +#define SCI_PARAUP 2415 +#define SCI_PARAUPEXTEND 2416 +#define SCI_POSITIONBEFORE 2417 +#define SCI_POSITIONAFTER 2418 +#define SCI_COPYRANGE 2419 +#define SCI_COPYTEXT 2420 +#define SC_SEL_STREAM 0 +#define SC_SEL_RECTANGLE 1 +#define SC_SEL_LINES 2 +#define SCI_SETSELECTIONMODE 2422 +#define SCI_GETSELECTIONMODE 2423 +#define SCI_GETLINESELSTARTPOSITION 2424 +#define SCI_GETLINESELENDPOSITION 2425 +#define SCI_LINEDOWNRECTEXTEND 2426 +#define SCI_LINEUPRECTEXTEND 2427 +#define SCI_CHARLEFTRECTEXTEND 2428 +#define SCI_CHARRIGHTRECTEXTEND 2429 +#define SCI_HOMERECTEXTEND 2430 +#define SCI_VCHOMERECTEXTEND 2431 +#define SCI_LINEENDRECTEXTEND 2432 +#define SCI_PAGEUPRECTEXTEND 2433 +#define SCI_PAGEDOWNRECTEXTEND 2434 +#define SCI_STUTTEREDPAGEUP 2435 +#define SCI_STUTTEREDPAGEUPEXTEND 2436 +#define SCI_STUTTEREDPAGEDOWN 2437 +#define SCI_STUTTEREDPAGEDOWNEXTEND 2438 +#define SCI_WORDLEFTEND 2439 +#define SCI_WORDLEFTENDEXTEND 2440 +#define SCI_WORDRIGHTEND 2441 +#define SCI_WORDRIGHTENDEXTEND 2442 +#define SCI_SETWHITESPACECHARS 2443 +#define SCI_SETCHARSDEFAULT 2444 +#define SCI_AUTOCGETCURRENT 2445 +#define SCI_ALLOCATE 2446 +#define SCI_TARGETASUTF8 2447 +#define SCI_SETLENGTHFORENCODE 2448 +#define SCI_ENCODEDFROMUTF8 2449 +#define SCI_FINDCOLUMN 2456 +#define SCI_GETCARETSTICKY 2457 +#define SCI_SETCARETSTICKY 2458 +#define SCI_TOGGLECARETSTICKY 2459 +#define SCI_SETPASTECONVERTENDINGS 2467 +#define SCI_GETPASTECONVERTENDINGS 2468 +#define SCI_SELECTIONDUPLICATE 2469 +#define SC_ALPHA_TRANSPARENT 0 +#define SC_ALPHA_OPAQUE 255 +#define SC_ALPHA_NOALPHA 256 +#define SCI_SETCARETLINEBACKALPHA 2470 +#define SCI_GETCARETLINEBACKALPHA 2471 +#define SCI_STARTRECORD 3001 +#define SCI_STOPRECORD 3002 +#define SCI_SETLEXER 4001 +#define SCI_GETLEXER 4002 +#define SCI_COLOURISE 4003 +#define SCI_SETPROPERTY 4004 +#define KEYWORDSET_MAX 8 +#define SCI_SETKEYWORDS 4005 +#define SCI_SETLEXERLANGUAGE 4006 +#define SCI_LOADLEXERLIBRARY 4007 +#define SCI_GETPROPERTY 4008 +#define SCI_GETPROPERTYEXPANDED 4009 +#define SCI_GETPROPERTYINT 4010 +#define SCI_GETSTYLEBITSNEEDED 4011 +#define SC_MOD_INSERTTEXT 0x1 +#define SC_MOD_DELETETEXT 0x2 +#define SC_MOD_CHANGESTYLE 0x4 +#define SC_MOD_CHANGEFOLD 0x8 +#define SC_PERFORMED_USER 0x10 +#define SC_PERFORMED_UNDO 0x20 +#define SC_PERFORMED_REDO 0x40 +#define SC_MULTISTEPUNDOREDO 0x80 +#define SC_LASTSTEPINUNDOREDO 0x100 +#define SC_MOD_CHANGEMARKER 0x200 +#define SC_MOD_BEFOREINSERT 0x400 +#define SC_MOD_BEFOREDELETE 0x800 +#define SC_MULTILINEUNDOREDO 0x1000 +#define SC_STARTACTION 0x2000 +#define SC_MODEVENTMASKALL 0x2FFF +#define SCEN_CHANGE 768 +#define SCEN_SETFOCUS 512 +#define SCEN_KILLFOCUS 256 +#define SCK_DOWN 300 +#define SCK_UP 301 +#define SCK_LEFT 302 +#define SCK_RIGHT 303 +#define SCK_HOME 304 +#define SCK_END 305 +#define SCK_PRIOR 306 +#define SCK_NEXT 307 +#define SCK_DELETE 308 +#define SCK_INSERT 309 +#define SCK_ESCAPE 7 +#define SCK_BACK 8 +#define SCK_TAB 9 +#define SCK_RETURN 13 +#define SCK_ADD 310 +#define SCK_SUBTRACT 311 +#define SCK_DIVIDE 312 +#define SCK_WIN 313 +#define SCK_RWIN 314 +#define SCK_MENU 315 +#define SCMOD_NORM 0 +#define SCMOD_SHIFT 1 +#define SCMOD_CTRL 2 +#define SCMOD_ALT 4 +#define SCN_STYLENEEDED 2000 +#define SCN_CHARADDED 2001 +#define SCN_SAVEPOINTREACHED 2002 +#define SCN_SAVEPOINTLEFT 2003 +#define SCN_MODIFYATTEMPTRO 2004 +#define SCN_KEY 2005 +#define SCN_DOUBLECLICK 2006 +#define SCN_UPDATEUI 2007 +#define SCN_MODIFIED 2008 +#define SCN_MACRORECORD 2009 +#define SCN_MARGINCLICK 2010 +#define SCN_NEEDSHOWN 2011 +#define SCN_PAINTED 2013 +#define SCN_USERLISTSELECTION 2014 +#define SCN_URIDROPPED 2015 +#define SCN_DWELLSTART 2016 +#define SCN_DWELLEND 2017 +#define SCN_ZOOM 2018 +#define SCN_HOTSPOTCLICK 2019 +#define SCN_HOTSPOTDOUBLECLICK 2020 +#define SCN_CALLTIPCLICK 2021 +#define SCN_AUTOCSELECTION 2022 +//--Autogenerated -- end of section automatically generated from Scintilla.iface + +// These structures are defined to be exactly the same shape as the Win32 +// CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs. +// So older code that treats Scintilla as a RichEdit will work. + +struct CharacterRange { + long cpMin; + long cpMax; +}; + +struct TextRange { + struct CharacterRange chrg; + char *lpstrText; +}; + +struct TextToFind { + struct CharacterRange chrg; + char *lpstrText; + struct CharacterRange chrgText; +}; + +#ifdef PLATFORM_H + +// This structure is used in printing and requires some of the graphics types +// from Platform.h. Not needed by most client code. + +struct RangeToFormat { + SurfaceID hdc; + SurfaceID hdcTarget; + PRectangle rc; + PRectangle rcPage; + CharacterRange chrg; +}; + +#endif + +struct NotifyHeader { + // Compatible with Windows NMHDR. + // hwndFrom is really an environment specific window handle or pointer + // but most clients of Scintilla.h do not have this type visible. + void *hwndFrom; + uptr_t idFrom; + unsigned int code; +}; + +struct SCNotification { + struct NotifyHeader nmhdr; + int position; // SCN_STYLENEEDED, SCN_MODIFIED, SCN_DWELLSTART, SCN_DWELLEND + int ch; // SCN_CHARADDED, SCN_KEY + int modifiers; // SCN_KEY + int modificationType; // SCN_MODIFIED + const char *text; // SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION + int length; // SCN_MODIFIED + int linesAdded; // SCN_MODIFIED + int message; // SCN_MACRORECORD + uptr_t wParam; // SCN_MACRORECORD + sptr_t lParam; // SCN_MACRORECORD + int line; // SCN_MODIFIED + int foldLevelNow; // SCN_MODIFIED + int foldLevelPrev; // SCN_MODIFIED + int margin; // SCN_MARGINCLICK + int listType; // SCN_USERLISTSELECTION + int x; // SCN_DWELLSTART, SCN_DWELLEND + int y; // SCN_DWELLSTART, SCN_DWELLEND +}; + +// Deprecation section listing all API features that are deprecated and will +// will be removed completely in a future version. +// To enable these features define INCLUDE_DEPRECATED_FEATURES + +#ifdef INCLUDE_DEPRECATED_FEATURES + +#define SCI_SETCARETPOLICY 2369 +#define CARET_CENTER 0x02 +#define CARET_XEVEN 0x08 +#define CARET_XJUMPS 0x10 + +#define SCN_POSCHANGED 2012 +#define SCN_CHECKBRACE 2007 + +#endif + +#endif diff --git a/scintilla/include/Scintilla.iface b/scintilla/include/Scintilla.iface new file mode 100644 index 00000000..fb856652 --- /dev/null +++ b/scintilla/include/Scintilla.iface @@ -0,0 +1,3116 @@ +## First line may be used for shbang + +## This file defines the interface to Scintilla + +## Copyright 2000-2003 by Neil Hodgson +## The License.txt file describes the conditions under which this software may be distributed. + +## A line starting with ## is a pure comment and should be stripped by readers. +## A line starting with #! is for future shbang use +## A line starting with # followed by a space is a documentation comment and refers +## to the next feature definition. + +## Each feature is defined by a line starting with fun, get, set, val or evt. +## cat -> start a category +## fun -> a function +## get -> a property get function +## set -> a property set function +## val -> definition of a constant +## evt -> an event +## enu -> associate an enumeration with a set of vals with a prefix +## lex -> associate a lexer with the lexical classes it produces +## +## All other feature names should be ignored. They may be defined in the future. +## A property may have a set function, a get function or both. Each will have +## "Get" or "Set" in their names and the corresponding name will have the obvious switch. +## A property may be subscripted, in which case the first parameter is the subscript. +## fun, get, and set features have a strict syntax: +## [=,) +## where stands for white space. +## param may be empty (null value) or is [=] +## Additional white space is allowed between elements. +## The syntax for evt is [=[,]*]) +## Feature names that contain an underscore are defined by Windows, so in these +## cases, using the Windows definition is preferred where available. +## The feature numbers are stable so features will not be renumbered. +## Features may be removed but they will go through a period of deprecation +## before removal which is signalled by moving them into the Deprecated category. +## +## enu has the syntax enu=[]* where all the val +## features in this file starting with a given are considered part of the +## enumeration. +## +## lex has the syntax lex=[]* +## where name is a reasonably capitalised (Python, XML) identifier or UI name, +## lexerVal is the val used to specify the lexer, and the list of prefixes is similar +## to enu. The name may not be the same as that used within the lexer so the lexerVal +## should be used to tie these entities together. + +## Types: +## void +## int +## bool -> integer, 1=true, 0=false +## position -> integer position in a document +## colour -> colour integer containing red, green and blue bytes. +## string -> pointer to const character +## stringresult -> pointer to character, NULL-> return size of result +## cells -> pointer to array of cells, each cell containing a style byte and character byte +## textrange -> range of a min and a max position with an output string +## findtext -> searchrange, text -> foundposition +## keymod -> integer containing key in low half and modifiers in high half +## formatrange +## Types no longer used: +## findtextex -> searchrange +## charrange -> range of a min and a max position +## charrangeresult -> like charrange, but output param +## countedstring +## point -> x,y +## pointresult -> like point, but output param +## rectangle -> left,top,right,bottom +## Client code should ignore definitions containing types it does not understand, except +## for possibly #defining the constants + +## Line numbers and positions start at 0. +## String arguments may contain NUL ('\0') characters where the calls provide a length +## argument and retrieve NUL characters. All retrieved strings except for those retrieved +## by GetLine also have a NUL appended but client code should calculate the size that +## will be returned rather than relying upon the NUL whenever possible. Allow for the +## extra NUL character when allocating buffers. The size to allocate for a stringresult +## can be determined by calling with a NULL (0) pointer. + +cat Basics + +################################################ +## For Scintilla.h +val INVALID_POSITION=-1 +# Define start of Scintilla messages to be greater than all Windows edit (EM_*) messages +# as many EM_ messages can be used although that use is deprecated. +val SCI_START=2000 +val SCI_OPTIONAL_START=3000 +val SCI_LEXER_START=4000 + +# Add text to the document at current position. +fun void AddText=2001(int length, string text) + +# Add array of cells to document. +fun void AddStyledText=2002(int length, cells c) + +# Insert string at a position. +fun void InsertText=2003(position pos, string text) + +# Delete all text in the document. +fun void ClearAll=2004(,) + +# Set all style bytes to 0, remove all folding information. +fun void ClearDocumentStyle=2005(,) + +# Returns the number of characters in the document. +get int GetLength=2006(,) + +# Returns the character byte at the position. +get int GetCharAt=2007(position pos,) + +# Returns the position of the caret. +get position GetCurrentPos=2008(,) + +# Returns the position of the opposite end of the selection to the caret. +get position GetAnchor=2009(,) + +# Returns the style byte at the position. +get int GetStyleAt=2010(position pos,) + +# Redoes the next action on the undo history. +fun void Redo=2011(,) + +# Choose between collecting actions into the undo +# history and discarding them. +set void SetUndoCollection=2012(bool collectUndo,) + +# Select all the text in the document. +fun void SelectAll=2013(,) + +# Remember the current position in the undo history as the position +# at which the document was saved. +fun void SetSavePoint=2014(,) + +# Retrieve a buffer of cells. +# Returns the number of bytes in the buffer not including terminating NULs. +fun int GetStyledText=2015(, textrange tr) + +# Are there any redoable actions in the undo history? +fun bool CanRedo=2016(,) + +# Retrieve the line number at which a particular marker is located. +fun int MarkerLineFromHandle=2017(int handle,) + +# Delete a marker. +fun void MarkerDeleteHandle=2018(int handle,) + +# Is undo history being collected? +get bool GetUndoCollection=2019(,) + +enu WhiteSpace=SCWS_ +val SCWS_INVISIBLE=0 +val SCWS_VISIBLEALWAYS=1 +val SCWS_VISIBLEAFTERINDENT=2 + +# Are white space characters currently visible? +# Returns one of SCWS_* constants. +get int GetViewWS=2020(,) + +# Make white space characters invisible, always visible or visible outside indentation. +set void SetViewWS=2021(int viewWS,) + +# Find the position from a point within the window. +fun position PositionFromPoint=2022(int x, int y) + +# Find the position from a point within the window but return +# INVALID_POSITION if not close to text. +fun position PositionFromPointClose=2023(int x, int y) + +# Set caret to start of a line and ensure it is visible. +fun void GotoLine=2024(int line,) + +# Set caret to a position and ensure it is visible. +fun void GotoPos=2025(position pos,) + +# Set the selection anchor to a position. The anchor is the opposite +# end of the selection from the caret. +set void SetAnchor=2026(position posAnchor,) + +# Retrieve the text of the line containing the caret. +# Returns the index of the caret on the line. +fun int GetCurLine=2027(int length, stringresult text) + +# Retrieve the position of the last correctly styled character. +get position GetEndStyled=2028(,) + +enu EndOfLine=SC_EOL_ +val SC_EOL_CRLF=0 +val SC_EOL_CR=1 +val SC_EOL_LF=2 + +# Convert all line endings in the document to one mode. +fun void ConvertEOLs=2029(int eolMode,) + +# Retrieve the current end of line mode - one of CRLF, CR, or LF. +get int GetEOLMode=2030(,) + +# Set the current end of line mode. +set void SetEOLMode=2031(int eolMode,) + +# Set the current styling position to pos and the styling mask to mask. +# The styling mask can be used to protect some bits in each styling byte from modification. +fun void StartStyling=2032(position pos, int mask) + +# Change style from current styling position for length characters to a style +# and move the current styling position to after this newly styled segment. +fun void SetStyling=2033(int length, int style) + +# Is drawing done first into a buffer or direct to the screen? +get bool GetBufferedDraw=2034(,) + +# If drawing is buffered then each line of text is drawn into a bitmap buffer +# before drawing it to the screen to avoid flicker. +set void SetBufferedDraw=2035(bool buffered,) + +# Change the visible size of a tab to be a multiple of the width of a space character. +set void SetTabWidth=2036(int tabWidth,) + +# Retrieve the visible size of a tab. +get int GetTabWidth=2121(,) + +# The SC_CP_UTF8 value can be used to enter Unicode mode. +# This is the same value as CP_UTF8 in Windows +val SC_CP_UTF8=65001 + +# The SC_CP_DBCS value can be used to indicate a DBCS mode for GTK+. +val SC_CP_DBCS=1 + +# Set the code page used to interpret the bytes of the document as characters. +# The SC_CP_UTF8 value can be used to enter Unicode mode. +set void SetCodePage=2037(int codePage,) + +# In palette mode, Scintilla uses the environment's palette calls to display +# more colours. This may lead to ugly displays. +set void SetUsePalette=2039(bool usePalette,) + +enu MarkerSymbol=SC_MARK_ +val MARKER_MAX=31 +val SC_MARK_CIRCLE=0 +val SC_MARK_ROUNDRECT=1 +val SC_MARK_ARROW=2 +val SC_MARK_SMALLRECT=3 +val SC_MARK_SHORTARROW=4 +val SC_MARK_EMPTY=5 +val SC_MARK_ARROWDOWN=6 +val SC_MARK_MINUS=7 +val SC_MARK_PLUS=8 + +# Shapes used for outlining column. +val SC_MARK_VLINE=9 +val SC_MARK_LCORNER=10 +val SC_MARK_TCORNER=11 +val SC_MARK_BOXPLUS=12 +val SC_MARK_BOXPLUSCONNECTED=13 +val SC_MARK_BOXMINUS=14 +val SC_MARK_BOXMINUSCONNECTED=15 +val SC_MARK_LCORNERCURVE=16 +val SC_MARK_TCORNERCURVE=17 +val SC_MARK_CIRCLEPLUS=18 +val SC_MARK_CIRCLEPLUSCONNECTED=19 +val SC_MARK_CIRCLEMINUS=20 +val SC_MARK_CIRCLEMINUSCONNECTED=21 + +# Invisible mark that only sets the line background color. +val SC_MARK_BACKGROUND=22 +val SC_MARK_DOTDOTDOT=23 +val SC_MARK_ARROWS=24 +val SC_MARK_PIXMAP=25 +val SC_MARK_FULLRECT=26 + +val SC_MARK_CHARACTER=10000 + +enu MarkerOutline=SC_MARKNUM_ +# Markers used for outlining column. +val SC_MARKNUM_FOLDEREND=25 +val SC_MARKNUM_FOLDEROPENMID=26 +val SC_MARKNUM_FOLDERMIDTAIL=27 +val SC_MARKNUM_FOLDERTAIL=28 +val SC_MARKNUM_FOLDERSUB=29 +val SC_MARKNUM_FOLDER=30 +val SC_MARKNUM_FOLDEROPEN=31 + +val SC_MASK_FOLDERS=0xFE000000 + +# Set the symbol used for a particular marker number. +fun void MarkerDefine=2040(int markerNumber, int markerSymbol) + +# Set the foreground colour used for a particular marker number. +fun void MarkerSetFore=2041(int markerNumber, colour fore) + +# Set the background colour used for a particular marker number. +fun void MarkerSetBack=2042(int markerNumber, colour back) + +# Add a marker to a line, returning an ID which can be used to find or delete the marker. +fun int MarkerAdd=2043(int line, int markerNumber) + +# Delete a marker from a line. +fun void MarkerDelete=2044(int line, int markerNumber) + +# Delete all markers with a particular number from all lines. +fun void MarkerDeleteAll=2045(int markerNumber,) + +# Get a bit mask of all the markers set on a line. +fun int MarkerGet=2046(int line,) + +# Find the next line after lineStart that includes a marker in mask. +fun int MarkerNext=2047(int lineStart, int markerMask) + +# Find the previous line before lineStart that includes a marker in mask. +fun int MarkerPrevious=2048(int lineStart, int markerMask) + +# Define a marker from a pixmap. +fun void MarkerDefinePixmap=2049(int markerNumber, string pixmap) + +# Add a set of markers to a line. +fun void MarkerAddSet=2466(int line, int set) + +# Set the alpha used for a marker that is drawn in the text area, not the margin. +fun void MarkerSetAlpha=2476(int markerNumber, int alpha) + +enu MarginType=SC_MARGIN_ +val SC_MARGIN_SYMBOL=0 +val SC_MARGIN_NUMBER=1 +val SC_MARGIN_BACK=2 +val SC_MARGIN_FORE=3 + +# Set a margin to be either numeric or symbolic. +set void SetMarginTypeN=2240(int margin, int marginType) + +# Retrieve the type of a margin. +get int GetMarginTypeN=2241(int margin,) + +# Set the width of a margin to a width expressed in pixels. +set void SetMarginWidthN=2242(int margin, int pixelWidth) + +# Retrieve the width of a margin in pixels. +get int GetMarginWidthN=2243(int margin,) + +# Set a mask that determines which markers are displayed in a margin. +set void SetMarginMaskN=2244(int margin, int mask) + +# Retrieve the marker mask of a margin. +get int GetMarginMaskN=2245(int margin,) + +# Make a margin sensitive or insensitive to mouse clicks. +set void SetMarginSensitiveN=2246(int margin, bool sensitive) + +# Retrieve the mouse click sensitivity of a margin. +get bool GetMarginSensitiveN=2247(int margin,) + +# Styles in range 32..38 are predefined for parts of the UI and are not used as normal styles. +# Style 39 is for future use. +enu StylesCommon=STYLE_ +val STYLE_DEFAULT=32 +val STYLE_LINENUMBER=33 +val STYLE_BRACELIGHT=34 +val STYLE_BRACEBAD=35 +val STYLE_CONTROLCHAR=36 +val STYLE_INDENTGUIDE=37 +val STYLE_CALLTIP=38 +val STYLE_LASTPREDEFINED=39 +val STYLE_MAX=127 + +# Character set identifiers are used in StyleSetCharacterSet. +# The values are the same as the Windows *_CHARSET values. +enu CharacterSet=SC_CHARSET_ +val SC_CHARSET_ANSI=0 +val SC_CHARSET_DEFAULT=1 +val SC_CHARSET_BALTIC=186 +val SC_CHARSET_CHINESEBIG5=136 +val SC_CHARSET_EASTEUROPE=238 +val SC_CHARSET_GB2312=134 +val SC_CHARSET_GREEK=161 +val SC_CHARSET_HANGUL=129 +val SC_CHARSET_MAC=77 +val SC_CHARSET_OEM=255 +val SC_CHARSET_RUSSIAN=204 +val SC_CHARSET_CYRILLIC=1251 +val SC_CHARSET_SHIFTJIS=128 +val SC_CHARSET_SYMBOL=2 +val SC_CHARSET_TURKISH=162 +val SC_CHARSET_JOHAB=130 +val SC_CHARSET_HEBREW=177 +val SC_CHARSET_ARABIC=178 +val SC_CHARSET_VIETNAMESE=163 +val SC_CHARSET_THAI=222 +val SC_CHARSET_8859_15=1000 + +# Clear all the styles and make equivalent to the global default style. +set void StyleClearAll=2050(,) + +# Set the foreground colour of a style. +set void StyleSetFore=2051(int style, colour fore) + +# Set the background colour of a style. +set void StyleSetBack=2052(int style, colour back) + +# Set a style to be bold or not. +set void StyleSetBold=2053(int style, bool bold) + +# Set a style to be italic or not. +set void StyleSetItalic=2054(int style, bool italic) + +# Set the size of characters of a style. +set void StyleSetSize=2055(int style, int sizePoints) + +# Set the font of a style. +set void StyleSetFont=2056(int style, string fontName) + +# Set a style to have its end of line filled or not. +set void StyleSetEOLFilled=2057(int style, bool filled) + +# Reset the default style to its state at startup +fun void StyleResetDefault=2058(,) + +# Set a style to be underlined or not. +set void StyleSetUnderline=2059(int style, bool underline) + +enu CaseVisible=SC_CASE_ +val SC_CASE_MIXED=0 +val SC_CASE_UPPER=1 +val SC_CASE_LOWER=2 + +# Get the foreground colour of a style. +get colour StyleGetFore=2481(int style,) + +# Get the background colour of a style. +get colour StyleGetBack=2482(int style,) + +# Get is a style bold or not. +get bool StyleGetBold=2483(int style,) + +# Get is a style italic or not. +get bool StyleGetItalic=2484(int style,) + +# Get the size of characters of a style. +get int StyleGetSize=2485(int style,) + +# Get the font of a style. +# Returns the length of the fontName +fun int StyleGetFont=2486(int style, stringresult fontName) + +# Get is a style to have its end of line filled or not. +get bool StyleGetEOLFilled=2487(int style,) + +# Get is a style underlined or not. +get bool StyleGetUnderline=2488(int style,) + +# Get is a style mixed case, or to force upper or lower case. +get int StyleGetCase=2489(int style,) + +# Get the character get of the font in a style. +get int StyleGetCharacterSet=2490(int style,) + +# Get is a style visible or not. +get bool StyleGetVisible=2491(int style,) + +# Get is a style changeable or not (read only). +# Experimental feature, currently buggy. +get bool StyleGetChangeable=2492(int style,) + +# Get is a style a hotspot or not. +get bool StyleGetHotSpot=2493(int style,) + +# Set a style to be mixed case, or to force upper or lower case. +set void StyleSetCase=2060(int style, int caseForce) + +# Set the character set of the font in a style. +set void StyleSetCharacterSet=2066(int style, int characterSet) + +# Set a style to be a hotspot or not. +set void StyleSetHotSpot=2409(int style, bool hotspot) + +# Set the foreground colour of the selection and whether to use this setting. +fun void SetSelFore=2067(bool useSetting, colour fore) + +# Set the background colour of the selection and whether to use this setting. +fun void SetSelBack=2068(bool useSetting, colour back) + +# Get the alpha of the selection. +get int GetSelAlpha=2477(,) + +# Set the alpha of the selection. +set void SetSelAlpha=2478(int alpha,) + +# Is the selection end of line filled? +get bool GetSelEOLFilled=2479(,) + +# Set the selection to have its end of line filled or not. +set void SetSelEOLFilled=2480(bool filled,) + +# Set the foreground colour of the caret. +set void SetCaretFore=2069(colour fore,) + +# When key+modifier combination km is pressed perform msg. +fun void AssignCmdKey=2070(keymod km, int msg) + +# When key+modifier combination km is pressed do nothing. +fun void ClearCmdKey=2071(keymod km,) + +# Drop all key mappings. +fun void ClearAllCmdKeys=2072(,) + +# Set the styles for a segment of the document. +fun void SetStylingEx=2073(int length, string styles) + +# Set a style to be visible or not. +set void StyleSetVisible=2074(int style, bool visible) + +# Get the time in milliseconds that the caret is on and off. +get int GetCaretPeriod=2075(,) + +# Get the time in milliseconds that the caret is on and off. 0 = steady on. +set void SetCaretPeriod=2076(int periodMilliseconds,) + +# Set the set of characters making up words for when moving or selecting by word. +# First sets deaults like SetCharsDefault. +set void SetWordChars=2077(, string characters) + +# Start a sequence of actions that is undone and redone as a unit. +# May be nested. +fun void BeginUndoAction=2078(,) + +# End a sequence of actions that is undone and redone as a unit. +fun void EndUndoAction=2079(,) + +enu IndicatorStyle=INDIC_ +val INDIC_MAX=7 +val INDIC_PLAIN=0 +val INDIC_SQUIGGLE=1 +val INDIC_TT=2 +val INDIC_DIAGONAL=3 +val INDIC_STRIKE=4 +val INDIC_HIDDEN=5 +val INDIC_BOX=6 +val INDIC_ROUNDBOX=7 +val INDIC0_MASK=0x20 +val INDIC1_MASK=0x40 +val INDIC2_MASK=0x80 +val INDICS_MASK=0xE0 + +# Set an indicator to plain, squiggle or TT. +set void IndicSetStyle=2080(int indic, int style) + +# Retrieve the style of an indicator. +get int IndicGetStyle=2081(int indic,) + +# Set the foreground colour of an indicator. +set void IndicSetFore=2082(int indic, colour fore) + +# Retrieve the foreground colour of an indicator. +get colour IndicGetFore=2083(int indic,) + +# Set the foreground colour of all whitespace and whether to use this setting. +fun void SetWhitespaceFore=2084(bool useSetting, colour fore) + +# Set the background colour of all whitespace and whether to use this setting. +fun void SetWhitespaceBack=2085(bool useSetting, colour back) + +# Divide each styling byte into lexical class bits (default: 5) and indicator +# bits (default: 3). If a lexer requires more than 32 lexical states, then this +# is used to expand the possible states. +set void SetStyleBits=2090(int bits,) + +# Retrieve number of bits in style bytes used to hold the lexical state. +get int GetStyleBits=2091(,) + +# Used to hold extra styling information for each line. +set void SetLineState=2092(int line, int state) + +# Retrieve the extra styling information for a line. +get int GetLineState=2093(int line,) + +# Retrieve the last line number that has line state. +get int GetMaxLineState=2094(,) + +# Is the background of the line containing the caret in a different colour? +get bool GetCaretLineVisible=2095(,) + +# Display the background of the line containing the caret in a different colour. +set void SetCaretLineVisible=2096(bool show,) + +# Get the colour of the background of the line containing the caret. +get colour GetCaretLineBack=2097(,) + +# Set the colour of the background of the line containing the caret. +set void SetCaretLineBack=2098(colour back,) + +# Set a style to be changeable or not (read only). +# Experimental feature, currently buggy. +set void StyleSetChangeable=2099(int style, bool changeable) + +# Display a auto-completion list. +# The lenEntered parameter indicates how many characters before +# the caret should be used to provide context. +fun void AutoCShow=2100(int lenEntered, string itemList) + +# Remove the auto-completion list from the screen. +fun void AutoCCancel=2101(,) + +# Is there an auto-completion list visible? +fun bool AutoCActive=2102(,) + +# Retrieve the position of the caret when the auto-completion list was displayed. +fun position AutoCPosStart=2103(,) + +# User has selected an item so remove the list and insert the selection. +fun void AutoCComplete=2104(,) + +# Define a set of character that when typed cancel the auto-completion list. +fun void AutoCStops=2105(, string characterSet) + +# Change the separator character in the string setting up an auto-completion list. +# Default is space but can be changed if items contain space. +set void AutoCSetSeparator=2106(int separatorCharacter,) + +# Retrieve the auto-completion list separator character. +get int AutoCGetSeparator=2107(,) + +# Select the item in the auto-completion list that starts with a string. +fun void AutoCSelect=2108(, string text) + +# Should the auto-completion list be cancelled if the user backspaces to a +# position before where the box was created. +set void AutoCSetCancelAtStart=2110(bool cancel,) + +# Retrieve whether auto-completion cancelled by backspacing before start. +get bool AutoCGetCancelAtStart=2111(,) + +# Define a set of characters that when typed will cause the autocompletion to +# choose the selected item. +set void AutoCSetFillUps=2112(, string characterSet) + +# Should a single item auto-completion list automatically choose the item. +set void AutoCSetChooseSingle=2113(bool chooseSingle,) + +# Retrieve whether a single item auto-completion list automatically choose the item. +get bool AutoCGetChooseSingle=2114(,) + +# Set whether case is significant when performing auto-completion searches. +set void AutoCSetIgnoreCase=2115(bool ignoreCase,) + +# Retrieve state of ignore case flag. +get bool AutoCGetIgnoreCase=2116(,) + +# Display a list of strings and send notification when user chooses one. +fun void UserListShow=2117(int listType, string itemList) + +# Set whether or not autocompletion is hidden automatically when nothing matches. +set void AutoCSetAutoHide=2118(bool autoHide,) + +# Retrieve whether or not autocompletion is hidden automatically when nothing matches. +get bool AutoCGetAutoHide=2119(,) + +# Set whether or not autocompletion deletes any word characters +# after the inserted text upon completion. +set void AutoCSetDropRestOfWord=2270(bool dropRestOfWord,) + +# Retrieve whether or not autocompletion deletes any word characters +# after the inserted text upon completion. +get bool AutoCGetDropRestOfWord=2271(,) + +# Register an XPM image for use in autocompletion lists. +fun void RegisterImage=2405(int type, string xpmData) + +# Clear all the registered XPM images. +fun void ClearRegisteredImages=2408(,) + +# Retrieve the auto-completion list type-separator character. +get int AutoCGetTypeSeparator=2285(,) + +# Change the type-separator character in the string setting up an auto-completion list. +# Default is '?' but can be changed if items contain '?'. +set void AutoCSetTypeSeparator=2286(int separatorCharacter,) + +# Set the maximum width, in characters, of auto-completion and user lists. +# Set to 0 to autosize to fit longest item, which is the default. +set void AutoCSetMaxWidth=2208(int characterCount,) + +# Get the maximum width, in characters, of auto-completion and user lists. +get int AutoCGetMaxWidth=2209(,) + +# Set the maximum height, in rows, of auto-completion and user lists. +# The default is 5 rows. +set void AutoCSetMaxHeight=2210(int rowCount,) + +# Set the maximum height, in rows, of auto-completion and user lists. +get int AutoCGetMaxHeight=2211(,) + +# Set the number of spaces used for one level of indentation. +set void SetIndent=2122(int indentSize,) + +# Retrieve indentation size. +get int GetIndent=2123(,) + +# Indentation will only use space characters if useTabs is false, otherwise +# it will use a combination of tabs and spaces. +set void SetUseTabs=2124(bool useTabs,) + +# Retrieve whether tabs will be used in indentation. +get bool GetUseTabs=2125(,) + +# Change the indentation of a line to a number of columns. +set void SetLineIndentation=2126(int line, int indentSize) + +# Retrieve the number of columns that a line is indented. +get int GetLineIndentation=2127(int line,) + +# Retrieve the position before the first non indentation character on a line. +get position GetLineIndentPosition=2128(int line,) + +# Retrieve the column number of a position, taking tab width into account. +get int GetColumn=2129(position pos,) + +# Show or hide the horizontal scroll bar. +set void SetHScrollBar=2130(bool show,) + +# Is the horizontal scroll bar visible? +get bool GetHScrollBar=2131(,) + +# Show or hide indentation guides. +set void SetIndentationGuides=2132(bool show,) + +# Are the indentation guides visible? +get bool GetIndentationGuides=2133(,) + +# Set the highlighted indentation guide column. +# 0 = no highlighted guide. +set void SetHighlightGuide=2134(int column,) + +# Get the highlighted indentation guide column. +get int GetHighlightGuide=2135(,) + +# Get the position after the last visible characters on a line. +get int GetLineEndPosition=2136(int line,) + +# Get the code page used to interpret the bytes of the document as characters. +get int GetCodePage=2137(,) + +# Get the foreground colour of the caret. +get colour GetCaretFore=2138(,) + +# In palette mode? +get bool GetUsePalette=2139(,) + +# In read-only mode? +get bool GetReadOnly=2140(,) + +# Sets the position of the caret. +set void SetCurrentPos=2141(position pos,) + +# Sets the position that starts the selection - this becomes the anchor. +set void SetSelectionStart=2142(position pos,) + +# Returns the position at the start of the selection. +get position GetSelectionStart=2143(,) + +# Sets the position that ends the selection - this becomes the currentPosition. +set void SetSelectionEnd=2144(position pos,) + +# Returns the position at the end of the selection. +get position GetSelectionEnd=2145(,) + +# Sets the print magnification added to the point size of each style for printing. +set void SetPrintMagnification=2146(int magnification,) + +# Returns the print magnification. +get int GetPrintMagnification=2147(,) + +enu PrintOption=SC_PRINT_ +# PrintColourMode - use same colours as screen. +val SC_PRINT_NORMAL=0 +# PrintColourMode - invert the light value of each style for printing. +val SC_PRINT_INVERTLIGHT=1 +# PrintColourMode - force black text on white background for printing. +val SC_PRINT_BLACKONWHITE=2 +# PrintColourMode - text stays coloured, but all background is forced to be white for printing. +val SC_PRINT_COLOURONWHITE=3 +# PrintColourMode - only the default-background is forced to be white for printing. +val SC_PRINT_COLOURONWHITEDEFAULTBG=4 + +# Modify colours when printing for clearer printed text. +set void SetPrintColourMode=2148(int mode,) + +# Returns the print colour mode. +get int GetPrintColourMode=2149(,) + +enu FindOption=SCFIND_ +val SCFIND_WHOLEWORD=2 +val SCFIND_MATCHCASE=4 +val SCFIND_WORDSTART=0x00100000 +val SCFIND_REGEXP=0x00200000 +val SCFIND_POSIX=0x00400000 + +# Find some text in the document. +fun position FindText=2150(int flags, findtext ft) + +# On Windows, will draw the document into a display context such as a printer. +fun position FormatRange=2151(bool draw, formatrange fr) + +# Retrieve the display line at the top of the display. +get int GetFirstVisibleLine=2152(,) + +# Retrieve the contents of a line. +# Returns the length of the line. +fun int GetLine=2153(int line, stringresult text) + +# Returns the number of lines in the document. There is always at least one. +get int GetLineCount=2154(,) + +# Sets the size in pixels of the left margin. +set void SetMarginLeft=2155(, int pixelWidth) + +# Returns the size in pixels of the left margin. +get int GetMarginLeft=2156(,) + +# Sets the size in pixels of the right margin. +set void SetMarginRight=2157(, int pixelWidth) + +# Returns the size in pixels of the right margin. +get int GetMarginRight=2158(,) + +# Is the document different from when it was last saved? +get bool GetModify=2159(,) + +# Select a range of text. +fun void SetSel=2160(position start, position end) + +# Retrieve the selected text. +# Return the length of the text. +fun int GetSelText=2161(, stringresult text) + +# Retrieve a range of text. +# Return the length of the text. +fun int GetTextRange=2162(, textrange tr) + +# Draw the selection in normal style or with selection highlighted. +fun void HideSelection=2163(bool normal,) + +# Retrieve the x value of the point in the window where a position is displayed. +fun int PointXFromPosition=2164(, position pos) + +# Retrieve the y value of the point in the window where a position is displayed. +fun int PointYFromPosition=2165(, position pos) + +# Retrieve the line containing a position. +fun int LineFromPosition=2166(position pos,) + +# Retrieve the position at the start of a line. +fun position PositionFromLine=2167(int line,) + +# Scroll horizontally and vertically. +fun void LineScroll=2168(int columns, int lines) + +# Ensure the caret is visible. +fun void ScrollCaret=2169(,) + +# Replace the selected text with the argument text. +fun void ReplaceSel=2170(, string text) + +# Set to read only or read write. +set void SetReadOnly=2171(bool readOnly,) + +# Null operation. +fun void Null=2172(,) + +# Will a paste succeed? +fun bool CanPaste=2173(,) + +# Are there any undoable actions in the undo history? +fun bool CanUndo=2174(,) + +# Delete the undo history. +fun void EmptyUndoBuffer=2175(,) + +# Undo one action in the undo history. +fun void Undo=2176(,) + +# Cut the selection to the clipboard. +fun void Cut=2177(,) + +# Copy the selection to the clipboard. +fun void Copy=2178(,) + +# Paste the contents of the clipboard into the document replacing the selection. +fun void Paste=2179(,) + +# Clear the selection. +fun void Clear=2180(,) + +# Replace the contents of the document with the argument text. +fun void SetText=2181(, string text) + +# Retrieve all the text in the document. +# Returns number of characters retrieved. +fun int GetText=2182(int length, stringresult text) + +# Retrieve the number of characters in the document. +get int GetTextLength=2183(,) + +# Retrieve a pointer to a function that processes messages for this Scintilla. +get int GetDirectFunction=2184(,) + +# Retrieve a pointer value to use as the first argument when calling +# the function returned by GetDirectFunction. +get int GetDirectPointer=2185(,) + +# Set to overtype (true) or insert mode. +set void SetOvertype=2186(bool overtype,) + +# Returns true if overtype mode is active otherwise false is returned. +get bool GetOvertype=2187(,) + +# Set the width of the insert mode caret. +set void SetCaretWidth=2188(int pixelWidth,) + +# Returns the width of the insert mode caret. +get int GetCaretWidth=2189(,) + +# Sets the position that starts the target which is used for updating the +# document without affecting the scroll position. +set void SetTargetStart=2190(position pos,) + +# Get the position that starts the target. +get position GetTargetStart=2191(,) + +# Sets the position that ends the target which is used for updating the +# document without affecting the scroll position. +set void SetTargetEnd=2192(position pos,) + +# Get the position that ends the target. +get position GetTargetEnd=2193(,) + +# Replace the target text with the argument text. +# Text is counted so it can contain NULs. +# Returns the length of the replacement text. +fun int ReplaceTarget=2194(int length, string text) + +# Replace the target text with the argument text after \d processing. +# Text is counted so it can contain NULs. +# Looks for \d where d is between 1 and 9 and replaces these with the strings +# matched in the last search operation which were surrounded by \( and \). +# Returns the length of the replacement text including any change +# caused by processing the \d patterns. +fun int ReplaceTargetRE=2195(int length, string text) + +# Search for a counted string in the target and set the target to the found +# range. Text is counted so it can contain NULs. +# Returns length of range or -1 for failure in which case target is not moved. +fun int SearchInTarget=2197(int length, string text) + +# Set the search flags used by SearchInTarget. +set void SetSearchFlags=2198(int flags,) + +# Get the search flags used by SearchInTarget. +get int GetSearchFlags=2199(,) + +# Show a call tip containing a definition near position pos. +fun void CallTipShow=2200(position pos, string definition) + +# Remove the call tip from the screen. +fun void CallTipCancel=2201(,) + +# Is there an active call tip? +fun bool CallTipActive=2202(,) + +# Retrieve the position where the caret was before displaying the call tip. +fun position CallTipPosStart=2203(,) + +# Highlight a segment of the definition. +fun void CallTipSetHlt=2204(int start, int end) + +# Set the background colour for the call tip. +set void CallTipSetBack=2205(colour back,) + +# Set the foreground colour for the call tip. +set void CallTipSetFore=2206(colour fore,) + +# Set the foreground colour for the highlighted part of the call tip. +set void CallTipSetForeHlt=2207(colour fore,) + +# Enable use of STYLE_CALLTIP and set call tip tab size in pixels. +set void CallTipUseStyle=2212(int tabSize,) + +# Find the display line of a document line taking hidden lines into account. +fun int VisibleFromDocLine=2220(int line,) + +# Find the document line of a display line taking hidden lines into account. +fun int DocLineFromVisible=2221(int lineDisplay,) + +# The number of display lines needed to wrap a document line +fun int WrapCount=2235(int line,) + +enu FoldLevel=SC_FOLDLEVEL +val SC_FOLDLEVELBASE=0x400 +val SC_FOLDLEVELWHITEFLAG=0x1000 +val SC_FOLDLEVELHEADERFLAG=0x2000 +val SC_FOLDLEVELBOXHEADERFLAG=0x4000 +val SC_FOLDLEVELBOXFOOTERFLAG=0x8000 +val SC_FOLDLEVELCONTRACTED=0x10000 +val SC_FOLDLEVELUNINDENT=0x20000 +val SC_FOLDLEVELNUMBERMASK=0x0FFF + +# Set the fold level of a line. +# This encodes an integer level along with flags indicating whether the +# line is a header and whether it is effectively white space. +set void SetFoldLevel=2222(int line, int level) + +# Retrieve the fold level of a line. +get int GetFoldLevel=2223(int line,) + +# Find the last child line of a header line. +get int GetLastChild=2224(int line, int level) + +# Find the parent line of a child line. +get int GetFoldParent=2225(int line,) + +# Make a range of lines visible. +fun void ShowLines=2226(int lineStart, int lineEnd) + +# Make a range of lines invisible. +fun void HideLines=2227(int lineStart, int lineEnd) + +# Is a line visible? +get bool GetLineVisible=2228(int line,) + +# Show the children of a header line. +set void SetFoldExpanded=2229(int line, bool expanded) + +# Is a header line expanded? +get bool GetFoldExpanded=2230(int line,) + +# Switch a header line between expanded and contracted. +fun void ToggleFold=2231(int line,) + +# Ensure a particular line is visible by expanding any header line hiding it. +fun void EnsureVisible=2232(int line,) + +enu FoldFlag=SC_FOLDFLAG_ +val SC_FOLDFLAG_LINEBEFORE_EXPANDED=0x0002 +val SC_FOLDFLAG_LINEBEFORE_CONTRACTED=0x0004 +val SC_FOLDFLAG_LINEAFTER_EXPANDED=0x0008 +val SC_FOLDFLAG_LINEAFTER_CONTRACTED=0x0010 +val SC_FOLDFLAG_LEVELNUMBERS=0x0040 +val SC_FOLDFLAG_BOX=0x0001 + +# Set some style options for folding. +fun void SetFoldFlags=2233(int flags,) + +# Ensure a particular line is visible by expanding any header line hiding it. +# Use the currently set visibility policy to determine which range to display. +fun void EnsureVisibleEnforcePolicy=2234(int line,) + +# Sets whether a tab pressed when caret is within indentation indents. +set void SetTabIndents=2260(bool tabIndents,) + +# Does a tab pressed when caret is within indentation indent? +get bool GetTabIndents=2261(,) + +# Sets whether a backspace pressed when caret is within indentation unindents. +set void SetBackSpaceUnIndents=2262(bool bsUnIndents,) + +# Does a backspace pressed when caret is within indentation unindent? +get bool GetBackSpaceUnIndents=2263(,) + +val SC_TIME_FOREVER=10000000 + +# Sets the time the mouse must sit still to generate a mouse dwell event. +set void SetMouseDwellTime=2264(int periodMilliseconds,) + +# Retrieve the time the mouse must sit still to generate a mouse dwell event. +get int GetMouseDwellTime=2265(,) + +# Get position of start of word. +fun int WordStartPosition=2266(position pos, bool onlyWordCharacters) + +# Get position of end of word. +fun int WordEndPosition=2267(position pos, bool onlyWordCharacters) + +enu Wrap=SC_WRAP_ +val SC_WRAP_NONE=0 +val SC_WRAP_WORD=1 +val SC_WRAP_CHAR=2 + +# Sets whether text is word wrapped. +set void SetWrapMode=2268(int mode,) + +# Retrieve whether text is word wrapped. +get int GetWrapMode=2269(,) + +enu WrapVisualFlag=SC_WRAPVISUALFLAG_ +val SC_WRAPVISUALFLAG_NONE=0x0000 +val SC_WRAPVISUALFLAG_END=0x0001 +val SC_WRAPVISUALFLAG_START=0x0002 + +# Set the display mode of visual flags for wrapped lines. +set void SetWrapVisualFlags=2460(int wrapVisualFlags,) + +# Retrive the display mode of visual flags for wrapped lines. +get int GetWrapVisualFlags=2461(,) + +enu WrapVisualLocation=SC_WRAPVISUALFLAGLOC_ +val SC_WRAPVISUALFLAGLOC_DEFAULT=0x0000 +val SC_WRAPVISUALFLAGLOC_END_BY_TEXT=0x0001 +val SC_WRAPVISUALFLAGLOC_START_BY_TEXT=0x0002 + +# Set the location of visual flags for wrapped lines. +set void SetWrapVisualFlagsLocation=2462(int wrapVisualFlagsLocation,) + +# Retrive the location of visual flags for wrapped lines. +get int GetWrapVisualFlagsLocation=2463(,) + +# Set the start indent for wrapped lines. +set void SetWrapStartIndent=2464(int indent,) + +# Retrive the start indent for wrapped lines. +get int GetWrapStartIndent=2465(,) + +enu LineCache=SC_CACHE_ +val SC_CACHE_NONE=0 +val SC_CACHE_CARET=1 +val SC_CACHE_PAGE=2 +val SC_CACHE_DOCUMENT=3 + +# Sets the degree of caching of layout information. +set void SetLayoutCache=2272(int mode,) + +# Retrieve the degree of caching of layout information. +get int GetLayoutCache=2273(,) + +# Sets the document width assumed for scrolling. +set void SetScrollWidth=2274(int pixelWidth,) + +# Retrieve the document width assumed for scrolling. +get int GetScrollWidth=2275(,) + +# Measure the pixel width of some text in a particular style. +# NUL terminated text argument. +# Does not handle tab or control characters. +fun int TextWidth=2276(int style, string text) + +# Sets the scroll range so that maximum scroll position has +# the last line at the bottom of the view (default). +# Setting this to false allows scrolling one page below the last line. +set void SetEndAtLastLine=2277(bool endAtLastLine,) + +# Retrieve whether the maximum scroll position has the last +# line at the bottom of the view. +get bool GetEndAtLastLine=2278(,) + +# Retrieve the height of a particular line of text in pixels. +fun int TextHeight=2279(int line,) + +# Show or hide the vertical scroll bar. +set void SetVScrollBar=2280(bool show,) + +# Is the vertical scroll bar visible? +get bool GetVScrollBar=2281(,) + +# Append a string to the end of the document without changing the selection. +fun void AppendText=2282(int length, string text) + +# Is drawing done in two phases with backgrounds drawn before faoregrounds? +get bool GetTwoPhaseDraw=2283(,) + +# In twoPhaseDraw mode, drawing is performed in two phases, first the background +# and then the foreground. This avoids chopping off characters that overlap the next run. +set void SetTwoPhaseDraw=2284(bool twoPhase,) + +# Make the target range start and end be the same as the selection range start and end. +fun void TargetFromSelection=2287(,) + +# Join the lines in the target. +fun void LinesJoin=2288(,) + +# Split the lines in the target into lines that are less wide than pixelWidth +# where possible. +fun void LinesSplit=2289(int pixelWidth,) + +# Set the colours used as a chequerboard pattern in the fold margin +fun void SetFoldMarginColour=2290(bool useSetting, colour back) +fun void SetFoldMarginHiColour=2291(bool useSetting, colour fore) + +## New messages go here + +## Start of key messages +# Move caret down one line. +fun void LineDown=2300(,) + +# Move caret down one line extending selection to new caret position. +fun void LineDownExtend=2301(,) + +# Move caret up one line. +fun void LineUp=2302(,) + +# Move caret up one line extending selection to new caret position. +fun void LineUpExtend=2303(,) + +# Move caret left one character. +fun void CharLeft=2304(,) + +# Move caret left one character extending selection to new caret position. +fun void CharLeftExtend=2305(,) + +# Move caret right one character. +fun void CharRight=2306(,) + +# Move caret right one character extending selection to new caret position. +fun void CharRightExtend=2307(,) + +# Move caret left one word. +fun void WordLeft=2308(,) + +# Move caret left one word extending selection to new caret position. +fun void WordLeftExtend=2309(,) + +# Move caret right one word. +fun void WordRight=2310(,) + +# Move caret right one word extending selection to new caret position. +fun void WordRightExtend=2311(,) + +# Move caret to first position on line. +fun void Home=2312(,) + +# Move caret to first position on line extending selection to new caret position. +fun void HomeExtend=2313(,) + +# Move caret to last position on line. +fun void LineEnd=2314(,) + +# Move caret to last position on line extending selection to new caret position. +fun void LineEndExtend=2315(,) + +# Move caret to first position in document. +fun void DocumentStart=2316(,) + +# Move caret to first position in document extending selection to new caret position. +fun void DocumentStartExtend=2317(,) + +# Move caret to last position in document. +fun void DocumentEnd=2318(,) + +# Move caret to last position in document extending selection to new caret position. +fun void DocumentEndExtend=2319(,) + +# Move caret one page up. +fun void PageUp=2320(,) + +# Move caret one page up extending selection to new caret position. +fun void PageUpExtend=2321(,) + +# Move caret one page down. +fun void PageDown=2322(,) + +# Move caret one page down extending selection to new caret position. +fun void PageDownExtend=2323(,) + +# Switch from insert to overtype mode or the reverse. +fun void EditToggleOvertype=2324(,) + +# Cancel any modes such as call tip or auto-completion list display. +fun void Cancel=2325(,) + +# Delete the selection or if no selection, the character before the caret. +fun void DeleteBack=2326(,) + +# If selection is empty or all on one line replace the selection with a tab character. +# If more than one line selected, indent the lines. +fun void Tab=2327(,) + +# Dedent the selected lines. +fun void BackTab=2328(,) + +# Insert a new line, may use a CRLF, CR or LF depending on EOL mode. +fun void NewLine=2329(,) + +# Insert a Form Feed character. +fun void FormFeed=2330(,) + +# Move caret to before first visible character on line. +# If already there move to first character on line. +fun void VCHome=2331(,) + +# Like VCHome but extending selection to new caret position. +fun void VCHomeExtend=2332(,) + +# Magnify the displayed text by increasing the sizes by 1 point. +fun void ZoomIn=2333(,) + +# Make the displayed text smaller by decreasing the sizes by 1 point. +fun void ZoomOut=2334(,) + +# Delete the word to the left of the caret. +fun void DelWordLeft=2335(,) + +# Delete the word to the right of the caret. +fun void DelWordRight=2336(,) + +# Cut the line containing the caret. +fun void LineCut=2337(,) + +# Delete the line containing the caret. +fun void LineDelete=2338(,) + +# Switch the current line with the previous. +fun void LineTranspose=2339(,) + +# Duplicate the current line. +fun void LineDuplicate=2404(,) + +# Transform the selection to lower case. +fun void LowerCase=2340(,) + +# Transform the selection to upper case. +fun void UpperCase=2341(,) + +# Scroll the document down, keeping the caret visible. +fun void LineScrollDown=2342(,) + +# Scroll the document up, keeping the caret visible. +fun void LineScrollUp=2343(,) + +# Delete the selection or if no selection, the character before the caret. +# Will not delete the character before at the start of a line. +fun void DeleteBackNotLine=2344(,) + +# Move caret to first position on display line. +fun void HomeDisplay=2345(,) + +# Move caret to first position on display line extending selection to +# new caret position. +fun void HomeDisplayExtend=2346(,) + +# Move caret to last position on display line. +fun void LineEndDisplay=2347(,) + +# Move caret to last position on display line extending selection to new +# caret position. +fun void LineEndDisplayExtend=2348(,) + +# These are like their namesakes Home(Extend)?, LineEnd(Extend)?, VCHome(Extend)? +# except they behave differently when word-wrap is enabled: +# They go first to the start / end of the display line, like (Home|LineEnd)Display +# The difference is that, the cursor is already at the point, it goes on to the start +# or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?. + +fun void HomeWrap=2349(,) +fun void HomeWrapExtend=2450(,) +fun void LineEndWrap=2451(,) +fun void LineEndWrapExtend=2452(,) +fun void VCHomeWrap=2453(,) +fun void VCHomeWrapExtend=2454(,) + +# Copy the line containing the caret. +fun void LineCopy=2455(,) + +# Move the caret inside current view if it's not there already. +fun void MoveCaretInsideView=2401(,) + +# How many characters are on a line, including end of line characters? +fun int LineLength=2350(int line,) + +# Highlight the characters at two positions. +fun void BraceHighlight=2351(position pos1, position pos2) + +# Highlight the character at a position indicating there is no matching brace. +fun void BraceBadLight=2352(position pos,) + +# Find the position of a matching brace or INVALID_POSITION if no match. +fun position BraceMatch=2353(position pos,) + +# Are the end of line characters visible? +get bool GetViewEOL=2355(,) + +# Make the end of line characters visible or invisible. +set void SetViewEOL=2356(bool visible,) + +# Retrieve a pointer to the document object. +get int GetDocPointer=2357(,) + +# Change the document object used. +set void SetDocPointer=2358(, int pointer) + +# Set which document modification events are sent to the container. +set void SetModEventMask=2359(int mask,) + +enu EdgeVisualStyle=EDGE_ +val EDGE_NONE=0 +val EDGE_LINE=1 +val EDGE_BACKGROUND=2 + +# Retrieve the column number which text should be kept within. +get int GetEdgeColumn=2360(,) + +# Set the column number of the edge. +# If text goes past the edge then it is highlighted. +set void SetEdgeColumn=2361(int column,) + +# Retrieve the edge highlight mode. +get int GetEdgeMode=2362(,) + +# The edge may be displayed by a line (EDGE_LINE) or by highlighting text that +# goes beyond it (EDGE_BACKGROUND) or not displayed at all (EDGE_NONE). +set void SetEdgeMode=2363(int mode,) + +# Retrieve the colour used in edge indication. +get colour GetEdgeColour=2364(,) + +# Change the colour used in edge indication. +set void SetEdgeColour=2365(colour edgeColour,) + +# Sets the current caret position to be the search anchor. +fun void SearchAnchor=2366(,) + +# Find some text starting at the search anchor. +# Does not ensure the selection is visible. +fun int SearchNext=2367(int flags, string text) + +# Find some text starting at the search anchor and moving backwards. +# Does not ensure the selection is visible. +fun int SearchPrev=2368(int flags, string text) + +# Retrieves the number of lines completely visible. +get int LinesOnScreen=2370(,) + +# Set whether a pop up menu is displayed automatically when the user presses +# the wrong mouse button. +fun void UsePopUp=2371(bool allowPopUp,) + +# Is the selection rectangular? The alternative is the more common stream selection. +get bool SelectionIsRectangle=2372(,) + +# Set the zoom level. This number of points is added to the size of all fonts. +# It may be positive to magnify or negative to reduce. +set void SetZoom=2373(int zoom,) +# Retrieve the zoom level. +get int GetZoom=2374(,) + +# Create a new document object. +# Starts with reference count of 1 and not selected into editor. +fun int CreateDocument=2375(,) +# Extend life of document. +fun void AddRefDocument=2376(, int doc) +# Release a reference to the document, deleting document if it fades to black. +fun void ReleaseDocument=2377(, int doc) + +# Get which document modification events are sent to the container. +get int GetModEventMask=2378(,) + +# Change internal focus flag. +set void SetFocus=2380(bool focus,) +# Get internal focus flag. +get bool GetFocus=2381(,) + +# Change error status - 0 = OK. +set void SetStatus=2382(int statusCode,) +# Get error status. +get int GetStatus=2383(,) + +# Set whether the mouse is captured when its button is pressed. +set void SetMouseDownCaptures=2384(bool captures,) +# Get whether mouse gets captured. +get bool GetMouseDownCaptures=2385(,) + +enu CursorShape=SC_CURSOR +val SC_CURSORNORMAL=-1 +val SC_CURSORWAIT=4 +# Sets the cursor to one of the SC_CURSOR* values. +set void SetCursor=2386(int cursorType,) +# Get cursor type. +get int GetCursor=2387(,) + +# Change the way control characters are displayed: +# If symbol is < 32, keep the drawn way, else, use the given character. +set void SetControlCharSymbol=2388(int symbol,) +# Get the way control characters are displayed. +get int GetControlCharSymbol=2389(,) + +# Move to the previous change in capitalisation. +fun void WordPartLeft=2390(,) +# Move to the previous change in capitalisation extending selection +# to new caret position. +fun void WordPartLeftExtend=2391(,) +# Move to the change next in capitalisation. +fun void WordPartRight=2392(,) +# Move to the next change in capitalisation extending selection +# to new caret position. +fun void WordPartRightExtend=2393(,) + +# Constants for use with SetVisiblePolicy, similar to SetCaretPolicy. +val VISIBLE_SLOP=0x01 +val VISIBLE_STRICT=0x04 +# Set the way the display area is determined when a particular line +# is to be moved to by Find, FindNext, GotoLine, etc. +fun void SetVisiblePolicy=2394(int visiblePolicy, int visibleSlop) + +# Delete back from the current position to the start of the line. +fun void DelLineLeft=2395(,) + +# Delete forwards from the current position to the end of the line. +fun void DelLineRight=2396(,) + +# Get and Set the xOffset (ie, horizonal scroll position). +set void SetXOffset=2397(int newOffset,) +get int GetXOffset=2398(,) + +# Set the last x chosen value to be the caret x position. +fun void ChooseCaretX=2399(,) + +# Set the focus to this Scintilla widget. +fun void GrabFocus=2400(,) + +enu CaretPolicy = CARET_ +# Caret policy, used by SetXCaretPolicy and SetYCaretPolicy. +# If CARET_SLOP is set, we can define a slop value: caretSlop. +# This value defines an unwanted zone (UZ) where the caret is... unwanted. +# This zone is defined as a number of pixels near the vertical margins, +# and as a number of lines near the horizontal margins. +# By keeping the caret away from the edges, it is seen within its context, +# so it is likely that the identifier that the caret is on can be completely seen, +# and that the current line is seen with some of the lines following it which are +# often dependent on that line. +val CARET_SLOP=0x01 +# If CARET_STRICT is set, the policy is enforced... strictly. +# The caret is centred on the display if slop is not set, +# and cannot go in the UZ if slop is set. +val CARET_STRICT=0x04 +# If CARET_JUMPS is set, the display is moved more energetically +# so the caret can move in the same direction longer before the policy is applied again. +val CARET_JUMPS=0x10 +# If CARET_EVEN is not set, instead of having symmetrical UZs, +# the left and bottom UZs are extended up to right and top UZs respectively. +# This way, we favour the displaying of useful information: the begining of lines, +# where most code reside, and the lines after the caret, eg. the body of a function. +val CARET_EVEN=0x08 + +# Set the way the caret is kept visible when going sideway. +# The exclusion zone is given in pixels. +fun void SetXCaretPolicy=2402(int caretPolicy, int caretSlop) + +# Set the way the line the caret is on is kept visible. +# The exclusion zone is given in lines. +fun void SetYCaretPolicy=2403(int caretPolicy, int caretSlop) + +# Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE). +set void SetPrintWrapMode=2406(int mode,) + +# Is printing line wrapped? +get int GetPrintWrapMode=2407(,) + +# Set a fore colour for active hotspots. +set void SetHotspotActiveFore=2410(bool useSetting, colour fore) + +# Get the fore colour for active hotspots. +get colour GetHotspotActiveFore=2494(,) + +# Set a back colour for active hotspots. +set void SetHotspotActiveBack=2411(bool useSetting, colour back) + +# Get the back colour for active hotspots. +get colour GetHotspotActiveBack=2495(,) + +# Enable / Disable underlining active hotspots. +set void SetHotspotActiveUnderline=2412(bool underline,) + +# Get whether underlining for active hotspots. +get bool GetHotspotActiveUnderline=2496(,) + +# Limit hotspots to single line so hotspots on two lines don't merge. +set void SetHotspotSingleLine=2421(bool singleLine,) + +# Get the HotspotSingleLine property +get bool GetHotspotSingleLine=2497(,) + +# Move caret between paragraphs (delimited by empty lines). +fun void ParaDown=2413(,) +fun void ParaDownExtend=2414(,) +fun void ParaUp=2415(,) +fun void ParaUpExtend=2416(,) + +# Given a valid document position, return the previous position taking code +# page into account. Returns 0 if passed 0. +fun position PositionBefore=2417(position pos,) + +# Given a valid document position, return the next position taking code +# page into account. Maximum value returned is the last position in the document. +fun position PositionAfter=2418(position pos,) + +# Copy a range of text to the clipboard. Positions are clipped into the document. +fun void CopyRange=2419(position start, position end) + +# Copy argument text to the clipboard. +fun void CopyText=2420(int length, string text) + +enu SelectionMode=SC_SEL_ +val SC_SEL_STREAM=0 +val SC_SEL_RECTANGLE=1 +val SC_SEL_LINES=2 + +# Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE) or +# by lines (SC_SEL_LINES). +set void SetSelectionMode=2422(int mode,) + +# Get the mode of the current selection. +get int GetSelectionMode=2423(,) + +# Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line). +fun position GetLineSelStartPosition=2424(int line,) + +# Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line). +fun position GetLineSelEndPosition=2425(int line,) + +## RectExtended rectangular selection moves +# Move caret down one line, extending rectangular selection to new caret position. +fun void LineDownRectExtend=2426(,) + +# Move caret up one line, extending rectangular selection to new caret position. +fun void LineUpRectExtend=2427(,) + +# Move caret left one character, extending rectangular selection to new caret position. +fun void CharLeftRectExtend=2428(,) + +# Move caret right one character, extending rectangular selection to new caret position. +fun void CharRightRectExtend=2429(,) + +# Move caret to first position on line, extending rectangular selection to new caret position. +fun void HomeRectExtend=2430(,) + +# Move caret to before first visible character on line. +# If already there move to first character on line. +# In either case, extend rectangular selection to new caret position. +fun void VCHomeRectExtend=2431(,) + +# Move caret to last position on line, extending rectangular selection to new caret position. +fun void LineEndRectExtend=2432(,) + +# Move caret one page up, extending rectangular selection to new caret position. +fun void PageUpRectExtend=2433(,) + +# Move caret one page down, extending rectangular selection to new caret position. +fun void PageDownRectExtend=2434(,) + + +# Move caret to top of page, or one page up if already at top of page. +fun void StutteredPageUp=2435(,) + +# Move caret to top of page, or one page up if already at top of page, extending selection to new caret position. +fun void StutteredPageUpExtend=2436(,) + +# Move caret to bottom of page, or one page down if already at bottom of page. +fun void StutteredPageDown=2437(,) + +# Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position. +fun void StutteredPageDownExtend=2438(,) + + +# Move caret left one word, position cursor at end of word. +fun void WordLeftEnd=2439(,) + +# Move caret left one word, position cursor at end of word, extending selection to new caret position. +fun void WordLeftEndExtend=2440(,) + +# Move caret right one word, position cursor at end of word. +fun void WordRightEnd=2441(,) + +# Move caret right one word, position cursor at end of word, extending selection to new caret position. +fun void WordRightEndExtend=2442(,) + +# Set the set of characters making up whitespace for when moving or selecting by word. +# Should be called after SetWordChars. +set void SetWhitespaceChars=2443(, string characters) + +# Reset the set of characters for whitespace and word characters to the defaults. +fun void SetCharsDefault=2444(,) + +# Get currently selected item position in the auto-completion list +fun int AutoCGetCurrent=2445(,) + +# Enlarge the document to a particular size of text bytes. +fun void Allocate=2446(int bytes,) + +# Returns the target converted to UTF8. +# Return the length in bytes. +fun int TargetAsUTF8=2447(, stringresult s) + +# Set the length of the utf8 argument for calling EncodedFromUTF8. +# Set to -1 and the string will be measured to the first nul. +fun void SetLengthForEncode=2448(int bytes,) + +# Translates a UTF8 string into the document encoding. +# Return the length of the result in bytes. +# On error return 0. +fun int EncodedFromUTF8=2449(string utf8, stringresult encoded) + +# Find the position of a column on a line taking into account tabs and +# multi-byte characters. If beyond end of line, return line end position. +fun int FindColumn=2456(int line, int column) + +# Can the caret preferred x position only be changed by explicit movement commands? +get bool GetCaretSticky=2457(,) + +# Stop the caret preferred x position changing when the user types. +set void SetCaretSticky=2458(bool useCaretStickyBehaviour,) + +# Switch between sticky and non-sticky: meant to be bound to a key. +fun void ToggleCaretSticky=2459(,) + +# Enable/Disable convert-on-paste for line endings +set void SetPasteConvertEndings=2467(bool convert,) + +# Get convert-on-paste setting +get bool GetPasteConvertEndings=2468(,) + +# Duplicate the selection. If selection empty duplicate the line containing the caret. +fun void SelectionDuplicate=2469(,) + +val SC_ALPHA_TRANSPARENT=0 +val SC_ALPHA_OPAQUE=255 +val SC_ALPHA_NOALPHA=256 + +# Set background alpha of the caret line. +set void SetCaretLineBackAlpha=2470(int alpha,) + +# Get the background alpha of the caret line. +get int GetCaretLineBackAlpha=2471(,) + +# Start notifying the container of all key presses and commands. +fun void StartRecord=3001(,) + +# Stop notifying the container of all key presses and commands. +fun void StopRecord=3002(,) + +# Set the lexing language of the document. +set void SetLexer=4001(int lexer,) + +# Retrieve the lexing language of the document. +get int GetLexer=4002(,) + +# Colourise a segment of the document using the current lexing language. +fun void Colourise=4003(position start, position end) + +# Set up a value that may be used by a lexer for some optional feature. +set void SetProperty=4004(string key, string value) + +# Maximum value of keywordSet parameter of SetKeyWords. +val KEYWORDSET_MAX=8 + +# Set up the key words used by the lexer. +set void SetKeyWords=4005(int keywordSet, string keyWords) + +# Set the lexing language of the document based on string name. +set void SetLexerLanguage=4006(, string language) + +# Load a lexer library (dll / so). +fun void LoadLexerLibrary=4007(, string path) + +# Retrieve a "property" value previously set with SetProperty. +fun int GetProperty=4008(string key, stringresult buf) + +# Retrieve a "property" value previously set with SetProperty, +# with "$()" variable replacement on returned buffer. +fun int GetPropertyExpanded=4009(string key, stringresult buf) + +# Retrieve a "property" value previously set with SetProperty, +# interpreted as an int AFTER any "$()" variable replacement. +get int GetPropertyInt=4010(string key,) + +# Retrieve the number of bits the current lexer needs for styling. +get int GetStyleBitsNeeded=4011(,) + +# Notifications +# Type of modification and the action which caused the modification. +# These are defined as a bit mask to make it easy to specify which notifications are wanted. +# One bit is set from each of SC_MOD_* and SC_PERFORMED_*. +enu ModificationFlags=SC_MOD_ SC_PERFORMED_ SC_LAST +val SC_MOD_INSERTTEXT=0x1 +val SC_MOD_DELETETEXT=0x2 +val SC_MOD_CHANGESTYLE=0x4 +val SC_MOD_CHANGEFOLD=0x8 +val SC_PERFORMED_USER=0x10 +val SC_PERFORMED_UNDO=0x20 +val SC_PERFORMED_REDO=0x40 +val SC_MULTISTEPUNDOREDO=0x80 +val SC_LASTSTEPINUNDOREDO=0x100 +val SC_MOD_CHANGEMARKER=0x200 +val SC_MOD_BEFOREINSERT=0x400 +val SC_MOD_BEFOREDELETE=0x800 +val SC_MULTILINEUNDOREDO=0x1000 +val SC_STARTACTION=0x2000 +val SC_MODEVENTMASKALL=0x2FFF + +# For compatibility, these go through the COMMAND notification rather than NOTIFY +# and should have had exactly the same values as the EN_* constants. +# Unfortunately the SETFOCUS and KILLFOCUS are flipped over from EN_* +# As clients depend on these constants, this will not be changed. +val SCEN_CHANGE=768 +val SCEN_SETFOCUS=512 +val SCEN_KILLFOCUS=256 + +# Symbolic key codes and modifier flags. +# ASCII and other printable characters below 256. +# Extended keys above 300. + +enu Keys=SCK_ +val SCK_DOWN=300 +val SCK_UP=301 +val SCK_LEFT=302 +val SCK_RIGHT=303 +val SCK_HOME=304 +val SCK_END=305 +val SCK_PRIOR=306 +val SCK_NEXT=307 +val SCK_DELETE=308 +val SCK_INSERT=309 +val SCK_ESCAPE=7 +val SCK_BACK=8 +val SCK_TAB=9 +val SCK_RETURN=13 +val SCK_ADD=310 +val SCK_SUBTRACT=311 +val SCK_DIVIDE=312 +val SCK_WIN=313 +val SCK_RWIN=314 +val SCK_MENU=315 + +enu KeyMod=SCMOD_ +val SCMOD_NORM=0 +val SCMOD_SHIFT=1 +val SCMOD_CTRL=2 +val SCMOD_ALT=4 + +################################################ +# For SciLexer.h +enu Lexer=SCLEX_ +val SCLEX_CONTAINER=0 +val SCLEX_NULL=1 +val SCLEX_PYTHON=2 +val SCLEX_CPP=3 +val SCLEX_HTML=4 +val SCLEX_XML=5 +val SCLEX_PERL=6 +val SCLEX_SQL=7 +val SCLEX_VB=8 +val SCLEX_PROPERTIES=9 +val SCLEX_ERRORLIST=10 +val SCLEX_MAKEFILE=11 +val SCLEX_BATCH=12 +val SCLEX_XCODE=13 +val SCLEX_LATEX=14 +val SCLEX_LUA=15 +val SCLEX_DIFF=16 +val SCLEX_CONF=17 +val SCLEX_PASCAL=18 +val SCLEX_AVE=19 +val SCLEX_ADA=20 +val SCLEX_LISP=21 +val SCLEX_RUBY=22 +val SCLEX_EIFFEL=23 +val SCLEX_EIFFELKW=24 +val SCLEX_TCL=25 +val SCLEX_NNCRONTAB=26 +val SCLEX_BULLANT=27 +val SCLEX_VBSCRIPT=28 +val SCLEX_BAAN=31 +val SCLEX_MATLAB=32 +val SCLEX_SCRIPTOL=33 +val SCLEX_ASM=34 +val SCLEX_CPPNOCASE=35 +val SCLEX_FORTRAN=36 +val SCLEX_F77=37 +val SCLEX_CSS=38 +val SCLEX_POV=39 +val SCLEX_LOUT=40 +val SCLEX_ESCRIPT=41 +val SCLEX_PS=42 +val SCLEX_NSIS=43 +val SCLEX_MMIXAL=44 +val SCLEX_CLW=45 +val SCLEX_CLWNOCASE=46 +val SCLEX_LOT=47 +val SCLEX_YAML=48 +val SCLEX_TEX=49 +val SCLEX_METAPOST=50 +val SCLEX_POWERBASIC=51 +val SCLEX_FORTH=52 +val SCLEX_ERLANG=53 +val SCLEX_OCTAVE=54 +val SCLEX_MSSQL=55 +val SCLEX_VERILOG=56 +val SCLEX_KIX=57 +val SCLEX_GUI4CLI=58 +val SCLEX_SPECMAN=59 +val SCLEX_AU3=60 +val SCLEX_APDL=61 +val SCLEX_BASH=62 +val SCLEX_ASN1=63 +val SCLEX_VHDL=64 +val SCLEX_CAML=65 +val SCLEX_BLITZBASIC=66 +val SCLEX_PUREBASIC=67 +val SCLEX_HASKELL=68 +val SCLEX_PHPSCRIPT=69 +val SCLEX_TADS3=70 +val SCLEX_REBOL=71 +val SCLEX_SMALLTALK=72 +val SCLEX_FLAGSHIP=73 +val SCLEX_CSOUND=74 +val SCLEX_FREEBASIC=75 +val SCLEX_INNOSETUP=76 +val SCLEX_OPAL=77 +val SCLEX_SPICE=78 +val SCLEX_D=79 +val SCLEX_CMAKE=80 + +# When a lexer specifies its language as SCLEX_AUTOMATIC it receives a +# value assigned in sequence from SCLEX_AUTOMATIC+1. +val SCLEX_AUTOMATIC=1000 +# Lexical states for SCLEX_PYTHON +lex Python=SCLEX_PYTHON SCE_P_ +val SCE_P_DEFAULT=0 +val SCE_P_COMMENTLINE=1 +val SCE_P_NUMBER=2 +val SCE_P_STRING=3 +val SCE_P_CHARACTER=4 +val SCE_P_WORD=5 +val SCE_P_TRIPLE=6 +val SCE_P_TRIPLEDOUBLE=7 +val SCE_P_CLASSNAME=8 +val SCE_P_DEFNAME=9 +val SCE_P_OPERATOR=10 +val SCE_P_IDENTIFIER=11 +val SCE_P_COMMENTBLOCK=12 +val SCE_P_STRINGEOL=13 +val SCE_P_WORD2=14 +val SCE_P_DECORATOR=15 +# Lexical states for SCLEX_CPP +lex Cpp=SCLEX_CPP SCE_C_ +lex Pascal=SCLEX_PASCAL SCE_C_ +lex BullAnt=SCLEX_BULLANT SCE_C_ +val SCE_C_DEFAULT=0 +val SCE_C_COMMENT=1 +val SCE_C_COMMENTLINE=2 +val SCE_C_COMMENTDOC=3 +val SCE_C_NUMBER=4 +val SCE_C_WORD=5 +val SCE_C_STRING=6 +val SCE_C_CHARACTER=7 +val SCE_C_UUID=8 +val SCE_C_PREPROCESSOR=9 +val SCE_C_OPERATOR=10 +val SCE_C_IDENTIFIER=11 +val SCE_C_STRINGEOL=12 +val SCE_C_VERBATIM=13 +val SCE_C_REGEX=14 +val SCE_C_COMMENTLINEDOC=15 +val SCE_C_WORD2=16 +val SCE_C_COMMENTDOCKEYWORD=17 +val SCE_C_COMMENTDOCKEYWORDERROR=18 +val SCE_C_GLOBALCLASS=19 +# Lexical states for SCLEX_D +lex D=SCLEX_D SCE_D_ +val SCE_D_DEFAULT=0 +val SCE_D_COMMENT=1 +val SCE_D_COMMENTLINE=2 +val SCE_D_COMMENTDOC=3 +val SCE_D_COMMENTNESTED=4 +val SCE_D_NUMBER=5 +val SCE_D_WORD=6 +val SCE_D_WORD2=7 +val SCE_D_WORD3=8 +val SCE_D_TYPEDEF=9 +val SCE_D_STRING=10 +val SCE_D_STRINGEOL=11 +val SCE_D_CHARACTER=12 +val SCE_D_OPERATOR=13 +val SCE_D_IDENTIFIER=14 +val SCE_D_COMMENTLINEDOC=15 +val SCE_D_COMMENTDOCKEYWORD=16 +val SCE_D_COMMENTDOCKEYWORDERROR=17 +# Lexical states for SCLEX_TCL +lex TCL=SCLEX_TCL SCE_TCL_ +val SCE_TCL_DEFAULT=0 +val SCE_TCL_COMMENT=1 +val SCE_TCL_COMMENTLINE=2 +val SCE_TCL_NUMBER=3 +val SCE_TCL_WORD_IN_QUOTE=4 +val SCE_TCL_IN_QUOTE=5 +val SCE_TCL_OPERATOR=6 +val SCE_TCL_IDENTIFIER=7 +val SCE_TCL_SUBSTITUTION=8 +val SCE_TCL_SUB_BRACE=9 +val SCE_TCL_MODIFIER=10 +val SCE_TCL_EXPAND=11 +val SCE_TCL_WORD=12 +val SCE_TCL_WORD2=13 +val SCE_TCL_WORD3=14 +val SCE_TCL_WORD4=15 +val SCE_TCL_WORD5=16 +val SCE_TCL_WORD6=17 +val SCE_TCL_WORD7=18 +val SCE_TCL_WORD8=19 +val SCE_TCL_COMMENT_BOX=20 +val SCE_TCL_BLOCK_COMMENT=21 +# Lexical states for SCLEX_HTML, SCLEX_XML +lex HTML=SCLEX_HTML SCE_H +lex XML=SCLEX_XML SCE_H +lex ASP=SCLEX_ASP SCE_H +lex PHP=SCLEX_PHP SCE_H +val SCE_H_DEFAULT=0 +val SCE_H_TAG=1 +val SCE_H_TAGUNKNOWN=2 +val SCE_H_ATTRIBUTE=3 +val SCE_H_ATTRIBUTEUNKNOWN=4 +val SCE_H_NUMBER=5 +val SCE_H_DOUBLESTRING=6 +val SCE_H_SINGLESTRING=7 +val SCE_H_OTHER=8 +val SCE_H_COMMENT=9 +val SCE_H_ENTITY=10 +# XML and ASP +val SCE_H_TAGEND=11 +val SCE_H_XMLSTART=12 +val SCE_H_XMLEND=13 +val SCE_H_SCRIPT=14 +val SCE_H_ASP=15 +val SCE_H_ASPAT=16 +val SCE_H_CDATA=17 +val SCE_H_QUESTION=18 +# More HTML +val SCE_H_VALUE=19 +# X-Code +val SCE_H_XCCOMMENT=20 +# SGML +val SCE_H_SGML_DEFAULT=21 +val SCE_H_SGML_COMMAND=22 +val SCE_H_SGML_1ST_PARAM=23 +val SCE_H_SGML_DOUBLESTRING=24 +val SCE_H_SGML_SIMPLESTRING=25 +val SCE_H_SGML_ERROR=26 +val SCE_H_SGML_SPECIAL=27 +val SCE_H_SGML_ENTITY=28 +val SCE_H_SGML_COMMENT=29 +val SCE_H_SGML_1ST_PARAM_COMMENT=30 +val SCE_H_SGML_BLOCK_DEFAULT=31 +# Embedded Javascript +val SCE_HJ_START=40 +val SCE_HJ_DEFAULT=41 +val SCE_HJ_COMMENT=42 +val SCE_HJ_COMMENTLINE=43 +val SCE_HJ_COMMENTDOC=44 +val SCE_HJ_NUMBER=45 +val SCE_HJ_WORD=46 +val SCE_HJ_KEYWORD=47 +val SCE_HJ_DOUBLESTRING=48 +val SCE_HJ_SINGLESTRING=49 +val SCE_HJ_SYMBOLS=50 +val SCE_HJ_STRINGEOL=51 +val SCE_HJ_REGEX=52 +# ASP Javascript +val SCE_HJA_START=55 +val SCE_HJA_DEFAULT=56 +val SCE_HJA_COMMENT=57 +val SCE_HJA_COMMENTLINE=58 +val SCE_HJA_COMMENTDOC=59 +val SCE_HJA_NUMBER=60 +val SCE_HJA_WORD=61 +val SCE_HJA_KEYWORD=62 +val SCE_HJA_DOUBLESTRING=63 +val SCE_HJA_SINGLESTRING=64 +val SCE_HJA_SYMBOLS=65 +val SCE_HJA_STRINGEOL=66 +val SCE_HJA_REGEX=67 +# Embedded VBScript +val SCE_HB_START=70 +val SCE_HB_DEFAULT=71 +val SCE_HB_COMMENTLINE=72 +val SCE_HB_NUMBER=73 +val SCE_HB_WORD=74 +val SCE_HB_STRING=75 +val SCE_HB_IDENTIFIER=76 +val SCE_HB_STRINGEOL=77 +# ASP VBScript +val SCE_HBA_START=80 +val SCE_HBA_DEFAULT=81 +val SCE_HBA_COMMENTLINE=82 +val SCE_HBA_NUMBER=83 +val SCE_HBA_WORD=84 +val SCE_HBA_STRING=85 +val SCE_HBA_IDENTIFIER=86 +val SCE_HBA_STRINGEOL=87 +# Embedded Python +val SCE_HP_START=90 +val SCE_HP_DEFAULT=91 +val SCE_HP_COMMENTLINE=92 +val SCE_HP_NUMBER=93 +val SCE_HP_STRING=94 +val SCE_HP_CHARACTER=95 +val SCE_HP_WORD=96 +val SCE_HP_TRIPLE=97 +val SCE_HP_TRIPLEDOUBLE=98 +val SCE_HP_CLASSNAME=99 +val SCE_HP_DEFNAME=100 +val SCE_HP_OPERATOR=101 +val SCE_HP_IDENTIFIER=102 +# PHP +val SCE_HPHP_COMPLEX_VARIABLE=104 +# ASP Python +val SCE_HPA_START=105 +val SCE_HPA_DEFAULT=106 +val SCE_HPA_COMMENTLINE=107 +val SCE_HPA_NUMBER=108 +val SCE_HPA_STRING=109 +val SCE_HPA_CHARACTER=110 +val SCE_HPA_WORD=111 +val SCE_HPA_TRIPLE=112 +val SCE_HPA_TRIPLEDOUBLE=113 +val SCE_HPA_CLASSNAME=114 +val SCE_HPA_DEFNAME=115 +val SCE_HPA_OPERATOR=116 +val SCE_HPA_IDENTIFIER=117 +# PHP +val SCE_HPHP_DEFAULT=118 +val SCE_HPHP_HSTRING=119 +val SCE_HPHP_SIMPLESTRING=120 +val SCE_HPHP_WORD=121 +val SCE_HPHP_NUMBER=122 +val SCE_HPHP_VARIABLE=123 +val SCE_HPHP_COMMENT=124 +val SCE_HPHP_COMMENTLINE=125 +val SCE_HPHP_HSTRING_VARIABLE=126 +val SCE_HPHP_OPERATOR=127 +# Lexical states for SCLEX_PERL +lex Perl=SCLEX_PERL SCE_PL_ +val SCE_PL_DEFAULT=0 +val SCE_PL_ERROR=1 +val SCE_PL_COMMENTLINE=2 +val SCE_PL_POD=3 +val SCE_PL_NUMBER=4 +val SCE_PL_WORD=5 +val SCE_PL_STRING=6 +val SCE_PL_CHARACTER=7 +val SCE_PL_PUNCTUATION=8 +val SCE_PL_PREPROCESSOR=9 +val SCE_PL_OPERATOR=10 +val SCE_PL_IDENTIFIER=11 +val SCE_PL_SCALAR=12 +val SCE_PL_ARRAY=13 +val SCE_PL_HASH=14 +val SCE_PL_SYMBOLTABLE=15 +val SCE_PL_VARIABLE_INDEXER=16 +val SCE_PL_REGEX=17 +val SCE_PL_REGSUBST=18 +val SCE_PL_LONGQUOTE=19 +val SCE_PL_BACKTICKS=20 +val SCE_PL_DATASECTION=21 +val SCE_PL_HERE_DELIM=22 +val SCE_PL_HERE_Q=23 +val SCE_PL_HERE_QQ=24 +val SCE_PL_HERE_QX=25 +val SCE_PL_STRING_Q=26 +val SCE_PL_STRING_QQ=27 +val SCE_PL_STRING_QX=28 +val SCE_PL_STRING_QR=29 +val SCE_PL_STRING_QW=30 +val SCE_PL_POD_VERB=31 +# Lexical states for SCLEX_RUBY +lex Ruby=SCLEX_RUBY SCE_RB_ +val SCE_RB_DEFAULT=0 +val SCE_RB_ERROR=1 +val SCE_RB_COMMENTLINE=2 +val SCE_RB_POD=3 +val SCE_RB_NUMBER=4 +val SCE_RB_WORD=5 +val SCE_RB_STRING=6 +val SCE_RB_CHARACTER=7 +val SCE_RB_CLASSNAME=8 +val SCE_RB_DEFNAME=9 +val SCE_RB_OPERATOR=10 +val SCE_RB_IDENTIFIER=11 +val SCE_RB_REGEX=12 +val SCE_RB_GLOBAL=13 +val SCE_RB_SYMBOL=14 +val SCE_RB_MODULE_NAME=15 +val SCE_RB_INSTANCE_VAR=16 +val SCE_RB_CLASS_VAR=17 +val SCE_RB_BACKTICKS=18 +val SCE_RB_DATASECTION=19 +val SCE_RB_HERE_DELIM=20 +val SCE_RB_HERE_Q=21 +val SCE_RB_HERE_QQ=22 +val SCE_RB_HERE_QX=23 +val SCE_RB_STRING_Q=24 +val SCE_RB_STRING_QQ=25 +val SCE_RB_STRING_QX=26 +val SCE_RB_STRING_QR=27 +val SCE_RB_STRING_QW=28 +val SCE_RB_WORD_DEMOTED=29 +val SCE_RB_STDIN=30 +val SCE_RB_STDOUT=31 +val SCE_RB_STDERR=40 +val SCE_RB_UPPER_BOUND=41 +# Lexical states for SCLEX_VB, SCLEX_VBSCRIPT, SCLEX_POWERBASIC +lex VB=SCLEX_VB SCE_B_ +lex VBScript=SCLEX_VBSCRIPT SCE_B_ +lex PowerBasic=SCLEX_POWERBASIC SCE_B_ +val SCE_B_DEFAULT=0 +val SCE_B_COMMENT=1 +val SCE_B_NUMBER=2 +val SCE_B_KEYWORD=3 +val SCE_B_STRING=4 +val SCE_B_PREPROCESSOR=5 +val SCE_B_OPERATOR=6 +val SCE_B_IDENTIFIER=7 +val SCE_B_DATE=8 +val SCE_B_STRINGEOL=9 +val SCE_B_KEYWORD2=10 +val SCE_B_KEYWORD3=11 +val SCE_B_KEYWORD4=12 +val SCE_B_CONSTANT=13 +val SCE_B_ASM=14 +val SCE_B_LABEL=15 +val SCE_B_ERROR=16 +val SCE_B_HEXNUMBER=17 +val SCE_B_BINNUMBER=18 +# Lexical states for SCLEX_PROPERTIES +lex Properties=SCLEX_PROPERTIES SCE_PROPS_ +val SCE_PROPS_DEFAULT=0 +val SCE_PROPS_COMMENT=1 +val SCE_PROPS_SECTION=2 +val SCE_PROPS_ASSIGNMENT=3 +val SCE_PROPS_DEFVAL=4 +val SCE_PROPS_KEY=5 +# Lexical states for SCLEX_LATEX +lex LaTeX=SCLEX_LATEX SCE_L_ +val SCE_L_DEFAULT=0 +val SCE_L_COMMAND=1 +val SCE_L_TAG=2 +val SCE_L_MATH=3 +val SCE_L_COMMENT=4 +# Lexical states for SCLEX_LUA +lex Lua=SCLEX_LUA SCE_LUA_ +val SCE_LUA_DEFAULT=0 +val SCE_LUA_COMMENT=1 +val SCE_LUA_COMMENTLINE=2 +val SCE_LUA_COMMENTDOC=3 +val SCE_LUA_NUMBER=4 +val SCE_LUA_WORD=5 +val SCE_LUA_STRING=6 +val SCE_LUA_CHARACTER=7 +val SCE_LUA_LITERALSTRING=8 +val SCE_LUA_PREPROCESSOR=9 +val SCE_LUA_OPERATOR=10 +val SCE_LUA_IDENTIFIER=11 +val SCE_LUA_STRINGEOL=12 +val SCE_LUA_WORD2=13 +val SCE_LUA_WORD3=14 +val SCE_LUA_WORD4=15 +val SCE_LUA_WORD5=16 +val SCE_LUA_WORD6=17 +val SCE_LUA_WORD7=18 +val SCE_LUA_WORD8=19 +# Lexical states for SCLEX_ERRORLIST +lex ErrorList=SCLEX_ERRORLIST SCE_ERR_ +val SCE_ERR_DEFAULT=0 +val SCE_ERR_PYTHON=1 +val SCE_ERR_GCC=2 +val SCE_ERR_MS=3 +val SCE_ERR_CMD=4 +val SCE_ERR_BORLAND=5 +val SCE_ERR_PERL=6 +val SCE_ERR_NET=7 +val SCE_ERR_LUA=8 +val SCE_ERR_CTAG=9 +val SCE_ERR_DIFF_CHANGED=10 +val SCE_ERR_DIFF_ADDITION=11 +val SCE_ERR_DIFF_DELETION=12 +val SCE_ERR_DIFF_MESSAGE=13 +val SCE_ERR_PHP=14 +val SCE_ERR_ELF=15 +val SCE_ERR_IFC=16 +val SCE_ERR_IFORT=17 +val SCE_ERR_ABSF=18 +val SCE_ERR_TIDY=19 +val SCE_ERR_JAVA_STACK=20 +# Lexical states for SCLEX_BATCH +lex Batch=SCLEX_BATCH SCE_BAT_ +val SCE_BAT_DEFAULT=0 +val SCE_BAT_COMMENT=1 +val SCE_BAT_WORD=2 +val SCE_BAT_LABEL=3 +val SCE_BAT_HIDE=4 +val SCE_BAT_COMMAND=5 +val SCE_BAT_IDENTIFIER=6 +val SCE_BAT_OPERATOR=7 +# Lexical states for SCLEX_MAKEFILE +lex MakeFile=SCLEX_MAKEFILE SCE_MAKE_ +val SCE_MAKE_DEFAULT=0 +val SCE_MAKE_COMMENT=1 +val SCE_MAKE_PREPROCESSOR=2 +val SCE_MAKE_IDENTIFIER=3 +val SCE_MAKE_OPERATOR=4 +val SCE_MAKE_TARGET=5 +val SCE_MAKE_IDEOL=9 +# Lexical states for SCLEX_DIFF +lex Diff=SCLEX_DIFF SCE_DIFF_ +val SCE_DIFF_DEFAULT=0 +val SCE_DIFF_COMMENT=1 +val SCE_DIFF_COMMAND=2 +val SCE_DIFF_HEADER=3 +val SCE_DIFF_POSITION=4 +val SCE_DIFF_DELETED=5 +val SCE_DIFF_ADDED=6 +# Lexical states for SCLEX_CONF (Apache Configuration Files Lexer) +lex Conf=SCLEX_CONF SCE_CONF_ +val SCE_CONF_DEFAULT=0 +val SCE_CONF_COMMENT=1 +val SCE_CONF_NUMBER=2 +val SCE_CONF_IDENTIFIER=3 +val SCE_CONF_EXTENSION=4 +val SCE_CONF_PARAMETER=5 +val SCE_CONF_STRING=6 +val SCE_CONF_OPERATOR=7 +val SCE_CONF_IP=8 +val SCE_CONF_DIRECTIVE=9 +# Lexical states for SCLEX_AVE, Avenue +lex Avenue=SCLEX_AVE SCE_AVE_ +val SCE_AVE_DEFAULT=0 +val SCE_AVE_COMMENT=1 +val SCE_AVE_NUMBER=2 +val SCE_AVE_WORD=3 +val SCE_AVE_STRING=6 +val SCE_AVE_ENUM=7 +val SCE_AVE_STRINGEOL=8 +val SCE_AVE_IDENTIFIER=9 +val SCE_AVE_OPERATOR=10 +val SCE_AVE_WORD1=11 +val SCE_AVE_WORD2=12 +val SCE_AVE_WORD3=13 +val SCE_AVE_WORD4=14 +val SCE_AVE_WORD5=15 +val SCE_AVE_WORD6=16 +# Lexical states for SCLEX_ADA +lex Ada=SCLEX_ADA SCE_ADA_ +val SCE_ADA_DEFAULT=0 +val SCE_ADA_WORD=1 +val SCE_ADA_IDENTIFIER=2 +val SCE_ADA_NUMBER=3 +val SCE_ADA_DELIMITER=4 +val SCE_ADA_CHARACTER=5 +val SCE_ADA_CHARACTEREOL=6 +val SCE_ADA_STRING=7 +val SCE_ADA_STRINGEOL=8 +val SCE_ADA_LABEL=9 +val SCE_ADA_COMMENTLINE=10 +val SCE_ADA_ILLEGAL=11 +# Lexical states for SCLEX_BAAN +lex Baan=SCLEX_BAAN SCE_BAAN_ +val SCE_BAAN_DEFAULT=0 +val SCE_BAAN_COMMENT=1 +val SCE_BAAN_COMMENTDOC=2 +val SCE_BAAN_NUMBER=3 +val SCE_BAAN_WORD=4 +val SCE_BAAN_STRING=5 +val SCE_BAAN_PREPROCESSOR=6 +val SCE_BAAN_OPERATOR=7 +val SCE_BAAN_IDENTIFIER=8 +val SCE_BAAN_STRINGEOL=9 +val SCE_BAAN_WORD2=10 +# Lexical states for SCLEX_LISP +lex Lisp=SCLEX_LISP SCE_LISP_ +val SCE_LISP_DEFAULT=0 +val SCE_LISP_COMMENT=1 +val SCE_LISP_NUMBER=2 +val SCE_LISP_KEYWORD=3 +val SCE_LISP_KEYWORD_KW=4 +val SCE_LISP_SYMBOL=5 +val SCE_LISP_STRING=6 +val SCE_LISP_STRINGEOL=8 +val SCE_LISP_IDENTIFIER=9 +val SCE_LISP_OPERATOR=10 +val SCE_LISP_SPECIAL=11 +val SCE_LISP_MULTI_COMMENT=12 +# Lexical states for SCLEX_EIFFEL and SCLEX_EIFFELKW +lex Eiffel=SCLEX_EIFFEL SCE_EIFFEL_ +lex EiffelKW=SCLEX_EIFFELKW SCE_EIFFEL_ +val SCE_EIFFEL_DEFAULT=0 +val SCE_EIFFEL_COMMENTLINE=1 +val SCE_EIFFEL_NUMBER=2 +val SCE_EIFFEL_WORD=3 +val SCE_EIFFEL_STRING=4 +val SCE_EIFFEL_CHARACTER=5 +val SCE_EIFFEL_OPERATOR=6 +val SCE_EIFFEL_IDENTIFIER=7 +val SCE_EIFFEL_STRINGEOL=8 +# Lexical states for SCLEX_NNCRONTAB (nnCron crontab Lexer) +lex NNCronTab=SCLEX_NNCRONTAB SCE_NNCRONTAB_ +val SCE_NNCRONTAB_DEFAULT=0 +val SCE_NNCRONTAB_COMMENT=1 +val SCE_NNCRONTAB_TASK=2 +val SCE_NNCRONTAB_SECTION=3 +val SCE_NNCRONTAB_KEYWORD=4 +val SCE_NNCRONTAB_MODIFIER=5 +val SCE_NNCRONTAB_ASTERISK=6 +val SCE_NNCRONTAB_NUMBER=7 +val SCE_NNCRONTAB_STRING=8 +val SCE_NNCRONTAB_ENVIRONMENT=9 +val SCE_NNCRONTAB_IDENTIFIER=10 +# Lexical states for SCLEX_FORTH (Forth Lexer) +lex Forth=SCLEX_FORTH SCE_FORTH_ +val SCE_FORTH_DEFAULT=0 +val SCE_FORTH_COMMENT=1 +val SCE_FORTH_COMMENT_ML=2 +val SCE_FORTH_IDENTIFIER=3 +val SCE_FORTH_CONTROL=4 +val SCE_FORTH_KEYWORD=5 +val SCE_FORTH_DEFWORD=6 +val SCE_FORTH_PREWORD1=7 +val SCE_FORTH_PREWORD2=8 +val SCE_FORTH_NUMBER=9 +val SCE_FORTH_STRING=10 +val SCE_FORTH_LOCALE=11 +# Lexical states for SCLEX_MATLAB +lex MatLab=SCLEX_MATLAB SCE_MATLAB_ +val SCE_MATLAB_DEFAULT=0 +val SCE_MATLAB_COMMENT=1 +val SCE_MATLAB_COMMAND=2 +val SCE_MATLAB_NUMBER=3 +val SCE_MATLAB_KEYWORD=4 +# single quoted string +val SCE_MATLAB_STRING=5 +val SCE_MATLAB_OPERATOR=6 +val SCE_MATLAB_IDENTIFIER=7 +val SCE_MATLAB_DOUBLEQUOTESTRING=8 +# Lexical states for SCLEX_SCRIPTOL +lex Sol=SCLEX_SCRIPTOL SCE_SCRIPTOL_ +val SCE_SCRIPTOL_DEFAULT=0 +val SCE_SCRIPTOL_WHITE=1 +val SCE_SCRIPTOL_COMMENTLINE=2 +val SCE_SCRIPTOL_PERSISTENT=3 +val SCE_SCRIPTOL_CSTYLE=4 +val SCE_SCRIPTOL_COMMENTBLOCK=5 +val SCE_SCRIPTOL_NUMBER=6 +val SCE_SCRIPTOL_STRING=7 +val SCE_SCRIPTOL_CHARACTER=8 +val SCE_SCRIPTOL_STRINGEOL=9 +val SCE_SCRIPTOL_KEYWORD=10 +val SCE_SCRIPTOL_OPERATOR=11 +val SCE_SCRIPTOL_IDENTIFIER=12 +val SCE_SCRIPTOL_TRIPLE=13 +val SCE_SCRIPTOL_CLASSNAME=14 +val SCE_SCRIPTOL_PREPROCESSOR=15 +# Lexical states for SCLEX_ASM +lex Asm=SCLEX_ASM SCE_ASM_ +val SCE_ASM_DEFAULT=0 +val SCE_ASM_COMMENT=1 +val SCE_ASM_NUMBER=2 +val SCE_ASM_STRING=3 +val SCE_ASM_OPERATOR=4 +val SCE_ASM_IDENTIFIER=5 +val SCE_ASM_CPUINSTRUCTION=6 +val SCE_ASM_MATHINSTRUCTION=7 +val SCE_ASM_REGISTER=8 +val SCE_ASM_DIRECTIVE=9 +val SCE_ASM_DIRECTIVEOPERAND=10 +val SCE_ASM_COMMENTBLOCK=11 +val SCE_ASM_CHARACTER=12 +val SCE_ASM_STRINGEOL=13 +val SCE_ASM_EXTINSTRUCTION=14 +# Lexical states for SCLEX_FORTRAN +lex Fortran=SCLEX_FORTRAN SCE_F_ +lex F77=SCLEX_F77 SCE_F_ +val SCE_F_DEFAULT=0 +val SCE_F_COMMENT=1 +val SCE_F_NUMBER=2 +val SCE_F_STRING1=3 +val SCE_F_STRING2=4 +val SCE_F_STRINGEOL=5 +val SCE_F_OPERATOR=6 +val SCE_F_IDENTIFIER=7 +val SCE_F_WORD=8 +val SCE_F_WORD2=9 +val SCE_F_WORD3=10 +val SCE_F_PREPROCESSOR=11 +val SCE_F_OPERATOR2=12 +val SCE_F_LABEL=13 +val SCE_F_CONTINUATION=14 +# Lexical states for SCLEX_CSS +lex CSS=SCLEX_CSS SCE_CSS_ +val SCE_CSS_DEFAULT=0 +val SCE_CSS_TAG=1 +val SCE_CSS_CLASS=2 +val SCE_CSS_PSEUDOCLASS=3 +val SCE_CSS_UNKNOWN_PSEUDOCLASS=4 +val SCE_CSS_OPERATOR=5 +val SCE_CSS_IDENTIFIER=6 +val SCE_CSS_UNKNOWN_IDENTIFIER=7 +val SCE_CSS_VALUE=8 +val SCE_CSS_COMMENT=9 +val SCE_CSS_ID=10 +val SCE_CSS_IMPORTANT=11 +val SCE_CSS_DIRECTIVE=12 +val SCE_CSS_DOUBLESTRING=13 +val SCE_CSS_SINGLESTRING=14 +val SCE_CSS_IDENTIFIER2=15 +val SCE_CSS_ATTRIBUTE=16 +# Lexical states for SCLEX_POV +lex POV=SCLEX_POV SCE_POV_ +val SCE_POV_DEFAULT=0 +val SCE_POV_COMMENT=1 +val SCE_POV_COMMENTLINE=2 +val SCE_POV_NUMBER=3 +val SCE_POV_OPERATOR=4 +val SCE_POV_IDENTIFIER=5 +val SCE_POV_STRING=6 +val SCE_POV_STRINGEOL=7 +val SCE_POV_DIRECTIVE=8 +val SCE_POV_BADDIRECTIVE=9 +val SCE_POV_WORD2=10 +val SCE_POV_WORD3=11 +val SCE_POV_WORD4=12 +val SCE_POV_WORD5=13 +val SCE_POV_WORD6=14 +val SCE_POV_WORD7=15 +val SCE_POV_WORD8=16 +# Lexical states for SCLEX_LOUT +lex LOUT=SCLEX_LOUT SCE_LOUT_ +val SCE_LOUT_DEFAULT=0 +val SCE_LOUT_COMMENT=1 +val SCE_LOUT_NUMBER=2 +val SCE_LOUT_WORD=3 +val SCE_LOUT_WORD2=4 +val SCE_LOUT_WORD3=5 +val SCE_LOUT_WORD4=6 +val SCE_LOUT_STRING=7 +val SCE_LOUT_OPERATOR=8 +val SCE_LOUT_IDENTIFIER=9 +val SCE_LOUT_STRINGEOL=10 +# Lexical states for SCLEX_ESCRIPT +lex ESCRIPT=SCLEX_ESCRIPT SCE_ESCRIPT_ +val SCE_ESCRIPT_DEFAULT=0 +val SCE_ESCRIPT_COMMENT=1 +val SCE_ESCRIPT_COMMENTLINE=2 +val SCE_ESCRIPT_COMMENTDOC=3 +val SCE_ESCRIPT_NUMBER=4 +val SCE_ESCRIPT_WORD=5 +val SCE_ESCRIPT_STRING=6 +val SCE_ESCRIPT_OPERATOR=7 +val SCE_ESCRIPT_IDENTIFIER=8 +val SCE_ESCRIPT_BRACE=9 +val SCE_ESCRIPT_WORD2=10 +val SCE_ESCRIPT_WORD3=11 +# Lexical states for SCLEX_PS +lex PS=SCLEX_PS SCE_PS_ +val SCE_PS_DEFAULT=0 +val SCE_PS_COMMENT=1 +val SCE_PS_DSC_COMMENT=2 +val SCE_PS_DSC_VALUE=3 +val SCE_PS_NUMBER=4 +val SCE_PS_NAME=5 +val SCE_PS_KEYWORD=6 +val SCE_PS_LITERAL=7 +val SCE_PS_IMMEVAL=8 +val SCE_PS_PAREN_ARRAY=9 +val SCE_PS_PAREN_DICT=10 +val SCE_PS_PAREN_PROC=11 +val SCE_PS_TEXT=12 +val SCE_PS_HEXSTRING=13 +val SCE_PS_BASE85STRING=14 +val SCE_PS_BADSTRINGCHAR=15 +# Lexical states for SCLEX_NSIS +lex NSIS=SCLEX_NSIS SCE_NSIS_ +val SCE_NSIS_DEFAULT=0 +val SCE_NSIS_COMMENT=1 +val SCE_NSIS_STRINGDQ=2 +val SCE_NSIS_STRINGLQ=3 +val SCE_NSIS_STRINGRQ=4 +val SCE_NSIS_FUNCTION=5 +val SCE_NSIS_VARIABLE=6 +val SCE_NSIS_LABEL=7 +val SCE_NSIS_USERDEFINED=8 +val SCE_NSIS_SECTIONDEF=9 +val SCE_NSIS_SUBSECTIONDEF=10 +val SCE_NSIS_IFDEFINEDEF=11 +val SCE_NSIS_MACRODEF=12 +val SCE_NSIS_STRINGVAR=13 +val SCE_NSIS_NUMBER=14 +val SCE_NSIS_SECTIONGROUP=15 +val SCE_NSIS_PAGEEX=16 +val SCE_NSIS_FUNCTIONDEF=17 +val SCE_NSIS_COMMENTBOX=18 +# Lexical states for SCLEX_MMIXAL +lex MMIXAL=SCLEX_MMIXAL SCE_MMIXAL_ +val SCE_MMIXAL_LEADWS=0 +val SCE_MMIXAL_COMMENT=1 +val SCE_MMIXAL_LABEL=2 +val SCE_MMIXAL_OPCODE=3 +val SCE_MMIXAL_OPCODE_PRE=4 +val SCE_MMIXAL_OPCODE_VALID=5 +val SCE_MMIXAL_OPCODE_UNKNOWN=6 +val SCE_MMIXAL_OPCODE_POST=7 +val SCE_MMIXAL_OPERANDS=8 +val SCE_MMIXAL_NUMBER=9 +val SCE_MMIXAL_REF=10 +val SCE_MMIXAL_CHAR=11 +val SCE_MMIXAL_STRING=12 +val SCE_MMIXAL_REGISTER=13 +val SCE_MMIXAL_HEX=14 +val SCE_MMIXAL_OPERATOR=15 +val SCE_MMIXAL_SYMBOL=16 +val SCE_MMIXAL_INCLUDE=17 +# Lexical states for SCLEX_CLW +lex Clarion=SCLEX_CLW SCE_CLW_ +val SCE_CLW_DEFAULT=0 +val SCE_CLW_LABEL=1 +val SCE_CLW_COMMENT=2 +val SCE_CLW_STRING=3 +val SCE_CLW_USER_IDENTIFIER=4 +val SCE_CLW_INTEGER_CONSTANT=5 +val SCE_CLW_REAL_CONSTANT=6 +val SCE_CLW_PICTURE_STRING=7 +val SCE_CLW_KEYWORD=8 +val SCE_CLW_COMPILER_DIRECTIVE=9 +val SCE_CLW_RUNTIME_EXPRESSIONS=10 +val SCE_CLW_BUILTIN_PROCEDURES_FUNCTION=11 +val SCE_CLW_STRUCTURE_DATA_TYPE=12 +val SCE_CLW_ATTRIBUTE=13 +val SCE_CLW_STANDARD_EQUATE=14 +val SCE_CLW_ERROR=15 +val SCE_CLW_DEPRECATED=16 +# Lexical states for SCLEX_LOT +lex LOT=SCLEX_LOT SCE_LOT_ +val SCE_LOT_DEFAULT=0 +val SCE_LOT_HEADER=1 +val SCE_LOT_BREAK=2 +val SCE_LOT_SET=3 +val SCE_LOT_PASS=4 +val SCE_LOT_FAIL=5 +val SCE_LOT_ABORT=6 +# Lexical states for SCLEX_YAML +lex YAML=SCLEX_YAML SCE_YAML_ +val SCE_YAML_DEFAULT=0 +val SCE_YAML_COMMENT=1 +val SCE_YAML_IDENTIFIER=2 +val SCE_YAML_KEYWORD=3 +val SCE_YAML_NUMBER=4 +val SCE_YAML_REFERENCE=5 +val SCE_YAML_DOCUMENT=6 +val SCE_YAML_TEXT=7 +val SCE_YAML_ERROR=8 +# Lexical states for SCLEX_TEX +lex TeX=SCLEX_TEX SCE_TEX_ +val SCE_TEX_DEFAULT=0 +val SCE_TEX_SPECIAL=1 +val SCE_TEX_GROUP=2 +val SCE_TEX_SYMBOL=3 +val SCE_TEX_COMMAND=4 +val SCE_TEX_TEXT=5 +lex Metapost=SCLEX_METAPOST SCE_METAPOST_ +val SCE_METAPOST_DEFAULT=0 +val SCE_METAPOST_SPECIAL=1 +val SCE_METAPOST_GROUP=2 +val SCE_METAPOST_SYMBOL=3 +val SCE_METAPOST_COMMAND=4 +val SCE_METAPOST_TEXT=5 +val SCE_METAPOST_EXTRA=6 +# Lexical states for SCLEX_ERLANG +lex Erlang=SCLEX_ERLANG SCE_ERLANG_ +val SCE_ERLANG_DEFAULT=0 +val SCE_ERLANG_COMMENT=1 +val SCE_ERLANG_VARIABLE=2 +val SCE_ERLANG_NUMBER=3 +val SCE_ERLANG_KEYWORD=4 +val SCE_ERLANG_STRING=5 +val SCE_ERLANG_OPERATOR=6 +val SCE_ERLANG_ATOM=7 +val SCE_ERLANG_FUNCTION_NAME=8 +val SCE_ERLANG_CHARACTER=9 +val SCE_ERLANG_MACRO=10 +val SCE_ERLANG_RECORD=11 +val SCE_ERLANG_SEPARATOR=12 +val SCE_ERLANG_NODE_NAME=13 +val SCE_ERLANG_UNKNOWN=31 +# Lexical states for SCLEX_OCTAVE are identical to MatLab +lex Octave=SCLEX_OCTAVE SCE_MATLAB_ +# Lexical states for SCLEX_MSSQL +lex MSSQL=SCLEX_MSSQL SCE_MSSQL_ +val SCE_MSSQL_DEFAULT=0 +val SCE_MSSQL_COMMENT=1 +val SCE_MSSQL_LINE_COMMENT=2 +val SCE_MSSQL_NUMBER=3 +val SCE_MSSQL_STRING=4 +val SCE_MSSQL_OPERATOR=5 +val SCE_MSSQL_IDENTIFIER=6 +val SCE_MSSQL_VARIABLE=7 +val SCE_MSSQL_COLUMN_NAME=8 +val SCE_MSSQL_STATEMENT=9 +val SCE_MSSQL_DATATYPE=10 +val SCE_MSSQL_SYSTABLE=11 +val SCE_MSSQL_GLOBAL_VARIABLE=12 +val SCE_MSSQL_FUNCTION=13 +val SCE_MSSQL_STORED_PROCEDURE=14 +val SCE_MSSQL_DEFAULT_PREF_DATATYPE=15 +val SCE_MSSQL_COLUMN_NAME_2=16 +# Lexical states for SCLEX_VERILOG +lex Verilog=SCLEX_VERILOG SCE_V_ +val SCE_V_DEFAULT=0 +val SCE_V_COMMENT=1 +val SCE_V_COMMENTLINE=2 +val SCE_V_COMMENTLINEBANG=3 +val SCE_V_NUMBER=4 +val SCE_V_WORD=5 +val SCE_V_STRING=6 +val SCE_V_WORD2=7 +val SCE_V_WORD3=8 +val SCE_V_PREPROCESSOR=9 +val SCE_V_OPERATOR=10 +val SCE_V_IDENTIFIER=11 +val SCE_V_STRINGEOL=12 +val SCE_V_USER=19 +# Lexical states for SCLEX_KIX +lex Kix=SCLEX_KIX SCE_KIX_ +val SCE_KIX_DEFAULT=0 +val SCE_KIX_COMMENT=1 +val SCE_KIX_STRING1=2 +val SCE_KIX_STRING2=3 +val SCE_KIX_NUMBER=4 +val SCE_KIX_VAR=5 +val SCE_KIX_MACRO=6 +val SCE_KIX_KEYWORD=7 +val SCE_KIX_FUNCTIONS=8 +val SCE_KIX_OPERATOR=9 +val SCE_KIX_IDENTIFIER=31 +# Lexical states for SCLEX_GUI4CLI +val SCE_GC_DEFAULT=0 +val SCE_GC_COMMENTLINE=1 +val SCE_GC_COMMENTBLOCK=2 +val SCE_GC_GLOBAL=3 +val SCE_GC_EVENT=4 +val SCE_GC_ATTRIBUTE=5 +val SCE_GC_CONTROL=6 +val SCE_GC_COMMAND=7 +val SCE_GC_STRING=8 +val SCE_GC_OPERATOR=9 +# Lexical states for SCLEX_SPECMAN +lex Specman=SCLEX_SPECMAN SCE_SN_ +val SCE_SN_DEFAULT=0 +val SCE_SN_CODE=1 +val SCE_SN_COMMENTLINE=2 +val SCE_SN_COMMENTLINEBANG=3 +val SCE_SN_NUMBER=4 +val SCE_SN_WORD=5 +val SCE_SN_STRING=6 +val SCE_SN_WORD2=7 +val SCE_SN_WORD3=8 +val SCE_SN_PREPROCESSOR=9 +val SCE_SN_OPERATOR=10 +val SCE_SN_IDENTIFIER=11 +val SCE_SN_STRINGEOL=12 +val SCE_SN_REGEXTAG=13 +val SCE_SN_SIGNAL=14 +val SCE_SN_USER=19 +# Lexical states for SCLEX_AU3 +lex Au3=SCLEX_AU3 SCE_AU3_ +val SCE_AU3_DEFAULT=0 +val SCE_AU3_COMMENT=1 +val SCE_AU3_COMMENTBLOCK=2 +val SCE_AU3_NUMBER=3 +val SCE_AU3_FUNCTION=4 +val SCE_AU3_KEYWORD=5 +val SCE_AU3_MACRO=6 +val SCE_AU3_STRING=7 +val SCE_AU3_OPERATOR=8 +val SCE_AU3_VARIABLE=9 +val SCE_AU3_SENT=10 +val SCE_AU3_PREPROCESSOR=11 +val SCE_AU3_SPECIAL=12 +val SCE_AU3_EXPAND=13 +val SCE_AU3_COMOBJ=14 +val SCE_AU3_UDF=15 +# Lexical states for SCLEX_APDL +lex APDL=SCLEX_APDL SCE_APDL_ +val SCE_APDL_DEFAULT=0 +val SCE_APDL_COMMENT=1 +val SCE_APDL_COMMENTBLOCK=2 +val SCE_APDL_NUMBER=3 +val SCE_APDL_STRING=4 +val SCE_APDL_OPERATOR=5 +val SCE_APDL_WORD=6 +val SCE_APDL_PROCESSOR=7 +val SCE_APDL_COMMAND=8 +val SCE_APDL_SLASHCOMMAND=9 +val SCE_APDL_STARCOMMAND=10 +val SCE_APDL_ARGUMENT=11 +val SCE_APDL_FUNCTION=12 +# Lexical states for SCLEX_BASH +lex Bash=SCLEX_BASH SCE_SH_ +val SCE_SH_DEFAULT=0 +val SCE_SH_ERROR=1 +val SCE_SH_COMMENTLINE=2 +val SCE_SH_NUMBER=3 +val SCE_SH_WORD=4 +val SCE_SH_STRING=5 +val SCE_SH_CHARACTER=6 +val SCE_SH_OPERATOR=7 +val SCE_SH_IDENTIFIER=8 +val SCE_SH_SCALAR=9 +val SCE_SH_PARAM=10 +val SCE_SH_BACKTICKS=11 +val SCE_SH_HERE_DELIM=12 +val SCE_SH_HERE_Q=13 +# Lexical states for SCLEX_ASN1 +lex Asn1=SCLEX_ASN1 SCE_ASN1_ +val SCE_ASN1_DEFAULT=0 +val SCE_ASN1_COMMENT=1 +val SCE_ASN1_IDENTIFIER=2 +val SCE_ASN1_STRING=3 +val SCE_ASN1_OID=4 +val SCE_ASN1_SCALAR=5 +val SCE_ASN1_KEYWORD=6 +val SCE_ASN1_ATTRIBUTE=7 +val SCE_ASN1_DESCRIPTOR=8 +val SCE_ASN1_TYPE=9 +val SCE_ASN1_OPERATOR=10 +# Lexical states for SCLEX_VHDL +lex VHDL=SCLEX_VHDL SCE_VHDL_ +val SCE_VHDL_DEFAULT=0 +val SCE_VHDL_COMMENT=1 +val SCE_VHDL_COMMENTLINEBANG=2 +val SCE_VHDL_NUMBER=3 +val SCE_VHDL_STRING=4 +val SCE_VHDL_OPERATOR=5 +val SCE_VHDL_IDENTIFIER=6 +val SCE_VHDL_STRINGEOL=7 +val SCE_VHDL_KEYWORD=8 +val SCE_VHDL_STDOPERATOR=9 +val SCE_VHDL_ATTRIBUTE=10 +val SCE_VHDL_STDFUNCTION=11 +val SCE_VHDL_STDPACKAGE=12 +val SCE_VHDL_STDTYPE=13 +val SCE_VHDL_USERWORD=14 +# Lexical states for SCLEX_CAML +lex Caml=SCLEX_CAML SCE_CAML_ +val SCE_CAML_DEFAULT=0 +val SCE_CAML_IDENTIFIER=1 +val SCE_CAML_TAGNAME=2 +val SCE_CAML_KEYWORD=3 +val SCE_CAML_KEYWORD2=4 +val SCE_CAML_KEYWORD3=5 +val SCE_CAML_LINENUM=6 +val SCE_CAML_OPERATOR=7 +val SCE_CAML_NUMBER=8 +val SCE_CAML_CHAR=9 +val SCE_CAML_STRING=11 +val SCE_CAML_COMMENT=12 +val SCE_CAML_COMMENT1=13 +val SCE_CAML_COMMENT2=14 +val SCE_CAML_COMMENT3=15 +# Lexical states for SCLEX_HASKELL +lex Haskell=SCLEX_HASKELL SCE_HA_ +val SCE_HA_DEFAULT=0 +val SCE_HA_IDENTIFIER=1 +val SCE_HA_KEYWORD=2 +val SCE_HA_NUMBER=3 +val SCE_HA_STRING=4 +val SCE_HA_CHARACTER=5 +val SCE_HA_CLASS=6 +val SCE_HA_MODULE=7 +val SCE_HA_CAPITAL=8 +val SCE_HA_DATA=9 +val SCE_HA_IMPORT=10 +val SCE_HA_OPERATOR=11 +val SCE_HA_INSTANCE=12 +val SCE_HA_COMMENTLINE=13 +val SCE_HA_COMMENTBLOCK=14 +val SCE_HA_COMMENTBLOCK2=15 +val SCE_HA_COMMENTBLOCK3=16 +# Lexical states of SCLEX_TADS3 +lex TADS3=SCLEX_TADS3 SCE_T3_ +val SCE_T3_DEFAULT=0 +val SCE_T3_X_DEFAULT=1 +val SCE_T3_PREPROCESSOR=2 +val SCE_T3_BLOCK_COMMENT=3 +val SCE_T3_LINE_COMMENT=4 +val SCE_T3_OPERATOR=5 +val SCE_T3_KEYWORD=6 +val SCE_T3_NUMBER=7 +val SCE_T3_IDENTIFIER=8 +val SCE_T3_S_STRING=9 +val SCE_T3_D_STRING=10 +val SCE_T3_X_STRING=11 +val SCE_T3_LIB_DIRECTIVE=12 +val SCE_T3_MSG_PARAM=13 +val SCE_T3_HTML_TAG=14 +val SCE_T3_HTML_DEFAULT=15 +val SCE_T3_HTML_STRING=16 +val SCE_T3_USER1=17 +val SCE_T3_USER2=18 +val SCE_T3_USER3=19 +val SCE_T3_BRACE=20 +# Lexical states for SCLEX_REBOL +lex Rebol=SCLEX_REBOL SCE_REBOL_ +val SCE_REBOL_DEFAULT=0 +val SCE_REBOL_COMMENTLINE=1 +val SCE_REBOL_COMMENTBLOCK=2 +val SCE_REBOL_PREFACE=3 +val SCE_REBOL_OPERATOR=4 +val SCE_REBOL_CHARACTER=5 +val SCE_REBOL_QUOTEDSTRING=6 +val SCE_REBOL_BRACEDSTRING=7 +val SCE_REBOL_NUMBER=8 +val SCE_REBOL_PAIR=9 +val SCE_REBOL_TUPLE=10 +val SCE_REBOL_BINARY=11 +val SCE_REBOL_MONEY=12 +val SCE_REBOL_ISSUE=13 +val SCE_REBOL_TAG=14 +val SCE_REBOL_FILE=15 +val SCE_REBOL_EMAIL=16 +val SCE_REBOL_URL=17 +val SCE_REBOL_DATE=18 +val SCE_REBOL_TIME=19 +val SCE_REBOL_IDENTIFIER=20 +val SCE_REBOL_WORD=21 +val SCE_REBOL_WORD2=22 +val SCE_REBOL_WORD3=23 +val SCE_REBOL_WORD4=24 +val SCE_REBOL_WORD5=25 +val SCE_REBOL_WORD6=26 +val SCE_REBOL_WORD7=27 +val SCE_REBOL_WORD8=28 +# Lexical states for SCLEX_SQL +lex SQL=SCLEX_SQL SCE_SQL_ +val SCE_SQL_DEFAULT=0 +val SCE_SQL_COMMENT=1 +val SCE_SQL_COMMENTLINE=2 +val SCE_SQL_COMMENTDOC=3 +val SCE_SQL_NUMBER=4 +val SCE_SQL_WORD=5 +val SCE_SQL_STRING=6 +val SCE_SQL_CHARACTER=7 +val SCE_SQL_SQLPLUS=8 +val SCE_SQL_SQLPLUS_PROMPT=9 +val SCE_SQL_OPERATOR=10 +val SCE_SQL_IDENTIFIER=11 +val SCE_SQL_SQLPLUS_COMMENT=13 +val SCE_SQL_COMMENTLINEDOC=15 +val SCE_SQL_WORD2=16 +val SCE_SQL_COMMENTDOCKEYWORD=17 +val SCE_SQL_COMMENTDOCKEYWORDERROR=18 +val SCE_SQL_USER1=19 +val SCE_SQL_USER2=20 +val SCE_SQL_USER3=21 +val SCE_SQL_USER4=22 +val SCE_SQL_QUOTEDIDENTIFIER=23 +# Lexical states for SCLEX_SMALLTALK +lex Smalltalk=SCLEX_SMALLTALK SCE_ST_ +val SCE_ST_DEFAULT=0 +val SCE_ST_STRING=1 +val SCE_ST_NUMBER=2 +val SCE_ST_COMMENT=3 +val SCE_ST_SYMBOL=4 +val SCE_ST_BINARY=5 +val SCE_ST_BOOL=6 +val SCE_ST_SELF=7 +val SCE_ST_SUPER=8 +val SCE_ST_NIL=9 +val SCE_ST_GLOBAL=10 +val SCE_ST_RETURN=11 +val SCE_ST_SPECIAL=12 +val SCE_ST_KWSEND=13 +val SCE_ST_ASSIGN=14 +val SCE_ST_CHARACTER=15 +val SCE_ST_SPEC_SEL=16 +# Lexical states for SCLEX_FLAGSHIP (clipper) +lex FlagShip=SCLEX_FLAGSHIP SCE_B_ +val SCE_FS_DEFAULT=0 +val SCE_FS_COMMENT=1 +val SCE_FS_COMMENTLINE=2 +val SCE_FS_COMMENTDOC=3 +val SCE_FS_COMMENTLINEDOC=4 +val SCE_FS_COMMENTDOCKEYWORD=5 +val SCE_FS_COMMENTDOCKEYWORDERROR=6 +val SCE_FS_KEYWORD=7 +val SCE_FS_KEYWORD2=8 +val SCE_FS_KEYWORD3=9 +val SCE_FS_KEYWORD4=10 +val SCE_FS_NUMBER=11 +val SCE_FS_STRING=12 +val SCE_FS_PREPROCESSOR=13 +val SCE_FS_OPERATOR=14 +val SCE_FS_IDENTIFIER=15 +val SCE_FS_DATE=16 +val SCE_FS_STRINGEOL=17 +val SCE_FS_CONSTANT=18 +val SCE_FS_ASM=19 +val SCE_FS_LABEL=20 +val SCE_FS_ERROR=21 +val SCE_FS_HEXNUMBER=22 +val SCE_FS_BINNUMBER=23 +# Lexical states for SCLEX_CSOUND +lex Csound=SCLEX_CSOUND SCE_CSOUND_ +val SCE_CSOUND_DEFAULT=0 +val SCE_CSOUND_COMMENT=1 +val SCE_CSOUND_NUMBER=2 +val SCE_CSOUND_OPERATOR=3 +val SCE_CSOUND_INSTR=4 +val SCE_CSOUND_IDENTIFIER=5 +val SCE_CSOUND_OPCODE=6 +val SCE_CSOUND_HEADERSTMT=7 +val SCE_CSOUND_USERKEYWORD=8 +val SCE_CSOUND_COMMENTBLOCK=9 +val SCE_CSOUND_PARAM=10 +val SCE_CSOUND_ARATE_VAR=11 +val SCE_CSOUND_KRATE_VAR=12 +val SCE_CSOUND_IRATE_VAR=13 +val SCE_CSOUND_GLOBAL_VAR=14 +val SCE_CSOUND_STRINGEOL=15 +# Lexical states for SCLEX_INNOSETUP +lex Inno=SCLEX_INNOSETUP SCE_INNO_ +val SCE_INNO_DEFAULT=0 +val SCE_INNO_COMMENT=1 +val SCE_INNO_KEYWORD=2 +val SCE_INNO_PARAMETER=3 +val SCE_INNO_SECTION=4 +val SCE_INNO_PREPROC=5 +val SCE_INNO_PREPROC_INLINE=6 +val SCE_INNO_COMMENT_PASCAL=7 +val SCE_INNO_KEYWORD_PASCAL=8 +val SCE_INNO_KEYWORD_USER=9 +val SCE_INNO_STRING_DOUBLE=10 +val SCE_INNO_STRING_SINGLE=11 +val SCE_INNO_IDENTIFIER=12 +# Lexical states for SCLEX_OPAL +lex Opal=SCLEX_OPAL SCE_OPAL_ +val SCE_OPAL_SPACE=0 +val SCE_OPAL_COMMENT_BLOCK=1 +val SCE_OPAL_COMMENT_LINE=2 +val SCE_OPAL_INTEGER=3 +val SCE_OPAL_KEYWORD=4 +val SCE_OPAL_SORT=5 +val SCE_OPAL_STRING=6 +val SCE_OPAL_PAR=7 +val SCE_OPAL_BOOL_CONST=8 +val SCE_OPAL_DEFAULT=32 +# Lexical states for SCLEX_SPICE +lex Spice=SCLEX_SPICE SCE_SPICE_ +val SCE_SPICE_DEFAULT=0 +val SCE_SPICE_IDENTIFIER=1 +val SCE_SPICE_KEYWORD=2 +val SCE_SPICE_KEYWORD2=3 +val SCE_SPICE_KEYWORD3=4 +val SCE_SPICE_NUMBER=5 +val SCE_SPICE_DELIMITER=6 +val SCE_SPICE_VALUE=7 +val SCE_SPICE_COMMENTLINE=8 +# Lexical states for SCLEX_CMAKE +lex CMAKE=SCLEX_CMAKE SCE_CMAKE_ +val SCE_CMAKE_DEFAULT=0 +val SCE_CMAKE_COMMENT=1 +val SCE_CMAKE_STRINGDQ=2 +val SCE_CMAKE_STRINGLQ=3 +val SCE_CMAKE_STRINGRQ=4 +val SCE_CMAKE_COMMANDS=5 +val SCE_CMAKE_PARAMETERS=6 +val SCE_CMAKE_VARIABLE=7 +val SCE_CMAKE_USERDEFINED=8 +val SCE_CMAKE_WHILEDEF=9 +val SCE_CMAKE_FOREACHDEF=10 +val SCE_CMAKE_IFDEFINEDEF=11 +val SCE_CMAKE_MACRODEF=12 +val SCE_CMAKE_STRINGVAR=13 +val SCE_CMAKE_NUMBER=14 + +# Events + +evt void StyleNeeded=2000(int position) +evt void CharAdded=2001(int ch) +evt void SavePointReached=2002(void) +evt void SavePointLeft=2003(void) +evt void ModifyAttemptRO=2004(void) +# GTK+ Specific to work around focus and accelerator problems: +evt void Key=2005(int ch, int modifiers) +evt void DoubleClick=2006(void) +evt void UpdateUI=2007(void) +evt void Modified=2008(int position, int modificationType, string text, int length, int linesAdded, int line, int foldLevelNow, int foldLevelPrev) +evt void MacroRecord=2009(int message, int wParam, int lParam) +evt void MarginClick=2010(int modifiers, int position, int margin) +evt void NeedShown=2011(int position, int length) +evt void Painted=2013(void) +evt void UserListSelection=2014(int listType, string text) +evt void URIDropped=2015(string text) +evt void DwellStart=2016(int position) +evt void DwellEnd=2017(int position) +evt void Zoom=2018(void) +evt void HotSpotClick=2019(int modifiers, int position) +evt void HotSpotDoubleClick=2020(int modifiers, int position) +evt void CallTipClick=2021(int position) +evt void AutoCSelection=2022(string text) + +cat Deprecated + +# CARET_POLICY changed in 1.47 +fun void SetCaretPolicy=2369(int caretPolicy, int caretSlop) +val CARET_CENTER=0x02 +val CARET_XEVEN=0x08 +val CARET_XJUMPS=0x10 + +# The old name for SCN_UPDATEUI +val SCN_CHECKBRACE=2007 +evt void PosChanged=2012(int position) + +# SCLEX_HTML should be used in preference to these. +val SCLEX_ASP=29 +val SCLEX_PHP=30 diff --git a/scintilla/include/ScintillaWidget.h b/scintilla/include/ScintillaWidget.h new file mode 100644 index 00000000..d9909524 --- /dev/null +++ b/scintilla/include/ScintillaWidget.h @@ -0,0 +1,59 @@ +// Scintilla source code edit control +/** @file ScintillaWidget.h + ** Definition of Scintilla widget for GTK+. + ** Only needed by GTK+ code but is harmless on other platforms. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef SCINTILLAWIDGET_H +#define SCINTILLAWIDGET_H + +#if PLAT_GTK + +#ifdef __cplusplus +extern "C" { +#endif + +#define SCINTILLA(obj) GTK_CHECK_CAST (obj, scintilla_get_type (), ScintillaObject) +#define SCINTILLA_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, scintilla_get_type (), ScintillaClass) +#define IS_SCINTILLA(obj) GTK_CHECK_TYPE (obj, scintilla_get_type ()) + +typedef struct _ScintillaObject ScintillaObject; +typedef struct _ScintillaClass ScintillaClass; + +struct _ScintillaObject { + GtkContainer cont; + void *pscin; +}; + +struct _ScintillaClass { + GtkContainerClass parent_class; + + void (* command) (ScintillaObject *ttt); + void (* notify) (ScintillaObject *ttt); +}; + +#if GLIB_MAJOR_VERSION < 2 +GtkType scintilla_get_type (void); +#else +GType scintilla_get_type (void); +#endif +GtkWidget* scintilla_new (void); +void scintilla_set_id (ScintillaObject *sci, uptr_t id); +sptr_t scintilla_send_message (ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam); +void scintilla_release_resources(void); + +#if GTK_MAJOR_VERSION < 2 +#define SCINTILLA_NOTIFY "notify" +#else +#define SCINTILLA_NOTIFY "sci-notify" +#endif + +#ifdef __cplusplus +} +#endif + +#endif + +#endif diff --git a/scintilla/include/WindowAccessor.h b/scintilla/include/WindowAccessor.h new file mode 100644 index 00000000..baae30cb --- /dev/null +++ b/scintilla/include/WindowAccessor.h @@ -0,0 +1,57 @@ +// Scintilla source code edit control +/** @file WindowAccessor.h + ** Implementation of BufferAccess and StylingAccess on a Scintilla + ** rapid easy access to contents of a Scintilla. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +/** + */ +class WindowAccessor : public Accessor { + // Private so WindowAccessor objects can not be copied + WindowAccessor(const WindowAccessor &source) : Accessor(), props(source.props) {} + WindowAccessor &operator=(const WindowAccessor &) { return *this; } +protected: + WindowID id; + PropSet &props; + int lenDoc; + + char styleBuf[bufferSize]; + int validLen; + char chFlags; + char chWhile; + unsigned int startSeg; + + bool InternalIsLeadByte(char ch); + void Fill(int position); +public: + WindowAccessor(WindowID id_, PropSet &props_) : + Accessor(), id(id_), props(props_), + lenDoc(-1), validLen(0), chFlags(0), chWhile(0) { + } + ~WindowAccessor(); + bool Match(int pos, const char *s); + char StyleAt(int position); + int GetLine(int position); + int LineStart(int line); + int LevelAt(int line); + int Length(); + void Flush(); + int GetLineState(int line); + int SetLineState(int line, int state); + int GetPropertyInt(const char *key, int defaultValue=0) { + return props.GetInt(key, defaultValue); + } + char *GetProperties() { + return props.ToString(); + } + + void StartAt(unsigned int start, char chMask=31); + void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; }; + unsigned int GetStartSegment() { return startSeg; } + void StartSegment(unsigned int pos); + void ColourTo(unsigned int pos, int chAttr); + void SetLevel(int line, int level); + int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0); +}; diff --git a/scintilla/src/AutoComplete.cxx b/scintilla/src/AutoComplete.cxx new file mode 100644 index 00000000..83ee0769 --- /dev/null +++ b/scintilla/src/AutoComplete.cxx @@ -0,0 +1,174 @@ +// Scintilla source code edit control +/** @file AutoComplete.cxx + ** Defines the auto completion list box. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "AutoComplete.h" + +AutoComplete::AutoComplete() : + active(false), + separator(' '), + typesep('?'), + ignoreCase(false), + chooseSingle(false), + lb(0), + posStart(0), + startLen(0), + cancelAtStartPos(true), + autoHide(true), + dropRestOfWord(false) { + lb = ListBox::Allocate(); + stopChars[0] = '\0'; + fillUpChars[0] = '\0'; +} + +AutoComplete::~AutoComplete() { + if (lb) { + lb->Destroy(); + delete lb; + lb = 0; + } +} + +bool AutoComplete::Active() { + return active; +} + +void AutoComplete::Start(Window &parent, int ctrlID, + int position, Point location, int startLen_, + int lineHeight, bool unicodeMode) { + if (active) { + Cancel(); + } + lb->Create(parent, ctrlID, location, lineHeight, unicodeMode); + lb->Clear(); + active = true; + startLen = startLen_; + posStart = position; +} + +void AutoComplete::SetStopChars(const char *stopChars_) { + strncpy(stopChars, stopChars_, sizeof(stopChars)); + stopChars[sizeof(stopChars) - 1] = '\0'; +} + +bool AutoComplete::IsStopChar(char ch) { + return ch && strchr(stopChars, ch); +} + +void AutoComplete::SetFillUpChars(const char *fillUpChars_) { + strncpy(fillUpChars, fillUpChars_, sizeof(fillUpChars)); + fillUpChars[sizeof(fillUpChars) - 1] = '\0'; +} + +bool AutoComplete::IsFillUpChar(char ch) { + return ch && strchr(fillUpChars, ch); +} + +void AutoComplete::SetSeparator(char separator_) { + separator = separator_; +} + +char AutoComplete::GetSeparator() { + return separator; +} + +void AutoComplete::SetTypesep(char separator_) { + typesep = separator_; +} + +char AutoComplete::GetTypesep() { + return typesep; +} + +void AutoComplete::SetList(const char *list) { + lb->SetList(list, separator, typesep); +} + +void AutoComplete::Show(bool show) { + lb->Show(show); + if (show) + lb->Select(0); +} + +void AutoComplete::Cancel() { + if (lb->Created()) { + lb->Clear(); + lb->Destroy(); + active = false; + } +} + + +void AutoComplete::Move(int delta) { + int count = lb->Length(); + int current = lb->GetSelection(); + current += delta; + if (current >= count) + current = count - 1; + if (current < 0) + current = 0; + lb->Select(current); +} + +void AutoComplete::Select(const char *word) { + size_t lenWord = strlen(word); + int location = -1; + const int maxItemLen=1000; + char item[maxItemLen]; + int start = 0; // lower bound of the api array block to search + int end = lb->Length() - 1; // upper bound of the api array block to search + while ((start <= end) && (location == -1)) { // Binary searching loop + int pivot = (start + end) / 2; + lb->GetValue(pivot, item, maxItemLen); + int cond; + if (ignoreCase) + cond = CompareNCaseInsensitive(word, item, lenWord); + else + cond = strncmp(word, item, lenWord); + if (!cond) { + // Find first match + while (pivot > start) { + lb->GetValue(pivot-1, item, maxItemLen); + if (ignoreCase) + cond = CompareNCaseInsensitive(word, item, lenWord); + else + cond = strncmp(word, item, lenWord); + if (0 != cond) + break; + --pivot; + } + location = pivot; + if (ignoreCase) { + // Check for exact-case match + for (; pivot <= end; pivot++) { + lb->GetValue(pivot, item, maxItemLen); + if (!strncmp(word, item, lenWord)) { + location = pivot; + break; + } + if (CompareNCaseInsensitive(word, item, lenWord)) + break; + } + } + } else if (cond < 0) { + end = pivot - 1; + } else if (cond > 0) { + start = pivot + 1; + } + } + if (location == -1 && autoHide) + Cancel(); + else + lb->Select(location); +} + diff --git a/scintilla/src/AutoComplete.h b/scintilla/src/AutoComplete.h new file mode 100644 index 00000000..eefc6a84 --- /dev/null +++ b/scintilla/src/AutoComplete.h @@ -0,0 +1,70 @@ +// Scintilla source code edit control +/** @file AutoComplete.h + ** Defines the auto completion list box. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef AUTOCOMPLETE_H +#define AUTOCOMPLETE_H + +/** + */ +class AutoComplete { + bool active; + char stopChars[256]; + char fillUpChars[256]; + char separator; + char typesep; // Type seperator + +public: + bool ignoreCase; + bool chooseSingle; + ListBox *lb; + int posStart; + int startLen; + /// Should autocompletion be canceled if editor's currentPos <= startPos? + bool cancelAtStartPos; + bool autoHide; + bool dropRestOfWord; + + AutoComplete(); + ~AutoComplete(); + + /// Is the auto completion list displayed? + bool Active(); + + /// Display the auto completion list positioned to be near a character position + void Start(Window &parent, int ctrlID, int position, Point location, + int startLen_, int lineHeight, bool unicodeMode); + + /// The stop chars are characters which, when typed, cause the auto completion list to disappear + void SetStopChars(const char *stopChars_); + bool IsStopChar(char ch); + + /// The fillup chars are characters which, when typed, fill up the selected word + void SetFillUpChars(const char *fillUpChars_); + bool IsFillUpChar(char ch); + + /// The separator character is used when interpreting the list in SetList + void SetSeparator(char separator_); + char GetSeparator(); + + /// The typesep character is used for seperating the word from the type + void SetTypesep(char separator_); + char GetTypesep(); + + /// The list string contains a sequence of words separated by the separator character + void SetList(const char *list); + + void Show(bool show); + void Cancel(); + + /// Move the current list element by delta, scrolling appropriately + void Move(int delta); + + /// Select a list element that starts with word as the current element + void Select(const char *word); +}; + +#endif diff --git a/scintilla/src/CallTip.cxx b/scintilla/src/CallTip.cxx new file mode 100644 index 00000000..729bf29a --- /dev/null +++ b/scintilla/src/CallTip.cxx @@ -0,0 +1,314 @@ +// Scintilla source code edit control +/** @file CallTip.cxx + ** Code for displaying call tips. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include + +#include "Platform.h" + +#include "Scintilla.h" +#include "CallTip.h" + +static const int insetX = 5; // text inset in x from calltip border +static const int widthArrow = 14; + +CallTip::CallTip() { + wCallTip = 0; + inCallTipMode = false; + posStartCallTip = 0; + val = 0; + rectUp = PRectangle(0,0,0,0); + rectDown = PRectangle(0,0,0,0); + lineHeight = 1; + startHighlight = 0; + endHighlight = 0; + tabSize = 0; + useStyleCallTip = false; // for backwards compatibility + + colourBG.desired = ColourDesired(0xff, 0xff, 0xff); + colourUnSel.desired = ColourDesired(0x80, 0x80, 0x80); + colourSel.desired = ColourDesired(0, 0, 0x80); + colourShade.desired = ColourDesired(0, 0, 0); + colourLight.desired = ColourDesired(0xc0, 0xc0, 0xc0); +} + +CallTip::~CallTip() { + font.Release(); + wCallTip.Destroy(); + delete []val; + val = 0; +} + +void CallTip::RefreshColourPalette(Palette &pal, bool want) { + pal.WantFind(colourBG, want); + pal.WantFind(colourUnSel, want); + pal.WantFind(colourSel, want); + pal.WantFind(colourShade, want); + pal.WantFind(colourLight, want); +} + +// Although this test includes 0, we should never see a \0 character. +static bool IsArrowCharacter(char ch) { + return (ch == 0) || (ch == '\001') || (ch == '\002'); +} + +// We ignore tabs unless a tab width has been set. +bool CallTip::IsTabCharacter(char ch) { + return (tabSize > 0) && (ch == '\t'); +} + +int CallTip::NextTabPos(int x) { + if (tabSize > 0) { // paranoia... not called unless this is true + x -= insetX; // position relative to text + x = (x + tabSize) / tabSize; // tab "number" + return tabSize*x + insetX; // position of next tab + } else { + return x + 1; // arbitrary + } +} + +// Draw a section of the call tip that does not include \n in one colour. +// The text may include up to numEnds tabs or arrow characters. +void CallTip::DrawChunk(Surface *surface, int &x, const char *s, + int posStart, int posEnd, int ytext, PRectangle rcClient, + bool highlight, bool draw) { + s += posStart; + int len = posEnd - posStart; + + // Divide the text into sections that are all text, or that are + // single arrows or single tab characters (if tabSize > 0). + int maxEnd = 0; + const int numEnds = 10; + int ends[numEnds + 2]; + for (int i=0;i 0) + ends[maxEnd++] = i; + ends[maxEnd++] = i+1; + } + } + ends[maxEnd++] = len; + int startSeg = 0; + int xEnd; + for (int seg = 0; seg startSeg) { + if (IsArrowCharacter(s[startSeg])) { + bool upArrow = s[startSeg] == '\001'; + rcClient.left = x; + rcClient.right = rcClient.left + widthArrow; + if (draw) { + const int halfWidth = widthArrow / 2 - 3; + const int centreX = rcClient.left + widthArrow / 2 - 1; + const int centreY = (rcClient.top + rcClient.bottom) / 2; + surface->FillRectangle(rcClient, colourBG.allocated); + PRectangle rcClientInner(rcClient.left + 1, rcClient.top + 1, + rcClient.right - 2, rcClient.bottom - 1); + surface->FillRectangle(rcClientInner, colourUnSel.allocated); + + if (upArrow) { // Up arrow + Point pts[] = { + Point(centreX - halfWidth, centreY + halfWidth / 2), + Point(centreX + halfWidth, centreY + halfWidth / 2), + Point(centreX, centreY - halfWidth + halfWidth / 2), + }; + surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), + colourBG.allocated, colourBG.allocated); + } else { // Down arrow + Point pts[] = { + Point(centreX - halfWidth, centreY - halfWidth / 2), + Point(centreX + halfWidth, centreY - halfWidth / 2), + Point(centreX, centreY + halfWidth - halfWidth / 2), + }; + surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), + colourBG.allocated, colourBG.allocated); + } + } + xEnd = rcClient.right; + offsetMain = xEnd; + if (upArrow) { + rectUp = rcClient; + } else { + rectDown = rcClient; + } + } else if (IsTabCharacter(s[startSeg])) { + xEnd = NextTabPos(x); + } else { + xEnd = x + surface->WidthText(font, s + startSeg, endSeg - startSeg); + if (draw) { + rcClient.left = x; + rcClient.right = xEnd; + surface->DrawTextTransparent(rcClient, font, ytext, + s+startSeg, endSeg - startSeg, + highlight ? colourSel.allocated : colourUnSel.allocated); + } + } + x = xEnd; + startSeg = endSeg; + } + } +} + +int CallTip::PaintContents(Surface *surfaceWindow, bool draw) { + PRectangle rcClientPos = wCallTip.GetClientPosition(); + PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left, + rcClientPos.bottom - rcClientPos.top); + PRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1); + + // To make a nice small call tip window, it is only sized to fit most normal characters without accents + int ascent = surfaceWindow->Ascent(font) - surfaceWindow->InternalLeading(font); + + // For each line... + // Draw the definition in three parts: before highlight, highlighted, after highlight + int ytext = rcClient.top + ascent + 1; + rcClient.bottom = ytext + surfaceWindow->Descent(font) + 1; + char *chunkVal = val; + bool moreChunks = true; + int maxWidth = 0; + while (moreChunks) { + char *chunkEnd = strchr(chunkVal, '\n'); + if (chunkEnd == NULL) { + chunkEnd = chunkVal + strlen(chunkVal); + moreChunks = false; + } + int chunkOffset = chunkVal - val; + int chunkLength = chunkEnd - chunkVal; + int chunkEndOffset = chunkOffset + chunkLength; + int thisStartHighlight = Platform::Maximum(startHighlight, chunkOffset); + thisStartHighlight = Platform::Minimum(thisStartHighlight, chunkEndOffset); + thisStartHighlight -= chunkOffset; + int thisEndHighlight = Platform::Maximum(endHighlight, chunkOffset); + thisEndHighlight = Platform::Minimum(thisEndHighlight, chunkEndOffset); + thisEndHighlight -= chunkOffset; + rcClient.top = ytext - ascent - 1; + + int x = insetX; // start each line at this inset + + DrawChunk(surfaceWindow, x, chunkVal, 0, thisStartHighlight, + ytext, rcClient, false, draw); + DrawChunk(surfaceWindow, x, chunkVal, thisStartHighlight, thisEndHighlight, + ytext, rcClient, true, draw); + DrawChunk(surfaceWindow, x, chunkVal, thisEndHighlight, chunkLength, + ytext, rcClient, false, draw); + + chunkVal = chunkEnd + 1; + ytext += lineHeight; + rcClient.bottom += lineHeight; + maxWidth = Platform::Maximum(maxWidth, x); + } + return maxWidth; +} + +void CallTip::PaintCT(Surface *surfaceWindow) { + if (!val) + return; + PRectangle rcClientPos = wCallTip.GetClientPosition(); + PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left, + rcClientPos.bottom - rcClientPos.top); + PRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1); + + surfaceWindow->FillRectangle(rcClient, colourBG.allocated); + + offsetMain = insetX; // initial alignment assuming no arrows + PaintContents(surfaceWindow, true); + + // Draw a raised border around the edges of the window + surfaceWindow->MoveTo(0, rcClientSize.bottom - 1); + surfaceWindow->PenColour(colourShade.allocated); + surfaceWindow->LineTo(rcClientSize.right - 1, rcClientSize.bottom - 1); + surfaceWindow->LineTo(rcClientSize.right - 1, 0); + surfaceWindow->PenColour(colourLight.allocated); + surfaceWindow->LineTo(0, 0); + surfaceWindow->LineTo(0, rcClientSize.bottom - 1); +} + +void CallTip::MouseClick(Point pt) { + clickPlace = 0; + if (rectUp.Contains(pt)) + clickPlace = 1; + if (rectDown.Contains(pt)) + clickPlace = 2; +} + +PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn, + const char *faceName, int size, + int codePage_, int characterSet, Window &wParent) { + clickPlace = 0; + if (val) + delete []val; + val = new char[strlen(defn) + 1]; + if (!val) + return PRectangle(); + strcpy(val, defn); + codePage = codePage_; + Surface *surfaceMeasure = Surface::Allocate(); + if (!surfaceMeasure) + return PRectangle(); + surfaceMeasure->Init(wParent.GetID()); + surfaceMeasure->SetUnicodeMode(SC_CP_UTF8 == codePage); + surfaceMeasure->SetDBCSMode(codePage); + startHighlight = 0; + endHighlight = 0; + inCallTipMode = true; + posStartCallTip = pos; + int deviceHeight = surfaceMeasure->DeviceHeightFont(size); + font.Create(faceName, characterSet, deviceHeight, false, false); + // Look for multiple lines in the text + // Only support \n here - simply means container must avoid \r! + int numLines = 1; + const char *newline; + const char *look = val; + rectUp = PRectangle(0,0,0,0); + rectDown = PRectangle(0,0,0,0); + offsetMain = insetX; // changed to right edge of any arrows + int width = PaintContents(surfaceMeasure, false) + insetX; + while ((newline = strchr(look, '\n')) != NULL) { + look = newline + 1; + numLines++; + } + lineHeight = surfaceMeasure->Height(font); + + // Extra line for border and an empty line at top and bottom. The returned + // rectangle is aligned to the right edge of the last arrow encountered in + // the tip text, else to the tip text left edge. + int height = lineHeight * numLines - surfaceMeasure->InternalLeading(font) + 2 + 2; + delete surfaceMeasure; + return PRectangle(pt.x - offsetMain, pt.y + 1, pt.x + width - offsetMain, pt.y + 1 + height); +} + +void CallTip::CallTipCancel() { + inCallTipMode = false; + if (wCallTip.Created()) { + wCallTip.Destroy(); + } +} + +void CallTip::SetHighlight(int start, int end) { + // Avoid flashing by checking something has really changed + if ((start != startHighlight) || (end != endHighlight)) { + startHighlight = start; + endHighlight = end; + if (wCallTip.Created()) { + wCallTip.InvalidateAll(); + } + } +} + +// Set the tab size (sizes > 0 enable the use of tabs). This also enables the +// use of the STYLE_CALLTIP. +void CallTip::SetTabSize(int tabSz) { + tabSize = tabSz; + useStyleCallTip = true; +} + +// It might be better to have two access functions for this and to use +// them for all settings of colours. +void CallTip::SetForeBack(const ColourPair &fore, const ColourPair &back) { + colourBG = back; + colourUnSel = fore; +} diff --git a/scintilla/src/CallTip.h b/scintilla/src/CallTip.h new file mode 100644 index 00000000..3f7557e4 --- /dev/null +++ b/scintilla/src/CallTip.h @@ -0,0 +1,79 @@ +// Scintilla source code edit control +/** @file CallTip.h + ** Interface to the call tip control. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef CALLTIP_H +#define CALLTIP_H + +/** + */ +class CallTip { + int startHighlight; // character offset to start and... + int endHighlight; // ...end of highlighted text + char *val; + Font font; + PRectangle rectUp; // rectangle of last up angle in the tip + PRectangle rectDown; // rectangle of last down arrow in the tip + int lineHeight; // vertical line spacing + int offsetMain; // The alignment point of the call tip + int tabSize; // Tab size in pixels, <=0 no TAB expand + bool useStyleCallTip; // if true, STYLE_CALLTIP should be used + + // Private so CallTip objects can not be copied + CallTip(const CallTip &) {} + CallTip &operator=(const CallTip &) { return *this; } + void DrawChunk(Surface *surface, int &x, const char *s, + int posStart, int posEnd, int ytext, PRectangle rcClient, + bool highlight, bool draw); + int PaintContents(Surface *surfaceWindow, bool draw); + bool IsTabCharacter(char c); + int NextTabPos(int x); + +public: + Window wCallTip; + Window wDraw; + bool inCallTipMode; + int posStartCallTip; + ColourPair colourBG; + ColourPair colourUnSel; + ColourPair colourSel; + ColourPair colourShade; + ColourPair colourLight; + int codePage; + int clickPlace; + + CallTip(); + ~CallTip(); + + /// Claim or accept palette entries for the colours required to paint a calltip. + void RefreshColourPalette(Palette &pal, bool want); + + void PaintCT(Surface *surfaceWindow); + + void MouseClick(Point pt); + + /// Setup the calltip and return a rectangle of the area required. + PRectangle CallTipStart(int pos, Point pt, const char *defn, + const char *faceName, int size, int codePage_, + int characterSet, Window &wParent); + + void CallTipCancel(); + + /// Set a range of characters to be displayed in a highlight style. + /// Commonly used to highlight the current parameter. + void SetHighlight(int start, int end); + + /// Set the tab size in pixels for the call tip. 0 or -ve means no tab expand. + void SetTabSize(int tabSz); + + /// Used to determine which STYLE_xxxx to use for call tip information + bool UseStyleCallTip() const { return useStyleCallTip;} + + // Modify foreground and background colours + void SetForeBack(const ColourPair &fore, const ColourPair &back); +}; + +#endif diff --git a/scintilla/src/CellBuffer.cxx b/scintilla/src/CellBuffer.cxx new file mode 100644 index 00000000..8416fce1 --- /dev/null +++ b/scintilla/src/CellBuffer.cxx @@ -0,0 +1,914 @@ +// Scintilla source code edit control +/** @file CellBuffer.cxx + ** Manages a buffer of cells. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include "Platform.h" + +#include "Scintilla.h" +#include "SVector.h" +#include "SplitVector.h" +#include "Partitioning.h" +#include "CellBuffer.h" + +MarkerHandleSet::MarkerHandleSet() { + root = 0; +} + +MarkerHandleSet::~MarkerHandleSet() { + MarkerHandleNumber *mhn = root; + while (mhn) { + MarkerHandleNumber *mhnToFree = mhn; + mhn = mhn->next; + delete mhnToFree; + } + root = 0; +} + +int MarkerHandleSet::Length() const { + int c = 0; + MarkerHandleNumber *mhn = root; + while (mhn) { + c++; + mhn = mhn->next; + } + return c; +} + +int MarkerHandleSet::NumberFromHandle(int handle) const { + MarkerHandleNumber *mhn = root; + while (mhn) { + if (mhn->handle == handle) { + return mhn->number; + } + mhn = mhn->next; + } + return - 1; +} + +int MarkerHandleSet::MarkValue() const { + unsigned int m = 0; + MarkerHandleNumber *mhn = root; + while (mhn) { + m |= (1 << mhn->number); + mhn = mhn->next; + } + return m; +} + +bool MarkerHandleSet::Contains(int handle) const { + MarkerHandleNumber *mhn = root; + while (mhn) { + if (mhn->handle == handle) { + return true; + } + mhn = mhn->next; + } + return false; +} + +bool MarkerHandleSet::InsertHandle(int handle, int markerNum) { + MarkerHandleNumber *mhn = new MarkerHandleNumber; + if (!mhn) + return false; + mhn->handle = handle; + mhn->number = markerNum; + mhn->next = root; + root = mhn; + return true; +} + +void MarkerHandleSet::RemoveHandle(int handle) { + MarkerHandleNumber **pmhn = &root; + while (*pmhn) { + MarkerHandleNumber *mhn = *pmhn; + if (mhn->handle == handle) { + *pmhn = mhn->next; + delete mhn; + return; + } + pmhn = &((*pmhn)->next); + } +} + +bool MarkerHandleSet::RemoveNumber(int markerNum) { + bool performedDeletion = false; + MarkerHandleNumber **pmhn = &root; + while (*pmhn) { + MarkerHandleNumber *mhn = *pmhn; + if (mhn->number == markerNum) { + *pmhn = mhn->next; + delete mhn; + performedDeletion = true; + } else { + pmhn = &((*pmhn)->next); + } + } + return performedDeletion; +} + +void MarkerHandleSet::CombineWith(MarkerHandleSet *other) { + MarkerHandleNumber **pmhn = &root; + while (*pmhn) { + pmhn = &((*pmhn)->next); + } + *pmhn = other->root; + other->root = 0; +} + +LineVector::LineVector() : starts(256) { + handleCurrent = 1; + + Init(); +} + +LineVector::~LineVector() { + starts.DeleteAll(); + for (int line = 0; line < markers.Length(); line++) { + delete markers[line]; + markers[line] = 0; + } + markers.DeleteAll(); + levels.DeleteAll(); +} + +void LineVector::Init() { + starts.DeleteAll(); + for (int line = 0; line < markers.Length(); line++) { + delete markers[line]; + markers[line] = 0; + } + markers.DeleteAll(); + levels.DeleteAll(); +} + +void LineVector::ExpandLevels(int sizeNew) { + levels.InsertValue(levels.Length(), sizeNew - levels.Length(), SC_FOLDLEVELBASE); +} + +void LineVector::ClearLevels() { + levels.DeleteAll(); +} + +int LineVector::SetLevel(int line, int level) { + int prev = 0; + if ((line >= 0) && (line < Lines())) { + if (!levels.Length()) { + ExpandLevels(Lines() + 1); + } + prev = levels[line]; + if (prev != level) { + levels[line] = level; + } + } + return prev; +} + +int LineVector::GetLevel(int line) { + if (levels.Length() && (line >= 0) && (line < Lines())) { + return levels[line]; + } else { + return SC_FOLDLEVELBASE; + } +} + +void LineVector::InsertText(int line, int delta) { + starts.InsertText(line, delta); +} + +void LineVector::InsertLine(int line, int position) { + starts.InsertPartition(line, position); + if (markers.Length()) { + markers.Insert(line, 0); + } + if (levels.Length()) { + int level = SC_FOLDLEVELBASE; + if ((line > 0) && (line < Lines())) { + level = levels[line-1] & ~SC_FOLDLEVELWHITEFLAG; + } + levels.InsertValue(line, 1, level); + } +} + +void LineVector::SetLineStart(int line, int position) { + starts.SetPartitionStartPosition(line, position); +} + +void LineVector::RemoveLine(int line) { + starts.RemovePartition(line); + // Retain the markers from the deleted line by oring them into the previous line + if (markers.Length()) { + if (line > 0) { + MergeMarkers(line - 1); + } + markers.Delete(line); + } + if (levels.Length()) { + // Move up following lines but merge header flag from this line + // to line before to avoid a temporary disappearence causing expansion. + int firstHeader = levels[line] & SC_FOLDLEVELHEADERFLAG; + levels.Delete(line); + if (line > 0) + levels[line-1] |= firstHeader; + } +} + +int LineVector::LineFromPosition(int pos) { + return starts.PartitionFromPosition(pos); +} + +int LineVector::MarkValue(int line) { + if (markers.Length() && markers[line]) + return markers[line]->MarkValue(); + else + return 0; +} + +int LineVector::AddMark(int line, int markerNum) { + handleCurrent++; + if (!markers.Length()) { + // No existing markers so allocate one element per line + markers.InsertValue(0, Lines(), 0); + } + if (!markers[line]) { + // Need new structure to hold marker handle + markers[line] = new MarkerHandleSet(); + if (!markers[line]) + return - 1; + } + markers[line]->InsertHandle(handleCurrent, markerNum); + + return handleCurrent; +} + +void LineVector::MergeMarkers(int pos) { + if (markers[pos + 1] != NULL) { + if (markers[pos] == NULL) + markers[pos] = new MarkerHandleSet; + markers[pos]->CombineWith(markers[pos + 1]); + delete markers[pos + 1]; + markers[pos + 1] = NULL; + } +} + +void LineVector::DeleteMark(int line, int markerNum, bool all) { + if (markers.Length() && markers[line]) { + if (markerNum == -1) { + delete markers[line]; + markers[line] = NULL; + } else { + bool performedDeletion = markers[line]->RemoveNumber(markerNum); + while (all && performedDeletion) { + performedDeletion = markers[line]->RemoveNumber(markerNum); + } + if (markers[line]->Length() == 0) { + delete markers[line]; + markers[line] = NULL; + } + } + } +} + +void LineVector::DeleteMarkFromHandle(int markerHandle) { + int line = LineFromHandle(markerHandle); + if (line >= 0) { + markers[line]->RemoveHandle(markerHandle); + if (markers[line]->Length() == 0) { + delete markers[line]; + markers[line] = NULL; + } + } +} + +int LineVector::LineFromHandle(int markerHandle) { + if (markers.Length()) { + for (int line = 0; line < Lines(); line++) { + if (markers[line]) { + if (markers[line]->Contains(markerHandle)) { + return line; + } + } + } + } + return -1; +} + +Action::Action() { + at = startAction; + position = 0; + data = 0; + lenData = 0; +} + +Action::~Action() { + Destroy(); +} + +void Action::Create(actionType at_, int position_, char *data_, int lenData_, bool mayCoalesce_) { + delete []data; + position = position_; + at = at_; + data = data_; + lenData = lenData_; + mayCoalesce = mayCoalesce_; +} + +void Action::Destroy() { + delete []data; + data = 0; +} + +void Action::Grab(Action *source) { + delete []data; + + position = source->position; + at = source->at; + data = source->data; + lenData = source->lenData; + mayCoalesce = source->mayCoalesce; + + // Ownership of source data transferred to this + source->position = 0; + source->at = startAction; + source->data = 0; + source->lenData = 0; + source->mayCoalesce = true; +} + +// The undo history stores a sequence of user operations that represent the user's view of the +// commands executed on the text. +// Each user operation contains a sequence of text insertion and text deletion actions. +// All the user operations are stored in a list of individual actions with 'start' actions used +// as delimiters between user operations. +// Initially there is one start action in the history. +// As each action is performed, it is recorded in the history. The action may either become +// part of the current user operation or may start a new user operation. If it is to be part of the +// current operation, then it overwrites the current last action. If it is to be part of a new +// operation, it is appended after the current last action. +// After writing the new action, a new start action is appended at the end of the history. +// The decision of whether to start a new user operation is based upon two factors. If a +// compound operation has been explicitly started by calling BeginUndoAction and no matching +// EndUndoAction (these calls nest) has been called, then the action is coalesced into the current +// operation. If there is no outstanding BeginUndoAction call then a new operation is started +// unless it looks as if the new action is caused by the user typing or deleting a stream of text. +// Sequences that look like typing or deletion are coalesced into a single user operation. + +UndoHistory::UndoHistory() { + + lenActions = 100; + actions = new Action[lenActions]; + maxAction = 0; + currentAction = 0; + undoSequenceDepth = 0; + savePoint = 0; + + actions[currentAction].Create(startAction); +} + +UndoHistory::~UndoHistory() { + delete []actions; + actions = 0; +} + +void UndoHistory::EnsureUndoRoom() { + // Have to test that there is room for 2 more actions in the array + // as two actions may be created by the calling function + if (currentAction >= (lenActions - 2)) { + // Run out of undo nodes so extend the array + int lenActionsNew = lenActions * 2; + Action *actionsNew = new Action[lenActionsNew]; + if (!actionsNew) + return; + for (int act = 0; act <= currentAction; act++) + actionsNew[act].Grab(&actions[act]); + delete []actions; + lenActions = lenActionsNew; + actions = actionsNew; + } +} + +void UndoHistory::AppendAction(actionType at, int position, char *data, int lengthData, + bool &startSequence) { + EnsureUndoRoom(); + //Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, lengthData, currentAction); + //Platform::DebugPrintf("^ %d action %d %d\n", actions[currentAction - 1].at, + // actions[currentAction - 1].position, actions[currentAction - 1].lenData); + if (currentAction < savePoint) { + savePoint = -1; + } + int oldCurrentAction = currentAction; + if (currentAction >= 1) { + if (0 == undoSequenceDepth) { + // Top level actions may not always be coalesced + Action &actPrevious = actions[currentAction - 1]; + // See if current action can be coalesced into previous action + // Will work if both are inserts or deletes and position is same + if (at != actPrevious.at) { + currentAction++; + } else if (currentAction == savePoint) { + currentAction++; + } else if ((at == insertAction) && + (position != (actPrevious.position + actPrevious.lenData))) { + // Insertions must be immediately after to coalesce + currentAction++; + } else if (!actions[currentAction].mayCoalesce) { + // Not allowed to coalesce if this set + currentAction++; + } else if (at == removeAction) { + if ((lengthData == 1) || (lengthData == 2)){ + if ((position + lengthData) == actPrevious.position) { + ; // Backspace -> OK + } else if (position == actPrevious.position) { + ; // Delete -> OK + } else { + // Removals must be at same position to coalesce + currentAction++; + } + } else { + // Removals must be of one character to coalesce + currentAction++; + } + } else { + // Action coalesced. + } + + } else { + // Actions not at top level are always coalesced unless this is after return to top level + if (!actions[currentAction].mayCoalesce) + currentAction++; + } + } else { + currentAction++; + } + startSequence = oldCurrentAction != currentAction; + actions[currentAction].Create(at, position, data, lengthData); + currentAction++; + actions[currentAction].Create(startAction); + maxAction = currentAction; +} + +void UndoHistory::BeginUndoAction() { + EnsureUndoRoom(); + if (undoSequenceDepth == 0) { + if (actions[currentAction].at != startAction) { + currentAction++; + actions[currentAction].Create(startAction); + maxAction = currentAction; + } + actions[currentAction].mayCoalesce = false; + } + undoSequenceDepth++; +} + +void UndoHistory::EndUndoAction() { + EnsureUndoRoom(); + undoSequenceDepth--; + if (0 == undoSequenceDepth) { + if (actions[currentAction].at != startAction) { + currentAction++; + actions[currentAction].Create(startAction); + maxAction = currentAction; + } + actions[currentAction].mayCoalesce = false; + } +} + +void UndoHistory::DropUndoSequence() { + undoSequenceDepth = 0; +} + +void UndoHistory::DeleteUndoHistory() { + for (int i = 1; i < maxAction; i++) + actions[i].Destroy(); + maxAction = 0; + currentAction = 0; + actions[currentAction].Create(startAction); + savePoint = 0; +} + +void UndoHistory::SetSavePoint() { + savePoint = currentAction; +} + +bool UndoHistory::IsSavePoint() const { + return savePoint == currentAction; +} + +bool UndoHistory::CanUndo() const { + return (currentAction > 0) && (maxAction > 0); +} + +int UndoHistory::StartUndo() { + // Drop any trailing startAction + if (actions[currentAction].at == startAction && currentAction > 0) + currentAction--; + + // Count the steps in this action + int act = currentAction; + while (actions[act].at != startAction && act > 0) { + act--; + } + return currentAction - act; +} + +const Action &UndoHistory::GetUndoStep() const { + return actions[currentAction]; +} + +void UndoHistory::CompletedUndoStep() { + currentAction--; +} + +bool UndoHistory::CanRedo() const { + return maxAction > currentAction; +} + +int UndoHistory::StartRedo() { + // Drop any leading startAction + if (actions[currentAction].at == startAction && currentAction < maxAction) + currentAction++; + + // Count the steps in this action + int act = currentAction; + while (actions[act].at != startAction && act < maxAction) { + act++; + } + return act - currentAction; +} + +const Action &UndoHistory::GetRedoStep() const { + return actions[currentAction]; +} + +void UndoHistory::CompletedRedoStep() { + currentAction++; +} + +CellBuffer::CellBuffer() { + readOnly = false; + collectingUndo = true; +} + +CellBuffer::~CellBuffer() { +} + +char CellBuffer::CharAt(int position) { + return substance.ValueAt(position); +} + +void CellBuffer::GetCharRange(char *buffer, int position, int lengthRetrieve) { + if (lengthRetrieve < 0) + return; + if (position < 0) + return; + if ((position + lengthRetrieve) > substance.Length()) { + Platform::DebugPrintf("Bad GetCharRange %d for %d of %d\n", position, + lengthRetrieve, substance.Length()); + return; + } + + for (int i=0; i((curVal & ~mask) | styleValue)); + return true; + } else { + return false; + } +} + +bool CellBuffer::SetStyleFor(int position, int lengthStyle, char styleValue, char mask) { + bool changed = false; + PLATFORM_ASSERT(lengthStyle == 0 || + (lengthStyle > 0 && lengthStyle + position <= style.Length())); + while (lengthStyle--) { + char curVal = style.ValueAt(position); + if ((curVal & mask) != styleValue) { + style.SetValueAt(position, static_cast((curVal & ~mask) | styleValue)); + changed = true; + } + position++; + } + return changed; +} + +// The char* returned is to an allocation owned by the undo history +const char *CellBuffer::DeleteChars(int position, int deleteLength, bool &startSequence) { + // InsertString and DeleteChars are the bottleneck though which all changes occur + PLATFORM_ASSERT(deleteLength > 0); + char *data = 0; + if (!readOnly) { + if (collectingUndo) { + // Save into the undo/redo stack, but only the characters - not the formatting + data = new char[deleteLength]; + for (int i = 0; i < deleteLength; i++) { + data[i] = substance.ValueAt(position + i); + } + uh.AppendAction(removeAction, position, data, deleteLength, startSequence); + } + + BasicDeleteChars(position, deleteLength); + } + return data; +} + +int CellBuffer::Length() { + return substance.Length(); +} + +void CellBuffer::Allocate(int newSize) { + substance.ReAllocate(newSize); + style.ReAllocate(newSize); +} + +int CellBuffer::Lines() { + return lv.Lines(); +} + +int CellBuffer::LineStart(int line) { + if (line < 0) + return 0; + else if (line >= Lines()) + return Length(); + else + return lv.LineStart(line); +} + +bool CellBuffer::IsReadOnly() { + return readOnly; +} + +void CellBuffer::SetReadOnly(bool set) { + readOnly = set; +} + +void CellBuffer::SetSavePoint() { + uh.SetSavePoint(); +} + +bool CellBuffer::IsSavePoint() { + return uh.IsSavePoint(); +} + +int CellBuffer::AddMark(int line, int markerNum) { + if ((line >= 0) && (line < Lines())) { + return lv.AddMark(line, markerNum); + } + return - 1; +} + +void CellBuffer::DeleteMark(int line, int markerNum) { + if ((line >= 0) && (line < Lines())) { + lv.DeleteMark(line, markerNum, false); + } +} + +void CellBuffer::DeleteMarkFromHandle(int markerHandle) { + lv.DeleteMarkFromHandle(markerHandle); +} + +int CellBuffer::GetMark(int line) { + if ((line >= 0) && (line < Lines())) + return lv.MarkValue(line); + return 0; +} + +void CellBuffer::DeleteAllMarks(int markerNum) { + for (int line = 0; line < Lines(); line++) { + lv.DeleteMark(line, markerNum, true); + } +} + +int CellBuffer::LineFromHandle(int markerHandle) { + return lv.LineFromHandle(markerHandle); +} + +// Without undo + +void CellBuffer::BasicInsertString(int position, const char *s, int insertLength) { + if (insertLength == 0) + return; + PLATFORM_ASSERT(insertLength > 0); + + substance.InsertFromArray(position, s, 0, insertLength); + style.InsertValue(position, insertLength, 0); + + int lineInsert = lv.LineFromPosition(position) + 1; + // Point all the lines after the insertion point further along in the buffer + lv.InsertText(lineInsert-1, insertLength); + char chPrev = substance.ValueAt(position - 1); + char chAfter = substance.ValueAt(position + insertLength); + if (chPrev == '\r' && chAfter == '\n') { + // Splitting up a crlf pair at position + lv.InsertLine(lineInsert, position); + lineInsert++; + } + char ch = ' '; + for (int i = 0; i < insertLength; i++) { + ch = s[i]; + if (ch == '\r') { + lv.InsertLine(lineInsert, (position + i) + 1); + lineInsert++; + } else if (ch == '\n') { + if (chPrev == '\r') { + // Patch up what was end of line + lv.SetLineStart(lineInsert - 1, (position + i) + 1); + } else { + lv.InsertLine(lineInsert, (position + i) + 1); + lineInsert++; + } + } + chPrev = ch; + } + // Joining two lines where last insertion is cr and following substance starts with lf + if (chAfter == '\n') { + if (ch == '\r') { + // End of line already in buffer so drop the newly created one + lv.RemoveLine(lineInsert - 1); + } + } +} + +void CellBuffer::BasicDeleteChars(int position, int deleteLength) { + if (deleteLength == 0) + return; + + if ((position == 0) && (deleteLength == substance.Length())) { + // If whole buffer is being deleted, faster to reinitialise lines data + // than to delete each line. + lv.Init(); + } else { + // Have to fix up line positions before doing deletion as looking at text in buffer + // to work out which lines have been removed + + int lineRemove = lv.LineFromPosition(position) + 1; + lv.InsertText(lineRemove-1, - (deleteLength)); + char chPrev = substance.ValueAt(position - 1); + char chBefore = chPrev; + char chNext = substance.ValueAt(position); + bool ignoreNL = false; + if (chPrev == '\r' && chNext == '\n') { + // Move back one + lv.SetLineStart(lineRemove, position); + lineRemove++; + ignoreNL = true; // First \n is not real deletion + } + + char ch = chNext; + for (int i = 0; i < deleteLength; i++) { + chNext = substance.ValueAt(position + i + 1); + if (ch == '\r') { + if (chNext != '\n') { + lv.RemoveLine(lineRemove); + } + } else if (ch == '\n') { + if (ignoreNL) { + ignoreNL = false; // Further \n are real deletions + } else { + lv.RemoveLine(lineRemove); + } + } + + ch = chNext; + } + // May have to fix up end if last deletion causes cr to be next to lf + // or removes one of a crlf pair + char chAfter = substance.ValueAt(position + deleteLength); + if (chBefore == '\r' && chAfter == '\n') { + // Using lineRemove-1 as cr ended line before start of deletion + lv.RemoveLine(lineRemove - 1); + lv.SetLineStart(lineRemove - 1, position + 1); + } + } + substance.DeleteRange(position, deleteLength); + style.DeleteRange(position, deleteLength); +} + +bool CellBuffer::SetUndoCollection(bool collectUndo) { + collectingUndo = collectUndo; + uh.DropUndoSequence(); + return collectingUndo; +} + +bool CellBuffer::IsCollectingUndo() { + return collectingUndo; +} + +void CellBuffer::BeginUndoAction() { + uh.BeginUndoAction(); +} + +void CellBuffer::EndUndoAction() { + uh.EndUndoAction(); +} + +void CellBuffer::DeleteUndoHistory() { + uh.DeleteUndoHistory(); +} + +bool CellBuffer::CanUndo() { + return uh.CanUndo(); +} + +int CellBuffer::StartUndo() { + return uh.StartUndo(); +} + +const Action &CellBuffer::GetUndoStep() const { + return uh.GetUndoStep(); +} + +void CellBuffer::PerformUndoStep() { + const Action &actionStep = uh.GetUndoStep(); + if (actionStep.at == insertAction) { + BasicDeleteChars(actionStep.position, actionStep.lenData); + } else if (actionStep.at == removeAction) { + BasicInsertString(actionStep.position, actionStep.data, actionStep.lenData); + } + uh.CompletedUndoStep(); +} + +bool CellBuffer::CanRedo() { + return uh.CanRedo(); +} + +int CellBuffer::StartRedo() { + return uh.StartRedo(); +} + +const Action &CellBuffer::GetRedoStep() const { + return uh.GetRedoStep(); +} + +void CellBuffer::PerformRedoStep() { + const Action &actionStep = uh.GetRedoStep(); + if (actionStep.at == insertAction) { + BasicInsertString(actionStep.position, actionStep.data, actionStep.lenData); + } else if (actionStep.at == removeAction) { + BasicDeleteChars(actionStep.position, actionStep.lenData); + } + uh.CompletedRedoStep(); +} + +int CellBuffer::SetLineState(int line, int state) { + int stateOld = lineStates[line]; + lineStates[line] = state; + return stateOld; +} + +int CellBuffer::GetLineState(int line) { + return lineStates[line]; +} + +int CellBuffer::GetMaxLineState() { + return lineStates.Length(); +} + +int CellBuffer::SetLevel(int line, int level) { + return lv.SetLevel(line, level); +} + +int CellBuffer::GetLevel(int line) { + return lv.GetLevel(line); +} + +void CellBuffer::ClearLevels() { + lv.ClearLevels(); +} diff --git a/scintilla/src/CellBuffer.h b/scintilla/src/CellBuffer.h new file mode 100644 index 00000000..03e537e2 --- /dev/null +++ b/scintilla/src/CellBuffer.h @@ -0,0 +1,231 @@ +// Scintilla source code edit control +/** @file CellBuffer.h + ** Manages the text of the document. + **/ +// Copyright 1998-2004 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef CELLBUFFER_H +#define CELLBUFFER_H + +/** + * This holds the marker identifier and the marker type to display. + * MarkerHandleNumbers are members of lists. + */ +struct MarkerHandleNumber { + int handle; + int number; + MarkerHandleNumber *next; +}; + +/** + * A marker handle set contains any number of MarkerHandleNumbers. + */ +class MarkerHandleSet { + MarkerHandleNumber *root; + +public: + MarkerHandleSet(); + ~MarkerHandleSet(); + int Length() const; + int NumberFromHandle(int handle) const; + int MarkValue() const; ///< Bit set of marker numbers. + bool Contains(int handle) const; + bool InsertHandle(int handle, int markerNum); + void RemoveHandle(int handle); + bool RemoveNumber(int markerNum); + void CombineWith(MarkerHandleSet *other); +}; + +/** + * The line vector contains information about each of the lines in a cell buffer. + */ +class LineVector { + + Partitioning starts; + SplitVector markers; + SplitVector levels; + /// Handles are allocated sequentially and should never have to be reused as 32 bit ints are very big. + int handleCurrent; + +public: + + LineVector(); + ~LineVector(); + void Init(); + + void ExpandLevels(int sizeNew=-1); + void ClearLevels(); + int SetLevel(int line, int level); + int GetLevel(int line); + + void InsertText(int line, int delta); + void InsertLine(int line, int position); + void SetLineStart(int line, int position); + void RemoveLine(int line); + int Lines() { + return starts.Partitions(); + } + int LineFromPosition(int pos); + int LineStart(int line) { + return starts.PositionFromPartition(line); + } + + int MarkValue(int line); + int AddMark(int line, int marker); + void MergeMarkers(int pos); + void DeleteMark(int line, int markerNum, bool all); + void DeleteMarkFromHandle(int markerHandle); + int LineFromHandle(int markerHandle); +}; + +enum actionType { insertAction, removeAction, startAction }; + +/** + * Actions are used to store all the information required to perform one undo/redo step. + */ +class Action { +public: + actionType at; + int position; + char *data; + int lenData; + bool mayCoalesce; + + Action(); + ~Action(); + void Create(actionType at_, int position_=0, char *data_=0, int lenData_=0, bool mayCoalesce_=true); + void Destroy(); + void Grab(Action *source); +}; + +/** + * + */ +class UndoHistory { + Action *actions; + int lenActions; + int maxAction; + int currentAction; + int undoSequenceDepth; + int savePoint; + + void EnsureUndoRoom(); + +public: + UndoHistory(); + ~UndoHistory(); + + void AppendAction(actionType at, int position, char *data, int length, bool &startSequence); + + void BeginUndoAction(); + void EndUndoAction(); + void DropUndoSequence(); + void DeleteUndoHistory(); + + /// The save point is a marker in the undo stack where the container has stated that + /// the buffer was saved. Undo and redo can move over the save point. + void SetSavePoint(); + bool IsSavePoint() const; + + /// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is + /// called that many times. Similarly for redo. + bool CanUndo() const; + int StartUndo(); + const Action &GetUndoStep() const; + void CompletedUndoStep(); + bool CanRedo() const; + int StartRedo(); + const Action &GetRedoStep() const; + void CompletedRedoStep(); +}; + +/** + * Holder for an expandable array of characters that supports undo and line markers. + * Based on article "Data Structures in a Bit-Mapped Text Editor" + * by Wilfred J. Hansen, Byte January 1987, page 183. + */ +class CellBuffer { +private: + SplitVector substance; + SplitVector style; + bool readOnly; + + bool collectingUndo; + UndoHistory uh; + + LineVector lv; + + SVector lineStates; + +public: + + CellBuffer(); + ~CellBuffer(); + + /// Retrieving positions outside the range of the buffer works and returns 0 + char CharAt(int position); + void GetCharRange(char *buffer, int position, int lengthRetrieve); + char StyleAt(int position); + + int Length(); + void Allocate(int newSize); + int Lines(); + int LineStart(int line); + int LineFromPosition(int pos) { return lv.LineFromPosition(pos); } + const char *InsertString(int position, const char *s, int insertLength, bool &startSequence); + + /// Setting styles for positions outside the range of the buffer is safe and has no effect. + /// @return true if the style of a character is changed. + bool SetStyleAt(int position, char styleValue, char mask='\377'); + bool SetStyleFor(int position, int length, char styleValue, char mask); + + const char *DeleteChars(int position, int deleteLength, bool &startSequence); + + bool IsReadOnly(); + void SetReadOnly(bool set); + + /// The save point is a marker in the undo stack where the container has stated that + /// the buffer was saved. Undo and redo can move over the save point. + void SetSavePoint(); + bool IsSavePoint(); + + /// Line marker functions + int AddMark(int line, int markerNum); + void DeleteMark(int line, int markerNum); + void DeleteMarkFromHandle(int markerHandle); + int GetMark(int line); + void DeleteAllMarks(int markerNum); + int LineFromHandle(int markerHandle); + + /// Actions without undo + void BasicInsertString(int position, const char *s, int insertLength); + void BasicDeleteChars(int position, int deleteLength); + + bool SetUndoCollection(bool collectUndo); + bool IsCollectingUndo(); + void BeginUndoAction(); + void EndUndoAction(); + void DeleteUndoHistory(); + + /// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is + /// called that many times. Similarly for redo. + bool CanUndo(); + int StartUndo(); + const Action &GetUndoStep() const; + void PerformUndoStep(); + bool CanRedo(); + int StartRedo(); + const Action &GetRedoStep() const; + void PerformRedoStep(); + + int SetLineState(int line, int state); + int GetLineState(int line); + int GetMaxLineState(); + + int SetLevel(int line, int level); + int GetLevel(int line); + void ClearLevels(); +}; + +#endif diff --git a/scintilla/src/CharClassify.cxx b/scintilla/src/CharClassify.cxx new file mode 100644 index 00000000..76eb905c --- /dev/null +++ b/scintilla/src/CharClassify.cxx @@ -0,0 +1,43 @@ +// Scintilla source code edit control +/** @file CharClassify.cxx + ** Character classifications used by Document and RESearch. + **/ +// Copyright 2006 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include + +#include "CharClassify.h" + +// Shut up annoying Visual C++ warnings: +#ifdef _MSC_VER +#pragma warning(disable: 4514) +#endif + +CharClassify::CharClassify() { + SetDefaultCharClasses(true); +} + +void CharClassify::SetDefaultCharClasses(bool includeWordClass) { + // Initialize all char classes to default values + for (int ch = 0; ch < 256; ch++) { + if (ch == '\r' || ch == '\n') + charClass[ch] = ccNewLine; + else if (ch < 0x20 || ch == ' ') + charClass[ch] = ccSpace; + else if (includeWordClass && (ch >= 0x80 || isalnum(ch) || ch == '_')) + charClass[ch] = ccWord; + else + charClass[ch] = ccPunctuation; + } +} + +void CharClassify::SetCharClasses(const unsigned char *chars, cc newCharClass) { + // Apply the newCharClass to the specifed chars + if (chars) { + while (*chars) { + charClass[*chars] = static_cast(newCharClass); + chars++; + } + } +} diff --git a/scintilla/src/CharClassify.h b/scintilla/src/CharClassify.h new file mode 100644 index 00000000..d26f4b34 --- /dev/null +++ b/scintilla/src/CharClassify.h @@ -0,0 +1,25 @@ +// Scintilla source code edit control +/** @file CharClassify.h + ** Character classifications used by Document and RESearch. + **/ +// Copyright 2006 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef CHARCLASSIFY_H +#define CHARCLASSIFY_H + +class CharClassify { +public: + CharClassify(); + + enum cc { ccSpace, ccNewLine, ccWord, ccPunctuation }; + void SetDefaultCharClasses(bool includeWordClass); + void SetCharClasses(const unsigned char *chars, cc newCharClass); + cc GetClass(unsigned char ch) const { return static_cast(charClass[ch]);} + bool IsWord(unsigned char ch) const { return static_cast(charClass[ch]) == ccWord;} + +private: + enum { maxChar=256 }; + unsigned char charClass[maxChar]; // not type cc to save space +}; +#endif diff --git a/scintilla/src/ContractionState.cxx b/scintilla/src/ContractionState.cxx new file mode 100644 index 00000000..1f63c9ad --- /dev/null +++ b/scintilla/src/ContractionState.cxx @@ -0,0 +1,289 @@ +// Scintilla source code edit control +/** @file ContractionState.cxx + ** Manages visibility of lines for folding. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include "Platform.h" + +#include "ContractionState.h" + +OneLine::OneLine() { + displayLine = 0; + //docLine = 0; + visible = true; + height = 1; + expanded = true; +} + +ContractionState::ContractionState() { + lines = 0; + size = 0; + linesInDoc = 1; + linesInDisplay = 1; + valid = false; + docLines = 0; + sizeDocLines = 0; +} + +ContractionState::~ContractionState() { + Clear(); +} + +void ContractionState::MakeValid() const { + if (!valid) { + // Could be cleverer by keeping the index of the last still valid entry + // rather than invalidating all. + linesInDisplay = 0; + for (int lineInDoc=0; lineInDoc= 0) && (lineDoc < linesInDoc)) { + return lines[lineDoc].displayLine; + } + return -1; +} + +int ContractionState::DocFromDisplay(int lineDisplay) const { + if (lineDisplay <= 0) + return 0; + if (lineDisplay >= linesInDisplay) + return linesInDoc; + if (size == 0) + return lineDisplay; + MakeValid(); + if (docLines) { // Valid allocation + return docLines[lineDisplay]; + } else { + return 0; + } +} + +void ContractionState::Grow(int sizeNew) { + OneLine *linesNew = new OneLine[sizeNew]; + if (linesNew) { + int i = 0; + for (; i < size; i++) { + linesNew[i] = lines[i]; + } + for (; i < sizeNew; i++) { + linesNew[i].displayLine = i; + } + delete []lines; + lines = linesNew; + size = sizeNew; + valid = false; + } else { + Platform::DebugPrintf("No memory available\n"); + // TODO: Blow up + } +} + +void ContractionState::InsertLines(int lineDoc, int lineCount) { + if (size == 0) { + linesInDoc += lineCount; + linesInDisplay += lineCount; + return; + } + //Platform::DebugPrintf("InsertLine[%d] = %d\n", lineDoc); + if ((linesInDoc + lineCount + 2) >= size) { + Grow(linesInDoc + lineCount + growSize); + } + linesInDoc += lineCount; + for (int i = linesInDoc; i >= lineDoc + lineCount; i--) { + lines[i].visible = lines[i - lineCount].visible; + lines[i].height = lines[i - lineCount].height; + linesInDisplay += lines[i].height; + lines[i].expanded = lines[i - lineCount].expanded; + } + for (int d=0;d= 0) && (lineDoc < linesInDoc)) { + return lines[lineDoc].visible; + } else { + return false; + } +} + +bool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool visible) { + if (lineDocStart == 0) + lineDocStart++; + if (lineDocStart > lineDocEnd) + return false; + if (size == 0) { + Grow(linesInDoc + growSize); + } + // TODO: modify docLine members to mirror displayLine + int delta = 0; + // Change lineDocs + if ((lineDocStart <= lineDocEnd) && (lineDocStart >= 0) && (lineDocEnd < linesInDoc)) { + for (int line=lineDocStart; line <= lineDocEnd; line++) { + if (lines[line].visible != visible) { + delta += visible ? lines[line].height : -lines[line].height; + lines[line].visible = visible; + valid = false; + } + } + } + linesInDisplay += delta; + return delta != 0; +} + +bool ContractionState::GetExpanded(int lineDoc) const { + if (size == 0) + return true; + if ((lineDoc >= 0) && (lineDoc < linesInDoc)) { + return lines[lineDoc].expanded; + } else { + return false; + } +} + +bool ContractionState::SetExpanded(int lineDoc, bool expanded) { + if (size == 0) { + if (expanded) { + // If in completely expanded state then setting + // one line to expanded has no effect. + return false; + } + Grow(linesInDoc + growSize); + } + if ((lineDoc >= 0) && (lineDoc < linesInDoc)) { + if (lines[lineDoc].expanded != expanded) { + lines[lineDoc].expanded = expanded; + return true; + } + } + return false; +} + +int ContractionState::GetHeight(int lineDoc) const { + if (size == 0) + return 1; + if ((lineDoc >= 0) && (lineDoc < linesInDoc)) { + return lines[lineDoc].height; + } else { + return 1; + } +} + +// Set the number of display lines needed for this line. +// Return true if this is a change. +bool ContractionState::SetHeight(int lineDoc, int height) { + if (lineDoc > linesInDoc) + return false; + if (size == 0) { + if (height == 1) { + // If in completely expanded state then all lines + // assumed to have height of one so no effect here. + return false; + } + Grow(linesInDoc + growSize); + } + if (lines[lineDoc].height != height) { + lines[lineDoc].height = height; + valid = false; + return true; + } else { + return false; + } +} + +void ContractionState::ShowAll() { + delete []lines; + lines = 0; + size = 0; + + delete []docLines; + docLines = 0; + sizeDocLines = 0; + + linesInDisplay = linesInDoc; +} diff --git a/scintilla/src/ContractionState.h b/scintilla/src/ContractionState.h new file mode 100644 index 00000000..735735b0 --- /dev/null +++ b/scintilla/src/ContractionState.h @@ -0,0 +1,65 @@ +// Scintilla source code edit control +/** @file ContractionState.h + ** Manages visibility of lines for folding. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef CONTRACTIONSTATE_H +#define CONTRACTIONSTATE_H + +/** + */ +class OneLine { +public: + int displayLine; ///< Position within set of visible lines + //int docLine; ///< Inverse of @a displayLine + int height; ///< Number of display lines needed to show all of the line + bool visible; + bool expanded; + + OneLine(); + virtual ~OneLine() {} +}; + +/** + */ +class ContractionState { + void Grow(int sizeNew); + enum { growSize = 4000 }; + int linesInDoc; + mutable int linesInDisplay; + mutable OneLine *lines; + int size; + mutable int *docLines; + mutable int sizeDocLines; + mutable bool valid; + void MakeValid() const; + +public: + ContractionState(); + virtual ~ContractionState(); + + void Clear(); + + int LinesInDoc() const; + int LinesDisplayed() const; + int DisplayFromDoc(int lineDoc) const; + int DocFromDisplay(int lineDisplay) const; + + void InsertLines(int lineDoc, int lineCount); + void DeleteLines(int lineDoc, int lineCount); + + bool GetVisible(int lineDoc) const; + bool SetVisible(int lineDocStart, int lineDocEnd, bool visible); + + bool GetExpanded(int lineDoc) const; + bool SetExpanded(int lineDoc, bool expanded); + + int GetHeight(int lineDoc) const; + bool SetHeight(int lineDoc, int height); + + void ShowAll(); +}; + +#endif diff --git a/scintilla/src/Document.cxx b/scintilla/src/Document.cxx new file mode 100644 index 00000000..06a945f0 --- /dev/null +++ b/scintilla/src/Document.cxx @@ -0,0 +1,1727 @@ +// Scintilla source code edit control +/** @file Document.cxx + ** Text document that handles notifications, DBCS, styling, words and end of line. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include "Platform.h" + +#include "Scintilla.h" +#include "SVector.h" +#include "SplitVector.h" +#include "Partitioning.h" +#include "CellBuffer.h" +#include "CharClassify.h" +#include "Document.h" +#include "RESearch.h" + +//Vitaliy +#include "UniConversion.h" + + +static inline void Platform_MakeUpperW(wchar_t* wstr, unsigned int) { + // TODO: Add platform-specific function here + + // Win32 example: + ::CharUpperW(wstr); +} + +static inline char Platform_MakeUpperChar(char ch) { + // TODO: Add platform-specific function here + + // Win32 example: + char str[2] = {ch, 0}; + ::CharUpperA(str); + ch = str[0]; + + // default: no conversion + return ch; +} + +static inline char Platform_MakeLowerChar(char ch) { + // TODO: Add platform-specific function here + + // Win32 example: + char str[2] = {ch, 0}; + ::CharLowerA(str); + ch = str[0]; + + // default: no conversion + return ch; +} +// yilatiV + +// This is ASCII specific but is safe with chars >= 0x80 +static inline bool isspacechar(unsigned char ch) { + return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); +} + +static inline bool IsPunctuation(char ch) { + return isascii(ch) && ispunct(ch); +} + +static inline bool IsADigit(char ch) { + return isascii(ch) && isdigit(ch); +} + +static inline bool IsLowerCase(char ch) { + return isascii(ch) && islower(ch); +} + +static inline bool IsUpperCase(char ch) { + return isascii(ch) && isupper(ch); +} + +Document::Document() { + refCount = 0; +#ifdef unix + eolMode = SC_EOL_LF; +#else + eolMode = SC_EOL_CRLF; +#endif + dbcsCodePage = 0; + stylingBits = 5; + stylingBitsMask = 0x1F; + stylingMask = 0; + endStyled = 0; + styleClock = 0; + enteredModification = 0; + enteredStyling = 0; + enteredReadOnlyCount = 0; + tabInChars = 8; + indentInChars = 0; + actualIndentInChars = 8; + useTabs = true; + tabIndents = true; + backspaceUnindents = false; + watchers = 0; + lenWatchers = 0; + + matchesValid = false; + pre = 0; + substituted = 0; +} + +Document::~Document() { + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifyDeleted(this, watchers[i].userData); + } + delete []watchers; + watchers = 0; + lenWatchers = 0; + delete pre; + pre = 0; + delete []substituted; + substituted = 0; +} + +// Increase reference count and return its previous value. +int Document::AddRef() { + return refCount++; +} + +// Decrease reference count and return its previous value. +// Delete the document if reference count reaches zero. +int Document::Release() { + int curRefCount = --refCount; + if (curRefCount == 0) + delete this; + return curRefCount; +} + +void Document::SetSavePoint() { + cb.SetSavePoint(); + NotifySavePoint(true); +} + +int Document::AddMark(int line, int markerNum) { + int prev = cb.AddMark(line, markerNum); + DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + mh.line = line; + NotifyModified(mh); + return prev; +} + +void Document::AddMarkSet(int line, int valueSet) { + unsigned int m = valueSet; + for (int i = 0; m; i++, m >>= 1) + if (m & 1) + cb.AddMark(line, i); + DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + mh.line = line; + NotifyModified(mh); +} + +void Document::DeleteMark(int line, int markerNum) { + cb.DeleteMark(line, markerNum); + DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + mh.line = line; + NotifyModified(mh); +} + +void Document::DeleteMarkFromHandle(int markerHandle) { + cb.DeleteMarkFromHandle(markerHandle); + DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); + mh.line = -1; + NotifyModified(mh); +} + +void Document::DeleteAllMarks(int markerNum) { + cb.DeleteAllMarks(markerNum); + DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); + mh.line = -1; + NotifyModified(mh); +} + +int Document::LineStart(int line) { + return cb.LineStart(line); +} + +int Document::LineEnd(int line) { + if (line == LinesTotal() - 1) { + return LineStart(line + 1); + } else { + int position = LineStart(line + 1) - 1; + // When line terminator is CR+LF, may need to go back one more + if ((position > LineStart(line)) && (cb.CharAt(position - 1) == '\r')) { + position--; + } + return position; + } +} + +int Document::LineFromPosition(int pos) { + return cb.LineFromPosition(pos); +} + +int Document::LineEndPosition(int position) { + return LineEnd(LineFromPosition(position)); +} + +int Document::VCHomePosition(int position) { + int line = LineFromPosition(position); + int startPosition = LineStart(line); + int endLine = LineStart(line + 1) - 1; + int startText = startPosition; + while (startText < endLine && (cb.CharAt(startText) == ' ' || cb.CharAt(startText) == '\t' ) ) + startText++; + if (position == startText) + return startPosition; + else + return startText; +} + +int Document::SetLevel(int line, int level) { + int prev = cb.SetLevel(line, level); + if (prev != level) { + DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER, + LineStart(line), 0, 0, 0); + mh.line = line; + mh.foldLevelNow = level; + mh.foldLevelPrev = prev; + NotifyModified(mh); + } + return prev; +} + +static bool IsSubordinate(int levelStart, int levelTry) { + if (levelTry & SC_FOLDLEVELWHITEFLAG) + return true; + else + return (levelStart & SC_FOLDLEVELNUMBERMASK) < (levelTry & SC_FOLDLEVELNUMBERMASK); +} + +int Document::GetLastChild(int lineParent, int level) { + if (level == -1) + level = GetLevel(lineParent) & SC_FOLDLEVELNUMBERMASK; + int maxLine = LinesTotal(); + int lineMaxSubord = lineParent; + while (lineMaxSubord < maxLine - 1) { + EnsureStyledTo(LineStart(lineMaxSubord + 2)); + if (!IsSubordinate(level, GetLevel(lineMaxSubord + 1))) + break; + lineMaxSubord++; + } + if (lineMaxSubord > lineParent) { + if (level > (GetLevel(lineMaxSubord + 1) & SC_FOLDLEVELNUMBERMASK)) { + // Have chewed up some whitespace that belongs to a parent so seek back + if (GetLevel(lineMaxSubord) & SC_FOLDLEVELWHITEFLAG) { + lineMaxSubord--; + } + } + } + return lineMaxSubord; +} + +int Document::GetFoldParent(int line) { + int level = GetLevel(line) & SC_FOLDLEVELNUMBERMASK; + int lineLook = line - 1; + while ((lineLook > 0) && ( + (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) || + ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) >= level)) + ) { + lineLook--; + } + if ((GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG) && + ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) < level)) { + return lineLook; + } else { + return -1; + } +} + +int Document::ClampPositionIntoDocument(int pos) { + return Platform::Clamp(pos, 0, Length()); +} + +bool Document::IsCrLf(int pos) { + if (pos < 0) + return false; + if (pos >= (Length() - 1)) + return false; + return (cb.CharAt(pos) == '\r') && (cb.CharAt(pos + 1) == '\n'); +} + +static const int maxBytesInDBCSCharacter=5; + +int Document::LenChar(int pos) { + if (pos < 0) { + return 1; + } else if (IsCrLf(pos)) { + return 2; + } else if (SC_CP_UTF8 == dbcsCodePage) { + unsigned char ch = static_cast(cb.CharAt(pos)); + if (ch < 0x80) + return 1; + int len = 2; + if (ch >= (0x80 + 0x40 + 0x20)) + len = 3; + int lengthDoc = Length(); + if ((pos + len) > lengthDoc) + return lengthDoc -pos; + else + return len; + } else if (dbcsCodePage) { + char mbstr[maxBytesInDBCSCharacter+1]; + int i; + for (i=0; i= Length()) + return Length(); + + // PLATFORM_ASSERT(pos > 0 && pos < Length()); + if (checkLineEnd && IsCrLf(pos - 1)) { + if (moveDir > 0) + return pos + 1; + else + return pos - 1; + } + + // Not between CR and LF + + if (dbcsCodePage) { + if (SC_CP_UTF8 == dbcsCodePage) { + unsigned char ch = static_cast(cb.CharAt(pos)); + while ((pos > 0) && (pos < Length()) && (ch >= 0x80) && (ch < (0x80 + 0x40))) { + // ch is a trail byte + if (moveDir > 0) + pos++; + else + pos--; + ch = static_cast(cb.CharAt(pos)); + } + } else { + // Anchor DBCS calculations at start of line because start of line can + // not be a DBCS trail byte. + int posCheck = LineStart(LineFromPosition(pos)); + while (posCheck < pos) { + char mbstr[maxBytesInDBCSCharacter+1]; + int i; + for(i=0;i pos) { + if (moveDir > 0) { + return posCheck + mbsize; + } else { + return posCheck; + } + } + posCheck += mbsize; + } + } + } + + return pos; +} + +void Document::ModifiedAt(int pos) { + if (endStyled > pos) + endStyled = pos; +} + +void Document::CheckReadOnly() { + if (cb.IsReadOnly() && enteredReadOnlyCount == 0) { + enteredReadOnlyCount++; + NotifyModifyAttempt(); + enteredReadOnlyCount--; + } +} + +// Document only modified by gateways DeleteChars, InsertString, Undo, Redo, and SetStyleAt. +// SetStyleAt does not change the persistent state of a document + +bool Document::DeleteChars(int pos, int len) { + if (len == 0) + return false; + if ((pos + len) > Length()) + return false; + CheckReadOnly(); + if (enteredModification != 0) { + return false; + } else { + enteredModification++; + if (!cb.IsReadOnly()) { + NotifyModified( + DocModification( + SC_MOD_BEFOREDELETE | SC_PERFORMED_USER, + pos, len, + 0, 0)); + int prevLinesTotal = LinesTotal(); + bool startSavePoint = cb.IsSavePoint(); + bool startSequence = false; + const char *text = cb.DeleteChars(pos, len, startSequence); + if (startSavePoint && cb.IsCollectingUndo()) + NotifySavePoint(!startSavePoint); + if ((pos < Length()) || (pos == 0)) + ModifiedAt(pos); + else + ModifiedAt(pos-1); + NotifyModified( + DocModification( + SC_MOD_DELETETEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0), + pos, len, + LinesTotal() - prevLinesTotal, text)); + } + enteredModification--; + } + return !cb.IsReadOnly(); +} + +/** + * Insert a string with a length. + */ +bool Document::InsertString(int position, const char *s, int insertLength) { + if (insertLength <= 0) { + return false; + } + CheckReadOnly(); + if (enteredModification != 0) { + return false; + } else { + enteredModification++; + if (!cb.IsReadOnly()) { + NotifyModified( + DocModification( + SC_MOD_BEFOREINSERT | SC_PERFORMED_USER, + position, insertLength, + 0, s)); + int prevLinesTotal = LinesTotal(); + bool startSavePoint = cb.IsSavePoint(); + bool startSequence = false; + const char *text = cb.InsertString(position, s, insertLength, startSequence); + if (startSavePoint && cb.IsCollectingUndo()) + NotifySavePoint(!startSavePoint); + ModifiedAt(position); + NotifyModified( + DocModification( + SC_MOD_INSERTTEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0), + position, insertLength, + LinesTotal() - prevLinesTotal, text)); + } + enteredModification--; + } + return !cb.IsReadOnly(); +} + +int Document::Undo() { + int newPos = -1; + CheckReadOnly(); + if (enteredModification == 0) { + enteredModification++; + if (!cb.IsReadOnly()) { + bool startSavePoint = cb.IsSavePoint(); + bool multiLine = false; + int steps = cb.StartUndo(); + //Platform::DebugPrintf("Steps=%d\n", steps); + for (int step = 0; step < steps; step++) { + const int prevLinesTotal = LinesTotal(); + const Action &action = cb.GetUndoStep(); + if (action.at == removeAction) { + NotifyModified(DocModification( + SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action)); + } else { + NotifyModified(DocModification( + SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action)); + } + cb.PerformUndoStep(); + int cellPosition = action.position; + ModifiedAt(cellPosition); + newPos = cellPosition; + + int modFlags = SC_PERFORMED_UNDO; + // With undo, an insertion action becomes a deletion notification + if (action.at == removeAction) { + newPos += action.lenData; + modFlags |= SC_MOD_INSERTTEXT; + } else { + modFlags |= SC_MOD_DELETETEXT; + } + if (steps > 1) + modFlags |= SC_MULTISTEPUNDOREDO; + const int linesAdded = LinesTotal() - prevLinesTotal; + if (linesAdded != 0) + multiLine = true; + if (step == steps - 1) { + modFlags |= SC_LASTSTEPINUNDOREDO; + if (multiLine) + modFlags |= SC_MULTILINEUNDOREDO; + } + NotifyModified(DocModification(modFlags, cellPosition, action.lenData, + linesAdded, action.data)); + } + + bool endSavePoint = cb.IsSavePoint(); + if (startSavePoint != endSavePoint) + NotifySavePoint(endSavePoint); + } + enteredModification--; + } + return newPos; +} + +int Document::Redo() { + int newPos = -1; + CheckReadOnly(); + if (enteredModification == 0) { + enteredModification++; + if (!cb.IsReadOnly()) { + bool startSavePoint = cb.IsSavePoint(); + bool multiLine = false; + int steps = cb.StartRedo(); + for (int step = 0; step < steps; step++) { + const int prevLinesTotal = LinesTotal(); + const Action &action = cb.GetRedoStep(); + if (action.at == insertAction) { + NotifyModified(DocModification( + SC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action)); + } else { + NotifyModified(DocModification( + SC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action)); + } + cb.PerformRedoStep(); + ModifiedAt(action.position); + newPos = action.position; + + int modFlags = SC_PERFORMED_REDO; + if (action.at == insertAction) { + newPos += action.lenData; + modFlags |= SC_MOD_INSERTTEXT; + } else { + modFlags |= SC_MOD_DELETETEXT; + } + if (steps > 1) + modFlags |= SC_MULTISTEPUNDOREDO; + const int linesAdded = LinesTotal() - prevLinesTotal; + if (linesAdded != 0) + multiLine = true; + if (step == steps - 1) { + modFlags |= SC_LASTSTEPINUNDOREDO; + if (multiLine) + modFlags |= SC_MULTILINEUNDOREDO; + } + NotifyModified( + DocModification(modFlags, action.position, action.lenData, + linesAdded, action.data)); + } + + bool endSavePoint = cb.IsSavePoint(); + if (startSavePoint != endSavePoint) + NotifySavePoint(endSavePoint); + } + enteredModification--; + } + return newPos; +} + +/** + * Insert a single character. + */ +bool Document::InsertChar(int pos, char ch) { + char chs[1]; + chs[0] = ch; + return InsertString(pos, chs, 1); +} + +/** + * Insert a null terminated string. + */ +bool Document::InsertCString(int position, const char *s) { + return InsertString(position, s, strlen(s)); +} + +void Document::ChangeChar(int pos, char ch) { + DeleteChars(pos, 1); + InsertChar(pos, ch); +} + +void Document::DelChar(int pos) { + DeleteChars(pos, LenChar(pos)); +} + +void Document::DelCharBack(int pos) { + if (pos <= 0) { + return; + } else if (IsCrLf(pos - 2)) { + DeleteChars(pos - 2, 2); + } else if (dbcsCodePage) { + int startChar = MovePositionOutsideChar(pos - 1, -1, false); + DeleteChars(startChar, pos - startChar); + } else { + DeleteChars(pos - 1, 1); + } +} + +static bool isindentchar(char ch) { + return (ch == ' ') || (ch == '\t'); +} + +static int NextTab(int pos, int tabSize) { + return ((pos / tabSize) + 1) * tabSize; +} + +static void CreateIndentation(char *linebuf, int length, int indent, int tabSize, bool insertSpaces) { + length--; // ensure space for \0 + if (!insertSpaces) { + while ((indent >= tabSize) && (length > 0)) { + *linebuf++ = '\t'; + indent -= tabSize; + length--; + } + } + while ((indent > 0) && (length > 0)) { + *linebuf++ = ' '; + indent--; + length--; + } + *linebuf = '\0'; +} + +int Document::GetLineIndentation(int line) { + int indent = 0; + if ((line >= 0) && (line < LinesTotal())) { + int lineStart = LineStart(line); + int length = Length(); + for (int i = lineStart;i < length;i++) { + char ch = cb.CharAt(i); + if (ch == ' ') + indent++; + else if (ch == '\t') + indent = NextTab(indent, tabInChars); + else + return indent; + } + } + return indent; +} + +void Document::SetLineIndentation(int line, int indent) { + int indentOfLine = GetLineIndentation(line); + if (indent < 0) + indent = 0; + if (indent != indentOfLine) { + char linebuf[1000]; + CreateIndentation(linebuf, sizeof(linebuf), indent, tabInChars, !useTabs); + int thisLineStart = LineStart(line); + int indentPos = GetLineIndentPosition(line); + BeginUndoAction(); + DeleteChars(thisLineStart, indentPos - thisLineStart); + InsertCString(thisLineStart, linebuf); + EndUndoAction(); + } +} + +int Document::GetLineIndentPosition(int line) { + if (line < 0) + return 0; + int pos = LineStart(line); + int length = Length(); + while ((pos < length) && isindentchar(cb.CharAt(pos))) { + pos++; + } + return pos; +} + +int Document::GetColumn(int pos) { + int column = 0; + int line = LineFromPosition(pos); + if ((line >= 0) && (line < LinesTotal())) { + for (int i = LineStart(line);i < pos;) { + char ch = cb.CharAt(i); + if (ch == '\t') { + column = NextTab(column, tabInChars); + i++; + } else if (ch == '\r') { + return column; + } else if (ch == '\n') { + return column; + } else if (i >= Length()) { + return column; + } else { + column++; + i = MovePositionOutsideChar(i + 1, 1, false); + } + } + } + return column; +} + +int Document::FindColumn(int line, int column) { + int position = LineStart(line); + int columnCurrent = 0; + if ((line >= 0) && (line < LinesTotal())) { + while ((columnCurrent < column) && (position < Length())) { + char ch = cb.CharAt(position); + if (ch == '\t') { + columnCurrent = NextTab(columnCurrent, tabInChars); + position++; + } else if (ch == '\r') { + return position; + } else if (ch == '\n') { + return position; + } else { + columnCurrent++; + position = MovePositionOutsideChar(position + 1, 1, false); + } + } + } + return position; +} + +void Document::Indent(bool forwards, int lineBottom, int lineTop) { + // Dedent - suck white space off the front of the line to dedent by equivalent of a tab + for (int line = lineBottom; line >= lineTop; line--) { + int indentOfLine = GetLineIndentation(line); + if (forwards) { + if (LineStart(line) < LineEnd(line)) { + SetLineIndentation(line, indentOfLine + IndentSize()); + } + } else { + SetLineIndentation(line, indentOfLine - IndentSize()); + } + } +} + +// Convert line endings for a piece of text to a particular mode. +// Stop at len or when a NUL is found. +// Caller must delete the returned pointer. +char *Document::TransformLineEnds(int *pLenOut, const char *s, size_t len, int eolMode) { + char *dest = new char[2 * len + 1]; + const char *sptr = s; + char *dptr = dest; + for (size_t i = 0; (i < len) && (*sptr != '\0'); i++) { + if (*sptr == '\n' || *sptr == '\r') { + if (eolMode == SC_EOL_CR) { + *dptr++ = '\r'; + } else if (eolMode == SC_EOL_LF) { + *dptr++ = '\n'; + } else { // eolMode == SC_EOL_CRLF + *dptr++ = '\r'; + *dptr++ = '\n'; + } + if ((*sptr == '\r') && (i+1 < len) && (*(sptr+1) == '\n')) { + i++; + sptr++; + } + sptr++; + } else { + *dptr++ = *sptr++; + } + } + *dptr++ = '\0'; + *pLenOut = (dptr - dest) - 1; + return dest; +} + +void Document::ConvertLineEnds(int eolModeSet) { + BeginUndoAction(); + + for (int pos = 0; pos < Length(); pos++) { + if (cb.CharAt(pos) == '\r') { + if (cb.CharAt(pos + 1) == '\n') { + // CRLF + if (eolModeSet == SC_EOL_CR) { + DeleteChars(pos + 1, 1); // Delete the LF + } else if (eolModeSet == SC_EOL_LF) { + DeleteChars(pos, 1); // Delete the CR + } else { + pos++; + } + } else { + // CR + if (eolModeSet == SC_EOL_CRLF) { + InsertString(pos + 1, "\n", 1); // Insert LF + pos++; + } else if (eolModeSet == SC_EOL_LF) { + InsertString(pos, "\n", 1); // Insert LF + DeleteChars(pos + 1, 1); // Delete CR + } + } + } else if (cb.CharAt(pos) == '\n') { + // LF + if (eolModeSet == SC_EOL_CRLF) { + InsertString(pos, "\r", 1); // Insert CR + pos++; + } else if (eolModeSet == SC_EOL_CR) { + InsertString(pos, "\r", 1); // Insert CR + DeleteChars(pos + 1, 1); // Delete LF + } + } + } + + EndUndoAction(); +} + +bool Document::IsWhiteLine(int line) { + int currentChar = LineStart(line); + int endLine = LineEnd(line); + while (currentChar < endLine) { + if (cb.CharAt(currentChar) != ' ' && cb.CharAt(currentChar) != '\t') { + return false; + } + ++currentChar; + } + return true; +} + +int Document::ParaUp(int pos) { + int line = LineFromPosition(pos); + line--; + while (line >= 0 && IsWhiteLine(line)) { // skip empty lines + line--; + } + while (line >= 0 && !IsWhiteLine(line)) { // skip non-empty lines + line--; + } + line++; + return LineStart(line); +} + +int Document::ParaDown(int pos) { + int line = LineFromPosition(pos); + while (line < LinesTotal() && !IsWhiteLine(line)) { // skip non-empty lines + line++; + } + while (line < LinesTotal() && IsWhiteLine(line)) { // skip empty lines + line++; + } + if (line < LinesTotal()) + return LineStart(line); + else // end of a document + return LineEnd(line-1); +} + +CharClassify::cc Document::WordCharClass(unsigned char ch) { + if ((SC_CP_UTF8 == dbcsCodePage) && (ch >= 0x80)) + return CharClassify::ccWord; + return charClass.GetClass(ch); +} + +/** + * Used by commmands that want to select whole words. + * Finds the start of word at pos when delta < 0 or the end of the word when delta >= 0. + */ +int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) { + CharClassify::cc ccStart = CharClassify::ccWord; + if (delta < 0) { + if (!onlyWordCharacters) + ccStart = WordCharClass(cb.CharAt(pos-1)); + while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) + pos--; + } else { + if (!onlyWordCharacters && pos < Length()) + ccStart = WordCharClass(cb.CharAt(pos)); + while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart)) + pos++; + } + return MovePositionOutsideChar(pos, delta); +} + +/** + * Find the start of the next word in either a forward (delta >= 0) or backwards direction + * (delta < 0). + * This is looking for a transition between character classes although there is also some + * additional movement to transit white space. + * Used by cursor movement by word commands. + */ +int Document::NextWordStart(int pos, int delta) { + if (delta < 0) { + while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace)) + pos--; + if (pos > 0) { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1)); + while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) { + pos--; + } + } + } else { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos)); + while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart)) + pos++; + while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace)) + pos++; + } + return pos; +} + +/** + * Find the end of the next word in either a forward (delta >= 0) or backwards direction + * (delta < 0). + * This is looking for a transition between character classes although there is also some + * additional movement to transit white space. + * Used by cursor movement by word commands. + */ +int Document::NextWordEnd(int pos, int delta) { + if (delta < 0) { + if (pos > 0) { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1)); + if (ccStart != CharClassify::ccSpace) { + while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccStart) { + pos--; + } + } + while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace) { + pos--; + } + } + } else { + while (pos < Length() && WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace) { + pos++; + } + if (pos < Length()) { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos)); + while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccStart) { + pos++; + } + } + } + return pos; +} + +/** + * Check that the character at the given position is a word or punctuation character and that + * the previous character is of a different character class. + */ +bool Document::IsWordStartAt(int pos) { + if (pos > 0) { + CharClassify::cc ccPos = WordCharClass(CharAt(pos)); + return (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) && + (ccPos != WordCharClass(CharAt(pos - 1))); + } + return true; +} + +/** + * Check that the character at the given position is a word or punctuation character and that + * the next character is of a different character class. + */ +bool Document::IsWordEndAt(int pos) { + if (pos < Length()) { + CharClassify::cc ccPrev = WordCharClass(CharAt(pos-1)); + return (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) && + (ccPrev != WordCharClass(CharAt(pos))); + } + return true; +} + +/** + * Check that the given range is has transitions between character classes at both + * ends and where the characters on the inside are word or punctuation characters. + */ +bool Document::IsWordAt(int start, int end) { + return IsWordStartAt(start) && IsWordEndAt(end); +} + +// The comparison and case changing functions here assume ASCII +// or extended ASCII such as the normal Windows code page. + +//Vitaliy +// NOTE: this function is called for non-Unicode characters only! +// ( i.e. when (!dbcsCodePage || isascii(ch)) ) +static inline char MakeUpperCase(char ch) { + if (ch >= 'A' && ch <= 'Z') + return ch; + else if (ch >= 'a' && ch <= 'z') + return static_cast(ch - 'a' + 'A'); + else + return Platform_MakeUpperChar(ch); +} + + + +// NOTE: this function is called for non-Unicode characters only! +// ( i.e. when (!dbcsCodePage || isascii(ch)) ) +static inline char MakeLowerCase(char ch) { + if (ch >= 'a' && ch <= 'z') + return ch; + else if (ch >= 'A' && ch <= 'Z') + return static_cast(ch - 'A' + 'a'); + else + return Platform_MakeLowerChar(ch); +} +//yilatiV + +// Define a way for the Regular Expression code to access the document +class DocumentIndexer : public CharacterIndexer { + Document *pdoc; + int end; +public: + DocumentIndexer(Document *pdoc_, int end_) : + pdoc(pdoc_), end(end_) { + } + + virtual ~DocumentIndexer() { + } + + virtual char CharAt(int index) { + if (index < 0 || index >= end) + return 0; + else + return pdoc->CharAt(index); + } +}; + +/** + * Find text in document, supporting both forward and backward + * searches (just pass minPos > maxPos to do a backward search) + * Has not been tested with backwards DBCS searches yet. + */ +long Document::FindText(int minPos, int maxPos, const char *s, + bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, + int *length) { + if (regExp) { + if (!pre) + pre = new RESearch(&charClass); + if (!pre) + return -1; + + int increment = (minPos <= maxPos) ? 1 : -1; + + int startPos = minPos; + int endPos = maxPos; + + // Range endpoints should not be inside DBCS characters, but just in case, move them. + startPos = MovePositionOutsideChar(startPos, 1, false); + endPos = MovePositionOutsideChar(endPos, 1, false); + + const char *errmsg = pre->Compile(s, *length, caseSensitive, posix); + if (errmsg) { + return -1; + } + // Find a variable in a property file: \$(\([A-Za-z0-9_.]+\)) + // Replace first '.' with '-' in each property file variable reference: + // Search: \$(\([A-Za-z0-9_-]+\)\.\([A-Za-z0-9_.]+\)) + // Replace: $(\1-\2) + int lineRangeStart = LineFromPosition(startPos); + int lineRangeEnd = LineFromPosition(endPos); + if ((increment == 1) && + (startPos >= LineEnd(lineRangeStart)) && + (lineRangeStart < lineRangeEnd)) { + // the start position is at end of line or between line end characters. + lineRangeStart++; + startPos = LineStart(lineRangeStart); + } + int pos = -1; + int lenRet = 0; + char searchEnd = s[*length - 1]; + int lineRangeBreak = lineRangeEnd + increment; + for (int line = lineRangeStart; line != lineRangeBreak; line += increment) { + int startOfLine = LineStart(line); + int endOfLine = LineEnd(line); + if (increment == 1) { + if (line == lineRangeStart) { + if ((startPos != startOfLine) && (s[0] == '^')) + continue; // Can't match start of line if start position after start of line + startOfLine = startPos; + } + if (line == lineRangeEnd) { + if ((endPos != endOfLine) && (searchEnd == '$')) + continue; // Can't match end of line if end position before end of line + endOfLine = endPos; + } + } else { + if (line == lineRangeEnd) { + if ((endPos != startOfLine) && (s[0] == '^')) + continue; // Can't match start of line if end position after start of line + startOfLine = endPos; + } + if (line == lineRangeStart) { + if ((startPos != endOfLine) && (searchEnd == '$')) + continue; // Can't match end of line if start position before end of line + endOfLine = startPos; + } + } + + DocumentIndexer di(this, endOfLine); + int success = pre->Execute(di, startOfLine, endOfLine); + if (success) { + pos = pre->bopat[0]; + lenRet = pre->eopat[0] - pre->bopat[0]; + if (increment == -1) { + // Check for the last match on this line. + int repetitions = 1000; // Break out of infinite loop + while (success && (pre->eopat[0] <= endOfLine) && (repetitions--)) { + success = pre->Execute(di, pos+1, endOfLine); + if (success) { + if (pre->eopat[0] <= minPos) { + pos = pre->bopat[0]; + lenRet = pre->eopat[0] - pre->bopat[0]; + } else { + success = 0; + } + } + } + } + break; + } + } + *length = lenRet; + return pos; + + } else { + + bool forward = minPos <= maxPos; + int increment = forward ? 1 : -1; + + // Range endpoints should not be inside DBCS characters, but just in case, move them. + int startPos = MovePositionOutsideChar(minPos, increment, false); + int endPos = MovePositionOutsideChar(maxPos, increment, false); + + // Compute actual search ranges needed + int lengthFind = *length; + if (lengthFind == -1) + lengthFind = static_cast(strlen(s)); + int endSearch = endPos; + if (startPos <= endPos) { + endSearch = endPos - lengthFind + 1; + } + //Platform::DebugPrintf("Find %d %d %s %d\n", startPos, endPos, ft->lpstrText, lengthFind); + char firstChar = s[0]; + wchar_t* ws_upr = NULL; + int ws_len = 0; + char str[8]; + wchar_t wstr[4]; + if (!caseSensitive && !dbcsCodePage) + firstChar = static_cast(MakeUpperCase(firstChar)); + int pos = forward ? startPos : (startPos - 1); + if (dbcsCodePage) { + if (!caseSensitive && dbcsCodePage == SC_CP_UTF8) { + ws_len = (int) UCS2Length(s, lengthFind); + if (ws_len != lengthFind) { + int ws_size = (((ws_len + 1) >> 4) + 1) << 4; // 16-chars alignment + ws_upr = new wchar_t[ws_size]; + if (ws_upr != NULL) { + UCS2FromUTF8(s, lengthFind, ws_upr, ws_size); + ws_upr[ws_len] = 0; + Platform_MakeUpperW(ws_upr, ws_len); + // now ws_upr is UCS2 s in upper-case + } + } + } + if (!caseSensitive && ws_upr == NULL) { + // the text is Latin i.e. one character is one byte + // ws_upr is NULL + // BUT !!! ws_upr can be NULL if dbcsCodePage != SC_CP_UTF8 + // (also ws_upr = new wchar_t[ws_size] can be NULL) + + // for latin characters in non-UTF8 Unicode text + // (thanks to Airix Z) + if (isascii(firstChar)) + firstChar = static_cast(MakeUpperCase(firstChar)); + } + if (pos >= 0) + pos = MovePositionOutsideChar(pos, increment, false); + } + while (forward ? (pos < endSearch) : (pos >= endSearch)) { + char ch = CharAt(pos); + if (caseSensitive) { + if (ch == firstChar) { + bool found = true; + if (pos + lengthFind > Platform::Maximum(startPos, endPos)) found = false; + for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) { + ch = CharAt(pos + posMatch); + if (ch != s[posMatch]) + found = false; + } + if (found) { + if ((!word && !wordStart) || + word && IsWordAt(pos, pos + lengthFind) || + wordStart && IsWordStartAt(pos)) + return pos; + } + } + } else { + bool bMatch = false; + int charLen = 0; + + if (!dbcsCodePage) { + bMatch = (MakeUpperCase(ch) == firstChar); + } + else if (ws_upr == NULL) { + // for latin characters in non-UTF8 Unicode text + // (thanks to Airix Z) + + if (isascii(ch)) + bMatch = (MakeUpperCase(ch) == firstChar); + else + bMatch = (ch == firstChar); + } + else { + // LenChar returns 2 for "\r\n" + // this is wrong for UTF8 because "\r\n" + // is not one character with length=2 + charLen = IsCrLf(pos) ? 1 : LenChar(pos); + for (int i = 0; i < charLen; i++) { + str[i] = CharAt(pos+i); + } + str[charLen] = 0; + UCS2FromUTF8(str, charLen, wstr, 2); + wstr[1] = 0; + Platform_MakeUpperW(wstr, 1); + bMatch = (ws_upr[0] == wstr[0]); + + /* + if (bMatch) + MessageBoxA(NULL, "MatchCaseInsensitive is true!!!", "", 0); + // OK + */ + } + if (bMatch) { + bool found = true; + if (pos + lengthFind > Platform::Maximum(startPos, endPos)) found = false; + if (!dbcsCodePage || ws_upr == NULL) { + /* + MessageBoxA(NULL, "Text is Latin (ws_upr == NULL)", "First character matched", 0); + */ + for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) { + ch = CharAt(pos + posMatch); + char ch2 = s[posMatch]; + // for latin characters in non-UTF8 Unicode text + // (thanks to Airix Z) + if (!dbcsCodePage || (isascii(ch) && isascii(ch2))) { + if (MakeUpperCase(ch) != MakeUpperCase(ch2)) + found = false; + } else { + if (ch != ch2) + found = false; + } + } + } + else { + int i1, i2; + + /* + MessageBoxA(NULL, "first matched!!!", "", 0); + // OK + */ + i1 = 1; + i2 = pos + charLen; + while (found && i1 < ws_len) { + // LenChar returns 2 for "\r\n" + // this is wrong for UTF8 because "\r\n" + // is not one character with length=2 + charLen = IsCrLf(i2) ? 1 : LenChar(i2); + for (int i = 0; i < charLen; i++) { + str[i] = CharAt(i2+i); + } + str[charLen] = 0; + UCS2FromUTF8(str, charLen, wstr, 2); + wstr[1] = 0; + Platform_MakeUpperW(wstr, 1); + found = (ws_upr[i1] == wstr[0]); + i1++; + i2 += charLen; + } + } + if (found) { + if ((!word && !wordStart) || + word && IsWordAt(pos, pos + lengthFind) || + wordStart && IsWordStartAt(pos)) { + if (ws_upr != NULL) { + delete [] ws_upr; + ws_upr = NULL; + } + return pos; + } + } + } + } + pos += increment; + if (dbcsCodePage && (pos >= 0)) { + // Ensure trying to match from start of character + pos = MovePositionOutsideChar(pos, increment, false); + } + } + if (ws_upr != NULL) { + delete [] ws_upr; + ws_upr = NULL; + } + } + //Platform::DebugPrintf("Not found\n"); + return -1; +} + +const char *Document::SubstituteByPosition(const char *text, int *length) { + if (!pre) + return 0; + delete []substituted; + substituted = 0; + DocumentIndexer di(this, Length()); + if (!pre->GrabMatches(di)) + return 0; + unsigned int lenResult = 0; + for (int i = 0; i < *length; i++) { + if (text[i] == '\\') { + if (text[i + 1] >= '1' && text[i + 1] <= '9') { + unsigned int patNum = text[i + 1] - '0'; + lenResult += pre->eopat[patNum] - pre->bopat[patNum]; + i++; + } else { + switch (text[i + 1]) { + case 'a': + case 'b': + case 'f': + case 'n': + case 'r': + case 't': + case 'v': + i++; + } + lenResult++; + } + } else { + lenResult++; + } + } + substituted = new char[lenResult + 1]; + if (!substituted) + return 0; + char *o = substituted; + for (int j = 0; j < *length; j++) { + if (text[j] == '\\') { + if (text[j + 1] >= '1' && text[j + 1] <= '9') { + unsigned int patNum = text[j + 1] - '0'; + unsigned int len = pre->eopat[patNum] - pre->bopat[patNum]; + if (pre->pat[patNum]) // Will be null if try for a match that did not occur + memcpy(o, pre->pat[patNum], len); + o += len; + j++; + } else { + j++; + switch (text[j]) { + case 'a': + *o++ = '\a'; + break; + case 'b': + *o++ = '\b'; + break; + case 'f': + *o++ = '\f'; + break; + case 'n': + *o++ = '\n'; + break; + case 'r': + *o++ = '\r'; + break; + case 't': + *o++ = '\t'; + break; + case 'v': + *o++ = '\v'; + break; + default: + *o++ = '\\'; + j--; + } + } + } else { + *o++ = text[j]; + } + } + *o = '\0'; + *length = lenResult; + return substituted; +} + +int Document::LinesTotal() { + return cb.Lines(); +} + +void Document::ChangeCase(Range r, bool makeUpperCase) { + for (int pos = r.start; pos < r.end;) { + int len = LenChar(pos); + if (len == 1) { + char ch = CharAt(pos); + if (makeUpperCase) { + if (IsLowerCase(ch)) { + ChangeChar(pos, static_cast(MakeUpperCase(ch))); + } + } else { + if (IsUpperCase(ch)) { + ChangeChar(pos, static_cast(MakeLowerCase(ch))); + } + } + } + pos += len; + } +} + +void Document::SetDefaultCharClasses(bool includeWordClass) { + charClass.SetDefaultCharClasses(includeWordClass); +} + +void Document::SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass) { + charClass.SetCharClasses(chars, newCharClass); +} + +void Document::SetStylingBits(int bits) { + stylingBits = bits; + stylingBitsMask = 0; + for (int bit = 0; bit < stylingBits; bit++) { + stylingBitsMask <<= 1; + stylingBitsMask |= 1; + } +} + +void Document::StartStyling(int position, char mask) { + stylingMask = mask; + endStyled = position; +} + +bool Document::SetStyleFor(int length, char style) { + if (enteredStyling != 0) { + return false; + } else { + enteredStyling++; + style &= stylingMask; + int prevEndStyled = endStyled; + if (cb.SetStyleFor(endStyled, length, style, stylingMask)) { + DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, + prevEndStyled, length); + NotifyModified(mh); + } + endStyled += length; + enteredStyling--; + return true; + } +} + +bool Document::SetStyles(int length, char *styles) { + if (enteredStyling != 0) { + return false; + } else { + enteredStyling++; + bool didChange = false; + int startMod = 0; + int endMod = 0; + for (int iPos = 0; iPos < length; iPos++, endStyled++) { + PLATFORM_ASSERT(endStyled < Length()); + if (cb.SetStyleAt(endStyled, styles[iPos], stylingMask)) { + if (!didChange) { + startMod = endStyled; + } + didChange = true; + endMod = endStyled; + } + } + if (didChange) { + DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, + startMod, endMod - startMod + 1); + NotifyModified(mh); + } + enteredStyling--; + return true; + } +} + +void Document::EnsureStyledTo(int pos) { + if ((enteredStyling == 0) && (pos > GetEndStyled())) { + IncrementStyleClock(); + // Ask the watchers to style, and stop as soon as one responds. + for (int i = 0; pos > GetEndStyled() && i < lenWatchers; i++) { + watchers[i].watcher->NotifyStyleNeeded(this, watchers[i].userData, pos); + } + } +} + +void Document::IncrementStyleClock() { + styleClock++; + if (styleClock > 0x100000) { + styleClock = 0; + } +} + +bool Document::AddWatcher(DocWatcher *watcher, void *userData) { + for (int i = 0; i < lenWatchers; i++) { + if ((watchers[i].watcher == watcher) && + (watchers[i].userData == userData)) + return false; + } + WatcherWithUserData *pwNew = new WatcherWithUserData[lenWatchers + 1]; + if (!pwNew) + return false; + for (int j = 0; j < lenWatchers; j++) + pwNew[j] = watchers[j]; + pwNew[lenWatchers].watcher = watcher; + pwNew[lenWatchers].userData = userData; + delete []watchers; + watchers = pwNew; + lenWatchers++; + return true; +} + +bool Document::RemoveWatcher(DocWatcher *watcher, void *userData) { + for (int i = 0; i < lenWatchers; i++) { + if ((watchers[i].watcher == watcher) && + (watchers[i].userData == userData)) { + if (lenWatchers == 1) { + delete []watchers; + watchers = 0; + lenWatchers = 0; + } else { + WatcherWithUserData *pwNew = new WatcherWithUserData[lenWatchers]; + if (!pwNew) + return false; + for (int j = 0; j < lenWatchers - 1; j++) { + pwNew[j] = (j < i) ? watchers[j] : watchers[j + 1]; + } + delete []watchers; + watchers = pwNew; + lenWatchers--; + } + return true; + } + } + return false; +} + +void Document::NotifyModifyAttempt() { + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifyModifyAttempt(this, watchers[i].userData); + } +} + +void Document::NotifySavePoint(bool atSavePoint) { + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifySavePoint(this, watchers[i].userData, atSavePoint); + } +} + +void Document::NotifyModified(DocModification mh) { + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifyModified(this, mh, watchers[i].userData); + } +} + +bool Document::IsWordPartSeparator(char ch) { + return (WordCharClass(ch) == CharClassify::ccWord) && IsPunctuation(ch); +} + +int Document::WordPartLeft(int pos) { + if (pos > 0) { + --pos; + char startChar = cb.CharAt(pos); + if (IsWordPartSeparator(startChar)) { + while (pos > 0 && IsWordPartSeparator(cb.CharAt(pos))) { + --pos; + } + } + if (pos > 0) { + startChar = cb.CharAt(pos); + --pos; + if (IsLowerCase(startChar)) { + while (pos > 0 && IsLowerCase(cb.CharAt(pos))) + --pos; + if (!IsUpperCase(cb.CharAt(pos)) && !IsLowerCase(cb.CharAt(pos))) + ++pos; + } else if (IsUpperCase(startChar)) { + while (pos > 0 && IsUpperCase(cb.CharAt(pos))) + --pos; + if (!IsUpperCase(cb.CharAt(pos))) + ++pos; + } else if (IsADigit(startChar)) { + while (pos > 0 && IsADigit(cb.CharAt(pos))) + --pos; + if (!IsADigit(cb.CharAt(pos))) + ++pos; + } else if (IsPunctuation(startChar)) { + while (pos > 0 && IsPunctuation(cb.CharAt(pos))) + --pos; + if (!IsPunctuation(cb.CharAt(pos))) + ++pos; + } else if (isspacechar(startChar)) { + while (pos > 0 && isspacechar(cb.CharAt(pos))) + --pos; + if (!isspacechar(cb.CharAt(pos))) + ++pos; + } else if (!isascii(startChar)) { + while (pos > 0 && !isascii(cb.CharAt(pos))) + --pos; + if (isascii(cb.CharAt(pos))) + ++pos; + } else { + ++pos; + } + } + } + return pos; +} + +int Document::WordPartRight(int pos) { + char startChar = cb.CharAt(pos); + int length = Length(); + if (IsWordPartSeparator(startChar)) { + while (pos < length && IsWordPartSeparator(cb.CharAt(pos))) + ++pos; + startChar = cb.CharAt(pos); + } + if (!isascii(startChar)) { + while (pos < length && !isascii(cb.CharAt(pos))) + ++pos; + } else if (IsLowerCase(startChar)) { + while (pos < length && IsLowerCase(cb.CharAt(pos))) + ++pos; + } else if (IsUpperCase(startChar)) { + if (IsLowerCase(cb.CharAt(pos + 1))) { + ++pos; + while (pos < length && IsLowerCase(cb.CharAt(pos))) + ++pos; + } else { + while (pos < length && IsUpperCase(cb.CharAt(pos))) + ++pos; + } + if (IsLowerCase(cb.CharAt(pos)) && IsUpperCase(cb.CharAt(pos - 1))) + --pos; + } else if (IsADigit(startChar)) { + while (pos < length && IsADigit(cb.CharAt(pos))) + ++pos; + } else if (IsPunctuation(startChar)) { + while (pos < length && IsPunctuation(cb.CharAt(pos))) + ++pos; + } else if (isspacechar(startChar)) { + while (pos < length && isspacechar(cb.CharAt(pos))) + ++pos; + } else { + ++pos; + } + return pos; +} + +bool IsLineEndChar(char c) { + return (c == '\n' || c == '\r'); +} + +int Document::ExtendStyleRange(int pos, int delta, bool singleLine) { + int sStart = cb.StyleAt(pos); + if (delta < 0) { + while (pos > 0 && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) ) + pos--; + pos++; + } else { + while (pos < (Length()) && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) ) + pos++; + } + return pos; +} + +static char BraceOpposite(char ch) { + switch (ch) { + case '(': + return ')'; + case ')': + return '('; + case '[': + return ']'; + case ']': + return '['; + case '{': + return '}'; + case '}': + return '{'; + case '<': + return '>'; + case '>': + return '<'; + default: + return '\0'; + } +} + +// TODO: should be able to extend styled region to find matching brace +int Document::BraceMatch(int position, int /*maxReStyle*/) { + char chBrace = CharAt(position); + char chSeek = BraceOpposite(chBrace); + if (chSeek == '\0') + return - 1; + char styBrace = static_cast(StyleAt(position) & stylingBitsMask); + int direction = -1; + if (chBrace == '(' || chBrace == '[' || chBrace == '{' || chBrace == '<') + direction = 1; + int depth = 1; + position = position + direction; + while ((position >= 0) && (position < Length())) { + position = MovePositionOutsideChar(position, direction); + char chAtPos = CharAt(position); + char styAtPos = static_cast(StyleAt(position) & stylingBitsMask); + if ((position > GetEndStyled()) || (styAtPos == styBrace)) { + if (chAtPos == chBrace) + depth++; + if (chAtPos == chSeek) + depth--; + if (depth == 0) + return position; + } + position = position + direction; + } + return - 1; +} diff --git a/scintilla/src/Document.cxx.bak b/scintilla/src/Document.cxx.bak new file mode 100644 index 00000000..23552cab --- /dev/null +++ b/scintilla/src/Document.cxx.bak @@ -0,0 +1,1612 @@ +// Scintilla source code edit control +/** @file Document.cxx + ** Text document that handles notifications, DBCS, styling, words and end of line. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include "Platform.h" + +#include "Scintilla.h" +#include "SVector.h" +#include "SplitVector.h" +#include "Partitioning.h" +#include "CellBuffer.h" +#include "CharClassify.h" +#include "Document.h" +#include "RESearch.h" + +//Vitaliy +#include "UniConversion.h" + + +static inline void Platform_MakeUpperW(wchar_t* wstr, unsigned int) { + // TODO: Add platform-specific function here + + // Win32 example: + ::CharUpperW(wstr); +} + +static inline char Platform_MakeUpperChar(char ch) { + // TODO: Add platform-specific function here + + // Win32 example: + char str[2] = {ch, 0}; + ::CharUpperA(str); + ch = str[0]; + + // default: no conversion + return ch; +} + +static inline char Platform_MakeLowerChar(char ch) { + // TODO: Add platform-specific function here + + // Win32 example: + char str[2] = {ch, 0}; + ::CharLowerA(str); + ch = str[0]; + + // default: no conversion + return ch; +} +// yilatiV + +// This is ASCII specific but is safe with chars >= 0x80 +static inline bool isspacechar(unsigned char ch) { + return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); +} + +static inline bool IsPunctuation(char ch) { + return isascii(ch) && ispunct(ch); +} + +static inline bool IsADigit(char ch) { + return isascii(ch) && isdigit(ch); +} + +static inline bool IsLowerCase(char ch) { + return isascii(ch) && islower(ch); +} + +static inline bool IsUpperCase(char ch) { + return isascii(ch) && isupper(ch); +} + +Document::Document() { + refCount = 0; +#ifdef unix + eolMode = SC_EOL_LF; +#else + eolMode = SC_EOL_CRLF; +#endif + dbcsCodePage = 0; + stylingBits = 5; + stylingBitsMask = 0x1F; + stylingMask = 0; + endStyled = 0; + styleClock = 0; + enteredModification = 0; + enteredStyling = 0; + enteredReadOnlyCount = 0; + tabInChars = 8; + indentInChars = 0; + actualIndentInChars = 8; + useTabs = true; + tabIndents = true; + backspaceUnindents = false; + watchers = 0; + lenWatchers = 0; + + matchesValid = false; + pre = 0; + substituted = 0; +} + +Document::~Document() { + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifyDeleted(this, watchers[i].userData); + } + delete []watchers; + watchers = 0; + lenWatchers = 0; + delete pre; + pre = 0; + delete []substituted; + substituted = 0; +} + +// Increase reference count and return its previous value. +int Document::AddRef() { + return refCount++; +} + +// Decrease reference count and return its previous value. +// Delete the document if reference count reaches zero. +int Document::Release() { + int curRefCount = --refCount; + if (curRefCount == 0) + delete this; + return curRefCount; +} + +void Document::SetSavePoint() { + cb.SetSavePoint(); + NotifySavePoint(true); +} + +int Document::AddMark(int line, int markerNum) { + int prev = cb.AddMark(line, markerNum); + DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + mh.line = line; + NotifyModified(mh); + return prev; +} + +void Document::AddMarkSet(int line, int valueSet) { + unsigned int m = valueSet; + for (int i = 0; m; i++, m >>= 1) + if (m & 1) + cb.AddMark(line, i); + DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + mh.line = line; + NotifyModified(mh); +} + +void Document::DeleteMark(int line, int markerNum) { + cb.DeleteMark(line, markerNum); + DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + mh.line = line; + NotifyModified(mh); +} + +void Document::DeleteMarkFromHandle(int markerHandle) { + cb.DeleteMarkFromHandle(markerHandle); + DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); + mh.line = -1; + NotifyModified(mh); +} + +void Document::DeleteAllMarks(int markerNum) { + cb.DeleteAllMarks(markerNum); + DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); + mh.line = -1; + NotifyModified(mh); +} + +int Document::LineStart(int line) { + return cb.LineStart(line); +} + +int Document::LineEnd(int line) { + if (line == LinesTotal() - 1) { + return LineStart(line + 1); + } else { + int position = LineStart(line + 1) - 1; + // When line terminator is CR+LF, may need to go back one more + if ((position > LineStart(line)) && (cb.CharAt(position - 1) == '\r')) { + position--; + } + return position; + } +} + +int Document::LineFromPosition(int pos) { + return cb.LineFromPosition(pos); +} + +int Document::LineEndPosition(int position) { + return LineEnd(LineFromPosition(position)); +} + +int Document::VCHomePosition(int position) { + int line = LineFromPosition(position); + int startPosition = LineStart(line); + int endLine = LineStart(line + 1) - 1; + int startText = startPosition; + while (startText < endLine && (cb.CharAt(startText) == ' ' || cb.CharAt(startText) == '\t' ) ) + startText++; + if (position == startText) + return startPosition; + else + return startText; +} + +int Document::SetLevel(int line, int level) { + int prev = cb.SetLevel(line, level); + if (prev != level) { + DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER, + LineStart(line), 0, 0, 0); + mh.line = line; + mh.foldLevelNow = level; + mh.foldLevelPrev = prev; + NotifyModified(mh); + } + return prev; +} + +static bool IsSubordinate(int levelStart, int levelTry) { + if (levelTry & SC_FOLDLEVELWHITEFLAG) + return true; + else + return (levelStart & SC_FOLDLEVELNUMBERMASK) < (levelTry & SC_FOLDLEVELNUMBERMASK); +} + +int Document::GetLastChild(int lineParent, int level) { + if (level == -1) + level = GetLevel(lineParent) & SC_FOLDLEVELNUMBERMASK; + int maxLine = LinesTotal(); + int lineMaxSubord = lineParent; + while (lineMaxSubord < maxLine - 1) { + EnsureStyledTo(LineStart(lineMaxSubord + 2)); + if (!IsSubordinate(level, GetLevel(lineMaxSubord + 1))) + break; + lineMaxSubord++; + } + if (lineMaxSubord > lineParent) { + if (level > (GetLevel(lineMaxSubord + 1) & SC_FOLDLEVELNUMBERMASK)) { + // Have chewed up some whitespace that belongs to a parent so seek back + if (GetLevel(lineMaxSubord) & SC_FOLDLEVELWHITEFLAG) { + lineMaxSubord--; + } + } + } + return lineMaxSubord; +} + +int Document::GetFoldParent(int line) { + int level = GetLevel(line) & SC_FOLDLEVELNUMBERMASK; + int lineLook = line - 1; + while ((lineLook > 0) && ( + (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) || + ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) >= level)) + ) { + lineLook--; + } + if ((GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG) && + ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) < level)) { + return lineLook; + } else { + return -1; + } +} + +int Document::ClampPositionIntoDocument(int pos) { + return Platform::Clamp(pos, 0, Length()); +} + +bool Document::IsCrLf(int pos) { + if (pos < 0) + return false; + if (pos >= (Length() - 1)) + return false; + return (cb.CharAt(pos) == '\r') && (cb.CharAt(pos + 1) == '\n'); +} + +static const int maxBytesInDBCSCharacter=5; + +int Document::LenChar(int pos) { + if (pos < 0) { + return 1; + } else if (IsCrLf(pos)) { + return 2; + } else if (SC_CP_UTF8 == dbcsCodePage) { + unsigned char ch = static_cast(cb.CharAt(pos)); + if (ch < 0x80) + return 1; + int len = 2; + if (ch >= (0x80 + 0x40 + 0x20)) + len = 3; + int lengthDoc = Length(); + if ((pos + len) > lengthDoc) + return lengthDoc -pos; + else + return len; + } else if (dbcsCodePage) { + char mbstr[maxBytesInDBCSCharacter+1]; + int i; + for (i=0; i= Length()) + return Length(); + + // PLATFORM_ASSERT(pos > 0 && pos < Length()); + if (checkLineEnd && IsCrLf(pos - 1)) { + if (moveDir > 0) + return pos + 1; + else + return pos - 1; + } + + // Not between CR and LF + + if (dbcsCodePage) { + if (SC_CP_UTF8 == dbcsCodePage) { + unsigned char ch = static_cast(cb.CharAt(pos)); + while ((pos > 0) && (pos < Length()) && (ch >= 0x80) && (ch < (0x80 + 0x40))) { + // ch is a trail byte + if (moveDir > 0) + pos++; + else + pos--; + ch = static_cast(cb.CharAt(pos)); + } + } else { + // Anchor DBCS calculations at start of line because start of line can + // not be a DBCS trail byte. + int posCheck = LineStart(LineFromPosition(pos)); + while (posCheck < pos) { + char mbstr[maxBytesInDBCSCharacter+1]; + int i; + for(i=0;i pos) { + if (moveDir > 0) { + return posCheck + mbsize; + } else { + return posCheck; + } + } + posCheck += mbsize; + } + } + } + + return pos; +} + +void Document::ModifiedAt(int pos) { + if (endStyled > pos) + endStyled = pos; +} + +void Document::CheckReadOnly() { + if (cb.IsReadOnly() && enteredReadOnlyCount == 0) { + enteredReadOnlyCount++; + NotifyModifyAttempt(); + enteredReadOnlyCount--; + } +} + +// Document only modified by gateways DeleteChars, InsertString, Undo, Redo, and SetStyleAt. +// SetStyleAt does not change the persistent state of a document + +bool Document::DeleteChars(int pos, int len) { + if (len == 0) + return false; + if ((pos + len) > Length()) + return false; + CheckReadOnly(); + if (enteredModification != 0) { + return false; + } else { + enteredModification++; + if (!cb.IsReadOnly()) { + NotifyModified( + DocModification( + SC_MOD_BEFOREDELETE | SC_PERFORMED_USER, + pos, len, + 0, 0)); + int prevLinesTotal = LinesTotal(); + bool startSavePoint = cb.IsSavePoint(); + bool startSequence = false; + const char *text = cb.DeleteChars(pos, len, startSequence); + if (startSavePoint && cb.IsCollectingUndo()) + NotifySavePoint(!startSavePoint); + if ((pos < Length()) || (pos == 0)) + ModifiedAt(pos); + else + ModifiedAt(pos-1); + NotifyModified( + DocModification( + SC_MOD_DELETETEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0), + pos, len, + LinesTotal() - prevLinesTotal, text)); + } + enteredModification--; + } + return !cb.IsReadOnly(); +} + +/** + * Insert a string with a length. + */ +bool Document::InsertString(int position, const char *s, int insertLength) { + if (insertLength <= 0) { + return false; + } + CheckReadOnly(); + if (enteredModification != 0) { + return false; + } else { + enteredModification++; + if (!cb.IsReadOnly()) { + NotifyModified( + DocModification( + SC_MOD_BEFOREINSERT | SC_PERFORMED_USER, + position, insertLength, + 0, s)); + int prevLinesTotal = LinesTotal(); + bool startSavePoint = cb.IsSavePoint(); + bool startSequence = false; + const char *text = cb.InsertString(position, s, insertLength, startSequence); + if (startSavePoint && cb.IsCollectingUndo()) + NotifySavePoint(!startSavePoint); + ModifiedAt(position); + NotifyModified( + DocModification( + SC_MOD_INSERTTEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0), + position, insertLength, + LinesTotal() - prevLinesTotal, text)); + } + enteredModification--; + } + return !cb.IsReadOnly(); +} + +int Document::Undo() { + int newPos = -1; + CheckReadOnly(); + if (enteredModification == 0) { + enteredModification++; + if (!cb.IsReadOnly()) { + bool startSavePoint = cb.IsSavePoint(); + bool multiLine = false; + int steps = cb.StartUndo(); + //Platform::DebugPrintf("Steps=%d\n", steps); + for (int step = 0; step < steps; step++) { + const int prevLinesTotal = LinesTotal(); + const Action &action = cb.GetUndoStep(); + if (action.at == removeAction) { + NotifyModified(DocModification( + SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action)); + } else { + NotifyModified(DocModification( + SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action)); + } + cb.PerformUndoStep(); + int cellPosition = action.position; + ModifiedAt(cellPosition); + newPos = cellPosition; + + int modFlags = SC_PERFORMED_UNDO; + // With undo, an insertion action becomes a deletion notification + if (action.at == removeAction) { + newPos += action.lenData; + modFlags |= SC_MOD_INSERTTEXT; + } else { + modFlags |= SC_MOD_DELETETEXT; + } + if (steps > 1) + modFlags |= SC_MULTISTEPUNDOREDO; + const int linesAdded = LinesTotal() - prevLinesTotal; + if (linesAdded != 0) + multiLine = true; + if (step == steps - 1) { + modFlags |= SC_LASTSTEPINUNDOREDO; + if (multiLine) + modFlags |= SC_MULTILINEUNDOREDO; + } + NotifyModified(DocModification(modFlags, cellPosition, action.lenData, + linesAdded, action.data)); + } + + bool endSavePoint = cb.IsSavePoint(); + if (startSavePoint != endSavePoint) + NotifySavePoint(endSavePoint); + } + enteredModification--; + } + return newPos; +} + +int Document::Redo() { + int newPos = -1; + CheckReadOnly(); + if (enteredModification == 0) { + enteredModification++; + if (!cb.IsReadOnly()) { + bool startSavePoint = cb.IsSavePoint(); + bool multiLine = false; + int steps = cb.StartRedo(); + for (int step = 0; step < steps; step++) { + const int prevLinesTotal = LinesTotal(); + const Action &action = cb.GetRedoStep(); + if (action.at == insertAction) { + NotifyModified(DocModification( + SC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action)); + } else { + NotifyModified(DocModification( + SC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action)); + } + cb.PerformRedoStep(); + ModifiedAt(action.position); + newPos = action.position; + + int modFlags = SC_PERFORMED_REDO; + if (action.at == insertAction) { + newPos += action.lenData; + modFlags |= SC_MOD_INSERTTEXT; + } else { + modFlags |= SC_MOD_DELETETEXT; + } + if (steps > 1) + modFlags |= SC_MULTISTEPUNDOREDO; + const int linesAdded = LinesTotal() - prevLinesTotal; + if (linesAdded != 0) + multiLine = true; + if (step == steps - 1) { + modFlags |= SC_LASTSTEPINUNDOREDO; + if (multiLine) + modFlags |= SC_MULTILINEUNDOREDO; + } + NotifyModified( + DocModification(modFlags, action.position, action.lenData, + linesAdded, action.data)); + } + + bool endSavePoint = cb.IsSavePoint(); + if (startSavePoint != endSavePoint) + NotifySavePoint(endSavePoint); + } + enteredModification--; + } + return newPos; +} + +/** + * Insert a single character. + */ +bool Document::InsertChar(int pos, char ch) { + char chs[1]; + chs[0] = ch; + return InsertString(pos, chs, 1); +} + +/** + * Insert a null terminated string. + */ +bool Document::InsertCString(int position, const char *s) { + return InsertString(position, s, strlen(s)); +} + +void Document::ChangeChar(int pos, char ch) { + DeleteChars(pos, 1); + InsertChar(pos, ch); +} + +void Document::DelChar(int pos) { + DeleteChars(pos, LenChar(pos)); +} + +void Document::DelCharBack(int pos) { + if (pos <= 0) { + return; + } else if (IsCrLf(pos - 2)) { + DeleteChars(pos - 2, 2); + } else if (dbcsCodePage) { + int startChar = MovePositionOutsideChar(pos - 1, -1, false); + DeleteChars(startChar, pos - startChar); + } else { + DeleteChars(pos - 1, 1); + } +} + +static bool isindentchar(char ch) { + return (ch == ' ') || (ch == '\t'); +} + +static int NextTab(int pos, int tabSize) { + return ((pos / tabSize) + 1) * tabSize; +} + +static void CreateIndentation(char *linebuf, int length, int indent, int tabSize, bool insertSpaces) { + length--; // ensure space for \0 + if (!insertSpaces) { + while ((indent >= tabSize) && (length > 0)) { + *linebuf++ = '\t'; + indent -= tabSize; + length--; + } + } + while ((indent > 0) && (length > 0)) { + *linebuf++ = ' '; + indent--; + length--; + } + *linebuf = '\0'; +} + +int Document::GetLineIndentation(int line) { + int indent = 0; + if ((line >= 0) && (line < LinesTotal())) { + int lineStart = LineStart(line); + int length = Length(); + for (int i = lineStart;i < length;i++) { + char ch = cb.CharAt(i); + if (ch == ' ') + indent++; + else if (ch == '\t') + indent = NextTab(indent, tabInChars); + else + return indent; + } + } + return indent; +} + +void Document::SetLineIndentation(int line, int indent) { + int indentOfLine = GetLineIndentation(line); + if (indent < 0) + indent = 0; + if (indent != indentOfLine) { + char linebuf[1000]; + CreateIndentation(linebuf, sizeof(linebuf), indent, tabInChars, !useTabs); + int thisLineStart = LineStart(line); + int indentPos = GetLineIndentPosition(line); + BeginUndoAction(); + DeleteChars(thisLineStart, indentPos - thisLineStart); + InsertCString(thisLineStart, linebuf); + EndUndoAction(); + } +} + +int Document::GetLineIndentPosition(int line) { + if (line < 0) + return 0; + int pos = LineStart(line); + int length = Length(); + while ((pos < length) && isindentchar(cb.CharAt(pos))) { + pos++; + } + return pos; +} + +int Document::GetColumn(int pos) { + int column = 0; + int line = LineFromPosition(pos); + if ((line >= 0) && (line < LinesTotal())) { + for (int i = LineStart(line);i < pos;) { + char ch = cb.CharAt(i); + if (ch == '\t') { + column = NextTab(column, tabInChars); + i++; + } else if (ch == '\r') { + return column; + } else if (ch == '\n') { + return column; + } else if (i >= Length()) { + return column; + } else { + column++; + i = MovePositionOutsideChar(i + 1, 1, false); + } + } + } + return column; +} + +int Document::FindColumn(int line, int column) { + int position = LineStart(line); + int columnCurrent = 0; + if ((line >= 0) && (line < LinesTotal())) { + while ((columnCurrent < column) && (position < Length())) { + char ch = cb.CharAt(position); + if (ch == '\t') { + columnCurrent = NextTab(columnCurrent, tabInChars); + position++; + } else if (ch == '\r') { + return position; + } else if (ch == '\n') { + return position; + } else { + columnCurrent++; + position = MovePositionOutsideChar(position + 1, 1, false); + } + } + } + return position; +} + +void Document::Indent(bool forwards, int lineBottom, int lineTop) { + // Dedent - suck white space off the front of the line to dedent by equivalent of a tab + for (int line = lineBottom; line >= lineTop; line--) { + int indentOfLine = GetLineIndentation(line); + if (forwards) { + if (LineStart(line) < LineEnd(line)) { + SetLineIndentation(line, indentOfLine + IndentSize()); + } + } else { + SetLineIndentation(line, indentOfLine - IndentSize()); + } + } +} + +// Convert line endings for a piece of text to a particular mode. +// Stop at len or when a NUL is found. +// Caller must delete the returned pointer. +char *Document::TransformLineEnds(int *pLenOut, const char *s, size_t len, int eolMode) { + char *dest = new char[2 * len + 1]; + const char *sptr = s; + char *dptr = dest; + for (size_t i = 0; (i < len) && (*sptr != '\0'); i++) { + if (*sptr == '\n' || *sptr == '\r') { + if (eolMode == SC_EOL_CR) { + *dptr++ = '\r'; + } else if (eolMode == SC_EOL_LF) { + *dptr++ = '\n'; + } else { // eolMode == SC_EOL_CRLF + *dptr++ = '\r'; + *dptr++ = '\n'; + } + if ((*sptr == '\r') && (i+1 < len) && (*(sptr+1) == '\n')) { + i++; + sptr++; + } + sptr++; + } else { + *dptr++ = *sptr++; + } + } + *dptr++ = '\0'; + *pLenOut = (dptr - dest) - 1; + return dest; +} + +void Document::ConvertLineEnds(int eolModeSet) { + BeginUndoAction(); + + for (int pos = 0; pos < Length(); pos++) { + if (cb.CharAt(pos) == '\r') { + if (cb.CharAt(pos + 1) == '\n') { + // CRLF + if (eolModeSet == SC_EOL_CR) { + DeleteChars(pos + 1, 1); // Delete the LF + } else if (eolModeSet == SC_EOL_LF) { + DeleteChars(pos, 1); // Delete the CR + } else { + pos++; + } + } else { + // CR + if (eolModeSet == SC_EOL_CRLF) { + InsertString(pos + 1, "\n", 1); // Insert LF + pos++; + } else if (eolModeSet == SC_EOL_LF) { + InsertString(pos, "\n", 1); // Insert LF + DeleteChars(pos + 1, 1); // Delete CR + } + } + } else if (cb.CharAt(pos) == '\n') { + // LF + if (eolModeSet == SC_EOL_CRLF) { + InsertString(pos, "\r", 1); // Insert CR + pos++; + } else if (eolModeSet == SC_EOL_CR) { + InsertString(pos, "\r", 1); // Insert CR + DeleteChars(pos + 1, 1); // Delete LF + } + } + } + + EndUndoAction(); +} + +bool Document::IsWhiteLine(int line) { + int currentChar = LineStart(line); + int endLine = LineEnd(line); + while (currentChar < endLine) { + if (cb.CharAt(currentChar) != ' ' && cb.CharAt(currentChar) != '\t') { + return false; + } + ++currentChar; + } + return true; +} + +int Document::ParaUp(int pos) { + int line = LineFromPosition(pos); + line--; + while (line >= 0 && IsWhiteLine(line)) { // skip empty lines + line--; + } + while (line >= 0 && !IsWhiteLine(line)) { // skip non-empty lines + line--; + } + line++; + return LineStart(line); +} + +int Document::ParaDown(int pos) { + int line = LineFromPosition(pos); + while (line < LinesTotal() && !IsWhiteLine(line)) { // skip non-empty lines + line++; + } + while (line < LinesTotal() && IsWhiteLine(line)) { // skip empty lines + line++; + } + if (line < LinesTotal()) + return LineStart(line); + else // end of a document + return LineEnd(line-1); +} + +CharClassify::cc Document::WordCharClass(unsigned char ch) { + if ((SC_CP_UTF8 == dbcsCodePage) && (ch >= 0x80)) + return CharClassify::ccWord; + return charClass.GetClass(ch); +} + +/** + * Used by commmands that want to select whole words. + * Finds the start of word at pos when delta < 0 or the end of the word when delta >= 0. + */ +int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) { + CharClassify::cc ccStart = CharClassify::ccWord; + if (delta < 0) { + if (!onlyWordCharacters) + ccStart = WordCharClass(cb.CharAt(pos-1)); + while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) + pos--; + } else { + if (!onlyWordCharacters && pos < Length()) + ccStart = WordCharClass(cb.CharAt(pos)); + while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart)) + pos++; + } + return MovePositionOutsideChar(pos, delta); +} + +/** + * Find the start of the next word in either a forward (delta >= 0) or backwards direction + * (delta < 0). + * This is looking for a transition between character classes although there is also some + * additional movement to transit white space. + * Used by cursor movement by word commands. + */ +int Document::NextWordStart(int pos, int delta) { + if (delta < 0) { + while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace)) + pos--; + if (pos > 0) { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1)); + while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) { + pos--; + } + } + } else { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos)); + while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart)) + pos++; + while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace)) + pos++; + } + return pos; +} + +/** + * Find the end of the next word in either a forward (delta >= 0) or backwards direction + * (delta < 0). + * This is looking for a transition between character classes although there is also some + * additional movement to transit white space. + * Used by cursor movement by word commands. + */ +int Document::NextWordEnd(int pos, int delta) { + if (delta < 0) { + if (pos > 0) { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1)); + if (ccStart != CharClassify::ccSpace) { + while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccStart) { + pos--; + } + } + while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace) { + pos--; + } + } + } else { + while (pos < Length() && WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace) { + pos++; + } + if (pos < Length()) { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos)); + while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccStart) { + pos++; + } + } + } + return pos; +} + +/** + * Check that the character at the given position is a word or punctuation character and that + * the previous character is of a different character class. + */ +bool Document::IsWordStartAt(int pos) { + if (pos > 0) { + CharClassify::cc ccPos = WordCharClass(CharAt(pos)); + return (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) && + (ccPos != WordCharClass(CharAt(pos - 1))); + } + return true; +} + +/** + * Check that the character at the given position is a word or punctuation character and that + * the next character is of a different character class. + */ +bool Document::IsWordEndAt(int pos) { + if (pos < Length()) { + CharClassify::cc ccPrev = WordCharClass(CharAt(pos-1)); + return (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) && + (ccPrev != WordCharClass(CharAt(pos))); + } + return true; +} + +/** + * Check that the given range is has transitions between character classes at both + * ends and where the characters on the inside are word or punctuation characters. + */ +bool Document::IsWordAt(int start, int end) { + return IsWordStartAt(start) && IsWordEndAt(end); +} + +// The comparison and case changing functions here assume ASCII +// or extended ASCII such as the normal Windows code page. + +//Vitaliy +// NOTE: this function is called for non-Unicode characters only! +// ( i.e. when (!dbcsCodePage || isascii(ch)) ) +static inline char MakeUpperCase(char ch) { + if (ch >= 'A' && ch <= 'Z') + return ch; + else if (ch >= 'a' && ch <= 'z') + return static_cast(ch - 'a' + 'A'); + else + return Platform_MakeUpperChar(ch); +} + + + +// NOTE: this function is called for non-Unicode characters only! +// ( i.e. when (!dbcsCodePage || isascii(ch)) ) +static inline char MakeLowerCase(char ch) { + if (ch >= 'a' && ch <= 'z') + return ch; + else if (ch >= 'A' && ch <= 'Z') + return static_cast(ch - 'A' + 'a'); + else + return Platform_MakeLowerChar(ch); +} +//yilatiV + +// Define a way for the Regular Expression code to access the document +class DocumentIndexer : public CharacterIndexer { + Document *pdoc; + int end; +public: + DocumentIndexer(Document *pdoc_, int end_) : + pdoc(pdoc_), end(end_) { + } + + virtual ~DocumentIndexer() { + } + + virtual char CharAt(int index) { + if (index < 0 || index >= end) + return 0; + else + return pdoc->CharAt(index); + } +}; + +/** + * Find text in document, supporting both forward and backward + * searches (just pass minPos > maxPos to do a backward search) + * Has not been tested with backwards DBCS searches yet. + */ +long Document::FindText(int minPos, int maxPos, const char *s, + bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, + int *length) { + if (regExp) { + if (!pre) + pre = new RESearch(&charClass); + if (!pre) + return -1; + + int increment = (minPos <= maxPos) ? 1 : -1; + + int startPos = minPos; + int endPos = maxPos; + + // Range endpoints should not be inside DBCS characters, but just in case, move them. + startPos = MovePositionOutsideChar(startPos, 1, false); + endPos = MovePositionOutsideChar(endPos, 1, false); + + const char *errmsg = pre->Compile(s, *length, caseSensitive, posix); + if (errmsg) { + return -1; + } + // Find a variable in a property file: \$(\([A-Za-z0-9_.]+\)) + // Replace first '.' with '-' in each property file variable reference: + // Search: \$(\([A-Za-z0-9_-]+\)\.\([A-Za-z0-9_.]+\)) + // Replace: $(\1-\2) + int lineRangeStart = LineFromPosition(startPos); + int lineRangeEnd = LineFromPosition(endPos); + if ((increment == 1) && + (startPos >= LineEnd(lineRangeStart)) && + (lineRangeStart < lineRangeEnd)) { + // the start position is at end of line or between line end characters. + lineRangeStart++; + startPos = LineStart(lineRangeStart); + } + int pos = -1; + int lenRet = 0; + char searchEnd = s[*length - 1]; + int lineRangeBreak = lineRangeEnd + increment; + for (int line = lineRangeStart; line != lineRangeBreak; line += increment) { + int startOfLine = LineStart(line); + int endOfLine = LineEnd(line); + if (increment == 1) { + if (line == lineRangeStart) { + if ((startPos != startOfLine) && (s[0] == '^')) + continue; // Can't match start of line if start position after start of line + startOfLine = startPos; + } + if (line == lineRangeEnd) { + if ((endPos != endOfLine) && (searchEnd == '$')) + continue; // Can't match end of line if end position before end of line + endOfLine = endPos; + } + } else { + if (line == lineRangeEnd) { + if ((endPos != startOfLine) && (s[0] == '^')) + continue; // Can't match start of line if end position after start of line + startOfLine = endPos; + } + if (line == lineRangeStart) { + if ((startPos != endOfLine) && (searchEnd == '$')) + continue; // Can't match end of line if start position before end of line + endOfLine = startPos; + } + } + + DocumentIndexer di(this, endOfLine); + int success = pre->Execute(di, startOfLine, endOfLine); + if (success) { + pos = pre->bopat[0]; + lenRet = pre->eopat[0] - pre->bopat[0]; + if (increment == -1) { + // Check for the last match on this line. + int repetitions = 1000; // Break out of infinite loop + while (success && (pre->eopat[0] <= endOfLine) && (repetitions--)) { + success = pre->Execute(di, pos+1, endOfLine); + if (success) { + if (pre->eopat[0] <= minPos) { + pos = pre->bopat[0]; + lenRet = pre->eopat[0] - pre->bopat[0]; + } else { + success = 0; + } + } + } + } + break; + } + } + *length = lenRet; + return pos; + + } else { + + bool forward = minPos <= maxPos; + int increment = forward ? 1 : -1; + + // Range endpoints should not be inside DBCS characters, but just in case, move them. + int startPos = MovePositionOutsideChar(minPos, increment, false); + int endPos = MovePositionOutsideChar(maxPos, increment, false); + + // Compute actual search ranges needed + int lengthFind = *length; + if (lengthFind == -1) + lengthFind = static_cast(strlen(s)); + int endSearch = endPos; + if (startPos <= endPos) { + endSearch = endPos - lengthFind + 1; + } + //Platform::DebugPrintf("Find %d %d %s %d\n", startPos, endPos, ft->lpstrText, lengthFind); + char firstChar = s[0]; + if (!caseSensitive) + firstChar = static_cast(MakeUpperCase(firstChar)); + int pos = forward ? startPos : (startPos - 1); + while (forward ? (pos < endSearch) : (pos >= endSearch)) { + char ch = CharAt(pos); + if (caseSensitive) { + if (ch == firstChar) { + bool found = true; + if (pos + lengthFind > Platform::Maximum(startPos, endPos)) found = false; + for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) { + ch = CharAt(pos + posMatch); + if (ch != s[posMatch]) + found = false; + } + if (found) { + if ((!word && !wordStart) || + word && IsWordAt(pos, pos + lengthFind) || + wordStart && IsWordStartAt(pos)) + return pos; + } + } + } else { + if (MakeUpperCase(ch) == firstChar) { + bool found = true; + if (pos + lengthFind > Platform::Maximum(startPos, endPos)) found = false; + for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) { + ch = CharAt(pos + posMatch); + if (MakeUpperCase(ch) != MakeUpperCase(s[posMatch])) + found = false; + } + if (found) { + if ((!word && !wordStart) || + word && IsWordAt(pos, pos + lengthFind) || + wordStart && IsWordStartAt(pos)) + return pos; + } + } + } + pos += increment; + if (dbcsCodePage && (pos >= 0)) { + // Ensure trying to match from start of character + pos = MovePositionOutsideChar(pos, increment, false); + } + } + } + //Platform::DebugPrintf("Not found\n"); + return -1; +} + +const char *Document::SubstituteByPosition(const char *text, int *length) { + if (!pre) + return 0; + delete []substituted; + substituted = 0; + DocumentIndexer di(this, Length()); + if (!pre->GrabMatches(di)) + return 0; + unsigned int lenResult = 0; + for (int i = 0; i < *length; i++) { + if (text[i] == '\\') { + if (text[i + 1] >= '1' && text[i + 1] <= '9') { + unsigned int patNum = text[i + 1] - '0'; + lenResult += pre->eopat[patNum] - pre->bopat[patNum]; + i++; + } else { + switch (text[i + 1]) { + case 'a': + case 'b': + case 'f': + case 'n': + case 'r': + case 't': + case 'v': + i++; + } + lenResult++; + } + } else { + lenResult++; + } + } + substituted = new char[lenResult + 1]; + if (!substituted) + return 0; + char *o = substituted; + for (int j = 0; j < *length; j++) { + if (text[j] == '\\') { + if (text[j + 1] >= '1' && text[j + 1] <= '9') { + unsigned int patNum = text[j + 1] - '0'; + unsigned int len = pre->eopat[patNum] - pre->bopat[patNum]; + if (pre->pat[patNum]) // Will be null if try for a match that did not occur + memcpy(o, pre->pat[patNum], len); + o += len; + j++; + } else { + j++; + switch (text[j]) { + case 'a': + *o++ = '\a'; + break; + case 'b': + *o++ = '\b'; + break; + case 'f': + *o++ = '\f'; + break; + case 'n': + *o++ = '\n'; + break; + case 'r': + *o++ = '\r'; + break; + case 't': + *o++ = '\t'; + break; + case 'v': + *o++ = '\v'; + break; + default: + *o++ = '\\'; + j--; + } + } + } else { + *o++ = text[j]; + } + } + *o = '\0'; + *length = lenResult; + return substituted; +} + +int Document::LinesTotal() { + return cb.Lines(); +} + +void Document::ChangeCase(Range r, bool makeUpperCase) { + for (int pos = r.start; pos < r.end;) { + int len = LenChar(pos); + if (len == 1) { + char ch = CharAt(pos); + if (makeUpperCase) { + if (IsLowerCase(ch)) { + ChangeChar(pos, static_cast(MakeUpperCase(ch))); + } + } else { + if (IsUpperCase(ch)) { + ChangeChar(pos, static_cast(MakeLowerCase(ch))); + } + } + } + pos += len; + } +} + +void Document::SetDefaultCharClasses(bool includeWordClass) { + charClass.SetDefaultCharClasses(includeWordClass); +} + +void Document::SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass) { + charClass.SetCharClasses(chars, newCharClass); +} + +void Document::SetStylingBits(int bits) { + stylingBits = bits; + stylingBitsMask = 0; + for (int bit = 0; bit < stylingBits; bit++) { + stylingBitsMask <<= 1; + stylingBitsMask |= 1; + } +} + +void Document::StartStyling(int position, char mask) { + stylingMask = mask; + endStyled = position; +} + +bool Document::SetStyleFor(int length, char style) { + if (enteredStyling != 0) { + return false; + } else { + enteredStyling++; + style &= stylingMask; + int prevEndStyled = endStyled; + if (cb.SetStyleFor(endStyled, length, style, stylingMask)) { + DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, + prevEndStyled, length); + NotifyModified(mh); + } + endStyled += length; + enteredStyling--; + return true; + } +} + +bool Document::SetStyles(int length, char *styles) { + if (enteredStyling != 0) { + return false; + } else { + enteredStyling++; + bool didChange = false; + int startMod = 0; + int endMod = 0; + for (int iPos = 0; iPos < length; iPos++, endStyled++) { + PLATFORM_ASSERT(endStyled < Length()); + if (cb.SetStyleAt(endStyled, styles[iPos], stylingMask)) { + if (!didChange) { + startMod = endStyled; + } + didChange = true; + endMod = endStyled; + } + } + if (didChange) { + DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, + startMod, endMod - startMod + 1); + NotifyModified(mh); + } + enteredStyling--; + return true; + } +} + +void Document::EnsureStyledTo(int pos) { + if ((enteredStyling == 0) && (pos > GetEndStyled())) { + IncrementStyleClock(); + // Ask the watchers to style, and stop as soon as one responds. + for (int i = 0; pos > GetEndStyled() && i < lenWatchers; i++) { + watchers[i].watcher->NotifyStyleNeeded(this, watchers[i].userData, pos); + } + } +} + +void Document::IncrementStyleClock() { + styleClock++; + if (styleClock > 0x100000) { + styleClock = 0; + } +} + +bool Document::AddWatcher(DocWatcher *watcher, void *userData) { + for (int i = 0; i < lenWatchers; i++) { + if ((watchers[i].watcher == watcher) && + (watchers[i].userData == userData)) + return false; + } + WatcherWithUserData *pwNew = new WatcherWithUserData[lenWatchers + 1]; + if (!pwNew) + return false; + for (int j = 0; j < lenWatchers; j++) + pwNew[j] = watchers[j]; + pwNew[lenWatchers].watcher = watcher; + pwNew[lenWatchers].userData = userData; + delete []watchers; + watchers = pwNew; + lenWatchers++; + return true; +} + +bool Document::RemoveWatcher(DocWatcher *watcher, void *userData) { + for (int i = 0; i < lenWatchers; i++) { + if ((watchers[i].watcher == watcher) && + (watchers[i].userData == userData)) { + if (lenWatchers == 1) { + delete []watchers; + watchers = 0; + lenWatchers = 0; + } else { + WatcherWithUserData *pwNew = new WatcherWithUserData[lenWatchers]; + if (!pwNew) + return false; + for (int j = 0; j < lenWatchers - 1; j++) { + pwNew[j] = (j < i) ? watchers[j] : watchers[j + 1]; + } + delete []watchers; + watchers = pwNew; + lenWatchers--; + } + return true; + } + } + return false; +} + +void Document::NotifyModifyAttempt() { + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifyModifyAttempt(this, watchers[i].userData); + } +} + +void Document::NotifySavePoint(bool atSavePoint) { + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifySavePoint(this, watchers[i].userData, atSavePoint); + } +} + +void Document::NotifyModified(DocModification mh) { + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifyModified(this, mh, watchers[i].userData); + } +} + +bool Document::IsWordPartSeparator(char ch) { + return (WordCharClass(ch) == CharClassify::ccWord) && IsPunctuation(ch); +} + +int Document::WordPartLeft(int pos) { + if (pos > 0) { + --pos; + char startChar = cb.CharAt(pos); + if (IsWordPartSeparator(startChar)) { + while (pos > 0 && IsWordPartSeparator(cb.CharAt(pos))) { + --pos; + } + } + if (pos > 0) { + startChar = cb.CharAt(pos); + --pos; + if (IsLowerCase(startChar)) { + while (pos > 0 && IsLowerCase(cb.CharAt(pos))) + --pos; + if (!IsUpperCase(cb.CharAt(pos)) && !IsLowerCase(cb.CharAt(pos))) + ++pos; + } else if (IsUpperCase(startChar)) { + while (pos > 0 && IsUpperCase(cb.CharAt(pos))) + --pos; + if (!IsUpperCase(cb.CharAt(pos))) + ++pos; + } else if (IsADigit(startChar)) { + while (pos > 0 && IsADigit(cb.CharAt(pos))) + --pos; + if (!IsADigit(cb.CharAt(pos))) + ++pos; + } else if (IsPunctuation(startChar)) { + while (pos > 0 && IsPunctuation(cb.CharAt(pos))) + --pos; + if (!IsPunctuation(cb.CharAt(pos))) + ++pos; + } else if (isspacechar(startChar)) { + while (pos > 0 && isspacechar(cb.CharAt(pos))) + --pos; + if (!isspacechar(cb.CharAt(pos))) + ++pos; + } else if (!isascii(startChar)) { + while (pos > 0 && !isascii(cb.CharAt(pos))) + --pos; + if (isascii(cb.CharAt(pos))) + ++pos; + } else { + ++pos; + } + } + } + return pos; +} + +int Document::WordPartRight(int pos) { + char startChar = cb.CharAt(pos); + int length = Length(); + if (IsWordPartSeparator(startChar)) { + while (pos < length && IsWordPartSeparator(cb.CharAt(pos))) + ++pos; + startChar = cb.CharAt(pos); + } + if (!isascii(startChar)) { + while (pos < length && !isascii(cb.CharAt(pos))) + ++pos; + } else if (IsLowerCase(startChar)) { + while (pos < length && IsLowerCase(cb.CharAt(pos))) + ++pos; + } else if (IsUpperCase(startChar)) { + if (IsLowerCase(cb.CharAt(pos + 1))) { + ++pos; + while (pos < length && IsLowerCase(cb.CharAt(pos))) + ++pos; + } else { + while (pos < length && IsUpperCase(cb.CharAt(pos))) + ++pos; + } + if (IsLowerCase(cb.CharAt(pos)) && IsUpperCase(cb.CharAt(pos - 1))) + --pos; + } else if (IsADigit(startChar)) { + while (pos < length && IsADigit(cb.CharAt(pos))) + ++pos; + } else if (IsPunctuation(startChar)) { + while (pos < length && IsPunctuation(cb.CharAt(pos))) + ++pos; + } else if (isspacechar(startChar)) { + while (pos < length && isspacechar(cb.CharAt(pos))) + ++pos; + } else { + ++pos; + } + return pos; +} + +bool IsLineEndChar(char c) { + return (c == '\n' || c == '\r'); +} + +int Document::ExtendStyleRange(int pos, int delta, bool singleLine) { + int sStart = cb.StyleAt(pos); + if (delta < 0) { + while (pos > 0 && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) ) + pos--; + pos++; + } else { + while (pos < (Length()) && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) ) + pos++; + } + return pos; +} + +static char BraceOpposite(char ch) { + switch (ch) { + case '(': + return ')'; + case ')': + return '('; + case '[': + return ']'; + case ']': + return '['; + case '{': + return '}'; + case '}': + return '{'; + case '<': + return '>'; + case '>': + return '<'; + default: + return '\0'; + } +} + +// TODO: should be able to extend styled region to find matching brace +int Document::BraceMatch(int position, int /*maxReStyle*/) { + char chBrace = CharAt(position); + char chSeek = BraceOpposite(chBrace); + if (chSeek == '\0') + return - 1; + char styBrace = static_cast(StyleAt(position) & stylingBitsMask); + int direction = -1; + if (chBrace == '(' || chBrace == '[' || chBrace == '{' || chBrace == '<') + direction = 1; + int depth = 1; + position = position + direction; + while ((position >= 0) && (position < Length())) { + position = MovePositionOutsideChar(position, direction); + char chAtPos = CharAt(position); + char styAtPos = static_cast(StyleAt(position) & stylingBitsMask); + if ((position > GetEndStyled()) || (styAtPos == styBrace)) { + if (chAtPos == chBrace) + depth++; + if (chAtPos == chSeek) + depth--; + if (depth == 0) + return position; + } + position = position + direction; + } + return - 1; +} diff --git a/scintilla/src/Document.h b/scintilla/src/Document.h new file mode 100644 index 00000000..492f108d --- /dev/null +++ b/scintilla/src/Document.h @@ -0,0 +1,308 @@ +// Scintilla source code edit control +/** @file Document.h + ** Text document that handles notifications, DBCS, styling, words and end of line. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef DOCUMENT_H +#define DOCUMENT_H + +/** + * A Position is a position within a document between two characters or at the beginning or end. + * Sometimes used as a character index where it identifies the character after the position. + */ +typedef int Position; +const Position invalidPosition = -1; + +/** + * The range class represents a range of text in a document. + * The two values are not sorted as one end may be more significant than the other + * as is the case for the selection where the end position is the position of the caret. + * If either position is invalidPosition then the range is invalid and most operations will fail. + */ +class Range { +public: + Position start; + Position end; + + Range(Position pos=0) : + start(pos), end(pos) { + }; + Range(Position start_, Position end_) : + start(start_), end(end_) { + }; + + bool Valid() const { + return (start != invalidPosition) && (end != invalidPosition); + } + + // Is the position within the range? + bool Contains(Position pos) const { + if (start < end) { + return (pos >= start && pos <= end); + } else { + return (pos <= start && pos >= end); + } + } + + // Is the character after pos within the range? + bool ContainsCharacter(Position pos) const { + if (start < end) { + return (pos >= start && pos < end); + } else { + return (pos < start && pos >= end); + } + } + + bool Contains(Range other) const { + return Contains(other.start) && Contains(other.end); + } + + bool Overlaps(Range other) const { + return + Contains(other.start) || + Contains(other.end) || + other.Contains(start) || + other.Contains(end); + } +}; + +class DocWatcher; +class DocModification; +class RESearch; + +/** + */ +class Document { + +public: + /** Used to pair watcher pointer with user data. */ + class WatcherWithUserData { + public: + DocWatcher *watcher; + void *userData; + WatcherWithUserData() { + watcher = 0; + userData = 0; + } + }; + + enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation }; + +private: + int refCount; + CellBuffer cb; + CharClassify charClass; + char stylingMask; + int endStyled; + int styleClock; + int enteredModification; + int enteredStyling; + int enteredReadOnlyCount; + + WatcherWithUserData *watchers; + int lenWatchers; + + bool matchesValid; + RESearch *pre; + char *substituted; + +public: + //Vitaliy + inline bool MatchCaseInsensitive(const char* lpch1, const char* lpch2); + //yilatiV + int stylingBits; + int stylingBitsMask; + + int eolMode; + /// Can also be SC_CP_UTF8 to enable UTF-8 mode + int dbcsCodePage; + int tabInChars; + int indentInChars; + int actualIndentInChars; + bool useTabs; + bool tabIndents; + bool backspaceUnindents; + + Document(); + virtual ~Document(); + + int AddRef(); + int Release(); + + int LineFromPosition(int pos); + int ClampPositionIntoDocument(int pos); + bool IsCrLf(int pos); + int LenChar(int pos); + int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true); + + // Gateways to modifying document + void ModifiedAt(int pos); + bool DeleteChars(int pos, int len); + bool InsertString(int position, const char *s, int insertLength); + int Undo(); + int Redo(); + bool CanUndo() { return cb.CanUndo(); } + bool CanRedo() { return cb.CanRedo(); } + void DeleteUndoHistory() { cb.DeleteUndoHistory(); } + bool SetUndoCollection(bool collectUndo) { + return cb.SetUndoCollection(collectUndo); + } + bool IsCollectingUndo() { return cb.IsCollectingUndo(); } + void BeginUndoAction() { cb.BeginUndoAction(); } + void EndUndoAction() { cb.EndUndoAction(); } + void SetSavePoint(); + bool IsSavePoint() { return cb.IsSavePoint(); } + + int GetLineIndentation(int line); + void SetLineIndentation(int line, int indent); + int GetLineIndentPosition(int line); + int GetColumn(int position); + int FindColumn(int line, int column); + void Indent(bool forwards, int lineBottom, int lineTop); + static char *TransformLineEnds(int *pLenOut, const char *s, size_t len, int eolMode); + void ConvertLineEnds(int eolModeSet); + void SetReadOnly(bool set) { cb.SetReadOnly(set); } + bool IsReadOnly() { return cb.IsReadOnly(); } + + bool InsertChar(int pos, char ch); + bool InsertCString(int position, const char *s); + void ChangeChar(int pos, char ch); + void DelChar(int pos); + void DelCharBack(int pos); + + char CharAt(int position) { return cb.CharAt(position); } + void GetCharRange(char *buffer, int position, int lengthRetrieve) { + cb.GetCharRange(buffer, position, lengthRetrieve); + } + char StyleAt(int position) { return cb.StyleAt(position); } + int GetMark(int line) { return cb.GetMark(line); } + int AddMark(int line, int markerNum); + void AddMarkSet(int line, int valueSet); + void DeleteMark(int line, int markerNum); + void DeleteMarkFromHandle(int markerHandle); + void DeleteAllMarks(int markerNum); + int LineFromHandle(int markerHandle) { return cb.LineFromHandle(markerHandle); } + int LineStart(int line); + int LineEnd(int line); + int LineEndPosition(int position); + int VCHomePosition(int position); + + int SetLevel(int line, int level); + int GetLevel(int line) { return cb.GetLevel(line); } + void ClearLevels() { cb.ClearLevels(); } + int GetLastChild(int lineParent, int level=-1); + int GetFoldParent(int line); + + void Indent(bool forwards); + int ExtendWordSelect(int pos, int delta, bool onlyWordCharacters=false); + int NextWordStart(int pos, int delta); + int NextWordEnd(int pos, int delta); + int Length() { return cb.Length(); } + void Allocate(int newSize) { cb.Allocate(newSize); } + long FindText(int minPos, int maxPos, const char *s, + bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, int *length); + long FindText(int iMessage, unsigned long wParam, long lParam); + const char *SubstituteByPosition(const char *text, int *length); + int LinesTotal(); + + void ChangeCase(Range r, bool makeUpperCase); + + void SetDefaultCharClasses(bool includeWordClass); + void SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass); + void SetStylingBits(int bits); + void StartStyling(int position, char mask); + bool SetStyleFor(int length, char style); + bool SetStyles(int length, char *styles); + int GetEndStyled() { return endStyled; } + void EnsureStyledTo(int pos); + int GetStyleClock() { return styleClock; } + void IncrementStyleClock(); + + int SetLineState(int line, int state) { return cb.SetLineState(line, state); } + int GetLineState(int line) { return cb.GetLineState(line); } + int GetMaxLineState() { return cb.GetMaxLineState(); } + + bool AddWatcher(DocWatcher *watcher, void *userData); + bool RemoveWatcher(DocWatcher *watcher, void *userData); + const WatcherWithUserData *GetWatchers() const { return watchers; } + int GetLenWatchers() const { return lenWatchers; } + + bool IsWordPartSeparator(char ch); + int WordPartLeft(int pos); + int WordPartRight(int pos); + int ExtendStyleRange(int pos, int delta, bool singleLine = false); + bool IsWhiteLine(int line); + int ParaUp(int pos); + int ParaDown(int pos); + int IndentSize() { return actualIndentInChars; } + int BraceMatch(int position, int maxReStyle); + +private: + void CheckReadOnly(); + + CharClassify::cc WordCharClass(unsigned char ch); + bool IsWordStartAt(int pos); + bool IsWordEndAt(int pos); + bool IsWordAt(int start, int end); + + void NotifyModifyAttempt(); + void NotifySavePoint(bool atSavePoint); + void NotifyModified(DocModification mh); +}; + +/** + * To optimise processing of document modifications by DocWatchers, a hint is passed indicating the + * scope of the change. + * If the DocWatcher is a document view then this can be used to optimise screen updating. + */ +class DocModification { +public: + int modificationType; + int position; + int length; + int linesAdded; /**< Negative if lines deleted. */ + const char *text; /**< Only valid for changes to text, not for changes to style. */ + int line; + int foldLevelNow; + int foldLevelPrev; + + DocModification(int modificationType_, int position_=0, int length_=0, + int linesAdded_=0, const char *text_=0, int line_=0) : + modificationType(modificationType_), + position(position_), + length(length_), + linesAdded(linesAdded_), + text(text_), + line(line_), + foldLevelNow(0), + foldLevelPrev(0) {} + + DocModification(int modificationType_, const Action &act, int linesAdded_=0) : + modificationType(modificationType_), + position(act.position), + length(act.lenData), + linesAdded(linesAdded_), + text(act.data), + line(0), + foldLevelNow(0), + foldLevelPrev(0) {} +}; + +/** + * A class that wants to receive notifications from a Document must be derived from DocWatcher + * and implement the notification methods. It can then be added to the watcher list with AddWatcher. + */ +class DocWatcher { +public: + virtual ~DocWatcher() {} + + virtual void NotifyModifyAttempt(Document *doc, void *userData) = 0; + virtual void NotifySavePoint(Document *doc, void *userData, bool atSavePoint) = 0; + virtual void NotifyModified(Document *doc, DocModification mh, void *userData) = 0; + virtual void NotifyDeleted(Document *doc, void *userData) = 0; + virtual void NotifyStyleNeeded(Document *doc, void *userData, int endPos) = 0; +}; + +#endif diff --git a/scintilla/src/Document.h.bak b/scintilla/src/Document.h.bak new file mode 100644 index 00000000..cf4d8a3e --- /dev/null +++ b/scintilla/src/Document.h.bak @@ -0,0 +1,305 @@ +// Scintilla source code edit control +/** @file Document.h + ** Text document that handles notifications, DBCS, styling, words and end of line. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef DOCUMENT_H +#define DOCUMENT_H + +/** + * A Position is a position within a document between two characters or at the beginning or end. + * Sometimes used as a character index where it identifies the character after the position. + */ +typedef int Position; +const Position invalidPosition = -1; + +/** + * The range class represents a range of text in a document. + * The two values are not sorted as one end may be more significant than the other + * as is the case for the selection where the end position is the position of the caret. + * If either position is invalidPosition then the range is invalid and most operations will fail. + */ +class Range { +public: + Position start; + Position end; + + Range(Position pos=0) : + start(pos), end(pos) { + }; + Range(Position start_, Position end_) : + start(start_), end(end_) { + }; + + bool Valid() const { + return (start != invalidPosition) && (end != invalidPosition); + } + + // Is the position within the range? + bool Contains(Position pos) const { + if (start < end) { + return (pos >= start && pos <= end); + } else { + return (pos <= start && pos >= end); + } + } + + // Is the character after pos within the range? + bool ContainsCharacter(Position pos) const { + if (start < end) { + return (pos >= start && pos < end); + } else { + return (pos < start && pos >= end); + } + } + + bool Contains(Range other) const { + return Contains(other.start) && Contains(other.end); + } + + bool Overlaps(Range other) const { + return + Contains(other.start) || + Contains(other.end) || + other.Contains(start) || + other.Contains(end); + } +}; + +class DocWatcher; +class DocModification; +class RESearch; + +/** + */ +class Document { + +public: + /** Used to pair watcher pointer with user data. */ + class WatcherWithUserData { + public: + DocWatcher *watcher; + void *userData; + WatcherWithUserData() { + watcher = 0; + userData = 0; + } + }; + + enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation }; + +private: + int refCount; + CellBuffer cb; + CharClassify charClass; + char stylingMask; + int endStyled; + int styleClock; + int enteredModification; + int enteredStyling; + int enteredReadOnlyCount; + + WatcherWithUserData *watchers; + int lenWatchers; + + bool matchesValid; + RESearch *pre; + char *substituted; + +public: + int stylingBits; + int stylingBitsMask; + + int eolMode; + /// Can also be SC_CP_UTF8 to enable UTF-8 mode + int dbcsCodePage; + int tabInChars; + int indentInChars; + int actualIndentInChars; + bool useTabs; + bool tabIndents; + bool backspaceUnindents; + + Document(); + virtual ~Document(); + + int AddRef(); + int Release(); + + int LineFromPosition(int pos); + int ClampPositionIntoDocument(int pos); + bool IsCrLf(int pos); + int LenChar(int pos); + int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true); + + // Gateways to modifying document + void ModifiedAt(int pos); + bool DeleteChars(int pos, int len); + bool InsertString(int position, const char *s, int insertLength); + int Undo(); + int Redo(); + bool CanUndo() { return cb.CanUndo(); } + bool CanRedo() { return cb.CanRedo(); } + void DeleteUndoHistory() { cb.DeleteUndoHistory(); } + bool SetUndoCollection(bool collectUndo) { + return cb.SetUndoCollection(collectUndo); + } + bool IsCollectingUndo() { return cb.IsCollectingUndo(); } + void BeginUndoAction() { cb.BeginUndoAction(); } + void EndUndoAction() { cb.EndUndoAction(); } + void SetSavePoint(); + bool IsSavePoint() { return cb.IsSavePoint(); } + + int GetLineIndentation(int line); + void SetLineIndentation(int line, int indent); + int GetLineIndentPosition(int line); + int GetColumn(int position); + int FindColumn(int line, int column); + void Indent(bool forwards, int lineBottom, int lineTop); + static char *TransformLineEnds(int *pLenOut, const char *s, size_t len, int eolMode); + void ConvertLineEnds(int eolModeSet); + void SetReadOnly(bool set) { cb.SetReadOnly(set); } + bool IsReadOnly() { return cb.IsReadOnly(); } + + bool InsertChar(int pos, char ch); + bool InsertCString(int position, const char *s); + void ChangeChar(int pos, char ch); + void DelChar(int pos); + void DelCharBack(int pos); + + char CharAt(int position) { return cb.CharAt(position); } + void GetCharRange(char *buffer, int position, int lengthRetrieve) { + cb.GetCharRange(buffer, position, lengthRetrieve); + } + char StyleAt(int position) { return cb.StyleAt(position); } + int GetMark(int line) { return cb.GetMark(line); } + int AddMark(int line, int markerNum); + void AddMarkSet(int line, int valueSet); + void DeleteMark(int line, int markerNum); + void DeleteMarkFromHandle(int markerHandle); + void DeleteAllMarks(int markerNum); + int LineFromHandle(int markerHandle) { return cb.LineFromHandle(markerHandle); } + int LineStart(int line); + int LineEnd(int line); + int LineEndPosition(int position); + int VCHomePosition(int position); + + int SetLevel(int line, int level); + int GetLevel(int line) { return cb.GetLevel(line); } + void ClearLevels() { cb.ClearLevels(); } + int GetLastChild(int lineParent, int level=-1); + int GetFoldParent(int line); + + void Indent(bool forwards); + int ExtendWordSelect(int pos, int delta, bool onlyWordCharacters=false); + int NextWordStart(int pos, int delta); + int NextWordEnd(int pos, int delta); + int Length() { return cb.Length(); } + void Allocate(int newSize) { cb.Allocate(newSize); } + long FindText(int minPos, int maxPos, const char *s, + bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, int *length); + long FindText(int iMessage, unsigned long wParam, long lParam); + const char *SubstituteByPosition(const char *text, int *length); + int LinesTotal(); + + void ChangeCase(Range r, bool makeUpperCase); + + void SetDefaultCharClasses(bool includeWordClass); + void SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass); + void SetStylingBits(int bits); + void StartStyling(int position, char mask); + bool SetStyleFor(int length, char style); + bool SetStyles(int length, char *styles); + int GetEndStyled() { return endStyled; } + void EnsureStyledTo(int pos); + int GetStyleClock() { return styleClock; } + void IncrementStyleClock(); + + int SetLineState(int line, int state) { return cb.SetLineState(line, state); } + int GetLineState(int line) { return cb.GetLineState(line); } + int GetMaxLineState() { return cb.GetMaxLineState(); } + + bool AddWatcher(DocWatcher *watcher, void *userData); + bool RemoveWatcher(DocWatcher *watcher, void *userData); + const WatcherWithUserData *GetWatchers() const { return watchers; } + int GetLenWatchers() const { return lenWatchers; } + + bool IsWordPartSeparator(char ch); + int WordPartLeft(int pos); + int WordPartRight(int pos); + int ExtendStyleRange(int pos, int delta, bool singleLine = false); + bool IsWhiteLine(int line); + int ParaUp(int pos); + int ParaDown(int pos); + int IndentSize() { return actualIndentInChars; } + int BraceMatch(int position, int maxReStyle); + +private: + void CheckReadOnly(); + + CharClassify::cc WordCharClass(unsigned char ch); + bool IsWordStartAt(int pos); + bool IsWordEndAt(int pos); + bool IsWordAt(int start, int end); + + void NotifyModifyAttempt(); + void NotifySavePoint(bool atSavePoint); + void NotifyModified(DocModification mh); +}; + +/** + * To optimise processing of document modifications by DocWatchers, a hint is passed indicating the + * scope of the change. + * If the DocWatcher is a document view then this can be used to optimise screen updating. + */ +class DocModification { +public: + int modificationType; + int position; + int length; + int linesAdded; /**< Negative if lines deleted. */ + const char *text; /**< Only valid for changes to text, not for changes to style. */ + int line; + int foldLevelNow; + int foldLevelPrev; + + DocModification(int modificationType_, int position_=0, int length_=0, + int linesAdded_=0, const char *text_=0, int line_=0) : + modificationType(modificationType_), + position(position_), + length(length_), + linesAdded(linesAdded_), + text(text_), + line(line_), + foldLevelNow(0), + foldLevelPrev(0) {} + + DocModification(int modificationType_, const Action &act, int linesAdded_=0) : + modificationType(modificationType_), + position(act.position), + length(act.lenData), + linesAdded(linesAdded_), + text(act.data), + line(0), + foldLevelNow(0), + foldLevelPrev(0) {} +}; + +/** + * A class that wants to receive notifications from a Document must be derived from DocWatcher + * and implement the notification methods. It can then be added to the watcher list with AddWatcher. + */ +class DocWatcher { +public: + virtual ~DocWatcher() {} + + virtual void NotifyModifyAttempt(Document *doc, void *userData) = 0; + virtual void NotifySavePoint(Document *doc, void *userData, bool atSavePoint) = 0; + virtual void NotifyModified(Document *doc, DocModification mh, void *userData) = 0; + virtual void NotifyDeleted(Document *doc, void *userData) = 0; + virtual void NotifyStyleNeeded(Document *doc, void *userData, int endPos) = 0; +}; + +#endif diff --git a/scintilla/src/DocumentAccessor.cxx b/scintilla/src/DocumentAccessor.cxx new file mode 100644 index 00000000..f72dbd61 --- /dev/null +++ b/scintilla/src/DocumentAccessor.cxx @@ -0,0 +1,190 @@ +// Scintilla source code edit control +/** @file DocumentAccessor.cxx + ** Rapid easy access to contents of a Scintilla. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "SVector.h" +#include "Accessor.h" +#include "DocumentAccessor.h" +#include "SplitVector.h" +#include "Partitioning.h" +#include "CellBuffer.h" +#include "Scintilla.h" +#include "CharClassify.h" +#include "Document.h" + +DocumentAccessor::~DocumentAccessor() { +} + +bool DocumentAccessor::InternalIsLeadByte(char ch) { + if (SC_CP_UTF8 == codePage) + // For lexing, all characters >= 0x80 are treated the + // same so none is considered a lead byte. + return false; + else + return Platform::IsDBCSLeadByte(codePage, ch); +} + +void DocumentAccessor::Fill(int position) { + if (lenDoc == -1) + lenDoc = pdoc->Length(); + startPos = position - slopSize; + if (startPos + bufferSize > lenDoc) + startPos = lenDoc - bufferSize; + if (startPos < 0) + startPos = 0; + endPos = startPos + bufferSize; + if (endPos > lenDoc) + endPos = lenDoc; + + pdoc->GetCharRange(buf, startPos, endPos-startPos); + buf[endPos-startPos] = '\0'; +} + +bool DocumentAccessor::Match(int pos, const char *s) { + for (int i=0; *s; i++) { + if (*s != SafeGetCharAt(pos+i)) + return false; + s++; + } + return true; +} + +char DocumentAccessor::StyleAt(int position) { + // Mask off all bits which aren't in the 'mask'. + return static_cast(pdoc->StyleAt(position) & mask); +} + +int DocumentAccessor::GetLine(int position) { + return pdoc->LineFromPosition(position); +} + +int DocumentAccessor::LineStart(int line) { + return pdoc->LineStart(line); +} + +int DocumentAccessor::LevelAt(int line) { + return pdoc->GetLevel(line); +} + +int DocumentAccessor::Length() { + if (lenDoc == -1) + lenDoc = pdoc->Length(); + return lenDoc; +} + +int DocumentAccessor::GetLineState(int line) { + return pdoc->GetLineState(line); +} + +int DocumentAccessor::SetLineState(int line, int state) { + return pdoc->SetLineState(line, state); +} + +void DocumentAccessor::StartAt(unsigned int start, char chMask) { + // Store the mask specified for use with StyleAt. + mask = chMask; + pdoc->StartStyling(start, chMask); + startPosStyling = start; +} + +void DocumentAccessor::StartSegment(unsigned int pos) { + startSeg = pos; +} + +void DocumentAccessor::ColourTo(unsigned int pos, int chAttr) { + // Only perform styling if non empty range + if (pos != startSeg - 1) { + PLATFORM_ASSERT(pos >= startSeg); + if (pos < startSeg) { + return; + } + + if (validLen + (pos - startSeg + 1) >= bufferSize) + Flush(); + if (validLen + (pos - startSeg + 1) >= bufferSize) { + // Too big for buffer so send directly + pdoc->SetStyleFor(pos - startSeg + 1, static_cast(chAttr)); + } else { + if (chAttr != chWhile) + chFlags = 0; + chAttr |= chFlags; + for (unsigned int i = startSeg; i <= pos; i++) { + PLATFORM_ASSERT((startPosStyling + validLen) < Length()); + styleBuf[validLen++] = static_cast(chAttr); + } + } + } + startSeg = pos+1; +} + +void DocumentAccessor::SetLevel(int line, int level) { + pdoc->SetLevel(line, level); +} + +void DocumentAccessor::Flush() { + startPos = extremePosition; + lenDoc = -1; + if (validLen > 0) { + pdoc->SetStyles(validLen, styleBuf); + startPosStyling += validLen; + validLen = 0; + } +} + +int DocumentAccessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) { + int end = Length(); + int spaceFlags = 0; + + // Determines the indentation level of the current line and also checks for consistent + // indentation compared to the previous line. + // Indentation is judged consistent when the indentation whitespace of each line lines + // the same or the indentation of one line is a prefix of the other. + + int pos = LineStart(line); + char ch = (*this)[pos]; + int indent = 0; + bool inPrevPrefix = line > 0; + int posPrev = inPrevPrefix ? LineStart(line-1) : 0; + while ((ch == ' ' || ch == '\t') && (pos < end)) { + if (inPrevPrefix) { + char chPrev = (*this)[posPrev++]; + if (chPrev == ' ' || chPrev == '\t') { + if (chPrev != ch) + spaceFlags |= wsInconsistent; + } else { + inPrevPrefix = false; + } + } + if (ch == ' ') { + spaceFlags |= wsSpace; + indent++; + } else { // Tab + spaceFlags |= wsTab; + if (spaceFlags & wsSpace) + spaceFlags |= wsSpaceTab; + indent = (indent / 8 + 1) * 8; + } + ch = (*this)[++pos]; + } + + *flags = spaceFlags; + indent += SC_FOLDLEVELBASE; + // if completely empty line or the start of a comment... + if ((ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') || + (pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)) ) + return indent | SC_FOLDLEVELWHITEFLAG; + else + return indent; +} + diff --git a/scintilla/src/DocumentAccessor.h b/scintilla/src/DocumentAccessor.h new file mode 100644 index 00000000..05eefda6 --- /dev/null +++ b/scintilla/src/DocumentAccessor.h @@ -0,0 +1,67 @@ +// Scintilla source code edit control +/** @file DocumentAccessor.h + ** Implementation of BufferAccess and StylingAccess on a Scintilla + ** rapid easy access to contents of a Scintilla. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +class Document; + +/** + */ +class DocumentAccessor : public Accessor { + // Private so DocumentAccessor objects can not be copied + DocumentAccessor(const DocumentAccessor &source) : Accessor(), props(source.props) {} + DocumentAccessor &operator=(const DocumentAccessor &) { return *this; } + +protected: + Document *pdoc; + PropSet &props; + WindowID id; + int lenDoc; + + char styleBuf[bufferSize]; + int validLen; + char chFlags; + char chWhile; + unsigned int startSeg; + int startPosStyling; + int mask; + + bool InternalIsLeadByte(char ch); + void Fill(int position); + +public: + DocumentAccessor(Document *pdoc_, PropSet &props_, WindowID id_=0) : + Accessor(), pdoc(pdoc_), props(props_), id(id_), + lenDoc(-1), validLen(0), chFlags(0), chWhile(0), + startSeg(0), startPosStyling(0), + mask(127) { // Initialize the mask to be big enough for any lexer. + } + ~DocumentAccessor(); + bool Match(int pos, const char *s); + char StyleAt(int position); + int GetLine(int position); + int LineStart(int line); + int LevelAt(int line); + int Length(); + void Flush(); + int GetLineState(int line); + int SetLineState(int line, int state); + int GetPropertyInt(const char *key, int defaultValue=0) { + return props.GetInt(key, defaultValue); + } + char *GetProperties() { + return props.ToString(); + } + WindowID GetWindow() { return id; } + + void StartAt(unsigned int start, char chMask=31); + void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; }; + unsigned int GetStartSegment() { return startSeg; } + void StartSegment(unsigned int pos); + void ColourTo(unsigned int pos, int chAttr); + void SetLevel(int line, int level); + int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0); +}; diff --git a/scintilla/src/Editor.cxx b/scintilla/src/Editor.cxx new file mode 100644 index 00000000..58ea56e5 --- /dev/null +++ b/scintilla/src/Editor.cxx @@ -0,0 +1,7424 @@ +// Scintilla source code edit control +/** @file Editor.cxx + ** Main code for the edit control. + **/ +// Copyright 1998-2004 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include "Platform.h" + +#ifndef PLAT_QT +#define INCLUDE_DEPRECATED_FEATURES +#endif +#include "Scintilla.h" + +#include "ContractionState.h" +#include "SVector.h" +#include "SplitVector.h" +#include "Partitioning.h" +#include "CellBuffer.h" +#include "KeyMap.h" +#include "Indicator.h" +#include "XPM.h" +#include "LineMarker.h" +#include "Style.h" +#include "ViewStyle.h" +#include "CharClassify.h" +#include "Document.h" +#include "Editor.h" + +/* + return whether this modification represents an operation that + may reasonably be deferred (not done now OR [possibly] at all) +*/ +static bool CanDeferToLastStep(const DocModification& mh) { + if (mh.modificationType & (SC_MOD_BEFOREINSERT|SC_MOD_BEFOREDELETE)) + return true; // CAN skip + if (!(mh.modificationType & (SC_PERFORMED_UNDO|SC_PERFORMED_REDO))) + return false; // MUST do + if (mh.modificationType & SC_MULTISTEPUNDOREDO) + return true; // CAN skip + return false; // PRESUMABLY must do +} + +static bool CanEliminate(const DocModification& mh) { + return + (mh.modificationType & (SC_MOD_BEFOREINSERT|SC_MOD_BEFOREDELETE)) != 0; +} + +/* + return whether this modification represents the FINAL step + in a [possibly lengthy] multi-step Undo/Redo sequence +*/ +static bool IsLastStep(const DocModification& mh) { + return + (mh.modificationType & (SC_PERFORMED_UNDO|SC_PERFORMED_REDO)) != 0 + && (mh.modificationType & SC_MULTISTEPUNDOREDO) != 0 + && (mh.modificationType & SC_LASTSTEPINUNDOREDO) != 0 + && (mh.modificationType & SC_MULTILINEUNDOREDO) != 0; +} + +Caret::Caret() : +active(false), on(false), period(500) {} + +Timer::Timer() : +ticking(false), ticksToWait(0), tickerID(0) {} + +Idler::Idler() : +state(false), idlerID(0) {} + +LineLayout::LineLayout(int maxLineLength_) : + lineStarts(0), + lenLineStarts(0), + lineNumber(-1), + inCache(false), + maxLineLength(-1), + numCharsInLine(0), + validity(llInvalid), + xHighlightGuide(0), + highlightColumn(0), + selStart(0), + selEnd(0), + containsCaret(false), + edgeColumn(0), + chars(0), + styles(0), + styleBitsSet(0), + indicators(0), + positions(0), + hsStart(0), + hsEnd(0), + widthLine(wrapWidthInfinite), + lines(1) { + Resize(maxLineLength_); +} + +LineLayout::~LineLayout() { + Free(); +} + +void LineLayout::Resize(int maxLineLength_) { + if (maxLineLength_ > maxLineLength) { + Free(); + chars = new char[maxLineLength_ + 1]; + styles = new unsigned char[maxLineLength_ + 1]; + indicators = new char[maxLineLength_ + 1]; + // Extra position allocated as sometimes the Windows + // GetTextExtentExPoint API writes an extra element. + positions = new int[maxLineLength_ + 1 + 1]; + maxLineLength = maxLineLength_; + } +} + +void LineLayout::Free() { + delete []chars; + chars = 0; + delete []styles; + styles = 0; + delete []indicators; + indicators = 0; + delete []positions; + positions = 0; + delete []lineStarts; + lineStarts = 0; +} + +void LineLayout::Invalidate(validLevel validity_) { + if (validity > validity_) + validity = validity_; +} + +void LineLayout::SetLineStart(int line, int start) { + if ((line >= lenLineStarts) && (line != 0)) { + int newMaxLines = line + 20; + int *newLineStarts = new int[newMaxLines]; + if (!newLineStarts) + return; + for (int i = 0; i < newMaxLines; i++) { + if (i < lenLineStarts) + newLineStarts[i] = lineStarts[i]; + else + newLineStarts[i] = 0; + } + delete []lineStarts; + lineStarts = newLineStarts; + lenLineStarts = newMaxLines; + } + lineStarts[line] = start; +} + +void LineLayout::SetBracesHighlight(Range rangeLine, Position braces[], + char bracesMatchStyle, int xHighlight) { + if (rangeLine.ContainsCharacter(braces[0])) { + int braceOffset = braces[0] - rangeLine.start; + if (braceOffset < numCharsInLine) { + bracePreviousStyles[0] = styles[braceOffset]; + styles[braceOffset] = bracesMatchStyle; + } + } + if (rangeLine.ContainsCharacter(braces[1])) { + int braceOffset = braces[1] - rangeLine.start; + if (braceOffset < numCharsInLine) { + bracePreviousStyles[1] = styles[braceOffset]; + styles[braceOffset] = bracesMatchStyle; + } + } + if ((braces[0] >= rangeLine.start && braces[1] <= rangeLine.end) || + (braces[1] >= rangeLine.start && braces[0] <= rangeLine.end)) { + xHighlightGuide = xHighlight; + } +} + +void LineLayout::RestoreBracesHighlight(Range rangeLine, Position braces[]) { + if (rangeLine.ContainsCharacter(braces[0])) { + int braceOffset = braces[0] - rangeLine.start; + if (braceOffset < numCharsInLine) { + styles[braceOffset] = bracePreviousStyles[0]; + } + } + if (rangeLine.ContainsCharacter(braces[1])) { + int braceOffset = braces[1] - rangeLine.start; + if (braceOffset < numCharsInLine) { + styles[braceOffset] = bracePreviousStyles[1]; + } + } + xHighlightGuide = 0; +} + +LineLayoutCache::LineLayoutCache() : + level(0), length(0), size(0), cache(0), + allInvalidated(false), styleClock(-1), useCount(0) { + Allocate(0); +} + +LineLayoutCache::~LineLayoutCache() { + Deallocate(); +} + +void LineLayoutCache::Allocate(int length_) { + PLATFORM_ASSERT(cache == NULL); + allInvalidated = false; + length = length_; + size = length; + if (size > 1) { + size = (size / 16 + 1) * 16; + } + if (size > 0) { + cache = new LineLayout * [size]; + } + for (int i = 0; i < size; i++) + cache[i] = 0; +} + +void LineLayoutCache::AllocateForLevel(int linesOnScreen, int linesInDoc) { + PLATFORM_ASSERT(useCount == 0); + int lengthForLevel = 0; + if (level == llcCaret) { + lengthForLevel = 1; + } else if (level == llcPage) { + lengthForLevel = linesOnScreen + 1; + } else if (level == llcDocument) { + lengthForLevel = linesInDoc; + } + if (lengthForLevel > size) { + Deallocate(); + Allocate(lengthForLevel); + } else { + if (lengthForLevel < length) { + for (int i = lengthForLevel; i < length; i++) { + delete cache[i]; + cache[i] = 0; + } + } + length = lengthForLevel; + } + PLATFORM_ASSERT(length == lengthForLevel); + PLATFORM_ASSERT(cache != NULL || length == 0); +} + +void LineLayoutCache::Deallocate() { + PLATFORM_ASSERT(useCount == 0); + for (int i = 0; i < length; i++) + delete cache[i]; + delete []cache; + cache = 0; + length = 0; + size = 0; +} + +void LineLayoutCache::Invalidate(LineLayout::validLevel validity_) { + if (cache && !allInvalidated) { + for (int i = 0; i < length; i++) { + if (cache[i]) { + cache[i]->Invalidate(validity_); + } + } + if (validity_ == LineLayout::llInvalid) { + allInvalidated = true; + } + } +} + +void LineLayoutCache::SetLevel(int level_) { + allInvalidated = false; + if ((level_ != -1) && (level != level_)) { + level = level_; + Deallocate(); + } +} + +LineLayout *LineLayoutCache::Retrieve(int lineNumber, int lineCaret, int maxChars, int styleClock_, + int linesOnScreen, int linesInDoc) { + AllocateForLevel(linesOnScreen, linesInDoc); + if (styleClock != styleClock_) { + Invalidate(LineLayout::llCheckTextAndStyle); + styleClock = styleClock_; + } + allInvalidated = false; + int pos = -1; + LineLayout *ret = 0; + if (level == llcCaret) { + pos = 0; + } else if (level == llcPage) { + if (lineNumber == lineCaret) { + pos = 0; + } else if (length > 1) { + pos = 1 + (lineNumber % (length - 1)); + } + } else if (level == llcDocument) { + pos = lineNumber; + } + if (pos >= 0) { + PLATFORM_ASSERT(useCount == 0); + if (cache && (pos < length)) { + if (cache[pos]) { + if ((cache[pos]->lineNumber != lineNumber) || + (cache[pos]->maxLineLength < maxChars)) { + delete cache[pos]; + cache[pos] = 0; + } + } + if (!cache[pos]) { + cache[pos] = new LineLayout(maxChars); + } + if (cache[pos]) { + cache[pos]->lineNumber = lineNumber; + cache[pos]->inCache = true; + ret = cache[pos]; + useCount++; + } + } + } + + if (!ret) { + ret = new LineLayout(maxChars); + ret->lineNumber = lineNumber; + } + + return ret; +} + +void LineLayoutCache::Dispose(LineLayout *ll) { + allInvalidated = false; + if (ll) { + if (!ll->inCache) { + delete ll; + } else { + useCount--; + } + } +} + +Editor::Editor() { + ctrlID = 0; + + stylesValid = false; + + printMagnification = 0; + printColourMode = SC_PRINT_NORMAL; + printWrapState = eWrapWord; + cursorMode = SC_CURSORNORMAL; + controlCharSymbol = 0; /* Draw the control characters */ + + hasFocus = false; + hideSelection = false; + inOverstrike = false; + errorStatus = 0; + mouseDownCaptures = true; + + bufferedDraw = true; + twoPhaseDraw = true; + + lastClickTime = 0; + dwellDelay = SC_TIME_FOREVER; + ticksToDwell = SC_TIME_FOREVER; + dwelling = false; + ptMouseLast.x = 0; + ptMouseLast.y = 0; + inDragDrop = false; + dropWentOutside = false; + posDrag = invalidPosition; + posDrop = invalidPosition; + selectionType = selChar; + + lastXChosen = 0; + lineAnchor = 0; + originalAnchorPos = 0; + + selType = selStream; + moveExtendsSelection = false; + xStartSelect = 0; + xEndSelect = 0; + primarySelection = true; + + caretXPolicy = CARET_SLOP | CARET_EVEN; + caretXSlop = 50; + + caretYPolicy = CARET_EVEN; + caretYSlop = 0; + + searchAnchor = 0; + + xOffset = 0; + xCaretMargin = 50; + horizontalScrollBarVisible = true; + scrollWidth = 2000; + verticalScrollBarVisible = true; + endAtLastLine = true; + caretSticky = false; + + pixmapLine = Surface::Allocate(); + pixmapSelMargin = Surface::Allocate(); + pixmapSelPattern = Surface::Allocate(); + pixmapIndentGuide = Surface::Allocate(); + pixmapIndentGuideHighlight = Surface::Allocate(); + + currentPos = 0; + anchor = 0; + + targetStart = 0; + targetEnd = 0; + searchFlags = 0; + + topLine = 0; + posTopLine = 0; + + lengthForEncode = -1; + + needUpdateUI = true; + braces[0] = invalidPosition; + braces[1] = invalidPosition; + bracesMatchStyle = STYLE_BRACEBAD; + highlightGuideColumn = 0; + + theEdge = 0; + + paintState = notPainting; + + modEventMask = SC_MODEVENTMASKALL; + + pdoc = new Document(); + pdoc->AddRef(); + pdoc->AddWatcher(this, 0); + + recordingMacro = false; + foldFlags = 0; + + wrapState = eWrapNone; + wrapWidth = LineLayout::wrapWidthInfinite; + wrapStart = wrapLineLarge; + wrapEnd = wrapLineLarge; + wrapVisualFlags = 0; + wrapVisualFlagsLocation = 0; + wrapVisualStartIndent = 0; + actualWrapVisualStartIndent = 0; + + convertPastes = true; + + hsStart = -1; + hsEnd = -1; + + llc.SetLevel(LineLayoutCache::llcCaret); +} + +Editor::~Editor() { + pdoc->RemoveWatcher(this, 0); + pdoc->Release(); + pdoc = 0; + DropGraphics(); + delete pixmapLine; + delete pixmapSelMargin; + delete pixmapSelPattern; + delete pixmapIndentGuide; + delete pixmapIndentGuideHighlight; +} + +void Editor::Finalise() { + SetIdle(false); + CancelModes(); +} + +void Editor::DropGraphics() { + pixmapLine->Release(); + pixmapSelMargin->Release(); + pixmapSelPattern->Release(); + pixmapIndentGuide->Release(); + pixmapIndentGuideHighlight->Release(); +} + +void Editor::InvalidateStyleData() { + stylesValid = false; + palette.Release(); + DropGraphics(); + llc.Invalidate(LineLayout::llInvalid); + if (selType == selRectangle) { + xStartSelect = XFromPosition(anchor); + xEndSelect = XFromPosition(currentPos); + } +} + +void Editor::InvalidateStyleRedraw() { + NeedWrapping(); + InvalidateStyleData(); + Redraw(); +} + +void Editor::RefreshColourPalette(Palette &pal, bool want) { + vs.RefreshColourPalette(pal, want); +} + +void Editor::RefreshStyleData() { + if (!stylesValid) { + stylesValid = true; + AutoSurface surface(this); + if (surface) { + vs.Refresh(*surface); + RefreshColourPalette(palette, true); + palette.Allocate(wMain); + RefreshColourPalette(palette, false); + } + SetScrollBars(); + } +} + +PRectangle Editor::GetClientRectangle() { + return wMain.GetClientPosition(); +} + +PRectangle Editor::GetTextRectangle() { + PRectangle rc = GetClientRectangle(); + rc.left += vs.fixedColumnWidth; + rc.right -= vs.rightMarginWidth; + return rc; +} + +int Editor::LinesOnScreen() { + PRectangle rcClient = GetClientRectangle(); + int htClient = rcClient.bottom - rcClient.top; + //Platform::DebugPrintf("lines on screen = %d\n", htClient / lineHeight + 1); + return htClient / vs.lineHeight; +} + +int Editor::LinesToScroll() { + int retVal = LinesOnScreen() - 1; + if (retVal < 1) + return 1; + else + return retVal; +} + +int Editor::MaxScrollPos() { + //Platform::DebugPrintf("Lines %d screen = %d maxScroll = %d\n", + //LinesTotal(), LinesOnScreen(), LinesTotal() - LinesOnScreen() + 1); + int retVal = cs.LinesDisplayed(); + if (endAtLastLine) { + retVal -= LinesOnScreen(); + } else { + retVal--; + } + if (retVal < 0) { + return 0; + } else { + return retVal; + } +} + +static inline bool IsControlCharacter(int ch) { + // iscntrl returns true for lots of chars > 127 which are displayable + return ch >= 0 && ch < ' '; +} + +const char *ControlCharacterString(unsigned char ch) { + const char *reps[] = { + "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", + "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI", + "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", + "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US" + }; + if (ch < (sizeof(reps) / sizeof(reps[0]))) { + return reps[ch]; + } else { + return "BAD"; + } +} + +/** + * Convenience class to ensure LineLayout objects are always disposed. + */ +class AutoLineLayout { + LineLayoutCache &llc; + LineLayout *ll; + AutoLineLayout &operator=(const AutoLineLayout &) { return * this; } +public: + AutoLineLayout(LineLayoutCache &llc_, LineLayout *ll_) : llc(llc_), ll(ll_) {} + ~AutoLineLayout() { + llc.Dispose(ll); + ll = 0; + } + LineLayout *operator->() const { + return ll; + } + operator LineLayout *() const { + return ll; + } + void Set(LineLayout *ll_) { + llc.Dispose(ll); + ll = ll_; + } +}; + +/** + * Allows to iterate through the lines of a selection. + * Althought it can be called for a stream selection, in most cases + * it is inefficient and it should be used only for + * a rectangular or a line selection. + */ +class SelectionLineIterator { +private: + Editor *ed; + int line; ///< Current line within the iteration. + bool forward; ///< True if iterating by increasing line number, false otherwise. + int selStart, selEnd; ///< Positions of the start and end of the selection relative to the start of the document. + int minX, maxX; ///< Left and right of selection rectangle. + +public: + int lineStart, lineEnd; ///< Line numbers, first and last lines of the selection. + int startPos, endPos; ///< Positions of the beginning and end of the selection on the current line. + + void Reset() { + if (forward) { + line = lineStart; + } else { + line = lineEnd; + } + } + + SelectionLineIterator(Editor *ed_, bool forward_ = true) : line(0), startPos(0), endPos(0) { + ed = ed_; + forward = forward_; + selStart = ed->SelectionStart(); + selEnd = ed->SelectionEnd(); + lineStart = ed->pdoc->LineFromPosition(selStart); + lineEnd = ed->pdoc->LineFromPosition(selEnd); + // Left of rectangle + minX = Platform::Minimum(ed->xStartSelect, ed->xEndSelect); + // Right of rectangle + maxX = Platform::Maximum(ed->xStartSelect, ed->xEndSelect); + Reset(); + } + ~SelectionLineIterator() {} + + void SetAt(int line) { + if (line < lineStart || line > lineEnd) { + startPos = endPos = INVALID_POSITION; + } else { + if (ed->selType == ed->selRectangle) { + // Measure line and return character closest to minX + startPos = ed->PositionFromLineX(line, minX); + // Measure line and return character closest to maxX + endPos = ed->PositionFromLineX(line, maxX); + } else if (ed->selType == ed->selLines) { + startPos = ed->pdoc->LineStart(line); + endPos = ed->pdoc->LineStart(line + 1); + } else { // Stream selection, here only for completion + if (line == lineStart) { + startPos = selStart; + } else { + startPos = ed->pdoc->LineStart(line); + } + if (line == lineEnd) { + endPos = selEnd; + } else { + endPos = ed->pdoc->LineStart(line + 1); + } + } + } + } + bool Iterate() { + SetAt(line); + if (forward) { + line++; + } else { + line--; + } + return startPos != INVALID_POSITION; + } +}; + +Point Editor::LocationFromPosition(int pos) { + Point pt; + RefreshStyleData(); + if (pos == INVALID_POSITION) + return pt; + int line = pdoc->LineFromPosition(pos); + int lineVisible = cs.DisplayFromDoc(line); + //Platform::DebugPrintf("line=%d\n", line); + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(line)); + if (surface && ll) { + // -1 because of adding in for visible lines in following loop. + pt.y = (lineVisible - topLine - 1) * vs.lineHeight; + pt.x = 0; + unsigned int posLineStart = pdoc->LineStart(line); + LayoutLine(line, surface, vs, ll, wrapWidth); + int posInLine = pos - posLineStart; + // In case of very long line put x at arbitrary large position + if (posInLine > ll->maxLineLength) { + pt.x = ll->positions[ll->maxLineLength] - ll->positions[ll->LineStart(ll->lines)]; + } + + for (int subLine = 0; subLine < ll->lines; subLine++) { + if ((posInLine >= ll->LineStart(subLine)) && (posInLine <= ll->LineStart(subLine + 1))) { + pt.x = ll->positions[posInLine] - ll->positions[ll->LineStart(subLine)]; + if (actualWrapVisualStartIndent != 0) { + int lineStart = ll->LineStart(subLine); + if (lineStart != 0) // Wrapped + pt.x += actualWrapVisualStartIndent * vs.aveCharWidth; + } + } + if (posInLine >= ll->LineStart(subLine)) { + pt.y += vs.lineHeight; + } + } + pt.x += vs.fixedColumnWidth - xOffset; + } + return pt; +} + +int Editor::XFromPosition(int pos) { + Point pt = LocationFromPosition(pos); + return pt.x - vs.fixedColumnWidth + xOffset; +} + +int Editor::LineFromLocation(Point pt) { + return cs.DocFromDisplay(pt.y / vs.lineHeight + topLine); +} + +void Editor::SetTopLine(int topLineNew) { + topLine = topLineNew; + posTopLine = pdoc->LineStart(cs.DocFromDisplay(topLine)); +} + +static inline bool IsEOLChar(char ch) { + return (ch == '\r') || (ch == '\n'); +} + +int Editor::PositionFromLocation(Point pt) { + RefreshStyleData(); + pt.x = pt.x - vs.fixedColumnWidth + xOffset; + int visibleLine = pt.y / vs.lineHeight + topLine; + if (pt.y < 0) { // Division rounds towards 0 + visibleLine = (pt.y - (vs.lineHeight - 1)) / vs.lineHeight + topLine; + } + if (visibleLine < 0) + visibleLine = 0; + int lineDoc = cs.DocFromDisplay(visibleLine); + if (lineDoc >= pdoc->LinesTotal()) + return pdoc->Length(); + unsigned int posLineStart = pdoc->LineStart(lineDoc); + int retVal = posLineStart; + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc)); + if (surface && ll) { + LayoutLine(lineDoc, surface, vs, ll, wrapWidth); + int lineStartSet = cs.DisplayFromDoc(lineDoc); + int subLine = visibleLine - lineStartSet; + if (subLine < ll->lines) { + int lineStart = ll->LineStart(subLine); + int lineEnd = ll->LineStart(subLine + 1); + int subLineStart = ll->positions[lineStart]; + + if (actualWrapVisualStartIndent != 0) { + if (lineStart != 0) // Wrapped + pt.x -= actualWrapVisualStartIndent * vs.aveCharWidth; + } + for (int i = lineStart; i < lineEnd; i++) { + if (pt.x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) || + IsEOLChar(ll->chars[i])) { + return pdoc->MovePositionOutsideChar(i + posLineStart, 1); + } + } + return lineEnd + posLineStart; + } + retVal = ll->numCharsInLine + posLineStart; + } + return retVal; +} + +// Like PositionFromLocation but INVALID_POSITION returned when not near any text. +int Editor::PositionFromLocationClose(Point pt) { + RefreshStyleData(); + PRectangle rcClient = GetTextRectangle(); + if (!rcClient.Contains(pt)) + return INVALID_POSITION; + if (pt.x < vs.fixedColumnWidth) + return INVALID_POSITION; + if (pt.y < 0) + return INVALID_POSITION; + pt.x = pt.x - vs.fixedColumnWidth + xOffset; + int visibleLine = pt.y / vs.lineHeight + topLine; + if (pt.y < 0) { // Division rounds towards 0 + visibleLine = (pt.y - (vs.lineHeight - 1)) / vs.lineHeight + topLine; + } + int lineDoc = cs.DocFromDisplay(visibleLine); + if (lineDoc < 0) + return INVALID_POSITION; + if (lineDoc >= pdoc->LinesTotal()) + return INVALID_POSITION; + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc)); + if (surface && ll) { + LayoutLine(lineDoc, surface, vs, ll, wrapWidth); + unsigned int posLineStart = pdoc->LineStart(lineDoc); + int lineStartSet = cs.DisplayFromDoc(lineDoc); + int subLine = visibleLine - lineStartSet; + if (subLine < ll->lines) { + int lineStart = ll->LineStart(subLine); + int lineEnd = ll->LineStart(subLine + 1); + int subLineStart = ll->positions[lineStart]; + + if (actualWrapVisualStartIndent != 0) { + if (lineStart != 0) // Wrapped + pt.x -= actualWrapVisualStartIndent * vs.aveCharWidth; + } + for (int i = lineStart; i < lineEnd; i++) { + if (pt.x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) || + IsEOLChar(ll->chars[i])) { + return pdoc->MovePositionOutsideChar(i + posLineStart, 1); + } + } + if (pt.x < (ll->positions[lineEnd] - subLineStart)) { + return pdoc->MovePositionOutsideChar(lineEnd + posLineStart, 1); + } + } + } + + return INVALID_POSITION; +} + +/** + * Find the document position corresponding to an x coordinate on a particular document line. + * Ensure is between whole characters when document is in multi-byte or UTF-8 mode. + */ +int Editor::PositionFromLineX(int lineDoc, int x) { + RefreshStyleData(); + if (lineDoc >= pdoc->LinesTotal()) + return pdoc->Length(); + //Platform::DebugPrintf("Position of (%d,%d) line = %d top=%d\n", pt.x, pt.y, line, topLine); + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc)); + int retVal = 0; + if (surface && ll) { + unsigned int posLineStart = pdoc->LineStart(lineDoc); + LayoutLine(lineDoc, surface, vs, ll, wrapWidth); + retVal = ll->numCharsInLine + posLineStart; + int subLine = 0; + int lineStart = ll->LineStart(subLine); + int lineEnd = ll->LineStart(subLine + 1); + int subLineStart = ll->positions[lineStart]; + + if (actualWrapVisualStartIndent != 0) { + if (lineStart != 0) // Wrapped + x -= actualWrapVisualStartIndent * vs.aveCharWidth; + } + for (int i = lineStart; i < lineEnd; i++) { + if (x < (((ll->positions[i] + ll->positions[i + 1]) / 2) - subLineStart) || + IsEOLChar(ll->chars[i])) { + retVal = pdoc->MovePositionOutsideChar(i + posLineStart, 1); + break; + } + } + } + return retVal; +} + +/** + * If painting then abandon the painting because a wider redraw is needed. + * @return true if calling code should stop drawing. + */ +bool Editor::AbandonPaint() { + if ((paintState == painting) && !paintingAllText) { + paintState = paintAbandoned; + } + return paintState == paintAbandoned; +} + +void Editor::RedrawRect(PRectangle rc) { + //Platform::DebugPrintf("Redraw %0d,%0d - %0d,%0d\n", rc.left, rc.top, rc.right, rc.bottom); + + // Clip the redraw rectangle into the client area + PRectangle rcClient = GetClientRectangle(); + if (rc.top < rcClient.top) + rc.top = rcClient.top; + if (rc.bottom > rcClient.bottom) + rc.bottom = rcClient.bottom; + if (rc.left < rcClient.left) + rc.left = rcClient.left; + if (rc.right > rcClient.right) + rc.right = rcClient.right; + + if ((rc.bottom > rc.top) && (rc.right > rc.left)) { + wMain.InvalidateRectangle(rc); + } +} + +void Editor::Redraw() { + //Platform::DebugPrintf("Redraw all\n"); + PRectangle rcClient = GetClientRectangle(); + wMain.InvalidateRectangle(rcClient); + //wMain.InvalidateAll(); +} + +void Editor::RedrawSelMargin(int line) { + if (!AbandonPaint()) { + if (vs.maskInLine) { + Redraw(); + } else { + PRectangle rcSelMargin = GetClientRectangle(); + rcSelMargin.right = vs.fixedColumnWidth; + if (line != -1) { + int position = pdoc->LineStart(line); + PRectangle rcLine = RectangleFromRange(position, position); + rcSelMargin.top = rcLine.top; + rcSelMargin.bottom = rcLine.bottom; + } + wMain.InvalidateRectangle(rcSelMargin); + } + } +} + +PRectangle Editor::RectangleFromRange(int start, int end) { + int minPos = start; + if (minPos > end) + minPos = end; + int maxPos = start; + if (maxPos < end) + maxPos = end; + int minLine = cs.DisplayFromDoc(pdoc->LineFromPosition(minPos)); + int lineDocMax = pdoc->LineFromPosition(maxPos); + int maxLine = cs.DisplayFromDoc(lineDocMax) + cs.GetHeight(lineDocMax) - 1; + PRectangle rcClient = GetTextRectangle(); + PRectangle rc; + rc.left = vs.fixedColumnWidth; + rc.top = (minLine - topLine) * vs.lineHeight; + if (rc.top < 0) + rc.top = 0; + rc.right = rcClient.right; + rc.bottom = (maxLine - topLine + 1) * vs.lineHeight; + // Ensure PRectangle is within 16 bit space + rc.top = Platform::Clamp(rc.top, -32000, 32000); + rc.bottom = Platform::Clamp(rc.bottom, -32000, 32000); + + return rc; +} + +void Editor::InvalidateRange(int start, int end) { + RedrawRect(RectangleFromRange(start, end)); +} + +int Editor::CurrentPosition() { + return currentPos; +} + +bool Editor::SelectionEmpty() { + return anchor == currentPos; +} + +int Editor::SelectionStart() { + return Platform::Minimum(currentPos, anchor); +} + +int Editor::SelectionEnd() { + return Platform::Maximum(currentPos, anchor); +} + +void Editor::SetRectangularRange() { + if (selType == selRectangle) { + xStartSelect = XFromPosition(anchor); + xEndSelect = XFromPosition(currentPos); + } +} + +void Editor::InvalidateSelection(int currentPos_, int anchor_) { + int firstAffected = anchor; + if (firstAffected > currentPos) + firstAffected = currentPos; + if (firstAffected > anchor_) + firstAffected = anchor_; + if (firstAffected > currentPos_) + firstAffected = currentPos_; + int lastAffected = anchor; + if (lastAffected < currentPos) + lastAffected = currentPos; + if (lastAffected < anchor_) + lastAffected = anchor_; + if (lastAffected < (currentPos_ + 1)) // +1 ensures caret repainted + lastAffected = (currentPos_ + 1); + needUpdateUI = true; + InvalidateRange(firstAffected, lastAffected); +} + +void Editor::SetSelection(int currentPos_, int anchor_) { + currentPos_ = pdoc->ClampPositionIntoDocument(currentPos_); + anchor_ = pdoc->ClampPositionIntoDocument(anchor_); + if ((currentPos != currentPos_) || (anchor != anchor_)) { + InvalidateSelection(currentPos_, anchor_); + currentPos = currentPos_; + anchor = anchor_; + } + SetRectangularRange(); + ClaimSelection(); +} + +void Editor::SetSelection(int currentPos_) { + currentPos_ = pdoc->ClampPositionIntoDocument(currentPos_); + if (currentPos != currentPos_) { + InvalidateSelection(currentPos_, currentPos_); + currentPos = currentPos_; + } + SetRectangularRange(); + ClaimSelection(); +} + +void Editor::SetEmptySelection(int currentPos_) { + selType = selStream; + moveExtendsSelection = false; + SetSelection(currentPos_, currentPos_); +} + +bool Editor::RangeContainsProtected(int start, int end) const { + if (vs.ProtectionActive()) { + if (start > end) { + int t = start; + start = end; + end = t; + } + int mask = pdoc->stylingBitsMask; + for (int pos = start; pos < end; pos++) { + if (vs.styles[pdoc->StyleAt(pos) & mask].IsProtected()) + return true; + } + } + return false; +} + +bool Editor::SelectionContainsProtected() { + // DONE, but untested...: make support rectangular selection + bool scp = false; + if (selType == selStream) { + scp = RangeContainsProtected(anchor, currentPos); + } else { + SelectionLineIterator lineIterator(this); + while (lineIterator.Iterate()) { + if (RangeContainsProtected(lineIterator.startPos, lineIterator.endPos)) { + scp = true; + break; + } + } + } + return scp; +} + +/** + * Asks document to find a good position and then moves out of any invisible positions. + */ +int Editor::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) { + pos = pdoc->MovePositionOutsideChar(pos, moveDir, checkLineEnd); + if (vs.ProtectionActive()) { + int mask = pdoc->stylingBitsMask; + if (moveDir > 0) { + if ((pos > 0) && vs.styles[pdoc->StyleAt(pos - 1) & mask].IsProtected()) { + while ((pos < pdoc->Length()) && + (vs.styles[pdoc->StyleAt(pos) & mask].IsProtected())) + pos++; + } + } else if (moveDir < 0) { + if (vs.styles[pdoc->StyleAt(pos) & mask].IsProtected()) { + while ((pos > 0) && + (vs.styles[pdoc->StyleAt(pos - 1) & mask].IsProtected())) + pos--; + } + } + } + return pos; +} + +int Editor::MovePositionTo(int newPos, selTypes sel, bool ensureVisible) { + int delta = newPos - currentPos; + newPos = pdoc->ClampPositionIntoDocument(newPos); + newPos = MovePositionOutsideChar(newPos, delta); + if (sel != noSel) { + selType = sel; + } + if (sel != noSel || moveExtendsSelection) { + SetSelection(newPos); + } else { + SetEmptySelection(newPos); + } + ShowCaretAtCurrentPosition(); + if (ensureVisible) { + EnsureCaretVisible(); + } + NotifyMove(newPos); + return 0; +} + +int Editor::MovePositionSoVisible(int pos, int moveDir) { + pos = pdoc->ClampPositionIntoDocument(pos); + pos = MovePositionOutsideChar(pos, moveDir); + int lineDoc = pdoc->LineFromPosition(pos); + if (cs.GetVisible(lineDoc)) { + return pos; + } else { + int lineDisplay = cs.DisplayFromDoc(lineDoc); + if (moveDir > 0) { + // lineDisplay is already line before fold as lines in fold use display line of line after fold + lineDisplay = Platform::Clamp(lineDisplay, 0, cs.LinesDisplayed()); + return pdoc->LineStart(cs.DocFromDisplay(lineDisplay)); + } else { + lineDisplay = Platform::Clamp(lineDisplay - 1, 0, cs.LinesDisplayed()); + return pdoc->LineEnd(cs.DocFromDisplay(lineDisplay)); + } + } +} + +/** + * Choose the x position that the caret will try to stick to + * as it moves up and down. + */ +void Editor::SetLastXChosen() { + Point pt = LocationFromPosition(currentPos); + lastXChosen = pt.x; +} + +void Editor::ScrollTo(int line, bool moveThumb) { + int topLineNew = Platform::Clamp(line, 0, MaxScrollPos()); + if (topLineNew != topLine) { + // Try to optimise small scrolls + int linesToMove = topLine - topLineNew; + SetTopLine(topLineNew); + ShowCaretAtCurrentPosition(); + // Perform redraw rather than scroll if many lines would be redrawn anyway. +#ifndef UNDER_CE + if ((abs(linesToMove) <= 10) && (paintState == notPainting)) { + ScrollText(linesToMove); + } else { + Redraw(); + } +#else + Redraw(); +#endif + if (moveThumb) { + SetVerticalScrollPos(); + } + } +} + +void Editor::ScrollText(int /* linesToMove */) { + //Platform::DebugPrintf("Editor::ScrollText %d\n", linesToMove); + Redraw(); +} + +void Editor::HorizontalScrollTo(int xPos) { + //Platform::DebugPrintf("HorizontalScroll %d\n", xPos); + if (xPos < 0) + xPos = 0; + if ((wrapState == eWrapNone) && (xOffset != xPos)) { + xOffset = xPos; + SetHorizontalScrollPos(); + RedrawRect(GetClientRectangle()); + } +} + +void Editor::MoveCaretInsideView(bool ensureVisible) { + PRectangle rcClient = GetTextRectangle(); + Point pt = LocationFromPosition(currentPos); + if (pt.y < rcClient.top) { + MovePositionTo(PositionFromLocation( + Point(lastXChosen, rcClient.top)), + noSel, ensureVisible); + } else if ((pt.y + vs.lineHeight - 1) > rcClient.bottom) { + int yOfLastLineFullyDisplayed = rcClient.top + (LinesOnScreen() - 1) * vs.lineHeight; + MovePositionTo(PositionFromLocation( + Point(lastXChosen, rcClient.top + yOfLastLineFullyDisplayed)), + noSel, ensureVisible); + } +} + +int Editor::DisplayFromPosition(int pos) { + int lineDoc = pdoc->LineFromPosition(pos); + int lineDisplay = cs.DisplayFromDoc(lineDoc); + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc)); + if (surface && ll) { + LayoutLine(lineDoc, surface, vs, ll, wrapWidth); + unsigned int posLineStart = pdoc->LineStart(lineDoc); + int posInLine = pos - posLineStart; + lineDisplay--; // To make up for first increment ahead. + for (int subLine = 0; subLine < ll->lines; subLine++) { + if (posInLine >= ll->LineStart(subLine)) { + lineDisplay++; + } + } + } + return lineDisplay; +} + +/** + * Ensure the caret is reasonably visible in context. + * +Caret policy in SciTE + +If slop is set, we can define a slop value. +This value defines an unwanted zone (UZ) where the caret is... unwanted. +This zone is defined as a number of pixels near the vertical margins, +and as a number of lines near the horizontal margins. +By keeping the caret away from the edges, it is seen within its context, +so it is likely that the identifier that the caret is on can be completely seen, +and that the current line is seen with some of the lines following it which are +often dependent on that line. + +If strict is set, the policy is enforced... strictly. +The caret is centred on the display if slop is not set, +and cannot go in the UZ if slop is set. + +If jumps is set, the display is moved more energetically +so the caret can move in the same direction longer before the policy is applied again. +'3UZ' notation is used to indicate three time the size of the UZ as a distance to the margin. + +If even is not set, instead of having symmetrical UZs, +the left and bottom UZs are extended up to right and top UZs respectively. +This way, we favour the displaying of useful information: the begining of lines, +where most code reside, and the lines after the caret, eg. the body of a function. + + | | | | | +slop | strict | jumps | even | Caret can go to the margin | When reaching limitÝ(caret going out of + | | | | | visibility or going into the UZ) display is... +-----+--------+-------+------+--------------------------------------------+-------------------------------------------------------------- + 0 | 0 | 0 | 0 | Yes | moved to put caret on top/on right + 0 | 0 | 0 | 1 | Yes | moved by one position + 0 | 0 | 1 | 0 | Yes | moved to put caret on top/on right + 0 | 0 | 1 | 1 | Yes | centred on the caret + 0 | 1 | - | 0 | Caret is always on top/on right of display | - + 0 | 1 | - | 1 | No, caret is always centred | - + 1 | 0 | 0 | 0 | Yes | moved to put caret out of the asymmetrical UZ + 1 | 0 | 0 | 1 | Yes | moved to put caret out of the UZ + 1 | 0 | 1 | 0 | Yes | moved to put caret at 3UZ of the top or right margin + 1 | 0 | 1 | 1 | Yes | moved to put caret at 3UZ of the margin + 1 | 1 | - | 0 | Caret is always at UZ of top/right margin | - + 1 | 1 | 0 | 1 | No, kept out of UZ | moved by one position + 1 | 1 | 1 | 1 | No, kept out of UZ | moved to put caret at 3UZ of the margin +*/ +void Editor::EnsureCaretVisible(bool useMargin, bool vert, bool horiz) { + //Platform::DebugPrintf("EnsureCaretVisible %d %s\n", xOffset, useMargin ? " margin" : " "); + PRectangle rcClient = GetTextRectangle(); + //int rcClientFullWidth = rcClient.Width(); + int posCaret = currentPos; + if (posDrag >= 0) { + posCaret = posDrag; + } + Point pt = LocationFromPosition(posCaret); + Point ptBottomCaret = pt; + ptBottomCaret.y += vs.lineHeight - 1; + int lineCaret = DisplayFromPosition(posCaret); + bool bSlop, bStrict, bJump, bEven; + + // Vertical positioning + if (vert && (pt.y < rcClient.top || ptBottomCaret.y > rcClient.bottom || (caretYPolicy & CARET_STRICT) != 0)) { + int linesOnScreen = LinesOnScreen(); + int halfScreen = Platform::Maximum(linesOnScreen - 1, 2) / 2; + int newTopLine = topLine; + bSlop = (caretYPolicy & CARET_SLOP) != 0; + bStrict = (caretYPolicy & CARET_STRICT) != 0; + bJump = (caretYPolicy & CARET_JUMPS) != 0; + bEven = (caretYPolicy & CARET_EVEN) != 0; + + // It should be possible to scroll the window to show the caret, + // but this fails to remove the caret on GTK+ + if (bSlop) { // A margin is defined + int yMoveT, yMoveB; + if (bStrict) { + int yMarginT, yMarginB; + if (!useMargin) { + // In drag mode, avoid moves + // otherwise, a double click will select several lines. + yMarginT = yMarginB = 0; + } else { + // yMarginT must equal to caretYSlop, with a minimum of 1 and + // a maximum of slightly less than half the heigth of the text area. + yMarginT = Platform::Clamp(caretYSlop, 1, halfScreen); + if (bEven) { + yMarginB = yMarginT; + } else { + yMarginB = linesOnScreen - yMarginT - 1; + } + } + yMoveT = yMarginT; + if (bEven) { + if (bJump) { + yMoveT = Platform::Clamp(caretYSlop * 3, 1, halfScreen); + } + yMoveB = yMoveT; + } else { + yMoveB = linesOnScreen - yMoveT - 1; + } + if (lineCaret < topLine + yMarginT) { + // Caret goes too high + newTopLine = lineCaret - yMoveT; + } else if (lineCaret > topLine + linesOnScreen - 1 - yMarginB) { + // Caret goes too low + newTopLine = lineCaret - linesOnScreen + 1 + yMoveB; + } + } else { // Not strict + yMoveT = bJump ? caretYSlop * 3 : caretYSlop; + yMoveT = Platform::Clamp(yMoveT, 1, halfScreen); + if (bEven) { + yMoveB = yMoveT; + } else { + yMoveB = linesOnScreen - yMoveT - 1; + } + if (lineCaret < topLine) { + // Caret goes too high + newTopLine = lineCaret - yMoveT; + } else if (lineCaret > topLine + linesOnScreen - 1) { + // Caret goes too low + newTopLine = lineCaret - linesOnScreen + 1 + yMoveB; + } + } + } else { // No slop + if (!bStrict && !bJump) { + // Minimal move + if (lineCaret < topLine) { + // Caret goes too high + newTopLine = lineCaret; + } else if (lineCaret > topLine + linesOnScreen - 1) { + // Caret goes too low + if (bEven) { + newTopLine = lineCaret - linesOnScreen + 1; + } else { + newTopLine = lineCaret; + } + } + } else { // Strict or going out of display + if (bEven) { + // Always center caret + newTopLine = lineCaret - halfScreen; + } else { + // Always put caret on top of display + newTopLine = lineCaret; + } + } + } + newTopLine = Platform::Clamp(newTopLine, 0, MaxScrollPos()); + if (newTopLine != topLine) { + Redraw(); + SetTopLine(newTopLine); + SetVerticalScrollPos(); + } + } + + // Horizontal positioning + if (horiz && (wrapState == eWrapNone)) { + int halfScreen = Platform::Maximum(rcClient.Width() - 4, 4) / 2; + int xOffsetNew = xOffset; + bSlop = (caretXPolicy & CARET_SLOP) != 0; + bStrict = (caretXPolicy & CARET_STRICT) != 0; + bJump = (caretXPolicy & CARET_JUMPS) != 0; + bEven = (caretXPolicy & CARET_EVEN) != 0; + + if (bSlop) { // A margin is defined + int xMoveL, xMoveR; + if (bStrict) { + int xMarginL, xMarginR; + if (!useMargin) { + // In drag mode, avoid moves unless very near of the margin + // otherwise, a simple click will select text. + xMarginL = xMarginR = 2; + } else { + // xMargin must equal to caretXSlop, with a minimum of 2 and + // a maximum of slightly less than half the width of the text area. + xMarginR = Platform::Clamp(caretXSlop, 2, halfScreen); + if (bEven) { + xMarginL = xMarginR; + } else { + xMarginL = rcClient.Width() - xMarginR - 4; + } + } + if (bJump && bEven) { + // Jump is used only in even mode + xMoveL = xMoveR = Platform::Clamp(caretXSlop * 3, 1, halfScreen); + } else { + xMoveL = xMoveR = 0; // Not used, avoid a warning + } + if (pt.x < rcClient.left + xMarginL) { + // Caret is on the left of the display + if (bJump && bEven) { + xOffsetNew -= xMoveL; + } else { + // Move just enough to allow to display the caret + xOffsetNew -= (rcClient.left + xMarginL) - pt.x; + } + } else if (pt.x >= rcClient.right - xMarginR) { + // Caret is on the right of the display + if (bJump && bEven) { + xOffsetNew += xMoveR; + } else { + // Move just enough to allow to display the caret + xOffsetNew += pt.x - (rcClient.right - xMarginR) + 1; + } + } + } else { // Not strict + xMoveR = bJump ? caretXSlop * 3 : caretXSlop; + xMoveR = Platform::Clamp(xMoveR, 1, halfScreen); + if (bEven) { + xMoveL = xMoveR; + } else { + xMoveL = rcClient.Width() - xMoveR - 4; + } + if (pt.x < rcClient.left) { + // Caret is on the left of the display + xOffsetNew -= xMoveL; + } else if (pt.x >= rcClient.right) { + // Caret is on the right of the display + xOffsetNew += xMoveR; + } + } + } else { // No slop + if (bStrict || + (bJump && (pt.x < rcClient.left || pt.x >= rcClient.right))) { + // Strict or going out of display + if (bEven) { + // Center caret + xOffsetNew += pt.x - rcClient.left - halfScreen; + } else { + // Put caret on right + xOffsetNew += pt.x - rcClient.right + 1; + } + } else { + // Move just enough to allow to display the caret + if (pt.x < rcClient.left) { + // Caret is on the left of the display + if (bEven) { + xOffsetNew -= rcClient.left - pt.x; + } else { + xOffsetNew += pt.x - rcClient.right + 1; + } + } else if (pt.x >= rcClient.right) { + // Caret is on the right of the display + xOffsetNew += pt.x - rcClient.right + 1; + } + } + } + // In case of a jump (find result) largely out of display, adjust the offset to display the caret + if (pt.x + xOffset < rcClient.left + xOffsetNew) { + xOffsetNew = pt.x + xOffset - rcClient.left; + } else if (pt.x + xOffset >= rcClient.right + xOffsetNew) { + xOffsetNew = pt.x + xOffset - rcClient.right + 1; + } + if (xOffsetNew < 0) { + xOffsetNew = 0; + } + if (xOffset != xOffsetNew) { + xOffset = xOffsetNew; + if (xOffsetNew > 0) { + PRectangle rcText = GetTextRectangle(); + if (horizontalScrollBarVisible == true && + rcText.Width() + xOffset > scrollWidth) { + scrollWidth = xOffset + rcText.Width(); + SetScrollBars(); + } + } + SetHorizontalScrollPos(); + Redraw(); + } + } + UpdateSystemCaret(); +} + +void Editor::ShowCaretAtCurrentPosition() { + if (hasFocus) { + caret.active = true; + caret.on = true; + SetTicking(true); + } else { + caret.active = false; + caret.on = false; + } + InvalidateCaret(); +} + +void Editor::DropCaret() { + caret.active = false; + InvalidateCaret(); +} + +void Editor::InvalidateCaret() { + if (posDrag >= 0) + InvalidateRange(posDrag, posDrag + 1); + else + InvalidateRange(currentPos, currentPos + 1); + UpdateSystemCaret(); +} + +void Editor::UpdateSystemCaret() { +} + +void Editor::NeedWrapping(int docLineStart, int docLineEnd) { + docLineStart = Platform::Clamp(docLineStart, 0, pdoc->LinesTotal()); + if (wrapStart > docLineStart) { + wrapStart = docLineStart; + llc.Invalidate(LineLayout::llPositions); + } + if (wrapEnd < docLineEnd) { + wrapEnd = docLineEnd; + } + wrapEnd = Platform::Clamp(wrapEnd, 0, pdoc->LinesTotal()); + // Wrap lines during idle. + if ((wrapState != eWrapNone) && (wrapEnd != wrapStart)) { + SetIdle(true); + } +} + +// Check if wrapping needed and perform any needed wrapping. +// fullwrap: if true, all lines which need wrapping will be done, +// in this single call. +// priorityWrapLineStart: If greater than zero, all lines starting from +// here to 1 page + 100 lines past will be wrapped (even if there are +// more lines under wrapping process in idle). +// If it is neither fullwrap, nor priorityWrap, then 1 page + 100 lines will be +// wrapped, if there are any wrapping going on in idle. (Generally this +// condition is called only from idler). +// Return true if wrapping occurred. +bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) { + // If there are any pending wraps, do them during idle if possible. + int linesInOneCall = LinesOnScreen() + 100; + if (wrapState != eWrapNone) { + if (wrapStart < wrapEnd) { + if (!SetIdle(true)) { + // Idle processing not supported so full wrap required. + fullWrap = true; + } + } + if (!fullWrap && priorityWrapLineStart >= 0 && + // .. and if the paint window is outside pending wraps + (((priorityWrapLineStart + linesInOneCall) < wrapStart) || + (priorityWrapLineStart > wrapEnd))) { + // No priority wrap pending + return false; + } + } + int goodTopLine = topLine; + bool wrapOccurred = false; + if (wrapStart <= pdoc->LinesTotal()) { + if (wrapState == eWrapNone) { + if (wrapWidth != LineLayout::wrapWidthInfinite) { + wrapWidth = LineLayout::wrapWidthInfinite; + for (int lineDoc = 0; lineDoc < pdoc->LinesTotal(); lineDoc++) { + cs.SetHeight(lineDoc, 1); + } + wrapOccurred = true; + } + wrapStart = wrapLineLarge; + wrapEnd = wrapLineLarge; + } else { + if (wrapEnd >= pdoc->LinesTotal()) + wrapEnd = pdoc->LinesTotal(); + //ElapsedTime et; + int lineDocTop = cs.DocFromDisplay(topLine); + int subLineTop = topLine - cs.DisplayFromDoc(lineDocTop); + PRectangle rcTextArea = GetClientRectangle(); + rcTextArea.left = vs.fixedColumnWidth; + rcTextArea.right -= vs.rightMarginWidth; + wrapWidth = rcTextArea.Width(); + // Ensure all of the document is styled. + pdoc->EnsureStyledTo(pdoc->Length()); + RefreshStyleData(); + AutoSurface surface(this); + if (surface) { + bool priorityWrap = false; + int lastLineToWrap = wrapEnd; + int lineToWrap = wrapStart; + if (!fullWrap) { + if (priorityWrapLineStart >= 0) { + // This is a priority wrap. + lineToWrap = priorityWrapLineStart; + lastLineToWrap = priorityWrapLineStart + linesInOneCall; + priorityWrap = true; + } else { + // This is idle wrap. + lastLineToWrap = wrapStart + linesInOneCall; + } + if (lastLineToWrap >= wrapEnd) + lastLineToWrap = wrapEnd; + } // else do a fullWrap. + + // Platform::DebugPrintf("Wraplines: full = %d, priorityStart = %d (wrapping: %d to %d)\n", fullWrap, priorityWrapLineStart, lineToWrap, lastLineToWrap); + // Platform::DebugPrintf("Pending wraps: %d to %d\n", wrapStart, wrapEnd); + while (lineToWrap < lastLineToWrap) { + AutoLineLayout ll(llc, RetrieveLineLayout(lineToWrap)); + int linesWrapped = 1; + if (ll) { + LayoutLine(lineToWrap, surface, vs, ll, wrapWidth); + linesWrapped = ll->lines; + } + if (cs.SetHeight(lineToWrap, linesWrapped)) { + wrapOccurred = true; + } + lineToWrap++; + } + if (!priorityWrap) + wrapStart = lineToWrap; + // If wrapping is done, bring it to resting position + if (wrapStart >= wrapEnd) { + wrapStart = wrapLineLarge; + wrapEnd = wrapLineLarge; + } + } + goodTopLine = cs.DisplayFromDoc(lineDocTop); + if (subLineTop < cs.GetHeight(lineDocTop)) + goodTopLine += subLineTop; + else + goodTopLine += cs.GetHeight(lineDocTop); + //double durWrap = et.Duration(true); + //Platform::DebugPrintf("Wrap:%9.6g \n", durWrap); + } + } + if (wrapOccurred) { + SetScrollBars(); + SetTopLine(Platform::Clamp(goodTopLine, 0, MaxScrollPos())); + SetVerticalScrollPos(); + } + return wrapOccurred; +} + +void Editor::LinesJoin() { + if (!RangeContainsProtected(targetStart, targetEnd)) { + pdoc->BeginUndoAction(); + bool prevNonWS = true; + for (int pos = targetStart; pos < targetEnd; pos++) { + if (IsEOLChar(pdoc->CharAt(pos))) { + targetEnd -= pdoc->LenChar(pos); + pdoc->DelChar(pos); + if (prevNonWS) { + // Ensure at least one space separating previous lines + pdoc->InsertChar(pos, ' '); + targetEnd++; + } + } else { + prevNonWS = pdoc->CharAt(pos) != ' '; + } + } + pdoc->EndUndoAction(); + } +} + +const char *StringFromEOLMode(int eolMode) { + if (eolMode == SC_EOL_CRLF) { + return "\r\n"; + } else if (eolMode == SC_EOL_CR) { + return "\r"; + } else { + return "\n"; + } +} + +void Editor::LinesSplit(int pixelWidth) { + if (!RangeContainsProtected(targetStart, targetEnd)) { + if (pixelWidth == 0) { + PRectangle rcText = GetTextRectangle(); + pixelWidth = rcText.Width(); + } + int lineStart = pdoc->LineFromPosition(targetStart); + int lineEnd = pdoc->LineFromPosition(targetEnd); + const char *eol = StringFromEOLMode(pdoc->eolMode); + pdoc->BeginUndoAction(); + for (int line = lineStart; line <= lineEnd; line++) { + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(line)); + if (surface && ll) { + unsigned int posLineStart = pdoc->LineStart(line); + LayoutLine(line, surface, vs, ll, pixelWidth); + for (int subLine = 1; subLine < ll->lines; subLine++) { + pdoc->InsertCString(posLineStart + (subLine - 1) * strlen(eol) + + ll->LineStart(subLine), eol); + targetEnd += static_cast(strlen(eol)); + } + } + lineEnd = pdoc->LineFromPosition(targetEnd); + } + pdoc->EndUndoAction(); + } +} + +int Editor::SubstituteMarkerIfEmpty(int markerCheck, int markerDefault) { + if (vs.markers[markerCheck].markType == SC_MARK_EMPTY) + return markerDefault; + return markerCheck; +} + +// Avoid 64 bit compiler warnings. +// Scintilla does not support text buffers larger than 2**31 +static int istrlen(const char *s) { + return static_cast(strlen(s)); +} + +void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) { + if (vs.fixedColumnWidth == 0) + return; + + PRectangle rcMargin = GetClientRectangle(); + rcMargin.right = vs.fixedColumnWidth; + + if (!rc.Intersects(rcMargin)) + return; + + Surface *surface; + if (bufferedDraw) { + surface = pixmapSelMargin; + } else { + surface = surfWindow; + } + + PRectangle rcSelMargin = rcMargin; + rcSelMargin.right = rcMargin.left; + + for (int margin = 0; margin < vs.margins; margin++) { + if (vs.ms[margin].width > 0) { + + rcSelMargin.left = rcSelMargin.right; + rcSelMargin.right = rcSelMargin.left + vs.ms[margin].width; + + if (vs.ms[margin].style != SC_MARGIN_NUMBER) { + /* alternate scheme: + if (vs.ms[margin].mask & SC_MASK_FOLDERS) + surface->FillRectangle(rcSelMargin, vs.styles[STYLE_DEFAULT].back.allocated); + else + // Required because of special way brush is created for selection margin + surface->FillRectangle(rcSelMargin, pixmapSelPattern); + */ + if (vs.ms[margin].mask & SC_MASK_FOLDERS) + // Required because of special way brush is created for selection margin + surface->FillRectangle(rcSelMargin, *pixmapSelPattern); + else { + ColourAllocated colour; + switch (vs.ms[margin].style) { + case SC_MARGIN_BACK: + colour = vs.styles[STYLE_DEFAULT].back.allocated; + break; + case SC_MARGIN_FORE: + colour = vs.styles[STYLE_DEFAULT].fore.allocated; + break; + default: + colour = vs.styles[STYLE_LINENUMBER].back.allocated; + break; + } + surface->FillRectangle(rcSelMargin, colour); + } + } else { + surface->FillRectangle(rcSelMargin, vs.styles[STYLE_LINENUMBER].back.allocated); + } + + int visibleLine = topLine; + int yposScreen = 0; + + // Work out whether the top line is whitespace located after a + // lessening of fold level which implies a 'fold tail' but which should not + // be displayed until the last of a sequence of whitespace. + bool needWhiteClosure = false; + int level = pdoc->GetLevel(cs.DocFromDisplay(topLine)); + if (level & SC_FOLDLEVELWHITEFLAG) { + int lineBack = cs.DocFromDisplay(topLine); + int levelPrev = level; + while ((lineBack > 0) && (levelPrev & SC_FOLDLEVELWHITEFLAG)) { + lineBack--; + levelPrev = pdoc->GetLevel(lineBack); + } + if (!(levelPrev & SC_FOLDLEVELHEADERFLAG)) { + if ((level & SC_FOLDLEVELNUMBERMASK) < (levelPrev & SC_FOLDLEVELNUMBERMASK)) + needWhiteClosure = true; + } + } + + // Old code does not know about new markers needed to distinguish all cases + int folderOpenMid = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEROPENMID, + SC_MARKNUM_FOLDEROPEN); + int folderEnd = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEREND, + SC_MARKNUM_FOLDER); + + while ((visibleLine < cs.LinesDisplayed()) && yposScreen < rcMargin.bottom) { + + PLATFORM_ASSERT(visibleLine < cs.LinesDisplayed()); + + int lineDoc = cs.DocFromDisplay(visibleLine); + PLATFORM_ASSERT(cs.GetVisible(lineDoc)); + bool firstSubLine = visibleLine == cs.DisplayFromDoc(lineDoc); + + // Decide which fold indicator should be displayed + level = pdoc->GetLevel(lineDoc); + int levelNext = pdoc->GetLevel(lineDoc + 1); + int marks = pdoc->GetMark(lineDoc); + if (!firstSubLine) + marks = 0; + int levelNum = level & SC_FOLDLEVELNUMBERMASK; + int levelNextNum = levelNext & SC_FOLDLEVELNUMBERMASK; + if (level & SC_FOLDLEVELHEADERFLAG) { + if (firstSubLine) { + if (cs.GetExpanded(lineDoc)) { + if (levelNum == SC_FOLDLEVELBASE) + marks |= 1 << SC_MARKNUM_FOLDEROPEN; + else + marks |= 1 << folderOpenMid; + } else { + if (levelNum == SC_FOLDLEVELBASE) + marks |= 1 << SC_MARKNUM_FOLDER; + else + marks |= 1 << folderEnd; + } + } else { + marks |= 1 << SC_MARKNUM_FOLDERSUB; + } + needWhiteClosure = false; + } else if (level & SC_FOLDLEVELWHITEFLAG) { + if (needWhiteClosure) { + if (levelNext & SC_FOLDLEVELWHITEFLAG) { + marks |= 1 << SC_MARKNUM_FOLDERSUB; + } else if (levelNum > SC_FOLDLEVELBASE) { + marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL; + needWhiteClosure = false; + } else { + marks |= 1 << SC_MARKNUM_FOLDERTAIL; + needWhiteClosure = false; + } + } else if (levelNum > SC_FOLDLEVELBASE) { + if (levelNextNum < levelNum) { + if (levelNextNum > SC_FOLDLEVELBASE) { + marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL; + } else { + marks |= 1 << SC_MARKNUM_FOLDERTAIL; + } + } else { + marks |= 1 << SC_MARKNUM_FOLDERSUB; + } + } + } else if (levelNum > SC_FOLDLEVELBASE) { + if (levelNextNum < levelNum) { + needWhiteClosure = false; + if (levelNext & SC_FOLDLEVELWHITEFLAG) { + marks |= 1 << SC_MARKNUM_FOLDERSUB; + needWhiteClosure = true; + } else if (levelNextNum > SC_FOLDLEVELBASE) { + marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL; + } else { + marks |= 1 << SC_MARKNUM_FOLDERTAIL; + } + } else { + marks |= 1 << SC_MARKNUM_FOLDERSUB; + } + } + + marks &= vs.ms[margin].mask; + PRectangle rcMarker = rcSelMargin; + rcMarker.top = yposScreen; + rcMarker.bottom = yposScreen + vs.lineHeight; + if (vs.ms[margin].style == SC_MARGIN_NUMBER) { + char number[100]; + number[0] = '\0'; + if (firstSubLine) + sprintf(number, "%d", lineDoc + 1); + if (foldFlags & SC_FOLDFLAG_LEVELNUMBERS) { + int lev = pdoc->GetLevel(lineDoc); + sprintf(number, "%c%c %03X %03X", + (lev & SC_FOLDLEVELHEADERFLAG) ? 'H' : '_', + (lev & SC_FOLDLEVELWHITEFLAG) ? 'W' : '_', + lev & SC_FOLDLEVELNUMBERMASK, + lev >> 16 + ); + } + PRectangle rcNumber = rcMarker; + // Right justify + int width = surface->WidthText(vs.styles[STYLE_LINENUMBER].font, number, istrlen(number)); + int xpos = rcNumber.right - width - 3; + rcNumber.left = xpos; + surface->DrawTextNoClip(rcNumber, vs.styles[STYLE_LINENUMBER].font, + rcNumber.top + vs.maxAscent, number, istrlen(number), + vs.styles[STYLE_LINENUMBER].fore.allocated, + vs.styles[STYLE_LINENUMBER].back.allocated); + } + + if (marks) { + for (int markBit = 0; (markBit < 32) && marks; markBit++) { + if (marks & 1) { + vs.markers[markBit].Draw(surface, rcMarker, vs.styles[STYLE_LINENUMBER].font); + } + marks >>= 1; + } + } + + visibleLine++; + yposScreen += vs.lineHeight; + } + } + } + + PRectangle rcBlankMargin = rcMargin; + rcBlankMargin.left = rcSelMargin.right; + surface->FillRectangle(rcBlankMargin, vs.styles[STYLE_DEFAULT].back.allocated); + + if (bufferedDraw) { + surfWindow->Copy(rcMargin, Point(), *pixmapSelMargin); + } +} + +void DrawTabArrow(Surface *surface, PRectangle rcTab, int ymid) { + int ydiff = (rcTab.bottom - rcTab.top) / 2; + int xhead = rcTab.right - 1 - ydiff; + if (xhead <= rcTab.left) { + ydiff -= rcTab.left - xhead - 1; + xhead = rcTab.left - 1; + } + if ((rcTab.left + 2) < (rcTab.right - 1)) + surface->MoveTo(rcTab.left + 2, ymid); + else + surface->MoveTo(rcTab.right - 1, ymid); + surface->LineTo(rcTab.right - 1, ymid); + surface->LineTo(xhead, ymid - ydiff); + surface->MoveTo(rcTab.right - 1, ymid); + surface->LineTo(xhead, ymid + ydiff); +} + +static bool IsSpaceOrTab(char ch) { + return ch == ' ' || ch == '\t'; +} + +LineLayout *Editor::RetrieveLineLayout(int lineNumber) { + int posLineStart = pdoc->LineStart(lineNumber); + int posLineEnd = pdoc->LineStart(lineNumber + 1); + PLATFORM_ASSERT(posLineEnd >= posLineStart); + int lineCaret = pdoc->LineFromPosition(currentPos); + return llc.Retrieve(lineNumber, lineCaret, + posLineEnd - posLineStart, pdoc->GetStyleClock(), + LinesOnScreen() + 1, pdoc->LinesTotal()); +} + +/** + * Fill in the LineLayout data for the given line. + * Copy the given @a line and its styles from the document into local arrays. + * Also determine the x position at which each character starts. + */ +void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll, int width) { + if (!ll) + return; + PLATFORM_ASSERT(line < pdoc->LinesTotal()); + PLATFORM_ASSERT(ll->chars != NULL); + int posLineStart = pdoc->LineStart(line); + int posLineEnd = pdoc->LineStart(line + 1); + // If the line is very long, limit the treatment to a length that should fit in the viewport + if (posLineEnd > (posLineStart + ll->maxLineLength)) { + posLineEnd = posLineStart + ll->maxLineLength; + } + if (ll->validity == LineLayout::llCheckTextAndStyle) { + int lineLength = posLineEnd - posLineStart; + if (!vstyle.viewEOL) { + int cid = posLineEnd - 1; + while ((cid > posLineStart) && IsEOLChar(pdoc->CharAt(cid))) { + cid--; + lineLength--; + } + } + if (lineLength == ll->numCharsInLine) { + // See if chars, styles, indicators, are all the same + bool allSame = true; + const int styleMask = pdoc->stylingBitsMask; + // Check base line layout + char styleByte = 0; + int numCharsInLine = 0; + while (numCharsInLine < lineLength) { + int charInDoc = numCharsInLine + posLineStart; + char chDoc = pdoc->CharAt(charInDoc); + styleByte = pdoc->StyleAt(charInDoc); + allSame = allSame && + (ll->styles[numCharsInLine] == static_cast(styleByte & styleMask)); + allSame = allSame && + (ll->indicators[numCharsInLine] == static_cast(styleByte & ~styleMask)); + if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseMixed) + allSame = allSame && + (ll->chars[numCharsInLine] == chDoc); + else if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseLower) + allSame = allSame && + (ll->chars[numCharsInLine] == static_cast(tolower(chDoc))); + else // Style::caseUpper + allSame = allSame && + (ll->chars[numCharsInLine] == static_cast(toupper(chDoc))); + numCharsInLine++; + } + allSame = allSame && (ll->styles[numCharsInLine] == styleByte); // For eolFilled + if (allSame) { + ll->validity = LineLayout::llPositions; + } else { + ll->validity = LineLayout::llInvalid; + } + } else { + ll->validity = LineLayout::llInvalid; + } + } + if (ll->validity == LineLayout::llInvalid) { + ll->widthLine = LineLayout::wrapWidthInfinite; + ll->lines = 1; + int numCharsInLine = 0; + if (vstyle.edgeState == EDGE_BACKGROUND) { + ll->edgeColumn = pdoc->FindColumn(line, theEdge); + if (ll->edgeColumn >= posLineStart) { + ll->edgeColumn -= posLineStart; + } + } else { + ll->edgeColumn = -1; + } + + char styleByte = 0; + int styleMask = pdoc->stylingBitsMask; + ll->styleBitsSet = 0; + // Fill base line layout + for (int charInDoc = posLineStart; charInDoc < posLineEnd; charInDoc++) { + char chDoc = pdoc->CharAt(charInDoc); + styleByte = pdoc->StyleAt(charInDoc); + ll->styleBitsSet |= styleByte; + if (vstyle.viewEOL || (!IsEOLChar(chDoc))) { + ll->chars[numCharsInLine] = chDoc; + ll->styles[numCharsInLine] = static_cast(styleByte & styleMask); + ll->indicators[numCharsInLine] = static_cast(styleByte & ~styleMask); + if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseUpper) + ll->chars[numCharsInLine] = static_cast(toupper(chDoc)); + else if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseLower) + ll->chars[numCharsInLine] = static_cast(tolower(chDoc)); + numCharsInLine++; + } + } + ll->xHighlightGuide = 0; + // Extra element at the end of the line to hold end x position and act as + ll->chars[numCharsInLine] = 0; // Also triggers processing in the loops as this is a control character + ll->styles[numCharsInLine] = styleByte; // For eolFilled + ll->indicators[numCharsInLine] = 0; + + // Layout the line, determining the position of each character, + // with an extra element at the end for the end of the line. + int startseg = 0; // Start of the current segment, in char. number + int startsegx = 0; // Start of the current segment, in pixels + ll->positions[0] = 0; + unsigned int tabWidth = vstyle.spaceWidth * pdoc->tabInChars; + bool lastSegItalics = false; + Font &ctrlCharsFont = vstyle.styles[STYLE_CONTROLCHAR].font; + + int ctrlCharWidth[32] = {0}; + bool isControlNext = IsControlCharacter(ll->chars[0]); + for (int charInLine = 0; charInLine < numCharsInLine; charInLine++) { + bool isControl = isControlNext; + isControlNext = IsControlCharacter(ll->chars[charInLine + 1]); + if ((ll->styles[charInLine] != ll->styles[charInLine + 1]) || + isControl || isControlNext) { + ll->positions[startseg] = 0; + if (vstyle.styles[ll->styles[charInLine]].visible) { + if (isControl) { + if (ll->chars[charInLine] == '\t') { + ll->positions[charInLine + 1] = ((((startsegx + 2) / + tabWidth) + 1) * tabWidth) - startsegx; + } else if (controlCharSymbol < 32) { + if (ctrlCharWidth[ll->chars[charInLine]] == 0) { + const char *ctrlChar = ControlCharacterString(ll->chars[charInLine]); + // +3 For a blank on front and rounded edge each side: + ctrlCharWidth[ll->chars[charInLine]] = + surface->WidthText(ctrlCharsFont, ctrlChar, istrlen(ctrlChar)) + 3; + } + ll->positions[charInLine + 1] = ctrlCharWidth[ll->chars[charInLine]]; + } else { + char cc[2] = { static_cast(controlCharSymbol), '\0' }; + surface->MeasureWidths(ctrlCharsFont, cc, 1, + ll->positions + startseg + 1); + } + lastSegItalics = false; + } else { // Regular character + int lenSeg = charInLine - startseg + 1; + if ((lenSeg == 1) && (' ' == ll->chars[startseg])) { + lastSegItalics = false; + // Over half the segments are single characters and of these about half are space characters. + ll->positions[charInLine + 1] = vstyle.styles[ll->styles[charInLine]].spaceWidth; + } else { + lastSegItalics = vstyle.styles[ll->styles[charInLine]].italic; + surface->MeasureWidths(vstyle.styles[ll->styles[charInLine]].font, ll->chars + startseg, + lenSeg, ll->positions + startseg + 1); + } + } + } else { // invisible + for (int posToZero = startseg; posToZero <= (charInLine + 1); posToZero++) { + ll->positions[posToZero] = 0; + } + } + for (int posToIncrease = startseg; posToIncrease <= (charInLine + 1); posToIncrease++) { + ll->positions[posToIncrease] += startsegx; + } + startsegx = ll->positions[charInLine + 1]; + startseg = charInLine + 1; + } + } + // Small hack to make lines that end with italics not cut off the edge of the last character + if ((startseg > 0) && lastSegItalics) { + ll->positions[startseg] += 2; + } + ll->numCharsInLine = numCharsInLine; + ll->validity = LineLayout::llPositions; + } + // Hard to cope when too narrow, so just assume there is space + if (width < 20) { + width = 20; + } + if ((ll->validity == LineLayout::llPositions) || (ll->widthLine != width)) { + ll->widthLine = width; + if (width == LineLayout::wrapWidthInfinite) { + ll->lines = 1; + } else if (width > ll->positions[ll->numCharsInLine]) { + // Simple common case where line does not need wrapping. + ll->lines = 1; + } else { + if (wrapVisualFlags & SC_WRAPVISUALFLAG_END) { + width -= vstyle.aveCharWidth; // take into account the space for end wrap mark + } + ll->lines = 0; + // Calculate line start positions based upon width. + // For now this is simplistic - wraps on byte rather than character and + // in the middle of words. Should search for spaces or style changes. + int lastGoodBreak = 0; + int lastLineStart = 0; + int startOffset = 0; + int p = 0; + while (p < ll->numCharsInLine) { + if ((ll->positions[p + 1] - startOffset) >= width) { + if (lastGoodBreak == lastLineStart) { + // Try moving to start of last character + if (p > 0) { + lastGoodBreak = pdoc->MovePositionOutsideChar(p + posLineStart, -1) + - posLineStart; + } + if (lastGoodBreak == lastLineStart) { + // Ensure at least one character on line. + lastGoodBreak = pdoc->MovePositionOutsideChar(lastGoodBreak + posLineStart + 1, 1) + - posLineStart; + } + } + lastLineStart = lastGoodBreak; + ll->lines++; + ll->SetLineStart(ll->lines, lastGoodBreak); + startOffset = ll->positions[lastGoodBreak]; + // take into account the space for start wrap mark and indent + startOffset -= actualWrapVisualStartIndent * vstyle.aveCharWidth; + p = lastGoodBreak + 1; + continue; + } + if (p > 0) { + if (wrapState == eWrapChar) { + lastGoodBreak = pdoc->MovePositionOutsideChar(p + posLineStart, -1) + - posLineStart; + p = pdoc->MovePositionOutsideChar(p + 1 + posLineStart, 1) - posLineStart; + continue; + } else if (ll->styles[p] != ll->styles[p - 1]) { + lastGoodBreak = p; + } else if (IsSpaceOrTab(ll->chars[p - 1]) && !IsSpaceOrTab(ll->chars[p])) { + lastGoodBreak = p; + } + } + p++; + } + ll->lines++; + } + ll->validity = LineLayout::llLines; + } +} + +ColourAllocated Editor::SelectionBackground(ViewStyle &vsDraw) { + return primarySelection ? vsDraw.selbackground.allocated : vsDraw.selbackground2.allocated; +} + +ColourAllocated Editor::TextBackground(ViewStyle &vsDraw, bool overrideBackground, + ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll) { + if (inSelection) { + if (vsDraw.selbackset && (vsDraw.selAlpha == SC_ALPHA_NOALPHA)) { + return SelectionBackground(vsDraw); + } + } else { + if ((vsDraw.edgeState == EDGE_BACKGROUND) && + (i >= ll->edgeColumn) && + !IsEOLChar(ll->chars[i])) + return vsDraw.edgecolour.allocated; + if (inHotspot && vsDraw.hotspotBackgroundSet) + return vsDraw.hotspotBackground.allocated; + if (overrideBackground) + return background; + } + return vsDraw.styles[styleMain].back.allocated; +} + +void Editor::DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight) { + Point from(0, ((lineVisible & 1) && (lineHeight & 1)) ? 1 : 0); + PRectangle rcCopyArea(start + 1, rcSegment.top, start + 2, rcSegment.bottom); + surface->Copy(rcCopyArea, from, + highlight ? *pixmapIndentGuideHighlight : *pixmapIndentGuide); +} + +void Editor::DrawWrapMarker(Surface *surface, PRectangle rcPlace, + bool isEndMarker, ColourAllocated wrapColour) { + surface->PenColour(wrapColour); + + enum { xa = 1 }; // gap before start + int w = rcPlace.right - rcPlace.left - xa - 1; + + bool xStraight = isEndMarker; // x-mirrored symbol for start marker + bool yStraight = true; + //bool yStraight= isEndMarker; // comment in for start marker y-mirrowed + + int x0 = xStraight ? rcPlace.left : rcPlace.right - 1; + int y0 = yStraight ? rcPlace.top : rcPlace.bottom - 1; + + int dy = (rcPlace.bottom - rcPlace.top) / 5; + int y = (rcPlace.bottom - rcPlace.top) / 2 + dy; + + struct Relative { + Surface *surface; + int xBase; + int xDir; + int yBase; + int yDir; + void MoveTo(int xRelative, int yRelative) { + surface->MoveTo(xBase + xDir * xRelative, yBase + yDir * yRelative); + } + void LineTo(int xRelative, int yRelative) { + surface->LineTo(xBase + xDir * xRelative, yBase + yDir * yRelative); + } + }; + Relative rel = {surface, x0, xStraight ? 1 : -1, y0, yStraight ? 1 : -1}; + + // arrow head + rel.MoveTo(xa, y); + rel.LineTo(xa + 2*w / 3, y - dy); + rel.MoveTo(xa, y); + rel.LineTo(xa + 2*w / 3, y + dy); + + // arrow body + rel.MoveTo(xa, y); + rel.LineTo(xa + w, y); + rel.LineTo(xa + w, y - 2 * dy); + rel.LineTo(xa - 1, // on windows lineto is exclusive endpoint, perhaps GTK not... + y - 2 * dy); +} + +static void SimpleAlphaRectangle(Surface *surface, PRectangle rc, ColourAllocated fill, int alpha) { + if (alpha != SC_ALPHA_NOALPHA) { + surface->AlphaRectangle(rc, 0, fill, alpha, fill, alpha, 0); + } +} + +void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll, + int line, int lineEnd, int xStart, int subLine, int subLineStart, + bool overrideBackground, ColourAllocated background, + bool drawWrapMarkEnd, ColourAllocated wrapColour) { + + int styleMask = pdoc->stylingBitsMask; + PRectangle rcSegment = rcLine; + + // Fill in a PRectangle representing the end of line characters + int xEol = ll->positions[lineEnd] - subLineStart; + rcSegment.left = xEol + xStart; + rcSegment.right = xEol + vsDraw.aveCharWidth + xStart; + int posLineEnd = pdoc->LineStart(line + 1); + bool eolInSelection = (subLine == (ll->lines - 1)) && + (posLineEnd > ll->selStart) && (posLineEnd <= ll->selEnd) && (ll->selStart != ll->selEnd); + + if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (vsDraw.selAlpha == SC_ALPHA_NOALPHA)) { + surface->FillRectangle(rcSegment, SelectionBackground(vsDraw)); + } else { + if (overrideBackground) { + surface->FillRectangle(rcSegment, background); + } else { + surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated); + } + if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (vsDraw.selAlpha != SC_ALPHA_NOALPHA)) { + SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw), vsDraw.selAlpha); + } + } + + rcSegment.left = xEol + vsDraw.aveCharWidth + xStart; + rcSegment.right = rcLine.right; + if (overrideBackground) { + surface->FillRectangle(rcSegment, background); + } else if (vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].eolFilled) { + surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated); + } else { + surface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back.allocated); + } + + if (vsDraw.selEOLFilled && eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (vsDraw.selAlpha == SC_ALPHA_NOALPHA)) { + surface->FillRectangle(rcSegment, SelectionBackground(vsDraw)); + } else { + if (overrideBackground) { + surface->FillRectangle(rcSegment, background); + } else if (vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].eolFilled) { + surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated); + } else { + surface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back.allocated); + } + if (vsDraw.selEOLFilled && eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (vsDraw.selAlpha != SC_ALPHA_NOALPHA)) { + SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw), vsDraw.selAlpha); + } + } + + if (drawWrapMarkEnd) { + PRectangle rcPlace = rcSegment; + + if (wrapVisualFlagsLocation & SC_WRAPVISUALFLAGLOC_END_BY_TEXT) { + rcPlace.left = xEol + xStart; + rcPlace.right = rcPlace.left + vsDraw.aveCharWidth; + } else { + // draw left of the right text margin, to avoid clipping by the current clip rect + rcPlace.right = rcLine.right - vs.rightMarginWidth; + rcPlace.left = rcPlace.right - vsDraw.aveCharWidth; + } + DrawWrapMarker(surface, rcPlace, true, wrapColour); + } +} + +void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart, + PRectangle rcLine, LineLayout *ll, int subLine) { + + PRectangle rcSegment = rcLine; + + // Using one font for all control characters so it can be controlled independently to ensure + // the box goes around the characters tightly. Seems to be no way to work out what height + // is taken by an individual character - internal leading gives varying results. + Font &ctrlCharsFont = vsDraw.styles[STYLE_CONTROLCHAR].font; + + // See if something overrides the line background color: Either if caret is on the line + // and background color is set for that, or if a marker is defined that forces its background + // color onto the line, or if a marker is defined but has no selection margin in which to + // display itself (as long as it's not an SC_MARK_EMPTY marker). These are checked in order + // with the earlier taking precedence. When multiple markers cause background override, + // the color for the highest numbered one is used. + bool overrideBackground = false; + ColourAllocated background; + if (caret.active && vsDraw.showCaretLineBackground && (vsDraw.caretLineAlpha == SC_ALPHA_NOALPHA) && ll->containsCaret) { + overrideBackground = true; + background = vsDraw.caretLineBackground.allocated; + } + if (!overrideBackground) { + int marks = pdoc->GetMark(line); + for (int markBit = 0; (markBit < 32) && marks; markBit++) { + if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) && + (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) { + background = vsDraw.markers[markBit].back.allocated; + overrideBackground = true; + } + marks >>= 1; + } + } + if (!overrideBackground) { + if (vsDraw.maskInLine) { + int marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine; + if (marksMasked) { + for (int markBit = 0; (markBit < 32) && marksMasked; markBit++) { + if ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY) && + (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) { + overrideBackground = true; + background = vsDraw.markers[markBit].back.allocated; + } + marksMasked >>= 1; + } + } + } + } + + bool drawWhitespaceBackground = (vsDraw.viewWhitespace != wsInvisible) && + (!overrideBackground) && (vsDraw.whitespaceBackgroundSet); + + bool inIndentation = subLine == 0; // Do not handle indentation except on first subline. + int indentWidth = pdoc->IndentSize() * vsDraw.spaceWidth; + + int posLineStart = pdoc->LineStart(line); + + int startseg = ll->LineStart(subLine); + int subLineStart = ll->positions[startseg]; + int lineStart = 0; + int lineEnd = 0; + if (subLine < ll->lines) { + lineStart = ll->LineStart(subLine); + lineEnd = ll->LineStart(subLine + 1); + } + + ColourAllocated wrapColour = vsDraw.styles[STYLE_DEFAULT].fore.allocated; + if (vsDraw.whitespaceForegroundSet) + wrapColour = vsDraw.whitespaceForeground.allocated; + + bool drawWrapMarkEnd = false; + + if (wrapVisualFlags & SC_WRAPVISUALFLAG_END) { + if (subLine + 1 < ll->lines) { + drawWrapMarkEnd = ll->LineStart(subLine + 1) != 0; + } + } + + if (actualWrapVisualStartIndent != 0) { + + bool continuedWrapLine = false; + if (subLine < ll->lines) { + continuedWrapLine = ll->LineStart(subLine) != 0; + } + + if (continuedWrapLine) { + // draw continuation rect + PRectangle rcPlace = rcSegment; + + rcPlace.left = ll->positions[startseg] + xStart - subLineStart; + rcPlace.right = rcPlace.left + actualWrapVisualStartIndent * vsDraw.aveCharWidth; + + // default bgnd here.. + surface->FillRectangle(rcSegment, overrideBackground ? background : + vsDraw.styles[STYLE_DEFAULT].back.allocated); + + // main line style would be below but this would be inconsistent with end markers + // also would possibly not be the style at wrap point + //int styleMain = ll->styles[lineStart]; + //surface->FillRectangle(rcPlace, vsDraw.styles[styleMain].back.allocated); + + if (wrapVisualFlags & SC_WRAPVISUALFLAG_START) { + + if (wrapVisualFlagsLocation & SC_WRAPVISUALFLAGLOC_START_BY_TEXT) + rcPlace.left = rcPlace.right - vsDraw.aveCharWidth; + else + rcPlace.right = rcPlace.left + vsDraw.aveCharWidth; + + DrawWrapMarker(surface, rcPlace, false, wrapColour); + } + + xStart += actualWrapVisualStartIndent * vsDraw.aveCharWidth; + } + } + + int i; + + // Background drawing loop + for (i = lineStart; twoPhaseDraw && (i < lineEnd); i++) { + + int iDoc = i + posLineStart; + // If there is the end of a style run for any reason + if ((ll->styles[i] != ll->styles[i + 1]) || + i == (lineEnd - 1) || + IsControlCharacter(ll->chars[i]) || IsControlCharacter(ll->chars[i + 1]) || + ((ll->selStart != ll->selEnd) && ((iDoc + 1 == ll->selStart) || (iDoc + 1 == ll->selEnd))) || + (i == (ll->edgeColumn - 1))) { + rcSegment.left = ll->positions[startseg] + xStart - subLineStart; + rcSegment.right = ll->positions[i + 1] + xStart - subLineStart; + // Only try to draw if really visible - enhances performance by not calling environment to + // draw strings that are completely past the right side of the window. + if ((rcSegment.left <= rcLine.right) && (rcSegment.right >= rcLine.left)) { + int styleMain = ll->styles[i]; + bool inSelection = (iDoc >= ll->selStart) && (iDoc < ll->selEnd) && (ll->selStart != ll->selEnd); + bool inHotspot = (ll->hsStart != -1) && (iDoc >= ll->hsStart) && (iDoc < ll->hsEnd); + ColourAllocated textBack = TextBackground(vsDraw, overrideBackground, background, inSelection, inHotspot, styleMain, i, ll); + if (ll->chars[i] == '\t') { + // Tab display + if (drawWhitespaceBackground && + (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways)) + textBack = vsDraw.whitespaceBackground.allocated; + surface->FillRectangle(rcSegment, textBack); + } else if (IsControlCharacter(ll->chars[i])) { + // Control character display + inIndentation = false; + surface->FillRectangle(rcSegment, textBack); + } else { + // Normal text display + surface->FillRectangle(rcSegment, textBack); + if (vsDraw.viewWhitespace != wsInvisible || + (inIndentation && vsDraw.viewIndentationGuides)) { + for (int cpos = 0; cpos <= i - startseg; cpos++) { + if (ll->chars[cpos + startseg] == ' ') { + if (drawWhitespaceBackground && + (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways)) { + PRectangle rcSpace(ll->positions[cpos + startseg] + xStart, rcSegment.top, + ll->positions[cpos + startseg + 1] + xStart, rcSegment.bottom); + surface->FillRectangle(rcSpace, vsDraw.whitespaceBackground.allocated); + } + } else { + inIndentation = false; + } + } + } + } + } else if (rcSegment.left > rcLine.right) { + break; + } + startseg = i + 1; + } + } + + if (twoPhaseDraw) { + DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd, + xStart, subLine, subLineStart, overrideBackground, background, + drawWrapMarkEnd, wrapColour); + } + + if (vsDraw.edgeState == EDGE_LINE) { + int edgeX = theEdge * vsDraw.spaceWidth; + rcSegment.left = edgeX + xStart; + rcSegment.right = rcSegment.left + 1; + surface->FillRectangle(rcSegment, vsDraw.edgecolour.allocated); + } + + inIndentation = subLine == 0; // Do not handle indentation except on first subline. + startseg = ll->LineStart(subLine); + // Foreground drawing loop + for (i = lineStart; i < lineEnd; i++) { + + int iDoc = i + posLineStart; + // If there is the end of a style run for any reason + if ((ll->styles[i] != ll->styles[i + 1]) || + i == (lineEnd - 1) || + IsControlCharacter(ll->chars[i]) || IsControlCharacter(ll->chars[i + 1]) || + ((ll->selStart != ll->selEnd) && ((iDoc + 1 == ll->selStart) || (iDoc + 1 == ll->selEnd))) || + (i == (ll->edgeColumn - 1))) { + rcSegment.left = ll->positions[startseg] + xStart - subLineStart; + rcSegment.right = ll->positions[i + 1] + xStart - subLineStart; + // Only try to draw if really visible - enhances performance by not calling environment to + // draw strings that are completely past the right side of the window. + if ((rcSegment.left <= rcLine.right) && (rcSegment.right >= rcLine.left)) { + int styleMain = ll->styles[i]; + ColourAllocated textFore = vsDraw.styles[styleMain].fore.allocated; + Font &textFont = vsDraw.styles[styleMain].font; + //hotspot foreground + if (ll->hsStart != -1 && iDoc >= ll->hsStart && iDoc < hsEnd) { + if (vsDraw.hotspotForegroundSet) + textFore = vsDraw.hotspotForeground.allocated; + } + bool inSelection = (iDoc >= ll->selStart) && (iDoc < ll->selEnd) && (ll->selStart != ll->selEnd); + if (inSelection && (vsDraw.selforeset)) { + textFore = vsDraw.selforeground.allocated; + } + bool inHotspot = (ll->hsStart != -1) && (iDoc >= ll->hsStart) && (iDoc < ll->hsEnd); + ColourAllocated textBack = TextBackground(vsDraw, overrideBackground, background, inSelection, inHotspot, styleMain, i, ll); + if (ll->chars[i] == '\t') { + // Tab display + if (!twoPhaseDraw) { + if (drawWhitespaceBackground && + (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways)) + textBack = vsDraw.whitespaceBackground.allocated; + surface->FillRectangle(rcSegment, textBack); + } + if ((vsDraw.viewWhitespace != wsInvisible) || ((inIndentation && vsDraw.viewIndentationGuides))) { + if (vsDraw.whitespaceForegroundSet) + textFore = vsDraw.whitespaceForeground.allocated; + surface->PenColour(textFore); + } + if (inIndentation && vsDraw.viewIndentationGuides) { + for (int xIG = ll->positions[i] / indentWidth * indentWidth; xIG < ll->positions[i + 1]; xIG += indentWidth) { + if (xIG >= ll->positions[i] && xIG > 0) { + DrawIndentGuide(surface, lineVisible, vsDraw.lineHeight, xIG + xStart, rcSegment, + (ll->xHighlightGuide == xIG)); + } + } + } + if (vsDraw.viewWhitespace != wsInvisible) { + if (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways) { + PRectangle rcTab(rcSegment.left + 1, rcSegment.top + 4, + rcSegment.right - 1, rcSegment.bottom - vsDraw.maxDescent); + DrawTabArrow(surface, rcTab, rcSegment.top + vsDraw.lineHeight / 2); + } + } + } else if (IsControlCharacter(ll->chars[i])) { + // Control character display + inIndentation = false; + if (controlCharSymbol < 32) { + // Draw the character + const char *ctrlChar = ControlCharacterString(ll->chars[i]); + if (!twoPhaseDraw) { + surface->FillRectangle(rcSegment, textBack); + } + int normalCharHeight = surface->Ascent(ctrlCharsFont) - + surface->InternalLeading(ctrlCharsFont); + PRectangle rcCChar = rcSegment; + rcCChar.left = rcCChar.left + 1; + rcCChar.top = rcSegment.top + vsDraw.maxAscent - normalCharHeight; + rcCChar.bottom = rcSegment.top + vsDraw.maxAscent + 1; + PRectangle rcCentral = rcCChar; + rcCentral.top++; + rcCentral.bottom--; + surface->FillRectangle(rcCentral, textFore); + PRectangle rcChar = rcCChar; + rcChar.left++; + rcChar.right--; + surface->DrawTextClipped(rcChar, ctrlCharsFont, + rcSegment.top + vsDraw.maxAscent, ctrlChar, istrlen(ctrlChar), + textBack, textFore); + } else { + char cc[2] = { static_cast(controlCharSymbol), '\0' }; + surface->DrawTextNoClip(rcSegment, ctrlCharsFont, + rcSegment.top + vsDraw.maxAscent, + cc, 1, textBack, textFore); + } + } else { + // Normal text display + if (vsDraw.styles[styleMain].visible) { + if (twoPhaseDraw) { + surface->DrawTextTransparent(rcSegment, textFont, + rcSegment.top + vsDraw.maxAscent, ll->chars + startseg, + i - startseg + 1, textFore); + } else { + surface->DrawTextNoClip(rcSegment, textFont, + rcSegment.top + vsDraw.maxAscent, ll->chars + startseg, + i - startseg + 1, textFore, textBack); + } + } + if (vsDraw.viewWhitespace != wsInvisible || + (inIndentation && vsDraw.viewIndentationGuides)) { + for (int cpos = 0; cpos <= i - startseg; cpos++) { + if (ll->chars[cpos + startseg] == ' ') { + if (vsDraw.viewWhitespace != wsInvisible) { + if (vsDraw.whitespaceForegroundSet) + textFore = vsDraw.whitespaceForeground.allocated; + if (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways) { + int xmid = (ll->positions[cpos + startseg] + ll->positions[cpos + startseg + 1]) / 2; + if (!twoPhaseDraw && drawWhitespaceBackground && + (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways)) { + textBack = vsDraw.whitespaceBackground.allocated; + PRectangle rcSpace(ll->positions[cpos + startseg] + xStart, rcSegment.top, ll->positions[cpos + startseg + 1] + xStart, rcSegment.bottom); + surface->FillRectangle(rcSpace, textBack); + } + PRectangle rcDot(xmid + xStart - subLineStart, rcSegment.top + vsDraw.lineHeight / 2, 0, 0); + rcDot.right = rcDot.left + 1; + rcDot.bottom = rcDot.top + 1; + surface->FillRectangle(rcDot, textFore); + } + } + if (inIndentation && vsDraw.viewIndentationGuides) { + int startSpace = ll->positions[cpos + startseg]; + if (startSpace > 0 && (startSpace % indentWidth == 0)) { + DrawIndentGuide(surface, lineVisible, vsDraw.lineHeight, startSpace + xStart, rcSegment, + (ll->xHighlightGuide == ll->positions[cpos + startseg])); + } + } + } else { + inIndentation = false; + } + } + } + } + if (ll->hsStart != -1 && vsDraw.hotspotUnderline && iDoc >= ll->hsStart && iDoc < ll->hsEnd ) { + PRectangle rcUL = rcSegment; + rcUL.top = rcUL.top + vsDraw.maxAscent + 1; + rcUL.bottom = rcUL.top + 1; + if (vsDraw.hotspotForegroundSet) + surface->FillRectangle(rcUL, vsDraw.hotspotForeground.allocated); + else + surface->FillRectangle(rcUL, textFore); + } else if (vsDraw.styles[styleMain].underline) { + PRectangle rcUL = rcSegment; + rcUL.top = rcUL.top + vsDraw.maxAscent + 1; + rcUL.bottom = rcUL.top + 1; + surface->FillRectangle(rcUL, textFore); + } + } else if (rcSegment.left > rcLine.right) { + break; + } + startseg = i + 1; + } + } + + // Draw indicators + // foreach indicator... + for (int indicnum = 0, mask = 1 << pdoc->stylingBits; mask < 0x100; indicnum++) { + if (!(mask & ll->styleBitsSet)) { + mask <<= 1; + continue; + } + int startPos = -1; + // foreach style pos in line... + for (int indicPos = lineStart; indicPos <= lineEnd; indicPos++) { + // look for starts... + if (startPos < 0) { + // NOT in indicator run, looking for START + if (indicPos < lineEnd && (ll->indicators[indicPos] & mask)) + startPos = indicPos; + } + // ... or ends + if (startPos >= 0) { + // IN indicator run, looking for END + if (indicPos >= lineEnd || !(ll->indicators[indicPos] & mask)) { + // AT end of indicator run, DRAW it! + PRectangle rcIndic( + ll->positions[startPos] + xStart - subLineStart, + rcLine.top + vsDraw.maxAscent, + ll->positions[indicPos] + xStart - subLineStart, + rcLine.top + vsDraw.maxAscent + 3); + vsDraw.indicators[indicnum].Draw(surface, rcIndic, rcLine); + // RESET control var + startPos = -1; + } + } + } + mask <<= 1; + } + // End of the drawing of the current line + if (!twoPhaseDraw) { + DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd, + xStart, subLine, subLineStart, overrideBackground, background, + drawWrapMarkEnd, wrapColour); + } + if ((vsDraw.selAlpha != SC_ALPHA_NOALPHA) && (ll->selStart >= 0) && (ll->selEnd >= 0)) { + int startPosSel = (ll->selStart < posLineStart) ? posLineStart : ll->selStart; + int endPosSel = (ll->selEnd < (lineEnd + posLineStart)) ? ll->selEnd : (lineEnd + posLineStart); + if (startPosSel < endPosSel) { + rcSegment.left = xStart + ll->positions[startPosSel - posLineStart] - subLineStart; + rcSegment.right = xStart + ll->positions[endPosSel - posLineStart] - subLineStart; + SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw), vsDraw.selAlpha); + } + } + + // Draw any translucent whole line states + rcSegment.left = xStart; + rcSegment.right = rcLine.right - 1; + if (caret.active && vsDraw.showCaretLineBackground && ll->containsCaret) { + SimpleAlphaRectangle(surface, rcSegment, vsDraw.caretLineBackground.allocated, vsDraw.caretLineAlpha); + } + int marks = pdoc->GetMark(line); + for (int markBit = 0; (markBit < 32) && marks; markBit++) { + if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND)) { + SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha); + } + marks >>= 1; + } + if (vsDraw.maskInLine) { + int marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine; + if (marksMasked) { + for (int markBit = 0; (markBit < 32) && marksMasked; markBit++) { + if ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY)) { + SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha); + } + marksMasked >>= 1; + } + } + } +} + +void Editor::RefreshPixMaps(Surface *surfaceWindow) { + if (!pixmapSelPattern->Initialised()) { + const int patternSize = 8; + pixmapSelPattern->InitPixMap(patternSize, patternSize, surfaceWindow, wMain.GetID()); + // This complex procedure is to reproduce the checkerboard dithered pattern used by windows + // for scroll bars and Visual Studio for its selection margin. The colour of this pattern is half + // way between the chrome colour and the chrome highlight colour making a nice transition + // between the window chrome and the content area. And it works in low colour depths. + PRectangle rcPattern(0, 0, patternSize, patternSize); + + // Initialize default colours based on the chrome colour scheme. Typically the highlight is white. + ColourAllocated colourFMFill = vs.selbar.allocated; + ColourAllocated colourFMStripes = vs.selbarlight.allocated; + + if (!(vs.selbarlight.desired == ColourDesired(0xff, 0xff, 0xff))) { + // User has chosen an unusual chrome colour scheme so just use the highlight edge colour. + // (Typically, the highlight colour is white.) + colourFMFill = vs.selbarlight.allocated; + } + + if (vs.foldmarginColourSet) { + // override default fold margin colour + colourFMFill = vs.foldmarginColour.allocated; + } + if (vs.foldmarginHighlightColourSet) { + // override default fold margin highlight colour + colourFMStripes = vs.foldmarginHighlightColour.allocated; + } + + pixmapSelPattern->FillRectangle(rcPattern, colourFMFill); + pixmapSelPattern->PenColour(colourFMStripes); + for (int stripe = 0; stripe < patternSize; stripe++) { + // Alternating 1 pixel stripes is same as checkerboard. + pixmapSelPattern->MoveTo(0, stripe * 2); + pixmapSelPattern->LineTo(patternSize, stripe * 2 - patternSize); + } + } + + if (!pixmapIndentGuide->Initialised()) { + // 1 extra pixel in height so can handle odd/even positions and so produce a continuous line + pixmapIndentGuide->InitPixMap(1, vs.lineHeight + 1, surfaceWindow, wMain.GetID()); + pixmapIndentGuideHighlight->InitPixMap(1, vs.lineHeight + 1, surfaceWindow, wMain.GetID()); + PRectangle rcIG(0, 0, 1, vs.lineHeight); + pixmapIndentGuide->FillRectangle(rcIG, vs.styles[STYLE_INDENTGUIDE].back.allocated); + pixmapIndentGuide->PenColour(vs.styles[STYLE_INDENTGUIDE].fore.allocated); + pixmapIndentGuideHighlight->FillRectangle(rcIG, vs.styles[STYLE_BRACELIGHT].back.allocated); + pixmapIndentGuideHighlight->PenColour(vs.styles[STYLE_BRACELIGHT].fore.allocated); + for (int stripe = 1; stripe < vs.lineHeight + 1; stripe += 2) { + pixmapIndentGuide->MoveTo(0, stripe); + pixmapIndentGuide->LineTo(2, stripe); + pixmapIndentGuideHighlight->MoveTo(0, stripe); + pixmapIndentGuideHighlight->LineTo(2, stripe); + } + } + + if (bufferedDraw) { + if (!pixmapLine->Initialised()) { + PRectangle rcClient = GetClientRectangle(); + pixmapLine->InitPixMap(rcClient.Width(), vs.lineHeight, + surfaceWindow, wMain.GetID()); + pixmapSelMargin->InitPixMap(vs.fixedColumnWidth, + rcClient.Height(), surfaceWindow, wMain.GetID()); + } + } +} + +void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) { + //Platform::DebugPrintf("Paint:%1d (%3d,%3d) ... (%3d,%3d)\n", + // paintingAllText, rcArea.left, rcArea.top, rcArea.right, rcArea.bottom); + + RefreshStyleData(); + RefreshPixMaps(surfaceWindow); + + PRectangle rcClient = GetClientRectangle(); + //Platform::DebugPrintf("Client: (%3d,%3d) ... (%3d,%3d) %d\n", + // rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); + + surfaceWindow->SetPalette(&palette, true); + pixmapLine->SetPalette(&palette, !hasFocus); + + int screenLinePaintFirst = rcArea.top / vs.lineHeight; + // The area to be painted plus one extra line is styled. + // The extra line is to determine when a style change, such as starting a comment flows on to other lines. + int lineStyleLast = topLine + (rcArea.bottom - 1) / vs.lineHeight + 1; + //Platform::DebugPrintf("Paint lines = %d .. %d\n", topLine + screenLinePaintFirst, lineStyleLast); + int endPosPaint = pdoc->Length(); + if (lineStyleLast < cs.LinesDisplayed()) + endPosPaint = pdoc->LineStart(cs.DocFromDisplay(lineStyleLast + 1)); + + int xStart = vs.fixedColumnWidth - xOffset; + int ypos = 0; + if (!bufferedDraw) + ypos += screenLinePaintFirst * vs.lineHeight; + int yposScreen = screenLinePaintFirst * vs.lineHeight; + + // Ensure we are styled as far as we are painting. + pdoc->EnsureStyledTo(endPosPaint); + bool paintAbandonedByStyling = paintState == paintAbandoned; + if (needUpdateUI) { + NotifyUpdateUI(); + needUpdateUI = false; + RefreshStyleData(); + RefreshPixMaps(surfaceWindow); + } + + // Call priority lines wrap on a window of lines which are likely + // to rendered with the following paint (that is wrap the visible + // lines first). + int startLineToWrap = cs.DocFromDisplay(topLine) - 5; + if (startLineToWrap < 0) + startLineToWrap = -1; + if (WrapLines(false, startLineToWrap)) { + // The wrapping process has changed the height of some lines so + // abandon this paint for a complete repaint. + if (AbandonPaint()) { + return; + } + RefreshPixMaps(surfaceWindow); // In case pixmaps invalidated by scrollbar change + } + PLATFORM_ASSERT(pixmapSelPattern->Initialised()); + + PaintSelMargin(surfaceWindow, rcArea); + + PRectangle rcRightMargin = rcClient; + rcRightMargin.left = rcRightMargin.right - vs.rightMarginWidth; + if (rcArea.Intersects(rcRightMargin)) { + surfaceWindow->FillRectangle(rcRightMargin, vs.styles[STYLE_DEFAULT].back.allocated); + } + + if (paintState == paintAbandoned) { + // Either styling or NotifyUpdateUI noticed that painting is needed + // outside the current painting rectangle + //Platform::DebugPrintf("Abandoning paint\n"); + if (wrapState != eWrapNone) { + if (paintAbandonedByStyling) { + // Styling has spilled over a line end, such as occurs by starting a multiline + // comment. The width of subsequent text may have changed, so rewrap. + NeedWrapping(cs.DocFromDisplay(topLine)); + } + } + return; + } + //Platform::DebugPrintf("start display %d, offset = %d\n", pdoc->Length(), xOffset); + + // Do the painting + if (rcArea.right > vs.fixedColumnWidth) { + + Surface *surface = surfaceWindow; + if (bufferedDraw) { + surface = pixmapLine; + PLATFORM_ASSERT(pixmapLine->Initialised()); + } + surface->SetUnicodeMode(IsUnicodeMode()); + surface->SetDBCSMode(CodePage()); + + int visibleLine = topLine + screenLinePaintFirst; + + int posCaret = currentPos; + if (posDrag >= 0) + posCaret = posDrag; + int lineCaret = pdoc->LineFromPosition(posCaret); + + // Remove selection margin from drawing area so text will not be drawn + // on it in unbuffered mode. + PRectangle rcTextArea = rcClient; + rcTextArea.left = vs.fixedColumnWidth; + rcTextArea.right -= vs.rightMarginWidth; + surfaceWindow->SetClip(rcTextArea); + + // Loop on visible lines + //double durLayout = 0.0; + //double durPaint = 0.0; + //double durCopy = 0.0; + //ElapsedTime etWhole; + int lineDocPrevious = -1; // Used to avoid laying out one document line multiple times + AutoLineLayout ll(llc, 0); + SelectionLineIterator lineIterator(this); + while (visibleLine < cs.LinesDisplayed() && yposScreen < rcArea.bottom) { + + int lineDoc = cs.DocFromDisplay(visibleLine); + // Only visible lines should be handled by the code within the loop + PLATFORM_ASSERT(cs.GetVisible(lineDoc)); + int lineStartSet = cs.DisplayFromDoc(lineDoc); + int subLine = visibleLine - lineStartSet; + + // Copy this line and its styles from the document into local arrays + // and determine the x position at which each character starts. + //ElapsedTime et; + if (lineDoc != lineDocPrevious) { + ll.Set(0); + // For rectangular selection this accesses the layout cache so should be after layout returned. + lineIterator.SetAt(lineDoc); + ll.Set(RetrieveLineLayout(lineDoc)); + LayoutLine(lineDoc, surface, vs, ll, wrapWidth); + lineDocPrevious = lineDoc; + } + //durLayout += et.Duration(true); + + if (ll) { + if (selType == selStream) { + ll->selStart = SelectionStart(); + ll->selEnd = SelectionEnd(); + } else { + ll->selStart = lineIterator.startPos; + ll->selEnd = lineIterator.endPos; + } + ll->containsCaret = lineDoc == lineCaret; + if (hideSelection) { + ll->selStart = -1; + ll->selEnd = -1; + ll->containsCaret = false; + } + + GetHotSpotRange(ll->hsStart, ll->hsEnd); + + PRectangle rcLine = rcClient; + rcLine.top = ypos; + rcLine.bottom = ypos + vs.lineHeight; + + Range rangeLine(pdoc->LineStart(lineDoc), pdoc->LineStart(lineDoc + 1)); + // Highlight the current braces if any + ll->SetBracesHighlight(rangeLine, braces, static_cast(bracesMatchStyle), + highlightGuideColumn * vs.spaceWidth); + + // Draw the line + DrawLine(surface, vs, lineDoc, visibleLine, xStart, rcLine, ll, subLine); + //durPaint += et.Duration(true); + + // Restore the previous styles for the brace highlights in case layout is in cache. + ll->RestoreBracesHighlight(rangeLine, braces); + + bool expanded = cs.GetExpanded(lineDoc); + if ((foldFlags & SC_FOLDFLAG_BOX) == 0) { + // Paint the line above the fold + if ((expanded && (foldFlags & SC_FOLDFLAG_LINEBEFORE_EXPANDED)) + || + (!expanded && (foldFlags & SC_FOLDFLAG_LINEBEFORE_CONTRACTED))) { + if (pdoc->GetLevel(lineDoc) & SC_FOLDLEVELHEADERFLAG) { + PRectangle rcFoldLine = rcLine; + rcFoldLine.bottom = rcFoldLine.top + 1; + surface->FillRectangle(rcFoldLine, vs.styles[STYLE_DEFAULT].fore.allocated); + } + } + // Paint the line below the fold + if ((expanded && (foldFlags & SC_FOLDFLAG_LINEAFTER_EXPANDED)) + || + (!expanded && (foldFlags & SC_FOLDFLAG_LINEAFTER_CONTRACTED))) { + if (pdoc->GetLevel(lineDoc) & SC_FOLDLEVELHEADERFLAG) { + PRectangle rcFoldLine = rcLine; + rcFoldLine.top = rcFoldLine.bottom - 1; + surface->FillRectangle(rcFoldLine, vs.styles[STYLE_DEFAULT].fore.allocated); + } + } + } else { + int FoldLevelCurr = (pdoc->GetLevel(lineDoc) & SC_FOLDLEVELNUMBERMASK) - SC_FOLDLEVELBASE; + int FoldLevelPrev = (pdoc->GetLevel(lineDoc - 1) & SC_FOLDLEVELNUMBERMASK) - SC_FOLDLEVELBASE; + int FoldLevelFlags = (pdoc->GetLevel(lineDoc) & ~SC_FOLDLEVELNUMBERMASK) & ~(0xFFF0000); + int indentationStep = pdoc->IndentSize(); + // Draw line above fold + if ((FoldLevelPrev < FoldLevelCurr) + || + (FoldLevelFlags & SC_FOLDLEVELBOXHEADERFLAG + && + (pdoc->GetLevel(lineDoc - 1) & SC_FOLDLEVELBOXFOOTERFLAG) == 0)) { + PRectangle rcFoldLine = rcLine; + rcFoldLine.bottom = rcFoldLine.top + 1; + rcFoldLine.left += xStart + FoldLevelCurr * vs.spaceWidth * indentationStep - 1; + surface->FillRectangle(rcFoldLine, vs.styles[STYLE_DEFAULT].fore.allocated); + } + + // Line below the fold (or below a contracted fold) + if (FoldLevelFlags & SC_FOLDLEVELBOXFOOTERFLAG + || + (!expanded && (foldFlags & SC_FOLDFLAG_LINEAFTER_CONTRACTED))) { + PRectangle rcFoldLine = rcLine; + rcFoldLine.top = rcFoldLine.bottom - 1; + rcFoldLine.left += xStart + (FoldLevelCurr) * vs.spaceWidth * indentationStep - 1; + surface->FillRectangle(rcFoldLine, vs.styles[STYLE_DEFAULT].fore.allocated); + } + + PRectangle rcBoxLine = rcLine; + // Draw vertical line for every fold level + for (int i = 0; i <= FoldLevelCurr; i++) { + rcBoxLine.left = xStart + i * vs.spaceWidth * indentationStep - 1; + rcBoxLine.right = rcBoxLine.left + 1; + surface->FillRectangle(rcBoxLine, vs.styles[STYLE_DEFAULT].fore.allocated); + } + } + + // Draw the Caret + if (lineDoc == lineCaret) { + int offset = Platform::Minimum(posCaret - rangeLine.start, ll->maxLineLength); + if ((offset >= ll->LineStart(subLine)) && + ((offset < ll->LineStart(subLine + 1)) || offset == ll->numCharsInLine)) { + int xposCaret = ll->positions[offset] - ll->positions[ll->LineStart(subLine)] + xStart; + + if (actualWrapVisualStartIndent != 0) { + int lineStart = ll->LineStart(subLine); + if (lineStart != 0) // Wrapped + xposCaret += actualWrapVisualStartIndent * vs.aveCharWidth; + } + int widthOverstrikeCaret; + if (posCaret == pdoc->Length()) { // At end of document + widthOverstrikeCaret = vs.aveCharWidth; + } else if ((posCaret - rangeLine.start) >= ll->numCharsInLine) { // At end of line + widthOverstrikeCaret = vs.aveCharWidth; + } else { + widthOverstrikeCaret = ll->positions[offset + 1] - ll->positions[offset]; + } + if (widthOverstrikeCaret < 3) // Make sure its visible + widthOverstrikeCaret = 3; + if (((caret.active && caret.on) || (posDrag >= 0)) && xposCaret >= 0) { + PRectangle rcCaret = rcLine; + int caretWidthOffset = 0; + if ((offset > 0) && (vs.caretWidth > 1)) + caretWidthOffset = 1; // Move back so overlaps both character cells. + if (posDrag >= 0) { + rcCaret.left = xposCaret - caretWidthOffset; + rcCaret.right = rcCaret.left + vs.caretWidth; + } else { + if (inOverstrike) { + rcCaret.top = rcCaret.bottom - 2; + rcCaret.left = xposCaret + 1; + rcCaret.right = rcCaret.left + widthOverstrikeCaret - 1; + } else { + rcCaret.left = xposCaret - caretWidthOffset; + rcCaret.right = rcCaret.left + vs.caretWidth; + } + } + surface->FillRectangle(rcCaret, vs.caretcolour.allocated); + } + } + } + + if (bufferedDraw) { + Point from(vs.fixedColumnWidth, 0); + PRectangle rcCopyArea(vs.fixedColumnWidth, yposScreen, + rcClient.right, yposScreen + vs.lineHeight); + surfaceWindow->Copy(rcCopyArea, from, *pixmapLine); + } + //durCopy += et.Duration(true); + } + + if (!bufferedDraw) { + ypos += vs.lineHeight; + } + + yposScreen += vs.lineHeight; + visibleLine++; + //gdk_flush(); + } + ll.Set(0); + //if (durPaint < 0.00000001) + // durPaint = 0.00000001; + + // Right column limit indicator + PRectangle rcBeyondEOF = rcClient; + rcBeyondEOF.left = vs.fixedColumnWidth; + rcBeyondEOF.right = rcBeyondEOF.right; + rcBeyondEOF.top = (cs.LinesDisplayed() - topLine) * vs.lineHeight; + if (rcBeyondEOF.top < rcBeyondEOF.bottom) { + surfaceWindow->FillRectangle(rcBeyondEOF, vs.styles[STYLE_DEFAULT].back.allocated); + if (vs.edgeState == EDGE_LINE) { + int edgeX = theEdge * vs.spaceWidth; + rcBeyondEOF.left = edgeX + xStart; + rcBeyondEOF.right = rcBeyondEOF.left + 1; + surfaceWindow->FillRectangle(rcBeyondEOF, vs.edgecolour.allocated); + } + } + //Platform::DebugPrintf( + //"Layout:%9.6g Paint:%9.6g Ratio:%9.6g Copy:%9.6g Total:%9.6g\n", + //durLayout, durPaint, durLayout / durPaint, durCopy, etWhole.Duration()); + NotifyPainted(); + } +} + +// Space (3 space characters) between line numbers and text when printing. +#define lineNumberPrintSpace " " + +ColourDesired InvertedLight(ColourDesired orig) { + unsigned int r = orig.GetRed(); + unsigned int g = orig.GetGreen(); + unsigned int b = orig.GetBlue(); + unsigned int l = (r + g + b) / 3; // There is a better calculation for this that matches human eye + unsigned int il = 0xff - l; + if (l == 0) + return ColourDesired(0xff, 0xff, 0xff); + r = r * il / l; + g = g * il / l; + b = b * il / l; + return ColourDesired(Platform::Minimum(r, 0xff), Platform::Minimum(g, 0xff), Platform::Minimum(b, 0xff)); +} + +// This is mostly copied from the Paint method but with some things omitted +// such as the margin markers, line numbers, selection and caret +// Should be merged back into a combined Draw method. +long Editor::FormatRange(bool draw, RangeToFormat *pfr) { + if (!pfr) + return 0; + + AutoSurface surface(pfr->hdc, this); + if (!surface) + return 0; + AutoSurface surfaceMeasure(pfr->hdcTarget, this); + if (!surfaceMeasure) { + return 0; + } + + ViewStyle vsPrint(vs); + + // Modify the view style for printing as do not normally want any of the transient features to be printed + // Printing supports only the line number margin. + int lineNumberIndex = -1; + for (int margin = 0; margin < ViewStyle::margins; margin++) { + if ((vsPrint.ms[margin].style == SC_MARGIN_NUMBER) && (vsPrint.ms[margin].width > 0)) { + lineNumberIndex = margin; + } else { + vsPrint.ms[margin].width = 0; + } + } + vsPrint.showMarkedLines = false; + vsPrint.fixedColumnWidth = 0; + vsPrint.zoomLevel = printMagnification; + vsPrint.viewIndentationGuides = false; + // Don't show the selection when printing + vsPrint.selbackset = false; + vsPrint.selforeset = false; + vsPrint.selAlpha = SC_ALPHA_NOALPHA; + vsPrint.whitespaceBackgroundSet = false; + vsPrint.whitespaceForegroundSet = false; + vsPrint.showCaretLineBackground = false; + + // Set colours for printing according to users settings + for (int sty = 0;sty <= STYLE_MAX;sty++) { + if (printColourMode == SC_PRINT_INVERTLIGHT) { + vsPrint.styles[sty].fore.desired = InvertedLight(vsPrint.styles[sty].fore.desired); + vsPrint.styles[sty].back.desired = InvertedLight(vsPrint.styles[sty].back.desired); + } else if (printColourMode == SC_PRINT_BLACKONWHITE) { + vsPrint.styles[sty].fore.desired = ColourDesired(0, 0, 0); + vsPrint.styles[sty].back.desired = ColourDesired(0xff, 0xff, 0xff); + } else if (printColourMode == SC_PRINT_COLOURONWHITE) { + vsPrint.styles[sty].back.desired = ColourDesired(0xff, 0xff, 0xff); + } else if (printColourMode == SC_PRINT_COLOURONWHITEDEFAULTBG) { + if (sty <= STYLE_DEFAULT) { + vsPrint.styles[sty].back.desired = ColourDesired(0xff, 0xff, 0xff); + } + } + } + // White background for the line numbers + vsPrint.styles[STYLE_LINENUMBER].back.desired = ColourDesired(0xff, 0xff, 0xff); + + vsPrint.Refresh(*surfaceMeasure); + // Determining width must hapen after fonts have been realised in Refresh + int lineNumberWidth = 0; + if (lineNumberIndex >= 0) { + lineNumberWidth = surfaceMeasure->WidthText(vsPrint.styles[STYLE_LINENUMBER].font, + "99999" lineNumberPrintSpace, 5 + istrlen(lineNumberPrintSpace)); + vsPrint.ms[lineNumberIndex].width = lineNumberWidth; + vsPrint.Refresh(*surfaceMeasure); // Recalculate fixedColumnWidth + } + // Ensure colours are set up + vsPrint.RefreshColourPalette(palette, true); + vsPrint.RefreshColourPalette(palette, false); + + int linePrintStart = pdoc->LineFromPosition(pfr->chrg.cpMin); + int linePrintLast = linePrintStart + (pfr->rc.bottom - pfr->rc.top) / vsPrint.lineHeight - 1; + if (linePrintLast < linePrintStart) + linePrintLast = linePrintStart; + int linePrintMax = pdoc->LineFromPosition(pfr->chrg.cpMax); + if (linePrintLast > linePrintMax) + linePrintLast = linePrintMax; + //Platform::DebugPrintf("Formatting lines=[%0d,%0d,%0d] top=%0d bottom=%0d line=%0d %0d\n", + // linePrintStart, linePrintLast, linePrintMax, pfr->rc.top, pfr->rc.bottom, vsPrint.lineHeight, + // surfaceMeasure->Height(vsPrint.styles[STYLE_LINENUMBER].font)); + int endPosPrint = pdoc->Length(); + if (linePrintLast < pdoc->LinesTotal()) + endPosPrint = pdoc->LineStart(linePrintLast + 1); + + // Ensure we are styled to where we are formatting. + pdoc->EnsureStyledTo(endPosPrint); + + int xStart = vsPrint.fixedColumnWidth + pfr->rc.left; + int ypos = pfr->rc.top; + + int lineDoc = linePrintStart; + + int nPrintPos = pfr->chrg.cpMin; + int visibleLine = 0; + int widthPrint = pfr->rc.Width() - vsPrint.fixedColumnWidth; + if (printWrapState == eWrapNone) + widthPrint = LineLayout::wrapWidthInfinite; + + while (lineDoc <= linePrintLast && ypos < pfr->rc.bottom) { + + // When printing, the hdc and hdcTarget may be the same, so + // changing the state of surfaceMeasure may change the underlying + // state of surface. Therefore, any cached state is discarded before + // using each surface. + surfaceMeasure->FlushCachedState(); + + // Copy this line and its styles from the document into local arrays + // and determine the x position at which each character starts. + LineLayout ll(8000); + LayoutLine(lineDoc, surfaceMeasure, vsPrint, &ll, widthPrint); + + ll.selStart = -1; + ll.selEnd = -1; + ll.containsCaret = false; + + PRectangle rcLine; + rcLine.left = pfr->rc.left; + rcLine.top = ypos; + rcLine.right = pfr->rc.right - 1; + rcLine.bottom = ypos + vsPrint.lineHeight; + + // When document line is wrapped over multiple display lines, find where + // to start printing from to ensure a particular position is on the first + // line of the page. + if (visibleLine == 0) { + int startWithinLine = nPrintPos - pdoc->LineStart(lineDoc); + for (int iwl = 0; iwl < ll.lines - 1; iwl++) { + if (ll.LineStart(iwl) <= startWithinLine && ll.LineStart(iwl + 1) >= startWithinLine) { + visibleLine = -iwl; + } + } + + if (ll.lines > 1 && startWithinLine >= ll.LineStart(ll.lines - 1)) { + visibleLine = -(ll.lines - 1); + } + } + + if (draw && lineNumberWidth && + (ypos + vsPrint.lineHeight <= pfr->rc.bottom) && + (visibleLine >= 0)) { + char number[100]; + sprintf(number, "%d" lineNumberPrintSpace, lineDoc + 1); + PRectangle rcNumber = rcLine; + rcNumber.right = rcNumber.left + lineNumberWidth; + // Right justify + rcNumber.left = rcNumber.right - surfaceMeasure->WidthText( + vsPrint.styles[STYLE_LINENUMBER].font, number, istrlen(number)); + surface->FlushCachedState(); + surface->DrawTextNoClip(rcNumber, vsPrint.styles[STYLE_LINENUMBER].font, + ypos + vsPrint.maxAscent, number, istrlen(number), + vsPrint.styles[STYLE_LINENUMBER].fore.allocated, + vsPrint.styles[STYLE_LINENUMBER].back.allocated); + } + + // Draw the line + surface->FlushCachedState(); + + for (int iwl = 0; iwl < ll.lines; iwl++) { + if (ypos + vsPrint.lineHeight <= pfr->rc.bottom) { + if (visibleLine >= 0) { + if (draw) { + rcLine.top = ypos; + rcLine.bottom = ypos + vsPrint.lineHeight; + DrawLine(surface, vsPrint, lineDoc, visibleLine, xStart, rcLine, &ll, iwl); + } + ypos += vsPrint.lineHeight; + } + visibleLine++; + if (iwl == ll.lines - 1) + nPrintPos = pdoc->LineStart(lineDoc + 1); + else + nPrintPos += ll.LineStart(iwl + 1) - ll.LineStart(iwl); + } + } + + ++lineDoc; + } + + return nPrintPos; +} + +int Editor::TextWidth(int style, const char *text) { + RefreshStyleData(); + AutoSurface surface(this); + if (surface) { + return surface->WidthText(vs.styles[style].font, text, istrlen(text)); + } else { + return 1; + } +} + +// Empty method is overridden on GTK+ to show / hide scrollbars +void Editor::ReconfigureScrollBars() {} + +void Editor::SetScrollBars() { + RefreshStyleData(); + + int nMax = MaxScrollPos(); + int nPage = LinesOnScreen(); + bool modified = ModifyScrollBars(nMax + nPage - 1, nPage); + if (modified) { + DwellEnd(true); + } + + // TODO: ensure always showing as many lines as possible + // May not be, if, for example, window made larger + if (topLine > MaxScrollPos()) { + SetTopLine(Platform::Clamp(topLine, 0, MaxScrollPos())); + SetVerticalScrollPos(); + Redraw(); + } + if (modified) { + if (!AbandonPaint()) + Redraw(); + } + //Platform::DebugPrintf("end max = %d page = %d\n", nMax, nPage); +} + +void Editor::ChangeSize() { + DropGraphics(); + SetScrollBars(); + if (wrapState != eWrapNone) { + PRectangle rcTextArea = GetClientRectangle(); + rcTextArea.left = vs.fixedColumnWidth; + rcTextArea.right -= vs.rightMarginWidth; + if (wrapWidth != rcTextArea.Width()) { + NeedWrapping(); + Redraw(); + } + } +} + +void Editor::AddChar(char ch) { + char s[2]; + s[0] = ch; + s[1] = '\0'; + AddCharUTF(s, 1); +} + +void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { + bool wasSelection = currentPos != anchor; + + ClearSelection(); + bool charReplaceAction = false; + if (inOverstrike && !wasSelection && !RangeContainsProtected(currentPos, currentPos + 1)) { + if (currentPos < (pdoc->Length())) { + if (!IsEOLChar(pdoc->CharAt(currentPos))) { + charReplaceAction = true; + pdoc->BeginUndoAction(); + pdoc->DelChar(currentPos); + } + } + } + if (pdoc->InsertString(currentPos, s, len)) { + SetEmptySelection(currentPos + len); + } + if (charReplaceAction) { + pdoc->EndUndoAction(); + } + EnsureCaretVisible(); + // Avoid blinking during rapid typing: + ShowCaretAtCurrentPosition(); + if (!caretSticky) { + SetLastXChosen(); + } + + if (treatAsDBCS) { + NotifyChar((static_cast(s[0]) << 8) | + static_cast(s[1])); + } else { + int byte = static_cast(s[0]); + if ((byte < 0xC0) || (1 == len)) { + // Handles UTF-8 characters between 0x01 and 0x7F and single byte + // characters when not in UTF-8 mode. + // Also treats \0 and naked trail bytes 0x80 to 0xBF as valid + // characters representing themselves. + } else { + // Unroll 1 to 3 byte UTF-8 sequences. See reference data at: + // http://www.cl.cam.ac.uk/~mgk25/unicode.html + // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt + if (byte < 0xE0) { + int byte2 = static_cast(s[1]); + if ((byte2 & 0xC0) == 0x80) { + // Two-byte-character lead-byte followed by a trail-byte. + byte = (((byte & 0x1F) << 6) | (byte2 & 0x3F)); + } + // A two-byte-character lead-byte not followed by trail-byte + // represents itself. + } else if (byte < 0xF0) { + int byte2 = static_cast(s[1]); + int byte3 = static_cast(s[2]); + if (((byte2 & 0xC0) == 0x80) && ((byte3 & 0xC0) == 0x80)) { + // Three-byte-character lead byte followed by two trail bytes. + byte = (((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | + (byte3 & 0x3F)); + } + // A three-byte-character lead-byte not followed by two trail-bytes + // represents itself. + } + } + NotifyChar(byte); + } +} + +void Editor::ClearSelection() { + if (!SelectionContainsProtected()) { + int startPos = SelectionStart(); + if (selType == selStream) { + unsigned int chars = SelectionEnd() - startPos; + if (0 != chars) { + pdoc->BeginUndoAction(); + pdoc->DeleteChars(startPos, chars); + pdoc->EndUndoAction(); + } + } else { + pdoc->BeginUndoAction(); + SelectionLineIterator lineIterator(this, false); + while (lineIterator.Iterate()) { + startPos = lineIterator.startPos; + unsigned int chars = lineIterator.endPos - startPos; + if (0 != chars) { + pdoc->DeleteChars(startPos, chars); + } + } + pdoc->EndUndoAction(); + selType = selStream; + } + SetEmptySelection(startPos); + } +} + +void Editor::ClearAll() { + pdoc->BeginUndoAction(); + if (0 != pdoc->Length()) { + pdoc->DeleteChars(0, pdoc->Length()); + } + if (!pdoc->IsReadOnly()) { + cs.Clear(); + } + pdoc->EndUndoAction(); + anchor = 0; + currentPos = 0; + SetTopLine(0); + SetVerticalScrollPos(); + InvalidateStyleRedraw(); +} + +void Editor::ClearDocumentStyle() { + pdoc->StartStyling(0, '\377'); + pdoc->SetStyleFor(pdoc->Length(), 0); + cs.ShowAll(); + pdoc->ClearLevels(); +} + +void Editor::Cut() { + if (!pdoc->IsReadOnly() && !SelectionContainsProtected()) { + Copy(); + ClearSelection(); + } +} + +void Editor::PasteRectangular(int pos, const char *ptr, int len) { + if (pdoc->IsReadOnly() || SelectionContainsProtected()) { + return; + } + currentPos = pos; + int xInsert = XFromPosition(currentPos); + int line = pdoc->LineFromPosition(currentPos); + bool prevCr = false; + pdoc->BeginUndoAction(); + for (int i = 0; i < len; i++) { + if (IsEOLChar(ptr[i])) { + if ((ptr[i] == '\r') || (!prevCr)) + line++; + if (line >= pdoc->LinesTotal()) { + if (pdoc->eolMode != SC_EOL_LF) + pdoc->InsertChar(pdoc->Length(), '\r'); + if (pdoc->eolMode != SC_EOL_CR) + pdoc->InsertChar(pdoc->Length(), '\n'); + } + // Pad the end of lines with spaces if required + currentPos = PositionFromLineX(line, xInsert); + if ((XFromPosition(currentPos) < xInsert) && (i + 1 < len)) { + for (int i = 0; i < xInsert - XFromPosition(currentPos); i++) { + pdoc->InsertChar(currentPos, ' '); + currentPos++; + } + } + prevCr = ptr[i] == '\r'; + } else { + pdoc->InsertString(currentPos, ptr + i, 1); + currentPos++; + prevCr = false; + } + } + pdoc->EndUndoAction(); + SetEmptySelection(pos); +} + +bool Editor::CanPaste() { + return !pdoc->IsReadOnly() && !SelectionContainsProtected(); +} + +void Editor::Clear() { + if (currentPos == anchor) { + if (!RangeContainsProtected(currentPos, currentPos + 1)) { + DelChar(); + } + } else { + ClearSelection(); + } + SetEmptySelection(currentPos); +} + +void Editor::SelectAll() { + SetSelection(0, pdoc->Length()); + Redraw(); +} + +void Editor::Undo() { + if (pdoc->CanUndo()) { + InvalidateCaret(); + int newPos = pdoc->Undo(); + if (newPos >= 0) + SetEmptySelection(newPos); + EnsureCaretVisible(); + } +} + +void Editor::Redo() { + if (pdoc->CanRedo()) { + int newPos = pdoc->Redo(); + if (newPos >= 0) + SetEmptySelection(newPos); + EnsureCaretVisible(); + } +} + +void Editor::DelChar() { + if (!RangeContainsProtected(currentPos, currentPos + 1)) { + pdoc->DelChar(currentPos); + } + // Avoid blinking during rapid typing: + ShowCaretAtCurrentPosition(); +} + +void Editor::DelCharBack(bool allowLineStartDeletion) { + if (currentPos == anchor) { + if (!RangeContainsProtected(currentPos - 1, currentPos)) { + int lineCurrentPos = pdoc->LineFromPosition(currentPos); + if (allowLineStartDeletion || (pdoc->LineStart(lineCurrentPos) != currentPos)) { + if (pdoc->GetColumn(currentPos) <= pdoc->GetLineIndentation(lineCurrentPos) && + pdoc->GetColumn(currentPos) > 0 && pdoc->backspaceUnindents) { + pdoc->BeginUndoAction(); + int indentation = pdoc->GetLineIndentation(lineCurrentPos); + int indentationStep = pdoc->IndentSize(); + if (indentation % indentationStep == 0) { + pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep); + } else { + pdoc->SetLineIndentation(lineCurrentPos, indentation - (indentation % indentationStep)); + } + SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos)); + pdoc->EndUndoAction(); + } else { + pdoc->DelCharBack(currentPos); + } + } + } + } else { + ClearSelection(); + SetEmptySelection(currentPos); + } + // Avoid blinking during rapid typing: + ShowCaretAtCurrentPosition(); +} + +void Editor::NotifyFocus(bool) {} + +void Editor::NotifyStyleToNeeded(int endStyleNeeded) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_STYLENEEDED; + scn.position = endStyleNeeded; + NotifyParent(scn); +} + +void Editor::NotifyStyleNeeded(Document*, void *, int endStyleNeeded) { + NotifyStyleToNeeded(endStyleNeeded); +} + +void Editor::NotifyChar(int ch) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_CHARADDED; + scn.ch = ch; + NotifyParent(scn); + if (recordingMacro) { + char txt[2]; + txt[0] = static_cast(ch); + txt[1] = '\0'; + NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast(txt)); + } +} + +void Editor::NotifySavePoint(bool isSavePoint) { + SCNotification scn = {0}; + if (isSavePoint) { + scn.nmhdr.code = SCN_SAVEPOINTREACHED; + } else { + scn.nmhdr.code = SCN_SAVEPOINTLEFT; + } + NotifyParent(scn); +} + +void Editor::NotifyModifyAttempt() { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_MODIFYATTEMPTRO; + NotifyParent(scn); +} + +void Editor::NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_DOUBLECLICK; + scn.line = LineFromLocation(pt); + scn.position = PositionFromLocationClose(pt); + scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | + (alt ? SCI_ALT : 0); + NotifyParent(scn); +} + +void Editor::NotifyHotSpotDoubleClicked(int position, bool shift, bool ctrl, bool alt) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_HOTSPOTDOUBLECLICK; + scn.position = position; + scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | + (alt ? SCI_ALT : 0); + NotifyParent(scn); +} + +void Editor::NotifyHotSpotClicked(int position, bool shift, bool ctrl, bool alt) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_HOTSPOTCLICK; + scn.position = position; + scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | + (alt ? SCI_ALT : 0); + NotifyParent(scn); +} + +void Editor::NotifyUpdateUI() { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_UPDATEUI; + NotifyParent(scn); +} + +void Editor::NotifyPainted() { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_PAINTED; + NotifyParent(scn); +} + +bool Editor::NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt) { + int marginClicked = -1; + int x = 0; + for (int margin = 0; margin < ViewStyle::margins; margin++) { + if ((pt.x > x) && (pt.x < x + vs.ms[margin].width)) + marginClicked = margin; + x += vs.ms[margin].width; + } + if ((marginClicked >= 0) && vs.ms[marginClicked].sensitive) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_MARGINCLICK; + scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | + (alt ? SCI_ALT : 0); + scn.position = pdoc->LineStart(LineFromLocation(pt)); + scn.margin = marginClicked; + NotifyParent(scn); + return true; + } else { + return false; + } +} + +void Editor::NotifyNeedShown(int pos, int len) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_NEEDSHOWN; + scn.position = pos; + scn.length = len; + NotifyParent(scn); +} + +void Editor::NotifyDwelling(Point pt, bool state) { + SCNotification scn = {0}; + scn.nmhdr.code = state ? SCN_DWELLSTART : SCN_DWELLEND; + scn.position = PositionFromLocationClose(pt); + scn.x = pt.x; + scn.y = pt.y; + NotifyParent(scn); +} + +void Editor::NotifyZoom() { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_ZOOM; + NotifyParent(scn); +} + +// Notifications from document +void Editor::NotifyModifyAttempt(Document*, void *) { + //Platform::DebugPrintf("** Modify Attempt\n"); + NotifyModifyAttempt(); +} + +void Editor::NotifyMove(int position) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_POSCHANGED; + scn.position = position; + NotifyParent(scn); +} + +void Editor::NotifySavePoint(Document*, void *, bool atSavePoint) { + //Platform::DebugPrintf("** Save Point %s\n", atSavePoint ? "On" : "Off"); + NotifySavePoint(atSavePoint); +} + +void Editor::CheckModificationForWrap(DocModification mh) { + if (mh.modificationType & (SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT)) { + llc.Invalidate(LineLayout::llCheckTextAndStyle); + if (wrapState != eWrapNone) { + int lineDoc = pdoc->LineFromPosition(mh.position); + int lines = Platform::Maximum(0, mh.linesAdded); + NeedWrapping(lineDoc, lineDoc + lines + 1); + } + } +} + +// Move a position so it is still after the same character as before the insertion. +static inline int MovePositionForInsertion(int position, int startInsertion, int length) { + if (position > startInsertion) { + return position + length; + } + return position; +} + +// Move a position so it is still after the same character as before the deletion if that +// character is still present else after the previous surviving character. +static inline int MovePositionForDeletion(int position, int startDeletion, int length) { + if (position > startDeletion) { + int endDeletion = startDeletion + length; + if (position > endDeletion) { + return position - length; + } else { + return startDeletion; + } + } else { + return position; + } +} + +void Editor::NotifyModified(Document*, DocModification mh, void *) { + needUpdateUI = true; + if (paintState == painting) { + CheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length)); + } + if (mh.modificationType & SC_MOD_CHANGESTYLE) { + pdoc->IncrementStyleClock(); + if (paintState == notPainting) { + if (mh.position < pdoc->LineStart(topLine)) { + // Styling performed before this view + Redraw(); + } else { + InvalidateRange(mh.position, mh.position + mh.length); + } + } + llc.Invalidate(LineLayout::llCheckTextAndStyle); + } else { + // Move selection and brace highlights + if (mh.modificationType & SC_MOD_INSERTTEXT) { + currentPos = MovePositionForInsertion(currentPos, mh.position, mh.length); + anchor = MovePositionForInsertion(anchor, mh.position, mh.length); + braces[0] = MovePositionForInsertion(braces[0], mh.position, mh.length); + braces[1] = MovePositionForInsertion(braces[1], mh.position, mh.length); + } else if (mh.modificationType & SC_MOD_DELETETEXT) { + currentPos = MovePositionForDeletion(currentPos, mh.position, mh.length); + anchor = MovePositionForDeletion(anchor, mh.position, mh.length); + braces[0] = MovePositionForDeletion(braces[0], mh.position, mh.length); + braces[1] = MovePositionForDeletion(braces[1], mh.position, mh.length); + } + if (cs.LinesDisplayed() < cs.LinesInDoc()) { + // Some lines are hidden so may need shown. + // TODO: check if the modified area is hidden. + if (mh.modificationType & SC_MOD_BEFOREINSERT) { + NotifyNeedShown(mh.position, 0); + } else if (mh.modificationType & SC_MOD_BEFOREDELETE) { + NotifyNeedShown(mh.position, mh.length); + } + } + if (mh.linesAdded != 0) { + // Update contraction state for inserted and removed lines + // lineOfPos should be calculated in context of state before modification, shouldn't it + int lineOfPos = pdoc->LineFromPosition(mh.position); + if (mh.linesAdded > 0) { + cs.InsertLines(lineOfPos, mh.linesAdded); + } else { + cs.DeleteLines(lineOfPos, -mh.linesAdded); + } + } + CheckModificationForWrap(mh); + if (mh.linesAdded != 0) { + // Avoid scrolling of display if change before current display + if (mh.position < posTopLine && !CanDeferToLastStep(mh)) { + int newTop = Platform::Clamp(topLine + mh.linesAdded, 0, MaxScrollPos()); + if (newTop != topLine) { + SetTopLine(newTop); + SetVerticalScrollPos(); + } + } + + //Platform::DebugPrintf("** %x Doc Changed\n", this); + // TODO: could invalidate from mh.startModification to end of screen + //InvalidateRange(mh.position, mh.position + mh.length); + if (paintState == notPainting && !CanDeferToLastStep(mh)) { + Redraw(); + } + } else { + //Platform::DebugPrintf("** %x Line Changed %d .. %d\n", this, + // mh.position, mh.position + mh.length); + if (paintState == notPainting && mh.length && !CanEliminate(mh)) { + InvalidateRange(mh.position, mh.position + mh.length); + } + } + } + + if (mh.linesAdded != 0 && !CanDeferToLastStep(mh)) { + SetScrollBars(); + } + + if (mh.modificationType & SC_MOD_CHANGEMARKER) { + if ((paintState == notPainting) || !PaintContainsMargin()) { + if (mh.modificationType & SC_MOD_CHANGEFOLD) { + // Fold changes can affect the drawing of following lines so redraw whole margin + RedrawSelMargin(); + } else { + RedrawSelMargin(mh.line); + } + } + } + + // NOW pay the piper WRT "deferred" visual updates + if (IsLastStep(mh)) { + SetScrollBars(); + Redraw(); + } + + // If client wants to see this modification + if (mh.modificationType & modEventMask) { + if ((mh.modificationType & SC_MOD_CHANGESTYLE) == 0) { + // Real modification made to text of document. + NotifyChange(); // Send EN_CHANGE + } + + SCNotification scn = {0}; + scn.nmhdr.code = SCN_MODIFIED; + scn.position = mh.position; + scn.modificationType = mh.modificationType; + scn.text = mh.text; + scn.length = mh.length; + scn.linesAdded = mh.linesAdded; + scn.line = mh.line; + scn.foldLevelNow = mh.foldLevelNow; + scn.foldLevelPrev = mh.foldLevelPrev; + NotifyParent(scn); + } +} + +void Editor::NotifyDeleted(Document *, void *) { + /* Do nothing */ +} + +void Editor::NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { + + // Enumerates all macroable messages + switch (iMessage) { + case SCI_CUT: + case SCI_COPY: + case SCI_PASTE: + case SCI_CLEAR: + case SCI_REPLACESEL: + case SCI_ADDTEXT: + case SCI_INSERTTEXT: + case SCI_APPENDTEXT: + case SCI_CLEARALL: + case SCI_SELECTALL: + case SCI_GOTOLINE: + case SCI_GOTOPOS: + case SCI_SEARCHANCHOR: + case SCI_SEARCHNEXT: + case SCI_SEARCHPREV: + case SCI_LINEDOWN: + case SCI_LINEDOWNEXTEND: + case SCI_PARADOWN: + case SCI_PARADOWNEXTEND: + case SCI_LINEUP: + case SCI_LINEUPEXTEND: + case SCI_PARAUP: + case SCI_PARAUPEXTEND: + case SCI_CHARLEFT: + case SCI_CHARLEFTEXTEND: + case SCI_CHARRIGHT: + case SCI_CHARRIGHTEXTEND: + case SCI_WORDLEFT: + case SCI_WORDLEFTEXTEND: + case SCI_WORDRIGHT: + case SCI_WORDRIGHTEXTEND: + case SCI_WORDPARTLEFT: + case SCI_WORDPARTLEFTEXTEND: + case SCI_WORDPARTRIGHT: + case SCI_WORDPARTRIGHTEXTEND: + case SCI_WORDLEFTEND: + case SCI_WORDLEFTENDEXTEND: + case SCI_WORDRIGHTEND: + case SCI_WORDRIGHTENDEXTEND: + case SCI_HOME: + case SCI_HOMEEXTEND: + case SCI_LINEEND: + case SCI_LINEENDEXTEND: + case SCI_HOMEWRAP: + case SCI_HOMEWRAPEXTEND: + case SCI_LINEENDWRAP: + case SCI_LINEENDWRAPEXTEND: + case SCI_DOCUMENTSTART: + case SCI_DOCUMENTSTARTEXTEND: + case SCI_DOCUMENTEND: + case SCI_DOCUMENTENDEXTEND: + case SCI_STUTTEREDPAGEUP: + case SCI_STUTTEREDPAGEUPEXTEND: + case SCI_STUTTEREDPAGEDOWN: + case SCI_STUTTEREDPAGEDOWNEXTEND: + case SCI_PAGEUP: + case SCI_PAGEUPEXTEND: + case SCI_PAGEDOWN: + case SCI_PAGEDOWNEXTEND: + case SCI_EDITTOGGLEOVERTYPE: + case SCI_CANCEL: + case SCI_DELETEBACK: + case SCI_TAB: + case SCI_BACKTAB: + case SCI_FORMFEED: + case SCI_VCHOME: + case SCI_VCHOMEEXTEND: + case SCI_VCHOMEWRAP: + case SCI_VCHOMEWRAPEXTEND: + case SCI_DELWORDLEFT: + case SCI_DELWORDRIGHT: + case SCI_DELLINELEFT: + case SCI_DELLINERIGHT: + case SCI_LINECOPY: + case SCI_LINECUT: + case SCI_LINEDELETE: + case SCI_LINETRANSPOSE: + case SCI_LINEDUPLICATE: + case SCI_LOWERCASE: + case SCI_UPPERCASE: + case SCI_LINESCROLLDOWN: + case SCI_LINESCROLLUP: + case SCI_DELETEBACKNOTLINE: + case SCI_HOMEDISPLAY: + case SCI_HOMEDISPLAYEXTEND: + case SCI_LINEENDDISPLAY: + case SCI_LINEENDDISPLAYEXTEND: + case SCI_SETSELECTIONMODE: + case SCI_LINEDOWNRECTEXTEND: + case SCI_LINEUPRECTEXTEND: + case SCI_CHARLEFTRECTEXTEND: + case SCI_CHARRIGHTRECTEXTEND: + case SCI_HOMERECTEXTEND: + case SCI_VCHOMERECTEXTEND: + case SCI_LINEENDRECTEXTEND: + case SCI_PAGEUPRECTEXTEND: + case SCI_PAGEDOWNRECTEXTEND: + case SCI_SELECTIONDUPLICATE: + break; + + // Filter out all others like display changes. Also, newlines are redundant + // with char insert messages. + case SCI_NEWLINE: + default: + // printf("Filtered out %ld of macro recording\n", iMessage); + return ; + } + + // Send notification + SCNotification scn = {0}; + scn.nmhdr.code = SCN_MACRORECORD; + scn.message = iMessage; + scn.wParam = wParam; + scn.lParam = lParam; + NotifyParent(scn); +} + +/** + * Force scroll and keep position relative to top of window. + * + * If stuttered = true and not already at first/last row, move to first/last row of window. + * If stuttered = true and already at first/last row, scroll as normal. + */ +void Editor::PageMove(int direction, selTypes sel, bool stuttered) { + int topLineNew, newPos; + + // I consider only the caretYSlop, and ignore the caretYPolicy-- is that a problem? + int currentLine = pdoc->LineFromPosition(currentPos); + int topStutterLine = topLine + caretYSlop; + int bottomStutterLine = + pdoc->LineFromPosition(PositionFromLocation( + Point(lastXChosen, direction * vs.lineHeight * LinesToScroll()))) + - caretYSlop - 1; + + if (stuttered && (direction < 0 && currentLine > topStutterLine)) { + topLineNew = topLine; + newPos = PositionFromLocation(Point(lastXChosen, vs.lineHeight * caretYSlop)); + + } else if (stuttered && (direction > 0 && currentLine < bottomStutterLine)) { + topLineNew = topLine; + newPos = PositionFromLocation(Point(lastXChosen, vs.lineHeight * (LinesToScroll() - caretYSlop))); + + } else { + Point pt = LocationFromPosition(currentPos); + + topLineNew = Platform::Clamp( + topLine + direction * LinesToScroll(), 0, MaxScrollPos()); + newPos = PositionFromLocation( + Point(lastXChosen, pt.y + direction * (vs.lineHeight * LinesToScroll()))); + } + + if (topLineNew != topLine) { + SetTopLine(topLineNew); + MovePositionTo(newPos, sel); + Redraw(); + SetVerticalScrollPos(); + } else { + MovePositionTo(newPos, sel); + } +} + +void Editor::ChangeCaseOfSelection(bool makeUpperCase) { + pdoc->BeginUndoAction(); + int startCurrent = currentPos; + int startAnchor = anchor; + if (selType == selStream) { + pdoc->ChangeCase(Range(SelectionStart(), SelectionEnd()), + makeUpperCase); + SetSelection(startCurrent, startAnchor); + } else { + SelectionLineIterator lineIterator(this, false); + while (lineIterator.Iterate()) { + pdoc->ChangeCase( + Range(lineIterator.startPos, lineIterator.endPos), + makeUpperCase); + } + // Would be nicer to keep the rectangular selection but this is complex + SetEmptySelection(startCurrent); + } + pdoc->EndUndoAction(); +} + +void Editor::LineTranspose() { + int line = pdoc->LineFromPosition(currentPos); + if (line > 0) { + pdoc->BeginUndoAction(); + int startPrev = pdoc->LineStart(line - 1); + int endPrev = pdoc->LineEnd(line - 1); + int start = pdoc->LineStart(line); + int end = pdoc->LineEnd(line); + char *line1 = CopyRange(startPrev, endPrev); + int len1 = endPrev - startPrev; + char *line2 = CopyRange(start, end); + int len2 = end - start; + if (pdoc->DeleteChars(start, len2)) { + pdoc->DeleteChars(startPrev, len1); + pdoc->InsertString(startPrev, line2, len2); + pdoc->InsertString(start - len1 + len2, line1, len1); + MovePositionTo(start - len1 + len2); + } + delete []line1; + delete []line2; + pdoc->EndUndoAction(); + } +} + +void Editor::Duplicate(bool forLine) { + int start = SelectionStart(); + int end = SelectionEnd(); + if (start == end) { + forLine = true; + } + if (forLine) { + int line = pdoc->LineFromPosition(currentPos); + start = pdoc->LineStart(line); + end = pdoc->LineEnd(line); + } + char *text = CopyRange(start, end); + if (forLine) { + const char *eol = StringFromEOLMode(pdoc->eolMode); + pdoc->InsertCString(end, eol); + pdoc->InsertString(end + istrlen(eol), text, end - start); + } else { + pdoc->InsertString(end, text, end - start); + } + delete []text; +} + +void Editor::CancelModes() { + moveExtendsSelection = false; +} + +void Editor::NewLine() { + ClearSelection(); + const char *eol = "\n"; + if (pdoc->eolMode == SC_EOL_CRLF) { + eol = "\r\n"; + } else if (pdoc->eolMode == SC_EOL_CR) { + eol = "\r"; + } // else SC_EOL_LF -> "\n" already set + if (pdoc->InsertCString(currentPos, eol)) { + SetEmptySelection(currentPos + istrlen(eol)); + while (*eol) { + NotifyChar(*eol); + eol++; + } + } + SetLastXChosen(); + EnsureCaretVisible(); + // Avoid blinking during rapid typing: + ShowCaretAtCurrentPosition(); +} + +void Editor::CursorUpOrDown(int direction, selTypes sel) { + Point pt = LocationFromPosition(currentPos); + int posNew = PositionFromLocation( + Point(lastXChosen, pt.y + direction * vs.lineHeight)); + if (direction < 0) { + // Line wrapping may lead to a location on the same line, so + // seek back if that is the case. + // There is an equivalent case when moving down which skips + // over a line but as that does not trap the user it is fine. + Point ptNew = LocationFromPosition(posNew); + while ((posNew > 0) && (pt.y == ptNew.y)) { + posNew--; + ptNew = LocationFromPosition(posNew); + } + } + MovePositionTo(posNew, sel); +} + +void Editor::ParaUpOrDown(int direction, selTypes sel) { + int lineDoc, savedPos = currentPos; + do { + MovePositionTo(direction > 0 ? pdoc->ParaDown(currentPos) : pdoc->ParaUp(currentPos), sel); + lineDoc = pdoc->LineFromPosition(currentPos); + if (direction > 0) { + if (currentPos >= pdoc->Length() && !cs.GetVisible(lineDoc)) { + if (sel == noSel) { + MovePositionTo(pdoc->LineEndPosition(savedPos)); + } + break; + } + } + } while (!cs.GetVisible(lineDoc)); +} + +int Editor::StartEndDisplayLine(int pos, bool start) { + RefreshStyleData(); + int line = pdoc->LineFromPosition(pos); + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(line)); + int posRet = INVALID_POSITION; + if (surface && ll) { + unsigned int posLineStart = pdoc->LineStart(line); + LayoutLine(line, surface, vs, ll, wrapWidth); + int posInLine = pos - posLineStart; + if (posInLine <= ll->maxLineLength) { + for (int subLine = 0; subLine < ll->lines; subLine++) { + if ((posInLine >= ll->LineStart(subLine)) && (posInLine <= ll->LineStart(subLine + 1))) { + if (start) { + posRet = ll->LineStart(subLine) + posLineStart; + } else { + if (subLine == ll->lines - 1) + posRet = ll->LineStart(subLine + 1) + posLineStart; + else + posRet = ll->LineStart(subLine + 1) + posLineStart - 1; + } + } + } + } + } + if (posRet == INVALID_POSITION) { + return pos; + } else { + return posRet; + } +} + +int Editor::KeyCommand(unsigned int iMessage) { + switch (iMessage) { + case SCI_LINEDOWN: + CursorUpOrDown(1); + break; + case SCI_LINEDOWNEXTEND: + CursorUpOrDown(1, selStream); + break; + case SCI_LINEDOWNRECTEXTEND: + CursorUpOrDown(1, selRectangle); + break; + case SCI_PARADOWN: + ParaUpOrDown(1); + break; + case SCI_PARADOWNEXTEND: + ParaUpOrDown(1, selStream); + break; + case SCI_LINESCROLLDOWN: + ScrollTo(topLine + 1); + MoveCaretInsideView(false); + break; + case SCI_LINEUP: + CursorUpOrDown(-1); + break; + case SCI_LINEUPEXTEND: + CursorUpOrDown(-1, selStream); + break; + case SCI_LINEUPRECTEXTEND: + CursorUpOrDown(-1, selRectangle); + break; + case SCI_PARAUP: + ParaUpOrDown(-1); + break; + case SCI_PARAUPEXTEND: + ParaUpOrDown(-1, selStream); + break; + case SCI_LINESCROLLUP: + ScrollTo(topLine - 1); + MoveCaretInsideView(false); + break; + case SCI_CHARLEFT: + if (SelectionEmpty() || moveExtendsSelection) { + MovePositionTo(MovePositionSoVisible(currentPos - 1, -1)); + } else { + MovePositionTo(SelectionStart()); + } + SetLastXChosen(); + break; + case SCI_CHARLEFTEXTEND: + MovePositionTo(MovePositionSoVisible(currentPos - 1, -1), selStream); + SetLastXChosen(); + break; + case SCI_CHARLEFTRECTEXTEND: + MovePositionTo(MovePositionSoVisible(currentPos - 1, -1), selRectangle); + SetLastXChosen(); + break; + case SCI_CHARRIGHT: + if (SelectionEmpty() || moveExtendsSelection) { + MovePositionTo(MovePositionSoVisible(currentPos + 1, 1)); + } else { + MovePositionTo(SelectionEnd()); + } + SetLastXChosen(); + break; + case SCI_CHARRIGHTEXTEND: + MovePositionTo(MovePositionSoVisible(currentPos + 1, 1), selStream); + SetLastXChosen(); + break; + case SCI_CHARRIGHTRECTEXTEND: + MovePositionTo(MovePositionSoVisible(currentPos + 1, 1), selRectangle); + SetLastXChosen(); + break; + case SCI_WORDLEFT: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, -1), -1)); + SetLastXChosen(); + break; + case SCI_WORDLEFTEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, -1), -1), selStream); + SetLastXChosen(); + break; + case SCI_WORDRIGHT: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, 1), 1)); + SetLastXChosen(); + break; + case SCI_WORDRIGHTEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, 1), 1), selStream); + SetLastXChosen(); + break; + + case SCI_WORDLEFTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, -1), -1)); + SetLastXChosen(); + break; + case SCI_WORDLEFTENDEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, -1), -1), selStream); + SetLastXChosen(); + break; + case SCI_WORDRIGHTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, 1), 1)); + SetLastXChosen(); + break; + case SCI_WORDRIGHTENDEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, 1), 1), selStream); + SetLastXChosen(); + break; + + case SCI_HOME: + MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos))); + SetLastXChosen(); + break; + case SCI_HOMEEXTEND: + MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)), selStream); + SetLastXChosen(); + break; + case SCI_HOMERECTEXTEND: + MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)), selRectangle); + SetLastXChosen(); + break; + case SCI_LINEEND: + MovePositionTo(pdoc->LineEndPosition(currentPos)); + SetLastXChosen(); + break; + case SCI_LINEENDEXTEND: + MovePositionTo(pdoc->LineEndPosition(currentPos), selStream); + SetLastXChosen(); + break; + case SCI_LINEENDRECTEXTEND: + MovePositionTo(pdoc->LineEndPosition(currentPos), selRectangle); + SetLastXChosen(); + break; + case SCI_HOMEWRAP: { + int homePos = MovePositionSoVisible(StartEndDisplayLine(currentPos, true), -1); + if (currentPos <= homePos) + homePos = pdoc->LineStart(pdoc->LineFromPosition(currentPos)); + MovePositionTo(homePos); + SetLastXChosen(); + } + break; + case SCI_HOMEWRAPEXTEND: { + int homePos = MovePositionSoVisible(StartEndDisplayLine(currentPos, true), -1); + if (currentPos <= homePos) + homePos = pdoc->LineStart(pdoc->LineFromPosition(currentPos)); + MovePositionTo(homePos, selStream); + SetLastXChosen(); + } + break; + case SCI_LINEENDWRAP: { + int endPos = MovePositionSoVisible(StartEndDisplayLine(currentPos, false), 1); + int realEndPos = pdoc->LineEndPosition(currentPos); + if (endPos > realEndPos // if moved past visible EOLs + || currentPos >= endPos) // if at end of display line already + endPos = realEndPos; + MovePositionTo(endPos); + SetLastXChosen(); + } + break; + case SCI_LINEENDWRAPEXTEND: { + int endPos = MovePositionSoVisible(StartEndDisplayLine(currentPos, false), 1); + int realEndPos = pdoc->LineEndPosition(currentPos); + if (endPos > realEndPos // if moved past visible EOLs + || currentPos >= endPos) // if at end of display line already + endPos = realEndPos; + MovePositionTo(endPos, selStream); + SetLastXChosen(); + } + break; + case SCI_DOCUMENTSTART: + MovePositionTo(0); + SetLastXChosen(); + break; + case SCI_DOCUMENTSTARTEXTEND: + MovePositionTo(0, selStream); + SetLastXChosen(); + break; + case SCI_DOCUMENTEND: + MovePositionTo(pdoc->Length()); + SetLastXChosen(); + break; + case SCI_DOCUMENTENDEXTEND: + MovePositionTo(pdoc->Length(), selStream); + SetLastXChosen(); + break; + case SCI_STUTTEREDPAGEUP: + PageMove(-1, noSel, true); + break; + case SCI_STUTTEREDPAGEUPEXTEND: + PageMove(-1, selStream, true); + break; + case SCI_STUTTEREDPAGEDOWN: + PageMove(1, noSel, true); + break; + case SCI_STUTTEREDPAGEDOWNEXTEND: + PageMove(1, selStream, true); + break; + case SCI_PAGEUP: + PageMove(-1); + break; + case SCI_PAGEUPEXTEND: + PageMove(-1, selStream); + break; + case SCI_PAGEUPRECTEXTEND: + PageMove(-1, selRectangle); + break; + case SCI_PAGEDOWN: + PageMove(1); + break; + case SCI_PAGEDOWNEXTEND: + PageMove(1, selStream); + break; + case SCI_PAGEDOWNRECTEXTEND: + PageMove(1, selRectangle); + break; + case SCI_EDITTOGGLEOVERTYPE: + inOverstrike = !inOverstrike; + DropCaret(); + ShowCaretAtCurrentPosition(); + NotifyUpdateUI(); + break; + case SCI_CANCEL: // Cancel any modes - handled in subclass + // Also unselect text + CancelModes(); + break; + case SCI_DELETEBACK: + DelCharBack(true); + if (!caretSticky) { + SetLastXChosen(); + } + EnsureCaretVisible(); + break; + case SCI_DELETEBACKNOTLINE: + DelCharBack(false); + if (!caretSticky) { + SetLastXChosen(); + } + EnsureCaretVisible(); + break; + case SCI_TAB: + Indent(true); + if (!caretSticky) { + SetLastXChosen(); + } + EnsureCaretVisible(); + break; + case SCI_BACKTAB: + Indent(false); + if (!caretSticky) { + SetLastXChosen(); + } + EnsureCaretVisible(); + break; + case SCI_NEWLINE: + NewLine(); + break; + case SCI_FORMFEED: + AddChar('\f'); + break; + case SCI_VCHOME: + MovePositionTo(pdoc->VCHomePosition(currentPos)); + SetLastXChosen(); + break; + case SCI_VCHOMEEXTEND: + MovePositionTo(pdoc->VCHomePosition(currentPos), selStream); + SetLastXChosen(); + break; + case SCI_VCHOMERECTEXTEND: + MovePositionTo(pdoc->VCHomePosition(currentPos), selRectangle); + SetLastXChosen(); + break; + case SCI_VCHOMEWRAP: { + int homePos = pdoc->VCHomePosition(currentPos); + int viewLineStart = MovePositionSoVisible(StartEndDisplayLine(currentPos, true), -1); + if ((viewLineStart < currentPos) && (viewLineStart > homePos)) + homePos = viewLineStart; + + MovePositionTo(homePos); + SetLastXChosen(); + } + break; + case SCI_VCHOMEWRAPEXTEND: { + int homePos = pdoc->VCHomePosition(currentPos); + int viewLineStart = MovePositionSoVisible(StartEndDisplayLine(currentPos, true), -1); + if ((viewLineStart < currentPos) && (viewLineStart > homePos)) + homePos = viewLineStart; + + MovePositionTo(homePos, selStream); + SetLastXChosen(); + } + break; + case SCI_ZOOMIN: + if (vs.zoomLevel < 20) { + vs.zoomLevel++; + InvalidateStyleRedraw(); + NotifyZoom(); + } + break; + case SCI_ZOOMOUT: + if (vs.zoomLevel > -10) { + vs.zoomLevel--; + InvalidateStyleRedraw(); + NotifyZoom(); + } + break; + case SCI_DELWORDLEFT: { + int startWord = pdoc->NextWordStart(currentPos, -1); + pdoc->DeleteChars(startWord, currentPos - startWord); + SetLastXChosen(); + } + break; + case SCI_DELWORDRIGHT: { + int endWord = pdoc->NextWordStart(currentPos, 1); + pdoc->DeleteChars(currentPos, endWord - currentPos); + } + break; + case SCI_DELLINELEFT: { + int line = pdoc->LineFromPosition(currentPos); + int start = pdoc->LineStart(line); + pdoc->DeleteChars(start, currentPos - start); + SetLastXChosen(); + } + break; + case SCI_DELLINERIGHT: { + int line = pdoc->LineFromPosition(currentPos); + int end = pdoc->LineEnd(line); + pdoc->DeleteChars(currentPos, end - currentPos); + } + break; + case SCI_LINECOPY: { + int lineStart = pdoc->LineFromPosition(SelectionStart()); + int lineEnd = pdoc->LineFromPosition(SelectionEnd()); + CopyRangeToClipboard(pdoc->LineStart(lineStart), + pdoc->LineStart(lineEnd + 1)); + } + break; + case SCI_LINECUT: { + int lineStart = pdoc->LineFromPosition(SelectionStart()); + int lineEnd = pdoc->LineFromPosition(SelectionEnd()); + int start = pdoc->LineStart(lineStart); + int end = pdoc->LineStart(lineEnd + 1); + SetSelection(start, end); + Cut(); + SetLastXChosen(); + } + break; + case SCI_LINEDELETE: { + int line = pdoc->LineFromPosition(currentPos); + int start = pdoc->LineStart(line); + int end = pdoc->LineStart(line + 1); + pdoc->DeleteChars(start, end - start); + } + break; + case SCI_LINETRANSPOSE: + LineTranspose(); + break; + case SCI_LINEDUPLICATE: + Duplicate(true); + break; + case SCI_SELECTIONDUPLICATE: + Duplicate(false); + break; + case SCI_LOWERCASE: + ChangeCaseOfSelection(false); + break; + case SCI_UPPERCASE: + ChangeCaseOfSelection(true); + break; + case SCI_WORDPARTLEFT: + MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(currentPos), -1)); + SetLastXChosen(); + break; + case SCI_WORDPARTLEFTEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(currentPos), -1), selStream); + SetLastXChosen(); + break; + case SCI_WORDPARTRIGHT: + MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(currentPos), 1)); + SetLastXChosen(); + break; + case SCI_WORDPARTRIGHTEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(currentPos), 1), selStream); + SetLastXChosen(); + break; + case SCI_HOMEDISPLAY: + MovePositionTo(MovePositionSoVisible( + StartEndDisplayLine(currentPos, true), -1)); + SetLastXChosen(); + break; + case SCI_HOMEDISPLAYEXTEND: + MovePositionTo(MovePositionSoVisible( + StartEndDisplayLine(currentPos, true), -1), selStream); + SetLastXChosen(); + break; + case SCI_LINEENDDISPLAY: + MovePositionTo(MovePositionSoVisible( + StartEndDisplayLine(currentPos, false), 1)); + SetLastXChosen(); + break; + case SCI_LINEENDDISPLAYEXTEND: + MovePositionTo(MovePositionSoVisible( + StartEndDisplayLine(currentPos, false), 1), selStream); + SetLastXChosen(); + break; + } + return 0; +} + +int Editor::KeyDefault(int, int) { + return 0; +} + +int Editor::KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed) { + DwellEnd(false); + int modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | + (alt ? SCI_ALT : 0); + int msg = kmap.Find(key, modifiers); + if (msg) { + if (consumed) + *consumed = true; + return WndProc(msg, 0, 0); + } else { + if (consumed) + *consumed = false; + return KeyDefault(key, modifiers); + } +} + +void Editor::SetWhitespaceVisible(int view) { + vs.viewWhitespace = static_cast(view); +} + +int Editor::GetWhitespaceVisible() { + return vs.viewWhitespace; +} + +void Editor::Indent(bool forwards) { + //Platform::DebugPrintf("INdent %d\n", forwards); + int lineOfAnchor = pdoc->LineFromPosition(anchor); + int lineCurrentPos = pdoc->LineFromPosition(currentPos); + if (lineOfAnchor == lineCurrentPos) { + if (forwards) { + pdoc->BeginUndoAction(); + ClearSelection(); + if (pdoc->GetColumn(currentPos) <= pdoc->GetColumn(pdoc->GetLineIndentPosition(lineCurrentPos)) && + pdoc->tabIndents) { + int indentation = pdoc->GetLineIndentation(lineCurrentPos); + int indentationStep = pdoc->IndentSize(); + pdoc->SetLineIndentation(lineCurrentPos, indentation + indentationStep - indentation % indentationStep); + SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos)); + } else { + if (pdoc->useTabs) { + pdoc->InsertChar(currentPos, '\t'); + SetEmptySelection(currentPos + 1); + } else { + int numSpaces = (pdoc->tabInChars) - + (pdoc->GetColumn(currentPos) % (pdoc->tabInChars)); + if (numSpaces < 1) + numSpaces = pdoc->tabInChars; + for (int i = 0; i < numSpaces; i++) { + pdoc->InsertChar(currentPos + i, ' '); + } + SetEmptySelection(currentPos + numSpaces); + } + } + pdoc->EndUndoAction(); + } else { + if (pdoc->GetColumn(currentPos) <= pdoc->GetLineIndentation(lineCurrentPos) && + pdoc->tabIndents) { + pdoc->BeginUndoAction(); + int indentation = pdoc->GetLineIndentation(lineCurrentPos); + int indentationStep = pdoc->IndentSize(); + pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep); + SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos)); + pdoc->EndUndoAction(); + } else { + int newColumn = ((pdoc->GetColumn(currentPos) - 1) / pdoc->tabInChars) * + pdoc->tabInChars; + if (newColumn < 0) + newColumn = 0; + int newPos = currentPos; + while (pdoc->GetColumn(newPos) > newColumn) + newPos--; + SetEmptySelection(newPos); + } + } + } else { + int anchorPosOnLine = anchor - pdoc->LineStart(lineOfAnchor); + int currentPosPosOnLine = currentPos - pdoc->LineStart(lineCurrentPos); + // Multiple lines selected so indent / dedent + int lineTopSel = Platform::Minimum(lineOfAnchor, lineCurrentPos); + int lineBottomSel = Platform::Maximum(lineOfAnchor, lineCurrentPos); + if (pdoc->LineStart(lineBottomSel) == anchor || pdoc->LineStart(lineBottomSel) == currentPos) + lineBottomSel--; // If not selecting any characters on a line, do not indent + pdoc->BeginUndoAction(); + pdoc->Indent(forwards, lineBottomSel, lineTopSel); + pdoc->EndUndoAction(); + if (lineOfAnchor < lineCurrentPos) { + if (currentPosPosOnLine == 0) + SetSelection(pdoc->LineStart(lineCurrentPos), pdoc->LineStart(lineOfAnchor)); + else + SetSelection(pdoc->LineStart(lineCurrentPos + 1), pdoc->LineStart(lineOfAnchor)); + } else { + if (anchorPosOnLine == 0) + SetSelection(pdoc->LineStart(lineCurrentPos), pdoc->LineStart(lineOfAnchor)); + else + SetSelection(pdoc->LineStart(lineCurrentPos), pdoc->LineStart(lineOfAnchor + 1)); + } + } +} + +/** + * Search of a text in the document, in the given range. + * @return The position of the found text, -1 if not found. + */ +long Editor::FindText( + uptr_t wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD, + ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX. + sptr_t lParam) { ///< @c TextToFind structure: The text to search for in the given range. + + TextToFind *ft = reinterpret_cast(lParam); + int lengthFound = istrlen(ft->lpstrText); + int pos = pdoc->FindText(ft->chrg.cpMin, ft->chrg.cpMax, ft->lpstrText, + (wParam & SCFIND_MATCHCASE) != 0, + (wParam & SCFIND_WHOLEWORD) != 0, + (wParam & SCFIND_WORDSTART) != 0, + (wParam & SCFIND_REGEXP) != 0, + (wParam & SCFIND_POSIX) != 0, + &lengthFound); + if (pos != -1) { + ft->chrgText.cpMin = pos; + ft->chrgText.cpMax = pos + lengthFound; + } + return pos; +} + +/** + * Relocatable search support : Searches relative to current selection + * point and sets the selection to the found text range with + * each search. + */ +/** + * Anchor following searches at current selection start: This allows + * multiple incremental interactive searches to be macro recorded + * while still setting the selection to found text so the find/select + * operation is self-contained. + */ +void Editor::SearchAnchor() { + searchAnchor = SelectionStart(); +} + +/** + * Find text from current search anchor: Must call @c SearchAnchor first. + * Used for next text and previous text requests. + * @return The position of the found text, -1 if not found. + */ +long Editor::SearchText( + unsigned int iMessage, ///< Accepts both @c SCI_SEARCHNEXT and @c SCI_SEARCHPREV. + uptr_t wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD, + ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX. + sptr_t lParam) { ///< The text to search for. + + const char *txt = reinterpret_cast(lParam); + int pos; + int lengthFound = istrlen(txt); + if (iMessage == SCI_SEARCHNEXT) { + pos = pdoc->FindText(searchAnchor, pdoc->Length(), txt, + (wParam & SCFIND_MATCHCASE) != 0, + (wParam & SCFIND_WHOLEWORD) != 0, + (wParam & SCFIND_WORDSTART) != 0, + (wParam & SCFIND_REGEXP) != 0, + (wParam & SCFIND_POSIX) != 0, + &lengthFound); + } else { + pos = pdoc->FindText(searchAnchor, 0, txt, + (wParam & SCFIND_MATCHCASE) != 0, + (wParam & SCFIND_WHOLEWORD) != 0, + (wParam & SCFIND_WORDSTART) != 0, + (wParam & SCFIND_REGEXP) != 0, + (wParam & SCFIND_POSIX) != 0, + &lengthFound); + } + + if (pos != -1) { + SetSelection(pos, pos + lengthFound); + } + + return pos; +} + +/** + * Search for text in the target range of the document. + * @return The position of the found text, -1 if not found. + */ +long Editor::SearchInTarget(const char *text, int length) { + int lengthFound = length; + int pos = pdoc->FindText(targetStart, targetEnd, text, + (searchFlags & SCFIND_MATCHCASE) != 0, + (searchFlags & SCFIND_WHOLEWORD) != 0, + (searchFlags & SCFIND_WORDSTART) != 0, + (searchFlags & SCFIND_REGEXP) != 0, + (searchFlags & SCFIND_POSIX) != 0, + &lengthFound); + if (pos != -1) { + targetStart = pos; + targetEnd = pos + lengthFound; + } + return pos; +} + +void Editor::GoToLine(int lineNo) { + if (lineNo > pdoc->LinesTotal()) + lineNo = pdoc->LinesTotal(); + if (lineNo < 0) + lineNo = 0; + SetEmptySelection(pdoc->LineStart(lineNo)); + ShowCaretAtCurrentPosition(); + EnsureCaretVisible(); +} + +static bool Close(Point pt1, Point pt2) { + if (abs(pt1.x - pt2.x) > 3) + return false; + if (abs(pt1.y - pt2.y) > 3) + return false; + return true; +} + +char *Editor::CopyRange(int start, int end) { + char *text = 0; + if (start < end) { + int len = end - start; + text = new char[len + 1]; + if (text) { + for (int i = 0; i < len; i++) { + text[i] = pdoc->CharAt(start + i); + } + text[len] = '\0'; + } + } + return text; +} + +void Editor::CopySelectionFromRange(SelectionText *ss, int start, int end) { + ss->Set(CopyRange(start, end), end - start + 1, + pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false); +} + +void Editor::CopySelectionRange(SelectionText *ss) { + if (selType == selStream) { + CopySelectionFromRange(ss, SelectionStart(), SelectionEnd()); + } else { + char *text = 0; + int size = 0; + SelectionLineIterator lineIterator(this); + while (lineIterator.Iterate()) { + size += lineIterator.endPos - lineIterator.startPos; + if (selType != selLines) { + size++; + if (pdoc->eolMode == SC_EOL_CRLF) { + size++; + } + } + } + if (size > 0) { + text = new char[size + 1]; + if (text) { + int j = 0; + lineIterator.Reset(); + while (lineIterator.Iterate()) { + for (int i = lineIterator.startPos; + i < lineIterator.endPos; + i++) { + text[j++] = pdoc->CharAt(i); + } + if (selType != selLines) { + if (pdoc->eolMode != SC_EOL_LF) { + text[j++] = '\r'; + } + if (pdoc->eolMode != SC_EOL_CR) { + text[j++] = '\n'; + } + } + } + text[size] = '\0'; + } + } + ss->Set(text, size + 1, pdoc->dbcsCodePage, + vs.styles[STYLE_DEFAULT].characterSet, selType == selRectangle); + } +} + +void Editor::CopyRangeToClipboard(int start, int end) { + start = pdoc->ClampPositionIntoDocument(start); + end = pdoc->ClampPositionIntoDocument(end); + SelectionText selectedText; + selectedText.Set(CopyRange(start, end), end - start + 1, + pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false); + CopyToClipboard(selectedText); +} + +void Editor::CopyText(int length, const char *text) { + SelectionText selectedText; + selectedText.Copy(text, length + 1, + pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false); + CopyToClipboard(selectedText); +} + +void Editor::SetDragPosition(int newPos) { + if (newPos >= 0) { + newPos = MovePositionOutsideChar(newPos, 1); + posDrop = newPos; + } + if (posDrag != newPos) { + caret.on = true; + SetTicking(true); + InvalidateCaret(); + posDrag = newPos; + InvalidateCaret(); + } +} + +void Editor::DisplayCursor(Window::Cursor c) { + if (cursorMode == SC_CURSORNORMAL) + wMain.SetCursor(c); + else + wMain.SetCursor(static_cast(cursorMode)); +} + +void Editor::StartDrag() { + // Always handled by subclasses + //SetMouseCapture(true); + //DisplayCursor(Window::cursorArrow); +} + +void Editor::DropAt(int position, const char *value, bool moving, bool rectangular) { + //Platform::DebugPrintf("DropAt %d\n", inDragDrop); + if (inDragDrop) + dropWentOutside = false; + + int positionWasInSelection = PositionInSelection(position); + + bool positionOnEdgeOfSelection = + (position == SelectionStart()) || (position == SelectionEnd()); + + if ((!inDragDrop) || !(0 == positionWasInSelection) || + (positionOnEdgeOfSelection && !moving)) { + + int selStart = SelectionStart(); + int selEnd = SelectionEnd(); + + pdoc->BeginUndoAction(); + + int positionAfterDeletion = position; + if (inDragDrop && moving) { + // Remove dragged out text + if (rectangular || selType == selLines) { + SelectionLineIterator lineIterator(this); + while (lineIterator.Iterate()) { + if (position >= lineIterator.startPos) { + if (position > lineIterator.endPos) { + positionAfterDeletion -= lineIterator.endPos - lineIterator.startPos; + } else { + positionAfterDeletion -= position - lineIterator.startPos; + } + } + } + } else { + if (position > selStart) { + positionAfterDeletion -= selEnd - selStart; + } + } + ClearSelection(); + } + position = positionAfterDeletion; + + if (rectangular) { + PasteRectangular(position, value, istrlen(value)); + pdoc->EndUndoAction(); + // Should try to select new rectangle but it may not be a rectangle now so just select the drop position + SetEmptySelection(position); + } else { + position = MovePositionOutsideChar(position, currentPos - position); + if (pdoc->InsertCString(position, value)) { + SetSelection(position + istrlen(value), position); + } + pdoc->EndUndoAction(); + } + } else if (inDragDrop) { + SetEmptySelection(position); + } +} + +/** + * @return -1 if given position is before the selection, + * 1 if position is after the selection, + * 0 if position is inside the selection, + */ +int Editor::PositionInSelection(int pos) { + pos = MovePositionOutsideChar(pos, currentPos - pos); + if (pos < SelectionStart()) { + return -1; + } + if (pos > SelectionEnd()) { + return 1; + } + if (selType == selStream) { + return 0; + } else { + SelectionLineIterator lineIterator(this); + lineIterator.SetAt(pdoc->LineFromPosition(pos)); + if (pos < lineIterator.startPos) { + return -1; + } else if (pos > lineIterator.endPos) { + return 1; + } else { + return 0; + } + } +} + +bool Editor::PointInSelection(Point pt) { + int pos = PositionFromLocation(pt); + if (0 == PositionInSelection(pos)) { + // Probably inside, but we must make a finer test + int selStart, selEnd; + if (selType == selStream) { + selStart = SelectionStart(); + selEnd = SelectionEnd(); + } else { + SelectionLineIterator lineIterator(this); + lineIterator.SetAt(pdoc->LineFromPosition(pos)); + selStart = lineIterator.startPos; + selEnd = lineIterator.endPos; + } + if (pos == selStart) { + // see if just before selection + Point locStart = LocationFromPosition(pos); + if (pt.x < locStart.x) { + return false; + } + } + if (pos == selEnd) { + // see if just after selection + Point locEnd = LocationFromPosition(pos); + if (pt.x > locEnd.x) { + return false; + } + } + return true; + } + return false; +} + +bool Editor::PointInSelMargin(Point pt) { + // Really means: "Point in a margin" + if (vs.fixedColumnWidth > 0) { // There is a margin + PRectangle rcSelMargin = GetClientRectangle(); + rcSelMargin.right = vs.fixedColumnWidth - vs.leftMarginWidth; + return rcSelMargin.Contains(pt); + } else { + return false; + } +} + +void Editor::LineSelection(int lineCurrent_, int lineAnchor_) { + if (lineAnchor_ < lineCurrent_) { + SetSelection(pdoc->LineStart(lineCurrent_ + 1), + pdoc->LineStart(lineAnchor_)); + } else if (lineAnchor_ > lineCurrent_) { + SetSelection(pdoc->LineStart(lineCurrent_), + pdoc->LineStart(lineAnchor_ + 1)); + } else { // Same line, select it + SetSelection(pdoc->LineStart(lineAnchor_ + 1), + pdoc->LineStart(lineAnchor_)); + } +} + +void Editor::DwellEnd(bool mouseMoved) { + if (mouseMoved) + ticksToDwell = dwellDelay; + else + ticksToDwell = SC_TIME_FOREVER; + if (dwelling && (dwellDelay < SC_TIME_FOREVER)) { + dwelling = false; + NotifyDwelling(ptMouseLast, dwelling); + } +} + +void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) { + //Platform::DebugPrintf("Scintilla:ButtonDown %d %d = %d alt=%d\n", curTime, lastClickTime, curTime - lastClickTime, alt); + ptMouseLast = pt; + int newPos = PositionFromLocation(pt); + newPos = MovePositionOutsideChar(newPos, currentPos - newPos); + inDragDrop = false; + moveExtendsSelection = false; + + bool processed = NotifyMarginClick(pt, shift, ctrl, alt); + if (processed) + return; + + bool inSelMargin = PointInSelMargin(pt); + if (shift & !inSelMargin) { + SetSelection(newPos); + } + if (((curTime - lastClickTime) < Platform::DoubleClickTime()) && Close(pt, lastClick)) { + //Platform::DebugPrintf("Double click %d %d = %d\n", curTime, lastClickTime, curTime - lastClickTime); + SetMouseCapture(true); + SetEmptySelection(newPos); + bool doubleClick = false; + // Stop mouse button bounce changing selection type + if (!Platform::MouseButtonBounce() || curTime != lastClickTime) { + if (selectionType == selChar) { + selectionType = selWord; + doubleClick = true; + } else if (selectionType == selWord) { + selectionType = selLine; + } else { + selectionType = selChar; + originalAnchorPos = currentPos; + } + } + + if (selectionType == selWord) { + if (currentPos >= originalAnchorPos) { // Moved forward + SetSelection(pdoc->ExtendWordSelect(currentPos, 1), + pdoc->ExtendWordSelect(originalAnchorPos, -1)); + } else { // Moved backward + SetSelection(pdoc->ExtendWordSelect(currentPos, -1), + pdoc->ExtendWordSelect(originalAnchorPos, 1)); + } + } else if (selectionType == selLine) { + lineAnchor = LineFromLocation(pt); + SetSelection(pdoc->LineStart(lineAnchor + 1), pdoc->LineStart(lineAnchor)); + //Platform::DebugPrintf("Triple click: %d - %d\n", anchor, currentPos); + } else { + SetEmptySelection(currentPos); + } + //Platform::DebugPrintf("Double click: %d - %d\n", anchor, currentPos); + if (doubleClick) { + NotifyDoubleClick(pt, shift, ctrl, alt); + if (PositionIsHotspot(newPos)) + NotifyHotSpotDoubleClicked(newPos, shift, ctrl, alt); + } + } else { // Single click + if (inSelMargin) { + selType = selStream; + if (ctrl) { + SelectAll(); + lastClickTime = curTime; + return; + } + if (!shift) { + lineAnchor = LineFromLocation(pt); + // Single click in margin: select whole line + LineSelection(lineAnchor, lineAnchor); + SetSelection(pdoc->LineStart(lineAnchor + 1), + pdoc->LineStart(lineAnchor)); + } else { + // Single shift+click in margin: select from line anchor to clicked line + if (anchor > currentPos) + lineAnchor = pdoc->LineFromPosition(anchor - 1); + else + lineAnchor = pdoc->LineFromPosition(anchor); + int lineStart = LineFromLocation(pt); + LineSelection(lineStart, lineAnchor); + //lineAnchor = lineStart; // Keep the same anchor for ButtonMove + } + + SetDragPosition(invalidPosition); + SetMouseCapture(true); + selectionType = selLine; + } else { + if (PointIsHotspot(pt)) { + NotifyHotSpotClicked(newPos, shift, ctrl, alt); + } + if (!shift) { + inDragDrop = PointInSelection(pt) && !SelectionEmpty(); + } + if (inDragDrop) { + SetMouseCapture(false); + SetDragPosition(newPos); + CopySelectionRange(&drag); + StartDrag(); + } else { + SetDragPosition(invalidPosition); + SetMouseCapture(true); + if (!shift) { + SetEmptySelection(newPos); + } + selType = alt ? selRectangle : selStream; + selectionType = selChar; + originalAnchorPos = currentPos; + SetRectangularRange(); + } + } + } + lastClickTime = curTime; + lastXChosen = pt.x; + ShowCaretAtCurrentPosition(); +} + +bool Editor::PositionIsHotspot(int position) { + return vs.styles[pdoc->StyleAt(position) & pdoc->stylingBitsMask].hotspot; +} + +bool Editor::PointIsHotspot(Point pt) { + int pos = PositionFromLocationClose(pt); + if (pos == INVALID_POSITION) + return false; + return PositionIsHotspot(pos); +} + +void Editor::SetHotSpotRange(Point *pt) { + if (pt) { + int pos = PositionFromLocation(*pt); + + // If we don't limit this to word characters then the + // range can encompass more than the run range and then + // the underline will not be drawn properly. + int hsStart_ = pdoc->ExtendStyleRange(pos, -1, vs.hotspotSingleLine); + int hsEnd_ = pdoc->ExtendStyleRange(pos, 1, vs.hotspotSingleLine); + + // Only invalidate the range if the hotspot range has changed... + if (hsStart_ != hsStart || hsEnd_ != hsEnd) { + if (hsStart != -1) { + InvalidateRange(hsStart, hsEnd); + } + hsStart = hsStart_; + hsEnd = hsEnd_; + InvalidateRange(hsStart, hsEnd); + } + } else { + if (hsStart != -1) { + int hsStart_ = hsStart; + int hsEnd_ = hsEnd; + hsStart = -1; + hsEnd = -1; + InvalidateRange(hsStart_, hsEnd_); + } else { + hsStart = -1; + hsEnd = -1; + } + } +} + +void Editor::GetHotSpotRange(int& hsStart_, int& hsEnd_) { + hsStart_ = hsStart; + hsEnd_ = hsEnd; +} + +void Editor::ButtonMove(Point pt) { + if ((ptMouseLast.x != pt.x) || (ptMouseLast.y != pt.y)) { + DwellEnd(true); + } + ptMouseLast = pt; + //Platform::DebugPrintf("Move %d %d\n", pt.x, pt.y); + if (HaveMouseCapture()) { + + // Slow down autoscrolling/selection + autoScrollTimer.ticksToWait -= timer.tickSize; + if (autoScrollTimer.ticksToWait > 0) + return; + autoScrollTimer.ticksToWait = autoScrollDelay; + + // Adjust selection + int movePos = PositionFromLocation(pt); + movePos = MovePositionOutsideChar(movePos, currentPos - movePos); + if (posDrag >= 0) { + SetDragPosition(movePos); + } else { + if (selectionType == selChar) { + SetSelection(movePos); + } else if (selectionType == selWord) { + // Continue selecting by word + if (movePos == originalAnchorPos) { // Didn't move + // No need to do anything. Previously this case was lumped + // in with "Moved forward", but that can be harmful in this + // case: a handler for the NotifyDoubleClick re-adjusts + // the selection for a fancier definition of "word" (for + // example, in Perl it is useful to include the leading + // '$', '%' or '@' on variables for word selection). In this + // the ButtonMove() called via Tick() for auto-scrolling + // could result in the fancier word selection adjustment + // being unmade. + } else if (movePos > originalAnchorPos) { // Moved forward + SetSelection(pdoc->ExtendWordSelect(movePos, 1), + pdoc->ExtendWordSelect(originalAnchorPos, -1)); + } else { // Moved backward + SetSelection(pdoc->ExtendWordSelect(movePos, -1), + pdoc->ExtendWordSelect(originalAnchorPos, 1)); + } + } else { + // Continue selecting by line + int lineMove = LineFromLocation(pt); + LineSelection(lineMove, lineAnchor); + } + } + // While dragging to make rectangular selection, we don't want the current + // position to jump to the end of smaller or empty lines. + //xEndSelect = pt.x - vs.fixedColumnWidth + xOffset; + xEndSelect = XFromPosition(movePos); + + // Autoscroll + PRectangle rcClient = GetClientRectangle(); + if (pt.y > rcClient.bottom) { + int lineMove = cs.DisplayFromDoc(LineFromLocation(pt)); + if (lineMove < 0) { + lineMove = cs.DisplayFromDoc(pdoc->LinesTotal() - 1); + } + ScrollTo(lineMove - LinesOnScreen() + 5); + Redraw(); + } else if (pt.y < rcClient.top) { + int lineMove = cs.DisplayFromDoc(LineFromLocation(pt)); + ScrollTo(lineMove - 5); + Redraw(); + } + EnsureCaretVisible(false, false, true); + + if (hsStart != -1 && !PositionIsHotspot(movePos)) + SetHotSpotRange(NULL); + + } else { + if (vs.fixedColumnWidth > 0) { // There is a margin + if (PointInSelMargin(pt)) { + DisplayCursor(Window::cursorReverseArrow); + return; // No need to test for selection + } + } + // Display regular (drag) cursor over selection + if (PointInSelection(pt) && !SelectionEmpty()) { + DisplayCursor(Window::cursorArrow); + } else if (PointIsHotspot(pt)) { + DisplayCursor(Window::cursorHand); + SetHotSpotRange(&pt); + } else { + DisplayCursor(Window::cursorText); + SetHotSpotRange(NULL); + } + } +} + +void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) { + //Platform::DebugPrintf("ButtonUp %d\n", HaveMouseCapture()); + if (HaveMouseCapture()) { + if (PointInSelMargin(pt)) { + DisplayCursor(Window::cursorReverseArrow); + } else { + DisplayCursor(Window::cursorText); + SetHotSpotRange(NULL); + } + ptMouseLast = pt; + SetMouseCapture(false); + int newPos = PositionFromLocation(pt); + newPos = MovePositionOutsideChar(newPos, currentPos - newPos); + if (inDragDrop) { + int selStart = SelectionStart(); + int selEnd = SelectionEnd(); + if (selStart < selEnd) { + if (drag.len) { + if (ctrl) { + if (pdoc->InsertString(newPos, drag.s, drag.len)) { + SetSelection(newPos, newPos + drag.len); + } + } else if (newPos < selStart) { + pdoc->DeleteChars(selStart, drag.len); + if (pdoc->InsertString(newPos, drag.s, drag.len)) { + SetSelection(newPos, newPos + drag.len); + } + } else if (newPos > selEnd) { + pdoc->DeleteChars(selStart, drag.len); + newPos -= drag.len; + if (pdoc->InsertString(newPos, drag.s, drag.len)) { + SetSelection(newPos, newPos + drag.len); + } + } else { + SetEmptySelection(newPos); + } + drag.Free(); + } + selectionType = selChar; + } + } else { + if (selectionType == selChar) { + SetSelection(newPos); + } + } + SetRectangularRange(); + lastClickTime = curTime; + lastClick = pt; + lastXChosen = pt.x; + if (selType == selStream) { + SetLastXChosen(); + } + inDragDrop = false; + EnsureCaretVisible(false); + } +} + +// Called frequently to perform background UI including +// caret blinking and automatic scrolling. +void Editor::Tick() { + if (HaveMouseCapture()) { + // Auto scroll + ButtonMove(ptMouseLast); + } + if (caret.period > 0) { + timer.ticksToWait -= timer.tickSize; + if (timer.ticksToWait <= 0) { + caret.on = !caret.on; + timer.ticksToWait = caret.period; + if (caret.active) { + InvalidateCaret(); + } + } + } + if ((dwellDelay < SC_TIME_FOREVER) && + (ticksToDwell > 0) && + (!HaveMouseCapture())) { + ticksToDwell -= timer.tickSize; + if (ticksToDwell <= 0) { + dwelling = true; + NotifyDwelling(ptMouseLast, dwelling); + } + } +} + +bool Editor::Idle() { + + bool idleDone; + + bool wrappingDone = wrapState == eWrapNone; + + if (!wrappingDone) { + // Wrap lines during idle. + WrapLines(false, -1); + // No more wrapping + if (wrapStart == wrapEnd) + wrappingDone = true; + } + + // Add more idle things to do here, but make sure idleDone is + // set correctly before the function returns. returning + // false will stop calling this idle funtion until SetIdle() is + // called again. + + idleDone = wrappingDone; // && thatDone && theOtherThingDone... + + return !idleDone; +} + +void Editor::SetFocusState(bool focusState) { + hasFocus = focusState; + NotifyFocus(hasFocus); + if (hasFocus) { + ShowCaretAtCurrentPosition(); + } else { + CancelModes(); + DropCaret(); + } +} + +bool Editor::PaintContains(PRectangle rc) { + return rcPaint.Contains(rc); +} + +bool Editor::PaintContainsMargin() { + PRectangle rcSelMargin = GetClientRectangle(); + rcSelMargin.right = vs.fixedColumnWidth; + return PaintContains(rcSelMargin); +} + +void Editor::CheckForChangeOutsidePaint(Range r) { + if (paintState == painting && !paintingAllText) { + //Platform::DebugPrintf("Checking range in paint %d-%d\n", r.start, r.end); + if (!r.Valid()) + return; + + PRectangle rcRange = RectangleFromRange(r.start, r.end); + PRectangle rcText = GetTextRectangle(); + if (rcRange.top < rcText.top) { + rcRange.top = rcText.top; + } + if (rcRange.bottom > rcText.bottom) { + rcRange.bottom = rcText.bottom; + } + + if (!PaintContains(rcRange)) { + AbandonPaint(); + } + } +} + +void Editor::SetBraceHighlight(Position pos0, Position pos1, int matchStyle) { + if ((pos0 != braces[0]) || (pos1 != braces[1]) || (matchStyle != bracesMatchStyle)) { + if ((braces[0] != pos0) || (matchStyle != bracesMatchStyle)) { + CheckForChangeOutsidePaint(Range(braces[0])); + CheckForChangeOutsidePaint(Range(pos0)); + braces[0] = pos0; + } + if ((braces[1] != pos1) || (matchStyle != bracesMatchStyle)) { + CheckForChangeOutsidePaint(Range(braces[1])); + CheckForChangeOutsidePaint(Range(pos1)); + braces[1] = pos1; + } + bracesMatchStyle = matchStyle; + if (paintState == notPainting) { + Redraw(); + } + } +} + +void Editor::SetDocPointer(Document *document) { + //Platform::DebugPrintf("** %x setdoc to %x\n", pdoc, document); + pdoc->RemoveWatcher(this, 0); + pdoc->Release(); + if (document == NULL) { + pdoc = new Document(); + } else { + pdoc = document; + } + pdoc->AddRef(); + + // Ensure all positions within document + selType = selStream; + currentPos = 0; + anchor = 0; + targetStart = 0; + targetEnd = 0; + + braces[0] = invalidPosition; + braces[1] = invalidPosition; + + // Reset the contraction state to fully shown. + cs.Clear(); + cs.InsertLines(0, pdoc->LinesTotal() - 1); + llc.Deallocate(); + NeedWrapping(); + + pdoc->AddWatcher(this, 0); + SetScrollBars(); + Redraw(); +} + +/** + * Recursively expand a fold, making lines visible except where they have an unexpanded parent. + */ +void Editor::Expand(int &line, bool doExpand) { + int lineMaxSubord = pdoc->GetLastChild(line); + line++; + while (line <= lineMaxSubord) { + if (doExpand) + cs.SetVisible(line, line, true); + int level = pdoc->GetLevel(line); + if (level & SC_FOLDLEVELHEADERFLAG) { + if (doExpand && cs.GetExpanded(line)) { + Expand(line, true); + } else { + Expand(line, false); + } + } else { + line++; + } + } +} + +void Editor::ToggleContraction(int line) { + if (line >= 0) { + if ((pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG) == 0) { + line = pdoc->GetFoldParent(line); + if (line < 0) + return; + } + + if (cs.GetExpanded(line)) { + int lineMaxSubord = pdoc->GetLastChild(line); + cs.SetExpanded(line, 0); + if (lineMaxSubord > line) { + cs.SetVisible(line + 1, lineMaxSubord, false); + + int lineCurrent = pdoc->LineFromPosition(currentPos); + if (lineCurrent > line && lineCurrent <= lineMaxSubord) { + // This does not re-expand the fold + EnsureCaretVisible(); + } + + SetScrollBars(); + Redraw(); + } + + } else { + if (!(cs.GetVisible(line))) { + EnsureLineVisible(line, false); + GoToLine(line); + } + cs.SetExpanded(line, 1); + Expand(line, true); + SetScrollBars(); + Redraw(); + } + } +} + +/** + * Recurse up from this line to find any folds that prevent this line from being visible + * and unfold them all. + */ +void Editor::EnsureLineVisible(int lineDoc, bool enforcePolicy) { + + // In case in need of wrapping to ensure DisplayFromDoc works. + WrapLines(true, -1); + + if (!cs.GetVisible(lineDoc)) { + int lineParent = pdoc->GetFoldParent(lineDoc); + if (lineParent >= 0) { + if (lineDoc != lineParent) + EnsureLineVisible(lineParent, enforcePolicy); + if (!cs.GetExpanded(lineParent)) { + cs.SetExpanded(lineParent, 1); + Expand(lineParent, true); + } + } + SetScrollBars(); + Redraw(); + } + if (enforcePolicy) { + int lineDisplay = cs.DisplayFromDoc(lineDoc); + if (visiblePolicy & VISIBLE_SLOP) { + if ((topLine > lineDisplay) || ((visiblePolicy & VISIBLE_STRICT) && (topLine + visibleSlop > lineDisplay))) { + SetTopLine(Platform::Clamp(lineDisplay - visibleSlop, 0, MaxScrollPos())); + SetVerticalScrollPos(); + Redraw(); + } else if ((lineDisplay > topLine + LinesOnScreen() - 1) || + ((visiblePolicy & VISIBLE_STRICT) && (lineDisplay > topLine + LinesOnScreen() - 1 - visibleSlop))) { + SetTopLine(Platform::Clamp(lineDisplay - LinesOnScreen() + 1 + visibleSlop, 0, MaxScrollPos())); + SetVerticalScrollPos(); + Redraw(); + } + } else { + if ((topLine > lineDisplay) || (lineDisplay > topLine + LinesOnScreen() - 1) || (visiblePolicy & VISIBLE_STRICT)) { + SetTopLine(Platform::Clamp(lineDisplay - LinesOnScreen() / 2 + 1, 0, MaxScrollPos())); + SetVerticalScrollPos(); + Redraw(); + } + } + } +} + +int Editor::ReplaceTarget(bool replacePatterns, const char *text, int length) { + pdoc->BeginUndoAction(); + if (length == -1) + length = istrlen(text); + if (replacePatterns) { + text = pdoc->SubstituteByPosition(text, &length); + if (!text) + return 0; + } + if (targetStart != targetEnd) + pdoc->DeleteChars(targetStart, targetEnd - targetStart); + targetEnd = targetStart; + pdoc->InsertString(targetStart, text, length); + targetEnd = targetStart + length; + pdoc->EndUndoAction(); + return length; +} + +bool Editor::IsUnicodeMode() const { + return pdoc && (SC_CP_UTF8 == pdoc->dbcsCodePage); +} + +int Editor::CodePage() const { + if (pdoc) + return pdoc->dbcsCodePage; + else + return 0; +} + +int Editor::WrapCount(int line) { + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(line)); + + if (surface && ll) { + LayoutLine(line, surface, vs, ll, wrapWidth); + return ll->lines; + } else { + return 1; + } +} + +void Editor::AddStyledText(char *buffer, int appendLength) { + // The buffer consists of alternating character bytes and style bytes + size_t textLength = appendLength / 2; + char *text = new char[textLength]; + if (text) { + size_t i; + for (i=0;iInsertString(CurrentPosition(), text, textLength); + for (i=0;iStartStyling(CurrentPosition(), static_cast(0xff)); + pdoc->SetStyles(textLength, text); + delete []text; + } + SetEmptySelection(currentPos + textLength); +} + +static bool ValidMargin(unsigned long wParam) { + return wParam < ViewStyle::margins; +} + +static char *CharPtrFromSPtr(sptr_t lParam) { + return reinterpret_cast(lParam); +} + +sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { + //Platform::DebugPrintf("S start wnd proc %d %d %d\n",iMessage, wParam, lParam); + + // Optional macro recording hook + if (recordingMacro) + NotifyMacroRecord(iMessage, wParam, lParam); + + switch (iMessage) { + + case SCI_GETTEXT: { + if (lParam == 0) + return pdoc->Length() + 1; + if (wParam == 0) + return 0; + char *ptr = CharPtrFromSPtr(lParam); + unsigned int iChar = 0; + for (; iChar < wParam - 1; iChar++) + ptr[iChar] = pdoc->CharAt(iChar); + ptr[iChar] = '\0'; + return iChar; + } + + case SCI_SETTEXT: { + if (lParam == 0) + return 0; + pdoc->BeginUndoAction(); + pdoc->DeleteChars(0, pdoc->Length()); + SetEmptySelection(0); + pdoc->InsertCString(0, CharPtrFromSPtr(lParam)); + pdoc->EndUndoAction(); + return 1; + } + + case SCI_GETTEXTLENGTH: + return pdoc->Length(); + + case SCI_CUT: + Cut(); + SetLastXChosen(); + break; + + case SCI_COPY: + Copy(); + break; + + case SCI_COPYRANGE: + CopyRangeToClipboard(wParam, lParam); + break; + + case SCI_COPYTEXT: + CopyText(wParam, CharPtrFromSPtr(lParam)); + break; + + case SCI_PASTE: + Paste(); + if (!caretSticky) { + SetLastXChosen(); + } + EnsureCaretVisible(); + break; + + case SCI_CLEAR: + Clear(); + SetLastXChosen(); + EnsureCaretVisible(); + break; + + case SCI_UNDO: + Undo(); + SetLastXChosen(); + break; + + case SCI_CANUNDO: + return (pdoc->CanUndo() && !pdoc->IsReadOnly()) ? 1 : 0; + + case SCI_EMPTYUNDOBUFFER: + pdoc->DeleteUndoHistory(); + return 0; + + case SCI_GETFIRSTVISIBLELINE: + return topLine; + + case SCI_GETLINE: { // Risk of overwriting the end of the buffer + int lineStart = pdoc->LineStart(wParam); + int lineEnd = pdoc->LineStart(wParam + 1); + if (lParam == 0) { + return lineEnd - lineStart; + } + char *ptr = CharPtrFromSPtr(lParam); + int iPlace = 0; + for (int iChar = lineStart; iChar < lineEnd; iChar++) { + ptr[iPlace++] = pdoc->CharAt(iChar); + } + return iPlace; + } + + case SCI_GETLINECOUNT: + if (pdoc->LinesTotal() == 0) + return 1; + else + return pdoc->LinesTotal(); + + case SCI_GETMODIFY: + return !pdoc->IsSavePoint(); + + case SCI_SETSEL: { + int nStart = static_cast(wParam); + int nEnd = static_cast(lParam); + if (nEnd < 0) + nEnd = pdoc->Length(); + if (nStart < 0) + nStart = nEnd; // Remove selection + selType = selStream; + SetSelection(nEnd, nStart); + EnsureCaretVisible(); + } + break; + + case SCI_GETSELTEXT: { + if (lParam == 0) { + if (selType == selStream) { + return 1 + SelectionEnd() - SelectionStart(); + } else { + // TODO: why is selLines handled the slow way? + int size = 0; + int extraCharsPerLine = 0; + if (selType != selLines) + extraCharsPerLine = (pdoc->eolMode == SC_EOL_CRLF) ? 2 : 1; + SelectionLineIterator lineIterator(this); + while (lineIterator.Iterate()) { + size += lineIterator.endPos + extraCharsPerLine - lineIterator.startPos; + } + + return 1 + size; + } + } + SelectionText selectedText; + CopySelectionRange(&selectedText); + char *ptr = CharPtrFromSPtr(lParam); + int iChar = 0; + if (selectedText.len) { + for (; iChar < selectedText.len; iChar++) + ptr[iChar] = selectedText.s[iChar]; + } else { + ptr[0] = '\0'; + } + return iChar; + } + + case SCI_LINEFROMPOSITION: + if (static_cast(wParam) < 0) + return 0; + return pdoc->LineFromPosition(wParam); + + case SCI_POSITIONFROMLINE: + if (static_cast(wParam) < 0) + wParam = pdoc->LineFromPosition(SelectionStart()); + if (wParam == 0) + return 0; // Even if there is no text, there is a first line that starts at 0 + if (static_cast(wParam) > pdoc->LinesTotal()) + return -1; + //if (wParam > pdoc->LineFromPosition(pdoc->Length())) // Useful test, anyway... + // return -1; + return pdoc->LineStart(wParam); + + // Replacement of the old Scintilla interpretation of EM_LINELENGTH + case SCI_LINELENGTH: + if ((static_cast(wParam) < 0) || + (static_cast(wParam) > pdoc->LineFromPosition(pdoc->Length()))) + return 0; + return pdoc->LineStart(wParam + 1) - pdoc->LineStart(wParam); + + case SCI_REPLACESEL: { + if (lParam == 0) + return 0; + pdoc->BeginUndoAction(); + ClearSelection(); + char *replacement = CharPtrFromSPtr(lParam); + pdoc->InsertCString(currentPos, replacement); + pdoc->EndUndoAction(); + SetEmptySelection(currentPos + istrlen(replacement)); + EnsureCaretVisible(); + } + break; + + case SCI_SETTARGETSTART: + targetStart = wParam; + break; + + case SCI_GETTARGETSTART: + return targetStart; + + case SCI_SETTARGETEND: + targetEnd = wParam; + break; + + case SCI_GETTARGETEND: + return targetEnd; + + case SCI_TARGETFROMSELECTION: + if (currentPos < anchor) { + targetStart = currentPos; + targetEnd = anchor; + } else { + targetStart = anchor; + targetEnd = currentPos; + } + break; + + case SCI_REPLACETARGET: + PLATFORM_ASSERT(lParam); + return ReplaceTarget(false, CharPtrFromSPtr(lParam), wParam); + + case SCI_REPLACETARGETRE: + PLATFORM_ASSERT(lParam); + return ReplaceTarget(true, CharPtrFromSPtr(lParam), wParam); + + case SCI_SEARCHINTARGET: + PLATFORM_ASSERT(lParam); + return SearchInTarget(CharPtrFromSPtr(lParam), wParam); + + case SCI_SETSEARCHFLAGS: + searchFlags = wParam; + break; + + case SCI_GETSEARCHFLAGS: + return searchFlags; + + case SCI_POSITIONBEFORE: + return pdoc->MovePositionOutsideChar(wParam-1, -1, true); + + case SCI_POSITIONAFTER: + return pdoc->MovePositionOutsideChar(wParam+1, 1, true); + + case SCI_LINESCROLL: + ScrollTo(topLine + lParam); + HorizontalScrollTo(xOffset + wParam * vs.spaceWidth); + return 1; + + case SCI_SETXOFFSET: + xOffset = wParam; + SetHorizontalScrollPos(); + Redraw(); + break; + + case SCI_GETXOFFSET: + return xOffset; + + case SCI_CHOOSECARETX: + SetLastXChosen(); + break; + + case SCI_SCROLLCARET: + EnsureCaretVisible(); + break; + + case SCI_SETREADONLY: + pdoc->SetReadOnly(wParam != 0); + return 1; + + case SCI_GETREADONLY: + return pdoc->IsReadOnly(); + + case SCI_CANPASTE: + return CanPaste(); + + case SCI_POINTXFROMPOSITION: + if (lParam < 0) { + return 0; + } else { + Point pt = LocationFromPosition(lParam); + return pt.x; + } + + case SCI_POINTYFROMPOSITION: + if (lParam < 0) { + return 0; + } else { + Point pt = LocationFromPosition(lParam); + return pt.y; + } + + case SCI_FINDTEXT: + return FindText(wParam, lParam); + + case SCI_GETTEXTRANGE: { + if (lParam == 0) + return 0; + TextRange *tr = reinterpret_cast(lParam); + int cpMax = tr->chrg.cpMax; + if (cpMax == -1) + cpMax = pdoc->Length(); + PLATFORM_ASSERT(cpMax <= pdoc->Length()); + int len = cpMax - tr->chrg.cpMin; // No -1 as cpMin and cpMax are referring to inter character positions + pdoc->GetCharRange(tr->lpstrText, tr->chrg.cpMin, len); + // Spec says copied text is terminated with a NUL + tr->lpstrText[len] = '\0'; + return len; // Not including NUL + } + + case SCI_HIDESELECTION: + hideSelection = wParam != 0; + Redraw(); + break; + + case SCI_FORMATRANGE: + return FormatRange(wParam != 0, reinterpret_cast(lParam)); + + case SCI_GETMARGINLEFT: + return vs.leftMarginWidth; + + case SCI_GETMARGINRIGHT: + return vs.rightMarginWidth; + + case SCI_SETMARGINLEFT: + vs.leftMarginWidth = lParam; + InvalidateStyleRedraw(); + break; + + case SCI_SETMARGINRIGHT: + vs.rightMarginWidth = lParam; + InvalidateStyleRedraw(); + break; + + // Control specific mesages + + case SCI_ADDTEXT: { + if (lParam == 0) + return 0; + pdoc->InsertString(CurrentPosition(), CharPtrFromSPtr(lParam), wParam); + SetEmptySelection(currentPos + wParam); + return 0; + } + + case SCI_ADDSTYLEDTEXT: + if (lParam) + AddStyledText(CharPtrFromSPtr(lParam), wParam); + return 0; + + case SCI_INSERTTEXT: { + if (lParam == 0) + return 0; + int insertPos = wParam; + if (static_cast(wParam) == -1) + insertPos = CurrentPosition(); + int newCurrent = CurrentPosition(); + char *sz = CharPtrFromSPtr(lParam); + pdoc->InsertCString(insertPos, sz); + if (newCurrent > insertPos) + newCurrent += istrlen(sz); + SetEmptySelection(newCurrent); + return 0; + } + + case SCI_APPENDTEXT: + pdoc->InsertString(pdoc->Length(), CharPtrFromSPtr(lParam), wParam); + return 0; + + case SCI_CLEARALL: + ClearAll(); + return 0; + + case SCI_CLEARDOCUMENTSTYLE: + ClearDocumentStyle(); + return 0; + + case SCI_SETUNDOCOLLECTION: + pdoc->SetUndoCollection(wParam != 0); + return 0; + + case SCI_GETUNDOCOLLECTION: + return pdoc->IsCollectingUndo(); + + case SCI_BEGINUNDOACTION: + pdoc->BeginUndoAction(); + return 0; + + case SCI_ENDUNDOACTION: + pdoc->EndUndoAction(); + return 0; + + case SCI_GETCARETPERIOD: + return caret.period; + + case SCI_SETCARETPERIOD: + caret.period = wParam; + break; + + case SCI_SETWORDCHARS: { + pdoc->SetDefaultCharClasses(false); + if (lParam == 0) + return 0; + pdoc->SetCharClasses(reinterpret_cast(lParam), CharClassify::ccWord); + } + break; + + case SCI_SETWHITESPACECHARS: { + if (lParam == 0) + return 0; + pdoc->SetCharClasses(reinterpret_cast(lParam), CharClassify::ccSpace); + } + break; + + case SCI_SETCHARSDEFAULT: + pdoc->SetDefaultCharClasses(true); + break; + + case SCI_GETLENGTH: + return pdoc->Length(); + + case SCI_ALLOCATE: + pdoc->Allocate(wParam); + break; + + case SCI_GETCHARAT: + return pdoc->CharAt(wParam); + + case SCI_SETCURRENTPOS: + SetSelection(wParam, anchor); + break; + + case SCI_GETCURRENTPOS: + return currentPos; + + case SCI_SETANCHOR: + SetSelection(currentPos, wParam); + break; + + case SCI_GETANCHOR: + return anchor; + + case SCI_SETSELECTIONSTART: + SetSelection(Platform::Maximum(currentPos, wParam), wParam); + break; + + case SCI_GETSELECTIONSTART: + return Platform::Minimum(anchor, currentPos); + + case SCI_SETSELECTIONEND: + SetSelection(wParam, Platform::Minimum(anchor, wParam)); + break; + + case SCI_GETSELECTIONEND: + return Platform::Maximum(anchor, currentPos); + + case SCI_SETPRINTMAGNIFICATION: + printMagnification = wParam; + break; + + case SCI_GETPRINTMAGNIFICATION: + return printMagnification; + + case SCI_SETPRINTCOLOURMODE: + printColourMode = wParam; + break; + + case SCI_GETPRINTCOLOURMODE: + return printColourMode; + + case SCI_SETPRINTWRAPMODE: + printWrapState = (wParam == SC_WRAP_WORD) ? eWrapWord : eWrapNone; + break; + + case SCI_GETPRINTWRAPMODE: + return printWrapState; + + case SCI_GETSTYLEAT: + if (static_cast(wParam) >= pdoc->Length()) + return 0; + else + return pdoc->StyleAt(wParam); + + case SCI_REDO: + Redo(); + break; + + case SCI_SELECTALL: + SelectAll(); + break; + + case SCI_SETSAVEPOINT: + pdoc->SetSavePoint(); + break; + + case SCI_GETSTYLEDTEXT: { + if (lParam == 0) + return 0; + TextRange *tr = reinterpret_cast(lParam); + int iPlace = 0; + for (int iChar = tr->chrg.cpMin; iChar < tr->chrg.cpMax; iChar++) { + tr->lpstrText[iPlace++] = pdoc->CharAt(iChar); + tr->lpstrText[iPlace++] = pdoc->StyleAt(iChar); + } + tr->lpstrText[iPlace] = '\0'; + tr->lpstrText[iPlace + 1] = '\0'; + return iPlace; + } + + case SCI_CANREDO: + return (pdoc->CanRedo() && !pdoc->IsReadOnly()) ? 1 : 0; + + case SCI_MARKERLINEFROMHANDLE: + return pdoc->LineFromHandle(wParam); + + case SCI_MARKERDELETEHANDLE: + pdoc->DeleteMarkFromHandle(wParam); + break; + + case SCI_GETVIEWWS: + return vs.viewWhitespace; + + case SCI_SETVIEWWS: + vs.viewWhitespace = static_cast(wParam); + Redraw(); + break; + + case SCI_POSITIONFROMPOINT: + return PositionFromLocation(Point(wParam, lParam)); + + case SCI_POSITIONFROMPOINTCLOSE: + return PositionFromLocationClose(Point(wParam, lParam)); + + case SCI_GOTOLINE: + GoToLine(wParam); + break; + + case SCI_GOTOPOS: + SetEmptySelection(wParam); + EnsureCaretVisible(); + Redraw(); + break; + + case SCI_GETCURLINE: { + int lineCurrentPos = pdoc->LineFromPosition(currentPos); + int lineStart = pdoc->LineStart(lineCurrentPos); + unsigned int lineEnd = pdoc->LineStart(lineCurrentPos + 1); + if (lParam == 0) { + return 1 + lineEnd - lineStart; + } + PLATFORM_ASSERT(wParam > 0); + char *ptr = CharPtrFromSPtr(lParam); + unsigned int iPlace = 0; + for (unsigned int iChar = lineStart; iChar < lineEnd && iPlace < wParam - 1; iChar++) { + ptr[iPlace++] = pdoc->CharAt(iChar); + } + ptr[iPlace] = '\0'; + return currentPos - lineStart; + } + + case SCI_GETENDSTYLED: + return pdoc->GetEndStyled(); + + case SCI_GETEOLMODE: + return pdoc->eolMode; + + case SCI_SETEOLMODE: + pdoc->eolMode = wParam; + break; + + case SCI_STARTSTYLING: + pdoc->StartStyling(wParam, static_cast(lParam)); + break; + + case SCI_SETSTYLING: + pdoc->SetStyleFor(wParam, static_cast(lParam)); + break; + + case SCI_SETSTYLINGEX: // Specify a complete styling buffer + if (lParam == 0) + return 0; + pdoc->SetStyles(wParam, CharPtrFromSPtr(lParam)); + break; + + case SCI_SETBUFFEREDDRAW: + bufferedDraw = wParam != 0; + break; + + case SCI_GETBUFFEREDDRAW: + return bufferedDraw; + + case SCI_GETTWOPHASEDRAW: + return twoPhaseDraw; + + case SCI_SETTWOPHASEDRAW: + twoPhaseDraw = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_SETTABWIDTH: + if (wParam > 0) { + pdoc->tabInChars = wParam; + if (pdoc->indentInChars == 0) + pdoc->actualIndentInChars = pdoc->tabInChars; + } + InvalidateStyleRedraw(); + break; + + case SCI_GETTABWIDTH: + return pdoc->tabInChars; + + case SCI_SETINDENT: + pdoc->indentInChars = wParam; + if (pdoc->indentInChars != 0) + pdoc->actualIndentInChars = pdoc->indentInChars; + else + pdoc->actualIndentInChars = pdoc->tabInChars; + InvalidateStyleRedraw(); + break; + + case SCI_GETINDENT: + return pdoc->indentInChars; + + case SCI_SETUSETABS: + pdoc->useTabs = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_GETUSETABS: + return pdoc->useTabs; + + case SCI_SETLINEINDENTATION: + pdoc->SetLineIndentation(wParam, lParam); + break; + + case SCI_GETLINEINDENTATION: + return pdoc->GetLineIndentation(wParam); + + case SCI_GETLINEINDENTPOSITION: + return pdoc->GetLineIndentPosition(wParam); + + case SCI_SETTABINDENTS: + pdoc->tabIndents = wParam != 0; + break; + + case SCI_GETTABINDENTS: + return pdoc->tabIndents; + + case SCI_SETBACKSPACEUNINDENTS: + pdoc->backspaceUnindents = wParam != 0; + break; + + case SCI_GETBACKSPACEUNINDENTS: + return pdoc->backspaceUnindents; + + case SCI_SETMOUSEDWELLTIME: + dwellDelay = wParam; + ticksToDwell = dwellDelay; + break; + + case SCI_GETMOUSEDWELLTIME: + return dwellDelay; + + case SCI_WORDSTARTPOSITION: + return pdoc->ExtendWordSelect(wParam, -1, lParam != 0); + + case SCI_WORDENDPOSITION: + return pdoc->ExtendWordSelect(wParam, 1, lParam != 0); + + case SCI_SETWRAPMODE: + switch (wParam) { + case SC_WRAP_WORD: + wrapState = eWrapWord; + break; + case SC_WRAP_CHAR: + wrapState = eWrapChar; + break; + default: + wrapState = eWrapNone; + break; + } + xOffset = 0; + InvalidateStyleRedraw(); + ReconfigureScrollBars(); + break; + + case SCI_GETWRAPMODE: + return wrapState; + + case SCI_SETWRAPVISUALFLAGS: + wrapVisualFlags = wParam; + actualWrapVisualStartIndent = wrapVisualStartIndent; + if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (actualWrapVisualStartIndent == 0)) + actualWrapVisualStartIndent = 1; // must indent to show start visual + InvalidateStyleRedraw(); + ReconfigureScrollBars(); + break; + + case SCI_GETWRAPVISUALFLAGS: + return wrapVisualFlags; + + case SCI_SETWRAPVISUALFLAGSLOCATION: + wrapVisualFlagsLocation = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETWRAPVISUALFLAGSLOCATION: + return wrapVisualFlagsLocation; + + case SCI_SETWRAPSTARTINDENT: + wrapVisualStartIndent = wParam; + actualWrapVisualStartIndent = wrapVisualStartIndent; + if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (actualWrapVisualStartIndent == 0)) + actualWrapVisualStartIndent = 1; // must indent to show start visual + InvalidateStyleRedraw(); + ReconfigureScrollBars(); + break; + + case SCI_GETWRAPSTARTINDENT: + return wrapVisualStartIndent; + + case SCI_SETLAYOUTCACHE: + llc.SetLevel(wParam); + break; + + case SCI_GETLAYOUTCACHE: + return llc.GetLevel(); + + case SCI_SETSCROLLWIDTH: + PLATFORM_ASSERT(wParam > 0); + if ((wParam > 0) && (wParam != static_cast(scrollWidth))) { + scrollWidth = wParam; + SetScrollBars(); + } + break; + + case SCI_GETSCROLLWIDTH: + return scrollWidth; + + case SCI_LINESJOIN: + LinesJoin(); + break; + + case SCI_LINESSPLIT: + LinesSplit(wParam); + break; + + case SCI_TEXTWIDTH: + PLATFORM_ASSERT(wParam <= STYLE_MAX); + PLATFORM_ASSERT(lParam); + return TextWidth(wParam, CharPtrFromSPtr(lParam)); + + case SCI_TEXTHEIGHT: + return vs.lineHeight; + + case SCI_SETENDATLASTLINE: + PLATFORM_ASSERT((wParam == 0) || (wParam == 1)); + if (endAtLastLine != (wParam != 0)) { + endAtLastLine = wParam != 0; + SetScrollBars(); + } + break; + + case SCI_GETENDATLASTLINE: + return endAtLastLine; + + case SCI_SETCARETSTICKY: + PLATFORM_ASSERT((wParam == 0) || (wParam == 1)); + if (caretSticky != (wParam != 0)) { + caretSticky = wParam != 0; + } + break; + + case SCI_GETCARETSTICKY: + return caretSticky; + + case SCI_TOGGLECARETSTICKY: + caretSticky = !caretSticky; + break; + + case SCI_GETCOLUMN: + return pdoc->GetColumn(wParam); + + case SCI_FINDCOLUMN: + return pdoc->FindColumn(wParam, lParam); + + case SCI_SETHSCROLLBAR : + if (horizontalScrollBarVisible != (wParam != 0)) { + horizontalScrollBarVisible = wParam != 0; + SetScrollBars(); + ReconfigureScrollBars(); + } + break; + + case SCI_GETHSCROLLBAR: + return horizontalScrollBarVisible; + + case SCI_SETVSCROLLBAR: + if (verticalScrollBarVisible != (wParam != 0)) { + verticalScrollBarVisible = wParam != 0; + SetScrollBars(); + ReconfigureScrollBars(); + } + break; + + case SCI_GETVSCROLLBAR: + return verticalScrollBarVisible; + + case SCI_SETINDENTATIONGUIDES: + vs.viewIndentationGuides = wParam != 0; + Redraw(); + break; + + case SCI_GETINDENTATIONGUIDES: + return vs.viewIndentationGuides; + + case SCI_SETHIGHLIGHTGUIDE: + if ((highlightGuideColumn != static_cast(wParam)) || (wParam > 0)) { + highlightGuideColumn = wParam; + Redraw(); + } + break; + + case SCI_GETHIGHLIGHTGUIDE: + return highlightGuideColumn; + + case SCI_GETLINEENDPOSITION: + return pdoc->LineEnd(wParam); + + case SCI_SETCODEPAGE: + if (ValidCodePage(wParam)) { + pdoc->dbcsCodePage = wParam; + InvalidateStyleRedraw(); + } + break; + + case SCI_GETCODEPAGE: + return pdoc->dbcsCodePage; + + case SCI_SETUSEPALETTE: + palette.allowRealization = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_GETUSEPALETTE: + return palette.allowRealization; + + // Marker definition and setting + case SCI_MARKERDEFINE: + if (wParam <= MARKER_MAX) + vs.markers[wParam].markType = lParam; + InvalidateStyleData(); + RedrawSelMargin(); + break; + case SCI_MARKERSETFORE: + if (wParam <= MARKER_MAX) + vs.markers[wParam].fore.desired = ColourDesired(lParam); + InvalidateStyleData(); + RedrawSelMargin(); + break; + case SCI_MARKERSETBACK: + if (wParam <= MARKER_MAX) + vs.markers[wParam].back.desired = ColourDesired(lParam); + InvalidateStyleData(); + RedrawSelMargin(); + break; + case SCI_MARKERSETALPHA: + if (wParam <= MARKER_MAX) + vs.markers[wParam].alpha = lParam; + InvalidateStyleRedraw(); + break; + case SCI_MARKERADD: { + int markerID = pdoc->AddMark(wParam, lParam); + return markerID; + } + case SCI_MARKERADDSET: + if (lParam != 0) + pdoc->AddMarkSet(wParam, lParam); + break; + + case SCI_MARKERDELETE: + pdoc->DeleteMark(wParam, lParam); + break; + + case SCI_MARKERDELETEALL: + pdoc->DeleteAllMarks(static_cast(wParam)); + break; + + case SCI_MARKERGET: + return pdoc->GetMark(wParam); + + case SCI_MARKERNEXT: { + int lt = pdoc->LinesTotal(); + for (int iLine = wParam; iLine < lt; iLine++) { + if ((pdoc->GetMark(iLine) & lParam) != 0) + return iLine; + } + } + return -1; + + case SCI_MARKERPREVIOUS: { + for (int iLine = wParam; iLine >= 0; iLine--) { + if ((pdoc->GetMark(iLine) & lParam) != 0) + return iLine; + } + } + return -1; + + case SCI_MARKERDEFINEPIXMAP: + if (wParam <= MARKER_MAX) { + vs.markers[wParam].SetXPM(CharPtrFromSPtr(lParam)); + }; + InvalidateStyleData(); + RedrawSelMargin(); + break; + + case SCI_SETMARGINTYPEN: + if (ValidMargin(wParam)) { + vs.ms[wParam].style = lParam; + InvalidateStyleRedraw(); + } + break; + + case SCI_GETMARGINTYPEN: + if (ValidMargin(wParam)) + return vs.ms[wParam].style; + else + return 0; + + case SCI_SETMARGINWIDTHN: + if (ValidMargin(wParam)) { + // Short-circuit if the width is unchanged, to avoid unnecessary redraw. + if (vs.ms[wParam].width != lParam) { + vs.ms[wParam].width = lParam; + InvalidateStyleRedraw(); + } + } + break; + + case SCI_GETMARGINWIDTHN: + if (ValidMargin(wParam)) + return vs.ms[wParam].width; + else + return 0; + + case SCI_SETMARGINMASKN: + if (ValidMargin(wParam)) { + vs.ms[wParam].mask = lParam; + InvalidateStyleRedraw(); + } + break; + + case SCI_GETMARGINMASKN: + if (ValidMargin(wParam)) + return vs.ms[wParam].mask; + else + return 0; + + case SCI_SETMARGINSENSITIVEN: + if (ValidMargin(wParam)) { + vs.ms[wParam].sensitive = lParam != 0; + InvalidateStyleRedraw(); + } + break; + + case SCI_GETMARGINSENSITIVEN: + if (ValidMargin(wParam)) + return vs.ms[wParam].sensitive ? 1 : 0; + else + return 0; + + case SCI_STYLECLEARALL: + vs.ClearStyles(); + InvalidateStyleRedraw(); + break; + + case SCI_STYLESETFORE: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].fore.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETBACK: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].back.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETBOLD: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].bold = lParam != 0; + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETITALIC: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].italic = lParam != 0; + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETEOLFILLED: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].eolFilled = lParam != 0; + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETSIZE: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].size = lParam; + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETFONT: + if (lParam == 0) + return 0; + if (wParam <= STYLE_MAX) { + vs.SetStyleFontName(wParam, CharPtrFromSPtr(lParam)); + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETUNDERLINE: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].underline = lParam != 0; + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETCASE: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].caseForce = static_cast(lParam); + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETCHARACTERSET: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].characterSet = lParam; + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETVISIBLE: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].visible = lParam != 0; + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETCHANGEABLE: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].changeable = lParam != 0; + InvalidateStyleRedraw(); + } + break; + case SCI_STYLESETHOTSPOT: + if (wParam <= STYLE_MAX) { + vs.styles[wParam].hotspot = lParam != 0; + InvalidateStyleRedraw(); + } + break; + case SCI_STYLEGETFORE: + if (wParam <= STYLE_MAX) + return vs.styles[wParam].fore.desired.AsLong(); + else + return 0; + case SCI_STYLEGETBACK: + if (wParam <= STYLE_MAX) + return vs.styles[wParam].back.desired.AsLong(); + else + return 0; + case SCI_STYLEGETBOLD: + if (wParam <= STYLE_MAX) + return vs.styles[wParam].bold ? 1 : 0; + else + return 0; + case SCI_STYLEGETITALIC: + if (wParam <= STYLE_MAX) + return vs.styles[wParam].italic ? 1 : 0; + else + return 0; + case SCI_STYLEGETEOLFILLED: + if (wParam <= STYLE_MAX) + return vs.styles[wParam].eolFilled ? 1 : 0; + else + return 0; + case SCI_STYLEGETSIZE: + if (wParam <= STYLE_MAX) + return vs.styles[wParam].size; + else + return 0; + case SCI_STYLEGETFONT: + if (lParam == 0) + return strlen(vs.styles[wParam].fontName); + + if (wParam <= STYLE_MAX) + strcpy(CharPtrFromSPtr(lParam), vs.styles[wParam].fontName); + break; + case SCI_STYLEGETUNDERLINE: + if (wParam <= STYLE_MAX) + return vs.styles[wParam].underline ? 1 : 0; + else + return 0; + case SCI_STYLEGETCASE: + if (wParam <= STYLE_MAX) + return static_cast(vs.styles[wParam].caseForce); + else + return 0; + case SCI_STYLEGETCHARACTERSET: + if (wParam <= STYLE_MAX) + return vs.styles[wParam].characterSet; + else + return 0; + case SCI_STYLEGETVISIBLE: + if (wParam <= STYLE_MAX) + return vs.styles[wParam].visible ? 1 : 0; + else + return 0; + case SCI_STYLEGETCHANGEABLE: + if (wParam <= STYLE_MAX) + return vs.styles[wParam].changeable ? 1 : 0; + else + return 0; + case SCI_STYLEGETHOTSPOT: + if (wParam <= STYLE_MAX) + return vs.styles[wParam].hotspot ? 1 : 0; + else + return 0; + case SCI_STYLERESETDEFAULT: + vs.ResetDefaultStyle(); + InvalidateStyleRedraw(); + break; + case SCI_SETSTYLEBITS: + pdoc->SetStylingBits(wParam); + break; + + case SCI_GETSTYLEBITS: + return pdoc->stylingBits; + + case SCI_SETLINESTATE: + return pdoc->SetLineState(wParam, lParam); + + case SCI_GETLINESTATE: + return pdoc->GetLineState(wParam); + + case SCI_GETMAXLINESTATE: + return pdoc->GetMaxLineState(); + + case SCI_GETCARETLINEVISIBLE: + return vs.showCaretLineBackground; + case SCI_SETCARETLINEVISIBLE: + vs.showCaretLineBackground = wParam != 0; + InvalidateStyleRedraw(); + break; + case SCI_GETCARETLINEBACK: + return vs.caretLineBackground.desired.AsLong(); + case SCI_SETCARETLINEBACK: + vs.caretLineBackground.desired = wParam; + InvalidateStyleRedraw(); + break; + case SCI_GETCARETLINEBACKALPHA: + return vs.caretLineAlpha; + case SCI_SETCARETLINEBACKALPHA: + vs.caretLineAlpha = wParam; + InvalidateStyleRedraw(); + break; + + // Folding messages + + case SCI_VISIBLEFROMDOCLINE: + return cs.DisplayFromDoc(wParam); + + case SCI_DOCLINEFROMVISIBLE: + return cs.DocFromDisplay(wParam); + + case SCI_WRAPCOUNT: + return WrapCount(wParam); + + case SCI_SETFOLDLEVEL: { + int prev = pdoc->SetLevel(wParam, lParam); + if (prev != lParam) + RedrawSelMargin(); + return prev; + } + + case SCI_GETFOLDLEVEL: + return pdoc->GetLevel(wParam); + + case SCI_GETLASTCHILD: + return pdoc->GetLastChild(wParam, lParam); + + case SCI_GETFOLDPARENT: + return pdoc->GetFoldParent(wParam); + + case SCI_SHOWLINES: + cs.SetVisible(wParam, lParam, true); + SetScrollBars(); + Redraw(); + break; + + case SCI_HIDELINES: + cs.SetVisible(wParam, lParam, false); + SetScrollBars(); + Redraw(); + break; + + case SCI_GETLINEVISIBLE: + return cs.GetVisible(wParam); + + case SCI_SETFOLDEXPANDED: + if (cs.SetExpanded(wParam, lParam != 0)) { + RedrawSelMargin(); + } + break; + + case SCI_GETFOLDEXPANDED: + return cs.GetExpanded(wParam); + + case SCI_SETFOLDFLAGS: + foldFlags = wParam; + Redraw(); + break; + + case SCI_TOGGLEFOLD: + ToggleContraction(wParam); + break; + + case SCI_ENSUREVISIBLE: + EnsureLineVisible(wParam, false); + break; + + case SCI_ENSUREVISIBLEENFORCEPOLICY: + EnsureLineVisible(wParam, true); + break; + + case SCI_SEARCHANCHOR: + SearchAnchor(); + break; + + case SCI_SEARCHNEXT: + case SCI_SEARCHPREV: + return SearchText(iMessage, wParam, lParam); + +#ifdef INCLUDE_DEPRECATED_FEATURES + case SCI_SETCARETPOLICY: // Deprecated + caretXPolicy = caretYPolicy = wParam; + caretXSlop = caretYSlop = lParam; + break; +#endif + + case SCI_SETXCARETPOLICY: + caretXPolicy = wParam; + caretXSlop = lParam; + break; + + case SCI_SETYCARETPOLICY: + caretYPolicy = wParam; + caretYSlop = lParam; + break; + + case SCI_SETVISIBLEPOLICY: + visiblePolicy = wParam; + visibleSlop = lParam; + break; + + case SCI_LINESONSCREEN: + return LinesOnScreen(); + + case SCI_SETSELFORE: + vs.selforeset = wParam != 0; + vs.selforeground.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETSELBACK: + vs.selbackset = wParam != 0; + vs.selbackground.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETSELALPHA: + vs.selAlpha = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETSELALPHA: + return vs.selAlpha; + + case SCI_GETSELEOLFILLED: + return vs.selEOLFilled; + + case SCI_SETSELEOLFILLED: + vs.selEOLFilled = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_SETWHITESPACEFORE: + vs.whitespaceForegroundSet = wParam != 0; + vs.whitespaceForeground.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETWHITESPACEBACK: + vs.whitespaceBackgroundSet = wParam != 0; + vs.whitespaceBackground.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETCARETFORE: + vs.caretcolour.desired = ColourDesired(wParam); + InvalidateStyleRedraw(); + break; + + case SCI_GETCARETFORE: + return vs.caretcolour.desired.AsLong(); + + case SCI_SETCARETWIDTH: + if (wParam <= 0) + vs.caretWidth = 0; + else if (wParam >= 3) + vs.caretWidth = 3; + else + vs.caretWidth = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETCARETWIDTH: + return vs.caretWidth; + + case SCI_ASSIGNCMDKEY: + kmap.AssignCmdKey(Platform::LowShortFromLong(wParam), + Platform::HighShortFromLong(wParam), lParam); + break; + + case SCI_CLEARCMDKEY: + kmap.AssignCmdKey(Platform::LowShortFromLong(wParam), + Platform::HighShortFromLong(wParam), SCI_NULL); + break; + + case SCI_CLEARALLCMDKEYS: + kmap.Clear(); + break; + + case SCI_INDICSETSTYLE: + if (wParam <= INDIC_MAX) { + vs.indicators[wParam].style = lParam; + InvalidateStyleRedraw(); + } + break; + + case SCI_INDICGETSTYLE: + return (wParam <= INDIC_MAX) ? vs.indicators[wParam].style : 0; + + case SCI_INDICSETFORE: + if (wParam <= INDIC_MAX) { + vs.indicators[wParam].fore.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + } + break; + + case SCI_INDICGETFORE: + return (wParam <= INDIC_MAX) ? vs.indicators[wParam].fore.desired.AsLong() : 0; + + case SCI_LINEDOWN: + case SCI_LINEDOWNEXTEND: + case SCI_PARADOWN: + case SCI_PARADOWNEXTEND: + case SCI_LINEUP: + case SCI_LINEUPEXTEND: + case SCI_PARAUP: + case SCI_PARAUPEXTEND: + case SCI_CHARLEFT: + case SCI_CHARLEFTEXTEND: + case SCI_CHARRIGHT: + case SCI_CHARRIGHTEXTEND: + case SCI_WORDLEFT: + case SCI_WORDLEFTEXTEND: + case SCI_WORDRIGHT: + case SCI_WORDRIGHTEXTEND: + case SCI_WORDLEFTEND: + case SCI_WORDLEFTENDEXTEND: + case SCI_WORDRIGHTEND: + case SCI_WORDRIGHTENDEXTEND: + case SCI_HOME: + case SCI_HOMEEXTEND: + case SCI_LINEEND: + case SCI_LINEENDEXTEND: + case SCI_HOMEWRAP: + case SCI_HOMEWRAPEXTEND: + case SCI_LINEENDWRAP: + case SCI_LINEENDWRAPEXTEND: + case SCI_DOCUMENTSTART: + case SCI_DOCUMENTSTARTEXTEND: + case SCI_DOCUMENTEND: + case SCI_DOCUMENTENDEXTEND: + + case SCI_STUTTEREDPAGEUP: + case SCI_STUTTEREDPAGEUPEXTEND: + case SCI_STUTTEREDPAGEDOWN: + case SCI_STUTTEREDPAGEDOWNEXTEND: + + case SCI_PAGEUP: + case SCI_PAGEUPEXTEND: + case SCI_PAGEDOWN: + case SCI_PAGEDOWNEXTEND: + case SCI_EDITTOGGLEOVERTYPE: + case SCI_CANCEL: + case SCI_DELETEBACK: + case SCI_TAB: + case SCI_BACKTAB: + case SCI_NEWLINE: + case SCI_FORMFEED: + case SCI_VCHOME: + case SCI_VCHOMEEXTEND: + case SCI_VCHOMEWRAP: + case SCI_VCHOMEWRAPEXTEND: + case SCI_ZOOMIN: + case SCI_ZOOMOUT: + case SCI_DELWORDLEFT: + case SCI_DELWORDRIGHT: + case SCI_DELLINELEFT: + case SCI_DELLINERIGHT: + case SCI_LINECOPY: + case SCI_LINECUT: + case SCI_LINEDELETE: + case SCI_LINETRANSPOSE: + case SCI_LINEDUPLICATE: + case SCI_LOWERCASE: + case SCI_UPPERCASE: + case SCI_LINESCROLLDOWN: + case SCI_LINESCROLLUP: + case SCI_WORDPARTLEFT: + case SCI_WORDPARTLEFTEXTEND: + case SCI_WORDPARTRIGHT: + case SCI_WORDPARTRIGHTEXTEND: + case SCI_DELETEBACKNOTLINE: + case SCI_HOMEDISPLAY: + case SCI_HOMEDISPLAYEXTEND: + case SCI_LINEENDDISPLAY: + case SCI_LINEENDDISPLAYEXTEND: + case SCI_LINEDOWNRECTEXTEND: + case SCI_LINEUPRECTEXTEND: + case SCI_CHARLEFTRECTEXTEND: + case SCI_CHARRIGHTRECTEXTEND: + case SCI_HOMERECTEXTEND: + case SCI_VCHOMERECTEXTEND: + case SCI_LINEENDRECTEXTEND: + case SCI_PAGEUPRECTEXTEND: + case SCI_PAGEDOWNRECTEXTEND: + case SCI_SELECTIONDUPLICATE: + return KeyCommand(iMessage); + + case SCI_BRACEHIGHLIGHT: + SetBraceHighlight(static_cast(wParam), lParam, STYLE_BRACELIGHT); + break; + + case SCI_BRACEBADLIGHT: + SetBraceHighlight(static_cast(wParam), -1, STYLE_BRACEBAD); + break; + + case SCI_BRACEMATCH: + // wParam is position of char to find brace for, + // lParam is maximum amount of text to restyle to find it + return pdoc->BraceMatch(wParam, lParam); + + case SCI_GETVIEWEOL: + return vs.viewEOL; + + case SCI_SETVIEWEOL: + vs.viewEOL = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_SETZOOM: + vs.zoomLevel = wParam; + InvalidateStyleRedraw(); + NotifyZoom(); + break; + + case SCI_GETZOOM: + return vs.zoomLevel; + + case SCI_GETEDGECOLUMN: + return theEdge; + + case SCI_SETEDGECOLUMN: + theEdge = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETEDGEMODE: + return vs.edgeState; + + case SCI_SETEDGEMODE: + vs.edgeState = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETEDGECOLOUR: + return vs.edgecolour.desired.AsLong(); + + case SCI_SETEDGECOLOUR: + vs.edgecolour.desired = ColourDesired(wParam); + InvalidateStyleRedraw(); + break; + + case SCI_GETDOCPOINTER: + return reinterpret_cast(pdoc); + + case SCI_SETDOCPOINTER: + CancelModes(); + SetDocPointer(reinterpret_cast(lParam)); + return 0; + + case SCI_CREATEDOCUMENT: { + Document *doc = new Document(); + if (doc) { + doc->AddRef(); + } + return reinterpret_cast(doc); + } + + case SCI_ADDREFDOCUMENT: + (reinterpret_cast(lParam))->AddRef(); + break; + + case SCI_RELEASEDOCUMENT: + (reinterpret_cast(lParam))->Release(); + break; + + case SCI_SETMODEVENTMASK: + modEventMask = wParam; + return 0; + + case SCI_GETMODEVENTMASK: + return modEventMask; + + case SCI_CONVERTEOLS: + pdoc->ConvertLineEnds(wParam); + SetSelection(currentPos, anchor); // Ensure selection inside document + return 0; + + case SCI_SETLENGTHFORENCODE: + lengthForEncode = wParam; + return 0; + + case SCI_SELECTIONISRECTANGLE: + return selType == selRectangle ? 1 : 0; + + case SCI_SETSELECTIONMODE: { + switch (wParam) { + case SC_SEL_STREAM: + moveExtendsSelection = !moveExtendsSelection || (selType != selStream); + selType = selStream; + break; + case SC_SEL_RECTANGLE: + moveExtendsSelection = !moveExtendsSelection || (selType != selRectangle); + selType = selRectangle; + break; + case SC_SEL_LINES: + moveExtendsSelection = !moveExtendsSelection || (selType != selLines); + selType = selLines; + break; + default: + moveExtendsSelection = !moveExtendsSelection || (selType != selStream); + selType = selStream; + } + InvalidateSelection(currentPos, anchor); + } + case SCI_GETSELECTIONMODE: + switch (selType) { + case selStream: + return SC_SEL_STREAM; + case selRectangle: + return SC_SEL_RECTANGLE; + case selLines: + return SC_SEL_LINES; + default: // ?! + return SC_SEL_STREAM; + } + case SCI_GETLINESELSTARTPOSITION: { + SelectionLineIterator lineIterator(this); + lineIterator.SetAt(wParam); + return lineIterator.startPos; + } + case SCI_GETLINESELENDPOSITION: { + SelectionLineIterator lineIterator(this); + lineIterator.SetAt(wParam); + return lineIterator.endPos; + } + + case SCI_SETOVERTYPE: + inOverstrike = wParam != 0; + break; + + case SCI_GETOVERTYPE: + return inOverstrike ? 1 : 0; + + case SCI_SETFOCUS: + SetFocusState(wParam != 0); + break; + + case SCI_GETFOCUS: + return hasFocus; + + case SCI_SETSTATUS: + errorStatus = wParam; + break; + + case SCI_GETSTATUS: + return errorStatus; + + case SCI_SETMOUSEDOWNCAPTURES: + mouseDownCaptures = wParam != 0; + break; + + case SCI_GETMOUSEDOWNCAPTURES: + return mouseDownCaptures; + + case SCI_SETCURSOR: + cursorMode = wParam; + DisplayCursor(Window::cursorText); + break; + + case SCI_GETCURSOR: + return cursorMode; + + case SCI_SETCONTROLCHARSYMBOL: + controlCharSymbol = wParam; + break; + + case SCI_GETCONTROLCHARSYMBOL: + return controlCharSymbol; + + case SCI_STARTRECORD: + recordingMacro = true; + return 0; + + case SCI_STOPRECORD: + recordingMacro = false; + return 0; + + case SCI_MOVECARETINSIDEVIEW: + MoveCaretInsideView(); + break; + + case SCI_SETFOLDMARGINCOLOUR: + vs.foldmarginColourSet = wParam != 0; + vs.foldmarginColour.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETFOLDMARGINHICOLOUR: + vs.foldmarginHighlightColourSet = wParam != 0; + vs.foldmarginHighlightColour.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETHOTSPOTACTIVEFORE: + vs.hotspotForegroundSet = wParam != 0; + vs.hotspotForeground.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_GETHOTSPOTACTIVEFORE: + return vs.hotspotForeground.desired.AsLong(); + + case SCI_SETHOTSPOTACTIVEBACK: + vs.hotspotBackgroundSet = wParam != 0; + vs.hotspotBackground.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_GETHOTSPOTACTIVEBACK: + return vs.hotspotBackground.desired.AsLong(); + + case SCI_SETHOTSPOTACTIVEUNDERLINE: + vs.hotspotUnderline = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_GETHOTSPOTACTIVEUNDERLINE: + return vs.hotspotUnderline ? 1 : 0; + + case SCI_SETHOTSPOTSINGLELINE: + vs.hotspotSingleLine = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_GETHOTSPOTSINGLELINE: + return vs.hotspotSingleLine ? 1 : 0; + + case SCI_SETPASTECONVERTENDINGS: + convertPastes = wParam != 0; + break; + + case SCI_GETPASTECONVERTENDINGS: + return convertPastes ? 1 : 0; + + default: + return DefWndProc(iMessage, wParam, lParam); + } + //Platform::DebugPrintf("end wnd proc\n"); + return 0l; +} diff --git a/scintilla/src/Editor.h b/scintilla/src/Editor.h new file mode 100644 index 00000000..c782b752 --- /dev/null +++ b/scintilla/src/Editor.h @@ -0,0 +1,583 @@ +// Scintilla source code edit control +/** @file Editor.h + ** Defines the main editor class. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef EDITOR_H +#define EDITOR_H + +/** + */ +class Caret { +public: + bool active; + bool on; + int period; + + Caret(); +}; + +/** + */ +class Timer { +public: + bool ticking; + int ticksToWait; + enum {tickSize = 100}; + TickerID tickerID; + + Timer(); +}; + +/** + */ +class Idler { +public: + bool state; + IdlerID idlerID; + + Idler(); +}; + +/** + */ +class LineLayout { +private: + friend class LineLayoutCache; + int *lineStarts; + int lenLineStarts; + /// Drawing is only performed for @a maxLineLength characters on each line. + int lineNumber; + bool inCache; +public: + enum { wrapWidthInfinite = 0x7ffffff }; + int maxLineLength; + int numCharsInLine; + enum validLevel { llInvalid, llCheckTextAndStyle, llPositions, llLines } validity; + int xHighlightGuide; + bool highlightColumn; + int selStart; + int selEnd; + bool containsCaret; + int edgeColumn; + char *chars; + unsigned char *styles; + int styleBitsSet; + char *indicators; + int *positions; + char bracePreviousStyles[2]; + + // Hotspot support + int hsStart; + int hsEnd; + + // Wrapped line support + int widthLine; + int lines; + + LineLayout(int maxLineLength_); + virtual ~LineLayout(); + void Resize(int maxLineLength_); + void Free(); + void Invalidate(validLevel validity_); + int LineStart(int line) { + if (line <= 0) { + return 0; + } else if ((line >= lines) || !lineStarts) { + return numCharsInLine; + } else { + return lineStarts[line]; + } + } + void SetLineStart(int line, int start); + void SetBracesHighlight(Range rangeLine, Position braces[], + char bracesMatchStyle, int xHighlight); + void RestoreBracesHighlight(Range rangeLine, Position braces[]); +}; + +/** + */ +class LineLayoutCache { + int level; + int length; + int size; + LineLayout **cache; + bool allInvalidated; + int styleClock; + int useCount; + void Allocate(int length_); + void AllocateForLevel(int linesOnScreen, int linesInDoc); +public: + LineLayoutCache(); + virtual ~LineLayoutCache(); + void Deallocate(); + enum { + llcNone=SC_CACHE_NONE, + llcCaret=SC_CACHE_CARET, + llcPage=SC_CACHE_PAGE, + llcDocument=SC_CACHE_DOCUMENT + }; + void Invalidate(LineLayout::validLevel validity_); + void SetLevel(int level_); + int GetLevel() { return level; } + LineLayout *Retrieve(int lineNumber, int lineCaret, int maxChars, int styleClock_, + int linesOnScreen, int linesInDoc); + void Dispose(LineLayout *ll); +}; + +/** + * Hold a piece of text selected for copying or dragging. + * The text is expected to hold a terminating '\0' and this is counted in len. + */ +class SelectionText { +public: + char *s; + int len; + bool rectangular; + int codePage; + int characterSet; + SelectionText() : s(0), len(0), rectangular(false), codePage(0), characterSet(0) {} + ~SelectionText() { + Free(); + } + void Free() { + Set(0, 0, 0, 0, false); + } + void Set(char *s_, int len_, int codePage_, int characterSet_, bool rectangular_) { + delete []s; + s = s_; + if (s) + len = len_; + else + len = 0; + codePage = codePage_; + characterSet = characterSet_; + rectangular = rectangular_; + } + void Copy(const char *s_, int len_, int codePage_, int characterSet_, bool rectangular_) { + delete []s; + s = new char[len_]; + if (s) { + len = len_; + for (int i = 0; i < len_; i++) { + s[i] = s_[i]; + } + } else { + len = 0; + } + codePage = codePage_; + characterSet = characterSet_; + rectangular = rectangular_; + } + void Copy(const SelectionText &other) { + Copy(other.s, other.len, other.codePage, other.characterSet, other.rectangular); + } +}; + +/** + */ +class Editor : public DocWatcher { + // Private so Editor objects can not be copied + Editor(const Editor &) : DocWatcher() {} + Editor &operator=(const Editor &) { return *this; } + +protected: // ScintillaBase subclass needs access to much of Editor + + /** On GTK+, Scintilla is a container widget holding two scroll bars + * whereas on Windows there is just one window with both scroll bars turned on. */ + Window wMain; ///< The Scintilla parent window + + /** Style resources may be expensive to allocate so are cached between uses. + * When a style attribute is changed, this cache is flushed. */ + bool stylesValid; + ViewStyle vs; + Palette palette; + + int printMagnification; + int printColourMode; + int printWrapState; + int cursorMode; + int controlCharSymbol; + + bool hasFocus; + bool hideSelection; + bool inOverstrike; + int errorStatus; + bool mouseDownCaptures; + + /** In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to + * the screen. This avoids flashing but is about 30% slower. */ + bool bufferedDraw; + /** In twoPhaseDraw mode, drawing is performed in two phases, first the background + * and then the foreground. This avoids chopping off characters that overlap the next run. */ + bool twoPhaseDraw; + + int xOffset; ///< Horizontal scrolled amount in pixels + int xCaretMargin; ///< Ensure this many pixels visible on both sides of caret + bool horizontalScrollBarVisible; + int scrollWidth; + bool verticalScrollBarVisible; + bool endAtLastLine; + bool caretSticky; + + Surface *pixmapLine; + Surface *pixmapSelMargin; + Surface *pixmapSelPattern; + Surface *pixmapIndentGuide; + Surface *pixmapIndentGuideHighlight; + + LineLayoutCache llc; + + KeyMap kmap; + + Caret caret; + Timer timer; + Timer autoScrollTimer; + enum { autoScrollDelay = 200 }; + + Idler idler; + + Point lastClick; + unsigned int lastClickTime; + int dwellDelay; + int ticksToDwell; + bool dwelling; + enum { selChar, selWord, selLine } selectionType; + Point ptMouseLast; + bool inDragDrop; + bool dropWentOutside; + int posDrag; + int posDrop; + int lastXChosen; + int lineAnchor; + int originalAnchorPos; + int currentPos; + int anchor; + int targetStart; + int targetEnd; + int searchFlags; + int topLine; + int posTopLine; + int lengthForEncode; + + bool needUpdateUI; + Position braces[2]; + int bracesMatchStyle; + int highlightGuideColumn; + + int theEdge; + + enum { notPainting, painting, paintAbandoned } paintState; + PRectangle rcPaint; + bool paintingAllText; + + int modEventMask; + + SelectionText drag; + enum selTypes { noSel, selStream, selRectangle, selLines }; + selTypes selType; + bool moveExtendsSelection; + int xStartSelect; ///< x position of start of rectangular selection + int xEndSelect; ///< x position of end of rectangular selection + bool primarySelection; + + int caretXPolicy; + int caretXSlop; ///< Ensure this many pixels visible on both sides of caret + + int caretYPolicy; + int caretYSlop; ///< Ensure this many lines visible on both sides of caret + + int visiblePolicy; + int visibleSlop; + + int searchAnchor; + + bool recordingMacro; + + int foldFlags; + ContractionState cs; + + // Hotspot support + int hsStart; + int hsEnd; + + // Wrapping support + enum { eWrapNone, eWrapWord, eWrapChar } wrapState; + enum { wrapLineLarge = 0x7ffffff }; + int wrapWidth; + int wrapStart; + int wrapEnd; + int wrapVisualFlags; + int wrapVisualFlagsLocation; + int wrapVisualStartIndent; + int actualWrapVisualStartIndent; + + bool convertPastes; + + Document *pdoc; + + Editor(); + virtual ~Editor(); + virtual void Initialise() = 0; + virtual void Finalise(); + + void InvalidateStyleData(); + void InvalidateStyleRedraw(); + virtual void RefreshColourPalette(Palette &pal, bool want); + void RefreshStyleData(); + void DropGraphics(); + + virtual PRectangle GetClientRectangle(); + PRectangle GetTextRectangle(); + + int LinesOnScreen(); + int LinesToScroll(); + int MaxScrollPos(); + Point LocationFromPosition(int pos); + int XFromPosition(int pos); + int PositionFromLocation(Point pt); + int PositionFromLocationClose(Point pt); + int PositionFromLineX(int line, int x); + int LineFromLocation(Point pt); + void SetTopLine(int topLineNew); + + bool AbandonPaint(); + void RedrawRect(PRectangle rc); + void Redraw(); + void RedrawSelMargin(int line=-1); + PRectangle RectangleFromRange(int start, int end); + void InvalidateRange(int start, int end); + + int CurrentPosition(); + bool SelectionEmpty(); + int SelectionStart(); + int SelectionEnd(); + void SetRectangularRange(); + void InvalidateSelection(int currentPos_, int anchor_); + void SetSelection(int currentPos_, int anchor_); + void SetSelection(int currentPos_); + void SetEmptySelection(int currentPos_); + bool RangeContainsProtected(int start, int end) const; + bool SelectionContainsProtected(); + int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true); + int MovePositionTo(int newPos, selTypes sel=noSel, bool ensureVisible=true); + int MovePositionSoVisible(int pos, int moveDir); + void SetLastXChosen(); + + void ScrollTo(int line, bool moveThumb=true); + virtual void ScrollText(int linesToMove); + void HorizontalScrollTo(int xPos); + void MoveCaretInsideView(bool ensureVisible=true); + int DisplayFromPosition(int pos); + void EnsureCaretVisible(bool useMargin=true, bool vert=true, bool horiz=true); + void ShowCaretAtCurrentPosition(); + void DropCaret(); + void InvalidateCaret(); + virtual void UpdateSystemCaret(); + + void NeedWrapping(int docLineStart = 0, int docLineEnd = wrapLineLarge); + bool WrapLines(bool fullWrap, int priorityWrapLineStart); + void LinesJoin(); + void LinesSplit(int pixelWidth); + + int SubstituteMarkerIfEmpty(int markerCheck, int markerDefault); + void PaintSelMargin(Surface *surface, PRectangle &rc); + LineLayout *RetrieveLineLayout(int lineNumber); + void LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll, + int width=LineLayout::wrapWidthInfinite); + ColourAllocated SelectionBackground(ViewStyle &vsDraw); + ColourAllocated TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll); + void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight); + void DrawWrapMarker(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourAllocated wrapColour); + void DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll, + int line, int lineEnd, int xStart, int subLine, int subLineStart, + bool overrideBackground, ColourAllocated background, + bool drawWrapMark, ColourAllocated wrapColour); + void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart, + PRectangle rcLine, LineLayout *ll, int subLine=0); + void RefreshPixMaps(Surface *surfaceWindow); + void Paint(Surface *surfaceWindow, PRectangle rcArea); + long FormatRange(bool draw, RangeToFormat *pfr); + int TextWidth(int style, const char *text); + + virtual void SetVerticalScrollPos() = 0; + virtual void SetHorizontalScrollPos() = 0; + virtual bool ModifyScrollBars(int nMax, int nPage) = 0; + virtual void ReconfigureScrollBars(); + void SetScrollBars(); + void ChangeSize(); + + void AddChar(char ch); + virtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false); + void ClearSelection(); + void ClearAll(); + void ClearDocumentStyle(); + void Cut(); + void PasteRectangular(int pos, const char *ptr, int len); + virtual void Copy() = 0; + virtual bool CanPaste(); + virtual void Paste() = 0; + void Clear(); + void SelectAll(); + void Undo(); + void Redo(); + void DelChar(); + void DelCharBack(bool allowLineStartDeletion); + virtual void ClaimSelection() = 0; + + virtual void NotifyChange() = 0; + virtual void NotifyFocus(bool focus); + virtual int GetCtrlID() { return ctrlID; } + virtual void NotifyParent(SCNotification scn) = 0; + virtual void NotifyStyleToNeeded(int endStyleNeeded); + void NotifyChar(int ch); + void NotifyMove(int position); + void NotifySavePoint(bool isSavePoint); + void NotifyModifyAttempt(); + virtual void NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt); + void NotifyHotSpotClicked(int position, bool shift, bool ctrl, bool alt); + void NotifyHotSpotDoubleClicked(int position, bool shift, bool ctrl, bool alt); + void NotifyUpdateUI(); + void NotifyPainted(); + bool NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt); + void NotifyNeedShown(int pos, int len); + void NotifyDwelling(Point pt, bool state); + void NotifyZoom(); + + void NotifyModifyAttempt(Document *document, void *userData); + void NotifySavePoint(Document *document, void *userData, bool atSavePoint); + void CheckModificationForWrap(DocModification mh); + void NotifyModified(Document *document, DocModification mh, void *userData); + void NotifyDeleted(Document *document, void *userData); + void NotifyStyleNeeded(Document *doc, void *userData, int endPos); + void NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam); + + void PageMove(int direction, selTypes sel=noSel, bool stuttered = false); + void ChangeCaseOfSelection(bool makeUpperCase); + void LineTranspose(); + void Duplicate(bool forLine); + virtual void CancelModes(); + void NewLine(); + void CursorUpOrDown(int direction, selTypes sel=noSel); + void ParaUpOrDown(int direction, selTypes sel=noSel); + int StartEndDisplayLine(int pos, bool start); + virtual int KeyCommand(unsigned int iMessage); + virtual int KeyDefault(int /* key */, int /*modifiers*/); + int KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed=0); + + int GetWhitespaceVisible(); + void SetWhitespaceVisible(int view); + + void Indent(bool forwards); + + long FindText(uptr_t wParam, sptr_t lParam); + void SearchAnchor(); + long SearchText(unsigned int iMessage, uptr_t wParam, sptr_t lParam); + long SearchInTarget(const char *text, int length); + void GoToLine(int lineNo); + + virtual void CopyToClipboard(const SelectionText &selectedText) = 0; + char *CopyRange(int start, int end); + void CopySelectionFromRange(SelectionText *ss, int start, int end); + void CopySelectionRange(SelectionText *ss); + void CopyRangeToClipboard(int start, int end); + void CopyText(int length, const char *text); + void SetDragPosition(int newPos); + virtual void DisplayCursor(Window::Cursor c); + virtual void StartDrag(); + void DropAt(int position, const char *value, bool moving, bool rectangular); + /** PositionInSelection returns 0 if position in selection, -1 if position before selection, and 1 if after. + * Before means either before any line of selection or before selection on its line, with a similar meaning to after. */ + int PositionInSelection(int pos); + bool PointInSelection(Point pt); + bool PointInSelMargin(Point pt); + void LineSelection(int lineCurrent_, int lineAnchor_); + void DwellEnd(bool mouseMoved); + virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt); + void ButtonMove(Point pt); + void ButtonUp(Point pt, unsigned int curTime, bool ctrl); + + void Tick(); + bool Idle(); + virtual void SetTicking(bool on) = 0; + virtual bool SetIdle(bool) { return false; } + virtual void SetMouseCapture(bool on) = 0; + virtual bool HaveMouseCapture() = 0; + void SetFocusState(bool focusState); + + virtual bool PaintContains(PRectangle rc); + bool PaintContainsMargin(); + void CheckForChangeOutsidePaint(Range r); + void SetBraceHighlight(Position pos0, Position pos1, int matchStyle); + + void SetDocPointer(Document *document); + + void Expand(int &line, bool doExpand); + void ToggleContraction(int line); + void EnsureLineVisible(int lineDoc, bool enforcePolicy); + int ReplaceTarget(bool replacePatterns, const char *text, int length=-1); + + bool PositionIsHotspot(int position); + bool PointIsHotspot(Point pt); + void SetHotSpotRange(Point *pt); + void GetHotSpotRange(int& hsStart, int& hsEnd); + + int CodePage() const; + virtual bool ValidCodePage(int /* codePage */) const { return true; } + int WrapCount(int line); + void AddStyledText(char *buffer, int appendLength); + + virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0; + +public: + // Public so the COM thunks can access it. + bool IsUnicodeMode() const; + // Public so scintilla_send_message can use it. + virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); + // Public so scintilla_set_id can use it. + int ctrlID; + friend class AutoSurface; + friend class SelectionLineIterator; +}; + +/** + * A smart pointer class to ensure Surfaces are set up and deleted correctly. + */ +class AutoSurface { +private: + Surface *surf; +public: + AutoSurface(Editor *ed) : surf(0) { + if (ed->wMain.GetID()) { + surf = Surface::Allocate(); + if (surf) { + surf->Init(ed->wMain.GetID()); + surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage()); + surf->SetDBCSMode(ed->CodePage()); + } + } + } + AutoSurface(SurfaceID sid, Editor *ed) : surf(0) { + if (ed->wMain.GetID()) { + surf = Surface::Allocate(); + if (surf) { + surf->Init(sid, ed->wMain.GetID()); + surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage()); + surf->SetDBCSMode(ed->CodePage()); + } + } + } + ~AutoSurface() { + delete surf; + } + Surface *operator->() const { + return surf; + } + operator Surface *() const { + return surf; + } +}; + +#endif diff --git a/scintilla/src/ExternalLexer.cxx b/scintilla/src/ExternalLexer.cxx new file mode 100644 index 00000000..7abfbdd9 --- /dev/null +++ b/scintilla/src/ExternalLexer.cxx @@ -0,0 +1,259 @@ +// Scintilla source code edit control +/** @file ExternalLexer.cxx + ** Support external lexers in DLLs. + **/ +// Copyright 2001 Simon Steele , portions copyright Neil Hodgson. +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include "Platform.h" + +#include "Scintilla.h" + +#include "SciLexer.h" +#include "PropSet.h" +#include "Accessor.h" +#include "DocumentAccessor.h" +#include "KeyWords.h" +#include "ExternalLexer.h" + +LexerManager *LexerManager::theInstance = NULL; + +//------------------------------------------ +// +// ExternalLexerModule +// +//------------------------------------------ + +char **WordListsToStrings(WordList *val[]) { + int dim = 0; + while (val[dim]) + dim++; + char **wls = new char * [dim + 1]; + for (int i = 0;i < dim;i++) { + SString words; + words = ""; + for (int n = 0; n < val[i]->len; n++) { + words += val[i]->words[n]; + if (n != val[i]->len - 1) + words += " "; + } + wls[i] = new char[words.length() + 1]; + strcpy(wls[i], words.c_str()); + } + wls[dim] = 0; + return wls; +} + +void DeleteWLStrings(char *strs[]) { + int dim = 0; + while (strs[dim]) { + delete strs[dim]; + dim++; + } + delete [] strs; +} + +void ExternalLexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const { + if (!fneLexer) + return ; + + char **kwds = WordListsToStrings(keywordlists); + char *ps = styler.GetProperties(); + + // The accessor passed in is always a DocumentAccessor so this cast and the subsequent + // access will work. Can not use the stricter dynamic_cast as that requires RTTI. + DocumentAccessor &da = static_cast(styler); + WindowID wID = da.GetWindow(); + + fneLexer(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps); + + delete ps; + DeleteWLStrings(kwds); +} + +void ExternalLexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const { + if (!fneFolder) + return ; + + char **kwds = WordListsToStrings(keywordlists); + char *ps = styler.GetProperties(); + + // The accessor passed in is always a DocumentAccessor so this cast and the subsequent + // access will work. Can not use the stricter dynamic_cast as that requires RTTI. + DocumentAccessor &da = static_cast(styler); + WindowID wID = da.GetWindow(); + + fneFolder(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps); + + delete ps; + DeleteWLStrings(kwds); +} + +void ExternalLexerModule::SetExternal(ExtLexerFunction fLexer, ExtFoldFunction fFolder, int index) { + fneLexer = fLexer; + fneFolder = fFolder; + externalLanguage = index; +} + +//------------------------------------------ +// +// LexerLibrary +// +//------------------------------------------ + +LexerLibrary::LexerLibrary(const char* ModuleName) { + // Initialise some members... + first = NULL; + last = NULL; + + // Load the DLL + lib = DynamicLibrary::Load(ModuleName); + if (lib->IsValid()) { + m_sModuleName = ModuleName; + //Cannot use reinterpret_cast because: ANSI C++ forbids casting between pointers to functions and objects + GetLexerCountFn GetLexerCount = (GetLexerCountFn)(sptr_t)lib->FindFunction("GetLexerCount"); + + if (GetLexerCount) { + ExternalLexerModule *lex; + LexerMinder *lm; + + // Find functions in the DLL + GetLexerNameFn GetLexerName = (GetLexerNameFn)(sptr_t)lib->FindFunction("GetLexerName"); + ExtLexerFunction Lexer = (ExtLexerFunction)(sptr_t)lib->FindFunction("Lex"); + ExtFoldFunction Folder = (ExtFoldFunction)(sptr_t)lib->FindFunction("Fold"); + + // Assign a buffer for the lexer name. + char lexname[100]; + strcpy(lexname, ""); + + int nl = GetLexerCount(); + + for (int i = 0; i < nl; i++) { + GetLexerName(i, lexname, 100); + lex = new ExternalLexerModule(SCLEX_AUTOMATIC, NULL, lexname, NULL); + + // Create a LexerMinder so we don't leak the ExternalLexerModule... + lm = new LexerMinder; + lm->self = lex; + lm->next = NULL; + if (first != NULL) { + last->next = lm; + last = lm; + } else { + first = lm; + last = lm; + } + + // The external lexer needs to know how to call into its DLL to + // do its lexing and folding, we tell it here. Folder may be null. + lex->SetExternal(Lexer, Folder, i); + } + } + } + next = NULL; +} + +LexerLibrary::~LexerLibrary() { + Release(); + delete lib; +} + +void LexerLibrary::Release() { + //TODO maintain a list of lexers created, and delete them! + LexerMinder *lm; + LexerMinder *next; + lm = first; + while (NULL != lm) { + next = lm->next; + delete lm->self; + delete lm; + lm = next; + } + + first = NULL; + last = NULL; +} + +//------------------------------------------ +// +// LexerManager +// +//------------------------------------------ + +/// Return the single LexerManager instance... +LexerManager *LexerManager::GetInstance() { + if(!theInstance) + theInstance = new LexerManager; + return theInstance; +} + +/// Delete any LexerManager instance... +void LexerManager::DeleteInstance() +{ + if(theInstance) { + delete theInstance; + theInstance = NULL; + } +} + +/// protected constructor - this is a singleton... +LexerManager::LexerManager() { + first = NULL; + last = NULL; +} + +LexerManager::~LexerManager() { + Clear(); +} + +void LexerManager::Load(const char* path) +{ + LoadLexerLibrary(path); +} + +void LexerManager::LoadLexerLibrary(const char* module) +{ + LexerLibrary *lib = new LexerLibrary(module); + if (NULL != first) { + last->next = lib; + last = lib; + } else { + first = lib; + last = lib; + } +} + +void LexerManager::Clear() +{ + if (NULL != first) { + LexerLibrary *cur = first; + LexerLibrary *next; + while (cur) { + next = cur->next; + delete cur; + cur = next; + } + first = NULL; + last = NULL; + } +} + +//------------------------------------------ +// +// LexerManager +// +//------------------------------------------ + +LMMinder::~LMMinder() +{ + LexerManager::DeleteInstance(); +} + +LMMinder minder; diff --git a/scintilla/src/ExternalLexer.h b/scintilla/src/ExternalLexer.h new file mode 100644 index 00000000..3888c1a2 --- /dev/null +++ b/scintilla/src/ExternalLexer.h @@ -0,0 +1,95 @@ +// Scintilla source code edit control +/** @file ExternalLexer.h + ** Support external lexers in DLLs. + **/ +// Copyright 2001 Simon Steele , portions copyright Neil Hodgson. +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef EXTERNALLEXER_H +#define EXTERNALLEXER_H + +#if PLAT_WIN +#define EXT_LEXER_DECL __stdcall +#else +#define EXT_LEXER_DECL +#endif + +// External Lexer function definitions... +typedef void (EXT_LEXER_DECL *ExtLexerFunction)(unsigned int lexer, unsigned int startPos, int length, int initStyle, + char *words[], WindowID window, char *props); +typedef void (EXT_LEXER_DECL *ExtFoldFunction)(unsigned int lexer, unsigned int startPos, int length, int initStyle, + char *words[], WindowID window, char *props); +typedef void* (EXT_LEXER_DECL *GetLexerFunction)(unsigned int Index); +typedef int (EXT_LEXER_DECL *GetLexerCountFn)(); +typedef void (EXT_LEXER_DECL *GetLexerNameFn)(unsigned int Index, char *name, int buflength); + +//class DynamicLibrary; + +/// Sub-class of LexerModule to use an external lexer. +class ExternalLexerModule : protected LexerModule { +protected: + ExtLexerFunction fneLexer; + ExtFoldFunction fneFolder; + int externalLanguage; + char name[100]; +public: + ExternalLexerModule(int language_, LexerFunction fnLexer_, + const char *languageName_=0, LexerFunction fnFolder_=0) : LexerModule(language_, fnLexer_, 0, fnFolder_){ + strncpy(name, languageName_, sizeof(name)); + languageName = name; + }; + virtual void Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const; + virtual void Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const; + virtual void SetExternal(ExtLexerFunction fLexer, ExtFoldFunction fFolder, int index); +}; + +/// LexerMinder points to an ExternalLexerModule - so we don't leak them. +class LexerMinder { +public: + ExternalLexerModule *self; + LexerMinder *next; +}; + +/// LexerLibrary exists for every External Lexer DLL, contains LexerMinders. +class LexerLibrary { + DynamicLibrary *lib; + LexerMinder *first; + LexerMinder *last; + +public: + LexerLibrary(const char* ModuleName); + ~LexerLibrary(); + void Release(); + + LexerLibrary *next; + SString m_sModuleName; +}; + +/// LexerManager manages external lexers, contains LexerLibrarys. +class LexerManager { +public: + ~LexerManager(); + + static LexerManager *GetInstance(); + static void DeleteInstance(); + + void Load(const char* path); + void Clear(); + +private: + LexerManager(); + static LexerManager *theInstance; + + void LoadLexerLibrary(const char* module); + LexerLibrary *first; + LexerLibrary *last; +}; + +class LMMinder { +public: + ~LMMinder(); +}; + +#endif diff --git a/scintilla/src/Indicator.cxx b/scintilla/src/Indicator.cxx new file mode 100644 index 00000000..1c41036c --- /dev/null +++ b/scintilla/src/Indicator.cxx @@ -0,0 +1,77 @@ +// Scintilla source code edit control +/** @file Indicator.cxx + ** Defines the style of indicators which are text decorations such as underlining. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include "Platform.h" + +#include "Scintilla.h" +#include "Indicator.h" + +void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine) { + surface->PenColour(fore.allocated); + int ymid = (rc.bottom + rc.top) / 2; + if (style == INDIC_SQUIGGLE) { + surface->MoveTo(rc.left, rc.top); + int x = rc.left + 2; + int y = 2; + while (x < rc.right) { + surface->LineTo(x, rc.top + y); + x += 2; + y = 2 - y; + } + surface->LineTo(rc.right, rc.top + y); // Finish the line + } else if (style == INDIC_TT) { + surface->MoveTo(rc.left, ymid); + int x = rc.left + 5; + while (x < rc.right) { + surface->LineTo(x, ymid); + surface->MoveTo(x-3, ymid); + surface->LineTo(x-3, ymid+2); + x++; + surface->MoveTo(x, ymid); + x += 5; + } + surface->LineTo(rc.right, ymid); // Finish the line + if (x - 3 <= rc.right) { + surface->MoveTo(x-3, ymid); + surface->LineTo(x-3, ymid+2); + } + } else if (style == INDIC_DIAGONAL) { + int x = rc.left; + while (x < rc.right) { + surface->MoveTo(x, rc.top+2); + int endX = x+3; + int endY = rc.top - 1; + if (endX > rc.right) { + endY += endX - rc.right; + endX = rc.right; + } + surface->LineTo(endX, endY); + x += 4; + } + } else if (style == INDIC_STRIKE) { + surface->MoveTo(rc.left, rc.top - 4); + surface->LineTo(rc.right, rc.top - 4); + } else if (style == INDIC_HIDDEN) { + // Draw nothing + } else if (style == INDIC_BOX) { + surface->MoveTo(rc.left, ymid+1); + surface->LineTo(rc.right, ymid+1); + surface->LineTo(rc.right, rcLine.top+1); + surface->LineTo(rc.left, rcLine.top+1); + surface->LineTo(rc.left, ymid+1); + } else if (style == INDIC_ROUNDBOX) { + PRectangle rcBox = rcLine; + rcBox.top = rcLine.top + 1; + rcBox.left = rc.left; + rcBox.right = rc.right; + surface->AlphaRectangle(rcBox, 1, fore.allocated, 30, fore.allocated, 50, 0); + } else { // Either INDIC_PLAIN or unknown + surface->MoveTo(rc.left, ymid); + surface->LineTo(rc.right, ymid); + } +} + diff --git a/scintilla/src/Indicator.h b/scintilla/src/Indicator.h new file mode 100644 index 00000000..646728ce --- /dev/null +++ b/scintilla/src/Indicator.h @@ -0,0 +1,22 @@ +// Scintilla source code edit control +/** @file Indicator.h + ** Defines the style of indicators which are text decorations such as underlining. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef INDICATOR_H +#define INDICATOR_H + +/** + */ +class Indicator { +public: + int style; + ColourPair fore; + Indicator() : style(INDIC_PLAIN), fore(ColourDesired(0,0,0)) { + } + void Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine); +}; + +#endif diff --git a/scintilla/src/KeyMap.cxx b/scintilla/src/KeyMap.cxx new file mode 100644 index 00000000..faf8a21f --- /dev/null +++ b/scintilla/src/KeyMap.cxx @@ -0,0 +1,148 @@ +// Scintilla source code edit control +/** @file KeyMap.cxx + ** Defines a mapping between keystrokes and commands. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include "Platform.h" + +#include "Scintilla.h" + +#include "KeyMap.h" + +KeyMap::KeyMap() : kmap(0), len(0), alloc(0) { + for (int i = 0; MapDefault[i].key; i++) { + AssignCmdKey(MapDefault[i].key, + MapDefault[i].modifiers, + MapDefault[i].msg); + } +} + +KeyMap::~KeyMap() { + Clear(); +} + +void KeyMap::Clear() { + delete []kmap; + kmap = 0; + len = 0; + alloc = 0; +} + +void KeyMap::AssignCmdKey(int key, int modifiers, unsigned int msg) { + if ((len+1) >= alloc) { + KeyToCommand *ktcNew = new KeyToCommand[alloc + 5]; + if (!ktcNew) + return; + for (int k = 0; k < len; k++) + ktcNew[k] = kmap[k]; + alloc += 5; + delete []kmap; + kmap = ktcNew; + } + for (int keyIndex = 0; keyIndex < len; keyIndex++) { + if ((key == kmap[keyIndex].key) && (modifiers == kmap[keyIndex].modifiers)) { + kmap[keyIndex].msg = msg; + return; + } + } + kmap[len].key = key; + kmap[len].modifiers = modifiers; + kmap[len].msg = msg; + len++; +} + +unsigned int KeyMap::Find(int key, int modifiers) { + for (int i = 0; i < len; i++) { + if ((key == kmap[i].key) && (modifiers == kmap[i].modifiers)) { + return kmap[i].msg; + } + } + return 0; +} + +const KeyToCommand KeyMap::MapDefault[] = { + {SCK_DOWN, SCI_NORM, SCI_LINEDOWN}, + {SCK_DOWN, SCI_SHIFT, SCI_LINEDOWNEXTEND}, + {SCK_DOWN, SCI_CTRL, SCI_LINESCROLLDOWN}, + {SCK_DOWN, SCI_ASHIFT, SCI_LINEDOWNRECTEXTEND}, + {SCK_UP, SCI_NORM, SCI_LINEUP}, + {SCK_UP, SCI_SHIFT, SCI_LINEUPEXTEND}, + {SCK_UP, SCI_CTRL, SCI_LINESCROLLUP}, + {SCK_UP, SCI_ASHIFT, SCI_LINEUPRECTEXTEND}, + {'[', SCI_CTRL, SCI_PARAUP}, + {'[', SCI_CSHIFT, SCI_PARAUPEXTEND}, + {']', SCI_CTRL, SCI_PARADOWN}, + {']', SCI_CSHIFT, SCI_PARADOWNEXTEND}, + {SCK_LEFT, SCI_NORM, SCI_CHARLEFT}, + {SCK_LEFT, SCI_SHIFT, SCI_CHARLEFTEXTEND}, + {SCK_LEFT, SCI_CTRL, SCI_WORDLEFT}, + {SCK_LEFT, SCI_CSHIFT, SCI_WORDLEFTEXTEND}, + {SCK_LEFT, SCI_ASHIFT, SCI_CHARLEFTRECTEXTEND}, + {SCK_RIGHT, SCI_NORM, SCI_CHARRIGHT}, + {SCK_RIGHT, SCI_SHIFT, SCI_CHARRIGHTEXTEND}, + {SCK_RIGHT, SCI_CTRL, SCI_WORDRIGHT}, + {SCK_RIGHT, SCI_CSHIFT, SCI_WORDRIGHTEXTEND}, + {SCK_RIGHT, SCI_ASHIFT, SCI_CHARRIGHTRECTEXTEND}, + {'/', SCI_CTRL, SCI_WORDPARTLEFT}, + {'/', SCI_CSHIFT, SCI_WORDPARTLEFTEXTEND}, + {'\\', SCI_CTRL, SCI_WORDPARTRIGHT}, + {'\\', SCI_CSHIFT, SCI_WORDPARTRIGHTEXTEND}, + {SCK_HOME, SCI_NORM, SCI_VCHOME}, + {SCK_HOME, SCI_SHIFT, SCI_VCHOMEEXTEND}, + {SCK_HOME, SCI_CTRL, SCI_DOCUMENTSTART}, + {SCK_HOME, SCI_CSHIFT, SCI_DOCUMENTSTARTEXTEND}, + {SCK_HOME, SCI_ALT, SCI_HOMEDISPLAY}, +// {SCK_HOME, SCI_ASHIFT, SCI_HOMEDISPLAYEXTEND}, + {SCK_HOME, SCI_ASHIFT, SCI_VCHOMERECTEXTEND}, + {SCK_END, SCI_NORM, SCI_LINEEND}, + {SCK_END, SCI_SHIFT, SCI_LINEENDEXTEND}, + {SCK_END, SCI_CTRL, SCI_DOCUMENTEND}, + {SCK_END, SCI_CSHIFT, SCI_DOCUMENTENDEXTEND}, + {SCK_END, SCI_ALT, SCI_LINEENDDISPLAY}, +// {SCK_END, SCI_ASHIFT, SCI_LINEENDDISPLAYEXTEND}, + {SCK_END, SCI_ASHIFT, SCI_LINEENDRECTEXTEND}, + {SCK_PRIOR, SCI_NORM, SCI_PAGEUP}, + {SCK_PRIOR, SCI_SHIFT, SCI_PAGEUPEXTEND}, + {SCK_PRIOR, SCI_ASHIFT, SCI_PAGEUPRECTEXTEND}, + {SCK_NEXT, SCI_NORM, SCI_PAGEDOWN}, + {SCK_NEXT, SCI_SHIFT, SCI_PAGEDOWNEXTEND}, + {SCK_NEXT, SCI_ASHIFT, SCI_PAGEDOWNRECTEXTEND}, + {SCK_DELETE, SCI_NORM, SCI_CLEAR}, + {SCK_DELETE, SCI_SHIFT, SCI_CUT}, + {SCK_DELETE, SCI_CTRL, SCI_DELWORDRIGHT}, + {SCK_DELETE, SCI_CSHIFT, SCI_DELLINERIGHT}, + {SCK_INSERT, SCI_NORM, SCI_EDITTOGGLEOVERTYPE}, + {SCK_INSERT, SCI_SHIFT, SCI_PASTE}, + {SCK_INSERT, SCI_CTRL, SCI_COPY}, + {SCK_ESCAPE, SCI_NORM, SCI_CANCEL}, + {SCK_BACK, SCI_NORM, SCI_DELETEBACK}, + {SCK_BACK, SCI_SHIFT, SCI_DELETEBACK}, + {SCK_BACK, SCI_CTRL, SCI_DELWORDLEFT}, + {SCK_BACK, SCI_ALT, SCI_UNDO}, + {SCK_BACK, SCI_CSHIFT, SCI_DELLINELEFT}, + {'Z', SCI_CTRL, SCI_UNDO}, + {'Y', SCI_CTRL, SCI_REDO}, + {'X', SCI_CTRL, SCI_CUT}, + {'C', SCI_CTRL, SCI_COPY}, + {'V', SCI_CTRL, SCI_PASTE}, + {'A', SCI_CTRL, SCI_SELECTALL}, + {SCK_TAB, SCI_NORM, SCI_TAB}, + {SCK_TAB, SCI_SHIFT, SCI_BACKTAB}, + {SCK_RETURN, SCI_NORM, SCI_NEWLINE}, + {SCK_RETURN, SCI_SHIFT, SCI_NEWLINE}, + {SCK_ADD, SCI_CTRL, SCI_ZOOMIN}, + {SCK_SUBTRACT, SCI_CTRL, SCI_ZOOMOUT}, + {SCK_DIVIDE, SCI_CTRL, SCI_SETZOOM}, + //'L', SCI_CTRL, SCI_FORMFEED, + {'L', SCI_CTRL, SCI_LINECUT}, + {'L', SCI_CSHIFT, SCI_LINEDELETE}, + {'T', SCI_CSHIFT, SCI_LINECOPY}, + {'T', SCI_CTRL, SCI_LINETRANSPOSE}, + {'D', SCI_CTRL, SCI_SELECTIONDUPLICATE}, + {'U', SCI_CTRL, SCI_LOWERCASE}, + {'U', SCI_CSHIFT, SCI_UPPERCASE}, + {0,0,0}, +}; + diff --git a/scintilla/src/KeyMap.h b/scintilla/src/KeyMap.h new file mode 100644 index 00000000..985d2cd5 --- /dev/null +++ b/scintilla/src/KeyMap.h @@ -0,0 +1,43 @@ +// Scintilla source code edit control +/** @file KeyMap.h + ** Defines a mapping between keystrokes and commands. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef KEYTOCOMMAND_H +#define KEYTOCOMMAND_H + +#define SCI_NORM 0 +#define SCI_SHIFT SCMOD_SHIFT +#define SCI_CTRL SCMOD_CTRL +#define SCI_ALT SCMOD_ALT +#define SCI_CSHIFT (SCI_CTRL | SCI_SHIFT) +#define SCI_ASHIFT (SCI_ALT | SCI_SHIFT) + +/** + */ +class KeyToCommand { +public: + int key; + int modifiers; + unsigned int msg; +}; + +/** + */ +class KeyMap { + KeyToCommand *kmap; + int len; + int alloc; + static const KeyToCommand MapDefault[]; + +public: + KeyMap(); + ~KeyMap(); + void Clear(); + void AssignCmdKey(int key, int modifiers, unsigned int msg); + unsigned int Find(int key, int modifiers); // 0 returned on failure +}; + +#endif diff --git a/scintilla/src/KeyWords.cxx b/scintilla/src/KeyWords.cxx new file mode 100644 index 00000000..b17a1c3f --- /dev/null +++ b/scintilla/src/KeyWords.cxx @@ -0,0 +1,223 @@ +// Scintilla source code edit control +/** @file KeyWords.cxx + ** Colourise for particular languages. + **/ +// Copyright 1998-2002 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +const LexerModule *LexerModule::base = 0; +int LexerModule::nextLanguage = SCLEX_AUTOMATIC+1; + +LexerModule::LexerModule(int language_, + LexerFunction fnLexer_, + const char *languageName_, + LexerFunction fnFolder_, + const char * const wordListDescriptions_[], + int styleBits_) : + language(language_), + fnLexer(fnLexer_), + fnFolder(fnFolder_), + wordListDescriptions(wordListDescriptions_), + styleBits(styleBits_), + languageName(languageName_) { + next = base; + base = this; + if (language == SCLEX_AUTOMATIC) { + language = nextLanguage; + nextLanguage++; + } +} + +int LexerModule::GetNumWordLists() const { + if (wordListDescriptions == NULL) { + return -1; + } else { + int numWordLists = 0; + + while (wordListDescriptions[numWordLists]) { + ++numWordLists; + } + + return numWordLists; + } +} + +const char *LexerModule::GetWordListDescription(int index) const { + static const char *emptyStr = ""; + + PLATFORM_ASSERT(index < GetNumWordLists()); + if (index >= GetNumWordLists()) { + return emptyStr; + } else { + return wordListDescriptions[index]; + } +} + +int LexerModule::GetStyleBitsNeeded() const { + return styleBits; +} + +const LexerModule *LexerModule::Find(int language) { + const LexerModule *lm = base; + while (lm) { + if (lm->language == language) { + return lm; + } + lm = lm->next; + } + return 0; +} + +const LexerModule *LexerModule::Find(const char *languageName) { + if (languageName) { + const LexerModule *lm = base; + while (lm) { + if (lm->languageName && 0 == strcmp(lm->languageName, languageName)) { + return lm; + } + lm = lm->next; + } + } + return 0; +} + +void LexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const { + if (fnLexer) + fnLexer(startPos, lengthDoc, initStyle, keywordlists, styler); +} + +void LexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const { + if (fnFolder) { + int lineCurrent = styler.GetLine(startPos); + // Move back one line in case deletion wrecked current line fold state + if (lineCurrent > 0) { + lineCurrent--; + int newStartPos = styler.LineStart(lineCurrent); + lengthDoc += startPos - newStartPos; + startPos = newStartPos; + initStyle = 0; + if (startPos > 0) { + initStyle = styler.StyleAt(startPos - 1); + } + } + fnFolder(startPos, lengthDoc, initStyle, keywordlists, styler); + } +} + +// Alternative historical name for Scintilla_LinkLexers +int wxForceScintillaLexers(void) { + return Scintilla_LinkLexers(); +} + +// To add or remove a lexer, add or remove its file and run LexGen.py. + +// Force a reference to all of the Scintilla lexers so that the linker will +// not remove the code of the lexers. +int Scintilla_LinkLexers() { + static int forcer = 0; + +// Shorten the code that declares a lexer and ensures it is linked in by calling a method. +#define LINK_LEXER(lexer) extern LexerModule lexer; forcer += lexer.GetLanguage(); + +//++Autogenerated -- run src/LexGen.py to regenerate +//**\(\tLINK_LEXER(\*);\n\) + LINK_LEXER(lmAda); + LINK_LEXER(lmAns1); + LINK_LEXER(lmAPDL); + LINK_LEXER(lmAsm); + LINK_LEXER(lmASP); + LINK_LEXER(lmAU3); + LINK_LEXER(lmAVE); + LINK_LEXER(lmBaan); + LINK_LEXER(lmBash); + LINK_LEXER(lmBatch); + LINK_LEXER(lmBlitzBasic); + LINK_LEXER(lmBullant); + LINK_LEXER(lmCaml); + LINK_LEXER(lmClw); + LINK_LEXER(lmClwNoCase); + LINK_LEXER(lmCmake); + LINK_LEXER(lmConf); + LINK_LEXER(lmCPP); + LINK_LEXER(lmCPPNoCase); + LINK_LEXER(lmCsound); + LINK_LEXER(lmCss); + LINK_LEXER(lmD); + LINK_LEXER(lmDiff); + LINK_LEXER(lmEiffel); + LINK_LEXER(lmEiffelkw); + LINK_LEXER(lmErlang); + LINK_LEXER(lmErrorList); + LINK_LEXER(lmESCRIPT); + LINK_LEXER(lmF77); + LINK_LEXER(lmFlagShip); + LINK_LEXER(lmForth); + LINK_LEXER(lmFortran); + LINK_LEXER(lmFreeBasic); + LINK_LEXER(lmGui4Cli); + LINK_LEXER(lmHaskell); + LINK_LEXER(lmHTML); + LINK_LEXER(lmInno); + LINK_LEXER(lmKix); + LINK_LEXER(lmLatex); + LINK_LEXER(lmLISP); + LINK_LEXER(lmLot); + LINK_LEXER(lmLout); + LINK_LEXER(lmLua); + LINK_LEXER(lmMake); + LINK_LEXER(lmMatlab); + LINK_LEXER(lmMETAPOST); + LINK_LEXER(lmMMIXAL); + LINK_LEXER(lmMSSQL); + LINK_LEXER(lmNncrontab); + LINK_LEXER(lmNsis); + LINK_LEXER(lmNull); + LINK_LEXER(lmOctave); + LINK_LEXER(lmOpal); + LINK_LEXER(lmPascal); + LINK_LEXER(lmPB); + LINK_LEXER(lmPerl); + LINK_LEXER(lmPHP); + LINK_LEXER(lmPHPSCRIPT); + LINK_LEXER(lmPOV); + LINK_LEXER(lmProps); + LINK_LEXER(lmPS); + LINK_LEXER(lmPureBasic); + LINK_LEXER(lmPython); + LINK_LEXER(lmREBOL); + LINK_LEXER(lmRuby); + LINK_LEXER(lmScriptol); + LINK_LEXER(lmSmalltalk); + LINK_LEXER(lmSpecman); + LINK_LEXER(lmSpice); + LINK_LEXER(lmSQL); + LINK_LEXER(lmTADS3); + LINK_LEXER(lmTCL); + LINK_LEXER(lmTeX); + LINK_LEXER(lmVB); + LINK_LEXER(lmVBScript); + LINK_LEXER(lmVerilog); + LINK_LEXER(lmVHDL); + LINK_LEXER(lmXML); + LINK_LEXER(lmYAML); + +//--Autogenerated -- end of automatically generated section + + return 1; +} diff --git a/scintilla/src/LexAPDL.cxx b/scintilla/src/LexAPDL.cxx new file mode 100644 index 00000000..d1347c2e --- /dev/null +++ b/scintilla/src/LexAPDL.cxx @@ -0,0 +1,136 @@ +// Scintilla source code edit control +/** @file LexAPDL.cxx + ** Lexer for APDL. Based on the lexer for Assembler by The Black Horus. + ** By Hadar Raz. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80 && (isalnum(ch) || ch == '_')); +} + +static inline bool IsAnOperator(char ch) { + // '.' left out as it is used to make up numbers + if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || ch == '^' || + ch == '[' || ch == ']' || ch == '<' || ch == '&' || + ch == '>' || ch == ',' || ch == '|' || ch == '~' || + ch == '$' || ch == ':' || ch == '%') + return true; + return false; +} + +static void ColouriseAPDLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + int stringStart = ' '; + + WordList &processors = *keywordlists[0]; + WordList &commands = *keywordlists[1]; + WordList &slashcommands = *keywordlists[2]; + WordList &starcommands = *keywordlists[3]; + WordList &arguments = *keywordlists[4]; + WordList &functions = *keywordlists[5]; + + // Do not leak onto next line + initStyle = SCE_APDL_DEFAULT; + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + // Determine if the current state should terminate. + if (sc.state == SCE_APDL_NUMBER) { + if (!(IsADigit(sc.ch) || sc.ch == '.' || (sc.ch == 'e' || sc.ch == 'E') || + ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) { + sc.SetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_COMMENT) { + if (sc.atLineEnd) { + sc.SetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_COMMENTBLOCK) { + if (sc.atLineEnd) { + if (sc.ch == '\r') { + sc.Forward(); + } + sc.ForwardSetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_STRING) { + if (sc.atLineEnd) { + sc.SetState(SCE_APDL_DEFAULT); + } else if ((sc.ch == '\'' && stringStart == '\'') || (sc.ch == '\"' && stringStart == '\"')) { + sc.ForwardSetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_WORD) { + if (!IsAWordChar(sc.ch)) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + if (processors.InList(s)) { + sc.ChangeState(SCE_APDL_PROCESSOR); + } else if (slashcommands.InList(s)) { + sc.ChangeState(SCE_APDL_SLASHCOMMAND); + } else if (starcommands.InList(s)) { + sc.ChangeState(SCE_APDL_STARCOMMAND); + } else if (commands.InList(s)) { + sc.ChangeState(SCE_APDL_COMMAND); + } else if (arguments.InList(s)) { + sc.ChangeState(SCE_APDL_ARGUMENT); + } else if (functions.InList(s)) { + sc.ChangeState(SCE_APDL_FUNCTION); + } + sc.SetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_OPERATOR) { + if (!IsAnOperator(static_cast(sc.ch))) { + sc.SetState(SCE_APDL_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_APDL_DEFAULT) { + if (sc.ch == '!' && sc.chNext == '!') { + sc.SetState(SCE_APDL_COMMENTBLOCK); + } else if (sc.ch == '!') { + sc.SetState(SCE_APDL_COMMENT); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_APDL_NUMBER); + } else if (sc.ch == '\'' || sc.ch == '\"') { + sc.SetState(SCE_APDL_STRING); + stringStart = sc.ch; + } else if (IsAWordChar(sc.ch) || ((sc.ch == '*' || sc.ch == '/') && !isgraph(sc.chPrev))) { + sc.SetState(SCE_APDL_WORD); + } else if (IsAnOperator(static_cast(sc.ch))) { + sc.SetState(SCE_APDL_OPERATOR); + } + } + } + sc.Complete(); +} + +static const char * const apdlWordListDesc[] = { + "processors", + "commands", + "slashommands", + "starcommands", + "arguments", + "functions", + 0 +}; + +LexerModule lmAPDL(SCLEX_APDL, ColouriseAPDLDoc, "apdl", 0, apdlWordListDesc); diff --git a/scintilla/src/LexAU3.cxx b/scintilla/src/LexAU3.cxx new file mode 100644 index 00000000..f0ac7a28 --- /dev/null +++ b/scintilla/src/LexAU3.cxx @@ -0,0 +1,894 @@ +// Scintilla source code edit control +// @file LexAU3.cxx +// Lexer for AutoIt3 http://www.hiddensoft.com/autoit3 +// by Jos van der Zande, jvdzande@yahoo.com +// +// Changes: +// March 28, 2004 - Added the standard Folding code +// April 21, 2004 - Added Preprosessor Table + Syntax Highlighting +// Fixed Number highlighting +// Changed default isoperator to IsAOperator to have a better match to AutoIt3 +// Fixed "#comments_start" -> "#comments-start" +// Fixed "#comments_end" -> "#comments-end" +// Fixed Sendkeys in Strings when not terminated with } +// Added support for Sendkey strings that have second parameter e.g. {UP 5} or {a down} +// April 26, 2004 - Fixed # pre-processor statement inside of comment block would invalidly change the color. +// Added logic for #include to treat the <> as string +// Added underscore to IsAOperator. +// May 17, 2004 - Changed the folding logic from indent to keyword folding. +// Added Folding logic for blocks of single-commentlines or commentblock. +// triggered by: fold.comment=1 +// Added Folding logic for preprocessor blocks triggered by fold.preprocessor=1 +// Added Special for #region - #endregion syntax highlight and folding. +// May 30, 2004 - Fixed issue with continuation lines on If statements. +// June 5, 2004 - Added comma to Operators for better readability. +// Added fold.compact support set with fold.compact=1 +// Changed folding inside of #cs-#ce. Default is no keyword folding inside comment blocks when fold.comment=1 +// it will now only happen when fold.comment=2. +// Sep 5, 2004 - Added logic to handle colourizing words on the last line. +// Typed Characters now show as "default" till they match any table. +// Oct 10, 2004 - Added logic to show Comments in "Special" directives. +// Nov 1, 2004 - Added better testing for Numbers supporting x and e notation. +// Nov 28, 2004 - Added logic to handle continuation lines for syntax highlighting. +// Jan 10, 2005 - Added Abbreviations Keyword used for expansion +// Mar 24, 2005 - Updated Abbreviations Keywords to fix when followed by Operator. +// Apr 18, 2005 - Updated #CE/#Comment-End logic to take a linecomment ";" into account +// - Added folding support for With...EndWith +// - Added support for a DOT in variable names +// - Fixed Underscore in CommentBlock +// May 23, 2005 - Fixed the SentKey lexing in case of a missing } +// Aug 11, 2005 - Fixed possible bug with s_save length > 100. +// Aug 23, 2005 - Added Switch/endswitch support to the folding logic. +// Sep 27, 2005 - Fixed the SentKey lexing logic in case of multiple sentkeys. +// Mar 12, 2006 - Fixed issue with <> coloring as String in stead of Operator in rare occasions. +// Apr 8, 2006 - Added support for AutoIt3 Standard UDF library (SCE_AU3_UDF) +// Mar 9, 2007 - Fixed bug with + following a String getting the wrong Color. +// +// Copyright for Scintilla: 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. +// Scintilla source code edit control + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +static inline bool IsTypeCharacter(const int ch) +{ + return ch == '$'; +} +static inline bool IsAWordChar(const int ch) +{ + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +static inline bool IsAWordStart(const int ch) +{ + return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '@' || ch == '#' || ch == '$' || ch == '.'); +} + +static inline bool IsAOperator(char ch) { + if (isascii(ch) && isalnum(ch)) + return false; + if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || + ch == '&' || ch == '^' || ch == '=' || ch == '<' || ch == '>' || + ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == ',' ) + return true; + return false; +} + +/////////////////////////////////////////////////////////////////////////////// +// GetSendKey() filters the portion before and after a/multiple space(s) +// and return the first portion to be looked-up in the table +// also check if the second portion is valid... (up,down.on.off,toggle or a number) +/////////////////////////////////////////////////////////////////////////////// + +static int GetSendKey(const char *szLine, char *szKey) +{ + int nFlag = 0; + int nStartFound = 0; + int nKeyPos = 0; + int nSpecPos= 0; + int nSpecNum= 1; + int nPos = 0; + char cTemp; + char szSpecial[100]; + + // split the portion of the sendkey in the part before and after the spaces + while ( ( (cTemp = szLine[nPos]) != '\0')) + { + // skip leading Ctrl/Shift/Alt state + if (cTemp == '{') { + nStartFound = 1; + } + // + if (nStartFound == 1) { + if ((cTemp == ' ') && (nFlag == 0) ) // get the stuff till first space + { + nFlag = 1; + // Add } to the end of the first bit for table lookup later. + szKey[nKeyPos++] = '}'; + } + else if (cTemp == ' ') + { + // skip other spaces + } + else if (nFlag == 0) + { + // save first portion into var till space or } is hit + szKey[nKeyPos++] = cTemp; + } + else if ((nFlag == 1) && (cTemp != '}')) + { + // Save second portion into var... + szSpecial[nSpecPos++] = cTemp; + // check if Second portion is all numbers for repeat fuction + if (isdigit(cTemp) == false) {nSpecNum = 0;} + } + } + nPos++; // skip to next char + + } // End While + + + // Check if the second portion is either a number or one of these keywords + szKey[nKeyPos] = '\0'; + szSpecial[nSpecPos] = '\0'; + if (strcmp(szSpecial,"down")== 0 || strcmp(szSpecial,"up")== 0 || + strcmp(szSpecial,"on")== 0 || strcmp(szSpecial,"off")== 0 || + strcmp(szSpecial,"toggle")== 0 || nSpecNum == 1 ) + { + nFlag = 0; + } + else + { + nFlag = 1; + } + return nFlag; // 1 is bad, 0 is good + +} // GetSendKey() + +// +// Routine to check the last "none comment" character on a line to see if its a continuation +// +static bool IsContinuationLine(unsigned int szLine, Accessor &styler) +{ + int nsPos = styler.LineStart(szLine); + int nePos = styler.LineStart(szLine+1) - 2; + //int stylech = styler.StyleAt(nsPos); + while (nsPos < nePos) + { + //stylech = styler.StyleAt(nePos); + int stylech = styler.StyleAt(nsPos); + if (!(stylech == SCE_AU3_COMMENT)) { + char ch = styler.SafeGetCharAt(nePos); + if (!isspacechar(ch)) { + if (ch == '_') + return true; + else + return false; + } + } + nePos--; // skip to next char + } // End While + return false; +} // IsContinuationLine() + +// +// syntax highlighting logic +static void ColouriseAU3Doc(unsigned int startPos, + int length, int initStyle, + WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + WordList &keywords5 = *keywordlists[4]; + WordList &keywords6 = *keywordlists[5]; + WordList &keywords7 = *keywordlists[6]; + WordList &keywords8 = *keywordlists[7]; + // find the first previous line without continuation character at the end + int lineCurrent = styler.GetLine(startPos); + int s_startPos = startPos; + // When not inside a Block comment: find First line without _ + if (!(initStyle==SCE_AU3_COMMENTBLOCK)) { + while ((lineCurrent > 0 && IsContinuationLine(lineCurrent,styler)) || + (lineCurrent > 1 && IsContinuationLine(lineCurrent-1,styler))) { + lineCurrent--; + startPos = styler.LineStart(lineCurrent); // get start position + initStyle = 0; // reset the start style to 0 + } + } + // Set the new length to include it from the start and set the start position + length = length + s_startPos - startPos; // correct the total length to process + styler.StartAt(startPos); + + StyleContext sc(startPos, length, initStyle, styler); + char si; // string indicator "=1 '=2 + char ni; // Numeric indicator error=9 normal=0 normal+dec=1 hex=2 Enot=3 + char ci; // comment indicator 0=not linecomment(;) + char s_save[100]; + si=0; + ni=0; + ci=0; + //$$$ + for (; sc.More(); sc.Forward()) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + // ********************************************** + // save the total current word for eof processing + if (IsAWordChar(sc.ch) || sc.ch == '}') + { + strcpy(s_save,s); + int tp = strlen(s_save); + if (tp < 99) { + s_save[tp] = static_cast(tolower(sc.ch)); + s_save[tp+1] = '\0'; + } + } + // ********************************************** + // + switch (sc.state) + { + case SCE_AU3_COMMENTBLOCK: + { + //Reset at line end + if (sc.atLineEnd) { + ci=0; + sc.SetState(SCE_AU3_COMMENTBLOCK); + } + //skip rest of line when a ; is encountered + if (sc.chPrev == ';') { + ci=2; + sc.SetState(SCE_AU3_COMMENTBLOCK); + } + // skip rest of the line + if (ci==2) + break; + // check when first character is detected on the line + if (ci==0) { + if (IsAWordStart(static_cast(sc.ch)) || IsAOperator(static_cast(sc.ch))) { + ci=1; + sc.SetState(SCE_AU3_COMMENTBLOCK); + } + break; + } + if (!(IsAWordChar(sc.ch) || (sc.ch == '-' && strcmp(s, "#comments") == 0))) { + if ((strcmp(s, "#ce")== 0 || strcmp(s, "#comments-end")== 0)) + sc.SetState(SCE_AU3_COMMENT); // set to comment line for the rest of the line + else + ci=2; // line doesn't begin with #CE so skip the rest of the line + } + break; + } + case SCE_AU3_COMMENT: + { + if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} + break; + } + case SCE_AU3_OPERATOR: + { + // check if its a COMobject + if (sc.chPrev == '.' && IsAWordChar(sc.ch)) { + sc.SetState(SCE_AU3_COMOBJ); + } + else { + sc.SetState(SCE_AU3_DEFAULT); + } + break; + } + case SCE_AU3_SPECIAL: + { + if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);} + if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} + break; + } + case SCE_AU3_KEYWORD: + { + if (!(IsAWordChar(sc.ch) || (sc.ch == '-' && (strcmp(s, "#comments") == 0 || strcmp(s, "#include") == 0)))) + { + if (!IsTypeCharacter(sc.ch)) + { + if (strcmp(s, "#cs")== 0 || strcmp(s, "#comments-start")== 0 ) + { + sc.ChangeState(SCE_AU3_COMMENTBLOCK); + sc.SetState(SCE_AU3_COMMENTBLOCK); + } + else if (keywords.InList(s)) { + sc.ChangeState(SCE_AU3_KEYWORD); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (keywords2.InList(s)) { + sc.ChangeState(SCE_AU3_FUNCTION); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (keywords3.InList(s)) { + sc.ChangeState(SCE_AU3_MACRO); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (keywords5.InList(s)) { + sc.ChangeState(SCE_AU3_PREPROCESSOR); + sc.SetState(SCE_AU3_DEFAULT); + if (strcmp(s, "#include")== 0) + { + si = 3; // use to determine string start for #inlude <> + } + } + else if (keywords6.InList(s)) { + sc.ChangeState(SCE_AU3_SPECIAL); + sc.SetState(SCE_AU3_SPECIAL); + } + else if ((keywords7.InList(s)) && (!IsAOperator(static_cast(sc.ch)))) { + sc.ChangeState(SCE_AU3_EXPAND); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (keywords8.InList(s)) { + sc.ChangeState(SCE_AU3_UDF); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (strcmp(s, "_") == 0) { + sc.ChangeState(SCE_AU3_OPERATOR); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (!IsAWordChar(sc.ch)) { + sc.ChangeState(SCE_AU3_DEFAULT); + sc.SetState(SCE_AU3_DEFAULT); + } + } + } + if (sc.atLineEnd) { + sc.SetState(SCE_AU3_DEFAULT);} + break; + } + case SCE_AU3_NUMBER: + { + // Numeric indicator error=9 normal=0 normal+dec=1 hex=2 E-not=3 + // + // test for Hex notation + if (strcmp(s, "0") == 0 && (sc.ch == 'x' || sc.ch == 'X') && ni == 0) + { + ni = 2; + break; + } + // test for E notation + if (IsADigit(sc.chPrev) && (sc.ch == 'e' || sc.ch == 'E') && ni <= 1) + { + ni = 3; + break; + } + // Allow Hex characters inside hex numeric strings + if ((ni == 2) && + (sc.ch == 'a' || sc.ch == 'b' || sc.ch == 'c' || sc.ch == 'd' || sc.ch == 'e' || sc.ch == 'f' || + sc.ch == 'A' || sc.ch == 'B' || sc.ch == 'C' || sc.ch == 'D' || sc.ch == 'E' || sc.ch == 'F' )) + { + break; + } + // test for 1 dec point only + if (sc.ch == '.') + { + if (ni==0) + { + ni=1; + } + else + { + ni=9; + } + break; + } + // end of numeric string ? + if (!(IsADigit(sc.ch))) + { + if (ni==9) + { + sc.ChangeState(SCE_AU3_DEFAULT); + } + sc.SetState(SCE_AU3_DEFAULT); + } + break; + } + case SCE_AU3_VARIABLE: + { + // Check if its a COMObject + if (sc.ch == '.' && !IsADigit(sc.chNext)) { + sc.SetState(SCE_AU3_OPERATOR); + } + else if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_AU3_DEFAULT); + } + break; + } + case SCE_AU3_COMOBJ: + { + if (!(IsAWordChar(sc.ch))) { + sc.SetState(SCE_AU3_DEFAULT); + } + break; + } + case SCE_AU3_STRING: + { + // check for " to end a double qouted string or + // check for ' to end a single qouted string + if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\'') || (si == 3 && sc.ch == '>')) + { + sc.ForwardSetState(SCE_AU3_DEFAULT); + si=0; + break; + } + if (sc.atLineEnd) + { + si=0; + // at line end and not found a continuation char then reset to default + int lineCurrent = styler.GetLine(sc.currentPos); + if (!IsContinuationLine(lineCurrent,styler)) + { + sc.SetState(SCE_AU3_DEFAULT); + break; + } + } + // find Sendkeys in a STRING + if (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ) { + sc.SetState(SCE_AU3_SENT);} + break; + } + + case SCE_AU3_SENT: + { + // Send key string ended + if (sc.chPrev == '}' && sc.ch != '}') + { + // set color to SENDKEY when valid sendkey .. else set back to regular string + char sk[100]; + // split {111 222} and return {111} and check if 222 is valid. + // if return code = 1 then invalid 222 so must be string + if (GetSendKey(s,sk)) + { + sc.ChangeState(SCE_AU3_STRING); + } + // if single char between {?} then its ok as sendkey for a single character + else if (strlen(sk) == 3) + { + sc.ChangeState(SCE_AU3_SENT); + } + // if sendkey {111} is in table then ok as sendkey + else if (keywords4.InList(sk)) + { + sc.ChangeState(SCE_AU3_SENT); + } + else + { + sc.ChangeState(SCE_AU3_STRING); + } + sc.SetState(SCE_AU3_STRING); + } + else + { + // check if the start is a valid SendKey start + int nPos = 0; + int nState = 1; + char cTemp; + while (!(nState == 2) && ((cTemp = s[nPos]) != '\0')) + { + if (cTemp == '{' && nState == 1) + { + nState = 2; + } + if (nState == 1 && !(cTemp == '+' || cTemp == '!' || cTemp == '^' || cTemp == '#' )) + { + nState = 0; + } + nPos++; + } + //Verify characters infront of { ... if not assume regular string + if (nState == 1 && (!(sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ))) { + sc.ChangeState(SCE_AU3_STRING); + sc.SetState(SCE_AU3_STRING); + } + // If invalid character found then assume its a regular string + if (nState == 0) { + sc.ChangeState(SCE_AU3_STRING); + sc.SetState(SCE_AU3_STRING); + } + } + // check if next portion is again a sendkey + if (sc.atLineEnd) + { + sc.ChangeState(SCE_AU3_STRING); + sc.SetState(SCE_AU3_DEFAULT); + si = 0; // reset string indicator + } + //* check in next characters following a sentkey are again a sent key + // Need this test incase of 2 sentkeys like {F1}{ENTER} but not detect {{} + if (sc.state == SCE_AU3_STRING && (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' )) { + sc.SetState(SCE_AU3_SENT);} + // check to see if the string ended... + // Sendkey string isn't complete but the string ended.... + if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\'')) + { + sc.ChangeState(SCE_AU3_STRING); + sc.ForwardSetState(SCE_AU3_DEFAULT); + } + break; + } + } //switch (sc.state) + + // Determine if a new state should be entered: + + if (sc.state == SCE_AU3_DEFAULT) + { + if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);} + else if (sc.ch == '#') {sc.SetState(SCE_AU3_KEYWORD);} + else if (sc.ch == '$') {sc.SetState(SCE_AU3_VARIABLE);} + else if (sc.ch == '.' && !IsADigit(sc.chNext)) {sc.SetState(SCE_AU3_OPERATOR);} + else if (sc.ch == '@') {sc.SetState(SCE_AU3_KEYWORD);} + //else if (sc.ch == '_') {sc.SetState(SCE_AU3_KEYWORD);} + else if (sc.ch == '<' && si==3) {sc.SetState(SCE_AU3_STRING);} // string after #include + else if (sc.ch == '\"') { + sc.SetState(SCE_AU3_STRING); + si = 1; } + else if (sc.ch == '\'') { + sc.SetState(SCE_AU3_STRING); + si = 2; } + else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) + { + sc.SetState(SCE_AU3_NUMBER); + ni = 0; + } + else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_AU3_KEYWORD);} + else if (IsAOperator(static_cast(sc.ch))) {sc.SetState(SCE_AU3_OPERATOR);} + else if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} + } + } //for (; sc.More(); sc.Forward()) + + //************************************* + // Colourize the last word correctly + //************************************* + if (sc.state == SCE_AU3_KEYWORD) + { + if (strcmp(s_save, "#cs")== 0 || strcmp(s_save, "#comments-start")== 0 ) + { + sc.ChangeState(SCE_AU3_COMMENTBLOCK); + sc.SetState(SCE_AU3_COMMENTBLOCK); + } + else if (keywords.InList(s_save)) { + sc.ChangeState(SCE_AU3_KEYWORD); + sc.SetState(SCE_AU3_KEYWORD); + } + else if (keywords2.InList(s_save)) { + sc.ChangeState(SCE_AU3_FUNCTION); + sc.SetState(SCE_AU3_FUNCTION); + } + else if (keywords3.InList(s_save)) { + sc.ChangeState(SCE_AU3_MACRO); + sc.SetState(SCE_AU3_MACRO); + } + else if (keywords5.InList(s_save)) { + sc.ChangeState(SCE_AU3_PREPROCESSOR); + sc.SetState(SCE_AU3_PREPROCESSOR); + } + else if (keywords6.InList(s_save)) { + sc.ChangeState(SCE_AU3_SPECIAL); + sc.SetState(SCE_AU3_SPECIAL); + } + else if (keywords7.InList(s_save) && sc.atLineEnd) { + sc.ChangeState(SCE_AU3_EXPAND); + sc.SetState(SCE_AU3_EXPAND); + } + else if (keywords8.InList(s_save)) { + sc.ChangeState(SCE_AU3_UDF); + sc.SetState(SCE_AU3_UDF); + } + else { + sc.ChangeState(SCE_AU3_DEFAULT); + sc.SetState(SCE_AU3_DEFAULT); + } + } + if (sc.state == SCE_AU3_SENT) + { + // Send key string ended + if (sc.chPrev == '}' && sc.ch != '}') + { + // set color to SENDKEY when valid sendkey .. else set back to regular string + char sk[100]; + // split {111 222} and return {111} and check if 222 is valid. + // if return code = 1 then invalid 222 so must be string + if (GetSendKey(s_save,sk)) + { + sc.ChangeState(SCE_AU3_STRING); + } + // if single char between {?} then its ok as sendkey for a single character + else if (strlen(sk) == 3) + { + sc.ChangeState(SCE_AU3_SENT); + } + // if sendkey {111} is in table then ok as sendkey + else if (keywords4.InList(sk)) + { + sc.ChangeState(SCE_AU3_SENT); + } + else + { + sc.ChangeState(SCE_AU3_STRING); + } + sc.SetState(SCE_AU3_STRING); + } + // check if next portion is again a sendkey + if (sc.atLineEnd) + { + sc.ChangeState(SCE_AU3_STRING); + sc.SetState(SCE_AU3_DEFAULT); + } + } + //************************************* + sc.Complete(); +} + +// +static bool IsStreamCommentStyle(int style) { + return style == SCE_AU3_COMMENT || style == SCE_AU3_COMMENTBLOCK; +} + +// +// Routine to find first none space on the current line and return its Style +// needed for comment lines not starting on pos 1 +static int GetStyleFirstWord(unsigned int szLine, Accessor &styler) +{ + int nsPos = styler.LineStart(szLine); + int nePos = styler.LineStart(szLine+1) - 1; + while (isspacechar(styler.SafeGetCharAt(nsPos)) && nsPos < nePos) + { + nsPos++; // skip to next char + + } // End While + return styler.StyleAt(nsPos); + +} // GetStyleFirstWord() + + +// +static void FoldAU3Doc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) +{ + int endPos = startPos + length; + // get settings from the config files for folding comments and preprocessor lines + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldInComment = styler.GetPropertyInt("fold.comment") == 2; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + bool foldpreprocessor = styler.GetPropertyInt("fold.preprocessor") != 0; + // Backtrack to previous line in case need to fix its fold status + int lineCurrent = styler.GetLine(startPos); + if (startPos > 0) { + if (lineCurrent > 0) { + lineCurrent--; + startPos = styler.LineStart(lineCurrent); + } + } + // vars for style of previous/current/next lines + int style = GetStyleFirstWord(lineCurrent,styler); + int stylePrev = 0; + // find the first previous line without continuation character at the end + while ((lineCurrent > 0 && IsContinuationLine(lineCurrent,styler)) || + (lineCurrent > 1 && IsContinuationLine(lineCurrent-1,styler))) { + lineCurrent--; + startPos = styler.LineStart(lineCurrent); + } + if (lineCurrent > 0) { + stylePrev = GetStyleFirstWord(lineCurrent-1,styler); + } + // vars for getting first word to check for keywords + bool FirstWordStart = false; + bool FirstWordEnd = false; + char szKeyword[10]=""; + int szKeywordlen = 0; + char szThen[5]=""; + int szThenlen = 0; + bool ThenFoundLast = false; + // var for indentlevel + int levelCurrent = SC_FOLDLEVELBASE; + if (lineCurrent > 0) + levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; + int levelNext = levelCurrent; + // + int visibleChars = 0; + char chNext = styler.SafeGetCharAt(startPos); + char chPrev = ' '; + // + for (int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + if (IsAWordChar(ch)) { + visibleChars++; + } + // get the syle for the current character neede to check in comment + int stylech = styler.StyleAt(i); + // get first word for the line for indent check max 9 characters + if (FirstWordStart && (!(FirstWordEnd))) { + if (!IsAWordChar(ch)) { + FirstWordEnd = true; + szKeyword[szKeywordlen] = '\0'; + } + else { + if (szKeywordlen < 10) { + szKeyword[szKeywordlen++] = static_cast(tolower(ch)); + } + } + } + // start the capture of the first word + if (!(FirstWordStart)) { + if (IsAWordChar(ch) || IsAWordStart(ch) || ch == ';') { + FirstWordStart = true; + szKeyword[szKeywordlen++] = static_cast(tolower(ch)); + } + } + // only process this logic when not in comment section + if (!(stylech == SCE_AU3_COMMENT)) { + if (ThenFoundLast) { + if (IsAWordChar(ch)) { + ThenFoundLast = false; + } + } + // find out if the word "then" is the last on a "if" line + if (FirstWordEnd && strcmp(szKeyword,"if") == 0) { + if (szThenlen == 4) { + szThen[0] = szThen[1]; + szThen[1] = szThen[2]; + szThen[2] = szThen[3]; + szThen[3] = static_cast(tolower(ch)); + if (strcmp(szThen,"then") == 0 ) { + ThenFoundLast = true; + } + } + else { + szThen[szThenlen++] = static_cast(tolower(ch)); + if (szThenlen == 5) { + szThen[4] = '\0'; + } + } + } + } + // End of Line found so process the information + if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) { + // ************************** + // Folding logic for Keywords + // ************************** + // if a keyword is found on the current line and the line doesn't end with _ (continuation) + // and we are not inside a commentblock. + if (szKeywordlen > 0 && (!(chPrev == '_')) && + ((!(IsStreamCommentStyle(style)) || foldInComment)) ) { + szKeyword[szKeywordlen] = '\0'; + // only fold "if" last keyword is "then" (else its a one line if) + if (strcmp(szKeyword,"if") == 0 && ThenFoundLast) { + levelNext++; + } + // create new fold for these words + if (strcmp(szKeyword,"do") == 0 || strcmp(szKeyword,"for") == 0 || + strcmp(szKeyword,"func") == 0 || strcmp(szKeyword,"while") == 0|| + strcmp(szKeyword,"with") == 0 || strcmp(szKeyword,"#region") == 0 ) { + levelNext++; + } + // create double Fold for select&switch because Case will subtract one of the current level + if (strcmp(szKeyword,"select") == 0 || strcmp(szKeyword,"switch") == 0) { + levelNext++; + levelNext++; + } + // end the fold for these words before the current line + if (strcmp(szKeyword,"endfunc") == 0 || strcmp(szKeyword,"endif") == 0 || + strcmp(szKeyword,"next") == 0 || strcmp(szKeyword,"until") == 0 || + strcmp(szKeyword,"endwith") == 0 ||strcmp(szKeyword,"wend") == 0){ + levelNext--; + levelCurrent--; + } + // end the fold for these words before the current line and Start new fold + if (strcmp(szKeyword,"case") == 0 || strcmp(szKeyword,"else") == 0 || + strcmp(szKeyword,"elseif") == 0 ) { + levelCurrent--; + } + // end the double fold for this word before the current line + if (strcmp(szKeyword,"endselect") == 0 || strcmp(szKeyword,"endswitch") == 0 ) { + levelNext--; + levelNext--; + levelCurrent--; + levelCurrent--; + } + // end the fold for these words on the current line + if (strcmp(szKeyword,"#endregion") == 0 ) { + levelNext--; + } + } + // Preprocessor and Comment folding + int styleNext = GetStyleFirstWord(lineCurrent + 1,styler); + // ************************************* + // Folding logic for preprocessor blocks + // ************************************* + // process preprosessor line + if (foldpreprocessor && style == SCE_AU3_PREPROCESSOR) { + if (!(stylePrev == SCE_AU3_PREPROCESSOR) && (styleNext == SCE_AU3_PREPROCESSOR)) { + levelNext++; + } + // fold till the last line for normal comment lines + else if (stylePrev == SCE_AU3_PREPROCESSOR && !(styleNext == SCE_AU3_PREPROCESSOR)) { + levelNext--; + } + } + // ********************************* + // Folding logic for Comment blocks + // ********************************* + if (foldComment && IsStreamCommentStyle(style)) { + // Start of a comment block + if (!(stylePrev==style) && IsStreamCommentStyle(styleNext) && styleNext==style) { + levelNext++; + } + // fold till the last line for normal comment lines + else if (IsStreamCommentStyle(stylePrev) + && !(styleNext == SCE_AU3_COMMENT) + && stylePrev == SCE_AU3_COMMENT + && style == SCE_AU3_COMMENT) { + levelNext--; + } + // fold till the one but last line for Blockcomment lines + else if (IsStreamCommentStyle(stylePrev) + && !(styleNext == SCE_AU3_COMMENTBLOCK) + && style == SCE_AU3_COMMENTBLOCK) { + levelNext--; + levelCurrent--; + } + } + int levelUse = levelCurrent; + int lev = levelUse | levelNext << 16; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if (levelUse < levelNext) { + lev |= SC_FOLDLEVELHEADERFLAG; + } + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + // reset values for the next line + lineCurrent++; + stylePrev = style; + style = styleNext; + levelCurrent = levelNext; + visibleChars = 0; + // if the last character is an Underscore then don't reset since the line continues on the next line. + if (!(chPrev == '_')) { + szKeywordlen = 0; + szThenlen = 0; + FirstWordStart = false; + FirstWordEnd = false; + ThenFoundLast = false; + } + } + // save the last processed character + if (!isspacechar(ch)) { + chPrev = ch; + visibleChars++; + } + } +} + + +// + +static const char * const AU3WordLists[] = { + "#autoit keywords", + "#autoit functions", + "#autoit macros", + "#autoit Sent keys", + "#autoit Pre-processors", + "#autoit Special", + "#autoit Expand", + "#autoit UDF", + 0 +}; +LexerModule lmAU3(SCLEX_AU3, ColouriseAU3Doc, "au3", FoldAU3Doc , AU3WordLists); diff --git a/scintilla/src/LexAVE.cxx b/scintilla/src/LexAVE.cxx new file mode 100644 index 00000000..aa57f169 --- /dev/null +++ b/scintilla/src/LexAVE.cxx @@ -0,0 +1,225 @@ +// SciTE - Scintilla based Text Editor +/** @file LexAVE.cxx + ** Lexer for Avenue. + ** + ** Written by Alexey Yutkin . + **/ +// Copyright 1998-2002 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + + + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); +} +static inline bool IsEnumChar(const int ch) { + return (ch < 0x80) && (isalnum(ch)|| ch == '_'); +} +static inline bool IsANumberChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' ); +} + +inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +inline bool isAveOperator(char ch) { + if (isalnum(ch)) + return false; + // '.' left out as it is used to make up numbers + if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || + ch == '{' || ch == '}' || + ch == '[' || ch == ']' || ch == ';' || + ch == '<' || ch == '>' || ch == ',' || + ch == '.' ) + return true; + return false; +} + +static void ColouriseAveDoc( + unsigned int startPos, + int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + WordList &keywords5 = *keywordlists[4]; + WordList &keywords6 = *keywordlists[5]; + + // Do not leak onto next line + if (initStyle == SCE_AVE_STRINGEOL) { + initStyle = SCE_AVE_DEFAULT; + } + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + if (sc.atLineEnd) { + // Update the line state, so it can be seen by next line + int currentLine = styler.GetLine(sc.currentPos); + styler.SetLineState(currentLine, 0); + } + if (sc.atLineStart && (sc.state == SCE_AVE_STRING)) { + // Prevent SCE_AVE_STRINGEOL from leaking back to previous line + sc.SetState(SCE_AVE_STRING); + } + + + // Determine if the current state should terminate. + if (sc.state == SCE_AVE_OPERATOR) { + sc.SetState(SCE_AVE_DEFAULT); + } else if (sc.state == SCE_AVE_NUMBER) { + if (!IsANumberChar(sc.ch)) { + sc.SetState(SCE_AVE_DEFAULT); + } + } else if (sc.state == SCE_AVE_ENUM) { + if (!IsEnumChar(sc.ch)) { + sc.SetState(SCE_AVE_DEFAULT); + } + } else if (sc.state == SCE_AVE_IDENTIFIER) { + if (!IsAWordChar(sc.ch) || (sc.ch == '.')) { + char s[100]; + //sc.GetCurrent(s, sizeof(s)); + sc.GetCurrentLowered(s, sizeof(s)); + if (keywords.InList(s)) { + sc.ChangeState(SCE_AVE_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_AVE_WORD2); + } else if (keywords3.InList(s)) { + sc.ChangeState(SCE_AVE_WORD3); + } else if (keywords4.InList(s)) { + sc.ChangeState(SCE_AVE_WORD4); + } else if (keywords5.InList(s)) { + sc.ChangeState(SCE_AVE_WORD5); + } else if (keywords6.InList(s)) { + sc.ChangeState(SCE_AVE_WORD6); + } + sc.SetState(SCE_AVE_DEFAULT); + } + } else if (sc.state == SCE_AVE_COMMENT) { + if (sc.atLineEnd) { + sc.SetState(SCE_AVE_DEFAULT); + } + } else if (sc.state == SCE_AVE_STRING) { + if (sc.ch == '\"') { + sc.ForwardSetState(SCE_AVE_DEFAULT); + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_AVE_STRINGEOL); + sc.ForwardSetState(SCE_AVE_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_AVE_DEFAULT) { + if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_AVE_NUMBER); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_AVE_IDENTIFIER); + } else if (sc.Match('\"')) { + sc.SetState(SCE_AVE_STRING); + } else if (sc.Match('\'')) { + sc.SetState(SCE_AVE_COMMENT); + sc.Forward(); + } else if (isAveOperator(static_cast(sc.ch))) { + sc.SetState(SCE_AVE_OPERATOR); + } else if (sc.Match('#')) { + sc.SetState(SCE_AVE_ENUM); + sc.Forward(); + } + } + } + sc.Complete(); +} + +static void FoldAveDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[], + Accessor &styler) { + unsigned int lengthDoc = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = static_cast(tolower(styler[startPos])); + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + int styleNext = styler.StyleAt(startPos); + char s[10]; + + for (unsigned int i = startPos; i < lengthDoc; i++) { + char ch = static_cast(tolower(chNext)); + chNext = static_cast(tolower(styler.SafeGetCharAt(i + 1))); + int style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (style == SCE_AVE_WORD) { + if (ch == 't' || ch == 'f' || ch == 'w' || ch == 'e') { + for (unsigned int j = 0; j < 6; j++) { + if (!iswordchar(styler[i + j])) { + break; + } + s[j] = static_cast(tolower(styler[i + j])); + s[j + 1] = '\0'; + } + + if ((strcmp(s, "then") == 0) || (strcmp(s, "for") == 0) || (strcmp(s, "while") == 0)) { + levelCurrent++; + } + if ((strcmp(s, "end") == 0) || (strcmp(s, "elseif") == 0)) { + // Normally "elseif" and "then" will be on the same line and will cancel + // each other out. // As implemented, this does not support fold.at.else. + levelCurrent--; + } + } + } else if (style == SCE_AVE_OPERATOR) { + if (ch == '{' || ch == '(') { + levelCurrent++; + } else if (ch == '}' || ch == ')') { + levelCurrent--; + } + } + + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) { + lev |= SC_FOLDLEVELWHITEFLAG; + } + if ((levelCurrent > levelPrev) && (visibleChars > 0)) { + lev |= SC_FOLDLEVELHEADERFLAG; + } + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) { + visibleChars++; + } + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +LexerModule lmAVE(SCLEX_AVE, ColouriseAveDoc, "ave", FoldAveDoc); + diff --git a/scintilla/src/LexAda.cxx b/scintilla/src/LexAda.cxx new file mode 100644 index 00000000..ac284ba7 --- /dev/null +++ b/scintilla/src/LexAda.cxx @@ -0,0 +1,520 @@ +// Scintilla source code edit control +/** @file LexAda.cxx + ** Lexer for Ada 95 + **/ +// Copyright 2002 by Sergey Koshcheyev +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include "Platform.h" + +#include "Accessor.h" +#include "StyleContext.h" +#include "PropSet.h" +#include "KeyWords.h" +#include "SciLexer.h" +#include "SString.h" + +/* + * Interface + */ + +static void ColouriseDocument( + unsigned int startPos, + int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler); + +static const char * const adaWordListDesc[] = { + "Keywords", + 0 +}; + +LexerModule lmAda(SCLEX_ADA, ColouriseDocument, "ada", NULL, adaWordListDesc); + +/* + * Implementation + */ + +// Functions that have apostropheStartsAttribute as a parameter set it according to whether +// an apostrophe encountered after processing the current token will start an attribute or +// a character literal. +static void ColouriseCharacter(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseComment(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseContext(StyleContext& sc, char chEnd, int stateEOL); +static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseLabel(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute); +static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseString(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseWhiteSpace(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseWord(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute); + +static inline bool IsDelimiterCharacter(int ch); +static inline bool IsNumberStartCharacter(int ch); +static inline bool IsNumberCharacter(int ch); +static inline bool IsSeparatorOrDelimiterCharacter(int ch); +static bool IsValidIdentifier(const SString& identifier); +static bool IsValidNumber(const SString& number); +static inline bool IsWordStartCharacter(int ch); +static inline bool IsWordCharacter(int ch); + +static void ColouriseCharacter(StyleContext& sc, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = true; + + sc.SetState(SCE_ADA_CHARACTER); + + // Skip the apostrophe and one more character (so that '' is shown as non-terminated and ''' + // is handled correctly) + sc.Forward(); + sc.Forward(); + + ColouriseContext(sc, '\'', SCE_ADA_CHARACTEREOL); +} + +static void ColouriseContext(StyleContext& sc, char chEnd, int stateEOL) { + while (!sc.atLineEnd && !sc.Match(chEnd)) { + sc.Forward(); + } + + if (!sc.atLineEnd) { + sc.ForwardSetState(SCE_ADA_DEFAULT); + } else { + sc.ChangeState(stateEOL); + } +} + +static void ColouriseComment(StyleContext& sc, bool& /*apostropheStartsAttribute*/) { + // Apostrophe meaning is not changed, but the parameter is present for uniformity + + sc.SetState(SCE_ADA_COMMENTLINE); + + while (!sc.atLineEnd) { + sc.Forward(); + } +} + +static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = sc.Match (')'); + sc.SetState(SCE_ADA_DELIMITER); + sc.ForwardSetState(SCE_ADA_DEFAULT); +} + +static void ColouriseLabel(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = false; + + sc.SetState(SCE_ADA_LABEL); + + // Skip "<<" + sc.Forward(); + sc.Forward(); + + SString identifier; + + while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) { + identifier += static_cast(tolower(sc.ch)); + sc.Forward(); + } + + // Skip ">>" + if (sc.Match('>', '>')) { + sc.Forward(); + sc.Forward(); + } else { + sc.ChangeState(SCE_ADA_ILLEGAL); + } + + // If the name is an invalid identifier or a keyword, then make it invalid label + if (!IsValidIdentifier(identifier) || keywords.InList(identifier.c_str())) { + sc.ChangeState(SCE_ADA_ILLEGAL); + } + + sc.SetState(SCE_ADA_DEFAULT); + +} + +static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = true; + + SString number; + sc.SetState(SCE_ADA_NUMBER); + + // Get all characters up to a delimiter or a separator, including points, but excluding + // double points (ranges). + while (!IsSeparatorOrDelimiterCharacter(sc.ch) || (sc.ch == '.' && sc.chNext != '.')) { + number += static_cast(sc.ch); + sc.Forward(); + } + + // Special case: exponent with sign + if ((sc.chPrev == 'e' || sc.chPrev == 'E') && + (sc.ch == '+' || sc.ch == '-')) { + number += static_cast(sc.ch); + sc.Forward (); + + while (!IsSeparatorOrDelimiterCharacter(sc.ch)) { + number += static_cast(sc.ch); + sc.Forward(); + } + } + + if (!IsValidNumber(number)) { + sc.ChangeState(SCE_ADA_ILLEGAL); + } + + sc.SetState(SCE_ADA_DEFAULT); +} + +static void ColouriseString(StyleContext& sc, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = true; + + sc.SetState(SCE_ADA_STRING); + sc.Forward(); + + ColouriseContext(sc, '"', SCE_ADA_STRINGEOL); +} + +static void ColouriseWhiteSpace(StyleContext& sc, bool& /*apostropheStartsAttribute*/) { + // Apostrophe meaning is not changed, but the parameter is present for uniformity + sc.SetState(SCE_ADA_DEFAULT); + sc.ForwardSetState(SCE_ADA_DEFAULT); +} + +static void ColouriseWord(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = true; + sc.SetState(SCE_ADA_IDENTIFIER); + + SString word; + + while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) { + word += static_cast(tolower(sc.ch)); + sc.Forward(); + } + + if (!IsValidIdentifier(word)) { + sc.ChangeState(SCE_ADA_ILLEGAL); + + } else if (keywords.InList(word.c_str())) { + sc.ChangeState(SCE_ADA_WORD); + + if (word != "all") { + apostropheStartsAttribute = false; + } + } + + sc.SetState(SCE_ADA_DEFAULT); +} + +// +// ColouriseDocument +// + +static void ColouriseDocument( + unsigned int startPos, + int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler) { + WordList &keywords = *keywordlists[0]; + + StyleContext sc(startPos, length, initStyle, styler); + + int lineCurrent = styler.GetLine(startPos); + bool apostropheStartsAttribute = (styler.GetLineState(lineCurrent) & 1) != 0; + + while (sc.More()) { + if (sc.atLineEnd) { + // Go to the next line + sc.Forward(); + lineCurrent++; + + // Remember the line state for future incremental lexing + styler.SetLineState(lineCurrent, apostropheStartsAttribute); + + // Don't continue any styles on the next line + sc.SetState(SCE_ADA_DEFAULT); + } + + // Comments + if (sc.Match('-', '-')) { + ColouriseComment(sc, apostropheStartsAttribute); + + // Strings + } else if (sc.Match('"')) { + ColouriseString(sc, apostropheStartsAttribute); + + // Characters + } else if (sc.Match('\'') && !apostropheStartsAttribute) { + ColouriseCharacter(sc, apostropheStartsAttribute); + + // Labels + } else if (sc.Match('<', '<')) { + ColouriseLabel(sc, keywords, apostropheStartsAttribute); + + // Whitespace + } else if (IsASpace(sc.ch)) { + ColouriseWhiteSpace(sc, apostropheStartsAttribute); + + // Delimiters + } else if (IsDelimiterCharacter(sc.ch)) { + ColouriseDelimiter(sc, apostropheStartsAttribute); + + // Numbers + } else if (IsADigit(sc.ch) || sc.ch == '#') { + ColouriseNumber(sc, apostropheStartsAttribute); + + // Keywords or identifiers + } else { + ColouriseWord(sc, keywords, apostropheStartsAttribute); + } + } + + sc.Complete(); +} + +static inline bool IsDelimiterCharacter(int ch) { + switch (ch) { + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case ':': + case ';': + case '<': + case '=': + case '>': + case '|': + return true; + default: + return false; + } +} + +static inline bool IsNumberCharacter(int ch) { + return IsNumberStartCharacter(ch) || + ch == '_' || + ch == '.' || + ch == '#' || + (ch >= 'a' && ch <= 'f') || + (ch >= 'A' && ch <= 'F'); +} + +static inline bool IsNumberStartCharacter(int ch) { + return IsADigit(ch); +} + +static inline bool IsSeparatorOrDelimiterCharacter(int ch) { + return IsASpace(ch) || IsDelimiterCharacter(ch); +} + +static bool IsValidIdentifier(const SString& identifier) { + // First character can't be '_', so initialize the flag to true + bool lastWasUnderscore = true; + + size_t length = identifier.length(); + + // Zero-length identifiers are not valid (these can occur inside labels) + if (length == 0) { + return false; + } + + // Check for valid character at the start + if (!IsWordStartCharacter(identifier[0])) { + return false; + } + + // Check for only valid characters and no double underscores + for (size_t i = 0; i < length; i++) { + if (!IsWordCharacter(identifier[i]) || + (identifier[i] == '_' && lastWasUnderscore)) { + return false; + } + lastWasUnderscore = identifier[i] == '_'; + } + + // Check for underscore at the end + if (lastWasUnderscore == true) { + return false; + } + + // All checks passed + return true; +} + +static bool IsValidNumber(const SString& number) { + int hashPos = number.search("#"); + bool seenDot = false; + + size_t i = 0; + size_t length = number.length(); + + if (length == 0) + return false; // Just in case + + // Decimal number + if (hashPos == -1) { + bool canBeSpecial = false; + + for (; i < length; i++) { + if (number[i] == '_') { + if (!canBeSpecial) { + return false; + } + canBeSpecial = false; + } else if (number[i] == '.') { + if (!canBeSpecial || seenDot) { + return false; + } + canBeSpecial = false; + seenDot = true; + } else if (IsADigit(number[i])) { + canBeSpecial = true; + } else { + break; + } + } + + if (!canBeSpecial) + return false; + } else { + // Based number + bool canBeSpecial = false; + int base = 0; + + // Parse base + for (; i < length; i++) { + int ch = number[i]; + if (ch == '_') { + if (!canBeSpecial) + return false; + canBeSpecial = false; + } else if (IsADigit(ch)) { + base = base * 10 + (ch - '0'); + if (base > 16) + return false; + canBeSpecial = true; + } else if (ch == '#' && canBeSpecial) { + break; + } else { + return false; + } + } + + if (base < 2) + return false; + if (i == length) + return false; + + i++; // Skip over '#' + + // Parse number + canBeSpecial = false; + + for (; i < length; i++) { + int ch = tolower(number[i]); + + if (ch == '_') { + if (!canBeSpecial) { + return false; + } + canBeSpecial = false; + + } else if (ch == '.') { + if (!canBeSpecial || seenDot) { + return false; + } + canBeSpecial = false; + seenDot = true; + + } else if (IsADigit(ch)) { + if (ch - '0' >= base) { + return false; + } + canBeSpecial = true; + + } else if (ch >= 'a' && ch <= 'f') { + if (ch - 'a' + 10 >= base) { + return false; + } + canBeSpecial = true; + + } else if (ch == '#' && canBeSpecial) { + break; + + } else { + return false; + } + } + + if (i == length) { + return false; + } + + i++; + } + + // Exponent (optional) + if (i < length) { + if (number[i] != 'e' && number[i] != 'E') + return false; + + i++; // Move past 'E' + + if (i == length) { + return false; + } + + if (number[i] == '+') + i++; + else if (number[i] == '-') { + if (seenDot) { + i++; + } else { + return false; // Integer literals should not have negative exponents + } + } + + if (i == length) { + return false; + } + + bool canBeSpecial = false; + + for (; i < length; i++) { + if (number[i] == '_') { + if (!canBeSpecial) { + return false; + } + canBeSpecial = false; + } else if (IsADigit(number[i])) { + canBeSpecial = true; + } else { + return false; + } + } + + if (!canBeSpecial) + return false; + } + + // if i == length, number was parsed successfully. + return i == length; +} + +static inline bool IsWordCharacter(int ch) { + return IsWordStartCharacter(ch) || IsADigit(ch); +} + +static inline bool IsWordStartCharacter(int ch) { + return (isascii(ch) && isalpha(ch)) || ch == '_'; +} diff --git a/scintilla/src/LexAsm.cxx b/scintilla/src/LexAsm.cxx new file mode 100644 index 00000000..dad70628 --- /dev/null +++ b/scintilla/src/LexAsm.cxx @@ -0,0 +1,177 @@ +// Scintilla source code edit control +/** @file LexAsm.cxx + ** Lexer for Assembler, just for the MASM syntax + ** Written by The Black Horus + ** Enhancements and NASM stuff by Kein-Hong Man, 2003-10 + ** SCE_ASM_COMMENTBLOCK and SCE_ASM_CHARACTER are for future GNU as colouring + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || + ch == '_' || ch == '?'); +} + +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' || + ch == '%' || ch == '@' || ch == '$' || ch == '?'); +} + +static inline bool IsAsmOperator(char ch) { + if (isalnum(ch)) + return false; + // '.' left out as it is used to make up numbers + if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || ch == '^' || + ch == '[' || ch == ']' || ch == '<' || ch == '&' || + ch == '>' || ch == ',' || ch == '|' || ch == '~' || + ch == '%' || ch == ':') + return true; + return false; +} + +static void ColouriseAsmDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + WordList &cpuInstruction = *keywordlists[0]; + WordList &mathInstruction = *keywordlists[1]; + WordList ®isters = *keywordlists[2]; + WordList &directive = *keywordlists[3]; + WordList &directiveOperand = *keywordlists[4]; + WordList &extInstruction = *keywordlists[5]; + + // Do not leak onto next line + if (initStyle == SCE_ASM_STRINGEOL) + initStyle = SCE_ASM_DEFAULT; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) + { + + // Prevent SCE_ASM_STRINGEOL from leaking back to previous line + if (sc.atLineStart && (sc.state == SCE_ASM_STRING)) { + sc.SetState(SCE_ASM_STRING); + } else if (sc.atLineStart && (sc.state == SCE_ASM_CHARACTER)) { + sc.SetState(SCE_ASM_CHARACTER); + } + + // Handle line continuation generically. + if (sc.ch == '\\') { + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } + continue; + } + } + + // Determine if the current state should terminate. + if (sc.state == SCE_ASM_OPERATOR) { + if (!IsAsmOperator(static_cast(sc.ch))) { + sc.SetState(SCE_ASM_DEFAULT); + } + }else if (sc.state == SCE_ASM_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_ASM_DEFAULT); + } + } else if (sc.state == SCE_ASM_IDENTIFIER) { + if (!IsAWordChar(sc.ch) ) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + + if (cpuInstruction.InList(s)) { + sc.ChangeState(SCE_ASM_CPUINSTRUCTION); + } else if (mathInstruction.InList(s)) { + sc.ChangeState(SCE_ASM_MATHINSTRUCTION); + } else if (registers.InList(s)) { + sc.ChangeState(SCE_ASM_REGISTER); + } else if (directive.InList(s)) { + sc.ChangeState(SCE_ASM_DIRECTIVE); + } else if (directiveOperand.InList(s)) { + sc.ChangeState(SCE_ASM_DIRECTIVEOPERAND); + } else if (extInstruction.InList(s)) { + sc.ChangeState(SCE_ASM_EXTINSTRUCTION); + } + sc.SetState(SCE_ASM_DEFAULT); + } + } + else if (sc.state == SCE_ASM_COMMENT ) { + if (sc.atLineEnd) { + sc.SetState(SCE_ASM_DEFAULT); + } + } else if (sc.state == SCE_ASM_STRING) { + if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_ASM_DEFAULT); + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_ASM_STRINGEOL); + sc.ForwardSetState(SCE_ASM_DEFAULT); + } + } else if (sc.state == SCE_ASM_CHARACTER) { + if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\'') { + sc.ForwardSetState(SCE_ASM_DEFAULT); + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_ASM_STRINGEOL); + sc.ForwardSetState(SCE_ASM_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_ASM_DEFAULT) { + if (sc.ch == ';'){ + sc.SetState(SCE_ASM_COMMENT); + } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) { + sc.SetState(SCE_ASM_NUMBER); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_ASM_IDENTIFIER); + } else if (sc.ch == '\"') { + sc.SetState(SCE_ASM_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_ASM_CHARACTER); + } else if (IsAsmOperator(static_cast(sc.ch))) { + sc.SetState(SCE_ASM_OPERATOR); + } + } + + } + sc.Complete(); +} + +static const char * const asmWordListDesc[] = { + "CPU instructions", + "FPU instructions", + "Registers", + "Directives", + "Directive operands", + "Extended instructions", + 0 +}; + +LexerModule lmAsm(SCLEX_ASM, ColouriseAsmDoc, "asm", 0, asmWordListDesc); + diff --git a/scintilla/src/LexAsn1.cxx b/scintilla/src/LexAsn1.cxx new file mode 100644 index 00000000..a4b08617 --- /dev/null +++ b/scintilla/src/LexAsn1.cxx @@ -0,0 +1,181 @@ +// Scintilla source code edit control +/** @file LexAsn1.cxx + ** Lexer for ASN.1 + **/ +// Copyright 2004 by Herr Pfarrer rpfarrer yahoo de +// Last Updated: 20/07/2004 +// The License.txt file describes the conditions under which this software may be distributed. +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +// Some char test functions +static bool isAsn1Number(int ch) +{ + return (ch >= '0' && ch <= '9'); +} + +static bool isAsn1Letter(int ch) +{ + return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'); +} + +static bool isAsn1Char(int ch) +{ + return (ch == '-' ) || isAsn1Number(ch) || isAsn1Letter (ch); +} + +// +// Function determining the color of a given code portion +// Based on a "state" +// +static void ColouriseAsn1Doc(unsigned int startPos, int length, int initStyle, WordList *keywordLists[], Accessor &styler) +{ + // The keywords + WordList &Keywords = *keywordLists[0]; + WordList &Attributes = *keywordLists[1]; + WordList &Descriptors = *keywordLists[2]; + WordList &Types = *keywordLists[3]; + + // Parse the whole buffer character by character using StyleContext + StyleContext sc(startPos, length, initStyle, styler); + for (; sc.More(); sc.Forward()) + { + // The state engine + switch (sc.state) + { + case SCE_ASN1_DEFAULT: // Plain characters +asn1_default: + if (sc.ch == '-' && sc.chNext == '-') + // A comment begins here + sc.SetState(SCE_ASN1_COMMENT); + else if (sc.ch == '"') + // A string begins here + sc.SetState(SCE_ASN1_STRING); + else if (isAsn1Number (sc.ch)) + // A number starts here (identifier should start with a letter in ASN.1) + sc.SetState(SCE_ASN1_SCALAR); + else if (isAsn1Char (sc.ch)) + // An identifier starts here (identifier always start with a letter) + sc.SetState(SCE_ASN1_IDENTIFIER); + else if (sc.ch == ':') + // A ::= operator starts here + sc.SetState(SCE_ASN1_OPERATOR); + break; + case SCE_ASN1_COMMENT: // A comment + if (sc.ch == '\r' || sc.ch == '\n') + // A comment ends here + sc.SetState(SCE_ASN1_DEFAULT); + break; + case SCE_ASN1_IDENTIFIER: // An identifier (keyword, attribute, descriptor or type) + if (!isAsn1Char (sc.ch)) + { + // The end of identifier is here: we can look for it in lists by now and change its state + char s[100]; + sc.GetCurrent(s, sizeof(s)); + if (Keywords.InList(s)) + // It's a keyword, change its state + sc.ChangeState(SCE_ASN1_KEYWORD); + else if (Attributes.InList(s)) + // It's an attribute, change its state + sc.ChangeState(SCE_ASN1_ATTRIBUTE); + else if (Descriptors.InList(s)) + // It's a descriptor, change its state + sc.ChangeState(SCE_ASN1_DESCRIPTOR); + else if (Types.InList(s)) + // It's a type, change its state + sc.ChangeState(SCE_ASN1_TYPE); + + // Set to default now + sc.SetState(SCE_ASN1_DEFAULT); + } + break; + case SCE_ASN1_STRING: // A string delimited by "" + if (sc.ch == '"') + { + // A string ends here + sc.ForwardSetState(SCE_ASN1_DEFAULT); + + // To correctly manage a char sticking to the string quote + goto asn1_default; + } + break; + case SCE_ASN1_SCALAR: // A plain number + if (!isAsn1Number (sc.ch)) + // A number ends here + sc.SetState(SCE_ASN1_DEFAULT); + break; + case SCE_ASN1_OPERATOR: // The affectation operator ::= and wath follows (eg: ::= { org 6 } OID or ::= 12 trap) + if (sc.ch == '{') + { + // An OID definition starts here: enter the sub loop + for (; sc.More(); sc.Forward()) + { + if (isAsn1Number (sc.ch) && (!isAsn1Char (sc.chPrev) || isAsn1Number (sc.chPrev))) + // The OID number is highlighted + sc.SetState(SCE_ASN1_OID); + else if (isAsn1Char (sc.ch)) + // The OID parent identifier is plain + sc.SetState(SCE_ASN1_IDENTIFIER); + else + sc.SetState(SCE_ASN1_DEFAULT); + + if (sc.ch == '}') + // Here ends the OID and the operator sub loop: go back to main loop + break; + } + } + else if (isAsn1Number (sc.ch)) + { + // A trap number definition starts here: enter the sub loop + for (; sc.More(); sc.Forward()) + { + if (isAsn1Number (sc.ch)) + // The trap number is highlighted + sc.SetState(SCE_ASN1_OID); + else + { + // The number ends here: go back to main loop + sc.SetState(SCE_ASN1_DEFAULT); + break; + } + } + } + else if (sc.ch != ':' && sc.ch != '=' && sc.ch != ' ') + // The operator doesn't imply an OID definition nor a trap, back to main loop + goto asn1_default; // To be sure to handle actually the state change + break; + } + } + sc.Complete(); +} + +static void FoldAsn1Doc(unsigned int, int, int, WordList *[], Accessor &styler) +{ + // No folding enabled, no reason to continue... + if( styler.GetPropertyInt("fold") == 0 ) + return; + + // No folding implemented: doesn't make sense for ASN.1 +} + +static const char * const asn1WordLists[] = { + "Keywords", + "Attributes", + "Descriptors", + "Types", + 0, }; + + +LexerModule lmAns1(SCLEX_ASN1, ColouriseAsn1Doc, "asn1", FoldAsn1Doc, asn1WordLists); diff --git a/scintilla/src/LexBaan.cxx b/scintilla/src/LexBaan.cxx new file mode 100644 index 00000000..e38a2715 --- /dev/null +++ b/scintilla/src/LexBaan.cxx @@ -0,0 +1,189 @@ +// Scintilla source code edit control +/** @file LexBaan.cxx + ** Lexer for Baan. + ** Based heavily on LexCPP.cxx + **/ +// Copyright 2001- by Vamsi Potluru & Praveen Ambekar +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '$' || ch == ':'); +} + +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +static void ColouriseBaanDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor") != 0; + + if (initStyle == SCE_BAAN_STRINGEOL) // Does not leak onto next line + initStyle = SCE_BAAN_DEFAULT; + + int visibleChars = 0; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + if (sc.state == SCE_BAAN_OPERATOR) { + sc.SetState(SCE_BAAN_DEFAULT); + } else if (sc.state == SCE_BAAN_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_BAAN_DEFAULT); + } + } else if (sc.state == SCE_BAAN_IDENTIFIER) { + if (!IsAWordChar(sc.ch)) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + if (keywords.InList(s)) { + sc.ChangeState(SCE_BAAN_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_BAAN_WORD2); + } + sc.SetState(SCE_BAAN_DEFAULT); + } + } else if (sc.state == SCE_BAAN_PREPROCESSOR) { + if (stylingWithinPreprocessor) { + if (IsASpace(sc.ch)) { + sc.SetState(SCE_BAAN_DEFAULT); + } + } else { + if (sc.atLineEnd && (sc.chNext != '^')) { + sc.SetState(SCE_BAAN_DEFAULT); + } + } + } else if (sc.state == SCE_BAAN_COMMENT) { + if (sc.atLineEnd) { + sc.SetState(SCE_BAAN_DEFAULT); + } + } else if (sc.state == SCE_BAAN_COMMENTDOC) { + if (sc.MatchIgnoreCase("enddllusage")) { + for (unsigned int i = 0; i < 10; i++){ + sc.Forward(); + } + sc.ForwardSetState(SCE_BAAN_DEFAULT); + } + } else if (sc.state == SCE_BAAN_STRING) { + if (sc.ch == '\"') { + sc.ForwardSetState(SCE_BAAN_DEFAULT); + } else if ((sc.atLineEnd) && (sc.chNext != '^')) { + sc.ChangeState(SCE_BAAN_STRINGEOL); + sc.ForwardSetState(SCE_C_DEFAULT); + visibleChars = 0; + } + } + + if (sc.state == SCE_BAAN_DEFAULT) { + if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_BAAN_NUMBER); + } else if (sc.MatchIgnoreCase("dllusage")){ + sc.SetState(SCE_BAAN_COMMENTDOC); + do { + sc.Forward(); + } while ((!sc.atLineEnd) && sc.More()); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_BAAN_IDENTIFIER); + } else if (sc.Match('|')){ + sc.SetState(SCE_BAAN_COMMENT); + } else if (sc.ch == '\"') { + sc.SetState(SCE_BAAN_STRING); + } else if (sc.ch == '#' && visibleChars == 0) { + // Preprocessor commands are alone on their line + sc.SetState(SCE_BAAN_PREPROCESSOR); + // Skip whitespace between # and preprocessor word + do { + sc.Forward(); + } while (IsASpace(sc.ch) && sc.More()); + } else if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_BAAN_OPERATOR); + } + } + if (sc.atLineEnd) { + // Reset states to begining of colourise so no surprises + // if different sets of lines lexed. + visibleChars = 0; + } + if (!IsASpace(sc.ch)) { + visibleChars++; + } + } + sc.Complete(); +} + +static void FoldBaanDoc(unsigned int startPos, int length, int initStyle, WordList *[], + Accessor &styler) { + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (foldComment && + (style == SCE_BAAN_COMMENT || style == SCE_BAAN_COMMENTDOC)) { + if (style != stylePrev) { + levelCurrent++; + } else if ((style != styleNext) && !atEOL) { + // Comments don't end at end of line and the next character may be unstyled. + levelCurrent--; + } + } + if (style == SCE_BAAN_OPERATOR) { + if (ch == '{') { + levelCurrent++; + } else if (ch == '}') { + levelCurrent--; + } + } + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +LexerModule lmBaan(SCLEX_BAAN, ColouriseBaanDoc, "baan", FoldBaanDoc); diff --git a/scintilla/src/LexBash.cxx b/scintilla/src/LexBash.cxx new file mode 100644 index 00000000..1bc3ead0 --- /dev/null +++ b/scintilla/src/LexBash.cxx @@ -0,0 +1,664 @@ +// Scintilla source code edit control +/** @file LexBash.cxx + ** Lexer for Bash. + **/ +// Copyright 2004-2005 by Neil Hodgson +// Adapted from LexPerl by Kein-Hong Man 2004 +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#define BASH_BASE_ERROR 65 +#define BASH_BASE_DECIMAL 66 +#define BASH_BASE_HEX 67 +#define BASH_BASE_OCTAL 68 +#define BASH_BASE_OCTAL_ERROR 69 + +#define HERE_DELIM_MAX 256 + +static inline int translateBashDigit(char ch) { + if (ch >= '0' && ch <= '9') { + return ch - '0'; + } else if (ch >= 'a' && ch <= 'z') { + return ch - 'a' + 10; + } else if (ch >= 'A' && ch <= 'Z') { + return ch - 'A' + 36; + } else if (ch == '@') { + return 62; + } else if (ch == '_') { + return 63; + } + return BASH_BASE_ERROR; +} + +static inline bool isEOLChar(char ch) { + return (ch == '\r') || (ch == '\n'); +} + +static bool isSingleCharOp(char ch) { + char strCharSet[2]; + strCharSet[0] = ch; + strCharSet[1] = '\0'; + return (NULL != strstr("rwxoRWXOezsfdlpSbctugkTBMACahGLNn", strCharSet)); +} + +static inline bool isBashOperator(char ch) { + if (ch == '^' || ch == '&' || ch == '\\' || ch == '%' || + ch == '(' || ch == ')' || ch == '-' || ch == '+' || + ch == '=' || ch == '|' || ch == '{' || ch == '}' || + ch == '[' || ch == ']' || ch == ':' || ch == ';' || + ch == '>' || ch == ',' || ch == '/' || ch == '<' || + ch == '?' || ch == '!' || ch == '.' || ch == '~' || + ch == '@') + return true; + return false; +} + +static int classifyWordBash(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { + char s[100]; + for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + s[i] = styler[start + i]; + s[i + 1] = '\0'; + } + char chAttr = SCE_SH_IDENTIFIER; + if (keywords.InList(s)) + chAttr = SCE_SH_WORD; + styler.ColourTo(end, chAttr); + return chAttr; +} + +static inline int getBashNumberBase(unsigned int start, unsigned int end, Accessor &styler) { + int base = 0; + for (unsigned int i = 0; i < end - start + 1 && i < 10; i++) { + base = base * 10 + (styler[start + i] - '0'); + } + if (base > 64 || (end - start) > 1) { + return BASH_BASE_ERROR; + } + return base; +} + +static inline bool isEndVar(char ch) { + return !isalnum(ch) && ch != '$' && ch != '_'; +} + +static inline bool isNonQuote(char ch) { + return isalnum(ch) || ch == '_'; +} + +static bool isMatch(Accessor &styler, int lengthDoc, int pos, const char *val) { + if ((pos + static_cast(strlen(val))) >= lengthDoc) { + return false; + } + while (*val) { + if (*val != styler[pos++]) { + return false; + } + val++; + } + return true; +} + +static char opposite(char ch) { + if (ch == '(') + return ')'; + if (ch == '[') + return ']'; + if (ch == '{') + return '}'; + if (ch == '<') + return '>'; + return ch; +} + +static void ColouriseBashDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + + // Lexer for bash often has to backtrack to start of current style to determine + // which characters are being used as quotes, how deeply nested is the + // start position and what the termination string is for here documents + + WordList &keywords = *keywordlists[0]; + + class HereDocCls { + public: + int State; // 0: '<<' encountered + // 1: collect the delimiter + // 2: here doc text (lines after the delimiter) + char Quote; // the char after '<<' + bool Quoted; // true if Quote in ('\'','"','`') + bool Indent; // indented delimiter (for <<-) + int DelimiterLength; // strlen(Delimiter) + char *Delimiter; // the Delimiter, 256: sizeof PL_tokenbuf + HereDocCls() { + State = 0; + Quote = 0; + Quoted = false; + Indent = 0; + DelimiterLength = 0; + Delimiter = new char[HERE_DELIM_MAX]; + Delimiter[0] = '\0'; + } + ~HereDocCls() { + delete []Delimiter; + } + }; + HereDocCls HereDoc; + + class QuoteCls { + public: + int Rep; + int Count; + char Up; + char Down; + QuoteCls() { + this->New(1); + } + void New(int r) { + Rep = r; + Count = 0; + Up = '\0'; + Down = '\0'; + } + void Open(char u) { + Count++; + Up = u; + Down = opposite(Up); + } + }; + QuoteCls Quote; + + int state = initStyle; + int numBase = 0; + unsigned int lengthDoc = startPos + length; + + // If in a long distance lexical state, seek to the beginning to find quote characters + // Bash strings can be multi-line with embedded newlines, so backtrack. + // Bash numbers have additional state during lexing, so backtrack too. + if (state == SCE_SH_HERE_Q) { + while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_SH_HERE_DELIM)) { + startPos--; + } + startPos = styler.LineStart(styler.GetLine(startPos)); + state = styler.StyleAt(startPos - 1); + } + if (state == SCE_SH_STRING + || state == SCE_SH_BACKTICKS + || state == SCE_SH_CHARACTER + || state == SCE_SH_NUMBER + || state == SCE_SH_IDENTIFIER + || state == SCE_SH_COMMENTLINE + ) { + while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) { + startPos--; + } + state = SCE_SH_DEFAULT; + } + + styler.StartAt(startPos); + char chPrev = styler.SafeGetCharAt(startPos - 1); + if (startPos == 0) + chPrev = '\n'; + char chNext = styler[startPos]; + styler.StartSegment(startPos); + + for (unsigned int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + // if the current character is not consumed due to the completion of an + // earlier style, lexing can be restarted via a simple goto + restartLexer: + chNext = styler.SafeGetCharAt(i + 1); + char chNext2 = styler.SafeGetCharAt(i + 2); + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + chPrev = ' '; + i += 1; + continue; + } + + if ((chPrev == '\r' && ch == '\n')) { // skip on DOS/Windows + styler.ColourTo(i, state); + chPrev = ch; + continue; + } + + if (HereDoc.State == 1 && isEOLChar(ch)) { + // Begin of here-doc (the line after the here-doc delimiter): + // Lexically, the here-doc starts from the next line after the >>, but the + // first line of here-doc seem to follow the style of the last EOL sequence + HereDoc.State = 2; + if (HereDoc.Quoted) { + if (state == SCE_SH_HERE_DELIM) { + // Missing quote at end of string! We are stricter than bash. + // Colour here-doc anyway while marking this bit as an error. + state = SCE_SH_ERROR; + } + styler.ColourTo(i - 1, state); + // HereDoc.Quote always == '\'' + state = SCE_SH_HERE_Q; + } else { + styler.ColourTo(i - 1, state); + // always switch + state = SCE_SH_HERE_Q; + } + } + + if (state == SCE_SH_DEFAULT) { + if (ch == '\\') { // escaped character + if (i < lengthDoc - 1) + i++; + ch = chNext; + chNext = chNext2; + styler.ColourTo(i, SCE_SH_IDENTIFIER); + } else if (isdigit(ch)) { + state = SCE_SH_NUMBER; + numBase = BASH_BASE_DECIMAL; + if (ch == '0') { // hex,octal + if (chNext == 'x' || chNext == 'X') { + numBase = BASH_BASE_HEX; + i++; + ch = chNext; + chNext = chNext2; + } else if (isdigit(chNext)) { + numBase = BASH_BASE_OCTAL; + } + } + } else if (iswordstart(ch)) { + state = SCE_SH_WORD; + if (!iswordchar(chNext) && chNext != '+' && chNext != '-') { + // We need that if length of word == 1! + // This test is copied from the SCE_SH_WORD handler. + classifyWordBash(styler.GetStartSegment(), i, keywords, styler); + state = SCE_SH_DEFAULT; + } + } else if (ch == '#') { + state = SCE_SH_COMMENTLINE; + } else if (ch == '\"') { + state = SCE_SH_STRING; + Quote.New(1); + Quote.Open(ch); + } else if (ch == '\'') { + state = SCE_SH_CHARACTER; + Quote.New(1); + Quote.Open(ch); + } else if (ch == '`') { + state = SCE_SH_BACKTICKS; + Quote.New(1); + Quote.Open(ch); + } else if (ch == '$') { + if (chNext == '{') { + state = SCE_SH_PARAM; + goto startQuote; + } else if (chNext == '\'') { + state = SCE_SH_CHARACTER; + goto startQuote; + } else if (chNext == '"') { + state = SCE_SH_STRING; + goto startQuote; + } else if (chNext == '(' && chNext2 == '(') { + styler.ColourTo(i, SCE_SH_OPERATOR); + state = SCE_SH_DEFAULT; + goto skipChar; + } else if (chNext == '(' || chNext == '`') { + state = SCE_SH_BACKTICKS; + startQuote: + Quote.New(1); + Quote.Open(chNext); + goto skipChar; + } else { + state = SCE_SH_SCALAR; + skipChar: + i++; + ch = chNext; + chNext = chNext2; + } + } else if (ch == '*') { + if (chNext == '*') { // exponentiation + i++; + ch = chNext; + chNext = chNext2; + } + styler.ColourTo(i, SCE_SH_OPERATOR); + } else if (ch == '<' && chNext == '<') { + state = SCE_SH_HERE_DELIM; + HereDoc.State = 0; + HereDoc.Indent = false; + } else if (ch == '-' // file test operators + && isSingleCharOp(chNext) + && !isalnum((chNext2 = styler.SafeGetCharAt(i+2))) + && isspace(chPrev)) { + styler.ColourTo(i + 1, SCE_SH_WORD); + state = SCE_SH_DEFAULT; + i++; + ch = chNext; + chNext = chNext2; + } else if (isBashOperator(ch)) { + styler.ColourTo(i, SCE_SH_OPERATOR); + } else { + // keep colouring defaults to make restart easier + styler.ColourTo(i, SCE_SH_DEFAULT); + } + } else if (state == SCE_SH_NUMBER) { + int digit = translateBashDigit(ch); + if (numBase == BASH_BASE_DECIMAL) { + if (ch == '#') { + numBase = getBashNumberBase(styler.GetStartSegment(), i - 1, styler); + if (numBase == BASH_BASE_ERROR) // take the rest as comment + goto numAtEnd; + } else if (!isdigit(ch)) + goto numAtEnd; + } else if (numBase == BASH_BASE_HEX) { + if ((digit < 16) || (digit >= 36 && digit <= 41)) { + // hex digit 0-9a-fA-F + } else + goto numAtEnd; + } else if (numBase == BASH_BASE_OCTAL || + numBase == BASH_BASE_OCTAL_ERROR) { + if (digit > 7) { + if (digit <= 9) { + numBase = BASH_BASE_OCTAL_ERROR; + } else + goto numAtEnd; + } + } else if (numBase == BASH_BASE_ERROR) { + if (digit > 9) + goto numAtEnd; + } else { // DD#DDDD number style handling + if (digit != BASH_BASE_ERROR) { + if (numBase <= 36) { + // case-insensitive if base<=36 + if (digit >= 36) digit -= 26; + } + if (digit >= numBase) { + if (digit <= 9) { + numBase = BASH_BASE_ERROR; + } else + goto numAtEnd; + } + } else { + numAtEnd: + if (numBase == BASH_BASE_ERROR || + numBase == BASH_BASE_OCTAL_ERROR) + state = SCE_SH_ERROR; + styler.ColourTo(i - 1, state); + state = SCE_SH_DEFAULT; + goto restartLexer; + } + } + } else if (state == SCE_SH_WORD) { + if (!iswordchar(chNext) && chNext != '+' && chNext != '-') { + // "." never used in Bash variable names + // but used in file names + classifyWordBash(styler.GetStartSegment(), i, keywords, styler); + state = SCE_SH_DEFAULT; + ch = ' '; + } + } else if (state == SCE_SH_IDENTIFIER) { + if (!iswordchar(chNext) && chNext != '+' && chNext != '-') { + styler.ColourTo(i, SCE_SH_IDENTIFIER); + state = SCE_SH_DEFAULT; + ch = ' '; + } + } else { + if (state == SCE_SH_COMMENTLINE) { + if (ch == '\\' && isEOLChar(chNext)) { + // comment continuation + if (chNext == '\r' && chNext2 == '\n') { + i += 2; + ch = styler.SafeGetCharAt(i); + chNext = styler.SafeGetCharAt(i + 1); + } else { + i++; + ch = chNext; + chNext = chNext2; + } + } else if (isEOLChar(ch)) { + styler.ColourTo(i - 1, state); + state = SCE_SH_DEFAULT; + goto restartLexer; + } else if (isEOLChar(chNext)) { + styler.ColourTo(i, state); + state = SCE_SH_DEFAULT; + } + } else if (state == SCE_SH_HERE_DELIM) { + // + // From Bash info: + // --------------- + // Specifier format is: <<[-]WORD + // Optional '-' is for removal of leading tabs from here-doc. + // Whitespace acceptable after <<[-] operator + // + if (HereDoc.State == 0) { // '<<' encountered + HereDoc.State = 1; + HereDoc.Quote = chNext; + HereDoc.Quoted = false; + HereDoc.DelimiterLength = 0; + HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0'; + if (chNext == '\'' || chNext == '\"') { // a quoted here-doc delimiter (' or ") + i++; + ch = chNext; + chNext = chNext2; + HereDoc.Quoted = true; + } else if (!HereDoc.Indent && chNext == '-') { // <<- indent case + HereDoc.Indent = true; + HereDoc.State = 0; + } else if (isalpha(chNext) || chNext == '_' || chNext == '\\' + || chNext == '-' || chNext == '+' || chNext == '!') { + // an unquoted here-doc delimiter, no special handling + // TODO check what exactly bash considers part of the delim + } else if (chNext == '<') { // HERE string <<< + i++; + ch = chNext; + chNext = chNext2; + styler.ColourTo(i, SCE_SH_HERE_DELIM); + state = SCE_SH_DEFAULT; + HereDoc.State = 0; + } else if (isspacechar(chNext)) { + // eat whitespace + HereDoc.State = 0; + } else if (isdigit(chNext) || chNext == '=' || chNext == '$') { + // left shift << or <<= operator cases + styler.ColourTo(i, SCE_SH_OPERATOR); + state = SCE_SH_DEFAULT; + HereDoc.State = 0; + } else { + // symbols terminates; deprecated zero-length delimiter + } + } else if (HereDoc.State == 1) { // collect the delimiter + if (HereDoc.Quoted) { // a quoted here-doc delimiter + if (ch == HereDoc.Quote) { // closing quote => end of delimiter + styler.ColourTo(i, state); + state = SCE_SH_DEFAULT; + } else { + if (ch == '\\' && chNext == HereDoc.Quote) { // escaped quote + i++; + ch = chNext; + chNext = chNext2; + } + HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch; + HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0'; + } + } else { // an unquoted here-doc delimiter + if (isalnum(ch) || ch == '_' || ch == '-' || ch == '+' || ch == '!') { + HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch; + HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0'; + } else if (ch == '\\') { + // skip escape prefix + } else { + styler.ColourTo(i - 1, state); + state = SCE_SH_DEFAULT; + goto restartLexer; + } + } + if (HereDoc.DelimiterLength >= HERE_DELIM_MAX - 1) { + styler.ColourTo(i - 1, state); + state = SCE_SH_ERROR; + goto restartLexer; + } + } + } else if (HereDoc.State == 2) { + // state == SCE_SH_HERE_Q + if (isMatch(styler, lengthDoc, i, HereDoc.Delimiter)) { + if (!HereDoc.Indent && isEOLChar(chPrev)) { + endHereDoc: + // standard HERE delimiter + i += HereDoc.DelimiterLength; + chPrev = styler.SafeGetCharAt(i - 1); + ch = styler.SafeGetCharAt(i); + if (isEOLChar(ch)) { + styler.ColourTo(i - 1, state); + state = SCE_SH_DEFAULT; + HereDoc.State = 0; + goto restartLexer; + } + chNext = styler.SafeGetCharAt(i + 1); + } else if (HereDoc.Indent) { + // indented HERE delimiter + unsigned int bk = (i > 0)? i - 1: 0; + while (i > 0) { + ch = styler.SafeGetCharAt(bk--); + if (isEOLChar(ch)) { + goto endHereDoc; + } else if (!isspacechar(ch)) { + break; // got leading non-whitespace + } + } + } + } + } else if (state == SCE_SH_SCALAR) { // variable names + if (isEndVar(ch)) { + if ((state == SCE_SH_SCALAR) + && i == (styler.GetStartSegment() + 1)) { + // Special variable: $(, $_ etc. + styler.ColourTo(i, state); + state = SCE_SH_DEFAULT; + } else { + styler.ColourTo(i - 1, state); + state = SCE_SH_DEFAULT; + goto restartLexer; + } + } + } else if (state == SCE_SH_STRING + || state == SCE_SH_CHARACTER + || state == SCE_SH_BACKTICKS + || state == SCE_SH_PARAM + ) { + if (!Quote.Down && !isspacechar(ch)) { + Quote.Open(ch); + } else if (ch == '\\' && Quote.Up != '\\') { + i++; + ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + } else if (ch == Quote.Down) { + Quote.Count--; + if (Quote.Count == 0) { + Quote.Rep--; + if (Quote.Rep <= 0) { + styler.ColourTo(i, state); + state = SCE_SH_DEFAULT; + ch = ' '; + } + if (Quote.Up == Quote.Down) { + Quote.Count++; + } + } + } else if (ch == Quote.Up) { + Quote.Count++; + } + } + } + if (state == SCE_SH_ERROR) { + break; + } + chPrev = ch; + } + styler.ColourTo(lengthDoc - 1, state); +} + +static bool IsCommentLine(int line, Accessor &styler) { + int pos = styler.LineStart(line); + int eol_pos = styler.LineStart(line + 1) - 1; + for (int i = pos; i < eol_pos; i++) { + char ch = styler[i]; + if (ch == '#') + return true; + else if (ch != ' ' && ch != '\t') + return false; + } + return false; +} + +static void FoldBashDoc(unsigned int startPos, int length, int, WordList *[], + Accessor &styler) { + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + // Comment folding + if (foldComment && atEOL && IsCommentLine(lineCurrent, styler)) + { + if (!IsCommentLine(lineCurrent - 1, styler) + && IsCommentLine(lineCurrent + 1, styler)) + levelCurrent++; + else if (IsCommentLine(lineCurrent - 1, styler) + && !IsCommentLine(lineCurrent+1, styler)) + levelCurrent--; + } + if (style == SCE_SH_OPERATOR) { + if (ch == '{') { + levelCurrent++; + } else if (ch == '}') { + levelCurrent--; + } + } + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +static const char * const bashWordListDesc[] = { + "Keywords", + 0 +}; + +LexerModule lmBash(SCLEX_BASH, ColouriseBashDoc, "bash", FoldBashDoc, bashWordListDesc); diff --git a/scintilla/src/LexBasic.cxx b/scintilla/src/LexBasic.cxx new file mode 100644 index 00000000..5661b0b9 --- /dev/null +++ b/scintilla/src/LexBasic.cxx @@ -0,0 +1,369 @@ +// Scintilla source code edit control +/** @file LexBasic.cxx + ** Lexer for BlitzBasic and PureBasic. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +// This tries to be a unified Lexer/Folder for all the BlitzBasic/BlitzMax/PurBasic basics +// and derivatives. Once they diverge enough, might want to split it into multiple +// lexers for more code clearity. +// +// Mail me (elias users sf net) for any bugs. + +// Folding only works for simple things like functions or types. + +// You may want to have a look at my ctags lexer as well, if you additionally to coloring +// and folding need to extract things like label tags in your editor. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +/* Bits: + * 1 - whitespace + * 2 - operator + * 4 - identifier + * 8 - decimal digit + * 16 - hex digit + * 32 - bin digit + */ +static int character_classification[128] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, + 60, 60, 28, 28, 28, 28, 28, 28, 28, 28, 2, 2, 2, 2, 2, 2, + 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 4, + 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 0 +}; + +static bool IsSpace(int c) { + return c < 128 && (character_classification[c] & 1); +} + +static bool IsOperator(int c) { + return c < 128 && (character_classification[c] & 2); +} + +static bool IsIdentifier(int c) { + return c < 128 && (character_classification[c] & 4); +} + +static bool IsDigit(int c) { + return c < 128 && (character_classification[c] & 8); +} + +static bool IsHexDigit(int c) { + return c < 128 && (character_classification[c] & 16); +} + +static bool IsBinDigit(int c) { + return c < 128 && (character_classification[c] & 32); +} + +static int LowerCase(int c) +{ + if (c >= 'A' && c <= 'Z') + return 'a' + c - 'A'; + return c; +} + +static void ColouriseBasicDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler, char comment_char) { + bool wasfirst = true, isfirst = true; // true if first token in a line + styler.StartAt(startPos); + + StyleContext sc(startPos, length, initStyle, styler); + + // Can't use sc.More() here else we miss the last character + for (; ; sc.Forward()) { + if (sc.state == SCE_B_IDENTIFIER) { + if (!IsIdentifier(sc.ch)) { + // Labels + if (wasfirst && sc.Match(':')) { + sc.ChangeState(SCE_B_LABEL); + sc.ForwardSetState(SCE_B_DEFAULT); + } else { + char s[100]; + int kstates[4] = { + SCE_B_KEYWORD, + SCE_B_KEYWORD2, + SCE_B_KEYWORD3, + SCE_B_KEYWORD4, + }; + sc.GetCurrentLowered(s, sizeof(s)); + for (int i = 0; i < 4; i++) { + if (keywordlists[i]->InList(s)) { + sc.ChangeState(kstates[i]); + } + } + // Types, must set them as operator else they will be + // matched as number/constant + if (sc.Match('.') || sc.Match('$') || sc.Match('%') || + sc.Match('#')) { + sc.SetState(SCE_B_OPERATOR); + } else { + sc.SetState(SCE_B_DEFAULT); + } + } + } + } else if (sc.state == SCE_B_OPERATOR) { + if (!IsOperator(sc.ch) || sc.Match('#')) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_LABEL) { + if (!IsIdentifier(sc.ch)) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_CONSTANT) { + if (!IsIdentifier(sc.ch)) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_NUMBER) { + if (!IsDigit(sc.ch)) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_HEXNUMBER) { + if (!IsHexDigit(sc.ch)) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_BINNUMBER) { + if (!IsBinDigit(sc.ch)) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_STRING) { + if (sc.ch == '"') { + sc.ForwardSetState(SCE_B_DEFAULT); + } + if (sc.atLineEnd) { + sc.ChangeState(SCE_B_ERROR); + sc.SetState(SCE_B_DEFAULT); + } + } else if (sc.state == SCE_B_COMMENT || sc.state == SCE_B_PREPROCESSOR) { + if (sc.atLineEnd) { + sc.SetState(SCE_B_DEFAULT); + } + } + + if (sc.atLineStart) + isfirst = true; + + if (sc.state == SCE_B_DEFAULT || sc.state == SCE_B_ERROR) { + if (isfirst && sc.Match('.')) { + sc.SetState(SCE_B_LABEL); + } else if (isfirst && sc.Match('#')) { + wasfirst = isfirst; + sc.SetState(SCE_B_IDENTIFIER); + } else if (sc.Match(comment_char)) { + // Hack to make deprecated QBASIC '$Include show + // up in freebasic with SCE_B_PREPROCESSOR. + if (comment_char == '\'' && sc.Match(comment_char, '$')) + sc.SetState(SCE_B_PREPROCESSOR); + else + sc.SetState(SCE_B_COMMENT); + } else if (sc.Match('"')) { + sc.SetState(SCE_B_STRING); + } else if (IsDigit(sc.ch)) { + sc.SetState(SCE_B_NUMBER); + } else if (sc.Match('$')) { + sc.SetState(SCE_B_HEXNUMBER); + } else if (sc.Match('%')) { + sc.SetState(SCE_B_BINNUMBER); + } else if (sc.Match('#')) { + sc.SetState(SCE_B_CONSTANT); + } else if (IsOperator(sc.ch)) { + sc.SetState(SCE_B_OPERATOR); + } else if (IsIdentifier(sc.ch)) { + wasfirst = isfirst; + sc.SetState(SCE_B_IDENTIFIER); + } else if (!IsSpace(sc.ch)) { + sc.SetState(SCE_B_ERROR); + } + } + + if (!IsSpace(sc.ch)) + isfirst = false; + + if (!sc.More()) + break; + } + sc.Complete(); +} + +static int CheckBlitzFoldPoint(char const *token, int &level) { + if (!strcmp(token, "function") || + !strcmp(token, "type")) { + level |= SC_FOLDLEVELHEADERFLAG; + return 1; + } + if (!strcmp(token, "end function") || + !strcmp(token, "end type")) { + return -1; + } + return 0; +} + +static int CheckPureFoldPoint(char const *token, int &level) { + if (!strcmp(token, "procedure") || + !strcmp(token, "enumeration") || + !strcmp(token, "interface") || + !strcmp(token, "structure")) { + level |= SC_FOLDLEVELHEADERFLAG; + return 1; + } + if (!strcmp(token, "endprocedure") || + !strcmp(token, "endenumeration") || + !strcmp(token, "endinterface") || + !strcmp(token, "endstructure")) { + return -1; + } + return 0; +} + +static int CheckFreeFoldPoint(char const *token, int &level) { + if (!strcmp(token, "function") || + !strcmp(token, "sub") || + !strcmp(token, "type")) { + level |= SC_FOLDLEVELHEADERFLAG; + return 1; + } + if (!strcmp(token, "end function") || + !strcmp(token, "end sub") || + !strcmp(token, "end type")) { + return -1; + } + return 0; +} + +static void FoldBasicDoc(unsigned int startPos, int length, + Accessor &styler, int (*CheckFoldPoint)(char const *, int &)) { + int line = styler.GetLine(startPos); + int level = styler.LevelAt(line); + int go = 0, done = 0; + int endPos = startPos + length; + char word[256]; + int wordlen = 0; + int i; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + // Scan for tokens at the start of the line (they may include + // whitespace, for tokens like "End Function" + for (i = startPos; i < endPos; i++) { + int c = styler.SafeGetCharAt(i); + if (!done && !go) { + if (wordlen) { // are we scanning a token already? + word[wordlen] = static_cast(LowerCase(c)); + if (!IsIdentifier(c)) { // done with token + word[wordlen] = '\0'; + go = CheckFoldPoint(word, level); + if (!go) { + // Treat any whitespace as single blank, for + // things like "End Function". + if (IsSpace(c) && IsIdentifier(word[wordlen - 1])) { + word[wordlen] = ' '; + if (wordlen < 255) + wordlen++; + } + else // done with this line + done = 1; + } + } else if (wordlen < 255) { + wordlen++; + } + } else { // start scanning at first non-whitespace character + if (!IsSpace(c)) { + if (IsIdentifier(c)) { + word[0] = static_cast(LowerCase(c)); + wordlen = 1; + } else // done with this line + done = 1; + } + } + } + if (c == '\n') { // line end + if (!done && wordlen == 0 && foldCompact) // line was only space + level |= SC_FOLDLEVELWHITEFLAG; + if (level != styler.LevelAt(line)) + styler.SetLevel(line, level); + level += go; + line++; + // reset state + wordlen = 0; + level &= ~SC_FOLDLEVELHEADERFLAG; + level &= ~SC_FOLDLEVELWHITEFLAG; + go = 0; + done = 0; + } + } +} + +static void ColouriseBlitzBasicDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + ColouriseBasicDoc(startPos, length, initStyle, keywordlists, styler, ';'); +} + +static void ColourisePureBasicDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + ColouriseBasicDoc(startPos, length, initStyle, keywordlists, styler, ';'); +} + +static void ColouriseFreeBasicDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + ColouriseBasicDoc(startPos, length, initStyle, keywordlists, styler, '\''); +} + +static void FoldBlitzBasicDoc(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + FoldBasicDoc(startPos, length, styler, CheckBlitzFoldPoint); +} + +static void FoldPureBasicDoc(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + FoldBasicDoc(startPos, length, styler, CheckPureFoldPoint); +} + +static void FoldFreeBasicDoc(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + FoldBasicDoc(startPos, length, styler, CheckFreeFoldPoint); +} + +static const char * const blitzbasicWordListDesc[] = { + "BlitzBasic Keywords", + "user1", + "user2", + "user3", + 0 +}; + +static const char * const purebasicWordListDesc[] = { + "PureBasic Keywords", + "PureBasic PreProcessor Keywords", + "user defined 1", + "user defined 2", + 0 +}; + +static const char * const freebasicWordListDesc[] = { + "FreeBasic Keywords", + "FreeBasic PreProcessor Keywords", + "user defined 1", + "user defined 2", + 0 +}; + +LexerModule lmBlitzBasic(SCLEX_BLITZBASIC, ColouriseBlitzBasicDoc, "blitzbasic", + FoldBlitzBasicDoc, blitzbasicWordListDesc); + +LexerModule lmPureBasic(SCLEX_PUREBASIC, ColourisePureBasicDoc, "purebasic", + FoldPureBasicDoc, purebasicWordListDesc); + +LexerModule lmFreeBasic(SCLEX_FREEBASIC, ColouriseFreeBasicDoc, "freebasic", + FoldFreeBasicDoc, freebasicWordListDesc); + diff --git a/scintilla/src/LexBullant.cxx b/scintilla/src/LexBullant.cxx new file mode 100644 index 00000000..59fe6c41 --- /dev/null +++ b/scintilla/src/LexBullant.cxx @@ -0,0 +1,225 @@ +// SciTE - Scintilla based Text Editor +// LexBullant.cxx - lexer for Bullant + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + + +static int classifyWordBullant(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { + char s[100]; + for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + s[i] = static_cast(tolower(styler[start + i])); + s[i + 1] = '\0'; + } + int lev= 0; + char chAttr = SCE_C_IDENTIFIER; + if (isdigit(s[0]) || (s[0] == '.')){ + chAttr = SCE_C_NUMBER; + } + else { + if (keywords.InList(s)) { + chAttr = SCE_C_WORD; + if (strcmp(s, "end") == 0) + lev = -1; + else if (strcmp(s, "method") == 0 || + strcmp(s, "case") == 0 || + strcmp(s, "class") == 0 || + strcmp(s, "debug") == 0 || + strcmp(s, "test") == 0 || + strcmp(s, "if") == 0 || + strcmp(s, "lock") == 0 || + strcmp(s, "transaction") == 0 || + strcmp(s, "trap") == 0 || + strcmp(s, "until") == 0 || + strcmp(s, "while") == 0) + lev = 1; + } + } + styler.ColourTo(end, chAttr); + return lev; +} + +static void ColouriseBullantDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + WordList &keywords = *keywordlists[0]; + + styler.StartAt(startPos); + + bool fold = styler.GetPropertyInt("fold") != 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + + int state = initStyle; + if (state == SCE_C_STRINGEOL) // Does not leak onto next line + state = SCE_C_DEFAULT; + char chPrev = ' '; + char chNext = styler[startPos]; + unsigned int lengthDoc = startPos + length; + int visibleChars = 0; + styler.StartSegment(startPos); + int endFoundThisLine = 0; + for (unsigned int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if ((ch == '\r' && chNext != '\n') || (ch == '\n')) { + // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix) + // Avoid triggering two times on Dos/Win + // End of line + endFoundThisLine = 0; + if (state == SCE_C_STRINGEOL) { + styler.ColourTo(i, state); + state = SCE_C_DEFAULT; + } + if (fold) { + int lev = levelPrev; + if (visibleChars == 0) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + styler.SetLevel(lineCurrent, lev); + lineCurrent++; + levelPrev = levelCurrent; + } + visibleChars = 0; + +/* int indentBlock = GetLineIndentation(lineCurrent); + if (blockChange==1){ + lineCurrent++; + int pos=SetLineIndentation(lineCurrent, indentBlock + indentSize); + } else if (blockChange==-1) { + indentBlock -= indentSize; + if (indentBlock < 0) + indentBlock = 0; + SetLineIndentation(lineCurrent, indentBlock); + lineCurrent++; + } + blockChange=0; +*/ } + if (!isspace(ch)) + visibleChars++; + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + chPrev = ' '; + i += 1; + continue; + } + + if (state == SCE_C_DEFAULT) { + if (iswordstart(ch)) { + styler.ColourTo(i-1, state); + state = SCE_C_IDENTIFIER; + } else if (ch == '@' && chNext == 'o') { + if ((styler.SafeGetCharAt(i+2) =='f') && (styler.SafeGetCharAt(i+3) == 'f')) { + styler.ColourTo(i-1, state); + state = SCE_C_COMMENT; + } + } else if (ch == '#') { + styler.ColourTo(i-1, state); + state = SCE_C_COMMENTLINE; + } else if (ch == '\"') { + styler.ColourTo(i-1, state); + state = SCE_C_STRING; + } else if (ch == '\'') { + styler.ColourTo(i-1, state); + state = SCE_C_CHARACTER; + } else if (isoperator(ch)) { + styler.ColourTo(i-1, state); + styler.ColourTo(i, SCE_C_OPERATOR); + } + } else if (state == SCE_C_IDENTIFIER) { + if (!iswordchar(ch)) { + int levelChange = classifyWordBullant(styler.GetStartSegment(), i - 1, keywords, styler); + state = SCE_C_DEFAULT; + chNext = styler.SafeGetCharAt(i + 1); + if (ch == '#') { + state = SCE_C_COMMENTLINE; + } else if (ch == '\"') { + state = SCE_C_STRING; + } else if (ch == '\'') { + state = SCE_C_CHARACTER; + } else if (isoperator(ch)) { + styler.ColourTo(i, SCE_C_OPERATOR); + } + if (endFoundThisLine == 0) + levelCurrent+=levelChange; + if (levelChange == -1) + endFoundThisLine=1; + } + } else if (state == SCE_C_COMMENT) { + if (ch == '@' && chNext == 'o') { + if (styler.SafeGetCharAt(i+2) == 'n') { + styler.ColourTo(i+2, state); + state = SCE_C_DEFAULT; + i+=2; + } + } + } else if (state == SCE_C_COMMENTLINE) { + if (ch == '\r' || ch == '\n') { + endFoundThisLine = 0; + styler.ColourTo(i-1, state); + state = SCE_C_DEFAULT; + } + } else if (state == SCE_C_STRING) { + if (ch == '\\') { + if (chNext == '\"' || chNext == '\'' || chNext == '\\') { + i++; + ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + } + } else if (ch == '\"') { + styler.ColourTo(i, state); + state = SCE_C_DEFAULT; + } else if (chNext == '\r' || chNext == '\n') { + endFoundThisLine = 0; + styler.ColourTo(i-1, SCE_C_STRINGEOL); + state = SCE_C_STRINGEOL; + } + } else if (state == SCE_C_CHARACTER) { + if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { + endFoundThisLine = 0; + styler.ColourTo(i-1, SCE_C_STRINGEOL); + state = SCE_C_STRINGEOL; + } else if (ch == '\\') { + if (chNext == '\"' || chNext == '\'' || chNext == '\\') { + i++; + ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + } + } else if (ch == '\'') { + styler.ColourTo(i, state); + state = SCE_C_DEFAULT; + } + } + chPrev = ch; + } + styler.ColourTo(lengthDoc - 1, state); + + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + if (fold) { + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + //styler.SetLevel(lineCurrent, levelCurrent | flagsNext); + styler.SetLevel(lineCurrent, levelPrev | flagsNext); + + } +} + +static const char * const bullantWordListDesc[] = { + "Keywords", + 0 +}; + +LexerModule lmBullant(SCLEX_BULLANT, ColouriseBullantDoc, "bullant", 0, bullantWordListDesc); diff --git a/scintilla/src/LexCLW.cxx b/scintilla/src/LexCLW.cxx new file mode 100644 index 00000000..e768b731 --- /dev/null +++ b/scintilla/src/LexCLW.cxx @@ -0,0 +1,675 @@ +// Scintilla source code edit control +/** @file LexClw.cxx + ** Lexer for Clarion. + ** 2004/12/17 Updated Lexer + **/ +// Copyright 2003-2004 by Ron Schofield +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +// Is an end of line character +inline bool IsEOL(const int ch) { + + return(ch == '\n'); +} + +// Convert character to uppercase +static char CharacterUpper(char chChar) { + + if (chChar < 'a' || chChar > 'z') { + return(chChar); + } + else { + return(static_cast(chChar - 'a' + 'A')); + } +} + +// Convert string to uppercase +static void StringUpper(char *szString) { + + while (*szString) { + *szString = CharacterUpper(*szString); + szString++; + } +} + +// Is a label start character +inline bool IsALabelStart(const int iChar) { + + return(isalpha(iChar) || iChar == '_'); +} + +// Is a label character +inline bool IsALabelCharacter(const int iChar) { + + return(isalnum(iChar) || iChar == '_' || iChar == ':'); +} + +// Is the character is a ! and the the next character is not a ! +inline bool IsACommentStart(const int iChar) { + + return(iChar == '!'); +} + +// Is the character a Clarion hex character (ABCDEF) +inline bool IsAHexCharacter(const int iChar, bool bCaseSensitive) { + + // Case insensitive. + if (!bCaseSensitive) { + if (strchr("ABCDEFabcdef", iChar) != NULL) { + return(true); + } + } + // Case sensitive + else { + if (strchr("ABCDEF", iChar) != NULL) { + return(true); + } + } + return(false); +} + +// Is the character a Clarion base character (B=Binary, O=Octal, H=Hex) +inline bool IsANumericBaseCharacter(const int iChar, bool bCaseSensitive) { + + // Case insensitive. + if (!bCaseSensitive) { + // If character is a numeric base character + if (strchr("BOHboh", iChar) != NULL) { + return(true); + } + } + // Case sensitive + else { + // If character is a numeric base character + if (strchr("BOH", iChar) != NULL) { + return(true); + } + } + return(false); +} + +// Set the correct numeric constant state +inline bool SetNumericConstantState(StyleContext &scDoc) { + + int iPoints = 0; // Point counter + char cNumericString[512]; // Numeric string buffer + + // Buffer the current numberic string + scDoc.GetCurrent(cNumericString, sizeof(cNumericString)); + // Loop through the string until end of string (NULL termination) + for (int iIndex = 0; cNumericString[iIndex] != '\0'; iIndex++) { + // Depending on the character + switch (cNumericString[iIndex]) { + // Is a . (point) + case '.' : + // Increment point counter + iPoints++; + break; + default : + break; + } + } + // If points found (can be more than one for improper formatted number + if (iPoints > 0) { + return(true); + } + // Else no points found + else { + return(false); + } +} + +// Get the next word in uppercase from the current position (keyword lookahead) +inline bool GetNextWordUpper(Accessor &styler, unsigned int uiStartPos, int iLength, char *cWord) { + + unsigned int iIndex = 0; // Buffer Index + + // Loop through the remaining string from the current position + for (int iOffset = uiStartPos; iOffset < iLength; iOffset++) { + // Get the character from the buffer using the offset + char cCharacter = styler[iOffset]; + if (IsEOL(cCharacter)) { + break; + } + // If the character is alphabet character + if (isalpha(cCharacter)) { + // Add UPPERCASE character to the word buffer + cWord[iIndex++] = CharacterUpper(cCharacter); + } + } + // Add null termination + cWord[iIndex] = '\0'; + // If no word was found + if (iIndex == 0) { + // Return failure + return(false); + } + // Else word was found + else { + // Return success + return(true); + } +} + +// Clarion Language Colouring Procedure +static void ColouriseClarionDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler, bool bCaseSensitive) { + + int iParenthesesLevel = 0; // Parenthese Level + int iColumn1Label = false; // Label starts in Column 1 + + WordList &wlClarionKeywords = *wlKeywords[0]; // Clarion Keywords + WordList &wlCompilerDirectives = *wlKeywords[1]; // Compiler Directives + WordList &wlRuntimeExpressions = *wlKeywords[2]; // Runtime Expressions + WordList &wlBuiltInProcsFuncs = *wlKeywords[3]; // Builtin Procedures and Functions + WordList &wlStructsDataTypes = *wlKeywords[4]; // Structures and Data Types + WordList &wlAttributes = *wlKeywords[5]; // Procedure Attributes + WordList &wlStandardEquates = *wlKeywords[6]; // Standard Equates + WordList &wlLabelReservedWords = *wlKeywords[7]; // Clarion Reserved Keywords (Labels) + WordList &wlProcLabelReservedWords = *wlKeywords[8]; // Clarion Reserved Keywords (Procedure Labels) + + const char wlProcReservedKeywordList[] = + "PROCEDURE FUNCTION"; + WordList wlProcReservedKeywords; + wlProcReservedKeywords.Set(wlProcReservedKeywordList); + + const char wlCompilerKeywordList[] = + "COMPILE OMIT"; + WordList wlCompilerKeywords; + wlCompilerKeywords.Set(wlCompilerKeywordList); + + const char wlLegacyStatementsList[] = + "BOF EOF FUNCTION POINTER SHARE"; + WordList wlLegacyStatements; + wlLegacyStatements.Set(wlLegacyStatementsList); + + StyleContext scDoc(uiStartPos, iLength, iInitStyle, accStyler); + + // lex source code + for (; scDoc.More(); scDoc.Forward()) + { + // + // Determine if the current state should terminate. + // + + // Label State Handling + if (scDoc.state == SCE_CLW_LABEL) { + // If the character is not a valid label + if (!IsALabelCharacter(scDoc.ch)) { + // If the character is a . (dot syntax) + if (scDoc.ch == '.') { + // Turn off column 1 label flag as label now cannot be reserved work + iColumn1Label = false; + // Uncolour the . (dot) to default state, move forward one character, + // and change back to the label state. + scDoc.SetState(SCE_CLW_DEFAULT); + scDoc.Forward(); + scDoc.SetState(SCE_CLW_LABEL); + } + // Else check label + else { + char cLabel[512]; // Label buffer + // Buffer the current label string + scDoc.GetCurrent(cLabel,sizeof(cLabel)); + // If case insensitive, convert string to UPPERCASE to match passed keywords. + if (!bCaseSensitive) { + StringUpper(cLabel); + } + // Else if UPPERCASE label string is in the Clarion compiler keyword list + if (wlCompilerKeywords.InList(cLabel) && iColumn1Label){ + // change the label to error state + scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); + } + // Else if UPPERCASE label string is in the Clarion reserved keyword list + else if (wlLabelReservedWords.InList(cLabel) && iColumn1Label){ + // change the label to error state + scDoc.ChangeState(SCE_CLW_ERROR); + } + // Else if UPPERCASE label string is + else if (wlProcLabelReservedWords.InList(cLabel) && iColumn1Label) { + char cWord[512]; // Word buffer + // Get the next word from the current position + if (GetNextWordUpper(accStyler,scDoc.currentPos,uiStartPos+iLength,cWord)) { + // If the next word is a procedure reserved word + if (wlProcReservedKeywords.InList(cWord)) { + // Change the label to error state + scDoc.ChangeState(SCE_CLW_ERROR); + } + } + } + // Else if label string is in the compiler directive keyword list + else if (wlCompilerDirectives.InList(cLabel)) { + // change the state to compiler directive state + scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); + } + // Terminate the label state and set to default state + scDoc.SetState(SCE_CLW_DEFAULT); + } + } + } + // Keyword State Handling + else if (scDoc.state == SCE_CLW_KEYWORD) { + // If character is : (colon) + if (scDoc.ch == ':') { + char cEquate[512]; // Equate buffer + // Move forward to include : (colon) in buffer + scDoc.Forward(); + // Buffer the equate string + scDoc.GetCurrent(cEquate,sizeof(cEquate)); + // If case insensitive, convert string to UPPERCASE to match passed keywords. + if (!bCaseSensitive) { + StringUpper(cEquate); + } + // If statement string is in the equate list + if (wlStandardEquates.InList(cEquate)) { + // Change to equate state + scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE); + } + } + // If the character is not a valid label character + else if (!IsALabelCharacter(scDoc.ch)) { + char cStatement[512]; // Statement buffer + // Buffer the statement string + scDoc.GetCurrent(cStatement,sizeof(cStatement)); + // If case insensitive, convert string to UPPERCASE to match passed keywords. + if (!bCaseSensitive) { + StringUpper(cStatement); + } + // If statement string is in the Clarion keyword list + if (wlClarionKeywords.InList(cStatement)) { + // Change the statement string to the Clarion keyword state + scDoc.ChangeState(SCE_CLW_KEYWORD); + } + // Else if statement string is in the compiler directive keyword list + else if (wlCompilerDirectives.InList(cStatement)) { + // Change the statement string to the compiler directive state + scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); + } + // Else if statement string is in the runtime expressions keyword list + else if (wlRuntimeExpressions.InList(cStatement)) { + // Change the statement string to the runtime expressions state + scDoc.ChangeState(SCE_CLW_RUNTIME_EXPRESSIONS); + } + // Else if statement string is in the builtin procedures and functions keyword list + else if (wlBuiltInProcsFuncs.InList(cStatement)) { + // Change the statement string to the builtin procedures and functions state + scDoc.ChangeState(SCE_CLW_BUILTIN_PROCEDURES_FUNCTION); + } + // Else if statement string is in the tructures and data types keyword list + else if (wlStructsDataTypes.InList(cStatement)) { + // Change the statement string to the structures and data types state + scDoc.ChangeState(SCE_CLW_STRUCTURE_DATA_TYPE); + } + // Else if statement string is in the procedure attribute keyword list + else if (wlAttributes.InList(cStatement)) { + // Change the statement string to the procedure attribute state + scDoc.ChangeState(SCE_CLW_ATTRIBUTE); + } + // Else if statement string is in the standard equate keyword list + else if (wlStandardEquates.InList(cStatement)) { + // Change the statement string to the standard equate state + scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE); + } + // Else if statement string is in the deprecated or legacy keyword list + else if (wlLegacyStatements.InList(cStatement)) { + // Change the statement string to the standard equate state + scDoc.ChangeState(SCE_CLW_DEPRECATED); + } + // Else the statement string doesn't match any work list + else { + // Change the statement string to the default state + scDoc.ChangeState(SCE_CLW_DEFAULT); + } + // Terminate the keyword state and set to default state + scDoc.SetState(SCE_CLW_DEFAULT); + } + } + // String State Handling + else if (scDoc.state == SCE_CLW_STRING) { + // If the character is an ' (single quote) + if (scDoc.ch == '\'') { + // Set the state to default and move forward colouring + // the ' (single quote) as default state + // terminating the string state + scDoc.SetState(SCE_CLW_DEFAULT); + scDoc.Forward(); + } + // If the next character is an ' (single quote) + if (scDoc.chNext == '\'') { + // Move forward one character and set to default state + // colouring the next ' (single quote) as default state + // terminating the string state + scDoc.ForwardSetState(SCE_CLW_DEFAULT); + scDoc.Forward(); + } + } + // Picture String State Handling + else if (scDoc.state == SCE_CLW_PICTURE_STRING) { + // If the character is an ( (open parenthese) + if (scDoc.ch == '(') { + // Increment the parenthese level + iParenthesesLevel++; + } + // Else if the character is a ) (close parenthese) + else if (scDoc.ch == ')') { + // If the parenthese level is set to zero + // parentheses matched + if (!iParenthesesLevel) { + scDoc.SetState(SCE_CLW_DEFAULT); + } + // Else parenthese level is greater than zero + // still looking for matching parentheses + else { + // Decrement the parenthese level + iParenthesesLevel--; + } + } + } + // Standard Equate State Handling + else if (scDoc.state == SCE_CLW_STANDARD_EQUATE) { + if (!isalnum(scDoc.ch)) { + scDoc.SetState(SCE_CLW_DEFAULT); + } + } + // Integer Constant State Handling + else if (scDoc.state == SCE_CLW_INTEGER_CONSTANT) { + // If the character is not a digit (0-9) + // or character is not a hexidecimal character (A-F) + // or character is not a . (point) + // or character is not a numberic base character (B,O,H) + if (!(isdigit(scDoc.ch) + || IsAHexCharacter(scDoc.ch, bCaseSensitive) + || scDoc.ch == '.' + || IsANumericBaseCharacter(scDoc.ch, bCaseSensitive))) { + // If the number was a real + if (SetNumericConstantState(scDoc)) { + // Colour the matched string to the real constant state + scDoc.ChangeState(SCE_CLW_REAL_CONSTANT); + } + // Else the number was an integer + else { + // Colour the matched string to an integer constant state + scDoc.ChangeState(SCE_CLW_INTEGER_CONSTANT); + } + // Terminate the integer constant state and set to default state + scDoc.SetState(SCE_CLW_DEFAULT); + } + } + + // + // Determine if a new state should be entered. + // + + // Beginning of Line Handling + if (scDoc.atLineStart) { + // Reset the column 1 label flag + iColumn1Label = false; + // If column 1 character is a label start character + if (IsALabelStart(scDoc.ch)) { + // Label character is found in column 1 + // so set column 1 label flag and clear last column 1 label + iColumn1Label = true; + // Set the state to label + scDoc.SetState(SCE_CLW_LABEL); + } + // else if character is a space or tab + else if (IsASpace(scDoc.ch)){ + // Set to default state + scDoc.SetState(SCE_CLW_DEFAULT); + } + // else if comment start (!) or is an * (asterisk) + else if (IsACommentStart(scDoc.ch) || scDoc.ch == '*' ) { + // then set the state to comment. + scDoc.SetState(SCE_CLW_COMMENT); + } + // else the character is a ? (question mark) + else if (scDoc.ch == '?') { + // Change to the compiler directive state, move forward, + // colouring the ? (question mark), change back to default state. + scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); + scDoc.Forward(); + scDoc.SetState(SCE_CLW_DEFAULT); + } + // else an invalid character in column 1 + else { + // Set to error state + scDoc.SetState(SCE_CLW_ERROR); + } + } + // End of Line Handling + else if (scDoc.atLineEnd) { + // Reset to the default state at the end of each line. + scDoc.SetState(SCE_CLW_DEFAULT); + } + // Default Handling + else { + // If in default state + if (scDoc.state == SCE_CLW_DEFAULT) { + // If is a letter could be a possible statement + if (isalpha(scDoc.ch)) { + // Set the state to Clarion Keyword and verify later + scDoc.SetState(SCE_CLW_KEYWORD); + } + // else is a number + else if (isdigit(scDoc.ch)) { + // Set the state to Integer Constant and verify later + scDoc.SetState(SCE_CLW_INTEGER_CONSTANT); + } + // else if the start of a comment or a | (line continuation) + else if (IsACommentStart(scDoc.ch) || scDoc.ch == '|') { + // then set the state to comment. + scDoc.SetState(SCE_CLW_COMMENT); + } + // else if the character is a ' (single quote) + else if (scDoc.ch == '\'') { + // If the character is also a ' (single quote) + // Embedded Apostrophe + if (scDoc.chNext == '\'') { + // Move forward colouring it as default state + scDoc.ForwardSetState(SCE_CLW_DEFAULT); + } + else { + // move to the next character and then set the state to comment. + scDoc.ForwardSetState(SCE_CLW_STRING); + } + } + // else the character is an @ (ampersand) + else if (scDoc.ch == '@') { + // Case insensitive. + if (!bCaseSensitive) { + // If character is a valid picture token character + if (strchr("DEKNPSTdeknpst", scDoc.chNext) != NULL) { + // Set to the picture string state + scDoc.SetState(SCE_CLW_PICTURE_STRING); + } + } + // Case sensitive + else { + // If character is a valid picture token character + if (strchr("DEKNPST", scDoc.chNext) != NULL) { + // Set the picture string state + scDoc.SetState(SCE_CLW_PICTURE_STRING); + } + } + } + } + } + } + // lexing complete + scDoc.Complete(); +} + +// Clarion Language Case Sensitive Colouring Procedure +static void ColouriseClarionDocSensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) { + + ColouriseClarionDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, true); +} + +// Clarion Language Case Insensitive Colouring Procedure +static void ColouriseClarionDocInsensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) { + + ColouriseClarionDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, false); +} + +// Fill Buffer + +static void FillBuffer(unsigned int uiStart, unsigned int uiEnd, Accessor &accStyler, char *szBuffer, unsigned int uiLength) { + + unsigned int uiPos = 0; + + while ((uiPos < uiEnd - uiStart + 1) && (uiPos < uiLength-1)) { + szBuffer[uiPos] = static_cast(toupper(accStyler[uiStart + uiPos])); + uiPos++; + } + szBuffer[uiPos] = '\0'; +} + +// Classify Clarion Fold Point + +static int ClassifyClarionFoldPoint(int iLevel, const char* szString) { + + if (!(isdigit(szString[0]) || (szString[0] == '.'))) { + if (strcmp(szString, "PROCEDURE") == 0) { + // iLevel = SC_FOLDLEVELBASE + 1; + } + else if (strcmp(szString, "MAP") == 0 || + strcmp(szString,"ACCEPT") == 0 || + strcmp(szString,"BEGIN") == 0 || + strcmp(szString,"CASE") == 0 || + strcmp(szString,"EXECUTE") == 0 || + strcmp(szString,"IF") == 0 || + strcmp(szString,"ITEMIZE") == 0 || + strcmp(szString,"INTERFACE") == 0 || + strcmp(szString,"JOIN") == 0 || + strcmp(szString,"LOOP") == 0 || + strcmp(szString,"MODULE") == 0 || + strcmp(szString,"RECORD") == 0) { + iLevel++; + } + else if (strcmp(szString, "APPLICATION") == 0 || + strcmp(szString, "CLASS") == 0 || + strcmp(szString, "DETAIL") == 0 || + strcmp(szString, "FILE") == 0 || + strcmp(szString, "FOOTER") == 0 || + strcmp(szString, "FORM") == 0 || + strcmp(szString, "GROUP") == 0 || + strcmp(szString, "HEADER") == 0 || + strcmp(szString, "INTERFACE") == 0 || + strcmp(szString, "MENU") == 0 || + strcmp(szString, "MENUBAR") == 0 || + strcmp(szString, "OLE") == 0 || + strcmp(szString, "OPTION") == 0 || + strcmp(szString, "QUEUE") == 0 || + strcmp(szString, "REPORT") == 0 || + strcmp(szString, "SHEET") == 0 || + strcmp(szString, "TAB") == 0 || + strcmp(szString, "TOOLBAR") == 0 || + strcmp(szString, "VIEW") == 0 || + strcmp(szString, "WINDOW") == 0) { + iLevel++; + } + else if (strcmp(szString, "END") == 0 || + strcmp(szString, "UNTIL") == 0 || + strcmp(szString, "WHILE") == 0) { + iLevel--; + } + } + return(iLevel); +} + +// Clarion Language Folding Procedure +static void FoldClarionDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *[], Accessor &accStyler) { + + unsigned int uiEndPos = uiStartPos + iLength; + int iLineCurrent = accStyler.GetLine(uiStartPos); + int iLevelPrev = accStyler.LevelAt(iLineCurrent) & SC_FOLDLEVELNUMBERMASK; + int iLevelCurrent = iLevelPrev; + char chNext = accStyler[uiStartPos]; + int iStyle = iInitStyle; + int iStyleNext = accStyler.StyleAt(uiStartPos); + int iVisibleChars = 0; + int iLastStart = 0; + + for (unsigned int uiPos = uiStartPos; uiPos < uiEndPos; uiPos++) { + + char chChar = chNext; + chNext = accStyler.SafeGetCharAt(uiPos + 1); + int iStylePrev = iStyle; + iStyle = iStyleNext; + iStyleNext = accStyler.StyleAt(uiPos + 1); + bool bEOL = (chChar == '\r' && chNext != '\n') || (chChar == '\n'); + + if (iStylePrev == SCE_CLW_DEFAULT) { + if (iStyle == SCE_CLW_KEYWORD || iStyle == SCE_CLW_STRUCTURE_DATA_TYPE) { + // Store last word start point. + iLastStart = uiPos; + } + } + + if (iStylePrev == SCE_CLW_KEYWORD || iStylePrev == SCE_CLW_STRUCTURE_DATA_TYPE) { + if(iswordchar(chChar) && !iswordchar(chNext)) { + char chBuffer[100]; + FillBuffer(iLastStart, uiPos, accStyler, chBuffer, sizeof(chBuffer)); + iLevelCurrent = ClassifyClarionFoldPoint(iLevelCurrent,chBuffer); + // if ((iLevelCurrent == SC_FOLDLEVELBASE + 1) && iLineCurrent > 1) { + // accStyler.SetLevel(iLineCurrent-1,SC_FOLDLEVELBASE); + // iLevelPrev = SC_FOLDLEVELBASE; + // } + } + } + + if (bEOL) { + int iLevel = iLevelPrev; + if ((iLevelCurrent > iLevelPrev) && (iVisibleChars > 0)) + iLevel |= SC_FOLDLEVELHEADERFLAG; + if (iLevel != accStyler.LevelAt(iLineCurrent)) { + accStyler.SetLevel(iLineCurrent,iLevel); + } + iLineCurrent++; + iLevelPrev = iLevelCurrent; + iVisibleChars = 0; + } + + if (!isspacechar(chChar)) + iVisibleChars++; + } + + // Fill in the real level of the next line, keeping the current flags + // as they will be filled in later. + int iFlagsNext = accStyler.LevelAt(iLineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + accStyler.SetLevel(iLineCurrent, iLevelPrev | iFlagsNext); +} + +// Word List Descriptions +static const char * const rgWordListDescriptions[] = { + "Clarion Keywords", + "Compiler Directives", + "Built-in Procedures and Functions", + "Runtime Expressions", + "Structure and Data Types", + "Attributes", + "Standard Equates", + "Reserved Words (Labels)", + "Reserved Words (Procedure Labels)", + 0, +}; + +// Case Sensitive Clarion Language Lexer +LexerModule lmClw(SCLEX_CLW, ColouriseClarionDocSensitive, "clarion", FoldClarionDoc, rgWordListDescriptions); + +// Case Insensitive Clarion Language Lexer +LexerModule lmClwNoCase(SCLEX_CLWNOCASE, ColouriseClarionDocInsensitive, "clarionnocase", FoldClarionDoc, rgWordListDescriptions); diff --git a/scintilla/src/LexCPP.cxx b/scintilla/src/LexCPP.cxx new file mode 100644 index 00000000..e4d51b5b --- /dev/null +++ b/scintilla/src/LexCPP.cxx @@ -0,0 +1,484 @@ +// Scintilla source code edit control +/** @file LexCPP.cxx + ** Lexer for C++, C, Java, and JavaScript. + **/ +// Copyright 1998-2005 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#define SET_LOWER "abcdefghijklmnopqrstuvwxyz" +#define SET_UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +#define SET_DIGITS "0123456789" + +class SetOfCharacters { + int size; + bool valueAfter; + bool *bset; +public: + SetOfCharacters(const char *setOfCharacters, int size_=0x80, bool valueAfter_=false) { + size = size_; + valueAfter = valueAfter_; + bset = new bool[size]; + for (int i=0; i < size; i++) { + bset[i] = false; + } + for (const char *cp=setOfCharacters; *cp; cp++) { + int val = static_cast(*cp); + PLATFORM_ASSERT(val >= 0); + PLATFORM_ASSERT(val < size); + bset[val] = true; + } + } + ~SetOfCharacters() { + delete []bset; + bset = 0; + size = 0; + } + void Add(int val) { + PLATFORM_ASSERT(val >= 0); + PLATFORM_ASSERT(val < size); + bset[val] = true; + } + bool Contains(int val) { + PLATFORM_ASSERT(val >= 0); + return (val < size) ? bset[val] : valueAfter; + } +}; + +static bool IsSpaceEquiv(int state) { + return (state <= SCE_C_COMMENTDOC) || + // including SCE_C_DEFAULT, SCE_C_COMMENT, SCE_C_COMMENTLINE + (state == SCE_C_COMMENTLINEDOC) || (state == SCE_C_COMMENTDOCKEYWORD) || + (state == SCE_C_COMMENTDOCKEYWORDERROR); +} + +static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler, bool caseSensitive) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + + bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor") != 0; + + SetOfCharacters setOKBeforeRE("(=,"); + + SetOfCharacters setDoxygen("$@\\&<>#{}[]" SET_LOWER); + + SetOfCharacters setWordStart("_" SET_LOWER SET_UPPER, 0x80, true); + SetOfCharacters setWord("._" SET_LOWER SET_UPPER SET_DIGITS, 0x80, true); + if (styler.GetPropertyInt("lexer.cpp.allow.dollars", 1) != 0) { + setWordStart.Add('$'); + setWord.Add('$'); + } + + int chPrevNonWhite = ' '; + int visibleChars = 0; + bool lastWordWasUUID = false; + int styleBeforeDCKeyword = SCE_C_DEFAULT; + bool continuationLine = false; + + if (initStyle == SCE_C_PREPROCESSOR) { + // Set continuationLine if last character of previous line is '\' + int lineCurrent = styler.GetLine(startPos); + if (lineCurrent > 0) { + int chBack = styler.SafeGetCharAt(startPos-1, 0); + int chBack2 = styler.SafeGetCharAt(startPos-2, 0); + int lineEndChar = '!'; + if (chBack2 == '\r' && chBack == '\n') { + lineEndChar = styler.SafeGetCharAt(startPos-3, 0); + } else if (chBack == '\n' || chBack == '\r') { + lineEndChar = chBack2; + } + continuationLine = lineEndChar == '\\'; + } + } + + // look back to set chPrevNonWhite properly for better regex colouring + if (startPos > 0) { + int back = startPos; + while (--back && IsSpaceEquiv(styler.StyleAt(back))) + ; + if (styler.StyleAt(back) == SCE_C_OPERATOR) { + chPrevNonWhite = styler.SafeGetCharAt(back); + } + } + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + if (sc.atLineStart) { + if (sc.state == SCE_C_STRING) { + // Prevent SCE_C_STRINGEOL from leaking back to previous line which + // ends with a line continuation by locking in the state upto this position. + sc.SetState(SCE_C_STRING); + } + // Reset states to begining of colourise so no surprises + // if different sets of lines lexed. + visibleChars = 0; + lastWordWasUUID = false; + } + + // Handle line continuation generically. + if (sc.ch == '\\') { + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } + continuationLine = true; + continue; + } + } + + // Determine if the current state should terminate. + switch (sc.state) { + case SCE_C_OPERATOR: + sc.SetState(SCE_C_DEFAULT); + break; + case SCE_C_NUMBER: + // We accept almost anything because of hex. and number suffixes + if (!setWord.Contains(sc.ch)) { + sc.SetState(SCE_C_DEFAULT); + } + break; + case SCE_C_IDENTIFIER: + if (!setWord.Contains(sc.ch) || (sc.ch == '.')) { + char s[1000]; + if (caseSensitive) { + sc.GetCurrent(s, sizeof(s)); + } else { + sc.GetCurrentLowered(s, sizeof(s)); + } + if (keywords.InList(s)) { + lastWordWasUUID = strcmp(s, "uuid") == 0; + sc.ChangeState(SCE_C_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_C_WORD2); + } else if (keywords4.InList(s)) { + sc.ChangeState(SCE_C_GLOBALCLASS); + } + sc.SetState(SCE_C_DEFAULT); + } + break; + case SCE_C_PREPROCESSOR: + if (sc.atLineStart && !continuationLine) { + sc.SetState(SCE_C_DEFAULT); + } else if (stylingWithinPreprocessor) { + if (IsASpace(sc.ch)) { + sc.SetState(SCE_C_DEFAULT); + } + } else { + if (sc.Match('/', '*') || sc.Match('/', '/')) { + sc.SetState(SCE_C_DEFAULT); + } + } + break; + case SCE_C_COMMENT: + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } + break; + case SCE_C_COMMENTDOC: + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support + // Verify that we have the conditions to mark a comment-doc-keyword + if ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) { + styleBeforeDCKeyword = SCE_C_COMMENTDOC; + sc.SetState(SCE_C_COMMENTDOCKEYWORD); + } + } + break; + case SCE_C_COMMENTLINE: + if (sc.atLineStart) { + sc.SetState(SCE_C_DEFAULT); + } + break; + case SCE_C_COMMENTLINEDOC: + if (sc.atLineStart) { + sc.SetState(SCE_C_DEFAULT); + } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support + // Verify that we have the conditions to mark a comment-doc-keyword + if ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) { + styleBeforeDCKeyword = SCE_C_COMMENTLINEDOC; + sc.SetState(SCE_C_COMMENTDOCKEYWORD); + } + } + break; + case SCE_C_COMMENTDOCKEYWORD: + if ((styleBeforeDCKeyword == SCE_C_COMMENTDOC) && sc.Match('*', '/')) { + sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR); + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } else if (!setDoxygen.Contains(sc.ch)) { + char s[100]; + if (caseSensitive) { + sc.GetCurrent(s, sizeof(s)); + } else { + sc.GetCurrentLowered(s, sizeof(s)); + } + if (!IsASpace(sc.ch) || !keywords3.InList(s + 1)) { + sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR); + } + sc.SetState(styleBeforeDCKeyword); + } + break; + case SCE_C_STRING: + if (sc.atLineEnd) { + sc.ChangeState(SCE_C_STRINGEOL); + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_C_DEFAULT); + } + break; + case SCE_C_CHARACTER: + if (sc.atLineEnd) { + sc.ChangeState(SCE_C_STRINGEOL); + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\'') { + sc.ForwardSetState(SCE_C_DEFAULT); + } + break; + case SCE_C_REGEX: + if (sc.atLineStart) { + sc.SetState(SCE_C_DEFAULT); + } else if (sc.ch == '/') { + sc.Forward(); + while ((sc.ch < 0x80) && islower(sc.ch)) + sc.Forward(); // gobble regex flags + sc.SetState(SCE_C_DEFAULT); + } else if (sc.ch == '\\') { + // Gobble up the quoted character + if (sc.chNext == '\\' || sc.chNext == '/') { + sc.Forward(); + } + } + break; + case SCE_C_STRINGEOL: + if (sc.atLineStart) { + sc.SetState(SCE_C_DEFAULT); + } + break; + case SCE_C_VERBATIM: + if (sc.ch == '\"') { + if (sc.chNext == '\"') { + sc.Forward(); + } else { + sc.ForwardSetState(SCE_C_DEFAULT); + } + } + break; + case SCE_C_UUID: + if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == ')') { + sc.SetState(SCE_C_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_C_DEFAULT) { + if (sc.Match('@', '\"')) { + sc.SetState(SCE_C_VERBATIM); + sc.Forward(); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + if (lastWordWasUUID) { + sc.SetState(SCE_C_UUID); + lastWordWasUUID = false; + } else { + sc.SetState(SCE_C_NUMBER); + } + } else if (setWordStart.Contains(sc.ch) || (sc.ch == '@')) { + if (lastWordWasUUID) { + sc.SetState(SCE_C_UUID); + lastWordWasUUID = false; + } else { + sc.SetState(SCE_C_IDENTIFIER); + } + } else if (sc.Match('/', '*')) { + if (sc.Match("/**") || sc.Match("/*!")) { // Support of Qt/Doxygen doc. style + sc.SetState(SCE_C_COMMENTDOC); + } else { + sc.SetState(SCE_C_COMMENT); + } + sc.Forward(); // Eat the * so it isn't used for the end of the comment + } else if (sc.Match('/', '/')) { + if ((sc.Match("///") && !sc.Match("////")) || sc.Match("//!")) + // Support of Qt/Doxygen doc. style + sc.SetState(SCE_C_COMMENTLINEDOC); + else + sc.SetState(SCE_C_COMMENTLINE); + } else if (sc.ch == '/' && setOKBeforeRE.Contains(chPrevNonWhite)) { + sc.SetState(SCE_C_REGEX); // JavaScript's RegEx + } else if (sc.ch == '\"') { + sc.SetState(SCE_C_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_C_CHARACTER); + } else if (sc.ch == '#' && visibleChars == 0) { + // Preprocessor commands are alone on their line + sc.SetState(SCE_C_PREPROCESSOR); + // Skip whitespace between # and preprocessor word + do { + sc.Forward(); + } while ((sc.ch == ' ' || sc.ch == '\t') && sc.More()); + if (sc.atLineEnd) { + sc.SetState(SCE_C_DEFAULT); + } + } else if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_C_OPERATOR); + } + } + + if (!IsASpace(sc.ch) && !IsSpaceEquiv(sc.state)) { + chPrevNonWhite = sc.ch; + visibleChars++; + } + continuationLine = false; + } + sc.Complete(); +} + +static bool IsStreamCommentStyle(int style) { + return style == SCE_C_COMMENT || + style == SCE_C_COMMENTDOC || + style == SCE_C_COMMENTDOCKEYWORD || + style == SCE_C_COMMENTDOCKEYWORDERROR; +} + +// Store both the current line's fold level and the next lines in the +// level store to make it easy to pick up with each increment +// and to make it possible to fiddle the current level for "} else {". +static void FoldCppDoc(unsigned int startPos, int length, int initStyle, + WordList *[], Accessor &styler) { + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldPreprocessor = styler.GetPropertyInt("fold.preprocessor") != 0; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelCurrent = SC_FOLDLEVELBASE; + if (lineCurrent > 0) + levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; + int levelMinCurrent = levelCurrent; + int levelNext = levelCurrent; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (foldComment && IsStreamCommentStyle(style)) { + if (!IsStreamCommentStyle(stylePrev) && (stylePrev != SCE_C_COMMENTLINEDOC)) { + levelNext++; + } else if (!IsStreamCommentStyle(styleNext) && (styleNext != SCE_C_COMMENTLINEDOC) && !atEOL) { + // Comments don't end at end of line and the next character may be unstyled. + levelNext--; + } + } + if (foldComment && (style == SCE_C_COMMENTLINE)) { + if ((ch == '/') && (chNext == '/')) { + char chNext2 = styler.SafeGetCharAt(i + 2); + if (chNext2 == '{') { + levelNext++; + } else if (chNext2 == '}') { + levelNext--; + } + } + } + if (foldPreprocessor && (style == SCE_C_PREPROCESSOR)) { + if (ch == '#') { + unsigned int j = i + 1; + while ((j < endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) { + j++; + } + if (styler.Match(j, "region") || styler.Match(j, "if")) { + levelNext++; + } else if (styler.Match(j, "end")) { + levelNext--; + } + } + } + if (style == SCE_C_OPERATOR) { + if (ch == '{') { + // Measure the minimum before a '{' to allow + // folding on "} else {" + if (levelMinCurrent > levelNext) { + levelMinCurrent = levelNext; + } + levelNext++; + } else if (ch == '}') { + levelNext--; + } + } + if (atEOL) { + int levelUse = levelCurrent; + if (foldAtElse) { + levelUse = levelMinCurrent; + } + int lev = levelUse | levelNext << 16; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if (levelUse < levelNext) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelCurrent = levelNext; + levelMinCurrent = levelCurrent; + visibleChars = 0; + } + if (!IsASpace(ch)) + visibleChars++; + } +} + +static const char * const cppWordLists[] = { + "Primary keywords and identifiers", + "Secondary keywords and identifiers", + "Documentation comment keywords", + "Unused", + "Global classes and typedefs", + 0, + }; + +static void ColouriseCppDocSensitive(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + ColouriseCppDoc(startPos, length, initStyle, keywordlists, styler, true); +} + +static void ColouriseCppDocInsensitive(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + ColouriseCppDoc(startPos, length, initStyle, keywordlists, styler, false); +} + +LexerModule lmCPP(SCLEX_CPP, ColouriseCppDocSensitive, "cpp", FoldCppDoc, cppWordLists); +LexerModule lmCPPNoCase(SCLEX_CPPNOCASE, ColouriseCppDocInsensitive, "cppnocase", FoldCppDoc, cppWordLists); diff --git a/scintilla/src/LexCSS.cxx b/scintilla/src/LexCSS.cxx new file mode 100644 index 00000000..88e14545 --- /dev/null +++ b/scintilla/src/LexCSS.cxx @@ -0,0 +1,303 @@ +// Scintilla source code edit control +/** @file LexCSS.cxx + ** Lexer for Cascading Style Sheets + ** Written by Jakub Vrána + ** Improved by Philippe Lhoste (CSS2) + **/ +// Copyright 1998-2002 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + + +static inline bool IsAWordChar(const unsigned int ch) { + return (isalnum(ch) || ch == '-' || ch == '_' || ch >= 161); // _ is not in fact correct CSS word-character +} + +inline bool IsCssOperator(const char ch) { + if (!isalnum(ch) && + (ch == '{' || ch == '}' || ch == ':' || ch == ',' || ch == ';' || + ch == '.' || ch == '#' || ch == '!' || ch == '@' || + /* CSS2 */ + ch == '*' || ch == '>' || ch == '+' || ch == '=' || ch == '~' || ch == '|' || + ch == '[' || ch == ']' || ch == '(' || ch == ')')) { + return true; + } + return false; +} + +static void ColouriseCssDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { + WordList &keywords = *keywordlists[0]; + WordList &pseudoClasses = *keywordlists[1]; + WordList &keywords2 = *keywordlists[2]; + + StyleContext sc(startPos, length, initStyle, styler); + + int lastState = -1; // before operator + int lastStateC = -1; // before comment + int op = ' '; // last operator + + for (; sc.More(); sc.Forward()) { + if (sc.state == SCE_CSS_COMMENT && sc.Match('*', '/')) { + if (lastStateC == -1) { + // backtrack to get last state: + // comments are like whitespace, so we must return to the previous state + unsigned int i = startPos; + for (; i > 0; i--) { + if ((lastStateC = styler.StyleAt(i-1)) != SCE_CSS_COMMENT) { + if (lastStateC == SCE_CSS_OPERATOR) { + op = styler.SafeGetCharAt(i-1); + while (--i) { + lastState = styler.StyleAt(i-1); + if (lastState != SCE_CSS_OPERATOR && lastState != SCE_CSS_COMMENT) + break; + } + if (i == 0) + lastState = SCE_CSS_DEFAULT; + } + break; + } + } + if (i == 0) + lastStateC = SCE_CSS_DEFAULT; + } + sc.Forward(); + sc.ForwardSetState(lastStateC); + } + + if (sc.state == SCE_CSS_COMMENT) + continue; + + if (sc.state == SCE_CSS_DOUBLESTRING || sc.state == SCE_CSS_SINGLESTRING) { + if (sc.ch != (sc.state == SCE_CSS_DOUBLESTRING ? '\"' : '\'')) + continue; + unsigned int i = sc.currentPos; + while (i && styler[i-1] == '\\') + i--; + if ((sc.currentPos - i) % 2 == 1) + continue; + sc.ForwardSetState(SCE_CSS_VALUE); + } + + if (sc.state == SCE_CSS_OPERATOR) { + if (op == ' ') { + unsigned int i = startPos; + op = styler.SafeGetCharAt(i-1); + while (--i) { + lastState = styler.StyleAt(i-1); + if (lastState != SCE_CSS_OPERATOR && lastState != SCE_CSS_COMMENT) + break; + } + } + switch (op) { + case '@': + if (lastState == SCE_CSS_DEFAULT) + sc.SetState(SCE_CSS_DIRECTIVE); + break; + case '*': + if (lastState == SCE_CSS_DEFAULT) + sc.SetState(SCE_CSS_TAG); + break; + case '>': + case '+': + if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_CLASS + || lastState == SCE_CSS_ID || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) + sc.SetState(SCE_CSS_DEFAULT); + break; + case '[': + if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_DEFAULT || + lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) + sc.SetState(SCE_CSS_ATTRIBUTE); + break; + case ']': + if (lastState == SCE_CSS_ATTRIBUTE) + sc.SetState(SCE_CSS_TAG); + break; + case '{': + if (lastState == SCE_CSS_DIRECTIVE) + sc.SetState(SCE_CSS_DEFAULT); + else if (lastState == SCE_CSS_TAG) + sc.SetState(SCE_CSS_IDENTIFIER); + break; + case '}': + if (lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_VALUE || lastState == SCE_CSS_IMPORTANT || + lastState == SCE_CSS_IDENTIFIER || lastState == SCE_CSS_IDENTIFIER2) + sc.SetState(SCE_CSS_DEFAULT); + break; + case ':': + if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_DEFAULT || + lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) + sc.SetState(SCE_CSS_PSEUDOCLASS); + else if (lastState == SCE_CSS_IDENTIFIER || lastState == SCE_CSS_IDENTIFIER2 || lastState == SCE_CSS_UNKNOWN_IDENTIFIER) + sc.SetState(SCE_CSS_VALUE); + break; + case '.': + if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_DEFAULT || + lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) + sc.SetState(SCE_CSS_CLASS); + break; + case '#': + if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_DEFAULT || + lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) + sc.SetState(SCE_CSS_ID); + break; + case ',': + if (lastState == SCE_CSS_TAG) + sc.SetState(SCE_CSS_DEFAULT); + break; + case ';': + if (lastState == SCE_CSS_DIRECTIVE) + sc.SetState(SCE_CSS_DEFAULT); + else if (lastState == SCE_CSS_VALUE || lastState == SCE_CSS_IMPORTANT) + sc.SetState(SCE_CSS_IDENTIFIER); + break; + case '!': + if (lastState == SCE_CSS_VALUE) + sc.SetState(SCE_CSS_IMPORTANT); + break; + } + } + + if (IsAWordChar(sc.ch)) { + if (sc.state == SCE_CSS_DEFAULT) + sc.SetState(SCE_CSS_TAG); + continue; + } + + if (IsAWordChar(sc.chPrev) && ( + sc.state == SCE_CSS_IDENTIFIER || sc.state == SCE_CSS_IDENTIFIER2 + || sc.state == SCE_CSS_UNKNOWN_IDENTIFIER + || sc.state == SCE_CSS_PSEUDOCLASS || sc.state == SCE_CSS_UNKNOWN_PSEUDOCLASS + || sc.state == SCE_CSS_IMPORTANT + )) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + char *s2 = s; + while (*s2 && !IsAWordChar(*s2)) + s2++; + switch (sc.state) { + case SCE_CSS_IDENTIFIER: + if (!keywords.InList(s2)) { + if (keywords2.InList(s2)) { + sc.ChangeState(SCE_CSS_IDENTIFIER2); + } else { + sc.ChangeState(SCE_CSS_UNKNOWN_IDENTIFIER); + } + } + break; + case SCE_CSS_UNKNOWN_IDENTIFIER: + if (keywords.InList(s2)) + sc.ChangeState(SCE_CSS_IDENTIFIER); + else if (keywords2.InList(s2)) + sc.ChangeState(SCE_CSS_IDENTIFIER2); + break; + case SCE_CSS_PSEUDOCLASS: + if (!pseudoClasses.InList(s2)) + sc.ChangeState(SCE_CSS_UNKNOWN_PSEUDOCLASS); + break; + case SCE_CSS_UNKNOWN_PSEUDOCLASS: + if (pseudoClasses.InList(s2)) + sc.ChangeState(SCE_CSS_PSEUDOCLASS); + break; + case SCE_CSS_IMPORTANT: + if (strcmp(s2, "important") != 0) + sc.ChangeState(SCE_CSS_VALUE); + break; + } + } + + if (sc.ch != '.' && sc.ch != ':' && sc.ch != '#' && (sc.state == SCE_CSS_CLASS || sc.state == SCE_CSS_PSEUDOCLASS || sc.state == SCE_CSS_UNKNOWN_PSEUDOCLASS || sc.state == SCE_CSS_ID)) + sc.SetState(SCE_CSS_TAG); + + if (sc.Match('/', '*')) { + lastStateC = sc.state; + sc.SetState(SCE_CSS_COMMENT); + sc.Forward(); + } else if (sc.state == SCE_CSS_VALUE && (sc.ch == '\"' || sc.ch == '\'')) { + sc.SetState((sc.ch == '\"' ? SCE_CSS_DOUBLESTRING : SCE_CSS_SINGLESTRING)); + } else if (IsCssOperator(static_cast(sc.ch)) + && (sc.state != SCE_CSS_ATTRIBUTE || sc.ch == ']') + && (sc.state != SCE_CSS_VALUE || sc.ch == ';' || sc.ch == '}' || sc.ch == '!') + && (sc.state != SCE_CSS_DIRECTIVE || sc.ch == ';' || sc.ch == '{') + ) { + if (sc.state != SCE_CSS_OPERATOR) + lastState = sc.state; + sc.SetState(SCE_CSS_OPERATOR); + op = sc.ch; + } + } + + sc.Complete(); +} + +static void FoldCSSDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + bool inComment = (styler.StyleAt(startPos-1) == SCE_CSS_COMMENT); + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int style = styler.StyleAt(i); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (foldComment) { + if (!inComment && (style == SCE_CSS_COMMENT)) + levelCurrent++; + else if (inComment && (style != SCE_CSS_COMMENT)) + levelCurrent--; + inComment = (style == SCE_CSS_COMMENT); + } + if (style == SCE_CSS_OPERATOR) { + if (ch == '{') { + levelCurrent++; + } else if (ch == '}') { + levelCurrent--; + } + } + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +static const char * const cssWordListDesc[] = { + "CSS1 Keywords", + "Pseudo classes", + "CSS2 Keywords", + 0 +}; + +LexerModule lmCss(SCLEX_CSS, ColouriseCssDoc, "css", FoldCSSDoc, cssWordListDesc); diff --git a/scintilla/src/LexCaml.cxx b/scintilla/src/LexCaml.cxx new file mode 100644 index 00000000..6d6eee75 --- /dev/null +++ b/scintilla/src/LexCaml.cxx @@ -0,0 +1,399 @@ +// Scintilla source code edit control +/** @file LexCaml.cxx + ** Lexer for Objective Caml. + **/ +// Copyright 2005 by Robert Roessler +// The License.txt file describes the conditions under which this software may be distributed. +/* Release History + 20050204 Initial release. + 20050205 Quick compiler standards/"cleanliness" adjustment. + 20050206 Added cast for IsLeadByte(). + 20050209 Changes to "external" build support. + 20050306 Fix for 1st-char-in-doc "corner" case. + 20050502 Fix for [harmless] one-past-the-end coloring. + 20050515 Refined numeric token recognition logic. + 20051125 Added 2nd "optional" keywords class. + 20051129 Support "magic" (read-only) comments for RCaml. + 20051204 Swtich to using StyleContext infrastructure. +*/ + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +// Since the Microsoft __iscsym[f] funcs are not ANSI... +inline int iscaml(int c) {return isalnum(c) || c == '_';} +inline int iscamlf(int c) {return isalpha(c) || c == '_';} +inline int iscamld(int c) {return isdigit(c) || c == '_';} + +static const int baseT[24] = { + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A - L */ + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,16 /* M - X */ +}; + +#ifdef BUILD_AS_EXTERNAL_LEXER +/* + (actually seems to work!) +*/ +#include "WindowAccessor.h" +#include "ExternalLexer.h" + +#if PLAT_WIN +#include +#endif + +static void ColouriseCamlDoc( + unsigned int startPos, int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler); + +static void FoldCamlDoc( + unsigned int startPos, int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler); + +static void InternalLexOrFold(int lexOrFold, unsigned int startPos, int length, + int initStyle, char *words[], WindowID window, char *props); + +static const char* LexerName = "caml"; + +#ifdef TRACE +void Platform::DebugPrintf(const char *format, ...) { + char buffer[2000]; + va_list pArguments; + va_start(pArguments, format); + vsprintf(buffer,format,pArguments); + va_end(pArguments); + Platform::DebugDisplay(buffer); +} +#else +void Platform::DebugPrintf(const char *, ...) { +} +#endif + +bool Platform::IsDBCSLeadByte(int codePage, char ch) { + return ::IsDBCSLeadByteEx(codePage, ch) != 0; +} + +long Platform::SendScintilla(WindowID w, unsigned int msg, unsigned long wParam, long lParam) { + return ::SendMessage(reinterpret_cast(w), msg, wParam, lParam); +} + +long Platform::SendScintillaPointer(WindowID w, unsigned int msg, unsigned long wParam, void *lParam) { + return ::SendMessage(reinterpret_cast(w), msg, wParam, + reinterpret_cast(lParam)); +} + +void EXT_LEXER_DECL Fold(unsigned int lexer, unsigned int startPos, int length, + int initStyle, char *words[], WindowID window, char *props) +{ + // below useless evaluation(s) to supress "not used" warnings + lexer; + // build expected data structures and do the Fold + InternalLexOrFold(1, startPos, length, initStyle, words, window, props); + +} + +int EXT_LEXER_DECL GetLexerCount() +{ + return 1; // just us [Objective] Caml lexers here! +} + +void EXT_LEXER_DECL GetLexerName(unsigned int Index, char *name, int buflength) +{ + // below useless evaluation(s) to supress "not used" warnings + Index; + // return as much of our lexer name as will fit (what's up with Index?) + if (buflength > 0) { + buflength--; + int n = strlen(LexerName); + if (n > buflength) + n = buflength; + memcpy(name, LexerName, n), name[n] = '\0'; + } +} + +void EXT_LEXER_DECL Lex(unsigned int lexer, unsigned int startPos, int length, + int initStyle, char *words[], WindowID window, char *props) +{ + // below useless evaluation(s) to supress "not used" warnings + lexer; + // build expected data structures and do the Lex + InternalLexOrFold(0, startPos, length, initStyle, words, window, props); +} + +static void InternalLexOrFold(int foldOrLex, unsigned int startPos, int length, + int initStyle, char *words[], WindowID window, char *props) +{ + // create and initialize a WindowAccessor (including contained PropSet) + PropSet ps; + ps.SetMultiple(props); + WindowAccessor wa(window, ps); + // create and initialize WordList(s) + int nWL = 0; + for (; words[nWL]; nWL++) ; // count # of WordList PTRs needed + WordList** wl = new WordList* [nWL + 1];// alloc WordList PTRs + int i = 0; + for (; i < nWL; i++) { + wl[i] = new WordList(); // (works or THROWS bad_alloc EXCEPTION) + wl[i]->Set(words[i]); + } + wl[i] = 0; + // call our "internal" folder/lexer (... then do Flush!) + if (foldOrLex) + FoldCamlDoc(startPos, length, initStyle, wl, wa); + else + ColouriseCamlDoc(startPos, length, initStyle, wl, wa); + wa.Flush(); + // clean up before leaving + for (i = nWL - 1; i >= 0; i--) + delete wl[i]; + delete [] wl; +} + +static +#endif /* BUILD_AS_EXTERNAL_LEXER */ + +void ColouriseCamlDoc( + unsigned int startPos, int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler) +{ + // initialize styler + StyleContext sc(startPos, length, initStyle, styler); + // set up [initial] state info (terminating states that shouldn't "bleed") + int nesting = 0; + if (sc.state < SCE_CAML_STRING) + sc.state = SCE_CAML_DEFAULT; + if (sc.state >= SCE_CAML_COMMENT) + nesting = (sc.state & 0x0f) - SCE_CAML_COMMENT; + + int chBase = 0, chToken = 0, chLit = 0; + WordList& keywords = *keywordlists[0]; + WordList& keywords2 = *keywordlists[1]; + WordList& keywords3 = *keywordlists[2]; + const int useMagic = styler.GetPropertyInt("lexer.caml.magic", 0); + + // foreach char in range... + while (sc.More()) { + // set up [per-char] state info + int state2 = -1; // (ASSUME no state change) + int chColor = sc.currentPos - 1;// (ASSUME standard coloring range) + bool advance = true; // (ASSUME scanner "eats" 1 char) + + // step state machine + switch (sc.state & 0x0f) { + case SCE_CAML_DEFAULT: + chToken = sc.currentPos; // save [possible] token start (JIC) + // it's wide open; what do we have? + if (iscamlf(sc.ch)) + state2 = SCE_CAML_IDENTIFIER; + else if (sc.Match('`') && iscamlf(sc.chNext)) + state2 = SCE_CAML_TAGNAME; + else if (sc.Match('#') && isdigit(sc.chNext)) + state2 = SCE_CAML_LINENUM; + else if (isdigit(sc.ch)) { + state2 = SCE_CAML_NUMBER, chBase = 10; + if (sc.Match('0') && strchr("bBoOxX", sc.chNext)) + chBase = baseT[tolower(sc.chNext) - 'a'], sc.Forward(); + } else if (sc.Match('\'')) /* (char literal?) */ + state2 = SCE_CAML_CHAR, chLit = 0; + else if (sc.Match('\"')) + state2 = SCE_CAML_STRING; + else if (sc.Match('(', '*')) + state2 = SCE_CAML_COMMENT, + sc.ch = ' ', // (make SURE "(*)" isn't seen as a closed comment) + sc.Forward(); + else if (strchr("!?~" /* Caml "prefix-symbol" */ + "=<>@^|&+-*/$%" /* Caml "infix-symbol" */ + "()[]{};,:.#", sc.ch)) /* Caml "bracket" or ;,:.# */ + state2 = SCE_CAML_OPERATOR; + break; + + case SCE_CAML_IDENTIFIER: + // [try to] interpret as [additional] identifier char + if (!(iscaml(sc.ch) || sc.Match('\''))) { + const int n = sc.currentPos - chToken; + if (n < 24) { + // length is believable as keyword, [re-]construct token + char t[24]; + for (int i = -n; i < 0; i++) + t[n + i] = static_cast(sc.GetRelative(i)); + t[n] = '\0'; + // special-case "_" token as KEYWORD + if ((n == 1 && sc.chPrev == '_') || keywords.InList(t)) + sc.ChangeState(SCE_CAML_KEYWORD); + else if (keywords2.InList(t)) + sc.ChangeState(SCE_CAML_KEYWORD2); + else if (keywords3.InList(t)) + sc.ChangeState(SCE_CAML_KEYWORD3); + } + state2 = SCE_CAML_DEFAULT, advance = false; + } + break; + + case SCE_CAML_TAGNAME: + // [try to] interpret as [additional] tagname char + if (!(iscaml(sc.ch) || sc.Match('\''))) + state2 = SCE_CAML_DEFAULT, advance = false; + break; + + /*case SCE_CAML_KEYWORD: + case SCE_CAML_KEYWORD2: + case SCE_CAML_KEYWORD3: + // [try to] interpret as [additional] keyword char + if (!iscaml(ch)) + state2 = SCE_CAML_DEFAULT, advance = false; + break;*/ + + case SCE_CAML_LINENUM: + // [try to] interpret as [additional] linenum directive char + if (!isdigit(sc.ch)) + state2 = SCE_CAML_DEFAULT, advance = false; + break; + + case SCE_CAML_OPERATOR: { + // [try to] interpret as [additional] operator char + const char* o = 0; + if (iscaml(sc.ch) || isspace(sc.ch) /* ident or whitespace */ + || (o = strchr(")]};,\'\"`#", sc.ch),o)/* "termination" chars */ + || !strchr("!$%&*+-./:<=>?@^|~", sc.ch)/* "operator" chars */) { + // check for INCLUSIVE termination + if (o && strchr(")]};,", sc.ch)) { + if ((sc.Match(')') && sc.chPrev == '(') + || (sc.Match(']') && sc.chPrev == '[')) + // special-case "()" and "[]" tokens as KEYWORDS + sc.ChangeState(SCE_CAML_KEYWORD); + chColor++; + } else + advance = false; + state2 = SCE_CAML_DEFAULT; + } + break; + } + + case SCE_CAML_NUMBER: + // [try to] interpret as [additional] numeric literal char + // N.B. - improperly accepts "extra" digits in base 2 or 8 literals + if (iscamld(sc.ch) || IsADigit(sc.ch, chBase)) + break; + // how about an integer suffix? + if ((sc.Match('l') || sc.Match('L') || sc.Match('n')) + && (iscamld(sc.chPrev) || IsADigit(sc.chPrev, chBase))) + break; + // or a floating-point literal? + if (chBase == 10) { + // with a decimal point? + if (sc.Match('.') && iscamld(sc.chPrev)) + break; + // with an exponent? (I) + if ((sc.Match('e') || sc.Match('E')) + && (iscamld(sc.chPrev) || sc.chPrev == '.')) + break; + // with an exponent? (II) + if ((sc.Match('+') || sc.Match('-')) + && (sc.chPrev == 'e' || sc.chPrev == 'E')) + break; + } + // it looks like we have run out of number + state2 = SCE_CAML_DEFAULT, advance = false; + break; + + case SCE_CAML_CHAR: + // [try to] interpret as [additional] char literal char + if (sc.Match('\\')) { + chLit = 1; // (definitely IS a char literal) + if (sc.chPrev == '\\') + sc.ch = ' '; // (so termination test isn't fooled) + // should we be terminating - one way or another? + } else if ((sc.Match('\'') && sc.chPrev != '\\') || sc.atLineEnd) { + state2 = SCE_CAML_DEFAULT; + if (sc.Match('\'')) + chColor++; + else + sc.ChangeState(SCE_CAML_IDENTIFIER); + // ... maybe a char literal, maybe not + } else if (chLit < 1 && sc.currentPos - chToken >= 2) + sc.ChangeState(SCE_CAML_IDENTIFIER), advance = false; + break; + + case SCE_CAML_STRING: + // [try to] interpret as [additional] string literal char + if (sc.Match('\\') && sc.chPrev == '\\') + sc.ch = ' '; // (so '\\' doesn't cause us trouble) + else if (sc.Match('\"') && sc.chPrev != '\\') + state2 = SCE_CAML_DEFAULT, chColor++; + break; + + case SCE_CAML_COMMENT: + case SCE_CAML_COMMENT1: + case SCE_CAML_COMMENT2: + case SCE_CAML_COMMENT3: + // we're IN a comment - does this start a NESTED comment? + if (sc.Match('(', '*')) + state2 = sc.state + 1, chToken = sc.currentPos, + sc.ch = ' ', // (make SURE "(*)" isn't seen as a closed comment) + sc.Forward(), nesting++; + // [try to] interpret as [additional] comment char + else if (sc.Match(')') && sc.chPrev == '*') { + if (nesting) + state2 = (sc.state & 0x0f) - 1, chToken = 0, nesting--; + else + state2 = SCE_CAML_DEFAULT; + chColor++; + // enable "magic" (read-only) comment AS REQUIRED + } else if (useMagic && sc.currentPos - chToken == 4 + && sc.Match('c') && sc.chPrev == 'r' && sc.GetRelative(-2) == '@') + sc.state |= 0x10; // (switch to read-only comment style) + break; + } + + // handle state change and char coloring as required + if (state2 >= 0) + styler.ColourTo(chColor, sc.state), sc.ChangeState(state2); + // move to next char UNLESS re-scanning current char + if (advance) + sc.Forward(); + } + + // do any required terminal char coloring (JIC) + sc.Complete(); +} + +#ifdef BUILD_AS_EXTERNAL_LEXER +static +#endif /* BUILD_AS_EXTERNAL_LEXER */ +void FoldCamlDoc( + unsigned int startPos, int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler) +{ + // below useless evaluation(s) to supress "not used" warnings + startPos || length || initStyle || keywordlists[0] || styler.Length(); +} + +static const char * const camlWordListDesc[] = { + "Keywords", // primary Objective Caml keywords + "Keywords2", // "optional" keywords (typically from Pervasives) + "Keywords3", // "optional" keywords (typically typenames) + 0 +}; + +#ifndef BUILD_AS_EXTERNAL_LEXER +LexerModule lmCaml(SCLEX_CAML, ColouriseCamlDoc, "caml", FoldCamlDoc, camlWordListDesc); +#endif /* BUILD_AS_EXTERNAL_LEXER */ diff --git a/scintilla/src/LexCmake.cxx b/scintilla/src/LexCmake.cxx new file mode 100644 index 00000000..3dd48f4e --- /dev/null +++ b/scintilla/src/LexCmake.cxx @@ -0,0 +1,453 @@ +// Scintilla source code edit control +/** @file LexCmake.cxx + ** Lexer for Cmake + **/ +// Copyright 2007 by Cristian Adam +// based on the NSIS lexer +// The License.txt file describes the conditions under which this software may be distributed. +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + + +static bool isCmakeNumber(char ch) +{ + return(ch >= '0' && ch <= '9'); +} + +static bool isCmakeChar(char ch) +{ + return(ch == '.' ) || (ch == '_' ) || isCmakeNumber(ch) || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'); +} + +static bool isCmakeLetter(char ch) +{ + return(ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'); +} + +static bool CmakeNextLineHasElse(unsigned int start, unsigned int end, Accessor &styler) +{ + int nNextLine = -1; + for ( unsigned int i = start; i < end; i++ ) { + char cNext = styler.SafeGetCharAt( i ); + if ( cNext == '\n' ) { + nNextLine = i+1; + break; + } + } + + if ( nNextLine == -1 ) // We never foudn the next line... + return false; + + for ( unsigned int firstChar = nNextLine; firstChar < end; firstChar++ ) { + char cNext = styler.SafeGetCharAt( firstChar ); + if ( cNext == ' ' ) + continue; + if ( cNext == '\t' ) + continue; + if ( styler.Match(firstChar, "ELSE") || styler.Match(firstChar, "else")) + return true; + break; + } + + return false; +} + +static int calculateFoldCmake(unsigned int start, unsigned int end, int foldlevel, Accessor &styler, bool bElse) +{ + // If the word is too long, it is not what we are looking for + if ( end - start > 20 ) + return foldlevel; + + int newFoldlevel = foldlevel; + + char s[20]; // The key word we are looking for has atmost 13 characters + for (unsigned int i = 0; i < end - start + 1 && i < 19; i++) { + s[i] = static_cast( styler[ start + i ] ); + s[i + 1] = '\0'; + } + + if ( CompareCaseInsensitive(s, "IF") == 0 || CompareCaseInsensitive(s, "WHILE") == 0 + || CompareCaseInsensitive(s, "MACRO") == 0 || CompareCaseInsensitive(s, "FOREACH") == 0 + || CompareCaseInsensitive(s, "ELSEIF") == 0 ) + newFoldlevel++; + else if ( CompareCaseInsensitive(s, "ENDIF") == 0 || CompareCaseInsensitive(s, "ENDWHILE") == 0 + || CompareCaseInsensitive(s, "ENDMACRO") == 0 || CompareCaseInsensitive(s, "ENDFOREACH") == 0) + newFoldlevel--; + else if ( bElse && CompareCaseInsensitive(s, "ELSEIF") == 0 ) + newFoldlevel++; + else if ( bElse && CompareCaseInsensitive(s, "ELSE") == 0 ) + newFoldlevel++; + + return newFoldlevel; +} + +static int classifyWordCmake(unsigned int start, unsigned int end, WordList *keywordLists[], Accessor &styler ) +{ + char word[100] = {0}; + char lowercaseWord[100] = {0}; + + WordList &Commands = *keywordLists[0]; + WordList &Parameters = *keywordLists[1]; + WordList &UserDefined = *keywordLists[2]; + + for (unsigned int i = 0; i < end - start + 1 && i < 99; i++) { + word[i] = static_cast( styler[ start + i ] ); + lowercaseWord[i] = static_cast(tolower(word[i])); + } + + // Check for special words... + if ( CompareCaseInsensitive(word, "MACRO") == 0 || CompareCaseInsensitive(word, "ENDMACRO") == 0 ) + return SCE_CMAKE_MACRODEF; + + if ( CompareCaseInsensitive(word, "IF") == 0 || CompareCaseInsensitive(word, "ENDIF") == 0 ) + return SCE_CMAKE_IFDEFINEDEF; + + if ( CompareCaseInsensitive(word, "ELSEIF") == 0 || CompareCaseInsensitive(word, "ELSE") == 0 ) + return SCE_CMAKE_IFDEFINEDEF; + + if ( CompareCaseInsensitive(word, "WHILE") == 0 || CompareCaseInsensitive(word, "ENDWHILE") == 0) + return SCE_CMAKE_WHILEDEF; + + if ( CompareCaseInsensitive(word, "FOREACH") == 0 || CompareCaseInsensitive(word, "ENDFOREACH") == 0) + return SCE_CMAKE_FOREACHDEF; + + if ( Commands.InList(lowercaseWord) ) + return SCE_CMAKE_COMMANDS; + + if ( Parameters.InList(word) ) + return SCE_CMAKE_PARAMETERS; + + + if ( UserDefined.InList(word) ) + return SCE_CMAKE_USERDEFINED; + + if ( strlen(word) > 3 ) { + if ( word[1] == '{' && word[strlen(word)-1] == '}' ) + return SCE_CMAKE_VARIABLE; + } + + // To check for numbers + if ( isCmakeNumber( word[0] ) ) { + bool bHasSimpleCmakeNumber = true; + for (unsigned int j = 1; j < end - start + 1 && j < 99; j++) { + if ( !isCmakeNumber( word[j] ) ) { + bHasSimpleCmakeNumber = false; + break; + } + } + + if ( bHasSimpleCmakeNumber ) + return SCE_CMAKE_NUMBER; + } + + return SCE_CMAKE_DEFAULT; +} + +static void ColouriseCmakeDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) +{ + int state = SCE_CMAKE_DEFAULT; + if ( startPos > 0 ) + state = styler.StyleAt(startPos-1); // Use the style from the previous line, usually default, but could be commentbox + + styler.StartAt( startPos ); + styler.GetLine( startPos ); + + unsigned int nLengthDoc = startPos + length; + styler.StartSegment( startPos ); + + char cCurrChar; + bool bVarInString = false; + bool bClassicVarInString = false; + + unsigned int i; + for ( i = startPos; i < nLengthDoc; i++ ) { + cCurrChar = styler.SafeGetCharAt( i ); + char cNextChar = styler.SafeGetCharAt(i+1); + + switch (state) { + case SCE_CMAKE_DEFAULT: + if ( cCurrChar == '#' ) { // we have a comment line + styler.ColourTo(i-1, state ); + state = SCE_CMAKE_COMMENT; + break; + } + if ( cCurrChar == '"' ) { + styler.ColourTo(i-1, state ); + state = SCE_CMAKE_STRINGDQ; + bVarInString = false; + bClassicVarInString = false; + break; + } + if ( cCurrChar == '\'' ) { + styler.ColourTo(i-1, state ); + state = SCE_CMAKE_STRINGRQ; + bVarInString = false; + bClassicVarInString = false; + break; + } + if ( cCurrChar == '`' ) { + styler.ColourTo(i-1, state ); + state = SCE_CMAKE_STRINGLQ; + bVarInString = false; + bClassicVarInString = false; + break; + } + + // CMake Variable + if ( cCurrChar == '$' || isCmakeChar(cCurrChar)) { + styler.ColourTo(i-1,state); + state = SCE_CMAKE_VARIABLE; + + // If it is a number, we must check and set style here first... + if ( isCmakeNumber(cCurrChar) && (cNextChar == '\t' || cNextChar == ' ' || cNextChar == '\r' || cNextChar == '\n' ) ) + styler.ColourTo( i, SCE_CMAKE_NUMBER); + + break; + } + + break; + case SCE_CMAKE_COMMENT: + if ( cNextChar == '\n' || cNextChar == '\r' ) { + // Special case: + if ( cCurrChar == '\\' ) { + styler.ColourTo(i-2,state); + styler.ColourTo(i,SCE_CMAKE_DEFAULT); + } + else { + styler.ColourTo(i,state); + state = SCE_CMAKE_DEFAULT; + } + } + break; + case SCE_CMAKE_STRINGDQ: + case SCE_CMAKE_STRINGLQ: + case SCE_CMAKE_STRINGRQ: + + if ( styler.SafeGetCharAt(i-1) == '\\' && styler.SafeGetCharAt(i-2) == '$' ) + break; // Ignore the next character, even if it is a quote of some sort + + if ( cCurrChar == '"' && state == SCE_CMAKE_STRINGDQ ) { + styler.ColourTo(i,state); + state = SCE_CMAKE_DEFAULT; + break; + } + + if ( cCurrChar == '`' && state == SCE_CMAKE_STRINGLQ ) { + styler.ColourTo(i,state); + state = SCE_CMAKE_DEFAULT; + break; + } + + if ( cCurrChar == '\'' && state == SCE_CMAKE_STRINGRQ ) { + styler.ColourTo(i,state); + state = SCE_CMAKE_DEFAULT; + break; + } + + if ( cNextChar == '\r' || cNextChar == '\n' ) { + int nCurLine = styler.GetLine(i+1); + int nBack = i; + // We need to check if the previous line has a \ in it... + bool bNextLine = false; + + while ( nBack > 0 ) { + if ( styler.GetLine(nBack) != nCurLine ) + break; + + char cTemp = styler.SafeGetCharAt(nBack, 'a'); // Letter 'a' is safe here + + if ( cTemp == '\\' ) { + bNextLine = true; + break; + } + if ( cTemp != '\r' && cTemp != '\n' && cTemp != '\t' && cTemp != ' ' ) + break; + + nBack--; + } + + if ( bNextLine ) { + styler.ColourTo(i+1,state); + } + if ( bNextLine == false ) { + styler.ColourTo(i,state); + state = SCE_CMAKE_DEFAULT; + } + } + break; + + case SCE_CMAKE_VARIABLE: + + // CMake Variable: + if ( cCurrChar == '$' ) + state = SCE_CMAKE_DEFAULT; + else if ( cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' ) ) + state = SCE_CMAKE_DEFAULT; + else if ( (isCmakeChar(cCurrChar) && !isCmakeChar( cNextChar) && cNextChar != '}') || cCurrChar == '}' ) { + state = classifyWordCmake( styler.GetStartSegment(), i, keywordLists, styler ); + styler.ColourTo( i, state); + state = SCE_CMAKE_DEFAULT; + } + else if ( !isCmakeChar( cCurrChar ) && cCurrChar != '{' && cCurrChar != '}' ) { + if ( classifyWordCmake( styler.GetStartSegment(), i-1, keywordLists, styler) == SCE_CMAKE_NUMBER ) + styler.ColourTo( i-1, SCE_CMAKE_NUMBER ); + + state = SCE_CMAKE_DEFAULT; + + if ( cCurrChar == '"' ) { + state = SCE_CMAKE_STRINGDQ; + bVarInString = false; + bClassicVarInString = false; + } + else if ( cCurrChar == '`' ) { + state = SCE_CMAKE_STRINGLQ; + bVarInString = false; + bClassicVarInString = false; + } + else if ( cCurrChar == '\'' ) { + state = SCE_CMAKE_STRINGRQ; + bVarInString = false; + bClassicVarInString = false; + } + else if ( cCurrChar == '#' ) { + state = SCE_CMAKE_COMMENT; + } + } + break; + } + + if ( state == SCE_CMAKE_COMMENT) { + styler.ColourTo(i,state); + } + else if ( state == SCE_CMAKE_STRINGDQ || state == SCE_CMAKE_STRINGLQ || state == SCE_CMAKE_STRINGRQ ) { + bool bIngoreNextDollarSign = false; + + if ( bVarInString && cCurrChar == '$' ) { + bVarInString = false; + bIngoreNextDollarSign = true; + } + else if ( bVarInString && cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' || cNextChar == '"' || cNextChar == '`' || cNextChar == '\'' ) ) { + styler.ColourTo( i+1, SCE_CMAKE_STRINGVAR); + bVarInString = false; + bIngoreNextDollarSign = false; + } + + else if ( bVarInString && !isCmakeChar(cNextChar) ) { + int nWordState = classifyWordCmake( styler.GetStartSegment(), i, keywordLists, styler); + if ( nWordState == SCE_CMAKE_VARIABLE ) + styler.ColourTo( i, SCE_CMAKE_STRINGVAR); + bVarInString = false; + } + // Covers "${TEST}..." + else if ( bClassicVarInString && cNextChar == '}' ) { + styler.ColourTo( i+1, SCE_CMAKE_STRINGVAR); + bClassicVarInString = false; + } + + // Start of var in string + if ( !bIngoreNextDollarSign && cCurrChar == '$' && cNextChar == '{' ) { + styler.ColourTo( i-1, state); + bClassicVarInString = true; + bVarInString = false; + } + else if ( !bIngoreNextDollarSign && cCurrChar == '$' ) { + styler.ColourTo( i-1, state); + bVarInString = true; + bClassicVarInString = false; + } + } + } + + // Colourise remaining document + styler.ColourTo(nLengthDoc-1,state); +} + +static void FoldCmakeDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) +{ + // No folding enabled, no reason to continue... + if ( styler.GetPropertyInt("fold") == 0 ) + return; + + bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) == 1; + + int lineCurrent = styler.GetLine(startPos); + unsigned int safeStartPos = styler.LineStart( lineCurrent ); + + bool bArg1 = true; + int nWordStart = -1; + + int levelCurrent = SC_FOLDLEVELBASE; + if (lineCurrent > 0) + levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; + int levelNext = levelCurrent; + + for (unsigned int i = safeStartPos; i < startPos + length; i++) { + char chCurr = styler.SafeGetCharAt(i); + + if ( bArg1 ) { + if ( nWordStart == -1 && (isCmakeLetter(chCurr)) ) { + nWordStart = i; + } + else if ( isCmakeLetter(chCurr) == false && nWordStart > -1 ) { + int newLevel = calculateFoldCmake( nWordStart, i-1, levelNext, styler, foldAtElse); + + if ( newLevel == levelNext ) { + if ( foldAtElse ) { + if ( CmakeNextLineHasElse(i, startPos + length, styler) ) + levelNext--; + } + } + else + levelNext = newLevel; + bArg1 = false; + } + } + + if ( chCurr == '\n' ) { + if ( bArg1 && foldAtElse) { + if ( CmakeNextLineHasElse(i, startPos + length, styler) ) + levelNext--; + } + + // If we are on a new line... + int levelUse = levelCurrent; + int lev = levelUse | levelNext << 16; + if (levelUse < levelNext ) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) + styler.SetLevel(lineCurrent, lev); + + lineCurrent++; + levelCurrent = levelNext; + bArg1 = true; // New line, lets look at first argument again + nWordStart = -1; + } + } + + int levelUse = levelCurrent; + int lev = levelUse | levelNext << 16; + if (levelUse < levelNext) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) + styler.SetLevel(lineCurrent, lev); +} + +static const char * const cmakeWordLists[] = { + "Commands", + "Parameters", + "UserDefined", + 0, + 0,}; + +LexerModule lmCmake(SCLEX_CMAKE, ColouriseCmakeDoc, "cmake", FoldCmakeDoc, cmakeWordLists); diff --git a/scintilla/src/LexConf.cxx b/scintilla/src/LexConf.cxx new file mode 100644 index 00000000..3325b341 --- /dev/null +++ b/scintilla/src/LexConf.cxx @@ -0,0 +1,184 @@ +// Scintilla source code edit control +/** @file LexConf.cxx + ** Lexer for Apache Configuration Files. + ** + ** First working version contributed by Ahmad Zawawi on October 28, 2000. + ** i created this lexer because i needed something pretty when dealing + ** when Apache Configuration files... + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +static void ColouriseConfDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) +{ + int state = SCE_CONF_DEFAULT; + char chNext = styler[startPos]; + int lengthDoc = startPos + length; + // create a buffer large enough to take the largest chunk... + char *buffer = new char[length]; + int bufferCount = 0; + + // this assumes that we have 2 keyword list in conf.properties + WordList &directives = *keywordLists[0]; + WordList ¶ms = *keywordLists[1]; + + // go through all provided text segment + // using the hand-written state machine shown below + styler.StartAt(startPos); + styler.StartSegment(startPos); + for (int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + i++; + continue; + } + switch(state) { + case SCE_CONF_DEFAULT: + if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') { + // whitespace is simply ignored here... + styler.ColourTo(i,SCE_CONF_DEFAULT); + break; + } else if( ch == '#' ) { + // signals the start of a comment... + state = SCE_CONF_COMMENT; + styler.ColourTo(i,SCE_CONF_COMMENT); + } else if( ch == '.' /*|| ch == '/'*/) { + // signals the start of a file... + state = SCE_CONF_EXTENSION; + styler.ColourTo(i,SCE_CONF_EXTENSION); + } else if( ch == '"') { + state = SCE_CONF_STRING; + styler.ColourTo(i,SCE_CONF_STRING); + } else if( ispunct(ch) ) { + // signals an operator... + // no state jump necessary for this + // simple case... + styler.ColourTo(i,SCE_CONF_OPERATOR); + } else if( isalpha(ch) ) { + // signals the start of an identifier + bufferCount = 0; + buffer[bufferCount++] = static_cast(tolower(ch)); + state = SCE_CONF_IDENTIFIER; + } else if( isdigit(ch) ) { + // signals the start of a number + bufferCount = 0; + buffer[bufferCount++] = ch; + //styler.ColourTo(i,SCE_CONF_NUMBER); + state = SCE_CONF_NUMBER; + } else { + // style it the default style.. + styler.ColourTo(i,SCE_CONF_DEFAULT); + } + break; + + case SCE_CONF_COMMENT: + // if we find a newline here, + // we simply go to default state + // else continue to work on it... + if( ch == '\n' || ch == '\r' ) { + state = SCE_CONF_DEFAULT; + } else { + styler.ColourTo(i,SCE_CONF_COMMENT); + } + break; + + case SCE_CONF_EXTENSION: + // if we find a non-alphanumeric char, + // we simply go to default state + // else we're still dealing with an extension... + if( isalnum(ch) || (ch == '_') || + (ch == '-') || (ch == '$') || + (ch == '/') || (ch == '.') || (ch == '*') ) + { + styler.ColourTo(i,SCE_CONF_EXTENSION); + } else { + state = SCE_CONF_DEFAULT; + chNext = styler[i--]; + } + break; + + case SCE_CONF_STRING: + // if we find the end of a string char, we simply go to default state + // else we're still dealing with an string... + if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') || (ch == '\n') || (ch == '\r') ) { + state = SCE_CONF_DEFAULT; + } + styler.ColourTo(i,SCE_CONF_STRING); + break; + + case SCE_CONF_IDENTIFIER: + // stay in CONF_IDENTIFIER state until we find a non-alphanumeric + if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') || (ch == '$') || (ch == '.') || (ch == '*')) { + buffer[bufferCount++] = static_cast(tolower(ch)); + } else { + state = SCE_CONF_DEFAULT; + buffer[bufferCount] = '\0'; + + // check if the buffer contains a keyword, and highlight it if it is a keyword... + if(directives.InList(buffer)) { + styler.ColourTo(i-1,SCE_CONF_DIRECTIVE ); + } else if(params.InList(buffer)) { + styler.ColourTo(i-1,SCE_CONF_PARAMETER ); + } else if(strchr(buffer,'/') || strchr(buffer,'.')) { + styler.ColourTo(i-1,SCE_CONF_EXTENSION); + } else { + styler.ColourTo(i-1,SCE_CONF_DEFAULT); + } + + // push back the faulty character + chNext = styler[i--]; + + } + break; + + case SCE_CONF_NUMBER: + // stay in CONF_NUMBER state until we find a non-numeric + if( isdigit(ch) || ch == '.') { + buffer[bufferCount++] = ch; + } else { + state = SCE_CONF_DEFAULT; + buffer[bufferCount] = '\0'; + + // Colourize here... + if( strchr(buffer,'.') ) { + // it is an IP address... + styler.ColourTo(i-1,SCE_CONF_IP); + } else { + // normal number + styler.ColourTo(i-1,SCE_CONF_NUMBER); + } + + // push back a character + chNext = styler[i--]; + } + break; + + } + } + delete []buffer; +} + +static const char * const confWordListDesc[] = { + "Directives", + "Parameters", + 0 +}; + +LexerModule lmConf(SCLEX_CONF, ColouriseConfDoc, "conf", 0, confWordListDesc); diff --git a/scintilla/src/LexCrontab.cxx b/scintilla/src/LexCrontab.cxx new file mode 100644 index 00000000..f04ff4b8 --- /dev/null +++ b/scintilla/src/LexCrontab.cxx @@ -0,0 +1,218 @@ +// Scintilla source code edit control +/** @file LexCrontab.cxx + ** Lexer to use with extended crontab files used by a powerful + ** Windows scheduler/event monitor/automation manager nnCron. + ** (http://nemtsev.eserv.ru/) + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +static void ColouriseNncrontabDoc(unsigned int startPos, int length, int, WordList +*keywordLists[], Accessor &styler) +{ + int state = SCE_NNCRONTAB_DEFAULT; + char chNext = styler[startPos]; + int lengthDoc = startPos + length; + // create a buffer large enough to take the largest chunk... + char *buffer = new char[length]; + int bufferCount = 0; + // used when highliting environment variables inside quoted string: + bool insideString = false; + + // this assumes that we have 3 keyword list in conf.properties + WordList §ion = *keywordLists[0]; + WordList &keyword = *keywordLists[1]; + WordList &modifier = *keywordLists[2]; + + // go through all provided text segment + // using the hand-written state machine shown below + styler.StartAt(startPos); + styler.StartSegment(startPos); + for (int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + i++; + continue; + } + switch(state) { + case SCE_NNCRONTAB_DEFAULT: + if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') { + // whitespace is simply ignored here... + styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT); + break; + } else if( ch == '#' && styler.SafeGetCharAt(i+1) == '(') { + // signals the start of a task... + state = SCE_NNCRONTAB_TASK; + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } + else if( ch == '\\' && (styler.SafeGetCharAt(i+1) == ' ' || + styler.SafeGetCharAt(i+1) == '\t')) { + // signals the start of an extended comment... + state = SCE_NNCRONTAB_COMMENT; + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } else if( ch == '#' ) { + // signals the start of a plain comment... + state = SCE_NNCRONTAB_COMMENT; + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } else if( ch == ')' && styler.SafeGetCharAt(i+1) == '#') { + // signals the end of a task... + state = SCE_NNCRONTAB_TASK; + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } else if( ch == '"') { + state = SCE_NNCRONTAB_STRING; + styler.ColourTo(i,SCE_NNCRONTAB_STRING); + } else if( ch == '%') { + // signals environment variables + state = SCE_NNCRONTAB_ENVIRONMENT; + styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT); + } else if( ch == '<' && styler.SafeGetCharAt(i+1) == '%') { + // signals environment variables + state = SCE_NNCRONTAB_ENVIRONMENT; + styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT); + } else if( ch == '*' ) { + // signals an asterisk + // no state jump necessary for this simple case... + styler.ColourTo(i,SCE_NNCRONTAB_ASTERISK); + } else if( isalpha(ch) || ch == '<' ) { + // signals the start of an identifier + bufferCount = 0; + buffer[bufferCount++] = ch; + state = SCE_NNCRONTAB_IDENTIFIER; + } else if( isdigit(ch) ) { + // signals the start of a number + bufferCount = 0; + buffer[bufferCount++] = ch; + state = SCE_NNCRONTAB_NUMBER; + } else { + // style it the default style.. + styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT); + } + break; + + case SCE_NNCRONTAB_COMMENT: + // if we find a newline here, + // we simply go to default state + // else continue to work on it... + if( ch == '\n' || ch == '\r' ) { + state = SCE_NNCRONTAB_DEFAULT; + } else { + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } + break; + + case SCE_NNCRONTAB_TASK: + // if we find a newline here, + // we simply go to default state + // else continue to work on it... + if( ch == '\n' || ch == '\r' ) { + state = SCE_NNCRONTAB_DEFAULT; + } else { + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } + break; + + case SCE_NNCRONTAB_STRING: + if( ch == '%' ) { + state = SCE_NNCRONTAB_ENVIRONMENT; + insideString = true; + styler.ColourTo(i-1,SCE_NNCRONTAB_STRING); + break; + } + // if we find the end of a string char, we simply go to default state + // else we're still dealing with an string... + if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') || + (ch == '\n') || (ch == '\r') ) { + state = SCE_NNCRONTAB_DEFAULT; + } + styler.ColourTo(i,SCE_NNCRONTAB_STRING); + break; + + case SCE_NNCRONTAB_ENVIRONMENT: + // if we find the end of a string char, we simply go to default state + // else we're still dealing with an string... + if( ch == '%' && insideString ) { + state = SCE_NNCRONTAB_STRING; + insideString = false; + break; + } + if( (ch == '%' && styler.SafeGetCharAt(i-1)!='\\') + || (ch == '\n') || (ch == '\r') || (ch == '>') ) { + state = SCE_NNCRONTAB_DEFAULT; + styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT); + break; + } + styler.ColourTo(i+1,SCE_NNCRONTAB_ENVIRONMENT); + break; + + case SCE_NNCRONTAB_IDENTIFIER: + // stay in CONF_IDENTIFIER state until we find a non-alphanumeric + if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') || + (ch == '$') || (ch == '.') || (ch == '<') || (ch == '>') || + (ch == '@') ) { + buffer[bufferCount++] = ch; + } else { + state = SCE_NNCRONTAB_DEFAULT; + buffer[bufferCount] = '\0'; + + // check if the buffer contains a keyword, + // and highlight it if it is a keyword... + if(section.InList(buffer)) { + styler.ColourTo(i,SCE_NNCRONTAB_SECTION ); + } else if(keyword.InList(buffer)) { + styler.ColourTo(i-1,SCE_NNCRONTAB_KEYWORD ); + } // else if(strchr(buffer,'/') || strchr(buffer,'.')) { + // styler.ColourTo(i-1,SCE_NNCRONTAB_EXTENSION); + // } + else if(modifier.InList(buffer)) { + styler.ColourTo(i-1,SCE_NNCRONTAB_MODIFIER ); + } else { + styler.ColourTo(i-1,SCE_NNCRONTAB_DEFAULT); + } + // push back the faulty character + chNext = styler[i--]; + } + break; + + case SCE_NNCRONTAB_NUMBER: + // stay in CONF_NUMBER state until we find a non-numeric + if( isdigit(ch) /* || ch == '.' */ ) { + buffer[bufferCount++] = ch; + } else { + state = SCE_NNCRONTAB_DEFAULT; + buffer[bufferCount] = '\0'; + // Colourize here... (normal number) + styler.ColourTo(i-1,SCE_NNCRONTAB_NUMBER); + // push back a character + chNext = styler[i--]; + } + break; + } + } + delete []buffer; +} + +static const char * const cronWordListDesc[] = { + "Section keywords and Forth words", + "nnCrontab keywords", + "Modifiers", + 0 +}; + +LexerModule lmNncrontab(SCLEX_NNCRONTAB, ColouriseNncrontabDoc, "nncrontab", 0, cronWordListDesc); diff --git a/scintilla/src/LexCsound.cxx b/scintilla/src/LexCsound.cxx new file mode 100644 index 00000000..67656988 --- /dev/null +++ b/scintilla/src/LexCsound.cxx @@ -0,0 +1,207 @@ +// Scintilla source code edit control +/** @file LexCsound.cxx + ** Lexer for Csound (Orchestra & Score) + ** Written by Georg Ritter - + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || + ch == '_' || ch == '?'); +} + +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' || + ch == '%' || ch == '@' || ch == '$' || ch == '?'); +} + +static inline bool IsCsoundOperator(char ch) { + if (isalnum(ch)) + return false; + // '.' left out as it is used to make up numbers + if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || ch == '^' || + ch == '[' || ch == ']' || ch == '<' || ch == '&' || + ch == '>' || ch == ',' || ch == '|' || ch == '~' || + ch == '%' || ch == ':') + return true; + return false; +} + +static void ColouriseCsoundDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + WordList &opcode = *keywordlists[0]; + WordList &headerStmt = *keywordlists[1]; + WordList &otherKeyword = *keywordlists[2]; + + // Do not leak onto next line + if (initStyle == SCE_CSOUND_STRINGEOL) + initStyle = SCE_CSOUND_DEFAULT; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) + { + // Handle line continuation generically. + if (sc.ch == '\\') { + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } + continue; + } + } + + // Determine if the current state should terminate. + if (sc.state == SCE_CSOUND_OPERATOR) { + if (!IsCsoundOperator(static_cast(sc.ch))) { + sc.SetState(SCE_CSOUND_DEFAULT); + } + }else if (sc.state == SCE_CSOUND_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_CSOUND_DEFAULT); + } + } else if (sc.state == SCE_CSOUND_IDENTIFIER) { + if (!IsAWordChar(sc.ch) ) { + char s[100]; + sc.GetCurrent(s, sizeof(s)); + + if (opcode.InList(s)) { + sc.ChangeState(SCE_CSOUND_OPCODE); + } else if (headerStmt.InList(s)) { + sc.ChangeState(SCE_CSOUND_HEADERSTMT); + } else if (otherKeyword.InList(s)) { + sc.ChangeState(SCE_CSOUND_USERKEYWORD); + } else if (s[0] == 'p') { + sc.ChangeState(SCE_CSOUND_PARAM); + } else if (s[0] == 'a') { + sc.ChangeState(SCE_CSOUND_ARATE_VAR); + } else if (s[0] == 'k') { + sc.ChangeState(SCE_CSOUND_KRATE_VAR); + } else if (s[0] == 'i') { // covers both i-rate variables and i-statements + sc.ChangeState(SCE_CSOUND_IRATE_VAR); + } else if (s[0] == 'g') { + sc.ChangeState(SCE_CSOUND_GLOBAL_VAR); + } + sc.SetState(SCE_CSOUND_DEFAULT); + } + } + else if (sc.state == SCE_CSOUND_COMMENT ) { + if (sc.atLineEnd) { + sc.SetState(SCE_CSOUND_DEFAULT); + } + } + else if ((sc.state == SCE_CSOUND_ARATE_VAR) || + (sc.state == SCE_CSOUND_KRATE_VAR) || + (sc.state == SCE_CSOUND_IRATE_VAR)) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_CSOUND_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_CSOUND_DEFAULT) { + if (sc.ch == ';'){ + sc.SetState(SCE_CSOUND_COMMENT); + } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) { + sc.SetState(SCE_CSOUND_NUMBER); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_CSOUND_IDENTIFIER); + } else if (IsCsoundOperator(static_cast(sc.ch))) { + sc.SetState(SCE_CSOUND_OPERATOR); + } else if (sc.ch == 'p') { + sc.SetState(SCE_CSOUND_PARAM); + } else if (sc.ch == 'a') { + sc.SetState(SCE_CSOUND_ARATE_VAR); + } else if (sc.ch == 'k') { + sc.SetState(SCE_CSOUND_KRATE_VAR); + } else if (sc.ch == 'i') { // covers both i-rate variables and i-statements + sc.SetState(SCE_CSOUND_IRATE_VAR); + } else if (sc.ch == 'g') { + sc.SetState(SCE_CSOUND_GLOBAL_VAR); + } + } + } + sc.Complete(); +} + +static void FoldCsoundInstruments(unsigned int startPos, int length, int /* initStyle */, WordList *[], + Accessor &styler) { + unsigned int lengthDoc = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int stylePrev = 0; + int styleNext = styler.StyleAt(startPos); + for (unsigned int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if ((stylePrev != SCE_CSOUND_OPCODE) && (style == SCE_CSOUND_OPCODE)) { + char s[20]; + unsigned int j = 0; + while ((j < (sizeof(s) - 1)) && (iswordchar(styler[i + j]))) { + s[j] = styler[i + j]; + j++; + } + s[j] = '\0'; + + if (strcmp(s, "instr") == 0) + levelCurrent++; + if (strcmp(s, "endin") == 0) + levelCurrent--; + } + + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + stylePrev = style; + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + + +static const char * const csoundWordListDesc[] = { + "Opcodes", + "Header Statements", + "User keywords", + 0 +}; + +LexerModule lmCsound(SCLEX_CSOUND, ColouriseCsoundDoc, "csound", FoldCsoundInstruments, csoundWordListDesc); diff --git a/scintilla/src/LexD.cxx b/scintilla/src/LexD.cxx new file mode 100644 index 00000000..994ce9da --- /dev/null +++ b/scintilla/src/LexD.cxx @@ -0,0 +1,354 @@ +/** @file LexD.cxx + ** Lexer for D. + ** + ** Copyright (c) 2006 by Waldemar Augustyn + **/ +// Copyright 1998-2005 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +/*/ Nested comments require keeping the value of the nesting level for every + position in the document. But since scintilla always styles line by line, + we only need to store one value per line. The non-negative number indicates + nesting level at the end of the line. +/*/ + +// We use custom qualifiers since it is not clear what D allows. + +static bool IsWordStart(int ch) { + return isascii(ch) && (isalpha(ch) || ch == '_'); +} + +static bool IsWord(int ch) { + return isascii(ch) && (isalnum(ch) || ch == '_'); +} + +static bool IsDoxygen(int ch) { + if (isascii(ch) && islower(ch)) + return true; + if (ch == '$' || ch == '@' || ch == '\\' || + ch == '&' || ch == '#' || ch == '<' || ch == '>' || + ch == '{' || ch == '}' || ch == '[' || ch == ']') + return true; + return false; +} + + +static void ColouriseDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler, bool caseSensitive) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + + int styleBeforeDCKeyword = SCE_D_DEFAULT; + + StyleContext sc(startPos, length, initStyle, styler); + + int curLine = styler.GetLine(startPos); + int curNcLevel = curLine > 0? styler.GetLineState(curLine-1): 0; + + for (; sc.More(); sc.Forward()) { + + if (sc.atLineStart) { + if (sc.state == SCE_D_STRING) { + // Prevent SCE_D_STRINGEOL from leaking back to previous line which + // ends with a line continuation by locking in the state upto this position. + sc.SetState(SCE_D_STRING); + } + curLine = styler.GetLine(sc.currentPos); + styler.SetLineState(curLine, curNcLevel); + } + + // Handle line continuation generically. + if (sc.ch == '\\') { + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } + continue; + } + } + + // Determine if the current state should terminate. + switch (sc.state) { + case SCE_D_OPERATOR: + sc.SetState(SCE_D_DEFAULT); + break; + case SCE_D_NUMBER: + // We accept almost anything because of hex. and number suffixes + if (!IsWord(sc.ch) && sc.ch != '.') { + sc.SetState(SCE_D_DEFAULT); + } + break; + case SCE_D_IDENTIFIER: + if (!IsWord(sc.ch)) { + char s[1000]; + if (caseSensitive) { + sc.GetCurrent(s, sizeof(s)); + } else { + sc.GetCurrentLowered(s, sizeof(s)); + } + if (keywords.InList(s)) { + sc.ChangeState(SCE_D_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_D_WORD2); + } else if (keywords4.InList(s)) { + sc.ChangeState(SCE_D_TYPEDEF); + } + sc.SetState(SCE_D_DEFAULT); + } + break; + case SCE_D_COMMENT: + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_D_DEFAULT); + } + break; + case SCE_D_COMMENTDOC: + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_D_DEFAULT); + } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support + // Verify that we have the conditions to mark a comment-doc-keyword + if ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) { + styleBeforeDCKeyword = SCE_D_COMMENTDOC; + sc.SetState(SCE_D_COMMENTDOCKEYWORD); + } + } + break; + case SCE_D_COMMENTLINE: + if (sc.atLineStart) { + sc.SetState(SCE_D_DEFAULT); + } + break; + case SCE_D_COMMENTLINEDOC: + if (sc.atLineStart) { + sc.SetState(SCE_D_DEFAULT); + } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support + // Verify that we have the conditions to mark a comment-doc-keyword + if ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) { + styleBeforeDCKeyword = SCE_D_COMMENTLINEDOC; + sc.SetState(SCE_D_COMMENTDOCKEYWORD); + } + } + break; + case SCE_D_COMMENTDOCKEYWORD: + if ((styleBeforeDCKeyword == SCE_D_COMMENTDOC) && sc.Match('*', '/')) { + sc.ChangeState(SCE_D_COMMENTDOCKEYWORDERROR); + sc.Forward(); + sc.ForwardSetState(SCE_D_DEFAULT); + } else if (!IsDoxygen(sc.ch)) { + char s[100]; + if (caseSensitive) { + sc.GetCurrent(s, sizeof(s)); + } else { + sc.GetCurrentLowered(s, sizeof(s)); + } + if (!IsASpace(sc.ch) || !keywords3.InList(s + 1)) { + sc.ChangeState(SCE_D_COMMENTDOCKEYWORDERROR); + } + sc.SetState(styleBeforeDCKeyword); + } + break; + case SCE_D_COMMENTNESTED: + if (sc.Match('+', '/')) { + if (curNcLevel > 0) + curNcLevel -= 1; + curLine = styler.GetLine(sc.currentPos); + styler.SetLineState(curLine, curNcLevel); + sc.Forward(); + if (curNcLevel == 0) { + sc.ForwardSetState(SCE_D_DEFAULT); + } + } + else if (sc.Match('/','+')) { + curNcLevel += 1; + curLine = styler.GetLine(sc.currentPos); + styler.SetLineState(curLine, curNcLevel); + sc.Forward(); + } + break; + case SCE_D_STRING: + if (sc.atLineEnd) { + sc.ChangeState(SCE_D_STRINGEOL); + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_D_DEFAULT); + } + break; + case SCE_D_CHARACTER: + if (sc.atLineEnd) { + sc.ChangeState(SCE_D_STRINGEOL); + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\'') { + sc.ForwardSetState(SCE_D_DEFAULT); + } + break; + case SCE_D_STRINGEOL: + if (sc.atLineStart) { + sc.SetState(SCE_D_DEFAULT); + } + break; + } + + // Determine if a new state should be entered. + if (sc.state == SCE_D_DEFAULT) { + if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_D_NUMBER); + } else if (IsWordStart(sc.ch)) { + sc.SetState(SCE_D_IDENTIFIER); + } else if (sc.Match('/','+')) { + curNcLevel += 1; + curLine = styler.GetLine(sc.currentPos); + styler.SetLineState(curLine, curNcLevel); + sc.SetState(SCE_D_COMMENTNESTED); + sc.Forward(); + } else if (sc.Match('/', '*')) { + if (sc.Match("/**") || sc.Match("/*!")) { // Support of Qt/Doxygen doc. style + sc.SetState(SCE_D_COMMENTDOC); + } else { + sc.SetState(SCE_D_COMMENT); + } + sc.Forward(); // Eat the * so it isn't used for the end of the comment + } else if (sc.Match('/', '/')) { + if ((sc.Match("///") && !sc.Match("////")) || sc.Match("//!")) + // Support of Qt/Doxygen doc. style + sc.SetState(SCE_D_COMMENTLINEDOC); + else + sc.SetState(SCE_D_COMMENTLINE); + } else if (sc.ch == '\"') { + sc.SetState(SCE_D_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_D_CHARACTER); + } else if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_D_OPERATOR); + } + } + } + sc.Complete(); +} + +static bool IsStreamCommentStyle(int style) { + return style == SCE_D_COMMENT || + style == SCE_D_COMMENTDOC || + style == SCE_D_COMMENTDOCKEYWORD || + style == SCE_D_COMMENTDOCKEYWORDERROR; +} + +// Store both the current line's fold level and the next lines in the +// level store to make it easy to pick up with each increment +// and to make it possible to fiddle the current level for "} else {". +static void FoldDoc(unsigned int startPos, int length, int initStyle, Accessor &styler) { + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + bool foldAtElse = styler.GetPropertyInt("lexer.d.fold.at.else", + styler.GetPropertyInt("fold.at.else", 0)) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelCurrent = SC_FOLDLEVELBASE; + if (lineCurrent > 0) + levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; + int levelMinCurrent = levelCurrent; + int levelNext = levelCurrent; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (foldComment && IsStreamCommentStyle(style)) { + if (!IsStreamCommentStyle(stylePrev)) { + levelNext++; + } else if (!IsStreamCommentStyle(styleNext) && !atEOL) { + // Comments don't end at end of line and the next character may be unstyled. + levelNext--; + } + } + if (style == SCE_D_OPERATOR) { + if (ch == '{') { + // Measure the minimum before a '{' to allow + // folding on "} else {" + if (levelMinCurrent > levelNext) { + levelMinCurrent = levelNext; + } + levelNext++; + } else if (ch == '}') { + levelNext--; + } + } + if (atEOL) { + if (foldComment) { // Handle nested comments + int nc; + nc = styler.GetLineState(lineCurrent); + nc -= lineCurrent>0? styler.GetLineState(lineCurrent-1): 0; + levelNext += nc; + } + int levelUse = levelCurrent; + if (foldAtElse) { + levelUse = levelMinCurrent; + } + int lev = levelUse | levelNext << 16; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if (levelUse < levelNext) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelCurrent = levelNext; + levelMinCurrent = levelCurrent; + visibleChars = 0; + } + if (!IsASpace(ch)) + visibleChars++; + } +} + +static void FoldDDoc(unsigned int startPos, int length, int initStyle, + WordList *[], Accessor &styler) { + FoldDoc(startPos, length, initStyle, styler); +} + +static const char * const dWordLists[] = { + "Primary keywords and identifiers", + "Secondary keywords and identifiers", + "Documentation comment keywords", + "Type definitions and aliases", + 0, + }; + +static void ColouriseDDoc(unsigned int startPos, int length, + int initStyle, WordList *keywordlists[], Accessor &styler) { + ColouriseDoc(startPos, length, initStyle, keywordlists, styler, true); +} + +LexerModule lmD(SCLEX_D, ColouriseDDoc, "d", FoldDDoc, dWordLists); diff --git a/scintilla/src/LexEScript.cxx b/scintilla/src/LexEScript.cxx new file mode 100644 index 00000000..9de3a3ea --- /dev/null +++ b/scintilla/src/LexEScript.cxx @@ -0,0 +1,270 @@ +// Scintilla source code edit control +/** @file LexESCRIPT.cxx + ** Lexer for ESCRIPT + **/ +// Copyright 2003 by Patrizio Bekerle (patrizio@bekerle.com) + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + + + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); +} + +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + + + +static void ColouriseESCRIPTDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + + // Do not leak onto next line + /*if (initStyle == SCE_ESCRIPT_STRINGEOL) + initStyle = SCE_ESCRIPT_DEFAULT;*/ + + StyleContext sc(startPos, length, initStyle, styler); + + bool caseSensitive = styler.GetPropertyInt("escript.case.sensitive", 0) != 0; + + for (; sc.More(); sc.Forward()) { + + /*if (sc.atLineStart && (sc.state == SCE_ESCRIPT_STRING)) { + // Prevent SCE_ESCRIPT_STRINGEOL from leaking back to previous line + sc.SetState(SCE_ESCRIPT_STRING); + }*/ + + // Handle line continuation generically. + if (sc.ch == '\\') { + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } + continue; + } + } + + // Determine if the current state should terminate. + if (sc.state == SCE_ESCRIPT_OPERATOR || sc.state == SCE_ESCRIPT_BRACE) { + sc.SetState(SCE_ESCRIPT_DEFAULT); + } else if (sc.state == SCE_ESCRIPT_NUMBER) { + if (!IsADigit(sc.ch) || sc.ch != '.') { + sc.SetState(SCE_ESCRIPT_DEFAULT); + } + } else if (sc.state == SCE_ESCRIPT_IDENTIFIER) { + if (!IsAWordChar(sc.ch) || (sc.ch == '.')) { + char s[100]; + if (caseSensitive) { + sc.GetCurrent(s, sizeof(s)); + } else { + sc.GetCurrentLowered(s, sizeof(s)); + } + +// sc.GetCurrentLowered(s, sizeof(s)); + + if (keywords.InList(s)) { + sc.ChangeState(SCE_ESCRIPT_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_ESCRIPT_WORD2); + } else if (keywords3.InList(s)) { + sc.ChangeState(SCE_ESCRIPT_WORD3); + // sc.state = SCE_ESCRIPT_IDENTIFIER; + } + sc.SetState(SCE_ESCRIPT_DEFAULT); + } + } else if (sc.state == SCE_ESCRIPT_COMMENT) { + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_ESCRIPT_DEFAULT); + } + } else if (sc.state == SCE_ESCRIPT_COMMENTDOC) { + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_ESCRIPT_DEFAULT); + } + } else if (sc.state == SCE_ESCRIPT_COMMENTLINE) { + if (sc.atLineEnd) { + sc.SetState(SCE_ESCRIPT_DEFAULT); + } + } else if (sc.state == SCE_ESCRIPT_STRING) { + if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_ESCRIPT_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_ESCRIPT_DEFAULT) { + if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_ESCRIPT_NUMBER); + } else if (IsAWordStart(sc.ch) || (sc.ch == '#')) { + sc.SetState(SCE_ESCRIPT_IDENTIFIER); + } else if (sc.Match('/', '*')) { + sc.SetState(SCE_ESCRIPT_COMMENT); + sc.Forward(); // Eat the * so it isn't used for the end of the comment + } else if (sc.Match('/', '/')) { + sc.SetState(SCE_ESCRIPT_COMMENTLINE); + } else if (sc.ch == '\"') { + sc.SetState(SCE_ESCRIPT_STRING); + //} else if (isoperator(static_cast(sc.ch))) { + } else if (sc.ch == '+' || sc.ch == '-' || sc.ch == '*' || sc.ch == '/' || sc.ch == '=' || sc.ch == '<' || sc.ch == '>' || sc.ch == '&' || sc.ch == '|' || sc.ch == '!' || sc.ch == '?' || sc.ch == ':') { + sc.SetState(SCE_ESCRIPT_OPERATOR); + } else if (sc.ch == '{' || sc.ch == '}') { + sc.SetState(SCE_ESCRIPT_BRACE); + } + } + + } + sc.Complete(); +} + + +static int classifyFoldPointESCRIPT(const char* s, const char* prevWord) { + int lev = 0; + if (strcmp(prevWord, "end") == 0) return lev; + if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0) + return -1; + + if (strcmp(s, "for") == 0 || strcmp(s, "foreach") == 0 + || strcmp(s, "program") == 0 || strcmp(s, "function") == 0 + || strcmp(s, "while") == 0 || strcmp(s, "case") == 0 + || strcmp(s, "if") == 0 ) { + lev = 1; + } else if ( strcmp(s, "endfor") == 0 || strcmp(s, "endforeach") == 0 + || strcmp(s, "endprogram") == 0 || strcmp(s, "endfunction") == 0 + || strcmp(s, "endwhile") == 0 || strcmp(s, "endcase") == 0 + || strcmp(s, "endif") == 0 ) { + lev = -1; + } + + return lev; +} + + +static bool IsStreamCommentStyle(int style) { + return style == SCE_ESCRIPT_COMMENT || + style == SCE_ESCRIPT_COMMENTDOC || + style == SCE_ESCRIPT_COMMENTLINE; +} + +static void FoldESCRIPTDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { + //~ bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + // Do not know how to fold the comment at the moment. + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + bool foldComment = true; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + + int lastStart = 0; + char prevWord[32] = ""; + + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + + + if (foldComment && IsStreamCommentStyle(style)) { + if (!IsStreamCommentStyle(stylePrev)) { + levelCurrent++; + } else if (!IsStreamCommentStyle(styleNext) && !atEOL) { + // Comments don't end at end of line and the next character may be unstyled. + levelCurrent--; + } + } + + if (foldComment && (style == SCE_ESCRIPT_COMMENTLINE)) { + if ((ch == '/') && (chNext == '/')) { + char chNext2 = styler.SafeGetCharAt(i + 2); + if (chNext2 == '{') { + levelCurrent++; + } else if (chNext2 == '}') { + levelCurrent--; + } + } + } + + if (stylePrev == SCE_ESCRIPT_DEFAULT && style == SCE_ESCRIPT_WORD3) + { + // Store last word start point. + lastStart = i; + } + + if (style == SCE_ESCRIPT_WORD3) { + if(iswordchar(ch) && !iswordchar(chNext)) { + char s[32]; + unsigned int j; + for(j = 0; ( j < 31 ) && ( j < i-lastStart+1 ); j++) { + s[j] = static_cast(tolower(styler[lastStart + j])); + } + s[j] = '\0'; + levelCurrent += classifyFoldPointESCRIPT(s, prevWord); + strcpy(prevWord, s); + } + } + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + strcpy(prevWord, ""); + } + + if (!isspacechar(ch)) + visibleChars++; + } + + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + + + +static const char * const ESCRIPTWordLists[] = { + "Primary keywords and identifiers", + "Intrinsic functions", + "Extended and user defined functions", + 0, +}; + +LexerModule lmESCRIPT(SCLEX_ESCRIPT, ColouriseESCRIPTDoc, "escript", FoldESCRIPTDoc, ESCRIPTWordLists); diff --git a/scintilla/src/LexEiffel.cxx b/scintilla/src/LexEiffel.cxx new file mode 100644 index 00000000..6bc8b16a --- /dev/null +++ b/scintilla/src/LexEiffel.cxx @@ -0,0 +1,234 @@ +// Scintilla source code edit control +/** @file LexEiffel.cxx + ** Lexer for Eiffel. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +static inline bool isEiffelOperator(unsigned int ch) { + // '.' left out as it is used to make up numbers + return ch == '*' || ch == '/' || ch == '\\' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || + ch == '{' || ch == '}' || ch == '~' || + ch == '[' || ch == ']' || ch == ';' || + ch == '<' || ch == '>' || ch == ',' || + ch == '.' || ch == '^' || ch == '%' || ch == ':' || + ch == '!' || ch == '@' || ch == '?'; +} + +static inline bool IsAWordChar(unsigned int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +static inline bool IsAWordStart(unsigned int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +static void ColouriseEiffelDoc(unsigned int startPos, + int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + if (sc.state == SCE_EIFFEL_STRINGEOL) { + if (sc.ch != '\r' && sc.ch != '\n') { + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } else if (sc.state == SCE_EIFFEL_OPERATOR) { + sc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_WORD) { + if (!IsAWordChar(sc.ch)) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + if (!keywords.InList(s)) { + sc.ChangeState(SCE_EIFFEL_IDENTIFIER); + } + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } else if (sc.state == SCE_EIFFEL_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } else if (sc.state == SCE_EIFFEL_COMMENTLINE) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } else if (sc.state == SCE_EIFFEL_STRING) { + if (sc.ch == '%') { + sc.Forward(); + } else if (sc.ch == '\"') { + sc.Forward(); + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } else if (sc.state == SCE_EIFFEL_CHARACTER) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_EIFFEL_STRINGEOL); + } else if (sc.ch == '%') { + sc.Forward(); + } else if (sc.ch == '\'') { + sc.Forward(); + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } + + if (sc.state == SCE_EIFFEL_DEFAULT) { + if (sc.ch == '-' && sc.chNext == '-') { + sc.SetState(SCE_EIFFEL_COMMENTLINE); + } else if (sc.ch == '\"') { + sc.SetState(SCE_EIFFEL_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_EIFFEL_CHARACTER); + } else if (IsADigit(sc.ch) || (sc.ch == '.')) { + sc.SetState(SCE_EIFFEL_NUMBER); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_EIFFEL_WORD); + } else if (isEiffelOperator(sc.ch)) { + sc.SetState(SCE_EIFFEL_OPERATOR); + } + } + } + sc.Complete(); +} + +static bool IsEiffelComment(Accessor &styler, int pos, int len) { + return len>1 && styler[pos]=='-' && styler[pos+1]=='-'; +} + +static void FoldEiffelDocIndent(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + int lengthDoc = startPos + length; + + // Backtrack to previous line in case need to fix its fold status + int lineCurrent = styler.GetLine(startPos); + if (startPos > 0) { + if (lineCurrent > 0) { + lineCurrent--; + startPos = styler.LineStart(lineCurrent); + } + } + int spaceFlags = 0; + int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsEiffelComment); + char chNext = styler[startPos]; + for (int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) { + int lev = indentCurrent; + int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsEiffelComment); + if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) { + // Only non whitespace lines can be headers + if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) { + lev |= SC_FOLDLEVELHEADERFLAG; + } else if (indentNext & SC_FOLDLEVELWHITEFLAG) { + // Line after is blank so check the next - maybe should continue further? + int spaceFlags2 = 0; + int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsEiffelComment); + if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) { + lev |= SC_FOLDLEVELHEADERFLAG; + } + } + } + indentCurrent = indentNext; + styler.SetLevel(lineCurrent, lev); + lineCurrent++; + } + } +} + +static void FoldEiffelDocKeyWords(unsigned int startPos, int length, int /* initStyle */, WordList *[], + Accessor &styler) { + unsigned int lengthDoc = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int stylePrev = 0; + int styleNext = styler.StyleAt(startPos); + // lastDeferred should be determined by looking back to last keyword in case + // the "deferred" is on a line before "class" + bool lastDeferred = false; + for (unsigned int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if ((stylePrev != SCE_EIFFEL_WORD) && (style == SCE_EIFFEL_WORD)) { + char s[20]; + unsigned int j = 0; + while ((j < (sizeof(s) - 1)) && (iswordchar(styler[i + j]))) { + s[j] = styler[i + j]; + j++; + } + s[j] = '\0'; + + if ( + (strcmp(s, "check") == 0) || + (strcmp(s, "debug") == 0) || + (strcmp(s, "deferred") == 0) || + (strcmp(s, "do") == 0) || + (strcmp(s, "from") == 0) || + (strcmp(s, "if") == 0) || + (strcmp(s, "inspect") == 0) || + (strcmp(s, "once") == 0) + ) + levelCurrent++; + if (!lastDeferred && (strcmp(s, "class") == 0)) + levelCurrent++; + if (strcmp(s, "end") == 0) + levelCurrent--; + lastDeferred = strcmp(s, "deferred") == 0; + } + + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + stylePrev = style; + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +static const char * const eiffelWordListDesc[] = { + "Keywords", + 0 +}; + +LexerModule lmEiffel(SCLEX_EIFFEL, ColouriseEiffelDoc, "eiffel", FoldEiffelDocIndent, eiffelWordListDesc); +LexerModule lmEiffelkw(SCLEX_EIFFELKW, ColouriseEiffelDoc, "eiffelkw", FoldEiffelDocKeyWords, eiffelWordListDesc); diff --git a/scintilla/src/LexErlang.cxx b/scintilla/src/LexErlang.cxx new file mode 100644 index 00000000..b75a766e --- /dev/null +++ b/scintilla/src/LexErlang.cxx @@ -0,0 +1,522 @@ +// Scintilla source code edit control +/** @file LexErlang.cxx + ** Lexer for Erlang. + ** Written by Peter-Henry Mander, based on Matlab lexer by José Fonseca + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +/* + TODO: + o _Param should be a new lexical type +*/ + +static int is_radix(int radix, int ch) { + int digit; + if ( 16 < radix || 2 > radix ) { + return 0; + } + if ( isdigit(ch) ) { + digit = ch - '0'; + } else if ( isxdigit(ch) ) { + digit = toupper(ch) - 'A' + 10; + } else { + return 0; + } + if ( digit < radix ) { + return 1; + } else { + return 0; + } +} + +typedef enum { + STATE_NULL, + ATOM_UNQUOTED, + ATOM_QUOTED, + ATOM_FUN_NAME, + NODE_NAME_UNQUOTED, + NODE_NAME_QUOTED, + MACRO_START, + MACRO_UNQUOTED, + MACRO_QUOTED, + RECORD_START, + RECORD_UNQUOTED, + RECORD_QUOTED, + NUMERAL_START, + NUMERAL_SIGNED, + NUMERAL_RADIX_LITERAL, + NUMERAL_SPECULATIVE_MANTISSA, + NUMERAL_FLOAT_MANTISSA, + NUMERAL_FLOAT_EXPONENT, + NUMERAL_FLOAT_SIGNED_EXPONENT, + PARSE_ERROR +} atom_parse_state_t; + +static void ColouriseErlangDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + + styler.StartAt(startPos); + + StyleContext sc(startPos, length, initStyle, styler); + atom_parse_state_t parse_state = STATE_NULL; + int radix_digits = 0; + int exponent_digits = 0; + for (; sc.More(); sc.Forward()) { + if ( STATE_NULL != parse_state ) { + switch (parse_state) { + case STATE_NULL: + sc.SetState(SCE_ERLANG_DEFAULT); + break; + case ATOM_UNQUOTED: + if ( '@' == sc.ch ){ + parse_state = NODE_NAME_UNQUOTED; + } else if ( !isalnum(sc.ch) && sc.ch != '_' ) { + char s[100]; + sc.GetCurrent(s, sizeof(s)); + if (keywords.InList(s)) { + sc.ChangeState(SCE_ERLANG_KEYWORD); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else { + if ( '/' == sc.ch ) { + parse_state = ATOM_FUN_NAME; + } else { + sc.ChangeState(SCE_ERLANG_ATOM); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } + } + break; + case ATOM_QUOTED: + if ( '@' == sc.ch ){ + parse_state = NODE_NAME_QUOTED; + } else if ( '\'' == sc.ch && '\\' != sc.chPrev ) { + sc.ChangeState(SCE_ERLANG_ATOM); + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case ATOM_FUN_NAME: + if ( !isdigit(sc.ch) ) { + sc.ChangeState(SCE_ERLANG_FUNCTION_NAME); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case NODE_NAME_QUOTED: + if ( '@' == sc.ch ) { + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else if ( '\'' == sc.ch && '\\' != sc.chPrev ) { + sc.ChangeState(SCE_ERLANG_NODE_NAME); + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case NODE_NAME_UNQUOTED: + if ( '@' == sc.ch ) { + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else if ( !isalnum(sc.ch) && sc.ch != '_' ) { + sc.ChangeState(SCE_ERLANG_NODE_NAME); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case RECORD_START: + if ( '\'' == sc.ch ) { + parse_state = RECORD_QUOTED; + } else if (isalpha(sc.ch) && islower(sc.ch)) { + parse_state = RECORD_UNQUOTED; + } else { // error + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case RECORD_QUOTED: + if ( '\'' == sc.ch && '\\' != sc.chPrev ) { + sc.ChangeState(SCE_ERLANG_RECORD); + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case RECORD_UNQUOTED: + if ( !isalpha(sc.ch) && '_' != sc.ch ) { + sc.ChangeState(SCE_ERLANG_RECORD); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case MACRO_START: + if ( '\'' == sc.ch ) { + parse_state = MACRO_QUOTED; + } else if (isalpha(sc.ch)) { + parse_state = MACRO_UNQUOTED; + } else { // error + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case MACRO_UNQUOTED: + if ( !isalpha(sc.ch) && '_' != sc.ch ) { + sc.ChangeState(SCE_ERLANG_MACRO); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case MACRO_QUOTED: + if ( '\'' == sc.ch && '\\' != sc.chPrev ) { + sc.ChangeState(SCE_ERLANG_MACRO); + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case NUMERAL_START: + if ( isdigit(sc.ch) ) { + radix_digits *= 10; + radix_digits += sc.ch - '0'; // Assuming ASCII here! + } else if ( '#' == sc.ch ) { + if ( 2 > radix_digits || 16 < radix_digits) { + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else { + parse_state = NUMERAL_RADIX_LITERAL; + } + } else if ( '.' == sc.ch && isdigit(sc.chNext)) { + radix_digits = 0; + parse_state = NUMERAL_FLOAT_MANTISSA; + } else if ( 'e' == sc.ch || 'E' == sc.ch ) { + exponent_digits = 0; + parse_state = NUMERAL_FLOAT_EXPONENT; + } else { + radix_digits = 0; + sc.ChangeState(SCE_ERLANG_NUMBER); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case NUMERAL_RADIX_LITERAL: + if ( !is_radix(radix_digits,sc.ch) ) { + radix_digits = 0; + if ( !isalnum(sc.ch) ) { + sc.ChangeState(SCE_ERLANG_NUMBER); + } + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case NUMERAL_FLOAT_MANTISSA: + if ( 'e' == sc.ch || 'E' == sc.ch ) { + exponent_digits = 0; + parse_state = NUMERAL_FLOAT_EXPONENT; + } else if ( !isdigit(sc.ch) ) { + sc.ChangeState(SCE_ERLANG_NUMBER); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + break; + case NUMERAL_FLOAT_EXPONENT: + if ( '-' == sc.ch || '+' == sc.ch ) { + parse_state = NUMERAL_FLOAT_SIGNED_EXPONENT; + } else if ( !isdigit(sc.ch) ) { + if ( 0 < exponent_digits ) { + sc.ChangeState(SCE_ERLANG_NUMBER); + } + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else { + ++exponent_digits; + } + break; + case NUMERAL_FLOAT_SIGNED_EXPONENT: + if ( !isdigit(sc.ch) ) { + if ( 0 < exponent_digits ) { + sc.ChangeState(SCE_ERLANG_NUMBER); + } + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else { + ++exponent_digits; + } + break; + case NUMERAL_SIGNED: + if ( !isdigit(sc.ch) ) { + sc.ChangeState(SCE_ERLANG_NUMBER); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else if ( '.' == sc.ch ) { + parse_state = NUMERAL_FLOAT_MANTISSA; + } + break; + case NUMERAL_SPECULATIVE_MANTISSA: + if ( !isdigit(sc.ch) ) { + sc.ChangeState(SCE_ERLANG_OPERATOR); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else { + parse_state = NUMERAL_FLOAT_MANTISSA; + } + break; + case PARSE_ERROR: + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + break; + } + } else if (sc.state == SCE_ERLANG_OPERATOR) { + if (sc.chPrev == '.') { + if (sc.ch == '*' || sc.ch == '/' || sc.ch == '\\' || sc.ch == '^') { + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + } else if (sc.ch == '\'') { + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + } else { + sc.SetState(SCE_ERLANG_DEFAULT); + } + } else { + sc.SetState(SCE_ERLANG_DEFAULT); + } + } else if (sc.state == SCE_ERLANG_VARIABLE) { + if (!isalnum(sc.ch) && sc.ch != '_') { + sc.SetState(SCE_ERLANG_DEFAULT); + } + } else if (sc.state == SCE_ERLANG_STRING) { + if (sc.ch == '\"' && sc.chPrev != '\\') { + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + } + } else if (sc.state == SCE_ERLANG_COMMENT ) { + if (sc.atLineEnd) { + sc.SetState(SCE_ERLANG_DEFAULT); + } + } else if (sc.state == SCE_ERLANG_CHARACTER ) { + if ( sc.chPrev == '\\' ) { + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + } else if ( sc.ch != '\\' ) { + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + } + } + + if (sc.state == SCE_ERLANG_DEFAULT) { + if (sc.ch == '%') { + sc.SetState(SCE_ERLANG_COMMENT); + } else if (sc.ch == '\"') { + sc.SetState(SCE_ERLANG_STRING); + } else if (sc.ch == '#') { + parse_state = RECORD_START; + sc.SetState(SCE_ERLANG_UNKNOWN); + } else if (sc.ch == '?') { + parse_state = MACRO_START; + sc.SetState(SCE_ERLANG_UNKNOWN); + } else if (sc.ch == '$') { + sc.SetState(SCE_ERLANG_CHARACTER); + } else if (sc.ch == '\'') { + parse_state = ATOM_QUOTED; + sc.SetState(SCE_ERLANG_UNKNOWN); + } else if ( isdigit(sc.ch) ) { + parse_state = NUMERAL_START; + radix_digits = sc.ch - '0'; + sc.SetState(SCE_ERLANG_UNKNOWN); + } else if ( '.' == sc.ch ) { + parse_state = NUMERAL_SPECULATIVE_MANTISSA; + sc.SetState(SCE_ERLANG_UNKNOWN); + } else if (isalpha(sc.ch) && isupper(sc.ch)) { + sc.SetState(SCE_ERLANG_VARIABLE); + } else if (isalpha(sc.ch)) { + parse_state = ATOM_UNQUOTED; + sc.SetState(SCE_ERLANG_UNKNOWN); + } else if (isoperator(static_cast(sc.ch)) || sc.ch == '\\') { + sc.SetState(SCE_ERLANG_OPERATOR); + } + } + } + sc.Complete(); +} + +static int ClassifyFoldPointErlang( + Accessor &styler, + int styleNext, + int keyword_start +) { + int lev = 0; + if ( styler.Match(keyword_start,"case") + || ( + styler.Match(keyword_start,"fun") + && SCE_ERLANG_FUNCTION_NAME != styleNext) + || styler.Match(keyword_start,"if") + || styler.Match(keyword_start,"query") + || styler.Match(keyword_start,"receive") + ) { + ++lev; + } else if ( styler.Match(keyword_start,"end") ) { + --lev; + } + return lev; +} + + +static void FoldErlangDoc( + unsigned int startPos, int length, int initStyle, + WordList** /*keywordlists*/, Accessor &styler +) { + unsigned int endPos = startPos + length; + //~ int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler.SafeGetCharAt(startPos); + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + int keyword_start = 0; + + bool fold_keywords = true; + bool fold_comments = true; + bool fold_braces = true; + bool fold_function_clauses = false; + bool fold_clauses = false; + + //int clause_level = 0; + + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + + if ( (stylePrev != SCE_ERLANG_KEYWORD) && (style == SCE_ERLANG_KEYWORD) ) { + keyword_start = i; + } + if ( fold_keywords ) { + if ( (stylePrev == SCE_ERLANG_KEYWORD) + && (style != SCE_ERLANG_KEYWORD) + && (style != SCE_ERLANG_ATOM) + ) { + levelCurrent += ClassifyFoldPointErlang(styler,styleNext,keyword_start); + } + } + + if ( fold_comments ) { + if (style == SCE_ERLANG_COMMENT) { + if ((ch == '%') && (chNext == '{')) { + levelCurrent++; + } else if ((ch == '%') && (chNext == '}')) { + levelCurrent--; + } + } + } + + if ( fold_function_clauses ) { + if ( (SC_FOLDLEVELBASE == levelCurrent) /*&& (style == SCE_ERLANG_OPERATOR)*/ ) { + if ( (ch == '-') && (chNext == '>')) { + //~ fprintf(stderr,"levelCurrent=%d\n", levelCurrent); + //++clause_level; + //~ if ( 0 < clause_level ) + ++levelCurrent; + } + } + //~ if ( (stylePrev != SCE_ERLANG_RECORD) + //~ && (style != SCE_ERLANG_NUMBER) + //~ && (style != SCE_ERLANG_STRING) + //~ && (style != SCE_ERLANG_COMMENT) + //~ ) { + if ( (SC_FOLDLEVELBASE+1 == levelCurrent) && (ch == '.') ) { + //--clause_level; + //~ if ( 0 == clause_level ) + --levelCurrent; + } + //~ } + } + + if ( fold_clauses ) { + if ( (0 < levelCurrent) && (style == SCE_ERLANG_OPERATOR) ) { + if ((ch == '-') && (chNext == '>')) { + levelCurrent++; + } + if ( (ch == ';') ) { + levelCurrent--; + } + } + if ( (stylePrev != SCE_ERLANG_RECORD) + && (style != SCE_ERLANG_NUMBER) + && (style != SCE_ERLANG_STRING) + && (style != SCE_ERLANG_COMMENT) + ) { + if ( (ch == '.') ) { + levelCurrent--; + } + } + if ( (stylePrev == SCE_ERLANG_KEYWORD) + && (style != SCE_ERLANG_KEYWORD) + && (style != SCE_ERLANG_ATOM) + && ( + styler.Match(keyword_start,"end") // 'end' counted twice if fold_keywords too + || styler.Match(keyword_start,"after") ) + ) { + levelCurrent--; + } + } + + if ( fold_braces ) { + if (style == SCE_ERLANG_OPERATOR) { + if ( (ch == '{') || (ch == '(') || (ch == '[') ) { + levelCurrent++; + } else if ( (ch == '}') || (ch == ')') || (ch == ']') ) { + levelCurrent--; + } + } + } + + if (atEOL) { + int lev = levelPrev; + //~ if (visibleChars == 0 && foldCompact) + //~ lev |= SC_FOLDLEVELWHITEFLAG; + //~ if ((levelCurrent > levelPrev) && (visibleChars > 0)) + if ((levelCurrent > levelPrev)) { + lev |= SC_FOLDLEVELHEADERFLAG; + } + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + //~ visibleChars = 0; + } + //~ if (!isspacechar(ch)) + //~ visibleChars++; + + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +static const char * const erlangWordListDesc[] = { + "Keywords", + 0 +}; + +LexerModule lmErlang( + SCLEX_ERLANG, + ColouriseErlangDoc, + "erlang", + FoldErlangDoc, + erlangWordListDesc); + diff --git a/scintilla/src/LexFlagship.cxx b/scintilla/src/LexFlagship.cxx new file mode 100644 index 00000000..335726ec --- /dev/null +++ b/scintilla/src/LexFlagship.cxx @@ -0,0 +1,226 @@ +// Scintilla source code edit control +/** @file LexFlagShip.cxx + ** Lexer for FlagShip + ** (Syntactically compatible to other XBase dialects, like dBase, Clipper, Fox etc.) + **/ +// Copyright 2005 by Randy Butler +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +static bool IsFlagShipComment(Accessor &styler, int pos, int len) { + return len>0 && styler[pos]=='\''; +} + +static inline bool IsTypeCharacter(int ch) { + return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$'; +} + +// Extended to accept accented characters +static inline bool IsAWordChar(int ch) { + return ch >= 0x80 || + (isalnum(ch) || ch == '.' || ch == '_'); +} + +static inline bool IsAWordStart(int ch) { + return ch >= 0x80 || + (isalnum(ch) || ch == '_'); +} + +static inline bool IsADateCharacter(const int ch) { + return (ch < 0x80) && + (isalnum(ch) || ch == '|' || ch == '-' || ch == '/' || ch == ':' || ch == ' ' || ch == '\t'); +} + + +static void ColouriseFlagShipDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + + //bool FSScriptSyntax = true; + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + + styler.StartAt(startPos); + + int visibleChars = 0; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + if (sc.state == SCE_FS_OPERATOR) { + sc.SetState(SCE_FS_DEFAULT); + } else if (sc.state == SCE_FS_IDENTIFIER) { + if (!IsAWordChar(sc.ch)) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + if (keywords.InList(s)) { + sc.ChangeState(SCE_FS_KEYWORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_FS_KEYWORD2); + } else if (keywords3.InList(s)) { + sc.ChangeState(SCE_FS_KEYWORD3); + } else if (keywords4.InList(s)) { + sc.ChangeState(SCE_FS_KEYWORD4); + }// Else, it is really an identifier... + sc.SetState(SCE_FS_DEFAULT); + } + } else if (sc.state == SCE_FS_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_FS_DEFAULT); + } + } else if (sc.state == SCE_FS_STRING) { + // VB doubles quotes to preserve them, so just end this string + // state now as a following quote will start again + if (sc.ch == '\"') { + if (tolower(sc.chNext) == 'c') { + sc.Forward(); + } + sc.ForwardSetState(SCE_FS_DEFAULT); + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_FS_STRINGEOL); + sc.ForwardSetState(SCE_FS_DEFAULT); + } + } else if (sc.state == SCE_FS_COMMENT) { + if (sc.Match('*', '/')) { // new code + sc.Forward(); + sc.ForwardSetState(SCE_FS_DEFAULT); + //if (sc.atLineEnd) { // old code + // sc.SetState(SCE_FS_DEFAULT); + } + } else if (sc.state == SCE_FS_COMMENTLINE) { //new code + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_FS_DEFAULT); + visibleChars = 0; + } + } else if (sc.state == SCE_FS_PREPROCESSOR) { + if (sc.atLineEnd) { + sc.SetState(SCE_FS_DEFAULT); + } + } else if (sc.state == SCE_FS_DATE) { + if (sc.ch == '#' || !IsADateCharacter(sc.chNext)) { + sc.ForwardSetState(SCE_FS_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_FS_DEFAULT) { + if (sc.Match('/', '*')) { // New code + sc.SetState(SCE_FS_COMMENT); + sc.Forward(); // Eat the * so it isn't used for the end of the comment + //if (sc.ch == '\'') { // Old code + // sc.SetState(SCE_FS_COMMENT); // old code + } else if (sc.Match('/', '/')) { // New code + sc.SetState(SCE_FS_COMMENTLINE); + } else if (sc.ch == '\"') { + sc.SetState(SCE_FS_STRING); + } else if (sc.ch == '#' && visibleChars == 0) { + // Preprocessor commands are alone on their line + sc.SetState(SCE_FS_PREPROCESSOR); + } else if (sc.ch == '#') { + int n = 1; + int chSeek = ' '; + while ((n < 100) && (chSeek == ' ' || chSeek == '\t')) { + chSeek = sc.GetRelative(n); + n++; + } + if (IsADigit(chSeek)) { + sc.SetState(SCE_FS_DATE); + } else { + sc.SetState(SCE_FS_OPERATOR); + } + } else if (sc.ch == '&' && tolower(sc.chNext) == 'h') { + sc.SetState(SCE_FS_NUMBER); + } else if (sc.ch == '&' && tolower(sc.chNext) == 'o') { + sc.SetState(SCE_FS_NUMBER); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_FS_NUMBER); + } else if (IsAWordStart(sc.ch) || (sc.ch == '[')) { + sc.SetState(SCE_FS_IDENTIFIER); + } else if (isoperator(static_cast(sc.ch)) || (sc.ch == '\\')) { + sc.SetState(SCE_FS_OPERATOR); + } + } + + if (sc.atLineEnd) { + visibleChars = 0; + } + if (!IsASpace(sc.ch)) { + visibleChars++; + } + } + sc.Complete(); +} + +static void FoldFlagShipDoc(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + + int endPos = startPos + length; + + // Backtrack to previous line in case need to fix its fold status + int lineCurrent = styler.GetLine(startPos); + if (startPos > 0) { + if (lineCurrent > 0) { + lineCurrent--; + startPos = styler.LineStart(lineCurrent); + } + } + int spaceFlags = 0; + int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsFlagShipComment); + char chNext = styler[startPos]; + for (int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) { + int lev = indentCurrent; + int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsFlagShipComment); + if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) { + // Only non whitespace lines can be headers + if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) { + lev |= SC_FOLDLEVELHEADERFLAG; + } else if (indentNext & SC_FOLDLEVELWHITEFLAG) { + // Line after is blank so check the next - maybe should continue further? + int spaceFlags2 = 0; + int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsFlagShipComment); + if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) { + lev |= SC_FOLDLEVELHEADERFLAG; + } + } + } + indentCurrent = indentNext; + styler.SetLevel(lineCurrent, lev); + lineCurrent++; + } + } +} + + +static const char * const FSWordListDesc[] = { + "Keywords", + "functions", + "user2", + "user3", + 0 +}; + +LexerModule lmFlagShip(SCLEX_FLAGSHIP, ColouriseFlagShipDoc, "flagship", FoldFlagShipDoc, FSWordListDesc); + + + diff --git a/scintilla/src/LexForth.cxx b/scintilla/src/LexForth.cxx new file mode 100644 index 00000000..9be7d644 --- /dev/null +++ b/scintilla/src/LexForth.cxx @@ -0,0 +1,348 @@ +// Scintilla source code edit control +/** @file LexCrontab.cxx + ** Lexer to use with extended crontab files used by a powerful + ** Windows scheduler/event monitor/automation manager nnCron. + ** (http://nemtsev.eserv.ru/) + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +bool is_whitespace(int ch){ + return ch == '\n' || ch == '\r' || ch == '\t' || ch == ' '; +} + +bool is_blank(int ch){ + return ch == '\t' || ch == ' '; +} +//#define FORTH_DEBUG +#ifdef FORTH_DEBUG +static FILE *f_debug; +#define log(x) fputs(f_debug,x); +#else +#define log(x) +#endif + +#define STATE_LOCALE +#define BL ' ' + +static Accessor *st; +static int cur_pos,pos1,pos2,pos0,lengthDoc; +char *buffer; + +char getChar(bool is_bl){ + char ch=st->SafeGetCharAt(cur_pos); + if(is_bl) if(is_whitespace(ch)) ch=BL; + return ch; +} + +char getCharBL(){ + char ch=st->SafeGetCharAt(cur_pos); + return ch; +} +bool is_eol(char ch){ + return ch=='\n' || ch=='\r'; +} + +int parse(char ch, bool skip_eol){ +// pos1 - start pos of word +// pos2 - pos after of word +// pos0 - start pos + char c=0; + int len; + bool is_bl=ch==BL; + pos0=pos1=pos2=cur_pos; + for(;cur_pos9 && base>10) digit-=7; + if(digit<0) return false; + if(digit>=base) return false; + } + return true; +} + +bool is_number(char *s){ + if(strncmp(s,"0x",2)==0) return _is_number(s+2,16); + return _is_number(s,10); +} + +static void ColouriseForthDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) +{ + st=&styler; + cur_pos=startPos; + lengthDoc = startPos + length; + buffer = new char[length]; + +#ifdef FORTH_DEBUG + f_debug=fopen("c:\\sci.log","at"); +#endif + + WordList &control = *keywordLists[0]; + WordList &keyword = *keywordLists[1]; + WordList &defword = *keywordLists[2]; + WordList &preword1 = *keywordLists[3]; + WordList &preword2 = *keywordLists[4]; + WordList &strings = *keywordLists[5]; + + // go through all provided text segment + // using the hand-written state machine shown below + styler.StartAt(startPos); + styler.StartSegment(startPos); + while(parse(BL,true)!=0){ + if(pos0!=pos1){ + styler.ColourTo(pos0,SCE_FORTH_DEFAULT); + styler.ColourTo(pos1-1,SCE_FORTH_DEFAULT); + } + if(strcmp("\\",buffer)==0){ + styler.ColourTo(pos1,SCE_FORTH_COMMENT); + parse(1,false); + styler.ColourTo(pos2,SCE_FORTH_COMMENT); + }else if(strcmp("(",buffer)==0){ + styler.ColourTo(pos1,SCE_FORTH_COMMENT); + parse(')',true); + if(cur_pos +// The License.txt file describes the conditions under which this software may be distributed. +/***************************************/ +#include +#include +#include +#include +#include +/***************************************/ +#include "Platform.h" +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" +/***********************************************/ +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '%'); +} +/**********************************************/ +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch)); +} +/***************************************/ +inline bool IsABlank(unsigned int ch) { + return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ; +} +/***************************************/ +inline bool IsALineEnd(char ch) { + return ((ch == '\n') || (ch == '\r')) ; +} +/***************************************/ +unsigned int GetContinuedPos(unsigned int pos, Accessor &styler) { + while (!IsALineEnd(styler.SafeGetCharAt(pos++))) continue; + if (styler.SafeGetCharAt(pos) == '\n') pos++; + while (IsABlank(styler.SafeGetCharAt(pos++))) continue; + char chCur = styler.SafeGetCharAt(pos); + if (chCur == '&') { + while (IsABlank(styler.SafeGetCharAt(++pos))) continue; + return pos; + } else { + return pos; + } +} +/***************************************/ +static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler, bool isFixFormat) { + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + /***************************************/ + int posLineStart = 0, numNonBlank = 0, prevState = 0; + int endPos = startPos + length; + /***************************************/ + // backtrack to the nearest keyword + while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_F_WORD)) { + startPos--; + } + startPos = styler.LineStart(styler.GetLine(startPos)); + initStyle = styler.StyleAt(startPos - 1); + StyleContext sc(startPos, endPos-startPos, initStyle, styler); + /***************************************/ + for (; sc.More(); sc.Forward()) { + // remember the start position of the line + if (sc.atLineStart) { + posLineStart = sc.currentPos; + numNonBlank = 0; + sc.SetState(SCE_F_DEFAULT); + } + if (!IsASpaceOrTab(sc.ch)) numNonBlank ++; + /***********************************************/ + // Handle the fix format generically + int toLineStart = sc.currentPos - posLineStart; + if (isFixFormat && (toLineStart < 6 || toLineStart > 72)) { + if (toLineStart == 0 && (tolower(sc.ch) == 'c' || sc.ch == '*') || sc.ch == '!') { + sc.SetState(SCE_F_COMMENT); + while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end + } else if (toLineStart > 72) { + sc.SetState(SCE_F_COMMENT); + while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end + } else if (toLineStart < 5) { + if (IsADigit(sc.ch)) + sc.SetState(SCE_F_LABEL); + else + sc.SetState(SCE_F_DEFAULT); + } else if (toLineStart == 5) { + if (!IsASpace(sc.ch) && sc.ch != '0') { + sc.SetState(SCE_F_CONTINUATION); + sc.ForwardSetState(prevState); + } else + sc.SetState(SCE_F_DEFAULT); + } + continue; + } + /***************************************/ + // Handle line continuation generically. + if (!isFixFormat && sc.ch == '&') { + char chTemp = ' '; + int j = 1; + while (IsABlank(chTemp) && j<132) { + chTemp = static_cast(sc.GetRelative(j)); + j++; + } + if (chTemp == '!') { + sc.SetState(SCE_F_CONTINUATION); + if (sc.chNext == '!') sc.ForwardSetState(SCE_F_COMMENT); + } else if (chTemp == '\r' || chTemp == '\n') { + int currentState = sc.state; + sc.SetState(SCE_F_CONTINUATION); + sc.ForwardSetState(SCE_F_DEFAULT); + while (IsASpace(sc.ch) && sc.More()) sc.Forward(); + if (sc.ch == '&') { + sc.SetState(SCE_F_CONTINUATION); + sc.Forward(); + } + sc.SetState(currentState); + } + } + /***************************************/ + // Determine if the current state should terminate. + if (sc.state == SCE_F_OPERATOR) { + sc.SetState(SCE_F_DEFAULT); + } else if (sc.state == SCE_F_NUMBER) { + if (!(IsAWordChar(sc.ch) || sc.ch=='\'' || sc.ch=='\"' || sc.ch=='.')) { + sc.SetState(SCE_F_DEFAULT); + } + } else if (sc.state == SCE_F_IDENTIFIER) { + if (!IsAWordChar(sc.ch) || (sc.ch == '%')) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + if (keywords.InList(s)) { + sc.ChangeState(SCE_F_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_F_WORD2); + } else if (keywords3.InList(s)) { + sc.ChangeState(SCE_F_WORD3); + } + sc.SetState(SCE_F_DEFAULT); + } + } else if (sc.state == SCE_F_COMMENT || sc.state == SCE_F_PREPROCESSOR) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_F_DEFAULT); + } + } else if (sc.state == SCE_F_STRING1) { + prevState = sc.state; + if (sc.ch == '\'') { + if (sc.chNext == '\'') { + sc.Forward(); + } else { + sc.ForwardSetState(SCE_F_DEFAULT); + prevState = SCE_F_DEFAULT; + } + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_F_STRINGEOL); + sc.ForwardSetState(SCE_F_DEFAULT); + } + } else if (sc.state == SCE_F_STRING2) { + prevState = sc.state; + if (sc.atLineEnd) { + sc.ChangeState(SCE_F_STRINGEOL); + sc.ForwardSetState(SCE_F_DEFAULT); + } else if (sc.ch == '\"') { + if (sc.chNext == '\"') { + sc.Forward(); + } else { + sc.ForwardSetState(SCE_F_DEFAULT); + prevState = SCE_F_DEFAULT; + } + } + } else if (sc.state == SCE_F_OPERATOR2) { + if (sc.ch == '.') { + sc.ForwardSetState(SCE_F_DEFAULT); + } + } else if (sc.state == SCE_F_CONTINUATION) { + sc.SetState(SCE_F_DEFAULT); + } else if (sc.state == SCE_F_LABEL) { + if (!IsADigit(sc.ch)) { + sc.SetState(SCE_F_DEFAULT); + } else { + if (isFixFormat && sc.currentPos-posLineStart > 4) + sc.SetState(SCE_F_DEFAULT); + else if (numNonBlank > 5) + sc.SetState(SCE_F_DEFAULT); + } + } + /***************************************/ + // Determine if a new state should be entered. + if (sc.state == SCE_F_DEFAULT) { + if (sc.ch == '!') { + if (sc.chNext == '$') { + sc.SetState(SCE_F_PREPROCESSOR); + } else { + sc.SetState(SCE_F_COMMENT); + } + } else if ((!isFixFormat) && IsADigit(sc.ch) && numNonBlank == 1) { + sc.SetState(SCE_F_LABEL); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_F_NUMBER); + } else if ((tolower(sc.ch) == 'b' || tolower(sc.ch) == 'o' || + tolower(sc.ch) == 'z') && (sc.chNext == '\"' || sc.chNext == '\'')) { + sc.SetState(SCE_F_NUMBER); + sc.Forward(); + } else if (sc.ch == '.' && isalpha(sc.chNext)) { + sc.SetState(SCE_F_OPERATOR2); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_F_IDENTIFIER); + } else if (sc.ch == '\"') { + sc.SetState(SCE_F_STRING2); + } else if (sc.ch == '\'') { + sc.SetState(SCE_F_STRING1); + } else if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_F_OPERATOR); + } + } + } + sc.Complete(); +} +/***************************************/ +// To determine the folding level depending on keywords +static int classifyFoldPointFortran(const char* s, const char* prevWord, const char chNextNonBlank) { + int lev = 0; + if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0) + return -1; + if (strcmp(s, "associate") == 0 || strcmp(s, "block") == 0 + || strcmp(s, "blockdata") == 0 || strcmp(s, "select") == 0 + || strcmp(s, "do") == 0 || strcmp(s, "enum") ==0 + || strcmp(s, "function") == 0 || strcmp(s, "interface") == 0 + || strcmp(s, "module") == 0 || strcmp(s, "program") == 0 + || strcmp(s, "subroutine") == 0 || strcmp(s, "then") == 0 + || (strcmp(s, "type") == 0 && chNextNonBlank != '(') ){ + if (strcmp(prevWord, "end") == 0) + lev = 0; + else + lev = 1; + } else if (strcmp(s, "end") == 0 && chNextNonBlank != '=' + || strcmp(s, "endassociate") == 0 || strcmp(s, "endblock") == 0 + || strcmp(s, "endblockdata") == 0 || strcmp(s, "endselect") == 0 + || strcmp(s, "enddo") == 0 || strcmp(s, "endenum") ==0 + || strcmp(s, "endif") == 0 || strcmp(s, "endforall") == 0 + || strcmp(s, "endfunction") == 0 || strcmp(s, "endinterface") == 0 + || strcmp(s, "endmodule") == 0 || strcmp(s, "endprogram") == 0 + || strcmp(s, "endsubroutine") == 0 || strcmp(s, "endtype") == 0 + || strcmp(s, "endwhere") == 0 + || strcmp(s, "procedure") == 0 ) { // Take care of the module procedure statement + lev = -1; + } else if (strcmp(prevWord, "end") == 0 && strcmp(s, "if") == 0){ // end if + lev = 0; + } + return lev; +} +// Folding the code +static void FoldFortranDoc(unsigned int startPos, int length, int initStyle, + Accessor &styler, bool isFixFormat) { + // + // bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + // Do not know how to fold the comment at the moment. + // + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + char chNextNonBlank; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + /***************************************/ + int lastStart = 0; + char prevWord[32] = ""; + char Label[6] = ""; + // Variables for do label folding. + static int doLabels[100]; + static int posLabel=-1; + /***************************************/ + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + chNextNonBlank = chNext; + unsigned int j=i+1; + while(IsABlank(chNextNonBlank) && j(tolower(styler[lastStart+k])); + } + s[k] = '\0'; + // Handle the forall and where statement and structure. + if (strcmp(s, "forall") == 0 || strcmp(s, "where") == 0) { + if (strcmp(prevWord, "end") != 0) { + j = i + 1; + char chBrace = '(', chSeek = ')', ch1 = styler.SafeGetCharAt(j); + // Find the position of the first ( + while (ch1 != chBrace && j -1) { + levelCurrent--; + posLabel--; + } + } + } + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + strcpy(prevWord, ""); + } + /***************************************/ + if (!isspacechar(ch)) visibleChars++; + } + /***************************************/ + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} +/***************************************/ +static const char * const FortranWordLists[] = { + "Primary keywords and identifiers", + "Intrinsic functions", + "Extended and user defined functions", + 0, +}; +/***************************************/ +static void ColouriseFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, false); +} +/***************************************/ +static void ColouriseFortranDocFixFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, true); +} +/***************************************/ +static void FoldFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, + WordList *[], Accessor &styler) { + FoldFortranDoc(startPos, length, initStyle,styler, false); +} +/***************************************/ +static void FoldFortranDocFixFormat(unsigned int startPos, int length, int initStyle, + WordList *[], Accessor &styler) { + FoldFortranDoc(startPos, length, initStyle,styler, true); +} +/***************************************/ +LexerModule lmFortran(SCLEX_FORTRAN, ColouriseFortranDocFreeFormat, "fortran", FoldFortranDocFreeFormat, FortranWordLists); +LexerModule lmF77(SCLEX_F77, ColouriseFortranDocFixFormat, "f77", FoldFortranDocFixFormat, FortranWordLists); diff --git a/scintilla/src/LexGen.py b/scintilla/src/LexGen.py new file mode 100644 index 00000000..3a302cc6 --- /dev/null +++ b/scintilla/src/LexGen.py @@ -0,0 +1,241 @@ +# LexGen.py - implemented 2002 by Neil Hodgson neilh@scintilla.org +# Released to the public domain. + +# Regenerate the Scintilla and SciTE source files that list +# all the lexers and all the properties files. +# Should be run whenever a new lexer is added or removed. +# Requires Python 2.4 or later +# Most files are regenerated in place with templates stored in comments. +# The VS .NET project file is generated into a different file as the +# VS .NET environment will not retain comments when modifying the file. +# The files are copied to a string apart from sections between a +# ++Autogenerated comment and a --Autogenerated comment which is +# generated by the CopyWithInsertion function. After the whole +# string is instantiated, it is compared with the target file and +# if different the file is rewritten. +# Does not regenerate the Visual C++ 6 project files but does the VS .NET +# project file. + +import string +import sys +import os +import glob + +# EOL constants +CR = "\r" +LF = "\n" +CRLF = "\r\n" +if sys.platform == "win32": + NATIVE = CRLF +else: + # Yes, LF is the native EOL even on Mac OS X. CR is just for + # Mac OS <=9 (a.k.a. "Mac Classic") + NATIVE = LF + +# Automatically generated sections contain start and end comments, +# a definition line and the results. +# The results are replaced by regenerating based on the definition line. +# The definition line is a comment prefix followed by "**". +# If there is a digit after the ** then this indicates which list to use +# and the digit and next character are not part of the definition +# Backslash is used as an escape within the definition line. +# The part between \( and \) is repeated for each item in the list. +# \* is replaced by each list item. \t, and \n are tab and newline. +def CopyWithInsertion(input, commentPrefix, retainDefs, eolType, *lists): + copying = 1 + listid = 0 + output = [] + for line in input.splitlines(0): + isStartGenerated = line.startswith(commentPrefix + "++Autogenerated") + if copying and not isStartGenerated: + output.append(line) + if isStartGenerated: + if retainDefs: + output.append(line) + copying = 0 + definition = "" + elif not copying and line.startswith(commentPrefix + "**"): + if retainDefs: + output.append(line) + definition = line[len(commentPrefix + "**"):] + listid = 0 + if definition[0] in string.digits: + listid = int(definition[:1]) + definition = definition[2:] + # Hide double slashes as a control character + definition = definition.replace("\\\\", "\001") + # Do some normal C style transforms + definition = definition.replace("\\n", "\n") + definition = definition.replace("\\t", "\t") + # Get the doubled backslashes back as single backslashes + definition = definition.replace("\001", "\\") + startRepeat = definition.find("\\(") + endRepeat = definition.find("\\)") + intro = definition[:startRepeat] + out = "" + if intro.endswith("\n"): + pos = 0 + else: + pos = len(intro) + out += intro + middle = definition[startRepeat+2:endRepeat] + for i in lists[listid]: + item = middle.replace("\\*", i) + if pos and (pos + len(item) >= 80): + out += "\\\n" + pos = 0 + out += item + pos += len(item) + if item.endswith("\n"): + pos = 0 + outro = definition[endRepeat+2:] + out += outro + out = out.replace("\n", eolType) # correct EOLs in generated content + output.append(out) + elif line.startswith(commentPrefix + "--Autogenerated"): + copying = 1 + if retainDefs: + output.append(line) + output = [line.rstrip(" \t") for line in output] # trim trailing whitespace + return eolType.join(output) + eolType + +def UpdateFile(filename, updated): + """ If the file is different to updated then copy updated + into the file else leave alone so CVS and make don't treat + it as modified. """ + try: + infile = open(filename, "rb") + except IOError: # File is not there yet + out = open(filename, "wb") + out.write(updated) + out.close() + print "New", filename + return + original = infile.read() + infile.close() + if updated != original: + os.unlink(filename) + out = open(filename, "wb") + out.write(updated) + out.close() + print "Changed", filename + #~ else: + #~ print "Unchanged", filename + +def Generate(inpath, outpath, commentPrefix, eolType, *lists): + """Generate 'outpath' from 'inpath'. + + "eolType" indicates the type of EOLs to use in the generated + file. It should be one of following constants: LF, CRLF, + CR, or NATIVE. + """ + #print "generate '%s' -> '%s' (comment prefix: %r, eols: %r)"\ + # % (inpath, outpath, commentPrefix, eolType) + try: + infile = open(inpath, "r") + except IOError: + print "Can not open", inpath + return + original = infile.read() + infile.close() + updated = CopyWithInsertion(original, commentPrefix, + inpath == outpath, eolType, *lists) + UpdateFile(outpath, updated) + +def Regenerate(filename, commentPrefix, eolType, *lists): + """Regenerate the given file. + + "eolType" indicates the type of EOLs to use in the generated + file. It should be one of following constants: LF, CRLF, + CR, or NATIVE. + """ + Generate(filename, filename, commentPrefix, eolType, *lists) + +def FindModules(lexFile): + modules = [] + f = open(lexFile) + for l in f.readlines(): + if l.startswith("LexerModule"): + l = l.replace("(", " ") + modules.append(l.split()[1]) + return modules + +knownIrregularProperties = [ + "fold", + "styling.within.preprocessor", + "tab.timmy.whinge.level", + "asp.default.language", + "html.tags.case.sensitive", + "ps.level", + "ps.tokenize", + "sql.backslash.escapes", + "nsis.uservars", + "nsis.ignorecase" +] + +def FindProperties(lexFile): + properties = set() + f = open(lexFile) + for l in f.readlines(): + if "GetProperty" in l: + l = l.strip() + if not l.startswith("//"): # Drop comments + propertyName = l.split("\"")[1] + if propertyName.lower() == propertyName: + # Only allow lower case property names + if propertyName in knownIrregularProperties or \ + propertyName.startswith("fold.") or \ + propertyName.startswith("lexer."): + properties.add(propertyName) + return properties + +def ciCompare(a,b): + return cmp(a.lower(), b.lower()) + +def RegenerateAll(): + root="../../" + + # Find all the lexer source code files + lexFilePaths = glob.glob(root + "scintilla/src/Lex*.cxx") + lexFiles = [os.path.basename(f)[:-4] for f in lexFilePaths] + print lexFiles + lexerModules = [] + lexerProperties = set() + for lexFile in lexFilePaths: + lexerModules.extend(FindModules(lexFile)) + lexerProperties.update(FindProperties(lexFile)) + lexerModules.sort(ciCompare) + lexerProperties.remove("fold.comment.python") + lexerProperties = list(lexerProperties) + lexerProperties.sort(ciCompare) + + # Find all the SciTE properties files + otherProps = ["abbrev.properties", "Embedded.properties", "SciTEGlobal.properties", "SciTE.properties"] + propFilePaths = glob.glob(root + "scite/src/*.properties") + propFiles = [os.path.basename(f) for f in propFilePaths if os.path.basename(f) not in otherProps] + propFiles.sort(ciCompare) + print propFiles + + # Find all the menu command IDs in the SciTE header + SciTEHeader = file(root + "scite/src/SciTE.h") + lines = SciTEHeader.read().split("\n") + SciTEHeader.close() + ids = [id for id in [l.split()[1] for l in lines if l.startswith("#define")] if id.startswith("IDM_")] + #print ids + + Regenerate(root + "scintilla/src/KeyWords.cxx", "//", NATIVE, lexerModules) + Regenerate(root + "scintilla/win32/makefile", "#", NATIVE, lexFiles) + Regenerate(root + "scintilla/win32/scintilla.mak", "#", NATIVE, lexFiles) + Regenerate(root + "scintilla/win32/scintilla_vc6.mak", "#", NATIVE, lexFiles) + # Use Unix EOLs for gtk Makefiles so they work for Linux users when + # extracted from the Scintilla source ZIP (typically created on + # Windows). + Regenerate(root + "scintilla/gtk/makefile", "#", LF, lexFiles) + Regenerate(root + "scintilla/gtk/scintilla.mak", "#", NATIVE, lexFiles) + Regenerate(root + "scite/win32/makefile", "#", NATIVE, lexFiles, propFiles) + Regenerate(root + "scite/win32/scite.mak", "#", NATIVE, lexFiles, propFiles) + Regenerate(root + "scite/src/SciTEProps.cxx", "//", NATIVE, lexerProperties, ids) + Generate(root + "scite/boundscheck/vcproj.gen", + root + "scite/boundscheck/SciTE.vcproj", "#", NATIVE, lexFiles) + +RegenerateAll() diff --git a/scintilla/src/LexGui4Cli.cxx b/scintilla/src/LexGui4Cli.cxx new file mode 100644 index 00000000..417d1f2b --- /dev/null +++ b/scintilla/src/LexGui4Cli.cxx @@ -0,0 +1,309 @@ +// Scintilla source code edit control +// Copyright 1998-2002 by Neil Hodgson +/* +This is the Lexer for Gui4Cli, included in SciLexer.dll +- by d. Keletsekis, 2/10/2003 + +To add to SciLexer.dll: +1. Add the values below to INCLUDE\Scintilla.iface +2. Run the include/HFacer.py script +3. Run the src/lexGen.py script + +val SCE_GC_DEFAULT=0 +val SCE_GC_COMMENTLINE=1 +val SCE_GC_COMMENTBLOCK=2 +val SCE_GC_GLOBAL=3 +val SCE_GC_EVENT=4 +val SCE_GC_ATTRIBUTE=5 +val SCE_GC_CONTROL=6 +val SCE_GC_COMMAND=7 +val SCE_GC_STRING=8 +val SCE_GC_OPERATOR=9 +*/ + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#define debug Platform::DebugPrintf + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch =='\\'); +} + +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.'); +} + +inline bool isGCOperator(int ch) +{ if (isalnum(ch)) + return false; + // '.' left out as it is used to make up numbers + if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || ch == '%' || + ch == '[' || ch == ']' || ch == '<' || ch == '>' || + ch == ',' || ch == ';' || ch == ':') + return true; + return false; +} + +#define isSpace(x) ((x)==' ' || (x)=='\t') +#define isNL(x) ((x)=='\n' || (x)=='\r') +#define isSpaceOrNL(x) (isSpace(x) || isNL(x)) +#define BUFFSIZE 500 +#define isFoldPoint(x) ((styler.LevelAt(x) & SC_FOLDLEVELNUMBERMASK) == 1024) + +static void colorFirstWord(WordList *keywordlists[], Accessor &styler, + StyleContext *sc, char *buff, int length, int) +{ + int c = 0; + while (sc->More() && isSpaceOrNL(sc->ch)) + { sc->Forward(); + } + styler.ColourTo(sc->currentPos - 1, sc->state); + + if (!IsAWordChar(sc->ch)) // comment, marker, etc.. + return; + + while (sc->More() && !isSpaceOrNL(sc->ch) && (c < length-1) && !isGCOperator(sc->ch)) + { buff[c] = static_cast(sc->ch); + ++c; sc->Forward(); + } + buff[c] = '\0'; + char *p = buff; + while (*p) // capitalize.. + { if (islower(*p)) *p = static_cast(toupper(*p)); + ++p; + } + + WordList &kGlobal = *keywordlists[0]; // keyword lists set by the user + WordList &kEvent = *keywordlists[1]; + WordList &kAttribute = *keywordlists[2]; + WordList &kControl = *keywordlists[3]; + WordList &kCommand = *keywordlists[4]; + + int state = 0; + // int level = styler.LevelAt(line) & SC_FOLDLEVELNUMBERMASK; + // debug ("line = %d, level = %d", line, level); + + if (kGlobal.InList(buff)) state = SCE_GC_GLOBAL; + else if (kAttribute.InList(buff)) state = SCE_GC_ATTRIBUTE; + else if (kControl.InList(buff)) state = SCE_GC_CONTROL; + else if (kCommand.InList(buff)) state = SCE_GC_COMMAND; + else if (kEvent.InList(buff)) state = SCE_GC_EVENT; + + if (state) + { sc->ChangeState(state); + styler.ColourTo(sc->currentPos - 1, sc->state); + sc->ChangeState(SCE_GC_DEFAULT); + } + else + { sc->ChangeState(SCE_GC_DEFAULT); + styler.ColourTo(sc->currentPos - 1, sc->state); + } +} + +// Main colorizing function called by Scintilla +static void +ColouriseGui4CliDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) +{ + styler.StartAt(startPos); + + int quotestart = 0, oldstate, currentline = styler.GetLine(startPos); + styler.StartSegment(startPos); + bool noforward; + char buff[BUFFSIZE+1]; // buffer for command name + + StyleContext sc(startPos, length, initStyle, styler); + buff[0] = '\0'; // cbuff = 0; + + if (sc.state != SCE_GC_COMMENTBLOCK) // colorize 1st word.. + colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline); + + while (sc.More()) + { noforward = 0; + + switch (sc.ch) + { + case '/': + if (sc.state == SCE_GC_COMMENTBLOCK || sc.state == SCE_GC_STRING) + break; + if (sc.chNext == '/') // line comment + { sc.SetState (SCE_GC_COMMENTLINE); + sc.Forward(); + styler.ColourTo(sc.currentPos, sc.state); + } + else if (sc.chNext == '*') // block comment + { sc.SetState(SCE_GC_COMMENTBLOCK); + sc.Forward(); + styler.ColourTo(sc.currentPos, sc.state); + } + else + styler.ColourTo(sc.currentPos, sc.state); + break; + + case '*': // end of comment block, or operator.. + if (sc.state == SCE_GC_STRING) + break; + if (sc.state == SCE_GC_COMMENTBLOCK && sc.chNext == '/') + { sc.Forward(); + styler.ColourTo(sc.currentPos, sc.state); + sc.ChangeState (SCE_GC_DEFAULT); + } + else + styler.ColourTo(sc.currentPos, sc.state); + break; + + case '\'': case '\"': // strings.. + if (sc.state == SCE_GC_COMMENTBLOCK || sc.state == SCE_GC_COMMENTLINE) + break; + if (sc.state == SCE_GC_STRING) + { if (sc.ch == quotestart) // match same quote char.. + { styler.ColourTo(sc.currentPos, sc.state); + sc.ChangeState(SCE_GC_DEFAULT); + quotestart = 0; + } } + else + { styler.ColourTo(sc.currentPos - 1, sc.state); + sc.ChangeState(SCE_GC_STRING); + quotestart = sc.ch; + } + break; + + case ';': // end of commandline character + if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE && + sc.state != SCE_GC_STRING) + { + styler.ColourTo(sc.currentPos - 1, sc.state); + styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR); + sc.ChangeState(SCE_GC_DEFAULT); + sc.Forward(); + colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline); + noforward = 1; // don't move forward - already positioned at next char.. + } + break; + + case '+': case '-': case '=': case '!': // operators.. + case '<': case '>': case '&': case '|': case '$': + if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE && + sc.state != SCE_GC_STRING) + { + styler.ColourTo(sc.currentPos - 1, sc.state); + styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR); + sc.ChangeState(SCE_GC_DEFAULT); + } + break; + + case '\\': // escape - same as operator, but also mark in strings.. + if (sc.state != SCE_GC_COMMENTBLOCK && sc.state != SCE_GC_COMMENTLINE) + { + oldstate = sc.state; + styler.ColourTo(sc.currentPos - 1, sc.state); + sc.Forward(); // mark also the next char.. + styler.ColourTo(sc.currentPos, SCE_GC_OPERATOR); + sc.ChangeState(oldstate); + } + break; + + case '\n': case '\r': + ++currentline; + if (sc.state == SCE_GC_COMMENTLINE) + { styler.ColourTo(sc.currentPos, sc.state); + sc.ChangeState (SCE_GC_DEFAULT); + } + else if (sc.state != SCE_GC_COMMENTBLOCK) + { colorFirstWord(keywordlists, styler, &sc, buff, BUFFSIZE, currentline); + noforward = 1; // don't move forward - already positioned at next char.. + } + break; + +// case ' ': case '\t': +// default : + } + + if (!noforward) sc.Forward(); + + } + sc.Complete(); +} + +// Main folding function called by Scintilla - (based on props (.ini) files function) +static void FoldGui4Cli(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) +{ + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + bool headerPoint = false; + + for (unsigned int i = startPos; i < endPos; i++) + { + char ch = chNext; + chNext = styler[i+1]; + + int style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + + if (style == SCE_GC_EVENT || style == SCE_GC_GLOBAL) + { headerPoint = true; // fold at events and globals + } + + if (atEOL) + { int lev = SC_FOLDLEVELBASE+1; + + if (headerPoint) + lev = SC_FOLDLEVELBASE; + + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + + if (headerPoint) + lev |= SC_FOLDLEVELHEADERFLAG; + + if (lev != styler.LevelAt(lineCurrent)) // set level, if not already correct + { styler.SetLevel(lineCurrent, lev); + } + + lineCurrent++; // re-initialize our flags + visibleChars = 0; + headerPoint = false; + } + + if (!(isspacechar(ch))) // || (style == SCE_GC_COMMENTLINE) || (style != SCE_GC_COMMENTBLOCK))) + visibleChars++; + } + + int lev = headerPoint ? SC_FOLDLEVELBASE : SC_FOLDLEVELBASE+1; + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, lev | flagsNext); +} + +// I have no idea what these are for.. probably accessible by some message. +static const char * const gui4cliWordListDesc[] = { + "Globals", "Events", "Attributes", "Control", "Commands", + 0 +}; + +// Declare language & pass our function pointers to Scintilla +LexerModule lmGui4Cli(SCLEX_GUI4CLI, ColouriseGui4CliDoc, "gui4cli", FoldGui4Cli, gui4cliWordListDesc); + +#undef debug + diff --git a/scintilla/src/LexHTML.cxx b/scintilla/src/LexHTML.cxx new file mode 100644 index 00000000..f9959ab7 --- /dev/null +++ b/scintilla/src/LexHTML.cxx @@ -0,0 +1,2061 @@ +// Scintilla source code edit control +/** @file LexHTML.cxx + ** Lexer for HTML. + **/ +// Copyright 1998-2005 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#define SCE_HA_JS (SCE_HJA_START - SCE_HJ_START) +#define SCE_HA_VBS (SCE_HBA_START - SCE_HB_START) +#define SCE_HA_PYTHON (SCE_HPA_START - SCE_HP_START) + +enum script_type { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML, eScriptSGML, eScriptSGMLblock }; +enum script_mode { eHtml = 0, eNonHtmlScript, eNonHtmlPreProc, eNonHtmlScriptPreProc }; + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); +} + +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +static inline int MakeLowerCase(int ch) { + if (ch < 'A' || ch > 'Z') + return ch; + else + return ch - 'A' + 'a'; +} + +static void GetTextSegment(Accessor &styler, unsigned int start, unsigned int end, char *s, size_t len) { + size_t i = 0; + for (; (i < end - start + 1) && (i < len-1); i++) { + s[i] = static_cast(MakeLowerCase(styler[start + i])); + } + s[i] = '\0'; +} + +static script_type segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigned int end, script_type prevValue) { + char s[100]; + GetTextSegment(styler, start, end, s, sizeof(s)); + //Platform::DebugPrintf("Scripting indicator [%s]\n", s); + //Don + //if (strstr(s, "src")) // External script + //return eScriptNone; + //nod + if (strstr(s, "vbs")) + return eScriptVBS; + if (strstr(s, "pyth")) + return eScriptPython; + if (strstr(s, "javas")) + return eScriptJS; + if (strstr(s, "jscr")) + return eScriptJS; + if (strstr(s, "php")) + return eScriptPHP; + if (strstr(s, "xml")) + return eScriptXML; + + return prevValue; +} + +static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, unsigned int end) { + int iResult = 0; + char s[100]; + GetTextSegment(styler, start, end, s, sizeof(s)); + if (0 == strncmp(s, "php", 3)) { + iResult = 3; + } + + return iResult; +} + +static script_type ScriptOfState(int state) { + if ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) { + return eScriptPython; + } else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) { + return eScriptVBS; + } else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) { + return eScriptJS; + } else if ((state >= SCE_HPHP_DEFAULT) && (state <= SCE_HPHP_COMMENTLINE)) { + return eScriptPHP; + } else if ((state >= SCE_H_SGML_DEFAULT) && (state < SCE_H_SGML_BLOCK_DEFAULT)) { + return eScriptSGML; + } else if (state == SCE_H_SGML_BLOCK_DEFAULT) { + return eScriptSGMLblock; + } else { + return eScriptNone; + } +} + +static int statePrintForState(int state, script_mode inScriptType) { + int StateToPrint; + + if ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) { + StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_PYTHON); + } else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) { + StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_VBS); + } else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) { + StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_JS); + } else { + StateToPrint = state; + } + + return StateToPrint; +} + +static int stateForPrintState(int StateToPrint) { + int state; + + if ((StateToPrint >= SCE_HPA_START) && (StateToPrint <= SCE_HPA_IDENTIFIER)) { + state = StateToPrint - SCE_HA_PYTHON; + } else if ((StateToPrint >= SCE_HBA_START) && (StateToPrint <= SCE_HBA_STRINGEOL)) { + state = StateToPrint - SCE_HA_VBS; + } else if ((StateToPrint >= SCE_HJA_START) && (StateToPrint <= SCE_HJA_REGEX)) { + state = StateToPrint - SCE_HA_JS; + } else { + state = StateToPrint; + } + + return state; +} + +static inline bool IsNumber(unsigned int start, Accessor &styler) { + return IsADigit(styler[start]) || (styler[start] == '.') || + (styler[start] == '-') || (styler[start] == '#'); +} + +static inline bool isStringState(int state) { + bool bResult; + + switch (state) { + case SCE_HJ_DOUBLESTRING: + case SCE_HJ_SINGLESTRING: + case SCE_HJA_DOUBLESTRING: + case SCE_HJA_SINGLESTRING: + case SCE_HB_STRING: + case SCE_HBA_STRING: + case SCE_HP_STRING: + case SCE_HP_CHARACTER: + case SCE_HP_TRIPLE: + case SCE_HP_TRIPLEDOUBLE: + case SCE_HPA_STRING: + case SCE_HPA_CHARACTER: + case SCE_HPA_TRIPLE: + case SCE_HPA_TRIPLEDOUBLE: + case SCE_HPHP_HSTRING: + case SCE_HPHP_SIMPLESTRING: + case SCE_HPHP_HSTRING_VARIABLE: + case SCE_HPHP_COMPLEX_VARIABLE: + bResult = true; + break; + default : + bResult = false; + break; + } + return bResult; +} + +static inline bool stateAllowsTermination(int state) { + bool allowTermination = !isStringState(state); + if (allowTermination) { + switch (state) { + case SCE_HB_COMMENTLINE: + case SCE_HPHP_COMMENT: + case SCE_HP_COMMENTLINE: + case SCE_HPA_COMMENTLINE: + allowTermination = false; + } + } + return allowTermination; +} + +// not really well done, since it's only comments that should lex the %> and <% +static inline bool isCommentASPState(int state) { + bool bResult; + + switch (state) { + case SCE_HJ_COMMENT: + case SCE_HJ_COMMENTLINE: + case SCE_HJ_COMMENTDOC: + case SCE_HB_COMMENTLINE: + case SCE_HP_COMMENTLINE: + case SCE_HPHP_COMMENT: + case SCE_HPHP_COMMENTLINE: + bResult = true; + break; + default : + bResult = false; + break; + } + return bResult; +} + +static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { + bool wordIsNumber = IsNumber(start, styler); + char chAttr = SCE_H_ATTRIBUTEUNKNOWN; + if (wordIsNumber) { + chAttr = SCE_H_NUMBER; + } else { + char s[100]; + GetTextSegment(styler, start, end, s, sizeof(s)); + if (keywords.InList(s)) + chAttr = SCE_H_ATTRIBUTE; + } + if ((chAttr == SCE_H_ATTRIBUTEUNKNOWN) && !keywords) + // No keywords -> all are known + chAttr = SCE_H_ATTRIBUTE; + styler.ColourTo(end, chAttr); +} + +static int classifyTagHTML(unsigned int start, unsigned int end, + WordList &keywords, Accessor &styler, bool &tagDontFold, + bool caseSensitive) { + char s[30 + 2]; + // Copy after the '<' + unsigned int i = 0; + for (unsigned int cPos = start; cPos <= end && i < 30; cPos++) { + char ch = styler[cPos]; + if ((ch != '<') && (ch != '/')) { + s[i++] = caseSensitive ? ch : static_cast(MakeLowerCase(ch)); + } + } + + //The following is only a quick hack, to see if this whole thing would work + //we first need the tagname with a trailing space... + s[i] = ' '; + s[i+1] = '\0'; + + //...to find it in the list of no-container-tags + // (There are many more. We will need a keywordlist in the property file for this) + tagDontFold = (NULL != strstr("meta link img area br hr input ",s)); + + //now we can remove the trailing space + s[i] = '\0'; + + bool isScript = false; + char chAttr = SCE_H_TAGUNKNOWN; + if (s[0] == '!') { + chAttr = SCE_H_SGML_DEFAULT; + } else if (s[0] == '/') { // Closing tag + if (keywords.InList(s + 1)) + chAttr = SCE_H_TAG; + } else { + if (keywords.InList(s)) { + chAttr = SCE_H_TAG; + isScript = 0 == strcmp(s, "script"); + } + } + if ((chAttr == SCE_H_TAGUNKNOWN) && !keywords) { + // No keywords -> all are known + chAttr = SCE_H_TAG; + isScript = 0 == strcmp(s, "script"); + } + styler.ColourTo(end, chAttr); + return isScript ? SCE_H_SCRIPT : chAttr; +} + +static void classifyWordHTJS(unsigned int start, unsigned int end, + WordList &keywords, Accessor &styler, script_mode inScriptType) { + char chAttr = SCE_HJ_WORD; + bool wordIsNumber = IsADigit(styler[start]) || (styler[start] == '.'); + if (wordIsNumber) + chAttr = SCE_HJ_NUMBER; + else { + char s[30 + 1]; + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { + s[i] = styler[start + i]; + } + s[i] = '\0'; + if (keywords.InList(s)) + chAttr = SCE_HJ_KEYWORD; + } + styler.ColourTo(end, statePrintForState(chAttr, inScriptType)); +} + +static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, script_mode inScriptType) { + char chAttr = SCE_HB_IDENTIFIER; + bool wordIsNumber = IsADigit(styler[start]) || (styler[start] == '.'); + if (wordIsNumber) + chAttr = SCE_HB_NUMBER; + else { + char s[100]; + GetTextSegment(styler, start, end, s, sizeof(s)); + if (keywords.InList(s)) { + chAttr = SCE_HB_WORD; + if (strcmp(s, "rem") == 0) + chAttr = SCE_HB_COMMENTLINE; + } + } + styler.ColourTo(end, statePrintForState(chAttr, inScriptType)); + if (chAttr == SCE_HB_COMMENTLINE) + return SCE_HB_COMMENTLINE; + else + return SCE_HB_DEFAULT; +} + +static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord, script_mode inScriptType) { + bool wordIsNumber = IsADigit(styler[start]); + char s[30 + 1]; + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { + s[i] = styler[start + i]; + } + s[i] = '\0'; + char chAttr = SCE_HP_IDENTIFIER; + if (0 == strcmp(prevWord, "class")) + chAttr = SCE_HP_CLASSNAME; + else if (0 == strcmp(prevWord, "def")) + chAttr = SCE_HP_DEFNAME; + else if (wordIsNumber) + chAttr = SCE_HP_NUMBER; + else if (keywords.InList(s)) + chAttr = SCE_HP_WORD; + styler.ColourTo(end, statePrintForState(chAttr, inScriptType)); + strcpy(prevWord, s); +} + +// Update the word colour to default or keyword +// Called when in a PHP word +static void classifyWordHTPHP(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { + char chAttr = SCE_HPHP_DEFAULT; + bool wordIsNumber = IsADigit(styler[start]) || (styler[start] == '.' && start+1 <= end && IsADigit(styler[start+1])); + if (wordIsNumber) + chAttr = SCE_HPHP_NUMBER; + else { + char s[100]; + GetTextSegment(styler, start, end, s, sizeof(s)); + if (keywords.InList(s)) + chAttr = SCE_HPHP_WORD; + } + styler.ColourTo(end, chAttr); +} + +static bool isWordHSGML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { + char s[30 + 1]; + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { + s[i] = styler[start + i]; + } + s[i] = '\0'; + return keywords.InList(s); +} + +static bool isWordCdata(unsigned int start, unsigned int end, Accessor &styler) { + char s[30 + 1]; + unsigned int i = 0; + for (; i < end - start + 1 && i < 30; i++) { + s[i] = styler[start + i]; + } + s[i] = '\0'; + return (0 == strcmp(s, "[CDATA[")); +} + +// Return the first state to reach when entering a scripting language +static int StateForScript(script_type scriptLanguage) { + int Result; + switch (scriptLanguage) { + // Modif by Don + /* + case eScriptVBS: + Result = SCE_HB_START; + break; + */ + case eScriptJS: + Result = SCE_HJ_START; + break; + // Fidom by Don + case eScriptPython: + Result = SCE_HP_START; + break; + case eScriptPHP: + Result = SCE_HPHP_DEFAULT; + break; + case eScriptXML: + Result = SCE_H_TAGUNKNOWN; + break; + case eScriptSGML: + Result = SCE_H_SGML_DEFAULT; + break; + default : + // Modif by Don + //Result = SCE_HJ_START; + Result = SCE_HB_START; + // Fidom by Don + break; + } + return Result; +} + +static inline bool ishtmlwordchar(char ch) { + return !isascii(ch) || + (isalnum(ch) || ch == '.' || ch == '-' || ch == '_' || ch == ':' || ch == '!' || ch == '#'); +} + +static inline bool issgmlwordchar(char ch) { + return !isascii(ch) || + (isalnum(ch) || ch == '.' || ch == '_' || ch == ':' || ch == '!' || ch == '#' || ch == '['); +} + +static inline bool IsPhpWordStart(const unsigned char ch) { + return (isascii(ch) && (isalpha(ch) || (ch == '_'))) || (ch >= 0x7f); +} + +static inline bool IsPhpWordChar(char ch) { + return IsADigit(ch) || IsPhpWordStart(ch); +} + +static bool InTagState(int state) { + return state == SCE_H_TAG || state == SCE_H_TAGUNKNOWN || + state == SCE_H_SCRIPT || + state == SCE_H_ATTRIBUTE || state == SCE_H_ATTRIBUTEUNKNOWN || + state == SCE_H_NUMBER || state == SCE_H_OTHER || + state == SCE_H_DOUBLESTRING || state == SCE_H_SINGLESTRING; +} + +static bool IsCommentState(const int state) { + return state == SCE_H_COMMENT || state == SCE_H_SGML_COMMENT; +} + +static bool IsScriptCommentState(const int state) { + return state == SCE_HJ_COMMENT || state == SCE_HJ_COMMENTLINE || state == SCE_HJA_COMMENT || + state == SCE_HJA_COMMENTLINE || state == SCE_HB_COMMENTLINE || state == SCE_HBA_COMMENTLINE; +} + +static bool isLineEnd(char ch) { + return ch == '\r' || ch == '\n'; +} + +static bool isOKBeforeRE(char ch) { + return (ch == '(') || (ch == '=') || (ch == ','); +} + +static bool isPHPStringState(int state) { + return + (state == SCE_HPHP_HSTRING) || + (state == SCE_HPHP_SIMPLESTRING) || + (state == SCE_HPHP_HSTRING_VARIABLE) || + (state == SCE_HPHP_COMPLEX_VARIABLE); +} + +static int FindPhpStringDelimiter(char *phpStringDelimiter, const int phpStringDelimiterSize, int i, const int lengthDoc, Accessor &styler) { + int j; + while (i < lengthDoc && (styler[i] == ' ' || styler[i] == '\t')) + i++; + phpStringDelimiter[0] = '\n'; + for (j = i; j < lengthDoc && styler[j] != '\n' && styler[j] != '\r'; j++) { + if (j - i < phpStringDelimiterSize - 2) + phpStringDelimiter[j-i+1] = styler[j]; + else + i++; + } + phpStringDelimiter[j-i+1] = '\0'; + return j; +} + +static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + WordList &keywords5 = *keywordlists[4]; + WordList &keywords6 = *keywordlists[5]; // SGML (DTD) keywords + + // Lexer for HTML requires more lexical states (7 bits worth) than most lexers + styler.StartAt(startPos, STYLE_MAX); + char prevWord[200]; + prevWord[0] = '\0'; + char phpStringDelimiter[200]; // PHP is not limited in length, we are + phpStringDelimiter[0] = '\0'; + int StateToPrint = initStyle; + int state = stateForPrintState(StateToPrint); + + // If inside a tag, it may be a script tag, so reread from the start to ensure any language tags are seen + if (InTagState(state)) { + while ((startPos > 0) && (InTagState(styler.StyleAt(startPos - 1)))) { + startPos--; + length++; + } + state = SCE_H_DEFAULT; + } + // String can be heredoc, must find a delimiter first + while (startPos > 0 && isPHPStringState(state) && state != SCE_HPHP_SIMPLESTRING) { + startPos--; + length++; + state = styler.StyleAt(startPos); + } + styler.StartAt(startPos, STYLE_MAX); + + int lineCurrent = styler.GetLine(startPos); + int lineState; + if (lineCurrent > 0) { + lineState = styler.GetLineState(lineCurrent); + } else { + // Default client and ASP scripting language is JavaScript + lineState = eScriptJS << 8; + // Don + //lineState |= styler.GetPropertyInt("asp.default.language", eScriptJS) << 4; + lineState |= styler.GetPropertyInt("asp.default.language", eScriptVBS) << 4; + //nod + } + script_mode inScriptType = script_mode((lineState >> 0) & 0x03); // 2 bits of scripting mode + bool tagOpened = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag + bool tagClosing = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag + bool tagDontFold = false; //some HTML tags should not be folded + script_type aspScript = script_type((lineState >> 4) & 0x0F); // 4 bits of script name + script_type clientScript = script_type((lineState >> 8) & 0x0F); // 4 bits of script name + int beforePreProc = (lineState >> 12) & 0xFF; // 8 bits of state + + script_type scriptLanguage = ScriptOfState(state); + + const bool foldHTML = styler.GetPropertyInt("fold.html", 0) != 0; + const bool fold = foldHTML && styler.GetPropertyInt("fold", 0); + const bool foldHTMLPreprocessor = foldHTML && styler.GetPropertyInt("fold.html.preprocessor", 1); + const bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + const bool caseSensitive = styler.GetPropertyInt("html.tags.case.sensitive", 0) != 0; + + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + int visibleChars = 0; + + char chPrev = ' '; + char ch = ' '; + char chPrevNonWhite = ' '; + // look back to set chPrevNonWhite properly for better regex colouring + if (scriptLanguage == eScriptJS && startPos > 0) { + int back = startPos; + int style = 0; + while (--back) { + style = styler.StyleAt(back); + if (style < SCE_HJ_DEFAULT || style > SCE_HJ_COMMENTDOC) + // includes SCE_HJ_COMMENT & SCE_HJ_COMMENTLINE + break; + } + if (style == SCE_HJ_SYMBOLS) { + chPrevNonWhite = styler.SafeGetCharAt(back); + } + } + + styler.StartSegment(startPos); + const int lengthDoc = startPos + length; + for (int i = startPos; i < lengthDoc; i++) { + const char chPrev2 = chPrev; + chPrev = ch; + if (!isspacechar(ch) && state != SCE_HJ_COMMENT && + state != SCE_HJ_COMMENTLINE && state != SCE_HJ_COMMENTDOC) + chPrevNonWhite = ch; + ch = styler[i]; + char chNext = styler.SafeGetCharAt(i + 1); + const char chNext2 = styler.SafeGetCharAt(i + 2); + + // Handle DBCS codepages + if (styler.IsLeadByte(ch)) { + chPrev = ' '; + i += 1; + continue; + } + + if ((!isspacechar(ch) || !foldCompact) && fold) + visibleChars++; + + // decide what is the current state to print (depending of the script tag) + StateToPrint = statePrintForState(state, inScriptType); + + // handle script folding + if (fold) { + switch (scriptLanguage) { + case eScriptJS: + case eScriptPHP: + //not currently supported case eScriptVBS: + + if ((state != SCE_HPHP_COMMENT) && (state != SCE_HPHP_COMMENTLINE) && (state != SCE_HJ_COMMENT) && (state != SCE_HJ_COMMENTLINE) && (state != SCE_HJ_COMMENTDOC) && (!isStringState(state))) { + //Platform::DebugPrintf("state=%d, StateToPrint=%d, initStyle=%d\n", state, StateToPrint, initStyle); + //if ((state == SCE_HPHP_OPERATOR) || (state == SCE_HPHP_DEFAULT) || (state == SCE_HJ_SYMBOLS) || (state == SCE_HJ_START) || (state == SCE_HJ_DEFAULT)) { + if ((ch == '{') || (ch == '}')) { + levelCurrent += (ch == '{') ? 1 : -1; + } + } + break; + case eScriptPython: + if (state != SCE_HP_COMMENTLINE) { + if ((ch == ':') && ((chNext == '\n') || (chNext == '\r' && chNext2 == '\n'))) { + levelCurrent++; + } else if ((ch == '\n') && !((chNext == '\r') && (chNext2 == '\n')) && (chNext != '\n')) { + // check if the number of tabs is lower than the level + int Findlevel = (levelCurrent & ~SC_FOLDLEVELBASE) * 8; + for (int j = 0; Findlevel > 0; j++) { + char chTmp = styler.SafeGetCharAt(i + j + 1); + if (chTmp == '\t') { + Findlevel -= 8; + } else if (chTmp == ' ') { + Findlevel--; + } else { + break; + } + } + + if (Findlevel > 0) { + levelCurrent -= Findlevel / 8; + if (Findlevel % 8) + levelCurrent--; + } + } + } + break; + default: + break; + } + } + + if ((ch == '\r' && chNext != '\n') || (ch == '\n')) { + // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix) + // Avoid triggering two times on Dos/Win + // New line -> record any line state onto /next/ line + if (fold) { + int lev = levelPrev; + if (visibleChars == 0) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + + styler.SetLevel(lineCurrent, lev); + visibleChars = 0; + levelPrev = levelCurrent; + } + lineCurrent++; + styler.SetLineState(lineCurrent, + ((inScriptType & 0x03) << 0) | + ((tagOpened & 0x01) << 2) | + ((tagClosing & 0x01) << 3) | + ((aspScript & 0x0F) << 4) | + ((clientScript & 0x0F) << 8) | + ((beforePreProc & 0xFF) << 12)); + } + + // generic end of script processing + else if ((inScriptType == eNonHtmlScript) && (ch == '<') && (chNext == '/')) { + // Check if it's the end of the script tag (or any other HTML tag) + switch (state) { + // in these cases, you can embed HTML tags (to confirm !!!!!!!!!!!!!!!!!!!!!!) + case SCE_H_DOUBLESTRING: + case SCE_H_SINGLESTRING: + case SCE_HJ_COMMENT: + case SCE_HJ_COMMENTDOC: + //case SCE_HJ_COMMENTLINE: // removed as this is a common thing done to hide + // the end of script marker from some JS interpreters. + case SCE_HJ_DOUBLESTRING: + case SCE_HJ_SINGLESTRING: + case SCE_HJ_REGEX: + case SCE_HB_STRING: + case SCE_HP_STRING: + case SCE_HP_TRIPLE: + case SCE_HP_TRIPLEDOUBLE: + break; + default : + // check if the closing tag is a script tag + if (state == SCE_HJ_COMMENTLINE) { + char tag[7]; // room for the

      +9+E=i;0!6^IPN>p== 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 +operator-> +operator>= +operator>> +operator>>= +ostream +ostream_type +ostringstream +out +outp +outport +outportb +output_iterator +outpw +outtext +outtextxy +overflow +pair +parsfnm +partial_sort +partial_sort_copy +partial_sum +partition +pbackfail +pbase +pbump +pcount +peek +peekb +perror +pieslice +plus +pointer +pointer_to_binary_function +pointer_to_unary_function +poke +pokeb +polar +poly +polyl +pop +pop_back +pop_front +pop_heap +pos_format +pos_type +positive_sign +pow +pow10 +pow10l +powl +pptr +precision +prev_permutation +printf +priority_queue +private +protected +ptr_fun +pubimbue +public +pubseekoff +pubseekpos +pubsetbuf +pubsync +push +push_back +push_front +push_heap +put +putback +putc +putch +putchar +putenv +putimage +putpixel +puts +puttext +putw +pword +qsort +queue +quiet_NaN +radix +raise +rand +randbrd +randbwr +random +random_access_iterator +random_shuffle +randomize +raw_storage_iterator +rbegin +rdbuf +rdstate +read +readdir +readsome +real +realloc +rectangle +reference +register +register_callback +registerbgidriver +registerbgifont +registerfarbgidriver +registerfarbgifont +reinterpret_cast +release +remove +remove_copy +remove_copy_if +remove_if +rename +rend +replace +replace_copy +replace_copy_if +replace_if +reserve +reset +resetiosflag +resize +restorecrtmode +return +return_temporary_buffer +reverse +reverse_bidirectional_iterator +reverse_copy +reverse_iterator +rewind +rewinddir +rfind +right +rmdir +rmtmp +rotate +rotate_copy +round_error +round_style +sb_type +sbrk +sbumpc +scan_is +scan_not +scanf +scientific +search +search_n +searchpath +sector +seekdir +seekg +seekoff +seekp +seekpos +segread +sentry +set +set_difference +set_intersection +set_new_handler +set_symmetric_difference +set_union +setactivepage +setallpalette +setaspectratio +setbase +setbkcolor +setblock +setbuf +setcbrk +setcolor +setdate +setdisk +setdta +setf +setfill +setfillpattern +setfillstyle +setftime +setg +setgraphbufsize +setgraphmode +setiosflag +setjmp +setlinestyle +setlocale +setmem +setmode +setp +setpalette +setprecision +setrgbpalette +setstate +settextjustify +settextstyle +settime +setusercharsize +setvbuf +setvect +setverify +setviewport +setvisualpage +setw +setwritemode +sgetc +sgetn +short +showbase +showmanyc +showpoint +showpos +signal +signaling_NaN +signed +sin +sinh +sinhl +sinl +size +size_type +sizeof +skipws +sleep +snextc +sopen +sort +sort_heap +sound +spawnl +spawnle +spawnlp +spawnlpe +spawnv +spawnve +spawnvp +spawnvpe +splice +sprintf +sputbackc +sputc +sputn +sqrt +sqrtl +srand +sscanf +stable_partition +stable_sort +stack +stackavail +stat +state +state_type +static +static_cast +stime +stpcpy +str +strcat +strchr +strcmp +strcmpi +strcoll +strcpy +strcspn +strdup +streambuf +streambuf_type +strerror +strftime +stricmp +string +string_type +stringbuf +stringstream +strlen +strlwr +strncat +strncmp +strncmpi +strncpy +strnicmp +strnset +strpbrk +strrchr +strrev +strset +strspn +strstr +strtod +strtok +strtol +strtoul +struct +strupr +strxfrm +substr +sungetc +swab +swap +swap_ranges +switch +sync +sync_with_stdio +system +table +tan +tanh +tanhl +tanl +tell +tellg +tellp +template +tempnam +test +textattr +textbackground +textcolor +textheight +textmode +textwidth +this +thousands_sep +thread +thread2 +throw +tie +time +times +tinyness_before +tmpfile +tmpnam +to_char_type +to_int_type +to_string +to_ulong +toascii +tolower +top +toupper +traits +traits_type +transform +traps +true +truename +try +typedef +typeid +typename +tzset +uflow +ultoa +umask +unary_function +unary_negate +underflow +unget +ungetc +ungetch +uninitialized_copy +uninitialized_fill +uninitialized_fill_n +union +unique +unique_copy +unitbuf +unixtodos +unlink +unlock +unsetf +unsigned +upper_bound +uppercase +using +utime +va_arg +va_end +va_list +va_start +value_comp +value_type +vector +vfprintf +vfscanf +virtual +void +void* +volatile +vprintf +vscanf +vsprintf +vsscanf +wcerr +wchar_t +wcin +wclog +wcout +wcstombs +wctomb +wfilebuf +wfstream +what +wherex +wherey +which_open_mode +while +widen +width +wifstream +window +wios +wistream +wistringstream +wofstream +wostream +wostringstream +write +ws +wstreambuf +wstring +wstringbuf +wstringstream +xalloc +xsgetn +xsputn diff --git a/PowerEditor/bin/plugins/APIs/cs.api b/PowerEditor/bin/plugins/APIs/cs.api new file mode 100644 index 00000000..0743b648 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/cs.api @@ -0,0 +1,228 @@ +abstract +as +base +bool +break +byte +byte +case +catch +char +checked +class +Comparer +Console +Console.Write( +Console.WriteLine( +const +continue +DateTime +decimal +default +Delegate +delegate +Dictionary +Dictionary.Enumerator +Dictionary.KeyCollection +Dictionary.KeyCollection.Enumerator +Dictionary.ValueCollection +Dictionary.ValueCollection.Enumerator +do +double +double +else +enum +EqualityComparer +event +Exception +explicit +extern +false +FileStream +finally +fixed +float +float +for +foreach +goto +ICollection +IComparer +IDictionary +IEnumerable +IEnumerator +IEqualityComparer +if +IList +implicit +in +int +Int16 +Int32 +Int64 +interface +internal +IntPtr +is +KeyNotFoundException +KeyValuePair +LinkedList +LinkedList.Enumerator +LinkedListNode +List +List.Enumerator +lock +long +Microsoft.CSharp +Microsoft.JScript +Microsoft.VisualBasic +Microsoft.Vsa +Microsoft.Win32 +namespace +new +null +object +object +operator +out +override +params +private +protected +public +Queue +Queue.Enumerator +readonly +ref +return +sbyte +sbyte +sealed +short +sizeof +SortedDictionary +SortedDictionary.Enumerator +SortedDictionary.KeyCollection +SortedDictionary.KeyCollection.Enumerator +SortedDictionary.ValueCollection +SortedDictionary.ValueCollection.Enumerator +SortedList +Stack +Stack.Enumerator +stackalloc +static +StreamWriter +string +StringBuilder +struct +switch +System +System.CodeDom +System.CodeDom.Compiler +System.Collections +System.Collections.Specialized +System.ComponentModel +System.ComponentModel.Design +System.ComponentModel.Design.Serialization +System.Configuration +System.Configuration.Assemblies +System.Configuration.Install +System.Data +System.Data.Common +System.Data.OleDb +System.Data.SqlClient +System.Data.SqlTypes +System.Diagnostics +System.Diagnostics.SymbolStore +System.DirectoryServices +System.Drawing +System.Drawing.Design +System.Drawing.Drawing2D +System.Drawing.Imaging +System.Drawing.Printing +System.Drawing.Text +System.EnterpriseServices +System.EnterpriseServices.CompensatingResourceManager +System.Globalization +System.IO +System.IO.IsolatedStorage +System.Management +System.Management.Instrumentation +System.Messaging +System.Net +System.Net.Sockets +System.Reflection +System.Reflection.Emit +System.Resources +System.Runtime.CompilerServices +System.Runtime.InteropServices +System.Runtime.InteropServices.Expando +System.Runtime.Remoting +System.Runtime.Remoting.Activation +System.Runtime.Remoting.Channels +System.Runtime.Remoting.Channels.Http +System.Runtime.Remoting.Channels.Tcp +System.Runtime.Remoting.Contexts +System.Runtime.Remoting.Lifetime +System.Runtime.Remoting.Messaging +System.Runtime.Remoting.Metadata +System.Runtime.Remoting.Metadata.W3cXsd2001 +System.Runtime.Remoting.MetadataServices +System.Runtime.Remoting.Proxies +System.Runtime.Remoting.Services +System.Runtime.Serialization +System.Runtime.Serialization.Formatters +System.Runtime.Serialization.Formatters.Binary +System.Runtime.Serialization.Formatters.Soap +System.Security +System.Security.Cryptography +System.Security.Cryptography.X509Certificates +System.Security.Cryptography.Xml +System.Security.Permissions +System.Security.Policy +System.Security.Principal +System.ServiceProcess +System.Text +System.Text.RegularExpressions +System.Threading +System.Timers +System.Web +System.Web.Caching +System.Web.Configuration +System.Web.Hosting +System.Web.Mail +System.Web.Security +System.Web.Services +System.Web.Services.Configuration +System.Web.Services.Description +System.Web.Services.Discovery +System.Web.Services.Protocols +System.Web.SessionState +System.Web.UI +System.Web.UI.Design +System.Web.UI.Design.WebControls +System.Web.UI.HtmlControls +System.Web.UI.WebControls +System.Windows.Forms +System.Windows.Forms.Design +System.Xml +System.Xml.Schema +System.Xml.Serialization +System.Xml.XPath +System.Xml.Xsl +TextWriter +this +throw +true +try +typeof +uint +ulong +unchecked +unsafe +ushort +using +virtual +void +volatile +while \ No newline at end of file diff --git a/PowerEditor/bin/plugins/APIs/css.api b/PowerEditor/bin/plugins/APIs/css.api new file mode 100644 index 00000000..824f66c8 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/css.api @@ -0,0 +1,357 @@ +:active +:after +:before +:first +:first-child +:first-letter +:first-line +:focus +:hover +:lang +:left +:link +:right +:visited +@charset +@font-face +@import +@media +@page +ActiveBorder +ActiveCaption +AppWorkspace +ButtonFace +ButtonHighlight +ButtonShadow +ButtonText +CaptionText +GrayText +Highlight +HighlightText +InactiveBorder +InactiveCaption +InactiveCaptionText +InfoBackground +InfoText +MenuText +Scrollbar +ThreeDDarkShadow +ThreeDFace +ThreeDHighlight +ThreeDLightShadow +ThreeDShadow +Window +WindowFrame +WindowText +above +absolute +always +aqua +armenian +attr +auto +avoid +azimuth +background +background-attachment +background-color +background-image +background-position +background-repeat +baseline +behind +below +bidi-override +black +blink +block +blue +bold +bolder +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 +both +bottom +capitalize +caption +caption-side +center +center-left +center-right +circle +cjk-ideographic +clear +clip +close-quote +code +collapse +color +compact +condensed +content +continuous +counter-increment +counter-reset +crop +cros +crosshair +cue +cue-after +cue-before +cursor +decimal +decimal-leading-zero +default +deg +digits +direction +disc +display +e-resize +elevation +em +embed +empty-cells +ex +expanded +extra-condensed +extra-expanded +far-left +far-right +fast +faster +fixed +float +font +font-family +font-size +font-size-adjust +font-stretch +font-style +font-variant +font-weight +fuchsia +georgian +grad +gray +green +hebrew +height +help +hidden +hide +high +higher +hiragana +hiragana-iroha +hz +icon +inherit +inline +inline-table +inside +italic +justify +katakana +katakana-iroha +khz +landscape +left +left-side +leftwards +letter-spacing +level +lighter +lime +line-height +line-through +list-item +list-style +list-style-image +list-style-position +list-style-type +loud +low +lower +lower-alpha +lower-greek +lower-latin +lower-roman +lowercase +ltr +margin +margin-bottom +margin-left +margin-right +margin-top +marker +marker-offset +marks +maroon +max-height +max-width +medium +menu +message-box +middle +min-height +min-width +mix +move +ms +n-resize +narrower +navy +ne-resize +no-close-quote +no-open-quote +no-repeat +none +normal +nowrap +nw-resize +oblique +olive +once +open-quote +orphans +outline +outline-color +outline-style +outline-width +outside +overflow +overline +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 +pointer +portrait +position +pre +pt +purple +px +quotes +rad +red +relative +repeat +repeat-x +repeat-y +richness +right +right-side +rightwards +rtl +run-in +s-resize +scroll +se-resize +semi-condensed +semi-expanded +separate +show +silent +silver +size +slow +slower +small-caps +small-caption +soft +speak +speak-header +speak-numeral +speak-ponctuation +speech-rate +spell-out +square +static +status-bar +stress +sub +super +sw-resize +table +table-caption +table-cell +table-column +table-column-group +table-footer-group +table-header-group +table-layout +table-row +table-row-group +teal +text +text-align +text-bottom +text-decoration +text-indent +text-shadow +text-top +text-transform +top +transparent +ultra-condensed +ultra-expanded +underline +unicode-bidi +upper-alpha +upper-latin +upper-roman +uppercase +vertical-align +visibility +visible +voice-family +volume +w-resize +wait +white +white-space +wider +widows +width +word-spacing +x-fast +x-high +x-loud +x-low +x-slow +x-soft +yellow +z-index diff --git a/PowerEditor/bin/plugins/APIs/flash.api b/PowerEditor/bin/plugins/APIs/flash.api new file mode 100644 index 00000000..dd2cd0e4 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/flash.api @@ -0,0 +1,930 @@ +"allowscale" +"exec" +"fullscreen" +"quit" +"showmenu" +"trapallkeys" +#include +ALT +ASSetNative +ASSetPropFlags +ASconstructor +ASnative +Accessibility +Accessibility.isActive +Array +Array +AsBroadcaster +BACKSPACE +BACKSPACE +Boolean +Boolean +Button +CAPSLOCK +CAPSLOCK +CONTROL +CONTROL +Camera +Capabilities +Color +Color +Cookie +CustomActions +CustomActions.get +CustomActions.install +CustomActions.list +CustomActions.uninstall +DELETEKEY +DELETEKEY +DOWN +DOWN +Date +Date +Date.UTC +END +END +ENTER +ENTER +ESCAPE +ESCAPE +FStyleFormat +HOME +HOME +INSERT +INSERT +Infinity +IsActive +Key +Key +Key.ALT +Key.BACKSPACE +Key.CAPSLOCK +Key.CONTROL +Key.DELETEKEY +Key.DOWN +Key.END +Key.ENTER +Key.ESCAPE +Key.HOME +Key.INSERT +Key.LEFT +Key.PGDN +Key.PGUP +Key.RIGHT +Key.SHIFT +Key.SPACE +Key.TAB +Key.UP +Key.getAscii +Key.getCode +Key.isDown +Key.isToggled +LEFT +LEFT +LN10 +LN10 +LN2 +LN2 +LOG10E +LOG10E +LOG2E +LOG2E +LoadVars +LocalConnection +MAX_VALUE +MAX_VALUE +MIN_VALUE +MIN_VALUE +MMSave +Math +Math +Math.E +Math.LN10 +Math.LN2 +Math.LOG10E +Math.LOG2E +Math.PI +Math.SQRT1_2 +Math.SQRT2 +Math.abs +Math.acos +Math.asin +Math.atan +Math.atan2 +Math.ceil +Math.cos +Math.exp +Math.floor +Math.log +Math.max +Math.min +Math.pow +Math.random +Math.round +Math.sin +Math.sqrt +Math.tan +Microphone +Mouse +Mouse +Mouse.hide +Mouse.show +MovieClip +MovieClip +NEGATIVE_INFINITY +NEGATIVE_INFINITY +NaN +NaN +NetConnection +NetStream +Number +Number +Number.MAX_VALUE +Number.MIN_VALUE +Number.NEGATIVE_INFINITY +Number.NaN +Number.POSITIVE_INFINITY +Object +Object +Object.registerClass +PGDN +PGDN +PGUP +PGUP +PI +PI +POSITIVE_INFINITY +POSITIVE_INFINITY +Product +RIGHT +RIGHT +SHIFT +SHIFT +SPACE +SPACE +SQRT1_2 +SQRT1_2 +SQRT2 +SQRT2 +Selection +Selection +Selection.getBeginIndex +Selection.getCaretIndex +Selection.getEndIndex +Selection.getFocus +Selection.setFocus +Selection.setSelection +SendEvent +SharedObject +ShowSettings +Sound +Sound +Stage +Stage.align +Stage.height +Stage.scaleMode +Stage.showMenu +Stage.width +String +String +String.fromCharCode +System +System.capabilities +System.capabilities.hasAccessibility +System.capabilities.hasAudio +System.capabilities.hasAudioEncoder +System.capabilities.hasMP3 +System.capabilities.hasVideoEncoder +System.capabilities.input +System.capabilities.isDebugger +System.capabilities.language +System.capabilities.manufacturer +System.capabilities.os +System.capabilities.pixelAspectRatio +System.capabilities.screenColor +System.capabilities.screenDPI +System.capabilities.screenResolutionX +System.capabilities.screenResolutionY +System.capabilities.serverString +System.capabilities.version +System.security.allowDomain +TAB +TAB +TextField +TextFormat +UP +UP +UTC +UTC +Video +XML +XML +XMLNode +XMLSocket +XMLSocket +__proto__ +_alpha +_alpha +_currentframe +_currentframe +_droptarget +_droptarget +_focusrect +_focusrect +_framesloaded +_framesloaded +_global +_height +_height +_highquality +_highquality +_level +_listeners +_name +_name +_parent +_parent +_quality +_quality +_root +_root +_rotation +_rotation +_soundbuftime +_soundbuftime +_target +_target +_totalframes +_totalframes +_url +_url +_visible +_visible +_width +_width +_x +_x +_xmouse +_xmouse +_xscale +_xscale +_y +_y +_ymouse +_ymouse +_yscale +_yscale +a +abs +abs +acos +acos +add +add +addListener +addProperty +addheader +align +allowDomain +and +appendChild +appendChild +apply +arguments +arguments.callee +arguments.caller +asin +asin +atan +atan +atan2 +atan2 +attachAudio +attachMovie +attachMovie +attachSound +attachSound +attachVideo +attributes +attributes +autoSize +background +backgroundColor +beginFill +beginGradientFill +blockIndent +bold +border +borderColor +bottomScroll +break +break +broadcastMessage +bullet +call +call +callee +caller +capabilities +case +ceil +ceil +charAt +charAt +charCodeAt +charCodeAt +childNodes +childNodes +chr +chr +clear +clearInterval +cloneNode +cloneNode +close +close +color +concat +concat +condenseWhite +connect +connect +constructor +constructor +contentType +continue +continue +cos +cos +createElement +createElement +createEmptyMovieClip +createTextField +createTextNode +createTextNode +curveTo +data +data +decode +default +delete +delete +do +do +docTypeDecl +docTypeDecl +domain +dragOut +dragOut +dragOver +dragOver +duplicateMovieClip +duplicateMovieClip +duration +else +else +embedFonts +enabled +endFill +enterFrame +enterFrame +eq +escape +escape +eval +eval +evaluate +exp +exp +false +false +firstChild +firstChild +floor +floor +flush +focusEnabled +font +for +for +fromCharCode +fromCharCode +fscommand +fscommand +function +function +ge +get +getAscii +getAscii +getBeginIndex +getBeginIndex +getBounds +getBounds +getBytesLoaded +getBytesLoaded +getBytesTotal +getBytesTotal +getCaretIndex +getCaretIndex +getCode +getCode +getCookie +getDate +getDate +getDay +getDay +getDepth +getDuration +getEndIndex +getEndIndex +getFocus +getFocus +getFontList +getFullYear +getFullYear +getHours +getHours +getMilliseconds +getMilliseconds +getMinutes +getMinutes +getMonth +getMonth +getNewTextFormat +getPan +getPan +getPosition +getProperty +getProperty +getRGB +getRGB +getSeconds +getSeconds +getSize +getTextExtent +getTextFormat +getTime +getTime +getTimer +getTimer +getTimezoneOffset +getTimezoneOffset +getTransform +getTransform +getURL +getURL +getUTCDate +getUTCDate +getUTCDay +getUTCDay +getUTCFullYear +getUTCFullYear +getUTCHours +getUTCHours +getUTCMilliseconds +getUTCMilliseconds +getUTCMinutes +getUTCMinutes +getUTCMonth +getUTCMonth +getUTCSeconds +getUTCSeconds +getUTCYear +getVersion +getVersion +getVolume +getVolume +getYear +getYear +globalToLocal +globalToLocal +gotoAndPlay +gotoAndPlay +gotoAndStop +gotoAndStop +gt +hasAccessibility +hasAudio +hasAudioEncoder +hasChildNodes +hasChildNodes +hasMP3 +hasOwnProperty +hasVideoEncoder +height +hide +hide +hitArea +hitTest +hitTest +hscroll +html +htmlText +if +if +ifFrameLoaded +ifFrameLoaded +ignoreWhite +in +in +include +indent +indexOf +indexOf +input +insertBefore +insertBefore +install +instanceof +int +int +isActive +isDebugger +isDown +isDown +isFinite +isFinite +isNaN +isNaN +isPropertyEnumerable +isPrototypeOf +isToggled +isToggled +italic +john@3wgraphics.net +join +join +keyDown +keyPress +keyPress +keyUp +language +lastChild +lastChild +lastIndexOf +lastIndexOf +le +leading +leftMargin +length +length +lineStyle +lineTo +list +load +load +loadMovie +loadMovie +loadMovieNum +loadMovieNum +loadSound +loadVariables +loadVariables +loadVariablesNum +loadVariablesNum +loaded +loaded +localToGlobal +localToGlobal +log +log +lt +manufacturer +max +max +maxChars +maxhscroll +maxscroll +maxscroll +mbchr +mbchr +mblength +mblength +mbord +mbord +mbsubstring +mbsubstring +metaInfo +meth +min +min +mouseDown +mouseDown +mouseMove +mouseUp +mouseUp +moveTo +multiline +ne +new +new +newline +newline +nextFrame +nextFrame +nextScene +nextScene +nextSibling +nextSibling +nodeName +nodeName +nodeType +nodeType +nodeValue +nodeValue +not +null +null +number +on +on +onChanged +onClipEvent +onClipEvent +onClose +onClose +onConnect +onConnect +onData +onDragOut +onDragOver +onEnterFrame +onKeyDown +onKeyUp +onKillFocus +onLoad +onLoad +onMouseDown +onMouseMove +onMouseUp +onPress +onRelease +onReleaseOutside +onResize +onRollOut +onRollOver +onScroller +onSetFocus +onSoundComplete +onUnload +onXML +onXML +or +ord +ord +os +parentNode +parentNode +parseFloat +parseFloat +parseInt +parseInt +parseXML +parseXML +password +pause +pixelAspectRatio +play +play +pop +pop +position +pow +pow +press +press +prevFrame +prevFrame +prevScene +prevScene +previousSibling +previousSibling +print +print +printAsBitmap +printAsBitmap +printAsBitmapNum +printNum +printNum +prototype +publish +push +push +random +random +receiveAudio +receiveVideo +registerClass +release +release +releaseOutside +releaseOutside +removeListener +removeMovieClip +removeMovieClip +removeNode +removeNode +removeTextField +replaceSel +restrict +return +return +reverse +reverse +rightMargin +rollOut +rollOut +rollOver +rollOver +round +round +scaleMode +screenColor +screenDPI +screenResolutionX +screenResolutionY +scroll +scroll +scrollString +security +seek +selectable +send +send +sendAndLoad +sendAndLoad +serverString +set +set +setBufferTime +setCookie +setDate +setDate +setDuration +setFocus +setFocus +setFps +setFullYear +setFullYear +setGain +setHours +setHours +setInterval +setKeyFrameInterval +setLoopback +setMask +setMilliseconds +setMilliseconds +setMinutes +setMinutes +setMode +setMonth +setMonth +setMotionLevel +setNewTextFormat +setPan +setPan +setPosition +setProperty +setProperty +setQuality +setRGB +setRGB +setRate +setSeconds +setSeconds +setSelection +setSelection +setSilenceLevel +setTextFormat +setTime +setTime +setTransform +setTransform +setUTCDate +setUTCDate +setUTCFullYear +setUTCFullYear +setUTCHours +setUTCHours +setUTCMilliseconds +setUTCMilliseconds +setUTCMinutes +setUTCMinutes +setUTCMonth +setUTCMonth +setUTCSeconds +setUTCSeconds +setUseEchoSuppression +setVolume +setVolume +setYear +setYear +shift +shift +show +show +showMenu +sin +sin +size +slice +slice +sort +sort +sortOn +splice +splice +split +split +sqrt +sqrt +start +start +startDrag +startDrag +status +status +stop +stop +stopAllSounds +stopAllSounds +stopDrag +stopDrag +substr +substr +substring +substring +super +swapDepths +swapDepths +switch +tabChildren +tabEnabled +tabIndex +tabStops +tan +tan +target +targetPath +targetPath +tellTarget +tellTarget +text +textColor +textHeight +textWidth +this +this +toLocaleString +toLowerCase +toLowerCase +toString +toString +toUpperCase +toUpperCase +toggleHighQuality +toggleHighQuality +trace +trace +trackAsMenu +true +true +type +typeof +typeof +undefined +underline +unescape +unescape +uninstall +unload +unloadMovie +unloadMovie +unloadMovieNum +unloadMovieNum +unshift +unshift +unwatch +updateAfterEvent +updateAfterEvent +url +useHandCursor +valueOf +valueOf +var +var +variable +version +void +void +watch +while +while +width +with +with +wordWrap +xmlDecl +xmlDecl diff --git a/PowerEditor/bin/plugins/APIs/fortran.api b/PowerEditor/bin/plugins/APIs/fortran.api new file mode 100644 index 00000000..96385e08 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/fortran.api @@ -0,0 +1,576 @@ +and. +eq. +eqv. +ge. +gt. +le. +lt. +ne. +neqv. +not. +or. +abs +access +achar +acos +acosd +action +adjustl +adjustr +admit +advance +aimag +aimax0 +aimin0 +aint +ajmax0 +ajmin0 +akmax0 +akmin0 +all +allocatable +allocate +allocated +alog +alog10 +amax0 +amax1 +amin0 +amin1 +amod +anint +any +apostrophe +asin +asind +assign +assignment +associate +associated +asynchronous +at +atan +atan2 +atan2d +atand +backspace +bind +bit_size +bitest +bitl +bitlr +bitrl +bjtest +bktest +blank +block +blockdata +blocksize +break +btest +cabs +call +carg +carriagecontrol +case +ccos +cdabs +cdcos +cdexp +cdlog +cdsin +cdsqrt +ceiling +cexp +char +character +class +clog +close +cmplx +common +complex +conjg +contains +continue +cos +cosd +cosh +cotan +cotand +count +cpu_time +cshift +csin +csqrt +cycle +dabs +dacos +dacosd +dasin +dasind +data +datan +datan2 +datan2d +datand +date +date_and_time +dble +dcmplx +dconjg +dcos +dcosd +dcosh +dcotan +dcotand +ddim +deallocate +decimal +decode +default +delim +dexp +dfloat +dfloti +dflotj +dflotk +digits +dim +dimag +dimension +dint +direct +dll_import +dlog +dlog10 +dmax1 +dmin1 +dmod +dnint +do +dot_product +double +doublecomplex +doubleprecision +dowhile +dprod +dreal +dsign +dsin +dsind +dsinh +dsqrt +dtan +dtand +dtanh +dvchk +else +elseif +elsewhere +encode +encoding +end +endassociate +endblockdata +enddo +endfile +endforall +endfunction +endif +endinterface +endmodule +endprogram +endselect +endsubroutine +endtype +endwhere +endwhile +entry +eor +eoshift +epsilon +equivalence +err +errmsg +error +errsns +execute +exist +exit +exp +exponent +external +file +find +flen +float +floati +floatj +floatk +floor +flush +fmt +forall +form +format +formatted +fraction +free +from +function +getarg +getcharqq +getcl +getdat +getenv +gettim +go +goto +guess +hfix +huge +iabs +iachar +iand +ibchng +ibclr +ibits +ibset +ichar +id +idate +identifier +idim +idint +idnint +ieor +if +ifix +iiabs +iiand +iibclr +iibits +iibset +iidim +iidint +iidnnt +iieor +iifix +iint +iior +iiqint +iiqnnt +iishft +iishftc +iisign +ilen +imag +imax0 +imax1 +imin0 +imin1 +imod +implicit +in +include +index +inint +inot +inout +inquire +int +int1 +int2 +int4 +int8 +intc +integer +intent +interface +intrinsic +intrup +invalop +iolength +iomsg +ior +iostat +iostat_msg +iqint +iqnint +isha +ishc +ishft +ishft +ishftc +ishl +isign +isnan +izext +jfix +jiand +jibclr +jibits +jibset +jidim +jidint +jidnnt +jieor +jifix +jint +jior +jiqint +jishft +jishftc +jisign +jmax0 +jmax1 +jmin0 +jmin1 +jmod +jnint +jnot +jzext +kiabs +kiand +kibclr +kibits +kibset +kidim +kidint +kieor +kifix +kind +kint +kior +kishft +kishftc +kisign +kmax0 +kmax1 +kmin0 +kmin1 +kmod +knint +knot +kzext +lacfar +lbound +leadz +len +len_trim +lenlge +lge +lgt +lle +llt +location +locking +locnear +log +log10 +logical +loop +lshift +malloc +map +matmul +max +max0 +max1 +maxexponent +maxloc +maxval +merge +min +min0 +min1 +minexponent +minloc +minval +mod +module +modulo +mvbits +name +named +namelist +nargs +nbreak +ndperr +ndpexc +nearest +nextrec +nint +nml +none +not +nullify +number +number_of_processors +nworkers +offset +only +open +opened +operator +optional +otherwise +out +ovefl +pack +pad +parameter +pass +pause +peekcharqq +pending +pointer +popcnt +poppar +pos +position +precfill +precision +present +print +private +procedure +product +program +prompt +protected +public +qabs +qacos +qacosd +qasin +qasind +qatan +qatan2 +qatand +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 +quit +quote +radix +radix +ran +rand +random +random_number +random_seed +randu +range +read +readwrite +real +rec +recl +record +recordtype +recursive +remote +repeat +reshape +result +return +rewind +rewrite +rrspacing +rshift +save +scale +scan +secnds +segment +select +selectcase +selected_int_kind +selected_real_kind +selecttype +sequence +sequential +set_exponent +setdat +settim +shape +sign +sin +sind +sinh +size +sizeof +sngl +snglq +spacing +spread +sqrt +stat +status +stop +stream +structure +subroutine +sum +system +system_clock +tan +tand +tanh +target +then +timer +tiny +to +transfer +transpose +trim +type +ubound +undfl +unformatted +union +unit +unlock +unpack +until +use +val +value +verify +virtual +volatile +wait +where +while +write +zabs +zcos +zexp +zlog +zsin +zsqrt \ No newline at end of file diff --git a/PowerEditor/bin/plugins/APIs/java.api b/PowerEditor/bin/plugins/APIs/java.api new file mode 100644 index 00000000..3ca6390e --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/java.api @@ -0,0 +1,3700 @@ +ARG_IN +ARG_INOUT +ARG_OUT +ASCII +AVT +AVTPart +AVTPartSimple +AVTPartXPath +AWTError +AWTEvent +AWTEventListener +AWTEventListenerProxy +AWTEventMulticaster +AWTException +AWTKeyStroke +AWTPermission +AbstractAction +AbstractActionPropertyChangeListener +AbstractBorder +AbstractButton +AbstractCellEditor +AbstractCollection +AbstractColorChooserPanel +AbstractDocument +AbstractFilter +AbstractInterruptibleChannel +AbstractLayoutCache +AbstractList +AbstractListModel +AbstractMap +AbstractMethodError +AbstractPreferences +AbstractSelectableChannel +AbstractSelectionKey +AbstractSelector +AbstractSequentialList +AbstractSet +AbstractSpinnerModel +AbstractTableModel +AbstractUndoableEdit +AbstractView +AbstractWriter +AccessControlContext +AccessControlException +AccessController +AccessException +Accessible +AccessibleAction +AccessibleBundle +AccessibleComponent +AccessibleContext +AccessibleEditableText +AccessibleExtendedComponent +AccessibleExtendedTable +AccessibleHTML +AccessibleHyperlink +AccessibleHypertext +AccessibleIcon +AccessibleKeyBinding +AccessibleObject +AccessibleRelation +AccessibleRelationSet +AccessibleResourceBundle +AccessibleRole +AccessibleSelection +AccessibleState +AccessibleStateSet +AccessibleTable +AccessibleTableModelChange +AccessibleText +AccessibleValue +AccountExpiredException +Acl +AclEntry +AclNotFoundException +Action +ActionEvent +ActionListener +ActionMap +ActionMapUIResource +Activatable +ActivateFailedException +ActivationDesc +ActivationException +ActivationGroup +ActivationGroupDesc +ActivationGroupID +ActivationID +ActivationInstantiator +ActivationMonitor +ActivationSystem +Activator +ActivatorHelper +ActivatorHolder +ActivatorOperations +ActiveEvent +ActiveObjectMap +AdapterActivator +AdapterActivatorOperations +AdapterAlreadyExists +AdapterAlreadyExistsHelper +AdapterInactive +AdapterInactiveHelper +AdapterNonExistent +AdapterNonExistentHelper +AddressHelper +AddressingDispositionException +AddressingDispositionHelper +Adjustable +AdjustmentEvent +AdjustmentListener +Adler32 +AdobeMarkerSegment +AffineTransform +AffineTransformOp +AlgorithmParameterGenerator +AlgorithmParameterGeneratorSpi +AlgorithmParameterSpec +AlgorithmParameters +AlgorithmParametersSpi +AllPermission +AlphaComposite +AlreadyBound +AlreadyBoundException +AlreadyBoundHelper +AlreadyBoundHolder +AlreadyConnectedException +AlternateIIOPAddressComponent +AncestorEvent +AncestorListener +AncestorNotifier +AncestorStepPattern +And +Annotation +Any +AnyHolder +AnyImpl +AnyImplHelper +AnySeqHelper +AnySeqHolder +AppConfigurationEntry +Applet +AppletContext +AppletInitializer +AppletStub +ApplicationException +Arc2D +ArcIterator +Area +AreaAveragingScaleFilter +Arg +ArithmeticException +Array +ArrayIndexOutOfBoundsException +ArrayList +ArrayStoreException +Arrays +AssertionError +AssertionStatusDirectives +AsyncBoxView +AsynchInvoke +AsynchronousCloseException +AttList +Attr +Attribute +AttributeDecl +AttributeException +AttributeInUseException +AttributeIterator +AttributeList +AttributeListImpl +AttributeModificationException +AttributeNode +AttributeNode1 +AttributeSet +AttributeSetUtilities +AttributeValue +AttributedCharacterIterator +AttributedString +Attributes +AttributesEx +AttributesExImpl +AttributesImpl +AudioClip +AuthPermission +AuthenticationException +AuthenticationNotSupportedException +Authenticator +Autoscroll +Autoscroller +AxesWalker +Axis +BAD_CONTEXT +BAD_INV_ORDER +BAD_OPERATION +BAD_PARAM +BAD_POLICY +BAD_POLICY_TYPE +BAD_POLICY_VALUE +BAD_TYPECODE +BRView +BackingStoreException +BadKind +BadLocationException +BadServerDefinition +BadServerDefinitionHelper +BadServerDefinitionHolder +BadServerIdHandler +BandCombineOp +BandedSampleModel +Base64 +BasicArrowButton +BasicAttribute +BasicAttributes +BasicBorders +BasicButtonListener +BasicButtonUI +BasicCheckBoxMenuItemUI +BasicCheckBoxUI +BasicColorChooserUI +BasicComboBoxEditor +BasicComboBoxRenderer +BasicComboBoxUI +BasicComboPopup +BasicDesktopIconUI +BasicDesktopPaneUI +BasicDirectoryModel +BasicDragGestureRecognizer +BasicDropTargetListener +BasicEditorPaneUI +BasicFileChooserUI +BasicFormattedTextFieldUI +BasicGraphicsUtils +BasicHTML +BasicIconFactory +BasicInternalFrameTitlePane +BasicInternalFrameUI +BasicLabelUI +BasicListUI +BasicLookAndFeel +BasicMenuBarUI +BasicMenuItemUI +BasicMenuUI +BasicOptionPaneUI +BasicPanelUI +BasicPasswordFieldUI +BasicPermission +BasicPopupMenuSeparatorUI +BasicPopupMenuUI +BasicProgressBarUI +BasicRadioButtonMenuItemUI +BasicRadioButtonUI +BasicRootPaneUI +BasicScrollBarUI +BasicScrollPaneUI +BasicSeparatorUI +BasicSliderUI +BasicSpinnerUI +BasicSplitPaneDivider +BasicSplitPaneUI +BasicStroke +BasicTabbedPaneUI +BasicTableHeaderUI +BasicTableUI +BasicTextAreaUI +BasicTextFieldUI +BasicTextPaneUI +BasicTextUI +BasicToggleButtonUI +BasicToolBarSeparatorUI +BasicToolBarUI +BasicToolTipUI +BasicTransferable +BasicTreeUI +BasicViewportUI +BatchUpdateException +BeanContext +BeanContextChild +BeanContextChildComponentProxy +BeanContextChildSupport +BeanContextContainerProxy +BeanContextEvent +BeanContextMembershipEvent +BeanContextMembershipListener +BeanContextProxy +BeanContextServiceAvailableEvent +BeanContextServiceProvider +BeanContextServiceProviderBeanInfo +BeanContextServiceRevokedEvent +BeanContextServiceRevokedListener +BeanContextServices +BeanContextServicesListener +BeanContextServicesSupport +BeanContextSupport +BeanDescriptor +BeanInfo +Beans +BevelBorder +Bidi +BigDecimal +BigInteger +BinaryRefAddr +BindException +Binding +BindingHelper +BindingHolder +BindingIterator +BindingIteratorHelper +BindingIteratorHolder +BindingIteratorImpl +BindingIteratorOperations +BindingIteratorPOA +BindingListHelper +BindingListHolder +BindingType +BindingTypeHelper +BindingTypeHolder +BitSet +BitSieve +Bits +Blob +BlockView +Book +Bool +BoolStack +Boolean +BooleanHolder +BooleanSeqHelper +BooleanSeqHolder +BootStrapActivation +BootstrapServer +Border +BorderFactory +BorderLayout +BorderUIResource +BoundedRangeModel +Bounds +Box +BoxLayout +BoxView +BoxedValueHelper +BreakDictionary +BreakIterator +Buffer +BufferCapabilities +BufferManagerFactory +BufferManagerRead +BufferManagerReadGrow +BufferManagerReadStream +BufferManagerWrite +BufferManagerWriteCollect +BufferManagerWriteGrow +BufferManagerWriteStream +BufferOverflowException +BufferQueue +BufferStrategy +BufferUnderflowException +BufferedImage +BufferedImageFilter +BufferedImageOp +BufferedInputStream +BufferedOutputStream +BufferedReader +BufferedWriter +Button +ButtonGroup +ButtonModel +ButtonPeer +ButtonUI +Byte +ByteArrayInputStream +ByteArrayOutputStream +ByteBuffer +ByteBufferAsCharBufferB +ByteBufferAsCharBufferL +ByteBufferAsCharBufferRB +ByteBufferAsCharBufferRL +ByteBufferAsDoubleBufferB +ByteBufferAsDoubleBufferL +ByteBufferAsDoubleBufferRB +ByteBufferAsDoubleBufferRL +ByteBufferAsFloatBufferB +ByteBufferAsFloatBufferL +ByteBufferAsFloatBufferRB +ByteBufferAsFloatBufferRL +ByteBufferAsIntBufferB +ByteBufferAsIntBufferL +ByteBufferAsIntBufferRB +ByteBufferAsIntBufferRL +ByteBufferAsLongBufferB +ByteBufferAsLongBufferL +ByteBufferAsLongBufferRB +ByteBufferAsLongBufferRL +ByteBufferAsShortBufferB +ByteBufferAsShortBufferL +ByteBufferAsShortBufferRB +ByteBufferAsShortBufferRL +ByteBufferWithInfo +ByteChannel +ByteHolder +ByteLookupTable +ByteOrder +CDATASection +CDREncapsCodec +CDRInputStream +CDRInputStreamBase +CDRInputStream_1_0 +CDRInputStream_1_1 +CDRInputStream_1_2 +CDROutputStream +CDROutputStreamBase +CDROutputStream_1_0 +CDROutputStream_1_1 +CDROutputStream_1_2 +CDataNode +CMMException +COMM_FAILURE +COMMarkerSegment +CORBAObjectImpl +CRC32 +CRL +CRLException +CRLSelector +CSS +CSS2Properties +CSSCharsetRule +CSSFontFaceRule +CSSImportRule +CSSMediaRule +CSSPageRule +CSSParser +CSSPrimitiveValue +CSSRule +CSSRuleList +CSSStyleDeclaration +CSSStyleRule +CSSStyleSheet +CSSUnknownRule +CSSValue +CSSValueList +CTX_RESTRICT_SCOPE +CacheTable +CachedCodeBase +Calendar +CallableStatement +Callback +CallbackHandler +CancelRequestMessage +CancelRequestMessage_1_0 +CancelRequestMessage_1_1 +CancelRequestMessage_1_2 +CancelablePrintJob +CancelledKeyException +CannotProceed +CannotProceedException +CannotProceedHelper +CannotProceedHolder +CannotRedoException +CannotUndoException +Canvas +CanvasPeer +CardLayout +Caret +CaretEvent +CaretListener +CellEditor +CellEditorListener +CellRendererPane +CenterLayout +CertPath +CertPathBuilder +CertPathBuilderException +CertPathBuilderResult +CertPathBuilderSpi +CertPathParameters +CertPathValidator +CertPathValidatorException +CertPathValidatorResult +CertPathValidatorSpi +CertSelector +CertStore +CertStoreException +CertStoreParameters +CertStoreSpi +Certificate +CertificateEncodingException +CertificateException +CertificateExpiredException +CertificateFactory +CertificateFactorySpi +CertificateNotYetValidException +CertificateParsingException +ChangeEvent +ChangeListener +ChangedCharSetException +Channel +ChannelBinding +Channels +CharArrayIterator +CharArrayReader +CharArrayWriter +CharBuffer +CharConversionException +CharHolder +CharInfo +CharKey +CharSeqHelper +CharSeqHolder +CharSequence +CharSet +Character +CharacterBreakData +CharacterCodingException +CharacterData +CharacterIterator +CharacterIteratorFieldDelegate +Charset +CharsetDecoder +CharsetEncoder +CharsetProvider +Checkbox +CheckboxGroup +CheckboxMenuItem +CheckboxMenuItemPeer +CheckboxPeer +CheckedInputStream +CheckedOutputStream +Checksum +ChildIterator +ChildTestIterator +Choice +ChoiceCallback +ChoiceFormat +ChoicePeer +Chromaticity +ChunkedIntArray +Class +ClassCastException +ClassCircularityError +ClassDesc +ClassFormatError +ClassLoader +ClassNotFoundException +ClientDelegate +ClientGIOP +ClientRequest +ClientRequestImpl +ClientRequestInfo +ClientRequestInfoImpl +ClientRequestInfoOperations +ClientRequestInterceptor +ClientRequestInterceptorOperations +ClientResponse +ClientResponseImpl +ClientSC +ClientSubcontract +Clipboard +ClipboardOwner +Clob +CloneNotSupportedException +Cloneable +ClonerToResultTree +ClosedByInterruptException +ClosedChannelException +ClosedSelectorException +Closure +CodeSetCache +CodeSetComponentInfo +CodeSetConversion +CodeSetServiceContext +CodeSets +CodeSetsComponent +CodeSource +Codec +CodecFactory +CodecFactoryHelper +CodecFactoryImpl +CodecFactoryOperations +CodecOperations +CoderMalfunctionError +CoderResult +CodingErrorAction +CollationElementIterator +CollationKey +CollationRules +Collator +Collection +CollectionCertStoreParameters +Collections +Color +ColorChooserComponentFactory +ColorChooserUI +ColorConvertOp +ColorModel +ColorPaintContext +ColorSelectionModel +ColorSpace +ColorSupported +ColorUIResource +ComboBoxEditor +ComboBoxModel +ComboBoxUI +ComboPopup +CommandHandler +Comment +CommentNode +CommentView +CommunicationException +Comparable +Comparator +Compiler +CompletionStatus +CompletionStatusHelper +Component +ComponentAdapter +ComponentColorModel +ComponentEvent +ComponentIdHelper +ComponentInputMap +ComponentInputMapUIResource +ComponentListener +ComponentOrientation +ComponentPeer +ComponentSampleModel +ComponentUI +ComponentView +Composite +CompositeContext +CompositeName +CompositeView +CompoundBorder +CompoundEdit +CompoundName +Compression +ConcurrentModificationException +Condition +Conditional +ConfigFile +Configuration +ConfigurationException +ConfirmationCallback +ConnectException +ConnectIOException +Connection +ConnectionEvent +ConnectionEventListener +ConnectionPendingException +ConnectionPool +ConnectionPoolDataSource +ConnectionPoolManager +ConnectionTable +ConsoleHandler +Constant +Constants +Constructor +Container +ContainerAdapter +ContainerEvent +ContainerListener +ContainerOrderFocusTraversalPolicy +ContainerPeer +ContentHandler +ContentHandlerFactory +ContentModel +ContentModelState +Context +ContextImpl +ContextList +ContextListImpl +ContextMatchStepPattern +ContextNodeList +ContextNotEmptyException +ContextualRenderedImageFactory +ContinuationContext +ContinuationDirContext +Control +ControlFactory +ConvolveOp +CookieHolder +Copies +CopiesSupported +CorbaLoc +CorbaName +CorbaResourceUtil +CoroutineManager +CoroutineParser +CoroutineSAXFilterTest +CoroutineSAXParser +CoroutineSAXParser_Xerces +Counter +CountersTable +CredentialExpiredException +CropImageFilter +Crypt +CubicCurve2D +CubicIterator +Currency +CurrencyData +Current +CurrentHelper +CurrentHolder +CurrentOperations +Cursor +CustomMarshal +CustomStringPool +CustomValue +Customizer +DATA_CONVERSION +DGC +DHTMarkerSegment +DOM2DTM +DOM2Helper +DOMBuilder +DOMException +DOMHelper +DOMImplementation +DOMImplementationCSS +DOMImplementationImpl +DOMLocator +DOMOrder +DOMResult +DOMSerializer +DOMSource +DQTMarkerSegment +DRIMarkerSegment +DSAKey +DSAKeyPairGenerator +DSAParameterSpec +DSAParams +DSAPrivateKey +DSAPrivateKeySpec +DSAPublicKey +DSAPublicKeySpec +DTD +DTDConstants +DTDHandler +DTM +DTMAxisIterator +DTMAxisIteratorBase +DTMAxisTraverser +DTMConfigurationException +DTMDOMException +DTMDefaultBase +DTMDefaultBaseIterators +DTMDefaultBaseTraversers +DTMDocument +DTMDocumentImpl +DTMException +DTMFilter +DTMIterator +DTMManager +DTMManagerDefault +DTMNamedNodeMap +DTMNodeIterator +DTMNodeList +DTMNodeProxy +DTMSafeStringPool +DTMStringPool +DTMTreeWalker +DTMWSFilter +DataBuffer +DataBufferByte +DataBufferDouble +DataBufferFloat +DataBufferInt +DataBufferShort +DataBufferUShort +DataFlavor +DataFormatException +DataInput +DataInputStream +DataNode +DataOutput +DataOutputStream +DataSource +DataTruncation +DatabaseMetaData +DatagramChannel +DatagramPacket +DatagramSocket +DatagramSocketImpl +DatagramSocketImplFactory +Date +DateFormat +DateFormatSymbols +DateFormatter +DateTimeAtCompleted +DateTimeAtCreation +DateTimeAtProcessing +DateTimeSyntax +DebugGraphics +DebugGraphicsFilter +DebugGraphicsInfo +DebugGraphicsObserver +DecimalFormat +DecimalFormatProperties +DecimalFormatSymbols +DecimalToRoman +DeclHandler +DefaultBoundedRangeModel +DefaultButtonModel +DefaultCaret +DefaultCellEditor +DefaultColorSelectionModel +DefaultComboBoxModel +DefaultConnectionPool +DefaultDesktopManager +DefaultEditorKit +DefaultErrorHandler +DefaultFocusManager +DefaultFocusTraversalPolicy +DefaultFormatter +DefaultFormatterFactory +DefaultHSBChooserPanel +DefaultHandler +DefaultHighlighter +DefaultKeyboardFocusManager +DefaultListCellRenderer +DefaultListModel +DefaultListSelectionModel +DefaultMenuLayout +DefaultMetalTheme +DefaultMutableTreeNode +DefaultPersistenceDelegate +DefaultPreviewPanel +DefaultRGBChooserPanel +DefaultSingleSelectionModel +DefaultSocketFactory +DefaultStyledDocument +DefaultSwatchChooserPanel +DefaultTableCellRenderer +DefaultTableColumnModel +DefaultTableModel +DefaultTextUI +DefaultTreeCellEditor +DefaultTreeCellRenderer +DefaultTreeModel +DefaultTreeSelectionModel +DefaultValidationErrorHandler +DefinitionKind +DefinitionKindHelper +Deflater +DeflaterOutputStream +Delegate +DelegateImpl +DelegatingDefaultFocusManager +DelegationPermission +DescendantIterator +DesignMode +DesktopIconUI +DesktopManager +DesktopPaneUI +Destination +DestroyFailedException +Destroyable +Dialog +DialogCallbackHandler +DialogPeer +Dictionary +DictionaryBasedBreakIterator +DigestException +DigestInputStream +DigestOutputStream +DigitList +DigraphNode +Dimension +Dimension2D +DimensionUIResource +DirContext +DirObjectFactory +DirStateFactory +DirectByteBuffer +DirectByteBufferR +DirectCharBufferRS +DirectCharBufferRU +DirectCharBufferS +DirectCharBufferU +DirectColorModel +DirectDoubleBufferRS +DirectDoubleBufferRU +DirectDoubleBufferS +DirectDoubleBufferU +DirectFloatBufferRS +DirectFloatBufferRU +DirectFloatBufferS +DirectFloatBufferU +DirectIntBufferRS +DirectIntBufferRU +DirectIntBufferS +DirectIntBufferU +DirectLongBufferRS +DirectLongBufferRU +DirectLongBufferS +DirectLongBufferU +DirectShortBufferRS +DirectShortBufferRU +DirectShortBufferS +DirectShortBufferU +DirectoryManager +DisplayMode +Div +DnDConstants +DnDEventMulticaster +Doc +DocAttribute +DocAttributeSet +DocFlavor +DocPrintJob +Doctype +Document +DocumentBuilder +DocumentBuilderFactory +DocumentBuilderFactoryImpl +DocumentBuilderImpl +DocumentCSS +DocumentEvent +DocumentEx +DocumentFilter +DocumentFragment +DocumentHandler +DocumentListener +DocumentName +DocumentParser +DocumentStyle +DocumentTraversal +DocumentType +DocumentView +DomEx +DomainCombiner +DomainManager +DomainManagerOperations +Double +DoubleBuffer +DoubleHolder +DoubleSeqHelper +DoubleSeqHolder +DragGestureEvent +DragGestureListener +DragGestureRecognizer +DragSource +DragSourceAdapter +DragSourceContext +DragSourceContextPeer +DragSourceDragEvent +DragSourceDropEvent +DragSourceEvent +DragSourceListener +DragSourceMotionListener +Driver +DriverManager +DriverPropertyInfo +DropTarget +DropTargetAdapter +DropTargetContext +DropTargetContextPeer +DropTargetDragEvent +DropTargetDropEvent +DropTargetEvent +DropTargetListener +DropTargetPeer +DuplicateName +DuplicateNameHelper +DuplicateServiceContext +DynAny +DynAnyBasicImpl +DynAnyCollectionImpl +DynAnyComplexImpl +DynAnyConstructedImpl +DynAnyFactory +DynAnyFactoryHelper +DynAnyFactoryImpl +DynAnyFactoryOperations +DynAnyHelper +DynAnyImpl +DynAnyOperations +DynAnySeqHelper +DynAnyUtil +DynArray +DynArrayHelper +DynArrayImpl +DynArrayOperations +DynEnum +DynEnumHelper +DynEnumImpl +DynEnumOperations +DynFixed +DynFixedHelper +DynFixedImpl +DynFixedOperations +DynSequence +DynSequenceHelper +DynSequenceImpl +DynSequenceOperations +DynStruct +DynStructHelper +DynStructImpl +DynStructOperations +DynUnion +DynUnionHelper +DynUnionImpl +DynUnionOperations +DynValue +DynValueBox +DynValueBoxImpl +DynValueBoxOperations +DynValueCommon +DynValueCommonImpl +DynValueCommonOperations +DynValueHelper +DynValueImpl +DynValueOperations +DynamicImplementation +ENCODING_CDR_ENCAPS +EOFException +EditableView +EditorKit +ElemApplyImport +ElemApplyTemplates +ElemAttribute +ElemAttributeSet +ElemCallTemplate +ElemChoose +ElemComment +ElemCopy +ElemCopyOf +ElemDesc +ElemElement +ElemEmpty +ElemExtensionCall +ElemExtensionDecl +ElemExtensionScript +ElemFallback +ElemForEach +ElemIf +ElemLiteralResult +ElemMessage +ElemNumber +ElemOtherwise +ElemPI +ElemParam +ElemSort +ElemTemplate +ElemTemplateElement +ElemText +ElemTextLiteral +ElemUnknown +ElemUse +ElemValueOf +ElemVariable +ElemWhen +ElemWithParam +Element +ElementCSSInlineStyle +ElementDecl +ElementEx +ElementFactory +ElementIterator +ElementNode +ElementNode2 +ElementValidator +Ellipse2D +EllipseIterator +EmptyBorder +EmptyStackException +EncapsInputStream +EncapsOutputStream +EncodedKeySpec +Encoder +Encoding +EncodingInfo +Encodings +EndOfInputException +EndPoint +EndPointImpl +EndPointInfo +EndPointInfoHelper +EndPointInfoHolder +EndSelectionEvent +EndpointInfoListHelper +EndpointInfoListHolder +Entity +EntityDecl +EntityReference +EntityResolver +EntryPair +EntryPoint +EnumSyntax +Enumeration +Environment +EnvironmentCheck +EnvironmentImpl +Equals +Error +ErrorHandler +ErrorListener +ErrorManager +EtchedBorder +Event +EventContext +EventDirContext +EventDispatchThread +EventException +EventHandler +EventListener +EventListenerList +EventListenerProxy +EventObject +EventQueue +EventSetDescriptor +EventTarget +Exception +ExceptionInInitializerError +ExceptionList +ExceptionListImpl +ExceptionListener +ExpandVetoException +ExpandedNameTable +ExportException +Expression +ExpressionContext +ExtendedRequest +ExtendedResponse +ExtensionHandler +ExtensionHandlerGeneral +ExtensionHandlerJava +ExtensionHandlerJavaClass +ExtensionHandlerJavaPackage +Extensions +ExtensionsTable +ExternalEntity +Externalizable +FREE_MEM +FVDCodeBaseImpl +FactoryConfigurationError +FactoryEnumeration +FactoryFinder +FailedLoginException +FastStringBuffer +FeatureDescriptor +Fidelity +Field +FieldNameHelper +FieldPosition +FieldView +File +FileCacheImageInputStream +FileCacheImageOutputStream +FileChannel +FileChooserUI +FileDescriptor +FileDialog +FileDialogPeer +FileFilter +FileHandler +FileImageInputStream +FileImageInputStreamSpi +FileImageOutputStream +FileImageOutputStreamSpi +FileInputStream +FileLock +FileLockInterruptionException +FileNameMap +FileNotFoundException +FileOutputStream +FilePermission +FileReader +FileSystem +FileSystemView +FileView +FileWriter +FilenameFilter +Filter +FilterExprWalker +FilterInputStream +FilterOutputStream +FilterReader +FilterWriter +FilteredImageSource +FinalReference +Finalizer +Finishings +FixedHeightLayoutCache +FixedHolder +FlatteningPathIterator +FlavorException +FlavorMap +FlavorTable +Float +FloatBuffer +FloatHolder +FloatSeqHelper +FloatSeqHolder +FloatingDecimal +FlowLayout +FlowView +FocusAdapter +FocusEvent +FocusListener +FocusManager +FocusTraversalPolicy +Font +FontFormatException +FontMetrics +FontPeer +FontRenderContext +FontUIResource +FormView +Format +FormatMismatch +FormatMismatchHelper +Formatter +ForwardException +ForwardRequest +ForwardRequestHelper +FoundIndex +FragmentMessage +FragmentMessage_1_1 +FragmentMessage_1_2 +Frame +FramePeer +FrameSetView +FrameView +FreezableList +FuncBoolean +FuncCeiling +FuncConcat +FuncContains +FuncCount +FuncCurrent +FuncDoclocation +FuncDocument +FuncExtElementAvailable +FuncExtFunction +FuncExtFunctionAvailable +FuncFalse +FuncFloor +FuncFormatNumb +FuncGenerateId +FuncId +FuncKey +FuncLang +FuncLast +FuncLoader +FuncLocalPart +FuncNamespace +FuncNormalizeSpace +FuncNot +FuncNumber +FuncPosition +FuncQname +FuncRound +FuncStartsWith +FuncString +FuncStringLength +FuncSubstring +FuncSubstringAfter +FuncSubstringBefore +FuncSum +FuncSystemProperty +FuncTranslate +FuncTrue +FuncUnparsedEntityURI +Function +Function2Args +Function3Args +FunctionDef1Arg +FunctionMultiArgs +FunctionOneArg +FunctionPattern +FunctionTable +Future +GIFImageMetadata +GIFImageMetadataFormat +GIFImageMetadataFormatResources +GIFImageReader +GIFImageReaderSpi +GIFStreamMetadata +GIFStreamMetadataFormat +GIFStreamMetadataFormatResources +GIOPImpl +GIOPVersion +GSSContext +GSSCredential +GSSException +GSSManager +GSSName +GSSUtil +GZIPInputStream +GZIPOutputStream +GapContent +GapVector +GatheringByteChannel +GeneralPath +GeneralPathIterator +GeneralSecurityException +GenerateEvent +GenericIdEncapsulation +GenericPOAClientSC +GenericPOAServerSC +GenericTaggedComponent +GenericTaggedProfile +GetEndPointInfoAgainException +GetORBPropertiesFileAction +GlyphJustificationInfo +GlyphMetrics +GlyphPainter1 +GlyphPainter2 +GlyphVector +GlyphView +GradientPaint +GradientPaintContext +GraphicAttribute +Graphics +Graphics2D +GraphicsCallback +GraphicsConfigTemplate +GraphicsConfiguration +GraphicsDevice +GraphicsEnvironment +GraphicsWrapper +GrayFilter +GregorianCalendar +GridBagConstraints +GridBagLayout +GridLayout +Group +Gt +Gte +Guard +GuardedObject +HRuleView +HTML +HTMLAnchorElement +HTMLAppletElement +HTMLAreaElement +HTMLBRElement +HTMLBaseElement +HTMLBaseFontElement +HTMLBodyElement +HTMLButtonElement +HTMLCollection +HTMLDListElement +HTMLDOMImplementation +HTMLDirectoryElement +HTMLDivElement +HTMLDocument +HTMLEditorKit +HTMLElement +HTMLFieldSetElement +HTMLFontElement +HTMLFormElement +HTMLFrameElement +HTMLFrameHyperlinkEvent +HTMLFrameSetElement +HTMLHRElement +HTMLHeadElement +HTMLHeadingElement +HTMLHtmlElement +HTMLIFrameElement +HTMLImageElement +HTMLInputElement +HTMLIsIndexElement +HTMLLIElement +HTMLLabelElement +HTMLLegendElement +HTMLLinkElement +HTMLMapElement +HTMLMenuElement +HTMLMetaElement +HTMLModElement +HTMLOListElement +HTMLObjectElement +HTMLOptGroupElement +HTMLOptionElement +HTMLParagraphElement +HTMLParamElement +HTMLPreElement +HTMLQuoteElement +HTMLScriptElement +HTMLSelectElement +HTMLStyleElement +HTMLTableCaptionElement +HTMLTableCellElement +HTMLTableColElement +HTMLTableElement +HTMLTableRowElement +HTMLTableSectionElement +HTMLTextAreaElement +HTMLTitleElement +HTMLUListElement +HTMLWriter +Handler +HandlerBase +HasControls +HashAttributeSet +HashDocAttributeSet +HashMap +HashPrintJobAttributeSet +HashPrintRequestAttributeSet +HashPrintServiceAttributeSet +HashSet +Hashtable +HeadlessException +HeapByteBuffer +HeapByteBufferR +HeapCharBuffer +HeapCharBufferR +HeapDoubleBuffer +HeapDoubleBufferR +HeapFloatBuffer +HeapFloatBufferR +HeapIntBuffer +HeapIntBufferR +HeapLongBuffer +HeapLongBufferR +HeapShortBuffer +HeapShortBufferR +HexOutputStream +HiddenTagView +HierarchyBoundsAdapter +HierarchyBoundsListener +HierarchyEvent +HierarchyListener +Highlighter +HostInfo +HttpURLConnection +HyperlinkEvent +HyperlinkListener +ICC_ColorSpace +ICC_Profile +ICC_ProfileGray +ICC_ProfileRGB +IDLEntity +IDLType +IDLTypeHelper +IDLTypeOperations +ID_ASSIGNMENT_POLICY_ID +ID_UNIQUENESS_POLICY_ID +IIOByteBuffer +IIOException +IIOImage +IIOInvalidTreeException +IIOMetadata +IIOMetadataController +IIOMetadataFormat +IIOMetadataFormatImpl +IIOMetadataNode +IIOPAddress +IIOPAddressBase +IIOPAddressFutureImpl +IIOPAddressImpl +IIOPConnection +IIOPInputStream +IIOPInputStream_1_3 +IIOPInputStream_1_3_1 +IIOPOutputStream +IIOPOutputStream_1_3 +IIOPOutputStream_1_3_1 +IIOPProfile +IIOPProfileTemplate +IIOP_CLEAR_TEXT +IIOParam +IIOParamController +IIOReadProgressListener +IIOReadUpdateListener +IIOReadWarningListener +IIORegistry +IIOServiceProvider +IIOWriteProgressListener +IIOWriteWarningListener +IMPLICIT_ACTIVATION_POLICY_ID +IMP_LIMIT +INITIALIZE +INSObjectKeyEntry +INSObjectKeyMap +INSSubcontract +INTERNAL +INTF_REPOS +INVALID_TRANSACTION +INV_FLAG +INV_IDENT +INV_OBJREF +INV_POLICY +IOException +IOR +IORAddressingInfo +IORAddressingInfoHelper +IORHelper +IORHolder +IORInfo +IORInfoExt +IORInfoImpl +IORInfoOperations +IORInterceptor +IORInterceptorOperations +IORTemplate +IRObject +IRObjectOperations +Icon +IconUIResource +IconView +IdAssignmentPolicy +IdAssignmentPolicyImpl +IdAssignmentPolicyOperations +IdAssignmentPolicyValue +IdEncapsulation +IdEncapsulationBase +IdEncapsulationContainerBase +IdEncapsulationFactory +IdEncapsulationFactoryFinder +IdUniquenessPolicy +IdUniquenessPolicyImpl +IdUniquenessPolicyOperations +IdUniquenessPolicyValue +Identifiable +IdentifiableContainerBase +IdentifierHelper +Identity +IdentityHashMap +IdentityHashtable +IdentityScope +IllegalAccessError +IllegalAccessException +IllegalArgumentException +IllegalBlockingModeException +IllegalCharsetNameException +IllegalComponentStateException +IllegalMonitorStateException +IllegalPathStateException +IllegalSelectorException +IllegalStateException +IllegalThreadStateException +Image +ImageCapabilities +ImageConsumer +ImageFilter +ImageFormatException +ImageGraphicAttribute +ImageIO +ImageIcon +ImageInputStream +ImageInputStreamImpl +ImageInputStreamSpi +ImageObserver +ImageOutputStream +ImageOutputStreamImpl +ImageOutputStreamSpi +ImageProducer +ImageReadParam +ImageReader +ImageReaderSpi +ImageReaderWriterSpi +ImageTranscoder +ImageTranscoderSpi +ImageTypeSpecifier +ImageView +ImageWriteParam +ImageWriter +ImageWriterSpi +ImagingOpException +ImplicitActivationPolicy +ImplicitActivationPolicyImpl +ImplicitActivationPolicyOperations +ImplicitActivationPolicyValue +IncompatibleClassChangeError +InconsistentTypeCode +InconsistentTypeCodeHelper +IncrementalSAXSource +IncrementalSAXSource_Filter +IncrementalSAXSource_Xerces +IndexColorModel +IndexOutOfBoundsException +IndexedPropertyDescriptor +IndirectionException +Inet4Address +Inet6Address +InetAddress +InetSocketAddress +Inflater +InflaterInputStream +InheritableThreadLocal +InitialContext +InitialContextFactory +InitialContextFactoryBuilder +InitialDirContext +InitialLdapContext +InitialNameService +InitialNameServiceHelper +InitialNameServiceHolder +InitialNameServiceOperations +InitialNamingClient +InitialNamingImpl +InlineView +InputContext +InputEntity +InputEvent +InputMap +InputMapUIResource +InputMethod +InputMethodContext +InputMethodDescriptor +InputMethodEvent +InputMethodHighlight +InputMethodListener +InputMethodRequests +InputSource +InputStream +InputStreamAdapter +InputStreamHook +InputStreamImageInputStreamSpi +InputStreamReader +InputSubset +InputVerifier +Insets +InsetsUIResource +InstantiationError +InstantiationException +InsufficientResourcesException +IntBuffer +IntHolder +IntStack +IntVector +Integer +IntegerSyntax +InterOperableNamingImpl +Interceptor +InterceptorInvoker +InterceptorList +InterceptorOperations +InternalBindingKey +InternalBindingValue +InternalEntity +InternalError +InternalFrameAdapter +InternalFrameEvent +InternalFrameFocusTraversalPolicy +InternalFrameListener +InternalFrameUI +InternalRuntimeForwardRequest +InternationalFormatter +InterruptedException +InterruptedIOException +InterruptedNamingException +InterruptibleChannel +IntrospectionException +Introspector +Invalid +InvalidAddress +InvalidAddressHelper +InvalidAddressHolder +InvalidAlgorithmParameterException +InvalidAttributeIdentifierException +InvalidAttributeValueException +InvalidAttributesException +InvalidClassException +InvalidDnDOperationException +InvalidKeyException +InvalidKeySpecException +InvalidMarkException +InvalidName +InvalidNameException +InvalidNameHelper +InvalidNameHolder +InvalidORBid +InvalidORBidHelper +InvalidORBidHolder +InvalidObjectException +InvalidParameterException +InvalidParameterSpecException +InvalidPolicy +InvalidPolicyHelper +InvalidPreferencesFormatException +InvalidSearchControlsException +InvalidSearchFilterException +InvalidSeq +InvalidSlot +InvalidSlotHelper +InvalidTypeForEncoding +InvalidTypeForEncodingHelper +InvalidValue +InvalidValueHelper +InvocationEvent +InvocationHandler +InvocationInfo +InvocationTargetException +InvokeHandler +IsindexView +IstringHelper +ItemEvent +ItemListener +ItemSelectable +Iterator +IteratorPool +JApplet +JButton +JCheckBox +JCheckBoxMenuItem +JColorChooser +JComboBox +JComponent +JDKBridge +JDKClassLoader +JDesktopPane +JDialog +JEditorPane +JFIFMarkerSegment +JFileChooser +JFormattedTextField +JFrame +JIDLObjectKeyTemplate +JInternalFrame +JLabel +JLayeredPane +JList +JMenu +JMenuBar +JMenuItem +JOptionPane +JPEG +JPEGBuffer +JPEGCodec +JPEGDecodeParam +JPEGEncodeParam +JPEGHuffmanTable +JPEGImageDecoder +JPEGImageEncoder +JPEGImageMetadataFormat +JPEGImageMetadataFormatResources +JPEGImageReadParam +JPEGImageReader +JPEGImageReaderResources +JPEGImageReaderSpi +JPEGImageWriteParam +JPEGImageWriter +JPEGImageWriterResources +JPEGImageWriterSpi +JPEGMetadata +JPEGMetadataFormat +JPEGMetadataFormatResources +JPEGQTable +JPEGStreamMetadataFormat +JPEGStreamMetadataFormatResources +JPanel +JPasswordField +JPopupMenu +JProgressBar +JRadioButton +JRadioButtonMenuItem +JRootPane +JScrollBar +JScrollPane +JSeparator +JSlider +JSpinner +JSplitPane +JTabbedPane +JTable +JTableHeader +JTextArea +JTextComponent +JTextField +JTextPane +JToggleButton +JToolBar +JToolTip +JTree +JViewport +JWindow +JarEntry +JarException +JarFile +JarInputStream +JarOutputStream +JarURLConnection +JarVerifier +JavaCodebaseComponent +JavaUtils +JndiLoginModule +JobAttributes +JobHoldUntil +JobImpressions +JobImpressionsCompleted +JobImpressionsSupported +JobKOctets +JobKOctetsProcessed +JobKOctetsSupported +JobMediaSheets +JobMediaSheetsCompleted +JobMediaSheetsSupported +JobMessageFromOperator +JobName +JobOriginatingUserName +JobPriority +JobPrioritySupported +JobSheets +JobState +JobStateReason +JobStateReasons +KerberosKey +KerberosPrincipal +KerberosTicket +Kernel +Key +KeyAdapter +KeyAddr +KeyDeclaration +KeyEvent +KeyEventDispatcher +KeyEventPostProcessor +KeyException +KeyFactory +KeyFactorySpi +KeyImpl +KeyIterator +KeyListener +KeyManagementException +KeyManager +KeyPair +KeyPairGenerator +KeyPairGeneratorSpi +KeyRefIterator +KeySpec +KeyStore +KeyStoreException +KeyStoreLoginModule +KeyStoreSpi +KeyStroke +KeyTable +KeyWalker +KeyboardFocusManager +KeyboardManager +Keymap +Keywords +Krb5LoginModule +LDAPCertStoreParameters +LIFESPAN_POLICY_ID +LOCATION_FORWARD +Label +LabelPeer +LabelUI +LabelView +LanguageCallback +LastOwnerException +LayeredHighlighter +LayoutComparator +LayoutFocusTraversalPolicy +LayoutManager +LayoutManager2 +LayoutQueue +LdapContext +LdapReferralException +Lease +LegacyGlueFocusTraversalPolicy +LegacyHookGetFields +LegacyHookPutFields +Level +Lexer +LexicalHandler +LibraryManager +LifespanPolicy +LifespanPolicyImpl +LifespanPolicyOperations +LifespanPolicyValue +LightweightPeer +LimitExceededException +Line2D +LineBorder +LineBreakData +LineBreakMeasurer +LineIterator +LineMetrics +LineNumberInputStream +LineNumberReader +LineView +LinkException +LinkLoopException +LinkRef +LinkStyle +LinkageError +LinkedHashMap +LinkedHashSet +LinkedList +List +ListCellRenderer +ListDataEvent +ListDataListener +ListIterator +ListModel +ListPeer +ListResourceBundle +ListSelectionEvent +ListSelectionListener +ListSelectionModel +ListUI +ListView +ListenerThread +LoaderHandler +LocPathIterator +LocalClientRequestImpl +LocalClientResponseImpl +LocalObject +LocalServerRequestImpl +LocalServerResponseImpl +Locale +LocateRegistry +LocateReplyMessage +LocateReplyMessage_1_0 +LocateReplyMessage_1_1 +LocateReplyMessage_1_2 +LocateRequestMessage +LocateRequestMessage_1_0 +LocateRequestMessage_1_1 +LocateRequestMessage_1_2 +Locator +LocatorHelper +LocatorHolder +LocatorImpl +LocatorOperations +Lock +LogManager +LogRecord +LogStream +Logger +LoggingPermission +LoginContext +LoginException +LoginModule +Long +LongBuffer +LongHolder +LongLongSeqHelper +LongLongSeqHolder +LongSeqHelper +LongSeqHolder +LookAndFeel +LookupOp +LookupTable +Lt +Lte +MARSHAL +MalformedInputException +MalformedLinkException +MalformedURLException +Manifest +Map +MappedByteBuffer +MarkAndResetHandler +MarkerSegment +MarshalException +MarshalInputStream +MarshalOutputStream +MarshalledObject +MaskFormatter +MatchPatternIterator +Matcher +Math +MatteBorder +Media +MediaList +MediaName +MediaPrintableArea +MediaSize +MediaSizeName +MediaTracker +MediaTray +Member +MemoryCache +MemoryCacheImageInputStream +MemoryCacheImageOutputStream +MemoryHandler +MemoryImageSource +Menu +MenuBar +MenuBarPeer +MenuBarUI +MenuComponent +MenuComponentPeer +MenuContainer +MenuDragMouseEvent +MenuDragMouseListener +MenuElement +MenuEvent +MenuItem +MenuItemPeer +MenuItemUI +MenuKeyEvent +MenuKeyListener +MenuListener +MenuPeer +MenuSelectionManager +MenuShortcut +MergeCollation +Message +MessageBase +MessageCatalog +MessageDigest +MessageDigestSpi +MessageFormat +MessageMediator +MessageProp +Message_1_0 +Message_1_1 +Message_1_2 +MetaData +MetalBorders +MetalBumps +MetalButtonUI +MetalCheckBoxIcon +MetalCheckBoxUI +MetalComboBoxButton +MetalComboBoxEditor +MetalComboBoxIcon +MetalComboBoxUI +MetalDesktopIconUI +MetalFileChooserUI +MetalIconFactory +MetalInternalFrameTitlePane +MetalInternalFrameUI +MetalLabelUI +MetalLookAndFeel +MetalPopupMenuSeparatorUI +MetalProgressBarUI +MetalRadioButtonUI +MetalRootPaneUI +MetalScrollBarUI +MetalScrollButton +MetalScrollPaneUI +MetalSeparatorUI +MetalSliderUI +MetalSplitPaneDivider +MetalSplitPaneUI +MetalTabbedPaneUI +MetalTextFieldUI +MetalTheme +MetalTitlePane +MetalToggleButtonUI +MetalToolBarUI +MetalToolTipUI +MetalTreeUI +MetalUtils +Method +MethodDescriptor +MethodResolver +MimeType +MimeTypeParameterList +MimeTypeParseException +MinimalHTMLWriter +MinorCodes +Minus +MissingResourceException +MockAttributeSet +Mod +ModificationItem +Modifier +MotifBorders +MotifButtonListener +MotifButtonUI +MotifCheckBoxMenuItemUI +MotifCheckBoxUI +MotifComboBoxRenderer +MotifComboBoxUI +MotifDesktopIconUI +MotifDesktopPaneUI +MotifEditorPaneUI +MotifFileChooserUI +MotifGraphicsUtils +MotifIconFactory +MotifInternalFrameTitlePane +MotifInternalFrameUI +MotifLabelUI +MotifLookAndFeel +MotifMenuBarUI +MotifMenuItemUI +MotifMenuMouseListener +MotifMenuMouseMotionListener +MotifMenuUI +MotifOptionPaneUI +MotifPasswordFieldUI +MotifPopupMenuSeparatorUI +MotifPopupMenuUI +MotifProgressBarUI +MotifRadioButtonMenuItemUI +MotifRadioButtonUI +MotifScrollBarButton +MotifScrollBarUI +MotifScrollPaneUI +MotifSeparatorUI +MotifSliderUI +MotifSplitPaneDivider +MotifSplitPaneUI +MotifTabbedPaneUI +MotifTextAreaUI +MotifTextFieldUI +MotifTextPaneUI +MotifTextUI +MotifToggleButtonUI +MotifTreeCellRenderer +MotifTreeUI +MouseAdapter +MouseDragGestureRecognizer +MouseEvent +MouseInputAdapter +MouseInputListener +MouseListener +MouseMotionAdapter +MouseMotionListener +MouseWheelEvent +MouseWheelListener +MsgMgr +Mult +MultiButtonUI +MultiColorChooserUI +MultiComboBoxUI +MultiDesktopIconUI +MultiDesktopPaneUI +MultiDoc +MultiDocPrintJob +MultiDocPrintService +MultiFileChooserUI +MultiInternalFrameUI +MultiLabelUI +MultiListUI +MultiLookAndFeel +MultiMenuBarUI +MultiMenuItemUI +MultiOptionPaneUI +MultiPanelUI +MultiPixelPackedSampleModel +MultiPopupMenuUI +MultiProgressBarUI +MultiRootPaneUI +MultiScrollBarUI +MultiScrollPaneUI +MultiSeparatorUI +MultiSliderUI +MultiSpinnerUI +MultiSplitPaneUI +MultiTabbedPaneUI +MultiTableHeaderUI +MultiTableUI +MultiTextUI +MultiToolBarUI +MultiToolTipUI +MultiTreeUI +MultiUIDefaults +MultiViewportUI +MulticastSocket +MultipleComponentProfileHelper +MultipleComponentProfileHolder +MultipleDocumentHandling +MultipleMaster +MutableAttrListImpl +MutableAttributeSet +MutableBigInteger +MutableComboBoxModel +MutableTreeNode +MutationEvent +MuxingAttributeSet +NO_IMPLEMENT +NO_MEMORY +NO_PERMISSION +NO_RESOURCES +NO_RESPONSE +NSInfo +NSORB +NTDomainPrincipal +NTLoginModule +NTNumericCredential +NTSid +NTSidDomainPrincipal +NTSidGroupPrincipal +NTSidPrimaryGroupPrincipal +NTSidUserPrincipal +NTSystem +NTUserPrincipal +NVList +NVListImpl +Name +NameAlreadyBound +NameAlreadyBoundException +NameAlreadyBoundHelper +NameAlreadyBoundHolder +NameCallback +NameClassPair +NameComponent +NameComponentHelper +NameComponentHolder +NameDynAnyPair +NameDynAnyPairHelper +NameDynAnyPairSeqHelper +NameGenerator +NameHelper +NameHolder +NameImpl +NameNotFoundException +NameParser +NameServer +NameService +NameServiceStartThread +NameSpace +NameValuePair +NameValuePairHelper +NameValuePairSeqHelper +NamedNodeMap +NamedValue +NamedValueImpl +NamedWeakReference +NamespaceAlias +NamespaceChangeListener +NamespaceSupport +NamespaceSupport2 +NamespacedNode +Naming +NamingContext +NamingContextDataStore +NamingContextExt +NamingContextExtHelper +NamingContextExtHolder +NamingContextExtOperations +NamingContextExtPOA +NamingContextHelper +NamingContextHolder +NamingContextImpl +NamingContextOperations +NamingContextPOA +NamingEnumeration +NamingEvent +NamingException +NamingExceptionEvent +NamingListener +NamingManager +NamingSecurityException +NamingUtils +NativeLibLoader +NavigationFilter +Neg +NegativeArraySizeException +NetPermission +NetworkInterface +NewInstance +NewObjectKeyTemplateBase +NoClassDefFoundError +NoConnectionPendingException +NoContext +NoContextHelper +NoFramesView +NoInitialContextException +NoPermissionException +NoRouteToHostException +NoServant +NoServantHelper +NoSuchAlgorithmException +NoSuchAttributeException +NoSuchElementException +NoSuchEndPoint +NoSuchEndPointHelper +NoSuchEndPointHolder +NoSuchFieldError +NoSuchFieldException +NoSuchMethodError +NoSuchMethodException +NoSuchObjectException +NoSuchProviderException +NoSuchServiceContext +Node +NodeBase +NodeChangeEvent +NodeChangeListener +NodeConsumer +NodeEx +NodeFilter +NodeInfo +NodeIterator +NodeList +NodeLocator +NodeSet +NodeSetDTM +NodeSortKey +NodeSorter +NodeTest +NodeTestFilter +NodeVector +NonReadableChannelException +NonWritableChannelException +NoninvertibleTransformException +NotActiveException +NotBoundException +NotContextException +NotEmpty +NotEmptyHelper +NotEmptyHolder +NotEquals +NotFound +NotFoundHelper +NotFoundHolder +NotFoundReason +NotFoundReasonHelper +NotFoundReasonHolder +NotOwnerException +NotSerializableException +NotYetBoundException +NotYetConnectedException +Notation +NullPointerException +Number +NumberFormat +NumberFormatException +NumberFormatter +NumberOfDocuments +NumberOfInterveningJobs +NumberUp +NumberUpSupported +NumeratorFormatter +NumericShaper +OBJECT_NOT_EXIST +OBJ_ADAPTER +OMGVMCID +ORB +ORBAlreadyRegistered +ORBAlreadyRegisteredHelper +ORBAlreadyRegisteredHolder +ORBClassLoader +ORBConstants +ORBD +ORBInitInfo +ORBInitInfoImpl +ORBInitInfoOperations +ORBInitializer +ORBInitializerOperations +ORBPortInfo +ORBPortInfoHelper +ORBPortInfoHolder +ORBPortInfoListHelper +ORBPortInfoListHolder +ORBProperties +ORBSingleton +ORBSocketFactory +ORBThread +ORBTypeComponent +ORBUtility +ORBVersion +ORBVersionFactory +ORBVersionImpl +ORBVersionServiceContext +ORBidHelper +ORBidListHelper +ORBidListHolder +OSFCodeSetRegistry +ObjID +Object +ObjectAlreadyActive +ObjectAlreadyActiveHelper +ObjectArray +ObjectChangeListener +ObjectFactory +ObjectFactoryBuilder +ObjectHelper +ObjectHolder +ObjectId +ObjectIdHelper +ObjectIds +ObjectImpl +ObjectInput +ObjectInputStream +ObjectInputValidation +ObjectKey +ObjectKeyFactory +ObjectKeyTemplate +ObjectKeyTemplateBase +ObjectNotActive +ObjectNotActiveHelper +ObjectOutput +ObjectOutputStream +ObjectPool +ObjectStreamClass +ObjectStreamClassCorbaExt +ObjectStreamClassUtil_1_3 +ObjectStreamClass_1_3_1 +ObjectStreamConstants +ObjectStreamException +ObjectStreamField +ObjectView +Observable +Observer +OctetSeqHelper +OctetSeqHolder +Oid +OldJIDLObjectKeyTemplate +OldObjectKeyTemplateBase +OldPOAObjectKeyTemplate +OneStepIterator +OneStepIteratorForward +OpCodes +OpMap +OpenType +Operation +OperationNotSupportedException +Option +OptionComboBoxModel +OptionListModel +OptionPaneUI +OptionalDataException +Or +OrientationRequested +OutOfMemoryError +OutputDeviceAssigned +OutputKeys +OutputProperties +OutputStream +OutputStreamHook +OutputStreamImageOutputStreamSpi +OutputStreamWriter +OverlappingFileLockException +OverlayLayout +Owner +PDLOverrideSupported +PERSIST_STORE +PICurrent +PINode +PIORB +PKCS8EncodedKeySpec +PKIXBuilderParameters +PKIXCertPathBuilderResult +PKIXCertPathChecker +PKIXCertPathValidatorResult +PKIXParameters +PNGImageReader +PNGImageReaderSpi +PNGImageWriter +PNGImageWriterSpi +PNGMetadata +PNGMetadataFormat +PNGMetadataFormatResources +POA +POACurrent +POADestroyed +POAHelper +POAId +POAIdArray +POAIdBase +POAIdPOAView +POAImpl +POAManager +POAManagerImpl +POAManagerOperations +POANameHelper +POANameHolder +POAORB +POAObjectKeyTemplate +POAOperations +POAPolicyCombinationValidator +POAView +PRIVATE_MEMBER +PSSParameterSpec +PUBLIC_MEMBER +Package +PackagePrefixChecker +PackedColorModel +PageAttributes +PageFormat +PageRanges +Pageable +PagesPerMinute +PagesPerMinuteColor +Paint +PaintContext +PaintEvent +Panel +PanelPeer +PanelUI +Paper +ParagraphView +Parameter +ParameterBlock +ParameterDescriptor +ParameterMetaData +ParameterMode +ParameterModeHelper +ParameterModeHolder +ParentNode +ParseContext +ParseException +ParsePosition +Parser +Parser2 +ParserAdapter +ParserConfigurationException +ParserDelegator +ParserFactory +PartialResultException +PartiallyOrderedSet +PasswordAuthentication +PasswordCallback +PasswordView +PathIterator +Pattern +PatternEntry +PatternSyntaxException +Permission +PermissionCollection +Permissions +PersistenceDelegate +PersistentBindingIterator +PhantomReference +Pipe +PipeDocument +PipedInputStream +PipedOutputStream +PipedReader +PipedWriter +PixelGrabber +PixelInterleavedSampleModel +PlainDatagramSocketImpl +PlainDocument +PlainSocketImpl +PlainView +Plus +Point +Point2D +Policies +PoliciesComponent +Policy +PolicyError +PolicyErrorCodeHelper +PolicyErrorHelper +PolicyErrorHolder +PolicyFactory +PolicyFactoryOperations +PolicyFile +PolicyHelper +PolicyHolder +PolicyListHelper +PolicyListHolder +PolicyNode +PolicyOperations +PolicyParser +PolicyQualifierInfo +PolicyTypeHelper +Polygon +PooledConnection +Popup +PopupFactory +PopupMenu +PopupMenuEvent +PopupMenuListener +PopupMenuPeer +PopupMenuUI +PortUnreachableException +PortableRemoteObject +PortableRemoteObjectDelegate +Position +PredicatedNodeTest +PreferenceChangeEvent +PreferenceChangeListener +Preferences +PreferencesFactory +PrefixResolver +PrefixResolverDefault +PreparedStatement +PresentationDirection +Principal +PrincipalComparator +PrincipalHolder +PrincipalImpl +PrintEvent +PrintException +PrintGraphics +PrintJob +PrintJobAdapter +PrintJobAttribute +PrintJobAttributeEvent +PrintJobAttributeListener +PrintJobAttributeSet +PrintJobEvent +PrintJobListener +PrintQuality +PrintRequestAttribute +PrintRequestAttributeSet +PrintService +PrintServiceAttribute +PrintServiceAttributeEvent +PrintServiceAttributeListener +PrintServiceAttributeSet +PrintServiceLookup +PrintStream +PrintTraceListener +PrintWriter +Printable +PrinterAbortException +PrinterException +PrinterGraphics +PrinterIOException +PrinterInfo +PrinterIsAcceptingJobs +PrinterJob +PrinterLocation +PrinterMakeAndModel +PrinterMessageFromOperator +PrinterMoreInfo +PrinterMoreInfoManufacturer +PrinterName +PrinterResolution +PrinterState +PrinterStateReason +PrinterStateReasons +PrinterURI +PrivateCredentialPermission +PrivateKey +PrivilegedAction +PrivilegedActionException +PrivilegedExceptionAction +Process +ProcessMonitorThread +ProcessingInstruction +ProcessorAttributeSet +ProcessorCharacters +ProcessorDecimalFormat +ProcessorGlobalParamDecl +ProcessorGlobalVariableDecl +ProcessorImport +ProcessorInclude +ProcessorKey +ProcessorLRE +ProcessorNamespaceAlias +ProcessorOutputElem +ProcessorPreserveSpace +ProcessorStripSpace +ProcessorStylesheetDoc +ProcessorStylesheetElement +ProcessorTemplate +ProcessorTemplateElem +ProcessorText +ProcessorUnknown +ProfileAddr +ProfileDataException +ProfileIdHelper +ProgressBarUI +ProgressMonitor +ProgressMonitorInputStream +Properties +PropertyChangeEvent +PropertyChangeListener +PropertyChangeListenerProxy +PropertyChangeSupport +PropertyDescriptor +PropertyEditor +PropertyEditorManager +PropertyEditorSupport +PropertyPermission +PropertyResourceBundle +PropertyVetoException +ProtectionDomain +ProtocolException +Provider +ProviderException +Proxy +PsuedoNames +PublicKey +PushbackInputStream +PushbackReader +QName +QuadCurve2D +QuadIterator +QueryParameter +QueuedEvents +QueuedJobCount +Quo +RAFImageInputStreamSpi +RAFImageOutputStreamSpi +RBCollationTables +RBTableBuilder +REQUEST_PROCESSING_POLICY_ID +RGBColor +RGBImageFilter +RMIClassLoader +RMIClassLoaderSpi +RMIClientSocketFactory +RMIFailureHandler +RMISecurityException +RMISecurityManager +RMIServerSocketFactory +RMISocketFactory +RSAKey +RSAKeyGenParameterSpec +RSAMultiPrimePrivateCrtKey +RSAMultiPrimePrivateCrtKeySpec +RSAOtherPrimeInfo +RSAPrivateCrtKey +RSAPrivateCrtKeySpec +RSAPrivateKey +RSAPrivateKeySpec +RSAPublicKey +RSAPublicKeySpec +RTFAttribute +RTFAttributes +RTFEditorKit +RTFGenerator +RTFParser +RTFReader +Random +RandomAccess +RandomAccessFile +Raster +RasterFormatException +RasterOp +RawCharacterHandler +ReadOnlyBufferException +ReadableByteChannel +Reader +ReaderThread +Rect +RectIterator +Rectangle +Rectangle2D +RectangularShape +Redirect +Ref +RefAddr +Reference +ReferenceAddr +ReferenceQueue +ReferenceUriSchemesSupported +Referenceable +ReferralException +ReflectAccess +ReflectPermission +RefreshFailedException +Refreshable +RegisterableService +Registry +RegistryHandler +RemarshalException +Remote +RemoteCall +RemoteException +RemoteObject +RemoteRef +RemoteServer +RemoteStub +RenderContext +RenderableImage +RenderableImageOp +RenderableImageProducer +RenderedImage +RenderedImageFactory +Renderer +RenderingHints +RepIdDelegator +RepIdDelegator_1_3 +RepIdDelegator_1_3_1 +RepaintManager +ReplicateScaleFilter +ReplyMessage +ReplyMessage_1_0 +ReplyMessage_1_1 +ReplyMessage_1_2 +Repository +RepositoryHelper +RepositoryHolder +RepositoryId +RepositoryIdCache +RepositoryIdCache_1_3 +RepositoryIdCache_1_3_1 +RepositoryIdFactory +RepositoryIdHelper +RepositoryIdInterface +RepositoryIdStrings +RepositoryIdUtility +RepositoryId_1_3 +RepositoryId_1_3_1 +RepositoryImpl +RepositoryOperations +Request +RequestCanceledException +RequestHandler +RequestImpl +RequestInfo +RequestInfoExt +RequestInfoImpl +RequestInfoOperations +RequestMessage +RequestMessage_1_0 +RequestMessage_1_1 +RequestMessage_1_2 +RequestProcessingPolicy +RequestProcessingPolicyImpl +RequestProcessingPolicyOperations +RequestProcessingPolicyValue +RequestProcessor +RequestingUserName +RescaleOp +ResolutionSyntax +ResolveResult +Resolver +ResourceBundle +ResourceBundleEnumeration +ResourceLoader +ResourceManager +Response +ResponseHandler +RestorableInputStream +Result +ResultNameSpace +ResultSet +ResultSetMetaData +ResultTreeHandler +ReverseAxesWalker +Robot +RobotPeer +RootPaneContainer +RootPaneUI +RoundRectIterator +RoundRectangle2D +RowFilter +RowMapper +RowSet +RowSetEvent +RowSetInternal +RowSetListener +RowSetMetaData +RowSetReader +RowSetWriter +RuleBasedBreakIterator +RuleBasedCollator +RunTime +RunTimeOperations +Runnable +Runtime +RuntimeException +RuntimePermission +SAX2DTM +SAXException +SAXNotRecognizedException +SAXNotSupportedException +SAXParseException +SAXParser +SAXParserFactory +SAXParserFactoryImpl +SAXParserImpl +SAXResult +SAXSource +SAXSourceLocator +SAXTransformerFactory +SERVANT_RETENTION_POLICY_ID +SOFMarkerSegment +SOSMarkerSegment +SQLData +SQLDocument +SQLErrorDocument +SQLException +SQLInput +SQLOutput +SQLPermission +SQLWarning +SUCCESSFUL +SUNVMCID +SYNC_WITH_TRANSPORT +SYSTEM_EXCEPTION +SampleModel +Savepoint +ScatteringByteChannel +SchemaViolationException +ScrollBarUI +ScrollPane +ScrollPaneAdjustable +ScrollPaneConstants +ScrollPaneLayout +ScrollPanePeer +ScrollPaneUI +Scrollable +Scrollbar +ScrollbarPeer +SearchControls +SearchResult +SecureClassLoader +SecureRandom +SecureRandomSpi +Security +SecurityException +SecurityManager +SecurityPermission +Segment +SegmentCache +SelectableChannel +SelectionEvent +SelectionKey +Selector +SelectorProvider +SelfIteratorNoPredicate +SendingContextServiceContext +SentEvent +SentenceBreakData +SeparatorUI +SequenceInputStream +SequencedEvent +Serializable +SerializableLocatorImpl +SerializablePermission +SerializationTester +Serializer +SerializerFactory +SerializerSwitcher +SerializerToHTML +SerializerToText +SerializerToXML +Servant +ServantActivator +ServantActivatorHelper +ServantActivatorOperations +ServantActivatorPOA +ServantAlreadyActive +ServantAlreadyActiveHelper +ServantCachePOAClientSC +ServantCachingPolicy +ServantLocator +ServantLocatorHelper +ServantLocatorOperations +ServantLocatorPOA +ServantManager +ServantManagerImpl +ServantManagerOperations +ServantNotActive +ServantNotActiveHelper +ServantObject +ServantRetentionPolicy +ServantRetentionPolicyImpl +ServantRetentionPolicyOperations +ServantRetentionPolicyValue +Server +ServerAlreadyActive +ServerAlreadyActiveHelper +ServerAlreadyActiveHolder +ServerAlreadyInstalled +ServerAlreadyInstalledHelper +ServerAlreadyInstalledHolder +ServerAlreadyRegistered +ServerAlreadyRegisteredHelper +ServerAlreadyRegisteredHolder +ServerAlreadyUninstalled +ServerAlreadyUninstalledHelper +ServerAlreadyUninstalledHolder +ServerCloneException +ServerDef +ServerDefHelper +ServerDefHolder +ServerDelegate +ServerError +ServerException +ServerGIOP +ServerHeldDown +ServerHeldDownHelper +ServerHeldDownHolder +ServerHelper +ServerHolder +ServerIdHelper +ServerIdsHelper +ServerIdsHolder +ServerLocation +ServerLocationHelper +ServerLocationHolder +ServerLocationPerORB +ServerLocationPerORBHelper +ServerLocationPerORBHolder +ServerMain +ServerManager +ServerManagerHelper +ServerManagerHolder +ServerManagerImpl +ServerManagerOperations +ServerNotActive +ServerNotActiveException +ServerNotActiveHelper +ServerNotActiveHolder +ServerNotRegistered +ServerNotRegisteredHelper +ServerNotRegisteredHolder +ServerOperations +ServerRef +ServerRequest +ServerRequestImpl +ServerRequestInfo +ServerRequestInfoImpl +ServerRequestInfoOperations +ServerRequestInterceptor +ServerRequestInterceptorOperations +ServerResponse +ServerResponseImpl +ServerRuntimeException +ServerSocket +ServerSocketChannel +ServerSubcontract +ServerTableEntry +ServerTool +ServiceContext +ServiceContextData +ServiceContextHelper +ServiceContextHolder +ServiceContextListHelper +ServiceContextListHolder +ServiceContextRegistry +ServiceContexts +ServiceDetail +ServiceDetailHelper +ServiceIdHelper +ServiceInformation +ServiceInformationHelper +ServiceInformationHolder +ServicePermission +ServiceRegistry +ServiceUI +ServiceUIFactory +ServiceUnavailableException +Set +SetOfIntegerSyntax +SetOverrideType +SetOverrideTypeHelper +Severity +Shape +ShapeGraphicAttribute +SheetCollate +Short +ShortBuffer +ShortHolder +ShortLookupTable +ShortSeqHelper +ShortSeqHolder +Shutdown +ShutdownUtilDelegate +Sides +Signature +SignatureException +SignatureSpi +SignedMutableBigInteger +SignedObject +Signer +SimpleAttributeSet +SimpleBeanInfo +SimpleDateFormat +SimpleDoc +SimpleElementFactory +SimpleFormatter +SimpleHashtable +SimpleTextBoundary +SimpleTimeZone +SinglePixelPackedSampleModel +SingleSelectionModel +Size2DSyntax +SizeLimitExceededException +SizeRequirements +SizeSequence +Skeleton +SkeletonMismatchException +SkeletonNotFoundException +SliderUI +SlotTable +SlotTableStack +SmartGridLayout +Socket +SocketAddress +SocketChannel +SocketException +SocketHandler +SocketImpl +SocketImplFactory +SocketInputStream +SocketOptions +SocketOutputStream +SocketPermission +SocketSecurityException +SocketTimeoutException +SocksConsts +SocksSocketImpl +SocksSocketImplFactory +SoftBevelBorder +SoftReference +SolarisLoginModule +SolarisNumericGroupPrincipal +SolarisNumericUserPrincipal +SolarisPrincipal +SolarisSystem +SortedMap +SortedSet +SortingFocusTraversalPolicy +Source +SourceLocator +SourceTree +SourceTreeManager +SpecialMapping +SpecialMethod +SpinnerDateModel +SpinnerListModel +SpinnerModel +SpinnerNumberModel +SpinnerUI +SplitPaneUI +Spring +SpringLayout +Stack +StackGuard +StackOverflowError +StackTraceElement +StandardIIOPProfileTemplate +StandardMetadataFormat +StandardMetadataFormatResources +StartTlsRequest +StartTlsResponse +State +StateEdit +StateEditable +StateFactory +StateInvariantError +Statement +StepPattern +StopParseException +StreamCorruptedException +StreamHandler +StreamPrintService +StreamPrintServiceFactory +StreamResult +StreamSource +StreamTokenizer +Streamable +StreamableValue +StrictMath +String +StringBuffer +StringBufferInputStream +StringBufferPool +StringCharBuffer +StringCharacterIterator +StringCoding +StringContent +StringHolder +StringIndexOutOfBoundsException +StringNameHelper +StringReader +StringRefAddr +StringSelection +StringSeqHelper +StringSeqHolder +StringToIntTable +StringToStringTable +StringToStringTableVector +StringTokenizer +StringValueHelper +StringVector +StringWriter +Stroke +Struct +StructMember +StructMemberHelper +Stub +StubDelegate +StubDelegateImpl +StubNotFoundException +Style +StyleConstants +StyleContext +StyleSheet +StyleSheetList +StyledDocument +StyledEditorKit +StyledParagraph +Stylesheet +StylesheetComposed +StylesheetHandler +StylesheetPIHandler +StylesheetRoot +SubContextList +SubImageInputStream +SuballocatedByteVector +SuballocatedIntVector +SubcontractList +SubcontractRegistry +SubcontractResponseHandler +Subject +SubjectCodeSource +SubjectDomainCombiner +SupportedValuesAttribute +SwingConstants +SwingGraphics +SwingPropertyChangeSupport +SwingUtilities +SyncFailedException +SyncScopeHelper +SynthesisException +SyntheticImage +System +SystemColor +SystemEventQueueUtilities +SystemException +SystemFlavorMap +SystemIDResolver +TAG_ALTERNATE_IIOP_ADDRESS +TAG_CODE_SETS +TAG_INTERNET_IOP +TAG_JAVA_CODEBASE +TAG_MULTIPLE_COMPONENTS +TAG_ORB_TYPE +TAG_POLICIES +TCKind +TCPPortHelper +TCUtility +THREAD_POLICY_ID +TRANSACTION_REQUIRED +TRANSACTION_ROLLEDBACK +TRANSIENT +TRANSPORT_RETRY +TabExpander +TabSet +TabStop +TabableView +TabbedPaneUI +TableCellEditor +TableCellRenderer +TableColumn +TableColumnModel +TableColumnModelEvent +TableColumnModelListener +TableHeaderUI +TableModel +TableModelEvent +TableModelListener +TableUI +TableView +TagElement +TagStack +TaggedComponent +TaggedComponentBase +TaggedComponentFactories +TaggedComponentFactoryFinder +TaggedComponentHelper +TaggedComponentHolder +TaggedProfile +TaggedProfileFactoryFinder +TaggedProfileHelper +TaggedProfileHolder +TaggedProfileTemplate +TargetAddress +TargetAddressHelper +TemplateList +TemplateSubPatternAssociation +Templates +TemplatesHandler +Terminator +TestDTM +TestDTMNodes +TestDriver +Text +TextAction +TextArea +TextAreaDocument +TextAreaPeer +TextAttribute +TextBoundaryData +TextCallbackHandler +TextComponent +TextComponentPeer +TextEvent +TextField +TextFieldPeer +TextHitInfo +TextInputCallback +TextJustifier +TextLayout +TextLayoutStrategy +TextLine +TextListener +TextMeasurer +TextNode +TextOutputCallback +TextSyntax +TextUI +TexturePaint +TexturePaintContext +Thread +ThreadCurrentStack +ThreadDeath +ThreadGroup +ThreadLocal +ThreadPolicy +ThreadPolicyImpl +ThreadPolicyOperations +ThreadPolicyValue +ThreadPool +Throwable +Tie +TileObserver +Time +TimeLimitExceededException +TimeZone +Timer +TimerQueue +TimerTask +Timestamp +TitledBorder +TooManyListenersException +ToolBarUI +ToolTipManager +ToolTipUI +Toolkit +TrAXFilter +TraceListener +TraceListenerEx +TraceManager +TracerEvent +TransactionService +TransferHandler +Transferable +TransformAttribute +TransformSnapshot +TransformSnapshotImpl +TransformState +Transformer +TransformerClient +TransformerConfigurationException +TransformerException +TransformerFactory +TransformerFactoryConfigurationError +TransformerFactoryImpl +TransformerHandler +TransformerHandlerImpl +TransformerIdentityImpl +TransformerImpl +TransientBindingIterator +TransientNameServer +TransientNameService +TransientNamingContext +TransientObjectManager +Transparency +TreeCellEditor +TreeCellRenderer +TreeExpansionEvent +TreeExpansionListener +TreeMap +TreeModel +TreeModelEvent +TreeModelListener +TreeNode +TreePath +TreeSelectionEvent +TreeSelectionListener +TreeSelectionModel +TreeSet +TreeUI +TreeWalker +TreeWalker2Result +TreeWillExpandListener +Trie +TruncatedFileException +TrustAnchor +TypeCode +TypeCodeFactory +TypeCodeHolder +TypeCodeImpl +TypeCodeImplHelper +TypeMismatch +TypeMismatchException +TypeMismatchHelper +Types +UEInfoServiceContext +UID +UIDefaults +UIEvent +UIManager +UIResource +ULongLongSeqHelper +ULongLongSeqHolder +ULongSeqHelper +ULongSeqHolder +UNKNOWN +UNSUPPORTED_POLICY +UNSUPPORTED_POLICY_VALUE +URI +URIException +URIResolver +URISyntax +URISyntaxException +URL +URLClassLoader +URLConnection +URLDecoder +URLEncoder +URLStreamHandler +URLStreamHandlerFactory +URLStringHelper +USER_EXCEPTION +UShortSeqHelper +UShortSeqHolder +UTFDataFormatException +UnImplNode +UnaryOperation +UndeclaredThrowableException +UndoManager +UndoableEdit +UndoableEditEvent +UndoableEditListener +UndoableEditSupport +UnexpectedException +UnicastRemoteObject +UnicodeClassMapping +UnionMember +UnionMemberHelper +UnionPathIterator +UnionPattern +UnixLoginModule +UnixNumericGroupPrincipal +UnixNumericUserPrincipal +UnixPrincipal +UnixSystem +UnknownEncoding +UnknownEncodingHelper +UnknownError +UnknownException +UnknownGroupException +UnknownHostException +UnknownObjectException +UnknownServiceContext +UnknownServiceException +UnknownType +UnknownUserException +UnknownUserExceptionHelper +UnknownUserExceptionHolder +UnmappableCharacterException +UnmarshalException +UnmodifiableSetException +UnrecoverableKeyException +Unreferenced +UnresolvedAddressException +UnresolvedPermission +UnresolvedPermissionCollection +UnsatisfiedLinkError +UnsolicitedNotification +UnsolicitedNotificationEvent +UnsolicitedNotificationListener +UnsupportedAddressTypeException +UnsupportedCallbackException +UnsupportedCharsetException +UnsupportedClassVersionError +UnsupportedEncodingException +UnsupportedFlavorException +UnsupportedLookAndFeelException +UnsupportedOperationException +UserException +Util +UtilDelegate +Utilities +Utility +VMID +VM_ABSTRACT +VM_CUSTOM +VM_NONE +VM_TRUNCATABLE +ValidatingParser +ValueBase +ValueBaseHelper +ValueBaseHolder +ValueFactory +ValueHandler +ValueHandlerImpl +ValueHandlerImpl_1_3 +ValueHandlerImpl_1_3_1 +ValueMember +ValueMemberHelper +ValueUtility +Variable +VariableHeightLayoutCache +VariableStack +Vector +VerifyError +Version +VersionHelper +VersionHelper12 +VersionSpecHelper +VetoableChangeListener +VetoableChangeListenerProxy +VetoableChangeSupport +View +ViewCSS +ViewFactory +ViewportLayout +ViewportUI +VirtualMachineError +Visibility +VisibilityHelper +Void +VolatileImage +WCharSeqHelper +WCharSeqHolder +WStringSeqHelper +WStringSeqHolder +WStringValueHelper +WalkerFactory +WalkingIterator +WalkingIteratorSorted +WeakHashMap +WeakReference +WhiteSpaceInfo +WhitespaceStrippingElementMatcher +Win32FileSystem +Win32Process +WinNTFileSystem +Window +WindowAdapter +WindowConstants +WindowEvent +WindowFocusListener +WindowListener +WindowPeer +WindowStateListener +WindowsBorders +WindowsButtonListener +WindowsButtonUI +WindowsCheckBoxMenuItemUI +WindowsCheckBoxUI +WindowsComboBoxUI +WindowsDesktopIconUI +WindowsDesktopManager +WindowsDesktopPaneUI +WindowsEditorPaneUI +WindowsFileChooserUI +WindowsGraphicsUtils +WindowsIconFactory +WindowsInternalFrameTitlePane +WindowsInternalFrameUI +WindowsLabelUI +WindowsListUI +WindowsLookAndFeel +WindowsMenuBarUI +WindowsMenuItemUI +WindowsMenuUI +WindowsOptionPaneUI +WindowsPasswordFieldUI +WindowsPopupFactory +WindowsPopupMenuUI +WindowsPopupWindow +WindowsPreferences +WindowsPreferencesFactory +WindowsProgressBarUI +WindowsRadioButtonMenuItemUI +WindowsRadioButtonUI +WindowsRootPaneUI +WindowsScrollBarUI +WindowsScrollPaneUI +WindowsSeparatorUI +WindowsSliderUI +WindowsSpinnerUI +WindowsSplitPaneDivider +WindowsSplitPaneUI +WindowsTabbedPaneUI +WindowsTableHeaderUI +WindowsTableUI +WindowsTextAreaUI +WindowsTextFieldUI +WindowsTextPaneUI +WindowsTextUI +WindowsToggleButtonUI +WindowsToolBarUI +WindowsTreeUI +WindowsUtils +WireObjectKeyTemplate +WordBreakData +WordBreakTable +Work +WrappedPlainView +WrappedRuntimeException +WritableByteChannel +WritableRaster +WritableRenderedImage +WriteAbortedException +Writeable +Writer +WriterToASCI +WriterToUTF8 +WriterToUTF8Buffered +WrongAdapter +WrongAdapterHelper +WrongNumberArgsException +WrongParserException +WrongPolicy +WrongPolicyHelper +WrongTransaction +WrongTransactionHelper +WrongTransactionHolder +X500Principal +X500PrivateCredential +X509CRL +X509CRLEntry +X509CRLSelector +X509CertSelector +X509Certificate +X509EncodedKeySpec +X509Extension +XAConnection +XADataSource +XBoolean +XBooleanStatic +XConnection +XMLCharacterRecognizer +XMLDecoder +XMLEncoder +XMLFilter +XMLFilterImpl +XMLFormatter +XMLNSDecl +XMLReader +XMLReaderAdapter +XMLReaderFactory +XMLReaderImpl +XMLString +XMLStringFactory +XMLStringFactoryImpl +XNodeSet +XNodeSetForDOM +XNull +XNumber +XObject +XObjectFactory +XPATHErrorResourceBundle +XPATHErrorResources +XPATHErrorResources_de +XPATHErrorResources_en +XPATHErrorResources_es +XPATHErrorResources_fr +XPATHErrorResources_it +XPATHErrorResources_ja +XPATHErrorResources_ko +XPATHErrorResources_sv +XPATHErrorResources_zh_CN +XPATHErrorResources_zh_TW +XPath +XPathAPI +XPathContext +XPathDumper +XPathException +XPathFactory +XPathParser +XPathProcessorException +XRTreeFrag +XRTreeFragSelectWrapper +XResourceBundle +XResourceBundleBase +XResources_cy +XResources_de +XResources_el +XResources_en +XResources_es +XResources_fr +XResources_he +XResources_hy +XResources_it +XResources_ja_JP_A +XResources_ja_JP_HA +XResources_ja_JP_HI +XResources_ja_JP_I +XResources_ka +XResources_ko +XResources_sv +XResources_zh_CN +XResources_zh_TW +XSLInfiniteLoopException +XSLMessages +XSLProcessorContext +XSLProcessorVersion +XSLTAttributeDef +XSLTElementDef +XSLTElementProcessor +XSLTErrorResources +XSLTErrorResources_de +XSLTErrorResources_es +XSLTErrorResources_fr +XSLTErrorResources_it +XSLTErrorResources_ja +XSLTErrorResources_ko +XSLTErrorResources_sv +XSLTErrorResources_zh_CN +XSLTErrorResources_zh_TW +XSLTProcessorApplet +XSLTSchema +XString +XStringForChars +XStringForFSB +XUnresolvedVariable +XalanProperties +XmlChars +XmlDocument +XmlDocumentBuilder +XmlDocumentBuilderNS +XmlNames +XmlReader +XmlSupport +XmlWritable +XmlWriteContext +ZipConstants +ZipEntry +ZipException +ZipFile +ZipInputStream +ZipOutputStream +ZoneView diff --git a/PowerEditor/bin/plugins/APIs/javascript.api b/PowerEditor/bin/plugins/APIs/javascript.api new file mode 100644 index 00000000..80891bac --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/javascript.api @@ -0,0 +1,634 @@ +Anchor +Applet +Area +Array +Boolean +Button +Checkbox +Date +E +FileUpload +Form +Frame +Function +Hidden +History +Image +Infinity +JavaArray +JavaClass +JavaObject +JavaPackage +LN10 +LN2 +LOG10E +LOG2E +Layer +Link +Location +MAX_VALUE +MIN_VALUE +Math +MimeType +NEGATIVE_INFINITY +NaN +Number +Object +Option +PI +POSITIVE_INFINITY +Packages +Password +Plugin +Radio +RegExp +Reset +SQRT1_2 +SQRT2 +Select +String +Style +Submit +Text +Textarea +URL +URLUnencoded +UTC +XMLDocument +XSLDocument +_content +aLinkcolor +above +abs +acos +action +alert +align +all +anchor +anchors +appCodeName +appCore +appMinorVersion +appName +appVersion +applets +apply +arguments +arguments.callee +arguments.caller +arguments.length +arity +asin +atan +atan2 +atob +attachEvent +attributes +availHeight +availLeft +availTop +availWidth +back +background +backgroundColor +backgroundImage +below +bgColor +big +blink +blur +body +bold +boolean +border +borderBottomWidth +borderColor +borderLeftWidth +borderRightWidth +borderStyle +borderTopWidth +borderWidths +bottom +break +btoa +bufferDepth +byte +call +captureEvents +case +catch +ceil +char +charAt +charCodeAt +characterSet +checked +childNodes +class +className +classes +clear +clearInterval +clearTimeout +click +clientInformation +clip +clipboardData +close +closed +colorDepth +compile +complete +components +concat +confirm +const +constructor +contextual +continue +controllers +cookie +cookieEnabled +cos +cpuClass +createElement +createEventObject +createPopup +createStyleSheet +createTextNode +crypto +current +data +debugger +default +defaultCharset +defaultChecked +defaultStatus +defaultValue +defaultView +delete +description +detachEvent +dialogArguments +dialogHeight +dialogLeft +dialogTop +dialogWidth +dir +directories +disableExternalCapture +display +do +doctype +document +documentElement +domain +double +dump +elementFromPoint +elements +else +embeds +enableExternalCapture +enabledPlugin +encoding +enum +escape +eval +event +exec +execCommand +execScript +exp +expando +export +extends +external +false +fgColor +fileCreatedDate +fileModifiedDate +fileSize +fileUpdatedDate +filename +final +finally +find +firstChild +fixed +float +floor +focus +fontFamily +fontSize +fontWeight +fontcolor +fontsize +for +form +formName +forms +forward +frameElement +frames +fromCharCode +function +getAttention +getDate +getDay +getElementById +getElementsByName +getElementsByTagName +getFullYear +getHours +getMilliseconds +getMinutes +getMonth +getSeconds +getSelection +getTime +getTimezoneOffset +getUTCDate +getUTCDay +getUTCFullYear +getUTCHours +getUTCMilliseconds +getUTCMinutes +getUTCMonth +getUTCSeconds +getYear +global +go +goto +handleEvent +hasFocus +hash +height +history +home +host +hostname +href +hspace +ids +if +ignoreCase +images +implementation +implements +import +in +index +indexOf +innerHeight +innerWidth +input +instanceof +int +interface +isFinite +isNaN +italics +java +javaEnabled +join +language +lastChild +lastIndex +lastIndexOf +lastMatch +lastModified +lastParen +layerX +layers +left +leftContext +length +lineHeight +link +linkColor +links +listStyleType +load +localName +location +locationbar +log +long +lowsrc +marginBottom +marginLeft +marginRight +marginTop +margins +match +max +media +menubar +mergeAttributes +method +mimeTypes +min +moveAbove +moveBelow +moveBy +moveTo +moveToAbsolute +multiline +name +nameProp +namespaceURI +namespaces +native +navigate +navigator +netscape +new +next +nextSibling +nodeName +nodeType +nodeValue +null +offscreenBuffering +onAbort +onActivate +onAfterprint +onAfterupdate +onBeforeactivate +onBeforecut +onBeforedeactivate +onBeforeeditfocus +onBeforepaste +onBeforeprint +onBeforeunload +onBeforeupdate +onBlur +onCellchange +onChange +onClick +onClose +onContextmenu +onControlselect +onCut +onDataavailable +onDatasetchanged +onDatasetcomplete +onDblclick +onDeactivate +onDrag +onDragdrop +onDragend +onDragenter +onDragleave +onDragover +onDragstart +onDrop +onError +onErrorupdate +onFocus +onHelp +onKeydown +onKeypress +onKeyup +onLine +onLoad +onMousedown +onMousemove +onMouseout +onMouseover +onMouseup +onPaste +onPropertychange +onReadystatechange +onReset +onResize +onResizeend +onResizestart +onRowenter +onRowexit +onRowsdelete +onRowsinserted +onScroll +onSelect +onSelectionchange +onSelectstart +onStop +onSubmit +onUnload +open +opener +opsProfile +options +oscpu +outerHeight +outerWidth +ownerDocument +package +paddingBottom +paddingLeft +paddingRight +paddingTop +paddings +pageX +pageXOffset +pageY +pageYOffset +parent +parentLayer +parentNode +parentWindow +parse +parseFloat +parseInt +pathname +personalbar +pixelDepth +pkcs11 +platform +plugins +plugins.refresh +pop +port +pow +preference +prefix +previous +previousSibling +print +private +product +productSub +prompt +prompter +protected +protocol +prototype +public +push +queryCommandEnabled +queryCommandIndeterm +queryCommandState +queryCommandValue +random +readyState +recalc +referrer +releaseCapture +releaseEvents +reload +replace +reset +resizeBy +resizeTo +return +returnValue +reverse +right +rightContext +round +routeEvents +savePreferences +screen +screenLeft +screenTop +screenX +screenY +scripts +scroll +scrollBy +scrollByLines +scrollByPages +scrollTo +scrollX +scrollY +scrollbars +search +security +securityPolicy +select +selected +selectedIndex +selection +self +setActive +setCursor +setDate +setFullYear +setHotKeys +setHours +setInterval +setMilliseconds +setMinutes +setMonth +setResizable +setSeconds +setTime +setTimeout +setUTCDate +setUTCFullYear +setUTCHours +setUTCMilliseconds +setUTCMinutes +setUTCMonth +setUTCSeconds +setYear +setZOptions +shift +short +showHelp +showModalDialog +showModelessDialog +siblingAbove +siblingBelow +sidebar +signText +sin +sizeToContent +slice +small +sort +source +splice +split +sqrt +src +static +status +statusbar +stop +strike +styleSheets +sub +submit +substr +substring +suffixes +sun +sup +super +switch +synchronized +systemLanguage +tags +taint +taintEnabled +tan +target +test +text +textAlign +textDecoration +textIndent +textTransform +this +throw +throws +title +toGMTString +toLocaleString +toLowerCase +toSource +toString +toUTCString +toUpperCase +toolbar +top +transient +true +try +type +typeof +undefined +unescape +uniqueID +unshift +untaint +unwatch +updateCommands +updateInterval +userAgent +userLanguage +userProfile +vLinkcolor +value +valueOf +var +vendor +vendorSub +visibility +void +volatile +vspace +watch +while +whiteSpace +width +window +with +write +writeln +x +y +zIndex diff --git a/PowerEditor/bin/plugins/APIs/lisp.api b/PowerEditor/bin/plugins/APIs/lisp.api new file mode 100644 index 00000000..68914342 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/lisp.api @@ -0,0 +1,478 @@ +*error* +*vlisp-new-full-init* +abs +acad_colordlg +acad_helpdlg +acad_strlsort +acdimenableupdate +acet-layerp-mark +acet-layerp-mode +acet-laytrans +acet-ms-to-ps +acet-ps-to-ms +action_tile +add_list +ads +alert +align +alloc +and +angle +angtof +angtos +append +apply +arx +arxload +arxunload +ascii +assoc +atan +atof +atoi +atom +atoms-family +autoarxload +autoload +bhatch +bherrs +boole +boundp +bpoly +c:3dsin +c:3dsout +c:cal +c:fog +c:light +c:lsedit +c:lslib +c:lsnew +c:matlib +c:olprof +c:render +c:renderupdate +c:replay +c:rmat +c:rpref +c:saveimg +c:scene +c:setuv +c:showmat +c:stats +caaaar +caaadr +caaar +caadar +caaddr +caadr +caar +cadaar +cadadr +cadar +caddar +cadddr +caddr +cadr +car +cdaaar +cdaadr +cdaar +cdadar +cdaddr +cdadr +cdar +cddaar +cddadr +cddar +cdddar +cddddr +cdddr +cddr +cdr +chr +client_data_tile +close +command +cond +cons +cos +cvunit +defun +defun-q +defun-q-list-ref +defun-q-list-set +dictadd +dictnext +dictremove +dictrename +dictsearch +dimx_tile +dimy_tile +distance +distof +done_dialog +end_image +end_list +entdel +entget +entlast +entmake +entmakex +entmod +entnext +entsel +entupd +eq +equal +eval +exit +exp +expand +expt +fill_image +findfile +fix +float +fnsplitl +foreach +function +gc +gcd +get_attr +get_tile +getangle +getcfg +getcname +getcorner +getdist +getenv +getfiled +getint +getkword +getorient +getpoint +getreal +getstring +geturl +getvar +graphscr +grclear +grdraw +grread +grtext +grvecs +handent +help +if +initdia +initget +inters +ismnugrploaded +itoa +lambda +last +layoutlist +length +list +listp +load +load_dialog +log +logand +logior +lsh +mapcar +max +mem +member +menucmd +menugroup +min +minusp +mirror3d +mode_tile +mtedit +mtprop +namedobjdict +nentsel +nentselp +new_dialog +not +nth +null +numberp +open +or +osnap +pause +pi +polar +pragma +prin1 +princ +print +progn +prompt +quit +quote +read +read-char +read-line +redraw +regapp +rem +repeat +report +reverse +rotate3d +rtos +set +set_tile +setcfg +setenv +setfunhelp +setq +seturl +setvar +setview +sin +slide_image +snvalid +sqrt +ssadd +ssdel +ssget +ssgetfirst +sslength +ssmemb +ssname +ssnamex +sssetfirst +start_dialog +start_image +start_list +startapp +strcase +strcat +strlen +subst +substr +tablet +tblnext +tblobjname +tblsearch +term_dialog +terpri +textbox +textpage +textscr +trace +trans +type +unload_dialog +untrace +vector_image +ver +vl-acad-defun +vl-acad-undefun +vlarts-init +vl-arx-import +vlax-3D-point +vlax-add-cmd +vlax-create-object +vlax-curve-getArea +vlax-curve-getClosestPointTo +vlax-curve-getClosestPointToProjection +vlax-curve-getDistAtParam +vlax-curve-getDistAtPoint +vlax-curve-getEndParam +vlax-curve-getEndPoint +vlax-curve-getFirstDeriv +vlax-curve-getParamAtDist +vlax-curve-getParamAtPoint +vlax-curve-getPointAtDist +vlax-curve-getPointAtParam +vlax-curve-getSecondDeriv +vlax-curve-getStartParam +vlax-curve-getStartPoint +vlax-curve-isClosed +vlax-curve-isPeriodic +vlax-curve-isPlanar +vlax-dump-object +vlax-ename->vla-object +vlax-erased-p +vlax-for +vlax-get-acad-object +vlax-get-object +vlax-get-or-create-object +vlax-get-property +vlax-import-type-library +vlax-invoke-method +vlax-ldata-delete +vlax-ldata-get +vlax-ldata-list +vlax-ldata-put +vlax-ldata-test +vlax-make-safearray +vlax-make-variant +vlax-map-collection +vlax-method-applicable-p +vlax-object-released-p +vlax-product-key +vlax-property-available-p +vlax-put-property +vlax-read-enabled-p +vlax-release-object +vlax-remove-cmd +vlax-safearray->list +vlax-safearray-fill +vlax-safearray-get-dim +vlax-safearray-get-element +vlax-safearray-get-l-bound +vlax-safearray-get-u-bound +vlax-safearray-put-element +vlax-safearray-type +vlax-tmatrix +vlax-typeinfo-available-p +vlax-variant-change-type +vlax-variant-type +vlax-variant-value +vlax-vla-object->ename +vlax-write-enabled-p +vl-bb-ref +vl-bb-set +vl-bt +vl-bt-off +vl-bt-on +vl-catch-all-apply +vl-catch-all-error-message +vl-catch-all-error-p +vl-cmdf +vl-consp +vl-directory-files +vl-doc-export +vl-doc-import +vl-doc-ref +vl-doc-set +vl-every +vl-exit-with-error +vl-exit-with-value +vl-file-copy +vl-file-delete +vl-file-directory-p +vl-filename-base +vl-filename-directory +vl-filename-extension +vl-filename-mktemp +vl-file-rename +vl-file-size +vl-file-systime +vl-get-resource +vl-infp +vl-init +vlisp-compile +vlisp-dclres-list +vlisp-dclres-load-dialog +vlisp-export-symbol +vlisp-fasres-list +vlisp-fasres-load +vlisp-import-exsubrs +vlisp-import-symbol +vlisp-inires-list +vl-list* +vl-list->string +vl-list-exported-functions +vl-list-length +vl-list-loaded-vlx +vl-load-all +vl-load-com +vl-load-reactors +vl-member-if +vl-member-if-not +vl-mkdir +vl-nanp +vl-position +vl-prin1-to-string +vl-princ-to-string +vl-propagate +vlr-acdb-reactor +vlr-add +vlr-added-p +vlr-beep-reaction +vlr-command-reactor +vlr-current-reaction-name +vlr-data +vlr-data-set +vlr-deepclone-reactor +vlr-docmanager-reactor +vlr-dwg-reactor +vlr-dxf-reactor +vlr-editor-reactor +vl-registry-delete +vl-registry-descendents +vl-registry-read +vl-registry-write +vl-remove +vl-remove-if +vl-remove-if-not +vlr-insert-reactor +vlr-linker-reactor +vlr-lisp-reactor +vlr-miscellaneous-reactor +vlr-mouse-reactor +vlr-notification +vlr-object-reactor +vlr-owner-add +vlr-owner-remove +vlr-owners +vlr-pers +vlr-pers-list +vlr-pers-p +vlr-pers-release +vlr-reaction-name +vlr-reactions +vlr-reaction-set +vlr-reactors +vlr-remove +vlr-remove-all +vlr-set-notification +vlr-sysvar-reactor +vlr-toolbar-reactor +vlr-trace-reaction +vlr-type +vlr-types +vlr-undo-reactor +vlr-wblock-reactor +vlr-window-reactor +vlr-xref-reactor +vl-some +vl-sort +vl-sort-i +vl-string->list +vl-string-elt +vl-string-left-trim +vl-string-mismatch +vl-string-position +vl-string-right-trim +vl-string-search +vl-string-subst +vl-string-translate +vl-string-trim +vl-symbol-name +vl-symbolp +vl-symbol-value +vl-unload-vlx +vl-vbaload +vl-vbarun +vl-vlx-loaded-p +vlx-loaded-p +vmon +vports +wcmatch +while +write-char +write-line +xdroom +xdsize +xstrcase +zerop diff --git a/PowerEditor/bin/plugins/APIs/nsis.api b/PowerEditor/bin/plugins/APIs/nsis.api new file mode 100644 index 00000000..862bc165 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/nsis.api @@ -0,0 +1,219 @@ +!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 +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 +DirText +DirVar +DirVerify +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 +Nop +OutFile +Page +PageEx +PageExEnd +Pop +Push +Quit +ReadEnvStr +ReadINIStr +ReadRegDWORD +ReadRegStr +Reboot +RegDLL +Rename +ReserveFile +Return +RMDir +SearchPath +Section +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 +ShowInstDetails +ShowUninstDetails +ShowWindow +SilentInstall +SilentUnInstall +Sleep +SpaceTexts +StrCmp +StrCmpS +StrCpy +StrLen +SubCaption +SubSection +SubSectionEnd +UninstallButtonText +UninstallCaption +UninstallIcon +UninstallSubCaption +UninstallText +UninstPage +UnRegDLL +Var +VIAddVersionKey +VIProductVersion +WindowIcon +WriteINIStr +WriteRegBin +WriteRegDWORD +WriteRegExpandStr +WriteRegStr +WriteUninstaller +XPStyle \ No newline at end of file diff --git a/PowerEditor/bin/plugins/APIs/pascal.api b/PowerEditor/bin/plugins/APIs/pascal.api new file mode 100644 index 00000000..aeefabd7 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/pascal.api @@ -0,0 +1,18407 @@ +ABAccessibility +Abandon +AbandonSignalHandler +Abort +AbortDoc +Aborted +AbortPath +AbortPrinter +AbortProc +AbortRecord +AbortRecordVariants +AbortSystemShutdown +AbortSystemShutdownA +AbortSystemShutdownW +absolute +absoluteChildNumber +abstract +AccCtrl +accDoDefaultAction +Accept +AcceptChanges +AcceptEx +acceptNode +AcceptsClass +AccessCheck +AccessCheckAndAuditAlarm +AccessCheckAndAuditAlarmA +AccessCheckAndAuditAlarmW +AccessCheckByType +AccessCheckByTypeAndAuditAlarm +AccessCheckByTypeAndAuditAlarmA +AccessCheckByTypeAndAuditAlarmW +AccessCheckByTypeResultList +AccessCheckByTypeResultListAndAuditAlarm +AccessCheckByTypeResultListAndAuditAlarmA +AccessCheckByTypeResultListAndAuditAlarmW +AccessData +AccessError +AccessibleObjectFromID +AccessibleObjectFromWindow +accHitTest +accLocation +accNavigate +accSelect +acl_root +AclAPI +Acquire +AcquireExceptionObject +AcquireFocus +AcquireLayoutLock +ActionBarListClick +ActionBarListClickCheck +ActionChange +ActionIdleTimerProc +ActionsListClick +ActionsListData +ActionsListDrawItem +ActionsListMeasureItem +ActionsListStartDrag +Activate +ActivateBuffers +ActivateClassGroup +Activated +ActivateFilters +ActivateHint +ActivateHintData +ActivateInspector +ActivateKeyboardLayout +ActivateMe +ActivateTextFilter +ActiveBuffer +ActiveChange +ActiveChanged +ActiveClassGroup +ActiveConnection +ActiveX +ActivityId +ActnColorMaps +ActnCtrls +ActnList +ActnMan +ActnMenus +ActnPopup +ActnRes +actory +ActualSpacing +Add +AddAccessAllowedAce +AddAccessAllowedAceEx +AddAccessAllowedObjectAce +AddAccessDeniedAce +AddAccessDeniedAceEx +AddAccessDeniedObjectAce +AddAce +AddAction +AddActionClass +AddActionMenu +AddActions +AddAggregate +AddAlias +AddAllFields +AddAncestor +AddAppEvent +AddAtom +AddAtomA +AddAtomW +AddAttribute +AddAuditAccessAce +AddAuditAccessAceEx +AddAuditAccessObjectAce +AddBiDiModeExStyle +AddBitmap +AddButtonClick +AddCategory +AddChars +AddCheckButton +AddChild +AddChildElement +AddChildFirst +AddChildNode +AddChildObject +AddChildObjectFirst +AddClass +AddClick +AddClient +AddColumn +AddColumnDesc +AddComboBox +AddCommand +AddCompilerMessage +AddComplexType +AddConnection +AddConstraints +AddContainer +AddContextMenuItem +AddControl +AddControlItem +AddCurrency +AddCurrencySymbol +AddCustomMessage +AddCustomMessagePtr +AddDatabase +AddDataLink +AddDataModule +AddDataPacket +AddDataSetAttributes +AddDataSource +AddDesktopItem +AddDesktopItemWithUI +AddDispatch +AddDrive +AddDriver +Added +AddEdges +AddEditBox +AddEditFormat +AddEditOptions +AddedNode +AddEmpty +addEntRefSubtree +AddError +AddExistingProject +AddExitProc +AddExprFilter +AddExtends +AddExtraFieldProps +AddField +AddFieldButtonClick +AddFieldDef +AddFieldDefs +AddFieldDesc +AddFieldLinks +AddFieldProps +AddFields +AddFieldToList +AddFile +AddFileFilter +AddFileSystem +AddFileWithParent +AddFilter +AddFilterCallBack +AddFirst +AddFontMemResourceEx +AddFontResource +AddFontResourceA +AddFontResourceEx +AddFontResourceExA +AddFontResourceExW +AddFontResourceW +AddForm +AddFormA +AddFormW +AddFuncDesc +AddFuncFilter +AddGroup +AddHeader +AddHighlighter +AddHistoryItem +AddHostedNode +AddIcon +AddIconToImageList +AddImage +AddImageList +AddImages +AddImplType +AddIn +AddIndex +AddIndexDef +AddIndexDefs +Adding +AddInksetInterval +AddItem +AddItemClick +AddJob +AddJobA +AddJobW +AddKeyBinding +AddKeyboardBinding +AddKeyword +AddLine +AddLiterals +AddManager +AddMapping +AddMasked +AddMember +AddMenu +AddMenuCommand +AddMenuCreatorNotifier +AddMenuToList +AddMessage +AddMessageGroup +AddMinMax +AddModuleUnloadProc +AddMonitor +AddMonitorA +AddMonitorW +AddNamespace +AddNegCurrencySymbol +AddNew +AddNewLocation +AddNewProject +AddNewSection +AddNode +AddNodeClassInfo +AddNormalizedFractions +AddNotifier +AddNotifierEx +AddObject +AddObjectFactory +AddObjectFirst +AddOffset +AddOle2 +AddOptParameter +AddPages +AddPaletteDesignerState +AddPaletteState +AddParam +AddParameter +AddParamSQLForDetail +AddPassword +AddPenDataHRC +AddPenInputHRC +AddPlace +AddPluginInfo +AddPoint +AddPointsPenData +AddPopupForm +AddPort +AddPortA +AddPortW +AddPrinter +AddPrinterA +AddPrinterConnection +AddPrinterConnectionA +AddPrinterConnectionW +AddPrinterDriver +AddPrinterDriverA +AddPrinterDriverW +AddPrinterW +AddPrintProcessor +AddPrintProcessorA +AddPrintProcessorW +AddPrintProvidor +AddPrintProvidorA +AddPrintProvidorW +AddProcess +AddProductInfo +AddProject +AddPropertySheetPages +AddPushButton +AddRadioButtonList +AddRecord +AddRef +AddRefAccessor +AddReference +AddRefHfont +AddRefRows +AddRefTypeInfo +Address +AddressInProcess +AddressOfMember +AddRootNode +AddScript +AddSection +AddSeparator +AddSession +AddSink +AddSpeedSetting +AddSQLExprAttr +AddStandardAlias +AddStatement +AddStrings +AddSubtractNormalizedFractions +AddTableButtonClick +AddTemporaryLabel +AddTerminateProc +AddText +AddThread +AddTitleMessage +AddToBindList +AddToInterface +AddToList +AddToolbar +AddToolButton +AddToolMessage +AddType +AddTypeCount +AddUrl +AddVarDesc +AddWatch +AddWatchAtCursor +AddWhereClause +addWideChar +AddWideCompilerMessage +AddWideMessageGroup +addWideString +AddWideTitleMessage +AddWideToolMessage +AddWizard +AddWordsHWL +Adjust +AdjustBiDiBehavior +AdjustBounds +AdjustCaptionRect +AdjustCellRect +AdjustClientRect +AdjustColor +AdjustColors +AdjustColWidths +AdjustControl +AdjustControlRect +AdjustDate +AdjustDays +AdjustDecimalPosition +AdjustDockRect +AdjustDropDown +AdjustFirstRecord +AdjustHeight +AdjustHours +AdjustLineBreaks +Adjustment +AdjustMinutes +AdjustMonths +AdjustRect +AdjustRowCount +AdjustSeconds +AdjustSize +AdjustTokenGroups +AdjustTokenPrivileges +AdjustWindowRect +AdjustWindowRectEx +adler32 +ADOConAnyProblems +ADOConDragOver +ADOConDropOver +AdoConEd +ADOConFigureParent +ADOConst +ADODB +ADOInt +ADOReg +ADOTypeToFieldType +AdvancedDocumentProperties +AdvancedDocumentPropertiesA +AdvancedDocumentPropertiesW +AdvancedDrawItem +Advise +AdvStart +AdvStop +AfterCompile +AfterConstruction +AfterItemsModified +AfterRename +AfterSave +AggValueAsVariant +alias +AliasNameChange +AliasNameDropDown +Align +AlignControl +AlignControls +AlignForm +AlignForms +AlignWork +AListBoxClick +AListBoxKeyDown +AListBoxKeyPress +AllEqual +aller +AllNamed +Alloc +AllocateAndInitializeSid +AllocateException +AllocateHWnd +AllocateIndex +AllocateLineDC +AllocateLocallyUniqueId +AllocCachedUpdateBuffers +AllocConsole +AllocDispID +AllocFilterStr +AllocKeyBuffers +AllocMem +AllocRecordBuffer +AllocResource +AllocTlsBuffer +AllocTlsIndex +AllowCodeInsight +AllowConnect +AllowSave +AllowWildConnect +AllowXMLExecute +AlphaBlend +AlphaDIBBlend +AlphaSort +AlterColumn +AlterIndex +AlterTable +AMDeferUpdate +analyzeCM +analyzeIntDTDStr +ancestorChildNumber +AncestorIsValid +AncestorNameMatches +Anchored +and +AngleArc +Animate +Animate_Close +Animate_Create +Animate_Open +Animate_OpenEx +Animate_Play +Animate_Seek +Animate_Stop +AnimatePalette +AnimateWindow +Annuity2 +AnotherObject +AnsiAppend +AnsiAssign +AnsiCat +AnsiCompareFileName +AnsiCompareStr +AnsiCompareText +AnsiContainsStr +AnsiContainsText +AnsiCopy +AnsiDelete +AnsiDequotedStr +AnsiEndsStr +AnsiEndsText +AnsiExtractQuotedStr +AnsiFree +AnsiFromPWideChar +AnsiFromWide +AnsiIndexStr +AnsiIndexText +AnsiInsert +AnsiLastChar +AnsiLeftStr +AnsiLower +AnsiLowerBuff +AnsiLowerCase +AnsiLowerCaseFileName +AnsiMatchStr +AnsiMatchText +AnsiMidStr +AnsiNext +AnsiPos +AnsiPrev +AnsiQuotedStr +AnsiReplaceStr +AnsiReplaceText +AnsiResemblesText +AnsiReverseString +AnsiRightStr +AnsiSameCaption +AnsiSameStr +AnsiSameText +AnsiSetLength +AnsiStartsStr +AnsiStartsText +AnsiStrComp +AnsiStrIComp +AnsiStrLastChar +AnsiStrLComp +AnsiStrLIComp +AnsiStrLower +AnsiStrPos +AnsiStrRScan +AnsiStrScan +AnsiStrUpper +AnsiToNative +AnsiToNativeBuf +AnsiToOem +AnsiToOemBuff +AnsiToUtf8 +AnsiToUtf8Ex +AnsiUpper +AnsiUpperBuff +AnsiUpperCase +AnsiUpperCaseFileName +AnyOp +AnyPopup +AnyProblems +AnyToIntf +Append +appendChild +AppendChunk +AppendData +AppendItem +AppendMenu +AppendMenuA +AppendMenuW +appendNamedItem +AppendParameters +AppendRecord +AppendStr +AppendTo +AppendToLog +AppEvnts +ApplicationHandleException +Apply +ApplyActionExecute +ApplyActionUpdate +ApplyChanges +ApplyFilePath +ApplyNewLocations +ApplyProperties +ApplyRange +ApplyThemeChange +ApplyToAllActnUpdate +ApplyUpdates +ApplyViewState +ar +arameter +Arc +ArcCos +ArcCosh +ArcCot +ArcCotH +ArcCsc +ArcCscH +ArcSec +ArcSecH +ArcSin +ArcSinh +ArcTan +ArcTan2 +ArcTanh +ArcTo +AreAllAccessesGranted +AreAnyAccessesGranted +AreContextItemsStored +AreDependenciesStored +AreFileApisANSI +AreItemsStored +AreOSExceptionsBlocked +ArgError +Arith_RdSigned +Arith_RdUnsigned +Arrange +ArrangeButtons +ArrangeControl +ArrangeControlInCell +ArrangeControls +ArrangeIconicWindows +ArrangeIcons +array +ArrayContains +ArrowKeys +as +AS_ApplyUpdates +AS_DataRequest +AS_Execute +AS_GetParams +AS_GetProviderNames +AS_GetRecords +AS_RowRequest +asm +AspTlb +assembler +Assign +AssignClient +AssignCommandText +AssignCurValues +AssignError +AssignField +AssignFields +AssignFieldValue +AssignFileTypes +AssignGraphic +AssignHelpSelector +AssignLongStr +AssignNestedDataSet +AssignOptions +AssignParam +AssignParameter +AssignParseOptions +AssignPascalString +AssignPicture +AssignPrn +AssignProc +AssignStr +AssignTo +AssignToBitmap +AssignToMetafile +AssignToParam +AssignToPicture +AssignValue +AssignValues +AssignVariant +AssocCreate +AssociateAttributes +AssocQueryKey +AssocQueryKeyA +AssocQueryKeyW +AssocQueryString +AssocQueryStringA +AssocQueryStringByKey +AssocQueryStringByKeyA +AssocQueryStringByKeyW +AssocQueryStringW +AsWideString +AsyncInitSocket +AsyncInstallDistributionUnit +asyncLoadState +atabase +ataSet +ateIn +AtLeast +AttachNode +AttachProcess +AttachThreadInput +AttemptToUseSharedMemoryManager +AttributeClick +attributeDefinition +AttributeListNotify +AttributesChanged +AttributeSetStored +AutoAddColumn +AutoAddRow +AutoButtonSet +AutoComplete +AutoFill +AutoHideTimerExec +AutomationTerminateProc +AutoPopTimerExec +AutoScroll +AutoScrollEnabled +AutoScrollInView +AutoSizingChanged +auxGetDevCaps +auxGetDevCapsA +auxGetDevCapsW +auxGetNumDevs +auxGetVolume +auxOutMessage +auxSetVolume +aveInitProc +AvgCharWidth +AxCtrls +Back +BackClick +BackgroundClipped +BackgroundSize +Backslash +BackspaceDelete +BackupEventLog +BackupEventLogA +BackupEventLogW +BackupRead +BackupREGDB +BackupSeek +BackupVarBoolFromStr +BackupVarBStrFromBool +BackupVarBStrFromCy +BackupVarBStrFromDate +BackupVarCyFromStr +BackupVarDateFromStr +BackupVarI4FromStr +BackupVariantChangeTypeEx +BackupVarR4FromStr +BackupVarR8FromStr +BackupWrite +BadIndex +BandActn +BaseEditSQL +BatchMove +BcdAdd +BcdCompare +BcdCurrencyFormat +BcdDivide +BcdError +BcdErrorFmt +BcdFixedOrNumberFormat +BcdFromBytes +BcdGeneralFormat +BcdMultiply +BcdPrecision +BcdRangeError +BcdScale +BcdScientificFormat +BcdSubtract +BcdToBytes +BCDToCurr +BcdToDouble +BcdToInteger +BcdToStr +BcdToStrF +BCtrlGrid +BdeCallBack +bdeconst +bdemts +BDEReg +Beep +BeforeCompile +BeforeDestruction +BeforeItemsModified +BeforeProgramLaunch +BeforeRename +BeforeSave +begin +BeginAbort +BeginAbortVariants +BeginAnimation +BeginAutoDrag +BeginBlock +BeginColumnDrag +BeginCommit +BeginCommitVariants +BeginCreateFields +BeginDeferWindowPos +BeginDesign +BeginDispatch +BeginDoc +BeginDrag +BeginEditing +BeginGlobalLoading +BeginInsertAppend +BeginLayout +BeginPaint +BeginPath +BeginPrepare +BeginPrepareVariants +BeginRead +BeginReferences +BeginRowDrag +BeginThread +BeginTrans +BeginTransaction +BeginTransComplete +BeginUpdate +BeginUpdateFieldDefs +BeginUpdateResource +BeginUpdateResourceA +BeginUpdateResourceW +BeginWrite +BestClass +BestGroup +BetterSize +BevelLine +BevelRect +BEvent +BiDiDraw +BinaryOp +BinaryRead +BinaryWrite +Bind +BindBtnClick +BindFields +BindForwarder +BindIfRunning +BindImage +BindImageEx +BindingListClick +BindKeyboard +BindListClick +BindMoniker +BindParams +BindToHandler +BindToObject +BindToSource +BindToStorage +BindType +BInfo +BinToHex +BitBlt +BitBtn1Click +BitmapChanged +BiUnimplemented +bj +BlankArgument +BlankStr +blink +BlockOSExceptions +BlockReaders +BlockReadNext +BoldDays +BookmarkAvailable +BookmarkGoto +BookmarkRecord +BookmarkToggle +BookmarkValid +BOOL +Boolean +BoolToStr +BoolToWStrViaOS +BoundingRectFromPoints +Bounds +BoundsChanged +BoxRect +break +BreakpointAdded +BreakpointChanged +BreakpointDeleted +BreakpointIsValid +BringToFront +BringWindowToTop +Broadcast +BroadcastSystemMessage +BroadcastSystemMessageA +BroadcastSystemMessageW +BrowseCallbackProc +BrowseClick +BrowseObject +BrowseProperties +BrowseSymbolAtCursor +BrushChanged +BrushCopy +BstrFromVector +BtnClick +BtnMouseDown +BucketFor +BufConvert +BufferModified +BuffersEqual +BufferToByteArray +BufferToVar +Build +BuildAggMap +BuildClick +BuildCommDCB +BuildCommDCBA +BuildCommDCBAndTimeouts +BuildCommDCBAndTimeoutsA +BuildCommDCBAndTimeoutsW +BuildCommDCBW +BuildExplicitAccessWithName +BuildExplicitAccessWithNameA +BuildExplicitAccessWithNameW +BuildImage +BuildImpersonateExplicitAccessWithName +BuildImpersonateExplicitAccessWithNameA +BuildImpersonateExplicitAccessWithNameW +BuildImpersonateTrustee +BuildImpersonateTrusteeA +BuildImpersonateTrusteeW +BuildList +BuildLocalMenu +BuildProject +BuildSecurityDescriptor +BuildSecurityDescriptorA +BuildSecurityDescriptorW +BuildTrusteeWithName +BuildTrusteeWithNameA +BuildTrusteeWithNameW +BuildTrusteeWithSid +BuildTrusteeWithSidA +BuildTrusteeWithSidW +Button_GetIdealSize +Button_GetImageList +Button_GetNote +Button_GetNoteLength +Button_GetSplitInfo +Button_GetTextMargin +Button_SetDropDownState +Button_SetElevationRequiredState +Button_SetImageList +Button_SetNote +Button_SetSplitInfo +Button_SetTextMargin +ButtonClick +ButtonGroup +ButtonIndex +ButtonRect +Buttons +byte +ByteArrayToBuffer +BytesPerScanline +ByteSwapColors +ByteToCharIndex +ByteToCharLen +ByteType +C +Cache +CachedUpdateCallBack +CalcActualButtonsPerRow +CalcAmount +CalcAutoRange +CalcBounds +CalcBufferSizes +CalcButtonLayout +CalcButtonSize +CalcButtonsPerCol +CalcButtonsPerRow +CalcButtonWidth +CalcCategoryHeight +CalcCategoryHeights +CalcCategoryWidth +CalcCategoryWidths +CalcClientDelta +CalcConstraints +CalcCoordFromPoint +CalcDockedWidth +CalcDockSize +CalcDrawInfo +CalcDrawInfoXY +CalcFieldsCallBack +CalcFixedInfo +CalcHintRect +CalcHorzPos +CalcInsertPosition +CalcJmpOffset +CalcLayout +CalcLookupValue +CalcMaxTopLeft +CalcMinSize +CalcNumTabs +CalcPrecisionAndDigits +CalcRect +CalcRowsSeen +CalcShadowColor +CalcSize +CalcSizingState +CalcSplitSize +CalcSplitterPos +CalcTabPositions +CalcTitleRect +CalcTotalSize +CalculatedStored +CalculateFields +calculatePieceOffset +calculateReplacementText +CalcVertPos +CalcXY +CallbackProc +CallBDEInitProcs +CallComplete +CallCreateObject +CallDefWndProc +CallEventMethod +CallFreeObject +CallGetIDsOfNames +CallGetServerList +CallHtmlHelp +CallInvoke +CallKeyBindingProc +CallMsgFilter +CallMsgFilterA +CallMsgFilterW +CallNamedPipe +CallNamedPipeA +CallNamedPipeW +CallNextHookEx +CALLOC +CallOnTerminate +CallPaintEvent +CallSpecialWinHelp +CallTerminateProcs +CallWindowProc +CallWindowProcA +CallWindowProcW +CallWinHelp +CallWndHook +CanAdd +CanAutoSize +CanBePooled +CanBindProperty +CanBlockRead +Cancel +CancelBatch +CancelBtnClick +CancelDC +CancelDispatch +CancelDrag +CancelEdit +CancelHint +CancelIo +CancelLayout +CancelLink +CancelMenu +CancelMode +CancelNestedDataSets +CancelRange +CancelUpdate +CancelUpdates +CancelWaitableTimer +CanChange +CanClose +CanCollapse +CanConvert +CanCreateObject +CanDelete +CanEdit +CanEditAcceptKey +CanEditModify +CanEditShow +CanExpand +CanExportFile +CanFocus +CanGotoSource +CanGridAcceptKey +CanHandle +CanImportFile +CanInPlaceActivate +CanModify +CanMove +CanPaste +CanReloadSymbolTable +CanResize +CanScrollLeft +CanScrollRight +CanSetProperties +CanShow +CanShowALink +CanShowContext +CanShowTab +CanShowTableOfContents +CanShowTopic +CanUseShort +CanvasChanged +CanWindowlessActivate +Caption +CaptionedDockTree +CaptionFor +CaptionHeight +CaptionLength +CaptionOptionsComboChange +Capture +CaretPos +Cascade +CascadeWindows +case +Cast +CastTo +CastToOle +CategoryButtons +CatListClick +CatListStartDrag +CCheck +CDATA +CDataNormalization +cdecl +CDSEdit +cdwLocals +Ceil +CellClick +CellIndexToCell +CellRect +CellToCellIndex +CelsiusToFahrenheit +CelsiusToKelvin +CelsiusToRankine +CelsiusToReaumur +Center +CenterPoint +CenterWindow +ChainCall +Change +ChangeActivePage +ChangeAppWindow +ChangeBiDiPosition +ChangeBitmap +ChangeClipboardChain +Changed +ChangeDisplaySettings +ChangeDisplaySettingsA +ChangeDisplaySettingsEx +ChangeDisplaySettingsExA +ChangeDisplaySettingsExW +ChangeDisplaySettingsW +ChangeExpandedCount +ChangeFileExt +ChangeFilePath +ChangeGridOrientation +ChangeIconDialog +ChangeIfNot +ChangeKey +ChangeLevelBy +ChangeLink +ChangeMenu +ChangeMenuA +ChangeMenuW +ChangeName +ChangeNotification +ChangePage +ChangeScale +ChangeServiceConfig +ChangeServiceConfigA +ChangeServiceConfigW +ChangeSize +ChangeVisibility +ChangeWeakCount +Changing +char +CharacterSizeLocaleChar +CharacterSizeWideChar +CharacterToSymbol +CharFromWChar +CharHeight +CharKeys +CharLength +CharLower +CharLowerA +CharLowerBuff +CharLowerBuffA +CharLowerBuffW +CharLowerW +CharNext +CharNextA +CharNextEx +CharNextExA +CharNextW +CharNextW95 +CharPosToPos +CharPrev +CharPrevA +CharPrevEx +CharPrevExA +CharPrevW +charRef +CharToByteIndex +CharToByteLen +CharToOem +CharToOemA +CharToOemBuff +CharToOemBuffA +CharToOemBuffW +CharToOemW +CharToWideChar +CharUpper +CharUpperA +CharUpperBuff +CharUpperBuffA +CharUpperBuffW +CharUpperW +ChDir +Check +CheckAction +CheckActive +CheckAttribute +CheckAutoSave +CheckBiDirectional +CheckBool +CheckBreak +CheckBrowseMode +CheckCachedUpdateMode +CheckCanModify +CheckChainCall +CheckCircularLinks +CheckColorsInGamut +CheckColumnDrag +CheckCommandText +CheckCommonControl +CheckComponent +CheckConfigMode +CheckContent +CheckControl +CheckCursor +CheckDatabaseAlias +CheckDatabaseName +CheckDataSet +CheckDbClient +CheckDBSessionName +CheckDetailRecords +CheckDisconnect +CheckDispatching +CheckDlgButton +CheckDOM +CheckEdit +CheckEmptyDate +CheckEncoding +CheckEOF +CheckError +CheckFieldAdd +CheckFieldCompatibility +CheckFieldDelete +CheckFieldKind +CheckFieldName +CheckFieldNames +CheckFieldProps +CheckForAsyncExecute +CheckForDTD +CheckForFlyAway +CheckForPassthroughs +CheckForXMLSchema +CheckIfOpen +CheckIfParentScrolled +CheckImage +CheckImageList +CheckInactive +CheckIndexOpen +CheckIniChange +CheckIntegerValue +CheckInterceptor +CheckLongFieldNames +CheckLst +CheckMasterRange +CheckMenuDropdown +CheckMenuItem +CheckMenuRadioItem +CheckMetaData +CheckNamespaceAware +CheckNestedBrowseMode +CheckNotChanged +CheckNotCircular +CheckNotHosted +CheckNotLookup +CheckObject +CheckObjectList +CheckOpen +CheckOperation +CheckOption +CheckOverwrite +CheckParent +CheckParentState +CheckPosChanged +CheckPrinting +CheckProviderEOF +CheckPSAPILoaded +CheckRadioButton +CheckRange +CheckReadOnly +CheckRequiredFields +CheckResolver +CheckRowDrag +CheckSchemaVersion +CheckServerParams +CheckSessionName +CheckSetKeyMode +CheckSignature +CheckSnow +CheckSocketResult +CheckSqlTimeStamp +CheckSumMappedFile +CheckSynchronize +CheckTaskWindow +CheckTaskWindowAll +CheckTextNode +CheckThreadError +CheckToken +CheckTokenSymbol +CheckToolMenuDropdown +CheckType +CheckTypeSize +CheckUndock +CheckValidDate +CheckValue +CheckValues +CheckWordValue +child_fork +ChildDefUpdate +ChildElementsChanged +ChildListNotify +ChildNodeUpdated +childNumber +ChildWindowFromPoint +ChildWindowFromPointEx +ChooseColor +ChooseColorA +ChooseColorW +ChooseFont +ChooseFontA +ChooseFontW +ChoosePixelFormat +Chord +ChrCmpI +ChrCmpIA +ChrCmpIW +ChSyvToAnsi +ciId +cinfo_find +CINFO_HASH +cinfo_init +cinfo_lookup +cinfo_merge +cinfo_terminate +ClampInView +class +ClassComplete +Classes +ClassGroupOf +ClassIDToProgID +ClassIDToString +ClassInfo +ClassInheritsFrom +ClassName +ClassNameIs +ClassNameNoT +ClassNavigate +ClassParent +ClassType +Cleanup +CleanupException +CleanupFiles +CleanupInstance +CleanUpLists +CleanupStack +Clear +ClearActionBar +ClearActiveAggs +ClearActiveConnection +ClearAllClick +ClearAllMessages +clearAndFree +clearAttributes +ClearBitmap +ClearBlobCache +ClearBorderSpace +ClearBoundList +ClearBtnClick +ClearBuffers +ClearButtonClick +ClearCache +ClearCalcFields +ClearCatList +ClearClick +ClearClientData +ClearCommBreak +ClearCommError +ClearCompilerMessages +ClearConfigurationParameters +ClearCustData +ClearDocumentRef +clearElementTypes +clearEntities +clearErrorList +ClearEventLog +ClearEventLogA +ClearEventLogW +ClearExcepInfo +ClearExceptions +ClearFields +ClearHmenuProps +ClearHwndProps +clearInvalidNodeIterators +ClearItem +ClearItems +ClearMapping +ClearMatches +ClearMessageGroup +ClearModifications +ClearMonitors +clearNotations +clearParameterEntities +ClearProps +ClearRefs +ClearRootSprig +ClearRowPosition +ClearSavedPacket +ClearSearchMessages +ClearSelection +ClearSetup +ClearSprig +ClearStatements +ClearSubMenus +ClearTempMenu +ClearToolMessages +ClearTreeNode +ClearUndo +ClearUnneededSprigs +ClearVariantTypeList +Click +ClickButton +ClickCheck +ClickHandler +Client +ClientConnect +ClientDisconnect +ClientError +ClientErrorEvent +ClientEvent +ClientExecute +ClientFillBuffer +ClientGetSize +ClientNotify +ClientRead +ClientToScreen +ClientToWindow +ClientWndProc +ClientWrite +Clipboard +ClipboardComponents +Clipbrd +ClipCursor +Clone +CloneCursor +CloneNode +CloneNodeToDoc +Close +CloseAggs +CloseAll +CloseBlob +CloseBtnClick +CloseClipboard +CloseCursor +CloseCustomize +CloseDatabase +CloseDatabaseHandle +CloseDataSets +CloseDesktop +CloseDetailDatasets +CloseDialog +CloseDriver +CloseDropDown +CloseDW +CloseEditor +CloseEnhMetaFile +CloseEventLog +CloseFigure +CloseFile +CloseHandle +CloseIndexFile +CloseKey +CloseLink +CloseMenu +CloseMetaFile +CloseModal +CloseModule +CloseNode +ClosePage +ClosePrinter +CloseProject +CloseQuery +CloseRaw +CloseRegKey +CloseServiceHandle +closesocket +CloseUp +CloseView +CloseWindow +CloseWindowStation +ClrEol +ClrScr +CLSIDFromProgID +CLSIDFromString +CMActionExecute +CMActionUpdate +CMActivate +CmAdmCtl +CMAllChildrenFlipped +CMAppSysCommand +CMBiDiModeChanged +CMBorderChanged +CMButtonPressed +CMCancelMode +CMChanged +CMChildKey +CMColorChanged +CMControlChange +CMControlListChange +CMControlListChanging +CMCtl3DChanged +CMCursorChanged +CMDeactivate +CMDeferFree +CMDeferLayout +CMDesignHitTest +CMDialogChar +CMDialogKey +CMDockClient +CMDockNotification +CMDocWindowActivate +CMDrag +CMEnabledChanged +CMEnter +CMEnterMenuLoop +CMExit +CMFloat +CMFocusChanged +CMFontChange +CMFontChanged +CMGetDataLink +CMHintShow +CMHitTest +CMIconChanged +CMInvalidate +CMIsShortCut +CMIsToolControl +CMItemClicked +CMItemDropPoint +CMItemKeyed +CMItemSelected +CMLookupComplete +CMMenuChanged +CMMouseEnter +CMMouseLeave +CMParentBiDiModeChanged +CMParentColorChanged +CMParentCtl3DChanged +CMParentFontChanged +CMPopupHwndDestroy +CmpUnimplemented +CMRecreateWnd +CMRelease +CMResetBar +CMShowHintChanged +CMShowingChanged +CMSocketMessage +CMSysColorChange +CMSysFontChanged +CMTabFontChanged +CMTabStopChanged +CMTextChanged +CMTimeChange +CMUIActivate +CMUIDeactivate +CMUnDockClient +CMVisibleChanged +CMWantSpecialKey +CMWinINIChange +CMYK +CNBandChange +CNChar +CNCommand +CNCtlColorBtn +CNCtlColorScrollBar +CNCtlColorStatic +CNDrawItem +CNDropDownClosed +CNHScroll +CNKeyDown +CNKeyUp +CNMeasureItem +CNNotify +CNSysChar +CNSysKeyDown +CNVScroll +CoAddRefServerProcess +CoAllocCStr +CoBuildVersion +CoCAccPropServices +CoCOMAdminCatalog +CoCOMAdminCatalogCollection +CoCOMAdminCatalogObject +CoCommand +CoConnection +CoCopyProxy +CoCreateFreeThreadedMarshaler +CoCreateGuid +CoCreateInstance +CoCreateInstanceEx +CoCreateStandardMalloc +code +CodeCompletion +CodeTemplate +CodeTemplateAPI +CodeWndBtnClick +CoDisconnectObject +CoDOMDocument +CoDOMFreeThreadedDocument +CoDosDateTimeToFileTime +CoFileTimeNow +CoFileTimeToDosDateTime +CoFreeAllLibraries +CoFreeLibrary +CoFreeUnusedLibraries +CoGetCallContext +CoGetClassObject +CoGetClassObjectFromURL +CoGetCurrentProcess +CoGetInstanceFromFile +CoGetInstanceFromIStorage +CoGetInterfaceAndReleaseStream +CoGetMalloc +CoGetMarshalSizeMax +CoGetObject +CoGetPSClsid +CoGetStandardMarshal +CoGetTreatAsClass +CoHasStrongExternalConnections +CoImpersonateClient +CoInitialize +CoInitializeEx +CoInitializeSecurity +CoInternetCombineUrl +CoInternetCompareUrl +CoInternetCreateSecurityManager +CoInternetCreateZoneManager +CoInternetGetProtocolFlags +CoInternetGetSecurityUrl +CoInternetGetSession +CoInternetParseUrl +CoInternetQueryInfo +CoIsHandlerConnected +CoIsOle1Class +Col +ColClick +ColEnter +ColExit +Collapse +CollectionsEqual +ColnEdit +CoLoadLibrary +CoLockObjectExternal +ColorAdjustLuma +ColorCallBack +ColorChanged +ColorCorrectPalette +ColorHLSToRGB +ColorMatchToTarget +ColorProc +ColorRGBToHLS +ColorToBorderColor +ColorToPrettyName +ColorToRGB +ColorToWebColorName +ColorToWebColorStr +ColRightClick +ColumnAtDepth +ColumnClick +ColumnMoved +ColumnsShowing +ColWidthsChanged +COMAdmin +CoMarshalHResult +CoMarshalInterface +CoMarshalInterThreadInterfaceInStream +CombineRgn +CombineTransform +ComboBox_GetCueBannerText +ComboBox_GetMinVisible +ComboBox_SetCueBannerText +ComboBox_SetMinVisible +ComboClick +ComboExWndProc +ComboWndProc +ComClassManager +ComConst +ComCtrls +CommandClicked +CommandEnabled +CommandLineToArgvW +CommConfigDialog +CommConfigDialogA +CommConfigDialogW +CommCtrl +CommDlg +CommDlgExtendedError +comment +Commit +CommitRecord +CommitRecordVariants +Committed +CommitTrans +CommitTransComplete +CommitUpdates +CommitUrlCacheEntry +CommitUrlCacheEntryA +CommitUrlCacheEntryW +CommonPrefixWith +ComObj +Compare +CompareAction +CompareBookMarks +CompareCaption +CompareCount +CompareDate +CompareDateTime +CompareDigits +CompareExtents +CompareFileTime +CompareFront +CompareIDs +CompareItems +CompareMem +CompareNodes +CompareNormalizedFractions +CompareOp +CompareStr +CompareString +CompareStringA +CompareStrings +CompareStringW +CompareText +CompareTime +CompareToRead +CompareValue +CompareWith +CompatibleConversionType +CompatibleConversionTypes +CompileProject +ComponentLoading +ComponentRead +ComponentRenamed +ComposeHmenuIdentityString +ComposeHwndIdentityString +ComposeWith +Compound +CompressBuf +CompressPenData +CompToCurrency +CompToDouble +ComputeAldusChecksum +ComputeInfoCount +ComServ +ComStr +ComStrs +ComSvcs +ConcatField +conditionalSection +ConditionP +condvar_init +condvar_notify +condvar_terminate +condvar_wait +conf_getglobals +conf_init +conf_terminate +conf_vars2daemon +ConfigHREC +ConfigureForLookupOnly +ConfigurePort +ConfigurePortA +ConfigurePortW +Connect +ConnectComplete +ConnectEvent +ConnectionListColumnClick +ConnectionListCompare +ConnectionPoint +ConnectionStateChange +ConnectNamedPipe +ConnectTo +ConnectToPrinterDlg +const +ConstrainedResize +ConstraintCallBack +ConstraintsDisabled +ConstraintsStored +Construct +constructor +Consts +Contains +ContainsActiveControl +ContainsControl +ContainsPaletteState +ContainsStr +ContainsText +contentModelTest +contentModelTest2 +ContentRect +ContextActivated +ContextSensitiveHelp +Continue +ContinueDebugEvent +ContinuePrinting +Contnrs +ControlAtPos +ControlDestroyed +Controller +Controls +ControlsAligned +ControlsDisabled +ControlSelectNode +ControlService +ControlShiftSelectNode +ControlSize +ControlWndProc +ConvDateTimeToJulianDate +ConvDateTimeToModifiedJulianDate +Convert +CONVERT_TO_NATIVE_FS +CONVERT_TO_PRINTABLE_FORMAT +ConvertDefaultLocale +ConvertError +ConvertErrorFmt +ConvertFlags +ConvertFrom +ConvertKindOf +ConvertMask +ConvertName +ConvertObject +ConvertPos +convertReadBuffer +ConvertReadStream +ConvertStates +ConvertStreamFromAnsiToUTF8 +ConvertStreamFromUTF8ToAnsi +ConvertThreadToFiber +ConvertTo +ConvertToAutoInheritPrivateObjectSecurity +ConvertWinHelp +convertWriteBuffer +ConvertWriteStream +ConvFamilyToDescription +ConvJulianDateToDateTime +ConvModifiedJulianDateToDateTime +ConvTypeToDescription +ConvTypeToFamily +ConvUnitAdd +ConvUnitCompareValue +ConvUnitDec +ConvUnitDiff +ConvUnitInc +ConvUnitSameValue +ConvUnitToStr +ConvUnitWithinNext +ConvUnitWithinPrevious +ConvUtils +CoolBar +CoParameter +Copy +CopyAcceleratorTable +CopyAcceleratorTableA +CopyAcceleratorTableW +CopyArray +CopyAttrNodes +CopyBindInfo +CopyCallback +CopyChildNodes +CopyComplexType +CopyComponents +CopyData +CopyDataByRef +CopyEnhMetaFile +CopyEnhMetaFileA +CopyEnhMetaFileW +CopyFields +CopyFile +CopyFileA +CopyFileEx +CopyFileExA +CopyFileExW +CopyFileW +CopyFrom +CopyGlyph +CopyIcon +CopyImage +CopyImages +CopyItemClick +CopyKeys +CopyMemory +CopyMetaFile +CopyMetaFileA +CopyMetaFileW +CopyParams +CopyRect +Copyright +CopySelection +CopySid +CopySimpleType +CopyStgMedium +CopyStreamToClipboard +CopyTemplatePoliciesToZone +CopyTo +CopyToBest +CopyToClipboard +CopyValue +CopyValues +CoQueryAuthenticationServices +CoQueryClientBlanket +CoQueryProxyBlanket +CorbaVCL +CoRecordset +CoRegisterChannelHook +CoRegisterClassObject +CoRegisterMallocSpy +CoRegisterMessageFilter +CoRegisterPSClsid +CoReleaseMarshalData +CoReleaseServerProcess +CoResumeClassObjects +CoRevertToSelf +CoRevokeClassObject +CoRevokeMallocSpy +CorrectWriting +Cos +Cosecant +CoSetProxyBlanket +Cosh +CoSuspendClassObjects +CoSwitchCallContext +Cot +CoTan +CoTaskMemAlloc +CoTaskMemFree +CoTaskMemRealloc +CotH +CoTreatAsClass +CouldBeUnstableWindow +CoUninitialize +CoUnmarshalHResult +CoUnmarshalInterface +Count +CountAutoObject +CountClipboardFormats +CountElements +CountFactory +CountGenerations +CountItem +CountObject +CountRefs +CoWaitForMultipleHandles +CoXMLDocument +CoXMLDSOControl +CoXMLHTTPRequest +cp10000_MacRomanToUTF16Char +cp10000_MacRomanToUTF16Str +cp1250ToUTF16Char +cp1250ToUTF16Str +cp1251ToUTF16Char +cp1251ToUTF16Str +cp1252ToUTF16Char +cp1252ToUTF16Str +Cpl +CPlApplet +CRDMGetProviderNames +Create +Create_Parameter +CreateAcceleratorTable +CreateAcceleratorTableA +CreateAcceleratorTableW +CreateAccelTable +CreateAccessibleProxy +CreateAccessor +CreateAction +CreateActionBars +CreateADOObject +CreateAggregated +CreateAggsFromAggFields +CreateAntiMoniker +CreateAsyncBindCtx +CreateAsyncBindCtxEx +createAttribute +CreateAttributeList +CreateAttributeNode +createAttributeNS +CreateAutoDispatch +CreateBindCtx +CreateBitmap +CreateBitmapIndirect +CreateBlobStream +CreateBrush +CreateBrushIndirect +CreateBrushPattern +CreateButton +CreateButtonGlyph +CreateButtons +CreateCaret +createCDATASection +CreateChildList +CreateChildNode +CreateClass +CreateClassID +createCMAttribute +createCMAttributeDefinition +createCMAttributeList +createCMChoiceParticle +createCMComment +createCMElementParticle +createCMElementTypeDeclaration +createCMEntity +createCMEntityDeclaration +createCMExternalObject +createCMFragment +createCMInternalObject +createCMNameParticle +createCMNmtokenParticle +createCMNotation +createCMNotationDeclaration +createCMObject +createCMParameterEntity +createCMParameterEntityDeclaration +createCMParameterEntityReference +createCMPcdataChoiceParticle +createCMProcessingInstruction +createCMSequenceParticle +CreateCollection +CreateColorSpace +CreateColorSpaceA +CreateColorSpaceW +CreateColumns +CreateCommand +createComment +CreateComObject +CreateCompatibleBitmap +CreateCompatibleDC +CreateCompatibleHRC +CreateComponent +CreateConsoleScreenBuffer +CreateControl +CreateControls +CreateCppModule +CreateCurrentComponent +CreateCursor +CreateCursors +CreateDataAdviseHolder +CreateDataCache +CreateDataLink +CreateDataPacket +CreateDataSet +CreateDataSource +CreateDbClientObject +CreateDBInstance +CreateDBInstanceEx +CreateDC +CreateDCA +CreateDCW +CreateDdeConv +CreateDesignerForm +CreateDesktop +CreateDesktopA +CreateDesktopW +CreateDialog +CreateDialogA +CreateDialogIndirect +CreateDialogIndirectA +CreateDialogIndirectParam +CreateDialogIndirectParamA +CreateDialogIndirectParamW +CreateDialogIndirectW +CreateDialogParam +CreateDialogParamA +CreateDialogParamW +CreateDialogW +CreateDIBitmap +CreateDIBPatternBrush +CreateDIBPatternBrushPt +CreateDIBSection +CreateDir +CreateDirectory +CreateDirectoryA +CreateDirectoryEx +CreateDirectoryExA +CreateDirectoryExW +CreateDirectoryW +CreateDiscardableBitmap +CreateDispTypeInfo +CreateDockableForm +CreateDockManager +CreateDockPos +createDocument +createDocumentFragment +createDocumentNS +createDocumentType +CreateDOMDocument +CreateDOMNode +CreateDSBase +CreateDSCursor +CreateEdgeParts +CreateEditor +CreateElement +createElementNS +CreateEllipticRgn +CreateEllipticRgnIndirect +CreateEnhMetaFile +CreateEnhMetaFileA +CreateEnhMetaFileW +createEntity +createEntityReference +CreateEntry +CreateEnum +CreateEnumPropDescs +CreateErrorInfo +CreateEvent +CreateEventA +CreateEventW +CreateExprFilter +CreateFiber +CreateField +CreateFieldComponent +CreateFieldDefs +CreateFields +CreateFieldsEditor +CreateFile +CreateFileA +CreateFileDialog +CreateFileMapping +CreateFileMappingA +CreateFileMappingW +CreateFileMoniker +CreateFileW +CreateFmt +CreateFmtHelp +CreateFont +CreateFontA +CreateFontIndirect +CreateFontIndirectA +CreateFontIndirectEx +CreateFontIndirectExA +CreateFontIndirectExW +CreateFontIndirectW +CreateFontW +CreateForm +CreateFormatEnumerator +CreateFromDelta +CreateFromFactory +CreateFromID +createFromString +CreateFuncFilter +CreateGenericComposite +CreateGlyph +CreateGUID +CreateHalftonePalette +CreateHandle +CreateHardLink +CreateHardLinkA +CreateHardLinkW +CreateHatchBrush +CreateHelp +CreateHosted +CreateHResult +CreateHWL +CreateIC +CreateICA +CreateIcon +CreateIconFromResource +CreateIconFromResourceEx +CreateIconIndirect +CreateICW +CreateILockBytesOnHGlobal +CreateImageList +CreateIndex +CreateIndexes +CreateInfo +CreateInkset +CreateInksetHRCRESULT +CreateInstance +CreateInstanceLic +CreateInterface +CreateIoCompletionPort +CreateItem +CreateItemList +CreateItemMoniker +CreateKey +CreateLinked +CreateLinkToFile +CreateListItem +CreateListItems +CreateLookupFilter +CreateMailslot +CreateMailslotA +CreateMailslotW +CreateMappedBitmap +CreateMaskedBmp +CreateMDIWindow +CreateMDIWindowA +CreateMDIWindowW +CreateMenu +CreateMenuItem +CreateMessageDialog +CreateMetaFile +CreateMetaFileA +CreateMetaFileW +CreateMethod +CreateMethodPointer +CreateModule +CreateModuleEx +CreateMutex +CreateMutexA +CreateMutexW +CreateNamedPipe +CreateNamedPipeA +CreateNamedPipeW +CreateNestedDataSet +CreateNew +CreateNode +createNodeIterator +CreateNodes +createNotation +createNS +CreateObject +CreateObjectFromFile +CreateObjectFromInfo +CreateOleAdviseHolder +CreateOleObject +CreatePalette +CreatePanel +CreatePanelBitmap +CreatePanels +CreateParam +CreateParamDesc +CreateParameter +CreateParams +CreateParented +CreateParentedControl +CreatePatternBrush +CreatePen +CreatePenDataEx +CreatePenDataHRC +CreatePenDataRegion +CreatePenIndirect +CreatePipe +CreatePointerMoniker +CreatePolygonRgn +CreatePolyPolygonRgn +CreatePopup +CreatePopupMenu +CreatePrivateObjectSecurity +CreatePrivateObjectSecurityEx +CreateProcess +CreateProcessA +CreateProcessAsUser +CreateProcessAsUserA +CreateProcessAsUserW +createProcessingInstruction +CreateProcessW +CreateProperty +CreatePropertyByPosition +CreatePropertyGroup +CreatePropertySheetPage +CreatePropertySheetPageA +CreatePropertySheetPageW +CreateProxy +CreateRadioButton +CreateReader +CreateRecordBuffer +CreateRectRgn +CreateRectRgnIndirect +CreateRegKey +CreateRemote +CreateRemoteComObject +CreateRemoteThread +CreateRes +CreateResFmt +CreateResFmtHelp +CreateResHelp +CreateResolver +CreateResource +CreateResStream +CreateRoundRectRgn +CreateScalableFontResource +CreateScalableFontResourceA +CreateScalableFontResourceW +CreateScroller +CreateSection +CreateSections +CreateSelectionList +CreateSemaphore +CreateSemaphoreA +CreateSemaphoreW +CreateServerTransport +CreateService +CreateServiceA +CreateServiceW +CreateSession +CreateShadow +CreateSharedPropertyGroup +CreateSharedPropertyGroupManager +CreateSize +CreateSolidBrush +CreateStatusWindow +CreateStatusWindowA +CreateStatusWindowW +CreateStdAccessibleObject +CreateStdAccessibleProxy +CreateStdDispatch +CreateStorage +CreateStream +CreateStreamOnHGlobal +CreateStub +CreateSubClass +CreateSystemPalette +CreateTab +CreateTable +CreateTapePartition +createTextNode +CreateThread +CreateTitle +CreateToolBarEx +CreateToolhelp32Snapshot +CreateTransactionContext +CreateTransactionContextEx +CreateTransport +createTreeWalker +CreateTypeInfo +CreateTypeLib +CreateTypeLib2 +CreateUDLFile +CreateUndoableWriter +CreateUniqueName +CreateUpDownControl +CreateURLBinding +CreateUrlCacheEntry +CreateUrlCacheEntryA +CreateUrlCacheEntryW +CreateUrlCacheGroup +CreateURLMoniker +CreateValueBuffer +CreateVCLComObject +CreateView +CreateViewObject +CreateViewWindow +CreateViewWindow2 +CreateWaitableTimer +CreateWaitableTimerA +CreateWaitableTimerW +CreateWindow +CreateWindowA +CreateWindowEx +CreateWindowExA +CreateWindowExW +CreateWindowHandle +CreateWindowStation +CreateWindowStationA +CreateWindowStationW +CreateWindowW +CreateWith +CreateWithComment +CreateWnd +CreateWrapper +CreateWriter +CreateZoneEnumerator +CreatingProject +crit_enter +crit_exit +crit_init +crit_terminate +CrunchFieldName +Csc +CscH +ctime +ctionBar +CtlConsts +CtlPanel +Ctrl +CtrlIsDown +CurrCompare +currency +CurrencyToComp +CurrentModule +CurrentProcessChanged +CurrentRow +CurrentThreadChanged +CurrentYear +CurrOp +CurrText +CurrToBCD +CurrToBuffer +CurrToStr +CurrToStrF +CurrToWStrViaOS +CursorBig +CursorDec +CursorInc +CursorOff +CursorOn +CursorPosChanged +CursorToIdent +CustomAlignInsertBefore +CustomAlignPosition +CustomDelete +CustomDraw +CustomDrawButton +CustomDrawItem +CustomDrawSubItem +CustomizeDlg +CustomizeToolbar +CustomKeyDown +CustomSort +Cut +CutFirstDirectory +CutItemClick +CutSelection +CutToClipboard +CvtInt +CvtInt64W +CvtIntW +CycleToDeg +CycleToGrad +CycleToRad +D2InvokeEvent +DAdvise +daemon_atrestart +DatabaseError +DatabaseErrorFmt +DataBkr +DataChange +DataChanged +DataConvert +DataEvent +DataIn +DataLinkDir +DataLinkRecordChanged +DataOut +DataPacketSize +DataPacketToVariant +DataRequest +DataSetChanged +DatasetListChange +DataSetListDblClick +DatasetListDropDown +DataSetListKeyPress +DataSetScrolled +DataStored +DataToRawColumn +dataType +DataTypeToRegData +Date +DateCompare +DateOf +DateOp +DateTime +DateTime_GetMonthCal +DateTime_GetMonthCalColor +DateTime_GetMonthCalFont +DateTime_GetRange +DateTime_GetSystemTime +DateTime_SetFormat +DateTime_SetFormatA +DateTime_SetFormatW +DateTime_SetMonthCalColor +DateTime_SetMonthCalFont +DateTime_SetRange +DateTime_SetSystemTime +DateTimeToFileDate +DateTimeToJulianDate +DateTimeToModifiedJulianDate +DateTimeToNative +DateTimeToSQLTimeStamp +DateTimeToStr +DateTimeToString +DateTimeToSystemTime +DateTimeToTimeStamp +DateTimeToUnix +DateToStr +DateToWStrViaOS +DateUtils +DayOf +DayOfTheMonth +DayOfTheWeek +DayOfTheYear +DayOfWeek +DaysBetween +DaysInAMonth +DaysInAYear +DaysInMonth +DaysInYear +DaySpan +DB +DBActns +dbcgrids +DBClient +DBClientActnRes +DBClientActns +DBCommon +DBCommonTypes +DBConsts +DBCtrls +Dbedit +DbExcept +DBGrids +DbiError +dbinpreq +DblClick +DBLogDlg +DBLoginCallback +dblookup +DBNotification +DBOleCtl +DBOleEdt +DBPlatform +DBPWDlg +DBReg +DBTables +DBUseRightToLeftAlignment +dc +DCheck +DdeAbandonTransaction +DdeAccessData +DdeAddData +DDECheck +DdeClientTransaction +DdeCmpStringHandles +DdeConnect +DdeConnectList +DdeCreateDataHandle +DdeCreateStringHandle +DdeCreateStringHandleA +DdeCreateStringHandleW +DdeDisconnect +DdeDisconnectList +DdeEnableCallback +DdeFreeDataHandle +DdeFreeStringHandle +DdeGetData +DdeGetLastError +DdeInitialize +DdeInitializeA +DdeInitializeW +DdeKeepStringHandle +DdeMan +DdeMgrCallBack +DDEml +DdeNameService +DdePostAdvise +DdeQueryConvInfo +DdeQueryNextServer +DdeQueryString +DdeQueryStringA +DdeQueryStringW +DdeReconnect +DdeReg +DdeSetQualityOfService +DdeSetUserHandle +DdeUnaccessData +DdeUninitialize +ddr +Deactivate +DeactivateAndUndo +DeactivateFilters +DeallocateHWnd +Debug +debug_class_enabled +debug_continue +debug_init +debug_print +DebugActiveProcess +DebugBreak +DebuggerOptionsChanged +DebugServerQueryInterface +DebugServerRelease +DecIndices +DeclareNamespace +DecodeDate +DecodeDateDay +DecodeDateFully +DecodeDateMonthWeek +DecodeDateTime +DecodeDateWeek +DecodeDayOfWeekInMonth +DecodeIndexDesc +DecodeSoundexInt +DecodeSoundexWord +DecodeTime +DecomposeHmenuIdentityString +DecomposeHwndIdentityString +DecompressBuf +DecompressToUserBuf +DecPassCount +DecryptFile +DecryptFileA +DecryptFileW +Default +DefaultAlignment +DefaultAllocMem +DefaultCaption +DefaultColor +DefaultContextHelp +DefaultDrawColumnCell +DefaultDrawDataCell +DefaultFont +DefaultHandler +DefaultImeMode +DefaultImeName +DefaultListViewSort +DefaultNodeAction +DefaultPropertyDrawName +DefaultPropertyDrawValue +DefaultPropertyListDrawValue +DefaultReadOnly +DefaultRegisterAndUnregisterExpectedMemoryLeak +DefaultReqQuoteChar +DefaultsButtonClick +DefaultSession +DefaultSystemAnimation +DefaultTreeViewSort +DefaultTrigger +DefaultWidth +DefChanged +DefDlgProc +DefDlgProcA +DefDlgProcW +DefDriverProc +DeferFree +DeferLayout +DeferWindowPos +DefFrameProc +DefFrameProcA +DefFrameProcW +DefHookProc +DefineBinaryProperty +DefineDosDevice +DefineDosDeviceA +DefineDosDeviceW +DefineFieldMap +DefineFuncAsDllEntry +DefineHandleTable +DefineProperties +DefineProperty +deflate +deflateEnd +deflateInit_ +DefMDIChildProc +DefMDIChildProcA +DefMDIChildProcW +DefocusControl +DefSubclassProc +DefWindowProc +DefWindowProcA +DefWindowProcW +DegToCycle +DegToGrad +DegToRad +DeinitializeDesigner +delay +DelayLoadResourceModule +Delete +DeleteAce +DeleteActionItems +DeleteAlias +DeleteAtom +DeleteBtnClick +DeleteButtonClick +DeleteCategory +DeleteChildren +DeleteClick +DeleteColor +DeleteColorSpace +DeleteColumn +DeleteCommand +DeleteConfigPath +DeleteCriticalSection +DeleteCursor +deleteData +DeleteDC +DeleteDriver +DeleteEditOptions +DeleteEnhMetaFile +DeleteEntry +DeleteFiber +DeleteFile +DeleteFileA +DeleteFileW +DeleteForm +DeleteFormA +DeleteFormW +DeleteFuncDesc +DeleteFuncDescByMemId +DeleteImplType +DeleteIndex +DeleteItem +DeleteItemClick +DeleteKey +DeleteKeys +DeleteMember +DeleteMemberByDispID +DeleteMemberByName +DeleteMenu +DeleteMetaFile +DeleteMonitor +DeleteMonitorA +DeleteMonitorW +DeleteMultiple +DeleteNode +DeleteObject +DeletePort +DeletePortA +DeletePortW +DeletePrinter +DeletePrinterConnection +DeletePrinterConnectionA +DeletePrinterConnectionW +DeletePrinterData +DeletePrinterDataA +DeletePrinterDataW +DeletePrinterDriver +DeletePrinterDriverA +DeletePrinterDriverW +DeletePrintProcessor +DeletePrintProcessorA +DeletePrintProcessorW +DeletePrintProvidor +DeletePrintProvidorA +DeletePrintProvidorW +DeletePrompt +DeletePropertyNames +DeleteRange +DeleteRecord +DeleteRecords +DeleteRegKey +DeleteRegValue +DeleteRow +DeleteRows +DeleteSelected +DeleteSelectedText +DeleteSelection +DeleteService +DeleteString +DeleteStyle +DeleteTab +DeleteTable +DeleteTo +DeleteTypeInfo +DeleteUrlCacheEntry +DeleteUrlCacheGroup +DeleteValue +DeleteVarDesc +DeleteVarDescByMemId +Deleting +Delimit +DelLine +DelphiMM +DeploymentAPI +DepopulateTreeView +Depth +DeregisterEventSource +DescribePixelFormat +Description +DescriptionsAvailable +DescriptionToConvFamily +DescriptionToConvType +Deselect +DeselectHandles +DesignClass +DesignConst +DesignEditors +DesignerClosed +DesignerDataStored +DesignerOpened +DesignerTypes +DesignIntf +DesignMenus +DesignModified +DesigntimeChange +DesignWindows +DesignWndProc +DestRect +Destroy +DestroyAcceleratorTable +DestroyAccelTable +DestroyBitmaps +DestroyCaret +DestroyChildWindow +DestroyComponents +DestroyControl +DestroyCursor +DestroyCursors +DestroyDataSource +Destroyed +DestroyElement +DestroyEnumPropDescs +DestroyFields +DestroyHandle +DestroyHRC +DestroyHRCRESULT +DestroyHWL +DestroyIcon +Destroying +DestroyInkset +DestroyLocals +DestroyLookupCursor +DestroyMenu +DestroyMenuItem +DestroyMetaPict +DestroyObject +DestroyPanelBitmap +DestroyPenData +DestroyPopupWindow +DestroyPrivateObjectSecurity +DestroyPropertySheetPage +DestroyResource +DestroyResourceS +DestroyStorage +DestroyVerbs +DestroyViewWindow +DestroyWindow +DestroyWindowHandle +DestroyWnd +DestroyZoneEnumerator +Destruct +destructor +Detach +DetailsBtnClick +DetectCharEncoding +Detector +DetectUTF8Encoding +DetermineOccurence +DeviceCapabilities +DeviceCapabilitiesA +DeviceCapabilitiesW +DeviceIoControl +DialogBox +DialogBoxA +DialogBoxIndirect +DialogBoxIndirectA +DialogBoxIndirectParam +DialogBoxIndirectParamA +DialogBoxIndirectParamW +DialogBoxIndirectW +DialogBoxParam +DialogBoxParamA +DialogBoxParamW +DialogBoxW +DialogEnumerationTester +DialogHook +Dialogs +DIBIndex +DidAlloc +dir_close +dir_create +dir_create_all +dir_open +dir_read +dir_remove +directory +DirectoryExists +DirectVideo +DirLevel +DirListChange +DirStr +DisableAlign +DisableAutoRange +DisableCommit +DisableConstraints +DisableControls +DisabledImageListChange +DisableEditUpdate +DisableHiding +DisableNotify +DisableSocketTransport +DisableTaskWindows +DisableThreadLibraryCalls +DisableWebTransport +DiscardCache +DiscardUndoState +Disconnect +DisconnectActionUpdate +DisconnectNamedPipe +DisconnectObject +DiskFree +DiskSize +Dispatch +DispatchAction +DispatchCommand +DispatchInvoke +DispatchInvokeError +DispatchManyEvents +DispatchMessage +DispatchMessageA +DispatchMessageW +DispatchOneEvent +DispatchPopup +DispatchServiceMain +DispatchShortCut +DispCall +DispCallByID +DispCallError +DispCallFunc +DispGetIDsOfNames +DispGetParam +DispInvoke +DispInvokeError +DisplayCase +DisplayHelpByContext +DisplayRect +DisplayShadow +DisplayTextPopup +DisplayTopic +dispose +DisposeMem +DisposeStr +DistanceToTab +div +DivMod +dladdr +dlclose +dlerror +DlgDirList +DlgDirListA +DlgDirListComboBox +DlgDirListComboBoxA +DlgDirListComboBoxW +DlgDirListW +DlgDirSelectComboBoxEx +DlgDirSelectComboBoxExA +DlgDirSelectComboBoxExW +DlgDirSelectEx +DlgDirSelectExA +DlgDirSelectExW +Dlgs +DllCanUnloadNow +DLLDetachCallBack +DllGetClassObject +DllInstall +DllRegisterServer +DllUnregisterServer +dlopen +dlsym +do +DoAccept +DoActionChange +DoActionExecute +DoActionIdle +DoActionUpdate +DoActivate +DoAdd +DoAddDockClient +DoAddFields +DoAfterApplyUpdates +DoAfterCancel +DoAfterClose +DoAfterDelete +DoAfterEdit +DoAfterExecute +DoAfterGetParams +DoAfterGetRecords +DoAfterInsert +DoAfterOpen +DoAfterPost +DoAfterRefresh +DoAfterRowRequest +DoAfterScroll +DoAfterUpdateRecord +DoAggUpdates +DoAlign +DoAlignControl +DoAnimation +DoApplicationIdle +DoApply +DoApplyUpdates +DoArcCos +DoArcCosH +DoArcCot +DoArcCotH +DoArcCsc +DoArcCscH +DoArcSec +DoArcSecH +DoArcSin +DoArcSinH +DoArcTan +DoArcTanH +DoAutoSize +DoBandMove +DoBandPaint +DoBeforeApplyUpdates +DoBeforeCancel +DoBeforeClose +DoBeforeCommit +DoBeforeDelete +DoBeforeEdit +DoBeforeExecute +DoBeforeGetParams +DoBeforeGetRecords +DoBeforeInsert +DoBeforeOpen +DoBeforePost +DoBeforeRefresh +DoBeforeRowRequest +DoBeforeScroll +DoBeforeUpdateRecord +DoBeginBandMove +DoBeginDrag +DoBiDiModeChanged +DoBindFields +DoBufferedPaint +DoButtonClick +DoCalcConstraints +DoCallback +DoCancel +DoCanChange +DoCanClose +DoCanExpand +DoCanResize +DoChange +Dock +DockCaptionHitTest +DockCaptionMouseDown +DockCaptionMouseMove +DockCaptionMouseUp +DockControl +DockDrop +DockFormRefresh +DockFormUpdated +DockFormVisibleChanged +DockOver +DockReplaceDockClient +DockTabSet +DoClassComplete +DoClassNavigate +DoClick +DoClose +docMemoryToDom +DoColWidths +DoConnect +DoContinue +DoControlCreated +DoControlMsg +DoConjugate +DoCopyButton +DoCos +DoCosH +DoCot +DoCotH +DoCount +DoCreate +DoCreateField +DoCreateObject +DoCreateThread +DoCsc +DoCscH +docSourceCodeToDom +docStreamToDom +docStringToDom +doctype +DocumentProperties +DocumentPropertiesA +DocumentPropertiesW +DoCustomAction +DoCustomControl +DoCustomDelete +docWideStringToDom +DoDeactivate +DoDecode +DoDefaultPainting +DoDefaultPenInput +DoDelete +DoDestroy +DoDisableWindow +DoDisconnect +DoDivide +DoDock +DoDockOver +DoDragDrop +DoDragOver +DoDraw +DoDrawText +DoDrawThemeTextEx +DoDropActions +DoDropCategory +DoDropDownKeys +DoDropItem +DoEditButtonClick +DoEditControl +DoEncode +DoEndBandMove +DoEndDock +DoEndDrag +DoEnter +DoEnvironmentSubst +DoEnvironmentSubstA +DoEnvironmentSubstW +DoError +DoEvent +DoException +DoExecSQL +DoExecute +DoExit +DoExitProc +DoExp +DoExpand +DoFillRect +DoFindControlZone +DoFindData +DoFindDatabase +DoFindWindow +DoFindZone +DoFixupReferences +DoFlipChildren +DoFolderChange +DoForEach +DoFreeObject +DoFunction +DoGetAppServerList +DoGetButton +DoGetControlClass +DoGetData +DoGetDataObject +DoGetIDsOfNames +DoGetMenuString +DoGetNextLimit +DoGetPickListItems +DoGetPopupClass +DoGetProviderAttributes +DoGetRecords +DoGetServerList +DoGetTableName +DoGetValues +DoHandleException +DoHelp +DoHide +DoHideUnused +DoHint +DoHotButton +DoIdle +DoIncludeItem +DoInfoTip +DoInit +DoInputChar +DoInquire +DoInsert +DoInternalOpen +DoInterrogate +DoInvAdd +DoInvalidate +DoInvDivide +DoInverse +DoInvMultiply +DoInvoke +DoInvSubtract +DoItemClicked +DoItemKeyed +DoItemSelected +DoKey +DoKeyDown +DoKeyPress +DoKeyUp +DoListen +DoLn +DoLog10 +DoLog2 +DoLogN +DoLookup +DOMElement +DoMenuDelay +DoMessage +DoMessageDlgPosHelp +DOMImplementation +DoMinimize +DoModalBegin +DoModalEnd +DoModernPainting +DoMouseDown +DoMouseIdle +DoMouseWheel +DoMouseWheelDown +DoMouseWheelUp +DoMultiply +DOMVendorList +DOMVendorNotSupported +DOMVendorStored +Done +DoneApplication +DoneBitmaps +DoneControls +DoneCtl3D +DoneDesignNotification +DoNegate +DoneMaskStates +DoneMenuLoop +DoneServiceApplication +DoNestedActivation +DoneThreadSynchronization +DoNewField +DoNewInquire +DoNewLookupField +DoNodeChange +DoNormalizeTopMosts +DoNotify +DoObjectVerb +DoOnAnimate +DoOnButtonClicked +DoOnCalcFields +DoOnDialogContructed +DoOnDialogCreated +DoOnDialogDestroyed +DoOnExecute +DoOnExpandButtonClicked +DoOnFileOkClick +DoOnFolderChange +DoOnFolderChanging +DoOnGetData +DoOnHelp +DoOnHyperlinkClicked +DoOnNavigated +DoOnNewRecord +DoOnOverwrite +DoOnRadioButtonClicked +DoOnSelectionChange +DoOnShareViolation +DoOnThemeChange +DoOnTimer +DoOnTypeChange +DoOnUpdateData +DoOnValidate +DoOnVerificationClicked +DoOpen +DoOpenDatabase +DoPaddingChange +DoPaletteChange +DoPasteCheck +doPasteLink +DoPause +DoPopoutModernPainting +DoPopup +DoPosition +DoPostClick +DoPower +DoProcedure +DoPrune +DoQueryDelete +DoQueryInsert +DoRead +DoReconcileError +DoRecordsetDelete +DoRect +DoRemoveDockClient +DoReorderButton +DoReorderCategory +DoRestore +DoRightToLeftAlignment +DoRowHeights +DoRowRequest +DoSaveZone +DoScroll +DoScrollTimer +DosDateTimeToFileTime +DosDateTimeToVariantTime +DoSec +DoSecH +DoSectionDrag +DoSectionEndDrag +DoSelectAll +DoSelectedItemChanged +DoSelection +DoSelectionChange +DosError +DoSetAsyncStyles +DoSetControl +DoSetElevationRequired +DoSetEnabled +DoSetMaxLength +DoSetNewBounds +DoSetRange +DoSettingChange +DoSetup +DosExitCode +DoShortcut +DoShow +DoShowCaptions +DoShowHint +DoShowOwnedPopups +DoShutdown +DoSign +DoSin +DoSinH +DoSizeAdjust +DoSoftShutDown +DoSqr +DoSqrt +DoStart +DoStartDock +DoStartDrag +DoStartWParms +DoStop +DoStoreEndDate +DoStoreMaxDate +DoStoreMinDate +DoSubtract +DosVersion +DoTableOfContents +DoTan +DoTanH +DoTaskMessageDlgPosHelp +DoTerminate +DoTile +DoTimesImaginary +DoTimesReal +DoTypeChange +double +DoubleClicked +DoubleDecliningBalance +DoubleToBcd +DoubleToBytes +DoubleToComp +DoUnDock +DoUpdate +DoUpdates +DoValidate +DoVerb +DoWheelTimer +downto +DoWrite +DoWriteDesignSize +DoWriteHeight +DoWriteHorizontalOffset +DoWriteVerticalOffset +DoWriteWidth +DPtoLP +DPtoTP +DragAcceptFiles +DragAllowed +DragCanceled +DragClass +DragControl +DragDetect +DragDone +DragDrop +DragDropTo +DragEnter +DragFindTarget +DragFindWindow +DragFinish +DragInit +DragInitControl +DragLeave +DragLock +DragMessage +DragMove +DragObject +DragOver +DragOverTo +DragQueryFile +DragQueryFileA +DragQueryFileW +DragQueryPoint +DragTo +DragUnlock +Draw +DrawAnimatedRects +DrawAppIcon +DrawArrow +DrawArrows +DrawAutoButtons +DrawAxisLines +DrawBackground +DrawBtnFrame +DrawButton +DrawButtonFace +DrawButtonGlyph +DrawButtonText +DrawCaption +DrawCaretPosIndicator +DrawCategory +DrawCell +DrawCheck +DrawChevron +DrawCloseButton +DrawColumnCell +DrawDataCell +DrawDesignFocus +DrawDockCaption +DrawDragDockImage +DrawDragDropPoint +DrawDropDownButton +DrawEdge +DrawElement +DrawEscape +DrawFocusCell +DrawFocusRect +DrawFrame +DrawFrameControl +DrawGlyph +DrawGlyphFrame +DrawGrabber +DrawGrabberLine +DrawIcon +DrawIconEx +DrawImage +DrawInsert +DrawItem +DrawLargeGlyph +DrawLine +DrawLines +DrawMenuBar +DrawMenuItem +DrawMove +DrawOverlay +DrawPanel +DrawPanelBackground +DrawParentBackground +DrawPenDataEx +DrawPenDataFmt +DrawPictures +DrawPictureText +DrawPinButton +DrawPlusMinus +DrawPlusMinusPicture +DrawPlusMinusText +DrawPoly +DrawRect +DrawScrollArrow +DrawSection +DrawSelectedFrame +DrawSeparator +DrawShadowedText +DrawShadowText +DrawSizingLine +DrawSL +DrawSR +DrawState +DrawStateA +DrawStateW +DrawStatusText +DrawStatusTextA +DrawStatusTextW +DrawSubMenuGlyph +DrawTab +DrawText +DrawTextA +DrawTextEx +DrawTextExA +DrawTextExW +DrawTextW +DrawThemedGrabber +DrawThemeEdge +DrawTheText +DrawTheTree +DrawTitleCell +DrawTree +DrawTreePicture +DrawUL +DrawUnusedEdges +DrawUR +DrawWorkAreas +DRIVE_GetRoot +DriveChange +DriveListChange +DriverNameChange +DriverNameDropDown +Drop +DropAggregate +DropColumn +DropConnections +DropDown +DropDownClick +DropDownControl +DropFilter +DropIndex +DropOptParameter +DropRange +DropStream +DropTable +DrTable +DrvGetModuleHandle +drvr +DSAdd +DSAttrA +DSAttrS +DSDefine +DSDesign +DSIntf +DTDcomment +DTDprocessingInstruction +DTDSchema +DumbItDownFor95 +DumpBlocks +DUnadvise +dup +DupBits +DupeString +duplicateCMNode +DuplicateHandle +DuplicateIcon +duplicateNode +DuplicatePenData +DuplicateToken +DuplicateTokenEx +dwDiffAT +dwDurInterval +DwmApi +DWORD +DWordEnumToPascalEnumOrd +DynArrayBounds +DynArrayClear +DynArrayDim +DynArrayElTypeInfo +DynArrayFromVariant +DynArrayIndex +DynArraySetLength +DynArraySize +DynArrayToVariant +eader +eaderControl +eason +EDBClient +EDBEngineError +Edit +Edit_GetCueBannerText +Edit_GetHilite +Edit_HideBalloonTip +Edit_SetCueBannerText +Edit_SetHilite +Edit_ShowBalloonTip +Editable +EditAction +EditActionFor +EditButtonClick +EditCanModify +EditCaption +EditChange +EditClientDataSet +EditConnectionString +EditDatabase +EditDialog +EditFileName +EditIndexFiles +EditingChange +EditingChanged +EditIntf +EditKey +EditKeyDown +EditListGetItems +EditMasterFields +EditOptions +EditorTokenValidChars +EditorViewActivated +EditorViewModified +EditProperty +EditRangeEnd +EditRangeStart +EditSQL +EditSQLSchema +EditSQLText +EditText +EditWndProc +EDOMParseError +EDSWriter +EFileStreamError +Eject +elementDefined +elementTypeDeclaration +ElfHashLowercase +ElideNearestBlock +Ellipse +else +Empty +EmptyBcd +EmptyClipboard +EmptyCompare +EmptyDataSet +EmptyOp +EmptyTable +EmptyWorkingSet +Enable +EnableAlign +EnableAutoRange +EnableButtons +EnableCommit +EnableConstraints +EnableControls +EnableDemandLoadReport +EnableEditUpdate +EnableElisions +EnableEvents +EnableGestureSetHRC +EnableHiding +EnableMenuItem +EnableModeless +EnableModelessSB +EnableNotify +EnableOpenDropDown +EnablePreserveWhitespace +EnableScrollBar +EnableSocketTransport +EnableSystemDictionaryHRC +EnableTaskWindows +EnableWebTransport +EnableWindow +EncodeDate +EncodeDateDay +EncodeDateMonthWeek +EncodeDateTime +EncodeDateWeek +EncodeDayOfWeekInMonth +EncodeFieldDesc +EncodeFieldDescs +EncodeIndexDesc +EncodeTime +EncodingMatches +EncryptFile +EncryptFileA +EncryptFileW +end +End_ +EndAbort +EndAbortVariants +EndAnimation +endAttListDeclaration +EndBlock +EndCallStackAccess +EndColumnDrag +EndCommit +EndCommitVariants +EndConnect +EndCreateFields +EndDeferWindowPos +EndDesign +EndDialog +EndDispatch +EndDoc +EndDocPrinter +endDocument +EndDrag +endDtd +EndEdit +endElement +ender +EndGlobalLoading +EndInsertAppend +EndLayout +EndMenu +EndOfADay +EndOfAMonth +EndOfAWeek +EndOfAYear +EndOfList +EndOfLiteral +EndOfNestedRows +EndOfRecordset +EndOfTheDay +EndOfTheMonth +EndOfTheWeek +EndOfTheYear +EndPage +EndPagePrinter +EndPaint +EndPath +EndPenInputHRC +endPrefixMapping +EndPrepare +EndPrepareVariants +EndRead +EndReferences +EndRowDrag +EndsStr +EndsText +endsWith +EndThread +EndTransaction +EndUpdate +EndUpdateFieldDefs +EndUpdateResource +EndUpdateResourceA +EndUpdateResourceW +EndVisualGroup +EndWrite +EngineDefined +EnlargeImage +EnlistResource +enPacket +EnsureColRow +EnsureDataRow +EnsureHelpManager +EnsureRange +EnsureUpdate +Enter +EnterCriticalSection +entityDeclaration +entityRef +Enum +EnumActions +EnumAdvise +EnumCache +EnumCalendarInfo +EnumCalendarInfoA +EnumCalendarInfoW +EnumCategories +EnumChildWindows +EnumClassesOfCategories +EnumClipboardFormats +EnumConnectionPoints +EnumConnections +EnumDAdvise +EnumDateFormats +EnumDateFormatsA +EnumDateFormatsW +EnumDependentServices +EnumDependentServicesA +EnumDependentServicesW +EnumDesktops +EnumDesktopsA +EnumDesktopsW +EnumDesktopWindows +EnumDeviceDrivers +EnumDisplayDevices +EnumDisplayDevicesA +EnumDisplayDevicesW +EnumDisplaySettings +EnumDisplaySettingsA +EnumDisplaySettingsW +EnumElements +EnumEnhMetaFile +EnumerateLoadedModules +EnumerateRunningProcesses +EnumFontFamilies +EnumFontFamiliesA +EnumFontFamiliesEx +EnumFontFamiliesExA +EnumFontFamiliesExW +EnumFontFamiliesW +EnumFonts +EnumFontsA +EnumFontsProc +EnumFontsW +EnumFormatEtc +EnumForms +EnumFormsA +EnumFormsW +EnumICMProfiles +EnumICMProfilesA +EnumICMProfilesW +EnumImplCategoriesOfClass +EnumItems +EnumJobs +EnumJobsA +EnumJobsW +EnumMetaFile +EnumModules +EnumMonitors +EnumMonitorsA +EnumMonitorsProc +EnumMonitorsW +EnumNames +EnumObjectParam +EnumObjects +EnumPorts +EnumPortsA +EnumPortsW +EnumPrinterData +EnumPrinterDataA +EnumPrinterDataW +EnumPrinterDrivers +EnumPrinterDriversA +EnumPrinterDriversW +EnumPrinters +EnumPrintersA +EnumPrintersW +EnumPrintProcessorDatatypes +EnumPrintProcessorDatatypesA +EnumPrintProcessorDatatypesW +EnumPrintProcessors +EnumPrintProcessorsA +EnumPrintProcessorsW +EnumProcesses +EnumProcessModules +EnumProjectModules +EnumProjectUnits +EnumProps +EnumPropsA +EnumPropsEx +EnumPropsExA +EnumPropsExW +EnumPropsW +EnumRegisteredActions +EnumRegKey +EnumReqCategoriesOfClass +EnumResourceLanguages +EnumResourceLanguagesA +EnumResourceLanguagesW +EnumResourceModules +EnumResourceNames +EnumResourceNamesA +EnumResourceNamesW +EnumResourceTypes +EnumResourceTypesA +EnumResourceTypesW +EnumRunning +EnumSearches +EnumServicesStatus +EnumServicesStatusA +EnumServicesStatusW +EnumStringModules +EnumSystemCodePages +EnumSystemCodePagesA +EnumSystemCodePagesW +EnumSystemLocales +EnumSystemLocalesA +EnumSystemLocalesW +EnumTaskWindows +EnumThreadWindows +EnumTimeFormats +EnumTimeFormatsA +EnumTimeFormatsW +EnumVerbs +EnumViews +EnumWideStringModules +EnumWindows +EnumWindowStations +EnumWindowStationsA +EnumWindowStationsW +EnvCount +EnvStr +EOleException +EOleSysError +Equal +EqualPrefixSid +EqualRect +EqualRgn +Equals +EqualSid +EraseDragDockImage +EraseSection +EraseTape +EReconcileError +ereport_getfd +ereport_init +ereport_terminate +Error +ErrorAt +ErrorFmt +ErrorMsg +ErrorStr +ESafeArrayError +Escape +EscapeCommFunction +ession +est +EUpdateError +Evaluate +EvaluateExpression +EvaluateModify +Evaluation +EvaluteComplete +Event +EventConnect +EventNotification +EventRefFromWpLp +EventSinkChanged +except +ExceptAddr +ExceptionErrorMessage +ExceptObject +Exchange +ExchangeItems +ExcludeClipRect +ExcludeTrailingBackslash +ExcludeTrailingPathDelimiter +ExcludeUpdateRgn +Exec +ExecAction +ExecProc +ExecSQL +Execute +ExecuteAction +ExecuteComplete +ExecuteMacro +ExecuteMacroLines +ExecuteOptionsToOrd +ExecutePaletteItem +ExecuteSetting +ExecuteTarget +ExecuteVerb +Existing +Exists +Exit +ExitDll +ExitProcess +ExitThread +ExitWindows +ExitWindowsEx +Exp +Expand +ExpandClick +ExpandDir +expandEntRef +ExpandEnvironmentStrings +ExpandEnvironmentStringsA +ExpandEnvironmentStringsW +ExpandFileName +ExpandFileNameCase +ExpandItem +ExpandTilde +ExpandTimer +ExpandUNCFileName +ExplorerHook +export +ExportApplication +exports +ExptIntf +ExtActns +ExtCreatePen +ExtCreateRegion +ExtCtrls +ExtDlgs +extDtdMemoryToDom +extDtdSourceCodeToDom +extDtdStreamToDom +extDtdStringToDom +extDtdWideStringToDom +Extend +extended +ExtendPageDown +ExtendPageUp +ExtendReal +ExtendRelative +external +ExtEscape +ExtFloodFill +Extract +ExtractAssociatedIcon +ExtractAssociatedIconA +ExtractAssociatedIconW +ExtractAttrValue +ExtractCommandType +ExtractDtdParts +ExtractFieldName +ExtractFileDir +ExtractFileDrive +ExtractFileExt +ExtractFileName +ExtractFileNames +ExtractFilePath +ExtractFilePathEx +ExtractFilePathNoDrive +ExtractIcon +ExtractIconA +ExtractIconEx +ExtractIconExA +ExtractIconExW +ExtractIconW +ExtractKey +ExtractLiterals +ExtractLocalName +ExtractMoneySymbol +ExtractName +ExtractPenDataPoints +ExtractPenDataStrokes +ExtractPrefix +ExtractRelativePath +ExtractShortPathName +ExtractStrings +ExtractUserID +ExtractWrapper +ExtSelectClipRgn +ExtStr +ExtTextOut +ExtTextOutA +ExtTextOutW +FAbsTimeInInterval +FactoryFree +FactoryRegisterClassObject +FactoryUpdateRegistry +FahrenheitToCelsius +Failed +false +far +FatalAppExit +FatalAppExitA +FatalAppExitW +fatalError +FatalExit +fauxiliary +fcarry +fclose +FD_CLR +FD_ISSET +FD_SET +FD_ZERO +fdopen +FEQAbsTime +FetchAll +FetchBlobs +FetchComplete +FetchDetails +FetchItems +FetchMoreData +FetchParams +FetchProgress +FetchStr +FExpand +fflush +FieldAddress +FieldByName +FieldByNumber +FieldChangeComplete +FieldDefsStored +FieldDefUpdate +FieldFromNode +FieldIsMapped +FieldKindClick +FieldLinkActive +FieldListBoxDragDrop +FieldListBoxDragOver +FieldListBoxStartDrag +FieldListCheckSum +FieldNameEditChange +FieldNameLBClick +FieldsChanged +FieldsSelected +FieldTypeListChange +FieldTypeToADOType +FigureChildren +FigureParent +file +file_notfound +file_setinherit +file_unix2local +FileAge +filebuf_buf2sd +filebuf_close +filebuf_close_buffer +filebuf_create +filebuf_getc +filebuf_grab +filebuf_next +filebuf_open +filebuf_open_nostat +FileClose +FileCompareText +FileCreate +FileCtrl +FileDateToDateTime +FileExists +FileGetAttr +FileGetDate +FileHistoryAPI +FileIntf +FileIsReadOnly +FileLoad +FileName +FileNOPProc +FileNotification +FileOkClick +FileOpen +FileRead +FileRec +FileSave +FileSearch +FileSeek +FileSetAttr +FileSetDate +FileSetReadOnly +FileTimeToDosDateTime +FileTimeToLocalFileTime +FileTimeToSystemTime +fileToDom +FileWrite +FillAppend +FillAt +FillChar +FillConsoleOutputAttribute +FillConsoleOutputCharacter +FillConsoleOutputCharacterA +FillConsoleOutputCharacterW +FillDialog +FillDWord +FillGlassRect +FillMemory +FillPath +FillRect +FillRgn +Filter +FilterAction +FilterCallback +FilterCategory +FilterFunc +FilterOnBookmarks +FilterProperties +FilterSpecArray +FinalClientRetry +finalization +FinalizeArray +FinalizePackage +FinalizeUnits +finally +FinalServerRetry +Find +FindAccelItem +FindActionBar +FindActionBars +FindActionClient +FindAncestor +FindAncestorComponent +FindAppInfoClass +FindAtom +FindAtomA +FindAtomW +FindAttributeDefs +FindBand +FindBestFilter +FindBestRootSprigClass +FindBestSprigClass +FindBS +FindButton +FindButtonFromAccel +FindByID +FindByName +FindCaption +FindCategory +FindCell +FindChildControl +FindClass +FindClassHInstance +FindClient +FindClose +FindCloseChangeNotification +FindClosePrinterChangeNotification +FindCloseUrlCache +FindCmdLineSwitch +FindComponent +FindComponentByClass +FindComponentClass +FindConnectionPoint +FindControl +FindCustomVariantType +FindData +FindDatabase +FindDatabaseHandle +FindDebugInfoFile +FindDerivation +FindDockClientInfo +FindDragTarget +FindElementDefs +FindEngine +FindEntry +FindExecutable +FindExecutableA +FindExecutableImage +FindExecutableW +FindField +FindFieldClass +FindFieldInfo +FindFileSystem +FindFilter +FindFirst +FindFirstChangeNotification +FindFirstChangeNotificationA +FindFirstChangeNotificationW +findFirstChild +FindFirstFile +FindFirstFileA +FindFirstFileEx +FindFirstFileExA +FindFirstFileExW +FindFirstFileW +FindFirstFreeAce +FindFirstPrinterChangeNotification +FindFirstUrlCacheEntry +FindFirstUrlCacheEntryA +FindFirstUrlCacheEntryEx +FindFirstUrlCacheEntryExA +FindFirstUrlCacheEntryExW +FindFirstUrlCacheEntryW +FindFirstVisibleItem +FindFormAndComponent +FindFormModule +FindGlobalComponent +FindGroup +FindHandlerItem +FindHInstance +FindHostedNode +FindIdent +FindIdentToInt +FindIndexForFields +FindInstanceOf +FindIntToIdent +FindItem +FindItemAt +FindItemByAction +FindItemByCaption +FindItemByName +FindItemByPath +FindItemCaption +FindItemGroup +FindItemGroupByName +FindItemID +FindItemNS +FindItemProp +FindKey +FindLast +findLastChild +FindLastVisibleItem +FindLeastUsedItem +FindLegacyDerivation +FindLiteralChar +FindLocationHint +FindMatchingFile +FindMediaType +FindMediaTypeClass +FindMember +FindMenuItem +FindMethod +FindMethodInstance +FindMethodName +FindMimeFromData +FindModule +FindModuleInfo +FindMonitor +FindName +FindNameFromId +FindNamespaceDecl +FindNamespaceURI +FindNearest +FindNearestControl +FindNestedComponent +findNewReferenceNode +findNewReferenceNodes +FindNext +FindNextAttDef +FindNextChangeNotification +FindNextControl +FindNextFile +FindNextFileA +FindNextFileW +findNextNode +FindNextPage +FindNextPrinterChangeNotification +FindNextRow +findNextSibling +FindNextToSelect +FindNextUrlCacheEntry +FindNextUrlCacheEntryA +FindNextUrlCacheEntryEx +FindNextUrlCacheEntryExA +FindNextUrlCacheEntryExW +FindNextUrlCacheEntryW +FindNextVisibleItem +FindNextWordStart +FindNode +FindObjects +FindParam +findParentNode +FindPath +FindPoint +FindPopupControl +FindPos +FindPrevious +findPreviousNode +findPreviousSibling +FindPreviousVisibleItem +FindPrior +FindProc +FindPropInfo +FindRecord +FindReplaceDialogHook +FindReplaceWndProc +FindResource +FindResourceA +FindResourceEx +FindResourceExA +FindResourceExW +FindResourceHInstance +FindResourceW +FindRoot +FindRootAncestor +FindRootDesigner +FindRow +FindScanline +FindSchemaExporter +FindSchemaImporter +FindServer +FindSession +FindSibling +FindString +FindStringResource +FindSwitch +FindSymIndex +FindText +FindTextA +FindTextW +FindTimer +FindToolbar +FindTopMostWindow +FindTuple +FindVarData +FindVCLWindow +FindWideStringResource +FindWindow +FindWindowA +FindWindowEx +FindWindowExA +FindWindowExW +FindWindowW +FindWinHelp +Finished +FinishOperations +FinishSelection +FIntervalInInterval +FIntervalXInterval +First +FIRST_IPADDRESS +firstChild +FIsAnsi +FIsAnsiGesture +FIsGesture +FIsKanji +FIsSelectGesture +FIsShape +FIsSpecial +FIsStdGesture +FIsUniCode +FIsVKey +FixFileName +FixIncAmount +FixTabPos +FixupIdent +FixupReferences +FixupResourceHeader +FixupTabList +FlashWindow +FlashWindowEx +FlatSB +FlatSB_EnableScrollBar +FlatSB_GetScrollInfo +FlatSB_GetScrollPos +FlatSB_GetScrollProp +FlatSB_GetScrollRange +FlatSB_SetScrollInfo +FlatSB_SetScrollPos +FlatSB_SetScrollProp +FlatSB_SetScrollRange +FlatSB_ShowScrollBar +FlattenPath +FldCmp +FldLinks +FlipChildren +FloatToCurr +FloatToDateTime +FloatToDecimal +FloatToStr +FloatToStrF +FloatToText +FloatToTextFmt +FloodFill +Floor +FLTAbsTime +FLTEAbsTime +Flush +FlushBuffer +FlushBuffers +FlushConsoleInputBuffer +FlushFileBuffers +FlushInstructionCache +FlushSchemaCache +FlushSprigTypes +FlushViewOfFile +fmclosed +fminout +fminput +fmoutput +FMTBcd +FmtLoadStr +FmtStr +Focus +FocusCell +FocusControl +Focused +FocusItem +FocusKeyDown +FocusNode +FolderChange +FolderChanging +FoldString +FoldStringA +FoldStringW +FontChanged +FontColorProc +FontDialogHook +FontToOleFont +fopen +for +ForceDemandLoadState +ForceDirectories +ForceLog +ForceTransactionToAbort +ForceType +ForceUpdateCallback +ForEach +ForEachFactory +ForEachSelection +ForegroundTask +ForegroundTaskCheck +Forget +ForgetLogRecord +Form +FormActivated +Format +FormatBcd +FormatBuf +FormatCurr +formatDate +FormatDateTime +FormatFloat +formatIndex +FormatLine +FormatMaskText +FormatMessage +FormatMessageA +FormatMessageW +formatNumber +FormatOneBcd +formatTime +FormatXMLData +FormClose +FormCloseQuery +FormCreate +FormCreated +FormDestroy +FormKeyDown +FormKeyPress +FormModified +FormResize +Forms +FormSaving +FormShow +FormUpdateActionUpdate +forward +ForwardMovement +FOURTH_IPADDRESS +foverflow +fparity +FPenUpX +FPower10 +fprintf +Frac +Frame3D +FrameExtended +FrameRect +FrameRgn +FREE +freeAllCMNodes +freeAllNodes +FreeAndNil +FreeAndNilProperties +FreeBookmark +FreeBuffer +FreeBuffers +FreeChildren +freeCMExternalObject +freeCMInternalObject +freeCMObject +FreeConsole +FreeConversionType +freeConvertBuffer +FreeDataPacket +FreeDDElParam +FreeDeviceContext +FreeDeviceContexts +FreeDockPos +FreeDocument +freeDocumentType +FreeEditorGroup +FreeEnvironmentStrings +FreeEnvironmentStringsA +FreeEnvironmentStringsW +FreeException +FreeFieldBuffers +FreeFixups +FreeFonts +FreeHandle +FreeInfoRecords +FreeInstance +FreeIntConstList +FreeItem +FreeItemProps +FreeKeyBuffers +FreeLibrary +FreeLibraryAndExitThread +FreeList +FreeMemory +FreeModule +FreeNotification +FreeObjectInstance +FreeOnRelease +FreePascalString +FreePrinterNotifyInfo +FreePrinters +FreeProcInstance +FreeProjFileHooks +FreeRecordBuffer +FreeResolver +FreeResource +FreeSection +FreeSections +FreeSid +FreeStatement +FreeStatementLocale +FreeThemeLibrary +FreeTimer +FreeTLSBuffer +FreeTreeData +freeTreeWalker +FreeWinSock2 +Freeze +FreezeEvents +Frexp +FromCommon +FSearch +fsign +FSplit +FtpCommand +FtpCommandA +FtpCommandW +FtpCreateDirectory +FtpCreateDirectoryA +FtpCreateDirectoryW +FtpDeleteFile +FtpDeleteFileA +FtpDeleteFileW +FtpFindFirstFile +FtpFindFirstFileA +FtpFindFirstFileW +FtpGetCurrentDirectory +FtpGetCurrentDirectoryA +FtpGetCurrentDirectoryW +FtpGetFile +FtpGetFileA +FtpGetFileSize +FtpGetFileW +FtpOpenFile +FtpOpenFileA +FtpOpenFileW +FtpPutFile +FtpPutFileA +FtpPutFileW +FtpRemoveDirectory +FtpRemoveDirectoryA +FtpRemoveDirectoryW +FtpRenameFile +FtpRenameFileA +FtpRenameFileW +FtpSetCurrentDirectory +FtpSetCurrentDirectoryA +FtpSetCurrentDirectoryW +FullCollapse +FullExpand +FullWindowUpdate +func_exec +func_find +func_init +func_insert +function +FurtherAttrNormalization +FutureValue +fzero +GDAL +GDICheck +GdiComment +GDIError +GdiFlush +GdiGetBatchLimit +GdiSetBatchLimit +GenConflictSelectSQL +GenDeleteSQL +GenerateConsoleCtrlEvent +GenerateDesktopItemHtml +GenerateDragImage +GenerateName +GenerateParamSQL +GeneratePrefix +GenInsertSQL +GenSelectSQL +GenUpdateSQL +GenWhereSQL +Get +Get__NewEnum +Get_AbsolutePage +Get_AbsolutePosition +Get_accChild +Get_accChildCount +Get_accDefaultAction +Get_accDescription +Get_accFocus +Get_accHelp +Get_accHelpTopic +Get_accKeyboardShortcut +Get_accName +Get_accParent +Get_accRole +Get_accSelection +Get_accState +Get_accValue +Get_ActiveCommand +Get_ActiveConnection +Get_ActualSize +Get_AddEnabled +GET_APPCOMMAND_LPARAM +Get_Application_ +Get_async +Get_Attributes +Get_baseName +Get_Body +Get_BOF +get_Bold +Get_Bookmark +Get_Buffer +Get_ButtonCount +Get_CacheControl +Get_CacheSize +Get_CanEdit +Get_Caption +Get_Chapter +Get_CharSet +Get_Checked +Get_Child +Get_ChildCount +Get_childNodes +Get_children +Get_ClientCertificate +Get_CodePage +Get_Collect +Get_CommandText +Get_CommandTimeout +Get_CommandType +get_CommitBatchSize +Get_ConnectionString +Get_ConnectionTimeout +Get_Constraints +get_ConstructString +Get_Contents +Get_ContentType +Get_ContextIdent +get_ContextInfo +Get_ControlDefault +Get_Cookies +Get_Count +get_CurDC +Get_CursorLocation +Get_CursorType +Get_Data +Get_DataFormat +Get_DataMember +Get_DataSource +Get_DataStoreMajorVersion +Get_DataStoreMinorVersion +Get_dataType +Get_DefaultDatabase +Get_DefinedSize +Get_definition +Get_Description +get_DestPath +GET_DEVICE_LPARAM +Get_Direction +Get_DisplayName +Get_doctype +Get_documentElement +get_domImplementation +Get_DSO +Get_dtdURL +Get_EditCaption +Get_EditMode +Get_Enabled +get_Encoding +Get_entities +Get_EOF +Get_errorCode +Get_Errors +Get_EventID +Get_Expanded +Get_Expires +Get_ExpiresAbsolute +Get_Fields +Get_fileModifiedDate +Get_filepos +Get_fileSize +Get_fileUpdatedDate +Get_Filter +get_FireEvents +Get_firstChild +GET_FLAGS_LPARAM +Get_Focused +Get_Form +Get_Group +Get_GroupIndex +get_Handle +Get_HasKeys +get_Height +Get_HelpContext +Get_HelpFile +get_hFont +Get_Hint +get_hPal +Get_Ident +Get_ImageIndex +Get_implementation_ +Get_Index +Get_input +get_internalSubset +Get_InternetTimeout +Get_IsolationLevel +get_Italic +Get_Item +Get_ItemIndex +Get_JavaDSOCompatible +get_KeepOriginalFormat +Get_Key +GET_KEYSTATE_LPARAM +Get_lastChild +Get_LCID +Get_length +Get_line +Get_linepos +get_localName +Get_LockType +Get_MajorVersion +Get_MarshalOptions +Get_MaxRecords +Get_mimeType +Get_MinorVersion +Get_Mode +GET_MOUSEORKEY_LPARAM +Get_Name +Get_Names +Get_namespaceURI +Get_NativeError +Get_nextSibling +Get_nodeName +Get_NodePreservationMode +Get_nodeType +Get_nodeTypedValue +Get_nodeTypeString +Get_nodeValue +Get_notationName +Get_notations +Get_Number +Get_NumericScale +Get_OLEDBCommand +Get_OriginalValue +Get_output +Get_ownerDocument +get_ownerElement +get_PackageGuid +get_PackageName +Get_PageCount +Get_PageSize +Get_Parameters +Get_Parent +Get_parentNode +Get_parsed +Get_parseError +Get_Precision +Get_prefix +Get_Prepared +Get_preserveWhiteSpace +Get_previousSibling +Get_Properties +Get_PropertyByName +Get_PropertyByPosition +Get_Provider +Get_publicId +Get_QueryString +Get_RadioItem +Get_readyState +Get_reason +Get_RecordCount +Get_RemoveEnabled +Get_Request +Get_resolveExternals +Get_Response +Get_responseBody +Get_responseStream +Get_responseText +Get_responseXML +Get_root +Get_RootNodeCount +Get_RowPosition +Get_Rowset +Get_ScriptTimeout +get_Security +Get_Selected +Get_Server +Get_ServerVariables +Get_Session +Get_SessionID +Get_ShortCut +Get_Size +Get_Sort +Get_SortByIndex +Get_Source +get_SourcePath +Get_specified +Get_SQLState +Get_srcText +get_Standalone +Get_State +Get_StateIndex +Get_StaticObjects +Get_Status +Get_statusText +Get_StayInSync +get_Strikethrough +get_StructuredRecords +Get_StructureType +Get_stylesheet +Get_systemId +Get_tagName +Get_target +Get_text +Get_Timeout +Get_TotalBytes +get_TransactionState +get_TransactionUOW +get_Type +Get_Type_ +get_Underline +Get_UnderlyingValue +Get_url +Get_Valid +get_validate +Get_validateOnParse +Get_Value +Get_Version +Get_ViewOptions +Get_Visible +get_Weight +get_Width +Get_xml +Get_XMLDocument +Get8087CW +GetAbs +GetAbsoluteIndex +GetAbsSqr +GetAbstract +GetAcceptExSockaddrs +GetAccessToProperty +GetAccessType +GetAce +GetAclInformation +GetACP +GetAction +GetActionBar +GetActionBarItemClass +GetActionBars +GetActionBarsClass +GetActionClient +GetActionClientItemClass +GetActionClients +GetActionClientsClass +GetActionControl +GetActionCount +GetActionLinkClass +GetActionList +GetActionManager +GetActive +GetActiveAggs +GetActiveClassGroup +GetActiveConnection +GetActiveConnections +GetActiveDesignerType +GetActiveFormHandle +GetActiveItem +GetActiveListbox +GetActiveMDIChild +GetActiveName +GetActiveObject +GetActiveOleObject +GetActivePage +GetActivePageIndex +GetActiveProject +GetActiveRecBuf +GetActiveRecord +GetActiveThreads +GetActiveValue +GetActiveWindow +GetActivityId +GetActualResHandle +GetActualResId +GetAdditionalFileExt +GetAdditionalFileName +GetAdditionalFiles +GetAdditionalFilesCount +GetAdditionalModuleFileCount +GetAdditionalModuleFileEditor +GetAddRemoveItemClass +GetAddressBkpt +GetAddressBkptCount +GetAddType +GetADODataSet +GetAdvise +GetAge +GetAggFieldData +GetAggRecordCount +GetAggregateDesc +GetAggregateValue +GetAliasDriverName +GetAliasName +GetAliasNames +GetAliasParams +GetAlign +GetAlignDisabled +GetAlignment +GetAllCustData +GetAllFuncCustData +GetAllImplTypeCustData +GetAllocMemCount +GetAllocMemSize +GetAllowReorder +GetAllParamCustData +getAllResponseHeaders +GetAllVarCustData +GetAlphabetHRC +GetAlphabetPriorityHRC +GetAlternateWordsHRCRESULT +GetAltGRStatus +GetAltTabInfo +GetAltTabInfoA +GetAltTabInfoW +GetAncestor +GetAncestorDesigner +GetAncestorModule +GetAncestorName +GetAngle +GetAnimateInterval +GetAnimateParams +GetAnimation +GetAnnotation +GetAnnotations +GetAppData +GetAppEvents +GetAppInfo +GetAppInfoCollection +GetApplication +GetApplicationDataDirectory +GetApplicationMainFormOnTaskBar +GetApproximatePosition +GetApps +GetAppServer +GetArcDirection +GetArguments +GetArrangeMode +GetAsBCD +GetAsBoolean +GetAsByteArray +GetAsCurrency +GetAsDateTime +GetAsDouble +GetAsFloat +GetAsFMTBCD +GetAsGuid +GetAsHandle +GetAsInteger +GetAsLargeint +GetAsMemo +GetAspectRatioFilterEx +GetAsPolar +GetAssemblyReferences +GetAsSmallInt +GetAssociateAttributes +GetAsSQLTimeStamp +GetAsString +GetAsText +GetAsVariant +GetAsWideString +GetAsyncKeyState +GetAsyncLoadState +GetAt +GetAtomName +GetAtomNameA +GetAtomNameW +GetAttr +GetAttrCount +GetAttribute +GetAttributeAtPos +GetAttributeDef +GetAttributeDefList +GetAttributeDefs +GetAttributeFormDefault +GetAttributeGroups +getAttributeNode +getAttributeNodeNS +GetAttributeNodes +GetAttributeNS +GetAttributes +GetAttributesOf +getAttributeType +GetAuditedPermissionsFromAcl +GetAuditedPermissionsFromAclA +GetAuditedPermissionsFromAclW +GetAuthor +GetAutoCompleteKey +GetAutoEntry +GetAutoHotkeys +GetAutoIndent +GetAutoLineReduction +GetAutoObject +GetAutoScroll +GetAutoSizing +GetAutoTable +GetAuxEditorInterface +GetAvailableColumns +GetAveCharSize +GetBackground +GetBackspaceUnindents +GetBackupFileName +GetBackwardCount +GetBackwardItem +GetBalancedName +GetBalloonTimeout +GetBandInfo +GetBannerWidth +GetBarHeight +GetBars +GetBarWidth +GetBaseAddress +GetBaseGroup +GetBaseKey +GetBaseName +GetBaseRegistryKey +GetBaseRegKey +GetBaseType +GetBaseTypeIndicator +GetBaseTypeName +GetBcdDigit +GetBinaryType +GetBinaryTypeA +GetBinaryTypeW +GetBindInfo +GetBindings +GetBindingType +GetBinDirectory +GetBindOptions +GetBit +GetBitBtnGlyph +GetBitmap +GetBitmapBits +GetBitmapDimensionEx +GetBitmapHandle +GetBkColor +GetBkMode +GetBlob +GetBlobData +GetBlobFieldData +GetBlobLen +GetBlobSize +GetBlobType +GetBlock +GetBlockAfter +GetBlockEndCol +GetBlockEndLine +GetBlockIndent +GetBlockStart +GetBlockStartCol +GetBlockStartLine +GetBlockType +GetBlockVisible +GetBOF +GetBookmark +GetBookmarkData +GetBookmarkFlag +GetBookmarkPos +GetBookmarkStr +GetBoolParam +GetBorder +GetBorderDW +GetBorderIconStyles +GetBorderSize +GetBorderStyles +GetBorderWidth +GetBottomRow +GetBounded +GetBoundingRect +GetBoundSource +GetBoundsRect +GetBoxMappingHRCRESULT +GetBoxResultsHRC +getBracket +GetBrushOrgEx +GetBuffer +GetBufferCount +GetBufferOptions +GetBufStart +GetBuiltInTypes +GetButton +GetButtonAt +GetButtonCaption +GetButtonCategoriesClass +GetButtonCategoryClass +GetButtonClass +GetButtonColors +GetButtonCount +GetButtonEnabled +GetButtonEnableDropDown +GetButtonGroup +GetButtonHasDropDown +GetButtonHint +GetButtonImageIndex +GetButtonItemClass +GetButtonMenu +GetButtonRect +GetButtons +GetButtonsClass +GetButtonSeparator +GetButtonSize +GetButtonState +GetButtonText +GetButtonValue +GetButtonVisible +GetBValue +GetByteLength +GetByteProp +GetBytesReserved +GetCacheSize +GetCalcFields +GetCalculated +GetCalendarHandle +GetCallCount +GetCallEndPos +GetCallFactoryObject +GetCallHeader +GetCallPos +GetCallStartPos +GetCalStyles +GetCanClose +GetCanDelete +GetCanModify +GetCanonicalFormatEtc +GetCanPaste +GetCanPrint +GetCanUndo +GetCanvas +GetCanvasOrientation +GetCapacity +GetCaption +GetCaptionFont +GetCaptionFontHeight +GetCaptionRect +GetCaptionSize +GetCapture +GetCardinality +GetCaretBlinkTime +GetCaretPos +GetCaseSensitive +GetCategories +GetCategory +GetCategoryAt +GetCategoryBounds +GetCategoryDesc +GetCategoryRect +GetCatID +GetCBInfo +GetCBreak +GetCell +GetCellCount +GetCellRect +GetCells +GetCellSizes +GetChangeCount +GetChangeDelay +GetCharABCWidths +GetCharABCWidthsA +GetCharABCWidthsFloat +GetCharABCWidthsFloatA +GetCharABCWidthsFloatW +GetCharABCWidthsI +GetCharABCWidthsW +GetCharacter +GetCharacterData +GetCharacterPlacement +GetCharacterPlacementA +GetCharacterPlacementW +GetCharset +GetCharWidth +GetCharWidth32 +GetCharWidth32A +GetCharWidth32W +GetCharWidthA +GetCharWidthFloat +GetCharWidthFloatA +GetCharWidthFloatW +GetCharWidthI +GetCharWidthW +GetCheckButtonState +GetChecked +GetCheckSize +GetCheckWidth +GetChevronBounds +GetChild +GetChildCount +GetChildDefs +GetChildElementList +GetChildNodeClass +GetChildNodeClasses +GetChildNodes +GetChildOwner +GetChildParent +GetChildren +GetChildRowset +GetChildValue +GetChunk +GetClass +GetClassDesc +GetClasses +GetClassFile +GetClassFileOrMime +GetClassForHandler +GetClassID +GetClassInfo +GetClassInfoA +GetClassInfoEx +GetClassInfoExA +GetClassInfoExW +GetClassInfoW +GetClassLong +GetClassLongA +GetClassLongW +GetClassName +GetClassNameA +GetClassNameW +GetClassParent +GetClassType +GetClassURL +GetClassWord +GetClerks +GetClientOrigin +GetClientRect +GetClientSite +GetClientSize +GetClientSocket +GetClientThread +GetClientType +GetCliItemByCtrl +GetCliItemByName +GetClipboardData +GetClipboardFormatName +GetClipboardFormatNameA +GetClipboardFormatNameW +GetClipboardOwner +GetClipboardSequenceNumber +GetClipboardStream +GetClipboardViewer +GetClipboardWindow +GetClipBox +GetClipCursor +GetClipRect +GetClipRgn +GetCloseRect +GetCLSIDData +GetCmdShow +getCMExternalObjects +getCMInternalObjects +getCMNodeType +getCMObject +getCMObjects +GetCoClasses +GetCode +getCodeAsString +getCodeAsWideString +GetCodeInsightType +GetCodeObjectCount +GetCodeObjects +GetCodePreviewInfo +GetColCount +GetColField +GetCollection +GetCollectionByQuery +GetColOptions +GetColor +GetColorAdjustment +GetColorMap +GetColorMapClass +GetColorName +GetColorProp +GetColorSchemes +GetColorSet +GetColorSpace +GetCols +GetColumn +GetColumnCount +GetColumnDescs +GetColumnFromIndex +GetColumnFromTag +GetColumnHeaders +GetColumnInfo +GetColumnNumber +GetColumnSpanIndex +GetColumnsRowset +GetColumnVariants +GetColWidths +GetComboBoxInfo +GetComboItem +GetComboText +GetComCtlVersion +GetCommand +GetCommandCount +GetCommandLine +GetCommandLineA +GetCommandLineW +GetCommandString +GetCommandText +GetCommandTimeOut +GetCommandType +GetCommaText +GetCommConfig +GetComment +GetCommMask +GetCommModemStatus +GetCommProperties +GetCommState +GetCommTimeouts +GetComObject +GetComplexTypes +GetComponent +GetComponentCount +GetComponentEditor +GetComponentFromHandle +GetComponentHandle +GetComponentIndex +GetComponentName +GetComponentNames +GetComponentProperties +GetComponentReference +GetComponentType +GetComponentValue +GetCompositorNode +GetCompositors +GetCompositorType +GetCompProp +GetCompressedFileSize +GetCompressedFileSizeA +GetCompressedFileSizeW +GetCompressionRate +GetCompUnit +GetCompUnitCount +GetCompUnitFileCount +GetCompUnitFileName +GetComputerForGUID +GetComputerForProgID +GetComputerName +GetComputerNameA +GetComputerNameW +GetConfigMode +GetConfigParams +GetConnected +GetConnection +GetConnectionInterface +GetConnectionPointContainer +GetConnections +GetConnectionString +GetConnectionTimeout +GetConsistentAttributes +GetConsoleCP +GetConsoleCursorInfo +GetConsoleMode +GetConsoleOutputCP +GetConsoleScreenBufferInfo +GetConsoleTitle +GetConsoleTitleA +GetConsoleTitleW +GetContainer +GetContainingTypeLib +GetContent +GetContentAge +GetContentExtent +GetContentModel +GetContentNode +getContentspec +getContentspecType +GetContext +GetContextId +GetContextItems +GetContextMenuItem +GetControl +GetControlAtPos +GetControlBound +GetControlBounds +GetControlClass +GetControlCount +GetControlExtents +GetControlIndex +GetControlInfo +GetControlItem +GetControlItemState +GetController +GetControlPadding +GetControlsAlignment +GetControlState +GetControlWindow +GetConvertInfo +GetConvertStg +GetConvFamilies +GetConvFamilyInfo +GetConvInfo +GetConvTypes +getCorrespondingCMEntity +GetCount +GetCPInfo +GetCPUType +GetCreateBackupFile +GetCreateParent +GetCreationProperties +GetCreatorType +getCssText +GetCtl3D +GetCurFile +GetCurFolder +GetCurPassCount +GetCurrencyFormat +GetCurrencyFormatA +GetCurrencyFormatW +GetCurrencyProp +GetCurrent +GetCurrentBookMark +GetCurrentCommand +GetCurrentDate +GetCurrentDir +GetCurrentDirectory +GetCurrentDirectoryA +GetCurrentDirectoryW +GetCurrentEditor +GetCurrentFile +GetCurrentFolderPath +GetCurrentHelpFile +GetCurrentHwProfile +GetCurrentHwProfileA +GetCurrentHwProfileW +GetCurrentInfo +GetCurrentInstructionLine +GetCurrentLine +getCurrentNode +GetCurrentObject +GetCurrentPlayback +GetCurrentPos +GetCurrentPositionEx +GetCurrentProcess +GetCurrentProcessId +GetCurrentRecord +GetCurrentRowSelected +GetCurrentSelection +GetCurrentSession +GetCurrentSubItem +GetCurrentThread +GetCurrentThreadID +GetCurrentTime +GetCurrentTrustee +GetCursor +GetCursorHeightMargin +GetCursorInfo +GetCursorLocation +GetCursorPos +GetCursorProps +GetCursors +GetCursorThroughTabs +GetCursorType +GetCurValue +GetCustData +GetCustomColors +GetCustomColorsArray +GetCustomForm +GetCustomFormCount +GetCustomFormGlassFrame +GetCustomForms +GetCustomId +GetCut +GetCValue +GetData +GetDatabase +GetDatabaseCount +GetDatabaseNames +GetDataBrokerList +GetDataExpr +GetDataField +GetDataHere +GetDataInfo +GetDataItem +GetDataLinkFiles +GetDataModule +GetDataModuleCount +GetDataObject +GetDataPacket +GetDataSet +GetDataSetCount +GetDataSetFromDelta +GetDataSize +GetDataSource +GetDataSourcePropName +getDataString +GetDataType +GetDataTypeName +GetDate +GetDateFormat +GetDateFormatA +GetDateFormatW +GetDBHandle +GetDBLocale +GetDBSession +GetDC +GetDCBrushColor +GetDCEx +GetDCOrgEx +GetDCPenColor +GetDeactivateOnReturn +GetDefault +GetDefaultColorMapClass +GetDefaultColumn +GetDefaultColumnState +GetDefaultCommConfig +GetDefaultCommConfigA +GetDefaultCommConfigW +GetDefaultDatabase +getDefaultDeclaration +GetDefaultDispatch +GetDefaultExpression +GetDefaultFields +GetDefaultFilter +GetDefaultFolder +GetDefaultHelpFile +GetDefaultHighlighterPreview +GetDefaultIME +GetDefaultInterface +GetDefaults +GetDefaultSearchGUID +GetDefaultSounds +GetDefaultState +GetDefaultWidth +GetDelimitedText +GetDelimiter +GetDelta +GetDerivationMethod +GetDesc +GetDescription +GetDesignClass +GetDesigner +GetDesignerExtension +GetDesignerGuideOffset +GetDesignerGuideType +GetDesignerState +GetDesignMode +GetDesignObject +GetDesktopHeight +GetDesktopItem +GetDesktopItemByID +GetDesktopItemBySource +GetDesktopItemCount +GetDesktopItemOptions +GetDesktopLeft +GetDesktopRect +GetDesktopTop +GetDesktopWidth +GetDesktopWindow +GetDestCtx +GetDetail +GetDetailCount +GetDetailDataSet +GetDetailDataSets +GetDetailLinkFields +GetDetailsEx +GetDetailsOf +GetDeviceCaps +GetDeviceContext +GetDeviceDriverBaseName +GetDeviceDriverBaseNameA +GetDeviceDriverBaseNameW +GetDeviceDriverFileName +GetDeviceDriverFileNameA +GetDeviceDriverFileNameW +GetDeviceGammaRamp +GetDialog +GetDialogBaseUnits +GetDialogCaption +GetDialogClass +GetDialogHandle +GetDIB +GetDIBColorTable +GetDIBits +GetDIBSizes +GetDInColors +GetDirectCallerName +GetDirectCallerSID +GetDirectCreatorName +GetDirectCreatorSID +GetDirection +GetDirectory +getDisabled +GetDisabledBreakpointLine +GetDisabledColor +GetDisableGroup +GetDiskFreeSpace +GetDiskFreeSpaceA +GetDiskFreeSpaceEx +GetDiskFreeSpaceExA +GetDiskFreeSpaceExW +GetDiskFreeSpaceW +GetDispatchPropValue +GetDispID +GetDispIDOfName +GetDisplayLabel +GetDisplayName +GetDisplayNameOf +GetDisplayNameStr +GetDisplayNameWStr +GetDisplayRect +GetDisplaySize +GetDisplayString +GetDisplayText +GetDisplayValue +GetDisplayWidth +GetDlgCtrlID +GetDlgItem +GetDlgItemInt +GetDlgItemRect +GetDlgItemText +GetDlgItemTextA +GetDlgItemTextW +GetDllEntry +GetDoBreak +GetDocBinding +GetDocElementDef +GetDockAlign +GetDockCaptionDrawer +GetDockClientCount +GetDockClientFromMousePos +GetDockClients +GetDocMiscStatus +getDoctype +GetDocument +GetDocumentation +GetDocumentation2 +GetDocumentationCollection +getDocumentClass +GetDocumentElement +GetDocumentNode +GetDocumentObject +getDocuments +GetDocumentType +getDocumentTypes +GetDoHandleExceptions +GetDoIgnoreExceptions +GetDOM +GetDomainAddresses +GetDOMDocument +GetDOMImpl +GetDOMNode +GetDOMNodeEx +GetDOMParseOptions +GetDOMPersist +GetDOMVendor +GetDoubleClickTime +GetDoubleProp +GetDragAcceptors +GetDragCursor +GetDragImages +GetDrive +GetDriverModuleHandle +GetDriverName +GetDriverNames +GetDriverParams +GetDriverTypeName +GetDriveType +GetDriveTypeA +GetDriveTypeW +GetDropCtl +GetDropDownCount +GetDroppedDown +GetDropTarget +GetDSDesignerClass +getDutchErrorStr +GetDynArrayProp +GetEditable +GetEditBlock +GetEditBoxText +GetEditBuffer +GetEditBufferIterator +GetEditLimit +GetEditLineTracker +GetEditMask +GetEditMode +GetEditOptions +GetEditOptionsCount +GetEditOptionsForFile +GetEditOptionsIDString +GetEditOptionsIndex +GetEditorClass +GetEditorControl +GetEditorInterface +GetEditorOpts +GetEditorServices +GetEditPosition +GetEditState +GetEditStateFor +GetEditStyle +GetEditText +GetEditValue +GetEditView +GetEditViewCount +GetEditWindow +GetEffectiveClientRect +GetEffectiveRightsFromAcl +GetEffectiveRightsFromAclA +GetEffectiveRightsFromAclW +GetElement +getElementById +GetElementCompositors +GetElementDef +GetElementDefList +GetElementDefs +GetElementDetails +GetElementFormDefault +GetElementGroups +getElementsByTagName +getElementsByTagNameNS +GetElidableBlockDescription +GetElidableBlockEndCol +GetElidableBlockEndLine +GetElidableBlockStartCol +GetElidableBlockStartLine +GetElidedBlockDescription +GetElidedBlockEndCol +GetElidedBlockEndLine +GetElidedBlockStartCol +GetElidedBlockStartLine +GetEmbeddedDS +GetEmpty +GetEmptyProjectDependenciesList +GetEnabled +GetEnableGroup +GetEncoding +getEncodingType +GetEndingColumn +GetEndingRow +getEnglishErrorStr +GetEnhMetaFile +GetEnhMetaFileA +GetEnhMetaFileBits +GetEnhMetaFileDescription +GetEnhMetaFileDescriptionA +GetEnhMetaFileDescriptionW +GetEnhMetaFileHeader +GetEnhMetaFilePaletteEntries +GetEnhMetaFilePixelFormat +GetEnhMetaFileW +getEntities +GetEntity +GetEntry +GetEntryCount +GetEntryFromHandle +GetEntryHandle +GetEntryPoint +GetEnum +GetEnumAllWindowsOnActivateHint +GetEnumerations +GetEnumerator +GetEnumFlagsForItem +GetEnumName +GetEnumNameValue +GetEnumProp +GetEnumPropDesc +GetEnumValue +getenv +GetEnvironmentOptions +GetEnvironmentStrings +GetEnvironmentStringsA +GetEnvironmentStringsW +GetEnvironmentVariable +GetEnvironmentVariableA +GetEnvironmentVariableW +GetEOF +GetEraseWhenMoving +GetError +GetErrorCode +GetErrorCount +GetErrorDescription +GetErrorDS +GetErrorInfo +GetErrorLine +GetErrorMessage +GetErrors +getErrorStr +GetErrorString +GetEvalExpression +GetEventClassesForIID +GetEventDispatcher +GetEventMethod +GetExceptionInfo +GetExceptionMask +GetExecuteOptions +GetExecution +GetExeName +GetExisting +GetExists +GetExitCodeProcess +GetExitCodeThread +GetExpandable +GetExpandAll +GetExpandBtnClass +GetExpanded +GetExpandedItems +GetExpandedName +GetExpandedNameA +GetExpandedNameW +GetExpandedNodeCount +GetExplicitEntriesFromAcl +GetExplicitEntriesFromAclA +GetExplicitEntriesFromAclW +GetExportTranslator +GetExprData +GetExpression +GetExt +GetExtendedControl +GetExtensibilityObject +GetExtension +GetExtensions +GetExtensionVersion +GetExtent +GetFacetParentNode +GetFactoryFromClass +GetFactoryFromClassID +GetFAttr +GetField +GetFieldByName +GetFieldClass +GetFieldConstraint +GetFieldCount +GetFieldData +GetFieldDef +GetFieldDefCount +GetFieldDescs +GetFieldFullName +GetFieldIdx +GetFieldInfo +GetFieldList +GetFieldName +GetFieldNames +GetFieldNamesForIndex +GetFieldNo +GetFieldProperty +GetFields +GetFieldSource +GetFieldState +GetFieldText +GetFieldValue +GetFileAttributes +GetFileAttributesA +GetFileAttributesEx +GetFileAttributesExA +GetFileAttributesExEmulated +GetFileAttributesExPreload +GetFileAttributesExW +GetFileAttributesW +GetFileCount +GetFileFilter +GetFileFilterCount +GetFileHelpTrait +GetFileHistory +GetFileHistoryProvider +GetFileInformationByHandle +GetFileMaskWStr +GetFileName +GetFileNames +GetFilePath +GetFilePos +GetFiles +GetFileSecurity +GetFileSecurityA +GetFileSecurityW +GetFileSize +GetFileStream +GetFileSystem +GetFileTime +GetFileTitle +GetFileTitleA +GetFileTitleW +GetFileType +GetFileTypeIndex +GetFileVersion +GetFileVersionInfo +GetFileVersionInfoA +GetFileVersionInfoSize +GetFileVersionInfoSizeA +GetFileVersionInfoSizeW +GetFileVersionInfoW +GetFilter +GetFilterBindings +GetFilterData +GetFilterGroup +GetFilterHandler +GetFilterIndex +GetFilterName +GetFilterStr +GetFinal +GetFindDialog +GetFindText +getFirstChild +getFirstChildElement +getFirstChildElementNS +GetFirstCodeBase +GetFirstEditChar +GetFirstIndent +GetFirstNode +GetFirstSelected +GetFixed +GetFixedTheta +GetFixupInstanceNames +GetFixupReferenceNames +GetFlags +GetFloating +GetFloatingDockSiteClass +GetFloatProp +GetFloatReturn +GetFloatValue +GetFloatValueAt +GetFMTBcd +GetFocus +GetFocused +GetFolder +GetFont +GetFontData +GetFontLanguageInfo +GetFontName +GetFonts +GetFontSize +GetFontUnicodeRanges +GetForceCutCopyEnabled +GetForegroundWindow +GetForm +GetFormA +GetFormat +GetFormatCount +GetFormatRec +GetFormats +GetFormatSettings +GetFormBounds +GetFormChoice +GetFormComponent +GetFormCount +GetFormDesigner +GetFormImage +GetFormInterface +GetFormMethodName +GetFormModuleInterface +GetFormName +GetFormResource +GetFormText +GetFormW +GetForwardCount +GetForwardItem +GetFound +GetFractionalDigits +GetFrameInfo +GetFrameWidth +GetFreeSpace +getFrenchErrorStr +getFrequency +GetFromCursor +GetFromDataFactory +GetFromProperty +GetFTime +GetFullName +GetFullNameStr +GetFullPath +GetFullPathName +GetFullPathNameA +GetFullPathNameW +GetFuncCustData +GetFuncDesc +GetFuncIndexOfMemId +GetFuncResultInfo +GetGalleryCategory +getGermanErrorStr +GetGetSocketEvent +GetGetThreadEvent +GetGlassFrame +GetGlyph +GetGlyphIndices +GetGlyphIndicesA +GetGlyphIndicesW +GetGlyphOutline +GetGlyphOutlineA +GetGlyphOutlineW +GetGOT +GetGraphicsMode +GetGrid +GetGridHeight +GetGridPanel +GetGridWidth +GetGroup +GetGroupIndex +GetGroupName +GetGroupRef +GetGroupState +GetGroupUndo +GetGUID +GetGuideHRC +GetGuiResources +GetGUIThreadInfo +GetGValue +GetHandle +GetHandleInformation +GetHasAppServer +GetHasAssemblyReferences +GetHasChildNodes +GetHasConstraints +GetHasErrors +GetHashCode +GetHasItems +GetHasSymbols +GetHeader +GetHeaderValue +GetHeapBlocks +GetHeapStatus +GetHeight +GetHelpContext +GetHelpFile +GetHelpFileName +GetHelpInfo +GetHelpName +GetHelpPath +GetHelpStrings +GetHelpSystem +GetHelpUrl +GetHGlobalFromILockBytes +GetHGlobalFromStream +GetHiddenCount +GetHighLightColor +GetHighlightCurrentLine +GetHighlighter +GetHighlighterCount +GetHint +GetHintControl +GetHints +GetHintShortCuts +GetHintText +GetHistoryStyle +GetHitTestInfoAt +gethostbyaddr +gethostbyname +GetHostedNodes +gethostname +GetHostNode +GetHotKey +GetHotSpot +GetHotspotsHRCRESULT +GetHoverTime +GetHRECFromHRC +getHref +GetICMProfile +GetICMProfileA +GetICMProfileW +GetIComponent +GetIcon +GetIconHandle +GetIconic +GetIconInfo +GetIconLocation +GetIconMetaPict +GetIconOf +GetID +GetIdent +GetIdentityString +GetIDEOptions +GetIDispatchProp +GetIdleThreads +GetIDList +GetIDsOfNames +GetIDString +GetIdx +GetIgnoreException +GetImageBitmap +GetImageConfigInformation +GetImageHandle +GetImageIndex +GetImageList +GetImages +GetImageSize +GetImageUnusedHeaderBytes +GetImeMode +GetImeName +GetImes +GetImplFileName +GetImplTypeCustData +GetImplTypeFlags +GetImportedNamespaces +GetImportTranslator +GetInch +GetIndent +GetIndex +GetIndexBased +GetIndexDef +GetIndexDefs +GetIndexDescs +GetIndexField +GetIndexFieldCount +GetIndexFieldNames +GetIndexForFields +GetIndexForOrderBy +GetIndexForPage +GetIndexInfo +GetIndexName +GetIndexNames +GetIndexOfFirstCategory +GetIndexParams +GetInfoFlags +GetInfoTip +GetInitialDate +GetInitializationString +GetInksetInterval +GetInksetIntervalCount +GetInPlaceSite +GetInputState +GetInsertMode +GetInstance +GetInstRes +GetInt64Prop +GetInt64Value +GetInt64ValueAt +GetIntegerProp +GetInterceptGUID +GetInterceptorList +GetInterface +GetInterfaceEntry +GetInterfaceFromGlobal +GetInterfaceProp +GetInterfaceSafetyOptions +GetInterfaceTable +GetInterfaceTypeInfo +getInternalSubset +GetInternationalHRC +GetInterpreter +GetIntfEntry +GetIntfFileName +GetIntfName +GetIntfValue +GetIntfValueAt +GetIntProp +GetInTransaction +GetIntVec +GetInvalidBreakpointLine +GetInvalidCharacterException +GetInvokeKind +GetIPersistent +GetIsBlank +GetIsClone +GetIsComponent +GetIsControl +GetIsDefault +GetIsDirty +GetIsDormant +GetIsIndexField +getIsInternalEntity +GetIsModified +GetIsNested +GetIsNull +GetIsolationLevel +GetIsPanning +GetIsPaused +GetIsPlaying +GetIsReadOnly +GetIsRecording +GetIsSpecialCharacter +GetIsTextElement +GetIStream +GetIStreamAdapter +getIsUnusable +GetIsValid +GetIsWhitespace +getIsWhitespaceInElementContent +GetIsWordCharacter +getItalianErrorStr +GetItem +GetItemAt +GetItemAttr +GetItemByDispID +GetItemCaption +GetItemClass +GetItemCount +GetItemData +GetItemEnabled +GetItemHeight +GetItemHt +GetItemIndex +GetItemName +GetItemNames +GetItemObject +GetItemPath +GetItemProp +GetItems +GetItemsClass +GetItemType +GetIUnknownProp +GetJob +GetJobA +GetJobW +GetKBCodePage +GetKeepTrailingBlanks +GetKernelObjectSecurity +GetKerningPairs +GetKey +GetKeyBindingRec +GetKeyboardLayout +GetKeyboardLayoutList +GetKeyboardLayoutName +GetKeyboardLayoutNameA +GetKeyboardLayoutNameW +GetKeyboardServices +GetKeyboardState +GetKeyboardType +GetKeyBuffer +GetKeyData +GetKeyExclusive +GetKeyFieldCount +GetKeyFieldName +GetKeyFields +GetKeyIndex +GetKeyInfo +GetKeyNames +GetKeyNameText +GetKeyNameTextA +GetKeyNameTextW +GetKeysProcessed +GetKeyState +GetKeyTracing +GetKeywords +GetKeywordsCount +GetKind +GetKValue +GetLabelCount +GetLabels +GetLabelText +GetLanguage +GetLanguageCode +GetLanguageDriverName +GetLargeButtons +GetLargestConsoleWindowSize +GetLastActivePopup +GetLastChild +getLastChildElement +getLastChildElementNS +GetLastChildZone +GetLastEditChar +GetLastEditColumn +GetLastEditRow +GetLastError +GetLastIndex +GetLastInputInfo +GetLastRow +GetLastUpdate +GetLastVisibleData +GetLCID +GetLeft +GetLeftColumn +GetLeftGutterWidth +GetLeftIndent +GetLength +GetLengthSid +GetLevel +GetLibAttr +GetLibStatistics +GetLicenseString +GetLicInfo +GetLine +GetLineBreak +GetLineNum +GetLineNumber +GetLineOffset +GetLinePos +GetLines +GetLinesControl +GetLinesInBuffer +GetLineSize +GetLineText +GetLinked +GetLinkedActionLists +GetLinkSource +GetLinkUpdateOptions +GetList +GetListBoxInfo +GetListItem +GetListSource +GetListView +GetLiteralInfo +getLiteralValue +GetLoadFromFileName +GetLocalAddress +GetLocalApplicationDataDirectory +GetLocaleChar +GetLocaleFormatSettings +GetLocaleID +GetLocaleInfo +GetLocaleInfoA +GetLocaleInfoW +GetLocaleStr +GetLocalHost +GetLocalName +GetLocalPort +GetLocalTime +GetLocationString +GetLockType +GetLogChanges +GetLogColorSpace +GetLogColorSpaceA +GetLogColorSpaceW +GetLogFileName +GetLogicalDrives +GetLogicalDriveStrings +GetLogicalDriveStringsA +GetLogicalDriveStringsW +GetLogMessage +GetLogRecord +GetLogRecordVariants +GetLogResult +GetLongestItem +GetLongName +GetLongStrProp +GetLookup +GetLookupCursor +GetLookupDataset +GetLookupDisplay +GetLookupField +GetLookupFields +GetLookupInfo +GetLookupKeyFields +GetLookupList +GetLookupResultField +GetLookupSource +GetMailslotInfo +GetMainForm +GetMainFormHandle +GetMainFormOnTaskBar +GetMainMenu +GetMainProjectGroup +GetManualCompleteKey +GetMapMode +GetMappedFileName +GetMappedFileNameA +GetMappedFileNameW +GetMappedIndex +GetMappingNames +GetMarkedBlocks +GetMarshalOptions +GetMarshalSizeMax +GetMask +GetMaskBitmap +GetMasked +GetMasterFields +GetMax +GetMaxChars +GetMaxDisplayWidth +GetMaxExclusive +GetMaxInclusive +GetMaxLength +GetMaxOccurs +GetMaxRecords +GetMaxResultsHRC +GetMDIChildCount +GetMDIChildren +getMedia +GetMemberName +GetMemberProperties +GetMembers +GetMemberships +GetMemberTypes +GetMemory +GetMemoryManager +GetMemoryManagerState +GetMemoryMap +GetMemoryStream +GetMenu +GetMenuActive +GetMenuBarInfo +GetMenuCheckMarkDimensions +GetMenuContextHelpId +GetMenuDefaultItem +GetMenuIndex +GetMenuInfo +GetMenuItem +GetMenuItemCount +GetMenuItemID +GetMenuItemInfo +GetMenuItemInfoA +GetMenuItemInfoW +GetMenuItemRect +GetMenuItems +GetMenuSize +GetMenuState +GetMenuString +GetMenuStringA +GetMenuStringW +GetMenuText +GetMessage +GetMessageA +GetMessageExtraInfo +GetMessageGroup +GetMessageGroupCount +GetMessageGroupName +GetMessagePos +GetMessageTime +GetMessageW +GetMetaData +GetMetaFile +GetMetaFileA +GetMetaFileBitsEx +GetMetaFileW +GetMetaRgn +GetMethodInfo +GetMethodKind +GetMethodName +GetMethodProp +GetMethods +GetMethodValue +GetMethodValueAt +GetMetricSettings +GetMIDASAppServerList +GetMin +GetMinExclusive +GetMinHeight +GetMinimumBlockAlignment +GetMinInclusive +GetMinLength +GetMinOccurs +GetMiscStatus +GetMiterLimit +GetMixed +GetMMHeight +GetMMWidth +GetMode +GetModified +GetModifiedState +GetModifyTime +GetModule +GetModuleBaseName +GetModuleBaseNameA +GetModuleBaseNameW +GetModuleCount +GetModuleEntryPoint +GetModuleEntryPointAddress +GetModuleEntryPointCount +GetModuleFileCount +GetModuleFileEditor +GetModuleFileName +GetModuleFileNameA +GetModuleFileNameEx +GetModuleFileNameExA +GetModuleFileNameExW +GetModuleFileNameW +GetModuleHandle +GetModuleHandleA +GetModuleHandleW +GetModuleInformation +GetModuleInterface +GetModuleName +GetModules +GetModuleType +GetMoniker +GetMonitor +GetMonitorCount +GetMonitors +GetMops +GetMouseHoverItem +GetMouseMovePoints +GetMSAttribute +GetMSCharacterData +GetMSDocument +GetMSDocumentType +GetMSElement +GetMSEntity +GetMSNode +GetMSNotation +GetMSProcessingInstruction +GetMultiLine +GetMultipleComponentsInfo +GetMultipleTrustee +GetMultipleTrusteeA +GetMultipleTrusteeOperation +GetMultipleTrusteeOperationA +GetMultipleTrusteeOperationW +GetMultipleTrusteeW +GetMultiSelect +GetMValue +GetMyTransactionVote +GetName +getNamedIndex +getNamedItem +getNamedItemNS +GetNamedPipeHandleState +GetNamedPipeHandleStateA +GetNamedPipeHandleStateW +GetNamedPipeInfo +GetNamedSecurityInfo +GetNamedSecurityInfoA +GetNamedSecurityInfoW +GetNameFromLCID +GetNameFromLocaleID +getNameOfFirstTag +GetNamePath +GetNames +getNamespaceAware +GetNamespaceCount +GetNameSpaceParent +GetNamespaceURI +GetNameValueSeparator +GetNameW +GetNearestColor +GetNearestItem +GetNearestPaletteIndex +GetNestedDataSet +GetNestedDataSets +GetNetFileDir +GetNewModuleAndClassName +GetNewModuleName +GetNewValue +GetNext +GetNextBindingRec +GetNextButton +GetNextButtonInGroup +GetNextByte +GetNextChild +GetNextCodeBase +GetNextComputer +GetNextDispID +GetNextDlgGroupItem +GetNextDlgTabItem +GetNextEditChar +GetNextItem +GetNextLink +GetNextName +GetNextPacket +GetNextRecord +GetNextRecords +GetNextRows +GetNextSelected +getNextSibling +getNextSiblingElement +getNextSiblingElementNS +GetNextVisible +getNextWideChar +getNextWideChar2 +GetNextWindow +GetNode +GetNodeAt +GetNodeAtIndex +GetNodeDisplayWidth +GetNodeFromIndex +GetNodeFromItem +GetNodeIndentStr +GetNodeName +GetNodeObject +GetNodeType +GetNodeValue +GetNonToolWindowPopupParent +getNormalizedValue +GetNotation +GetNotationDefs +getNotationName +getNotations +GetNotifier +GetNotifierCount +GetNotifyTarget +GetNTControlsAccepted +GetNTDependencies +GetNTErrorSeverity +GetNTServiceType +GetNTStartType +GetNumberFormat +GetNumberFormatA +GetNumberFormatW +GetNumbering +GetNumberOfConsoleInputEvents +GetNumberOfConsoleMouseButtons +GetNumberOfEventLogRecords +GetNumCopies +GetNumeric +GetNumericScale +GetNumGlyphs +GetObject +GetObjectA +GetObjectAccessRights +GetObjectContext +GetObjectDataSize +GetObjectDescriptor +GetObjectDispatch +GetObjectInfo +GetObjectName +GetObjectNames +GetObjectOwner +GetObjectParam +GetObjectProp +GetObjectPropClass +GetObjectProperty +GetObjects +GetObjectStorage +GetObjectType +GetObjectTypeNames +GetObjectTypes +GetObjectVerbs +GetObjectW +GetOEMCP +GetOffset +GetOldestEventLogRecord +GetOldRecord +GetOldValue +GetOle2AcceleratorTable +GetOleBoolProp +GetOleClassName +GetOleDateProp +GetOleEnumProp +GetOleObject +GetOleObjectClassRec +GetOleThreadWindow +GetOleVariantProp +GetOnClick +GetOnClientError +GetOnClientEvent +GetOnDrawPanel +GetOnDrawSection +GetOnSectionClick +GetOnSectionResize +GetOnSectionTrack +GetOnStringsChange +GetOnStringsChanging +GetOnThreadEnd +GetOnThreadStart +GetOpenClipboardWindow +GetOpenFileName +GetOpenFileNameA +GetOpenFileNameW +GetOptionalParam +GetOptionFileName +GetOptionName +GetOptionNames +GetOptions +GetOptionsIDString +GetOptionsIndex +GetOptionsName +GetOptionsObject +GetOptionValue +GetOptParameter +GetOrdered +GetOrdProp +GetOrdValue +GetOrdValueAt +GetOrientation +GetOriginalBuffer +GetOriginalCallerName +GetOriginalCallerSID +GetOriginalCreatorName +GetOriginalCreatorSID +GetOriginalData +GetOSProcessId +GetOSThreadID +GetOTAThreadContext +GetOTAXMMRegisters +GetOutlineTextMetrics +GetOutlineTextMetricsA +GetOutlineTextMetricsW +GetOverlappedResult +GetOverlayIconIndex +GetOverlayIndex +GetOverlayInfo +GetOverwriteBlocks +GetOverwriteFileName +GetOverwriteFileNameCount +GetOwner +GetOwnerCount +GetOwnerDocument +getOwnerElement +GetOwnerModule +GetOwnerModuleCount +getOwnerNode +GetOwnerWindow +GetOwningCollection +GetOwningProcess +GetOXNode +GetPackageCount +GetPackageDescription +GetPackageInfo +GetPackageModuleHandle +GetPackageName +GetPacketInterceptorList +GetPage +GetPageContainer +GetPageCount +GetPageFromDockClient +GetPageHeight +GetPageIndex +GetPageInfo +GetPages +GetPageWidth +GetPalette +GetPaletteEntries +GetPaletteItem +GetPaletteState +GetPanelBounds +GetPanelClass +GetPanInterval +GetPanOptions +GetParam +GetParamCheck +GetParamCollection +GetParamCount +GetParamCustData +GetParamData +GetParamDataSize +GetParamDelimiter +GetParameter +GetParameterDirection +GetParameterInfo +GetParameterList +GetParameterQuery +GetParameters +GetParamFlags +GetParamList +GetParamName +GetParams +GetParamsCount +GetParamStr +GetParamType +GetParamValue +GetParent +GetParentBackground +GetParentColumn +GetParentComponent +GetParentDef +getParentElement +getParentElementNS +GetParentForm +GetParentFormState +GetParentHandle +GetParentItem +GetParentMenu +GetParentNode +GetParentNodeAtLevel +getParentStyleSheet +GetParmCount +GetParmHint +GetParmName +GetParmPos +GetParseOptions +GetPassCount +GetPassword +GetPasteLinkInfo +GetPath +GetPathAndBaseExeName +GetPattern +GetPChar +getpeername +getPEFromCurrentCMObject +GetPenAppFlags +GetPenAsyncState +GetPenDataAttributes +GetPenDataInfo +GetPendingRows +GetPenInput +GetPenMiscInfo +GetPenPos +GetPermissions +GetPersistent +GetPersistentBlocks +GetPersonality +GetPersonalityHelpTrait +GetPickList +GetPicture +getPieceAtPos +GetPinnedWindow +GetPinRect +GetPitch +GetPixel +GetPixelFormat +GetPixelsPerInch +GetPlainText +GetPoints +GetPointsCount +GetPointsFromPenData +GetPolicy +getPolishErrorStr +GetPolyFillMode +GetPopupChildren +GetPopupClass +GetPopupMenu +GetPopupMenuClass +GetPopupOwnerWindows +GetPortForComputer +GetPos +GetPosition +GetPrecision +GetPrecisionMode +GetPredefinedStrings +GetPredefinedValue +GetPrefix +GetPrefixedName +GetPrepared +GetPreserveLineEnds +GetPrev +GetPrevChild +getPreviousSibling +getPreviousSiblingElement +getPreviousSiblingElementNS +getPrevSibling +GetPrevVisible +GetPrimary +GetPrimaryMonitor +GetPrimaryVerb +GetPrinter +GetPrinterA +GetPrinterData +GetPrinterDataA +GetPrinterDataW +GetPrinterDriver +GetPrinterDriverA +GetPrinterDriverDirectory +GetPrinterDriverDirectoryA +GetPrinterDriverDirectoryW +GetPrinterDriverW +GetPrinterIndex +GetPrinters +GetPrinterW +GetPrintProcessorDirectory +GetPrintProcessorDirectoryA +GetPrintProcessorDirectoryW +GetPriorEditChar +GetPriorItem +GetPriority +GetPriorityClass +GetPriorityClipboardFormat +GetPriorRecord +GetPriorRecords +GetPrivateDir +GetPrivateDirectory +GetPrivateObjectSecurity +GetPrivateProfileInt +GetPrivateProfileIntA +GetPrivateProfileIntW +GetPrivateProfileSection +GetPrivateProfileSectionA +GetPrivateProfileSectionNames +GetPrivateProfileSectionNamesA +GetPrivateProfileSectionNamesW +GetPrivateProfileSectionW +GetPrivateProfileString +GetPrivateProfileStringA +GetPrivateProfileStringW +GetPrivateProfileStruct +GetPrivateProfileStructA +GetPrivateProfileStructW +GetProcAddress +GetProcDispatchFlags +GetProcedureCount +GetProcedureNames +GetProcedureParamsText +GetProcess +GetProcessAffinityMask +GetProcessCount +GetProcessHeap +GetProcessHeaps +GetProcessID +GetProcessingInstruction +GetProcessMemoryInfo +GetProcessModule +GetProcessModuleCount +GetProcessPriorityBoost +GetProcessShutdownParameters +GetProcessState +GetProcessTimes +GetProcessVersion +GetProcessWindowStation +GetProcessWorkingSetSize +GetProductIdentifier +GetProductKey +GetProfileInt +GetProfileIntA +GetProfileIntW +GetProfileSection +GetProfileSectionA +GetProfileSectionW +GetProfileString +GetProfileStringA +GetProfileStringW +GetProgID +GetProject +GetProjectBuilder +GetProjectCount +GetProjectDependencies +GetProjectGUID +GetProjectModules +GetProjectName +GetProjectOptions +GetProjectPersonality +GetProjectResource +GetProjectStorageNode +GetPrologNode +GetPrologValue +GetPromptOnReplace +GetProp +GetPropA +GetPropCount +GetPropDisplayString +GetPropDisplayStrings +GetProperties +GetProperty +GetPropertyDescriptionList +GetPropertyInfo +GetPropertyStore +GetPropInfo +GetPropInfos +GetPropList +GetPropName +GetProps +GetPropType +GetPropTypeByName +GetPropValue +GetPropValueByName +GetPropW +GetProtected +getprotobyname +getprotobynumber +GetProvider +GetProviderCount +GetProviderEOF +GetProviderNames +GetPublicID +GetPushed +GetPWChar +getQualifiedItem +GetQuery +GetQueryCursor +GetQueryParamCount +GetQueryParamHasDefaultVal +GetQueryParamInvokeTypeText +GetQueryParamSymText +GetQueryParamTypeText +GetQueryRetVal +GetQueuedCompletionStatus +GetQueueStatus +GetQuoteChar +GetQuotedTableName +GetRadioItem +GetRadius +GetRangeRowset +GetRasterizerCaps +GetReadOnly +GetRealParentForm +GetRealScrollPosition +GetReason +GetRecNo +GetRecord +GetRecordAttribute +GetRecordBlock +GetRecordCount +GetRecordForKey +GetRecordNumber +GetRecords +GetRecordset +GetRecordsetState +GetRecordSize +GetRecordStatus +GetRecreateChildren +GetRect +GetRef +GetReference +GetReferencedRowset +GetReferences +GetReferencesCount +GetReferent +getRefersToPredefinedEntity +GetRefItem +GetRefName +GetRefTypeInfo +GetRefTypeOfImplType +GetRegionData +GetRegions +GetRegKey +GetRegStringValue +GetRegularExpression +GetRemoteAddr +GetRemoteAddress +GetRemoteHost +GetRemotePort +GetRemoteServer +GetReplaceAll +GetReplaceDialog +GetReplaceOptions +GetReplaceText +GetRequest +GetRequired +getResolvedValue +GetResource +GetResourceCache +GetResourceName +GetResourceType +GetResponse +getResponseHeader +GetRestrictionNode +GetResult +GetResults +GetResultsHRC +GetResultType +GetRGBColor +GetRgnBox +GetRight +GetRightColumn +GetRightIndent +GetRightMargin +GetRightSide +GetRoot +GetRootClassName +GetRootComponent +GetRootDirectory +getRootName +GetRootSprig +GetRootStructureNode +GetROP2 +GetRoundMode +GetRow +GetRowCount +GetRowHeight +GetRowHeights +GetRowOfNode +GetRowPosition +GetRowRequestPacket +GetRows +GetRowsAffected +GetRowsAt +GetRowsAtRatio +GetRowsByBookmark +GetRowset +GetRowSpanIndex +GetRowStatus +GetRunningClass +GetRunningObjectTable +GetRuntimeClassID +GetRuntimeMiscStatusFlags +GetRuntimeText +GetRValue +GetSafeCallExceptionAddr +GetSafeCallExceptionMsg +GetSampleSearchText +GetSampleText +GetSaveDialog +GetSaveFileName +GetSaveFileNameA +GetSaveFileNameW +GetSavePoint +GetScaled +GetSchemaDef +GetSchemaDoc +GetSchemaDocRef +GetSchemaImports +GetSchemaIncludes +GetSchemaItem +GetSchemaLocation +GetSchemaRef +GetScopeKind +GetScript +GetScriptCount +GetScriptingContext +GetScriptLanguage +GetScripts +GetScrollBarInfo +GetScrollBtnClass +GetScrollBuffer +GetScrollInfo +GetScrollOffset +GetScrollPos +GetScrollRange +GetScrollRanges +GetScrollWidth +GetSearchErrorString +GetSearchOptions +GetSearchString +GetSearchText +GetSecondaryShortCuts +GetSecurityCallContext +GetSecurityDescriptorControl +GetSecurityDescriptorDacl +GetSecurityDescriptorGroup +GetSecurityDescriptorLength +GetSecurityDescriptorOwner +GetSecurityDescriptorSacl +GetSecurityId +GetSecurityInfo +GetSecuritySite +GetSel +GetSelComponent +GetSelCount +GetSelected +GetSelectedControlItem +GetSelectedCount +GetSelectedField +GetSelectedIndex +GetSelectedItem +GetSelectedItems +GetSelectedSocket +GetSelectedTool +GetSelectedType +GetSelection +GetSelectionCount +GetSelectionEditors +GetSelections +GetSelLength +GetSelStart +GetSelText +GetSelTextBuf +GetSeparator +GetSequenceNumber +getservbyname +getservbyport +GetServer +GetServerCLSID +GetServerConv +GetServerData +GetServerFileName +GetServerGUID +GetServerKey +GetServerList +GetServerName +GetServerThread +GetServerType +GetServiceController +GetServiceCount +GetServiceDisplayName +GetServiceDisplayNameA +GetServiceDisplayNameW +GetServiceKeyName +GetServiceKeyNameA +GetServiceKeyNameW +GetSession +GetSessionByName +GetSessionNames +GetSetElementName +GetSetElementValue +GetSetProp +GetShadow +GetShadowColor +GetShellModule +GetShiftState +GetShortCut +GetShortCuts +GetShortIntProp +GetShortName +GetShortNameStr +GetShortPathName +GetShortPathNameA +GetShortPathNameW +GetShortStrProp +GetShortStrPropAsLongStr +GetShouldBuild +GetShowCaption +GetShowCmd +GetShowDescriptionPane +GetShowForm +GetShowHotCommands +GetShowing +GetShowLineBreaks +GetShowShortCut +GetShowSource +GetShowSpace +GetShowTab +GetSidIdentifierAuthority +GetSidLengthRequired +GetSidSubAuthority +GetSidSubAuthorityCount +GetSignature +GetSimpleCallHeader +GetSimpleTypeNode +GetSimpleTypes +GetSingleProp +GetSite +GetSiteInfo +GetSize +GetSizeMax +GetSizeStyleString +GetSmallintProp +GetSmartTab +getsockname +getsockopt +GetSoftwareUpdateInfo +GetSort +GetSortOrder +GetSortType +GetSource +GetSourceBkpt +GetSourceBkptCount +GetSourceDisplayName +GetSourceDoc +GetSourceIsDebuggable +GetSourceLines +GetSourceMoniker +GetSourcesRowset +getSpanishErrorStr +GetSpecialName +GetSpecification +getSpecified +GetSpeedSetting +GetSpeedSettingCount +GetSprig +GetSprigDesigner +GetSQL +GetSQLIndex +GetSQLInfo +GetSQLMemoControl +GetSQLMemoLinesText +GetSQLText +GetSQLTimeStampFromStringVariant +GetSQLToken +GetSrcText +GetSrvrConv +GetSrvrItem +GetStackFramesToLog +GetStackStatus +GetStandAlone +GetStart +GetStartingColumn +GetStartingRow +GetStartSuspended +GetStartupInfo +GetStartupInfoA +GetStartupInfoW +GetState +GetStateFieldValue +GetStateIndex +GetStatementHandle +GetStatementLocale +GetStates +GetStateString +GetStaticRect +GetStatus +GetStatusBar +GetStatusString +GetStatusText +GetStdHandle +GetStmtInfo +GetStockObject +GetStoredProcNames +GetStream +getStreamAsWideString +GetStreamMetaData +GetStretchBltMode +GetStrictDelimiter +GetStrictFormat +GetString +getStringLength +getStringPosition +GetStringProp +GetStringProperty +GetStringResult +GetStrings +GetStringTypeA +GetStringTypeEx +GetStringTypeExA +GetStringTypeExW +GetStringTypeW +GetStrokeAttributes +GetStrokeTableAttributes +GetStrProp +GetStructureContext +GetStructureControl +GetStructureType +GetStrValue +GetStrValueAt +GetStyle +GetStyleName +getStyleSheets +getStyleSheetType +GetSubCode +GetSubGroupState +GetSubItem +GetSubItemCount +GetSubItemImage +GetSubMenu +GetSubMenuControlClass +GetSubViewCount +GetSubViewIdentifier +GetSubViewIndex +GetSymbolClassText +GetSymbolCountHRCRESULT +GetSymbolDocumentation +GetSymbolFileName +GetSymbolIsAbstract +GetSymbolIsReadWrite +GetSymbolList +GetSymbolsHRCRESULT +GetSymbolText +GetSymbolTypeText +GetSyncMode +GetSyntaxHighlight +GetSyntaxHighlighter +GetSyntaxHighlightTypes +GetSysColor +GetSysColorBrush +GetSystemDefaultLangID +GetSystemDefaultLCID +GetSystemDirectory +GetSystemDirectoryA +GetSystemDirectoryW +GetSystemID +GetSystemInfo +GetSystemMenu +GetSystemMetrics +GetSystemPaletteEntries +GetSystemPaletteUse +GetSystemPowerStatus +GetSystemTime +GetSystemTimeAdjustment +GetSystemTimeAsFileTime +GetTab +GetTabbedTextExtent +GetTabbedTextExtentA +GetTabbedTextExtentW +GetTabCount +GetTabIndex +GetTableConstraint +GetTableDesc +GetTableDirect +GetTableLevel +GetTableNameFromQuery +GetTableNameFromSQL +GetTableNames +GetTableType +GetTableTypeName +GetTabName +GetTabOrder +GetTabOrderList +GetTabs +GetTabStops +GetTag +getTagName +GetTapeParameters +GetTapePosition +GetTapeStatus +getTarget +GetTargetAt +GetTargetName +GetTargetNamespace +GetTargetNSPrefix +GetTColorProp +GetTDateTimeProp +GetTempFileName +GetTempFileNameA +GetTempFileNameW +GetTemplate +GetTemplateCharSet +GetTemplateDirectory +GetTemplateFormat +GetTemplateType +GetTempPath +GetTempPathA +GetTempPathW +GetTerminated +GetText +GetTextAlign +GetTextBaseline +GetTextBuf +GetTextCharacterExtra +GetTextCharset +GetTextCharsetInfo +GetTextColor +getTextContent +GetTextExtentExPoint +GetTextExtentExPointA +GetTextExtentExPointI +GetTextExtentExPointW +GetTextExtentPoint +GetTextExtentPoint32 +GetTextExtentPoint32A +GetTextExtentPoint32W +GetTextExtentPointA +GetTextExtentPointI +GetTextExtentPointW +GetTextFace +GetTextFaceA +GetTextFaceW +GetTextHeight +GetTextItem +GetTextLen +GetTextMargins +GetTextMetrics +GetTextMetricsA +GetTextMetricsW +GetTextStart +GetTextStr +GetTextWStr +GetTFontProp +GetTheme +GetThemesEnabled +GetTheta +GetThisModuleHandle +GetThread +GetThreadAffinity +GetThreadCacheSize +GetThreadContext +GetThreadCount +GetThreadDesktop +GetThreadLocale +GetThreadPriority +GetThreadPriorityBoost +GetThreadSelectorEntry +GetThreadTimes +GetThumbLength +GetTickCount +GetTime +GetTimeFormat +GetTimeFormatA +GetTimeFormatW +GetTimeOfLastChange +GetTimer +GetTimerCount +GetTimestampForLoadedLibrary +GetTimeZoneInformation +GetTipUrl +GetTitle +GetTitleBarInfo +GetTokenInformation +GetTOleEnumProp +GetToolBar +GetToolTip +GetTop +GetTopBuffer +GetTopIndex +GetTopItem +GetTopMostWindows +GetTopParentHandle +GetTopPos +GetTopRow +GetTopView +GetTopWindow +GetTotalDigits +GetTPictureProp +GetTraceFlags +GetTrackLength +GetTrackPosition +GetTracks +GetTransaction +GetTransactionId +GetTransactionInfo +GetTransactionObject +GetTranslatorDescription +GetTransparent +GetTree +GetTreeView +GetTrimmedEventName +GetTrusteeForm +GetTrusteeFormA +GetTrusteeFormW +GetTrusteeName +GetTrusteeNameA +GetTrusteeNameW +GetTrusteeType +GetTrusteeTypeA +GetTrusteeTypeW +GetTStringsProperty +GetType +GetTypeAttr +GetTypeComp +GetTypeData +GetTypeFlags +GetTypeInfo +GetTypeInfoCount +GetTypeInfoOfGuid +GetTypeInfoType +GetTypeKind +GetTypeLib +GetTypeLibEditor +GetTypeLibName +GetTypeLibrary +GetTypeName +GetTypeSize +GetUIObjectOf +GetUltimateOwner +GetUndoAfterSave +GetUndoLimit +GetUnitCount +GetUnitName +GetUniversalName +GetUnmarshalClass +GetUnnamed +GetUnusedColor +GetUnwinder +GetUpdateCount +GetUpdated +GetUpdateOptions +GetUpdateRecordSet +GetUpdateRect +GetUpdateRgn +GetUpdatesPending +GetURL +GetUrlCacheEntryInfo +GetUrlCacheEntryInfoA +GetUrlCacheEntryInfoEx +GetUrlCacheEntryInfoExA +GetUrlCacheEntryInfoExW +GetUrlCacheEntryInfoW +GetUrlPolicyPermissions +GetUsage +GetUse +GetUseBriefCursorShapes +GetUseBriefRegularExpressions +GetUseDefaultTopic +GetUserClassID +GetUserDefaultLangID +GetUserDefaultLCID +GetUserName +GetUserNameA +GetUserNameW +GetUserObjectInformation +GetUserObjectInformationA +GetUserObjectInformationW +GetUserObjectSecurity +GetUserType +GetUseTabCharacter +GetUtilInterface +GetValidBreakpointLine +GetValidProjectDependencies +GetValue +GetValueAndMultiplyOrder +GetValueFromIndex +GetValueList +GetValueNames +GetValues +GetValueString +GetValueW +GetVarCustData +GetVarDataArrayInfo +GetVarDesc +GetVariantManager +GetVariantPointer +GetVariantProp +GetVariantStr +GetVariantType +GetVarIndexOfMemId +GetVarValue +GetVarValueAt +GetVCLFrameForm +GetVcsCount +GetVcsList +GetVcsName +GetVendors +GetVerb +GetVerbCount +GetVerify +GetVersion +GetVersionEx +GetVersionExA +GetVersionExW +GetVersionPenWin +GetView +GetViewCount +GetViewerName +GetViewerSymbolFlags +GetViewerVisibilityFlags +GetViewInfo +GetViewOrigin +GetViewportExtEx +GetViewportOrgEx +GetViewSize +GetViewStateStream +GetVisible +GetVisibleColCount +GetVisibleData +GetVisibleDockClientCount +GetVisibleNode +GetVisibleParent +GetVisibleRowCount +GetVisualValue +GetVolumeInformation +GetVolumeInformationA +GetVolumeInformationW +GetWaitEvent +GetWallpaper +GetWallpaperOptions +GetWasImported +GetWEventRef +GetWhitespace +GetWholeFile +GetWideActiveName +GetWideActiveValue +getWideChars +GetWideGroup +GetWideHint +GetWideItem +GetWideStringProp +GetWideStrProp +GetWideStrPropAsLongStr +GetWideStrValue +GetWideStrValueAt +GetWideText +GetWidth +GetWindow +GetWindowContext +GetWindowContextHelpId +GetWindowDC +GetWindowExtEx +GetWindowHandle +GetWindowInfo +GetWindowLong +GetWindowLongA +GetWindowLongW +GetWindowModuleFileName +GetWindowModuleFileNameA +GetWindowModuleFileNameW +GetWindowOrgEx +GetWindowPlacement +GetWindowRect +GetWindowRgn +GetWindowsDirectory +GetWindowsDirectoryA +GetWindowsDirectoryW +GetWindowState +GetWindowSubclass +GetWindowTask +GetWindowText +GetWindowTextA +GetWindowTextLength +GetWindowTextLengthA +GetWindowTextLengthW +GetWindowTextW +GetWindowThreadProcessId +GetWindowWord +GetWinMetaFileBits +GetWordBoolProp +GetWordBoundary +GetWordlistCoercionHRC +GetWordlistHRC +GetWordProp +GetWorkAreaHeight +GetWorkAreaLeft +GetWorkAreaRect +GetWorkAreaTop +GetWorkAreaWidth +GetWorkingDirectory +GetWorldTransform +GetWrapper +GetXML +GetXMLData +GetXMLDOMNode +getXmlHandler +GetXMLMode +GetXMLSchema +GetYValue +GetZoneActionPolicy +GetZoneActionPolicyEx +GetZoneAt +GetZoneAttributes +GetZoneCustomPolicy +GetZoneMappings +gg +Ghosted +GiveFeedback +glAccum +glAlphaFunc +glBegin +glBitmap +glBlendFunc +glCallList +glCallLists +glClear +glClearAccum +glClearColor +glClearDepth +glClearIndex +glClearStencil +glClipPlane +glColor +glColor3 +glColor3b +glColor3bv +glColor3d +glColor3dv +glColor3f +glColor3fv +glColor3i +glColor3iv +glColor3s +glColor3sv +glColor3ub +glColor3ubv +glColor3ui +glColor3uiv +glColor3us +glColor3usv +glColor4 +glColor4b +glColor4bv +glColor4d +glColor4dv +glColor4f +glColor4fv +glColor4i +glColor4iv +glColor4s +glColor4sv +glColor4ub +glColor4ubv +glColor4ui +glColor4uiv +glColor4us +glColor4usv +glColorMask +glColorMaterial +glCopyPixels +glCullFace +glDeleteLists +glDepthFunc +glDepthMask +glDepthRange +glDisable +glDrawBuffer +glDrawPixels +glEdgeFlag +glEdgeFlagv +glEnable +glEnd +glEndList +glEvalCoord +glEvalCoord1 +glEvalCoord1d +glEvalCoord1dv +glEvalCoord1f +glEvalCoord1fv +glEvalCoord2 +glEvalCoord2d +glEvalCoord2dv +glEvalCoord2f +glEvalCoord2fv +glEvalMesh +glEvalMesh1 +glEvalMesh2 +glEvalPoint +glEvalPoint1 +glEvalPoint2 +glFeedbackBuffer +glFinish +glFlush +glFog +glFogf +glFogfv +glFogi +glFogiv +glFrontFace +glFrustum +glGenLists +glGetBooleanv +glGetClipPlane +glGetDoublev +glGetError +glGetFloatv +glGetIntegerv +glGetLight +glGetLightfv +glGetLightiv +glGetMap +glGetMapdv +glGetMapfv +glGetMapiv +glGetMaterial +glGetMaterialfv +glGetMaterialiv +glGetPixelMap +glGetPixelMapfv +glGetPixelMapuiv +glGetPixelMapusv +glGetPolygonStipple +glGetString +glGetTexEnv +glGetTexEnvfv +glGetTexEnviv +glGetTexGen +glGetTexGendv +glGetTexGenfv +glGetTexGeniv +glGetTexImage +glGetTexLevelParameter +glGetTexLevelParameterfv +glGetTexLevelParameteriv +glGetTexParameter +glGetTexParameterfv +glGetTexParameteriv +glHint +glIndex +glIndexd +glIndexdv +glIndexf +glIndexfv +glIndexi +glIndexiv +glIndexMask +glIndexs +glIndexsv +glInitNames +glIsEnabled +glIsList +glLight +glLightf +glLightfv +glLighti +glLightiv +glLightModel +glLightModelf +glLightModelfv +glLightModeli +glLightModeliv +glLineStipple +glLineWidth +glListBase +glLoadIdentity +glLoadMatrix +glLoadMatrixd +glLoadMatrixf +glLoadName +glLogicOp +glMap +glMap1d +glMap1f +glMap2d +glMap2f +glMapGrid +glMapGrid1d +glMapGrid1f +glMapGrid2d +glMapGrid2f +glMaterial +glMaterialf +glMaterialfv +glMateriali +glMaterialiv +glMatrixMode +glMultMatrix +glMultMatrixd +glMultMatrixf +glNewList +glNormal +glNormal3 +glNormal3b +glNormal3bv +glNormal3d +glNormal3dv +glNormal3f +glNormal3fv +glNormal3i +glNormal3iv +glNormal3s +glNormal3sv +GlobalAddAtom +GlobalAddAtomA +GlobalAddAtomW +GlobalAlloc +GlobalAllocPtr +GlobalCollection +GlobalCompact +GlobalDeleteAtom +GlobalDiscard +GlobalFindAtom +GlobalFindAtomA +GlobalFindAtomW +GlobalFix +GlobalFixupReferences +GlobalFlags +GlobalFree +GlobalFreePtr +GlobalGetAtomName +GlobalGetAtomNameA +GlobalGetAtomNameW +GlobalHandle +GlobalLock +GlobalLRUNewest +GlobalLRUOldest +GlobalMemoryStatus +GlobalReAlloc +GlobalReAllocPtr +GlobalSize +GlobalUnfix +GlobalUnlock +GlobalUnWire +GlobalWire +glOrtho +glPassThrough +glPixelMap +glPixelMapfv +glPixelMapuiv +glPixelMapusv +glPixelStore +glPixelStoref +glPixelStorei +glPixelTransfer +glPixelTransferf +glPixelTransferi +glPixelZoom +glPointSize +glPolygonMode +glPolygonStipple +glPopAttrib +glPopMatrix +glPopName +glPushAttrib +glPushMatrix +glPushName +glRasterPos +glRasterPos2 +glRasterPos2d +glRasterPos2dv +glRasterPos2f +glRasterPos2fv +glRasterPos2i +glRasterPos2iv +glRasterPos2s +glRasterPos2sv +glRasterPos3 +glRasterPos3d +glRasterPos3dv +glRasterPos3f +glRasterPos3fv +glRasterPos3i +glRasterPos3iv +glRasterPos3s +glRasterPos3sv +glRasterPos4 +glRasterPos4d +glRasterPos4dv +glRasterPos4f +glRasterPos4fv +glRasterPos4i +glRasterPos4iv +glRasterPos4s +glRasterPos4sv +glReadBuffer +glReadPixels +glRect +glRectd +glRectdv +glRectf +glRectfv +glRecti +glRectiv +glRects +glRectsv +glRenderMode +glRotate +glRotated +glRotatef +glScale +glScaled +glScalef +glScissor +glSelectBuffer +glShadeModel +glStencilFunc +glStencilMask +glStencilOp +glTexCoord +glTexCoord1 +glTexCoord1d +glTexCoord1dv +glTexCoord1f +glTexCoord1fv +glTexCoord1i +glTexCoord1iv +glTexCoord1s +glTexCoord1sv +glTexCoord2 +glTexCoord2d +glTexCoord2dv +glTexCoord2f +glTexCoord2fv +glTexCoord2i +glTexCoord2iv +glTexCoord2s +glTexCoord2sv +glTexCoord3 +glTexCoord3d +glTexCoord3dv +glTexCoord3f +glTexCoord3fv +glTexCoord3i +glTexCoord3iv +glTexCoord3s +glTexCoord3sv +glTexCoord4 +glTexCoord4d +glTexCoord4dv +glTexCoord4f +glTexCoord4fv +glTexCoord4i +glTexCoord4iv +glTexCoord4s +glTexCoord4sv +glTexEnv +glTexEnvf +glTexEnvfv +glTexEnvi +glTexEnviv +glTexGen +glTexGend +glTexGendv +glTexGenf +glTexGenfv +glTexGeni +glTexGeniv +glTexImage1D +glTexImage2D +glTexParameter +glTexParameterf +glTexParameterfv +glTexParameteri +glTexParameteriv +glTranslate +glTranslated +glTranslatef +gluBeginCurve +gluBeginSurface +gluBeginTrim +gluBuild1DMipmaps +gluBuild2DMipmaps +gluCylinder +gluDeleteNurbsRenderer +gluDeleteQuadric +gluDeleteTess +gluDisk +gluEndCurve +gluEndSurface +gluEndTrim +gluErrorString +gluErrorUnicodeStringEXT +gluGetNurbsProperty +gluGetString +gluLoadSamplingMatrices +gluLookAt +gluNewNurbsRenderer +gluNewQuadric +gluNewTess +gluNurbsCallback +gluNurbsCurve +gluNurbsProperty +gluNurbsSurface +gluOrtho2D +gluPartialDisk +gluPerspective +gluPickMatrix +gluProject +gluPwlCurve +gluQuadricCallback +gluQuadricDrawStyle +gluQuadricNormals +gluQuadricOrientation +gluQuadricTexture +gluScaleImage +gluSphere +gluTessBeginContour +gluTessBeginPolygon +gluTessCallback +gluTessEndContour +gluTessEndPolygon +gluTessNormal +gluTessProperty +gluTessVertex +gluUnProject +glVertex +glVertex2 +glVertex2d +glVertex2dv +glVertex2f +glVertex2fv +glVertex2i +glVertex2iv +glVertex2s +glVertex2sv +glVertex3 +glVertex3d +glVertex3dv +glVertex3f +glVertex3fv +glVertex3i +glVertex3iv +glVertex3s +glVertex3sv +glVertex4 +glVertex4d +glVertex4dv +glVertex4f +glVertex4fv +glVertex4i +glVertex4iv +glVertex4s +glVertex4sv +glViewport +GlyphChanged +gnoring +GopherCreateLocator +GopherCreateLocatorA +GopherCreateLocatorW +GopherFindFirstFile +GopherFindFirstFileA +GopherFindFirstFileW +GopherGetAttribute +GopherGetAttributeA +GopherGetAttributeW +GopherGetLocatorType +GopherGetLocatorTypeA +GopherGetLocatorTypeW +GopherOpenFile +GopherOpenFileA +GopherOpenFileW +goto +GotoBookmark +GotoCurrent +GotoDefinition +GotoKey +GotoLine +GotoNearest +GotoSource +GotoXY +GPLInfected +GradientDrawButton +GradientDrawToolBar +GradientFill +GradientFillCanvas +GradToCycle +GradToDeg +GradToRad +Graphics +GraphUtil +GrayString +GrayStringA +GrayStringW +GridClick +GridRect +GridRectToScreenRect +Grids +Group +GroupDescendentsWith +GroupedWith +GroupWith +Grow +GuidelinesFor +GUIDToString +HandleActivation +HandleAddType +HandleAllocated +HandleConversionException +HandleCopy +HandleCreateException +HandleCut +HandleDelete +HandleError +HandleEvent +HandleException +HandleFreeNotify +HandleInComingCall +HandleMenuMsg +HandleMenuMsg2 +HandleMessage +HandleNeeded +HandlePaste +HandleRename +handles +HandleSafeCallException +HandleSelectAll +HandlesFile +HandleShortCut +HandlesStream +HandlesTarget +HandleUndo +HandleUpdateError +HandsOffStorage +has +HasAggs +HasAnnotation +HasAPicture +HasAppInfo +HasAsParent +HasAttribute +hasAttributeNS +HasBackground +HasChildDefs +HasChildNode +hasChildNodes +HasChildren +HasCoClasses +HasConstraints +HasCurValues +HasDocumentation +HasDropDownButton +hasEntRef +HasExtendCharacter +hasFeature +HasFocusIO +HasFormat +HasGlyph +Hash +HashData +HashIndex +HashOf +HasInstance +HasItems +HasLinkedActionLists +HasMachineLicense +HasMergeConflicts +HasObjects +HasParent +HasPickList +HasPopup +HasSelectedText +HasSubKeys +HasTransparentParts +HasUTF8BOM +HasVisibleItems +HasVisibleParent +HaveGraphic +HaveWrapper +Head +Header_ClearAllFilters +Header_ClearFilter +Header_CreateDragImage +Header_DeleteItem +Header_EditFilter +Header_GetBitmapMargin +Header_GetFocusedItem +Header_GetImageList +Header_GetItem +Header_GetItemA +Header_GetItemCount +Header_GetItemDropDownRect +Header_GetItemRect +Header_GetItemW +Header_GetOrderArray +Header_GetOverflowRect +Header_GetUnicodeFormat +Header_InsertItem +Header_InsertItemA +Header_InsertItemW +Header_Layout +Header_OrderToIndex +Header_SetBitmapMargin +Header_SetFilterChangeTimeout +Header_SetFocusedItem +Header_SetHotDivider +Header_SetImageList +Header_SetItem +Header_SetItemA +Header_SetItemW +Header_SetOrderArray +Header_SetUnicodeFormat +HeaderWndProc +HeapAddRef +HeapAlloc +HeapCompact +HeapCreate +HeapDestroy +HeapFree +HeapLock +HeapMinimize +HeapReAlloc +HeapRelease +HeapSize +HeapUnlock +HeapValidate +HeapWalk +Help +HelpBtnClick +HelpButtonClick +HelpClick +HelpCommand +HelpContext +HelpFile +HelpIntfs +HelpJump +HelpKeyword +HelpShowTableOfContents +HeuristicDecision +HexByte +HexChar +HexToBin +HexToBinary +HiByte +Hidden +Hide +HideCaret +HideCurrentDockClient +HideDragImage +HideEdit +HideEditor +HideHint +HideItem +HideShadow +HideUnusedItems +HideWindow +HideZone +HighlightCell +HighVideo +HiliteMenuItem +HIMAGELIST_QueryInterface +HimetricToPixels +Hint +HintGetMsgHook +HintMouseMessage +HintMouseThread +HintsChanged +HintShow +HintTimerExpired +HintTimerProc +HitTest +HitTest2 +HitTestPenData +HiWord +HlinkGoBack +HlinkGoForward +HlinkNavigateMoniker +HlinkNavigateString +HlinkSimpleNavigateToMoniker +HlinkSimpleNavigateToString +HoldClerk +HomeEndKeys +Hook +HookControlWndProc +HookExceptions +HookHintHooks +HookMainWindow +HookOSExceptions +HookSignal +HookSynchronizeWakeup +HotImageListChange +HotKeyToShortCut +HourOf +HourOfTheDay +HourOfTheMonth +HourOfTheWeek +HourOfTheYear +HoursBetween +HourSpan +HpcmFromWpLp +hreadFunc +HResult +HResultCode +HResultFacility +HResultFromNT +HResultFromWin32 +HResultSeverity +HSE_REQ_TRANSMIT_FILE +hSession +HTMLEncode +HtmlHelp +HtmlHelpA +HTMLHelpViewer +HtmlHelpW +htonl +htons +HtrgFromHwnd +http_dump822 +http_find_request +http_finish_request +http_handle_session +http_hdrs2env +http_parse_request +http_scan_headers +http_set_finfo +http_set_keepalive_timeout +http_start_response +http_status +http_uri2url +http_uri2url_dynamic +HttpAddRequestHeaders +HttpAddRequestHeadersA +HttpAddRequestHeadersW +HttpEndRequest +HttpEndRequestA +HttpEndRequestW +HttpExtensionProc +HTTPIntr +HttpOpenRequest +HttpOpenRequestA +HttpOpenRequestW +HttpQueryInfo +HttpQueryInfoA +HttpQueryInfoW +HttpSendRequest +HttpSendRequestA +HttpSendRequestEx +HttpSendRequestExA +HttpSendRequestExW +HttpSendRequestW +HueToRGB +HwndFromHtrg +HwndMSWheel +Hypot +iClientData +ICOMAdminCatalog_Connect +IComponentGuidelines +IconChanged +IconFontChanged +iconv +iconv_close +iconv_open +IdentToCursor +IdentToInt +idl +Idle +IdleTimerProc +idlParent +IE4Installed +ield +if +IfHotkeyAvailable +IfThen +IgnoreStream +IIDFromString +IInterface +IInterfaceComponentReference +ImageAddCertificate +ImageDirectoryEntryToData +ImageEnumerateCertificates +ImageGetCertificateData +ImageGetCertificateHeader +ImageGetDigestStream +ImageHlp +ImagehlpApiVersion +ImagehlpApiVersionEx +ImageList_Add +ImageList_AddIcon +ImageList_AddMasked +ImageList_BeginDrag +ImageList_Copy +ImageList_Create +ImageList_Destroy +ImageList_DragEnter +ImageList_DragLeave +ImageList_DragMove +ImageList_DragShowNolock +ImageList_Draw +ImageList_DrawEx +ImageList_DrawIndirect +ImageList_Duplicate +ImageList_EndDrag +ImageList_ExtractIcon +ImageList_GetBkColor +ImageList_GetDragImage +ImageList_GetIcon +ImageList_GetIconSize +ImageList_GetImageCount +ImageList_GetImageInfo +ImageList_LoadBitmap +ImageList_LoadBitmapA +ImageList_LoadBitmapW +ImageList_LoadImage +ImageList_LoadImageA +ImageList_LoadImageW +ImageList_Merge +ImageList_Read +ImageList_ReadEx +ImageList_Remove +ImageList_RemoveAll +ImageList_Replace +ImageList_ReplaceIcon +ImageList_SetBkColor +ImageList_SetDragCursorImage +ImageList_SetIconSize +ImageList_SetImageCount +ImageList_SetOverlayImage +ImageList_Write +ImageList_WriteEx +ImageListChange +ImageLoad +ImageNtHeader +ImagePaintBoxPaint +ImageRemoveCertificate +ImageRvaToSection +ImageRvaToVa +ImageUnload +Imc +ImgList +iml +Imm +Imm32GetCompositionString +Imm32GetContext +Imm32GetConversionStatus +Imm32IsIME +Imm32NotifyIME +Imm32ReleaseContext +Imm32SetCompositionFont +Imm32SetCompositionWindow +Imm32SetConversionStatus +Imm32SetOpenStatus +ImmAssociateContext +ImmConfigureIME +ImmConfigureIMEA +ImmConfigureIMEW +ImmCreateContext +ImmDestroyContext +ImmEnumRegisterWord +ImmEnumRegisterWordA +ImmEnumRegisterWordW +ImmEscape +ImmEscapeA +ImmEscapeW +ImmGetCandidateList +ImmGetCandidateListA +ImmGetCandidateListCount +ImmGetCandidateListCountA +ImmGetCandidateListCountW +ImmGetCandidateListW +ImmGetCandidateWindow +ImmGetCompositionFont +ImmGetCompositionFontA +ImmGetCompositionFontW +ImmGetCompositionString +ImmGetCompositionStringA +ImmGetCompositionStringW +ImmGetCompositionWindow +ImmGetContext +ImmGetConversionList +ImmGetConversionListA +ImmGetConversionListW +ImmGetConversionStatus +ImmGetDefaultIMEWnd +ImmGetDescription +ImmGetDescriptionA +ImmGetDescriptionW +ImmGetGuideLine +ImmGetGuideLineA +ImmGetGuideLineW +ImmGetIMEFileName +ImmGetIMEFileNameA +ImmGetIMEFileNameW +ImmGetOpenStatus +ImmGetProperty +ImmGetRegisterWordStyle +ImmGetRegisterWordStyleA +ImmGetRegisterWordStyleW +ImmGetStatusWindowPos +ImmGetVirtualKey +ImmInstallIME +ImmInstallIMEA +ImmInstallIMEW +ImmIsIME +ImmIsUIMessage +ImmIsUIMessageA +ImmIsUIMessageW +ImmNotifyIME +ImmRegisterWord +ImmRegisterWordA +ImmRegisterWordW +ImmReleaseContext +ImmSetCandidateWindow +ImmSetCompositionFont +ImmSetCompositionFontA +ImmSetCompositionFontW +ImmSetCompositionString +ImmSetCompositionStringA +ImmSetCompositionStringW +ImmSetCompositionWindow +ImmSetConversionStatus +ImmSetOpenStatus +ImmSetStatusWindowPos +ImmSimulateHotKey +ImmUnregisterWord +ImmUnregisterWordA +ImmUnregisterWordW +imouse +ImpersonateDdeClientWindow +ImpersonateLoggedOnUser +ImpersonateNamedPipeClient +ImpersonateSelf +implementation +ImportComponent +importNode +in +IncAMonth +IncBufSize +IncDay +IncHour +includeAsPE +IncludeIndexInCaption +includeInLiteral +IncludeItem +IncludeObject +Includes +IncludeTrailingBackslash +IncludeTrailingPathDelimiter +IncMilliSecond +IncMinute +IncMonth +IncrementalSearch +IncSecond +IncStrProp +IncWeek +IncYear +Indent +Index +IndexDefsStored +IndexFieldOfs +IndexListChange +IndexOf +IndexOfButtonAt +IndexOfData +IndexOfDockClient +IndexOfItem +IndexOfLine +IndexOfName +IndexOfObject +IndexOfProcessModule +IndexOfShortCut +IndexOfTabAt +IndexStr +IndexText +IndexToAction +IndexToOverlayMask +IndexToStateImageMask +Indoubt +indow +inet_addr +inet_ntoa +inflate +inflate_blocks +inflate_blocks_free +inflate_blocks_new +inflate_blocks_reset +inflate_codes +inflate_codes_free +inflate_codes_new +inflate_fast +inflate_flush +inflate_set_dictionary +inflate_trees_bits +inflate_trees_dynamic +inflate_trees_fixed +inflate_trees_free +inflateEnd +inflateInit_ +InflateRect +inflateReset +InfoMessage +InGroup +inherited +InheritsFrom +IniFiles +Init +Init_Sequential +InitAlphaBlending +InitAltRecBuffers +InitAnApi +InitApplication +InitAtomTable +InitAutomation +InitBinding +InitBitmap +InitBitmaps +InitBlockMarking +InitBufferPointers +InitButtons +InitCache +InitCharNextWFunc +InitComCtl +InitCommonControl +InitCommonControls +InitCommonControlsEx +InitComObj +InitComponentRes +InitComServer +InitConnection +InitControlData +InitControlInterface +InitControls +InitCtl3D +InitCursor +InitData +InitDBTables +InitDefaults +InitDelta +InitDesignNotification +initDoc +initDocNS +InitErrorPacket +InitFieldDefs +InitFieldDefsFromFields +InitFieldDescriptors +InitFieldProc +InitFields +InitFlatSB +InitFormat +InitFromData +InitFromResources +InitGlobals +InitHints +initialization +Initialize +InitializeAcl +InitializeBDE +InitializeBitmapInfoHeader +InitializeConflictBuffer +InitializeConnection +InitializeCriticalSection +InitializeCriticalSectionAndSpinCount +InitializeFlatSB +InitializeFromBitmap +InitializeFromWindow +InitializeMasterFields +InitializeMenu +InitializePackage +InitializeProcessForWsWatch +InitializeRecordset +InitializeSecurityDescriptor +InitializeSid +InitializeVarUtils +InitiateAction +InitiateActions +InitiateSystemShutdown +InitiateSystemShutdownA +InitiateSystemShutdownW +InitIMM32 +InitIndexDescriptors +InitInfoStruct +InitInheritedComponent +InitInstance +InitKeyBuffer +InitKeyFields +InitLibrary +InitMapi +InitMaskStates +InitMemoryManager +InitMenu +InitMenuItems +InitMenuLoop +InitMMHandle +InitMultiMonStubs +InitNew +InitObject +InitOleDBAccess +InitPara +InitParameters +InitParserAgent +InitParserLanguage +InitPopupMenu +InitProc +InitProcs +InitPutProcs +InitRecord +InitServerData +InitShlObj +InitSocket +InitStdConvs +InitTableSettings +InitThemeLibrary +InitThreadSynchronization +InitTreeData +InitUnits +InitUnwinder +InitURLMon +InitValChecks +inline +InMTSTransaction +inOpArray +inOpSet +InOutError +InPlaceDeactivate +InputBox +InputChar +InputOptionsClick +InputQuery +InputReqCallBack +InputRequest +InputString +InquireSignal +InRange +InSelection +InSendMessage +InSendMessageEx +Insert +InsertBefore +InsertBlock +InsertButton +InsertCharacter +insertChildrenContent +InsertCode +InsertCodeByShortcut +InsertCompilerOptions +InsertComponent +InsertControl +InsertCursor +insertData +InsertFile +InsertHotkeyFarEastFormat +InsertIcon +InsertImage +InsertInCollection +InsertItem +InsertLine +InsertMasked +InsertMenu +InsertMenuA +InsertMenuItem +InsertMenuItemA +InsertMenuItemW +InsertMenus +InsertMenusSB +InsertMenuW +insertMixedContent +InsertNewGUID +InsertNewLine +InsertNewLineAfter +InsertNewLineBefore +InsertNode +insertNotationOrEnumerationContent +InsertObject +InsertObjectDialog +InsertOK +InsertPage +InsertPenData +InsertPenDataPoints +InsertPenDataStroke +InsertRecord +InsertRow +InsertServerConv +InsertTab +InsertText +InsertWideCharacter +InsLine +InspectAtCursor +inst +InstallApplication +InstallComponent +InstallEventClass +Installing +InstallMultipleComponents +InstallMultipleEventClasses +InstallRecognizer +InstallService +Instance +InstanceSize +InstanceToVariant +Int +Int16ToBytes +Int32ToBytes +Int64Compare +Int64Op +Int64ToBytes +IntCompare +intDtdMemoryToDom +intDtdSourceCodeToDom +intDtdStreamToDom +intDtdStringToDom +intDtdWideStringToDom +Integer +IntegerExit +IntegerToBcd +InterceptIncoming +InterceptOutgoing +InterestPayment +InterestRate +interface +InterfaceConnect +InterfaceDerivesFrom +InterfaceDisconnect +InterfaceInheritsFrom +InterfaceSupportsErrorInfo +InterlockedCompareExchange +InterlockedDecrement +InterlockedExchange +InterlockedExchangeAdd +InterlockedIncrement +InternalAdd +InternalAddAlias +InternalAddChild +InternalAddRecord +InternalAnsiStrLComp +InternalApplyUpdates +InternalBeforeResolve +InternalButtonCount +InternalCancel +InternalCaptionHitTest +InternalClose +InternalCoWaitForMultipleHandles +InternalCreate +InternalCreateObject +InternalDecodeDate +InternalDelete +InternalDeleteAlias +InternalDoUpdate +InternalEdit +InternalExecute +InternalFetch +InternalFirst +InternalGetDesignerGuideOffset +InternalGetDIB +InternalGetDIBSizes +InternalGetGroupState +InternalGetInstRes +InternalGetItemData +InternalGetOptionalParam +InternalGetParams +InternalGetRecord +InternalGetRecords +InternalGotoBookmark +InternalHandleException +InternalInitFieldDefs +InternalInitRecord +InternalInsert +InternalLast +InternalLayout +InternalMove +InternalOpen +InternalPost +InternalRateOfReturn +InternalRefresh +InternalRemove +InternalRequery +InternalRestore +InternalRethinkHotkeys +InternalRethinkLines +InternalRowRequest +InternalSetItemData +InternalSetLocation +InternalSetMultiLine +InternalSetOptionalParam +InternalSetPrologValue +InternalSetSort +InternalSetToRecord +InternalShutDown +InternalUniqueString +InternalUpdateRecord +InternetAttemptConnect +InternetAuthNotifyCallback +InternetAutodial +InternetAutodialHangup +InternetCanonicalizeUrl +InternetCanonicalizeUrlA +InternetCanonicalizeUrlW +InternetCheckConnection +InternetCheckConnectionA +InternetCheckConnectionW +InternetCloseHandle +InternetCombineUrl +InternetCombineUrlA +InternetCombineUrlW +InternetConfirmZoneCrossing +InternetConnect +InternetConnectA +InternetConnectW +InternetCrackUrl +InternetCrackUrlA +InternetCrackUrlW +InternetCreateUrl +InternetCreateUrlA +InternetCreateUrlW +InternetDial +InternetErrorDlg +InternetFindNextFile +InternetFindNextFileA +InternetFindNextFileW +InternetGetConnectedState +InternetGetCookie +InternetGetCookieA +InternetGetCookieW +InternetGetLastResponseInfo +InternetGetLastResponseInfoA +InternetGetLastResponseInfoW +InternetGoOnline +InternetHangUp +InternetLockRequestFile +InternetOpen +InternetOpenA +InternetOpenUrl +InternetOpenUrlA +InternetOpenUrlW +InternetOpenW +InternetQueryDataAvailable +InternetQueryOption +InternetQueryOptionA +InternetQueryOptionW +InternetReadFile +InternetReadFileEx +InternetReadFileExA +InternetReadFileExW +InternetSetCookie +InternetSetCookieA +InternetSetCookieW +InternetSetDialState +InternetSetFilePointer +InternetSetOption +InternetSetOptionA +InternetSetOptionEx +InternetSetOptionExA +InternetSetOptionExW +InternetSetOptionW +InternetSetStatusCallback +InternetTimeFromSystemTime +InternetUnlockRequestFile +InternetWriteFile +InterpretData +InterpreterAction +Intersect +IntersectClipRect +IntersectRect +IntersectsControl +IntfGetComponent +IntlStrEqN +IntlStrEqNA +IntlStrEqNW +IntlStrEqWorker +IntlStrEqWorkerA +IntlStrEqWorkerW +IntOp +IntPower +Intr +IntToHex +IntToIdent +IntToStr +Invalidate +InvalidateCell +InvalidateCheck +InvalidateCol +InvalidateControlsUnderneath +InvalidateDockHostSite +InvalidateDockSite +InvalidateEditor +InvalidateFrame +InvalidateGrid +InvalidateModuleCache +InvalidateRect +InvalidateRgn +InvalidateRow +InvalidateSelectionsRects +InvalidateTitles +InvalidBcdString +InvalidBitmap +InvalidDateDayError +InvalidDateMonthWeekError +InvalidDateTimeError +InvalidDateWeekError +InvalidDayOfWeekInMonthError +InvalidGraphic +InvalidGUID +InvalidIcon +InvalidMask +InvalidMetafile +InvalidOp +InvalidOperation +InvalidPoint +Inverse +InvertRect +InvertRgn +Invoke +InvokeCodeCompletion +InvokeCommand +InvokeEvent +InvokeEx +InvokeHelp +InvokeLocalMenu +InvokeMethod +InvokeParameterCodeInsight +involves +ioctlsocket +IOleControlSite +IOleInPlaceFrame +IOleInPlaceSite +IOResult +IProviderSupport +IProviderSupport2 +is +IS_GOPHER_ASK +IS_GOPHER_BACKUP_SERVER +IS_GOPHER_DIRECTORY +IS_GOPHER_ERROR +IS_GOPHER_FILE +IS_GOPHER_INDEX_SERVER +IS_GOPHER_PHONE_SERVER +IS_GOPHER_PLUS +IS_GOPHER_TELNET_SESSION +IS_GOPHER_TN3270_SESSION +IS_GOPHER_TYPE_KNOWN +IsAbortResult +IsAccel +IsAccelChar +IsAccelerator +IsActionBarsStored +IsActionVisible +IsActiveControl +IsActiveLinked +IsAddressStored +IsAggRow +IsAlcBitAnsi +IsAlias +IsAlignmentStored +IsAltGRPressed +IsAnAllResult +isAncestor +IsAnonymous +Isapi +Isapi2 +IsAssembly +IsAsyncMoniker +IsAutoCheckLinked +IsAutoScrollStored +IsAutoSized +IsBackgroundDirty +IsBackgroundStored +IsBadCodePtr +IsBadHugeReadPtr +IsBadHugeWritePtr +IsBadReadPtr +IsBadStringPtr +IsBadStringPtrA +IsBadStringPtrW +IsBadWritePtr +IsBcdNegative +IsBcdZero +IsBiDiModeStored +IsBitmapStored +IsBlankSysTime +IsBlob +IsBuiltInType +IsBuiltInTypeName +IsBusyWindow +IsCallerInRole +IsCaptionLinked +IsCaptionStored +IsCategoryStored +IsCharAlpha +IsCharAlphaA +IsCharAlphaNumeric +IsCharAlphaNumericA +IsCharAlphaNumericW +IsCharAlphaW +IsCharLower +IsCharLowerA +IsCharLowerW +IsCharUpper +IsCharUpperA +IsCharUpperW +IsChecked +IsCheckedLinked +IsCheckedStored +IsChild +IsChildItem +IsClass +IsClassOfCategories +IsClassPooled +IsClear +IsClientConnected +IsClientSizeStored +IsClipboardFormatAvailable +IsCollectionItem +IsColorStored +IsColumnEmpty +IsComplex +IsComplexType +IsComPlusApp +IsComPlusPlatform +IsComponentHidden +IsComponentLinkable +IsComputerNameStored +IsConnected +IsContextChanging +IsControlActivateMsg +IsControlMouseMsg +IsCtl3DStored +IsCurItem +IsCursorOpen +IsCustom +IsCustomCaption +IsCustomDrawn +IsCustomProperty +IsDatabaseOpen +IsDBaseTable +IsDBCSLeadByte +IsDBCSLeadByteEx +IsDefaultDatabaseStored +IsDefaultInterfaceProp +IsDefaultMethodProp +IsDefaultPropertyValue +IsDefaultValue +IsDefaultVariantProp +IsDelimiter +IsDelphiHandle +IsDesignMsg +IsDialogMessage +IsDialogMessageA +IsDialogMessageW +IsDirectory +IsDirty +IsDisplayLabelStored +IsDisplayWidthStored +IsDlgButtonChecked +IsDlgMsg +IsDropdownMenuLinked +IsDupShortCut +IsDynArrayRectangular +IsEditing +IsEmpty +IsEmptyDoc +IsEmptyRow +IsEnabled +IsEnabledLinked +IsEnableDropdownLinked +IsEnabledStored +IsEncodingStored +IsEqual +IsEqualCLSID +IsEqualGUID +IsEqualIID +IsError +IsExpandable +IsFileBased +IsFileOpen +IsFilterStored +IsFirstNode +IsFontStored +IsForm +IsFormMDIChild +IsFormSizeStored +IsGlobal +IsGradientEndColorStored +IsGrouped +IsGroupIndexLinked +IsHashValCompatible +IsHelpContextLinked +IsHelpContextStored +IsHelpLinked +IsHintLinked +IsHintMsg +IsHintStored +IsHosted +IsHostStored +isHTTP +IsIconic +IsIconStored +IsIIDSupported +IsImageIndexLinked +IsImageIndexStored +IsImagesLinked +IsImeModeStored +IsImeNameStored +IsImplementorOf +IsIncrementStored +IsInfinite +IsInInlined +IsInitialChar +IsInLeapYear +IsInTransaction +IsItemsExStored +IsItemsStored +IsKatakana +IsKeyMsg +IsLeapYear +IsLine +IsLinkedActionListsStored +IsLinkedTo +IsLiteral +IsLiteralChar +IsLoggingEnabled +IsLoggingEnabledA +IsLoggingEnabledW +IsMaskStored +IsMDIMsg +IsMember +IsMemberOf +IsMemoryManagerSet +IsMenu +IsMenuKey +IsMouseButtonPressed +IsMultiTableQuery +IsName +IsNan +IsNegativeResult +IsNewQuery +IsNodeVisible +IsNumeric +Iso8859_10ToUTF16Char +Iso8859_10ToUTF16Str +Iso8859_13ToUTF16Char +Iso8859_13ToUTF16Str +Iso8859_14ToUTF16Char +Iso8859_14ToUTF16Str +Iso8859_15ToUTF16Char +Iso8859_15ToUTF16Str +Iso8859_1ToUTF16Char +Iso8859_1ToUTF16Str +Iso8859_2ToUTF16Char +Iso8859_2ToUTF16Str +Iso8859_3ToUTF16Char +Iso8859_3ToUTF16Str +Iso8859_4ToUTF16Char +Iso8859_4ToUTF16Str +Iso8859_5ToUTF16Char +Iso8859_5ToUTF16Str +Iso8859_6ToUTF16Char +Iso8859_6ToUTF16Str +Iso8859_7ToUTF16Char +Iso8859_7ToUTF16Str +Iso8859_8ToUTF16Char +Iso8859_8ToUTF16Str +Iso8859_9ToUTF16Char +Iso8859_9ToUTF16Str +IsObjectAccessAllowed +IsOnClickStored +IsOnExecuteLinked +IsOrientationSet +IsOurName +IsOwnedBy +IsOwnerDraw +IsPageDirty +IsParamStored +IsPathDelimiter +IsPenEvent +IsPM +IsPopupMenuLinked +IsPositiveResult +IsPrefixed +IsPreProcessMessage +IsPriorityScheduleStored +IsProcessorFeaturePresent +IsProductionIndex +IsProjectModule +IsPropertyInCategory +IsPropertyReadOnly +IsPropertyWriteOnly +IsPropPageProperty +IsProviderStored +IsPublishedProp +IsQualifyingSite +IsRangeStored +IsReadonly +IsReadOnlyStored +IsRectEmpty +IsRelative +IsRepeating +IsRightToLeft +IsRowEmpty +IsRowInChapter +IsRunning +IsSameDay +IsSchemaNamespace +IsScrollBarVisible +IsSecondaryShortCutsStored +IsSecurityEnabled +IsSelectionMessage +IsSequenced +IsServersStored +IsShortCut +IsShortCutLinked +IsShortCutStored +IsSiteChildOfClient +IsSourceReadOnly +IsSpacer +IsSQLTimeStampBlank +IsSqlTimeStampValid +IsStandardType +IsStoredProp +IsSystemMoniker +ist +IsTControl +IsTemporal +IsTextUnicode +IsToday +IsToolControl +IStreams +IsUnique +IsUniqueGlobalComponentName +IsUnwinderSet +IsUpToDate +IsURLStored +IsUserInRole +IsUTF16HighSurrogate +IsUTF16LowSurrogate +IsUTF8LeadByte +IsUTF8String +IsUTF8TrailByte +IsValid +IsValidAcl +IsValidChar +IsValidCodePage +IsValidDate +IsValidDateDay +IsValidDateMonthWeek +IsValidDateTime +IsValidDateWeek +isValidENTITY +IsValidIdent +isValidIDREF +IsValidLocale +IsValidSecurityDescriptor +IsValidSid +IsValidTime +IsValidURL +IsVariantManagerSet +IsViewerBrowsable +IsVisible +IsVisibleLinked +IsVisibleStored +IsWidthStored +IsWindow +IsWindowEnabled +IsWindowUnicode +IsWindowVisible +IsXBaseTable +IsXmlAttValue +IsXmlBaseChar +IsXmlCData +IsXmlChar +IsXmlCharData +IsXmlCharRef +IsXmlChars +IsXmlCombiningChar +IsXmlComment +IsXmlDefaultAttName +IsXmlDigit +IsXmlEncName +IsXmlEntityRef +IsXmlEntityValue +IsXmlExtender +IsXmlIdeographic +IsXmlLetter +IsXmlLocalPart +IsXmlName +IsXmlNameChar +IsXmlNames +IsXmlNCName +IsXmlNCNameChar +IsXmlNmtoken +IsXmlNmtokens +IsXmlNSAttName +IsXmlPEReference +IsXmlPITarget +IsXmlPrefix +IsXmlPrefixedAttName +IsXmlPubidChar +IsXmlPubidLiteral +IsXmlQName +IsXmlReference +IsXmlS +IsXMLStored +IsXmlStringType +IsXmlSystemLiteral +IsXmlTokenizedType +IsXmlVersionNum +IsXmlWhiteSpace +IsZero +IsZoomed +Item +ItemAdded +ItemAtPos +ItemChanged +ItemClass +ItemCount +ItemDeleted +ItemIndex +ItemInserted +ItemLocalName +ItemRect +ItemRemoved +Items +ItemsChange +ItemsEqual +ItemsModified +ItemWidth +Iterate +IterateClients +IterateMenus +ITransport +IUnknown +IWideProperty +IWideProperty10 +Ixedit +IXMLDOMDocument +ize +Join +JoinTransaction +joyGetDevCaps +joyGetDevCapsA +joyGetDevCapsW +joyGetNumDevs +joyGetPos +joyGetPosEx +joyGetThreshold +joyReleaseCapture +joySetCapture +joySetThreshold +JulianDateToDateTime +Keep +KelvinToCelsius +keybd_event +KeyboardStateToShiftState +KeyDataToShiftState +KeyDown +Keyed +KeyExists +KeyFieldsListDropDown +KeyIsValid +KeyPress +KeyPressed +KeysToShiftState +KeyUp +KeyValueChanged +KillMessage +KillTimer +KKConvert +Kl +KOI8_RToUTF16Char +KOI8_RToUTF16Str +label +Languages +LanguageToOptionID +LargeIconsActnExecute +LargeIconsActnUpdate +Last +lastChild +LastDelimiter +LastMode +LastReleased +LayOut +LayoutChanged +LBGetText +LBGetTextLen +LBItemFromPt +LCMapString +LCMapStringA +LCMapStringW +Ldexp +Leave +LeaveCriticalSection +leContainer +LeftBStr +LeftPromotion +LeftSide +LeftStr +LeftTrim +LHashValOfName +LHashValOfNameSys +LHashValOfNameSysA +library +LicenseCheck +LimitEmsPages +LineChanged +LineDDA +LinesInBuffer +LineStart +LineTo +LinkActive +LinkCursors +LinkError +LinkException +ListActns +ListAdd +ListBox1Click +ListBoxClick +ListBoxDblClick +ListChanging +ListClick +ListComboSelect +ListDrawValue +ListedCategory +Listen +ListItemsCompare +ListLinkDataChanged +ListMeasureHeight +ListMeasureWidth +ListMouseUp +ListRemove +ListView_ApproximateViewRect +ListView_Arrange +ListView_CancelEditLabel +ListView_CreateDragImage +ListView_DeleteAllItems +ListView_DeleteColumn +ListView_DeleteItem +ListView_EditLabel +ListView_EditLabelA +ListView_EditLabelW +ListView_EnableGroupView +ListView_EnsureVisible +ListView_FindItem +ListView_FindItemA +ListView_FindItemW +ListView_GetBkColor +ListView_GetBkImage +ListView_GetBkImageA +ListView_GetBkImageW +ListView_GetCallbackMask +ListView_GetCheckState +ListView_GetColumn +ListView_GetColumnA +ListView_GetColumnOrderArray +ListView_GetColumnW +ListView_GetColumnWidth +ListView_GetCountPerPage +ListView_GetEditControl +ListView_GetEmptyText +ListView_GetExtendedListViewStyle +ListView_GetFocusedGroup +ListView_GetFooterInfo +ListView_GetFooterItem +ListView_GetFooterItemRect +ListView_GetFooterRect +ListView_GetGroupCount +ListView_GetGroupHeaderImageList +ListView_GetGroupInfo +ListView_GetGroupInfoByIndex +ListView_GetGroupMetrics +ListView_GetGroupRect +ListView_GetGroupState +ListView_GetHeader +ListView_GetHotCursor +ListView_GetHotItem +ListView_GetHoverTime +ListView_GetImageList +ListView_GetInsertMark +ListView_GetInsertMarkColor +ListView_GetInsertMarkRect +ListView_GetISearchString +ListView_GetISearchStringA +ListView_GetISearchStringW +ListView_GetItem +ListView_GetItemA +ListView_GetItemCount +ListView_GetItemIndexRect +ListView_GetItemPosition +ListView_GetItemRect +ListView_GetItemSpacing +ListView_GetItemState +ListView_GetItemText +ListView_GetItemTextA +ListView_GetItemTextW +ListView_GetItemW +ListView_GetNextItem +ListView_GetNextItemIndex +ListView_GetNumberOfWorkAreas +ListView_GetOrigin +ListView_GetOutlineColor +ListView_GetSelectedColumn +ListView_GetSelectedCount +ListView_GetSelectionMark +ListView_GetStringWidth +ListView_GetStringWidthA +ListView_GetStringWidthW +ListView_GetSubItemRect +ListView_GetTextBkColor +ListView_GetTextColor +ListView_GetTileInfo +ListView_GetTileViewInfo +ListView_GetToolTips +ListView_GetTopIndex +ListView_GetUnicodeFormat +ListView_GetView +ListView_GetViewRect +ListView_GetWorkAreas +ListView_HasGroup +ListView_HitTest +ListView_InsertColumn +ListView_InsertColumnA +ListView_InsertColumnW +ListView_InsertGroup +ListView_InsertGroupSorted +ListView_InsertItem +ListView_InsertItemA +ListView_InsertItemW +ListView_InsertMarkHitTest +ListView_IsGroupViewEnabled +ListView_IsItemVisible +ListView_MapIDToIndex +ListView_MapIndexToID +ListView_MoveGroup +ListView_MoveItemToGroup +ListView_RedrawItems +ListView_RemoveAllGroups +ListView_RemoveGroup +ListView_Scroll +ListView_SetBkColor +ListView_SetBkImage +ListView_SetBkImageA +ListView_SetBkImageW +ListView_SetCallbackMask +ListView_SetCheckState +ListView_SetColumn +ListView_SetColumnA +ListView_SetColumnOrderArray +ListView_SetColumnW +ListView_SetColumnWidth +ListView_SetExtendedListViewStyle +ListView_SetGroupHeaderImageList +ListView_SetGroupInfo +ListView_SetGroupMetrics +ListView_SetGroupState +ListView_SetHotCursor +ListView_SetHotItem +ListView_SetHoverTime +ListView_SetIconSpacing +ListView_SetImageList +ListView_SetInfoTip +ListView_SetInsertMark +ListView_SetInsertMarkColor +ListView_SetItem +ListView_SetItemA +ListView_SetItemCount +ListView_SetItemCountEx +ListView_SetItemIndexState +ListView_SetItemPosition +ListView_SetItemPosition32 +ListView_SetItemState +ListView_SetItemText +ListView_SetItemTextA +ListView_SetItemTextW +ListView_SetItemW +ListView_SetOutlineColor +ListView_SetSelectedColumn +ListView_SetSelectionMark +ListView_SetTextBkColor +ListView_SetTextColor +ListView_SetTileInfo +ListView_SetTileViewInfo +ListView_SetToolTips +ListView_SetUnicodeFormat +ListView_SetView +ListView_SetWorkAreas +ListView_SortGroups +ListView_SortItems +ListView_SubItemHitTest +ListView_Update +ListView1Change +ListView1Click +ListView1DragDrop +ListView1DragOver +ListView1KeyDown +ListView1KeyPress +ListWndProc +Ln +LnXP1 +Load +LoadAccelerators +LoadAcceleratorsA +LoadAcceleratorsW +LoadBitmap +LoadBitmapA +LoadBitmaps +LoadBitmapW +LoadClick +LoadComExProcs +LoadCommand +LoadCursor +LoadCursorA +LoadCursorFromFile +LoadCursorFromFileA +LoadCursorFromFileW +LoadCursorResData +LoadCursors +LoadCursorW +LoadData +Loaded +LoadFile +LoadFromBlob +LoadFromClipboardFormat +LoadFromFile +LoadFromStream +LoadFromStreamPersist +LoadFromStrings +LoadFromURL +LoadFromXML +LoadFromXMLString +LoadHiddenCategories +LoadIcon +LoadIconA +LoadIconMetric +LoadIconW +LoadIconWithScaleDown +LoadImage +LoadImageA +LoadImages +LoadImageW +LoadKey +LoadKeyboardLayout +LoadKeyboardLayoutA +LoadKeyboardLayoutW +LoadLibrary +LoadLibraryA +LoadLibraryEx +LoadLibraryExA +LoadLibraryExW +LoadLibraryW +LoadLocale +LoadMemo +LoadMenu +LoadMenuA +LoadMenuIndirect +LoadMenuIndirectA +LoadMenuIndirectW +LoadMenuW +LoadModule +LoadMtsProcs +LoadPackage +LoadPicture +LoadRecreateItems +LoadRegTypeLib +LoadResource +LoadResourceModule +LoadResString +LoadResWideString +LoadSchemaRef +LoadSMClient +LoadStr +LoadString +LoadStringA +LoadStringFromStorage +LoadStringW +LoadTemplates +LoadTextValues +LoadTreeFromStream +LoadTypeLib +LoadTypeLibEx +LoadTypeLibrary +LoadValues +LoadWideStr +LoadWindowState +LoadWinSock2 +loadXML +LoadXMLData +LoadXMLDocument +LoadXMLLibrary +LoadXMLSchema +LoadXMLSchemaStr +LocalAlloc +LocalCompact +LocalDiscard +LocaleConversionError +LocalesCallback +LocalFileTimeToFileTime +LocalFlags +LocalFree +LocalLock +LocalMenuPopup +LocalReAlloc +LocalShrink +LocalSize +LocalUnlock +Locate +LocateAppInfo +LocateKey +LocateRecord +LocateWithFilter +Lock +LockContainer +LockFile +LockFileEx +LockInPlaceActive +LockList +LockObject +LockRegion +LockResource +LockRunning +LockSegment +LockSelect +LockSelection +LockServer +LockServiceDatabase +LockSession +LockState +LockTable +LockWindowUpdate +LockWorkStation +Log10 +Log2 +LogAction +Login +LoginDialog +LoginDialogEx +LogMessage +LogN +LogonUser +LogonUserA +LogonUserW +LogString +LogUpdateError +LogUpdateRecord +LongInt +LongMulDiv +Lookup +LookupAccountName +LookupAccountNameA +LookupAccountNameW +LookupAccountSid +LookupAccountSidA +LookupAccountSidW +LookupALink +LookupIconIdFromDirectory +LookupIconIdFromDirectoryEx +LookupKeyBinding +LookupKeysListDropDown +LookupName +LookupPrivilegeDisplayName +LookupPrivilegeDisplayNameA +LookupPrivilegeDisplayNameW +LookupPrivilegeName +LookupPrivilegeNameA +LookupPrivilegeNameW +LookupPrivilegeValue +LookupPrivilegeValueA +LookupPrivilegeValueW +LookupProc +LookupSecurityDescriptorParts +LookupSecurityDescriptorPartsA +LookupSecurityDescriptorPartsW +LookupService +LookupStored +LostPrecision +LowerCase +LowVideo +LPtoDP +LresultFromObject +lstrcat +lstrcatA +lstrcatW +lstrcmp +lstrcmpA +lstrcmpi +lstrcmpiA +lstrcmpiW +lstrcmpW +lstrcpy +lstrcpyA +lstrcpyn +lstrcpynA +lstrcpynW +lstrcpyW +lstrlen +lstrlenA +lstrlenW +lUIParam +LZClose +LZCopy +LZExpand +LZInit +LZOpenFile +LZOpenFileA +LZOpenFileW +LZRead +LZSeek +m +magnus_atrestart +MAGNUS_VERSION_STRING +Main +MainWndHook +MainWndProc +MakeAbsoluteSD +MakeAbsTime +makeChildrenReadonly +MakeComponentLinkable +MakeCurrent +MAKEDLLVERULL +MakeDragList +MakeEmbedded +MakeErrorMessage +MakeExpanded +MakeFullyVisible +MakeImageRegion +MAKEIPADDRESS +MAKEIPRANGE +MakeLong +MakeLParam +MakeLResult +MakeNamedNodeMap +MakeNode +MakeNodeList +MakeNodeName +MakeObjectInstance +MakeProcInstance +MakeProminent +MakeResult +MakeROP4 +MakeSec +MakeSelfRelativeSD +MakeSureDirectoryPathExists +MakeTypeName +MakeVisible +MakeWinHelpHappy +MakeWord +MakeWParam +MALLOC +MapAndLoad +MapColumnIDs +MapDebugInformation +MapDialogRect +MapFileAndCheckSum +MapFileAndCheckSumA +MapFileAndCheckSumW +MapGenericMask +Mapi +MapiAddress +MapiDeleteMail +MapiDetails +MapiFindNext +MapiFreeBuffer +MapiLogOff +MapiLogOn +MapiReadMail +MapiResolveName +MapiSaveMail +MapiSendDocuments +MapiSendMail +MapNameToSCID +MapOleCustomProperty +MapParameterNames +MapPath +MapPropertyToPage +MapSignal +MapsToIndex +MapToRunError +MapUrlToZone +MapViewOfFile +MapViewOfFileEx +MapVirtualKey +MapVirtualKeyA +MapVirtualKeyEx +MapVirtualKeyExA +MapVirtualKeyExW +MapVirtualKeyW +MapWindowPoints +Mark +MarkBlocks +MarkElapsedTime +MarkModified +MarshalInterface +Mask +MaskBlt +MaskDoFormatText +MaskGetCharType +MaskGetCurrentDirectives +MaskGetFldSeparator +MaskGetMaskBlank +MaskGetMaskSave +MaskIntlLiteralToChar +MaskOffsetToOffset +MaskOffsetToString +MaskOffsetToWideOffset +Masks +MaskUtils +master_error_log +MasterChanged +MasterDisabled +MasterFieldsChanged +Match +MatchCache +MatchClass +Matches +MatchesMask +MatchesMaskStates +MatchingItem +MatchName +MatchStr +MatchTemplates +MatchText +MatchType +Math +Max +MaxIntValue +MaxValue +mblen +mci_HMS_Hour +mci_HMS_Minute +mci_HMS_Second +mci_Make_HMS +mci_Make_MSF +mci_Make_TMSF +mci_MSF_Frame +mci_MSF_Minute +mci_MSF_Second +mci_TMSF_Frame +mci_TMSF_Minute +mci_TMSF_Second +mci_TMSF_Track +mciExecute +mciGetCreatorTask +mciGetDeviceID +mciGetDeviceIDA +mciGetDeviceIDFromElementID +mciGetDeviceIDFromElementIDA +mciGetDeviceIDFromElementIDW +mciGetDeviceIDW +mciGetErrorString +mciGetErrorStringA +mciGetErrorStringW +mciGetYieldProc +mciSendCommand +mciSendCommandA +mciSendCommandW +mciSendString +mciSendStringA +mciSendStringW +mciSetYieldProc +MConnect +MDIChildMaximized +MDIChildRestored +Mean +MeanAndStdDev +MeasureItem +MeasureTab +MeasureTitleHeights +memcpy +Memo1KeyDown +memoryToDom +memset +MenuAnimationStylesChange +MenuBeginUpdate +MenuChanged +MenuEndUpdate +MenuHelp +MenuIndex +MenuItemFromPoint +Menus +Merge +MergeChangeLog +MergeMenu +MergeWith +MessageBeep +MessageBox +MessageBoxA +MessageBoxEx +MessageBoxExA +MessageBoxExW +MessageBoxIndirect +MessageBoxIndirectA +MessageBoxIndirectW +MessageBoxW +MessageDlg +MessageDlgPos +MessageDlgPosHelp +MessageGroupAdded +MessageGroupDeleted +MessageHook +MessagePending +Messages +MessageViewMenuShown +MetaInfoSQLSplitterCanResize +MetaInfoSQLSplitterMoved +MethodAddress +MethodExists +MethodFromAncestor +MethodName +MethodNavigate +MetricScalePenData +miAddClick +miCloseClick +Midas +MidasCon +MidBStr +MidConst +midiConnect +midiDisconnect +midiInAddBuffer +midiInClose +midiInGetDevCaps +midiInGetDevCapsA +midiInGetDevCapsW +midiInGetErrorText +midiInGetErrorTextA +midiInGetErrorTextW +midiInGetID +midiInGetNumDevs +midiInMessage +midiInOpen +midiInPrepareHeader +midiInReset +midiInStart +midiInStop +midiInUnprepareHeader +midiOutCacheDrumPatches +midiOutCachePatches +midiOutClose +midiOutGetDevCaps +midiOutGetDevCapsA +midiOutGetDevCapsW +midiOutGetErrorText +midiOutGetErrorTextA +midiOutGetErrorTextW +midiOutGetID +midiOutGetNumDevs +midiOutGetVolume +midiOutLongMsg +midiOutMessage +midiOutOpen +midiOutPrepareHeader +midiOutReset +midiOutSetVolume +midiOutShortMsg +midiOutUnprepareHeader +miDisconnectClick +midiStreamClose +midiStreamOpen +midiStreamOut +midiStreamPause +midiStreamPosition +midiStreamProperty +midiStreamRestart +midiStreamStop +MidReg +MidStr +miExitClick +MilliSecondOf +MilliSecondOfTheDay +MilliSecondOfTheHour +MilliSecondOfTheMinute +MilliSecondOfTheMonth +MilliSecondOfTheSecond +MilliSecondOfTheWeek +MilliSecondOfTheYear +MilliSecondsBetween +MilliSecondSpan +Min +MinClientRect +Minimize +MinimizeName +MinIntValue +MinuteOf +MinuteOfTheDay +MinuteOfTheHour +MinuteOfTheMonth +MinuteOfTheWeek +MinuteOfTheYear +MinutesBetween +MinuteSpan +MinValue +MinVar +miPropertiesClick +MiscCategory +mixerClose +mixerGetControlDetails +mixerGetControlDetailsA +mixerGetControlDetailsW +mixerGetDevCaps +mixerGetDevCapsA +mixerGetDevCapsW +mixerGetID +mixerGetLineControls +mixerGetLineControlsA +mixerGetLineControlsW +mixerGetLineInfo +mixerGetLineInfoA +mixerGetLineInfoW +mixerGetNumDevs +mixerMessage +mixerOpen +mixerSetControlDetails +MkDir +mkFunction +MkParseDisplayName +MkParseDisplayNameEx +mmap +mmioAdvance +mmioAscend +mmioClose +mmioCreateChunk +mmioDescend +mmioFlush +mmioGetInfo +mmioInstallIOProc +mmioInstallIOProcA +mmioInstallIOProcW +mmioOpen +mmioOpenA +mmioOpenW +mmioRead +mmioRename +mmioRenameA +mmioRenameW +mmioSeek +mmioSendMessage +mmioSetBuffer +mmioSetInfo +mmioStringToFOURCC +mmioStringToFOURCCA +mmioStringToFOURCCW +mmioWrite +MMNotify +MMSystem +mmsystemGetVersion +mod +ModalDialogBox +ModalEdit +ModalFinished +ModalStarted +Modified +ModifiedJulianDateToDateTime +Modify +ModifyAlias +ModifyComplete +ModifyConfigParams +ModifyDataSource +ModifyDesktopItem +ModifyDriver +ModifyExtents +ModifyMenu +ModifyMenuA +ModifyMenuW +ModifyRecord +ModifyScrollBar +ModifySystemMenu +ModifyWorldTransform +ModuleAdded +ModuleCacheID +ModuleCreate +ModuleCreateEx +ModuleFileNames +ModuleRemoved +ModuleRenamed +ModuleUnload +MomentSkewKurtosis +MonikerCommonPrefixWith +MonikerRelativePathTo +Monitor +MonitorFromPoint +MonitorFromRect +MonitorFromWindow +mono +MonthCal_GetColor +MonthCal_GetCurSel +MonthCal_GetFirstDayOfWeek +MonthCal_GetMaxSelCount +MonthCal_GetMaxTodayWidth +MonthCal_GetMinReqRect +MonthCal_GetMonthDelta +MonthCal_GetMonthRange +MonthCal_GetRange +MonthCal_GetSelRange +MonthCal_GetToday +MonthCal_GetUnicodeFormat +MonthCal_HitTest +MonthCal_SetColor +MonthCal_SetCurSel +MonthCal_SetDayState +MonthCal_SetFirstDayOfWeek +MonthCal_SetMaxSelCount +MonthCal_SetMonthDelta +Monthcal_SetRange +MonthCal_SetSelRange +MonthCal_SetToday +MonthCal_SetUnicodeFormat +MonthOf +MonthOfTheYear +MonthsBetween +MonthSpan +mouse_event +MouseActivate +MouseCoord +MouseDown +MouseDragToGrid +MouseMove +MouseOverDropDown +MouseToCell +MouseUp +MouseWheelHandler +Move +MoveAdjust +MoveAnchor +MoveAndScroll +MoveBOL +MoveBuffer +MoveBy +MoveBytesToRight +MoveCol +MoveColData +MoveColRow +MoveColumn +MoveComplete +MoveCurrent +MoveCursor +MoveCursorToView +MoveDown +MoveDownClick +MoveElementTo +MoveEOF +MoveEOL +MoveExtent +MoveFields +MoveFile +MoveFileA +MoveFileEx +MoveFileExA +MoveFileExW +MoveFileW +MoveFileWithProgress +MoveFileWithProgressA +MoveFileWithProgressW +MoveFirst +MoveKey +MoveLast +MoveMemory +MoveMessages +MoveNext +MoveNode +MovePrevious +MoveReal +MoveRelative +MoveRow +MoveSideways +MoveTab +MoveTo +MoveToBOF +MoveToBookMark +MoveToEOF +MoveToEx +MoveToKey +MoveToNextSubGroup +MoveTopLeft +MoveToSeqNo +MoveUp +MoveUpClick +MoveValue +MoveViewToCursor +MoveWindow +MoveWindowOrg +MpAlcB +MpIbf +MPlayer +MSDos +MSecsToTimeStamp +MsgSetCalColors +MsgSetDateTime +MsgSetRange +MsgWaitForMultipleObjects +MsgWaitForMultipleObjectsEx +msxml +msxmldom +Mtsobj +MtsRdm +Mtx +MulDiv +MultiByteToWideChar +MultiLineWidth +MultiMon +MultinetGetConnectionPerformance +MultinetGetConnectionPerformanceA +MultinetGetConnectionPerformanceW +munmap +Mxconsts +n +Name +NameDelimiter +NameLengthError +NameStr +NameToId +NativeCompareStr +NativeCompareStrBuf +NativeCompareText +NativeCompareTextBuf +NativeTableName +NativeToAnsi +NativeToAnsiBuf +NativeToDateTime +Navigate +NavigateFrom +NavigateFromTo +Nb30 +NCPaint +nd +ndex +near +NeedsBackslashing +NeedsDBAlias +NeedsScrollBarVisible +NeedsUpdate +NegateAny +NegateAsDouble +NegateByte +NegateCustom +NegateLongWord +NegateVariant +NegateViaOS +NegateWord +Nestable +NestingLevel +net_accept +net_bind +net_close +net_connect +net_create_listener +net_getpeername +net_getsockopt +net_ioctl +net_ip2host +net_isalive +net_listen +net_read +net_select +net_setsockopt +net_socket +net_write +Netbios +netbuf_buf2sd +netbuf_close +netbuf_getc +netbuf_grab +netbuf_next +netbuf_open +NetClick +NetPresentValue +NetworkVolume +new +NewAdditionalFileSource +NewAddressBreakpoint +NewBottomLine +NewCompareNode +NewDefaultModule +NewDefaultProjectModule +NewEditorGroup +NewFormFile +NewImage +NewImplSource +NewInstance +NewIntfSource +NewItem +NewItemClick +NewLayout +NewLine +NewMenu +NewModule +NewModuleBreakpoint +NewModuleSource +NewNode +NewOptionSource +NewPage +NewPascalString +NewPopup +NewPopupMenu +NewProjectGroupSource +NewProjectResource +NewProjectSource +NewRecordObject +NewSection +NewSourceBreakpoint +NewStr +NewSubMenu +NewToolbar +NewTopLine +NewXMLDocument +NewXMLSchema +Next +NextBufferView +NextCharIndex +NextClick +NextDigit +NextError +NextErrorMessage +NextItem +NextMessage +nextNode +NextPage +NextRecordset +NextRow +NextSibling +NextSQLToken +NextToken +NextTokenIs +NextTokenIsLParen +NextValue +NextVisibleZone +NextWord +nfo +nil +nitProc +nl_langinfo +NodeDeselect +NodeEdited +NodeFocused +nodeFromID +NodeIndentStored +NodeInList +NodeMatches +NodeSelect +NodeSelected +NonEditMouseDown +Norm +NormalColor +NormalDraw +Normalize +NormalizeAllTopMosts +NormalizeBcd +NormalizeTopMosts +NormVideo +NoSelection +NoSound +not +NotAny +NotAsOrdinal +NotAsString +notationDeclaration +NotCustom +NotebookHandlesNeeded +NoteChangeTime +Notification +Notify +NotifyBootConfigStatus +NotifyCallback +NotifyChangeEventLog +NotifyControls +NotifyDataLinks +NotifyDesigner +NotifyDetails +NotifyForms +NotifyGlobalLoading +NotifyGroupChange +NotifyID +NotifyLinkTypes +NotifyModuleUnload +NotifyWinEvent +NotRightToLeft +NotVariant +NotViaOS +Now +Ns30Fix +Ns35Fix +Ns36Fix +Nsapi +NSstr2String +nt +NthDayOfWeek +NthParentOf +ntohl +ntohs +ntpblock_pblock2str +ntpblock_str2pblock +Null +NullCompare +NullOp +NumberOfPeriods +OaBuildVersion +ObjAddRef +ObjAuto +ObjBrkr +ObjComAuto +object +object_add_directive +object_create +object_execute +object_free +ObjectBinaryToText +ObjectCloseAuditAlarm +ObjectCloseAuditAlarmA +ObjectCloseAuditAlarmW +ObjectDeleteAuditAlarm +ObjectDeleteAuditAlarmA +ObjectDeleteAuditAlarmW +ObjectFromLresult +ObjectInvoke +ObjectMoved +ObjectOpenAuditAlarm +ObjectOpenAuditAlarmA +ObjectOpenAuditAlarmW +ObjectPrivilegeAuditAlarm +ObjectPrivilegeAuditAlarmA +ObjectPrivilegeAuditAlarmW +ObjectPropertiesDialog +ObjectResourceToText +ObjectsSelected +ObjectTextToBinary +ObjectTextToResource +ObjQueryInterface +ObjRelease +objset_add_init +objset_add_object +objset_copydirs +objset_create +objset_findbyname +objset_findbyppath +objset_free +objset_free_setonly +objset_new_object +objset_scan_buffer +objset_scan_registry +ObtainUserAgentString +OCXReg +oduleName +OemKeyScan +OemToAnsi +OemToAnsiBuff +OemToChar +OemToCharA +OemToCharBuff +OemToCharBuffA +OemToCharBuffW +OemToCharW +of +OffsetClipRgn +OffsetPenData +OffsetRect +OffsetRgn +OffsetToMaskOffset +OffsetViewportOrgEx +OffsetWindowOrgEx +OInetCombineUrl +OInetCompareUrl +OInetGetProtocolFlags +OInetGetSecurityUrl +OInetGetSession +OInetParseUrl +OInetQueryInfo +OKBtnClick +OKButtonClick +OKClick +OkToChangeFieldAlignment +OldBCDToCurr +OldCurrToBCD +Ole2 +oleacc +OleAuto +OleBuildVersion +OleCheck +OleConst +OleControlSite_TranslateAccelerator +OleConvertIStorageToOLESTREAM +OleConvertIStorageToOLESTREAMEx +OleConvertOLESTREAMToIStorage +OleConvertOLESTREAMToIStorageEx +OleCreate +OleCreateDefaultHandler +OleCreateEmbeddingHelper +OleCreateEx +OleCreateFontIndirect +OleCreateFromData +OleCreateFromDataEx +OleCreateFromFile +OleCreateFromFileEx +OleCreateLink +OleCreateLinkEx +OleCreateLinkFromData +OleCreateLinkFromDataEx +OleCreateLinkToFile +OleCreateLinkToFileEx +OleCreateMenuDescriptor +OleCreatePictureIndirect +OleCreatePropertyFrame +OleCreatePropertyFrameIndirect +OleCreateStaticFromData +OleCtl +OleCtnrs +OleCtrls +OleDB +OleDestroyMenuDescriptor +OleDialogHook +OleDlg +OleDoAutoConvert +OleDraw +OleDuplicateData +OleEnumToOrd +OleError +OleFlushClipboard +OleFontToFont +OleGetAutoConvert +OleGetClipboard +OleGetIconOfClass +OleGetIconOfFile +OleIconToCursor +OleInitialize +OleInPlaceFrame_GetWindow +OleInPlaceFrame_TranslateAccelerator +OleInPlaceSite_GetWindow +OleIsCurrentClipboard +OleIsRunning +OleLoad +OleLoadFromStream +OleLoadPicture +OleLoadPictureFile +OleLoadPicturePath +OleLockRunning +OleMetafilePictFromIconAndLabel +OleNoteObjectVisible +OlePromotion +OleQueryCreateFromData +OleQueryLinkFromData +OleRegEnumFormatEtc +OleRegEnumVerbs +OleRegGetMiscStatus +OleRegGetUserType +OleRun +OleSave +OleSavePictureFile +OleSaveToStream +OleServer +OleSetAutoConvert +OleSetClipboard +OleSetContainedObject +OleSetMenuDescriptor +OleStdGetFirstMoniker +OleStdGetLenFilePrefixOfMoniker +OleStrToString +OleStrToStrVar +OleTranslateAccelerator +OleTranslateColor +OleUIAddVerbMenu +OleUIBusy +OleUICanConvertOrActivateAs +OleUIChangeIcon +OleUIConvert +OleUIEditLinks +OleUIInsertObject +OleUIObjectProperties +OleUIPasteSpecial +OleUninitialize +OleVarFromAny +OleVarFromVarArrayProc +ommand +omponent +on +OnActivate +OnActivityCreate +OnActivityDestroy +OnActivityEnter +OnActivityLeave +OnActivityLeaveSame +OnActivityReenter +OnActivityTimeout +OnAdvise +OnAmbientPropertyChange +OnAppActivation +OnAppForceShutdown +OnAppShutdown +OnAttach +OnAuthenticate +OnAuthenticateFail +OnButtonClicked +OnChange +OnChanged +OnChangeTimer +OnCheckButtonToggled +OnClose +OnControlActivating +OnControlInfoChanged +OnCRMAbort +OnCRMAnalyze +OnCRMBegin +OnCRMCheckpoint +OnCRMCommit +OnCRMDeliver +OnCRMDone +OnCRMForce +OnCRMForget +OnCRMIndoubt +OnCRMPrepare +OnCRMRecoveryDone +OnCRMRecoveryStart +OnCRMRelease +OnCRMWrite +OnDataAvailable +OnDataChange +OnDeactivate +OnDefaultCommand +OnDefWindowMessage +OnDelay +OnDestroy +OnDetach +OnDisableCommit +OnDocWindowActivate +OnEditorKey +OnEnableCommit +OnEndPage +OnException +OnExceptionHandler +OnExceptionUser +OnExecuteEvent +OnFileOk +OnFileOkEvent +OnFocus +OnFocusChangeIS +OnFolderChange +OnFolderChangeEvent +OnFolderChanging +OnFrameWindowActivate +OnIISRequestInfo +OnInPlaceActivate +OnInPlaceActivateEx +OnInPlaceDeactivate +OnInPlaceDeActivateEx +OnItemSelected +OnLastTab +OnLinkSrcChange +OnLowResource +OnMethodCall +OnMethodException +OnMethodReturn +OnMnemonic +onnection +OnObjectActivate +OnObjectAvailable +OnObjectConstruct +OnObjectCreate +OnObjectDeactivate +OnObjectDestroy +OnObjPoolCreateDecision +OnObjPoolCreateObject +OnObjPoolCreatePool +OnObjPoolDestroyObject +OnObjPoolGetFromTx +OnObjPoolGetObject +OnObjPoolPutObject +OnObjPoolRecycleToTx +OnObjPoolTimeout +OnOverwrite +OnPoint +OnPosRectChange +OnProgress +OnQCMoveToDeadQueue +OnQCMoveToReTryQueue +OnQCPlayback +OnQCQueueOpen +OnQCReceive +OnQCReceiveFail +OnQCRecord +onreadystatechange +OnRename +OnRequestEdit +OnResize +OnResourceAllocate +OnResourceCreate +OnResourceDestroy +OnResourceRecycle +OnResourceTrack +OnRowPositionChange +OnRun +OnSave +OnSelectionChange +OnSelectionChangeEvent +OnSetAbort +OnSetComplete +OnSetItem +OnShareViolation +OnShowWindow +onst +OnStartBinding +OnStartPage +OnStateChange +OnStatusChange +OnStop +OnStopBinding +OnSyncEdit +ontext +OnThreadAssignApartment +OnThreadBindToApartment +OnThreadStart +OnThreadTerminate +OnThreadUnassignApartment +OnThreadUnBind +OnThreadWorkEnque +OnThreadWorkPrivate +OnThreadWorkPublic +OnThreadWorkRedirect +OnThreadWorkReject +OnTransactionAbort +OnTransactionCommit +OnTransactionPrepare +OnTransactionStart +ontrol +OnTypeChange +OnTypeChangeEvent +OnUIActivate +OnUIDeactivate +OnUserEvent +OnViewChange +OnViewWindowActive +OnWindowMessage +OnXMLDeclaration +oolIn +Open +OpenBackupEventLog +OpenBackupEventLogA +OpenBackupEventLogW +OpenBit +OpenClipboard +OpenCloseDetails +OpenConnection +OpenCurrent +OpenCursor +OpenCursorComplete +OpenDatabase +OpenDesktop +OpenDesktopA +OpenDesktopW +OpenDriver +OpenEdition +OpenEvent +OpenEventA +OpenEventLog +OpenEventLogA +OpenEventLogW +OpenEventW +OpenFile +OpenFileAtCursor +OpenFileMapping +OpenFileMappingA +OpenFileMappingW +OpenFromExistingDB +OpenGL +OpenIcon +OpenIndexFile +OpenInputDesktop +OpenKey +OpenKeyReadOnly +OpenLink +OpenLinkSource +OpenModule +OpenMutex +OpenMutexA +OpenMutexW +OpenParentDataSet +OpenPrinter +OpenPrinterA +OpenPrinterW +OpenProcess +OpenProcessToken +OpenProject +OpenProjectInfo +OpenRaw +OpenRawA +OpenRawW +OpenRegKey +OpenRowset +OpenSchema +OpenSCManager +OpenSCManagerA +OpenSCManagerW +OpenSemaphore +OpenSemaphoreA +OpenSemaphoreW +OpenService +OpenServiceA +OpenServiceW +OpenSession +OpenStorage +OpenStream +OpenThemeDataEx +OpenThreadToken +OpenViewChapter +OpenViewRowset +OpenWaitableTimer +OpenWaitableTimerA +OpenWaitableTimerW +OpenWindowStation +OpenWindowStationA +OpenWindowStationW +operate +operator +or +OrderFieldList +OrdToExecuteOptions +OurProc +Outline +OutOfMemoryError +OutOfResources +OutputDebugString +OutputDebugStringA +OutputDebugStringW +OverButton +OverflowError +Overlay +overload +override +Overwrite +OwnedBy +Owner +OwnerDataFetch +OwnerDataFind +OwnerDataHint +OwnerDataStateChange +oxmldom +Pack +PackageParams +PackDDElParam +packed +PackTime +PadInputLiterals +PadInputString +PadSubField +PageDown +PageIndexFromTabIndex +PagePaint +Pager_ForwardMouse +Pager_GetBkColor +Pager_GetBorder +Pager_GetButtonSize +Pager_GetButtonState +Pager_GetDropTarget +Pager_GetPos +Pager_RecalcSize +Pager_SetBkColor +Pager_SetBorder +Pager_SetButtonSize +Pager_SetChild +Pager_SetPos +PageSetupDlg +PageSetupDlgA +PageSetupDlgW +PageUp +Paint +PaintBorder +PaintColorBox +PaintControlFrame +PaintControls +PaintDesktop +PaintDockCaption +PaintDockFrame +PaintEdge +PaintGrid +PaintHandler +PaintListBox +PaintMenu +PaintPanel +PaintRgn +PaintSite +PaintTo +PaintWindow +PaletteAPI +PaletteChanged +PaletteCreated +PaletteFromDIBColorTable +PaletteIndex +PaletteOver +PaletteOverTo +PaletteRGB +PaletteToDIBColorTable +param_create +param_free +ParamByName +ParamCount +ParameterCodeInsightAnchorPos +ParameterCodeInsightParamIndex +parameterEntityDeclaration +parameterEntityRef +ParameterMismatch +ParamRef +ParamsChanging +ParamStr +Parent +ParentBiDiModeChanged +ParentBitmapChanged +ParentColorChanged +ParentEvent +parentNode +ParentNotLast +ParentProperty +ParentRepeats +Parents +Parse +ParseAttributeDefinition +ParseAttributeDefinitions +ParseChildElements +ParseDisplayName +parseDtd +ParseElementDefinition +ParseElementDefinitions +ParseError +ParseErrorEOS +ParseErrorHandler +ParseExpr +ParseExpr2 +ParseExpr3 +ParseExpr4 +ParseExpr5 +ParseExpr6 +ParseExpr7 +ParseGroup +parseloop +ParseNumber +ParseParam +parserErrorFactory +ParseSQL +ParseTokens +ParseWhiteSpace +pascal +PasswordDialog +Paste +PasteComponents +PasteFromClipboard +PasteItemClick +PasteLink +PasteSelection +PasteSpecialDialog +PatBlt +Path +PathAddBackslash +PathAddBackslashA +PathAddBackslashW +PathAddExtension +PathAddExtensionA +PathAddExtensionW +PathAppend +PathAppendA +PathAppendW +PathBuildRoot +PathBuildRootA +PathBuildRootW +PathCanonicalize +PathCanonicalizeA +PathCanonicalizeW +PathCombine +PathCombineA +PathCombineW +PathCommonPrefix +PathCommonPrefixA +PathCommonPrefixW +PathCompactPath +PathCompactPathA +PathCompactPathEx +PathCompactPathExA +PathCompactPathExW +PathCompactPathW +PathCreateFromUrl +PathCreateFromUrlA +PathCreateFromUrlW +PathFileExists +PathFileExistsA +PathFileExistsW +PathFindExtension +PathFindExtensionA +PathFindExtensionW +PathFindFileName +PathFindFileNameA +PathFindFileNameW +PathFindNextComponent +PathFindNextComponentA +PathFindNextComponentW +PathFindOnPath +PathFindOnPathA +PathFindOnPathW +PathFindSuffixArray +PathFindSuffixArrayA +PathFindSuffixArrayW +PathGetArgs +PathGetArgsA +PathGetArgsW +PathGetCharType +PathGetCharTypeA +PathGetCharTypeW +PathGetDriveNumber +PathGetDriveNumberA +PathGetDriveNumberW +PathIsContentType +PathIsContentTypeA +PathIsContentTypeW +PathIsDirectory +PathIsDirectoryA +PathIsDirectoryEmpty +PathIsDirectoryEmptyA +PathIsDirectoryEmptyW +PathIsDirectoryW +PathIsFileSpec +PathIsFileSpecA +PathIsFileSpecW +PathIsHTMLFile +PathIsHTMLFileA +PathIsHTMLFileW +PathIsLFNFileSpec +PathIsLFNFileSpecA +PathIsLFNFileSpecW +PathIsNetworkPath +PathIsNetworkPathA +PathIsNetworkPathW +PathIsPrefix +PathIsPrefixA +PathIsPrefixW +PathIsRelative +PathIsRelativeA +PathIsRelativeW +PathIsRoot +PathIsRootA +PathIsRootW +PathIsSameRoot +PathIsSameRootA +PathIsSameRootW +PathIsSystemFolder +PathIsSystemFolderA +PathIsSystemFolderW +PathIsUNC +PathIsUNCA +PathIsUNCServer +PathIsUNCServerA +PathIsUNCServerShare +PathIsUNCServerShareA +PathIsUNCServerShareW +PathIsUNCServerW +PathIsUNCW +PathIsURL +PathIsURLA +PathIsURLW +PathMakePretty +PathMakePrettyA +PathMakePrettyW +PathMakeSystemFolder +PathMakeSystemFolderA +PathMakeSystemFolderW +PathMatchSpec +PathMatchSpecA +PathMatchSpecW +PathParseIconLocation +PathParseIconLocationA +PathParseIconLocationW +PathQuoteSpaces +PathQuoteSpacesA +PathQuoteSpacesW +PathRelativePathTo +PathRelativePathToA +PathRelativePathToW +PathRemoveArgs +PathRemoveArgsA +PathRemoveArgsW +PathRemoveBackslash +PathRemoveBackslashA +PathRemoveBackslashW +PathRemoveBlanks +PathRemoveBlanksA +PathRemoveBlanksW +PathRemoveExtension +PathRemoveExtensionA +PathRemoveExtensionW +PathRemoveFileSpec +PathRemoveFileSpecA +PathRemoveFileSpecW +PathRenameExtension +PathRenameExtensionA +PathRenameExtensionW +PathSearchAndQualify +PathSearchAndQualifyA +PathSearchAndQualifyW +PathSetDlgItemPath +PathSetDlgItemPathA +PathSetDlgItemPathW +PathSkipRoot +PathSkipRootA +PathSkipRootW +PathStr +PathStripPath +PathStripPathA +PathStripPathW +PathStripToRoot +PathStripToRootA +PathStripToRootW +PathToRegion +PathUndecorate +PathUndecorateA +PathUndecorateW +PathUnExpandEnvStrings +PathUnExpandEnvStringsA +PathUnExpandEnvStringsW +PathUnmakeSystemFolder +PathUnmakeSystemFolderA +PathUnmakeSystemFolderW +PathUnquoteSpaces +PathUnquoteSpacesA +PathUnquoteSpacesW +Pause +PauseOnly +PausePlayback +PauseRecord +PauseTimer +Payment +PaymentParts +pblock_copy +pblock_create +pblock_dup +pblock_find +pblock_findval +pblock_free +pblock_nninsert +pblock_nvinsert +pblock_pb2env +pblock_pblock2str +pblock_pinsert +pblock_remove +pblock_str2pblock +PCDATA +Peek +PeekConsoleInput +PeekConsoleInputA +PeekConsoleInputW +PeekItem +PeekMessage +PeekMessageA +PeekMessageW +PeekNamedPipe +PeekPenInput +PenChanged +PenDataFromBuffer +PenDataToBuffer +PenWin +peration +PeriodPayment +PERM_CALLOC +PERM_FREE +PERM_MALLOC +PERM_REALLOC +PERM_STRDUP +PersistentToDesignObject +PersonalityServices +pFileName +PicEdit +PICEmptyString +PickCustomColor +PickListChange +Pics +PictureChanged +Pie +pieceEnd +pieceStart +PinHitTest +pipebuf_buf2sd +pipebuf_close +pipebuf_getc +pipebuf_grab +pipebuf_netbuf2sd +pipebuf_next +pipebuf_open +PixelsToHimetric +PlaceInCell +Play +PlayEnhMetaFile +PlayEnhMetaFileRecord +PlayMetaFile +PlayMetaFileRecord +PlaySound +PlaySoundA +PlaySoundW +PlgBlt +pmmioinfo +Point +PointerInModule +PointInGridRect +PointInPanel +PointsEqual +PointToLParam +PointToRow +PointToSmallPoint +PokeData +PokeDataLines +Poly +PolyBezier +PolyBezierTo +PolyDraw +Polygon +Polyline +PolyLineTo +PolyPolygon +PolyPolyline +PolyTextOut +PolyTextOutA +PolyTextOutW +PolyX +pool_calloc +pool_create +pool_destroy +pool_enabled +pool_free +pool_life +pool_malloc +pool_max +pool_maxthreads +pool_min +pool_minthreads +pool_realloc +pool_strdup +Pop +PopItem +PopKeyboard +PopnStdDev +PopnVariance +popstack +Populate +PopulateByKey +PopulateByQuery +PopulateFieldList +PopulateList +PopulateMenu +PopulateOle2Menu +PopulateTableList +Popup +PopupComponent +PopupControlProc +PopupVerbMenuClick +PopValue +PortListClick +Pos +PosEqual +PosEx +Position +PositionChanged +PositionDockRect +PositionPopup +PossibleStream +Post +PostAlloc +PostAppMessage +PostAppMessageA +PostAppMessageW +PostClick +PostCopyItem +PostDataChange +PostDeleteItem +PostDidAlloc +PostEvent +PostFree +PostGetSize +PostHeapMinimize +PostKeyBuffer +PostMessage +PostMessageA +PostMessageFilter +PostMessageW +PostMoveItem +PostNewItem +PosToCharPos +PostQueuedCompletionStatus +PostQuitMessage +PostRealloc +PostRefreshTreeView +PostRenameItem +PostThreadMessage +PostThreadMessageA +PostThreadMessageW +Power +prcScreenCoords +pReading +PreAlloc +PrecedingWindow +PreCopyItem +PreDeleteItem +PreDidAlloc +PrefixedTypeName +PreFree +PreGetSize +PreHeapMinimize +PreMessageFilter +PreMoveItem +PreNewItem +Prepare +prepareCM +PrepareCursor +PrepareItem +PrepareMenu +PrepareNewSchema +PrepareProc +PrepareRecord +PrepareRecordVariants +PrepareSQL +PrepareTape +PreparseAttributeDefinitions +PreParseChildElements +PreProcessMessage +PreRealloc +PreRefreshTreeView +PreRenameItem +PresentValue +PreserveNodeStates +PreValidateCodeInsight +PreviewClick +PreviewKeyPress +Previous +PreviousBufferView +previousNode +PreviousSibling +Print +PrintDlg +PrintDlgA +PrintDlgW +Printer +PrinterMessageBox +PrinterMessageBoxA +PrinterMessageBoxW +PrinterProperties +Printers +printf +PrintTo +Prior +PriorError +PrioritySort +PriorPage +PriorRow +private +PrivilegeCheck +PrivilegedServiceAuditAlarm +PrivilegedServiceAuditAlarmA +PrivilegedServiceAuditAlarmW +PrnClose +PrnIgnore +PrnInput +PrnOpen +PrnOutput +PrnOutStr +PrnString +procedure +Process +ProcessAccelItems +ProcessAccels +ProcessAttributes +ProcessCategory +ProcessChildNodes +ProcessClient +ProcessCreated +ProcessDestroyed +ProcessDirective +ProcessExecute +processFile +ProcessFunction +ProcessHorz +ProcessHRC +processingInstruction +processMemory +ProcessMemoryChanged +ProcessMenuChar +ProcessMenuLoop +ProcessMessage +ProcessMessages +ProcessModuleCreated +ProcessModuleDestroyed +ProcessMouseMsg +ProcessObject +ProcessPath +ProcessRequests +ProcessSearchKey +ProcessShutdown +ProcessSoftDist +processSourceCode +ProcessStateChanged +processStream +processString +ProcessTypeInfo +ProcessUpdate +ProcessUpdates +ProcessUrlAction +ProcessUrlActionEx +ProcessVert +processWideString +ProcessWMEnableMessages +ProgIdCompensator +ProgIDFromCLSID +ProgIDToClassID +program +ProgramReset +Progress +ProjectChanged +ProjectClosing +ProjectCreate +ProjectCreateEx +ProjectLoaded +ProjectSaving +PromptAction +PromptDataLinkFile +PromptDataSource +PromptFileName +PromptForFileName +PropDrawName +PropDrawNameRect +PropDrawValue +PropDrawValueRect +property +PropertyCategories +PropertyCategoryList +PropertyChanged +PropertyError +PropertyExists +PropertyNotFound +PropertySheet +PropertySheetA +PropertySheetW +PropInspAPI +PropIsType +PropNameLBDblClick +PROPSETHDR_OSVER_KIND +PROPSETHDR_OSVER_MAJOR +PROPSETHDR_OSVER_MINOR +PropType +ProtectChange +protected +protocol_find_request +protocol_finish_request +protocol_handle_session +protocol_parse_request +protocol_scan_headers +protocol_set_finfo +protocol_set_keepalive_timeout +protocol_start_response +protocol_status +protocol_uri2url +protocol_uri2url_dynamic +Prototype +Prototypes +Provider +ProvidersUpdated +PsAPI +PSEndTransaction +PSExecute +PSExecuteStatement +PSGetAttributes +PSGetCommandText +PSGetCommandTextW +PSGetCommandType +PSGetDefaultOrder +PSGetIndexDefs +PSGetKeyFields +PSGetKeyFieldsW +PSGetParams +PSGetQuoteChar +PSGetQuoteCharW +PSGetTableName +PSGetTableNameW +PSGetUpdateException +PSInTransaction +PSIsSQLBased +PSIsSQLSupported +PSP +PSReset +PSSetCommandText +PSSetParams +PSStartTransaction +PSUpdateRecord +pszShortName +pthread_key_create +pthread_key_delete +pthread_once +pThreadParameter +PtInExpandButton +PtInGripRect +PtInRect +PtInRegion +PtVisible +public +published +PUCS4Chars +PulseEvent +PurgeComm +Push +PushAppData +PushItem +PushKeyboard +Put +put_Bold +put_Charset +put_CommitBatchSize +put_DestPath +put_Italic +put_KeepOriginalFormat +put_Name +put_Size +put_SourcePath +put_Strikethrough +put_Underline +put_Weight +PutADTField +PutArrayField +PutBlank +PutBlob +PutBlobField +PutCalcField +PutConstant +PutConstBCD +PutConstBool +PutConstDate +PutConstDateTime +PutConstFloat +PutConstFMTBCD +PutConstInt +PutConstInt64 +PutConstNode +PutConstSQLTimeStamp +PutConstStr +PutConstTime +PutCurrencyDigit +PutData +PutDataSetField +PutExprNode +PutField +PutFieldNode +PutItemProp +PutNode +PutObject +PutObjectField +PutRecord +PutString +PutStringField +PutTwoBcdDigits +PutVarBytesField +PutWideStringField +pvoid +QualifyTableName +QueryActiveShellView +QueryApplicationFile +QueryChanged +QueryContextMenu +QueryContinueDrag +QueryCustomPolicy +QueryDosDevice +QueryDosDeviceA +QueryDosDeviceW +QueryGetData +QueryInterface +QueryPathOfRegTypeLib +QueryPerformanceCounter +QueryPerformanceFrequency +QueryPersistenceInterface +QueryRecoveryAgents +QueryRecoveryAgentsA +QueryRecoveryAgentsW +QueryRegKey +QueryService +QueryServiceConfig +QueryServiceConfigA +QueryServiceConfigW +QueryServiceLockStatus +QueryServiceLockStatusA +QueryServiceLockStatusW +QueryServiceObjectSecurity +QueryServiceStatus +QueryStatus +QueryTextMetrics +QueryWorkingSet +Queue +QueueUserAPC +QuickActivate +QuickSort +QuotedStr +QuoteFullName +RadToCycle +RadToDeg +RadToGrad +raise +RaiseCastError +RaiseConversionError +RaiseConversionRegError +RaiseDispError +RaiseError +RaiseException +RaiseGridError +RaiseInvalidOp +RaiseLastOSError +RaiseLastWin32Error +RaiseList +RaiseListError +RaiseNameException +RaiseOverflowError +RandG +Random +RandomFrom +Randomize +RandomRange +RangedCharValue +RangedValue +RangeError +RankineToCelsius +RateResource +RawToDataColumn +RCS +ReActivate +ReactivateAndUndo +Read +ReadArray +ReadAt +ReadAtPos +ReadAttributeSet +ReadBands +ReadBinaryData +ReadBinaryStream +ReadBitmaps +ReadBlobData +ReadBool +ReadBoolean +ReadBuffer +ReadCalculated +ReadChar +ReadClassStg +ReadClassStm +ReadCollection +ReadCols +ReadColumns +ReadColWidths +ReadComponent +ReadComponentRes +ReadComponentResEx +ReadComponentResFile +ReadComponents +ReadConsole +ReadConsoleA +ReadConsoleInput +ReadConsoleInputA +ReadConsoleInputW +ReadConsoleOutput +ReadConsoleOutputA +ReadConsoleOutputAttribute +ReadConsoleOutputCharacter +ReadConsoleOutputCharacterA +ReadConsoleOutputCharacterW +ReadConsoleOutputW +ReadConsoleW +ReadControlName +ReadCurrency +ReadD2Stream +ReadD3Stream +ReadData +ReadDataInner +ReadDataPacket +ReadDate +ReadDateTime +ReadDesignerData +ReadDesignSize +ReadDirectoryChanges +ReadDirectoryChangesW +ReadDirectoryNames +ReadDOMVendor +ReadDouble +ReadEMFStream +ReadError +ReaderSetName +ReadEventLog +ReadEventLogA +ReadEventLogW +ReadExpandedState +ReadFacet +ReadFile +ReadFileEditStyle +ReadFileEx +ReadFileNames +ReadFloat +ReadFmtUserTypeStg +ReadFromStream +ReadGlassFrameBottom +ReadGlassFrameEnabled +ReadGlassFrameLeft +ReadGlassFrameRight +ReadGlassFrameSheetOfGlass +ReadGlassFrameTop +ReadHeight +ReadHorizontalOffset +ReadHWL +ReadIcon +ReadIdent +ReadIgnoreFontProperty +ReadInt64 +ReadInteger +ReadItemData +ReadKey +ReadKeys +ReadLeft +ReadLinkInfo +ReadListBegin +ReadListEnd +ReadLookup +ReadMultiple +ReadName +ReadNodeData +readonly +ReadOnlyField +ReadParamData +ReadPrefix +ReadPrinter +ReadProcessMemory +ReadProperty +ReadPropertyNames +ReadPropValue +ReadRaw +ReadRequired +ReadResHeader +ReadRootComponent +ReadRowHeights +ReadSection +ReadSections +ReadSectionValues +ReadSet +ReadSettings +ReadShortCutText +ReadSignature +ReadSingle +ReadState +ReadStr +ReadString +ReadStyleProp +ReadTextHeight +ReadTime +ReadToolbar +ReadTop +ReadUnNamed +ReadUrlCacheEntryStream +ReadValue +ReadVariant +ReadVerticalOffset +ReadWideChar +ReadWideString +ReadWidth +ReadWMFStream +real +RealChildWindowFromPoint +RealCompare +RealGetWindowClass +RealGetWindowClassA +RealGetWindowClassW +Realign +RealizePalette +REALLOC +ReAllocBuffers +ReallocMemory +RealOp +ReaumurToCelsius +ReBaseImage +RebuildColumns +RebuildHandle +RecalcCellDimensions +Receive +ReceiveBuf +ReceiveComponentNames +ReceiveLength +ReceiveText +RecentlyUsedActnExecute +RecentlyUsedActnUpdate +RecodeDate +RecodeDateTime +RecodeDay +RecodeHour +RecodeMilliSecond +RecodeMinute +RecodeMonth +RecodeSecond +RecodeTime +RecodeYear +Reconcile +Reconcile_MD +ReconcileCallback +record +RecordChangeComplete +RecordChanged +RecordFilter +RecordsetChangeComplete +RecreateAsPopup +RecreateButtons +RecreateButtonsFromToolbar +RecreateControls +RecreateWnd +Rect +Rectangle +RectInRegion +RectVisible +RectWidth +RecurseNode +recv +recvfrom +Recycle +Redirect +RedirectFixupReferences +RedisplayPenData +Redo +RedrawWindow +Reduce +Reference +ReferenceInterface +ReferenceName +ReferencePascalString +ReferenceStrings +refersToExternalEntity +refersToUnparsedEntity +refersToUnusableEntity +refersToXyz +ReformatText +Refresh +RefreshBuffers +RefreshButton +RefreshComponents +RefreshControl +RefreshData +RefreshDefaultFont +RefreshFromADO +RefreshFromOleDB +RefreshIndexFields +RefreshInfo +RefreshInfos +RefreshInternalCalcFields +RefreshItem +RefreshLookupList +RefreshMDIMenu +RefreshParams +RefreshPutProcs +RefreshRecord +RefreshRecords +RefreshRouter +RefreshTreeView +RefreshVisibleData +RegActions +RegCloseKey +RegConnectRegistry +RegConnectRegistryA +RegConnectRegistryW +RegCreateKey +RegCreateKeyA +RegCreateKeyEx +RegCreateKeyExA +RegCreateKeyExW +RegCreateKeyW +RegDataToDataType +RegDeleteKey +RegDeleteKeyA +RegDeleteKeyW +RegDeleteValue +RegDeleteValueA +RegDeleteValueW +RegDisablePredefinedCache +RegEnumKey +RegEnumKeyA +RegEnumKeyEx +RegEnumKeyExA +RegEnumKeyExW +RegEnumKeyW +RegEnumValue +RegEnumValueA +RegEnumValueW +RegFields +RegFlushKey +RegGetKeySecurity +Register +RegisterActions +RegisterActiveObject +RegisterActnBarStyle +RegisterAppInfo +RegisterAsService +RegisterBDEInitProc +RegisterBindStatusCallback +RegisterCallback +RegisterCallbacks +RegisterCategories +RegisterChanges +RegisterChildNode +RegisterChildNodes +RegisterClass +RegisterClassA +RegisterClassAlias +RegisterClasses +RegisterClassEx +RegisterClassExA +RegisterClassExW +RegisterClassImplCategories +RegisterClassObject +RegisterClassReqCategories +RegisterClassW +RegisterClient +RegisterClipboardFormat +RegisterClipboardFormatA +RegisterClipboardFormatW +RegisterColorScheme +RegisterCompensator +RegisterComponentEditor +RegisterComponentGuidelines +RegisterComponents +RegisterComServer +RegisterConversionFamily +RegisterConversionFormat +RegisterConversionType +RegisterCustomModule +RegisterDesignDragObject +RegisterDesignNotification +RegisterDeviceNotification +RegisterDeviceNotificationA +RegisterDeviceNotificationW +RegisterDispenser +RegisterDocBinding +RegisterDockSite +registerDocumentFormat +RegisterDOMVendor +RegisterDragAcceptor +RegisterDragDrop +RegisterDragTarget +Registered +RegisteredActionExecute +RegisterEventSource +RegisterEventSourceA +RegisterEventSourceW +RegisterExpectedMemoryLeak +RegisterExtension +RegisterFields +RegisterFileFormat +RegisterFileFormatRes +RegisterFileSystem +RegisterFindGlobalComponentProc +RegisterFormatEnumerator +RegisterHistoryProvider +RegisterHotKey +RegisterIDropTarget +RegisterIntegerConsts +RegisterInterfaceInGlobal +RegisterLanguage +RegisterLibraryExpert +RegisterMediaTypeClass +RegisterMediaTypes +RegisterMidasLib +RegisterModule +RegisterNoIcon +RegisterNonActiveX +RegisterObjectBound +RegisterObjectParam +RegisterOleObjectEditor +RegisterPackageWizard +RegisterPooled +RegisterPropertiesInCategory +RegisterPropertyEditor +RegisterPropertyInCategory +RegisterPropertyMapper +RegisterProvider +RegisterReader +RegisterRootSprigType +Registers +RegisterSchemaTranslator +RegisterScriptEngine +RegisterSelectionEditor +RegisterServiceCtrlHandler +RegisterServiceCtrlHandlerA +RegisterServiceCtrlHandlerW +RegisterServices +RegisterSprigType +RegisterStandardMenus +RegisterToolbarNotifier +RegisterTypeLib +RegisterTypeLibrary +RegisterViewer +RegisterWindowMessage +RegisterWindowMessageA +RegisterWindowMessageW +RegisterWriter +Registry +RegistryConnect +RegLoadKey +RegLoadKeyA +RegLoadKeyW +RegNotifyChangeKeyValue +RegOpenCurrentUser +RegOpenKey +RegOpenKeyA +RegOpenKeyEx +RegOpenKeyExA +RegOpenKeyExW +RegOpenKeyW +RegOpenUserClassesRoot +RegOverridePredefKey +RegQueryInfoKey +RegQueryInfoKeyA +RegQueryInfoKeyW +RegQueryMultipleValues +RegQueryMultipleValuesA +RegQueryMultipleValuesW +RegQueryValue +RegQueryValueA +RegQueryValueEx +RegQueryValueExA +RegQueryValueExW +RegQueryValueW +RegReplaceKey +RegReplaceKeyA +RegReplaceKeyW +RegRestoreKey +RegRestoreKeyA +RegRestoreKeyW +RegSaveKey +RegSaveKeyA +RegSaveKeyW +RegSetKeySecurity +RegSetValue +RegSetValueA +RegSetValueEx +RegSetValueExA +RegSetValueExW +RegSetValueW +RegStr +RegUnLoadKey +RegUnLoadKeyA +RegUnLoadKeyW +ReIndex +RelativePathTo +Release +ReleaseAccessor +ReleaseBindInfo +ReleaseBitmap +ReleaseBlobs +ReleaseBoundObjects +ReleaseCapture +ReleaseConnection +ReleaseData +ReleaseDC +ReleaseDelphiException +ReleaseDoc +ReleaseErrors +ReleaseException +ReleaseExceptionObject +ReleaseFuncDesc +ReleaseHandle +ReleaseHfont +ReleaseKeepAlive +ReleaseLineDC +ReleaseLock +ReleaseMarshalData +ReleaseMethodPointer +ReleaseMutex +ReleaseObject +ReleaseRows +ReleaseSemaphore +ReleaseSID +ReleaseStgMedium +ReleaseStrings +ReleaseTLibAttr +ReleaseTypeAttr +ReleaseVarDesc +ReloadDockedControl +ReloadFile +ReloadSymbolTable +ReloadTemplate +ReloadTemplates +RelSmall +RemoteLoginDialog +Remove +RemoveAction +RemoveAll +RemoveAllButtonClick +RemoveAllControlItems +RemoveAllPasswords +RemoveAnnotation +removeAttribute +removeAttributeNode +removeAttributeNS +RemoveButton +RemoveButtonClick +removeChild +RemoveChildNode +RemoveClient +RemoveComponent +RemoveContainer +removeContentModel +RemoveContextMenuItem +RemoveControl +RemoveControlItem +RemoveDatabase +RemoveDataLink +RemoveDataModule +RemoveDataSource +RemoveDeclNode +RemoveDesktopItem +RemoveDir +RemoveDirectory +RemoveDirectoryA +RemoveDirectoryW +RemoveDispatch +RemoveEditFormat +RemoveEmpty +RemoveEmptyAutoAddColumns +RemoveEmptyAutoAddRows +removeEntRefSubtree +removeExternalCM +RemoveFields +RemoveFile +RemoveFileFilter +RemoveFileSystem +RemoveFixupReferences +RemoveFixups +RemoveFocus +RemoveFontMemResourceEx +RemoveFontResource +RemoveFontResourceA +RemoveFontResourceEx +RemoveFontResourceExA +RemoveFontResourceExW +RemoveFontResourceW +RemoveForm +RemoveFreeNotification +RemoveHighlighter +RemoveHistoryItem +RemoveHostedNode +RemoveIndex +RemoveInsertionPoints +removeInternalCM +RemoveInvalidSprigs +RemoveItem +RemoveKeyboardBinding +removeLastItem +RemoveManager +RemoveMenu +RemoveMenuCreatorNotifier +RemoveMenuFromList +RemoveMenus +RemoveMenusSB +RemoveMessageGroup +RemoveModuleUnloadProc +removeNamedItem +removeNamedItemNS +RemoveNotification +RemoveNotifier +RemoveObjectFactory +RemoveOffset +RemovePage +RemovePaletteState +RemoveParam +RemovePassword +RemovePenDataStrokes +RemovePluginInfo +RemovePoint +RemovePopupForm +RemovePortActionExecute +RemovePortActionUpdate +RemovePrivateCvSymbolic +RemoveProcess +RemoveProductInfo +RemoveProject +RemoveProp +RemovePropA +RemovePropW +removeQualifiedItem +RemoveQueuedEvents +RemoveRelocations +RemoveRootNode +removes +RemoveServerConv +RemoveSink +RemoveSpeedSetting +RemoveSuffix +RemoveTemplate +RemoveThread +RemoveToolbar +RemoveTypeInfo +RemoveWindowProps +RemoveWindowSubclass +RemoveWizard +Rename +RenameComponent +RenameElement +RenameFields +RenameFile +RenameMethod +RenameTable +RenameValue +Render +ReorderButton +Repaint +Reparent +ReparentChildren +repeat +RepeatLastSearchOrReplace +Replace +ReplaceAgain +ReplaceBest +replaceChild +replaceData +ReplaceDate +ReplaceIcon +ReplaceKey +ReplaceMasked +ReplaceNode +ReplacePage +ReplaceStr +ReplaceText +ReplaceTextA +ReplaceTextW +ReplaceTime +ReplyMessage +Repopulate +ReportEvent +ReportEventA +ReportEventW +ReportStatus +RepositionButton +RepositionButtons +Requery +request_create +request_free +request_handle +request_header +request_loadheaders +request_restart_internal +request_stat_path +request_translate_uri +RequestAlign +RequestBorderSpace +RequestBorderSpaceDW +RequestData +RequestDestroyResource +RequestEdit +RequestLicKey +RequestNewObjectLayout +RequestSize +RequestUIActivate +RequiredState +RequiresUnits +ResemblesText +Reserved1 +Reserved2 +Reserved3 +ReserveZeroPage +Reset +reset2 +ResetActionBar +ResetActnExecute +ResetActnUpdate +ResetAgg +ResetAggField +ResetAlcBitAnsi +ResetAllAggs +ResetAppName +ResetBounds +ResetClientUsageData +ResetColumnFieldBindings +ResetContent +ResetCursorRange +ResetDC +ResetDCA +ResetDCW +ResetDiskAge +ResetDockItems +ResetEvent +ResetExStyles +ResetFonts +ResetGrouping +ResetIme +ResetImeComposition +ResetItemHeight +ResetMaxLength +ResetPassCount +ResetPrinter +ResetPrinterA +ResetPrinterW +ResetResource +ResetSelectedItem +ResetSyncEvent +ResetTimer +ResetToolbar +ResetUsageData +ResetUsageDataActnExecute +ResInstLoad +Resize +ResizeBorder +ResizeBorderDW +ResizeButtons +ResizeCol +ResizeGrid +ResizePalette +ResizePenData +ResizeRow +Resizing +Resolve +resolveAfterAddition +resolveAfterRemoval +ResolveCharRefs +ResolveCharRefsAndPERefs +resolveEntityReferences +ResourceLoad +RestartKeyboardServices +RestartPosition +RestartWinHelp +Restore +RestoreChecks +RestoreContents +RestoreCurrentRow +RestoreDC +RestoreDefaults +RestoreExpandState +RestoreFocusState +RestoreInplaceEditor +RestoreKey +RestoreLocale +RestoreNodeState +RestoreREGDB +RestoreSelection +RestoreState +RestoreTopMosts +result +ResultCode +ResultFacility +ResultFieldListDropDown +ResultSeverity +Resume +ResumePlayback +ResumeRecord +ResumeThread +ResumeTimer +Resurrect +Resync +ResynchRows +ResyncWithMaster +RethinkHotkeys +RethinkLines +RetrieveAttributes +RetrieveUrlCacheEntryFile +RetrieveUrlCacheEntryFileA +RetrieveUrlCacheEntryFileW +RetrieveUrlCacheEntryStream +RetrieveUrlCacheEntryStreamA +RetrieveUrlCacheEntryStreamW +RetryRejectedCall +return +ReturnAddr +ReturnList +returns +ReuseDDElParam +ReverseCalcNumTabs +ReverseNegative +ReverseString +Revert +RevertRecord +RevertTemporaryLabel +RevertToSelf +Revoke +RevokeActiveObject +RevokeBindStatusCallback +RevokeDragDrop +RevokeFormatEnumerator +RevokeInterfaceFromGlobal +RevokeObjectBound +RevokeObjectParam +Rewind +RGB +RGBToWebColorName +RGBToWebColorStr +RGBTripleToQuad +RichEdit +RightBStr +RightPromotion +RightSide +RightStr +RipText +riter +RmDir +rocessorAgent +RollBack +RollbackTrans +RollbackTransComplete +root_object +RootSprig +RootSprigAssigned +RootSprigList +ropInfo +RoundAt +RoundChar +RoundColor +RoundRect +RoundTo +roup1_ID +RowCount +RowHeightsChanged +RowIsMultiSelected +RowMoved +RowRequest +RPR +RTLConsts +RtlUnwind +Run +RunErrorAt +RunProgram +RuntimeChange +RunToCursor +SafeArrayAccessData +SafeArrayAllocData +SafeArrayAllocDescriptor +SafeArrayAllocMem +SafeArrayCalculateElementAddress +SafeArrayCheck +SafeArrayClearDataSpace +SafeArrayCopy +SafeArrayCopyData +SafeArrayCopyDataSpace +SafeArrayCreate +SafeArrayCreateError +SafeArrayCreateEx +SafeArrayCreateVector +SafeArrayCreateVectorEx +SafeArrayDestroy +SafeArrayDestroyData +SafeArrayDestroyDescriptor +SafeArrayElementStyle +SafeArrayElementTotal +SafeArrayError +SafeArrayFreeMem +SafeArrayGetDim +SafeArrayGetElement +SafeArrayGetElemSize +SafeArrayGetLBound +SafeArrayGetUBound +SafeArrayLock +SafeArrayPtrOfIndex +SafeArrayPutElement +SafeArrayReallocMem +SafeArrayRedim +SafeArrayUnaccessData +SafeArrayUnlock +SafeArrayValidate +SafeArrayValidateAndCalculateAddress +SafeCallError +SafeCallException +SafeLoadLibrary +SafeRef +SameAs +SameContext +SameDate +SameDateTime +SameFileName +SameNamespace +SameStr +SameSymbol +SameText +SameTime +SameValue +SameView +Save +SaveAll +SaveAllChanges +SaveAs +SaveAsDocument +SaveAsFile +SaveAttributes +SaveAttributesAs +SaveAttributesAsDlg +SaveButtons +SaveChanges +SaveChecks +SaveClick +SaveClipboard +SaveCommand +SaveCompleted +SaveConfigFile +SaveCustomColors +SaveDataPacket +SaveDC +SaveFile +SaveFocusState +SaveHiddenCategories +SaveKey +SaveObject +SaveProject +SaveRecreateItems +saveregisters +SaveRuntimeState +SaveSelection +SaveTemplate +SaveTemplates +SaveToClipboardFormat +SaveToFile +SaveToStream +SaveToStreamPersist +SaveToStrings +SaveToUTF8String +SaveToXML +SaveToXMLStrings +SaveTreeToStream +SaveViewState +SaveWindowState +Saving +ScaleBy +ScaleControls +ScaleImage +ScaleScrollBars +ScaleViewportExtEx +ScaleWindowExtEx +ScanSet +ScheduleJob +SchemaObject +SchemaParseError +SchemaValidationError +ScktCnst +ScktComp +ScktMain +SConnect +Score +ScreenHeight +ScreenToClient +ScreenWidth +Scroll +ScrollBarVisible +ScrollBtnClick +ScrollBy +ScrollClick +ScrollConsoleScreenBuffer +ScrollConsoleScreenBufferA +ScrollConsoleScreenBufferW +ScrollData +ScrollDataInfo +ScrollDC +ScrollerShown +ScrollerSize +ScrollIntoView +ScrollInView +ScrollMessage +ScrollPosChanged +ScrollRect +ScrollRectIntoView +ScrollTabs +ScrollWindow +ScrollWindowEx +Search +SearchAgain +SearchBuf +SearchEdit +SearchFileNameFromIndex +SearchLinkedSchemas +SearchPath +SearchPathA +SearchPathW +SearchRec +SearchSiblingSchemas +SearchTreeForFile +Sec +Secant +SecH +SECOND_IPADDRESS +SecondOf +SecondOfTheDay +SecondOfTheHour +SecondOfTheMinute +SecondOfTheMonth +SecondOfTheWeek +SecondOfTheYear +SecondsBetween +SecondSpan +SectionClick +SectionDrag +SectionEndDrag +SectionExists +SectionResize +SectionTrack +Seek +SeekParent +segment +Select +SelectAll +SelectAll1Click +SelectAllCommandUpdate +SelectAllItemClick +SelectAndPositionItem +SelectCategory +SelectCell +SelectClipPath +SelectClipRgn +SelectComponent +SelectContext +SelectCurrent +SelectDirCB +SelectDirectory +SelectedSprig +SelectedToolChanged +SelectFirst +Selection +SelectionChange +SelectionChanged +SelectionMessageListOf +SelectionMoved +SelectionSurvey +SelectionUpdate +SelectItem +SelectItemAt +SelectItemName +SelectItems +SelectKeyValue +SelectKeyword +SelectLocked +SelectNext +SelectNextPage +SelectNextTab +SelectNode +selectNodes +SelectNone +SelectObject +SelectObjects +SelectPalette +SelectPicture +selectSingleNode +SelectTable +self +sem_grab +sem_init +sem_release +sem_terminate +sem_tgrab +Send +SendBuf +SendCancelMode +SendConnectEvent +SendControlMsg +SendDlgItemMessage +SendDlgItemMessageA +SendDlgItemMessageW +SendDriverMessage +sender +sendErrorNotification +SendFocusMessage +SendInput +SendMessage +SendMessageA +SendMessageCallback +SendMessageCallbackA +SendMessageCallbackW +SendMessageTimeout +SendMessageTimeoutA +SendMessageTimeoutW +SendMessageW +SendNotifyMessage +SendNotifyMessageA +SendNotifyMessageW +SendOnClose +SendOnDataChange +SendOnRename +SendOnSave +SendReceive +SendStream +SendStreamPiece +SendStreamThenDrop +SendText +sendto +SendToParent +separate +SeparatorBtnStartDrag +server_enterprise +server_fasttrack +server_hostname +server_id +server_root +ServerCallback +ServerFillBuffer +ServerGetSize +ServerNotify +ServiceCheck +ServiceController +ServiceMain +session_create +session_dns +session_dns_lookup +session_free +session_maxdns +SessionNameStored +set +Set_AbsolutePage +Set_AbsolutePosition +Set_accName +Set_accValue +Set_ActiveConnection +Set_async +Set_Attributes +Set_Bookmark +Set_Buffer +Set_CacheControl +Set_CacheSize +Set_Chapter +Set_CharSet +Set_CodePage +Set_Collect +Set_CommandText +Set_CommandTimeout +Set_CommandType +Set_ConnectionString +Set_ConnectionTimeout +Set_Constraints +Set_ContentType +Set_ControlDefault +Set_CursorLocation +Set_CursorType +Set_Data +Set_DataFormat +Set_DataMember +Set_DataSource +Set_dataType +Set_DefaultDatabase +Set_DefinedSize +Set_Direction +Set_documentElement +Set_Domain +set_Encoding +Set_Expanded +Set_Expires +Set_ExpiresAbsolute +Set_Filter +Set_Focused +set_hPal +Set_Index +Set_input +Set_InternetTimeout +Set_IsolationLevel +Set_Item +Set_JavaDSOCompatible +Set_LCID +Set_length +Set_LockType +Set_MarshalOptions +Set_MaxRecords +Set_Mode +Set_Name +Set_nodeTypedValue +Set_nodeValue +Set_NumericScale +Set_OLEDBCommand +set_OnAsyncLoad +Set_ondataavailable +Set_onreadystatechange +Set_ontransformnode +Set_output +Set_PageSize +Set_Path +Set_Precision +Set_Prepared +Set_preserveWhiteSpace +Set_Provider +Set_resolveExternals +Set_RowPosition +Set_Rowset +Set_ScriptTimeout +Set_Secure +Set_Selected +Set_Size +Set_Sort +Set_Source +set_Standalone +Set_Status +Set_StayInSync +Set_tagName +Set_text +Set_Timeout +Set_Type_ +Set_url +set_validate +Set_validateOnParse +Set_Value +set_Version +Set_XMLDocument +Set8087CW +SetAbort +SetAbortProc +SetAbstract +SetAclInformation +SetAction +SetActionBar +SetActionBars +SetActionClient +SetActionComponent +SetActionList +SetActionManager +SetActive +SetActiveActionList +SetActiveControl +SetActiveItem +SetActiveMenu +SetActiveObject +SetActiveOleControl +SetActivePage +SetActivePageIndex +SetActiveProject +SetActiveRecord +SetActiveUpdateException +SetActiveWindow +SetAddress +SetAdvise +SetAggregates +SetAggsActive +SetAlcBitAnsi +SetAliasName +SetAlign +SetAlignButton +SetAlignment +SetAllColors +SetAllocBy +SetAllowAllUp +SetAllowCreate +SetAllowTextButtons +SetAlphabetHRC +SetAlphabetPriorityHRC +SetAlphaBlend +SetAlphaBlendValue +SetAlternateDockHost +SetAltRecBuffers +SetAncestor +SetAnimate +SetAnimateDuration +SetAnimateInterval +SetAnimateParams +SetAnimation +SetAppletIcon +SetApplicationMainFormOnTaskBar +SetAppName +SetAppServer +SetArcDirection +SetArguments +SetArrangement +SetArrangeMode +SetArrowKeys +SetArrowSize +SetArrowType +SetAsBCD +SetAsBlob +SetAsBoolean +SetAsByteArray +SetAsCurrency +SetAsDate +SetAsDateTime +SetAsDouble +SetAsFloat +SetAsFMTBCD +SetAsGuid +SetAsHandle +SetAsInteger +SetAsLargeint +SetAsMemo +SetAsPolar +SetAsSmallInt +SetAssociate +SetAsSQLTimeStamp +SetAsString +SetAsText +SetAsTime +SetAsVariant +SetAsWideString +SetAsWord +SetAsyncStyles +SetAttribute +SetAttributeformDefault +setAttributeNode +setAttributeNodeNS +SetAttributeNodes +SetAttributeNS +SetAttributes +SetAuthor +SetAutoArrange +SetAutoCheck +SetAutoCompleteKey +SetAutoCompleteOptions +SetAutoDisplay +SetAutoEnable +SetAutoExpand +SetAutoGenerateValue +SetAutoHotKeys +SetAutoIndent +SetAutoLineReduction +SetAutoMerge +SetAutoRefresh +SetAutoScroll +SetAutoSessionName +SetAutoSize +SetAutoSizing +SetAutoSubClass +SetAutoWrap +SetAxBorderStyle +SetBackGradientDirection +SetBackground +SetBackgroundColor +SetBackgroundGradientColor +SetBackgroundLayout +SetBackspaceUnindents +SetBalloonHint +SetBalloonTimeout +SetBalloonTitle +SetBandBorderStyle +SetBandMaximize +SetBands +SetBaseName +SetBaseTypeName +SetBevel +SetBevelCut +SetBeveled +SetBevelEdges +SetBevelInner +SetBevelKind +SetBevelOuter +SetBevelWidth +SetBiDiMode +SetBiDiModeFromPopupControl +SetBindOptions +SetBit +SetBitmap +SetBitmapBits +SetBitmapDimensionEx +SetBkColor +SetBkMode +SetBlobData +SetBlobType +SetBlockAfter +SetBlockIndent +SetBlockReadSize +SetBlockStart +SetBlockType +SetBlockVisible +SetBookmarkData +SetBookmarkFlag +SetBookmarkStr +SetBoolProp +SetBorderIcons +SetBorderSpace +SetBorderSpaceDW +SetBorderStyle +SetBorderWidth +SetBounded +SetBounds +SetBoundsRect +SetBoxAlphabetHRC +SetBreak +SetBrokerName +SetBrowseDlg +SetBrowseOptions +SetBrush +SetBrushOrgEx +SetBucketCount +SetBuffer +SetBufferCount +SetBufListSize +SetButtonCategories +SetButtonCount +SetButtonFlow +SetButtonHeight +SetButtons +SetButtonSize +SetButtonState +SetButtonStyle +SetButtonWidth +SetByteProp +SetCachedUpdates +SetCacheSize +SetCalAlignment +SetCalColors +SetCalculated +SetCanClose +SetCapacity +SetCaption +SetCaptionOptions +SetCapture +SetCardinality +SetCaretBlinkTime +SetCaretPos +SetCaseInsFields +SetCaseSensitive +SetCatButtonOptions +SetCategory +SetCBInfo +SetCBreak +SetCell +SetCells +SetCenter +SetChangeDelay +SetChangesAllowed +SetCharCase +SetCharset +SetCheckboxes +SetCheckButtonState +SetChecked +SetChildDefs +SetChildNodes +SetChildOrder +SetChildren +SetChildValue +SetClass +SetClassLong +SetClassLongA +SetClassLongW +SetClassName +SetClassWord +SetClearVarToEmptyParam +SetClientGuid +SetClientHeight +SetClientSite +SetClientType +SetClientWidth +SetClipboard +SetClipboardData +SetClipboardViewer +SetCode +SetCol +SetColCount +SetCollapsed +SetCollectedProperties +SetCollection +SetCollectionPropertyName +SetColOptions +SetColor +SetColorAdjustment +SetColored +SetColorMap +SetColorProp +SetColorScheme +SetColorSpace +SetCols +SetColumn +SetColumnAttributes +SetColumnClick +SetColumnCollection +SetColumnHeaders +SetColumns +SetColumnSpan +SetColumnTitles +SetColumnWidth +SetColWidths +SetComandType +SetComboText +SetComCtlStyle +SetCommandText +SetCommandTimeOut +SetCommandType +SetCommaText +SetCommBreak +SetCommConfig +SetCommMask +SetCommonAVI +SetCommState +SetCommTimeouts +SetComplete +SetComponent +SetComponentIndex +SetComponentName +SetCompProp +SetComputerName +SetComputerNameA +SetComputerNameW +SetConfigMode +SetConfigParams +SetConnected +SetConnection +SetConnectionBroker +SetConnectionFlag +SetConnectionObject +SetConnectionString +SetConnectionTimeout +SetConnectMode +SetConnectOptions +SetConnectStatus +SetConnectType +SetConsoleActiveScreenBuffer +SetConsoleCP +SetConsoleCtrlHandler +SetConsoleCursorInfo +SetConsoleCursorPosition +SetConsoleMode +SetConsoleOutputCP +SetConsoleScreenBufferSize +SetConsoleTextAttribute +SetConsoleTitle +SetConsoleTitleA +SetConsoleTitleW +SetConsoleWindowInfo +SetConstraints +SetContainedObject +SetContent +SetContentExtent +SetContentModel +SetContext +SetContextItems +SetControl +SetControlBounds +SetControlCollection +SetControlIndex +SetControlItemState +SetControlItemText +SetControlLabel +SetControlState +setConvertBufSize +SetConvertStg +SetCornerEdge +SetCount +SetCreateBackupFile +SetCriticalSectionSpinCount +setCssText +SetCtl3D +SetCtl3DButton +SetCurItem +SetCurrency +SetCurrencyProp +SetCurrentDir +SetCurrentDirectory +SetCurrentDirectoryA +SetCurrentDirectoryW +SetCurrentKey +setCurrentNode +SetCurrentProcess +SetCurrentRecord +SetCurrentRowSelected +SetCurrentSession +SetCurrentSubItem +SetCurrentThread +SetCursor +SetCursorLocation +SetCursorPos +SetCursorRange +SetCursors +SetCursorThroughTabs +SetCursorType +SetCustData +SetCustomColors +SetCustomColorsArray +SetCustomConstraint +SetCustomFooterIcon +SetCustomForm +SetCustomFormGlassFrame +SetCustomizable +SetCustomMainIcon +SetCut +SetData +SetDatabaseFlags +SetDatabaseName +SetDatabaseType +SetDataField +SetDataFieldName +SetDataSet +SetDataSetField +SetDataSize +SetDataSource +SetDataType +SetDataTypeName +SetDate +SetDateFormat +SetDateMode +SetDateTime +SetDay +SetDBFlag +SetDCBrushColor +SetDCPenColor +SetDdeClientConv +SetDdeClientItem +SetDdeService +SetDdeTopic +SetDeactivateOnReturn +SetDebugErrorLevel +SetDefAttributes +SetDefault +SetDefaultButton +SetDefaultColorColor +SetDefaultColWidth +SetDefaultCommConfig +SetDefaultCommConfigA +SetDefaultCommConfigW +SetDefaultDatabase +SetDefaultExtension +SetDefaultFields +SetDefaultFilter +SetDefaultFolder +SetDefaultIcon +SetDefaultKeyProc +SetDefaultRowHeight +SetDelimitedText +SetDelimiter +SetDependencies +SetDerivationMeth +SetDerivationMethod +SetDescFields +SetDescription +SetDesigner +SetDesignerModified +SetDesigning +SetDesignInstance +SetDesignMode +SetDesignVisible +SetDesktopItemOptions +SetDestDockSite +SetDestination +SetDetailFilter +SetDeviceGammaRamp +SetDeviceType +SetDialogHandle +SetDIBColorTable +SetDIBits +SetDIBitsToDevice +SetDir +SetDirection +SetDirectory +SetDirLabel +SetDirLabelCaption +SetDirListBox +setDisabled +SetDisabledImageList +SetDisabledImages +SetDisableGroup +SetDisableStringTrim +SetDispatchPropValue +SetDispID +SetDisplay +SetDisplayErrorDlg +SetDisplayFormat +SetDisplayLabel +SetDisplayName +SetDisplayOptions +SetDisplayRect +SetDisplayValue +SetDisplayValues +SetDisplayWidth +SetDitherBackground +SetDlgItemInt +SetDlgItemText +SetDlgItemTextA +SetDlgItemTextW +SetDoBreak +SetDocElementDef +SetDockSite +SetDocString +SetDocumentElement +SetDoHandleExceptions +SetDoIgnoreExceptions +SetDOMDocument +setDomImpl +SetDOMImplementation +SetDOMVendor +SetDoubleClickTime +SetDoubleProp +SetDown +SetDragButton +SetDragCursor +SetDragImage +SetDragIndex +SetDragMode +SetDragReorder +SetDragScroll +SetDrawAspect +SetDrawingStyle +SetDrive +SetDriverName +SetDropDownCount +SetDropdownMenu +SetDropDownRows +SetDroppedDown +SetDropPoint +SetDropTarget +SetDSWriter +SetDynArrayProp +SetEdgeBorders +SetEdgeInner +SetEdgeOuter +SetEdges +SetEditable +SetEditBoxText +SetEditFormat +SetEditing +SetEditMask +SetEditMode +SetEditorMode +SetEditorOpts +SetEditReadOnly +SetEditRect +SetEditStyle +SetEditText +SetElementformDefault +SetElementTimes +SetElevationRequired +SetEllipsisPosition +SetEnabled +SetEnabledButtons +SetEnableDropdown +SetEnableGroup +SetEncoding +SetEncodingLevel +SetEncodings +SetEndDate +SetEndMargin +SetEndOfFile +SetEnhMetaFileBits +SetEntriesInAcl +SetEntriesInAclA +SetEntriesInAclW +SetEnumAllWindowsOnActivateHint +SetEnumProp +SetEnvironmentVariable +SetEnvironmentVariableA +SetEnvironmentVariableW +SetErrorInfo +SetErrorMessage +SetErrorMode +SetErrorProc +SetEvalExpression +SetEvent +SetExceptionHandler +SetExceptionMask +SetExceptionMessage +SetExclusive +SetExecuteOptions +SetExecution +SetExpanded +SetExpandedItems +SetExpandedState +SetExpandedText +SetExpression +SetExprParams +SetExtendedFrame +SetExtendedSelect +SetExtensions +SetExtent +setExternalCM +SetFAttr +SetFavoriteLinks +SetField +SetFieldCalculation +SetFieldClass +SetFieldData +SetFieldDef +SetFieldDefs +SetFieldIndex +SetFieldKind +SetFieldName +SetFieldNames +SetFields +SetFieldType +SetFieldValue +SetFileApisToANSI +SetFileApisToOEM +SetFileAttributes +SetFileAttributesA +SetFileAttributesW +SetFileEdit +SetFileListBox +SetFileName +SetFileNameLabel +SetFilePointer +SetFileSecurity +SetFileSecurityA +SetFileSecurityW +SetFileSystem +SetFileTime +SetFileType +SetFileTypeIndex +SetFileTypes +SetFillSize +SetFilter +SetFilterData +SetFiltered +SetFilterGroup +SetFilterHandle +SetFilterOptions +SetFilterText +SetFinal +SetFindText +SetFirstDayOfWeek +SetFirstIndent +SetFirstIndex +SetFixed +SetFixedBackground +SetFixedColor +SetFixedCols +SetFixedOrder +SetFixedRows +SetFixedSize +SetFlags +SetFlat +SetFlatScrollBars +SetFloatProp +SetFloatValue +SetFlowStyle +SetFMTBcd +SetFocus +SetFocusControl +SetFocused +SetFocusedControl +SetFocusedItem +SetFolder +SetFont +SetFontColor +SetFontName +SetFontOrientation +SetFontSize +SetFontStyle +SetFooterIcon +SetFooterText +SetForceCutCopyEnabled +SetForegroundWindow +SetForm +SetFormA +SetFormat +SetFormatChars +SetFormChoice +SetFormDefaults +SetFormStyle +SetFormW +SetFound +SetFractionalDigits +SetFractions +SetFrequency +SetFrom +SetFromCursor +SetFTime +SetFullDrag +SetFuncAndParamNames +SetFuncCustData +SetFuncDocString +SetFuncHelpContext +SetFuncHelpStringContext +SetGetSocketEvent +SetGetThreadEvent +SetGlassFrame +SetGlyph +SetGlyphLayout +SetGoodIndex +SetGradientColor +SetGradientDirection +SetGradientDrawingOptions +SetGradientEndColor +SetGradientStartColor +SetGraphic +SetGraphicsMode +SetGrid +SetGridLines +SetGridLineWidth +SetGrouped +SetGroupIndex +SetGroupingLevel +SetGroupName +SetGroupUndo +SeTGrpButtonItems +SetGrpButtonOptions +SetGUID +SetGuideHRC +SetHandle +SetHandleCount +SetHandleInformation +SetHeader +SetHeaderBackgroundColor +SetHeaderColor +SetHeaderValue +SetHeight +SetHelp +SetHelpContext +SetHelpFile +SetHelpFileName +SetHelpKeyword +SetHelpName +SetHelpStringContext +SetHelpStringDll +SetHelpType +SetHiddenFields +SetHideClippedButtons +SetHideScrollBars +SetHideSelection +SetHideUnused +SetHighlightCurrentLine +SetHighlighted +SetHint +SetHintColor +SetHintFont +SetHints +SetHintShortCuts +SetHintText +SetHistoryList +SetHmenuProp +SetHmenuPropServer +SetHmenuPropStr +SetHorizontalOnly +SetHorzMargin +SetHorzScrollBar +SetHorzSeparator +SetHost +SetHostNames +SetHotButtonColor +SetHotImageList +SetHotImages +SetHotKey +SetHotTrack +SetHotTrackStyles +SetHour +SetHoverTime +SetHwndProp +SetHwndPropServer +SetHwndPropStr +SetICMMode +SetICMProfile +SetICMProfileA +SetICMProfileW +SetIcon +SetIconFont +SetIconic +SetIconIndex +SetIconList +SetIconLocation +SetIconOptions +SetID +SetIDispatchProp +SetIDList +SetIgnoreException +SetImage +SetImageConfigInformation +SetImageIndex +SetImageList +SetImages +SetImaginary +SetIme +SetImeCompositionWindow +SetImeMode +SetImeName +SetImplTypeCustData +SetImplTypeFlags +SetImportedConstraint +SetImportedNamespaces +SetInActive +SetInch +SetIncludeObjectField +SetIncrement +SetIndent +SetIndeterminate +SetIndex +SetIndexDef +SetIndexDefs +SetIndexField +SetIndexFieldNames +SetIndexFiles +SetIndexName +SetIndexOf +SetInitialDir +SetInitialPageNum +SetInitialState +SetInline +SetInOutRes +SetInPlaceSite +SetInsertionButton +SetInsertionPoints +SetInsertMode +SetInt64Prop +SetInt64Value +SetIntegerProp +SetIntegralHeight +SetInteractive +SetInterceptGUID +SetInterceptName +SetInterfaceProp +SetInterfaceSafetyOptions +setInternalCM +SetInternationalHRC +SetInterval +SetIntfValue +SetIntVec +SetInvalidCharacterException +SetInvalidKeys +SetInvokeKind +SetIsControl +SetIsDefault +SetIsDirty +SetIsolationLevel +SetIsReadOnly +setIsUnusable +SetItem +SetItemData +SetItemEnabled +SetItemHeight +SetItemIndex +SetItemName +SetItems +SetItemSelection +SetItemsEx +SetItemType +SetItemValue +SetIUnknownProp +SetJob +SetJobA +SetJobW +SetKeepConnection +SetKeepTrailingBlanks +SetKernelObjectSecurity +SetKey +SetKeyboardState +SetKeyBuffer +SetKeyDesc +SetKeyExclusive +SetKeyFieldCount +SetKeyFieldName +SetKeyFields +SetKeyOptions +SetKeyTracing +SetKeyValue +SetKeywords +SetKind +SetLabelPosition +SetLabelSpacing +SetLanguage +SetLargeButtons +SetLargeImages +SetLastError +SetLastErrorEx +SetLastSession +SetLayeredAttribs +SetLayeredWindowAttributes +SetLayout +SetLcid +SetLeft +SetLeftCol +SetLeftGutterWidth +SetLeftIndent +SetLength +SetLevel +SetLibFlags +SetLineBreak +SetLineBreakStyle +SetLineNum +SetLineNumber +SetLines +SetLineSize +SetLineStyle +SetLink +SetLinkedActionLists +SetLinkRanges +SetLinkSource +SetLinkUpdateOptions +SetList +SetListColumns +SetListControl +SetListFieldName +SetListItem +SetListitems +SetListSource +SetLocale +SetLocaleInfo +SetLocaleInfoA +SetLocaleInfoW +SetLocalTime +SetLocation +SetLockType +SetLogChanges +SetLogControl +SetLogControlVariants +SetLogFileName +SetLogMessage +SetLogResult +SetLongStrProp +SetLookup +SetLookupCache +SetLookupDataSet +SetLookupDisplay +SetLookupField +SetLookupKeyFields +SetLookupMode +SetLookupResultField +SetLookupSource +SetMailslotInfo +SetMainFormOnTaskBar +SetMainIcon +SetManualCompleteKey +SetMapMode +SetMapperFlags +SetMappings +SetMargin +SetMargins +SetMarked +SetMarqueeSpeed +SetMarshalOptions +SetMask +SetMaskColor +SetMasterFields +SetMax +SetMaxDate +SetMaxExclusive +SetMaxInclusive +SetMaxLength +SetMaxOccurs +SetMaxRecords +SetMaxResultsHRC +SetMaxSelectRange +SetMaxValue +SetMaxWidth +SetMemberTypes +SetMemoryManager +SetMenu +SetMenuContextHelpId +SetMenuDefaultItem +SetMenuFont +SetMenuIndex +SetMenuInfo +SetMenuItem +SetMenuItemBitmaps +SetMenuItemInfo +SetMenuItemInfoA +SetMenuItemInfoW +SetMenuSB +SetMergeIndex +SetMessageExtraInfo +SetMessageQueue +SetMetafile +SetMetaFileBitsEx +SetMetaRgn +SetMethodProp +SetMethodValue +SetMin +SetMinDate +SetMinExclusive +SetMinHeight +SetMinimumBlockAlignment +SetMinInclusive +SetMinLength +SetMinOccurs +SetMinute +SetMinValue +SetMinWidth +SetMiterLimit +SetMixed +SetMMHeight +SetMMWidth +SetMode +SetModified +SetModifiedState +SetModifiers +SetModifyTime +SetModule +SetModuleCount +SetModules +SetMoniker +SetMonth +SetMonthDelta +SetMops +SetMouseControl +SetMultiByteConversionCodePage +SetMultiLine +SetMultiSelect +SetMultiSelectStyle +SetMyTransactionVote +SetName +setNamedItem +setNamedItemNS +SetNamedPipeHandleState +SetNamedSecurityInfo +SetNamedSecurityInfoA +SetNamedSecurityInfoW +SetNameOf +setNamespaceAware +SetNameValueSeparator +SetNetFileDir +SetNewDimensions +SetNewValue +setNextHandlers +SetNodeIndentStr +SetNodeOp +SetNodeValue +SetNoneColorColor +SetNotify +SetNotifyCallBack +SetNumbering +SetNumCopies +SetNumeric +SetNumericScale +SetNumGlyphs +SetObjectAccessRights +SetObjectBroker +SetObjectMenuItem +SetObjectOwner +SetObjectProp +SetObjectRects +SetObjects +SetObjectView +SetOEMConvert +SetOffset +SetOkButtonLabel +SetOle2MenuHandle +SetOleBoolProp +SetOleDateProp +SetOleEnumProp +SetOleVariantProp +SetOnAsyncLoad +SetOnClick +SetOnClientError +SetOnClientEvent +SetOnContinue +SetOnDrawButton +SetOnDrawIcon +SetOnDrawPanel +SetOnDrawSection +SetOnEditButtonClick +SetOnExecute +SetOnFilterRecord +SetOnPause +SetOnSectionClick +SetOnSectionResize +SetOnSectionTrack +SetOnStop +SetOnStringsChange +SetOnStringsChanging +SetOnThreadEnd +SetOnThreadStart +SetOnTimer +SetOnUpdateError +SetOpen +SetOptionalParam +SetOptions +SetOptionsName +SetOptionValue +SetOrdered +SetOrdProp +SetOrdValue +SetOrientation +SetOrigDisplay +SetOTAXMMRegisters +SetOutlineOptions +SetOutlineStyle +SetOverlayImageIndex +SetOverlayIndex +SetOverLoad +SetOverwriteBlocks +SetOwner +SetOwnerData +SetOwnerDraw +SetPackageName +SetPadding +SetPageControl +SetPageIndex +SetPages +SetPageSite +SetPageSize +SetPalette +SetPaletteEntries +SetPanCursor +SetPanelBorder +SetPanelHeight +SetPanelIndex +SetPanels +SetPanelWidth +SetPanInterval +SetParamCheck +SetParamCustData +setParameter +SetParameterDirection +SetParameterInfo +SetParameters +SetParams +SetParamsFromCursor +SetParamsList +SetParamType +SetParamValue +SetParent +SetParentBackground +SetParentBiDiMode +SetParentBitmap +SetParentColor +SetParentComponent +SetParentConnection +SetParentControl +SetParentCtl3D +SetParentField +SetParentMenu +SetParentNode +SetParentWindow +SetParseInput +SetParseOptions +SetPassCount +SetPassword +SetPasswordChar +SetPath +SetPattern +SetPen +SetPenAppFlags +SetPendingClearSelection +SetPenMiscInfo +SetPenPos +SetPersistentBlocks +SetPersistentHotKeys +SetPickList +SetPicture +SetPinnedWindow +SetPitch +SetPixel +SetPixelFormat +SetPixelsPerInch +SetPixelV +SetPlainText +SetPlaybackObject +SetPointer +SetPolicy +SetPolyFillMode +SetPopupMenu +SetPopupMode +SetPopupParent +SetPopupPoint +SetPort +SetPortA +SetPortW +SetPos +SetPosition +SetPositionToolTip +SetPrecision +SetPrecisionMode +setPredefinedEntities +setPrefix +SetPrepare +SetPrepared +SetPreserveLineEnds +SetPrinter +SetPrinterA +SetPrinterCapabilities +SetPrinterData +SetPrinterDataA +SetPrinterDataW +SetPrinterIndex +SetPrinterW +SetPriority +SetPriorityClass +SetPrioritySchedule +SetPrivateDir +SetPrivateObjectSecurity +SetPrivateObjectSecurityEx +SetProcessAffinityMask +SetProcessPriorityBoost +SetProcessShutdownParameters +SetProcessState +SetProcessWindowStation +SetProcessWorkingSetSize +SetProcName +SetProductIcon +SetProjectDependencies +SetPrologValue +SetPromptOnReplace +SetProp +SetPropA +SetPropByName +SetPropDisplayString +SetPropEntry +SetProperties +SetProperty +SetPropertyEditorGroup +SetProportional +SetPropServer +SetPropValue +SetPropW +SetProtected +SetProvider +SetProviderEOF +SetProviderName +SetPSResult +SetPublicID +SetPushRate +SetQuery +SetQueryParams +SetQuoteChar +SetRadioButtons +SetRadioItem +SetRaggedRight +SetRaiseList +SetRange +SetRangeEnd +SetRangeStart +SetRatio +SetRDSConnection +SetReadOnly +SetReal +SetRecNo +SetRecordObject +SetRecordset +SetRect +SetRectComplex +SetRectEmpty +SetRectRgn +SetRef +SetReference +setReferenceNode +SetReferences +SetReferent +SetRefItem +SetRefName +SetRegularButtonColor +SetRegularExpression +SetRelativePath +SetRemoteServer +SetRepetitions +SetReplaceAll +SetReplaceText +SetReplacingControl +setRequestHeader +SetRequired +SetResHandle +SetResId +SetResidIcon +SetResidInfo +SetResidName +SetResName +SetResolveToDataSet +SetResultsHookHREC +SetRichEditStrings +SetRightIndent +SetRightMargin +SetRoot +SetRootKey +SetRootSprig +SetRootStyle +SetROP2 +SetRoundMode +SetRow +SetRowCollection +SetRowCount +SetRowFromNode +SetRowHeight +SetRowHeights +SetRowPosition +SetRows +SetRowSelect +SetRowSize +SetRowSnap +SetRowSpan +SetSafeCallExceptionAddr +SetSafeCallExceptionMsg +SetSaveAsItem +SetSaveFileName +SetSavePoint +SetScaled +SetSchema +SetSchemaDef +SetSchemaLocation +SetScript +SetScriptLanguage +SetScrollBars +SetScrollInfo +SetScrollOpposite +SetScrollOrientation +SetScrollPos +SetScrollRange +SetScrollWidth +SetSearchText +SetSecond +SetSecondaryShortCuts +SetSections +SetSecurityDescriptorControl +SetSecurityDescriptorDacl +SetSecurityDescriptorGroup +SetSecurityDescriptorOwner +SetSecurityDescriptorSacl +SetSecurityInfo +SetSecuritySite +SetSel +SetSelAttributes +SetSelected +SetSelectedBit +SetSelectedButtonColor +SetSelectedColor +SetSelectedControlItem +SetSelectedField +SetSelectedImageIndex +SetSelectedIndex +SetSelectedItem +SetSelectedRange +SetSelectedTool +SetSelection +SetSelections +SetSelEnd +SetSelLength +SetSelStart +SetSelText +SetSelTextBuf +SetServerConv +SetServerData +SetServerGUID +SetServerName +SetServerParams +SetServers +SetServerType +SetService +SetServiceObjectSecurity +SetServiceStartName +SetServiceStatus +SetSessionName +SetSessionNames +SetSetProp +SetShadow +SetShadows +SetShape +SetSheetOfGlass +SetShortCut +SetShortIntProp +SetShortStrProp +SetShortStrPropAsLongStr +SetShowAccelChar +SetShowCaption +SetShowCaptions +SetShowCheckbox +SetShowCmd +SetShowGlyph +SetShowGlyphs +SetShowHint +SetShowHints +SetShowLineBreaks +SetShowSelRange +SetShowShortCut +SetShowSpace +SetShowTab +SetShowText +SetShowToday +SetShowTodayCircle +SetShowWorkAreas +SetShrinkToFit +SetSignature +SetSimplePanel +SetSimpleText +SetSingleProp +SetSite +SetSize +SetSize64 +SetSizeGrip +SetSizeMode +SetSizeStyle +SetSliderVisible +SetSmallIcon +SetSmallIcons +SetSmallImages +SetSmallintProp +SetSmartTab +SetSmooth +setsockopt +SetSoftTop +SetSoftwareUpdateAdvertisementState +SetSort +SetSorted +SetSortOrder +SetSortType +SetSource +SetSourceDisplayName +SetSourceMoniker +SetSpacing +SetSparseArrays +SetSpeedSetting +SetSprigDesigner +SetSQL +SetSQLIndex +SetSQLText +SetStackFramesToLog +SetStandAlone +SetStartFrame +SetStartMargin +SetState +SetStateBits +SetStateFieldValue +SetStateImages +SetStateIndex +SetStatus +SetStatusFilter +SetStatusText +SetStatusTextSB +SetStayOnTop +SetStdHandle +SetStep +SetStopFrame +SetStreamMetaData +SetStretch +SetStretchBltMode +SetStrictDelimiter +SetStrictFormat +SetString +setStringLength +setStringPosition +SetStringProp +SetStrings +SetStringsAdapter +SetStrokeAttributes +SetStrokeTableAttributes +SetStrProp +SetStructureContext +SetStructureNodeMenuItem +SetStrValue +SetStyle +SetStyleEx +SetSubComponent +SetSubItemImage +SetSubItems +SetSubMenuImages +SetSupportCallbacks +SetSuspended +SetSwapAreaSize +SetSyntaxHighlight +SetSyntaxHighlighter +SetSyntaxHighlightTypes +SetSysColors +SetSystemCursor +SetSystemID +SetSystemPaletteUse +SetSystemPowerState +SetSystemTime +SetSystemTimeAdjustment +SetTab +SetTabCount +SetTabFont +SetTabHeight +SetTabIndex +SetTableDirect +SetTableFilter +SetTableLock +SetTableName +SetTableType +SetTabList +SetTabOrder +SetTabPosition +SetTabs +SetTabShowing +SetTabsPerRow +SetTabStop +SetTabStops +SetTabStyle +SetTabVisible +SetTabWidth +SetTag +SetTapeParameters +SetTapePosition +SetTargetNamespace +SetTColorProp +SetTDateTimeProp +SetTemplate +SetTemplateFormat +SetTemplateType +SetTempLocale +SetTempMsg +SetTempState +SetText +SetTextAlign +SetTextBkColor +SetTextBuf +SetTextCase +SetTextCharacterExtra +SetTextColor +SetTextJustification +SetTextStr +SetTFontProp +SetThousands +SetThreadAffinityMask +SetThreadCacheSize +SetThreadContext +SetThreadDesktop +SetThreadIdealProcessor +SetThreadLocale +SetThreadPriority +SetThreadPriorityBoost +SetThreadToken +SetThumbLength +SetThumbSize +SetTick +SetTickMarks +SetTickStyle +SetTime +SetTimeFormat +SetTimer +SetTimers +SetTimes +SetTimeZoneInformation +SettingChange +SetTitle +SetTitleCaptions +SetTitleFont +SetTo +SetToDefaultPrinter +SetTokenInformation +SetTOleEnumProp +SetToolBar +SetToolbarItems +SetToolTip +SetToolTips +SetTop +SetTopic +SetTopIndex +SetTopItem +SetTopLeft +SetTopPos +SetTopRow +SetToString +SetTotalDigits +SetTPictureProp +SetTraceFlags +SetTransparent +SetTransparentColor +SetTransparentColorValue +SetTreeNodes +SetType +SetTypeDescAlias +SetTypeFlags +SetTypeIdldesc +SetUIActive +SetUndoAfterSave +SetUndoLimit +SetUnhandledExceptionFilter +SetUniDirectional +SetUnitName +SetUnNamed +SetUnselectedColor +SetUnwinder +SetupActionBars +SetupAutoRefresh +SetupBindings +SetupBrowseDialog +SetupCallBack +SetupComm +SetupConstraints +SetUpdateMode +SetUpdateObject +SetUpdateOptions +SetUpdateRecordSet +SetUpdateState +SetupDefaultColorMap +SetupDialog +SetupDlg +SetupDropDownBtn +SetupExpandBtn +SetupInternalCalcFields +SetupInternalLabel +SetupListCombo +SetUpLists +SetupPopupSource +SetupPopupWindow +SetupTabPositions +SetupWindowMenu +SetURL +SetUrlCacheEntryGroup +SetUrlCacheEntryInfo +SetUrlCacheEntryInfoA +SetUrlCacheEntryInfoW +SetUrlPolicyPermissions +SetUsageCount +SetUse +SetUseBriefCursorShapes +SetUseBriefRegularExpressions +SetUseBroker +SetUseDefaultTopic +SetUseDockManager +SetUserObjectInformation +SetUserObjectInformationA +SetUserObjectInformationW +SetUserObjectSecurity +SetUseSystemFont +SetUseTabCharacter +SetValue +SetValueCheck +SetValueFromIndex +SetValues +SetValueToComplexInfinity +SetValueUncheck +SetVarAsError +SetVarCustData +SetVarDocString +SetVarHelpContext +SetVarHelpStringContext +SetVariantManager +SetVariantProp +SetVarName +SetVarValue +SetVerify +SetVersion +SetVertical +SetVerticalAlignment +SetVertMargin +SetVertScrollBar +SetVertSeparator +SetViewAdviseSink +SetViewInfo +SetViewportExtEx +SetViewportOrgEx +SetViewStyle +SetVisible +SetVolumeLabel +SetVolumeLabelA +SetVolumeLabelW +SetWait +SetWaitableTimer +SetWallpaper +SetWallpaperOptions +SetWeekNumbers +SetWhitespace +SetWholeFile +setWideChars +SetWideItem +SetWideStringProp +SetWideStrProp +SetWideStrPropAsLongStr +SetWideStrValue +SetWideText +SetWidth +SetWindowContextHelpId +SetWindowExtEx +SetWindowFocus +SetWindowHandle +SetWindowLong +SetWindowLongA +SetWindowLongW +SetWindowMenu +SetWindowOrgEx +SetWindowPlacement +SetWindowPos +SetWindowRgn +SetWindowsHook +SetWindowsHookA +SetWindowsHookEx +SetWindowsHookExA +SetWindowsHookExW +SetWindowsHookW +SetWindowState +SetWindowSubclass +SetWindowText +SetWindowTextA +SetWindowTextW +SetWindowToMonitor +SetWindowWord +SetWinEventHook +SetWinMetaFileBits +SetWordBoolProp +SetWordBoundary +SetWordlistCoercionHRC +SetWordlistHRC +SetWordProp +SetWordWrap +SetWorkingDirectory +SetWorldTransform +SetWrap +SetWrapable +SetWrapText +SetWritingCurValues +SetXML +SetXMLData +setXmlHandler +SetXMLMode +SetXMLStrings +SetYear +SetZoneActionPolicy +SetZoneActionPolicyEx +SetZoneAttributes +SetZoneCustomPolicy +SetZoneMapping +SetZOrder +SetZOrderPosition +SHAddToRecentDocs +ShadeRect +ShadowWnd +SHAppBarMessage +sharemem +ShareMemoryManager +ShareViolation +SHAutoComplete +SHBrowseForFolder +SHBrowseForFolderA +SHBrowseForFolderW +SHChangeNotify +SHCopyKey +SHCopyKeyA +SHCopyKeyW +SHCreateItemFromIDList +SHCreateItemFromParsingName +SHCreateItemFromRelativeName +SHCreateItemInKnownFolder +SHCreateItemWithParent +SHCreateShellPalette +SHCreateStreamOnFile +SHCreateStreamOnFileA +SHCreateStreamOnFileW +SHCreateThread +SHDeleteEmptyKey +SHDeleteEmptyKeyA +SHDeleteEmptyKeyW +SHDeleteKey +SHDeleteKeyA +SHDeleteKeyW +SHDeleteValue +SHDeleteValueA +SHDeleteValueW +Shell_NotifyIcon +Shell_NotifyIconA +Shell_NotifyIconW +ShellAbout +ShellAboutA +ShellAboutW +ShellAnimations +ShellAPI +ShellExecute +ShellExecuteA +ShellExecuteEx +ShellExecuteExA +ShellExecuteExW +ShellExecuteW +SHEnumKeyEx +SHEnumKeyExA +SHEnumKeyExW +SHEnumValue +SHEnumValueA +SHEnumValueW +shexp_casecmp +shexp_cmp +shexp_match +shexp_valid +SHFileOperation +SHFileOperationA +SHFileOperationW +SHFolder +SHFreeNameMappings +SHGetDataFromIDList +SHGetDataFromIDListA +SHGetDataFromIDListW +SHGetDesktopFolder +SHGetFileInfo +SHGetFileInfoA +SHGetFileInfoW +SHGetFolderPath +SHGetFolderPathA +SHGetFolderPathW +SHGetIDListFromObject +SHGetInstanceExplorer +SHGetMalloc +SHGetNameFromIDList +SHGetPathFromIDList +SHGetPathFromIDListA +SHGetPathFromIDListW +SHGetPropertyStoreFromIDList +SHGetPropertyStoreFromParsingName +SHGetSettings +SHGetSpecialFolderLocation +SHGetSpecialFolderPath +SHGetSpecialFolderPathA +SHGetSpecialFolderPathW +SHGetThreadRef +SHGetValue +SHGetValueA +SHGetValueW +ShiftSelectNode +ShiftState +shl +SHLoadInProc +ShlObj +ShLwApi +shmem_alloc +shmem_free +SHOpenRegStream +SHOpenRegStream2 +SHOpenRegStream2A +SHOpenRegStream2W +SHOpenRegStreamA +SHOpenRegStreamW +ShortCut +ShortCutFromMessage +ShortCutToHotKey +ShortCutToKey +ShortCutToText +ShortToLongFileName +ShouldAutoHide +ShouldContinue +ShouldHideHint +ShouldRedo +ShouldScrollDown +ShouldScrollUp +Show +ShowAboutBox +ShowBalloonHint +ShowCaret +ShowCollectionEditor +ShowCollectionEditorClass +ShowContextHelp +ShowControl +ShowCursor +ShowDockableFormFrame +ShowDockClient +ShowDockClientInfo +ShowDragImage +ShowDW +ShowEditor +ShowEditorChar +ShowEntryPoint +ShowError +ShowException +ShowFieldsEditor +ShowFilename +ShowForm +ShowHelp +ShowHelpException +ShowHideMenuCtl +ShowHintsActnExecute +ShowHintsActnUpdate +ShowHostActionExecute +ShowInitialize +ShowKeywordHelp +ShowMDIClientEdge +ShowMemoryLocation +ShowMessage +ShowMessageFmt +ShowMessagePos +ShowMessageView +ShowMethod +ShowModal +ShowNonSourceLocation +ShowObject +ShowOwnedPopups +ShowPopupEditor +ShowProductSplash +ShowPropertyFrame +ShowReferenceProperty +ShowRegisteredMenus +ShowScrollBar +ShowShortCutsInTipsActnExecute +ShowSource +ShowTableOfContents +ShowToolbar +ShowTopicHelp +ShowWindow +ShowWindowAsync +ShowWinNoAnimate +ShowZone +SHQueryInfoKey +SHQueryInfoKeyA +SHQueryInfoKeyW +SHQueryValueEx +SHQueryValueExA +SHQueryValueExW +shr +SHRegCloseUSKey +SHRegCreateUSKey +SHRegCreateUSKeyA +SHRegCreateUSKeyW +SHRegDeleteEmptyUSKey +SHRegDeleteEmptyUSKeyA +SHRegDeleteEmptyUSKeyW +SHRegDeleteUSValue +SHRegDeleteUSValueA +SHRegDeleteUSValueW +SHRegEnumUSKey +SHRegEnumUSKeyA +SHRegEnumUSKeyW +SHRegEnumUSValue +SHRegEnumUSValueA +SHRegEnumUSValueW +SHRegGetBoolUSValue +SHRegGetBoolUSValueA +SHRegGetBoolUSValueW +SHRegGetIntW +SHRegGetPath +SHRegGetPathA +SHRegGetPathW +SHRegGetUSValue +SHRegGetUSValueA +SHRegGetUSValueW +SHRegOpenUSKey +SHRegOpenUSKeyA +SHRegOpenUSKeyW +SHRegQueryInfoUSKey +SHRegQueryInfoUSKeyA +SHRegQueryInfoUSKeyW +SHRegQueryUSValue +SHRegQueryUSValueA +SHRegQueryUSValueW +SHRegSetPath +SHRegSetPathA +SHRegSetPathW +SHRegSetUSValue +SHRegSetUSValueA +SHRegSetUSValueW +SHRegWriteUSValue +SHRegWriteUSValueA +SHRegWriteUSValueW +ShrinkImage +SHSetThreadRef +SHSetValue +SHSetValueA +SHSetValueW +SHSkipJunction +SHStrDup +SHStrDupA +SHStrDupW +ShutDown +ShutdownApplication +SiblingNotInList +Sign +SignalConverter +SignalObjectAndWait +SignalSyncEvent +SignificantIntDigits +SimpleRoundTo +SimpleShareMem +SimpleVarOp +SimplisticClear +SimplisticCopy +Sin +SinCos +Sinh +SizeChanged +Sized +SizeOf +SizeofResource +Sizing +Skip +SkipBlanks +SkipBytes +SkipComponent +skippedEntity +SkipProperty +SkipSetBody +skipTextDecl +SkipValue +SlashSep +Sleep +SleepEx +SLNDepreciation +SmallCheveron +SmallPoint +SmallPointToPoint +SMClientSignal +SMINTF +sndPlaySound +sndPlaySoundA +sndPlaySoundW +socket +SoftShutDown +SoftwareUpdateMessageBox +Sort +SortByIndex +SortBySprigItemIndex +SortColorArray +SortEntryPoints +SortItems +SortOnFields +SortPropList +sound +Soundex +SoundexCompare +SoundexInt +SoundexProc +SoundexSimilar +SoundexWord +Source +SourceButtonClick +sourceCodeToDom +SourceLocationFromAddress +SourcePos +SpanOfNowAndThen +Split +SplitComponentName +SplitString +SplitSymbols +Splitter1CanResize +Splitter1Moved +SplitterMouseDown +SplitterMouseMove +splitText +Sprig +SprigADOImpliedConnectionName +SprigBDEImpliedDatabaseName +SprigBDEImpliedSessionName +SprigBDESessionName +SQLChanged +SQLDayOfWeek +SqlEdit +SQLMemoEnter +SQLMemoExit +SQLRequiresParams +SQLTimeStampToDateTime +SQLTimeStampToStr +SqlTimSt +SqlTraceCallback +Sqrt +SrvrDisconnect +StackAlloc +StackFree +StackWalk +StandardEvent +Start +StartAdvise +StartApplication +startAttListDeclaration +StartCallStackAccess +StartClassGroup +StartConnect +StartDoc +StartDocA +StartDocPrinter +StartDocPrinterA +StartDocPrinterW +startDocument +StartDocW +startDtd +startElement +StartGroup +StartHintTimer +StartInking +StartOfADay +StartOfAMonth +StartOfAWeek +StartOfAYear +StartOfTheDay +StartOfTheMonth +StartOfTheWeek +StartOfTheYear +StartOperations +StartPage +StartPagePrinter +StartPan +StartPanning +StartPenInput +startPrefixMapping +StartRecording +StartRouter +StartService +StartServiceA +StartServiceCtrlDispatcher +StartServiceCtrlDispatcherA +StartServiceCtrlDispatcherW +StartServiceW +StartSession +StartsStr +StartsText +startsWith +StartTimer +StartToken +StartTransaction +Startup +StartVisualGroup +Stat +StaticQueue +StaticSynchronize +StatusMessage +std_os +StdActnMenus +StdActns +stdcall +StdConvs +StdCtrls +StdDev +StdStyleActnCtrls +StdVCL +StdWndProc +Step +StepBy +StepIt +StepOver +StFilSys +StgCreateDocfile +StgCreateDocfileOnILockBytes +StgGetIFillLockBytesOnFile +StgGetIFillLockBytesOnILockBytes +StgIsStorageFile +StgIsStorageILockBytes +StgOpenAsyncDocfileOnIFillLockBytes +StgOpenLayoutDocfile +StgOpenStorage +StgOpenStorageOnILockBytes +StgSetTimes +StickControls +Stop +StopAdvise +StopHintTimer +StopInking +StopPan +StopPanning +StopPenInput +StopRouter +StopSizing +StopTimer +StopTracking +Store +StoreBitmap +StoreColumns +StoreData +StoreExpandState +StoreItem +StoreObject +StoreTreeState +StrAlloc +StrBufLimit +StrBufSize +StrByteType +strcasecmp +StrCat +StrCatA +StrCatBuff +StrCatBuffA +StrCatBuffW +StrCatN +StrCatNA +StrCatNW +StrCatW +StrCharLength +StrChr +StrChrA +StrChrI +StrChrIA +StrChrIW +StrChrW +StrCmp +StrCmpA +StrCmpI +StrCmpIA +StrCmpIW +StrCmpN +StrCmpNA +StrCmpNI +StrCmpNIA +StrCmpNIW +StrCmpNW +StrCmpW +StrComp +StrCopy +StrCpy +StrCpyA +StrCpyN +StrCpyNA +StrCpyNW +StrCpyNX +StrCpyNXA +StrCpyNXW +StrCpyW +StrCSpn +StrCSpnA +StrCSpnI +StrCSpnIA +StrCSpnIW +StrCSpnW +StrDispose +STRDUP +StrDupA +StrDupW +StreamDS +StreamIn +StreamOut +StreamsEqual +streamToDom +StrECopy +StrEdit +StrEnd +StretchBlt +StretchDIBits +StretchDraw +StrFmt +StrFormatByteSize +StrFormatByteSizeA +StrFormatByteSizeW +StrFormatKBSize +StrFormatKBSizeA +StrFormatKBSizeW +StrFromTimeInterval +StrFromTimeIntervalA +StrFromTimeIntervalW +StrHlpr +StrIComp +string +StringCompare +StringFromCLSID +StringFromGUID2 +StringFromIID +StringListCompareStrings +StringListToParams +StringMultiplyByByte +StringOfChar +StringReplace +StringsChanged +StringsChanging +StringsEdit +StringToBytes +StringToClassID +stringToDom +StringToGUID +StringToIOTAFile +StringToLPOLESTR +StringToOleStr +StringToSet +StringToValue +StringToVarArray +StringToVariantArray +StringToVarOleStr +StringToWideChar +StringWidth +StrIntlEqN +StrIntlEqNA +StrIntlEqNI +StrIntlEqNIA +StrIntlEqNIW +StrIntlEqNW +StripAllFromResult +StripChar +StripDetail +StripFieldName +StripHotkey +StripLiterals +StripMaster +StrIsIntlEqual +StrIsIntlEqualA +StrIsIntlEqualW +StrLCat +StrLComp +StrLCopy +StrLen +StrLenLimit +StrLFmt +StrLIComp +StrLower +StrMove +strncasecmp +StrNCat +StrNCatA +StrNCatW +StrNCmp +StrNCmpA +StrNCmpI +StrNCmpIA +StrNCmpIW +StrNCmpW +StrNCpy +StrNCpyA +StrNCpyW +StrNew +StrNextChar +StrokeAndFillPath +StrokePath +StrPas +StrPBrk +StrPBrkA +StrPBrkW +StrPCopy +StrPLCopy +StrPos +StrRChr +StrRChrA +StrRChrI +StrRChrIA +StrRChrIW +StrRChrW +StrRetToBuf +StrRetToBufA +StrRetToBufW +StrRetToStr +StrRetToStrA +StrRetToStrW +StrRScan +StrRStrI +StrRStrIA +StrRStrIW +StrScan +StrSpn +StrSpnA +StrSpnW +StrStr +StrStrA +StrStrI +StrStrIA +StrStrIW +StrStrW +StrToBcd +StrToBool +StrToBoolDef +StrToConvUnit +StrToCurr +StrToCurrDef +StrToDate +StrToDateDef +StrToDateTime +StrToDateTimeDef +StrToFloat +StrToFloatDef +StrToInt +StrToInt64 +StrToInt64Def +StrToIntA +StrToIntDef +StrToIntEx +StrToIntExA +StrToIntExW +StrToIntW +strtok +StrToLong +StrToLongA +StrToLongW +StrToOem +StrToSQLTimeStamp +StrToTime +StrToTimeDef +StrTrim +StrTrimA +StrTrimW +StructureChanged +StructureContextFor +StructureNodeFor +StructureViewAPI +StrUpper +StrUtils +StuffString +Style +StyleChanged +StyleNameStored +Subclass3DDlg +Subclass3DWnd +SubItemChanged +SubPenMsgFromWpLp +Subselect +SubstituteEntities +substringData +SubtractChars +SubtractNormalizedFractions +SubtractRect +SubtractStrings +Succeeded +SUM +SumInt +SumOfSquares +SumsAndSquares +supplied +Supports +SupportsAggregates +SupportsClipboardFormat +supportsDocumentFormat +SupportsInternalCalc +SupportsStreamPersist +SuppressException +Suspend +SuspendThread +SvcMgr +Swap +SwapBuffers +SwapCPPHeader +SwapMouseButton +SwapSourceFormView +SwapVectors +SwitchDesktop +SwitchDetails +SwitchToFiber +SwitchToFile +SwitchToIndex +SwitchToThread +SwitchToView +SYDDepreciation +SymbolToCharacter +SymCleanup +SymEnumerateModules +SymEnumerateSymbols +SymFunctionTableAccess +SymGetModuleBase +SymGetModuleInfo +SymGetOptions +SymGetSearchPath +SymGetSymFromAddr +SymGetSymFromName +SymGetSymNext +SymGetSymPrev +SymInitialize +SymLoadModule +SymRegisterCallback +SymSetOptions +SymSetSearchPath +SymUnDName +SymUnloadModule +SyncCursors +SyncEditBlock +Synchronize +SynchronizeException +SynchTopic +SyncObjs +SyncToSystemFont +SysAddressIsInPCMap +SysAllocMem +SysAllocString +SysAllocStringByteLen +SysAllocStringLen +SysClosestDelphiHandler +SysConst +SysErrorMessage +sysfile +SysFreeMem +SysFreeString +SysGetMem +SysInit +SysReallocMem +SysReAllocString +SysReAllocStringLen +SysRegisterExpectedMemoryLeak +SysRegisterIPLookup +SysStringByteLen +SysStringLen +System +system_calloc +system_calloc_perm +system_chdir +system_errmsg +system_errmsg_fn +system_fclose +system_flock +system_fopenRO +system_fopenRW +system_fopenWA +system_fopenWT +system_fread +system_free +system_free_perm +system_fwrite +system_fwrite_atomic +system_initlock +system_lseek +system_malloc +system_malloc_perm +system_nocoredumps +system_pread +system_realloc +system_realloc_perm +system_rename +system_stat +system_strdup +system_strdup_perm +system_ulock +system_unlink +system_version +system_version_set +system_winerr +system_winsockerr +SystemPaletteOverride +SystemParametersInfo +SystemParametersInfoA +SystemParametersInfoW +SystemTimeToDateTime +SystemTimeToFileTime +SystemTimeToTzSpecificLocalTime +SystemTimeToVariantTime +systhread_attach +systhread_current +systhread_getdata +systhread_init +systhread_newkey +systhread_setdata +systhread_sleep +systhread_start +systhread_terminate +systhread_timerset +systhread_yield +SysUnregisterExpectedMemoryLeak +SysUnregisterIPLookup +SysUtils +SyvCharacterToSymbol +SyvKanjiToSymbol +szPath +szThemeFileName +szThemeName +Tab +TabbedTextOut +TabbedTextOutA +TabbedTextOutW +TabControlError +TabCtrl_AdjustRect +TabCtrl_DeselectAll +TabCtrl_GetCurFocus +TabCtrl_GetExtendedStyle +TabCtrl_GetItemRect +TabCtrl_GetRowCount +TabCtrl_GetToolTips +TabCtrl_GetUnicodeFormat +TabCtrl_HighlightItem +TabCtrl_HitTest +TabCtrl_RemoveImage +TabCtrl_SetCurFocus +TabCtrl_SetExtendedStyle +TabCtrl_SetItemExtra +TabCtrl_SetItemSize +TabCtrl_SetMinTabWidth +TabCtrl_SetPadding +TabCtrl_SetToolTips +TabCtrl_SetUnicodeFormat +TabFontChanged +table +TableFieldsSplitterCanResize +TableListClick +TableOfContents +TabNotBk +TabPosCompare +TabRect +Tabs +TabsChanged +TAbstractCollectionSprig +TAbstractSocket +TAbstractSprig +TAction +TActionBarAccessibility +TActionBarItem +TActionBars +TActionClient +TActionClientItem +TActionClientLink +TActionClients +TActionClientsCollection +TActionDragObject +TActionItemDragObject +TActionLink +TActionListCollection +TActionListEnumerator +TActionListItem +TActionMenuBarAccessibility +TActionSeparatorDragObject +TActiveTStringsProperty +TActiveXControl +TAddFields +TADOBlobStream +TADOCommand +TADOCommandEditor +TADOCommandSprig +TADOConnection +TADOConnectionEditor +TADOConnectionSprig +TADODataSet +TADODataSetEditor +TADODataSetFieldLinkProperty +TADODataSetSprig +TADOImpliedConnectionSprig +TADOIndexNameProperty +TADOQuery +TADOQuerySprig +TADOStoredProc +TADOStoredProcSprig +TADOTable +TADOTableFieldLinkProperty +TADOTableSprig +TADTField +TAggregate +TAggregatedObject +TAggregateField +TAggregates +Tail +TAliasNameProperty +Tan +Tanh +TAnimate +TApartmentThread +TAppletApplication +TAppletModule +TApplication +TApplicationHelper +TargetDown +TargetIndexAt +TargetPoints +TargetUp +TArrayField +tartAddr +TaskDialog +TaskDialogCallbackProc +TaskDialogIndirect +TaskDlgCallback +TaskMessageDlg +TaskMessageDlgPos +TaskMessageDlgPosHelp +TaskModalDialog +TASPMTSObject +TASPObject +TAssociateAttributes +tatusBar +TAutoDispatch +TAutoIncField +TAutoIntfObject +TAutomation +TAutoObject +TAutoObjectFactory +TBaseButtonItem +TBaseComponentEditor +TBaseComponentGuidelines +TBaseCustomModule +TBasePropertyEditor +TBaseProvider +TBaseSelectionEditor +TBasicAction +TBasicActionLink +TBatchMove +TBatchMoveEditor +TBatchMoveSprig +TBCDField +TBDECallback +TBDEDataSet +TBDEDataSetSprig +TBDEDesigner +TBevel +TBinaryField +TBitBtn +TBitBtnActionLink +TBits +TBlobField +TBlobStream +TBookmarkList +TBooleanField +TBoundLabel +TBrowseForFolder +TBrowseURL +TBrushStyleProperty +TBucketList +TButton +TButtonActionLink +TButtonCategories +TButtonCategory +TButtonCollection +TButtonControl +TButtonGlyph +TButtonGroup +TButtonItem +TButtonItemActionLink +TBytesField +TCanvas +TCaptionedDockTree +TCaptionedTabDockTree +TCaptionProperty +TCategoryButtons +TCategoryDragObject +TCellCollection +TCellItem +TChangeLink +TCheckConstraint +TCheckConstraints +TCheckListBox +TCheckListBoxDataWrapper +TChildNameProperty +TClassFactory +TClassList +TClassProperty +TClassWrapper +TCliConvEdit +TClientBlobStream +TClientDataForm +TClientDataSetApply +TClientDataSetRevert +TClientDataSetUndo +TClientSocket +TClientWinSocket +TClipboard +TCMAdjustRect +TCollectionEditor +TCollectionItemSprig +TCollectionProperty +TCollectionSprig +TColorDialog +TColorProperty +TColorSelect +TColumn +TColumnCollection +TColumnTitle +TCOMAdminCatalog +TCOMAdminCatalogCollection +TCOMAdminCatalogObject +TComboBoxExActionLink +TComboBoxExEnumerator +TComboBoxExStrings +TComboBoxStrings +TComboButton +TComboExItem +TComboExItems +TComClassManager +TCOMConnection +TCommandTextProperty +TComMethodHandler +TCommonCalendar +TCommonDialog +TCommonDialogAction +TComObject +TComObjectFactory +TComplexData +TComplexVariantType +TComponent +TComponentEditor +TComponentEnumerator +TComponentFactory +TComponentGuidelines +TComponentList +TComponentListNexus +TComponentProperty +TComponentPropertyFilter +TComponentSprig +TCompressionStream +TComputerNameProperty +TComServer +TConnect +TConnectionBroker +TConnectionPoints +TConnectionStringProperty +TConnEditForm +TContainedAction +TControl +TControlActionLink +TControlCanvas +TControlCollection +TControlGuidelines +TControlItem +TControlScrollBar +TControlSprig +TConversionStream +TConvertVariantType +TConvFamilyInfo +TConvTypeFactor +TConvTypeInfo +TConvTypeProcs +TCoolBar +TCorbaVclComponentAdapter +TCorbaVclComponentFactory +TCRemoteDataModule +TCriticalSection +TCurrencyField +TCursorProperty +TCustomAction +TCustomActionBar +TCustomActionBarColorMap +TCustomActionCombo +TCustomActionControl +TCustomActionDockBar +TCustomActionList +TCustomActionManager +TCustomActionMenuBar +TCustomActionPopupMenuEx +TCustomActionToolBar +TCustomADODataSet +TCustomADODataSetSprig +TCustomApplicationEvents +TCustomBucketList +TCustomButtonControl +TCustomCheckBox +TCustomClientDataSet +TCustomColorBox +TCustomColorListBox +TCustomCombo +TCustomComboBox +TCustomComboBoxEx +TCustomComboBoxStrings +TCustomComboControl +TCustomConnection +TCustomControl +TCustomControlAction +TCustomControlBar +TCustomDBGrid +TCustomDockForm +TCustomDropDownButton +TCustomEdit +TCustomFileDialog +TCustomFileOpenDialog +TCustomFileRun +TCustomFileSaveDialog +TCustomFlowPanel +TCustomForm +TCustomFormGuidelines +TCustomFormHelper +TCustomFormRootSprig +TCustomGrid +TCustomGridPanel +TCustomGroupBox +TCustomHeaderControl +TCustomHotKey +TCustomImageList +TCustomIniFile +TCustomizeActionBars +TCustomizeDlg +TCustomizeFrm +TCustomLabel +TCustomLabeledEdit +TCustomListAction +TCustomListBox +TCustomListControl +TCustomListView +TCustomMaskEdit +TCustomMemo +TCustomModule +TCustomOutline +TCustomPacketWriter +TCustomPanel +TCustomProvider +TCustomRadioGroup +TCustomRemoteServer +TCustomResolver +TCustomServerSocket +TCustomSocket +TCustomStaticListAction +TCustomStaticText +TCustomStatusBar +TCustomTabControl +TCustomTaskDialog +TCustomToolScrollBtn +TCustomTransparentControl +TCustomTrayIcon +TCustomTreeView +TCustomUpDown +TCustomUtilityButton +TCustomVariantType +TCustomVirtualListAction +TCustomWinSocket +TCustomZLibStream +TDatabase +TDatabaseEditor +TDatabaseNameProperty +TDatabaseSprig +TDataBindEditor +TDataBindForm +TDataBindings +TDataBindItem +TDataBindProperty +TDataBlock +TDataBlockInterpreter +TDataDispatch +TDataFieldAggProperty +TDataFieldProperty +TDataLink +TDataModule +TDataModuleRootSprig +TDataObject +TDataPacketWriter +TDataSet +TDataSetAction +TDataSetCancel +TDataSetDelete +TDataSetDesigner +TDataSetEdit +TDataSetEditor +TDataSetField +TDataSetFirst +TDataSetInsert +TDataSetLast +TDataSetNext +TDataSetPost +TDataSetPrior +TDataSetProperty +TDataSetProvider +TDataSetRefresh +TDataSetResolver +TDataSource +TDataSourceLink +TDataSourceProperty +TDateField +TDateProperty +TDateTime +TDateTimeField +TDateTimePicker +TDateTimeProperty +TDBCheckBox +TDBComboBox +TDBCtrlGrid +TDBCtrlGridLink +TDBCtrlPanel +TDBDataSet +TDBDataSetEditor +TDBDataSetSprig +TDBEdit +TDBEditForm +TDbEngineErrorDlg +TDBError +TDBGridColumns +TDBGridInplaceEdit +TDBImage +TDBListBox +TDBLookupCombo +TDBLookupComboBox +TDBLookupControl +TDBLookupList +TDBLookupListBox +TDBMemo +TDBNavigator +TDBOleControl +TDBRadioGroup +TDBRichEdit +TDBStringProperty +TDBText +TDBWideStringProperty +TDCOMConnection +TDdeClientConv +TDdeClientItem +TDdeClientItemProperty +TDdeCliItem +TDdeLinkDlg +TDdeLinkInfoProperty +TDdeMgr +TDDEModuleNotifier +TDDEProjectNotifier +TDdeServerConv +TDdeServerItem +TDdeSrvrConv +TDdeSrvrItem +TDecompressionStream +TDefaultDBScreenApplication +TDefaultEditor +TDefaultSessionSprig +TDefCollection +TDefineField +TDependencies +TDependency +TDesignerOleDropTarget +TDesignerSelections +TDesignNotificationHandler +TDesignObject +TDesignWindow +TDetailDataLink +TDirectoryListBox +TDispatchAppServer +TDispatchConnection +TDispatchSilencer +TDockCaptionDrawer +TDockClientInfo +TDockTabSet +TDockTree +TDockZone +TdomAttr +TdomCharacterData +TdomCustomContentHandler +TdomCustomDTDHandler +TdomCustomErrorHandler +TdomCustomStr +TdomCustomXMLReader +TdomElementsNodeList +TdomElementsNodeListNS +TdomEntitiesNamedNodeMap +TdomImplementation +TDOMIStreamAdapter +TdomNamedNodeMap +TdomNameValueList +TdomNode +TdomNodeIterator +TdomNodeList +TdomSpecialNodeList +TdomStandardContentModelReader +TdomStandardDocXMLReader +TdomStandardExtSubsetXMLReader +TdomTreeWalker +TDOMVendorList +TdomWideStringStream +TDownLoadURL +TDragFields +TDragImageList +TDragSprigs +TDragTarget +TDRAttrDescList +TDriveComboBox +TDriverNameProperty +TDRList +TDRObjectDescList +TDRObjectList +TDRRelationshipDescList +TDRRelationshipList +TDSDesigner +TDTDBaseTranslator +TDTDImportTranslator +TEditAction +TEditActionSelectionEditor +TEditCopy +TEditCut +TEditDelete +TEditPaste +TEditSelectAll +TEditUndo +tem +TempBuffer +TEnumFormatEtc +TEnumPropDesc +Terminate +TerminateExtension +TerminatePopulateThread +TerminateProcess +TerminateThread +TerminationFromWpLp +TestChar +TestEMF +testForCircularReference +TestStreamFormat +TEvent +TEventDispatch +TEventInfo +TEventLogger +TExpertInitProc +TExprParser +TextAttr +TextBackground +TextChar +TextClose +TextColor +textDeclaration +TextExtent +TextExtentW +textfile +TextHeight +TextLabelsCmdExecute +TextLabelsCmdUpdate +TextMode +TextOpen +TextOpenCleanup +TextOut +TextOutA +TextOutW +TextRec +TextRect +TextRectW +TextStart +TextToFloat +TextToShortCut +TextWidth +TextWidthW +TFavoriteLinkItem +TFavoriteLinkItems +TFavoriteLinkItemsEnumerator +TField +TFieldDataLink +TFieldDef +TFieldDefList +TFieldDefs +TFieldLinkProperty +TFieldList +TFields +TFieldsEditor +TFieldsEnumerator +TFieldsGetFieldError +TFieldsTarget +TFileAction +TFileDialogEvents +TFileDialogWrapper +TFileExit +TFileListBox +TFileOpen +TFileOpenDialogWrapper +TFileOpenWith +TFilePageSetup +TFilePrintSetup +TFileSaveAs +TFileSaveDialogWrapper +TFileTypeItem +TFileTypeItems +TFilterComboBox +TFilterExpr +TFindDialog +TFlatList +TFloatField +TFMTBcdData +TFMTBCDField +TFMTBcdVariantType +TFontCharsetProperty +TFontDialog +TFontEdit +TFontNameProperty +TFontProperty +TForm +TFrameSprig +TGarbageCollector +TGlassFrame +TGlyphCache +TGlyphList +TGraphic +TGraphicControl +TGraphicEditor +TGraphicField +TGraphicProperty +TGridDataLink +TGroupButton +TGrpButtonItem +TGrpButtonItems +TGUID +TGuidField +THandle +THandleObject +THashedStringList +that +THeader +THeaderControl +THeaderSection +THeaderSections +THeaderStrings +THelpAction +THelpContents +THelpContextAction +THelpManager +THelpOnHelp +THelpTopicSearch +THelpViewerNode +Theme +ThemeControl +Themes +ThemeServices +then +THintAction +THintWindow +THIRD_IPADDRESS +ThreadCreated +ThreadDestroyed +ThreadEnd +ThreadException +ThreadListChanged +ThreadNotify +ThreadProc +ThreadReceivedStream +ThreadStart +ThreadWrapper +THtmlHelpVIewer +THTTPServer +TIconOptions +TIDispatchField +TIFileStream +Tile +TileWindows +TImage +Time +timeBeginPeriod +TimedScroll +timeEndPeriod +timeGetDevCaps +timeGetSystemTime +timeGetTime +timeKillEvent +TIMemoryStream +TImeNameProperty +TimeOf +Timer +TimerCallBack +TimerExpired +TimerID +TimerScroll +timeSetEvent +TimeStampToBytes +TimeStampToDateTime +TimeStampToMSecs +TimeToStr +TImpliedDatabaseSprig +TImpliedSessionSprig +TIndexDef +TIndexDefs +TIndexFieldNamesProperty +TIndexFiles +TIndexFilesProperty +TIndexNameProperty +TInformant +TIniFile +TInplaceEdit +TInplaceEditList +TInputReqClass +TInputReqDialog +TIntegerBucketList +TIntegerField +TInterceptorNameProperty +TInterface +TInterfacedObject +TInterfacedPersistent +TInterfaceField +TInterfaceList +TInterfaceListEnumerator +TInterfaceProperty +TInternalDragSprigs +TInternalMDIAction +TInvokeableVariantType +TIStreamAdapter +TItemProp +TitleCaptionsStored +TitleClick +TitleFontChanged +TLargeintField +TlHelp32 +TLinkFields +TList +TListActionLink +TListBoxStrings +TListColumn +TListColumns +TListControlAction +TListControlClearSelection +TListControlCopySelection +TListControlDeleteSelection +TListControlItem +TListControlItems +TListControlMoveSelection +TListControlSelectAll +TListFieldProperty +TListItem +TListItems +TListItemsEnumerator +TListSourceLink +TListViewActionLink +TLiteralInfo +TLocalAppServer +TLocalConnection +TLoginDialog +TLookupDestProperty +TLookupFieldProperty +TLookupIndexProperty +TLookupList +TLookupSourceProperty +TlsAlloc +TlsFree +TlsGetValue +TlsSetValue +TMainMenu +TMargins +TMask +TMasterDataLink +TMediaPlayer +TMemberID +TMemIniFile +TMemoField +TMemoStrings +TMenu +TMenuActionLink +TMenuItem +TMenuItemEnumerator +TMenuItemStack +TMenuList +TMenuStack +TMessageForm +TMethodProperty +TMIDASConnection +TModalResultProperty +TModuleNotifierObject +TMonitor +TMonthCalColors +TMonthCalendar +TMouse +TMPFilenameProperty +TMSDOMAttr +TMSDOMCharacterData +TMSDOMDocument +TMSDOMDocumentType +TMSDOMElement +TMSDOMEntity +TMSDOMEventHandler +TMSDOMImplementation +TMSDOMImplementationFactory +TMSDOMInterface +TMSDOMNamedNodeMap +TMSDOMNode +TMSDOMNodeList +TMSDOMNotation +TMSDOMProcessingInstruction +TMSDOMText +TMtsAutoObject +TMtsDataModule +TMultiCaster +TMutex +TNamedItem +TNavButton +TNavDataLink +TNestedDataSetProperty +TNestedTable +TNestedTableSprig +TNewLocations +TNextTab +TNotebook +TNotifierObject +TNumericField +to +ToAscii +ToAsciiEx +TObject +TObjectBucketList +TObjectDispatch +TObjectField +TObjectList +TObjectManager +TObjectQueue +TObjectStack +ToCommon +Today +Toggle +ToggleAll +ToggleCase +ToggleClickCheck +ToggleFormUnit +ToggleSmallIcons +TokenComponentIdent +TokenFloat +TokenInt +Tokenize +TokenizeLineClass +TokenName +TokenString +TokenSymbolIs +TokenSymbolIsFunc +TokenWideString +TOleContainer +TOleControl +TOleControlEditor +TOleCustomProperty +TOleEnumProperty +TOleFontEditor +TOleLinkStub +TOLEnterpriseConnection +TOleObjectEditor +TOleObjectProperty +TOlePropPageProperty +TOleServer +TOleUILinkInfo +ToLongPath +Tomorrow +ToolbarCmdExecute +ToolbarCmdUpdate +ToolbarLoaded +ToolbarModified +ToolButtonVisible +ToolDockImage +ToolIntf +ToolsAPI +ToolWin +ToolWnds +TOpenDialog +TOpenPicture +TOpenPictureDialog +TOpenTextFileDialog +TopLeftChanged +TopLeftMoved +TOrderedList +TOTAFile +TOTAFormNotifier +TotalVariance +TOTAModuleNotifier +TOTANotifier +TOTAStringsAdapter +TouchFileTimes +ToUnicode +ToUnicodeEx +TOutlineNode +TOutlineStrings +TOXDOMAttr +TOXDOMCharacterData +TOXDOMDocument +TOXDOMDocumentType +TOXDOMDocumentTypeChildren +TOXDOMElement +TOXDOMEntity +TOXDOMImplementation +TOXDOMImplementationFactory +TOXDOMInterface +TOXDOMNamedNodeMap +TOXDOMNode +TOXDOMNodeList +TOXDOMNotation +TOXDOMProcessingInstruction +TOXDOMText +TPacketDataSet +TPacketInterceptFactory +TPadding +TPage +TPageAccess +TPageControl +TPageScroller +TPageSetupDialog +TPaintBox +TPaintControl +TPanningWindow +TParam +TParameter +TParameters +TParametersProperty +TParamList +TParams +TPasswordDialog +TPathLabel +TPenStyleProperty +TPersistent +TPictureEditor +TPictureEditorDlg +TPictureProperty +TPlatformBytes +TPlatformField +TPlatformPSResult +TPlatformRecordBuffer +TPlatformValueBuffer +TPooledDataInterpreter +TPopulateThread +TPopupActionBar +TPopupDataList +TPopupGrid +TPopupList +TPopupListBox +TPopupMenu +TPreviousTab +TPrintDialog +TPrintDlg +TPrinter +TPrinterCanvas +TPrinterDevice +TPrinterSetupDialog +TProcedureNameProperty +TPropertyCategory +TPropertyCategoryList +TPropertyEditor +TPropertyFilter +TPropertySprig +TPropInfoList +TProviderNameProperty +TProviderProperty +TPtoDP +TPublishableVariantType +TQuery +TQueryDataLink +TQueryDescription +TQueryEditor +TQueryParamsProperty +TQuerySprig +TQueue +TraceInto +TraceToSource +TrackButton +TrackMenu +TrackMouseEvent +TrackPopupMenu +TrackPopupMenuEx +TrackResource +TrackResourceS +TrackSource +TRadioButton +TrainHREC +TransactionUOW +TransactNamedPipe +transform +TransformCoords +TransformNode +transformNodeToObject +Transient +Translate +TranslateAccelerator +TranslateAcceleratorA +TranslateAcceleratorIO +TranslateAcceleratorSB +TranslateAcceleratorW +TranslateCharsetInfo +TranslateMDISysAccel +TranslateMessage +TranslateResult +TransmitCommChar +TransmitFile +TransparentBlt +TransparentDIBits +TransparentStretchBlt +Transport_GetConnected +Transport_SetConnected +TransportTerminated +TraverseClients +TraverseControls +TRDSConnection +tream +TReconcileActionLink +TRedirectorWindow +TreeIntf +TreeNodeFor +TreeView +TreeView_CreateDragImage +TreeView_DeleteAllItems +TreeView_DeleteItem +TreeView_EditLabel +TreeView_EditLabelA +TreeView_EditLabelW +TreeView_EndEditLabelNow +TreeView_EnsureVisible +TreeView_Expand +TreeView_GetBkColor +TreeView_GetCheckState +TreeView_GetChild +TreeView_GetCount +TreeView_GetDropHilite +TreeView_GetEditControl +TreeView_GetExtendedStyle +TreeView_GetFirstVisible +TreeView_GetImageList +TreeView_GetIndent +TreeView_GetInsertMarkColor +TreeView_GetISearchString +TreeView_GetISearchStringA +TreeView_GetISearchStringW +TreeView_GetItem +TreeView_GetItemA +TreeView_GetItemHeight +TreeView_GetItemPartRect +TreeView_GetItemRect +TreeView_GetItemState +TreeView_GetItemW +TreeView_GetLastVisible +TreeView_GetLineColor +TreeView_GetNextItem +TreeView_GetNextSelected +TreeView_GetNextSibling +TreeView_GetNextVisible +TreeView_GetParent +TreeView_GetPrevSibling +TreeView_GetPrevVisible +TreeView_GetRoot +TreeView_GetScrollTime +TreeView_GetSelectedCount +TreeView_GetSelection +TreeView_GetTextColor +TreeView_GetToolTips +TreeView_GetUnicodeFormat +TreeView_GetVisibleCount +TreeView_HitTest +TreeView_InsertItem +TreeView_InsertItemA +TreeView_InsertItemW +TreeView_MapAccIDToHTREEITEM +TreeView_MapHTREEITEMToAccID +TreeView_Select +TreeView_SelectDropTarget +TreeView_SelectItem +TreeView_SelectSetFirstVisible +TreeView_SetAutoScrollInfo +TreeView_SetBkColor +TreeView_SetCheckState +TreeView_SetExtendedStyle +TreeView_SetImageList +TreeView_SetIndent +TreeView_SetInsertMark +TreeView_SetInsertMarkColor +TreeView_SetItem +TreeView_SetItemA +TreeView_SetItemHeight +TreeView_SetItemState +TreeView_SetItemW +TreeView_SetLineColor +TreeView_SetScrollTime +TreeView_SetTextColor +TreeView_SetToolTips +TreeView_SetUnicodeFormat +TreeView_ShowInfoTip +TreeView_SortChildren +TreeView_SortChildrenCB +TreeViewError +TreeViewErrorFmt +TReferenceField +TReflectorWindow +TRegGroup +TRegGroups +TRegIniFile +TRegistry +TRegistryClass +TRegistryIniFile +TRemoteDataModule +TReplaceDialog +TReportDirProperty +TReportEditor +TReportNameProperty +TRichEditAction +TRichEditAlignCenter +TRichEditAlignLeft +TRichEditAlignRight +TRichEditBold +TRichEditBullets +TRichEditItalic +TRichEditStrikeOut +TRichEditUnderline +Trigger +Trim +TrimLeft +Trimmed +TrimPenData +TrimPunctuation +TrimRight +trlCode +TRootSprig +TRootSprigList +TRootSprigStructureContext +TRootSprigStructureNode +TRowCollection +true +Truncate +try +TryConvTypeToFamily +TryEncodeDate +TryEncodeDateDay +TryEncodeDateMonthWeek +TryEncodeDateTime +TryEncodeDateWeek +TryEncodeDayOfWeekInMonth +TryEncodeTime +TryEnter +TryEnterCriticalSection +TryFloatToCurr +TryFloatToDateTime +TryJulianDateToDateTime +TryLock +TryModifiedJulianDateToDateTime +TryObjectCreate +TryOpenForInput +TryOpenForOutput +TryRecodeDateTime +TryStrToBcd +TryStrToBool +TryStrToConvUnit +TryStrToCurr +TryStrToDate +TryStrToDateTime +TryStrToFloat +TryStrToInt +TryStrToInt64 +TryStrToSQLTimeStamp +TryStrToTime +TSaveAttributesAs +TSaveDialog +TSavePicture +TSavePictureDialog +TScreen +tScreenCoords +TScrollBar +TScroller +TScrollingWinControl +TSearchAction +TSearchFind +TSearchFindFirst +TSearchFindNext +TSearchReplace +TSelectDirCallback +TSelectDirDlg +TSelectionEditor +TSelectionEditorDefinition +TSelectionEditorDefinitionList +TSelectionEditorList +TSelectionMessageList +TSendMail +TServerAcceptThread +TServerClientThread +TServerClientWinSocket +TServerCollection +TServerEventDispatch +TServerItem +TServerNameProperty +TServerSocket +TServerSupportFunctionProc +TServerWinSocket +TService +TServiceApplication +TServiceStartThread +TServiceThread +TSession +TSessionList +TSessionNameProperty +TSessionSprig +TSetElementProperty +TSetProperty +TShadowWindow +TShape +TSharedConnection +TShortCutList +TShortCutProperty +TSilentPaintPanel +TSimpleObjectBroker +TSizeConstraints +TSmallintField +TSocketConnection +TSocketDispatcher +TSocketDispatcherThread +TSocketForm +TSocketService +TSocketTransport +TSparseList +TSparsePointerArray +TSpeedButton +TSpeedButtonActionLink +TSplitter +TSprig +TSprigIndex +TSprigIntfType +TSprigStructureNode +TSprigTreeNode +TSprigType +TSprigTypeList +TSQLEditForm +TSQLResolver +TSQLTimeStampData +TSQLTimeStampField +TSQLTimeStampVariantType +TSrvrConvEdit +TSrvrItemEdit +TStack +TStandardAddRemoveItem +TStandardButtonControl +TStandardColorMap +TStandardCustomizePopup +TStandardDropDownButton +TStandardMenuButton +TStandardMenuExpandBtn +TStandardMenuItem +TStandardMenuPopup +TStandardStyleActionBars +TStandardToolScrollBtn +TStaticListItems +TStatusBar +TStoredProc +TStoredProcEditor +TStoredProcParamsProperty +TStoredProcSprig +TStreamAdapter +TStreamedConnection +TStrEditDlg +TStringField +TStringGrid +TStringGridStrings +TStringHash +TStringListProperty +TStringsEditDlg +TStringsFileSystem +TStringsModuleCreator +TStringSparseList +TStringsStream +TStructureMenuItem +TStructureNodeMenuItem +TSubItems +TSynchroObject +TTabAction +TTabbedNotebook +TTabDockPanel +TTable +TTableEditor +TTableFieldLinkProperty +TTableNameProperty +TTableSprig +TTabList +TTabOrderProperty +TTabPage +TTabPageAccess +TTabSet +TTabSheet +TTabStrings +TTaskDialogBaseButtonItem +TTaskDialogButtonItem +TTaskDialogButtons +TTaskDialogButtonsEnumerator +TTaskDialogProgressBar +TTaskDialogRadioButtonItem +TThemeServices +TThread +TThreadList +TTimeField +TTimeProperty +TTimer +TToolBar +TToolbarDesignWindow +TToolBarEnumerator +TToolButton +TToolDockForm +TToolDockObject +TToolWindow +TTransientCollectionSprig +TTransientSprig +TTransportThread +TTreeNode +TTreeNodes +TTreeNodesEnumerator +TTreeStrings +TTwilightColorMap +TTypedComObject +TTypedComObjectFactory +TUniqueProperty +TUpdateSQL +TUpdateSQLEditor +TUpdateSQLSprig +TUpdateTree +TURLAction +TurnSiblingsOff +TUTF16BEToUTF8Stream +TValueEditDlg +TValueListEditor +TValueListProperty +TValueListStrings +TVarBytesField +TVariantField +TVariantProperty +TVariantTypeProperty +TVCLAutoObject +TVCLScreenApplication +TVirtualStream +TWebConnection +TWideCharProperty +TWideDataSet +TWideMemoField +TWideStringField +TWideStringList +TWideStringProperty +TWideStrings +TWideStringsEnumerator +TWinControl +TWinControlActionLink +TWinControlGuidelines +TWinControlRootSprig +TWinControlSprig +TWindowAction +TWindowArrange +TWindowCascade +TWindowClose +TWindowMinimizeAll +TWindowTileHorizontal +TWindowTileVertical +TWinHelpViewer +TWinSocketStream +TWizardInitProc +TwoBitsFromDIB +TWordField +TWorkArea +TWorkAreas +TWriter +TXDRImportTranslator +TXercesDOMImplementationFactory +TXMLAnnotation +TXMLAnnotationCollection +TXMLAnnotationItem +TXMLAppInfoCollection +TXMLAttributeDef +TXMLAttributeDefList +TXMLAttributeDefs +TXMLAttributeGroup +TXMLAttributeGroups +TXMLBaseTypeIndicator +TXMLBuiltInTypes +TXMLComplexContent +TXMLComplexTypeDef +TXMLComplexTypeDef99 +TXMLComplexTypeDefs +TXMLDataImporter +TXMLDocument +TXMLDocumentationCollection +TXMLElementCompositor +TXMLElementCompositors +TXMLElementDef +TXMLElementDefList +TXMLElementDefs +TXMLElementGroup +TXMLElementGroups +TXMLEnumeration +TXMLEnumerationCollection +TXMLNode +TXMLNodeCollection +TXMLNodeList +TXMLNotationDef +TXMLNotationDefs +TXMLSchema1999Translator +TXMLSchema1999TranslatorFactory +TXMLSchemaDef +TXMLSchemaDoc +TXMLSchemaDoc99 +TXMLSchemaDocRef +TXMLSchemaDocRefs +TXMLSchemaImports +TXMLSchemaIncludes +TXMLSchemaItem +TXMLSchemaItems +TXMLSchemaNode +TXMLSchemaTranslator +TXMLSchemaTranslatorFactory +TXMLSimpleTypeDef +TXMLSimpleTypeDefs +TXMLSimpleTypeList +TXMLSimpleTypeRestriction +TXMLSimpleTypeUnion +TXmlStandardDomReader +TXMLTypeDef +TXMLTypedSchemaItem +TXPColorMap +TXPStyleActionBars +TXPStyleAddRemoveItem +TXPStyleButton +TXPStyleCustomizePopup +TXPStyleDropDownBtn +TXPStyleExpandBtn +TXPStyleMenuButton +TXPStyleMenuItem +TXPStylePopupMenu +TXPStyleToolScrollBtn +TXToolDockForm +type +TypeChange +TypeCheckArithOp +types +TypInfo +UCS4CodeToUTF8String +UCS4StringToWideString +UIActivate +UIActivateIO +UIDeactivate +UIInitialize +Unadvise +UnaryOp +Unassigned +UnassociateAttributes +UnbindSource +UnblockOneWriter +UnblockOSExceptions +UnblockReaders +Uncache +UnDecorateSymbolName +UnderstandsContext +UnderstandsKeyword +UnderstandsTopic +Undo +UndoAutoResizing +UnDockControl +UndoLastChange +UnElideAllBlocks +UnElideNearestBlock +Unfreeze +UnhandledExceptionFilter +UnhookHintHooks +UnhookMainWindow +UnhookResultsHookHREC +UnhookSignal +UnhookSynchronizeWakeup +UnhookWindowsHook +UnhookWindowsHookEx +UnhookWinEvent +UnicodeToUtf8 +Uninitialize +UninitializeFlatSB +UninstallRecognizer +UninstallService +UnionRect +UniqueAttrName +UniqueCommand +uniqueID +UniqueImage +UniqueName +UniqueString +unit +UniUnimplemented +UnixToDateTime +UnlinkException +UnlistPublishedProperty +UnLoadKey +UnloadKeyboardLayout +UnloadPackage +UnloadThemeData +UnLock +UnlockFile +UnlockFileEx +UnlockList +UnLockObject +UnlockRegion +UnlockResource +UnlockSegment +UnlockSelect +UnlockSelection +UnlockServiceDatabase +UnlockSession +UnlockState +UnlockTable +UnlockUrlCacheEntryFile +UnlockUrlCacheEntryStream +UnMapAndLoad +UnmapDebugInformation +UnmapViewOfFile +UnmarshalInterface +Unmerge +Unmodify +UnNamedStored +Unnotify +UnnotifyGroupChange +UnpackDDElParam +UnpackParams +UnpackTime +UnPrepare +UnQuote +UnrealizeObject +UnRegActions +Unregister +UnregisterActionGroup +UnRegisterActions +UnRegisterActnBarStyle +UnRegisterCategories +UnRegisterChanges +UnRegisterClass +UnregisterClassA +UnRegisterClasses +UnRegisterClassImplCategories +UnRegisterClassReqCategories +UnregisterClassW +UnRegisterClient +UnRegisterColorScheme +UnregisterConversionFamily +UnregisterConversionType +UnregisterDesignNotification +UnregisterDeviceNotification +unregisterDocumentClass +UnRegisterDOMVendor +UnRegisterDragAcceptor +UnregisterExpectedMemoryLeak +UnRegisterFileSystem +UnregisterFindGlobalComponentProc +UnregisterGraphicClass +UnregisterHistoryProvider +UnregisterHotKey +UnregisterIntegerConsts +UnregisterLanguage +UnregisterModule +UnRegisterModuleClasses +UnregisterPooled +UnRegisterProvider +UnRegisterSchemaTranslator +UnregisterToolbarNotifier +UnRegisterTypeLib +UnregisterTypeLibrary +UnsetExceptionHandler +UnthemedDesigner +until +UntrackResource +UntrackResourceS +Unused +UnwindClosestHandler +UnwindDelphiLookup +UnwindRaiseException +UnwindRegisterIPLookup +UpCase +Update +UpdateAction +UpdateActionBar +UpdateActionBars +UpdateActions +UpdateActive +UpdateActivePage +UpdateActiveState +UpdateAll +UpdateAllButtons +UpdateAutoComplete +UpdateAutoSessionName +UpdateBand +UpdateBands +UpdateBatch +UpdateBounds +UpdateBufferCount +UpdateButton +UpdateButtons +UpdateButtonState +UpdateButtonStates +UpdateCache +UpdateCalcFields +UpdateCallbackRequired +UpdateCaption +UpdateCategory +UpdateCheckRange +UpdateCollectionList +UpdateColors +UpdateCols +UpdateColumn +UpdateColumnOrder +UpdateColumns +UpdateContents +UpdateControl +UpdateControlOriginalParentSize +UpdateControlSize +UpdateControlState +UpdateCursor +UpdateCursorPos +Updated +UpdateData +UpdateDataFields +UpdateDataLinks +UpdateDebugInfoFile +UpdateDebugInfoFileEx +UpdateDefs +UpdateDesigner +UpdateDialog +UpdateDisplay +UpdateDockCaptionPin +UpdateEdit +UpdateExclusive +UpdateExtents +UpdateField +UpdateFieldList +UpdateFile +UpdateFloatingDockSitePos +UpdateFont +UpdateFromCursor +UpdateFromIndexList +UpdateFromLogFont +UpdateGlassFrame +UpdateHeight +UpdateICMRegKey +UpdateICMRegKeyA +UpdateICMRegKeyW +UpdateImage +UpdateImages +UpdateIme +UpdateIndexDefs +UpdateItem +UpdateItem2 +UpdateItems +UpdateKind +UpdateLastActive +UpdateLayeredWindow +UpdateLink +UpdateList +UpdateListbox +UpdateListFields +UpdateLoc +UpdateLogFile +UpdateLookupControls +UpdateMDIMenuButtons +UpdateMenuAccelerators +UpdateMenus +UpdateNameHash +UpdateObject +UpdateObjectRect +UpdatePanel +UpdatePanels +UpdatePreferredSize +UpdateProgress +UpdateProviders +UpdateRange +UpdateRecord +UpdateRecordSetPosition +UpdateRecreatingFlag +UpdateRegistry +UpdateResource +UpdateResourceA +UpdateResourceW +UpdateRightToLeft +UpdateRowCount +UpdateScroll +UpdateScrollBar +UpdateScrollBars +UpdateScrollPos +UpdateScrollProperties +UpdateScrollRange +UpdateSection +UpdateSectionOrder +UpdateSections +UpdateSelection +UpdateShowing +UpdateSimpleText +UpdateSize +UpdateSizes +UpdateState +UpdateStatus +UpdateTab +UpdateTabHighlights +UpdateTabImages +UpdateTabOrder +UpdateTabShowing +UpdateTabSize +UpdateTarget +UpdateText +UpdateTextBounds +UpdateTextFlags +UpdateThemes +UpdateTimer +UpdateTimerTimer +UpdateTracking +UpdateUIState +UpdateValueHash +UpdateVerbs +UpdateView +UpdateVisible +UpdateWindow +UpdateWindowState +Updating +UpDownClick +UpperCase +UrlApplyScheme +UrlApplySchemeA +UrlApplySchemeW +UrlCanonicalize +UrlCanonicalizeA +UrlCanonicalizeW +UrlCombine +UrlCombineA +UrlCombineW +UrlCompare +UrlCompareA +UrlCompareW +UrlCreateFromPath +UrlCreateFromPathA +UrlCreateFromPathW +URLDownloadToCacheFile +URLDownloadToCacheFileA +URLDownloadToCacheFileW +URLDownloadToFile +URLDownloadToFileA +URLDownloadToFileW +URLEncode +UrlEscape +UrlEscapeA +UrlEscapeSpaces +UrlEscapeSpacesA +UrlEscapeSpacesW +UrlEscapeW +UrlGetLocation +UrlGetLocationA +UrlGetLocationW +UrlGetPart +UrlGetPartA +UrlGetPartW +UrlHash +UrlHashA +UrlHashW +UrlIs +UrlIsA +UrlIsFileUrl +UrlIsFileUrlA +UrlIsFileUrlW +UrlIsNoHistory +UrlIsNoHistoryA +UrlIsNoHistoryW +UrlIsOpaque +UrlIsOpaqueA +UrlIsOpaqueW +UrlIsW +UrlMkGetSessionOption +UrlMkSetSessionOption +UrlMon +URLOpenBlockingStream +URLOpenBlockingStreamA +URLOpenBlockingStreamW +URLOpenPullStream +URLOpenPullStreamA +URLOpenPullStreamW +URLOpenStream +URLOpenStreamA +URLOpenStreamW +URLPathEncode +UrlUnescape +UrlUnescapeA +UrlUnescapeInPlace +UrlUnescapeInPlaceA +UrlUnescapeInPlaceW +UrlUnescapeW +UseFieldInUpdate +UseFieldInWhere +UseIndexOrder +UserHandleGrantAccess +UseRightToLeftAlignment +UseRightToLeftAlignmentForField +UseRightToLeftReading +UseRightToLeftScrollBar +userpw +uses +UsesBitmap +UseThemes +UTF16BEToUTF8Str +UTF16HighSurrogate +UTF16LowSurrogate +UTF16SurrogateToInt +UTF8CharLength +UTF8CharSize +UTF8Decode +UTF8Encode +UTF8LowerCase +Utf8ToAnsi +Utf8ToAnsiEx +Utf8ToUnicode +UTF8ToUTF16BEStr +UTF8UpperCase +util_chdir2path +util_delete_directory +util_env_copy +util_env_create +util_env_find +util_env_free +util_env_replace +util_env_str +util_getline +util_hostname +util_is_mozilla +util_is_url +util_itoa +util_later_than +util_mime_separator +util_sh_escape +util_str_time_equal +util_strcasecmp +util_strftime +util_strncasecmp +util_time_equal +util_uri_escape +util_uri_is_evil +util_uri_parse +util_uri_unescape +util_url_escape +UxTheme +v +ValEdit +Validate +validate2 +ValidateAutoSession +ValidateComponent +ValidateComponentClass +ValidateContainer +ValidateEdit +ValidateError +ValidateExistingType +ValidateHelpSystem +ValidateHelpViewer +ValidateHintWindow +validateIDREFS +ValidateInsert +ValidateLookupInfo +ValidateName +ValidateParent +ValidateRect +ValidateRename +ValidateRgn +ValidateSelection +ValidateSizeGrip +ValidateSprigs +ValidateTemplates +ValidateUserLicense +ValidFieldIndex +ValidFile +ValidHeaderHandle +ValidInCurrentProcess +ValidInProcess +ValidParentForm +ValidTemplates +Value +ValueAvailable +ValueChanged +ValueEdit +ValueExists +ValueListEditor1KeyDown +ValueListEditor1StringsChange +ValueMatch +ValueOf +ValueOfKey +ValueOverOne +ValueToStr +ValueToString +var +VarAlloc +VarArrayAsPSafeArray +VarArrayClear +VarArrayCreate +VarArrayCreateError +VarArrayDimCount +VarArrayFromStrings +VarArrayFromWideStrings +VarArrayGet +VarArrayHighBound +VarArrayLock +VarArrayLowBound +VarArrayOf +VarArrayPut +VarArrayRef +VarArrayUnlock +VarAsComplex +VarAsConvert +VarAsError +VarAsSQLTimeStamp +VarAsType +VarBoolFromCy +VarBoolFromDate +VarBoolFromDec +VarBoolFromDisp +VarBoolFromI1 +VarBoolFromI2 +VarBoolFromI4 +VarBoolFromR4 +VarBoolFromR8 +VarBoolFromStr +VarBoolFromUI1 +VarBoolFromUI2 +VarBoolFromUI4 +VarBStrFromBool +VarBStrFromCy +VarBStrFromDate +VarBStrFromDec +VarBStrFromDisp +VarBStrFromI1 +VarBStrFromI2 +VarBStrFromI4 +VarBStrFromR4 +VarBStrFromR8 +VarBStrFromUI1 +VarBStrFromUI2 +VarBStrFromUI4 +VarCastAsAny +VarCastAsDispatch +VarCastAsInterface +VarCastAsOleStr +VarCastAsString +VarCastError +VarCastRare +VarCastViaOS +VarCheckEmpty +VarClearDeep +VarCmplx +VarCompare +VarCompareAny +VarCompareRare +VarCompareSimple +VarCompareValue +VarComplex +VarComplexAbs +VarComplexAbsSqr +VarComplexAngle +VarComplexArcCos +VarComplexArcCosH +VarComplexArcCot +VarComplexArcCotH +VarComplexArcCsc +VarComplexArcCscH +VarComplexArcSec +VarComplexArcSecH +VarComplexArcSin +VarComplexArcSinH +VarComplexArcTan +VarComplexArcTanH +VarComplexConjugate +VarComplexCos +VarComplexCosH +VarComplexCot +VarComplexCotH +VarComplexCreate +VarComplexCreateInto +VarComplexCsc +VarComplexCscH +VarComplexExp +VarComplexFromPolar +VarComplexInverse +VarComplexLn +VarComplexLog10 +VarComplexLog2 +VarComplexLogN +VarComplexPower +VarComplexSec +VarComplexSecH +VarComplexSign +VarComplexSimplify +VarComplexSin +VarComplexSinH +VarComplexSqr +VarComplexSqrt +VarComplexTan +VarComplexTanH +VarComplexTimesImaginary +VarComplexTimesNegI +VarComplexTimesPosI +VarComplexTimesReal +VarComplexToPolar +VarConv +VarConvert +VarConvertCreate +VarConvertCreateInto +VarCopyByRef +VarCopyNoInd +VarCopyNoIndCopyProc +VarCopyNoIndDeep +VarCopyNoIndOleStr +VarCopyNoIndViaOS +VarCyFromBool +VarCyFromDate +VarCyFromDec +VarCyFromDisp +VarCyFromI1 +VarCyFromI2 +VarCyFromI4 +VarCyFromR4 +VarCyFromR8 +VarCyFromStr +VarCyFromUI1 +VarCyFromUI2 +VarCyFromUI4 +VarDataCast +VarDataCastTo +VarDataCastToOleStr +VarDataClear +VarDataCopy +VarDataCopyNoInd +VarDataFromOleStr +VarDataFromStr +VarDataInit +VarDataIsArray +VarDataIsByRef +VarDataIsEmptyParam +VarDataIsFloat +VarDataIsNumeric +VarDataIsOrdinal +VarDataIsStr +VarDataSize +VarDataToStr +VarDateFromBool +VarDateFromCy +VarDateFromDec +VarDateFromDisp +VarDateFromI1 +VarDateFromI2 +VarDateFromI4 +VarDateFromR4 +VarDateFromR8 +VarDateFromStr +VarDateFromUI1 +VarDateFromUI2 +VarDateFromUI4 +VarDispInvoke +VarEnsureRange +VarEquals +VarExceptionToResult +VarFMTBcd +VarFMTBcdCreate +VarFromDateTime +VarFromInterface +VarHlpr +VarI2FromBool +VarI2FromCy +VarI2FromDate +VarI2FromDec +VarI2FromDisp +VarI2FromI1 +VarI2FromI4 +VarI2FromR4 +VarI2FromR8 +VarI2FromStr +VarI2FromUI1 +VarI2FromUI2 +VarI2FromUI4 +VarI4FromBool +VarI4FromCy +VarI4FromDate +VarI4FromDec +VarI4FromDisp +VarI4FromI1 +VarI4FromI2 +VarI4FromInt +VarI4FromR4 +VarI4FromR8 +VarI4FromStr +VarI4FromUI1 +VarI4FromUI2 +VarI4FromUI4 +Variance +VariantAdd +VariantAdd2 +VariantAnd +VariantAnd2 +VariantArrayRedim +VariantArrayToString +VariantCast +VariantChangeSimpleIntoSimple +VariantChangeType +VariantChangeTypeEx +VariantClear +VariantCmpEQ +VariantCmpGT +VariantCmpLT +VariantCopy +VariantCopyInd +VariantCpy +VariantDiv +VariantDiv2 +VariantGetElement +VariantInit +VariantMod +VariantMod2 +VariantMul +VariantMul2 +VariantNeg +VariantNot +VariantOr +VariantOr2 +VariantPutElement +Variants +VariantShl +VariantShl2 +VariantShr +VariantShr2 +VariantSub +VariantSub2 +VariantTimeToDosDateTime +VariantTimeToSystemTime +VariantXor +VariantXor2 +VarInRange +VarInt64FromVar +VarInvalidNullOp +VarInvalidOp +VarIsArray +VarIsByRef +VarIsClear +VarIsComplex +VarIsConvert +VarIsCustom +VarIsEmpty +VarIsEmptyParam +VarIsError +VarIsFloat +VarIsFMTBcd +VarIsNull +VarIsNumeric +VarIsOrdinal +VarIsSQLTimeStamp +VarIsStr +VarIsType +VarOleStrToString +VarOpRare +VarOverflowError +VarR4FromBool +VarR4FromCy +VarR4FromDate +VarR4FromDec +VarR4FromDisp +VarR4FromI1 +VarR4FromI2 +VarR4FromI4 +VarR4FromR8 +VarR4FromStr +VarR4FromUI1 +VarR4FromUI2 +VarR4FromUI4 +VarR8FromBool +VarR8FromCy +VarR8FromDate +VarR8FromDec +VarR8FromDisp +VarR8FromI1 +VarR8FromI2 +VarR8FromI4 +VarR8FromR4 +VarR8FromStr +VarR8FromUI1 +VarR8FromUI2 +VarR8FromUI4 +VarRangeCheckError +VarResultCheck +VarSameValue +VarSQLTimeStamp +VarSQLTimeStampCreate +VarStrCat +VarStringToOleStr +VarSupports +VarToAutoObject +VarToBcd +VarToBoolAny +VarToBoolAsString +VarToBoolCustom +VarToBoolViaOS +VarToBuffer +VarToCurrencyAny +VarToCurrencyAsDouble +VarToCurrencyAsString +VarToCurrencyCustom +VarToCurrencyViaOS +VarToDataPacket +VarToDateAny +VarToDateAsDouble +VarToDateAsString +VarToDateCustom +VarToDateTime +VarToDateViaOS +VarToDoubleAny +VarToDoubleAsString +VarToDoubleCustom +VarToDoubleViaOS +VarToInt64Any +VarToInt64AsString +VarToInt64Custom +VarToInt64ViaOS +VarToIntAny +VarToIntAsString +VarToIntCustom +VarToInterface +VarToIntViaOS +VarToLStrAny +VarToLStrCustom +VarToLStrViaOS +VarToSQLTimeStamp +VarToStr +VarToStrDef +VarToWideStr +VarToWideStrDef +VarToWStrAny +VarToWStrCustom +VarToWStrViaOS +VarType +VarTypeAsText +VarTypeIsCustom +VarTypeIsFloat +VarTypeIsNumeric +VarTypeIsOrdinal +VarTypeIsStr +VarTypeIsValidArrayType +VarTypeIsValidElementType +VarTypeToDataType +VarUI1FromBool +VarUI1FromCy +VarUI1FromDate +VarUI1FromDec +VarUI1FromDisp +VarUI1FromI1 +VarUI1FromI2 +VarUI1FromI4 +VarUI1FromR4 +VarUI1FromR8 +VarUI1FromStr +VarUI1FromUI2 +VarUI1FromUI4 +VarUtils +VCLCom +VCLEditors +VclExit +VclInit +VCLSprigs +VDBConsts +VectorFromBstr +VerFindFile +VerFindFileA +VerFindFileW +Verified +VerifyBoolStrArray +VerifyField +VerifyGroupIndex +VerInstallFile +VerInstallFileA +VerInstallFileW +VerLanguageName +VerLanguageNameA +VerLanguageNameW +VerQueryValue +VerQueryValueA +VerQueryValueW +vfprintf +ViewActivated +ViewAll +ViewExplorer +ViewForms +ViewModified +ViewNone +ViewNotification +ViewObjectInspector +ViewShowing +ViewUnits +VirtIntf +virtual +VirtualAlloc +VirtualAllocEx +VirtualFree +VirtualFreeEx +VirtualLock +VirtualProtect +VirtualProtectEx +VirtualQuery +VirtualQueryEx +VirtualUnlock +Visible +VisibleButtonCount +VisibleChanged +VisibleChanging +VisibleCount +VisualRefresh +VkKeyScan +VkKeyScanA +VkKeyScanEx +VkKeyScanExA +VkKeyScanExW +VkKeyScanW +VolumeID +vsfFunction +WaitCommEvent +WaitFor +WaitForConnectComplete +WaitForData +WaitForDebugEvent +WaitForInputIdle +WaitForMultipleObjects +WaitForMultipleObjectsEx +WaitForPrinterChange +WaitForReadSignal +WaitForSingleObject +WaitForSingleObjectEx +WaitForSyncEvent +WaitForWriteSignal +WaitMessage +WaitNamedPipe +WaitNamedPipeA +WaitNamedPipeW +WakeMainThread +WantChildKey +warning +was +WashVariant +waveInAddBuffer +waveInClose +waveInGetDevCaps +waveInGetDevCapsA +waveInGetDevCapsW +waveInGetErrorText +waveInGetErrorTextA +waveInGetErrorTextW +waveInGetID +waveInGetNumDevs +waveInGetPosition +waveInMessage +waveInOpen +waveInPrepareHeader +waveInReset +waveInStart +waveInStop +waveInUnprepareHeader +waveOutBreakLoop +waveOutClose +waveOutGetDevCaps +waveOutGetDevCapsA +waveOutGetDevCapsW +waveOutGetErrorText +waveOutGetErrorTextA +waveOutGetErrorTextW +waveOutGetID +waveOutGetNumDevs +waveOutGetPitch +waveOutGetPlaybackRate +waveOutGetPosition +waveOutGetVolume +waveOutMessage +waveOutOpen +waveOutPause +waveOutPrepareHeader +waveOutReset +waveOutRestart +waveOutSetPitch +waveOutSetPlaybackRate +waveOutSetVolume +waveOutUnprepareHeader +waveOutWrite +WCharFromChar +wContext +wContinue +wDriverId +WebColorNameToColor +WebColorStrToColor +WebColorToRGB +WebModuleCreate +WebModuleDestroy +WeekOf +WeekOfTheMonth +WeekOfTheYear +WeeksBetween +WeeksInAYear +WeeksInYear +WeekSpan +wFlags +wglCopyContext +wglCreateContext +wglCreateLayerContext +wglDeleteContext +wglDescribeLayerPlane +wglGetCurrentContext +wglGetCurrentDC +wglGetLayerPaletteEntries +wglGetProcAddress +wglMakeCurrent +wglRealizeLayerPalette +wglSetLayerPaletteEntries +wglShareLists +wglSwapLayerBuffers +wglSwapMultipleBuffers +wglUseFontBitmaps +wglUseFontBitmapsA +wglUseFontBitmapsW +wglUseFontOutlines +wglUseFontOutlinesA +wglUseFontOutlinesW +WHashValOfLHashVal +WhereX +WhereY +while +WideAdjustLineBreaks +WideAppend +WideAssign +WideCat +WideCharLenToString +WideCharLenToStrVar +WideCharToChar +WideCharToMultiByte +WideCharToShortString +WideCharToString +WideCharToStrVar +WideCompareStr +WideCompareText +WideCopy +WideDelete +WideDequotedStr +WideEqual +WideExtractQuotedStr +WideFmtStr +WideFormat +WideFormatBuf +WideFree +WideFromAnsi +WideFromPChar +WideGreater +WideInsert +WideLastChar +WideLength +WideLess +WideLowerCase +WidenPath +WidePos +WideQuotedStr +WideReplaceStr +WideReplaceText +WideSameStr +WideSameText +WideSetLength +WideStringAlloc +WideStringReplace +WideStrings +WideStringToBytes +wideStringToDom +WideStringToUCS4String +WideStrUtils +WideUpperCase +will +WillChangeField +WillChangeRecord +WillChangeRecordset +WillConnect +WillExecute +WillMove +Win32Check +Win32NLSEnableIME +WinControlDragDrop +WinControlDragOver +WinControlPaletteOver +window +WindowActivated +WindowCommand +WindowEnumerationTester +WindowFromDC +WindowFromPoint +WindowHide +WindowList +WindowNotification +WindowProc +Windows +WindowShow +WinError +WinExec +WinHelp +WinHelpA +WinHelpViewer +WinHelpW +WinInet +WinLoadTrustProvider +WinSock +WinSpool +WinSubmitCertificate +WinSvc +WinVerifyTrust +with +WithinPastDays +WithinPastHours +WithinPastMilliSeconds +WithinPastMinutes +WithinPastMonths +WithinPastSeconds +WithinPastWeeks +WithinPastYears +WMActivate +WMCancelMode +WMCaptureChanged +WMChar +WMCharToItem +WMClear +WMClose +WMCommand +WMCompareItem +WMContextMenu +WMCopy +WMCreate +WMCtlColorEdit +WMCut +WMDeleteItem +WMDestroy +WMDrawItem +WMEnterMenuLoop +WMEraseBkGnd +WMFontChange +WMGetDlgCode +WMGetMinMaxInfo +WMGetText +WMGetTextLength +WMHelp +WMHScroll +WMIconEraseBkgnd +WMIMEEndComp +WMIMEStartComp +WMInitDialog +WMInitMenuPopup +WMKeyDown +WMKeyUp +WMKillFocus +WMLButtonDblClk +WMLButtonDown +WMLButtonUp +WMMDIActivate +WMMeasureItem +WMMenuChar +WMMenuSelect +WMMIDASIcon +WMMouseActivate +WMMouseLeave +WMMouseMove +WMMove +WMNCCalcSize +WMNCCreate +WMNCDestroy +WMNCHitTest +WMNCLButtonDown +WMNCPaint +WMNextDlgCtl +WMNotify +WMNotifyFormat +WMPaint +WMPaletteChanged +WMParentNotify +WMPaste +WMPrint +WMPrintClient +WMQueryDragIcon +WMQueryEndSession +WMQueryNewPalette +WMRButtonUp +WMSetCursor +WMSetFocus +WMSetFont +WMSetText +WMSettingChange +WMShowWindow +WMSize +WMSysChar +WMSysColorChange +WMSysCommand +WMSysKeyDown +WMSysKeyUp +WMTimeChange +WMTimer +WMUndo +WMVKeyToItem +WMVScroll +WMWindowPosChanged +WMWindowPosChanging +WMWinIniChange +Wnd +WndCaller +wndParent +WndProc +WNetAddConnection +WNetAddConnection2 +WNetAddConnection2A +WNetAddConnection2W +WNetAddConnection3 +WNetAddConnection3A +WNetAddConnection3W +WNetAddConnectionA +WNetAddConnectionW +WNetCancelConnection +WNetCancelConnection2 +WNetCancelConnection2A +WNetCancelConnection2W +WNetCancelConnectionA +WNetCancelConnectionW +WNetCloseEnum +WNetConnectionDialog +WNetConnectionDialog1 +WNetConnectionDialog1A +WNetConnectionDialog1W +WNetDisconnectDialog +WNetDisconnectDialog1 +WNetDisconnectDialog1A +WNetDisconnectDialog1W +WNetEnumResource +WNetEnumResourceA +WNetEnumResourceW +WNetGetConnection +WNetGetConnectionA +WNetGetConnectionW +WNetGetLastError +WNetGetLastErrorA +WNetGetLastErrorW +WNetGetNetworkInformation +WNetGetNetworkInformationA +WNetGetNetworkInformationW +WNetGetProviderName +WNetGetProviderNameA +WNetGetProviderNameW +WNetGetResourceParent +WNetGetResourceParentA +WNetGetResourceParentW +WNetGetUniversalName +WNetGetUniversalNameA +WNetGetUniversalNameW +WNetGetUser +WNetGetUserA +WNetGetUserW +WNetOpenEnum +WNetOpenEnumA +WNetOpenEnumW +WNetSetConnection +WNetSetConnectionA +WNetSetConnectionW +WNetUseConnection +WNetUseConnectionA +WNetUseConnectionW +Word +WorkArea +WrapButtons +WrapDSOandSession +WrapHorz +WrapSizeHorz +WrapSizeVert +WrapText +Write +WriteArray +WriteAt +writeAttributeDeclaration +WriteAttributeSet +WriteBinary +WriteBinaryData +WriteBinaryStream +WriteBlock +WriteBool +WriteBoolean +WriteBuffer +WriteCalculated +writeCDATA +WriteChar +writeCharRef +WriteClassStg +WriteClassStm +writeCode +writeCodeAsUTF16 +writeCodeAsUTF8 +WriteCollection +WriteCollectionProp +WriteCols +WriteColumns +WriteColWidths +writeComment +WriteComponent +WriteComponentRes +WriteComponentResFile +WriteComponentSimulation +writeConditionalSection +WriteConsole +WriteConsoleA +WriteConsoleInput +WriteConsoleInputA +WriteConsoleInputW +WriteConsoleOutput +WriteConsoleOutputA +WriteConsoleOutputAttribute +WriteConsoleOutputCharacter +WriteConsoleOutputCharacterA +WriteConsoleOutputCharacterW +WriteConsoleOutputW +WriteConsoleW +writeContentspec +WriteControlName +WriteCurrency +WriteData +WriteDataPacket +WriteDataSet +WriteDate +WriteDateTime +WriteDescendent +WriteDescendentRes +WriteDesignerData +WriteDesignSize +writeDoctype +WriteDOMVendor +WriteDouble +writeElementDeclaration +WriteEMFStream +writeEmptyElement +writeEndElement +writeEndPrefixMapping +writeEntityDeclaration +writeEntityRef +WriteErrorMessage +WriteExpandedState +WriteExpandString +WriteFacet +WriteFile +WriteFileEx +WriteFloat +WriteFloatProp +WriteFmtUserTypeStg +WriteGlassFrameBottom +WriteGlassFrameEnabled +WriteGlassFrameLeft +WriteGlassFrameRight +WriteGlassFrameSheetOfGlass +WriteGlassFrameTop +WriteHeight +WriteHitLogging +WriteHorizontalOffset +WriteHWL +WriteIcon +WriteIdent +WriteInt64Prop +WriteInteger +WriteIntProp +WriteItemData +WriteItems +WriteLeft +WriteLinkInfo +WriteListBegin +WriteListEnd +writeLn +WriteLogRecord +WriteLogRecordVariants +WriteLookup +WriteMetaData +WriteMinStr +WriteMultiple +WriteNode +WriteNodeData +WriteNodes +writeNotationDeclaration +WriteObjectProp +WriteOrdProp +WriteOutline +WriteParamData +writeParameterEntityRef +writePCDATA +WritePixelsPerInch +WritePrefix +WritePrinter +WritePrivateProfileSection +WritePrivateProfileSectionA +WritePrivateProfileSectionW +WritePrivateProfileString +WritePrivateProfileStringA +WritePrivateProfileStringW +WritePrivateProfileStruct +WritePrivateProfileStructA +WritePrivateProfileStructW +writeProcessingInstruction +WriteProcessMemory +WriteProfileSection +WriteProfileSectionA +WriteProfileSectionW +WriteProfileString +WriteProfileStringA +WriteProfileStringW +WriteProp +WriteProperties +WriteProperty +WritePropertyNames +WritePropName +WritePropPath +WriteRaw +WriteResourceHeader +WriteRootComponent +WriteRowHeights +WriteScan +WriteSet +WriteSettings +WriteSignature +WriteSingle +writeStartElement +writeStartPrefixMapping +WriteState +WriteStr +WriteString +WriteStringToStorage +WriteStrProp +WriteStyleProp +WriteTapemark +WriteText +writeTextDeclaration +WriteTextHeight +WriteTime +WriteToClipBoard +WriteToolbar +WriteTop +WriteToStream +WriteUnNamed +WriteValue +WriteVariant +WriteVerticalOffset +writeWhileCheckingForAMPAndLT +WriteWideChar +writeWideChars +WriteWideString +writeWideStrings +WriteWidth +WriteWMFStream +writeXmlDeclaration +WSAAsyncGetHostByAddr +WSAAsyncGetHostByName +WSAAsyncGetProtoByName +WSAAsyncGetProtoByNumber +WSAAsyncGetServByName +WSAAsyncGetServByPort +WSAAsyncSelect +WSACancelAsyncRequest +WSACancelBlockingCall +WSACleanup +WSAGetAsyncBuflen +WSAGetAsyncError +WSAGetLastError +WSAGetSelectError +WSAGetSelectEvent +WSAIsBlocking +WSAMakeSelectReply +WSAMakeSyncReply +WSARecvEx +WSASetBlockingHook +WSASetLastError +WSAStartup +WSAUnhookBlockingHook +wsprintf +wsprintfA +wsprintfW +WStrAlloc +WStrBufSize +WStrCat +WStrComp +WStrCopy +WStrDispose +WStrEnd +WStrError +WStrLCopy +WStrLen +WStrMove +WStrNew +WStrPCopy +WStrPLCopy +WStrPos +WStrScan +WStrSet +WSyvToKanji +wvsprintf +wvsprintfA +wvsprintfW +XactComplete +xc +xdom +XDRSchema +XdrTypeToXsdType +xEnumDisplayMonitors +xercesxmldom +xGetMonitorInfo +xGetMonitorInfoA +xGetMonitorInfoW +xInfo +xitCode +xmlAnalyseElement +XMLAnalyseEntityDef +XMLAnalyseNotationDecl +XMLAnalysePCDATA +XMLAnalysePubSysId +xmlAnalyseTag +XmlCharRefToInt +XmlCharRefToStr +XMLConst +XMLDataToSchema +xmlDeclaration +XMLDoc +XMLDocError +xmldom +XMLExtractLocalName +XMLExtractPrefix +XMLIntf +XmlIntToCharRef +XMLIsolateQuote +xmlNormalizeLineBreaks +xmlReplaceQuotes +XMLSchema +XMLSchema99 +XMLSchemaTags +XMLStringsChanging +XMLStringToWideString +XmlStrToCharRef +xmlTrunc +XMLTruncAngularBrackets +XMLTruncRoundBrackets +XMLTruncSpace +xMonitorFromPoint +xMonitorFromRect +xMonitorFromWindow +xor +XorRects +XPActnCtrls +xpert +XPMan +XPStyleActnCtrls +xSysFreeMem +xSysGetMem +xSysReallocMem +YearOf +YearsBetween +YearSpan +Yesterday +Yield +yIn +ymbolName +ZeroBcd +ZeroMemory +ZLib +zlibAllocMem +ZLibConst +zlibFreeMem +ZoneCaptionHitTest +ZoomWindow \ No newline at end of file diff --git a/PowerEditor/bin/plugins/APIs/perl.api b/PowerEditor/bin/plugins/APIs/perl.api new file mode 100644 index 00000000..bfb3a67a --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/perl.api @@ -0,0 +1,467 @@ +-BGCOLOR=> +-absolute=> +-action=> +-align=> +-alt=> +-anchor=> +-author=> +-background=> +-base=> +-bgcolor=> +-border=> +-borderwidth=> +-boundary=> +-cellpadding=> +-cellspacing=> +-checked=> +-class=> +-code=> +-colheader=> +-color=> +-colspan=> +-columns=> +-command=> +-compact=> +-content=> +-cookie=> +-default=> +-defaultextension=> +-domain=> +-dtd=> +-expand=> +-expires=> +-face=> +-filetypes=> +-fill=> +-foreground=> +-full=> +-head=> +-height=> +-href=> +-initialdir=> +-initialfile=> +-justification=> +-label=> +-labels=> +-language=> +-leftmargin=> +-linebreak=> +-location=> +-maxlength=> +-meta=> +-method=> +-msg=> +-multiple=> +-name=> +-nolabels=> +-nph=> +-on=> +-onBlur=> +-onChange=> +-onClick=> +-onFocus=> +-onLoad=> +-onMouseOut=> +-onMouseOver=> +-onSelect=> +-onSubmit=> +-onUnload=> +-override=> +-padx=> +-pady=> +-path=> +-path_info=> +-query=> +-query_string=> +-refresh=> +-rel=> +-relative=> +-relief=> +-rowheader=> +-rows=> +-rowspan=> +-script=> +-secure=> +-selected=> +-side=> +-size=> +-src=> +-status=> +-style=> +-target=> +-text=> +-textvariable=> +-title=> +-topmargin=> +-type=> +-uri=> +-url=> +-valign=> +-value=> +-values=> +-width=> +-wrap=> +-xbase=> +ARGV +AUTOLOAD +Accept +BEGIN +Balloon +Button +CORE +DATA +DESTROY +END +Entry +Frame +Label +MainLoop +Radiobutton +STDERR +STDIN +STDOUT +SUPER +Tr +UNIVERSAL +__DATA__ +__END__ +__END__ +__FILE__ +__LINE__ +__PACKAGE__ +abs +accept +address +alarm +and +atan2 +attach +auth_type +autoEscape +bind +binmode +bless +br +button +caller +caption +chdir +checkbox +checkbox_group +chmod +chomp +chop +chown +chr +chroot +close +closedir +cmp +compile +configure +connect +constant +continue +cookie +cos +crypt +dbmclose +dbmopen +defaults +defined +deiconify +delete +delete_all +die +div +do +dump +each +else +elsif +em +end +end_h1 +end_html +end_table +end_ul +endform +endgrent +endhostent +endif +endnetent +endprotoent +endpwent +endservent +eof +eq +escape +escape_HTML +eval +exec +exists +exit +exp +fcntl +filefield +fileno +flock +font +for +foreach +fork +format +formline +ge +geometry +getc +getgrent +getgrgid +getgrname +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 +groove +gt +h1 +h2 +h3 +h4 +h5 +header +hex +hidden +hr +http +https +if +image_button +img +index +insert +int +ioctl +isindex +join +keys +kill +last +lc +lcfirst +le +length +li +link +listen +local +localtime +log +lstat +lt +map +maxsize +minsize +mkdir +msgctl +msgget +msgrcv +msgsnd +multipart_end +multipart_init +multipart_start +my +ne +next +no +not +oct +ol +open +opendir +or +ord +pack +package +param +param_fetch +password_field +path_info +pipe +pop +popup_menu +pos +pre +print +printf +prototype +push +qq +query_string +quotemeta +qw +qx +radio_group +raise +rand +raw_cookie +read +readdir +readline +readlink +readpipe +recv +redirect +redo +ref +referer +remote_addr +remote_host +remote_indent +remote_user +rename +request_method +require +reset +resizable +return +reverse +rewinddir +rindex +rmdir +scalar +script_name +scrolling_list +seek +seekdir +select +self_url +semctl +semget +semop +send +server_name +server_port +server_software +set +setgrent +sethostent +setnetent +setpgrp +setpriority +setprotoent +setpwent +setservent +setsockopt +shift +shmctl +shmget +shmread +shmwrite +shutdown +sin +sleep +socket +socketpair +sort +span +splice +split +sprintf +sqrt +srand +start_form +start_h1 +start_html +start_multipart_form +start_table +start_ul +startform +stat +strict +strong +study +sub +submit +substr +symlink +syscall +sysopen +sysread +sysseek +system +syswrite +table +tagConfigure +td +tell +telldir +textarea +textfield +th +tie +tied +time +times +title +tmpFileName +top +tr +truncate +uc +ucfirst +ul +umask +undef +unescape +unescapeHTML +unless +unlink +unpack +unshift +untie +until +update +upload +uploadInfo +url +url_param +use +use_named_parameters +user_agent +user_name +utime +values +variable +vec +virtual_host +wait +waitpid +wantarray +warn +while +width +write +xor diff --git a/PowerEditor/bin/plugins/APIs/php.api b/PowerEditor/bin/plugins/APIs/php.api new file mode 100644 index 00000000..a89b9b1e --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/php.api @@ -0,0 +1,2655 @@ + +abs +abstract +acos +acosh +addcslashes +addslashes +apache_child_terminate +apache_lookup_uri +apache_note +apache_setenv +array +array_change_key_case +array_chunk +array_count_values +array_diff +array_fill +array_filter +array_flip +array_intersect +array_key_exists +array_keys +array_map +array_merge +array_merge_recursive +array_multisort +array_pad +array_pop +array_push +array_rand +array_reduce +array_reverse +array_search +array_shift +array_slice +array_splice +array_sum +array_unique +array_unshift +array_values +array_walk +arsort +ascii2ebcdic +asin +asinh +asort +aspell_check +aspell_check_raw +aspell_new +aspell_suggest +assert +assert_options +atan +atan2 +atanh +base64_decode +base64_encode +base_convert +basename +bcadd +bccomp +bcdiv +bcmod +bcmul +bcpow +bcscale +bcsqrt +bcsub +bin2hex +bind_textdomain_codeset +bindec +bindtextdomain +bzclose +bzcompress +bzdecompress +bzerrno +bzerror +bzerrstr +bzflush +bzopen +bzread +bzwrite +cal_days_in_month +cal_from_jd +cal_info +cal_to_jd +call_user_func +call_user_func_array +call_user_method +call_user_method_array +ccvs_add +ccvs_auth +ccvs_command +ccvs_count +ccvs_delete +ccvs_done +ccvs_init +ccvs_lookup +ccvs_new +ccvs_report +ccvs_return +ccvs_reverse +ccvs_sale +ccvs_status +ccvs_textvalue +ccvs_void +ceil +chdir +checkdate +checkdnsrr +chgrp +chmod +chop +chown +chr +chroot +chunk_split +class +class_exists +clearstatcache +closedir +closelog +com_addref +com_get +com_invoke +com_isenum +com_load +com_load_typelib +com_propget +com_propput +com_propset +com_release +com_set +compact +connection_aborted +connection_status +connection_timeout +const +constant +convert_cyr_string +copy +cos +cosh +count +count_chars +cpdf_add_annotation +cpdf_add_outline +cpdf_arc +cpdf_begin_text +cpdf_circle +cpdf_clip +cpdf_close +cpdf_closepath +cpdf_closepath_fill_stroke +cpdf_closepath_stroke +cpdf_continue_text +cpdf_curveto +cpdf_end_text +cpdf_fill +cpdf_fill_stroke +cpdf_finalize +cpdf_finalize_page +cpdf_global_set_document_limits +cpdf_import_jpeg +cpdf_lineto +cpdf_moveto +cpdf_newpath +cpdf_open +cpdf_output_buffer +cpdf_page_init +cpdf_place_inline_image +cpdf_rect +cpdf_restore +cpdf_rlineto +cpdf_rmoveto +cpdf_rotate +cpdf_rotate_text +cpdf_save +cpdf_save_to_file +cpdf_scale +cpdf_set_action_url +cpdf_set_char_spacing +cpdf_set_creator +cpdf_set_current_page +cpdf_set_font +cpdf_set_font_directories +cpdf_set_font_map_file +cpdf_set_horiz_scaling +cpdf_set_keywords +cpdf_set_leading +cpdf_set_page_animation +cpdf_set_subject +cpdf_set_text_matrix +cpdf_set_text_pos +cpdf_set_text_rendering +cpdf_set_text_rise +cpdf_set_title +cpdf_set_viewer_preferences +cpdf_set_word_spacing +cpdf_setdash +cpdf_setflat +cpdf_setgray +cpdf_setgray_fill +cpdf_setgray_stroke +cpdf_setlinecap +cpdf_setlinejoin +cpdf_setlinewidth +cpdf_setmiterlimit +cpdf_setrgbcolor +cpdf_setrgbcolor_fill +cpdf_setrgbcolor_stroke +cpdf_show +cpdf_show_xy +cpdf_stringwidth +cpdf_stroke +cpdf_text +cpdf_translate +crack_check +crack_closedict +crack_getlastmessage +crack_opendict +crc32 +create_function +crypt +ctype_alnum +ctype_alpha +ctype_cntrl +ctype_digit +ctype_graph +ctype_lower +ctype_print +ctype_punct +ctype_space +ctype_upper +ctype_xdigit +curl_close +curl_errno +curl_error +curl_exec +curl_getinfo +curl_init +curl_setopt +curl_version +current +cybercash_base64_decode +cybercash_base64_encode +cybercash_decr +cybercash_encr +cybermut_creerformulairecm +cybermut_creerreponsecm +cybermut_testmac +cyrus_authenticate +cyrus_bind +cyrus_close +cyrus_connect +cyrus_query +cyrus_unbind +date +dba_close +dba_delete +dba_exists +dba_fetch +dba_firstkey +dba_insert +dba_nextkey +dba_open +dba_optimize +dba_popen +dba_replace +dba_sync +dbase_add_record +dbase_close +dbase_create +dbase_delete_record +dbase_get_record +dbase_get_record_with_names +dbase_numfields +dbase_numrecords +dbase_open +dbase_pack +dbase_replace_record +dblist +dbmclose +dbmdelete +dbmexists +dbmfetch +dbmfirstkey +dbminsert +dbmnextkey +dbmopen +dbmreplace +dbplus_add +dbplus_aql +dbplus_chdir +dbplus_close +dbplus_curr +dbplus_errcode +dbplus_errno +dbplus_find +dbplus_first +dbplus_flush +dbplus_freealllocks +dbplus_freelock +dbplus_freerlocks +dbplus_getlock +dbplus_getunique +dbplus_info +dbplus_last +dbplus_lockrel +dbplus_next +dbplus_open +dbplus_prev +dbplus_rchperm +dbplus_rcreate +dbplus_rcrtexact +dbplus_rcrtlike +dbplus_resolve +dbplus_restorepos +dbplus_rkeys +dbplus_ropen +dbplus_rquery +dbplus_rrename +dbplus_rsecindex +dbplus_runlink +dbplus_rzap +dbplus_savepos +dbplus_setindex +dbplus_setindexbynumber +dbplus_sql +dbplus_tcl +dbplus_tremove +dbplus_undo +dbplus_undoprepare +dbplus_unlockrel +dbplus_unselect +dbplus_update +dbplus_xlockrel +dbplus_xunlockrel +dbx_close +dbx_compare +dbx_connect +dbx_error +dbx_query +dbx_sort +dcgettext +dcngettext +debugger_off +debugger_on +decbin +dechex +decoct +define +define_syslog_variables +defined +deg2rad +delete +dgettext +die +dio_close +dio_fcntl +dio_open +dio_read +dio_seek +dio_stat +dio_truncate +dio_write +dirname +disk_free_space +disk_total_space +diskfreespace +dl +dngettext +domattribute->name +domattribute->specified +domattribute->value +domdocument->create_attribute +domdocument->create_cdata_section +domdocument->create_comment +domdocument->create_element +domdocument->create_entity_reference +domdocument->create_processing_instruction +domdocument->create_text_node +domdocument->doctype +domdocument->document_element +domdocument->dump_file +domdocument->dump_mem +domdocument->get_element_by_id +domdocument->get_elements_by_tagname +domdocument->html_dump_mem +domdocumenttype->entities +domdocumenttype->internal_subset +domdocumenttype->name +domdocumenttype->notations +domdocumenttype->public_id +domdocumenttype->system_id +domelement->get_attribute +domelement->get_attribute_node +domelement->get_elements_by_tagname +domelement->has_attribute +domelement->remove_attribute +domelement->set_attribute +domelement->set_attribute_node +domelement->tagname +domnode->append_child +domnode->append_sibling +domnode->attributes +domnode->clone_node +domnode->dump_node +domnode->first_child +domnode->get_content +domnode->has_child_nodes +domnode->insert_before +domnode->is_blank_node +domnode->last_child +domnode->next_sibling +domnode->node_name +domnode->node_type +domnode->node_value +domnode->owner_document +domnode->parent_node +domnode->prefix +domnode->previous_sibling +domnode->remove_child +domnode->replace_child +domnode->replace_node +domnode->set_content +domnode->set_name +domnode->unlink_node +domprocessinginstruction->data +domprocessinginstruction->target +domxml_new_doc +domxml_open_file +domxml_open_mem +domxml_version +domxml_xmltree +dotnet_load +doubleval +each +easter_date +easter_days +ebcdic2ascii +echo +empty +end +ereg +ereg_replace +eregi +eregi_replace +error_log +error_reporting +escapeshellarg +escapeshellcmd +eval +exec +exif_imagetype +exif_read_data +exif_thumbnail +exit +exp +explode +expm1 +extension_loaded +extract +ezmlm_hash +fbsql_affected_rows +fbsql_autocommit +fbsql_change_user +fbsql_close +fbsql_commit +fbsql_connect +fbsql_create_blob +fbsql_create_clob +fbsql_create_db +fbsql_data_seek +fbsql_database +fbsql_database_password +fbsql_db_query +fbsql_db_status +fbsql_drop_db +fbsql_errno +fbsql_error +fbsql_fetch_array +fbsql_fetch_assoc +fbsql_fetch_field +fbsql_fetch_lengths +fbsql_fetch_object +fbsql_fetch_row +fbsql_field_flags +fbsql_field_len +fbsql_field_name +fbsql_field_seek +fbsql_field_table +fbsql_field_type +fbsql_free_result +fbsql_get_autostart_info +fbsql_hostname +fbsql_insert_id +fbsql_list_dbs +fbsql_list_fields +fbsql_list_tables +fbsql_next_result +fbsql_num_fields +fbsql_num_rows +fbsql_password +fbsql_pconnect +fbsql_query +fbsql_read_blob +fbsql_read_clob +fbsql_result +fbsql_rollback +fbsql_select_db +fbsql_set_lob_mode +fbsql_set_transaction +fbsql_start_db +fbsql_stop_db +fbsql_tablename +fbsql_username +fbsql_warnings +fclose +fdf_add_template +fdf_close +fdf_create +fdf_get_file +fdf_get_status +fdf_get_value +fdf_next_field_name +fdf_open +fdf_save +fdf_set_ap +fdf_set_encoding +fdf_set_file +fdf_set_flags +fdf_set_javascript_action +fdf_set_opt +fdf_set_status +fdf_set_submit_form_action +fdf_set_value +feof +fflush +fgetc +fgetcsv +fgets +fgetss +file +file_exists +file_get_contents +file_get_wrapper_data +file_register_wrapper +fileatime +filectime +filegroup +fileinode +filemtime +fileowner +fileperms +filepro +filepro_fieldcount +filepro_fieldname +filepro_fieldtype +filepro_fieldwidth +filepro_retrieve +filepro_rowcount +filesize +filetype +floatval +flock +floor +flush +fopen +fpassthru +fputs +fread +frenchtojd +fribidi_log2vis +fscanf +fseek +fsockopen +fstat +ftell +ftok +ftp_cdup +ftp_chdir +ftp_close +ftp_connect +ftp_delete +ftp_exec +ftp_fget +ftp_fput +ftp_get +ftp_get_option +ftp_login +ftp_mdtm +ftp_mkdir +ftp_nlist +ftp_pasv +ftp_put +ftp_pwd +ftp_quit +ftp_rawlist +ftp_rename +ftp_rmdir +ftp_set_option +ftp_site +ftp_size +ftp_systype +ftruncate +func_get_arg +func_get_args +func_num_args +function +function_exists +fwrite +get_browser +get_cfg_var +get_class +get_class_methods +get_class_vars +get_current_user +get_declared_classes +get_defined_constants +get_defined_functions +get_defined_vars +get_extension_funcs +get_html_translation_table +get_included_files +get_loaded_extensions +get_magic_quotes_gpc +get_magic_quotes_runtime +get_meta_tags +get_object_vars +get_parent_class +get_required_files +get_resource_type +getallheaders +getcwd +getdate +getenv +gethostbyaddr +gethostbyname +gethostbynamel +getimagesize +getlastmod +getmxrr +getmygid +getmyinode +getmypid +getmyuid +getprotobyname +getprotobynumber +getrandmax +getrusage +getservbyname +getservbyport +gettext +gettimeofday +gettype +gmdate +gmmktime +gmp_abs +gmp_add +gmp_and +gmp_clrbit +gmp_cmp +gmp_com +gmp_div +gmp_div_q +gmp_div_qr +gmp_div_r +gmp_divexact +gmp_fact +gmp_gcd +gmp_gcdext +gmp_hamdist +gmp_init +gmp_intval +gmp_invert +gmp_jacobi +gmp_legendre +gmp_mod +gmp_mul +gmp_neg +gmp_or +gmp_perfect_square +gmp_popcount +gmp_pow +gmp_powm +gmp_prob_prime +gmp_random +gmp_scan0 +gmp_scan1 +gmp_setbit +gmp_sign +gmp_sqrt +gmp_strval +gmp_sub +gmp_xor +gmstrftime +gregoriantojd +gzclose +gzcompress +gzdeflate +gzencode +gzeof +gzfile +gzgetc +gzgets +gzgetss +gzinflate +gzopen +gzpassthru +gzputs +gzread +gzrewind +gzseek +gztell +gzuncompress +gzwrite +header +headers_sent +hebrev +hebrevc +hexdec +highlight_file +highlight_string +htmlentities +htmlspecialchars +hw_array2objrec +hw_changeobject +hw_children +hw_childrenobj +hw_close +hw_connect +hw_connection_info +hw_cp +hw_deleteobject +hw_docbyanchor +hw_docbyanchorobj +hw_document_attributes +hw_document_bodytag +hw_document_content +hw_document_setcontent +hw_document_size +hw_dummy +hw_edittext +hw_error +hw_errormsg +hw_free_document +hw_getanchors +hw_getanchorsobj +hw_getandlock +hw_getchildcoll +hw_getchildcollobj +hw_getchilddoccoll +hw_getchilddoccollobj +hw_getobject +hw_getobjectbyquery +hw_getobjectbyquerycoll +hw_getobjectbyquerycollobj +hw_getobjectbyqueryobj +hw_getparents +hw_getparentsobj +hw_getrellink +hw_getremote +hw_getremotechildren +hw_getsrcbydestobj +hw_gettext +hw_getusername +hw_identify +hw_incollections +hw_info +hw_inscoll +hw_insdoc +hw_insertanchors +hw_insertdocument +hw_insertobject +hw_mapid +hw_modifyobject +hw_mv +hw_new_document +hw_objrec2array +hw_output_document +hw_pconnect +hw_pipedocument +hw_root +hw_setlinkroot +hw_stat +hw_unlock +hw_who +hwapi_hgcsp +hypot +ibase_blob_add +ibase_blob_cancel +ibase_blob_close +ibase_blob_create +ibase_blob_echo +ibase_blob_get +ibase_blob_import +ibase_blob_info +ibase_blob_open +ibase_close +ibase_commit +ibase_connect +ibase_errmsg +ibase_execute +ibase_fetch_object +ibase_fetch_row +ibase_field_info +ibase_free_query +ibase_free_result +ibase_num_fields +ibase_pconnect +ibase_prepare +ibase_query +ibase_rollback +ibase_timefmt +ibase_trans +icap_close +icap_create_calendar +icap_delete_calendar +icap_delete_event +icap_fetch_event +icap_list_alarms +icap_list_events +icap_open +icap_rename_calendar +icap_reopen +icap_snooze +icap_store_event +iconv +iconv_get_encoding +iconv_set_encoding +ifx_affected_rows +ifx_blobinfile_mode +ifx_byteasvarchar +ifx_close +ifx_connect +ifx_copy_blob +ifx_create_blob +ifx_create_char +ifx_do +ifx_error +ifx_errormsg +ifx_fetch_row +ifx_fieldproperties +ifx_fieldtypes +ifx_free_blob +ifx_free_char +ifx_free_result +ifx_get_blob +ifx_get_char +ifx_getsqlca +ifx_htmltbl_result +ifx_nullformat +ifx_num_fields +ifx_num_rows +ifx_pconnect +ifx_prepare +ifx_query +ifx_textasvarchar +ifx_update_blob +ifx_update_char +ifxus_close_slob +ifxus_create_slob +ifxus_free_slob +ifxus_open_slob +ifxus_read_slob +ifxus_seek_slob +ifxus_tell_slob +ifxus_write_slob +ignore_user_abort +image2wbmp +imagealphablending +imagearc +imagechar +imagecharup +imagecolorallocate +imagecolorat +imagecolorclosest +imagecolorclosestalpha +imagecolorclosesthwb +imagecolordeallocate +imagecolorexact +imagecolorexactalpha +imagecolorresolve +imagecolorresolvealpha +imagecolorset +imagecolorsforindex +imagecolorstotal +imagecolortransparent +imagecopy +imagecopymerge +imagecopymergegray +imagecopyresampled +imagecopyresized +imagecreate +imagecreatefromgd +imagecreatefromgd2 +imagecreatefromgd2part +imagecreatefromgif +imagecreatefromjpeg +imagecreatefrompng +imagecreatefromstring +imagecreatefromwbmp +imagecreatefromxbm +imagecreatefromxpm +imagecreatetruecolor +imagedashedline +imagedestroy +imageellipse +imagefill +imagefilledarc +imagefilledellipse +imagefilledpolygon +imagefilledrectangle +imagefilltoborder +imagefontheight +imagefontwidth +imageftbbox +imagefttext +imagegammacorrect +imagegd +imagegd2 +imagegif +imageinterlace +imagejpeg +imageline +imageloadfont +imagepalettecopy +imagepng +imagepolygon +imagepsbbox +imagepscopyfont +imagepsencodefont +imagepsextendfont +imagepsfreefont +imagepsloadfont +imagepsslantfont +imagepstext +imagerectangle +imagesetbrush +imagesetpixel +imagesetstyle +imagesetthickness +imagesettile +imagestring +imagestringup +imagesx +imagesy +imagetruecolortopalette +imagettfbbox +imagettftext +imagetypes +imagewbmp +imap_8bit +imap_alerts +imap_append +imap_base64 +imap_binary +imap_body +imap_bodystruct +imap_check +imap_clearflag_full +imap_close +imap_createmailbox +imap_delete +imap_deletemailbox +imap_errors +imap_expunge +imap_fetch_overview +imap_fetchbody +imap_fetchheader +imap_fetchstructure +imap_get_quota +imap_getmailboxes +imap_getsubscribed +imap_header +imap_headerinfo +imap_headers +imap_last_error +imap_listmailbox +imap_listsubscribed +imap_mail +imap_mail_compose +imap_mail_copy +imap_mail_move +imap_mailboxmsginfo +imap_mime_header_decode +imap_msgno +imap_num_msg +imap_num_recent +imap_open +imap_ping +imap_popen +imap_qprint +imap_renamemailbox +imap_reopen +imap_rfc822_parse_adrlist +imap_rfc822_parse_headers +imap_rfc822_write_address +imap_scanmailbox +imap_search +imap_set_quota +imap_setacl +imap_setflag_full +imap_sort +imap_status +imap_subscribe +imap_thread +imap_uid +imap_undelete +imap_unsubscribe +imap_utf7_decode +imap_utf7_encode +imap_utf8 +implements +implode +import_request_variables +in_array +include +include_once +ingres_autocommit +ingres_close +ingres_commit +ingres_connect +ingres_fetch_array +ingres_fetch_object +ingres_fetch_row +ingres_field_length +ingres_field_name +ingres_field_nullable +ingres_field_precision +ingres_field_scale +ingres_field_type +ingres_num_fields +ingres_num_rows +ingres_pconnect +ingres_query +ingres_rollback +ini_alter +ini_get +ini_get_all +ini_restore +ini_set +instanceof +interface +intval +ip2long +iptcembed +iptcparse +ircg_channel_mode +ircg_disconnect +ircg_fetch_error_msg +ircg_get_username +ircg_html_encode +ircg_ignore_add +ircg_ignore_del +ircg_is_conn_alive +ircg_join +ircg_kick +ircg_lookup_format_messages +ircg_msg +ircg_nick +ircg_nickname_escape +ircg_nickname_unescape +ircg_notice +ircg_part +ircg_pconnect +ircg_register_format_messages +ircg_set_current +ircg_set_file +ircg_set_on_die +ircg_topic +ircg_whois +is_a +is_array +is_bool +is_callable +is_dir +is_double +is_executable +is_file +is_finite +is_float +is_infinite +is_int +is_integer +is_link +is_long +is_nan +is_null +is_numeric +is_object +is_readable +is_real +is_resource +is_scalar +is_string +is_subclass_of +is_uploaded_file +is_writable +is_writeable +isset +java_last_exception_clear +java_last_exception_get +jddayofweek +jdmonthname +jdtofrench +jdtogregorian +jdtojewish +jdtojulian +jdtounix +jewishtojd +join +jpeg2wbmp +juliantojd +key +krsort +ksort +lcg_value +ldap_8859_to_t61 +ldap_add +ldap_bind +ldap_close +ldap_compare +ldap_connect +ldap_count_entries +ldap_delete +ldap_dn2ufn +ldap_err2str +ldap_errno +ldap_error +ldap_explode_dn +ldap_first_attribute +ldap_first_entry +ldap_first_reference +ldap_free_result +ldap_get_attributes +ldap_get_dn +ldap_get_entries +ldap_get_option +ldap_get_values +ldap_get_values_len +ldap_list +ldap_mod_add +ldap_mod_del +ldap_mod_replace +ldap_modify +ldap_next_attribute +ldap_next_entry +ldap_next_reference +ldap_parse_reference +ldap_parse_result +ldap_read +ldap_rename +ldap_search +ldap_set_option +ldap_set_rebind_proc +ldap_sort +ldap_start_tls +ldap_t61_to_8859 +ldap_unbind +leak +levenshtein +link +linkinfo +list +localeconv +localtime +log +log10 +log1p +long2ip +lstat +ltrim +mail +mailparse_determine_best_xfer_encoding +mailparse_msg_create +mailparse_msg_extract_part +mailparse_msg_extract_part_file +mailparse_msg_free +mailparse_msg_get_part +mailparse_msg_get_part_data +mailparse_msg_get_structure +mailparse_msg_parse +mailparse_msg_parse_file +mailparse_rfc822_parse_addresses +mailparse_stream_encode +mailparse_uudecode_all +max +mb_convert_encoding +mb_convert_kana +mb_convert_variables +mb_decode_mimeheader +mb_decode_numericentity +mb_detect_encoding +mb_detect_order +mb_encode_mimeheader +mb_encode_numericentity +mb_ereg +mb_ereg_match +mb_ereg_replace +mb_ereg_search +mb_ereg_search_getpos +mb_ereg_search_getregs +mb_ereg_search_init +mb_ereg_search_pos +mb_ereg_search_regs +mb_ereg_search_setpos +mb_eregi +mb_eregi_replace +mb_get_info +mb_http_input +mb_http_output +mb_internal_encoding +mb_language +mb_output_handler +mb_parse_str +mb_preferred_mime_name +mb_regex_encoding +mb_send_mail +mb_split +mb_strcut +mb_strimwidth +mb_strlen +mb_strpos +mb_strrpos +mb_strwidth +mb_substitute_character +mb_substr +mcal_append_event +mcal_close +mcal_create_calendar +mcal_date_compare +mcal_date_valid +mcal_day_of_week +mcal_day_of_year +mcal_days_in_month +mcal_delete_calendar +mcal_delete_event +mcal_event_add_attribute +mcal_event_init +mcal_event_set_alarm +mcal_event_set_category +mcal_event_set_class +mcal_event_set_description +mcal_event_set_end +mcal_event_set_recur_daily +mcal_event_set_recur_monthly_mday +mcal_event_set_recur_monthly_wday +mcal_event_set_recur_none +mcal_event_set_recur_weekly +mcal_event_set_recur_yearly +mcal_event_set_start +mcal_event_set_title +mcal_expunge +mcal_fetch_current_stream_event +mcal_fetch_event +mcal_is_leap_year +mcal_list_alarms +mcal_list_events +mcal_next_recurrence +mcal_open +mcal_popen +mcal_rename_calendar +mcal_reopen +mcal_snooze +mcal_store_event +mcal_time_valid +mcal_week_of_year +mcrypt_cbc +mcrypt_cfb +mcrypt_create_iv +mcrypt_decrypt +mcrypt_ecb +mcrypt_enc_get_algorithms_name +mcrypt_enc_get_block_size +mcrypt_enc_get_iv_size +mcrypt_enc_get_key_size +mcrypt_enc_get_modes_name +mcrypt_enc_get_supported_key_sizes +mcrypt_enc_is_block_algorithm +mcrypt_enc_is_block_algorithm_mode +mcrypt_enc_is_block_mode +mcrypt_enc_self_test +mcrypt_encrypt +mcrypt_generic +mcrypt_generic_deinit +mcrypt_generic_end +mcrypt_generic_init +mcrypt_get_block_size +mcrypt_get_cipher_name +mcrypt_get_iv_size +mcrypt_get_key_size +mcrypt_list_algorithms +mcrypt_list_modes +mcrypt_module_close +mcrypt_module_get_algo_block_size +mcrypt_module_get_algo_key_size +mcrypt_module_get_supported_key_sizes +mcrypt_module_is_block_algorithm +mcrypt_module_is_block_algorithm_mode +mcrypt_module_is_block_mode +mcrypt_module_open +mcrypt_module_self_test +mcrypt_ofb +md5 +md5_file +mdecrypt_generic +metaphone +method_exists +mhash +mhash_count +mhash_get_block_size +mhash_get_hash_name +mhash_keygen_s2k +microtime +min +ming_setcubicthreshold +ming_setscale +ming_useswfversion +mkdir +mktime +move_uploaded_file +msession_connect +msession_count +msession_create +msession_destroy +msession_disconnect +msession_find +msession_get +msession_get_array +msession_getdata +msession_inc +msession_list +msession_listvar +msession_lock +msession_plugin +msession_randstr +msession_set +msession_set_array +msession_setdata +msession_timeout +msession_uniq +msession_unlock +msql +msql_affected_rows +msql_close +msql_connect +msql_create_db +msql_createdb +msql_data_seek +msql_dbname +msql_drop_db +msql_dropdb +msql_error +msql_fetch_array +msql_fetch_field +msql_fetch_object +msql_fetch_row +msql_field_seek +msql_fieldflags +msql_fieldlen +msql_fieldname +msql_fieldtable +msql_fieldtype +msql_free_result +msql_freeresult +msql_list_dbs +msql_list_fields +msql_list_tables +msql_listdbs +msql_listfields +msql_listtables +msql_num_fields +msql_num_rows +msql_numfields +msql_numrows +msql_pconnect +msql_query +msql_regcase +msql_result +msql_select_db +msql_selectdb +msql_tablename +mssql_bind +mssql_close +mssql_connect +mssql_data_seek +mssql_execute +mssql_fetch_array +mssql_fetch_assoc +mssql_fetch_batch +mssql_fetch_field +mssql_fetch_object +mssql_fetch_row +mssql_field_length +mssql_field_name +mssql_field_seek +mssql_field_type +mssql_free_result +mssql_get_last_message +mssql_guid_string +mssql_init +mssql_min_error_severity +mssql_min_message_severity +mssql_next_result +mssql_num_fields +mssql_num_rows +mssql_pconnect +mssql_query +mssql_result +mssql_rows_affected +mssql_select_db +mt_getrandmax +mt_rand +mt_srand +muscat_close +muscat_get +muscat_give +muscat_setup +muscat_setup_net +mysql_affected_rows +mysql_change_user +mysql_character_set_name +mysql_close +mysql_connect +mysql_create_db +mysql_data_seek +mysql_db_name +mysql_db_query +mysql_drop_db +mysql_errno +mysql_error +mysql_escape_string +mysql_fetch_array +mysql_fetch_assoc +mysql_fetch_field +mysql_fetch_lengths +mysql_fetch_object +mysql_fetch_row +mysql_field_flags +mysql_field_len +mysql_field_name +mysql_field_seek +mysql_field_table +mysql_field_type +mysql_free_result +mysql_get_client_info +mysql_get_host_info +mysql_get_proto_info +mysql_get_server_info +mysql_info +mysql_insert_id +mysql_list_dbs +mysql_list_fields +mysql_list_processes +mysql_list_tables +mysql_num_fields +mysql_num_rows +mysql_pconnect +mysql_ping +mysql_query +mysql_real_escape_string +mysql_result +mysql_select_db +mysql_stat +mysql_tablename +mysql_thread_id +mysql_unbuffered_query +natcasesort +natsort +ncurses_addch +ncurses_addchnstr +ncurses_addchstr +ncurses_addnstr +ncurses_addstr +ncurses_assume_default_colors +ncurses_attroff +ncurses_attron +ncurses_attrset +ncurses_baudrate +ncurses_beep +ncurses_bkgd +ncurses_bkgdset +ncurses_border +ncurses_can_change_color +ncurses_cbreak +ncurses_clear +ncurses_clrtobot +ncurses_clrtoeol +ncurses_color_set +ncurses_curs_set +ncurses_def_prog_mode +ncurses_def_shell_mode +ncurses_define_key +ncurses_delay_output +ncurses_delch +ncurses_deleteln +ncurses_delwin +ncurses_doupdate +ncurses_echo +ncurses_echochar +ncurses_end +ncurses_erase +ncurses_erasechar +ncurses_filter +ncurses_flash +ncurses_flushinp +ncurses_getch +ncurses_getmouse +ncurses_halfdelay +ncurses_has_colors +ncurses_has_ic +ncurses_has_il +ncurses_has_key +ncurses_hline +ncurses_inch +ncurses_init +ncurses_init_color +ncurses_init_pair +ncurses_insch +ncurses_insdelln +ncurses_insertln +ncurses_insstr +ncurses_instr +ncurses_isendwin +ncurses_keyok +ncurses_killchar +ncurses_longname +ncurses_mouseinterval +ncurses_mousemask +ncurses_move +ncurses_mvaddch +ncurses_mvaddchnstr +ncurses_mvaddchstr +ncurses_mvaddnstr +ncurses_mvaddstr +ncurses_mvcur +ncurses_mvdelch +ncurses_mvgetch +ncurses_mvhline +ncurses_mvinch +ncurses_mvvline +ncurses_mvwaddstr +ncurses_napms +ncurses_newwin +ncurses_nl +ncurses_nocbreak +ncurses_noecho +ncurses_nonl +ncurses_noqiflush +ncurses_noraw +ncurses_putp +ncurses_qiflush +ncurses_raw +ncurses_refresh +ncurses_resetty +ncurses_savetty +ncurses_scr_dump +ncurses_scr_init +ncurses_scr_restore +ncurses_scr_set +ncurses_scrl +ncurses_slk_attr +ncurses_slk_attroff +ncurses_slk_attron +ncurses_slk_attrset +ncurses_slk_clear +ncurses_slk_color +ncurses_slk_init +ncurses_slk_noutrefresh +ncurses_slk_refresh +ncurses_slk_restore +ncurses_slk_touch +ncurses_standend +ncurses_standout +ncurses_start_color +ncurses_termattrs +ncurses_termname +ncurses_timeout +ncurses_typeahead +ncurses_ungetch +ncurses_ungetmouse +ncurses_use_default_colors +ncurses_use_env +ncurses_use_extended_names +ncurses_vidattr +ncurses_vline +ncurses_wrefresh +next +ngettext +nl2br +nl_langinfo +notes_body +notes_copy_db +notes_create_db +notes_create_note +notes_drop_db +notes_find_note +notes_header_info +notes_list_msgs +notes_mark_read +notes_mark_unread +notes_nav_create +notes_search +notes_unread +notes_version +number_format +ob_clean +ob_end_clean +ob_end_flush +ob_flush +ob_get_contents +ob_get_length +ob_get_level +ob_gzhandler +ob_iconv_handler +ob_implicit_flush +ob_start +ocibindbyname +ocicancel +ocicollappend +ocicollassign +ocicollassignelem +ocicollgetelem +ocicollmax +ocicollsize +ocicolltrim +ocicolumnisnull +ocicolumnname +ocicolumnprecision +ocicolumnscale +ocicolumnsize +ocicolumntype +ocicolumntyperaw +ocicommit +ocidefinebyname +ocierror +ociexecute +ocifetch +ocifetchinto +ocifetchstatement +ocifreecollection +ocifreecursor +ocifreedesc +ocifreestatement +ociinternaldebug +ociloadlob +ocilogoff +ocilogon +ocinewcollection +ocinewcursor +ocinewdescriptor +ocinlogon +ocinumcols +ociparse +ociplogon +ociresult +ocirollback +ocirowcount +ocisavelob +ocisavelobfile +ociserverversion +ocisetprefetch +ocistatementtype +ociwritelobtofile +octdec +odbc_autocommit +odbc_binmode +odbc_close +odbc_close_all +odbc_columnprivileges +odbc_columns +odbc_commit +odbc_connect +odbc_cursor +odbc_do +odbc_error +odbc_errormsg +odbc_exec +odbc_execute +odbc_fetch_array +odbc_fetch_into +odbc_fetch_object +odbc_fetch_row +odbc_field_len +odbc_field_name +odbc_field_num +odbc_field_precision +odbc_field_scale +odbc_field_type +odbc_foreignkeys +odbc_free_result +odbc_gettypeinfo +odbc_longreadlen +odbc_next_result +odbc_num_fields +odbc_num_rows +odbc_pconnect +odbc_prepare +odbc_primarykeys +odbc_procedurecolumns +odbc_procedures +odbc_result +odbc_result_all +odbc_rollback +odbc_setoption +odbc_specialcolumns +odbc_statistics +odbc_tableprivileges +odbc_tables +opendir +openlog +openssl_csr_export +openssl_csr_export_to_file +openssl_csr_new +openssl_csr_sign +openssl_error_string +openssl_free_key +openssl_get_privatekey +openssl_get_publickey +openssl_open +openssl_pkcs7_decrypt +openssl_pkcs7_encrypt +openssl_pkcs7_sign +openssl_pkcs7_verify +openssl_pkey_export +openssl_pkey_export_to_file +openssl_pkey_new +openssl_private_decrypt +openssl_private_encrypt +openssl_public_decrypt +openssl_public_encrypt +openssl_seal +openssl_sign +openssl_verify +openssl_x509_check_private_key +openssl_x509_checkpurpose +openssl_x509_export +openssl_x509_export_to_file +openssl_x509_free +openssl_x509_parse +openssl_x509_read +ora_bind +ora_close +ora_columnname +ora_columnsize +ora_columntype +ora_commit +ora_commitoff +ora_commiton +ora_do +ora_error +ora_errorcode +ora_exec +ora_fetch +ora_fetch_into +ora_getcolumn +ora_logoff +ora_logon +ora_numcols +ora_numrows +ora_open +ora_parse +ora_plogon +ora_rollback +ord +overload +ovrimos_close +ovrimos_commit +ovrimos_connect +ovrimos_cursor +ovrimos_exec +ovrimos_execute +ovrimos_fetch_into +ovrimos_fetch_row +ovrimos_field_len +ovrimos_field_name +ovrimos_field_num +ovrimos_field_type +ovrimos_free_result +ovrimos_longreadlen +ovrimos_num_fields +ovrimos_num_rows +ovrimos_prepare +ovrimos_result +ovrimos_result_all +ovrimos_rollback +pack +parse_ini_file +parse_str +parse_url +passthru +pathinfo +pclose +pcntl_exec +pcntl_fork +pcntl_signal +pcntl_waitpid +pcntl_wexitstatus +pcntl_wifexited +pcntl_wifsignaled +pcntl_wifstopped +pcntl_wstopsig +pcntl_wtermsig +pdf_add_annotation +pdf_add_bookmark +pdf_add_launchlink +pdf_add_locallink +pdf_add_note +pdf_add_outline +pdf_add_pdflink +pdf_add_thumbnail +pdf_add_weblink +pdf_arc +pdf_arcn +pdf_attach_file +pdf_begin_page +pdf_begin_pattern +pdf_begin_template +pdf_circle +pdf_clip +pdf_close +pdf_close_image +pdf_close_pdi +pdf_close_pdi_page +pdf_closepath +pdf_closepath_fill_stroke +pdf_closepath_stroke +pdf_concat +pdf_continue_text +pdf_curveto +pdf_delete +pdf_end_page +pdf_end_pattern +pdf_end_template +pdf_endpath +pdf_fill +pdf_fill_stroke +pdf_findfont +pdf_get_buffer +pdf_get_font +pdf_get_fontname +pdf_get_fontsize +pdf_get_image_height +pdf_get_image_width +pdf_get_majorversion +pdf_get_minorversion +pdf_get_parameter +pdf_get_pdi_parameter +pdf_get_pdi_value +pdf_get_value +pdf_initgraphics +pdf_lineto +pdf_makespotcolor +pdf_moveto +pdf_new +pdf_open +pdf_open_ccitt +pdf_open_file +pdf_open_gif +pdf_open_image +pdf_open_image_file +pdf_open_jpeg +pdf_open_memory_image +pdf_open_pdi +pdf_open_pdi_page +pdf_open_png +pdf_open_tiff +pdf_place_image +pdf_place_pdi_page +pdf_rect +pdf_restore +pdf_rotate +pdf_save +pdf_scale +pdf_set_border_color +pdf_set_border_dash +pdf_set_border_style +pdf_set_char_spacing +pdf_set_duration +pdf_set_font +pdf_set_horiz_scaling +pdf_set_info +pdf_set_info_author +pdf_set_info_creator +pdf_set_info_keywords +pdf_set_info_subject +pdf_set_info_title +pdf_set_leading +pdf_set_parameter +pdf_set_text_pos +pdf_set_text_rendering +pdf_set_text_rise +pdf_set_value +pdf_set_word_spacing +pdf_setcolor +pdf_setdash +pdf_setflat +pdf_setfont +pdf_setgray +pdf_setgray_fill +pdf_setgray_stroke +pdf_setlinecap +pdf_setlinejoin +pdf_setlinewidth +pdf_setmatrix +pdf_setmiterlimit +pdf_setpolydash +pdf_setrgbcolor +pdf_setrgbcolor_fill +pdf_setrgbcolor_stroke +pdf_show +pdf_show_boxed +pdf_show_xy +pdf_skew +pdf_stringwidth +pdf_stroke +pdf_translate +pfpro_cleanup +pfpro_init +pfpro_process +pfpro_process_raw +pfpro_version +pfsockopen +pg_affected_rows +pg_cancel_query +pg_client_encoding +pg_close +pg_connect +pg_connection_busy +pg_connection_reset +pg_connection_status +pg_convert +pg_copy_from +pg_copy_to +pg_dbname +pg_delete +pg_end_copy +pg_escape_bytea +pg_escape_string +pg_fetch_array +pg_fetch_object +pg_fetch_result +pg_fetch_row +pg_field_is_null +pg_field_name +pg_field_num +pg_field_prtlen +pg_field_size +pg_field_type +pg_free_result +pg_get_result +pg_host +pg_insert +pg_last_error +pg_last_notice +pg_last_oid +pg_lo_close +pg_lo_create +pg_lo_export +pg_lo_import +pg_lo_open +pg_lo_read +pg_lo_read_all +pg_lo_seek +pg_lo_tell +pg_lo_unlink +pg_lo_write +pg_metadata +pg_num_fields +pg_num_rows +pg_options +pg_pconnect +pg_port +pg_put_line +pg_query +pg_result_error +pg_result_status +pg_select +pg_send_query +pg_set_client_encoding +pg_trace +pg_tty +pg_untrace +pg_update +php_logo_guid +php_sapi_name +php_uname +phpcredits +phpinfo +phpversion +pi +png2wbmp +popen +pos +posix_ctermid +posix_getcwd +posix_getegid +posix_geteuid +posix_getgid +posix_getgrgid +posix_getgrnam +posix_getgroups +posix_getlogin +posix_getpgid +posix_getpgrp +posix_getpid +posix_getppid +posix_getpwnam +posix_getpwuid +posix_getrlimit +posix_getsid +posix_getuid +posix_isatty +posix_kill +posix_mkfifo +posix_setegid +posix_seteuid +posix_setgid +posix_setpgid +posix_setsid +posix_setuid +posix_times +posix_ttyname +posix_uname +pow +preg_grep +preg_match +preg_match_all +preg_quote +preg_replace +preg_replace_callback +preg_split +prev +print +print_r +printer_abort +printer_close +printer_create_brush +printer_create_dc +printer_create_font +printer_create_pen +printer_delete_brush +printer_delete_dc +printer_delete_font +printer_delete_pen +printer_draw_bmp +printer_draw_chord +printer_draw_elipse +printer_draw_line +printer_draw_pie +printer_draw_rectangle +printer_draw_roundrect +printer_draw_text +printer_end_doc +printer_end_page +printer_get_option +printer_list +printer_logical_fontheight +printer_open +printer_select_brush +printer_select_font +printer_select_pen +printer_set_option +printer_start_doc +printer_start_page +printer_write +printf +private +proc_close +proc_open +protected +pspell_add_to_personal +pspell_add_to_session +pspell_check +pspell_clear_session +pspell_config_create +pspell_config_ignore +pspell_config_mode +pspell_config_personal +pspell_config_repl +pspell_config_runtogether +pspell_config_save_repl +pspell_new +pspell_new_config +pspell_new_personal +pspell_save_wordlist +pspell_store_replacement +pspell_suggest +public +putenv +qdom_error +qdom_tree +quoted_printable_decode +quotemeta +rad2deg +rand +range +rawurldecode +rawurlencode +read_exif_data +readdir +readfile +readgzfile +readline +readline_add_history +readline_clear_history +readline_completion_function +readline_info +readline_list_history +readline_read_history +readline_write_history +readlink +realpath +recode +recode_file +recode_string +register_shutdown_function +register_tick_function +rename +require +require_once +reset +restore_error_handler +rewind +rewinddir +rmdir +round +rsort +rtrim +sem_acquire +sem_get +sem_release +sem_remove +serialize +sesam_affected_rows +sesam_commit +sesam_connect +sesam_diagnostic +sesam_disconnect +sesam_errormsg +sesam_execimm +sesam_fetch_array +sesam_fetch_result +sesam_fetch_row +sesam_field_array +sesam_field_name +sesam_free_result +sesam_num_fields +sesam_query +sesam_rollback +sesam_seek_row +sesam_settransaction +session_cache_expire +session_cache_limiter +session_decode +session_destroy +session_encode +session_get_cookie_params +session_id +session_is_registered +session_module_name +session_name +session_readonly +session_register +session_save_path +session_set_cookie_params +session_set_save_handler +session_start +session_unregister +session_unset +session_write_close +set_error_handler +set_file_buffer +set_magic_quotes_runtime +set_time_limit +setcookie +setlocale +settype +shell_exec +shm_attach +shm_detach +shm_get_var +shm_put_var +shm_remove +shm_remove_var +shmop_close +shmop_delete +shmop_open +shmop_read +shmop_size +shmop_write +show_source +shuffle +similar_text +sin +sinh +sizeof +sleep +snmp_get_quick_print +snmp_set_quick_print +snmpget +snmprealwalk +snmpset +snmpwalk +snmpwalkoid +socket_accept +socket_bind +socket_close +socket_connect +socket_create +socket_create_listen +socket_create_pair +socket_fd_alloc +socket_fd_clear +socket_fd_free +socket_fd_isset +socket_fd_set +socket_fd_zero +socket_get_status +socket_getopt +socket_getpeername +socket_getsockname +socket_iovec_add +socket_iovec_alloc +socket_iovec_delete +socket_iovec_fetch +socket_iovec_free +socket_iovec_set +socket_last_error +socket_listen +socket_read +socket_readv +socket_recv +socket_recvfrom +socket_recvmsg +socket_select +socket_send +socket_sendmsg +socket_sendto +socket_set_blocking +socket_set_nonblock +socket_set_timeout +socket_setopt +socket_shutdown +socket_strerror +socket_write +socket_writev +sort +soundex +split +spliti +sprintf +sql_regcase +sqrt +srand +sscanf +stat +str_pad +str_repeat +str_replace +str_rot13 +strcasecmp +strchr +strcmp +strcoll +strcspn +strftime +strip_tags +stripcslashes +stripslashes +stristr +strlen +strnatcasecmp +strnatcmp +strncasecmp +strncmp +strpos +strrchr +strrev +strrpos +strspn +strstr +strtok +strtolower +strtotime +strtoupper +strtr +strval +substr +substr_count +substr_replace +swf_actiongeturl +swf_actiongotoframe +swf_actiongotolabel +swf_actionnextframe +swf_actionplay +swf_actionprevframe +swf_actionsettarget +swf_actionstop +swf_actiontogglequality +swf_actionwaitforframe +swf_addbuttonrecord +swf_addcolor +swf_closefile +swf_definebitmap +swf_definefont +swf_defineline +swf_definepoly +swf_definerect +swf_definetext +swf_endbutton +swf_enddoaction +swf_endshape +swf_endsymbol +swf_fontsize +swf_fontslant +swf_fonttracking +swf_getbitmapinfo +swf_getfontinfo +swf_getframe +swf_labelframe +swf_lookat +swf_modifyobject +swf_mulcolor +swf_nextid +swf_oncondition +swf_openfile +swf_ortho +swf_ortho2 +swf_perspective +swf_placeobject +swf_polarview +swf_popmatrix +swf_posround +swf_pushmatrix +swf_removeobject +swf_rotate +swf_scale +swf_setfont +swf_setframe +swf_shapearc +swf_shapecurveto +swf_shapecurveto3 +swf_shapefillbitmapclip +swf_shapefillbitmaptile +swf_shapefilloff +swf_shapefillsolid +swf_shapelinesolid +swf_shapelineto +swf_shapemoveto +swf_showframe +swf_startbutton +swf_startdoaction +swf_startshape +swf_startsymbol +swf_textwidth +swf_translate +swf_viewport +swfaction +swfbitmap +swfbitmap->getheight +swfbitmap->getwidth +swfbutton +swfbutton->addaction +swfbutton->addshape +swfbutton->setaction +swfbutton->setdown +swfbutton->sethit +swfbutton->setover +swfbutton->setup +swfbutton_keypress +swfdisplayitem +swfdisplayitem->addcolor +swfdisplayitem->move +swfdisplayitem->moveto +swfdisplayitem->multcolor +swfdisplayitem->remove +swfdisplayitem->rotate +swfdisplayitem->rotateto +swfdisplayitem->scale +swfdisplayitem->scaleto +swfdisplayitem->setdepth +swfdisplayitem->setname +swfdisplayitem->setratio +swfdisplayitem->skewx +swfdisplayitem->skewxto +swfdisplayitem->skewy +swfdisplayitem->skewyto +swffill +swffill->moveto +swffill->rotateto +swffill->scaleto +swffill->skewxto +swffill->skewyto +swffont +swffont->getwidth +swfgradient +swfgradient->addentry +swfmorph +swfmorph->getshape1 +swfmorph->getshape2 +swfmovie +swfmovie->add +swfmovie->nextframe +swfmovie->output +swfmovie->remove +swfmovie->save +swfmovie->setbackground +swfmovie->setdimension +swfmovie->setframes +swfmovie->setrate +swfmovie->streammp3 +swfshape +swfshape->addfill +swfshape->drawcurve +swfshape->drawcurveto +swfshape->drawline +swfshape->drawlineto +swfshape->movepen +swfshape->movepento +swfshape->setleftfill +swfshape->setline +swfshape->setrightfill +swfsprite +swfsprite->add +swfsprite->nextframe +swfsprite->remove +swfsprite->setframes +swftext +swftext->addstring +swftext->getwidth +swftext->moveto +swftext->setcolor +swftext->setfont +swftext->setheight +swftext->setspacing +swftextfield +swftextfield->addstring +swftextfield->align +swftextfield->setbounds +swftextfield->setcolor +swftextfield->setfont +swftextfield->setheight +swftextfield->setindentation +swftextfield->setleftmargin +swftextfield->setlinespacing +swftextfield->setmargins +swftextfield->setname +swftextfield->setrightmargin +sybase_affected_rows +sybase_close +sybase_connect +sybase_data_seek +sybase_fetch_array +sybase_fetch_field +sybase_fetch_object +sybase_fetch_row +sybase_field_seek +sybase_free_result +sybase_get_last_message +sybase_min_client_severity +sybase_min_error_severity +sybase_min_message_severity +sybase_min_server_severity +sybase_num_fields +sybase_num_rows +sybase_pconnect +sybase_query +sybase_result +sybase_select_db +symlink +syslog +system +tan +tanh +tempnam +textdomain +time +tmpfile +touch +trigger_error +trim +uasort +ucfirst +ucwords +udm_add_search_limit +udm_alloc_agent +udm_api_version +udm_cat_list +udm_cat_path +udm_check_charset +udm_check_stored +udm_clear_search_limits +udm_close_stored +udm_crc32 +udm_errno +udm_error +udm_find +udm_free_agent +udm_free_ispell_data +udm_free_res +udm_get_doc_count +udm_get_res_field +udm_get_res_param +udm_load_ispell_data +udm_open_stored +udm_set_agent_param +uksort +umask +uniqid +unixtojd +unlink +unpack +unregister_tick_function +unserialize +unset +urldecode +urlencode +user_error +usleep +usort +utf8_decode +utf8_encode +var_dump +var_export +version_compare +virtual +vpopmail_add_alias_domain +vpopmail_add_alias_domain_ex +vpopmail_add_domain +vpopmail_add_domain_ex +vpopmail_add_user +vpopmail_alias_add +vpopmail_alias_del +vpopmail_alias_del_domain +vpopmail_alias_get +vpopmail_alias_get_all +vpopmail_auth_user +vpopmail_del_domain +vpopmail_del_domain_ex +vpopmail_del_user +vpopmail_error +vpopmail_passwd +vpopmail_set_user_quota +vprintf +vsprintf +w32api_deftype +w32api_init_dtype +w32api_invoke_function +w32api_register_function +w32api_set_call_method +wddx_add_vars +wddx_deserialize +wddx_packet_end +wddx_packet_start +wddx_serialize_value +wddx_serialize_vars +wordwrap +xml_error_string +xml_get_current_byte_index +xml_get_current_column_number +xml_get_current_line_number +xml_get_error_code +xml_parse +xml_parse_into_struct +xml_parser_create +xml_parser_create_ns +xml_parser_free +xml_parser_get_option +xml_parser_set_option +xml_set_character_data_handler +xml_set_default_handler +xml_set_element_handler +xml_set_end_namespace_decl_handler +xml_set_external_entity_ref_handler +xml_set_notation_decl_handler +xml_set_object +xml_set_processing_instruction_handler +xml_set_start_namespace_decl_handler +xml_set_unparsed_entity_decl_handler +xmlrpc_decode +xmlrpc_decode_request +xmlrpc_encode +xmlrpc_encode_request +xmlrpc_get_type +xmlrpc_parse_method_descriptions +xmlrpc_server_add_introspection_data +xmlrpc_server_call_method +xmlrpc_server_create +xmlrpc_server_destroy +xmlrpc_server_register_introspection_callback +xmlrpc_server_register_method +xmlrpc_set_type +xpath_eval +xpath_eval_expression +xpath_new_context +xptr_eval +xptr_new_context +xslt_create +xslt_errno +xslt_error +xslt_free +xslt_process +xslt_set_base +xslt_set_encoding +xslt_set_error_handler +xslt_set_log +xslt_set_sax_handler +xslt_set_sax_handlers +xslt_set_scheme_handler +xslt_set_scheme_handlers +yaz_addinfo +yaz_ccl_conf +yaz_ccl_parse +yaz_close +yaz_connect +yaz_database +yaz_element +yaz_errno +yaz_error +yaz_hits +yaz_itemorder +yaz_present +yaz_range +yaz_record +yaz_scan +yaz_scan_result +yaz_search +yaz_sort +yaz_syntax +yaz_wait +yp_all +yp_cat +yp_err_string +yp_errno +yp_first +yp_get_default_domain +yp_master +yp_match +yp_next +yp_order +zend_logo_guid +zend_version +zip_close +zip_entry_close +zip_entry_compressedsize +zip_entry_compressionmethod +zip_entry_filesize +zip_entry_name +zip_entry_open +zip_entry_read +zip_open +zip_read diff --git a/PowerEditor/bin/plugins/APIs/python.api b/PowerEditor/bin/plugins/APIs/python.api new file mode 100644 index 00000000..c51e4f98 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/python.api @@ -0,0 +1,290 @@ +AST +ArithmeticError +AssertionError +AttributeError +BaseHTTPServer +Bastion +CGIHTTPServer +Complex +EOFError +Exception +FloatingPointError +IOError +ImportError +IndentationError +IndexError +KeyError +KeyboardInterrupt +LookupError +MemoryError +Mimewriter +NameError +None +OverflowError +Para +Queue +RuntimeError +SimpleHTTPServer +SocketServer +StandardError +StringIO +SyntaxError +SystemError +SystemExit +TabError +Tkinter +TypeError +UserDict +UserList +ValueError +ZeroDivisionError +__abs__ +__add__ +__and__ +__bases__ +__call__ +__class__ +__cmp__ +__coerce__ +__del__ +__delattr__ +__delitem__ +__delslice__ +__dict__ +__div__ +__divmod__ +__float__ +__getattr__ +__getitem__ +__getslice__ +__hash__ +__hex__ +__iadd__ +__iand__ +__idiv__ +__ilshift__ +__imod__ +__import__ +__init__ +__int__ +__invert__ +__ior__ +__ipow__ +__irshift__ +__isub__ +__ixor__ +__len__ +__long__ +__lshift__ +__members__ +__methods__ +__mod__ +__mul__ +__name__ +__neg__ +__nonzero__ +__oct__ +__or__ +__pos__ +__pow__ +__radd__ +__rand__ +__rdiv__ +__rdivmod__ +__repr__ +__rlshift__ +__rmod__ +__rmul__ +__ror__ +__rpow__ +__rrshift__ +__rshift__ +__rsub__ +__rxor__ +__setattr__ +__setitem__ +__setslice__ +__str__ +__sub__ +__version__ +__xor__ +abs +and +apply +array +assert +atexit +break +callable +chr +class +cmd +cmp +codecs +coerce +commands +compile +compileall +complex +continue +copy +dbhash +def +del +delattr +dir +dircmp +dis +divmod +dospath +dumbdbm +elif +else +emacs +eval +except +exec +execfile +filter +finally +find +float +fmt +fnmatch +for +from +ftplib +getattr +getopt +glob +global +globals +gopherlib +grep +group +hasattr +hash +hex +htmllib +httplib +id +if +ihooks +imghdr +import +imputil +in +input +int +intern +is +isinstance +issubclass +joinfields +lambda +len +linecache +list +local +lockfile +long +macpath +macurl2path +mailbox +mailcap +map +match +math +max +mimetools +mimify +min +mutex +newdir +ni +nntplib +not +ntpath +nturl2path +oct +open +or +ord +os +ospath +pass +pdb +pickle +pipes +poly +popen2 +posixfile +posixpath +pow +print +profile +pstats +pyclbr +pyexpat +quopri +raise +rand +random +range +raw_input +reduce +regex +regsub +reload +repr +return +rfc822 +round +sched +search +self +setattr +setdefault +sgmllib +shelve +site +slice +sndhdr +snmp +splitfields +str +string +struct +sys +tb +tempfile +toaiff +token +tokenize +traceback +try +tty +tuple +type +types +tzparse +unichr +unicode +unicodedata +urllib +urlparse +util +uu +vars +wave +webbrowser +whatsound +whichdb +while +whrandom +xdrlib +xml +xmlpackage +xrange +zip +zmod diff --git a/PowerEditor/bin/plugins/APIs/tex.api b/PowerEditor/bin/plugins/APIs/tex.api new file mode 100644 index 00000000..43edfbd1 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/tex.api @@ -0,0 +1,2154 @@ +Alph +Alpha +AltMacroFont +AmSTeX +Appendix +Arrowvert +AtBeginDocument +AtEndClass +AtEndDocument +AtEndOfClass +AtEndOfPackage +AtEndPackage +Bbb +Bbbk +Beta +BibTeX +Big +Box +CJK +CJK* +CJKfamily +Cap +CharacterTable +CheckCommand +CheckCommand* +CheckModules +CheckSum +ClassError +ClassInfo +ClassWarning +ClassWarningNoLine +CodelineFont +CodelineIndex +CodelineNumbered +CurrentOption +CurrentOption +DeclareErrorFont +DeclareFixedFont +DeclareFontEncoding +DeclareFontEncodingDefaults +DeclareFontFamily +DeclareFontShape +DeclareFontSubstitution +DeclareInputMath +DeclareInputText +DeclareMathAccent +DeclareMathAlphabet +DeclareMathSizes +DeclareMathSymbol +DeclareMathVersion +DeclareOldFontCommand +DeclareOption +DeclareOption* +DeclareRobustCommand +DeclareRobustCommand* +DeclareSymbolFont +DeclareSymbolFontAlphabet +DeclareTextAccent +DeclareTextAccentDefault +DeclareTextCommand +DeclareTextCommandDefault +DeclareTextCompositeCommand +DeclareTextFontCommand +DeclareTextSymbol +DeclareTextSymbolDefault +DeleteShortVerb +Delta +DescribeEnv +DescribeEnvironment +DescribeMacro +Diamond +DisableCrossrefs +DoNotIndex +DocInput +DocstyleParms +DontCheckModules +Downarrow +EnableCrossrefs +Esper +EuFrak +EuScript +ExecuteOptions +Finale +Finv +GBK +Game +Gamma +GapDepth +GapWidth +GetFileInfo +GlossaryMin +GlossaryParms +GlossaryPrologue +HUGE +Huge +Huge +IfFileExists +Im +IndexInput +IndexMin +IndexParms +IndexPrologue +InputIfFileExists +Join +LARGE +LARGE +LTcapuidth +LTchunksize +LTleft +LTpost +LTpre +LTright +LaTeX +LaTeX +LaTeXe +LaTeXe +Lambda +Large +Large +Leftarrow +Leftrightarrow +Lentrylabel +Lleftarrow +LoadClass +Longleftarrow +Longleftrightarrow +Longrightarrow +Lsh +MacroFont +MacroIndent +MacrocodeTopsep +MakeLowercase +MakePrivateLetters +MakeShortVerb +MakeUppercase +Mentry +Mentrylabel +Module +Msgrigid +NeedsTeXFormat{format} +NouveauLangage +Omega +OnlyDescription +OptionNotUsed +OptionNotUsed +Ovalbox +PScommands +PackageError +PackageError +PackageInfo +PackageInfo +PackageWarning +PackageWarning +PackageWarningNoLine +PackageWarningNoLine +PageIndex +PassOptionsToClass +PassOptionsToPackage +Phi +Pi +Pifill +Pifont +Piline +Pisymbol +PreserveBackslash +PrintChanges +PrintDescribeEnv +PrintDescribeMacro +PrintIndex +PrintMacroName +ProcessOptions +ProcessOptions +ProcessOptions* +ProvideTextCommand +ProvideTextCommandDefault +ProvidesClass +ProvidesFile +ProvidesPackage +Psi +REVTeX +Re +RecordChanges +Relbar +RequirePackage +Rightarrow +Roman +Rsh +SS +SetMathAlphabet +SetSymbolFont +Sigma +SortIndex +SortNoop +SpecialEnvIndex +SpecialEscapechar +SpecialIndex +SpecialMainIndex +SpecialUsageIndex +StopEventually +Subset +Supset +TH +TeX +TheSbox +Theta +Thicklines +ULforem +UTF8 +Uparrow +Updownarrow +Upsilon +Vdash +Vert +Vvdeah +WideMargins +Xarea +XeTeX +Xi +Xsize +Yarea +Ysize +above +abovecaptionskip +abovedisplayshortskip +abovedisplayskip +abovewithdelims +abstract +abstract +abstractname +abstractname{name} +accent +accentedsymbol +acknowledgments +active +actualchar +acute +addcontentsline +adddialect +addlanguage +addpenalty +address +addtime +addto +addtocontents +addtocounter +addtolength +addtoreset +addtoversion +addvspace +adjdemerits +advance +advancepageno +afterassignment +aftergroup +afterpage +aleph +align +align* +alignat +aligned +allinethickness +allocationnumber +allowbreak +allowdisplaybreaks +allowhyphens +alph +alpha +also +amalg +and +and +angle +annotations +appendix +appendix +appendix +appendixname +approx +approxeq +arabic +arc +arccos +arcsin +arctan +arg +arraybackslash +arraycolsep +arrayrulewidth +arraystretch +arrowvert +article +ast +astroncite +asymp +atop +atopwithdelims +author +backepsilon +backprime +backsim +backsimeq +backslash +badness +bar +barwedge +baselineskip +baselinestretch +batchfile +batchmode +because +begin +beginchapter +begindisplay +begingroup +beginsection +begintt +belowcaptionskip +belowdisplayshortskip +belowdisplayskip +beta +beth +between +bezier +bf +bfdefault +bffam +bfseries +bgroup +bibhang +bibindent +bibitem +bibliography +bibliographystyle +bibliographyunit +bibname +bibpunct +big +bigbreak +bigcap +bigcirc +bigcircle +bigcup +bigodot +bigoplus +bigotimes +bigskip +bigskipamount +bigsqcup +bigstar +bigstrutjot +bigtriangledown +bigtriangleup +bigtype +biguplus +bigvee +bigwedge +binom +binoppenalty +blacklozenge +blacksquare +blacktriangle +blacktriangledown +blacktriangleleft +blacktriangleright +bmit +bmod +body +boldmath +boldsymbol +book +boolean +bordermatrix +bot +botfigrule +botmark +bottomcaption +bottomfraction +bottomnumber +bowtie +box +boxdot +boxed +boxmaxdepth +boxminus +boxplus +boxtimes +brace +braceld +bracelu +bracerd +braceru +bracevert +brack +branch +branchlabels +break +breve +brokenpenalty +brush +bslash +buildrel +bull +bullet +bumpeq +bye +cal +cap +caption +captionwidth +cases +catcode +cbend +cbstart +ccname +cctart +cctbook +cdot +cdotp +cdots +centerdot +centering +centerline +cents +cfoot +cfrac +changebarsep +changebarwidth +changes +chapter +chapter* +chaptermark +chaptername +char +chardef +chead +check +chi +choose +chunk +circ +circeq +circle +circle* +circlearrowleft +circlearrowright +circledS +circledast +circledcirc +circleddash +cite +citeA +citeN +citeNP +citen +citeyear +cleaders +cleardoublepage +clearemptydoublepage +clearpage +cleartabs +cline +closecurve +closein +closeout +closing +clubpenalty +clubsuit +colon +color +colorbox +columns +columnsep +columnseprule +columnwidth +complement +cong +contentsline +contentsname +coprod +copy +copyright +cornersize +cos +cosh +cot +coth +count +countdef +cr +csc +csname +cstok +ctex +ctexart +ctexbook +cup +curlyeqprec +curlyeqsucc +curlyvee +curlywedge +curve +curvearrowleft +curvearrowright +curvedashes +curvesymbol +cwfsu +cwhbu +cwku +cwmu +cwyu +dag +dagger +daleth +dash +dashbox +dashleftarrow +dashline +dashlinestretch +dashrightarrow +dashv +date +datelang +day +dbinom +dblfigrule +dblfloatpagefraction +dblfloatsep +dbltextfloatsep +dbltopfraction +dbltopnumber +ddag +ddagger +ddddot +dddot +ddot +ddots +ddraft +ddt +deadcycles +def +defaulthyphenchar +defaultscriptratio +defaultscriptscriptratio +defaultskewchar +deffootnote +definecounter +deg +delcode +deletebarwidth +delimiter +delimiterfactor +delimitershortfall +delta +depth +description +descriptionlabel +det +dfrac +diagdown +diagup +diamond +diamondpar +diamondsuit +digamma +dim +dimendef +ding +dingfill +dingline +discretionary +displaybreak +displayindent +displaylimits +displaylines +displaymath +displaystyle +displaywidowpenalty +displaywidth +div +divide +divideontimes +do +docdate +document +documentclass +documentstyle +dominitoc +dospecials +dosupereject +dot +doteq +doteqdot +dotfill +dotplus +dots +dotsb +dotsc +dotsep +dotsi +dotsm +dottedline +dottedtocline +doublebarwedge +doublebox +doublehyphendemerits +doublerulesep +downarrow +downbracefill +downdownarrows +downharpoonleft +downharpoonright +draw +drawline +drawlinestretch +drawwith +driver +dummy +dump +edef +egroup +eightpoint +eject +ell +ellipse +else +em +emergencystretch +emph +empty +emptyset +encapchar +encl +enclname +encodingdefault +end +endabstract +endchapter +endcsname +enddisplay +endfig +endfoot +endgraf +endgroup +endhead +endinput +endinsert +endlastfoot +endletter +endline +endlinechar +endlist +endnote +endnotesize +endpostamble +endpreamble +endquotation +endtemplate +endtt +enlargethispage +enlargethispage* +enskip +enspace +ensuremath +entrylabel +epsf +epsfbox +epsfig +epsfxsize +epsfysize +epsilon +eqalign +eqalignno +eqcirc +eqnarray +eqref +eqslantgtr +eqslantless +equal +equation +equiv +errhelp +errmessage +errorcontextlines +errorstopmode +escapechar +esper +eta +eth +evenfoot +evenhead +evensidemargin +everycr +everydisplay +everyhbox +everyjob +everymath +everypar +everyvbox +excludeversion +exercise +exhyphenpenalty +exists +exp +expandafter +externaldocument +extracolsep +extralang +extrarowheight +extratabsurround +extrealang +faketableofcontents +fallingdotseq +fam +family +familydefault +fancyplain +fang +fbaselineskip +fbox +fboxrule +fboxsep +fencoding +ffamily +fig +figurename +figureplace +filbreak +filedate +filename +fileversion +fill +filltype +finalhyphendemerits +firsthline +firstmark +fiverm +flalign +flalign* +flat +float +floatingpenalty +floatname +floatpagefraction +floatpagefraction +floatplacement +floatsep +flq +flqq +flushbottom +flushcolumns +flushleft +flushright +fminilength +fmtname +fmtversion +fnsymbol +folio +font +fontdimen +fontencoding +fontfamily +fontname +fontseries +fontshape +fontsize +fontsubfuzz +footheight +footins +footline +footnote +footnotemark +footnoterule +footnotesep +footnotesize +footnotetext +footrule +footrulewidth +footskip +for +forall +frac +fracwithdelims +frak +frakfamily +frame +framebox +frenchhyphenation +frenchlayout +frenchmacros +frenchspacing +frenchtranslation +frenchtypography +from +fromname +frontmatter +frown +frq +frqq +fshape +fsize +fullhsize +fullline +fussy +futurelet +futurenonspacelet +gamma +gather +gathered +gcd +gdef +ge +generateFile +geq +geqq +geqslant +getfactor +gets +ggg +gimel +global +globaldefs +glossary +glossaryentry +glq +glqq +gnapprox +gneq +gneqq +gnsim +goodbreak +gothfamily +graphpaper +grave +grid +grq +grqq +gtrapprox +gtrdot +gtreqless +gtreqqless +gtrless +guillemotleft +guillemotright +guilsinglleft +guilsinglright +gvertneqq +halign +hang +hangafter +hangindent +hat +hbadness +hbar +hbox +hdotsfor +headheight +headline +headpagename +headrule +headrulewidth +headsep +headtoname +headwidth +heartpar +heartsuit +hei +height +height +help +hfil +hfill +hfilneg +hfuzz +hglue +hhline +hideskip +hidewidth +hline +hlinefill +hlineon +hodiau +hodiaun +hoffset +holdinginserts +hom +hookleftarrow +hookrightarrow +hphantom +hrule +hrulefill +hsize +hskip +hslash +hspace +hspace* +hss +ht +huge +hyphenation +hyphenchar +hyphenpenalty +ialign +icolorbox +idotsint +idxitem +if +ifcase +ifcat +ifdim +ifeof +iff +iffalse +ifhbox +ifhmode +ifinner +iflanguage +ifmmode +ifmode +ifnextchar +ifnum +ifodd +ifstar +ifthenelse +iftrue +ifundefined +ifundefined +ifvbox +ifvmode +ifvoid +ifx +ignorespaces +iiiint +iiint +iint +imath +immediate +in +inaccessible +include +includegraphics +includegraphics* +includeonly +includeversion +indent +index +indexentry +indexname +indexproofstyle +indexspace +inf +infty +init +initfloatingfigs +input +inputlineno +insert +insertpenalties +int +intercal +interdisplaylinepenalty +interfootnotelinepenalty +interlinepenalty +intertext +intextsep +invisible +iota +iseries +isodd +isucaption +it +itdefault +item +itemindent +itemize +itemsep +iterate +itfam +itshape +jmath +jobname +joinrel +jot +jput +kappa +keepsilent +ker +kern +kill +label +labelenumi +labelenumii +labelenumiii +labelenumiv +labelitemi +labelitemii +labelitemiii +labelitemiv +labelnum +labelsep +labelwidth +label{key} +lambda +land +landscape +langle +language +large +lastbox +lasthline +lastkern +lastpenalty +lastskip +latexerr +layout +lbrace +lccode +lceil +lcfrac +ldotp +ldots +le +leaders +leadsto +leaf +leavevmode +left +leftarrow +leftarrowfill +leftarrowtail +lefteqn +leftharpoondown +leftharpoonup +lefthyphenmin +leftleftarrows +leftline +leftmargin +leftmargini +leftmarginii +leftmarginiii +leftmarginiv +leftmarginv +leftmarginvi +leftmark +leftnode +leftrightaquigarrow +leftrightarrow +leftrightarrows +leftrightharpoons +leftroot +leftskip +leftthreetimes +legend +lengthtest +leq +leqalignno +leqno +leqq +leqslant +lessapprox +lessdot +lesseqgtr +lesseqqgtr +lessgtr +lesssim +let +letterspace +levelchar +lfloor +lfoot +lg +lgroup +lhd +lhead +lhook +li +lim +liminf +limits +limsup +line +linebreak +linepenalty +lineskip +lineskiplimit +lineskiplimits +linethickness +linewidth +lisitablename +list +listfigurename +listfiles +listing +listof +listoffigures +listoftables +listparindent +listtablename +llap +llcorner +llstparindent +lmoustache +ln +lnapprox +lneq +lneqq +lnot +load +log +long +longindentation +longleftarrow +longleftrightarrow +longmapsto +longpage +longrightarrow +loop +looparrowleft +looparrowright +looseness +lor +lower +lowercase +lozenge +lrcorner +ltimes +lusim +lvertneqq +mag +magnification +magstep +magstephalf +main +mainmatter +maintoks +makeatletter +makeatother +makebox +makecaption +makefigcaption +makefnmark +makefntext +makefootline +makeglossary +makeglossary +makeheadline +makeindex +makelabel +makelabels +maketitle +mapsto +mapstochar +margin +marginlabel +marginpar +marginparpush +marginparsep +marginparwidth +mark +markboth +markright +match +mathaccent +mathafal +mathalpha +mathbb +mathbf +mathbin +mathcal +mathchar +mathchardef +mathchoice +mathclose +mathcode +mathellipsis +mathfrak +mathgroup +mathhexbox +mathindent +mathinner +mathit +mathnormal +mathop +mathopen +mathord +mathpalette +mathpunct +mathrel +mathrm +mathrm +mathsf +mathsf +mathsterling +mathstrut +mathsurround +mathtt +mathunderscore +mathversion +matrix +matrixput +max +maxdeadcycles +maxdepth +maxdimen +maxovaldiam +mbox +mddefault +mdseries +meaning +measuredangle +medbreak +medmuskip +medskip +medskipamount +medspace +medtype +message +meta +mho +mid +midinsert +min +minitoc +mit +mkboth +mkern +mne +mod +models +month +moveleft +moveright +mp +mskip +mth +mu +multicolsep +multicolumn +multiframe +multimake +multimap +multiply +multiput +multiputlist +multirow +multirowsetup +multispan +multlinegap +muskip +muskipdef +nLeftarrow +nLeftrightarrow +nRightarrow +nYDash +nabla +namedef +names +nameuse +narrower +natural +naturalwidth +ncong +ne +nearrow +neg +negmedspace +negthickspace +negthinspace +neq +newX +newY +newblock +newboolean +newbox +newcolumntype +newcommand +newcommand* +newcount +newcounter +newdimen +newenvironment +newfam +newfloat +newfont +newhelp +newif +newindex +newinsert +newlabel +newlanguage +newlength +newletter +newline +newlinechar +newmuskip +newpage +newread +newsavebox +newsavebox{box} +newskip +newtheorem +newtoks +newwrite +nexists +next +ngeq +ngeqq +ngeqslant +ngtr +ninepoint +ninerm +ninesl +nintt +nlefirightarrow +nleftarrow +nleq +nleqq +nleqslant +nless +nmid +noalign +noboundary +nobreak +nochangebars +nocite +nocorr +nocorrlist +noexpand +noextraslang +nofiglist +nofiles +nofrenchlayout +nofrenchtypography +noindent +nointerlineskip +nolimits +nolinebreak +nomarkersintext +nonfrenchspacing +nonscript +nonstopmode +nonumber +nopagebreak +nopagenumbers +normalbaselines +normalbaselineskip +normalbottom +normalcolor +normalem +normalfont +normallineskip +normallineskiplimit +normalmarginpar +normalsize +not +notablist +notag +notin +nouppercase +nparallel +nprec +npreceq +nrightarrow +nshortmid +nshortparallel +nsim +nsubseteq +nsucc +nsucceq +nsupseteq +nsupseteqq +ntriangleleft +ntrianglelefteq +ntriangleright +ntrianglerighteq +nu +null +nulldelimiterspace +nullfont +number +numberline +numberwithin +nvDash +nwarrow +oalign +obeycr +obeylines +obeyspaces +oddfoot +oddhead +oddsidemargin +odot +offinterlineskip +oint +oldstyle +oldstylenums +omega +omicron +ominus +omit +onecolumn +onlynotes +onlypreamble +ooalign +openin +openout +openup +operatorname +operatornamewithlimits +oplus +options +or +oslash +other +otimes +outer +output +outputpenalty +oval +ovalbox +over +overbrace +overfullrule +overleftarrow +overline +overrightarrow +overset +overwithdelims +owns +pacs +padraft +pagebody +pagebreak +pagecolor +pagecontents +pagedepth +pagefilllstretch +pagefillstretch +pagefilstretch +pagegoal +pageinsert +pagename +pagename +pageno +pagenumbering +pageref +pageshrink +pagestretch +pagestyle +pagetotal +paperheight +paperwidth +par +paragraph +paragraphmark +parallel +parbox +parfillskip +parindent +parsep +parshape +parskip +part +part* +partial +partname +partopsep +path +patterns +pausing +penalty +penumi +penumii +penumiii +penumiv +perp +phantom +phi +pi +pitchfork +plainfootrulewidth +plainheadrulewidth +plainoutput +plus +pm +pmatrix +pmb +pmod +pnt +pnumwidth +pod +poptabs +postamble +postdisplaypenalty +postmulticols +pounds +preamble +prec +precapprox +preccurlyeq +preceq +precnapprox +precnsim +precsim +predisplaypenalty +predisplaysize +prefacename +preloaded +premulticols +prenwd +preparefootins +preprint +pretolerance +prevdepth +prevgraf +prime +printindex +proclaim +prod +proofmodetrue +propto +protect +providecommand +psboxit +psfig +psfigdriver +psfull +psi +pt +ptsize +pushtabs +put +putbib +putfile +qbezier +qquad +quad +quotation +quotechar +quotedblbase +quotesinglbase +radical +raggedbottom +raggedcenter +raggedcolumns +raggedleft +raggedright +raise +raisebox +rangle +ratio +rbrace +rbrack +rceil +rcfrac +rcomment +read +real +ref +reflectbox +refname +refstepcounter +reftextafter +reftextbefore +reftextcurrent +reftextfaceafter +reftextfacebefore +reftextfarawy +reftextvario +relax +relbar +relpenalty +removelastskip +renewcommand +renewcommand* +renewenvironment +renewenvironment* +renewindex +repeat +resizebox +resizebox* +restorecr +restylefloat +resume +reversemarginpar +rfloor +rfoot +rgroup +rhd +rhead +rho +rhook +right +rightarrow +rightarrowfill +rightarrowtail +rightharpoondown +rightharpoonup +righthyphenmin +rightleftarrowa +rightleftharpoons +rightline +rightmargin +rightmark +rightnode +rightrightarrows +rightskip +rightsquigarrow +rightthreetimes +risingdotseq +rlap +rm +rmdefault +rmfamily +rmoustache +roman +romannumeral +root +rotatebox +rotcaption +rotdriver +rq +rtimes +rule +sAppendix +samepage +savebox +sbox +sboxrule +sboxsep +scalebox +scaleput +scdefault +scriptfont +scriptscriptfont +scriptscriptstyle +scriptsize +scriptspace +scriptstyle +scrollmode +scshape +sdim +searrow +sec +seccntformat +secdef +section +section* +sectionmark +seename +selectfont +selectlanguage +seriesdefault +setboolean +setbox +setcounter +setdepth +sethapace +setlanguage +setlength +setlinestyle +setlongtables +setmargins +setmarginsrb +setminus +setnumberpos +setpapersize +setprecision +setstretch +setstyle +settabs +settodepth +settoheight +settowidth +setupverbatim +setwidth +setxaxis +setxname +setxvaluetyp +setyaxis +setyname +sevenrm +sfcode +sfdefault +sffamily +sfsize +shabox +shadowbox +shadowsize +shapedefault +shapepar +sharp +shipout +shortcite +shortciteA +shortciteN +shortindexingoff +shortindexingon +shortmid +shortparallel +shortstack +show +showbox +showboxbreadth +showboxdepth +showcols +showhyphens +showlists +showprogress +showthe +sideset +sigma +signature +signed +sim +simeq +sin +sinh +skew +skewchar +skip +skipdef +sl +slash +sldefault +slfam +slfamily +sloppy +slshape +small +smallbreak +smallfrown +smallint +smallsetminus +smallskip +smallskipamount +smallsmile +smalltype +smash +smile +song +space +spacefactor +spaceskip +spadesuit +span +spbreve +spcheck +spdddot +spddot +spdot +special +sphat +sphericalangle +spline +split +splitbotmark +splitfirstmark +splitmaxdepth +splittopskip +sptilde +sqcap +sqcup +sqrt +sqsubset +sqsubseteq +sqsupset +sqsupseteq +square +squarepar +ssfsize +stackrel +star +startsection +starttoc +stepcounter +stop +stretch +string +strut +strutbox +subfigcapakip +subfigtopakip +subfigure +subitem +subject +subparagraph +subparagraph* +subparagraphmark +subsection +subsection* +subset +subseteq +subseteqq +subsetneq +subsetneqq +subsubitem +subsubitem +subsubsection +subsubsection*{title} +subsubsection[short]{title} +subsubsectionmark{code} +subsubsection{title} +succ +succapprox +succcurlyeq +succeq +succnapprox +succnsim +succsim +sum +sup +supereject +supertabular +suppressfloats +suppressfloats[placement] +supset +supsetaqq +supseteq +supsetneq +supsetneqq +surd +swabfamily +swarrow +symbol +symbol{n} +syntaxonly +tabalign +tabbing +tabbingsep +tabcolsep +tabcolsep +table +table +tablecaption +tablefirsthead +tablehead +tablelasttail +tableline +tablename +tablenote +tablenotemark +tablenotetext +tableofcontents +tableplace +tabletail +tabs +tabskip +tabularnewline +tabularnewline +tabularxcolumn +tag +tagcurve +tan +tanh +tau +tbinom +tbranch +telephone +tempboxa +tenex +tenpoint +tenrm +tensl +tensy +texlmd +text +textasciicircum +textasciitilde +textasteriskcentered +textbackslash +textbar +textbf +textbraceleft +textbraceright +textbullet +textcircled +textcolor +textcompwordmark +textdagger +textdaggerdbl +textdollar +textellipsis +textemdash +textendash +textexclamdown +textfloatsep +textfont +textfraction +textfrak +textgoth +textgreater +textheight +textindent +textit +textless +textmd +textnormal +textparagraph +textperiodcentered +textquestiondown +textquotedbl +textquotedblleft +textquotedblright +textquoteleft +textquoteright +textregistered +textrm +textsc +textsection +textsf +textsl +textsterling +textstyle +textsuperscript +textswab +texttrademark +texttt +textunderscore +textup +textvisiblespace +textwidth +tfrac +tfsize +thanks +the +theCodelineNo +thechapter +theendnotes +theenumi +theenumii +theenumiii +theenumiv +theequation +thefigure +thefnmark +thefootnote +thefootnotemark +thehours +theminutes +thempfn +thempfootnote +themptootnote +theorembodyfont +theoremheaderfont +theorempostskipamount +theorempreskipamount +theoremstyle +thepage +theparagraph +thepart +therefore +thesection +thesubfigure +thesubparagraph +thesubsection +thesubsubsection +theta +thetable +thickapprox +thicklines +thickmuskip +thicksim +thickspace +thinlines +thinmuskip +thinspace +thispagestyle +thispagestyle{option} +tighten +tightenlines +tilde +time +times +tiny +title +titlepage +tocrmarg +today +toks +toksdef +tolerance +top +topcaption +topfigrule +topfraction +topglue +topins +topinsert +topmargin +topmark +topnum +topnumber +topsep +topskip +toptigrule +totalheight +totalnumber +tracingall +tracingcommands +tracingfonts +tracinglostchars +tracingmacros +tracingonline +tracingoutput +tracingpages +tracingparagraphs +tracingrestores +tracingstats +tracingtabularx +triangle +triangledown +triangleleft +trianglelefteq +triangleq +triangleright +trianglerighteq +tt +ttdefault +ttfam +ttfamily +ttglue +ttraggedright +turnbox +twlrm +twocolumn +twoheadleftarrow +twoheadrightarrow +typein +typeout +uccode +uchyph +ulcorner +uline +unboldmath +uncatcodespecials +undefined +underbar +underbrace +underleftarrow +underleftrightarrow +underline +underrightarrow +underset +unhbox +unhcopy +unitlength +unkern +unlhd +unpenalty +unrhd +unskip +unvbox +unvcopy +up +uparrow +upbracefill +updefault +updownarrow +upharpoonleft +upharpoonright +uplus +uppercase +uproot +upshape +upsilon +upuparrows +urcorner +usage +usebox +usecounter +usefont +usepackage +vDash +vadjust +valign +value +varaupaetneq +varepsilon +varinjlim +varkappa +varliminf +varlimsup +varnothing +varphi +varpi +varprojlim +varpropto +varrho +varsigma +varsupsetneqq +vartheta +vartriangle +vartriangleleft +vartriangleright +vbadness +vbox +vcenter +vdash +vdots +vec +vector +vee +veebar +verb +verb* +verbatim +verbatim* +verbatimchar +verbatiminput +verbatimtabinput +verse +vert +vfil +vfill +vfilll +vfilneg +vfootnote +vfuzz +vglue +visible +vline +voffset +voidbx +vpageref +vphantom +vref +vrule +vsize +vskip +vspace +vspace* +vsplit +vss +vtop +warning +wedge +whiledo +widehat +widetilde +widowpenalty +width +wlog +write +xdef +xi +xleaders +xout +xspace +xspaceskip +xyzzy +year +you +zeta +zskip diff --git a/PowerEditor/bin/plugins/APIs/vb.api b/PowerEditor/bin/plugins/APIs/vb.api new file mode 100644 index 00000000..022563c7 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/vb.api @@ -0,0 +1,512 @@ +<% Option Explicit %> +<%@ language="vbscript" %> +ADODB.Connection +ADODB.Recordset +ALL_RAW +APPL_MD_PATH +APPL_PHYSICAL_PATH +ASP_LICENSE +ASP_OS +ASP_VERSION +ASP_VERSION_MAJOR +ASP_VERSION_MINOR +AUTH_PASSWORD +AUTH_TYPE +AUTH_USER +Abs +And +Application +Application.Lock +Application.Unlock +Archive +Array +Asc +AscB +AscW +Atn +ByRef +ByVal +CBool +CByte +CCur +CDate +CDbl +CERT_COOKIE +CERT_FLAGS +CERT_ISSUER +CERT_KEYSIZE +CERT_SECRETKEYSIZE +CERT_SERIALNUMBER +CERT_SERVER_ISSUER +CERT_SERVER_SUBJECT +CERT_SUBJECT +CInt +CLng +CONTENT_LENGTH +CONTENT_TYPE +CSng +CStr +Call +Case +Chr +ChrB +ChrW +Class +Cos +Count +CreateObject +Date +DateAdd +DateDiff +DatePart +DateSerial +DateValue +Day +Dict.Add +Dict.CompareMode +Dict.Const +Dict.Exists +Dict.Item +Dict.Items +Dict.Key +Dict.Keys +Dict.Remove +Dict.RemoveAll +Dim +Directory +Do +Do Until +Do While +Drive.AvailableSpace +Drive.DriveLetter +Drive.DriveType +Drive.FileSystem +Drive.FreeSpace +Drive.IsReady +Drive.Path +Drive.RootFolder +Drive.SerialNumber +Drive.ShareName +Drive.TotalSize +Drive.VolumeName +Drives.Count +Drives.Item +Else +End Class +End Function +End If +End Property +End Select +End Sub +End Type +End With +Eqv +Erase +Err +Err.Clear +Err.Description +Err.HelpContect +Err.HelpFile +Err.Number +Err.Raise +Err.Source +Eval +Excel.Application +Execute +ExecuteGlobal +Exit Do +Exit For +Exit Function +Exit Property +Exit Sub +Exp +False +File.Attributes +File.Copy +File.DateCreated +File.DateLastAccessed +File.DateLastModified +File.Delete +File.Drive +File.Move +File.Name +File.OpenAsTextStream +File.ParentFolder +File.Path +File.ShortName +File.ShortPath +File.Size +File.Type +FileSystemObject.BuildPath +FileSystemObject.CopyFile +FileSystemObject.CopyFolder +FileSystemObject.CreateFolder +FileSystemObject.CreateTextFile +FileSystemObject.DeleteFile +FileSystemObject.DeleteFolder +FileSystemObject.DriveExists +FileSystemObject.FileExists +FileSystemObject.FolderExists +FileSystemObject.GetAbsolutePathName +FileSystemObject.GetBaseName +FileSystemObject.GetDrive +FileSystemObject.GetDriveName +FileSystemObject.GetExtensionName +FileSystemObject.GetFile +FileSystemObject.GetFileName +FileSystemObject.GetFolder +FileSystemObject.GetParentFolderName +FileSystemObject.GetSpecialFolder +FileSystemObject.GetStandardStream +FileSystemObject.GetTempName +FileSystemObject.MoveFile +FileSystemObject.MoveFolder +FileSystemObject.OpenTextFile +Files.Count +Files.Item +Filter +Fix +Folder.Copy +Folder.CreateTextFile +Folder.DateCreated +Folder.DateLastAccessed +Folder.DateLastModified +Folder.Delete +Folder.Drive +Folder.Files +Folder.IsRootFolder +Folder.Name +Folder.ParentFolder +Folder.Path +Folder.ShortName +Folder.ShortPath +Folder.Size +Folder.SubFolders +Folder.Type +Folders.Add +Folders.Count +Folders.Item +For +For () = () To () +For () = () To () Step () +For Each () In () +ForAppending +ForWriting +FormatCurrency +FormatDateTime +FormatNumber +FormatPercent +Function +GATEWAY_INTERFACE +GetLocale +GetObject +GetRef +HTTPS +HTTPS_KEYSIZE +HTTPS_SECRET_KEYSIZE +HTTPS_SERVER_ISSUER +HTTPS_SERVER_SUBJECT +Hex +Hidden +Hour +INSTANCE_ID +INSTANCE_META_PATH +If +If Then +If Then Else +Imp +InStr +InputBox +InstrB +InstrRev +Int +Is +IsArray +IsDate +IsEmpty +IsNull +IsNumeric +IsObject +Join +LBound +LCase +LOCAL_ADDR +LOGON_USERLog +LTrim +Left +LeftB +Len +LenB +LoadPicture +Loop +Loop Until +Loop While +MAPI.Session +Matches.Count +Matches.Item +Mid +MidB +Minute +Mod +Month +MonthName +MsgBox +Next +Not +Nothing +Now +Oct +On Error +On Error Goto 0 +On Error Resume Next +Option Explicit +Or +Outlook.Application +PATH_INFO +PATH_TRANSLATEDPrivate +Private Const +Private Function +Private Property Get +Private Property Let +Private Property Set +Private Sub +Private Sub Class_Terminate +Private Sub object_Initialize +Property Get +Property Let +Property Set +Public +Public Const +Public Default Property Get +Public Default Property Let +Public Default Sub +Public Function +Public Property Get +Public Property Let +Public Property Set +Public Sub +QUERY_STRING +REMOTE_ADDR +REMOTE_HOST +REMOTE_USER +REQUEST_METHOD +RGB +RTrim +Randomize +ReadOnly +Redim +RegExp.Execute +RegExp.Global +RegExp.IgnoreCase +RegExp.Pattern +RegExp.Replace +RegExp.Test +Rem +Replace +Request.BinaryRead +Request.Cookies +Request.Cookies("cookie").HasKeys +Request.Form +Request.Form("form").Count +Request.QueryString +Request.QueryString("id").Count +Request.ServerVariables +Request.TotalBytes +Response.AddHeader +Response.AppendToLog +Response.BinaryWrite +Response.Buffer = True +Response.CacheControl +Response.Charset +Response.Clear +Response.ContentType +Response.Cookies("cookie").Expires +Response.Cookies("cookie").HasKeys +Response.Cookies("cookie").Path +Response.Cookies("cookie").Secure +Response.End +Response.Expires +Response.ExpiresAbsolute +Response.Flush +Response.IsClientConnected +Response.PICS +Response.Redirect +Response.Status +Response.Write +Right +RightB +Rnd +Round +SCRIPT_NAME +SERVER_NAME +SERVER_PORT +SERVER_PORT_SECURE +SERVER_PROTOCOL +SERVER_SOFTWARE +ScriptEngine +ScriptEngineBuildVersion +ScriptEngineMajorVersion +ScriptEngineMinorVersion +Scripting.Dictionary +Scripting.FileSystemObject +Scriptlet.TypeLib +Second +Select Case +Server.CreateObject +Server.HTMLEncode +Server.MapPath +Server.ScriptTimeout +Server.URLEncode +Session +Session.Abandom +Session.Contents +Session.Contents.Remove +Session.LCID +Session.SessionID +Session.StaticObjects +Session.Timeout +Set +Set oRegExp = New RegExp +SetLocale +Sgn +Sin +Space +Split +Sqr +StrComp +StrReverse +String +Sub +System +Tan +Terminate +TextStream.AtEndOfLine +TextStream.AtEndOfStream +TextStream.Close +TextStream.Column +TextStream.Line +TextStream.Read +TextStream.ReadAll +TextStream.ReadLine +TextStream.Skip +TextStream.SkipLine +TextStream.Write +TextStream.WriteBlankLines +TextStream.WriteLine +Then +Time +TimeSerial +TimeValue +Timer +To +Trim +TristateFalse +TristateTrue +TristateUseDefault +True +TypeLib.Guid +TypeName +UBound +UCase +URL +VarType +Weekday +WeekdayName +Wend +While +WinHttp.WinHttpRequest.5.1 +With +Word.Application +Xor +Year +adModeRead +adModeReadWrite +adOpenDynamic +adOpenForwardOnly = 0 +adOpenKeyset +adOpenStatic +http.responseText +http.send +http.setRequestHeader +vbAbort +vbAbortRetryIgnore +vbApplicationModal +vbArray +vbBinaryCompare +vbBlack +vbBlue +vbBoolean +vbByte +vbCancel +vbCr +vbCritical +vbCrlf +vbCurrency +vbCyan +vbDataObject +vbDate +vbDecimal +vbDefaultButton1 +vbDefaultButton2 +vbDefaultButton3 +vbDefaultButton4 +vbDouble +vbEmpty +vbError +vbExclamation +vbFalse +vbFirstFourDays +vbFirstFullWeek +vbFirstJan1 +vbFormFeed +vbFriday +vbGeneralDate +vbGreen +vbIgnore +vbInformation +vbInteger +vbLf +vbLong +vbLongDate +vbLongTime +vbMagenta +vbMonday +vbMsgBoxHelpButton +vbMsgBoxRight +vbMsgBoxRtlReading +vbMsgBoxSetForeground +vbNewLine +vbNo +vbNull +vbNullChar +vbNullString +vbOK +vbOKCancel +vbOKOnly +vbObject +vbQuestion +vbRed +vbRetryCancel +vbSaturday +vbShortDate +vbShortTime +vbSingle +vbString +vbSunday +vbSystemModal +vbTab +vbTextCompare +vbThursday +vbTrue +vbTuesday +vbUseDefault +vbUseSystem +vbUseSystemDayOfWeek +vbVerticalTab +vbWednesday +vbWhite +vbYellow +vbYes +vbYesNo +vbYesNoCancel +vbretry diff --git a/PowerEditor/bin/plugins/APIs/vhdl.api b/PowerEditor/bin/plugins/APIs/vhdl.api new file mode 100644 index 00000000..5709ed83 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/vhdl.api @@ -0,0 +1,90 @@ +abs +access +add +after +alias +all +and +architecture +array +assert +attribute +begin +block +body +buffer +bus +case +component +configuration +constant +downto +else +elsif +end +entity +error +exit +for +file +function +generate +generic +group +if +in +inout +inertial +impure +is +label +library +loop +map +mod +nand +next +nor +not +null +of +on +or +others +out +package +port +procedure +process +pure +range +record +reject +rem +report +register +return +rol +ror +select +severity +signal +sla +sll +sra +srl +subtype +then +transport +to +type +unaffected +until +use +variable +wait +when +while +with +xnor +xor \ No newline at end of file diff --git a/PowerEditor/bin/plugins/APIs/xml.api b/PowerEditor/bin/plugins/APIs/xml.api new file mode 100644 index 00000000..74df5668 --- /dev/null +++ b/PowerEditor/bin/plugins/APIs/xml.api @@ -0,0 +1,376 @@ +abbrev +abstract +accel +ackno +acronym +action +address +affiliation +alt +anchor +answer +appendix +appendixinfo +application +area +areaset +areaspec +arg +article +articleinfo +artpagenums +attribution +audiodata +audioobject +author +authorblurb +authorgroup +authorinitials +beginpage +bibliodiv +biblioentry +bibliography +bibliographyinfo +bibliomisc +bibliomixed +bibliomset +biblioset +blockquote +book +bookinfo +bridgehead +callout +calloutlist +caption +caution +chapter +chapterinfo +citation +citerefentry +citetitle +city +classname +classsynopsis +classsynopsisinfo +cmdsynopsis +co +collab +collabname +colophon +colspec +command +computeroutput +confdates +confgroup +confnum +confsponsor +conftitle +constant +constructorsynopsis +contractnum +contractsponsor +contrib +copyright +corpauthor +corpname +country +database +date +dedication +destructorsynopsis +edition +editor +email +emphasis +entry +entrytbl +envar +epigraph +equation +errorcode +errorname +errortype +example +exceptionname +fax +fieldsynopsis +figure +filename +firstname +firstterm +footnote +footnoteref +foreignphrase +formalpara +funcdef +funcparams +funcprototype +funcsynopsis +funcsynopsisinfo +function +glossary +glossaryinfo +glossdef +glossdiv +glossentry +glosslist +glosssee +glossseealso +glossterm +graphic +graphicco +group +guibutton +guiicon +guilabel +guimenu +guimenuitem +guisubmenu +hardware +highlights +holder +honorific +imagedata +imageobject +imageobjectco +important +index +indexdiv +indexentry +indexinfo +indexterm +informalequation +informalexample +informalfigure +informaltable +initializer +inlineequation +inlinegraphic +inlinemediaobject +interface +interfacename +invpartnumber +isbn +issn +issuenum +itemizedlist +itermset +jobtitle +keycap +keycode +keycombo +keysym +keyword +keywordset +label +legalnotice +lineage +lineannotation +link +listitem +literal +literallayout +lot +lotentry +manvolnum +markup +medialabel +mediaobject +mediaobjectco +member +menuchoice +methodname +methodparam +methodsynopsis +modespec +modifier +mousebutton +msg +msgaud +msgentry +msgexplan +msginfo +msglevel +msgmain +msgorig +msgrel +msgset +msgsub +msgtext +note +objectinfo +olink +ooclass +ooexception +oointerface +option +optional +orderedlist +orgdiv +orgname +otheraddr +othercredit +othername +pagenums +para +paramdef +parameter +part +partinfo +partintro +phone +phrase +pob +postcode +preface +prefaceinfo +primary +primaryie +printhistory +procedure +productname +productnumber +programlisting +programlistingco +prompt +property +pubdate +publisher +publishername +pubsnumber +qandadiv +qandaentry +qandaset +question +quote +refclass +refdescriptor +refentry +refentryinfo +refentrytitle +reference +referenceinfo +refmeta +refmiscinfo +refname +refnamediv +refpurpose +refsect1 +refsect1info +refsect2 +refsect2info +refsect3 +refsect3info +refsynopsisdiv +refsynopsisdivinfo +releaseinfo +remark +replaceable +returnvalue +revdescription +revhistory +revision +revnumber +revremark +row +sbr +screen +screenco +screeninfo +screenshot +secondary +secondaryie +sect1 +sect1info +sect2 +sect2info +sect3 +sect3info +sect4 +sect4info +sect5 +sect5info +section +sectioninfo +see +seealso +seealsoie +seeie +seg +seglistitem +segmentedlist +segtitle +seriesvolnums +set +setindex +setindexinfo +setinfo +sgmltag +shortaffil +shortcut +sidebar +sidebarinfo +simpara +simplelist +simplemsgentry +simplesect +spanspec +state +step +street +structfield +structname +subject +subjectset +subjectterm +subscript +substeps +subtitle +superscript +surname +symbol +synopfragment +synopfragmentref +synopsis +systemitem +table +tbody +term +tertiary +tertiaryie +textobject +tfoot +tgroup +thead +tip +title +titleabbrev +toc +tocback +tocchap +tocentry +tocfront +toclevel1 +toclevel2 +toclevel3 +toclevel4 +toclevel5 +tocpart +token +trademark +type +ulink +userinput +varargs +variablelist +varlistentry +varname +videodata +videoobject +void +volumenum +warning +wordasword +xref +year +url \ No newline at end of file diff --git a/PowerEditor/bin/plugins/Config/Explorer.ini b/PowerEditor/bin/plugins/Config/Explorer.ini new file mode 100644 index 00000000..b14d7d2c --- /dev/null +++ b/PowerEditor/bin/plugins/Config/Explorer.ini @@ -0,0 +1,21 @@ +[Explorer] +LastPath=C:\Temp\ +SplitterPos=224 +SplitterPosHor=200 +SortAsc=1 +SortPos=0 +ColPosName=150 +ColPosExt=51 +ColPosSize=70 +ColPosDate=100 +ShowHiddenData=0 +ShowBraces=1 +ShowLongInfo=0 +AddExtToName=0 +SizeFormat=1 +DateFormat=0 +TimeOut=1000 +UseSystemIcons=1 +LastFilter=*.* +[FilterHistory] +0=*.* diff --git a/PowerEditor/bin/plugins/Config/Favorites.dat b/PowerEditor/bin/plugins/Config/Favorites.dat new file mode 100644 index 00000000..260c7dc3 --- /dev/null +++ b/PowerEditor/bin/plugins/Config/Favorites.dat @@ -0,0 +1,12 @@ +[Folders] +Expand=0 + +[Files] +Expand=0 + +[Web] +Expand=0 + +[Sessions] +Expand=0 + diff --git a/PowerEditor/bin/plugins/Config/HexEditor.ini b/PowerEditor/bin/plugins/Config/HexEditor.ini new file mode 100644 index 00000000..1917ab9f --- /dev/null +++ b/PowerEditor/bin/plugins/Config/HexEditor.ini @@ -0,0 +1,7 @@ +[HEX-Editor] +Columns=16 +Bits=1 +Binary=0 +Little=0 +Capitel=0 +Extensions= diff --git a/PowerEditor/bin/plugins/Config/NppExec.ini b/PowerEditor/bin/plugins/Config/NppExec.ini new file mode 100644 index 00000000..224fecfb --- /dev/null +++ b/PowerEditor/bin/plugins/Config/NppExec.ini @@ -0,0 +1,7 @@ +[Console] +Height=162 +Visible=0 +OEM=1 +CmdHistory=0 +[Options] +HotKey=F6 diff --git a/PowerEditor/bin/plugins/Config/SpellChecker.ini b/PowerEditor/bin/plugins/Config/SpellChecker.ini new file mode 100644 index 00000000..2a06088a --- /dev/null +++ b/PowerEditor/bin/plugins/Config/SpellChecker.ini @@ -0,0 +1,2 @@ +[Spell-Checker] +Current Language=en diff --git a/PowerEditor/bin/plugins/ConvertExt.dll b/PowerEditor/bin/plugins/ConvertExt.dll new file mode 100644 index 0000000000000000000000000000000000000000..2c56eae3b22c84158aa241b11ea499ede73d8671 GIT binary patch literal 114688 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%0D^-4mtj# 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

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