From 15587b8edec7fde4398097c5600d87f902f66ed6 Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Tue, 14 Feb 2012 15:53:59 +0000 Subject: [PATCH] Adds lazedit, a text editor git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2289 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- applications/lazedit/EPlus.ini | 59 + applications/lazedit/anchordlgform.lfm | 136 ++ applications/lazedit/anchordlgform.pp | 144 ++ applications/lazedit/copyleft.pp | 59 + applications/lazedit/editorpagecontrol.pp | 1068 ++++++++++ applications/lazedit/eplus_commons.pp | 128 ++ applications/lazedit/eplus_config.pp | 265 +++ applications/lazedit/history.htm | 320 +++ applications/lazedit/htmlcharmap.lfm | 96 + applications/lazedit/htmlcharmap.pp | 319 +++ applications/lazedit/htmlcode.pp | 417 ++++ applications/lazedit/htmldialogs.pp | 553 +++++ applications/lazedit/lazedit.lpi | 1019 +++++++++ applications/lazedit/lazedit.lpr | 22 + applications/lazedit/lazedit.res | Bin 0 -> 855 bytes applications/lazedit/main.lfm | 2107 ++++++++++++++++++ applications/lazedit/main.pp | 2363 +++++++++++++++++++++ applications/lazedit/newhtmldlgform.lfm | 752 +++++++ applications/lazedit/newhtmldlgform.pp | 292 +++ applications/lazedit/newtableform.lfm | 117 + applications/lazedit/newtableform.pp | 87 + applications/lazedit/picturedlgform.lfm | 227 ++ applications/lazedit/picturedlgform.pp | 175 ++ 23 files changed, 10725 insertions(+) create mode 100644 applications/lazedit/EPlus.ini create mode 100644 applications/lazedit/anchordlgform.lfm create mode 100644 applications/lazedit/anchordlgform.pp create mode 100644 applications/lazedit/copyleft.pp create mode 100644 applications/lazedit/editorpagecontrol.pp create mode 100644 applications/lazedit/eplus_commons.pp create mode 100644 applications/lazedit/eplus_config.pp create mode 100644 applications/lazedit/history.htm create mode 100644 applications/lazedit/htmlcharmap.lfm create mode 100644 applications/lazedit/htmlcharmap.pp create mode 100644 applications/lazedit/htmlcode.pp create mode 100644 applications/lazedit/htmldialogs.pp create mode 100644 applications/lazedit/lazedit.lpi create mode 100644 applications/lazedit/lazedit.lpr create mode 100644 applications/lazedit/lazedit.res create mode 100644 applications/lazedit/main.lfm create mode 100644 applications/lazedit/main.pp create mode 100644 applications/lazedit/newhtmldlgform.lfm create mode 100644 applications/lazedit/newhtmldlgform.pp create mode 100644 applications/lazedit/newtableform.lfm create mode 100644 applications/lazedit/newtableform.pp create mode 100644 applications/lazedit/picturedlgform.lfm create mode 100644 applications/lazedit/picturedlgform.pp 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. &nbsp;). +
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

