This commit is contained in:
Basile Burg 2014-06-22 22:20:45 +02:00
parent ca50a3a51c
commit ae31885fe3
19 changed files with 846 additions and 360 deletions

View File

@ -201,19 +201,22 @@
<UnitName Value="ce_projinspect"/> <UnitName Value="ce_projinspect"/>
</Unit10> </Unit10>
<Unit11> <Unit11>
<Filename Value="..\src\ce_jsoninfos.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ce_jsoninfos"/>
</Unit11>
<Unit12>
<Filename Value="..\src\ce_project.pas"/> <Filename Value="..\src\ce_project.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="ce_project"/> <UnitName Value="ce_project"/>
</Unit12> </Unit11>
<Unit13> <Unit12>
<Filename Value="..\src\ce_widgettypes.pas"/> <Filename Value="..\src\ce_widgettypes.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="ce_widgettypes"/> <UnitName Value="ce_widgettypes"/>
</Unit12>
<Unit13>
<Filename Value="..\src\ce_staticexplorer.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="CEStaticExplorerWidget"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="ce_staticexplorer"/>
</Unit13> </Unit13>
</Units> </Units>
</ProjectOptions> </ProjectOptions>

View File

@ -8,8 +8,8 @@ uses
{$ENDIF}{$ENDIF} {$ENDIF}{$ENDIF}
Interfaces, Forms, lazcontrols, runtimetypeinfocontrols, ce_widget, Interfaces, Forms, lazcontrols, runtimetypeinfocontrols, ce_widget,
ce_dmdwrap, ce_common, ce_synmemo, ce_main, ce_messages, ce_editor, ce_dmdwrap, ce_common, ce_synmemo, ce_main, ce_messages, ce_editor,
ce_projinspect, ce_projconf, ce_jsoninfos, jsonparser, ce_project, ce_projinspect, ce_projconf, jsonparser, ce_project,
ce_widgettypes; ce_widgettypes, ce_staticexplorer;
{$R *.res} {$R *.res}

View File

