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; (**