302 lines
11 KiB
PHP
302 lines
11 KiB
PHP
{$ifdef none}begin end;{$endif}
|
|
|
|
procedure TATSynEdit.DoMenuText;
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
P:= ClientToScreen(Point(0, 0));
|
|
if Assigned(FMenuText) then
|
|
FMenuText.PopUp(P.X, P.Y)
|
|
else
|
|
FMenuStd.PopUp(P.X, P.Y);
|
|
end;
|
|
|
|
procedure TATSynEdit.KeyDown(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
inherited;
|
|
|
|
if not FWantTabs then
|
|
if Key=vk_tab then Exit;
|
|
|
|
if Key=vk_apps then
|
|
begin
|
|
DoMenuText;
|
|
Exit
|
|
end;
|
|
|
|
DoPaintModeStatic;
|
|
try
|
|
DoCommand(GetCommandFromKey(Key, Shift));
|
|
finally
|
|
DoPaintModeBlinking;
|
|
end;
|
|
end;
|
|
|
|
procedure TATSynEdit.UTF8KeyPress(var UTF8Key: TUTF8Char);
|
|
var
|
|
Str: atString;
|
|
begin
|
|
inherited;
|
|
|
|
//skip control Ascii chars
|
|
if Ord(UTF8Key[1])<32 then Exit;
|
|
|
|
Str:= Utf8Decode(Utf8Key);
|
|
DoCommand(cCommand_TextInsert, Str);
|
|
Utf8Key:= '';
|
|
end;
|
|
|
|
function TATSynEdit.GetCommandFromKey(var Key: Word; Shift: TShiftState): integer;
|
|
var
|
|
Shortcut: TShortcut;
|
|
begin
|
|
Result:= 0;
|
|
|
|
if (Key=VK_TAB) and (Shift=[]) then
|
|
begin
|
|
Result:= cCommand_KeyTab;
|
|
Key:= 0;
|
|
Exit;
|
|
end;
|
|
|
|
if IsEditableTextKey(Key) and ((Shift=[]) or (Shift=[ssShift])) then
|
|
Exit;
|
|
|
|
if not Assigned(FKeymap) then
|
|
begin
|
|
ShowMessage('Keymap not assigned: cannot input keys');
|
|
Exit
|
|
end;
|
|
|
|
Shortcut:= KeyToShortCut(Key, Shift);
|
|
Result:= FKeymap.GetCommandFromShortcut(Shortcut);
|
|
if Result>0 then
|
|
Key:= 0;
|
|
end;
|
|
|
|
procedure TATSynEdit.DoCommandResults(Res: TATCommandResults);
|
|
begin
|
|
if cResultText in Res then
|
|
begin
|
|
FWrapUpdateNeeded:= true;
|
|
UpdateWrapInfo;
|
|
|
|
if FOptMouseHideCursor then
|
|
if PtInRect(FRectMain, ScreenToClient(Mouse.CursorPos)) then
|
|
SetCursor(crNone);
|
|
end;
|
|
|
|
DoCaretsSort;
|
|
UpdateCaretsCoords;
|
|
|
|
if cResultCaretLeft in Res then DoGotoCaret(cEdgeLeft);
|
|
if cResultCaretRight in Res then DoGotoCaret(cEdgeRight);
|
|
if cResultCaretTop in Res then DoGotoCaret(cEdgeTop);
|
|
if cResultCaretBottom in Res then DoGotoCaret(cEdgeBottom);
|
|
|
|
if Res*[cResultCaretAny,
|
|
cResultCaretLeft, cResultCaretRight,
|
|
cResultCaretTop, cResultCaretBottom]<>[] then
|
|
begin
|
|
if not (cResultKeepColumnSel in Res) then
|
|
FSelRect:= cRectEmpty;
|
|
DoEventCarets;
|
|
end;
|
|
|
|
if cResultText in Res then
|
|
begin
|
|
FSelRect:= cRectEmpty;
|
|
DoEventChange;
|
|
end;
|
|
|
|
if cResultScroll in Res then
|
|
DoEventScroll;
|
|
|
|
if cResultState in Res then
|
|
DoEventState;
|
|
|
|
Update;
|
|
end;
|
|
|
|
procedure TATSynEdit.DoCommand(ACmd: integer; const AText: atString = '');
|
|
var
|
|
Caret: TATCaretItem;
|
|
Res: TATCommandResults;
|
|
i: integer;
|
|
begin
|
|
if ACmd<=0 then Exit;
|
|
if DoEventCommand(ACmd, AText) then Exit;
|
|
|
|
Res:= [];
|
|
FCaretSpecPos:= false;
|
|
|
|
//---handle special command bits (cCmdNNNNN)
|
|
if ACmd and cCmdSelKeep <> 0 then
|
|
for i:= 0 to Carets.Count-1 do
|
|
begin
|
|
Caret:= Carets[i];
|
|
if Caret.EndY<0 then Caret.EndY:= Caret.PosY;
|
|
if Caret.EndX<0 then Caret.EndX:= Caret.PosX;
|
|
end;
|
|
|
|
if ACmd and cCmdSelReset <> 0 then
|
|
DoSelect_None;
|
|
|
|
if ACmd and cCmdCaret <> 0 then
|
|
begin
|
|
Strings.SetGroupMark;
|
|
|
|
//save column for Up/Down movement
|
|
Carets.UpdateColumnCoord(
|
|
(ACmd=cCommand_KeyUp) or
|
|
(ACmd=cCommand_KeyDown) or
|
|
(ACmd=cCommand_KeyUp_Sel) or
|
|
(ACmd=cCommand_KeyDown_Sel)
|
|
);
|
|
end;
|
|
|
|
//debug
|
|
//if FCaretMoved then Beep;
|
|
//--------
|
|
|
|
case ACmd of
|
|
//most used commands
|
|
cCommand_KeyLeft: Res:= DoCommand_KeyLeft(false);
|
|
cCommand_KeyLeft_Sel: Res:= DoCommand_KeyLeft(true);
|
|
cCommand_KeyRight: Res:= DoCommand_KeyRight(false);
|
|
cCommand_KeyRight_Sel: Res:= DoCommand_KeyRight(true);
|
|
cCommand_KeyUp,
|
|
cCommand_KeyUp_Sel: Res:= DoCommand_KeyUpDown(false, 1, false);
|
|
cCommand_KeyDown,
|
|
cCommand_KeyDown_Sel: Res:= DoCommand_KeyUpDown(true, 1, false);
|
|
cCommand_KeyHome,
|
|
cCommand_KeyHome_Sel: Res:= DoCommand_KeyHome;
|
|
cCommand_KeyEnd,
|
|
cCommand_KeyEnd_Sel: Res:= DoCommand_KeyEnd;
|
|
cCommand_KeyPageUp,
|
|
cCommand_KeyPageUp_Sel: Res:= DoCommand_KeyUpDown(false, GetPageLines, FOptKeyPageKeepsRelativePos);
|
|
cCommand_KeyPageDown,
|
|
cCommand_KeyPageDown_Sel: Res:= DoCommand_KeyUpDown(true, GetPageLines, FOptKeyPageKeepsRelativePos);
|
|
|
|
cCommand_ColSelectLeft: Res:= DoCommand_SelectColumn(cDirColumnLeft);
|
|
cCommand_ColSelectRight: Res:= DoCommand_SelectColumn(cDirColumnRight);
|
|
cCommand_ColSelectUp: Res:= DoCommand_SelectColumn(cDirColumnUp);
|
|
cCommand_ColSelectDown: Res:= DoCommand_SelectColumn(cDirColumnDown);
|
|
cCommand_ColSelectPageUp: Res:= DoCommand_SelectColumn(cDirColumnPageUp);
|
|
cCommand_ColSelectPageDown: Res:= DoCommand_SelectColumn(cDirColumnPageDown);
|
|
cCommand_ColSelectToLineBegin: Res:= DoCommand_SelectColumnToLineEdge(false);
|
|
cCommand_ColSelectToLineEnd: Res:= DoCommand_SelectColumnToLineEdge(true);
|
|
|
|
cCommand_TextInsert: Res:= DoCommand_TextInsertAtCarets(AText, false, FOverwrite, false);
|
|
cCommand_TextInsertTabChar: Res:= DoCommand_TextInsertAtCarets(#9, false, FOverwrite, false);
|
|
cCommand_KeyBackspace: Res:= DoCommand_TextBackspace;
|
|
cCommand_KeyDelete: Res:= DoCommand_TextDelete;
|
|
cCommand_KeyTab: Res:= DoCommand_TextTabulation;
|
|
cCommand_KeyEnter: Res:= DoCommand_TextInsertEol(false);
|
|
|
|
cCommand_Undo: Res:= DoCommand_Undo;
|
|
cCommand_Redo: Res:= DoCommand_Redo;
|
|
//end of most used
|
|
|
|
cCommand_TextDeleteSelection: Res:= DoCommand_TextDeleteSelection;
|
|
cCommand_TextDeleteLine: Res:= DoCommand_TextDeleteLines;
|
|
cCommand_TextDuplicateLine: Res:= DoCommand_TextDuplicateLine;
|
|
cCommand_TextDeleteToLineBegin: Res:= DoCommand_TextDeleteToLineBegin;
|
|
cCommand_TextDeleteToLineEnd: Res:= DoCommand_TextDeleteToLineEnd;
|
|
cCommand_TextDeleteToTextEnd: Res:= DoCommand_TextDeleteToFileEnd;
|
|
cCommand_TextDeleteWordPrev: Res:= DoCommand_TextDeleteWord(false);
|
|
cCommand_TextDeleteWordNext: Res:= DoCommand_TextDeleteWord(true);
|
|
|
|
cCommand_SelectAll: Res:= DoCommand_SelectAll;
|
|
cCommand_SelectNone: Res:= [cResultCaretAny];
|
|
cCommand_SelectInverted: Res:= DoCommand_SelectInverted;
|
|
cCommand_SelectSplitToLines: Res:= DoCommand_SelectSplitToLines;
|
|
cCommand_SelectExtendByLine: Res:= DoCommand_SelectExtendByLine;
|
|
cCommand_SelectWords: Res:= DoCommand_SelectWords;
|
|
cCommand_SelectLines: Res:= DoCommand_SelectLines;
|
|
|
|
cCommand_GotoTextBegin,
|
|
cCommand_GotoTextBegin_Sel: Res:= DoCommand_GotoTextBegin;
|
|
cCommand_GotoTextEnd,
|
|
cCommand_GotoTextEnd_Sel: Res:= DoCommand_GotoTextEnd;
|
|
cCommand_GotoWordNext,
|
|
cCommand_GotoWordNext_Sel: Res:= DoCommand_GotoWord(true);
|
|
cCommand_GotoWordPrev,
|
|
cCommand_GotoWordPrev_Sel: Res:= DoCommand_GotoWord(false);
|
|
|
|
cCommand_ToggleOverwrite: Res:= DoCommand_ToggleOverwrite;
|
|
cCommand_ToggleReadOnly: Res:= DoCommand_ToggleReadOnly;
|
|
cCommand_ToggleWordWrap: Res:= DoCommand_ToggleWordWrap;
|
|
cCommand_ToggleUnprinted: Res:= DoCommand_ToggleUnprinted;
|
|
cCommand_ToggleUnprintedSpaces: Res:= DoCommand_ToggleUnprintedSpaces;
|
|
cCommand_ToggleUnprintedEnds: Res:= DoCommand_ToggleUnprintedEnds;
|
|
cCommand_ToggleUnprintedEndDetails: Res:= DoCommand_ToggleUnprintedEndDetails;
|
|
cCommand_ToggleLineNums: Res:= DoCommand_ToggleLineNums;
|
|
cCommand_ToggleFolding: Res:= DoCommand_ToggleFolding;
|
|
cCommand_ToggleRuler: Res:= DoCommand_ToggleRuler;
|
|
cCommand_ToggleMinimap: Res:= DoCommand_ToggleMinimap;
|
|
|
|
cCommand_TextIndent: Res:= DoCommand_TextIndentUnindent(true);
|
|
cCommand_TextUnindent: Res:= DoCommand_TextIndentUnindent(false);
|
|
|
|
cCommand_ScrollLineUp: Res:= DoCommand_ScrollVert(-1);
|
|
cCommand_ScrollLineDown: Res:= DoCommand_ScrollVert(1);
|
|
cCommand_ScrollToCaretTop: Res:= [cResultCaretTop];
|
|
cCommand_ScrollToCaretBottom: Res:= [cResultCaretBottom];
|
|
cCommand_ScrollToCaretLeft: Res:= [cResultCaretLeft];
|
|
cCommand_ScrollToCaretRight: Res:= [cResultCaretRight];
|
|
|
|
cCommand_ClipboardCopy: Res:= DoCommand_ClipboardCopy;
|
|
cCommand_ClipboardCopyAdd: Res:= DoCommand_ClipboardCopy(true);
|
|
cCommand_ClipboardCut: Res:= DoCommand_ClipboardCut;
|
|
cCommand_ClipboardPaste: Res:= DoCommand_ClipboardPaste(false, false);
|
|
cCommand_ClipboardPaste_Select: Res:= DoCommand_ClipboardPaste(false, true);
|
|
cCommand_ClipboardPaste_KeepCaret: Res:= DoCommand_ClipboardPaste(true, false);
|
|
cCommand_ClipboardPaste_Column: Res:= DoCommand_ClipboardPasteColumnBlock(false);
|
|
cCommand_ClipboardPaste_ColumnKeepCaret: Res:= DoCommand_ClipboardPasteColumnBlock(true);
|
|
|
|
cCommand_MoveSelectionUp: Res:= DoCommand_MoveSelectionUpDown(false);
|
|
cCommand_MoveSelectiondown: Res:= DoCommand_MoveSelectionUpDown(true);
|
|
cCommand_TextInsertEmptyAbove: Res:= DoCommand_TextInsertEmptyAboveBelow(false);
|
|
cCommand_TextInsertEmptyBelow: Res:= DoCommand_TextInsertEmptyAboveBelow(true);
|
|
|
|
cCommand_TextCaseLower: Res:= DoCommand_TextChangeCase(cCaseLower);
|
|
cCommand_TextCaseUpper: Res:= DoCommand_TextChangeCase(cCaseUpper);
|
|
cCommand_TextCaseTitle: Res:= DoCommand_TextChangeCase(cCaseTitle);
|
|
cCommand_TextCaseInvert: Res:= DoCommand_TextChangeCase(cCaseInvert);
|
|
cCommand_TextCaseSentence: Res:= DoCommand_TextChangeCase(cCaseSentence);
|
|
|
|
cCommand_TextTrimSpacesLeft: Res:= DoCommand_TextTrimSpaces(cTrimLeft);
|
|
cCommand_TextTrimSpacesRight: Res:= DoCommand_TextTrimSpaces(cTrimRight);
|
|
cCommand_TextTrimSpacesAll: Res:= DoCommand_TextTrimSpaces(cTrimAll);
|
|
|
|
cCommand_FoldAll: Res:= DoCommand_FoldUnfoldAll(true);
|
|
cCommand_UnfoldAll: Res:= DoCommand_FoldUnfoldAll(false);
|
|
cCommand_FoldLevel2..
|
|
cCommand_FoldLevel9: Res:= DoCommand_FoldLevel(ACmd-cCommand_FoldLevel2+1);
|
|
|
|
cCommand_Cancel: Res:= DoCommand_Cancel;
|
|
cCommand_CaretsExtendUpLine: Res:= DoCommand_CaretsExtend(false, 1);
|
|
cCommand_CaretsExtendUpPage: Res:= DoCommand_CaretsExtend(false, GetPageLines);
|
|
cCommand_CaretsExtendUpToTop: Res:= DoCommand_CaretsExtend(false, Strings.Count);
|
|
cCommand_CaretsExtendDownLine: Res:= DoCommand_CaretsExtend(true, 1);
|
|
cCommand_CaretsExtendDownPage: Res:= DoCommand_CaretsExtend(true, GetPageLines);
|
|
cCommand_CaretsExtendDownToEnd: Res:= DoCommand_CaretsExtend(true, Strings.Count);
|
|
|
|
cCommand_ZoomIn: Res:= DoCommand_SizeChange(true);
|
|
cCommand_ZoomOut: Res:= DoCommand_SizeChange(false);
|
|
cCommand_RepeatTextCommand: DoCommand(FLastTextCmd, FLastTextCmdText);
|
|
end;
|
|
|
|
if cResultText in Res then
|
|
if ACmd<>cCommand_RepeatTextCommand then
|
|
begin
|
|
FLastTextCmd:= ACmd;
|
|
FLastTextCmdText:= AText;
|
|
end;
|
|
|
|
DoCommandResults(Res);
|
|
end;
|
|
|
|
|