@ -5,7 +5,7 @@ unit ce_common;
interface interface
uses uses
Classes, SysUtils, ActnList; Classes, SysUtils, ActnList, dialogs, forms;
(** (**
* Save a component with a readable aspect. * Save a component with a readable aspect.
@ -29,12 +29,17 @@ uses
(** (**
* Patches the directory separators from a string. * 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. * on another one.
*) *)
function patchPlateformPath(const aPath: string): string; function patchPlateformPath(const aPath: string): string;
procedure patchPlateformPaths(const sPaths: TStrings); procedure patchPlateformPaths(const sPaths: TStrings);
(**
* Ok/Cancel modal dialog
*)
function dlgOkCancel(const aMsg: string): TModalResult;
implementation implementation
@ -225,4 +230,11 @@ begin
end; end;
end; end;
function dlgOkCancel(const aMsg: string): TModalResult;
const
Btns = [mbOK,mbCancel];
begin
exit( MessageDlg('Coedit', aMsg, mtConfirmation, Btns, ''));
end;
end. end.

View File

@ -317,6 +317,7 @@ begin
fCurrIAttrib.Foreground := clBlack; fCurrIAttrib.Foreground := clBlack;
fCurrIAttrib.FrameEdges := sfeAround; fCurrIAttrib.FrameEdges := sfeAround;
fCurrIAttrib.FrameColor := clGray; fCurrIAttrib.FrameColor := clGray;
fCurrIAttrib.Background := cl3dlight;
fCommtAttrib.Style := [fsItalic]; fCommtAttrib.Style := [fsItalic];
fKeywdAttrib.Style := [fsBold]; fKeywdAttrib.Style := [fsBold];

View File

@ -1,7 +1,5 @@
inherited CEEditorWidget: TCEEditorWidget inherited CEEditorWidget: TCEEditorWidget
Left = 1159
Height = 382 Height = 382
Top = 91
Width = 465 Width = 465
Caption = 'Source editor' Caption = 'Source editor'
ClientHeight = 382 ClientHeight = 382

View File

@ -20,11 +20,11 @@ type
procedure PageControlChange(Sender: TObject); procedure PageControlChange(Sender: TObject);
procedure PageControlCloseTabClicked(Sender: TObject); procedure PageControlCloseTabClicked(Sender: TObject);
protected protected
procedure autoWidgetUpdate; override; procedure UpdateByDelay; override;
private private
// http://bugs.freepascal.org/view.php?id=26329 // http://bugs.freepascal.org/view.php?id=26329
fKeyChanged: boolean;
fSyncEdit: TSynPluginSyncroEdit; fSyncEdit: TSynPluginSyncroEdit;
procedure focusedEditorChanged;
procedure memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure memoChange(Sender: TObject); procedure memoChange(Sender: TObject);
@ -38,6 +38,7 @@ type
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
procedure addEditor; procedure addEditor;
procedure removeEditor(const aIndex: NativeInt); procedure removeEditor(const aIndex: NativeInt);
procedure focusedEditorChanged;
// //
property currentEditor: TCESynMemo read getCurrentEditor; property currentEditor: TCESynMemo read getCurrentEditor;
property editor[index: NativeInt]: TCESynMemo read getEditor; property editor[index: NativeInt]: TCESynMemo read getEditor;
@ -102,6 +103,9 @@ begin
md := getModuleName(curr.Lines); md := getModuleName(curr.Lines);
if md = '' then md := extractFileName(curr.fileName); if md = '' then md := extractFileName(curr.fileName);
pageControl.ActivePage.Caption := md; pageControl.ActivePage.Caption := md;
//
if pageControl.ActivePageIndex <> -1 then
mainForm.docFocusedNotify(Self, pageControl.ActivePageIndex);
end; end;
procedure TCEEditorWidget.PageControlChange(Sender: TObject); procedure TCEEditorWidget.PageControlChange(Sender: TObject);
@ -121,7 +125,6 @@ var
sheet: TTabSheet; sheet: TTabSheet;
memo: TCESynMemo; memo: TCESynMemo;
begin begin
fNeedAutoUpdate := true;
sheet := pageControl.AddTabSheet; sheet := pageControl.AddTabSheet;
memo := TCESynMemo.Create(sheet); memo := TCESynMemo.Create(sheet);
// //
@ -134,6 +137,7 @@ begin
memo.OnChange := @memoChange; memo.OnChange := @memoChange;
memo.OnMouseMove := @memoMouseMove; memo.OnMouseMove := @memoMouseMove;
// //
pageControl.ActivePage := sheet;
//http://bugs.freepascal.org/view.php?id=26320 //http://bugs.freepascal.org/view.php?id=26320
focusedEditorChanged; focusedEditorChanged;
end; end;
@ -151,34 +155,35 @@ end;
procedure TCEEditorWidget.memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TCEEditorWidget.memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin begin
fNeedAutoUpdate := true;
if (sender is TCESynMemo) then if (sender is TCESynMemo) then
identifierToD2Syn(TCESynMemo(Sender)); identifierToD2Syn(TCESynMemo(Sender));
fKeyChanged := true;
beginUpdateByDelay;
end; end;
procedure TCEEditorWidget.memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure TCEEditorWidget.memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin begin
fNeedAutoUpdate := true;
if (sender is TCESynMemo) then if (sender is TCESynMemo) then
identifierToD2Syn(TCESynMemo(Sender)); identifierToD2Syn(TCESynMemo(Sender));
beginUpdateByDelay;
end; end;
procedure TCEEditorWidget.memoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure TCEEditorWidget.memoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin begin
if ssLeft in Shift then if ssLeft in Shift then
fNeedAutoUpdate := true; beginUpdateByDelay;
end; end;
procedure TCEEditorWidget.memoChange(Sender: TObject); procedure TCEEditorWidget.memoChange(Sender: TObject);
var var
ed: TCESynMemo; ed: TCESynMemo;
begin begin
fNeedAutoUpdate := true;
ed := TCESynMemo(sender); ed := TCESynMemo(sender);
ed.modified := true; ed.modified := true;
beginUpdateByDelay;
end; end;
procedure TCEEditorWidget.autoWidgetUpdate; procedure TCEEditorWidget.UpdateByDelay;
const const
modstr: array[boolean] of string = ('...', 'MODIFIED'); modstr: array[boolean] of string = ('...', 'MODIFIED');
var var
@ -191,6 +196,10 @@ begin
editorStatus.Panels[1].Text := modstr[ed.modified]; editorStatus.Panels[1].Text := modstr[ed.modified];
editorStatus.Panels[2].Text := ed.fileName; editorStatus.Panels[2].Text := ed.fileName;
end; end;
//
if fKeyChanged then if editorIndex <> -1 then
mainForm.docChangeNotify(Self, editorIndex);
fKeyChanged := false;
end; end;
end. end.

View File

@ -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.

View File

@ -5,7 +5,8 @@ object CEMainForm: TCEMainForm
Width = 745 Width = 745
AllowDropFiles = True AllowDropFiles = True
Caption = 'Coedit' Caption = 'Coedit'
ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.Layout = cclTopToBottomThenLeftToRight
DockSite = True
Menu = mainMenu Menu = mainMenu
OnDropFiles = FormDropFiles OnDropFiles = FormDropFiles
OnShow = FormShow OnShow = FormShow

View File

@ -7,9 +7,9 @@ interface
uses uses
Classes, SysUtils, FileUtil, SynEditKeyCmds, SynHighlighterLFM, Forms, Classes, SysUtils, FileUtil, SynEditKeyCmds, SynHighlighterLFM, Forms,
AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg, Controls, Graphics, AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg, Controls, Graphics,
Dialogs, Menus, ActnList, ExtCtrls, process, Dialogs, Menus, ActnList, ExtCtrls, ComCtrls, process,
ce_jsoninfos, ce_common, ce_dmdwrap, ce_project, ce_synmemo, ce_common, ce_dmdwrap, ce_project, ce_synmemo, ce_widget, ce_messages,
ce_widget, ce_messages, ce_editor, ce_projinspect, ce_projconf, ce_staticexplorer; ce_editor, ce_projinspect, ce_projconf, ce_staticexplorer;
type type
@ -174,6 +174,8 @@ type
destructor destroy; override; destructor destroy; override;
// //
procedure openFile(const aFilename: string); 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 WidgetList: TCEWidgetList read fWidgList;
property MessageWidget: TCEMessagesWidget read fMesgWidg; property MessageWidget: TCEMessagesWidget read fMesgWidg;
@ -190,8 +192,6 @@ implementation
uses uses
SynMacroRecorder; SynMacroRecorder;
// TODO: warnings, OkCancel dialogs
{$REGION std comp methods ******************************************************} {$REGION std comp methods ******************************************************}
constructor TCEMainForm.create(aOwner: TComponent); constructor TCEMainForm.create(aOwner: TComponent);
var var
@ -206,13 +206,13 @@ begin
fEditWidg := TCEEditorWidget.create(nil); fEditWidg := TCEEditorWidget.create(nil);
fProjWidg := TCEProjectInspectWidget.create(nil); fProjWidg := TCEProjectInspectWidget.create(nil);
fPrjCfWidg:= TCEProjectConfigurationWidget.create(nil); fPrjCfWidg:= TCEProjectConfigurationWidget.create(nil);
//fStExpWidg:= TCEStaticExplorerWidget.create(nil); fStExpWidg:= TCEStaticExplorerWidget.create(nil);
fWidgList.addWidget(@fMesgWidg); fWidgList.addWidget(@fMesgWidg);
fWidgList.addWidget(@fEditWidg); fWidgList.addWidget(@fEditWidg);
fWidgList.addWidget(@fProjWidg); fWidgList.addWidget(@fProjWidg);
fWidgList.addWidget(@fPrjCfWidg); fWidgList.addWidget(@fPrjCfWidg);
//fWidgList.addWidget(@fStExpWidg); fWidgList.addWidget(@fStExpWidg);
for widg in fWidgList do widg.Show; for widg in fWidgList do widg.Show;
@ -373,8 +373,8 @@ begin
j += 1; j += 1;
end; end;
fEditWidg.editor[i].fileName := str; fEditWidg.editor[i].fileName := str;
fEditWidg.editor[i].modified := true; fEditWidg.editor[i].modified := false;
fEditWidg.PageControl.PageIndex := i; fEditWidg.focusedEditorChanged;
end; end;
function TCEMainForm.findFile(const aFilename: string): NativeInt; function TCEMainForm.findFile(const aFilename: string): NativeInt;
@ -403,12 +403,13 @@ begin
fEditWidg.addEditor; fEditWidg.addEditor;
fEditWidg.editor[i].Lines.LoadFromFile(aFilename); fEditWidg.editor[i].Lines.LoadFromFile(aFilename);
fEditWidg.editor[i].fileName := aFilename; fEditWidg.editor[i].fileName := aFilename;
fEditWidg.PageControl.PageIndex := i; fEditWidg.focusedEditorChanged;
end; end;
procedure TCEMainForm.saveFile(const edIndex: NativeInt); procedure TCEMainForm.saveFile(const edIndex: NativeInt);
var var
str: string; str: string;
i: NativeInt;
begin begin
if fEditWidg = nil then exit; if fEditWidg = nil then exit;
if edIndex >= fEditWidg.editorCount then exit; if edIndex >= fEditWidg.editorCount then exit;
@ -426,6 +427,9 @@ begin
finally finally
fEditWidg.editor[edIndex].modified := false; fEditWidg.editor[edIndex].modified := false;
end; end;
//
for i := 0 to fWidgList.Count-1 do
fWidgList.widget[i].docChanged(fEditWidg.editor[edIndex]);
end; end;
procedure TCEMainForm.saveFileAs(const edIndex: NativeInt; const aFilename: string); procedure TCEMainForm.saveFileAs(const edIndex: NativeInt; const aFilename: string);
@ -442,6 +446,24 @@ begin
end; end;
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); procedure TCEMainForm.actFileOpenExecute(Sender: TObject);
begin begin
if fEditWidg = nil then exit; if fEditWidg = nil then exit;
@ -521,7 +543,18 @@ begin
end; end;
procedure TCEMainForm.actFileCloseExecute(Sender: TObject); procedure TCEMainForm.actFileCloseExecute(Sender: TObject);
var
curr: TCESynMemo;
i: NativeInt;
begin 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); fEditWidg.removeEditor(fEditWidg.editorIndex);
end; end;
@ -539,7 +572,6 @@ begin
for fname in FileNames do for fname in FileNames do
openFile(fname); openFile(fname);
end; end;
{$ENDREGION} {$ENDREGION}
{$REGION edit ******************************************************************} {$REGION edit ******************************************************************}
@ -663,6 +695,9 @@ begin
{$IFDEF DEBUG}{$WARNINGS ON}{$HINTS ON}{$ENDIF} {$IFDEF DEBUG}{$WARNINGS ON}{$HINTS ON}{$ENDIF}
fEditWidg.editor[edIndex].Lines.SaveToFile(fname + '.d'); fEditWidg.editor[edIndex].Lines.SaveToFile(fname + '.d');
{$IFDEF RELEASE}
dmdProc.ShowWindow := swoHIDE;
{$ENDIF}
dmdproc.Options:= [poWaitOnExit, poStdErrToOutput, poUsePipes]; dmdproc.Options:= [poWaitOnExit, poStdErrToOutput, poUsePipes];
dmdproc.Executable:= 'dmd'; dmdproc.Executable:= 'dmd';
dmdproc.Parameters.Add(fname + '.d'); dmdproc.Parameters.Add(fname + '.d');
@ -738,6 +773,9 @@ begin
prjpath := extractFilePath(aProject.fileName); prjpath := extractFilePath(aProject.fileName);
if directoryExists(prjpath) then chDir(prjpath); if directoryExists(prjpath) then chDir(prjpath);
{$IFDEF RELEASE}
dmdProc.ShowWindow := swoHIDE;
{$ENDIF}
dmdproc.Options := dmdproc.Options :=
procopts[aProject.currentConfiguration.messagesOptions.verbose]; procopts[aProject.currentConfiguration.messagesOptions.verbose];
@ -909,40 +947,43 @@ begin
fProject := TCEProject.Create(self); fProject := TCEProject.Create(self);
for widg in WidgetList do widg.projNew(fProject); for widg in WidgetList do widg.projNew(fProject);
fProject.onChange := @projChange; fProject.onChange := @projChange;
fProject.beforeChanged;
fProject.afterChanged;
end; end;
procedure TCEMainForm.saveProj; procedure TCEMainForm.saveProj;
begin begin
saveCompToTxtFile(fProject, fProject.fileName); fProject.saveToFile(fProject.fileName);
end; end;
procedure TCEMainForm.saveProjAs(const aFilename: string); procedure TCEMainForm.saveProjAs(const aFilename: string);
begin begin
fProject.fileName := aFilename; fProject.fileName := aFilename;
saveCompToTxtFile(fProject, aFilename); fProject.saveToFile(fProject.fileName);
end; end;
procedure TCEMainForm.openProj(const aFilename: string); procedure TCEMainForm.openProj(const aFilename: string);
begin begin
closeProj; closeProj;
newProj; newProj;
fProject.beforeChanged; fProject.loadFromFile(aFilename);
fProject.fileName := aFilename;
loadCompFromTxtFile(fProject, aFilename);
fProject.afterLoad;
fProject.afterChanged;
end; end;
procedure TCEMainForm.actProjNewExecute(Sender: TObject); procedure TCEMainForm.actProjNewExecute(Sender: TObject);
begin begin
if fProject <> nil then if fProject.modified then if dlgOkCancel(
'The latest mdofifications are not saved, continue ?')
= mrCancel then exit;
closeProj; closeProj;
newProj; newProj;
end; end;
procedure TCEMainForm.actProjCloseExecute(Sender: TObject); procedure TCEMainForm.actProjCloseExecute(Sender: TObject);
begin begin
if fProject = nil then exit;
if fProject.modified then if dlgOkCancel(
'The latest mdofifications are not saved, continue ?')
= mrCancel then exit;
closeProj; closeProj;
end; end;
@ -970,6 +1011,10 @@ end;
procedure TCEMainForm.actProjOpenExecute(Sender: TObject); procedure TCEMainForm.actProjOpenExecute(Sender: TObject);
begin 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 with TOpenDialog.Create(nil) do
try try
if execute then openProj(filename); if execute then openProj(filename);

