diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi index 9c6447e9..ba42b20c 100644 --- a/lazproj/coedit.lpi +++ b/lazproj/coedit.lpi @@ -132,7 +132,7 @@ - + @@ -147,6 +147,7 @@ + @@ -339,7 +340,6 @@ - @@ -349,6 +349,11 @@ + + + + + diff --git a/lazproj/coedit.lpr b/lazproj/coedit.lpr index 66bfb207..3d1f6b6f 100644 --- a/lazproj/coedit.lpr +++ b/lazproj/coedit.lpr @@ -9,7 +9,7 @@ uses Interfaces, Forms, lazcontrols, runtimetypeinfocontrols, ce_observer, ce_libman, ce_tools, ce_dcd, ce_main, ce_writableComponent, ce_options, ce_symstring, ce_staticmacro, ce_inspectors, LResources, ce_editoroptions, - ce_dockoptions, ce_shortcutseditor; + ce_dockoptions, ce_shortcutseditor, ce_mru; {$R *.res} diff --git a/src/ce_common.pas b/src/ce_common.pas index 1880f6b8..eb64cd4a 100644 --- a/src/ce_common.pas +++ b/src/ce_common.pas @@ -42,38 +42,6 @@ type {$ENDIF} end; - (** - * MRU list for strings - *) - TMRUList = class(TStringList) - private - fMaxCount: Integer; - fObj: TObject; - protected - fChecking: boolean; - procedure clearOutOfRange; - procedure setMaxCount(aValue: Integer); - function checkItem(const S: string): boolean; virtual; - procedure Put(Index: Integer; const S: string); override; - procedure InsertItem(Index: Integer; const S: string); override; - published - property maxCount: Integer read fMaxCount write setMaxCount; - public - constructor Create; - procedure Insert(Index: Integer; const S: string); override; - property objectTag: TObject read fObj write fObj; - end; - - (** - * MRU list for filenames - *) - TMRUFileList = class(TMRUList) - protected - function checkItem(const S: string): boolean; override; - public - procedure assign(src: TPersistent); override; - end; - (** * TProcess with assign() 'overriden'. *) @@ -318,81 +286,6 @@ begin WriteListEnd; end; -constructor TMRUList.Create; -begin - fMaxCount := 10; -end; - -procedure TMRUList.clearOutOfRange; -begin - while Count > fMaxCount do - delete(Count-1); -end; - -procedure TMRUList.setMaxCount(aValue: Integer); -begin - if aValue < 0 then - aValue := 0; - if fMaxCount = aValue then - exit; - fMaxCount := aValue; - clearOutOfRange; -end; - -function TMRUList.checkItem(const S: string): boolean; -var - i: NativeInt; -begin - i := indexOf(S); - if i = -1 then - exit(true); - if i = 0 then - exit(false); - if Count < 2 then - exit(false); - exchange(i, i-1); - exit( false); -end; - -procedure TMRUList.Put(Index: Integer; const S: string); -begin - if not (checkItem(S)) then - exit; - inherited; - clearOutOfRange; -end; - -procedure TMRUList.InsertItem(Index: Integer; const S: string); -begin - if not (checkItem(S)) then - exit; - inherited; - clearOutOfRange; -end; - -procedure TMRUList.Insert(Index: Integer; const S: string); -begin - if not (checkItem(S)) then - exit; - inherited; - clearOutOfRange; -end; - -procedure TMRUFileList.assign(src: TPersistent); -var - i: Integer; -begin - inherited; - for i := Count-1 downto 0 do - if not fileExists(Strings[i]) then - Delete(i); -end; - -function TMRUFileList.checkItem(const S: string): boolean; -begin - exit( inherited checkItem(S) and fileExists(S)); -end; - procedure saveCompToTxtFile(const aComp: TComponent; const aFilename: string); var str1, str2: TMemoryStream; @@ -951,7 +844,6 @@ end; initialization - RegisterClasses([TMRUList, TMRUFileList]); dExtList := TStringList.Create; dExtList.AddStrings(['.d', '.D', '.di', '.DI', '.Di', '.dI']); finalization diff --git a/src/ce_main.pas b/src/ce_main.pas index dd51a56b..41825f86 100644 --- a/src/ce_main.pas +++ b/src/ce_main.pas @@ -12,7 +12,7 @@ uses ce_widget, ce_messages, ce_interfaces, ce_editor, ce_projinspect, ce_projconf, ce_search, ce_miniexplorer, ce_libman, ce_libmaneditor, ce_todolist, ce_observer, ce_toolseditor, ce_procinput, ce_optionseditor,{$IFDEF WIN32} ce_cdbcmd,{$ENDIF} - ce_symlist; + ce_symlist, ce_mru; type @@ -187,8 +187,8 @@ type fScCollectCount: Integer; fUpdateCount: NativeInt; fProject: TCEProject; - fProjMru: TMruFileList; - fFileMru: TMruFileList; + fProjMru: TCEMRUProjectList; + fFileMru: TCEMRUDocumentList; fWidgList: TCEWidgetList; fMesgWidg: TCEMessagesWidget; fEditWidg: TCEEditorWidget; @@ -398,8 +398,8 @@ end; procedure TCEMainForm.InitMRUs; begin - fProjMru := TMruFileList.Create; - fFileMru := TMruFileList.Create; + fProjMru := TCEMRUProjectList.Create; + fFileMru := TCEMRUDocumentList.Create; fProjMru.objectTag := mnuItemMruProj; fFileMru.objectTag := mnuItemMruFile; fProjMru.OnChange := @mruChange; @@ -828,14 +828,14 @@ end; procedure TCEMainForm.mruChange(Sender: TObject); var - srcLst: TMruFileList; + srcLst: TCEMruFileList; trgMnu: TMenuItem; itm: TMenuItem; fname: string; clickTrg: TNotifyEvent; i: NativeInt; begin - srcLst := TMruFileList(Sender); + srcLst := TCEMruFileList(Sender); if srcLst = nil then exit; trgMnu := TMenuItem(srcLst.objectTag); if trgMnu = nil then exit; @@ -874,9 +874,9 @@ end; procedure TCEMainForm.mruClearClick(Sender: TObject); var - srcLst: TMruFileList; + srcLst: TCEMruFileList; begin - srcLst := TMruFileList(TmenuItem(Sender).Tag); + srcLst := TCEMruFileList(TmenuItem(Sender).Tag); if srcLst = nil then exit; // srcLst.Clear; @@ -1020,7 +1020,6 @@ end; procedure TCEMainForm.openFile(const aFilename: string); begin fMultidoc.openDocument(aFilename); - fFileMru.Insert(0, aFilename); end; procedure TCEMainForm.saveFile(aDocument: TCESynMemo); @@ -1093,7 +1092,6 @@ begin Filter := DdiagFilter; if execute then fDoc.saveToFile(filename); - fFileMru.Insert(0, filename); finally free; end; @@ -1610,7 +1608,6 @@ procedure TCEMainForm.saveProjAs(const aFilename: string); begin fProject.fileName := aFilename; fProject.saveToFile(fProject.fileName); - fProjMru.Insert(0,fProject.fileName); end; procedure TCEMainForm.openProj(const aFilename: string); @@ -1618,7 +1615,6 @@ begin closeProj; newProj; fProject.loadFromFile(aFilename); - fProjMru.Insert(0,aFilename); end; procedure TCEMainForm.mruProjItemClick(Sender: TObject); diff --git a/src/ce_mru.pas b/src/ce_mru.pas new file mode 100644 index 00000000..7ee538fb --- /dev/null +++ b/src/ce_mru.pas @@ -0,0 +1,205 @@ +unit ce_mru; + +{$I ce_defines.inc} + +interface + +uses + Classes, SysUtils, ce_interfaces, ce_observer, + ce_project, ce_synmemo; + +type + + (** + * 'Most Recently Used' list for strings. + *) + TCEMruList = class(TStringList) + private + fMaxCount: Integer; + fObj: TObject; + protected + fChecking: boolean; + procedure clearOutOfRange; + procedure setMaxCount(aValue: Integer); + function checkItem(const S: string): boolean; virtual; + procedure Put(Index: Integer; const S: string); override; + procedure InsertItem(Index: Integer; const S: string); override; + published + property maxCount: Integer read fMaxCount write setMaxCount; + public + constructor Create; virtual; + procedure Insert(Index: Integer; const S: string); override; + property objectTag: TObject read fObj write fObj; + end; + + (** + * MRU list for filenames. + *) + TCEMRUFileList = class(TCEMruList) + protected + function checkItem(const S: string): boolean; override; + public + procedure assign(src: TPersistent); override; + end; + + (** + * MRU list for D/text files. + * Insertion is automatic (ICEMultiDocObserver). + *) + TCEMRUDocumentList = class(TCEMRUFileList, ICEMultiDocObserver) + private + procedure docNew(aDoc: TCESynMemo); + procedure docFocused(aDoc: TCESynMemo); + procedure docChanged(aDoc: TCESynMemo); + procedure docClosing(aDoc: TCESynMemo); + public + constructor create; override; + end; + + (** + * MRU list for the ceodit projects. + * Insertion is automatic (ICEProjectObserver). + *) + TCEMRUProjectList = class(TCEMRUFileList, ICEProjectObserver) + private + procedure projNew(aProject: TCEProject); + procedure projChanged(aProject: TCEProject); + procedure projClosing(aProject: TCEProject); + procedure projFocused(aProject: TCEProject); + procedure projCompiling(aProject: TCEProject); + public + constructor create; override; + end; + +implementation + +constructor TCEMruList.Create; +begin + fMaxCount := 10; +end; + +procedure TCEMruList.clearOutOfRange; +begin + while Count > fMaxCount do + delete(Count-1); +end; + +procedure TCEMruList.setMaxCount(aValue: Integer); +begin + if aValue < 0 then + aValue := 0; + if fMaxCount = aValue then + exit; + fMaxCount := aValue; + clearOutOfRange; +end; + +function TCEMruList.checkItem(const S: string): boolean; +var + i: NativeInt; +begin + i := indexOf(S); + if i = -1 then + exit(true); + if i = 0 then + exit(false); + if Count < 2 then + exit(false); + exchange(i, i-1); + exit( false); +end; + +procedure TCEMruList.Put(Index: Integer; const S: string); +begin + if not (checkItem(S)) then + exit; + inherited; + clearOutOfRange; +end; + +procedure TCEMruList.InsertItem(Index: Integer; const S: string); +begin + if not (checkItem(S)) then + exit; + inherited; + clearOutOfRange; +end; + +procedure TCEMruList.Insert(Index: Integer; const S: string); +begin + if not (checkItem(S)) then + exit; + inherited; + clearOutOfRange; +end; + +procedure TCEMRUFileList.assign(src: TPersistent); +var + i: Integer; +begin + inherited; + for i := Count-1 downto 0 do + if not fileExists(Strings[i]) then + Delete(i); +end; + +function TCEMRUFileList.checkItem(const S: string): boolean; +begin + exit( inherited checkItem(S) and fileExists(S)); +end; + +constructor TCEMRUDocumentList.create; +begin + inherited; + EntitiesConnector.addObserver(self); +end; + +procedure TCEMRUDocumentList.docNew(aDoc: TCESynMemo); +begin +end; + +procedure TCEMRUDocumentList.docFocused(aDoc: TCESynMemo); +begin +end; + +procedure TCEMRUDocumentList.docChanged(aDoc: TCESynMemo); +begin +end; + +procedure TCEMRUDocumentList.docClosing(aDoc: TCESynMemo); +begin + if FileExists(aDoc.fileName) and (aDoc.fileName <> aDoc.tempFilename) then + Insert(0, aDoc.fileName); +end; + +constructor TCEMRUProjectList.create; +begin + inherited; + EntitiesConnector.addObserver(self); +end; + +procedure TCEMRUProjectList.projNew(aProject: TCEProject); +begin +end; + +procedure TCEMRUProjectList.projFocused(aProject: TCEProject); +begin +end; + +procedure TCEMRUProjectList.projChanged(aProject: TCEProject); +begin +end; + +procedure TCEMRUProjectList.projCompiling(aProject: TCEProject); +begin +end; + +procedure TCEMRUProjectList.projClosing(aProject: TCEProject); +begin + if FileExists(aProject.fileName) then + Insert(0, aProject.fileName); +end; + +initialization + RegisterClasses([TCEMRUList, TCEMRUFileList, TCEMRUProjectList, TCEMRUDocumentList]); +end. diff --git a/src/ce_procinput.pas b/src/ce_procinput.pas index 2e3c5642..f019ffe3 100644 --- a/src/ce_procinput.pas +++ b/src/ce_procinput.pas @@ -6,7 +6,8 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, - Menus, StdCtrls, ce_widget, process, ce_common, ce_interfaces, ce_observer; + Menus, StdCtrls, ce_widget, process, ce_common, ce_interfaces, ce_observer, + ce_mru; type TCEProcInputWidget = class(TCEWidget, ICEProcInputHandler) @@ -17,7 +18,7 @@ type procedure txtInpKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private fMruPos: Integer; - fMru: TMRUList; + fMru: TCEMRUList; fProc: TProcess; procedure sendInput; // @@ -44,7 +45,7 @@ uses constructor TCEProcInputWidget.create(aOwner: TComponent); begin inherited; - fMru := TMRUList.Create; + fMru := TCEMRUList.Create; fMru.maxCount := 25; EntitiesConnector.addSingleService(self); end; diff --git a/src/ce_search.pas b/src/ce_search.pas index 402a25a9..cef81836 100644 --- a/src/ce_search.pas +++ b/src/ce_search.pas @@ -6,8 +6,8 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, - Menus, StdCtrls, actnList, Buttons, SynEdit, SynEditSearch, SynEditTypes, ce_common, - ce_widget, ce_synmemo, ce_interfaces, ce_observer, SynEditHighlighter; + Menus, StdCtrls, actnList, Buttons, SynEdit, SynEditSearch, SynEditTypes, + ce_common, ce_mru, ce_widget, ce_synmemo, ce_interfaces, ce_observer; type @@ -38,7 +38,7 @@ type fReplaceWth: string; fActFindNext, fActReplaceNext: TAction; fActReplaceAll: TAction; - fSearchMru, fReplaceMru: TMruList; + fSearchMru, fReplaceMru: TCEMruList; fCancelAll: boolean; fHasSearched: boolean; fHasRestarted: boolean; @@ -92,8 +92,8 @@ begin btnReplace.Action := fActReplaceNext; btnReplaceAll.Action := fActReplaceAll; // - fSearchMru := TMruList.Create; - fReplaceMru:= TMruList.Create; + fSearchMru := TCEMruList.Create; + fReplaceMru:= TCEMruList.Create; // EntitiesConnector.addObserver(self); end;