anchor.diff:    TCEAppMessageCtxt = (amcAll, amcEdit, amcProj, amcApp, amcMisc);
   
     (**
  -   * An implementer gets some log messages.
  -   * AData: either an editor or a project, according to aCtxt.
  -   *)
  -  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);
  -  end;
  -  (**
  -   * An implementer sends some log messages.
  -   *)
  -  TCELogMessageSubject = class(TCECustomSubject)
  -  protected
  -    function acceptObserver(aObject: TObject): boolean; override;
  +   * 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;
   
   
  
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: interface
  
  uses
    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
    ['ICESessionOptionsObserver']
      // persistent things are about to be saved.
      procedure sesoptBeforeSave;
      // persistent things can be declared to aFiler.
  