mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 01:29:08 +02:00
Synedit: Refactor, move Caret to it's own class. (Just the first step)
git-svn-id: trunk@17411 -
This commit is contained in:
parent
1c61f8a45b
commit
7d42cea472
@ -385,8 +385,8 @@ type
|
||||
fBlockBegin: TPoint; // logical position (byte)
|
||||
fBlockEnd: TPoint; // logical position (byte)
|
||||
fBlockIndent: integer;
|
||||
fCaretX: Integer; // physical position (screen)
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
fCaret: TSynEditCaret;
|
||||
fCtrlMouseActive: boolean;
|
||||
fMarkupManager : TSynEditMarkupManager;
|
||||
fMarkupHighAll : TSynEditMarkupHighlightAll;
|
||||
@ -394,9 +394,11 @@ type
|
||||
fMarkupCtrlMouse : TSynEditMarkupCtrlMouseLink;
|
||||
fMarkupSpecialLine : TSynEditMarkupSpecialLine;
|
||||
fMarkupSelection : TSynEditMarkupSelection;
|
||||
{$ELSE}
|
||||
fCaretX: Integer; // position in Expanded Line = physical position (screen) when LeftChar=1
|
||||
fCaretY: Integer;
|
||||
{$ENDIF}
|
||||
fLastCaretX: integer; // physical position (screen) //mh 2000-10-19
|
||||
fCaretY: Integer;
|
||||
fCharsInWindow: Integer;
|
||||
fCharWidth: Integer;
|
||||
fFontDummy: TFont;
|
||||
@ -512,6 +514,8 @@ type
|
||||
function GetCaretXY: TPoint;
|
||||
function GetFont: TFont;
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
function GetCaretX : Integer;
|
||||
function GetCaretY : Integer;
|
||||
function GetHighlightAllColor : TSynSelectedColor;
|
||||
function GetIncrementColor : TSynSelectedColor;
|
||||
function GetSelectedColor : TSynSelectedColor;
|
||||
@ -873,8 +877,13 @@ type
|
||||
property CanPaste: Boolean read GetCanPaste;
|
||||
property CanRedo: boolean read GetCanRedo;
|
||||
property CanUndo: boolean read GetCanUndo;
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
property CaretX: Integer read GetCaretX write SetCaretX;
|
||||
property CaretY: Integer read GetCaretY write SetCaretY;
|
||||
{$ELSE}
|
||||
property CaretX: Integer read fCaretX write SetCaretX;
|
||||
property CaretY: Integer read fCaretY write SetCaretY;
|
||||
{$ENDIF}
|
||||
property CaretXY: TPoint read GetCaretXY write SetCaretXY;
|
||||
property CharsInWindow: Integer read fCharsInWindow;
|
||||
property CharWidth: integer read fCharWidth;
|
||||
@ -1302,7 +1311,7 @@ begin
|
||||
Result:=RowCol;
|
||||
Result.X := (Result.X - 1) * fCharWidth + fTextOffset;
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
Result.Y := RowToScreenRow(fCaretY) * fTextHeight + 1;
|
||||
Result.Y := RowToScreenRow(CaretY) * fTextHeight + 1;
|
||||
{$ELSE}
|
||||
Result.Y := (Result.Y - fTopLine) * fTextHeight + 1;
|
||||
{$ENDIF}
|
||||
@ -1448,6 +1457,7 @@ begin
|
||||
// fLines := TSynEditList.Create;
|
||||
fLines := TSynEditStringList.Create;
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
fCaret := TSynEditCaret.Create;
|
||||
fTextView := TSynEditFoldedView.Create(TSynEditStringList(fLines));
|
||||
fTextView.OnFoldChanged := {$IFDEF FPC}@{$ENDIF}FoldChanged;
|
||||
{$ENDIF}
|
||||
@ -1563,10 +1573,11 @@ begin
|
||||
fTopLine := 1;
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
fTextView.TopLine := 1;
|
||||
{$ENDIF}
|
||||
{$ELSE}
|
||||
fCaretX := 1;
|
||||
fLastCaretX := 1; //mh 2000-10-19
|
||||
fCaretY := 1;
|
||||
{$ENDIF}
|
||||
fLastCaretX := 1; //mh 2000-10-19
|
||||
fBlockBegin := Point(1, 1);
|
||||
fBlockEnd := fBlockBegin;
|
||||
// find / replace
|
||||
@ -1694,6 +1705,7 @@ begin
|
||||
FreeAndNil(fFontDummy);
|
||||
FreeAndNil(fTextView);
|
||||
FreeAndNil(fLines);
|
||||
FreeAndNil(fCaret);
|
||||
{$ENDIF}
|
||||
inherited Destroy;
|
||||
end;
|
||||
@ -1722,13 +1734,13 @@ function TCustomSynEdit.CaretXPix: Integer;
|
||||
var
|
||||
p: TPoint;
|
||||
begin
|
||||
p := Point(fCaretX, fCaretY);
|
||||
p := Point(CaretX, CaretY);
|
||||
Result := RowColumnToPixels(p).X;
|
||||
end;
|
||||
|
||||
function TCustomSynEdit.CaretYPix: Integer;
|
||||
begin
|
||||
Result := RowColumnToPixels(Point(1, fCaretY)).Y;
|
||||
Result := RowColumnToPixels(Point(1, CaretY)).Y;
|
||||
end;
|
||||
|
||||
procedure TCustomSynEdit.FontChanged(Sender: TObject);
|
||||
@ -2452,7 +2464,7 @@ begin
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
LogCaretXY:=PhysicalToLogicalPos(CaretXY);
|
||||
{$ENDIF}
|
||||
fLastCaretX := fCaretX; //mh 2000-10-19
|
||||
fLastCaretX := CaretX; //mh 2000-10-19
|
||||
if Button = mbLeft then begin
|
||||
//DebugLn('TCustomSynEdit.MouseDown ',DbgSName(Self),' START CAPTURE');
|
||||
MouseCapture := True;
|
||||
@ -4772,6 +4784,16 @@ begin
|
||||
if fBlockIndent=AValue then exit;
|
||||
fBlockIndent:=AValue;
|
||||
end;
|
||||
|
||||
function TCustomSynEdit.GetCaretX : Integer;
|
||||
begin
|
||||
Result:= fCaret.CharPos;
|
||||
end;
|
||||
|
||||
function TCustomSynEdit.GetCaretY : Integer;
|
||||
begin
|
||||
Result:= fCaret.LinePos;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
procedure TCustomSynEdit.SetCaretX(Value: Integer);
|
||||
@ -4783,7 +4805,7 @@ end;
|
||||
procedure TCustomSynEdit.SetCaretY(Value: Integer);
|
||||
begin
|
||||
if not (eoKeepCaretX in Options) then begin //mh 2000-11-08
|
||||
fLastCaretX := fCaretX;
|
||||
fLastCaretX := CaretX;
|
||||
end;
|
||||
SetCaretXY(Point(fLastCaretX{CaretX}, Value)); //mh 2000-10-19
|
||||
end;
|
||||
@ -4823,27 +4845,33 @@ begin
|
||||
Value.X := nMaxX;
|
||||
if Value.X < 1 then
|
||||
Value.X := 1;
|
||||
if (Value.X <> fCaretX) or (Value.Y <> fCaretY) then begin
|
||||
if (Value.X <> CaretX) or (Value.Y <> CaretY) then begin
|
||||
IncPaintLock;
|
||||
try
|
||||
// simply include the flags, fPaintLock is > 0
|
||||
if fCaretX <> Value.X then begin
|
||||
if CaretX <> Value.X then begin
|
||||
{$IFNDEF SYN_LAZARUS}
|
||||
fCaretX := Value.X;
|
||||
{$ENDIF}
|
||||
Include(fStatusChanges, scCaretX);
|
||||
end;
|
||||
if fCaretY <> Value.Y then begin
|
||||
if CaretY <> Value.Y then begin
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
InvalidateGutterLines(fCaretY, fCaretY);
|
||||
InvalidateGutterLines(CaretY, CaretY);
|
||||
InvalidateGutterLines(Value.Y, Value.Y);
|
||||
{$ENDIF}
|
||||
{$ELSE}
|
||||
fCaretY := Value.Y;
|
||||
{$ENDIF}
|
||||
Include(fStatusChanges, scCaretY);
|
||||
end;
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
fCaret.LineCharPos:= Value;
|
||||
{$ENDIF}
|
||||
EnsureCursorPosVisible;
|
||||
Include(fStateFlags, sfCaretChanged);
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
if fTextView.FoldedAtTextIndex[fCaretY - 1] then
|
||||
fTextView.UnFoldAtTextIndex(fCaretY - 1, true);
|
||||
if fTextView.FoldedAtTextIndex[CaretY - 1] then
|
||||
fTextView.UnFoldAtTextIndex(CaretY - 1, true);
|
||||
{$ELSE}
|
||||
Include(fStateFlags, sfScrollbarChanged);
|
||||
{$ENDIF}
|
||||
@ -4852,7 +4880,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
fLastCaretX:=fCaretX;
|
||||
fLastCaretX:=CaretX;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
@ -5161,7 +5189,7 @@ var
|
||||
TSynEditStringList(Lines).InsertLines(CaretY, CountLines(P)); // djlp 2000-09-07
|
||||
end else begin
|
||||
TrimmedSetLine(CaretY - 1, sLeftSide + Value + sRightSide);
|
||||
fCaretX := LogicalToPhysicalPos(
|
||||
CaretX := LogicalToPhysicalPos(
|
||||
Point(1 + Length(sLeftSide + Value),CaretY)).X;
|
||||
end;
|
||||
// step2: insert left lines of Value
|
||||
@ -5170,7 +5198,7 @@ var
|
||||
Inc(P);
|
||||
if P^ = #10 then
|
||||
Inc(P);
|
||||
Inc(fCaretY);
|
||||
CaretY := CaretY + 1;
|
||||
Start := P;
|
||||
P := GetEOL(Start);
|
||||
if P = Start then begin
|
||||
@ -5195,7 +5223,7 @@ var
|
||||
end;
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
if p^=#0 then
|
||||
fCaretX := LogicalToPhysicalPos(
|
||||
CaretX := LogicalToPhysicalPos(
|
||||
Point(1 + Length(Lines[CaretY - 1]) - Length(sRightSide),
|
||||
CaretY)).X;
|
||||
{$ELSE}
|
||||
@ -5205,7 +5233,7 @@ var
|
||||
Inc(Result);
|
||||
end;
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
//DebugLn(['InsertNormal ',Length(Lines[CaretY - 1]),' ',Length(sRightSide),' ',fCaretX]);
|
||||
//DebugLn(['InsertNormal ',Length(Lines[CaretY - 1]),' ',Length(sRightSide),' ',CaretX]);
|
||||
{$ELSE}
|
||||
fCaretX := 1 + Length(Lines[CaretY - 1]) - Length(sRightSide);
|
||||
{$ENDIF}
|
||||
@ -5266,7 +5294,7 @@ var
|
||||
inc(p,2)
|
||||
else
|
||||
Inc(P);
|
||||
Inc(fCaretY);
|
||||
CaretY := CaretY + 1;
|
||||
end;
|
||||
{$ELSE}
|
||||
if P^ = #13 then begin
|
||||
@ -5277,7 +5305,7 @@ var
|
||||
{$ENDIF}
|
||||
Start := P;
|
||||
until P^ = #0;
|
||||
Inc(fCaretX, Length(Str));
|
||||
CaretX:= CaretX + Length(Str);
|
||||
Result := 0;
|
||||
end;
|
||||
|
||||
@ -5289,7 +5317,7 @@ var
|
||||
n: Integer;
|
||||
begin
|
||||
Result := 0;
|
||||
fCaretX := 1;
|
||||
CaretX := 1;
|
||||
// Insert string before current line
|
||||
Start := PChar(Value);
|
||||
repeat
|
||||
@ -5307,10 +5335,10 @@ var
|
||||
Lines.Add(Str);
|
||||
if eoTrimTrailingSpaces in Options then
|
||||
Lines[CaretY - 1] := TrimRight(Lines[CaretY - 1]);
|
||||
fCaretX := 1 + Length(Str);
|
||||
CaretX := 1 + Length(Str);
|
||||
end else begin
|
||||
TrimmedSetLine(CaretY - 1, Str);
|
||||
Inc(fCaretY);
|
||||
CaretY := CaretY + 1;
|
||||
Inc(Result);
|
||||
if P^ = #13 then
|
||||
Inc(P);
|
||||
@ -5380,7 +5408,7 @@ begin
|
||||
DeleteSelection;
|
||||
if (Value <> nil) and (Value[0] <> #0) then
|
||||
InsertText;
|
||||
fLastCaretX := fCaretX; //mh 2000-10-19
|
||||
fLastCaretX := CaretX; //mh 2000-10-19
|
||||
if CaretY < 1 then
|
||||
CaretY := 1;
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
@ -5512,7 +5540,7 @@ begin
|
||||
NewX:=Max(1,Min(fMaxLeftChar,NewCaret.X));
|
||||
if CaretX<>NewX then begin
|
||||
IncPaintLock;
|
||||
fCaretX:=NewX;
|
||||
CaretX:=NewX;
|
||||
DecPaintLock;
|
||||
end;
|
||||
end;
|
||||
@ -5908,8 +5936,8 @@ begin
|
||||
if Index > Lines.Count - 1 then Exit;
|
||||
if not assigned(fHighlighter) then begin
|
||||
fTextView.FixFoldingAtTextIndex(Index);
|
||||
if fTextView.FoldedAtTextIndex[fCaretY - 1] then
|
||||
fTextView.UnFoldAtTextIndex(fCaretY - 1);
|
||||
if fTextView.FoldedAtTextIndex[CaretY - 1] then
|
||||
fTextView.UnFoldAtTextIndex(CaretY - 1);
|
||||
Topline := TopLine;
|
||||
exit;
|
||||
end;
|
||||
@ -5953,8 +5981,8 @@ begin
|
||||
if (Result>Index+1) and (Result<=Lines.Count) then
|
||||
SetCodeFoldAttributes;
|
||||
fTextView.FixFoldingAtTextIndex(Index, Result);
|
||||
if fTextView.FoldedAtTextIndex[fCaretY - 1] then
|
||||
fTextView.UnFoldAtTextIndex(fCaretY - 1);
|
||||
if fTextView.FoldedAtTextIndex[CaretY - 1] then
|
||||
fTextView.UnFoldAtTextIndex(CaretY - 1);
|
||||
Topline := TopLine;
|
||||
if FixFStart < index then Invalidate;
|
||||
{$ENDIF}
|
||||
@ -6707,7 +6735,7 @@ begin
|
||||
Inc(Run,2)
|
||||
else
|
||||
Inc(Run);
|
||||
Inc(fCaretY);
|
||||
CaretY := CaretY + 1;
|
||||
end;
|
||||
{$ELSE}
|
||||
if Run <> StrToDelete then begin
|
||||
@ -7704,7 +7732,7 @@ begin
|
||||
MoveCaretAndSelection(CaretXY, Point(1 + Length(LineText), CaretY),
|
||||
Command = ecSelLineEnd);
|
||||
{$ENDIF}
|
||||
fLastCaretX := fCaretX;
|
||||
fLastCaretX := CaretX;
|
||||
end;
|
||||
{end} //mh 2000-10-19
|
||||
// vertical caret movement or selection
|
||||
@ -7796,7 +7824,7 @@ begin
|
||||
MoveCaretAndSelection
|
||||
{$ENDIF}
|
||||
(CaretXY, PPoint(Data)^, Command = ecSelGotoXY);
|
||||
fLastCaretX := fCaretX; //mh 2000-10-19
|
||||
fLastCaretX := CaretX; //mh 2000-10-19
|
||||
Update;
|
||||
end;
|
||||
// word selection
|
||||
@ -7814,7 +7842,7 @@ begin
|
||||
MoveCaretAndSelection
|
||||
{$ENDIF}
|
||||
(Caret, CaretNew, Command = ecSelWordLeft);
|
||||
fLastCaretX := fCaretX; //mh 2000-10-19
|
||||
fLastCaretX := CaretX; //mh 2000-10-19
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
Update;
|
||||
{$ENDIF}
|
||||
@ -7831,7 +7859,7 @@ begin
|
||||
MoveCaretAndSelection
|
||||
{$ENDIF}
|
||||
(Caret, CaretNew, Command = ecSelWordRight);
|
||||
fLastCaretX := fCaretX; //mh 2000-10-19
|
||||
fLastCaretX := CaretX; //mh 2000-10-19
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
Update;
|
||||
{$ENDIF}
|
||||
@ -7911,14 +7939,14 @@ begin
|
||||
// ' Temp="',DbgStr(Temp),'" Helper="',DbgStr(Helper),'"');
|
||||
Temp:=copy(Temp,1,LogSpacePos-1)+copy(Temp,LogCaretXY.X,MaxInt);
|
||||
TrimmedSetLine(CaretY - 1, Temp);
|
||||
fCaretX := LogicalToPhysicalCol(Temp,LogSpacePos);
|
||||
CaretX := LogicalToPhysicalCol(Temp,LogSpacePos);
|
||||
{$ELSE}
|
||||
Helper := Copy(Temp, 1, SpaceCount1 - SpaceCount2);
|
||||
Delete(Temp, 1, SpaceCount1 - SpaceCount2);
|
||||
TrimmedSetLine(CaretY - 1, Temp);
|
||||
fCaretX := fCaretX - (SpaceCount1 - SpaceCount2);
|
||||
{$ENDIF}
|
||||
fLastCaretX := fCaretX;
|
||||
fLastCaretX := CaretX;
|
||||
StatusChanged([scCaretX]);
|
||||
end else begin
|
||||
// delete char
|
||||
@ -8277,7 +8305,7 @@ begin
|
||||
{$ENDIF}
|
||||
DoLinesInserted(CaretY - InsDelta, 1);
|
||||
EnsureCursorPosVisible; //JGF 2000-09-23
|
||||
fLastCaretX := fCaretX; //mh 2000-10-19
|
||||
fLastCaretX := CaretX; //mh 2000-10-19
|
||||
end;
|
||||
ecTab:
|
||||
if not ReadOnly then DoTabKey;
|
||||
@ -10254,7 +10282,7 @@ begin
|
||||
Inc(Run,2)
|
||||
else
|
||||
Inc(Run);
|
||||
inc(fCaretY);
|
||||
CaretY := CaretY + 1;
|
||||
end;
|
||||
{$ELSE}
|
||||
if Run^ = #13 then
|
||||
|
@ -271,6 +271,29 @@ type
|
||||
property Options: TSynSearchOptions write SetOptions;
|
||||
end;
|
||||
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
|
||||
{ TSynEditCaret }
|
||||
|
||||
TSynEditCaret = class
|
||||
fLinePos : Integer; // 1 based
|
||||
fCharPos : Integer; // 1 based
|
||||
fOnChangeList : TMethodList;
|
||||
private
|
||||
function GetLineCharPos : TPoint;
|
||||
procedure SetLineCharPos(const AValue : TPoint);
|
||||
procedure setCharPos(const AValue : Integer);
|
||||
procedure setLinePos(const AValue : Integer);
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
procedure AddChangeHandler(AHandler: TNotifyEvent);
|
||||
procedure RemoveChangeHandler(AHandler: TNotifyEvent);
|
||||
property LinePos : Integer read fLinePos write setLinePos;
|
||||
property CharPos : Integer read fCharPos write setCharPos;
|
||||
property LineCharPos : TPoint read GetLineCharPos write SetLineCharPos;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
implementation
|
||||
|
||||
@ -806,5 +829,60 @@ begin
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
{ TSynEditCaret }
|
||||
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
|
||||
function TSynEditCaret.GetLineCharPos : TPoint;
|
||||
begin
|
||||
Result := Point(fCharPos, fLinePos);
|
||||
end;
|
||||
|
||||
procedure TSynEditCaret.SetLineCharPos(const AValue : TPoint);
|
||||
begin
|
||||
if (fCharPos = AValue.X) and (fLinePos = AValue.Y) then exit;
|
||||
fCharPos:= AValue.X;
|
||||
fLinePos:= AValue.Y;
|
||||
fOnChangeList.CallNotifyEvents(self);
|
||||
end;
|
||||
|
||||
procedure TSynEditCaret.setCharPos(const AValue : Integer);
|
||||
begin
|
||||
if fCharPos = AValue then exit;
|
||||
fCharPos:= AValue;
|
||||
fOnChangeList.CallNotifyEvents(self);
|
||||
end;
|
||||
|
||||
procedure TSynEditCaret.setLinePos(const AValue : Integer);
|
||||
begin
|
||||
if fLinePos = AValue then exit;
|
||||
fLinePos:= AValue;
|
||||
fOnChangeList.CallNotifyEvents(self);
|
||||
end;
|
||||
|
||||
constructor TSynEditCaret.Create;
|
||||
begin
|
||||
fOnChangeList := TMethodList.Create;
|
||||
fLinePos:= 1;
|
||||
fCharPos:= 1;
|
||||
end;
|
||||
|
||||
destructor TSynEditCaret.Destroy;
|
||||
begin
|
||||
FreeAndNil(fOnChangeList);
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TSynEditCaret.AddChangeHandler(AHandler : TNotifyEvent);
|
||||
begin
|
||||
fOnChangeList.Add(TMethod(AHandler));
|
||||
end;
|
||||
|
||||
procedure TSynEditCaret.RemoveChangeHandler(AHandler : TNotifyEvent);
|
||||
begin
|
||||
fOnChangeList.Remove(TMethod(AHandler));
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
end.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user