View File

@ -1,24 +1,24 @@
inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
Left = 1160 Left = 1160
Height = 276 Height = 277
Top = 723 Top = 722
Width = 474 Width = 463
Caption = 'Project configuration' Caption = 'Project configuration'
ClientHeight = 276 ClientHeight = 277
ClientWidth = 474 ClientWidth = 463
inherited Back: TPanel inherited Back: TPanel
Height = 276 Height = 277
Width = 474 Width = 463
ClientHeight = 276 ClientHeight = 277
ClientWidth = 474 ClientWidth = 463
inherited Content: TPanel inherited Content: TPanel
Height = 276 Height = 277
Width = 474 Width = 463
ClientHeight = 276 ClientHeight = 277
ClientWidth = 474 ClientWidth = 463
object Tree: TTreeView[0] object Tree: TTreeView[0]
Left = 4 Left = 4
Height = 242 Height = 243
Hint = 'filter configuration elements' Hint = 'filter configuration elements'
Top = 30 Top = 30
Width = 150 Width = 150
@ -53,19 +53,19 @@ inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
Left = 2 Left = 2
Height = 24 Height = 24
Top = 2 Top = 2
Width = 470 Width = 459
Align = alTop Align = alTop
BorderSpacing.Around = 2 BorderSpacing.Around = 2
BevelOuter = bvNone BevelOuter = bvNone
ClientHeight = 24 ClientHeight = 24
ClientWidth = 470 ClientWidth = 459
TabOrder = 1 TabOrder = 1
object selConf: TComboBox object selConf: TComboBox
Left = 0 Left = 0
Height = 23 Height = 23
Hint = 'select a configuration' Hint = 'select a configuration'
Top = 1 Top = 1
Width = 379 Width = 368
Align = alClient Align = alClient
BorderSpacing.Top = 1 BorderSpacing.Top = 1
BorderSpacing.Right = 1 BorderSpacing.Right = 1
@ -75,7 +75,7 @@ inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
TabOrder = 0 TabOrder = 0
end end
object btnAddConf: TSpeedButton object btnAddConf: TSpeedButton
Left = 380 Left = 369
Height = 24 Height = 24
Hint = 'add an empty configuration' Hint = 'add an empty configuration'
Top = 0 Top = 0
@ -121,7 +121,7 @@ inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
ShowCaption = False ShowCaption = False
end end
object btnDelConf: TSpeedButton object btnDelConf: TSpeedButton
Left = 410 Left = 399
Height = 24 Height = 24
Hint = 'remove selected configuration' Hint = 'remove selected configuration'
Top = 0 Top = 0
@ -167,7 +167,7 @@ inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
ShowCaption = False ShowCaption = False
end end
object btnCloneConf: TSpeedButton object btnCloneConf: TSpeedButton
Left = 440 Left = 429
Height = 24 Height = 24
Hint = 'clone selected configuration' Hint = 'clone selected configuration'
Top = 0 Top = 0
@ -215,15 +215,15 @@ inherited CEProjectConfigurationWidget: TCEProjectConfigurationWidget
end end
object Splitter1: TSplitter[2] object Splitter1: TSplitter[2]
Left = 154 Left = 154
Height = 248 Height = 249
Top = 28 Top = 28
Width = 5 Width = 5
end end
object Grid: TTIPropertyGrid[3] object Grid: TTIPropertyGrid[3]
Left = 159 Left = 159
Height = 242 Height = 243
Top = 30 Top = 30
Width = 311 Width = 300
Align = alClient Align = alClient
BorderSpacing.Top = 4 BorderSpacing.Top = 4
BorderSpacing.Right = 4 BorderSpacing.Right = 4

