diff --git a/components/synedit/synguttermarks.pp b/components/synedit/synguttermarks.pp index 5be230f1d5..d0b55e7cb4 100644 --- a/components/synedit/synguttermarks.pp +++ b/components/synedit/synguttermarks.pp @@ -24,7 +24,7 @@ type procedure Init; override; function PreferedWidth: Integer; override; function GetImgListRes(const ACanvas: TCanvas; - const AImages: TCustomImageList): TScaledImageListResolution; + const AImages: TCustomImageList): TScaledImageListResolution; virtual; // PaintMarks: True, if it has any Mark, that is *not* a bookmark function PaintMarks(aScreenLine: Integer; Canvas : TCanvas; AClip : TRect; var aFirstCustomColumnIdx: integer): Boolean; diff --git a/ide/sourcesyneditor.pas b/ide/sourcesyneditor.pas index 944edc71a9..ae3a3e1cf7 100644 --- a/ide/sourcesyneditor.pas +++ b/ide/sourcesyneditor.pas @@ -275,6 +275,7 @@ type function CreateGutter(AOwner : TSynEditBase; ASide: TSynGutterSide; ATextDrawer: TheTextDrawer): TSynGutter; override; procedure SetHighlighter(const Value: TSynCustomHighlighter); override; + procedure FontChanged(Sender: TObject); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -436,6 +437,9 @@ type procedure CheckTextBuffer; // Todo: Add a notification, when TextBuffer Changes Procedure PaintLine(aScreenLine: Integer; Canvas : TCanvas; AClip : TRect); override; function PreferedWidth: Integer; override; + + function GetImgListRes(const ACanvas: TCanvas; + const AImages: TCustomImageList): TScaledImageListResolution; override; public destructor Destroy; override; procedure BeginSetDebugMarks; @@ -1538,6 +1542,13 @@ begin {$pop} end; +procedure TIDESynEditor.FontChanged(Sender: TObject); +begin + FLeftGutterArea.Gutter.DoAutoSize; + FRightGutterArea.Gutter.DoAutoSize; + inherited FontChanged(Sender); +end; + procedure TIDESynEditor.GetTopInfoMarkupForLine(Sender: TObject; Line: integer; var Special: boolean; aMarkup: TSynSelectedColor); begin @@ -2165,47 +2176,52 @@ end; procedure TIDESynGutter.CreateDefaultGutterParts; begin - if Side = gsLeft then begin - with TIDESynGutterMarks.Create(Parts) do - Name := 'SynGutterMarks1'; - with TSynGutterLineNumber.Create(Parts) do - Name := 'SynGutterLineNumber1'; - with TSynGutterChanges.Create(Parts) do - Name := 'SynGutterChanges1'; - with TSynGutterSeparator.Create(Parts) do - Name := 'SynGutterSeparator1'; - with TIDESynGutterCodeFolding.Create(Parts) do - Name := 'SynGutterCodeFolding1'; - end - else begin - {$IFDEF WithSynDebugGutter} - with TSynGutterSeparator.Create(Parts) do - Name := 'SynGutterSeparatorR1'; - DebugGutter := TIDESynGutterDebugHL.Create(Parts); - with DebugGutter do - Name := 'TIDESynGutterDebugHL'; - {$ENDIF} - with TSynGutterSeparator.Create(Parts) do - Name := 'SynGutterSeparatorR2'; - with TSynGutterLineOverview.Create(Parts) do begin - Name := 'SynGutterLineOverview1'; - with TIDESynGutterLOvProviderIDEMarks.Create(Providers) do - Priority := 20; - with TSynGutterLOvProviderModifiedLines.Create(Providers) do - Priority := 9; - with TSynGutterLOvProviderCurrentPage.Create(Providers) do begin - Priority := 1; - FoldedTextBuffer := TSynEditFoldedView(TIDESynEditor(Self.SynEdit).FoldedTextBuffer); + IncChangeLock; + try + if Side = gsLeft then begin + with TIDESynGutterMarks.Create(Parts) do + Name := 'SynGutterMarks1'; + with TSynGutterLineNumber.Create(Parts) do + Name := 'SynGutterLineNumber1'; + with TSynGutterChanges.Create(Parts) do + Name := 'SynGutterChanges1'; + with TSynGutterSeparator.Create(Parts) do + Name := 'SynGutterSeparator1'; + with TIDESynGutterCodeFolding.Create(Parts) do + Name := 'SynGutterCodeFolding1'; + end + else begin + {$IFDEF WithSynDebugGutter} + with TSynGutterSeparator.Create(Parts) do + Name := 'SynGutterSeparatorR1'; + DebugGutter := TIDESynGutterDebugHL.Create(Parts); + with DebugGutter do + Name := 'TIDESynGutterDebugHL'; + {$ENDIF} + with TSynGutterSeparator.Create(Parts) do + Name := 'SynGutterSeparatorR2'; + with TSynGutterLineOverview.Create(Parts) do begin + Name := 'SynGutterLineOverview1'; + with TIDESynGutterLOvProviderIDEMarks.Create(Providers) do + Priority := 20; + with TSynGutterLOvProviderModifiedLines.Create(Providers) do + Priority := 9; + with TSynGutterLOvProviderCurrentPage.Create(Providers) do begin + Priority := 1; + FoldedTextBuffer := TSynEditFoldedView(TIDESynEditor(Self.SynEdit).FoldedTextBuffer); + end; + with TIDESynGutterLOvProviderPascal.Create(Providers) do + Priority := 0; + end; + with TSynGutterSeparator.Create(Parts) do begin + Name := 'SynGutterSeparatorR3'; + AutoSize := False; + Width := 1; + LineWidth := 0; end; - with TIDESynGutterLOvProviderPascal.Create(Providers) do - Priority := 0; - end; - with TSynGutterSeparator.Create(Parts) do begin - Name := 'SynGutterSeparatorR3'; - AutoSize := False; - Width := 1; - LineWidth := 0; end; + finally + DecChangeLock; end; end; @@ -2265,10 +2281,14 @@ begin end; function TIDESynGutterMarks.PreferedWidth: Integer; +var + img: TScaledImageListResolution; begin if Assigned(SourceEditorMarks) and Assigned(SourceEditorMarks.ImgList) then - Result := SourceEditorMarks.ImgList.Width * 2 + FBookMarkOpt.LeftMargin - else + begin + img := GetImgListRes(nil, SourceEditorMarks.ImgList); + Result := SynEdit.ScaleFontTo96(img.Width * 2) + FBookMarkOpt.LeftMargin; // PreferedWidth needs width at 96 PPI + end else Result := inherited PreferedWidth; end; @@ -2300,6 +2320,43 @@ begin TSynEdit(SynEdit).InvalidateGutter; end; +function TIDESynGutterMarks.GetImgListRes(const ACanvas: TCanvas; + const AImages: TCustomImageList): TScaledImageListResolution; +const + AllowedHeights: array[0..5] of Integer = (8, 11, 16, 22, 33, 44); +var + Scale: Double; + PPI, LineHeight, I, ImageHeight: Integer; +begin + // image height must be equal to width + if AImages.Width<>AImages.Height then + raise Exception.Create('Internal error: AImages.Width<>AImages.Height'); + + Scale := 1; + PPI := 96; + if SynEdit is TSynEdit then + begin + LineHeight := TSynEdit(SynEdit).LineHeight; + ImageHeight := Low(AllowedHeights); + for I := High(AllowedHeights) downto Low(AllowedHeights) do + if AllowedHeights[I] we don't want to scale the image anymore + end else + begin + ImageHeight := AImages.Height; + if ACanvas is TControlCanvas then + PPI := TControlCanvas(ACanvas).Control.Font.PixelsPerInch; + end; + + if ACanvas is TControlCanvas then + Scale := TControlCanvas(ACanvas).Control.GetCanvasScaleFactor; + Result := AImages.ResolutionForPPI[ImageHeight, PPI, Scale]; +end; + procedure TIDESynGutterMarks.SetDebugMarks(AFirstLinePos, ALastLinePos: Integer); var i: LongInt;