mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-23 05:19:31 +02:00
synedit: add special colors to draw line numbers on gutter to emulate delphi look (if needed)
git-svn-id: trunk@17464 -
This commit is contained in:
parent
4a42c817e5
commit
6c2ac82789
@ -519,6 +519,7 @@ type
|
||||
function GetCaretY : Integer;
|
||||
function GetHighlightAllColor : TSynSelectedColor;
|
||||
function GetIncrementColor : TSynSelectedColor;
|
||||
function GetLineNumberColor: TSynSelectedColor;
|
||||
function GetSelectedColor : TSynSelectedColor;
|
||||
function GetBracketMatchColor : TSynSelectedColor;
|
||||
function GetMouseLinkColor : TSynSelectedColor;
|
||||
@ -976,6 +977,7 @@ type
|
||||
property HighlightAllColor: TSynSelectedColor read GetHighlightAllColor;
|
||||
property BracketMatchColor: TSynSelectedColor read GetBracketMatchColor;
|
||||
property MouseLinkColor: TSynSelectedColor read GetMouseLinkColor;
|
||||
property LineNumberColor: TSynSelectedColor read GetLineNumberColor;
|
||||
//property Color: TSynSelectedColor read GetSelectedColor;
|
||||
{$ELSE}
|
||||
property SelectedColor: TSynSelectedColor
|
||||
@ -1117,6 +1119,7 @@ type
|
||||
property HighlightAllColor;
|
||||
property BracketMatchColor;
|
||||
property MouseLinkColor;
|
||||
property LineNumberColor;
|
||||
{$ENDIF}
|
||||
property SelectionMode;
|
||||
property TabWidth;
|
||||
@ -1789,6 +1792,11 @@ begin
|
||||
result := fMarkupSelection.MarkupInfoIncr;
|
||||
end;
|
||||
|
||||
function TCustomSynEdit.GetLineNumberColor: TSynSelectedColor;
|
||||
begin
|
||||
Result := fGutter.MarkupInfoLineNumber;
|
||||
end;
|
||||
|
||||
function TCustomSynEdit.GetSelectedColor : TSynSelectedColor;
|
||||
begin
|
||||
result := fMarkupSelection.MarkupInfoSeletion;
|
||||
@ -3151,22 +3159,28 @@ begin
|
||||
else
|
||||
CodeFoldOffset:=0;
|
||||
{$ENDIF}
|
||||
if fGutter.ShowLineNumbers then begin
|
||||
if fGutter.ShowLineNumbers then
|
||||
begin
|
||||
fTextDrawer.BeginDrawing(dc);
|
||||
try
|
||||
fTextDrawer.SetBackColor(fGutter.Color);
|
||||
fTextDrawer.SetForeColor(Self.Font.Color);
|
||||
if fGutter.UseFontStyle then
|
||||
fTextDrawer.Style := Font.Style
|
||||
if FGutter.MarkupInfoLineNumber.Background <> clNone then
|
||||
fTextDrawer.SetBackColor(FGutter.MarkupInfoLineNumber.Background)
|
||||
else
|
||||
fTextDrawer.Style := [];
|
||||
fTextDrawer.SetBackColor(FGutter.Color);
|
||||
if FGutter.MarkupInfoLineNumber.Foreground <> clNone then
|
||||
fTextDrawer.SetForeColor(FGutter.MarkupInfoLineNumber.Foreground)
|
||||
else
|
||||
fTextDrawer.SetForeColor(Self.Font.Color);
|
||||
fTextDrawer.Style := FGutter.MarkupInfoLineNumber.Style;
|
||||
// prepare the rect initially
|
||||
rcLine := AClip;
|
||||
rcLine.Right := fGutterWidth - 2;
|
||||
//rcLine.Right := Max(rcLine.Right, fGutterWidth - 2);
|
||||
{$IFDEF SYN_LAZARUS}
|
||||
rcLine.Bottom := FirstLine * fTextHeight;
|
||||
for i := FirstLine to LastLine do begin
|
||||
rcLine.Left := CodeFoldOffset + fGutter.LeftOffset;
|
||||
for i := FirstLine to LastLine do
|
||||
begin
|
||||
iLine := fTextView.DisplayNumber[i];
|
||||
// next line rect
|
||||
rcLine.Top := rcLine.Bottom;
|
||||
@ -3179,8 +3193,8 @@ begin
|
||||
s := fGutter.FormatLineNumber(iLine, ShowDot);
|
||||
Inc(rcLine.Bottom, fTextHeight);
|
||||
// erase the background and draw the line number string in one go
|
||||
fTextDrawer.ExtTextOut(CodeFoldOffset+fGutter.LeftOffset,
|
||||
rcLine.Top, ETO_OPAQUE,rcLine,PChar(Pointer(S)),Length(S));
|
||||
fTextDrawer.ExtTextOut(rcLine.Left, rcLine.Top, ETO_OPAQUE, rcLine,
|
||||
PChar(Pointer(S)),Length(S));
|
||||
end;
|
||||
{$ELSE}
|
||||
rcLine.Bottom := (FirstLine - TopLine) * fTextHeight;
|
||||
@ -3195,18 +3209,30 @@ begin
|
||||
end;
|
||||
{$ENDIF}
|
||||
// now erase the remaining area if any
|
||||
if AClip.Bottom > rcLine.Bottom then begin
|
||||
if AClip.Bottom > rcLine.Bottom then
|
||||
begin
|
||||
rcLine.Top := rcLine.Bottom;
|
||||
rcLine.Bottom := AClip.Bottom;
|
||||
with rcLine do
|
||||
fTextDrawer.ExtTextOut(Left, Top, ETO_OPAQUE, rcLine, nil, 0);
|
||||
end;
|
||||
// restore original style
|
||||
fTextDrawer.SetBackColor(fGutter.Color);
|
||||
fTextDrawer.SetForeColor(Self.Font.Color);
|
||||
if AClip.Left < rcLine.Left then
|
||||
begin
|
||||
rcLine.Right := rcLine.Left;
|
||||
rcLine.Left := AClip.Left;
|
||||
rcLine.Top := AClip.Top;
|
||||
rcLine.Bottom := AClip.Bottom;
|
||||
with rcLine do
|
||||
fTextDrawer.ExtTextOut(Left, Top, ETO_OPAQUE, rcLine, nil, 0);
|
||||
end;
|
||||
finally
|
||||
fTextDrawer.EndDrawing;
|
||||
end;
|
||||
end else begin
|
||||
end else
|
||||
InternalFillRect(dc, AClip);
|
||||
end;
|
||||
|
||||
//draw the code folding marks
|
||||
if fGutter.ShowCodeFolding then
|
||||
|
@ -95,6 +95,7 @@ type
|
||||
FCodeFoldingWidth: integer;
|
||||
fShowCodeFolding: boolean;
|
||||
FShowOnlyLineNumbersMultiplesOf: integer;
|
||||
FMarkupInfoLineNumber: TSynSelectedColor;
|
||||
{$ENDIF}
|
||||
fColor: TColor;
|
||||
fWidth: integer;
|
||||
@ -107,7 +108,6 @@ type
|
||||
fOnChange: TNotifyEvent;
|
||||
fCursor: TCursor;
|
||||
fVisible: boolean;
|
||||
fUseFontStyle: boolean;
|
||||
fAutoSize: boolean;
|
||||
fAutoSizeDigitCount: integer;
|
||||
procedure SetAutoSize(const Value: boolean);
|
||||
@ -122,12 +122,13 @@ type
|
||||
procedure SetLeftOffset(Value: integer);
|
||||
procedure SetRightOffset(Value: integer);
|
||||
procedure SetShowLineNumbers(const Value: boolean);
|
||||
procedure SetUseFontStyle(Value: boolean);
|
||||
procedure SetVisible(Value: boolean);
|
||||
procedure SetWidth(Value: integer);
|
||||
procedure SetZeroStart(const Value: boolean);
|
||||
procedure DoChange(Sender: TObject);
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
procedure Assign(Source: TPersistent); override;
|
||||
procedure AutoSizeDigitCount(LinesCount: integer);
|
||||
function FormatLineNumber(Line: integer; IsDot: boolean): string;
|
||||
@ -149,8 +150,6 @@ type
|
||||
default 2;
|
||||
property ShowLineNumbers: boolean read fShowLineNumbers
|
||||
write SetShowLineNumbers default FALSE;
|
||||
property UseFontStyle: boolean read fUseFontStyle write SetUseFontStyle
|
||||
default FALSE;
|
||||
property Visible: boolean read fVisible write SetVisible default TRUE;
|
||||
property Width: integer read fWidth write SetWidth default 30;
|
||||
property ZeroStart: boolean read fZeroStart write SetZeroStart default FALSE;
|
||||
@ -164,6 +163,7 @@ type
|
||||
default 14;
|
||||
property ShowOnlyLineNumbersMultiplesOf: integer read FShowOnlyLineNumbersMultiplesOf
|
||||
write SetShowOnlyLineNumbersMultiplesOf default 1;
|
||||
property MarkupInfoLineNumber: TSynSelectedColor read FMarkupInfoLineNumber;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
@ -387,13 +387,24 @@ begin
|
||||
fRightOffset := 2;
|
||||
fShowOnlyLineNumbersMultiplesOf := 1;
|
||||
fCodeFoldingWidth := 14;
|
||||
FMarkupInfoLineNumber := TSynSelectedColor.Create;
|
||||
FMarkupInfoLineNumber.Background := clNone;
|
||||
FMarkupInfoLineNumber.Foreground := clNone;
|
||||
FMarkupInfoLineNumber.OnChange := @DoChange;
|
||||
end;
|
||||
|
||||
destructor TSynGutter.Destroy;
|
||||
begin
|
||||
FMarkupInfoLineNumber.Free;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.Assign(Source: TPersistent);
|
||||
var
|
||||
Src: TSynGutter;
|
||||
begin
|
||||
if Assigned(Source) and (Source is TSynGutter) then begin
|
||||
if Assigned(Source) and (Source is TSynGutter) then
|
||||
begin
|
||||
Src := TSynGutter(Source);
|
||||
fColor := Src.fColor;
|
||||
fVisible := Src.fVisible;
|
||||
@ -410,8 +421,9 @@ begin
|
||||
FCodeFoldingWidth := Src.FCodeFoldingWidth;
|
||||
fShowCodeFolding := Src.fShowCodeFolding;
|
||||
FShowOnlyLineNumbersMultiplesOf := Src.FShowOnlyLineNumbersMultiplesOf;
|
||||
FMarkupInfoLineNumber.Assign(Src.MarkupInfoLineNumber);
|
||||
{$ENDIF}
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end else
|
||||
inherited;
|
||||
end;
|
||||
@ -420,12 +432,14 @@ procedure TSynGutter.AutoSizeDigitCount(LinesCount: integer);
|
||||
var
|
||||
nDigits: integer;
|
||||
begin
|
||||
if fVisible and fAutoSize and fShowLineNumbers then begin
|
||||
if fVisible and fAutoSize and fShowLineNumbers then
|
||||
begin
|
||||
if fZeroStart then Dec(LinesCount);
|
||||
nDigits := Max(Length(IntToStr(LinesCount)), fDigitCount);
|
||||
if fAutoSizeDigitCount <> nDigits then begin
|
||||
if fAutoSizeDigitCount <> nDigits then
|
||||
begin
|
||||
fAutoSizeDigitCount := nDigits;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end else
|
||||
fAutoSizeDigitCount := fDigitCount;
|
||||
@ -473,9 +487,10 @@ end;
|
||||
|
||||
procedure TSynGutter.SetAutoSize(const Value: boolean);
|
||||
begin
|
||||
if fAutoSize <> Value then begin
|
||||
if fAutoSize <> Value then
|
||||
begin
|
||||
fAutoSize := Value;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -484,111 +499,120 @@ procedure TSynGutter.SetCodeFoldingWidth(const AValue: integer);
|
||||
begin
|
||||
if FCodeFoldingWidth=AValue then exit;
|
||||
FCodeFoldingWidth:=AValue;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
procedure TSynGutter.SetColor(const Value: TColor);
|
||||
begin
|
||||
if fColor <> Value then begin
|
||||
if fColor <> Value then
|
||||
begin
|
||||
fColor := Value;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.SetDigitCount(Value: integer);
|
||||
begin
|
||||
Value := MinMax(Value, 2, 12);
|
||||
if fDigitCount <> Value then begin
|
||||
if fDigitCount <> Value then
|
||||
begin
|
||||
fDigitCount := Value;
|
||||
fAutoSizeDigitCount := fDigitCount;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.SetLeadingZeros(const Value: boolean);
|
||||
begin
|
||||
if fLeadingZeros <> Value then begin
|
||||
if fLeadingZeros <> Value then
|
||||
begin
|
||||
fLeadingZeros := Value;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.SetLeftOffset(Value: integer);
|
||||
begin
|
||||
Value := Max(0, Value);
|
||||
if fLeftOffset <> Value then begin
|
||||
if fLeftOffset <> Value then
|
||||
begin
|
||||
fLeftOffset := Value;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.SetRightOffset(Value: integer);
|
||||
begin
|
||||
Value := Max(0, Value);
|
||||
if fRightOffset <> Value then begin
|
||||
if fRightOffset <> Value then
|
||||
begin
|
||||
fRightOffset := Value;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.SetShowOnlyLineNumbersMultiplesOf(const AValue: integer);
|
||||
begin
|
||||
if FShowOnlyLineNumbersMultiplesOf <> AValue then begin
|
||||
if FShowOnlyLineNumbersMultiplesOf <> AValue then
|
||||
begin
|
||||
FShowOnlyLineNumbersMultiplesOf := AValue;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.SetShowLineNumbers(const Value: boolean);
|
||||
begin
|
||||
if fShowLineNumbers <> Value then begin
|
||||
if fShowLineNumbers <> Value then
|
||||
begin
|
||||
fShowLineNumbers := Value;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.SetShowCodeFolding(const Value: boolean);
|
||||
begin
|
||||
if fShowCodeFolding <> Value then begin
|
||||
if fShowCodeFolding <> Value then
|
||||
begin
|
||||
fShowCodeFolding := Value;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.SetUseFontStyle(Value: boolean);
|
||||
begin
|
||||
if fUseFontStyle <> Value then begin
|
||||
fUseFontStyle := Value;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.SetVisible(Value: boolean);
|
||||
begin
|
||||
if fVisible <> Value then begin
|
||||
if fVisible <> Value then
|
||||
begin
|
||||
fVisible := Value;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.SetWidth(Value: integer);
|
||||
begin
|
||||
Value := Max(0, Value);
|
||||
if fWidth <> Value then begin
|
||||
if fWidth <> Value then
|
||||
begin
|
||||
fWidth := Value;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.SetZeroStart(const Value: boolean);
|
||||
begin
|
||||
if fZeroStart <> Value then begin
|
||||
if fZeroStart <> Value then
|
||||
begin
|
||||
fZeroStart := Value;
|
||||
if Assigned(fOnChange) then fOnChange(Self);
|
||||
DoChange(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSynGutter.DoChange(Sender: TObject);
|
||||
begin
|
||||
if Assigned(fOnChange) then
|
||||
fOnChange(Self);
|
||||
end;
|
||||
|
||||
{ TSynBookMarkOpt }
|
||||
|
||||
constructor TSynBookMarkOpt.Create(AOwner: TComponent);
|
||||
|
Loading…
Reference in New Issue
Block a user