📄 synedithighlighter.pas
字号:
bChanged := TRUE;
end;
if bChanged then
Changed;
end;
procedure TSynHighlighterAttributes.Changed;
begin
if Assigned(fOnChange) then
fOnChange(Self);
end;
constructor TSynHighlighterAttributes.Create(attribName: string);
begin
inherited Create;
Background := clNone;
Foreground := clNone;
fName := attribName;
end;
function TSynHighlighterAttributes.GetBackgroundColorStored: boolean;
begin
Result := fBackground <> fBackgroundDefault;
end;
function TSynHighlighterAttributes.GetForegroundColorStored: boolean;
begin
Result := fForeground <> fForegroundDefault;
end;
function TSynHighlighterAttributes.GetFontStyleStored: boolean;
begin
Result := fStyle <> fStyleDefault;
end;
procedure TSynHighlighterAttributes.InternalSaveDefaultValues;
begin
fForegroundDefault := fForeground;
fBackgroundDefault := fBackground;
fStyleDefault := fStyle;
end;
{$IFNDEF SYN_CLX}
function TSynHighlighterAttributes.LoadFromBorlandRegistry(rootKey: HKEY;
attrKey, attrName: string; oldStyle: boolean): boolean;
// How the highlighting information is stored:
// Delphi 1.0:
// I don't know and I don't care.
// Delphi 2.0 & 3.0:
// In the registry branch HKCU\Software\Borland\Delphi\x.0\Highlight
// where x=2 or x=3.
// Each entry is one string value, encoded as
// <foreground RGB>,<background RGB>,<font style>,<default fg>,<default Background>,<fg index>,<Background index>
// Example:
// 0,16777215,BI,0,1,0,15
// foreground color (RGB): 0
// background color (RGB): 16777215 ($FFFFFF)
// font style: BI (bold italic), possible flags: B(old), I(talic), U(nderline)
// default foreground: no, specified color will be used (black (0) is used when this flag is 1)
// default background: yes, white ($FFFFFF, 15) will be used for background
// foreground index: 0 (foreground index (Pal16), corresponds to foreground RGB color)
// background index: 15 (background index (Pal16), corresponds to background RGB color)
// Delphi 4.0 & 5.0:
// In the registry branch HKCU\Software\Borland\Delphi\4.0\Editor\Highlight.
// Each entry is subkey containing several values:
// Foreground Color: foreground index (Pal16), 0..15 (dword)
// Background Color: background index (Pal16), 0..15 (dword)
// Bold: fsBold yes/no, 0/True (string)
// Italic: fsItalic yes/no, 0/True (string)
// Underline: fsUnderline yes/no, 0/True (string)
// Default Foreground: use default foreground (clBlack) yes/no, False/-1 (string)
// Default Background: use default backround (clWhite) yes/no, False/-1 (string)
const
Pal16: array [0..15] of TColor = (clBlack, clMaroon, clGreen, clOlive,
clNavy, clPurple, clTeal, clLtGray, clDkGray, clRed, clLime,
clYellow, clBlue, clFuchsia, clAqua, clWhite);
function LoadOldStyle(rootKey: HKEY; attrKey, attrName: string): boolean;
var
descript : string;
fgColRGB : string;
bgColRGB : string;
fontStyle: string;
fgDefault: string;
bgDefault: string;
fgIndex16: string;
bgIndex16: string;
reg : TBetterRegistry;
function Get(var name: string): string;
var
p: integer;
begin
p := Pos(',',name);
if p = 0 then p := Length(name)+1;
Result := Copy(name,1,p-1);
name := Copy(name,p+1,Length(name)-p);
end; { Get }
begin { LoadOldStyle }
Result := false;
try
reg := TBetterRegistry.Create;
reg.RootKey := rootKey;
try
with reg do begin
if OpenKeyReadOnly(attrKey) then begin
try
if ValueExists(attrName) then begin
descript := ReadString(attrName);
fgColRGB := Get(descript);
bgColRGB := Get(descript);
fontStyle := Get(descript);
fgDefault := Get(descript);
bgDefault := Get(descript);
fgIndex16 := Get(descript);
bgIndex16 := Get(descript);
if bgDefault = '1'
then Background := clWindow
else Background := Pal16[StrToInt(bgIndex16)];
if fgDefault = '1'
then Foreground := clWindowText
else Foreground := Pal16[StrToInt(fgIndex16)];
Style := [];
if Pos('B',fontStyle) > 0 then Style := Style + [fsBold];
if Pos('I',fontStyle) > 0 then Style := Style + [fsItalic];
if Pos('U',fontStyle) > 0 then Style := Style + [fsUnderline];
Result := true;
end;
finally CloseKey; end;
end; // if
end; // with
finally reg.Free; end;
except end;
end; { LoadOldStyle }
function LoadNewStyle(rootKey: HKEY; attrKey, attrName: string): boolean;
var
fgColor : integer;
bgColor : integer;
fontBold : string;
fontItalic : string;
fontUnderline: string;
fgDefault : string;
bgDefault : string;
reg : TBetterRegistry;
function IsTrue(value: string): boolean;
begin
Result := not ((UpperCase(value) = 'FALSE') or (value = '0'));
end; { IsTrue }
begin
Result := false;
try
reg := TBetterRegistry.Create;
reg.RootKey := rootKey;
try
with reg do begin
if OpenKeyReadOnly(attrKey+'\'+attrName) then begin
try
if ValueExists('Foreground Color')
then fgColor := Pal16[ReadInteger('Foreground Color')]
else if ValueExists('Foreground Color New') then
fgColor := StringToColor( ReadString('Foreground Color New') )
else
Exit;
if ValueExists('Background Color')
then bgColor := Pal16[ReadInteger('Background Color')]
else if ValueExists('Background Color New') then
bgColor := StringToColor( ReadString('Background Color New') )
else
Exit;
if ValueExists('Bold')
then fontBold := ReadString('Bold')
else Exit;
if ValueExists('Italic')
then fontItalic := ReadString('Italic')
else Exit;
if ValueExists('Underline')
then fontUnderline := ReadString('Underline')
else Exit;
if ValueExists('Default Foreground')
then fgDefault := ReadString('Default Foreground')
else Exit;
if ValueExists('Default Background')
then bgDefault := ReadString('Default Background')
else Exit;
if IsTrue(bgDefault)
then Background := clWindow
else Background := bgColor;
if IsTrue(fgDefault)
then Foreground := clWindowText
else Foreground := fgColor;
Style := [];
if IsTrue(fontBold) then Style := Style + [fsBold];
if IsTrue(fontItalic) then Style := Style + [fsItalic];
if IsTrue(fontUnderline) then Style := Style + [fsUnderline];
Result := true;
finally CloseKey; end;
end; // if
end; // with
finally reg.Free; end;
except end;
end; { LoadNewStyle }
begin
if oldStyle then Result := LoadOldStyle(rootKey, attrKey, attrName)
else Result := LoadNewStyle(rootKey, attrKey, attrName);
end; { TSynHighlighterAttributes.LoadFromBorlandRegistry }
{$ENDIF}
procedure TSynHighlighterAttributes.SetBackground(Value: TColor);
begin
if fBackGround <> Value then begin
fBackGround := Value;
Changed;
end;
end;
procedure TSynHighlighterAttributes.SetForeground(Value: TColor);
begin
if fForeGround <> Value then begin
fForeGround := Value;
Changed;
end;
end;
procedure TSynHighlighterAttributes.SetStyle(Value: TFontStyles);
begin
if fStyle <> Value then begin
fStyle := Value;
Changed;
end;
end;
{$IFNDEF SYN_CLX}
function TSynHighlighterAttributes.LoadFromRegistry(Reg: TBetterRegistry): boolean;
var
key: string;
begin
key := Reg.CurrentPath;
if Reg.OpenKeyReadOnly(Name) then begin
if Reg.ValueExists('Background') then
Background := Reg.ReadInteger('Background');
if Reg.ValueExists('Foreground') then
Foreground := Reg.ReadInteger('Foreground');
if Reg.ValueExists('Style') then
IntegerStyle := Reg.ReadInteger('Style');
reg.OpenKeyReadOnly('\' + key);
Result := true;
end else
Result := false;
end;
function TSynHighlighterAttributes.SaveToRegistry(Reg: TBetterRegistry): boolean;
var
key: string;
begin
key := Reg.CurrentPath;
if Reg.OpenKey(Name,true) then begin
Reg.WriteInteger('Background', Background);
Reg.WriteInteger('Foreground', Foreground);
Reg.WriteInteger('Style', IntegerStyle);
reg.OpenKey('\' + key, false);
Result := true;
end else
Result := false;
end;
function TSynHighlighterAttributes.LoadFromFile(Ini : TIniFile): boolean;
var
S: TStringList;
begin
S := TStringList.Create;
try
Ini.ReadSection(Name, S);
if S.Count > 0 then
begin
if S.IndexOf('Background') <> -1 then
Background := Ini.ReadInteger(Name, 'Background', Background);
if S.IndexOf('Foreground') <> -1 then
Foreground := Ini.ReadInteger(Name, 'Foreground', Foreground);
if S.IndexOf('Style') <> -1 then
IntegerStyle := Ini.ReadInteger(Name, 'Style', IntegerStyle);
Result := true;
end else Result := false;
finally
S.Free;
end;
end;
function TSynHighlighterAttributes.SaveToFile(Ini : TIniFile): boolean;
begin
Ini.WriteInteger(Name, 'Background', Background);
Ini.WriteInteger(Name, 'Foreground', Foreground);
Ini.WriteInteger(Name, 'Style', IntegerStyle);
Result := true;
end;
{$ENDIF}
function TSynHighlighterAttributes.GetStyleFromInt: integer;
begin
if fsBold in Style then Result:= 1 else Result:= 0;
if fsItalic in Style then Result:= Result + 2;
if fsUnderline in Style then Result:= Result + 4;
if fsStrikeout in Style then Result:= Result + 8;
end;
procedure TSynHighlighterAttributes.SetStyleFromInt(const Value: integer);
begin
if Value and $1 = 0 then Style:= [] else Style:= [fsBold];
if Value and $2 <> 0 then Style:= Style + [fsItalic];
if Value and $4 <> 0 then Style:= Style + [fsUnderline];
if Value and $8 <> 0 then Style:= Style + [fsStrikeout];
end;
{ TSynCustomHighlighter }
constructor TSynCustomHighlighter.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fWordBreakChars := TSynWordBreakChars;
fAttributes := TStringList.Create;
fAttributes.Duplicates := dupError;
fAttributes.Sorted := TRUE;
fAttrChangeHooks := TSynNotifyEventChain.CreateEx(Self);
fDefaultFilter := '';
fEnabled := True;
{$IFDEF CODEFOLDING}
//### Code Folding ###
fFoldRegions := TFoldRegions.Create(TFoldRegionItem);
//### End Code Folding ###
{$ENDIF}
end;
destructor TSynCustomHighlighter.Destroy;
begin
inherited Destroy;
FreeHighlighterAttributes;
fAttributes.Free;
fAttrChangeHooks.Free;
{$IFDEF CODEFOLDING}
//### Code Folding ###
fFoldRegions.Free;
//### End Code Folding ###
{$ENDIF}
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -