mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-26 13:57:37 +01:00
synedit: fixed updating bracket highlighting on text changes from Martin Friebe
git-svn-id: trunk@15411 -
This commit is contained in:
parent
09f4ca53a5
commit
56f181b65c
@ -369,7 +369,6 @@ type
|
|||||||
fBlockIndent: integer;
|
fBlockIndent: integer;
|
||||||
fCaretX: Integer; // physical position (screen)
|
fCaretX: Integer; // physical position (screen)
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
fBracketHighlightCaret: TPoint;
|
|
||||||
fBracketHighlightPos: TPoint;
|
fBracketHighlightPos: TPoint;
|
||||||
fBracketHighlightAntiPos: TPoint;
|
fBracketHighlightAntiPos: TPoint;
|
||||||
fCtrlMouseActive: boolean;
|
fCtrlMouseActive: boolean;
|
||||||
@ -622,7 +621,7 @@ type
|
|||||||
procedure InvalidateGutterLines(FirstLine, LastLine: integer);
|
procedure InvalidateGutterLines(FirstLine, LastLine: integer);
|
||||||
procedure InvalidateLines(FirstLine, LastLine: integer);
|
procedure InvalidateLines(FirstLine, LastLine: integer);
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
procedure InvalidateBracketHighlight(OnlyIfCaretMoved: boolean);
|
procedure InvalidateBracketHighlight;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
@ -1542,7 +1541,9 @@ begin
|
|||||||
if sfScrollbarChanged in fStateFlags then
|
if sfScrollbarChanged in fStateFlags then
|
||||||
UpdateScrollbars;
|
UpdateScrollbars;
|
||||||
if sfCaretChanged in fStateFlags then
|
if sfCaretChanged in fStateFlags then
|
||||||
UpdateCaret;
|
UpdateCaret
|
||||||
|
else if not(sfPainting in fStateFlags) then
|
||||||
|
InvalidateBracketHighlight; // This can change, without moving the Cursor
|
||||||
if fStatusChanges <> [] then
|
if fStatusChanges <> [] then
|
||||||
DoOnStatusChange(fStatusChanges);
|
DoOnStatusChange(fStatusChanges);
|
||||||
end;
|
end;
|
||||||
@ -2087,38 +2088,55 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
procedure TCustomSynEdit.InvalidateBracketHighlight(OnlyIfCaretMoved: boolean);
|
procedure TCustomSynEdit.InvalidateBracketHighlight;
|
||||||
|
var
|
||||||
|
NewPos, NewAntiPos, SwapPos : TPoint;
|
||||||
begin
|
begin
|
||||||
if OnlyIfCaretMoved
|
NewPos.Y:=-1;
|
||||||
and (CaretX=fBracketHighlightCaret.X)
|
NewAntiPos.Y:=-1;
|
||||||
and (CaretY=fBracketHighlightCaret.Y) then
|
if eoBracketHighlight in Options
|
||||||
exit;
|
then FindMatchingBracketPair(CaretXY, NewPos, NewAntiPos, false);
|
||||||
fBracketHighlightCaret:=CaretXY;
|
|
||||||
// invalidate old bracket highlighting
|
// Always keep ordered
|
||||||
if fBracketHighlightPos.Y>0 then begin
|
if (NewAntiPos.Y > 0)
|
||||||
|
and ((NewAntiPos.Y < NewPos.Y) or ((NewAntiPos.Y = NewPos.Y) and (NewAntiPos.X < NewPos.X)))
|
||||||
|
then begin
|
||||||
|
SwapPos := NewAntiPos;
|
||||||
|
NewAntiPos := NewPos;
|
||||||
|
NewPos := SwapPos;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// invalidate old bracket highlighting, if changed
|
||||||
|
if (fBracketHighlightPos.Y > 0)
|
||||||
|
and ((fBracketHighlightPos.Y <> NewPos.Y) or (fBracketHighlightPos.X <> NewPos.X))
|
||||||
|
then begin
|
||||||
//DebugLn('TCustomSynEdit.InvalidateBracketHighlight A Y=',fBracketHighlightPos.Y,' X=',fBracketHighlightPos.X);
|
//DebugLn('TCustomSynEdit.InvalidateBracketHighlight A Y=',fBracketHighlightPos.Y,' X=',fBracketHighlightPos.X);
|
||||||
InvalidateLines(fBracketHighlightPos.Y,fBracketHighlightPos.Y);
|
InvalidateLines(fBracketHighlightPos.Y,fBracketHighlightPos.Y);
|
||||||
end;
|
end;
|
||||||
if (fBracketHighlightAntiPos.Y>0)
|
|
||||||
and (fBracketHighlightPos.Y<>fBracketHighlightAntiPos.Y) then
|
|
||||||
InvalidateLines(fBracketHighlightAntiPos.Y,fBracketHighlightAntiPos.Y);
|
|
||||||
fBracketHighlightPos.Y:=0;
|
|
||||||
fBracketHighlightAntiPos.Y:=0;
|
|
||||||
if eoBracketHighlight in Options then begin
|
|
||||||
FindMatchingBracketPair(CaretXY,
|
|
||||||
fBracketHighlightPos,fBracketHighlightAntiPos,true);
|
|
||||||
|
|
||||||
// invalidate new bracket highlighting
|
if (fBracketHighlightAntiPos.Y > 0)
|
||||||
if fBracketHighlightPos.Y>0 then begin
|
and (fBracketHighlightPos.Y <> fBracketHighlightAntiPos.Y)
|
||||||
//DebugLn('TCustomSynEdit.InvalidateBracketHighlight C ',
|
and ((fBracketHighlightAntiPos.Y <> NewAntiPos.Y) OR (fBracketHighlightAntiPos.X <> NewAntiPos.X))
|
||||||
// ' Y=',fBracketHighlightPos.Y,' X=',fBracketHighlightPos.X,
|
then
|
||||||
// ' Y=',fBracketHighlightAntiPos.Y,' X=',fBracketHighlightAntiPos.X,
|
|
||||||
// '');
|
|
||||||
InvalidateLines(fBracketHighlightPos.Y,fBracketHighlightPos.Y);
|
|
||||||
if fBracketHighlightPos.Y<>fBracketHighlightAntiPos.Y then
|
|
||||||
InvalidateLines(fBracketHighlightAntiPos.Y,fBracketHighlightAntiPos.Y);
|
InvalidateLines(fBracketHighlightAntiPos.Y,fBracketHighlightAntiPos.Y);
|
||||||
|
|
||||||
|
// invalidate new bracket highlighting, if changed
|
||||||
|
if NewPos.Y>0 then begin
|
||||||
|
//DebugLn('TCustomSynEdit.InvalidateBracketHighlight C ',
|
||||||
|
// ' Y=',NewPos.Y,' X=',NewPos.X,
|
||||||
|
// ' Y=',NewAntiPos.Y,' X=',NewAntiPos.X,
|
||||||
|
// '');
|
||||||
|
if ((fBracketHighlightPos.Y <> NewPos.Y) or (fBracketHighlightPos.X <> NewPos.X))
|
||||||
|
then InvalidateLines(NewPos.Y, NewPos.Y);
|
||||||
|
|
||||||
|
if ((NewPos.Y <> NewAntiPos.Y)
|
||||||
|
or ((fBracketHighlightPos.Y = NewPos.Y) and (fBracketHighlightPos.X = NewPos.X))
|
||||||
|
)
|
||||||
|
and ((fBracketHighlightAntiPos.Y <> NewAntiPos.Y) OR (fBracketHighlightAntiPos.X <> NewAntiPos.X))
|
||||||
|
then InvalidateLines(NewAntiPos.Y, NewAntiPos.Y);
|
||||||
end;
|
end;
|
||||||
end;
|
fBracketHighlightPos := NewPos;
|
||||||
|
fBracketHighlightAntiPos := NewAntiPos;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomSynEdit.FindMatchingBracketPair(const PhysCaret: TPoint;
|
procedure TCustomSynEdit.FindMatchingBracketPair(const PhysCaret: TPoint;
|
||||||
@ -3178,12 +3196,6 @@ var
|
|||||||
|
|
||||||
ExpandedPaintToken: string; // used to create the string sent to TextDrawer
|
ExpandedPaintToken: string; // used to create the string sent to TextDrawer
|
||||||
|
|
||||||
// logical (byte) positions of highlight brackets, the X are zero based
|
|
||||||
nBracketX: integer; // zero based (logical)
|
|
||||||
nBracketY: integer; // one based
|
|
||||||
nAntiBracketX: integer; // zero based (logical)
|
|
||||||
nAntiBracketY: integer; // one based
|
|
||||||
|
|
||||||
LinkFGCol: TColor;
|
LinkFGCol: TColor;
|
||||||
|
|
||||||
{ local procedures }
|
{ local procedures }
|
||||||
@ -3708,14 +3720,14 @@ var
|
|||||||
LeftBracketX, RightBracketX, Dummy: integer;
|
LeftBracketX, RightBracketX, Dummy: integer;
|
||||||
begin
|
begin
|
||||||
// get bracket positions
|
// get bracket positions
|
||||||
if (nLine=nBracketY)
|
if (nLine=fBracketHighlightPos.Y)
|
||||||
and (nBracketX>=nTokenPos) and (nBracketX<nTokenPos+nTokenLen) then
|
and (fBracketHighlightPos.X-1>=nTokenPos) and (fBracketHighlightPos.X-1<nTokenPos+nTokenLen) then
|
||||||
LeftBracketX:=nBracketX
|
LeftBracketX:=fBracketHighlightPos.X-1
|
||||||
else
|
else
|
||||||
LeftBracketX:=-1;
|
LeftBracketX:=-1;
|
||||||
if (nLine=nAntiBracketY)
|
if (nLine=fBracketHighlightAntiPos.Y)
|
||||||
and (nAntiBracketX>=nTokenPos) and (nAntiBracketX<nTokenPos+nTokenLen) then
|
and (fBracketHighlightAntiPos.X-1>=nTokenPos) and (fBracketHighlightAntiPos.X-1<nTokenPos+nTokenLen) then
|
||||||
RightBracketX:=nAntiBracketX
|
RightBracketX:=fBracketHighlightAntiPos.X-1
|
||||||
else
|
else
|
||||||
RightBracketX:=-1;
|
RightBracketX:=-1;
|
||||||
if (LeftBracketX<0) and (RightBracketX>=0) then begin
|
if (LeftBracketX<0) and (RightBracketX>=0) then begin
|
||||||
@ -3968,10 +3980,10 @@ var
|
|||||||
if (fLastCtrlMouseLinkY<>CurLine)
|
if (fLastCtrlMouseLinkY<>CurLine)
|
||||||
or (nTokenPos+1<>fLastCtrlMouseLinkX1)
|
or (nTokenPos+1<>fLastCtrlMouseLinkX1)
|
||||||
then begin
|
then begin
|
||||||
if ((nBracketY<>CurLine) or (nTokenPos+nTokenLen<=nBracketX)
|
if ((fBracketHighlightPos.Y<>CurLine) or (nTokenPos+nTokenLen<=fBracketHighlightPos.X-1)
|
||||||
or (nTokenPos>nBracketX))
|
or (nTokenPos>fBracketHighlightPos.X-1))
|
||||||
and ((nAntiBracketY<>CurLine) or (nTokenPos+nTokenLen<=nAntiBracketX)
|
and ((fBracketHighlightAntiPos.Y<>CurLine) or (nTokenPos+nTokenLen<=fBracketHighlightAntiPos.X-1)
|
||||||
or (nTokenPos>nAntiBracketX)) then
|
or (nTokenPos>fBracketHighlightAntiPos.X-1)) then
|
||||||
begin
|
begin
|
||||||
// normal token
|
// normal token
|
||||||
if Assigned(attr) then
|
if Assigned(attr) then
|
||||||
@ -4014,95 +4026,6 @@ var
|
|||||||
CurLine:=-1;
|
CurLine:=-1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure InitializeHighlightBrackets;
|
|
||||||
// test if caret over bracket and search anti bracket
|
|
||||||
const
|
|
||||||
Brackets: array[0..5] of char = ('(', ')', '[', ']', '{', '}');
|
|
||||||
var
|
|
||||||
sLine: string;
|
|
||||||
i, PosX, PosY, Len: integer;
|
|
||||||
CurChar, BracketInc, BracketDec: char;
|
|
||||||
NumBrackets: integer;
|
|
||||||
LogCaret: TPoint;
|
|
||||||
begin
|
|
||||||
// check for bracket under the cursor
|
|
||||||
nBracketY:=0;
|
|
||||||
nAntiBracketY:=0;
|
|
||||||
if not (eoBracketHighlight in fOptions) then exit;
|
|
||||||
if (fCaretY < FirstLine) or (fCaretY > LastLine) then exit;
|
|
||||||
sLine := Lines[fCaretY - 1];
|
|
||||||
Len := Length(sLine);
|
|
||||||
LogCaret:=PhysicalToLogicalPos(CaretXY);
|
|
||||||
if (LogCaret.X < 1) or (LogCaret.X > Len) then exit;
|
|
||||||
BracketInc := sLine[LogCaret.X];
|
|
||||||
if not (BracketInc in ['(',')','[',']','{','}']) then exit;
|
|
||||||
nBracketY:=LogCaret.Y;
|
|
||||||
nBracketX:=LogCaret.X-1; // zero based
|
|
||||||
// find antibracket
|
|
||||||
NumBrackets := 1;
|
|
||||||
PosX:=LogCaret.X;
|
|
||||||
PosY:=LogCaret.Y;
|
|
||||||
i:=0;
|
|
||||||
while Brackets[i]<>BracketInc do inc(i);
|
|
||||||
BracketDec := Brackets[i xor 1]; // 0 -> 1, 1 -> 0, ...
|
|
||||||
if Odd(i) then begin
|
|
||||||
// closing bracket -> search opening bracket
|
|
||||||
repeat
|
|
||||||
// search until start of line
|
|
||||||
while PosX > 1 do begin
|
|
||||||
Dec(PosX);
|
|
||||||
CurChar := sLine[PosX];
|
|
||||||
if CurChar=BracketInc then
|
|
||||||
Inc(NumBrackets)
|
|
||||||
else if CurChar=BracketDec then begin
|
|
||||||
Dec(NumBrackets);
|
|
||||||
if NumBrackets = 0 then begin
|
|
||||||
// matching bracket found, set caret and bail out
|
|
||||||
nAntiBracketX:=PosX-1; // zero based
|
|
||||||
nAntiBracketY:=PosY;
|
|
||||||
break;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
// get previous line if possible
|
|
||||||
if (nAntiBracketY>0) or (PosY <=FirstLine) then break;
|
|
||||||
Dec(PosY);
|
|
||||||
sLine := Lines[PosY - 1];
|
|
||||||
PosX := Length(sLine) + 1;
|
|
||||||
until FALSE;
|
|
||||||
end else begin
|
|
||||||
// opening bracket -> search closing bracket
|
|
||||||
repeat
|
|
||||||
// search until end of line
|
|
||||||
Len := Length(sLine);
|
|
||||||
while PosX < Len do begin
|
|
||||||
Inc(PosX);
|
|
||||||
CurChar := sLine[PosX];
|
|
||||||
if CurChar=BracketInc then
|
|
||||||
Inc(NumBrackets)
|
|
||||||
else if CurChar=BracketDec then begin
|
|
||||||
Dec(NumBrackets);
|
|
||||||
if NumBrackets = 0 then begin
|
|
||||||
// matching bracket found, set caret and bail out
|
|
||||||
nAntiBracketX:=PosX-1; // zero based
|
|
||||||
nAntiBracketY:=PosY;
|
|
||||||
break;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
// get next line if possible
|
|
||||||
if (nAntiBracketY>0) or (PosY >= LastLine) then break;
|
|
||||||
Inc(PosY);
|
|
||||||
sLine := Lines[PosY - 1];
|
|
||||||
PosX := 0;
|
|
||||||
until FALSE;
|
|
||||||
end;
|
|
||||||
{debugln('InitializeHighlightBrackets END nBracketY=',dbgs(nBracketY),
|
|
||||||
' nBracketX=',dbgs(nBracketX),
|
|
||||||
' nAntiBracketY=',dbgs(nAntiBracketY),
|
|
||||||
' nAntiBracketX=',dbgs(nAntiBracketX));}
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure CalculateCtrlMouseLink;
|
procedure CalculateCtrlMouseLink;
|
||||||
begin
|
begin
|
||||||
fLastCtrlMouseLinkY:=-1;
|
fLastCtrlMouseLinkY:=-1;
|
||||||
@ -4178,7 +4101,6 @@ begin
|
|||||||
AClip.Left := rcToken.Right;
|
AClip.Left := rcToken.Right;
|
||||||
end;
|
end;
|
||||||
if (LastLine >= FirstLine) then begin
|
if (LastLine >= FirstLine) then begin
|
||||||
InitializeHighlightBrackets;
|
|
||||||
CalculateCtrlMouseLink;
|
CalculateCtrlMouseLink;
|
||||||
// Paint the visible text lines. To make this easier, compute first the
|
// Paint the visible text lines. To make this easier, compute first the
|
||||||
// necessary information about the selected area: is there any visible
|
// necessary information about the selected area: is there any visible
|
||||||
@ -5834,7 +5756,7 @@ begin
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
{$IFDEF SYN_LAZARUS}
|
{$IFDEF SYN_LAZARUS}
|
||||||
InvalidateBracketHighlight(true);
|
InvalidateBracketHighlight();
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
{$IFDEF SYN_MBCSSUPPORT}
|
{$IFDEF SYN_MBCSSUPPORT}
|
||||||
if HandleAllocated then begin
|
if HandleAllocated then begin
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user