mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 21:59:16 +02:00
SynEdit (plugins: syncro,templ,complete) remove dynamic allocation of commands. Fix issue #0026329
git-svn-id: trunk@47522 -
This commit is contained in:
parent
f38736684f
commit
7832ffec7f
@ -435,16 +435,15 @@ type
|
|||||||
procedure PrettyTextOut(c: TCanvas; x, y: integer; s: string);
|
procedure PrettyTextOut(c: TCanvas; x, y: integer; s: string);
|
||||||
|
|
||||||
const
|
const
|
||||||
ecSynCompletionExecute = ecPluginFirst + 0;
|
ecSynCompletionExecute = ecPluginFirstCompletion + 0;
|
||||||
ecSynAutoCompletionExecute = ecPluginFirst + 1;
|
ecSynAutoCompletionExecute = ecPluginFirstCompletion + 1;
|
||||||
|
|
||||||
|
// If extending the list, reserve space in SynEditKeyCmds
|
||||||
|
|
||||||
ecSynCompletionCount = 2;
|
ecSynCompletionCount = 2;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
var
|
|
||||||
KeyOffset: integer;
|
|
||||||
|
|
||||||
function IsIdentifierChar(p: PChar): boolean; inline;
|
function IsIdentifierChar(p: PChar): boolean; inline;
|
||||||
{$IF FPC_FULLVERSION >= 20701}
|
{$IF FPC_FULLVERSION >= 20701}
|
||||||
var
|
var
|
||||||
@ -1795,7 +1794,7 @@ begin
|
|||||||
Form.OnPaint:=@OnFormPaint;
|
Form.OnPaint:=@OnFormPaint;
|
||||||
FEndOfTokenChr := '()[].';
|
FEndOfTokenChr := '()[].';
|
||||||
fShortCut := Menus.ShortCut(Ord(' '), [ssCtrl]);
|
fShortCut := Menus.ShortCut(Ord(' '), [ssCtrl]);
|
||||||
FExecCommandID := KeyOffset + ecSynCompletionExecute;
|
FExecCommandID := ecSynCompletionExecute;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynCompletion.SetShortCut(Value: TShortCut);
|
procedure TSynCompletion.SetShortCut(Value: TShortCut);
|
||||||
@ -1923,7 +1922,7 @@ begin
|
|||||||
FEndOfTokenChr := '()[].';
|
FEndOfTokenChr := '()[].';
|
||||||
fAutoCompleteList := TStringList.Create;
|
fAutoCompleteList := TStringList.Create;
|
||||||
fShortCut := Menus.ShortCut(Ord(' '), [ssShift]);
|
fShortCut := Menus.ShortCut(Ord(' '), [ssShift]);
|
||||||
FExecCommandID := KeyOffset + ecSynAutoCompletionExecute;
|
FExecCommandID := ecSynAutoCompletionExecute;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynAutoComplete.SetShortCut(Value: TShortCut);
|
procedure TSynAutoComplete.SetShortCut(Value: TShortCut);
|
||||||
@ -2166,14 +2165,13 @@ const
|
|||||||
function IdentToSynCompletionCommand(const Ident: string; var Cmd: longint): boolean;
|
function IdentToSynCompletionCommand(const Ident: string; var Cmd: longint): boolean;
|
||||||
begin
|
begin
|
||||||
Result := IdentToInt(Ident, Cmd, SynComplutionCommandStrs);
|
Result := IdentToInt(Ident, Cmd, SynComplutionCommandStrs);
|
||||||
if Result then inc(Cmd, KeyOffset);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function SynCompletionCommandToIdent(Cmd: longint; var Ident: string): boolean;
|
function SynCompletionCommandToIdent(Cmd: longint; var Ident: string): boolean;
|
||||||
begin
|
begin
|
||||||
Result := (Cmd - ecPluginFirst >= KeyOffset) and (Cmd - ecPluginFirst < KeyOffset + ecSynCompletionCount);
|
Result := (Cmd >= ecPluginFirstCompletion) and (Cmd - ecPluginFirstCompletion < ecSynCompletionCount);
|
||||||
if not Result then exit;
|
if not Result then exit;
|
||||||
Result := IntToIdent(Cmd - KeyOffset, Ident, SynComplutionCommandStrs);
|
Result := IntToIdent(Cmd, Ident, SynComplutionCommandStrs);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure GetEditorCommandValues(Proc: TGetStrProc);
|
procedure GetEditorCommandValues(Proc: TGetStrProc);
|
||||||
@ -2186,8 +2184,6 @@ end;
|
|||||||
|
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
KeyOffset := AllocatePluginKeyRange(ecSynCompletionCount, True);
|
|
||||||
|
|
||||||
RegisterKeyCmdIdentProcs(@IdentToSynCompletionCommand,
|
RegisterKeyCmdIdentProcs(@IdentToSynCompletionCommand,
|
||||||
@SynCompletionCommandToIdent);
|
@SynCompletionCommandToIdent);
|
||||||
RegisterExtraGetEditorCommandValues(@GetEditorCommandValues);
|
RegisterExtraGetEditorCommandValues(@GetEditorCommandValues);
|
||||||
|
@ -274,6 +274,10 @@ const
|
|||||||
|
|
||||||
ecUserFirst = 1001; // Start of user-defined commands
|
ecUserFirst = 1001; // Start of user-defined commands
|
||||||
|
|
||||||
|
ecPluginFirstCompletion = 19000;
|
||||||
|
ecPluginFirstSyncro = 19010;
|
||||||
|
ecPluginFirstTemplEdit = 19030;
|
||||||
|
|
||||||
ecPluginFirst = 20000;
|
ecPluginFirst = 20000;
|
||||||
|
|
||||||
// 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
|
||||||
|
@ -276,6 +276,7 @@ const
|
|||||||
|
|
||||||
emcMax = 29;
|
emcMax = 29;
|
||||||
|
|
||||||
|
emcPluginFirstSyncro = 19000;
|
||||||
emcPluginFirst = 20000;
|
emcPluginFirst = 20000;
|
||||||
|
|
||||||
// Options
|
// Options
|
||||||
|
@ -249,9 +249,6 @@ type
|
|||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
|
||||||
class function ConvertCommandToBase(Command: TSynEditorCommand): TSynEditorCommand;
|
|
||||||
class function ConvertBaseToCommand(Command: TSynEditorCommand): TSynEditorCommand;
|
|
||||||
|
|
||||||
published
|
published
|
||||||
property CaseSensitive: boolean read FCaseSensitive write SetCaseSensitive default false;
|
property CaseSensitive: boolean read FCaseSensitive write SetCaseSensitive default false;
|
||||||
property GutterGlyph: TBitmap read FGutterGlyph write SetGutterGlyph;
|
property GutterGlyph: TBitmap read FGutterGlyph write SetGutterGlyph;
|
||||||
@ -277,32 +274,31 @@ type
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
const
|
const
|
||||||
emcSynPSyncroEdGutterGlyph = emcPluginFirst + 0;
|
emcSynPSyncroEdGutterGlyph = emcPluginFirstSyncro + 0;
|
||||||
|
|
||||||
emcSynPSyncroEdCount = 1;
|
emcSynPSyncroEdCount = 1;
|
||||||
|
|
||||||
ecSynPSyncroEdStart = ecPluginFirst + 0;
|
ecSynPSyncroEdStart = ecPluginFirstSyncro + 0;
|
||||||
|
|
||||||
ecSynPSyncroEdNextCell = ecPluginFirst + 1;
|
ecSynPSyncroEdNextCell = ecPluginFirstSyncro + 1;
|
||||||
ecSynPSyncroEdNextCellSel = ecPluginFirst + 2;
|
ecSynPSyncroEdNextCellSel = ecPluginFirstSyncro + 2;
|
||||||
ecSynPSyncroEdPrevCell = ecPluginFirst + 3;
|
ecSynPSyncroEdPrevCell = ecPluginFirstSyncro + 3;
|
||||||
ecSynPSyncroEdPrevCellSel = ecPluginFirst + 4;
|
ecSynPSyncroEdPrevCellSel = ecPluginFirstSyncro + 4;
|
||||||
ecSynPSyncroEdCellHome = ecPluginFirst + 5;
|
ecSynPSyncroEdCellHome = ecPluginFirstSyncro + 5;
|
||||||
ecSynPSyncroEdCellEnd = ecPluginFirst + 6;
|
ecSynPSyncroEdCellEnd = ecPluginFirstSyncro + 6;
|
||||||
ecSynPSyncroEdCellSelect = ecPluginFirst + 7;
|
ecSynPSyncroEdCellSelect = ecPluginFirstSyncro + 7;
|
||||||
ecSynPSyncroEdEscape = ecPluginFirst + 8;
|
ecSynPSyncroEdEscape = ecPluginFirstSyncro + 8;
|
||||||
ecSynPSyncroEdNextFirstCell = ecPluginFirst + 9;
|
ecSynPSyncroEdNextFirstCell = ecPluginFirstSyncro + 9;
|
||||||
ecSynPSyncroEdNextFirstCellSel = ecPluginFirst + 10;
|
ecSynPSyncroEdNextFirstCellSel = ecPluginFirstSyncro + 10;
|
||||||
ecSynPSyncroEdPrevFirstCell = ecPluginFirst + 11;
|
ecSynPSyncroEdPrevFirstCell = ecPluginFirstSyncro + 11;
|
||||||
ecSynPSyncroEdPrevFirstCellSel = ecPluginFirst + 12;
|
ecSynPSyncroEdPrevFirstCellSel = ecPluginFirstSyncro + 12;
|
||||||
|
|
||||||
|
// If extending the list, reserve space in SynEditKeyCmds
|
||||||
|
|
||||||
ecSynPSyncroEdCount = 13;
|
ecSynPSyncroEdCount = 13;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
var
|
|
||||||
MouseOffset, KeyOffset: integer;
|
|
||||||
|
|
||||||
const
|
const
|
||||||
MAX_CACHE = 50; // Amount of lower-cased lines cached
|
MAX_CACHE = 50; // Amount of lower-cased lines cached
|
||||||
MAX_SYNC_ED_WORDS = 50;// 250;
|
MAX_SYNC_ED_WORDS = 50;// 250;
|
||||||
@ -1304,7 +1300,7 @@ function TSynPluginSyncroEdit.DoHandleMouseAction(AnAction: TSynEditMouseAction;
|
|||||||
begin
|
begin
|
||||||
Result := False;
|
Result := False;
|
||||||
|
|
||||||
if AnAction.Command = MouseOffset + emcSynPSyncroEdGutterGlyph then begin
|
if AnAction.Command = emcSynPSyncroEdGutterGlyph then begin
|
||||||
if Mode = spseSelecting then
|
if Mode = spseSelecting then
|
||||||
StartSyncroMode
|
StartSyncroMode
|
||||||
else
|
else
|
||||||
@ -1374,14 +1370,9 @@ begin
|
|||||||
end;
|
end;
|
||||||
if keys = nil then exit;
|
if keys = nil then exit;
|
||||||
|
|
||||||
try
|
if not FinishComboOnly then
|
||||||
keys.UsePluginOffset := True;
|
keys.ResetKeyCombo;
|
||||||
if not FinishComboOnly then
|
Command := keys.FindKeycodeEx(Code, SState, Data, IsStartOfCombo, FinishComboOnly, ComboKeyStrokes);
|
||||||
keys.ResetKeyCombo;
|
|
||||||
Command := keys.FindKeycodeEx(Code, SState, Data, IsStartOfCombo, FinishComboOnly, ComboKeyStrokes);
|
|
||||||
finally
|
|
||||||
keys.UsePluginOffset := False;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Handled := (Command <> ecNone) or IsStartOfCombo;
|
Handled := (Command <> ecNone) or IsStartOfCombo;
|
||||||
if IsStartOfCombo then
|
if IsStartOfCombo then
|
||||||
@ -1391,16 +1382,13 @@ end;
|
|||||||
procedure TSynPluginSyncroEdit.ProcessSynCommand(Sender: TObject; AfterProcessing: boolean;
|
procedure TSynPluginSyncroEdit.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);
|
||||||
var
|
|
||||||
Cmd: TSynEditorCommand;
|
|
||||||
begin
|
begin
|
||||||
if Handled or AfterProcessing or not (Active or PreActive) then exit;
|
if Handled or AfterProcessing or not (Active or PreActive) then exit;
|
||||||
|
|
||||||
if Mode = spseSelecting then begin
|
if Mode = spseSelecting then begin
|
||||||
// todo: finish word-hash calculations / check if any cells exist
|
// todo: finish word-hash calculations / check if any cells exist
|
||||||
Cmd := ConvertCommandToBase(Command);
|
|
||||||
Handled := True;
|
Handled := True;
|
||||||
case Cmd of
|
case Command of
|
||||||
ecSynPSyncroEdStart: StartSyncroMode;
|
ecSynPSyncroEdStart: StartSyncroMode;
|
||||||
else
|
else
|
||||||
Handled := False;
|
Handled := False;
|
||||||
@ -1408,10 +1396,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
if Mode = spseEditing then begin
|
if Mode = spseEditing then begin
|
||||||
Cmd := ConvertCommandToBase(Command);
|
|
||||||
|
|
||||||
Handled := True;
|
Handled := True;
|
||||||
case Cmd of
|
case Command of
|
||||||
ecSynPSyncroEdNextCell: NextCell(False, True);
|
ecSynPSyncroEdNextCell: NextCell(False, True);
|
||||||
ecSynPSyncroEdNextCellSel: NextCell(True, True);
|
ecSynPSyncroEdNextCellSel: NextCell(True, True);
|
||||||
ecSynPSyncroEdPrevCell: PreviousCell(False, True);
|
ecSynPSyncroEdPrevCell: PreviousCell(False, True);
|
||||||
@ -1444,15 +1430,12 @@ begin
|
|||||||
|
|
||||||
FKeystrokes := TSynEditSyncroEditKeyStrokes.Create(Self);
|
FKeystrokes := TSynEditSyncroEditKeyStrokes.Create(Self);
|
||||||
FKeystrokes.ResetDefaults;
|
FKeystrokes.ResetDefaults;
|
||||||
FKeystrokes.PluginOffset := KeyOffset;
|
|
||||||
|
|
||||||
FKeyStrokesOffCell := TSynEditSyncroEditKeyStrokesOffCell.Create(self);
|
FKeyStrokesOffCell := TSynEditSyncroEditKeyStrokesOffCell.Create(self);
|
||||||
FKeyStrokesOffCell.ResetDefaults;
|
FKeyStrokesOffCell.ResetDefaults;
|
||||||
FKeyStrokesOffCell.PluginOffset := KeyOffset;
|
|
||||||
|
|
||||||
FKeystrokesSelecting := TSynEditSyncroEditKeyStrokesSelecting.Create(Self);
|
FKeystrokesSelecting := TSynEditSyncroEditKeyStrokesSelecting.Create(Self);
|
||||||
FKeystrokesSelecting.ResetDefaults;
|
FKeystrokesSelecting.ResetDefaults;
|
||||||
FKeystrokesSelecting.PluginOffset := KeyOffset;
|
|
||||||
|
|
||||||
FGutterGlyph := TBitMap.Create;
|
FGutterGlyph := TBitMap.Create;
|
||||||
FGutterGlyph.OnChange := @DoImageChanged;
|
FGutterGlyph.OnChange := @DoImageChanged;
|
||||||
@ -1478,27 +1461,12 @@ begin
|
|||||||
FreeAndNil(FKeystrokesSelecting);
|
FreeAndNil(FKeystrokesSelecting);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TSynPluginSyncroEdit.ConvertCommandToBase(Command: TSynEditorCommand): TSynEditorCommand;
|
|
||||||
begin
|
|
||||||
if (Command >= ecPluginFirst + KeyOffset) and
|
|
||||||
(Command <= ecPluginFirst + KeyOffset + ecSynPSyncroEdCount)
|
|
||||||
then Result := Command - KeyOffset
|
|
||||||
else Result := ecNone;
|
|
||||||
end;
|
|
||||||
|
|
||||||
class function TSynPluginSyncroEdit.ConvertBaseToCommand(Command: TSynEditorCommand): TSynEditorCommand;
|
|
||||||
begin
|
|
||||||
if (Command >= ecPluginFirst) and (Command <= ecPluginFirst + ecSynPSyncroEdCount)
|
|
||||||
then Result := Command + KeyOffset
|
|
||||||
else Result := ecNone;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ TSynPluginSyncroEditMouseActions }
|
{ TSynPluginSyncroEditMouseActions }
|
||||||
|
|
||||||
procedure TSynPluginSyncroEditMouseActions.ResetDefaults;
|
procedure TSynPluginSyncroEditMouseActions.ResetDefaults;
|
||||||
begin
|
begin
|
||||||
Clear;
|
Clear;
|
||||||
AddCommand(MouseOffset + emcSynPSyncroEdGutterGlyph, False, mbXLeft, ccAny, cdDown, [], []);
|
AddCommand(emcSynPSyncroEdGutterGlyph, False, mbXLeft, ccAny, cdDown, [], []);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TSynEditSyncroEditKeyStrokesSelecting }
|
{ TSynEditSyncroEditKeyStrokesSelecting }
|
||||||
@ -1588,14 +1556,13 @@ const
|
|||||||
function IdentToSyncroCommand(const Ident: string; var Cmd: longint): boolean;
|
function IdentToSyncroCommand(const Ident: string; var Cmd: longint): boolean;
|
||||||
begin
|
begin
|
||||||
Result := IdentToInt(Ident, Cmd, EditorSyncroCommandStrs);
|
Result := IdentToInt(Ident, Cmd, EditorSyncroCommandStrs);
|
||||||
if Result then inc(Cmd, KeyOffset);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function SyncroCommandToIdent(Cmd: longint; var Ident: string): boolean;
|
function SyncroCommandToIdent(Cmd: longint; var Ident: string): boolean;
|
||||||
begin
|
begin
|
||||||
Result := (Cmd - ecPluginFirst >= KeyOffset) and (Cmd - ecPluginFirst < KeyOffset + ecSynPSyncroEdCount);
|
Result := (Cmd >= ecPluginFirstSyncro) and (Cmd - ecPluginFirstSyncro < ecSynPSyncroEdCount);
|
||||||
if not Result then exit;
|
if not Result then exit;
|
||||||
Result := IntToIdent(Cmd - KeyOffset, Ident, EditorSyncroCommandStrs);
|
Result := IntToIdent(Cmd, Ident, EditorSyncroCommandStrs);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure GetEditorCommandValues(Proc: TGetStrProc);
|
procedure GetEditorCommandValues(Proc: TGetStrProc);
|
||||||
@ -1608,9 +1575,6 @@ end;
|
|||||||
|
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
MouseOffset := AllocatePluginMouseRange(emcSynPSyncroEdCount, True);
|
|
||||||
KeyOffset := AllocatePluginKeyRange(ecSynPSyncroEdCount, True);
|
|
||||||
|
|
||||||
RegisterKeyCmdIdentProcs(@IdentToSyncroCommand,
|
RegisterKeyCmdIdentProcs(@IdentToSyncroCommand,
|
||||||
@SyncroCommandToIdent);
|
@SyncroCommandToIdent);
|
||||||
RegisterExtraGetEditorCommandValues(@GetEditorCommandValues);
|
RegisterExtraGetEditorCommandValues(@GetEditorCommandValues);
|
||||||
|
@ -71,8 +71,6 @@ type
|
|||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
class function ConvertCommandToBase(Command: TSynEditorCommand): TSynEditorCommand;
|
|
||||||
class function ConvertBaseToCommand(Command: TSynEditorCommand): TSynEditorCommand;
|
|
||||||
|
|
||||||
procedure SetTemplate(aTmpl: String; aLogCaretPos: TPoint); // Replaces current selection
|
procedure SetTemplate(aTmpl: String; aLogCaretPos: TPoint); // Replaces current selection
|
||||||
// Coords relativ to the template. base (1, 1)
|
// Coords relativ to the template. base (1, 1)
|
||||||
@ -86,41 +84,38 @@ type
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
const
|
const
|
||||||
ecSynPTmplEdNextCell = ecPluginFirst + 0;
|
ecSynPTmplEdNextCell = ecPluginFirstTemplEdit + 0;
|
||||||
ecSynPTmplEdNextCellSel = ecPluginFirst + 1;
|
ecSynPTmplEdNextCellSel = ecPluginFirstTemplEdit + 1;
|
||||||
ecSynPTmplEdNextCellRotate = ecPluginFirst + 2;
|
ecSynPTmplEdNextCellRotate = ecPluginFirstTemplEdit + 2;
|
||||||
ecSynPTmplEdNextCellSelRotate = ecPluginFirst + 3;
|
ecSynPTmplEdNextCellSelRotate = ecPluginFirstTemplEdit + 3;
|
||||||
ecSynPTmplEdPrevCell = ecPluginFirst + 4;
|
ecSynPTmplEdPrevCell = ecPluginFirstTemplEdit + 4;
|
||||||
ecSynPTmplEdPrevCellSel = ecPluginFirst + 5;
|
ecSynPTmplEdPrevCellSel = ecPluginFirstTemplEdit + 5;
|
||||||
ecSynPTmplEdCellHome = ecPluginFirst + 6;
|
ecSynPTmplEdCellHome = ecPluginFirstTemplEdit + 6;
|
||||||
ecSynPTmplEdCellEnd = ecPluginFirst + 7;
|
ecSynPTmplEdCellEnd = ecPluginFirstTemplEdit + 7;
|
||||||
ecSynPTmplEdCellSelect = ecPluginFirst + 8;
|
ecSynPTmplEdCellSelect = ecPluginFirstTemplEdit + 8;
|
||||||
ecSynPTmplEdFinish = ecPluginFirst + 9;
|
ecSynPTmplEdFinish = ecPluginFirstTemplEdit + 9;
|
||||||
ecSynPTmplEdEscape = ecPluginFirst + 10;
|
ecSynPTmplEdEscape = ecPluginFirstTemplEdit + 10;
|
||||||
ecSynPTmplEdNextFirstCell = ecPluginFirst + 11;
|
ecSynPTmplEdNextFirstCell = ecPluginFirstTemplEdit + 11;
|
||||||
ecSynPTmplEdNextFirstCellSel = ecPluginFirst + 12;
|
ecSynPTmplEdNextFirstCellSel = ecPluginFirstTemplEdit + 12;
|
||||||
ecSynPTmplEdNextFirstCellRotate = ecPluginFirst + 13;
|
ecSynPTmplEdNextFirstCellRotate = ecPluginFirstTemplEdit + 13;
|
||||||
ecSynPTmplEdNextFirstCellSelRotate = ecPluginFirst + 14;
|
ecSynPTmplEdNextFirstCellSelRotate = ecPluginFirstTemplEdit + 14;
|
||||||
ecSynPTmplEdPrevFirstCell = ecPluginFirst + 15;
|
ecSynPTmplEdPrevFirstCell = ecPluginFirstTemplEdit + 15;
|
||||||
ecSynPTmplEdPrevFirstCellSel = ecPluginFirst + 16;
|
ecSynPTmplEdPrevFirstCellSel = ecPluginFirstTemplEdit + 16;
|
||||||
|
|
||||||
|
// If extending the list, reserve space in SynEditKeyCmds
|
||||||
|
|
||||||
ecSynPTmplEdCount = 17;
|
ecSynPTmplEdCount = 17;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
var
|
|
||||||
KeyOffset: integer;
|
|
||||||
|
|
||||||
{ TSynPluginTemplateEdit }
|
{ TSynPluginTemplateEdit }
|
||||||
|
|
||||||
constructor TSynPluginTemplateEdit.Create(AOwner: TComponent);
|
constructor TSynPluginTemplateEdit.Create(AOwner: TComponent);
|
||||||
begin
|
begin
|
||||||
FKeystrokes := TSynEditTemplateEditKeyStrokes.Create(Self);
|
FKeystrokes := TSynEditTemplateEditKeyStrokes.Create(Self);
|
||||||
FKeystrokes.ResetDefaults;
|
FKeystrokes.ResetDefaults;
|
||||||
FKeystrokes.PluginOffset := KeyOffset;
|
|
||||||
FKeyStrokesOffCell := TSynEditTemplateEditKeyStrokesOffCell.Create(self);
|
FKeyStrokesOffCell := TSynEditTemplateEditKeyStrokesOffCell.Create(self);
|
||||||
FKeyStrokesOffCell.ResetDefaults;
|
FKeyStrokesOffCell.ResetDefaults;
|
||||||
FKeyStrokesOffCell.PluginOffset := KeyOffset;
|
|
||||||
inherited Create(AOwner);
|
inherited Create(AOwner);
|
||||||
CellParserEnabled := True;
|
CellParserEnabled := True;
|
||||||
end;
|
end;
|
||||||
@ -132,22 +127,6 @@ begin
|
|||||||
FreeAndNil(FKeyStrokesOffCell);
|
FreeAndNil(FKeyStrokesOffCell);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TSynPluginTemplateEdit.ConvertCommandToBase
|
|
||||||
(Command: TSynEditorCommand): TSynEditorCommand;
|
|
||||||
begin
|
|
||||||
if (Command >= ecPluginFirst + KeyOffset) and
|
|
||||||
(Command <= ecPluginFirst + KeyOffset + ecSynPTmplEdCount)
|
|
||||||
then Result := Command - KeyOffset
|
|
||||||
else Result := ecNone;
|
|
||||||
end;
|
|
||||||
|
|
||||||
class function TSynPluginTemplateEdit.ConvertBaseToCommand(Command: TSynEditorCommand): TSynEditorCommand;
|
|
||||||
begin
|
|
||||||
if (Command >= ecPluginFirst) and (Command <= ecPluginFirst + ecSynPTmplEdCount)
|
|
||||||
then Result := Command + KeyOffset
|
|
||||||
else Result := ecNone;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TSynPluginTemplateEdit.DoEditorRemoving(AValue: TCustomSynEdit);
|
procedure TSynPluginTemplateEdit.DoEditorRemoving(AValue: TCustomSynEdit);
|
||||||
begin
|
begin
|
||||||
if Editor <> nil then begin
|
if Editor <> nil then begin
|
||||||
@ -197,14 +176,9 @@ begin
|
|||||||
else
|
else
|
||||||
keys := FKeyStrokes;
|
keys := FKeyStrokes;
|
||||||
|
|
||||||
try
|
if not FinishComboOnly then
|
||||||
keys.UsePluginOffset := True;
|
keys.ResetKeyCombo;
|
||||||
if not FinishComboOnly then
|
Command := keys.FindKeycodeEx(Code, SState, Data, IsStartOfCombo, FinishComboOnly, ComboKeyStrokes);
|
||||||
keys.ResetKeyCombo;
|
|
||||||
Command := keys.FindKeycodeEx(Code, SState, Data, IsStartOfCombo, FinishComboOnly, ComboKeyStrokes);
|
|
||||||
finally
|
|
||||||
keys.UsePluginOffset := False;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Handled := (Command <> ecNone) or IsStartOfCombo;
|
Handled := (Command <> ecNone) or IsStartOfCombo;
|
||||||
if IsStartOfCombo then
|
if IsStartOfCombo then
|
||||||
@ -214,14 +188,11 @@ end;
|
|||||||
procedure TSynPluginTemplateEdit.ProcessSynCommand(Sender: TObject; AfterProcessing: boolean;
|
procedure TSynPluginTemplateEdit.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);
|
||||||
var
|
|
||||||
Cmd: TSynEditorCommand;
|
|
||||||
begin
|
begin
|
||||||
if Handled or AfterProcessing or not Active then exit;
|
if Handled or AfterProcessing or not Active then exit;
|
||||||
Cmd := ConvertCommandToBase(Command);
|
|
||||||
|
|
||||||
Handled := True;
|
Handled := True;
|
||||||
case Cmd of
|
case Command of
|
||||||
ecSynPTmplEdNextCell: NextCellOrFinal(False);
|
ecSynPTmplEdNextCell: NextCellOrFinal(False);
|
||||||
ecSynPTmplEdNextCellSel: NextCellOrFinal(True);
|
ecSynPTmplEdNextCellSel: NextCellOrFinal(True);
|
||||||
ecSynPTmplEdNextCellRotate: NextCell(False);
|
ecSynPTmplEdNextCellRotate: NextCell(False);
|
||||||
@ -498,8 +469,52 @@ begin
|
|||||||
AddKey(ecSynPTmplEdEscape, VK_ESCAPE, []);
|
AddKey(ecSynPTmplEdEscape, VK_ESCAPE, []);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
const
|
||||||
|
EditorTmplEditCommandStrs: array[0..16] of TIdentMapEntry = (
|
||||||
|
(Value: ecSynPTmplEdNextCell; Name: 'ecSynPTmplEdNextCell'),
|
||||||
|
(Value: ecSynPTmplEdNextCellSel; Name: 'ecSynPTmplEdNextCellSel'),
|
||||||
|
(Value: ecSynPTmplEdNextCellRotate; Name: 'ecSynPTmplEdNextCellRotate'),
|
||||||
|
(Value: ecSynPTmplEdNextCellSelRotate; Name: 'ecSynPTmplEdNextCellSelRotate'),
|
||||||
|
(Value: ecSynPTmplEdPrevCell; Name: 'ecSynPTmplEdPrevCell'),
|
||||||
|
(Value: ecSynPTmplEdPrevCellSel; Name: 'ecSynPTmplEdPrevCellSel'),
|
||||||
|
(Value: ecSynPTmplEdCellHome; Name: 'ecSynPTmplEdCellHome'),
|
||||||
|
(Value: ecSynPTmplEdCellEnd; Name: 'ecSynPTmplEdCellEnd'),
|
||||||
|
(Value: ecSynPTmplEdCellSelect; Name: 'ecSynPTmplEdCellSelect'),
|
||||||
|
(Value: ecSynPTmplEdFinish; Name: 'ecSynPTmplEdFinish'),
|
||||||
|
(Value: ecSynPTmplEdEscape; Name: 'ecSynPTmplEdEscape'),
|
||||||
|
(Value: ecSynPTmplEdNextFirstCell; Name: 'ecSynPTmplEdNextFirstCell'),
|
||||||
|
(Value: ecSynPTmplEdNextFirstCellSel; Name: 'ecSynPTmplEdNextFirstCellSel'),
|
||||||
|
(Value: ecSynPTmplEdNextFirstCellRotate; Name: 'ecSynPTmplEdNextFirstCellRotate'),
|
||||||
|
(Value: ecSynPTmplEdNextFirstCellSelRotate; Name: 'ecSynPTmplEdNextFirstCellSelRotate'),
|
||||||
|
(Value: ecSynPTmplEdPrevFirstCell; Name: 'ecSynPTmplEdPrevFirstCell'),
|
||||||
|
(Value: ecSynPTmplEdPrevFirstCellSel; Name: 'ecSynPTmplEdPrevFirstCellSel')
|
||||||
|
);
|
||||||
|
|
||||||
|
function IdentToTmplEditCommand(const Ident: string; var Cmd: longint): boolean;
|
||||||
|
begin
|
||||||
|
Result := IdentToInt(Ident, Cmd, EditorTmplEditCommandStrs);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TmplEditCommandToIdent(Cmd: longint; var Ident: string): boolean;
|
||||||
|
begin
|
||||||
|
Result := (Cmd >= ecPluginFirstTemplEdit) and (Cmd - ecPluginFirstTemplEdit < ecSynPTmplEdCount);
|
||||||
|
if not Result then exit;
|
||||||
|
Result := IntToIdent(Cmd, Ident, EditorTmplEditCommandStrs);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure GetEditorCommandValues(Proc: TGetStrProc);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
for i := Low(EditorTmplEditCommandStrs) to High(EditorTmplEditCommandStrs) do
|
||||||
|
Proc(EditorTmplEditCommandStrs[I].Name);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
KeyOffset := AllocatePluginKeyRange(ecSynPTmplEdCount + 1, True);
|
RegisterKeyCmdIdentProcs(@IdentToTmplEditCommand,
|
||||||
|
@TmplEditCommandToIdent);
|
||||||
|
RegisterExtraGetEditorCommandValues(@GetEditorCommandValues);
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user