anchor.diff:    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
   
  
positive.code: end;
  {$ENDREGION}
  
  {$REGION TCELogMessageSubject --------------------------------------------------}
  function TCELogMessageSubject.acceptObserver(aObject: TObject): boolean;
  begin
    exit(aObject is ICELogMessageObserver);
  end;
  
  procedure subjLmFromString(aSubject: TCELogMessageSubject; const aValue: string;
    aData: Pointer; aCtxt: TCEAppMessageCtxt; aKind: TCEAppMessageKind);
  var
    i: Integer;
  begin
    with aSubject do for i:= 0 to fObservers.Count-1 do
      (fObservers.Items[i] as ICELogMessageObserver).lmFromString(aValue, aData, aCtxt, aKind);
  end;
  
  procedure subjLmClearByContext(aSubject: TCELogMessageSubject; aCtxt: TCEAppMessageCtxt);
  var
    i: Integer;
  begin
    with aSubject do for i:= 0 to fObservers.Count-1 do
      (fObservers.Items[i] as ICELogMessageObserver).lmClearByContext(aCtxt);
  end;
  
  
  procedure subjLmClearByData(aSubject: TCELogMessageSubject; aData: Pointer);
  var
    i: Integer;
  begin
    with aSubject do for i:= 0 to fObservers.Count-1 do
      (fObservers.Items[i] as ICELogMessageObserver).lmClearByData(aData);
  end;
  
  
  {$ENDREGION}
  end.
  
negative.code:   TCEAppMessageCtxt = (amcAll, amcEdit, amcProj, amcApp, amcMisc);
  
    (**
     * Single service given by the messages widget.
     * Client can retrieve the service instance in the EntityConnector.
     *)
    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;
  
  
    (**
     * Single service given by the process-input widget.
     * Client can retrieve the service instance in the EntityConnector.
     *)
    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;
  
  
  