SynEdit: WrappedView, do not wrap before handle creation, wait for valid size of editor

This commit is contained in:
Martin 2025-02-22 17:30:08 +01:00
parent 4ac85baf37
commit baef0f2c7a
3 changed files with 22 additions and 1 deletions

View File

@ -5020,6 +5020,7 @@ begin
Include(fStateFlags, sfAfterHandleCreatedNeeded); Include(fStateFlags, sfAfterHandleCreatedNeeded);
inherited CreateHandle; //SizeOrFontChanged will be called inherited CreateHandle; //SizeOrFontChanged will be called
end; end;
StatusChanged([scHandleCreated]);
end; end;
procedure TCustomSynEdit.SetScrollBars(const Value: TScrollStyle); procedure TCustomSynEdit.SetScrollBars(const Value: TScrollStyle);

View File

@ -117,6 +117,7 @@ type
scLeftChar, scTopLine, scLinesInWindow, scCharsInWindow, scLeftChar, scTopLine, scLinesInWindow, scCharsInWindow,
scInsertMode, scModified, scSelection, scReadOnly, scInsertMode, scModified, scSelection, scReadOnly,
scFocus, // received or lost focus scFocus, // received or lost focus
scHandleCreated, // handle created
scOptions // some Options were changed (only triggered by some optinos) scOptions // some Options were changed (only triggered by some optinos)
); );
TSynStatusChanges = set of TSynStatusChange; TSynStatusChanges = set of TSynStatusChange;

View File

@ -7,7 +7,7 @@ interface
uses uses
Classes, SysUtils, math, LazSynEditText, SynEdit, SynEditViewedLineMap, SynEditTypes, Classes, SysUtils, math, LazSynEditText, SynEdit, SynEditViewedLineMap, SynEditTypes,
SynEditMiscProcs, SynEditHighlighter, SynEditMiscClasses, SynEditKeyCmds, SynEditFoldedView, SynEditMiscProcs, SynEditHighlighter, SynEditMiscClasses, SynEditKeyCmds, SynEditFoldedView,
Graphics, LCLType, LazLoggerBase, LazListClasses; Graphics, LCLType, Forms, LazLoggerBase, LazListClasses;
type type
TLazSynEditLineWrapPlugin = class; TLazSynEditLineWrapPlugin = class;
@ -220,6 +220,8 @@ type
procedure DoLinesChanged(Sender: TObject); procedure DoLinesChanged(Sender: TObject);
procedure DoMarkupChanged(Sender: TObject); procedure DoMarkupChanged(Sender: TObject);
procedure DoHandleCreated(Sender: TObject; Changes: TSynStatusChanges);
procedure DoTriggerValidate(Data: PtrInt);
procedure DoWidthChanged(Sender: TObject; Changes: TSynStatusChanges); procedure DoWidthChanged(Sender: TObject; Changes: TSynStatusChanges);
function GetWrapColumn: Integer; function GetWrapColumn: Integer;
procedure SetKeyStrokes(AValue: TSynEditLineMapKeyStrokes); procedure SetKeyStrokes(AValue: TSynEditLineMapKeyStrokes);
@ -1700,11 +1702,24 @@ begin
FMarkupInfoWrapIndent.FrameEdges := sfeLeft; FMarkupInfoWrapIndent.FrameEdges := sfeLeft;
end; end;
procedure TLazSynEditLineWrapPlugin.DoHandleCreated(Sender: TObject; Changes: TSynStatusChanges);
begin
Application.QueueAsyncCall(@DoTriggerValidate, 0); // just in case there is no resize
end;
procedure TLazSynEditLineWrapPlugin.DoTriggerValidate(Data: PtrInt);
begin
DoWidthChanged(nil, [scCharsInWindow]);
end;
procedure TLazSynEditLineWrapPlugin.DoWidthChanged(Sender: TObject; procedure TLazSynEditLineWrapPlugin.DoWidthChanged(Sender: TObject;
Changes: TSynStatusChanges); Changes: TSynStatusChanges);
var var
w: Integer; w: Integer;
begin begin
if not Editor.HandleAllocated then exit;
Application.RemoveAsyncCalls(Self);
w := WrapColumn; w := WrapColumn;
if FCurrentWrapColumn = w then if FCurrentWrapColumn = w then
exit; exit;
@ -2369,6 +2384,7 @@ begin
FLineMapView.WrapInfoForViewedXYProc := @GetWrapInfoForViewedXY; FLineMapView.WrapInfoForViewedXYProc := @GetWrapInfoForViewedXY;
FLineMapView.AddLinesChangedHandler(@DoLinesChanged); FLineMapView.AddLinesChangedHandler(@DoLinesChanged);
TSynEdit(Editor).RegisterStatusChangedHandler(@DoWidthChanged, [scCharsInWindow]); TSynEdit(Editor).RegisterStatusChangedHandler(@DoWidthChanged, [scCharsInWindow]);
TSynEdit(Editor).RegisterStatusChangedHandler(@DoHandleCreated, [scHandleCreated]);
FMinWrapWidth := 1; FMinWrapWidth := 1;
FLineMapView.KnownLengthOfLongestLine := WrapColumn; FLineMapView.KnownLengthOfLongestLine := WrapColumn;
WrapAll; WrapAll;
@ -2376,8 +2392,10 @@ end;
destructor TLazSynEditLineWrapPlugin.Destroy; destructor TLazSynEditLineWrapPlugin.Destroy;
begin begin
Application.RemoveAsyncCalls(Self);
if Editor <> nil then begin if Editor <> nil then begin
TSynEdit(Editor).UnRegisterStatusChangedHandler(@DoWidthChanged); TSynEdit(Editor).UnRegisterStatusChangedHandler(@DoWidthChanged);
TSynEdit(Editor).UnRegisterStatusChangedHandler(@DoHandleCreated);
if (FLineMapView <> nil) and not (csDestroying in Editor.Componentstate) then begin if (FLineMapView <> nil) and not (csDestroying in Editor.Componentstate) then begin
TSynEdit(Editor).TextViewsManager.RemoveSynTextView(FLineMapView, True); TSynEdit(Editor).TextViewsManager.RemoveSynTextView(FLineMapView, True);
TSynEdit(Editor).Invalidate; TSynEdit(Editor).Invalidate;
@ -2409,6 +2427,7 @@ var
tsub: TLineRange; tsub: TLineRange;
begin begin
if not FLineMapView.Tree.NeedsValidation then exit; if not FLineMapView.Tree.NeedsValidation then exit;
if not Editor.HandleAllocated then exit;
TopViewIdx := ToIdx(TSynEdit(Editor).TopView); TopViewIdx := ToIdx(TSynEdit(Editor).TopView);
TopLineIdx := ViewedTextBuffer.DisplayView.ViewToTextIndexEx(TopViewIdx, tsub); TopLineIdx := ViewedTextBuffer.DisplayView.ViewToTextIndexEx(TopViewIdx, tsub);