mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 03:59:13 +02:00
SynEdit: fix wrong right-gutter pos, if scrollbars were changed during handle creation / reduce some double calculation during resize
This commit is contained in:
parent
3d50451e87
commit
f3d1f63432
@ -218,6 +218,7 @@ type
|
|||||||
sfPreventScrollAfterSelect,
|
sfPreventScrollAfterSelect,
|
||||||
sfIgnoreNextChar, sfPainting, sfHasPainted, sfHasScrolled,
|
sfIgnoreNextChar, sfPainting, sfHasPainted, sfHasScrolled,
|
||||||
sfScrollbarChanged, sfHorizScrollbarVisible, sfVertScrollbarVisible,
|
sfScrollbarChanged, sfHorizScrollbarVisible, sfVertScrollbarVisible,
|
||||||
|
sfGutterResized,
|
||||||
sfAfterLoadFromFileNeeded,
|
sfAfterLoadFromFileNeeded,
|
||||||
// Mouse-states
|
// Mouse-states
|
||||||
sfLeftGutterClick, sfRightGutterClick,
|
sfLeftGutterClick, sfRightGutterClick,
|
||||||
@ -535,7 +536,7 @@ type
|
|||||||
FUndoBlockAtPaintLock: Integer;
|
FUndoBlockAtPaintLock: Integer;
|
||||||
FStatusChangeLock: Integer;
|
FStatusChangeLock: Integer;
|
||||||
FRecalcCharsAndLinesLock: Integer;
|
FRecalcCharsAndLinesLock: Integer;
|
||||||
FScrollBarUpdateLock: Integer;
|
FDoingResizeLock: Integer;
|
||||||
FInvalidateRect: TRect;
|
FInvalidateRect: TRect;
|
||||||
FIsInDecPaintLock: Boolean;
|
FIsInDecPaintLock: Boolean;
|
||||||
FScrollBars: TScrollStyle;
|
FScrollBars: TScrollStyle;
|
||||||
@ -2198,7 +2199,7 @@ begin
|
|||||||
inherited Create(AOwner);
|
inherited Create(AOwner);
|
||||||
SetInline(True);
|
SetInline(True);
|
||||||
ControlStyle:=ControlStyle+[csOwnedChildrenNotSelectable];
|
ControlStyle:=ControlStyle+[csOwnedChildrenNotSelectable];
|
||||||
FScrollBarUpdateLock := 0;
|
FDoingResizeLock := 0;
|
||||||
FPaintLock := 0;
|
FPaintLock := 0;
|
||||||
FStatusChangeLock := 0;
|
FStatusChangeLock := 0;
|
||||||
FUndoBlockAtPaintLock := 0;
|
FUndoBlockAtPaintLock := 0;
|
||||||
@ -4932,15 +4933,29 @@ end;
|
|||||||
procedure TCustomSynEdit.CreateHandle;
|
procedure TCustomSynEdit.CreateHandle;
|
||||||
begin
|
begin
|
||||||
Application.RemoveOnIdleHandler(@IdleScanRanges);
|
Application.RemoveOnIdleHandler(@IdleScanRanges);
|
||||||
DoIncPaintLock(nil);
|
DoIncPaintLock(nil); // prevent calculations during inherited and ONLY during inherited
|
||||||
try
|
try
|
||||||
inherited CreateHandle; //SizeOrFontChanged will be called
|
inherited CreateHandle; //SizeOrFontChanged will be called
|
||||||
|
fStateFlags := fStateFlags - [sfHorizScrollbarVisible, sfVertScrollbarVisible];
|
||||||
|
UpdateScrollBars; // just set sfScrollbarChanged
|
||||||
|
finally
|
||||||
|
DoDecPaintLock(nil); // run UpdateScrollBars
|
||||||
|
|
||||||
|
inc(FDoingResizeLock);
|
||||||
|
try
|
||||||
FLeftGutter.RecalcBounds;
|
FLeftGutter.RecalcBounds;
|
||||||
FRightGutter.RecalcBounds;
|
FRightGutter.RecalcBounds;
|
||||||
fStateFlags := fStateFlags - [sfHorizScrollbarVisible, sfVertScrollbarVisible];
|
finally
|
||||||
UpdateScrollBars;
|
dec(FDoingResizeLock);
|
||||||
finally
|
if sfGutterResized in fStateFlags then begin
|
||||||
DoDecPaintLock(nil);
|
Exclude(fStateFlags, sfGutterResized);
|
||||||
|
RecalcCharsAndLinesInWin(False);
|
||||||
|
UpdateScrollBars;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if sfScrollbarChanged in fStateFlags then
|
||||||
|
UpdateScrollBars;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -5135,8 +5150,7 @@ procedure TCustomSynEdit.UpdateScrollBars;
|
|||||||
var
|
var
|
||||||
ScrollInfo: TScrollInfo;
|
ScrollInfo: TScrollInfo;
|
||||||
begin
|
begin
|
||||||
if FScrollBarUpdateLock <> 0 then exit;
|
if (not HandleAllocated) or (PaintLock <> 0) or (FDoingResizeLock <> 0) then
|
||||||
if not HandleAllocated or (PaintLock <> 0) then
|
|
||||||
Include(fStateFlags, sfScrollbarChanged)
|
Include(fStateFlags, sfScrollbarChanged)
|
||||||
else begin
|
else begin
|
||||||
Exclude(fStateFlags, sfScrollbarChanged);
|
Exclude(fStateFlags, sfScrollbarChanged);
|
||||||
@ -5356,18 +5370,19 @@ begin
|
|||||||
inherited;
|
inherited;
|
||||||
if (not HandleAllocated) then
|
if (not HandleAllocated) then
|
||||||
exit;
|
exit;
|
||||||
inc(FScrollBarUpdateLock);
|
inc(FDoingResizeLock);
|
||||||
FScreenCaret.Lock;
|
FScreenCaret.Lock;
|
||||||
try
|
try
|
||||||
FLeftGutter.RecalcBounds;
|
FLeftGutter.RecalcBounds;
|
||||||
FRightGutter.RecalcBounds;
|
FRightGutter.RecalcBounds;
|
||||||
|
// SizeOrFontChanged will call RecalcCharsAndLinesInWin which may have been skipped in GutterResized
|
||||||
SizeOrFontChanged(FALSE);
|
SizeOrFontChanged(FALSE);
|
||||||
if sfEnsureCursorPosAtResize in fStateFlags then
|
if sfEnsureCursorPosAtResize in fStateFlags then
|
||||||
EnsureCursorPosVisible;
|
EnsureCursorPosVisible;
|
||||||
Exclude(fStateFlags, sfEnsureCursorPosAtResize);
|
Exclude(fStateFlags, sfEnsureCursorPosAtResize);
|
||||||
finally
|
finally
|
||||||
FScreenCaret.UnLock;
|
FScreenCaret.UnLock;
|
||||||
dec(FScrollBarUpdateLock);
|
dec(FDoingResizeLock);
|
||||||
UpdateScrollBars;
|
UpdateScrollBars;
|
||||||
end;
|
end;
|
||||||
//debugln('TCustomSynEdit.Resize ',dbgs(Width),',',dbgs(Height),',',dbgs(ClientWidth),',',dbgs(ClientHeight));
|
//debugln('TCustomSynEdit.Resize ',dbgs(Width),',',dbgs(Height),',',dbgs(ClientWidth),',',dbgs(ClientHeight));
|
||||||
@ -8035,6 +8050,11 @@ begin
|
|||||||
|
|
||||||
GutterChanged(Sender);
|
GutterChanged(Sender);
|
||||||
|
|
||||||
|
if (FDoingResizeLock <> 0) then begin
|
||||||
|
Include(fStateFlags, sfGutterResized);
|
||||||
|
exit
|
||||||
|
end;
|
||||||
|
|
||||||
if HandleAllocated then begin
|
if HandleAllocated then begin
|
||||||
RecalcCharsAndLinesInWin(False);
|
RecalcCharsAndLinesInWin(False);
|
||||||
UpdateScrollBars;
|
UpdateScrollBars;
|
||||||
|
Loading…
Reference in New Issue
Block a user