View File

@ -32,7 +32,7 @@ type
fProj: TCEProject; fProj: TCEProject;
function getGridTarget: TPersistent; function getGridTarget: TPersistent;
protected protected
procedure manualWidgetUpdate; override; procedure UpdateByEvent; override;
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
procedure projNew(const aProject: TCEProject); override; procedure projNew(const aProject: TCEProject); override;
@ -52,16 +52,16 @@ end;
procedure TCEProjectConfigurationWidget.projNew(const aProject: TCEProject); procedure TCEProjectConfigurationWidget.projNew(const aProject: TCEProject);
begin begin
beginManualWidgetUpdate; beginUpdateByEvent;
fProj := aProject; fProj := aProject;
endManualWidgetUpdate; endUpdateByEvent;
end; end;
procedure TCEProjectConfigurationWidget.projChange(const aProject: TCEProject); procedure TCEProjectConfigurationWidget.projChange(const aProject: TCEProject);
begin begin
beginManualWidgetUpdate; beginUpdateByEvent;
fProj := aProject; fProj := aProject;
endManualWidgetUpdate; endUpdateByEvent;
end; end;
procedure TCEProjectConfigurationWidget.projClose(const aProject: TCEProject); procedure TCEProjectConfigurationWidget.projClose(const aProject: TCEProject);
@ -74,12 +74,12 @@ end;
procedure TCEProjectConfigurationWidget.selConfChange(Sender: TObject); procedure TCEProjectConfigurationWidget.selConfChange(Sender: TObject);
begin begin
if fProj = nil then exit; if fProj = nil then exit;
if isManualUpdating then exit; if Updating then exit;
if selConf.ItemIndex = -1 then exit; if selConf.ItemIndex = -1 then exit;
// //
beginManualWidgetUpdate; beginUpdateByEvent;
fProj.ConfigurationIndex := selConf.ItemIndex; fProj.ConfigurationIndex := selConf.ItemIndex;
endManualWidgetUpdate; endUpdateByEvent;
end; end;
procedure TCEProjectConfigurationWidget.TreeChange(Sender: TObject; procedure TCEProjectConfigurationWidget.TreeChange(Sender: TObject;
@ -102,11 +102,11 @@ begin
if fProj = nil then exit; if fProj = nil then exit;
// //
nme := ''; nme := '';
beginManualWidgetUpdate; beginUpdateByEvent;
cfg := fProj.addConfiguration; cfg := fProj.addConfiguration;
if InputQuery('Configuration name', '', nme) then cfg.name := nme; if InputQuery('Configuration name', '', nme) then cfg.name := nme;
fProj.ConfigurationIndex := cfg.Index; fProj.ConfigurationIndex := cfg.Index;
endManualWidgetUpdate; endUpdateByEvent;
end; end;
procedure TCEProjectConfigurationWidget.btnDelConfClick(Sender: TObject); procedure TCEProjectConfigurationWidget.btnDelConfClick(Sender: TObject);
@ -114,13 +114,13 @@ begin
if fProj = nil then exit; if fProj = nil then exit;
if fProj.OptionsCollection.Count = 1 then exit; if fProj.OptionsCollection.Count = 1 then exit;
// //
beginManualWidgetUpdate; beginUpdateByEvent;
Grid.TIObject := nil; Grid.TIObject := nil;
Grid.Clear; Grid.Clear;
Invalidate; Invalidate;
fProj.OptionsCollection.Delete(selConf.ItemIndex); fProj.OptionsCollection.Delete(selConf.ItemIndex);
fProj.ConfigurationIndex := 0; fProj.ConfigurationIndex := 0;
endManualWidgetUpdate; endUpdateByEvent;
end; end;
procedure TCEProjectConfigurationWidget.btnCloneCurrClick(Sender: TObject); procedure TCEProjectConfigurationWidget.btnCloneCurrClick(Sender: TObject);
@ -131,13 +131,13 @@ begin
if fProj = nil then exit; if fProj = nil then exit;
// //
nme := ''; nme := '';
beginManualWidgetUpdate; beginUpdateByEvent;
src := fProj.currentConfiguration; src := fProj.currentConfiguration;
trg := fProj.addConfiguration; trg := fProj.addConfiguration;
trg.assign(src); trg.assign(src);
if InputQuery('Configuration name', '', nme) then trg.name := nme; if InputQuery('Configuration name', '', nme) then trg.name := nme;
fProj.ConfigurationIndex := trg.Index; fProj.ConfigurationIndex := trg.Index;
endManualWidgetUpdate; endUpdateByEvent;
end; end;
function TCEProjectConfigurationWidget.getGridTarget: TPersistent; function TCEProjectConfigurationWidget.getGridTarget: TPersistent;
@ -159,7 +159,7 @@ begin
end; end;
end; end;
procedure TCEProjectConfigurationWidget.manualWidgetUpdate; procedure TCEProjectConfigurationWidget.UpdateByEvent;
var var
i: NativeInt; i: NativeInt;
begin begin

View File

@ -50,12 +50,14 @@ type
procedure addSource(const aFilename: string); procedure addSource(const aFilename: string);
function addConfiguration: TCompilerConfiguration; function addConfiguration: TCompilerConfiguration;
procedure getOpts(const aList: TStrings); 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 configuration[ix: integer]: TCompilerConfiguration read getConfig;
property currentConfiguration: TCompilerConfiguration read getCurrConf; property currentConfiguration: TCompilerConfiguration read getCurrConf;
property fileName: string read fFilename write setFname; property fileName: string read fFilename write setFname;
property onChange: TNotifyEvent read fOnChange write fOnChange; property onChange: TNotifyEvent read fOnChange write fOnChange;
property modified: boolean read fModified;
end; end;
implementation implementation
@ -71,6 +73,7 @@ begin
fSrcsCop := TStringList.Create; fSrcsCop := TStringList.Create;
fOptsColl := TCollection.create(TCompilerConfiguration); fOptsColl := TCollection.create(TCompilerConfiguration);
reset; reset;
fModified := false;
end; end;
destructor TCEProject.destroy; destructor TCEProject.destroy;
@ -140,11 +143,6 @@ begin
afterChanged; afterChanged;
end; end;
procedure TCEProject.afterLoad;
begin
patchPlateformPaths(fSrcs);
end;
procedure TCEProject.setConfIx(aValue: Integer); procedure TCEProject.setConfIx(aValue: Integer);
begin begin
if fConfIx = aValue then exit; if fConfIx = aValue then exit;
@ -225,6 +223,7 @@ begin
fSrcs.Clear; fSrcs.Clear;
fFilename := ''; fFilename := '';
afterChanged; afterChanged;
fModified := false;
end; end;
procedure TCEProject.getOpts(const aList: TStrings); procedure TCEProject.getOpts(const aList: TStrings);
@ -252,6 +251,21 @@ begin
result := expandFileNameEx(fBasePath, aFilename); result := expandFileNameEx(fBasePath, aFilename);
end; 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 initialization
RegisterClasses([TCEProject]); RegisterClasses([TCEProject]);
end. end.

View File

@ -1,28 +1,28 @@
inherited CEProjectInspectWidget: TCEProjectInspectWidget inherited CEProjectInspectWidget: TCEProjectInspectWidget
Left = 1641 Left = 1640
Height = 384 Height = 383
Top = 89 Top = 90
Width = 263 Width = 264
AllowDropFiles = True AllowDropFiles = True
Caption = 'Project inspector' Caption = 'Project inspector'
ClientHeight = 384 ClientHeight = 383
ClientWidth = 263 ClientWidth = 264
OnDropFiles = FormDropFiles OnDropFiles = FormDropFiles
inherited Back: TPanel inherited Back: TPanel
Height = 384 Height = 383
Width = 263 Width = 264
ClientHeight = 384 ClientHeight = 383
ClientWidth = 263 ClientWidth = 264
inherited Content: TPanel inherited Content: TPanel
Height = 384 Height = 383
Width = 263 Width = 264
ClientHeight = 384 ClientHeight = 383
ClientWidth = 263 ClientWidth = 264
object Tree: TTreeView[0] object Tree: TTreeView[0]
Left = 2 Left = 2
Height = 354 Height = 353
Top = 28 Top = 28
Width = 259 Width = 260
Align = alClient Align = alClient
AutoExpand = True AutoExpand = True
BorderSpacing.Around = 2 BorderSpacing.Around = 2
@ -44,12 +44,12 @@ inherited CEProjectInspectWidget: TCEProjectInspectWidget
Left = 2 Left = 2
Height = 24 Height = 24
Top = 2 Top = 2
Width = 259 Width = 260
Align = alTop Align = alTop
BorderSpacing.Around = 2 BorderSpacing.Around = 2
BevelOuter = bvNone BevelOuter = bvNone
ClientHeight = 24 ClientHeight = 24
ClientWidth = 259 ClientWidth = 260
TabOrder = 1 TabOrder = 1
object btnAddFile: TSpeedButton object btnAddFile: TSpeedButton
Left = 0 Left = 0
@ -190,12 +190,13 @@ inherited CEProjectInspectWidget: TCEProjectInspectWidget
end end
object TreeFilterEdit1: TTreeFilterEdit object TreeFilterEdit1: TTreeFilterEdit
Left = 114 Left = 114
Height = 20 Height = 23
Top = 2 Top = 0
Width = 143 Width = 114
ButtonWidth = 30 ButtonWidth = 28
NumGlyphs = 1 NumGlyphs = 1
Align = alClient Align = alCustom
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Around = 2 BorderSpacing.Around = 2
MaxLength = 0 MaxLength = 0
TabOrder = 0 TabOrder = 0

View File

@ -25,7 +25,7 @@ type
procedure FormDropFiles(Sender: TObject; const FileNames: array of String); procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
procedure TreeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TreeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
protected protected
procedure manualWidgetUpdate; override; procedure UpdateByEvent; override;
private private
fProject: TCEProject; fProject: TCEProject;
fFileNode, fConfNode: TTreeNode; fFileNode, fConfNode: TTreeNode;
@ -56,19 +56,19 @@ end;
procedure TCEProjectInspectWidget.projNew(const aProject: TCEProject); procedure TCEProjectInspectWidget.projNew(const aProject: TCEProject);
begin begin
fProject := aProject; fProject := aProject;
manualWidgetUpdate; UpdateByEvent;
end; end;
procedure TCEProjectInspectWidget.projChange(const aProject: TCEProject); procedure TCEProjectInspectWidget.projChange(const aProject: TCEProject);
begin begin
fProject := aProject; fProject := aProject;
manualWidgetUpdate; UpdateByEvent;
end; end;
procedure TCEProjectInspectWidget.projClose(const aProject: TCEProject); procedure TCEProjectInspectWidget.projClose(const aProject: TCEProject);
begin begin
fProject := nil; fProject := nil;
manualWidgetUpdate; UpdateByEvent;
end; end;
procedure TCEProjectInspectWidget.TreeKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState); procedure TCEProjectInspectWidget.TreeKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
@ -99,7 +99,7 @@ begin
begin begin
i := Tree.Selected.Index; i := Tree.Selected.Index;
fProject.ConfigurationIndex := i; fProject.ConfigurationIndex := i;
manualWidgetUpdate; UpdateByEvent;
end; end;
end; end;
@ -163,7 +163,7 @@ begin
fname := Tree.Selected.Text; fname := Tree.Selected.Text;
i := fProject.Sources.IndexOf(fname); i := fProject.Sources.IndexOf(fname);
if i > -1 then fProject.Sources.Delete(i); if i > -1 then fProject.Sources.Delete(i);
manualWidgetUpdate; UpdateByEvent;
end end
end; end;
@ -176,7 +176,7 @@ begin
for fname in Filenames do fProject.addSource(fname); for fname in Filenames do fProject.addSource(fname);
end; end;
procedure TCEProjectInspectWidget.manualWidgetUpdate; procedure TCEProjectInspectWidget.UpdateByEvent;
var var
src, conf: string; src, conf: string;
itm: TTreeNode; itm: TTreeNode;

View File

@ -1,47 +1,74 @@
inherited CEStaticExplorerWidget: TCEStaticExplorerWidget inherited CEStaticExplorerWidget: TCEStaticExplorerWidget
Left = 1569 Left = 1640
Height = 278 Height = 276
Top = 721
Width = 261
Caption = 'Static explorer' Caption = 'Static explorer'
ClientHeight = 278 ClientHeight = 276
ClientWidth = 261
inherited Back: TPanel inherited Back: TPanel
Height = 278 Height = 276
ClientHeight = 278 Width = 261
ClientHeight = 276
ClientWidth = 261
inherited Content: TPanel inherited Content: TPanel
Height = 278 Height = 276
ClientHeight = 278 Width = 261
ClientHeight = 276
ClientWidth = 261
object Tree: TTreeView[0] object Tree: TTreeView[0]
Left = 4 Left = 4
Height = 242 Height = 240
Top = 32 Top = 32
Width = 324 Width = 253
Align = alClient Align = alClient
BorderSpacing.Around = 4 BorderSpacing.Around = 4
DefaultItemHeight = 18 DefaultItemHeight = 18
ExpandSignType = tvestPlusMinus
HideSelection = False HideSelection = False
Images = imgList
ReadOnly = True ReadOnly = True
ScrollBars = ssAutoBoth ScrollBars = ssAutoBoth
SelectionColor = clActiveBorder
TabOrder = 0 TabOrder = 0
OnDeletion = TreeDeletion
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw] 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 end
object Panel1: TPanel[1] object Panel1: TPanel[1]
Left = 2 Left = 2
Height = 26 Height = 26
Top = 2 Top = 2
Width = 328 Width = 257
Align = alTop Align = alTop
BorderSpacing.Around = 2 BorderSpacing.Around = 2
BevelOuter = bvNone BevelOuter = bvNone
ClientHeight = 26 ClientHeight = 26
ClientWidth = 328 ClientWidth = 257
TabOrder = 1 TabOrder = 1
object TreeFilterEdit1: TTreeFilterEdit object TreeFilterEdit1: TTreeFilterEdit
Left = 2 Left = 2
Height = 22 Height = 23
Top = 2 Top = 2
Width = 324 Width = 226
ButtonWidth = 23 ButtonWidth = 23
NumGlyphs = 1 NumGlyphs = 1
Align = alClient Align = alCustom
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Around = 2 BorderSpacing.Around = 2
MaxLength = 0 MaxLength = 0
TabOrder = 0 TabOrder = 0
@ -50,4 +77,298 @@ inherited CEStaticExplorerWidget: TCEStaticExplorerWidget
end end
end 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 end

