mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 20:09:10 +02:00
SynEdit/IDE: Basic Multi-Caret mode
git-svn-id: trunk@48123 -
This commit is contained in:
parent
c303b4f6c3
commit
b87c34ebfb
@ -487,6 +487,10 @@ msgstr ""
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -487,6 +487,10 @@ msgstr "Žádná akce"
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr "Rychle vložit výběr"
|
msgstr "Rychle vložit výběr"
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr "Režim,Začít,Pokračovat"
|
msgstr "Režim,Začít,Pokračovat"
|
||||||
|
@ -490,6 +490,10 @@ msgstr "Keine Aktion"
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr "Ausgewählten Text einfügen"
|
msgstr "Ausgewählten Text einfügen"
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr "Modus,Beginn,Weiter"
|
msgstr "Modus,Beginn,Weiter"
|
||||||
|
@ -485,6 +485,10 @@ msgstr "Ninguna acción"
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr "Pegado Rapido de Selección"
|
msgstr "Pegado Rapido de Selección"
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -480,6 +480,10 @@ msgstr "Ei toimintoa"
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr "Pika-liitä valinta"
|
msgstr "Pika-liitä valinta"
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr "Moodi,Ala,Jatka"
|
msgstr "Moodi,Ala,Jatka"
|
||||||
|
@ -486,6 +486,10 @@ msgstr ""
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -485,6 +485,10 @@ msgstr "ללא פעולה"
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr "העתקה מהירה של הבחירה"
|
msgstr "העתקה מהירה של הבחירה"
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr "מצב, התחלה, המשך"
|
msgstr "מצב, התחלה, המשך"
|
||||||
|
@ -487,6 +487,10 @@ msgstr "Nincs művelet"
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr "Kijelölés gyors beillesztése"
|
msgstr "Kijelölés gyors beillesztése"
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr "Mód,Kezdés,Folytatás"
|
msgstr "Mód,Kezdés,Folytatás"
|
||||||
|
@ -490,6 +490,10 @@ msgstr ""
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -488,6 +488,10 @@ msgstr "Nessuna azione"
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr "Selezione incolla veloce"
|
msgstr "Selezione incolla veloce"
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr "Modo,inizia,continua"
|
msgstr "Modo,inizia,continua"
|
||||||
|
@ -488,6 +488,10 @@ msgstr "Jokio veiksmo"
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr "Spartusis atrankos įdėjimas"
|
msgstr "Spartusis atrankos įdėjimas"
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr "Veiksena,Pradėti,Tęsti"
|
msgstr "Veiksena,Pradėti,Tęsti"
|
||||||
|
@ -487,6 +487,10 @@ msgstr ""
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -491,6 +491,10 @@ msgstr ""
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -477,6 +477,10 @@ msgstr ""
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -486,6 +486,10 @@ msgstr "Sem Ação"
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr "Colar Seleção Rapidamente"
|
msgstr "Colar Seleção Rapidamente"
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr "Modo,Iniciar,Continuar"
|
msgstr "Modo,Iniciar,Continuar"
|
||||||
|
@ -486,6 +486,10 @@ msgstr "Нет действия"
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr "Быстрая вставка выделенного"
|
msgstr "Быстрая вставка выделенного"
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr "Режим,Начать,Продолжить"
|
msgstr "Режим,Начать,Продолжить"
|
||||||
|
@ -488,6 +488,10 @@ msgstr "Без Дії"
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr "Швидкий Вибір Вставки"
|
msgstr "Швидкий Вибір Вставки"
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr "Режим,Почати,Продовжити"
|
msgstr "Режим,Почати,Продовжити"
|
||||||
|
@ -490,6 +490,10 @@ msgstr ""
|
|||||||
msgid "Quick Paste Selection"
|
msgid "Quick Paste Selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: syneditstrconst.syns_emcpluginmulticarettogglecaret
|
||||||
|
msgid "Toggle extra caret"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: syneditstrconst.syns_emcselection_opt
|
#: syneditstrconst.syns_emcselection_opt
|
||||||
msgid "Mode,Begin,Continue"
|
msgid "Mode,Begin,Continue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -277,6 +277,7 @@ const
|
|||||||
ecPluginFirstCompletion = 19000;
|
ecPluginFirstCompletion = 19000;
|
||||||
ecPluginFirstSyncro = 19010;
|
ecPluginFirstSyncro = 19010;
|
||||||
ecPluginFirstTemplEdit = 19030;
|
ecPluginFirstTemplEdit = 19030;
|
||||||
|
ecPluginFirstMultiCaret = 19050;
|
||||||
|
|
||||||
ecPluginFirst = 20000;
|
ecPluginFirst = 20000;
|
||||||
|
|
||||||
@ -1253,6 +1254,7 @@ initialization
|
|||||||
finalization
|
finalization
|
||||||
ExtraIdentToIntFn := nil;
|
ExtraIdentToIntFn := nil;
|
||||||
ExtraIntToIdentFn := nil;
|
ExtraIntToIdentFn := nil;
|
||||||
|
ExtraGetEditorCommandValues := nil;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -35,8 +35,8 @@ unit SynEditMouseCmds;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
LazSynEditMouseCmdsTypes, Classes, Controls, SysUtils, SynEditStrConst, SynEditPointClasses, Dialogs,
|
LazSynEditMouseCmdsTypes, Classes, Controls, SysUtils, SynEditStrConst, SynEditPointClasses,
|
||||||
LCLProc, Menus;
|
SynEditKeyCmds, Dialogs, LCLProc, Menus;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
@ -306,6 +306,9 @@ const
|
|||||||
emcoWheelScrollPages = TSynEditorMouseCommandOpt(2); // Opt2 > 0 ==> percentage
|
emcoWheelScrollPages = TSynEditorMouseCommandOpt(2); // Opt2 > 0 ==> percentage
|
||||||
emcoWheelScrollPagesLessOne = TSynEditorMouseCommandOpt(3); // Opt2 > 0 ==> percentage
|
emcoWheelScrollPagesLessOne = TSynEditorMouseCommandOpt(3); // Opt2 > 0 ==> percentage
|
||||||
|
|
||||||
|
type
|
||||||
|
TMouseCmdNameAndOptProcs = function(emc: TSynEditorMouseCommand): String;
|
||||||
|
|
||||||
// Plugins don't know of other plugins, so they need to map the codes
|
// Plugins don't know of other plugins, so they need to map the codes
|
||||||
// Plugins all start at ecPluginFirst (overlapping)
|
// Plugins all start at ecPluginFirst (overlapping)
|
||||||
// If ask by SynEdit they add an offset
|
// If ask by SynEdit they add an offset
|
||||||
@ -316,8 +319,14 @@ function AllocatePluginMouseRange(Count: Integer; OffsetOnly: Boolean = False):
|
|||||||
function MouseCommandName(emc: TSynEditorMouseCommand): String;
|
function MouseCommandName(emc: TSynEditorMouseCommand): String;
|
||||||
function MouseCommandConfigName(emc: TSynEditorMouseCommand): String;
|
function MouseCommandConfigName(emc: TSynEditorMouseCommand): String;
|
||||||
|
|
||||||
function SynMouseCmdToIdent(SynMouseCmd: Longint; out Ident: String): Boolean;
|
function SynMouseCmdToIdent(SynMouseCmd: Longint; var Ident: String): Boolean;
|
||||||
function IdentToSynMouseCmd(const Ident: string; out SynMouseCmd: Longint): Boolean;
|
function IdentToSynMouseCmd(const Ident: string; var SynMouseCmd: Longint): Boolean;
|
||||||
|
procedure GetEditorMouseCommandValues(Proc: TGetStrProc);
|
||||||
|
|
||||||
|
procedure RegisterMouseCmdIdentProcs(IdentToIntFn: TIdentToInt; IntToIdentFn: TIntToIdent);
|
||||||
|
procedure RegisterExtraGetEditorMouseCommandValues(AProc: TGetEditorCommandValuesProc);
|
||||||
|
|
||||||
|
procedure RegisterMouseCmdNameAndOptProcs(ANamesProc: TMouseCmdNameAndOptProcs; AOptProc: TMouseCmdNameAndOptProcs = nil);
|
||||||
|
|
||||||
const
|
const
|
||||||
SYNEDIT_LINK_MODIFIER = {$IFDEF LCLcarbon}ssMeta{$ELSE}ssCtrl{$ENDIF};
|
SYNEDIT_LINK_MODIFIER = {$IFDEF LCLcarbon}ssMeta{$ELSE}ssCtrl{$ENDIF};
|
||||||
@ -326,28 +335,28 @@ implementation
|
|||||||
|
|
||||||
const
|
const
|
||||||
SynMouseCommandNames: array [0..27] of TIdentMapEntry = (
|
SynMouseCommandNames: array [0..27] of TIdentMapEntry = (
|
||||||
(Value: emcNone; Name: 'emcNone'),
|
(Value: emcNone; Name: 'emcNone'),
|
||||||
(Value: emcStartSelections; Name: 'emcStartSelections'),
|
(Value: emcStartSelections; Name: 'emcStartSelections'),
|
||||||
(Value: emcStartColumnSelections; Name: 'emcStartColumnSelections'),
|
(Value: emcStartColumnSelections; Name: 'emcStartColumnSelections'),
|
||||||
(Value: emcStartLineSelections; Name: 'emcStartLineSelections'),
|
(Value: emcStartLineSelections; Name: 'emcStartLineSelections'),
|
||||||
|
|
||||||
(Value: emcSelectWord; Name: 'emcSelectWord'),
|
(Value: emcSelectWord; Name: 'emcSelectWord'),
|
||||||
(Value: emcSelectLine; Name: 'emcSelectLine'),
|
(Value: emcSelectLine; Name: 'emcSelectLine'),
|
||||||
(Value: emcSelectPara; Name: 'emcSelectPara'),
|
(Value: emcSelectPara; Name: 'emcSelectPara'),
|
||||||
|
|
||||||
(Value: emcStartDragMove; Name: 'emcStartDragMove'),
|
(Value: emcStartDragMove; Name: 'emcStartDragMove'),
|
||||||
(Value: emcPasteSelection; Name: 'emcPasteSelection'),
|
(Value: emcPasteSelection; Name: 'emcPasteSelection'),
|
||||||
(Value: emcMouseLink; Name: 'emcMouseLink'),
|
(Value: emcMouseLink; Name: 'emcMouseLink'),
|
||||||
|
|
||||||
(Value: emcContextMenu; Name: 'emcContextMenu'),
|
(Value: emcContextMenu; Name: 'emcContextMenu'),
|
||||||
|
|
||||||
(Value: emcOnMainGutterClick; Name: 'emcOnMainGutterClick'),
|
(Value: emcOnMainGutterClick; Name: 'emcOnMainGutterClick'),
|
||||||
|
|
||||||
(Value: emcCodeFoldCollaps; Name: 'emcCodeFoldCollaps'),
|
(Value: emcCodeFoldCollaps; Name: 'emcCodeFoldCollaps'),
|
||||||
(Value: emcCodeFoldExpand; Name: 'emcCodeFoldExpand'),
|
(Value: emcCodeFoldExpand; Name: 'emcCodeFoldExpand'),
|
||||||
(Value: emcCodeFoldContextMenu; Name: 'emcCodeFoldContextMenu'),
|
(Value: emcCodeFoldContextMenu; Name: 'emcCodeFoldContextMenu'),
|
||||||
|
|
||||||
(Value: emcSynEditCommand; Name: 'emcSynEditCommand'),
|
(Value: emcSynEditCommand; Name: 'emcSynEditCommand'),
|
||||||
|
|
||||||
(Value: emcWheelScrollDown; Name: 'emcWheelScrollDown'),
|
(Value: emcWheelScrollDown; Name: 'emcWheelScrollDown'),
|
||||||
(Value: emcWheelScrollUp; Name: 'emcWheelScrollUp'),
|
(Value: emcWheelScrollUp; Name: 'emcWheelScrollUp'),
|
||||||
@ -356,16 +365,23 @@ const
|
|||||||
(Value: emcWheelHorizScrollDown; Name: 'emcWheelHorizScrollDown'),
|
(Value: emcWheelHorizScrollDown; Name: 'emcWheelHorizScrollDown'),
|
||||||
(Value: emcWheelHorizScrollUp; Name: 'emcWheelHorizScrollUp'),
|
(Value: emcWheelHorizScrollUp; Name: 'emcWheelHorizScrollUp'),
|
||||||
|
|
||||||
(Value: emcWheelZoomOut; Name: 'emcWheelZoomOut'),
|
(Value: emcWheelZoomOut; Name: 'emcWheelZoomOut'),
|
||||||
(Value: emcWheelZoomIn; Name: 'emcWheelZoomIn'),
|
(Value: emcWheelZoomIn; Name: 'emcWheelZoomIn'),
|
||||||
(Value: emcWheelZoomNorm; Name: 'emcWheelZoomNorm'),
|
(Value: emcWheelZoomNorm; Name: 'emcWheelZoomNorm'),
|
||||||
|
|
||||||
(Value: emcStartSelectTokens; Name: 'emcStartSelectTokens'),
|
(Value: emcStartSelectTokens; Name: 'emcStartSelectTokens'),
|
||||||
(Value: emcStartSelectWords; Name: 'emcStartSelectWords'),
|
(Value: emcStartSelectWords; Name: 'emcStartSelectWords'),
|
||||||
(Value: emcStartSelectLines; Name: 'emcStartSelectLines')
|
(Value: emcStartSelectLines; Name: 'emcStartSelectLines')
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
var
|
||||||
|
ExtraIdentToIntFn: Array of TIdentToInt = nil;
|
||||||
|
ExtraIntToIdentFn: Array of TIntToIdent = nil;
|
||||||
|
ExtraGetEditorCommandValues: Array of TGetEditorCommandValuesProc = nil;
|
||||||
|
ExtraMouseCmdNameFn: Array of TMouseCmdNameAndOptProcs = nil;
|
||||||
|
ExtraMouseCmdOptFn: Array of TMouseCmdNameAndOptProcs = nil;
|
||||||
|
|
||||||
function AllocatePluginMouseRange(Count: Integer; OffsetOnly: Boolean = False): integer;
|
function AllocatePluginMouseRange(Count: Integer; OffsetOnly: Boolean = False): integer;
|
||||||
const
|
const
|
||||||
CurOffset : integer = 0;
|
CurOffset : integer = 0;
|
||||||
@ -377,6 +393,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
function MouseCommandName(emc: TSynEditorMouseCommand): String;
|
function MouseCommandName(emc: TSynEditorMouseCommand): String;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
case emc of
|
case emc of
|
||||||
emcNone: Result := SYNS_emcNone;
|
emcNone: Result := SYNS_emcNone;
|
||||||
@ -414,11 +432,20 @@ begin
|
|||||||
emcStartSelectWords: Result := SYNS_emcStartSelectWords;
|
emcStartSelectWords: Result := SYNS_emcStartSelectWords;
|
||||||
emcStartSelectLines: Result := SYNS_emcStartSelectLines;
|
emcStartSelectLines: Result := SYNS_emcStartSelectLines;
|
||||||
|
|
||||||
else Result := ''
|
else begin
|
||||||
|
Result := '';
|
||||||
|
i := 0;
|
||||||
|
while (i < length(ExtraMouseCmdNameFn)) and (Result = '') do begin
|
||||||
|
Result := ExtraMouseCmdNameFn[i](emc);
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function MouseCommandConfigName(emc: TSynEditorMouseCommand): String;
|
function MouseCommandConfigName(emc: TSynEditorMouseCommand): String;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
case emc of
|
case emc of
|
||||||
emcStartSelections,
|
emcStartSelections,
|
||||||
@ -431,20 +458,90 @@ begin
|
|||||||
emcContextMenu: Result := SYNS_emcContextMenuCaretMove_opt;
|
emcContextMenu: Result := SYNS_emcContextMenuCaretMove_opt;
|
||||||
emcWheelScrollDown..emcWheelVertScrollUp:
|
emcWheelScrollDown..emcWheelVertScrollUp:
|
||||||
Result := SYNS_emcWheelScroll_opt;
|
Result := SYNS_emcWheelScroll_opt;
|
||||||
else Result := ''
|
else begin
|
||||||
|
Result := '';
|
||||||
|
i := 0;
|
||||||
|
while (i < length(ExtraMouseCmdOptFn)) and (Result = '') do begin
|
||||||
|
Result := ExtraMouseCmdOptFn[i](emc);
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function SynMouseCmdToIdent(SynMouseCmd: Longint; out Ident: String): Boolean;
|
function SynMouseCmdToIdent(SynMouseCmd: Longint; var Ident: String): Boolean;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
Ident := '';
|
Ident := '';
|
||||||
Result := IntToIdent(SynMouseCmd, Ident, SynMouseCommandNames);
|
Result := IntToIdent(SynMouseCmd, Ident, SynMouseCommandNames);
|
||||||
|
i := 0;
|
||||||
|
while (i < length(ExtraIntToIdentFn)) and (not Result) do begin
|
||||||
|
Result := ExtraIntToIdentFn[i](SynMouseCmd, Ident);
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function IdentToSynMouseCmd(const Ident: string; out SynMouseCmd: Longint): Boolean;
|
function IdentToSynMouseCmd(const Ident: string; var SynMouseCmd: Longint): Boolean;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
SynMouseCmd := 0;
|
SynMouseCmd := 0;
|
||||||
Result := IdentToInt(Ident, SynMouseCmd, SynMouseCommandNames);
|
Result := IdentToInt(Ident, SynMouseCmd, SynMouseCommandNames);
|
||||||
|
i := 0;
|
||||||
|
while (i < length(ExtraIdentToIntFn)) and (not Result) do begin
|
||||||
|
Result := ExtraIdentToIntFn[i](Ident, SynMouseCmd);
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure GetEditorMouseCommandValues(Proc: TGetStrProc);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
for i := Low(SynMouseCommandNames) to High(SynMouseCommandNames) do
|
||||||
|
Proc(SynMouseCommandNames[I].Name);
|
||||||
|
i := 0;
|
||||||
|
while (i < length(ExtraGetEditorCommandValues)) do begin
|
||||||
|
ExtraGetEditorCommandValues[i](Proc);
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure RegisterMouseCmdIdentProcs(IdentToIntFn: TIdentToInt; IntToIdentFn: TIntToIdent);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
i := length(ExtraIdentToIntFn);
|
||||||
|
SetLength(ExtraIdentToIntFn, i + 1);
|
||||||
|
ExtraIdentToIntFn[i] := IdentToIntFn;
|
||||||
|
i := length(ExtraIntToIdentFn);
|
||||||
|
SetLength(ExtraIntToIdentFn, i + 1);
|
||||||
|
ExtraIntToIdentFn[i] := IntToIdentFn;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure RegisterExtraGetEditorMouseCommandValues(AProc: TGetEditorCommandValuesProc);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
i := length(ExtraGetEditorCommandValues);
|
||||||
|
SetLength(ExtraGetEditorCommandValues, i + 1);
|
||||||
|
ExtraGetEditorCommandValues[i] := AProc;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure RegisterMouseCmdNameAndOptProcs(ANamesProc: TMouseCmdNameAndOptProcs;
|
||||||
|
AOptProc: TMouseCmdNameAndOptProcs);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
i := length(ExtraMouseCmdNameFn);
|
||||||
|
SetLength(ExtraMouseCmdNameFn, i + 1);
|
||||||
|
ExtraMouseCmdNameFn[i] := ANamesProc;
|
||||||
|
if AOptProc = nil then
|
||||||
|
exit;
|
||||||
|
i := length(ExtraMouseCmdOptFn);
|
||||||
|
SetLength(ExtraMouseCmdOptFn, i + 1);
|
||||||
|
ExtraMouseCmdOptFn[i] := AOptProc;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TSynEditMouseInternalActions }
|
{ TSynEditMouseInternalActions }
|
||||||
@ -928,7 +1025,14 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
RegisterIntegerConsts(TypeInfo(TSynEditorMouseCommand), TIdentToInt(@IdentToSynMouseCmd), TIntToIdent(@SynMouseCmdToIdent));
|
RegisterIntegerConsts(TypeInfo(TSynEditorMouseCommand), @IdentToSynMouseCmd, @SynMouseCmdToIdent);
|
||||||
|
|
||||||
|
finalization
|
||||||
|
ExtraIdentToIntFn := nil;
|
||||||
|
ExtraIntToIdentFn := nil;
|
||||||
|
ExtraGetEditorCommandValues := nil;
|
||||||
|
ExtraMouseCmdNameFn := nil;
|
||||||
|
ExtraMouseCmdOptFn := nil;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -2836,6 +2836,10 @@ end;
|
|||||||
|
|
||||||
procedure TSynEditScreenCaretPainterInternal.BeginScroll(dx, dy: Integer; const rcScroll,
|
procedure TSynEditScreenCaretPainterInternal.BeginScroll(dx, dy: Integer; const rcScroll,
|
||||||
rcClip: TRect);
|
rcClip: TRect);
|
||||||
|
{$IFDEF SynCaretNoHideInSroll}
|
||||||
|
var
|
||||||
|
rs: TIsInRectState;
|
||||||
|
{$ENDIF}
|
||||||
begin
|
begin
|
||||||
assert(not((FInPaint or FInScroll)), 'TSynEditScreenCaretPainterInternal.BeginScroll: not((FInPaint or FInScroll))');
|
assert(not((FInPaint or FInScroll)), 'TSynEditScreenCaretPainterInternal.BeginScroll: not((FInPaint or FInScroll))');
|
||||||
if (FState <> []) then
|
if (FState <> []) then
|
||||||
@ -2847,7 +2851,11 @@ begin
|
|||||||
inherited SetCaretPosEx(-1,-1);
|
inherited SetCaretPosEx(-1,-1);
|
||||||
end;
|
end;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
if ((IsInRect(rcClip) = irPartInside) or (IsInRect(rcScroll) = irPartInside)) and FIsDrawn then begin
|
rs := IsInRect(rcScroll);
|
||||||
|
if not( ((IsInRect(rcClip) = irOutside) and (rs = irOutside)) or
|
||||||
|
((IsInRect(rcClip, Left+dx, Top+dy, Width, Height) = irInside) and (rs = irInside))
|
||||||
|
)
|
||||||
|
then begin
|
||||||
HideCaret;
|
HideCaret;
|
||||||
inherited SetCaretPosEx(-1,-1);
|
inherited SetCaretPosEx(-1,-1);
|
||||||
end;
|
end;
|
||||||
|
@ -434,6 +434,7 @@ resourcestring
|
|||||||
SYNS_emcContextMenuCaretMove_opt = '"Move caret, when selection exists", Never, "Click outside", Always';
|
SYNS_emcContextMenuCaretMove_opt = '"Move caret, when selection exists", Never, "Click outside", Always';
|
||||||
SYNS_emcWheelScroll_opt = 'Speed,"System settings",Lines,Pages,"Pages (less one line)"';
|
SYNS_emcWheelScroll_opt = 'Speed,"System settings",Lines,Pages,"Pages (less one line)"';
|
||||||
|
|
||||||
|
SYNS_emcPluginMultiCaretToggleCaret = 'Toggle extra caret';
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -14,6 +14,7 @@ interface
|
|||||||
uses
|
uses
|
||||||
Classes, SysUtils, SynEdit, SynEditPointClasses, SynEditKeyCmds, SynEditTypes,
|
Classes, SysUtils, SynEdit, SynEditPointClasses, SynEditKeyCmds, SynEditTypes,
|
||||||
LazSynTextArea, SynEditMiscProcs, LazSynEditText, SynEditMiscClasses, SynEditMouseCmds,
|
LazSynTextArea, SynEditMiscProcs, LazSynEditText, SynEditMiscClasses, SynEditMouseCmds,
|
||||||
|
SynEditStrConst,
|
||||||
{$IfDef SynMultiCaretDebug} LazLoggerBase, {$ELSE} LazLoggerDummy, {$ENDIF}
|
{$IfDef SynMultiCaretDebug} LazLoggerBase, {$ELSE} LazLoggerDummy, {$ENDIF}
|
||||||
LCLType, Controls, Graphics, Clipbrd;
|
LCLType, Controls, Graphics, Clipbrd;
|
||||||
|
|
||||||
@ -21,6 +22,11 @@ const
|
|||||||
|
|
||||||
emcPluginMultiCaretToggleCaret = emcPluginFirstMultiCaret;
|
emcPluginMultiCaretToggleCaret = emcPluginFirstMultiCaret;
|
||||||
|
|
||||||
|
//ecPluginMultiCaretSetCaret = ecPluginFirstMultiCaret + 0;
|
||||||
|
//ecPluginMultiCaretUnsetCaret = ecPluginFirstMultiCaret + 1;
|
||||||
|
//ecPluginMultiCaretToggleCaret = ecPluginFirstMultiCaret + 2;
|
||||||
|
//ecPluginMultiCaretClearAll = ecPluginFirstMultiCaret + 3;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
TSynPluginMultiCaretVisualList = class;
|
TSynPluginMultiCaretVisualList = class;
|
||||||
@ -177,18 +183,30 @@ type
|
|||||||
procedure ResetDefaults; override;
|
procedure ResetDefaults; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TSynPluginMultiCaret }
|
{ TSynPluginMultiCaretKeyStrokes }
|
||||||
|
|
||||||
|
TSynPluginMultiCaretKeyStrokes = class(TSynEditKeyStrokes)
|
||||||
|
public
|
||||||
|
procedure ResetDefaults; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TSynCustomPluginMultiCaret }
|
||||||
|
|
||||||
TSynPluginMultiCaretStateFlag = (
|
TSynPluginMultiCaretStateFlag = (
|
||||||
sfProcessingCmd, sfProcessingMain,
|
sfProcessingCmd, sfProcessingMain,
|
||||||
sfExtendingColumnSel
|
sfExtendingColumnSel, sfSkipCaretsAtSelection
|
||||||
);
|
);
|
||||||
TSynPluginMultiCaretStateFlags = set of TSynPluginMultiCaretStateFlag;
|
TSynPluginMultiCaretStateFlags = set of TSynPluginMultiCaretStateFlag;
|
||||||
|
|
||||||
TSynPluginMultiCaret = class(TSynPluginMultiCaretBase)
|
TSynCustomPluginMultiCaret = class(TSynPluginMultiCaretBase)
|
||||||
private
|
private
|
||||||
|
FEnableWithColumnSelection: Boolean;
|
||||||
FStateFlags: TSynPluginMultiCaretStateFlags;
|
FStateFlags: TSynPluginMultiCaretStateFlags;
|
||||||
FMouseActions: TSynPluginMultiCaretMouseActions;
|
FMouseActions: TSynPluginMultiCaretMouseActions;
|
||||||
|
FSelY1, FSElY2, FSelX: Integer;
|
||||||
|
|
||||||
|
procedure RemoveCaretsInSelection;
|
||||||
|
procedure SetSkipCaretAtSel;
|
||||||
protected
|
protected
|
||||||
procedure DoEditorRemoving(AValue: TCustomSynEdit); override;
|
procedure DoEditorRemoving(AValue: TCustomSynEdit); override;
|
||||||
procedure DoEditorAdded(AValue: TCustomSynEdit); override;
|
procedure DoEditorAdded(AValue: TCustomSynEdit); override;
|
||||||
@ -210,7 +228,15 @@ type
|
|||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
function AddCaretAt(X, Y: Integer): Integer;
|
||||||
property MouseActions: TSynPluginMultiCaretMouseActions read FMouseActions;
|
property MouseActions: TSynPluginMultiCaretMouseActions read FMouseActions;
|
||||||
|
property EnableWithColumnSelection: Boolean read FEnableWithColumnSelection write FEnableWithColumnSelection default True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TSynPluginMultiCaret = class(TSynCustomPluginMultiCaret)
|
||||||
|
published
|
||||||
|
property MouseActions;
|
||||||
|
property EnableWithColumnSelection;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -223,6 +249,48 @@ var
|
|||||||
const
|
const
|
||||||
EMPTY_LIST_LEN = 8;
|
EMPTY_LIST_LEN = 8;
|
||||||
|
|
||||||
|
SynMouseCommandNames: array [0..0] of TIdentMapEntry = (
|
||||||
|
(Value: emcPluginMultiCaretToggleCaret; Name: 'emcPluginMultiCaretToggleCaret')
|
||||||
|
);
|
||||||
|
|
||||||
|
function SynMouseCmdToIdent(SynMouseCmd: Longint; var Ident: String): Boolean;
|
||||||
|
begin
|
||||||
|
Ident := '';
|
||||||
|
Result := IntToIdent(SynMouseCmd, Ident, SynMouseCommandNames);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function IdentToSynMouseCmd(const Ident: string; var SynMouseCmd: Longint): Boolean;
|
||||||
|
begin
|
||||||
|
SynMouseCmd := 0;
|
||||||
|
Result := IdentToInt(Ident, SynMouseCmd, SynMouseCommandNames);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure GetEditorMouseCommandValues(Proc: TGetStrProc);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
for i := Low(SynMouseCommandNames) to High(SynMouseCommandNames) do
|
||||||
|
Proc(SynMouseCommandNames[I].Name);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function MouseCommandName(emc: TSynEditorMouseCommand): String;
|
||||||
|
begin
|
||||||
|
case emc of
|
||||||
|
emcPluginMultiCaretToggleCaret: Result := SYNS_emcPluginMultiCaretToggleCaret;
|
||||||
|
else
|
||||||
|
Result := '';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function MouseCommandConfigName(emc: TSynEditorMouseCommand): String;
|
||||||
|
begin
|
||||||
|
case emc of
|
||||||
|
emcPluginMultiCaretToggleCaret: Result := '';
|
||||||
|
else
|
||||||
|
Result := '';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TSynPluginMultiCaretVisual }
|
{ TSynPluginMultiCaretVisual }
|
||||||
|
|
||||||
constructor TSynPluginMultiCaretVisual.Create(AHandleOwner: TWinControl;
|
constructor TSynPluginMultiCaretVisual.Create(AHandleOwner: TWinControl;
|
||||||
@ -1135,9 +1203,60 @@ begin
|
|||||||
AddCommand(emcPluginMultiCaretToggleCaret, False, mbXMiddle, ccAny, cdDown, [ssShift], [ssShift,ssCtrl,ssAlt]);
|
AddCommand(emcPluginMultiCaretToggleCaret, False, mbXMiddle, ccAny, cdDown, [ssShift], [ssShift,ssCtrl,ssAlt]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TSynPluginMultiCaret }
|
{ TSynPluginMultiCaretKeyStrokes }
|
||||||
|
|
||||||
procedure TSynPluginMultiCaret.DoEditorRemoving(AValue: TCustomSynEdit);
|
procedure TSynPluginMultiCaretKeyStrokes.ResetDefaults;
|
||||||
|
begin
|
||||||
|
inherited ResetDefaults;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TSynCustomPluginMultiCaret }
|
||||||
|
|
||||||
|
procedure TSynCustomPluginMultiCaret.RemoveCaretsInSelection;
|
||||||
|
var
|
||||||
|
i, x, y: Integer;
|
||||||
|
bb, be: TPoint;
|
||||||
|
sm: TSynSelectionMode;
|
||||||
|
begin
|
||||||
|
bb := SelectionObj.FirstLineBytePos;
|
||||||
|
be := SelectionObj.LastLineBytePos;
|
||||||
|
sm := SelectionObj.ActiveSelectionMode;
|
||||||
|
if sm = smLine then begin
|
||||||
|
bb.x := 0;
|
||||||
|
be.x := MaxInt;
|
||||||
|
end;
|
||||||
|
if (sm = smColumn) and (bb.x > be.x) then begin
|
||||||
|
if bb.x = be.x then
|
||||||
|
exit;
|
||||||
|
i := bb.x;
|
||||||
|
bb.x := be.x;
|
||||||
|
be.x := i;
|
||||||
|
end;
|
||||||
|
|
||||||
|
i := CaretsCount;
|
||||||
|
while i > 0 do begin
|
||||||
|
dec(i);
|
||||||
|
x := Carets.Caret[i].x;
|
||||||
|
y := Carets.Caret[i].y;
|
||||||
|
if (y < bb.y) or
|
||||||
|
(y > be.y) or
|
||||||
|
( ((y = bb.y) or (sm = smColumn)) and (x <= bb.x) ) or
|
||||||
|
( ((y = be.y) or (sm = smColumn)) and (x >= be.x) )
|
||||||
|
then
|
||||||
|
Continue;
|
||||||
|
Carets.RemoveCaret(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSynCustomPluginMultiCaret.SetSkipCaretAtSel;
|
||||||
|
begin
|
||||||
|
Include(FStateFlags, sfSkipCaretsAtSelection);
|
||||||
|
FSelY1 := SelectionObj.FirstLineBytePos.y;
|
||||||
|
FSElY2 := SelectionObj.LastLineBytePos.y;
|
||||||
|
FSelX := SelectionObj.FirstLineBytePos.x;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSynCustomPluginMultiCaret.DoEditorRemoving(AValue: TCustomSynEdit);
|
||||||
begin
|
begin
|
||||||
if Editor <> nil then begin
|
if Editor <> nil then begin
|
||||||
CaretObj.RemoveChangeHandler(@DoCaretChanged);
|
CaretObj.RemoveChangeHandler(@DoCaretChanged);
|
||||||
@ -1150,7 +1269,7 @@ begin
|
|||||||
inherited DoEditorRemoving(AValue);
|
inherited DoEditorRemoving(AValue);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPluginMultiCaret.DoEditorAdded(AValue: TCustomSynEdit);
|
procedure TSynCustomPluginMultiCaret.DoEditorAdded(AValue: TCustomSynEdit);
|
||||||
begin
|
begin
|
||||||
inherited DoEditorAdded(AValue);
|
inherited DoEditorAdded(AValue);
|
||||||
if Editor <> nil then begin
|
if Editor <> nil then begin
|
||||||
@ -1163,7 +1282,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPluginMultiCaret.DoAfterDecPaintLock(Sender: TObject);
|
procedure TSynCustomPluginMultiCaret.DoAfterDecPaintLock(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
if FPaintLock > 1 then begin
|
if FPaintLock > 1 then begin
|
||||||
inherited DoAfterDecPaintLock(Sender);
|
inherited DoAfterDecPaintLock(Sender);
|
||||||
@ -1175,14 +1294,14 @@ begin
|
|||||||
FStateFlags := FStateFlags - [sfProcessingCmd, sfExtendingColumnSel];
|
FStateFlags := FStateFlags - [sfProcessingCmd, sfExtendingColumnSel];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPluginMultiCaret.DoCaretChanged(Sender: TObject);
|
procedure TSynCustomPluginMultiCaret.DoCaretChanged(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
if (FStateFlags * [sfProcessingCmd, sfExtendingColumnSel] <> []) then
|
if (FStateFlags * [sfProcessingCmd, sfExtendingColumnSel] <> []) then
|
||||||
exit;
|
exit;
|
||||||
ClearCarets;
|
ClearCarets;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPluginMultiCaret.DoSelectionChanged(Sender: TObject);
|
procedure TSynCustomPluginMultiCaret.DoSelectionChanged(Sender: TObject);
|
||||||
var
|
var
|
||||||
i, x, y1, y2, y3: Integer;
|
i, x, y1, y2, y3: Integer;
|
||||||
c: TPoint;
|
c: TPoint;
|
||||||
@ -1190,7 +1309,7 @@ begin
|
|||||||
if (sfProcessingCmd in FStateFlags) then exit;
|
if (sfProcessingCmd in FStateFlags) then exit;
|
||||||
y1 := Editor.BlockBegin.y;
|
y1 := Editor.BlockBegin.y;
|
||||||
y2 := Editor.BlockEnd.y;
|
y2 := Editor.BlockEnd.y;
|
||||||
If not ((y1 <> y2) and (Editor.SelectionMode = smColumn)) then begin
|
If not ((y1 <> y2) and (Editor.SelectionMode = smColumn) and EnableWithColumnSelection) then begin
|
||||||
ClearCarets;
|
ClearCarets;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
@ -1214,31 +1333,34 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPluginMultiCaret.DoBeforeSetSelText(Sender: TObject; AMode: TSynSelectionMode;
|
procedure TSynCustomPluginMultiCaret.DoBeforeSetSelText(Sender: TObject; AMode: TSynSelectionMode;
|
||||||
ANewText: PChar);
|
ANewText: PChar);
|
||||||
begin
|
begin
|
||||||
SelectionObj.RemoveBeforeSetSelTextHandler(@DoBeforeSetSelText);
|
SelectionObj.RemoveBeforeSetSelTextHandler(@DoBeforeSetSelText);
|
||||||
|
|
||||||
|
RemoveCaretsInSelection;
|
||||||
SelectionObj.SelText := '';
|
SelectionObj.SelText := '';
|
||||||
if Carets.MainCaretIndex >= 0 then begin
|
if Carets.MainCaretIndex >= 0 then begin
|
||||||
Editor.LogicalCaretXY := Carets.Caret[Carets.MainCaretIndex];
|
Editor.LogicalCaretXY := Carets.Caret[Carets.MainCaretIndex];
|
||||||
|
FSelX := Carets.Caret[Carets.MainCaretIndex].x;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
assert(False, 'TSynPluginMultiCaret.ProcessSynCommand: Maincaret index not found');
|
assert(False, 'TSynCustomPluginMultiCaret.ProcessSynCommand: Maincaret index not found');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynPluginMultiCaret.ProcessSynCommand(Sender: TObject; AfterProcessing: boolean;
|
procedure TSynCustomPluginMultiCaret.ProcessSynCommand(Sender: TObject; AfterProcessing: boolean;
|
||||||
var Handled: boolean; var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer;
|
var Handled: boolean; var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer;
|
||||||
HandlerData: pointer);
|
HandlerData: pointer);
|
||||||
|
|
||||||
procedure ExecCommandRepeated;
|
procedure ExecCommandRepeated;
|
||||||
var
|
var
|
||||||
c, i: Integer;
|
c, i, y: Integer;
|
||||||
|
p: TPoint;
|
||||||
begin
|
begin
|
||||||
Handled := True;
|
Handled := True;
|
||||||
Editor.BeginUpdate(True);
|
Editor.BeginUpdate(True);
|
||||||
try
|
try
|
||||||
c := AddCaret(Editor.LogicalCaretXY.x, Editor.CaretY, [cfMainCaret, cfNoneVisual, cfAddDuplicate]);
|
c := AddCaret(Editor.LogicalCaretXY.x, Editor.CaretY, [cfMainCaret, cfNoneVisual {, cfAddDuplicate}]);
|
||||||
|
|
||||||
// Execute Command at current caret pos
|
// Execute Command at current caret pos
|
||||||
Include(FStateFlags, sfProcessingMain);
|
Include(FStateFlags, sfProcessingMain);
|
||||||
@ -1251,9 +1373,20 @@ procedure TSynPluginMultiCaret.ProcessSynCommand(Sender: TObject; AfterProcessin
|
|||||||
|
|
||||||
// Repeat command
|
// Repeat command
|
||||||
CaretObj.IncForcePastEOL;
|
CaretObj.IncForcePastEOL;
|
||||||
for i := 0 to CaretsCount - 1 do begin
|
i := CaretsCount;
|
||||||
|
y := FSElY2;
|
||||||
|
while i > 0 do begin
|
||||||
|
dec(i);
|
||||||
if i = c then continue;
|
if i = c then continue;
|
||||||
Editor.LogicalCaretXY := Carets.Caret[i];
|
p := Carets.Caret[i];
|
||||||
|
if y > p.y then y := p.y;
|
||||||
|
if (sfSkipCaretsAtSelection in FStateFlags) and (y >= FSElY1) and
|
||||||
|
(y = p.y) and (FSelX = p.x)
|
||||||
|
then begin
|
||||||
|
dec(y);
|
||||||
|
continue;
|
||||||
|
end;
|
||||||
|
Editor.LogicalCaretXY := p;
|
||||||
Editor.CommandProcessor(Command, AChar, nil, [hcfInit, hcfFinish]);
|
Editor.CommandProcessor(Command, AChar, nil, [hcfInit, hcfFinish]);
|
||||||
end;
|
end;
|
||||||
CaretObj.DecForcePastEOL;
|
CaretObj.DecForcePastEOL;
|
||||||
@ -1264,7 +1397,7 @@ procedure TSynPluginMultiCaret.ProcessSynCommand(Sender: TObject; AfterProcessin
|
|||||||
RemoveCaret(Carets.MainCaretIndex);
|
RemoveCaret(Carets.MainCaretIndex);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
assert(False, 'TSynPluginMultiCaret.ProcessSynCommand: Maincaret index not found');
|
assert(False, 'TSynCustomPluginMultiCaret.ProcessSynCommand: Maincaret index not found');
|
||||||
finally
|
finally
|
||||||
Editor.EndUpdate;
|
Editor.EndUpdate;
|
||||||
end;
|
end;
|
||||||
@ -1298,6 +1431,11 @@ begin
|
|||||||
ecLineBreak..ecChar:
|
ecLineBreak..ecChar:
|
||||||
begin
|
begin
|
||||||
Include(FStateFlags, sfProcessingCmd);
|
Include(FStateFlags, sfProcessingCmd);
|
||||||
|
if ((Command = ecDeleteChar) or (Command = ecDeleteLastChar)) and
|
||||||
|
Editor.SelAvail and (SelectionObj.ActiveSelectionMode = smColumn) and
|
||||||
|
not(eoPersistentBlock in Editor.Options2)
|
||||||
|
then
|
||||||
|
SetSkipCaretAtSel;
|
||||||
if Editor.ReadOnly then exit;
|
if Editor.ReadOnly then exit;
|
||||||
ExecCommandRepeated;
|
ExecCommandRepeated;
|
||||||
end;
|
end;
|
||||||
@ -1341,7 +1479,7 @@ begin
|
|||||||
RemoveCaret(Carets.MainCaretIndex);
|
RemoveCaret(Carets.MainCaretIndex);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
assert(False, 'TSynPluginMultiCaret.ProcessSynCommand: Maincaret index not found');
|
assert(False, 'TSynCustomPluginMultiCaret.ProcessSynCommand: Maincaret index not found');
|
||||||
ExecCommandRepeated;
|
ExecCommandRepeated;
|
||||||
finally
|
finally
|
||||||
Editor.EndUpdate;
|
Editor.EndUpdate;
|
||||||
@ -1370,13 +1508,13 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSynPluginMultiCaret.MaybeHandleMouseAction(var AnInfo: TSynEditMouseActionInfo;
|
function TSynCustomPluginMultiCaret.MaybeHandleMouseAction(var AnInfo: TSynEditMouseActionInfo;
|
||||||
HandleActionProc: TSynEditMouseActionHandler): Boolean;
|
HandleActionProc: TSynEditMouseActionHandler): Boolean;
|
||||||
begin
|
begin
|
||||||
Result := HandleActionProc(FMouseActions, AnInfo);
|
Result := HandleActionProc(FMouseActions, AnInfo);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSynPluginMultiCaret.DoHandleMouseAction(AnAction: TSynEditMouseAction;
|
function TSynCustomPluginMultiCaret.DoHandleMouseAction(AnAction: TSynEditMouseAction;
|
||||||
var AnInfo: TSynEditMouseActionInfo): Boolean;
|
var AnInfo: TSynEditMouseActionInfo): Boolean;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
@ -1388,32 +1526,43 @@ begin
|
|||||||
if i >= 0 then
|
if i >= 0 then
|
||||||
RemoveCaret(i)
|
RemoveCaret(i)
|
||||||
else
|
else
|
||||||
|
if (AnInfo.NewCaret.BytePos <> CaretObj.BytePos) or (AnInfo.NewCaret.LinePos <> CaretObj.LinePos) then
|
||||||
AddCaret(AnInfo.NewCaret.BytePos, AnInfo.NewCaret.LinePos);
|
AddCaret(AnInfo.NewCaret.BytePos, AnInfo.NewCaret.LinePos);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSynPluginMultiCaret.CreateVisual: TSynPluginMultiCaretVisual;
|
function TSynCustomPluginMultiCaret.CreateVisual: TSynPluginMultiCaretVisual;
|
||||||
begin
|
begin
|
||||||
Result := inherited CreateVisual;
|
Result := inherited CreateVisual;
|
||||||
if FInPaint then
|
if FInPaint then
|
||||||
Result.BeginPaint(FPaintClip);
|
Result.BeginPaint(FPaintClip);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TSynPluginMultiCaret.Create(AOwner: TComponent);
|
constructor TSynCustomPluginMultiCaret.Create(AOwner: TComponent);
|
||||||
begin
|
begin
|
||||||
FMouseActions := TSynPluginMultiCaretMouseActions.Create(Self);
|
FMouseActions := TSynPluginMultiCaretMouseActions.Create(Self);
|
||||||
FMouseActions.ResetDefaults;
|
FMouseActions.ResetDefaults;
|
||||||
|
FEnableWithColumnSelection := True;
|
||||||
inherited Create(AOwner);
|
inherited Create(AOwner);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TSynPluginMultiCaret.Destroy;
|
destructor TSynCustomPluginMultiCaret.Destroy;
|
||||||
begin
|
begin
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
FreeAndNil(FMouseActions);
|
FreeAndNil(FMouseActions);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$IfDef SynMultiCaretDebug}
|
function TSynCustomPluginMultiCaret.AddCaretAt(X, Y: Integer): Integer;
|
||||||
|
begin
|
||||||
|
AddCaret(x, y);
|
||||||
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
|
RegisterMouseCmdIdentProcs(@IdentToSynMouseCmd, @SynMouseCmdToIdent);
|
||||||
|
RegisterExtraGetEditorMouseCommandValues(@GetEditorMouseCommandValues);
|
||||||
|
RegisterMouseCmdNameAndOptProcs(@MouseCommandName, @MouseCommandConfigName);
|
||||||
|
|
||||||
|
{$IfDef SynMultiCaretDebug}
|
||||||
SynMCaretDebug := DebugLogger.FindOrRegisterLogGroup('SynMultiCaretDebug' {$IFDEF SynMultiCaretDebug} , True {$ENDIF} );
|
SynMCaretDebug := DebugLogger.FindOrRegisterLogGroup('SynMultiCaretDebug' {$IFDEF SynMultiCaretDebug} , True {$ENDIF} );
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end.
|
end.
|
||||||
|
@ -22,10 +22,13 @@ type
|
|||||||
FMultiCaret: TSynPluginMultiCaretTest;
|
FMultiCaret: TSynPluginMultiCaretTest;
|
||||||
public
|
public
|
||||||
procedure ReCreateEdit; reintroduce;
|
procedure ReCreateEdit; reintroduce;
|
||||||
|
procedure ReCreateEdit(ALines: TStringArray; AOpt: TSynEditorOptions2 = [];
|
||||||
|
AOptRemove: TSynEditorOptions2 = []);
|
||||||
procedure RunCmdSeq(cmds: Array of TSynEditorCommand; chars: array of String);
|
procedure RunCmdSeq(cmds: Array of TSynEditorCommand; chars: array of String);
|
||||||
published
|
published
|
||||||
procedure CaretList;
|
procedure CaretList;
|
||||||
procedure Edit;
|
procedure Edit;
|
||||||
|
procedure Delete;
|
||||||
procedure ReplaceColSel;
|
procedure ReplaceColSel;
|
||||||
procedure TabKey;
|
procedure TabKey;
|
||||||
procedure Paste;
|
procedure Paste;
|
||||||
@ -44,6 +47,14 @@ begin
|
|||||||
SynEdit.TabWidth := 4;
|
SynEdit.TabWidth := 4;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestMultiCaret.ReCreateEdit(ALines: TStringArray; AOpt: TSynEditorOptions2;
|
||||||
|
AOptRemove: TSynEditorOptions2);
|
||||||
|
begin
|
||||||
|
ReCreateEdit;
|
||||||
|
SynEdit.Options2 := SynEdit.Options2 - AOptRemove + AOpt;
|
||||||
|
SetLines(ALines);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestMultiCaret.RunCmdSeq(cmds: array of TSynEditorCommand; chars: array of String);
|
procedure TTestMultiCaret.RunCmdSeq(cmds: array of TSynEditorCommand; chars: array of String);
|
||||||
var
|
var
|
||||||
i, j: Integer;
|
i, j: Integer;
|
||||||
@ -231,6 +242,182 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestMultiCaret.Delete;
|
||||||
|
function TestText1: TStringArray;
|
||||||
|
begin
|
||||||
|
SetLength(Result, 8);
|
||||||
|
Result[0] := '1aA';
|
||||||
|
Result[1] := '2bB';
|
||||||
|
Result[2] := '3cC';
|
||||||
|
Result[3] := '4dD';
|
||||||
|
Result[4] := '5eE';
|
||||||
|
Result[5] := '6fF';
|
||||||
|
Result[6] := '7gG';
|
||||||
|
Result[7] := '';
|
||||||
|
end;
|
||||||
|
function TestText1Del: TStringArray;
|
||||||
|
begin
|
||||||
|
SetLength(Result, 8);
|
||||||
|
Result[0] := '1aA';
|
||||||
|
Result[1] := '2B';
|
||||||
|
Result[2] := '3C';
|
||||||
|
Result[3] := '4D';
|
||||||
|
Result[4] := '5E';
|
||||||
|
Result[5] := '6F';
|
||||||
|
Result[6] := '7gG';
|
||||||
|
Result[7] := '';
|
||||||
|
end;
|
||||||
|
function TestText1Del2: TStringArray;
|
||||||
|
begin
|
||||||
|
SetLength(Result, 8);
|
||||||
|
Result[0] := '1aA';
|
||||||
|
Result[1] := 'B';
|
||||||
|
Result[2] := 'C';
|
||||||
|
Result[3] := 'D';
|
||||||
|
Result[4] := 'E';
|
||||||
|
Result[5] := 'F';
|
||||||
|
Result[6] := '7gG';
|
||||||
|
Result[7] := '';
|
||||||
|
end;
|
||||||
|
function TestText1DelExtra: TStringArray;
|
||||||
|
begin
|
||||||
|
SetLength(Result, 8);
|
||||||
|
Result[0] := '1aA';
|
||||||
|
Result[1] := '2B';
|
||||||
|
Result[2] := '3';
|
||||||
|
Result[3] := 'D';
|
||||||
|
Result[4] := '5E';
|
||||||
|
Result[5] := '6F';
|
||||||
|
Result[6] := '7gG';
|
||||||
|
Result[7] := '';
|
||||||
|
end;
|
||||||
|
var
|
||||||
|
Opt, OptRemove: TSynEditorOptions2;
|
||||||
|
begin
|
||||||
|
PushBaseName('NO eoPersistentBlock, HAS eoOverwriteBlock');
|
||||||
|
Opt := [eoOverwriteBlock];
|
||||||
|
OptRemove := [eoPersistentBlock];
|
||||||
|
|
||||||
|
PushBaseName('ecDeleteLastChar');
|
||||||
|
|
||||||
|
PushBaseName('ecDeleteLastChar - zero width sel');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(3,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown], []);
|
||||||
|
RunCmdSeq([ecDeleteLastChar], []);
|
||||||
|
TestIsFullText('', TestText1Del);
|
||||||
|
TestIsCaret('', 2, 6);
|
||||||
|
|
||||||
|
PopPushBaseName('ecDeleteLastChar - ONE width backward sel');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(3,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown, ecColSelLeft], []);
|
||||||
|
RunCmdSeq([ecDeleteLastChar], []);
|
||||||
|
TestIsFullText('', TestText1Del);
|
||||||
|
TestIsCaret('', 2, 6);
|
||||||
|
|
||||||
|
PopPushBaseName('ecDeleteLastChar - ONE width sel');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(2,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown, ecColSelRight], []);
|
||||||
|
RunCmdSeq([ecDeleteLastChar], []);
|
||||||
|
TestIsFullText('', TestText1Del);
|
||||||
|
TestIsCaret('', 2, 6);
|
||||||
|
|
||||||
|
PopPushBaseName('ecDeleteLastChar - Two width sel');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(1,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown, ecColSelRight, ecColSelRight], []);
|
||||||
|
RunCmdSeq([ecDeleteLastChar], []);
|
||||||
|
TestIsFullText('', TestText1Del2);
|
||||||
|
TestIsCaret('', 1, 6);
|
||||||
|
|
||||||
|
PopPushBaseName('ecDeleteLastChar - ONE width sel / extra caret');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(2,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown, ecColSelRight], []);
|
||||||
|
FMultiCaret.AddCaretAt(4,3);
|
||||||
|
FMultiCaret.AddCaretAt(2,4);
|
||||||
|
RunCmdSeq([ecDeleteLastChar], []);
|
||||||
|
TestIsFullText('', TestText1DelExtra);
|
||||||
|
TestIsCaret('', 2, 6);
|
||||||
|
|
||||||
|
PopPushBaseName('ecDeleteChar');
|
||||||
|
|
||||||
|
PushBaseName('ecDeleteChar - zero width sel');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(2,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown], []);
|
||||||
|
RunCmdSeq([ecDeleteChar], []);
|
||||||
|
TestIsFullText('', TestText1Del);
|
||||||
|
TestIsCaret('', 2, 6);
|
||||||
|
|
||||||
|
PopPushBaseName('ecDeleteChar - ONE width backward sel');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(3,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown, ecColSelLeft], []);
|
||||||
|
RunCmdSeq([ecDeleteChar], []);
|
||||||
|
TestIsFullText('', TestText1Del);
|
||||||
|
TestIsCaret('', 2, 6);
|
||||||
|
|
||||||
|
PopPushBaseName('ecDeleteChar - ONE width sel');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(2,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown, ecColSelRight], []);
|
||||||
|
RunCmdSeq([ecDeleteChar], []);
|
||||||
|
TestIsFullText('', TestText1Del);
|
||||||
|
TestIsCaret('', 2, 6);
|
||||||
|
|
||||||
|
PopPushBaseName('ecDeleteChar - Two width sel');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(1,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown, ecColSelRight, ecColSelRight], []);
|
||||||
|
RunCmdSeq([ecDeleteChar], []);
|
||||||
|
TestIsFullText('', TestText1Del2);
|
||||||
|
TestIsCaret('', 1, 6);
|
||||||
|
|
||||||
|
PopBaseName;
|
||||||
|
PopBaseName;
|
||||||
|
|
||||||
|
PopPushBaseName('NO eoPersistentBlock, NO eoOverwriteBlock');
|
||||||
|
Opt := [];
|
||||||
|
OptRemove := [eoOverwriteBlock, eoPersistentBlock];
|
||||||
|
|
||||||
|
PushBaseName('ecDeleteLastChar');
|
||||||
|
PopPushBaseName('ecDeleteLastChar - Two width sel');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(1,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown, ecColSelRight, ecColSelRight], []);
|
||||||
|
RunCmdSeq([ecDeleteLastChar], []);
|
||||||
|
TestIsFullText('', TestText1Del);
|
||||||
|
TestIsCaret('', 2, 6);
|
||||||
|
|
||||||
|
PopPushBaseName('ecDeleteChar');
|
||||||
|
PopPushBaseName('ecDeleteChar - Two width backward sel');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(4,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown, ecColSelLeft, ecColSelLeft], []);
|
||||||
|
RunCmdSeq([ecDeleteChar], []);
|
||||||
|
TestIsFullText('', TestText1Del);
|
||||||
|
TestIsCaret('', 2, 6);
|
||||||
|
PopBaseName;
|
||||||
|
PopBaseName;
|
||||||
|
|
||||||
|
PopPushBaseName('NO eoPersistentBlock, NO eoOverwriteBlock');
|
||||||
|
Opt := [eoPersistentBlock];
|
||||||
|
OptRemove := [eoOverwriteBlock];
|
||||||
|
|
||||||
|
PopPushBaseName('ecDeleteLastChar - Two width sel');
|
||||||
|
ReCreateEdit(TestText1, Opt, OptRemove);
|
||||||
|
SetCaret(1,2);
|
||||||
|
RunCmdSeq([ecColSelDown, ecColSelDown, ecColSelDown, ecColSelDown, ecColSelRight, ecColSelRight], []);
|
||||||
|
RunCmdSeq([ecDeleteLastChar], []);
|
||||||
|
TestIsFullText('', TestText1Del);
|
||||||
|
TestIsCaret('', 2, 6);
|
||||||
|
|
||||||
|
PopBaseName;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestMultiCaret.ReplaceColSel;
|
procedure TTestMultiCaret.ReplaceColSel;
|
||||||
function TestText1: TStringArray;
|
function TestText1: TStringArray;
|
||||||
begin
|
begin
|
||||||
|
@ -59,7 +59,7 @@ uses
|
|||||||
SynHighlighterPas, SynHighlighterPerl, SynHighlighterPHP, SynHighlighterSQL,
|
SynHighlighterPas, SynHighlighterPerl, SynHighlighterPHP, SynHighlighterSQL,
|
||||||
SynHighlighterPython, SynHighlighterUNIXShellScript, SynHighlighterXML,
|
SynHighlighterPython, SynHighlighterUNIXShellScript, SynHighlighterXML,
|
||||||
SynHighlighterJScript, SynHighlighterDiff, SynHighlighterBat, SynHighlighterIni,
|
SynHighlighterJScript, SynHighlighterDiff, SynHighlighterBat, SynHighlighterIni,
|
||||||
SynHighlighterPo,
|
SynHighlighterPo, SynPluginMultiCaret,
|
||||||
// codetools
|
// codetools
|
||||||
LinkScanner, CodeToolManager,
|
LinkScanner, CodeToolManager,
|
||||||
// IDEIntf
|
// IDEIntf
|
||||||
@ -736,6 +736,8 @@ type
|
|||||||
mbaContextMenuDebug,
|
mbaContextMenuDebug,
|
||||||
mbaContextMenuTab,
|
mbaContextMenuTab,
|
||||||
|
|
||||||
|
mbaMultiCaretToggle,
|
||||||
|
|
||||||
// Old values, needed to load old config
|
// Old values, needed to load old config
|
||||||
moTCLNone, moTMIgnore,
|
moTCLNone, moTMIgnore,
|
||||||
moTMPaste,
|
moTMPaste,
|
||||||
@ -743,7 +745,7 @@ type
|
|||||||
moTCLJumpOrBlock
|
moTCLJumpOrBlock
|
||||||
);
|
);
|
||||||
|
|
||||||
TMouseOptButtonAction = mbaNone..mbaContextMenuTab;
|
TMouseOptButtonAction = mbaNone..mbaMultiCaretToggle;
|
||||||
|
|
||||||
const
|
const
|
||||||
MouseOptButtonActionOld: Array [moTCLNone..moTCLJumpOrBlock] of TMouseOptButtonActionOld = (
|
MouseOptButtonActionOld: Array [moTCLNone..moTCLJumpOrBlock] of TMouseOptButtonActionOld = (
|
||||||
@ -913,7 +915,7 @@ type
|
|||||||
property TextAltLeftClick: TMouseOptButtonAction read FTextAltLeftClick write FTextAltLeftClick
|
property TextAltLeftClick: TMouseOptButtonAction read FTextAltLeftClick write FTextAltLeftClick
|
||||||
default mbaSelectColumn;
|
default mbaSelectColumn;
|
||||||
property TextShiftCtrlLeftClick: TMouseOptButtonAction read FTextShiftCtrlLeftClick write FTextShiftCtrlLeftClick
|
property TextShiftCtrlLeftClick: TMouseOptButtonAction read FTextShiftCtrlLeftClick write FTextShiftCtrlLeftClick
|
||||||
default mbaNone; // continue selection
|
default mbaMultiCaretToggle; // continue selection
|
||||||
property TextShiftAltLeftClick: TMouseOptButtonAction read FTextShiftAltLeftClick write FTextShiftAltLeftClick
|
property TextShiftAltLeftClick: TMouseOptButtonAction read FTextShiftAltLeftClick write FTextShiftAltLeftClick
|
||||||
default mbaNone; // continue selection
|
default mbaNone; // continue selection
|
||||||
property TextAltCtrlLeftClick: TMouseOptButtonAction read FTextAltCtrlLeftClick write FTextAltCtrlLeftClick
|
property TextAltCtrlLeftClick: TMouseOptButtonAction read FTextAltCtrlLeftClick write FTextAltCtrlLeftClick
|
||||||
@ -1312,6 +1314,7 @@ type
|
|||||||
fUndoLimit: Integer;
|
fUndoLimit: Integer;
|
||||||
fTabWidth: Integer;
|
fTabWidth: Integer;
|
||||||
FBracketHighlightStyle: TSynEditBracketHighlightStyle;
|
FBracketHighlightStyle: TSynEditBracketHighlightStyle;
|
||||||
|
FMultiCaretOnColumnSelect: Boolean;
|
||||||
|
|
||||||
// Display options
|
// Display options
|
||||||
fVisibleRightMargin: Boolean;
|
fVisibleRightMargin: Boolean;
|
||||||
@ -1586,6 +1589,8 @@ type
|
|||||||
property ReverseFoldPopUpOrder: Boolean
|
property ReverseFoldPopUpOrder: Boolean
|
||||||
read FReverseFoldPopUpOrder write FReverseFoldPopUpOrder default True;
|
read FReverseFoldPopUpOrder write FReverseFoldPopUpOrder default True;
|
||||||
property UseTabHistory: Boolean read fUseTabHistory write fUseTabHistory;
|
property UseTabHistory: Boolean read fUseTabHistory write fUseTabHistory;
|
||||||
|
property MultiCaretOnColumnSelect: Boolean
|
||||||
|
read FMultiCaretOnColumnSelect write FMultiCaretOnColumnSelect default True;
|
||||||
|
|
||||||
// Highlighter Pas
|
// Highlighter Pas
|
||||||
property PasExtendedKeywordsMode: Boolean
|
property PasExtendedKeywordsMode: Boolean
|
||||||
@ -3260,7 +3265,7 @@ begin
|
|||||||
FTextAltCtrlLeftClick := mbaNone;
|
FTextAltCtrlLeftClick := mbaNone;
|
||||||
FTextShiftLeftClick := mbaNone;
|
FTextShiftLeftClick := mbaNone;
|
||||||
FTextShiftAltLeftClick := mbaNone;
|
FTextShiftAltLeftClick := mbaNone;
|
||||||
FTextShiftCtrlLeftClick := mbaNone;
|
FTextShiftCtrlLeftClick := mbaMultiCaretToggle;
|
||||||
FTextShiftAltCtrlLeftClick := mbaNone;
|
FTextShiftAltCtrlLeftClick := mbaNone;
|
||||||
// middle
|
// middle
|
||||||
FTextMiddleClick := mbaPaste;
|
FTextMiddleClick := mbaPaste;
|
||||||
@ -3431,6 +3436,8 @@ procedure TEditorMouseOptions.ResetTextToDefault;
|
|||||||
AddCommand(emcContextMenu, True, AButton, AClickCount, ADir, AShift, AShiftMask, emcoSelectionCaretMoveOutside, 0, 1);
|
AddCommand(emcContextMenu, True, AButton, AClickCount, ADir, AShift, AShiftMask, emcoSelectionCaretMoveOutside, 0, 1);
|
||||||
mbaContextMenuTab:
|
mbaContextMenuTab:
|
||||||
AddCommand(emcContextMenu, True, AButton, AClickCount, ADir, AShift, AShiftMask, emcoSelectionCaretMoveOutside, 0, 2);
|
AddCommand(emcContextMenu, True, AButton, AClickCount, ADir, AShift, AShiftMask, emcoSelectionCaretMoveOutside, 0, 2);
|
||||||
|
mbaMultiCaretToggle:
|
||||||
|
AddCommand(emcPluginMultiCaretToggleCaret, True, AButton, AClickCount, ADir, AShift, AShiftMask, 0, 0, 0);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -3505,8 +3512,8 @@ begin
|
|||||||
if FTextShiftCtrlLeftClick = mbaNone
|
if FTextShiftCtrlLeftClick = mbaNone
|
||||||
then SelKey := [ssShift]
|
then SelKey := [ssShift]
|
||||||
else SelKey := [];
|
else SelKey := [];
|
||||||
AddBtnClick(FTextCtrlLeftClick, mbXLeft, [SYNEDIT_LINK_MODIFIER], ModKeys, False, SelKey);
|
AddBtnClick(FTextCtrlLeftClick, mbXLeft, [SYNEDIT_LINK_MODIFIER], ModKeys, False, SelKey);
|
||||||
AddBtnClick(FTextShiftCtrlLeftClick, mbXLeft, [ssShift, SYNEDIT_LINK_MODIFIER], ModKeys, False, SelKey);
|
AddBtnClick(FTextShiftCtrlLeftClick, mbXLeft, [ssShift, SYNEDIT_LINK_MODIFIER], ModKeys, False, SelKey);
|
||||||
|
|
||||||
if FTextShiftAltLeftClick = mbaNone
|
if FTextShiftAltLeftClick = mbaNone
|
||||||
then SelKey := [ssShift]
|
then SelKey := [ssShift]
|
||||||
@ -4387,6 +4394,7 @@ begin
|
|||||||
FGutterSeparatorIndex := 3;
|
FGutterSeparatorIndex := 3;
|
||||||
fSynEditOptions := SynEditDefaultOptions;
|
fSynEditOptions := SynEditDefaultOptions;
|
||||||
fSynEditOptions2 := SynEditDefaultOptions2;
|
fSynEditOptions2 := SynEditDefaultOptions2;
|
||||||
|
FMultiCaretOnColumnSelect := True;
|
||||||
|
|
||||||
// Display options
|
// Display options
|
||||||
fEditorFont := SynDefaultFontName;
|
fEditorFont := SynDefaultFontName;
|
||||||
@ -5539,6 +5547,10 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$IFnDEF WithoutSynMultiCaret}
|
||||||
|
if ASynEdit is TIDESynEditor then
|
||||||
|
TIDESynEditor(ASynEdit).MultiCaret.EnableWithColumnSelection := MultiCaretOnColumnSelect;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
// Display options
|
// Display options
|
||||||
ASynEdit.Gutter.Visible := fVisibleGutter;
|
ASynEdit.Gutter.Visible := fVisibleGutter;
|
||||||
|
@ -200,7 +200,7 @@ object EditorGeneralOptionsFrame: TEditorGeneralOptionsFrame
|
|||||||
AnchorSideTop.Side = asrBottom
|
AnchorSideTop.Side = asrBottom
|
||||||
Left = 6
|
Left = 6
|
||||||
Height = 19
|
Height = 19
|
||||||
Top = 254
|
Top = 273
|
||||||
Width = 152
|
Width = 152
|
||||||
BorderSpacing.Left = 6
|
BorderSpacing.Left = 6
|
||||||
BorderSpacing.Top = 6
|
BorderSpacing.Top = 6
|
||||||
@ -214,7 +214,7 @@ object EditorGeneralOptionsFrame: TEditorGeneralOptionsFrame
|
|||||||
AnchorSideTop.Side = asrBottom
|
AnchorSideTop.Side = asrBottom
|
||||||
Left = 218
|
Left = 218
|
||||||
Height = 19
|
Height = 19
|
||||||
Top = 254
|
Top = 273
|
||||||
Width = 152
|
Width = 152
|
||||||
BorderSpacing.Top = 6
|
BorderSpacing.Top = 6
|
||||||
Caption = 'OverwriteBlockCheckBox'
|
Caption = 'OverwriteBlockCheckBox'
|
||||||
@ -251,7 +251,6 @@ object EditorGeneralOptionsFrame: TEditorGeneralOptionsFrame
|
|||||||
Top = 0
|
Top = 0
|
||||||
Width = 434
|
Width = 434
|
||||||
Caption = 'UndoGroupDivider'
|
Caption = 'UndoGroupDivider'
|
||||||
Autosize = True
|
|
||||||
Anchors = [akTop, akLeft, akRight]
|
Anchors = [akTop, akLeft, akRight]
|
||||||
Font.Style = [fsBold]
|
Font.Style = [fsBold]
|
||||||
ParentFont = False
|
ParentFont = False
|
||||||
@ -267,7 +266,6 @@ object EditorGeneralOptionsFrame: TEditorGeneralOptionsFrame
|
|||||||
Top = 65
|
Top = 65
|
||||||
Width = 434
|
Width = 434
|
||||||
Caption = 'ScrollGroupDivider'
|
Caption = 'ScrollGroupDivider'
|
||||||
Autosize = True
|
|
||||||
Anchors = [akTop, akLeft, akRight]
|
Anchors = [akTop, akLeft, akRight]
|
||||||
BorderSpacing.Top = 6
|
BorderSpacing.Top = 6
|
||||||
Font.Style = [fsBold]
|
Font.Style = [fsBold]
|
||||||
@ -284,7 +282,6 @@ object EditorGeneralOptionsFrame: TEditorGeneralOptionsFrame
|
|||||||
Top = 130
|
Top = 130
|
||||||
Width = 434
|
Width = 434
|
||||||
Caption = 'CaretGroupDivider'
|
Caption = 'CaretGroupDivider'
|
||||||
Autosize = True
|
|
||||||
Anchors = [akTop, akLeft, akRight]
|
Anchors = [akTop, akLeft, akRight]
|
||||||
BorderSpacing.Top = 6
|
BorderSpacing.Top = 6
|
||||||
Font.Style = [fsBold]
|
Font.Style = [fsBold]
|
||||||
@ -292,16 +289,15 @@ object EditorGeneralOptionsFrame: TEditorGeneralOptionsFrame
|
|||||||
end
|
end
|
||||||
object BlockGroupDivider: TDividerBevel
|
object BlockGroupDivider: TDividerBevel
|
||||||
AnchorSideLeft.Control = Owner
|
AnchorSideLeft.Control = Owner
|
||||||
AnchorSideTop.Control = ScrollPastEndLineCheckBox
|
AnchorSideTop.Control = MultiCaretOnColumnSelection
|
||||||
AnchorSideTop.Side = asrBottom
|
AnchorSideTop.Side = asrBottom
|
||||||
AnchorSideRight.Control = Owner
|
AnchorSideRight.Control = Owner
|
||||||
AnchorSideRight.Side = asrBottom
|
AnchorSideRight.Side = asrBottom
|
||||||
Left = 0
|
Left = 0
|
||||||
Height = 15
|
Height = 15
|
||||||
Top = 233
|
Top = 252
|
||||||
Width = 434
|
Width = 434
|
||||||
Caption = 'BlockGroupDivider'
|
Caption = 'BlockGroupDivider'
|
||||||
Autosize = True
|
|
||||||
Anchors = [akTop, akLeft, akRight]
|
Anchors = [akTop, akLeft, akRight]
|
||||||
BorderSpacing.Top = 6
|
BorderSpacing.Top = 6
|
||||||
Font.Style = [fsBold]
|
Font.Style = [fsBold]
|
||||||
@ -318,4 +314,16 @@ object EditorGeneralOptionsFrame: TEditorGeneralOptionsFrame
|
|||||||
Caption = 'Scroll Hint'
|
Caption = 'Scroll Hint'
|
||||||
TabOrder = 16
|
TabOrder = 16
|
||||||
end
|
end
|
||||||
|
object MultiCaretOnColumnSelection: TCheckBox
|
||||||
|
AnchorSideLeft.Control = Owner
|
||||||
|
AnchorSideTop.Control = ScrollPastEndLineCheckBox
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
Left = 6
|
||||||
|
Height = 19
|
||||||
|
Top = 227
|
||||||
|
Width = 183
|
||||||
|
BorderSpacing.Left = 6
|
||||||
|
Caption = 'MultiCaretOnColumnSelection'
|
||||||
|
TabOrder = 17
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -34,6 +34,7 @@ type
|
|||||||
{ TEditorGeneralOptionsFrame }
|
{ TEditorGeneralOptionsFrame }
|
||||||
|
|
||||||
TEditorGeneralOptionsFrame = class(TAbstractIDEOptionsEditor)
|
TEditorGeneralOptionsFrame = class(TAbstractIDEOptionsEditor)
|
||||||
|
MultiCaretOnColumnSelection: TCheckBox;
|
||||||
CursorSkipsTabCheckBox: TCheckBox;
|
CursorSkipsTabCheckBox: TCheckBox;
|
||||||
CaretGroupDivider: TDividerBevel;
|
CaretGroupDivider: TDividerBevel;
|
||||||
BlockGroupDivider: TDividerBevel;
|
BlockGroupDivider: TDividerBevel;
|
||||||
@ -138,6 +139,7 @@ begin
|
|||||||
CursorSkipsTabCheckBox.Caption := dlgCursorSkipsTab;
|
CursorSkipsTabCheckBox.Caption := dlgCursorSkipsTab;
|
||||||
HomeKeyJumpsToNearestStartCheckBox.Caption := dlgHomeKeyJumpsToNearestStart;
|
HomeKeyJumpsToNearestStartCheckBox.Caption := dlgHomeKeyJumpsToNearestStart;
|
||||||
EndKeyJumpsToNearestStartCheckBox.Caption := dlgEndKeyJumpsToNearestStart;
|
EndKeyJumpsToNearestStartCheckBox.Caption := dlgEndKeyJumpsToNearestStart;
|
||||||
|
MultiCaretOnColumnSelection.Caption := dlgMultiCaretOnColumnSelection;
|
||||||
|
|
||||||
// Block
|
// Block
|
||||||
BlockGroupDivider.Caption := dlgBlockGroupOptions;
|
BlockGroupDivider.Caption := dlgBlockGroupOptions;
|
||||||
@ -171,6 +173,7 @@ begin
|
|||||||
CursorSkipsTabCheckBox.Checked := eoCaretSkipTab in SynEditOptions2;
|
CursorSkipsTabCheckBox.Checked := eoCaretSkipTab in SynEditOptions2;
|
||||||
HomeKeyJumpsToNearestStartCheckBox.Checked := eoEnhanceHomeKey in SynEditOptions;
|
HomeKeyJumpsToNearestStartCheckBox.Checked := eoEnhanceHomeKey in SynEditOptions;
|
||||||
EndKeyJumpsToNearestStartCheckBox.Checked := eoEnhanceEndKey in SynEditOptions2;
|
EndKeyJumpsToNearestStartCheckBox.Checked := eoEnhanceEndKey in SynEditOptions2;
|
||||||
|
MultiCaretOnColumnSelection.Checked := MultiCaretOnColumnSelect;
|
||||||
|
|
||||||
// block
|
// block
|
||||||
PersistentBlockCheckBox.Checked := eoPersistentBlock in SynEditOptions2;
|
PersistentBlockCheckBox.Checked := eoPersistentBlock in SynEditOptions2;
|
||||||
@ -230,6 +233,7 @@ begin
|
|||||||
UpdateOptionFromBool(CursorSkipsTabCheckBox.Checked, eoCaretSkipTab);
|
UpdateOptionFromBool(CursorSkipsTabCheckBox.Checked, eoCaretSkipTab);
|
||||||
UpdateOptionFromBool(HomeKeyJumpsToNearestStartCheckBox.Checked, eoEnhanceHomeKey);
|
UpdateOptionFromBool(HomeKeyJumpsToNearestStartCheckBox.Checked, eoEnhanceHomeKey);
|
||||||
UpdateOptionFromBool(EndKeyJumpsToNearestStartCheckBox.Checked, eoEnhanceEndKey);
|
UpdateOptionFromBool(EndKeyJumpsToNearestStartCheckBox.Checked, eoEnhanceEndKey);
|
||||||
|
MultiCaretOnColumnSelect := MultiCaretOnColumnSelection.Checked;
|
||||||
|
|
||||||
// block
|
// block
|
||||||
UpdateOptionFromBool(PersistentBlockCheckBox.Checked, eoPersistentBlock);
|
UpdateOptionFromBool(PersistentBlockCheckBox.Checked, eoPersistentBlock);
|
||||||
|
@ -577,6 +577,7 @@ procedure TEditorMouseOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
|
|||||||
ACombo.Items.Add(dlfMouseSimpleButtonContextMenu); // mbaContextMenu
|
ACombo.Items.Add(dlfMouseSimpleButtonContextMenu); // mbaContextMenu
|
||||||
ACombo.Items.Add(dlfMouseSimpleButtonContextMenuDbg); // mbaContextMenuDebug;
|
ACombo.Items.Add(dlfMouseSimpleButtonContextMenuDbg); // mbaContextMenuDebug;
|
||||||
ACombo.Items.Add(dlfMouseSimpleButtonContextMenuTab); // mbaContextMenuTab;
|
ACombo.Items.Add(dlfMouseSimpleButtonContextMenuTab); // mbaContextMenuTab;
|
||||||
|
ACombo.Items.Add(dlfMouseSimpleButtonMultiCaretToggle); // mbaMultiCaretToggle;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure SetupWheelCombo(ACombo: TComboBox);
|
procedure SetupWheelCombo(ACombo: TComboBox);
|
||||||
|
@ -1604,6 +1604,7 @@ resourcestring
|
|||||||
dlfMouseSimpleButtonContextMenu = 'Context Menu';
|
dlfMouseSimpleButtonContextMenu = 'Context Menu';
|
||||||
dlfMouseSimpleButtonContextMenuDbg = 'Context Menu (debug)';
|
dlfMouseSimpleButtonContextMenuDbg = 'Context Menu (debug)';
|
||||||
dlfMouseSimpleButtonContextMenuTab = 'Context Menu (tab)';
|
dlfMouseSimpleButtonContextMenuTab = 'Context Menu (tab)';
|
||||||
|
dlfMouseSimpleButtonMultiCaretToggle = 'Toggle extra Caret';
|
||||||
|
|
||||||
dlfMouseSimpleWheelNothing = 'Nothing/Default';
|
dlfMouseSimpleWheelNothing = 'Nothing/Default';
|
||||||
dlfMouseSimpleWheelSrollDef = 'Scroll (System speed)';
|
dlfMouseSimpleWheelSrollDef = 'Scroll (System speed)';
|
||||||
@ -1687,6 +1688,7 @@ resourcestring
|
|||||||
dlgCopyWordAtCursorOnCopyNone = 'Copy word on copy none';
|
dlgCopyWordAtCursorOnCopyNone = 'Copy word on copy none';
|
||||||
dlgHomeKeyJumpsToNearestStart = 'Home key jumps to nearest start';
|
dlgHomeKeyJumpsToNearestStart = 'Home key jumps to nearest start';
|
||||||
dlgEndKeyJumpsToNearestStart = 'End key jumps to nearest end';
|
dlgEndKeyJumpsToNearestStart = 'End key jumps to nearest end';
|
||||||
|
dlgMultiCaretOnColumnSelection = 'Enable multi caret for column selection';
|
||||||
dlgColorLink = '(Edit Color)';
|
dlgColorLink = '(Edit Color)';
|
||||||
dlgKeyLink = '(Edit Key)';
|
dlgKeyLink = '(Edit Key)';
|
||||||
dlgBracketHighlight = 'Bracket highlight';
|
dlgBracketHighlight = 'Bracket highlight';
|
||||||
|
@ -48,6 +48,7 @@ type
|
|||||||
MousePos: TPoint; var Handled: Boolean);
|
MousePos: TPoint; var Handled: Boolean);
|
||||||
private
|
private
|
||||||
FKeyMap: TKeyCommandRelationList;
|
FKeyMap: TKeyCommandRelationList;
|
||||||
|
procedure AddMouseCmd(const S: string);
|
||||||
public
|
public
|
||||||
{ public declarations }
|
{ public declarations }
|
||||||
Procedure ResetInputs;
|
Procedure ResetInputs;
|
||||||
@ -80,10 +81,20 @@ end;
|
|||||||
|
|
||||||
{ MouseaActionDialog }
|
{ MouseaActionDialog }
|
||||||
|
|
||||||
procedure TMouseaActionDialog.FormCreate(Sender: TObject);
|
procedure TMouseaActionDialog.AddMouseCmd(const S: string);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
CName: String;
|
s2: String;
|
||||||
|
begin
|
||||||
|
if IdentToSynMouseCmd(S, i) then begin
|
||||||
|
s2 := MouseCommandName(i);
|
||||||
|
if s2 = '' then s2 := s;
|
||||||
|
ActionBox.Items.AddObject(s2, TObject(ptrint(i)));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMouseaActionDialog.FormCreate(Sender: TObject);
|
||||||
|
var
|
||||||
mb: TSynMouseButton;
|
mb: TSynMouseButton;
|
||||||
cc: TSynMAClickCount;
|
cc: TSynMAClickCount;
|
||||||
begin
|
begin
|
||||||
@ -109,11 +120,7 @@ begin
|
|||||||
CapturePanel.ControlStyle := ControlStyle + [csTripleClicks, csQuadClicks];
|
CapturePanel.ControlStyle := ControlStyle + [csTripleClicks, csQuadClicks];
|
||||||
CaretCheck.Caption := dlgMouseOptCaretMove;
|
CaretCheck.Caption := dlgMouseOptCaretMove;
|
||||||
ActionBox.Clear;
|
ActionBox.Clear;
|
||||||
for i:= 0 to emcMax do begin
|
GetEditorMouseCommandValues(@AddMouseCmd);
|
||||||
CName := MouseCommandName(i);
|
|
||||||
if CName <> '' then
|
|
||||||
ActionBox.Items.AddObject(CName, TObject(ptrint(i)));
|
|
||||||
end;
|
|
||||||
ButtonBox.Clear;
|
ButtonBox.Clear;
|
||||||
for mb := low(TSynMouseButton) to high(TSynMouseButton) do
|
for mb := low(TSynMouseButton) to high(TSynMouseButton) do
|
||||||
ButtonBox.Items.add(ButtonName[mb]);
|
ButtonBox.Items.add(ButtonName[mb]);
|
||||||
|
@ -56,7 +56,7 @@ uses
|
|||||||
SynEditTextBuffer, SynEditFoldedView, SynTextDrawer, SynEditTextBase, LazSynEditText,
|
SynEditTextBuffer, SynEditFoldedView, SynTextDrawer, SynEditTextBase, LazSynEditText,
|
||||||
SynPluginTemplateEdit, SynPluginSyncroEdit, LazSynTextArea, SynEditHighlighter,
|
SynPluginTemplateEdit, SynPluginSyncroEdit, LazSynTextArea, SynEditHighlighter,
|
||||||
SynEditHighlighterFoldBase, SynHighlighterPas, SynEditMarkupHighAll, SynEditKeyCmds,
|
SynEditHighlighterFoldBase, SynHighlighterPas, SynEditMarkupHighAll, SynEditKeyCmds,
|
||||||
SynEditMarkupIfDef, SynEditMiscProcs, SynPluginMultiCaret,
|
SynEditMarkupIfDef, SynEditMiscProcs, SynPluginMultiCaret, SynEditPointClasses,
|
||||||
etSrcEditMarks, LazarusIDEStrConsts;
|
etSrcEditMarks, LazarusIDEStrConsts;
|
||||||
|
|
||||||
type
|
type
|
||||||
@ -1610,8 +1610,9 @@ begin
|
|||||||
FUserWordsList := TFPList.Create;
|
FUserWordsList := TFPList.Create;
|
||||||
FTemplateEdit:=TSynPluginTemplateEdit.Create(Self);
|
FTemplateEdit:=TSynPluginTemplateEdit.Create(Self);
|
||||||
FSyncroEdit := TSynPluginSyncroEdit.Create(Self);
|
FSyncroEdit := TSynPluginSyncroEdit.Create(Self);
|
||||||
{$IFDEF WithSynMultiCaret}
|
{$IFnDEF WithoutSynMultiCaret}
|
||||||
FMultiCaret := TSynPluginMultiCaret.Create(Self);
|
FMultiCaret := TSynPluginMultiCaret.Create(Self);
|
||||||
|
FMultiCaret.MouseActions.Clear; // will be added to SynEdit
|
||||||
FMultiCaret.SetCaretTypeSize(ctVerticalLine, 2, 1024, -1, 0, [ccsRelativeHeight]);
|
FMultiCaret.SetCaretTypeSize(ctVerticalLine, 2, 1024, -1, 0, [ccsRelativeHeight]);
|
||||||
FMultiCaret.SetCaretTypeSize(ctBlock, 1024, 1024, 0, 0, [ccsRelativeWidth, ccsRelativeHeight]);
|
FMultiCaret.SetCaretTypeSize(ctBlock, 1024, 1024, 0, 0, [ccsRelativeWidth, ccsRelativeHeight]);
|
||||||
FMultiCaret.Color := $606060;
|
FMultiCaret.Color := $606060;
|
||||||
|
Loading…
Reference in New Issue
Block a user