MG: added xml and lfm highlighter

git-svn-id: trunk@485 -
This commit is contained in:
lazarus 2001-12-06 10:15:07 +00:00
parent e0ecf5bb36
commit 7838853d27
12 changed files with 1789 additions and 91 deletions

2
.gitattributes vendored
View File

@ -44,7 +44,9 @@ components/synedit/synedittextbuffer.pp svneol=native#text/pascal
components/synedit/synedittypes.pp svneol=native#text/pascal components/synedit/synedittypes.pp svneol=native#text/pascal
components/synedit/synhighlightercpp.pp svneol=native#text/pascal components/synedit/synhighlightercpp.pp svneol=native#text/pascal
components/synedit/synhighlighterhtml.pp svneol=native#text/pascal components/synedit/synhighlighterhtml.pp svneol=native#text/pascal
components/synedit/synhighlighterlfm.pas svneol=native#text/pascal
components/synedit/synhighlighterpas.pp svneol=native#text/pascal components/synedit/synhighlighterpas.pp svneol=native#text/pascal
components/synedit/synhighlighterxml.pas svneol=native#text/pascal
components/synedit/syntextdrawer.pp svneol=native#text/pascal components/synedit/syntextdrawer.pp svneol=native#text/pascal
debugger/cmdlinedebugger.pp svneol=native#text/pascal debugger/cmdlinedebugger.pp svneol=native#text/pascal
debugger/dbgbreakpoint.pp svneol=native#text/pascal debugger/dbgbreakpoint.pp svneol=native#text/pascal

View File

@ -1,5 +1,5 @@
# #
# Don't edit, this file is generated by FPCMake Version 1.1 [2001/11/07] # Don't edit, this file is generated by FPCMake Version 1.1 [2001/11/09]
# #
default: all default: all
override PATH:=$(subst \,/,$(PATH)) override PATH:=$(subst \,/,$(PATH))
@ -147,7 +147,7 @@ endif
PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages) PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages)
override PACKAGE_NAME=lazarus override PACKAGE_NAME=lazarus
override PACKAGE_VERSION=0.8 override PACKAGE_VERSION=0.8
override TARGET_UNITS+=syntextdrawer syneditkeycmds synedittypes syneditstrconst syneditsearch syneditmiscprocs syneditmiscclasses synedittextbuffer synedit synedithighlighter synhighlighterpas syncompletion syneditautocomplete synhighlighterhtml synhighlightercpp override TARGET_UNITS+=syntextdrawer syneditkeycmds synedittypes syneditstrconst syneditsearch syneditmiscprocs syneditmiscclasses synedittextbuffer synedit synedithighlighter synhighlighterpas syncompletion syneditautocomplete synhighlighterhtml synhighlightercpp synhighlighterxml synhighlighterlfm
override DIST_ZIPNAME=lazarus.synedit.$(ZIPSUFFIX) override DIST_ZIPNAME=lazarus.synedit.$(ZIPSUFFIX)
override COMPILER_OPTIONS+=-gl override COMPILER_OPTIONS+=-gl
override COMPILER_UNITDIR+=$(COMPILER_UNITTARGETDIR) ../../lcl/units ../../lcl/units/$(LCLPLATFORM) override COMPILER_UNITDIR+=$(COMPILER_UNITTARGETDIR) ../../lcl/units ../../lcl/units/$(LCLPLATFORM)

View File

@ -12,7 +12,8 @@ version=0.8
units=syntextdrawer syneditkeycmds synedittypes syneditstrconst \ units=syntextdrawer syneditkeycmds synedittypes syneditstrconst \
syneditsearch syneditmiscprocs syneditmiscclasses synedittextbuffer \ syneditsearch syneditmiscprocs syneditmiscclasses synedittextbuffer \
synedit synedithighlighter synhighlighterpas syncompletion \ synedit synedithighlighter synhighlighterpas syncompletion \
syneditautocomplete synhighlighterhtml synhighlightercpp syneditautocomplete synhighlighterhtml synhighlightercpp \
synhighlighterxml synhighlighterlfm
[default] [default]

View File

@ -17,7 +17,8 @@ uses
syntextdrawer, syneditkeycmds, synedittypes, syneditstrconst, syntextdrawer, syneditkeycmds, synedittypes, syneditstrconst,
syneditsearch, syneditmiscprocs, syneditmiscclasses, synedittextbuffer, syneditsearch, syneditmiscprocs, syneditmiscclasses, synedittextbuffer,
synedit, synedithighlighter, synhighlighterpas, syncompletion, synedit, synedithighlighter, synhighlighterpas, syncompletion,
syneditautocomplete, synhighlighterhtml, synhighlightercpp; syneditautocomplete, synhighlighterhtml, synhighlightercpp, synhighlighterxml,
synhighlighterlfm;
implementation implementation
@ -26,6 +27,9 @@ end.
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.8 2001/12/06 10:15:06 lazarus
MG: added xml and lfm highlighter
Revision 1.7 2001/03/19 18:51:57 lazarus Revision 1.7 2001/03/19 18:51:57 lazarus
MG: added dynhasharray and renamed tsynautocompletion MG: added dynhasharray and renamed tsynautocompletion

View File

