From 9e202f7c520a18545598e1e469b36b05c4eb7c28 Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Wed, 20 Aug 2014 23:13:04 +0200 Subject: [PATCH] refactored some classes with the new TWritableComponent class --- lazproj/coedit.lpi | 7 ++- lazproj/coedit.lpr | 2 +- src/ce_customtools.pas | 33 +----------- src/ce_libman.pas | 34 ++---------- src/ce_main.pas | 81 ++-------------------------- src/ce_project.pas | 33 ++++-------- src/ce_writablecomponent.pas | 101 +++++++++++++++++++++++++++++++++++ 7 files changed, 130 insertions(+), 161 deletions(-) create mode 100644 src/ce_writablecomponent.pas diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi index 450c7779..b8ea8b7e 100644 --- a/lazproj/coedit.lpi +++ b/lazproj/coedit.lpi @@ -135,7 +135,7 @@ - + @@ -286,6 +286,11 @@ + + + + + diff --git a/lazproj/coedit.lpr b/lazproj/coedit.lpr index e6dfed08..b3e3bee9 100644 --- a/lazproj/coedit.lpr +++ b/lazproj/coedit.lpr @@ -7,7 +7,7 @@ uses cthreads, {$ENDIF}{$ENDIF} Interfaces, Forms, lazcontrols, runtimetypeinfocontrols, - ce_dcd, ce_observer, ce_main; + ce_dcd, ce_observer, ce_main, ce_writableComponent; {$R *.res} diff --git a/src/ce_customtools.pas b/src/ce_customtools.pas index b8850ee0..ff446eac 100644 --- a/src/ce_customtools.pas +++ b/src/ce_customtools.pas @@ -6,7 +6,7 @@ unit ce_customtools; interface uses - Classes, SysUtils, process, ce_common; + Classes, SysUtils, process, ce_common, ce_writableComponent; type @@ -33,22 +33,16 @@ type procedure execute; end; - TCETools = class(TComponent) + TCETools = class(TWritableComponent) private fTools: TCollection; function getTool(index: Integer): TCEToolItem; procedure setTools(const aValue: TCollection); - procedure readerPropNoFound(Reader: TReader; Instance: TPersistent; - var PropName: string; IsPath: boolean; var Handled, Skip: Boolean); - procedure readerError(Reader: TReader; const Message: string; - var Handled: Boolean); published property tools: TCollection read fTools write setTools; public constructor create(aOwner: TComponent); override; destructor destroy; override; - procedure saveToFile(const aFilename: string); - procedure loadFromFile(const aFilename: string); // function addTool: TCEToolItem; property tool[index: integer]: TCEToolItem read getTool; @@ -125,29 +119,6 @@ begin result := TCEToolItem(fTools.Add); end; -procedure TCETools.readerPropNoFound(Reader: TReader; Instance: TPersistent; - var PropName: string; IsPath: boolean; var Handled, Skip: Boolean); -begin - Skip := true; - Handled := false; -end; - -procedure TCETools.readerError(Reader: TReader; const Message: string; - var Handled: Boolean); -begin - Handled := true; -end; - -procedure TCETools.loadFromFile(const aFilename: string); -begin - loadCompFromTxtFile(self, aFilename, @readerPropNoFound, @readerError); -end; - -procedure TCETools.saveToFile(const aFilename: string); -begin - saveCompToTxtFile(self, aFilename); -end; - initialization RegisterClasses([TCEToolItem, TCETools]); end. diff --git a/src/ce_libman.pas b/src/ce_libman.pas index 3ae5afe1..84e0ff76 100644 --- a/src/ce_libman.pas +++ b/src/ce_libman.pas @@ -6,7 +6,7 @@ unit ce_libman; interface uses - Classes, SysUtils, ce_common, ce_dcd; + Classes, SysUtils, ce_common, ce_writableComponent, ce_dcd; type @@ -28,14 +28,12 @@ type (** * Represents all the D libraries present on this system. *) - TLibraryManager = class(TComponent) + TLibraryManager = class(TWritableComponent) private fCol: TCollection; procedure setCol(const aValue: TCollection); - procedure readerPropNoFound(Reader: TReader; Instance: TPersistent; - var PropName: string; IsPath: boolean; var Handled, Skip: Boolean); - procedure readerError(Reader: TReader; const Message: string; - var Handled: Boolean); + protected + procedure afterLoad; override; published property libraries: TCollection read fCol write setCol; public @@ -45,9 +43,6 @@ type procedure getLibFiles(const someAliases, aList: TStrings); procedure getLibSources(const someAliases, aList: TStrings); // - procedure loadFromFile(const aFilename: string); - procedure saveToFile(const aFilename: string); - // procedure updateDCD; end; @@ -143,30 +138,11 @@ begin end; end; -procedure TLibraryManager.readerPropNoFound(Reader: TReader; Instance: TPersistent; - var PropName: string; IsPath: boolean; var Handled, Skip: Boolean); +procedure TLibraryManager.afterLoad; begin - Skip := true; - Handled := false; -end; - -procedure TLibraryManager.readerError(Reader: TReader; const Message: string; - var Handled: Boolean); -begin - Handled := true; -end; - -procedure TLibraryManager.loadFromFile(const aFilename: string); -begin - loadCompFromTxtFile(self, aFilename, @readerPropNoFound, @readerError); updateDCD; end; -procedure TLibraryManager.saveToFile(const aFilename: string); -begin - saveCompToTxtFile(self, aFilename); -end; - initialization registerClasses([TLibraryManager, TLibraryItem]); end. diff --git a/src/ce_main.pas b/src/ce_main.pas index 83b96de1..7c6ecc84 100644 --- a/src/ce_main.pas +++ b/src/ce_main.pas @@ -12,7 +12,7 @@ uses ce_common, ce_dmdwrap, ce_project, ce_dcd, ce_plugin, ce_synmemo, ce_widget, ce_messages, ce_interfaces, ce_editor, ce_projinspect, ce_projconf, ce_search, ce_staticexplorer, ce_miniexplorer, ce_libman, ce_libmaneditor, ce_customtools, - ce_observer; + ce_observer, ce_writableComponent; type @@ -26,20 +26,12 @@ type (** * Encapsulates the options in a writable component. *) - TCEOptions = class(TComponent) + TCEOptions = class(TWritableComponent) private fFileMru, fProjMru: TMruFileList; fLeft, FTop, fWidth, fHeight: Integer; - fErrorFlg: boolean; procedure setFileMru(aValue: TMruFileList); procedure setProjMru(aValue: TMruFileList); - procedure saveLayout(str: TStream); - procedure loadLayout(str: TStream); - // - procedure readerPropNoFound(Reader: TReader; Instance: TPersistent; - var PropName: string; IsPath: boolean; var Handled, Skip: Boolean); - procedure readerError(Reader: TReader; const Message: string; - var Handled: Boolean); published property APP_Left: Integer read fLeft write fLeft; property APP_Top: Integer read fTop write fTop; @@ -52,12 +44,8 @@ type constructor create(aOwner: TComponent); override; destructor destroy; override; procedure defineProperties(Filer: TFiler); override; - procedure saveToFile(const aFilename: string); - procedure loadFromFile(const aFilename: string); - procedure beforeSave; - procedure afterLoad; - // - property hasLoaded: boolean read fErrorFlg; + procedure beforeSave; override; + procedure afterLoad; override; end; { TCEMainForm } @@ -1707,20 +1695,6 @@ begin inherited; end; -procedure TCEOptions.readerPropNoFound(Reader: TReader; Instance: TPersistent; - var PropName: string; IsPath: boolean; var Handled, Skip: Boolean); -begin - Skip := true; - Handled := true; -end; - -procedure TCEOptions.readerError(Reader: TReader; const Message: string; - var Handled: Boolean); -begin - Handled := true; - fErrorFlg := false; -end; - procedure TCEOptions.setFileMru(aValue: TMruFileList); begin fFileMru.Assign(aValue); @@ -1731,39 +1705,6 @@ begin fProjMru.Assign(aValue); end; -procedure TCEOptions.saveLayout(str: TStream); -var - st: TXMLConfigStorage; - cf: TPropStorageXMLConfig; -begin - cf := TPropStorageXMLConfig.Create(nil); - st := TXMLConfigStorage.Create(cf); - try - DockMaster.SaveLayoutToConfig(st); - cf.SaveToStream(str); - str.Position := 0; - finally - st.Free; - cf.Free; - end; -end; - -procedure TCEOptions.loadLayout(str: TStream); -var - st: TXMLConfigStorage; - cf: TPropStorageXMLConfig; -begin - cf := TPropStorageXMLConfig.Create(nil); - st := TXMLConfigStorage.Create(cf); - try - cf.LoadFromStream(str); - DockMaster.LoadLayoutFromConfig(st,true); - finally - st.Free; - cf.Free; - end; -end; - procedure TCEOptions.defineProperties(Filer: TFiler); var i: NativeInt; @@ -1790,20 +1731,6 @@ begin CEMainForm.WidgetList.widget[i].beforeSave(nil); end; -procedure TCEOptions.saveToFile(const aFilename: string); -begin - fErrorFlg := true; - beforeSave; - ce_common.saveCompToTxtFile(self, aFilename); -end; - -procedure TCEOptions.loadFromFile(const aFilename: string); -begin - fErrorFlg := true; - loadCompFromTxtFile(self, aFilename, @readerPropNoFound, @readerError); - afterLoad; -end; - procedure TCEOptions.afterLoad; var i: NativeInt; diff --git a/src/ce_project.pas b/src/ce_project.pas index 2f5afdbf..8d470882 100644 --- a/src/ce_project.pas +++ b/src/ce_project.pas @@ -6,7 +6,8 @@ unit ce_project; interface uses - Classes, SysUtils, ce_common, ce_dmdwrap, ce_libman, ce_observer; + Classes, SysUtils, ce_common, ce_writableComponent ,ce_dmdwrap, ce_libman, + ce_observer; type @@ -18,12 +19,11 @@ type * * Basically it' s designed to provide the options for the dmd process. *) - TCEProject = class(TComponent) + TCEProject = class(TWritableComponent) private fOnChange: TNotifyEvent; fModified: boolean; fRootFolder: string; - fFilename: string; fBasePath: string; fLibAliases: TStringList; fOptsColl: TCollection; @@ -36,16 +36,17 @@ type procedure setLibAliases(const aValue: TStringList); procedure subMemberChanged(sender : TObject); procedure setOptsColl(const aValue: TCollection); - procedure setFname(const aValue: string); procedure setRoot(const aValue: string); procedure setSrcs(const aValue: TStringList); procedure setConfIx(aValue: Integer); function getConfig(const ix: integer): TCompilerConfiguration; function getCurrConf: TCompilerConfiguration; + protected + procedure afterSave; override; + procedure afterLoad; override; + procedure setFilename(const aValue: string); override; procedure readerPropNoFound(Reader: TReader; Instance: TPersistent; - var PropName: string; IsPath: boolean; var Handled, Skip: Boolean); - procedure readerError(Reader: TReader; const Message: string; - var Handled: Boolean); + var PropName: string; IsPath: boolean; var Handled, Skip: Boolean); override; published property RootFolder: string read fRootFolder write setRoot; property OptionsCollection: TCollection read fOptsColl write setOptsColl; @@ -64,14 +65,11 @@ type procedure addSource(const aFilename: string); function addConfiguration: TCompilerConfiguration; procedure getOpts(const aList: TStrings); - procedure saveToFile(const aFilename: string); - procedure loadFromFile(const aFilename: string); function outputFilename: string; // property libraryManager: TLibraryManager read fLibMan write fLibMan; 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; @@ -147,7 +145,7 @@ begin afterChanged; end; -procedure TCEProject.setFname(const aValue: string); +procedure TCEProject.setFilename(const aValue: string); var oldAbs, newRel, oldBase: string; i: NativeInt; @@ -341,16 +339,13 @@ begin result := expandFileNameEx(fBasePath, aFilename); end; -procedure TCEProject.saveToFile(const aFilename: string); +procedure TCEProject.afterSave; begin - saveCompToTxtFile(self, aFilename); fModified := false; end; -procedure TCEProject.loadFromFile(const aFilename: string); +procedure TCEProject.afterLoad; begin - Filename := aFilename; - loadCompFromTxtFile(self, aFilename, @readerPropNoFound, @readerError); patchPlateformPaths(fSrcs); doChanged; fModified := false; @@ -389,12 +384,6 @@ begin end; end; -procedure TCEProject.readerError(Reader: TReader; const Message: string; - var Handled: Boolean); -begin - Handled := true; -end; - initialization RegisterClasses([TCEProject]); end. diff --git a/src/ce_writablecomponent.pas b/src/ce_writablecomponent.pas new file mode 100644 index 00000000..0f96e46c --- /dev/null +++ b/src/ce_writablecomponent.pas @@ -0,0 +1,101 @@ +unit ce_writableComponent; + +{$MODE OBJFPC}{$H+} + +interface + +uses + Classes, SysUtils, ce_common; + +type + + (** + * The ancestor of classes which can be saved or reloaded to/from + * a text file. It's used each time some options or data have to + * persist from a cession to another. + *) + TWritableComponent = class(TComponent) + protected + fFilename: string; + fHasLoaded: boolean; + fHasSaved: boolean; + procedure setFilename(const aValue: string); virtual; + procedure beforeLoad; virtual; + procedure beforeSave; virtual; + procedure afterLoad; virtual; + procedure afterSave; virtual; + procedure readerPropNoFound(Reader: TReader; Instance: TPersistent; + var PropName: string; IsPath: boolean; var Handled, Skip: Boolean); virtual; + procedure readerError(Reader: TReader; const Message: string; + var Handled: Boolean); virtual; + public + procedure saveToFile(const aFilename: string); virtual; + procedure loadFromFile(const aFilename: string); virtual; + // + property Filename: string read fFilename write setFilename; + property hasLoaded: boolean read fHasLoaded; + property hasSaved: boolean read fHasSaved; + end; + +implementation + +procedure TWritableComponent.beforeSave; +begin +end; + +procedure TWritableComponent.beforeLoad; +begin +end; + +procedure TWritableComponent.afterLoad; +begin +end; + +procedure TWritableComponent.afterSave; +begin +end; + +procedure TWritableComponent.setFilename(const aValue: string); +begin + fFilename := aValue; +end; + +procedure TWritableComponent.readerPropNoFound(Reader: TReader; Instance: TPersistent; + var PropName: string; IsPath: boolean; var Handled, Skip: Boolean); +begin + Handled := true; + Skip := true; +end; + +procedure TWritableComponent.readerError(Reader: TReader; const Message: string; + var Handled: Boolean); +begin + Handled := true; + fHasLoaded := false; +end; + +procedure TWritableComponent.saveToFile(const aFilename: string); +begin + fHasSaved := true; + beforeSave; + try + saveCompToTxtFile(self, aFilename); + except + fHasSaved := false; + end; + setFilename(aFilename); + afterSave; +end; + +procedure TWritableComponent.loadFromFile(const aFilename: string); +begin + fHasLoaded := true; + beforeLoad; + setFilename(aFilename); + loadCompFromTxtFile(self, aFilename, @readerPropNoFound, @readerError); + afterLoad; +end; + +initialization + registerClasses([TWritableComponent]); +end.