From 3b28b9026fd3c83c095a2f5325701db28003f324 Mon Sep 17 00:00:00 2001 From: martin Date: Tue, 20 Jan 2009 21:14:03 +0000 Subject: [PATCH] SynEdit Gutter: Fixing some AutoSize stuff git-svn-id: trunk@18362 - --- components/synedit/synedit.pp | 3 +- components/synedit/syngutter.pp | 34 +++++++++++++++------- components/synedit/syngutterchanges.pas | 11 ++++++- components/synedit/synguttercodefolding.pp | 11 ++++++- components/synedit/syngutterlinenumber.pp | 12 +++++++- components/synedit/synguttermarks.pp | 11 ++++++- 6 files changed, 67 insertions(+), 15 deletions(-) diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index d157c5aa19..4d7126b18f 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -7857,7 +7857,8 @@ var begin if not (csLoading in ComponentState) then begin FGutter.AutoSizeDigitCount(FTheLinesView.Count); // Todo: Make the LineNumberGutterPart an observer - nW := fGutter.RealGutterWidth(fCharWidth); + fGutter.RealGutterWidth(fCharWidth); + nW := fGutter.Width; if nW = fGutterWidth then InvalidateGutter else diff --git a/components/synedit/syngutter.pp b/components/synedit/syngutter.pp index 3d142e70e0..4cb7025eba 100644 --- a/components/synedit/syngutter.pp +++ b/components/synedit/syngutter.pp @@ -99,7 +99,7 @@ type public constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent; AGutter: TSynGutter); - // destructor Destroy; override; + destructor Destroy; override; property Items[Index: Integer]: TSynGutterPartBase read GetPart write PutPart; default; end; @@ -114,12 +114,12 @@ type FMarkupInfo: TSynSelectedColor; FCursor: TCursor; FVisible: Boolean; - FWidth : integer; FOnChange: TNotifyEvent; FOnGutterClick: TGutterClickEvent; function GetGutterParts: TSynGutterPartList; procedure SetMarkupInfo(const AValue: TSynSelectedColor); protected + FWidth : integer; procedure SetAutoSize(const AValue : boolean); virtual; procedure SetVisible(const AValue : boolean); virtual; procedure SetWidth(const AValue : integer); virtual; @@ -476,7 +476,7 @@ begin Result := FLeftOffset + FRightOffset; - for i := FGutterPartList.Count-1 downto 0 do + for i := GutterPartCount-1 downto 0 do Result := Result + GutterPart[i].RealGutterWidth(CharWidth); end; @@ -487,7 +487,10 @@ end; function TSynGutter.GetGutterPartCount: integer; begin - result := FGutterPartList.Count; + if FGutterPartList <> nil then + result := FGutterPartList.Count + else + Result := 0; end; function TSynGutter.GetGutterPartCountByClass(AClass: TSynGutterPartBaseClass): integer; @@ -552,6 +555,7 @@ procedure TSynGutter.Clear; var i: Integer; begin + if FGutterPartList = nil then exit; for i := FGutterPartList.Count-1 downto 0 do GutterPart[i].Free; FGutterPartList.Clear; @@ -597,7 +601,7 @@ end; procedure TSynGutter.SetWidth(Value: integer); begin Value := Max(0, Value); - if FWidth <> Value then + if (FWidth <> Value) and not FAutoSize then begin FWidth := Value; DoChange(Self); @@ -606,6 +610,8 @@ end; procedure TSynGutter.DoChange(Sender: TObject); begin + If FAutoSize then + FWidth := RealGutterWidth(FTextDrawer.CharWidth); if Assigned(FOnChange) then FOnChange(Self); end; @@ -654,7 +660,7 @@ var begin i := 0; x2 := x; - while i < FGutterPartList.Count-1 do begin + while i < GutterPartCount-1 do begin if GutterPart[i].Visible then begin if x2 >= GutterPart[i].Width then x2 := x2 - GutterPart[i].Width @@ -690,12 +696,13 @@ begin AClip.Left := FLeftOffset; rcLine := AClip; rcLine.Right := rcLine.Left; - for i := 0 to FGutterPartList.Count -1 do + for i := 0 to GutterPartCount -1 do begin + if rcLine.Right >= AClip.Right then break; if GutterPart[i].Visible then begin rcLine.Left := rcLine.Right; - rcLine.Right := rcLine.Left + GutterPart[i].Width; + rcLine.Right := min(rcLine.Left + GutterPart[i].Width, AClip.Right); GutterPart[i].Paint(Canvas, rcLine, FirstLine, LastLine); end; end; @@ -737,7 +744,7 @@ end; procedure TSynGutterPartBase.SetWidth(const AValue : integer); begin - if FWidth=AValue then exit; + if (FWidth=AValue) or (FAutoSize) then exit; FWidth:=AValue; DoChange(self); end; @@ -798,7 +805,7 @@ end; constructor TSynGutterSeparator.Create(AOwner: TComponent); begin inherited Create(AOwner); - Width := 2; + FWidth := 2; end; procedure TSynGutterSeparator.Paint(Canvas: TCanvas; AClip: TRect; FirstLine, LastLine: integer); @@ -842,6 +849,13 @@ begin Create(AOwner); end; +destructor TSynGutterPartList.Destroy; +begin + FGutter.FGutterPartList := nil; + OnChange := nil; + inherited Destroy; +end; + procedure TSynGutterPartList.RegisterItem(AnItem: TSynObjectListItem); begin TSynGutterPartBase(AnItem).OnChange := {$IFDEF FPC}@{$ENDIF}DoChange; diff --git a/components/synedit/syngutterchanges.pas b/components/synedit/syngutterchanges.pas index cdf38db4c5..389dd7bb08 100644 --- a/components/synedit/syngutterchanges.pas +++ b/components/synedit/syngutterchanges.pas @@ -18,6 +18,8 @@ type function GetSavedColor: TColor; procedure SetModifiedColor(const AValue: TColor); procedure SetSavedColor(const AValue: TColor); + protected + procedure DoChange(Sender: TObject); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -44,7 +46,7 @@ begin MarkupInfo.Foreground := clGreen; MarkupInfo.FrameColor := $00E9FC; - Width := 6; + FWidth := 4; end; destructor TSynGutterChanges.Destroy; @@ -72,6 +74,13 @@ begin MarkupInfo.Foreground := AValue; end; +procedure TSynGutterChanges.DoChange(Sender: TObject); +begin + if AutoSize then + FWidth := 4; + inherited DoChange(Sender); +end; + function TSynGutterChanges.RealGutterWidth(CharWidth: integer): integer; begin if not Visible then diff --git a/components/synedit/synguttercodefolding.pp b/components/synedit/synguttercodefolding.pp index e6e0bf264a..21cb005055 100644 --- a/components/synedit/synguttercodefolding.pp +++ b/components/synedit/synguttercodefolding.pp @@ -15,6 +15,8 @@ type TSynGutterCodeFolding = class(TSynGutterPartBase) private FFoldView: TSynEditFoldedView; + protected + procedure DoChange(Sender: TObject); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -33,6 +35,13 @@ uses { TSynGutterCodeFolding } +procedure TSynGutterCodeFolding.DoChange(Sender: TObject); +begin + if AutoSize then + FWidth := 10; + inherited DoChange(Sender); +end; + constructor TSynGutterCodeFolding.Create(AOwner: TComponent); begin inherited Create(AOwner); @@ -42,7 +51,7 @@ begin MarkupInfo.Foreground := clDkGray; MarkupInfo.FrameColor := clNone; - Width := 10; + FWidth := 10; end; destructor TSynGutterCodeFolding.Destroy; diff --git a/components/synedit/syngutterlinenumber.pp b/components/synedit/syngutterlinenumber.pp index 39b3839c25..a75c79871b 100644 --- a/components/synedit/syngutterlinenumber.pp +++ b/components/synedit/syngutterlinenumber.pp @@ -28,6 +28,8 @@ type procedure SetShowOnlyLineNumbersMultiplesOf(const AValue : integer); procedure SetZeroStart(const AValue : boolean); function FormatLineNumber(Line: integer; IsDot: boolean): string; + protected + procedure DoChange(Sender: TObject); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -63,6 +65,7 @@ begin FShowOnlyLineNumbersMultiplesOf := 1; FLeadingZeros := false; FZeroStart := False; + FWidth := 25; end; destructor TSynGutterLineNumber.Destroy; @@ -133,7 +136,7 @@ begin end; if AutoSize then - Width := FAutoSizeDigitCount * CharWidth + 1; + FWidth := FAutoSizeDigitCount * CharWidth + 1; Result := Width; end; @@ -177,6 +180,13 @@ begin end; end; +procedure TSynGutterLineNumber.DoChange(Sender: TObject); +begin + if AutoSize then + FWidth := RealGutterWidth(FTextDrawer.CharWidth); + inherited DoChange(Sender); +end; + procedure TSynGutterLineNumber.Paint(Canvas : TCanvas; AClip : TRect; FirstLine, LastLine : integer); var i, iLine: integer; diff --git a/components/synedit/synguttermarks.pp b/components/synedit/synguttermarks.pp index df32717828..6831b2b7a7 100644 --- a/components/synedit/synguttermarks.pp +++ b/components/synedit/synguttermarks.pp @@ -17,6 +17,8 @@ type FFoldView: TSynEditFoldedView; FBookMarkOpt: TSynBookMarkOpt; FInternalImage: TSynInternalImage; + protected + procedure DoChange(Sender: TObject); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -33,6 +35,13 @@ uses { TSynGutterMarks } +procedure TSynGutterMarks.DoChange(Sender: TObject); +begin + if AutoSize then + FWidth := 22; + inherited DoChange(Sender); +end; + constructor TSynGutterMarks.Create(AOwner: TComponent); begin inherited Create(AOwner); @@ -40,7 +49,7 @@ begin FBookMarkOpt := TSynEdit(SynEdit).BookMarkOptions; FInternalImage := nil; - Width := 22; + FWidth := 22; end; destructor TSynGutterMarks.Destroy;