View File

@ -6,63 +6,222 @@ interface
uses uses
Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics, 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 type
{ TCEStaticExplorerWidget } { TCEStaticExplorerWidget }
TCEStaticExplorerWidget = class(TCEWidget) TCEStaticExplorerWidget = class(TCEWidget)
imgList: TImageList;
Panel1: TPanel; Panel1: TPanel;
Tree: TTreeView; Tree: TTreeView;
TreeFilterEdit1: TTreeFilterEdit; TreeFilterEdit1: TTreeFilterEdit;
procedure TreeDeletion(Sender: TObject; Node: TTreeNode);
private 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 public
constructor create(aOwner: TComponent); override; 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; end;
implementation implementation
{$R *.lfm} {$R *.lfm}
uses
ce_jsoninfos;
constructor TCEStaticExplorerWidget.create(aOwner: TComponent); 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 begin
inherited; inherited;
fID := 'ID_SEXPL'; fID := 'ID_SEXPL';
// //
for i:= 0 to high(JSonInfos.fData) do ndAlias := Tree.Items[0];
begin ndClass := Tree.Items[1];
ndEnum := Tree.Items[2];
mods := JSonInfos.getFileModule(i); ndFunc := Tree.Items[3];
for j := 0 to high(mods) do ndImp := Tree.Items[4];
begin ndMix := Tree.Items[5];
ndStruct := Tree.Items[6];
rt := Tree.Items.Add(nil, mods[j].infs); ndTmp := Tree.Items[7];
ndVar := Tree.Items[8];
for memberKind in InfKindNonModule do //
begin Tree.OnDblClick := @TreeDblClick;
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;
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
// 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;
end; end;
if dat <> nil then
begin
dat.Clear;
dat.Free;
end; end;
end; end;

