{$ifdef nnnn}begin end;{$endif} function TATSynEdit.DoCommand_KeyHome: TATCommandResults; var i, NIndent, NWrapped: integer; Caret: TATCaretItem; Pnt: TPoint; EolPos: boolean; begin for i:= 0 to FCarets.Count-1 do begin Caret:= FCarets[i]; NWrapped:= 0; NIndent:= 0; if FOptKeyHomeEndNavigateWrapped and (FWrapMode<>cWrapOff) then begin Pnt.X:= 0; Pnt.Y:= Caret.CoordY; Pnt:= ClientPosToCaretPos(Pnt, EolPos); NWrapped:= Pnt.X; end; if FOptKeyHomeToNonSpace then NIndent:= SGetIndentChars(Strings.Lines[Caret.PosY]); if (NWrapped>0) and (Caret.PosX>NWrapped) then Caret.PosX:= NWrapped else if (NIndent>0) and (Caret.PosX>NIndent) then Caret.PosX:= NIndent else Caret.PosX:= 0; end; Result:= [cResultCaretLeft]; end; function TATSynEdit.DoCommand_KeyEnd: TATCommandResults; var Caret: TATCaretItem; Str: atString; Pnt: TPoint; i, NLen, NWrapped: integer; EolPos: boolean; begin for i:= 0 to FCarets.Count-1 do begin Caret:= FCarets[i]; Str:= Strings.Lines[Caret.PosY]; NLen:= 0; NWrapped:= 0; if FOptKeyHomeEndNavigateWrapped and (FWrapMode<>cWrapOff) then begin Pnt.X:= ClientWidth; Pnt.Y:= Caret.CoordY; Pnt:= ClientPosToCaretPos(Pnt, EolPos); if Pnt.X0) and (Caret.PosX0) and (Caret.PosX0) then Dec(Caret.PosX) else if (Caret.PosY>0) and not FCaretVirtual then begin Dec(Caret.PosY); Caret.PosX:= Length(Strings.Lines[Caret.PosY]); end; end; end; function TATSynEdit.DoCommand_KeyRight(ASelCommand: boolean): TATCommandResults; var Caret: TATCaretItem; i: integer; begin Result:= [cResultCaretRight]; if not ASelCommand then begin if FOptKeyLeftRightSwapSel then if DoCaretSwapEdge(false) then Exit; DoSelect_None; end; for i:= 0 to FCarets.Count-1 do begin Caret:= FCarets[i]; if (Caret.PosXcWrapOff if FOptKeyUpDownNavigateWrapped then Result:= DoCommand_KeyUpDown_Wrapped(ADown, ALines) else Result:= DoCommand_KeyUpDown_NextLine(ADown, ALines); if AKeepRelativePos then LinesFromTop:= NRelative; end; function TATSynEdit.DoCommand_KeyUpDown_NextLine(ADown: boolean; ALines: integer): TATCommandResults; var Caret: TATCaretItem; i, Y: integer; begin for i:= 0 to Carets.Count-1 do begin Caret:= Carets[i]; Y:= Caret.PosY; repeat Y:= Y+ALines*BoolToPlusMinusOne(ADown); until not Strings.IsIndexValid(Y) or not IsLineFolded(Y); if not IsLineFolded(Y) then begin if Y<0 then Y:= GetFirstUnfoldedLineNumber; if Y>=Strings.Count then Y:= GetLastUnfoldedLineNumber; Caret.PosY:= Y; end; end; if ADown then Result:= [cResultCaretBottom] else Result:= [cResultCaretTop]; end; function TATSynEdit.DoCommand_KeyUpDown_Wrapped(ADown: boolean; ALines: integer): TATCommandResults; var Caret: TATCaretItem; Pnt: TPoint; i: integer; EolPos: boolean; begin for i:= 0 to FCarets.Count-1 do begin Caret:= FCarets[i]; if IsPosFolded(Caret.PosX, Caret.PosY) then begin Caret.PosX:= 0; Caret.PosY:= GetNextUnfoldedLineNumber(Caret.PosY, ADown); Continue; end; Pnt.X:= Caret.CoordX; if FOptKeyUpDownKeepColumn and (Caret.CoordColumn>0) then Pnt.X:= Caret.CoordColumn; Pnt.Y:= Caret.CoordY + ALines*FCharSize.Y*BoolToPlusMinusOne(ADown); Pnt:= ClientPosToCaretPos(Pnt, EolPos); if Pnt.Y<0 then Continue; if EolPos and (Pnt.X>0) then Dec(Pnt.X); //-1 so up/down won't jump to eol pos (caret may paint on next line) Caret.PosX:= Pnt.X; Caret.PosY:= Pnt.Y; end; if ADown then Result:= [cResultCaretBottom] else Result:= [cResultCaretTop]; end; function TATSynEdit.DoCommand_TextBackspace: TATCommandResults; var bColBlock: boolean; begin bColBlock:= not IsSelRectEmpty; if bColBlock then if FSelRect.Left=FSelRect.Right then begin DoSelect_None; bColBlock:= false; end; if bColBlock then Result:= DoCommand_TextDeleteSelection else Result:= DoCommand_TextDeleteLeft(1, FOptKeyBackspaceUnindent); end; function TATSynEdit.DoCommand_GotoTextBegin: TATCommandResults; var Item: TATSynWrapItem; begin Item:= FWrapInfo[0]; if Assigned(Item) then DoCaretSingle(0, Item.NLineIndex, false); FScrollHorz.NPos:= 0; FScrollVert.NPos:= 0; Result:= [cResultCaretTop]; end; function TATSynEdit.DoCommand_GotoTextEnd: TATCommandResults; var Item: TATSynWrapItem; begin Item:= FWrapInfo[FWrapInfo.Count-1]; if Assigned(Item) then DoCaretSingle(Length(Strings.Lines[Item.NLineIndex]), Item.NLineIndex, false); Result:= [cResultCaretBottom]; end; function TATSynEdit.DoCommand_ScrollVert(ALines: integer): TATCommandResults; begin DoScrollByDelta(0, ALines); Result:= [cResultScroll]; end; function TATSynEdit.DoCommand_GotoWord(ANext: boolean): TATCommandResults; var Caret: TATCaretItem; Str: atString; i: integer; begin for i:= 0 to FCarets.Count-1 do begin Caret:= FCarets[i]; if not Strings.IsIndexValid(Caret.PosY) then Continue; Str:= Strings.Lines[Caret.PosY]; //jump to prev line? if (Caret.PosX=0) and (not ANext) then begin if Caret.PosY>0 then begin Dec(Caret.PosY); Caret.PosX:= Length(Strings.Lines[Caret.PosY]); end; end else //jump to next line? if (Caret.PosX>=Length(Str)) and ANext then begin if Caret.PosYLength(Str)) and (not ANext) then begin Caret.PosX:= Length(Str); end else //jump inside line? if (Caret.PosX<=Length(Str)) then begin Caret.PosX:= SFindWordOffset(Str, Caret.PosX, ANext, true, FOptWordChars); end; end; if ANext then Result:= [cResultCaretBottom] else Result:= [cResultCaretTop]; end; function TATSynEdit.DoCommand_Cancel: TATCommandResults; begin DoCaretSingleAsIs; DoSelect_None; FMouseDragDropping:= false; UpdateCursor; Result:= [cResultCaretTop]; end;