From c6138bbeb453b505adea8a6d04fa03fafec9525e Mon Sep 17 00:00:00 2001 From: Maximus5 Date: Wed, 8 Oct 2014 20:16:55 +0400 Subject: [PATCH] EditWrap. v1.10 + Editor's scrollbar existence is checked with macro. + User may specify right border padding with 3-d arg, ex. 2 cells: Plugin.Call("580F7F4F-7E64-4367-84C1-5A6EB66DAB1F",1,2) --- EditWrap/Release/EditWrap.lua | 8 ++- EditWrap/Release/changelog | 5 ++ EditWrap/src/EditWrap.cpp | 97 ++++++++++++++++++++++----- EditWrap/src/EditWrap.vcxproj | 1 + EditWrap/src/EditWrap.vcxproj.filters | 3 + EditWrap/src/version.h | 2 +- 6 files changed, 95 insertions(+), 21 deletions(-) diff --git a/EditWrap/Release/EditWrap.lua b/EditWrap/Release/EditWrap.lua index c9f465c..dd25658 100644 --- a/EditWrap/Release/EditWrap.lua +++ b/EditWrap/Release/EditWrap.lua @@ -1,12 +1,16 @@  +-- Here is an example how to use macro to call plugin EditWrap + Macro { area="Editor"; key="ShiftF3"; description="Wrap/unwrap lines virtually"; action=function() - -- Toggle word wrap. - -- Command ID (2) is the same as hotkey in the plugin menu + -- Toggle (word) wrap with Plugin.Call + -- Arg#1: Plugin GUID + -- Arg#2: Command ID, `2` is the same as hotkey in the plugin menu + -- Arg#3: (Optional) cell count of the right border padding Plugin.Call("580F7F4F-7E64-4367-84C1-5A6EB66DAB1F",2) end } diff --git a/EditWrap/Release/changelog b/EditWrap/Release/changelog index e232b88..076d0b8 100644 --- a/EditWrap/Release/changelog +++ b/EditWrap/Release/changelog @@ -1,3 +1,8 @@ +1.10 ++ Editor's scrollbar existence is checked with macro. ++ User may specify right border padding with 3-d arg, ex. 2 cells: + Plugin.Call("580F7F4F-7E64-4367-84C1-5A6EB66DAB1F",1,2) + 1.9 + Hack for checking if the scroll bar is visible at the moment of wrap. diff --git a/EditWrap/src/EditWrap.cpp b/EditWrap/src/EditWrap.cpp index 8653786..134e124 100644 --- a/EditWrap/src/EditWrap.cpp +++ b/EditWrap/src/EditWrap.cpp @@ -9,7 +9,9 @@ #undef FAR_UNICODE #define FAR_UNICODE FARMANAGERVERSION_BUILD - + + // String GUID is used in code + const wchar_t guid_PluginGuidS[] = L"580F7F4F-7E64-4367-84C1-5A6EB66DAB1F"; GUID guid_PluginGuid = { /* 580f7f4f-7e64-4367-84c1-5a6eb66dab1f */ 0x580f7f4f, 0x7e64, @@ -581,6 +583,39 @@ void DoUnwrap(EditorInfo &ei) #endif } +#if !defined(FAR_UNICODE) || (FAR_UNICODE<3000) +bool CheckScrollEnabled(const SMALL_RECT& rcFar) +{ + bool bScrollExists = false; + + #if 0 + GUID FarGuid = {}; + PluginSettings fs(FarGuid, psi.SettingsControl); + bScrollExists = fs.Get(FSSF_EDITOR, L"ShowScrollBar", false); + if (bScrollExists) + return true; + #endif + + // Нет способа проверить через API, включена ли прокрутка в конкретном экземпляре редактора + HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO csbi = {}; + GetConsoleScreenBufferInfo(hOut, &csbi); + CHAR_INFO ch[2]; COORD crSize = {1,2}; COORD crRead = {0,0}; + int iTop = 1; // csbi.dwSize.Y - rcFar.Bottom; + SMALL_RECT srRegion = {rcFar.Right, rcFar.Top+iTop, rcFar.Right, rcFar.Top+1+iTop}; + if (ReadConsoleOutput(hOut, ch, crSize, crRead, &srRegion)) + { + if ((ch[0].Char.UnicodeChar == L'▲') + && ((ch[1].Char.UnicodeChar == L'▓') || (ch[1].Char.UnicodeChar == L'░'))) + { + bScrollExists = true; + } + } + + return bScrollExists; +} +#endif + HANDLE WINAPI OpenPluginW( #if FAR_UNICODE>=2000 OpenInfo *Info @@ -599,6 +634,7 @@ HANDLE WINAPI OpenPluginW( INT_PTR cchMax = 0; SMALL_RECT rcFar = {}; int iMaxWidth = 79; + int iRightPad = 0; bool bRightPadSpecified = false; EditorUndoRedo ur = {FARSTRUCTSIZE(ur)}; FoldWorkMode WorkMode = fwm_None; int *pWrappedEditor = NULL; @@ -613,21 +649,13 @@ HANDLE WINAPI OpenPluginW( if (psi.AdvControl(PluginNumber, ACTL_GETFARRECT, FADV1988 &rcFar)) { iMaxWidth = rcFar.Right - rcFar.Left; - // Нет способа проверить через API, включена ли прокрутка - HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); - CONSOLE_SCREEN_BUFFER_INFO csbi = {}; - GetConsoleScreenBufferInfo(hOut, &csbi); - CHAR_INFO ch[2]; COORD crSize = {1,2}; COORD crRead = {0,0}; - int iTop = 1; // csbi.dwSize.Y - rcFar.Bottom; - SMALL_RECT srRegion = {rcFar.Right, rcFar.Top+iTop, rcFar.Right, rcFar.Top+1+iTop}; - if (ReadConsoleOutput(hOut, ch, crSize, crRead, &srRegion)) + #if !defined(FAR_UNICODE) || (FAR_UNICODE<3000) + // Будет ниже, через макрос + if (CheckScrollEnabled(rcFar)) { - if ((ch[0].Char.UnicodeChar == L'▲') - && ((ch[1].Char.UnicodeChar == L'▓') || (ch[1].Char.UnicodeChar == L'░'))) - { - iMaxWidth--; - } + iRightPad = 1; bRightPadSpecified = true; } + #endif } #endif @@ -713,6 +741,16 @@ HANDLE WINAPI OpenPluginW( else if (p->Values[0].Type == FMVT_DOUBLE) fw = (FoldWorkMode)(int)p->Values[0].Double; #endif + if (p->Count > 1) + { + if (p->Values[1].Type == FMVT_INTEGER) + iRightPad = (int)p->Values[1].Integer; + #if FAR_UNICODE>=3000 + else if (p->Values[1].Type == FMVT_DOUBLE) + iRightPad = (int)p->Values[1].Double; + #endif + bRightPadSpecified = true; + } } Item = fw; #endif @@ -732,14 +770,37 @@ HANDLE WINAPI OpenPluginW( goto wrap; } - ur.Command = EUR_BEGIN; - EditCtrl(ECTL_UNDOREDO, &ur); - if (WorkMode == fwm_ToggleWrap) WorkMode = gbLastWrap ? fwm_Unwrap : fwm_Wrap; else if (WorkMode == fwm_ToggleWordWrap) WorkMode = gbLastWrap ? fwm_Unwrap : fwm_WordWrap; - + + // Подготовка места под скролл и отступ + if (WorkMode == fwm_Wrap || WorkMode == fwm_WordWrap) + { + #if FAR_UNICODE>3000 + if (!bRightPadSpecified) + { + // Нет способа проверить через API, включена ли прокрутка в конкретном экземпляре редактора + wchar_t szMacroRepost[100]; + wsprintf(szMacroRepost, L"Plugin.Call(\"%s\",%i,Editor.Set(15,-1))", guid_PluginGuidS, (int)WorkMode); + MacroSendMacroText mcr = {sizeof(MacroSendMacroText)}; + mcr.SequenceText = szMacroRepost; + psi.MacroControl(&guid_PluginGuid, MCTL_SENDSTRING, 0, &mcr); + goto wrap; + } + #endif + + // Откусывание места по скролл или отступ от правого края + if ((iRightPad > 0) && (iRightPad <= 10) && (iRightPad < iMaxWidth)) + { + iMaxWidth -= iRightPad; + } + } + + ur.Command = EUR_BEGIN; + EditCtrl(ECTL_UNDOREDO, &ur); + if (WorkMode == fwm_Wrap || WorkMode == fwm_WordWrap) { DoWrap((WorkMode == fwm_WordWrap), ei, iMaxWidth); diff --git a/EditWrap/src/EditWrap.vcxproj b/EditWrap/src/EditWrap.vcxproj index 2b00a62..cf1025a 100644 --- a/EditWrap/src/EditWrap.vcxproj +++ b/EditWrap/src/EditWrap.vcxproj @@ -354,6 +354,7 @@ + diff --git a/EditWrap/src/EditWrap.vcxproj.filters b/EditWrap/src/EditWrap.vcxproj.filters index 84d6627..84cc408 100644 --- a/EditWrap/src/EditWrap.vcxproj.filters +++ b/EditWrap/src/EditWrap.vcxproj.filters @@ -30,6 +30,9 @@ FarApi + + FarApi + diff --git a/EditWrap/src/version.h b/EditWrap/src/version.h index 9e67ea8..c9f5f4b 100644 --- a/EditWrap/src/version.h +++ b/EditWrap/src/version.h @@ -1,6 +1,6 @@ #define MVV_1 1 -#define MVV_2 9 +#define MVV_2 10 #define MVV_3 0 #define MVV_4 FARMANAGERVERSION_BUILD #define MVV_4a ""