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