+ + + + + + + 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 + _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 @@ + + + + + + + + + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + <ActiveWindowIndexAtStart Value="0"/> + </General> + <i18n> + <EnableI18N LFM="False"/> + </i18n> + <VersionInfo> + <StringTable ProductVersion=""/> + </VersionInfo> + <BuildModes Count="2" Active="Debug"> + <Item1 Name="Debug" Default="True"/> + <Item2 Name="Release"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="eplus"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <Optimizations> + <VariablesInRegisters Value="True"/> + <OptimizationLevel Value="2"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <UseLineInfoUnit Value="False"/> + <StripSymbols Value="True"/> + </Debugging> + <LinkSmart Value="True"/> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CompilerMessages> + <UseMsgFile Value="True"/> + </CompilerMessages> + <CompilerPath Value="$(CompPath)"/> + </Other> + </CompilerOptions> + </Item2> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> + <ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + </local> + </RunParams> + <RequiredPackages Count="2"> + <Item1> + <PackageName Value="SynEdit"/> + </Item1> + <Item2> + <PackageName Value="LCL"/> + </Item2> + </RequiredPackages> + <Units Count="95"> + <Unit0> + <Filename Value="lazedit.lpr"/> + <IsPartOfProject Value="True"/> + <UnitName Value="lazedit"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="17" Y="10"/> + <UsageCount Value="173"/> + </Unit0> + <Unit1> + <Filename Value="main.pp"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="EPlusForm"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="main"/> + <IsVisibleTab Value="True"/> + <EditorIndex Value="0"/> + <WindowIndex Value="0"/> + <TopLine Value="1266"/> + <CursorPos X="23" Y="1280"/> + <UsageCount Value="173"/> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> + </Unit1> + <Unit2> + <Filename Value="H:\Programmas\SvnLaz\lcl\comctrls.pp"/> + <UnitName Value="ComCtrls"/> + <WindowIndex Value="0"/> + <TopLine Value="428"/> + <CursorPos X="15" Y="449"/> + <UsageCount Value="16"/> + </Unit2> + <Unit3> + <Filename Value="test_ed.pp"/> + <IsPartOfProject Value="True"/> + <UnitName Value="test_ed"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="41" Y="8"/> + <UsageCount Value="173"/> + </Unit3> + <Unit4> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\synmemo.pas"/> + <UnitName Value="SynMemo"/> + <WindowIndex Value="0"/> + <TopLine Value="52"/> + <CursorPos X="1" Y="1"/> + <UsageCount Value="6"/> + </Unit4> + <Unit5> + <Filename Value="H:\Programmas\SvnLaz\lcl\include\customnotebook.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="549"/> + <CursorPos X="23" Y="553"/> + <UsageCount Value="16"/> + </Unit5> + <Unit6> + <Filename Value="H:\Programmas\SvnLaz\lcl\controls.pp"/> + <UnitName Value="Controls"/> + <WindowIndex Value="0"/> + <TopLine Value="1330"/> + <CursorPos X="21" Y="1351"/> + <UsageCount Value="5"/> + </Unit6> + <Unit7> + <Filename Value="editorpagecontrol.pp"/> + <UnitName Value="EditorPageControl"/> + <EditorIndex Value="4"/> + <WindowIndex Value="0"/> + <TopLine Value="884"/> + <CursorPos X="45" Y="904"/> + <UsageCount Value="84"/> + <Loaded Value="True"/> + </Unit7> + <Unit8> + <Filename Value="H:\Programmas\fpc\Source\rtl\objpas\classes\classesh.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="595"/> + <CursorPos X="15" Y="616"/> + <UsageCount Value="5"/> + </Unit8> + <Unit9> + <Filename Value="H:\Programmas\fpc\Source\rtl\objpas\classes\compon.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="211"/> + <CursorPos X="3" Y="214"/> + <UsageCount Value="9"/> + </Unit9> + <Unit10> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\synedit.pp"/> + <UnitName Value="SynEdit"/> + <WindowIndex Value="0"/> + <TopLine Value="831"/> + <CursorPos X="15" Y="852"/> + <UsageCount Value="17"/> + </Unit10> + <Unit11> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\synedittypes.pp"/> + <UnitName Value="SynEditTypes"/> + <WindowIndex Value="0"/> + <TopLine Value="48"/> + <CursorPos X="20" Y="69"/> + <UsageCount Value="22"/> + </Unit11> + <Unit12> + <Filename Value="H:\Programmas\SvnLaz\lcl\graphics.pp"/> + <UnitName Value="Graphics"/> + <WindowIndex Value="0"/> + <TopLine Value="221"/> + <CursorPos X="1" Y="258"/> + <UsageCount Value="6"/> + </Unit12> + <Unit13> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\syngutter.pp"/> + <UnitName Value="SynGutter"/> + <WindowIndex Value="0"/> + <TopLine Value="29"/> + <CursorPos X="56" Y="50"/> + <UsageCount Value="8"/> + </Unit13> + <Unit14> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\synguttermarks.pp"/> + <UnitName Value="SynGutterMarks"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="3" Y="15"/> + <UsageCount Value="4"/> + </Unit14> + <Unit15> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\syngutterlinenumber.pp"/> + <UnitName Value="SynGutterLineNumber"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="3" Y="19"/> + <UsageCount Value="4"/> + </Unit15> + <Unit16> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\syngutterchanges.pas"/> + <UnitName Value="SynGutterChanges"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="39" Y="13"/> + <UsageCount Value="8"/> + </Unit16> + <Unit17> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\synguttercodefolding.pp"/> + <UnitName Value="SynGutterCodeFolding"/> + <WindowIndex Value="0"/> + <TopLine Value="43"/> + <CursorPos X="3" Y="64"/> + <UsageCount Value="4"/> + </Unit17> + <Unit18> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\synhighlighterhtml.pp"/> + <UnitName Value="SynHighlighterHTML"/> + <WindowIndex Value="0"/> + <TopLine Value="214"/> + <CursorPos X="30" Y="235"/> + <UsageCount Value="10"/> + </Unit18> + <Unit19> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\synedithighlighterxmlbase.pas"/> + <UnitName Value="SynEditHighlighterXMLBase"/> + <WindowIndex Value="0"/> + <TopLine Value="40"/> + <CursorPos X="43" Y="61"/> + <UsageCount Value="10"/> + </Unit19> + <Unit20> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\synedithighlighterfoldbase.pas"/> + <UnitName Value="SynEditHighlighterFoldBase"/> + <WindowIndex Value="0"/> + <TopLine Value="134"/> + <CursorPos X="58" Y="155"/> + <UsageCount Value="10"/> + </Unit20> + <Unit21> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\synedithighlighter.pp"/> + <UnitName Value="SynEditHighlighter"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="1" Y="1"/> + <UsageCount Value="10"/> + </Unit21> + <Unit22> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\syneditmiscclasses.pp"/> + <UnitName Value="SynEditMiscClasses"/> + <WindowIndex Value="0"/> + <TopLine Value="589"/> + <CursorPos X="3" Y="97"/> + <UsageCount Value="5"/> + </Unit22> + <Unit23> + <Filename Value="H:\Programmas\SvnLaz\lcl\include\pagecontrol.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="118"/> + <CursorPos X="3" Y="120"/> + <UsageCount Value="7"/> + </Unit23> + <Unit24> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\syneditkeycmds.pp"/> + <UnitName Value="SynEditKeyCmds"/> + <WindowIndex Value="0"/> + <TopLine Value="325"/> + <CursorPos X="14" Y="346"/> + <UsageCount Value="7"/> + </Unit24> + <Unit25> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\syneditmousecmds.pp"/> + <UnitName Value="SynEditMouseCmds"/> + <WindowIndex Value="0"/> + <TopLine Value="120"/> + <CursorPos X="32" Y="156"/> + <UsageCount Value="5"/> + </Unit25> + <Unit26> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\syngutterbase.pp"/> + <UnitName Value="SynGutterBase"/> + <WindowIndex Value="0"/> + <TopLine Value="25"/> + <CursorPos X="3" Y="94"/> + <UsageCount Value="5"/> + </Unit26> + <Unit27> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\synedittextbase.pas"/> + <UnitName Value="SynEditTextBase"/> + <WindowIndex Value="0"/> + <TopLine Value="240"/> + <CursorPos X="15" Y="261"/> + <UsageCount Value="4"/> + </Unit27> + <Unit28> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\synedittexttabexpander.pas"/> + <UnitName Value="SynEditTextTabExpander"/> + <WindowIndex Value="0"/> + <TopLine Value="42"/> + <CursorPos X="49" Y="54"/> + <UsageCount Value="4"/> + </Unit28> + <Unit29> + <Filename Value="H:\Programmas\fpc\Source\rtl\objpas\classes\stringl.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="766"/> + <CursorPos X="3" Y="770"/> + <UsageCount Value="3"/> + </Unit29> + <Unit30> + <Filename Value="H:\Programmas\SvnLaz\lcl\include\tabsheet.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="31"/> + <CursorPos X="5" Y="51"/> + <UsageCount Value="3"/> + </Unit30> + <Unit31> + <Filename Value="H:\Programmas\SvnLaz\lcl\include\wincontrol.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="6363"/> + <CursorPos X="3" Y="6375"/> + <UsageCount Value="5"/> + </Unit31> + <Unit32> + <Filename Value="H:\Programmas\fpc\Source\rtl\objpas\classes\lists.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="677"/> + <CursorPos X="3" Y="679"/> + <UsageCount Value="1"/> + </Unit32> + <Unit33> + <Filename Value="H:\Programmas\fpc\Source\rtl\inc\ustringh.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="77"/> + <CursorPos X="10" Y="104"/> + <UsageCount Value="1"/> + </Unit33> + <Unit34> + <Filename Value="H:\Programmas\fpc\Source\rtl\inc\ustrings.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="2257"/> + <CursorPos X="19" Y="2280"/> + <UsageCount Value="1"/> + </Unit34> + <Unit35> + <Filename Value="H:\Programmas\fpc\Source\rtl\inc\wstrings.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="1233"/> + <CursorPos X="10" Y="1254"/> + <UsageCount Value="1"/> + </Unit35> + <Unit36> + <Filename Value="eplus_commons.pp"/> + <IsPartOfProject Value="True"/> + <UnitName Value="EPlus_Commons"/> + <EditorIndex Value="5"/> + <WindowIndex Value="0"/> + <TopLine Value="33"/> + <CursorPos X="31" Y="53"/> + <UsageCount Value="139"/> + <Loaded Value="True"/> + </Unit36> + <Unit37> + <Filename Value="copyleft.pp"/> + <IsPartOfProject Value="True"/> + <UnitName Value="CopyLeft"/> + <EditorIndex Value="6"/> + <WindowIndex Value="0"/> + <TopLine Value="25"/> + <CursorPos X="21" Y="53"/> + <UsageCount Value="136"/> + <Loaded Value="True"/> + </Unit37> + <Unit38> + <Filename Value="eplus_config.pp"/> + <IsPartOfProject Value="True"/> + <UnitName Value="EPlus_Config"/> + <EditorIndex Value="7"/> + <WindowIndex Value="0"/> + <TopLine Value="231"/> + <CursorPos X="79" Y="261"/> + <UsageCount Value="123"/> + <Loaded Value="True"/> + </Unit38> + <Unit39> + <Filename Value="..\MijnLib\fcl_misc.pp"/> + <UnitName Value="fcl_misc"/> + <WindowIndex Value="0"/> + <TopLine Value="102"/> + <CursorPos X="3" Y="104"/> + <UsageCount Value="31"/> + </Unit39> + <Unit40> + <Filename Value="H:\Programmas\fpc\Source\packages\fcl-base\src\inifiles.pp"/> + <UnitName Value="IniFiles"/> + <WindowIndex Value="0"/> + <TopLine Value="57"/> + <CursorPos X="3" Y="78"/> + <UsageCount Value="8"/> + </Unit40> + <Unit41> + <Filename Value="H:\Programmas\fpc\Source\rtl\objpas\sysutils\osutilsh.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="17"/> + <CursorPos X="10" Y="38"/> + <UsageCount Value="2"/> + </Unit41> + <Unit42> + <Filename Value="H:\Programmas\fpc\Source\rtl\win32\system.pp"/> + <UnitName Value="System"/> + <WindowIndex Value="0"/> + <TopLine Value="26"/> + <CursorPos X="2" Y="47"/> + <UsageCount Value="5"/> + </Unit42> + <Unit43> + <Filename Value="..\MijnLib\myfileutils.pp"/> + <UnitName Value="myfileutils"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="1" Y="1"/> + <UsageCount Value="8"/> + </Unit43> + <Unit44> + <Filename Value="htmlcharmap.pp"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="HtmlCharmapForm"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="HtmlCharMap"/> + <WindowIndex Value="0"/> + <TopLine Value="178"/> + <CursorPos X="3" Y="181"/> + <UsageCount Value="113"/> + </Unit44> + <Unit45> + <Filename Value="H:\Programmas\SvnLaz\lcl\grids.pas"/> + <UnitName Value="Grids"/> + <WindowIndex Value="0"/> + <TopLine Value="6427"/> + <CursorPos X="3" Y="6431"/> + <UsageCount Value="6"/> + </Unit45> + <Unit46> + <Filename Value="H:\Programmas\SvnLaz\ide\charactermapdlg.pas"/> + <ComponentName Value="CharacterMapDialog"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="CharacterMapDlg"/> + <WindowIndex Value="0"/> + <TopLine Value="156"/> + <CursorPos X="1" Y="160"/> + <UsageCount Value="4"/> + </Unit46> + <Unit47> + <Filename Value="H:\Programmas\fpc\Source\rtl\inc\objpash.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="166"/> + <CursorPos X="22" Y="187"/> + <UsageCount Value="4"/> + </Unit47> + <Unit48> + <Filename Value="H:\Programmas\fpc\Source\rtl\objpas\sysutils\finah.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="3"/> + <CursorPos X="11" Y="40"/> + <UsageCount Value="6"/> + </Unit48> + <Unit49> + <Filename Value="H:\Programmas\fpc\Source\rtl\objpas\sysutils\fina.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="194"/> + <CursorPos X="1" Y="194"/> + <UsageCount Value="6"/> + </Unit49> + <Unit50> + <Filename Value="H:\Programmas\fpc\Source\rtl\objpas\sysutils\sysstrh.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="82"/> + <CursorPos X="10" Y="103"/> + <UsageCount Value="5"/> + </Unit50> + <Unit51> + <Filename Value="H:\Programmas\fpc\Source\rtl\objpas\sysutils\sysstr.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="506"/> + <CursorPos X="7" Y="527"/> + <UsageCount Value="5"/> + </Unit51> + <Unit52> + <Filename Value="H:\Programmas\SvnLaz\lcl\dialogs.pp"/> + <UnitName Value="Dialogs"/> + <WindowIndex Value="0"/> + <TopLine Value="105"/> + <CursorPos X="15" Y="126"/> + <UsageCount Value="9"/> + </Unit52> + <Unit53> + <Filename Value="H:\Programmas\SvnLaz\lcl\include\filedialog.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="273"/> + <CursorPos X="1" Y="315"/> + <UsageCount Value="5"/> + </Unit53> + <Unit54> + <Filename Value="H:\Programmas\SvnLaz\lcl\include\control.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="4282"/> + <CursorPos X="3" Y="4296"/> + <UsageCount Value="5"/> + </Unit54> + <Unit55> + <Filename Value="H:\Programmas\SvnLaz\lcl\lclclasses.pp"/> + <UnitName Value="LCLClasses"/> + <WindowIndex Value="0"/> + <TopLine Value="116"/> + <CursorPos X="64" Y="120"/> + <UsageCount Value="5"/> + </Unit55> + <Unit56> + <Filename Value="H:\Programmas\SvnLaz\lcl\forms.pp"/> + <UnitName Value="Forms"/> + <WindowIndex Value="0"/> + <TopLine Value="1312"/> + <CursorPos X="15" Y="1333"/> + <UsageCount Value="6"/> + </Unit56> + <Unit57> + <Filename Value="H:\Programmas\SvnLaz\lcl\include\application.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="2312"/> + <CursorPos X="3" Y="2316"/> + <UsageCount Value="5"/> + </Unit57> + <Unit58> + <Filename Value="htmlcode.pp"/> + <UnitName Value="HtmlCode"/> + <EditorIndex Value="2"/> + <WindowIndex Value="0"/> + <TopLine Value="381"/> + <CursorPos X="127" Y="398"/> + <UsageCount Value="41"/> + <Loaded Value="True"/> + </Unit58> + <Unit59> + <Filename Value="htmldialogs.pp"/> + <IsPartOfProject Value="True"/> + <UnitName Value="HtmlDialogs"/> + <EditorIndex Value="1"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="1" Y="1"/> + <UsageCount Value="84"/> + <Loaded Value="True"/> + </Unit59> + <Unit60> + <Filename Value="newhtmldlgform.pp"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="NewHtmlDlgForm"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="NewHtmlDlgForm"/> + <WindowIndex Value="0"/> + <TopLine Value="114"/> + <CursorPos X="24" Y="147"/> + <UsageCount Value="81"/> + </Unit60> + <Unit61> + <Filename Value="newhtmldlgform.lfm"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="9" Y="1"/> + <UsageCount Value="6"/> + <DefaultSyntaxHighlighter Value="LFM"/> + </Unit61> + <Unit62> + <Filename Value="..\MijnLib\lcl_misc.pp"/> + <UnitName Value="Lcl_Misc"/> + <WindowIndex Value="0"/> + <TopLine Value="87"/> + <CursorPos X="13" Y="118"/> + <UsageCount Value="17"/> + </Unit62> + <Unit63> + <Filename Value="anchordlgform.pp"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="AnchorDlgForm"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="AnchorDlgForm"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="31" Y="9"/> + <UsageCount Value="72"/> + </Unit63> + <Unit64> + <Filename Value="picturedlgform.pp"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="PictureDlgForm"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="PictureDlgForm"/> + <EditorIndex Value="3"/> + <WindowIndex Value="0"/> + <TopLine Value="73"/> + <CursorPos X="10" Y="99"/> + <UsageCount Value="65"/> + <Loaded Value="True"/> + </Unit64> + <Unit65> + <Filename Value="..\MijnLib\picslib.pp"/> + <UnitName Value="PicsLib"/> + <WindowIndex Value="0"/> + <TopLine Value="88"/> + <CursorPos X="44" Y="88"/> + <UsageCount Value="7"/> + </Unit65> + <Unit66> + <Filename Value="H:\Programmas\SvnLaz\lcl\actnlist.pas"/> + <UnitName Value="ActnList"/> + <WindowIndex Value="0"/> + <TopLine Value="210"/> + <CursorPos X="3" Y="231"/> + <UsageCount Value="7"/> + </Unit66> + <Unit67> + <Filename Value="newtableform.pp"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="NewTableForm"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="NewTableForm"/> + <WindowIndex Value="0"/> + <TopLine Value="42"/> + <CursorPos X="32" Y="58"/> + <UsageCount Value="55"/> + </Unit67> + <Unit68> + <Filename Value="..\MijnLib\mrulists.pas"/> + <UnitName Value="MruLists"/> + <WindowIndex Value="0"/> + <TopLine Value="302"/> + <CursorPos X="3" Y="310"/> + <UsageCount Value="11"/> + </Unit68> + <Unit69> + <Filename Value="H:\Programmas\SvnLaz\components\synedit\syneditstrconst.pp"/> + <UnitName Value="SynEditStrConst"/> + <WindowIndex Value="0"/> + <TopLine Value="346"/> + <CursorPos X="9" Y="379"/> + <UsageCount Value="8"/> + </Unit69> + <Unit70> + <Filename Value="E:\Lazarus\lcl\forms.pp"/> + <UnitName Value="Forms"/> + <WindowIndex Value="0"/> + <TopLine Value="582"/> + <CursorPos X="55" Y="602"/> + <UsageCount Value="8"/> + </Unit70> + <Unit71> + <Filename Value="..\MijnLib\mygetopt.pp"/> + <UnitName Value="MyGetOpt"/> + <WindowIndex Value="0"/> + <TopLine Value="280"/> + <CursorPos X="4" Y="281"/> + <UsageCount Value="11"/> + </Unit71> + <Unit72> + <Filename Value="E:\Lazarus\components\lazutils\fileutil.pas"/> + <UnitName Value="FileUtil"/> + <WindowIndex Value="0"/> + <TopLine Value="19"/> + <CursorPos X="26" Y="45"/> + <UsageCount Value="8"/> + </Unit72> + <Unit73> + <Filename Value="E:\Lazarus\components\lazutils\fileutil.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="78"/> + <CursorPos X="3" Y="89"/> + <UsageCount Value="8"/> + </Unit73> + <Unit74> + <Filename Value="E:\Fpc\source\rtl\objpas\sysutils\diskh.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="10" Y="22"/> + <UsageCount Value="8"/> + </Unit74> + <Unit75> + <Filename Value="E:\Fpc\source\rtl\objpas\sysutils\sysutils.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="577"/> + <CursorPos X="3" Y="609"/> + <UsageCount Value="8"/> + </Unit75> + <Unit76> + <Filename Value="E:\Lazarus\components\synedit\synhighlightercpp.pp"/> + <UnitName Value="SynHighlighterCpp"/> + <WindowIndex Value="0"/> + <TopLine Value="247"/> + <CursorPos X="1" Y="1"/> + <UsageCount Value="8"/> + </Unit76> + <Unit77> + <Filename Value="E:\Lazarus\components\synedit\syneditstrconst.pp"/> + <UnitName Value="SynEditStrConst"/> + <WindowIndex Value="0"/> + <TopLine Value="295"/> + <CursorPos X="74" Y="294"/> + <UsageCount Value="8"/> + </Unit77> + <Unit78> + <Filename Value="E:\Fpc\source\rtl\inc\objpash.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="59"/> + <CursorPos X="8" Y="79"/> + <UsageCount Value="8"/> + </Unit78> + <Unit79> + <Filename Value="E:\Lazarus\components\synedit\synhighlighterhtml.pp"/> + <UnitName Value="SynHighlighterHTML"/> + <WindowIndex Value="0"/> + <TopLine Value="237"/> + <CursorPos X="15" Y="250"/> + <UsageCount Value="12"/> + </Unit79> + <Unit80> + <Filename Value="E:\Lazarus\components\synedit\synedithighlighterxmlbase.pas"/> + <UnitName Value="SynEditHighlighterXMLBase"/> + <WindowIndex Value="0"/> + <TopLine Value="41"/> + <CursorPos X="3" Y="61"/> + <UsageCount Value="8"/> + </Unit80> + <Unit81> + <Filename Value="E:\Lazarus\components\synedit\synedithighlighterfoldbase.pas"/> + <UnitName Value="SynEditHighlighterFoldBase"/> + <WindowIndex Value="0"/> + <TopLine Value="135"/> + <CursorPos X="3" Y="155"/> + <UsageCount Value="8"/> + </Unit81> + <Unit82> + <Filename Value="E:\Lazarus\components\synedit\synedithighlighter.pp"/> + <UnitName Value="SynEditHighlighter"/> + <WindowIndex Value="0"/> + <TopLine Value="396"/> + <CursorPos X="3" Y="416"/> + <UsageCount Value="8"/> + </Unit82> + <Unit83> + <Filename Value="E:\Lazarus\lcl\menus.pp"/> + <UnitName Value="Menus"/> + <WindowIndex Value="0"/> + <TopLine Value="208"/> + <CursorPos X="14" Y="339"/> + <UsageCount Value="9"/> + </Unit83> + <Unit84> + <Filename Value="E:\Lazarus\lcl\include\menuactionlink.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="100"/> + <CursorPos X="3" Y="126"/> + <UsageCount Value="9"/> + </Unit84> + <Unit85> + <Filename Value="E:\Lazarus\lcl\include\menuitem.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="1317"/> + <CursorPos X="3" Y="1326"/> + <UsageCount Value="9"/> + </Unit85> + <Unit86> + <Filename Value="E:\Fpc\source\rtl\objpas\classes\classesh.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="96"/> + <CursorPos X="3" Y="116"/> + <UsageCount Value="9"/> + </Unit86> + <Unit87> + <Filename Value="E:\Lazarus\lcl\include\menu.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="243"/> + <CursorPos X="3" Y="264"/> + <UsageCount Value="9"/> + </Unit87> + <Unit88> + <Filename Value="E:\Lazarus\lcl\lcltype.pp"/> + <UnitName Value="LCLType"/> + <WindowIndex Value="0"/> + <TopLine Value="2682"/> + <CursorPos X="14" Y="2711"/> + <UsageCount Value="10"/> + </Unit88> + <Unit89> + <Filename Value="E:\Lazarus\lcl\interfacebase.pp"/> + <UnitName Value="InterfaceBase"/> + <WindowIndex Value="0"/> + <TopLine Value="16"/> + <CursorPos X="36" Y="36"/> + <UsageCount Value="9"/> + </Unit89> + <Unit90> + <Filename Value="..\MijnLib\extabout.pp"/> + <UnitName Value="ExtAbout"/> + <WindowIndex Value="0"/> + <TopLine Value="221"/> + <CursorPos X="3" Y="237"/> + <UsageCount Value="11"/> + </Unit90> + <Unit91> + <Filename Value="..\MijnLib\gpl.pp"/> + <UnitName Value="GPL"/> + <WindowIndex Value="0"/> + <TopLine Value="1"/> + <CursorPos X="3" Y="6"/> + <UsageCount Value="11"/> + </Unit91> + <Unit92> + <Filename Value="..\MijnLib\extaboutform.pp"/> + <UnitName Value="ExtAboutForm"/> + <WindowIndex Value="0"/> + <TopLine Value="140"/> + <CursorPos X="3" Y="146"/> + <UsageCount Value="11"/> + </Unit92> + <Unit93> + <Filename Value="E:\Lazarus\lcl\clipbrd.pp"/> + <UnitName Value="Clipbrd"/> + <WindowIndex Value="0"/> + <TopLine Value="151"/> + <CursorPos X="14" Y="171"/> + <UsageCount Value="10"/> + </Unit93> + <Unit94> + <Filename Value="E:\Lazarus\lcl\include\clipbrd.inc"/> + <WindowIndex Value="0"/> + <TopLine Value="456"/> + <CursorPos X="3" Y="461"/> + <UsageCount Value="10"/> + </Unit94> + </Units> + <JumpHistory Count="29" HistoryIndex="28"> + <Position1> + <Filename Value="htmlcode.pp"/> + <Caret Line="398" Column="41" TopLine="381"/> + </Position1> + <Position2> + <Filename Value="picturedlgform.pp"/> + <Caret Line="156" Column="20" TopLine="135"/> + </Position2> + <Position3> + <Filename Value="picturedlgform.pp"/> + <Caret Line="9" Column="41" TopLine="1"/> + </Position3> + <Position4> + <Filename Value="main.pp"/> + <Caret Line="50" Column="3" TopLine="33"/> + </Position4> + <Position5> + <Filename Value="main.pp"/> + <Caret Line="430" Column="5" TopLine="413"/> + </Position5> + <Position6> + <Filename Value="main.pp"/> + <Caret Line="1132" Column="8" TopLine="1115"/> + </Position6> + <Position7> + <Filename Value="main.pp"/> + <Caret Line="430" Column="17" TopLine="416"/> + </Position7> + <Position8> + <Filename Value="main.pp"/> + <Caret Line="1133" Column="5" TopLine="1116"/> + </Position8> + <Position9> + <Filename Value="main.pp"/> + <Caret Line="1143" Column="5" TopLine="1126"/> + </Position9> + <Position10> + <Filename Value="main.pp"/> + <Caret Line="1244" Column="13" TopLine="1227"/> + </Position10> + <Position11> + <Filename Value="main.pp"/> + <Caret Line="430" Column="25" TopLine="413"/> + </Position11> + <Position12> + <Filename Value="main.pp"/> + <Caret Line="1132" Column="25" TopLine="1115"/> + </Position12> + <Position13> + <Filename Value="main.pp"/> + <Caret Line="1280" Column="46" TopLine="1263"/> + </Position13> + <Position14> + <Filename Value="main.pp"/> + <Caret Line="1360" Column="34" TopLine="1328"/> + </Position14> + <Position15> + <Filename Value="main.pp"/> + <Caret Line="1377" Column="8" TopLine="1351"/> + </Position15> + <Position16> + <Filename Value="main.pp"/> + <Caret Line="1626" Column="48" TopLine="1610"/> + </Position16> + <Position17> + <Filename Value="main.pp"/> + <Caret Line="1711" Column="7" TopLine="1694"/> + </Position17> + <Position18> + <Filename Value="main.pp"/> + <Caret Line="1712" Column="9" TopLine="1700"/> + </Position18> + <Position19> + <Filename Value="main.pp"/> + <Caret Line="1754" Column="8" TopLine="1732"/> + </Position19> + <Position20> + <Filename Value="main.pp"/> + <Caret Line="1761" Column="21" TopLine="1744"/> + </Position20> + <Position21> + <Filename Value="main.pp"/> + <Caret Line="1783" Column="21" TopLine="1766"/> + </Position21> + <Position22> + <Filename Value="main.pp"/> + <Caret Line="1850" Column="24" TopLine="1833"/> + </Position22> + <Position23> + <Filename Value="main.pp"/> + <Caret Line="2338" Column="6" TopLine="2326"/> + </Position23> + <Position24> + <Filename Value="main.pp"/> + <Caret Line="1152" Column="10" TopLine="1135"/> + </Position24> + <Position25> + <Filename Value="main.pp"/> + <Caret Line="1280" Column="23" TopLine="1257"/> + </Position25> + <Position26> + <Filename Value="main.pp"/> + <Caret Line="1152" Column="14" TopLine="1135"/> + </Position26> + <Position27> + <Filename Value="main.pp"/> + <Caret Line="1280" Column="1" TopLine="1266"/> + </Position27> + <Position28> + <Filename Value="main.pp"/> + <Caret Line="1283" Column="1" TopLine="1266"/> + </Position28> + <Position29> + <Filename Value="main.pp"/> + <Caret Line="1280" Column="23" TopLine="1266"/> + </Position29> + </JumpHistory> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="lazedit"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="f:\lazarusprojecten\mijnlib\"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <Checks> + <IOChecks Value="True"/> + <RangeChecks Value="True"/> + <OverflowChecks Value="True"/> + <StackChecks Value="True"/> + </Checks> + </CodeGeneration> + <Linking> + <Debugging> + <UseHeaptrc Value="True"/> + </Debugging> + </Linking> + <Other> + <CompilerMessages> + <UseMsgFile Value="True"/> + </CompilerMessages> + <CompilerPath Value="$(CompPath)"/> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> 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 0000000000000000000000000000000000000000..e66ecf85feb5a99d4bc85c4973bd1bb2e918b668 GIT binary patch literal 855 zcma)4OKaOe5O(RUP{^%0E_*CkiWA4QL2@vm1=9yPq%A$JS0j7rzPhvPM87^ANq#6L zlnPeN&dkny-#0TFjYf>l<70oweDb|{xsRVx&WkQ~a&k;5t{;qMTL`F}E%_un;|#2H zm9p!Sf4loQe#aR`VJo4Xg_1Xb{CfWSRUr_;taQVufW?xhV6RYazz7^0C4)m($FX$g zN}$QM6V8mVss@bThux?YJJecMV55r76F}Kn3(5y40nvp;kQ)_2#uNz7Th6R7WZXF8 zg>AmlCA$r-N-}o#PnW{Nd(L9xDeYd_i*ufLT`NEtl#j%G-lj3(y;f4R4mJp~4Ft%F zeBj!>_h1RJY}zX;D(LTVv6H5AKf`VaWe5MuUa{<lvX#5Xj0hQL$2ZQ#;5721CbL$N ze{15?ikN(Y=Fa^Bn(OTH{pD&lolK`v)|0B{ObfeCV%<sD$-!EJ&k#7ed!9uM3FFe% z?ms7g!FzcSWC}Fgohku-Ct3!mZiCt?4Qs$Y!iq!a!vno($MG4qpqXy}B^S7~TjCWs lOKKt8wJ3QlG(taE8by96@mKXCAHpc|0~zXF<olhT{{cli6tn;U literal 0 HcmV?d00001 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 = '<?xml version="1.0"?>'; + 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('<h%d>',[Level]),Format('</h%d>',[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. +