From 918388e9ef6e47788a121a78f4de347068b0e5af Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Sun, 8 Jul 2018 13:52:32 +0200 Subject: [PATCH] Add IDE interface for observing the mini explorer allowing the symstring expander to update more smartly --- src/ce_interfaces.pas | 28 +++++++++++++++++++++++++++- src/ce_miniexplorer.pas | 4 ++++ src/ce_symstring.pas | 20 +++++++++++++------- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/ce_interfaces.pas b/src/ce_interfaces.pas index bd999912..92ec8915 100644 --- a/src/ce_interfaces.pas +++ b/src/ce_interfaces.pas @@ -186,6 +186,18 @@ type *) TCEEditableShortCutSubject = specialize TCECustomSubject; + (** + * Listen to mini explorer changes. Mostly made to prevent redundant updates + * of the symbolic string translater. + *) + ICEMiniExplorerObserver = interface(IObserverType) + ['ICEMiniExplorerObserver'] + procedure mnexDirectoryChanged(const directory: string); + end; + (** + * Mini-explorer implements this. + *) + TCEMiniExplorerSubject = specialize TCECustomSubject; // the option editor uses this value as a hint to display an option container. @@ -454,6 +466,11 @@ type procedure subjProjCompiling(aSubject: TCEProjectSubject; project: ICECommonProject);{$IFDEF RELEASE}inline;{$ENDIF} procedure subjProjCompiled(aSubject: TCEProjectSubject; project: ICECommonProject; success: boolean);{$IFDEF RELEASE}inline;{$ENDIF} + (** + * TCEMiniExplorerSubject primitives. + *) + procedure subjMnexDirectoryChanged(aSubject: TCEMiniExplorerSubject; const directory: string); {$IFDEF RELEASE}inline;{$ENDIF} + { Service getters: @@ -507,6 +524,16 @@ begin end; {$ENDREGION} +{$REGION TCEMiniExplorerSubject ------------------------------------------------} +procedure subjMnexDirectoryChanged(aSubject: TCEMiniExplorerSubject; const directory: string); +var + i: Integer; +begin + with aSubject do for i:= 0 to fObservers.Count-1 do + (fObservers[i] as ICEMiniExplorerObserver).mnexDirectoryChanged(directory); +end; +{$ENDREGION} + {$REGION TCEProjectSubject -----------------------------------------------------} procedure subjProjNew(aSubject: TCEProjectSubject; project: ICECommonProject); var @@ -555,7 +582,6 @@ begin with aSubject do for i:= 0 to fObservers.Count-1 do (fObservers[i] as ICEProjectObserver).projCompiled(project, success); end; - {$ENDREGION} {$REGION ICESingleService getters ----------------------------------------------} diff --git a/src/ce_miniexplorer.pas b/src/ce_miniexplorer.pas index 490f04ac..01c1b7b7 100644 --- a/src/ce_miniexplorer.pas +++ b/src/ce_miniexplorer.pas @@ -102,6 +102,7 @@ type procedure treeFoldersGetImageIndex(Sender: TObject; Node: TTreeNode); procedure treeFoldersGetSelectedIndex(Sender: TObject; Node: TTreeNode); private + fMnxSubj: TCEMiniExplorerSubject; fProj: ICECommonProject; fFreeProj: ICECommonProject; fFavorites: TStringList; @@ -363,12 +364,14 @@ begin free; end; + fMnxSubj:= TCEMiniExplorerSubject.Create; EntitiesConnector.addObserver(self); EntitiesConnector.addSingleService(self); end; destructor TCEMiniExplorerWidget.destroy; begin + fMnxSubj.free; EntitiesConnector.removeObserver(self); with TCEMiniExplorerOptions.create(nil) do try @@ -781,6 +784,7 @@ begin if treeFolders.Selected.isNil then exit; fLastFold := treeFolders.Path.extractFileDir; // trailing path sep + subjMnexDirectoryChanged(fMnxSubj, fLastFold); end; procedure TCEMiniExplorerWidget.treeFoldersDblClick(Sender: TObject); diff --git a/src/ce_symstring.pas b/src/ce_symstring.pas index 58c00af3..d7b91309 100644 --- a/src/ce_symstring.pas +++ b/src/ce_symstring.pas @@ -26,7 +26,7 @@ type * TCESymbolExpander is designed to expand Coedit symbolic strings, * using the information collected from several observer interfaces. *) - TCESymbolExpander = class(ICEDocumentObserver, ICEProjectObserver, ICESymStringExpander) + TCESymbolExpander = class(ICEDocumentObserver, ICEProjectObserver, ICESymStringExpander, ICEMiniExplorerObserver) private fProj: TCENativeProject; fProjInterface: ICECommonProject; @@ -35,19 +35,21 @@ type fExp: ICEExplorer; fSymbols: array[TCESymbol] of string; procedure updateSymbols; - // + procedure projNew(project: ICECommonProject); procedure projClosing(project: ICECommonProject); procedure projFocused(project: ICECommonProject); procedure projChanged(project: ICECommonProject); procedure projCompiling(project: ICECommonProject); procedure projCompiled(project: ICECommonProject; success: boolean); - // + procedure docNew(document: TCESynMemo); procedure docClosing(document: TCESynMemo); procedure docFocused(document: TCESynMemo); procedure docChanged(document: TCESynMemo); - // + + procedure mnexDirectoryChanged(const directory: string); + function singleServiceName: string; function expand(const value: string): string; public @@ -163,6 +165,11 @@ begin exit; fNeedUpdate := true; end; + +procedure TCESymbolExpander.mnexDirectoryChanged(const directory: string); +begin + fNeedUpdate := true; +end; {$ENDREGION} {$REGION Symbol things ---------------------------------------------------------} @@ -178,9 +185,8 @@ var const na = '``'; begin - //commented : mini explorer doesn't emitt notif, - //if not fNeedUpdate then - // exit; + if not fNeedUpdate then + exit; fNeedUpdate := false; hasNativeProj := fProj.isNotNil;