From 5d6f4a56187ad0a5a9d1e814d25f3e761392c1fc Mon Sep 17 00:00:00 2001 From: Brian Tabone Date: Mon, 25 May 2026 16:34:13 -0500 Subject: [PATCH 1/4] Initial commit for markdown plus viewer plugin support, a few bugs to sort out but we'll do those on different commits --- macos/CMakeLists.txt | 90 +- macos/platform/nppm_handler.mm | 21 + macos/platform/panel_layout.mm | 23 +- macos/platform/plugin_docking.h | 14 + macos/platform/plugin_docking.mm | 217 + plugins/markdownViewerPlusPlus/.gitattributes | 63 + plugins/markdownViewerPlusPlus/.gitignore | 278 + plugins/markdownViewerPlusPlus/IMPORT.txt | 7 + plugins/markdownViewerPlusPlus/LICENSE.md | 21 + .../Forms/AboutDialog.Designer.cs | 107 + .../Forms/AboutDialog.cs | 76 + .../Forms/AboutDialog.resx | 120 + .../Forms/AbstractOptionsPanel.cs | 52 + .../Forms/AbstractRenderer.Designer.cs | 212 + .../Forms/AbstractRenderer.cs | 414 ++ .../Forms/AbstractRenderer.resx | 123 + .../Forms/MarkdownViewerHtmlPanel.cs | 67 + .../Forms/MarkdownViewerOptions.Designer.cs | 159 + .../Forms/MarkdownViewerOptions.cs | 122 + .../Forms/MarkdownViewerOptions.resx | 173 + .../Forms/MarkdownViewerRenderer.cs | 191 + .../Forms/OptionsPanelGeneral.Designer.cs | 112 + .../Forms/OptionsPanelGeneral.cs | 95 + .../Forms/OptionsPanelGeneral.resx | 123 + .../Forms/OptionsPanelHTML.Designer.cs | 101 + .../Forms/OptionsPanelHTML.cs | 32 + .../Forms/OptionsPanelHTML.resx | 120 + .../Forms/OptionsPanelPDF.Designer.cs | 253 + .../Forms/OptionsPanelPDF.cs | 65 + .../Forms/OptionsPanelPDF.resx | 120 + .../Helper/ClipboardHelper.cs | 228 + .../MarkdownViewerPlusPlus/ILMerge.props | 67 + .../MarkdownViewerPlusPlus/ILMergeOrder.txt | 4 + .../MarkdownViewerPlusPlus/Main.cs | 64 + .../MarkdownViewerPlusPlus/MarkdownViewer.cs | 364 ++ .../MarkdownViewerConfiguration.cs | 228 + .../MarkdownViewerPlusPlus.csproj | 324 + .../PluginInfrastructure/ClikeStringArray.cs | 68 + .../DllExport/DllExportAttribute.cs | 29 + .../DllExport/Mono.Cecil.dll | Bin 0 -> 275968 bytes .../DllExport/NppPlugin.DllExport.MSBuild.dll | Bin 0 -> 41472 bytes .../DllExport/NppPlugin.DllExport.dll | Bin 0 -> 90112 bytes .../DllExport/NppPlugin.DllExport.targets | 44 + .../PluginInfrastructure/Docking_h.cs | 71 + .../PluginInfrastructure/GatewayDomain.cs | 273 + .../PluginInfrastructure/IScintillaGateway.cs | 2582 ++++++++ .../PluginInfrastructure/MenuCmdID_h.cs | 398 ++ .../PluginInfrastructure/Msgs_h.cs | 764 +++ .../PluginInfrastructure/NotepadPPGateway.cs | 101 + .../PluginInfrastructure/NppPluginNETBase.cs | 54 + .../NppPluginNETHelper.cs | 191 + .../PluginInfrastructure/Preference_h.cs | 310 + .../PluginInfrastructure/Resource_h.cs | 350 ++ .../PluginInfrastructure/ScintillaGateway.cs | 5197 +++++++++++++++++ .../PluginInfrastructure/Scintilla_iface.cs | 3047 ++++++++++ .../PluginInfrastructure/UnmanagedExports.cs | 66 + .../PluginInfrastructure/Win32.cs | 316 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 225 + .../Properties/Resources.resx | 169 + .../Resources/Donate-PayPal-green.png | Bin 0 -> 2199 bytes .../Resources/MarkdownViewerHTML.css | 4 + .../MarkdownViewerPlusPlus-Options.png | Bin 0 -> 13686 bytes .../Resources/MarkdownViewerPlusPlus.png | Bin 0 -> 70035 bytes .../Resources/fa-clipboard-16x16.png | Bin 0 -> 283 bytes .../Resources/fa-cog-16x16.png | Bin 0 -> 405 bytes .../Resources/fa-download-16x16.png | Bin 0 -> 346 bytes .../Resources/fa-envelope-16x16.png | Bin 0 -> 340 bytes .../Resources/fa-file-pdf-o-16x16.png | Bin 0 -> 356 bytes .../Resources/fa-html5-16x16.png | Bin 0 -> 482 bytes .../Resources/fa-info-16x16.png | Bin 0 -> 258 bytes .../Resources/fa-paypal-16x16.png | Bin 0 -> 390 bytes .../Resources/fa-print-16x16.png | Bin 0 -> 293 bytes .../Resources/fa-refresh-16x16.png | Bin 0 -> 265 bytes .../Resources/fa-tv-16x16.png | Bin 0 -> 193 bytes .../Resources/fa-upload-16x16.png | Bin 0 -> 325 bytes .../Resources/markdown-16x16-solid.bmp | Bin 0 -> 822 bytes .../Resources/markdown-16x16-solid.png | Bin 0 -> 300 bytes .../Windows/WindowsMessage.cs | 288 + .../MarkdownViewerPlusPlus/app.config | 11 + .../MarkdownViewerPlusPlus/packages.config | 12 + plugins/markdownViewerPlusPlus/README.md | 108 + plugins/markdownViewerPlusPlus/_config.yml | 1 + plugins/markdownViewerPlusPlus/appveyor.yml | 15 + .../license/Apache-2.0-License.md | 201 + .../license/HtmlRenderer-License.md | 30 + .../license/Markdig-License.md | 23 + .../license/Ms-PL-License.md | 31 + .../markdownViewerPlusPlus/license/OFL.txt | 97 + .../license/PDFSharp-License.md | 7 + .../src/macOS/MarkdownViewerPlusPlus.mm | 703 +++ 91 files changed, 20649 insertions(+), 23 deletions(-) create mode 100644 macos/platform/plugin_docking.h create mode 100644 macos/platform/plugin_docking.mm create mode 100644 plugins/markdownViewerPlusPlus/.gitattributes create mode 100644 plugins/markdownViewerPlusPlus/.gitignore create mode 100644 plugins/markdownViewerPlusPlus/IMPORT.txt create mode 100644 plugins/markdownViewerPlusPlus/LICENSE.md create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.Designer.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.resx create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractOptionsPanel.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.Designer.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.resx create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerHtmlPanel.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.Designer.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.resx create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerRenderer.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.Designer.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.resx create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.Designer.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.resx create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.Designer.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.resx create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Helper/ClipboardHelper.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/ILMerge.props create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/ILMergeOrder.txt create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Main.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewer.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewerConfiguration.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewerPlusPlus.csproj create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/ClikeStringArray.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/DllExportAttribute.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/Mono.Cecil.dll create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/NppPlugin.DllExport.MSBuild.dll create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/NppPlugin.DllExport.dll create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/NppPlugin.DllExport.targets create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Docking_h.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/GatewayDomain.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/IScintillaGateway.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/MenuCmdID_h.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Msgs_h.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NotepadPPGateway.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NppPluginNETBase.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NppPluginNETHelper.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Preference_h.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Resource_h.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/ScintillaGateway.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Scintilla_iface.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/UnmanagedExports.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Win32.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/AssemblyInfo.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/Resources.Designer.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/Resources.resx create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/Donate-PayPal-green.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/MarkdownViewerHTML.css create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/MarkdownViewerPlusPlus-Options.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/MarkdownViewerPlusPlus.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-clipboard-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-cog-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-download-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-envelope-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-file-pdf-o-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-html5-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-info-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-paypal-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-print-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-refresh-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-tv-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-upload-16x16.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/markdown-16x16-solid.bmp create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/markdown-16x16-solid.png create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Windows/WindowsMessage.cs create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/app.config create mode 100644 plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/packages.config create mode 100644 plugins/markdownViewerPlusPlus/README.md create mode 100644 plugins/markdownViewerPlusPlus/_config.yml create mode 100644 plugins/markdownViewerPlusPlus/appveyor.yml create mode 100644 plugins/markdownViewerPlusPlus/license/Apache-2.0-License.md create mode 100644 plugins/markdownViewerPlusPlus/license/HtmlRenderer-License.md create mode 100644 plugins/markdownViewerPlusPlus/license/Markdig-License.md create mode 100644 plugins/markdownViewerPlusPlus/license/Ms-PL-License.md create mode 100644 plugins/markdownViewerPlusPlus/license/OFL.txt create mode 100644 plugins/markdownViewerPlusPlus/license/PDFSharp-License.md create mode 100644 plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm diff --git a/macos/CMakeLists.txt b/macos/CMakeLists.txt index 85bed2fef6cc..9a84ed755cb8 100644 --- a/macos/CMakeLists.txt +++ b/macos/CMakeLists.txt @@ -387,11 +387,12 @@ add_executable(PaperWasp "${CMAKE_CURRENT_SOURCE_DIR}/platform/toolbar.mm" "${CMAKE_CURRENT_SOURCE_DIR}/platform/print_support.mm" "${CMAKE_CURRENT_SOURCE_DIR}/platform/hash_tools.mm" - "${CMAKE_CURRENT_SOURCE_DIR}/platform/macro_manager.mm" - "${CMAKE_CURRENT_SOURCE_DIR}/platform/plugin_manager.mm" - "${CMAKE_CURRENT_SOURCE_DIR}/platform/nppm_handler.mm" - "${CMAKE_CURRENT_SOURCE_DIR}/platform/compare_plus_visibility.mm" - "${CMAKE_CURRENT_SOURCE_DIR}/platform/plugin_invariants.mm" + "${CMAKE_CURRENT_SOURCE_DIR}/platform/macro_manager.mm" + "${CMAKE_CURRENT_SOURCE_DIR}/platform/plugin_manager.mm" + "${CMAKE_CURRENT_SOURCE_DIR}/platform/plugin_docking.mm" + "${CMAKE_CURRENT_SOURCE_DIR}/platform/nppm_handler.mm" + "${CMAKE_CURRENT_SOURCE_DIR}/platform/compare_plus_visibility.mm" + "${CMAKE_CURRENT_SOURCE_DIR}/platform/plugin_invariants.mm" ) target_include_directories(PaperWasp PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/platform" @@ -399,9 +400,10 @@ target_include_directories(PaperWasp PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/shim/src" "${SCINTILLA_INCLUDE_DIR}" "${LEXILLA_INCLUDE_DIR}" - "${UCHARDET_DIR}" - "${NPP_SRC_DIR}/MISC/PluginsManager" -) + "${UCHARDET_DIR}" + "${NPP_SRC_DIR}/MISC/PluginsManager" + "${NPP_SRC_DIR}/WinControls/DockingWnd" +) target_link_libraries(PaperWasp win32shim scintilla_bridge @@ -526,7 +528,7 @@ target_link_libraries(ComparePlus PRIVATE "-framework Foundation" ) -add_custom_target(install_compare_plus +add_custom_target(install_compare_plus DEPENDS ComparePlus COMMAND ${CMAKE_COMMAND} -E make_directory "$ENV{HOME}/Library/Application Support/PaperWasp/plugins/ComparePlus" @@ -534,10 +536,54 @@ add_custom_target(install_compare_plus "$" "$ENV{HOME}/Library/Application Support/PaperWasp/plugins/ComparePlus/ComparePlus.dylib" COMMENT "Installing ComparePlus plugin to ~/Library/Application Support/PaperWasp/plugins/" -) - -# ============================================================ -# Packaging: App bundle, code signing, and DMG +) + +# ============================================================ +# Plugin: MarkdownViewerPlusPlus (macOS native port) +# ============================================================ +set(MARKDOWN_VIEWER_PLUS_PLUS_DIR "${NPP_ROOT}/plugins/markdownViewerPlusPlus") + +add_library(MarkdownViewerPlusPlus MODULE + "${MARKDOWN_VIEWER_PLUS_PLUS_DIR}/src/macOS/MarkdownViewerPlusPlus.mm" +) +target_include_directories(MarkdownViewerPlusPlus PRIVATE + "${SHIM_INCLUDE_DIR}" + "${NPP_SRC_DIR}/MISC/PluginsManager" + "${NPP_SRC_DIR}/WinControls/DockingWnd" + "${SCINTILLA_INCLUDE_DIR}" +) +target_compile_definitions(MarkdownViewerPlusPlus PRIVATE + UNICODE + _UNICODE +) +set_target_properties(MarkdownViewerPlusPlus PROPERTIES + PREFIX "" + SUFFIX ".dylib" + OUTPUT_NAME "MarkdownViewerPlusPlus" +) +target_compile_options(MarkdownViewerPlusPlus PRIVATE + -fobjc-arc + -Wno-deprecated-declarations +) +target_link_options(MarkdownViewerPlusPlus PRIVATE -undefined dynamic_lookup) +target_link_libraries(MarkdownViewerPlusPlus PRIVATE + "-framework AppKit" + "-framework Foundation" + "-framework WebKit" +) + +add_custom_target(install_markdown_viewer_plus_plus + DEPENDS MarkdownViewerPlusPlus + COMMAND ${CMAKE_COMMAND} -E make_directory + "$ENV{HOME}/Library/Application Support/PaperWasp/plugins/MarkdownViewerPlusPlus" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "$" + "$ENV{HOME}/Library/Application Support/PaperWasp/plugins/MarkdownViewerPlusPlus/MarkdownViewerPlusPlus.dylib" + COMMENT "Installing MarkdownViewerPlusPlus plugin to ~/Library/Application Support/PaperWasp/plugins/" +) + +# ============================================================ +# Packaging: App bundle, code signing, and DMG # ============================================================ set(NPP_MACOS_DIST_DIR "${CMAKE_CURRENT_SOURCE_DIR}/dist") set(NPP_MACOS_APP_BUNDLE "${NPP_MACOS_DIST_DIR}/${PAPERWASP_APP_NAME}.app") @@ -557,18 +603,22 @@ configure_file( set(NPP_MACOS_APP_PLUGINS "${NPP_MACOS_APP_CONTENTS}/PlugIns") -add_custom_target(PaperWasp_package - DEPENDS PaperWasp ComparePlus +add_custom_target(PaperWasp_package + DEPENDS PaperWasp ComparePlus MarkdownViewerPlusPlus COMMAND ${CMAKE_COMMAND} -E rm -rf "${NPP_MACOS_APP_BUNDLE}" COMMAND ${CMAKE_COMMAND} -E make_directory "${NPP_MACOS_APP_MACOS}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${NPP_MACOS_APP_RESOURCES}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${NPP_MACOS_APP_PLUGINS}/ComparePlus" + COMMAND ${CMAKE_COMMAND} -E make_directory "${NPP_MACOS_APP_RESOURCES}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${NPP_MACOS_APP_PLUGINS}/ComparePlus" + COMMAND ${CMAKE_COMMAND} -E make_directory "${NPP_MACOS_APP_PLUGINS}/MarkdownViewerPlusPlus" COMMAND ${CMAKE_COMMAND} -E copy_if_different "$" "${NPP_MACOS_APP_MACOS}/${PAPERWASP_APP_NAME}" - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "$" - "${NPP_MACOS_APP_PLUGINS}/ComparePlus/ComparePlus.dylib" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "$" + "${NPP_MACOS_APP_PLUGINS}/ComparePlus/ComparePlus.dylib" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "$" + "${NPP_MACOS_APP_PLUGINS}/MarkdownViewerPlusPlus/MarkdownViewerPlusPlus.dylib" COMMAND ditto --norsrc "${NPP_ROOT}/logo.png" "${NPP_MACOS_APP_MACOS}/logo.png" diff --git a/macos/platform/nppm_handler.mm b/macos/platform/nppm_handler.mm index 6cad8e1f9afa..b021a4bc6aeb 100644 --- a/macos/platform/nppm_handler.mm +++ b/macos/platform/nppm_handler.mm @@ -13,6 +13,7 @@ #include "string_utils.h" #include "compare_plus_visibility.h" #include "appearance.h" +#include "plugin_docking.h" #include "Notepad_plus_msgs.h" #include "Scintilla.h" @@ -234,6 +235,26 @@ LRESULT handleNppmMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) return TRUE; } + case NPPM_DMMSHOW: + return showPluginDockingDialog(reinterpret_cast(lParam)) ? TRUE : FALSE; + + case NPPM_DMMHIDE: + return hidePluginDockingDialog(reinterpret_cast(lParam)) ? TRUE : FALSE; + + case NPPM_DMMUPDATEDISPINFO: + return updatePluginDockingDialog(reinterpret_cast(lParam)) ? TRUE : FALSE; + + case NPPM_DMMREGASDCKDLG: + return registerPluginDockingDialog(reinterpret_cast(lParam)) ? TRUE : FALSE; + + case NPPM_DMMVIEWOTHERTAB: + return showPluginDockingDialogByName(reinterpret_cast(lParam)) ? TRUE : FALSE; + + case NPPM_DMMGETPLUGINHWNDBYNAME: + return reinterpret_cast( + findPluginDockingDialog(reinterpret_cast(wParam), + reinterpret_cast(lParam))); + case NPPM_GETEDITORDEFAULTBACKGROUNDCOLOR: // Returned as 0x00BBGGRR (Win32 COLORREF). Must match the // background Scintilla paints for style 32 in diff --git a/macos/platform/panel_layout.mm b/macos/platform/panel_layout.mm index 49a3ddd4eb30..e34d86b4d777 100644 --- a/macos/platform/panel_layout.mm +++ b/macos/platform/panel_layout.mm @@ -19,6 +19,7 @@ #include "file_switcher_panel.h" #include "function_list_panel.h" #include "npp_constants.h" +#include "plugin_docking.h" #include "scintilla_bridge.h" #include "windows.h" #include "split_view.h" @@ -190,7 +191,8 @@ void relayoutPanels() // -- Calculate zone widths ------------------------------------------------ bool leftZoneVisible = ctx().fileBrowserEnabled || ctx().fileSwitcherEnabled; - bool rightZoneVisible = ctx().functionListEnabled || ctx().clipboardHistoryEnabled; + bool pluginDockingVisible = isPluginDockingVisible(); + bool rightZoneVisible = ctx().functionListEnabled || ctx().clipboardHistoryEnabled || pluginDockingVisible; CGFloat leftWidth = leftZoneVisible ? static_cast(ctx().leftPanelWidth) : 0.0; CGFloat mapWidth = ctx().documentMapEnabled ? static_cast(ctx().documentMapWidth) : 0.0; @@ -358,8 +360,11 @@ void relayoutPanels() NSView* flContainer = (__bridge NSView*)functionListContainerView(); NSView* chContainer = (__bridge NSView*)clipboardHistoryContainerView(); - bool hasBoth = (flContainer != nil) && (chContainer != nil) && - ctx().functionListEnabled && ctx().clipboardHistoryEnabled; + NSView* pluginContainer = (__bridge NSView*)pluginDockingContainerView(); + bool showFunctionList = (flContainer != nil) && ctx().functionListEnabled && !pluginDockingVisible; + bool showClipboardHistory = (chContainer != nil) && ctx().clipboardHistoryEnabled && !pluginDockingVisible; + bool showPluginDocking = (pluginContainer != nil) && pluginDockingVisible; + bool hasBoth = showFunctionList && showClipboardHistory; if (hasBoth) { @@ -406,14 +411,26 @@ void relayoutPanels() if (sRightHorizontalDivider) sRightHorizontalDivider.hidden = YES; } + + if (showPluginDocking) + { + pluginContainer.frame = NSMakeRect(curX, zoneY, rightWidth, zoneH); + pluginContainer.hidden = NO; + if (flContainer) flContainer.hidden = YES; + if (chContainer) chContainer.hidden = YES; + if (sRightHorizontalDivider) sRightHorizontalDivider.hidden = YES; + layoutPluginDockingViews(); + } } else { // Hide right-zone elements NSView* flContainer = (__bridge NSView*)functionListContainerView(); NSView* chContainer = (__bridge NSView*)clipboardHistoryContainerView(); + NSView* pluginContainer = (__bridge NSView*)pluginDockingContainerView(); if (flContainer) flContainer.hidden = !ctx().functionListEnabled; if (chContainer) chContainer.hidden = !ctx().clipboardHistoryEnabled; + if (pluginContainer) pluginContainer.hidden = YES; if (sRightVerticalDivider) sRightVerticalDivider.hidden = YES; if (sRightHorizontalDivider) sRightHorizontalDivider.hidden = YES; } diff --git a/macos/platform/plugin_docking.h b/macos/platform/plugin_docking.h new file mode 100644 index 000000000000..c62d2fef216a --- /dev/null +++ b/macos/platform/plugin_docking.h @@ -0,0 +1,14 @@ +#pragma once + +#include "windows.h" + +bool registerPluginDockingDialog(const void* dockingData); +bool showPluginDockingDialog(HWND hwnd); +bool hidePluginDockingDialog(HWND hwnd); +bool updatePluginDockingDialog(HWND hwnd); +bool showPluginDockingDialogByName(const wchar_t* name); +HWND findPluginDockingDialog(const wchar_t* windowName, const wchar_t* moduleName); + +bool isPluginDockingVisible(); +void* pluginDockingContainerView(); +void layoutPluginDockingViews(); diff --git a/macos/platform/plugin_docking.mm b/macos/platform/plugin_docking.mm new file mode 100644 index 000000000000..6ea1a49cfe1f --- /dev/null +++ b/macos/platform/plugin_docking.mm @@ -0,0 +1,217 @@ +#import + +#include "plugin_docking.h" +#include "app_state.h" +#include "handle_registry.h" +#include "panel_layout.h" +#include "Docking.h" + +#include +#include + +struct PluginDockingPanel +{ + HWND hwnd = nullptr; + std::wstring name; + std::wstring moduleName; + int dlgID = 0; + UINT mask = 0; + bool visible = false; +}; + +static NSView* sPluginDockingContainer = nil; +static std::vector sPanels; + +static bool ensureContainer() +{ + if (sPluginDockingContainer) + return true; + if (!ctx().mainWindow) + return false; + NSView* contentView = ctx().mainWindow.contentView; + if (!contentView) + return false; + + sPluginDockingContainer = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, ctx().rightPanelWidth, 100)]; + sPluginDockingContainer.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; + sPluginDockingContainer.hidden = YES; + [contentView addSubview:sPluginDockingContainer]; + return true; +} + +static PluginDockingPanel* findPanel(HWND hwnd) +{ + for (auto& panel : sPanels) + { + if (panel.hwnd == hwnd) + return &panel; + } + return nullptr; +} + +static NSView* nativeViewForHwnd(HWND hwnd) +{ + auto* info = HandleRegistry::getWindowInfo(hwnd); + if (!info || !info->nativeView) + return nil; + return (__bridge NSView*)info->nativeView; +} + +static void attachPanelView(HWND hwnd) +{ + if (!ensureContainer()) + return; + NSView* view = nativeViewForHwnd(hwnd); + if (!view) + return; + if (view.superview != sPluginDockingContainer) + { + [view removeFromSuperview]; + [sPluginDockingContainer addSubview:view]; + } + view.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; +} + +bool registerPluginDockingDialog(const void* dockingData) +{ + if (!dockingData) + return false; + const tTbData* data = static_cast(dockingData); + if (!data->hClient) + return false; + if (!ensureContainer()) + return false; + + PluginDockingPanel* existing = findPanel(data->hClient); + if (!existing) + { + PluginDockingPanel panel; + panel.hwnd = data->hClient; + panel.name = data->pszName ? data->pszName : L""; + panel.moduleName = data->pszModuleName ? data->pszModuleName : L""; + panel.dlgID = data->dlgID; + panel.mask = data->uMask; + sPanels.push_back(std::move(panel)); + existing = &sPanels.back(); + } + else + { + existing->name = data->pszName ? data->pszName : L""; + existing->moduleName = data->pszModuleName ? data->pszModuleName : L""; + existing->dlgID = data->dlgID; + existing->mask = data->uMask; + } + + attachPanelView(data->hClient); + NSView* view = nativeViewForHwnd(data->hClient); + if (view) + view.hidden = YES; + layoutPluginDockingViews(); + return true; +} + +bool showPluginDockingDialog(HWND hwnd) +{ + PluginDockingPanel* panel = findPanel(hwnd); + if (!panel) + return false; + attachPanelView(hwnd); + + for (auto& candidate : sPanels) + { + candidate.visible = (candidate.hwnd == hwnd); + NSView* view = nativeViewForHwnd(candidate.hwnd); + if (view) + view.hidden = !candidate.visible; + } + + if (sPluginDockingContainer) + sPluginDockingContainer.hidden = NO; + relayoutPanels(); + layoutPluginDockingViews(); + return true; +} + +bool hidePluginDockingDialog(HWND hwnd) +{ + PluginDockingPanel* panel = findPanel(hwnd); + if (!panel) + return false; + panel->visible = false; + NSView* view = nativeViewForHwnd(hwnd); + if (view) + view.hidden = YES; + if (sPluginDockingContainer) + sPluginDockingContainer.hidden = !isPluginDockingVisible(); + relayoutPanels(); + return true; +} + +bool updatePluginDockingDialog(HWND hwnd) +{ + NSView* view = nativeViewForHwnd(hwnd); + if (!view) + return false; + view.needsDisplay = YES; + return true; +} + +bool showPluginDockingDialogByName(const wchar_t* name) +{ + if (!name) + return false; + for (const auto& panel : sPanels) + { + if (panel.name == name) + return showPluginDockingDialog(panel.hwnd); + } + return false; +} + +HWND findPluginDockingDialog(const wchar_t* windowName, const wchar_t* moduleName) +{ + if (!moduleName) + return nullptr; + for (const auto& panel : sPanels) + { + if (panel.moduleName != moduleName) + continue; + if (!windowName || panel.name == windowName) + return panel.hwnd; + } + return nullptr; +} + +bool isPluginDockingVisible() +{ + for (const auto& panel : sPanels) + { + if (panel.visible) + return true; + } + return false; +} + +void* pluginDockingContainerView() +{ + if (!sPluginDockingContainer) + ensureContainer(); + return (__bridge void*)sPluginDockingContainer; +} + +void layoutPluginDockingViews() +{ + if (!sPluginDockingContainer) + return; + + sPluginDockingContainer.hidden = !isPluginDockingVisible(); + for (const auto& panel : sPanels) + { + NSView* view = nativeViewForHwnd(panel.hwnd); + if (!view) + continue; + view.hidden = !panel.visible; + if (panel.visible) + view.frame = sPluginDockingContainer.bounds; + } +} diff --git a/plugins/markdownViewerPlusPlus/.gitattributes b/plugins/markdownViewerPlusPlus/.gitattributes new file mode 100644 index 000000000000..1ff0c423042b --- /dev/null +++ b/plugins/markdownViewerPlusPlus/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/plugins/markdownViewerPlusPlus/.gitignore b/plugins/markdownViewerPlusPlus/.gitignore new file mode 100644 index 000000000000..2be7f4f5353f --- /dev/null +++ b/plugins/markdownViewerPlusPlus/.gitignore @@ -0,0 +1,278 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config +/_site +/Gemfile.lock +/Gemfile diff --git a/plugins/markdownViewerPlusPlus/IMPORT.txt b/plugins/markdownViewerPlusPlus/IMPORT.txt new file mode 100644 index 000000000000..be6370190975 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/IMPORT.txt @@ -0,0 +1,7 @@ +Upstream: https://github.com/nea/MarkdownViewerPlusPlus +Imported commit: 1a3dddc525913995bd65b6c7d6a6c11a1c2ca7f3 + +PaperWasp's macOS port keeps the upstream C#/.NET Framework WinForms plugin +source as a behavioral and licensing reference. The loadable macOS plugin lives +under src/macOS and is implemented as a native Mach-O dylib because PaperWasp's +plugin manager loads native modules, not Windows .NET plugin DLLs. diff --git a/plugins/markdownViewerPlusPlus/LICENSE.md b/plugins/markdownViewerPlusPlus/LICENSE.md new file mode 100644 index 000000000000..a8ae561ab9ec --- /dev/null +++ b/plugins/markdownViewerPlusPlus/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Savas Ziplies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.Designer.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.Designer.cs new file mode 100644 index 000000000000..7a25238eedec --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.Designer.cs @@ -0,0 +1,107 @@ +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + partial class AboutDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.btnClose = new System.Windows.Forms.Button(); + this.btnVisit = new System.Windows.Forms.Button(); + this.lblAbout = new System.Windows.Forms.Label(); + this.picBoxDonate = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.picBoxDonate)).BeginInit(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.Location = new System.Drawing.Point(212, 254); + this.btnClose.Name = "btnClose"; + this.btnClose.Size = new System.Drawing.Size(94, 23); + this.btnClose.TabIndex = 0; + this.btnClose.Text = "Close"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // btnVisit + // + this.btnVisit.Location = new System.Drawing.Point(12, 254); + this.btnVisit.Name = "btnVisit"; + this.btnVisit.Size = new System.Drawing.Size(94, 23); + this.btnVisit.TabIndex = 1; + this.btnVisit.Text = "Visit Website"; + this.btnVisit.UseVisualStyleBackColor = true; + this.btnVisit.Click += new System.EventHandler(this.btnVisit_Click); + // + // lblAbout + // + this.lblAbout.Location = new System.Drawing.Point(13, 13); + this.lblAbout.Name = "lblAbout"; + this.lblAbout.Size = new System.Drawing.Size(259, 238); + this.lblAbout.TabIndex = 2; + // + // picBoxDonate + // + this.picBoxDonate.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.picBoxDonate.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.Donate_PayPal_green; + this.picBoxDonate.InitialImage = null; + this.picBoxDonate.Location = new System.Drawing.Point(112, 254); + this.picBoxDonate.Name = "picBoxDonate"; + this.picBoxDonate.Size = new System.Drawing.Size(94, 23); + this.picBoxDonate.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.picBoxDonate.TabIndex = 3; + this.picBoxDonate.TabStop = false; + this.picBoxDonate.Click += new System.EventHandler(this.picBoxDonate_Click); + // + // AboutDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(318, 289); + this.Controls.Add(this.picBoxDonate); + this.Controls.Add(this.lblAbout); + this.Controls.Add(this.btnVisit); + this.Controls.Add(this.btnClose); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutDialog"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "About MarkdownViewer++"; + ((System.ComponentModel.ISupportInitialize)(this.picBoxDonate)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnVisit; + private System.Windows.Forms.Label lblAbout; + private System.Windows.Forms.PictureBox picBoxDonate; + } +} \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.cs new file mode 100644 index 000000000000..912c7ac7e6e4 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.cs @@ -0,0 +1,76 @@ +using System; +using System.Reflection; +using System.Windows.Forms; + +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + /// + /// About Dialog for this plugin with basic information and link to the website. + /// + public partial class AboutDialog : Form + { + /// + /// Init the about dialog text from the Assembly Information + /// + public AboutDialog() + { + InitializeComponent(); + + //Get the assembly information for the About dialog + string title = ((AssemblyTitleAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyTitleAttribute), false)).Title; + string description = ((AssemblyDescriptionAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyDescriptionAttribute), false)).Description; + string version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + //About Text + this.lblAbout.Text = $@"{title} + +{description} + +Version: {version} + +Many thanks to: + Notepad++ PluginPack.net by kbilsted + Markdig by lunet-io + PDFSharp by empira Software GmbH + HTMLRenderer by ArthurHub + SVG.NET by vvvv + FontAwesome + dcurtis + +For more information, visit the website or check the included README.md + "; + } + + /// + /// + /// + /// + /// + private void btnClose_Click(object sender, System.EventArgs e) + { + this.Close(); + } + + /// + /// Visit GitHub + /// + /// + /// + private void btnVisit_Click(object sender, System.EventArgs e) + { + System.Diagnostics.Process.Start("https://github.com/nea/MarkdownViewerPlusPlus"); + } + + /// + /// + /// + /// + /// + private void picBoxDonate_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start("https://www.paypal.me/insanitydesign"); + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.resx b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.resx new file mode 100644 index 000000000000..1af7de150c99 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AboutDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractOptionsPanel.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractOptionsPanel.cs new file mode 100644 index 000000000000..b3855ccf4bd3 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractOptionsPanel.cs @@ -0,0 +1,52 @@ +using System; +using System.Windows.Forms; +using static com.insanitydesign.MarkdownViewerPlusPlus.MarkdownViewerConfiguration; + +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + /// + /// Abstract class not being abstract for Designer compatibility + /// + public class AbstractOptionsPanel : UserControl + { + /// + /// + /// + public AbstractOptionsPanel() + { + // + this.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.Dock = DockStyle.Fill; + // + InitializeComponent(); + } + + /// + /// Load all options from the local Options instance + /// onto the panel. + /// + public virtual void LoadOptions(Options options) + { + throw new NotImplementedException(); + } + + /// + /// Save the made selections/entries of the panel + /// in the local Options instance. + /// + public virtual void SaveOptions(ref Options options) + { + throw new NotImplementedException(); + } + + /// + /// + /// + protected virtual void InitializeComponent() + { + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.Designer.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.Designer.cs new file mode 100644 index 000000000000..68aabf1a007d --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.Designer.cs @@ -0,0 +1,212 @@ +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + /// + /// + /// + partial class AbstractRenderer + { + /// + /// Required designer variable. + /// + protected System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + protected void InitializeComponent() + { + this.markdownViewerMenuStrip = new System.Windows.Forms.MenuStrip(); + this.exportAsToolStrip = new System.Windows.Forms.ToolStripMenuItem(); + this.exportAsHTMLMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportAsPDFMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sendToolStrip = new System.Windows.Forms.ToolStripMenuItem(); + this.sendAsHTMLMail = new System.Windows.Forms.ToolStripMenuItem(); + this.sendAsTextMail = new System.Windows.Forms.ToolStripMenuItem(); + this.sendToPrinter = new System.Windows.Forms.ToolStripMenuItem(); + this.sendToClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.markdownViewerMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // markdownViewerMenuStrip + // + this.markdownViewerMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exportAsToolStrip, + this.sendToolStrip, + this.viewToolStripMenuItem, + this.aboutToolStripMenuItem}); + this.markdownViewerMenuStrip.Location = new System.Drawing.Point(0, 0); + this.markdownViewerMenuStrip.Name = "markdownViewerMenuStrip"; + this.markdownViewerMenuStrip.Size = new System.Drawing.Size(284, 24); + this.markdownViewerMenuStrip.TabIndex = 1; + this.markdownViewerMenuStrip.Text = "markdownViewerMenuStrip"; + // + // exportAsToolStrip + // + this.exportAsToolStrip.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exportAsHTMLMenuItem, + this.exportAsPDFMenuItem}); + this.exportAsToolStrip.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_download_16x16; + this.exportAsToolStrip.Name = "exportAsToolStrip"; + this.exportAsToolStrip.Size = new System.Drawing.Size(82, 20); + this.exportAsToolStrip.Text = "Export as"; + // + // exportAsHTMLMenuItem + // + this.exportAsHTMLMenuItem.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_html5_16x16; + this.exportAsHTMLMenuItem.Name = "exportAsHTMLMenuItem"; + this.exportAsHTMLMenuItem.Size = new System.Drawing.Size(107, 22); + this.exportAsHTMLMenuItem.Text = "HTML"; + this.exportAsHTMLMenuItem.Click += new System.EventHandler(this.exportAsHTMLMenuItem_Click); + // + // exportAsPDFMenuItem + // + this.exportAsPDFMenuItem.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_file_pdf_o_16x16; + this.exportAsPDFMenuItem.Name = "exportAsPDFMenuItem"; + this.exportAsPDFMenuItem.Size = new System.Drawing.Size(107, 22); + this.exportAsPDFMenuItem.Text = "PDF"; + this.exportAsPDFMenuItem.Click += new System.EventHandler(this.exportAsPDFMenuItem_Click); + // + // sendToolStrip + // + this.sendToolStrip.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.sendAsHTMLMail, + this.sendAsTextMail, + this.sendToPrinter, + this.sendToClipboard}); + this.sendToolStrip.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_upload_16x16; + this.sendToolStrip.Name = "sendToolStrip"; + this.sendToolStrip.Size = new System.Drawing.Size(61, 20); + this.sendToolStrip.Text = "Send"; + // + // sendAsHTMLMail + // + this.sendAsHTMLMail.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_html5_16x16; + this.sendAsHTMLMail.Name = "sendAsHTMLMail"; + this.sendAsHTMLMail.Size = new System.Drawing.Size(176, 22); + this.sendAsHTMLMail.Text = "as HTML E-mail"; + this.sendAsHTMLMail.Click += new System.EventHandler(this.sendAsHTMLMail_Click); + // + // sendAsTextMail + // + this.sendAsTextMail.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_envelope_16x16; + this.sendAsTextMail.Name = "sendAsTextMail"; + this.sendAsTextMail.Size = new System.Drawing.Size(176, 22); + this.sendAsTextMail.Text = "as Text E-mail"; + this.sendAsTextMail.Click += new System.EventHandler(this.sendAsTextMail_Click); + // + // sendToPrinter + // + this.sendToPrinter.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_print_16x16; + this.sendToPrinter.Name = "sendToPrinter"; + this.sendToPrinter.Size = new System.Drawing.Size(176, 22); + this.sendToPrinter.Text = "to Printer"; + this.sendToPrinter.Click += new System.EventHandler(this.sendToPrinter_Click); + // + // sendToClipboard + // + this.sendToClipboard.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_clipboard_16x16; + this.sendToClipboard.Name = "sendToClipboard"; + this.sendToClipboard.Size = new System.Drawing.Size(176, 22); + this.sendToClipboard.Text = "HTML to Clipboard"; + this.sendToClipboard.Click += new System.EventHandler(this.sendToClipboard_Click); + // + // viewToolStripMenuItem + // + this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.refreshToolStripMenuItem}); + this.viewToolStripMenuItem.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_tv_16x16; + this.viewToolStripMenuItem.Name = "viewToolStripMenuItem"; + this.viewToolStripMenuItem.Size = new System.Drawing.Size(60, 20); + this.viewToolStripMenuItem.Text = "View"; + // + // refreshToolStripMenuItem + // + this.refreshToolStripMenuItem.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_refresh_16x16; + this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem"; + this.refreshToolStripMenuItem.Size = new System.Drawing.Size(113, 22); + this.refreshToolStripMenuItem.Text = "Refresh"; + this.refreshToolStripMenuItem.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.optionsToolStripMenuItem, + this.aboutToolStripMenuItem1}); + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(24, 20); + this.aboutToolStripMenuItem.Text = "?"; + // + // optionsToolStripMenuItem + // + this.optionsToolStripMenuItem.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_cog_16x16; + this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; + this.optionsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.optionsToolStripMenuItem.Text = "Options"; + this.optionsToolStripMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem_Click); + // + // aboutToolStripMenuItem1 + // + this.aboutToolStripMenuItem1.Image = global::com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources.fa_info_16x16; + this.aboutToolStripMenuItem1.Name = "aboutToolStripMenuItem1"; + this.aboutToolStripMenuItem1.Size = new System.Drawing.Size(180, 22); + this.aboutToolStripMenuItem1.Text = "About"; + this.aboutToolStripMenuItem1.Click += new System.EventHandler(this.aboutToolStripMenuItem1_Click); + // + // AbstractRenderer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 261); + this.Controls.Add(this.markdownViewerMenuStrip); + this.MainMenuStrip = this.markdownViewerMenuStrip; + this.Name = "AbstractRenderer"; + this.Text = "MarkdownViewer++"; + this.markdownViewerMenuStrip.ResumeLayout(false); + this.markdownViewerMenuStrip.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + protected System.Windows.Forms.MenuStrip markdownViewerMenuStrip; + protected System.Windows.Forms.ToolStripMenuItem exportAsToolStrip; + protected System.Windows.Forms.ToolStripMenuItem exportAsHTMLMenuItem; + protected System.Windows.Forms.ToolStripMenuItem exportAsPDFMenuItem; + protected System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem; + protected System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem sendToolStrip; + private System.Windows.Forms.ToolStripMenuItem sendAsHTMLMail; + private System.Windows.Forms.ToolStripMenuItem sendAsTextMail; + private System.Windows.Forms.ToolStripMenuItem sendToPrinter; + private System.Windows.Forms.ToolStripMenuItem sendToClipboard; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem1; + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.cs new file mode 100644 index 000000000000..16ecb8de6e29 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.cs @@ -0,0 +1,414 @@ +using com.insanitydesign.MarkdownViewerPlusPlus.Properties; +using com.insanitydesign.MarkdownViewerPlusPlus.Windows; +using Kbg.NppPluginNET; +using Kbg.NppPluginNET.PluginInfrastructure; +using System; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using Outlook = Microsoft.Office.Interop.Outlook; +using static com.insanitydesign.MarkdownViewerPlusPlus.Windows.WindowsMessage; +using System.Drawing.Printing; +using TheArtOfDev.HtmlRenderer.PdfSharp; +using System.Xml.Linq; +using PdfSharp.Pdf; +using System.IO; +using System.Net; +using com.insanitydesign.MarkdownViewerPlusPlus.Helper; +using static com.insanitydesign.MarkdownViewerPlusPlus.MarkdownViewer; +using Markdig; +using System.Text.RegularExpressions; +using System.Linq; +using System.Collections.Generic; + +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + /// + /// + /// + public abstract partial class AbstractRenderer : Form + { + /// + /// + /// + protected Icon toolbarIcon; + + /// + /// + /// + protected MarkdownViewer markdownViewer; + + /// + /// + /// + protected string assemblyTitle; + + /// + /// + /// + protected virtual string RawText { get; set; } + + /// + /// + /// + protected virtual string ConvertedText { get; set; } + + /// + /// + /// + protected virtual FileInformation FileInfo { get; set; } + + /// + /// + /// + protected MarkdownPipeline markdownPipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build(); + + /// + /// + /// + protected string patternCSSImportStatements = "(@import\\s.+;)"; + + /// + /// + /// + /// + public AbstractRenderer(MarkdownViewer markdownViewer) + { + this.markdownViewer = markdownViewer; + InitializeComponent(); + Init(); + } + + /// + /// + /// + protected virtual void Init() + { + // + using (Bitmap newBmp = new Bitmap(16, 16)) + { + Graphics g = Graphics.FromImage(newBmp); + ColorMap[] colorMap = new ColorMap[1]; + colorMap[0] = new ColorMap(); + colorMap[0].OldColor = Color.Fuchsia; + colorMap[0].NewColor = Color.FromKnownColor(KnownColor.ButtonFace); + ImageAttributes attr = new ImageAttributes(); + attr.SetRemapTable(colorMap); + g.DrawImage(Resources.markdown_16x16_solid_bmp, new Rectangle(0, 0, 16, 16), 0, 0, 16, 16, GraphicsUnit.Pixel, attr); + toolbarIcon = Icon.FromHandle(newBmp.GetHicon()); + } + //Get the AssemblyTitle + this.assemblyTitle = ((AssemblyTitleAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyTitleAttribute), false)).Title; + // + NppTbData _nppTbData = new NppTbData(); + _nppTbData.hClient = this.Handle; + _nppTbData.pszName = this.assemblyTitle; + _nppTbData.dlgID = this.markdownViewer.commandId; + _nppTbData.uMask = NppTbMsg.DWS_DF_CONT_RIGHT | NppTbMsg.DWS_ICONTAB | NppTbMsg.DWS_ICONBAR; + _nppTbData.hIconTab = (uint)toolbarIcon.Handle; + _nppTbData.pszModuleName = Main.PluginName; + IntPtr _ptrNppTbData = Marshal.AllocHGlobal(Marshal.SizeOf(_nppTbData)); + Marshal.StructureToPtr(_nppTbData, _ptrNppTbData, false); + //Register dockable window and hide initially + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint)NppMsg.NPPM_DMMREGASDCKDLG, 0, _ptrNppTbData); + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint)NppMsg.NPPM_DMMHIDE, 0, this.Handle); + + //Hide the E-mail items if Outlook is not installed + this.sendAsTextMail.Visible = IsOutlookInstalled(); + this.sendAsHTMLMail.Visible = IsOutlookInstalled(); + } + + /// + /// + /// + /// + protected override void WndProc(ref Message m) + { + //Listen for the closing of the dockable panel to toggle the toolbar icon + switch (m.Msg) + { + case (int)WM_NOTIFY: + var notify = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR)); + if (notify.code == (int)DockMgrMsg.DMN_CLOSE) + { + this.markdownViewer.ToggleToolbarIcon(false); + } + break; + } + //Continue the processing, as we only toggle + base.WndProc(ref m); + } + + /// + /// + /// + /// + /// + public virtual void Render(string text, FileInformation fileInfo) + { + FileInfo = fileInfo; + RawText = text; + ConvertedText = Markdown.ToHtml(text, this.markdownPipeline); + } + + /// + /// + /// + /// + /// + protected void refreshToolStripMenuItem_Click(object sender, EventArgs e) + { + this.markdownViewer.Update(); + } + + /// + /// Scroll the rendered panel vertically based on the given ration + /// taken from Notepad++ + /// + /// + public abstract void ScrollByRatioVertically(double scrollRatio); + + /// + /// + /// + /// + /// + /// + protected string BuildHtml(string html = "", string title = "") + { + // + if (title == "") title = this.assemblyTitle; + // + return $@" + + + + + + {title} + + + + {html} + + + "; + } + + /// + /// + /// + /// + /// + protected virtual void sendAsTextMail_Click(object sender, EventArgs e) + { + //Double-check + if (IsOutlookInstalled()) + { + Outlook.Application outlook = new Outlook.Application(); + Outlook.MailItem message = (Outlook.MailItem)outlook.CreateItem(Outlook.OlItemType.olMailItem); + // + message.Subject = this.FileInfo.FileName; + message.BodyFormat = Outlook.OlBodyFormat.olFormatPlain; + message.Body = RawText; + message.Display(); + } + } + + /// + /// + /// + /// + /// + protected virtual void sendAsHTMLMail_Click(object sender, EventArgs e) + { + //Double-check + if (IsOutlookInstalled()) + { + Outlook.Application outlook = new Outlook.Application(); + Outlook.MailItem message = (Outlook.MailItem)outlook.CreateItem(Outlook.OlItemType.olMailItem); + // + message.Subject = this.FileInfo.FileName; + message.BodyFormat = Outlook.OlBodyFormat.olFormatHTML; + message.HTMLBody = BuildHtml(ConvertedText, this.FileInfo.FileName); + message.Display(true); + } + } + + /// + /// + /// + /// + /// + protected virtual void exportAsHTMLMenuItem_Click(object sender, EventArgs e) + { + //Save! + SaveFileDialog saveFileDialog = new SaveFileDialog(); + //Default name of the file is the editor file name + saveFileDialog.FileName = Path.GetFileNameWithoutExtension(this.FileInfo.FileName) + ".html"; + //The current path + saveFileDialog.InitialDirectory = this.markdownViewer.Notepad.GetCurrentDirectory(); + // + saveFileDialog.Filter = "HTML files (*.html)|*.html|All files (*.*)|*.*"; + // + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + using (StreamWriter sw = new StreamWriter(saveFileDialog.FileName)) + { + string html = BuildHtml(ConvertedText, this.FileInfo.FileName); + try + { + html = XDocument.Parse(html).ToString(); + } + catch { } + sw.WriteLine(html); + } + //Open if requested + if (this.markdownViewer.Options.htmlOpenExport) + { + Process.Start(saveFileDialog.FileName); + } + } + } + + /// + /// + /// + /// + /// + protected virtual void exportAsPDFMenuItem_Click(object sender, EventArgs e) + { + //Save! + SaveFileDialog saveFileDialog = new SaveFileDialog(); + //Default name of the file is the editor file name + saveFileDialog.FileName = Path.GetFileNameWithoutExtension(this.FileInfo.FileName) + ".pdf"; + //The current path + saveFileDialog.InitialDirectory = this.markdownViewer.Notepad.GetCurrentDirectory(); + // + saveFileDialog.Filter = "PDF files (*.pdf)|*.pdf|All files (*.*)|*.*"; + // + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + //Build a config based on made settings + PdfGenerateConfig pdfConfig = new PdfGenerateConfig(); + pdfConfig.PageOrientation = this.markdownViewer.Options.pdfOrientation; + pdfConfig.PageSize = this.markdownViewer.Options.pdfPageSize; + //Set margins + int[] margins = this.markdownViewer.Options.GetMargins(); + pdfConfig.MarginLeft = MilimiterToPoint(margins[0]); + pdfConfig.MarginTop = MilimiterToPoint(margins[1]); + pdfConfig.MarginRight = MilimiterToPoint(margins[2]); + pdfConfig.MarginBottom = MilimiterToPoint(margins[3]); + //Generate PDF and save + PdfDocument pdf = PdfGenerator.GeneratePdf(BuildHtml(ConvertedText, this.FileInfo.FileName), pdfConfig, PdfGenerator.ParseStyleSheet(this.getCSS())); + pdf.Save(saveFileDialog.FileName); + + //Open if requested + if (this.markdownViewer.Options.pdfOpenExport) + { + Process.Start(saveFileDialog.FileName); + } + } + } + + /// + /// + /// + /// + /// + protected virtual void sendToPrinter_Click(object sender, EventArgs e) + { + // + WebBrowser webBrowser = new WebBrowser(); + webBrowser.Parent = this; + webBrowser.DocumentCompleted += (browser, webBrowserEvent) => + { + ((WebBrowser)browser).Size = webBrowser.MaximumSize; + ((WebBrowser)browser).ShowPrintPreviewDialog(); + }; + webBrowser.DocumentText = BuildHtml(ConvertedText, this.FileInfo.FileName); + } + + /// + /// + /// + /// + /// + protected void sendToClipboard_Click(object sender, EventArgs e) + { + ClipboardHelper.CopyToClipboard(BuildHtml(ConvertedText, this.FileInfo.FileName), ConvertedText); + } + + /// + /// + /// + /// + protected virtual String getCSS() + { + string cssImportStatements = ""; + + //Get all @import statements from the custom CSS + List matches = Regex.Matches(this.markdownViewer.Options.HtmlCssStyle, this.patternCSSImportStatements).Cast().ToList(); + matches.ForEach(match => match.Captures.Cast().ToList().ForEach(capture => cssImportStatements += capture.Value + Environment.NewLine)); + + //Return a CSS with the @import statements in front, the base MarkdownViewer++ CSS and the rest of the custom CSS from the user + return cssImportStatements + Environment.NewLine + Resources.MarkdownViewerHTML + Environment.NewLine + Regex.Replace(this.markdownViewer.Options.HtmlCssStyle, this.patternCSSImportStatements, "").Trim(); + } + + /// + /// + /// + /// + /// + protected int MilimiterToPoint(int mm) + { + return (int)(mm * 2.834646); + } + + /// + /// + /// + /// + public bool IsOutlookInstalled() + { + try + { + if (Type.GetTypeFromProgID("Outlook.Application") != null) + { + return true; + } + } + catch { } + + return false; + } + + /// + /// + /// + /// + /// + private void optionsToolStripMenuItem_Click(object sender, EventArgs e) + { + this.markdownViewer.OptionsCommand(); + } + + /// + /// + /// + /// + /// + private void aboutToolStripMenuItem1_Click(object sender, EventArgs e) + { + this.markdownViewer.AboutCommand(); + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.resx b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.resx new file mode 100644 index 000000000000..a8229b45ae73 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/AbstractRenderer.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerHtmlPanel.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerHtmlPanel.cs new file mode 100644 index 000000000000..3169a0ab556c --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerHtmlPanel.cs @@ -0,0 +1,67 @@ +using TheArtOfDev.HtmlRenderer.WinForms; + +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + /// + /// + /// + public class MarkdownViewerHtmlPanel : HtmlPanel + { + /// + /// + /// + public MarkdownViewerHtmlPanel() + { + this.AllowDrop = false; + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.IsContextMenuEnabled = false; + this.Location = new System.Drawing.Point(0, 24); + this.MinimumSize = new System.Drawing.Size(20, 20); + this.Name = "markdownViewerHtmlPanel"; + this.Size = new System.Drawing.Size(284, 237); + this.TabIndex = 0; + this.AvoidImagesLateLoading = false; + } + + /// + /// + /// + public override string Text { + get { return _text; } + set { + _text = value; + if (!IsDisposed) + { + _htmlContainer.SetHtml(_text, _baseCssData); + Redraw(); + } + } + } + + /// + /// Scroll by the given ratio, calculated with max and page + /// + /// + public void ScrollByRatioVertically(double scrollRatio) + { + if (!IsDisposed) + { + VerticalScroll.Value = (int)((VerticalScroll.Maximum - VerticalScroll.LargeChange) * scrollRatio); + Redraw(); + } + } + + /// + /// + /// + protected void Redraw() + { + PerformLayout(); + Invalidate(); + InvokeMouseMove(); + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.Designer.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.Designer.cs new file mode 100644 index 000000000000..9ba13a311afa --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.Designer.cs @@ -0,0 +1,159 @@ +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + partial class MarkdownViewerOptions + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + // + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("General"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("HTML", 1, 1); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("PDF", 2, 2); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MarkdownViewerOptions)); + this.btnOptionsSave = new System.Windows.Forms.Button(); + this.btnOptionsCancel = new System.Windows.Forms.Button(); + this.splitOptions = new System.Windows.Forms.SplitContainer(); + this.treeOptions = new System.Windows.Forms.TreeView(); + this.imgOptions = new System.Windows.Forms.ImageList(this.components); + ((System.ComponentModel.ISupportInitialize)(this.splitOptions)).BeginInit(); + this.splitOptions.Panel1.SuspendLayout(); + this.splitOptions.SuspendLayout(); + this.SuspendLayout(); + // + // btnOptionsSave + // + this.btnOptionsSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnOptionsSave.Location = new System.Drawing.Point(455, 312); + this.btnOptionsSave.Name = "btnOptionsSave"; + this.btnOptionsSave.Size = new System.Drawing.Size(75, 23); + this.btnOptionsSave.TabIndex = 0; + this.btnOptionsSave.Text = "Save"; + this.btnOptionsSave.UseVisualStyleBackColor = true; + this.btnOptionsSave.Click += new System.EventHandler(this.btnOptionsSave_Click); + // + // btnOptionsCancel + // + this.btnOptionsCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnOptionsCancel.CausesValidation = false; + this.btnOptionsCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnOptionsCancel.Location = new System.Drawing.Point(374, 312); + this.btnOptionsCancel.Name = "btnOptionsCancel"; + this.btnOptionsCancel.Size = new System.Drawing.Size(75, 23); + this.btnOptionsCancel.TabIndex = 1; + this.btnOptionsCancel.Text = "Cancel"; + this.btnOptionsCancel.UseVisualStyleBackColor = true; + this.btnOptionsCancel.Click += new System.EventHandler(this.btnOptionsCancel_Click); + // + // splitOptions + // + this.splitOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.splitOptions.Location = new System.Drawing.Point(0, 0); + this.splitOptions.Margin = new System.Windows.Forms.Padding(10); + this.splitOptions.Name = "splitOptions"; + // + // splitOptions.Panel1 + // + this.splitOptions.Panel1.Controls.Add(this.treeOptions); + this.splitOptions.Size = new System.Drawing.Size(530, 306); + this.splitOptions.SplitterDistance = 135; + this.splitOptions.TabIndex = 2; + // + // treeOptions + // + this.treeOptions.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeOptions.FullRowSelect = true; + this.treeOptions.HideSelection = false; + this.treeOptions.ImageIndex = 0; + this.treeOptions.ImageList = this.imgOptions; + this.treeOptions.Location = new System.Drawing.Point(0, 0); + this.treeOptions.Name = "treeOptions"; + treeNode1.Checked = true; + treeNode1.Name = "nodeGeneral"; + treeNode1.Tag = "OptionsPanelGeneral"; + treeNode1.Text = "General"; + treeNode2.ImageIndex = 1; + treeNode2.Name = "nodeHTML"; + treeNode2.SelectedImageIndex = 1; + treeNode2.Tag = "OptionsPanelHTML"; + treeNode2.Text = "HTML"; + treeNode3.ImageIndex = 2; + treeNode3.Name = "nodePDF"; + treeNode3.SelectedImageIndex = 2; + treeNode3.Tag = "OptionsPanelPDF"; + treeNode3.Text = "PDF"; + this.treeOptions.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode2, + treeNode3}); + this.treeOptions.SelectedImageIndex = 0; + this.treeOptions.Size = new System.Drawing.Size(135, 306); + this.treeOptions.TabIndex = 0; + // + // imgOptions + // + this.imgOptions.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgOptions.ImageStream"))); + this.imgOptions.TransparentColor = System.Drawing.Color.Transparent; + this.imgOptions.Images.SetKeyName(0, "markdown-16x16-solid.png"); + this.imgOptions.Images.SetKeyName(1, "fa-html5-16x16.png"); + this.imgOptions.Images.SetKeyName(2, "fa-file-pdf-o-16x16.png"); + // + // MarkdownViewerOptions + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnOptionsCancel; + this.ClientSize = new System.Drawing.Size(534, 341); + this.Controls.Add(this.splitOptions); + this.Controls.Add(this.btnOptionsCancel); + this.Controls.Add(this.btnOptionsSave); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(550, 380); + this.Name = "MarkdownViewerOptions"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Options - MarkdownViewer++"; + this.splitOptions.Panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitOptions)).EndInit(); + this.splitOptions.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button btnOptionsSave; + private System.Windows.Forms.Button btnOptionsCancel; + private System.Windows.Forms.SplitContainer splitOptions; + private System.Windows.Forms.TreeView treeOptions; + private System.Windows.Forms.ImageList imgOptions; + } +} \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.cs new file mode 100644 index 000000000000..b284e0e0a9fa --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using static com.insanitydesign.MarkdownViewerPlusPlus.MarkdownViewerConfiguration; + +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + /// + /// + /// + public partial class MarkdownViewerOptions : Form + { + /// + /// + /// + protected MarkdownViewerConfiguration configuration; + + /// + /// + /// + protected Dictionary optionPanels = new Dictionary(); + + /// + /// + /// + /// + protected delegate void SaveHandler(ref Options options); + + /// + /// + /// + protected SaveHandler SaveEvent; + + /// + /// + /// + /// + protected delegate void LoadHandler(Options options); + + /// + /// + /// + protected LoadHandler LoadEvent; + + /// + /// + /// + public MarkdownViewerOptions(ref MarkdownViewerConfiguration configuration) + { + // + this.configuration = configuration; + // + InitializeComponent(); + //Iterate over all menu items and register their classes + string thisNamespace = typeof(MarkdownViewerOptions).Namespace; + foreach (TreeNode node in this.treeOptions.Nodes) + { + AbstractOptionsPanel optionsPanel = (AbstractOptionsPanel)Activator.CreateInstance(Type.GetType(thisNamespace + "." + node.Tag.ToString())); + this.SaveEvent += optionsPanel.SaveOptions; + this.LoadEvent += optionsPanel.LoadOptions; + //Add to map to store for changes + this.optionPanels.Add(node.Tag.ToString(), optionsPanel); + } + // + this.treeOptions.AfterSelect += treeOptions_AfterSelect; + //Start with the general options panel + this.splitOptions.Panel2.Controls.Add(this.optionPanels.First().Value); + this.treeOptions.Select(); + //Set the according dialog result to their respective buttons + this.btnOptionsCancel.DialogResult = DialogResult.Cancel; + this.btnOptionsSave.DialogResult = DialogResult.OK; + // + this.LoadEvent(this.configuration.options); + } + + /// + /// + /// + /// + /// + protected void treeOptions_AfterSelect(object sender, TreeViewEventArgs treeNodeEvent) + { + //Remove old (if any) + if (this.splitOptions.Panel2.Controls.Count > 0) + { + this.splitOptions.Panel2.Controls.RemoveAt(0); + } + //Add selected options panel + AbstractOptionsPanel optionPanel = this.optionPanels.Where(entry => entry.Key == treeNodeEvent.Node.Tag.ToString()).First().Value; + this.splitOptions.Panel2.Controls.Add(optionPanel); + } + + /// + /// + /// + /// + /// + private void btnOptionsCancel_Click(object sender, System.EventArgs e) + { + this.Dispose(); + } + + /// + /// + /// + /// + /// + private void btnOptionsSave_Click(object sender, System.EventArgs e) + { + //Fire the save event for all listeners + this.SaveEvent(ref this.configuration.options); + //Save to init + this.configuration.Save(); + //Close the options dialog when all has been done + this.Dispose(); + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.resx b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.resx new file mode 100644 index 000000000000..5ed7e64afb98 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerOptions.resx @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADm + CQAAAk1TRnQBSQFMAgEBAwEAAUABAAFAAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/xUAAf8B9ALvAfMB/wgA + C/8kAAH/AfABbQYAARIBvAH/BAABbQsAAW0jAAHtCgABFAUAAf8JAAH/EwAB6g4AAeoBAAHqAgABEwG8 + AvQBvAETCAAB/wHyAfQHAAH/JAABDwEAAfMGAAH0AgAB/wQAAv8B7wH/BgAB/xUAAW0B7wMAAe8BbQIA + ARIBDgMAAf8CAAH/AQAB8gHtAewB8QEAAf8CAAH/BAAB/wIAAfAB9AP/AfEB8AH/FQAB7wIAARICAAHv + AQABEgH/AfADAAH/AgAB/wUAAv8CAAH/BAAB/wIAAf8B8wH/AW0BBwHwAfQB/xUAAe8BAAFtAf8BbQEA + Ae8BFQH/AgABBwIAAf8CAAYSAf8DAAH0BAAB/wMAAbwB8wH0AwAB/xUAAe8BAAH/AfMB/wEAAe8DAAHv + AwAB/wIAAf8HAAEVAQAB8wQAAf8DAAH0AQcEAAH/FQAB7wEAAfIBAAHyAQAB7wMAAe8DAAH0AQABEAgA + AesBAAHxBAAB/wMAAf8B9AQAAf8VAAFtAe8BEQEAAREB7wFtAgAB7wFtAwAB8gEAAW0BAAH/CAABvAQA + Af8DAAH0Af8CAAP/IwAB8AEAAZIBAAH/BusBEQEAAe8EAAH/AwAB9AH/AQABFQMAARASAAFtDgABbQEH + AQABBwgAAfEBAAHsBAAB/wUAAf8DAAHyAfAiAAGSAQABDggQAQ4BAAEUBAAB/wUAAf8CAAHyAQcjAAFt + EQAH/wEAAfIBByQAARANAAH/AgAB7AcAARAB8BUAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEB + BQABgBcAA/8BAAL/AfABPwHAAQcCAAL/AYABBwGAAQMCAAL/AYABBwGfAfMEAAGAAQcBhwHzBAABjwHD + AYMB8wQAAQgBQwGYAQMCAAERAQABCAEDAZgBAwIAAREBGAEAASMBnAFzAgABEQEQAQ8B4wGcAfMCAAER + ARABHwHjAZwB8wQAARABAwGcAcMEAAEQAQMBnAGDBAABHwHjAZ8BMwIAAv8BAAEDAZ8BJwIAAv8BAAED + AYABDwIAAv8BAAEBAYABHwIACw== + + + \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerRenderer.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerRenderer.cs new file mode 100644 index 000000000000..703376413ba9 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/MarkdownViewerRenderer.cs @@ -0,0 +1,191 @@ +using System; +using System.IO; +using Svg; +using System.Drawing; +using System.Drawing.Imaging; +using System.Net; +using System.Threading; +using TheArtOfDev.HtmlRenderer.Core.Entities; +using static com.insanitydesign.MarkdownViewerPlusPlus.MarkdownViewer; + +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + /// + /// + /// + public class MarkdownViewerRenderer : AbstractRenderer + { + /// + /// + /// + public MarkdownViewerHtmlPanel markdownViewerHtmlPanel; + + /// + /// + /// + /// + public MarkdownViewerRenderer(MarkdownViewer markdownViewer) : base(markdownViewer) + { + } + + /// + /// + /// + protected override void Init() + { + base.Init(); + // + this.markdownViewerHtmlPanel = new MarkdownViewerHtmlPanel(); + //Add a custom image loader + this.markdownViewerHtmlPanel.ImageLoad += OnImageLoad; + //Add to view + this.Controls.Add(this.markdownViewerHtmlPanel); + this.Controls.SetChildIndex(this.markdownViewerHtmlPanel, 0); + } + + /// + /// + /// + /// + /// + public override void Render(string text, FileInformation fileInfo) + { + base.Render(text, fileInfo); + this.markdownViewerHtmlPanel.Text = BuildHtml(ConvertedText, fileInfo.FileName); + } + + /// + /// Scroll the rendered panel vertically based on the given ration + /// taken from Notepad++ + /// + /// + public override void ScrollByRatioVertically(double scrollRatio) + { + this.markdownViewerHtmlPanel.ScrollByRatioVertically(scrollRatio); + } + + /// + /// Custom renderer for SVG images in the markdown as not supported natively. + /// @see https://htmlrenderer.codeplex.com/wikipage?title=Rendering%20SVG%20images + /// + /// + /// + protected void OnImageLoad(object sender, HtmlImageLoadEventArgs imageLoadEvent) + { + try + { + //Get some file information + string src = imageLoadEvent.Src; + Uri uri = new Uri(src); + string extension = Path.GetExtension(src); + + //Check if local file or web resource + switch (uri.Scheme.ToLowerInvariant()) + { + case "file": + //In case of a local file -> Try to load it directly + imageLoadEvent.Handled = true; //Tell the event it was handled, so no error border is drawn + ThreadPool.QueueUserWorkItem(state => LoadImageFromFile(src, imageLoadEvent)); + break; + case "http": + case "https": + //For web resources check extension and parameter, to fetch from e.g. "badge" creating sources + if ((extension != null && extension.Equals(".svg", StringComparison.OrdinalIgnoreCase)) + || uri.ToString().Contains("svg=")) + { + //In case of a web resource file -> Load async + using (WebClient webClient = new WebClient()) + { + imageLoadEvent.Handled = true; //Tell the event it was handled, so no error border is drawn + webClient.DownloadDataCompleted += (downloadSender, downloadEvent) => { OnDownloadDataCompleted(downloadEvent, imageLoadEvent); }; + webClient.DownloadDataAsync(uri); + } + } + break; + } + + } + catch + { + } + } + + /// + /// + /// + /// + /// + protected void LoadImageFromFile(string src, HtmlImageLoadEventArgs imageLoadEvent) + { + try + { + Uri uri = new Uri(src); + //Try to load the file as Image from file + //Remove the scheme first + string srcWithoutScheme = src; + int i = srcWithoutScheme.IndexOf(':'); + if (i > 0) srcWithoutScheme = srcWithoutScheme.Substring(i + 1).TrimStart('/'); + //If not absolute, add the current file path + if (!Path.IsPathRooted(srcWithoutScheme)) + { + uri = new Uri(@"file:///" + this.FileInfo.FileDirectory + "/" + srcWithoutScheme); + } + + //For SVG images: Convert to Bitmap + string extension = Path.GetExtension(src); + if (extension != null && extension.Equals(".svg", StringComparison.OrdinalIgnoreCase)) + { + ConvertSvgToBitmap(SvgDocument.Open(uri.LocalPath), imageLoadEvent); + } + else + { + //Load uri, 8, 1 + imageLoadEvent.Callback((Bitmap)Image.FromFile(uri.LocalPath, true)); + } + } + catch { } //Not able to handle, refer back to orginal process + } + + /// + /// + /// + /// + /// + protected Bitmap ConvertSvgToBitmap(SvgDocument svgDocument, HtmlImageLoadEventArgs imageLoadEvent) + { + Bitmap svgImage = new Bitmap((int)svgDocument.Width, (int)svgDocument.Height, PixelFormat.Format32bppArgb); + svgDocument.Draw(svgImage); + imageLoadEvent.Callback(svgImage); + imageLoadEvent.Handled = true; + return svgImage; + } + + /// + /// + /// + /// + /// + protected void OnDownloadDataCompleted(DownloadDataCompletedEventArgs downloadEvent, HtmlImageLoadEventArgs imageLoadEvent) + { + using (MemoryStream stream = new MemoryStream(downloadEvent.Result)) + { + ConvertSvgToBitmap(SvgDocument.Open(stream), imageLoadEvent); + } + } + + /// + /// Release the custom loader + /// + protected override void Dispose(bool disposing) + { + if (this.markdownViewerHtmlPanel != null) + { + this.markdownViewerHtmlPanel.ImageLoad -= OnImageLoad; + } + base.Dispose(disposing); + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.Designer.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.Designer.cs new file mode 100644 index 000000000000..cc729ff43c89 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.Designer.cs @@ -0,0 +1,112 @@ +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + partial class OptionsPanelGeneral + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + protected override void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.lblFileExtensions = new System.Windows.Forms.Label(); + this.chkBoxNewFiles = new System.Windows.Forms.CheckBox(); + this.toolTipFileExtensions = new System.Windows.Forms.ToolTip(this.components); + this.grpBoxFiles = new System.Windows.Forms.GroupBox(); + this.txtFileExtensions = new System.Windows.Forms.TextBox(); + this.grpBoxFiles.SuspendLayout(); + this.SuspendLayout(); + // + // lblFileExtensions + // + this.lblFileExtensions.AutoSize = true; + this.lblFileExtensions.Location = new System.Drawing.Point(6, 16); + this.lblFileExtensions.Name = "lblFileExtensions"; + this.lblFileExtensions.Size = new System.Drawing.Size(76, 13); + this.lblFileExtensions.TabIndex = 0; + this.lblFileExtensions.Text = "File extensions"; + // + // chkBoxNewFiles + // + this.chkBoxNewFiles.AutoSize = true; + this.chkBoxNewFiles.Location = new System.Drawing.Point(9, 62); + this.chkBoxNewFiles.Name = "chkBoxNewFiles"; + this.chkBoxNewFiles.Size = new System.Drawing.Size(111, 17); + this.chkBoxNewFiles.TabIndex = 2; + this.chkBoxNewFiles.Text = "Include new files?"; + this.chkBoxNewFiles.UseVisualStyleBackColor = true; + // + // toolTipFileExtensions + // + this.toolTipFileExtensions.AutomaticDelay = 0; + this.toolTipFileExtensions.IsBalloon = true; + this.toolTipFileExtensions.ShowAlways = true; + this.toolTipFileExtensions.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; + this.toolTipFileExtensions.ToolTipTitle = "File extensions"; + // + // grpBoxFiles + // + this.grpBoxFiles.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.grpBoxFiles.Controls.Add(this.lblFileExtensions); + this.grpBoxFiles.Controls.Add(this.chkBoxNewFiles); + this.grpBoxFiles.Controls.Add(this.txtFileExtensions); + this.grpBoxFiles.Dock = System.Windows.Forms.DockStyle.Top; + this.grpBoxFiles.Location = new System.Drawing.Point(0, 0); + this.grpBoxFiles.Name = "grpBoxFiles"; + this.grpBoxFiles.Size = new System.Drawing.Size(1255, 86); + this.grpBoxFiles.TabIndex = 3; + this.grpBoxFiles.TabStop = false; + this.grpBoxFiles.Text = "Files"; + // + // txtFileExtensions + // + this.txtFileExtensions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtFileExtensions.Location = new System.Drawing.Point(9, 36); + this.txtFileExtensions.Name = "txtFileExtensions"; + this.txtFileExtensions.Size = new System.Drawing.Size(1240, 20); + this.txtFileExtensions.TabIndex = 1; + // + // OptionsPanelGeneral + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.Controls.Add(this.grpBoxFiles); + this.Name = "OptionsPanelGeneral"; + this.Size = new System.Drawing.Size(1255, 626); + this.grpBoxFiles.ResumeLayout(false); + this.grpBoxFiles.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lblFileExtensions; + private System.Windows.Forms.CheckBox chkBoxNewFiles; + private System.Windows.Forms.ToolTip toolTipFileExtensions; + private System.Windows.Forms.GroupBox grpBoxFiles; + private System.Windows.Forms.TextBox txtFileExtensions; + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.cs new file mode 100644 index 000000000000..d531b9ec11d0 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.cs @@ -0,0 +1,95 @@ +using System; +using System.ComponentModel; +using System.Text.RegularExpressions; +using System.Windows; +using static com.insanitydesign.MarkdownViewerPlusPlus.MarkdownViewerConfiguration; + +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + /// + /// + /// + public partial class OptionsPanelGeneral : AbstractOptionsPanel + { + /// + /// + /// + protected string msgFileExtensions = "Add a list of comma-separated file extensions (e.g. \'log,txt,html\'). Empty the box for \'All files\'."; + + /// + /// + /// + protected string regExFileExtensions = "^([a-zA-Z,]*)$"; + + /// + /// + /// + public OptionsPanelGeneral() + { + // + this.txtFileExtensions.Enter += txtFileExtensions_Enter; + this.txtFileExtensions.Leave += txtFileExtensions_Leave; + this.txtFileExtensions.Validating += txtFileExtensions_Validating; + } + + /// + /// Validate that the file extensions field has a correct value + /// + /// + /// + protected void txtFileExtensions_Validating(object sender, CancelEventArgs e) + { + if (!Regex.IsMatch(this.txtFileExtensions.Text, this.regExFileExtensions, RegexOptions.IgnoreCase)) + { + MessageBox.Show(string.Format("Please check \'{0}\'\r\n" + this.msgFileExtensions, this.lblFileExtensions.Text), "Warning!", MessageBoxButton.OK, MessageBoxImage.Error); + e.Cancel = true; + } + else + { + e.Cancel = false; + } + } + + /// + /// + /// + /// + /// + private void txtFileExtensions_Enter(object sender, EventArgs e) + { + this.toolTipFileExtensions.Show(this.msgFileExtensions, this.txtFileExtensions, this.lblFileExtensions.Width, -75); + } + + /// + /// + /// + /// + /// + private void txtFileExtensions_Leave(object sender, EventArgs e) + { + this.toolTipFileExtensions.Hide(this.txtFileExtensions); + + } + + /// + /// + /// + public override void SaveOptions(ref Options options) + { + options.inclNewFiles = this.chkBoxNewFiles.Checked; + options.fileExtensions = this.txtFileExtensions.Text; + } + + /// + /// + /// + public override void LoadOptions(Options options) + { + this.chkBoxNewFiles.Checked = options.inclNewFiles; + this.txtFileExtensions.Text = options.fileExtensions; + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.resx b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.resx new file mode 100644 index 000000000000..0bc61938ee62 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelGeneral.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.Designer.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.Designer.cs new file mode 100644 index 000000000000..fb51231dccf2 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.Designer.cs @@ -0,0 +1,101 @@ +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + partial class OptionsPanelHTML + { + /// + /// + /// + private System.Windows.Forms.GroupBox grpStyles; + + /// + /// + /// + protected override void InitializeComponent() + { + this.grpStyles = new System.Windows.Forms.GroupBox(); + this.lblCssStyles = new System.Windows.Forms.Label(); + this.txtCssStyles = new System.Windows.Forms.TextBox(); + this.grpHTMLExport = new System.Windows.Forms.GroupBox(); + this.chkOpenHTMLExport = new System.Windows.Forms.CheckBox(); + this.grpStyles.SuspendLayout(); + this.grpHTMLExport.SuspendLayout(); + this.SuspendLayout(); + // + // grpStyles + // + this.grpStyles.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.grpStyles.Controls.Add(this.lblCssStyles); + this.grpStyles.Controls.Add(this.txtCssStyles); + this.grpStyles.Dock = System.Windows.Forms.DockStyle.Top; + this.grpStyles.Location = new System.Drawing.Point(0, 0); + this.grpStyles.Name = "grpStyles"; + this.grpStyles.Size = new System.Drawing.Size(1255, 169); + this.grpStyles.TabIndex = 0; + this.grpStyles.TabStop = false; + this.grpStyles.Text = "Styles"; + // + // lblCssStyles + // + this.lblCssStyles.AutoSize = true; + this.lblCssStyles.Location = new System.Drawing.Point(7, 20); + this.lblCssStyles.Name = "lblCssStyles"; + this.lblCssStyles.Size = new System.Drawing.Size(66, 13); + this.lblCssStyles.TabIndex = 1; + this.lblCssStyles.Text = "Custom CSS"; + // + // txtCssStyles + // + this.txtCssStyles.AcceptsReturn = true; + this.txtCssStyles.AcceptsTab = true; + this.txtCssStyles.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtCssStyles.Location = new System.Drawing.Point(10, 39); + this.txtCssStyles.Multiline = true; + this.txtCssStyles.Name = "txtCssStyles"; + this.txtCssStyles.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.txtCssStyles.Size = new System.Drawing.Size(1239, 124); + this.txtCssStyles.TabIndex = 0; + // + // grpHTMLExport + // + this.grpHTMLExport.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.grpHTMLExport.Controls.Add(this.chkOpenHTMLExport); + this.grpHTMLExport.Dock = System.Windows.Forms.DockStyle.Top; + this.grpHTMLExport.Location = new System.Drawing.Point(0, 169); + this.grpHTMLExport.Name = "grpHTMLExport"; + this.grpHTMLExport.Size = new System.Drawing.Size(1255, 50); + this.grpHTMLExport.TabIndex = 1; + this.grpHTMLExport.TabStop = false; + this.grpHTMLExport.Text = "Export"; + // + // chkOpenHTMLExport + // + this.chkOpenHTMLExport.AutoSize = true; + this.chkOpenHTMLExport.Location = new System.Drawing.Point(10, 20); + this.chkOpenHTMLExport.Name = "chkOpenHTMLExport"; + this.chkOpenHTMLExport.Size = new System.Drawing.Size(141, 17); + this.chkOpenHTMLExport.TabIndex = 0; + this.chkOpenHTMLExport.Text = "Open HTML after export"; + this.chkOpenHTMLExport.UseVisualStyleBackColor = true; + // + // OptionsPanelHTML + // + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.Controls.Add(this.grpHTMLExport); + this.Controls.Add(this.grpStyles); + this.Name = "OptionsPanelHTML"; + this.Size = new System.Drawing.Size(1255, 709); + this.grpStyles.ResumeLayout(false); + this.grpStyles.PerformLayout(); + this.grpHTMLExport.ResumeLayout(false); + this.grpHTMLExport.PerformLayout(); + this.ResumeLayout(false); + + } + + private System.Windows.Forms.Label lblCssStyles; + private System.Windows.Forms.TextBox txtCssStyles; + private System.Windows.Forms.GroupBox grpHTMLExport; + private System.Windows.Forms.CheckBox chkOpenHTMLExport; + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.cs new file mode 100644 index 000000000000..718a2a969dd9 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.cs @@ -0,0 +1,32 @@ +using static com.insanitydesign.MarkdownViewerPlusPlus.MarkdownViewerConfiguration; +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + /// + /// + /// + public partial class OptionsPanelHTML : AbstractOptionsPanel + { + /// + /// + /// + /// + public override void LoadOptions(Options options) + { + this.txtCssStyles.Text = options.HtmlCssStyle; + this.chkOpenHTMLExport.Checked = options.htmlOpenExport; + } + + /// + /// + /// + /// + public override void SaveOptions(ref Options options) + { + options.HtmlCssStyle = this.txtCssStyles.Text; + options.htmlOpenExport = this.chkOpenHTMLExport.Checked; + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.resx b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.resx new file mode 100644 index 000000000000..1af7de150c99 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelHTML.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.Designer.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.Designer.cs new file mode 100644 index 000000000000..fc6b5ea97fc9 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.Designer.cs @@ -0,0 +1,253 @@ +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + partial class OptionsPanelPDF + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + protected override void InitializeComponent() + { + this.grpPDFExport = new System.Windows.Forms.GroupBox(); + this.numMarginLeft = new System.Windows.Forms.NumericUpDown(); + this.numMarginRight = new System.Windows.Forms.NumericUpDown(); + this.numMarginBottom = new System.Windows.Forms.NumericUpDown(); + this.numMarginTop = new System.Windows.Forms.NumericUpDown(); + this.lblMMBottom = new System.Windows.Forms.Label(); + this.lblMMRight = new System.Windows.Forms.Label(); + this.lblMMLeft = new System.Windows.Forms.Label(); + this.lblMMTop = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.cmbPDFPageSize = new System.Windows.Forms.ComboBox(); + this.lblPDFPageSize = new System.Windows.Forms.Label(); + this.cmbPDFOrientation = new System.Windows.Forms.ComboBox(); + this.lblPDFOrientation = new System.Windows.Forms.Label(); + this.chkOpenPDFExport = new System.Windows.Forms.CheckBox(); + this.grpPDFExport.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numMarginLeft)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numMarginRight)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numMarginBottom)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numMarginTop)).BeginInit(); + this.SuspendLayout(); + // + // grpPDFExport + // + this.grpPDFExport.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.grpPDFExport.Controls.Add(this.chkOpenPDFExport); + this.grpPDFExport.Controls.Add(this.numMarginLeft); + this.grpPDFExport.Controls.Add(this.numMarginRight); + this.grpPDFExport.Controls.Add(this.numMarginBottom); + this.grpPDFExport.Controls.Add(this.numMarginTop); + this.grpPDFExport.Controls.Add(this.lblMMBottom); + this.grpPDFExport.Controls.Add(this.lblMMRight); + this.grpPDFExport.Controls.Add(this.lblMMLeft); + this.grpPDFExport.Controls.Add(this.lblMMTop); + this.grpPDFExport.Controls.Add(this.label1); + this.grpPDFExport.Controls.Add(this.cmbPDFPageSize); + this.grpPDFExport.Controls.Add(this.lblPDFPageSize); + this.grpPDFExport.Controls.Add(this.cmbPDFOrientation); + this.grpPDFExport.Controls.Add(this.lblPDFOrientation); + this.grpPDFExport.Dock = System.Windows.Forms.DockStyle.Top; + this.grpPDFExport.Location = new System.Drawing.Point(0, 0); + this.grpPDFExport.Name = "grpPDFExport"; + this.grpPDFExport.Size = new System.Drawing.Size(1255, 235); + this.grpPDFExport.TabIndex = 0; + this.grpPDFExport.TabStop = false; + this.grpPDFExport.Text = "Export"; + // + // numMarginLeft + // + this.numMarginLeft.Location = new System.Drawing.Point(10, 150); + this.numMarginLeft.Maximum = new decimal(new int[] { + 999, + 0, + 0, + 0}); + this.numMarginLeft.Name = "numMarginLeft"; + this.numMarginLeft.Size = new System.Drawing.Size(51, 20); + this.numMarginLeft.TabIndex = 19; + // + // numMarginRight + // + this.numMarginRight.Location = new System.Drawing.Point(190, 150); + this.numMarginRight.Maximum = new decimal(new int[] { + 999, + 0, + 0, + 0}); + this.numMarginRight.Name = "numMarginRight"; + this.numMarginRight.Size = new System.Drawing.Size(50, 20); + this.numMarginRight.TabIndex = 18; + // + // numMarginBottom + // + this.numMarginBottom.Location = new System.Drawing.Point(100, 175); + this.numMarginBottom.Maximum = new decimal(new int[] { + 999, + 0, + 0, + 0}); + this.numMarginBottom.Name = "numMarginBottom"; + this.numMarginBottom.Size = new System.Drawing.Size(50, 20); + this.numMarginBottom.TabIndex = 17; + // + // numMarginTop + // + this.numMarginTop.Location = new System.Drawing.Point(100, 125); + this.numMarginTop.Maximum = new decimal(new int[] { + 999, + 0, + 0, + 0}); + this.numMarginTop.Name = "numMarginTop"; + this.numMarginTop.Size = new System.Drawing.Size(50, 20); + this.numMarginTop.TabIndex = 16; + // + // lblMMBottom + // + this.lblMMBottom.AutoSize = true; + this.lblMMBottom.Location = new System.Drawing.Point(157, 181); + this.lblMMBottom.Name = "lblMMBottom"; + this.lblMMBottom.Size = new System.Drawing.Size(23, 13); + this.lblMMBottom.TabIndex = 15; + this.lblMMBottom.Text = "mm"; + // + // lblMMRight + // + this.lblMMRight.AutoSize = true; + this.lblMMRight.Location = new System.Drawing.Point(247, 156); + this.lblMMRight.Name = "lblMMRight"; + this.lblMMRight.Size = new System.Drawing.Size(23, 13); + this.lblMMRight.TabIndex = 14; + this.lblMMRight.Text = "mm"; + // + // lblMMLeft + // + this.lblMMLeft.AutoSize = true; + this.lblMMLeft.Location = new System.Drawing.Point(66, 157); + this.lblMMLeft.Name = "lblMMLeft"; + this.lblMMLeft.Size = new System.Drawing.Size(23, 13); + this.lblMMLeft.TabIndex = 13; + this.lblMMLeft.Text = "mm"; + // + // lblMMTop + // + this.lblMMTop.AutoSize = true; + this.lblMMTop.Location = new System.Drawing.Point(156, 132); + this.lblMMTop.Name = "lblMMTop"; + this.lblMMTop.Size = new System.Drawing.Size(23, 13); + this.lblMMTop.TabIndex = 12; + this.lblMMTop.Text = "mm"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(7, 110); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(44, 13); + this.label1.TabIndex = 7; + this.label1.Text = "Margins"; + // + // cmbPDFPageSize + // + this.cmbPDFPageSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbPDFPageSize.FormattingEnabled = true; + this.cmbPDFPageSize.Location = new System.Drawing.Point(10, 81); + this.cmbPDFPageSize.Name = "cmbPDFPageSize"; + this.cmbPDFPageSize.Size = new System.Drawing.Size(300, 21); + this.cmbPDFPageSize.TabIndex = 6; + // + // lblPDFPageSize + // + this.lblPDFPageSize.AutoSize = true; + this.lblPDFPageSize.Location = new System.Drawing.Point(7, 65); + this.lblPDFPageSize.Name = "lblPDFPageSize"; + this.lblPDFPageSize.Size = new System.Drawing.Size(53, 13); + this.lblPDFPageSize.TabIndex = 5; + this.lblPDFPageSize.Text = "Page size"; + // + // cmbPDFOrientation + // + this.cmbPDFOrientation.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbPDFOrientation.FormattingEnabled = true; + this.cmbPDFOrientation.Location = new System.Drawing.Point(10, 36); + this.cmbPDFOrientation.Name = "cmbPDFOrientation"; + this.cmbPDFOrientation.Size = new System.Drawing.Size(300, 21); + this.cmbPDFOrientation.TabIndex = 4; + // + // lblPDFOrientation + // + this.lblPDFOrientation.AutoSize = true; + this.lblPDFOrientation.Location = new System.Drawing.Point(7, 20); + this.lblPDFOrientation.Name = "lblPDFOrientation"; + this.lblPDFOrientation.Size = new System.Drawing.Size(58, 13); + this.lblPDFOrientation.TabIndex = 0; + this.lblPDFOrientation.Text = "Orientation"; + // + // chkOpenPDFExport + // + this.chkOpenPDFExport.AutoSize = true; + this.chkOpenPDFExport.Location = new System.Drawing.Point(10, 206); + this.chkOpenPDFExport.Name = "chkOpenPDFExport"; + this.chkOpenPDFExport.Size = new System.Drawing.Size(132, 17); + this.chkOpenPDFExport.TabIndex = 20; + this.chkOpenPDFExport.Text = "Open PDF after export"; + this.chkOpenPDFExport.UseVisualStyleBackColor = true; + // + // OptionsPanelPDF + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.Controls.Add(this.grpPDFExport); + this.Name = "OptionsPanelPDF"; + this.Size = new System.Drawing.Size(1255, 709); + this.grpPDFExport.ResumeLayout(false); + this.grpPDFExport.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numMarginLeft)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numMarginRight)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numMarginBottom)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numMarginTop)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grpPDFExport; + private System.Windows.Forms.Label lblPDFOrientation; + private System.Windows.Forms.ComboBox cmbPDFOrientation; + private System.Windows.Forms.ComboBox cmbPDFPageSize; + private System.Windows.Forms.Label lblPDFPageSize; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label lblMMBottom; + private System.Windows.Forms.Label lblMMRight; + private System.Windows.Forms.Label lblMMLeft; + private System.Windows.Forms.Label lblMMTop; + private System.Windows.Forms.NumericUpDown numMarginLeft; + private System.Windows.Forms.NumericUpDown numMarginRight; + private System.Windows.Forms.NumericUpDown numMarginBottom; + private System.Windows.Forms.NumericUpDown numMarginTop; + private System.Windows.Forms.CheckBox chkOpenPDFExport; + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.cs new file mode 100644 index 000000000000..c53ffd1f7969 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.cs @@ -0,0 +1,65 @@ +using PdfSharp; +using System; +using System.Linq; +using static com.insanitydesign.MarkdownViewerPlusPlus.MarkdownViewerConfiguration; + +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus.Forms +{ + /// + /// + /// + public partial class OptionsPanelPDF : AbstractOptionsPanel + { + /// + /// + /// + /// + public override void LoadOptions(Options options) + { + //Load options from enum + this.cmbPDFOrientation.Items.AddRange(Enum.GetNames(typeof(PageOrientation))); + //Set a default value + this.cmbPDFOrientation.SelectedItem = PageOrientation.Portrait.ToString(); + //Now load + this.cmbPDFOrientation.SelectedItem = options.pdfOrientation.ToString(); + // + this.cmbPDFPageSize.Items.AddRange(Enum.GetNames(typeof(PageSize))); + this.cmbPDFPageSize.Items.Remove(PageSize.Undefined.ToString()); + this.cmbPDFPageSize.SelectedItem = PageSize.A4.ToString(); + this.cmbPDFPageSize.SelectedItem = options.pdfPageSize.ToString(); + //Load margins + int[] margins = options.GetMargins(); + this.numMarginLeft.Value = margins[0]; + this.numMarginTop.Value = margins[1]; + this.numMarginRight.Value = margins[2]; + this.numMarginBottom.Value = margins[3]; + // + this.chkOpenPDFExport.Checked = options.pdfOpenExport; + } + + /// + /// + /// + /// + public override void SaveOptions(ref Options options) + { + PageOrientation pdfOrientation; + if (Enum.TryParse(this.cmbPDFOrientation.SelectedItem.ToString(), out pdfOrientation)) + { + options.pdfOrientation = pdfOrientation; + } + PageSize pdfPageSize; + if (Enum.TryParse(this.cmbPDFPageSize.SelectedItem.ToString(), out pdfPageSize)) + { + options.pdfPageSize = pdfPageSize; + } + //Save margins + options.margins = this.numMarginLeft.Value + "," + this.numMarginTop.Value + "," + this.numMarginRight.Value + "," + this.numMarginBottom.Value; + // + options.pdfOpenExport = this.chkOpenPDFExport.Checked; + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.resx b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.resx new file mode 100644 index 000000000000..1af7de150c99 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Forms/OptionsPanelPDF.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Helper/ClipboardHelper.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Helper/ClipboardHelper.cs new file mode 100644 index 000000000000..cfe241000e00 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Helper/ClipboardHelper.cs @@ -0,0 +1,228 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; + +namespace com.insanitydesign.MarkdownViewerPlusPlus.Helper +{ + /// + /// Helper to encode and set HTML fragment to clipboard.
+ /// See http://theartofdev.com/2014/06/12/setting-htmltext-to-clipboard-revisited/.
+ /// . + ///
+ /// + /// The MIT License (MIT) Copyright (c) 2014 Arthur Teplitzki. + /// + public static class ClipboardHelper + { + #region Fields and Consts + + /// + /// The string contains index references to other spots in the string, so we need placeholders so we can compute the offsets.
+ /// The _ strings are just placeholders. We'll back-patch them actual values afterwards.
+ /// The string layout () also ensures that it can't appear in the body of the html because the
+ /// character must be escaped.
+ ///
+ private const string Header = @"Version:0.9 +StartHTML:<<<<<<<<1 +EndHTML:<<<<<<<<2 +StartFragment:<<<<<<<<3 +EndFragment:<<<<<<<<4 +StartSelection:<<<<<<<<3 +EndSelection:<<<<<<<<4"; + + /// + /// html comment to point the beginning of html fragment + /// + public const string StartFragment = ""; + + /// + /// html comment to point the end of html fragment + /// + public const string EndFragment = @""; + + /// + /// Used to calculate characters byte count in UTF-8 + /// + private static readonly char[] _byteCount = new char[1]; + + #endregion + + + /// + /// Create with given html and plain-text ready to be used for clipboard or drag and drop.
+ /// Handle missing ]]> tags, specified start\end segments and Unicode characters. + ///
+ /// + /// + /// Windows Clipboard works with UTF-8 Unicode encoding while .NET strings use with UTF-16 so for clipboard to correctly + /// decode Unicode string added to it from .NET we needs to be re-encoded it using UTF-8 encoding. + /// + /// + /// Builds the CF_HTML header correctly for all possible HTMLs
+ /// If given html contains start/end fragments then it will use them in the header: + /// hello world]]> + /// If given html contains html/body tags then it will inject start/end fragments to exclude html/body tags: + /// hello world]]> + /// If given html doesn't contain html/body tags then it will inject the tags and start/end fragments properly: + /// world]]> + /// In all cases creating a proper CF_HTML header:
+ /// + /// + /// hello world + /// ]]> + /// + /// See format specification here: http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/clipboard/htmlclipboard.asp + ///
+ ///
+ /// a html fragment + /// the plain text + public static DataObject CreateDataObject(string html, string plainText) + { + html = html ?? String.Empty; + var htmlFragment = GetHtmlDataString(html); + + // re-encode the string so it will work correctly (fixed in CLR 4.0) + if (Environment.Version.Major < 4 && html.Length != Encoding.UTF8.GetByteCount(html)) + htmlFragment = Encoding.Default.GetString(Encoding.UTF8.GetBytes(htmlFragment)); + + var dataObject = new DataObject(); + dataObject.SetData(DataFormats.Html, htmlFragment); + dataObject.SetData(DataFormats.Text, plainText); + dataObject.SetData(DataFormats.UnicodeText, plainText); + return dataObject; + } + + /// + /// Clears clipboard and sets the given HTML and plain text fragment to the clipboard, providing additional meta-information for HTML.
+ /// See for HTML fragment details.
+ ///
+ /// + /// ClipboardHelper.CopyToClipboard("Hello World", "Hello World"); + /// + /// a html fragment + /// the plain text + public static void CopyToClipboard(string html, string plainText) + { + var dataObject = CreateDataObject(html, plainText); + Clipboard.SetDataObject(dataObject); + } + + /// + /// Generate HTML fragment data string with header that is required for the clipboard. + /// + /// the html to generate for + /// the resulted string + private static string GetHtmlDataString(string html) + { + var sb = new StringBuilder(); + sb.AppendLine(Header); + sb.AppendLine(@""); + + // if given html already provided the fragments we won't add them + int fragmentStart, fragmentEnd; + int fragmentStartIdx = html.IndexOf(StartFragment, StringComparison.OrdinalIgnoreCase); + int fragmentEndIdx = html.LastIndexOf(EndFragment, StringComparison.OrdinalIgnoreCase); + + // if html tag is missing add it surrounding the given html (critical) + int htmlOpenIdx = html.IndexOf(" -1 ? html.IndexOf('>', htmlOpenIdx) + 1 : -1; + int htmlCloseIdx = html.LastIndexOf(" -1 ? html.IndexOf('>', bodyOpenIdx) + 1 : -1; + + if (htmlOpenEndIdx < 0 && bodyOpenEndIdx < 0) + { + // the given html doesn't contain html or body tags so we need to add them and place start/end fragments around the given html only + sb.Append(""); + sb.Append(StartFragment); + fragmentStart = GetByteCount(sb); + sb.Append(html); + fragmentEnd = GetByteCount(sb); + sb.Append(EndFragment); + sb.Append(""); + } + else + { + // insert start/end fragments in the proper place (related to html/body tags if exists) so the paste will work correctly + int bodyCloseIdx = html.LastIndexOf(""); + else + sb.Append(html, 0, htmlOpenEndIdx); + + if (bodyOpenEndIdx > -1) + sb.Append(html, htmlOpenEndIdx > -1 ? htmlOpenEndIdx : 0, bodyOpenEndIdx - (htmlOpenEndIdx > -1 ? htmlOpenEndIdx : 0)); + + sb.Append(StartFragment); + fragmentStart = GetByteCount(sb); + + var innerHtmlStart = bodyOpenEndIdx > -1 ? bodyOpenEndIdx : (htmlOpenEndIdx > -1 ? htmlOpenEndIdx : 0); + var innerHtmlEnd = bodyCloseIdx > -1 ? bodyCloseIdx : (htmlCloseIdx > -1 ? htmlCloseIdx : html.Length); + sb.Append(html, innerHtmlStart, innerHtmlEnd - innerHtmlStart); + + fragmentEnd = GetByteCount(sb); + sb.Append(EndFragment); + + if (innerHtmlEnd < html.Length) + sb.Append(html, innerHtmlEnd, html.Length - innerHtmlEnd); + + if (htmlCloseIdx < 0) + sb.Append(""); + } + } + else + { + // handle html with existing start\end fragments just need to calculate the correct bytes offset (surround with html tag if missing) + if (htmlOpenEndIdx < 0) + sb.Append(""); + int start = GetByteCount(sb); + sb.Append(html); + fragmentStart = start + GetByteCount(sb, start, start + fragmentStartIdx) + StartFragment.Length; + fragmentEnd = start + GetByteCount(sb, start, start + fragmentEndIdx); + if (htmlCloseIdx < 0) + sb.Append(""); + } + + // Back-patch offsets (scan only the header part for performance) + sb.Replace("<<<<<<<<1", Header.Length.ToString("D9"), 0, Header.Length); + sb.Replace("<<<<<<<<2", GetByteCount(sb).ToString("D9"), 0, Header.Length); + sb.Replace("<<<<<<<<3", fragmentStart.ToString("D9"), 0, Header.Length); + sb.Replace("<<<<<<<<4", fragmentEnd.ToString("D9"), 0, Header.Length); + + return sb.ToString(); + } + + /// + /// Calculates the number of bytes produced by encoding the string in the string builder in UTF-8 and not .NET default string encoding. + /// + /// the string builder to count its string + /// optional: the start index to calculate from (default - start of string) + /// optional: the end index to calculate to (default - end of string) + /// the number of bytes required to encode the string in UTF-8 + private static int GetByteCount(StringBuilder sb, int start = 0, int end = -1) + { + int count = 0; + end = end > -1 ? end : sb.Length; + for (int i = start; i < end; i++) + { + _byteCount[0] = sb[i]; + count += Encoding.UTF8.GetByteCount(_byteCount); + } + return count; + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/ILMerge.props b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/ILMerge.props new file mode 100644 index 000000000000..aaadb1218f7d --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/ILMerge.props @@ -0,0 +1,67 @@ + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/ILMergeOrder.txt b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/ILMergeOrder.txt new file mode 100644 index 000000000000..3fda7f5fa4df --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/ILMergeOrder.txt @@ -0,0 +1,4 @@ +# this file contains the partial list of the merged assemblies in the merge order +# you can fill it from the obj\CONFIG\PROJECT.ilmerge generated on every build +# and finetune merge order to your satisfaction + diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Main.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Main.cs new file mode 100644 index 000000000000..fecb20d2f5a3 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Main.cs @@ -0,0 +1,64 @@ +using com.insanitydesign.MarkdownViewerPlusPlus; +using Kbg.NppPluginNET.PluginInfrastructure; + +/// +/// +/// +namespace Kbg.NppPluginNET +{ + /// + /// + /// + class Main + { + /// + /// + /// + public const string PluginName = "MarkdownViewer++"; + + /// + /// "Singleton" for this plugin of the actual implementation + /// + private static MarkdownViewer MarkdownViewer = new MarkdownViewer(); + + /// + /// This method is invoked whenever something is happening in notepad++ + /// use eg. as + /// if (notification.Header.Code == (uint)NppMsg.NPPN_xxx) + /// { ... } + /// or + /// + /// if (notification.Header.Code == (uint)SciMsg.SCNxxx) + /// { ... } + /// + /// + public static void OnNotification(ScNotification notification) + { + MarkdownViewer.OnNotification(notification); + } + + /// + /// + /// + internal static void CommandMenuInit() + { + MarkdownViewer.CommandMenuInit(); + } + + /// + /// + /// + internal static void SetToolBarIcon() + { + MarkdownViewer.SetToolBarIcon(); + } + + /// + /// + /// + internal static void PluginCleanUp() + { + MarkdownViewer.PluginCleanUp(); + } + } +} \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewer.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewer.cs new file mode 100644 index 000000000000..c5d0b01f5de4 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewer.cs @@ -0,0 +1,364 @@ +using com.insanitydesign.MarkdownViewerPlusPlus.Forms; +using com.insanitydesign.MarkdownViewerPlusPlus.Properties; +using Kbg.NppPluginNET; +using Kbg.NppPluginNET.PluginInfrastructure; +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using static com.insanitydesign.MarkdownViewerPlusPlus.MarkdownViewerConfiguration; +using static Kbg.NppPluginNET.PluginInfrastructure.Win32; + +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus +{ + /// + /// + /// + public class MarkdownViewer + { + /// + /// + /// + public struct FileInformation + { + /// + /// + /// + public string FileDirectory { get; set; } + /// + /// + /// + private string fileName; + /// + /// + /// + public string FileName { + get { + return this.fileName; + } + set { + this.fileName = value; + this.FileExtension = Path.GetExtension(this.fileName); + this.FileExtension = this.FileExtension.StartsWith(".") ? this.FileExtension.Substring(1, this.FileExtension.Length - 1) : this.FileExtension; + } + } + /// + /// + /// + public string FileExtension { get; private set; } + } + + /// + /// + /// + public IScintillaGateway Editor { get; protected set; } + /// + /// + /// + public INotepadPPGateway Notepad { get; protected set; } + + /// + /// + /// + public FileInformation FileInfo { get; protected set; } + + /// + /// + /// + protected AbstractRenderer renderer; + + /// + /// + /// + protected bool rendererVisible = false; + + /// + /// + /// + protected bool updateRenderer = true; + + /// + /// + /// + public int commandId = 0; + + /// + /// + /// + public int commandIdSynchronize = 2; + + /// + /// + /// + public int commandIdOptions = 4; + + /// + /// + /// + public int commandIdAbout = 5; + + /// + /// + /// + protected MarkdownViewerConfiguration configuration; + + /// + /// + /// + public Options Options { + get { + return this.configuration.options; + } + } + + /// + /// + /// + public MarkdownViewer() + { + //Get some global references to the editor and Notepad++ engines + this.Editor = new ScintillaGateway(PluginBase.GetCurrentScintilla()); + this.Notepad = new NotepadPPGateway(); + //Init the actual renderer + this.renderer = new MarkdownViewerRenderer(this); + } + + /// + /// + /// + /// + public void OnNotification(ScNotification notification) + { + //Listen to any UI update to get informed about all file changes, chars added/removed etc. + if (this.renderer.Visible) + { + //Check for updates + if (notification.Header.Code == (uint)SciMsg.SCN_UPDATEUI) + { + //Update the view + Update((notification.Updated & (uint)SciMsg.SC_UPDATE_V_SCROLL) != 0); + } + else if (notification.Header.Code == (uint)NppMsg.NPPN_BUFFERACTIVATED) + { + //Update the scintilla handle in all cases to keep track of which instance is active + UpdateEditorInformation(); + this.Editor.CurrentBufferID = notification.Header.IdFrom; + Update(true, true); + } + else if (notification.Header.Code == (uint)SciMsg.SCN_MODIFIED && !this.updateRenderer) + { + bool isInsert = (notification.ModificationType & (uint)SciMsg.SC_MOD_INSERTTEXT) != 0; + bool isDelete = (notification.ModificationType & (uint)SciMsg.SC_MOD_DELETETEXT) != 0; + + //Track if any text modifications have been made + this.updateRenderer = isInsert || isDelete; + } + } + } + + /// + /// + /// + /// + /// + public void Update(bool updateScrollBar = false, bool updateRenderer = false) + { + //Validate that the current file may be rendered + if (this.configuration.ValidateFileExtension(this.FileInfo.FileExtension, this.FileInfo.FileName)) + { + //Update the view + this.updateRenderer = updateRenderer ? updateRenderer : this.updateRenderer; + UpdateMarkdownViewer(); + //Update the scroll bar of the Viewer Panel only in case of vertical scrolls + if (this.configuration.options.synchronizeScrolling && updateScrollBar) + { + UpdateScrollBar(); + } + } + else + { + this.renderer.Render($@"

+Your configuration settings do not include the currently selected file extension.
+The rendered file extensions are '{this.configuration.options.fileExtensions}'.
+The current file is '{this.FileInfo.FileName}'. +

", this.FileInfo); + } + } + + /// + /// + /// + protected void UpdateScrollBar() + { + try + { + ScrollInfo scrollInfo = this.Editor.GetScrollInfo(ScrollInfoMask.SIF_RANGE | ScrollInfoMask.SIF_TRACKPOS | ScrollInfoMask.SIF_PAGE, ScrollInfoBar.SB_VERT); + double totalRange = scrollInfo.nMax - scrollInfo.nMin + 1; + double scrollRatio; + + // Is "Enable scrolling beyond last line" checked? + if (Editor.GetEndAtLastLine() == false) + { + var actualThumbHeight = totalRange / (totalRange / scrollInfo.nPage - 1); + var actualTrackPos = scrollInfo.nTrackPos * actualThumbHeight / scrollInfo.nPage; + + scrollRatio = Math.Min(1, actualTrackPos / (totalRange - actualThumbHeight)); + } + else + { + scrollRatio = scrollInfo.nTrackPos / (totalRange - scrollInfo.nPage); + } + + this.renderer.ScrollByRatioVertically(scrollRatio); + } + catch { } + } + + /// + /// + /// + public void CommandMenuInit() + { + this.configuration = new MarkdownViewerConfiguration(); + + //Register our commands + PluginBase.SetCommand(this.commandId, Main.PluginName, MarkdownViewerCommand, new ShortcutKey(true, false, true, System.Windows.Forms.Keys.M)); + //Separator + PluginBase.SetCommand(this.commandId + 1, "---", null); + //Synchronized scrolling + PluginBase.SetCommand(this.commandIdSynchronize, "Synchronize scrolling (Editor -> Viewer)", SynchronizeScrollingCommand, this.configuration.options.synchronizeScrolling); + //Separator + PluginBase.SetCommand(this.commandIdSynchronize + 1, "---", null); + //Options + PluginBase.SetCommand(this.commandIdOptions, "Options", OptionsCommand); + //About + PluginBase.SetCommand(this.commandIdAbout, "About", AboutCommand); + } + + /// + /// + /// + public void OptionsCommand() + { + using (MarkdownViewerOptions options = new MarkdownViewerOptions(ref this.configuration)) + { + if (options.ShowDialog(Control.FromHandle(PluginBase.GetCurrentScintilla())) == DialogResult.OK) + { + //Update after something potentially changed in the settings dialog + Update(true, true); + } + } + } + + /// + /// Show the AboutDialog as modal to the Notepad++ window + /// + public void AboutCommand() + { + using (AboutDialog about = new AboutDialog()) + { + about.ShowDialog(Control.FromHandle(PluginBase.GetCurrentScintilla())); + } + } + + /// + /// Check/Uncheck the configuration item + /// + protected void SynchronizeScrollingCommand() + { + this.configuration.options.synchronizeScrolling = !this.configuration.options.synchronizeScrolling; + Win32.CheckMenuItem(Win32.GetMenu(PluginBase.nppData._nppHandle), PluginBase._funcItems.Items[this.commandIdSynchronize]._cmdID, Win32.MF_BYCOMMAND | (this.configuration.options.synchronizeScrolling ? Win32.MF_CHECKED : Win32.MF_UNCHECKED)); + if (this.configuration.options.synchronizeScrolling) + { + UpdateScrollBar(); + } + } + + /// + /// + /// + public void SetToolBarIcon() + { + toolbarIcons toolbarIcons = new toolbarIcons(); + toolbarIcons.hToolbarBmp = Resources.markdown_16x16_solid.GetHbitmap(); + IntPtr pTbIcons = Marshal.AllocHGlobal(Marshal.SizeOf(toolbarIcons)); + Marshal.StructureToPtr(toolbarIcons, pTbIcons, false); + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint)NppMsg.NPPM_ADDTOOLBARICON, PluginBase._funcItems.Items[this.commandId]._cmdID, pTbIcons); + Marshal.FreeHGlobal(pTbIcons); + } + + /// + /// + /// + public void MarkdownViewerCommand() + { + bool visibility = !this.renderer.Visible; + ToggleToolbarIcon(visibility); + //Show + if (visibility) + { + UpdateEditorInformation(); + Update(true, true); + Editor.SetFocus(true); + } + } + + /// + /// + /// + protected void UpdateEditorInformation() + { + this.Editor.SetScintillaHandle(PluginBase.GetCurrentScintilla()); + this.FileInfo = new FileInformation() { + FileName = this.Notepad.GetCurrentFileName(), + FileDirectory = this.Notepad.GetCurrentDirectory() + }; + } + + /// + /// + /// + /// + /// + public void ToggleToolbarIcon(bool show = true) + { + //To show or not to show + NppMsg msg = show ? NppMsg.NPPM_DMMSHOW : NppMsg.NPPM_DMMHIDE; + // + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint)msg, 0, this.renderer.Handle); + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint)NppMsg.NPPM_SETMENUITEMCHECK, PluginBase._funcItems.Items[this.commandId]._cmdID, show ? 1 : 0); + // + this.rendererVisible = this.renderer.Visible; + } + + /// + /// + /// + protected void UpdateMarkdownViewer() + { + try + { + if (this.updateRenderer) + { + this.updateRenderer = false; + this.renderer.Render(this.Editor.GetText(this.Editor.GetLength() + 1), this.FileInfo); + } + } + catch + { + this.renderer.Render("

Couldn't render the currently selected file!

", this.FileInfo); + } + } + + /// + /// Save the configuration + /// + public void PluginCleanUp() + { + this.configuration.Save(); + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewerConfiguration.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewerConfiguration.cs new file mode 100644 index 000000000000..bbc5d411e822 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewerConfiguration.cs @@ -0,0 +1,228 @@ +using Kbg.NppPluginNET.PluginInfrastructure; +using PdfSharp; +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; + +/// +/// +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus +{ + /// + /// + /// + public class MarkdownViewerConfiguration + { + /// + /// + /// + public struct Options + { + /// + /// + /// + public bool synchronizeScrolling; + /// + /// + /// + public string fileExtensions; + /// + /// + /// + public bool inclNewFiles; + /// + /// + /// + private string htmlCssStyle; + /// + /// + /// + public string HtmlCssStyle { + get { + if (htmlCssStyle == null) return ""; + return htmlCssStyle.Replace(@" \n ", Environment.NewLine); + } + set { + htmlCssStyle = value.Replace(Environment.NewLine, @" \n "); + } + } + /// + /// + /// + public PageOrientation pdfOrientation; + /// + /// + /// + public PageSize pdfPageSize; + /// + /// + /// + public string margins; + + /// + /// + /// + /// + public int[] GetMargins() + { + try + { + return this.margins.Split(',').Select(x => int.Parse(x)).ToArray(); + } + catch { } + //Default to 5mm + return new int[] { 5, 5, 5, 5 }; + } + + /// + /// + /// + public bool pdfOpenExport; + + /// + /// + /// + public bool htmlOpenExport; + } + + /// + /// + /// + protected string iniFilePath = null; + + /// + /// + /// + protected string assemblyName = ""; + + /// + /// + /// + public Options options; + + /// + /// + /// + public MarkdownViewerConfiguration() + { + this.assemblyName = Assembly.GetExecutingAssembly().GetName().Name; + Init(); + } + + /// + /// Used for initing and re-initing + /// + public void Init() + { + // + StringBuilder sbIniFilePath = new StringBuilder(Win32.MAX_PATH); + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint)NppMsg.NPPM_GETPLUGINSCONFIGDIR, Win32.MAX_PATH, sbIniFilePath); + this.iniFilePath = sbIniFilePath.ToString(); + + // if config path doesn't exist, we create it + if (!Directory.Exists(iniFilePath)) + { + Directory.CreateDirectory(iniFilePath); + } + + // + this.iniFilePath = Path.Combine(iniFilePath, this.assemblyName + ".ini"); + Load(); + } + + /// + /// Load all configuration settings + /// + public void Load() + { + //Grab ini file settings based on struct members + this.options = GetDefaultOptions(); + //Unbox/Box magic to set structs + object options = this.options; + foreach (FieldInfo field in this.options.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) + { + if (field.FieldType == typeof(bool)) + { + field.SetValue(options, (Win32.GetPrivateProfileInt(this.assemblyName, field.Name, 0, iniFilePath) != 0)); + } + else if (field.FieldType == typeof(string)) + { + StringBuilder sbFieldValue = new StringBuilder(32767); + Win32.GetPrivateProfileString(this.assemblyName, field.Name, "", sbFieldValue, 32767, iniFilePath); + field.SetValue(options, sbFieldValue.ToString()); + } + else if (field.FieldType.IsEnum) + { + StringBuilder sbFieldValue = new StringBuilder(Win32.MAX_PATH); + Win32.GetPrivateProfileString(this.assemblyName, field.Name, "", sbFieldValue, Win32.MAX_PATH, iniFilePath); + try + { + field.SetValue(options, Enum.Parse(field.FieldType, sbFieldValue.ToString())); + } + catch { } + } + } + //Unbox/Box magic to set structs + this.options = (Options)options; + } + + /// + /// Save all made changes to the configuration + /// + public void Save() + { + //Save ini file settings based on struct members + foreach (FieldInfo field in this.options.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) + { + var value = field.GetValue(this.options); + value = value != null ? value : ""; + if (field.FieldType == typeof(bool)) + { + Win32.WritePrivateProfileString(this.assemblyName, field.Name, ((bool)value) ? "1" : "0", iniFilePath); + } + else if (field.FieldType == typeof(string) || field.FieldType.IsEnum) + { + Win32.WritePrivateProfileString(this.assemblyName, field.Name, value.ToString(), iniFilePath); + } + } + } + + /// + /// + /// + /// + /// + /// + public bool ValidateFileExtension(string fileExtension, string fileName = "") + { + //Nothing set -> Render all + if (this.options.fileExtensions == null || this.options.fileExtensions == "") return true; + //Something set but nothing given, check for "new " files (dirty dirty ^^) + if (fileExtension == null || fileExtension == "") return this.options.inclNewFiles && fileName.StartsWith("new "); + //Otherwise check + return this.options.fileExtensions.ToLower().Contains(fileExtension.ToLower()); + } + + /// + /// + /// + /// An Options object containing some pre-set default options + protected Options GetDefaultOptions() + { + Options options = new Options() + { + inclNewFiles = true, + pdfOrientation = PageOrientation.Portrait, + pdfPageSize = PageSize.A4, + synchronizeScrolling = false, + margins = "5,5,5,5", + pdfOpenExport = false, + htmlOpenExport = false + }; + return options; + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewerPlusPlus.csproj b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewerPlusPlus.csproj new file mode 100644 index 000000000000..f7d0ebafb02b --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/MarkdownViewerPlusPlus.csproj @@ -0,0 +1,324 @@ + + + + + Debug + x86 + 2.0 + {E56F6E12-089C-40ED-BCFD-923E5FA121A1} + Library + Properties + com.insanitydesign.MarkdownViewerPlusPlus + MarkdownViewerPlusPlus + bin\Debug\ + v4.0 + + + + + 3.5 + + + + + + + true + TRACE;DEBUG;v3_5;CORE;CORE_WITH_GDI + full + prompt + false + bin\Debug + x86 + true + + + TRACE;v3_5;CORE;CORE_WITH_GDI + true + bin\Release + pdbonly + prompt + x86 + true + + + true + bin\x64\Debug\ + TRACE;DEBUG + true + full + x64 + prompt + MinimumRecommendedRules.ruleset + + + bin\x64\Release\ + TRACE + true + true + pdbonly + x64 + prompt + MinimumRecommendedRules.ruleset + + + true + bin\x86\Debug\ + TRACE;DEBUG + true + full + x86 + prompt + MinimumRecommendedRules.ruleset + + + bin\x86\Release\ + TRACE + true + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + + + + Program + $(ProgramW6432)\Notepad++\notepad++.exe + $(MSBuildProgramFiles32)\Notepad++\notepad++.exe + + + + ..\packages\HtmlRenderer.Core.1.5.1-beta3\lib\net40-client\HtmlRenderer.dll + + + ..\packages\HtmlRenderer.PdfSharp.1.5.1-beta3\lib\net40-client\HtmlRenderer.PdfSharp.dll + + + ..\packages\HtmlRenderer.WinForms.1.5.1-beta3\lib\net40-client\HtmlRenderer.WinForms.dll + + + ..\packages\Markdig.0.15.0\lib\net40\Markdig.dll + + + + True + + + ..\packages\PDFsharp.1.50.4845-RC2a\lib\net20\PdfSharp.dll + + + ..\packages\PDFsharp.1.50.4845-RC2a\lib\net20\PdfSharp.Charting.dll + + + + + ..\packages\Svg.2.3.0\lib\net35\Svg.dll + + + + + + + + + + + + Form + + + AboutDialog.cs + + + UserControl + + + Form + + + AbstractRenderer.cs + + + Component + + + Form + + + MarkdownViewerOptions.cs + + + Form + + + UserControl + + + OptionsPanelGeneral.cs + + + UserControl + + + OptionsPanelHTML.cs + + + UserControl + + + OptionsPanelPDF.cs + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + + AboutDialog.cs + + + AbstractRenderer.cs + + + MarkdownViewerOptions.cs + + + OptionsPanelGeneral.cs + + + OptionsPanelHTML.cs + + + OptionsPanelPDF.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + + + + + Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $([System.IO.File]::ReadAllText('Properties\AssemblyInfo.cs')) + ^\s*\[assembly: AssemblyVersion\(\D*(\d+)\.(\d+)\.(\d+) + $([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern), System.Text.RegularExpressions.RegexOptions.Multiline).Groups[1].Value) + $([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern), System.Text.RegularExpressions.RegexOptions.Multiline).Groups[2].Value) + $([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern), System.Text.RegularExpressions.RegexOptions.Multiline).Groups[3].Value) + + + + + + + + + + %(ParentFolder.Fullpath) + $(AssemblyName)-$(AssemblyVersionMajor).$(AssemblyVersionMinor).$(AssemblyVersionBuild)-$(Platform).zip + %(OutputDirectory.Fullpath) + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/ClikeStringArray.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/ClikeStringArray.cs new file mode 100644 index 000000000000..86296ba077ef --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/ClikeStringArray.cs @@ -0,0 +1,68 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + public class ClikeStringArray : IDisposable + { + IntPtr _nativeArray; + List _nativeItems; + bool _disposed = false; + + public ClikeStringArray(int num, int stringCapacity) + { + _nativeArray = Marshal.AllocHGlobal((num + 1) * IntPtr.Size); + _nativeItems = new List(); + for (int i = 0; i < num; i++) + { + IntPtr item = Marshal.AllocHGlobal(stringCapacity); + Marshal.WriteIntPtr((IntPtr)((int)_nativeArray + (i * IntPtr.Size)), item); + _nativeItems.Add(item); + } + Marshal.WriteIntPtr((IntPtr)((int)_nativeArray + (num * IntPtr.Size)), IntPtr.Zero); + } + public ClikeStringArray(List lstStrings) + { + _nativeArray = Marshal.AllocHGlobal((lstStrings.Count + 1) * IntPtr.Size); + _nativeItems = new List(); + for (int i = 0; i < lstStrings.Count; i++) + { + IntPtr item = Marshal.StringToHGlobalUni(lstStrings[i]); + Marshal.WriteIntPtr((IntPtr)((int)_nativeArray + (i * IntPtr.Size)), item); + _nativeItems.Add(item); + } + Marshal.WriteIntPtr((IntPtr)((int)_nativeArray + (lstStrings.Count * IntPtr.Size)), IntPtr.Zero); + } + + public IntPtr NativePointer { get { return _nativeArray; } } + public List ManagedStringsAnsi { get { return _getManagedItems(false); } } + public List ManagedStringsUnicode { get { return _getManagedItems(true); } } + List _getManagedItems(bool unicode) + { + List _managedItems = new List(); + for (int i = 0; i < _nativeItems.Count; i++) + { + if (unicode) _managedItems.Add(Marshal.PtrToStringUni(_nativeItems[i])); + else _managedItems.Add(Marshal.PtrToStringAnsi(_nativeItems[i])); + } + return _managedItems; + } + + public void Dispose() + { + if (!_disposed) + { + for (int i = 0; i < _nativeItems.Count; i++) + if (_nativeItems[i] != IntPtr.Zero) Marshal.FreeHGlobal(_nativeItems[i]); + if (_nativeArray != IntPtr.Zero) Marshal.FreeHGlobal(_nativeArray); + _disposed = true; + } + } + ~ClikeStringArray() + { + Dispose(); + } + } +} \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/DllExportAttribute.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/DllExportAttribute.cs new file mode 100644 index 000000000000..60fbcbedc8ce --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/DllExportAttribute.cs @@ -0,0 +1,29 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +using System; +using System.Runtime.InteropServices; + +namespace NppPlugin.DllExport +{ + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + partial class DllExportAttribute : Attribute + { + public DllExportAttribute() + { + } + + public DllExportAttribute(string exportName) + : this(exportName, CallingConvention.StdCall) + { + } + + public DllExportAttribute(string exportName, CallingConvention callingConvention) + { + ExportName = exportName; + CallingConvention = callingConvention; + } + + public CallingConvention CallingConvention { get; set; } + + public string ExportName { get; set; } + } +} \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/Mono.Cecil.dll b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/Mono.Cecil.dll new file mode 100644 index 0000000000000000000000000000000000000000..ffe9b57debe72e460a2fa851d2870557e6030ffd GIT binary patch literal 275968 zcmc${37lM2mB;`3z3NxhRozJ{-KpwymMWHnXH|C-I)W`h2uo1eH?f0C*cFsK>-o59Z zd+xdCo_p?o-^u5^%nLlv%kez)kmr4bxBj-;?<4>0A$VEsW6QjM7`Su4kMx~%=YD5B zJL6sT3ofqDUb(Y=>CXCbr=D5AJih4S$)Ta*feGo;wt3!3 zeSvrHz1N?brgp#Q?^o(8c-|yjg${bxNx18{&l9Ixo!fVO12F#e_Fhjo@G~BtBVSuz z=y@ybfA^hu4cYUqg{~zG-DwG8;oqK|HwbJ5ytNC%9?4(#JaW+aE8u@Z$4Az7UHqI~ z`0pK0@}<1OclNJNZYO73vljw1-r&*Wzqd(0-M_5}WODZ6XT>0jR}Y?z)}t5U9n+2F zT(!V-txw)Z}`H0{qdE%uj{XU{GWe!>y_*Mxe7vR?C%F{a{#EO0CNBs zO#$ZchBx(j!{n&X^U8i)Lg$L%gkNcd@owJ>8|OF*6aGlUxeTRItfV31g9&_ysEtZv zy&vu8dBw)L?(GK~Cc=&L`vY<;y(b}-93iW=W5_Yu-2?R*w=tg-~o}{fR4gMNAHI3xBffy!VSf?yrFRWJf!T>%p|f=nepe= zDAHjr^^phrM4p_A7t3irlT-1Z^R9sw`6pdvU+J0{{OBN1$2a(nl*w$C*jM>mn;6d^pnq8|npW7d{-U}wTND%dLX5fEgPV)~90YMq_BH&dNa)0Je^pzdycC3zsc!l6lXxb| zBM*jez}uqWihBeyc#Lv3i~dS)E&}eN<9U=kM&xTQ#md10F2Tx_UnRklMcH_%96XeS zJeZR{RU5Y_0aIv;_*sDNuc8nPE~8-%VkohSVmQ{51Ppqx#W1*HI0w?1H0e+;kk5(8 zM}Phtnw}e9?%r{Od{iFv6A6uXL~<}lCX(AFlBPr=(7b-6pH0ll{v>g*k{I3;dfTCm zej|UQ51)FcbT^~bPS%@J!fzDeaS;}1UO#aT!qf`Iq*k;h2&Ep#o43@eEl|#^-#gl(DXN3@cgIm;2Wq0C?`6e#-s9Ad&ZJS^j7f;m?S`pWci4 z+YHn){uc2ESH(R7&Fe?zPy8vS@dr@+$#49j<;I`h@uL^tN>H{imOzRzEm$E|b=r;+uWZ%}& z2Z84GlhudEW%GjulOLl`e)L|PA6RsR-!8(KzTzH%=JgX7Tz(YO^7B}iANgH=j$R@^ zR6fg(-tplNlOOWwl6^-fKLX9`C!3#RviYHJMt+Pw`O$lEe#n6%{7w+edFGAcfQQ7Dx_9FTbNNA|w zp(tW7jH2H0kqan($0({@4m{CZW;BJ`L-RgIQ*fhc9R>`d-tkcjXufX&O>7@B6KW65 z_dA+`hmFHs+qJF|eN(Z|rU{3g+`38-eG5Qao(@uV0aA4-q|pUPqe~&JUVyZEDWtIl zNMlPOtyzGyW+|k#3y{_>g|uz~(z+}X9XW}jHkt_PoJ3FnmPA|ch;`A{XVH#Hsnu3E zymLF`YAdpcX|nZ&$<}+4P3hHZ^#$~RWa%C660Yy@JTJOaC4NDYvVnr=u1=w+sOs7; zKow|7R2s#FsDPG4U9lJy(2}SKej!yrOQLRFj0z}=dO{)rpk5->OHvUSEGsUCFQk-H zYO1Auo|EoX*$4)Igh>9wMDk&)Tg5ukX3V`Xvw*TW=%8Yv7oq}M5|w`cLR3Im)azWI zb-d!|FmLrT zGd=&hy!?26>(|qrK2YTZ=Il@6Zt9n;mW=TSJ621$fefzhdXq8lL}_*oc3P(sx*NSeKl8n2MNXJBe&U`rJWMF)3-jGt3v0>{*?%zkNJ$yCLoy8I0LNcOrfew z(LirRc-8nUV8yU@$o6g6JDWeEkZfW^%G)gas|}^LX_66Fr7_xAO=6;VN zYo3&D(7yu%etaBnXYs`6wZy3s zCzz!kcgpYy!hMP#Kasce;qesR49pHLEYm{#3Dh^9AiZ%4`vV;sK@zg4tQq(gr`{LL zezJpVL)GgRR#rNeuCo0E+AWM;agRXr`iYTHT3Mf;i71msJ>8l{yaO^fcVN8^}fSIf6HuMIZJiNEFE``5j*#AlrBz=`@1s_7#1Y zTfn8DGBpt7=gx(|6s+U}6Pnf2_0VBHh_acJObs)f+mT>~L3|$0#xZ_e?njq)+)W9o zkZ#E_!?nQy&$~NbNnj)OUvl@31R`s9jpXnHrj{rJN`4*{$Tbhl`SY{@PLMy9G|nfP zJpvg#UWPPIcX`cuSHa_$cnnUsxxNR_j)@_;i@}BysxxObpCV6f>yC-_hVk5o9(riU z`U{H8c@cc`c|scn?a>x`ltOExo#5Jv3(hmt(V3gqC(hMLtg)H1)X>VNoKAIIBOV3| z+bAm4Z*LpVi+R4-=Xw9lb2!y;FVCH-mb6xzd9LJn1J6%*ri%~>MlUJ`t9J|yYy)Cs zX!=CjoBl^2bsTKo=@<6 zndcs!>HU)g!_xHf#0f{a#7Un1h=l53lGEQOPWb$J;v69ViL*%laaKyxUrHd$O4A=t zoaE!s;y66XP>>79vlV`=)r#CcF@dM0s3 zrRkFsXQMQI49=j6^r}0C!*aL{Z%2636A2zU9ZQ_#X}O}fA|K9|^NWk@KT#a+N32m{jMYqlwO@U5%o=p6InbzaYFw&i4(D0 zjx){FKzX1yQ!@!3^4*p=k^148D8+KIH_C3NrB#)I4Q-Ki$Ws0q4E%ou}VyjnyTh}o!_w3+^Ki5 z)Vw53ZCQC)r>_zchBZwQ3}xk>N7QZq`0xV*f)H=T+w{8BU2 zJERlbx=lU!`2$1d4*5LMhwQy(65R$pY=qVG8sX@9 zjYScM1{5(jxys&!$>sL05^-Ruh-*42%1|k4`ItBA*WBTuCpt&pp{vWe%9brCM*`Tg z2KV#_$%F&=Tb6YKb6ftWOJd9Ka8E1O4sqbnbp z43>*j-ttu;KCXjUKlD@=QcdZOYKq45?o1$)mrZ}M6MoR-`3@XSKFv8AliSUuR^iXc+3Sots?d9EHjJ^!~8uSXiVRvW3F; zC#%j8POfl{I{NV&%CF0N5_xquF|49RMlj~+o7|K@CO4Q(bG~qLKj#>m9C3~{lf%8_-nWH#4F#UW1sJIfr;^Z)XiqUuIit&;W0b8IrfIAF5S+|n(r47H3fF^{6=PnMh`oXj;t7b!EY&v|pG%sLd`x6Vr1 zYdVOiPvnt#mx$Cz9L4iAp4~jJ;Q0rhyLf)jGwnlWw7B}l7m}php4Twm-Ms&SOwX$A=HASusiG_S^S*@V79T-&tbd3Il#8wyAxY%f&Fp3gJ zaa0TySA$#}6H_$0cY)kV3YDuU2c@dAQ=;#b4MnFUlEJDnK3JN5MK%!S5SK&ZWT@2K z-H|n#P*Gl&Rh98&qss8IQgi$2G=H>(BD>tkE-y8Y8ZC}F-dB`YRK@X%QAJ&`8lF~^ znzatQ<#JhhD=W=1ZKu<$%3x)vITGXtZjLXY%`QY2@;f+Cof#U)-*oBJFALS$if}uf z+Y6@rF{Tn4ey}4MvP|X1ndmwX$R#^imJW907{{E^&(IUV3eV3eD7S;aOr*nevR<8xtTW?iKc7yw*jRbrDmSf^Nl4?p7cR{F zaVht|5cf|P_X5r9CuSxn&HRgcGyjYv^V`zs4=DPjiZ0N+e&Usies*g=LAL;KF2*jl zfn`>2c24N6#j~(6<~Ap!Fgjd|U>gNX5lUH4f7XLFv&{|Iw_M{oe`LgMoe0`W%&#Na zHJJ(2l-}Wr#kxfcq-YrCHI}yVC1Y^yePKMWuniN-Hzw=m#kK%qDf$($ZL3R~58|jC z$-Y-7ZtI!Ifw64#dm*}MuQ2)uo-lrv#L0~C@qR?}qA8f@pLsKB#l9F3Zp<=0{0AI< zVEafSxC#B*stjC1~ErNGimkur;MhLkSG^&n*y;|wWXjO#(lEXEm9 zx)|4klv#{3q;xT^2Pv}{XGrN{Tn|!aG0u?E#kd}%%wn7&rHgTfbflA0&tjYcx{GnW zXqm-0hn6nJ8QL)^wd`V?!|N=@_0Y>M#u;8`F|LPR&tjaz>nz3@A`3Zs*Y}{?-PM^6 zC|RB9LG}6;p$fDlYHl$qpe0c;unQQ_(0fT#D&ay@Kv`5)*enk~vny;}SXP@^Ve14y zC%eMd3x9-2*%h{Iq|OSPfLMhzrR)k@g5OzT>qRXr&Mcs8X1i3gD{KkX&I(&ERSele z5dz9mB@O1|PDL;Dml&C~iII66M#k;WGxOy3Iy&3s_T{lb!pxO}x!rgf)R(7QE8DVi zey%NK?SzxrVq@HMBrPna(rHkb^83-z_}q3k>~X)%o%v?Vjfjy?P|f^lI|bg(>~AY{@FI;1CPDjUS4WEW4f!zz5E zcLbjJQ_RaNV;x8ke_Eh4Q6V+P+?vl=>vCF^-Mv2AsV7Ms)^w(%4;SgQWff_+RW@bb zZ9ufP3?#}s)0P=AHNBk%?K2XPYtU{_imP=r3A9DnaSjEhQZkzxU*t#U!<9Nl{e5Z2 z$l(U@7UhXTJx_&7!}GV$v8Kr!0B%eH<^XVm0EhV|h9J63@n+eLC~!xC6d47wD8F<> zO$BLsT?&p&WvVjEoClk875j$Msprv7HP%kXB*x5wwU{r{TN?w-LBP#Pz{}GBa}e-~ z6kv`{|6)JW$yXBS`WGL8Z#Lx!V7-!8;fO}kUWuFcR=;F_i>FW*FNQth31IPVQM^@) z;}Mtsj6z+!J6w7Kn4JF(hh@kdN-yVKNqPrZJY{>FEth)7m$Seyk!&qZKw9u{d#7J2 zOr)weJ&aBSRz>LEh7+YQK2+}@WSH7IfoZUk54!ML%*%%x2HT2SU@wntutvlRLls(| zPE_LADv{a1pOa%MY|+ar?zX;KF?i#NboLr|(0!u17ZaS#DGs%kJQWk%+?x!!m~Qqx zj93`J;td8S?B14NeD>%Xi755Ep+!t)z=eglf!|Pis)V#O6;ss}^jgWh_ z7d#0!Dvf=j+ed0XmD*))p6--&DvJyo3=~ujPPq+kR7&b{vf?W{d$eQ4OE9TF`*rJ2 z5Yu@pcB7DY#jM11;fm}7k>{pM+a^5dsC-Z3eV~=Epef4cJnO_%-=d$0FK%~2{S7Ac z4aMq=Q3?Z-A>es%0P0221<`YHta9s9XC(4w$A;30DjFy#KPRO5ai!&g7qdaBJ&$;P zP>rtB+p-e4(p!+St0$*JcLVvd1+<4(6Sfcp@$-%Hstjcpp&GqFA-x$hxpCrzx5>?A zvly=0toGBC?ya?zcVv*lX&z zf=mq(Nmas>wD4Kx&4}fYMAxKWp@*K@U#@a+e~@FzGEsno*CjGfML*+G3ARTf37bkY z=Tw5o!w%0O{N79Un6yno-<~X3ZeZL{cD90MpY>g z@z*fkqMVbmaP{&fV#sJ#w=bxmwok{^QKn+5X&uEq)~Ta^L-fWZ!>&ObtJuV?G-P*O zdAl^E+r@naSNT_wE5cK{%a?cQE??>BK9U`|9$NnwJ5qulDvtNlG$hlS#H{ z8AmJ=>YC6(7S&Wne{YT;XMGLiuC?h$C3#Aqxngs~pL;ck;ocDYsD1@+Y5NXr``%(0wBtT{uVH&9 zuY_ln1AJpUZUwI!0rZKnZsbxviJW(l!#U9yEQ~KJBmo5rAPohOhLW;0d~Z|2PeN`l z`?V~3f;uNu!w*Lskr5YLb1GYi3z>3YF*v|97zW)4&RNQj59S?$Bk9Nl2^qBZb?Qc3 z*6CHqOFh4uPDT6m*24&*qjPi~DUgT-IOjMvbsU#ESd4T*$EOZXA+p5-nLiOe^~aol zla5Vo<>pZ=s1mXb9l7{C#2cL|^b}=y^KgQai@rd=C_2rE<)SC(4Xvf<4*g}i%N~v{ z%aM-#6H>>Cse@C3F6iXcaZ2hio+TJ#?{FXG{|thQex@$jk$7{_XBYTCzrg>w1%6fm zdg8NjqsRZ{1^zEB@PB22|Eml9Ut8e+`U3wq7Wi4(?@9lz1^#b#{8rD8r)*@qG>Vz% z^uluZSU^p;49&fsvJc|hD0X!c5=<0Arbc05F6O01Ty^#d|KHH8&LmWKin+z?yg@16 z@raC5oU!;47Gipx=F9)Akk6M+m*Up*d;x<8q(>DiS z$5|?K`7HOxNXPnqF2B$8&iJG|7OZylphS)ad_u>z`X}0zT7JAMBcIml&@-KzR{I}Fi9W*z#lVpqnfy@3uV(kd3Rvu5 zuJj`cQNOUy_D#{|phq7CSZXd~7xKq&(R~yazK`>o_{}~79;~QG;8-MjM~Bwz?=8cN z4feg`m)WJ$Nl^;*ruA_-L-2$^c;rjxwxdj zZog;B=)VJUMRwK%(U%~#Yd^|*(7#sDLOvR$>s}1=n|~rXr~Rdc@xJm`#KXRLo2`6F zpy-dbzRIf@+9aY0A)I9k*A>p$Ru&txxtL93EVtzRm^vLIJNC1Mw#~Ym;ZC0Vz3-C7 zqe(-#N3Mxg&rRe_G@L4?=@#W&GzcB+5Zi>lk^4M1lgOUIv+$j2Fr=}k}PKd?ZK z$Ds8m+`FkKfp-&mJd`|+8auY6Kl_ge?sjb1EK%er=Hffa!Eo3-u^h&CDKp`4zA{{B zZpK^{_R{e(rVBcCQq*A)w)aP}BP=)#^hX1*JDl5h5KHSb+BR3#^6(cSg<&pEybIgL znRL8nBSso!^%JT9BYJf7Ko@Efb3y2i=CeOt9GTF4T!B*b-3*r{mWt`59 z-Zx$9W@D*QbV>aPB?{Z}IB^fihzv{Oa*W6!TYM~Z&6Wi4!zaRwn(hAk3lrIvmt2qiOw-P`()=} zm&(x+zV-uIa<{W5Xm*DM=1Y~q=IQJVLf%l!$fwmAjqOnn$rG*}p&dMB(}J2Vfkj5FQ3eGoAu#-PYx#}D9~eI|U^qK8g8 z>_-nxQqI5hTsWS6Het~(!E&o2c3#CHkkGv}Hs^zDoVt|~b2_M5*sj%VoHKj1i2Vv; z?vTCV zmE*i%IbMxkDv$Sq%T+%%`RbE+N0RP5-Mid)Xs^cXd!;$kq#hl{k8ZaaX@t?glEAJB z^1We?u&tic-?F~o8mn>KS7MpJJ*-;(Zx2VU7j=8MI`NPBw};WcLCES#CVhI5N?)(W zEN3GgE`2)Uq;F`uyBa=`pZ!PTH2Y`&jn^K@Ud8jVEhXa@c06h=~Fb4p- z9S&d)0CYhdz#IVRX*fXQ7>!OwNEz)(6Qhse5Y0hMnrH_w2LO5<4qy%d-$?=H0B~Ol zFvoStlvAZGl76(EgxezKSK3D6vW($3z5I7Xtx=CH%mH!9nFH$IO9AEp@ck5E4ghpP zToiMp^^*WPC@#PpOqK$p=iy-HI5%Ooj*5)AO;ZM^UOf}ODHV&F(qhjT4?f~WhK>c$7a{$1UT2!i_3or*s{TM)Ub`#%EyFMbx*C>uENvf;U z^D#1UllHauEI z@K!-D+JjhH&t(b$Y=Oa6TdK5=F@-i?EKimedD6QlPl(7-{hp})SyTm@*H5(0 zcw-A6DbC=i`Te-5i* zWc1G5*<<>^(!DCrXr{!5ySnrw=pS$NjRyJCyC;8?lFQ%smA{9SKY`};6RmgoQzY`| zx86g42W67ql!>OpIMX|(Ia^B256ZB1y<@GT=Z`nuj0(Kz-NPF?;&}UkcHHI6+QFcAPdez9OXr75Cr~;9&Fd$syL1$Z zbVf)+PHv#VWE!RU#Dcc2VQHYfk3hdtb-QBB!jit``p@RAKR;rKC3~xKW9jVKOhUG0 zRB_MBEqjW)CAUl|?&ruYD~fxU+_I#)tu0TAbYnByWL^pJ#(XY%of0vdVMopx4RDqz zOpNT|$)=iIbc@g_kDSdd`pBs#YJdO8>6HeXvt9HJ#nV#~XVZb1W4CFM7n^;G@j(*! zd%$dkc;~5qPNqL1g%$_XihBeyxVn{1Rr;pl+?B8y&KJN!&E~0PF7A&NcR+CkGI+Fq z68GxfxWyzcb6=+^R>aaB%r{pFIOg6qoIp_TeovNi=)c=~`eIPOjOngD@ z;CK)M^rH?@jMrO?=muW9s8!6oe3<&sxIPzso*L_C0y2hLmlY>ybY-J zSs|l+7qp3r!kM-l3G}-}JoL+ZJI^%Dp2tF}QLVHaU`~HjAa2CM%{@*0#x!rmc2j;X zI^xydAa~VbRf|6sp_GP&+l>7Mal}_Z$glnL@@D!Zk&_ zToS93B=$WqiI8C54MP)O@T2#US=NZfBulP(IgTCoW*d(>grmom;y$)szZ>iynY@o) zOXdmV8?!AG%`*nK@f`d_6h3 z;p+0^iF=~-IGOigUZYYw_||eRz90H*kE!f6{nsqaNTWK~T$K+Cd!u(#a67fYcXAqEFiDCYHuH!$$*P?VhLc#${ z@<+qn?#9_c^d^$?qvtBokxJaJ)k>QZf2S%?*L9o2r0>nVR2m_-D?~qY6G5ffS9NjE z2%3}BEQ+&KGA=&!mG`CSukX* zKi#2kF6b|avm||suLX{r}f9b?<$Q9?NsR^hL;8h2|ADuTRnb|(&fKH5QblH3$U<@bX#za+x&EW_sVDd)2G&56y;!ab;a@Thq*}M zS^m?t_%8p{XYm`vYmMKahu@s3qq>j}sUpxm(ulh8zd5d=Yqgy6*A|N>b@PyGTPWys z{2jVEW*xv?63iv2SNPEiV%ub#?sOKC-CU&8S3`s_>|^qSVOHp?e2SS9V;{;S-O45{ zB8#whD-XXVpZ#$9;x2lBOv9hl#YeoW_YD%XEZE_)VDO^7nY7dP=c_l}a|3UIE`nfm ziCyC`PgmF(ye7TM7Ux)tdjv9gya9vf@G(=0mt3y<@1&Xl+?~3&r@@Sc9Q`PR(N3{!e-fkX1s6BUOCX)ezhv@Mf-PfG%cB=!!sx?(SJA0xq`fMXE1_v~>Z})-2NTPQvv) z6t~0E-ItQHftEsLJIz8=ftEx?ixyCoVl9c9TZ{^5NmQ6!NEJ{PmFZ>%xOBQRS0I{2 ze2=a`lmXFOb=aR*eX$zk2mNMCSyVDbgo4-9v^(48^{z?W~Tmdtl&&R)#5^$v>cjs5N z%C$nI`x4TsV`?7*t78h%T$0|@#q{2Md9myozYT-S{2S@$G*_}}<4%5A_{s(0tY9an zz{n-j4ldi~F#Ijx*P+)re{9FS`eE5tCuh|Zn#;9^=G^Fq(PzL&PbRy&`+Us_Y9BHE zP$QyNk~tA;EzP#rg=Sh1?LD9_yv%)o+i6Uv_Ej1;C9SL9x`zh7EtVIxo&S?*Y0-pq zA7wU*WjbdE;TA==ruP`+xOCI|SKO0-yV_nP%QT4{SJykHEOj*fat%ADTv%+U`WC=+ z3Th!93-*g(?%ZB4J=KeaaZ7@w32qjl)MIA_Q;+pt?%?Dj7}~1T9XMmdl>w7eGt;3- zV;(1(XfV@CnIrJl)~u%N(PR3@3Up`2CJ+D(gaCGFR$ei**htvXwQ z+{7q7zYu!N_#}GiA~FDoA5J~A9v#K~2#NLTFHKj(rUENRMtknN z8FH|PpPr|!Eir;~a5*w?#x@QvM+VNI!__o%u&khW)t!z#1M6(wIXFXj{ z7lM`rhMvk)^Jj;X-i)Qk*o=b&^SD1OMs>ZzA$nlSLA)PcMo8VQrTNah zTFqNN>BdN$uQUC{yy&hx@}eS_4Ys0B&ElN&A<>~ZmGwxpKjg<7p{?AzkZ|^mskPh) z6GF42u4$;&_*3@>vzSsUw?nAl&&k6Y_m{f}JxP4G1NS3sDj9#AlNk4!9x~-No0vEs zX|stT+{9*+=3qGcUtNOEpmU^Bc`wla>-SDUF6T%t7>c{Q7B;=yvacVb`!pH4)^n|- zlc_=N%BhXt$_C{731mCYG&AKM+iv0m5Zh2;Vvzm57Z79mXTS%NSh`WC_PATi1&gJ9 zQ#V~YI>|QpPAbee?u`$G#D?L4$G(-Q<$>7~3AJleC)VS8O2@Y!zGrrPwdP#N&bGa+ z4aAPQRV-{?W`Ou2xzAOYwqKb%9Jv#;_3EkcKl&8Y-*^|86}B~Q2yH)4nQ*QtI%m}8 z4eEg^+eWDC0;3u23Ug=(`kOZI$u`EL{`lZS51FNr3R|z)9MnPvTlenWV@hQ)gOzKW9jdfN)Xew+&Wxud*e;|a;zlZ|)r|LYjZ@NTWmi!Rc1sGg zbq6MYifzF$5PESol@U;FQsz=pT~L|@aXBg1m!6jTPdxE!ahnQFA96-Un&ClhQ=I5RG z>)S0~f%aB-=fdkez2D+Q#UG3Q#(1`q8DS-Q6yQcyTm~s6<(dc!Bd&al){YFV^$Tb< z7SR$UrM2D(-e~1)uEgo0o12wt-E^tWHAioR!GxoQDjK|&Z%}~A*QWSAgt38nU9Dg- z;hyM~L?-L-oAWN?eV)q6kVZKX>r!EUV)PMHxrbzgnn+tspmWzy=K2fFC_I{7yopW*b#E(26>7c(1nVz4&jt8F{UPvoBxt@$s{R=uop8!E zi{cZv*Pr!C_q9hMor~lkIfqrM7eucWlR@n>hZJgCgP9e5%>&`+{)Zl#Dw#boP#KWt z-9I&;S6v`Qt)Ay1Tbn??#I38}bSVvjWEf_3BQ)IzDp`vXW?PETN%j%ykmLUt($Swo z46f)}#T$PFyndaN(^w6=rYcdSbI(bhnf&NEb_CxV>%p+XsTC*q zf^{LdaK-gNf;OFW?Et1Ttt)!y9OiU|A789^lT&21{f{G!i%27w;2hS2s}5jwJm09T za6JLLE1i#W5OePFES&jsq7}@973SY0q_8!?FNLXn zeu(zF@9&2%||N0qc9z8|>_ixnyog^1zqBb}ay_K-im=i9L z6*F8!X(_uyjw`)F#8@M2A54^>HZn7mUwz?lZY8^LEKYk9aDRYL=*dxGZ;s@Ycuf-q zI7&D~kNCpjeq!~zScjys(f2mv<@r%_+Vd8GLz{!hdv% zFGmJn-lgylP4VT(;LF>CpGfI2;1UEC{-#SetuuiMmJyh|7Iok9;c)i-6jM2DJqFPwajYH=X!uYYc_BDnJt>dU>!(0yPK4wxLu&^Vh28tSvWBYO(JU_OufW6D z%lkeLOIrHI2`-!}z9GR~{5P-tt90*> zhtWN&hSK7deXE^rNYhsK&FNJ^BUjGc{My8eQrF5|@2KhP&99YO4u-2Q99r2okWtD4 zu}mokoOU^%iFjm~&sa*Lw6l39(E~O*fii4M1lsQe+C@RvX-OdDAfAblHSwEX`@SUoTr&E%<1J&`;>~{sQQ81!qU)SWy zaIL$qyh1dlM7`#Lx!xDJB)P~60A3o}bNKBOScsZ7D#)1?#9k;E-EmvhqfC|qg` zgoJl1-icqkgRjrZ9(+yDPOm*c%S>u3-8Xp5ZOc*PtCI~JbIJwU#3rRgQtXWo%sy9| zy4Pq?d`=l;&6ioLz^3kO=U)&X4I3OoXHE_*UXOsR?~)|vST$cx*_An2PF6m{;`fvcfyCW%q`+*82M-EEpF!vwCe~5R!usPqP;6&W#(Gg$SX_j%z87VE z7KQatQOm9vI)4`Fc!yNi6_$>cCUu2ppe0f3i%|h(QO|apc9}!@sk9~6HYH28@+MF= z;JPI?D}I*PKI2f8w#_mX+$@tRy<2jlC2+cHj_xrl^Py~8jE01UYUnB#cAw!Xu7ih^Z#DCU4_)uF6v z8=xycY_sbjS0mfMsJ-Zaj}4>kXMgb^TjM4MD4-C>xE=pYC_nI%vT(j{elmW$Bj*L=O@C|!6Us2WoQfkC z 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¥Oz$yjIj1vGqg;92UeJF8d4qlid5a1}CB#i4 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 literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/NppPlugin.DllExport.MSBuild.dll b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/NppPlugin.DllExport.MSBuild.dll new file mode 100644 index 0000000000000000000000000000000000000000..c3c9de86a2cb42776089e8ee157ca5223bfd643a GIT binary patch literal 41472 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 P@*Kfp{O|Su1r7Xv!L!b_ literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/NppPlugin.DllExport.dll b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/NppPlugin.DllExport.dll new file mode 100644 index 0000000000000000000000000000000000000000..f673ed5ce1d567e6337dea83858dd141922daf8e GIT binary patch literal 90112 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≻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 bKqj?-f5*Rm3!Er*6J9a<|Ns8alfeHC8XNyQ literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/NppPlugin.DllExport.targets b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/NppPlugin.DllExport.targets new file mode 100644 index 000000000000..66fa365d043a --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/DllExport/NppPlugin.DllExport.targets @@ -0,0 +1,44 @@ + + + + + + $(DevEnvDir)\..\..\VC\bin + + + + + + + + diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Docking_h.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Docking_h.cs new file mode 100644 index 000000000000..bb256da874c1 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Docking_h.cs @@ -0,0 +1,71 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +// +// This file should stay in sync with the CPP project file +// "notepad-plus-plus/PowerEditor/src/WinControls/DockingWnd/Docking.h" +// found at +// https://github.com/notepad-plus-plus/notepad-plus-plus/blob/master/PowerEditor/src/WinControls/DockingWnd/Docking.h + +using System; +using System.Runtime.InteropServices; + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + + [Flags] + public enum NppTbMsg : uint + { + // styles for containers + //CAPTION_TOP = 1, + //CAPTION_BOTTOM = 0, + + // defines for docking manager + CONT_LEFT = 0, + CONT_RIGHT = 1, + CONT_TOP = 2, + CONT_BOTTOM = 3, + DOCKCONT_MAX = 4, + + // mask params for plugins of internal dialogs + DWS_ICONTAB = 0x00000001, // Icon for tabs are available + DWS_ICONBAR = 0x00000002, // Icon for icon bar are available (currently not supported) + DWS_ADDINFO = 0x00000004, // Additional information are in use + DWS_PARAMSALL = (DWS_ICONTAB | DWS_ICONBAR | DWS_ADDINFO), + + // default docking values for first call of plugin + DWS_DF_CONT_LEFT = (CONT_LEFT << 28), // default docking on left + DWS_DF_CONT_RIGHT = (CONT_RIGHT << 28), // default docking on right + DWS_DF_CONT_TOP = (CONT_TOP << 28), // default docking on top + DWS_DF_CONT_BOTTOM = (CONT_BOTTOM << 28), // default docking on bottom + DWS_DF_FLOATING = 0x80000000 // default state is floating + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct NppTbData + { + public IntPtr hClient; // HWND: client Window Handle + public string pszName; // TCHAR*: name of plugin (shown in window) + public int dlgID; // int: a funcItem provides the function pointer to start a dialog. Please parse here these ID + // user modifications + public NppTbMsg uMask; // UINT: mask params: look to above defines + public uint hIconTab; // HICON: icon for tabs + public string pszAddInfo; // TCHAR*: for plugin to display additional informations + // internal data, do not use !!! + public RECT rcFloat; // RECT: floating position + public int iPrevCont; // int: stores the privious container (toggling between float and dock) + public string pszModuleName; // const TCHAR*: it's the plugin file name. It's used to identify the plugin + } + + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public RECT(int left, int top, int right, int bottom) + { + Left = left; Top = top; Right = right; Bottom = bottom; + } + public int Left; + public int Top; + public int Right; + public int Bottom; + } + +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/GatewayDomain.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/GatewayDomain.cs new file mode 100644 index 000000000000..7087a1c5cc51 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/GatewayDomain.cs @@ -0,0 +1,273 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + /// + /// Colours 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. + /// + public class Colour + { + public readonly int Red, Green, Blue; + + public Colour(int rgb) + { + Red = rgb & 0xFF; + Green = (rgb >> 8) & 0xFF; + Blue = (rgb >> 16) & 0xFF; + } + + /// + /// + /// + /// a number 0-255 + /// a number 0-255 + /// a number 0-255 + public Colour(int red, int green, int blue) + { + if(red > 255 || red < 0) + throw new ArgumentOutOfRangeException("red", "must be 0-255"); + if(green > 255 || green < 0) + throw new ArgumentOutOfRangeException("green", "must be 0-255"); + if(blue > 255 || blue < 0) + throw new ArgumentOutOfRangeException("blue", "must be 0-255"); + Red = red; + Green = green; + Blue = blue; + } + + public int Value + { + get { return Red + (Green << 8) + (Blue << 16); } + } + } + + /// + /// 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. + /// + /// 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. + /// + public class Position : IEquatable + { + private readonly int pos; + + public Position(int pos) + { + this.pos = pos; + } + + public int Value + { + get { return pos; } + } + + public static Position operator +(Position a, Position b) + { + return new Position(a.pos + b.pos); + } + + public static Position operator -(Position a, Position b) + { + return new Position(a.pos - b.pos); + } + + public static bool operator ==(Position a, Position b) + { + if (ReferenceEquals(a, b)) + return true; + if (ReferenceEquals(a, null)) + return false; + if (ReferenceEquals(b, null)) + return false; + return a.pos == b.pos; + } + + public static bool operator !=(Position a, Position b) + { + return !(a == b); + } + + public static bool operator >(Position a, Position b) + { + return a.Value > b.Value; + } + + public static bool operator <(Position a, Position b) + { + return a.Value < b.Value; + } + + public static Position Min(Position a, Position b) + { + if (a < b) + return a; + return b; + } + + public static Position Max(Position a, Position b) + { + if (a > b) + return a; + return b; + } + + public override string ToString() + { + return "Postion: " + pos; + } + + public bool Equals(Position other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return pos == other.pos; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((Position)obj); + } + + public override int GetHashCode() + { + return pos; + } + } + + /// + /// Class containing key and modifiers + /// + /// 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), S + /// CK_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, SCMOD_SHIFT, SCMOD_META, and SCMOD_SUPER. + /// On OS X, the Command key is mapped to SCMOD_CTRL and the Control key to SCMOD_META.SCMOD_SUPER is only available on GTK+ which is commonly the Windows key. + /// If you are building a table, you might want to use SCMOD_NORM, which has the value 0, to mean no modifiers. + /// + public class KeyModifier + { + private readonly int value; + + /// + /// 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, SCMOD_SHIFT, SCMOD_META, and SCMOD_SUPER. + /// On OS X, the Command key is mapped to SCMOD_CTRL and the Control key to SCMOD_META.SCMOD_SUPER is only available on GTK+ which is commonly the Windows key. + /// If you are building a table, you might want to use SCMOD_NORM, which has the value 0, to mean no modifiers. + /// + public KeyModifier(SciMsg SCK_KeyCode, SciMsg SCMOD_modifier) + { + value = (int) SCK_KeyCode | ((int) SCMOD_modifier << 16); + } + + public int Value + { + get { return Value; } + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct CharacterRange + { + public CharacterRange(int cpmin, int cpmax) { cpMin = cpmin; cpMax = cpmax; } + public int cpMin; + public int cpMax; + } + + public class Cells + { + char[] charactersAndStyles; + + public Cells(char[] charactersAndStyles) + { + this.charactersAndStyles = charactersAndStyles; + } + + public char[] Value { get { return charactersAndStyles; } } + } + + public class TextRange : IDisposable + { + Sci_TextRange _sciTextRange; + IntPtr _ptrSciTextRange; + bool _disposed = false; + + public TextRange(CharacterRange chrRange, int stringCapacity) + { + _sciTextRange.chrg = chrRange; + _sciTextRange.lpstrText = Marshal.AllocHGlobal(stringCapacity); + } + public TextRange(int cpmin, int cpmax, int stringCapacity) + { + _sciTextRange.chrg.cpMin = cpmin; + _sciTextRange.chrg.cpMax = cpmax; + _sciTextRange.lpstrText = Marshal.AllocHGlobal(stringCapacity); + } + + [StructLayout(LayoutKind.Sequential)] + struct Sci_TextRange + { + public CharacterRange chrg; + public IntPtr lpstrText; + } + + public IntPtr NativePointer { get { _initNativeStruct(); return _ptrSciTextRange; } } + + public string lpstrText { get { _readNativeStruct(); return Marshal.PtrToStringAnsi(_sciTextRange.lpstrText); } } + + public CharacterRange chrg { get { _readNativeStruct(); return _sciTextRange.chrg; } set { _sciTextRange.chrg = value; _initNativeStruct(); } } + + void _initNativeStruct() + { + if (_ptrSciTextRange == IntPtr.Zero) + _ptrSciTextRange = Marshal.AllocHGlobal(Marshal.SizeOf(_sciTextRange)); + Marshal.StructureToPtr(_sciTextRange, _ptrSciTextRange, false); + } + + void _readNativeStruct() + { + if (_ptrSciTextRange != IntPtr.Zero) + _sciTextRange = (Sci_TextRange)Marshal.PtrToStructure(_ptrSciTextRange, typeof(Sci_TextRange)); + } + + public void Dispose() + { + if (!_disposed) + { + if (_sciTextRange.lpstrText != IntPtr.Zero) Marshal.FreeHGlobal(_sciTextRange.lpstrText); + if (_ptrSciTextRange != IntPtr.Zero) Marshal.FreeHGlobal(_ptrSciTextRange); + _disposed = true; + } + } + + ~TextRange() + { + Dispose(); + } + } + + + /* ++Autogenerated -- start of section automatically generated from Scintilla.iface */ + /* --Autogenerated -- end of section automatically generated from Scintilla.iface */ + +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/IScintillaGateway.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/IScintillaGateway.cs new file mode 100644 index 000000000000..5c1648862592 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/IScintillaGateway.cs @@ -0,0 +1,2582 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +using System; +using static Kbg.NppPluginNET.PluginInfrastructure.Win32; + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + + /// + /// This it the plugin-writers primary interface to Notepad++/Scintilla. + /// It takes away all the complexity with command numbers and Int-pointer casting. + /// + /// See http://www.scintilla.org/ScintillaDoc.html for further details. + /// + public interface IScintillaGateway + { + /// + /// Change the Scintilla window handle for this Gateway + /// and return the previous handle for potentially final updates. + /// + /// + /// + IntPtr SetScintillaHandle(IntPtr newHandle); + + /// + /// Switch the handle between main and second window handle. + /// + void SwitchScintillaHandle(); + + /// + /// Return the current Scintilla window handle + /// + /// + IntPtr GetScintillaHandle(); + + IntPtr CurrentBufferID { get; set; } + + int GetSelectionLength(); + void AppendTextAndMoveCursor(string text); + void InsertTextAndMoveCursor(string text); + void SelectCurrentLine(); + void ClearSelectionToCursor(); + + /// + /// Get the current line from the current position + /// + int GetCurrentLineNumber(); + + /// + /// Get the scroll information for the current Scintilla window. + /// + /// Arguments for the scroll information such as tracking + /// Which scroll bar information are you looking for + /// A ScrollInfo struct with information of the current scroll state + ScrollInfo GetScrollInfo(ScrollInfoMask mask = ScrollInfoMask.SIF_ALL, ScrollInfoBar scrollBar = ScrollInfoBar.SB_BOTH); + + /* ++Autogenerated -- start of section automatically generated from Scintilla.iface */ + /// Add text to the document at current position. (Scintilla feature 2001) + unsafe void AddText(int length, string text); + + /// Add array of cells to document. (Scintilla feature 2002) + unsafe void AddStyledText(int length, Cells c); + + /// Insert string at a position. (Scintilla feature 2003) + unsafe void InsertText(Position pos, string text); + + /// Change the text that is being inserted in response to SC_MOD_INSERTCHECK (Scintilla feature 2672) + unsafe void ChangeInsertion(int length, string text); + + /// Delete all text in the document. (Scintilla feature 2004) + void ClearAll(); + + /// Delete a range of text in the document. (Scintilla feature 2645) + void DeleteRange(Position pos, int deleteLength); + + /// Set all style bytes to 0, remove all folding information. (Scintilla feature 2005) + void ClearDocumentStyle(); + + /// Returns the number of bytes in the document. (Scintilla feature 2006) + int GetLength(); + + /// Returns the character byte at the position. (Scintilla feature 2007) + int GetCharAt(Position pos); + + /// Returns the position of the caret. (Scintilla feature 2008) + Position GetCurrentPos(); + + /// Returns the position of the opposite end of the selection to the caret. (Scintilla feature 2009) + Position GetAnchor(); + + /// Returns the style byte at the position. (Scintilla feature 2010) + int GetStyleAt(Position pos); + + /// Redoes the next action on the undo history. (Scintilla feature 2011) + void Redo(); + + /// + /// Choose between collecting actions into the undo + /// history and discarding them. + /// (Scintilla feature 2012) + /// + void SetUndoCollection(bool collectUndo); + + /// Select all the text in the document. (Scintilla feature 2013) + void SelectAll(); + + /// + /// Remember the current position in the undo history as the position + /// at which the document was saved. + /// (Scintilla feature 2014) + /// + void SetSavePoint(); + + /// + /// Retrieve a buffer of cells. + /// Returns the number of bytes in the buffer not including terminating NULs. + /// (Scintilla feature 2015) + /// + int GetStyledText(TextRange tr); + + /// Are there any redoable actions in the undo history? (Scintilla feature 2016) + bool CanRedo(); + + /// Retrieve the line number at which a particular marker is located. (Scintilla feature 2017) + int MarkerLineFromHandle(int handle); + + /// Delete a marker. (Scintilla feature 2018) + void MarkerDeleteHandle(int handle); + + /// Is undo history being collected? (Scintilla feature 2019) + bool GetUndoCollection(); + + /// + /// Are white space characters currently visible? + /// Returns one of SCWS_* constants. + /// (Scintilla feature 2020) + /// + int GetViewWS(); + + /// Make white space characters invisible, always visible or visible outside indentation. (Scintilla feature 2021) + void SetViewWS(int viewWS); + + /// Find the position from a point within the window. (Scintilla feature 2022) + Position PositionFromPoint(int x, int y); + + /// + /// Find the position from a point within the window but return + /// INVALID_POSITION if not close to text. + /// (Scintilla feature 2023) + /// + Position PositionFromPointClose(int x, int y); + + /// Set caret to start of a line and ensure it is visible. (Scintilla feature 2024) + void GotoLine(int line); + + /// Set caret to a position and ensure it is visible. (Scintilla feature 2025) + void GotoPos(Position pos); + + /// + /// Set the selection anchor to a position. The anchor is the opposite + /// end of the selection from the caret. + /// (Scintilla feature 2026) + /// + void SetAnchor(Position posAnchor); + + /// + /// Retrieve the text of the line containing the caret. + /// Returns the index of the caret on the line. + /// Result is NUL-terminated. + /// (Scintilla feature 2027) + /// + unsafe string GetCurLine(int length); + + /// Retrieve the position of the last correctly styled character. (Scintilla feature 2028) + Position GetEndStyled(); + + /// Convert all line endings in the document to one mode. (Scintilla feature 2029) + void ConvertEOLs(int eolMode); + + /// Retrieve the current end of line mode - one of CRLF, CR, or LF. (Scintilla feature 2030) + int GetEOLMode(); + + /// Set the current end of line mode. (Scintilla feature 2031) + void SetEOLMode(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. + /// (Scintilla feature 2032) + /// + void StartStyling(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. + /// (Scintilla feature 2033) + /// + void SetStyling(int length, int style); + + /// Is drawing done first into a buffer or direct to the screen? (Scintilla feature 2034) + bool GetBufferedDraw(); + + /// + /// If drawing is buffered then each line of text is drawn into a bitmap buffer + /// before drawing it to the screen to avoid flicker. + /// (Scintilla feature 2035) + /// + void SetBufferedDraw(bool buffered); + + /// Change the visible size of a tab to be a multiple of the width of a space character. (Scintilla feature 2036) + void SetTabWidth(int tabWidth); + + /// Retrieve the visible size of a tab. (Scintilla feature 2121) + int GetTabWidth(); + + /// Clear explicit tabstops on a line. (Scintilla feature 2675) + void ClearTabStops(int line); + + /// Add an explicit tab stop for a line. (Scintilla feature 2676) + void AddTabStop(int line, int x); + + /// Find the next explicit tab stop position on a line after a position. (Scintilla feature 2677) + int GetNextTabStop(int line, int x); + + /// + /// 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. + /// (Scintilla feature 2037) + /// + void SetCodePage(int codePage); + + /// Is the IME displayed in a winow or inline? (Scintilla feature 2678) + int GetIMEInteraction(); + + /// Choose to display the the IME in a winow or inline. (Scintilla feature 2679) + void SetIMEInteraction(int imeInteraction); + + /// Set the symbol used for a particular marker number. (Scintilla feature 2040) + void MarkerDefine(int markerNumber, int markerSymbol); + + /// Set the foreground colour used for a particular marker number. (Scintilla feature 2041) + void MarkerSetFore(int markerNumber, Colour fore); + + /// Set the background colour used for a particular marker number. (Scintilla feature 2042) + void MarkerSetBack(int markerNumber, Colour back); + + /// Set the background colour used for a particular marker number when its folding block is selected. (Scintilla feature 2292) + void MarkerSetBackSelected(int markerNumber, Colour back); + + /// Enable/disable highlight for current folding bloc (smallest one that contains the caret) (Scintilla feature 2293) + void MarkerEnableHighlight(bool enabled); + + /// Add a marker to a line, returning an ID which can be used to find or delete the marker. (Scintilla feature 2043) + int MarkerAdd(int line, int markerNumber); + + /// Delete a marker from a line. (Scintilla feature 2044) + void MarkerDelete(int line, int markerNumber); + + /// Delete all markers with a particular number from all lines. (Scintilla feature 2045) + void MarkerDeleteAll(int markerNumber); + + /// Get a bit mask of all the markers set on a line. (Scintilla feature 2046) + int MarkerGet(int line); + + /// + /// Find the next line at or after lineStart that includes a marker in mask. + /// Return -1 when no more lines. + /// (Scintilla feature 2047) + /// + int MarkerNext(int lineStart, int markerMask); + + /// Find the previous line before lineStart that includes a marker in mask. (Scintilla feature 2048) + int MarkerPrevious(int lineStart, int markerMask); + + /// Define a marker from a pixmap. (Scintilla feature 2049) + unsafe void MarkerDefinePixmap(int markerNumber, string pixmap); + + /// Add a set of markers to a line. (Scintilla feature 2466) + void MarkerAddSet(int line, int set); + + /// Set the alpha used for a marker that is drawn in the text area, not the margin. (Scintilla feature 2476) + void MarkerSetAlpha(int markerNumber, int alpha); + + /// Set a margin to be either numeric or symbolic. (Scintilla feature 2240) + void SetMarginTypeN(int margin, int marginType); + + /// Retrieve the type of a margin. (Scintilla feature 2241) + int GetMarginTypeN(int margin); + + /// Set the width of a margin to a width expressed in pixels. (Scintilla feature 2242) + void SetMarginWidthN(int margin, int pixelWidth); + + /// Retrieve the width of a margin in pixels. (Scintilla feature 2243) + int GetMarginWidthN(int margin); + + /// Set a mask that determines which markers are displayed in a margin. (Scintilla feature 2244) + void SetMarginMaskN(int margin, int mask); + + /// Retrieve the marker mask of a margin. (Scintilla feature 2245) + int GetMarginMaskN(int margin); + + /// Make a margin sensitive or insensitive to mouse clicks. (Scintilla feature 2246) + void SetMarginSensitiveN(int margin, bool sensitive); + + /// Retrieve the mouse click sensitivity of a margin. (Scintilla feature 2247) + bool GetMarginSensitiveN(int margin); + + /// Set the cursor shown when the mouse is inside a margin. (Scintilla feature 2248) + void SetMarginCursorN(int margin, int cursor); + + /// Retrieve the cursor shown in a margin. (Scintilla feature 2249) + int GetMarginCursorN(int margin); + + /// Clear all the styles and make equivalent to the global default style. (Scintilla feature 2050) + void StyleClearAll(); + + /// Set the foreground colour of a style. (Scintilla feature 2051) + void StyleSetFore(int style, Colour fore); + + /// Set the background colour of a style. (Scintilla feature 2052) + void StyleSetBack(int style, Colour back); + + /// Set a style to be bold or not. (Scintilla feature 2053) + void StyleSetBold(int style, bool bold); + + /// Set a style to be italic or not. (Scintilla feature 2054) + void StyleSetItalic(int style, bool italic); + + /// Set the size of characters of a style. (Scintilla feature 2055) + void StyleSetSize(int style, int sizePoints); + + /// Set the font of a style. (Scintilla feature 2056) + unsafe void StyleSetFont(int style, string fontName); + + /// Set a style to have its end of line filled or not. (Scintilla feature 2057) + void StyleSetEOLFilled(int style, bool filled); + + /// Reset the default style to its state at startup (Scintilla feature 2058) + void StyleResetDefault(); + + /// Set a style to be underlined or not. (Scintilla feature 2059) + void StyleSetUnderline(int style, bool underline); + + /// Get the foreground colour of a style. (Scintilla feature 2481) + Colour StyleGetFore(int style); + + /// Get the background colour of a style. (Scintilla feature 2482) + Colour StyleGetBack(int style); + + /// Get is a style bold or not. (Scintilla feature 2483) + bool StyleGetBold(int style); + + /// Get is a style italic or not. (Scintilla feature 2484) + bool StyleGetItalic(int style); + + /// Get the size of characters of a style. (Scintilla feature 2485) + int StyleGetSize(int style); + + /// + /// Get the font of a style. + /// Returns the length of the fontName + /// Result is NUL-terminated. + /// (Scintilla feature 2486) + /// + unsafe string StyleGetFont(int style); + + /// Get is a style to have its end of line filled or not. (Scintilla feature 2487) + bool StyleGetEOLFilled(int style); + + /// Get is a style underlined or not. (Scintilla feature 2488) + bool StyleGetUnderline(int style); + + /// Get is a style mixed case, or to force upper or lower case. (Scintilla feature 2489) + int StyleGetCase(int style); + + /// Get the character get of the font in a style. (Scintilla feature 2490) + int StyleGetCharacterSet(int style); + + /// Get is a style visible or not. (Scintilla feature 2491) + bool StyleGetVisible(int style); + + /// + /// Get is a style changeable or not (read only). + /// Experimental feature, currently buggy. + /// (Scintilla feature 2492) + /// + bool StyleGetChangeable(int style); + + /// Get is a style a hotspot or not. (Scintilla feature 2493) + bool StyleGetHotSpot(int style); + + /// Set a style to be mixed case, or to force upper or lower case. (Scintilla feature 2060) + void StyleSetCase(int style, int caseForce); + + /// Set the size of characters of a style. Size is in points multiplied by 100. (Scintilla feature 2061) + void StyleSetSizeFractional(int style, int caseForce); + + /// Get the size of characters of a style in points multiplied by 100 (Scintilla feature 2062) + int StyleGetSizeFractional(int style); + + /// Set the weight of characters of a style. (Scintilla feature 2063) + void StyleSetWeight(int style, int weight); + + /// Get the weight of characters of a style. (Scintilla feature 2064) + int StyleGetWeight(int style); + + /// Set the character set of the font in a style. (Scintilla feature 2066) + void StyleSetCharacterSet(int style, int characterSet); + + /// Set a style to be a hotspot or not. (Scintilla feature 2409) + void StyleSetHotSpot(int style, bool hotspot); + + /// Set the foreground colour of the main and additional selections and whether to use this setting. (Scintilla feature 2067) + void SetSelFore(bool useSetting, Colour fore); + + /// Set the background colour of the main and additional selections and whether to use this setting. (Scintilla feature 2068) + void SetSelBack(bool useSetting, Colour back); + + /// Get the alpha of the selection. (Scintilla feature 2477) + int GetSelAlpha(); + + /// Set the alpha of the selection. (Scintilla feature 2478) + void SetSelAlpha(int alpha); + + /// Is the selection end of line filled? (Scintilla feature 2479) + bool GetSelEOLFilled(); + + /// Set the selection to have its end of line filled or not. (Scintilla feature 2480) + void SetSelEOLFilled(bool filled); + + /// Set the foreground colour of the caret. (Scintilla feature 2069) + void SetCaretFore(Colour fore); + + /// When key+modifier combination km is pressed perform msg. (Scintilla feature 2070) + void AssignCmdKey(KeyModifier km, int msg); + + /// When key+modifier combination km is pressed do nothing. (Scintilla feature 2071) + void ClearCmdKey(KeyModifier km); + + /// Drop all key mappings. (Scintilla feature 2072) + void ClearAllCmdKeys(); + + /// Set the styles for a segment of the document. (Scintilla feature 2073) + unsafe void SetStylingEx(int length, string styles); + + /// Set a style to be visible or not. (Scintilla feature 2074) + void StyleSetVisible(int style, bool visible); + + /// Get the time in milliseconds that the caret is on and off. (Scintilla feature 2075) + int GetCaretPeriod(); + + /// Get the time in milliseconds that the caret is on and off. 0 = steady on. (Scintilla feature 2076) + void SetCaretPeriod(int periodMilliseconds); + + /// + /// Set the set of characters making up words for when moving or selecting by word. + /// First sets defaults like SetCharsDefault. + /// (Scintilla feature 2077) + /// + unsafe void SetWordChars(string characters); + + /// + /// Get the set of characters making up words for when moving or selecting by word. + /// Returns the number of characters + /// (Scintilla feature 2646) + /// + unsafe string GetWordChars(); + + /// + /// Start a sequence of actions that is undone and redone as a unit. + /// May be nested. + /// (Scintilla feature 2078) + /// + void BeginUndoAction(); + + /// End a sequence of actions that is undone and redone as a unit. (Scintilla feature 2079) + void EndUndoAction(); + + /// Set an indicator to plain, squiggle or TT. (Scintilla feature 2080) + void IndicSetStyle(int indic, int style); + + /// Retrieve the style of an indicator. (Scintilla feature 2081) + int IndicGetStyle(int indic); + + /// Set the foreground colour of an indicator. (Scintilla feature 2082) + void IndicSetFore(int indic, Colour fore); + + /// Retrieve the foreground colour of an indicator. (Scintilla feature 2083) + Colour IndicGetFore(int indic); + + /// Set an indicator to draw under text or over(default). (Scintilla feature 2510) + void IndicSetUnder(int indic, bool under); + + /// Retrieve whether indicator drawn under or over text. (Scintilla feature 2511) + bool IndicGetUnder(int indic); + + /// Set a hover indicator to plain, squiggle or TT. (Scintilla feature 2680) + void IndicSetHoverStyle(int indic, int style); + + /// Retrieve the hover style of an indicator. (Scintilla feature 2681) + int IndicGetHoverStyle(int indic); + + /// Set the foreground hover colour of an indicator. (Scintilla feature 2682) + void IndicSetHoverFore(int indic, Colour fore); + + /// Retrieve the foreground hover colour of an indicator. (Scintilla feature 2683) + Colour IndicGetHoverFore(int indic); + + /// Set the attributes of an indicator. (Scintilla feature 2684) + void IndicSetFlags(int indic, int flags); + + /// Retrieve the attributes of an indicator. (Scintilla feature 2685) + int IndicGetFlags(int indic); + + /// Set the foreground colour of all whitespace and whether to use this setting. (Scintilla feature 2084) + void SetWhitespaceFore(bool useSetting, Colour fore); + + /// Set the background colour of all whitespace and whether to use this setting. (Scintilla feature 2085) + void SetWhitespaceBack(bool useSetting, Colour back); + + /// Set the size of the dots used to mark space characters. (Scintilla feature 2086) + void SetWhitespaceSize(int size); + + /// Get the size of the dots used to mark space characters. (Scintilla feature 2087) + int GetWhitespaceSize(); + + /// + /// 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. + /// (Scintilla feature 2090) + /// + void SetStyleBits(int bits); + + /// Retrieve number of bits in style bytes used to hold the lexical state. (Scintilla feature 2091) + int GetStyleBits(); + + /// Used to hold extra styling information for each line. (Scintilla feature 2092) + void SetLineState(int line, int state); + + /// Retrieve the extra styling information for a line. (Scintilla feature 2093) + int GetLineState(int line); + + /// Retrieve the last line number that has line state. (Scintilla feature 2094) + int GetMaxLineState(); + + /// Is the background of the line containing the caret in a different colour? (Scintilla feature 2095) + bool GetCaretLineVisible(); + + /// Display the background of the line containing the caret in a different colour. (Scintilla feature 2096) + void SetCaretLineVisible(bool show); + + /// Get the colour of the background of the line containing the caret. (Scintilla feature 2097) + Colour GetCaretLineBack(); + + /// Set the colour of the background of the line containing the caret. (Scintilla feature 2098) + void SetCaretLineBack(Colour back); + + /// + /// Set a style to be changeable or not (read only). + /// Experimental feature, currently buggy. + /// (Scintilla feature 2099) + /// + void StyleSetChangeable(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. + /// (Scintilla feature 2100) + /// + unsafe void AutoCShow(int lenEntered, string itemList); + + /// Remove the auto-completion list from the screen. (Scintilla feature 2101) + void AutoCCancel(); + + /// Is there an auto-completion list visible? (Scintilla feature 2102) + bool AutoCActive(); + + /// Retrieve the position of the caret when the auto-completion list was displayed. (Scintilla feature 2103) + Position AutoCPosStart(); + + /// User has selected an item so remove the list and insert the selection. (Scintilla feature 2104) + void AutoCComplete(); + + /// Define a set of character that when typed cancel the auto-completion list. (Scintilla feature 2105) + unsafe void AutoCStops(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. + /// (Scintilla feature 2106) + /// + void AutoCSetSeparator(int separatorCharacter); + + /// Retrieve the auto-completion list separator character. (Scintilla feature 2107) + int AutoCGetSeparator(); + + /// Select the item in the auto-completion list that starts with a string. (Scintilla feature 2108) + unsafe void AutoCSelect(string text); + + /// + /// Should the auto-completion list be cancelled if the user backspaces to a + /// position before where the box was created. + /// (Scintilla feature 2110) + /// + void AutoCSetCancelAtStart(bool cancel); + + /// Retrieve whether auto-completion cancelled by backspacing before start. (Scintilla feature 2111) + bool AutoCGetCancelAtStart(); + + /// + /// Define a set of characters that when typed will cause the autocompletion to + /// choose the selected item. + /// (Scintilla feature 2112) + /// + unsafe void AutoCSetFillUps(string characterSet); + + /// Should a single item auto-completion list automatically choose the item. (Scintilla feature 2113) + void AutoCSetChooseSingle(bool chooseSingle); + + /// Retrieve whether a single item auto-completion list automatically choose the item. (Scintilla feature 2114) + bool AutoCGetChooseSingle(); + + /// Set whether case is significant when performing auto-completion searches. (Scintilla feature 2115) + void AutoCSetIgnoreCase(bool ignoreCase); + + /// Retrieve state of ignore case flag. (Scintilla feature 2116) + bool AutoCGetIgnoreCase(); + + /// Display a list of strings and send notification when user chooses one. (Scintilla feature 2117) + unsafe void UserListShow(int listType, string itemList); + + /// Set whether or not autocompletion is hidden automatically when nothing matches. (Scintilla feature 2118) + void AutoCSetAutoHide(bool autoHide); + + /// Retrieve whether or not autocompletion is hidden automatically when nothing matches. (Scintilla feature 2119) + bool AutoCGetAutoHide(); + + /// + /// Set whether or not autocompletion deletes any word characters + /// after the inserted text upon completion. + /// (Scintilla feature 2270) + /// + void AutoCSetDropRestOfWord(bool dropRestOfWord); + + /// + /// Retrieve whether or not autocompletion deletes any word characters + /// after the inserted text upon completion. + /// (Scintilla feature 2271) + /// + bool AutoCGetDropRestOfWord(); + + /// Register an XPM image for use in autocompletion lists. (Scintilla feature 2405) + unsafe void RegisterImage(int type, string xpmData); + + /// Clear all the registered XPM images. (Scintilla feature 2408) + void ClearRegisteredImages(); + + /// Retrieve the auto-completion list type-separator character. (Scintilla feature 2285) + int AutoCGetTypeSeparator(); + + /// + /// Change the type-separator character in the string setting up an auto-completion list. + /// Default is '?' but can be changed if items contain '?'. + /// (Scintilla feature 2286) + /// + void AutoCSetTypeSeparator(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. + /// (Scintilla feature 2208) + /// + void AutoCSetMaxWidth(int characterCount); + + /// Get the maximum width, in characters, of auto-completion and user lists. (Scintilla feature 2209) + int AutoCGetMaxWidth(); + + /// + /// Set the maximum height, in rows, of auto-completion and user lists. + /// The default is 5 rows. + /// (Scintilla feature 2210) + /// + void AutoCSetMaxHeight(int rowCount); + + /// Set the maximum height, in rows, of auto-completion and user lists. (Scintilla feature 2211) + int AutoCGetMaxHeight(); + + /// Set the number of spaces used for one level of indentation. (Scintilla feature 2122) + void SetIndent(int indentSize); + + /// Retrieve indentation size. (Scintilla feature 2123) + int GetIndent(); + + /// + /// Indentation will only use space characters if useTabs is false, otherwise + /// it will use a combination of tabs and spaces. + /// (Scintilla feature 2124) + /// + void SetUseTabs(bool useTabs); + + /// Retrieve whether tabs will be used in indentation. (Scintilla feature 2125) + bool GetUseTabs(); + + /// Change the indentation of a line to a number of columns. (Scintilla feature 2126) + void SetLineIndentation(int line, int indentSize); + + /// Retrieve the number of columns that a line is indented. (Scintilla feature 2127) + int GetLineIndentation(int line); + + /// Retrieve the position before the first non indentation character on a line. (Scintilla feature 2128) + Position GetLineIndentPosition(int line); + + /// Retrieve the column number of a position, taking tab width into account. (Scintilla feature 2129) + int GetColumn(Position pos); + + /// Count characters between two positions. (Scintilla feature 2633) + int CountCharacters(int startPos, int endPos); + + /// Show or hide the horizontal scroll bar. (Scintilla feature 2130) + void SetHScrollBar(bool show); + + /// Is the horizontal scroll bar visible? (Scintilla feature 2131) + bool GetHScrollBar(); + + /// Show or hide indentation guides. (Scintilla feature 2132) + void SetIndentationGuides(int indentView); + + /// Are the indentation guides visible? (Scintilla feature 2133) + int GetIndentationGuides(); + + /// + /// Set the highlighted indentation guide column. + /// 0 = no highlighted guide. + /// (Scintilla feature 2134) + /// + void SetHighlightGuide(int column); + + /// Get the highlighted indentation guide column. (Scintilla feature 2135) + int GetHighlightGuide(); + + /// Get the position after the last visible characters on a line. (Scintilla feature 2136) + Position GetLineEndPosition(int line); + + /// Get the code page used to interpret the bytes of the document as characters. (Scintilla feature 2137) + int GetCodePage(); + + /// Get the foreground colour of the caret. (Scintilla feature 2138) + Colour GetCaretFore(); + + /// In read-only mode? (Scintilla feature 2140) + bool GetReadOnly(); + + /// Sets the position of the caret. (Scintilla feature 2141) + void SetCurrentPos(Position pos); + + /// Sets the position that starts the selection - this becomes the anchor. (Scintilla feature 2142) + void SetSelectionStart(Position pos); + + /// Returns the position at the start of the selection. (Scintilla feature 2143) + Position GetSelectionStart(); + + /// Sets the position that ends the selection - this becomes the currentPosition. (Scintilla feature 2144) + void SetSelectionEnd(Position pos); + + /// Returns the position at the end of the selection. (Scintilla feature 2145) + Position GetSelectionEnd(); + + /// Set caret to a position, while removing any existing selection. (Scintilla feature 2556) + void SetEmptySelection(Position pos); + + /// Sets the print magnification added to the point size of each style for printing. (Scintilla feature 2146) + void SetPrintMagnification(int magnification); + + /// Returns the print magnification. (Scintilla feature 2147) + int GetPrintMagnification(); + + /// Modify colours when printing for clearer printed text. (Scintilla feature 2148) + void SetPrintColourMode(int mode); + + /// Returns the print colour mode. (Scintilla feature 2149) + int GetPrintColourMode(); + + /// Find some text in the document. (Scintilla feature 2150) + Position FindText(int flags, TextToFind ft); + + /// Retrieve the display line at the top of the display. (Scintilla feature 2152) + int GetFirstVisibleLine(); + + /// + /// Retrieve the contents of a line. + /// Returns the length of the line. + /// (Scintilla feature 2153) + /// + unsafe string GetLine(int line); + + /// Returns the number of lines in the document. There is always at least one. (Scintilla feature 2154) + int GetLineCount(); + + /// Sets the size in pixels of the left margin. (Scintilla feature 2155) + void SetMarginLeft(int pixelWidth); + + /// Returns the size in pixels of the left margin. (Scintilla feature 2156) + int GetMarginLeft(); + + /// Sets the size in pixels of the right margin. (Scintilla feature 2157) + void SetMarginRight(int pixelWidth); + + /// Returns the size in pixels of the right margin. (Scintilla feature 2158) + int GetMarginRight(); + + /// Is the document different from when it was last saved? (Scintilla feature 2159) + bool GetModify(); + + /// Select a range of text. (Scintilla feature 2160) + void SetSel(Position start, Position end); + + /// + /// Retrieve the selected text. + /// Return the length of the text. + /// Result is NUL-terminated. + /// (Scintilla feature 2161) + /// + unsafe string GetSelText(); + + /// + /// Retrieve a range of text. + /// Return the length of the text. + /// (Scintilla feature 2162) + /// + int GetTextRange(TextRange tr); + + /// Draw the selection in normal style or with selection highlighted. (Scintilla feature 2163) + void HideSelection(bool normal); + + /// Retrieve the x value of the point in the window where a position is displayed. (Scintilla feature 2164) + int PointXFromPosition(Position pos); + + /// Retrieve the y value of the point in the window where a position is displayed. (Scintilla feature 2165) + int PointYFromPosition(Position pos); + + /// Retrieve the line containing a position. (Scintilla feature 2166) + int LineFromPosition(Position pos); + + /// Retrieve the position at the start of a line. (Scintilla feature 2167) + Position PositionFromLine(int line); + + /// Scroll horizontally and vertically. (Scintilla feature 2168) + void LineScroll(int columns, int lines); + + /// Ensure the caret is visible. (Scintilla feature 2169) + void ScrollCaret(); + + /// + /// Scroll the argument positions and the range between them into view giving + /// priority to the primary position then the secondary position. + /// This may be used to make a search match visible. + /// (Scintilla feature 2569) + /// + void ScrollRange(Position secondary, Position primary); + + /// Replace the selected text with the argument text. (Scintilla feature 2170) + unsafe void ReplaceSel(string text); + + /// Set to read only or read write. (Scintilla feature 2171) + void SetReadOnly(bool readOnly); + + /// Null operation. (Scintilla feature 2172) + void Null(); + + /// Will a paste succeed? (Scintilla feature 2173) + bool CanPaste(); + + /// Are there any undoable actions in the undo history? (Scintilla feature 2174) + bool CanUndo(); + + /// Delete the undo history. (Scintilla feature 2175) + void EmptyUndoBuffer(); + + /// Undo one action in the undo history. (Scintilla feature 2176) + void Undo(); + + /// Cut the selection to the clipboard. (Scintilla feature 2177) + void Cut(); + + /// Copy the selection to the clipboard. (Scintilla feature 2178) + void Copy(); + + /// Paste the contents of the clipboard into the document replacing the selection. (Scintilla feature 2179) + void Paste(); + + /// Clear the selection. (Scintilla feature 2180) + void Clear(); + + /// Replace the contents of the document with the argument text. (Scintilla feature 2181) + unsafe void SetText(string text); + + /// + /// Retrieve all the text in the document. + /// Returns number of characters retrieved. + /// Result is NUL-terminated. + /// (Scintilla feature 2182) + /// + unsafe string GetText(int length); + + /// Retrieve the number of characters in the document. (Scintilla feature 2183) + int GetTextLength(); + + /// Retrieve a pointer to a function that processes messages for this Scintilla. (Scintilla feature 2184) + IntPtr GetDirectFunction(); + + /// + /// Retrieve a pointer value to use as the first argument when calling + /// the function returned by GetDirectFunction. + /// (Scintilla feature 2185) + /// + IntPtr GetDirectPointer(); + + /// Set to overtype (true) or insert mode. (Scintilla feature 2186) + void SetOvertype(bool overtype); + + /// Returns true if overtype mode is active otherwise false is returned. (Scintilla feature 2187) + bool GetOvertype(); + + /// Set the width of the insert mode caret. (Scintilla feature 2188) + void SetCaretWidth(int pixelWidth); + + /// Returns the width of the insert mode caret. (Scintilla feature 2189) + int GetCaretWidth(); + + /// + /// Sets the position that starts the target which is used for updating the + /// document without affecting the scroll position. + /// (Scintilla feature 2190) + /// + void SetTargetStart(Position pos); + + /// Get the position that starts the target. (Scintilla feature 2191) + Position GetTargetStart(); + + /// + /// Sets the position that ends the target which is used for updating the + /// document without affecting the scroll position. + /// (Scintilla feature 2192) + /// + void SetTargetEnd(Position pos); + + /// Get the position that ends the target. (Scintilla feature 2193) + Position GetTargetEnd(); + + /// Sets both the start and end of the target in one call. (Scintilla feature 2686) + void SetTargetRange(Position start, Position end); + + /// Retrieve the text in the target. (Scintilla feature 2687) + unsafe string GetTargetText(); + + /// + /// Replace the target text with the argument text. + /// Text is counted so it can contain NULs. + /// Returns the length of the replacement text. + /// (Scintilla feature 2194) + /// + unsafe int ReplaceTarget(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. + /// (Scintilla feature 2195) + /// + unsafe int ReplaceTargetRE(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. + /// (Scintilla feature 2197) + /// + unsafe int SearchInTarget(int length, string text); + + /// Set the search flags used by SearchInTarget. (Scintilla feature 2198) + void SetSearchFlags(int flags); + + /// Get the search flags used by SearchInTarget. (Scintilla feature 2199) + int GetSearchFlags(); + + /// Show a call tip containing a definition near position pos. (Scintilla feature 2200) + unsafe void CallTipShow(Position pos, string definition); + + /// Remove the call tip from the screen. (Scintilla feature 2201) + void CallTipCancel(); + + /// Is there an active call tip? (Scintilla feature 2202) + bool CallTipActive(); + + /// Retrieve the position where the caret was before displaying the call tip. (Scintilla feature 2203) + Position CallTipPosStart(); + + /// Set the start position in order to change when backspacing removes the calltip. (Scintilla feature 2214) + void CallTipSetPosStart(int posStart); + + /// Highlight a segment of the definition. (Scintilla feature 2204) + void CallTipSetHlt(int start, int end); + + /// Set the background colour for the call tip. (Scintilla feature 2205) + void CallTipSetBack(Colour back); + + /// Set the foreground colour for the call tip. (Scintilla feature 2206) + void CallTipSetFore(Colour fore); + + /// Set the foreground colour for the highlighted part of the call tip. (Scintilla feature 2207) + void CallTipSetForeHlt(Colour fore); + + /// Enable use of STYLE_CALLTIP and set call tip tab size in pixels. (Scintilla feature 2212) + void CallTipUseStyle(int tabSize); + + /// Set position of calltip, above or below text. (Scintilla feature 2213) + void CallTipSetPosition(bool above); + + /// Find the display line of a document line taking hidden lines into account. (Scintilla feature 2220) + int VisibleFromDocLine(int line); + + /// Find the document line of a display line taking hidden lines into account. (Scintilla feature 2221) + int DocLineFromVisible(int lineDisplay); + + /// The number of display lines needed to wrap a document line (Scintilla feature 2235) + int WrapCount(int line); + + /// + /// 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. + /// (Scintilla feature 2222) + /// + void SetFoldLevel(int line, int level); + + /// Retrieve the fold level of a line. (Scintilla feature 2223) + int GetFoldLevel(int line); + + /// Find the last child line of a header line. (Scintilla feature 2224) + int GetLastChild(int line, int level); + + /// Find the parent line of a child line. (Scintilla feature 2225) + int GetFoldParent(int line); + + /// Make a range of lines visible. (Scintilla feature 2226) + void ShowLines(int lineStart, int lineEnd); + + /// Make a range of lines invisible. (Scintilla feature 2227) + void HideLines(int lineStart, int lineEnd); + + /// Is a line visible? (Scintilla feature 2228) + bool GetLineVisible(int line); + + /// Are all lines visible? (Scintilla feature 2236) + bool GetAllLinesVisible(); + + /// Show the children of a header line. (Scintilla feature 2229) + void SetFoldExpanded(int line, bool expanded); + + /// Is a header line expanded? (Scintilla feature 2230) + bool GetFoldExpanded(int line); + + /// Switch a header line between expanded and contracted. (Scintilla feature 2231) + void ToggleFold(int line); + + /// Expand or contract a fold header. (Scintilla feature 2237) + void FoldLine(int line, int action); + + /// Expand or contract a fold header and its children. (Scintilla feature 2238) + void FoldChildren(int line, int action); + + /// Expand a fold header and all children. Use the level argument instead of the line's current level. (Scintilla feature 2239) + void ExpandChildren(int line, int level); + + /// Expand or contract all fold headers. (Scintilla feature 2662) + void FoldAll(int action); + + /// Ensure a particular line is visible by expanding any header line hiding it. (Scintilla feature 2232) + void EnsureVisible(int line); + + /// Set automatic folding behaviours. (Scintilla feature 2663) + void SetAutomaticFold(int automaticFold); + + /// Get automatic folding behaviours. (Scintilla feature 2664) + int GetAutomaticFold(); + + /// Set some style options for folding. (Scintilla feature 2233) + void SetFoldFlags(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. + /// (Scintilla feature 2234) + /// + void EnsureVisibleEnforcePolicy(int line); + + /// Sets whether a tab pressed when caret is within indentation indents. (Scintilla feature 2260) + void SetTabIndents(bool tabIndents); + + /// Does a tab pressed when caret is within indentation indent? (Scintilla feature 2261) + bool GetTabIndents(); + + /// Sets whether a backspace pressed when caret is within indentation unindents. (Scintilla feature 2262) + void SetBackSpaceUnIndents(bool bsUnIndents); + + /// Does a backspace pressed when caret is within indentation unindent? (Scintilla feature 2263) + bool GetBackSpaceUnIndents(); + + /// Sets the time the mouse must sit still to generate a mouse dwell event. (Scintilla feature 2264) + void SetMouseDwellTime(int periodMilliseconds); + + /// Retrieve the time the mouse must sit still to generate a mouse dwell event. (Scintilla feature 2265) + int GetMouseDwellTime(); + + /// Get position of start of word. (Scintilla feature 2266) + int WordStartPosition(Position pos, bool onlyWordCharacters); + + /// Get position of end of word. (Scintilla feature 2267) + int WordEndPosition(Position pos, bool onlyWordCharacters); + + /// Sets whether text is word wrapped. (Scintilla feature 2268) + void SetWrapMode(int mode); + + /// Retrieve whether text is word wrapped. (Scintilla feature 2269) + int GetWrapMode(); + + /// Set the display mode of visual flags for wrapped lines. (Scintilla feature 2460) + void SetWrapVisualFlags(int wrapVisualFlags); + + /// Retrive the display mode of visual flags for wrapped lines. (Scintilla feature 2461) + int GetWrapVisualFlags(); + + /// Set the location of visual flags for wrapped lines. (Scintilla feature 2462) + void SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation); + + /// Retrive the location of visual flags for wrapped lines. (Scintilla feature 2463) + int GetWrapVisualFlagsLocation(); + + /// Set the start indent for wrapped lines. (Scintilla feature 2464) + void SetWrapStartIndent(int indent); + + /// Retrive the start indent for wrapped lines. (Scintilla feature 2465) + int GetWrapStartIndent(); + + /// Sets how wrapped sublines are placed. Default is fixed. (Scintilla feature 2472) + void SetWrapIndentMode(int mode); + + /// Retrieve how wrapped sublines are placed. Default is fixed. (Scintilla feature 2473) + int GetWrapIndentMode(); + + /// Sets the degree of caching of layout information. (Scintilla feature 2272) + void SetLayoutCache(int mode); + + /// Retrieve the degree of caching of layout information. (Scintilla feature 2273) + int GetLayoutCache(); + + /// Sets the document width assumed for scrolling. (Scintilla feature 2274) + void SetScrollWidth(int pixelWidth); + + /// Retrieve the document width assumed for scrolling. (Scintilla feature 2275) + int GetScrollWidth(); + + /// Sets whether the maximum width line displayed is used to set scroll width. (Scintilla feature 2516) + void SetScrollWidthTracking(bool tracking); + + /// Retrieve whether the scroll width tracks wide lines. (Scintilla feature 2517) + bool GetScrollWidthTracking(); + + /// + /// Measure the pixel width of some text in a particular style. + /// NUL terminated text argument. + /// Does not handle tab or control characters. + /// (Scintilla feature 2276) + /// + unsafe int TextWidth(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. + /// (Scintilla feature 2277) + /// + void SetEndAtLastLine(bool endAtLastLine); + + /// + /// Retrieve whether the maximum scroll position has the last + /// line at the bottom of the view. + /// (Scintilla feature 2278) + /// + bool GetEndAtLastLine(); + + /// Retrieve the height of a particular line of text in pixels. (Scintilla feature 2279) + int TextHeight(int line); + + /// Show or hide the vertical scroll bar. (Scintilla feature 2280) + void SetVScrollBar(bool show); + + /// Is the vertical scroll bar visible? (Scintilla feature 2281) + bool GetVScrollBar(); + + /// Append a string to the end of the document without changing the selection. (Scintilla feature 2282) + unsafe void AppendText(int length, string text); + + /// Is drawing done in two phases with backgrounds drawn before foregrounds? (Scintilla feature 2283) + bool GetTwoPhaseDraw(); + + /// + /// 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. + /// (Scintilla feature 2284) + /// + void SetTwoPhaseDraw(bool twoPhase); + + /// How many phases is drawing done in? (Scintilla feature 2673) + int GetPhasesDraw(); + + /// + /// In one phase draw, text is drawn in a series of rectangular blocks with no overlap. + /// In two phase draw, text is drawn in a series of lines allowing runs to overlap horizontally. + /// In multiple phase draw, each element is drawn over the whole drawing area, allowing text + /// to overlap from one line to the next. + /// (Scintilla feature 2674) + /// + void SetPhasesDraw(int phases); + + /// Choose the quality level for text from the FontQuality enumeration. (Scintilla feature 2611) + void SetFontQuality(int fontQuality); + + /// Retrieve the quality level for text. (Scintilla feature 2612) + int GetFontQuality(); + + /// Scroll so that a display line is at the top of the display. (Scintilla feature 2613) + void SetFirstVisibleLine(int lineDisplay); + + /// Change the effect of pasting when there are multiple selections. (Scintilla feature 2614) + void SetMultiPaste(int multiPaste); + + /// Retrieve the effect of pasting when there are multiple selections.. (Scintilla feature 2615) + int GetMultiPaste(); + + /// + /// Retrieve the value of a tag from a regular expression search. + /// Result is NUL-terminated. + /// (Scintilla feature 2616) + /// + unsafe string GetTag(int tagNumber); + + /// Make the target range start and end be the same as the selection range start and end. (Scintilla feature 2287) + void TargetFromSelection(); + + /// Join the lines in the target. (Scintilla feature 2288) + void LinesJoin(); + + /// + /// Split the lines in the target into lines that are less wide than pixelWidth + /// where possible. + /// (Scintilla feature 2289) + /// + void LinesSplit(int pixelWidth); + + /// Set the colours used as a chequerboard pattern in the fold margin (Scintilla feature 2290) + void SetFoldMarginColour(bool useSetting, Colour back); + + /// Set the colours used as a chequerboard pattern in the fold margin (Scintilla feature 2291) + void SetFoldMarginHiColour(bool useSetting, Colour fore); + + /// Move caret down one line. (Scintilla feature 2300) + void LineDown(); + + /// Move caret down one line extending selection to new caret position. (Scintilla feature 2301) + void LineDownExtend(); + + /// Move caret up one line. (Scintilla feature 2302) + void LineUp(); + + /// Move caret up one line extending selection to new caret position. (Scintilla feature 2303) + void LineUpExtend(); + + /// Move caret left one character. (Scintilla feature 2304) + void CharLeft(); + + /// Move caret left one character extending selection to new caret position. (Scintilla feature 2305) + void CharLeftExtend(); + + /// Move caret right one character. (Scintilla feature 2306) + void CharRight(); + + /// Move caret right one character extending selection to new caret position. (Scintilla feature 2307) + void CharRightExtend(); + + /// Move caret left one word. (Scintilla feature 2308) + void WordLeft(); + + /// Move caret left one word extending selection to new caret position. (Scintilla feature 2309) + void WordLeftExtend(); + + /// Move caret right one word. (Scintilla feature 2310) + void WordRight(); + + /// Move caret right one word extending selection to new caret position. (Scintilla feature 2311) + void WordRightExtend(); + + /// Move caret to first position on line. (Scintilla feature 2312) + void Home(); + + /// Move caret to first position on line extending selection to new caret position. (Scintilla feature 2313) + void HomeExtend(); + + /// Move caret to last position on line. (Scintilla feature 2314) + void LineEnd(); + + /// Move caret to last position on line extending selection to new caret position. (Scintilla feature 2315) + void LineEndExtend(); + + /// Move caret to first position in document. (Scintilla feature 2316) + void DocumentStart(); + + /// Move caret to first position in document extending selection to new caret position. (Scintilla feature 2317) + void DocumentStartExtend(); + + /// Move caret to last position in document. (Scintilla feature 2318) + void DocumentEnd(); + + /// Move caret to last position in document extending selection to new caret position. (Scintilla feature 2319) + void DocumentEndExtend(); + + /// Move caret one page up. (Scintilla feature 2320) + void PageUp(); + + /// Move caret one page up extending selection to new caret position. (Scintilla feature 2321) + void PageUpExtend(); + + /// Move caret one page down. (Scintilla feature 2322) + void PageDown(); + + /// Move caret one page down extending selection to new caret position. (Scintilla feature 2323) + void PageDownExtend(); + + /// Switch from insert to overtype mode or the reverse. (Scintilla feature 2324) + void EditToggleOvertype(); + + /// Cancel any modes such as call tip or auto-completion list display. (Scintilla feature 2325) + void Cancel(); + + /// Delete the selection or if no selection, the character before the caret. (Scintilla feature 2326) + void DeleteBack(); + + /// + /// 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. + /// (Scintilla feature 2327) + /// + void Tab(); + + /// Dedent the selected lines. (Scintilla feature 2328) + void BackTab(); + + /// Insert a new line, may use a CRLF, CR or LF depending on EOL mode. (Scintilla feature 2329) + void NewLine(); + + /// Insert a Form Feed character. (Scintilla feature 2330) + void FormFeed(); + + /// + /// Move caret to before first visible character on line. + /// If already there move to first character on line. + /// (Scintilla feature 2331) + /// + void VCHome(); + + /// Like VCHome but extending selection to new caret position. (Scintilla feature 2332) + void VCHomeExtend(); + + /// Magnify the displayed text by increasing the sizes by 1 point. (Scintilla feature 2333) + void ZoomIn(); + + /// Make the displayed text smaller by decreasing the sizes by 1 point. (Scintilla feature 2334) + void ZoomOut(); + + /// Delete the word to the left of the caret. (Scintilla feature 2335) + void DelWordLeft(); + + /// Delete the word to the right of the caret. (Scintilla feature 2336) + void DelWordRight(); + + /// Delete the word to the right of the caret, but not the trailing non-word characters. (Scintilla feature 2518) + void DelWordRightEnd(); + + /// Cut the line containing the caret. (Scintilla feature 2337) + void LineCut(); + + /// Delete the line containing the caret. (Scintilla feature 2338) + void LineDelete(); + + /// Switch the current line with the previous. (Scintilla feature 2339) + void LineTranspose(); + + /// Duplicate the current line. (Scintilla feature 2404) + void LineDuplicate(); + + /// Transform the selection to lower case. (Scintilla feature 2340) + void LowerCase(); + + /// Transform the selection to upper case. (Scintilla feature 2341) + void UpperCase(); + + /// Scroll the document down, keeping the caret visible. (Scintilla feature 2342) + void LineScrollDown(); + + /// Scroll the document up, keeping the caret visible. (Scintilla feature 2343) + void LineScrollUp(); + + /// + /// Delete the selection or if no selection, the character before the caret. + /// Will not delete the character before at the start of a line. + /// (Scintilla feature 2344) + /// + void DeleteBackNotLine(); + + /// Move caret to first position on display line. (Scintilla feature 2345) + void HomeDisplay(); + + /// + /// Move caret to first position on display line extending selection to + /// new caret position. + /// (Scintilla feature 2346) + /// + void HomeDisplayExtend(); + + /// Move caret to last position on display line. (Scintilla feature 2347) + void LineEndDisplay(); + + /// + /// Move caret to last position on display line extending selection to new + /// caret position. + /// (Scintilla feature 2348) + /// + void LineEndDisplayExtend(); + + /// + /// 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)?. + /// (Scintilla feature 2349) + /// + void HomeWrap(); + + /// + /// 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)?. + /// (Scintilla feature 2450) + /// + void HomeWrapExtend(); + + /// + /// 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)?. + /// (Scintilla feature 2451) + /// + void LineEndWrap(); + + /// + /// 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)?. + /// (Scintilla feature 2452) + /// + void LineEndWrapExtend(); + + /// + /// 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)?. + /// (Scintilla feature 2453) + /// + void VCHomeWrap(); + + /// + /// 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)?. + /// (Scintilla feature 2454) + /// + void VCHomeWrapExtend(); + + /// Copy the line containing the caret. (Scintilla feature 2455) + void LineCopy(); + + /// Move the caret inside current view if it's not there already. (Scintilla feature 2401) + void MoveCaretInsideView(); + + /// How many characters are on a line, including end of line characters? (Scintilla feature 2350) + int LineLength(int line); + + /// Highlight the characters at two positions. (Scintilla feature 2351) + void BraceHighlight(Position pos1, Position pos2); + + /// Use specified indicator to highlight matching braces instead of changing their style. (Scintilla feature 2498) + void BraceHighlightIndicator(bool useBraceHighlightIndicator, int indicator); + + /// Highlight the character at a position indicating there is no matching brace. (Scintilla feature 2352) + void BraceBadLight(Position pos); + + /// Use specified indicator to highlight non matching brace instead of changing its style. (Scintilla feature 2499) + void BraceBadLightIndicator(bool useBraceBadLightIndicator, int indicator); + + /// Find the position of a matching brace or INVALID_POSITION if no match. (Scintilla feature 2353) + Position BraceMatch(Position pos); + + /// Are the end of line characters visible? (Scintilla feature 2355) + bool GetViewEOL(); + + /// Make the end of line characters visible or invisible. (Scintilla feature 2356) + void SetViewEOL(bool visible); + + /// Retrieve a pointer to the document object. (Scintilla feature 2357) + IntPtr GetDocPointer(); + + /// Change the document object used. (Scintilla feature 2358) + void SetDocPointer(IntPtr pointer); + + /// Set which document modification events are sent to the container. (Scintilla feature 2359) + void SetModEventMask(int mask); + + /// Retrieve the column number which text should be kept within. (Scintilla feature 2360) + int GetEdgeColumn(); + + /// + /// Set the column number of the edge. + /// If text goes past the edge then it is highlighted. + /// (Scintilla feature 2361) + /// + void SetEdgeColumn(int column); + + /// Retrieve the edge highlight mode. (Scintilla feature 2362) + int GetEdgeMode(); + + /// + /// 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). + /// (Scintilla feature 2363) + /// + void SetEdgeMode(int mode); + + /// Retrieve the colour used in edge indication. (Scintilla feature 2364) + Colour GetEdgeColour(); + + /// Change the colour used in edge indication. (Scintilla feature 2365) + void SetEdgeColour(Colour edgeColour); + + /// Sets the current caret position to be the search anchor. (Scintilla feature 2366) + void SearchAnchor(); + + /// + /// Find some text starting at the search anchor. + /// Does not ensure the selection is visible. + /// (Scintilla feature 2367) + /// + unsafe int SearchNext(int flags, string text); + + /// + /// Find some text starting at the search anchor and moving backwards. + /// Does not ensure the selection is visible. + /// (Scintilla feature 2368) + /// + unsafe int SearchPrev(int flags, string text); + + /// Retrieves the number of lines completely visible. (Scintilla feature 2370) + int LinesOnScreen(); + + /// + /// Set whether a pop up menu is displayed automatically when the user presses + /// the wrong mouse button. + /// (Scintilla feature 2371) + /// + void UsePopUp(bool allowPopUp); + + /// Is the selection rectangular? The alternative is the more common stream selection. (Scintilla feature 2372) + bool SelectionIsRectangle(); + + /// + /// 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. + /// (Scintilla feature 2373) + /// + void SetZoom(int zoom); + + /// Retrieve the zoom level. (Scintilla feature 2374) + int GetZoom(); + + /// + /// Create a new document object. + /// Starts with reference count of 1 and not selected into editor. + /// (Scintilla feature 2375) + /// + int CreateDocument(); + + /// Extend life of document. (Scintilla feature 2376) + void AddRefDocument(int doc); + + /// Release a reference to the document, deleting document if it fades to black. (Scintilla feature 2377) + void ReleaseDocument(int doc); + + /// Get which document modification events are sent to the container. (Scintilla feature 2378) + int GetModEventMask(); + + /// Change internal focus flag. (Scintilla feature 2380) + void SetFocus(bool focus); + + /// Get internal focus flag. (Scintilla feature 2381) + bool GetFocus(); + + /// Change error status - 0 = OK. (Scintilla feature 2382) + void SetStatus(int statusCode); + + /// Get error status. (Scintilla feature 2383) + int GetStatus(); + + /// Set whether the mouse is captured when its button is pressed. (Scintilla feature 2384) + void SetMouseDownCaptures(bool captures); + + /// Get whether mouse gets captured. (Scintilla feature 2385) + bool GetMouseDownCaptures(); + + /// Sets the cursor to one of the SC_CURSOR* values. (Scintilla feature 2386) + void SetCursor(int cursorType); + + /// Get cursor type. (Scintilla feature 2387) + int GetCursor(); + + /// + /// Change the way control characters are displayed: + /// If symbol is < 32, keep the drawn way, else, use the given character. + /// (Scintilla feature 2388) + /// + void SetControlCharSymbol(int symbol); + + /// Get the way control characters are displayed. (Scintilla feature 2389) + int GetControlCharSymbol(); + + /// Move to the previous change in capitalisation. (Scintilla feature 2390) + void WordPartLeft(); + + /// + /// Move to the previous change in capitalisation extending selection + /// to new caret position. + /// (Scintilla feature 2391) + /// + void WordPartLeftExtend(); + + /// Move to the change next in capitalisation. (Scintilla feature 2392) + void WordPartRight(); + + /// + /// Move to the next change in capitalisation extending selection + /// to new caret position. + /// (Scintilla feature 2393) + /// + void WordPartRightExtend(); + + /// + /// Set the way the display area is determined when a particular line + /// is to be moved to by Find, FindNext, GotoLine, etc. + /// (Scintilla feature 2394) + /// + void SetVisiblePolicy(int visiblePolicy, int visibleSlop); + + /// Delete back from the current position to the start of the line. (Scintilla feature 2395) + void DelLineLeft(); + + /// Delete forwards from the current position to the end of the line. (Scintilla feature 2396) + void DelLineRight(); + + /// Get and Set the xOffset (ie, horizontal scroll position). (Scintilla feature 2397) + void SetXOffset(int newOffset); + + /// Get and Set the xOffset (ie, horizontal scroll position). (Scintilla feature 2398) + int GetXOffset(); + + /// Set the last x chosen value to be the caret x position. (Scintilla feature 2399) + void ChooseCaretX(); + + /// Set the focus to this Scintilla widget. (Scintilla feature 2400) + void GrabFocus(); + + /// + /// Set the way the caret is kept visible when going sideways. + /// The exclusion zone is given in pixels. + /// (Scintilla feature 2402) + /// + void SetXCaretPolicy(int caretPolicy, int caretSlop); + + /// + /// Set the way the line the caret is on is kept visible. + /// The exclusion zone is given in lines. + /// (Scintilla feature 2403) + /// + void SetYCaretPolicy(int caretPolicy, int caretSlop); + + /// Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE). (Scintilla feature 2406) + void SetPrintWrapMode(int mode); + + /// Is printing line wrapped? (Scintilla feature 2407) + int GetPrintWrapMode(); + + /// Set a fore colour for active hotspots. (Scintilla feature 2410) + void SetHotspotActiveFore(bool useSetting, Colour fore); + + /// Get the fore colour for active hotspots. (Scintilla feature 2494) + Colour GetHotspotActiveFore(); + + /// Set a back colour for active hotspots. (Scintilla feature 2411) + void SetHotspotActiveBack(bool useSetting, Colour back); + + /// Get the back colour for active hotspots. (Scintilla feature 2495) + Colour GetHotspotActiveBack(); + + /// Enable / Disable underlining active hotspots. (Scintilla feature 2412) + void SetHotspotActiveUnderline(bool underline); + + /// Get whether underlining for active hotspots. (Scintilla feature 2496) + bool GetHotspotActiveUnderline(); + + /// Limit hotspots to single line so hotspots on two lines don't merge. (Scintilla feature 2421) + void SetHotspotSingleLine(bool singleLine); + + /// Get the HotspotSingleLine property (Scintilla feature 2497) + bool GetHotspotSingleLine(); + + /// Move caret between paragraphs (delimited by empty lines). (Scintilla feature 2413) + void ParaDown(); + + /// Move caret between paragraphs (delimited by empty lines). (Scintilla feature 2414) + void ParaDownExtend(); + + /// Move caret between paragraphs (delimited by empty lines). (Scintilla feature 2415) + void ParaUp(); + + /// Move caret between paragraphs (delimited by empty lines). (Scintilla feature 2416) + void ParaUpExtend(); + + /// + /// Given a valid document position, return the previous position taking code + /// page into account. Returns 0 if passed 0. + /// (Scintilla feature 2417) + /// + Position PositionBefore(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. + /// (Scintilla feature 2418) + /// + Position PositionAfter(Position pos); + + /// + /// Given a valid document position, return a position that differs in a number + /// of characters. Returned value is always between 0 and last position in document. + /// (Scintilla feature 2670) + /// + Position PositionRelative(Position pos, int relative); + + /// Copy a range of text to the clipboard. Positions are clipped into the document. (Scintilla feature 2419) + void CopyRange(Position start, Position end); + + /// Copy argument text to the clipboard. (Scintilla feature 2420) + unsafe void CopyText(int length, string text); + + /// + /// Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE/SC_SEL_THIN) or + /// by lines (SC_SEL_LINES). + /// (Scintilla feature 2422) + /// + void SetSelectionMode(int mode); + + /// Get the mode of the current selection. (Scintilla feature 2423) + int GetSelectionMode(); + + /// Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line). (Scintilla feature 2424) + Position GetLineSelStartPosition(int line); + + /// Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line). (Scintilla feature 2425) + Position GetLineSelEndPosition(int line); + + /// Move caret down one line, extending rectangular selection to new caret position. (Scintilla feature 2426) + void LineDownRectExtend(); + + /// Move caret up one line, extending rectangular selection to new caret position. (Scintilla feature 2427) + void LineUpRectExtend(); + + /// Move caret left one character, extending rectangular selection to new caret position. (Scintilla feature 2428) + void CharLeftRectExtend(); + + /// Move caret right one character, extending rectangular selection to new caret position. (Scintilla feature 2429) + void CharRightRectExtend(); + + /// Move caret to first position on line, extending rectangular selection to new caret position. (Scintilla feature 2430) + void HomeRectExtend(); + + /// + /// 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. + /// (Scintilla feature 2431) + /// + void VCHomeRectExtend(); + + /// Move caret to last position on line, extending rectangular selection to new caret position. (Scintilla feature 2432) + void LineEndRectExtend(); + + /// Move caret one page up, extending rectangular selection to new caret position. (Scintilla feature 2433) + void PageUpRectExtend(); + + /// Move caret one page down, extending rectangular selection to new caret position. (Scintilla feature 2434) + void PageDownRectExtend(); + + /// Move caret to top of page, or one page up if already at top of page. (Scintilla feature 2435) + void StutteredPageUp(); + + /// Move caret to top of page, or one page up if already at top of page, extending selection to new caret position. (Scintilla feature 2436) + void StutteredPageUpExtend(); + + /// Move caret to bottom of page, or one page down if already at bottom of page. (Scintilla feature 2437) + void StutteredPageDown(); + + /// Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position. (Scintilla feature 2438) + void StutteredPageDownExtend(); + + /// Move caret left one word, position cursor at end of word. (Scintilla feature 2439) + void WordLeftEnd(); + + /// Move caret left one word, position cursor at end of word, extending selection to new caret position. (Scintilla feature 2440) + void WordLeftEndExtend(); + + /// Move caret right one word, position cursor at end of word. (Scintilla feature 2441) + void WordRightEnd(); + + /// Move caret right one word, position cursor at end of word, extending selection to new caret position. (Scintilla feature 2442) + void WordRightEndExtend(); + + /// + /// Set the set of characters making up whitespace for when moving or selecting by word. + /// Should be called after SetWordChars. + /// (Scintilla feature 2443) + /// + unsafe void SetWhitespaceChars(string characters); + + /// Get the set of characters making up whitespace for when moving or selecting by word. (Scintilla feature 2647) + unsafe string GetWhitespaceChars(); + + /// + /// Set the set of characters making up punctuation characters + /// Should be called after SetWordChars. + /// (Scintilla feature 2648) + /// + unsafe void SetPunctuationChars(string characters); + + /// Get the set of characters making up punctuation characters (Scintilla feature 2649) + unsafe string GetPunctuationChars(); + + /// Reset the set of characters for whitespace and word characters to the defaults. (Scintilla feature 2444) + void SetCharsDefault(); + + /// Get currently selected item position in the auto-completion list (Scintilla feature 2445) + int AutoCGetCurrent(); + + /// + /// Get currently selected item text in the auto-completion list + /// Returns the length of the item text + /// Result is NUL-terminated. + /// (Scintilla feature 2610) + /// + unsafe string AutoCGetCurrentText(); + + /// Set auto-completion case insensitive behaviour to either prefer case-sensitive matches or have no preference. (Scintilla feature 2634) + void AutoCSetCaseInsensitiveBehaviour(int behaviour); + + /// Get auto-completion case insensitive behaviour. (Scintilla feature 2635) + int AutoCGetCaseInsensitiveBehaviour(); + + /// Change the effect of autocompleting when there are multiple selections. (Scintilla feature 2636) + void AutoCSetMulti(int multi); + + /// Retrieve the effect of autocompleting when there are multiple selections.. (Scintilla feature 2637) + int AutoCGetMulti(); + + /// Set the way autocompletion lists are ordered. (Scintilla feature 2660) + void AutoCSetOrder(int order); + + /// Get the way autocompletion lists are ordered. (Scintilla feature 2661) + int AutoCGetOrder(); + + /// Enlarge the document to a particular size of text bytes. (Scintilla feature 2446) + void Allocate(int bytes); + + /// + /// Returns the target converted to UTF8. + /// Return the length in bytes. + /// (Scintilla feature 2447) + /// + unsafe string TargetAsUTF8(); + + /// + /// Set the length of the utf8 argument for calling EncodedFromUTF8. + /// Set to -1 and the string will be measured to the first nul. + /// (Scintilla feature 2448) + /// + void SetLengthForEncode(int bytes); + + /// + /// Translates a UTF8 string into the document encoding. + /// Return the length of the result in bytes. + /// On error return 0. + /// (Scintilla feature 2449) + /// + unsafe string EncodedFromUTF8(string utf8); + + /// + /// 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. + /// (Scintilla feature 2456) + /// + int FindColumn(int line, int column); + + /// Can the caret preferred x position only be changed by explicit movement commands? (Scintilla feature 2457) + int GetCaretSticky(); + + /// Stop the caret preferred x position changing when the user types. (Scintilla feature 2458) + void SetCaretSticky(int useCaretStickyBehaviour); + + /// Switch between sticky and non-sticky: meant to be bound to a key. (Scintilla feature 2459) + void ToggleCaretSticky(); + + /// Enable/Disable convert-on-paste for line endings (Scintilla feature 2467) + void SetPasteConvertEndings(bool convert); + + /// Get convert-on-paste setting (Scintilla feature 2468) + bool GetPasteConvertEndings(); + + /// Duplicate the selection. If selection empty duplicate the line containing the caret. (Scintilla feature 2469) + void SelectionDuplicate(); + + /// Set background alpha of the caret line. (Scintilla feature 2470) + void SetCaretLineBackAlpha(int alpha); + + /// Get the background alpha of the caret line. (Scintilla feature 2471) + int GetCaretLineBackAlpha(); + + /// Set the style of the caret to be drawn. (Scintilla feature 2512) + void SetCaretStyle(int caretStyle); + + /// Returns the current style of the caret. (Scintilla feature 2513) + int GetCaretStyle(); + + /// Set the indicator used for IndicatorFillRange and IndicatorClearRange (Scintilla feature 2500) + void SetIndicatorCurrent(int indicator); + + /// Get the current indicator (Scintilla feature 2501) + int GetIndicatorCurrent(); + + /// Set the value used for IndicatorFillRange (Scintilla feature 2502) + void SetIndicatorValue(int value); + + /// Get the current indicator value (Scintilla feature 2503) + int GetIndicatorValue(); + + /// Turn a indicator on over a range. (Scintilla feature 2504) + void IndicatorFillRange(int position, int fillLength); + + /// Turn a indicator off over a range. (Scintilla feature 2505) + void IndicatorClearRange(int position, int clearLength); + + /// Are any indicators present at position? (Scintilla feature 2506) + int IndicatorAllOnFor(int position); + + /// What value does a particular indicator have at at a position? (Scintilla feature 2507) + int IndicatorValueAt(int indicator, int position); + + /// Where does a particular indicator start? (Scintilla feature 2508) + int IndicatorStart(int indicator, int position); + + /// Where does a particular indicator end? (Scintilla feature 2509) + int IndicatorEnd(int indicator, int position); + + /// Set number of entries in position cache (Scintilla feature 2514) + void SetPositionCache(int size); + + /// How many entries are allocated to the position cache? (Scintilla feature 2515) + int GetPositionCache(); + + /// Copy the selection, if selection empty copy the line with the caret (Scintilla feature 2519) + void CopyAllowLine(); + + /// + /// Compact the document buffer and return a read-only pointer to the + /// characters in the document. + /// (Scintilla feature 2520) + /// + IntPtr GetCharacterPointer(); + + /// + /// Return a read-only pointer to a range of characters in the document. + /// May move the gap so that the range is contiguous, but will only move up + /// to rangeLength bytes. + /// (Scintilla feature 2643) + /// + IntPtr GetRangePointer(int position, int rangeLength); + + /// + /// Return a position which, to avoid performance costs, should not be within + /// the range of a call to GetRangePointer. + /// (Scintilla feature 2644) + /// + Position GetGapPosition(); + + /// Set the alpha fill colour of the given indicator. (Scintilla feature 2523) + void IndicSetAlpha(int indicator, int alpha); + + /// Get the alpha fill colour of the given indicator. (Scintilla feature 2524) + int IndicGetAlpha(int indicator); + + /// Set the alpha outline colour of the given indicator. (Scintilla feature 2558) + void IndicSetOutlineAlpha(int indicator, int alpha); + + /// Get the alpha outline colour of the given indicator. (Scintilla feature 2559) + int IndicGetOutlineAlpha(int indicator); + + /// Set extra ascent for each line (Scintilla feature 2525) + void SetExtraAscent(int extraAscent); + + /// Get extra ascent for each line (Scintilla feature 2526) + int GetExtraAscent(); + + /// Set extra descent for each line (Scintilla feature 2527) + void SetExtraDescent(int extraDescent); + + /// Get extra descent for each line (Scintilla feature 2528) + int GetExtraDescent(); + + /// Which symbol was defined for markerNumber with MarkerDefine (Scintilla feature 2529) + int MarkerSymbolDefined(int markerNumber); + + /// Set the text in the text margin for a line (Scintilla feature 2530) + unsafe void MarginSetText(int line, string text); + + /// Get the text in the text margin for a line (Scintilla feature 2531) + unsafe string MarginGetText(int line); + + /// Set the style number for the text margin for a line (Scintilla feature 2532) + void MarginSetStyle(int line, int style); + + /// Get the style number for the text margin for a line (Scintilla feature 2533) + int MarginGetStyle(int line); + + /// Set the style in the text margin for a line (Scintilla feature 2534) + unsafe void MarginSetStyles(int line, string styles); + + /// Get the styles in the text margin for a line (Scintilla feature 2535) + unsafe string MarginGetStyles(int line); + + /// Clear the margin text on all lines (Scintilla feature 2536) + void MarginTextClearAll(); + + /// Get the start of the range of style numbers used for margin text (Scintilla feature 2537) + void MarginSetStyleOffset(int style); + + /// Get the start of the range of style numbers used for margin text (Scintilla feature 2538) + int MarginGetStyleOffset(); + + /// Set the margin options. (Scintilla feature 2539) + void SetMarginOptions(int marginOptions); + + /// Get the margin options. (Scintilla feature 2557) + int GetMarginOptions(); + + /// Set the annotation text for a line (Scintilla feature 2540) + unsafe void AnnotationSetText(int line, string text); + + /// Get the annotation text for a line (Scintilla feature 2541) + unsafe string AnnotationGetText(int line); + + /// Set the style number for the annotations for a line (Scintilla feature 2542) + void AnnotationSetStyle(int line, int style); + + /// Get the style number for the annotations for a line (Scintilla feature 2543) + int AnnotationGetStyle(int line); + + /// Set the annotation styles for a line (Scintilla feature 2544) + unsafe void AnnotationSetStyles(int line, string styles); + + /// Get the annotation styles for a line (Scintilla feature 2545) + unsafe string AnnotationGetStyles(int line); + + /// Get the number of annotation lines for a line (Scintilla feature 2546) + int AnnotationGetLines(int line); + + /// Clear the annotations from all lines (Scintilla feature 2547) + void AnnotationClearAll(); + + /// Set the visibility for the annotations for a view (Scintilla feature 2548) + void AnnotationSetVisible(int visible); + + /// Get the visibility for the annotations for a view (Scintilla feature 2549) + int AnnotationGetVisible(); + + /// Get the start of the range of style numbers used for annotations (Scintilla feature 2550) + void AnnotationSetStyleOffset(int style); + + /// Get the start of the range of style numbers used for annotations (Scintilla feature 2551) + int AnnotationGetStyleOffset(); + + /// Release all extended (>255) style numbers (Scintilla feature 2552) + void ReleaseAllExtendedStyles(); + + /// Allocate some extended (>255) style numbers and return the start of the range (Scintilla feature 2553) + int AllocateExtendedStyles(int numberStyles); + + /// Add a container action to the undo stack (Scintilla feature 2560) + void AddUndoAction(int token, int flags); + + /// Find the position of a character from a point within the window. (Scintilla feature 2561) + Position CharPositionFromPoint(int x, int y); + + /// + /// Find the position of a character from a point within the window. + /// Return INVALID_POSITION if not close to text. + /// (Scintilla feature 2562) + /// + Position CharPositionFromPointClose(int x, int y); + + /// Set whether switching to rectangular mode while selecting with the mouse is allowed. (Scintilla feature 2668) + void SetMouseSelectionRectangularSwitch(bool mouseSelectionRectangularSwitch); + + /// Whether switching to rectangular mode while selecting with the mouse is allowed. (Scintilla feature 2669) + bool GetMouseSelectionRectangularSwitch(); + + /// Set whether multiple selections can be made (Scintilla feature 2563) + void SetMultipleSelection(bool multipleSelection); + + /// Whether multiple selections can be made (Scintilla feature 2564) + bool GetMultipleSelection(); + + /// Set whether typing can be performed into multiple selections (Scintilla feature 2565) + void SetAdditionalSelectionTyping(bool additionalSelectionTyping); + + /// Whether typing can be performed into multiple selections (Scintilla feature 2566) + bool GetAdditionalSelectionTyping(); + + /// Set whether additional carets will blink (Scintilla feature 2567) + void SetAdditionalCaretsBlink(bool additionalCaretsBlink); + + /// Whether additional carets will blink (Scintilla feature 2568) + bool GetAdditionalCaretsBlink(); + + /// Set whether additional carets are visible (Scintilla feature 2608) + void SetAdditionalCaretsVisible(bool additionalCaretsBlink); + + /// Whether additional carets are visible (Scintilla feature 2609) + bool GetAdditionalCaretsVisible(); + + /// How many selections are there? (Scintilla feature 2570) + int GetSelections(); + + /// Is every selected range empty? (Scintilla feature 2650) + bool GetSelectionEmpty(); + + /// Clear selections to a single empty stream selection (Scintilla feature 2571) + void ClearSelections(); + + /// Set a simple selection (Scintilla feature 2572) + int SetSelection(int caret, int anchor); + + /// Add a selection (Scintilla feature 2573) + int AddSelection(int caret, int anchor); + + /// Drop one selection (Scintilla feature 2671) + void DropSelectionN(int selection); + + /// Set the main selection (Scintilla feature 2574) + void SetMainSelection(int selection); + + /// Which selection is the main selection (Scintilla feature 2575) + int GetMainSelection(); + + /// Which selection is the main selection (Scintilla feature 2576) + void SetSelectionNCaret(int selection, Position pos); + + /// Which selection is the main selection (Scintilla feature 2577) + Position GetSelectionNCaret(int selection); + + /// Which selection is the main selection (Scintilla feature 2578) + void SetSelectionNAnchor(int selection, Position posAnchor); + + /// Which selection is the main selection (Scintilla feature 2579) + Position GetSelectionNAnchor(int selection); + + /// Which selection is the main selection (Scintilla feature 2580) + void SetSelectionNCaretVirtualSpace(int selection, int space); + + /// Which selection is the main selection (Scintilla feature 2581) + int GetSelectionNCaretVirtualSpace(int selection); + + /// Which selection is the main selection (Scintilla feature 2582) + void SetSelectionNAnchorVirtualSpace(int selection, int space); + + /// Which selection is the main selection (Scintilla feature 2583) + int GetSelectionNAnchorVirtualSpace(int selection); + + /// Sets the position that starts the selection - this becomes the anchor. (Scintilla feature 2584) + void SetSelectionNStart(int selection, Position pos); + + /// Returns the position at the start of the selection. (Scintilla feature 2585) + Position GetSelectionNStart(int selection); + + /// Sets the position that ends the selection - this becomes the currentPosition. (Scintilla feature 2586) + void SetSelectionNEnd(int selection, Position pos); + + /// Returns the position at the end of the selection. (Scintilla feature 2587) + Position GetSelectionNEnd(int selection); + + /// Returns the position at the end of the selection. (Scintilla feature 2588) + void SetRectangularSelectionCaret(Position pos); + + /// Returns the position at the end of the selection. (Scintilla feature 2589) + Position GetRectangularSelectionCaret(); + + /// Returns the position at the end of the selection. (Scintilla feature 2590) + void SetRectangularSelectionAnchor(Position posAnchor); + + /// Returns the position at the end of the selection. (Scintilla feature 2591) + Position GetRectangularSelectionAnchor(); + + /// Returns the position at the end of the selection. (Scintilla feature 2592) + void SetRectangularSelectionCaretVirtualSpace(int space); + + /// Returns the position at the end of the selection. (Scintilla feature 2593) + int GetRectangularSelectionCaretVirtualSpace(); + + /// Returns the position at the end of the selection. (Scintilla feature 2594) + void SetRectangularSelectionAnchorVirtualSpace(int space); + + /// Returns the position at the end of the selection. (Scintilla feature 2595) + int GetRectangularSelectionAnchorVirtualSpace(); + + /// Returns the position at the end of the selection. (Scintilla feature 2596) + void SetVirtualSpaceOptions(int virtualSpaceOptions); + + /// Returns the position at the end of the selection. (Scintilla feature 2597) + int GetVirtualSpaceOptions(); + + /// + /// On GTK+, allow selecting the modifier key to use for mouse-based + /// rectangular selection. Often the window manager requires Alt+Mouse Drag + /// for moving windows. + /// Valid values are SCMOD_CTRL(default), SCMOD_ALT, or SCMOD_SUPER. + /// (Scintilla feature 2598) + /// + void SetRectangularSelectionModifier(int modifier); + + /// Get the modifier key used for rectangular selection. (Scintilla feature 2599) + int GetRectangularSelectionModifier(); + + /// + /// Set the foreground colour of additional selections. + /// Must have previously called SetSelFore with non-zero first argument for this to have an effect. + /// (Scintilla feature 2600) + /// + void SetAdditionalSelFore(Colour fore); + + /// + /// Set the background colour of additional selections. + /// Must have previously called SetSelBack with non-zero first argument for this to have an effect. + /// (Scintilla feature 2601) + /// + void SetAdditionalSelBack(Colour back); + + /// Set the alpha of the selection. (Scintilla feature 2602) + void SetAdditionalSelAlpha(int alpha); + + /// Get the alpha of the selection. (Scintilla feature 2603) + int GetAdditionalSelAlpha(); + + /// Set the foreground colour of additional carets. (Scintilla feature 2604) + void SetAdditionalCaretFore(Colour fore); + + /// Get the foreground colour of additional carets. (Scintilla feature 2605) + Colour GetAdditionalCaretFore(); + + /// Set the main selection to the next selection. (Scintilla feature 2606) + void RotateSelection(); + + /// Swap that caret and anchor of the main selection. (Scintilla feature 2607) + void SwapMainAnchorCaret(); + + /// + /// Indicate that the internal state of a lexer has changed over a range and therefore + /// there may be a need to redraw. + /// (Scintilla feature 2617) + /// + int ChangeLexerState(Position start, Position end); + + /// + /// Find the next line at or after lineStart that is a contracted fold header line. + /// Return -1 when no more lines. + /// (Scintilla feature 2618) + /// + int ContractedFoldNext(int lineStart); + + /// Centre current line in window. (Scintilla feature 2619) + void VerticalCentreCaret(); + + /// Move the selected lines up one line, shifting the line above after the selection (Scintilla feature 2620) + void MoveSelectedLinesUp(); + + /// Move the selected lines down one line, shifting the line below before the selection (Scintilla feature 2621) + void MoveSelectedLinesDown(); + + /// Set the identifier reported as IdFrom in notification messages. (Scintilla feature 2622) + void SetIdentifier(int identifier); + + /// Get the identifier. (Scintilla feature 2623) + int GetIdentifier(); + + /// Set the width for future RGBA image data. (Scintilla feature 2624) + void RGBAImageSetWidth(int width); + + /// Set the height for future RGBA image data. (Scintilla feature 2625) + void RGBAImageSetHeight(int height); + + /// Set the scale factor in percent for future RGBA image data. (Scintilla feature 2651) + void RGBAImageSetScale(int scalePercent); + + /// + /// Define a marker from RGBA data. + /// It has the width and height from RGBAImageSetWidth/Height + /// (Scintilla feature 2626) + /// + unsafe void MarkerDefineRGBAImage(int markerNumber, string pixels); + + /// + /// Register an RGBA image for use in autocompletion lists. + /// It has the width and height from RGBAImageSetWidth/Height + /// (Scintilla feature 2627) + /// + unsafe void RegisterRGBAImage(int type, string pixels); + + /// Scroll to start of document. (Scintilla feature 2628) + void ScrollToStart(); + + /// Scroll to end of document. (Scintilla feature 2629) + void ScrollToEnd(); + + /// Set the technology used. (Scintilla feature 2630) + void SetTechnology(int technology); + + /// Get the tech. (Scintilla feature 2631) + int GetTechnology(); + + /// Create an ILoader*. (Scintilla feature 2632) + int CreateLoader(int bytes); + + /// On OS X, show a find indicator. (Scintilla feature 2640) + void FindIndicatorShow(Position start, Position end); + + /// On OS X, flash a find indicator, then fade out. (Scintilla feature 2641) + void FindIndicatorFlash(Position start, Position end); + + /// On OS X, hide the find indicator. (Scintilla feature 2642) + void FindIndicatorHide(); + + /// + /// Move caret to before first visible character on display line. + /// If already there move to first character on display line. + /// (Scintilla feature 2652) + /// + void VCHomeDisplay(); + + /// Like VCHomeDisplay but extending selection to new caret position. (Scintilla feature 2653) + void VCHomeDisplayExtend(); + + /// Is the caret line always visible? (Scintilla feature 2654) + bool GetCaretLineVisibleAlways(); + + /// Sets the caret line to always visible. (Scintilla feature 2655) + void SetCaretLineVisibleAlways(bool alwaysVisible); + + /// Set the line end types that the application wants to use. May not be used if incompatible with lexer or encoding. (Scintilla feature 2656) + void SetLineEndTypesAllowed(int lineEndBitSet); + + /// Get the line end types currently allowed. (Scintilla feature 2657) + int GetLineEndTypesAllowed(); + + /// Get the line end types currently recognised. May be a subset of the allowed types due to lexer limitation. (Scintilla feature 2658) + int GetLineEndTypesActive(); + + /// Set the way a character is drawn. (Scintilla feature 2665) + unsafe void SetRepresentation(string encodedCharacter, string representation); + + /// + /// Set the way a character is drawn. + /// Result is NUL-terminated. + /// (Scintilla feature 2666) + /// + unsafe string GetRepresentation(string encodedCharacter); + + /// Remove a character representation. (Scintilla feature 2667) + unsafe void ClearRepresentation(string encodedCharacter); + + /// Start notifying the container of all key presses and commands. (Scintilla feature 3001) + void StartRecord(); + + /// Stop notifying the container of all key presses and commands. (Scintilla feature 3002) + void StopRecord(); + + /// Set the lexing language of the document. (Scintilla feature 4001) + void SetLexer(int lexer); + + /// Retrieve the lexing language of the document. (Scintilla feature 4002) + int GetLexer(); + + /// Colourise a segment of the document using the current lexing language. (Scintilla feature 4003) + void Colourise(Position start, Position end); + + /// Set up a value that may be used by a lexer for some optional feature. (Scintilla feature 4004) + unsafe void SetProperty(string key, string value); + + /// Set up the key words used by the lexer. (Scintilla feature 4005) + unsafe void SetKeyWords(int keywordSet, string keyWords); + + /// Set the lexing language of the document based on string name. (Scintilla feature 4006) + unsafe void SetLexerLanguage(string language); + + /// Load a lexer library (dll / so). (Scintilla feature 4007) + unsafe void LoadLexerLibrary(string path); + + /// + /// Retrieve a "property" value previously set with SetProperty. + /// Result is NUL-terminated. + /// (Scintilla feature 4008) + /// + unsafe string GetProperty(string key); + + /// + /// Retrieve a "property" value previously set with SetProperty, + /// with "$()" variable replacement on returned buffer. + /// Result is NUL-terminated. + /// (Scintilla feature 4009) + /// + unsafe string GetPropertyExpanded(string key); + + /// + /// Retrieve a "property" value previously set with SetProperty, + /// interpreted as an int AFTER any "$()" variable replacement. + /// (Scintilla feature 4010) + /// + unsafe int GetPropertyInt(string key); + + /// Retrieve the number of bits the current lexer needs for styling. (Scintilla feature 4011) + int GetStyleBitsNeeded(); + + /// + /// Retrieve the name of the lexer. + /// Return the length of the text. + /// Result is NUL-terminated. + /// (Scintilla feature 4012) + /// + unsafe string GetLexerLanguage(); + + /// For private communication between an application and a known lexer. (Scintilla feature 4013) + int PrivateLexerCall(int operation, int pointer); + + /// + /// Retrieve a '\n' separated list of properties understood by the current lexer. + /// Result is NUL-terminated. + /// (Scintilla feature 4014) + /// + unsafe string PropertyNames(); + + /// Retrieve the type of a property. (Scintilla feature 4015) + unsafe int PropertyType(string name); + + /// + /// Describe a property. + /// Result is NUL-terminated. + /// (Scintilla feature 4016) + /// + unsafe string DescribeProperty(string name); + + /// + /// Retrieve a '\n' separated list of descriptions of the keyword sets understood by the current lexer. + /// Result is NUL-terminated. + /// (Scintilla feature 4017) + /// + unsafe string DescribeKeyWordSets(); + + /// + /// Bit set of LineEndType enumertion for which line ends beyond the standard + /// LF, CR, and CRLF are supported by the lexer. + /// (Scintilla feature 4018) + /// + int GetLineEndTypesSupported(); + + /// Allocate a set of sub styles for a particular base style, returning start of range (Scintilla feature 4020) + int AllocateSubStyles(int styleBase, int numberStyles); + + /// The starting style number for the sub styles associated with a base style (Scintilla feature 4021) + int GetSubStylesStart(int styleBase); + + /// The number of sub styles associated with a base style (Scintilla feature 4022) + int GetSubStylesLength(int styleBase); + + /// For a sub style, return the base style, else return the argument. (Scintilla feature 4027) + int GetStyleFromSubStyle(int subStyle); + + /// For a secondary style, return the primary style, else return the argument. (Scintilla feature 4028) + int GetPrimaryStyleFromStyle(int style); + + /// Free allocated sub styles (Scintilla feature 4023) + void FreeSubStyles(); + + /// Set the identifiers that are shown in a particular style (Scintilla feature 4024) + unsafe void SetIdentifiers(int style, string identifiers); + + /// + /// Where styles are duplicated by a feature such as active/inactive code + /// return the distance between the two types. + /// (Scintilla feature 4025) + /// + int DistanceToSecondaryStyles(); + + /// + /// Get the set of base styles that can be extended with sub styles + /// Result is NUL-terminated. + /// (Scintilla feature 4026) + /// + unsafe string GetSubStyleBases(); + + /// + /// Deprecated in 2.30 + /// In palette mode? + /// (Scintilla feature 2139) + /// + bool GetUsePalette(); + + /// + /// In palette mode, Scintilla uses the environment's palette calls to display + /// more colours. This may lead to ugly displays. + /// (Scintilla feature 2039) + /// + void SetUsePalette(bool usePalette); + + /// + /// Deprecated in 3.5.5 + /// Always interpret keyboard input as Unicode + /// (Scintilla feature 2521) + /// + void SetKeysUnicode(bool keysUnicode); + + /// Are keys always interpreted as Unicode? (Scintilla feature 2522) + bool GetKeysUnicode(); + + /* --Autogenerated -- end of section automatically generated from Scintilla.iface */ + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/MenuCmdID_h.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/MenuCmdID_h.cs new file mode 100644 index 000000000000..b4e2a2851de0 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/MenuCmdID_h.cs @@ -0,0 +1,398 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +// +// This file should stay in sync with the CPP project file +// "notepad-plus-plus/PowerEditor/src/menuCmdID.h" +// found at +// https://github.com/notepad-plus-plus/notepad-plus-plus/blob/master/PowerEditor/src/menuCmdID.h + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + public enum NppMenuCmd : uint + { + IDM = 40000, + + IDM_FILE = (IDM + 1000), + IDM_FILE_NEW = (IDM_FILE + 1), + IDM_FILE_OPEN = (IDM_FILE + 2), + IDM_FILE_CLOSE = (IDM_FILE + 3), + IDM_FILE_CLOSEALL = (IDM_FILE + 4), + IDM_FILE_CLOSEALL_BUT_CURRENT = (IDM_FILE + 5), + IDM_FILE_SAVE = (IDM_FILE + 6), + IDM_FILE_SAVEALL = (IDM_FILE + 7), + IDM_FILE_SAVEAS = (IDM_FILE + 8), + //IDM_FILE_ASIAN_LANG = (IDM_FILE + 9), + IDM_FILE_PRINT = (IDM_FILE + 10), + IDM_FILE_PRINTNOW = 1001, + IDM_FILE_EXIT = (IDM_FILE + 11), + IDM_FILE_LOADSESSION = (IDM_FILE + 12), + IDM_FILE_SAVESESSION = (IDM_FILE + 13), + IDM_FILE_RELOAD = (IDM_FILE + 14), + IDM_FILE_SAVECOPYAS = (IDM_FILE + 15), + IDM_FILE_DELETE = (IDM_FILE + 16), + IDM_FILE_RENAME = (IDM_FILE + 17), + + // A mettre � jour si on ajoute nouveau menu item dans le menu "File" + IDM_FILEMENU_LASTONE = IDM_FILE_RENAME, + + IDM_EDIT = (IDM + 2000), + IDM_EDIT_CUT = (IDM_EDIT + 1), + IDM_EDIT_COPY = (IDM_EDIT + 2), + IDM_EDIT_UNDO = (IDM_EDIT + 3), + IDM_EDIT_REDO = (IDM_EDIT + 4), + IDM_EDIT_PASTE = (IDM_EDIT + 5), + IDM_EDIT_DELETE = (IDM_EDIT + 6), + IDM_EDIT_SELECTALL = (IDM_EDIT + 7), + + IDM_EDIT_INS_TAB = (IDM_EDIT + 8), + IDM_EDIT_RMV_TAB = (IDM_EDIT + 9), + IDM_EDIT_DUP_LINE = (IDM_EDIT + 10), + IDM_EDIT_TRANSPOSE_LINE = (IDM_EDIT + 11), + IDM_EDIT_SPLIT_LINES = (IDM_EDIT + 12), + IDM_EDIT_JOIN_LINES = (IDM_EDIT + 13), + IDM_EDIT_LINE_UP = (IDM_EDIT + 14), + IDM_EDIT_LINE_DOWN = (IDM_EDIT + 15), + IDM_EDIT_UPPERCASE = (IDM_EDIT + 16), + IDM_EDIT_LOWERCASE = (IDM_EDIT + 17), + + // Menu macro + IDM_MACRO_STARTRECORDINGMACRO = (IDM_EDIT + 18), + IDM_MACRO_STOPRECORDINGMACRO = (IDM_EDIT + 19), + IDM_MACRO_PLAYBACKRECORDEDMACRO = (IDM_EDIT + 21), + //----------- + + IDM_EDIT_BLOCK_COMMENT = (IDM_EDIT + 22), + IDM_EDIT_STREAM_COMMENT = (IDM_EDIT + 23), + IDM_EDIT_TRIMTRAILING = (IDM_EDIT + 24), + IDM_EDIT_TRIMLINEHEAD = (IDM_EDIT + 42), + IDM_EDIT_TRIM_BOTH = (IDM_EDIT + 43), + IDM_EDIT_EOL2WS = (IDM_EDIT + 44), + IDM_EDIT_TRIMALL = (IDM_EDIT + 45), + IDM_EDIT_TAB2SW = (IDM_EDIT + 46), + IDM_EDIT_SW2TAB = (IDM_EDIT + 47), + + // Menu macro + IDM_MACRO_SAVECURRENTMACRO = (IDM_EDIT + 25), + //----------- + + IDM_EDIT_RTL = (IDM_EDIT + 26), + IDM_EDIT_LTR = (IDM_EDIT + 27), + IDM_EDIT_SETREADONLY = (IDM_EDIT + 28), + IDM_EDIT_FULLPATHTOCLIP = (IDM_EDIT + 29), + IDM_EDIT_FILENAMETOCLIP = (IDM_EDIT + 30), + IDM_EDIT_CURRENTDIRTOCLIP = (IDM_EDIT + 31), + + // Menu macro + IDM_MACRO_RUNMULTIMACRODLG = (IDM_EDIT + 32), + //----------- + + IDM_EDIT_CLEARREADONLY = (IDM_EDIT + 33), + IDM_EDIT_COLUMNMODE = (IDM_EDIT + 34), + IDM_EDIT_BLOCK_COMMENT_SET = (IDM_EDIT + 35), + IDM_EDIT_BLOCK_UNCOMMENT = (IDM_EDIT + 36), + + IDM_EDIT_AUTOCOMPLETE = (50000 + 0), + IDM_EDIT_AUTOCOMPLETE_CURRENTFILE = (50000 + 1), + IDM_EDIT_FUNCCALLTIP = (50000 + 2), + + //Belong to MENU FILE + IDM_OPEN_ALL_RECENT_FILE = (IDM_EDIT + 40), + IDM_CLEAN_RECENT_FILE_LIST = (IDM_EDIT + 41), + + IDM_SEARCH = (IDM + 3000), + + IDM_SEARCH_FIND = (IDM_SEARCH + 1), + IDM_SEARCH_FINDNEXT = (IDM_SEARCH + 2), + IDM_SEARCH_REPLACE = (IDM_SEARCH + 3), + IDM_SEARCH_GOTOLINE = (IDM_SEARCH + 4), + IDM_SEARCH_TOGGLE_BOOKMARK = (IDM_SEARCH + 5), + IDM_SEARCH_NEXT_BOOKMARK = (IDM_SEARCH + 6), + IDM_SEARCH_PREV_BOOKMARK = (IDM_SEARCH + 7), + IDM_SEARCH_CLEAR_BOOKMARKS = (IDM_SEARCH + 8), + IDM_SEARCH_GOTOMATCHINGBRACE = (IDM_SEARCH + 9), + IDM_SEARCH_FINDPREV = (IDM_SEARCH + 10), + IDM_SEARCH_FINDINCREMENT = (IDM_SEARCH + 11), + IDM_SEARCH_FINDINFILES = (IDM_SEARCH + 13), + IDM_SEARCH_VOLATILE_FINDNEXT = (IDM_SEARCH + 14), + IDM_SEARCH_VOLATILE_FINDPREV = (IDM_SEARCH + 15), + IDM_SEARCH_CUTMARKEDLINES = (IDM_SEARCH + 18), + IDM_SEARCH_COPYMARKEDLINES = (IDM_SEARCH + 19), + IDM_SEARCH_PASTEMARKEDLINES = (IDM_SEARCH + 20), + IDM_SEARCH_DELETEMARKEDLINES = (IDM_SEARCH + 21), + IDM_SEARCH_MARKALLEXT1 = (IDM_SEARCH + 22), + IDM_SEARCH_UNMARKALLEXT1 = (IDM_SEARCH + 23), + IDM_SEARCH_MARKALLEXT2 = (IDM_SEARCH + 24), + IDM_SEARCH_UNMARKALLEXT2 = (IDM_SEARCH + 25), + IDM_SEARCH_MARKALLEXT3 = (IDM_SEARCH + 26), + IDM_SEARCH_UNMARKALLEXT3 = (IDM_SEARCH + 27), + IDM_SEARCH_MARKALLEXT4 = (IDM_SEARCH + 28), + IDM_SEARCH_UNMARKALLEXT4 = (IDM_SEARCH + 29), + IDM_SEARCH_MARKALLEXT5 = (IDM_SEARCH + 30), + IDM_SEARCH_UNMARKALLEXT5 = (IDM_SEARCH + 31), + IDM_SEARCH_CLEARALLMARKS = (IDM_SEARCH + 32), + + IDM_SEARCH_GOPREVMARKER1 = (IDM_SEARCH + 33), + IDM_SEARCH_GOPREVMARKER2 = (IDM_SEARCH + 34), + IDM_SEARCH_GOPREVMARKER3 = (IDM_SEARCH + 35), + IDM_SEARCH_GOPREVMARKER4 = (IDM_SEARCH + 36), + IDM_SEARCH_GOPREVMARKER5 = (IDM_SEARCH + 37), + IDM_SEARCH_GOPREVMARKER_DEF = (IDM_SEARCH + 38), + + IDM_SEARCH_GONEXTMARKER1 = (IDM_SEARCH + 39), + IDM_SEARCH_GONEXTMARKER2 = (IDM_SEARCH + 40), + IDM_SEARCH_GONEXTMARKER3 = (IDM_SEARCH + 41), + IDM_SEARCH_GONEXTMARKER4 = (IDM_SEARCH + 42), + IDM_SEARCH_GONEXTMARKER5 = (IDM_SEARCH + 43), + IDM_SEARCH_GONEXTMARKER_DEF = (IDM_SEARCH + 44), + + IDM_FOCUS_ON_FOUND_RESULTS = (IDM_SEARCH + 45), + IDM_SEARCH_GOTONEXTFOUND = (IDM_SEARCH + 46), + IDM_SEARCH_GOTOPREVFOUND = (IDM_SEARCH + 47), + + IDM_SEARCH_SETANDFINDNEXT = (IDM_SEARCH + 48), + IDM_SEARCH_SETANDFINDPREV = (IDM_SEARCH + 49), + IDM_SEARCH_INVERSEMARKS = (IDM_SEARCH + 50), + + IDM_VIEW = (IDM + 4000), + //IDM_VIEW_TOOLBAR_HIDE = (IDM_VIEW + 1), + IDM_VIEW_TOOLBAR_REDUCE = (IDM_VIEW + 2), + IDM_VIEW_TOOLBAR_ENLARGE = (IDM_VIEW + 3), + IDM_VIEW_TOOLBAR_STANDARD = (IDM_VIEW + 4), + IDM_VIEW_REDUCETABBAR = (IDM_VIEW + 5), + IDM_VIEW_LOCKTABBAR = (IDM_VIEW + 6), + IDM_VIEW_DRAWTABBAR_TOPBAR = (IDM_VIEW + 7), + IDM_VIEW_DRAWTABBAR_INACIVETAB = (IDM_VIEW + 8), + IDM_VIEW_POSTIT = (IDM_VIEW + 9), + IDM_VIEW_TOGGLE_FOLDALL = (IDM_VIEW + 10), + IDM_VIEW_USER_DLG = (IDM_VIEW + 11), + IDM_VIEW_LINENUMBER = (IDM_VIEW + 12), + IDM_VIEW_SYMBOLMARGIN = (IDM_VIEW + 13), + IDM_VIEW_FOLDERMAGIN = (IDM_VIEW + 14), + IDM_VIEW_FOLDERMAGIN_SIMPLE = (IDM_VIEW + 15), + IDM_VIEW_FOLDERMAGIN_ARROW = (IDM_VIEW + 16), + IDM_VIEW_FOLDERMAGIN_CIRCLE = (IDM_VIEW + 17), + IDM_VIEW_FOLDERMAGIN_BOX = (IDM_VIEW + 18), + IDM_VIEW_ALL_CHARACTERS = (IDM_VIEW + 19), + IDM_VIEW_INDENT_GUIDE = (IDM_VIEW + 20), + IDM_VIEW_CURLINE_HILITING = (IDM_VIEW + 21), + IDM_VIEW_WRAP = (IDM_VIEW + 22), + IDM_VIEW_ZOOMIN = (IDM_VIEW + 23), + IDM_VIEW_ZOOMOUT = (IDM_VIEW + 24), + IDM_VIEW_TAB_SPACE = (IDM_VIEW + 25), + IDM_VIEW_EOL = (IDM_VIEW + 26), + IDM_VIEW_EDGELINE = (IDM_VIEW + 27), + IDM_VIEW_EDGEBACKGROUND = (IDM_VIEW + 28), + IDM_VIEW_TOGGLE_UNFOLDALL = (IDM_VIEW + 29), + IDM_VIEW_FOLD_CURRENT = (IDM_VIEW + 30), + IDM_VIEW_UNFOLD_CURRENT = (IDM_VIEW + 31), + IDM_VIEW_FULLSCREENTOGGLE = (IDM_VIEW + 32), + IDM_VIEW_ZOOMRESTORE = (IDM_VIEW + 33), + IDM_VIEW_ALWAYSONTOP = (IDM_VIEW + 34), + IDM_VIEW_SYNSCROLLV = (IDM_VIEW + 35), + IDM_VIEW_SYNSCROLLH = (IDM_VIEW + 36), + IDM_VIEW_EDGENONE = (IDM_VIEW + 37), + IDM_VIEW_DRAWTABBAR_CLOSEBOTTUN = (IDM_VIEW + 38), + IDM_VIEW_DRAWTABBAR_DBCLK2CLOSE = (IDM_VIEW + 39), + IDM_VIEW_REFRESHTABAR = (IDM_VIEW + 40), + IDM_VIEW_WRAP_SYMBOL = (IDM_VIEW + 41), + IDM_VIEW_HIDELINES = (IDM_VIEW + 42), + IDM_VIEW_DRAWTABBAR_VERTICAL = (IDM_VIEW + 43), + IDM_VIEW_DRAWTABBAR_MULTILINE = (IDM_VIEW + 44), + IDM_VIEW_DOCCHANGEMARGIN = (IDM_VIEW + 45), + IDM_VIEW_LWDEF = (IDM_VIEW + 46), + IDM_VIEW_LWALIGN = (IDM_VIEW + 47), + IDM_VIEW_LWINDENT = (IDM_VIEW + 48), + IDM_VIEW_SUMMARY = (IDM_VIEW + 49), + + IDM_VIEW_FOLD = (IDM_VIEW + 50), + IDM_VIEW_FOLD_1 = (IDM_VIEW_FOLD + 1), + IDM_VIEW_FOLD_2 = (IDM_VIEW_FOLD + 2), + IDM_VIEW_FOLD_3 = (IDM_VIEW_FOLD + 3), + IDM_VIEW_FOLD_4 = (IDM_VIEW_FOLD + 4), + IDM_VIEW_FOLD_5 = (IDM_VIEW_FOLD + 5), + IDM_VIEW_FOLD_6 = (IDM_VIEW_FOLD + 6), + IDM_VIEW_FOLD_7 = (IDM_VIEW_FOLD + 7), + IDM_VIEW_FOLD_8 = (IDM_VIEW_FOLD + 8), + + IDM_VIEW_UNFOLD = (IDM_VIEW + 60), + IDM_VIEW_UNFOLD_1 = (IDM_VIEW_UNFOLD + 1), + IDM_VIEW_UNFOLD_2 = (IDM_VIEW_UNFOLD + 2), + IDM_VIEW_UNFOLD_3 = (IDM_VIEW_UNFOLD + 3), + IDM_VIEW_UNFOLD_4 = (IDM_VIEW_UNFOLD + 4), + IDM_VIEW_UNFOLD_5 = (IDM_VIEW_UNFOLD + 5), + IDM_VIEW_UNFOLD_6 = (IDM_VIEW_UNFOLD + 6), + IDM_VIEW_UNFOLD_7 = (IDM_VIEW_UNFOLD + 7), + IDM_VIEW_UNFOLD_8 = (IDM_VIEW_UNFOLD + 8), + + IDM_VIEW_GOTO_ANOTHER_VIEW = 10001, + IDM_VIEW_CLONE_TO_ANOTHER_VIEW = 10002, + IDM_VIEW_GOTO_NEW_INSTANCE = 10003, + IDM_VIEW_LOAD_IN_NEW_INSTANCE = 10004, + + IDM_VIEW_SWITCHTO_OTHER_VIEW = (IDM_VIEW + 72), + + IDM_FORMAT = (IDM + 5000), + IDM_FORMAT_TODOS = (IDM_FORMAT + 1), + IDM_FORMAT_TOUNIX = (IDM_FORMAT + 2), + IDM_FORMAT_TOMAC = (IDM_FORMAT + 3), + IDM_FORMAT_ANSI = (IDM_FORMAT + 4), + IDM_FORMAT_UTF_8 = (IDM_FORMAT + 5), + IDM_FORMAT_UCS_2BE = (IDM_FORMAT + 6), + IDM_FORMAT_UCS_2LE = (IDM_FORMAT + 7), + IDM_FORMAT_AS_UTF_8 = (IDM_FORMAT + 8), + IDM_FORMAT_CONV2_ANSI = (IDM_FORMAT + 9), + IDM_FORMAT_CONV2_AS_UTF_8 = (IDM_FORMAT + 10), + IDM_FORMAT_CONV2_UTF_8 = (IDM_FORMAT + 11), + IDM_FORMAT_CONV2_UCS_2BE = (IDM_FORMAT + 12), + IDM_FORMAT_CONV2_UCS_2LE = (IDM_FORMAT + 13), + + IDM_FORMAT_ENCODE = (IDM_FORMAT + 20), + IDM_FORMAT_WIN_1250 = (IDM_FORMAT_ENCODE + 0), + IDM_FORMAT_WIN_1251 = (IDM_FORMAT_ENCODE + 1), + IDM_FORMAT_WIN_1252 = (IDM_FORMAT_ENCODE + 2), + IDM_FORMAT_WIN_1253 = (IDM_FORMAT_ENCODE + 3), + IDM_FORMAT_WIN_1254 = (IDM_FORMAT_ENCODE + 4), + IDM_FORMAT_WIN_1255 = (IDM_FORMAT_ENCODE + 5), + IDM_FORMAT_WIN_1256 = (IDM_FORMAT_ENCODE + 6), + IDM_FORMAT_WIN_1257 = (IDM_FORMAT_ENCODE + 7), + IDM_FORMAT_WIN_1258 = (IDM_FORMAT_ENCODE + 8), + IDM_FORMAT_ISO_8859_1 = (IDM_FORMAT_ENCODE + 9), + IDM_FORMAT_ISO_8859_2 = (IDM_FORMAT_ENCODE + 10), + IDM_FORMAT_ISO_8859_3 = (IDM_FORMAT_ENCODE + 11), + IDM_FORMAT_ISO_8859_4 = (IDM_FORMAT_ENCODE + 12), + IDM_FORMAT_ISO_8859_5 = (IDM_FORMAT_ENCODE + 13), + IDM_FORMAT_ISO_8859_6 = (IDM_FORMAT_ENCODE + 14), + IDM_FORMAT_ISO_8859_7 = (IDM_FORMAT_ENCODE + 15), + IDM_FORMAT_ISO_8859_8 = (IDM_FORMAT_ENCODE + 16), + IDM_FORMAT_ISO_8859_9 = (IDM_FORMAT_ENCODE + 17), + IDM_FORMAT_ISO_8859_10 = (IDM_FORMAT_ENCODE + 18), + IDM_FORMAT_ISO_8859_11 = (IDM_FORMAT_ENCODE + 19), + IDM_FORMAT_ISO_8859_13 = (IDM_FORMAT_ENCODE + 20), + IDM_FORMAT_ISO_8859_14 = (IDM_FORMAT_ENCODE + 21), + IDM_FORMAT_ISO_8859_15 = (IDM_FORMAT_ENCODE + 22), + IDM_FORMAT_ISO_8859_16 = (IDM_FORMAT_ENCODE + 23), + IDM_FORMAT_DOS_437 = (IDM_FORMAT_ENCODE + 24), + IDM_FORMAT_DOS_720 = (IDM_FORMAT_ENCODE + 25), + IDM_FORMAT_DOS_737 = (IDM_FORMAT_ENCODE + 26), + IDM_FORMAT_DOS_775 = (IDM_FORMAT_ENCODE + 27), + IDM_FORMAT_DOS_850 = (IDM_FORMAT_ENCODE + 28), + IDM_FORMAT_DOS_852 = (IDM_FORMAT_ENCODE + 29), + IDM_FORMAT_DOS_855 = (IDM_FORMAT_ENCODE + 30), + IDM_FORMAT_DOS_857 = (IDM_FORMAT_ENCODE + 31), + IDM_FORMAT_DOS_858 = (IDM_FORMAT_ENCODE + 32), + IDM_FORMAT_DOS_860 = (IDM_FORMAT_ENCODE + 33), + IDM_FORMAT_DOS_861 = (IDM_FORMAT_ENCODE + 34), + IDM_FORMAT_DOS_862 = (IDM_FORMAT_ENCODE + 35), + IDM_FORMAT_DOS_863 = (IDM_FORMAT_ENCODE + 36), + IDM_FORMAT_DOS_865 = (IDM_FORMAT_ENCODE + 37), + IDM_FORMAT_DOS_866 = (IDM_FORMAT_ENCODE + 38), + IDM_FORMAT_DOS_869 = (IDM_FORMAT_ENCODE + 39), + IDM_FORMAT_BIG5 = (IDM_FORMAT_ENCODE + 40), + IDM_FORMAT_GB2312 = (IDM_FORMAT_ENCODE + 41), + IDM_FORMAT_SHIFT_JIS = (IDM_FORMAT_ENCODE + 42), + IDM_FORMAT_KOREAN_WIN = (IDM_FORMAT_ENCODE + 43), + IDM_FORMAT_EUC_KR = (IDM_FORMAT_ENCODE + 44), + IDM_FORMAT_TIS_620 = (IDM_FORMAT_ENCODE + 45), + IDM_FORMAT_MAC_CYRILLIC = (IDM_FORMAT_ENCODE + 46), + IDM_FORMAT_KOI8U_CYRILLIC = (IDM_FORMAT_ENCODE + 47), + IDM_FORMAT_KOI8R_CYRILLIC = (IDM_FORMAT_ENCODE + 48), + IDM_FORMAT_ENCODE_END = IDM_FORMAT_KOI8R_CYRILLIC, + + //#define IDM_FORMAT_CONVERT 200 + + IDM_LANG = (IDM + 6000), + IDM_LANGSTYLE_CONFIG_DLG = (IDM_LANG + 1), + IDM_LANG_C = (IDM_LANG + 2), + IDM_LANG_CPP = (IDM_LANG + 3), + IDM_LANG_JAVA = (IDM_LANG + 4), + IDM_LANG_HTML = (IDM_LANG + 5), + IDM_LANG_XML = (IDM_LANG + 6), + IDM_LANG_JS = (IDM_LANG + 7), + IDM_LANG_PHP = (IDM_LANG + 8), + IDM_LANG_ASP = (IDM_LANG + 9), + IDM_LANG_CSS = (IDM_LANG + 10), + IDM_LANG_PASCAL = (IDM_LANG + 11), + IDM_LANG_PYTHON = (IDM_LANG + 12), + IDM_LANG_PERL = (IDM_LANG + 13), + IDM_LANG_OBJC = (IDM_LANG + 14), + IDM_LANG_ASCII = (IDM_LANG + 15), + IDM_LANG_TEXT = (IDM_LANG + 16), + IDM_LANG_RC = (IDM_LANG + 17), + IDM_LANG_MAKEFILE = (IDM_LANG + 18), + IDM_LANG_INI = (IDM_LANG + 19), + IDM_LANG_SQL = (IDM_LANG + 20), + IDM_LANG_VB = (IDM_LANG + 21), + IDM_LANG_BATCH = (IDM_LANG + 22), + IDM_LANG_CS = (IDM_LANG + 23), + IDM_LANG_LUA = (IDM_LANG + 24), + IDM_LANG_TEX = (IDM_LANG + 25), + IDM_LANG_FORTRAN = (IDM_LANG + 26), + IDM_LANG_BASH = (IDM_LANG + 27), + IDM_LANG_FLASH = (IDM_LANG + 28), + IDM_LANG_NSIS = (IDM_LANG + 29), + IDM_LANG_TCL = (IDM_LANG + 30), + IDM_LANG_LISP = (IDM_LANG + 31), + IDM_LANG_SCHEME = (IDM_LANG + 32), + IDM_LANG_ASM = (IDM_LANG + 33), + IDM_LANG_DIFF = (IDM_LANG + 34), + IDM_LANG_PROPS = (IDM_LANG + 35), + IDM_LANG_PS = (IDM_LANG + 36), + IDM_LANG_RUBY = (IDM_LANG + 37), + IDM_LANG_SMALLTALK = (IDM_LANG + 38), + IDM_LANG_VHDL = (IDM_LANG + 39), + IDM_LANG_CAML = (IDM_LANG + 40), + IDM_LANG_KIX = (IDM_LANG + 41), + IDM_LANG_ADA = (IDM_LANG + 42), + IDM_LANG_VERILOG = (IDM_LANG + 43), + IDM_LANG_AU3 = (IDM_LANG + 44), + IDM_LANG_MATLAB = (IDM_LANG + 45), + IDM_LANG_HASKELL = (IDM_LANG + 46), + IDM_LANG_INNO = (IDM_LANG + 47), + IDM_LANG_CMAKE = (IDM_LANG + 48), + IDM_LANG_YAML = (IDM_LANG + 49), + IDM_LANG_COBOL = (IDM_LANG + 50), + IDM_LANG_D = (IDM_LANG + 51), + IDM_LANG_GUI4CLI = (IDM_LANG + 52), + IDM_LANG_POWERSHELL = (IDM_LANG + 53), + IDM_LANG_R = (IDM_LANG + 54), + IDM_LANG_JSP = (IDM_LANG + 55), + IDM_LANG_EXTERNAL = (IDM_LANG + 65), + IDM_LANG_EXTERNAL_LIMIT = (IDM_LANG + 79), + IDM_LANG_USER = (IDM_LANG + 80), //46080 + IDM_LANG_USER_LIMIT = (IDM_LANG + 110), //46110 + + IDM_ABOUT = (IDM + 7000), + IDM_HOMESWEETHOME = (IDM_ABOUT + 1), + IDM_PROJECTPAGE = (IDM_ABOUT + 2), + IDM_ONLINEHELP = (IDM_ABOUT + 3), + IDM_FORUM = (IDM_ABOUT + 4), + IDM_PLUGINSHOME = (IDM_ABOUT + 5), + IDM_UPDATE_NPP = (IDM_ABOUT + 6), + IDM_WIKIFAQ = (IDM_ABOUT + 7), + IDM_HELP = (IDM_ABOUT + 8), + + IDM_SETTING = (IDM + 8000), + IDM_SETTING_TAB_SIZE = (IDM_SETTING + 1), + IDM_SETTING_TAB_REPLCESPACE = (IDM_SETTING + 2), + IDM_SETTING_HISTORY_SIZE = (IDM_SETTING + 3), + IDM_SETTING_EDGE_SIZE = (IDM_SETTING + 4), + IDM_SETTING_IMPORTPLUGIN = (IDM_SETTING + 5), + IDM_SETTING_IMPORTSTYLETHEMS = (IDM_SETTING + 6), + IDM_SETTING_TRAYICON = (IDM_SETTING + 8), + IDM_SETTING_SHORTCUT_MAPPER = (IDM_SETTING + 9), + IDM_SETTING_REMEMBER_LAST_SESSION = (IDM_SETTING + 10), + IDM_SETTING_PREFERECE = (IDM_SETTING + 11), + IDM_SETTING_AUTOCNBCHAR = (IDM_SETTING + 15), + IDM_SETTING_SHORTCUT_MAPPER_MACRO = (IDM_SETTING + 16), + IDM_SETTING_SHORTCUT_MAPPER_RUN = (IDM_SETTING + 17), + IDM_SETTING_EDITCONTEXTMENU = (IDM_SETTING + 18), + + IDM_EXECUTE = (IDM + 9000), + + IDM_SYSTRAYPOPUP = (IDM + 3100), + IDM_SYSTRAYPOPUP_ACTIVATE = (IDM_SYSTRAYPOPUP + 1), + IDM_SYSTRAYPOPUP_NEWDOC = (IDM_SYSTRAYPOPUP + 2), + IDM_SYSTRAYPOPUP_NEW_AND_PASTE = (IDM_SYSTRAYPOPUP + 3), + IDM_SYSTRAYPOPUP_OPENFILE = (IDM_SYSTRAYPOPUP + 4), + IDM_SYSTRAYPOPUP_CLOSE = (IDM_SYSTRAYPOPUP + 5) + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Msgs_h.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Msgs_h.cs new file mode 100644 index 000000000000..036c660a3c3e --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Msgs_h.cs @@ -0,0 +1,764 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +// +// This file should stay in sync with the CPP project file +// "notepad-plus-plus/PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h" +// found at +// https://github.com/notepad-plus-plus/notepad-plus-plus/blob/master/PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h + +using System; + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + class Constants + { + public const int WM_USER = 0x400; + public const int NPPMSG = WM_USER + 1000; + } + + public enum LangType + { + L_TEXT, 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_ASCII, L_USER, + L_ASP, L_SQL, L_VB, L_JS, L_CSS, L_PERL, L_PYTHON, L_LUA, + L_TEX, L_FORTRAN, L_BASH, L_FLASH, L_NSIS, L_TCL, L_LISP, L_SCHEME, + L_ASM, L_DIFF, L_PROPS, L_PS, L_RUBY, L_SMALLTALK, L_VHDL, L_KIX, L_AU3, + L_CAML, L_ADA, L_VERILOG, L_MATLAB, L_HASKELL, L_INNO, L_SEARCHRESULT, + L_CMAKE, L_YAML, L_COBOL, L_GUI4CLI, L_D, L_POWERSHELL, L_R, L_JSP, + L_COFFEESCRIPT, L_JSON, L_JAVASCRIPT, L_FORTRAN_77, + // Don't use L_JS, use L_JAVASCRIPT instead + // The end of enumated language type, so it should be always at the end + L_EXTERNAL + } + + [Flags] + public enum NppMsg : uint + { + /* ++Autogenerated -- start of section automatically generated from notepad-plus-plus\PowerEditor\src\MISC\PluginsManager\Notepad_plus_msgs.h */ + + NPPMSG = Constants.WM_USER + 1000, + + NPPM_GETCURRENTSCINTILLA = Constants.NPPMSG + 4, + NPPM_GETCURRENTLANGTYPE = Constants.NPPMSG + 5, + NPPM_SETCURRENTLANGTYPE = Constants.NPPMSG + 6, + + NPPM_GETNBOPENFILES = Constants.NPPMSG + 7, + ALL_OPEN_FILES = 0, + PRIMARY_VIEW = 1, + SECOND_VIEW = 2, + + NPPM_GETOPENFILENAMES = Constants.NPPMSG + 8, + + NPPM_MODELESSDIALOG = Constants.NPPMSG + 12, + MODELESSDIALOGADD = 0, + MODELESSDIALOGREMOVE = 1, + + NPPM_GETNBSESSIONFILES = Constants.NPPMSG + 13, + NPPM_GETSESSIONFILES = Constants.NPPMSG + 14, + NPPM_SAVESESSION = Constants.NPPMSG + 15, + NPPM_SAVECURRENTSESSION = Constants.NPPMSG + 16, + + NPPM_GETOPENFILENAMESPRIMARY = Constants.NPPMSG + 17, + NPPM_GETOPENFILENAMESSECOND = Constants.NPPMSG + 18, + + NPPM_CREATESCINTILLAHANDLE = Constants.NPPMSG + 20, + NPPM_DESTROYSCINTILLAHANDLE = Constants.NPPMSG + 21, + NPPM_GETNBUSERLANG = Constants.NPPMSG + 22, + + NPPM_GETCURRENTDOCINDEX = Constants.NPPMSG + 23, + MAIN_VIEW = 0, + SUB_VIEW = 1, + + NPPM_SETSTATUSBAR = Constants.NPPMSG + 24, + STATUSBAR_DOC_TYPE = 0, + STATUSBAR_DOC_SIZE = 1, + STATUSBAR_CUR_POS = 2, + STATUSBAR_EOF_FORMAT = 3, + STATUSBAR_UNICODE_TYPE = 4, + STATUSBAR_TYPING_MODE = 5, + + NPPM_GETMENUHANDLE = Constants.NPPMSG + 25, + NPPPLUGINMENU = 0, + /// + /// INT NPPM_GETMENUHANDLE(INT menuChoice, 0) + /// Return: menu handle (HMENU) of choice (plugin menu handle or Notepad++ main menu handle) + /// + NPPMAINMENU = 1, + + /// + ///ascii file to unicode + ///int NPPM_ENCODESCI(MAIN_VIEW/SUB_VIEW, 0) + ///return new unicodeMode + /// + NPPM_ENCODESCI = Constants.NPPMSG + 26, + + /// + ///unicode file to ascii + ///int NPPM_DECODESCI(MAIN_VIEW/SUB_VIEW, 0) + ///return old unicodeMode + /// + NPPM_DECODESCI = Constants.NPPMSG + 27, + + /// + ///void NPPM_ACTIVATEDOC(int view, int index2Activate) + /// + NPPM_ACTIVATEDOC = Constants.NPPMSG + 28, + + /// + ///void NPPM_LAUNCHFINDINFILESDLG(TCHAR * dir2Search, TCHAR * filtre) + /// + NPPM_LAUNCHFINDINFILESDLG = Constants.NPPMSG + 29, + + /// + ///void NPPM_DMMSHOW(0, tTbData->hClient) + /// + NPPM_DMMSHOW = Constants.NPPMSG + 30, + + /// + ///void NPPM_DMMHIDE(0, tTbData->hClient) + /// + NPPM_DMMHIDE = Constants.NPPMSG + 31, + + /// + ///void NPPM_DMMUPDATEDISPINFO(0, tTbData->hClient) + /// + NPPM_DMMUPDATEDISPINFO = Constants.NPPMSG + 32, + + /// + ///void NPPM_DMMREGASDCKDLG(0, &tTbData) + /// + NPPM_DMMREGASDCKDLG = Constants.NPPMSG + 33, + + /// + ///void NPPM_LOADSESSION(0, const TCHAR* file name) + /// + NPPM_LOADSESSION = Constants.NPPMSG + 34, + + /// + ///void WM_DMM_VIEWOTHERTAB(0, tTbData->pszName) + /// + NPPM_DMMVIEWOTHERTAB = Constants.NPPMSG + 35, + + /// + ///BOOL NPPM_RELOADFILE(BOOL withAlert, TCHAR *filePathName2Reload) + /// + NPPM_RELOADFILE = Constants.NPPMSG + 36, + + /// + ///BOOL NPPM_SWITCHTOFILE(0, TCHAR *filePathName2switch) + /// + NPPM_SWITCHTOFILE = Constants.NPPMSG + 37, + + /// + ///BOOL NPPM_SAVECURRENTFILE(0, 0) + /// + NPPM_SAVECURRENTFILE = Constants.NPPMSG + 38, + + /// + ///BOOL NPPM_SAVEALLFILES(0, 0) + /// + NPPM_SAVEALLFILES = Constants.NPPMSG + 39, + + /// + ///void WM_PIMENU_CHECK(UINT funcItem[X]._cmdID, TRUE/FALSE) + /// + NPPM_SETMENUITEMCHECK = Constants.NPPMSG + 40, + + /// + ///void WM_ADDTOOLBARICON(UINT funcItem[X]._cmdID, toolbarIcons icon) + /// + NPPM_ADDTOOLBARICON = Constants.NPPMSG + 41, + + /// + ///winVer NPPM_GETWINDOWSVERSION(0, 0) + /// + NPPM_GETWINDOWSVERSION = Constants.NPPMSG + 42, + + /// + ///HWND WM_DMM_GETPLUGINHWNDBYNAME(const TCHAR *windowName, const TCHAR *moduleName) + /// if moduleName is NULL, then return value is NULL + /// if windowName is NULL, then the first found window handle which matches with the moduleName will be returned + /// + NPPM_DMMGETPLUGINHWNDBYNAME = Constants.NPPMSG + 43, + + /// + ///BOOL NPPM_MAKECURRENTBUFFERDIRTY(0, 0) + /// + NPPM_MAKECURRENTBUFFERDIRTY = Constants.NPPMSG + 44, + + /// + ///BOOL NPPM_GETENABLETHEMETEXTUREFUNC(0, 0) + /// + NPPM_GETENABLETHEMETEXTUREFUNC = Constants.NPPMSG + 45, + + /// + ///void NPPM_GETPLUGINSCONFIGDIR(int strLen, TCHAR *str) + /// + NPPM_GETPLUGINSCONFIGDIR = Constants.NPPMSG + 46, + + /// + ///BOOL NPPM_MSGTOPLUGIN(TCHAR *destModuleName, CommunicationInfo *info) + /// return value is TRUE when the message arrive to the destination plugins. + /// if destModule or info is NULL, then return value is FALSE + /// + NPPM_MSGTOPLUGIN = Constants.NPPMSG + 47, + + /// + ///void NPPM_MENUCOMMAND(0, int cmdID) + /// uncomment //#include "menuCmdID.h" + /// in the beginning of this file then use the command symbols defined in "menuCmdID.h" file + /// to access all the Notepad++ menu command items + /// + NPPM_MENUCOMMAND = Constants.NPPMSG + 48, + + /// + ///void NPPM_TRIGGERTABBARCONTEXTMENU(int view, int index2Activate) + /// + NPPM_TRIGGERTABBARCONTEXTMENU = Constants.NPPMSG + 49, + + /// + /// int NPPM_GETNPPVERSION(0, 0) + /// return version + /// ex : v4.6 + /// HIWORD(version) == 4 + /// LOWORD(version) == 6 + /// + NPPM_GETNPPVERSION = Constants.NPPMSG + 50, + + /// + /// BOOL NPPM_HIDETABBAR(0, BOOL hideOrNot) + /// if hideOrNot is set as TRUE then tab bar will be hidden + /// otherwise it'll be shown. + /// return value : the old status value + /// + NPPM_HIDETABBAR = Constants.NPPMSG + 51, + + /// + /// BOOL NPPM_ISTABBARHIDDEN(0, 0) + /// returned value : TRUE if tab bar is hidden, otherwise FALSE + /// + NPPM_ISTABBARHIDDEN = Constants.NPPMSG + 52, + + /// + /// INT NPPM_GETPOSFROMBUFFERID(INT bufferID, INT priorityView) + /// Return VIEW|INDEX from a buffer ID. -1 if the bufferID non existing + /// if priorityView set to SUB_VIEW, then SUB_VIEW will be search firstly + /// + /// VIEW takes 2 highest bits and INDEX (0 based) takes the rest (30 bits) + /// Here's the values for the view : + /// MAIN_VIEW 0 + /// SUB_VIEW 1 + /// + NPPM_GETPOSFROMBUFFERID = Constants.NPPMSG + 57, + + /// + /// INT NPPM_GETFULLPATHFROMBUFFERID(INT bufferID, TCHAR *fullFilePath) + /// Get full path file name from a bufferID. + /// Return -1 if the bufferID non existing, otherwise the number of TCHAR copied/to copy + /// User should call it with fullFilePath be NULL to get the number of TCHAR (not including the nul character), + /// allocate fullFilePath with the return values + 1, then call it again to get full path file name + /// + NPPM_GETFULLPATHFROMBUFFERID = Constants.NPPMSG + 58, + + /// + /// LRESULT NPPM_GETBUFFERIDFROMPOS(INT index, INT iView) + /// wParam: Position of document + /// lParam: View to use, 0 = Main, 1 = Secondary + /// Returns 0 if invalid + /// + NPPM_GETBUFFERIDFROMPOS = Constants.NPPMSG + 59, + + /// + /// LRESULT NPPM_GETCURRENTBUFFERID(0, 0) + /// Returns active Buffer + /// + NPPM_GETCURRENTBUFFERID = Constants.NPPMSG + 60, + + /// + /// VOID NPPM_RELOADBUFFERID(0, 0) + /// Reloads Buffer + /// wParam: Buffer to reload + /// lParam: 0 if no alert, else alert + /// + NPPM_RELOADBUFFERID = Constants.NPPMSG + 61, + + /// + /// INT NPPM_GETBUFFERLANGTYPE(INT bufferID, 0) + /// wParam: BufferID to get LangType from + /// lParam: 0 + /// Returns as int, see LangType. -1 on error + /// + NPPM_GETBUFFERLANGTYPE = Constants.NPPMSG + 64, + + /// + /// BOOL NPPM_SETBUFFERLANGTYPE(INT bufferID, INT langType) + /// wParam: BufferID to set LangType of + /// lParam: LangType + /// Returns TRUE on success, FALSE otherwise + /// use int, see LangType for possible values + /// L_USER and L_EXTERNAL are not supported + /// + NPPM_SETBUFFERLANGTYPE = Constants.NPPMSG + 65, + + /// + /// INT NPPM_GETBUFFERENCODING(INT bufferID, 0) + /// wParam: BufferID to get encoding from + /// lParam: 0 + /// returns as int, see UniMode. -1 on error + /// + NPPM_GETBUFFERENCODING = Constants.NPPMSG + 66, + + /// + /// BOOL NPPM_SETBUFFERENCODING(INT bufferID, INT encoding) + /// wParam: BufferID to set encoding of + /// lParam: encoding + /// Returns TRUE on success, FALSE otherwise + /// use int, see UniMode + /// Can only be done on new, unedited files + /// + NPPM_SETBUFFERENCODING = Constants.NPPMSG + 67, + + /// + /// INT NPPM_GETBUFFERFORMAT(INT bufferID, 0) + /// wParam: BufferID to get format from + /// lParam: 0 + /// returns as int, see formatType. -1 on error + /// + NPPM_GETBUFFERFORMAT = Constants.NPPMSG + 68, + + /// + /// BOOL NPPM_SETBUFFERFORMAT(INT bufferID, INT format) + /// wParam: BufferID to set format of + /// lParam: format + /// Returns TRUE on success, FALSE otherwise + /// use int, see formatType + /// + NPPM_SETBUFFERFORMAT = Constants.NPPMSG + 69, + + /// + /// BOOL NPPM_ADDREBAR(0, REBARBANDINFO *) + /// Returns assigned ID in wID value of struct pointer + /// + NPPM_ADDREBAR = Constants.NPPMSG + 57, + + /// + /// BOOL NPPM_ADDREBAR(INT ID, REBARBANDINFO *) + ///Use ID assigned with NPPM_ADDREBAR + /// + NPPM_UPDATEREBAR = Constants.NPPMSG + 58, + + /// + /// BOOL NPPM_ADDREBAR(INT ID, 0) + ///Use ID assigned with NPPM_ADDREBAR + /// + NPPM_REMOVEREBAR = Constants.NPPMSG + 59, + + /// + /// BOOL NPPM_HIDETOOLBAR(0, BOOL hideOrNot) + /// if hideOrNot is set as TRUE then tool bar will be hidden + /// otherwise it'll be shown. + /// return value : the old status value + /// + NPPM_HIDETOOLBAR = Constants.NPPMSG + 70, + + /// + /// BOOL NPPM_ISTOOLBARHIDDEN(0, 0) + /// returned value : TRUE if tool bar is hidden, otherwise FALSE + /// + NPPM_ISTOOLBARHIDDEN = Constants.NPPMSG + 71, + + /// + /// BOOL NPPM_HIDEMENU(0, BOOL hideOrNot) + /// if hideOrNot is set as TRUE then menu will be hidden + /// otherwise it'll be shown. + /// return value : the old status value + /// + NPPM_HIDEMENU = Constants.NPPMSG + 72, + + /// + /// BOOL NPPM_ISMENUHIDDEN(0, 0) + /// returned value : TRUE if menu is hidden, otherwise FALSE + /// + NPPM_ISMENUHIDDEN = Constants.NPPMSG + 73, + + /// + /// BOOL NPPM_HIDESTATUSBAR(0, BOOL hideOrNot) + /// if hideOrNot is set as TRUE then STATUSBAR will be hidden + /// otherwise it'll be shown. + /// return value : the old status value + /// + NPPM_HIDESTATUSBAR = Constants.NPPMSG + 74, + + /// + /// BOOL NPPM_ISSTATUSBARHIDDEN(0, 0) + /// returned value : TRUE if STATUSBAR is hidden, otherwise FALSE + /// + NPPM_ISSTATUSBARHIDDEN = Constants.NPPMSG + 75, + + /// + /// BOOL NPPM_GETSHORTCUTBYCMDID(int cmdID, ShortcutKey *sk) + /// get your plugin command current mapped shortcut into sk via cmdID + /// You may need it after getting NPPN_READY notification + /// returned value : TRUE if this function call is successful and shorcut is enable, otherwise FALSE + /// + NPPM_GETSHORTCUTBYCMDID = Constants.NPPMSG + 76, + + /// + /// BOOL NPPM_DOOPEN(0, const TCHAR *fullPathName2Open) + /// fullPathName2Open indicates the full file path name to be opened. + /// The return value is TRUE (1) if the operation is successful, otherwise FALSE (0). + /// + NPPM_DOOPEN = Constants.NPPMSG + 77, + + /// + /// BOOL NPPM_SAVECURRENTFILEAS (BOOL asCopy, const TCHAR* filename) + /// + NPPM_SAVECURRENTFILEAS = Constants.NPPMSG + 78, + + /// + /// INT NPPM_GETCURRENTNATIVELANGENCODING(0, 0) + /// returned value : the current native language enconding + /// + NPPM_GETCURRENTNATIVELANGENCODING = Constants.NPPMSG + 79, + + /// + /// returns TRUE if NPPM_ALLOCATECMDID is supported + /// Use to identify if subclassing is necessary + /// + NPPM_ALLOCATESUPPORTED = Constants.NPPMSG + 80, + + /// + /// BOOL NPPM_ALLOCATECMDID(int numberRequested, int* startNumber) + /// sets startNumber to the initial command ID if successful + /// Returns: TRUE if successful, FALSE otherwise. startNumber will also be set to 0 if unsuccessful + /// + NPPM_ALLOCATECMDID = Constants.NPPMSG + 81, + + /// + /// BOOL NPPM_ALLOCATEMARKER(int numberRequested, int* startNumber) + /// sets startNumber to the initial command ID if successful + /// Allocates a marker number to a plugin + /// Returns: TRUE if successful, FALSE otherwise. startNumber will also be set to 0 if unsuccessful + /// + NPPM_ALLOCATEMARKER = Constants.NPPMSG + 82, + + /// + /// INT NPPM_GETLANGUAGENAME(int langType, TCHAR *langName) + /// Get programing language name from the given language type (LangType) + /// Return value is the number of copied character / number of character to copy (\0 is not included) + /// You should call this function 2 times - the first time you pass langName as NULL to get the number of characters to copy. + /// You allocate a buffer of the length of (the number of characters + 1) then call NPPM_GETLANGUAGENAME function the 2nd time + /// by passing allocated buffer as argument langName + /// + NPPM_GETLANGUAGENAME = Constants.NPPMSG + 83, + + /// + /// INT NPPM_GETLANGUAGEDESC(int langType, TCHAR *langDesc) + /// Get programing language short description from the given language type (LangType) + /// Return value is the number of copied character / number of character to copy (\0 is not included) + /// You should call this function 2 times - the first time you pass langDesc as NULL to get the number of characters to copy. + /// You allocate a buffer of the length of (the number of characters + 1) then call NPPM_GETLANGUAGEDESC function the 2nd time + /// by passing allocated buffer as argument langDesc + /// + NPPM_GETLANGUAGEDESC = Constants.NPPMSG + 84, + + /// + /// VOID NPPM_ISDOCSWITCHERSHOWN(0, BOOL toShowOrNot) + /// Send this message to show or hide doc switcher. + /// if toShowOrNot is TRUE then show doc switcher, otherwise hide it. + /// + NPPM_SHOWDOCSWITCHER = Constants.NPPMSG + 85, + + /// + /// BOOL NPPM_ISDOCSWITCHERSHOWN(0, 0) + /// Check to see if doc switcher is shown. + /// + NPPM_ISDOCSWITCHERSHOWN = Constants.NPPMSG + 86, + + /// + /// BOOL NPPM_GETAPPDATAPLUGINSALLOWED(0, 0) + /// Check to see if loading plugins from "%APPDATA%\Notepad++\plugins" is allowed. + /// + NPPM_GETAPPDATAPLUGINSALLOWED = Constants.NPPMSG + 87, + + /// + /// INT NPPM_GETCURRENTVIEW(0, 0) + /// Return: current edit view of Notepad++. Only 2 possible values: 0 = Main, 1 = Secondary + /// + NPPM_GETCURRENTVIEW = Constants.NPPMSG + 88, + + /// + /// VOID NPPM_DOCSWITCHERDISABLECOLUMN(0, BOOL disableOrNot) + /// Disable or enable extension column of doc switcher + /// + NPPM_DOCSWITCHERDISABLECOLUMN = Constants.NPPMSG + 89, + + /// + /// INT NPPM_GETEDITORDEFAULTFOREGROUNDCOLOR(0, 0) + /// Return: current editor default foreground color. You should convert the returned value in COLORREF + /// + NPPM_GETEDITORDEFAULTFOREGROUNDCOLOR = Constants.NPPMSG + 90, + + /// + /// INT NPPM_GETEDITORDEFAULTBACKGROUNDCOLOR(0, 0) + /// Return: current editor default background color. You should convert the returned value in COLORREF + /// + NPPM_GETEDITORDEFAULTBACKGROUNDCOLOR = Constants.NPPMSG + 91, + + /// + /// VOID NPPM_SETSMOOTHFONT(0, BOOL setSmoothFontOrNot) + /// + NPPM_SETSMOOTHFONT = Constants.NPPMSG + 92, + + /// + /// VOID NPPM_SETEDITORBORDEREDGE(0, BOOL withEditorBorderEdgeOrNot) + /// + NPPM_SETEDITORBORDEREDGE = Constants.NPPMSG + 93, + + /// + /// VOID NPPM_SAVEFILE(0, const TCHAR *fileNameToSave) + /// + NPPM_SAVEFILE = Constants.NPPMSG + 94, + + RUNCOMMAND_USER = Constants.WM_USER + 3000, + NPPM_GETFULLCURRENTPATH = RUNCOMMAND_USER + FULL_CURRENT_PATH, + NPPM_GETCURRENTDIRECTORY = RUNCOMMAND_USER + CURRENT_DIRECTORY, + NPPM_GETFILENAME = RUNCOMMAND_USER + FILE_NAME, + NPPM_GETNAMEPART = RUNCOMMAND_USER + NAME_PART, + NPPM_GETEXTPART = RUNCOMMAND_USER + EXT_PART, + NPPM_GETCURRENTWORD = RUNCOMMAND_USER + CURRENT_WORD, + /// + /// BOOL NPPM_GETXXXXXXXXXXXXXXXX(size_t strLen, TCHAR *str) + /// where str is the allocated TCHAR array, + /// strLen is the allocated array size + /// The return value is TRUE when get generic_string operation success + /// Otherwise (allocated array size is too small) FALSE + /// + NPPM_GETNPPDIRECTORY = RUNCOMMAND_USER + NPP_DIRECTORY, + + /// + /// INT NPPM_GETCURRENTLINE(0, 0) + /// return the caret current position line + /// + NPPM_GETCURRENTLINE = RUNCOMMAND_USER + CURRENT_LINE, + + /// + /// INT NPPM_GETCURRENTCOLUMN(0, 0) + /// return the caret current position column + /// + NPPM_GETCURRENTCOLUMN = RUNCOMMAND_USER + CURRENT_COLUMN, + + VAR_NOT_RECOGNIZED = 0, + FULL_CURRENT_PATH = 1, + CURRENT_DIRECTORY = 2, + FILE_NAME = 3, + NAME_PART = 4, + EXT_PART = 5, + CURRENT_WORD = 6, + NPP_DIRECTORY = 7, + CURRENT_LINE = 8, + CURRENT_COLUMN = 9, + + /// + /// 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; + /// + NPPN_FIRST = 1000, + /// + ///scnNotification->nmhdr.code = NPPN_READY; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = 0; + /// + NPPN_READY = NPPN_FIRST + 1, + + /// + ///scnNotification->nmhdr.code = NPPN_TB_MODIFICATION; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = 0; + /// + NPPN_TBMODIFICATION = NPPN_FIRST + 2, + + /// + ///scnNotification->nmhdr.code = NPPN_FILEBEFORECLOSE; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILEBEFORECLOSE = NPPN_FIRST + 3, + + /// + ///scnNotification->nmhdr.code = NPPN_FILEOPENED; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILEOPENED = NPPN_FIRST + 4, + + /// + ///scnNotification->nmhdr.code = NPPN_FILECLOSED; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILECLOSED = NPPN_FIRST + 5, + + /// + ///scnNotification->nmhdr.code = NPPN_FILEBEFOREOPEN; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILEBEFOREOPEN = NPPN_FIRST + 6, + + /// + ///scnNotification->nmhdr.code = NPPN_FILEBEFOREOPEN; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILEBEFORESAVE = NPPN_FIRST + 7, + + /// + ///scnNotification->nmhdr.code = NPPN_FILESAVED; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILESAVED = NPPN_FIRST + 8, + + /// + ///scnNotification->nmhdr.code = NPPN_SHUTDOWN; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = 0; + /// + NPPN_SHUTDOWN = NPPN_FIRST + 9, + + /// + ///scnNotification->nmhdr.code = NPPN_BUFFERACTIVATED; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = activatedBufferID; + /// + NPPN_BUFFERACTIVATED = NPPN_FIRST + 10, + + /// + ///scnNotification->nmhdr.code = NPPN_LANGCHANGED; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = currentBufferID; + /// + NPPN_LANGCHANGED = NPPN_FIRST + 11, + + /// + ///scnNotification->nmhdr.code = NPPN_WORDSTYLESUPDATED; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = currentBufferID; + /// + NPPN_WORDSTYLESUPDATED = NPPN_FIRST + 12, + + /// + ///scnNotification->nmhdr.code = NPPN_SHORTCUTSREMAPPED; + ///scnNotification->nmhdr.hwndFrom = ShortcutKeyStructurePointer; + ///scnNotification->nmhdr.idFrom = cmdID; + ///where ShortcutKeyStructurePointer is pointer of struct ShortcutKey: + ///struct ShortcutKey { + /// bool _isCtrl; + /// bool _isAlt; + /// bool _isShift; + /// UCHAR _key; + ///}; + /// + NPPN_SHORTCUTREMAPPED = NPPN_FIRST + 13, + + /// + ///scnNotification->nmhdr.code = NPPN_FILEBEFOREOPEN; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = NULL; + /// + NPPN_FILEBEFORELOAD = NPPN_FIRST + 14, + + /// + ///scnNotification->nmhdr.code = NPPN_FILEOPENFAILED; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILELOADFAILED = NPPN_FIRST + 15, + + /// + ///scnNotification->nmhdr.code = NPPN_READONLYCHANGED; + ///scnNotification->nmhdr.hwndFrom = bufferID; + ///scnNotification->nmhdr.idFrom = docStatus; + /// where bufferID is BufferID + /// docStatus can be combined by DOCSTAUS_READONLY and DOCSTAUS_BUFFERDIRTY + /// + NPPN_READONLYCHANGED = NPPN_FIRST + 16, + + DOCSTAUS_READONLY = 1, + DOCSTAUS_BUFFERDIRTY = 2, + + /// + ///scnNotification->nmhdr.code = NPPN_DOCORDERCHANGED; + ///scnNotification->nmhdr.hwndFrom = newIndex; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_DOCORDERCHANGED = NPPN_FIRST + 17, + + /// + ///scnNotification->nmhdr.code = NPPN_SNAPSHOTDIRTYFILELOADED; + ///scnNotification->nmhdr.hwndFrom = NULL; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_SNAPSHOTDIRTYFILELOADED = NPPN_FIRST + 18, + + /// + ///scnNotification->nmhdr.code = NPPN_BEFORESHUTDOWN; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = 0; + /// + NPPN_BEFORESHUTDOWN = NPPN_FIRST + 19, + + /// + ///scnNotification->nmhdr.code = NPPN_CANCELSHUTDOWN; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = 0; + /// + NPPN_CANCELSHUTDOWN = NPPN_FIRST + 20, + + /// + ///scnNotification->nmhdr.code = NPPN_FILEBEFORERENAME; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILEBEFORERENAME = NPPN_FIRST + 21, + + /// + ///scnNotification->nmhdr.code = NPPN_FILERENAMECANCEL; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILERENAMECANCEL = NPPN_FIRST + 22, + + /// + ///scnNotification->nmhdr.code = NPPN_FILERENAMED; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILERENAMED = NPPN_FIRST + 23, + + /// + ///scnNotification->nmhdr.code = NPPN_FILEBEFOREDELETE; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILEBEFOREDELETE = NPPN_FIRST + 24, + + /// + ///scnNotification->nmhdr.code = NPPN_FILEDELETEFAILED; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILEDELETEFAILED = NPPN_FIRST + 25, + + /// + ///scnNotification->nmhdr.code = NPPN_FILEDELETED; + ///scnNotification->nmhdr.hwndFrom = hwndNpp; + ///scnNotification->nmhdr.idFrom = BufferID; + /// + NPPN_FILEDELETED = NPPN_FIRST + 26, + + /* --Autogenerated -- end of section automatically generated from notepad-plus-plus\PowerEditor\src\MISC\PluginsManager\Notepad_plus_msgs.h * */ + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NotepadPPGateway.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NotepadPPGateway.cs new file mode 100644 index 000000000000..5b6aea54c29b --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NotepadPPGateway.cs @@ -0,0 +1,101 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +using System; +using System.Text; +using NppPluginNET.PluginInfrastructure; + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + public interface INotepadPPGateway + { + void FileNew(); + + string GetCurrentFilePath(); + unsafe string GetFilePath(int bufferId); + void SetCurrentLanguage(LangType language); + /// + /// Returns the response from NPPM_GETFILENAME + /// + /// + string GetCurrentFileName(); + /// + /// Returns the response from NPPM_GETCURRENTDIRECTORY + /// + /// + string GetCurrentDirectory(); + } + + /// + /// This class holds helpers for sending messages defined in the Msgs_h.cs file. It is at the moment + /// incomplete. Please help fill in the blanks. + /// + public class NotepadPPGateway : INotepadPPGateway + { + private const int Unused = 0; + + public void FileNew() + { + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint) NppMsg.NPPM_MENUCOMMAND, Unused, NppMenuCmd.IDM_FILE_NEW); + } + + /// + /// Returns the response from NPPM_GETCURRENTDIRECTORY + /// + /// + public string GetCurrentDirectory() + { + StringBuilder path = new StringBuilder(Win32.MAX_PATH); + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint)NppMsg.NPPM_GETCURRENTDIRECTORY, 0, path); + return path.ToString(); + } + + /// + /// Returns the response from NPPM_GETFILENAME + /// + /// + public string GetCurrentFileName() + { + StringBuilder fileName = new StringBuilder(Win32.MAX_PATH); + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint)NppMsg.NPPM_GETFILENAME, 0, fileName); + return fileName.ToString(); + } + + /// + /// Gets the path of the current document. + /// + public string GetCurrentFilePath() + { + var path = new StringBuilder(2000); + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint) NppMsg.NPPM_GETFULLCURRENTPATH, 0, path); + return path.ToString(); + } + + /// + /// Gets the path of the current document. + /// + public unsafe string GetFilePath(int bufferId) + { + var path = new StringBuilder(2000); + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint) NppMsg.NPPM_GETFULLPATHFROMBUFFERID, bufferId, path); + return path.ToString(); + } + + public void SetCurrentLanguage(LangType language) + { + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint) NppMsg.NPPM_SETCURRENTLANGTYPE, Unused, (int) language); + } + } + + /// + /// This class holds helpers for sending messages defined in the Resource_h.cs file. It is at the moment + /// incomplete. Please help fill in the blanks. + /// + class NppResource + { + private const int Unused = 0; + + public void ClearIndicator() + { + Win32.SendMessage(PluginBase.nppData._nppHandle, (uint) Resource.NPPM_INTERNAL_CLEARINDICATOR, Unused, Unused); + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NppPluginNETBase.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NppPluginNETBase.cs new file mode 100644 index 000000000000..250a901e2658 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NppPluginNETBase.cs @@ -0,0 +1,54 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +using System; + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + class PluginBase + { + internal static NppData nppData; + internal static FuncItems _funcItems = new FuncItems(); + + internal static void SetCommand(int index, string commandName, NppFuncItemDelegate functionPointer) + { + SetCommand(index, commandName, functionPointer, new ShortcutKey(), false); + } + + internal static void SetCommand(int index, string commandName, NppFuncItemDelegate functionPointer, ShortcutKey shortcut) + { + SetCommand(index, commandName, functionPointer, shortcut, false); + } + + internal static void SetCommand(int index, string commandName, NppFuncItemDelegate functionPointer, bool checkOnInit) + { + SetCommand(index, commandName, functionPointer, new ShortcutKey(), checkOnInit); + } + + internal static void SetCommand(int index, string commandName, NppFuncItemDelegate functionPointer, ShortcutKey shortcut, bool checkOnInit) + { + FuncItem funcItem = new FuncItem(); + funcItem._cmdID = index; + funcItem._itemName = commandName; + if (functionPointer != null) + funcItem._pFunc = new NppFuncItemDelegate(functionPointer); + if (shortcut._key != 0) + funcItem._pShKey = shortcut; + funcItem._init2Check = checkOnInit; + _funcItems.Add(funcItem); + } + + internal static IntPtr GetCurrentScintilla() + { + int curScintilla; + Win32.SendMessage(nppData._nppHandle, (uint) NppMsg.NPPM_GETCURRENTSCINTILLA, 0, out curScintilla); + return (curScintilla == 0) ? nppData._scintillaMainHandle : nppData._scintillaSecondHandle; + } + + + static readonly Func gatewayFactory = () => new ScintillaGateway(GetCurrentScintilla()); + + public static Func GetGatewayFactory() + { + return gatewayFactory; + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NppPluginNETHelper.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NppPluginNETHelper.cs new file mode 100644 index 000000000000..c337fea01d3f --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/NppPluginNETHelper.cs @@ -0,0 +1,191 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +using System; +using System.Text; +using System.Windows.Forms; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + [StructLayout(LayoutKind.Sequential)] + public struct NppData + { + public IntPtr _nppHandle; + public IntPtr _scintillaMainHandle; + public IntPtr _scintillaSecondHandle; + } + + public delegate void NppFuncItemDelegate(); + + [StructLayout(LayoutKind.Sequential)] + public struct ShortcutKey + { + public ShortcutKey(bool isCtrl, bool isAlt, bool isShift, Keys key) + { + // the types 'bool' and 'char' have a size of 1 byte only! + _isCtrl = Convert.ToByte(isCtrl); + _isAlt = Convert.ToByte(isAlt); + _isShift = Convert.ToByte(isShift); + _key = Convert.ToByte(key); + } + public byte _isCtrl; + public byte _isAlt; + public byte _isShift; + public byte _key; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct FuncItem + { + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] + public string _itemName; + public NppFuncItemDelegate _pFunc; + public int _cmdID; + public bool _init2Check; + public ShortcutKey _pShKey; + } + + public class FuncItems : IDisposable + { + List _funcItems; + int _sizeFuncItem; + List _shortCutKeys; + IntPtr _nativePointer; + bool _disposed = false; + + public FuncItems() + { + _funcItems = new List(); + _sizeFuncItem = Marshal.SizeOf(typeof(FuncItem)); + _shortCutKeys = new List(); + } + + [DllImport("kernel32")] + static extern void RtlMoveMemory(IntPtr Destination, IntPtr Source, int Length); + public void Add(FuncItem funcItem) + { + int oldSize = _funcItems.Count * _sizeFuncItem; + _funcItems.Add(funcItem); + int newSize = _funcItems.Count * _sizeFuncItem; + IntPtr newPointer = Marshal.AllocHGlobal(newSize); + + if (_nativePointer != IntPtr.Zero) + { + RtlMoveMemory(newPointer, _nativePointer, oldSize); + Marshal.FreeHGlobal(_nativePointer); + } + IntPtr ptrPosNewItem = (IntPtr)(newPointer.ToInt64() + oldSize); + byte[] aB = Encoding.Unicode.GetBytes(funcItem._itemName + "\0"); + Marshal.Copy(aB, 0, ptrPosNewItem, aB.Length); + ptrPosNewItem = (IntPtr)(ptrPosNewItem.ToInt64() + 128); + IntPtr p = (funcItem._pFunc != null) ? Marshal.GetFunctionPointerForDelegate(funcItem._pFunc) : IntPtr.Zero; + Marshal.WriteIntPtr(ptrPosNewItem, p); + ptrPosNewItem = (IntPtr)(ptrPosNewItem.ToInt64() + IntPtr.Size); + Marshal.WriteInt32(ptrPosNewItem, funcItem._cmdID); + ptrPosNewItem = (IntPtr)(ptrPosNewItem.ToInt64() + 4); + Marshal.WriteInt32(ptrPosNewItem, Convert.ToInt32(funcItem._init2Check)); + ptrPosNewItem = (IntPtr)(ptrPosNewItem.ToInt64() + 4); + if (funcItem._pShKey._key != 0) + { + IntPtr newShortCutKey = Marshal.AllocHGlobal(4); + Marshal.StructureToPtr(funcItem._pShKey, newShortCutKey, false); + Marshal.WriteIntPtr(ptrPosNewItem, newShortCutKey); + } + else Marshal.WriteIntPtr(ptrPosNewItem, IntPtr.Zero); + + _nativePointer = newPointer; + } + + public void RefreshItems() + { + IntPtr ptrPosItem = _nativePointer; + for (int i = 0; i < _funcItems.Count; i++) + { + FuncItem updatedItem = new FuncItem(); + updatedItem._itemName = _funcItems[i]._itemName; + ptrPosItem = (IntPtr)(ptrPosItem.ToInt64() + 128); + updatedItem._pFunc = _funcItems[i]._pFunc; + ptrPosItem = (IntPtr)(ptrPosItem.ToInt64() + IntPtr.Size); + updatedItem._cmdID = Marshal.ReadInt32(ptrPosItem); + ptrPosItem = (IntPtr)(ptrPosItem.ToInt64() + 4); + updatedItem._init2Check = _funcItems[i]._init2Check; + ptrPosItem = (IntPtr)(ptrPosItem.ToInt64() + 4); + updatedItem._pShKey = _funcItems[i]._pShKey; + ptrPosItem = (IntPtr)(ptrPosItem.ToInt64() + IntPtr.Size); + + _funcItems[i] = updatedItem; + } + } + + public IntPtr NativePointer { get { return _nativePointer; } } + public List Items { get { return _funcItems; } } + + public void Dispose() + { + if (!_disposed) + { + foreach (IntPtr ptr in _shortCutKeys) Marshal.FreeHGlobal(ptr); + if (_nativePointer != IntPtr.Zero) Marshal.FreeHGlobal(_nativePointer); + _disposed = true; + } + } + ~FuncItems() + { + Dispose(); + } + } + + + public enum winVer + { + WV_UNKNOWN, WV_WIN32S, WV_95, WV_98, WV_ME, WV_NT, WV_W2K, + WV_XP, WV_S2003, WV_XPX64, WV_VISTA, WV_WIN7, WV_WIN8, WV_WIN81, WV_WIN10 + } + + + [Flags] + public enum DockMgrMsg : uint + { + IDB_CLOSE_DOWN = 137, + IDB_CLOSE_UP = 138, + IDD_CONTAINER_DLG = 139, + + IDC_TAB_CONT = 1027, + IDC_CLIENT_TAB = 1028, + IDC_BTN_CAPTION = 1050, + + DMM_MSG = 0x5000, + DMM_CLOSE = (DMM_MSG + 1), + DMM_DOCK = (DMM_MSG + 2), + DMM_FLOAT = (DMM_MSG + 3), + DMM_DOCKALL = (DMM_MSG + 4), + DMM_FLOATALL = (DMM_MSG + 5), + DMM_MOVE = (DMM_MSG + 6), + DMM_UPDATEDISPINFO = (DMM_MSG + 7), + DMM_GETIMAGELIST = (DMM_MSG + 8), + DMM_GETICONPOS = (DMM_MSG + 9), + DMM_DROPDATA = (DMM_MSG + 10), + DMM_MOVE_SPLITTER = (DMM_MSG + 11), + DMM_CANCEL_MOVE = (DMM_MSG + 12), + DMM_LBUTTONUP = (DMM_MSG + 13), + + DMN_FIRST = 1050, + DMN_CLOSE = (DMN_FIRST + 1), + //nmhdr.Code = DWORD(DMN_CLOSE, 0)); + //nmhdr.hwndFrom = hwndNpp; + //nmhdr.IdFrom = ctrlIdNpp; + + DMN_DOCK = (DMN_FIRST + 2), + DMN_FLOAT = (DMN_FIRST + 3) + //nmhdr.Code = DWORD(DMN_XXX, int newContainer); + //nmhdr.hwndFrom = hwndNpp; + //nmhdr.IdFrom = ctrlIdNpp; + } + + [StructLayout(LayoutKind.Sequential)] + public struct toolbarIcons + { + public IntPtr hToolbarBmp; + public IntPtr hToolbarIcon; + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Preference_h.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Preference_h.cs new file mode 100644 index 000000000000..c72ed1c2a22f --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Preference_h.cs @@ -0,0 +1,310 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +// +// This file should stay in sync with the CPP project file +// "notepad-plus-plus/scintilla/include/Scintilla.iface" +// found at +// https://github.com/notepad-plus-plus/notepad-plus-plus/blob/master/scintilla/include/Scintilla.iface +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NppPluginNET.PluginInfrastructure +{ + public enum Preference + { + /* ++Autogenerated -- start of section automatically generated from preference_rc.h */ + + IDD_PREFERENCE_BOX = 6000, + IDC_BUTTON_CLOSE = IDD_PREFERENCE_BOX + 1, + IDC_LIST_DLGTITLE = IDD_PREFERENCE_BOX + 2, + + IDD_PREFERENCE_BAR_BOX = 6100, + IDC_TOOLBAR_GB_STATIC = IDD_PREFERENCE_BAR_BOX + 1, + IDC_CHECK_HIDE = IDD_PREFERENCE_BAR_BOX + 2, + IDC_RADIO_SMALLICON = IDD_PREFERENCE_BAR_BOX + 3, + IDC_RADIO_BIGICON = IDD_PREFERENCE_BAR_BOX + 4, + IDC_RADIO_STANDARD = IDD_PREFERENCE_BAR_BOX + 5, + + IDC_TABBAR_GB_STATIC = IDD_PREFERENCE_BAR_BOX + 6, + IDC_CHECK_REDUCE = IDD_PREFERENCE_BAR_BOX + 7, + IDC_CHECK_LOCK = IDD_PREFERENCE_BAR_BOX + 8, + IDC_CHECK_DRAWINACTIVE = IDD_PREFERENCE_BAR_BOX + 9, + IDC_CHECK_ORANGE = IDD_PREFERENCE_BAR_BOX + 10, + IDC_CHECK_SHOWSTATUSBAR = IDD_PREFERENCE_BAR_BOX + 11, + IDC_CHECK_ENABLETABCLOSE = IDD_PREFERENCE_BAR_BOX + 12, + IDC_CHECK_DBCLICK2CLOSE = IDD_PREFERENCE_BAR_BOX + 13, + IDC_CHECK_ENABLEDOCSWITCHER = IDD_PREFERENCE_BAR_BOX + 14, + IDC_CHECK_MAINTAININDENT = IDD_PREFERENCE_BAR_BOX + 15, + IDC_CHECK_KEEPINSAMEDIR = IDD_PREFERENCE_BAR_BOX + 16, + IDC_CHECK_STYLEMRU = IDD_PREFERENCE_BAR_BOX + 17, + IDC_CHECK_TAB_HIDE = IDD_PREFERENCE_BAR_BOX + 18, + IDC_CHECK_TAB_MULTILINE = IDD_PREFERENCE_BAR_BOX + 19, + IDC_CHECK_TAB_VERTICAL = IDD_PREFERENCE_BAR_BOX + 20, + + IDC_CHECK_HIDEMENUBAR = IDD_PREFERENCE_BAR_BOX + 22, + IDC_LOCALIZATION_GB_STATIC = IDD_PREFERENCE_BAR_BOX + 23, + IDC_COMBO_LOCALIZATION = IDD_PREFERENCE_BAR_BOX + 24, + IDC_DOCSWITCH_GB_STATIC = IDD_PREFERENCE_BAR_BOX + 25, + IDC_CHECK_DOCSWITCH = IDD_PREFERENCE_BAR_BOX + 26, + IDC_CHECK_DOCSWITCH_NOEXTCOLUMN = IDD_PREFERENCE_BAR_BOX + 27, + + IDD_PREFERENCE_MULTIINSTANCE_BOX = 6150, + IDC_MULTIINST_GB_STATIC = IDD_PREFERENCE_MULTIINSTANCE_BOX + 1, + IDC_SESSIONININST_RADIO = IDD_PREFERENCE_MULTIINSTANCE_BOX + 2, + IDC_MULTIINST_RADIO = IDD_PREFERENCE_MULTIINSTANCE_BOX + 3, + IDC_MONOINST_RADIO = IDD_PREFERENCE_MULTIINSTANCE_BOX + 4, + IDD_STATIC_RESTARTNOTE = IDD_PREFERENCE_MULTIINSTANCE_BOX + 5, + + IDD_PREFERENCE_MARGEIN_BOX = 6200, + IDC_FMS_GB_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 1, + IDC_RADIO_SIMPLE = IDD_PREFERENCE_MARGEIN_BOX + 2, + IDC_RADIO_ARROW = IDD_PREFERENCE_MARGEIN_BOX + 3, + IDC_RADIO_CIRCLE = IDD_PREFERENCE_MARGEIN_BOX + 4, + IDC_RADIO_BOX = IDD_PREFERENCE_MARGEIN_BOX + 5, + + IDC_CHECK_LINENUMBERMARGE = IDD_PREFERENCE_MARGEIN_BOX + 6, + IDC_CHECK_BOOKMARKMARGE = IDD_PREFERENCE_MARGEIN_BOX + 7, + + IDC_CHECK_SHOWVERTICALEDGE = IDD_PREFERENCE_MARGEIN_BOX + 8, + IDC_NBCOLONE_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 9, + IDC_COLONENUMBER_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 10, + + IDC_VES_GB_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 11, + IDC_RADIO_LNMODE = IDD_PREFERENCE_MARGEIN_BOX + 12, + IDC_RADIO_BGMODE = IDD_PREFERENCE_MARGEIN_BOX + 13, + IDC_CHECK_CURRENTLINEHILITE = IDD_PREFERENCE_MARGEIN_BOX + 14, + IDC_CHECK_SMOOTHFONT = IDD_PREFERENCE_MARGEIN_BOX + 15, + + IDC_CARETSETTING_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 16, + IDC_WIDTH_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 17, + IDC_WIDTH_COMBO = IDD_PREFERENCE_MARGEIN_BOX + 18, + IDC_BLINKRATE_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 19, + IDC_CARETBLINKRATE_SLIDER = IDD_PREFERENCE_MARGEIN_BOX + 20, + IDC_CARETBLINKRATE_F_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 21, + IDC_CARETBLINKRATE_S_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 22, + IDC_CHECK_DOCCHANGESTATEMARGE = IDD_PREFERENCE_MARGEIN_BOX + 23, + IDC_MULTISELECTION_GB_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 24, + IDC_CHECK_MULTISELECTION = IDD_PREFERENCE_MARGEIN_BOX + 25, + + IDC_RADIO_FOLDMARGENONE = IDD_PREFERENCE_MARGEIN_BOX + 26, + + IDC_LW_GB_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 27, + IDC_RADIO_LWDEF = IDD_PREFERENCE_MARGEIN_BOX + 28, + IDC_RADIO_LWALIGN = IDD_PREFERENCE_MARGEIN_BOX + 29, + IDC_RADIO_LWINDENT = IDD_PREFERENCE_MARGEIN_BOX + 30, + + IDC_BORDERWIDTH_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 31, + IDC_BORDERWIDTHVAL_STATIC = IDD_PREFERENCE_MARGEIN_BOX + 32, + IDC_BORDERWIDTH_SLIDER = IDD_PREFERENCE_MARGEIN_BOX + 33, + IDC_CHECK_DISABLEADVANCEDSCROLL = IDD_PREFERENCE_MARGEIN_BOX + 34, + IDC_CHECK_NOEDGE = IDD_PREFERENCE_MARGEIN_BOX + 35, + + IDD_PREFERENCE_DELIMITERSETTINGS_BOX = 6250, + IDC_DELIMITERSETTINGS_GB_STATIC = IDD_PREFERENCE_DELIMITERSETTINGS_BOX + 1, + IDD_STATIC_OPENDELIMITER = IDD_PREFERENCE_DELIMITERSETTINGS_BOX + 2, + IDC_EDIT_OPENDELIMITER = IDD_PREFERENCE_DELIMITERSETTINGS_BOX + 3, + IDC_EDIT_CLOSEDELIMITER = IDD_PREFERENCE_DELIMITERSETTINGS_BOX + 4, + IDD_STATIC_CLOSEDELIMITER = IDD_PREFERENCE_DELIMITERSETTINGS_BOX + 5, + IDD_SEVERALLINEMODEON_CHECK = IDD_PREFERENCE_DELIMITERSETTINGS_BOX + 6, + IDD_STATIC_BLABLA = IDD_PREFERENCE_DELIMITERSETTINGS_BOX + 7, + IDD_STATIC_BLABLA2NDLINE = IDD_PREFERENCE_DELIMITERSETTINGS_BOX + 8, + + IDD_PREFERENCE_SETTINGSONCLOUD_BOX = 6260, + IDC_SETTINGSONCLOUD_WARNING_STATIC = IDD_PREFERENCE_SETTINGSONCLOUD_BOX + 1, + IDC_SETTINGSONCLOUD_GB_STATIC = IDD_PREFERENCE_SETTINGSONCLOUD_BOX + 2, + IDC_NOCLOUD_RADIO = IDD_PREFERENCE_SETTINGSONCLOUD_BOX + 3, + + IDC_WITHCLOUD_RADIO = IDD_PREFERENCE_SETTINGSONCLOUD_BOX + 7, + IDC_CLOUDPATH_EDIT = IDD_PREFERENCE_SETTINGSONCLOUD_BOX + 8, + IDD_CLOUDPATH_BROWSE_BUTTON = IDD_PREFERENCE_SETTINGSONCLOUD_BOX + 9, + + IDD_PREFERENCE_SETTING_BOX = 6300, + IDC_TABSETTING_GB_STATIC = IDD_PREFERENCE_SETTING_BOX + 1, + IDC_CHECK_REPLACEBYSPACE = IDD_PREFERENCE_SETTING_BOX + 2, + IDC_TABSIZE_STATIC = IDD_PREFERENCE_SETTING_BOX + 3, + IDC_HISTORY_GB_STATIC = IDD_PREFERENCE_SETTING_BOX + 4, + IDC_CHECK_DONTCHECKHISTORY = IDD_PREFERENCE_SETTING_BOX + 5, + IDC_MAXNBFILE_STATIC = IDD_PREFERENCE_SETTING_BOX + 6, + IDC_CHECK_FILEAUTODETECTION = IDD_PREFERENCE_SETTING_BOX + 7, + IDC_CHECK_MIN2SYSTRAY = IDD_PREFERENCE_SETTING_BOX + 8, + IDC_CHECK_REMEMBERSESSION = IDD_PREFERENCE_SETTING_BOX + 9, + IDC_TABSIZEVAL_STATIC = IDD_PREFERENCE_SETTING_BOX + 10, + IDC_MAXNBFILEVAL_STATIC = IDD_PREFERENCE_SETTING_BOX + 11, + IDC_FILEAUTODETECTION_STATIC = IDD_PREFERENCE_SETTING_BOX + 12, + IDC_CHECK_UPDATESILENTLY = IDD_PREFERENCE_SETTING_BOX + 13, + + IDC_RADIO_BKNONE = IDD_PREFERENCE_SETTING_BOX + 15, + IDC_RADIO_BKSIMPLE = IDD_PREFERENCE_SETTING_BOX + 16, + IDC_RADIO_BKVERBOSE = IDD_PREFERENCE_SETTING_BOX + 17, + IDC_CLICKABLELINK_STATIC = IDD_PREFERENCE_SETTING_BOX + 18, + IDC_CHECK_CLICKABLELINK_ENABLE = IDD_PREFERENCE_SETTING_BOX + 19, + IDC_CHECK_CLICKABLELINK_NOUNDERLINE = IDD_PREFERENCE_SETTING_BOX + 20, + IDC_EDIT_SESSIONFILEEXT = IDD_PREFERENCE_SETTING_BOX + 21, + IDC_SESSIONFILEEXT_STATIC = IDD_PREFERENCE_SETTING_BOX + 22, + IDC_CHECK_AUTOUPDATE = IDD_PREFERENCE_SETTING_BOX + 23, + IDC_DOCUMENTSWITCHER_STATIC = IDD_PREFERENCE_SETTING_BOX + 24, + IDC_CHECK_UPDATEGOTOEOF = IDD_PREFERENCE_SETTING_BOX + 25, + IDC_CHECK_ENABLSMARTHILITE = IDD_PREFERENCE_SETTING_BOX + 26, + IDC_CHECK_ENABLTAGSMATCHHILITE = IDD_PREFERENCE_SETTING_BOX + 27, + IDC_CHECK_ENABLTAGATTRHILITE = IDD_PREFERENCE_SETTING_BOX + 28, + IDC_TAGMATCHEDHILITE_STATIC = IDD_PREFERENCE_SETTING_BOX + 29, + IDC_CHECK_HIGHLITENONEHTMLZONE = IDD_PREFERENCE_SETTING_BOX + 30, + IDC_CHECK_SHORTTITLE = IDD_PREFERENCE_SETTING_BOX + 31, + IDC_CHECK_SMARTHILITECASESENSITIVE = IDD_PREFERENCE_SETTING_BOX + 32, + IDC_SMARTHILITING_STATIC = IDD_PREFERENCE_SETTING_BOX + 33, + IDC_CHECK_DETECTENCODING = IDD_PREFERENCE_SETTING_BOX + 34, + IDC_CHECK_BACKSLASHISESCAPECHARACTERFORSQL = IDD_PREFERENCE_SETTING_BOX + 35, + IDC_EDIT_WORKSPACEFILEEXT = IDD_PREFERENCE_SETTING_BOX + 36, + IDC_WORKSPACEFILEEXT_STATIC = IDD_PREFERENCE_SETTING_BOX + 37, + + IDC_PREFERENCE_OFFSET_FLS = 40, + IDC_CHECK_REMEMBEREDITVIEWPERFILE = IDD_PREFERENCE_SETTING_BOX + IDC_PREFERENCE_OFFSET_FLS + 1, + IDC_REMEMBEREDITVIEWPERFILE_STATIC = IDD_PREFERENCE_SETTING_BOX + IDC_PREFERENCE_OFFSET_FLS + 2, + IDC_EDIT_REMEMBEREDITVIEWPERFILE = IDD_PREFERENCE_SETTING_BOX + IDC_PREFERENCE_OFFSET_FLS + 3, + + IDD_PREFERENCE_NEWDOCSETTING_BOX = 6400, + IDC_FORMAT_GB_STATIC = IDD_PREFERENCE_NEWDOCSETTING_BOX + 1, + IDC_RADIO_F_WIN = IDD_PREFERENCE_NEWDOCSETTING_BOX + 2, + IDC_RADIO_F_UNIX = IDD_PREFERENCE_NEWDOCSETTING_BOX + 3, + IDC_RADIO_F_MAC = IDD_PREFERENCE_NEWDOCSETTING_BOX + 4, + IDC_ENCODING_STATIC = IDD_PREFERENCE_NEWDOCSETTING_BOX + 5, + IDC_RADIO_ANSI = IDD_PREFERENCE_NEWDOCSETTING_BOX + 6, + IDC_RADIO_UTF8SANSBOM = IDD_PREFERENCE_NEWDOCSETTING_BOX + 7, + IDC_RADIO_UTF8 = IDD_PREFERENCE_NEWDOCSETTING_BOX + 8, + IDC_RADIO_UCS2BIG = IDD_PREFERENCE_NEWDOCSETTING_BOX + 9, + IDC_RADIO_UCS2SMALL = IDD_PREFERENCE_NEWDOCSETTING_BOX + 10, + IDC_DEFAULTLANG_STATIC = IDD_PREFERENCE_NEWDOCSETTING_BOX + 11, + IDC_COMBO_DEFAULTLANG = IDD_PREFERENCE_NEWDOCSETTING_BOX + 12, + IDC_OPENSAVEDIR_GR_STATIC = IDD_PREFERENCE_NEWDOCSETTING_BOX + 13, + IDC_OPENSAVEDIR_FOLLOWCURRENT_RADIO = IDD_PREFERENCE_NEWDOCSETTING_BOX + 14, + IDC_OPENSAVEDIR_REMEMBERLAST_RADIO = IDD_PREFERENCE_NEWDOCSETTING_BOX + 15, + IDC_OPENSAVEDIR_ALWAYSON_RADIO = IDD_PREFERENCE_NEWDOCSETTING_BOX + 16, + IDC_OPENSAVEDIR_ALWAYSON_EDIT = IDD_PREFERENCE_NEWDOCSETTING_BOX + 17, + IDD_OPENSAVEDIR_ALWAYSON_BROWSE_BUTTON = IDD_PREFERENCE_NEWDOCSETTING_BOX + 18, + IDC_NEWDOCUMENT_GR_STATIC = IDD_PREFERENCE_NEWDOCSETTING_BOX + 19, + IDC_CHECK_OPENANSIASUTF8 = IDD_PREFERENCE_NEWDOCSETTING_BOX + 20, + IDC_RADIO_OTHERCP = IDD_PREFERENCE_NEWDOCSETTING_BOX + 21, + IDC_COMBO_OTHERCP = IDD_PREFERENCE_NEWDOCSETTING_BOX + 22, + IDC_GP_STATIC_RECENTFILES = IDD_PREFERENCE_NEWDOCSETTING_BOX + 23, + IDC_CHECK_INSUBMENU = IDD_PREFERENCE_NEWDOCSETTING_BOX + 24, + IDC_RADIO_ONLYFILENAME = IDD_PREFERENCE_NEWDOCSETTING_BOX + 25, + IDC_RADIO_FULLFILENAMEPATH = IDD_PREFERENCE_NEWDOCSETTING_BOX + 26, + IDC_RADIO_CUSTOMIZELENTH = IDD_PREFERENCE_NEWDOCSETTING_BOX + 27, + IDC_CUSTOMIZELENGTHVAL_STATIC = IDD_PREFERENCE_NEWDOCSETTING_BOX + 28, + IDC_DISPLAY_STATIC = IDD_PREFERENCE_NEWDOCSETTING_BOX + 29, + IDC_OPENSAVEDIR_CHECK_USENEWSTYLESAVEDIALOG = IDD_PREFERENCE_NEWDOCSETTING_BOX + 30, + + IDD_PREFERENCE_DEFAULTDIRECTORY_BOX = 6450, + IDD_PREFERENCE_RECENTFILESHISTORY_BOX = 6460, + + IDD_PREFERENCE_LANG_BOX = 6500, + IDC_LIST_ENABLEDLANG = IDD_PREFERENCE_LANG_BOX + 1, + IDC_LIST_DISABLEDLANG = IDD_PREFERENCE_LANG_BOX + 2, + IDC_BUTTON_REMOVE = IDD_PREFERENCE_LANG_BOX + 3, + IDC_BUTTON_RESTORE = IDD_PREFERENCE_LANG_BOX + 4, + IDC_ENABLEDITEMS_STATIC = IDD_PREFERENCE_LANG_BOX + 5, + IDC_DISABLEDITEMS_STATIC = IDD_PREFERENCE_LANG_BOX + 6, + IDC_CHECK_LANGMENUCOMPACT = IDD_PREFERENCE_LANG_BOX + 7, + IDC_CHECK_LANGMENU_GR_STATIC = IDD_PREFERENCE_LANG_BOX + 8, + IDC_LIST_TABSETTNG = IDD_PREFERENCE_LANG_BOX + 9, + IDC_CHECK_DEFAULTTABVALUE = IDD_PREFERENCE_LANG_BOX + 10, + IDC_GR_TABVALUE_STATIC = IDD_PREFERENCE_LANG_BOX + 11, + IDC_TABSIZEVAL_DISABLE_STATIC = IDD_PREFERENCE_LANG_BOX + 12, + IDD_PREFERENCE_TABSETTINGS_BOX = 6550, + + IDD_PREFERENCE_PRINT_BOX = 6600, + IDC_CHECK_PRINTLINENUM = IDD_PREFERENCE_PRINT_BOX + 1, + IDC_COLOUROPT_STATIC = IDD_PREFERENCE_PRINT_BOX + 2, + IDC_RADIO_WYSIWYG = IDD_PREFERENCE_PRINT_BOX + 3, + IDC_RADIO_INVERT = IDD_PREFERENCE_PRINT_BOX + 4, + IDC_RADIO_BW = IDD_PREFERENCE_PRINT_BOX + 5, + IDC_RADIO_NOBG = IDD_PREFERENCE_PRINT_BOX + 6, + IDC_MARGESETTINGS_STATIC = IDD_PREFERENCE_PRINT_BOX + 7, + IDC_EDIT_ML = IDD_PREFERENCE_PRINT_BOX + 8, + IDC_EDIT_MT = IDD_PREFERENCE_PRINT_BOX + 9, + IDC_EDIT_MR = IDD_PREFERENCE_PRINT_BOX + 10, + IDC_EDIT_MB = IDD_PREFERENCE_PRINT_BOX + 11, + IDC_ML_STATIC = IDD_PREFERENCE_PRINT_BOX + 12, + IDC_MT_STATIC = IDD_PREFERENCE_PRINT_BOX + 13, + IDC_MR_STATIC = IDD_PREFERENCE_PRINT_BOX + 14, + IDC_MB_STATIC = IDD_PREFERENCE_PRINT_BOX + 15, + + IDD_PREFERENCE_PRINT2_BOX = 6700, + IDC_EDIT_HLEFT = IDD_PREFERENCE_PRINT2_BOX + 1, + IDC_EDIT_HMIDDLE = IDD_PREFERENCE_PRINT2_BOX + 2, + IDC_EDIT_HRIGHT = IDD_PREFERENCE_PRINT2_BOX + 3, + IDC_COMBO_HFONTNAME = IDD_PREFERENCE_PRINT2_BOX + 4, + IDC_COMBO_HFONTSIZE = IDD_PREFERENCE_PRINT2_BOX + 5, + IDC_CHECK_HBOLD = IDD_PREFERENCE_PRINT2_BOX + 6, + IDC_CHECK_HITALIC = IDD_PREFERENCE_PRINT2_BOX + 7, + IDC_HGB_STATIC = IDD_PREFERENCE_PRINT2_BOX + 8, + IDC_HL_STATIC = IDD_PREFERENCE_PRINT2_BOX + 9, + IDC_HM_STATIC = IDD_PREFERENCE_PRINT2_BOX + 10, + IDC_HR_STATIC = IDD_PREFERENCE_PRINT2_BOX + 11, + IDC_EDIT_FLEFT = IDD_PREFERENCE_PRINT2_BOX + 12, + IDC_EDIT_FMIDDLE = IDD_PREFERENCE_PRINT2_BOX + 13, + IDC_EDIT_FRIGHT = IDD_PREFERENCE_PRINT2_BOX + 14, + IDC_COMBO_FFONTNAME = IDD_PREFERENCE_PRINT2_BOX + 15, + IDC_COMBO_FFONTSIZE = IDD_PREFERENCE_PRINT2_BOX + 16, + IDC_CHECK_FBOLD = IDD_PREFERENCE_PRINT2_BOX + 17, + IDC_CHECK_FITALIC = IDD_PREFERENCE_PRINT2_BOX + 18, + IDC_FGB_STATIC = IDD_PREFERENCE_PRINT2_BOX + 19, + IDC_FL_STATIC = IDD_PREFERENCE_PRINT2_BOX + 20, + IDC_FM_STATIC = IDD_PREFERENCE_PRINT2_BOX + 21, + IDC_FR_STATIC = IDD_PREFERENCE_PRINT2_BOX + 22, + IDC_BUTTON_ADDVAR = IDD_PREFERENCE_PRINT2_BOX + 23, + IDC_COMBO_VARLIST = IDD_PREFERENCE_PRINT2_BOX + 24, + IDC_VAR_STATIC = IDD_PREFERENCE_PRINT2_BOX + 25, + IDC_VIEWPANEL_STATIC = IDD_PREFERENCE_PRINT2_BOX + 26, + IDC_WHICHPART_STATIC = IDD_PREFERENCE_PRINT2_BOX + 27, + IDC_HEADERFPPTER_GR_STATIC = IDD_PREFERENCE_PRINT2_BOX + 28, + + IDD_PREFERENCE_BACKUP_BOX = 6800, + IDC_BACKUPDIR_GRP_STATIC = IDD_PREFERENCE_BACKUP_BOX + 1, + IDC_BACKUPDIR_CHECK = IDD_PREFERENCE_BACKUP_BOX + 2, + IDD_BACKUPDIR_STATIC = IDD_PREFERENCE_BACKUP_BOX + 3, + IDC_BACKUPDIR_USERCUSTOMDIR_GRPSTATIC = IDD_PREFERENCE_BACKUP_BOX + 4, + IDC_BACKUPDIR_EDIT = IDD_PREFERENCE_BACKUP_BOX + 5, + IDD_BACKUPDIR_BROWSE_BUTTON = IDD_PREFERENCE_BACKUP_BOX + 6, + IDD_AUTOC_GRPSTATIC = IDD_PREFERENCE_BACKUP_BOX + 7, + IDD_AUTOC_ENABLECHECK = IDD_PREFERENCE_BACKUP_BOX + 8, + IDD_AUTOC_FUNCRADIO = IDD_PREFERENCE_BACKUP_BOX + 9, + IDD_AUTOC_WORDRADIO = IDD_PREFERENCE_BACKUP_BOX + 10, + IDD_AUTOC_STATIC_FROM = IDD_PREFERENCE_BACKUP_BOX + 11, + IDD_AUTOC_STATIC_N = IDD_PREFERENCE_BACKUP_BOX + 12, + IDD_AUTOC_STATIC_CHAR = IDD_PREFERENCE_BACKUP_BOX + 13, + IDD_AUTOC_STATIC_NOTE = IDD_PREFERENCE_BACKUP_BOX + 14, + IDD_FUNC_CHECK = IDD_PREFERENCE_BACKUP_BOX + 15, + IDD_AUTOC_BOTHRADIO = IDD_PREFERENCE_BACKUP_BOX + 16, + IDC_BACKUPDIR_RESTORESESSION_GRP_STATIC = IDD_PREFERENCE_BACKUP_BOX + 17, + IDC_BACKUPDIR_RESTORESESSION_CHECK = IDD_PREFERENCE_BACKUP_BOX + 18, + IDD_BACKUPDIR_RESTORESESSION_STATIC1 = IDD_PREFERENCE_BACKUP_BOX + 19, + IDC_BACKUPDIR_RESTORESESSION_EDIT = IDD_PREFERENCE_BACKUP_BOX + 20, + IDD_BACKUPDIR_RESTORESESSION_STATIC2 = IDD_PREFERENCE_BACKUP_BOX + 21, + IDD_BACKUPDIR_RESTORESESSION_PATHLABEL_STATIC = IDD_PREFERENCE_BACKUP_BOX + 22, + IDD_BACKUPDIR_RESTORESESSION_PATH_EDIT = IDD_PREFERENCE_BACKUP_BOX + 23, + + IDD_PREFERENCE_AUTOCOMPLETION_BOX = 6850, + IDD_AUTOCINSERT_GRPSTATIC = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 1, + IDD_AUTOCPARENTHESES_CHECK = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 2, + IDD_AUTOCBRACKET_CHECK = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 3, + IDD_AUTOCCURLYBRACKET_CHECK = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 4, + IDD_AUTOC_DOUBLEQUOTESCHECK = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 5, + IDD_AUTOC_QUOTESCHECK = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 6, + IDD_AUTOCTAG_CHECK = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 7, + IDC_MACHEDPAIROPEN_STATIC = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 8, + IDC_MACHEDPAIRCLOSE_STATIC = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 9, + IDC_MACHEDPAIR_STATIC1 = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 10, + IDC_MACHEDPAIROPEN_EDIT1 = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 11, + IDC_MACHEDPAIRCLOSE_EDIT1 = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 12, + IDC_MACHEDPAIR_STATIC2 = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 13, + IDC_MACHEDPAIROPEN_EDIT2 = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 14, + IDC_MACHEDPAIRCLOSE_EDIT2 = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 15, + IDC_MACHEDPAIR_STATIC3 = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 16, + IDC_MACHEDPAIROPEN_EDIT3 = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 17, + IDC_MACHEDPAIRCLOSE_EDIT3 = IDD_PREFERENCE_AUTOCOMPLETION_BOX + 18, + + /* --Autogenerated -- end of section automatically generated from preference_rc.h */ + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Resource_h.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Resource_h.cs new file mode 100644 index 000000000000..f0b83615a605 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Resource_h.cs @@ -0,0 +1,350 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +// +// This file should stay in sync with the CPP project file +// "notepad-plus-plus/scintilla/include/Scintilla.iface" +// found at +// https://github.com/notepad-plus-plus/notepad-plus-plus/blob/master/scintilla/include/Scintilla.iface +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Kbg.NppPluginNET.PluginInfrastructure; + +namespace NppPluginNET.PluginInfrastructure +{ + public enum Resource + { + /* ++Autogenerated -- start of section automatically generated from resource.h */ + + IDC_STATIC = -1, + + IDI_M30ICON = 100, + IDI_CHAMELEON = 101, + + IDR_RT_MANIFEST = 103, + + IDI_NEW_OFF_ICON = 201, + IDI_OPEN_OFF_ICON = 202, + IDI_CLOSE_OFF_ICON = 203, + IDI_CLOSEALL_OFF_ICON = 204, + IDI_SAVE_OFF_ICON = 205, + IDI_SAVEALL_OFF_ICON = 206, + IDI_CUT_OFF_ICON = 207, + IDI_COPY_OFF_ICON = 208, + IDI_PASTE_OFF_ICON = 209, + IDI_UNDO_OFF_ICON = 210, + IDI_REDO_OFF_ICON = 211, + IDI_FIND_OFF_ICON = 212, + IDI_REPLACE_OFF_ICON = 213, + IDI_ZOOMIN_OFF_ICON = 214, + IDI_ZOOMOUT_OFF_ICON = 215, + IDI_VIEW_UD_DLG_OFF_ICON = 216, + IDI_PRINT_OFF_ICON = 217, + IDI_VIEW_ALL_CHAR_ON_ICON = 218, + IDI_VIEW_INDENT_ON_ICON = 219, + IDI_VIEW_WRAP_ON_ICON = 220, + + IDI_STARTRECORD_OFF_ICON = 221, + IDI_STARTRECORD_ON_ICON = 222, + IDI_STARTRECORD_DISABLE_ICON = 223, + IDI_STOPRECORD_OFF_ICON = 224, + IDI_STOPRECORD_ON_ICON = 225, + IDI_STOPRECORD_DISABLE_ICON = 226, + IDI_PLAYRECORD_OFF_ICON = 227, + IDI_PLAYRECORD_ON_ICON = 228, + IDI_PLAYRECORD_DISABLE_ICON = 229, + IDI_SAVERECORD_OFF_ICON = 230, + IDI_SAVERECORD_ON_ICON = 231, + IDI_SAVERECORD_DISABLE_ICON = 232, + + IDI_MMPLAY_DIS_ICON = 233, + IDI_MMPLAY_OFF_ICON = 234, + IDI_MMPLAY_ON_ICON = 235, + + IDI_NEW_ON_ICON = 301, + IDI_OPEN_ON_ICON = 302, + IDI_CLOSE_ON_ICON = 303, + IDI_CLOSEALL_ON_ICON = 304, + IDI_SAVE_ON_ICON = 305, + IDI_SAVEALL_ON_ICON = 306, + IDI_CUT_ON_ICON = 307, + IDI_COPY_ON_ICON = 308, + IDI_PASTE_ON_ICON = 309, + IDI_UNDO_ON_ICON = 310, + IDI_REDO_ON_ICON = 311, + IDI_FIND_ON_ICON = 312, + IDI_REPLACE_ON_ICON = 313, + IDI_ZOOMIN_ON_ICON = 314, + IDI_ZOOMOUT_ON_ICON = 315, + IDI_VIEW_UD_DLG_ON_ICON = 316, + IDI_PRINT_ON_ICON = 317, + IDI_VIEW_ALL_CHAR_OFF_ICON = 318, + IDI_VIEW_INDENT_OFF_ICON = 319, + IDI_VIEW_WRAP_OFF_ICON = 320, + + IDI_SAVE_DISABLE_ICON = 403, + IDI_SAVEALL_DISABLE_ICON = 404, + + IDI_CUT_DISABLE_ICON = 407, + IDI_COPY_DISABLE_ICON = 408, + IDI_PASTE_DISABLE_ICON = 409, + IDI_UNDO_DISABLE_ICON = 410, + IDI_REDO_DISABLE_ICON = 411, + IDI_DELETE_ICON = 412, + + IDI_SYNCV_OFF_ICON = 413, + IDI_SYNCV_ON_ICON = 414, + IDI_SYNCV_DISABLE_ICON = 415, + + IDI_SYNCH_OFF_ICON = 416, + IDI_SYNCH_ON_ICON = 417, + IDI_SYNCH_DISABLE_ICON = 418, + + IDI_SAVED_ICON = 501, + IDI_UNSAVED_ICON = 502, + IDI_READONLY_ICON = 503, + IDI_FIND_RESULT_ICON = 504, + + IDI_PROJECT_WORKSPACE = 601, + IDI_PROJECT_WORKSPACEDIRTY = 602, + IDI_PROJECT_PROJECT = 603, + IDI_PROJECT_FOLDEROPEN = 604, + IDI_PROJECT_FOLDERCLOSE = 605, + IDI_PROJECT_FILE = 606, + IDI_PROJECT_FILEINVALID = 607, + IDI_FB_ROOTOPEN = 608, + IDI_FB_ROOTCLOSE = 609, + + IDI_FUNCLIST_ROOT = 620, + IDI_FUNCLIST_NODE = 621, + IDI_FUNCLIST_LEAF = 622, + + IDI_FUNCLIST_SORTBUTTON = 631, + IDI_FUNCLIST_RELOADBUTTON = 632, + + IDC_MY_CUR = 1402, + IDC_UP_ARROW = 1403, + IDC_DRAG_TAB = 1404, + IDC_DRAG_INTERDIT_TAB = 1405, + IDC_DRAG_PLUS_TAB = 1406, + IDC_DRAG_OUT_TAB = 1407, + + IDC_MACRO_RECORDING = 1408, + + IDR_SAVEALL = 1500, + IDR_CLOSEFILE = 1501, + IDR_CLOSEALL = 1502, + IDR_FIND = 1503, + IDR_REPLACE = 1504, + IDR_ZOOMIN = 1505, + IDR_ZOOMOUT = 1506, + IDR_WRAP = 1507, + IDR_INVISIBLECHAR = 1508, + IDR_INDENTGUIDE = 1509, + IDR_SHOWPANNEL = 1510, + IDR_STARTRECORD = 1511, + IDR_STOPRECORD = 1512, + IDR_PLAYRECORD = 1513, + IDR_SAVERECORD = 1514, + IDR_SYNCV = 1515, + IDR_SYNCH = 1516, + IDR_FILENEW = 1517, + IDR_FILEOPEN = 1518, + IDR_FILESAVE = 1519, + IDR_PRINT = 1520, + IDR_CUT = 1521, + IDR_COPY = 1522, + IDR_PASTE = 1523, + IDR_UNDO = 1524, + IDR_REDO = 1525, + IDR_M_PLAYRECORD = 1526, + IDR_DOCMAP = 1527, + IDR_FUNC_LIST = 1528, + IDR_FILEBROWSER = 1529, + IDR_CLOSETAB = 1530, + IDR_CLOSETAB_INACT = 1531, + IDR_CLOSETAB_HOVER = 1532, + IDR_CLOSETAB_PUSH = 1533, + + IDR_FUNC_LIST_ICO = 1534, + IDR_DOCMAP_ICO = 1535, + IDR_PROJECTPANEL_ICO = 1536, + IDR_CLIPBOARDPANEL_ICO = 1537, + IDR_ASCIIPANEL_ICO = 1538, + IDR_DOCSWITCHER_ICO = 1539, + IDR_FILEBROWSER_ICO = 1540, + ID_MACRO = 20000, + ID_MACRO_LIMIT = 20200, + + ID_USER_CMD = 21000, + ID_USER_CMD_LIMIT = 21200, + + ID_PLUGINS_CMD = 22000, + ID_PLUGINS_CMD_LIMIT = 22500, + + ID_PLUGINS_CMD_DYNAMIC = 23000, + ID_PLUGINS_CMD_DYNAMIC_LIMIT = 24999, + + MARKER_PLUGINS = 3, + MARKER_PLUGINS_LIMIT = 19, + + ID_PLUGINS_REMOVING = 22501, + ID_PLUGINS_REMOVING_END = 22600, + + IDCMD = 50000, + + IDC_PREV_DOC = IDCMD+3, + IDC_NEXT_DOC = IDCMD+4, + IDC_EDIT_TOGGLEMACRORECORDING = IDCMD+5, + + IDCMD_LIMIT = IDCMD+20, + + IDSCINTILLA = 60000, + IDSCINTILLA_KEY_HOME = IDSCINTILLA+0, + IDSCINTILLA_KEY_HOME_WRAP = IDSCINTILLA+1, + IDSCINTILLA_KEY_END = IDSCINTILLA+2, + IDSCINTILLA_KEY_END_WRAP = IDSCINTILLA+3, + IDSCINTILLA_KEY_LINE_DUP = IDSCINTILLA+4, + IDSCINTILLA_KEY_LINE_CUT = IDSCINTILLA+5, + IDSCINTILLA_KEY_LINE_DEL = IDSCINTILLA+6, + IDSCINTILLA_KEY_LINE_TRANS = IDSCINTILLA+7, + IDSCINTILLA_KEY_LINE_COPY = IDSCINTILLA+8, + IDSCINTILLA_KEY_CUT = IDSCINTILLA+9, + IDSCINTILLA_KEY_COPY = IDSCINTILLA+10, + IDSCINTILLA_KEY_PASTE = IDSCINTILLA+11, + IDSCINTILLA_KEY_DEL = IDSCINTILLA+12, + IDSCINTILLA_KEY_SELECTALL = IDSCINTILLA+13, + IDSCINTILLA_KEY_OUTDENT = IDSCINTILLA+14, + IDSCINTILLA_KEY_UNDO = IDSCINTILLA+15, + IDSCINTILLA_KEY_REDO = IDSCINTILLA+16, + IDSCINTILLA_LIMIT = IDSCINTILLA+30, + + IDD_FILEVIEW_DIALOG = 1000, + + IDC_MINIMIZED_TRAY = 67001, + + IDD_CREATE_DIRECTORY = 1100, + IDC_STATIC_CURRENT_FOLDER = 1101, + IDC_EDIT_NEW_FOLDER = 1102, + + IDD_INSERT_INPUT_TEXT = 1200, + IDC_EDIT_INPUT_VALUE = 1201, + IDC_STATIC_INPUT_TITLE = 1202, + IDC_ICON_INPUT_ICON = 1203, + + IDR_M30_MENU = 1500, + + IDR_SYSTRAYPOPUP_MENU = 1501, + + IDD_ABOUTBOX = 1700, + IDC_LICENCE_EDIT = 1701, + IDC_HOME_ADDR = 1702, + IDC_EMAIL_ADDR = 1703, + IDC_ONLINEHELP_ADDR = 1704, + IDC_AUTHOR_NAME = 1705, + IDC_BUILD_DATETIME = 1706, + + IDD_DEBUGINFOBOX = 1750, + IDC_DEBUGINFO_EDIT = 1751, + IDC_DEBUGINFO_COPYLINK = 1752, + + IDD_GOLINE = 2000, + ID_GOLINE_EDIT = IDD_GOLINE + 1, + ID_CURRLINE = IDD_GOLINE + 2, + ID_LASTLINE = IDD_GOLINE + 3, + ID_URHERE_STATIC = IDD_GOLINE + 4, + ID_UGO_STATIC = IDD_GOLINE + 5, + ID_NOMORETHAN_STATIC = IDD_GOLINE + 6, + IDC_RADIO_GOTOLINE = IDD_GOLINE + 7, + IDC_RADIO_GOTOOFFSET = IDD_GOLINE + 8, + + IDD_VALUE_DLG = 2400, + IDC_VALUE_STATIC = 2401, + IDC_VALUE_EDIT = 2402, + + IDD_BUTTON_DLG = 2410, + IDC_RESTORE_BUTTON = 2411, + + IDD_SETTING_DLG = 2500, + + NOTEPADPLUS_USER_INTERNAL = Constants.WM_USER + 0000, + NPPM_INTERNAL_USERCMDLIST_MODIFIED = NOTEPADPLUS_USER_INTERNAL + 1, + NPPM_INTERNAL_CMDLIST_MODIFIED = NOTEPADPLUS_USER_INTERNAL + 2, + NPPM_INTERNAL_MACROLIST_MODIFIED = NOTEPADPLUS_USER_INTERNAL + 3, + NPPM_INTERNAL_PLUGINCMDLIST_MODIFIED = NOTEPADPLUS_USER_INTERNAL + 4, + NPPM_INTERNAL_CLEARSCINTILLAKEY = NOTEPADPLUS_USER_INTERNAL + 5, + NPPM_INTERNAL_BINDSCINTILLAKEY = NOTEPADPLUS_USER_INTERNAL + 6, + NPPM_INTERNAL_SCINTILLAKEYMODIFIED = NOTEPADPLUS_USER_INTERNAL + 7, + NPPM_INTERNAL_SCINTILLAFINFERCOLLAPSE = NOTEPADPLUS_USER_INTERNAL + 8, + NPPM_INTERNAL_SCINTILLAFINFERUNCOLLAPSE = NOTEPADPLUS_USER_INTERNAL + 9, + NPPM_INTERNAL_DISABLEAUTOUPDATE = NOTEPADPLUS_USER_INTERNAL + 10, + NPPM_INTERNAL_SETTING_HISTORY_SIZE = NOTEPADPLUS_USER_INTERNAL + 11, + NPPM_INTERNAL_ISTABBARREDUCED = NOTEPADPLUS_USER_INTERNAL + 12, + NPPM_INTERNAL_ISFOCUSEDTAB = NOTEPADPLUS_USER_INTERNAL + 13, + NPPM_INTERNAL_GETMENU = NOTEPADPLUS_USER_INTERNAL + 14, + NPPM_INTERNAL_CLEARINDICATOR = NOTEPADPLUS_USER_INTERNAL + 15, + NPPM_INTERNAL_SCINTILLAFINFERCOPY = NOTEPADPLUS_USER_INTERNAL + 16, + NPPM_INTERNAL_SCINTILLAFINFERSELECTALL = NOTEPADPLUS_USER_INTERNAL + 17, + NPPM_INTERNAL_SETCARETWIDTH = NOTEPADPLUS_USER_INTERNAL + 18, + NPPM_INTERNAL_SETCARETBLINKRATE = NOTEPADPLUS_USER_INTERNAL + 19, + NPPM_INTERNAL_CLEARINDICATORTAGMATCH = NOTEPADPLUS_USER_INTERNAL + 20, + NPPM_INTERNAL_CLEARINDICATORTAGATTR = NOTEPADPLUS_USER_INTERNAL + 21, + NPPM_INTERNAL_SWITCHVIEWFROMHWND = NOTEPADPLUS_USER_INTERNAL + 22, + NPPM_INTERNAL_UPDATETITLEBAR = NOTEPADPLUS_USER_INTERNAL + 23, + NPPM_INTERNAL_CANCEL_FIND_IN_FILES = NOTEPADPLUS_USER_INTERNAL + 24, + NPPM_INTERNAL_RELOADNATIVELANG = NOTEPADPLUS_USER_INTERNAL + 25, + NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED = NOTEPADPLUS_USER_INTERNAL + 26, + NPPM_INTERNAL_SCINTILLAFINFERCLEARALL = NOTEPADPLUS_USER_INTERNAL + 27, + NPPM_INTERNAL_SETTING_EDGE_SIZE = NOTEPADPLUS_USER_INTERNAL + 28, + NPPM_INTERNAL_SETTING_TAB_REPLCESPACE = NOTEPADPLUS_USER_INTERNAL + 29, + NPPM_INTERNAL_SETTING_TAB_SIZE = NOTEPADPLUS_USER_INTERNAL + 30, + NPPM_INTERNAL_RELOADSTYLERS = NOTEPADPLUS_USER_INTERNAL + 31, + NPPM_INTERNAL_DOCORDERCHANGED = NOTEPADPLUS_USER_INTERNAL + 32, + NPPM_INTERNAL_SETMULTISELCTION = NOTEPADPLUS_USER_INTERNAL + 33, + NPPM_INTERNAL_SCINTILLAFINFEROPENALL = NOTEPADPLUS_USER_INTERNAL + 34, + NPPM_INTERNAL_RECENTFILELIST_UPDATE = NOTEPADPLUS_USER_INTERNAL + 35, + NPPM_INTERNAL_RECENTFILELIST_SWITCH = NOTEPADPLUS_USER_INTERNAL + 36, + NPPM_INTERNAL_GETSCINTEDTVIEW = NOTEPADPLUS_USER_INTERNAL + 37, + NPPM_INTERNAL_ENABLESNAPSHOT = NOTEPADPLUS_USER_INTERNAL + 38, + NPPM_INTERNAL_SAVECURRENTSESSION = NOTEPADPLUS_USER_INTERNAL + 39, + NPPM_INTERNAL_FINDINFINDERDLG = NOTEPADPLUS_USER_INTERNAL + 40, + NPPM_INTERNAL_REMOVEFINDER = NOTEPADPLUS_USER_INTERNAL + 41, + + NPPM_INTERNAL_CHECKDOCSTATUS = Constants.NPPMSG + 53, + + NPPM_INTERNAL_ENABLECHECKDOCOPT = Constants.NPPMSG + 54, + + CHECKDOCOPT_NONE = 0, + CHECKDOCOPT_UPDATESILENTLY = 1, + CHECKDOCOPT_UPDATEGO2END = 2, + + NPPM_INTERNAL_GETCHECKDOCOPT = Constants.NPPMSG + 55, + + NPPM_INTERNAL_SETCHECKDOCOPT = Constants.NPPMSG + 56, + + NPPM_INTERNAL_SETFILENAME = Constants.NPPMSG + 63, + + SCINTILLA_USER = Constants.WM_USER + 2000, + + MACRO_USER = Constants.WM_USER + 4000, + WM_GETCURRENTMACROSTATUS = MACRO_USER + 01, + WM_MACRODLGRUNMACRO = MACRO_USER + 02, + + SPLITTER_USER = Constants.WM_USER + 4000, + WORDSTYLE_USER = Constants.WM_USER + 5000, + COLOURPOPUP_USER = Constants.WM_USER + 6000, + BABYGRID_USER = Constants.WM_USER + 7000, + + MENUINDEX_FILE = 0, + MENUINDEX_EDIT = 1, + MENUINDEX_SEARCH = 2, + MENUINDEX_VIEW = 3, + MENUINDEX_FORMAT = 4, + MENUINDEX_LANGUAGE = 5, + MENUINDEX_SETTINGS = 6, + MENUINDEX_MACRO = 7, + MENUINDEX_RUN = 8, + MENUINDEX_PLUGINS = 9, + /* --Autogenerated -- end of section automatically generated from resource.h */ + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/ScintillaGateway.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/ScintillaGateway.cs new file mode 100644 index 000000000000..0ff2c5145b35 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/ScintillaGateway.cs @@ -0,0 +1,5197 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +using System; +using System.Runtime.InteropServices; +using System.Text; +using static Kbg.NppPluginNET.PluginInfrastructure.Win32; + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + /// + /// This it the plugin-writers primary interface to Notepad++/Scintilla. + /// It takes away all the complexity with command numbers and Int-pointer casting. + /// + /// See http://www.scintilla.org/ScintillaDoc.html for further details. + /// + public class ScintillaGateway : IScintillaGateway + { + private const int Unused = 0; + + private IntPtr scintilla; + + public static readonly int LengthZeroTerminator = "\0".Length; + + /// + /// + /// + public IntPtr CurrentBufferID { get; set; } + + + public ScintillaGateway(IntPtr scintilla) + { + this.scintilla = scintilla; + } + + /// + /// Switch the handle between main and second window handle. + /// + public void SwitchScintillaHandle() + { + this.scintilla = this.scintilla == PluginBase.nppData._scintillaMainHandle ? PluginBase.nppData._scintillaSecondHandle : PluginBase.nppData._scintillaMainHandle; + } + + /// + /// Change the Scintilla window handle for this Gateway + /// and return the previous handle for potentially final updates. + /// + /// + /// + public IntPtr SetScintillaHandle(IntPtr newHandle) + { + IntPtr oldHandle = this.scintilla; + this.scintilla = newHandle; + return oldHandle; + } + + /// + /// Return the current Scintilla window handle + /// + /// + public IntPtr GetScintillaHandle() + { + return this.scintilla; + } + + public int GetSelectionLength() + { + var selectionLength = (int) Win32.SendMessage(scintilla, SciMsg.SCI_GETSELTEXT, Unused, Unused) - LengthZeroTerminator; + return selectionLength; + } + + public void AppendTextAndMoveCursor(string text) + { + AppendText(text.Length, text); + GotoPos(new Position(GetCurrentPos().Value + text.Length)); + } + + public void InsertTextAndMoveCursor(string text) + { + var currentPos = GetCurrentPos(); + InsertText(currentPos, text); + GotoPos(new Position(currentPos.Value + text.Length)); + } + + public void SelectCurrentLine() + { + int line = GetCurrentLineNumber(); + SetSelection(PositionFromLine(line).Value, PositionFromLine(line + 1).Value); + } + + /// + /// clears the selection without changing the position of the cursor + /// + public void ClearSelectionToCursor() + { + var pos = GetCurrentPos().Value; + SetSelection(pos, pos); + } + + /// + /// Get the current line from the current position + /// + public int GetCurrentLineNumber() + { + return LineFromPosition(GetCurrentPos()); + } + + /// + /// Get the scroll information for the current Scintilla window. + /// + /// Arguments for the scroll information such as tracking + /// Which scroll bar information are you looking for + /// A ScrollInfo struct with information of the current scroll state + public ScrollInfo GetScrollInfo(ScrollInfoMask mask = ScrollInfoMask.SIF_ALL, ScrollInfoBar scrollBar = ScrollInfoBar.SB_BOTH) + { + ScrollInfo scrollInfo = new ScrollInfo(); + scrollInfo.cbSize = (uint)Marshal.SizeOf(scrollInfo); + scrollInfo.fMask = (uint)mask; + Win32.GetScrollInfo(scintilla, (int)scrollBar, ref scrollInfo); + return scrollInfo; + } + + /* ++Autogenerated -- start of section automatically generated from Scintilla.iface */ + /// Add text to the document at current position. (Scintilla feature 2001) + public unsafe void AddText(int length, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ADDTEXT, length, (IntPtr) textPtr); + } + } + + /// Add array of cells to document. (Scintilla feature 2002) + public unsafe void AddStyledText(int length, Cells c) + { + fixed (char* cPtr = c.Value) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ADDSTYLEDTEXT, length, (IntPtr) cPtr); + } + } + + /// Insert string at a position. (Scintilla feature 2003) + public unsafe void InsertText(Position pos, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INSERTTEXT, pos.Value, (IntPtr) textPtr); + } + } + + /// Change the text that is being inserted in response to SC_MOD_INSERTCHECK (Scintilla feature 2672) + public unsafe void ChangeInsertion(int length, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CHANGEINSERTION, length, (IntPtr) textPtr); + } + } + + /// Delete all text in the document. (Scintilla feature 2004) + public void ClearAll() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CLEARALL, Unused, Unused); + } + + /// Delete a range of text in the document. (Scintilla feature 2645) + public void DeleteRange(Position pos, int deleteLength) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DELETERANGE, pos.Value, deleteLength); + } + + /// Set all style bytes to 0, remove all folding information. (Scintilla feature 2005) + public void ClearDocumentStyle() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CLEARDOCUMENTSTYLE, Unused, Unused); + } + + /// Returns the number of bytes in the document. (Scintilla feature 2006) + public int GetLength() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLENGTH, Unused, Unused); + return (int) res; + } + + /// Returns the character byte at the position. (Scintilla feature 2007) + public int GetCharAt(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCHARAT, pos.Value, Unused); + return (int) res; + } + + /// Returns the position of the caret. (Scintilla feature 2008) + public Position GetCurrentPos() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCURRENTPOS, Unused, Unused); + return new Position((int) res); + } + + /// Returns the position of the opposite end of the selection to the caret. (Scintilla feature 2009) + public Position GetAnchor() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETANCHOR, Unused, Unused); + return new Position((int) res); + } + + /// Returns the style byte at the position. (Scintilla feature 2010) + public int GetStyleAt(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSTYLEAT, pos.Value, Unused); + return (int) res; + } + + /// Redoes the next action on the undo history. (Scintilla feature 2011) + public void Redo() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_REDO, Unused, Unused); + } + + /// + /// Choose between collecting actions into the undo + /// history and discarding them. + /// (Scintilla feature 2012) + /// + public void SetUndoCollection(bool collectUndo) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETUNDOCOLLECTION, collectUndo ? 1 : 0, Unused); + } + + /// Select all the text in the document. (Scintilla feature 2013) + public void SelectAll() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SELECTALL, Unused, Unused); + } + + /// + /// Remember the current position in the undo history as the position + /// at which the document was saved. + /// (Scintilla feature 2014) + /// + public void SetSavePoint() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSAVEPOINT, Unused, Unused); + } + + /// + /// Retrieve a buffer of cells. + /// Returns the number of bytes in the buffer not including terminating NULs. + /// (Scintilla feature 2015) + /// + public int GetStyledText(TextRange tr) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSTYLEDTEXT, Unused, tr.NativePointer); + return (int) res; + } + + /// Are there any redoable actions in the undo history? (Scintilla feature 2016) + public bool CanRedo() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CANREDO, Unused, Unused); + return 1 == (int) res; + } + + /// Retrieve the line number at which a particular marker is located. (Scintilla feature 2017) + public int MarkerLineFromHandle(int handle) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERLINEFROMHANDLE, handle, Unused); + return (int) res; + } + + /// Delete a marker. (Scintilla feature 2018) + public void MarkerDeleteHandle(int handle) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERDELETEHANDLE, handle, Unused); + } + + /// Is undo history being collected? (Scintilla feature 2019) + public bool GetUndoCollection() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETUNDOCOLLECTION, Unused, Unused); + return 1 == (int) res; + } + + /// + /// Are white space characters currently visible? + /// Returns one of SCWS_* constants. + /// (Scintilla feature 2020) + /// + public int GetViewWS() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETVIEWWS, Unused, Unused); + return (int) res; + } + + /// Make white space characters invisible, always visible or visible outside indentation. (Scintilla feature 2021) + public void SetViewWS(int viewWS) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETVIEWWS, viewWS, Unused); + } + + /// Find the position from a point within the window. (Scintilla feature 2022) + public Position PositionFromPoint(int x, int y) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_POSITIONFROMPOINT, x, y); + return new Position((int) res); + } + + /// + /// Find the position from a point within the window but return + /// INVALID_POSITION if not close to text. + /// (Scintilla feature 2023) + /// + public Position PositionFromPointClose(int x, int y) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_POSITIONFROMPOINTCLOSE, x, y); + return new Position((int) res); + } + + /// Set caret to start of a line and ensure it is visible. (Scintilla feature 2024) + public void GotoLine(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GOTOLINE, line, Unused); + } + + /// Set caret to a position and ensure it is visible. (Scintilla feature 2025) + public void GotoPos(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GOTOPOS, pos.Value, Unused); + } + + /// + /// Set the selection anchor to a position. The anchor is the opposite + /// end of the selection from the caret. + /// (Scintilla feature 2026) + /// + public void SetAnchor(Position posAnchor) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETANCHOR, posAnchor.Value, Unused); + } + + /// + /// Retrieve the text of the line containing the caret. + /// Returns the index of the caret on the line. + /// Result is NUL-terminated. + /// (Scintilla feature 2027) + /// + public unsafe string GetCurLine(int length) + { + byte[] textBuffer = new byte[10000]; + fixed (byte* textPtr = textBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCURLINE, length, (IntPtr) textPtr); + return Encoding.UTF8.GetString(textBuffer).TrimEnd('\0'); + } + } + + /// Retrieve the position of the last correctly styled character. (Scintilla feature 2028) + public Position GetEndStyled() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETENDSTYLED, Unused, Unused); + return new Position((int) res); + } + + /// Convert all line endings in the document to one mode. (Scintilla feature 2029) + public void ConvertEOLs(int eolMode) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CONVERTEOLS, eolMode, Unused); + } + + /// Retrieve the current end of line mode - one of CRLF, CR, or LF. (Scintilla feature 2030) + public int GetEOLMode() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETEOLMODE, Unused, Unused); + return (int) res; + } + + /// Set the current end of line mode. (Scintilla feature 2031) + public void SetEOLMode(int eolMode) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETEOLMODE, eolMode, Unused); + } + + /// + /// 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. + /// (Scintilla feature 2032) + /// + public void StartStyling(Position pos, int mask) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STARTSTYLING, pos.Value, 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. + /// (Scintilla feature 2033) + /// + public void SetStyling(int length, int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSTYLING, length, style); + } + + /// Is drawing done first into a buffer or direct to the screen? (Scintilla feature 2034) + public bool GetBufferedDraw() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETBUFFEREDDRAW, Unused, Unused); + return 1 == (int) res; + } + + /// + /// If drawing is buffered then each line of text is drawn into a bitmap buffer + /// before drawing it to the screen to avoid flicker. + /// (Scintilla feature 2035) + /// + public void SetBufferedDraw(bool buffered) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETBUFFEREDDRAW, buffered ? 1 : 0, Unused); + } + + /// Change the visible size of a tab to be a multiple of the width of a space character. (Scintilla feature 2036) + public void SetTabWidth(int tabWidth) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETTABWIDTH, tabWidth, Unused); + } + + /// Retrieve the visible size of a tab. (Scintilla feature 2121) + public int GetTabWidth() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETTABWIDTH, Unused, Unused); + return (int) res; + } + + /// Clear explicit tabstops on a line. (Scintilla feature 2675) + public void ClearTabStops(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CLEARTABSTOPS, line, Unused); + } + + /// Add an explicit tab stop for a line. (Scintilla feature 2676) + public void AddTabStop(int line, int x) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ADDTABSTOP, line, x); + } + + /// Find the next explicit tab stop position on a line after a position. (Scintilla feature 2677) + public int GetNextTabStop(int line, int x) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETNEXTTABSTOP, line, x); + return (int) res; + } + + /// + /// 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. + /// (Scintilla feature 2037) + /// + public void SetCodePage(int codePage) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCODEPAGE, codePage, Unused); + } + + /// Is the IME displayed in a winow or inline? (Scintilla feature 2678) + public int GetIMEInteraction() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETIMEINTERACTION, Unused, Unused); + return (int) res; + } + + /// Choose to display the the IME in a winow or inline. (Scintilla feature 2679) + public void SetIMEInteraction(int imeInteraction) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETIMEINTERACTION, imeInteraction, Unused); + } + + /// Set the symbol used for a particular marker number. (Scintilla feature 2040) + public void MarkerDefine(int markerNumber, int markerSymbol) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERDEFINE, markerNumber, markerSymbol); + } + + /// Set the foreground colour used for a particular marker number. (Scintilla feature 2041) + public void MarkerSetFore(int markerNumber, Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERSETFORE, markerNumber, fore.Value); + } + + /// Set the background colour used for a particular marker number. (Scintilla feature 2042) + public void MarkerSetBack(int markerNumber, Colour back) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERSETBACK, markerNumber, back.Value); + } + + /// Set the background colour used for a particular marker number when its folding block is selected. (Scintilla feature 2292) + public void MarkerSetBackSelected(int markerNumber, Colour back) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERSETBACKSELECTED, markerNumber, back.Value); + } + + /// Enable/disable highlight for current folding bloc (smallest one that contains the caret) (Scintilla feature 2293) + public void MarkerEnableHighlight(bool enabled) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERENABLEHIGHLIGHT, enabled ? 1 : 0, Unused); + } + + /// Add a marker to a line, returning an ID which can be used to find or delete the marker. (Scintilla feature 2043) + public int MarkerAdd(int line, int markerNumber) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERADD, line, markerNumber); + return (int) res; + } + + /// Delete a marker from a line. (Scintilla feature 2044) + public void MarkerDelete(int line, int markerNumber) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERDELETE, line, markerNumber); + } + + /// Delete all markers with a particular number from all lines. (Scintilla feature 2045) + public void MarkerDeleteAll(int markerNumber) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERDELETEALL, markerNumber, Unused); + } + + /// Get a bit mask of all the markers set on a line. (Scintilla feature 2046) + public int MarkerGet(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERGET, line, Unused); + return (int) res; + } + + /// + /// Find the next line at or after lineStart that includes a marker in mask. + /// Return -1 when no more lines. + /// (Scintilla feature 2047) + /// + public int MarkerNext(int lineStart, int markerMask) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERNEXT, lineStart, markerMask); + return (int) res; + } + + /// Find the previous line before lineStart that includes a marker in mask. (Scintilla feature 2048) + public int MarkerPrevious(int lineStart, int markerMask) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERPREVIOUS, lineStart, markerMask); + return (int) res; + } + + /// Define a marker from a pixmap. (Scintilla feature 2049) + public unsafe void MarkerDefinePixmap(int markerNumber, string pixmap) + { + fixed (byte* pixmapPtr = Encoding.UTF8.GetBytes(pixmap)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERDEFINEPIXMAP, markerNumber, (IntPtr) pixmapPtr); + } + } + + /// Add a set of markers to a line. (Scintilla feature 2466) + public void MarkerAddSet(int line, int set) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERADDSET, line, set); + } + + /// Set the alpha used for a marker that is drawn in the text area, not the margin. (Scintilla feature 2476) + public void MarkerSetAlpha(int markerNumber, int alpha) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERSETALPHA, markerNumber, alpha); + } + + /// Set a margin to be either numeric or symbolic. (Scintilla feature 2240) + public void SetMarginTypeN(int margin, int marginType) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMARGINTYPEN, margin, marginType); + } + + /// Retrieve the type of a margin. (Scintilla feature 2241) + public int GetMarginTypeN(int margin) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMARGINTYPEN, margin, Unused); + return (int) res; + } + + /// Set the width of a margin to a width expressed in pixels. (Scintilla feature 2242) + public void SetMarginWidthN(int margin, int pixelWidth) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMARGINWIDTHN, margin, pixelWidth); + } + + /// Retrieve the width of a margin in pixels. (Scintilla feature 2243) + public int GetMarginWidthN(int margin) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMARGINWIDTHN, margin, Unused); + return (int) res; + } + + /// Set a mask that determines which markers are displayed in a margin. (Scintilla feature 2244) + public void SetMarginMaskN(int margin, int mask) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMARGINMASKN, margin, mask); + } + + /// Retrieve the marker mask of a margin. (Scintilla feature 2245) + public int GetMarginMaskN(int margin) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMARGINMASKN, margin, Unused); + return (int) res; + } + + /// Make a margin sensitive or insensitive to mouse clicks. (Scintilla feature 2246) + public void SetMarginSensitiveN(int margin, bool sensitive) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMARGINSENSITIVEN, margin, sensitive ? 1 : 0); + } + + /// Retrieve the mouse click sensitivity of a margin. (Scintilla feature 2247) + public bool GetMarginSensitiveN(int margin) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMARGINSENSITIVEN, margin, Unused); + return 1 == (int) res; + } + + /// Set the cursor shown when the mouse is inside a margin. (Scintilla feature 2248) + public void SetMarginCursorN(int margin, int cursor) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMARGINCURSORN, margin, cursor); + } + + /// Retrieve the cursor shown in a margin. (Scintilla feature 2249) + public int GetMarginCursorN(int margin) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMARGINCURSORN, margin, Unused); + return (int) res; + } + + /// Clear all the styles and make equivalent to the global default style. (Scintilla feature 2050) + public void StyleClearAll() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLECLEARALL, Unused, Unused); + } + + /// Set the foreground colour of a style. (Scintilla feature 2051) + public void StyleSetFore(int style, Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETFORE, style, fore.Value); + } + + /// Set the background colour of a style. (Scintilla feature 2052) + public void StyleSetBack(int style, Colour back) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETBACK, style, back.Value); + } + + /// Set a style to be bold or not. (Scintilla feature 2053) + public void StyleSetBold(int style, bool bold) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETBOLD, style, bold ? 1 : 0); + } + + /// Set a style to be italic or not. (Scintilla feature 2054) + public void StyleSetItalic(int style, bool italic) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETITALIC, style, italic ? 1 : 0); + } + + /// Set the size of characters of a style. (Scintilla feature 2055) + public void StyleSetSize(int style, int sizePoints) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETSIZE, style, sizePoints); + } + + /// Set the font of a style. (Scintilla feature 2056) + public unsafe void StyleSetFont(int style, string fontName) + { + fixed (byte* fontNamePtr = Encoding.UTF8.GetBytes(fontName)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETFONT, style, (IntPtr) fontNamePtr); + } + } + + /// Set a style to have its end of line filled or not. (Scintilla feature 2057) + public void StyleSetEOLFilled(int style, bool filled) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETEOLFILLED, style, filled ? 1 : 0); + } + + /// Reset the default style to its state at startup (Scintilla feature 2058) + public void StyleResetDefault() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLERESETDEFAULT, Unused, Unused); + } + + /// Set a style to be underlined or not. (Scintilla feature 2059) + public void StyleSetUnderline(int style, bool underline) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETUNDERLINE, style, underline ? 1 : 0); + } + + /// Get the foreground colour of a style. (Scintilla feature 2481) + public Colour StyleGetFore(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETFORE, style, Unused); + return new Colour((int) res); + } + + /// Get the background colour of a style. (Scintilla feature 2482) + public Colour StyleGetBack(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETBACK, style, Unused); + return new Colour((int) res); + } + + /// Get is a style bold or not. (Scintilla feature 2483) + public bool StyleGetBold(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETBOLD, style, Unused); + return 1 == (int) res; + } + + /// Get is a style italic or not. (Scintilla feature 2484) + public bool StyleGetItalic(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETITALIC, style, Unused); + return 1 == (int) res; + } + + /// Get the size of characters of a style. (Scintilla feature 2485) + public int StyleGetSize(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETSIZE, style, Unused); + return (int) res; + } + + /// + /// Get the font of a style. + /// Returns the length of the fontName + /// Result is NUL-terminated. + /// (Scintilla feature 2486) + /// + public unsafe string StyleGetFont(int style) + { + byte[] fontNameBuffer = new byte[10000]; + fixed (byte* fontNamePtr = fontNameBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETFONT, style, (IntPtr) fontNamePtr); + return Encoding.UTF8.GetString(fontNameBuffer).TrimEnd('\0'); + } + } + + /// Get is a style to have its end of line filled or not. (Scintilla feature 2487) + public bool StyleGetEOLFilled(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETEOLFILLED, style, Unused); + return 1 == (int) res; + } + + /// Get is a style underlined or not. (Scintilla feature 2488) + public bool StyleGetUnderline(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETUNDERLINE, style, Unused); + return 1 == (int) res; + } + + /// Get is a style mixed case, or to force upper or lower case. (Scintilla feature 2489) + public int StyleGetCase(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETCASE, style, Unused); + return (int) res; + } + + /// Get the character get of the font in a style. (Scintilla feature 2490) + public int StyleGetCharacterSet(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETCHARACTERSET, style, Unused); + return (int) res; + } + + /// Get is a style visible or not. (Scintilla feature 2491) + public bool StyleGetVisible(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETVISIBLE, style, Unused); + return 1 == (int) res; + } + + /// + /// Get is a style changeable or not (read only). + /// Experimental feature, currently buggy. + /// (Scintilla feature 2492) + /// + public bool StyleGetChangeable(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETCHANGEABLE, style, Unused); + return 1 == (int) res; + } + + /// Get is a style a hotspot or not. (Scintilla feature 2493) + public bool StyleGetHotSpot(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETHOTSPOT, style, Unused); + return 1 == (int) res; + } + + /// Set a style to be mixed case, or to force upper or lower case. (Scintilla feature 2060) + public void StyleSetCase(int style, int caseForce) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETCASE, style, caseForce); + } + + /// Set the size of characters of a style. Size is in points multiplied by 100. (Scintilla feature 2061) + public void StyleSetSizeFractional(int style, int caseForce) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETSIZEFRACTIONAL, style, caseForce); + } + + /// Get the size of characters of a style in points multiplied by 100 (Scintilla feature 2062) + public int StyleGetSizeFractional(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETSIZEFRACTIONAL, style, Unused); + return (int) res; + } + + /// Set the weight of characters of a style. (Scintilla feature 2063) + public void StyleSetWeight(int style, int weight) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETWEIGHT, style, weight); + } + + /// Get the weight of characters of a style. (Scintilla feature 2064) + public int StyleGetWeight(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLEGETWEIGHT, style, Unused); + return (int) res; + } + + /// Set the character set of the font in a style. (Scintilla feature 2066) + public void StyleSetCharacterSet(int style, int characterSet) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETCHARACTERSET, style, characterSet); + } + + /// Set a style to be a hotspot or not. (Scintilla feature 2409) + public void StyleSetHotSpot(int style, bool hotspot) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETHOTSPOT, style, hotspot ? 1 : 0); + } + + /// Set the foreground colour of the main and additional selections and whether to use this setting. (Scintilla feature 2067) + public void SetSelFore(bool useSetting, Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELFORE, useSetting ? 1 : 0, fore.Value); + } + + /// Set the background colour of the main and additional selections and whether to use this setting. (Scintilla feature 2068) + public void SetSelBack(bool useSetting, Colour back) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELBACK, useSetting ? 1 : 0, back.Value); + } + + /// Get the alpha of the selection. (Scintilla feature 2477) + public int GetSelAlpha() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELALPHA, Unused, Unused); + return (int) res; + } + + /// Set the alpha of the selection. (Scintilla feature 2478) + public void SetSelAlpha(int alpha) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELALPHA, alpha, Unused); + } + + /// Is the selection end of line filled? (Scintilla feature 2479) + public bool GetSelEOLFilled() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELEOLFILLED, Unused, Unused); + return 1 == (int) res; + } + + /// Set the selection to have its end of line filled or not. (Scintilla feature 2480) + public void SetSelEOLFilled(bool filled) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELEOLFILLED, filled ? 1 : 0, Unused); + } + + /// Set the foreground colour of the caret. (Scintilla feature 2069) + public void SetCaretFore(Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCARETFORE, fore.Value, Unused); + } + + /// When key+modifier combination km is pressed perform msg. (Scintilla feature 2070) + public void AssignCmdKey(KeyModifier km, int msg) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ASSIGNCMDKEY, km.Value, msg); + } + + /// When key+modifier combination km is pressed do nothing. (Scintilla feature 2071) + public void ClearCmdKey(KeyModifier km) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CLEARCMDKEY, km.Value, Unused); + } + + /// Drop all key mappings. (Scintilla feature 2072) + public void ClearAllCmdKeys() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CLEARALLCMDKEYS, Unused, Unused); + } + + /// Set the styles for a segment of the document. (Scintilla feature 2073) + public unsafe void SetStylingEx(int length, string styles) + { + fixed (byte* stylesPtr = Encoding.UTF8.GetBytes(styles)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSTYLINGEX, length, (IntPtr) stylesPtr); + } + } + + /// Set a style to be visible or not. (Scintilla feature 2074) + public void StyleSetVisible(int style, bool visible) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETVISIBLE, style, visible ? 1 : 0); + } + + /// Get the time in milliseconds that the caret is on and off. (Scintilla feature 2075) + public int GetCaretPeriod() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCARETPERIOD, Unused, Unused); + return (int) res; + } + + /// Get the time in milliseconds that the caret is on and off. 0 = steady on. (Scintilla feature 2076) + public void SetCaretPeriod(int periodMilliseconds) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCARETPERIOD, periodMilliseconds, Unused); + } + + /// + /// Set the set of characters making up words for when moving or selecting by word. + /// First sets defaults like SetCharsDefault. + /// (Scintilla feature 2077) + /// + public unsafe void SetWordChars(string characters) + { + fixed (byte* charactersPtr = Encoding.UTF8.GetBytes(characters)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETWORDCHARS, Unused, (IntPtr) charactersPtr); + } + } + + /// + /// Get the set of characters making up words for when moving or selecting by word. + /// Returns the number of characters + /// (Scintilla feature 2646) + /// + public unsafe string GetWordChars() + { + byte[] charactersBuffer = new byte[10000]; + fixed (byte* charactersPtr = charactersBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETWORDCHARS, Unused, (IntPtr) charactersPtr); + return Encoding.UTF8.GetString(charactersBuffer).TrimEnd('\0'); + } + } + + /// + /// Start a sequence of actions that is undone and redone as a unit. + /// May be nested. + /// (Scintilla feature 2078) + /// + public void BeginUndoAction() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_BEGINUNDOACTION, Unused, Unused); + } + + /// End a sequence of actions that is undone and redone as a unit. (Scintilla feature 2079) + public void EndUndoAction() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ENDUNDOACTION, Unused, Unused); + } + + /// Set an indicator to plain, squiggle or TT. (Scintilla feature 2080) + public void IndicSetStyle(int indic, int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICSETSTYLE, indic, style); + } + + /// Retrieve the style of an indicator. (Scintilla feature 2081) + public int IndicGetStyle(int indic) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICGETSTYLE, indic, Unused); + return (int) res; + } + + /// Set the foreground colour of an indicator. (Scintilla feature 2082) + public void IndicSetFore(int indic, Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICSETFORE, indic, fore.Value); + } + + /// Retrieve the foreground colour of an indicator. (Scintilla feature 2083) + public Colour IndicGetFore(int indic) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICGETFORE, indic, Unused); + return new Colour((int) res); + } + + /// Set an indicator to draw under text or over(default). (Scintilla feature 2510) + public void IndicSetUnder(int indic, bool under) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICSETUNDER, indic, under ? 1 : 0); + } + + /// Retrieve whether indicator drawn under or over text. (Scintilla feature 2511) + public bool IndicGetUnder(int indic) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICGETUNDER, indic, Unused); + return 1 == (int) res; + } + + /// Set a hover indicator to plain, squiggle or TT. (Scintilla feature 2680) + public void IndicSetHoverStyle(int indic, int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICSETHOVERSTYLE, indic, style); + } + + /// Retrieve the hover style of an indicator. (Scintilla feature 2681) + public int IndicGetHoverStyle(int indic) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICGETHOVERSTYLE, indic, Unused); + return (int) res; + } + + /// Set the foreground hover colour of an indicator. (Scintilla feature 2682) + public void IndicSetHoverFore(int indic, Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICSETHOVERFORE, indic, fore.Value); + } + + /// Retrieve the foreground hover colour of an indicator. (Scintilla feature 2683) + public Colour IndicGetHoverFore(int indic) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICGETHOVERFORE, indic, Unused); + return new Colour((int) res); + } + + /// Set the attributes of an indicator. (Scintilla feature 2684) + public void IndicSetFlags(int indic, int flags) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICSETFLAGS, indic, flags); + } + + /// Retrieve the attributes of an indicator. (Scintilla feature 2685) + public int IndicGetFlags(int indic) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICGETFLAGS, indic, Unused); + return (int) res; + } + + /// Set the foreground colour of all whitespace and whether to use this setting. (Scintilla feature 2084) + public void SetWhitespaceFore(bool useSetting, Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETWHITESPACEFORE, useSetting ? 1 : 0, fore.Value); + } + + /// Set the background colour of all whitespace and whether to use this setting. (Scintilla feature 2085) + public void SetWhitespaceBack(bool useSetting, Colour back) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETWHITESPACEBACK, useSetting ? 1 : 0, back.Value); + } + + /// Set the size of the dots used to mark space characters. (Scintilla feature 2086) + public void SetWhitespaceSize(int size) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETWHITESPACESIZE, size, Unused); + } + + /// Get the size of the dots used to mark space characters. (Scintilla feature 2087) + public int GetWhitespaceSize() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETWHITESPACESIZE, Unused, Unused); + return (int) res; + } + + /// + /// 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. + /// (Scintilla feature 2090) + /// + public void SetStyleBits(int bits) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSTYLEBITS, bits, Unused); + } + + /// Retrieve number of bits in style bytes used to hold the lexical state. (Scintilla feature 2091) + public int GetStyleBits() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSTYLEBITS, Unused, Unused); + return (int) res; + } + + /// Used to hold extra styling information for each line. (Scintilla feature 2092) + public void SetLineState(int line, int state) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETLINESTATE, line, state); + } + + /// Retrieve the extra styling information for a line. (Scintilla feature 2093) + public int GetLineState(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINESTATE, line, Unused); + return (int) res; + } + + /// Retrieve the last line number that has line state. (Scintilla feature 2094) + public int GetMaxLineState() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMAXLINESTATE, Unused, Unused); + return (int) res; + } + + /// Is the background of the line containing the caret in a different colour? (Scintilla feature 2095) + public bool GetCaretLineVisible() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCARETLINEVISIBLE, Unused, Unused); + return 1 == (int) res; + } + + /// Display the background of the line containing the caret in a different colour. (Scintilla feature 2096) + public void SetCaretLineVisible(bool show) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCARETLINEVISIBLE, show ? 1 : 0, Unused); + } + + /// Get the colour of the background of the line containing the caret. (Scintilla feature 2097) + public Colour GetCaretLineBack() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCARETLINEBACK, Unused, Unused); + return new Colour((int) res); + } + + /// Set the colour of the background of the line containing the caret. (Scintilla feature 2098) + public void SetCaretLineBack(Colour back) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCARETLINEBACK, back.Value, Unused); + } + + /// + /// Set a style to be changeable or not (read only). + /// Experimental feature, currently buggy. + /// (Scintilla feature 2099) + /// + public void StyleSetChangeable(int style, bool changeable) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STYLESETCHANGEABLE, style, changeable ? 1 : 0); + } + + /// + /// Display a auto-completion list. + /// The lenEntered parameter indicates how many characters before + /// the caret should be used to provide context. + /// (Scintilla feature 2100) + /// + public unsafe void AutoCShow(int lenEntered, string itemList) + { + fixed (byte* itemListPtr = Encoding.UTF8.GetBytes(itemList)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSHOW, lenEntered, (IntPtr) itemListPtr); + } + } + + /// Remove the auto-completion list from the screen. (Scintilla feature 2101) + public void AutoCCancel() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCCANCEL, Unused, Unused); + } + + /// Is there an auto-completion list visible? (Scintilla feature 2102) + public bool AutoCActive() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCACTIVE, Unused, Unused); + return 1 == (int) res; + } + + /// Retrieve the position of the caret when the auto-completion list was displayed. (Scintilla feature 2103) + public Position AutoCPosStart() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCPOSSTART, Unused, Unused); + return new Position((int) res); + } + + /// User has selected an item so remove the list and insert the selection. (Scintilla feature 2104) + public void AutoCComplete() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCCOMPLETE, Unused, Unused); + } + + /// Define a set of character that when typed cancel the auto-completion list. (Scintilla feature 2105) + public unsafe void AutoCStops(string characterSet) + { + fixed (byte* characterSetPtr = Encoding.UTF8.GetBytes(characterSet)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSTOPS, Unused, (IntPtr) characterSetPtr); + } + } + + /// + /// Change the separator character in the string setting up an auto-completion list. + /// Default is space but can be changed if items contain space. + /// (Scintilla feature 2106) + /// + public void AutoCSetSeparator(int separatorCharacter) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETSEPARATOR, separatorCharacter, Unused); + } + + /// Retrieve the auto-completion list separator character. (Scintilla feature 2107) + public int AutoCGetSeparator() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETSEPARATOR, Unused, Unused); + return (int) res; + } + + /// Select the item in the auto-completion list that starts with a string. (Scintilla feature 2108) + public unsafe void AutoCSelect(string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSELECT, Unused, (IntPtr) textPtr); + } + } + + /// + /// Should the auto-completion list be cancelled if the user backspaces to a + /// position before where the box was created. + /// (Scintilla feature 2110) + /// + public void AutoCSetCancelAtStart(bool cancel) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETCANCELATSTART, cancel ? 1 : 0, Unused); + } + + /// Retrieve whether auto-completion cancelled by backspacing before start. (Scintilla feature 2111) + public bool AutoCGetCancelAtStart() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETCANCELATSTART, Unused, Unused); + return 1 == (int) res; + } + + /// + /// Define a set of characters that when typed will cause the autocompletion to + /// choose the selected item. + /// (Scintilla feature 2112) + /// + public unsafe void AutoCSetFillUps(string characterSet) + { + fixed (byte* characterSetPtr = Encoding.UTF8.GetBytes(characterSet)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETFILLUPS, Unused, (IntPtr) characterSetPtr); + } + } + + /// Should a single item auto-completion list automatically choose the item. (Scintilla feature 2113) + public void AutoCSetChooseSingle(bool chooseSingle) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETCHOOSESINGLE, chooseSingle ? 1 : 0, Unused); + } + + /// Retrieve whether a single item auto-completion list automatically choose the item. (Scintilla feature 2114) + public bool AutoCGetChooseSingle() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETCHOOSESINGLE, Unused, Unused); + return 1 == (int) res; + } + + /// Set whether case is significant when performing auto-completion searches. (Scintilla feature 2115) + public void AutoCSetIgnoreCase(bool ignoreCase) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETIGNORECASE, ignoreCase ? 1 : 0, Unused); + } + + /// Retrieve state of ignore case flag. (Scintilla feature 2116) + public bool AutoCGetIgnoreCase() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETIGNORECASE, Unused, Unused); + return 1 == (int) res; + } + + /// Display a list of strings and send notification when user chooses one. (Scintilla feature 2117) + public unsafe void UserListShow(int listType, string itemList) + { + fixed (byte* itemListPtr = Encoding.UTF8.GetBytes(itemList)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_USERLISTSHOW, listType, (IntPtr) itemListPtr); + } + } + + /// Set whether or not autocompletion is hidden automatically when nothing matches. (Scintilla feature 2118) + public void AutoCSetAutoHide(bool autoHide) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETAUTOHIDE, autoHide ? 1 : 0, Unused); + } + + /// Retrieve whether or not autocompletion is hidden automatically when nothing matches. (Scintilla feature 2119) + public bool AutoCGetAutoHide() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETAUTOHIDE, Unused, Unused); + return 1 == (int) res; + } + + /// + /// Set whether or not autocompletion deletes any word characters + /// after the inserted text upon completion. + /// (Scintilla feature 2270) + /// + public void AutoCSetDropRestOfWord(bool dropRestOfWord) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETDROPRESTOFWORD, dropRestOfWord ? 1 : 0, Unused); + } + + /// + /// Retrieve whether or not autocompletion deletes any word characters + /// after the inserted text upon completion. + /// (Scintilla feature 2271) + /// + public bool AutoCGetDropRestOfWord() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETDROPRESTOFWORD, Unused, Unused); + return 1 == (int) res; + } + + /// Register an XPM image for use in autocompletion lists. (Scintilla feature 2405) + public unsafe void RegisterImage(int type, string xpmData) + { + fixed (byte* xpmDataPtr = Encoding.UTF8.GetBytes(xpmData)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_REGISTERIMAGE, type, (IntPtr) xpmDataPtr); + } + } + + /// Clear all the registered XPM images. (Scintilla feature 2408) + public void ClearRegisteredImages() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CLEARREGISTEREDIMAGES, Unused, Unused); + } + + /// Retrieve the auto-completion list type-separator character. (Scintilla feature 2285) + public int AutoCGetTypeSeparator() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETTYPESEPARATOR, Unused, Unused); + return (int) res; + } + + /// + /// Change the type-separator character in the string setting up an auto-completion list. + /// Default is '?' but can be changed if items contain '?'. + /// (Scintilla feature 2286) + /// + public void AutoCSetTypeSeparator(int separatorCharacter) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETTYPESEPARATOR, separatorCharacter, Unused); + } + + /// + /// 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. + /// (Scintilla feature 2208) + /// + public void AutoCSetMaxWidth(int characterCount) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETMAXWIDTH, characterCount, Unused); + } + + /// Get the maximum width, in characters, of auto-completion and user lists. (Scintilla feature 2209) + public int AutoCGetMaxWidth() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETMAXWIDTH, Unused, Unused); + return (int) res; + } + + /// + /// Set the maximum height, in rows, of auto-completion and user lists. + /// The default is 5 rows. + /// (Scintilla feature 2210) + /// + public void AutoCSetMaxHeight(int rowCount) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETMAXHEIGHT, rowCount, Unused); + } + + /// Set the maximum height, in rows, of auto-completion and user lists. (Scintilla feature 2211) + public int AutoCGetMaxHeight() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETMAXHEIGHT, Unused, Unused); + return (int) res; + } + + /// Set the number of spaces used for one level of indentation. (Scintilla feature 2122) + public void SetIndent(int indentSize) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETINDENT, indentSize, Unused); + } + + /// Retrieve indentation size. (Scintilla feature 2123) + public int GetIndent() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETINDENT, Unused, Unused); + return (int) res; + } + + /// + /// Indentation will only use space characters if useTabs is false, otherwise + /// it will use a combination of tabs and spaces. + /// (Scintilla feature 2124) + /// + public void SetUseTabs(bool useTabs) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETUSETABS, useTabs ? 1 : 0, Unused); + } + + /// Retrieve whether tabs will be used in indentation. (Scintilla feature 2125) + public bool GetUseTabs() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETUSETABS, Unused, Unused); + return 1 == (int) res; + } + + /// Change the indentation of a line to a number of columns. (Scintilla feature 2126) + public void SetLineIndentation(int line, int indentSize) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETLINEINDENTATION, line, indentSize); + } + + /// Retrieve the number of columns that a line is indented. (Scintilla feature 2127) + public int GetLineIndentation(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINEINDENTATION, line, Unused); + return (int) res; + } + + /// Retrieve the position before the first non indentation character on a line. (Scintilla feature 2128) + public Position GetLineIndentPosition(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINEINDENTPOSITION, line, Unused); + return new Position((int) res); + } + + /// Retrieve the column number of a position, taking tab width into account. (Scintilla feature 2129) + public int GetColumn(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCOLUMN, pos.Value, Unused); + return (int) res; + } + + /// Count characters between two positions. (Scintilla feature 2633) + public int CountCharacters(int startPos, int endPos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_COUNTCHARACTERS, startPos, endPos); + return (int) res; + } + + /// Show or hide the horizontal scroll bar. (Scintilla feature 2130) + public void SetHScrollBar(bool show) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETHSCROLLBAR, show ? 1 : 0, Unused); + } + + /// Is the horizontal scroll bar visible? (Scintilla feature 2131) + public bool GetHScrollBar() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETHSCROLLBAR, Unused, Unused); + return 1 == (int) res; + } + + /// Show or hide indentation guides. (Scintilla feature 2132) + public void SetIndentationGuides(int indentView) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETINDENTATIONGUIDES, indentView, Unused); + } + + /// Are the indentation guides visible? (Scintilla feature 2133) + public int GetIndentationGuides() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETINDENTATIONGUIDES, Unused, Unused); + return (int) res; + } + + /// + /// Set the highlighted indentation guide column. + /// 0 = no highlighted guide. + /// (Scintilla feature 2134) + /// + public void SetHighlightGuide(int column) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETHIGHLIGHTGUIDE, column, Unused); + } + + /// Get the highlighted indentation guide column. (Scintilla feature 2135) + public int GetHighlightGuide() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETHIGHLIGHTGUIDE, Unused, Unused); + return (int) res; + } + + /// Get the position after the last visible characters on a line. (Scintilla feature 2136) + public Position GetLineEndPosition(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINEENDPOSITION, line, Unused); + return new Position((int) res); + } + + /// Get the code page used to interpret the bytes of the document as characters. (Scintilla feature 2137) + public int GetCodePage() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCODEPAGE, Unused, Unused); + return (int) res; + } + + /// Get the foreground colour of the caret. (Scintilla feature 2138) + public Colour GetCaretFore() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCARETFORE, Unused, Unused); + return new Colour((int) res); + } + + /// In read-only mode? (Scintilla feature 2140) + public bool GetReadOnly() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETREADONLY, Unused, Unused); + return 1 == (int) res; + } + + /// Sets the position of the caret. (Scintilla feature 2141) + public void SetCurrentPos(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCURRENTPOS, pos.Value, Unused); + } + + /// Sets the position that starts the selection - this becomes the anchor. (Scintilla feature 2142) + public void SetSelectionStart(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELECTIONSTART, pos.Value, Unused); + } + + /// Returns the position at the start of the selection. (Scintilla feature 2143) + public Position GetSelectionStart() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELECTIONSTART, Unused, Unused); + return new Position((int) res); + } + + /// Sets the position that ends the selection - this becomes the currentPosition. (Scintilla feature 2144) + public void SetSelectionEnd(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELECTIONEND, pos.Value, Unused); + } + + /// Returns the position at the end of the selection. (Scintilla feature 2145) + public Position GetSelectionEnd() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELECTIONEND, Unused, Unused); + return new Position((int) res); + } + + /// Set caret to a position, while removing any existing selection. (Scintilla feature 2556) + public void SetEmptySelection(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETEMPTYSELECTION, pos.Value, Unused); + } + + /// Sets the print magnification added to the point size of each style for printing. (Scintilla feature 2146) + public void SetPrintMagnification(int magnification) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETPRINTMAGNIFICATION, magnification, Unused); + } + + /// Returns the print magnification. (Scintilla feature 2147) + public int GetPrintMagnification() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETPRINTMAGNIFICATION, Unused, Unused); + return (int) res; + } + + /// Modify colours when printing for clearer printed text. (Scintilla feature 2148) + public void SetPrintColourMode(int mode) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETPRINTCOLOURMODE, mode, Unused); + } + + /// Returns the print colour mode. (Scintilla feature 2149) + public int GetPrintColourMode() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETPRINTCOLOURMODE, Unused, Unused); + return (int) res; + } + + /// Find some text in the document. (Scintilla feature 2150) + public Position FindText(int flags, TextToFind ft) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_FINDTEXT, flags, ft.NativePointer); + return new Position((int) res); + } + + /// Retrieve the display line at the top of the display. (Scintilla feature 2152) + public int GetFirstVisibleLine() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETFIRSTVISIBLELINE, Unused, Unused); + return (int) res; + } + + /// + /// Retrieve the contents of a line. + /// Returns the length of the line. + /// (Scintilla feature 2153) + /// + public unsafe string GetLine(int line) + { + byte[] textBuffer = new byte[10000]; + fixed (byte* textPtr = textBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINE, line, (IntPtr) textPtr); + return Encoding.UTF8.GetString(textBuffer).TrimEnd('\0'); + } + } + + /// Returns the number of lines in the document. There is always at least one. (Scintilla feature 2154) + public int GetLineCount() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINECOUNT, Unused, Unused); + return (int) res; + } + + /// Sets the size in pixels of the left margin. (Scintilla feature 2155) + public void SetMarginLeft(int pixelWidth) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMARGINLEFT, Unused, pixelWidth); + } + + /// Returns the size in pixels of the left margin. (Scintilla feature 2156) + public int GetMarginLeft() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMARGINLEFT, Unused, Unused); + return (int) res; + } + + /// Sets the size in pixels of the right margin. (Scintilla feature 2157) + public void SetMarginRight(int pixelWidth) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMARGINRIGHT, Unused, pixelWidth); + } + + /// Returns the size in pixels of the right margin. (Scintilla feature 2158) + public int GetMarginRight() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMARGINRIGHT, Unused, Unused); + return (int) res; + } + + /// Is the document different from when it was last saved? (Scintilla feature 2159) + public bool GetModify() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMODIFY, Unused, Unused); + return 1 == (int) res; + } + + /// Select a range of text. (Scintilla feature 2160) + public void SetSel(Position start, Position end) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSEL, start.Value, end.Value); + } + + /// + /// Retrieve the selected text. + /// Return the length of the text. + /// Result is NUL-terminated. + /// (Scintilla feature 2161) + /// + public unsafe string GetSelText() + { + byte[] textBuffer = new byte[10000]; + fixed (byte* textPtr = textBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELTEXT, Unused, (IntPtr) textPtr); + return Encoding.UTF8.GetString(textBuffer).TrimEnd('\0'); + } + } + + /// + /// Retrieve a range of text. + /// Return the length of the text. + /// (Scintilla feature 2162) + /// + public int GetTextRange(TextRange tr) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETTEXTRANGE, Unused, tr.NativePointer); + return (int) res; + } + + /// Draw the selection in normal style or with selection highlighted. (Scintilla feature 2163) + public void HideSelection(bool normal) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_HIDESELECTION, normal ? 1 : 0, Unused); + } + + /// Retrieve the x value of the point in the window where a position is displayed. (Scintilla feature 2164) + public int PointXFromPosition(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_POINTXFROMPOSITION, Unused, pos.Value); + return (int) res; + } + + /// Retrieve the y value of the point in the window where a position is displayed. (Scintilla feature 2165) + public int PointYFromPosition(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_POINTYFROMPOSITION, Unused, pos.Value); + return (int) res; + } + + /// Retrieve the line containing a position. (Scintilla feature 2166) + public int LineFromPosition(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEFROMPOSITION, pos.Value, Unused); + return (int) res; + } + + /// Retrieve the position at the start of a line. (Scintilla feature 2167) + public Position PositionFromLine(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_POSITIONFROMLINE, line, Unused); + return new Position((int) res); + } + + /// Scroll horizontally and vertically. (Scintilla feature 2168) + public void LineScroll(int columns, int lines) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINESCROLL, columns, lines); + } + + /// Ensure the caret is visible. (Scintilla feature 2169) + public void ScrollCaret() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SCROLLCARET, Unused, Unused); + } + + /// + /// Scroll the argument positions and the range between them into view giving + /// priority to the primary position then the secondary position. + /// This may be used to make a search match visible. + /// (Scintilla feature 2569) + /// + public void ScrollRange(Position secondary, Position primary) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SCROLLRANGE, secondary.Value, primary.Value); + } + + /// Replace the selected text with the argument text. (Scintilla feature 2170) + public unsafe void ReplaceSel(string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_REPLACESEL, Unused, (IntPtr) textPtr); + } + } + + /// Set to read only or read write. (Scintilla feature 2171) + public void SetReadOnly(bool readOnly) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETREADONLY, readOnly ? 1 : 0, Unused); + } + + /// Null operation. (Scintilla feature 2172) + public void Null() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_NULL, Unused, Unused); + } + + /// Will a paste succeed? (Scintilla feature 2173) + public bool CanPaste() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CANPASTE, Unused, Unused); + return 1 == (int) res; + } + + /// Are there any undoable actions in the undo history? (Scintilla feature 2174) + public bool CanUndo() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CANUNDO, Unused, Unused); + return 1 == (int) res; + } + + /// Delete the undo history. (Scintilla feature 2175) + public void EmptyUndoBuffer() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_EMPTYUNDOBUFFER, Unused, Unused); + } + + /// Undo one action in the undo history. (Scintilla feature 2176) + public void Undo() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_UNDO, Unused, Unused); + } + + /// Cut the selection to the clipboard. (Scintilla feature 2177) + public void Cut() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CUT, Unused, Unused); + } + + /// Copy the selection to the clipboard. (Scintilla feature 2178) + public void Copy() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_COPY, Unused, Unused); + } + + /// Paste the contents of the clipboard into the document replacing the selection. (Scintilla feature 2179) + public void Paste() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PASTE, Unused, Unused); + } + + /// Clear the selection. (Scintilla feature 2180) + public void Clear() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CLEAR, Unused, Unused); + } + + /// Replace the contents of the document with the argument text. (Scintilla feature 2181) + public unsafe void SetText(string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETTEXT, Unused, (IntPtr) textPtr); + } + } + + /// + /// Retrieve all the text in the document. + /// Returns number of characters retrieved. + /// Result is NUL-terminated. + /// (Scintilla feature 2182) + /// + public unsafe string GetText(int length) + { + byte[] textBuffer = new byte[length]; + fixed (byte* textPtr = textBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETTEXT, length, (IntPtr) textPtr); + return Encoding.UTF8.GetString(textBuffer).TrimEnd('\0'); + } + } + + /// Retrieve the number of characters in the document. (Scintilla feature 2183) + public int GetTextLength() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETTEXTLENGTH, Unused, Unused); + return (int) res; + } + + /// Retrieve a pointer to a function that processes messages for this Scintilla. (Scintilla feature 2184) + public IntPtr GetDirectFunction() + { + return Win32.SendMessage(scintilla, SciMsg.SCI_GETDIRECTFUNCTION, Unused, Unused); + } + + /// + /// Retrieve a pointer value to use as the first argument when calling + /// the function returned by GetDirectFunction. + /// (Scintilla feature 2185) + /// + public IntPtr GetDirectPointer() + { + return Win32.SendMessage(scintilla, SciMsg.SCI_GETDIRECTPOINTER, Unused, Unused); + } + + /// Set to overtype (true) or insert mode. (Scintilla feature 2186) + public void SetOvertype(bool overtype) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETOVERTYPE, overtype ? 1 : 0, Unused); + } + + /// Returns true if overtype mode is active otherwise false is returned. (Scintilla feature 2187) + public bool GetOvertype() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETOVERTYPE, Unused, Unused); + return 1 == (int) res; + } + + /// Set the width of the insert mode caret. (Scintilla feature 2188) + public void SetCaretWidth(int pixelWidth) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCARETWIDTH, pixelWidth, Unused); + } + + /// Returns the width of the insert mode caret. (Scintilla feature 2189) + public int GetCaretWidth() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCARETWIDTH, Unused, Unused); + return (int) res; + } + + /// + /// Sets the position that starts the target which is used for updating the + /// document without affecting the scroll position. + /// (Scintilla feature 2190) + /// + public void SetTargetStart(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETTARGETSTART, pos.Value, Unused); + } + + /// Get the position that starts the target. (Scintilla feature 2191) + public Position GetTargetStart() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETTARGETSTART, Unused, Unused); + return new Position((int) res); + } + + /// + /// Sets the position that ends the target which is used for updating the + /// document without affecting the scroll position. + /// (Scintilla feature 2192) + /// + public void SetTargetEnd(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETTARGETEND, pos.Value, Unused); + } + + /// Get the position that ends the target. (Scintilla feature 2193) + public Position GetTargetEnd() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETTARGETEND, Unused, Unused); + return new Position((int) res); + } + + /// Sets both the start and end of the target in one call. (Scintilla feature 2686) + public void SetTargetRange(Position start, Position end) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETTARGETRANGE, start.Value, end.Value); + } + + /// Retrieve the text in the target. (Scintilla feature 2687) + public unsafe string GetTargetText() + { + byte[] charactersBuffer = new byte[10000]; + fixed (byte* charactersPtr = charactersBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETTARGETTEXT, Unused, (IntPtr) charactersPtr); + return Encoding.UTF8.GetString(charactersBuffer).TrimEnd('\0'); + } + } + + /// + /// Replace the target text with the argument text. + /// Text is counted so it can contain NULs. + /// Returns the length of the replacement text. + /// (Scintilla feature 2194) + /// + public unsafe int ReplaceTarget(int length, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_REPLACETARGET, length, (IntPtr) textPtr); + return (int) res; + } + } + + /// + /// 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. + /// (Scintilla feature 2195) + /// + public unsafe int ReplaceTargetRE(int length, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_REPLACETARGETRE, length, (IntPtr) textPtr); + return (int) res; + } + } + + /// + /// 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. + /// (Scintilla feature 2197) + /// + public unsafe int SearchInTarget(int length, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SEARCHINTARGET, length, (IntPtr) textPtr); + return (int) res; + } + } + + /// Set the search flags used by SearchInTarget. (Scintilla feature 2198) + public void SetSearchFlags(int flags) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSEARCHFLAGS, flags, Unused); + } + + /// Get the search flags used by SearchInTarget. (Scintilla feature 2199) + public int GetSearchFlags() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSEARCHFLAGS, Unused, Unused); + return (int) res; + } + + /// Show a call tip containing a definition near position pos. (Scintilla feature 2200) + public unsafe void CallTipShow(Position pos, string definition) + { + fixed (byte* definitionPtr = Encoding.UTF8.GetBytes(definition)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CALLTIPSHOW, pos.Value, (IntPtr) definitionPtr); + } + } + + /// Remove the call tip from the screen. (Scintilla feature 2201) + public void CallTipCancel() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CALLTIPCANCEL, Unused, Unused); + } + + /// Is there an active call tip? (Scintilla feature 2202) + public bool CallTipActive() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CALLTIPACTIVE, Unused, Unused); + return 1 == (int) res; + } + + /// Retrieve the position where the caret was before displaying the call tip. (Scintilla feature 2203) + public Position CallTipPosStart() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CALLTIPPOSSTART, Unused, Unused); + return new Position((int) res); + } + + /// Set the start position in order to change when backspacing removes the calltip. (Scintilla feature 2214) + public void CallTipSetPosStart(int posStart) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CALLTIPSETPOSSTART, posStart, Unused); + } + + /// Highlight a segment of the definition. (Scintilla feature 2204) + public void CallTipSetHlt(int start, int end) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CALLTIPSETHLT, start, end); + } + + /// Set the background colour for the call tip. (Scintilla feature 2205) + public void CallTipSetBack(Colour back) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CALLTIPSETBACK, back.Value, Unused); + } + + /// Set the foreground colour for the call tip. (Scintilla feature 2206) + public void CallTipSetFore(Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CALLTIPSETFORE, fore.Value, Unused); + } + + /// Set the foreground colour for the highlighted part of the call tip. (Scintilla feature 2207) + public void CallTipSetForeHlt(Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CALLTIPSETFOREHLT, fore.Value, Unused); + } + + /// Enable use of STYLE_CALLTIP and set call tip tab size in pixels. (Scintilla feature 2212) + public void CallTipUseStyle(int tabSize) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CALLTIPUSESTYLE, tabSize, Unused); + } + + /// Set position of calltip, above or below text. (Scintilla feature 2213) + public void CallTipSetPosition(bool above) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CALLTIPSETPOSITION, above ? 1 : 0, Unused); + } + + /// Find the display line of a document line taking hidden lines into account. (Scintilla feature 2220) + public int VisibleFromDocLine(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_VISIBLEFROMDOCLINE, line, Unused); + return (int) res; + } + + /// Find the document line of a display line taking hidden lines into account. (Scintilla feature 2221) + public int DocLineFromVisible(int lineDisplay) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DOCLINEFROMVISIBLE, lineDisplay, Unused); + return (int) res; + } + + /// The number of display lines needed to wrap a document line (Scintilla feature 2235) + public int WrapCount(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WRAPCOUNT, line, Unused); + return (int) res; + } + + /// + /// 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. + /// (Scintilla feature 2222) + /// + public void SetFoldLevel(int line, int level) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETFOLDLEVEL, line, level); + } + + /// Retrieve the fold level of a line. (Scintilla feature 2223) + public int GetFoldLevel(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETFOLDLEVEL, line, Unused); + return (int) res; + } + + /// Find the last child line of a header line. (Scintilla feature 2224) + public int GetLastChild(int line, int level) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLASTCHILD, line, level); + return (int) res; + } + + /// Find the parent line of a child line. (Scintilla feature 2225) + public int GetFoldParent(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETFOLDPARENT, line, Unused); + return (int) res; + } + + /// Make a range of lines visible. (Scintilla feature 2226) + public void ShowLines(int lineStart, int lineEnd) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SHOWLINES, lineStart, lineEnd); + } + + /// Make a range of lines invisible. (Scintilla feature 2227) + public void HideLines(int lineStart, int lineEnd) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_HIDELINES, lineStart, lineEnd); + } + + /// Is a line visible? (Scintilla feature 2228) + public bool GetLineVisible(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINEVISIBLE, line, Unused); + return 1 == (int) res; + } + + /// Are all lines visible? (Scintilla feature 2236) + public bool GetAllLinesVisible() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETALLLINESVISIBLE, Unused, Unused); + return 1 == (int) res; + } + + /// Show the children of a header line. (Scintilla feature 2229) + public void SetFoldExpanded(int line, bool expanded) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETFOLDEXPANDED, line, expanded ? 1 : 0); + } + + /// Is a header line expanded? (Scintilla feature 2230) + public bool GetFoldExpanded(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETFOLDEXPANDED, line, Unused); + return 1 == (int) res; + } + + /// Switch a header line between expanded and contracted. (Scintilla feature 2231) + public void ToggleFold(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_TOGGLEFOLD, line, Unused); + } + + /// Expand or contract a fold header. (Scintilla feature 2237) + public void FoldLine(int line, int action) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_FOLDLINE, line, action); + } + + /// Expand or contract a fold header and its children. (Scintilla feature 2238) + public void FoldChildren(int line, int action) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_FOLDCHILDREN, line, action); + } + + /// Expand a fold header and all children. Use the level argument instead of the line's current level. (Scintilla feature 2239) + public void ExpandChildren(int line, int level) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_EXPANDCHILDREN, line, level); + } + + /// Expand or contract all fold headers. (Scintilla feature 2662) + public void FoldAll(int action) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_FOLDALL, action, Unused); + } + + /// Ensure a particular line is visible by expanding any header line hiding it. (Scintilla feature 2232) + public void EnsureVisible(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ENSUREVISIBLE, line, Unused); + } + + /// Set automatic folding behaviours. (Scintilla feature 2663) + public void SetAutomaticFold(int automaticFold) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETAUTOMATICFOLD, automaticFold, Unused); + } + + /// Get automatic folding behaviours. (Scintilla feature 2664) + public int GetAutomaticFold() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETAUTOMATICFOLD, Unused, Unused); + return (int) res; + } + + /// Set some style options for folding. (Scintilla feature 2233) + public void SetFoldFlags(int flags) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETFOLDFLAGS, flags, Unused); + } + + /// + /// 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. + /// (Scintilla feature 2234) + /// + public void EnsureVisibleEnforcePolicy(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ENSUREVISIBLEENFORCEPOLICY, line, Unused); + } + + /// Sets whether a tab pressed when caret is within indentation indents. (Scintilla feature 2260) + public void SetTabIndents(bool tabIndents) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETTABINDENTS, tabIndents ? 1 : 0, Unused); + } + + /// Does a tab pressed when caret is within indentation indent? (Scintilla feature 2261) + public bool GetTabIndents() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETTABINDENTS, Unused, Unused); + return 1 == (int) res; + } + + /// Sets whether a backspace pressed when caret is within indentation unindents. (Scintilla feature 2262) + public void SetBackSpaceUnIndents(bool bsUnIndents) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETBACKSPACEUNINDENTS, bsUnIndents ? 1 : 0, Unused); + } + + /// Does a backspace pressed when caret is within indentation unindent? (Scintilla feature 2263) + public bool GetBackSpaceUnIndents() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETBACKSPACEUNINDENTS, Unused, Unused); + return 1 == (int) res; + } + + /// Sets the time the mouse must sit still to generate a mouse dwell event. (Scintilla feature 2264) + public void SetMouseDwellTime(int periodMilliseconds) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMOUSEDWELLTIME, periodMilliseconds, Unused); + } + + /// Retrieve the time the mouse must sit still to generate a mouse dwell event. (Scintilla feature 2265) + public int GetMouseDwellTime() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMOUSEDWELLTIME, Unused, Unused); + return (int) res; + } + + /// Get position of start of word. (Scintilla feature 2266) + public int WordStartPosition(Position pos, bool onlyWordCharacters) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDSTARTPOSITION, pos.Value, onlyWordCharacters ? 1 : 0); + return (int) res; + } + + /// Get position of end of word. (Scintilla feature 2267) + public int WordEndPosition(Position pos, bool onlyWordCharacters) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDENDPOSITION, pos.Value, onlyWordCharacters ? 1 : 0); + return (int) res; + } + + /// Sets whether text is word wrapped. (Scintilla feature 2268) + public void SetWrapMode(int mode) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETWRAPMODE, mode, Unused); + } + + /// Retrieve whether text is word wrapped. (Scintilla feature 2269) + public int GetWrapMode() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETWRAPMODE, Unused, Unused); + return (int) res; + } + + /// Set the display mode of visual flags for wrapped lines. (Scintilla feature 2460) + public void SetWrapVisualFlags(int wrapVisualFlags) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETWRAPVISUALFLAGS, wrapVisualFlags, Unused); + } + + /// Retrive the display mode of visual flags for wrapped lines. (Scintilla feature 2461) + public int GetWrapVisualFlags() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETWRAPVISUALFLAGS, Unused, Unused); + return (int) res; + } + + /// Set the location of visual flags for wrapped lines. (Scintilla feature 2462) + public void SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETWRAPVISUALFLAGSLOCATION, wrapVisualFlagsLocation, Unused); + } + + /// Retrive the location of visual flags for wrapped lines. (Scintilla feature 2463) + public int GetWrapVisualFlagsLocation() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETWRAPVISUALFLAGSLOCATION, Unused, Unused); + return (int) res; + } + + /// Set the start indent for wrapped lines. (Scintilla feature 2464) + public void SetWrapStartIndent(int indent) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETWRAPSTARTINDENT, indent, Unused); + } + + /// Retrive the start indent for wrapped lines. (Scintilla feature 2465) + public int GetWrapStartIndent() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETWRAPSTARTINDENT, Unused, Unused); + return (int) res; + } + + /// Sets how wrapped sublines are placed. Default is fixed. (Scintilla feature 2472) + public void SetWrapIndentMode(int mode) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETWRAPINDENTMODE, mode, Unused); + } + + /// Retrieve how wrapped sublines are placed. Default is fixed. (Scintilla feature 2473) + public int GetWrapIndentMode() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETWRAPINDENTMODE, Unused, Unused); + return (int) res; + } + + /// Sets the degree of caching of layout information. (Scintilla feature 2272) + public void SetLayoutCache(int mode) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETLAYOUTCACHE, mode, Unused); + } + + /// Retrieve the degree of caching of layout information. (Scintilla feature 2273) + public int GetLayoutCache() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLAYOUTCACHE, Unused, Unused); + return (int) res; + } + + /// Sets the document width assumed for scrolling. (Scintilla feature 2274) + public void SetScrollWidth(int pixelWidth) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSCROLLWIDTH, pixelWidth, Unused); + } + + /// Retrieve the document width assumed for scrolling. (Scintilla feature 2275) + public int GetScrollWidth() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSCROLLWIDTH, Unused, Unused); + return (int) res; + } + + /// Sets whether the maximum width line displayed is used to set scroll width. (Scintilla feature 2516) + public void SetScrollWidthTracking(bool tracking) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSCROLLWIDTHTRACKING, tracking ? 1 : 0, Unused); + } + + /// Retrieve whether the scroll width tracks wide lines. (Scintilla feature 2517) + public bool GetScrollWidthTracking() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSCROLLWIDTHTRACKING, Unused, Unused); + return 1 == (int) res; + } + + /// + /// Measure the pixel width of some text in a particular style. + /// NUL terminated text argument. + /// Does not handle tab or control characters. + /// (Scintilla feature 2276) + /// + public unsafe int TextWidth(int style, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_TEXTWIDTH, style, (IntPtr) textPtr); + return (int) res; + } + } + + /// + /// 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. + /// (Scintilla feature 2277) + /// + public void SetEndAtLastLine(bool endAtLastLine) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETENDATLASTLINE, endAtLastLine ? 1 : 0, Unused); + } + + /// + /// Retrieve whether the maximum scroll position has the last + /// line at the bottom of the view. + /// (Scintilla feature 2278) + /// + public bool GetEndAtLastLine() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETENDATLASTLINE, Unused, Unused); + return 1 == (int) res; + } + + /// Retrieve the height of a particular line of text in pixels. (Scintilla feature 2279) + public int TextHeight(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_TEXTHEIGHT, line, Unused); + return (int) res; + } + + /// Show or hide the vertical scroll bar. (Scintilla feature 2280) + public void SetVScrollBar(bool show) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETVSCROLLBAR, show ? 1 : 0, Unused); + } + + /// Is the vertical scroll bar visible? (Scintilla feature 2281) + public bool GetVScrollBar() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETVSCROLLBAR, Unused, Unused); + return 1 == (int) res; + } + + /// Append a string to the end of the document without changing the selection. (Scintilla feature 2282) + public unsafe void AppendText(int length, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_APPENDTEXT, length, (IntPtr) textPtr); + } + } + + /// Is drawing done in two phases with backgrounds drawn before foregrounds? (Scintilla feature 2283) + public bool GetTwoPhaseDraw() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETTWOPHASEDRAW, Unused, Unused); + return 1 == (int) res; + } + + /// + /// 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. + /// (Scintilla feature 2284) + /// + public void SetTwoPhaseDraw(bool twoPhase) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETTWOPHASEDRAW, twoPhase ? 1 : 0, Unused); + } + + /// How many phases is drawing done in? (Scintilla feature 2673) + public int GetPhasesDraw() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETPHASESDRAW, Unused, Unused); + return (int) res; + } + + /// + /// In one phase draw, text is drawn in a series of rectangular blocks with no overlap. + /// In two phase draw, text is drawn in a series of lines allowing runs to overlap horizontally. + /// In multiple phase draw, each element is drawn over the whole drawing area, allowing text + /// to overlap from one line to the next. + /// (Scintilla feature 2674) + /// + public void SetPhasesDraw(int phases) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETPHASESDRAW, phases, Unused); + } + + /// Choose the quality level for text from the FontQuality enumeration. (Scintilla feature 2611) + public void SetFontQuality(int fontQuality) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETFONTQUALITY, fontQuality, Unused); + } + + /// Retrieve the quality level for text. (Scintilla feature 2612) + public int GetFontQuality() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETFONTQUALITY, Unused, Unused); + return (int) res; + } + + /// Scroll so that a display line is at the top of the display. (Scintilla feature 2613) + public void SetFirstVisibleLine(int lineDisplay) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETFIRSTVISIBLELINE, lineDisplay, Unused); + } + + /// Change the effect of pasting when there are multiple selections. (Scintilla feature 2614) + public void SetMultiPaste(int multiPaste) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMULTIPASTE, multiPaste, Unused); + } + + /// Retrieve the effect of pasting when there are multiple selections.. (Scintilla feature 2615) + public int GetMultiPaste() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMULTIPASTE, Unused, Unused); + return (int) res; + } + + /// + /// Retrieve the value of a tag from a regular expression search. + /// Result is NUL-terminated. + /// (Scintilla feature 2616) + /// + public unsafe string GetTag(int tagNumber) + { + byte[] tagValueBuffer = new byte[10000]; + fixed (byte* tagValuePtr = tagValueBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETTAG, tagNumber, (IntPtr) tagValuePtr); + return Encoding.UTF8.GetString(tagValueBuffer).TrimEnd('\0'); + } + } + + /// Make the target range start and end be the same as the selection range start and end. (Scintilla feature 2287) + public void TargetFromSelection() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_TARGETFROMSELECTION, Unused, Unused); + } + + /// Join the lines in the target. (Scintilla feature 2288) + public void LinesJoin() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINESJOIN, Unused, Unused); + } + + /// + /// Split the lines in the target into lines that are less wide than pixelWidth + /// where possible. + /// (Scintilla feature 2289) + /// + public void LinesSplit(int pixelWidth) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINESSPLIT, pixelWidth, Unused); + } + + /// Set the colours used as a chequerboard pattern in the fold margin (Scintilla feature 2290) + public void SetFoldMarginColour(bool useSetting, Colour back) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETFOLDMARGINCOLOUR, useSetting ? 1 : 0, back.Value); + } + + /// Set the colours used as a chequerboard pattern in the fold margin (Scintilla feature 2291) + public void SetFoldMarginHiColour(bool useSetting, Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETFOLDMARGINHICOLOUR, useSetting ? 1 : 0, fore.Value); + } + + /// Move caret down one line. (Scintilla feature 2300) + public void LineDown() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEDOWN, Unused, Unused); + } + + /// Move caret down one line extending selection to new caret position. (Scintilla feature 2301) + public void LineDownExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEDOWNEXTEND, Unused, Unused); + } + + /// Move caret up one line. (Scintilla feature 2302) + public void LineUp() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEUP, Unused, Unused); + } + + /// Move caret up one line extending selection to new caret position. (Scintilla feature 2303) + public void LineUpExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEUPEXTEND, Unused, Unused); + } + + /// Move caret left one character. (Scintilla feature 2304) + public void CharLeft() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CHARLEFT, Unused, Unused); + } + + /// Move caret left one character extending selection to new caret position. (Scintilla feature 2305) + public void CharLeftExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CHARLEFTEXTEND, Unused, Unused); + } + + /// Move caret right one character. (Scintilla feature 2306) + public void CharRight() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CHARRIGHT, Unused, Unused); + } + + /// Move caret right one character extending selection to new caret position. (Scintilla feature 2307) + public void CharRightExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CHARRIGHTEXTEND, Unused, Unused); + } + + /// Move caret left one word. (Scintilla feature 2308) + public void WordLeft() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDLEFT, Unused, Unused); + } + + /// Move caret left one word extending selection to new caret position. (Scintilla feature 2309) + public void WordLeftExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDLEFTEXTEND, Unused, Unused); + } + + /// Move caret right one word. (Scintilla feature 2310) + public void WordRight() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDRIGHT, Unused, Unused); + } + + /// Move caret right one word extending selection to new caret position. (Scintilla feature 2311) + public void WordRightExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDRIGHTEXTEND, Unused, Unused); + } + + /// Move caret to first position on line. (Scintilla feature 2312) + public void Home() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_HOME, Unused, Unused); + } + + /// Move caret to first position on line extending selection to new caret position. (Scintilla feature 2313) + public void HomeExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_HOMEEXTEND, Unused, Unused); + } + + /// Move caret to last position on line. (Scintilla feature 2314) + public void LineEnd() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEEND, Unused, Unused); + } + + /// Move caret to last position on line extending selection to new caret position. (Scintilla feature 2315) + public void LineEndExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEENDEXTEND, Unused, Unused); + } + + /// Move caret to first position in document. (Scintilla feature 2316) + public void DocumentStart() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DOCUMENTSTART, Unused, Unused); + } + + /// Move caret to first position in document extending selection to new caret position. (Scintilla feature 2317) + public void DocumentStartExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DOCUMENTSTARTEXTEND, Unused, Unused); + } + + /// Move caret to last position in document. (Scintilla feature 2318) + public void DocumentEnd() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DOCUMENTEND, Unused, Unused); + } + + /// Move caret to last position in document extending selection to new caret position. (Scintilla feature 2319) + public void DocumentEndExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DOCUMENTENDEXTEND, Unused, Unused); + } + + /// Move caret one page up. (Scintilla feature 2320) + public void PageUp() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PAGEUP, Unused, Unused); + } + + /// Move caret one page up extending selection to new caret position. (Scintilla feature 2321) + public void PageUpExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PAGEUPEXTEND, Unused, Unused); + } + + /// Move caret one page down. (Scintilla feature 2322) + public void PageDown() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PAGEDOWN, Unused, Unused); + } + + /// Move caret one page down extending selection to new caret position. (Scintilla feature 2323) + public void PageDownExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PAGEDOWNEXTEND, Unused, Unused); + } + + /// Switch from insert to overtype mode or the reverse. (Scintilla feature 2324) + public void EditToggleOvertype() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_EDITTOGGLEOVERTYPE, Unused, Unused); + } + + /// Cancel any modes such as call tip or auto-completion list display. (Scintilla feature 2325) + public void Cancel() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CANCEL, Unused, Unused); + } + + /// Delete the selection or if no selection, the character before the caret. (Scintilla feature 2326) + public void DeleteBack() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DELETEBACK, Unused, Unused); + } + + /// + /// 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. + /// (Scintilla feature 2327) + /// + public void Tab() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_TAB, Unused, Unused); + } + + /// Dedent the selected lines. (Scintilla feature 2328) + public void BackTab() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_BACKTAB, Unused, Unused); + } + + /// Insert a new line, may use a CRLF, CR or LF depending on EOL mode. (Scintilla feature 2329) + public void NewLine() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_NEWLINE, Unused, Unused); + } + + /// Insert a Form Feed character. (Scintilla feature 2330) + public void FormFeed() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_FORMFEED, Unused, Unused); + } + + /// + /// Move caret to before first visible character on line. + /// If already there move to first character on line. + /// (Scintilla feature 2331) + /// + public void VCHome() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_VCHOME, Unused, Unused); + } + + /// Like VCHome but extending selection to new caret position. (Scintilla feature 2332) + public void VCHomeExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_VCHOMEEXTEND, Unused, Unused); + } + + /// Magnify the displayed text by increasing the sizes by 1 point. (Scintilla feature 2333) + public void ZoomIn() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ZOOMIN, Unused, Unused); + } + + /// Make the displayed text smaller by decreasing the sizes by 1 point. (Scintilla feature 2334) + public void ZoomOut() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ZOOMOUT, Unused, Unused); + } + + /// Delete the word to the left of the caret. (Scintilla feature 2335) + public void DelWordLeft() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DELWORDLEFT, Unused, Unused); + } + + /// Delete the word to the right of the caret. (Scintilla feature 2336) + public void DelWordRight() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DELWORDRIGHT, Unused, Unused); + } + + /// Delete the word to the right of the caret, but not the trailing non-word characters. (Scintilla feature 2518) + public void DelWordRightEnd() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DELWORDRIGHTEND, Unused, Unused); + } + + /// Cut the line containing the caret. (Scintilla feature 2337) + public void LineCut() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINECUT, Unused, Unused); + } + + /// Delete the line containing the caret. (Scintilla feature 2338) + public void LineDelete() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEDELETE, Unused, Unused); + } + + /// Switch the current line with the previous. (Scintilla feature 2339) + public void LineTranspose() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINETRANSPOSE, Unused, Unused); + } + + /// Duplicate the current line. (Scintilla feature 2404) + public void LineDuplicate() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEDUPLICATE, Unused, Unused); + } + + /// Transform the selection to lower case. (Scintilla feature 2340) + public void LowerCase() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LOWERCASE, Unused, Unused); + } + + /// Transform the selection to upper case. (Scintilla feature 2341) + public void UpperCase() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_UPPERCASE, Unused, Unused); + } + + /// Scroll the document down, keeping the caret visible. (Scintilla feature 2342) + public void LineScrollDown() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINESCROLLDOWN, Unused, Unused); + } + + /// Scroll the document up, keeping the caret visible. (Scintilla feature 2343) + public void LineScrollUp() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINESCROLLUP, Unused, Unused); + } + + /// + /// Delete the selection or if no selection, the character before the caret. + /// Will not delete the character before at the start of a line. + /// (Scintilla feature 2344) + /// + public void DeleteBackNotLine() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DELETEBACKNOTLINE, Unused, Unused); + } + + /// Move caret to first position on display line. (Scintilla feature 2345) + public void HomeDisplay() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_HOMEDISPLAY, Unused, Unused); + } + + /// + /// Move caret to first position on display line extending selection to + /// new caret position. + /// (Scintilla feature 2346) + /// + public void HomeDisplayExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_HOMEDISPLAYEXTEND, Unused, Unused); + } + + /// Move caret to last position on display line. (Scintilla feature 2347) + public void LineEndDisplay() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEENDDISPLAY, Unused, Unused); + } + + /// + /// Move caret to last position on display line extending selection to new + /// caret position. + /// (Scintilla feature 2348) + /// + public void LineEndDisplayExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEENDDISPLAYEXTEND, Unused, Unused); + } + + /// + /// 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)?. + /// (Scintilla feature 2349) + /// + public void HomeWrap() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_HOMEWRAP, Unused, Unused); + } + + /// + /// 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)?. + /// (Scintilla feature 2450) + /// + public void HomeWrapExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_HOMEWRAPEXTEND, Unused, Unused); + } + + /// + /// 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)?. + /// (Scintilla feature 2451) + /// + public void LineEndWrap() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEENDWRAP, Unused, Unused); + } + + /// + /// 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)?. + /// (Scintilla feature 2452) + /// + public void LineEndWrapExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEENDWRAPEXTEND, Unused, Unused); + } + + /// + /// 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)?. + /// (Scintilla feature 2453) + /// + public void VCHomeWrap() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_VCHOMEWRAP, Unused, Unused); + } + + /// + /// 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)?. + /// (Scintilla feature 2454) + /// + public void VCHomeWrapExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_VCHOMEWRAPEXTEND, Unused, Unused); + } + + /// Copy the line containing the caret. (Scintilla feature 2455) + public void LineCopy() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINECOPY, Unused, Unused); + } + + /// Move the caret inside current view if it's not there already. (Scintilla feature 2401) + public void MoveCaretInsideView() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MOVECARETINSIDEVIEW, Unused, Unused); + } + + /// How many characters are on a line, including end of line characters? (Scintilla feature 2350) + public int LineLength(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINELENGTH, line, Unused); + return (int) res; + } + + /// Highlight the characters at two positions. (Scintilla feature 2351) + public void BraceHighlight(Position pos1, Position pos2) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_BRACEHIGHLIGHT, pos1.Value, pos2.Value); + } + + /// Use specified indicator to highlight matching braces instead of changing their style. (Scintilla feature 2498) + public void BraceHighlightIndicator(bool useBraceHighlightIndicator, int indicator) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_BRACEHIGHLIGHTINDICATOR, useBraceHighlightIndicator ? 1 : 0, indicator); + } + + /// Highlight the character at a position indicating there is no matching brace. (Scintilla feature 2352) + public void BraceBadLight(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_BRACEBADLIGHT, pos.Value, Unused); + } + + /// Use specified indicator to highlight non matching brace instead of changing its style. (Scintilla feature 2499) + public void BraceBadLightIndicator(bool useBraceBadLightIndicator, int indicator) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_BRACEBADLIGHTINDICATOR, useBraceBadLightIndicator ? 1 : 0, indicator); + } + + /// Find the position of a matching brace or INVALID_POSITION if no match. (Scintilla feature 2353) + public Position BraceMatch(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_BRACEMATCH, pos.Value, Unused); + return new Position((int) res); + } + + /// Are the end of line characters visible? (Scintilla feature 2355) + public bool GetViewEOL() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETVIEWEOL, Unused, Unused); + return 1 == (int) res; + } + + /// Make the end of line characters visible or invisible. (Scintilla feature 2356) + public void SetViewEOL(bool visible) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETVIEWEOL, visible ? 1 : 0, Unused); + } + + /// Retrieve a pointer to the document object. (Scintilla feature 2357) + public IntPtr GetDocPointer() + { + return Win32.SendMessage(scintilla, SciMsg.SCI_GETDOCPOINTER, Unused, Unused); + } + + /// Change the document object used. (Scintilla feature 2358) + public void SetDocPointer(IntPtr pointer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETDOCPOINTER, Unused, pointer); + } + + /// Set which document modification events are sent to the container. (Scintilla feature 2359) + public void SetModEventMask(int mask) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMODEVENTMASK, mask, Unused); + } + + /// Retrieve the column number which text should be kept within. (Scintilla feature 2360) + public int GetEdgeColumn() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETEDGECOLUMN, Unused, Unused); + return (int) res; + } + + /// + /// Set the column number of the edge. + /// If text goes past the edge then it is highlighted. + /// (Scintilla feature 2361) + /// + public void SetEdgeColumn(int column) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETEDGECOLUMN, column, Unused); + } + + /// Retrieve the edge highlight mode. (Scintilla feature 2362) + public int GetEdgeMode() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETEDGEMODE, Unused, Unused); + return (int) res; + } + + /// + /// 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). + /// (Scintilla feature 2363) + /// + public void SetEdgeMode(int mode) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETEDGEMODE, mode, Unused); + } + + /// Retrieve the colour used in edge indication. (Scintilla feature 2364) + public Colour GetEdgeColour() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETEDGECOLOUR, Unused, Unused); + return new Colour((int) res); + } + + /// Change the colour used in edge indication. (Scintilla feature 2365) + public void SetEdgeColour(Colour edgeColour) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETEDGECOLOUR, edgeColour.Value, Unused); + } + + /// Sets the current caret position to be the search anchor. (Scintilla feature 2366) + public void SearchAnchor() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SEARCHANCHOR, Unused, Unused); + } + + /// + /// Find some text starting at the search anchor. + /// Does not ensure the selection is visible. + /// (Scintilla feature 2367) + /// + public unsafe int SearchNext(int flags, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SEARCHNEXT, flags, (IntPtr) textPtr); + return (int) res; + } + } + + /// + /// Find some text starting at the search anchor and moving backwards. + /// Does not ensure the selection is visible. + /// (Scintilla feature 2368) + /// + public unsafe int SearchPrev(int flags, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SEARCHPREV, flags, (IntPtr) textPtr); + return (int) res; + } + } + + /// Retrieves the number of lines completely visible. (Scintilla feature 2370) + public int LinesOnScreen() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINESONSCREEN, Unused, Unused); + return (int) res; + } + + /// + /// Set whether a pop up menu is displayed automatically when the user presses + /// the wrong mouse button. + /// (Scintilla feature 2371) + /// + public void UsePopUp(bool allowPopUp) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_USEPOPUP, allowPopUp ? 1 : 0, Unused); + } + + /// Is the selection rectangular? The alternative is the more common stream selection. (Scintilla feature 2372) + public bool SelectionIsRectangle() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SELECTIONISRECTANGLE, Unused, Unused); + return 1 == (int) res; + } + + /// + /// 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. + /// (Scintilla feature 2373) + /// + public void SetZoom(int zoom) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETZOOM, zoom, Unused); + } + + /// Retrieve the zoom level. (Scintilla feature 2374) + public int GetZoom() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETZOOM, Unused, Unused); + return (int) res; + } + + /// + /// Create a new document object. + /// Starts with reference count of 1 and not selected into editor. + /// (Scintilla feature 2375) + /// + public int CreateDocument() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CREATEDOCUMENT, Unused, Unused); + return (int) res; + } + + /// Extend life of document. (Scintilla feature 2376) + public void AddRefDocument(int doc) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ADDREFDOCUMENT, Unused, doc); + } + + /// Release a reference to the document, deleting document if it fades to black. (Scintilla feature 2377) + public void ReleaseDocument(int doc) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_RELEASEDOCUMENT, Unused, doc); + } + + /// Get which document modification events are sent to the container. (Scintilla feature 2378) + public int GetModEventMask() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMODEVENTMASK, Unused, Unused); + return (int) res; + } + + /// Change internal focus flag. (Scintilla feature 2380) + public void SetFocus(bool focus) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETFOCUS, focus ? 1 : 0, Unused); + } + + /// Get internal focus flag. (Scintilla feature 2381) + public bool GetFocus() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETFOCUS, Unused, Unused); + return 1 == (int) res; + } + + /// Change error status - 0 = OK. (Scintilla feature 2382) + public void SetStatus(int statusCode) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSTATUS, statusCode, Unused); + } + + /// Get error status. (Scintilla feature 2383) + public int GetStatus() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSTATUS, Unused, Unused); + return (int) res; + } + + /// Set whether the mouse is captured when its button is pressed. (Scintilla feature 2384) + public void SetMouseDownCaptures(bool captures) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMOUSEDOWNCAPTURES, captures ? 1 : 0, Unused); + } + + /// Get whether mouse gets captured. (Scintilla feature 2385) + public bool GetMouseDownCaptures() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMOUSEDOWNCAPTURES, Unused, Unused); + return 1 == (int) res; + } + + /// Sets the cursor to one of the SC_CURSOR* values. (Scintilla feature 2386) + public void SetCursor(int cursorType) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCURSOR, cursorType, Unused); + } + + /// Get cursor type. (Scintilla feature 2387) + public int GetCursor() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCURSOR, Unused, Unused); + return (int) res; + } + + /// + /// Change the way control characters are displayed: + /// If symbol is < 32, keep the drawn way, else, use the given character. + /// (Scintilla feature 2388) + /// + public void SetControlCharSymbol(int symbol) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCONTROLCHARSYMBOL, symbol, Unused); + } + + /// Get the way control characters are displayed. (Scintilla feature 2389) + public int GetControlCharSymbol() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCONTROLCHARSYMBOL, Unused, Unused); + return (int) res; + } + + /// Move to the previous change in capitalisation. (Scintilla feature 2390) + public void WordPartLeft() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDPARTLEFT, Unused, Unused); + } + + /// + /// Move to the previous change in capitalisation extending selection + /// to new caret position. + /// (Scintilla feature 2391) + /// + public void WordPartLeftExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDPARTLEFTEXTEND, Unused, Unused); + } + + /// Move to the change next in capitalisation. (Scintilla feature 2392) + public void WordPartRight() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDPARTRIGHT, Unused, Unused); + } + + /// + /// Move to the next change in capitalisation extending selection + /// to new caret position. + /// (Scintilla feature 2393) + /// + public void WordPartRightExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDPARTRIGHTEXTEND, Unused, Unused); + } + + /// + /// Set the way the display area is determined when a particular line + /// is to be moved to by Find, FindNext, GotoLine, etc. + /// (Scintilla feature 2394) + /// + public void SetVisiblePolicy(int visiblePolicy, int visibleSlop) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETVISIBLEPOLICY, visiblePolicy, visibleSlop); + } + + /// Delete back from the current position to the start of the line. (Scintilla feature 2395) + public void DelLineLeft() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DELLINELEFT, Unused, Unused); + } + + /// Delete forwards from the current position to the end of the line. (Scintilla feature 2396) + public void DelLineRight() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DELLINERIGHT, Unused, Unused); + } + + /// Get and Set the xOffset (ie, horizontal scroll position). (Scintilla feature 2397) + public void SetXOffset(int newOffset) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETXOFFSET, newOffset, Unused); + } + + /// Get and Set the xOffset (ie, horizontal scroll position). (Scintilla feature 2398) + public int GetXOffset() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETXOFFSET, Unused, Unused); + return (int) res; + } + + /// Set the last x chosen value to be the caret x position. (Scintilla feature 2399) + public void ChooseCaretX() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CHOOSECARETX, Unused, Unused); + } + + /// Set the focus to this Scintilla widget. (Scintilla feature 2400) + public void GrabFocus() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GRABFOCUS, Unused, Unused); + } + + /// + /// Set the way the caret is kept visible when going sideways. + /// The exclusion zone is given in pixels. + /// (Scintilla feature 2402) + /// + public void SetXCaretPolicy(int caretPolicy, int caretSlop) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETXCARETPOLICY, caretPolicy, caretSlop); + } + + /// + /// Set the way the line the caret is on is kept visible. + /// The exclusion zone is given in lines. + /// (Scintilla feature 2403) + /// + public void SetYCaretPolicy(int caretPolicy, int caretSlop) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETYCARETPOLICY, caretPolicy, caretSlop); + } + + /// Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE). (Scintilla feature 2406) + public void SetPrintWrapMode(int mode) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETPRINTWRAPMODE, mode, Unused); + } + + /// Is printing line wrapped? (Scintilla feature 2407) + public int GetPrintWrapMode() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETPRINTWRAPMODE, Unused, Unused); + return (int) res; + } + + /// Set a fore colour for active hotspots. (Scintilla feature 2410) + public void SetHotspotActiveFore(bool useSetting, Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETHOTSPOTACTIVEFORE, useSetting ? 1 : 0, fore.Value); + } + + /// Get the fore colour for active hotspots. (Scintilla feature 2494) + public Colour GetHotspotActiveFore() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETHOTSPOTACTIVEFORE, Unused, Unused); + return new Colour((int) res); + } + + /// Set a back colour for active hotspots. (Scintilla feature 2411) + public void SetHotspotActiveBack(bool useSetting, Colour back) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETHOTSPOTACTIVEBACK, useSetting ? 1 : 0, back.Value); + } + + /// Get the back colour for active hotspots. (Scintilla feature 2495) + public Colour GetHotspotActiveBack() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETHOTSPOTACTIVEBACK, Unused, Unused); + return new Colour((int) res); + } + + /// Enable / Disable underlining active hotspots. (Scintilla feature 2412) + public void SetHotspotActiveUnderline(bool underline) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETHOTSPOTACTIVEUNDERLINE, underline ? 1 : 0, Unused); + } + + /// Get whether underlining for active hotspots. (Scintilla feature 2496) + public bool GetHotspotActiveUnderline() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETHOTSPOTACTIVEUNDERLINE, Unused, Unused); + return 1 == (int) res; + } + + /// Limit hotspots to single line so hotspots on two lines don't merge. (Scintilla feature 2421) + public void SetHotspotSingleLine(bool singleLine) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETHOTSPOTSINGLELINE, singleLine ? 1 : 0, Unused); + } + + /// Get the HotspotSingleLine property (Scintilla feature 2497) + public bool GetHotspotSingleLine() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETHOTSPOTSINGLELINE, Unused, Unused); + return 1 == (int) res; + } + + /// Move caret between paragraphs (delimited by empty lines). (Scintilla feature 2413) + public void ParaDown() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PARADOWN, Unused, Unused); + } + + /// Move caret between paragraphs (delimited by empty lines). (Scintilla feature 2414) + public void ParaDownExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PARADOWNEXTEND, Unused, Unused); + } + + /// Move caret between paragraphs (delimited by empty lines). (Scintilla feature 2415) + public void ParaUp() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PARAUP, Unused, Unused); + } + + /// Move caret between paragraphs (delimited by empty lines). (Scintilla feature 2416) + public void ParaUpExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PARAUPEXTEND, Unused, Unused); + } + + /// + /// Given a valid document position, return the previous position taking code + /// page into account. Returns 0 if passed 0. + /// (Scintilla feature 2417) + /// + public Position PositionBefore(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_POSITIONBEFORE, pos.Value, Unused); + return new Position((int) res); + } + + /// + /// Given a valid document position, return the next position taking code + /// page into account. Maximum value returned is the last position in the document. + /// (Scintilla feature 2418) + /// + public Position PositionAfter(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_POSITIONAFTER, pos.Value, Unused); + return new Position((int) res); + } + + /// + /// Given a valid document position, return a position that differs in a number + /// of characters. Returned value is always between 0 and last position in document. + /// (Scintilla feature 2670) + /// + public Position PositionRelative(Position pos, int relative) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_POSITIONRELATIVE, pos.Value, relative); + return new Position((int) res); + } + + /// Copy a range of text to the clipboard. Positions are clipped into the document. (Scintilla feature 2419) + public void CopyRange(Position start, Position end) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_COPYRANGE, start.Value, end.Value); + } + + /// Copy argument text to the clipboard. (Scintilla feature 2420) + public unsafe void CopyText(int length, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_COPYTEXT, length, (IntPtr) textPtr); + } + } + + /// + /// Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE/SC_SEL_THIN) or + /// by lines (SC_SEL_LINES). + /// (Scintilla feature 2422) + /// + public void SetSelectionMode(int mode) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELECTIONMODE, mode, Unused); + } + + /// Get the mode of the current selection. (Scintilla feature 2423) + public int GetSelectionMode() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELECTIONMODE, Unused, Unused); + return (int) res; + } + + /// Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line). (Scintilla feature 2424) + public Position GetLineSelStartPosition(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINESELSTARTPOSITION, line, Unused); + return new Position((int) res); + } + + /// Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line). (Scintilla feature 2425) + public Position GetLineSelEndPosition(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINESELENDPOSITION, line, Unused); + return new Position((int) res); + } + + /// Move caret down one line, extending rectangular selection to new caret position. (Scintilla feature 2426) + public void LineDownRectExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEDOWNRECTEXTEND, Unused, Unused); + } + + /// Move caret up one line, extending rectangular selection to new caret position. (Scintilla feature 2427) + public void LineUpRectExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEUPRECTEXTEND, Unused, Unused); + } + + /// Move caret left one character, extending rectangular selection to new caret position. (Scintilla feature 2428) + public void CharLeftRectExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CHARLEFTRECTEXTEND, Unused, Unused); + } + + /// Move caret right one character, extending rectangular selection to new caret position. (Scintilla feature 2429) + public void CharRightRectExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CHARRIGHTRECTEXTEND, Unused, Unused); + } + + /// Move caret to first position on line, extending rectangular selection to new caret position. (Scintilla feature 2430) + public void HomeRectExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_HOMERECTEXTEND, Unused, Unused); + } + + /// + /// 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. + /// (Scintilla feature 2431) + /// + public void VCHomeRectExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_VCHOMERECTEXTEND, Unused, Unused); + } + + /// Move caret to last position on line, extending rectangular selection to new caret position. (Scintilla feature 2432) + public void LineEndRectExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LINEENDRECTEXTEND, Unused, Unused); + } + + /// Move caret one page up, extending rectangular selection to new caret position. (Scintilla feature 2433) + public void PageUpRectExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PAGEUPRECTEXTEND, Unused, Unused); + } + + /// Move caret one page down, extending rectangular selection to new caret position. (Scintilla feature 2434) + public void PageDownRectExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PAGEDOWNRECTEXTEND, Unused, Unused); + } + + /// Move caret to top of page, or one page up if already at top of page. (Scintilla feature 2435) + public void StutteredPageUp() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STUTTEREDPAGEUP, Unused, Unused); + } + + /// Move caret to top of page, or one page up if already at top of page, extending selection to new caret position. (Scintilla feature 2436) + public void StutteredPageUpExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STUTTEREDPAGEUPEXTEND, Unused, Unused); + } + + /// Move caret to bottom of page, or one page down if already at bottom of page. (Scintilla feature 2437) + public void StutteredPageDown() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STUTTEREDPAGEDOWN, Unused, Unused); + } + + /// Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position. (Scintilla feature 2438) + public void StutteredPageDownExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STUTTEREDPAGEDOWNEXTEND, Unused, Unused); + } + + /// Move caret left one word, position cursor at end of word. (Scintilla feature 2439) + public void WordLeftEnd() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDLEFTEND, Unused, Unused); + } + + /// Move caret left one word, position cursor at end of word, extending selection to new caret position. (Scintilla feature 2440) + public void WordLeftEndExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDLEFTENDEXTEND, Unused, Unused); + } + + /// Move caret right one word, position cursor at end of word. (Scintilla feature 2441) + public void WordRightEnd() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDRIGHTEND, Unused, Unused); + } + + /// Move caret right one word, position cursor at end of word, extending selection to new caret position. (Scintilla feature 2442) + public void WordRightEndExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_WORDRIGHTENDEXTEND, Unused, Unused); + } + + /// + /// Set the set of characters making up whitespace for when moving or selecting by word. + /// Should be called after SetWordChars. + /// (Scintilla feature 2443) + /// + public unsafe void SetWhitespaceChars(string characters) + { + fixed (byte* charactersPtr = Encoding.UTF8.GetBytes(characters)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETWHITESPACECHARS, Unused, (IntPtr) charactersPtr); + } + } + + /// Get the set of characters making up whitespace for when moving or selecting by word. (Scintilla feature 2647) + public unsafe string GetWhitespaceChars() + { + byte[] charactersBuffer = new byte[10000]; + fixed (byte* charactersPtr = charactersBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETWHITESPACECHARS, Unused, (IntPtr) charactersPtr); + return Encoding.UTF8.GetString(charactersBuffer).TrimEnd('\0'); + } + } + + /// + /// Set the set of characters making up punctuation characters + /// Should be called after SetWordChars. + /// (Scintilla feature 2648) + /// + public unsafe void SetPunctuationChars(string characters) + { + fixed (byte* charactersPtr = Encoding.UTF8.GetBytes(characters)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETPUNCTUATIONCHARS, Unused, (IntPtr) charactersPtr); + } + } + + /// Get the set of characters making up punctuation characters (Scintilla feature 2649) + public unsafe string GetPunctuationChars() + { + byte[] charactersBuffer = new byte[10000]; + fixed (byte* charactersPtr = charactersBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETPUNCTUATIONCHARS, Unused, (IntPtr) charactersPtr); + return Encoding.UTF8.GetString(charactersBuffer).TrimEnd('\0'); + } + } + + /// Reset the set of characters for whitespace and word characters to the defaults. (Scintilla feature 2444) + public void SetCharsDefault() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCHARSDEFAULT, Unused, Unused); + } + + /// Get currently selected item position in the auto-completion list (Scintilla feature 2445) + public int AutoCGetCurrent() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETCURRENT, Unused, Unused); + return (int) res; + } + + /// + /// Get currently selected item text in the auto-completion list + /// Returns the length of the item text + /// Result is NUL-terminated. + /// (Scintilla feature 2610) + /// + public unsafe string AutoCGetCurrentText() + { + byte[] sBuffer = new byte[10000]; + fixed (byte* sPtr = sBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETCURRENTTEXT, Unused, (IntPtr) sPtr); + return Encoding.UTF8.GetString(sBuffer).TrimEnd('\0'); + } + } + + /// Set auto-completion case insensitive behaviour to either prefer case-sensitive matches or have no preference. (Scintilla feature 2634) + public void AutoCSetCaseInsensitiveBehaviour(int behaviour) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR, behaviour, Unused); + } + + /// Get auto-completion case insensitive behaviour. (Scintilla feature 2635) + public int AutoCGetCaseInsensitiveBehaviour() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR, Unused, Unused); + return (int) res; + } + + /// Change the effect of autocompleting when there are multiple selections. (Scintilla feature 2636) + public void AutoCSetMulti(int multi) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETMULTI, multi, Unused); + } + + /// Retrieve the effect of autocompleting when there are multiple selections.. (Scintilla feature 2637) + public int AutoCGetMulti() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETMULTI, Unused, Unused); + return (int) res; + } + + /// Set the way autocompletion lists are ordered. (Scintilla feature 2660) + public void AutoCSetOrder(int order) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCSETORDER, order, Unused); + } + + /// Get the way autocompletion lists are ordered. (Scintilla feature 2661) + public int AutoCGetOrder() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_AUTOCGETORDER, Unused, Unused); + return (int) res; + } + + /// Enlarge the document to a particular size of text bytes. (Scintilla feature 2446) + public void Allocate(int bytes) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ALLOCATE, bytes, Unused); + } + + /// + /// Returns the target converted to UTF8. + /// Return the length in bytes. + /// (Scintilla feature 2447) + /// + public unsafe string TargetAsUTF8() + { + byte[] sBuffer = new byte[10000]; + fixed (byte* sPtr = sBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_TARGETASUTF8, Unused, (IntPtr) sPtr); + return Encoding.UTF8.GetString(sBuffer).TrimEnd('\0'); + } + } + + /// + /// Set the length of the utf8 argument for calling EncodedFromUTF8. + /// Set to -1 and the string will be measured to the first nul. + /// (Scintilla feature 2448) + /// + public void SetLengthForEncode(int bytes) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETLENGTHFORENCODE, bytes, Unused); + } + + /// + /// Translates a UTF8 string into the document encoding. + /// Return the length of the result in bytes. + /// On error return 0. + /// (Scintilla feature 2449) + /// + public unsafe string EncodedFromUTF8(string utf8) + { + fixed (byte* utf8Ptr = Encoding.UTF8.GetBytes(utf8)) + { + byte[] encodedBuffer = new byte[10000]; + fixed (byte* encodedPtr = encodedBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ENCODEDFROMUTF8, (IntPtr) utf8Ptr, (IntPtr) encodedPtr); + return Encoding.UTF8.GetString(encodedBuffer).TrimEnd('\0'); + } + } + } + + /// + /// 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. + /// (Scintilla feature 2456) + /// + public int FindColumn(int line, int column) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_FINDCOLUMN, line, column); + return (int) res; + } + + /// Can the caret preferred x position only be changed by explicit movement commands? (Scintilla feature 2457) + public int GetCaretSticky() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCARETSTICKY, Unused, Unused); + return (int) res; + } + + /// Stop the caret preferred x position changing when the user types. (Scintilla feature 2458) + public void SetCaretSticky(int useCaretStickyBehaviour) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCARETSTICKY, useCaretStickyBehaviour, Unused); + } + + /// Switch between sticky and non-sticky: meant to be bound to a key. (Scintilla feature 2459) + public void ToggleCaretSticky() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_TOGGLECARETSTICKY, Unused, Unused); + } + + /// Enable/Disable convert-on-paste for line endings (Scintilla feature 2467) + public void SetPasteConvertEndings(bool convert) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETPASTECONVERTENDINGS, convert ? 1 : 0, Unused); + } + + /// Get convert-on-paste setting (Scintilla feature 2468) + public bool GetPasteConvertEndings() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETPASTECONVERTENDINGS, Unused, Unused); + return 1 == (int) res; + } + + /// Duplicate the selection. If selection empty duplicate the line containing the caret. (Scintilla feature 2469) + public void SelectionDuplicate() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SELECTIONDUPLICATE, Unused, Unused); + } + + /// Set background alpha of the caret line. (Scintilla feature 2470) + public void SetCaretLineBackAlpha(int alpha) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCARETLINEBACKALPHA, alpha, Unused); + } + + /// Get the background alpha of the caret line. (Scintilla feature 2471) + public int GetCaretLineBackAlpha() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCARETLINEBACKALPHA, Unused, Unused); + return (int) res; + } + + /// Set the style of the caret to be drawn. (Scintilla feature 2512) + public void SetCaretStyle(int caretStyle) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCARETSTYLE, caretStyle, Unused); + } + + /// Returns the current style of the caret. (Scintilla feature 2513) + public int GetCaretStyle() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCARETSTYLE, Unused, Unused); + return (int) res; + } + + /// Set the indicator used for IndicatorFillRange and IndicatorClearRange (Scintilla feature 2500) + public void SetIndicatorCurrent(int indicator) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETINDICATORCURRENT, indicator, Unused); + } + + /// Get the current indicator (Scintilla feature 2501) + public int GetIndicatorCurrent() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETINDICATORCURRENT, Unused, Unused); + return (int) res; + } + + /// Set the value used for IndicatorFillRange (Scintilla feature 2502) + public void SetIndicatorValue(int value) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETINDICATORVALUE, value, Unused); + } + + /// Get the current indicator value (Scintilla feature 2503) + public int GetIndicatorValue() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETINDICATORVALUE, Unused, Unused); + return (int) res; + } + + /// Turn a indicator on over a range. (Scintilla feature 2504) + public void IndicatorFillRange(int position, int fillLength) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICATORFILLRANGE, position, fillLength); + } + + /// Turn a indicator off over a range. (Scintilla feature 2505) + public void IndicatorClearRange(int position, int clearLength) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICATORCLEARRANGE, position, clearLength); + } + + /// Are any indicators present at position? (Scintilla feature 2506) + public int IndicatorAllOnFor(int position) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICATORALLONFOR, position, Unused); + return (int) res; + } + + /// What value does a particular indicator have at at a position? (Scintilla feature 2507) + public int IndicatorValueAt(int indicator, int position) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICATORVALUEAT, indicator, position); + return (int) res; + } + + /// Where does a particular indicator start? (Scintilla feature 2508) + public int IndicatorStart(int indicator, int position) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICATORSTART, indicator, position); + return (int) res; + } + + /// Where does a particular indicator end? (Scintilla feature 2509) + public int IndicatorEnd(int indicator, int position) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICATOREND, indicator, position); + return (int) res; + } + + /// Set number of entries in position cache (Scintilla feature 2514) + public void SetPositionCache(int size) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETPOSITIONCACHE, size, Unused); + } + + /// How many entries are allocated to the position cache? (Scintilla feature 2515) + public int GetPositionCache() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETPOSITIONCACHE, Unused, Unused); + return (int) res; + } + + /// Copy the selection, if selection empty copy the line with the caret (Scintilla feature 2519) + public void CopyAllowLine() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_COPYALLOWLINE, Unused, Unused); + } + + /// + /// Compact the document buffer and return a read-only pointer to the + /// characters in the document. + /// (Scintilla feature 2520) + /// + public IntPtr GetCharacterPointer() + { + return Win32.SendMessage(scintilla, SciMsg.SCI_GETCHARACTERPOINTER, Unused, Unused); + } + + /// + /// Return a read-only pointer to a range of characters in the document. + /// May move the gap so that the range is contiguous, but will only move up + /// to rangeLength bytes. + /// (Scintilla feature 2643) + /// + public IntPtr GetRangePointer(int position, int rangeLength) + { + return Win32.SendMessage(scintilla, SciMsg.SCI_GETRANGEPOINTER, position, rangeLength); + } + + /// + /// Return a position which, to avoid performance costs, should not be within + /// the range of a call to GetRangePointer. + /// (Scintilla feature 2644) + /// + public Position GetGapPosition() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETGAPPOSITION, Unused, Unused); + return new Position((int) res); + } + + /// Set the alpha fill colour of the given indicator. (Scintilla feature 2523) + public void IndicSetAlpha(int indicator, int alpha) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICSETALPHA, indicator, alpha); + } + + /// Get the alpha fill colour of the given indicator. (Scintilla feature 2524) + public int IndicGetAlpha(int indicator) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICGETALPHA, indicator, Unused); + return (int) res; + } + + /// Set the alpha outline colour of the given indicator. (Scintilla feature 2558) + public void IndicSetOutlineAlpha(int indicator, int alpha) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICSETOUTLINEALPHA, indicator, alpha); + } + + /// Get the alpha outline colour of the given indicator. (Scintilla feature 2559) + public int IndicGetOutlineAlpha(int indicator) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_INDICGETOUTLINEALPHA, indicator, Unused); + return (int) res; + } + + /// Set extra ascent for each line (Scintilla feature 2525) + public void SetExtraAscent(int extraAscent) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETEXTRAASCENT, extraAscent, Unused); + } + + /// Get extra ascent for each line (Scintilla feature 2526) + public int GetExtraAscent() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETEXTRAASCENT, Unused, Unused); + return (int) res; + } + + /// Set extra descent for each line (Scintilla feature 2527) + public void SetExtraDescent(int extraDescent) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETEXTRADESCENT, extraDescent, Unused); + } + + /// Get extra descent for each line (Scintilla feature 2528) + public int GetExtraDescent() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETEXTRADESCENT, Unused, Unused); + return (int) res; + } + + /// Which symbol was defined for markerNumber with MarkerDefine (Scintilla feature 2529) + public int MarkerSymbolDefined(int markerNumber) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERSYMBOLDEFINED, markerNumber, Unused); + return (int) res; + } + + /// Set the text in the text margin for a line (Scintilla feature 2530) + public unsafe void MarginSetText(int line, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARGINSETTEXT, line, (IntPtr) textPtr); + } + } + + /// Get the text in the text margin for a line (Scintilla feature 2531) + public unsafe string MarginGetText(int line) + { + byte[] textBuffer = new byte[10000]; + fixed (byte* textPtr = textBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARGINGETTEXT, line, (IntPtr) textPtr); + return Encoding.UTF8.GetString(textBuffer).TrimEnd('\0'); + } + } + + /// Set the style number for the text margin for a line (Scintilla feature 2532) + public void MarginSetStyle(int line, int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARGINSETSTYLE, line, style); + } + + /// Get the style number for the text margin for a line (Scintilla feature 2533) + public int MarginGetStyle(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARGINGETSTYLE, line, Unused); + return (int) res; + } + + /// Set the style in the text margin for a line (Scintilla feature 2534) + public unsafe void MarginSetStyles(int line, string styles) + { + fixed (byte* stylesPtr = Encoding.UTF8.GetBytes(styles)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARGINSETSTYLES, line, (IntPtr) stylesPtr); + } + } + + /// Get the styles in the text margin for a line (Scintilla feature 2535) + public unsafe string MarginGetStyles(int line) + { + byte[] stylesBuffer = new byte[10000]; + fixed (byte* stylesPtr = stylesBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARGINGETSTYLES, line, (IntPtr) stylesPtr); + return Encoding.UTF8.GetString(stylesBuffer).TrimEnd('\0'); + } + } + + /// Clear the margin text on all lines (Scintilla feature 2536) + public void MarginTextClearAll() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARGINTEXTCLEARALL, Unused, Unused); + } + + /// Get the start of the range of style numbers used for margin text (Scintilla feature 2537) + public void MarginSetStyleOffset(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARGINSETSTYLEOFFSET, style, Unused); + } + + /// Get the start of the range of style numbers used for margin text (Scintilla feature 2538) + public int MarginGetStyleOffset() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARGINGETSTYLEOFFSET, Unused, Unused); + return (int) res; + } + + /// Set the margin options. (Scintilla feature 2539) + public void SetMarginOptions(int marginOptions) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMARGINOPTIONS, marginOptions, Unused); + } + + /// Get the margin options. (Scintilla feature 2557) + public int GetMarginOptions() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMARGINOPTIONS, Unused, Unused); + return (int) res; + } + + /// Set the annotation text for a line (Scintilla feature 2540) + public unsafe void AnnotationSetText(int line, string text) + { + fixed (byte* textPtr = Encoding.UTF8.GetBytes(text)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONSETTEXT, line, (IntPtr) textPtr); + } + } + + /// Get the annotation text for a line (Scintilla feature 2541) + public unsafe string AnnotationGetText(int line) + { + byte[] textBuffer = new byte[10000]; + fixed (byte* textPtr = textBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONGETTEXT, line, (IntPtr) textPtr); + return Encoding.UTF8.GetString(textBuffer).TrimEnd('\0'); + } + } + + /// Set the style number for the annotations for a line (Scintilla feature 2542) + public void AnnotationSetStyle(int line, int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONSETSTYLE, line, style); + } + + /// Get the style number for the annotations for a line (Scintilla feature 2543) + public int AnnotationGetStyle(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONGETSTYLE, line, Unused); + return (int) res; + } + + /// Set the annotation styles for a line (Scintilla feature 2544) + public unsafe void AnnotationSetStyles(int line, string styles) + { + fixed (byte* stylesPtr = Encoding.UTF8.GetBytes(styles)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONSETSTYLES, line, (IntPtr) stylesPtr); + } + } + + /// Get the annotation styles for a line (Scintilla feature 2545) + public unsafe string AnnotationGetStyles(int line) + { + byte[] stylesBuffer = new byte[10000]; + fixed (byte* stylesPtr = stylesBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONGETSTYLES, line, (IntPtr) stylesPtr); + return Encoding.UTF8.GetString(stylesBuffer).TrimEnd('\0'); + } + } + + /// Get the number of annotation lines for a line (Scintilla feature 2546) + public int AnnotationGetLines(int line) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONGETLINES, line, Unused); + return (int) res; + } + + /// Clear the annotations from all lines (Scintilla feature 2547) + public void AnnotationClearAll() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONCLEARALL, Unused, Unused); + } + + /// Set the visibility for the annotations for a view (Scintilla feature 2548) + public void AnnotationSetVisible(int visible) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONSETVISIBLE, visible, Unused); + } + + /// Get the visibility for the annotations for a view (Scintilla feature 2549) + public int AnnotationGetVisible() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONGETVISIBLE, Unused, Unused); + return (int) res; + } + + /// Get the start of the range of style numbers used for annotations (Scintilla feature 2550) + public void AnnotationSetStyleOffset(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONSETSTYLEOFFSET, style, Unused); + } + + /// Get the start of the range of style numbers used for annotations (Scintilla feature 2551) + public int AnnotationGetStyleOffset() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ANNOTATIONGETSTYLEOFFSET, Unused, Unused); + return (int) res; + } + + /// Release all extended (>255) style numbers (Scintilla feature 2552) + public void ReleaseAllExtendedStyles() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_RELEASEALLEXTENDEDSTYLES, Unused, Unused); + } + + /// Allocate some extended (>255) style numbers and return the start of the range (Scintilla feature 2553) + public int AllocateExtendedStyles(int numberStyles) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ALLOCATEEXTENDEDSTYLES, numberStyles, Unused); + return (int) res; + } + + /// Add a container action to the undo stack (Scintilla feature 2560) + public void AddUndoAction(int token, int flags) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ADDUNDOACTION, token, flags); + } + + /// Find the position of a character from a point within the window. (Scintilla feature 2561) + public Position CharPositionFromPoint(int x, int y) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CHARPOSITIONFROMPOINT, x, y); + return new Position((int) res); + } + + /// + /// Find the position of a character from a point within the window. + /// Return INVALID_POSITION if not close to text. + /// (Scintilla feature 2562) + /// + public Position CharPositionFromPointClose(int x, int y) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CHARPOSITIONFROMPOINTCLOSE, x, y); + return new Position((int) res); + } + + /// Set whether switching to rectangular mode while selecting with the mouse is allowed. (Scintilla feature 2668) + public void SetMouseSelectionRectangularSwitch(bool mouseSelectionRectangularSwitch) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMOUSESELECTIONRECTANGULARSWITCH, mouseSelectionRectangularSwitch ? 1 : 0, Unused); + } + + /// Whether switching to rectangular mode while selecting with the mouse is allowed. (Scintilla feature 2669) + public bool GetMouseSelectionRectangularSwitch() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMOUSESELECTIONRECTANGULARSWITCH, Unused, Unused); + return 1 == (int) res; + } + + /// Set whether multiple selections can be made (Scintilla feature 2563) + public void SetMultipleSelection(bool multipleSelection) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMULTIPLESELECTION, multipleSelection ? 1 : 0, Unused); + } + + /// Whether multiple selections can be made (Scintilla feature 2564) + public bool GetMultipleSelection() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMULTIPLESELECTION, Unused, Unused); + return 1 == (int) res; + } + + /// Set whether typing can be performed into multiple selections (Scintilla feature 2565) + public void SetAdditionalSelectionTyping(bool additionalSelectionTyping) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETADDITIONALSELECTIONTYPING, additionalSelectionTyping ? 1 : 0, Unused); + } + + /// Whether typing can be performed into multiple selections (Scintilla feature 2566) + public bool GetAdditionalSelectionTyping() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETADDITIONALSELECTIONTYPING, Unused, Unused); + return 1 == (int) res; + } + + /// Set whether additional carets will blink (Scintilla feature 2567) + public void SetAdditionalCaretsBlink(bool additionalCaretsBlink) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETADDITIONALCARETSBLINK, additionalCaretsBlink ? 1 : 0, Unused); + } + + /// Whether additional carets will blink (Scintilla feature 2568) + public bool GetAdditionalCaretsBlink() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETADDITIONALCARETSBLINK, Unused, Unused); + return 1 == (int) res; + } + + /// Set whether additional carets are visible (Scintilla feature 2608) + public void SetAdditionalCaretsVisible(bool additionalCaretsBlink) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETADDITIONALCARETSVISIBLE, additionalCaretsBlink ? 1 : 0, Unused); + } + + /// Whether additional carets are visible (Scintilla feature 2609) + public bool GetAdditionalCaretsVisible() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETADDITIONALCARETSVISIBLE, Unused, Unused); + return 1 == (int) res; + } + + /// How many selections are there? (Scintilla feature 2570) + public int GetSelections() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELECTIONS, Unused, Unused); + return (int) res; + } + + /// Is every selected range empty? (Scintilla feature 2650) + public bool GetSelectionEmpty() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELECTIONEMPTY, Unused, Unused); + return 1 == (int) res; + } + + /// Clear selections to a single empty stream selection (Scintilla feature 2571) + public void ClearSelections() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CLEARSELECTIONS, Unused, Unused); + } + + /// Set a simple selection (Scintilla feature 2572) + public int SetSelection(int caret, int anchor) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELECTION, caret, anchor); + return (int) res; + } + + /// Add a selection (Scintilla feature 2573) + public int AddSelection(int caret, int anchor) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ADDSELECTION, caret, anchor); + return (int) res; + } + + /// Drop one selection (Scintilla feature 2671) + public void DropSelectionN(int selection) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DROPSELECTIONN, selection, Unused); + } + + /// Set the main selection (Scintilla feature 2574) + public void SetMainSelection(int selection) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETMAINSELECTION, selection, Unused); + } + + /// Which selection is the main selection (Scintilla feature 2575) + public int GetMainSelection() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETMAINSELECTION, Unused, Unused); + return (int) res; + } + + /// Which selection is the main selection (Scintilla feature 2576) + public void SetSelectionNCaret(int selection, Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELECTIONNCARET, selection, pos.Value); + } + + /// Which selection is the main selection (Scintilla feature 2577) + public Position GetSelectionNCaret(int selection) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELECTIONNCARET, selection, Unused); + return new Position((int) res); + } + + /// Which selection is the main selection (Scintilla feature 2578) + public void SetSelectionNAnchor(int selection, Position posAnchor) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELECTIONNANCHOR, selection, posAnchor.Value); + } + + /// Which selection is the main selection (Scintilla feature 2579) + public Position GetSelectionNAnchor(int selection) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELECTIONNANCHOR, selection, Unused); + return new Position((int) res); + } + + /// Which selection is the main selection (Scintilla feature 2580) + public void SetSelectionNCaretVirtualSpace(int selection, int space) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELECTIONNCARETVIRTUALSPACE, selection, space); + } + + /// Which selection is the main selection (Scintilla feature 2581) + public int GetSelectionNCaretVirtualSpace(int selection) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELECTIONNCARETVIRTUALSPACE, selection, Unused); + return (int) res; + } + + /// Which selection is the main selection (Scintilla feature 2582) + public void SetSelectionNAnchorVirtualSpace(int selection, int space) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELECTIONNANCHORVIRTUALSPACE, selection, space); + } + + /// Which selection is the main selection (Scintilla feature 2583) + public int GetSelectionNAnchorVirtualSpace(int selection) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELECTIONNANCHORVIRTUALSPACE, selection, Unused); + return (int) res; + } + + /// Sets the position that starts the selection - this becomes the anchor. (Scintilla feature 2584) + public void SetSelectionNStart(int selection, Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELECTIONNSTART, selection, pos.Value); + } + + /// Returns the position at the start of the selection. (Scintilla feature 2585) + public Position GetSelectionNStart(int selection) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELECTIONNSTART, selection, Unused); + return new Position((int) res); + } + + /// Sets the position that ends the selection - this becomes the currentPosition. (Scintilla feature 2586) + public void SetSelectionNEnd(int selection, Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETSELECTIONNEND, selection, pos.Value); + } + + /// Returns the position at the end of the selection. (Scintilla feature 2587) + public Position GetSelectionNEnd(int selection) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSELECTIONNEND, selection, Unused); + return new Position((int) res); + } + + /// Returns the position at the end of the selection. (Scintilla feature 2588) + public void SetRectangularSelectionCaret(Position pos) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETRECTANGULARSELECTIONCARET, pos.Value, Unused); + } + + /// Returns the position at the end of the selection. (Scintilla feature 2589) + public Position GetRectangularSelectionCaret() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETRECTANGULARSELECTIONCARET, Unused, Unused); + return new Position((int) res); + } + + /// Returns the position at the end of the selection. (Scintilla feature 2590) + public void SetRectangularSelectionAnchor(Position posAnchor) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETRECTANGULARSELECTIONANCHOR, posAnchor.Value, Unused); + } + + /// Returns the position at the end of the selection. (Scintilla feature 2591) + public Position GetRectangularSelectionAnchor() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETRECTANGULARSELECTIONANCHOR, Unused, Unused); + return new Position((int) res); + } + + /// Returns the position at the end of the selection. (Scintilla feature 2592) + public void SetRectangularSelectionCaretVirtualSpace(int space) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE, space, Unused); + } + + /// Returns the position at the end of the selection. (Scintilla feature 2593) + public int GetRectangularSelectionCaretVirtualSpace() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, Unused, Unused); + return (int) res; + } + + /// Returns the position at the end of the selection. (Scintilla feature 2594) + public void SetRectangularSelectionAnchorVirtualSpace(int space) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE, space, Unused); + } + + /// Returns the position at the end of the selection. (Scintilla feature 2595) + public int GetRectangularSelectionAnchorVirtualSpace() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, Unused, Unused); + return (int) res; + } + + /// Returns the position at the end of the selection. (Scintilla feature 2596) + public void SetVirtualSpaceOptions(int virtualSpaceOptions) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETVIRTUALSPACEOPTIONS, virtualSpaceOptions, Unused); + } + + /// Returns the position at the end of the selection. (Scintilla feature 2597) + public int GetVirtualSpaceOptions() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETVIRTUALSPACEOPTIONS, Unused, Unused); + return (int) res; + } + + /// + /// On GTK+, allow selecting the modifier key to use for mouse-based + /// rectangular selection. Often the window manager requires Alt+Mouse Drag + /// for moving windows. + /// Valid values are SCMOD_CTRL(default), SCMOD_ALT, or SCMOD_SUPER. + /// (Scintilla feature 2598) + /// + public void SetRectangularSelectionModifier(int modifier) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETRECTANGULARSELECTIONMODIFIER, modifier, Unused); + } + + /// Get the modifier key used for rectangular selection. (Scintilla feature 2599) + public int GetRectangularSelectionModifier() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETRECTANGULARSELECTIONMODIFIER, Unused, Unused); + return (int) res; + } + + /// + /// Set the foreground colour of additional selections. + /// Must have previously called SetSelFore with non-zero first argument for this to have an effect. + /// (Scintilla feature 2600) + /// + public void SetAdditionalSelFore(Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETADDITIONALSELFORE, fore.Value, Unused); + } + + /// + /// Set the background colour of additional selections. + /// Must have previously called SetSelBack with non-zero first argument for this to have an effect. + /// (Scintilla feature 2601) + /// + public void SetAdditionalSelBack(Colour back) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETADDITIONALSELBACK, back.Value, Unused); + } + + /// Set the alpha of the selection. (Scintilla feature 2602) + public void SetAdditionalSelAlpha(int alpha) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETADDITIONALSELALPHA, alpha, Unused); + } + + /// Get the alpha of the selection. (Scintilla feature 2603) + public int GetAdditionalSelAlpha() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETADDITIONALSELALPHA, Unused, Unused); + return (int) res; + } + + /// Set the foreground colour of additional carets. (Scintilla feature 2604) + public void SetAdditionalCaretFore(Colour fore) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETADDITIONALCARETFORE, fore.Value, Unused); + } + + /// Get the foreground colour of additional carets. (Scintilla feature 2605) + public Colour GetAdditionalCaretFore() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETADDITIONALCARETFORE, Unused, Unused); + return new Colour((int) res); + } + + /// Set the main selection to the next selection. (Scintilla feature 2606) + public void RotateSelection() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ROTATESELECTION, Unused, Unused); + } + + /// Swap that caret and anchor of the main selection. (Scintilla feature 2607) + public void SwapMainAnchorCaret() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SWAPMAINANCHORCARET, Unused, Unused); + } + + /// + /// Indicate that the internal state of a lexer has changed over a range and therefore + /// there may be a need to redraw. + /// (Scintilla feature 2617) + /// + public int ChangeLexerState(Position start, Position end) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CHANGELEXERSTATE, start.Value, end.Value); + return (int) res; + } + + /// + /// Find the next line at or after lineStart that is a contracted fold header line. + /// Return -1 when no more lines. + /// (Scintilla feature 2618) + /// + public int ContractedFoldNext(int lineStart) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CONTRACTEDFOLDNEXT, lineStart, Unused); + return (int) res; + } + + /// Centre current line in window. (Scintilla feature 2619) + public void VerticalCentreCaret() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_VERTICALCENTRECARET, Unused, Unused); + } + + /// Move the selected lines up one line, shifting the line above after the selection (Scintilla feature 2620) + public void MoveSelectedLinesUp() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MOVESELECTEDLINESUP, Unused, Unused); + } + + /// Move the selected lines down one line, shifting the line below before the selection (Scintilla feature 2621) + public void MoveSelectedLinesDown() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MOVESELECTEDLINESDOWN, Unused, Unused); + } + + /// Set the identifier reported as IdFrom in notification messages. (Scintilla feature 2622) + public void SetIdentifier(int identifier) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETIDENTIFIER, identifier, Unused); + } + + /// Get the identifier. (Scintilla feature 2623) + public int GetIdentifier() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETIDENTIFIER, Unused, Unused); + return (int) res; + } + + /// Set the width for future RGBA image data. (Scintilla feature 2624) + public void RGBAImageSetWidth(int width) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_RGBAIMAGESETWIDTH, width, Unused); + } + + /// Set the height for future RGBA image data. (Scintilla feature 2625) + public void RGBAImageSetHeight(int height) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_RGBAIMAGESETHEIGHT, height, Unused); + } + + /// Set the scale factor in percent for future RGBA image data. (Scintilla feature 2651) + public void RGBAImageSetScale(int scalePercent) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_RGBAIMAGESETSCALE, scalePercent, Unused); + } + + /// + /// Define a marker from RGBA data. + /// It has the width and height from RGBAImageSetWidth/Height + /// (Scintilla feature 2626) + /// + public unsafe void MarkerDefineRGBAImage(int markerNumber, string pixels) + { + fixed (byte* pixelsPtr = Encoding.UTF8.GetBytes(pixels)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_MARKERDEFINERGBAIMAGE, markerNumber, (IntPtr) pixelsPtr); + } + } + + /// + /// Register an RGBA image for use in autocompletion lists. + /// It has the width and height from RGBAImageSetWidth/Height + /// (Scintilla feature 2627) + /// + public unsafe void RegisterRGBAImage(int type, string pixels) + { + fixed (byte* pixelsPtr = Encoding.UTF8.GetBytes(pixels)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_REGISTERRGBAIMAGE, type, (IntPtr) pixelsPtr); + } + } + + /// Scroll to start of document. (Scintilla feature 2628) + public void ScrollToStart() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SCROLLTOSTART, Unused, Unused); + } + + /// Scroll to end of document. (Scintilla feature 2629) + public void ScrollToEnd() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SCROLLTOEND, Unused, Unused); + } + + /// Set the technology used. (Scintilla feature 2630) + public void SetTechnology(int technology) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETTECHNOLOGY, technology, Unused); + } + + /// Get the tech. (Scintilla feature 2631) + public int GetTechnology() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETTECHNOLOGY, Unused, Unused); + return (int) res; + } + + /// Create an ILoader*. (Scintilla feature 2632) + public int CreateLoader(int bytes) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CREATELOADER, bytes, Unused); + return (int) res; + } + + /// On OS X, show a find indicator. (Scintilla feature 2640) + public void FindIndicatorShow(Position start, Position end) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_FINDINDICATORSHOW, start.Value, end.Value); + } + + /// On OS X, flash a find indicator, then fade out. (Scintilla feature 2641) + public void FindIndicatorFlash(Position start, Position end) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_FINDINDICATORFLASH, start.Value, end.Value); + } + + /// On OS X, hide the find indicator. (Scintilla feature 2642) + public void FindIndicatorHide() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_FINDINDICATORHIDE, Unused, Unused); + } + + /// + /// Move caret to before first visible character on display line. + /// If already there move to first character on display line. + /// (Scintilla feature 2652) + /// + public void VCHomeDisplay() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_VCHOMEDISPLAY, Unused, Unused); + } + + /// Like VCHomeDisplay but extending selection to new caret position. (Scintilla feature 2653) + public void VCHomeDisplayExtend() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_VCHOMEDISPLAYEXTEND, Unused, Unused); + } + + /// Is the caret line always visible? (Scintilla feature 2654) + public bool GetCaretLineVisibleAlways() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETCARETLINEVISIBLEALWAYS, Unused, Unused); + return 1 == (int) res; + } + + /// Sets the caret line to always visible. (Scintilla feature 2655) + public void SetCaretLineVisibleAlways(bool alwaysVisible) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETCARETLINEVISIBLEALWAYS, alwaysVisible ? 1 : 0, Unused); + } + + /// Set the line end types that the application wants to use. May not be used if incompatible with lexer or encoding. (Scintilla feature 2656) + public void SetLineEndTypesAllowed(int lineEndBitSet) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETLINEENDTYPESALLOWED, lineEndBitSet, Unused); + } + + /// Get the line end types currently allowed. (Scintilla feature 2657) + public int GetLineEndTypesAllowed() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINEENDTYPESALLOWED, Unused, Unused); + return (int) res; + } + + /// Get the line end types currently recognised. May be a subset of the allowed types due to lexer limitation. (Scintilla feature 2658) + public int GetLineEndTypesActive() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINEENDTYPESACTIVE, Unused, Unused); + return (int) res; + } + + /// Set the way a character is drawn. (Scintilla feature 2665) + public unsafe void SetRepresentation(string encodedCharacter, string representation) + { + fixed (byte* encodedCharacterPtr = Encoding.UTF8.GetBytes(encodedCharacter)) + { + fixed (byte* representationPtr = Encoding.UTF8.GetBytes(representation)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETREPRESENTATION, (IntPtr) encodedCharacterPtr, (IntPtr) representationPtr); + } + } + } + + /// + /// Set the way a character is drawn. + /// Result is NUL-terminated. + /// (Scintilla feature 2666) + /// + public unsafe string GetRepresentation(string encodedCharacter) + { + fixed (byte* encodedCharacterPtr = Encoding.UTF8.GetBytes(encodedCharacter)) + { + byte[] representationBuffer = new byte[10000]; + fixed (byte* representationPtr = representationBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETREPRESENTATION, (IntPtr) encodedCharacterPtr, (IntPtr) representationPtr); + return Encoding.UTF8.GetString(representationBuffer).TrimEnd('\0'); + } + } + } + + /// Remove a character representation. (Scintilla feature 2667) + public unsafe void ClearRepresentation(string encodedCharacter) + { + fixed (byte* encodedCharacterPtr = Encoding.UTF8.GetBytes(encodedCharacter)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_CLEARREPRESENTATION, (IntPtr) encodedCharacterPtr, Unused); + } + } + + /// Start notifying the container of all key presses and commands. (Scintilla feature 3001) + public void StartRecord() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STARTRECORD, Unused, Unused); + } + + /// Stop notifying the container of all key presses and commands. (Scintilla feature 3002) + public void StopRecord() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_STOPRECORD, Unused, Unused); + } + + /// Set the lexing language of the document. (Scintilla feature 4001) + public void SetLexer(int lexer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETLEXER, lexer, Unused); + } + + /// Retrieve the lexing language of the document. (Scintilla feature 4002) + public int GetLexer() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLEXER, Unused, Unused); + return (int) res; + } + + /// Colourise a segment of the document using the current lexing language. (Scintilla feature 4003) + public void Colourise(Position start, Position end) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_COLOURISE, start.Value, end.Value); + } + + /// Set up a value that may be used by a lexer for some optional feature. (Scintilla feature 4004) + public unsafe void SetProperty(string key, string value) + { + fixed (byte* keyPtr = Encoding.UTF8.GetBytes(key)) + { + fixed (byte* valuePtr = Encoding.UTF8.GetBytes(value)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETPROPERTY, (IntPtr) keyPtr, (IntPtr) valuePtr); + } + } + } + + /// Set up the key words used by the lexer. (Scintilla feature 4005) + public unsafe void SetKeyWords(int keywordSet, string keyWords) + { + fixed (byte* keyWordsPtr = Encoding.UTF8.GetBytes(keyWords)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETKEYWORDS, keywordSet, (IntPtr) keyWordsPtr); + } + } + + /// Set the lexing language of the document based on string name. (Scintilla feature 4006) + public unsafe void SetLexerLanguage(string language) + { + fixed (byte* languagePtr = Encoding.UTF8.GetBytes(language)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETLEXERLANGUAGE, Unused, (IntPtr) languagePtr); + } + } + + /// Load a lexer library (dll / so). (Scintilla feature 4007) + public unsafe void LoadLexerLibrary(string path) + { + fixed (byte* pathPtr = Encoding.UTF8.GetBytes(path)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_LOADLEXERLIBRARY, Unused, (IntPtr) pathPtr); + } + } + + /// + /// Retrieve a "property" value previously set with SetProperty. + /// Result is NUL-terminated. + /// (Scintilla feature 4008) + /// + public unsafe string GetProperty(string key) + { + fixed (byte* keyPtr = Encoding.UTF8.GetBytes(key)) + { + byte[] bufBuffer = new byte[10000]; + fixed (byte* bufPtr = bufBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETPROPERTY, (IntPtr) keyPtr, (IntPtr) bufPtr); + return Encoding.UTF8.GetString(bufBuffer).TrimEnd('\0'); + } + } + } + + /// + /// Retrieve a "property" value previously set with SetProperty, + /// with "$()" variable replacement on returned buffer. + /// Result is NUL-terminated. + /// (Scintilla feature 4009) + /// + public unsafe string GetPropertyExpanded(string key) + { + fixed (byte* keyPtr = Encoding.UTF8.GetBytes(key)) + { + byte[] bufBuffer = new byte[10000]; + fixed (byte* bufPtr = bufBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETPROPERTYEXPANDED, (IntPtr) keyPtr, (IntPtr) bufPtr); + return Encoding.UTF8.GetString(bufBuffer).TrimEnd('\0'); + } + } + } + + /// + /// Retrieve a "property" value previously set with SetProperty, + /// interpreted as an int AFTER any "$()" variable replacement. + /// (Scintilla feature 4010) + /// + public unsafe int GetPropertyInt(string key) + { + fixed (byte* keyPtr = Encoding.UTF8.GetBytes(key)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETPROPERTYINT, (IntPtr) keyPtr, Unused); + return (int) res; + } + } + + /// Retrieve the number of bits the current lexer needs for styling. (Scintilla feature 4011) + public int GetStyleBitsNeeded() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSTYLEBITSNEEDED, Unused, Unused); + return (int) res; + } + + /// + /// Retrieve the name of the lexer. + /// Return the length of the text. + /// Result is NUL-terminated. + /// (Scintilla feature 4012) + /// + public unsafe string GetLexerLanguage() + { + byte[] textBuffer = new byte[10000]; + fixed (byte* textPtr = textBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLEXERLANGUAGE, Unused, (IntPtr) textPtr); + return Encoding.UTF8.GetString(textBuffer).TrimEnd('\0'); + } + } + + /// For private communication between an application and a known lexer. (Scintilla feature 4013) + public int PrivateLexerCall(int operation, int pointer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PRIVATELEXERCALL, operation, pointer); + return (int) res; + } + + /// + /// Retrieve a '\n' separated list of properties understood by the current lexer. + /// Result is NUL-terminated. + /// (Scintilla feature 4014) + /// + public unsafe string PropertyNames() + { + byte[] namesBuffer = new byte[10000]; + fixed (byte* namesPtr = namesBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PROPERTYNAMES, Unused, (IntPtr) namesPtr); + return Encoding.UTF8.GetString(namesBuffer).TrimEnd('\0'); + } + } + + /// Retrieve the type of a property. (Scintilla feature 4015) + public unsafe int PropertyType(string name) + { + fixed (byte* namePtr = Encoding.UTF8.GetBytes(name)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_PROPERTYTYPE, (IntPtr) namePtr, Unused); + return (int) res; + } + } + + /// + /// Describe a property. + /// Result is NUL-terminated. + /// (Scintilla feature 4016) + /// + public unsafe string DescribeProperty(string name) + { + fixed (byte* namePtr = Encoding.UTF8.GetBytes(name)) + { + byte[] descriptionBuffer = new byte[10000]; + fixed (byte* descriptionPtr = descriptionBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DESCRIBEPROPERTY, (IntPtr) namePtr, (IntPtr) descriptionPtr); + return Encoding.UTF8.GetString(descriptionBuffer).TrimEnd('\0'); + } + } + } + + /// + /// Retrieve a '\n' separated list of descriptions of the keyword sets understood by the current lexer. + /// Result is NUL-terminated. + /// (Scintilla feature 4017) + /// + public unsafe string DescribeKeyWordSets() + { + byte[] descriptionsBuffer = new byte[10000]; + fixed (byte* descriptionsPtr = descriptionsBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DESCRIBEKEYWORDSETS, Unused, (IntPtr) descriptionsPtr); + return Encoding.UTF8.GetString(descriptionsBuffer).TrimEnd('\0'); + } + } + + /// + /// Bit set of LineEndType enumertion for which line ends beyond the standard + /// LF, CR, and CRLF are supported by the lexer. + /// (Scintilla feature 4018) + /// + public int GetLineEndTypesSupported() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETLINEENDTYPESSUPPORTED, Unused, Unused); + return (int) res; + } + + /// Allocate a set of sub styles for a particular base style, returning start of range (Scintilla feature 4020) + public int AllocateSubStyles(int styleBase, int numberStyles) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_ALLOCATESUBSTYLES, styleBase, numberStyles); + return (int) res; + } + + /// The starting style number for the sub styles associated with a base style (Scintilla feature 4021) + public int GetSubStylesStart(int styleBase) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSUBSTYLESSTART, styleBase, Unused); + return (int) res; + } + + /// The number of sub styles associated with a base style (Scintilla feature 4022) + public int GetSubStylesLength(int styleBase) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSUBSTYLESLENGTH, styleBase, Unused); + return (int) res; + } + + /// For a sub style, return the base style, else return the argument. (Scintilla feature 4027) + public int GetStyleFromSubStyle(int subStyle) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSTYLEFROMSUBSTYLE, subStyle, Unused); + return (int) res; + } + + /// For a secondary style, return the primary style, else return the argument. (Scintilla feature 4028) + public int GetPrimaryStyleFromStyle(int style) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETPRIMARYSTYLEFROMSTYLE, style, Unused); + return (int) res; + } + + /// Free allocated sub styles (Scintilla feature 4023) + public void FreeSubStyles() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_FREESUBSTYLES, Unused, Unused); + } + + /// Set the identifiers that are shown in a particular style (Scintilla feature 4024) + public unsafe void SetIdentifiers(int style, string identifiers) + { + fixed (byte* identifiersPtr = Encoding.UTF8.GetBytes(identifiers)) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETIDENTIFIERS, style, (IntPtr) identifiersPtr); + } + } + + /// + /// Where styles are duplicated by a feature such as active/inactive code + /// return the distance between the two types. + /// (Scintilla feature 4025) + /// + public int DistanceToSecondaryStyles() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_DISTANCETOSECONDARYSTYLES, Unused, Unused); + return (int) res; + } + + /// + /// Get the set of base styles that can be extended with sub styles + /// Result is NUL-terminated. + /// (Scintilla feature 4026) + /// + public unsafe string GetSubStyleBases() + { + byte[] stylesBuffer = new byte[10000]; + fixed (byte* stylesPtr = stylesBuffer) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETSUBSTYLEBASES, Unused, (IntPtr) stylesPtr); + return Encoding.UTF8.GetString(stylesBuffer).TrimEnd('\0'); + } + } + + /// + /// Deprecated in 2.30 + /// In palette mode? + /// (Scintilla feature 2139) + /// + public bool GetUsePalette() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETUSEPALETTE, Unused, Unused); + return 1 == (int) res; + } + + /// + /// In palette mode, Scintilla uses the environment's palette calls to display + /// more colours. This may lead to ugly displays. + /// (Scintilla feature 2039) + /// + public void SetUsePalette(bool usePalette) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETUSEPALETTE, usePalette ? 1 : 0, Unused); + } + + /// + /// Deprecated in 3.5.5 + /// Always interpret keyboard input as Unicode + /// (Scintilla feature 2521) + /// + public void SetKeysUnicode(bool keysUnicode) + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_SETKEYSUNICODE, keysUnicode ? 1 : 0, Unused); + } + + /// Are keys always interpreted as Unicode? (Scintilla feature 2522) + public bool GetKeysUnicode() + { + IntPtr res = Win32.SendMessage(scintilla, SciMsg.SCI_GETKEYSUNICODE, Unused, Unused); + return 1 == (int) res; + } + + /* --Autogenerated -- end of section automatically generated from Scintilla.iface */ + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Scintilla_iface.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Scintilla_iface.cs new file mode 100644 index 000000000000..cc84383fcce8 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Scintilla_iface.cs @@ -0,0 +1,3047 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +// +// This file should stay in sync with the CPP project file +// "notepad-plus-plus/scintilla/include/Scintilla.iface" +// found at +// https://github.com/notepad-plus-plus/notepad-plus-plus/blob/master/scintilla/include/Scintilla.iface + +using System; +using System.Runtime.InteropServices; + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + /// + /// 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. + /// + [StructLayout(LayoutKind.Sequential)] + public struct ScNotificationHeader + { + /// + /// environment specific window handle/pointer + /// + public IntPtr hwndFrom; + + /// + /// CtrlID of the window issuing the notification + /// + public IntPtr IdFrom; + + /// + /// The SCN_* notification Code + /// + public uint Code; + } + + [StructLayout(LayoutKind.Sequential)] + public struct ScNotification + { + public ScNotificationHeader Header; + private int position; /* SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_MARGINCLICK, SCN_NEEDSHOWN, SCN_DWELLSTART, SCN_DWELLEND, SCN_CALLTIPCLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK, SCN_HOTSPOTRELEASECLICK, SCN_INDICATORCLICK, SCN_INDICATORRELEASE, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION */ + public int character; /* SCN_CHARADDED, SCN_KEY, SCN_AUTOCCOMPLETE, SCN_AUTOCSELECTION, SCN_USERLISTSELECTION */ + public int Mmodifiers; /* SCN_KEY, SCN_DOUBLECLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK, SCN_HOTSPOTRELEASECLICK, SCN_INDICATORCLICK, SCN_INDICATORRELEASE */ + public int ModificationType; /* SCN_MODIFIED - modification types are name "SC_MOD_*" */ + public IntPtr TextPointer; /* SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION, SCN_URIDROPPED */ + public int Length; /* SCN_MODIFIED */ + public int LinesAdded; /* SCN_MODIFIED */ + public int Message; /* SCN_MACRORECORD */ + public IntPtr wParam; /* SCN_MACRORECORD */ + public IntPtr lParam; /* SCN_MACRORECORD */ + + /// + /// 0-based index + /// + public int LineNumber; /* SCN_MODIFIED */ + public int FoldLevelNow; /* SCN_MODIFIED */ + public int FoldLevelPrev; /* SCN_MODIFIED */ + public int Margin; /* SCN_MARGINCLICK */ + public int ListType; /* SCN_USERLISTSELECTION */ + public int X; /* SCN_DWELLSTART, SCN_DWELLEND */ + public int Y; /* SCN_DWELLSTART, SCN_DWELLEND */ + public int Token; /* SCN_MODIFIED with SC_MOD_CONTAINER */ + public int AnnotationLinesAdded; /* SC_MOD_CHANGEANNOTATION */ + public int Updated; /* SCN_UPDATEUI */ + public int ListCompletionMethod; /* SCN_AUTOCSELECTION, SCN_AUTOCCOMPLETED, SCN_USERLISTSELECTION */ + + /// + /// SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_MARGINCLICK, SCN_NEEDSHOWN, SCN_DWELLSTART, SCN_DWELLEND, SCN_CALLTIPCLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK, SCN_HOTSPOTRELEASECLICK, SCN_INDICATORCLICK, SCN_INDICATORRELEASE, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION + /// + public Position Position { get { return new Position(position); } } + + /// + /// Character of the notification - eg keydown + /// SCN_CHARADDED, SCN_KEY, SCN_AUTOCCOMPLETE, SCN_AUTOCSELECTION, SCN_USERLISTSELECTION + /// + public char Character { get { return (char) character; } } + } + + [Flags] + public enum SciMsg : uint + { + /* ++Autogenerated -- start of section automatically generated from Scintilla.iface */ + INVALID_POSITION = 0xFFFFFFFF, + + SCI_START = 2000, + + SCI_OPTIONAL_START = 3000, + + SCI_LEXER_START = 4000, + + /// Add text to the document at current position. + SCI_ADDTEXT = 2001, + + /// Add array of cells to document. + SCI_ADDSTYLEDTEXT = 2002, + + /// Insert string at a position. + SCI_INSERTTEXT = 2003, + + /// Change the text that is being inserted in response to SC_MOD_INSERTCHECK + SCI_CHANGEINSERTION = 2672, + + /// Delete all text in the document. + SCI_CLEARALL = 2004, + + /// Delete a range of text in the document. + SCI_DELETERANGE = 2645, + + /// Set all style bytes to 0, remove all folding information. + SCI_CLEARDOCUMENTSTYLE = 2005, + + /// Returns the number of bytes in the document. + SCI_GETLENGTH = 2006, + + /// Returns the character byte at the position. + SCI_GETCHARAT = 2007, + + /// Returns the position of the caret. + SCI_GETCURRENTPOS = 2008, + + /// Returns the position of the opposite end of the selection to the caret. + SCI_GETANCHOR = 2009, + + /// Returns the style byte at the position. + SCI_GETSTYLEAT = 2010, + + /// Redoes the next action on the undo history. + SCI_REDO = 2011, + + /// Choose between collecting actions into the undo + /// history and discarding them. + SCI_SETUNDOCOLLECTION = 2012, + + /// Select all the text in the document. + SCI_SELECTALL = 2013, + + /// Remember the current position in the undo history as the position + /// at which the document was saved. + SCI_SETSAVEPOINT = 2014, + + /// Retrieve a buffer of cells. + /// Returns the number of bytes in the buffer not including terminating NULs. + SCI_GETSTYLEDTEXT = 2015, + + /// Are there any redoable actions in the undo history? + SCI_CANREDO = 2016, + + /// Retrieve the line number at which a particular marker is located. + SCI_MARKERLINEFROMHANDLE = 2017, + + /// Delete a marker. + SCI_MARKERDELETEHANDLE = 2018, + + /// Is undo history being collected? + SCI_GETUNDOCOLLECTION = 2019, + + SCWS_INVISIBLE = 0, + + SCWS_VISIBLEALWAYS = 1, + + SCWS_VISIBLEAFTERINDENT = 2, + + /// Are white space characters currently visible? + /// Returns one of SCWS_* constants. + SCI_GETVIEWWS = 2020, + + /// Make white space characters invisible, always visible or visible outside indentation. + SCI_SETVIEWWS = 2021, + + /// Find the position from a point within the window. + SCI_POSITIONFROMPOINT = 2022, + + /// Find the position from a point within the window but return + /// INVALID_POSITION if not close to text. + SCI_POSITIONFROMPOINTCLOSE = 2023, + + /// Set caret to start of a line and ensure it is visible. + SCI_GOTOLINE = 2024, + + /// Set caret to a position and ensure it is visible. + SCI_GOTOPOS = 2025, + + /// Set the selection anchor to a position. The anchor is the opposite + /// end of the selection from the caret. + SCI_SETANCHOR = 2026, + + /// Retrieve the text of the line containing the caret. + /// Returns the index of the caret on the line. + /// Result is NUL-terminated. + SCI_GETCURLINE = 2027, + + /// Retrieve the position of the last correctly styled character. + SCI_GETENDSTYLED = 2028, + + SC_EOL_CRLF = 0, + + SC_EOL_CR = 1, + + SC_EOL_LF = 2, + + /// Convert all line endings in the document to one mode. + SCI_CONVERTEOLS = 2029, + + /// Retrieve the current end of line mode - one of CRLF, CR, or LF. + SCI_GETEOLMODE = 2030, + + /// Set the current end of line mode. + SCI_SETEOLMODE = 2031, + + /// 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. + SCI_STARTSTYLING = 2032, + + /// Change style from current styling position for length characters to a style + /// and move the current styling position to after this newly styled segment. + SCI_SETSTYLING = 2033, + + /// Is drawing done first into a buffer or direct to the screen? + SCI_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. + SCI_SETBUFFEREDDRAW = 2035, + + /// Change the visible size of a tab to be a multiple of the width of a space character. + SCI_SETTABWIDTH = 2036, + + /// Retrieve the visible size of a tab. + SCI_GETTABWIDTH = 2121, + + /// Clear explicit tabstops on a line. + SCI_CLEARTABSTOPS = 2675, + + /// Add an explicit tab stop for a line. + SCI_ADDTABSTOP = 2676, + + /// Find the next explicit tab stop position on a line after a position. + SCI_GETNEXTTABSTOP = 2677, + + SC_CP_UTF8 = 65001, + + /// 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. + SCI_SETCODEPAGE = 2037, + + SC_IME_WINDOWED = 0, + + SC_IME_INLINE = 1, + + /// Is the IME displayed in a winow or inline? + SCI_GETIMEINTERACTION = 2678, + + /// Choose to display the the IME in a winow or inline. + SCI_SETIMEINTERACTION = 2679, + + MARKER_MAX = 31, + + SC_MARK_CIRCLE = 0, + + SC_MARK_ROUNDRECT = 1, + + SC_MARK_ARROW = 2, + + SC_MARK_SMALLRECT = 3, + + SC_MARK_SHORTARROW = 4, + + SC_MARK_EMPTY = 5, + + SC_MARK_ARROWDOWN = 6, + + SC_MARK_MINUS = 7, + + SC_MARK_PLUS = 8, + + SC_MARK_VLINE = 9, + + SC_MARK_LCORNER = 10, + + SC_MARK_TCORNER = 11, + + SC_MARK_BOXPLUS = 12, + + SC_MARK_BOXPLUSCONNECTED = 13, + + SC_MARK_BOXMINUS = 14, + + SC_MARK_BOXMINUSCONNECTED = 15, + + SC_MARK_LCORNERCURVE = 16, + + SC_MARK_TCORNERCURVE = 17, + + SC_MARK_CIRCLEPLUS = 18, + + SC_MARK_CIRCLEPLUSCONNECTED = 19, + + SC_MARK_CIRCLEMINUS = 20, + + SC_MARK_CIRCLEMINUSCONNECTED = 21, + + SC_MARK_BACKGROUND = 22, + + SC_MARK_DOTDOTDOT = 23, + + SC_MARK_ARROWS = 24, + + SC_MARK_PIXMAP = 25, + + SC_MARK_FULLRECT = 26, + + SC_MARK_LEFTRECT = 27, + + SC_MARK_AVAILABLE = 28, + + SC_MARK_UNDERLINE = 29, + + SC_MARK_RGBAIMAGE = 30, + + SC_MARK_BOOKMARK = 31, + + SC_MARK_CHARACTER = 10000, + + SC_MARKNUM_FOLDEREND = 25, + + SC_MARKNUM_FOLDEROPENMID = 26, + + SC_MARKNUM_FOLDERMIDTAIL = 27, + + SC_MARKNUM_FOLDERTAIL = 28, + + SC_MARKNUM_FOLDERSUB = 29, + + SC_MARKNUM_FOLDER = 30, + + SC_MARKNUM_FOLDEROPEN = 31, + + SC_MASK_FOLDERS = 0xFE000000, + + /// Set the symbol used for a particular marker number. + SCI_MARKERDEFINE = 2040, + + /// Set the foreground colour used for a particular marker number. + SCI_MARKERSETFORE = 2041, + + /// Set the background colour used for a particular marker number. + SCI_MARKERSETBACK = 2042, + + /// Set the background colour used for a particular marker number when its folding block is selected. + SCI_MARKERSETBACKSELECTED = 2292, + + /// Enable/disable highlight for current folding bloc (smallest one that contains the caret) + SCI_MARKERENABLEHIGHLIGHT = 2293, + + /// Add a marker to a line, returning an ID which can be used to find or delete the marker. + SCI_MARKERADD = 2043, + + /// Delete a marker from a line. + SCI_MARKERDELETE = 2044, + + /// Delete all markers with a particular number from all lines. + SCI_MARKERDELETEALL = 2045, + + /// Get a bit mask of all the markers set on a line. + SCI_MARKERGET = 2046, + + /// Find the next line at or after lineStart that includes a marker in mask. + /// Return -1 when no more lines. + SCI_MARKERNEXT = 2047, + + /// Find the previous line before lineStart that includes a marker in mask. + SCI_MARKERPREVIOUS = 2048, + + /// Define a marker from a pixmap. + SCI_MARKERDEFINEPIXMAP = 2049, + + /// Add a set of markers to a line. + SCI_MARKERADDSET = 2466, + + /// Set the alpha used for a marker that is drawn in the text area, not the margin. + SCI_MARKERSETALPHA = 2476, + + SC_MAX_MARGIN = 4, + + SC_MARGIN_SYMBOL = 0, + + SC_MARGIN_NUMBER = 1, + + SC_MARGIN_BACK = 2, + + SC_MARGIN_FORE = 3, + + SC_MARGIN_TEXT = 4, + + SC_MARGIN_RTEXT = 5, + + /// Set a margin to be either numeric or symbolic. + SCI_SETMARGINTYPEN = 2240, + + /// Retrieve the type of a margin. + SCI_GETMARGINTYPEN = 2241, + + /// Set the width of a margin to a width expressed in pixels. + SCI_SETMARGINWIDTHN = 2242, + + /// Retrieve the width of a margin in pixels. + SCI_GETMARGINWIDTHN = 2243, + + /// Set a mask that determines which markers are displayed in a margin. + SCI_SETMARGINMASKN = 2244, + + /// Retrieve the marker mask of a margin. + SCI_GETMARGINMASKN = 2245, + + /// Make a margin sensitive or insensitive to mouse clicks. + SCI_SETMARGINSENSITIVEN = 2246, + + /// Retrieve the mouse click sensitivity of a margin. + SCI_GETMARGINSENSITIVEN = 2247, + + /// Set the cursor shown when the mouse is inside a margin. + SCI_SETMARGINCURSORN = 2248, + + /// Retrieve the cursor shown in a margin. + SCI_GETMARGINCURSORN = 2249, + + STYLE_DEFAULT = 32, + + STYLE_LINENUMBER = 33, + + STYLE_BRACELIGHT = 34, + + STYLE_BRACEBAD = 35, + + STYLE_CONTROLCHAR = 36, + + STYLE_INDENTGUIDE = 37, + + STYLE_CALLTIP = 38, + + STYLE_LASTPREDEFINED = 39, + + STYLE_MAX = 255, + + SC_CHARSET_ANSI = 0, + + SC_CHARSET_DEFAULT = 1, + + SC_CHARSET_BALTIC = 186, + + SC_CHARSET_CHINESEBIG5 = 136, + + SC_CHARSET_EASTEUROPE = 238, + + SC_CHARSET_GB2312 = 134, + + SC_CHARSET_GREEK = 161, + + SC_CHARSET_HANGUL = 129, + + SC_CHARSET_MAC = 77, + + SC_CHARSET_OEM = 255, + + SC_CHARSET_RUSSIAN = 204, + + SC_CHARSET_CYRILLIC = 1251, + + SC_CHARSET_SHIFTJIS = 128, + + SC_CHARSET_SYMBOL = 2, + + SC_CHARSET_TURKISH = 162, + + SC_CHARSET_JOHAB = 130, + + SC_CHARSET_HEBREW = 177, + + SC_CHARSET_ARABIC = 178, + + SC_CHARSET_VIETNAMESE = 163, + + SC_CHARSET_THAI = 222, + + SC_CHARSET_8859_15 = 1000, + + /// Clear all the styles and make equivalent to the global default style. + SCI_STYLECLEARALL = 2050, + + /// Set the foreground colour of a style. + SCI_STYLESETFORE = 2051, + + /// Set the background colour of a style. + SCI_STYLESETBACK = 2052, + + /// Set a style to be bold or not. + SCI_STYLESETBOLD = 2053, + + /// Set a style to be italic or not. + SCI_STYLESETITALIC = 2054, + + /// Set the size of characters of a style. + SCI_STYLESETSIZE = 2055, + + /// Set the font of a style. + SCI_STYLESETFONT = 2056, + + /// Set a style to have its end of line filled or not. + SCI_STYLESETEOLFILLED = 2057, + + /// Reset the default style to its state at startup + SCI_STYLERESETDEFAULT = 2058, + + /// Set a style to be underlined or not. + SCI_STYLESETUNDERLINE = 2059, + + SC_CASE_MIXED = 0, + + SC_CASE_UPPER = 1, + + SC_CASE_LOWER = 2, + + /// Get the foreground colour of a style. + SCI_STYLEGETFORE = 2481, + + /// Get the background colour of a style. + SCI_STYLEGETBACK = 2482, + + /// Get is a style bold or not. + SCI_STYLEGETBOLD = 2483, + + /// Get is a style italic or not. + SCI_STYLEGETITALIC = 2484, + + /// Get the size of characters of a style. + SCI_STYLEGETSIZE = 2485, + + /// Get the font of a style. + /// Returns the length of the fontName + /// Result is NUL-terminated. + SCI_STYLEGETFONT = 2486, + + /// Get is a style to have its end of line filled or not. + SCI_STYLEGETEOLFILLED = 2487, + + /// Get is a style underlined or not. + SCI_STYLEGETUNDERLINE = 2488, + + /// Get is a style mixed case, or to force upper or lower case. + SCI_STYLEGETCASE = 2489, + + /// Get the character get of the font in a style. + SCI_STYLEGETCHARACTERSET = 2490, + + /// Get is a style visible or not. + SCI_STYLEGETVISIBLE = 2491, + + /// Get is a style changeable or not (read only). + /// Experimental feature, currently buggy. + SCI_STYLEGETCHANGEABLE = 2492, + + /// Get is a style a hotspot or not. + SCI_STYLEGETHOTSPOT = 2493, + + /// Set a style to be mixed case, or to force upper or lower case. + SCI_STYLESETCASE = 2060, + + SC_FONT_SIZE_MULTIPLIER = 100, + + /// Set the size of characters of a style. Size is in points multiplied by 100. + SCI_STYLESETSIZEFRACTIONAL = 2061, + + /// Get the size of characters of a style in points multiplied by 100 + SCI_STYLEGETSIZEFRACTIONAL = 2062, + + SC_WEIGHT_NORMAL = 400, + + SC_WEIGHT_SEMIBOLD = 600, + + SC_WEIGHT_BOLD = 700, + + /// Set the weight of characters of a style. + SCI_STYLESETWEIGHT = 2063, + + /// Get the weight of characters of a style. + SCI_STYLEGETWEIGHT = 2064, + + /// Set the character set of the font in a style. + SCI_STYLESETCHARACTERSET = 2066, + + /// Set a style to be a hotspot or not. + SCI_STYLESETHOTSPOT = 2409, + + /// Set the foreground colour of the main and additional selections and whether to use this setting. + SCI_SETSELFORE = 2067, + + /// Set the background colour of the main and additional selections and whether to use this setting. + SCI_SETSELBACK = 2068, + + /// Get the alpha of the selection. + SCI_GETSELALPHA = 2477, + + /// Set the alpha of the selection. + SCI_SETSELALPHA = 2478, + + /// Is the selection end of line filled? + SCI_GETSELEOLFILLED = 2479, + + /// Set the selection to have its end of line filled or not. + SCI_SETSELEOLFILLED = 2480, + + /// Set the foreground colour of the caret. + SCI_SETCARETFORE = 2069, + + /// When key+modifier combination km is pressed perform msg. + SCI_ASSIGNCMDKEY = 2070, + + /// When key+modifier combination km is pressed do nothing. + SCI_CLEARCMDKEY = 2071, + + /// Drop all key mappings. + SCI_CLEARALLCMDKEYS = 2072, + + /// Set the styles for a segment of the document. + SCI_SETSTYLINGEX = 2073, + + /// Set a style to be visible or not. + SCI_STYLESETVISIBLE = 2074, + + /// Get the time in milliseconds that the caret is on and off. + SCI_GETCARETPERIOD = 2075, + + /// Get the time in milliseconds that the caret is on and off. 0 = steady on. + SCI_SETCARETPERIOD = 2076, + + /// Set the set of characters making up words for when moving or selecting by word. + /// First sets defaults like SetCharsDefault. + SCI_SETWORDCHARS = 2077, + + /// Get the set of characters making up words for when moving or selecting by word. + /// Returns the number of characters + SCI_GETWORDCHARS = 2646, + + /// Start a sequence of actions that is undone and redone as a unit. + /// May be nested. + SCI_BEGINUNDOACTION = 2078, + + /// End a sequence of actions that is undone and redone as a unit. + SCI_ENDUNDOACTION = 2079, + + INDIC_PLAIN = 0, + + INDIC_SQUIGGLE = 1, + + INDIC_TT = 2, + + INDIC_DIAGONAL = 3, + + INDIC_STRIKE = 4, + + INDIC_HIDDEN = 5, + + INDIC_BOX = 6, + + INDIC_ROUNDBOX = 7, + + INDIC_STRAIGHTBOX = 8, + + INDIC_DASH = 9, + + INDIC_DOTS = 10, + + INDIC_SQUIGGLELOW = 11, + + INDIC_DOTBOX = 12, + + INDIC_SQUIGGLEPIXMAP = 13, + + INDIC_COMPOSITIONTHICK = 14, + + INDIC_COMPOSITIONTHIN = 15, + + INDIC_FULLBOX = 16, + + INDIC_TEXTFORE = 17, + + INDIC_IME = 32, + + INDIC_IME_MAX = 35, + + INDIC_MAX = 35, + + INDIC_CONTAINER = 8, + + INDIC0_MASK = 0x20, + + INDIC1_MASK = 0x40, + + INDIC2_MASK = 0x80, + + INDICS_MASK = 0xE0, + + /// Set an indicator to plain, squiggle or TT. + SCI_INDICSETSTYLE = 2080, + + /// Retrieve the style of an indicator. + SCI_INDICGETSTYLE = 2081, + + /// Set the foreground colour of an indicator. + SCI_INDICSETFORE = 2082, + + /// Retrieve the foreground colour of an indicator. + SCI_INDICGETFORE = 2083, + + /// Set an indicator to draw under text or over(default). + SCI_INDICSETUNDER = 2510, + + /// Retrieve whether indicator drawn under or over text. + SCI_INDICGETUNDER = 2511, + + /// Set a hover indicator to plain, squiggle or TT. + SCI_INDICSETHOVERSTYLE = 2680, + + /// Retrieve the hover style of an indicator. + SCI_INDICGETHOVERSTYLE = 2681, + + /// Set the foreground hover colour of an indicator. + SCI_INDICSETHOVERFORE = 2682, + + /// Retrieve the foreground hover colour of an indicator. + SCI_INDICGETHOVERFORE = 2683, + + SC_INDICVALUEBIT = 0x1000000, + + SC_INDICVALUEMASK = 0xFFFFFF, + + SC_INDICFLAG_VALUEFORE = 1, + + /// Set the attributes of an indicator. + SCI_INDICSETFLAGS = 2684, + + /// Retrieve the attributes of an indicator. + SCI_INDICGETFLAGS = 2685, + + /// Set the foreground colour of all whitespace and whether to use this setting. + SCI_SETWHITESPACEFORE = 2084, + + /// Set the background colour of all whitespace and whether to use this setting. + SCI_SETWHITESPACEBACK = 2085, + + /// Set the size of the dots used to mark space characters. + SCI_SETWHITESPACESIZE = 2086, + + /// Get the size of the dots used to mark space characters. + SCI_GETWHITESPACESIZE = 2087, + + /// 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. + SCI_SETSTYLEBITS = 2090, + + /// Retrieve number of bits in style bytes used to hold the lexical state. + SCI_GETSTYLEBITS = 2091, + + /// Used to hold extra styling information for each line. + SCI_SETLINESTATE = 2092, + + /// Retrieve the extra styling information for a line. + SCI_GETLINESTATE = 2093, + + /// Retrieve the last line number that has line state. + SCI_GETMAXLINESTATE = 2094, + + /// Is the background of the line containing the caret in a different colour? + SCI_GETCARETLINEVISIBLE = 2095, + + /// Display the background of the line containing the caret in a different colour. + SCI_SETCARETLINEVISIBLE = 2096, + + /// Get the colour of the background of the line containing the caret. + SCI_GETCARETLINEBACK = 2097, + + /// Set the colour of the background of the line containing the caret. + SCI_SETCARETLINEBACK = 2098, + + /// Set a style to be changeable or not (read only). + /// Experimental feature, currently buggy. + SCI_STYLESETCHANGEABLE = 2099, + + /// Display a auto-completion list. + /// The lenEntered parameter indicates how many characters before + /// the caret should be used to provide context. + SCI_AUTOCSHOW = 2100, + + /// Remove the auto-completion list from the screen. + SCI_AUTOCCANCEL = 2101, + + /// Is there an auto-completion list visible? + SCI_AUTOCACTIVE = 2102, + + /// Retrieve the position of the caret when the auto-completion list was displayed. + SCI_AUTOCPOSSTART = 2103, + + /// User has selected an item so remove the list and insert the selection. + SCI_AUTOCCOMPLETE = 2104, + + /// Define a set of character that when typed cancel the auto-completion list. + SCI_AUTOCSTOPS = 2105, + + /// Change the separator character in the string setting up an auto-completion list. + /// Default is space but can be changed if items contain space. + SCI_AUTOCSETSEPARATOR = 2106, + + /// Retrieve the auto-completion list separator character. + SCI_AUTOCGETSEPARATOR = 2107, + + /// Select the item in the auto-completion list that starts with a string. + SCI_AUTOCSELECT = 2108, + + /// Should the auto-completion list be cancelled if the user backspaces to a + /// position before where the box was created. + SCI_AUTOCSETCANCELATSTART = 2110, + + /// Retrieve whether auto-completion cancelled by backspacing before start. + SCI_AUTOCGETCANCELATSTART = 2111, + + /// Define a set of characters that when typed will cause the autocompletion to + /// choose the selected item. + SCI_AUTOCSETFILLUPS = 2112, + + /// Should a single item auto-completion list automatically choose the item. + SCI_AUTOCSETCHOOSESINGLE = 2113, + + /// Retrieve whether a single item auto-completion list automatically choose the item. + SCI_AUTOCGETCHOOSESINGLE = 2114, + + /// Set whether case is significant when performing auto-completion searches. + SCI_AUTOCSETIGNORECASE = 2115, + + /// Retrieve state of ignore case flag. + SCI_AUTOCGETIGNORECASE = 2116, + + /// Display a list of strings and send notification when user chooses one. + SCI_USERLISTSHOW = 2117, + + /// Set whether or not autocompletion is hidden automatically when nothing matches. + SCI_AUTOCSETAUTOHIDE = 2118, + + /// Retrieve whether or not autocompletion is hidden automatically when nothing matches. + SCI_AUTOCGETAUTOHIDE = 2119, + + /// Set whether or not autocompletion deletes any word characters + /// after the inserted text upon completion. + SCI_AUTOCSETDROPRESTOFWORD = 2270, + + /// Retrieve whether or not autocompletion deletes any word characters + /// after the inserted text upon completion. + SCI_AUTOCGETDROPRESTOFWORD = 2271, + + /// Register an XPM image for use in autocompletion lists. + SCI_REGISTERIMAGE = 2405, + + /// Clear all the registered XPM images. + SCI_CLEARREGISTEREDIMAGES = 2408, + + /// Retrieve the auto-completion list type-separator character. + SCI_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 '?'. + SCI_AUTOCSETTYPESEPARATOR = 2286, + + /// 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. + SCI_AUTOCSETMAXWIDTH = 2208, + + /// Get the maximum width, in characters, of auto-completion and user lists. + SCI_AUTOCGETMAXWIDTH = 2209, + + /// Set the maximum height, in rows, of auto-completion and user lists. + /// The default is 5 rows. + SCI_AUTOCSETMAXHEIGHT = 2210, + + /// Set the maximum height, in rows, of auto-completion and user lists. + SCI_AUTOCGETMAXHEIGHT = 2211, + + /// Set the number of spaces used for one level of indentation. + SCI_SETINDENT = 2122, + + /// Retrieve indentation size. + SCI_GETINDENT = 2123, + + /// Indentation will only use space characters if useTabs is false, otherwise + /// it will use a combination of tabs and spaces. + SCI_SETUSETABS = 2124, + + /// Retrieve whether tabs will be used in indentation. + SCI_GETUSETABS = 2125, + + /// Change the indentation of a line to a number of columns. + SCI_SETLINEINDENTATION = 2126, + + /// Retrieve the number of columns that a line is indented. + SCI_GETLINEINDENTATION = 2127, + + /// Retrieve the position before the first non indentation character on a line. + SCI_GETLINEINDENTPOSITION = 2128, + + /// Retrieve the column number of a position, taking tab width into account. + SCI_GETCOLUMN = 2129, + + /// Count characters between two positions. + SCI_COUNTCHARACTERS = 2633, + + /// Show or hide the horizontal scroll bar. + SCI_SETHSCROLLBAR = 2130, + + /// Is the horizontal scroll bar visible? + SCI_GETHSCROLLBAR = 2131, + + SC_IV_NONE = 0, + + SC_IV_REAL = 1, + + SC_IV_LOOKFORWARD = 2, + + SC_IV_LOOKBOTH = 3, + + /// Show or hide indentation guides. + SCI_SETINDENTATIONGUIDES = 2132, + + /// Are the indentation guides visible? + SCI_GETINDENTATIONGUIDES = 2133, + + /// Set the highlighted indentation guide column. + /// 0 = no highlighted guide. + SCI_SETHIGHLIGHTGUIDE = 2134, + + /// Get the highlighted indentation guide column. + SCI_GETHIGHLIGHTGUIDE = 2135, + + /// Get the position after the last visible characters on a line. + SCI_GETLINEENDPOSITION = 2136, + + /// Get the code page used to interpret the bytes of the document as characters. + SCI_GETCODEPAGE = 2137, + + /// Get the foreground colour of the caret. + SCI_GETCARETFORE = 2138, + + /// In read-only mode? + SCI_GETREADONLY = 2140, + + /// Sets the position of the caret. + SCI_SETCURRENTPOS = 2141, + + /// Sets the position that starts the selection - this becomes the anchor. + SCI_SETSELECTIONSTART = 2142, + + /// Returns the position at the start of the selection. + SCI_GETSELECTIONSTART = 2143, + + /// Sets the position that ends the selection - this becomes the currentPosition. + SCI_SETSELECTIONEND = 2144, + + /// Returns the position at the end of the selection. + SCI_GETSELECTIONEND = 2145, + + /// Set caret to a position, while removing any existing selection. + SCI_SETEMPTYSELECTION = 2556, + + /// Sets the print magnification added to the point size of each style for printing. + SCI_SETPRINTMAGNIFICATION = 2146, + + /// Returns the print magnification. + SCI_GETPRINTMAGNIFICATION = 2147, + + SC_PRINT_NORMAL = 0, + + SC_PRINT_INVERTLIGHT = 1, + + SC_PRINT_BLACKONWHITE = 2, + + SC_PRINT_COLOURONWHITE = 3, + + SC_PRINT_COLOURONWHITEDEFAULTBG = 4, + + /// Modify colours when printing for clearer printed text. + SCI_SETPRINTCOLOURMODE = 2148, + + /// Returns the print colour mode. + SCI_GETPRINTCOLOURMODE = 2149, + + SCFIND_WHOLEWORD = 0x2, + + SCFIND_MATCHCASE = 0x4, + + SCFIND_WORDSTART = 0x00100000, + + SCFIND_REGEXP = 0x00200000, + + SCFIND_POSIX = 0x00400000, + + SCFIND_CXX11REGEX = 0x00800000, + + /// Find some text in the document. + SCI_FINDTEXT = 2150, + + /// On Windows, will draw the document into a display context such as a printer. + SCI_FORMATRANGE = 2151, + + /// Retrieve the display line at the top of the display. + SCI_GETFIRSTVISIBLELINE = 2152, + + /// Retrieve the contents of a line. + /// Returns the length of the line. + SCI_GETLINE = 2153, + + /// Returns the number of lines in the document. There is always at least one. + SCI_GETLINECOUNT = 2154, + + /// Sets the size in pixels of the left margin. + SCI_SETMARGINLEFT = 2155, + + /// Returns the size in pixels of the left margin. + SCI_GETMARGINLEFT = 2156, + + /// Sets the size in pixels of the right margin. + SCI_SETMARGINRIGHT = 2157, + + /// Returns the size in pixels of the right margin. + SCI_GETMARGINRIGHT = 2158, + + /// Is the document different from when it was last saved? + SCI_GETMODIFY = 2159, + + /// Select a range of text. + SCI_SETSEL = 2160, + + /// Retrieve the selected text. + /// Return the length of the text. + /// Result is NUL-terminated. + SCI_GETSELTEXT = 2161, + + /// Retrieve a range of text. + /// Return the length of the text. + SCI_GETTEXTRANGE = 2162, + + /// Draw the selection in normal style or with selection highlighted. + SCI_HIDESELECTION = 2163, + + /// Retrieve the x value of the point in the window where a position is displayed. + SCI_POINTXFROMPOSITION = 2164, + + /// Retrieve the y value of the point in the window where a position is displayed. + SCI_POINTYFROMPOSITION = 2165, + + /// Retrieve the line containing a position. + SCI_LINEFROMPOSITION = 2166, + + /// Retrieve the position at the start of a line. + SCI_POSITIONFROMLINE = 2167, + + /// Scroll horizontally and vertically. + SCI_LINESCROLL = 2168, + + /// Ensure the caret is visible. + SCI_SCROLLCARET = 2169, + + /// Scroll the argument positions and the range between them into view giving + /// priority to the primary position then the secondary position. + /// This may be used to make a search match visible. + SCI_SCROLLRANGE = 2569, + + /// Replace the selected text with the argument text. + SCI_REPLACESEL = 2170, + + /// Set to read only or read write. + SCI_SETREADONLY = 2171, + + /// Null operation. + SCI_NULL = 2172, + + /// Will a paste succeed? + SCI_CANPASTE = 2173, + + /// Are there any undoable actions in the undo history? + SCI_CANUNDO = 2174, + + /// Delete the undo history. + SCI_EMPTYUNDOBUFFER = 2175, + + /// Undo one action in the undo history. + SCI_UNDO = 2176, + + /// Cut the selection to the clipboard. + SCI_CUT = 2177, + + /// Copy the selection to the clipboard. + SCI_COPY = 2178, + + /// Paste the contents of the clipboard into the document replacing the selection. + SCI_PASTE = 2179, + + /// Clear the selection. + SCI_CLEAR = 2180, + + /// Replace the contents of the document with the argument text. + SCI_SETTEXT = 2181, + + /// Retrieve all the text in the document. + /// Returns number of characters retrieved. + /// Result is NUL-terminated. + SCI_GETTEXT = 2182, + + /// Retrieve the number of characters in the document. + SCI_GETTEXTLENGTH = 2183, + + /// Retrieve a pointer to a function that processes messages for this Scintilla. + SCI_GETDIRECTFUNCTION = 2184, + + /// Retrieve a pointer value to use as the first argument when calling + /// the function returned by GetDirectFunction. + SCI_GETDIRECTPOINTER = 2185, + + /// Set to overtype (true) or insert mode. + SCI_SETOVERTYPE = 2186, + + /// Returns true if overtype mode is active otherwise false is returned. + SCI_GETOVERTYPE = 2187, + + /// Set the width of the insert mode caret. + SCI_SETCARETWIDTH = 2188, + + /// Returns the width of the insert mode caret. + SCI_GETCARETWIDTH = 2189, + + /// Sets the position that starts the target which is used for updating the + /// document without affecting the scroll position. + SCI_SETTARGETSTART = 2190, + + /// Get the position that starts the target. + SCI_GETTARGETSTART = 2191, + + /// Sets the position that ends the target which is used for updating the + /// document without affecting the scroll position. + SCI_SETTARGETEND = 2192, + + /// Get the position that ends the target. + SCI_GETTARGETEND = 2193, + + /// Sets both the start and end of the target in one call. + SCI_SETTARGETRANGE = 2686, + + /// Retrieve the text in the target. + SCI_GETTARGETTEXT = 2687, + + /// Replace the target text with the argument text. + /// Text is counted so it can contain NULs. + /// Returns the length of the replacement text. + SCI_REPLACETARGET = 2194, + + /// 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. + SCI_REPLACETARGETRE = 2195, + + /// 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. + SCI_SEARCHINTARGET = 2197, + + /// Set the search flags used by SearchInTarget. + SCI_SETSEARCHFLAGS = 2198, + + /// Get the search flags used by SearchInTarget. + SCI_GETSEARCHFLAGS = 2199, + + /// Show a call tip containing a definition near position pos. + SCI_CALLTIPSHOW = 2200, + + /// Remove the call tip from the screen. + SCI_CALLTIPCANCEL = 2201, + + /// Is there an active call tip? + SCI_CALLTIPACTIVE = 2202, + + /// Retrieve the position where the caret was before displaying the call tip. + SCI_CALLTIPPOSSTART = 2203, + + /// Set the start position in order to change when backspacing removes the calltip. + SCI_CALLTIPSETPOSSTART = 2214, + + /// Highlight a segment of the definition. + SCI_CALLTIPSETHLT = 2204, + + /// Set the background colour for the call tip. + SCI_CALLTIPSETBACK = 2205, + + /// Set the foreground colour for the call tip. + SCI_CALLTIPSETFORE = 2206, + + /// Set the foreground colour for the highlighted part of the call tip. + SCI_CALLTIPSETFOREHLT = 2207, + + /// Enable use of STYLE_CALLTIP and set call tip tab size in pixels. + SCI_CALLTIPUSESTYLE = 2212, + + /// Set position of calltip, above or below text. + SCI_CALLTIPSETPOSITION = 2213, + + /// Find the display line of a document line taking hidden lines into account. + SCI_VISIBLEFROMDOCLINE = 2220, + + /// Find the document line of a display line taking hidden lines into account. + SCI_DOCLINEFROMVISIBLE = 2221, + + /// The number of display lines needed to wrap a document line + SCI_WRAPCOUNT = 2235, + + SC_FOLDLEVELBASE = 0x400, + + SC_FOLDLEVELWHITEFLAG = 0x1000, + + SC_FOLDLEVELHEADERFLAG = 0x2000, + + 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. + SCI_SETFOLDLEVEL = 2222, + + /// Retrieve the fold level of a line. + SCI_GETFOLDLEVEL = 2223, + + /// Find the last child line of a header line. + SCI_GETLASTCHILD = 2224, + + /// Find the parent line of a child line. + SCI_GETFOLDPARENT = 2225, + + /// Make a range of lines visible. + SCI_SHOWLINES = 2226, + + /// Make a range of lines invisible. + SCI_HIDELINES = 2227, + + /// Is a line visible? + SCI_GETLINEVISIBLE = 2228, + + /// Are all lines visible? + SCI_GETALLLINESVISIBLE = 2236, + + /// Show the children of a header line. + SCI_SETFOLDEXPANDED = 2229, + + /// Is a header line expanded? + SCI_GETFOLDEXPANDED = 2230, + + /// Switch a header line between expanded and contracted. + SCI_TOGGLEFOLD = 2231, + + SC_FOLDACTION_CONTRACT = 0, + + SC_FOLDACTION_EXPAND = 1, + + SC_FOLDACTION_TOGGLE = 2, + + /// Expand or contract a fold header. + SCI_FOLDLINE = 2237, + + /// Expand or contract a fold header and its children. + SCI_FOLDCHILDREN = 2238, + + /// Expand a fold header and all children. Use the level argument instead of the line's current level. + SCI_EXPANDCHILDREN = 2239, + + /// Expand or contract all fold headers. + SCI_FOLDALL = 2662, + + /// Ensure a particular line is visible by expanding any header line hiding it. + SCI_ENSUREVISIBLE = 2232, + + SC_AUTOMATICFOLD_SHOW = 0x0001, + + SC_AUTOMATICFOLD_CLICK = 0x0002, + + SC_AUTOMATICFOLD_CHANGE = 0x0004, + + /// Set automatic folding behaviours. + SCI_SETAUTOMATICFOLD = 2663, + + /// Get automatic folding behaviours. + SCI_GETAUTOMATICFOLD = 2664, + + SC_FOLDFLAG_LINEBEFORE_EXPANDED = 0x0002, + + SC_FOLDFLAG_LINEBEFORE_CONTRACTED = 0x0004, + + SC_FOLDFLAG_LINEAFTER_EXPANDED = 0x0008, + + SC_FOLDFLAG_LINEAFTER_CONTRACTED = 0x0010, + + SC_FOLDFLAG_LEVELNUMBERS = 0x0040, + + SC_FOLDFLAG_LINESTATE = 0x0080, + + /// Set some style options for folding. + SCI_SETFOLDFLAGS = 2233, + + /// 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. + SCI_ENSUREVISIBLEENFORCEPOLICY = 2234, + + /// Sets whether a tab pressed when caret is within indentation indents. + SCI_SETTABINDENTS = 2260, + + /// Does a tab pressed when caret is within indentation indent? + SCI_GETTABINDENTS = 2261, + + /// Sets whether a backspace pressed when caret is within indentation unindents. + SCI_SETBACKSPACEUNINDENTS = 2262, + + /// Does a backspace pressed when caret is within indentation unindent? + SCI_GETBACKSPACEUNINDENTS = 2263, + + SC_TIME_FOREVER = 10000000, + + /// Sets the time the mouse must sit still to generate a mouse dwell event. + SCI_SETMOUSEDWELLTIME = 2264, + + /// Retrieve the time the mouse must sit still to generate a mouse dwell event. + SCI_GETMOUSEDWELLTIME = 2265, + + /// Get position of start of word. + SCI_WORDSTARTPOSITION = 2266, + + /// Get position of end of word. + SCI_WORDENDPOSITION = 2267, + + SC_WRAP_NONE = 0, + + SC_WRAP_WORD = 1, + + SC_WRAP_CHAR = 2, + + SC_WRAP_WHITESPACE = 3, + + /// Sets whether text is word wrapped. + SCI_SETWRAPMODE = 2268, + + /// Retrieve whether text is word wrapped. + SCI_GETWRAPMODE = 2269, + + SC_WRAPVISUALFLAG_NONE = 0x0000, + + SC_WRAPVISUALFLAG_END = 0x0001, + + SC_WRAPVISUALFLAG_START = 0x0002, + + SC_WRAPVISUALFLAG_MARGIN = 0x0004, + + /// Set the display mode of visual flags for wrapped lines. + SCI_SETWRAPVISUALFLAGS = 2460, + + /// Retrive the display mode of visual flags for wrapped lines. + SCI_GETWRAPVISUALFLAGS = 2461, + + SC_WRAPVISUALFLAGLOC_DEFAULT = 0x0000, + + SC_WRAPVISUALFLAGLOC_END_BY_TEXT = 0x0001, + + SC_WRAPVISUALFLAGLOC_START_BY_TEXT = 0x0002, + + /// Set the location of visual flags for wrapped lines. + SCI_SETWRAPVISUALFLAGSLOCATION = 2462, + + /// Retrive the location of visual flags for wrapped lines. + SCI_GETWRAPVISUALFLAGSLOCATION = 2463, + + /// Set the start indent for wrapped lines. + SCI_SETWRAPSTARTINDENT = 2464, + + /// Retrive the start indent for wrapped lines. + SCI_GETWRAPSTARTINDENT = 2465, + + SC_WRAPINDENT_FIXED = 0, + + SC_WRAPINDENT_SAME = 1, + + SC_WRAPINDENT_INDENT = 2, + + /// Sets how wrapped sublines are placed. Default is fixed. + SCI_SETWRAPINDENTMODE = 2472, + + /// Retrieve how wrapped sublines are placed. Default is fixed. + SCI_GETWRAPINDENTMODE = 2473, + + SC_CACHE_NONE = 0, + + SC_CACHE_CARET = 1, + + SC_CACHE_PAGE = 2, + + SC_CACHE_DOCUMENT = 3, + + /// Sets the degree of caching of layout information. + SCI_SETLAYOUTCACHE = 2272, + + /// Retrieve the degree of caching of layout information. + SCI_GETLAYOUTCACHE = 2273, + + /// Sets the document width assumed for scrolling. + SCI_SETSCROLLWIDTH = 2274, + + /// Retrieve the document width assumed for scrolling. + SCI_GETSCROLLWIDTH = 2275, + + /// Sets whether the maximum width line displayed is used to set scroll width. + SCI_SETSCROLLWIDTHTRACKING = 2516, + + /// Retrieve whether the scroll width tracks wide lines. + SCI_GETSCROLLWIDTHTRACKING = 2517, + + /// Measure the pixel width of some text in a particular style. + /// NUL terminated text argument. + /// Does not handle tab or control characters. + SCI_TEXTWIDTH = 2276, + + /// 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. + SCI_SETENDATLASTLINE = 2277, + + /// Retrieve whether the maximum scroll position has the last + /// line at the bottom of the view. + SCI_GETENDATLASTLINE = 2278, + + /// Retrieve the height of a particular line of text in pixels. + SCI_TEXTHEIGHT = 2279, + + /// Show or hide the vertical scroll bar. + SCI_SETVSCROLLBAR = 2280, + + /// Is the vertical scroll bar visible? + SCI_GETVSCROLLBAR = 2281, + + /// Append a string to the end of the document without changing the selection. + SCI_APPENDTEXT = 2282, + + /// Is drawing done in two phases with backgrounds drawn before foregrounds? + SCI_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. + SCI_SETTWOPHASEDRAW = 2284, + + SC_PHASES_ONE = 0, + + SC_PHASES_TWO = 1, + + SC_PHASES_MULTIPLE = 2, + + /// How many phases is drawing done in? + SCI_GETPHASESDRAW = 2673, + + /// In one phase draw, text is drawn in a series of rectangular blocks with no overlap. + /// In two phase draw, text is drawn in a series of lines allowing runs to overlap horizontally. + /// In multiple phase draw, each element is drawn over the whole drawing area, allowing text + /// to overlap from one line to the next. + SCI_SETPHASESDRAW = 2674, + + SC_EFF_QUALITY_MASK = 0xF, + + SC_EFF_QUALITY_DEFAULT = 0, + + SC_EFF_QUALITY_NON_ANTIALIASED = 1, + + SC_EFF_QUALITY_ANTIALIASED = 2, + + SC_EFF_QUALITY_LCD_OPTIMIZED = 3, + + /// Choose the quality level for text from the FontQuality enumeration. + SCI_SETFONTQUALITY = 2611, + + /// Retrieve the quality level for text. + SCI_GETFONTQUALITY = 2612, + + /// Scroll so that a display line is at the top of the display. + SCI_SETFIRSTVISIBLELINE = 2613, + + SC_MULTIPASTE_ONCE = 0, + + SC_MULTIPASTE_EACH = 1, + + /// Change the effect of pasting when there are multiple selections. + SCI_SETMULTIPASTE = 2614, + + /// Retrieve the effect of pasting when there are multiple selections.. + SCI_GETMULTIPASTE = 2615, + + /// Retrieve the value of a tag from a regular expression search. + /// Result is NUL-terminated. + SCI_GETTAG = 2616, + + /// Make the target range start and end be the same as the selection range start and end. + SCI_TARGETFROMSELECTION = 2287, + + /// Join the lines in the target. + SCI_LINESJOIN = 2288, + + /// Split the lines in the target into lines that are less wide than pixelWidth + /// where possible. + SCI_LINESSPLIT = 2289, + + /// Set the colours used as a chequerboard pattern in the fold margin + SCI_SETFOLDMARGINCOLOUR = 2290, + + /// Set the colours used as a chequerboard pattern in the fold margin + SCI_SETFOLDMARGINHICOLOUR = 2291, + + /// Move caret down one line. + SCI_LINEDOWN = 2300, + + /// Move caret down one line extending selection to new caret position. + SCI_LINEDOWNEXTEND = 2301, + + /// Move caret up one line. + SCI_LINEUP = 2302, + + /// Move caret up one line extending selection to new caret position. + SCI_LINEUPEXTEND = 2303, + + /// Move caret left one character. + SCI_CHARLEFT = 2304, + + /// Move caret left one character extending selection to new caret position. + SCI_CHARLEFTEXTEND = 2305, + + /// Move caret right one character. + SCI_CHARRIGHT = 2306, + + /// Move caret right one character extending selection to new caret position. + SCI_CHARRIGHTEXTEND = 2307, + + /// Move caret left one word. + SCI_WORDLEFT = 2308, + + /// Move caret left one word extending selection to new caret position. + SCI_WORDLEFTEXTEND = 2309, + + /// Move caret right one word. + SCI_WORDRIGHT = 2310, + + /// Move caret right one word extending selection to new caret position. + SCI_WORDRIGHTEXTEND = 2311, + + /// Move caret to first position on line. + SCI_HOME = 2312, + + /// Move caret to first position on line extending selection to new caret position. + SCI_HOMEEXTEND = 2313, + + /// Move caret to last position on line. + SCI_LINEEND = 2314, + + /// Move caret to last position on line extending selection to new caret position. + SCI_LINEENDEXTEND = 2315, + + /// Move caret to first position in document. + SCI_DOCUMENTSTART = 2316, + + /// Move caret to first position in document extending selection to new caret position. + SCI_DOCUMENTSTARTEXTEND = 2317, + + /// Move caret to last position in document. + SCI_DOCUMENTEND = 2318, + + /// Move caret to last position in document extending selection to new caret position. + SCI_DOCUMENTENDEXTEND = 2319, + + /// Move caret one page up. + SCI_PAGEUP = 2320, + + /// Move caret one page up extending selection to new caret position. + SCI_PAGEUPEXTEND = 2321, + + /// Move caret one page down. + SCI_PAGEDOWN = 2322, + + /// Move caret one page down extending selection to new caret position. + SCI_PAGEDOWNEXTEND = 2323, + + /// Switch from insert to overtype mode or the reverse. + SCI_EDITTOGGLEOVERTYPE = 2324, + + /// Cancel any modes such as call tip or auto-completion list display. + SCI_CANCEL = 2325, + + /// Delete the selection or if no selection, the character before the caret. + SCI_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. + SCI_TAB = 2327, + + /// Dedent the selected lines. + SCI_BACKTAB = 2328, + + /// Insert a new line, may use a CRLF, CR or LF depending on EOL mode. + SCI_NEWLINE = 2329, + + /// Insert a Form Feed character. + SCI_FORMFEED = 2330, + + /// Move caret to before first visible character on line. + /// If already there move to first character on line. + SCI_VCHOME = 2331, + + /// Like VCHome but extending selection to new caret position. + SCI_VCHOMEEXTEND = 2332, + + /// Magnify the displayed text by increasing the sizes by 1 point. + SCI_ZOOMIN = 2333, + + /// Make the displayed text smaller by decreasing the sizes by 1 point. + SCI_ZOOMOUT = 2334, + + /// Delete the word to the left of the caret. + SCI_DELWORDLEFT = 2335, + + /// Delete the word to the right of the caret. + SCI_DELWORDRIGHT = 2336, + + /// Delete the word to the right of the caret, but not the trailing non-word characters. + SCI_DELWORDRIGHTEND = 2518, + + /// Cut the line containing the caret. + SCI_LINECUT = 2337, + + /// Delete the line containing the caret. + SCI_LINEDELETE = 2338, + + /// Switch the current line with the previous. + SCI_LINETRANSPOSE = 2339, + + /// Duplicate the current line. + SCI_LINEDUPLICATE = 2404, + + /// Transform the selection to lower case. + SCI_LOWERCASE = 2340, + + /// Transform the selection to upper case. + SCI_UPPERCASE = 2341, + + /// Scroll the document down, keeping the caret visible. + SCI_LINESCROLLDOWN = 2342, + + /// Scroll the document up, keeping the caret visible. + SCI_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. + SCI_DELETEBACKNOTLINE = 2344, + + /// Move caret to first position on display line. + SCI_HOMEDISPLAY = 2345, + + /// Move caret to first position on display line extending selection to + /// new caret position. + SCI_HOMEDISPLAYEXTEND = 2346, + + /// Move caret to last position on display line. + SCI_LINEENDDISPLAY = 2347, + + /// Move caret to last position on display line extending selection to new + /// caret position. + SCI_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)?. + SCI_HOMEWRAP = 2349, + + /// 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)?. + SCI_HOMEWRAPEXTEND = 2450, + + /// 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)?. + SCI_LINEENDWRAP = 2451, + + /// 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)?. + SCI_LINEENDWRAPEXTEND = 2452, + + /// 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)?. + SCI_VCHOMEWRAP = 2453, + + /// 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)?. + SCI_VCHOMEWRAPEXTEND = 2454, + + /// Copy the line containing the caret. + SCI_LINECOPY = 2455, + + /// Move the caret inside current view if it's not there already. + SCI_MOVECARETINSIDEVIEW = 2401, + + /// How many characters are on a line, including end of line characters? + SCI_LINELENGTH = 2350, + + /// Highlight the characters at two positions. + SCI_BRACEHIGHLIGHT = 2351, + + /// Use specified indicator to highlight matching braces instead of changing their style. + SCI_BRACEHIGHLIGHTINDICATOR = 2498, + + /// Highlight the character at a position indicating there is no matching brace. + SCI_BRACEBADLIGHT = 2352, + + /// Use specified indicator to highlight non matching brace instead of changing its style. + SCI_BRACEBADLIGHTINDICATOR = 2499, + + /// Find the position of a matching brace or INVALID_POSITION if no match. + SCI_BRACEMATCH = 2353, + + /// Are the end of line characters visible? + SCI_GETVIEWEOL = 2355, + + /// Make the end of line characters visible or invisible. + SCI_SETVIEWEOL = 2356, + + /// Retrieve a pointer to the document object. + SCI_GETDOCPOINTER = 2357, + + /// Change the document object used. + SCI_SETDOCPOINTER = 2358, + + /// Set which document modification events are sent to the container. + SCI_SETMODEVENTMASK = 2359, + + EDGE_NONE = 0, + + EDGE_LINE = 1, + + EDGE_BACKGROUND = 2, + + /// Retrieve the column number which text should be kept within. + SCI_GETEDGECOLUMN = 2360, + + /// Set the column number of the edge. + /// If text goes past the edge then it is highlighted. + SCI_SETEDGECOLUMN = 2361, + + /// Retrieve the edge highlight mode. + SCI_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). + SCI_SETEDGEMODE = 2363, + + /// Retrieve the colour used in edge indication. + SCI_GETEDGECOLOUR = 2364, + + /// Change the colour used in edge indication. + SCI_SETEDGECOLOUR = 2365, + + /// Sets the current caret position to be the search anchor. + SCI_SEARCHANCHOR = 2366, + + /// Find some text starting at the search anchor. + /// Does not ensure the selection is visible. + SCI_SEARCHNEXT = 2367, + + /// Find some text starting at the search anchor and moving backwards. + /// Does not ensure the selection is visible. + SCI_SEARCHPREV = 2368, + + /// Retrieves the number of lines completely visible. + SCI_LINESONSCREEN = 2370, + + /// Set whether a pop up menu is displayed automatically when the user presses + /// the wrong mouse button. + SCI_USEPOPUP = 2371, + + /// Is the selection rectangular? The alternative is the more common stream selection. + SCI_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. + SCI_SETZOOM = 2373, + + /// Retrieve the zoom level. + SCI_GETZOOM = 2374, + + /// Create a new document object. + /// Starts with reference count of 1 and not selected into editor. + SCI_CREATEDOCUMENT = 2375, + + /// Extend life of document. + SCI_ADDREFDOCUMENT = 2376, + + /// Release a reference to the document, deleting document if it fades to black. + SCI_RELEASEDOCUMENT = 2377, + + /// Get which document modification events are sent to the container. + SCI_GETMODEVENTMASK = 2378, + + /// Change internal focus flag. + SCI_SETFOCUS = 2380, + + /// Get internal focus flag. + SCI_GETFOCUS = 2381, + + SC_STATUS_OK = 0, + + SC_STATUS_FAILURE = 1, + + SC_STATUS_BADALLOC = 2, + + SC_STATUS_WARN_START = 1000, + + SC_STATUS_WARN_REGEX = 1001, + + /// Change error status - 0 = OK. + SCI_SETSTATUS = 2382, + + /// Get error status. + SCI_GETSTATUS = 2383, + + /// Set whether the mouse is captured when its button is pressed. + SCI_SETMOUSEDOWNCAPTURES = 2384, + + /// Get whether mouse gets captured. + SCI_GETMOUSEDOWNCAPTURES = 2385, + + SC_CURSORNORMAL = 0xFFFFFFFF, + + SC_CURSORARROW = 2, + + SC_CURSORWAIT = 4, + + SC_CURSORREVERSEARROW = 7, + + /// Sets the cursor to one of the SC_CURSOR* values. + SCI_SETCURSOR = 2386, + + /// Get cursor type. + SCI_GETCURSOR = 2387, + + /// Change the way control characters are displayed: + /// If symbol is < 32, keep the drawn way, else, use the given character. + SCI_SETCONTROLCHARSYMBOL = 2388, + + /// Get the way control characters are displayed. + SCI_GETCONTROLCHARSYMBOL = 2389, + + /// Move to the previous change in capitalisation. + SCI_WORDPARTLEFT = 2390, + + /// Move to the previous change in capitalisation extending selection + /// to new caret position. + SCI_WORDPARTLEFTEXTEND = 2391, + + /// Move to the change next in capitalisation. + SCI_WORDPARTRIGHT = 2392, + + /// Move to the next change in capitalisation extending selection + /// to new caret position. + SCI_WORDPARTRIGHTEXTEND = 2393, + + VISIBLE_SLOP = 0x01, + + 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. + SCI_SETVISIBLEPOLICY = 2394, + + /// Delete back from the current position to the start of the line. + SCI_DELLINELEFT = 2395, + + /// Delete forwards from the current position to the end of the line. + SCI_DELLINERIGHT = 2396, + + /// Get and Set the xOffset (ie, horizontal scroll position). + SCI_SETXOFFSET = 2397, + + /// Get and Set the xOffset (ie, horizontal scroll position). + SCI_GETXOFFSET = 2398, + + /// Set the last x chosen value to be the caret x position. + SCI_CHOOSECARETX = 2399, + + /// Set the focus to this Scintilla widget. + SCI_GRABFOCUS = 2400, + + CARET_SLOP = 0x01, + + CARET_STRICT = 0x04, + + CARET_JUMPS = 0x10, + + CARET_EVEN = 0x08, + + /// Set the way the caret is kept visible when going sideways. + /// The exclusion zone is given in pixels. + SCI_SETXCARETPOLICY = 2402, + + /// Set the way the line the caret is on is kept visible. + /// The exclusion zone is given in lines. + SCI_SETYCARETPOLICY = 2403, + + /// Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE). + SCI_SETPRINTWRAPMODE = 2406, + + /// Is printing line wrapped? + SCI_GETPRINTWRAPMODE = 2407, + + /// Set a fore colour for active hotspots. + SCI_SETHOTSPOTACTIVEFORE = 2410, + + /// Get the fore colour for active hotspots. + SCI_GETHOTSPOTACTIVEFORE = 2494, + + /// Set a back colour for active hotspots. + SCI_SETHOTSPOTACTIVEBACK = 2411, + + /// Get the back colour for active hotspots. + SCI_GETHOTSPOTACTIVEBACK = 2495, + + /// Enable / Disable underlining active hotspots. + SCI_SETHOTSPOTACTIVEUNDERLINE = 2412, + + /// Get whether underlining for active hotspots. + SCI_GETHOTSPOTACTIVEUNDERLINE = 2496, + + /// Limit hotspots to single line so hotspots on two lines don't merge. + SCI_SETHOTSPOTSINGLELINE = 2421, + + /// Get the HotspotSingleLine property + SCI_GETHOTSPOTSINGLELINE = 2497, + + /// Move caret between paragraphs (delimited by empty lines). + SCI_PARADOWN = 2413, + + /// Move caret between paragraphs (delimited by empty lines). + SCI_PARADOWNEXTEND = 2414, + + /// Move caret between paragraphs (delimited by empty lines). + SCI_PARAUP = 2415, + + /// Move caret between paragraphs (delimited by empty lines). + SCI_PARAUPEXTEND = 2416, + + /// Given a valid document position, return the previous position taking code + /// page into account. Returns 0 if passed 0. + SCI_POSITIONBEFORE = 2417, + + /// Given a valid document position, return the next position taking code + /// page into account. Maximum value returned is the last position in the document. + SCI_POSITIONAFTER = 2418, + + /// Given a valid document position, return a position that differs in a number + /// of characters. Returned value is always between 0 and last position in document. + SCI_POSITIONRELATIVE = 2670, + + /// Copy a range of text to the clipboard. Positions are clipped into the document. + SCI_COPYRANGE = 2419, + + /// Copy argument text to the clipboard. + SCI_COPYTEXT = 2420, + + SC_SEL_STREAM = 0, + + SC_SEL_RECTANGLE = 1, + + SC_SEL_LINES = 2, + + SC_SEL_THIN = 3, + + /// Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE/SC_SEL_THIN) or + /// by lines (SC_SEL_LINES). + SCI_SETSELECTIONMODE = 2422, + + /// Get the mode of the current selection. + SCI_GETSELECTIONMODE = 2423, + + /// Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line). + SCI_GETLINESELSTARTPOSITION = 2424, + + /// Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line). + SCI_GETLINESELENDPOSITION = 2425, + + /// Move caret down one line, extending rectangular selection to new caret position. + SCI_LINEDOWNRECTEXTEND = 2426, + + /// Move caret up one line, extending rectangular selection to new caret position. + SCI_LINEUPRECTEXTEND = 2427, + + /// Move caret left one character, extending rectangular selection to new caret position. + SCI_CHARLEFTRECTEXTEND = 2428, + + /// Move caret right one character, extending rectangular selection to new caret position. + SCI_CHARRIGHTRECTEXTEND = 2429, + + /// Move caret to first position on line, extending rectangular selection to new caret position. + SCI_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. + SCI_VCHOMERECTEXTEND = 2431, + + /// Move caret to last position on line, extending rectangular selection to new caret position. + SCI_LINEENDRECTEXTEND = 2432, + + /// Move caret one page up, extending rectangular selection to new caret position. + SCI_PAGEUPRECTEXTEND = 2433, + + /// Move caret one page down, extending rectangular selection to new caret position. + SCI_PAGEDOWNRECTEXTEND = 2434, + + /// Move caret to top of page, or one page up if already at top of page. + SCI_STUTTEREDPAGEUP = 2435, + + /// Move caret to top of page, or one page up if already at top of page, extending selection to new caret position. + SCI_STUTTEREDPAGEUPEXTEND = 2436, + + /// Move caret to bottom of page, or one page down if already at bottom of page. + SCI_STUTTEREDPAGEDOWN = 2437, + + /// Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position. + SCI_STUTTEREDPAGEDOWNEXTEND = 2438, + + /// Move caret left one word, position cursor at end of word. + SCI_WORDLEFTEND = 2439, + + /// Move caret left one word, position cursor at end of word, extending selection to new caret position. + SCI_WORDLEFTENDEXTEND = 2440, + + /// Move caret right one word, position cursor at end of word. + SCI_WORDRIGHTEND = 2441, + + /// Move caret right one word, position cursor at end of word, extending selection to new caret position. + SCI_WORDRIGHTENDEXTEND = 2442, + + /// Set the set of characters making up whitespace for when moving or selecting by word. + /// Should be called after SetWordChars. + SCI_SETWHITESPACECHARS = 2443, + + /// Get the set of characters making up whitespace for when moving or selecting by word. + SCI_GETWHITESPACECHARS = 2647, + + /// Set the set of characters making up punctuation characters + /// Should be called after SetWordChars. + SCI_SETPUNCTUATIONCHARS = 2648, + + /// Get the set of characters making up punctuation characters + SCI_GETPUNCTUATIONCHARS = 2649, + + /// Reset the set of characters for whitespace and word characters to the defaults. + SCI_SETCHARSDEFAULT = 2444, + + /// Get currently selected item position in the auto-completion list + SCI_AUTOCGETCURRENT = 2445, + + /// Get currently selected item text in the auto-completion list + /// Returns the length of the item text + /// Result is NUL-terminated. + SCI_AUTOCGETCURRENTTEXT = 2610, + + SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE = 0, + + SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE = 1, + + /// Set auto-completion case insensitive behaviour to either prefer case-sensitive matches or have no preference. + SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR = 2634, + + /// Get auto-completion case insensitive behaviour. + SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR = 2635, + + SC_MULTIAUTOC_ONCE = 0, + + SC_MULTIAUTOC_EACH = 1, + + /// Change the effect of autocompleting when there are multiple selections. + SCI_AUTOCSETMULTI = 2636, + + /// Retrieve the effect of autocompleting when there are multiple selections.. + SCI_AUTOCGETMULTI = 2637, + + SC_ORDER_PRESORTED = 0, + + SC_ORDER_PERFORMSORT = 1, + + SC_ORDER_CUSTOM = 2, + + /// Set the way autocompletion lists are ordered. + SCI_AUTOCSETORDER = 2660, + + /// Get the way autocompletion lists are ordered. + SCI_AUTOCGETORDER = 2661, + + /// Enlarge the document to a particular size of text bytes. + SCI_ALLOCATE = 2446, + + /// Returns the target converted to UTF8. + /// Return the length in bytes. + SCI_TARGETASUTF8 = 2447, + + /// Set the length of the utf8 argument for calling EncodedFromUTF8. + /// Set to -1 and the string will be measured to the first nul. + SCI_SETLENGTHFORENCODE = 2448, + + /// Translates a UTF8 string into the document encoding. + /// Return the length of the result in bytes. + /// On error return 0. + SCI_ENCODEDFROMUTF8 = 2449, + + /// 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. + SCI_FINDCOLUMN = 2456, + + /// Can the caret preferred x position only be changed by explicit movement commands? + SCI_GETCARETSTICKY = 2457, + + /// Stop the caret preferred x position changing when the user types. + SCI_SETCARETSTICKY = 2458, + + SC_CARETSTICKY_OFF = 0, + + SC_CARETSTICKY_ON = 1, + + SC_CARETSTICKY_WHITESPACE = 2, + + /// Switch between sticky and non-sticky: meant to be bound to a key. + SCI_TOGGLECARETSTICKY = 2459, + + /// Enable/Disable convert-on-paste for line endings + SCI_SETPASTECONVERTENDINGS = 2467, + + /// Get convert-on-paste setting + SCI_GETPASTECONVERTENDINGS = 2468, + + /// Duplicate the selection. If selection empty duplicate the line containing the caret. + SCI_SELECTIONDUPLICATE = 2469, + + SC_ALPHA_TRANSPARENT = 0, + + SC_ALPHA_OPAQUE = 255, + + SC_ALPHA_NOALPHA = 256, + + /// Set background alpha of the caret line. + SCI_SETCARETLINEBACKALPHA = 2470, + + /// Get the background alpha of the caret line. + SCI_GETCARETLINEBACKALPHA = 2471, + + CARETSTYLE_INVISIBLE = 0, + + CARETSTYLE_LINE = 1, + + CARETSTYLE_BLOCK = 2, + + /// Set the style of the caret to be drawn. + SCI_SETCARETSTYLE = 2512, + + /// Returns the current style of the caret. + SCI_GETCARETSTYLE = 2513, + + /// Set the indicator used for IndicatorFillRange and IndicatorClearRange + SCI_SETINDICATORCURRENT = 2500, + + /// Get the current indicator + SCI_GETINDICATORCURRENT = 2501, + + /// Set the value used for IndicatorFillRange + SCI_SETINDICATORVALUE = 2502, + + /// Get the current indicator value + SCI_GETINDICATORVALUE = 2503, + + /// Turn a indicator on over a range. + SCI_INDICATORFILLRANGE = 2504, + + /// Turn a indicator off over a range. + SCI_INDICATORCLEARRANGE = 2505, + + /// Are any indicators present at position? + SCI_INDICATORALLONFOR = 2506, + + /// What value does a particular indicator have at at a position? + SCI_INDICATORVALUEAT = 2507, + + /// Where does a particular indicator start? + SCI_INDICATORSTART = 2508, + + /// Where does a particular indicator end? + SCI_INDICATOREND = 2509, + + /// Set number of entries in position cache + SCI_SETPOSITIONCACHE = 2514, + + /// How many entries are allocated to the position cache? + SCI_GETPOSITIONCACHE = 2515, + + /// Copy the selection, if selection empty copy the line with the caret + SCI_COPYALLOWLINE = 2519, + + /// Compact the document buffer and return a read-only pointer to the + /// characters in the document. + SCI_GETCHARACTERPOINTER = 2520, + + /// Return a read-only pointer to a range of characters in the document. + /// May move the gap so that the range is contiguous, but will only move up + /// to rangeLength bytes. + SCI_GETRANGEPOINTER = 2643, + + /// Return a position which, to avoid performance costs, should not be within + /// the range of a call to GetRangePointer. + SCI_GETGAPPOSITION = 2644, + + /// Set the alpha fill colour of the given indicator. + SCI_INDICSETALPHA = 2523, + + /// Get the alpha fill colour of the given indicator. + SCI_INDICGETALPHA = 2524, + + /// Set the alpha outline colour of the given indicator. + SCI_INDICSETOUTLINEALPHA = 2558, + + /// Get the alpha outline colour of the given indicator. + SCI_INDICGETOUTLINEALPHA = 2559, + + /// Set extra ascent for each line + SCI_SETEXTRAASCENT = 2525, + + /// Get extra ascent for each line + SCI_GETEXTRAASCENT = 2526, + + /// Set extra descent for each line + SCI_SETEXTRADESCENT = 2527, + + /// Get extra descent for each line + SCI_GETEXTRADESCENT = 2528, + + /// Which symbol was defined for markerNumber with MarkerDefine + SCI_MARKERSYMBOLDEFINED = 2529, + + /// Set the text in the text margin for a line + SCI_MARGINSETTEXT = 2530, + + /// Get the text in the text margin for a line + SCI_MARGINGETTEXT = 2531, + + /// Set the style number for the text margin for a line + SCI_MARGINSETSTYLE = 2532, + + /// Get the style number for the text margin for a line + SCI_MARGINGETSTYLE = 2533, + + /// Set the style in the text margin for a line + SCI_MARGINSETSTYLES = 2534, + + /// Get the styles in the text margin for a line + SCI_MARGINGETSTYLES = 2535, + + /// Clear the margin text on all lines + SCI_MARGINTEXTCLEARALL = 2536, + + /// Get the start of the range of style numbers used for margin text + SCI_MARGINSETSTYLEOFFSET = 2537, + + /// Get the start of the range of style numbers used for margin text + SCI_MARGINGETSTYLEOFFSET = 2538, + + SC_MARGINOPTION_NONE = 0, + + SC_MARGINOPTION_SUBLINESELECT = 1, + + /// Set the margin options. + SCI_SETMARGINOPTIONS = 2539, + + /// Get the margin options. + SCI_GETMARGINOPTIONS = 2557, + + /// Set the annotation text for a line + SCI_ANNOTATIONSETTEXT = 2540, + + /// Get the annotation text for a line + SCI_ANNOTATIONGETTEXT = 2541, + + /// Set the style number for the annotations for a line + SCI_ANNOTATIONSETSTYLE = 2542, + + /// Get the style number for the annotations for a line + SCI_ANNOTATIONGETSTYLE = 2543, + + /// Set the annotation styles for a line + SCI_ANNOTATIONSETSTYLES = 2544, + + /// Get the annotation styles for a line + SCI_ANNOTATIONGETSTYLES = 2545, + + /// Get the number of annotation lines for a line + SCI_ANNOTATIONGETLINES = 2546, + + /// Clear the annotations from all lines + SCI_ANNOTATIONCLEARALL = 2547, + + ANNOTATION_HIDDEN = 0, + + ANNOTATION_STANDARD = 1, + + ANNOTATION_BOXED = 2, + + ANNOTATION_INDENTED = 3, + + /// Set the visibility for the annotations for a view + SCI_ANNOTATIONSETVISIBLE = 2548, + + /// Get the visibility for the annotations for a view + SCI_ANNOTATIONGETVISIBLE = 2549, + + /// Get the start of the range of style numbers used for annotations + SCI_ANNOTATIONSETSTYLEOFFSET = 2550, + + /// Get the start of the range of style numbers used for annotations + SCI_ANNOTATIONGETSTYLEOFFSET = 2551, + + /// Release all extended (>255) style numbers + SCI_RELEASEALLEXTENDEDSTYLES = 2552, + + /// Allocate some extended (>255) style numbers and return the start of the range + SCI_ALLOCATEEXTENDEDSTYLES = 2553, + + UNDO_MAY_COALESCE = 1, + + /// Add a container action to the undo stack + SCI_ADDUNDOACTION = 2560, + + /// Find the position of a character from a point within the window. + SCI_CHARPOSITIONFROMPOINT = 2561, + + /// Find the position of a character from a point within the window. + /// Return INVALID_POSITION if not close to text. + SCI_CHARPOSITIONFROMPOINTCLOSE = 2562, + + /// Set whether switching to rectangular mode while selecting with the mouse is allowed. + SCI_SETMOUSESELECTIONRECTANGULARSWITCH = 2668, + + /// Whether switching to rectangular mode while selecting with the mouse is allowed. + SCI_GETMOUSESELECTIONRECTANGULARSWITCH = 2669, + + /// Set whether multiple selections can be made + SCI_SETMULTIPLESELECTION = 2563, + + /// Whether multiple selections can be made + SCI_GETMULTIPLESELECTION = 2564, + + /// Set whether typing can be performed into multiple selections + SCI_SETADDITIONALSELECTIONTYPING = 2565, + + /// Whether typing can be performed into multiple selections + SCI_GETADDITIONALSELECTIONTYPING = 2566, + + /// Set whether additional carets will blink + SCI_SETADDITIONALCARETSBLINK = 2567, + + /// Whether additional carets will blink + SCI_GETADDITIONALCARETSBLINK = 2568, + + /// Set whether additional carets are visible + SCI_SETADDITIONALCARETSVISIBLE = 2608, + + /// Whether additional carets are visible + SCI_GETADDITIONALCARETSVISIBLE = 2609, + + /// How many selections are there? + SCI_GETSELECTIONS = 2570, + + /// Is every selected range empty? + SCI_GETSELECTIONEMPTY = 2650, + + /// Clear selections to a single empty stream selection + SCI_CLEARSELECTIONS = 2571, + + /// Set a simple selection + SCI_SETSELECTION = 2572, + + /// Add a selection + SCI_ADDSELECTION = 2573, + + /// Drop one selection + SCI_DROPSELECTIONN = 2671, + + /// Set the main selection + SCI_SETMAINSELECTION = 2574, + + /// Which selection is the main selection + SCI_GETMAINSELECTION = 2575, + + /// Which selection is the main selection + SCI_SETSELECTIONNCARET = 2576, + + /// Which selection is the main selection + SCI_GETSELECTIONNCARET = 2577, + + /// Which selection is the main selection + SCI_SETSELECTIONNANCHOR = 2578, + + /// Which selection is the main selection + SCI_GETSELECTIONNANCHOR = 2579, + + /// Which selection is the main selection + SCI_SETSELECTIONNCARETVIRTUALSPACE = 2580, + + /// Which selection is the main selection + SCI_GETSELECTIONNCARETVIRTUALSPACE = 2581, + + /// Which selection is the main selection + SCI_SETSELECTIONNANCHORVIRTUALSPACE = 2582, + + /// Which selection is the main selection + SCI_GETSELECTIONNANCHORVIRTUALSPACE = 2583, + + /// Sets the position that starts the selection - this becomes the anchor. + SCI_SETSELECTIONNSTART = 2584, + + /// Returns the position at the start of the selection. + SCI_GETSELECTIONNSTART = 2585, + + /// Sets the position that ends the selection - this becomes the currentPosition. + SCI_SETSELECTIONNEND = 2586, + + /// Returns the position at the end of the selection. + SCI_GETSELECTIONNEND = 2587, + + /// Returns the position at the end of the selection. + SCI_SETRECTANGULARSELECTIONCARET = 2588, + + /// Returns the position at the end of the selection. + SCI_GETRECTANGULARSELECTIONCARET = 2589, + + /// Returns the position at the end of the selection. + SCI_SETRECTANGULARSELECTIONANCHOR = 2590, + + /// Returns the position at the end of the selection. + SCI_GETRECTANGULARSELECTIONANCHOR = 2591, + + /// Returns the position at the end of the selection. + SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE = 2592, + + /// Returns the position at the end of the selection. + SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE = 2593, + + /// Returns the position at the end of the selection. + SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE = 2594, + + /// Returns the position at the end of the selection. + SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE = 2595, + + SCVS_NONE = 0, + + SCVS_RECTANGULARSELECTION = 1, + + SCVS_USERACCESSIBLE = 2, + + /// Returns the position at the end of the selection. + SCI_SETVIRTUALSPACEOPTIONS = 2596, + + /// Returns the position at the end of the selection. + SCI_GETVIRTUALSPACEOPTIONS = 2597, + + /// On GTK+, allow selecting the modifier key to use for mouse-based + /// rectangular selection. Often the window manager requires Alt+Mouse Drag + /// for moving windows. + /// Valid values are SCMOD_CTRL(default), SCMOD_ALT, or SCMOD_SUPER. + SCI_SETRECTANGULARSELECTIONMODIFIER = 2598, + + /// Get the modifier key used for rectangular selection. + SCI_GETRECTANGULARSELECTIONMODIFIER = 2599, + + /// Set the foreground colour of additional selections. + /// Must have previously called SetSelFore with non-zero first argument for this to have an effect. + SCI_SETADDITIONALSELFORE = 2600, + + /// Set the background colour of additional selections. + /// Must have previously called SetSelBack with non-zero first argument for this to have an effect. + SCI_SETADDITIONALSELBACK = 2601, + + /// Set the alpha of the selection. + SCI_SETADDITIONALSELALPHA = 2602, + + /// Get the alpha of the selection. + SCI_GETADDITIONALSELALPHA = 2603, + + /// Set the foreground colour of additional carets. + SCI_SETADDITIONALCARETFORE = 2604, + + /// Get the foreground colour of additional carets. + SCI_GETADDITIONALCARETFORE = 2605, + + /// Set the main selection to the next selection. + SCI_ROTATESELECTION = 2606, + + /// Swap that caret and anchor of the main selection. + SCI_SWAPMAINANCHORCARET = 2607, + + /// Indicate that the internal state of a lexer has changed over a range and therefore + /// there may be a need to redraw. + SCI_CHANGELEXERSTATE = 2617, + + /// Find the next line at or after lineStart that is a contracted fold header line. + /// Return -1 when no more lines. + SCI_CONTRACTEDFOLDNEXT = 2618, + + /// Centre current line in window. + SCI_VERTICALCENTRECARET = 2619, + + /// Move the selected lines up one line, shifting the line above after the selection + SCI_MOVESELECTEDLINESUP = 2620, + + /// Move the selected lines down one line, shifting the line below before the selection + SCI_MOVESELECTEDLINESDOWN = 2621, + + /// Set the identifier reported as IdFrom in notification messages. + SCI_SETIDENTIFIER = 2622, + + /// Get the identifier. + SCI_GETIDENTIFIER = 2623, + + /// Set the width for future RGBA image data. + SCI_RGBAIMAGESETWIDTH = 2624, + + /// Set the height for future RGBA image data. + SCI_RGBAIMAGESETHEIGHT = 2625, + + /// Set the scale factor in percent for future RGBA image data. + SCI_RGBAIMAGESETSCALE = 2651, + + /// Define a marker from RGBA data. + /// It has the width and height from RGBAImageSetWidth/Height + SCI_MARKERDEFINERGBAIMAGE = 2626, + + /// Register an RGBA image for use in autocompletion lists. + /// It has the width and height from RGBAImageSetWidth/Height + SCI_REGISTERRGBAIMAGE = 2627, + + /// Scroll to start of document. + SCI_SCROLLTOSTART = 2628, + + /// Scroll to end of document. + SCI_SCROLLTOEND = 2629, + + SC_TECHNOLOGY_DEFAULT = 0, + + SC_TECHNOLOGY_DIRECTWRITE = 1, + + SC_TECHNOLOGY_DIRECTWRITERETAIN = 2, + + SC_TECHNOLOGY_DIRECTWRITEDC = 3, + + /// Set the technology used. + SCI_SETTECHNOLOGY = 2630, + + /// Get the tech. + SCI_GETTECHNOLOGY = 2631, + + /// Create an ILoader*. + SCI_CREATELOADER = 2632, + + /// On OS X, show a find indicator. + SCI_FINDINDICATORSHOW = 2640, + + /// On OS X, flash a find indicator, then fade out. + SCI_FINDINDICATORFLASH = 2641, + + /// On OS X, hide the find indicator. + SCI_FINDINDICATORHIDE = 2642, + + /// Move caret to before first visible character on display line. + /// If already there move to first character on display line. + SCI_VCHOMEDISPLAY = 2652, + + /// Like VCHomeDisplay but extending selection to new caret position. + SCI_VCHOMEDISPLAYEXTEND = 2653, + + /// Is the caret line always visible? + SCI_GETCARETLINEVISIBLEALWAYS = 2654, + + /// Sets the caret line to always visible. + SCI_SETCARETLINEVISIBLEALWAYS = 2655, + + SC_LINE_END_TYPE_DEFAULT = 0, + + SC_LINE_END_TYPE_UNICODE = 1, + + /// Set the line end types that the application wants to use. May not be used if incompatible with lexer or encoding. + SCI_SETLINEENDTYPESALLOWED = 2656, + + /// Get the line end types currently allowed. + SCI_GETLINEENDTYPESALLOWED = 2657, + + /// Get the line end types currently recognised. May be a subset of the allowed types due to lexer limitation. + SCI_GETLINEENDTYPESACTIVE = 2658, + + /// Set the way a character is drawn. + SCI_SETREPRESENTATION = 2665, + + /// Set the way a character is drawn. + /// Result is NUL-terminated. + SCI_GETREPRESENTATION = 2666, + + /// Remove a character representation. + SCI_CLEARREPRESENTATION = 2667, + + /// Start notifying the container of all key presses and commands. + SCI_STARTRECORD = 3001, + + /// Stop notifying the container of all key presses and commands. + SCI_STOPRECORD = 3002, + + /// Set the lexing language of the document. + SCI_SETLEXER = 4001, + + /// Retrieve the lexing language of the document. + SCI_GETLEXER = 4002, + + /// Colourise a segment of the document using the current lexing language. + SCI_COLOURISE = 4003, + + /// Set up a value that may be used by a lexer for some optional feature. + SCI_SETPROPERTY = 4004, + + KEYWORDSET_MAX = 8, + + /// Set up the key words used by the lexer. + SCI_SETKEYWORDS = 4005, + + /// Set the lexing language of the document based on string name. + SCI_SETLEXERLANGUAGE = 4006, + + /// Load a lexer library (dll / so). + SCI_LOADLEXERLIBRARY = 4007, + + /// Retrieve a "property" value previously set with SetProperty. + /// Result is NUL-terminated. + SCI_GETPROPERTY = 4008, + + /// Retrieve a "property" value previously set with SetProperty, + /// with "$()" variable replacement on returned buffer. + /// Result is NUL-terminated. + SCI_GETPROPERTYEXPANDED = 4009, + + /// Retrieve a "property" value previously set with SetProperty, + /// interpreted as an int AFTER any "$()" variable replacement. + SCI_GETPROPERTYINT = 4010, + + /// Retrieve the number of bits the current lexer needs for styling. + SCI_GETSTYLEBITSNEEDED = 4011, + + /// Retrieve the name of the lexer. + /// Return the length of the text. + /// Result is NUL-terminated. + SCI_GETLEXERLANGUAGE = 4012, + + /// For private communication between an application and a known lexer. + SCI_PRIVATELEXERCALL = 4013, + + /// Retrieve a '\n' separated list of properties understood by the current lexer. + /// Result is NUL-terminated. + SCI_PROPERTYNAMES = 4014, + + SC_TYPE_BOOLEAN = 0, + + SC_TYPE_INTEGER = 1, + + SC_TYPE_STRING = 2, + + /// Retrieve the type of a property. + SCI_PROPERTYTYPE = 4015, + + /// Describe a property. + /// Result is NUL-terminated. + SCI_DESCRIBEPROPERTY = 4016, + + /// Retrieve a '\n' separated list of descriptions of the keyword sets understood by the current lexer. + /// Result is NUL-terminated. + SCI_DESCRIBEKEYWORDSETS = 4017, + + /// Bit set of LineEndType enumertion for which line ends beyond the standard + /// LF, CR, and CRLF are supported by the lexer. + SCI_GETLINEENDTYPESSUPPORTED = 4018, + + /// Allocate a set of sub styles for a particular base style, returning start of range + SCI_ALLOCATESUBSTYLES = 4020, + + /// The starting style number for the sub styles associated with a base style + SCI_GETSUBSTYLESSTART = 4021, + + /// The number of sub styles associated with a base style + SCI_GETSUBSTYLESLENGTH = 4022, + + /// For a sub style, return the base style, else return the argument. + SCI_GETSTYLEFROMSUBSTYLE = 4027, + + /// For a secondary style, return the primary style, else return the argument. + SCI_GETPRIMARYSTYLEFROMSTYLE = 4028, + + /// Free allocated sub styles + SCI_FREESUBSTYLES = 4023, + + /// Set the identifiers that are shown in a particular style + SCI_SETIDENTIFIERS = 4024, + + /// Where styles are duplicated by a feature such as active/inactive code + /// return the distance between the two types. + SCI_DISTANCETOSECONDARYSTYLES = 4025, + + /// Get the set of base styles that can be extended with sub styles + /// Result is NUL-terminated. + SCI_GETSUBSTYLEBASES = 4026, + + SC_MOD_INSERTTEXT = 0x1, + + SC_MOD_DELETETEXT = 0x2, + + SC_MOD_CHANGESTYLE = 0x4, + + SC_MOD_CHANGEFOLD = 0x8, + + SC_PERFORMED_USER = 0x10, + + SC_PERFORMED_UNDO = 0x20, + + SC_PERFORMED_REDO = 0x40, + + SC_MULTISTEPUNDOREDO = 0x80, + + SC_LASTSTEPINUNDOREDO = 0x100, + + SC_MOD_CHANGEMARKER = 0x200, + + SC_MOD_BEFOREINSERT = 0x400, + + SC_MOD_BEFOREDELETE = 0x800, + + SC_MULTILINEUNDOREDO = 0x1000, + + SC_STARTACTION = 0x2000, + + SC_MOD_CHANGEINDICATOR = 0x4000, + + SC_MOD_CHANGELINESTATE = 0x8000, + + SC_MOD_CHANGEMARGIN = 0x10000, + + SC_MOD_CHANGEANNOTATION = 0x20000, + + SC_MOD_CONTAINER = 0x40000, + + SC_MOD_LEXERSTATE = 0x80000, + + SC_MOD_INSERTCHECK = 0x100000, + + SC_MOD_CHANGETABSTOPS = 0x200000, + + SC_MODEVENTMASKALL = 0x3FFFFF, + + SC_UPDATE_CONTENT = 0x1, + + SC_UPDATE_SELECTION = 0x2, + + SC_UPDATE_V_SCROLL = 0x4, + + SC_UPDATE_H_SCROLL = 0x8, + + SCEN_CHANGE = 768, + + SCEN_SETFOCUS = 512, + + SCEN_KILLFOCUS = 256, + + SCK_DOWN = 300, + + SCK_UP = 301, + + SCK_LEFT = 302, + + SCK_RIGHT = 303, + + SCK_HOME = 304, + + SCK_END = 305, + + SCK_PRIOR = 306, + + SCK_NEXT = 307, + + SCK_DELETE = 308, + + SCK_INSERT = 309, + + SCK_ESCAPE = 7, + + SCK_BACK = 8, + + SCK_TAB = 9, + + SCK_RETURN = 13, + + SCK_ADD = 310, + + SCK_SUBTRACT = 311, + + SCK_DIVIDE = 312, + + SCK_WIN = 313, + + SCK_RWIN = 314, + + SCK_MENU = 315, + + SCMOD_NORM = 0, + + SCMOD_SHIFT = 1, + + SCMOD_CTRL = 2, + + SCMOD_ALT = 4, + + SCMOD_SUPER = 8, + + SCMOD_META = 16, + + /// Events + SCN_STYLENEEDED = 2000, + + /// Events + SCN_CHARADDED = 2001, + + /// Events + SCN_SAVEPOINTREACHED = 2002, + + /// Events + SCN_SAVEPOINTLEFT = 2003, + + /// Events + SCN_MODIFYATTEMPTRO = 2004, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_KEY = 2005, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_DOUBLECLICK = 2006, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_UPDATEUI = 2007, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_MODIFIED = 2008, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_MACRORECORD = 2009, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_MARGINCLICK = 2010, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_NEEDSHOWN = 2011, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_PAINTED = 2013, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_USERLISTSELECTION = 2014, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_URIDROPPED = 2015, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_DWELLSTART = 2016, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_DWELLEND = 2017, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_ZOOM = 2018, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_HOTSPOTCLICK = 2019, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_HOTSPOTDOUBLECLICK = 2020, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_CALLTIPCLICK = 2021, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_AUTOCSELECTION = 2022, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_INDICATORCLICK = 2023, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_INDICATORRELEASE = 2024, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_AUTOCCANCELLED = 2025, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_AUTOCCHARDELETED = 2026, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_HOTSPOTRELEASECLICK = 2027, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_FOCUSIN = 2028, + + /// GTK+ Specific to work around focus and accelerator problems: + SCN_FOCUSOUT = 2029, + + SC_CP_DBCS = 1, + + /// Deprecated in 2.30 + /// In palette mode? + SCI_GETUSEPALETTE = 2139, + + /// In palette mode, Scintilla uses the environment's palette calls to display + /// more colours. This may lead to ugly displays. + SCI_SETUSEPALETTE = 2039, + + /// Deprecated in 3.5.5 + /// Always interpret keyboard input as Unicode + SCI_SETKEYSUNICODE = 2521, + + /// Are keys always interpreted as Unicode? + SCI_GETKEYSUNICODE = 2522, + + /* --Autogenerated -- end of section automatically generated from Scintilla.iface */ + + SC_SEARCHRESULT_LINEBUFFERMAXLENGTH = 1024 + } + + public class TextToFind : IDisposable + { + Sci_TextToFind _sciTextToFind; + IntPtr _ptrSciTextToFind; + bool _disposed = false; + + /// + /// text to find + /// + /// range to search + /// the search pattern + public TextToFind(CharacterRange chrRange, string searchText) + { + _sciTextToFind.chrg = chrRange; + _sciTextToFind.lpstrText = Marshal.StringToHGlobalAnsi(searchText); + } + + /// + /// text to find + /// + /// range to search + /// range to search + /// the search pattern + public TextToFind(int cpmin, int cpmax, string searchText) + { + _sciTextToFind.chrg.cpMin = cpmin; + _sciTextToFind.chrg.cpMax = cpmax; + _sciTextToFind.lpstrText = Marshal.StringToHGlobalAnsi(searchText); + } + + [StructLayout(LayoutKind.Sequential)] + struct Sci_TextToFind + { + public CharacterRange chrg; + public IntPtr lpstrText; + public CharacterRange chrgText; + } + + public IntPtr NativePointer { get { _initNativeStruct(); return _ptrSciTextToFind; } } + public string lpstrText { set { _freeNativeString(); _sciTextToFind.lpstrText = Marshal.StringToHGlobalAnsi(value); } } + public CharacterRange chrg { get { _readNativeStruct(); return _sciTextToFind.chrg; } set { _sciTextToFind.chrg = value; _initNativeStruct(); } } + public CharacterRange chrgText { get { _readNativeStruct(); return _sciTextToFind.chrgText; } } + + void _initNativeStruct() + { + if (_ptrSciTextToFind == IntPtr.Zero) + _ptrSciTextToFind = Marshal.AllocHGlobal(Marshal.SizeOf(_sciTextToFind)); + Marshal.StructureToPtr(_sciTextToFind, _ptrSciTextToFind, false); + } + + void _readNativeStruct() + { + if (_ptrSciTextToFind != IntPtr.Zero) + _sciTextToFind = (Sci_TextToFind)Marshal.PtrToStructure(_ptrSciTextToFind, typeof(Sci_TextToFind)); + } + + void _freeNativeString() + { + if (_sciTextToFind.lpstrText != IntPtr.Zero) Marshal.FreeHGlobal(_sciTextToFind.lpstrText); + } + + public void Dispose() + { + if (!_disposed) + { + _freeNativeString(); + if (_ptrSciTextToFind != IntPtr.Zero) Marshal.FreeHGlobal(_ptrSciTextToFind); + _disposed = true; + } + } + + ~TextToFind() + { + Dispose(); + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/UnmanagedExports.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/UnmanagedExports.cs new file mode 100644 index 000000000000..1a7bac6c61a4 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/UnmanagedExports.cs @@ -0,0 +1,66 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +using System; +using System.Runtime.InteropServices; +using Kbg.NppPluginNET.PluginInfrastructure; +using NppPlugin.DllExport; + +namespace Kbg.NppPluginNET +{ + class UnmanagedExports + { + [DllExport(CallingConvention=CallingConvention.Cdecl)] + static bool isUnicode() + { + return true; + } + + [DllExport(CallingConvention = CallingConvention.Cdecl)] + static void setInfo(NppData notepadPlusData) + { + PluginBase.nppData = notepadPlusData; + Main.CommandMenuInit(); + } + + [DllExport(CallingConvention = CallingConvention.Cdecl)] + static IntPtr getFuncsArray(ref int nbF) + { + nbF = PluginBase._funcItems.Items.Count; + return PluginBase._funcItems.NativePointer; + } + + [DllExport(CallingConvention = CallingConvention.Cdecl)] + static uint messageProc(uint Message, IntPtr wParam, IntPtr lParam) + { + return 1; + } + + static IntPtr _ptrPluginName = IntPtr.Zero; + [DllExport(CallingConvention = CallingConvention.Cdecl)] + static IntPtr getName() + { + if (_ptrPluginName == IntPtr.Zero) + _ptrPluginName = Marshal.StringToHGlobalUni(Main.PluginName); + return _ptrPluginName; + } + + [DllExport(CallingConvention = CallingConvention.Cdecl)] + static void beNotified(IntPtr notifyCode) + { + ScNotification notification = (ScNotification)Marshal.PtrToStructure(notifyCode, typeof(ScNotification)); + if (notification.Header.Code == (uint)NppMsg.NPPN_TBMODIFICATION) + { + PluginBase._funcItems.RefreshItems(); + Main.SetToolBarIcon(); + } + else if (notification.Header.Code == (uint)NppMsg.NPPN_SHUTDOWN) + { + Main.PluginCleanUp(); + Marshal.FreeHGlobal(_ptrPluginName); + } + else + { + Main.OnNotification(notification); + } + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Win32.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Win32.cs new file mode 100644 index 000000000000..b7f1596fe279 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/PluginInfrastructure/Win32.cs @@ -0,0 +1,316 @@ +// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Text; + +namespace Kbg.NppPluginNET.PluginInfrastructure +{ + public class Win32 + { + /// + /// Get the scroll information of a scroll bar or window with scroll bar + /// @see https://msdn.microsoft.com/en-us/library/windows/desktop/bb787537(v=vs.85).aspx + /// + [StructLayout(LayoutKind.Sequential)] + public struct ScrollInfo + { + /// + /// Specifies the size, in bytes, of this structure. The caller must set this to sizeof(SCROLLINFO). + /// + public uint cbSize; + /// + /// Specifies the scroll bar parameters to set or retrieve. + /// @see ScrollInfoMask + /// + public uint fMask; + /// + /// Specifies the minimum scrolling position. + /// + public int nMin; + /// + /// Specifies the maximum scrolling position. + /// + public int nMax; + /// + /// Specifies the page size, in device units. A scroll bar uses this value to determine the appropriate size of the proportional scroll box. + /// + public uint nPage; + /// + /// Specifies the position of the scroll box. + /// + public int nPos; + /// + /// Specifies the immediate position of a scroll box that the user is dragging. + /// An application can retrieve this value while processing the SB_THUMBTRACK request code. + /// An application cannot set the immediate scroll position; the SetScrollInfo function ignores this member. + /// + public int nTrackPos; + } + + /// + /// Used for the ScrollInfo fMask + /// SIF_ALL => Combination of SIF_PAGE, SIF_POS, SIF_RANGE, and SIF_TRACKPOS. + /// SIF_DISABLENOSCROLL => This value is used only when setting a scroll bar's parameters. If the scroll bar's new parameters make the scroll bar unnecessary, disable the scroll bar instead of removing it. + /// SIF_PAGE => The nPage member contains the page size for a proportional scroll bar. + /// SIF_POS => The nPos member contains the scroll box position, which is not updated while the user drags the scroll box. + /// SIF_RANGE => The nMin and nMax members contain the minimum and maximum values for the scrolling range. + /// SIF_TRACKPOS => The nTrackPos member contains the current position of the scroll box while the user is dragging it. + /// + public enum ScrollInfoMask + { + SIF_RANGE = 0x1, + SIF_PAGE = 0x2, + SIF_POS = 0x4, + SIF_DISABLENOSCROLL = 0x8, + SIF_TRACKPOS = 0x10, + SIF_ALL = SIF_RANGE + SIF_PAGE + SIF_POS + SIF_TRACKPOS + } + + /// + /// Used for the GetScrollInfo() nBar parameter + /// + public enum ScrollInfoBar + { + SB_HORZ = 0, + SB_VERT = 1, + SB_CTL = 2, + SB_BOTH = 3 + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + [DllImport("user32")] + public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + [DllImport("user32")] + public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder lParam); + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + [DllImport("user32")] + public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + [DllImport("user32")] + public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, out IntPtr lParam); + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, NppMenuCmd lParam) + { + return SendMessage(hWnd, (UInt32)Msg, new IntPtr(wParam), new IntPtr((uint)lParam)); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, IntPtr lParam) + { + return SendMessage(hWnd, (UInt32)Msg, new IntPtr(wParam), lParam); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam) + { + return SendMessage(hWnd, (UInt32)Msg, new IntPtr(wParam), new IntPtr(lParam)); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, out int lParam) + { + IntPtr outVal; + IntPtr retval = SendMessage(hWnd, (UInt32)Msg, new IntPtr(wParam), out outVal); + lParam = outVal.ToInt32(); + return retval; + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, int lParam) + { + return SendMessage(hWnd, (UInt32)Msg, wParam, new IntPtr(lParam)); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder lParam) + { + return SendMessage(hWnd, (UInt32)Msg, new IntPtr(wParam), lParam); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam) + { + return SendMessage(hWnd, (UInt32)Msg, new IntPtr(wParam), lParam); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, SciMsg Msg, IntPtr wParam, int lParam) + { + return SendMessage(hWnd, (UInt32)Msg, wParam, new IntPtr(lParam)); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, SciMsg Msg, int wParam, IntPtr lParam) + { + return SendMessage(hWnd, (UInt32)Msg, new IntPtr(wParam), lParam); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, SciMsg Msg, int wParam, string lParam) + { + return SendMessage(hWnd, (UInt32)Msg, new IntPtr(wParam), lParam); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, SciMsg Msg, int wParam, [MarshalAs(UnmanagedType.LPStr)] StringBuilder lParam) + { + return SendMessage(hWnd, (UInt32)Msg, new IntPtr(wParam), lParam); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, SciMsg Msg, int wParam, int lParam) + { + return SendMessage(hWnd, (UInt32)Msg, new IntPtr(wParam), new IntPtr(lParam)); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, SciMsg Msg, IntPtr wParam, IntPtr lParam) + { + return SendMessage(hWnd, (UInt32)Msg, wParam, lParam); + } + + /// + /// You should try to avoid calling this method in your plugin code. Rather use one of the gateways such as + /// or . + /// If gateways are missing or incomplete, please help extend them and send your code to the project + /// at https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + /// + public static IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, ref LangType lParam) + { + IntPtr outVal; + IntPtr retval = SendMessage(hWnd, (UInt32)Msg, new IntPtr(wParam), out outVal); + lParam = (LangType)outVal; + return retval; + } + + public const int MAX_PATH = 260; + + [DllImport("kernel32")] + public static extern int GetPrivateProfileInt(string lpAppName, string lpKeyName, int nDefault, string lpFileName); + + [DllImport("kernel32")] + public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName); + + [DllImport("kernel32")] + public static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName); + + public const int MF_BYCOMMAND = 0; + public const int MF_CHECKED = 8; + public const int MF_UNCHECKED = 0; + + [DllImport("user32")] + public static extern IntPtr GetMenu(IntPtr hWnd); + + [DllImport("user32")] + public static extern int CheckMenuItem(IntPtr hmenu, int uIDCheckItem, int uCheck); + + public const int WM_CREATE = 1; + + [DllImport("user32")] + public static extern bool ClientToScreen(IntPtr hWnd, ref Point lpPoint); + + [DllImport("kernel32")] + public static extern void OutputDebugString(string lpOutputString); + + /// + /// @see https://msdn.microsoft.com/en-us/library/windows/desktop/bb787583(v=vs.85).aspx + /// + /// + /// + /// + /// + [DllImport("user32")] + public static extern int GetScrollInfo(IntPtr hwnd, int nBar, ref ScrollInfo scrollInfo); + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/AssemblyInfo.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..96310a269586 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MarkdownViewer++")] +[assembly: AssemblyDescription("A Notepad++ Plugin to view a Markdown file rendered on-the-fly")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MarkdownViewer++")] +[assembly: AssemblyCopyright("Copyright © Savas Ziplies 2017-2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("31492674-6fe0-485c-91f0-2e17244588ff")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("0.8.2.*")] +[assembly: AssemblyFileVersion("0.8.2.0")] diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/Resources.Designer.cs b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/Resources.Designer.cs new file mode 100644 index 000000000000..d7beb26c4377 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/Resources.Designer.cs @@ -0,0 +1,225 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace com.insanitydesign.MarkdownViewerPlusPlus.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("com.insanitydesign.MarkdownViewerPlusPlus.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Donate_PayPal_green { + get { + object obj = ResourceManager.GetObject("Donate_PayPal_green", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_clipboard_16x16 { + get { + object obj = ResourceManager.GetObject("fa_clipboard_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_cog_16x16 { + get { + object obj = ResourceManager.GetObject("fa_cog_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_download_16x16 { + get { + object obj = ResourceManager.GetObject("fa_download_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_envelope_16x16 { + get { + object obj = ResourceManager.GetObject("fa_envelope_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_file_pdf_o_16x16 { + get { + object obj = ResourceManager.GetObject("fa_file_pdf_o_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_html5_16x16 { + get { + object obj = ResourceManager.GetObject("fa_html5_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_info_16x16 { + get { + object obj = ResourceManager.GetObject("fa_info_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_paypal_16x16 { + get { + object obj = ResourceManager.GetObject("fa_paypal_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_print_16x16 { + get { + object obj = ResourceManager.GetObject("fa_print_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_refresh_16x16 { + get { + object obj = ResourceManager.GetObject("fa_refresh_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_tv_16x16 { + get { + object obj = ResourceManager.GetObject("fa_tv_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap fa_upload_16x16 { + get { + object obj = ResourceManager.GetObject("fa_upload_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap markdown_16x16_solid { + get { + object obj = ResourceManager.GetObject("markdown_16x16_solid", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap markdown_16x16_solid_bmp { + get { + object obj = ResourceManager.GetObject("markdown_16x16_solid_bmp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to /* Avoid page breaks inside the most common attributes, especially for exports (i.e. PDF) */ + ///td, h1, h2, h3, h4, h5, p, ul, ol, li { + /// page-break-inside: avoid; + ///}. + /// + internal static string MarkdownViewerHTML { + get { + return ResourceManager.GetString("MarkdownViewerHTML", resourceCulture); + } + } + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/Resources.resx b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/Resources.resx new file mode 100644 index 000000000000..5ad70c8afac7 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Properties/Resources.resx @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\fa-download-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\fa-file-pdf-o-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\fa-html5-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\fa-refresh-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\fa-tv-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\MarkdownViewerHTML.css;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + + ..\Resources\markdown-16x16-solid.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\markdown-16x16-solid.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\fa-envelope-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\fa-print-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\fa-upload-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\fa-clipboard-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Donate-PayPal-green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\fa-cog-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\fa-info-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\fa-paypal-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/Donate-PayPal-green.png b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/Donate-PayPal-green.png new file mode 100644 index 0000000000000000000000000000000000000000..e3cb20948506d1b5d43624472fb4be429b481e90 GIT binary patch literal 2199 zcmV;I2x#|-P)Wr_bsKDd#pzAsS zJv}|t*4A?J}9olqRN3(%8L&w%&c8OV`T9 zzhRDNDY_BEqS*MjubShZlmk;|_gG;id-}b|DcW2$_+&E4_U+qgY-~hP6jrQQ!N!dn z*|~G)r0_LOBN~k|Ha2z{huiJOFbqaUM$&Z_i-qj$Y~t}a@pwF4@Avz$+wGSHnHv0w z920RR5BeCqQS%MDKW!r4cPE>^{WpSxe_=Qg#9`G?l?-B|JxI(c{iiSzmAu=yjr!I% zaXDu5;@ab!iyY^Za4lAg3x_p_*k})?)GulROjCmR9KpkQa6X?8fDQY2xuX2M!z{8jbS&^Usq=B*@Inq_wq`ef#!J zD|mq11%ixu3W-zZk8Z@sbS~s@>vsvqTKLN1xA{-_Jx+gm006)C z829-%^ZS2&2`RyoEx6-u1w$X8`_q48GYh!Szl8#AC9%;E-dT$|*6|{pp_)r{ea_&e zlxbrQhl9?}PFAg2g_M%AvNEcxt2uP&5Dtffx88b-#>Pe>kqB8?SsXlgkW;5l5eNj> zuweuB_4Rahbx~GUhN38#rpc~dyC^Cu;>eLBEMLByy?gi4*4Bo{gwu{ zQu4|xuMh|XXlZGgR`70n9;gw%F!xdHHWxkN7Mfe0B_1C^QJ^IMYb?8eD}Oru9qLZJ z&dR0boa+5G0L8PP;phi%Al32kGVD2ci~_Q?V(ys#F!e`&K~GBy1EHT|v4Y#WfFFPB zk973^;i4`iOrhufe#dY!gdEaReaO~JI5{U!=hYuen8jW5S^i&=yYo6g;s1d6Ja^?tJ4liF`T*;oA zCkXbOBu~4GbzePzloF>0{@(mL#r}1SB>VZG^|xeXCP-!X-ajg6IQ=WER><@UJTAc# zcUJN4v7d1A<0D83zx>eXUwrVJlXRZ$dz(9Q z*AU2ihNiAJfD3$pI|~*D1o?%6S=j&rw|yR=vE$4yF?n>w8dQr7(~wv7pDLd@<2P>H zNHUqkFbsmhAe%RDrmL$9o6W|nufEDlFTF%*X(?W>mv`QIhhQ+6ei=^`kov8yt!3M` zZIqUl;&eJ`Z*NbFsi~=9{rdIjy3U?Gd)TpK2j%7EJo3mR#9}dWa&p+cdpGUv?bDd? zlLrByH{3=j(!shf9%n2$OmBb3r2e*9gS2+M&+M#)=(aN`auVAlF4Hvl^NHR3;L&;_ zBOOGdeI&+)FAUT~-&f98tXZ>W%H%_#5TS`U<=Zslcx_Mpa7L!wmfcB!wF>c@jo1=SO?Vy*^6) Z{SQ=}M{Yr(F~tA?002ovPDHLkV1idLFWUeB literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/MarkdownViewerHTML.css b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/MarkdownViewerHTML.css new file mode 100644 index 000000000000..b6db89a808c9 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/MarkdownViewerHTML.css @@ -0,0 +1,4 @@ +/* Avoid page breaks inside the most common attributes, especially for exports (i.e. PDF) */ +td, h1, h2, h3, h4, h5, p, ul, ol, li { + page-break-inside: avoid; +} \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/MarkdownViewerPlusPlus-Options.png b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/MarkdownViewerPlusPlus-Options.png new file mode 100644 index 0000000000000000000000000000000000000000..ca94033a21be44756e9c3df0dbc02de0b1830a7c GIT binary patch literal 13686 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 literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/MarkdownViewerPlusPlus.png b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/MarkdownViewerPlusPlus.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe18003369bc10fd38bae22d00d22ccd9318efa GIT binary patch literal 70035 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 AKL7v# literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-clipboard-16x16.png b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-clipboard-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..0c2095394ecca8c1fda7dc56b79c27a5864bdf91 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}NPtg>E0Cr-5P49$18AspNswPK z10xeND;qlpCl|L*Y)R{)^?ME;J%0ZBqZh9~KKo@94OABG>Eak75#D?HG@pY3gUdxt z*S+_bKKuV)ICRU#Li5RUQVcHZq_;_#8Eu_C(cGrip>n|zofVVCSp+spJr=l7rqrMj xpUrO|yZa|Y^>4=1;wQ~-ng5omu(J#3C9rQ?#xr9Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V009L_L_t(IPmR;PY63wNhT-uKvGJ#q+<oNDQrZn1raL?3rXH@-6OL*tL_I6%sOXx&(1;jAWQt= z99`u|4I`AItLx3CiUNjcAczXKQ1J?%@!I^vwBDnRMBd=v@JtUuK9E(M_KhGFOkhR& zoEPZ3o3Qp}jxui9!8T17ep*P^91tCNdP6i3Kk6i_PMy28_k-!cPgVyf*vMTGW7y^f zZRpLK`vSJ7^U&CXyu*qfnL-av z2WTp4djK71uIR10S^vi1oAX4IQCGK7g>mj5{-Su*#dNsN00000NkvXXu0mjf{_&|j literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-download-16x16.png b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-download-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..a803d25ae060d8cbda39e91173b4738aca6f33a9 GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}MSxF;E07)#AbP^118A{&NswPK z10xfwkcg<5jJlz*wS%*(XJBGUMSW{$--5-YwM#jVGzB%$e1@Eau^d=@yd4htAHJ zE3Vm>_;pL(oetK%P3A7RV#cG#kiK*O-=v$npRoEbShUWbsp5zV=c^wJ aFV7KYFBFuSkf+cE3L#HdKbLh*2~7ZP`BR+$ literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-envelope-16x16.png b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-envelope-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..1d98d676aa06e0525edb54902ad3c3a93c81f355 GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}X@F0NE0Cr?sEn+Q0NScn666=m zz{teH%EvDtAtS4*=I!er7#o*TT36rPHhbBoEeDUDJOA?a_uqfdocnzYs3XJE#W6%e zvh|>+P?G_J>p}U&O~MN_`Wl!jzuPZbIi=f0yzI5RsgR^MuS%TNM2oC4q_KtpmkT}(7PW_TIR+R0 z`@eq1%XQQCp1f1e5d3{jV|xAO2gg|rzRY`YEd0Sa^;hp(_2nDZ1!u7_Ke*HL;H+H0 zb)ovOIL6Sq=Zg%bqYo?$i&!1FMBTyDe`npyFCC_7&u{a!ZgYE6lXWZKY*L8%lVks) qCt2_NyTQQ!9LFi~#m7%8b44!{P0#LT=By}Z;C1rt33 zJtM=93Yk-Zii$j4978PpuU_29*0#LT=By}Z;C1rt33 zJtM=93Yk-ZioSWeIEGmGw_e(q#pEc``jB^$k(m_pL8aa!YOW64-6c)|BJ&;QE9eUZ z-M-0^^jP~wr_iO2xv8rJHf$3W1S(v!C8f; z=L_-_PO;uO%e>`+3u~pwN8Y=|-5TK+T4nPtw9A+r65FNstYaxd?3@QDXV!Y35I+{w zo>y_S+xUMX&(0_5OD3F<-l9-{`NGVneCOQq!|o)%J@d@_@pHzj0c=rX&;0GCnryL| f%HOBX@sH8Aqv>bP0l+XkKRAZJ? literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-print-16x16.png b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-print-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..aadd3f00a57daeb6b8ac44cd231dd5318eea18ef GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}RDe&2E0CrU==O{Y1R5<{666=m zz{teH%ElugC?Y1WX<(XOTCwl&@yj=FJ$V1|>)$ozuKGZQv7RoDArj%aeeQe>4m?NN z?p5pm`)_W!;lR2U|B3FCU4A7pHf*h6S*W5qXQ}d{sdqQGsw|4XC^J9dgeY@zy>sl@ zQyX4H#V~HK&~6CYFm2P#=l2tE@@}9Cn4hOgXRr<4222FsSko$>VSS@ N@O1TaS?83{1OPy3U0VPE literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-tv-16x16.png b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-tv-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..495d935504f178d69fd6dae55aae8017ecfa7ab5 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZ1=7TWg9|k5fU5aQg8YIR z7@62aEu&)#%IALm`S-}emE}MgQ%@Ji5RT~NgoegBu@CyfCzB^7t_EWW(%W uX2YLq9y3xIU98^S-F-cQO*w$mg@cDd&Q0pCk+4`W$RVDtelF{r5}E)CpDgbH literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-upload-16x16.png b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/fa-upload-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..d57165d6a8f4d698309650eceb2ca2695edbbbbe GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}W`IwKE0CrSP|x|)3$#h8B*-tA zfsvI>Ku}0bURhOFPv6kQE-W%OzOKG?(fP~QA3XZ{{pW9^GBt6a>P$};#}En0*n^!y zO$rRI7t^iXx&s5IiGBZXZzLtfX6rsvSt?XUpqJ~ozsaxN6OPW^l+BS}(N+*(*btt} zu>KZ9+*a{BQ*zgAt(M)Lw|m3MDCLuXQ{Mh`H0qKJtO?tq`)cNkt2*jZXKNWh$Ma=} S-)Jre1%{`qpUXO@geCx1zDtw< literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/markdown-16x16-solid.bmp b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/markdown-16x16-solid.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d6125e039e4304b6ec5de4b2da847852a8c2036b GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C76%cB_#hZ2@PCj2D=RCQ(+JZfDMmKV!NH-vz8)?D zWCKMYTw`NnR#sNH6odg(01PJ}+rYp8NCMdq?ItEBpFVwBwrm+ABO|gFh&qLHe%ty8hQ~ln(ds$dm_UzdMG!Vafh=0Y! h#es$ZNuXl5f05b9RuIVs`i@AIKxL4i00+QeApp!`e~SPB literal 0 HcmV?d00001 diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/markdown-16x16-solid.png b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/Resources/markdown-16x16-solid.png new file mode 100644 index 0000000000000000000000000000000000000000..c5d354af0aa115e8c2e36c64aa3705ba3b83f01a GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXJ~A~99;!ew9?bX zF~q`u>7;|ahYWaJiyxlYnQg%AbJ22_13Po!sZOuh1 +/// @see https://gist.github.com/amgine/2395987 +/// +namespace com.insanitydesign.MarkdownViewerPlusPlus.Windows +{ + /// + /// + /// + [StructLayout(LayoutKind.Sequential)] + public struct NMHDR + { + public IntPtr hwndFrom; + public IntPtr idFrom; + public int code; + } + + /// + /// + /// + public enum WindowsMessage + { + WM_NULL = 0x0000, + WM_CREATE = 0x0001, + WM_DESTROY = 0x0002, + WM_MOVE = 0x0003, + WM_SIZE = 0x0005, + WM_ACTIVATE = 0x0006, + WM_SETFOCUS = 0x0007, + WM_KILLFOCUS = 0x0008, + WM_ENABLE = 0x000A, + WM_SETREDRAW = 0x000B, + WM_SETTEXT = 0x000C, + WM_GETTEXT = 0x000D, + WM_GETTEXTLENGTH = 0x000E, + WM_PAINT = 0x000F, + WM_CLOSE = 0x0010, + WM_QUERYENDSESSION = 0x0011, + WM_QUERYOPEN = 0x0013, + WM_ENDSESSION = 0x0016, + WM_QUIT = 0x0012, + WM_ERASEBKGND = 0x0014, + WM_SYSCOLORCHANGE = 0x0015, + WM_SHOWWINDOW = 0x0018, + WM_WININICHANGE = 0x001A, + WM_SETTINGCHANGE = WM_WININICHANGE, + WM_DEVMODECHANGE = 0x001B, + WM_ACTIVATEAPP = 0x001C, + WM_FONTCHANGE = 0x001D, + WM_TIMECHANGE = 0x001E, + WM_CANCELMODE = 0x001F, + WM_SETCURSOR = 0x0020, + WM_MOUSEACTIVATE = 0x0021, + WM_CHILDACTIVATE = 0x0022, + WM_QUEUESYNC = 0x0023, + WM_GETMINMAXINFO = 0x0024, + WM_PAINTICON = 0x0026, + WM_ICONERASEBKGND = 0x0027, + WM_NEXTDLGCTL = 0x0028, + WM_SPOOLERSTATUS = 0x002A, + WM_DRAWITEM = 0x002B, + WM_MEASUREITEM = 0x002C, + WM_DELETEITEM = 0x002D, + WM_VKEYTOITEM = 0x002E, + WM_CHARTOITEM = 0x002F, + WM_SETFONT = 0x0030, + WM_GETFONT = 0x0031, + WM_SETHOTKEY = 0x0032, + WM_GETHOTKEY = 0x0033, + WM_QUERYDRAGICON = 0x0037, + WM_COMPAREITEM = 0x0039, + WM_GETOBJECT = 0x003D, + WM_COMPACTING = 0x0041, + WM_COMMNOTIFY = 0x0044, + WM_WINDOWPOSCHANGING = 0x0046, + WM_WINDOWPOSCHANGED = 0x0047, + WM_POWER = 0x0048, + WM_COPYDATA = 0x004A, + WM_CANCELJOURNAL = 0x004B, + WM_NOTIFY = 0x004E, + WM_INPUTLANGCHANGEREQUEST = 0x0050, + WM_INPUTLANGCHANGE = 0x0051, + WM_TCARD = 0x0052, + WM_HELP = 0x0053, + WM_USERCHANGED = 0x0054, + WM_NOTIFYFORMAT = 0x0055, + WM_CONTEXTMENU = 0x007B, + WM_STYLECHANGING = 0x007C, + WM_STYLECHANGED = 0x007D, + WM_DISPLAYCHANGE = 0x007E, + WM_GETICON = 0x007F, + WM_SETICON = 0x0080, + WM_NCCREATE = 0x0081, + WM_NCDESTROY = 0x0082, + WM_NCCALCSIZE = 0x0083, + WM_NCHITTEST = 0x0084, + WM_NCPAINT = 0x0085, + WM_NCACTIVATE = 0x0086, + WM_GETDLGCODE = 0x0087, + WM_SYNCPAINT = 0x0088, + + + WM_NCMOUSEMOVE = 0x00A0, + WM_NCLBUTTONDOWN = 0x00A1, + WM_NCLBUTTONUP = 0x00A2, + WM_NCLBUTTONDBLCLK = 0x00A3, + WM_NCRBUTTONDOWN = 0x00A4, + WM_NCRBUTTONUP = 0x00A5, + WM_NCRBUTTONDBLCLK = 0x00A6, + WM_NCMBUTTONDOWN = 0x00A7, + WM_NCMBUTTONUP = 0x00A8, + WM_NCMBUTTONDBLCLK = 0x00A9, + WM_NCXBUTTONDOWN = 0x00AB, + WM_NCXBUTTONUP = 0x00AC, + WM_NCXBUTTONDBLCLK = 0x00AD, + + WM_INPUT_DEVICE_CHANGE = 0x00FE, + WM_INPUT = 0x00FF, + + WM_KEYFIRST = 0x0100, + WM_KEYDOWN = 0x0100, + WM_KEYUP = 0x0101, + WM_CHAR = 0x0102, + WM_DEADCHAR = 0x0103, + WM_SYSKEYDOWN = 0x0104, + WM_SYSKEYUP = 0x0105, + WM_SYSCHAR = 0x0106, + WM_SYSDEADCHAR = 0x0107, + WM_UNICHAR = 0x0109, + WM_KEYLAST = 0x0109, + + WM_IME_STARTCOMPOSITION = 0x010D, + WM_IME_ENDCOMPOSITION = 0x010E, + WM_IME_COMPOSITION = 0x010F, + WM_IME_KEYLAST = 0x010F, + + WM_INITDIALOG = 0x0110, + WM_COMMAND = 0x0111, + WM_SYSCOMMAND = 0x0112, + WM_TIMER = 0x0113, + WM_HSCROLL = 0x0114, + WM_VSCROLL = 0x0115, + WM_INITMENU = 0x0116, + WM_INITMENUPOPUP = 0x0117, + WM_MENUSELECT = 0x011F, + WM_MENUCHAR = 0x0120, + WM_ENTERIDLE = 0x0121, + WM_MENURBUTTONUP = 0x0122, + WM_MENUDRAG = 0x0123, + WM_MENUGETOBJECT = 0x0124, + WM_UNINITMENUPOPUP = 0x0125, + WM_MENUCOMMAND = 0x0126, + + WM_CHANGEUISTATE = 0x0127, + WM_UPDATEUISTATE = 0x0128, + WM_QUERYUISTATE = 0x0129, + + WM_CTLCOLORMSGBOX = 0x0132, + WM_CTLCOLOREDIT = 0x0133, + WM_CTLCOLORLISTBOX = 0x0134, + WM_CTLCOLORBTN = 0x0135, + WM_CTLCOLORDLG = 0x0136, + WM_CTLCOLORSCROLLBAR = 0x0137, + WM_CTLCOLORSTATIC = 0x0138, + MN_GETHMENU = 0x01E1, + + WM_MOUSEFIRST = 0x0200, + WM_MOUSEMOVE = 0x0200, + WM_LBUTTONDOWN = 0x0201, + WM_LBUTTONUP = 0x0202, + WM_LBUTTONDBLCLK = 0x0203, + WM_RBUTTONDOWN = 0x0204, + WM_RBUTTONUP = 0x0205, + WM_RBUTTONDBLCLK = 0x0206, + WM_MBUTTONDOWN = 0x0207, + WM_MBUTTONUP = 0x0208, + WM_MBUTTONDBLCLK = 0x0209, + WM_MOUSEWHEEL = 0x020A, + WM_XBUTTONDOWN = 0x020B, + WM_XBUTTONUP = 0x020C, + WM_XBUTTONDBLCLK = 0x020D, + WM_MOUSEHWHEEL = 0x020E, + + WM_PARENTNOTIFY = 0x0210, + WM_ENTERMENULOOP = 0x0211, + WM_EXITMENULOOP = 0x0212, + + WM_NEXTMENU = 0x0213, + WM_SIZING = 0x0214, + WM_CAPTURECHANGED = 0x0215, + WM_MOVING = 0x0216, + + WM_POWERBROADCAST = 0x0218, + + WM_DEVICECHANGE = 0x0219, + + WM_MDICREATE = 0x0220, + WM_MDIDESTROY = 0x0221, + WM_MDIACTIVATE = 0x0222, + WM_MDIRESTORE = 0x0223, + WM_MDINEXT = 0x0224, + WM_MDIMAXIMIZE = 0x0225, + WM_MDITILE = 0x0226, + WM_MDICASCADE = 0x0227, + WM_MDIICONARRANGE = 0x0228, + WM_MDIGETACTIVE = 0x0229, + + + WM_MDISETMENU = 0x0230, + WM_ENTERSIZEMOVE = 0x0231, + WM_EXITSIZEMOVE = 0x0232, + WM_DROPFILES = 0x0233, + WM_MDIREFRESHMENU = 0x0234, + + WM_IME_SETCONTEXT = 0x0281, + WM_IME_NOTIFY = 0x0282, + WM_IME_CONTROL = 0x0283, + WM_IME_COMPOSITIONFULL = 0x0284, + WM_IME_SELECT = 0x0285, + WM_IME_CHAR = 0x0286, + WM_IME_REQUEST = 0x0288, + WM_IME_KEYDOWN = 0x0290, + WM_IME_KEYUP = 0x0291, + + WM_MOUSEHOVER = 0x02A1, + WM_MOUSELEAVE = 0x02A3, + WM_NCMOUSEHOVER = 0x02A0, + WM_NCMOUSELEAVE = 0x02A2, + + WM_WTSSESSION_CHANGE = 0x02B1, + + WM_TABLET_FIRST = 0x02c0, + WM_TABLET_LAST = 0x02df, + + WM_CUT = 0x0300, + WM_COPY = 0x0301, + WM_PASTE = 0x0302, + WM_CLEAR = 0x0303, + WM_UNDO = 0x0304, + WM_RENDERFORMAT = 0x0305, + WM_RENDERALLFORMATS = 0x0306, + WM_DESTROYCLIPBOARD = 0x0307, + WM_DRAWCLIPBOARD = 0x0308, + WM_PAINTCLIPBOARD = 0x0309, + WM_VSCROLLCLIPBOARD = 0x030A, + WM_SIZECLIPBOARD = 0x030B, + WM_ASKCBFORMATNAME = 0x030C, + WM_CHANGECBCHAIN = 0x030D, + WM_HSCROLLCLIPBOARD = 0x030E, + WM_QUERYNEWPALETTE = 0x030F, + WM_PALETTEISCHANGING = 0x0310, + WM_PALETTECHANGED = 0x0311, + WM_HOTKEY = 0x0312, + + WM_PRINT = 0x0317, + WM_PRINTCLIENT = 0x0318, + + WM_APPCOMMAND = 0x0319, + + WM_THEMECHANGED = 0x031A, + + WM_CLIPBOARDUPDATE = 0x031D, + + WM_DWMCOMPOSITIONCHANGED = 0x031E, + WM_DWMNCRENDERINGCHANGED = 0x031F, + WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320, + WM_DWMWINDOWMAXIMIZEDCHANGE = 0x0321, + + WM_GETTITLEBARINFOEX = 0x033F, + + WM_HANDHELDFIRST = 0x0358, + WM_HANDHELDLAST = 0x035F, + + WM_AFXFIRST = 0x0360, + WM_AFXLAST = 0x037F, + + WM_PENWINFIRST = 0x0380, + WM_PENWINLAST = 0x038F, + + WM_APP = 0x8000, + + WM_USER = 0x0400, + + WM_REFLECT = WM_USER + 0x1C00, + } +} diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/app.config b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/app.config new file mode 100644 index 000000000000..5d3c109e1c4e --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/packages.config b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/packages.config new file mode 100644 index 000000000000..3075f92be221 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/MarkdownViewerPlusPlus/packages.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/README.md b/plugins/markdownViewerPlusPlus/README.md new file mode 100644 index 000000000000..725c014e18f9 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/README.md @@ -0,0 +1,108 @@ +# MarkdownViewerPlusPlus [![Build status](https://ci.appveyor.com/api/projects/status/jkuuth039vioms74?svg=true)](https://ci.appveyor.com/project/nea/markdownviewerplusplus) [![GitHub license](https://img.shields.io/github/license/nea/MarkdownViewerPlusPlus.svg)](https://github.com/nea/MarkdownViewerPlusPlus/blob/master/LICENSE.md) [![GitHub (pre-)release](https://img.shields.io/badge/release-0.8.2-yellow.svg)](https://github.com/nea/MarkdownViewerPlusPlus/releases/tag/0.8.2) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/insanitydesign) +A Notepad++ Plugin to view a Markdown file rendered on-the-fly + +## Features +* Dockable panel (toggle) with a rendered HTML of the currently selected file/tab +* CommonMark compliant ([0.28][4]) +* Synchronized scrolling +* Custom CSS integration +* HTML and PDF Export +* Notepad++ Unicode Plugin + +## Latest Versions +* 0.8.2 + * Merged a lot of bugfixes and improvements, thanks to [monoblaine](https://github.com/monoblaine) + * Updated [Markdig][3] to v0.15.0, [PDFSharp][5] to v1.50.4845-RC2a and [HTMLRenderer][6] accordingly + * Added a shortcut to _Options_ and _About_ to MarkdownViewerPanel +* 0.8.1 + * Fixed a bug cutting off text after 10000 characters (#60) + * Changed parsing of custom CSS to recognize _@import_ statements and have them lead (#35) +* 0.8.0 + * Changed CommonMark.net converter to [Markdig][3] + * Updated [PDFSharp][5] and [HTMLRenderer][6] accordingly + +Download the latest [release here][9]. For a full version history go [here][10]. + +## Installation +Download a [release version][9] and copy the included **MarkdownViewerPlusPlus.dll** to the *plugins* sub-folder at your Notepad++ installation directory. The plugin adds a small Markdown icon ![Markdown icon](https://raw.githubusercontent.com/nea/MarkdownViewerPlusPlus/master/MarkdownViewerPlusPlus/Resources/markdown-16x16-solid.png) to the toolbar to toggle the viewer as dockable panel. + +### Plugin Manager +If you have the [Plugin Manager][13] installed you can search for MarkdownViewer++ and install it via that plugin. + +### Compatibility +This plugin requires at least +* Notepad++ 32-bit/64-bit +* Windows +* .NET Framework 4.0 or above + +It has been tested under the following conditions +* Notepad++ 7.5.6 32-bit and 64-bit +* Windows 10 Professional (64-bit) + +## Usage +To open the MarkdownViewer++ you can +* click the toolbar icon ![Markdown icon](https://raw.githubusercontent.com/nea/MarkdownViewerPlusPlus/master/MarkdownViewerPlusPlus/Resources/markdown-16x16-solid.png), +* use the shortcut _Ctrl+Shift+M_ +* or open it via the **Plugins** sub-menu + +To synchronize the scrolling between the Notepad++ editor view and the rendered markdown, you can enable the option via the **Plugins** sub-menu. The made selection will be stored and loaded in future sessions. + +![MarkdownViewer++](https://raw.githubusercontent.com/nea/MarkdownViewerPlusPlus/master/MarkdownViewerPlusPlus/Resources/MarkdownViewerPlusPlus.png) + +### Options +The MarkdownViewer++ offers several options to customize your plugin experience. You can open the options dialog via the **Plugins** sub-menu. + +![MarkdownViewer++ Options](https://raw.githubusercontent.com/nea/MarkdownViewerPlusPlus/master/MarkdownViewerPlusPlus/Resources/MarkdownViewerPlusPlus-Options.png) + +#### General +On the **General** tab you can configure the file extensions the MarkdownViewer++ renderer should actually display. If the box is *empty* all files will be rendered. If you want to limit the rendering to certain file extensions list them in the textbox as comma-separated list without leading dot. + +For example, if you only want to render *txt*, *log* and *md* files just type in "txt,log,md". + +Please note that only file extensions are compared and no certain mime types or anything. If a text document is not named *XYZ.txt* it will not be rendered. + +#### HTML +On the **HTML** tab you can fill in *Custom CSS*, which is used when rendering the MarkdownViewer++ preview as well as the exported HTML. Therefore, you are able to e.g. change bullet-point-list icons or sizes of headlines. The custom CSS textbox is limited to 32767 characters. + +#### PDF +On the **PDF** tab you can set the *orientation* and *page size* of the exported PDF. The content is provided by the [PDFSharp][5] enumerations. + +Additionally, the margins for *top*, *right*, *bottom* and *left* can be set for the exported PDF file. + +### Highlighting +MarkdownViewer++ adds no markdown highlighting to Notepad++ itself. But you might find the [user-defined syntax highlighting by Edditoria][12] helpful. + +## License and Credits +The MarkdownViewerPlusPlus is released under the MIT license. + +This Notepad++ plugin integrates the sources of multiple other libraries, because of issues with the library merging process. Credits and thanks to all the developers working on these great projects: +* The plugin is based on the [Notepad++ PluginPack.net][2] by kbilsted provided under the Apache-2.0 license. +* The renderer uses + * [Markdig][3] by lunet-io provided under the BSD-2-Clause license + * [HTMLRenderer.WinForms][6] by ArthurHub provided under the BSD-3-Clause license +* The PDF Exporter uses + * [PDFSharp][5] by empira Software GmbH provided under the MIT license + * [HTMLRenderer.PdfSharp][6] by ArthurHub provided under the BSD-3-Clause license +* The SVG renderer uses [SVG.NET][11] by vvvv provided under the Microsoft Public License +* The menu icons are by [FontAwesome][7] provided under the SIL OFL 1.1 license +* The Markdown icon is by [dcurtis][8] provided under the CC0-1.0 license + +## Disclaimer +This source and the whole package comes without warranty. It may or may not harm your computer or cell phone. Please use with care. Any damage cannot be related back to the author. The source has been tested on a virtual environment and scanned for viruses and has passed all tests. + +## Personal Note +*I don't know if this is very useful for a lot of people but I wanted something in private to quickly write and see some formatted Markdown documents. As I was not able to find something similar very quickly I created this project. I hope this proves useful to you... with all its Bugs and Issues ;) If you like it you can give me a shout at [INsanityDesign][1] or let me know via this repository.* + + [1]: http://www.insanitydesign.com/ + [2]: https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net + [3]: https://github.com/lunet-io/markdig + [4]: http://spec.commonmark.org/0.28/ + [5]: http://www.pdfsharp.net/ + [6]: https://htmlrenderer.codeplex.com/ + [7]: http://fontawesome.io/ + [8]: https://github.com/dcurtis/markdown-mark + [9]: https://github.com/nea/MarkdownViewerPlusPlus/releases + [10]: https://github.com/nea/MarkdownViewerPlusPlus/wiki/Version-History + [11]: https://github.com/vvvv/SVG + [12]: https://github.com/Edditoria/markdown-plus-plus + [13]: https://bruderste.in/npp/pm/ diff --git a/plugins/markdownViewerPlusPlus/_config.yml b/plugins/markdownViewerPlusPlus/_config.yml new file mode 100644 index 000000000000..c4192631f25b --- /dev/null +++ b/plugins/markdownViewerPlusPlus/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/appveyor.yml b/plugins/markdownViewerPlusPlus/appveyor.yml new file mode 100644 index 000000000000..f7ec218f50a6 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/appveyor.yml @@ -0,0 +1,15 @@ +version: 0.8.0.{build} + +before_build: + - ps: nuget restore + +platform: + - x86 + - x64 + +configuration: + - Debug + +build: + parallel: true + verbosity: minimal diff --git a/plugins/markdownViewerPlusPlus/license/Apache-2.0-License.md b/plugins/markdownViewerPlusPlus/license/Apache-2.0-License.md new file mode 100644 index 000000000000..f37153b1d727 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/license/Apache-2.0-License.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/license/HtmlRenderer-License.md b/plugins/markdownViewerPlusPlus/license/HtmlRenderer-License.md new file mode 100644 index 000000000000..6cb040b77a1e --- /dev/null +++ b/plugins/markdownViewerPlusPlus/license/HtmlRenderer-License.md @@ -0,0 +1,30 @@ +Copyright (c) 2009, José Manuel Menéndez Poo + +Copyright (c) 2013, Arthur Teplitzki + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + Neither the name of the menendezpoo.com, ArthurHub nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/license/Markdig-License.md b/plugins/markdownViewerPlusPlus/license/Markdig-License.md new file mode 100644 index 000000000000..162a271a553a --- /dev/null +++ b/plugins/markdownViewerPlusPlus/license/Markdig-License.md @@ -0,0 +1,23 @@ +Copyright (c) 2016, Alexandre Mutel +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification +, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/license/Ms-PL-License.md b/plugins/markdownViewerPlusPlus/license/Ms-PL-License.md new file mode 100644 index 000000000000..da3dc935e5cb --- /dev/null +++ b/plugins/markdownViewerPlusPlus/license/Ms-PL-License.md @@ -0,0 +1,31 @@ +Microsoft Public License (Ms-PL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + +1. Definitions + +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. + +A "contribution" is the original software, or any additions or changes to the software. + +A "contributor" is any person that distributes its contribution under this license. + +"Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + +(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + +(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + +(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + +(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + +(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + +(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + +(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/license/OFL.txt b/plugins/markdownViewerPlusPlus/license/OFL.txt new file mode 100644 index 000000000000..1456c1809da6 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/license/OFL.txt @@ -0,0 +1,97 @@ +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (). + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/plugins/markdownViewerPlusPlus/license/PDFSharp-License.md b/plugins/markdownViewerPlusPlus/license/PDFSharp-License.md new file mode 100644 index 000000000000..72da32ea6a69 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/license/PDFSharp-License.md @@ -0,0 +1,7 @@ +Copyright (c) 2005-2009 empira Software GmbH + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm b/plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm new file mode 100644 index 000000000000..c51d0d325758 --- /dev/null +++ b/plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm @@ -0,0 +1,703 @@ +#import +#import + +#include "windows.h" +#include "PluginInterface.h" +#include "Docking.h" +#include "handle_registry.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +static constexpr int kCommandCount = 6; +static constexpr int kToggleCommand = 0; +static constexpr int kSyncCommand = 2; +static constexpr int kOptionsCommand = 4; +static constexpr int kAboutCommand = 5; + +static NppData sNppData{}; +static FuncItem sFuncItems[kCommandCount]{}; +static ShortcutKey sToggleShortcut{true, false, true, 'M'}; +static HWND sPreviewHwnd = nullptr; +static WKWebView* sWebView = nil; +static bool sVisible = false; +static bool sRenderDirty = true; + +struct MarkdownViewerConfig +{ + bool synchronizeScrolling = false; + bool includeNewFiles = true; + std::wstring fileExtensions; + std::wstring customCss; + std::wstring iniPath; +}; + +static MarkdownViewerConfig sConfig; + +static NSString* wideToNSString(const std::wstring& value) +{ + return [[NSString alloc] initWithBytes:value.data() + length:value.size() * sizeof(wchar_t) + encoding:NSUTF32LittleEndianStringEncoding] ?: @""; +} + +static std::wstring nsStringToWide(NSString* value) +{ + if (!value) + return L""; + NSData* data = [value dataUsingEncoding:NSUTF32LittleEndianStringEncoding]; + if (!data || data.length == 0) + return L""; + return std::wstring(reinterpret_cast(data.bytes), + data.length / sizeof(wchar_t)); +} + +static std::string nsStringToUTF8(NSString* value) +{ + return value ? std::string(value.UTF8String ? value.UTF8String : "") : ""; +} + +static std::string wideToUTF8(const std::wstring& value) +{ + return nsStringToUTF8(wideToNSString(value)); +} + +static std::wstring getNppString(UINT message) +{ + wchar_t buffer[MAX_PATH] = {}; + ::SendMessageW(sNppData._nppHandle, message, MAX_PATH, reinterpret_cast(buffer)); + return buffer; +} + +static std::wstring currentDirectory() +{ + return getNppString(NPPM_GETCURRENTDIRECTORY); +} + +static std::wstring currentFileName() +{ + return getNppString(NPPM_GETFILENAME); +} + +static HWND currentScintilla() +{ + int which = 0; + ::SendMessageW(sNppData._nppHandle, NPPM_GETCURRENTSCINTILLA, 0, reinterpret_cast(&which)); + return which == 0 ? sNppData._scintillaMainHandle : sNppData._scintillaSecondHandle; +} + +static std::string activeEditorText() +{ + HWND sci = currentScintilla(); + if (!sci) + return ""; + LRESULT length = ::SendMessageW(sci, SCI_GETTEXTLENGTH, 0, 0); + if (length <= 0) + return ""; + std::vector text(static_cast(length) + 1, '\0'); + ::SendMessageW(sci, SCI_GETTEXT, static_cast(text.size()), + reinterpret_cast(text.data())); + return text.data(); +} + +static void loadConfig() +{ + wchar_t configDir[MAX_PATH] = {}; + ::SendMessageW(sNppData._nppHandle, NPPM_GETPLUGINSCONFIGDIR, MAX_PATH, + reinterpret_cast(configDir)); + sConfig.iniPath = configDir; + if (!sConfig.iniPath.empty() && sConfig.iniPath.back() != L'/' && sConfig.iniPath.back() != L'\\') + sConfig.iniPath += L'/'; + sConfig.iniPath += L"MarkdownViewerPlusPlus.ini"; + + sConfig.synchronizeScrolling = ::GetPrivateProfileIntW( + L"MarkdownViewerPlusPlus", L"synchronizeScrolling", 0, sConfig.iniPath.c_str()) != 0; + sConfig.includeNewFiles = ::GetPrivateProfileIntW( + L"MarkdownViewerPlusPlus", L"includeNewFiles", 1, sConfig.iniPath.c_str()) != 0; + + wchar_t extensions[32768] = {}; + ::GetPrivateProfileStringW(L"MarkdownViewerPlusPlus", L"fileExtensions", L"", + extensions, 32768, sConfig.iniPath.c_str()); + sConfig.fileExtensions = extensions; + + wchar_t css[32768] = {}; + ::GetPrivateProfileStringW(L"MarkdownViewerPlusPlus", L"customCss", L"", + css, 32768, sConfig.iniPath.c_str()); + sConfig.customCss = css; +} + +static void saveConfig() +{ + if (sConfig.iniPath.empty()) + return; + ::WritePrivateProfileStringW(L"MarkdownViewerPlusPlus", L"synchronizeScrolling", + sConfig.synchronizeScrolling ? L"1" : L"0", sConfig.iniPath.c_str()); + ::WritePrivateProfileStringW(L"MarkdownViewerPlusPlus", L"includeNewFiles", + sConfig.includeNewFiles ? L"1" : L"0", sConfig.iniPath.c_str()); + ::WritePrivateProfileStringW(L"MarkdownViewerPlusPlus", L"fileExtensions", + sConfig.fileExtensions.c_str(), sConfig.iniPath.c_str()); + ::WritePrivateProfileStringW(L"MarkdownViewerPlusPlus", L"customCss", + sConfig.customCss.c_str(), sConfig.iniPath.c_str()); +} + +static std::string trim(const std::string& value) +{ + size_t start = 0; + while (start < value.size() && std::isspace(static_cast(value[start]))) + ++start; + size_t end = value.size(); + while (end > start && std::isspace(static_cast(value[end - 1]))) + --end; + return value.substr(start, end - start); +} + +static std::string escapeHtml(const std::string& value) +{ + std::string escaped; + escaped.reserve(value.size()); + for (char ch : value) + { + switch (ch) + { + case '&': escaped += "&"; break; + case '<': escaped += "<"; break; + case '>': escaped += ">"; break; + case '"': escaped += """; break; + default: escaped += ch; break; + } + } + return escaped; +} + +static std::string renderInlineMarkdown(const std::string& value) +{ + std::string rendered = escapeHtml(value); + rendered = std::regex_replace(rendered, std::regex("!\\[([^\\]]*)\\]\\(([^\\)]+)\\)"), + "\"$1\""); + rendered = std::regex_replace(rendered, std::regex("\\[([^\\]]+)\\]\\(([^\\)]+)\\)"), + "$1"); + rendered = std::regex_replace(rendered, std::regex("`([^`]+)`"), "$1"); + rendered = std::regex_replace(rendered, std::regex("\\*\\*([^*]+)\\*\\*"), "$1"); + rendered = std::regex_replace(rendered, std::regex("\\*([^*]+)\\*"), "$1"); + return rendered; +} + +static std::string markdownToHtml(const std::string& markdown) +{ + std::istringstream input(markdown); + std::ostringstream html; + std::string line; + std::string paragraph; + bool inList = false; + bool inCode = false; + + auto flushParagraph = [&]() { + if (!paragraph.empty()) + { + html << "

" << renderInlineMarkdown(paragraph) << "

\n"; + paragraph.clear(); + } + }; + auto closeList = [&]() { + if (inList) + { + html << "\n"; + inList = false; + } + }; + + while (std::getline(input, line)) + { + if (!line.empty() && line.back() == '\r') + line.pop_back(); + std::string stripped = trim(line); + + if (stripped.rfind("```", 0) == 0) + { + flushParagraph(); + closeList(); + if (inCode) + html << "\n"; + else + html << "
";
+			inCode = !inCode;
+			continue;
+		}
+
+		if (inCode)
+		{
+			html << escapeHtml(line) << "\n";
+			continue;
+		}
+
+		if (stripped.empty())
+		{
+			flushParagraph();
+			closeList();
+			continue;
+		}
+
+		size_t headingLevel = 0;
+		while (headingLevel < stripped.size() && headingLevel < 6 && stripped[headingLevel] == '#')
+			++headingLevel;
+		if (headingLevel > 0 && headingLevel < stripped.size() && stripped[headingLevel] == ' ')
+		{
+			flushParagraph();
+			closeList();
+			std::string heading = trim(stripped.substr(headingLevel + 1));
+			html << "" << renderInlineMarkdown(heading)
+			     << "\n";
+			continue;
+		}
+
+		if ((stripped.rfind("- ", 0) == 0) || (stripped.rfind("* ", 0) == 0))
+		{
+			flushParagraph();
+			if (!inList)
+			{
+				html << "
    \n"; + inList = true; + } + html << "
  • " << renderInlineMarkdown(trim(stripped.substr(2))) << "
  • \n"; + continue; + } + + closeList(); + if (!paragraph.empty()) + paragraph += " "; + paragraph += stripped; + } + + flushParagraph(); + closeList(); + if (inCode) + html << "
\n"; + return html.str(); +} + +static std::string baseCss() +{ + return R"CSS( +body { + font: -apple-system-body; + line-height: 1.5; + margin: 18px; + color: #202124; + background: #ffffff; +} +h1, h2, h3, h4, h5, h6 { line-height: 1.25; margin: 1em 0 0.45em; } +pre { + background: #f6f8fa; + border-radius: 6px; + overflow: auto; + padding: 12px; +} +code { + background: #f6f8fa; + border-radius: 4px; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, monospace; + padding: 0.1em 0.3em; +} +pre code { padding: 0; } +img { max-width: 100%; } +a { color: #0969da; } +blockquote { + border-left: 4px solid #d0d7de; + color: #57606a; + margin-left: 0; + padding-left: 12px; +} +@media (prefers-color-scheme: dark) { + body { color: #d4d4d4; background: #1e1e1e; } + pre, code { background: #2d2d2d; } + a { color: #6cb6ff; } + blockquote { border-left-color: #555; color: #aaa; } +} +)CSS"; +} + +static std::string buildHtmlDocument(const std::string& body, const std::wstring& title) +{ + std::string css = baseCss(); + std::string customCss = wideToUTF8(sConfig.customCss); + std::smatch match; + std::regex importPattern("(@import\\s+[^;]+;)"); + std::string imports; + std::string remainingCss = customCss; + while (std::regex_search(remainingCss, match, importPattern)) + { + imports += match.str(1); + imports += "\n"; + remainingCss = match.prefix().str() + match.suffix().str(); + } + + std::ostringstream html; + html << "\n\n"; + html << "\n"; + html << "" << escapeHtml(wideToUTF8(title)) << "\n"; + html << "\n"; + html << "\n" << body << "\n\n"; + return html.str(); +} + +static std::wstring extensionOf(const std::wstring& fileName) +{ + size_t slash = fileName.find_last_of(L"/\\"); + size_t dot = fileName.find_last_of(L'.'); + if (dot == std::wstring::npos || (slash != std::wstring::npos && dot < slash) || dot + 1 >= fileName.size()) + return L""; + std::wstring ext = fileName.substr(dot + 1); + std::transform(ext.begin(), ext.end(), ext.begin(), towlower); + return ext; +} + +static bool extensionAllowed(const std::wstring& fileName) +{ + std::wstring ext = extensionOf(fileName); + if (sConfig.fileExtensions.empty()) + return true; + if (ext.empty()) + return sConfig.includeNewFiles && (fileName.empty() || fileName.rfind(L"new ", 0) == 0); + + std::wstring configured = sConfig.fileExtensions; + std::transform(configured.begin(), configured.end(), configured.begin(), towlower); + std::wistringstream parts(configured); + std::wstring part; + while (std::getline(parts, part, L',')) + { + part.erase(part.begin(), std::find_if(part.begin(), part.end(), [](wchar_t ch) { + return !iswspace(ch) && ch != L'.'; + })); + part.erase(std::find_if(part.rbegin(), part.rend(), [](wchar_t ch) { + return !iswspace(ch); + }).base(), part.end()); + if (part == ext) + return true; + } + return false; +} + +static void loadHtml(const std::string& html, const std::wstring& directory) +{ + if (!sWebView) + return; + NSString* htmlString = [NSString stringWithUTF8String:html.c_str()]; + NSURL* baseURL = nil; + if (!directory.empty()) + baseURL = [NSURL fileURLWithPath:wideToNSString(directory) isDirectory:YES]; + [sWebView loadHTMLString:htmlString ?: @"" baseURL:baseURL]; +} + +static void scrollPreviewByRatio(double ratio) +{ + if (!sWebView) + return; + if (ratio < 0.0) ratio = 0.0; + if (ratio > 1.0) ratio = 1.0; + NSString* js = [NSString stringWithFormat: + @"window.scrollTo(0, Math.max(0, " + "((document.documentElement.scrollHeight || document.body.scrollHeight) - window.innerHeight) * %.12f));", + ratio]; + [sWebView evaluateJavaScript:js completionHandler:nil]; +} + +static void updateScrollPosition() +{ + if (!sConfig.synchronizeScrolling || !sVisible) + return; + HWND sci = currentScintilla(); + if (!sci) + return; + double firstVisible = static_cast(::SendMessageW(sci, SCI_GETFIRSTVISIBLELINE, 0, 0)); + double linesOnScreen = static_cast(::SendMessageW(sci, SCI_LINESONSCREEN, 0, 0)); + double lineCount = static_cast(::SendMessageW(sci, SCI_GETLINECOUNT, 0, 0)); + double denominator = std::max(1.0, lineCount - linesOnScreen); + scrollPreviewByRatio(firstVisible / denominator); +} + +static void renderPreview(bool force) +{ + if (!sVisible || !sWebView) + return; + if (!force && !sRenderDirty) + return; + + std::wstring fileName = currentFileName(); + std::wstring directory = currentDirectory(); + if (!extensionAllowed(fileName)) + { + std::ostringstream message; + message << "

Your configuration settings do not include the currently selected file extension.
" + << "The rendered file extensions are '" << escapeHtml(wideToUTF8(sConfig.fileExtensions)) << "'.
" + << "The current file is '" << escapeHtml(wideToUTF8(fileName)) << "'.

"; + loadHtml(buildHtmlDocument(message.str(), fileName), directory); + sRenderDirty = false; + return; + } + + std::string html = markdownToHtml(activeEditorText()); + loadHtml(buildHtmlDocument(html, fileName.empty() ? L"MarkdownViewer++" : fileName), directory); + sRenderDirty = false; +} + +static bool ensurePreview() +{ + if (sPreviewHwnd && sWebView) + return true; + sPreviewHwnd = ::CreateWindowExW(0, L"MarkdownViewerPlusPlusPreview", L"", + WS_CHILD | WS_VISIBLE, 0, 0, 320, 480, + sNppData._nppHandle, nullptr, nullptr, nullptr); + if (!sPreviewHwnd) + return false; + + auto* info = HandleRegistry::getWindowInfo(sPreviewHwnd); + if (!info || !info->nativeView) + return false; + NSView* container = (__bridge NSView*)info->nativeView; + container.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; + + WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init]; + sWebView = [[WKWebView alloc] initWithFrame:container.bounds configuration:configuration]; + sWebView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; + [container addSubview:sWebView]; + + tTbData data{}; + data.hClient = sPreviewHwnd; + data.pszName = L"MarkdownViewer++"; + data.dlgID = kToggleCommand; + data.uMask = DWS_DF_CONT_RIGHT; + data.pszModuleName = L"MarkdownViewerPlusPlus"; + ::SendMessageW(sNppData._nppHandle, NPPM_DMMREGASDCKDLG, 0, reinterpret_cast(&data)); + ::SendMessageW(sNppData._nppHandle, NPPM_DMMHIDE, 0, reinterpret_cast(sPreviewHwnd)); + return true; +} + +static void focusEditor() +{ + HWND sci = currentScintilla(); + if (!sci) + return; + ::SetFocus(sci); + ::SendMessageW(sci, SCI_SETFOCUS, TRUE, 0); +} + +static void setMenuCheck(int index, bool checked) +{ + if (sFuncItems[index]._cmdID) + ::SendMessageW(sNppData._nppHandle, NPPM_SETMENUITEMCHECK, + static_cast(sFuncItems[index]._cmdID), checked ? TRUE : FALSE); +} + +static void togglePreview() +{ + if (!ensurePreview()) + return; + sVisible = !sVisible; + if (sVisible) + { + ::SendMessageW(sNppData._nppHandle, NPPM_DMMSHOW, 0, reinterpret_cast(sPreviewHwnd)); + setMenuCheck(kToggleCommand, true); + sRenderDirty = true; + renderPreview(true); + updateScrollPosition(); + focusEditor(); + } + else + { + ::SendMessageW(sNppData._nppHandle, NPPM_DMMHIDE, 0, reinterpret_cast(sPreviewHwnd)); + setMenuCheck(kToggleCommand, false); + } +} + +static void toggleSynchronizedScrolling() +{ + sConfig.synchronizeScrolling = !sConfig.synchronizeScrolling; + sFuncItems[kSyncCommand]._init2Check = sConfig.synchronizeScrolling; + setMenuCheck(kSyncCommand, sConfig.synchronizeScrolling); + saveConfig(); + updateScrollPosition(); +} + +static NSTextField* label(NSString* title, NSRect frame) +{ + NSTextField* field = [NSTextField labelWithString:title]; + field.frame = frame; + return field; +} + +static void showOptions() +{ + @autoreleasepool { + NSAlert* alert = [[NSAlert alloc] init]; + alert.messageText = @"MarkdownViewer++ Options"; + alert.informativeText = @"Configure the macOS MarkdownViewer++ preview."; + [alert addButtonWithTitle:@"OK"]; + [alert addButtonWithTitle:@"Cancel"]; + + NSView* accessory = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 520, 300)]; + [accessory addSubview:label(@"Rendered file extensions (comma-separated, empty renders all):", + NSMakeRect(0, 270, 520, 20))]; + + NSTextField* extensions = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 242, 520, 24)]; + extensions.stringValue = wideToNSString(sConfig.fileExtensions); + [accessory addSubview:extensions]; + + NSButton* includeNewFiles = [[NSButton alloc] initWithFrame:NSMakeRect(0, 210, 260, 24)]; + [includeNewFiles setButtonType:NSButtonTypeSwitch]; + includeNewFiles.title = @"Include untitled/new files"; + includeNewFiles.state = sConfig.includeNewFiles ? NSControlStateValueOn : NSControlStateValueOff; + [accessory addSubview:includeNewFiles]; + + NSButton* syncScrolling = [[NSButton alloc] initWithFrame:NSMakeRect(270, 210, 250, 24)]; + [syncScrolling setButtonType:NSButtonTypeSwitch]; + syncScrolling.title = @"Synchronize scrolling"; + syncScrolling.state = sConfig.synchronizeScrolling ? NSControlStateValueOn : NSControlStateValueOff; + [accessory addSubview:syncScrolling]; + + [accessory addSubview:label(@"Custom CSS:", NSMakeRect(0, 184, 520, 20))]; + NSScrollView* scrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(0, 0, 520, 180)]; + scrollView.hasVerticalScroller = YES; + scrollView.borderType = NSBezelBorder; + NSTextView* cssView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, 500, 180)]; + cssView.string = wideToNSString(sConfig.customCss); + scrollView.documentView = cssView; + [accessory addSubview:scrollView]; + + alert.accessoryView = accessory; + NSModalResponse response = [alert runModal]; + if (response != NSAlertFirstButtonReturn) + return; + + sConfig.fileExtensions = nsStringToWide(extensions.stringValue); + sConfig.includeNewFiles = includeNewFiles.state == NSControlStateValueOn; + sConfig.synchronizeScrolling = syncScrolling.state == NSControlStateValueOn; + sConfig.customCss = nsStringToWide(cssView.string); + sFuncItems[kSyncCommand]._init2Check = sConfig.synchronizeScrolling; + setMenuCheck(kSyncCommand, sConfig.synchronizeScrolling); + saveConfig(); + sRenderDirty = true; + renderPreview(true); + } +} + +static void showAbout() +{ + @autoreleasepool { + NSAlert* alert = [[NSAlert alloc] init]; + alert.messageText = @"MarkdownViewer++"; + alert.informativeText = + @"Native PaperWasp macOS port inspired by nea/MarkdownViewerPlusPlus.\n\n" + @"The upstream plugin is MIT licensed and implemented for Notepad++ as a .NET/WinForms plugin. " + @"This macOS port preserves the plugin menu and live preview workflow with a native WKWebView renderer."; + [alert addButtonWithTitle:@"OK"]; + [alert runModal]; + } +} + +static void initializeFuncItems() +{ + for (auto& item : sFuncItems) + item = FuncItem{}; + + wcscpy(sFuncItems[kToggleCommand]._itemName, L"MarkdownViewer++"); + sFuncItems[kToggleCommand]._pFunc = togglePreview; + sFuncItems[kToggleCommand]._pShKey = &sToggleShortcut; + + wcscpy(sFuncItems[1]._itemName, L"---"); + + wcscpy(sFuncItems[kSyncCommand]._itemName, L"Synchronize scrolling (Editor -> Viewer)"); + sFuncItems[kSyncCommand]._pFunc = toggleSynchronizedScrolling; + sFuncItems[kSyncCommand]._init2Check = sConfig.synchronizeScrolling; + + wcscpy(sFuncItems[3]._itemName, L"---"); + + wcscpy(sFuncItems[kOptionsCommand]._itemName, L"Options"); + sFuncItems[kOptionsCommand]._pFunc = showOptions; + + wcscpy(sFuncItems[kAboutCommand]._itemName, L"About"); + sFuncItems[kAboutCommand]._pFunc = showAbout; +} + +extern "C" BOOL APIENTRY DllMain(HINSTANCE, DWORD reason, LPVOID) +{ + if (reason == DLL_PROCESS_DETACH) + { + saveConfig(); + if (sPreviewHwnd) + { + ::DestroyWindow(sPreviewHwnd); + sPreviewHwnd = nullptr; + sWebView = nil; + } + } + return TRUE; +} + +extern "C" __declspec(dllexport) void setInfo(NppData data) +{ + sNppData = data; + loadConfig(); + initializeFuncItems(); + ensurePreview(); +} + +extern "C" __declspec(dllexport) const wchar_t* getName() +{ + return L"MarkdownViewer++"; +} + +extern "C" __declspec(dllexport) FuncItem* getFuncsArray(int* nbItems) +{ + if (nbItems) + *nbItems = kCommandCount; + return sFuncItems; +} + +extern "C" __declspec(dllexport) void beNotified(SCNotification* notification) +{ + if (!notification) + return; + + switch (notification->nmhdr.code) + { + case NPPN_READY: + sRenderDirty = true; + renderPreview(true); + break; + case NPPN_BUFFERACTIVATED: + sRenderDirty = true; + renderPreview(true); + updateScrollPosition(); + break; + case SCN_MODIFIED: + if (notification->modificationType & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT)) + sRenderDirty = true; + break; + case SCN_UPDATEUI: + renderPreview(false); + if (notification->updated & SC_UPDATE_V_SCROLL) + updateScrollPosition(); + break; + case NPPN_SHUTDOWN: + saveConfig(); + break; + default: + break; + } +} + +extern "C" __declspec(dllexport) LRESULT messageProc(UINT, WPARAM, LPARAM) +{ + return TRUE; +} + +extern "C" __declspec(dllexport) BOOL isUnicode() +{ + return TRUE; +} From 6c4a5bcf30f25f3c1fdee383a33417588b7e2746 Mon Sep 17 00:00:00 2001 From: Brian Tabone Date: Mon, 25 May 2026 17:17:31 -0500 Subject: [PATCH 2/4] Include integer headers for SHA-256 API Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- PowerEditor/src/MISC/sha2/sha-256.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PowerEditor/src/MISC/sha2/sha-256.h b/PowerEditor/src/MISC/sha2/sha-256.h index eaca0558a795..4f9324345221 100644 --- a/PowerEditor/src/MISC/sha2/sha-256.h +++ b/PowerEditor/src/MISC/sha2/sha-256.h @@ -1,3 +1,6 @@ #pragma once +#include +#include + void calc_sha_256(uint8_t hash[32], const void *input, size_t len); From 338b5c36520e7895da8fb4ff70146ceb1509232f Mon Sep 17 00:00:00 2001 From: Brian Tabone Date: Wed, 27 May 2026 23:54:30 -0500 Subject: [PATCH 3/4] Render GFM tables in the markdown viewer plugin The hand-rolled markdown parser had no table support, so pipe-delimited rows fell through to paragraph accumulation and rendered as one wrapped block of text. Add GFM table detection (header + delimiter row), HTML emission with column alignment from `:---:` style delimiters, inline markdown inside cells, padding/truncation of mismatched rows, escaped `\|` handling, and matching light/dark CSS for /
/. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/macOS/MarkdownViewerPlusPlus.mm | 165 +++++++++++++++++- 1 file changed, 160 insertions(+), 5 deletions(-) diff --git a/plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm b/plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm index c51d0d325758..13576f0e6c59 100644 --- a/plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm +++ b/plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm @@ -188,11 +188,132 @@ static void saveConfig() return rendered; } +enum class TableAlign { None, Left, Right, Center }; + +static std::vector splitTableCells(const std::string& s) +{ + std::string body = s; + if (!body.empty() && body.front() == '|') body.erase(body.begin()); + if (!body.empty() && body.back() == '|') body.pop_back(); + + std::vector cells; + std::string current; + for (size_t i = 0; i < body.size(); ++i) + { + char c = body[i]; + if (c == '\\' && i + 1 < body.size() && body[i + 1] == '|') + { + current += '|'; + ++i; + } + else if (c == '|') + { + cells.push_back(trim(current)); + current.clear(); + } + else + { + current += c; + } + } + cells.push_back(trim(current)); + return cells; +} + +static bool parseTableDelimiter(const std::string& line, std::vector& out) +{ + std::string t = trim(line); + if (t.find('|') == std::string::npos) return false; + auto cells = splitTableCells(t); + if (cells.empty()) return false; + out.clear(); + for (const auto& cell : cells) + { + if (cell.empty()) return false; + bool leftColon = cell.front() == ':'; + bool rightColon = cell.back() == ':'; + size_t startIdx = leftColon ? 1 : 0; + size_t endIdx = rightColon ? cell.size() - 1 : cell.size(); + if (startIdx >= endIdx) return false; + for (size_t i = startIdx; i < endIdx; ++i) + if (cell[i] != '-') return false; + if (leftColon && rightColon) out.push_back(TableAlign::Center); + else if (rightColon) out.push_back(TableAlign::Right); + else if (leftColon) out.push_back(TableAlign::Left); + else out.push_back(TableAlign::None); + } + return true; +} + +static bool looksLikeTableRow(const std::string& s) +{ + return !s.empty() && s.find('|') != std::string::npos; +} + +static const char* alignStyle(TableAlign a) +{ + switch (a) + { + case TableAlign::Left: return " style=\"text-align:left\""; + case TableAlign::Right: return " style=\"text-align:right\""; + case TableAlign::Center: return " style=\"text-align:center\""; + default: return ""; + } +} + +// Emits a GFM table starting at headerIdx (header row) with the parsed delimiter +// at headerIdx+1; returns the index of the last consumed line so the outer loop +// can ++i past it. +// Known v1 limitation: pipes inside backtick code spans inside a cell are split as +// real cell separators (cells are split before inline markdown runs). +static size_t emitTable(std::ostringstream& html, + const std::vector& lines, + size_t headerIdx, + const std::vector& aligns) +{ + auto headerCells = splitTableCells(trim(lines[headerIdx])); + while (headerCells.size() < aligns.size()) headerCells.push_back(""); + if (headerCells.size() > aligns.size()) headerCells.resize(aligns.size()); + + html << "\n\n"; + for (size_t c = 0; c < headerCells.size(); ++c) + html << "" + << renderInlineMarkdown(headerCells[c]) << ""; + html << "\n\n\n"; + + size_t i = headerIdx + 2; + for (; i < lines.size(); ++i) + { + std::string stripped = trim(lines[i]); + if (stripped.empty() || !looksLikeTableRow(stripped)) break; + auto cells = splitTableCells(stripped); + while (cells.size() < aligns.size()) cells.push_back(""); + if (cells.size() > aligns.size()) cells.resize(aligns.size()); + html << ""; + for (size_t c = 0; c < cells.size(); ++c) + html << "" + << renderInlineMarkdown(cells[c]) << ""; + html << "\n"; + } + html << "\n
\n"; + return i - 1; +} + static std::string markdownToHtml(const std::string& markdown) { - std::istringstream input(markdown); + std::vector lines; + { + std::istringstream input(markdown); + std::string raw; + while (std::getline(input, raw)) + { + if (!raw.empty() && raw.back() == '\r') + raw.pop_back(); + lines.push_back(std::move(raw)); + } + } + std::ostringstream html; - std::string line; std::string paragraph; bool inList = false; bool inCode = false; @@ -212,10 +333,9 @@ static void saveConfig() } }; - while (std::getline(input, line)) + for (size_t i = 0; i < lines.size(); ++i) { - if (!line.empty() && line.back() == '\r') - line.pop_back(); + const std::string& line = lines[i]; std::string stripped = trim(line); if (stripped.rfind("```", 0) == 0) @@ -243,6 +363,23 @@ static void saveConfig() continue; } + // GFM table: header row followed by a valid delimiter row. + if (looksLikeTableRow(stripped) && i + 1 < lines.size()) + { + std::vector aligns; + if (parseTableDelimiter(lines[i + 1], aligns)) + { + auto headerCells = splitTableCells(stripped); + if (!headerCells.empty()) + { + flushParagraph(); + closeList(); + i = emitTable(html, lines, i, aligns); + continue; + } + } + } + size_t headingLevel = 0; while (headingLevel < stripped.size() && headingLevel < 6 && stripped[headingLevel] == '#') ++headingLevel; @@ -313,11 +450,29 @@ static void saveConfig() margin-left: 0; padding-left: 12px; } +table { + border-collapse: collapse; + margin: 0.6em 0; + width: auto; +} +th, td { + border: 1px solid #d0d7de; + padding: 6px 10px; + vertical-align: top; +} +thead th { + background: #f6f8fa; + font-weight: 600; +} +tbody tr:nth-child(even) { background: #fafbfc; } @media (prefers-color-scheme: dark) { body { color: #d4d4d4; background: #1e1e1e; } pre, code { background: #2d2d2d; } a { color: #6cb6ff; } blockquote { border-left-color: #555; color: #aaa; } + th, td { border-color: #555; } + thead th { background: #2d2d2d; } + tbody tr:nth-child(even) { background: #252525; } } )CSS"; } From a0c42df72fa75c4fc6e706306764d50ceeae8f55 Mon Sep 17 00:00:00 2001 From: Brian Tabone Date: Thu, 28 May 2026 00:02:11 -0500 Subject: [PATCH 4/4] Address PR #114 review: require header column count to match delimiter Per GFM spec the header row must match the delimiter row in cell count, otherwise the block is not a table. Previously a mismatch was padded / truncated like body rows, which could swallow plain text that happens to contain pipes when followed by a `---` line. Tighten the gate to `headerCells.size() == aligns.size()` and drop the now-redundant header normalization inside emitTable; body rows still pad/truncate as before. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/macOS/MarkdownViewerPlusPlus.mm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm b/plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm index 13576f0e6c59..f55708f8a7ec 100644 --- a/plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm +++ b/plugins/markdownViewerPlusPlus/src/macOS/MarkdownViewerPlusPlus.mm @@ -271,9 +271,8 @@ static size_t emitTable(std::ostringstream& html, size_t headerIdx, const std::vector& aligns) { + // Caller guarantees the header row has the same cell count as `aligns`. auto headerCells = splitTableCells(trim(lines[headerIdx])); - while (headerCells.size() < aligns.size()) headerCells.push_back(""); - if (headerCells.size() > aligns.size()) headerCells.resize(aligns.size()); html << "\n\n"; for (size_t c = 0; c < headerCells.size(); ++c) @@ -363,14 +362,16 @@ static size_t emitTable(std::ostringstream& html, continue; } - // GFM table: header row followed by a valid delimiter row. + // GFM table: header row followed by a valid delimiter row. Per GFM, + // the header must have the same cell count as the delimiter — otherwise + // the block is not a table and falls through to paragraph/list parsing. if (looksLikeTableRow(stripped) && i + 1 < lines.size()) { std::vector aligns; if (parseTableDelimiter(lines[i + 1], aligns)) { auto headerCells = splitTableCells(stripped); - if (!headerCells.empty()) + if (headerCells.size() == aligns.size()) { flushParagraph(); closeList();