SingleService

- ICELogMessagerSubject converted to service; was an anti-pattern
- SingleService for the procinput widget
- Utility to get the service interfaces from the EntityConnector
This commit is contained in:
Basile Burg 2015-02-14 02:20:52 +01:00
parent 5aa4068990
commit f263fbdf54
1 changed files with 45 additions and 45 deletions

View File

@ -5,16 +5,17 @@ unit ce_interfaces;
interface interface
uses uses
Classes, SysUtils, actnList, menus, Classes, SysUtils, actnList, menus, process,
ce_synmemo, ce_project, ce_observer; ce_synmemo, ce_project, ce_observer;
type type
(** (**
* An implementer can save and load some stuffs on application start/quit * An implementer can save and load some stuffs on application start/quit
*) *)
ICESessionOptionsObserver = interface ICESessionOptionsObserver = interface
['ICEWidgetPersist'] ['ICESessionOptionsObserver']
// persistent things are about to be saved. // persistent things are about to be saved.
procedure sesoptBeforeSave; procedure sesoptBeforeSave;
// persistent things can be declared to aFiler. // persistent things can be declared to aFiler.
@ -147,24 +148,28 @@ type
TCEAppMessageCtxt = (amcAll, amcEdit, amcProj, amcApp, amcMisc); TCEAppMessageCtxt = (amcAll, amcEdit, amcProj, amcApp, amcMisc);
(** (**
* An implementer gets some log messages. * Single service given by the messages widget.
* AData: either an editor or a project, according to aCtxt. * Client can retrieve the service instance in the EntityConnector.
*) *)
ICELogMessageObserver = interface ICEMessagesDisplay = interface(ICESingleService)
['ICEMessage'] // display a message
// a TCELogMessageSubject sends a message based on a string. procedure message(const aValue: string; aData: Pointer; aCtxt: TCEAppMessageCtxt; aKind: TCEAppMessageKind);
procedure lmFromString(const aValue: string; aData: Pointer; aCtxt: TCEAppMessageCtxt; aKind: TCEAppMessageKind); // clear the messages related to the context aCtxt.
// a TCELogMessageSubject sends a clearing request based on a context. procedure clearByContext(aCtxt: TCEAppMessageCtxt);
procedure lmClearByContext(aCtxt: TCEAppMessageCtxt); // clear the messages related to the data aData.
// a TCELogMessageSubject sends a clearing request based on a data. procedure clearByData(aData: Pointer);
procedure lmClearByData(aData: Pointer);
end; end;
(** (**
* An implementer sends some log messages. * Single service given by the process-input widget.
* Client can retrieve the service instance in the EntityConnector.
*) *)
TCELogMessageSubject = class(TCECustomSubject) ICEProcInputHandler = interface(ICESingleService)
protected // add an entry to the list of process which can receive an user input
function acceptObserver(aObject: TObject): boolean; override; procedure addProcess(aProcess: TProcess);
// remove an entry
procedure removeProcess(aProcess: TProcess);
end; end;
@ -198,13 +203,17 @@ type
procedure subjSesOptsDeclareProperties(aSubject: TCESessionOptionsSubject; aFiler: TFiler);{$IFDEF RELEASE}inline;{$ENDIF} procedure subjSesOptsDeclareProperties(aSubject: TCESessionOptionsSubject; aFiler: TFiler);{$IFDEF RELEASE}inline;{$ENDIF}
procedure subjSesOptsAfterLoad(aSubject: TCESessionOptionsSubject); {$IFDEF RELEASE}inline;{$ENDIF} procedure subjSesOptsAfterLoad(aSubject: TCESessionOptionsSubject); {$IFDEF RELEASE}inline;{$ENDIF}
(**
* TCELogMessageSubject primitives. {
*) Services assignements:
procedure subjLmFromString(aSubject: TCELogMessageSubject; const aValue: string;
aData: Pointer; aCtxt: TCEAppMessageCtxt; aKind: TCEAppMessageKind); {$IFDEF RELEASE}inline;{$ENDIF} lazily get the interface of a service when needed or for a ponctual usage
procedure subjLmClearByContext(aSubject: TCELogMessageSubject; aCtxt: TCEAppMessageCtxt); {$IFDEF RELEASE}inline;{$ENDIF} }
procedure subjLmClearByData(aSubject: TCELogMessageSubject; aData: Pointer); {$IFDEF RELEASE}inline;{$ENDIF}
function getMessageDisplay(var obj: ICEMessagesDisplay): ICEMessagesDisplay; overload;
function getMessageDisplay: ICEMessagesDisplay;overload;
function getprocInputHandler(var obj: ICEProcInputHandler): ICEProcInputHandler;overload;
function getprocInputHandler: ICEProcInputHandler;overload;
implementation implementation
@ -339,38 +348,29 @@ begin
end; end;
{$ENDREGION} {$ENDREGION}
{$REGION TCELogMessageSubject --------------------------------------------------}
function TCELogMessageSubject.acceptObserver(aObject: TObject): boolean; function getMessageDisplay(var obj: ICEMessagesDisplay): ICEMessagesDisplay;
begin begin
exit(aObject is ICELogMessageObserver); if obj = nil then
obj := EntitiesConnector.getSingleService('ICEMessagesDisplay') as ICEMessagesDisplay;
exit(obj);
end; end;
procedure subjLmFromString(aSubject: TCELogMessageSubject; const aValue: string; function getMessageDisplay: ICEMessagesDisplay;
aData: Pointer; aCtxt: TCEAppMessageCtxt; aKind: TCEAppMessageKind);
var
i: Integer;
begin begin
with aSubject do for i:= 0 to fObservers.Count-1 do exit(EntitiesConnector.getSingleService('ICEMessagesDisplay') as ICEMessagesDisplay);
(fObservers.Items[i] as ICELogMessageObserver).lmFromString(aValue, aData, aCtxt, aKind);
end; end;
procedure subjLmClearByContext(aSubject: TCELogMessageSubject; aCtxt: TCEAppMessageCtxt); function getprocInputHandler(var obj: ICEProcInputHandler): ICEProcInputHandler;
var
i: Integer;
begin begin
with aSubject do for i:= 0 to fObservers.Count-1 do if obj = nil then
(fObservers.Items[i] as ICELogMessageObserver).lmClearByContext(aCtxt); obj := EntitiesConnector.getSingleService('ICEProcInputHandler') as ICEProcInputHandler;
exit(obj);
end; end;
function getprocInputHandler: ICEProcInputHandler;
procedure subjLmClearByData(aSubject: TCELogMessageSubject; aData: Pointer);
var
i: Integer;
begin begin
with aSubject do for i:= 0 to fObservers.Count-1 do exit(EntitiesConnector.getSingleService('ICEProcInputHandler') as ICEProcInputHandler);
(fObservers.Items[i] as ICELogMessageObserver).lmClearByData(aData);
end; end;
{$ENDREGION}
end. end.