{$ifdef nnn}begin end;{$endif} function TATSynEdit.IsPosSelected(AX, AY: integer): boolean; var NPosLeft, NPosRight: integer; SLine: atString; begin if not IsSelRectEmpty then begin if not ((AY>=FSelRect.Top) and (AY<=FSelRect.Bottom)) then exit(False); SLine:= Strings.Lines[AY]; NPosLeft:= SColumnPosToCharPos(SLine, FSelRect.Left, OptTabSize); NPosRight:= SColumnPosToCharPos(SLine, FSelRect.Right, OptTabSize); Result:= (AX>=NPosLeft) and (AXN2 then begin DoCaretSingle(P.X, P.Y); with Carets[0] do begin EndY:= P.Y; EndX:= N1; PosX:= N2; end; end; end; procedure TATSynEdit.DoSelect_CharRange(ACaretIndex: integer; Pnt: TPoint); begin if not Carets.IsIndexValid(ACaretIndex) then Exit; Carets[ACaretIndex].SelectToPoint(Pnt.X, Pnt.Y); end; procedure TATSynEdit.DoSelect_WordRange(ACaretIndex: integer; P1, P2: TPoint); begin if not Carets.IsIndexValid(ACaretIndex) then Exit; if not Strings.IsIndexValid(P1.Y) then Exit; if not Strings.IsIndexValid(P2.Y) then Exit; if not IsPosSorted(P1.X, P1.Y, P2.X, P2.Y, true) then begin SwapInt(P1.X, P2.X); SwapInt(P1.Y, P2.Y); end; P1.X:= SFindWordOffset(Strings.Lines[P1.Y], P1.X, false, false, FOptWordChars); P2.X:= SFindWordOffset(Strings.Lines[P2.Y], P2.X, true, false, FOptWordChars); with Carets[ACaretIndex] do begin PosX:= P2.X; PosY:= P2.Y; EndX:= P1.X; EndY:= P1.Y; end; end; procedure TATSynEdit.DoSelect_Line(P: TPoint); var PLast: TPoint; begin if not Strings.IsIndexValid(P.Y) then Exit; DoCaretSingle(P.X, P.Y); with Carets[0] do begin if P.YALineFrom then begin CItem.EndX:= 0; CItem.EndY:= ALineFrom; end else if P.Y=ALineFrom then begin DoSelect_Line(P); end; end; procedure TATSynEdit.DoSelect_None; var i: integer; begin FSelRect:= cRectEmpty; FSelRectBegin:= Point(-1, -1); for i:= 0 to Carets.Count-1 do with Carets[i] do begin EndX:= -1; EndY:= -1; end; end; procedure TATSynEdit.DoSelect_ColumnBlock(P1, P2: TPoint); var NPosLeft, NPosRight: integer; i: integer; begin if P1.Y>P2.Y then SwapInt(P1.Y, P2.Y); FSelRect.Left:= Min(P1.X, P2.X); FSelRect.Right:= Max(P1.X, P2.X); FSelRect.Top:= P1.Y; FSelRect.Bottom:= P2.Y; for i:= P1.Y to P2.Y do begin if i=P1.Y then Carets.Clear; Carets.Add(0, 0); with Carets[Carets.Count-1] do begin PosX:= SColumnPosToCharPos(Strings.Lines[i], FSelRect.Right, OptTabSize); PosY:= i; EndX:= SColumnPosToCharPos(Strings.Lines[i], FSelRect.Left, OptTabSize); EndY:= i; end; end; end; procedure TATSynEdit.DoSelectionDeleteOrReset; begin if FOptOverwriteSel then DoCommand_TextDeleteSelection else DoSelect_None; end; procedure TATSynEdit.DoSelect_NormalSelToColumnSel(out ABegin, AEnd: TPoint); var Caret: TATCaretItem; begin Caret:= Carets[0]; if (Caret.EndY>=0) and (Caret.EndX>=0) then begin ABegin.X:= SCharPosToColumnPos(Strings.Lines[Caret.EndY], Caret.EndX, OptTabSize); ABegin.Y:= Caret.EndY; AEnd.X:= SCharPosToColumnPos(Strings.Lines[Caret.PosY], Caret.PosX, OptTabSize); AEnd.Y:= Caret.PosY; end else begin ABegin.X:= SCharPosToColumnPos(Strings.Lines[Caret.PosY], Caret.PosX, OptTabSize); ABegin.Y:= Caret.PosY; AEnd:= ABegin; end; end; procedure TATSynEdit.DoSelectionDeleteColumnBlock; var X1, X2, i: Integer; Str, StrNew: atString; begin if IsSelRectEmpty then exit; Strings.BeginUndoGroup; try for i:= FSelRect.Top to FSelRect.Bottom do begin Str:= Strings.Lines[i]; X1:= SColumnPosToCharPos(Str, FSelRect.Left, OptTabSize); X2:= SColumnPosToCharPos(Str, FSelRect.Right, OptTabSize); StrNew:= Str; Delete(StrNew, X1+1, X2-X1); if StrNew<>Str then Strings.Lines[i]:= StrNew; end; finally Strings.EndUndoGroup; end; DoSelect_None; if Carets.Count>0 then Carets[0].PosX:= X1; end;