mirror of https://gitlab.com/basile.b/dexed.git
observers, use generic type to validate
This commit is contained in:
parent
2d0b493783
commit
e3831ac404
|
@ -22,7 +22,7 @@ type
|
||||||
* Each project format has its own dedicated editors.
|
* Each project format has its own dedicated editors.
|
||||||
* A few common properties allow some generic operations whatever is the format.
|
* A few common properties allow some generic operations whatever is the format.
|
||||||
*)
|
*)
|
||||||
ICECommonProject = interface
|
ICECommonProject = interface(ISubjectType)
|
||||||
['ICECommonProject']
|
['ICECommonProject']
|
||||||
|
|
||||||
// general properties ------------------------------------------------------
|
// general properties ------------------------------------------------------
|
||||||
|
@ -90,7 +90,7 @@ type
|
||||||
(**
|
(**
|
||||||
* An implementer declares some actions on demand.
|
* An implementer declares some actions on demand.
|
||||||
*)
|
*)
|
||||||
ICEContextualActions = interface
|
ICEContextualActions = interface(ISubjectType)
|
||||||
['ICEContextualActions']
|
['ICEContextualActions']
|
||||||
// declares a context name for the actions
|
// declares a context name for the actions
|
||||||
function contextName: string;
|
function contextName: string;
|
||||||
|
@ -105,7 +105,7 @@ type
|
||||||
(**
|
(**
|
||||||
* An implementer is informed about the current file(s).
|
* An implementer is informed about the current file(s).
|
||||||
*)
|
*)
|
||||||
ICEMultiDocObserver = interface
|
ICEMultiDocObserver = interface(ISubjectType)
|
||||||
['ICEMultiDocObserver']
|
['ICEMultiDocObserver']
|
||||||
// aDoc has been created (empty, runnable, project source, ...).
|
// aDoc has been created (empty, runnable, project source, ...).
|
||||||
procedure docNew(aDoc: TCESynMemo);
|
procedure docNew(aDoc: TCESynMemo);
|
||||||
|
@ -119,17 +119,14 @@ type
|
||||||
(**
|
(**
|
||||||
* An implementer informs some ICEMultiDocObserver about the current file(s)
|
* An implementer informs some ICEMultiDocObserver about the current file(s)
|
||||||
*)
|
*)
|
||||||
TCEMultiDocSubject = class(TCECustomSubject)
|
TCEMultiDocSubject = specialize TCECustomSubject<ICEMultiDocObserver>;
|
||||||
protected
|
|
||||||
function acceptObserver(aObject: TObject): boolean; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(**
|
(**
|
||||||
* An implementer is informed about the current project(s).
|
* An implementer is informed about the current project(s).
|
||||||
*)
|
*)
|
||||||
ICEProjectObserver = interface
|
ICEProjectObserver = interface(ISubjectType)
|
||||||
['ICEProjectObserver']
|
['ICEProjectObserver']
|
||||||
// aProject has been created/opened
|
// aProject has been created/opened
|
||||||
procedure projNew(aProject: ICECommonProject);
|
procedure projNew(aProject: ICECommonProject);
|
||||||
|
@ -145,17 +142,14 @@ type
|
||||||
(**
|
(**
|
||||||
* An implementer informs some ICEProjectObserver about the current project(s)
|
* An implementer informs some ICEProjectObserver about the current project(s)
|
||||||
*)
|
*)
|
||||||
TCEProjectSubject = class(TCECustomSubject)
|
TCEProjectSubject = specialize TCECustomSubject<ICEProjectObserver>;
|
||||||
protected
|
|
||||||
function acceptObserver(aObject: TObject): boolean; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(**
|
(**
|
||||||
* An implementer can add a main menu entry.
|
* An implementer can add a main menu entry.
|
||||||
*)
|
*)
|
||||||
ICEMainMenuProvider = interface
|
ICEMainMenuProvider = interface(ISubjectType)
|
||||||
['ICEMainMenuProvider']
|
['ICEMainMenuProvider']
|
||||||
// item is a new mainMenu entry. item must be filled with the sub-items to be added.
|
// item is a new mainMenu entry. item must be filled with the sub-items to be added.
|
||||||
procedure menuDeclare(item: TMenuItem);
|
procedure menuDeclare(item: TMenuItem);
|
||||||
|
@ -165,10 +159,7 @@ type
|
||||||
(**
|
(**
|
||||||
* An implementer collects and updates its observers menus.
|
* An implementer collects and updates its observers menus.
|
||||||
*)
|
*)
|
||||||
TCEMainMenuSubject = class(TCECustomSubject)
|
TCEMainMenuSubject = specialize TCECustomSubject<ICEMainMenuProvider>;
|
||||||
protected
|
|
||||||
function acceptObserver(aObject: TObject): boolean; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -176,7 +167,7 @@ type
|
||||||
* An implementer declares some actions which have their own main menu entry and
|
* An implementer declares some actions which have their own main menu entry and
|
||||||
* whose shortcuts are automatically handled
|
* whose shortcuts are automatically handled
|
||||||
*)
|
*)
|
||||||
ICEActionProvider = interface
|
ICEActionProvider = interface(ISubjectType)
|
||||||
['ICEActionProvider']
|
['ICEActionProvider']
|
||||||
// the action handler will clear the references to the actions collected previously and start collecting if result.
|
// the action handler will clear the references to the actions collected previously and start collecting if result.
|
||||||
function actHandlerWantRecollect: boolean;
|
function actHandlerWantRecollect: boolean;
|
||||||
|
@ -190,17 +181,14 @@ type
|
||||||
(**
|
(**
|
||||||
* An implementer handles its observers actions.
|
* An implementer handles its observers actions.
|
||||||
*)
|
*)
|
||||||
TCEActionProviderSubject = class(TCECustomSubject)
|
TCEActionProviderSubject = specialize TCECustomSubject<ICEActionProvider>;
|
||||||
protected
|
|
||||||
function acceptObserver(aObject: TObject): boolean; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(**
|
(**
|
||||||
* An implementer can expose some customizable shortcuts to be edited in a dedicated widget.
|
* An implementer can expose some customizable shortcuts to be edited in a dedicated widget.
|
||||||
*)
|
*)
|
||||||
ICEEditableShortCut = interface
|
ICEEditableShortCut = interface(ISubjectType)
|
||||||
['ICEEditableShortCut']
|
['ICEEditableShortCut']
|
||||||
// a TCEEditableShortCutSubject will start to collect shortcuts if result
|
// a TCEEditableShortCutSubject will start to collect shortcuts if result
|
||||||
function scedWantFirst: boolean;
|
function scedWantFirst: boolean;
|
||||||
|
@ -212,10 +200,7 @@ type
|
||||||
(**
|
(**
|
||||||
* An implementer manages its observers shortcuts.
|
* An implementer manages its observers shortcuts.
|
||||||
*)
|
*)
|
||||||
TCEEditableShortCutSubject = class(TCECustomSubject)
|
TCEEditableShortCutSubject = specialize TCECustomSubject<ICEEditableShortCut>;
|
||||||
protected
|
|
||||||
function acceptObserver(aObject: TObject): boolean; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -227,7 +212,7 @@ type
|
||||||
(**
|
(**
|
||||||
* An implementer can expose some options to be edited in a dedicated widget.
|
* An implementer can expose some options to be edited in a dedicated widget.
|
||||||
*)
|
*)
|
||||||
ICEEditableOptions = interface
|
ICEEditableOptions = interface(ISubjectType)
|
||||||
['ICEEditableOptions']
|
['ICEEditableOptions']
|
||||||
// the widget wants the category.
|
// the widget wants the category.
|
||||||
function optionedWantCategory(): string;
|
function optionedWantCategory(): string;
|
||||||
|
@ -243,10 +228,7 @@ type
|
||||||
(**
|
(**
|
||||||
* An implementer displays its observers editable options.
|
* An implementer displays its observers editable options.
|
||||||
*)
|
*)
|
||||||
TCEEditableOptionsSubject = class(TCECustomSubject)
|
TCEEditableOptionsSubject = specialize TCECustomSubject<ICEEditableOptions>;
|
||||||
protected
|
|
||||||
function acceptObserver(aObject: TObject): boolean; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -377,11 +359,6 @@ type
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{$REGION TCEMultiDocSubject ----------------------------------------------------}
|
{$REGION TCEMultiDocSubject ----------------------------------------------------}
|
||||||
function TCEMultiDocSubject.acceptObserver(aObject: TObject): boolean;
|
|
||||||
begin
|
|
||||||
exit(aObject is ICEMultiDocObserver);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure subjDocNew(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
|
procedure subjDocNew(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
@ -416,11 +393,6 @@ end;
|
||||||
{$ENDREGION}
|
{$ENDREGION}
|
||||||
|
|
||||||
{$REGION TCEProjectSubject -----------------------------------------------------}
|
{$REGION TCEProjectSubject -----------------------------------------------------}
|
||||||
function TCEProjectSubject.acceptObserver(aObject: TObject): boolean;
|
|
||||||
begin
|
|
||||||
exit(aObject is ICEProjectObserver);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure subjProjNew(aSubject: TCEProjectSubject; aProj: ICECommonProject);
|
procedure subjProjNew(aSubject: TCEProjectSubject; aProj: ICECommonProject);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
@ -462,28 +434,6 @@ begin
|
||||||
end;
|
end;
|
||||||
{$ENDREGION}
|
{$ENDREGION}
|
||||||
|
|
||||||
{$REGION Misc subjects ---------------------------------------------------------}
|
|
||||||
function TCEMainMenuSubject.acceptObserver(aObject: TObject): boolean;
|
|
||||||
begin
|
|
||||||
exit(aObject is ICEMainMenuProvider);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TCEEditableShortCutSubject.acceptObserver(aObject: TObject): boolean;
|
|
||||||
begin
|
|
||||||
exit(aObject is ICEEditableShortCut);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TCEEditableOptionsSubject.acceptObserver(aObject: TObject): boolean;
|
|
||||||
begin
|
|
||||||
exit(aObject is ICEEditableOptions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TCEActionProviderSubject.acceptObserver(aObject: TObject): boolean;
|
|
||||||
begin
|
|
||||||
exit(aObject is ICEActionProvider);
|
|
||||||
end;
|
|
||||||
{$ENDREGION}
|
|
||||||
|
|
||||||
{$REGION ICESingleService getters ----------------------------------------------}
|
{$REGION ICESingleService getters ----------------------------------------------}
|
||||||
function getMessageDisplay(var obj: ICEMessagesDisplay): ICEMessagesDisplay;
|
function getMessageDisplay(var obj: ICEMessagesDisplay): ICEMessagesDisplay;
|
||||||
begin
|
begin
|
||||||
|
|
|
@ -68,15 +68,19 @@ type
|
||||||
procedure updateObservers;
|
procedure updateObservers;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// Base type for an interface that contains the methods of a subject.
|
||||||
|
ISubjectType = interface
|
||||||
|
end;
|
||||||
|
|
||||||
(**
|
(**
|
||||||
* Standard implementation of an ICESubject.
|
* Standard implementation of an ICESubject.
|
||||||
* Any descendant adds itself to the global EntitiesConnector.
|
* Any descendant adds itself to the global EntitiesConnector.
|
||||||
*)
|
*)
|
||||||
TCECustomSubject = class(ICESubject)
|
generic TCECustomSubject<T:ISubjectType> = class(ICESubject)
|
||||||
protected
|
protected
|
||||||
fObservers: TObjectList;
|
fObservers: TObjectList;
|
||||||
// test for a specific interface when adding an observer.
|
// test for a specific interface when adding an observer.
|
||||||
function acceptObserver(aObject: TObject): boolean; virtual;
|
function acceptObserver(aObject: TObject): boolean;
|
||||||
function getObserversCount: Integer;
|
function getObserversCount: Integer;
|
||||||
function getObserver(index: Integer): TObject;
|
function getObserver(index: Integer): TObject;
|
||||||
public
|
public
|
||||||
|
@ -242,7 +246,7 @@ end;
|
||||||
|
|
||||||
function TCECustomSubject.acceptObserver(aObject: TObject): boolean;
|
function TCECustomSubject.acceptObserver(aObject: TObject): boolean;
|
||||||
begin
|
begin
|
||||||
exit(False);
|
exit(aObject is T);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCECustomSubject.getObserversCount: Integer;
|
function TCECustomSubject.getObserversCount: Integer;
|
||||||
|
|
|
@ -106,7 +106,7 @@ type
|
||||||
fFocusForInput: boolean;
|
fFocusForInput: boolean;
|
||||||
fIdentifier: string;
|
fIdentifier: string;
|
||||||
fTempFileName: string;
|
fTempFileName: string;
|
||||||
fMultiDocSubject: TCECustomSubject;
|
fMultiDocSubject: TObject;
|
||||||
fDefaultFontSize: Integer;
|
fDefaultFontSize: Integer;
|
||||||
fPositions: TCESynMemoPositions;
|
fPositions: TCESynMemoPositions;
|
||||||
fMousePos: TPoint;
|
fMousePos: TPoint;
|
||||||
|
|
Loading…
Reference in New Issue