@ -32,13 +32,23 @@ unit SynEditHighlighter;
interface interface
uses uses
SysUtils, Classes,
{$IFDEF SYN_CLX}
kTextDrawer,
Types,
QGraphics,
{$ELSE}
Graphics,
{$IFDEF SYN_LAZARUS} {$IFDEF SYN_LAZARUS}
LCLLinux, LCLLinux,
{$ELSE} {$ELSE}
Windows, Windows,
{$ENDIF} {$ENDIF}
SysUtils, Classes, Graphics, Registry, Registry,
SynEditTypes, SynEditMiscClasses; IniFiles,
{$ENDIF}
SynEditTypes,
SynEditMiscClasses;
{$DEFINE _Gp_MustEnhanceRegistry} {$DEFINE _Gp_MustEnhanceRegistry}
{$IFDEF SYN_COMPILER_4_UP} {$IFDEF SYN_COMPILER_4_UP}
@ -80,16 +90,16 @@ type
oldStyle: boolean): boolean; virtual; oldStyle: boolean): boolean; virtual;
function LoadFromRegistry(Reg: TBetterRegistry): boolean; function LoadFromRegistry(Reg: TBetterRegistry): boolean;
function SaveToRegistry(Reg: TBetterRegistry): boolean; function SaveToRegistry(Reg: TBetterRegistry): boolean;
function LoadFromFile(Ini : TIniFile): boolean; //DDH 10/16/01
function SaveToFile(Ini : TIniFile): boolean; //DDH 10/16/01
public public
property IntegerStyle: integer read GetStyleFromInt write SetStyleFromInt; property IntegerStyle: integer read GetStyleFromInt write SetStyleFromInt;
property Name: string read fName; property Name: string read fName;
property OnChange: TNotifyEvent read fOnChange write fOnChange; property OnChange: TNotifyEvent read fOnChange write fOnChange;
published published
property Background: TColor read fBackground write SetBackground property Background: TColor read fBackground write SetBackground
// default clNone;
stored GetBackgroundColorStored; //mh 2000-10-08 stored GetBackgroundColorStored; //mh 2000-10-08
property Foreground: TColor read fForeground write SetForeground property Foreground: TColor read fForeground write SetForeground
// default clNone;
stored GetForegroundColorStored; //mh 2000-10-08 stored GetForegroundColorStored; //mh 2000-10-08
property Style: TFontStyles read fStyle write SetStyle //default []; property Style: TFontStyles read fStyle write SetStyle //default [];
stored GetFontStyleStored; //mh 2000-10-08 stored GetFontStyleStored; //mh 2000-10-08
@ -108,22 +118,30 @@ const
SYN_ATTR_KEYWORD = 2; SYN_ATTR_KEYWORD = 2;
SYN_ATTR_STRING = 3; SYN_ATTR_STRING = 3;
SYN_ATTR_WHITESPACE = 4; SYN_ATTR_WHITESPACE = 4;
SYN_ATTR_SYMBOL = 5; //mh 2001-09-13
type type
TSynCustomHighlighter = class(TComponent) TSynCustomHighlighter = class(TComponent)
private private
fAttributes: TStringList; fAttributes: TStringList;
fAttrChangeHooks: TSynNotifyEventChain; fAttrChangeHooks: TSynNotifyEventChain;
fUpdateCount: integer; //mh 2001-09-13
fEnabled: Boolean;
fWordBreakChars: TSynIdentChars;
procedure SetEnabled(const Value: boolean); //DDH 2001-10-23
protected protected
fDefaultFilter: string; fDefaultFilter: string;
fUpdateChange: boolean; //mh 2001-09-13
procedure AddAttribute(AAttrib: TSynHighlighterAttributes); procedure AddAttribute(AAttrib: TSynHighlighterAttributes);
procedure DefHighlightChange(Sender: TObject); procedure DefHighlightChange(Sender: TObject);
procedure FreeHighlighterAttributes; //mh 2001-09-13
function GetAttribCount: integer; virtual; function GetAttribCount: integer; virtual;
function GetAttribute(idx: integer): TSynHighlighterAttributes; virtual; function GetAttribute(idx: integer): TSynHighlighterAttributes; virtual;
function GetDefaultAttribute(Index: integer): TSynHighlighterAttributes; function GetDefaultAttribute(Index: integer): TSynHighlighterAttributes;
virtual; abstract; virtual; abstract;
function GetDefaultFilter: string; virtual; function GetDefaultFilter: string; virtual;
function GetIdentChars: TSynIdentChars; virtual; function GetIdentChars: TSynIdentChars; virtual;
procedure SetWordBreakChars(AChars: TSynIdentChars); virtual;
function GetSampleSource: string; virtual; function GetSampleSource: string; virtual;
function IsFilterStored: boolean; virtual; function IsFilterStored: boolean; virtual;
procedure SetAttributesOnChange(AEvent: TNotifyEvent); procedure SetAttributesOnChange(AEvent: TNotifyEvent);
@ -141,6 +159,8 @@ type
procedure AddSpecialAttribute(const AttribName: string); procedure AddSpecialAttribute(const AttribName: string);
{$ENDIF} {$ENDIF}
procedure Assign(Source: TPersistent); override; procedure Assign(Source: TPersistent); override;
procedure BeginUpdate;
procedure EndUpdate;
function GetEol: Boolean; virtual; abstract; function GetEol: Boolean; virtual; abstract;
function GetRange: Pointer; virtual; function GetRange: Pointer; virtual;
function GetToken: String; virtual; abstract; function GetToken: String; virtual; abstract;
@ -153,16 +173,19 @@ type
function IsKeyword(const AKeyword: string): boolean; virtual; // DJLP 2000-08-09 function IsKeyword(const AKeyword: string): boolean; virtual; // DJLP 2000-08-09
procedure Next; virtual; abstract; procedure Next; virtual; abstract;
procedure NextToEol; procedure NextToEol;
procedure SetLine(const NewValue: String; LineNumber:Integer); virtual; abstract; procedure SetLine({$IFDEF FPC}const {$ENDIF}NewValue: String; LineNumber:Integer); virtual; abstract;
procedure SetRange(Value: Pointer); virtual; procedure SetRange(Value: Pointer); virtual;
procedure ResetRange; virtual; procedure ResetRange; virtual;
function UseUserSettings(settingIndex: integer): boolean; virtual; function UseUserSettings(settingIndex: integer): boolean; virtual;
procedure EnumUserSettings(Settings: TStrings); virtual; procedure EnumUserSettings(Settings: TStrings); virtual;
function LoadFromRegistry(RootKey: HKEY; Key: string): boolean; virtual; function LoadFromRegistry(RootKey: HKEY; Key: string): boolean; virtual;
function SaveToRegistry(RootKey: HKEY; Key: string): boolean; virtual; function SaveToRegistry(RootKey: HKEY; Key: string): boolean; virtual;
function LoadFromFile(AFileName: String): boolean; //DDH 10/16/01
function SaveToFile(AFileName: String): boolean; //DDH 10/16/01
procedure HookAttrChangeEvent(ANotifyEvent: TNotifyEvent); procedure HookAttrChangeEvent(ANotifyEvent: TNotifyEvent);
procedure UnhookAttrChangeEvent(ANotifyEvent: TNotifyEvent); procedure UnhookAttrChangeEvent(ANotifyEvent: TNotifyEvent);
property IdentChars: TSynIdentChars read GetIdentChars; property IdentChars: TSynIdentChars read GetIdentChars;
property WordBreakChars: TSynIdentChars read fWordBreakChars write SetWordBreakChars;
property LanguageName: string read GetLanguageName; property LanguageName: string read GetLanguageName;
public public
property AttrCount: integer read GetAttribCount; property AttrCount: integer read GetAttribCount;
@ -178,11 +201,14 @@ type
index SYN_ATTR_KEYWORD read GetDefaultAttribute; index SYN_ATTR_KEYWORD read GetDefaultAttribute;
property StringAttribute: TSynHighlighterAttributes property StringAttribute: TSynHighlighterAttributes
index SYN_ATTR_STRING read GetDefaultAttribute; index SYN_ATTR_STRING read GetDefaultAttribute;
property SymbolAttribute: TSynHighlighterAttributes //mh 2001-09-13
index SYN_ATTR_SYMBOL read GetDefaultAttribute;
property WhitespaceAttribute: TSynHighlighterAttributes property WhitespaceAttribute: TSynHighlighterAttributes
index SYN_ATTR_WHITESPACE read GetDefaultAttribute; index SYN_ATTR_WHITESPACE read GetDefaultAttribute;
published published
property DefaultFilter: string read GetDefaultFilter write SetDefaultFilter property DefaultFilter: string read GetDefaultFilter write SetDefaultFilter
stored IsFilterStored; stored IsFilterStored;
property Enabled: boolean read fEnabled write SetEnabled default TRUE; //DDH 2001-10-23
end; end;
TSynCustomHighlighterClass = class of TSynCustomHighlighter; TSynCustomHighlighterClass = class of TSynCustomHighlighter;
@ -345,7 +371,6 @@ begin
fName := attribName; fName := attribName;
end; end;
{begin} //mh 2000-10-08
function TSynHighlighterAttributes.GetBackgroundColorStored: boolean; function TSynHighlighterAttributes.GetBackgroundColorStored: boolean;
begin begin
Result := fBackground <> fBackgroundDefault; Result := fBackground <> fBackgroundDefault;
@ -367,7 +392,6 @@ begin
fBackgroundDefault := fBackground; fBackgroundDefault := fBackground;
fStyleDefault := fStyle; fStyleDefault := fStyle;
end; end;
{end} //mh 2000-10-08
function TSynHighlighterAttributes.LoadFromBorlandRegistry(rootKey: HKEY; function TSynHighlighterAttributes.LoadFromBorlandRegistry(rootKey: HKEY;
attrKey, attrName: string; oldStyle: boolean): boolean; attrKey, attrName: string; oldStyle: boolean): boolean;
@ -605,6 +629,36 @@ begin
Result := false; Result := false;
end; end;
function TSynHighlighterAttributes.LoadFromFile(Ini : TIniFile): boolean; //DDH 10/16/01
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', clWindow);
if S.IndexOf('Foreground') <> -1 then
Foreground := Ini.ReadInteger(Name, 'Foreground', clWindowText);
if S.IndexOf('Style') <> -1 then
IntegerStyle := Ini.ReadInteger(Name, 'Style', 0);
Result := true;
end else Result := false;
finally
S.Free;
end;
end;
function TSynHighlighterAttributes.SaveToFile(Ini : TIniFile): boolean; //DDH 10/16/01
begin
Ini.WriteInteger(Name, 'Background', Background);
Ini.WriteInteger(Name, 'Foreground', Foreground);
Ini.WriteInteger(Name, 'Style', IntegerStyle);
Result := true;
end;
function TSynHighlighterAttributes.GetStyleFromInt: integer; function TSynHighlighterAttributes.GetStyleFromInt: integer;
begin begin
if fsBold in Style then Result:= 1 else Result:= 0; if fsBold in Style then Result:= 1 else Result:= 0;
@ -626,6 +680,7 @@ end;
constructor TSynCustomHighlighter.Create(AOwner: TComponent); constructor TSynCustomHighlighter.Create(AOwner: TComponent);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
fWordBreakChars := TSynWordBreakChars;
fAttributes := TStringList.Create; fAttributes := TStringList.Create;
fAttributes.Duplicates := dupError; fAttributes.Duplicates := dupError;
fAttributes.Sorted := TRUE; fAttributes.Sorted := TRUE;
@ -634,16 +689,40 @@ begin
end; end;
destructor TSynCustomHighlighter.Destroy; destructor TSynCustomHighlighter.Destroy;
var
i: integer;
begin begin
for i := fAttributes.Count - 1 downto 0 do FreeHighlighterAttributes;
TSynHighlighterAttributes(fAttributes.Objects[i]).Free;
fAttributes.Free; fAttributes.Free;
fAttrChangeHooks.Free; fAttrChangeHooks.Free;
inherited Destroy; inherited Destroy;
end; end;
procedure TSynCustomHighlighter.BeginUpdate;
begin
Inc(fUpdateCount);
end;
procedure TSynCustomHighlighter.EndUpdate;
begin
if fUpdateCount > 0 then begin
Dec(fUpdateCount);
if (fUpdateCount = 0) and fUpdateChange then begin
fUpdateChange := FALSE;
DefHighlightChange(Self);
end;
end;
end;
procedure TSynCustomHighlighter.FreeHighlighterAttributes;
var
i: integer;
begin
if fAttributes <> nil then begin
for i := fAttributes.Count - 1 downto 0 do
TSynHighlighterAttributes(fAttributes.Objects[i]).Free;
fAttributes.Clear;
end;
end;
procedure TSynCustomHighlighter.Assign(Source: TPersistent); procedure TSynCustomHighlighter.Assign(Source: TPersistent);
var var
Src: TSynCustomHighlighter; Src: TSynCustomHighlighter;
@ -667,6 +746,9 @@ begin
// assign the sample source text only if same or descendant class // assign the sample source text only if same or descendant class
if Src is ClassType then if Src is ClassType then
SampleSource := Src.SampleSource; SampleSource := Src.SampleSource;
fWordBreakChars := Src.WordBreakChars;
DefaultFilter := Src.DefaultFilter;
Enabled := Src.Enabled;
end else end else
inherited Assign(Source); inherited Assign(Source);
end; end;
@ -685,24 +767,23 @@ function TSynCustomHighlighter.LoadFromRegistry(RootKey: HKEY;
Key: string): boolean; Key: string): boolean;
var var
r: TBetterRegistry; r: TBetterRegistry;
{$IFNDEF SYN_LAZARUS} {$IFNDEF FPC}
i: integer; i: integer;
{$ENDIF} {$ENDIF}
begin begin
r := TBetterRegistry.Create; r := TBetterRegistry.Create;
try try
r.RootKey := RootKey; r.RootKey := RootKey;
{$IFNDEF SYN_LAZARUS} {$IFNDEF FPC}
// ToDo Registry
if r.OpenKeyReadOnly(Key) then begin if r.OpenKeyReadOnly(Key) then begin
Result := true; Result := true;
for i := 0 to AttrCount-1 do for i := 0 to AttrCount-1 do
Result := Result and Attribute[i].LoadFromRegistry(r); Result := Result and Attribute[i].LoadFromRegistry(r);
end end
else Result := false; else
{$ELSE}
Result:=false;
{$ENDIF} {$ENDIF}
Result := false;
finally r.Free; end; finally r.Free; end;
end; end;
@ -724,6 +805,40 @@ begin
finally r.Free; end; finally r.Free; end;
end; end;
function TSynCustomHighlighter.LoadFromFile(AFileName : String): boolean; //DDH 10/16/01
VAR AIni : TIniFile;
i : Integer;
begin
AIni := TIniFile.Create(AFileName);
try
with AIni do
begin
Result := true;
for i := 0 to AttrCount-1 do
Result := Result and Attribute[i].LoadFromFile(AIni);
end;
finally
AIni.Free;
end;
end;
function TSynCustomHighlighter.SaveToFile(AFileName : String): boolean; //DDH 10/16/01
var AIni : TIniFile;
i: integer;
begin
AIni := TIniFile.Create(AFileName);
try
with AIni do
begin
Result := true;
for i := 0 to AttrCount-1 do
Result := Result and Attribute[i].SaveToFile(AIni);
end;
finally
AIni.Free;
end;
end;
procedure TSynCustomHighlighter.AddAttribute(AAttrib: TSynHighlighterAttributes); procedure TSynCustomHighlighter.AddAttribute(AAttrib: TSynHighlighterAttributes);
begin begin
fAttributes.AddObject(AAttrib.Name, AAttrib); fAttributes.AddObject(AAttrib.Name, AAttrib);
@ -738,7 +853,10 @@ end;
procedure TSynCustomHighlighter.DefHighlightChange(Sender: TObject); procedure TSynCustomHighlighter.DefHighlightChange(Sender: TObject);
begin begin
fAttrChangeHooks.Fire; if fUpdateCount > 0 then
fUpdateChange := TRUE
else
fAttrChangeHooks.Fire;
end; end;
function TSynCustomHighlighter.GetAttribCount: integer; function TSynCustomHighlighter.GetAttribCount: integer;
@ -770,6 +888,11 @@ begin
Result := [#33..#255]; Result := [#33..#255];
end; end;
procedure TSynCustomHighlighter.SetWordBreakChars(AChars: TSynIdentChars);
begin
fWordBreakChars := AChars;
end;
{$IFNDEF SYN_CPPB_1} class {$ENDIF} {$IFNDEF SYN_CPPB_1} class {$ENDIF}
function TSynCustomHighlighter.GetLanguageName: string; function TSynCustomHighlighter.GetLanguageName: string;
begin begin
@ -822,12 +945,10 @@ var
begin begin
for i := fAttributes.Count - 1 downto 0 do begin for i := fAttributes.Count - 1 downto 0 do begin
Attri := TSynHighlighterAttributes(fAttributes.Objects[i]); Attri := TSynHighlighterAttributes(fAttributes.Objects[i]);
{begin} //mh 2000-10-08
if Attri <> nil then begin if Attri <> nil then begin
Attri.OnChange := AEvent; Attri.OnChange := AEvent;
Attri.InternalSaveDefaultValues; Attri.InternalSaveDefaultValues;
end; end;
{end} //mh 2000-10-08
end; end;
end; end;
@ -849,6 +970,18 @@ begin
fAttrChangeHooks.Remove(ANotifyEvent); fAttrChangeHooks.Remove(ANotifyEvent);
end; end;
procedure TSynCustomHighlighter.SetEnabled(const Value: boolean);
begin
if fEnabled <> Value then
begin
fEnabled := Value;
//we need to notify any editor that we are attached to to repaint,
//but a highlighter doesn't know what editor it is attached to.
//Until this is resolved, you will have to manually call repaint
//on the editor in question.
end;
end;
{$IFNDEF SYN_CPPB_1} {$IFNDEF SYN_CPPB_1}
initialization initialization
G_PlaceableHighlighters := TSynHighlighterList.Create; G_PlaceableHighlighters := TSynHighlighterList.Create;

View File

@ -63,24 +63,32 @@ const
SYNS_AttrAsmKey = 'Asm key'; SYNS_AttrAsmKey = 'Asm key';
SYNS_AttrASP = 'Asp'; SYNS_AttrASP = 'Asp';
SYNS_AttrAssembler = 'Assembler'; SYNS_AttrAssembler = 'Assembler';
SYNS_AttrAttributeName = 'Attribute Name';
SYNS_AttrAttributeValue = 'Attribute Value';
SYNS_AttrBlock = 'Block'; SYNS_AttrBlock = 'Block';
SYNS_AttrBrackets = 'Brackets'; SYNS_AttrBrackets = 'Brackets';
SYNS_AttrCDATASection = 'CDATA Section';
SYNS_AttrCharacter = 'Character'; SYNS_AttrCharacter = 'Character';
SYNS_AttrClass = 'Class'; SYNS_AttrClass = 'Class';
SYNS_AttrComment = 'Comment'; SYNS_AttrComment = 'Comment';
SYNS_AttrCondition = 'Condition'; SYNS_AttrCondition = 'Condition';
SYNS_AttrDataType = 'Data type'; SYNS_AttrDataType = 'Data type';
SYNS_AttrDefaultPackage = 'Default packages'; // DJLP 2000-08-11 SYNS_AttrDefaultPackage = 'Default packages';
SYNS_AttrDir = 'Direction'; SYNS_AttrDir = 'Direction';
SYNS_AttrDirective = 'Directive'; SYNS_AttrDirective = 'Directive';
SYNS_AttrDOCTYPESection = 'DOCTYPE Section';
SYNS_AttrDocumentation = 'Documentation'; SYNS_AttrDocumentation = 'Documentation';
SYNS_AttrElementName = 'Element Name';
SYNS_AttrEmbedSQL = 'Embedded SQL'; SYNS_AttrEmbedSQL = 'Embedded SQL';
SYNS_AttrEmbedText = 'Embedded text'; SYNS_AttrEmbedText = 'Embedded text';
SYNS_AttrEntityReference = 'Entity Reference';
SYNS_AttrEscapeAmpersand = 'Escape ampersand'; SYNS_AttrEscapeAmpersand = 'Escape ampersand';
SYNS_AttrEvent = 'Event'; SYNS_AttrEvent = 'Event';
SYNS_AttrException = 'Exception'; SYNS_AttrException = 'Exception';
SYNS_AttrFloat = 'Float';
SYNS_AttrForm = 'Form'; SYNS_AttrForm = 'Form';
SYNS_AttrFunction = 'Function'; SYNS_AttrFunction = 'Function';
SYNS_AttrHexadecimal = 'Hexadecimal';
SYNS_AttrIcon = 'Icon reference'; SYNS_AttrIcon = 'Icon reference';
SYNS_AttrIdentifier = 'Identifier'; SYNS_AttrIdentifier = 'Identifier';
SYNS_AttrIllegalChar = 'Illegal char'; SYNS_AttrIllegalChar = 'Illegal char';
@ -94,13 +102,17 @@ const
SYNS_AttrMarker = 'Marker'; SYNS_AttrMarker = 'Marker';
SYNS_AttrMessage = 'Message'; SYNS_AttrMessage = 'Message';
SYNS_AttrMiscellaneous = 'Miscellaneous'; SYNS_AttrMiscellaneous = 'Miscellaneous';
SYNS_AttrNamespaceAttrName = 'Namespace Attribute Name';
SYNS_AttrNamespaceAttrValue = 'Namespace Attribute Value';
SYNS_AttrNonReservedKeyword = 'Non-reserved keyword'; SYNS_AttrNonReservedKeyword = 'Non-reserved keyword';
SYNS_AttrNull = 'Null'; SYNS_AttrNull = 'Null';
SYNS_AttrNumber = 'Number'; SYNS_AttrNumber = 'Number';
SYNS_AttrOctal = 'Octal';
SYNS_AttrOperator = 'Operator'; SYNS_AttrOperator = 'Operator';
SYNS_AttrPLSQL = 'Reserved word (PL/SQL)'; // DJLP 2000-08-11 SYNS_AttrPLSQL = 'Reserved word (PL/SQL)';
SYNS_AttrPragma = 'Pragma'; SYNS_AttrPragma = 'Pragma';
SYNS_AttrPreprocessor = 'Preprocessor'; SYNS_AttrPreprocessor = 'Preprocessor';
SYNS_AttrProcessingInstr = 'Processing Instruction';
SYNS_AttrQualifier = 'Qualifier'; SYNS_AttrQualifier = 'Qualifier';
SYNS_AttrRegister = 'Register'; SYNS_AttrRegister = 'Register';
SYNS_AttrReservedWord = 'Reserved word'; SYNS_AttrReservedWord = 'Reserved word';
@ -114,113 +126,134 @@ const
SYNS_AttrSection = 'Section'; SYNS_AttrSection = 'Section';
SYNS_AttrSpace = 'Space'; SYNS_AttrSpace = 'Space';
SYNS_AttrSpecialVariable = 'Special variable'; SYNS_AttrSpecialVariable = 'Special variable';
SYNS_AttrSQLPlus = 'SQL*Plus command'; // DJLP 2000-09-05 SYNS_AttrSQLKey = 'SQL keyword';
SYNS_AttrSQLPlus = 'SQL*Plus command';
SYNS_AttrString = 'String'; SYNS_AttrString = 'String';
SYNS_AttrSymbol = 'Symbol'; SYNS_AttrSymbol = 'Symbol';
SYNS_AttrSyntaxError = 'SyntaxError'; SYNS_AttrSyntaxError = 'SyntaxError';
SYNS_AttrSystem = 'System functions and variables'; SYNS_AttrSystem = 'System functions and variables';
SYNS_AttrSystemValue = 'System value'; SYNS_AttrSystemValue = 'System value';
SYNS_AttrTerminator = 'Terminator';
SYNS_AttrText = 'Text'; SYNS_AttrText = 'Text';
SYNS_AttrUnknownWord = 'Unknown word'; SYNS_AttrUnknownWord = 'Unknown word';
SYNS_AttrUser = 'User functions and variables'; SYNS_AttrUser = 'User functions and variables';
SYNS_AttrUserFunction = 'User functions'; SYNS_AttrUserFunction = 'User functions';
SYNS_AttrValue = 'Value'; SYNS_AttrValue = 'Value';
SYNS_AttrVariable = 'Variable'; SYNS_AttrVariable = 'Variable';
SYNS_AttrWhitespace = 'Whitespace';
// names of exporter output formats // names of exporter output formats
SYNS_ExporterFormatHTML = 'HTML'; SYNS_ExporterFormatHTML = 'HTML';
SYNS_ExporterFormatRTF = 'RTF'; SYNS_ExporterFormatRTF = 'RTF';
// TCustomSynEdit scroll hint window caption // TCustomSynEdit scroll hint window caption
SYNS_ScrollInfoFmt = 'Top Line: %d'; // SYNS_ScrollInfoFmt = 'Top Line: %d';
SYNS_ScrollInfoFmt = '%d - %d'; //DDH 10/16/01
SYNS_ScrollInfoFmtTop = 'Top Line: %d';
// TSynEditPrintPreview page number // TSynEditPrintPreview page number
SYNS_PreviewScrollInfoFmt = 'Page: %d'; SYNS_PreviewScrollInfoFmt = 'Page: %d';
// strings for property editors etc // strings for property editors etc
SYNS_EDuplicateShortcut = 'Shortcut already exists'; SYNS_EDuplicateShortcut = 'Shortcut already exists';
SYNS_ShortcutNone = '<none>'; SYNS_ShortcutNone = '<none>';
SYNS_DuplicateShortcutMsg = 'The keystroke "%s" is already assigned to ' + SYNS_DuplicateShortcutMsg = 'The keystroke "%s" is already assigned ' +
'another editor command.'; 'to another editor command. (%s)';
SYNS_DuplicateShortcutMsg2 = 'The keystroke "%s" is already assigned to ' + SYNS_DuplicateShortcutMsg2 = 'The keystroke "%s" is already assigned ' +
'another editor command.'#13#10'The short' + 'to another editor command.'#13#10'The ' +
'cut for this item has not been changed.'; 'shortcut for this item has not been changed.';
// Filters used for open/save dialog // Filters used for open/save dialog
SYNS_FilterPascal = 'Pascal files (*.pas,*.dpr,*.dpk,*.inc)|*.pas;*.dpr;*.dpk;*.inc'; SYNS_FilterPascal = 'Pascal Files (*.pas,*.dpr,*.dpk,*.inc)|*.pas;*.dpr;*.dpk;*.inc';
SYNS_FilterHP48 = 'HP48 files (*.s,*.sou,*.a,*.hp)|*.s;*.sou;*.a;*.hp'; SYNS_FilterHP48 = 'HP48 Files (*.s,*.sou,*.a,*.hp)|*.s;*.sou;*.a;*.hp';
SYNS_FilterCAClipper = 'CA-Clipper files (*.prg, *.ch, *.inc)|*.prg;*.ch;*.inc'; SYNS_FilterCAClipper = 'CA-Clipper Files (*.prg,*.ch,*.inc)|*.prg;*.ch;*.inc';
SYNS_FilterCPP = 'C++ files (*.cpp,*.h,*.hpp)|*.cpp;*.h;*.hpp'; SYNS_FilterCORBAIDL = 'CORBA IDL files (*.idl)|*.idl';
SYNS_FilterJava = 'Java files (*.java)|*.java'; SYNS_FilterCPM = 'CPM reports (*.rdf,*.rif,*.rmf,*.rxf)|*.rdf;*.rif;*.rmf;*.rxf';
SYNS_FilterPerl = 'Perl files (*.pl,*.pm,*.cgi)|*.pl;*.pm;*.cgi'; SYNS_FilterCPP = 'C++ Files (*.c,*.cpp,*.h,*.hpp)|*.c;*.cpp;*.h;*.hpp';
SYNS_FilterJava = 'Java Files (*.java)|*.java';
SYNS_FilterPerl = 'Perl Files (*.pl,*.pm,*.cgi)|*.pl;*.pm;*.cgi';
SYNS_FilterAWK = 'AWK Script (*.awk)|*.awk'; SYNS_FilterAWK = 'AWK Script (*.awk)|*.awk';
SYNS_FilterHTML = 'HTML Document (*.htm,*.html)|*.htm;*.html'; SYNS_FilterHTML = 'HTML Document (*.htm,*.html)|*.htm;*.html';
SYNS_FilterVBScript = 'VBScript files (*.vbs)|*.vbs'; SYNS_FilterVBScript = 'VBScript Files (*.vbs)|*.vbs';
SYNS_FilterGalaxy = 'Galaxy files (*.gtv,*.galrep,*.txt)|*.gtv;*.galrep;*.txt'; SYNS_FilterGalaxy = 'Galaxy Files (*.gtv,*.galrep,*.txt)|*.gtv;*.galrep;*.txt';
SYNS_FilterPython = 'Python files (*.py)|*.py'; SYNS_FilterPython = 'Python Files (*.py)|*.py';
SYNS_FilterSQL = 'SQL files (*.sql)|*.sql'; SYNS_FilterSQL = 'SQL Files (*.sql)|*.sql';
SYNS_FilterHP = 'HP48 files (*.s,*.sou,*.a,*.hp)|*.S;*.SOU;*.A;*.HP'; SYNS_FilterHP = 'HP48 Files (*.s,*.sou,*.a,*.hp)|*.S;*.SOU;*.A;*.HP';
SYNS_FilterTclTk = 'Tcl/Tk files (*.tcl)|*.tcl'; SYNS_FilterTclTk = 'Tcl/Tk Files (*.tcl)|*.tcl';
SYNS_FilterRTF = 'Rich Text Format (*.rtf)|*.rtf'; SYNS_FilterRTF = 'Rich Text Format (*.rtf)|*.rtf';
SYNS_FilterBatch = 'MS-DOS Batch Files (*.bat)|*.bat'; SYNS_FilterBatch = 'MS-DOS Batch Files (*.bat;*.cmd)|*.bat;*.cmd';
SYNS_FilterDFM = 'Delphi/C++ Builder Form Files (*.dfm)|*.dfm'; SYNS_FilterDFM = 'Borland Form Files (*.dfm;*.xfm)|*.dfm;*.xfm';
SYNS_FilterLFM = 'Lazarus Form Files (*.lfm)|*.lfm';
SYNS_FilterX86Asm = 'x86 Assembly Files (*.asm)|*.ASM'; SYNS_FilterX86Asm = 'x86 Assembly Files (*.asm)|*.ASM';
SYNS_FilterGembase = 'GEMBASE files (*.dml,*.gem)|*.DML;*.GEM'; SYNS_FilterGembase = 'GEMBASE Files (*.dml,*.gem)|*.DML;*.GEM';
SYNS_FilterINI = 'INI Files (*.ini)|*.ini'; SYNS_FilterINI = 'INI Files (*.ini)|*.ini';
SYNS_FilterSML = 'Standard ML Files (*.sml)|*.sml'; SYNS_FilterSML = 'Standard ML Files (*.sml)|*.sml';
SYNS_FilterVisualBASIC = 'Visual Basic files (*.bas)|*.bas'; SYNS_FilterVisualBASIC = 'Visual Basic Files (*.bas)|*.bas';
SYNS_FilterADSP21xx = 'DSP files (*.dsp,*.inc)|*.DSP;*.INC'; SYNS_FilterADSP21xx = 'DSP Files (*.dsp,*.inc)|*.DSP;*.INC';
SYNS_FilterPHP = 'PHP files (*.php,*.php3,*.phtml,*.inc)|*.php;*.php3;*.phtml;*.inc'; SYNS_FilterPHP = 'PHP Files (*.php,*.php3,*.phtml,*.inc)|*.php;*.php3;*.phtml;*.inc';
SYNS_FilterCache = 'Cache files (*.mac,*.inc,*.int)|*.mac;*.inc;*.int'; SYNS_FilterCache = 'Cache Files (*.mac,*.inc,*.int)|*.mac;*.inc;*.int';
SYNS_FilterCSS = 'Cascading Stylesheets (*.css)|*.css'; SYNS_FilterCSS = 'Cascading Stylesheets (*.css)|*.css';
SYNS_FilterJScript = 'Javascript files (*.js)|*.js'; SYNS_FilterJScript = 'Javascript Files (*.js)|*.js';
SYNS_FilterKIX = 'Kix Scripts (*.kix)|*.kix'; SYNS_FilterKIX = 'KiXtart scripts (*.kix)|*.kix';
SYNS_FilterBaan = 'Baan 4GL files (*.cln)|*.cln'; SYNS_FilterBaan = 'Baan 4GL Files (*.cln)|*.cln';
SYNS_FilterFoxpro = 'Foxpro Files (*.prg)|*.prg'; SYNS_FilterFoxpro = 'Foxpro Files (*.prg)|*.prg';
SYNS_FilterFortran = 'Fortran Files (*.for)|*.for'; SYNS_FilterFortran = 'Fortran Files (*.for)|*.for';
SYNS_FilterAsm68HC11 = '68HC11 Assembler files (*.hc11,*.asm,*.asc)|*.HC11;*.ASM;*.ASC'; SYNS_FilterAsm68HC11 = '68HC11 Assembler Files (*.hc11,*.asm,*.asc)|*.HC11;*.ASM;*.ASC';
SYNS_FilterProgress = 'Progress Files (*.w,*.p,*.i)|*.w;*.p;*.i'; SYNS_FilterProgress = 'Progress Files (*.w,*.p,*.i)|*.w;*.p;*.i';
SYNS_FilterInno = 'Inno Setup Script files (*.iss)|*.iss'; SYNS_FilterInno = 'Inno Setup Script Files (*.iss)|*.iss';
SYNS_FilterModelica = 'Modelica files (*.mo)|*.mo'; SYNS_FilterModelica = 'Modelica Files (*.mo)|*.mo';
SYNS_FilterModula3 = 'Modula-3 files (*.m3)|*.m3'; SYNS_FilterModula3 = 'Modula-3 Files (*.m3)|*.m3';
SYNS_FilterSDD = 'Semanta DD files (*.sdd)|*.sdd';
SYNS_FilterXML = 'XML Document (*.xml,*.xsd,*.xsl,*.xslt,*.dtd)|*.xml;*.xsd;*.xsl;*.xslt;*.dtd';
SYNS_FilterGWS = 'GW-TEL Script Files (*.gws)|*.gws';
SYNS_FilterSynGenMsgfiles = 'Msg files (*.msg)|*.msg';
// Language names. Maybe somebody wants them translated / more detailed... // Language names. Maybe somebody wants them translated / more detailed...
SYNS_LangHP48 = 'HP48'; SYNS_LangHP48 = 'HP48';
SYNS_LangCAClipper = 'CA-Clipper'; SYNS_LangCAClipper = 'CA-Clipper';
SYNS_LangCPM = 'COAS Product Manager report';
SYNS_LangCPP = 'C++'; SYNS_LangCPP = 'C++';
SYNS_LangJava = 'Java'; SYNS_LangJava = 'Java';
SYNS_LangPerl = 'Perl'; SYNS_LangPerl = 'Perl';
SYNS_LangBatch = 'MS-DOS Batch Language'; SYNS_LangBatch = 'MS-DOS batch language';
SYNS_LangDfm = 'Delphi/C++ Builder Form Definitions'; SYNS_LangDfm = 'Borland Form definition';
SYNS_LangLfm = 'Lazarus Form definition';
SYNS_LangAWK = 'AWK Script'; SYNS_LangAWK = 'AWK Script';
SYNS_LangHTML = 'HTML Document'; SYNS_LangCORBAIDL = 'CORBA IDL';
SYNS_LangHTML = 'HTML document';
SYNS_LangVBSScript = 'MS VBScript'; SYNS_LangVBSScript = 'MS VBScript';
SYNS_LangGalaxy = 'Galaxy'; SYNS_LangGalaxy = 'Galaxy';
SYNS_LangGeneral = 'General'; SYNS_LangGeneral = 'General';
SYNS_LangPascal = 'ObjectPascal'; SYNS_LangPascal = 'ObjectPascal';
SYNS_LangX86Asm = 'x86 Assembly Language'; SYNS_LangX86Asm = 'x86 assembly language';
SYNS_LangPython = 'Python'; SYNS_LangPython = 'Python';
SYNS_LangTclTk = 'Tcl/Tk'; SYNS_LangTclTk = 'Tcl/Tk';
SYNS_LangSQL = 'SQL'; SYNS_LangSQL = 'SQL';
SYNS_LangGembase = 'Gembase'; SYNS_LangGembase = 'Gembase';
SYNS_LangINI = 'INI files'; SYNS_LangINI = 'INI file';
SYNS_LangSML = 'Standard ML'; SYNS_LangSML = 'Standard ML';
SYNS_LangVisualBASIC = 'Visual Basic'; SYNS_LangVisualBASIC = 'Visual Basic';
SYNS_LangADSP21xx = 'ADSP21xx'; SYNS_LangADSP21xx = 'ADSP21xx';
SYNS_LangPHP = 'PHP'; SYNS_LangPHP = 'PHP';
SYNS_LangSybaseSQL = 'Sybase SQL'; SYNS_LangSybaseSQL = 'Sybase SQL';
SYNS_LangGeneralMulti = 'General Multi-Highlighter'; SYNS_LangGeneralMulti = 'General Multi-Highlighter';
SYNS_LangCache = 'Cache object script'; SYNS_LangCache = 'Cache Object script';
SYNS_LangCSS = 'Cascading Stylesheets'; SYNS_LangCSS = 'Cascading style sheets';
SYNS_LangJScript = 'Javascript'; SYNS_LangJScript = 'Javascript';
SYNS_LangKIX = 'KIX32'; SYNS_LangKIX = 'KiXtart script';
SYNS_LangBaan = 'Baan 4GL'; SYNS_LangBaan = 'Baan 4GL';
SYNS_LangFoxpro = 'Foxpro'; SYNS_LangFoxpro = 'Foxpro';
SYNS_LangFortran = 'Fortran'; SYNS_LangFortran = 'Fortran';
SYNS_Lang68HC11 = '68HC11 Assembler'; SYNS_Lang68HC11 = '68HC11 assembler';
SYNS_LangProgress = 'Progress'; SYNS_LangProgress = 'Progress';
SYNS_LangInno = 'Inno Setup scripts'; SYNS_LangInno = 'Inno Setup script';
SYNS_LangModelica = 'Modelica'; SYNS_LangModelica = 'Modelica';
SYNS_LangModula3 = 'Modula 3'; SYNS_LangModula3 = 'Modula 3';
SYNS_LangSDD = 'Semanta data dictionary';
SYNS_LangXML = 'XML document';
SYNS_LangGWS = 'GW-TEL script';
SYNS_LangSynGenMsgfiles = 'SynGen Msg files';
SYNS_LangUnreal = 'Unreal';
implementation implementation

View File

@ -41,9 +41,18 @@ unit SynEditTypes;
interface interface
const
TSynSpecialChars = ['À'..'Ö', 'Ø'..'ö', 'ø'..'ÿ'];
TSynValidStringChars = ['_', '0'..'9', 'A'..'Z', 'a'..'z'] + TSynSpecialChars;
TSynWordBreakChars = ['.', ',', ';', ':', '"', '''', '!', '?', '[', ']', '(',
')', '{', '}', '^', '-', '=', '+', '*', '/', '\', '|'];
type type
TSynIdentChars = set of char; TSynIdentChars = set of char;
//NOTE: This will need to be localized and currently will not work with
// MBCS languages like Japanese or Korean.
PSynSelectionMode = ^TSynSelectionMode; PSynSelectionMode = ^TSynSelectionMode;
TSynSelectionMode = (smNormal, smLine, smColumn); TSynSelectionMode = (smNormal, smLine, smColumn);

View File

@ -218,7 +218,7 @@ type
function GetEol: Boolean; override; function GetEol: Boolean; override;
function GetRange: Pointer; override; function GetRange: Pointer; override;
function GetTokenID: TtkTokenKind; function GetTokenID: TtkTokenKind;
procedure SetLine(const NewValue: String; LineNumber:Integer); override; procedure SetLine({$IFDEF FPC}const {$ENDIF}NewValue: String; LineNumber:Integer); override;
function GetToken: String; override; function GetToken: String; override;
{$IFDEF SYN_LAZARUS} {$IFDEF SYN_LAZARUS}
procedure GetTokenEx(var StartPos, EndPos: integer); override; procedure GetTokenEx(var StartPos, EndPos: integer); override;

View File

@ -0,0 +1,558 @@
{-------------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: SynHighlighterDfm.pas, released 2000-04-14.
The Original Code is based on the dmDfmSyn.pas file from the
mwEdit component suite by Martin Waldenburg and other developers, the Initial
Author of this file is David H. Muir.
All Rights Reserved.
Contributors to the SynEdit and mwEdit projects are listed in the
Contributors.txt file.
Alternatively, the contents of this file may be used under the terms of the
GNU General Public License Version 2 or later (the "GPL"), in which case
the provisions of the GPL are applicable instead of those above.
If you wish to allow use of your version of this file only under the terms
of the GPL and not to allow others to use your version of this file
under the MPL, indicate your decision by deleting the provisions above and
replace them with the notice and other provisions required by the GPL.
If you do not delete the provisions above, a recipient may use your version
of this file under either the MPL or the GPL.
$Id$
You may retrieve the latest version of this file at the SynEdit home page,
located at http://SynEdit.SourceForge.net
Known Issues:
-------------------------------------------------------------------------------}
{
@abstract(Provides a Delphi Form Source highlighter for SynEdit)
@author(David Muir <david@loanhead45.freeserve.co.uk>)
@created(April 13, 2000)
@lastmod(2000-06-23)
The SynHighlighterLFM unit provides SynEdit with a Delphi Form Source (.LFM) highlighter.
The highlighter formats form source code similar to when forms are viewed as text in the Delphi editor.
}
unit SynHighlighterLFM;
{$I SynEdit.inc}
interface
uses
SysUtils, Classes,
{$IFDEF SYN_CLX}
Qt, QControls, QGraphics,
{$ELSE}
{$IFDEF SYN_LAZARUS}
LCLLinux,
{$ELSE}
Windows,
{$ENDIF}
Messages, Controls, Graphics, Registry,
{$ENDIF}
SynEditTypes, SynEditHighlighter;
type
TtkTokenKind = (tkComment, tkIdentifier, tkKey, tkNull, tkNumber, tkSpace,
tkString, tkSymbol, tkUnknown);
TRangeState = (rsANil, rsComment, rsUnKnown);
TProcTableProc = procedure of object;
type
TSynLFMSyn = class(TSynCustomHighlighter)
private
fRange: TRangeState;
fLine: PChar;
fLineNumber: Integer;
fProcTable: array[#0..#255] of TProcTableProc;
Run: LongInt;
fTokenPos: Integer;
FTokenID: TtkTokenKind;
fCommentAttri: TSynHighlighterAttributes;
fIdentifierAttri: TSynHighlighterAttributes;
fKeyAttri: TSynHighlighterAttributes;
fNumberAttri: TSynHighlighterAttributes;
fSpaceAttri: TSynHighlighterAttributes;
fStringAttri: TSynHighlighterAttributes;
fSymbolAttri: TSynHighlighterAttributes;
procedure AltProc;
procedure AsciiCharProc;
procedure BraceCloseProc;
procedure BraceOpenProc;
procedure CommentProc;
procedure CRProc;
procedure EndProc;
procedure IntegerProc;
procedure LFProc;
procedure NullProc;
procedure NumberProc;
procedure ObjectProc;
procedure InheritedProc;
procedure SpaceProc;
procedure StringProc;
procedure SymbolProc;
procedure UnknownProc;
procedure MakeMethodTables;
protected
function GetIdentChars: TSynIdentChars; override;
function GetSampleSource: string; override;
public
{$IFNDEF SYN_CPPB_1} class {$ENDIF} //mh 2000-07-14
function GetLanguageName: string; override;
public
constructor Create(AOwner: TComponent); override;
function GetDefaultAttribute(Index: integer): TSynHighlighterAttributes;
override;
function GetEol: Boolean; override;
function GetRange: Pointer; override;
function GetTokenID: TtkTokenKind;
procedure SetLine({$IFDEF FPC}const {$ENDIF}NewValue: String;
LineNumber: Integer); override;
function GetToken: String; override;
function GetTokenAttribute: TSynHighlighterAttributes; override;
function GetTokenKind: integer; override;
function GetTokenPos: Integer; override;
procedure Next; override;
procedure SetRange(Value: Pointer); override;
procedure ResetRange; override;
property IdentChars;
published
property CommentAttri: TSynHighlighterAttributes read fCommentAttri
write fCommentAttri;
property IdentifierAttri: TSynHighlighterAttributes read fIdentifierAttri
write fIdentifierAttri;
property KeyAttri: TSynHighlighterAttributes read fKeyAttri write fKeyAttri;
property NumberAttri: TSynHighlighterAttributes read fNumberAttri
write fNumberAttri;
property SpaceAttri: TSynHighlighterAttributes read fSpaceAttri
write fSpaceAttri;
property StringAttri: TSynHighlighterAttributes read fStringAttri
write fStringAttri;
end;
function LoadLFMFile2Strings(const AFile: string; AStrings: TStrings;
var WasText: boolean): integer;
function SaveStrings2LFMFile(AStrings: TStrings; const AFile: string): integer;
implementation
uses
SynEditStrConst;
{ A couple of useful Delphi Form functions }
function LoadLFMFile2Strings(const AFile: string; AStrings: TStrings;
var WasText: boolean): integer;
var
Src, Dest: TStream;
{$IFDEF SYN_COMPILER_5_UP}
origFormat: TStreamOriginalFormat;
{$ENDIF}
begin
Result := 0;
WasText := FALSE;
AStrings.Clear;
try
Src := TFileStream.Create(AFile, fmOpenRead or fmShareDenyWrite);
try
Dest := TMemoryStream.Create;
try
{$IFDEF SYN_COMPILER_5_UP}
origFormat := sofUnknown; //riceball 2000-11-17
ObjectResourceToText(Src, Dest, origFormat);
WasText := origFormat = sofText;
{$ELSE}
ObjectResourceToText(Src, Dest);
{$ENDIF}
Dest.Seek(0, soFromBeginning);
AStrings.LoadFromStream(Dest);
finally
Dest.Free;
end;
finally
Src.Free;
end;
except
on E: EInOutError do Result := -E.ErrorCode;
else Result := -1;
end;
end;
function SaveStrings2LFMFile(AStrings: TStrings; const AFile: string): integer;
var
Src, Dest: TStream;
begin
Result := 0;
try
Src := TMemoryStream.Create;
try
AStrings.SaveToStream(Src);
Src.Seek(0, soFromBeginning);
Dest := TFileStream.Create(AFile, fmCreate);
try
ObjectTextToResource(Src, Dest);
finally
Dest.Free;
end;
finally
Src.Free;
end;
except
on E: EInOutError do Result := -E.ErrorCode;
else Result := -1;
end;
end;
{ TSynLFMSyn }
procedure TSynLFMSyn.MakeMethodTables;
var
I: Char;
begin
for I := #0 to #255 do
case I of
'#': fProcTable[I] := {$IFDEF FPC}@{$ENDIF}AsciiCharProc;
'}': fProcTable[I] := {$IFDEF FPC}@{$ENDIF}BraceCloseProc;
'{': fProcTable[I] := {$IFDEF FPC}@{$ENDIF}BraceOpenProc;
#13: fProcTable[I] := {$IFDEF FPC}@{$ENDIF}CRProc;
'A'..'Z', 'a'..'z', '_':
if I in ['e', 'E'] then
fProcTable[I] := {$IFDEF FPC}@{$ENDIF}EndProc
else if I in ['o', 'O'] then
fProcTable[I] := {$IFDEF FPC}@{$ENDIF}ObjectProc
else if I in ['i', 'I'] then
fProcTable[I] := {$IFDEF FPC}@{$ENDIF}InheritedProc
else
fProcTable[I] := {$IFDEF FPC}@{$ENDIF}AltProc;
'$': fProcTable[I] := {$IFDEF FPC}@{$ENDIF}IntegerProc;
#10: fProcTable[I] := {$IFDEF FPC}@{$ENDIF}LFProc;
#0: fProcTable[I] := {$IFDEF FPC}@{$ENDIF}NullProc;
'0'..'9': fProcTable[I] := {$IFDEF FPC}@{$ENDIF}NumberProc;
'(', ')', '/', '=', '<', '>', '.', ',', '[', ']':
fProcTable[I] := {$IFDEF FPC}@{$ENDIF}SymbolProc;
#1..#9, #11, #12, #14..#32: fProcTable[I] := {$IFDEF FPC}@{$ENDIF}SpaceProc;
#39: fProcTable[I] := {$IFDEF FPC}@{$ENDIF}StringProc;
else fProcTable[I] := {$IFDEF FPC}@{$ENDIF}UnknownProc;
end;
end;
constructor TSynLFMSyn.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fCommentAttri := TSynHighlighterAttributes.Create(SYNS_AttrComment);
fCommentAttri.Style := [fsItalic];
AddAttribute(fCommentAttri);
fIdentifierAttri := TSynHighlighterAttributes.Create(SYNS_AttrIdentifier);
AddAttribute(fIdentifierAttri);
fKeyAttri := TSynHighlighterAttributes.Create(SYNS_AttrKey);
fKeyAttri.Style := [fsBold];
AddAttribute(fKeyAttri);
fNumberAttri := TSynHighlighterAttributes.Create(SYNS_AttrNumber);
AddAttribute(fNumberAttri);
fSpaceAttri := TSynHighlighterAttributes.Create(SYNS_AttrSpace);
AddAttribute(fSpaceAttri);
fStringAttri := TSynHighlighterAttributes.Create(SYNS_AttrString);
AddAttribute(fStringAttri);
fSymbolAttri := TSynHighlighterAttributes.Create(SYNS_AttrSymbol);
AddAttribute(fSymbolAttri);
SetAttributesOnChange({$IFDEF FPC}@{$ENDIF}DefHighlightChange);
MakeMethodTables;
fDefaultFilter := SYNS_FilterLFM;
fRange := rsUnknown;
end;
procedure TSynLFMSyn.SetLine({$IFDEF FPC}const {$ENDIF}NewValue: String;
LineNumber: Integer);
begin
fLine := PChar(NewValue);
Run := 0;
fLineNumber := LineNumber;
Next;
end;
procedure TSynLFMSyn.AltProc;
begin
fTokenID := tkIdentifier;
repeat
Inc(Run);
until not (fLine[Run] in ['_', '0'..'9', 'a'..'z', 'A'..'Z']);
end;
procedure TSynLFMSyn.AsciiCharProc;
begin
fTokenID := tkString;
repeat
Inc(Run);
until not (fLine[Run] in ['0'..'9']);
end;
procedure TSynLFMSyn.BraceCloseProc;
begin
inc(Run);
fRange := rsUnknown;
fTokenId := tkIdentifier;
end;
procedure TSynLFMSyn.BraceOpenProc;
begin
fRange := rsComment;
CommentProc;
end;
procedure TSynLFMSyn.CommentProc;
begin
fTokenID := tkComment;
repeat
inc(Run);
if fLine[Run] = '}' then begin
Inc(Run);
fRange := rsUnknown;
break;
end;
until fLine[Run] in [#0, #10, #13];
end;
procedure TSynLFMSyn.CRProc;
begin
fTokenID := tkSpace;
Inc(Run);
if (fLine[Run] = #10) then Inc(Run);
end;
procedure TSynLFMSyn.EndProc;
begin
if (fLine[Run + 1] in ['n', 'N']) and
(fLine[Run + 2] in ['d', 'D']) and
not (fLine[Run + 3] in ['_', '0'..'9', 'a'..'z', 'A'..'Z'])
then begin
fTokenID := tkKey;
Inc(Run, 3);
end else
AltProc;
end;
procedure TSynLFMSyn.IntegerProc;
begin
fTokenID := tkNumber;
repeat
inc(Run);
until not (fLine[Run] in ['0'..'9', 'A'..'F', 'a'..'f']);
end;
procedure TSynLFMSyn.LFProc;
begin
fTokenID := tkSpace;
inc(Run);
end;
procedure TSynLFMSyn.NullProc;
begin
fTokenID := tkNull;
end;
procedure TSynLFMSyn.NumberProc;
begin
fTokenID := tkNumber;
repeat
Inc(Run);
if fLine[Run] = '.' then begin
if fLine[Run + 1] <> '.' then Inc(Run);
break;
end;
until not (fLine[Run] in ['0'..'9', 'e', 'E']);
end;
procedure TSynLFMSyn.ObjectProc;
begin
if (fLine[Run + 1] in ['b', 'B']) and
(fLine[Run + 2] in ['j', 'J']) and
(fLine[Run + 3] in ['e', 'E']) and
(fLine[Run + 4] in ['c', 'C']) and
(fLine[Run + 5] in ['t', 'T']) and
not (fLine[Run + 6] in ['_', '0'..'9', 'a'..'z', 'A'..'Z'])
then
begin
fTokenID := tkKey;
Inc(Run, 6);
end
else
AltProc;
end;
procedure TSynLFMSyn.InheritedProc;
begin
if (fLine[Run + 1] in ['n', 'N']) and
(fLine[Run + 2] in ['h', 'H']) and
(fLine[Run + 3] in ['e', 'E']) and
(fLine[Run + 4] in ['r', 'R']) and
(fLine[Run + 5] in ['i', 'I']) and
(fLine[Run + 6] in ['t', 'T']) and
(fLine[Run + 7] in ['e', 'E']) and
(fLine[Run + 8] in ['d', 'D']) and
not (fLine[Run + 9] in ['_', '0'..'9', 'a'..'z', 'A'..'Z'])
then
begin
fTokenID := tkKey;
Inc(Run, 9);
end
else
AltProc;
end;
procedure TSynLFMSyn.SpaceProc;
begin
fTokenID := tkSpace;
repeat
Inc(Run);
until (fLine[Run] > #32) or (fLine[Run] in [#0, #10, #13]);
end;
procedure TSynLFMSyn.StringProc;
begin
fTokenID := tkString;
repeat
Inc(Run);
if fLine[Run] = '''' then begin
Inc(Run);
if fLine[Run] <> '''' then break
end;
until fLine[Run] in [#0, #10, #13];
end;
procedure TSynLFMSyn.SymbolProc;
begin
inc(Run);
fTokenID := tkSymbol;
end;
procedure TSynLFMSyn.UnknownProc;
begin
{$IFDEF SYN_MBCSSUPPORT}
if FLine[Run] in LeadBytes then
Inc(Run,2)
else
{$ENDIF}
inc(Run);
fTokenID := tkUnknown;
end;
procedure TSynLFMSyn.Next;
begin
fTokenPos := Run;
if fRange = rsComment then begin
if fLine[Run] = #0 then NullProc
else CommentProc;
end else
fProcTable[fLine[Run]]{$IFDEF FPC}(){$ENDIF};
end;
function TSynLFMSyn.GetDefaultAttribute(Index: integer): TSynHighlighterAttributes;
begin
case Index of
SYN_ATTR_COMMENT: Result := fCommentAttri;
SYN_ATTR_IDENTIFIER: Result := fIdentifierAttri;
SYN_ATTR_KEYWORD: Result := fKeyAttri;
SYN_ATTR_STRING: Result := fStringAttri;
SYN_ATTR_WHITESPACE: Result := fSpaceAttri;
SYN_ATTR_SYMBOL: Result := fSymbolAttri;
else
Result := nil;
end;
end;
function TSynLFMSyn.GetEol: Boolean;
begin
Result := fTokenId = tkNull;
end;
function TSynLFMSyn.GetRange: Pointer;
begin
Result := Pointer(fRange);
end;
function TSynLFMSyn.GetTokenID: TtkTokenKind;
begin
Result := fTokenId;
end;
function TSynLFMSyn.GetToken: String;
var
Len: LongInt;
begin
Len := Run - fTokenPos;
SetString(Result, (FLine + fTokenPos), Len);
end;
function TSynLFMSyn.GetTokenAttribute: TSynHighlighterAttributes;
begin
case fTokenID of
tkComment: Result := fCommentAttri;
tkIdentifier: Result := fIdentifierAttri;
tkKey: Result := fKeyAttri;
tkNumber: Result := fNumberAttri;
tkSpace: Result := fSpaceAttri;
tkString: Result := fStringAttri;
tkSymbol: Result := fSymbolAttri;
tkUnknown: Result := fIdentifierAttri;
else Result := nil;
end;
end;
function TSynLFMSyn.GetTokenKind: integer;
begin
Result := Ord(fTokenID);
end;
function TSynLFMSyn.GetTokenPos: Integer;
begin
Result := fTokenPos;
end;
procedure TSynLFMSyn.ResetRange;
begin
fRange := rsUnknown;
end;
procedure TSynLFMSyn.SetRange(Value: Pointer);
begin
fRange := TRangeState(Value);
end;
function TSynLFMSyn.GetIdentChars: TSynIdentChars;
begin
Result := TSynValidStringChars;
end;
{$IFNDEF SYN_CPPB_1} class {$ENDIF} //mh 2000-07-14
function TSynLFMSyn.GetLanguageName: string;
begin
Result := SYNS_LangLFM;
end;
function TSynLFMSyn.GetSampleSource: string;
begin
Result := '{ Delphi/C++ Builder Form Definitions }'#13#10 +
'object TestForm: TTestForm'#13#10 +
' Left = 273'#13#10 +
' Top = 103'#13#10 +
' Caption = ''SynEdit sample source'''#13#10 +
'end';
end; { GetSampleSource }
{$IFNDEF SYN_CPPB_1} //mh 2000-07-14
initialization
RegisterPlaceableHighlighter(TSynLFMSyn);
{$ENDIF}
end.

View File

@ -1073,8 +1073,6 @@ begin
fRange := rsUnknown; fRange := rsUnknown;
fAsmStart := False; fAsmStart := False;
fDefaultFilter := SYNS_FilterPascal; fDefaultFilter := SYNS_FilterPascal;
end; { Create } end; { Create }
procedure TSynPasSyn.SetLine(const NewValue: string; LineNumber:Integer); procedure TSynPasSyn.SetLine(const NewValue: string; LineNumber:Integer);
@ -1134,7 +1132,7 @@ begin
{$IFDEF SYN_LAZARUS} {$IFDEF SYN_LAZARUS}
until (Run>fLineLen) or (fLine[Run] in [#0, #10, #13]); until (Run>fLineLen) or (fLine[Run] in [#0, #10, #13]);
{$ELSE} {$ELSE}
until (Run>fLineLen) or (fLine[Run] in [#0, #10, #13]); until (fLine[Run] in [#0, #10, #13]);
{$ENDIF} {$ENDIF}
end; end;
end; end;

View File

@ -0,0 +1,897 @@
{-------------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: SynHighlighterXML.pas, released 2000-11-20.
The Initial Author of this file is Jeff Rafter.
All Rights Reserved.
Contributors to the SynEdit and mwEdit projects are listed in the
Contributors.txt file.
Alternatively, the contents of this file may be used under the terms of the
GNU General Public License Version 2 or later (the "GPL"), in which case
the provisions of the GPL are applicable instead of those above.
If you wish to allow use of your version of this file only under the terms
of the GPL and not to allow others to use your version of this file
under the MPL, indicate your decision by deleting the provisions above and
replace them with the notice and other provisions required by the GPL.
If you do not delete the provisions above, a recipient may use your version
of this file under either the MPL or the GPL.
$Id$
You may retrieve the latest version of this file at the SynEdit home page,
located at http://SynEdit.SourceForge.net
History:
-------------------------------------------------------------------------------
2000-11-30 Removed mHashTable and MakeIdentTable per Michael Hieke
Known Issues:
- Nothing is really constrained (properly) to valid name chars
- Entity Refs are not constrained to valid name chars
- Support for "Combining Chars and Extender Chars" in names are lacking
- The internal DTD is not parsed (and not handled correctly)
-------------------------------------------------------------------------------}
{
@abstract(Provides an XML highlighter for SynEdit)
@author(Jeff Rafter-- Phil 4:13, based on SynHighlighterHTML by Hideo Koiso)
@created(2000-11-17)
@lastmod(2001-03-12)
The SynHighlighterXML unit provides SynEdit with an XML highlighter.
}
unit SynHighlighterXML;
interface
{$I SynEdit.inc}
uses
SysUtils, Classes,
{$IFDEF SYN_CLX}
Qt, QControls, QGraphics,
{$ELSE}
{$IFDEF SYN_LAZARUS}
LCLLinux,
{$ELSE}
Windows,
{$ENDIF}
Messages, Controls, Graphics, Registry,
{$ENDIF}
SynEditTypes, SynEditHighlighter;
type
TtkTokenKind = (tkAposAttrValue, tkAposEntityRef, tkAttribute, tkCDATA,
tkComment, tkElement, tkEntityRef, tkEqual, tkNull, tkProcessingInstruction,
tkQuoteAttrValue, tkQuoteEntityRef, tkSpace, tkSymbol, tkText,
//
tknsAposAttrValue, tknsAposEntityRef, tknsAttribute, tknsEqual,
tknsQuoteAttrValue, tknsQuoteEntityRef,
//These are unused at the moment
tkDocType
{tkDocTypeAposAttrValue, tkDocTypeAposEntityRef, tkDocTypeAttribute,
tkDocTypeElement, tkDocTypeEqual tkDocTypeQuoteAttrValue,
tkDocTypeQuoteEntityRef}
);
TRangeState = (rsAposAttrValue, rsAPosEntityRef, rsAttribute, rsCDATA,
rsComment, rsElement, rsEntityRef, rsEqual, rsProcessingInstruction,
rsQuoteAttrValue, rsQuoteEntityRef, rsText,
//
rsnsAposAttrValue, rsnsAPosEntityRef, rsnsEqual, rsnsQuoteAttrValue,
rsnsQuoteEntityRef,
//These are unused at the moment
rsDocType, rsDocTypeSquareBraces //ek 2001-11-11
{rsDocTypeAposAttrValue, rsDocTypeAposEntityRef, rsDocTypeAttribute,
rsDocTypeElement, rsDocTypeEqual, rsDocTypeQuoteAttrValue,
rsDocTypeQuoteEntityRef}
);
TProcTableProc = procedure of object;
TSynXMLSyn = class(TSynCustomHighlighter)
private
fRange: TRangeState;
fLine: PChar;
Run: Longint;
fTokenPos: Integer;
fTokenID: TtkTokenKind;
fLineNumber: Integer;
fElementAttri: TSynHighlighterAttributes;
fSpaceAttri: TSynHighlighterAttributes;
fTextAttri: TSynHighlighterAttributes;
fEntityRefAttri: TSynHighlighterAttributes;
fProcessingInstructionAttri: TSynHighlighterAttributes;
fCDATAAttri: TSynHighlighterAttributes;
fCommentAttri: TSynHighlighterAttributes;
fDocTypeAttri: TSynHighlighterAttributes;
fAttributeAttri: TSynHighlighterAttributes;
fnsAttributeAttri: TSynHighlighterAttributes;
fAttributeValueAttri: TSynHighlighterAttributes;
fnsAttributeValueAttri: TSynHighlighterAttributes;
fSymbolAttri: TSynHighlighterAttributes;
fProcTable: array[#0..#255] of TProcTableProc;
FWantBracesParsed: Boolean;
procedure NullProc;
procedure CarriageReturnProc;
procedure LineFeedProc;
procedure SpaceProc;
procedure LessThanProc;
procedure GreaterThanProc;
procedure CommentProc;
procedure ProcessingInstructionProc;
procedure DocTypeProc;
procedure CDATAProc;
procedure TextProc;
procedure ElementProc;
procedure AttributeProc;
procedure QAttributeValueProc;
procedure AAttributeValueProc;
procedure EqualProc;
procedure IdentProc;
procedure MakeMethodTables;
function NextTokenIs(T: String): Boolean;
procedure EntityRefProc;
procedure QEntityRefProc;
procedure AEntityRefProc;
protected
function GetIdentChars: TSynIdentChars; override;
function GetSampleSource : String; override;
public
{$IFNDEF SYN_CPPB_1} class {$ENDIF}
function GetLanguageName: string; override;
public
constructor Create(AOwner: TComponent); override;
function GetDefaultAttribute(Index: integer): TSynHighlighterAttributes;
override;
function GetEol: Boolean; override;
function GetRange: Pointer; override;
function GetTokenID: TtkTokenKind;
procedure SetLine({$IFDEF FPC}const {$ENDIF}NewValue: string; LineNumber:Integer); override;
function GetToken: string; override;
function GetTokenAttribute: TSynHighlighterAttributes; override;
function GetTokenKind: integer; override;
function GetTokenPos: Integer; override;
procedure Next; override;
procedure SetRange(Value: Pointer); override;
procedure ReSetRange; override;
property IdentChars;
published
property ElementAttri: TSynHighlighterAttributes read fElementAttri
write fElementAttri;
property AttributeAttri: TSynHighlighterAttributes read fAttributeAttri
write fAttributeAttri;
property NamespaceAttributeAttri: TSynHighlighterAttributes
read fnsAttributeAttri write fnsAttributeAttri;
property AttributeValueAttri: TSynHighlighterAttributes
read fAttributeValueAttri write fAttributeValueAttri;
property NamespaceAttributeValueAttri: TSynHighlighterAttributes
read fnsAttributeValueAttri write fnsAttributeValueAttri;
property TextAttri: TSynHighlighterAttributes read fTextAttri
write fTextAttri;
property CDATAAttri: TSynHighlighterAttributes read fCDATAAttri
write fCDATAAttri;
property EntityRefAttri: TSynHighlighterAttributes read fEntityRefAttri
write fEntityRefAttri;
property ProcessingInstructionAttri: TSynHighlighterAttributes
read fProcessingInstructionAttri write fProcessingInstructionAttri;
property CommentAttri: TSynHighlighterAttributes read fCommentAttri
write fCommentAttri;
property DocTypeAttri: TSynHighlighterAttributes read fDocTypeAttri
write fDocTypeAttri;
property SpaceAttri: TSynHighlighterAttributes read fSpaceAttri
write fSpaceAttri;
property SymbolAttri: TSynHighlighterAttributes read fSymbolAttri
write fSymbolAttri;
property WantBracesParsed : Boolean read FWantBracesParsed
write FWantBracesParsed default True;
end;
implementation
uses
SynEditStrConst;
const
NameChars : set of char = ['0'..'9', 'a'..'z', 'A'..'Z', '_', '.', ':', '-'];
constructor TSynXMLSyn.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fElementAttri:= TSynHighlighterAttributes.Create(SYNS_AttrElementName);
fTextAttri:= TSynHighlighterAttributes.Create(SYNS_AttrText);
fSpaceAttri:= TSynHighlighterAttributes.Create(SYNS_AttrWhitespace);
fEntityRefAttri:= TSynHighlighterAttributes.Create(SYNS_AttrEntityReference);
fProcessingInstructionAttri:= TSynHighlighterAttributes.Create(
SYNS_AttrProcessingInstr);
fCDATAAttri:= TSynHighlighterAttributes.Create(SYNS_AttrCDATASection);
fCommentAttri:= TSynHighlighterAttributes.Create(SYNS_AttrComment);
fDocTypeAttri:= TSynHighlighterAttributes.Create(SYNS_AttrDOCTYPESection);
fAttributeAttri:= TSynHighlighterAttributes.Create(SYNS_AttrAttributeName);
fnsAttributeAttri:= TSynHighlighterAttributes.Create(
SYNS_AttrNamespaceAttrName);
fAttributeValueAttri:= TSynHighlighterAttributes.Create(
SYNS_AttrAttributeValue);
fnsAttributeValueAttri:= TSynHighlighterAttributes.Create(
SYNS_AttrNamespaceAttrValue);
fSymbolAttri:= TSynHighlighterAttributes.Create(SYNS_AttrSymbol);
fElementAttri.Foreground:= clMaroon;
fElementAttri.Style:= [fsBold];
fDocTypeAttri.Foreground:= clblue;
fDocTypeAttri.Style:= [fsItalic];
fCDATAAttri.Foreground:= clOlive;
fCDATAAttri.Style:= [fsItalic];
fEntityRefAttri.Foreground:= clblue;
fEntityRefAttri.Style:= [fsbold];
fProcessingInstructionAttri.Foreground:= clblue;
fProcessingInstructionAttri.Style:= [];
fTextAttri.Foreground:= clBlack;
fTextAttri.Style:= [fsBold];
fAttributeAttri.Foreground:= clMaroon;
fAttributeAttri.Style:= [];
fnsAttributeAttri.Foreground:= clRed;
fnsAttributeAttri.Style:= [];
fAttributeValueAttri.Foreground:= clNavy;
fAttributeValueAttri.Style:= [fsBold];
fnsAttributeValueAttri.Foreground:= clRed;
fnsAttributeValueAttri.Style:= [fsBold];
fCommentAttri.Background:= clSilver;
fCommentAttri.Foreground:= clGray;
fCommentAttri.Style:= [fsbold, fsItalic];
fSymbolAttri.Foreground:= clblue;
fSymbolAttri.Style:= [];
AddAttribute(fSymbolAttri);
AddAttribute(fProcessingInstructionAttri);
AddAttribute(fDocTypeAttri);
AddAttribute(fCommentAttri);
AddAttribute(fElementAttri);
AddAttribute(fAttributeAttri);
AddAttribute(fnsAttributeAttri);
AddAttribute(fAttributeValueAttri);
AddAttribute(fnsAttributeValueAttri);
AddAttribute(fEntityRefAttri);
AddAttribute(fCDATAAttri);
AddAttribute(fSpaceAttri);
AddAttribute(fTextAttri);
SetAttributesOnChange({$IFDEF FPC}@{$ENDIF}DefHighlightChange);
MakeMethodTables;
fRange := rsText;
fDefaultFilter := SYNS_FilterXML;
end;
procedure TSynXMLSyn.MakeMethodTables;
var
i: Char;
begin
for i:= #0 To #255 do begin
case i of
#0:
begin
fProcTable[i] := {$IFDEF FPC}@{$ENDIF}NullProc;
end;
#10:
begin
fProcTable[i] := {$IFDEF FPC}@{$ENDIF}LineFeedProc;
end;
#13:
begin
fProcTable[i] := {$IFDEF FPC}@{$ENDIF}CarriageReturnProc;
end;
#1..#9, #11, #12, #14..#32:
begin
fProcTable[i] := {$IFDEF FPC}@{$ENDIF}SpaceProc;
end;
'<':
begin
fProcTable[i] := {$IFDEF FPC}@{$ENDIF}LessThanProc;
end;
'>':
begin
fProcTable[i] := {$IFDEF FPC}@{$ENDIF}GreaterThanProc;
end;
else
fProcTable[i] := {$IFDEF FPC}@{$ENDIF}IdentProc;
end;
end;
end;
procedure TSynXMLSyn.SetLine({$IFDEF FPC}const {$ENDIF}NewValue: string;
LineNumber:Integer);
begin
fLine := PChar(NewValue);
Run := 0;
fLineNumber := LineNumber;
Next;
end;
procedure TSynXMLSyn.NullProc;
begin
fTokenID := tkNull;
end;
procedure TSynXMLSyn.CarriageReturnProc;
begin
fTokenID := tkSpace;
Inc(Run);
if fLine[Run] = #10 then Inc(Run);
end;
procedure TSynXMLSyn.LineFeedProc;
begin
fTokenID := tkSpace;
Inc(Run);
end;
procedure TSynXMLSyn.SpaceProc;
begin
Inc(Run);
fTokenID := tkSpace;
while fLine[Run] <= #32 do begin
if fLine[Run] in [#0, #9, #10, #13] then break;
Inc(Run);
end;
end;
procedure TSynXMLSyn.LessThanProc;
begin
Inc(Run);
if (fLine[Run] = '/') then
Inc(Run);
if (fLine[Run] = '!') then
begin
if NextTokenIs('--') then begin
fTokenID := tkSymbol;
fRange := rsComment;
Inc(Run, 3);
end else if NextTokenIs('DOCTYPE') then begin
fTokenID := tkDocType;
fRange := rsDocType;
Inc(Run, 7);
end else if NextTokenIs('[CDATA[') then begin
fTokenID := tkCDATA;
fRange := rsCDATA;
Inc(Run, 7);
end else begin
fTokenID := tkSymbol;
fRange := rsElement;
Inc(Run);
end;
end else if fLine[Run]= '?' then begin
fTokenID := tkProcessingInstruction;
fRange := rsProcessingInstruction;
Inc(Run);
end else begin
fTokenID := tkSymbol;
fRange := rsElement;
end;
end;
procedure TSynXMLSyn.GreaterThanProc;
begin
fTokenId := tkSymbol;
fRange:= rsText;
Inc(Run);
end;
procedure TSynXMLSyn.CommentProc;
begin
if (fLine[Run] = '-') and (fLine[Run + 1] = '-') and (fLine[Run + 2] = '>')
then begin
fTokenID := tkSymbol;
fRange:= rsText;
Inc(Run, 3);
Exit;
end;
fTokenID := tkComment;
if (fLine[Run] In [#0, #10, #13]) then begin
fProcTable[fLine[Run]]{$IFDEF FPC}(){$ENDIF};
Exit;
end;
while not (fLine[Run] in [#0, #10, #13]) do begin
if (fLine[Run] = '-') and (fLine[Run + 1] = '-') and (fLine[Run + 2] = '>')
then begin
fRange := rsComment;
break;
end;
Inc(Run);
end;
end;
procedure TSynXMLSyn.ProcessingInstructionProc;
begin
fTokenID := tkProcessingInstruction;
if (fLine[Run] In [#0, #10, #13]) then begin
fProcTable[fLine[Run]]{$IFDEF FPC}(){$ENDIF};
Exit;
end;
while not (fLine[Run] in [#0, #10, #13]) do begin
if (fLine[Run] = '>') and (fLine[Run - 1] = '?')
then begin
fRange := rsText;
Inc(Run);
break;
end;
Inc(Run);
end;
end;
procedure TSynXMLSyn.DocTypeProc; //ek 2001-11-11
begin
fTokenID := tkDocType;
if (fLine[Run] In [#0, #10, #13]) then begin
fProcTable[fLine[Run]]{$IFDEF FPC}(){$ENDIF};
Exit;
end;
case fRange of
rsDocType:
begin
while not (fLine[Run] in [#0, #10, #13]) do
begin
case fLine[Run] of
'[': begin
while True do
begin
inc(Run);
case fLine[Run] of
']':
begin
Inc(Run);
Exit;
end;
#0, #10, #13:
begin
fRange:=rsDocTypeSquareBraces;
Exit;
end;
end;
end;
end;
'>': begin
fRange := rsAttribute;
Inc(Run);
Break;
end;
end;
inc(Run);
end;
end;
rsDocTypeSquareBraces:
begin
while not (fLine[Run] in [#0, #10, #13]) do
begin
if (fLine[Run]=']') then
begin
fRange := rsDocType;
Inc(Run);
Exit;
end;
inc(Run);
end;
end;
end;
end;
procedure TSynXMLSyn.CDATAProc;
begin
fTokenID := tkCDATA;
if (fLine[Run] In [#0, #10, #13]) then
begin
fProcTable[fLine[Run]]{$IFDEF FPC}(){$ENDIF};
Exit;
end;
while not (fLine[Run] in [#0, #10, #13]) do
begin
if (fLine[Run] = '>') and (fLine[Run - 1] = ']')
then begin
fRange := rsText;
Inc(Run);
break;
end;
Inc(Run);
end;
end;
procedure TSynXMLSyn.ElementProc;
begin
if fLine[Run] = '/' then Inc(Run);
while (fLine[Run] in NameChars) do Inc(Run);
fRange := rsAttribute;
fTokenID := tkElement;
end;
procedure TSynXMLSyn.AttributeProc;
begin
//Check if we are starting on a closing quote
if (fLine[Run] in [#34, #39]) then
begin
fTokenID := tkSymbol;
fRange := rsAttribute;
Inc(Run);
Exit;
end;
//Read the name
while (fLine[Run] in NameChars) do Inc(Run);
//Check if this is an xmlns: attribute
if (Pos('xmlns', GetToken) > 0) then begin
fTokenID := tknsAttribute;
fRange := rsnsEqual;
end else begin
fTokenID := tkAttribute;
fRange := rsEqual;
end;
end;
procedure TSynXMLSyn.EqualProc;
begin
if fRange = rsnsEqual then
fTokenID := tknsEqual
else
fTokenID := tkEqual;
while not (fLine[Run] in [#0, #10, #13]) do
begin
if (fLine[Run] = '/') then
begin
fTokenID := tkSymbol;
fRange := rsElement;
Inc(Run);
Exit;
end else if (fLine[Run] = #34) then
begin
if fRange = rsnsEqual then
fRange := rsnsQuoteAttrValue
else
fRange := rsQuoteAttrValue;
Inc(Run);
Exit;
end else if (fLine[Run] = #39) then
begin
if fRange = rsnsEqual then
fRange := rsnsAPosAttrValue
else
fRange := rsAPosAttrValue;
Inc(Run);
Exit;
end;
Inc(Run);
end;
end;
procedure TSynXMLSyn.QAttributeValueProc;
begin
if fRange = rsnsQuoteAttrValue then
fTokenID := tknsQuoteAttrValue
else
fTokenID := tkQuoteAttrValue;
while not (fLine[Run] in [#0, #10, #13, '&', #34]) do Inc(Run);
if fLine[Run] = '&' then
begin
if fRange = rsnsQuoteAttrValue then
fRange := rsnsQuoteEntityRef
else
fRange := rsQuoteEntityRef;
Exit;
end else if fLine[Run] <> #34 then
begin
Exit;
end;
fRange := rsAttribute;
end;
procedure TSynXMLSyn.AAttributeValueProc;
begin
if fRange = rsnsAPosAttrValue then
fTokenID := tknsAPosAttrValue
else
fTokenID := tkAPosAttrValue;
while not (fLine[Run] in [#0, #10, #13, '&', #39]) do Inc(Run);
if fLine[Run] = '&' then
begin
if fRange = rsnsAPosAttrValue then
fRange := rsnsAPosEntityRef
else
fRange := rsAPosEntityRef;
Exit;
end else if fLine[Run] <> #39 then
begin
Exit;
end;
fRange := rsAttribute;
end;
procedure TSynXMLSyn.TextProc;
const StopSet = [#0..#31, '<', '&'];
begin
if fLine[Run] in (StopSet - ['&']) then begin
fProcTable[fLine[Run]]{$IFDEF FPC}(){$ENDIF};
exit;
end;
fTokenID := tkText;
while not (fLine[Run] in StopSet) do Inc(Run);
if (fLine[Run] = '&') then begin
fRange := rsEntityRef;
Exit;
end;
end;
procedure TSynXMLSyn.EntityRefProc;
begin
fTokenID := tkEntityRef;
fRange := rsEntityRef;
while not (fLine[Run] in [#0..#32, ';']) do Inc(Run);
if (fLine[Run] = ';') then Inc(Run);
fRange := rsText;
end;
procedure TSynXMLSyn.QEntityRefProc;
begin
if fRange = rsnsQuoteEntityRef then
fTokenID := tknsQuoteEntityRef
else
fTokenID := tkQuoteEntityRef;
while not (fLine[Run] in [#0..#32, ';']) do Inc(Run);
if (fLine[Run] = ';') then Inc(Run);
if fRange = rsnsQuoteEntityRef then
fRange := rsnsQuoteAttrValue
else
fRange := rsQuoteAttrValue;
end;
procedure TSynXMLSyn.AEntityRefProc;
begin
if fRange = rsnsAPosEntityRef then
fTokenID := tknsAPosEntityRef
else
fTokenID := tkAPosEntityRef;
while not (fLine[Run] in [#0..#32, ';']) do Inc(Run);
if (fLine[Run] = ';') then Inc(Run);
if fRange = rsnsAPosEntityRef then
fRange := rsnsAPosAttrValue
else
fRange := rsAPosAttrValue;
end;
procedure TSynXMLSyn.IdentProc;
begin
case fRange of
rsElement:
begin
ElementProc{$IFDEF FPC}(){$ENDIF};
end;
rsAttribute:
begin
AttributeProc{$IFDEF FPC}(){$ENDIF};
end;
rsEqual, rsnsEqual:
begin
EqualProc{$IFDEF FPC}(){$ENDIF};
end;
rsQuoteAttrValue, rsnsQuoteAttrValue:
begin
QAttributeValueProc{$IFDEF FPC}(){$ENDIF};
end;
rsAposAttrValue, rsnsAPosAttrValue:
begin
AAttributeValueProc{$IFDEF FPC}(){$ENDIF};
end;
rsQuoteEntityRef, rsnsQuoteEntityRef:
begin
QEntityRefProc{$IFDEF FPC}(){$ENDIF};
end;
rsAposEntityRef, rsnsAPosEntityRef:
begin
AEntityRefProc{$IFDEF FPC}(){$ENDIF};
end;
rsEntityRef:
begin
EntityRefProc{$IFDEF FPC}(){$ENDIF};
end;
else ;
end;
end;
procedure TSynXMLSyn.Next;
begin
fTokenPos := Run;
case fRange of
rsText:
begin
TextProc{$IFDEF FPC}(){$ENDIF};
end;
rsComment:
begin
CommentProc{$IFDEF FPC}(){$ENDIF};
end;
rsProcessingInstruction:
begin
ProcessingInstructionProc{$IFDEF FPC}(){$ENDIF};
end;
rsDocType, rsDocTypeSquareBraces: //ek 2001-11-11
begin
DocTypeProc{$IFDEF FPC}(){$ENDIF};
end;
rsCDATA:
begin
CDATAProc{$IFDEF FPC}(){$ENDIF};
end;
else
fProcTable[fLine[Run]]{$IFDEF FPC}(){$ENDIF};
end;
end;
function TSynXMLSyn.NextTokenIs(T : String) : Boolean;
var I, Len : Integer;
begin
Result:= True;
Len:= Length(T);
for I:= 1 to Len do
if (fLine[Run + I] <> T[I]) then
begin
Result:= False;
Break;
end;
end;
function TSynXMLSyn.GetDefaultAttribute(
Index: integer): TSynHighlighterAttributes;
begin
case Index of
SYN_ATTR_COMMENT: Result := fCommentAttri;
SYN_ATTR_IDENTIFIER: Result := fAttributeAttri;
SYN_ATTR_KEYWORD: Result := fElementAttri;
SYN_ATTR_WHITESPACE: Result := fSpaceAttri;
SYN_ATTR_SYMBOL: Result := fSymbolAttri;
else
Result := nil;
end;
end;
function TSynXMLSyn.GetEol: Boolean;
begin
Result := fTokenId = tkNull;
end;
function TSynXMLSyn.GetToken: string;
var
len: Longint;
begin
Len := (Run - fTokenPos);
SetString(Result, (FLine + fTokenPos), len);
end;
function TSynXMLSyn.GetTokenID: TtkTokenKind;
begin
Result := fTokenId;
end;
function TSynXMLSyn.GetTokenAttribute: TSynHighlighterAttributes;
begin
case fTokenID of
tkElement: Result:= fElementAttri;
tkAttribute: Result:= fAttributeAttri;
tknsAttribute: Result:= fnsAttributeAttri;
tkEqual: Result:= fSymbolAttri;
tknsEqual: Result:= fSymbolAttri;
tkQuoteAttrValue: Result:= fAttributeValueAttri;
tkAPosAttrValue: Result:= fAttributeValueAttri;
tknsQuoteAttrValue: Result:= fnsAttributeValueAttri;
tknsAPosAttrValue: Result:= fnsAttributeValueAttri;
tkText: Result:= fTextAttri;
tkCDATA: Result:= fCDATAAttri;
tkEntityRef: Result:= fEntityRefAttri;
tkQuoteEntityRef: Result:= fEntityRefAttri;
tkAposEntityRef: Result:= fEntityRefAttri;
tknsQuoteEntityRef: Result:= fEntityRefAttri;
tknsAposEntityRef: Result:= fEntityRefAttri;
tkProcessingInstruction: Result:= fProcessingInstructionAttri;
tkComment: Result:= fCommentAttri;
tkDocType: Result:= fDocTypeAttri;
tkSymbol: Result:= fSymbolAttri;
tkSpace: Result:= fSpaceAttri;
else
Result := nil;
end;
end;
function TSynXMLSyn.GetTokenKind: integer;
begin
Result := Ord(fTokenId);
end;
function TSynXMLSyn.GetTokenPos: Integer;
begin
Result := fTokenPos;
end;
function TSynXMLSyn.GetRange: Pointer;
begin
Result := Pointer(fRange);
end;
procedure TSynXMLSyn.SetRange(Value: Pointer);
begin
fRange := TRangeState(Value);
end;
procedure TSynXMLSyn.ReSetRange;
begin
fRange:= rsText;
end;
function TSynXMLSyn.GetIdentChars: TSynIdentChars;
begin
Result := ['0'..'9', 'a'..'z', 'A'..'Z', '_', '.', '-'] + TSynSpecialChars;
end;
{$IFNDEF SYN_CPPB_1} class {$ENDIF}
function TSynXMLSyn.GetLanguageName: string;
begin
Result := SYNS_LangXML;
end;
function TSynXMLSyn.GetSampleSource: String;
begin
Result:= '<?xml version="1.0"?>'#13#10+
'<!DOCTYPE root ['#13#10+
' ]>'#13#10+
'<!-- Comment -->'#13#10+
'<root version="&test;">'#13#10+
' <![CDATA[ **CDATA section** ]]>'#13#10+
'</root>';
end;
initialization
{$IFNDEF SYN_CPPB_1}
RegisterPlaceableHighlighter(TSynXMLSyn);
{$ENDIF}
end.

View File

@ -29,7 +29,8 @@ uses
FileCtrl, Graphics, Controls, Dialogs, LResources, FileCtrl, Graphics, Controls, Dialogs, LResources,
{$ifdef NEW_EDITOR_SYNEDIT} {$ifdef NEW_EDITOR_SYNEDIT}
SynEdit, SynEditHighlighter, SynEditAutoComplete, SynEditKeyCmds, SynEdit, SynEditHighlighter, SynEditAutoComplete, SynEditKeyCmds,
SynHighlighterPas, SynHighlighterHTML, SynHighlighterCPP, SynHighlighterPas, SynHighlighterHTML, SynHighlighterCPP, SynHighlighterXML,
SynHighlighterLFM,
{$else} {$else}
mwCustomEdit, mwPasSyn, mwHighlighter, mwCustomEdit, mwPasSyn, mwHighlighter,
{$endif} {$endif}
@ -69,7 +70,8 @@ const
); );
LazSyntaxHighlighterClasses: array[TLazSyntaxHighlighter] of TCustomSynClass = LazSyntaxHighlighterClasses: array[TLazSyntaxHighlighter] of TCustomSynClass =
( nil, nil, TSynPasSyn, TSynPasSyn, nil, nil, TSynHTMLSyn, TSynCPPSyn); ( nil, nil, TSynPasSyn, TSynPasSyn, TSynLFMSyn, TSynXMLSyn, TSynHTMLSyn,
TSynCPPSyn);
type type
{ TEditOptLanguageInfo stores lazarus IDE additional information { TEditOptLanguageInfo stores lazarus IDE additional information
@ -754,7 +756,7 @@ begin
with NewInfo do begin with NewInfo do begin
TheType:=CompatibleLazSyntaxHilighter[lshCPP]; TheType:=CompatibleLazSyntaxHilighter[lshCPP];
SynClass:=LazSyntaxHighlighterClasses[TheType]; SynClass:=LazSyntaxHighlighterClasses[TheType];
FileExtensions:='c;cc;cpp;h'; FileExtensions:='c;cc;cpp;h;hpp';
SampleSource:= SampleSource:=
'/* Comment */'#13+ '/* Comment */'#13+
'#include <stdio.h>'#13+ '#include <stdio.h>'#13+
@ -785,6 +787,66 @@ begin
end; end;
end; end;
Add(NewInfo); Add(NewInfo);
// create info for XML
NewInfo:=TEditOptLanguageInfo.Create;
with NewInfo do begin
TheType:=CompatibleLazSyntaxHilighter[lshXML];
SynClass:=LazSyntaxHighlighterClasses[TheType];
FileExtensions:='xml;xsd;xsl;xslt;dtd';
SampleSource:=
'<?xml version="1.0"?>'#13+
'<!DOCTYPE root ['#13+
' ]>'#13+
'<!-- Comment -->'#13+
'<root version="&test;">'#13+
' <![CDATA[ **CDATA section** ]]>'#13+
'</root>'#13+
'<!-- Text Block -->'#13+
''#13+
#13;
AddAttrSampleLines[ahaTextBlock]:=8;
MappedAttributes:=TStringList.Create;
with MappedAttributes do begin
Add('Element=Reserved_word');
Add('Comment=Comment');
Add('Text=Identifier');
Add('Space=Space');
Add('Symbol=Symbol');
end;
end;
Add(NewInfo);
// create info for LFM
NewInfo:=TEditOptLanguageInfo.Create;
with NewInfo do begin
TheType:=CompatibleLazSyntaxHilighter[lshLFM];
SynClass:=LazSyntaxHighlighterClasses[TheType];
FileExtensions:='lfm;dfm;xfm';
SampleSource:=
'{ Lazarus Form Definitions }'#13+
'object TestForm: TTestForm'#13+
' Left = 273'#13+
' Top = 103'#13+
' Caption = ''sample source'''#13+
'end'#13+
'{ Text Block }'#13+
''#13+
#13;
AddAttrSampleLines[ahaTextBlock]:=7;
MappedAttributes:=TStringList.Create;
with MappedAttributes do begin
Add('Element=Reserved_word');
Add('Comment=Comment');
Add('Identifier=Identifier');
Add('Key=Reserved_word');
Add('Number=Number');
Add('Space=Space');
Add('String=String');
Add('Symbol=Symbol');
end;
end;
Add(NewInfo);
end; end;
destructor TEditOptLangList.Destroy; destructor TEditOptLangList.Destroy;
@ -1660,7 +1722,7 @@ begin
FormCreating:=true; FormCreating:=true;
if LazarusResources.Find(ClassName)=nil then begin if LazarusResources.Find(ClassName)=nil then begin
SetBounds((Screen.Width-470) div 2,(Screen.Height-480) div 2, 455,459); SetBounds((Screen.Width-490) div 2,(Screen.Height-480) div 2, 480,459);
Caption:='Editor Options'; Caption:='Editor Options';
SynAutoComplete:=TSynEditAutoComplete.Create(Self); SynAutoComplete:=TSynEditAutoComplete.Create(Self);
@ -2708,7 +2770,7 @@ end;
procedure TEditorOptionsForm.SetupGeneralPage; procedure TEditorOptionsForm.SetupGeneralPage;
var MaxX,ChkBoxW:integer; var MaxX,ChkBoxW:integer;
begin begin
MaxX:=Width-9; MaxX:=Width-5;
ChkBoxW:=(MaxX-20) div 2; ChkBoxW:=(MaxX-20) div 2;
EditorOptionsGroupBox:=TGroupBox.Create(Self); EditorOptionsGroupBox:=TGroupBox.Create(Self);
@ -3105,7 +3167,7 @@ end;
procedure TEditorOptionsForm.SetupDisplayPage; procedure TEditorOptionsForm.SetupDisplayPage;
var MaxX,MaxY,ChkBoxW:integer; var MaxX,MaxY,ChkBoxW:integer;
begin begin
MaxX:=Width-9; MaxX:=Width-5;
MaxY:=375; MaxY:=375;
ChkBoxW:=140; ChkBoxW:=140;
@ -3479,16 +3541,16 @@ end;
procedure TEditorOptionsForm.SetupColorPage; procedure TEditorOptionsForm.SetupColorPage;
var a,MaxX,MaxY:integer; var a,MaxX,MaxY:integer;
begin begin
MaxX:=Width-9; MaxX:=Width-5;
MaxY:=375; MaxY:=377;
LanguageComboBox:=TComboBox.Create(Self); LanguageComboBox:=TComboBox.Create(Self);
with LanguageComboBox do begin with LanguageComboBox do begin
Name:='LanguageComboBox'; Name:='LanguageComboBox';
Parent:=MainNoteBook.Page[3]; Parent:=MainNoteBook.Page[3];
Top:=5; Top:=5;
Left:=80; Left:=75;
Width:=130; Width:=170;
Height:=20; Height:=20;
with Items do begin with Items do begin
BeginUpdate; BeginUpdate;
@ -3520,7 +3582,7 @@ begin
Name:='ColorSchemeComboBox'; Name:='ColorSchemeComboBox';
Parent:=MainNoteBook.Page[3]; Parent:=MainNoteBook.Page[3];
Top:=LanguageComboBox.Top; Top:=LanguageComboBox.Top;
Left:=LanguageComboBox.Left+LanguageComboBox.Width+120; Left:=LanguageComboBox.Left+LanguageComboBox.Width+110;
Width:=100; Width:=100;
Height:=20; Height:=20;
with Items do begin with Items do begin
@ -3554,7 +3616,7 @@ begin
Name:='FileExtensionsComboBox'; Name:='FileExtensionsComboBox';
Parent:=MainNoteBook.Page[3]; Parent:=MainNoteBook.Page[3];
Top:=ColorSchemeComboBox.Top+ColorSchemeComboBox.Height+4; Top:=ColorSchemeComboBox.Top+ColorSchemeComboBox.Height+4;
Left:=110; Left:=103;
Width:=310; Width:=310;
Height:=20; Height:=20;
Items.BeginUpdate; Items.BeginUpdate;
@ -3588,7 +3650,7 @@ begin
Parent:=MainNoteBook.Page[3]; Parent:=MainNoteBook.Page[3];
Top:=FileExtensionsComboBox.Top+FileExtensionsComboBox.Height+12; Top:=FileExtensionsComboBox.Top+FileExtensionsComboBox.Height+12;
Left:=5; Left:=5;
Width:=150; Width:=180;
Height:=16; Height:=16;
Caption:='Element'; Caption:='Element';
Visible:=true; Visible:=true;
@ -3781,7 +3843,7 @@ end;
procedure TEditorOptionsForm.SetupCodeToolsPage; procedure TEditorOptionsForm.SetupCodeToolsPage;
var MaxX:integer; var MaxX:integer;
begin begin
MaxX:=Width-9; MaxX:=Width-5;
AutomaticFeaturesGroupBox:=TGroupBox.Create(Self); AutomaticFeaturesGroupBox:=TGroupBox.Create(Self);
with AutomaticFeaturesGroupBox do begin with AutomaticFeaturesGroupBox do begin
@ -3799,9 +3861,10 @@ begin
with AutoCodeCompletionCheckBox do begin with AutoCodeCompletionCheckBox do begin
Name:='AutoCodeCompletionCheckBox'; Name:='AutoCodeCompletionCheckBox';
Parent:=AutomaticFeaturesGroupBox; Parent:=AutomaticFeaturesGroupBox;
Top:=5; Top:=2;
Left:=5; Left:=5;
Width:=200; Width:=200;
Height:=20;
Caption:='Code completion'; Caption:='Code completion';
Checked:=EditorOpts.AutoCodeCompletion; Checked:=EditorOpts.AutoCodeCompletion;
Enabled:=false; Enabled:=false;
@ -3812,7 +3875,7 @@ begin
with AutoCodeParametersCheckBox do begin with AutoCodeParametersCheckBox do begin
Name:='AutoCodeParametersCheckBox'; Name:='AutoCodeParametersCheckBox';
Parent:=AutomaticFeaturesGroupBox; Parent:=AutomaticFeaturesGroupBox;
Top:=AutoCodeCompletionCheckBox.Top+AutoCodeCompletionCheckBox.Height+20; Top:=AutoCodeCompletionCheckBox.Top+AutoCodeCompletionCheckBox.Height;
Left:=AutoCodeCompletionCheckBox.Left; Left:=AutoCodeCompletionCheckBox.Left;
Width:=AutoCodeCompletionCheckBox.Width; Width:=AutoCodeCompletionCheckBox.Width;
Height:=AutoCodeCompletionCheckBox.Height; Height:=AutoCodeCompletionCheckBox.Height;
@ -3826,7 +3889,7 @@ begin
with AutoToolTipExprEvalCheckBox do begin with AutoToolTipExprEvalCheckBox do begin
Name:='AutoToolTipExprEvalCheckBox'; Name:='AutoToolTipExprEvalCheckBox';
Parent:=AutomaticFeaturesGroupBox; Parent:=AutomaticFeaturesGroupBox;
Top:=AutoCodeParametersCheckBox.Top+AutoCodeParametersCheckBox.Height+20; Top:=AutoCodeParametersCheckBox.Top+AutoCodeParametersCheckBox.Height;
Left:=AutoCodeCompletionCheckBox.Left; Left:=AutoCodeCompletionCheckBox.Left;
Width:=AutoCodeCompletionCheckBox.Width; Width:=AutoCodeCompletionCheckBox.Width;
Height:=AutoCodeCompletionCheckBox.Height; Height:=AutoCodeCompletionCheckBox.Height;
@ -3840,7 +3903,7 @@ begin
with AutoToolTipSymbToolsCheckBox do begin with AutoToolTipSymbToolsCheckBox do begin
Name:='AutoToolTipSymbToolsCheckBox'; Name:='AutoToolTipSymbToolsCheckBox';
Parent:=AutomaticFeaturesGroupBox; Parent:=AutomaticFeaturesGroupBox;
Top:=AutoToolTipExprEvalCheckBox.Top+AutoToolTipExprEvalCheckBox.Height+20; Top:=AutoToolTipExprEvalCheckBox.Top+AutoToolTipExprEvalCheckBox.Height;
Left:=AutoCodeCompletionCheckBox.Left; Left:=AutoCodeCompletionCheckBox.Left;
Width:=AutoCodeCompletionCheckBox.Width; Width:=AutoCodeCompletionCheckBox.Width;
Height:=AutoCodeCompletionCheckBox.Height; Height:=AutoCodeCompletionCheckBox.Height;