View File

@ -1,13 +1,14 @@
object CEWidget: TCEWidget object CEWidget: TCEWidget
Left = 1538 Left = 1159
Height = 121 Height = 121
Top = 721 Top = 91
Width = 332 Width = 332
BorderIcons = [biMinimize, biMaximize] BorderIcons = [biMinimize, biMaximize]
Caption = 'CEWidget' Caption = 'CEWidget'
ClientHeight = 121 ClientHeight = 121
ClientWidth = 332 ClientWidth = 332
ShowHint = True ShowHint = True
ShowInTaskBar = stNever
LCLVersion = '1.2.4.0' LCLVersion = '1.2.4.0'
object Back: TPanel object Back: TPanel
Left = 0 Left = 0

View File

@ -7,7 +7,7 @@ interface
uses uses
Classes, SysUtils, FileUtil, Forms, Controls, ExtCtrls, Classes, SysUtils, FileUtil, Forms, Controls, ExtCtrls,
AnchorDocking, AnchorDockStorage, ActnList, Menus, AnchorDocking, AnchorDockStorage, ActnList, Menus,
ce_widgettypes, ce_project; ce_synmemo, ce_widgettypes, ce_project;
type type
@ -17,30 +17,52 @@ type
PTCEWidget = ^TCEWidget; PTCEWidget = ^TCEWidget;
{ TCEWidget } { TCEWidget }
TCEWidget = class(TForm, ICEContextualActions, ICEProjectMonitor) TCEWidget = class(TForm, ICEContextualActions, ICEProjectMonitor, ICEMultiDocMonitor)
Content: TPanel; Content: TPanel;
Back: TPanel; Back: TPanel;
contextMenu: TPopupMenu; contextMenu: TPopupMenu;
private private
fAutoUpdater: TTimer; fUpdating: boolean;
fAutoUpdating: boolean; fDelayDur: Integer;
fManuUpdating: boolean; fLoopInter: Integer;
fUpdaterAuto: TTimer;
fUpdaterDelay: TTimer;
fWidgUpdateCount: NativeInt; fWidgUpdateCount: NativeInt;
procedure autoUpdaterEvent(Sender: TObject); procedure setDelayDur(aValue: Integer);
procedure setLoopInt(aValue: Integer);
procedure updaterAutoProc(Sender: TObject);
procedure updaterLatchProc(Sender: TObject);
protected protected
fID: string; fID: string;
fNeedAutoUpdate: boolean; // a descendant overrides to implementi a periodic update.
procedure autoWidgetUpdate; virtual; procedure UpdateByLoop; virtual;
procedure manualWidgetUpdate; 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 published
property ID: string read fID write fID; property ID: string read fID write fID;
property updaterByLoopInterval: Integer read fLoopInter write setLoopInt;
property updaterByDelayDuration: Integer read fDelayDur write setDelayDur;
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; 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 docNew(const aDoc: TCESynMemo); virtual;
procedure endManualWidgetUpdate; procedure docFocused(const aDoc: TCESynMemo); virtual;
procedure forceManualWidgetUpdate; procedure docChanged(const aDoc: TCESynMemo); virtual;
procedure docClose(const aDoc: TCESynMemo); virtual;
// //
procedure projNew(const aProject: TCEProject); virtual; procedure projNew(const aProject: TCEProject); virtual;
procedure projChange(const aProject: TCEProject); virtual; procedure projChange(const aProject: TCEProject); virtual;
@ -49,9 +71,8 @@ type
function contextName: string; virtual; function contextName: string; virtual;
function contextActionCount: integer; virtual; function contextActionCount: integer; virtual;
function contextAction(index: integer): TAction; virtual; function contextAction(index: integer): TAction; virtual;
// // returns true if one of the three updater is processing.
property isAutoUpdating: boolean read fAutoUpdating; property updating: boolean read fUpdating;
property isManualUpdating: boolean read fManuUpdating;
end; end;
(** (**
@ -85,9 +106,15 @@ constructor TCEWidget.create(aOwner: TComponent);
begin begin
inherited; inherited;
fID := 'ID_XXXX'; fID := 'ID_XXXX';
fAutoUpdater := TTimer.Create(self);
fAutoUpdater.Interval := 50; fUpdaterAuto := TTimer.Create(self);
fAutoUpdater.OnTimer := @autoUpdaterEvent; fUpdaterAuto.Interval := 70;
fUpdaterAuto.OnTimer := @updaterAutoProc;
fUpdaterDelay := TTimer.Create(self);
updaterByLoopInterval := 50;
updaterByDelayDuration := 1000;
DockMaster.MakeDockable(Self, true, true, true); DockMaster.MakeDockable(Self, true, true, true);
DockMaster.GetAnchorSite(Self).Header.HeaderPosition := adlhpTop; DockMaster.GetAnchorSite(Self).Header.HeaderPosition := adlhpTop;
end; end;
@ -97,53 +124,76 @@ begin
inherited; inherited;
end; 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 begin
Inc(fWidgUpdateCount); Inc(fWidgUpdateCount);
end; end;
procedure TCEWidget.endManualWidgetUpdate; procedure TCEWidget.endUpdateByEvent;
begin begin
Dec(fWidgUpdateCount); Dec(fWidgUpdateCount);
if fWidgUpdateCount > 0 then if fWidgUpdateCount > 0 then exit;
begin fUpdating := true;
{$IFDEF DEBUG} UpdateByEvent;
writeln('widget update count > 0'); fUpdating := false;
{$ENDIF}
exit;
end;
fManuUpdating := true;
manualWidgetUpdate;
fManuUpdating := false;
fWidgUpdateCount := 0; fWidgUpdateCount := 0;
end; end;
procedure TCEWidget.forceManualWidgetUpdate; procedure TCEWidget.forceUpdateByEvent;
begin begin
fManuUpdating := true; fUpdating := true;
manualWidgetUpdate; UpdateByEvent;
fManuUpdating := false; fUpdating := false;
fWidgUpdateCount := 0;
end; end;
procedure TCEWidget.autoUpdaterEvent(Sender: TObject); procedure TCEWidget.beginUpdateByDelay;
begin begin
if not fNeedAutoUpdate then exit; fUpdaterDelay.Enabled := false;
fAutoUpdating := true; fUpdaterDelay.Enabled := true;
try fUpdaterDelay.OnTimer := @updaterLatchProc;
autoWidgetUpdate;
finally
fAutoUpdating := false;
fNeedAutoUpdate := false;
end;
end; 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 begin
end; end;
procedure TCEWidget.manualWidgetUpdate; procedure TCEWidget.UpdateByEvent;
begin
end;
procedure TCEWidget.UpdateByDelay;
begin begin
end; end;
@ -174,6 +224,22 @@ begin
result := nil; result := nil;
end; 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 * TCEWidgetList
*) *)

View File

@ -5,7 +5,7 @@ unit ce_widgettypes;
interface interface
uses uses
Classes, SysUtils, actnList, ce_project; Classes, SysUtils, actnList, ce_synmemo, ce_project;
type type
@ -13,8 +13,10 @@ type
* An implementer is informed when a new document is added, focused or closed. * An implementer is informed when a new document is added, focused or closed.
*) *)
ICEMultiDocMonitor = interface ICEMultiDocMonitor = interface
procedure docChange(const aNewIndex: integer); procedure docNew(const aDoc: TCESynMemo);
procedure docClose(const aNewIndex: integer); procedure docFocused(const aDoc: TCESynMemo);
procedure docChanged(const aDoc: TCESynMemo);
procedure docClose(const aDoc: TCESynMemo);
end; end;
(** (**