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:
paul 2008-11-20 07:47:18 +00:00
parent 4a42c817e5
commit 6c2ac82789
2 changed files with 104 additions and 54 deletions

View File

@ -519,6 +519,7 @@ type
function GetCaretY : Integer; function GetCaretY : Integer;
function GetHighlightAllColor : TSynSelectedColor; function GetHighlightAllColor : TSynSelectedColor;
function GetIncrementColor : TSynSelectedColor; function GetIncrementColor : TSynSelectedColor;
function GetLineNumberColor: TSynSelectedColor;
function GetSelectedColor : TSynSelectedColor; function GetSelectedColor : TSynSelectedColor;
function GetBracketMatchColor : TSynSelectedColor; function GetBracketMatchColor : TSynSelectedColor;
function GetMouseLinkColor : TSynSelectedColor; function GetMouseLinkColor : TSynSelectedColor;
@ -976,6 +977,7 @@ type
property HighlightAllColor: TSynSelectedColor read GetHighlightAllColor; property HighlightAllColor: TSynSelectedColor read GetHighlightAllColor;
property BracketMatchColor: TSynSelectedColor read GetBracketMatchColor; property BracketMatchColor: TSynSelectedColor read GetBracketMatchColor;
property MouseLinkColor: TSynSelectedColor read GetMouseLinkColor; property MouseLinkColor: TSynSelectedColor read GetMouseLinkColor;
property LineNumberColor: TSynSelectedColor read GetLineNumberColor;
//property Color: TSynSelectedColor read GetSelectedColor; //property Color: TSynSelectedColor read GetSelectedColor;
{$ELSE} {$ELSE}
property SelectedColor: TSynSelectedColor property SelectedColor: TSynSelectedColor
@ -1117,6 +1119,7 @@ type
property HighlightAllColor; property HighlightAllColor;
property BracketMatchColor; property BracketMatchColor;
property MouseLinkColor; property MouseLinkColor;
property LineNumberColor;
{$ENDIF} {$ENDIF}
property SelectionMode; property SelectionMode;
property TabWidth; property TabWidth;
@ -1789,6 +1792,11 @@ begin
result := fMarkupSelection.MarkupInfoIncr; result := fMarkupSelection.MarkupInfoIncr;
end; end;
function TCustomSynEdit.GetLineNumberColor: TSynSelectedColor;
begin
Result := fGutter.MarkupInfoLineNumber;
end;
function TCustomSynEdit.GetSelectedColor : TSynSelectedColor; function TCustomSynEdit.GetSelectedColor : TSynSelectedColor;
begin begin
result := fMarkupSelection.MarkupInfoSeletion; result := fMarkupSelection.MarkupInfoSeletion;
@ -3151,22 +3159,28 @@ begin
else else
CodeFoldOffset:=0; CodeFoldOffset:=0;
{$ENDIF} {$ENDIF}
if fGutter.ShowLineNumbers then begin if fGutter.ShowLineNumbers then
begin
fTextDrawer.BeginDrawing(dc); fTextDrawer.BeginDrawing(dc);
try try
fTextDrawer.SetBackColor(fGutter.Color); if FGutter.MarkupInfoLineNumber.Background <> clNone then
fTextDrawer.SetForeColor(Self.Font.Color); fTextDrawer.SetBackColor(FGutter.MarkupInfoLineNumber.Background)
if fGutter.UseFontStyle then
fTextDrawer.Style := Font.Style
else 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 // prepare the rect initially
rcLine := AClip; rcLine := AClip;
rcLine.Right := fGutterWidth - 2; rcLine.Right := fGutterWidth - 2;
//rcLine.Right := Max(rcLine.Right, fGutterWidth - 2); //rcLine.Right := Max(rcLine.Right, fGutterWidth - 2);
{$IFDEF SYN_LAZARUS} {$IFDEF SYN_LAZARUS}
rcLine.Bottom := FirstLine * fTextHeight; 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]; iLine := fTextView.DisplayNumber[i];
// next line rect // next line rect
rcLine.Top := rcLine.Bottom; rcLine.Top := rcLine.Bottom;
@ -3179,8 +3193,8 @@ begin
s := fGutter.FormatLineNumber(iLine, ShowDot); s := fGutter.FormatLineNumber(iLine, ShowDot);
Inc(rcLine.Bottom, fTextHeight); Inc(rcLine.Bottom, fTextHeight);
// erase the background and draw the line number string in one go // erase the background and draw the line number string in one go
fTextDrawer.ExtTextOut(CodeFoldOffset+fGutter.LeftOffset, fTextDrawer.ExtTextOut(rcLine.Left, rcLine.Top, ETO_OPAQUE, rcLine,
rcLine.Top, ETO_OPAQUE,rcLine,PChar(Pointer(S)),Length(S)); PChar(Pointer(S)),Length(S));
end; end;
{$ELSE} {$ELSE}
rcLine.Bottom := (FirstLine - TopLine) * fTextHeight; rcLine.Bottom := (FirstLine - TopLine) * fTextHeight;
@ -3195,18 +3209,30 @@ begin
end; end;
{$ENDIF} {$ENDIF}
// now erase the remaining area if any // 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.Top := rcLine.Bottom;
rcLine.Bottom := AClip.Bottom; rcLine.Bottom := AClip.Bottom;
with rcLine do with rcLine do
fTextDrawer.ExtTextOut(Left, Top, ETO_OPAQUE, rcLine, nil, 0); fTextDrawer.ExtTextOut(Left, Top, ETO_OPAQUE, rcLine, nil, 0);
end; 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 finally
fTextDrawer.EndDrawing; fTextDrawer.EndDrawing;
end; end;
end else begin end else
InternalFillRect(dc, AClip); InternalFillRect(dc, AClip);
end;
//draw the code folding marks //draw the code folding marks
if fGutter.ShowCodeFolding then if fGutter.ShowCodeFolding then

