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 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

View File

@ -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);