diff --git a/applications/lazedit/EPlus.ini b/applications/lazedit/EPlus.ini
new file mode 100644
index 000000000..56ceb5887
--- /dev/null
+++ b/applications/lazedit/EPlus.ini
@@ -0,0 +1,59 @@
+[Editor]
+FontName=
+FontSize=0
+
+[MainForm]
+Left=634
+Top=143
+Width=575
+Height=418
+InitialDir=
+
+[NewHtmlDlg]
+Top=-1
+Left=-1
+InitialDir=
+
+[AnchorDlg]
+Top=-1
+Left=-1
+
+[CharMapDlg]
+Top=122
+Left=775
+
+[PictureDlg]
+Top=-1
+Left=-1
+InitialDir=
+DefaultFolderPrefix=
+
+[TableDlg]
+Top=-1
+Left=-1
+
+[RecentFiles]
+File_0=
+File_1=
+File_2=
+File_3=
+File_4=
+File_5=
+
+[FileTypes]
+eftNone=.txt
+eftHtml=.htm;.html;.xhtml;.xhtm;.htmlt;.hks;
+eftXml=.xml;.adfx
+eftCSS=.css;.csst
+eftJS=.js;.jst
+eftFpc=.pp;.pas;.inc;.lpr;.dpr;.lrs;.lpk;.dpk
+eftLfm=.lfm;.dfm
+eftC=.c;.cpp;.h;.hpp;.hh;.gcc;.cc;.c++
+eftPy=.py
+eftPhp=.php
+eftPerl=.pl
+eftUnixShell=.sh
+eftBat=.bat
+eftDiff=.diff;.patch
+eftIni=.ini;.conf;.cfg
+eftPo=.po
diff --git a/applications/lazedit/anchordlgform.lfm b/applications/lazedit/anchordlgform.lfm
new file mode 100644
index 000000000..6631149a4
--- /dev/null
+++ b/applications/lazedit/anchordlgform.lfm
@@ -0,0 +1,136 @@
+object AnchorDlgForm: TAnchorDlgForm
+ Left = 781
+ Height = 377
+ Top = 138
+ Width = 320
+ BorderStyle = bsDialog
+ Caption = 'Hyperlink'
+ ClientHeight = 377
+ ClientWidth = 320
+ OnShow = FormShow
+ LCLVersion = '0.9.31'
+ object OkBtn: TBitBtn
+ Left = 237
+ Height = 30
+ Top = 336
+ Width = 75
+ Default = True
+ DefaultCaption = True
+ Kind = bkOK
+ ModalResult = 1
+ TabOrder = 0
+ end
+ object CancelBtn: TBitBtn
+ Left = 152
+ Height = 30
+ Top = 336
+ Width = 75
+ Cancel = True
+ DefaultCaption = True
+ Kind = bkCancel
+ ModalResult = 2
+ TabOrder = 1
+ end
+ object Label1: TLabel
+ Left = 8
+ Height = 14
+ Top = 8
+ Width = 61
+ Caption = 'Omschrijving'
+ ParentColor = False
+ end
+ object DescrEdit: TEdit
+ Left = 8
+ Height = 21
+ Top = 24
+ Width = 304
+ TabOrder = 2
+ Text = 'DescrEdit'
+ end
+ object UrlLabel: TLabel
+ Left = 8
+ Height = 14
+ Top = 56
+ Width = 14
+ Caption = 'Url'
+ ParentColor = False
+ end
+ object UrlEdit: TEdit
+ Left = 8
+ Height = 21
+ Top = 72
+ Width = 304
+ TabOrder = 3
+ end
+ object AnchorTypeGroup: TRadioGroup
+ Left = 8
+ Height = 81
+ Top = 104
+ Width = 304
+ AutoFill = True
+ Caption = 'Type hyperlink'
+ ChildSizing.LeftRightSpacing = 6
+ ChildSizing.TopBottomSpacing = 6
+ ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+ ChildSizing.EnlargeVertical = crsHomogenousChildResize
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.ControlsPerLine = 1
+ ClientHeight = 63
+ ClientWidth = 300
+ ItemIndex = 0
+ Items.Strings = (
+ 'Url'
+ 'Lokaal anker maken'
+ 'Naar lokaal anker verwijzen'
+ )
+ OnClick = AnchorTypeGroupClick
+ TabOrder = 4
+ end
+ object Label3: TLabel
+ Left = 8
+ Height = 14
+ Top = 192
+ Width = 21
+ Caption = 'Titel'
+ ParentColor = False
+ end
+ object TitleEdit: TEdit
+ Left = 8
+ Height = 21
+ Top = 208
+ Width = 304
+ TabOrder = 5
+ end
+ object Label4: TLabel
+ Left = 8
+ Height = 14
+ Top = 240
+ Width = 12
+ Caption = 'ID'
+ ParentColor = False
+ end
+ object IdEdit: TEdit
+ Left = 8
+ Height = 21
+ Top = 256
+ Width = 304
+ TabOrder = 6
+ end
+ object Label5: TLabel
+ Left = 8
+ Height = 14
+ Top = 288
+ Width = 26
+ Caption = 'Class'
+ ParentColor = False
+ end
+ object ClassEdit: TEdit
+ Left = 8
+ Height = 21
+ Top = 304
+ Width = 304
+ TabOrder = 7
+ end
+end
diff --git a/applications/lazedit/anchordlgform.pp b/applications/lazedit/anchordlgform.pp
new file mode 100644
index 000000000..7fc5bc198
--- /dev/null
+++ b/applications/lazedit/anchordlgform.pp
@@ -0,0 +1,144 @@
+unit AnchorDlgForm;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons,
+ StdCtrls, ExtCtrls, HtmlCode;
+
+type
+
+ TAnchorType = (atUrl, atMakeLocalAnchor, atRefLocalAnchor);
+
+ { TAnchorDlgForm }
+
+ TAnchorDlgForm = class(TForm)
+ CancelBtn: TBitBtn;
+ DescrEdit: TEdit;
+ AnchorTypeGroup: TRadioGroup;
+ ClassEdit: TEdit;
+ IdEdit: TEdit;
+ Label4: TLabel;
+ Label5: TLabel;
+ TitleEdit: TEdit;
+ Label3: TLabel;
+ UrlEdit: TEdit;
+ Label1: TLabel;
+ UrlLabel: TLabel;
+ OkBtn: TBitBtn;
+ procedure AnchorTypeGroupClick(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ private
+ { private declarations }
+ function GetAnchorType: TAnchorType;
+ function GetDescription: String;
+ function GetDomClass: String;
+ function GetDomId: String;
+ function GetTitle: String;
+ function GetUrl: String;
+ procedure SetDescription(AValue: String);
+ procedure SetDomClass(AValue: String);
+ procedure SetDomId(AValue: String);
+ procedure SetTitle(AValue: String);
+ procedure SetUrl(AValue: String);
+ public
+ { public declarations }
+ property AnchorType: TAnchorType read GetAnchorType;
+ property Description: String read GetDescription write SetDescription;
+ property Url: String read GetUrl write SetUrl;
+ property Title: String read GetTitle write SetTitle;
+ property DomId: String read GetDomId write SetDomId;
+ property DomClass: String read GetDomClass write SetDomClass;
+ end;
+
+
+implementation
+
+{$R *.lfm}
+
+const
+ idxUrl = 0;
+ idxMakeLocalAnchor = 1;
+ idxRefLocalAnchor = 2;
+
+{ TAnchorDlgForm }
+
+procedure TAnchorDlgForm.AnchorTypeGroupClick(Sender: TObject);
+begin
+ case AnchorTypeGroup.ItemIndex of
+ idxUrl: UrlLabel.Caption := 'Url';
+ idxMakeLocalAnchor: UrlLabel.Caption := 'Anker naam';
+ idxRefLocalAnchor: UrlLabel.Caption := 'Anker naam';
+ else UrlLabel.Caption := 'Url';
+ end;
+end;
+
+procedure TAnchorDlgForm.FormShow(Sender: TObject);
+begin
+ ActiveControl := DescrEdit;
+end;
+
+function TAnchorDlgForm.GetAnchorType: TAnchorType;
+begin
+ case AnchorTypeGroup.ItemIndex of
+ idxUrl: Result := atUrl;
+ idxMakeLocalAnchor: Result := atMakeLocalAnchor;
+ idxRefLocalAnchor: Result := atRefLocalAnchor;
+ else Result := atUrl;
+ end;
+end;
+
+function TAnchorDlgForm.GetDescription: String;
+begin
+ Result := DescrEdit.Text;
+end;
+
+function TAnchorDlgForm.GetDomClass: String;
+begin
+ Result := ClassEdit.Text;
+end;
+
+function TAnchorDlgForm.GetDomId: String;
+begin
+ Result := IdEdit.Text;
+end;
+
+function TAnchorDlgForm.GetTitle: String;
+begin
+ Result := TitleEdit.Text;
+end;
+
+function TAnchorDlgForm.GetUrl: String;
+begin
+ Result := UrlEscape(UrlEdit.Text);
+end;
+
+procedure TAnchorDlgForm.SetDescription(AValue: String);
+begin
+ DescrEdit.Text := AValue;
+end;
+
+procedure TAnchorDlgForm.SetDomClass(AValue: String);
+begin
+ ClassEdit.Text := AValue;
+end;
+
+procedure TAnchorDlgForm.SetDomId(AValue: String);
+begin
+ IdEdit.Text := AValue;
+end;
+
+procedure TAnchorDlgForm.SetTitle(AValue: String);
+begin
+ TitleEdit.Text := AValue;
+end;
+
+procedure TAnchorDlgForm.SetUrl(AValue: String);
+begin
+ UrlEdit.Text := AValue;
+end;
+
+end.
+
diff --git a/applications/lazedit/copyleft.pp b/applications/lazedit/copyleft.pp
new file mode 100644
index 000000000..c12f8dfca
--- /dev/null
+++ b/applications/lazedit/copyleft.pp
@@ -0,0 +1,59 @@
+unit CopyLeft;
+
+{
+ EPlus: a text editor with built-in features for HTML editing and
+ Syntax Highlighting for several text formats
+ (html, xml, css, javascript, pascal, c/c++, perl, python, php, bat, ini, diff)
+
+ Copyright (C) 2011 by Bart Broersma & Flying Sheep Inc.
+ http://home.tiscali.nl/~knmg0017/software.htm
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+
+{$mode objfpc}{$H+}
+
+interface
+
+//uses GPL;
+
+const
+ AppName = 'EPlus';
+ AboutTitle = 'Over ' + AppName;
+ AppVersion = 'Versie 1.0.0 RC1';
+ CopyLeftStatement = 'Copyright (c) 2011, 2012 by Bart Broersma & FlyingSheep Inc.';
+ MetaGeneratorName = AppName + #32 + AppVersion + ' by Bart Broersma and Flying Sheep Inc.';
+ AuthorWebName = 'Bart & Mariska''s Webstek';
+ AuthorWebUrl = 'http://home.tiscali.nl/~knmg0017/';
+ LicenseText = ''; //LGPL_Text;
+ LicenseUrl = '';//LGPL_Url;
+ LicenseName = 'Gnu LGPL';
+
+implementation
+
+end.
+
diff --git a/applications/lazedit/editorpagecontrol.pp b/applications/lazedit/editorpagecontrol.pp
new file mode 100644
index 000000000..8be63c3ca
--- /dev/null
+++ b/applications/lazedit/editorpagecontrol.pp
@@ -0,0 +1,1068 @@
+{ EditorPageControl unit
+
+ Copyright (C) 2012 by Bart Broersma & Flying Sheep Inc.
+ http://home.tiscali.nl/~knmg0017/
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+unit EditorPageControl;
+
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, Controls, Graphics, {StdCtrls,} ComCtrls, Types, LCLProc, LclType, StrUtils,
+ FileUtil, Forms {for Application object needed in TEditorPageControl.ClosePage()}, Menus,
+ SynEdit, {SynMemo,} SynEditTypes, SynEditHighlighter,
+ SynGutter, {SynGutterMarks,} SynGutterChanges, SynGutterLineNumber, {SynGutterCodeFolding,}
+ SynHighlighterPas, SynHighlighterCpp, SynHighlighterPerl, SynHighlighterHTML, SynHighlighterXML,
+ SynHighlighterLFM, SynHighlighterDiff, SynHighlighterCss, SynHighlighterPHP,
+ SynHighlighterPython, SynHighlighterBat, SynHighlighterIni, SynHighlighterJava,
+ SynHighlighterUnixShellScript, SynHighLighterPo,
+ SynEditMouseCmds, SynEditKeyCmds,
+ EPlus_Commons;
+
+
+
+
+
+type
+
+ TEditorPageControl = class; //forward declaration
+ TEditor = class;
+
+ { TEditorOptions }
+
+ TEditorOptions = record
+ FontName: String;
+ FontSize: Integer;
+ end;
+
+ TEditorCharsetChangedEvent = procedure(Sender: TEditor; const OldCharSet, NewCharSet: String; const LineNr: Integer) of object;
+
+ TEditor = class(TSynEdit)
+ private
+ FFileName: String;
+ FPage: TTabSheet; //the designated parent and owner of a TEditor
+ FEditorPageControl: TEditorPageControl;
+ FEditorOptions: TEditorOptions;
+ FFileType: TEditorFileType;
+ FFileMaskList: TFileTypeMaskList;
+ FAutoFiletypeDetection: Boolean;
+ FNoFileTypeChangeOnSave: Boolean;
+ FOnCharsetChanged: TEditorCharsetChangedEvent;
+ procedure SetAutoFiletypeDetection(AValue: Boolean);
+ procedure SetEditorOptions(AValue: TEditorOptions);
+ procedure UpdateEditorOptions(Sender: TObject);
+ procedure SetFileName(const Utf8Fn: String; const UpdateFileType: Boolean);
+ function ExtToFileType(const Ext: String): TEditorFileType;
+ function GuessFileType: TEditorFileType;
+ function GuessSyntaxFromString(S: String): TEditorFileType;
+ procedure SetFileType(AFileType: TEditorFileType);
+ procedure AdjustEncoding;
+ procedure SetDefaultGutterParts;
+ procedure SetDefaultMouseActions;
+ protected
+ procedure DoCharsetChanged(const OldCharset, NewCharset: String; const LineNr: Integer);
+ property OnCharsetChanged: TEditorCharsetChangedEvent read FOnCharsetChanged write FOnCharsetChanged;
+ property FileMaskList: TFileTypeMaskList read FFileMaskList write FFileMaskList;
+ property EditorOptions: TEditorOptions read FEditorOptions write SetEditorOptions;
+ public
+ procedure SetDefaultKeyStrokes; override; // is public in parent class
+ procedure LoadFromFileAnsi(const AnsiFn: String; const AsTemplate: Boolean = False);
+ procedure LoadFromFileUtf8(const Utf8Fn: String; const AsTemplate: Boolean = False);
+ procedure SaveToFileAnsi(const AnsiFn: String);
+ procedure SaveToFileUtf8(const Utf8Fn: String);
+ procedure SetHighlighterByFileType(const AFileType: TEditorFileType; const Permanent: Boolean = False);
+ procedure MarkSelection(const Pre, Post: String);
+
+ constructor Create(TheOwner: TComponent); override;
+ destructor Destroy; override;
+
+ property FileName: String read FFileName; //in UTF-8 encoding
+ property FileType: TEditorFileType read FFileType write SetFileType;
+ property AutoFileTypeDetection: Boolean read FAutoFiletypeDetection write SetAutoFiletypeDetection default True;
+
+ end;
+
+const
+ scFileName = scReadOnly; //Use this for FileName changes
+ scAll = [scCaretX,scCaretY,scModified,scInsertMode,scFileName];
+
+type
+
+ { TEditorPageControl }
+
+ TCloseEditorEvent = procedure(Sender: TTabSheet; var Cancel: Boolean) of object;
+
+ THighLighterArray = Array[TEditorFileType] of TSynCustomHighlighter;
+
+ TEditorPageControl = class(TPageControl)
+ private
+ FCounter: Cardinal;
+ FHighLighters: THighlighterArray;
+ FFileTypeMaskList: TFileTypeMaskList;
+ FEditorOptions: TEditorOptions;
+ FEditorPopupMenu: TPopupMenu;
+ FOnStatusChange: TStatusChangeEvent;
+ FOnBeforeCloseEditor: TCloseEditorEvent;
+ FOnEditorCharsetChanged: TEditorCharsetChangedEvent;
+ function GetCurrentEditor: TEditor;
+ function GetHighLighter(Index: TEditorFileType): TSynCustomHighlighter;
+ function GetFileTypeMaskLists(Index: TEditorFileType): String;
+ procedure SetEditorOptions(AValue: TEditorOptions);
+ function GetEditorOptions: TEditorOptions;
+ procedure SetFileTypeMaskLists(Index: TEditorFileType; AValue: string);
+ procedure SetPopupMenu(AValue: TPopupMenu);
+ procedure UpdateEditorFileMasks;
+ procedure UpdateEditorOptions(Sender: TObject);
+ procedure UpdateEditorPopupMenu;
+ //Called internally by the editor, by AddPage, DoChange and if PageCount becomes 0
+ procedure InternalEditorStatusChange(Sender: TObject; Changes: TSynStatusChanges);
+ procedure InternalEditorCharsetChange(Sender: TEditor; const OldCharSet, NewCharSet: String; const LineNr: Integer);
+ protected
+ procedure DoChange; override;
+
+ //procedure RemovePage(Index: Integer); override;
+ //procedure DoCloseTabClicked(APage: TCustomPage); override;
+ property HighLighters[Index: TEditorFileType]: TSynCustomHighlighter read GetHighLighter;
+ //property FileTypeMaskList: TFileTypeMaskList read FFileTypeMaskList write SetFiletypeMaskList;
+ public
+ function AddPage: TEditor;
+ function ClosePage(Index: Integer): Boolean;
+ function EditorAtPage(const Index: Integer): TEditor;
+ function EditorAtPage(const APage: TTabSheet): TEditor;
+
+ constructor Create(TheOwner: TComponent); override;
+ destructor Destroy; override;
+
+ property CurrentEditor: TEditor read GetCurrentEditor;
+ //setting FileTypeMaskLists[eftNone] results in any file with such an extension treated as eftNone (and no therefore Highlighting)
+ property FileTypeMaskLists[Index: TEditorFileType]: string read GetFileTypeMaskLists write SetFileTypeMaskLists;
+ property EditorOptions: TEditorOptions read GetEditorOptions write SetEditorOptions;
+ property OnStatusChange: TStatusChangeEvent read FonStatusChange write FOnStatusChange;
+ property OnBeforeCloseEditor: TCloseEditorEvent read FOnBeforeCloseEditor write FOnBeforeCloseEditor;
+ property OnEditorCharsetChange: TEditorCharsetChangedEvent read FOnEditorCharsetChanged write FOnEditorCharsetChanged;
+ property EditorPopUpmenu: TPopupMenu read FEditorPopupMenu write SetPopupMenu;
+ end;
+
+
+
+const
+ EmptyStr = '';
+ NoName = 'Naamloos';
+
+implementation
+
+
+function DefaultEditorOptions: TEditorOptions;
+begin
+ Result.FontName := '';
+ Result.FontSize := 0;
+end;
+
+function EditorOptionsAreDifferent(const New, Old: TEditorOptions): Boolean;
+begin
+ Result := (New.FontName <> Old.FontName) or
+ (New.FontSize <> Old.FontSize);
+end;
+
+function FindInMaskList(const Ext, MaskList: String): Boolean;
+var
+ SL: TStringList;
+ i: Integer;
+begin
+ Result := False;
+ if (Length(Ext) = 0) or (Length(MaskList) = 0) then Exit;
+ SL := TStringList.Create;
+ try
+ SL.StrictDelimiter := True;
+ SL.Delimiter := ';';
+ SL.CaseSensitive := False;
+ SL.Duplicates := dupAccept;
+ SL.DelimitedText := Trim(MaskList);
+ for i := 0 to SL.Count - 1 do
+ begin
+ if CompareText(Ext, SL.Strings[i]) = 0 then
+ begin
+ Result := True;
+ Break;
+ end;
+ end;
+ finally
+ SL.Free;
+ end;
+end;
+
+
+
+{TEditor}
+
+procedure TEditor.SetFileName(const Utf8Fn: String; const UpdateFileType: Boolean);
+begin
+ //debugln('TEditor.SetFileName: Utf8Fn = ',Utf8ToSys(Utf8Fn));
+ if (FFileName = Utf8Fn) then Exit;
+ FFileName := Utf8Fn;
+ if Assigned(FPage) then
+ begin
+ if (Utf8Fn <> EmptyStr) then
+ FPage.Caption := ExtractFileName(Utf8Fn)
+ else
+ FPage.Caption := NoName;
+ //Debugln('TEditor.SetFileName: setting FPageCaption to ',FPage.Caption);
+ end;
+ //debugln('TEditor.SetFileName: calling DoOnStatusChange(scAll)');
+ //Unless you change ReadOnly, the scFileName will be removed from Changes in TSynEdit.DoOnStatuschange
+ ReadOnly := True;
+ DoOnStatusChange(scAll);
+ ReadOnly := false;
+ //debugln('TEditor.SetFileName: setting FileType');
+ if UpdateFileType then FileType := GuessFileType
+ else FileType := eftNone;
+ //debugln('TEditor.SetFileName: End');
+end;
+
+procedure TEditor.SetAutoFiletypeDetection(AValue: Boolean);
+begin
+ if FAutoFiletypeDetection = AValue then exit;
+ FAutoFiletypeDetection := AValue;
+ if AValue then FNoFileTypeChangeOnSave := False;
+end;
+
+procedure TEditor.SetEditorOptions(AValue: TEditorOptions);
+begin
+ if EditorOptionsAreDifferent(AValue, FEditorOptions) then
+ begin
+ FEditorOptions := AValue;
+ UpdateEditorOptions(Self);
+ end;
+end;
+
+procedure TEditor.UpdateEditorOptions(Sender: TObject);
+begin
+ //ToDo
+ if FEditorOptions.FontName <> '' then
+ begin
+ Font.Name := FEditorOptions.FontName;
+ Font.Pitch := fpFixed;
+ end;
+ if (FEditorOptions.FontSize <> Font.Size) and (FEditorOptions.FontSize <> 0) then Font.Size := FEditorOptions.FontSize;
+end;
+
+function TEditor.ExtToFileType(const Ext: String): TEditorFileType;
+var
+ Index: TEditorFileType;
+begin
+ //DebugLn('TEditor.ExtToFileType: Ext = "',Ext,'"');
+ Result := eftNone;
+ if (Length(Ext) = 0) then Exit;
+ for Index := Low(TEditorFileType) to High(TEditorFileType) do
+ begin
+ if FindInMaskList(Ext, FileMaskList[Index]) then
+ begin
+ Result := Index;
+ Exit;
+ end;
+ end;
+ //Debugln('TEditor.ExtToFileType: Result = ',eftNames[Result]);
+ //DebugLn('TEditor.ExtToFileType: End');
+end;
+
+function TEditor.GuessSyntaxFromString(S: String): TEditorFileType;
+const
+ Shebang = '#!';
+begin
+ //Debugln('TEditor.GuessSyntaxFromString, S = "',S,'"');
+ Result := eftNone;
+ S := TrimLeft(S);
+ if (Pos(Shebang,S) = 1) and ((Pos('/bin/bash',S) > 0) or (Pos('/bin/sh',S) > 0)) then Result := eftUnixShell
+ else if (Pos(Shebang,S) = 1) and (Pos('/perl',S) > 0) then Result := eftPerl
+ else if Pos(' eftNone) then Break;
+ Inc(i);
+ end;
+ end;
+ //DebugLn('TEditor.GuessFileType End');
+end;
+
+procedure TEditor.SetFileType(AFileType: TEditorFileType);
+begin
+ //DebugLn('TEditor.SetFileType A');
+ //DebugLn(Format('FileName = %s, FileType is set to %s',[ExtractFileName(FFileName),eftNames[AFileType]]));
+ if AFileType <> FFileType then
+ begin
+ FFileType := AFileType;
+ SetHighlighterByFileType(AFileType);
+ end;
+ //DebugLn('TEditor.SetFileType End');
+end;
+
+procedure TEditor.AdjustEncoding;
+//Search first 50 lines for character encosing metat tag and change to UTF-8 if necessary
+//the tag is in the form of:
+//This only works if the meta tag is the first meta-tag on the line
+var
+ LineNr: Integer;
+ S: String;
+ p, CharsetStart, CharsetEnd: SizeInt;
+ OldCharset: String;
+const
+ MaxLinesToScan = 5000;
+begin
+ //DebugLn('TEditor.AdjustEncoding A');
+ LineNr := 0;
+ while (LineNr < Lines.Count) and (LineNr < MaxLinesToScan) do
+ begin
+ //DbgOut('[',Dbgs(LineNr),'] ');
+ S := {Utf8}UpperCase(Lines[LineNr]); //no need for utf8, this meta-tag can only contain lower ascii
+ p := Pos(' 0) then
+ begin
+ //DbgOut('meta ');
+ //check for closing tag, but do not store value in p, we need the current value of p later on
+ if (PosEx('>',S, p + 1) > 0) then
+ begin
+ //DbgOut('">" ');
+ p := PosEx('"CONTENT-TYPE"',S, p + 1);
+ if (p > 0) then
+ begin
+ //DbgOut('content-type ');
+ p := PosEx('CONTENT',S, p + 1);
+ if (p > 0) then
+ begin
+ //DbgOut('content ');
+ p := PosEx('CHARSET',S, p + 1);
+ if (p > 0) then
+ begin
+ //DbgOut('charset ');
+ p := PosEx('=',S, p + 1);
+ if (p > 0) then
+ begin
+ //DbgOut('=');
+ CharsetStart := p + 1;
+ p := PosEx('"',S, CharsetStart);
+ if p = 0 then p := PosEx(';',S, CharSetStart);
+ if (p > 0) then
+ begin
+ CharsetEnd := p;
+ OldCharset := Copy(S,CharsetStart,CharSetEnd - CharSetStart);
+ //DebugLn('Current charset is ',OldCharSet,' (LineNr = ',DbgS(LineNr),')');
+ if CompareText(Trim(OldCharSet),'utf-8') <> 0 then
+ begin
+ //DebugLn('Changing charset to utf-8');
+ TextBetweenPoints[Point(CharsetStart,LineNr+1),Point(CharSetEnd,LineNr+1)] := 'utf-8';
+ DoCharsetChanged(OldCharSet, 'utf-8', LineNr);
+ end;
+ Break;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ Inc(LineNr);
+ //DebugLn;
+ end;
+ //DebugLn('TEditor.AdjustEncoding End');
+end;
+
+procedure TEditor.SetDefaultKeyStrokes;
+
+ procedure AddKey(const ACmd: TSynEditorCommand; const AKey: word;
+ const AShift: TShiftState);
+ begin
+ with KeyStrokes.Add do
+ begin
+ Key := AKey;
+ Shift := AShift;
+ Command := ACmd;
+ end;
+ end;
+
+begin
+ KeyStrokes.Clear;
+
+ AddKey(ecUp, VK_UP, []);
+ AddKey(ecSelUp, VK_UP, [ssShift]);
+ AddKey(ecScrollUp, VK_UP, [ssCtrl]);
+ AddKey(ecDown, VK_DOWN, []);
+ AddKey(ecSelDown, VK_DOWN, [ssShift]);
+ AddKey(ecScrollDown, VK_DOWN, [ssCtrl]);
+ AddKey(ecLeft, VK_LEFT, []);
+ AddKey(ecSelLeft, VK_LEFT, [ssShift]);
+ AddKey(ecWordLeft, VK_LEFT, [ssCtrl]);
+ AddKey(ecSelWordLeft, VK_LEFT, [ssShift,ssCtrl]);
+ AddKey(ecRight, VK_RIGHT, []);
+ AddKey(ecSelRight, VK_RIGHT, [ssShift]);
+ AddKey(ecWordRight, VK_RIGHT, [ssCtrl]);
+ AddKey(ecSelWordRight, VK_RIGHT, [ssShift,ssCtrl]);
+ AddKey(ecPageDown, VK_NEXT, []);
+ AddKey(ecSelPageDown, VK_NEXT, [ssShift]);
+ AddKey(ecPageBottom, VK_NEXT, [ssCtrl]);
+ AddKey(ecSelPageBottom, VK_NEXT, [ssShift,ssCtrl]);
+ AddKey(ecPageUp, VK_PRIOR, []);
+ AddKey(ecSelPageUp, VK_PRIOR, [ssShift]);
+ AddKey(ecPageTop, VK_PRIOR, [ssCtrl]);
+ AddKey(ecSelPageTop, VK_PRIOR, [ssShift,ssCtrl]);
+ AddKey(ecLineStart, VK_HOME, []);
+ AddKey(ecSelLineStart, VK_HOME, [ssShift]);
+ AddKey(ecEditorTop, VK_HOME, [ssCtrl]);
+ AddKey(ecSelEditorTop, VK_HOME, [ssShift,ssCtrl]);
+ AddKey(ecLineEnd, VK_END, []);
+ AddKey(ecSelLineEnd, VK_END, [ssShift]);
+ AddKey(ecEditorBottom, VK_END, [ssCtrl]);
+ AddKey(ecSelEditorBottom, VK_END, [ssShift,ssCtrl]);
+ AddKey(ecToggleMode, VK_INSERT, []);
+ AddKey(ecCopy, VK_INSERT, [ssCtrl]);
+ AddKey(ecPaste, VK_INSERT, [ssShift]);
+ AddKey(ecDeleteChar, VK_DELETE, []);
+ AddKey(ecCut, VK_DELETE, [ssShift]);
+ AddKey(ecDeleteLastChar, VK_BACK, []);
+ AddKey(ecDeleteLastChar, VK_BACK, [ssShift]); //jr 2000-09-23
+ AddKey(ecDeleteLastWord, VK_BACK, [ssCtrl]);
+ AddKey(ecUndo, VK_BACK, [ssAlt]);
+ AddKey(ecRedo, VK_BACK, [ssAlt,ssShift]);
+ AddKey(ecLineBreak, VK_RETURN, []);
+ AddKey(ecSelectAll, ord('A'), [ssCtrl]);
+ AddKey(ecCopy, ord('C'), [ssCtrl]);
+ AddKey(ecBlockIndent, ord('I'), [ssCtrl,ssShift]);
+ AddKey(ecLineBreak, ord('M'), [ssCtrl]);
+ //AddKey(ecInsertLine, ord('N'), [ssCtrl]);
+ AddKey(ecDeleteWord, ord('T'), [ssCtrl]);
+ AddKey(ecBlockUnindent, ord('U'), [ssCtrl,ssShift]);
+ AddKey(ecPaste, ord('V'), [ssCtrl]);
+ AddKey(ecCut, ord('X'), [ssCtrl]);
+ AddKey(ecDeleteLine, ord('Y'), [ssCtrl]);
+ AddKey(ecDeleteEOL, ord('Y'), [ssCtrl,ssShift]);
+ AddKey(ecUndo, ord('Z'), [ssCtrl]);
+ AddKey(ecRedo, ord('Z'), [ssCtrl,ssShift]);
+ //AddKey(ecGotoMarker0, ord('0'), [ssCtrl]);
+ //AddKey(ecGotoMarker1, ord('1'), [ssCtrl]);
+ //AddKey(ecGotoMarker2, ord('2'), [ssCtrl]);
+ //AddKey(ecGotoMarker3, ord('3'), [ssCtrl]);
+ //AddKey(ecGotoMarker4, ord('4'), [ssCtrl]);
+ //AddKey(ecGotoMarker5, ord('5'), [ssCtrl]);
+ //AddKey(ecGotoMarker6, ord('6'), [ssCtrl]);
+ //AddKey(ecGotoMarker7, ord('7'), [ssCtrl]);
+ //AddKey(ecGotoMarker8, ord('8'), [ssCtrl]);
+ //AddKey(ecGotoMarker9, ord('9'), [ssCtrl]);
+ //AddKey(ecSetMarker0, ord('0'), [ssCtrl,ssShift]);
+ //AddKey(ecSetMarker1, ord('1'), [ssCtrl,ssShift]);
+ //AddKey(ecSetMarker2, ord('2'), [ssCtrl,ssShift]);
+ //AddKey(ecSetMarker3, ord('3'), [ssCtrl,ssShift]);
+ //AddKey(ecSetMarker4, ord('4'), [ssCtrl,ssShift]);
+ //AddKey(ecSetMarker5, ord('5'), [ssCtrl,ssShift]);
+ //AddKey(ecSetMarker6, ord('6'), [ssCtrl,ssShift]);
+ //AddKey(ecSetMarker7, ord('7'), [ssCtrl,ssShift]);
+ //AddKey(ecSetMarker8, ord('8'), [ssCtrl,ssShift]);
+ //AddKey(ecSetMarker9, ord('9'), [ssCtrl,ssShift]);
+ //AddKey(ecFoldLevel1, ord('1'), [ssAlt,ssShift]);
+ //AddKey(ecFoldLevel2, ord('2'), [ssAlt,ssShift]);
+ //AddKey(ecFoldLevel3, ord('3'), [ssAlt,ssShift]);
+ //AddKey(ecFoldLevel4, ord('4'), [ssAlt,ssShift]);
+ //AddKey(ecFoldLevel5, ord('5'), [ssAlt,ssShift]);
+ //AddKey(ecFoldLevel6, ord('6'), [ssAlt,ssShift]);
+ //AddKey(ecFoldLevel7, ord('7'), [ssAlt,ssShift]);
+ //AddKey(ecFoldLevel8, ord('8'), [ssAlt,ssShift]);
+ //AddKey(ecFoldLevel9, ord('9'), [ssAlt,ssShift]);
+ //AddKey(ecFoldLevel0, ord('0'), [ssAlt,ssShift]);
+ //AddKey(ecFoldCurrent, ord('-'), [ssAlt,ssShift]);
+ //AddKey(ecUnFoldCurrent, ord('+'), [ssAlt,ssShift]);
+ AddKey(EcToggleMarkupWord, ord('M'), [ssAlt]);
+ AddKey(ecNormalSelect, ord('N'), [ssAlt,ssShift]); //changed Ctrl -> Alt
+ AddKey(ecColumnSelect, ord('C'), [ssAlt,ssShift]); //changed Ctrl -> Alt
+ AddKey(ecLineSelect, ord('L'), [ssCtrl,ssShift]);
+ AddKey(ecTab, VK_TAB, []);
+ AddKey(ecShiftTab, VK_TAB, [ssShift]);
+ AddKey(ecMatchBracket, ord('B'), [ssCtrl,ssShift]);
+
+ AddKey(ecColSelUp, VK_UP, [ssAlt, ssShift]);
+ AddKey(ecColSelDown, VK_DOWN, [ssAlt, ssShift]);
+ AddKey(ecColSelLeft, VK_LEFT, [ssAlt, ssShift]);
+ AddKey(ecColSelRight, VK_RIGHT, [ssAlt, ssShift]);
+ AddKey(ecColSelPageDown, VK_NEXT, [ssAlt, ssShift]);
+ AddKey(ecColSelPageBottom, VK_NEXT, [ssAlt, ssShift,ssCtrl]);
+ AddKey(ecColSelPageUp, VK_PRIOR, [ssAlt, ssShift]);
+ AddKey(ecColSelPageTop, VK_PRIOR, [ssAlt, ssShift,ssCtrl]);
+ AddKey(ecColSelLineStart, VK_HOME, [ssAlt, ssShift]);
+ AddKey(ecColSelLineEnd, VK_END, [ssAlt, ssShift]);
+ AddKey(ecColSelEditorTop, VK_HOME, [ssAlt, ssShift,ssCtrl]);
+ AddKey(ecColSelEditorBottom, VK_END, [ssAlt, ssShift,ssCtrl]);
+end;
+
+procedure TEditor.SetDefaultGutterParts;
+begin
+ Gutter.Parts.Clear;
+ with TSynGutterLineNumber.Create(Gutter.Parts) do
+ Name := 'SynGutterLineNumber1';
+ with TSynGutterChanges.Create(Gutter.Parts) do
+ Name := 'SynGutterChanges1';
+ with TSynGutterSeparator.Create(Gutter.Parts) do
+ Name := 'SynGutterSeparator1';
+end;
+
+procedure TEditor.SetDefaultMouseActions;
+var
+ i: Integer;
+ MA: TSynEditMouseAction;
+begin
+ //Remove SourceLink MouseAction
+ for i := 0 to MouseActions.Count - 1 do
+ begin
+ MA := MouseActions.Items[i];
+ if (MA.Command = emcMouseLink) then
+ begin
+ //DebugLn('Deleting MouseAction:',MA.DisplayName);
+ MouseActions.Delete(i);
+ Break;
+ end;
+ end;
+end;
+
+procedure TEditor.DoCharsetChanged(const OldCharset, NewCharset: String; const LineNr: Integer);
+begin
+ if Assigned(FOnCharsetChanged) then FOnCharsetChanged(Self, OldCharset, NewCharset, LineNr);
+end;
+
+
+//SynEdit deafults to UTF8 filenames when using LoadFromFile !!
+procedure TEditor.LoadFromFileAnsi(const AnsiFn: String; const AsTemplate: Boolean = False);
+begin
+ LoadFromFileUtf8(SysToUtf8(AnsiFn), AsTemplate);
+end;
+
+procedure TEditor.LoadFromFileUtf8(const Utf8Fn: String; const AsTemplate: Boolean = False);
+begin
+ //DebugLn('TEditor.LoadFromFile: Utf8Fn = ',Utf8ToSys(Utf8Fn));
+ try
+ Lines.LoadFromFile(Utf8Fn);
+ Modified := False;
+ FNoFileTypeChangeOnSave := False;
+ SetFileName(Utf8Fn, AutoFileTypeDetection);
+ if AsTemplate then
+ begin//blank out internal filename and update caption
+ FFileName := EmptyStr;
+ if Assigned(FPage) then FPage.Caption := NoName;
+ DoOnStatusChange([scFileName]);
+ end;
+ //DebugLn('TEditor.LoadFromFile: FileType = ',eftNames[FileType]);
+ if (FileType = eftHtml) then AdjustEncoding;
+ except
+ SetFileName(EmptyStr, AutoFileTypeDetection);
+ Modified := True;
+ Raise;
+ end;
+ //DebugLn('TEditor.LoadFromFile End');
+end;
+
+
+procedure TEditor.SaveToFileAnsi(const AnsiFn: String);
+begin
+ SaveToFileAnsi(SysToUtf8(AnsiFn));
+end;
+
+procedure TEditor.SaveToFileUtf8(const Utf8Fn: String);
+begin
+ try
+ Lines.SaveToFile(Utf8Fn);
+ Modified := False;
+ SetFileName(Utf8Fn, AutoFileTypeDetection and (not FNoFileTypeChangeOnSave));
+ except
+ Modified := True;
+ SetFileName(EmptyStr, AutoFileTypeDetection and (not FNoFileTypeChangeOnSave));
+ Raise;
+ end;
+end;
+
+procedure TEditor.SetHighlighterByFileType(const AFileType: TEditorFileType; const Permanent: Boolean = False);
+begin
+ if Assigned(FEditorPageControl) then
+ begin
+ Highlighter := FEditorPageControl.HighLighters[AFileType];
+ if Permanent then FNoFileTypeChangeOnSave := True;
+ end;
+end;
+
+procedure TEditor.MarkSelection(const Pre, Post: String);
+var
+ SLen: Integer;
+ OldSelMode: TSynSelectionMode;
+begin
+ {
+ //This method makes no sense when we are in Colomn selection mode
+ if SelAvail and (SelectionMode = smColumn) then Exit;
+ }
+ //this only works with SelectionMode := scNormal
+ OldSelMode := SelectionMode;
+ SelectionMode := smNormal;
+ //Using SelEnd - SelStart doesn't work correctly when selecting across lines
+ SLen := Utf8Length(Seltext); //SelStart - SelEnd;
+ SelText := Pre + SelText + Post;
+ //SelStart now is after Post, place it before the original selection
+ SelStart := SelStart - Utf8Length(Post) - SLen;
+ SelEnd := SelStart + SLen;
+ SelectionMode := OldSelMode;
+ SetFocus;
+end;
+
+constructor TEditor.Create(TheOwner: TComponent);
+begin
+ inherited Create(TheOwner);
+ FFileName := '';
+ FPage := nil;
+ FEditorPageControl := nil;
+ FFileType := eftNone;
+ FAutoFiletypeDetection := True;
+ FNoFileTypeChangeOnSave := False;
+ FEditorOptions := DefaultEditorOptions;
+ SetDefaultKeyStrokes;
+ SetDefaultMouseActions;
+ SetDefaultGutterParts;
+ //UpdateEditorOptions(FEditorOptions);
+end;
+
+destructor TEditor.Destroy;
+begin
+ //Debugln('TEditor.Destroy: ',Name);
+ //self.OnStatusChange := nil;
+ //self.OnChange := nil;
+ //self.OnCharsetChanged := nil;
+ inherited Destroy;
+ //Debugln('TEditor.Destroy: After inherited Destroy');
+end;
+
+{ **************************************************************************** }
+
+{ TEditorPageControl }
+
+type
+ THighlighterClassesArray = array[TEditorFileType] of TSynCustomHighlighterClass;
+ //dummy class for eftNone, needed for eftHighlighterClassesArray
+ TDummyHighlighter = Class(TSynCustomHighlighter)
+ end;
+
+//static array used to instatiate all suppoterd highlighters
+//will give compile-time error if we change definition of TEditorFileType
+const
+ eftHighlighterClassesArray: THighlighterClassesArray = (TDummyHighlighter,
+ TSynHtmlSyn, TSynXmlSyn, TSynCssSyn, TSynJavaSyn, TSynFreePascalSyn,
+ TSynLfmSyn, TSynCppSyn, TSynPythonSyn, TSynPhpSyn, TSynPerlSyn,
+ TSynUNIXShellScriptSyn, TSynBatSyn, TSynDiffSyn, TSynIniSyn, TSynPoSyn);
+
+function TEditorPageControl.GetCurrentEditor: TEditor;
+var
+ Pg: TTabSheet;
+begin
+ //DebugLn('TEditorPageControl.GetCurrentEditor: PageCount = ',DbgS(PageCount),' ActivePageIndex = ',DbgS(ActivePageIndex));
+ Result := nil;
+ //ActivePageIndex = -1 when you remove the last (as in no more pages available) page
+ //PageCount will still be 1 at this time
+ if (PageCount > 0) and (ActivePageIndex >= 0) then
+ begin
+ Pg := Pages[ActivePageIndex];
+ Result := EditorAtPage(Pg);
+ end;
+end;
+
+function TEditorPageControl.GetHighLighter(Index: TEditorFileType): TSynCustomHighlighter;
+begin
+ Result := FHighLighters[Index];
+end;
+
+function TEditorPageControl.GetFileTypeMaskLists(Index: TEditorFileType): String;
+begin
+ Result := FFileTypeMaskList[Index];
+end;
+
+procedure TEditorPageControl.SetEditorOptions(AValue: TEditorOptions);
+begin
+ if EditorOptionsAreDifferent(AValue, FEditorOptions) then
+ begin
+ FEditorOptions := AValue;
+ UpdateEditorOptions(Self);
+ end;
+end;
+
+function TEditorPageControl.GetEditorOptions: TEditorOptions;
+var
+ Ed: TEditor;
+begin
+ Ed := CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ //Get actual fon used by editor and update internal field
+ FEditorOptions.FontName := Ed.Font.Name;
+ FEditorOptions.FontSize := Ed.Font.Size;
+ end;
+ Result := FEditorOptions;
+end;
+
+procedure TEditorPageControl.SetFileTypeMaskLists(Index: TEditorFileType; AValue: string);
+begin
+ if (AValue = FFileTypeMaskList[Index]) then Exit;
+ AValue := Trim(AValue);
+ if (Length(AValue) > 0) and (AValue[Length(AValue)] = ';') then System.Delete(AValue,Length(AValue),1);
+ FFileTypeMaskList[Index] := AValue;
+ UpdateEditorFileMasks;
+end;
+
+procedure TEditorPageControl.SetPopupMenu(AValue: TPopupMenu);
+begin
+ if FEditorPopupMenu = AValue then Exit;
+ FEditorPopupMenu := AValue;
+ UpdateEditorPopupMenu;
+end;
+
+procedure TEditorPageControl.UpdateEditorFileMasks;
+var
+ i: Integer;
+ Ed: TEditor;
+begin
+ for i := 0 to PageCount - 1 do
+ begin
+ Ed := EditorAtPage(i);
+ if Assigned(Ed) then Ed.FileMaskList := Self.FFileTypeMaskList;
+ end;
+end;
+
+procedure TEditorPageControl.UpdateEditorOptions(Sender: TObject);
+var
+ i: Integer;
+ Ed: TEditor;
+begin
+ for i := 0 to PageCount - 1 do
+ begin
+ Ed := EditorAtPage(i);
+ if Assigned(Ed) then Ed.EditorOptions := Self.EditorOptions;
+ end;
+end;
+
+procedure TEditorPageControl.UpdateEditorPopupMenu;
+var
+ i: Integer;
+ Ed: TEditor;
+begin
+ for i := 0 to PageCount - 1 do
+ begin
+ Ed := EditorAtPage(i);
+ if Assigned(Ed) then Ed.PopupMenu := Self.EditorPopUpmenu;
+ end;
+end;
+
+procedure TEditorPageControl.InternalEditorStatusChange(Sender: TObject;
+ Changes: TSynStatusChanges);
+begin
+ if Assigned(FOnStatusChange) then FOnStatusChange(Sender, Changes);
+end;
+
+procedure TEditorPageControl.InternalEditorCharsetChange(Sender: TEditor;
+ const OldCharSet, NewCharSet: String; const LineNr: Integer);
+begin
+ if Assigned(FOnEditorCharsetChanged) then FOnEditorCharsetChanged(Sender, OldCharSet, NewCharSet, LineNr);
+end;
+
+
+procedure TEditorPageControl.DoChange;
+var
+ Ed: TEditor;
+begin
+ inherited DoChange;
+ Ed := GetCurrentEditor;
+ InternalEditorStatusChange(Ed, [scCaretX,scCaretY,scModified,scInsertMode,scFileName]);
+ if Assigned(Ed) then
+ begin
+ try
+ Ed.SetFocus;
+ except;
+ debugln('TEditorPageControl.DoChange: could not set focus to current editor');
+ end;
+ end;
+end;
+
+
+
+{
+procedure TEditorPageControl.RemovePage(Index: Integer);
+begin
+ DebugLn('TEditorPageControl.RemovePage: Index = ',DbgS(Index),' PageCount = ',DbgS(PageCount));
+// Pages[Index].DestroyComponents;
+ DebugLn('TEditorPageControl.RemovePage A' );
+ inherited RemovePage(Index);
+ DebugLn('TEditorPageControl.RemovePage A' );
+ if PageCount = 0 then InternalEditorStatusChange(nil, scAll);
+ DebugLn('TEditorPageControl.RemovePage A' );
+end;
+}
+
+
+constructor TEditorPageControl.Create(TheOwner: TComponent);
+var
+ Index: TEditorFileType;
+begin
+ inherited Create(TheOwner);
+ FCounter := 0;
+ FFileTypeMaskList := DefaultFileTypeMaskList;
+ FEditorOptions := DefaultEditorOptions;
+
+ //{$Hint Todo: use array of TSynCustomHighlighterClass, so new highlightrs are created if we add them in TEditorFileType}
+ FHighLighters[eftNone] := nil;
+ { The follwing method of instatiating has the advantage that,
+ when we change TEditorFiltype (adding or removing highlighters) we get a compiletime error
+ on the definition of eftHighlighterClassesArray automatically.
+ }
+ //Do not instantiate FHighLighters[Low(TeditorFileType)], because it must remain nil!!
+ for Index := Succ(Low(TEditorFileType)) to High(TEditorFileType) do
+ begin
+ FHighLighters[Index] := eftHighlighterClassesArray[Index].Create(Self);
+ end;
+
+ {
+ FHighLighters[eftHtml] := TSynHtmlSyn.Create(Self);
+ FHighLighters[eftXml] := TSynXmlSyn.Create(Self);
+ FHighLighters[eftCss] := TSynCssSyn.Create(Self);
+ FHighLighters[eftJS] := TSynJavaSyn.Create(Self);
+ FHighLighters[eftFpc] := TSynFreePascalSyn.Create(Self);
+ FHighLighters[eftLfm] := TSynLfmSyn.Create(Self);
+ FHighLighters[eftC] := TSynCppSyn.Create(Self);
+ FHighLighters[eftPy] := TSynPythonSyn.Create(Self);
+ FHighLighters[eftPhp] := TSynPhpSyn.Create(Self);
+ FHighLighters[eftPerl] := TSynPerlSyn.Create(Self);
+ FHighLighters[eftUnixShell] := TSynUNIXShellScriptSyn.Create(Self);
+ FHighLighters[eftBat] := TSynBatSyn.Create(Self);
+ FHighLighters[eftDiff] := TSynDiffSyn.Create(Self);
+ FHighLighters[eftIni] := TSynIniSyn.Create(Self);
+ FHighLighters[eftPo] := TSynPoSyn.Create(Self);
+ }
+
+ //these colors are clNone by default which results in no colors at all, just black and white
+ (FHighlighters[eftFpc] as TSynFreePascalSyn).CommentAttri.Foreground := clFuchsia;
+ (FHighlighters[eftFpc] as TSynFreePascalSyn).CommentAttri.Style := [fsItalic];
+ (FHighlighters[eftFpc] as TSynFreePascalSyn).StringAttri.Foreground := clBlue;
+ (FHighlighters[eftFpc] as TSynFreePascalSyn).DirectiveAttri.Foreground := clRed;
+ (FHighlighters[eftFpc] as TSynFreePascalSyn).DirectiveAttri.Style := [fsBold];
+ (FHighlighters[eftFpc] as TSynFreePascalSyn).SymbolAttri.Foreground := clRed;
+ //Attribute for Html entities like '&'
+ (FHighLighters[eftHtml] as TSynHtmlSyn).AndAttri.Foreground := $000080FF; //Orange
+end;
+
+destructor TEditorPageControl.Destroy;
+begin
+ inherited Destroy;
+end;
+
+function TEditorPageControl.AddPage: TEditor;
+var
+ TS: TTabSheet;
+ E: TEditor;
+ PgIdx: Integer;
+ i, NrOfNoNames: Integer;
+ Suffix: String;
+begin
+ Result := nil;
+ Inc(FCounter);
+ NrOfNoNames := 0;
+ Suffix := '';
+ for i := 0 to PageCount - 1 do
+ if Pos(NoName, Pages[i].Caption) = 1 then Inc(NrOfNoNames);
+ if NrOfNoNames > 0 then Suffix := ' [' + IntToStr(NrOfNoNames + 1) + ']';
+
+ TS := TTabSheet.Create(Self);
+ TS.Name := 'TS' + IntToStr(FCounter);
+ TS.PageControl := Self;
+ PgIdx := TS.PageIndex;
+
+ TS.Caption := NoName + Suffix;
+
+// exit;//<-------------------------------------------------------------
+
+ E := TEditor.Create(TS);
+ Result := E;
+ E.FileMaskList := FFileTypeMaskList;
+ E.Parent := TS;
+ E.FPage := TS;
+ E.FEditorPageControl := Self;
+ E.Align := alClient;
+
+
+
+ E.SetFileName(EmptyStr, E.AutoFileTypeDetection);
+
+ //E.Lines.Clear;
+ E.Modified := False;
+ E.OnStatusChange := @InternalEditorStatusChange;
+ E.OnCharsetChanged := @InternalEditorCharsetChange;
+
+
+
+ E.Gutter.AutoSize := True;
+ //E.Gutter.DigitCount := 4;
+ //E.Gutter.LeadingZeros := False;
+ E.Gutter.LeftOffset := 0;
+ E.Gutter.RightOffset := 2;
+ //We only want LineNumber, Changes and Separator
+
+
+
+
+ //E.Font.Name := 'Courier New';
+ E.Font.Pitch := fpFixed;
+ //E.Font.Size := EditorFontSize;
+ //E.HighLighter := SynHTMLSyn;
+ E.Options := [eoAltSetsColumnMode, eoAutoIndent, eoDragDropEditing, eoGroupUndo, eoScrollPastEol, eoEnhanceHomeKey,
+ eoShowScrollHint, eoSmartTabDelete, eoSmartTabs, eoTabIndent, eoBracketHighlight, eoTabsToSpaces, eoTrimTrailingSpaces];
+ E.RightEdge := 0;
+ E.RightEdgeColor := clWhite;
+ E.TabWidth := 2;
+ E.WantTabs := True;
+
+ //DebugLn('TEditorPageContro.AddPage: before applying E.EditorOptions');
+ //Debugln(' E.Font.Name = ',E.Font.Name,' E.Font.Size = ',DbgS(E.Font.Size));
+ E.EditorOptions := Self.EditorOptions;
+ //DebugLn('TEditorPageContro.AddPage: after applying E.EditorOptions');
+ //Debugln(' E.Font.Name = ',E.Font.Name,' E.Font.Size = ',DbgS(E.Font.Size));
+
+ E.PopUpMenu := FEditorPopUpMenu;
+ {
+ E.OnKeyPress := EditorKeyPress;
+ E.OnKeyDown := EditorKeyDown;
+ }
+ E.Modified := False;
+ InternalEditorStatusChange(E, [scCaretX,scCaretY,scModified,scInsertMode,scFileName]);
+
+ ActivePage := Pages[PgIdx];
+ try
+ E.SetFocus;
+ except
+ on AnExc: Exception do
+ Debugln('SetFocus failed for Editor "',E.Name,'" with message ',AnExc.Message);
+ end;
+end;
+
+function TEditorPageControl.ClosePage(Index: Integer): Boolean;
+var
+ Cancel: Boolean;
+ Pg: TTabSheet;
+ Ed: TEditor;
+begin
+ //Debugln('TEditorPageControl.ClosePage: Index = ',DbgS(Index));
+ Result := False;
+ if (Index > PageCount - 1) then Exit;
+ Pg := Pages[Index];
+ Cancel := False;
+ if Assigned(FOnBeforeCloseEditor) then FOnBeforeCloseEditor(Pg, Cancel);
+ if Not Cancel then
+ begin
+ //If you do Pg.Free, then the Editor gets destroyed when it may be
+ //processing an event (keystrokes for instance).
+ //In order to prevent this we first have to queue the destruction of teh Editor
+ //and then queue the destruction of the page, or else we may get an error from TEditor:
+ //WARNING: TLCLComponent.Destroy with LCLRefCount>0. Hint: Maybe the component is processing an event?
+
+ Ed := EditorAtPage(Pg);
+ if Assigned(Ed) then
+ begin
+ Application.ReleaseComponent(Ed);
+ //Application.ProcessMessages;
+ end;
+
+ Pg.PageControl := nil;
+ Application.ReleaseComponent(Pg);
+ //Application.ProcessMessages;
+ //Pg.Free;
+ Result := True;
+ if PageCount = 0 then InternalEditorStatusChange(nil, scAll);
+ end;
+ //Debugln('TEditorPageControl.ClosePage End.');
+end;
+
+function TEditorPageControl.EditorAtPage(const Index: Integer): TEditor;
+var
+ Pg: TTabSheet;
+begin
+ Result := nil;
+ if (Index <= PageCount - 1) then
+ begin
+ Pg := Pages[Index];
+ Result := EditorAtPage(Pg);
+ end;
+end;
+
+function TEditorPageControl.EditorAtPage(const APage: TTabSheet): TEditor;
+var
+ cc: Integer;
+begin
+ Result := nil;
+ if not Assigned(APage) then Exit;
+ for cc := 0 to APage.ComponentCount - 1 do
+ begin
+ if APage.Components[cc] is TEditor then
+ begin
+ Result := TEditor(APage.Components[cc]);
+ Exit;
+ end;
+ end;
+end;
+
+
+end.
+
diff --git a/applications/lazedit/eplus_commons.pp b/applications/lazedit/eplus_commons.pp
new file mode 100644
index 000000000..4149ac9bc
--- /dev/null
+++ b/applications/lazedit/eplus_commons.pp
@@ -0,0 +1,128 @@
+unit EPlus_Commons;
+
+{
+ EPlus: a text editor with built-in features for HTML editing and
+ Syntax Highlighting for several text formats
+ (html, xml, css, javascript, pascal, c/c++, perl, python, php, bat, ini, diff)
+
+ Copyright (C) 2011 by Bart Broersma & Flying Sheep Inc.
+ http://home.tiscali.nl/~knmg0017/software.htm
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+
+{$mode objfpc}{$H+}
+
+{ *********************************************************************
+
+ Common type and variable definitions for the EPlus program
+ Some of these can be configurable at runtime
+
+*********************************************************************** }
+
+interface
+
+
+
+Type
+
+ TEditorFileType = (eftNone, eftHtml, eftXml, eftCSS, eftJS, eftFpc, eftLfm, eftC, eftPy, eftPhp,
+ eftPerl, eftUnixShell, eftBat, eftDiff, eftIni, eftPo);
+ TFileTypeMaskList = array[TEditorFileType] of string;
+
+const
+ HtmlTemplateExt = '.htmlt;.hks;';
+ CssTemplateExt = '.csst';
+ JavaTemplateExt = '.jst';
+ STemplate = 'Sjablonen';
+
+ eftNames: array[TEditorFileType] of string = ('eftNone', 'eftHtml', 'eftXml', 'eftCSS',
+ 'eftJS', 'eftFpc', 'eftLfm', 'eftC' , 'eftPy', 'eftPhp',
+ 'eftPerl', 'eftUnixShell', 'eftBat', 'eftDiff', 'eftIni', 'eftPo');
+
+
+ eftFilterNames: array[TEditorFileType] of string = ('', 'Html bestanden', 'XML bestanden', 'CSS bestanden',
+ 'Javascript bestanden', 'Pascal bronbestanden', 'Lazarus en Delphi forms', 'C en C++ bronbestanden' ,
+ 'Python bronbestanden', 'PHP bronbestanden',
+ 'Perl bronbestanden', 'Unix shellscripts', 'Batch bestanden', 'Diff''s en patches',
+ 'Configuratie bestanden', 'po language files');
+
+
+
+ {$IFDEF WINDOWS}
+ AllFilesMask = '*.*';
+ {$ENDIF}
+ FilterText = 'Tekst bestanden (*.txt)|*.txt';
+ FilterAll = 'Alle bestanden ('+ AllFilesMask + ')|' + AllFilesMask;
+
+ //Filter indexes
+ fiEftFirst = Ord(Low(TEditorFileType)) + 1;
+ fiHtml = Ord(eftHtml);
+ fiXml = Ord(eftXml);
+ fiCss = Ord(eftCss);
+ fiJS = Ord(eftJS);
+ fiFpc = Ord(eftFpc);
+ fiLfm = Ord(eftLfm);
+ fiC = Ord(eftC);
+ fiPy = Ord(eftPy);
+ fiPhp = Ord(eftPhp);
+ fiPerl = Ord(eftPerl);
+ fiUnixShell = Ord(eftUnixShell);
+ fiBat = Ord(eftBat);
+ fiDiff = Ord(eftDiff);
+ fiIni = Ord(eftIni);
+ fiPo = Ord(eftPo);
+ fiEftLast = Ord(High(TEditorFileType));
+
+ fiText = fiEftLast + 1;
+ fiAll = fiEftLast + 2;
+
+ DefaultFiletypeMaskList: TFileTypeMaskList = ('.txt',//eftNone (no need to guess syntax for .txt files)
+ '.htm;.html;.xhtml;.xhtm;' + HtmlTemplateExt, //eftHtml
+ '.xml;.adfx', //eftXml
+ '.css;' + CssTemplateExt, //eftCss
+ '.js;' + JavaTemplateExt, //eftJava
+ '.pp;.pas;.inc;.lpr;.dpr;.lrs;.lpk;.dpk', //eftFpc
+ '.lfm;.dfm', //eftLfm
+ '.c;.cpp;.h;.hpp;.hh;.gcc;.cc;.c++', //eftC
+ '.py', //eftPython
+ '.php', //eftPhp
+ '.pl', //eftPerl
+ '.sh', //eftUnixShell
+ '.bat', //eftBat
+ '.diff;.patch', //eftDiff
+ '.ini;.conf;.cfg', //eftIni
+ '.po'); //eftPo
+
+ DefaultTemplateMaskList = HtmlTemplateExt + ';' + CssTemplateExt + ';' + JavaTemplateExt;
+
+ MruEntries = 6;
+
+implementation
+
+end.
+
diff --git a/applications/lazedit/eplus_config.pp b/applications/lazedit/eplus_config.pp
new file mode 100644
index 000000000..6c033e8d5
--- /dev/null
+++ b/applications/lazedit/eplus_config.pp
@@ -0,0 +1,265 @@
+{
+ EPlus: a text editor with built-in features for HTML editing and
+ Syntax Highlighting for several text formats
+ (html, xml, css, javascript, pascal, c/c++, perl, python, php, bat, ini, diff)
+
+ Copyright (C) 2011 by Bart Broersma & Flying Sheep Inc.
+ http://home.tiscali.nl/~knmg0017/software.htm
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit EPlus_Config;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ SysUtils, Classes, EditorPageControl, EPlus_COmmons, CopyLeft, Forms,{FCL_Misc,} IniFiles,
+ LCLProc;
+
+type
+ //globale type for all configurable options
+ TEPlusOptions = record
+ EditorOptions: TEditorOptions;
+ MainForm: record
+ Position: TRect; //used as Left, Top, Widht, Height
+ InitialDir: String;
+ end;
+ HtmlCharMapDlg: record
+ Position: TPoint;
+ end;
+ NewHtmlDlg: record
+ Position: TPoint;
+ InitialDir: String;
+ end;
+ AnchorDlg: record
+ Position: TPoint;
+ end;
+ PictureDlg: record
+ Position: TPoint;
+ InitialDir: String;
+ DefaultFolderPrefix: String;
+ end;
+ TableDlg: record
+ Position: TPoint;
+ end;
+ FileTypeMaskList: TFileTypeMaskList;
+ TemplateMaskList: String;
+ RecentFiles: Array[0..MruEntries - 1] of String;
+ end;
+
+function LoadOptions(var Options: TEPlusOptions; FileName: String): Boolean;
+function SaveOptions(const Options: TEPlusOptions; FileName: String): Boolean;
+function GetDefaultIniNameOnly: String;
+function GetDefaultIniDir: String;
+
+
+implementation
+
+const
+ scMainForm = 'MainForm';
+ idTop = 'Top';
+ idLeft = 'Left';
+ idWidth = 'Width';
+ idHeight = 'Height';
+ idInitialDir = 'InitialDir'; //Last opened folder
+ scHtmlCharMapDlg = 'CharMapDlg';
+ scNewHtmlDlg = 'NewHtmlDlg';
+ scAnchorDlg = 'AnchorDlg';
+ scPictureDlg = 'PictureDlg';
+ idDefaultFolderPrefix = 'DefaultFolderPrefix'; //prefix for <.. src=SomeFolder/name.jpg ...>
+ scTableDlg = 'TableDlg';
+ scFileTypes = 'FileTypes';
+ scEditor = 'Editor';
+ idFontSize = 'FontSize';
+ idFontName = 'FontName';
+ scRecentFiles = 'RecentFiles';
+ idFilePrefix = 'File_%d';
+
+
+function LoadOptions(var Options: TEPlusOptions; FileName: String): Boolean;
+var
+ Ini: TIniFile;
+ ftIndex: TEditorFileType;
+ S: String;
+ i: Integer;
+begin
+ Result := False;
+ try
+ Ini := Nil;
+ Ini := TIniFile.Create(FileName);
+ try
+ Result := True; //Return true if opening the Ini file is successfull
+
+ Options.EditorOptions.FontName := Ini.ReadString(scEditor, idFontName, '');
+ Options.EditorOptions.FontSize := Ini.ReadInteger(scEditor, idFontSize, 0);
+
+ Options.MainForm.Position.Left := Ini.ReadInteger(scMainForm, idLeft, -1);
+ Options.MainForm.Position.Top := Ini.ReadInteger(scMainForm, idTop, -1);
+ Options.MainForm.Position.Right := Ini.ReadInteger(scMainForm, idWidth, -1);
+ Options.MainForm.Position.Bottom := Ini.ReadInteger(scMainForm, idHeight, -1);
+ Options.MainForm.InitialDir := Ini.ReadString(scMainForm, idInitialDir, '');
+
+ //Dialogs
+ Options.NewHtmlDlg.Position.y := Ini.ReadInteger(scNewHtmlDlg, idTop, -1);
+ Options.NewHtmlDlg.Position.x := Ini.ReadInteger(scNewHtmlDlg, idLeft, -1);
+ Options.NewHtmlDlg.InitialDir := Ini.ReadString(scNewHtmlDlg, idInitialDir, '');
+
+ Options.AnchorDlg.Position.y := Ini.ReadInteger(scAnchorDlg, idTop, -1);
+ Options.AnchorDlg.Position.x := Ini.ReadInteger(scAnchorDlg, idLeft, -1);
+
+ Options.HtmlCharMapDlg.Position.y := Ini.ReadInteger(scHtmlCharmapDlg, idTop, -1);
+ Options.HtmlCharMapDlg.Position.x := Ini.ReadInteger(scHtmlCharmapDlg, idLeft, -1);
+
+ Options.PictureDlg.Position.y := Ini.ReadInteger(scPictureDlg, idTop, -1);
+ Options.PictureDlg.Position.x := Ini.ReadInteger(scPictureDlg, idLeft, -1);
+ Options.PictureDlg.InitialDir := Ini.ReadString(scPictureDlg, idInitialDir, '');
+ Options.PictureDlg.DefaultFolderPrefix := Ini.ReadString(scPictureDlg, idDefaultFolderPrefix, '');
+
+ Options.TableDlg.Position.y := Ini.ReadInteger(scTableDlg, idTop, -1);
+ Options.TableDlg.Position.x := Ini.ReadInteger(scTableDlg, idLeft, -1);
+
+
+ //Recent files
+ for i := 0 to MruEntries -1 do
+ begin
+ Options.RecentFiles[i] := Ini.ReadString(scRecentFiles, Format(idFilePrefix,[i]), '');
+ end;
+
+
+ //Filters
+ for ftIndex := Low(TEditorFileType) to High(TEditorFileType) do
+ begin
+ S := Ini.ReadString(scFileTypes, eftNames[ftIndex], '');
+ if (S <> '') then Options.FileTypeMaskList[ftIndex] := S;
+ end;
+
+ finally
+ Ini.Free;
+ Ini := Nil;
+ end;
+ except
+ //Only handle read errors here!
+ on E: EStreamError do
+ begin
+ Result := false;
+ if Assigned(Ini) then Ini.Free;
+ Exit;
+ end;
+ end;
+end;
+
+function SaveOptions(const Options: TEPlusOptions; FileName: String): Boolean;
+var
+ Ini: TIniFile;
+ ftIndex: TEditorFileType;
+ i: Integer;
+begin
+ Result := False;
+ try
+ Ini := Nil;
+ Ini := TIniFile.Create(FileName);
+ try
+ Ini.CacheUpdates := True;
+
+ Ini.WriteString(scEditor, idFontName, Options.EditorOptions.FontName);
+ Ini.WriteInteger(scEditor, idFontSize, Options.EditorOptions.FontSize);
+
+ Ini.WriteInteger(scMainForm, idLeft, Options.MainForm.Position.Left);
+ Ini.WriteInteger(scMainForm, idTop, Options.MainForm.Position.Top);
+ Ini.WriteInteger(scMainForm, idWidth, Options.MainForm.Position.Right);
+ Ini.WriteInteger(scMainForm, idHeight, Options.MainForm.Position.Bottom);
+ Ini.WriteString(scMainForm, idInitialDir, Options.MainForm.InitialDir);
+
+ //Dialogs
+ Ini.WriteInteger(scNewHtmlDlg, idTop, Options.NewHtmlDlg.Position.y);
+ Ini.WriteInteger(scNewHtmlDlg, idLeft, Options.NewHtmlDlg.Position.x);
+ Ini.WriteString(scNewHtmlDlg, idInitialDir, Options.NewHtmlDlg.InitialDir);
+
+ Ini.WriteInteger(scAnchorDlg, idTop, Options.AnchorDlg.Position.y);
+ Ini.WriteInteger(scAnchorDlg, idLeft, Options.AnchorDlg.Position.x);
+
+ Ini.WriteInteger(scHtmlCharMapDlg, idTop, Options.HtmlCharMapDlg.Position.y);
+ Ini.WriteInteger(scHtmlCharMapDlg, idLeft, Options.HtmlCharMapDlg.Position.x);
+
+ Ini.WriteInteger(scPictureDlg, idTop, Options.PictureDlg.Position.y);
+ Ini.WriteInteger(scPictureDlg, idLeft, Options.PictureDlg.Position.x);
+ Ini.WriteString(scPictureDlg, idInitialDir, Options.PictureDlg.InitialDir);
+ Ini.WriteString(scPictureDlg, idDefaultFolderPrefix, Options.PictureDlg.DefaultFolderPrefix);
+
+ Ini.WriteInteger(scTableDlg, idTop, Options.TableDlg.Position.y);
+ Ini.WriteInteger(scTableDlg, idLeft, Options.TableDlg.Position.x);
+
+ //Recent Files
+ for i := 0 to MruEntries - 1 do
+ begin
+ Ini.WriteString(scRecentFiles, Format(idFilePrefix,[i]), Options.RecentFiles[i]);
+ end;
+
+
+ //Filters
+ for ftIndex := Low(TEditorFileType) to High(TEditorFileType) do
+ begin
+ Ini.WriteString(scFileTypes, eftNames[ftIndex], Options.FileTypeMaskList[ftIndex]);
+ end;
+
+ try
+ Ini.UpdateFile;
+ Result := True;
+ except
+ Result := false;
+ end;
+
+ finally
+ Ini.Free;
+ Ini := Nil;
+ end;
+ except
+ //Only handle write errors
+ on E: EStreamError do
+ begin
+ debugln('Error creating/writing configfile: ',FileName);
+ Result := false;
+ if Assigned(Ini) then Ini.Free;
+ Exit;
+ end;
+ end;
+end;
+
+function GetDefaultIniNameOnly: String;
+begin
+ Result := AppName + '.ini';//IniExt;
+end;
+
+function GetDefaultIniDir: String;
+begin
+ Result := ExcludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
+end;
+
+end.
+
diff --git a/applications/lazedit/history.htm b/applications/lazedit/history.htm
new file mode 100644
index 000000000..e8fe1c7c0
--- /dev/null
+++ b/applications/lazedit/history.htm
@@ -0,0 +1,320 @@
+
+
+
+
+
+
+
+
+EPlus historie informatie
+
+
+
+
+
+
+
+EPlus
+
+
+
+EPlus is de opvolger van Html Kladblok.
+De historie informatie van Html Kladblok is helaas nogal onvolledig, omdat ik niet alle wijzigingen heb bijgehouden
+in het verleden en derhalve niet alle jaartallen en versienummers kan reproduceren.
+Vanaf Html Kladblok versie 3.0.0 is de versie historie compleet.
+Vanaf het verschijnen van EPlus start de versienummering weer bij 1.0.0.
+
+
+Overzicht
+
+
+
+
+ Jaar
+
+ Versie
+
+ Opmerkingen
+
+
+
+ 2012
+
+ 1.0.0 RC1
+
+ Eerste versie van EPlus.
+ Het programma is volledig van de grond af opnieuw opgebouwd met Lazarus/FreePascal.
+ De broncode is volledig cross-platform en kan gecompileerd worden voor Windows, Linus of MacOS (Darwin).
+ Character encoding (ook intern) is UTF-8.
+ Forse uitbreiding van het aantal ondersteunde bestandstypen voor syntax highlighting, o.a. Pascal, C, Php,
+ Perl, Python, Linux shell scripts, Dos/Windows batch bestanden, Ini bestanden, po taalbestanden.
+ Menu's zijn herzien.
+ Charactermap voor invoegen van speciale tekens als html-entiteit (bijv. ).
+
+
+
+
+ 2011
+
+ 3.0.1.6
+
+ Minor bugfix (bug 005). Laatse versie van Html Kladblok
+
+
+
+ 2008
+
+ 3.0.1.5
+
+ Minor bugfix (bug 004).
+
+
+ 2007
+
+ 3.0.1.4
+
+ Bugfix van bug 003. Bij openen van sjabloon of "nieuw van sjabloon" wordt nu HTML als highlighter ingesteld.
+
+
+
+ 2006
+
+ 3.0.1.003
+
+ Optie "Geen highlighter" toegevoegd aan Menu --> Beeld --> Highlighter.
+ Geen highlighter is de standaard instelling voor bestanden die geen htm(l), css of js extensie hebben.
+
+
+
+
+
+ 3.0.1.002
+
+ Workaround bug 002: bij sluiten van tabbladen worden tabs nu niet meer
+ "onzichtbaar". Tabs nu weer op 1 regel.
+ Spaties in bestandsnamen van plaatjes worden vervangen door "%20"
+
+
+
+
+
+ 3.0.1
+
+ Schermafhandeling bij creëren en sluiten van nieuwe tabbladen
+ aangepast, zodat er minder flikkeringen ontstaan
+ Tabs op meerdere regels als scherm vol is (i.p.v. scrolllen),
+ vanwege bug in schermafhandeling na verwijderen tab (worden "onzichtbaar")
+ Venstergrootte en -positie worden nu standaard bewaard
+
+
+
+
+
+ 3.0.0
+
+ MDI interface vervangen door Tabbed Document Interface (TDI)
+ Highlighters voor Css en JavaScript toegevoegd
+ Regelnummering (op verticale liniaal) als optie
+
+
+
+
+
+ 2.0.5
+
+ Laatste bugfixes van MDI versie
+
+
+
+ 2005
+
+ 2.0.0
+
+ Syntax highlighting toegevoegd middels SynEdit componenenten
+ Licentie nu Open Source middels MPL 1.1
+
+
+
+
+
+ ??
+
+ "Drag and drop" geimplementeerd
+
+
+
+
+
+ ??
+
+ Gegenereerde code is nu in pricipe Html 4.01 Strict
+
+
+
+ 2004
+
+ ??
+
+ Opties voor bewaren van venstergroote en -plaats en fontgrootte toegevoegd
+ Automatische detectie van plaatjesgrootte (jpg, bmp, gif) toegevoegd
+ Sjablonen toegevoegd
+
+
+
+
+
+ 1.1.0
+
+ Multiple Document Interface (MDI) geïmplementeerd
+
+
+
+ 2001
+
+ 0.9.1
+
+ Zoek en vervang functie toegevoegd
+
+
+
+
+
+ 0.9
+
+ Eerste Win32 versie
+ TMemo component vervangen door TRichedit zodat ook
+ bestanden > 64 K verwerkt kunnen worden
+
+
+
+ 2000
+
+ 0.1
+
+ Eerste versie gemaakt met Delphi 1.0 onder Windows 3.10
+ Html code in principe 4.01 transitional
+
+
+
+
+
+Bekende bugs sinds 2006
+
+
+ Nr.
+
+ Vanaf versie
+
+ OS
+
+ Omschrijving
+
+ Status
+
+
+
+ 005
+
+ ?
+
+ Win 9x/XP/2K
+
+ Bestanden geopend via opdrachtregel worden niet correct opegslagen in MRU lijst
+
+ Fix in 3.0.1.6
+
+
+
+ 004
+
+ ?
+
+ Win 9x/XP/2K
+
+ Functie IsASCIIFile geeft fout resultaat als bestand Tab-tekens bevat
+
+ Fix in 3.0.1.5
+
+
+
+ 003
+
+ 3.0.1.003
+
+ Win 9x/XP/2K
+
+ Bij openen van sjabloon of "nieuw van sjabloon" wordt geen highlighter ingesteld.
+
+ Fix in 3.0.1.4
+
+
+
+ 002
+
+ 3.0.0
+
+ Win 9x/XP/2K
+
+ Op niet reproduceerbare wijze ontstaat er soms bij het afsluiten van het programma een Access Violation (AV) exceptie
+ in de code die alle editor bestanden sluit. (Het opslaan van gewijzigde bestanden is dan reeds veilig voltooid.)
+ De betreffende code staat vol met debug code die bij een foutmelding getoond word.
+ NB. De laaste ca 150x dat ik de laatste versie heb gedraaid deed de bug zich niet voor (vandaar dus: niet reproduceerbaar ...)
+
+ Onduidelijk
+
+
+
+ 001
+
+ 3.0.0
+
+ Win 9x/XP/2K
+
+ Bij sluiten van tabbladen worden na het verdwijnen van de scroll-pijltjes
+ de overige tabbladen onzichtbaar, maar ze zijn wel aanklikbaar.
+ Dit probleem lijkt niet rerpoduceerbaar in Delphi 5.
+
+ Workaround in 3.0.1
+ Nieuwe workaround in 3.0.1.002
+
+
+
+
+
+
+ToDo lijstje
+
+
+
+ Opties voor gebruiker om kleurgebruik van de highlighters aan te passen
+ Macro voor datum/tijd (als in: Dit bestand is het laats bijgewerkt op ...) ???
+
+
+
+
+
diff --git a/applications/lazedit/htmlcharmap.lfm b/applications/lazedit/htmlcharmap.lfm
new file mode 100644
index 000000000..f1fc1e9b3
--- /dev/null
+++ b/applications/lazedit/htmlcharmap.lfm
@@ -0,0 +1,96 @@
+object HtmlCharmapForm: THtmlCharmapForm
+ Left = 775
+ Height = 227
+ Top = 122
+ Width = 431
+ BorderStyle = bsDialog
+ Caption = 'Speciale tekens'
+ ClientHeight = 227
+ ClientWidth = 431
+ OnCreate = FormCreate
+ OnShow = FormShow
+ LCLVersion = '0.9.31'
+ object EntityGrid: TStringGrid
+ Left = 0
+ Height = 160
+ Top = 0
+ Width = 431
+ Align = alTop
+ AlternateColor = 16774367
+ AutoEdit = False
+ AutoFillColumns = True
+ Color = 15138815
+ ExtendedSelect = False
+ FixedCols = 0
+ FixedRows = 0
+ ParentFont = False
+ ParentShowHint = False
+ RowCount = 7
+ ScrollBars = ssNone
+ ShowHint = True
+ TabOrder = 0
+ OnKeyPress = EntityGridKeyPress
+ OnMouseDown = EntityGridMouseDown
+ OnMouseMove = EntityGridMouseMove
+ OnPrepareCanvas = EntityGridPrepareCanvas
+ ColWidths = (
+ 85
+ 85
+ 85
+ 85
+ 87
+ )
+ end
+ object SelectionBox: TComboBox
+ Left = 0
+ Height = 21
+ Top = 160
+ Width = 431
+ Align = alTop
+ ItemHeight = 13
+ ItemIndex = 0
+ Items.Strings = (
+ 'Divers'
+ 'Grieks'
+ 'Wiskunde en rekenen'
+ 'Pijltjes'
+ )
+ OnChange = SelectionBoxChange
+ Style = csDropDownList
+ TabOrder = 1
+ Text = 'Divers'
+ end
+ object CloseBtn: TBitBtn
+ Left = 304
+ Height = 30
+ Top = 192
+ Width = 123
+ Cancel = True
+ Caption = '&Sluiten'
+ Kind = bkClose
+ ModalResult = 11
+ TabOrder = 2
+ end
+ object ExampleLabel: TLabel
+ Left = 80
+ Height = 14
+ Top = 200
+ Width = 80
+ Caption = 'ExampleLabel'
+ Font.Color = clRed
+ Font.Style = [fsBold]
+ ParentColor = False
+ ParentFont = False
+ ShowAccelChar = False
+ end
+ object Label1: TLabel
+ Left = 12
+ Height = 14
+ Top = 201
+ Width = 63
+ Caption = 'Voorbeeld:'
+ Font.Style = [fsBold]
+ ParentColor = False
+ ParentFont = False
+ end
+end
diff --git a/applications/lazedit/htmlcharmap.pp b/applications/lazedit/htmlcharmap.pp
new file mode 100644
index 000000000..c1a1ffe8e
--- /dev/null
+++ b/applications/lazedit/htmlcharmap.pp
@@ -0,0 +1,319 @@
+unit HtmlCharMap;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
+ StdCtrls, LCLProc, Buttons;
+
+type
+
+ THtmlCharClickEvent = procedure(AHtmlEntity: String) of object;
+
+ { THtmlCharmapForm }
+
+ THtmlCharmapForm = class(TForm)
+ CloseBtn: TBitBtn;
+ ExampleLabel: TLabel;
+ Label1: TLabel;
+ SelectionBox: TComboBox;
+ EntityGrid: TStringGrid;
+ procedure EntityGridKeyPress(Sender: TObject; var Key: char);
+ procedure EntityGridMouseDown(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+ procedure EntityGridMouseMove(Sender: TObject; Shift: TShiftState; X,
+ Y: Integer);
+ procedure EntityGridPrepareCanvas(sender: TObject; aCol, aRow: Integer;
+ aState: TGridDrawState);
+ procedure FormCreate(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ procedure SelectionBoxChange(Sender: TObject);
+ private
+ { private declarations }
+ FOnHtmlCharClick: THtmlCharClickEvent;
+ procedure DoOnHtmlCharClick(AValue: String);
+ procedure FillMisc;
+ procedure FillGreek;
+ procedure FillMath;
+ procedure FillArrow;
+ procedure ClearEntityGrid;
+ function RowColToIndex(const Row, Col: Integer): Integer;
+ function HtmlEntityFromIndex(SelectionIndex, CellIndex: Integer): String;
+
+ public
+ { public declarations }
+ property OnHtmlCharClick: THtmlCharClickEvent read FOnHtmlCharClick write FOnHtmlCharClick;
+ end;
+
+
+implementation
+
+{$R *.lfm}
+
+
+
+const
+ idxMisc = 0;
+ idxGreek = 1;
+ idxMath = 2;
+ idxArrow = 3;
+
+ SHint = 'Klik op het teken om het als HTML-entiteit in te voegen.'^m+
+ 'De HTML-entiteit die ingevoegd zal worden staat in het voorbeeld';
+
+ MiscCount = 24;
+ MiscCaptions: Array[0..MiscCount-1] of String = ('CopyRight','Registered','Trademark','Paragraaf','Sectie',
+ 'Ampersand (&)','Harde spatie','Zacht koppelteken','Euro','Pond','Yen','Gulden','Micro','AE ligatuur','ae ligatuur',
+ 'OE ligatuur','oe ligatuur','O slash','o slash','<<','>>','! omgekeerd','? omgekeerd','Bullet');
+
+ MiscEntities: Array[0..MiscCount-1] of String = ('©','®','™','¶','§',
+ '&',' ','','€','£','¥','ƒ','µ','&Aelig;','æ',
+ '&Oelig;','œ','Ø','ø','«','»','&iexlc;','¿','&bull');
+
+ GreekCount = 33;
+ GreekCaptions: Array[0..GreekCount -1] of String = ('alpha','beta','gamma','delta','epsilon','zeta','eta','theta',
+ 'kappa','lambda','mu','nu','xi','pi','rho','sigma','sigma (als laatste)','tau','upsilon','phi',
+ 'chi','psi','omega','GAMMA','DELTA','THETA','THETA symbol','XI','RHO','SIGMA','PHI','PSI','OMEGA');
+
+ GreekEntities: Array[0..GreekCount -1] of String = ('α','β','γ','δ','ε','ζ','η','θ',
+ 'κ','λ','μ','ν','ξ','π','ρ','σ','ς','τ','υ','φ',
+ 'χ','ψ','ω','Γ','&Delta','Θ','&thetatsym;','Ξ','Ρ','Σ','&Phi','Ψ','Ω');
+
+ MathCount = 14;
+ MathCaptions: Array[0..MathCount - 1] of String = ('Kleiner dan','Groter dan','Kleiner of gelijk','Groter of gelijk',
+ 'Plusminus','Kwart','Half','Driekwart','Kwadraat','Derde macht','Gedeeld door','Graden','Wortelteken','Oneindig');
+
+ MathEntities: Array[0..MathCount - 1] of String = ('<','>','≤','≥',
+ '&plusmin;','¼','½','¾','²','³','÷','°','√','&inf;');
+
+ ArrowCount = 10;
+ ArrowCaptions: Array[0..ArrowCount -1] of String = ('Links','Rechts','Op','Neer','LinksRechts',
+ 'Dubbel links','Dubbel rechts','Dubbel op','Dubbel neer','Dubbel LR');
+
+ ArrowEntities: Array[0..ArrowCount -1] of String = ('←','→','↑','&darr','&harr',
+ '⇐','⇒','⇓','⇑','⇔');
+
+
+{ THtmlCharmapForm }
+
+procedure THtmlCharmapForm.SelectionBoxChange(Sender: TObject);
+begin
+ case SelectionBox.ItemIndex of
+ idxMisc: FillMisc;
+ idxGreek: FillGreek;
+ idxMath: FillMath;
+ idxArrow: FillArrow;
+ else FillMisc;
+ end;
+end;
+
+procedure THtmlCharmapForm.DoOnHtmlCharClick(AValue: String);
+begin
+ if (AValue <> '') and Assigned(FOnHtmlCharClick) then FOnHtmlCharClick(AValue);
+end;
+
+procedure THtmlCharmapForm.FormCreate(Sender: TObject);
+begin
+ SelectionBox.ItemIndex := idxMisc;
+ EntityGrid.Hint := SHint;
+end;
+
+
+procedure THtmlCharmapForm.EntityGridKeyPress(Sender: TObject; var Key: char);
+var
+ Idx: Integer;
+ S: String;
+begin
+ if (Key = #13) then
+ begin
+ Key := #0;
+ Idx := RowColToIndex(EntityGrid.Row, EntityGrid.Col);
+ S := HtmlEntityFromIndex(SelectionBox.ItemIndex, Idx);
+ DoOnHtmlCharClick(S);
+ end;
+end;
+
+procedure THtmlCharmapForm.EntityGridMouseDown(Sender: TObject;
+ Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+var
+ Row, Col, Idx: Integer;
+ S: String;
+begin
+ //debugln('THtmlCharmapForm.EntityGridMouseDown');
+ if (Button = mbLeft) and (EntityGrid.MouseToGridZone(X, Y) = gzNormal) then
+ begin
+ EntityGrid.MouseToCell(X, Y, Col, Row);
+ //debugln(' Col = ',dbgs(col),' Row = ',dbgs(row));
+ Idx := RowColToIndex(Row, Col);
+ //debugln(' Idx = ',dbgs(idx));
+ S := HtmlEntityFromIndex(SelectionBox.ItemIndex, Idx);
+ //debugln(' S = ',S);
+ DoOnHtmlCharClick(S);
+ end;
+end;
+
+procedure THtmlCharmapForm.EntityGridMouseMove(Sender: TObject;
+ Shift: TShiftState; X, Y: Integer);
+var
+ Row, Col, Idx: Integer;
+ S: String;
+begin
+ //debugln('THtmlCharmapForm.EntityGridMouseMove');
+ if (EntityGrid.MouseToGridZone(X, Y) = gzNormal) then
+ begin
+ EntityGrid.MouseToCell(X, Y, Col, Row);
+ //debugln(' Col = ',dbgs(col),' Row = ',dbgs(row));
+ Idx := RowColToIndex(Row, Col);
+ //debugln(' Idx = ',dbgs(idx));
+ S := HtmlEntityFromIndex(SelectionBox.ItemIndex, Idx);
+ //debugln(' S = ',S);
+ EntityGrid.Row := Row;
+ EntityGrid.Col := Col;
+ ExampleLabel.Caption := S;
+ end;
+end;
+
+procedure THtmlCharmapForm.EntityGridPrepareCanvas(sender: TObject; aCol,
+ aRow: Integer; aState: TGridDrawState);
+begin
+ if (gdSelected in aState) then
+ begin
+ EntityGrid.Canvas.Brush.Color := clLime;
+ end
+end;
+
+procedure THtmlCharmapForm.FormShow(Sender: TObject);
+begin
+ SelectionBoxChange(Self);
+ ExampleLabel.Caption := '';
+end;
+
+
+
+procedure THtmlCharmapForm.FillMisc;
+var
+ Col, Row, i: Integer;
+begin
+ //debugln('FillMisc');
+ ClearEntityGrid;
+ i := (MiscCount div EntityGrid.ColCount);
+ if (MiscCount mod EntityGrid.ColCount) <> 0 then Inc(i);
+ EntityGrid.RowCount := i;
+ Col := 0;
+ Row := 0;
+ for i := 0 to MiscCount - 1 do
+ begin
+ EntityGrid.Cells[Col, Row] := MiscCaptions[i];
+ Inc(Col);
+ if (Col > EntityGrid.ColCount - 1) then
+ begin
+ Col := 0;
+ Inc(Row);
+ if (Row > EntityGrid.RowCount - 1) then Break;
+ end;
+ end;
+
+end;
+
+procedure THtmlCharmapForm.FillGreek;
+var
+ Col, Row, i: Integer;
+begin
+ //debugln('FillGreek');
+ ClearEntityGrid;
+ i := (GreekCount div EntityGrid.ColCount);
+ if (GreekCount mod EntityGrid.ColCount) <> 0 then Inc(i);
+ EntityGrid.RowCount := i;
+ Col := 0;
+ Row := 0;
+ for i := 0 to GreekCount - 1 do
+ begin
+ EntityGrid.Cells[Col, Row] := GreekCaptions[i];
+ Inc(Col);
+ if (Col > EntityGrid.ColCount - 1) then
+ begin
+ Col := 0;
+ Inc(Row);
+ if (Row > EntityGrid.RowCount - 1) then Break;
+ end;
+ end;
+
+end;
+
+procedure THtmlCharmapForm.FillMath;
+var
+ Col, Row, i: Integer;
+begin
+ //debugln('FillMath');
+ ClearEntityGrid;
+ i := (MathCount div EntityGrid.ColCount);
+ if (MathCount mod EntityGrid.ColCount) <> 0 then Inc(i);
+ EntityGrid.RowCount := i;
+ Col := 0;
+ Row := 0;
+ for i := 0 to MathCount - 1 do
+ begin
+ EntityGrid.Cells[Col, Row] := MathCaptions[i];
+ Inc(Col);
+ if (Col > EntityGrid.ColCount - 1) then
+ begin
+ Col := 0;
+ Inc(Row);
+ if (Row > EntityGrid.RowCount - 1) then Break;
+ end;
+ end;
+
+end;
+
+procedure THtmlCharmapForm.FillArrow;
+var
+ Col, Row, i: Integer;
+begin
+ //debugln('FillArrow');
+ ClearEntityGrid;
+ i := (ArrowCount div EntityGrid.ColCount);
+ if (ArrowCount mod EntityGrid.ColCount) <> 0 then Inc(i);
+ EntityGrid.RowCount := i;
+ Col := 0;
+ Row := 0;
+ for i := 0 to ArrowCount - 1 do
+ begin
+ EntityGrid.Cells[Col, Row] := ArrowCaptions[i];
+ Inc(Col);
+ if (Col > EntityGrid.ColCount - 1) then
+ begin
+ Col := 0;
+ Inc(Row);
+ if (Row > EntityGrid.RowCount - 1) then Break;
+ end;
+ end;
+
+end;
+procedure THtmlCharmapForm.ClearEntityGrid;
+begin
+ EntityGrid.Clean(0,0,EntityGrid.ColCount-1,EntityGrid.RowCount-1, [gzNormal, gzFixedCols, gzFixedRows, gzFixedCells]);
+ EntityGrid.Col := 0;
+ EntityGrid.Row := 0;
+end;
+
+function THtmlCharmapForm.RowColToIndex(const Row, Col: Integer): Integer;
+begin
+ Result := Row * EntityGrid.ColCount + Col;
+end;
+
+function THtmlCharmapForm.HtmlEntityFromIndex(SelectionIndex, CellIndex: Integer): String;
+begin
+ Result := '';
+ if (CellIndex < 0) then exit;
+ case SelectionIndex of
+ idxMisc: if (CellIndex < MiscCount) then Result := MiscEntities[CellIndex];
+ idxGreek: if (CellIndex < GreekCount) then Result := GreekEntities[CellIndex];
+ idxMath: if (CellIndex < MathCount) then Result := MathEntities[CellIndex];
+ idxArrow: if (CellIndex < ArrowCount) then result := ArrowEntities[CellIndex];
+ end;
+end;
+
+end.
+
diff --git a/applications/lazedit/htmlcode.pp b/applications/lazedit/htmlcode.pp
new file mode 100644
index 000000000..3492c53f8
--- /dev/null
+++ b/applications/lazedit/htmlcode.pp
@@ -0,0 +1,417 @@
+{ HtmlCode unit
+
+ Copyright (C) 2012 by Bart Broersma
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+unit HtmlCode;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses {CopyLeft,} Classes, SysUtils, Graphics, StdCtrls, fpimage{, LCL_Misc};
+
+type
+ THtmlDocType = (DocType_Html_401_Strict, DocType_Html_401_TR, DocType_Html_5, DocType_None);
+ THtmlDocTypeStrings = Array[THtmlDocType] of String;
+
+const
+
+
+
+ SDocType_Html401_Strict = '';
+ SDocType_Html401_TR = '';
+
+ SDocType_Html_5 = '';
+ SDocType_None = '';
+ HtmlDocTypeStrings: THtmlDocTypeStrings = (SDocType_Html401_Strict, SDocType_Html401_TR, SDocType_Html_5, SDocType_None);
+
+ html_start = '';
+ html_end = '';
+ head_start = '';
+ head_end = '';
+
+ meta_content_charset_utf8 = ' ';
+ meta_content_style_type = ' ';
+ meta_content_script_type = ' ';
+ meta_name_author = ' ';
+ meta_name_generator = ' ';
+
+ title_start = '';
+ title_end = ' ';
+
+
+ anchor_end = '';
+
+ bold_start= '';
+ bold_end= ' ';
+ italic_start= '';
+ italic_end= ' ';
+ underline_start= '';
+ underline_end= ' ';
+ sub_start= '';
+ sub_end= ' ';
+ sup_start= '';
+ sup_end= ' ';
+ emphasis_start = '';
+ emphasis_end = ' ';
+ Strong_start = '';
+ Strong_end = ' ';
+ Code_start = '';
+ Code_end = '
';
+ Quote_start = '';
+ Quote_end = ' ';
+ BlockQuote_start = '';
+ BlockQuote_end = ' ';
+ PRE_start = '';
+ PRE_end = ' ';
+
+ Comment_start= '';
+
+ Script_start = '';
+ Style_start = '';
+
+ Font_end='';
+
+ CenterAlign_start= '';
+ CenterAlign_end= '
';
+ LeftAlign_start= '';
+ LeftAlign_end= '
';
+ RightAlign_start= '';
+ RightAlign_end= '
';
+ JustifyAlign_start = '';
+ JustifyAlign_end= '
';
+
+ Row_start = '';
+ Row_end = ' ';
+ Col_start = '';
+ Col_end = ' ';
+ ColHeading_start = '';
+ ColHeading_end = ' ';
+
+ Table_end = '';
+
+
+ UnnumberedList_start= '';
+ NumberedList_start= ''; NumberedList_end= ' ';
+ ListItem_start= ''; ListItem_end= ' ';
+ WordList_start= ''; WordList_end= ' ';
+ WordTerm_start= ''; WordTerm_end= ' ';
+ WordDef_start= ''; WordDef_end= ' ';
+
+
+
+ Red_start = '';
+ Green_start = '';
+ Blue_start = '';
+ Purple_start = '';
+ Orange_start = '';
+ Yellow_start = '';
+ Black_start = '';
+ White_start = '';
+ Gray_start = '';
+ Maroon_start = '';
+ Olive_start = '';
+ Fuchsia_start = '';
+ Lime_start = '';
+ Navy_start = '';
+ Aqua_start = '';
+ Teal_start = '';
+ Silver_start = '';
+
+
+ Paragraph_start= ''; Paragraph_end= '
';
+ Div_start = ''; Div_end = '
';
+ Span_start = ''; Span_end = ' ';
+ LineBreak = ' ' ;
+
+ CopyRight = '©';
+ Registered = '®';
+ Trademark = '™';
+ NbSpace = ' ';
+ Lesser = '<';
+ Greater = '>';
+ Ampersand = '&';
+
+
+function Favicon(const ASource: String): String;
+function StyleSheet(const ASource: String): String;
+function StyleSheet(const ASource, AMedia: String): String;
+function Table_Start(const AID, ACLass, ASummary: String): String;
+function CreateTable(const AID, ACLass, ASummary: String; const ColCount, RowCount: Integer): String;
+function TabbedTextToHtmlTableContent(const AText: String): String;
+function Img(const ASource, AId, AClass, AFloatStyle, AWidth, AHeight, AAlt, ATitle: String): String;
+function CreateHtml(const ADocType: THtmlDocType; const AAuthor, ATitle, AFavicon, AStyleSheet, AInlineStyle: String;
+ const AGeneratorName: String = ''): String;
+
+function HtmlToColor(const Value: String): TColor;
+function ColorToHtml(const AColor: TColor): String;
+
+Procedure DoHtmlDirSeparators (Var FileName : String);
+function UrlEscape(const Url: String): String;
+
+
+implementation
+
+const
+ HtmlDirectorySeparator = '/';
+
+function Favicon(const ASource: String): String;
+begin
+ Result := Format(' ',[ASource]) + LineEnding +
+ Format(' ',[ASource]);
+end;
+
+function StyleSheet(const ASource: String): String;
+begin
+ Result := Format(' ',[ASource]);
+end;
+
+function StyleSheet(const ASource, AMedia: String): String;
+begin
+ Result := Format(' ',[ASource, AMedia]);
+end;
+
+
+
+function Table_Start(const AID, ACLass, ASummary: String): String;
+begin
+ Result := ' '' then Result := Result + ' id="' + AID + '"';
+ if AClass <> '' then Result := Result + ' class="' + AClass + '"';
+ if ASummary <> '' then Result := Result + ' summary="' + ASummary + '"';
+ Result := Result + '>';
+end;
+
+function CreateTable(const AID, ACLass, ASummary: String; const ColCount,
+ RowCount: Integer): String;
+const
+ Ident = #32#32;
+var
+ Row, Col: Integer;
+begin
+ Result := Table_Start(AID, ACLass, ASummary) + LineEnding;
+ for Row := 1 to RowCount do
+ begin
+ Result := Result + row_start + LineEnding;
+ for Col := 1 to ColCount do
+ begin
+ if (Row = 1) then
+ Result := Result + Ident + ColHeading_start + LineEnding
+ else
+ Result := Result + Ident + Col_start + LineEnding;
+
+ if (Row = 1) then
+ Result := Result + Ident + ColHeading_end + LineEnding
+ else
+ Result := Result + Ident + Col_end + LineEnding;
+ end;
+ Result := Result + row_end + LineEnding;
+ end;
+ Result := Result + table_end;
+end;
+
+function TabbedTextToHtmlTableContent(const AText: String): String;
+const
+ Tab = #9;
+var
+ SL: TStringList;
+ i, p: Integer;
+ Current, S: String;
+begin
+ Result := '';
+ //workaround for bug in ClipBoard.GetAsText
+ if (Length(AText) = 0) then exit;
+ SL := TStringList.Create;
+ try
+ p := Pos(#0, AText);
+ if p > 0 then
+ begin
+ SL.Text := Copy(AText,1,p-1);
+ end
+ else SL.Text := AText;
+ for i := 0 to SL.Count - 1 do
+ begin
+ Current := SL.Strings[i];
+ //debugln('Current = "',Current,'" (',DbgS(Length(Current)),')');
+ if (Length({Trim}(Current)) > 0) then
+ begin
+ Result := Result + row_start + LineEnding;
+ repeat
+ p := Pos(Tab, Current);
+ if p = 0 then
+ S := Current
+ else
+ S := Copy(Current,1,p-1);
+ if (p > 0) then System.Delete(Current,1,p);
+ //debugln('S = "',S,'" p = ',DbgS(p));
+ Result := Result + ' ' + col_start + S + col_end + LineEnding;
+ until (p = 0) or (Length(Current) = 0);
+ Result := Result + row_end + LineEnding;
+ end;//Length(Current) > 0
+ end;//for
+ finally
+ Sl.Free;
+ end;
+end;
+
+
+function Img(const ASource, AId, AClass, AFloatStyle, AWidth, AHeight, AAlt,
+ ATitle: String): String;
+var
+ _Alt, _Title: String;
+begin
+ //
+ _Alt := AAlt;
+ _Title := ATitle;
+ if _Alt = '' then _Alt := _Title;
+ if (_Title = '') and (_Alt <> '') then _Title := _Alt;
+ Result := ' '' then Result := Result + ' id="' + AId + '"';
+ if AClass <> '' then Result := Result + ' class="' + AClass + '"';
+ if AFloatStyle <> '' then Result := Result + ' style="float:' + AFloatStyle + ';"';
+ if AWidth <> '' then Result := Result + ' width="' + AWidth + '"';
+ if AHeight <> '' then Result := Result + ' height="' + AHeight + '"';
+ if _Alt <> '' then Result := Result + ' alt="' + _Alt + '"';
+ if _Title <> '' then Result := Result + ' title ="' + _Title + '"';
+ Result := Result + '>';
+end;
+
+function CreateHtml(const ADocType: THtmlDocType; const AAuthor, ATitle, AFavicon, AStyleSheet, AInlineStyle: String;
+ const AGeneratorName: String = ''): String;
+begin
+ Result := HtmlDocTypeStrings[ADocType];
+ if (Result <> '') then Result := Result + LineEnding;
+ Result := Result + Html_Start + LineEnding;
+ Result := Result + Head_Start + LineEnding + LineEnding;
+
+
+ Result := Result + meta_content_charset_utf8 + LineEnding;
+ Result := Result + meta_content_style_type + LineEnding;
+ Result := Result + meta_content_script_type + LineEnding;
+ if (AAuthor <> '') then Result := Result + Format(meta_name_author,[AAuthor]) + LineEnding;
+ if (AGeneratorName <> '') then
+ Result := Result + Format(meta_name_generator,[AGeneratorName]) + LineEnding;
+ Result := Result + LineEnding;
+
+ Result := Result + Title_Start + ATitle + Title_End + LineEnding + LineEnding;
+
+{
+
+
+
+
+
+}
+
+ if (AFavicon <> '') then Result := Result + Favicon(AFavicon) + LineEnding;
+ if (AStyleSheet <> '') then Result := Result + AStyleSheet + LineEnding;
+
+ if (AInlineStyle <> '') then Result := Result + LineEnding + AInlineStyle + LineEnding + LineEnding;
+
+ Result := Result + LineEnding + LineEnding + Head_End + LineEnding;
+ Result := Result + LineEnding + Html_End;
+end;
+
+function HtmlToColor(const Value: String): TColor;
+begin
+ //ToDo
+ Result := 0;
+end;
+
+{
+
+}
+
+function ColorToHtml(const AColor: TColor): String;
+const
+ //uses unthemed original values for this
+ clBlack = TColor($000000);
+ clMaroon = TColor($000080);
+ clGreen = TColor($008000);
+ clOlive = TColor($008080);
+ clNavy = TColor($800000);
+ clPurple = TColor($800080);
+ clTeal = TColor($808000);
+ clGray = TColor($808080);
+ clSilver = TColor($C0C0C0);
+ clRed = TColor($0000FF);
+ clLime = TColor($00FF00);
+ clYellow = TColor($00FFFF);
+ clBlue = TColor($FF0000);
+ clFuchsia = TColor($FF00FF);
+ clAqua = TColor($FFFF00);
+ clLtGray = TColor($C0C0C0); // clSilver alias
+ clDkGray = TColor($808080); // clGray alias
+ clWhite = TColor($FFFFFF);
+var
+ RgbTriple: TFPColor;
+begin
+ case AColor of
+ clRed: Result := 'red';
+ clGreen: Result := 'green';
+ clBlue: Result := 'blue';
+ clPurple: Result := 'purple';
+ clYellow: Result := 'yellow';
+ clBlack: Result := 'black';
+ clWhite: Result := 'white';
+ clGray: Result := 'gray';
+ clMaroon: Result := 'maroon';
+ clFuchsia: Result := 'fuchsia';
+ clLime: Result := 'lime';
+ clNavy: Result := 'navy';
+ clAqua: Result := 'aqua';
+ clTeal: Result := 'teal';
+ clSilver: Result := 'silver';
+ else
+ begin
+ RgbTriple := TColorToFPColor(AColor);
+ Result := '#'+ IntToHex(RgbTriple.Red div $FF,2) + IntToHex(RgbTriple.Green div $FF,2) + IntToHex(RgbTriple.Blue div $FF,2);
+ end;
+ end;
+end;
+
+Procedure DoHtmlDirSeparators (Var FileName : String);
+Var I : longint;
+begin
+ For I:=1 to Length(FileName) do
+ If FileName[I] in AllowDirectorySeparators then
+ FileName[i] := HtmlDirectorySeparator;
+end;
+
+function UrlEscape(const Url: String): String;
+//see: http://en.wikipedia.org/wiki/Percent-encoding
+begin
+ Result := StringReplace(Url, #32, '%20', [rfReplaceAll]);
+end;
+
+end.
diff --git a/applications/lazedit/htmldialogs.pp b/applications/lazedit/htmldialogs.pp
new file mode 100644
index 000000000..cb32b768f
--- /dev/null
+++ b/applications/lazedit/htmldialogs.pp
@@ -0,0 +1,553 @@
+{ HtmlDialogs unit
+
+ Copyright (C) 2012 by Bart Broersma & Flying Sheep Inc.
+ http://home.tiscali.nl/~knmg0017/
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+unit HtmlDialogs;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, HtmlCode, Controls, Forms,
+ NewHtmlDlgForm, AnchorDlgForm, PictureDlgForm, HtmlCharMap, NewTableForm, CopyLeft;
+
+type
+
+ { TNewHtmlDlg }
+
+ TNewHtmlDlg = class
+ private
+ FTop: Integer;
+ FLeft: Integer;
+ FInitialDir: String;
+ FDocType: THtmlDocType;
+ FBackGroundColor: String;
+ FBackGroundImage: String;
+ FTextColor: String;
+ FLinkColor: String;
+ FVisitedColor: String;
+ FTitle: String;
+ FFavicon: String;
+ FUseStyleSheet: Boolean;
+ FDefaultStyleSheet: String;
+ FPrintStyleSheet: String;
+ //FInlineStyle: String;
+ FAuthor: String;
+ FHtmlText: String;
+ FDlg: TNewHtmlDlgForm;
+ protected
+ function GetInlineStyle: String;
+ function GetHtmlText: String;
+ procedure GetFormValues;
+ procedure SetFormValues;
+ public
+ function Execute: Boolean;
+
+ constructor Create;
+ destructor Destroy; override;
+
+ property Top: Integer read FTop write FTop;
+ property Left: Integer read FLeft write FLeft;
+ property InitialDir: string read FInitialDir write FInitialDir;
+ property Text: String read FHtmlText;
+ end;
+
+ { TAnchorDlg }
+
+ TAnchorDlg = class
+ private
+ FAnchorText: String;
+ FTop: Integer;
+ FLeft: Integer;
+ FUrl: String;
+ FDescription: String; //the visual text for the link
+ FTitle: String;
+ FId: String;
+ FClass: String;
+ FAnchorType: TAnchorType;
+ FDlg: TAnchorDlgForm;
+ function GetLinkRef: String; // the < a href=""> part
+ protected
+ function GetAnchorText: String;
+ procedure GetFormValues;
+ procedure SetFormValues;
+ public
+ function Execute: Boolean;
+
+ constructor Create;
+ destructor Destroy; override;
+
+ property Top: Integer read FTop write FTop;
+ property Left: Integer read FLeft write FLeft;
+ property Text: String read FAnchorText;
+ property LinkRef: String read GetLinkRef;
+ property Description: String read FDescription write FDescription;
+ property Title: String read FTitle;
+ property DomID: String read FId;
+ property DomClass: String read FClass;
+ end;
+
+
+ { THtmlCharMapDlg }
+
+ THtmlCharMapDlg = class(TObject)
+ private
+ FCharMapForm: THtmlCharMapForm;
+ function GetLeft: Integer;
+ procedure SetLeft(AValue: Integer);
+ function GetTop: Integer;
+ procedure SetTop(AValue: Integer);
+ function GetCharClick: THtmlCharClickEvent;
+ procedure SetCharClick(AValue: THtmlCharClickEvent);
+ protected
+ public
+ property Left: Integer read GetLeft write SetLeft;
+ property Top: Integer read GetTop write SetTop;
+ property OnHtmlCharClick: THtmlCharClickEvent read GetCharClick write SetCharClick;
+
+ constructor Create;
+ destructor Destroy; override;
+ procedure Execute;
+ end;
+
+ { TPictureDlg }
+
+ TPictureDlg = class(TObject)
+ private
+ FDlg: TPictureDlgForm;
+ FTop: Integer;
+ TFop: Integer;
+ FLeft: Integer;
+ FFileName: String;
+ FInitialDir: String;
+ FDefaultFolderPrefix: String;
+ FPicWidth: String;
+ FPicHeight: String;
+ FTitle: String;
+ FAlt: String;
+ FFloatStyle: String;
+ FDomId: String;
+ FDomClass: String;
+ protected
+ procedure GetFormValues;
+ procedure SetFormValues;
+ public
+ function Execute: Boolean;
+
+ constructor Create;
+ destructor Destroy; override;
+
+ property Top: Integer read FTop write FTop;
+ property Left: Integer read FLeft write FLeft;
+ property InitialDir: string read FInitialDir write FInitialDir;
+ property DefaultFolderPrefix: String read FDefaultFolderPrefix write FDefaultFolderPrefix;
+ property FileName: String read FFileName write FFileName;
+ property Title: String read FTitle;
+ property Alt: String read FAlt;
+ property PicWidth: String read FPicWidth;
+ property PicHeight: String read FPicHeight;
+ property FloatStyle: String read FFloatStyle;
+ property DomID: String read FDomId;
+ property DomClass: String read FDomClass;
+ end;
+
+
+ { TTableDlg }
+
+ TTableDlg = class(TObject)
+ private
+ FDlg: TNewTableForm;
+ FTop: Integer;
+ TFop: Integer;
+ FLeft: Integer;
+ FDomId: String;
+ FDomClass: String;
+ FSummary: String;
+ FColCount: Integer;
+ FRowCount: Integer;
+ protected
+ procedure GetFormValues;
+ procedure SetFormValues;
+ public
+ function Execute: Boolean;
+
+ constructor Create;
+ destructor Destroy; override;
+
+ property Top: Integer read FTop write FTop;
+ property Left: Integer read FLeft write FLeft;
+ property DomID: String read FDomId;
+ property DomClass: String read FDomClass;
+ property Summary: String read FSummary;
+ property RowCount: Integer read FRowCount;
+ property ColCount: Integer read FColCount;
+ end;
+
+var
+ NewHtmlDlg: TNewHtmlDlg;
+ AnchorDlg: TAnchorDlg;
+ HtmlCharMapDlg: THtmlCharMapDlg;
+ PictureDlg: TPictureDlg;
+ TableDlg: TTableDlg;
+
+implementation
+
+{ TTableDlg }
+
+procedure TTableDlg.GetFormValues;
+begin
+ FTop := FDlg.Top;
+ FLeft := FDlg.Left;
+ FSummary := FDlg.Summary;
+ FDomID := FDlg.DomId;
+ FDomClass := FDlg.DomClass;
+ FRowCount := FDlg.RowCount;
+ FColCount := FDlg.ColCount;
+end;
+
+procedure TTableDlg.SetFormValues;
+begin
+ if FTop > -1 then FDlg.Top := FTop;
+ if FLeft > -1 then FDlg.Left := FLeft;
+end;
+
+function TTableDlg.Execute: Boolean;
+begin
+ if not Assigned(FDlg) then FDlg := TNewTableForm.Create(nil);
+ SetFormValues;
+ Result := (FDlg.ShowModal = mrOk);
+ if Result then GetFormValues
+ else
+ begin //always remember Top/Left
+ FTop := FDlg.Top;
+ FLeft := FDlg.Left;
+ end;
+end;
+
+constructor TTableDlg.Create;
+begin
+ FDlg := nil;
+end;
+
+destructor TTableDlg.Destroy;
+begin
+ if Assigned(FDlg) then FDlg.Free;
+ inherited Destroy;
+end;
+
+{ TPictureDlg }
+
+procedure TPictureDlg.GetFormValues;
+begin
+ FTop := FDlg.Top;
+ FLeft := FDlg.Left;
+ FFileName := FDlg.Src;
+ FInitialDir := FDlg.InitialDir;
+ FDefaultFolderPrefix := FDlg.DefaultFolderPrefix;
+ FDomId := FDlg.DomId;
+ FDomClass := FDlg.DomClass;
+ FTitle := FDlg.Title;
+ FAlt := FDlg.Alt;
+ FPicWidth := FDlg.PicWidth;
+ FPicHeight := FDlg.PicHeight;
+ FFloatStyle := FDlg.FloatStyle;
+end;
+
+procedure TPictureDlg.SetFormValues;
+begin
+ if (TFop > -1) then FDlg.Top := FTop;
+ if (FLeft > -1) then FDlg.Left := FLeft;
+ FDlg.InitialDir := FInitialDir;
+ FDlg.DefaultFolderPrefix := FDefaultFolderPrefix;
+end;
+
+function TPictureDlg.Execute: Boolean;
+begin
+ if not Assigned(FDlg) then FDlg := TPictureDlgForm.Create(nil);
+ SetFormValues;
+ Result := (FDlg.ShowModal = mrOk);
+ if Result then GetFormValues
+ else
+ begin //always remember Top/Left
+ FTop := FDlg.Top;
+ FLeft := FDlg.Left;
+ end;
+end;
+
+constructor TPictureDlg.Create;
+begin
+ FDlg := nil;
+end;
+
+destructor TPictureDlg.Destroy;
+begin
+ if Assigned(FDlg) then FDlg.Free;
+ inherited Destroy;
+end;
+
+{ TAnchorDlg }
+
+function TAnchorDlg.GetLinkRef: String;
+var
+ STitle, SId, SClass, SCombined: String;
+begin
+ if (FTitle <> '') then STitle := 'title="' + FTitle + '"' else STitle := '';
+ if (FId <> '') then SId := 'id="' + FId + '"' else SId := '';
+ if (FClass <> '') then SClass := 'class="' + FClass + '"' else SClass := '';
+ SCombined := STitle;
+ if (SId <> '') then SCombined := SCombined + #32 + SId;
+ if (SClass <> '') then SCombined := SCombined + #32 + SClass;
+ case FAnchorType of
+ atUrl:
+ begin
+ Result := ' '') then Result := Result + #32 + SCombined;
+ Result := Result + '>';
+ end;
+ atMakeLocalAnchor:
+ begin
+ Result := ' '') then Result := Result + #32 + SCombined;
+ Result := Result + '>';
+ end;
+ atRefLocalAnchor:
+ begin
+ Result := ' '') then Result := Result + #32 + SCombined;
+ Result := Result + '>';
+ end;
+ end;
+end;
+
+function TAnchorDlg.GetAnchorText: String;
+begin
+
+end;
+
+procedure TAnchorDlg.GetFormValues;
+begin
+ FDescription := FDlg.Description;
+ FUrl := FDlg.Url;
+ FTitle := FDlg.Title;
+ FId := FDlg.DomId;
+ FClass := FDlg.DomClass;
+ FAnchorType := FDlg.AnchorType;
+ FTop := FDlg.Top;
+ FLeft := FDlg.Left;
+end;
+
+procedure TAnchorDlg.SetFormValues;
+begin
+ FDlg.Description := FDescription;
+ //clear Title and ID
+ FDlg.Title := '';
+ FDlg.DomId := '';
+ if (FTop >= 0) then FDlg.Top := FTop;
+ if (FLeft >= 0) then FDlg.Left := FLeft;
+end;
+
+function TAnchorDlg.Execute: Boolean;
+begin
+ if not Assigned(FDlg) then FDlg := TAnchorDlgForm.Create(nil);
+ SetFormValues;
+ Result := (FDlg.ShowModal = mrOk);
+ if Result then GetFormValues
+ else
+ begin //always remember Top/Left
+ FTop := FDlg.Top;
+ FLeft := FDlg.Left;
+ end;
+end;
+
+constructor TAnchorDlg.Create;
+begin
+ FDlg := nil;
+ FTop := -1;
+ FLeft := -1;
+end;
+
+destructor TAnchorDlg.Destroy;
+begin
+ FDlg.Free;
+ inherited Destroy;
+end;
+
+{ TNewHtmlDlg }
+
+
+function TNewHtmlDlg.GetInlineStyle: String;
+begin
+ Result := Style_Start + LineEnding +
+ 'body{' + LineEnding;
+ if (FBackGroundImage <> '') then
+ Result := Result + 'background: url("' + FBackGroundImage + '");' + LineEnding;
+ Result := Result +
+ 'background-color: ' + FBackGroundColor + ';'+ LineEnding +
+ 'color: ' + FTextColor + ';'+ LineEnding +
+ '}' + LineEnding +
+ 'a:link {color: ' + FLinkColor + ';}' + LineEnding +
+ 'a:visited {color: ' + FVisitedColor + ';}' + LineEnding +
+ Style_End;
+end;
+
+function TNewHtmlDlg.GetHtmlText: String;
+var
+ AStyleSheet, AInlineStyle: String;
+begin
+ AStyleSheet := '';
+ AInlineStyle := '';
+ if FUseStyleSheet then
+ begin
+ if (FDefaultStyleSheet <> '') then AStyleSheet := StyleSheet(FDefaultStyleSheet);
+ if (FprintStyleSheet <> '') then
+ begin
+ if (AStyleSheet <> '') then AStyleSheet := AStyleSheet + LineEnding;
+ AStyleSheet := AStyleSheet + StyleSheet(FPrintStyleSheet, 'print');
+ end;
+ end
+ else
+ begin
+ AInlineStyle := GetInlineStyle;
+ end;
+ Result := CreateHtml(FDocType, FAuthor, FTitle, FFavicon, AStyleSheet, AInlineStyle, MetaGeneratorName);
+end;
+
+procedure TNewHtmlDlg.GetFormValues;
+begin
+ FDocType := FDlg.DocType;
+ FAuthor := FDlg.Author;
+ FTitle := FDlg.Title;
+ FDefaultStyleSheet := FDlg.DefaultStyleSheet;
+ FPrintStyleSheet := FDlg.PrintStyleSheet;
+ FBackGroundImage := FDlg.BackgroundImage;
+ FUseStyleSheet := FDlg.UseStyleSheet;
+ FLeft := FDlg.Left;
+ FTop := FDlg.Top;
+ FInitialDir := FDlg.InitialPictureDir;
+end;
+
+procedure TNewHtmlDlg.SetFormValues;
+begin
+ if (FTop >= 0) then FDlg.Top := FTop;
+ if (FLeft >= 0) then FDlg.Left := FLeft;
+ FDlg.InitialPictureDir := FInitialDir;
+end;
+
+function TNewHtmlDlg.Execute: Boolean;
+begin
+ if not Assigned(Fdlg) then FDlg := TNewHtmlDlgForm.Create(nil);
+ SetFormValues;
+
+ //Result := True; //<------ REMOVE THIS
+
+ Result := (FDlg.ShowModal = mrOk);
+ if Result then GetFormValues
+ else
+ begin //always remember Top/Left
+ FTop := FDlg.Top;
+ FLeft := FDlg.Left;
+ end;
+ if Result then FHtmlText := GetHtmlText;
+end;
+
+constructor TNewHtmlDlg.Create;
+begin
+ FBackGroundColor := '#ffffff';
+ FTextColor := '#000000';
+ FLinkColor := '#0000ff';
+ FVisitedColor := '#ff00ff';
+ FLeft := -1;
+ FTop := -1;
+ FDocType := DocType_Html_401_Strict;
+ FDlg := nil;
+end;
+
+destructor TNewHtmlDlg.Destroy;
+begin
+ if Assigned(FDlg) then FDlg.Free;
+ inherited Destroy;
+end;
+
+{ THtmlCharMapDlg }
+
+constructor THtmlCharMapDlg.Create;
+begin
+ FCharMapForm := THtmlCharMapForm.Create(nil);
+end;
+
+destructor THtmlCharMapDlg.Destroy;
+begin
+ if Assigned(FCharMapForm) then FCharMapForm.Free;
+end;
+
+
+procedure THtmlCharMapDlg.Execute;
+begin
+ FCharMapForm.Show;
+end;
+
+procedure THtmlCharMapDlg.SetLeft(AValue: Integer);
+begin
+ if (AValue < 0) then Exit;
+ FCharMapForm.Left := AValue;
+end;
+
+function THtmlCharMapDlg.GetLeft: Integer;
+begin
+ Result := FCharMapForm.Left;
+end;
+
+procedure THtmlCharMapDlg.SetTop(AValue: Integer);
+begin
+ if (AValue < 0) then Exit;
+ FCharMapForm.Top := AValue;
+end;
+
+function THtmlCharMapDlg.GetTop: Integer;
+begin
+ Result := FCharMapForm.Top;
+end;
+
+
+function THtmlCharMapDlg.GetCharClick: THtmlCharClickEvent;
+begin
+ Result := FCharMapForm.OnHtmlCharClick;
+end;
+
+
+procedure THtmlCharMapDlg.SetCharClick(AValue: THtmlCharClickEvent);
+begin
+ FCharMapForm.OnHtmlCharClick := AValue;
+end;
+
+
+
+end.
+
diff --git a/applications/lazedit/lazedit.lpi b/applications/lazedit/lazedit.lpi
new file mode 100644
index 000000000..b453430b3
--- /dev/null
+++ b/applications/lazedit/lazedit.lpi
@@ -0,0 +1,1019 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/applications/lazedit/lazedit.lpr b/applications/lazedit/lazedit.lpr
new file mode 100644
index 000000000..bc613d2b7
--- /dev/null
+++ b/applications/lazedit/lazedit.lpr
@@ -0,0 +1,22 @@
+program lazedit;
+
+{$mode objfpc}{$H+}
+
+uses
+ {$IFDEF UNIX}{$IFDEF UseCThreads}
+ cthreads,
+ {$ENDIF}{$ENDIF}
+ Interfaces, // this includes the LCL widgetset
+ Forms, main {,newtableform, test_ed, eplus_commons, CopyLeft, eplus_config, HtmlCharMap,
+ HtmlDialogs, NewHtmlDlgForm, AnchorDlgForm, PictureDlgForm}
+ { you can add units after this };
+
+{$R *.res}
+
+begin
+ RequireDerivedFormResource := True;
+ Application.Initialize;
+ Application.CreateForm(TEPlusForm, EPlusForm);
+ Application.Run;
+end.
+
diff --git a/applications/lazedit/lazedit.res b/applications/lazedit/lazedit.res
new file mode 100644
index 000000000..e66ecf85f
Binary files /dev/null and b/applications/lazedit/lazedit.res differ
diff --git a/applications/lazedit/main.lfm b/applications/lazedit/main.lfm
new file mode 100644
index 000000000..2a8f17b21
--- /dev/null
+++ b/applications/lazedit/main.lfm
@@ -0,0 +1,2107 @@
+object EPlusForm: TEPlusForm
+ Left = 634
+ Height = 418
+ Top = 143
+ Width = 575
+ AllowDropFiles = True
+ Caption = 'Lazarus Text Editor'
+ ClientHeight = 398
+ ClientWidth = 575
+ Menu = MainMenu
+ OnClose = FormClose
+ OnCloseQuery = FormCloseQuery
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ OnDropFiles = FormDropFiles
+ OnShow = FormShow
+ LCLVersion = '0.9.31'
+ object StatusBar: TStatusBar
+ Left = 0
+ Height = 23
+ Top = 375
+ Width = 575
+ Panels = <
+ item
+ Width = 100
+ end
+ item
+ Width = 120
+ end
+ item
+ Width = 50
+ end
+ item
+ Width = 50
+ end>
+ SimplePanel = False
+ SizeGrip = False
+ end
+ object MainToolbar: TToolBar
+ Left = 0
+ Height = 26
+ Top = 0
+ Width = 575
+ Caption = 'MainToolbar'
+ ChildSizing.HorizontalSpacing = 5
+ Images = MainToolbarImageList
+ ParentShowHint = False
+ ShowHint = True
+ TabOrder = 1
+ object NewPlainBtn: TToolButton
+ Left = 24
+ Top = 2
+ Action = acFileNewPlain
+ end
+ object OpenBtn: TToolButton
+ Left = 47
+ Top = 2
+ Action = acFileOpen
+ end
+ object SaveBtn: TToolButton
+ Left = 70
+ Top = 2
+ Action = acFileSave
+ end
+ object SaveAllBtn: TToolButton
+ Left = 93
+ Top = 2
+ Action = acFileSaveAll
+ end
+ object CopyBtn: TToolButton
+ Left = 126
+ Top = 2
+ Action = acEditCopy
+ end
+ object NewFromTemplateBtn: TToolButton
+ Left = 1
+ Top = 2
+ Action = acFileNewFromTemplate
+ end
+ object tbSep1: TToolButton
+ Left = 116
+ Top = 2
+ Width = 10
+ Caption = 'tbSep1'
+ Style = tbsSeparator
+ end
+ object PasteBtn: TToolButton
+ Left = 149
+ Top = 2
+ Action = acEditPaste
+ end
+ object FindBtn: TToolButton
+ Left = 182
+ Top = 2
+ Action = acEditFind
+ end
+ object tbSep2: TToolButton
+ Left = 172
+ Top = 2
+ Width = 10
+ Caption = 'tbSep2'
+ Style = tbsSeparator
+ end
+ object tbSep3: TToolButton
+ Left = 205
+ Top = 2
+ Width = 10
+ Caption = 'tbSep3'
+ Style = tbsSeparator
+ end
+ object InfoBtn: TToolButton
+ Left = 215
+ Hint = 'Info'
+ Top = 2
+ Caption = 'InfoBtn'
+ ImageIndex = 8
+ end
+ end
+ object HtmlToolbar: TToolBar
+ Left = 0
+ Height = 26
+ Top = 26
+ Width = 575
+ Caption = 'HtmlToolbar'
+ EdgeBorders = [ebTop, ebBottom]
+ Images = HtmlToolbarImageList
+ ParentShowHint = False
+ ShowHint = True
+ TabOrder = 2
+ object AnchorBtn: TToolButton
+ Left = 1
+ Top = 2
+ Action = acInsertAnchor
+ end
+ object ImageBtn: TToolButton
+ Left = 24
+ Top = 2
+ Action = acInsertPicture
+ end
+ object UListBtn: TToolButton
+ Left = 57
+ Top = 2
+ Action = acInsertUList
+ end
+ object NListBtn: TToolButton
+ Left = 80
+ Top = 2
+ Action = acInsertNlist
+ end
+ object ListItemBtn: TToolButton
+ Left = 103
+ Top = 2
+ Action = acInsertListItem
+ end
+ object TableBtn: TToolButton
+ Left = 136
+ Top = 2
+ Action = acInsertTable
+ end
+ object BoldBtn: TToolButton
+ Left = 169
+ Top = 2
+ Action = acLayoutBold
+ end
+ object ItalicBtn: TToolButton
+ Left = 192
+ Top = 2
+ Action = acLayoutItalic
+ end
+ object UnderlineBtn: TToolButton
+ Left = 215
+ Top = 2
+ Action = acLayoutUnderline
+ end
+ object SupBtn: TToolButton
+ Left = 284
+ Top = 2
+ Action = acLayoutSup
+ end
+ object SubBtn: TToolButton
+ Left = 307
+ Top = 2
+ Action = acLayoutSub
+ end
+ object HeadingBtn: TToolButton
+ Left = 340
+ Hint = 'Heading (H1..H6)'
+ Top = 2
+ DropdownMenu = HeadingDropDownMenu
+ ImageIndex = 11
+ Style = tbsDropDown
+ end
+ object LeftAlignBtn: TToolButton
+ Left = 385
+ Top = 2
+ Action = acLayoutAlignLeft
+ end
+ object RightAlignBtn: TToolButton
+ Left = 408
+ Top = 2
+ Action = acLayoutAlignRight
+ end
+ object CenterAlignBtn: TToolButton
+ Left = 431
+ Top = 2
+ Action = acLayoutAlignCenter
+ end
+ object JustifyAlignBtn: TToolButton
+ Left = 454
+ Top = 2
+ Action = acLayoutAlignJustify
+ end
+ object ParaBtn: TToolButton
+ Left = 487
+ Top = 2
+ Action = acGroupingParagraph
+ end
+ object tbSep4: TToolButton
+ Left = 47
+ Top = 2
+ Width = 10
+ Caption = 'tbSep4'
+ Style = tbsSeparator
+ end
+ object tbSep5: TToolButton
+ Left = 126
+ Top = 2
+ Width = 10
+ Caption = 'tbSep5'
+ Style = tbsSeparator
+ end
+ object tbSep6: TToolButton
+ Left = 159
+ Top = 2
+ Width = 10
+ Caption = 'tbSep6'
+ Style = tbsSeparator
+ end
+ object tbSep7: TToolButton
+ Left = 330
+ Top = 2
+ Width = 10
+ Caption = 'tbSep7'
+ Style = tbsSeparator
+ end
+ object tbSep8: TToolButton
+ Left = 375
+ Top = 2
+ Width = 10
+ Caption = 'tbSep8'
+ Style = tbsSeparator
+ end
+ object tbSep9: TToolButton
+ Left = 477
+ Top = 2
+ Width = 10
+ Caption = 'tbSep9'
+ Style = tbsSeparator
+ end
+ object DivBtn: TToolButton
+ Left = 510
+ Top = 2
+ Action = acGroupingDiv
+ end
+ object SpanBtn: TToolButton
+ Left = 533
+ Top = 2
+ Action = acGroupingSpan
+ end
+ object EmBtn: TToolButton
+ Left = 238
+ Top = 2
+ Action = acLayoutEmphasis
+ end
+ object StrongBtn: TToolButton
+ Left = 261
+ Top = 2
+ Action = acLayoutStrong
+ end
+ end
+ object OpenDialog: TOpenDialog
+ Options = [ofHideReadOnly, ofEnableSizing, ofViewDetail]
+ left = 400
+ top = 336
+ end
+ object SaveDialog: TSaveDialog
+ Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing, ofViewDetail]
+ left = 344
+ top = 336
+ end
+ object MainToolbarImageList: TImageList
+ left = 48
+ top = 83
+ Bitmap = {
+ 4C69090000001000000010000000FFFFFF00C17D4460C88B4DBBC88C4FEEC88C
+ 4FF6C88C4FF7C88C4FF7C88D4FF7C98C4FF7C78B4FF7C5894BD4C4763B91B368
+ 3C06FFFFFF00FFFFFF00FFFFFF00FFFFFF00C48549C3F7F2ECECF8F4EEFCF8F4
+ EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B27DFFDB94
+ 65F5B3683B07FFFFFF00FFFFFF00FFFFFF00C5884BEAFAF6F2FCFAE0C7FFFBE1
+ C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8B4FFE1B0
+ 7DFFDB9264F6B46B3E07FFFFFF00FFFFFF00C6894CF6F9F5F1FFFCE3CDFFFBE3
+ CEFFFBE3CDFFFBE2CBFFF9E0C8FFF8DCC2FFF5D6BAFFFDFBF8FFFCE6CDFFFAE5
+ C9FFE2B684FFBF7942A6FFFFFF00FFFFFF00C6894BF7F9F5F1FFFCE3CFFFFBE4
+ D0FFFCE4CFFFFCE3CDFFFAE1CAFFF9DDC4FFF6D9BCFFF4E9DFFFF7F2ECFFFBF7
+ F3FFF5EFE9FFC27E45FBFFFFFF00FFFFFF00C6894BF7F9F4F0FFFCE6D3FFFCE6
+ D4FFFDE7D3FFFCE4D1FFFBE3CDFFFAE0C8FFF8DCC2FFF5D6BBFFF3D4B5FFF1D2
+ B3FFF8F4F0FFC48246F7FFFFFF00FFFFFF00C6884AF7F9F4EFFFFEE7D7FFFDE7
+ D6FFFDE7D5FFFDE6D4FFFCE6D2FFFBE1CCFFFADFC7FFF8DCC2FFF6DABDFFF6D8
+ BBFFFAF4EFFFC68346F7FFFFFF00FFFFFF00C68849F7F9F4EDFFFEE8D8FFFEE8
+ D8FFFEE8D7FFFEE7D6FFFDE5D3FFFCE4D1FFFBE1CCFFFAE0C7FFF9DDC3FFF8DC
+ C2FFFAF4EDFFC68245F7FFFFFF00FFFFFF00C68447F7F9F3ECFFFEE8D6FFFEE8
+ D7FFFDE7D6FFFDE7D6FFFDE7D5FFFDE5D3FFFBE4D0FFFBE3CCFFFADFC7FFFADF
+ C6FFFAF2EAFFC68042F7FFFFFF00FFFFFF00C58245F7F8F2EBFFFEE7D6FFFDE7
+ D6FFFDE7D6FFFDE7D6FFFDE6D5FFFDE5D3FFFCE4D1FFADBC9FFF609873FF4F8E
+ 66FF4A8A61FF7A7A44FBFFFFFF00FFFFFF00C58042F7F8F1E8FFFEE5D5FFFDE5
+ D3FFFDE5D3FFFCE5D3FFFCE5D3FFFCE4D1FFA6B89BFF61AB81FF95D4B4FFBAE6
+ D0FF6ABB8FFF2D8F57FF196B378CFFFFFF00C47C40F7F7F0E6FFF8B455FFF7B4
+ 56FFF7B554FFF8B453FFF8B253FFF7B352FF4A885DFF90D3B1FF92D6B1FFFFFF
+ FF0065BC8CFF67BC8FFF196B37F7FFFFFF00C1783CF7F7EDE3FFFDC26EFFFFD8
+ A0FFFFD79EFFFFD69BFFFFD798FFFFD696FF317B4CFF9CD4B6FFFFFFFF00FFFF
+ FF00FFFFFF0095D2B2FF196B37FFFFFFFF00BF7138F5F5EBDFFEFDBF68FFFCBD
+ 67FFFBBE65FFFCBE64FFFCBE64FFFCBD62FF226F3AFF62BA8BFF60BA87FFFFFF
+ FF0060B987FF67BC8FFF196B37F7FFFFFF00BC6933DEF8F1EAF2F7ECDFFDF6EB
+ DEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFF86AD8EFF288C53FF64BA8DFF95D2
+ B2FF64BA8DFF288C53FF196B378CFFFFFF00BB6A346BBA6530BCBB6631EDBA66
+ 30F7BA6630F7BA6630F7BA6530F7BA652FF7B9652EF7626833FB216B37FF196B
+ 37FF1F6B37FC416935B6FFFFFF00FFFFFF000000001C00000033000000360000
+ 0036000000360000003600000036000000360000003600000036000000200000
+ 0002FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000033F8F8F8F0FBFBFBFDFCFC
+ FCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFF8F8F8FF949494910000
+ 002000000002FFFFFF00FFFFFF00FFFFFF0000000036FBFBFBFDF4F4F4FFF5F5
+ F5FFF5F5F5FFF5F5F5FFF1F1F1FFEFEFEFFFE9E9E9FFFCFCFCFFE7E7E7FF9595
+ 95910000002000000002FFFFFF000000000100000036FCFCFCFFF7F7F7FFF9F9
+ F9FFF7F7F7FFF7F7F7FFF3F3F3FFF0F0F0FFEAEAEAFFFCFCFCFFF6F6F6FFF4F4
+ F4FF9999999100000020FFFFFF000000000100000036FCFCFCFFF9F9F9FFC0C0
+ C0FFBABABAFFB4B4B4FFAFAFAFFFAAAAAAFFA5A5A5FFFCFCFCFFFCFCFCFFFCFC
+ FCFFFCFCFCFF00000036000000010000000100000036FCFCFCFFFBFBFBFFFCFC
+ FCFFFCFCFCFFFBFBFBFFF8F8F8FFF5F5F5FFF1F1F1FFECECECFFEAEAEAFFE6E6
+ E6FFFCFCFCFF00000036000000010000000100000036FCFCFCFFFCFCFCFFC7C7
+ C7FFC2C2C2FFBEBEBEFFB8B8B8FFB4B4B4FFB1B1B1FFAEAEAEFFACACACFFEDED
+ EDFFFCFCFCFF00000036000000010000000100000036FCFCFCFFFCFCFCFFFCFC
+ FCFFFCFCFCFFFCFCFCFFFCFCFCFFFBFBFBFFF8F8F8FFF6F6F6FFF3F3F3FFF2F2
+ F2FFFCFCFCFF00000036000000010000000100000036FCFCFCFFFCFCFCFFCECE
+ CEFFCACACAFFC6C6C6FFC3C3C3FFC0C0C0FFBDBDBDFFBCBCBCFFBABABAFFF6F6
+ F6FFFCFCFCFF00000036000000010000000100000036FCFCFCFFFCFCFCFFFCFC
+ FCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFBFBFBFFF9F9F9FFF9F9F9FFF8F8
+ F8FFFCFCFCFF00000036000000010000000100000036FCFCFCFFFCFCFCFFD6D6
+ D6FFD3D3D3FFCFCFCFFFCDCDCDFFCBCBCBFFC8C8C8FFC8C8C8FFC6C6C6FFF8F8
+ F8FFFCFCFCFF00000036000000010000000100000036FCFCFCFFFCFCFCFFFCFC
+ FCFFFCFCFCFFFBFBFBFFFBFBFBFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFA
+ FAFFFCFCFCFF00000036000000010000000100000036FCFCFCFFFCFCFCFFDDDD
+ DDFFDBDBDBFFD9D9D9FFD7D7D7FFD5D5D5FFD4D4D4FFD4D4D4FFD4D4D4FFFBFB
+ FBFFFCFCFCFF00000036000000010000000100000036FCFCFCFEFCFCFCFFFCFC
+ FCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFC
+ FCFFFCFCFCFD00000036FFFFFF00FFFFFF0000000034F9F9F9F5FCFCFCFDFCFC
+ FCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFC
+ FCFDF9F9F9F300000033FFFFFF00FFFFFF000000001D00000034000000360000
+ 0036000000360000003600000036000000360000003600000036000000360000
+ 0036000000330000001DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0034B4D9D05EC2E1FA60C3E2FA60C3
+ E2FA60C3E2FA5FC3E2FA3CB6DBDD2CB2D8162CB2D80F2CB2D80F2CB2D80F2CB2
+ D80F2CB3D80F2CB3D804FFFFFF00FFFFFF0036B3DAF8FDFEFEFFFEFFFFFFFEFE
+ FFFFFDFEFFFFFEFFFFFFEAF7FBFF6BC7E4F96BC7E3F86BC7E3F86BC7E3F879CD
+ E6F774CAE5E132B1D956FFFFFF00FFFFFF0035AFDAF0F7FCFEFF8EE4F8FF91DE
+ F5FF9FE0F5FFACE1F6FFEFFBFEFFF4FDFEFFF3FCFEFFF1FCFEFFEFFBFEFFEEFB
+ FEFFFAFDFFF936AFDAD4FFFFFF00FFFFFF0036AADAF2F1FAFDFF94DEF5FF93DC
+ F4FF81D5F2FF6ACAEDFF6CCBEAFF85D3EFFF80D2EFFF7AD0EFFF76CFEEFF72CF
+ EEFFE9F7FBFF34AEDAF3FFFFFF00FFFFFF0035ABDAFAE8F6FBFF94D4EFFF88CE
+ EEFF73C1E9FFC9E9F6FFF2FCFEFFF3FCFEFFF2FCFEFFF0FCFEFFEFFBFEFFEEFB
+ FEFFFEFFFFFF36ABDAF7FFFFFF00FFFFFF0037A6DAFAFEFFFFFFF8FDFFFFF6FD
+ FFFFF5FCFFFFF3FCFEFFD8F6FCFF94E6F8FF85E3F7FF76DFF6FF68DBF5FF5CD8
+ F4FFD7F4FCFF35A4DAF7FFFFFF00FFFFFF0036A1DAF9F6FCFEFFC8F2FCFFB9EF
+ FBFFACECFAFF9CE8F9FF8BE3F7FF7CE0F6FF6CDCF6FF5DD9F5FF4FD6F4FF44D3
+ F3FFD0F3FCFF359FDAF7FFFFFF00FFFFFF00369ADAF8F2FAFDFFB3EDFAFFA4E9
+ F9FF95E6F8FF85E2F7FF76DEF6FF65DBF5FF57D7F4FF49D4F3FF3BD1F2FF30CE
+ F1FFCCF2FBFF3598DAF7FFFFFF00FFFFFF003594DAF7EFFAFEFFA1E9F9FF91E5
+ F8FF81E1F7FF72DEF6FF63DAF5FF54D7F4FF47D3F3FF39D0F2FF2ECDF1FF26CB
+ F0FFCAF2FBFF3594DAF7FFFFFF00FFFFFF00338ED9E6DCF0FAF0A7DDF4FD9EDB
+ F4FF96DAF3FF8ED8F3FF86D7F3FF7FD4F2FF79D3F2FF72D2F1FF6CD0F1FF69CF
+ F1FFC2EAF8FE338ED9F0FFFFFF00FFFFFF002C86D8702D88D8A62D87D8EA2D88
+ D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D87
+ D8F72D88D8F12C86D893FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00BC6B3671BC6B3690BC6B36CCBC6B36EEBC6B
+ 36FABB6B36FEBB6B36FFBB6A36FFBB6A36FFBC6C39FFBD6E3BFFBB6D3AFFBB6B
+ 38EFBB703ECBB6693554FFFFFF00BC6B369BF6E0D1FFF7E0D1FFFEFBF8FFFEFB
+ F7FFFDF9F6FFFCF5F0FFFAF0EAFFFBF2EDFFFDF9F6FFFDFAF7FFFBF1EBFFF8E9
+ DFFEECD0BDFBC9895EECB5693563BC6B36D8F6DFD1FFE9AA80FFFEFAF6FFFDFA
+ F6FFC88C64FFFBF3EEFFFBF1EAFFFCF6F2FFFEFBF8FFFCF6F1FFF9ECE2FFF8E7
+ DBFFEED0BAFFECD0BDFFBB703EF8BC6B36F0F6DFD0FFE8A87EFFFCF6F1FFFCF6
+ F1FFC88C64FFFAF1E9FFFBF4EEFFFDFAF7FFFDF9F6FFFAF0E8FFF8E8DDFFF7E6
+ DBFFE1A37AFFEFD5C3FFB76935FEBC6B36FAF5DDCCFFE7A87EFFFAF0E8FFFAF0
+ E8FFC98D66FFFAF0E9FFFDF8F3FFFEFAF8FFFCF4EFFFF9E9DFFFF7E7DBFFF7E5
+ D9FFE0A278FFE7C2A9FFB66835FFBB6B36FEF4DCC9FFE7A77DFFF9ECE1FFF9EC
+ E1FFF9EDE3FFFCF4EEFFFDFAF7FFFDF7F3FFFAEDE5FFF7E7DBFFF7E5D9FFF6E5
+ D8FFDEA077FFE4BEA4FFB46734FFBB6B36FFF4D9C7FFE6A67DFFC88C64FFC98D
+ 65FFC98E67FFCB926CFFCB926DFFCA9069FFC88C65FFC88C64FFC88C64FFC88C
+ 64FFDA9C74FFE1BA9FFFB36634FFBB6A36FFF2D8C5FFE3A47BFFE3A37AFFE3A4
+ 7AFFE2A47BFFE2A37BFFE1A37BFFE1A279FFDFA077FFDE9F76FFDD9E74FFDB9C
+ 72FFDC9D74FFDDB59AFFB16534FFBB6A36FFF2D5C2FFE3A37AFFE3A37AFFE2A3
+ 7BFFE2A37BFFE2A47BFFE1A279FFE0A178FFDEA077FFDE9E75FFDC9D74FFDA9B
+ 73FFD99B73FFDAB095FFAF6433FFBB6A36FFF0D2BEFFE2A37AFFE2A37AFFE1A3
+ 7AFFE2A37BFFE1A37BFFE0A178FFDE9F77FFDD9F76FFDC9D74FFD99B72FFD899
+ 71FFD69970FFD5AB8EFFAD6333FFBA6A3600EFD0BBFFE2A27AFFFEFBF8FFFEFB
+ F8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFB
+ F8FFD3966DFFD2A78AFFAB6232FFBB6B38FFEFCEB8FFE1A279FFFEFAF7FF62C0
+ 88FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FFFDF9
+ F6FFCF936AFFCEA384FFAA6132FFBB6C38FFEECCB6FFE1A27AFFFEFAF7FFBFDC
+ C2FFBFDCC2FFBFDCC2FFBFDCC2FFBFDCC2FFBFDCC2FFBFDCC2FFBFDCC2FFFDF9
+ F6FFCD9068FFCC9E81FFA86132FFBA6B37FEEDCAB3FFE0A27AFFFEFAF7FF62C0
+ 88FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FF62C088FFFDF9
+ F6FFCA8D65FFC99B7CFFA76031FEBA6A35DEEBC6ADFFEAC5ADFFFEFBF8FFFEFB
+ F8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFB
+ F8FFC89A7CFFC79879FFA76031EDBA6A3600B96935B5B86935EEB76835FFB568
+ 35FFB46734FFB26634FFB06533FFAE6433FFAC6332FFAA6232FFA96132FFA860
+ 31FFA76031FEA66031F1A86131C4FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D4976EC9D49E7BC9D09871C9D6A4
+ 82C9CD8E68C9CD9069C9D09A75C9D19973C9C88B62C9AD5A202BFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CC8D65C9F3CDB0C9FFFFFF00E3C7
+ B3C9FFFFFF00FFFFFF00FFFFFF00FFFFFF00EABFA1C9C98960C9FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C7865BC9EFC09EC9D9A27DF8D39D
+ 7AF8D5A380F8DAAE8FF8D29A77F8D29B77F8D29C77F8D09771F8C88B62DEAD5A
+ 202FFFFFFF00FFFFFF00FFFFFF00FFFFFF00C8885DC9EFBFA1C9D19975F8F4D2
+ B8F8FFFFFF00E6CDBBF8FFFFFEF8FFFFFF00FBF6F2F8F8F1EDF8EABFA1DEC989
+ 60DEFFFFFF00FFFFFF00FFFFFF00FFFFFF00CA8D65C9EAB899C9C9895FF8EDBD
+ 9BF8D4976EFFD49E7BFFD09871FFD6A482FFCD8E68FFCD9069FFD09A75FFD199
+ 73FFC88B62FFAD5A2036FFFFFF00FFFFFF00C98B61C9E6B592C9CB8B61F8EEBC
+ 9EF8CC8D65FFF3CDB0FFFFFFFF00E3C7B3FFFFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00EABFA1FFC98960FFFFFFFF00FFFFFF00C48154C9EAB697C9CE9873F8EABE
+ A1F8C7865BFFEFC09EFFFFFFFF00CC936EFFFFFFFF00FFFFFF00FFFBF7FFFFF8
+ F1FFE4AF8CFFC78A61FFFFFFFF00FFFFFF00C37F51C9EFB69AC9CC966FF8D6B6
+ 91F8C8885DFFEFBFA1FFFDFCFAFFFEFCFBFFFEFDFDFFFEFDFCFFFDFBFAFFFDFC
+ FBFFDDA885FFC17F53FFFFFFFF00FFFFFF00C68355C9EFCEBAC9C78E66F8E0BC
+ 9CF8CA8D65FFEAB899FFDDA57EFFDDA680FFDBA37CFFD9A07AFFD9A079FFD89F
+ 78FFD89E78FFBF845DFFFFFFFF00FFFFFF00BA68339BC38458C9C58053F8EEB2
+ 96F8C98B61FFE6B592FFE2A781FFE1A781FFDEA37DFFDCA17BFFDB9F79FFD99E
+ 77FFD49A73FFBB7E57FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00C68355DEEFCE
+ BADEC48154FFEAB697FFF3F3EAFFEDF1E6FFEFF1E6FFEFF0E6FFEDF1E5FFF3F5
+ EDFFD59C79FFB07044FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00BA6833ACC384
+ 58DEC37F51FFEFB69AFFEAF3E8FF51BF84FF6FC998FF71C999FF54BF84FFE4F4
+ E9FFDD9C7BFFAA693AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00C68355FFEFCEBAFFDDFFFFFF87EEC7FFA2F4D7FFA2F6D7FF8CEEC7FFE0FF
+ FFFFDDA285FFAB6A3EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00BA6833C5C38458FFD38B68FFE18F70FFDC8D6CFFDA8B6DFFD78A6EFFCD8B
+ 6CFFAB6D44FFA65F2EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00C77947AACC8655CECC8857DECB8856DBCC88
+ 56DBCB8757DBCA8350D0C479426EB2673C08FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00CA8554D0FFFFFF00FDF3E9DEFDF3EADEFCF2
+ E8DEFAEFE3DEFAF2E7DEEABB88DECF85559CB4693D0AFFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00CB8656DAFEF5EDDEFCDEC5DEFBE0C7DEF9DC
+ C2DEF5D3B4DEFEF9F3DEFAE2C4DEECC193DEC37D4880FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00CB8655DBFEF6F0DEFCE2CDDEFCE3CDDEFADF
+ C8DEF7D9BCDEF5E9DDDEFAF3EBDEFBF8F3DECD9565DCFFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00CB8655DBFEF7F1DEFCE5D2DEFCE4D1DEFBE2
+ CCDEF9DDC4DEEAC39DFFE6BF96FFE4BB92FFE4BB92FFD1A06CF5D09E6DF6CC96
+ 5FDAC479427EB2673C09FFFFFF00CB8654DBFFF7F2DEFEE7D5DEFEE7D5DEFDE5
+ D1DEFAE0CADEE5BE96FFFFFFFEFFFDF3E9FFFDF3EAFFFCF2E8FFFAEFE3FFFAF2
+ E7FFEABB88FFCF8555B3B4693D0CCB8553DBFFF7F0DEFFE7D5DEFDE7D6DEFDE6
+ D4DEFCE4D0DEE4BB93FFFEF5EDFFFCDEC5FFFBE0C7FFF9DCC2FFF5D3B4FFFEF9
+ F3FFFAE2C4FFECC193FFC37D4893CA8452DBFFF7F1DEFFE9D9DEFFEADBDEFFE9
+ D9DEFFE7D7DEE4BB92FFFEF6F0FFFCE2CDFFFCE3CDFFFADFC8FFF7D9BCFFF5E9
+ DDFFFAF3EBFFFBF8F3FFCA8353FECC8352DBFBF5EEDEFFE9D9DEFFEADBDEFFE9
+ D9DEFFE7D7DEE4BB92FFFEF7F1FFFCE5D2FFFCE4D1FFFBE2CCFFF9DDC4FFF6D7
+ BBFFF3D1AFFFFAEFE4FFCC8758FECF8253DEEFF1E7DEFFE9D9DEFFEADBDEFFE9
+ D9DEFFE7D7DEE4BB91FFFFF7F2FFFEE7D5FFFEE7D5FFFDE5D1FFFAE0CAFFF9DE
+ C4FFF7D9BCFFFDF2E7FFCC8757FEC87C4ED3FCF3ECDEFAF1E8DEFAF0E7DEFBF1
+ E9DEFBF2EADEE4BA91FFFFF7F0FFFFE7D5FFFDE7D6FFFDE6D4FFFCE4D0FFFBE3
+ CBFFFADCC2FFFEF3E8FFCC8656FEC7794AB9C8794BCEC87545DDC77545D4C875
+ 45D4C77545D4CA8452FFFFF7F1FFFFE9D9FFFFEADBFFFFE9D9FFFFE7D7FFFFE5
+ D2FFFFE2CBFFFFF7F1FFCB8555FEFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00CC8352FBFBF5EEFFFFE9D9FFFFEADBFFFFE9D9FFFFE7D7FFFFE5
+ D2FFFFE2CBFFFBF6EFFFCC8355FEFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00CF8253FFEFF1E7FFFFE9D9FFFFEADBFFFFE9D9FFFFE7D7FFFFE5
+ D2FFFFE2CBFFEFF2E8FFCE8156FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00C77949EDFCF3ECFFFAF1E8FFFAF0E7FFFBF1E9FFFBF2EAFFFBF2
+ EAFFFBF2EBFFFDF4EEFFCA8054F9FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00C57342C1C67545E6C87545FEC77545F3C87545F3C77545F3C775
+ 45F3C87546F4C57444E8CA7F53F1FFFFFF00FFFFFF002063982A206398FF2063
+ 98FF206398FF206398FF206398FF206398F0FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF0020639832206398B2206398FF3775A4FFB6EF
+ FEFF80DBF3FF80DBF3FFB6EFFEFF2E6EA1FF206398FF206398A520639853FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00206398E071B3DBFE7EBFE4FF4E9DDFFFB5EE
+ FDFF75D4F0FF75D4F0FFB5EEFDFF4B9BDEFF6EB4E0FF6DB3DFF9206398F3FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00206398FF7FBFE4FF69B2DEFF4A9BDAFF4497
+ DCFF4396DCFF4296DCFF4295DCFF4195DBFF519ED6FF6CB2DEFF206398FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00206398FF7CBDE4FF65AEDDFF62ABDCFF5EA8
+ DAFF5CA7D9FF5CA7D9FF5CA7D9FF5CA7D9FF529FD7FF62A3D8FF206398FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00206398FF7ABBE3FF61AADBFF5AA5D9FF53A0
+ D7FF529FD7FF529FD7FF529FD7FF529FD7FF529FD7FF62A3D8FF206398FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00206398FF76B9E2FF5CA7D9FF58A4D8FF53A0
+ D7FF539ED5FF618BA9FF6488A1FF6487A1FF6386A0FF69879FFF4A6881FF6A6A
+ 6A8A6868688A6565658A62626263206398FF73B7E1FF57A3D7FF53A0D7FF509D
+ D5FF5299CFFF7594ACFFF8F8F8FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2
+ F2FFF1F1F1FFF4F4F4FA5E5E5E84206398FF70B5E0FF529FD7FF509CD6FF4E98
+ D4FF4F95CDFF7391AAFFF1F1F1FFB7B7B7FFB6B6B6FFB6B6B6FFB6B6B6FFB5B5
+ B5FFB5B5B5FFEEEEEEFA5A5A5A84206398FF6DB3DFFF509CD5FF4E98D3FF4B94
+ D1FF4C91CBFF708EA7FFF1F1F1FFE9E9E9FFE9E9E9FFE8E8E8FFE8E8E8FFE8E8
+ E8FFE7E7E7FFEDEDEDFA56565684206398FF6BB1DEFF4D97D3FF4B93D2FF488F
+ D0FF4A8CC9FF6F8BA5FFF1F1F1FFB6B6B6FFB5B5B5FFB5B5B5FFB4B4B4FFB4B4
+ B4FFB4B4B4FFEDEDEDFA53535384206398FF69AEDCFF4A93D1FF488FD0FF468B
+ CEFF4788C7FF6C88A3FFF0F0F0FFE8E8E8FFE8E8E8FFE7E7E7FFE7E7E7FFE7E7
+ E7FFE7E7E7FFEDEDEDFA4F4F4F84206398FF68ABDCFF488ECFFF468BCEFF4387
+ CDFF4484C6FF6885A1FFF0F0F0FFB4B4B4FFB4B4B4FFB4B4B4FFB4B4B4FFB4B4
+ B4FFB3B3B3FFEDEDEDFA4C4C4C84206398C262A5D7FF65A8DAFF64A6D9FF62A4
+ D8FF629FD1FF758EA4FFEFEFEFFFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE6E6
+ E6FFE6E6E6FFECECECFA494949842063984A206398CF206398FF206398FF2063
+ 98FF246395FF587388FFF7F7F7FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0
+ F0FFF0F0F0FFF3F3F3FA46464684FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF005E5E5E025B5B5B775858588A5555558A5252528A4F4F4F8A4C4C4C8A4A4A
+ 4A8A4848488A4646468A44444466FFFFFF00FFFFFF00C17D4460C88B4DBBC88C
+ 4FEEC88C4FF6C88C4FF7C88C4FF7C88D4FF7C98C4FF7C78B4FF7C5894BD4C476
+ 3B91B3683C06FFFFFF00FFFFFF00FFFFFF00FFFFFF00C48549C3F7F2ECECF8F4
+ EEFCF8F4EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B2
+ 7DFFDB9465F5B3683B07FFFFFF00FFFFFF00FFFFFF00C5884BEAFAF6F2FCFAE0
+ C7FFFBE1C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8
+ B4FFE1B07DFFDB9264F6B46B3E07FFFFFF0092877B12776D62FF756D65FFDDC8
+ B5FF6F665EFF6C6259FFFBE2CBFFF9E0C8FFF8DCC2FFF5D6BAFFFDFBF8FFFCE6
+ CDFFFAE5C9FFE2B684FFBF7942A6756C630F988C808F9C8F83FF524C47FFCBB7
+ A7FF544D47FF908579FF9A8C7FFFF5DDC6FFF9DDC4FFF6D9BCFFF4E9DFFFF7F2
+ ECFFFBF7F3FFF5EFE9FFC27E45FB95897D1D665E56F385786FFF4A413BFF9586
+ 7AFF564A40FF928374FF4F4740FFE4CFBBFFFAE0C8FFF8DCC2FFF5D6BBFFF3D4
+ B5FFF1D2B3FFF8F4F0FFC48246F73E3934855B544DFFB0A090FF695D51FF8674
+ 65FF63584EFFAA9888FF5A514AFF85796EFFFBE1CCFFFADFC7FFF8DCC2FFF6DA
+ BDFFF6D8BBFFFAF4EFFFC68346F7665E56EF696158FF564F48FF4D4946FF8C80
+ 77FF403B37FF46423CFF3D3833FF2C2825FFFCE4D1FFFBE1CCFFFAE0C7FFF9DD
+ C3FFF8DCC2FFFAF4EDFFC68245F7756C63F8C4B9AFFFA79A8DFF807A73FFD6C3
+ B4FF6C635CFFBBAFA4FFA6988BFF534D46FFFDE5D3FFFBE4D0FFFBE3CCFFFADF
+ C7FFFADFC6FFFAF2EAFFC68042F771685FFFC1B6ABFF797066FF625C56FFBAA9
+ 9CFF6E665DFFBDB1A5FF7E746AFF332E2BFFFDE5D3FFFCE4D1FFFCE2CDFFFBE1
+ CBFFFBE1C9FFFBF7F2FFC57C3FF7635B54FFA79A8DFF70675EFF453F3AFFAD9C
+ 91FF5C554EFF968A7FFF665E56FF1B1918FFFCE4D1FFFCE2CEFFFCE2CCFFFBE0
+ C9FFFBE1C8FFFDFAF7FFC1763BF7423D38D948423CD94B3E31FE58544FFFB686
+ 42FF3D3020FF413524FF372B1BFF3B2C15FFF7B352FFF7B352FFF7B251FFF7B2
+ 4FFFF7B24FFFFCF9F5FFBF6F36F7FFFFFF00FFFFFF00C1783CF7F7EDE3FFFDC2
+ 6EFFFFD8A0FFFFD79EFFFFD69BFFFFD798FFFFD696FFFFD695FFFFD594FFFFD4
+ 93FFFBBE65FFFBF7F4FFBB6731F7FFFFFF00FFFFFF00BF7138F5F5EBDFFEFDBF
+ 68FFFCBD67FFFBBE65FFFCBE64FFFCBE64FFFCBD62FFFBBD63FFFBBC61FFFCBE
+ 60FFFCBC62FFFDFBF8FDB9642DF3FFFFFF00FFFFFF00BC6933DEF8F1EAF2F7EC
+ DFFDF6EBDEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFFFAF3EBFFFAF2EAFFFCF7
+ F3FFFCF8F4FDFEFEFDF0B7602AD5FFFFFF00FFFFFF00BB6A346BBA6530BCBB66
+ 31EDBA6630F7BA6630F7BA6630F7BA6530F7BA652FF7B9652EF7B9652EF7B964
+ 2EF7B9642EEFB7622CBDB7622E63FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D898
+ 5223D4964D7DD2924CDBCD8C45F3CB8B41F3C98B40DBC78B407DC5873D23FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D6974F53D191
+ 49E6D0A06AFFE0BFA0FFE3C5AEFFE3C5AEFFDFBC9FFFC89762FFBD7D35E6BC7E
+ 3553FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D4964D53CF8D47F4D9B2
+ 8CFFE6CDB8FFE0BA9DFFD7AB85FFD6A982FFD9B391FFE1C2ABFFD4AE86FFB16B
+ 35F4B16F3553FFFFFF00FFFFFF00FFFFFF00D2934C22CE8E47E5D9B28CFFE6CA
+ B3FFD6A97DFFD1A579FFE2C4A8FFE1C3A8FFD0A276FFD1A477FFDDBDA2FFD0AC
+ 85FFAB6635E5A9653522FFFFFF00FFFFFF00CE91477ECD9C68FFE7CBB4FFD4A5
+ 7AFFD0A077FFCF9E74FFFBF8F5FFFBF8F5FFCB9E71FFCB9D71FFCDA177FFDFC0
+ A5FFB98A5BFFA45C347EFFFFFF00FFFFFF00CB8E41DBE0BC9FFFDBB393FFCFA0
+ 75FFCD9E72FFCB9C71FFDDBFA3FFDDBFA2FFC5996BFFC5996BFFC4986BFFD1AB
+ 85FFD8BA97FF9E5635DBFFFFFF00FFFFFF00C5853BF6E4C9B0FFD0A37AFFCC9D
+ 71FFC79A6CFFC5986BFFFFFFFF00FFFFFEFFC39669FFC19468FFC29468FFC398
+ 6DFFDFC5ABFF955334F6FFFFFF00FFFFFF00BF7E35F6E3C7AFFFD0A276FFC599
+ 6BFFC4976AFFC49669FFEEE0D4FFFBF7F4FFBF9066FFBE8F65FFBE8F64FFBE92
+ 69FFDFC6AAFF925034F6FFFFFF00FFFFFF00BC7E35DBDBBC9CFFD5AD89FFC798
+ 6CFFC39569FFC19367FFEDDFD3FFFAF7F4FFBB8B63FFB98A63FFB88A62FFC59D
+ 78FFD2B893FF905135DBFFFFFF00FFFFFF00B878357EBF915EFFE0C2A8FFC596
+ 6CFFC29169FFE1CBB8FFFEFDFCFFFFFFFEFFEADCD0FFB4855EFFB3855EFFD4B5
+ 99FFAE7B56FF8F51357EFFFFFF00FFFFFF00AF703522AB6935E5CFAA81FFDABC
+ A2FFBE9166FFBA8C62FFB7895FFFB3845EFFB1835DFFB0835CFFCDAA8DFFC6A5
+ 79FF895034E589503522FFFFFF00FFFFFF00FFFFFF00A76234539F5533F4CBA7
+ 7DFFD8BB9FFFC39C77FFB68A62FFB48660FFBE9672FFD1B397FFC5A377FF844F
+ 35F489503553FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009F5634539955
+ 34E6B28057FFD5B793FFDBC3A6FFDAC3A6FFD2B490FFAB7A52FF864F34E68850
+ 3553FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009754
+ 35239453347D925234DB8A5034F3884F34F3895035DB8950357D84503623FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ end
+ object HtmlToolbarImageList: TImageList
+ left = 48
+ top = 160
+ Bitmap = {
+ 4C69150000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003E3E3E0B6A6A6A758585
+ 85EE9E9E9EFF7C7C7CE16C6C6C376C6C6C187C7C7CDD9E9E9EFF858585EE6A6A
+ 6A753E3E3E0BFFFFFF00FFFFFF00FFFFFF00323232064C4C4C8A919191FFE8E8
+ E8FFDDDDDDFFC1C1C1FF818181DE7B7B7BC2D9D9D9F8DDDDDDFFC4C4C4FF9191
+ 91FF4C4C4C8A32323206FFFFFF00FFFFFF003131314E737373F0D5D5D5EE5858
+ 58B64B4B4BFC656565FF929292FF797979FF656565FF4B4B4BFC585858B6A8A8
+ A8E1737373F03131314EFFFFFF00FFFFFF003232328A828282F7939393674F4F
+ 4F0A3F3F3FF3BDBDBDFFCECECEFFC2C2C2FFADADADFF3F3F3FF34F4F4F0A9393
+ 9367828282F73232328AFFFFFF00FFFFFF002D2D2D69676767EF969696745252
+ 52B9414141FA464646FF515151FF515151FF464646FF414141FA525252B99696
+ 9674676767EF2D2D2D69FFFFFF00FFFFFF00292929294D4D4DD78D8D8DEFAAAA
+ AAEDAEAEAEFF979797FF717171FF787878FF979797FF85A18FFF5C9571FE4F8E
+ 66FF418258FD2D6D4491FFFFFF00FFFFFF00262626033F3F3F304A4A4ADF6464
+ 64F46B6B6BF76B6B6BF95757575E575757435E7D69F961AB81FF95D4B4FFBAE6
+ D0FF6ABB8FFF2D8F57FF196B378CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0044875DF790D3B1FF92D6B1FFFFFF
+ FF0065BC8CFF67BC8FFF196B37F7FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00317B4CFF9CD4B6FFFFFFFF00FFFF
+ FF00FFFFFF0095D2B2FF196B37FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001B6C39F762BA8BFF60BA87FFFFFF
+ FF0060B987FF67BC8FFF196B37F7FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00196B3784288C53FF64BA8DFF95D2
+ B2FF64BA8DFF288C53FF196B378CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00196B3788196B37F2196B
+ 37FF196B37F2196B3788FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AA7B5B8DAB7758E8A86D46F0A866
+ 3AF0A8663AF0A8663AF0A8663AF0A8663AF0A8643AF0A8643AF0A8643AF0A864
+ 3AF0A86B43F0A874518FFFFFFF00FFFFFF00AB7958E9DEDEDCFEF3F3F2FFF7F4
+ F3FFF7F4F2FFF7F4F1FFF7F4EFFFF8F4EFFFF8F3EEFFF8F2EDFFF8F2EBFFF7F2
+ EBFFF1EEE8FFAA704AEFFFFFFF00FFFFFF00A86D46F0F3F2F1FF96815CFFA69E
+ 76FFA4A17DFFABA07AFFBAA27AFFBAA37CFFBAA47EFFBBA680FFBCA883FF8F80
+ 65FFF7F1EAFFAB6D45F0FFFFFF00FFFFFF00A8663CF0F7F4F3FFB6A481FFF2DC
+ ADFFF5DEB0FFF2DDAFFFF6DEAFFFF7DFAFFFF8E0B1FFFAE1B2FFFCE3B4FFBEAB
+ 88FFF7EFE8FFAB6D45F0FFFFFF00FFFFFF00A8663CF0F7F4F1FFBEAB88FFFEE5
+ B5FFFDE4B5FFFDE4B5FFFDE4B5FFFDE4B5FFFDE4B5FFFDE4B5FFFDE4B5FFBEAB
+ 88FFF6EFE7FFAA6D45F0FFFFFF00FFFFFF00A8663CF0F7F4EFFFB6A583FFF5DD
+ B0FFF6DEB0FFF4DDAFFFF1DCADFFF3DAABFFF3DAACFFF2D9ABFFEFDAAEFFB4A5
+ 84FFF4EEE6FFAA6D45F0FFFFFF00FFFFFF00A8663CF0F7F3EEFF9C966EFFE6C7
+ 9DFFE2C598FFDFC496FFC8BD88FFE4BA82FFE4BA83FFE4BA83FFD3C199FFA59A
+ 7BFFF6EDE6FFAA6D45F0FFFFFF00FFFFFF00A8663CF0F7F2EDFFA67F56FFDEAA
+ 73FFDEAA73FFDDA973FFDDA873FFDCA772FFDCA772FFDCA772FFDCA772FFA47D
+ 55FFF6EDE6FFAA6D45F0FFFFFF00FFFFFF00A8663AF0F7F1ECFFAC8258FFE5AD
+ 75FFE5AD75FFE5AD75FFE5AD75FFE5AD75FFE5AD75FFA1A172FF5F956EFF4F8E
+ 66FF498960FF6C7347F7FFFFFF00FFFFFF00A8663AF0F7F0EBFFAC8258FFE5AD
+ 75FFE5AD75FFE5AD75FFE5AD75FFE5AD75FF9B9E6EFF61AB81FF95D4B4FFBAE6
+ D0FF6ABB8FFF2D8F57FF196B378CFFFFFF00A66439F0F7F0ECFF816242FFAC82
+ 58FFAC8258FFAC8258FFAC8258FFAC8258FF47875DFF90D3B1FF92D6B1FFFFFF
+ FF0065BC8CFF67BC8FFF196B37F7FFFFFF00A6643AF0F6F0ECFFFDE8D7FFFEE8
+ D7FFFEE8D7FFFEE8D7FFFEE8D7FFFEE8D7FF317B4CFF9CD4B6FFFFFFFF00FFFF
+ FF00FFFFFF0095D2B2FF196B37FFFFFFFF00A86D48E1EEECEAFFF7F2F0FFF8F3
+ F0FFF8F3EFFFF7F3EFFFF7F2EFFFF7F2EEFF22703FFF62BA8BFF60BA87FFFFFF
+ FF0060B987FF67BC8FFF196B37F7FFFFFF00AA74538AAB724FC3AA6D45F0AA6B
+ 43F0AA6B43F0AA6B43F0AA6B43F0AA6B43F05D6B3DF8288C53FF64BA8DFF95D2
+ B2FF64BA8DFF288C53FF196B378CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00196B3788196B37F2196B
+ 37FF196B37F2196B3788FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E39F6C70EBBA95E0E39F6C70FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EBBA95E0F1CFB5FFEBBA95E0FFFF
+ FF007777776B777777FF747474FF707070FF6B6B6BFF656565FF606060FF5959
+ 59FF535353FFFFFFFF00FFFFFF00FFFFFF00E39F6C70EBBA95E0E39F6C70FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E2996470E9B289E0DD8C5470FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E7AF86E0EDC4A5FFE5A575E0FFFF
+ FF005E5E5E6B585858FF515151FF4A4A4AFF434343FF3C3C3CFF343434FF2D2D
+ 2DFF262626FFFFFFFF00FFFFFF00FFFFFF00DA885070E3A374E0D6794570FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D26F3D70DE965FE0D26E3B70FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00DE965FE0E9B68FFFDE965FE0FFFF
+ FF003232326B2B2B2BFF242424FF1E1E1EFF171717FF121212FF0C0C0CFF0707
+ 07FF030303FFFFFFFF00FFFFFF00FFFFFF00D26E3B70DE965FE0D26E3B70FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E39F6C24EEC3A2FFFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EEC3A2FFEEC3A2FFFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EEC3A2FFFFFFFF00FFFF
+ FF007777776B777777FF747474FF707070FF6B6B6BFF656565FF606060FF5959
+ 59FF535353FFFFFFFF00FFFFFF00FFFFFF00EEC3A2FFEEC3A2FFEEC1A2FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EDBF9DFFEBBC9AFFDE915824FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00DE8D5524E9B48DFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00DC8A5224E7B289FFFFFFFF00FFFF
+ FF005E5E5E6B585858FF515151FF4A4A4AFF434343FF3C3C3CFF343434FF2D2D
+ 2DFF262626FFFFFFFF00FFFFFF00FFFFFF00E7AF86FFE5AC81FFE5AA7CFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E3A677FFE3A575FFE3A373FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E3A373FFD26E3B24FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D26E3B24E3A373FFFFFF
+ FF003232326B2B2B2BFF242424FF1E1E1EFF171717FF121212FF0C0C0CFF0707
+ 07FF030303FFFFFFFF00FFFFFF00FFFFFF00E3A373FFE3A373FFD4723E88FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFA5001AFFA50080FBA300D5F5A000D5ED9C0080E397001AFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFA50080FDD280FFFBE2B9FFFADEB1FFF0C97DFFD7900080FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00F9A200D5FBE1B8FFF8C77EFFF5C26EFFF5D191FFCA8A00D5FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00F09E00D5F8DBA9FFF5C270FFF4C067FFF3CD86FFBC8300D5FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00E5970080EEC87CFFF5D090FFF3CB85FFE4C178FFA1760080FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00D992001ACE8C0080C38700D5B68000D59C7300808568001AFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EFC2A37EEFC1A2E3EDC09FFFEBBE
+ 9DFFEBBC9AFFE9BA96FFE7B793FFE6B590FFE4B28CFFE2AF88FFE0AC84FFDDA9
+ 80FFDCA57DFFDAA37ACAFFFFFF00FFFFFF00EEC1A1EBFBF7F4FFFBF7F4FFFBF7
+ F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7
+ F4FFFBF7F4FFD7A074F8FFFFFF00FFFFFF00ECBF9EFFFBF7F4FF9CD5A5FF98D3
+ A1FF94D09DFF90CE98FF8BCB93FF87C98EFF82C689FF7EC384FF7AC180FF76BE
+ 7CFFFBF7F4FFD49B6FFFFFFFFF00FFFFFF00EBBD9BFFFBF7F4FFFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FBF7F4FFD1976AFFFFFFFF00FFFFFF00E9BA98FFFBF7F4FFE9C3A6FFE9C3
+ A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3
+ A6FFFBF7F4FFCE9364FFFFFFFF00FFFFFF00E7B794FFFBF7F4FFE9C3A6FFFFFF
+ FF00E8C4A9FFFFFFFF00FFFFFF00FFFFFF00E8C7ACFFFFFFFF00FFFFFF00FFFF
+ FF00F7F1EBFFCB8F5FFFFFFFFF00FFFFFF00E5B48FFFFAF6F2FFE9C6AAFFE9C6
+ ACFFEAC7ACFFE9C7ADFFE9C9AEFFE9C9B0FFE8C7ACFFE9C9B0FFE8C8B0FFE8CC
+ B5FFF2E7DEFFC88A59FFFFFFFF00FFFFFF00E3B18CFFFAF6F1FFEAC9AEFFFFFF
+ FF00EAC9B0FFFFFFFF00FFFFFF00FFFFFF00E8C7ACFFFFFFFF00FFFFFF00FFFF
+ FF00F1E5DBFFC68655FFFFFFFF00FFFFFF00E1AE87FFFAF4F0FFEACBB2FFEACC
+ B3FFEACCB3FFEACCB3FFEACCB3FFEACEB7FFE8C7ACFFA2AE8EFF5F9771FF4F8E
+ 66FF49895FFF7B7F4FFFFFFFFF00FFFFFF00DFAA82FFF9F3EFFFEACEB7FFFFFF
+ FF00EBD0BBFFFFFFFF00FFFFFF00FFFFFF009DAF91FF61AB81FF95D4B4FFBAE6
+ D0FF6ABB8FFF2D8F57FF196B378CFFFFFF00DDA87EFFF9F3EFFFEBD0BAFFEBD0
+ BBFFEBD0BBFFEBD0BBFFEBD0BBFFEBD1BDFF498960FF90D3B1FF92D6B1FFFFFF
+ FF0065BC8CFF67BC8FFF196B37F7FFFFFF00D9A47AFFF9F3EEFFEBD2BEFFFFFF
+ FF00EBD3BFFFFFFFFF00FFFFFF00FFFFFF00317B4CFF9CD4B6FFFFFFFF00FFFF
+ FF00FFFFFF0095D2B2FF196B37FFFFFFFF00D7A175FFF8F2EDFFF7F0EAFFF6ED
+ E6FFF4EAE2FFF3E7DEFFF1E4DBFFF0E2D8FF22703EFF62BA8BFF60BA87FFFFFF
+ FF0060B987FF67BC8FFF196B37F7FFFFFF00D69E72C4D3996EF4D19668FFCE92
+ 63FFCB8E5EFFC98A5BFFC78756FFC38452FF6B7744FF288C53FF64BA8DFF95D2
+ B2FF64BA8DFF288C53FF196B378CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00196B3788196B37F2196B
+ 37FF196B37F2196B3788FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00777777607777
+ 77CF747474FF707070EF6B6B6B7F656565AF606060EF5959599F53535310FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007373
+ 737F696969FF6A6A6ABFFFFFFF00FFFFFF005858589F545454FF4A4A4ACFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006D6D
+ 6D7F656565FF636363BFFFFFFF00FFFFFF004F4F4F7F4E4E4EFF414141FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006767
+ 677F5F5F5FFF5B5B5BBFFFFFFF004D4D4D10464646DF464646FF3838389FFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006060
+ 607F595959FF535353DF4C4C4C7F454545CF444444FF363636BFFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005858
+ 587F535353FF4A4A4ABFFFFFFF00FFFFFF003434349F383838FF262626CF1F1F
+ 1F10FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004F4F
+ 4F7F4D4D4DFF414141BFFFFFFF00FFFFFF002B2B2B10262626FF2D2D2DFF1717
+ 1770FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004646
+ 467F464646FF383838BFFFFFFF00FFFFFF00FFFFFF001C1C1CFF292929FF1010
+ 107FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003D3D
+ 3D7F404040FF2F2F2FCFFFFFFF00FFFFFF001B1B1B70242424FF0F0F0FEF0A0A
+ 0A20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003C3C3C603434
+ 34AF2D2D2DBF262626BF1F1F1F8F1919198F131313BF0D0D0D8F09090920FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF006B6B6B80656565F0606060FF595959F0535353C0FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF005E5E5EE0595959FF51515160FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF005C5C5C30575757FF4F4F4FF0FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF0054545490525252FF464646A0FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF004C4C4CE0494949FF3D3D3D50FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF004A4A4A30454545FF3C3C3CF0FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF0041414190444444FF323232A0FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00383838E0383838FF2A2A2A50FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF0036363640353535FF282828FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003434
+ 34802D2D2DC0262626C01F1F1FC0191919B0FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00777777607777
+ 77EF777777FF7575758FFFFFFF00FFFFFF00FFFFFF00616161AF5B5B5BFF5454
+ 5470FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007777
+ 77BF747474FFFFFFFF00FFFFFF00FFFFFF00FFFFFF0059595910535353CFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007373
+ 73BF6E6E6EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4ABFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006D6D
+ 6DBF686868FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00414141BFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006767
+ 67BF616161FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00383838BFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006060
+ 60BF595959FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002F2F2FBFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005858
+ 58BF515151FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00262626BFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004F4F
+ 4F8F4B4B4BFF41414150FFFFFF00FFFFFF00FFFFFF00242424401E1E1E8FFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004646
+ 46203F3F3FEF383838CF31313120FFFFFF00232323401C1C1CCF16161620FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00363636202F2F2F9F282828BF212121BF1B1B1B8F14141430FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B2B
+ 2BFF242424FF1E1E1EFF171717FF121212FF0C0C0CFF070707FF030303FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E0945420E7AA75D0E9B3
+ 84F0DD8A4D80FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E39E63B0DD8A4D20DA86
+ 4A80E7AF80FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E19A
+ 61D0E29E64E0FFFFFF00FFFFFF00FFFFFF00FFFFFF00777777C0737373C06D6D
+ 6DC0666666C05F5F5F20575757C04E4E4EC0454545C0FFFFFF00D6783F80DE92
+ 56D0D26C3730FFFFFF00FFFFFF00FFFFFF00FFFFFF00737373506D6D6DF06464
+ 64FF5F5F5F90FFFFFF004E4E4E80454545A03C3C3C20D4723B50D67B42A0D068
+ 3410D0633140CD5F2E20FFFFFF00FFFFFF00FFFFFF00FFFFFF00666666405F5F
+ 5FFF595959FF4E4E4E70454545C0FFFFFF00FFFFFF00D9854BC0E19D67FFE09A
+ 63FFDD9156F0FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005757
+ 5790515151FF464646FF3C3C3C10FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004E4E
+ 4E10464646FF444444FF32323290FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004545
+ 45C03C3C3C703B3B3BFF303030FF20202040FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004E4E4E10454545A03C3C
+ 3C70FFFFFF0029292990323232FF181818F011111130FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00454545C03C3C3CC03232
+ 329029292930202020C0181818C0111111C00A0A0AC004040430FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00777777C0737373C06D6D
+ 6DC0666666C05F5F5F20575757C04E4E4EC0454545C0FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00737373506D6D6DF06464
+ 64FF5F5F5F90FFFFFF004E4E4E80454545A03C3C3C20FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00666666405F5F
+ 5FFF595959FF4E4E4E70454545C0FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005757
+ 5790515151FF464646FF3C3C3C10FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004E4E
+ 4E10464646FF444444FF32323290FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004545
+ 45C03C3C3C703B3B3BFF303030FF20202040FFFFFF00E0945420E7AA75D0E9B3
+ 84F0DD8A4D80FFFFFF00FFFFFF00FFFFFF00FFFFFF004E4E4E10454545A03C3C
+ 3C70FFFFFF0029292990323232FF181818F011111130E39E63B0DD8A4D20DA86
+ 4A80E7AF80FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00454545C03C3C3CC03232
+ 329029292930202020C0181818C0111111C00A0A0AC004040430FFFFFF00E19A
+ 61D0E29E64E0FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D6783F80DE92
+ 56D0D26C3730FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D4723B50D67B42A0D068
+ 3410D0633140CD5F2E20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D9854BC0E19D67FFE09A
+ 63FFDD9156F0FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0056565681565656AC565656AC5353
+ 5357FFFFFF004A4A4A57454545AC3F3F3FAC38383881FFFFFF002B2B2B482424
+ 248FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00565656E6535353ACFFFF
+ FF00FFFFFF00FFFFFF003F3F3FAC383838E6FFFFFF002B2B2B3A242424AC1E1E
+ 1EE6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00535353E64F4F4FACFFFF
+ FF00FFFFFF00FFFFFF00383838AC323232E6FFFFFF00FFFFFF001E1E1E731717
+ 17E6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004F4F4FE64A4A4AC94545
+ 45733F3F3F7338383873323232C92B2B2BE6FFFFFF00FFFFFF00171717731111
+ 11E6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4AE6454545ACFFFF
+ FF00FFFFFF00FFFFFF002B2B2BAC242424E6FFFFFF00FFFFFF00111111730C0C
+ 0CE6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00454545E63F3F3FACFFFF
+ FF00FFFFFF00FFFFFF00242424AC1E1E1EE6FFFFFF00FFFFFF000C0C0C730707
+ 07E6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003F3F3FE6383838ACFFFF
+ FF00FFFFFF00FFFFFF001E1E1EAC171717E6FFFFFF00FFFFFF00070707730303
+ 03E6FFFFFF00FFFFFF00FFFFFF00FFFFFF003F3F3F81383838AC323232AC2B2B
+ 2B57FFFFFF001E1E1E57171717AC111111AC0C0C0C81070707570303039E0000
+ 00AC0000008F0000001DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00767676FF747474FF7070
+ 70FF6C6C6CFF686868FF636363FF5E5E5EFF595959FF535353FF4E4E4EFF4848
+ 48FF424242FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006F6F6FFF6B6B6BFF6666
+ 66FF616161FF5C5C5CFF575757FF515151FF4B4B4BFF454545FFFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464FF5F5F5FFF5A5A
+ 5AFF545454FF4F4F4FFF494949FF434343FF3D3D3DFF373737FF313131FF2B2B
+ 2BFF252525FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00585858FF525252FF4C4C
+ 4CFF464646FF404040FF3A3A3AFF343434FF2E2E2EFF282828FFFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4AFF444444FF3E3E
+ 3EFF383838FF323232FF2C2C2CFF262626FF202020FF1B1B1BFF161616FF1111
+ 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003C3C3CFF353535FF2F2F
+ 2FFF292929FF242424FF1E1E1EFF191919FF141414FF0F0F0FFFFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00767676FF747474FF7070
+ 70FF6C6C6CFF686868FF636363FF5E5E5EFF595959FF535353FF4E4E4EFF4848
+ 48FF424242FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00616161FF5C5C5CFF575757FF515151FF4B4B4BFF454545FF3F3F3FFF3939
+ 39FF333333FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464FF5F5F5FFF5A5A
+ 5AFF545454FF4F4F4FFF494949FF434343FF3D3D3DFF373737FF313131FF2B2B
+ 2BFF252525FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00464646FF404040FF3A3A3AFF343434FF2E2E2EFF282828FF232323FF1D1D
+ 1DFF181818FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4AFF444444FF3E3E
+ 3EFF383838FF323232FF2C2C2CFF262626FF202020FF1B1B1BFF161616FF1111
+ 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00292929FF242424FF1E1E1EFF191919FF141414FF0F0F0FFF0B0B0BFF0707
+ 07FF030303FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00767676FF747474FF7070
+ 70FF6C6C6CFF686868FF636363FF5E5E5EFF595959FF535353FF4E4E4EFF4848
+ 48FF424242FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006B6B6B6B6666
+ 66FF616161FF5C5C5CFF575757FF515151FF4B4B4BFF454545FF3F3F3FFF3939
+ 396BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464FF5F5F5FFF5A5A
+ 5AFF545454FF4F4F4FFF494949FF434343FF3D3D3DFF373737FF313131FF2B2B
+ 2BFF252525FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005252526B4C4C
+ 4CFF464646FF404040FF3A3A3AFF343434FF2E2E2EFF282828FF232323FF1D1D
+ 1D6BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4AFF444444FF3E3E
+ 3EFF383838FF323232FF2C2C2CFF262626FF202020FF1B1B1BFF161616FF1111
+ 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003535356B2F2F
+ 2FFF292929FF242424FF1E1E1EFF191919FF141414FF0F0F0FFF0B0B0BFF0707
+ 076BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00767676FF747474FF7070
+ 70FF6C6C6CFF686868FF636363FF5E5E5EFF595959FF535353FF4E4E4EFF4848
+ 48FF424242FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006F6F6FFF6B6B6BFF6666
+ 66FF616161FF5C5C5CFF575757FF515151FF4B4B4BFF454545FF3F3F3FFF3939
+ 39FF333333FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464FF5F5F5FFF5A5A
+ 5AFF545454FF4F4F4FFF494949FF434343FF3D3D3DFF373737FF313131FF2B2B
+ 2BFF252525FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00585858FF525252FF4C4C
+ 4CFF464646FF404040FF3A3A3AFF343434FF2E2E2EFF282828FF232323FF1D1D
+ 1DFF181818FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4AFF444444FF3E3E
+ 3EFF383838FF323232FF2C2C2CFF262626FF202020FF1B1B1BFF161616FF1111
+ 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003C3C3CFF353535FF2F2F
+ 2FFF292929FF242424FF1E1E1EFF191919FF141414FF0F0F0FFF0B0B0BFF0707
+ 07FF030303FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E37C
+ 2333EBA14BCCF1BA70FFEFB870FFEFB770FFEFB770FFEFB770FFE99240BBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EDAA
+ 54DDF2C485FFF3C992FFF2C389FFE99541BBFFFFFF00E99240BBE99140BBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EFB8
+ 70FFF3C892FFF3C892FFF2C288FFE99240BBFFFFFF00E9903FBBE7903FBBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E996
+ 41BBF1BE7FFFF3C791FFF2C288FFE99140BBFFFFFF00E78E3FBBE78D3EBBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E275
+ 2111E68A37AAEFB571FFF1BB7EFFE78E3FBBFFFFFF00E68D3EBBE68A3EBBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00E16F1F11E99648CCE68D3EBBFFFFFF00E6893DBBE5883DBBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00E68C3EBBE6893EBBFFFFFF00E5883DBBE5863CBBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00E6893DBBE5883DBBFFFFFF00E5853CBBE5843BBBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00E5863DBBE5853CBBFFFFFF00E5843BBBE5813BBBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00E5843BBBE5843BBBFFFFFF00E5813BBBE5803BBBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00E5833BBBE5813BBBFFFFFF00E57F3ABBE57F39BBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00E5803BBBE5803ABBFFFFFF00E57D39BBE37D39BBFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E6B38CFFE6B38CFFE6B3
+ 8CFFE5B28AFFE5B289FFE5AF86FFE5AE86FFE3AC85FFE3AB83FFE3A980FFE1A7
+ 7FFFE1A57CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00E6B38CFFECC4A6FFEBC4
+ A5FFEBC2A4FFEBC2A3FFEAC0A2FFEABFA0FFEABE9FFFE8BC9EFFE8BB9CFFE8B9
+ 9AFFDEA278FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00E5B289FFEBC3A5FFEBC2
+ A3FFEBC0A2FFEABFA1FFEABEA0FFE9BD9EFFE8BB9DFFE8BA9BFFE7B899FFE6B6
+ 97FFDE9D75FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00E5AF86FFEBC1A2FFEAC0
+ A2FFEABEA0FFE9BD9EFFE8BC9DFFE8BA9BFFE7B899FFE6B698FFE6B596FFE5B3
+ 94FFDC9A70FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00E3AC85FFEABFA0FFEABE
+ 9FFFE8BC9DFFE8BA9CFFE8B99AFFE6B798FFE6B696FFE5B494FFE4B393FFE4B1
+ 91FFDA966CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00E3AA81FFE9BC9EFFE8BB
+ 9CFFE8B99AFFE7B899FFE6B697FFE6B495FFE4B394FFE4B192FFE3AF90FFE3AE
+ 8FFFD9926AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00E1A67FFFE8BA9BFFE7B8
+ 99FFE6B697FFE6B596FFE5B394FFE4B192FFE4AF91FFE3AE8FFFE3AD8DFFE2AB
+ 8BFFD88E66FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00E1A27BFFE6B798FFE6B5
+ 96FFE5B494FFE4B292FFE4B191FFE3AF8FFFE3AD8DFFE2AC8CFFE1AA8AFFE1A9
+ 89FFD68C62FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00DE9F77FFE5B495FFE4B3
+ 93FFE4B192FFE3AF90FFE3AE8EFFE2AC8DFFE1AA8BFFE1A989FFE0A787FFDFA6
+ 86FFD5895FFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00DD9B73FFE4B192FFE4AF
+ 91FFE3AE8FFFE3AC8DFFE1AB8BFFE1A989FFE1A888FFE0A786FFDFA585FFDFA3
+ 84FFD4865DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00DC986FFFE3AF8FFFE3AD
+ 8DFFE2AB8BFFE1AA8AFFE1A888FFE0A787FFDFA585FFDFA484FFDEA383FFDEA2
+ 81FFD4855AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00DA946BFFD99268FFD890
+ 66FFD88E64FFD68C62FFD58961FFD5895FFFD5865DFFD4855BFFD4855AFFD283
+ 59FFD28358FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000808000FF808000FF808000FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000808000FF808000FF808000FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000808000FF808000FF808000FF0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000808000FF808000FF808000FF0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000808000FF808000FF808000FF000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000808000FF808000FF808000FF000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000008080
+ 00FF808000FF808000FF00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000008080
+ 00FF808000FF808000FF000000000000000000000000808000FF808000FF8080
+ 00FF000000000000000000000000000000000000000000000000808000FF8080
+ 00FF808000FF000000000000000000000000808000FF808000FF808000FF8080
+ 00FF808000FF0000000000000000000000000000000000000000808000FF8080
+ 00FF808000FF000000000000000000000000808000FF808000FF808000FF8080
+ 00FF808000FF00000000000000000000000000000000808000FF808000FF8080
+ 00FF00000000000000000000000000000000808000FF808000FF808000FF8080
+ 00FF808000FF00000000000000000000000000000000808000FF808000FF8080
+ 00FF0000000000000000000000000000000000000000808000FF808000FF8080
+ 00FF000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0001B2CB0001B2
+ CB0001B2CB0B01B3CCAB01B3CCAB01B3CCAB01B3CCAB01B3CCAB01B3CCAB01B3
+ CCAB01B3CCABFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0001B0C90001B0
+ C90001B1CA4D4ECFDFCAB1F8FFFFA8F5FEFFA7F5FEFFB5F9FFFF93E7EEEF03A3
+ BABD02ABC330FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0001AEC70001AE
+ C70201AFC8969BEEF5ED7FE9FAFF7EE9FAFF8EEEFBFF8FE5EDEF03A3BABD03A3
+ BA3002ABC300FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0001ACC40001AC
+ C4362FC0D3C099EFF9FF72E3F4FF83E8F6FF89E2EBF003A3BABE03A3BA3002A5
+ BD0002A9C100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0001A9C10001A9
+ C28276DDE8E371E1F0FF79E4F2FF81DBE5F10297AEC202A4BC3001A7BF0001A7
+ BF0001A7BF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0001A6BE1E14AF
+ C5BA8FEBF5FE66DDEEFF84E7F3FF01A6BEB401A6BEB401A6BEB401A6BEB401A6
+ BEB401A6BE00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0001A3BB6B54CB
+ DBDA8AEAF5FF7EE5F2FF7EE5F2FF7DE5F2FF7EE5F2FF7EE3EFF814ADC3BE01A4
+ BC3F01A4BC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00039EB5C00296
+ ACC3028EA5C6018AA1C85BCFDDFF45C5D6FF5BCEDCFB15A9BEC401A0B85401A3
+ BB0001A4BC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00039FB6000298
+ AF000299B03419ACC0CA4AD1E0FF4CD1E0FE19ABC0CB019CB368019DB500019F
+ B70001A0B700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00039DB5000198
+ AF000198AF6826BCCFDF3DD8E8FF1AB0C5D40198AF7C019AB101019BB200019B
+ B200019BB200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000091A8000091
+ A8000093AAA128D1E2F218B7CBDE0093AA910095AD05019AB100019BB200019B
+ B200019BB200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00008DA400008D
+ A41B0496ACC817BCD0E5008DA4A30090A70D0095AD00019AB100019BB200019B
+ B200019BB200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000879E000088
+ 9F530595ABCE018AA0B2008BA2180090A7000095AD00019AB100019BB200019B
+ B20001A7BF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000849B000084
+ 9B8D00849BBB00859C2300859C0000859C0000859C0000859C000191A80001A8
+ C00001B3CC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00008197000081
+ 97CB0082983700849B0000859C0000859C000191A80001A8C00001B3CC0001B3
+ CC0001B3CC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0001B2CB0001B2
+ CB0001B2CB0B01B3CCAB01B3CCAB01B3CCAB01B3CCAB01B3CCAB01B3CCAB01B3
+ CCAB01B3CCAB01B3CC0001B3CC00FFFFFF00FFFFFF00FFFFFF0001B0C90001B0
+ C90001B1CA4D4ECFDFCAB1F8FFFFA8F5FEFFA7F5FEFFB5F9FFFF93E7EEEF03A3
+ BABD02ABC33001B2CB0001B2CB00FFFFFF00FFFFFF00FFFFFF0001AEC70001AE
+ C70201AFC8969BEEF5ED7FE9FAFF7EE9FAFF8EEEFBFF8FE5EDEF03A3BABD03A3
+ BA3002ABC30001B2CB0001B2CB00FFFFFF00FFFFFF00FFFFFF0001ACC40001AC
+ C4362FC0D3C099EFF9FF72E3F4FF83E8F6FF89E2EBF003A3BABE03A3BA3002A5
+ BD0002A9C10001ADC50001ADC500FFFFFF00FFFFFF00FFFFFF0001A9C10001A9
+ C28276DDE8E371E1F0FF79E4F2FF81DBE5F10297AEC202A4BC3001A7BF0001A7
+ BF0001A7BF0001A7BF0001A7BF00FFFFFF00FFFFFF00FFFFFF0001A6BE1E14AF
+ C5BA8FEBF5FE66DDEEFF84E7F3FF01A6BEB401A6BEB401A6BEB401A6BEB401A6
+ BEB401A6BE0001A6BE0001A6BE00FFFFFF00FFFFFF00FFFFFF0001A3BB6B54CB
+ DBDA8AEAF5FF7EE5F2FF7EE5F2FF7DE5F2FF7EE5F2FF53D3E4FD07B2CAEA01AF
+ C77A01ACC40001ACC40001ACC400FFFFFF00FFFFFF00FFFFFF00039EB5C00296
+ ACC3028EA5C6018AA1C85BCFDDFF45C5D6FF58CDDBFB0DB2C9EB97EBF2F205B4
+ CDA101B2CB0801B2CB0001B2CB00FFFFFF00FFFFFF00FFFFFF00039FB6000298
+ AF000299B03419ACC0CA4AD1E0FF4CD1E0FE18B1C6E045C9D9E7ABF5FCFF45CB
+ DDCA01B0C84D01AFC70001AFC700FFFFFF00FFFFFF00FFFFFF00039DB5000198
+ AF000198AF6826BCCFDF3DD8E8FF1AB0C5D502A8C1D189E7F1F0555555FF80E4
+ F0F002ADC69D01ABC40401ABC400FFFFFF00FFFFFF00FFFFFF000091A8000091
+ A8000093AAA128D1E2F218B7CBDE019BB2BD30BED1C97CE4F1FF000000FF68D8
+ E7FF23B8CCC801A8C04301A7BF00FFFFFF00FFFFFF00FFFFFF00008DA400008D
+ A41B0496ACC817BCD0E5008EA5A301A2BAA05DD5E1EC46D3D7FF75B4B5FF40D0
+ D2FF3BCAD1EC01A4BC9801A2BA01FFFFFF00FFFFFF00FFFFFF0000879E000088
+ 9F530595ABCE018AA0B20199B15115AEC2C742D9E0FF33D5DDFF000000FF33D5
+ DDFF34D5DDFF0DACC1C7019EB63AFFFFFF00FFFFFF00FFFFFF0000849B000084
+ 9B8D00849BBB00859C230199B19C23C9DAE929DBE9FF28DAE9FF79EDF5FF28DA
+ E9FF28DAE9FF1CC7D9E90199B19CFFFFFF00FFFFFF00FFFFFF00008197000081
+ 97CB0082983700889F00008BA2940089A0C60089A0C60089A0C60089A0C60089
+ A0C60089A0C60089A0C6008BA294
+ }
+ end
+ object FileActionList: TActionList
+ Images = MainToolbarImageList
+ left = 168
+ top = 83
+ object acFileOpen: TAction
+ Caption = '&Open'
+ Hint = 'Bestand openen'
+ ImageIndex = 2
+ OnExecute = acFileOpenExecute
+ ShortCut = 16463
+ end
+ object acFileNewFromTemplate: TAction
+ Caption = 'Nieuw van sjabloon ...'
+ Hint = 'Nieuw van sjabloon'
+ ImageIndex = 0
+ OnExecute = acFileNewFromTemplateExecute
+ ShortCut = 16462
+ end
+ object acFileNewPlain: TAction
+ Caption = 'Nieuw'
+ Hint = 'Nieuw'
+ ImageIndex = 1
+ OnExecute = acFileNewPlainExecute
+ ShortCut = 24654
+ end
+ object acFileSave: TAction
+ Caption = 'Op&slaan'
+ Hint = 'Opslaan'
+ ImageIndex = 3
+ OnExecute = acFileSaveExecute
+ ShortCut = 16467
+ end
+ object acFileSaveAll: TAction
+ Caption = '&Alles opslaan'
+ Hint = 'Alles opslaan'
+ ImageIndex = 4
+ OnExecute = acFileSaveAllExecute
+ end
+ object acAbout: TAction
+ Caption = '&Info'
+ Hint = 'Over EPlus ...'
+ ImageIndex = 8
+ OnExecute = acAboutExecute
+ end
+ end
+ object MainMenu: TMainMenu
+ left = 432
+ top = 96
+ object mnuFile: TMenuItem
+ Caption = '&Bestand'
+ OnClick = TopLevelMenuClick
+ object mnuFileOpen: TMenuItem
+ Action = acFileOpen
+ end
+ object mnuFileNewFromTemplate: TMenuItem
+ Action = acFileNewFromTemplate
+ end
+ object mnuFileNew: TMenuItem
+ Caption = 'Nieuw'
+ object mnuFileNewText: TMenuItem
+ Action = acFileNewPlain
+ Caption = 'Leeg blad'
+ end
+ object mnuFileNewHtml: TMenuItem
+ Caption = 'Html'
+ OnClick = mnuFileNewHtmlClick
+ end
+ object mnuFileNewXml: TMenuItem
+ Caption = 'Xml'
+ OnClick = mnuFileNewXmlClick
+ end
+ object mnuFileNewCss: TMenuItem
+ Caption = 'Css'
+ OnClick = mnuFileNewCssClick
+ end
+ object mnuFileNewJS: TMenuItem
+ Caption = 'JavaScript'
+ OnClick = mnuFileNewJSClick
+ end
+ object mnuFileNewFpc: TMenuItem
+ Caption = 'Pascal'
+ OnClick = mnuFileNewFpcClick
+ end
+ object mnuFileNewC: TMenuItem
+ Caption = 'C'
+ OnClick = mnuFileNewCClick
+ end
+ object mnuFileNewPy: TMenuItem
+ Caption = 'Python'
+ OnClick = mnuFileNewPyClick
+ end
+ object mnuFileNewPhp: TMenuItem
+ Caption = 'Php'
+ OnClick = mnuFileNewPhpClick
+ end
+ object mnuFileNewPerl: TMenuItem
+ Caption = 'Perl'
+ OnClick = mnuFileNewPerlClick
+ end
+ object mnuFileNewShellScript: TMenuItem
+ Caption = 'Unix shell script'
+ OnClick = mnuFileNewShellScriptClick
+ end
+ object mnuFileNewBat: TMenuItem
+ Caption = 'Bat'
+ OnClick = mnuFileNewBatClick
+ end
+ object mnuFileNewIni: TMenuItem
+ Caption = 'Ini'
+ OnClick = mnuFileNewIniClick
+ end
+ end
+ object mnuFileSave: TMenuItem
+ Action = acFileSave
+ end
+ object mnuFileSaveAs: TMenuItem
+ Caption = 'Opslaan &als ...'
+ OnClick = mnuFileSaveAsClick
+ end
+ object mnuFileSaveAll: TMenuItem
+ Action = acFileSaveAll
+ end
+ object mnuFileCloseCurrent: TMenuItem
+ Caption = 'Sl&uiten'
+ ShortCut = 16499
+ OnClick = mnuFileCloseCurrentClick
+ end
+ object mnuSep1: TMenuItem
+ Caption = '-'
+ end
+ object mnuFileOpenInBrowser: TMenuItem
+ Caption = 'Open in &browser'
+ OnClick = mnuFileOpenInBrowserClick
+ end
+ object mnuSepAboveMru: TMenuItem
+ Caption = '-'
+ end
+ object mnuFileMru0: TMenuItem
+ Caption = '1'
+ OnClick = mnuFileMruClick
+ end
+ object mnuFileMru1: TMenuItem
+ Caption = '2'
+ OnClick = mnuFileMruClick
+ end
+ object mnuFileMru2: TMenuItem
+ Caption = '3'
+ OnClick = mnuFileMruClick
+ end
+ object mnuFileMru3: TMenuItem
+ Caption = '4'
+ OnClick = mnuFileMruClick
+ end
+ object mnuFileMru4: TMenuItem
+ Caption = '5'
+ OnClick = mnuFileMruClick
+ end
+ object mnuFileMru5: TMenuItem
+ Caption = '6'
+ OnClick = mnuFileMruClick
+ end
+ object mnuSep3: TMenuItem
+ Caption = '-'
+ end
+ object mnuFileCloseApp: TMenuItem
+ Caption = 'Afsluiten'
+ ShortCut = 32883
+ OnClick = mnuFileCloseAppClick
+ end
+ end
+ object mnuEdit: TMenuItem
+ Caption = 'Be&werken'
+ OnClick = TopLevelMenuClick
+ object mnuEditUndo: TMenuItem
+ Caption = '&Ongedaan maken'
+ ShortCut = 16474
+ OnClick = mnuEditUndoClick
+ end
+ object mnuEditRedo: TMenuItem
+ Caption = '&Herhalen'
+ OnClick = mnuEditRedoClick
+ end
+ object mnuSep11: TMenuItem
+ Caption = '-'
+ end
+ object mnuEditCopy: TMenuItem
+ Action = acEditCopy
+ end
+ object mnuEditCut: TMenuItem
+ Caption = 'K&nippen'
+ ShortCut = 16472
+ OnClick = mnuEditCutClick
+ end
+ object mnuEditPaste: TMenuItem
+ Action = acEditPaste
+ end
+ object mnuEditPasteSpecial: TMenuItem
+ Caption = 'Plakken speciaal'
+ object mnuEditPasteTableContentTab: TMenuItem
+ Caption = 'Tabelinhoud (Tab-gescheiden)'
+ OnClick = mnuEditPasteTableContentTabClick
+ end
+ end
+ object mnuEditSelectAll: TMenuItem
+ Caption = '&Alles selecteren'
+ ShortCut = 16449
+ OnClick = mnuEditSelectAllClick
+ end
+ object mnuSep12: TMenuItem
+ Caption = '-'
+ end
+ object mnuEditFind: TMenuItem
+ Action = acEditFind
+ end
+ object mnuEditFindNext: TMenuItem
+ Action = acEditFindNext
+ end
+ object mnuEditReplace: TMenuItem
+ Caption = 'Ve&rvangen'
+ ShortCut = 16466
+ OnClick = mnuEditReplaceClick
+ end
+ end
+ object mnuInsert: TMenuItem
+ Caption = '&Invoegen'
+ OnClick = TopLevelMenuClick
+ object mnuInsertAnchor: TMenuItem
+ Action = acInsertAnchor
+ end
+ object mnuInsertList: TMenuItem
+ Caption = 'Lijst'
+ object mnuInsertUList: TMenuItem
+ Action = acInsertUList
+ end
+ object mnuInsertNList: TMenuItem
+ Action = acInsertNlist
+ end
+ object mnuInsertWordList: TMenuItem
+ Caption = '&Woordenlijst'
+ OnClick = mnuInsertWordListClick
+ end
+ object mnuInsetListItem: TMenuItem
+ Action = acInsertListItem
+ end
+ object mnuInsertWordTerm: TMenuItem
+ Caption = 'Woordenlijst term'
+ OnClick = mnuInsertWordTermClick
+ end
+ object mnuInsertWordDefinition: TMenuItem
+ Caption = 'Woordenlijst definitie'
+ OnClick = mnuInsertWordDefinitionClick
+ end
+ end
+ object mnuInsertTable: TMenuItem
+ Caption = 'Tabel'
+ ImageIndex = 5
+ object mnInsertNewTable: TMenuItem
+ Action = acInsertTable
+ end
+ object mnuInsertTableCell: TMenuItem
+ Caption = 'Cel'
+ OnClick = mnuInsertTableCellClick
+ end
+ object mnuInsertTableRow: TMenuItem
+ Caption = 'Rij'
+ OnClick = mnuInsertTableRowClick
+ end
+ end
+ object mnuInsertPicture: TMenuItem
+ Action = acInsertPicture
+ end
+ object mnuInsertLineBreak: TMenuItem
+ Action = acInsertLineBreak
+ end
+ object mnuInsertSpecialChars: TMenuItem
+ Caption = 'Speciale tekens'
+ ShortCut = 32835
+ OnClick = mnuInsertSpecialCharsClick
+ end
+ object mnuInsertSep1: TMenuItem
+ Caption = '-'
+ end
+ object mnuInsertCssStyle: TMenuItem
+ Caption = 'Css stijl'
+ OnClick = mnuInsertCssStyleClick
+ end
+ object mnuInsertJS: TMenuItem
+ Caption = 'JavaScript'
+ OnClick = mnuInsertJSClick
+ end
+ object mnuInsertHtmlComment: TMenuItem
+ Caption = 'Commentaar'
+ OnClick = mnuInsertHtmlCommentClick
+ end
+ end
+ object mnuLayout: TMenuItem
+ Caption = '&Opmaak'
+ OnClick = TopLevelMenuClick
+ object mnuLayoutBold: TMenuItem
+ Action = acLayoutBold
+ end
+ object mnuLayoutItalic: TMenuItem
+ Action = acLayoutItalic
+ end
+ object mnuLayoutUnderline: TMenuItem
+ Action = acLayoutUnderline
+ end
+ object mnuLayoutSub: TMenuItem
+ Action = acLayoutSub
+ end
+ object mnuLayoutSup: TMenuItem
+ Action = acLayoutSup
+ end
+ object mnuLayoutEmphasis: TMenuItem
+ Action = acLayoutEmphasis
+ end
+ object mnuLayoutStrong: TMenuItem
+ Action = acLayoutStrong
+ end
+ object mnuLayoutHeadings: TMenuItem
+ Caption = 'Kop'
+ object mnuLayoutH1: TMenuItem
+ Action = acLayoutH1
+ end
+ object mnuLayoutH2: TMenuItem
+ Action = acLayoutH2
+ end
+ object mnuLayoutH3: TMenuItem
+ Action = acLayoutH3
+ end
+ object mnuLayoutH4: TMenuItem
+ Action = acLayoutH4
+ end
+ object mnuLayoutH5: TMenuItem
+ Action = acLayoutH5
+ end
+ object mnuLayoutH6: TMenuItem
+ Action = acLayoutH6
+ end
+ end
+ object mnuLayoutAlign: TMenuItem
+ Caption = 'Uitlijnen'
+ object mnuLayoutAlignLeft: TMenuItem
+ Action = acLayoutAlignLeft
+ end
+ object mnuLayoutAlignRight: TMenuItem
+ Action = acLayoutAlignRight
+ end
+ object mnuLayoutAlignCenter: TMenuItem
+ Action = acLayoutAlignCenter
+ end
+ object mnuLayoutAlignJustify: TMenuItem
+ Action = acLayoutAlignJustify
+ end
+ end
+ object mnuLayoutCode: TMenuItem
+ Caption = 'Code (programmeertaal)'
+ OnClick = mnuLayoutCodeClick
+ end
+ object mnuLayoutQuote: TMenuItem
+ Caption = 'Quote'
+ OnClick = mnuLayoutQuoteClick
+ end
+ object mnuLayoutBlockQuote: TMenuItem
+ Caption = 'Blockquote'
+ OnClick = mnuLayoutBlockQuoteClick
+ end
+ object mnuLayoutPreformatted: TMenuItem
+ Caption = 'Voorgeformateerde tekst'
+ OnClick = mnuLayoutPreformattedClick
+ end
+ end
+ object mnuGrouping: TMenuItem
+ Caption = 'In&deling'
+ OnClick = TopLevelMenuClick
+ object mnuGroupingParagraph: TMenuItem
+ Action = acGroupingParagraph
+ end
+ object mnuGroupingDiv: TMenuItem
+ Action = acGroupingDiv
+ end
+ object mnuGroupingSpan: TMenuItem
+ Action = acGroupingSpan
+ end
+ end
+ object mnuView: TMenuItem
+ Caption = 'Bee&ld'
+ OnClick = TopLevelMenuClick
+ object mnuViewFont: TMenuItem
+ Caption = 'Lettertype...'
+ OnClick = mnuViewFontClick
+ end
+ object mnuViewFontsize: TMenuItem
+ Caption = '&Tekengrootte'
+ object mnuViewFontSizeUp: TMenuItem
+ Caption = '&Groter'
+ ShortCut = 16491
+ OnClick = mnuViewFontSizeUpClick
+ end
+ object mnuViewFontsizeDown: TMenuItem
+ Caption = '&Kleiner'
+ ShortCut = 16493
+ OnClick = mnuViewFontsizeDownClick
+ end
+ end
+ object mnuViewHighlighter: TMenuItem
+ Caption = '&Highlighter'
+ object mnuViewHLeftNone: TMenuItem
+ Caption = 'Geen'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftHtml: TMenuItem
+ Caption = 'Html'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftXml: TMenuItem
+ Caption = 'Xml'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftCss: TMenuItem
+ Caption = 'Css'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftJS: TMenuItem
+ Caption = 'JavaScript'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftFpc: TMenuItem
+ Caption = 'Pascal'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftLfm: TMenuItem
+ Caption = 'Lazarus/Delphi forms'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftC: TMenuItem
+ Caption = 'C'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftPy: TMenuItem
+ Caption = 'Python'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftPhp: TMenuItem
+ Caption = 'Php'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftPerl: TMenuItem
+ Caption = 'Perl'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftUNIXShell: TMenuItem
+ Caption = 'Unix shell script'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftBat: TMenuItem
+ Caption = 'Dos/Windows batch'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftDiff: TMenuItem
+ Caption = 'Diff'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftIni: TMenuItem
+ Caption = 'Ini'
+ OnClick = mnuSetHighlighterClick
+ end
+ object mnuViewHLeftPo: TMenuItem
+ Caption = 'Po taalbestanden'
+ OnClick = mnuSetHighlighterClick
+ end
+ end
+ end
+ object mnuAbout: TMenuItem
+ Action = acAbout
+ end
+ end
+ object EditActionList: TActionList
+ Images = MainToolbarImageList
+ left = 168
+ top = 160
+ object acEditCopy: TAction
+ Caption = '&Kopiëren'
+ ImageIndex = 5
+ OnExecute = acEditCopyExecute
+ ShortCut = 16451
+ end
+ object acEditPaste: TAction
+ Caption = '&Plakken'
+ ImageIndex = 6
+ OnExecute = acEditPasteExecute
+ ShortCut = 16470
+ end
+ object acEditFind: TAction
+ Caption = '&Zoeken'
+ ImageIndex = 7
+ OnExecute = acEditFindExecute
+ ShortCut = 16454
+ end
+ object acEditFindNext: TAction
+ Caption = '&Volgende zoeken'
+ OnExecute = acEditFindNextExecute
+ ShortCut = 114
+ end
+ object acEditFindPrevious: TAction
+ Caption = 'Vorige zoeken'
+ OnExecute = acEditFindPreviousExecute
+ ShortCut = 8306
+ end
+ end
+ object FindDialog: TFindDialog
+ Options = [frDown, frHideEntireScope]
+ OnFind = DoFind
+ left = 280
+ top = 336
+ end
+ object ReplaceDialog: TReplaceDialog
+ Options = [frDown, frReplace, frReplaceAll, frHideEntireScope]
+ OnFind = DoFind
+ OnReplace = DoReplace
+ left = 224
+ top = 336
+ end
+ object HeadingDropDownMenu: TPopupMenu
+ left = 432
+ top = 160
+ object mnuPopupLayoutH1: TMenuItem
+ Action = acLayoutH1
+ end
+ object mnuPopupLayoutH2: TMenuItem
+ Action = acLayoutH2
+ end
+ object mnuPopupLayoutH3: TMenuItem
+ Action = acLayoutH3
+ end
+ object mnuPopupLayoutH4: TMenuItem
+ Action = acLayoutH4
+ end
+ object mnuPopupLayoutH5: TMenuItem
+ Action = acLayoutH5
+ end
+ object mnuPopupLayoutH6: TMenuItem
+ Action = acLayoutH6
+ end
+ end
+ object EditorPopupMenu: TPopupMenu
+ Images = MainToolbarImageList
+ left = 432
+ top = 224
+ object mnuEditPopupCopy: TMenuItem
+ Action = acEditCopy
+ Bitmap.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C57342C1C67545E6C87545FEC775
+ 45F3C87545F3C77545F3C77545F3C87546F4C57444E8CA7F53F1FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C77949EDFCF3ECFFFAF1E8FFFAF0
+ E7FFFBF1E9FFFBF2EAFFFBF2EAFFFBF2EBFFFDF4EEFFCA8054F9FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CF8253FFEFF1E7FFFFE9D9FFFFEA
+ DBFFFFE9D9FFFFE7D7FFFFE5D2FFFFE2CBFFEFF2E8FFCE8156FFFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CC8352FBFBF5EEFFFFE9D9FFFFEA
+ DBFFFFE9D9FFFFE7D7FFFFE5D2FFFFE2CBFFFBF6EFFFCC8355FEC7794AB9C879
+ 4BCEC87545DDC77545D4C87545D4C77545D4CA8452FFFFF7F1FFFFE9D9FFFFEA
+ DBFFFFE9D9FFFFE7D7FFFFE5D2FFFFE2CBFFFFF7F1FFCB8555FEC87C4ED3FCF3
+ ECDEFAF1E8DEFAF0E7DEFBF1E9DEFBF2EADEE4BA91FFFFF7F0FFFFE7D5FFFDE7
+ D6FFFDE6D4FFFCE4D0FFFBE3CBFFFADCC2FFFEF3E8FFCC8656FECF8253DEEFF1
+ E7DEFFE9D9DEFFEADBDEFFE9D9DEFFE7D7DEE4BB91FFFFF7F2FFFEE7D5FFFEE7
+ D5FFFDE5D1FFFAE0CAFFF9DEC4FFF7D9BCFFFDF2E7FFCC8757FECC8352DBFBF5
+ EEDEFFE9D9DEFFEADBDEFFE9D9DEFFE7D7DEE4BB92FFFEF7F1FFFCE5D2FFFCE4
+ D1FFFBE2CCFFF9DDC4FFF6D7BBFFF3D1AFFFFAEFE4FFCC8758FECA8452DBFFF7
+ F1DEFFE9D9DEFFEADBDEFFE9D9DEFFE7D7DEE4BB92FFFEF6F0FFFCE2CDFFFCE3
+ CDFFFADFC8FFF7D9BCFFF5E9DDFFFAF3EBFFFBF8F3FFCA8353FECB8553DBFFF7
+ F0DEFFE7D5DEFDE7D6DEFDE6D4DEFCE4D0DEE4BB93FFFEF5EDFFFCDEC5FFFBE0
+ C7FFF9DCC2FFF5D3B4FFFEF9F3FFFAE2C4FFECC193FFC37D4893CB8654DBFFF7
+ F2DEFEE7D5DEFEE7D5DEFDE5D1DEFAE0CADEE5BE96FFFFFFFEFFFDF3E9FFFDF3
+ EAFFFCF2E8FFFAEFE3FFFAF2E7FFEABB88FFCF8555B3B4693D0CCB8655DBFEF7
+ F1DEFCE5D2DEFCE4D1DEFBE2CCDEF9DDC4DEEAC39DFFE6BF96FFE4BB92FFE4BB
+ 92FFD1A06CF5D09E6DF6CC965FDAC479427EB2673C09FFFFFF00CB8655DBFEF6
+ F0DEFCE2CDDEFCE3CDDEFADFC8DEF7D9BCDEF5E9DDDEFAF3EBDEFBF8F3DECD95
+ 65DCFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CB8656DAFEF5
+ EDDEFCDEC5DEFBE0C7DEF9DCC2DEF5D3B4DEFEF9F3DEFAE2C4DEECC193DEC37D
+ 4880FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CA8554D0FFFF
+ FF00FDF3E9DEFDF3EADEFCF2E8DEFAEFE3DEFAF2E7DEEABB88DECF85559CB469
+ 3D0AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C77947AACC86
+ 55CECC8857DECB8856DBCC8856DBCB8757DBCA8350D0C479426EB2673C08FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ end
+ object mnuEditPopupCut: TMenuItem
+ Caption = '&Knippen'
+ OnClick = mnuEditCutClick
+ end
+ object mnuEditPopupPaste: TMenuItem
+ Action = acEditPaste
+ Bitmap.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF005E5E5E025B5B5B775858588A5555558A5252
+ 528A4F4F4F8A4C4C4C8A4A4A4A8A4848488A4646468A444444662063984A2063
+ 98CF206398FF206398FF206398FF246395FF587388FFF7F7F7FFF0F0F0FFF0F0
+ F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF3F3F3FA46464684206398C262A5
+ D7FF65A8DAFF64A6D9FF62A4D8FF629FD1FF758EA4FFEFEFEFFFE7E7E7FFE7E7
+ E7FFE7E7E7FFE7E7E7FFE6E6E6FFE6E6E6FFECECECFA49494984206398FF68AB
+ DCFF488ECFFF468BCEFF4387CDFF4484C6FF6885A1FFF0F0F0FFB4B4B4FFB4B4
+ B4FFB4B4B4FFB4B4B4FFB4B4B4FFB3B3B3FFEDEDEDFA4C4C4C84206398FF69AE
+ DCFF4A93D1FF488FD0FF468BCEFF4788C7FF6C88A3FFF0F0F0FFE8E8E8FFE8E8
+ E8FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFEDEDEDFA4F4F4F84206398FF6BB1
+ DEFF4D97D3FF4B93D2FF488FD0FF4A8CC9FF6F8BA5FFF1F1F1FFB6B6B6FFB5B5
+ B5FFB5B5B5FFB4B4B4FFB4B4B4FFB4B4B4FFEDEDEDFA53535384206398FF6DB3
+ DFFF509CD5FF4E98D3FF4B94D1FF4C91CBFF708EA7FFF1F1F1FFE9E9E9FFE9E9
+ E9FFE8E8E8FFE8E8E8FFE8E8E8FFE7E7E7FFEDEDEDFA56565684206398FF70B5
+ E0FF529FD7FF509CD6FF4E98D4FF4F95CDFF7391AAFFF1F1F1FFB7B7B7FFB6B6
+ B6FFB6B6B6FFB6B6B6FFB5B5B5FFB5B5B5FFEEEEEEFA5A5A5A84206398FF73B7
+ E1FF57A3D7FF53A0D7FF509DD5FF5299CFFF7594ACFFF8F8F8FFF2F2F2FFF2F2
+ F2FFF2F2F2FFF2F2F2FFF2F2F2FFF1F1F1FFF4F4F4FA5E5E5E84206398FF76B9
+ E2FF5CA7D9FF58A4D8FF53A0D7FF539ED5FF618BA9FF6488A1FF6487A1FF6386
+ A0FF69879FFF4A6881FF6A6A6A8A6868688A6565658A62626263206398FF7ABB
+ E3FF61AADBFF5AA5D9FF53A0D7FF529FD7FF529FD7FF529FD7FF529FD7FF529F
+ D7FF62A3D8FF206398FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00206398FF7CBD
+ E4FF65AEDDFF62ABDCFF5EA8DAFF5CA7D9FF5CA7D9FF5CA7D9FF5CA7D9FF529F
+ D7FF62A3D8FF206398FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00206398FF7FBF
+ E4FF69B2DEFF4A9BDAFF4497DCFF4396DCFF4296DCFF4295DCFF4195DBFF519E
+ D6FF6CB2DEFF206398FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00206398E071B3
+ DBFE7EBFE4FF4E9DDFFFB5EEFDFF75D4F0FF75D4F0FFB5EEFDFF4B9BDEFF6EB4
+ E0FF6DB3DFF9206398F3FFFFFF00FFFFFF00FFFFFF00FFFFFF00206398322063
+ 98B2206398FF3775A4FFB6EFFEFF80DBF3FF80DBF3FFB6EFFEFF2E6EA1FF2063
+ 98FF206398A520639853FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF002063982A206398FF206398FF206398FF206398FF206398FF206398F0FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ end
+ object mnuEditPopupSelectAll: TMenuItem
+ Caption = '&Alles selecteren'
+ OnClick = mnuEditSelectAllClick
+ end
+ end
+ object HtmlActionList: TActionList
+ Images = HtmlToolbarImageList
+ left = 168
+ top = 224
+ object acInsertAnchor: TAction
+ Caption = 'Hyperlink invoegen'
+ Hint = 'Hyperlink invoegen'
+ ImageIndex = 0
+ OnExecute = acInsertAnchorExecute
+ ShortCut = 32840
+ end
+ object acInsertPicture: TAction
+ Caption = 'Plaatje invoegen'
+ Hint = 'Plaatje invoegen'
+ ImageIndex = 1
+ OnExecute = acInsertPictureExecute
+ end
+ object acInsertUList: TAction
+ Caption = 'Ongenummerde lijst'
+ Hint = 'Ongenummerde lijst'
+ ImageIndex = 2
+ OnExecute = acInsertUListExecute
+ end
+ object acInsertNlist: TAction
+ Caption = 'Genummerde lijst'
+ Hint = 'Genummerde ljst'
+ ImageIndex = 3
+ OnExecute = acInsertOlistExecute
+ end
+ object acInsertListItem: TAction
+ Caption = 'Lijst item invoegen'
+ Hint = 'Lijstitem invoegen ((on)genummerde lijst)'
+ ImageIndex = 4
+ OnExecute = acInsertListItemExecute
+ ShortCut = 16460
+ end
+ object acInsertTable: TAction
+ Caption = 'Tabel invoegen ...'
+ Hint = 'Tabel invoegen'
+ ImageIndex = 5
+ OnExecute = acInsertTableExecute
+ end
+ object acLayoutBold: TAction
+ Caption = 'Vet'
+ Hint = 'Vet'
+ ImageIndex = 6
+ OnExecute = acLayoutBoldExecute
+ ShortCut = 16450
+ end
+ object acLayoutItalic: TAction
+ Caption = 'Cursief'
+ Hint = 'Cursief'
+ ImageIndex = 7
+ OnExecute = acLayoutItalicExecute
+ ShortCut = 16457
+ end
+ object acLayoutUnderline: TAction
+ Caption = 'Onderstreept'
+ Hint = 'Onderstreept'
+ ImageIndex = 8
+ OnExecute = acLayoutUnderlineExecute
+ ShortCut = 16469
+ end
+ object acLayoutSup: TAction
+ Caption = 'Superscript'
+ Hint = 'Superscript'
+ ImageIndex = 9
+ OnExecute = acLayoutSupExecute
+ end
+ object acLayoutSub: TAction
+ Caption = 'Subscript'
+ Hint = 'SubScript'
+ ImageIndex = 10
+ OnExecute = acLayoutSubExecute
+ end
+ object acLayoutEmphasis: TAction
+ Caption = 'Nadruk'
+ Hint = 'Nadruk'
+ ImageIndex = 19
+ OnExecute = acLayoutEmphasisExecute
+ end
+ object acLayoutStrong: TAction
+ Caption = 'Sterke nadruk'
+ Hint = 'Sterke nadruk'
+ ImageIndex = 20
+ OnExecute = acLayoutStrongExecute
+ end
+ object acLayoutAlignLeft: TAction
+ Caption = 'Links uitlijen'
+ Hint = 'Links uitlijnen'
+ ImageIndex = 12
+ OnExecute = acLayoutAlignLeftExecute
+ end
+ object acLayoutAlignRight: TAction
+ Caption = 'Rechts uitlijnen'
+ Hint = 'Rechts uitlijnen'
+ ImageIndex = 13
+ OnExecute = acLayoutAlignRightExecute
+ end
+ object acLayoutAlignCenter: TAction
+ Caption = 'Centreren'
+ Hint = 'Centreren'
+ ImageIndex = 14
+ OnExecute = acLayoutAlignCenterExecute
+ end
+ object acLayoutAlignJustify: TAction
+ Caption = 'Volledig uitlijnen'
+ Hint = 'Volledig uitlijnen'
+ ImageIndex = 15
+ OnExecute = acLayoutAlignJustifyExecute
+ end
+ object acGroupingParagraph: TAction
+ Caption = 'Alinea'
+ Hint = 'Alinea'
+ ImageIndex = 16
+ OnExecute = acGroupingParagraphExecute
+ ShortCut = 16397
+ end
+ object acGroupingDiv: TAction
+ Caption = 'Div'
+ Hint = 'Div'
+ ImageIndex = 17
+ OnExecute = acGroupingDivExecute
+ end
+ object acGroupingSpan: TAction
+ Caption = 'Span'
+ Hint = 'Span'
+ ImageIndex = 18
+ OnExecute = acGroupingSpanExecute
+ end
+ object acInsertLineBreak: TAction
+ Caption = 'Nieuwe regel'
+ Hint = 'Nieuwe regel'
+ OnExecute = acInsertLineBreakExecute
+ ShortCut = 8205
+ end
+ object acLayoutH1: TAction
+ Caption = 'H1'
+ OnExecute = acLayoutH1Execute
+ ShortCut = 16433
+ end
+ object acLayoutH2: TAction
+ Caption = 'H2'
+ OnExecute = acLayoutH2Execute
+ ShortCut = 16434
+ end
+ object acLayoutH3: TAction
+ Caption = 'H3'
+ OnExecute = acLayoutH3Execute
+ ShortCut = 16435
+ end
+ object acLayoutH4: TAction
+ Caption = 'H4'
+ OnExecute = acLayoutH4Execute
+ ShortCut = 16436
+ end
+ object acLayoutH5: TAction
+ Caption = 'H5'
+ OnExecute = acLayoutH5Execute
+ ShortCut = 16437
+ end
+ object acLayoutH6: TAction
+ Caption = 'H6'
+ Hint = 'H6'
+ OnExecute = acLayoutH6Execute
+ ShortCut = 16438
+ end
+ object acInsertNbSpace: TAction
+ Caption = 'acInsertNbSpace'
+ OnExecute = acInsertNbSpaceExecute
+ ShortCut = 24608
+ end
+ object acInsertAmpersand: TAction
+ Caption = 'acInsertAmpersand'
+ OnExecute = acInsertAmpersandExecute
+ ShortCut = 24631
+ end
+ object acInsertLesser: TAction
+ Caption = 'acInsertLesser'
+ OnExecute = acInsertLesserExecute
+ ShortCut = 24764
+ end
+ object acInsertGreater: TAction
+ Caption = 'acInsertGreater'
+ OnExecute = acInsertGreaterExecute
+ ShortCut = 24766
+ end
+ object acInsertCopyright: TAction
+ Caption = 'acInsertCopyright'
+ OnExecute = acInsertCopyrightExecute
+ ShortCut = 24643
+ end
+ object acInsertTradeMark: TAction
+ Caption = 'acInsertTradeMark'
+ OnExecute = acInsertTradeMarkExecute
+ ShortCut = 24660
+ end
+ end
+ object FontDialog: TFontDialog
+ MinFontSize = 0
+ MaxFontSize = 0
+ Options = [fdAnsiOnly, fdFixedPitchOnly, fdForceFontExist]
+ PreviewText = 'EPlus by Flying Sheep'
+ left = 152
+ top = 336
+ end
+end
diff --git a/applications/lazedit/main.pp b/applications/lazedit/main.pp
new file mode 100644
index 000000000..8102abb76
--- /dev/null
+++ b/applications/lazedit/main.pp
@@ -0,0 +1,2363 @@
+unit main;
+
+{
+ EPlus: a text editor with built-in features for HTML editing and
+ Syntax Highlighting for several text formats
+ (html, xml, css, javascript, pascal, c/c++, perl, python, php, bat, ini, diff, po)
+
+ Copyright (C) 2011, 2012 by Bart Broersma & Flying Sheep Inc.
+ http://home.tiscali.nl/~knmg0017/
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ {$ifdef windows}Win9xWSManager,{$endif}
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
+ LCLProc, Menus, ActnList, ClipBrd, LclIntf,
+ LMessages, {for overridden IsShortCut}
+ SynEdit, SynEditTypes,
+ EditorPageControl,
+ EPlus_Commons, EPlus_Config, HtmlCode, HtmlDialogs, CopyLeft{
+ MyFileUtils, Fcl_Misc, MruLists, MyGetOpt, ExtAbout, NlAutoTranslation};
+
+type
+
+ TIoResult = (ioSuccess, ioFail, ioCancel);
+
+ { TEPlusForm }
+
+ TEPlusForm = class(TForm)
+ HtmlActionList: TActionList;
+ acInsertAnchor: TAction;
+ acInsertPicture: TAction;
+ acInsertUList: TAction;
+ acInsertNlist: TAction;
+ acInsertListItem: TAction;
+ acInsertTable: TAction;
+ acInsertLineBreak: TAction;
+ acInsertNbSpace: TAction;
+ acInsertAmpersand: TAction;
+ acInsertLesser: TAction;
+ acInsertGreater: TAction;
+ acInsertCopyright: TAction;
+ acInsertTradeMark: TAction;
+ acLayoutBold: TAction;
+ acLayoutItalic: TAction;
+ acLayoutUnderline: TAction;
+ acLayoutSub: TAction;
+ acLayoutSup: TAction;
+ acLayoutEmphasis: TAction;
+ acLayoutStrong: TAction;
+ acLayoutAlignLeft: TAction;
+ acLayoutAlignRight: TAction;
+ acLayoutAlignCenter: TAction;
+ acLayoutAlignJustify: TAction;
+ acLayoutH1: TAction;
+ acLayoutH2: TAction;
+ acLayoutH3: TAction;
+ acLayoutH4: TAction;
+ acLayoutH5: TAction;
+ acLayoutH6: TAction;
+ acGroupingParagraph: TAction;
+ acGroupingDiv: TAction;
+ acGroupingSpan: TAction;
+ FileActionList: TActionList;
+ acFileOpen: TAction;
+ acFileNewPlain: TAction;
+ acFileNewFromTemplate: TAction;
+ acFileSave: TAction;
+ acFileSaveAll: TAction;
+ acAbout: TAction;
+ EditActionList: TActionList;
+ acEditCopy: TAction;
+ acEditPaste: TAction;
+ acEditFind: TAction;
+ acEditFindPrevious: TAction;
+ acEditFindNext: TAction;
+ FindDialog: TFindDialog;
+ HtmlToolbarImageList: TImageList;
+ MainToolbarImageList: TImageList;
+ MainMenu: TMainMenu;
+ mnuEditPasteTableContentTab: TMenuItem;
+ mnuEditPasteSpecial: TMenuItem;
+ mnuAbout: TMenuItem;
+ mnuViewFont: TMenuItem;
+ //File menu
+ mnuFile: TMenuItem;
+ mnuFileOpen: TMenuItem;
+ mnuFileNewFromTemplate: TMenuItem;
+ mnuFileNew: TMenuItem;
+ mnuFileNewText: TMenuItem;
+ mnuFileNewHtml: TMenuItem;
+ mnuFileNewXml: TMenuItem;
+ mnuFileNewCss: TMenuItem;
+ mnuFileNewJS: TMenuItem;
+ mnuFileNewFpc: TMenuItem;
+ mnuFileNewC: TMenuItem;
+ mnuFileNewPy: TMenuItem;
+ mnuFileNewPhp: TMenuItem;
+ mnuFileNewPerl: TMenuItem;
+ mnuFileNewShellScript: TMenuItem;
+ mnuFileNewBat: TMenuItem;
+ mnuFileNewIni: TMenuItem;
+ mnuFileSave: TMenuItem;
+ mnuFileSaveAs: TMenuItem;
+ mnuFileSaveAll: TMenuItem;
+ mnuFileCloseCurrent: TMenuItem;
+ mnuSep1: TMenuItem;
+ mnuFileOpenInBrowser: TMenuItem;
+ mnuSepAboveMru: TMenuItem;
+ mnuFileMru0: TMenuItem;
+ mnuFileMru1: TMenuItem;
+ mnuFileMru2: TMenuItem;
+ mnuFileMru3: TMenuItem;
+ mnuFileMru4: TMenuItem;
+ mnuFileMru5: TMenuItem;
+ mnuSep3: TMenuItem;
+ mnuFileCloseApp: TMenuItem;
+ //Edit menu
+ mnuEdit: TMenuItem;
+ mnuEditUndo: TMenuItem;
+ mnuEditRedo: TMenuItem;
+ mnuSep11: TMenuItem;
+ mnuEditCopy: TMenuItem;
+ mnuEditCut: TMenuItem;
+ mnuEditPaste: TMenuItem;
+ mnuEditSelectAll: TMenuItem;
+ mnuSep12: TMenuItem;
+ mnuEditReplace: TMenuItem;
+ mnuEditFindNext: TMenuItem;
+ mnuEditFind: TMenuItem;
+ //Insert menu
+ mnuInsert: TMenuItem;
+ mnuInsertAnchor: TMenuItem;
+ mnuInsertList: TMenuItem;
+ mnuInsertUList: TMenuItem;
+ mnuInsertNList: TMenuItem;
+ mnuInsertWordList: TMenuItem;
+ mnuInsetListItem: TMenuItem;
+ mnuInsertWordTerm: TMenuItem;
+ mnuInsertWordDefinition: TMenuItem;
+ mnuInsertTable: TMenuItem;
+ mnInsertNewTable: TMenuItem;
+ mnuInsertTableCell: TMenuItem;
+ mnuInsertTableRow: TMenuItem;
+ mnuInsertPicture: TMenuItem;
+ mnuInsertSpecialChars: TMenuItem;
+ mnuInsertLineBreak: TMenuItem;
+ mnuInsertSep1: TMenuItem;
+ mnuInsertHtmlComment: TMenuItem;
+ mnuInsertJS: TMenuItem;
+ mnuInsertCssStyle: TMenuItem;
+ //Layout menu
+ mnuLayout: TMenuItem;
+ mnuLayoutBold: TMenuItem;
+ mnuLayoutAlignJustify: TMenuItem;
+ mnuLayoutItalic: TMenuItem;
+ mnuLayoutUnderline: TMenuItem;
+ mnuLayoutSub: TMenuItem;
+ mnuLayoutSup: TMenuItem;
+ mnuLayoutEmphasis: TMenuItem;
+ mnuLayoutStrong: TMenuItem;
+ mnuLayoutHeadings: TMenuItem;
+ mnuLayoutH1: TMenuItem;
+ mnuLayoutH2: TMenuItem;
+ mnuLayoutH3: TMenuItem;
+ mnuLayoutH4: TMenuItem;
+ mnuLayoutH5: TMenuItem;
+ mnuLayoutH6: TMenuItem;
+ mnuLayoutAlign: TMenuItem;
+ mnuLayoutAlignLeft: TMenuItem;
+ mnuLayoutAlignRight: TMenuItem;
+ mnuLayoutAlignCenter: TMenuItem;
+ mnuLayoutCode: TMenuItem;
+ mnuLayoutQuote: TMenuItem;
+ mnuLayoutBlockQuote: TMenuItem;
+ mnuLayoutPreformatted: TMenuItem;
+ //Grouping menu
+ mnuGrouping: TMenuItem;
+ mnuGroupingParagraph: TMenuItem;
+ mnuGroupingDiv: TMenuItem;
+ mnuGroupingSpan: TMenuItem;
+ //View menu
+ mnuView: TMenuItem;
+ mnuViewFontsize: TMenuItem;
+ mnuViewFontSizeUp: TMenuItem;
+ mnuViewFontsizeDown: TMenuItem;
+ mnuViewHighlighter: TMenuItem;
+ //these menu items MUST have names that are built like this:
+ //'mnuViewHL' + eftNames[SomeIndex]
+ mnuViewHLeftNone: TMenuItem;
+ mnuViewHLeftHtml: TMenuItem;
+ mnuViewHLeftXml: TMenuItem;
+ mnuViewHLeftCss: TMenuItem;
+ mnuViewHLeftJS: TMenuItem;
+ mnuViewHLeftFpc: TMenuItem;
+ mnuViewHLeftLfm: TMenuItem;
+ mnuViewHLeftC: TMenuItem;
+ mnuViewHLeftPy: TMenuItem;
+ mnuViewHLeftPhp: TMenuItem;
+ mnuViewHLeftPerl: TMenuItem;
+ mnuViewHLeftUNIXShell: TMenuItem;
+ mnuViewHLeftBat: TMenuItem;
+ mnuViewHLeftDiff: TMenuItem;
+ mnuViewHLeftIni: TMenuItem;
+ mnuViewHLeftPo: TMenuItem;
+ //Popup menus
+ //Popup menu for editor
+ EditorPopupMenu: TPopupMenu;
+ mnuEditPopupSelectAll: TMenuItem;
+ mnuEditPopupPaste: TMenuItem;
+ mnuEditPopupCut: TMenuItem;
+ mnuEditPopupCopy: TMenuItem;
+ //Dropdownmenu for HeadingBtn
+ HeadingDropDownMenu: TPopupMenu;
+ mnuPopupLayoutH6: TMenuItem;
+ mnuPopupLayoutH5: TMenuItem;
+ mnuPopupLayoutH4: TMenuItem;
+ mnuPopupLayoutH3: TMenuItem;
+ mnuPopupLayoutH2: TMenuItem;
+ mnuPopupLayoutH1: TMenuItem;
+
+
+ MainToolbar: TToolBar;
+ NewFromTemplateBtn: TToolButton;
+ NewPlainBtn: TToolButton;
+ OpenBtn: TToolButton;
+ ReplaceDialog: TReplaceDialog;
+ SaveBtn: TToolButton;
+ SaveAllBtn: TToolButton;
+ tbSep1: TToolButton;
+ CopyBtn: TToolButton;
+ PasteBtn: TToolButton;
+ tbSep2: TToolButton;
+ FindBtn: TToolButton;
+ tbSep3: TToolButton;
+ InfoBtn: TToolButton;
+
+ HtmlToolbar: TToolBar;
+ AnchorBtn: TToolButton;
+ ImageBtn: TToolButton;
+ tbSep5: TToolButton;
+ UListBtn: TToolButton;
+ NListBtn: TToolButton;
+ ListItemBtn: TToolButton;
+ tbSep4: TToolButton;
+ TableBtn: TToolButton;
+ tbSep6: TToolButton;
+ BoldBtn: TToolButton;
+ ItalicBtn: TToolButton;
+ UnderlineBtn: TToolButton;
+ EmBtn: TToolButton;
+ StrongBtn: TToolButton;
+ SubBtn: TToolButton;
+ SupBtn: TToolButton;
+ tbSep7: TToolButton;
+ HeadingBtn: TToolButton;
+ tbSep8: TToolButton;
+ LeftAlignBtn: TToolButton;
+ RightAlignBtn: TToolButton;
+ CenterAlignBtn: TToolButton;
+ JustifyAlignBtn: TToolButton;
+ tbSep9: TToolButton;
+ ParaBtn: TToolButton;
+ DivBtn: TToolButton;
+ SpanBtn: TToolButton;
+
+ OpenDialog: TOpenDialog;
+ SaveDialog: TSaveDialog;
+ FontDialog: TFontDialog;
+ StatusBar: TStatusBar;
+
+ //FileActions
+ procedure acAboutExecute(Sender: TObject);
+ procedure acFileNewFromTemplateExecute(Sender: TObject);
+ procedure acFileNewPlainExecute(Sender: TObject);
+ procedure acFileOpenExecute(Sender: TObject);
+ procedure acFileSaveAllExecute(Sender: TObject);
+ procedure acFileSaveExecute(Sender: TObject);
+ //EditActions
+ procedure acEditCopyExecute(Sender: TObject);
+ procedure acEditFindExecute(Sender: TObject);
+ procedure acEditPasteExecute(Sender: TObject);
+ procedure acEditFindNextExecute(Sender: TObject);
+ procedure acEditFindPreviousExecute(Sender: TObject);
+ procedure acInsertAmpersandExecute(Sender: TObject);
+ //HtmlActions
+ procedure acInsertAnchorExecute(Sender: TObject);
+ procedure acInsertCopyrightExecute(Sender: TObject);
+ procedure acInsertGreaterExecute(Sender: TObject);
+ procedure acInsertLesserExecute(Sender: TObject);
+ procedure acInsertLineBreakExecute(Sender: TObject);
+ procedure acInsertListItemExecute(Sender: TObject);
+ procedure acInsertNbSpaceExecute(Sender: TObject);
+ procedure acInsertOlistExecute(Sender: TObject);
+ procedure acInsertPictureExecute(Sender: TObject);
+ procedure acInsertTableExecute(Sender: TObject);
+ procedure acInsertTradeMarkExecute(Sender: TObject);
+ procedure acInsertUListExecute(Sender: TObject);
+ procedure acLayoutAlignCenterExecute(Sender: TObject);
+ procedure acLayoutAlignJustifyExecute(Sender: TObject);
+ procedure acLayoutAlignLeftExecute(Sender: TObject);
+ procedure acLayoutAlignRightExecute(Sender: TObject);
+ procedure acLayoutBoldExecute(Sender: TObject);
+ procedure acGroupingDivExecute(Sender: TObject);
+ procedure acLayoutEmphasisExecute(Sender: TObject);
+ procedure acLayoutH1Execute(Sender: TObject);
+ procedure acLayoutH2Execute(Sender: TObject);
+ procedure acLayoutH3Execute(Sender: TObject);
+ procedure acLayoutH4Execute(Sender: TObject);
+ procedure acLayoutH5Execute(Sender: TObject);
+ procedure acLayoutH6Execute(Sender: TObject);
+ procedure acLayoutItalicExecute(Sender: TObject);
+ procedure acGroupingParagraphExecute(Sender: TObject);
+ procedure acGroupingSpanExecute(Sender: TObject);
+ procedure acLayoutStrongExecute(Sender: TObject);
+ procedure acLayoutSubExecute(Sender: TObject);
+ procedure acLayoutSupExecute(Sender: TObject);
+ procedure acLayoutUnderlineExecute(Sender: TObject);
+
+ procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
+ procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
+ procedure FormCreate(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
+ procedure FormShow(Sender: TObject);
+
+ //Main menu events
+ procedure TopLevelMenuClick(Sender: TObject);
+ //Menu File
+ procedure mnuFileCloseAppClick(Sender: TObject);
+ procedure mnuFileCloseCurrentClick(Sender: TObject);
+ procedure mnuFileSaveAsClick(Sender: TObject);
+ procedure mnuFileNewBatClick(Sender: TObject);
+ procedure mnuFileNewHtmlClick(Sender: TObject);
+ procedure mnuFileNewCClick(Sender: TObject);
+ procedure mnuFileNewCssClick(Sender: TObject);
+ procedure mnuFileNewFpcClick(Sender: TObject);
+ procedure mnuFileNewIniClick(Sender: TObject);
+ procedure mnuFileNewJSClick(Sender: TObject);
+ procedure mnuFileNewPerlClick(Sender: TObject);
+ procedure mnuFileNewPhpClick(Sender: TObject);
+ procedure mnuFileNewPyClick(Sender: TObject);
+ procedure mnuFileNewShellScriptClick(Sender: TObject);
+ procedure mnuFileNewXmlClick(Sender: TObject);
+ procedure mnuFileMruClick(Sender: TObject);
+ procedure mnuFileOpenInBrowserClick(Sender: TObject);
+ //Menu Edit
+ procedure mnuEditUndoClick(Sender: TObject);
+ procedure mnuEditRedoClick(Sender: TObject);
+ procedure mnuEditCutClick(Sender: TObject);
+ procedure mnuEditSelectAllClick(Sender: TObject);
+ procedure mnuFindNextClick(Sender: TObject);
+ procedure mnuEditReplaceClick(Sender: TObject);
+ procedure mnuEditPasteTableContentTabClick(Sender: TObject);
+ //Menu Insert
+ procedure mnuInsertCssStyleClick(Sender: TObject);
+ procedure mnuInsertHtmlCommentClick(Sender: TObject);
+ procedure mnuInsertJSClick(Sender: TObject);
+ procedure mnuInsertSpecialCharsClick(Sender: TObject);
+ procedure mnuInsertTableCellClick(Sender: TObject);
+ procedure mnuInsertTableRowClick(Sender: TObject);
+ procedure mnuInsertWordDefinitionClick(Sender: TObject);
+ procedure mnuInsertWordListClick(Sender: TObject);
+ procedure mnuInsertWordTermClick(Sender: TObject);
+
+ //Menu Layout
+ procedure mnuLayoutBlockQuoteClick(Sender: TObject);
+ procedure mnuLayoutCodeClick(Sender: TObject);
+ procedure mnuLayoutPreformattedClick(Sender: TObject);
+ procedure mnuLayoutQuoteClick(Sender: TObject);
+
+ //Menu View
+ procedure mnuViewFontClick(Sender: TObject);
+ procedure mnuViewFontsizeDownClick(Sender: TObject);
+ procedure mnuViewFontSizeUpClick(Sender: TObject);
+ procedure mnuSetHighlighterClick(Sender: TObject);
+
+ procedure AboutEPlus;
+
+ procedure DoFind(Sender: TObject); //callback for FindDialog
+ procedure DoReplace(Sender: TObject); //callback for ReplaceDialog
+
+ public
+ //overridden public form methods
+ //prevent propagating shortcuts from non-modal windows (menu's, actions etc.)
+ function IsShortcut(var Message: TLMKey): boolean; override;
+ private
+ { private declarations }
+ NoteBook: TEditorPageControl;
+ OpenSaveFilter: String;
+ TemplateFilter: String;
+ ConfigFileName: String;
+ ConfigFileDir: String;
+
+ FindText: String;
+ ReplaceText: String;
+ FindOptions: TSynSearchOptions;
+ ReplaceOptions: TSynSearchOptions;
+
+ AppOptions: TEPlusOptions;
+ MruList: TStringList;
+ MruMenuItems: Array[0..MruEntries-1] of TMenuItem;
+
+ procedure SetUpAndConfigureEPlus;
+ procedure SaveEplusConfiguration;
+ procedure CleanUp;
+
+ function GetDefaultAppOptions: TEPlusOptions;
+ procedure ApplyAppOptions(const Options: TEplusOptions);
+ procedure GatherAppOptions(var Options: TEplusOptions);
+
+ procedure TagMenuItemsAndActions;
+ procedure UpdateMenuItems;
+ procedure CreateMruMenuItemsArray;
+ function TryHlMenuTagToFileType(ATag: PtrInt; out AFileType: TEditorFileType): Boolean;
+
+ procedure ConstructOpenDialogFileFilters;
+ procedure ShowError(const Msg: String);
+
+ //Helper functions for editor;
+ function TryMarkSelection(const Pre, Post: String): Boolean;
+ //File procedures
+ function AskFileNameOpen: String;
+ function AskFileNameOpenTemplate: String;
+ function AskFileNameSave(const Fn: String; const FileType: TEditorFileType): String;
+ function AskFileNameSaveTemplate: String;
+ function TryFileOpen(const Fn: String; const AsTemplate: Boolean = False): Boolean;
+ function TryFileSave(Editor: TEditor; Fn: String): TIoResult;
+ function CloseCurrentEditor: Boolean;
+ function TryFileSaveAll(out Failures: String): Boolean;
+ procedure DoFileOpen;
+ procedure DoMruOpen(const Index: Integer);
+ procedure DoTemplateOpen;
+ procedure DoFileSave(Editor: TEditor);
+ procedure DoFileSaveAs(Editor: TEditor);
+ procedure DoFileSaveAsTemplate(Editor: TEditor);
+ procedure DoFileSaveAll;
+ procedure DoFileNewByType(const AFileType: TEditorFileType; const InitialText: String = '');
+ procedure DoFileNewHtml;
+ procedure FileOpenInBrowser;
+
+ //Edit procedures
+ procedure EditUndo;
+ procedure EditRedo;
+ procedure EditCopy;
+ procedure EditPaste;
+ procedure EditCut;
+ procedure EditSelectAll;
+ procedure EditFind;
+ procedure EditFindNext;
+ procedure EditFindPrevious;
+ procedure EditReplace;
+ procedure EditPasteTableContentTab;
+
+
+ //Insert and layout procedures
+ procedure InsertAnchor;
+ procedure InsertPicture;
+ procedure InsertTable;
+ procedure InsertSpecialChars;
+ procedure InsertSpecial(const AValue: String);
+
+ procedure LayoutHeading(const Level: Integer);
+
+ //View procedures
+ procedure SetHighlighter(const AFileType: TEditorFileType);
+ procedure EditorSelectFont;
+ procedure EditorFontSizeUp;
+ procedure EditorFontSizeDown;
+
+
+ procedure ParseCommandlineFilenames(Dummy: PtrInt); //Dummy is needed for QueueAsyncCall()
+ procedure ParseCommandLineSwitches;
+
+ //NoteBook and Editor Events
+ procedure OnEditorStatusChange(Sender: TObject; Changes: TSynStatusChanges);
+ procedure OnBeforeCloseEditor(Sender: TTabSheet; var Cancel: Boolean);
+ procedure OnCharsetChange(Sender: TEditor; const OldCharset, NewCharset: String; const LineNr: Integer);
+ procedure OnMruListChange(Sender: TObject);
+
+ //CharMap events
+ procedure OnHtmlCharMapInsertText(AValue: String);
+ public
+ { public declarations }
+ end;
+
+var
+ EPlusForm: TEPlusForm;
+
+implementation
+
+{$R *.lfm}
+
+
+const pXY = 0; //Panels constanten
+ pMod = 1;
+ pIns = 2;
+ pName = 3;
+ SLine = 'Rg';
+ SCol = 'Kol';
+ SModified = 'Gewijzigd';
+ SIns = 'INS';
+ SOvr = 'OVR';
+
+ tgNeedsEditor = $01;
+ tgNeedsSelection = $02;
+ tgNeedsClipPaste = $04;
+
+
+ msgOpenError = 'Fout bij openen van bestand:'^m'%s';
+ msgSaveError = 'Fout bij opslaan van bestand:'^m'%s';
+ msgSaveAllError = 'De volgende bestanden zijn niet opgeslagen:'^m'%s';
+ msgFileIsNotText = 'Dit bestand lijkt geen tekstbestand te zijn'^m'%s'^m'Wilt u het toch openen?';
+ msgFileNotFound = 'Bestand niet gevonden:'^m'%s';
+ msgModifiedSave = 'Bestand is gewijzigd:'^m'%s'^m'Bestand opslaan?';
+ msgMruIndexOutOfBound = 'Index voor recent geopende bestanden ligt buiten de grenzen [%d]'^m+
+ 'Dit is uiteraard een fout van de programmeur';
+ msgFileTypeNotForBrowser = 'Dit bestandstype lijkt niet geschikt om te openen in een browser.'^m+
+ 'Wilt u toch doorgaan?';
+ msgFileHasNoName = 'Dit bestand heeft nog geen naam.'^m +
+ 'U moet het bestand eerst opslaan om het in de browser te openen.';
+ msgErrorBrowser = 'Er is een fout opgetreden tijdens het openen van'^m+
+ '%s'^m'in de browser.';
+ msgTextNotFound = 'Tekst niet gevonden:'^m'"%s"';
+
+ //Initial text for FileNew commands
+ itXml = '';
+ itBat = '@echo off';
+ itUnixShellScript = '#!/bin/bash';
+
+ //Commandline options
+ opt_long_PCP = 'pcp'; //--pcp=path/to/configfile
+ opt_short_blankpage = 'n';
+
+
+{ TEPlusForm }
+
+{ ************************** [ Form event handlers] ***********************************}
+
+procedure TEPlusForm.FormCreate(Sender: TObject);
+begin
+ SetUpAndConfigureEPlus;
+end;
+
+procedure TEPlusForm.FormDestroy(Sender: TObject);
+begin
+ CleanUp;
+end;
+
+procedure TEPlusForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
+begin
+ SaveEplusConfiguration;
+end;
+
+procedure TEPlusForm.FormCloseQuery(Sender: TObject; var CanClose: boolean);
+begin
+ While NoteBook.PageCount > 0 do
+ begin
+ if not NoteBook.ClosePage(NoteBook.PageCount - 1) then
+ //ClosePage invokes OnBeforeCloseEditor, which sets Cancel = True if file is not saved
+ //this in turn will make ClosePage() return false
+ begin
+ CanClose := False;
+ Break;
+ end;
+ end;
+end;
+
+procedure TEPlusForm.FormDropFiles(Sender: TObject; const FileNames: array of String);
+var
+ i: Integer;
+begin
+ for i := Low(FileNames) to High(FileNames) do
+ begin
+ if FileExistsUtf8(FileNames[i]) then
+ begin
+ if not TryFileOpen(FileNames[i]) then ShowError(Format('Fout bij openen van bestand'^m,[FileNames[i]]));
+ end
+ else ShowError(Format(msgFileNotFound,[FileNames[i]]));
+ end;
+end;
+
+procedure TEPlusForm.FormShow(Sender: TObject);
+begin
+ //This needs to be done only after the mainform has become visible on the screen
+ Application.QueueAsyncCall(@ParseCommandLineFileNames, 0);
+end;
+
+
+{ ********************** [ Menu OnClick Handlers ] ************************ }
+
+procedure TEPlusForm.mnuFileOpenInBrowserClick(Sender: TObject);
+begin
+ FileOpenInBrowser;
+end;
+
+procedure TEPlusForm.mnuEditPasteTableContentTabClick(Sender: TObject);
+begin
+ EditPasteTableContentTab;
+end;
+
+
+procedure TEPlusForm.mnuInsertCssStyleClick(Sender: TObject);
+begin
+ TryMarkSelection(style_start, style_end);
+end;
+
+procedure TEPlusForm.mnuInsertHtmlCommentClick(Sender: TObject);
+begin
+ TryMarkSelection(comment_start, comment_end);
+end;
+
+procedure TEPlusForm.mnuInsertJSClick(Sender: TObject);
+begin
+ TryMarkSelection(script_start, script_end);
+end;
+
+procedure TEPlusForm.mnuInsertSpecialCharsClick(Sender: TObject);
+begin
+ InsertSpecialChars;
+end;
+
+procedure TEPlusForm.mnuInsertTableCellClick(Sender: TObject);
+begin
+ TryMarkSelection(col_start, col_end);
+end;
+
+procedure TEPlusForm.mnuInsertTableRowClick(Sender: TObject);
+begin
+ TryMarkSelection(row_start, row_end);
+end;
+
+procedure TEPlusForm.mnuInsertWordDefinitionClick(Sender: TObject);
+begin
+ TryMarkSelection(worddef_start, worddef_end);
+end;
+
+procedure TEPlusForm.mnuInsertWordListClick(Sender: TObject);
+begin
+ TryMarkSelection(wordlist_start, wordlist_end);
+end;
+
+procedure TEPlusForm.mnuInsertWordTermClick(Sender: TObject);
+begin
+ TryMarkSelection(wordterm_start, wordterm_end);
+end;
+
+procedure TEPlusForm.mnuLayoutBlockQuoteClick(Sender: TObject);
+begin
+ TryMarkSelection(blockquote_start, blockquote_end);
+end;
+
+procedure TEPlusForm.mnuLayoutCodeClick(Sender: TObject);
+begin
+ TryMarkSelection(code_start, code_end);
+end;
+
+procedure TEPlusForm.mnuLayoutPreformattedClick(Sender: TObject);
+begin
+ TryMarkSelection(pre_start, pre_end);
+end;
+
+procedure TEPlusForm.mnuLayoutQuoteClick(Sender: TObject);
+begin
+ TryMarkSelection(quote_start, quote_end);
+end;
+
+procedure TEPlusForm.mnuViewFontClick(Sender: TObject);
+begin
+ EditorSelectFont;
+end;
+
+
+procedure TEPlusForm.mnuViewFontsizeDownClick(Sender: TObject);
+begin
+ EditorFontSizeDown;
+end;
+
+procedure TEPlusForm.mnuViewFontSizeUpClick(Sender: TObject);
+begin
+ EditorFontSizeUp;
+end;
+
+
+procedure TEPlusForm.TopLevelMenuClick(Sender: TObject);
+begin
+ UpdateMenuItems;
+end;
+
+procedure TEPlusForm.mnuEditCutClick(Sender: TObject);
+begin
+ EditCut;
+end;
+
+procedure TEPlusForm.mnuFileCloseAppClick(Sender: TObject);
+begin
+ Close;
+end;
+
+procedure TEPlusForm.mnuFileCloseCurrentClick(Sender: TObject);
+begin
+ CloseCurrentEditor;
+end;
+
+procedure TEPlusForm.mnuFileSaveAsClick(Sender: TObject);
+begin
+ DoFileSaveAs(NoteBook.CurrentEditor);
+end;
+
+
+
+procedure TEPlusForm.mnuFindNextClick(Sender: TObject);
+begin
+ EditFindNext;
+end;
+
+procedure TEPlusForm.mnuFileNewBatClick(Sender: TObject);
+begin
+ DoFileNewByType(eftBat, itBat);
+end;
+
+procedure TEPlusForm.mnuFileNewHtmlClick(Sender: TObject);
+begin
+ DoFileNewHtml;
+end;
+
+procedure TEPlusForm.mnuFileNewCClick(Sender: TObject);
+begin
+ DoFileNewByType(eftC);
+end;
+
+procedure TEPlusForm.mnuFileNewCssClick(Sender: TObject);
+begin
+ DoFileNewByType(eftCss);
+end;
+
+procedure TEPlusForm.mnuFileNewFpcClick(Sender: TObject);
+begin
+ DoFileNewByType(eftFpc);
+end;
+
+procedure TEPlusForm.mnuFileNewIniClick(Sender: TObject);
+begin
+ DoFileNewByType(eftIni);
+end;
+
+procedure TEPlusForm.mnuFileNewJSClick(Sender: TObject);
+begin
+ DoFileNewByType(eftJS);
+end;
+
+procedure TEPlusForm.mnuFileNewPerlClick(Sender: TObject);
+begin
+ DoFileNewByType(eftPerl);
+end;
+
+procedure TEPlusForm.mnuFileNewPhpClick(Sender: TObject);
+begin
+ DoFileNewByType(eftPerl);
+end;
+
+procedure TEPlusForm.mnuFileNewPyClick(Sender: TObject);
+begin
+ DoFileNewByType(eftPy);
+end;
+
+procedure TEPlusForm.mnuFileNewShellScriptClick(Sender: TObject);
+begin
+ DoFileNewByType(eftUnixShell, itUnixShellScript);
+end;
+
+procedure TEPlusForm.mnuFileNewXmlClick(Sender: TObject);
+begin
+ DoFileNewByType(eftXml, itXml);
+end;
+
+procedure TEPlusForm.mnuFileMruClick(Sender: TObject);
+var
+ Index: Integer;
+begin
+ Index := ((Sender as TMenuItem).Tag) shr 4;
+ //debugln('Menu->File->',(Sender as TMenuItem).Caption,' Index = ',Dbgs(Index));
+ DoMruOpen(Index);
+end;
+
+procedure TEPlusForm.mnuEditRedoClick(Sender: TObject);
+begin
+ EditRedo;
+end;
+
+procedure TEPlusForm.mnuEditReplaceClick(Sender: TObject);
+begin
+ EditReplace;
+end;
+
+procedure TEPlusForm.mnuSetHighlighterClick(Sender: TObject);
+var
+ AFileType: TEditorFileType;
+begin
+ if TryHlMenuTagToFileType((Sender as TMenuItem).Tag, AFileType) then
+ SetHighlighter(AFileType)
+ else
+ debugln(Format('Error: Invalid tag for MenuItem %s: %x',[(Sender as TMenuItem).Name,(Sender as TMenuItem).Tag]));
+end;
+
+
+
+procedure TEPlusForm.mnuEditSelectAllClick(Sender: TObject);
+begin
+ EditSelectAll;
+end;
+
+procedure TEPlusForm.mnuEditUndoClick(Sender: TObject);
+begin
+ EditUndo;
+end;
+
+
+{ ******************** [Action OnExecute Handlers ] *********************** }
+
+procedure TEPlusForm.acFileOpenExecute(Sender: TObject);
+begin
+ DoFileOpen;
+end;
+
+procedure TEPlusForm.acFileSaveAllExecute(Sender: TObject);
+begin
+ DoFileSaveAll;
+end;
+
+procedure TEPlusForm.acFileNewFromTemplateExecute(Sender: TObject);
+begin
+ DoTemplateOpen;
+end;
+
+procedure TEPlusForm.acAboutExecute(Sender: TObject);
+begin
+ AboutEplus;
+end;
+
+procedure TEPlusForm.acEditFindNextExecute(Sender: TObject);
+begin
+ EditFindNext;
+end;
+
+procedure TEPlusForm.acEditFindPreviousExecute(Sender: TObject);
+begin
+ EditFindPrevious;
+end;
+
+procedure TEPlusForm.acInsertAmpersandExecute(Sender: TObject);
+begin
+ InsertSpecial(Ampersand);
+end;
+
+procedure TEPlusForm.acInsertAnchorExecute(Sender: TObject);
+begin
+ InsertAnchor;
+end;
+
+procedure TEPlusForm.acInsertCopyrightExecute(Sender: TObject);
+begin
+ InsertSpecial(CopyRight);
+end;
+
+procedure TEPlusForm.acInsertGreaterExecute(Sender: TObject);
+begin
+ InsertSpecial(Greater);
+end;
+
+procedure TEPlusForm.acInsertLesserExecute(Sender: TObject);
+begin
+ InsertSpecial(Lesser);
+end;
+
+procedure TEPlusForm.acInsertLineBreakExecute(Sender: TObject);
+begin
+ InsertSpecial(LineBreak);
+end;
+
+procedure TEPlusForm.acInsertListItemExecute(Sender: TObject);
+begin
+ TryMarkSelection(listitem_start, listitem_end);
+end;
+
+procedure TEPlusForm.acInsertNbSpaceExecute(Sender: TObject);
+begin
+ InsertSpecial(NbSpace);
+end;
+
+procedure TEPlusForm.acInsertOlistExecute(Sender: TObject);
+begin
+ TryMarkSelection(numberedlist_start, numberedlist_end);
+end;
+
+procedure TEPlusForm.acInsertPictureExecute(Sender: TObject);
+begin
+ InsertPicture;
+end;
+
+procedure TEPlusForm.acInsertTableExecute(Sender: TObject);
+begin
+ InsertTable;
+end;
+
+procedure TEPlusForm.acInsertTradeMarkExecute(Sender: TObject);
+begin
+ InsertSpecial(TradeMark);
+end;
+
+procedure TEPlusForm.acInsertUListExecute(Sender: TObject);
+begin
+ TryMarkSelection(unnumberedlist_start, unnumberedlist_end);
+end;
+
+procedure TEPlusForm.acLayoutAlignCenterExecute(Sender: TObject);
+begin
+ TryMarkSelection(centeralign_start, centeralign_end);
+end;
+
+procedure TEPlusForm.acLayoutAlignJustifyExecute(Sender: TObject);
+begin
+ TryMarkSelection(justifyalign_start, justifyalign_end);
+end;
+
+procedure TEPlusForm.acLayoutAlignLeftExecute(Sender: TObject);
+begin
+ TryMarkSelection(leftalign_start, leftalign_end);
+end;
+
+procedure TEPlusForm.acLayoutAlignRightExecute(Sender: TObject);
+begin
+ TryMarkSelection(rightalign_start, rightalign_end);
+end;
+
+procedure TEPlusForm.acLayoutBoldExecute(Sender: TObject);
+begin
+ TryMarkSelection(bold_start, bold_end);
+end;
+
+procedure TEPlusForm.acGroupingDivExecute(Sender: TObject);
+begin
+ TryMarkSelection(div_start, div_end);
+end;
+
+procedure TEPlusForm.acLayoutEmphasisExecute(Sender: TObject);
+begin
+ TryMarkSelection(emphasis_start, emphasis_end);
+end;
+
+procedure TEPlusForm.acLayoutH1Execute(Sender: TObject);
+begin
+ LayoutHeading(1);
+end;
+
+procedure TEPlusForm.acLayoutH2Execute(Sender: TObject);
+begin
+ LayoutHeading(2);
+end;
+
+procedure TEPlusForm.acLayoutH3Execute(Sender: TObject);
+begin
+ LayoutHeading(3);
+end;
+
+procedure TEPlusForm.acLayoutH4Execute(Sender: TObject);
+begin
+ LayoutHeading(4);
+end;
+
+procedure TEPlusForm.acLayoutH5Execute(Sender: TObject);
+begin
+ LayoutHeading(5);
+end;
+
+procedure TEPlusForm.acLayoutH6Execute(Sender: TObject);
+begin
+ LayoutHeading(6);
+end;
+
+procedure TEPlusForm.acLayoutItalicExecute(Sender: TObject);
+begin
+ TryMarkSelection(italic_start, italic_end);
+end;
+
+procedure TEPlusForm.acGroupingParagraphExecute(Sender: TObject);
+begin
+ TryMarkSelection(paragraph_start, paragraph_end);
+end;
+
+procedure TEPlusForm.acGroupingSpanExecute(Sender: TObject);
+begin
+ TryMarkSelection(span_start, span_end);
+end;
+
+procedure TEPlusForm.acLayoutStrongExecute(Sender: TObject);
+begin
+ TryMarkSelection(strong_start, strong_end);
+end;
+
+procedure TEPlusForm.acLayoutSubExecute(Sender: TObject);
+begin
+ TryMarkSelection(sub_start, sub_end);
+end;
+
+procedure TEPlusForm.acLayoutSupExecute(Sender: TObject);
+begin
+ TryMarkSelection(sup_start, sup_end);
+end;
+
+procedure TEPlusForm.acLayoutUnderlineExecute(Sender: TObject);
+begin
+ TryMarkSelection(underline_start, underline_end);
+end;
+
+procedure TEPlusForm.acEditCopyExecute(Sender: TObject);
+begin
+ EditCopy;
+end;
+
+procedure TEPlusForm.acEditFindExecute(Sender: TObject);
+begin
+ EditFind;
+end;
+
+procedure TEPlusForm.acEditPasteExecute(Sender: TObject);
+begin
+ EditPaste;
+end;
+
+procedure TEPlusForm.acFileNewPlainExecute(Sender: TObject);
+begin
+ DoFileNewByType(eftNone);
+end;
+
+procedure TEPlusForm.acFileSaveExecute(Sender: TObject);
+begin
+ DoFileSave(NoteBook.CurrentEditor);
+end;
+
+
+{ ********************** [ Form Methods ] ***************************** }
+
+function TEPlusForm.IsShortcut(var Message: TLMKey): boolean;
+begin
+ if Active then
+ Result := inherited IsShortcut(Message)
+ else
+ Result := False;
+end;
+
+{ ********************** [ Initializing and cleaning up ] ************* }
+
+
+procedure TEPlusForm.SetUpAndConfigureEPlus;
+begin
+ ConfigFileDir := GetDefaultIniDir;
+ ParseCommandLineSwitches;
+ if (not DirectoryExists(ConfigFileDir)) and (ConfigFileDir <> '') then
+ begin
+ if not ForceDirectories(ConfigFileDir) then
+ begin
+ if (CompareFilenames(ConfiGFileDir, GetDefaultIniDir) <> 0) then
+ begin
+ debugln('Error creating directory: ',ConfigFileDir);
+ debugln('Trying ',GetDefaultIniDir,' instead.');
+ ConfigFileDir := GetDefaultIniDir;
+ end;
+ end;
+ end;
+
+ ConfigFileName := IncludeTrailingPathDelimiter(ConfigFileDir) + GetDefaultIniNameOnly;
+ //DebugLn('ConfigFileName = ',ConfigFileName);
+
+
+ // REMOVE !!
+ //ConfigFileName := 'F:\LazarusProjecten\EPlus\EPlus.ini';
+ //debugln('Temporarily using: ',ConfigFileName);
+ //^^^^^^^^^^^^^^
+
+ Caption := AppName;
+
+ TagMenuItemsAndActions;
+ CreateMruMenuItemsArray;
+
+ //Create the notebook
+ NoteBook := TEditorPageControl.Create(Self);
+ NoteBook.Align := alClient;
+ NoteBook.Parent := Self;
+ NoteBook.OnStatusChange := @OnEditorStatusChange;
+ NoteBook.OnBeforeCloseEditor := @OnBeforeCloseEditor;
+ NoteBook.OnEditorCharsetChange := @OnCharsetChange;
+
+ //Creating dialogs
+ HtmlCharMapDlg := THtmlCharMapDlg.Create;
+ HtmlCharMapDlg.OnHtmlCharClick := @OnHtmlCharMapInsertText;
+ NewHtmlDlg := TNewHtmlDlg.Create;
+ AnchorDlg := TAnchorDlg.Create;
+ PictureDlg := TPictureDlg.Create;
+ TableDlg := TTableDlg.Create;
+
+ //MruList
+ MruList := TStringList.Create();
+ //MruList.MaxEntries := MruEntries;
+
+ //Configurable options
+ AppOptions := GetDefaultAppOptions;
+ if not LoadOptions(AppOptions, ConfigFileName) then
+ DebugLn('Fout bij laden van opties:',LineEnding,' ',ConfigFileName)
+ else
+ ApplyAppOptions(AppOptions);
+ ConstructOpenDialogFileFilters;
+ //Attach the OnChange handler after filling the list (in LoadOptions)
+ //MruList.OnChange := @OnMruListChange;
+ //Update the MRU menu entries
+ OnMruListChange(Self);
+
+
+end;
+
+procedure TEPlusForm.SaveEplusConfiguration;
+begin
+ GatherAppOptions(AppOptions);
+ if not EPlus_Config.SaveOptions(AppOptions, ConfigFileName) then
+ DebugLn('Fout bij opslaan van opties:',LineEnding,' ',ConfigFileName);
+end;
+
+procedure TEPlusForm.CleanUp;
+begin
+ HtmlCharMapDlg.OnHtmlCharClick := nil;
+ HtmlCharMapDlg.Free;
+ NewHtmlDlg.Free;
+ AnchorDlg.Free;
+ PictureDlg.Free;
+ TableDlg.Free;
+end;
+
+{ ********************** [ Configuration ] ************************** }
+
+function TEPlusForm.GetDefaultAppOptions: TEPlusOptions;
+var
+ i: Integer;
+begin
+ Result.FileTypeMaskList := DefaultFileTypeMaskList;
+ Result.MainForm.Position := Rect(-1, -1, -1, -1);
+ Result.MainForm.InitialDir := '';
+ Result.AnchorDlg.Position := Point(-1,-1);
+ Result.HtmlCharMapDlg.Position := Point(-1,-1);
+ Result.NewHtmlDlg.Position := Point(-1,-1);
+ Result.PictureDlg.Position := Point(-1,-1);
+ Result.PictureDlg.InitialDir := '';
+ Result.TableDlg.Position := Point(-1,-1);
+ for i := 0 to MruEntries - 1 do Result.RecentFiles[i] := '';
+ Result.EditorOptions := NoteBook.EditorOptions;
+ Result.TemplateMaskList := DefaultTemplateMaskList;
+end;
+
+procedure TEPlusForm.ApplyAppOptions(const Options: TEplusOptions);
+ function ValidPos(const New, Old: Integer): Integer;
+ begin
+ if (New < 0) then Result := Old else Result := New;
+ end;
+var
+ ALeft, ATop, AWidth, AHeight: Integer;
+ //ftIndex: TEditorFileType;
+ i: Integer;
+ EdOpt: TEditorOptions;
+begin
+ EdOpt := NoteBook.EditorOptions;
+ if (Options.EditorOptions.FontName <> '') or (Options.EditorOptions.FontSize <> 0) then
+ begin
+ //debugln('NoteBook.EditorOptions <> default');
+ EdOpt.FontName := Options.EditorOptions.FontName;
+ EdOpt.FontSize := Options.EditorOptions.FontSize;
+ NoteBook.EditorOptions := EdOpt;
+ end;
+ ALeft := ValidPos(Options.MainForm.Position.Left,Left);
+ ATop := ValidPos(Options.MainForm.Position.Top,Top);
+ AWidth := ValidPos(Options.MainForm.Position.Right,Width);
+ AHeight := ValidPos(Options.MainForm.Position.Bottom,Height);
+ SetBounds(ALeft, ATop, AWidth, AHeight);
+ {
+ for ftIndex := Low(TEditorFileType) to High(TEditorFileType) do
+ begin
+ DebugLn(eftNames[ftIndex],'=',Options.FileTypeMaskList[ftIndex]);
+ end;
+ }
+ //FileTypeMaskList := Options.FileTypeMaskList;
+ if Options.MainForm.InitialDir <> '' then OpenDialog.InitialDir := Options.MainForm.InitialDir;
+
+
+ //Dialogs
+ NewHtmlDlg.Top := Options.NewHtmlDlg.Position.y;
+ NewHtmlDlg.Left := Options.NewHtmlDlg.Position.x;
+ NewHtmlDlg.InitialDir := Options.NewHtmlDlg.InitialDir;
+
+ AnchorDlg.Top := Options.AnchorDlg.Position.y;
+ AnchorDlg.Left := Options.AnchorDlg.Position.x;
+
+ HtmlCharMapDlg.Top := Options.HtmlCharMapDlg.Position.y;
+ HtmlCharMapDlg.Left := Options.HtmlCharMapDlg.Position.x;
+
+ PictureDlg.Top := Options.PictureDlg.Position.y;
+ PictureDlg.Left := Options.PictureDlg.Position.x;
+ PictureDlg.InitialDir := Options.PictureDlg.InitialDir;
+ PictureDlg.DefaultFolderPrefix := Options.PictureDlg.DefaultFolderPrefix;
+
+ TableDlg.Top := Options.TableDlg.Position.y;
+ TableDlg.Left := Options.TableDlg.Position.x;
+
+ //uses downto loop because TMruList.Add stores item at index = 0
+ for i := MruEntries - 1 downto 0 do
+ begin
+ if (Options.RecentFiles[i] <> '') then
+ MruList.Add(Options.RecentFiles[i]);
+ end;
+end;
+
+procedure TEPlusForm.GatherAppOptions(var Options: TEplusOptions);
+var
+ i: Integer;
+begin
+ if (Self.WindowState = wsNormal) then Options.MainForm.Position := Rect(Left, Top, Width, Height);
+ OpenDialog.InitialDir := Options.MainForm.InitialDir;
+ SaveDialog.InitialDir := Options.MainForm.InitialDir;
+
+ Options.EditorOptions := NoteBook.EditorOptions;
+ //Options.FileTypeMaskList := FileTypeMaskList;
+
+ //Dialogs
+ Options.NewHtmlDlg.Position.y := NewHtmlDlg.Top;
+ Options.NewHtmlDlg.Position.x := NewHtmlDlg.Left;
+ Options.NewHtmlDlg.InitialDir := NewHtmlDlg.InitialDir;
+
+ Options.AnchorDlg.Position.y := AnchorDlg.Top;
+ Options.AnchorDlg.Position.x := AnchorDlg.Left;
+
+ Options.HtmlCharMapDlg.Position.y := HtmlCharMapDlg.Top;
+ Options.HtmlCharMapDlg.Position.x := HtmlCharMapDlg.Left;
+
+ Options.PictureDlg.Position.y := PictureDlg.Top;
+ Options.PictureDlg.Position.x := PictureDlg.Left;
+ Options.PictureDlg.InitialDir := PictureDlg.InitialDir;
+ Options.PictureDlg.DefaultFolderPrefix := PictureDlg.DefaultFolderPrefix;
+
+ Options.TableDlg.Position.y := TableDlg.Top;
+ Options.TableDlg.Position.x := TableDlg.Left;
+
+ for i := 0 to MruEntries - 1 do
+ begin
+ if MruList.Count > i then
+ Options.RecentFiles[i] := MruList.Strings[i]
+ else
+ Options.RecentFiles[i] := '';
+ end;
+end;
+
+
+procedure TEPlusForm.ConstructOpenDialogFileFilters;
+ function AddWilds(const S: String): String;
+ //S has the form of '.pp;.pas;.inc'
+ //This function will add '*' in front of every extension in the list
+ var
+ SL: TStringList;
+ i: Integer;
+ begin
+ Result := '';
+ SL := TStringList.Create;
+ try
+ SL.Delimiter := ';';
+ SL.StrictDelimiter := True;
+ SL.DelimitedText := S;
+ for i := 0 to SL.Count - 1 do
+ begin
+ if (Length(SL.Strings[i]) > 0) then Result := Result + '*' + SL.Strings[i] + ';';
+ end;
+ if (Length(Result) > 0) and (Result[Length(Result)] = ';') then System.Delete(Result,Length(Result),1);
+ finally
+ SL.Free;
+ end;
+ end;
+var
+ Filter, SubFilter, WildFilter: String;
+ Index: Integer;
+ FileType: TEditorFileType;
+begin
+ //First filter for OpenSave
+ Filter := '';
+ for Index := fiEftFirst to fiEftLast do
+ begin
+ FileType := TEditorFileType(Index);
+ //DbgOut(eftNames[FileType],' -> ');
+ WildFilter := AddWilds(AppOptions.FileTypeMaskList[FileType]);
+ //DebugLn(WildFilter);
+ SubFilter := eftFilterNames[FileType] + ' (' + WildFilter + ')|'+ WildFilter;
+ Filter := Filter + '|' + SubFilter;
+ end;
+ Filter := Filter + '|' + FilterText;
+ WildFilter := AddWilds(AppOptions.TemplateMaskList);
+ //Also add template filter to Open/SaveFilter
+ Filter := Filter + '|' + STemplate + ' (' + WildFilter + ')|' + WildFilter;
+ Filter := Filter + '|' + FilterAll;
+ while (Length(Filter) > 0) and (Filter[1] = '|') do System.Delete(Filter,1,1);
+ OpenSaveFilter := Filter;
+
+ //Now filter for Open/Save as Template
+ TemplateFilter := STemplate + ' (' + WildFilter + ')|' + WildFilter + '|' + FilterAll;
+end;
+
+{ ********************** [ Commandline options ] ******************************** }
+
+procedure TEPlusForm.ParseCommandlineFilenames(Dummy: PtrInt);
+var
+ i: Integer;
+ S: String;
+begin
+ //debugln('ParseCommandlineFilenames, FileNamesCount = ',DbgS(FileNamesCount));
+ if Dummy = 12345 then Exit; //Get rid of annoying hint
+{ for i := 1 to MyGetOpt.FileNamesCount do
+ begin
+ S := MyGetOpt.FileNameStr(i);
+ if (S <> EmptyStr) then
+ begin
+ //it is a file to open
+ S := ExpandFileNameUtf8(S); //we want full filename here, e.g. for filename in statusbar
+ if FileExistsUtf8(S) then
+ begin
+ if not TryFileOpen(S) then ShowError(Format(msgOpenError,[S]));
+ end
+ else ShowError(Format(msgFileNotFound,[S]));
+ end
+ end;
+ if (MyGetOpt.FileNamesCount = 0) and MyGetOpt.HasOption(opt_short_blankpage,False) then
+ DoFileNewByType(eftNone); }
+end;
+
+procedure TEPlusForm.ParseCommandLineSwitches;
+var
+ S: String;
+begin
+ //debugln('ParseCommandlineSwitches');
+{ if MyGetOpt.HasOption(opt_long_PCP, False, S) then
+ begin
+ if (S <> EmptyStr) then
+ begin
+ S := ExcludeTrailingPathdelimiter(ExpandFileName(S));
+ //MyGetOpt returns parameters as UTF8
+ //inifiles uses system-encoding
+ ConfigFileDir := Utf8ToSys(S);
+ end;
+ end;}
+end;
+
+
+
+{ ***************** [ Menu-related Helper functions/procedures ] ************************ }
+
+
+procedure TEPlusForm.CreateMruMenuItemsArray;
+var
+ i, Nr: Integer;
+ C: TComponent;
+ N: TComponentName;
+begin
+ for i := 0 to ComponentCount - 1 do
+ begin
+ C := Components[i];
+ if (C is TMenuItem) then
+ begin
+ N := UpperCase(C.Name);
+ if Pos('MNUFILEMRU',N) = 1 then
+ begin
+ System.Delete(N,1,Length('mnuFileMru'));
+ if TryStrToInt(N, Nr) then
+ begin
+ if (Nr in [0..MruEntries - 1]) then
+ begin
+ MruMenuItems[Nr] := TMenuItem(C);
+ MruMenuItems[Nr].Tag := MruMenuItems[Nr].Tag or (Nr shl 4);
+ //Debugln('Menu: ',C.Name,' -> MruMenuItems[',DbgS(Nr),']');
+ end;
+ end;
+ end;
+ end;
+ end;
+end;
+
+function TEPlusForm.TryHlMenuTagToFileType(ATag: PtrInt; out
+ AFileType: TEditorFileType): Boolean;
+begin
+ AFileType := eftNone;
+ //dbgout('Tg = ',IntToHex(Tg,8),' -> ');
+ ATag := ATag and $FF00;
+ //dbgout('Tg = ',IntToHex(Tg,8),' -> ');
+ ATag := ATag shr 8;
+ //debugln('Tg = ',IntToHex(Tg,8));
+ Result := not (ATag < Ord(Low(TEditorFileType))) or (ATag > Ord(High(TEditorFileType)));
+ if Result then AFileType := TEditorFileType(ATag);
+end;
+
+
+
+procedure TEPlusForm.TagMenuItemsAndActions;
+var
+ i: Integer;
+ C: TComponent;
+ N: TComponentName;
+ //NE: Boolean;
+ //NS: Boolean;
+ Index: TEditorFileType;
+begin
+ for i := 0 to self.ComponentCount - 1 do
+ begin
+ C := Self.Components[i];
+ N := C.Name;
+ if (C is TAction) or (C is TMenuItem) then
+ begin
+ //Things that need an open editor
+ if Pos('LAYOUT',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor;
+ if Pos('EDIT',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor;
+ if Pos('INSERT',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor;
+ if Pos('FILESAVE',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor;
+ if Pos('CURRENT',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor;
+ if Pos('GROUPING',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor;
+ if Pos('HIGHLIGHTER',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor;
+ if Pos('FONT',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor;
+ if Pos('VIEWHL',UpperCase(N)) > 0 then
+ begin
+ C.Tag := C.Tag or tgNeedsEditor;
+ for Index := Low(TEditorFileType) to High(TEditorFileType) do
+ begin
+ //need exact match!
+ if ('MNUVIEWHL' + UpperCase(eftNames[Index]) = UpperCase(N)) then
+ begin
+ C.Tag := C.Tag or (Ord(Index) shl 8);
+ //debugln(Format('%-25s',[N]),' ->', IntToHex(C.Tag,8));
+ end;
+ end;
+ end;
+ //Things that need text on the clipboard
+ if Pos('PASTE',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsClipPaste;
+ //Things that need a selection in the editor
+ if Pos('COPY', UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsSelection;
+ if Pos('CUT', UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsSelection;
+ //Things that don't need an open editor
+ if Pos('FILENEW',UpperCase(N)) > 0 then C.Tag := C.Tag and (not tgNeedsEditor);
+ if Pos('FILEOPEN',UpperCase(N)) > 0 then C.Tag := C.Tag and (not tgNeedsEditor);
+ if Pos('APP',UpperCase(N)) > 0 then C.Tag := C.Tag and (not tgNeedsEditor);
+
+ //Exceptions and fixes aftre the applied rules above
+ //needs to be _after_ 'OPEN'
+ if Pos('BROWSER',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor;
+ end;
+ //Top level menus
+ mnuFile.Tag := 0;
+ mnuEdit.Tag := 0;
+ mnuInsert.Tag := 0;
+ mnuGrouping.Tag := 0;
+ mnuView.Tag := 0;
+ mnuAbout.Tag := 0;
+
+ {
+ if (C is TMenuItem) or (C is TAction) then
+ begin
+ NE := (C.Tag and tgNeedsEditor) > 0;
+ NS := (C.Tag and tgNeedsSelection) > 0;
+ debugln(C.Name,' -> NeedsEditor = ',DbgS(NE),' NeedsSelection = ',DbgS(NS));
+ end;
+ }
+ end;
+ //Doesn't work in OI on Win9x
+ acEditCopy.Caption := 'Kopiëren';
+end;
+
+procedure TEPlusForm.UpdateMenuItems;
+var
+ i: Integer;
+ C: TComponent;
+ HasEditor, HasSelection, HasClipPaste: Boolean;
+ NeedsEditor, NeedsSelection, NeedsClipPaste: Boolean;
+begin
+ HasEditor := Assigned(NoteBook.CurrentEditor);
+ HasSelection := HasEditor and (NoteBook.CurrentEditor.SelAvail);
+ HasClipPaste := (ClipBoard.AsText <> EmptyStr);
+ for i := 0 to ComponentCount - 1 do
+ begin
+ C := Components[i];
+ if (C is TMenuItem) then
+ begin
+ NeedsEditor := (C.Tag and tgNeedsEditor) > 0;
+ NeedsSelection := (C.Tag and tgNeedsSelection) > 0;
+ NeedsClipPaste := (C.Tag and tgNeedsClipPaste) > 0;
+ TMenuItem(C).Enabled := ((NeedsEditor and HasEditor) or (not NeedsEditor)) and
+ ((NeedsSelection and HasSelection) or (not NeedsSelection)) and
+ ((NeedsClipPaste and HasClipPaste) or (not NeedsClipPaste));
+ end;
+ end;
+end;
+
+
+
+
+{ ******************** [ NoteBook / Editor event handlers ] ************************ }
+
+
+procedure TEPlusForm.OnBeforeCloseEditor(Sender: TTabSheet; var Cancel: Boolean);
+var
+ Ed: TEditor;
+ Fn: String;
+ Res: TModalResult;
+begin
+ Cancel := False;
+ Ed := NoteBook.EditorAtPage(Sender);
+ if Assigned(Ed) then
+ begin
+ if (Ed.Modified) {or (Ed.FileName = EmptyStr)} then
+ begin
+ Fn := Ed.FileName;
+ if Fn = EmptyStr then Fn := Sender.Caption; //this will differentiate between Noname and Noname [2]
+ Res := MessageDlg(AppName, Format(msgModifiedSave,[Fn]), mtConfirmation, [mbYes,mbNo,mbCancel], 0);
+ case Res of
+ mrNo: Cancel := False;
+ mrCancel: Cancel := True;
+ mrOk: Cancel := (TryFileSave(Ed, Ed.FileName) <> IoSuccess);
+ end;
+ end;
+ end;
+end;
+
+
+procedure TEPlusForm.OnEditorStatusChange(Sender: TObject;
+ Changes: TSynStatusChanges);
+var
+ Line, Col: LongInt;
+begin
+ if (Sender = nil) or (not (Sender is TEditor)) then
+ begin
+ StatusBar.Panels[pXY].Text := '';
+ StatusBar.Panels[pMod].Text := '';
+ StatusBar.Panels[pIns].Text := '';
+ StatusBar.Panels[pName].Text := '';
+ Exit;
+ end;
+ with (Sender as TEditor) do
+ begin
+ if (scCaretX in Changes) or (scCaretY in Changes) then
+ begin
+ Col := CaretX;
+ Line := CaretY;
+ StatusBar.Panels[pXY].Text := Format('%s %-3d %s %-3d',[SLine,Line,SCol,Col]);
+ end;
+ if (scModified in Changes) then
+ begin
+ if Modified then StatusBar.Panels[pMod].Text := SModified
+ else StatusBar.Panels[pMod].Text := '';
+ end;
+ if (scInsertMode in Changes) then
+ begin
+ if InsertMode then StatusBar.Panels[pIns].Text := SIns
+ else StatusBar.Panels[pIns].Text := SOvr;
+ end;
+ if (scFileName in Changes) then
+ begin
+ StatusBar.Panels[pName].Text := FileName;
+ end;
+ end;
+end;
+
+procedure TEPlusForm.OnCharsetChange(Sender: TEditor; const OldCharset, NewCharset: String; const LineNr: Integer);
+begin
+ MessageDlg(Format('Let op: html charset is gewijzigd van %s naar %s'^m'(Regel %d)',[OldCharset, NewCharset, LineNr]),
+ mtInformation, [mbOk], 0);
+end;
+
+procedure TEPlusForm.OnMruListChange(Sender: TObject);
+var
+ i: Integer;
+ MnuItem: TMenuItem;
+ Fn: String;
+begin
+{ for i := 0 to MruList.Count - 1 do
+ begin
+ MnuItem := MruMenuItems[i];
+ Fn := ExtractFileName(MruList.Items[i]);
+ MnuItem.Caption := Format('&%d %s',[i+1,Fn]);
+ MnuItem.Hint := MruList.Items[i];
+ MnuItem.Enabled := True;
+ MnuItem.Visible := True;
+ end;
+ //Empty entries
+ for i := MruList.Count to MruEntries - 1 do
+ begin
+ MnuItem := MruMenuItems[i];
+ MnuItem.Caption := '';
+ MnuItem.Hint := '';
+ MnuItem.Enabled := False;
+ MnuItem.Visible := False;
+ end;
+ mnuSepAboveMru.Enabled := MruList.Count > 0;
+ mnuSepAboveMru.Visible := MruList.Count > 0;}
+end;
+
+
+
+{ ********************* [ CharMap event handlers ] ***************************** }
+
+procedure TEPlusForm.OnHtmlCharMapInsertText(AValue: String);
+var
+ Ed: TEditor;
+begin
+ //Debugln('TForm1.HtmlCharMapInsertText: AValue = ',AValue);
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) and (AValue <> '') then
+ begin
+ Ed.SelText := AValue;
+ end;
+end;
+
+
+
+
+
+{ ******************** [ General procedures/functions ] ************************ }
+
+
+procedure TEPlusForm.ShowError(const Msg: String);
+begin
+ MessageDlg(AppName, Msg, mtError, [mbOk], 0);
+end;
+
+function TEPlusForm.TryMarkSelection(const Pre, Post: String): Boolean;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ Ed.MarkSelection(Pre, Post);
+ Result := True;
+ end
+ else Result := False;
+end;
+
+
+
+
+{ *********************** [ File handling ] *************************** }
+
+
+
+
+
+function TEPlusForm.AskFileNameOpen: String;
+begin
+ OpenDialog.Filter := OpenSaveFilter;
+ OpenDialog.FilterIndex := 0;
+ if OpenDialog.Execute then
+ begin
+ Result := OpenDialog.FileName;
+ AppOptions.MainForm.InitialDir := ExtractFileDir(OpenDialog.FileName);
+ end
+ else Result := EmptyStr;
+end;
+
+function TEPlusForm.AskFileNameOpenTemplate: String;
+begin
+ OpenDialog.Filter := TemplateFilter;
+ OpenDialog.FilterIndex := 0;
+ if OpenDialog.Execute then
+ begin
+ Result := OpenDialog.FileName;
+ AppOptions.MainForm.InitialDir := ExtractFileDir(OpenDialog.FileName);
+ end
+ else Result := EmptyStr;
+end;
+
+function TEPlusForm.AskFileNameSave(const Fn: String; const FileType: TEditorFileType): String;
+begin
+ SaveDialog.Filter := OpenSaveFilter;
+ SaveDialog.FilterIndex := 0;
+ if (Fn <> EmptyStr) then
+ begin
+ SaveDialog.FileName := ExtractFileName(Fn);
+ SaveDialog.InitialDir := ExtractFileDir(Fn);
+ //f/SaveDialog.FilterIndex := GetFilterIndexFromFileName(SaveDialog.Filter, Fn);
+ //f/SaveDialog.DefaultExt := GetExtensionFromFilterAtIndex(SaveDialog.Filter, SaveDialog.FilterIndex);
+ end
+ else
+ begin
+ if (FileType <> eftNone) then SaveDialog.FilterIndex := Ord(FileType);
+ //f/SaveDialog.DefaultExt := GetExtensionFromFilterAtIndex(SaveDialog.Filter, SaveDialog.FilterIndex);
+ end;
+ //debugln('SaveDialog.FilterIndex = ',dbgs(SaveDialog.FilterIndex));
+ //debugln('SaveDialog.DefaultExt = ',SaveDialog.DefaultExt);
+ if SaveDialog.Execute then
+ begin
+ Result := SaveDialog.FileName;
+ AppOptions.MainForm.InitialDir := ExtractFileDir(SaveDialog.FileName);
+ end
+ else Result := EmptyStr;
+end;
+
+function TEPlusForm.AskFileNameSaveTemplate: String;
+begin
+ SaveDialog.Filter := TemplateFilter;
+ SaveDialog.FilterIndex := 0;
+ if SaveDialog.Execute then
+ begin
+ Result := SaveDialog.FileName;
+ AppOptions.MainForm.InitialDir := ExtractFileDir(SaveDialog.FileName);
+ end
+ else Result := EmptyStr;
+end;
+
+function TEPlusForm.TryFileOpen(const Fn: String; const AsTemplate: Boolean = False): Boolean;
+var
+ Ed: TEditor;
+begin
+ //Return False only on Errors
+ {if not IsASCIIFileUtf8(Fn) then
+ begin
+ if MessageDlg(AppName, Format(msgFileIsNotText,[Fn]),
+ mtConfirmation, [mbYes, mbNo], 0, mbNo) <> mrYes then
+ begin
+ Result := True; //not an Error
+ Exit;
+ end;
+ end;}
+ Ed := NoteBook.AddPage;
+ if Assigned(Ed) then
+ begin
+ try
+ Ed.LoadFromFileUtf8(Fn, AsTemplate);
+ //OnEditorStatusChange(Ed, scAll);
+ MruList.Add(Fn);
+ Result := True;
+ except
+ Result := False;
+ //OnEditorStatusChange(nil, scAll);
+ end;
+ end
+ else Result := False;
+end;
+
+function TEPlusForm.TryFileSave(Editor: TEditor; Fn: String): TIoResult;
+begin
+ if Assigned(Editor) then
+ begin
+ if (Fn = EmptyStr) then
+ begin
+ Fn := AskFileNameSave(EmptyStr, Editor.FileType);
+ if (Fn = EmptyStr) then Exit(IoCancel);
+ end;
+ try
+ Editor.SaveToFileUtf8(Fn);
+ //OnEditorStatusChange(Editor, scAll);
+ MruList.Add(Fn);
+ Result := IoSuccess;
+ except
+ Result := IoFail;
+ //OnEditorStatusChange(nil, scAll);
+ end;
+ end
+ else Result := IoFail;
+end;
+
+function TEPlusForm.CloseCurrentEditor: Boolean;
+var
+ Idx: Integer;
+begin
+ if (NoteBook.PageCount = 0) then Exit(True);
+
+ Idx := NoteBook.ActivePageIndex;
+ Result := NoteBook.ClosePage(Idx);
+end;
+
+function TEPlusForm.TryFileSaveAll(out Failures: String): Boolean;
+var
+ i: Integer;
+ Ed: TEditor;
+ Success: Boolean;
+begin
+ Result := True;
+ Failures := '';
+ for i := 0 to NoteBook.PageCount - 1 do
+ begin
+ Ed := NoteBook.EditorAtPage(i);
+ if Assigned(Ed) then
+ begin
+ if Ed.Modified or (Ed.FileName = EmptyStr) then
+ //TryFileSave will prompt for a filename if necessary
+ begin
+ Success := TryFileSave(Ed, Ed.FileName) = IoSuccess;
+ //Debugln('TryFileSaveAll: i = ',dbgs(i),' Caption = ',NoteBook.Pages[i].Caption,' Success = ',dbgs(success));
+ if not Success then Failures := Failures + NoteBook.Pages[i].Caption + LineEnding;
+ Result := Result and Success;
+ end;
+ end;
+ end;
+end;
+
+procedure TEPlusForm.DoFileOpen;
+var
+ Fn: String;
+begin
+ Fn := AskFileNameOpen;
+ if (Fn = EmptyStr) then Exit;
+ if FileExistsUtf8(Fn) then
+ begin
+ if not TryFileOpen(Fn, False) then ShowError(Format(msgOpenError,[Fn]));
+ end
+ else
+ ShowError(Format(msgFileNotFound,[Fn]));
+end;
+
+procedure TEPlusForm.DoMruOpen(const Index: Integer);
+var
+ Fn: String;
+begin
+ if (Index < 0) or (Index > MruList.Count - 1) then
+ begin
+ ShowError(Format(msgMruIndexOutOfBound,[Index]));
+ end;
+ Fn := MruList.Strings[Index];
+ if (Fn <> '') then
+ begin
+ if not TryFileOpen(Fn, False) then ShowError(Format(msgOpenError,[Fn]));
+ end
+end;
+
+procedure TEPlusForm.DoTemplateOpen;
+var
+ Fn: String;
+begin
+ Fn := AskFileNameOpenTemplate;
+ if (Fn = EmptyStr) then Exit;
+ if FileExistsUtf8(Fn) then
+ begin
+ if not TryFileOpen(Fn, True) then ShowError(Format(msgOpenError,[Fn]));
+ end
+ else
+ ShowError(Format(msgFileNotFound,[Fn]));
+end;
+
+procedure TEPlusForm.DoFileSave(Editor: TEditor);
+begin
+ if Assigned(Editor) then
+ begin
+ if (TryFileSave(Editor, Editor.FileName) = IoFail) then ShowError(Format(msgSaveError,[Editor.FileName]));
+ end;
+end;
+
+procedure TEPlusForm.DoFileSaveAs(Editor: TEditor);
+var
+ Fn: String;
+begin
+ if Assigned(Editor) then
+ begin
+ Fn := AskFileNameSave(Editor.FileName, Editor.FileType);
+ if (Fn <> EmptyStr) then
+ begin
+ if (TryFileSave(Editor, Fn) = IoFail) then ShowError(Format(msgSaveError,[Fn]));
+ end;
+ end;
+end;
+
+procedure TEPlusForm.DoFileSaveAsTemplate(Editor: TEditor);
+var
+ Fn: String;
+begin
+ if Assigned(Editor) then
+ begin
+ Fn := AskFileNameSaveTemplate;
+ if (Fn <> EmptyStr) then
+ begin
+ if (TryFileSave(Editor, Fn) = IoFail) then ShowError(Format(msgSaveError,[Fn]));
+ end;
+ end;
+end;
+
+procedure TEPlusForm.DoFileSaveAll;
+var
+ S: String;
+begin
+ if NoteBook.PageCount = 0 then Exit;
+ if not TryFileSaveAll(S) then
+ begin
+ S := Trim(S); //get rid of trailing LineEndings
+ ShowError(Format(msgSaveAllError,[S]));
+ end;
+end;
+
+procedure TEPlusForm.DoFileNewByType(const AFileType: TEditorFileType; const InitialText: String = '');
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.AddPage;
+ if Assigned(Ed) then
+ begin
+ Ed.FileType := AFileType;
+ if (InitialText <> EmptyStr) then
+ Ed.TextBetweenPoints[Point(0,0),Point(0,0)] := InitialText
+ else
+ Ed.Modified := False;
+ end;
+end;
+
+procedure TEPlusForm.DoFileNewHtml;
+begin
+ if NewHtmlDlg.Execute then DoFileNewByType(eftHtml, NewHtmlDlg.Text);
+end;
+
+
+procedure TEPlusForm.FileOpenInBrowser;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ if (Ed.FileName = EmptyStr) then
+ begin
+ ShowError(msgFileHasNoName);
+ Exit;
+ end;
+ if not (Ed.FileType in [eftHtml, eftXml]) then
+ begin
+ if (MessageDlg(AppName, msgFileTypeNotForBrowser, mtConfirmation, [mbYes,mbNo], 0, mbNo) <> mrYes) then
+ Exit;
+ end;
+ if not OpenUrl(Ed.FileName) then ShowError(Format(msgErrorBrowser, [Ed.FileName]));
+ end;
+end;
+
+
+
+{ ********************* [ Edit ] ********************************* }
+
+
+procedure TEPlusForm.EditUndo;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ if Ed.CanUndo then Ed.Undo;
+ end;
+end;
+
+procedure TEPlusForm.EditRedo;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ if Ed.CanRedo then Ed.Redo;
+ end;
+end;
+
+procedure TEPlusForm.EditCopy;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ if not Ed.SelAvail then Ed.SelectWord;
+ Ed.CopyToClipboard;
+ end;
+end;
+
+procedure TEPlusForm.EditPaste;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ Ed.PasteFromClipboard;
+ end;
+end;
+
+
+procedure TEPlusForm.EditCut;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ if Ed.SelAvail then Ed.CutToClipboard;
+ end;
+end;
+
+procedure TEPlusForm.EditSelectAll;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ Ed.SelectAll;
+ end;
+end;
+
+procedure TEPlusForm.EditFind;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ FindDialog.Execute;
+ end;
+end;
+
+procedure TEPlusForm.EditFindNext;
+var
+ sOpt: TSynSearchOptions;
+ Ed: TEditor;
+begin
+ if (FindText = EmptyStr) then Exit;
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ sOpt := FindOptions;
+ sOpt := sOpt - [ssoBackWards];
+ if Ed.SearchReplace(FindText,'',sOpt) = 0 then
+ ShowError(Format(msgTextNotFound,[FindText]));
+ end;
+end;
+
+procedure TEPlusForm.EditFindPrevious;
+var
+ sOpt: TSynSearchOptions;
+ Ed: TEditor;
+begin
+ if (FindText = EmptyStr) then Exit;
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ sOpt := FindOptions;
+ sOpt := sOpt + [ssoBackWards];
+ if Ed.SearchReplace(FindText,'',sOpt) = 0 then
+ ShowError(Format(msgTextNotFound,[FindText]));
+ end;
+end;
+
+procedure TEPlusForm.EditReplace;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ ReplaceDialog.Execute;
+ end;
+end;
+
+procedure TEPlusForm.EditPasteTableContentTab;
+var
+ Ed: TEditor;
+ TabbedText: String;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ TabbedText := ClipBoard.AsText;
+ if (TabbedText <> EmptyStr) then Ed.SelText := TabbedTextToHtmlTableContent(TabbedText);
+ end;
+end;
+
+
+
+
+
+
+procedure TEPlusForm.DoFind(Sender: TObject);
+var
+ Ed: TEditor;
+ Dlg: TFindDialog;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ Dlg := (Sender as TFindDialog);
+ ReplaceOptions := [];
+ if not (frDown in Dlg.Options) then ReplaceOptions := ReplaceOptions + [ssoBackWards];
+ //if frFindNext in Options then sOptions := sOptions + [];
+ if frMatchCase in Dlg.Options then ReplaceOptions := ReplaceOptions + [ssoMatchCase];
+ //if frReplace in Options then sOptions := sOptions + [];
+ //if frReplaceAll in Options then sOptions := sOptions + [];
+ if frWholeWord in Dlg.Options then ReplaceOptions := ReplaceOptions + [ssoWholeWord];
+
+ FindText := Dlg.FindText;
+
+ if Ed.SearchReplace(FindText,'',FindOptions) = 0 then
+ ShowError(Format(msgTextNotFound,[FindText]));
+
+ end;
+end;
+
+procedure TEPlusForm.DoReplace(Sender: TObject);
+var
+ Ed: TEditor;
+ Dlg: TReplaceDialog;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ Dlg := (Sender as TReplaceDialog);
+ FindOptions := [];
+ if not (frDown in Dlg.Options) then FindOptions := FindOptions + [ssoBackWards];
+ if frMatchCase in Dlg.Options then FindOptions := FindOptions + [ssoMatchCase];
+ if frWholeWord in Dlg.Options then FindOptions := FindOptions + [ssoWholeWord];
+ if frReplace in Dlg.Options then ReplaceOptions := ReplaceOptions + [ssoReplace];
+ if frReplaceAll in Dlg.Options then ReplaceOptions := ReplaceOptions + [ssoReplaceAll];
+ if frFindNext in Dlg.Options then ReplaceOptions := ReplaceOptions - [ssoReplace,ssoReplaceAll];
+ if Ed.SelAvail then ReplaceOptions := ReplaceOptions + [ssoSelectedOnly];
+
+ FindText := Dlg.FindText;
+ ReplaceText := Dlg.ReplaceText;
+
+ if Ed.SearchReplace(FindText,ReplaceText,ReplaceOptions) = 0 then
+ ShowError(Format(msgTextNotFound,[FindText]))
+ else
+ if (ssoReplace in ReplaceOptions) and not (ssoReplaceAll in ReplaceOptions) then
+ begin
+ ReplaceOptions := ReplaceOptions - [ssoReplace];
+ Ed.SearchReplace(FindText,'',ReplaceOptions); //Search and select next occurence
+ end;
+ end;
+end;
+
+
+{ **************************** [ Insert ] ************************** }
+
+
+
+procedure TEPlusForm.InsertAnchor;
+var
+ Ed: TEditor;
+ SStart, SLen: Integer;
+ OldSelMode: TSynSelectionMode;
+ OldDescr, NewDescr: String;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ OldDescr := Ed.SelText;
+ AnchorDlg.Description := OldDescr;
+ if AnchorDlg.Execute then
+ begin
+ NewDescr := AnchorDlg.Description;
+ if (OldDescr <> NewDescr) then
+ begin
+ OldSelMode := Ed.SelectionMode;
+ Ed.SelectionMode := smNormal;
+ //save SelStart
+ SStart := Ed.SelStart;
+ Ed.SelText := NewDescr;
+ SLen := Utf8Length(NewDescr);
+ //Select inserted text
+ Ed.SelStart := SStart;
+ Ed.SelEnd := SStart + SLen;
+ Ed.SelectionMode := OldSelMode;
+ end;
+ //Add html tags
+ Ed.MarkSelection(AnchorDlg.LinkRef, anchor_end)
+
+ end;
+ end;
+end;
+
+procedure TEPlusForm.InsertPicture;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ if PictureDlg.Execute then
+ begin
+ Ed.BlockEnd := Ed.BlockBegin;
+ Ed.SelText := Img(PictureDlg.FileName, PictureDlg.DomId, PictureDlg.DomClass, PictureDlg.FloatStyle,
+ PictureDlg.PicWidth, PictureDlg.PicHeight, PictureDlg.Alt, PictureDlg.Title);
+ end;
+
+ end;
+
+end;
+
+
+procedure TEPlusForm.InsertTable;
+var
+ Ed: TEditor;
+ TableText: String;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ if TableDlg.Execute then
+ begin
+ TableText := CreateTable(TableDlg.DomId, TableDlg.DomClass, TableDlg.Summary,
+ TableDlg.ColCount, TableDlg.RowCount);
+ Ed.SelEnd := Ed.SelStart;
+ Ed.Seltext := TableText;
+ end;
+ end;
+end;
+
+
+procedure TEPlusForm.InsertSpecialChars;
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ HtmlCharMapDlg.Execute;
+ end;
+end;
+
+
+procedure TEPlusForm.InsertSpecial(const AValue: String);
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ Ed.SelText := AValue;
+ end;
+end;
+
+{ *************************** [ Layout ] **************************** }
+
+
+
+procedure TEPlusForm.LayoutHeading(const Level: Integer);
+begin
+ if not (Level in [1..6]) then Exit;
+ TryMarkSelection(Format('',[Level]),Format(' ',[Level]));
+end;
+
+
+{ ************************** [ View ] ********************************* }
+
+procedure TEPlusForm.SetHighlighter(const AFileType: TEditorFileType);
+var
+ Ed: TEditor;
+begin
+ Ed := NoteBook.CurrentEditor;
+ if Assigned(Ed) then
+ begin
+ //debugln('Setting Highlighter to ',eftNames[AFileType]);
+ Ed.SetHighlighterByFileType(AFileType, True);
+ end;
+end;
+
+procedure TEPlusForm.EditorSelectFont;
+var
+ EO: TEditorOptions;
+begin
+ if Assigned(NoteBook.CurrentEditor) then
+ begin
+ EO := NoteBook.EditorOptions;
+ FontDialog.Font.Name := EO.FontName;
+ FontDialog.Font.Size := EO.FontSize;
+ if FontDialog.Execute then
+ begin
+ EO.FontName := FontDialog.Font.Name;
+ EO.FontSize := FontDialog.Font.Size;
+ NoteBook.EditorOptions := EO;
+ end;
+ end;
+end;
+
+procedure TEPlusForm.EditorFontSizeUp;
+var
+ EO: TEditorOptions;
+begin
+ if Assigned(NoteBook.CurrentEditor) then
+ begin
+ EO := NoteBook.EditorOptions;
+ EO.FontSize := EO.FontSize + 2;
+ NoteBook.EditorOptions := EO;
+ end;
+end;
+
+procedure TEPlusForm.EditorFontSizeDown;
+var
+ EO: TEditorOptions;
+begin
+ if Assigned(NoteBook.CurrentEditor) then
+ begin
+ EO := NoteBook.EditorOptions;
+ EO.FontSize := EO.FontSize - 2;
+ if EO.FontSize < 0 then EO.FontSize := 2;
+ NoteBook.EditorOptions := EO;
+ end;
+end;
+
+
+{ ************************** [ About ] *********************** }
+
+procedure TEPlusForm.AboutEPlus;
+{var
+ Dlg: TExtAboutDlg;}
+begin
+{ Dlg := TExtAboutDlg.Create;
+ try
+ Dlg.Caption := AboutTitle;
+ Dlg.ProductName := AppName;
+ Dlg.Version := AppVersion;
+ Dlg.CopyrightStatement := CopyLeftStatement;
+ Dlg.WebsiteCaption := AuthorWebName;
+ Dlg.WebsiteURL := AuthorWebUrl;
+ Dlg.LicenseText := LicenseText;
+ Dlg.LicenseWebsiteCaption := LicenseName;
+ Dlg.LicenseWebsiteURL := LicenseUrl;
+ Dlg.Top := Top + 20;
+ Dlg.Left := Left + 20;
+ Dlg.Execute;
+ finally
+ Dlg.Free;
+ end;}
+end;
+
+
+end.
+
diff --git a/applications/lazedit/newhtmldlgform.lfm b/applications/lazedit/newhtmldlgform.lfm
new file mode 100644
index 000000000..b97264ba6
--- /dev/null
+++ b/applications/lazedit/newhtmldlgform.lfm
@@ -0,0 +1,752 @@
+object NewHtmlDlgForm: TNewHtmlDlgForm
+ Left = 745
+ Height = 618
+ Top = 108
+ Width = 424
+ ActiveControl = TitleEdit
+ BorderStyle = bsDialog
+ Caption = 'Nieuwe Html pagina'
+ ClientHeight = 618
+ ClientWidth = 424
+ OnCreate = FormCreate
+ OnShow = FormShow
+ LCLVersion = '0.9.31'
+ object Label1: TLabel
+ Left = 19
+ Height = 14
+ Top = 8
+ Width = 21
+ Caption = 'Titel'
+ ParentColor = False
+ end
+ object TitleEdit: TEdit
+ Left = 19
+ Height = 21
+ Top = 21
+ Width = 385
+ TabOrder = 0
+ end
+ object InlineStyleBox: TGroupBox
+ Left = 19
+ Height = 272
+ Top = 256
+ Width = 385
+ Caption = 'Opmaak via inline stijl'
+ ClientHeight = 254
+ ClientWidth = 381
+ TabOrder = 3
+ object BackColorEdit: TEdit
+ Left = 11
+ Height = 21
+ Top = 16
+ Width = 288
+ TabOrder = 0
+ end
+ object TextColorEdit: TEdit
+ Left = 11
+ Height = 21
+ Top = 56
+ Width = 288
+ TabOrder = 1
+ end
+ object Label2: TLabel
+ Left = 11
+ Height = 14
+ Top = 0
+ Width = 82
+ Caption = 'Achtergrondkleur'
+ ParentColor = False
+ end
+ object Label3: TLabel
+ Left = 11
+ Height = 14
+ Top = 40
+ Width = 51
+ Caption = 'Tekstkleur'
+ ParentColor = False
+ end
+ object Label4: TLabel
+ Left = 11
+ Height = 14
+ Top = 80
+ Width = 47
+ Caption = 'Link kleur'
+ ParentColor = False
+ end
+ object LinkColorEdit: TEdit
+ Left = 13
+ Height = 21
+ Top = 96
+ Width = 286
+ TabOrder = 2
+ end
+ object Label5: TLabel
+ Left = 13
+ Height = 14
+ Top = 120
+ Width = 88
+ Caption = 'Bezochte linkkleur'
+ ParentColor = False
+ end
+ object VisitedLinkColorEdit: TEdit
+ Left = 13
+ Height = 21
+ Top = 136
+ Width = 286
+ TabOrder = 3
+ end
+ object Label6: TLabel
+ Left = 13
+ Height = 14
+ Top = 160
+ Width = 84
+ Caption = 'Achterrondplaatje'
+ ParentColor = False
+ end
+ object BackImageEdit: TEdit
+ Left = 13
+ Height = 21
+ Top = 176
+ Width = 286
+ TabOrder = 4
+ end
+ object BackColorBtn: TSpeedButton
+ Left = 322
+ Height = 22
+ Top = 16
+ Width = 23
+ Glyph.Data = {
+ 36090000424D3609000000000000360000002800000018000000180000000100
+ 2000000000000009000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFFFFFFF00927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF927777FFBFBDBDFFFFFFFF00927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FFBFBDBDFFFFFFFF00927777FFDD96
+ 6AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD96
+ 6AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFA4A4FFFFDD966AFFA4A4
+ FFFFDD966AFFA4A4FFFFDD966AFF927777FFBFBDBDFFFFFFFF00927777FFE8B6
+ 97FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B6
+ 97FFE8B697FFE8B697FFE8B697FFE8B697FFA4A4FFFF400080FFA4A4FFFF4000
+ 80FFA4A4FFFF400080FFA4A4FFFF927777FFBFBDBDFFFFFFFF00927777FFF4DD
+ CEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DD
+ CEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFA4A4FFFFF4DDCEFFA4A4
+ FFFFF4DDCEFFA4A4FFFFF4DDCEFF927777FFFFFFFF00FFFFFF00BFBDBDFF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FFBFBDBDFFFFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ NumGlyphs = 0
+ OnClick = ColorBtnClick
+ end
+ object TextColorBtn: TSpeedButton
+ Left = 322
+ Height = 22
+ Top = 56
+ Width = 23
+ Glyph.Data = {
+ 36090000424D3609000000000000360000002800000018000000180000000100
+ 2000000000000009000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFFFFFFF00927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF927777FFBFBDBDFFFFFFFF00927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FFBFBDBDFFFFFFFF00927777FFDD96
+ 6AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD96
+ 6AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFA4A4FFFFDD966AFFA4A4
+ FFFFDD966AFFA4A4FFFFDD966AFF927777FFBFBDBDFFFFFFFF00927777FFE8B6
+ 97FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B6
+ 97FFE8B697FFE8B697FFE8B697FFE8B697FFA4A4FFFF400080FFA4A4FFFF4000
+ 80FFA4A4FFFF400080FFA4A4FFFF927777FFBFBDBDFFFFFFFF00927777FFF4DD
+ CEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DD
+ CEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFA4A4FFFFF4DDCEFFA4A4
+ FFFFF4DDCEFFA4A4FFFFF4DDCEFF927777FFFFFFFF00FFFFFF00BFBDBDFF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FFBFBDBDFFFFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ NumGlyphs = 0
+ OnClick = ColorBtnClick
+ end
+ object LinkColorBtn: TSpeedButton
+ Left = 322
+ Height = 22
+ Top = 96
+ Width = 23
+ Glyph.Data = {
+ 36090000424D3609000000000000360000002800000018000000180000000100
+ 2000000000000009000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFFFFFFF00927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF927777FFBFBDBDFFFFFFFF00927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FFBFBDBDFFFFFFFF00927777FFDD96
+ 6AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD96
+ 6AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFA4A4FFFFDD966AFFA4A4
+ FFFFDD966AFFA4A4FFFFDD966AFF927777FFBFBDBDFFFFFFFF00927777FFE8B6
+ 97FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B6
+ 97FFE8B697FFE8B697FFE8B697FFE8B697FFA4A4FFFF400080FFA4A4FFFF4000
+ 80FFA4A4FFFF400080FFA4A4FFFF927777FFBFBDBDFFFFFFFF00927777FFF4DD
+ CEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DD
+ CEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFA4A4FFFFF4DDCEFFA4A4
+ FFFFF4DDCEFFA4A4FFFFF4DDCEFF927777FFFFFFFF00FFFFFF00BFBDBDFF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FFBFBDBDFFFFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ NumGlyphs = 0
+ OnClick = ColorBtnClick
+ end
+ object VisitedColorBtn: TSpeedButton
+ Left = 322
+ Height = 22
+ Top = 136
+ Width = 23
+ Glyph.Data = {
+ 36090000424D3609000000000000360000002800000018000000180000000100
+ 2000000000000009000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFFFFFFF00927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBDBDFFBFBD
+ BDFFBFBDBDFFBFBDBDFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF4040FFFF4040FFFF4040FFFFDBDFDFFF36B1
+ 77FF36B177FF36B177FFDBDFDFFFFF80FFFFFF80FFFFFF80FFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFF73AAFFFF73AAFFFF73AAFFFFDBDFDFFFFF4A
+ 4AFFFF4A4AFFFF4A4AFFDBDFDFFF00FFFFFF00FFFFFF00FFFFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF
+ DFFFDBDFDFFFDBDFDFFFBFBDBDFF927777FFBFBDBDFFFFFFFF00927777FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF927777FFBFBDBDFFFFFFFF00927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FFBFBDBDFFFFFFFF00927777FFDD96
+ 6AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFDD96
+ 6AFFDD966AFFDD966AFFDD966AFFDD966AFFDD966AFFA4A4FFFFDD966AFFA4A4
+ FFFFDD966AFFA4A4FFFFDD966AFF927777FFBFBDBDFFFFFFFF00927777FFE8B6
+ 97FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B697FFE8B6
+ 97FFE8B697FFE8B697FFE8B697FFE8B697FFA4A4FFFF400080FFA4A4FFFF4000
+ 80FFA4A4FFFF400080FFA4A4FFFF927777FFBFBDBDFFFFFFFF00927777FFF4DD
+ CEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DD
+ CEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFF4DDCEFFA4A4FFFFF4DDCEFFA4A4
+ FFFFF4DDCEFFA4A4FFFFF4DDCEFF927777FFFFFFFF00FFFFFF00BFBDBDFF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FF927777FF927777FF927777FF927777FF9277
+ 77FF927777FF927777FF927777FFBFBDBDFFFFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ NumGlyphs = 0
+ OnClick = ColorBtnClick
+ end
+ object BackImgBtn: TSpeedButton
+ Left = 322
+ Height = 22
+ Top = 176
+ Width = 23
+ Glyph.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00005E8E8D005D
+ 8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D
+ 8CBD005D8CBD005D8CBD005D8CBD005E8E8D005B8900005B890000679AB06AB7
+ DAFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CC
+ EDFF82CCEDFF82CCEDFF83CDEEFF318DB9C9005E8E40005F8F000070A9A256AA
+ CEFF80CBEAFF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9
+ E9FF7EC9E9FF7EC9E9FF7EC9E9FF57AFD6D90066996E006699000074AD9D44A1
+ CBFF8AD3EFFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CD
+ EBFF83CDEBFF83CDEBFF83CDEBFF81CDEBF2006FA8930071AB010076B29952B0
+ D7FF85D2EDFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2
+ EEFF89D2EEFF89D2EEFF89D2EEFF90D8F1FF228EC1AA0077B31D0079B69574CA
+ E8FF75CAE8FF90D8F2FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7
+ F1FF8FD7F1FF8FD7F1FF8FD7F1FF91D8F2FF4FB1DAC2007FBD46007CBA928FDD
+ F4FF63C0E5FFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EE
+ FAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFF86D8EFDE0083C571007FBD8EA6EC
+ FCFF64C2E9FF4FB5E2FF4DB4E2FF4CB3E1FF4BB2E0FF49B1DFFF48B0DFFF47AE
+ DEFF45ADDDFF44ACDDFF46AEDFFF0084C6C70087CB810087CB610081C18BABF0
+ FEFFA4E9FCFFA2E7FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DCF4FF91D9
+ F3FF8ED7F1FF8BD4F0FF90D8F3FF0081C18B0087CA000087CB000083C488ADF1
+ FFFFA6EBFDFFA4E9FCFFA2E7FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DC
+ F4FF91D9F3FF8ED7F1FF93DAF4FF0083C4880083C4000085C8000085C785B0F4
+ FFFFADF1FFFFABF0FEFFA9EEFDFFA7ECFCFFA5EAFBFFA2E8FAFFA0E6F9FF9DE3
+ F8FF9AE1F7FF98DFF6FF99E0F7FF0085C7850085C7000085C7000087CA620087
+ CA830087CA830087CA830087CA830087CA830087CA83FEFEFDFFF5F5EEFFEBEB
+ DDFFFEC941FFF4B62EFF0087CA830087CA620086C9000086C9000087CA000087
+ CA000087CA000087CA000087CA000087CA000088CC2E0088CC810088CC810088
+ CC810088CC810088CC810088CC2E0087CA000086C9000086C900FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ NumGlyphs = 0
+ OnClick = ImgBtnClick
+ end
+ object Label11: TLabel
+ Left = 13
+ Height = 14
+ Top = 200
+ Width = 155
+ Caption = 'Relatieve pad naar afbeeldingen'
+ ParentColor = False
+ end
+ object PictureFolderEdit: TEdit
+ Left = 13
+ Height = 21
+ Top = 216
+ Width = 286
+ TabOrder = 5
+ end
+ end
+ object ExternalStyleBox: TGroupBox
+ Left = 19
+ Height = 105
+ Top = 144
+ Width = 385
+ Caption = 'Opmaak via extern stijlblad'
+ ClientHeight = 87
+ ClientWidth = 381
+ TabOrder = 2
+ object Label7: TLabel
+ Left = 13
+ Height = 14
+ Top = 0
+ Width = 87
+ Caption = 'Standaard stijlblad'
+ ParentColor = False
+ end
+ object Label8: TLabel
+ Left = 13
+ Height = 14
+ Top = 40
+ Width = 112
+ Caption = 'Stijlblad voor afdrukken'
+ ParentColor = False
+ end
+ object DefaultStylesheetEdit: TEdit
+ Left = 11
+ Height = 21
+ Top = 16
+ Width = 288
+ TabOrder = 0
+ end
+ object PrintStyleSheetEdit: TEdit
+ Left = 11
+ Height = 21
+ Top = 56
+ Width = 288
+ TabOrder = 1
+ end
+ object DefSheetBtn: TSpeedButton
+ Left = 322
+ Height = 22
+ Top = 16
+ Width = 23
+ Glyph.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00005E8E8D005D
+ 8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D
+ 8CBD005D8CBD005D8CBD005D8CBD005E8E8D005B8900005B890000679AB06AB7
+ DAFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CC
+ EDFF82CCEDFF82CCEDFF83CDEEFF318DB9C9005E8E40005F8F000070A9A256AA
+ CEFF80CBEAFF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9
+ E9FF7EC9E9FF7EC9E9FF7EC9E9FF57AFD6D90066996E006699000074AD9D44A1
+ CBFF8AD3EFFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CD
+ EBFF83CDEBFF83CDEBFF83CDEBFF81CDEBF2006FA8930071AB010076B29952B0
+ D7FF85D2EDFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2
+ EEFF89D2EEFF89D2EEFF89D2EEFF90D8F1FF228EC1AA0077B31D0079B69574CA
+ E8FF75CAE8FF90D8F2FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7
+ F1FF8FD7F1FF8FD7F1FF8FD7F1FF91D8F2FF4FB1DAC2007FBD46007CBA928FDD
+ F4FF63C0E5FFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EE
+ FAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFF86D8EFDE0083C571007FBD8EA6EC
+ FCFF64C2E9FF4FB5E2FF4DB4E2FF4CB3E1FF4BB2E0FF49B1DFFF48B0DFFF47AE
+ DEFF45ADDDFF44ACDDFF46AEDFFF0084C6C70087CB810087CB610081C18BABF0
+ FEFFA4E9FCFFA2E7FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DCF4FF91D9
+ F3FF8ED7F1FF8BD4F0FF90D8F3FF0081C18B0087CA000087CB000083C488ADF1
+ FFFFA6EBFDFFA4E9FCFFA2E7FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DC
+ F4FF91D9F3FF8ED7F1FF93DAF4FF0083C4880083C4000085C8000085C785B0F4
+ FFFFADF1FFFFABF0FEFFA9EEFDFFA7ECFCFFA5EAFBFFA2E8FAFFA0E6F9FF9DE3
+ F8FF9AE1F7FF98DFF6FF99E0F7FF0085C7850085C7000085C7000087CA620087
+ CA830087CA830087CA830087CA830087CA830087CA83FEFEFDFFF5F5EEFFEBEB
+ DDFFFEC941FFF4B62EFF0087CA830087CA620086C9000086C9000087CA000087
+ CA000087CA000087CA000087CA000087CA000088CC2E0088CC810088CC810088
+ CC810088CC810088CC810088CC2E0087CA000086C9000086C900FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ NumGlyphs = 0
+ OnClick = StyleBtnClick
+ end
+ object PrintSheetBtn: TSpeedButton
+ Left = 322
+ Height = 22
+ Top = 56
+ Width = 23
+ Glyph.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00005E8E8D005D
+ 8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D
+ 8CBD005D8CBD005D8CBD005D8CBD005E8E8D005B8900005B890000679AB06AB7
+ DAFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CC
+ EDFF82CCEDFF82CCEDFF83CDEEFF318DB9C9005E8E40005F8F000070A9A256AA
+ CEFF80CBEAFF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9
+ E9FF7EC9E9FF7EC9E9FF7EC9E9FF57AFD6D90066996E006699000074AD9D44A1
+ CBFF8AD3EFFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CD
+ EBFF83CDEBFF83CDEBFF83CDEBFF81CDEBF2006FA8930071AB010076B29952B0
+ D7FF85D2EDFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2
+ EEFF89D2EEFF89D2EEFF89D2EEFF90D8F1FF228EC1AA0077B31D0079B69574CA
+ E8FF75CAE8FF90D8F2FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7
+ F1FF8FD7F1FF8FD7F1FF8FD7F1FF91D8F2FF4FB1DAC2007FBD46007CBA928FDD
+ F4FF63C0E5FFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EE
+ FAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFF86D8EFDE0083C571007FBD8EA6EC
+ FCFF64C2E9FF4FB5E2FF4DB4E2FF4CB3E1FF4BB2E0FF49B1DFFF48B0DFFF47AE
+ DEFF45ADDDFF44ACDDFF46AEDFFF0084C6C70087CB810087CB610081C18BABF0
+ FEFFA4E9FCFFA2E7FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DCF4FF91D9
+ F3FF8ED7F1FF8BD4F0FF90D8F3FF0081C18B0087CA000087CB000083C488ADF1
+ FFFFA6EBFDFFA4E9FCFFA2E7FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DC
+ F4FF91D9F3FF8ED7F1FF93DAF4FF0083C4880083C4000085C8000085C785B0F4
+ FFFFADF1FFFFABF0FEFFA9EEFDFFA7ECFCFFA5EAFBFFA2E8FAFFA0E6F9FF9DE3
+ F8FF9AE1F7FF98DFF6FF99E0F7FF0085C7850085C7000085C7000087CA620087
+ CA830087CA830087CA830087CA830087CA830087CA83FEFEFDFFF5F5EEFFEBEB
+ DDFFFEC941FFF4B62EFF0087CA830087CA620086C9000086C9000087CA000087
+ CA000087CA000087CA000087CA000087CA000088CC2E0088CC810088CC810088
+ CC810088CC810088CC810088CC2E0087CA000086C9000086C900FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ NumGlyphs = 0
+ OnClick = StyleBtnClick
+ end
+ end
+ object StyleChoiceGroup: TRadioGroup
+ Left = 19
+ Height = 41
+ Top = 96
+ Width = 385
+ AutoFill = True
+ Caption = 'Kies opmaak methode'
+ ChildSizing.LeftRightSpacing = 6
+ ChildSizing.TopBottomSpacing = 6
+ ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+ ChildSizing.EnlargeVertical = crsHomogenousChildResize
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.ControlsPerLine = 2
+ ClientHeight = 23
+ ClientWidth = 381
+ Columns = 2
+ ItemIndex = 0
+ Items.Strings = (
+ 'Opmaak via extern stijlblad'
+ 'Opmaak via inline stijl'
+ )
+ OnClick = StyleChoiceGroupClick
+ TabOrder = 1
+ end
+ object DocTypeComboBox: TComboBox
+ Left = 23
+ Height = 21
+ Top = 544
+ Width = 377
+ ItemHeight = 13
+ TabOrder = 4
+ Text = 'DocTypeComboBox'
+ end
+ object Label9: TLabel
+ Left = 23
+ Height = 14
+ Top = 528
+ Width = 45
+ Caption = 'Html type'
+ ParentColor = False
+ end
+ object BitBtn1: TBitBtn
+ Left = 325
+ Height = 30
+ Top = 576
+ Width = 75
+ Default = True
+ DefaultCaption = True
+ Kind = bkOK
+ ModalResult = 1
+ TabOrder = 6
+ end
+ object BitBtn2: TBitBtn
+ Left = 245
+ Height = 30
+ Top = 576
+ Width = 75
+ Cancel = True
+ DefaultCaption = True
+ Kind = bkCancel
+ ModalResult = 2
+ TabOrder = 5
+ end
+ object Label10: TLabel
+ Left = 19
+ Height = 14
+ Top = 48
+ Width = 32
+ Caption = 'Auteur'
+ ParentColor = False
+ end
+ object AuthorEdit: TEdit
+ Left = 19
+ Height = 21
+ Top = 64
+ Width = 385
+ TabOrder = 7
+ end
+ object ColorDialog: TColorDialog
+ Color = clBlack
+ CustomColors.Strings = (
+ 'ColorA=000000'
+ 'ColorB=000080'
+ 'ColorC=008000'
+ 'ColorD=008080'
+ 'ColorE=800000'
+ 'ColorF=800080'
+ 'ColorG=808000'
+ 'ColorH=808080'
+ 'ColorI=C0C0C0'
+ 'ColorJ=0000FF'
+ 'ColorK=00FF00'
+ 'ColorL=00FFFF'
+ 'ColorM=FF0000'
+ 'ColorN=FF00FF'
+ 'ColorO=FFFF00'
+ 'ColorP=FFFFFF'
+ 'ColorQ=C0DCC0'
+ 'ColorR=F0CAA6'
+ 'ColorS=F0FBFF'
+ 'ColorT=A4A0A0'
+ )
+ left = 24
+ top = 568
+ end
+ object OpenDialog: TOpenDialog
+ left = 71
+ top = 568
+ end
+ object OpenPictureDialog: TOpenPictureDialog
+ left = 111
+ top = 568
+ end
+end
diff --git a/applications/lazedit/newhtmldlgform.pp b/applications/lazedit/newhtmldlgform.pp
new file mode 100644
index 000000000..c6514a14f
--- /dev/null
+++ b/applications/lazedit/newhtmldlgform.pp
@@ -0,0 +1,292 @@
+unit NewHtmlDlgForm;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+ ExtCtrls, Buttons, ExtDlgs, HtmlCode;
+
+type
+
+ { TNewHtmlDlgForm }
+
+ TNewHtmlDlgForm = class(TForm)
+ BackColorEdit: TEdit;
+ BackImageEdit: TEdit;
+ BitBtn1: TBitBtn;
+ BitBtn2: TBitBtn;
+ ColorDialog: TColorDialog;
+ AuthorEdit: TEdit;
+ DocTypeComboBox: TComboBox;
+ DefaultStylesheetEdit: TEdit;
+ PictureFolderEdit: TEdit;
+ Label10: TLabel;
+ Label11: TLabel;
+ Label9: TLabel;
+ OpenDialog: TOpenDialog;
+ OpenPictureDialog: TOpenPictureDialog;
+ PrintStyleSheetEdit: TEdit;
+ ExternalStyleBox: TGroupBox;
+ Label6: TLabel;
+ Label7: TLabel;
+ Label8: TLabel;
+ DefSheetBtn: TSpeedButton;
+ PrintSheetBtn: TSpeedButton;
+ BackColorBtn: TSpeedButton;
+ LinkColorBtn: TSpeedButton;
+ BackImgBtn: TSpeedButton;
+ VisitedColorBtn: TSpeedButton;
+ TextColorBtn: TSpeedButton;
+ StyleChoiceGroup: TRadioGroup;
+ VisitedLinkColorEdit: TEdit;
+ Label5: TLabel;
+ LinkColorEdit: TEdit;
+ Label4: TLabel;
+ TextColorEdit: TEdit;
+ InlineStyleBox: TGroupBox;
+ Label1: TLabel;
+ Label2: TLabel;
+ Label3: TLabel;
+ TitleEdit: TEdit;
+ procedure FormShow(Sender: TObject);
+ procedure StyleBtnClick(Sender: TObject);
+ procedure ColorBtnClick(Sender: TObject);
+ procedure ImgBtnClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure StyleChoiceGroupClick(Sender: TObject);
+ private
+ FInitialDir: String;
+ function GetAuthor: string;
+ function GetbackgroundColor: string;
+ function GetBackgroundImage: string;
+ function GetDefaultStyleSheet: string;
+ function GetHtmlDocType: THtmlDocType;
+ function GetLinkColor: string;
+ function GetPictureFolder: string;
+ function GetPrintStyleSheet: string;
+ function GetTextColor: string;
+ function GetTitle: string;
+ function GetUseStyleSheet: Boolean;
+ function GetVisitedColor: string;
+ procedure SetInitialDir(AValue: String);
+ { private declarations }
+ public
+ { public declarations }
+ property DocType: THtmlDocType read GetHtmlDocType;
+ property UseStyleSheet: Boolean read GetUseStyleSheet;
+ property DefaultStyleSheet: string read GetDefaultStyleSheet;
+ property PrintStyleSheet: string read GetPrintStyleSheet;
+ property TextColor: string read GetTextColor;
+ property BackgroundColor: string read GetbackgroundColor;
+ property LinkColor: string read GetLinkColor;
+ property VisitedColor: string read GetVisitedColor;
+ property BackgroundImage: string read GetBackgroundImage;
+ property PictureFolder: string read GetPictureFolder;
+ property Author: string read GetAuthor;
+ property Title: string read GetTitle;
+ property InitialPictureDir: String read FInitialDir write SetInitialDir;
+ end;
+
+
+
+implementation
+
+const
+ idxExternal = 0;
+ idxInternal = 1;
+
+ tagDefSheet = 1;
+ tagPrintSheet = 2;
+ tagBackColor = 3;
+ tagTextColor = 4;
+ tagLinkColor = 5;
+ tagVisitedColor = 6;
+ tagBackImg = 7;
+
+ StyleFilter = 'Cascading Style Sheets (*.css)|*.css|Alle bestandend (*.*)|*.*';
+
+ HtmlDocTypeNames: THtmlDocTypeStrings = ('Html 4.01 Strict', 'Html 4.01 Transitional', 'Html 5', '');
+
+
+{ TNewHtmlDlgForm }
+
+procedure TNewHtmlDlgForm.StyleChoiceGroupClick(Sender: TObject);
+begin
+ case StyleChoicegroup.ItemIndex of
+ idxInternal:
+ begin
+ InlineStyleBox.Enabled := True;
+ ExternalStyleBox.Enabled := False;
+ end;
+ idxExternal:
+ begin
+ InlineStyleBox.Enabled := False;
+ ExternalStyleBox.Enabled := True;
+ end;
+ end;
+end;
+
+function TNewHtmlDlgForm.GetAuthor: string;
+begin
+ Result := AuthorEdit.Text;
+end;
+
+function TNewHtmlDlgForm.GetbackgroundColor: string;
+begin
+ Result := BackColorEdit.Text;
+end;
+
+function TNewHtmlDlgForm.GetBackgroundImage: string;
+begin
+ Result := Trim(PictureFolder);
+ if (Result <> '') then
+ begin
+ Result := IncludeTrailingPathDelimiter(Result);
+ Result := UrlEscape(Result);
+ DoHtmlDirSeparators(Result);
+ end;
+ Result := Result + BackImageEdit.Text;
+end;
+
+function TNewHtmlDlgForm.GetDefaultStyleSheet: string;
+begin
+ Result := UrlEscape(DefaultStyleSheetEdit.Text);
+end;
+
+function TNewHtmlDlgForm.GetHtmlDocType: THtmlDocType;
+begin
+ Result := THtmlDocType(DocTypeComboBox.ItemIndex);
+end;
+
+function TNewHtmlDlgForm.GetLinkColor: string;
+begin
+ Result := LinkColorEdit.Text;
+end;
+
+function TNewHtmlDlgForm.GetPictureFolder: string;
+begin
+ Result := UrlEscape(PictureFolderEdit.Text);
+end;
+
+function TNewHtmlDlgForm.GetPrintStyleSheet: string;
+begin
+ Result := UrlEscape(PrintStyleSheetEdit.Text);
+end;
+
+function TNewHtmlDlgForm.GetTextColor: string;
+begin
+ Result := TextColorEdit.Text;
+end;
+
+function TNewHtmlDlgForm.GetTitle: string;
+begin
+ Result := TitleEdit.Text;
+end;
+
+function TNewHtmlDlgForm.GetUseStyleSheet: Boolean;
+begin
+ Result := (StyleChoiceGroup.ItemIndex = idxExternal);
+end;
+
+function TNewHtmlDlgForm.GetVisitedColor: string;
+begin
+ Result := VisitedLinkColorEdit.Text;
+end;
+
+procedure TNewHtmlDlgForm.SetInitialDir(AValue: String);
+begin
+ if FInitialDir = AValue then Exit;
+ OpenPictureDialog.InitialDir := AValue;
+ FInitialDir := AValue;
+end;
+
+procedure TNewHtmlDlgForm.StyleBtnClick(Sender: TObject);
+var
+ Tg: PtrInt;
+ Css: String;
+begin
+ Tg := (Sender as TSpeedButton).Tag;
+ OpenDialog.Filter := StyleFilter;
+ OpenDialog.FilterIndex := 1;
+ if OpenDialog.Execute then
+ begin
+ Css := OpenDialog.FileName;
+ Css := ExtractFileName(Css);
+ case Tg of
+ tagDefSheet: DefaultStyleSheetEdit.Text := Css;
+ tagPrintSheet: PrintStyleSheetEdit.Text := Css;
+ end;
+ end;
+end;
+
+procedure TNewHtmlDlgForm.FormShow(Sender: TObject);
+begin
+ ActiveControl := TitleEdit;
+end;
+
+procedure TNewHtmlDlgForm.ColorBtnClick(Sender: TObject);
+var
+ AColor: TColor;
+ Tg: PtrInt;
+ AColorStr: String;
+begin
+ Tg := (Sender as TSpeedButton).Tag;
+ if ColorDialog.Execute then
+ begin
+ AColor := ColorDialog.Color;
+ AColorStr := ColorToHtml(AColor);
+ case Tg of
+ tagBackColor:
+ begin
+ BackColorEdit.Text := AColorStr;
+ end;
+ tagTextColor:
+ begin
+ TextColorEdit.Text := AColorStr;
+ end;
+ tagLinkColor:
+ begin
+ LinkColorEdit.Text := AColorStr;
+ end;
+ tagVisitedColor:
+ begin
+ VisitedLinkColorEdit.Text := AColorStr;
+ end;
+ end;
+ end;
+end;
+
+procedure TNewHtmlDlgForm.ImgBtnClick(Sender: TObject);
+begin
+ if OpenPictureDialog.Execute then
+ begin
+ BackImageEdit.Text := ExtractFileName(OpenPictureDialog.FileName);
+ FInitialDir := ExtractFilePath(OpenPictureDialog.FileName);
+ end;
+end;
+
+procedure TNewHtmlDlgForm.FormCreate(Sender: TObject);
+var
+ h: THtmlDocType;
+begin
+ DefSheetBtn.Tag := tagDefSheet;
+ PrintSheetBtn.Tag := tagPrintSheet;
+ BackColorBtn.Tag := tagBackColor;
+ TextColorBtn.Tag := tagTextColor;
+ LinkColorBtn.Tag := tagLinkColor;
+ VisitedColorBtn.Tag := tagVisitedColor;
+ BackImgBtn.Tag := tagBackImg;
+ DocTypeComboBox.Clear;
+ StyleChoiceGroupClick(Self);
+ for h := Low(THtmlDocType) to High(THtmlDocType) do DocTypeComboBox.Items.Add(HtmlDoctypeNames[h]);
+ DocTypeComboBox.ItemIndex := ord (DocType_Html_401_Strict);
+end;
+
+
+
+{$R *.lfm}
+
+end.
+
diff --git a/applications/lazedit/newtableform.lfm b/applications/lazedit/newtableform.lfm
new file mode 100644
index 000000000..518c8e123
--- /dev/null
+++ b/applications/lazedit/newtableform.lfm
@@ -0,0 +1,117 @@
+object NewTableForm: TNewTableForm
+ Left = 656
+ Height = 266
+ Top = 123
+ Width = 251
+ Caption = 'Tabel invoegen'
+ ClientHeight = 266
+ ClientWidth = 251
+ OnShow = FormShow
+ LCLVersion = '0.9.31'
+ object SummaryEdit: TEdit
+ Left = 16
+ Height = 21
+ Top = 32
+ Width = 216
+ TabOrder = 0
+ Text = 'SummaryEdit'
+ end
+ object Label1: TLabel
+ Left = 16
+ Height = 14
+ Top = 16
+ Width = 91
+ Caption = 'Tabelsamenvatting'
+ ParentColor = False
+ end
+ object RowEdit: TSpinEdit
+ Left = 16
+ Height = 21
+ Top = 88
+ Width = 88
+ MaxValue = 10000
+ MinValue = 1
+ TabOrder = 1
+ Value = 2
+ end
+ object ColEdit: TSpinEdit
+ Left = 144
+ Height = 21
+ Top = 88
+ Width = 88
+ MaxValue = 10000
+ MinValue = 1
+ TabOrder = 2
+ Value = 2
+ end
+ object Label2: TLabel
+ Left = 16
+ Height = 14
+ Top = 68
+ Width = 53
+ Caption = 'Aantal rijen'
+ ParentColor = False
+ end
+ object Label3: TLabel
+ Left = 146
+ Height = 14
+ Top = 68
+ Width = 82
+ Caption = 'Aantal kolommen'
+ ParentColor = False
+ end
+ object Label4: TLabel
+ Left = 16
+ Height = 14
+ Top = 120
+ Width = 12
+ Caption = 'ID'
+ ParentColor = False
+ end
+ object IdEdit: TEdit
+ Left = 16
+ Height = 21
+ Top = 136
+ Width = 216
+ TabOrder = 3
+ Text = 'IdEdit'
+ end
+ object Label5: TLabel
+ Left = 16
+ Height = 14
+ Top = 168
+ Width = 26
+ Caption = 'Class'
+ ParentColor = False
+ end
+ object ClassEdit: TEdit
+ Left = 16
+ Height = 21
+ Top = 184
+ Width = 216
+ TabOrder = 4
+ Text = 'ClassEdit'
+ end
+ object OkBtn: TBitBtn
+ Left = 157
+ Height = 30
+ Top = 224
+ Width = 75
+ Default = True
+ DefaultCaption = True
+ Kind = bkOK
+ ModalResult = 1
+ TabOrder = 5
+ end
+ object CancelBtn: TBitBtn
+ Left = 72
+ Height = 30
+ Top = 224
+ Width = 75
+ Cancel = True
+ DefaultCaption = True
+ Kind = bkCancel
+ ModalResult = 2
+ TabOrder = 6
+ end
+end
diff --git a/applications/lazedit/newtableform.pp b/applications/lazedit/newtableform.pp
new file mode 100644
index 000000000..aec571e27
--- /dev/null
+++ b/applications/lazedit/newtableform.pp
@@ -0,0 +1,87 @@
+unit NewTableForm;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+ Spin, Buttons;
+
+type
+
+ { TNewTableForm }
+
+ TNewTableForm = class(TForm)
+ CancelBtn: TBitBtn;
+ OkBtn: TBitBtn;
+ ClassEdit: TEdit;
+ IdEdit: TEdit;
+ Label2: TLabel;
+ Label3: TLabel;
+ Label4: TLabel;
+ Label5: TLabel;
+ RowEdit: TSpinEdit;
+ ColEdit: TSpinEdit;
+ SummaryEdit: TEdit;
+ Label1: TLabel;
+ procedure FormShow(Sender: TObject);
+ private
+ function GetColCount: integer;
+ function GetDomClass: String;
+ function GetDomId: String;
+ function GetRowCount: Integer;
+ function GetSummary: string;
+ { private declarations }
+ public
+ { public declarations }
+ property Summary: string read GetSummary;
+ property DomId: String read GetDomId;
+ property DomClass: String read GetDomClass;
+ property RowCount: Integer read GetRowCount;
+ property ColCount: integer read GetColCount;
+ end;
+
+
+
+implementation
+
+{$R *.lfm}
+
+{ TNewTableForm }
+
+procedure TNewTableForm.FormShow(Sender: TObject);
+begin
+ SummaryEdit.Text := '';
+ IdEdit.Text := '';;
+ ClassEdit.Text := '';
+ ActiveControl := SummaryEdit;
+end;
+
+function TNewTableForm.GetColCount: integer;
+begin
+ Result := ColEdit.Value;
+end;
+
+function TNewTableForm.GetDomClass: String;
+begin
+ Result := ClassEdit.Text;
+end;
+
+function TNewTableForm.GetDomId: String;
+begin
+ Result := IdEdit.Text;
+end;
+
+function TNewTableForm.GetRowCount: Integer;
+begin
+ Result := RowEdit.Value;
+end;
+
+function TNewTableForm.GetSummary: string;
+begin
+ Result := SummaryEdit.Text;
+end;
+
+end.
+
diff --git a/applications/lazedit/picturedlgform.lfm b/applications/lazedit/picturedlgform.lfm
new file mode 100644
index 000000000..8631936d0
--- /dev/null
+++ b/applications/lazedit/picturedlgform.lfm
@@ -0,0 +1,227 @@
+object PictureDlgForm: TPictureDlgForm
+ Left = 806
+ Height = 398
+ Top = 147
+ Width = 396
+ Caption = 'Plaatje invoegen'
+ ClientHeight = 398
+ ClientWidth = 396
+ OnShow = FormShow
+ LCLVersion = '0.9.31'
+ object Label1: TLabel
+ Left = 16
+ Height = 14
+ Top = 8
+ Width = 71
+ Caption = 'Bestandsnaam'
+ ParentColor = False
+ end
+ object SrcEdit: TEdit
+ Left = 16
+ Height = 21
+ Top = 24
+ Width = 320
+ TabOrder = 0
+ end
+ object OpenBtn: TSpeedButton
+ Left = 352
+ Height = 22
+ Top = 24
+ Width = 23
+ Glyph.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00005E8E8D005D
+ 8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D8CBD005D
+ 8CBD005D8CBD005D8CBD005D8CBD005E8E8D005B8900005B890000679AB06AB7
+ DAFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CC
+ EDFF82CCEDFF82CCEDFF83CDEEFF318DB9C9005E8E40005F8F000070A9A256AA
+ CEFF80CBEAFF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9E9FF7EC9
+ E9FF7EC9E9FF7EC9E9FF7EC9E9FF57AFD6D90066996E006699000074AD9D44A1
+ CBFF8AD3EFFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CD
+ EBFF83CDEBFF83CDEBFF83CDEBFF81CDEBF2006FA8930071AB010076B29952B0
+ D7FF85D2EDFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2
+ EEFF89D2EEFF89D2EEFF89D2EEFF90D8F1FF228EC1AA0077B31D0079B69574CA
+ E8FF75CAE8FF90D8F2FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7
+ F1FF8FD7F1FF8FD7F1FF8FD7F1FF91D8F2FF4FB1DAC2007FBD46007CBA928FDD
+ F4FF63C0E5FFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EE
+ FAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFF86D8EFDE0083C571007FBD8EA6EC
+ FCFF64C2E9FF4FB5E2FF4DB4E2FF4CB3E1FF4BB2E0FF49B1DFFF48B0DFFF47AE
+ DEFF45ADDDFF44ACDDFF46AEDFFF0084C6C70087CB810087CB610081C18BABF0
+ FEFFA4E9FCFFA2E7FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DCF4FF91D9
+ F3FF8ED7F1FF8BD4F0FF90D8F3FF0081C18B0087CA000087CB000083C488ADF1
+ FFFFA6EBFDFFA4E9FCFFA2E7FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DC
+ F4FF91D9F3FF8ED7F1FF93DAF4FF0083C4880083C4000085C8000085C785B0F4
+ FFFFADF1FFFFABF0FEFFA9EEFDFFA7ECFCFFA5EAFBFFA2E8FAFFA0E6F9FF9DE3
+ F8FF9AE1F7FF98DFF6FF99E0F7FF0085C7850085C7000085C7000087CA620087
+ CA830087CA830087CA830087CA830087CA830087CA83FEFEFDFFF5F5EEFFEBEB
+ DDFFFEC941FFF4B62EFF0087CA830087CA620086C9000086C9000087CA000087
+ CA000087CA000087CA000087CA000087CA000088CC2E0088CC810088CC810088
+ CC810088CC810088CC810088CC2E0087CA000086C9000086C900FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ NumGlyphs = 0
+ OnClick = OpenBtnClick
+ end
+ object Label2: TLabel
+ Left = 16
+ Height = 14
+ Top = 56
+ Width = 147
+ Caption = 'Standaard lokatie voor plaatjes'
+ ParentColor = False
+ end
+ object DefFolderEdit: TEdit
+ Left = 16
+ Height = 21
+ Top = 72
+ Width = 359
+ TabOrder = 1
+ end
+ object Label3: TLabel
+ Left = 16
+ Height = 14
+ Top = 104
+ Width = 39
+ Caption = 'Alt tekst'
+ ParentColor = False
+ end
+ object AltEdit: TEdit
+ Left = 16
+ Height = 21
+ Top = 120
+ Width = 176
+ TabOrder = 2
+ end
+ object Label4: TLabel
+ Left = 200
+ Height = 14
+ Top = 104
+ Width = 47
+ Caption = 'Title tekst'
+ ParentColor = False
+ end
+ object TitleEdit: TEdit
+ Left = 200
+ Height = 21
+ Top = 120
+ Width = 175
+ TabOrder = 3
+ end
+ object Label5: TLabel
+ Left = 16
+ Height = 14
+ Top = 152
+ Width = 38
+ Caption = 'Breedte'
+ ParentColor = False
+ end
+ object WidthEdit: TEdit
+ Left = 16
+ Height = 21
+ Top = 168
+ Width = 176
+ TabOrder = 4
+ end
+ object Label6: TLabel
+ Left = 200
+ Height = 14
+ Top = 152
+ Width = 36
+ Caption = 'Hoogte'
+ ParentColor = False
+ end
+ object HeightEdit: TEdit
+ Left = 200
+ Height = 21
+ Top = 168
+ Width = 175
+ TabOrder = 5
+ end
+ object Label7: TLabel
+ Left = 16
+ Height = 14
+ Top = 200
+ Width = 12
+ Caption = 'ID'
+ ParentColor = False
+ end
+ object IdEdit: TEdit
+ Left = 16
+ Height = 21
+ Top = 216
+ Width = 359
+ TabOrder = 6
+ end
+ object Label8: TLabel
+ Left = 16
+ Height = 14
+ Top = 248
+ Width = 26
+ Caption = 'Class'
+ ParentColor = False
+ end
+ object ClassEdit: TEdit
+ Left = 16
+ Height = 21
+ Top = 264
+ Width = 359
+ TabOrder = 7
+ end
+ object FloatGroup: TRadioGroup
+ Left = 16
+ Height = 41
+ Top = 296
+ Width = 359
+ AutoFill = True
+ Caption = 'Float stijl'
+ ChildSizing.LeftRightSpacing = 6
+ ChildSizing.TopBottomSpacing = 6
+ ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+ ChildSizing.EnlargeVertical = crsHomogenousChildResize
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.ControlsPerLine = 3
+ ClientHeight = 23
+ ClientWidth = 355
+ Columns = 3
+ ItemIndex = 2
+ Items.Strings = (
+ 'Links'
+ 'Rechts'
+ 'Geen'
+ )
+ TabOrder = 8
+ end
+ object OkBtn: TBitBtn
+ Left = 300
+ Height = 30
+ Top = 352
+ Width = 75
+ Default = True
+ DefaultCaption = True
+ Kind = bkOK
+ ModalResult = 1
+ TabOrder = 9
+ end
+ object CancelBtn: TBitBtn
+ Left = 208
+ Height = 30
+ Top = 352
+ Width = 75
+ Cancel = True
+ DefaultCaption = True
+ Kind = bkCancel
+ ModalResult = 2
+ TabOrder = 10
+ end
+ object OpenPictureDialog: TOpenPictureDialog
+ left = 48
+ top = 344
+ end
+end
diff --git a/applications/lazedit/picturedlgform.pp b/applications/lazedit/picturedlgform.pp
new file mode 100644
index 000000000..7f756a1c1
--- /dev/null
+++ b/applications/lazedit/picturedlgform.pp
@@ -0,0 +1,175 @@
+unit PictureDlgForm;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+ Buttons, ExtCtrls, ExtDlgs, {PicsLib,} HtmlCode;
+
+type
+
+ { TPictureDlgForm }
+
+ TPictureDlgForm = class(TForm)
+ AltEdit: TEdit;
+ CancelBtn: TBitBtn;
+ OkBtn: TBitBtn;
+ DefFolderEdit: TEdit;
+ ClassEdit: TEdit;
+ IdEdit: TEdit;
+ HeightEdit: TEdit;
+ Label6: TLabel;
+ Label7: TLabel;
+ Label8: TLabel;
+ FloatGroup: TRadioGroup;
+ OpenPictureDialog: TOpenPictureDialog;
+ WidthEdit: TEdit;
+ Label5: TLabel;
+ TitleEdit: TEdit;
+ Label2: TLabel;
+ Label3: TLabel;
+ Label4: TLabel;
+ OpenBtn: TSpeedButton;
+ SrcEdit: TEdit;
+ Label1: TLabel;
+ procedure FormShow(Sender: TObject);
+ procedure OpenBtnClick(Sender: TObject);
+ private
+ FInitialDir: string;
+ function GetAlt: String;
+ function GetDefaultFolderPrefix: String;
+ function GetDomClass: String;
+ function GetDomId: String;
+ function GetFloatStyle: String;
+ function GetPicHeight: String;
+ function GetPicWidth: String;
+ function GetSrc: String;
+ function GetTitle: String;
+ procedure SetDefaultFolderPrefix(AValue: String);
+ procedure SetInitialDir(AValue: string);
+ { private declarations }
+ public
+ { public declarations }
+ property Src: String read GetSrc;
+ property DomId: String read GetDomId;
+ property DomClass: String read GetDomClass;
+ property FloatStyle: String read GetFloatStyle;
+ property PicWidth: String read GetPicWidth;
+ property PicHeight: String read GetPicHeight;
+ property Alt: String read GetAlt;
+ property Title: String read GetTitle;
+ property InitialDir: string read FInitialDir write SetInitialDir;
+ property DefaultFolderPrefix: String read GetDefaultFolderPrefix write SetDefaultFolderPrefix;
+ end;
+
+
+
+implementation
+
+{$R *.lfm}
+
+const
+ idxLeft = 0;
+ idxRight = 1;
+ idxNone = 2;
+
+{ TPictureDlgForm }
+
+procedure TPictureDlgForm.OpenBtnClick(Sender: TObject);
+var
+ Fn: String;
+ W, H: dword;
+begin
+ if OpenPictureDialog.Execute then
+ begin
+ Fn := OpenPictureDialog.FileName;
+ FInitialDir := ExtractFileDir(Fn);
+ SrcEdit.Text := ExtractFileName(Fn);
+ {if GetImageSize(Fn, W, H) then
+ begin
+ WidthEdit.Text := IntToStr(W);
+ HeightEdit.Text := IntToStr(H);
+ end
+ else
+ begin
+ WidthEdit.Text := '';
+ HeightEdit.Text := '';
+ end;}
+ end;
+end;
+
+procedure TPictureDlgForm.FormShow(Sender: TObject);
+begin
+ SrcEdit.Text := '';
+ AltEdit.Text := '';
+ TitleEdit.Text := '';
+ WidthEdit.Text := '';
+ HeightEdit.Text := '';
+ ActiveControl := SrcEdit;
+end;
+
+function TPictureDlgForm.GetAlt: String;
+begin
+ Result := AltEdit.Text;
+end;
+
+function TPictureDlgForm.GetDefaultFolderPrefix: String;
+begin
+ Result := DefFolderEdit.Text;
+end;
+
+function TPictureDlgForm.GetDomClass: String;
+begin
+ Result := ClassEdit.Text;
+end;
+
+function TPictureDlgForm.GetDomId: String;
+begin
+ Result := IdEdit.Text;
+end;
+
+function TPictureDlgForm.GetFloatStyle: String;
+begin
+ case FloatGroup.ItemIndex of
+ idxLeft: Result := 'left';
+ idxRight: Result := 'right';
+ else Result := '';
+ end;
+end;
+
+
+
+function TPictureDlgForm.GetPicHeight: String;
+begin
+ Result := HeightEdit.Text;
+end;
+
+function TPictureDlgForm.GetPicWidth: String;
+begin
+ Result := WidthEdit.Text;
+end;
+
+function TPictureDlgForm.GetSrc: String;
+begin
+ Result := UrlEscape(SrcEdit.Text);
+end;
+
+function TPictureDlgForm.GetTitle: String;
+begin
+ Result := TitleEdit.Text;
+end;
+
+procedure TPictureDlgForm.SetDefaultFolderPrefix(AValue: String);
+begin
+ DefFolderEdit.Text := AValue;
+end;
+
+procedure TPictureDlgForm.SetInitialDir(AValue: string);
+begin
+ OpenPictureDialog.InitialDir := AValue;
+end;
+
+end.
+