View File

@ -95,6 +95,7 @@ type
FCodeFoldingWidth: integer; FCodeFoldingWidth: integer;
fShowCodeFolding: boolean; fShowCodeFolding: boolean;
FShowOnlyLineNumbersMultiplesOf: integer; FShowOnlyLineNumbersMultiplesOf: integer;
FMarkupInfoLineNumber: TSynSelectedColor;
{$ENDIF} {$ENDIF}
fColor: TColor; fColor: TColor;
fWidth: integer; fWidth: integer;
@ -107,7 +108,6 @@ type
fOnChange: TNotifyEvent; fOnChange: TNotifyEvent;
fCursor: TCursor; fCursor: TCursor;
fVisible: boolean; fVisible: boolean;
fUseFontStyle: boolean;
fAutoSize: boolean; fAutoSize: boolean;
fAutoSizeDigitCount: integer; fAutoSizeDigitCount: integer;
procedure SetAutoSize(const Value: boolean); procedure SetAutoSize(const Value: boolean);
@ -122,12 +122,13 @@ type
procedure SetLeftOffset(Value: integer); procedure SetLeftOffset(Value: integer);
procedure SetRightOffset(Value: integer); procedure SetRightOffset(Value: integer);
procedure SetShowLineNumbers(const Value: boolean); procedure SetShowLineNumbers(const Value: boolean);
procedure SetUseFontStyle(Value: boolean);
procedure SetVisible(Value: boolean); procedure SetVisible(Value: boolean);
procedure SetWidth(Value: integer); procedure SetWidth(Value: integer);
procedure SetZeroStart(const Value: boolean); procedure SetZeroStart(const Value: boolean);
procedure DoChange(Sender: TObject);
public public
constructor Create; constructor Create;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override; procedure Assign(Source: TPersistent); override;
procedure AutoSizeDigitCount(LinesCount: integer); procedure AutoSizeDigitCount(LinesCount: integer);
function FormatLineNumber(Line: integer; IsDot: boolean): string; function FormatLineNumber(Line: integer; IsDot: boolean): string;
@ -149,8 +150,6 @@ type
default 2; default 2;
property ShowLineNumbers: boolean read fShowLineNumbers property ShowLineNumbers: boolean read fShowLineNumbers
write SetShowLineNumbers default FALSE; write SetShowLineNumbers default FALSE;
property UseFontStyle: boolean read fUseFontStyle write SetUseFontStyle
default FALSE;
property Visible: boolean read fVisible write SetVisible default TRUE; property Visible: boolean read fVisible write SetVisible default TRUE;
property Width: integer read fWidth write SetWidth default 30; property Width: integer read fWidth write SetWidth default 30;
property ZeroStart: boolean read fZeroStart write SetZeroStart default FALSE; property ZeroStart: boolean read fZeroStart write SetZeroStart default FALSE;
@ -164,6 +163,7 @@ type
default 14; default 14;
property ShowOnlyLineNumbersMultiplesOf: integer read FShowOnlyLineNumbersMultiplesOf property ShowOnlyLineNumbersMultiplesOf: integer read FShowOnlyLineNumbersMultiplesOf
write SetShowOnlyLineNumbersMultiplesOf default 1; write SetShowOnlyLineNumbersMultiplesOf default 1;
property MarkupInfoLineNumber: TSynSelectedColor read FMarkupInfoLineNumber;
{$ENDIF} {$ENDIF}
end; end;
@ -387,13 +387,24 @@ begin
fRightOffset := 2; fRightOffset := 2;
fShowOnlyLineNumbersMultiplesOf := 1; fShowOnlyLineNumbersMultiplesOf := 1;
fCodeFoldingWidth := 14; fCodeFoldingWidth := 14;
FMarkupInfoLineNumber := TSynSelectedColor.Create;
FMarkupInfoLineNumber.Background := clNone;
FMarkupInfoLineNumber.Foreground := clNone;
FMarkupInfoLineNumber.OnChange := @DoChange;
end;
destructor TSynGutter.Destroy;
begin
FMarkupInfoLineNumber.Free;
inherited Destroy;
end; end;
procedure TSynGutter.Assign(Source: TPersistent); procedure TSynGutter.Assign(Source: TPersistent);
var var
Src: TSynGutter; Src: TSynGutter;
begin begin
if Assigned(Source) and (Source is TSynGutter) then begin if Assigned(Source) and (Source is TSynGutter) then
begin
Src := TSynGutter(Source); Src := TSynGutter(Source);
fColor := Src.fColor; fColor := Src.fColor;
fVisible := Src.fVisible; fVisible := Src.fVisible;
@ -410,8 +421,9 @@ begin
FCodeFoldingWidth := Src.FCodeFoldingWidth; FCodeFoldingWidth := Src.FCodeFoldingWidth;
fShowCodeFolding := Src.fShowCodeFolding; fShowCodeFolding := Src.fShowCodeFolding;
FShowOnlyLineNumbersMultiplesOf := Src.FShowOnlyLineNumbersMultiplesOf; FShowOnlyLineNumbersMultiplesOf := Src.FShowOnlyLineNumbersMultiplesOf;
FMarkupInfoLineNumber.Assign(Src.MarkupInfoLineNumber);
{$ENDIF} {$ENDIF}
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end else end else
inherited; inherited;
end; end;
@ -420,12 +432,14 @@ procedure TSynGutter.AutoSizeDigitCount(LinesCount: integer);
var var
nDigits: integer; nDigits: integer;
begin begin
if fVisible and fAutoSize and fShowLineNumbers then begin if fVisible and fAutoSize and fShowLineNumbers then
begin
if fZeroStart then Dec(LinesCount); if fZeroStart then Dec(LinesCount);
nDigits := Max(Length(IntToStr(LinesCount)), fDigitCount); nDigits := Max(Length(IntToStr(LinesCount)), fDigitCount);
if fAutoSizeDigitCount <> nDigits then begin if fAutoSizeDigitCount <> nDigits then
begin
fAutoSizeDigitCount := nDigits; fAutoSizeDigitCount := nDigits;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end else end else
fAutoSizeDigitCount := fDigitCount; fAutoSizeDigitCount := fDigitCount;
@ -473,9 +487,10 @@ end;
procedure TSynGutter.SetAutoSize(const Value: boolean); procedure TSynGutter.SetAutoSize(const Value: boolean);
begin begin
if fAutoSize <> Value then begin if fAutoSize <> Value then
begin
fAutoSize := Value; fAutoSize := Value;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end; end;
@ -484,111 +499,120 @@ procedure TSynGutter.SetCodeFoldingWidth(const AValue: integer);
begin begin
if FCodeFoldingWidth=AValue then exit; if FCodeFoldingWidth=AValue then exit;
FCodeFoldingWidth:=AValue; FCodeFoldingWidth:=AValue;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
{$ENDIF} {$ENDIF}
procedure TSynGutter.SetColor(const Value: TColor); procedure TSynGutter.SetColor(const Value: TColor);
begin begin
if fColor <> Value then begin if fColor <> Value then
begin
fColor := Value; fColor := Value;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end; end;
procedure TSynGutter.SetDigitCount(Value: integer); procedure TSynGutter.SetDigitCount(Value: integer);
begin begin
Value := MinMax(Value, 2, 12); Value := MinMax(Value, 2, 12);
if fDigitCount <> Value then begin if fDigitCount <> Value then
begin
fDigitCount := Value; fDigitCount := Value;
fAutoSizeDigitCount := fDigitCount; fAutoSizeDigitCount := fDigitCount;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end; end;
procedure TSynGutter.SetLeadingZeros(const Value: boolean); procedure TSynGutter.SetLeadingZeros(const Value: boolean);
begin begin
if fLeadingZeros <> Value then begin if fLeadingZeros <> Value then
begin
fLeadingZeros := Value; fLeadingZeros := Value;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end; end;
procedure TSynGutter.SetLeftOffset(Value: integer); procedure TSynGutter.SetLeftOffset(Value: integer);
begin begin
Value := Max(0, Value); Value := Max(0, Value);
if fLeftOffset <> Value then begin if fLeftOffset <> Value then
begin
fLeftOffset := Value; fLeftOffset := Value;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end; end;
procedure TSynGutter.SetRightOffset(Value: integer); procedure TSynGutter.SetRightOffset(Value: integer);
begin begin
Value := Max(0, Value); Value := Max(0, Value);
if fRightOffset <> Value then begin if fRightOffset <> Value then
begin
fRightOffset := Value; fRightOffset := Value;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end; end;
procedure TSynGutter.SetShowOnlyLineNumbersMultiplesOf(const AValue: integer); procedure TSynGutter.SetShowOnlyLineNumbersMultiplesOf(const AValue: integer);
begin begin
if FShowOnlyLineNumbersMultiplesOf <> AValue then begin if FShowOnlyLineNumbersMultiplesOf <> AValue then
begin
FShowOnlyLineNumbersMultiplesOf := AValue; FShowOnlyLineNumbersMultiplesOf := AValue;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end; end;
procedure TSynGutter.SetShowLineNumbers(const Value: boolean); procedure TSynGutter.SetShowLineNumbers(const Value: boolean);
begin begin
if fShowLineNumbers <> Value then begin if fShowLineNumbers <> Value then
begin
fShowLineNumbers := Value; fShowLineNumbers := Value;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end; end;
procedure TSynGutter.SetShowCodeFolding(const Value: boolean); procedure TSynGutter.SetShowCodeFolding(const Value: boolean);
begin begin
if fShowCodeFolding <> Value then begin if fShowCodeFolding <> Value then
begin
fShowCodeFolding := Value; fShowCodeFolding := Value;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end;
end;
procedure TSynGutter.SetUseFontStyle(Value: boolean);
begin
if fUseFontStyle <> Value then begin
fUseFontStyle := Value;
if Assigned(fOnChange) then fOnChange(Self);
end; end;
end; end;
procedure TSynGutter.SetVisible(Value: boolean); procedure TSynGutter.SetVisible(Value: boolean);
begin begin
if fVisible <> Value then begin if fVisible <> Value then
begin
fVisible := Value; fVisible := Value;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end; end;
procedure TSynGutter.SetWidth(Value: integer); procedure TSynGutter.SetWidth(Value: integer);
begin begin
Value := Max(0, Value); Value := Max(0, Value);
if fWidth <> Value then begin if fWidth <> Value then
begin
fWidth := Value; fWidth := Value;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end; end;
procedure TSynGutter.SetZeroStart(const Value: boolean); procedure TSynGutter.SetZeroStart(const Value: boolean);
begin begin
if fZeroStart <> Value then begin if fZeroStart <> Value then
begin
fZeroStart := Value; fZeroStart := Value;
if Assigned(fOnChange) then fOnChange(Self); DoChange(Self);
end; end;
end; end;
procedure TSynGutter.DoChange(Sender: TObject);
begin
if Assigned(fOnChange) then
fOnChange(Self);
end;
{ TSynBookMarkOpt } { TSynBookMarkOpt }
constructor TSynBookMarkOpt.Create(AOwner: TComponent); constructor TSynBookMarkOpt.Create(AOwner: TComponent);