diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi
index ab0f55db..5e24ff97 100644
--- a/lazproj/coedit.lpi
+++ b/lazproj/coedit.lpi
@@ -201,19 +201,22 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/lazproj/coedit.lpr b/lazproj/coedit.lpr
index e791f700..a2265302 100644
--- a/lazproj/coedit.lpr
+++ b/lazproj/coedit.lpr
@@ -8,8 +8,8 @@ uses
{$ENDIF}{$ENDIF}
Interfaces, Forms, lazcontrols, runtimetypeinfocontrols, ce_widget,
ce_dmdwrap, ce_common, ce_synmemo, ce_main, ce_messages, ce_editor,
- ce_projinspect, ce_projconf, ce_jsoninfos, jsonparser, ce_project,
-ce_widgettypes;
+ ce_projinspect, ce_projconf, jsonparser, ce_project,
+ ce_widgettypes, ce_staticexplorer;
{$R *.res}
diff --git a/src/ce_common.pas b/src/ce_common.pas
index 2bbf61d9..546ac3f9 100644
--- a/src/ce_common.pas
+++ b/src/ce_common.pas
@@ -5,7 +5,7 @@ unit ce_common;
interface
uses
- Classes, SysUtils, ActnList;
+ Classes, SysUtils, ActnList, dialogs, forms;
(**
* Save a component with a readable aspect.
@@ -29,12 +29,17 @@ uses
(**
* Patches the directory separators from a string.
- * This is used to ensure a that project saved on a plateform can be loaded
+ * This is used to ensure that a project saved on a plateform can be loaded
* on another one.
*)
function patchPlateformPath(const aPath: string): string;
procedure patchPlateformPaths(const sPaths: TStrings);
+ (**
+ * Ok/Cancel modal dialog
+ *)
+ function dlgOkCancel(const aMsg: string): TModalResult;
+
implementation
@@ -225,4 +230,11 @@ begin
end;
end;
+function dlgOkCancel(const aMsg: string): TModalResult;
+const
+ Btns = [mbOK,mbCancel];
+begin
+ exit( MessageDlg('Coedit', aMsg, mtConfirmation, Btns, ''));
+end;
+
end.
diff --git a/src/ce_d2syn.pas b/src/ce_d2syn.pas
index 1c8e3aa9..14631ef0 100644
--- a/src/ce_d2syn.pas
+++ b/src/ce_d2syn.pas
@@ -315,8 +315,9 @@ begin
fKeywdAttrib.Foreground := clNavy;
fCurrIAttrib.Foreground := clBlack;
- fCurrIAttrib.FrameEdges:= sfeAround;
- fCurrIAttrib.FrameColor:= clGray;
+ fCurrIAttrib.FrameEdges := sfeAround;
+ fCurrIAttrib.FrameColor := clGray;
+ fCurrIAttrib.Background := cl3dlight;
fCommtAttrib.Style := [fsItalic];
fKeywdAttrib.Style := [fsBold];
diff --git a/src/ce_editor.lfm b/src/ce_editor.lfm
index b7b750d9..3cd8f14e 100644
--- a/src/ce_editor.lfm
+++ b/src/ce_editor.lfm
@@ -1,7 +1,5 @@
inherited CEEditorWidget: TCEEditorWidget
- Left = 1159
Height = 382
- Top = 91
Width = 465
Caption = 'Source editor'
ClientHeight = 382
diff --git a/src/ce_editor.pas b/src/ce_editor.pas
index 2f394292..aa372125 100644
--- a/src/ce_editor.pas
+++ b/src/ce_editor.pas
@@ -20,11 +20,11 @@ type
procedure PageControlChange(Sender: TObject);
procedure PageControlCloseTabClicked(Sender: TObject);
protected
- procedure autoWidgetUpdate; override;
+ procedure UpdateByDelay; override;
private
// http://bugs.freepascal.org/view.php?id=26329
+ fKeyChanged: boolean;
fSyncEdit: TSynPluginSyncroEdit;
- procedure focusedEditorChanged;
procedure memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure memoChange(Sender: TObject);
@@ -38,6 +38,7 @@ type
constructor create(aOwner: TComponent); override;
procedure addEditor;
procedure removeEditor(const aIndex: NativeInt);
+ procedure focusedEditorChanged;
//
property currentEditor: TCESynMemo read getCurrentEditor;
property editor[index: NativeInt]: TCESynMemo read getEditor;
@@ -102,6 +103,9 @@ begin
md := getModuleName(curr.Lines);
if md = '' then md := extractFileName(curr.fileName);
pageControl.ActivePage.Caption := md;
+ //
+ if pageControl.ActivePageIndex <> -1 then
+ mainForm.docFocusedNotify(Self, pageControl.ActivePageIndex);
end;
procedure TCEEditorWidget.PageControlChange(Sender: TObject);
@@ -121,7 +125,6 @@ var
sheet: TTabSheet;
memo: TCESynMemo;
begin
- fNeedAutoUpdate := true;
sheet := pageControl.AddTabSheet;
memo := TCESynMemo.Create(sheet);
//
@@ -134,6 +137,7 @@ begin
memo.OnChange := @memoChange;
memo.OnMouseMove := @memoMouseMove;
//
+ pageControl.ActivePage := sheet;
//http://bugs.freepascal.org/view.php?id=26320
focusedEditorChanged;
end;
@@ -151,34 +155,35 @@ end;
procedure TCEEditorWidget.memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
- fNeedAutoUpdate := true;
if (sender is TCESynMemo) then
identifierToD2Syn(TCESynMemo(Sender));
+ fKeyChanged := true;
+ beginUpdateByDelay;
end;
procedure TCEEditorWidget.memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
- fNeedAutoUpdate := true;
if (sender is TCESynMemo) then
identifierToD2Syn(TCESynMemo(Sender));
+ beginUpdateByDelay;
end;
procedure TCEEditorWidget.memoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then
- fNeedAutoUpdate := true;
+ beginUpdateByDelay;
end;
procedure TCEEditorWidget.memoChange(Sender: TObject);
var
ed: TCESynMemo;
begin
- fNeedAutoUpdate := true;
ed := TCESynMemo(sender);
ed.modified := true;
+ beginUpdateByDelay;
end;
-procedure TCEEditorWidget.autoWidgetUpdate;
+procedure TCEEditorWidget.UpdateByDelay;
const
modstr: array[boolean] of string = ('...', 'MODIFIED');
var
@@ -191,6 +196,10 @@ begin
editorStatus.Panels[1].Text := modstr[ed.modified];
editorStatus.Panels[2].Text := ed.fileName;
end;
+ //
+ if fKeyChanged then if editorIndex <> -1 then
+ mainForm.docChangeNotify(Self, editorIndex);
+ fKeyChanged := false;
end;
end.
diff --git a/src/ce_jsoninfos.pas b/src/ce_jsoninfos.pas
deleted file mode 100644
index d13d4b1b..00000000
--- a/src/ce_jsoninfos.pas
+++ /dev/null
@@ -1,147 +0,0 @@
-unit ce_jsoninfos;
-
-{$mode objfpc}{$H+}
-
-interface
-
-uses
- Classes, SysUtils, jsonparser, fpjson;
-
-type
-
- TJSonLoader = class(TThread)
- private
- parser: TJSONParser;
- public
- Filename: string;
- Data: TJsonData;
- procedure Execute; override;
- end;
-
- TDSourceInfo = record
- line: integer;
- infs: string;
- end;
-
- TDSourceInfos = array of TDSourceInfo;
-
- TInfKind = (ikModule, ikImport, ikFunction, ikAlias, ikClass, ikStruct,
- ikMixin, ikEnum, ikTemplate);
-
-const
- InfKindStr: array[TInfKind] of string = ('module', 'import', 'function', 'alias',
- 'class', 'structure', 'mixin', 'enum', 'template');
-
- InfKindNonModule = [ikImport..ikTemplate];
-
-type
- TJSonInfos = class
- private
- fFilenames: TStringList;
-
- procedure FilesChanged(Sender: TObject);
- procedure scan;
- public
- fData: array of TJsonData;
- constructor create;
- destructor destroy; override;
- //
- function getFileModule(const index: integer): TDSourceInfos;
- function getMembers(const aFileIndex, aModuleIndex: integer; const aKind: TInfKind): TDSourceInfos;
- property Files: TStringList read fFilenames;
- end;
-
-var
- JSONInfos: TJSonInfos;
-
-implementation
-
-procedure TJSonLoader.Execute;
-var
- str: TMemoryStream;
-begin
- str := TMemoryStream.create;
- parser := TJSONParser.Create(str);
- try
- str.LoadFromFile(Filename);
- Data := parser.parse;
- finally
- str.free;
- parser.free;
- end;
-end;
-
-constructor TJSonInfos.create;
-begin
- fFilenames := TStringList.Create;
- fFilenames.OnChange := @FilesChanged;
-end;
-
-destructor TJSonInfos.destroy;
-begin
- fFilenames.Free;
- inherited;
-end;
-
-procedure TJSonInfos.FilesChanged(Sender: TObject);
-begin
- scan;
-end;
-
-procedure TJSonInfos.scan;
-var
- fname: string;
- str: TmemoryStream;
-begin
- setLength(fData,0);
- str := tMemoryStream.Create;
- for fname in fFilenames do
- begin
- str.LoadFromFile(fname);
- str.Position := 0;
- setLength(fData, length(fData)+1);
- fData[high(fData)] := GetJSON(str);
- end;
-end;
-
-function TJSonInfos.getFileModule(const index: integer): TDSourceInfos;
-var
- memb: TJsonData;
- i: nativeInt;
-begin
- setlength(result,0);
- memb := fData[index].GetPath('');
- for i := 0 to memb.Count-1 do
- begin
- if memb.Items[i].GetPath('kind').AsString <> 'module' then continue;
- setlength(result, length(result) + 1);
- result[high(result)].infs := memb.Items[i].GetPath('name').AsString;
- result[high(result)].line := 0;
- end;
-end;
-
-function TJSonInfos.getMembers(const aFileIndex, aModuleIndex: integer; const aKind: TInfKind): TDSourceInfos;
-var
- memb: TJsonData;
- i: nativeInt;
-begin
- setlength(result,0);
- memb := fData[aFileIndex].items[aModuleIndex].GetPath('members');
- for i := 0 to memb.Count-1 do
- begin
- if memb.Items[i].GetPath('kind').AsString <> InfKindStr[aKind]
- then continue;
- setlength(result, length(result) + 1);
- result[high(result)].infs := memb.Items[i].GetPath('name').AsString;
- if (aKind = ikModule) then result[high(result)].line := 0
- else result[high(result)].line := memb.Items[i].GetPath('line').AsInt64;
- end;
-end;
-
-
-initialization
- JSONInfos := TJSonInfos.create;
-finalization
- JSONInfos.Free;
-end.
-
diff --git a/src/ce_main.lfm b/src/ce_main.lfm
index c6306544..c6ed69c6 100644
--- a/src/ce_main.lfm
+++ b/src/ce_main.lfm
@@ -5,7 +5,8 @@ object CEMainForm: TCEMainForm
Width = 745
AllowDropFiles = True
Caption = 'Coedit'
- ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.Layout = cclTopToBottomThenLeftToRight
+ DockSite = True
Menu = mainMenu
OnDropFiles = FormDropFiles
OnShow = FormShow
diff --git a/src/ce_main.pas b/src/ce_main.pas
index 8a772c85..8b42a54c 100644
--- a/src/ce_main.pas
+++ b/src/ce_main.pas
@@ -7,9 +7,9 @@ interface
uses
Classes, SysUtils, FileUtil, SynEditKeyCmds, SynHighlighterLFM, Forms,
AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg, Controls, Graphics,
- Dialogs, Menus, ActnList, ExtCtrls, process,
- ce_jsoninfos, ce_common, ce_dmdwrap, ce_project, ce_synmemo,
- ce_widget, ce_messages, ce_editor, ce_projinspect, ce_projconf, ce_staticexplorer;
+ Dialogs, Menus, ActnList, ExtCtrls, ComCtrls, process,
+ ce_common, ce_dmdwrap, ce_project, ce_synmemo, ce_widget, ce_messages,
+ ce_editor, ce_projinspect, ce_projconf, ce_staticexplorer;
type
@@ -174,6 +174,8 @@ type
destructor destroy; override;
//
procedure openFile(const aFilename: string);
+ procedure docChangeNotify(Sender: TObject; const aIndex: Integer);
+ procedure docFocusedNotify(Sender: TObject; const aIndex: Integer);
//
property WidgetList: TCEWidgetList read fWidgList;
property MessageWidget: TCEMessagesWidget read fMesgWidg;
@@ -190,8 +192,6 @@ implementation
uses
SynMacroRecorder;
-// TODO: warnings, OkCancel dialogs
-
{$REGION std comp methods ******************************************************}
constructor TCEMainForm.create(aOwner: TComponent);
var
@@ -206,13 +206,13 @@ begin
fEditWidg := TCEEditorWidget.create(nil);
fProjWidg := TCEProjectInspectWidget.create(nil);
fPrjCfWidg:= TCEProjectConfigurationWidget.create(nil);
- //fStExpWidg:= TCEStaticExplorerWidget.create(nil);
+ fStExpWidg:= TCEStaticExplorerWidget.create(nil);
fWidgList.addWidget(@fMesgWidg);
fWidgList.addWidget(@fEditWidg);
fWidgList.addWidget(@fProjWidg);
fWidgList.addWidget(@fPrjCfWidg);
- //fWidgList.addWidget(@fStExpWidg);
+ fWidgList.addWidget(@fStExpWidg);
for widg in fWidgList do widg.Show;
@@ -373,8 +373,8 @@ begin
j += 1;
end;
fEditWidg.editor[i].fileName := str;
- fEditWidg.editor[i].modified := true;
- fEditWidg.PageControl.PageIndex := i;
+ fEditWidg.editor[i].modified := false;
+ fEditWidg.focusedEditorChanged;
end;
function TCEMainForm.findFile(const aFilename: string): NativeInt;
@@ -403,12 +403,13 @@ begin
fEditWidg.addEditor;
fEditWidg.editor[i].Lines.LoadFromFile(aFilename);
fEditWidg.editor[i].fileName := aFilename;
- fEditWidg.PageControl.PageIndex := i;
+ fEditWidg.focusedEditorChanged;
end;
procedure TCEMainForm.saveFile(const edIndex: NativeInt);
var
str: string;
+ i: NativeInt;
begin
if fEditWidg = nil then exit;
if edIndex >= fEditWidg.editorCount then exit;
@@ -426,6 +427,9 @@ begin
finally
fEditWidg.editor[edIndex].modified := false;
end;
+ //
+ for i := 0 to fWidgList.Count-1 do
+ fWidgList.widget[i].docChanged(fEditWidg.editor[edIndex]);
end;
procedure TCEMainForm.saveFileAs(const edIndex: NativeInt; const aFilename: string);
@@ -442,6 +446,24 @@ begin
end;
end;
+procedure TCEMainForm.docChangeNotify(Sender: TObject; const aIndex: Integer);
+var
+ i: NativeInt;
+begin
+ for i := 0 to fWidgList.Count-1 do
+ if fWidgList.widget[i] <> Sender then
+ fWidgList.widget[i].docChanged(fEditWidg.editor[aIndex]);
+end;
+
+procedure TCEMainForm.docFocusedNotify(Sender: TObject; const aIndex: Integer);
+var
+ i: NativeInt;
+begin
+ for i := 0 to fWidgList.Count-1 do
+ if fWidgList.widget[i] <> Sender then
+ fWidgList.widget[i].docFocused(fEditWidg.editor[aIndex]);
+end;
+
procedure TCEMainForm.actFileOpenExecute(Sender: TObject);
begin
if fEditWidg = nil then exit;
@@ -521,7 +543,18 @@ begin
end;
procedure TCEMainForm.actFileCloseExecute(Sender: TObject);
+var
+ curr: TCESynMemo;
+ i: NativeInt;
begin
+ curr := fEditWidg.currentEditor;
+ if curr.modified then if dlgOkCancel(
+ 'The latest mdofifications are not saved, continue ?') = mrCancel
+ then exit;
+ //
+ for i := 0 to fWidgList.Count-1 do
+ fWidgList.widget[i].docClose(fEditWidg.editor[fEditWidg.editorIndex]);
+ //
fEditWidg.removeEditor(fEditWidg.editorIndex);
end;
@@ -539,7 +572,6 @@ begin
for fname in FileNames do
openFile(fname);
end;
-
{$ENDREGION}
{$REGION edit ******************************************************************}
@@ -663,6 +695,9 @@ begin
{$IFDEF DEBUG}{$WARNINGS ON}{$HINTS ON}{$ENDIF}
fEditWidg.editor[edIndex].Lines.SaveToFile(fname + '.d');
+ {$IFDEF RELEASE}
+ dmdProc.ShowWindow := swoHIDE;
+ {$ENDIF}
dmdproc.Options:= [poWaitOnExit, poStdErrToOutput, poUsePipes];
dmdproc.Executable:= 'dmd';
dmdproc.Parameters.Add(fname + '.d');
@@ -738,6 +773,9 @@ begin
prjpath := extractFilePath(aProject.fileName);
if directoryExists(prjpath) then chDir(prjpath);
+ {$IFDEF RELEASE}
+ dmdProc.ShowWindow := swoHIDE;
+ {$ENDIF}
dmdproc.Options :=
procopts[aProject.currentConfiguration.messagesOptions.verbose];
@@ -909,40 +947,43 @@ begin
fProject := TCEProject.Create(self);
for widg in WidgetList do widg.projNew(fProject);
fProject.onChange := @projChange;
- fProject.beforeChanged;
- fProject.afterChanged;
end;
procedure TCEMainForm.saveProj;
begin
- saveCompToTxtFile(fProject, fProject.fileName);
+ fProject.saveToFile(fProject.fileName);
end;
procedure TCEMainForm.saveProjAs(const aFilename: string);
begin
fProject.fileName := aFilename;
- saveCompToTxtFile(fProject, aFilename);
+ fProject.saveToFile(fProject.fileName);
end;
procedure TCEMainForm.openProj(const aFilename: string);
begin
closeProj;
newProj;
- fProject.beforeChanged;
- fProject.fileName := aFilename;
- loadCompFromTxtFile(fProject, aFilename);
- fProject.afterLoad;
- fProject.afterChanged;
+ fProject.loadFromFile(aFilename);
end;
procedure TCEMainForm.actProjNewExecute(Sender: TObject);
begin
+ if fProject <> nil then if fProject.modified then if dlgOkCancel(
+ 'The latest mdofifications are not saved, continue ?')
+ = mrCancel then exit;
+
closeProj;
newProj;
end;
procedure TCEMainForm.actProjCloseExecute(Sender: TObject);
begin
+ if fProject = nil then exit;
+ if fProject.modified then if dlgOkCancel(
+ 'The latest mdofifications are not saved, continue ?')
+ = mrCancel then exit;
+
closeProj;
end;
@@ -970,6 +1011,10 @@ end;
procedure TCEMainForm.actProjOpenExecute(Sender: TObject);
begin
+ if fProject <> nil then if fProject.modified then if dlgOkCancel(
+ 'The latest mdofifications are not saved, continue ?')
+ = mrCancel then exit;
+
with TOpenDialog.Create(nil) do
try
if execute then openProj(filename);
diff --git a/src/ce_projconf.lfm b/src/ce_projconf.lfm
index 9d426827..c7cb2518 100644
--- a/src/ce_projconf.lfm
+++ b/src/ce_projconf.lfm
@@ -1,24 +1,24 @@
inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
Left = 1160
- Height = 276
- Top = 723
- Width = 474
+ Height = 277
+ Top = 722
+ Width = 463
Caption = 'Project configuration'
- ClientHeight = 276
- ClientWidth = 474
+ ClientHeight = 277
+ ClientWidth = 463
inherited Back: TPanel
- Height = 276
- Width = 474
- ClientHeight = 276
- ClientWidth = 474
+ Height = 277
+ Width = 463
+ ClientHeight = 277
+ ClientWidth = 463
inherited Content: TPanel
- Height = 276
- Width = 474
- ClientHeight = 276
- ClientWidth = 474
+ Height = 277
+ Width = 463
+ ClientHeight = 277
+ ClientWidth = 463
object Tree: TTreeView[0]
Left = 4
- Height = 242
+ Height = 243
Hint = 'filter configuration elements'
Top = 30
Width = 150
@@ -53,19 +53,19 @@ inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
Left = 2
Height = 24
Top = 2
- Width = 470
+ Width = 459
Align = alTop
BorderSpacing.Around = 2
BevelOuter = bvNone
ClientHeight = 24
- ClientWidth = 470
+ ClientWidth = 459
TabOrder = 1
object selConf: TComboBox
Left = 0
Height = 23
Hint = 'select a configuration'
Top = 1
- Width = 379
+ Width = 368
Align = alClient
BorderSpacing.Top = 1
BorderSpacing.Right = 1
@@ -75,7 +75,7 @@ inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
TabOrder = 0
end
object btnAddConf: TSpeedButton
- Left = 380
+ Left = 369
Height = 24
Hint = 'add an empty configuration'
Top = 0
@@ -121,7 +121,7 @@ inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
ShowCaption = False
end
object btnDelConf: TSpeedButton
- Left = 410
+ Left = 399
Height = 24
Hint = 'remove selected configuration'
Top = 0
@@ -167,7 +167,7 @@ inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
ShowCaption = False
end
object btnCloneConf: TSpeedButton
- Left = 440
+ Left = 429
Height = 24
Hint = 'clone selected configuration'
Top = 0
@@ -215,15 +215,15 @@ inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
end
object Splitter1: TSplitter[2]
Left = 154
- Height = 248
+ Height = 249
Top = 28
Width = 5
end
object Grid: TTIPropertyGrid[3]
Left = 159
- Height = 242
+ Height = 243
Top = 30
- Width = 311
+ Width = 300
Align = alClient
BorderSpacing.Top = 4
BorderSpacing.Right = 4
diff --git a/src/ce_projconf.pas b/src/ce_projconf.pas
index 2dd1b0d5..2a112d81 100644
--- a/src/ce_projconf.pas
+++ b/src/ce_projconf.pas
@@ -32,7 +32,7 @@ type
fProj: TCEProject;
function getGridTarget: TPersistent;
protected
- procedure manualWidgetUpdate; override;
+ procedure UpdateByEvent; override;
public
constructor create(aOwner: TComponent); override;
procedure projNew(const aProject: TCEProject); override;
@@ -52,16 +52,16 @@ end;
procedure TCEProjectConfigurationWidget.projNew(const aProject: TCEProject);
begin
- beginManualWidgetUpdate;
+ beginUpdateByEvent;
fProj := aProject;
- endManualWidgetUpdate;
+ endUpdateByEvent;
end;
procedure TCEProjectConfigurationWidget.projChange(const aProject: TCEProject);
begin
- beginManualWidgetUpdate;
+ beginUpdateByEvent;
fProj := aProject;
- endManualWidgetUpdate;
+ endUpdateByEvent;
end;
procedure TCEProjectConfigurationWidget.projClose(const aProject: TCEProject);
@@ -74,12 +74,12 @@ end;
procedure TCEProjectConfigurationWidget.selConfChange(Sender: TObject);
begin
if fProj = nil then exit;
- if isManualUpdating then exit;
+ if Updating then exit;
if selConf.ItemIndex = -1 then exit;
//
- beginManualWidgetUpdate;
+ beginUpdateByEvent;
fProj.ConfigurationIndex := selConf.ItemIndex;
- endManualWidgetUpdate;
+ endUpdateByEvent;
end;
procedure TCEProjectConfigurationWidget.TreeChange(Sender: TObject;
@@ -102,11 +102,11 @@ begin
if fProj = nil then exit;
//
nme := '';
- beginManualWidgetUpdate;
+ beginUpdateByEvent;
cfg := fProj.addConfiguration;
if InputQuery('Configuration name', '', nme) then cfg.name := nme;
fProj.ConfigurationIndex := cfg.Index;
- endManualWidgetUpdate;
+ endUpdateByEvent;
end;
procedure TCEProjectConfigurationWidget.btnDelConfClick(Sender: TObject);
@@ -114,13 +114,13 @@ begin
if fProj = nil then exit;
if fProj.OptionsCollection.Count = 1 then exit;
//
- beginManualWidgetUpdate;
+ beginUpdateByEvent;
Grid.TIObject := nil;
Grid.Clear;
Invalidate;
fProj.OptionsCollection.Delete(selConf.ItemIndex);
fProj.ConfigurationIndex := 0;
- endManualWidgetUpdate;
+ endUpdateByEvent;
end;
procedure TCEProjectConfigurationWidget.btnCloneCurrClick(Sender: TObject);
@@ -131,13 +131,13 @@ begin
if fProj = nil then exit;
//
nme := '';
- beginManualWidgetUpdate;
+ beginUpdateByEvent;
src := fProj.currentConfiguration;
trg := fProj.addConfiguration;
trg.assign(src);
if InputQuery('Configuration name', '', nme) then trg.name := nme;
fProj.ConfigurationIndex := trg.Index;
- endManualWidgetUpdate;
+ endUpdateByEvent;
end;
function TCEProjectConfigurationWidget.getGridTarget: TPersistent;
@@ -159,7 +159,7 @@ begin
end;
end;
-procedure TCEProjectConfigurationWidget.manualWidgetUpdate;
+procedure TCEProjectConfigurationWidget.UpdateByEvent;
var
i: NativeInt;
begin
diff --git a/src/ce_project.pas b/src/ce_project.pas
index 0be60792..44e8e119 100644
--- a/src/ce_project.pas
+++ b/src/ce_project.pas
@@ -50,12 +50,14 @@ type
procedure addSource(const aFilename: string);
function addConfiguration: TCompilerConfiguration;
procedure getOpts(const aList: TStrings);
- procedure afterLoad;
+ procedure saveToFile(const aFilename: string);
+ procedure loadFromFile(const aFilename: string);
//
property configuration[ix: integer]: TCompilerConfiguration read getConfig;
property currentConfiguration: TCompilerConfiguration read getCurrConf;
property fileName: string read fFilename write setFname;
property onChange: TNotifyEvent read fOnChange write fOnChange;
+ property modified: boolean read fModified;
end;
implementation
@@ -71,6 +73,7 @@ begin
fSrcsCop := TStringList.Create;
fOptsColl := TCollection.create(TCompilerConfiguration);
reset;
+ fModified := false;
end;
destructor TCEProject.destroy;
@@ -140,11 +143,6 @@ begin
afterChanged;
end;
-procedure TCEProject.afterLoad;
-begin
- patchPlateformPaths(fSrcs);
-end;
-
procedure TCEProject.setConfIx(aValue: Integer);
begin
if fConfIx = aValue then exit;
@@ -225,6 +223,7 @@ begin
fSrcs.Clear;
fFilename := '';
afterChanged;
+ fModified := false;
end;
procedure TCEProject.getOpts(const aList: TStrings);
@@ -252,6 +251,21 @@ begin
result := expandFileNameEx(fBasePath, aFilename);
end;
+procedure TCEProject.saveToFile(const aFilename: string);
+begin
+ saveCompToTxtFile(self, aFilename);
+ fModified := false;
+end;
+
+procedure TCEProject.loadFromFile(const aFilename: string);
+begin
+ Filename := aFilename;
+ loadCompFromTxtFile(self, aFilename);
+ patchPlateformPaths(fSrcs);
+ doChanged;
+ fModified := false;
+end;
+
initialization
RegisterClasses([TCEProject]);
end.
diff --git a/src/ce_projinspect.lfm b/src/ce_projinspect.lfm
index 0c040a5b..d36d7936 100644
--- a/src/ce_projinspect.lfm
+++ b/src/ce_projinspect.lfm
@@ -1,28 +1,28 @@
inherited CEProjectInspectWidget: TCEProjectInspectWidget
- Left = 1641
- Height = 384
- Top = 89
- Width = 263
+ Left = 1640
+ Height = 383
+ Top = 90
+ Width = 264
AllowDropFiles = True
Caption = 'Project inspector'
- ClientHeight = 384
- ClientWidth = 263
+ ClientHeight = 383
+ ClientWidth = 264
OnDropFiles = FormDropFiles
inherited Back: TPanel
- Height = 384
- Width = 263
- ClientHeight = 384
- ClientWidth = 263
+ Height = 383
+ Width = 264
+ ClientHeight = 383
+ ClientWidth = 264
inherited Content: TPanel
- Height = 384
- Width = 263
- ClientHeight = 384
- ClientWidth = 263
+ Height = 383
+ Width = 264
+ ClientHeight = 383
+ ClientWidth = 264
object Tree: TTreeView[0]
Left = 2
- Height = 354
+ Height = 353
Top = 28
- Width = 259
+ Width = 260
Align = alClient
AutoExpand = True
BorderSpacing.Around = 2
@@ -44,12 +44,12 @@ inherited CEProjectInspectWidget: TCEProjectInspectWidget
Left = 2
Height = 24
Top = 2
- Width = 259
+ Width = 260
Align = alTop
BorderSpacing.Around = 2
BevelOuter = bvNone
ClientHeight = 24
- ClientWidth = 259
+ ClientWidth = 260
TabOrder = 1
object btnAddFile: TSpeedButton
Left = 0
@@ -190,12 +190,13 @@ inherited CEProjectInspectWidget: TCEProjectInspectWidget
end
object TreeFilterEdit1: TTreeFilterEdit
Left = 114
- Height = 20
- Top = 2
- Width = 143
- ButtonWidth = 30
+ Height = 23
+ Top = 0
+ Width = 114
+ ButtonWidth = 28
NumGlyphs = 1
- Align = alClient
+ Align = alCustom
+ Anchors = [akTop, akLeft, akRight]
BorderSpacing.Around = 2
MaxLength = 0
TabOrder = 0
diff --git a/src/ce_projinspect.pas b/src/ce_projinspect.pas
index 38c1ec5f..08214fe3 100644
--- a/src/ce_projinspect.pas
+++ b/src/ce_projinspect.pas
@@ -25,7 +25,7 @@ type
procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
procedure TreeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
protected
- procedure manualWidgetUpdate; override;
+ procedure UpdateByEvent; override;
private
fProject: TCEProject;
fFileNode, fConfNode: TTreeNode;
@@ -56,19 +56,19 @@ end;
procedure TCEProjectInspectWidget.projNew(const aProject: TCEProject);
begin
fProject := aProject;
- manualWidgetUpdate;
+ UpdateByEvent;
end;
procedure TCEProjectInspectWidget.projChange(const aProject: TCEProject);
begin
fProject := aProject;
- manualWidgetUpdate;
+ UpdateByEvent;
end;
procedure TCEProjectInspectWidget.projClose(const aProject: TCEProject);
begin
fProject := nil;
- manualWidgetUpdate;
+ UpdateByEvent;
end;
procedure TCEProjectInspectWidget.TreeKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
@@ -99,7 +99,7 @@ begin
begin
i := Tree.Selected.Index;
fProject.ConfigurationIndex := i;
- manualWidgetUpdate;
+ UpdateByEvent;
end;
end;
@@ -163,7 +163,7 @@ begin
fname := Tree.Selected.Text;
i := fProject.Sources.IndexOf(fname);
if i > -1 then fProject.Sources.Delete(i);
- manualWidgetUpdate;
+ UpdateByEvent;
end
end;
@@ -176,7 +176,7 @@ begin
for fname in Filenames do fProject.addSource(fname);
end;
-procedure TCEProjectInspectWidget.manualWidgetUpdate;
+procedure TCEProjectInspectWidget.UpdateByEvent;
var
src, conf: string;
itm: TTreeNode;
diff --git a/src/ce_staticexplorer.lfm b/src/ce_staticexplorer.lfm
index 9e6959d1..01f4db8b 100644
--- a/src/ce_staticexplorer.lfm
+++ b/src/ce_staticexplorer.lfm
@@ -1,47 +1,74 @@
inherited CEStaticExplorerWidget: TCEStaticExplorerWidget
- Left = 1569
- Height = 278
+ Left = 1640
+ Height = 276
+ Top = 721
+ Width = 261
Caption = 'Static explorer'
- ClientHeight = 278
+ ClientHeight = 276
+ ClientWidth = 261
inherited Back: TPanel
- Height = 278
- ClientHeight = 278
+ Height = 276
+ Width = 261
+ ClientHeight = 276
+ ClientWidth = 261
inherited Content: TPanel
- Height = 278
- ClientHeight = 278
+ Height = 276
+ Width = 261
+ ClientHeight = 276
+ ClientWidth = 261
object Tree: TTreeView[0]
Left = 4
- Height = 242
+ Height = 240
Top = 32
- Width = 324
+ Width = 253
Align = alClient
BorderSpacing.Around = 4
DefaultItemHeight = 18
+ ExpandSignType = tvestPlusMinus
HideSelection = False
+ Images = imgList
ReadOnly = True
ScrollBars = ssAutoBoth
+ SelectionColor = clActiveBorder
TabOrder = 0
+ OnDeletion = TreeDeletion
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
+ Items.Data = {
+ F9FFFFFF020009000000000000000000000000000000FFFFFFFF000000000000
+ 00000005000000416C6961730100000001000000FFFFFFFFFFFFFFFF00000000
+ 000000000007000000436C6173736573020000000200000002000000FFFFFFFF
+ 00000000000000000005000000456E756D730300000003000000FFFFFFFFFFFF
+ FFFF0000000000000000000800000046756E6374696F6E0400000004000000FF
+ FFFFFFFFFFFFFF00000000000000000007000000496D706F7274730500000005
+ 000000FFFFFFFFFFFFFFFF000000000000000000050000004D6978696E060000
+ 0006000000FFFFFFFFFFFFFFFF00000000000000000007000000537472756374
+ 730700000007000000FFFFFFFFFFFFFFFF000000000000000000090000005465
+ 6D706C617465730800000008000000FFFFFFFFFFFFFFFF000000000000000000
+ 080000005661726961626C65
+ }
+ TreeLineColor = 14671839
+ TreeLinePenStyle = psSolid
end
object Panel1: TPanel[1]
Left = 2
Height = 26
Top = 2
- Width = 328
+ Width = 257
Align = alTop
BorderSpacing.Around = 2
BevelOuter = bvNone
ClientHeight = 26
- ClientWidth = 328
+ ClientWidth = 257
TabOrder = 1
object TreeFilterEdit1: TTreeFilterEdit
Left = 2
- Height = 22
+ Height = 23
Top = 2
- Width = 324
+ Width = 226
ButtonWidth = 23
NumGlyphs = 1
- Align = alClient
+ Align = alCustom
+ Anchors = [akTop, akLeft, akRight]
BorderSpacing.Around = 2
MaxLength = 0
TabOrder = 0
@@ -50,4 +77,298 @@ inherited CEStaticExplorerWidget: TCEStaticExplorerWidget
end
end
end
+ object imgList: TImageList[2]
+ left = 32
+ Bitmap = {
+ 4C69090000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000000064646497626262FF616161FF626262FF6464649700000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00646464976F6E6EFFA6A5A4FFA9A8A9FFA6A5A4FF6D6E6EFF64646497FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00626363FFA7A5A5FF7D7B7AFF787675FF7D7B7AFFA7A5A5FF626363FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00626363FF8E8C8BFF767371FF767371FF767371FF8E8C8BFF626363FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00636464FF858381FF878481FF868381FF878481FF858381FF636464FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00585858AC6F6E6EFF95918FFF989492FF95918FFF6F6E6EFF585858ACFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000001E585858AC636363FF626263FF636363FF585858AC0000001EFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000000000001E0000003300000033000000330000001E00000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF0000000000B9851C97B78319FFB68217FFB78319FFB9851C9700000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00B9851C97C6922EFFECC482FFEFC886FFECC482FFC6912CFFB9851C97FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00B78319FFEEC684FFE5AA49FFE2A641FFE5AA49FFEEC684FFB78319FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00B78219FFEBB964FFE3A641FFE3A641FFE3A641FFEBB964FFB78219FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00B7841AFFEAB45CFFE9B45CFFE8B35BFFE9B45CFFEAB45CFFB7841AFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00A37519ACC5922FFFEDC074FFF1C47AFFEDC074FFC5922FFFA37519ACFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000001EA37519ACB78319FFB68218FFB78319FFA37519AC0000001EFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000000000001E0000003300000033000000330000001E00000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF0000000000008C4B97008A48FF008946FF008A48FF008C4B9700000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00008C4B97109F63FF74DAB7FF7ADEBDFF74DAB7FF109F63FF008C4B97FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00008A49FF66DAB4FF1EC68EFF16C388FF1EC68EFF66DAB4FF008A49FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00008948FF25CF99FF00C07FFF00BE7EFF00C07FFF25CF99FF008948FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00008A4AFF00C789FF00C88AFF00C689FF00C88AFF00C789FF008A4AFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00007B43AC009B5CFF00CE90FF00D194FF00CE90FF009B5CFF007B43ACFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000001E007B43AC008A4AFF008949FF008A4AFF007B43AC0000001EFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000000000001E0000003300000033000000330000001E00000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000002C70DC97296DDBFF286CDBFF296DDBFF2C70DC9700000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF002D70DC974083E7FF95C2FFFF9BC7FFFF95C2FFFF4081E7FF2D70DC97FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF002B6EDBFF8FC3FFFF5AA4FFFF53A1FFFF5AA4FFFF8FC3FFFF2B6EDBFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF002B6DDBFF65B2FFFF449EFFFF449DFFFF449EFFFF65B2FFFF2B6DDBFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF002D6FDBFF4FA9FFFF4FA9FFFF4EA7FFFF4FA9FFFF4FA9FFFF2D6FDBFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF002863C1AC387FE4FF56B2FFFF58B6FFFF56B2FFFF387FE4FF2863C1ACFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000001E2862C1AC2D6EDBFF2D6DDBFF2D6EDBFF2862C1AC0000001EFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000000000001E0000003300000033000000330000001E00000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000009A6BDC979968DBFF9968DBFF9968DBFF9A6BDC9700000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF009A6BDC97A17DE7FFC6BCFFFFC9C1FFFFC6BCFFFFA17DE7FF9A6BDC97FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF009A69DBFFC5BDFFFFAA9DFFFFA798FFFFAA9DFFFFC5BDFFFF9A69DBFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF009A68DBFFB3ACFFFFA396FFFFA396FFFFA396FFFFB3ACFFFF9A68DBFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF009A69DBFFACA5FFFFACA5FFFFABA3FFFFACA5FFFFACA5FFFF9A69DBFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00885EC1ACA17BE4FFB3B1FFFFB4B6FFFFB3B1FFFFA17BE4FF885EC1ACFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000001E885EC1AC9A69DBFF9A68DBFF9A69DBFF885EC1AC0000001EFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000000000001E0000003300000033000000330000001E00000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF0000000000AB499C97AA459AFFA94499FFAA459AFFAB499C9700000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00AB499C97B462AAFFD8B8D9FFDBBEDDFFD8B8D9FFB462AAFFAB499C97FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00AA469AFFDCB6DAFFCA91C9FFC78CC5FFCA91C9FFDCB6DAFFAA469AFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00A94699FFD69ED4FFCA83C7FFCA83C6FFCA83C7FFD69ED4FFA94699FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00AA489AFFD68ED1FFD68ED2FFD58DD1FFD68ED2FFD68ED1FFAA489AFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00964189ACB85CAAFFE195DAFFE499DEFFE195DAFFB85CAAFF964189ACFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000001E964189ACA94899FFA84799FFA94899FF964189AC0000001EFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000000000001E0000003300000033000000330000001E00000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF0000000000354CCD973249CCFF3148CBFF3249CCFF354CCD9700000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00354CCD97455DDBFF90A6FCFF95ACFFFF90A6FCFF445DDBFF354CCD97FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00334ACCFF90A5FDFF5A79FAFF5573F9FF5A79FAFF90A5FDFF334ACCFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00334ACBFF6D88FFFF4D6DFBFF4D6DFAFF4D6DFBFF6D88FFFF334ACBFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00354BCBFF5F7CFFFF607CFFFF5F7BFDFF607CFFFF5F7CFFFF354BCBFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF002F44B4AC425AD9FF6F88FFFF738CFFFF6F88FFFF425AD9FF2F44B4ACFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000001E2F44B4AC344BCBFF334ACAFF344BCBFF2F44B4AC0000001EFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000000000001E0000003300000033000000330000001E00000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000002CC1FF9729C0FFFF28C0FFFF29C0FFFF2CC1FF9700000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF002DC1FF9741C6FFFF96DCFFFF9CDDFFFF96DCFFFF41C5FFFF2DC1FF97FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF002AC0FFFF95DDFFFF62CDFFFF5CCBFFFF62CDFFFF95DDFFFF2AC0FFFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF002AC0FFFF75D7FFFF56CEFFFF56CEFFFF56CEFFFF75D7FFFF2AC0FFFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF002BC0FFFF68D8FFFF69D8FFFF68D8FFFF69D8FFFF68D8FFFF2BC0FFFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF0028AAE0AC3EC9FFFF76E0FFFF7BE2FFFF76E0FFFF3EC9FFFF28AAE0ACFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000001E28AAE0AC2BC0FFFF2ABFFFFF2BC0FFFF28AAE0AC0000001EFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000000000001E0000003300000033000000330000001E00000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF0000000000DADADA97D9D9DAFFD9D9D9FFD9D9DAFFDADADA9700000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00DADADA97DADADBFFE5E5E4FFE6E6E4FFE5E5E4FFDADAD9FFDADADA97FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00D9DADAFFE6E6E5FFDBDBD9FFDADAD8FFDBDBD9FFE6E6E5FFD9DADAFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00D9DADAFFE2E1E0FFDBDAD9FFDBDAD9FFDBDAD9FFE2E1E0FFD9DADAFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00D9DADAFFE2E1E0FFE3E2E0FFE2E1E0FFE3E2E0FFE2E1E0FFD9DADAFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00BFBFBFACDDDDDDFFE8E7E6FFE9E8E7FFE8E7E6FFDDDDDDFFBFBFBFACFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000001EBFBFBFACD9D9D9FFD9D9D9FFD9D9D9FFBFBFBFAC0000001EFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00000000000000001E0000003300000033000000330000001E00000000FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ end
end
diff --git a/src/ce_staticexplorer.pas b/src/ce_staticexplorer.pas
index a8d7cf1a..6e9a98a1 100644
--- a/src/ce_staticexplorer.pas
+++ b/src/ce_staticexplorer.pas
@@ -6,63 +6,222 @@ interface
uses
Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics,
- Dialogs, ExtCtrls, Menus, ComCtrls, ce_widget, jsonparser, fpjson;
+ Dialogs, ExtCtrls, Menus, ComCtrls, ce_widget, jsonparser, fpjson,
+ ce_synmemo, process;
type
{ TCEStaticExplorerWidget }
TCEStaticExplorerWidget = class(TCEWidget)
+ imgList: TImageList;
Panel1: TPanel;
Tree: TTreeView;
TreeFilterEdit1: TTreeFilterEdit;
+ procedure TreeDeletion(Sender: TObject; Node: TTreeNode);
private
+ fDoc: TCESynMemo;
+ ndAlias, ndClass, ndEnum, ndFunc: TTreeNode;
+ ndImp, ndMix, ndStruct, ndTmp, ndVar: TTreeNode;
+ procedure Rescan;
+ procedure TreeDblClick(Sender: TObject);
+ protected
+ procedure UpdateByDelay; override;
public
constructor create(aOwner: TComponent); override;
+ //
+ procedure docNew(const aDoc: TCESynMemo); override;
+ procedure docFocused(const aDoc: TCESynMemo); override;
+ procedure docChanged(const aDoc: TCESynMemo); override;
+ procedure docClose(const aDoc: TCESynMemo); override;
end;
implementation
{$R *.lfm}
-uses
- ce_jsoninfos;
-
constructor TCEStaticExplorerWidget.create(aOwner: TComponent);
-var
- rt, nd, mb: TTreeNode;
- infs: TDSourceInfos;
- mods: TDSourceInfos;
- dt: TJsonData;
- memberKind: TInfKind;
- i,j,k: Integer;
- membinfs: TDSourceInfos;
begin
inherited;
fID := 'ID_SEXPL';
//
- for i:= 0 to high(JSonInfos.fData) do
+ ndAlias := Tree.Items[0];
+ ndClass := Tree.Items[1];
+ ndEnum := Tree.Items[2];
+ ndFunc := Tree.Items[3];
+ ndImp := Tree.Items[4];
+ ndMix := Tree.Items[5];
+ ndStruct := Tree.Items[6];
+ ndTmp := Tree.Items[7];
+ ndVar := Tree.Items[8];
+ //
+ Tree.OnDblClick := @TreeDblClick;
+end;
+
+procedure TCEStaticExplorerWidget.docNew(const aDoc: TCESynMemo);
+begin
+end;
+
+procedure TCEStaticExplorerWidget.docFocused(const aDoc: TCESynMemo);
+begin
+ fDoc := aDoc;
+ beginUpdateByDelay;
+end;
+
+procedure TCEStaticExplorerWidget.docChanged(const aDoc: TCESynMemo);
+begin
+ if fDoc <> aDoc then exit;
+ beginUpdateByDelay;
+end;
+
+procedure TCEStaticExplorerWidget.docClose(const aDoc: TCESynMemo);
+begin
+ if fDoc <> aDoc then exit;
+ fDoc := nil;
+ beginUpdateByDelay;
+end;
+
+procedure TCEStaticExplorerWidget.UpdateByDelay;
+begin
+ Rescan;
+end;
+
+procedure TCEStaticExplorerWidget.TreeDeletion(Sender: TObject; Node: TTreeNode);
+begin
+ if (node.Data <> nil) then
+ FreeMem(node.Data)
+end;
+
+procedure TCEStaticExplorerWidget.TreeDblClick(Sender: TObject);
+var
+ line: Int64;
+begin
+ if fDoc = nil then exit;
+ if Tree.Selected = nil then exit;
+ if Tree.Selected.Data = nil then exit;
+ //
+ line := PInt64(Tree.Selected.Data)^;
+ fDoc.CaretY := line;
+ fDoc.SelectLine();
+end;
+
+procedure TCEStaticExplorerWidget.Rescan;
+var
+ dmdproc: TProcess;
+ lines: TStringList;
+ str: TMemoryStream;
+ prs: TJsonParser;
+ dat: TJsonData;
+ memb: TJsonData;
+ submemb: TJsonData;
+ jsf, scf: string;
+ ndCat: TTreeNode;
+ ln: PInt64;
+ nme: string;
+ i, j: NativeInt;
+begin
+ if ndAlias = nil then exit;
+
+ ndAlias.DeleteChildren;
+ ndClass.DeleteChildren;
+ ndEnum.DeleteChildren;
+ ndFunc.DeleteChildren;
+ ndImp.DeleteChildren;
+ ndMix.DeleteChildren;
+ ndStruct.DeleteChildren;
+ ndTmp.DeleteChildren;
+ ndVar.DeleteChildren;
+
+ if fDoc = nil then exit;
+ if fDoc.Lines.Count = 0 then exit;
+ subMemb := nil;
+ memb := nil;
+
+ // generate json
+ dmdproc := TProcess.Create(nil);
+ lines := TStringList.Create;
+ try
+ jsf := GetTempDir(false);
+ jsf += format('%.8X.json',[NativeUint(@dmdproc)]);
+ scf := GetTempDir(false);
+ scf += format('%.8X.d',[NativeUint(@dmdproc)]);
+ //
+ lines.Assign(fDoc.Lines);
+ lines.SaveToFile(scf);
+ //
+ dmdProc.ShowWindow := swoHIDE;
+ dmdproc.Options := [];
+ dmdproc.Executable := 'dmd';
+ dmdproc.Parameters.Add(scf);
+ dmdproc.Parameters.Add('-c');
+ dmdproc.Parameters.Add('-o-');
+ dmdproc.Parameters.Add('-X');
+ dmdproc.Parameters.Add('-Xf' + jsf );
+ dmdproc.Execute;
+ while dmdproc.Running do;
+ finally
+ i := dmdproc.ExitStatus;
+ dmdproc.Free;
+ lines.Free;
+ DeleteFile(scf);
+ end;
+
+ if i <> 0 then
+ exit;
+
+ // load json
+ str := TMemoryStream.Create;
+ try
+ str.LoadFromFile(jsf);
+ str.Position := 0;
+ prs := TJsonParser.Create(str);
+ try
+ dat := prs.Parse;
+ finally
+ prs.Free;
+ end;
+ finally
+ str.Free;
+ DeleteFile(jsf);
+ end;
+
+ // update tree
+ memb := dat.items[0].FindPath('members');
+ if memb <> nil then for i := 0 to memb.Count-1 do
begin
- mods := JSonInfos.getFileModule(i);
- for j := 0 to high(mods) do
- begin
-
- rt := Tree.Items.Add(nil, mods[j].infs);
-
- for memberKind in InfKindNonModule do
- begin
- membinfs := JSonInfos.getMembers(i, j, memberKind);
- nd := Tree.Items.AddChild(rt, InfKindStr[memberKind]);
- for k := 0 to high(membinfs) do
- begin
- mb := Tree.Items.AddChild(nd, membinfs[k].infs);
- mb.Data := @membinfs[k];
- end;
- end;
+ // category
+ ln := new(PInt64);
+ ln^ := memb.Items[i].GetPath('line').AsInt64;
+ nme := memb.Items[i].GetPath('name').AsString;
+ case memb.Items[i].GetPath('kind').AsString of
+ 'alias' :ndCat := Tree.Items.AddChildObject(ndAlias, nme, ln);
+ 'class' :ndCat := Tree.Items.AddChildObject(ndClass, nme, ln);
+ 'enum' :ndCat := Tree.Items.AddChildObject(ndEnum, nme, ln);
+ 'function':ndCat := Tree.Items.AddChildObject(ndFunc, nme, ln);
+ 'import' :ndCat := Tree.Items.AddChildObject(ndImp, nme, ln);
+ 'mixin' :ndCat := Tree.Items.AddChildObject(ndMix, nme, ln);
+ 'struct' :ndCat := Tree.Items.AddChildObject(ndStruct, nme, ln);
+ 'template':ndCat := Tree.Items.AddChildObject(ndTmp, nme, ln);
+ 'variable':ndCat := Tree.Items.AddChildObject(ndVar, nme, ln);
end;
+ // optional item members
+ submemb := memb.Items[i].FindPath('members');
+ if subMemb <> nil then for j := 0 to submemb.Count-1 do
+ begin
+ ln := new(PInt64);
+ ln^ := submemb.Items[j].GetPath('line').AsInt64;
+ nme := submemb.Items[j].GetPath('name').AsString;
+ Tree.Items.AddChildObject(ndCat, nme, ln);
+ end;
+
+ end;
+ if dat <> nil then
+ begin
+ dat.Clear;
+ dat.Free;
end;
end;
diff --git a/src/ce_widget.lfm b/src/ce_widget.lfm
index b333c192..eb1d964e 100644
--- a/src/ce_widget.lfm
+++ b/src/ce_widget.lfm
@@ -1,13 +1,14 @@
object CEWidget: TCEWidget
- Left = 1538
+ Left = 1159
Height = 121
- Top = 721
+ Top = 91
Width = 332
BorderIcons = [biMinimize, biMaximize]
Caption = 'CEWidget'
ClientHeight = 121
ClientWidth = 332
ShowHint = True
+ ShowInTaskBar = stNever
LCLVersion = '1.2.4.0'
object Back: TPanel
Left = 0
diff --git a/src/ce_widget.pas b/src/ce_widget.pas
index 967b7f46..aaadf8e2 100644
--- a/src/ce_widget.pas
+++ b/src/ce_widget.pas
@@ -7,7 +7,7 @@ interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, ExtCtrls,
AnchorDocking, AnchorDockStorage, ActnList, Menus,
- ce_widgettypes, ce_project;
+ ce_synmemo, ce_widgettypes, ce_project;
type
@@ -17,30 +17,52 @@ type
PTCEWidget = ^TCEWidget;
{ TCEWidget }
- TCEWidget = class(TForm, ICEContextualActions, ICEProjectMonitor)
+ TCEWidget = class(TForm, ICEContextualActions, ICEProjectMonitor, ICEMultiDocMonitor)
Content: TPanel;
Back: TPanel;
contextMenu: TPopupMenu;
private
- fAutoUpdater: TTimer;
- fAutoUpdating: boolean;
- fManuUpdating: boolean;
+ fUpdating: boolean;
+ fDelayDur: Integer;
+ fLoopInter: Integer;
+ fUpdaterAuto: TTimer;
+ fUpdaterDelay: TTimer;
fWidgUpdateCount: NativeInt;
- procedure autoUpdaterEvent(Sender: TObject);
+ procedure setDelayDur(aValue: Integer);
+ procedure setLoopInt(aValue: Integer);
+ procedure updaterAutoProc(Sender: TObject);
+ procedure updaterLatchProc(Sender: TObject);
protected
fID: string;
- fNeedAutoUpdate: boolean;
- procedure autoWidgetUpdate; virtual;
- procedure manualWidgetUpdate; virtual;
+ // a descendant overrides to implementi a periodic update.
+ procedure UpdateByLoop; virtual;
+ // a descendant overrides to implement an event driven update.
+ procedure UpdateByEvent; virtual;
+ // a descendant overrides to implement a delayed update event.
+ procedure UpdateByDelay; virtual;
published
property ID: string read fID write fID;
+ property updaterByLoopInterval: Integer read fLoopInter write setLoopInt;
+ property updaterByDelayDuration: Integer read fDelayDur write setDelayDur;
public
constructor create(aOwner: TComponent); override;
destructor destroy; override;
+ // restarts the wait period to the delayed update event.
+ // if not re-called during 'updaterByDelayDuration' ms then
+ // 'UpdateByDelay' is called once.
+ procedure beginUpdateByDelay;
+ // increments the updates count.
+ procedure beginUpdateByEvent;
+ // decrements the update count and call 'UpdateByEvent' if the
+ // counter value is null.
+ procedure endUpdateByEvent;
+ // immediate call the 'UpdateByEvent'
+ procedure forceUpdateByEvent;
//
- procedure beginManualWidgetUpdate;
- procedure endManualWidgetUpdate;
- procedure forceManualWidgetUpdate;
+ procedure docNew(const aDoc: TCESynMemo); virtual;
+ procedure docFocused(const aDoc: TCESynMemo); virtual;
+ procedure docChanged(const aDoc: TCESynMemo); virtual;
+ procedure docClose(const aDoc: TCESynMemo); virtual;
//
procedure projNew(const aProject: TCEProject); virtual;
procedure projChange(const aProject: TCEProject); virtual;
@@ -49,9 +71,8 @@ type
function contextName: string; virtual;
function contextActionCount: integer; virtual;
function contextAction(index: integer): TAction; virtual;
- //
- property isAutoUpdating: boolean read fAutoUpdating;
- property isManualUpdating: boolean read fManuUpdating;
+ // returns true if one of the three updater is processing.
+ property updating: boolean read fUpdating;
end;
(**
@@ -85,9 +106,15 @@ constructor TCEWidget.create(aOwner: TComponent);
begin
inherited;
fID := 'ID_XXXX';
- fAutoUpdater := TTimer.Create(self);
- fAutoUpdater.Interval := 50;
- fAutoUpdater.OnTimer := @autoUpdaterEvent;
+
+ fUpdaterAuto := TTimer.Create(self);
+ fUpdaterAuto.Interval := 70;
+ fUpdaterAuto.OnTimer := @updaterAutoProc;
+ fUpdaterDelay := TTimer.Create(self);
+
+ updaterByLoopInterval := 50;
+ updaterByDelayDuration := 1000;
+
DockMaster.MakeDockable(Self, true, true, true);
DockMaster.GetAnchorSite(Self).Header.HeaderPosition := adlhpTop;
end;
@@ -97,53 +124,76 @@ begin
inherited;
end;
-procedure TCEWidget.beginManualWidgetUpdate;
+procedure TCEWidget.setDelayDur(aValue: Integer);
+begin
+ if aValue < 100 then aValue := 100;
+ if fDelayDur = aValue then exit;
+ fDelayDur := aValue;
+ fUpdaterDelay.Interval := fDelayDur;
+end;
+
+procedure TCEWidget.setLoopInt(aValue: Integer);
+begin
+ if aValue < 30 then aValue := 30;
+ if fLoopInter = aValue then exit;
+ fLoopInter := aValue;
+ fUpdaterAuto.Interval := fLoopInter;
+end;
+
+procedure TCEWidget.beginUpdateByEvent;
begin
Inc(fWidgUpdateCount);
end;
-procedure TCEWidget.endManualWidgetUpdate;
+procedure TCEWidget.endUpdateByEvent;
begin
Dec(fWidgUpdateCount);
- if fWidgUpdateCount > 0 then
- begin
- {$IFDEF DEBUG}
- writeln('widget update count > 0');
- {$ENDIF}
- exit;
- end;
-
- fManuUpdating := true;
- manualWidgetUpdate;
- fManuUpdating := false;
+ if fWidgUpdateCount > 0 then exit;
+ fUpdating := true;
+ UpdateByEvent;
+ fUpdating := false;
fWidgUpdateCount := 0;
-
end;
-procedure TCEWidget.forceManualWidgetUpdate;
+procedure TCEWidget.forceUpdateByEvent;
begin
- fManuUpdating := true;
- manualWidgetUpdate;
- fManuUpdating := false;
+ fUpdating := true;
+ UpdateByEvent;
+ fUpdating := false;
+ fWidgUpdateCount := 0;
end;
-procedure TCEWidget.autoUpdaterEvent(Sender: TObject);
+procedure TCEWidget.beginUpdateByDelay;
begin
- if not fNeedAutoUpdate then exit;
- fAutoUpdating := true;
- try
- autoWidgetUpdate;
- finally
- fAutoUpdating := false;
- fNeedAutoUpdate := false;
- end;
+ fUpdaterDelay.Enabled := false;
+ fUpdaterDelay.Enabled := true;
+ fUpdaterDelay.OnTimer := @updaterLatchProc;
end;
-procedure TCEWidget.autoWidgetUpdate;
+procedure TCEWidget.updaterAutoProc(Sender: TObject);
+begin
+ fUpdating := true;
+ UpdateByLoop;
+ fUpdating := false;
+end;
+
+procedure TCEWidget.updaterLatchProc(Sender: TObject);
+begin
+ fUpdating := true;
+ UpdateByDelay;
+ fUpdating := false;
+ fUpdaterDelay.OnTimer := nil;
+end;
+
+procedure TCEWidget.UpdateByLoop;
begin
end;
-procedure TCEWidget.manualWidgetUpdate;
+procedure TCEWidget.UpdateByEvent;
+begin
+end;
+
+procedure TCEWidget.UpdateByDelay;
begin
end;
@@ -174,6 +224,22 @@ begin
result := nil;
end;
+procedure TCEWidget.docNew(const aDoc: TCESynMemo);
+begin
+end;
+
+procedure TCEWidget.docFocused(const aDoc: TCESynMemo);
+begin
+end;
+
+procedure TCEWidget.docChanged(const aDoc: TCESynMemo);
+begin
+end;
+
+procedure TCEWidget.docClose(const aDoc: TCESynMemo);
+begin
+end;
+
(*******************************************************************************
* TCEWidgetList
*)
diff --git a/src/ce_widgettypes.pas b/src/ce_widgettypes.pas
index 8f7163dd..2f9284ea 100644
--- a/src/ce_widgettypes.pas
+++ b/src/ce_widgettypes.pas
@@ -5,7 +5,7 @@ unit ce_widgettypes;
interface
uses
- Classes, SysUtils, actnList, ce_project;
+ Classes, SysUtils, actnList, ce_synmemo, ce_project;
type
@@ -13,8 +13,10 @@ type
* An implementer is informed when a new document is added, focused or closed.
*)
ICEMultiDocMonitor = interface
- procedure docChange(const aNewIndex: integer);
- procedure docClose(const aNewIndex: integer);
+ procedure docNew(const aDoc: TCESynMemo);
+ procedure docFocused(const aDoc: TCESynMemo);
+ procedure docChanged(const aDoc: TCESynMemo);
+ procedure docClose(const aDoc: TCESynMemo);
end;
(**