observers, use generic type to validate

This commit is contained in:
Basile Burg 2015-12-26 12:08:25 +01:00
parent 2d0b493783
commit e3831ac404
3 changed files with 22 additions and 68 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;