DEFINITION MODULE Handlers;
(*******************************************************************
Module Handlers (Version 1.0)
Copyright (c) 1997-2006 by Andreas Fischlin and ETH Zurich.
Purpose Management of event handlers which can be added and
removed to particular event classes (dynamic class) by
any number of clients and within a multilevel programming
environment.
Remarks Upon program termination handlers are automatically
removed if the program level to which they belong
is to be left. Note that whole classes are also
automatically removed as a whole when the program
level on which they have been instantiated is about
to be left.
Programming
o Design
Andreas Fischlin 22/01/1997
o Implementation
Andreas Fischlin 22/01/1997
ETH Zurich
Systems Ecology
CHN E 35.1
Universitaetstrasse 16
8092 Zurich
SWITZERLAND
URLs:
<mailto:RAMSES@env.ethz.ch>
<http://www.sysecol.ethz.ch>
<http://www.sysecol.ethz.ch/SimSoftware/RAMSES>
Last revision of definition: 04/03/1997 AF
*******************************************************************)
IMPORT SYSTEM;
TYPE
Object = SYSTEM.ADDRESS;
EventClass;
EventHandler = PROC;
ObjectEventHandler = PROCEDURE (Object);
EvtAcceptTester = PROCEDURE (): BOOLEAN;
DoForClassProc = PROCEDURE (EventClass,
CARDINAL (*level*));
DoForHandlerProc = PROCEDURE (EventHandler, ObjectEventHandler,
BOOLEAN (*hasObject*),
INTEGER (*priority*),
CARDINAL (*level*) );
CONST
topPriority = 0;
lowestPriority = MAX(INTEGER);
VAR
HandlersDone: BOOLEAN; (* read only *)
undeclaredClass: EventClass; (* read only *)
PROCEDURE DeclareEventClass(VAR class: EventClass);
PROCEDURE ClassExists(class: EventClass): BOOLEAN;
PROCEDURE RemoveEventClass(VAR class: EventClass);
PROCEDURE AddEventHandler (class: EventClass; newHdl: EventHandler;
priority: INTEGER);
PROCEDURE AddObjectEventHandler(class: EventClass; newHdl: ObjectEventHandler;
priority: INTEGER);
(* highest priority is 0, priorities < 0 are ignored and treated as 0 *)
PROCEDURE RemoveEventHandler(class: EventClass; oldHdl: EventHandler);
PROCEDURE RemoveObjectEventHandler(class: EventClass; oldHdl: ObjectEventHandler);
PROCEDURE ExecuteEventHandlers(class: EventClass; obj: Object;
whileNotAccepted: EvtAcceptTester;
minLevel, maxLevel: CARDINAL;
topPrio, lowPrio: INTEGER);
(*
Main messages sending routine executing all handlers
(methods) currently associated with the event class
class. As soon as a handler has definitely accepted an
event, procedure whileNotAccepted should return FALSE, so
that no more handlers are executed. If an event should
be passed on to all its handlers, simply return TRUE
unconditionally (see also procedure NotifyAll). Only
handlers with a subprogram level (see DMSystem) in range
[minLevel..maxLevel] and a priority in the range
[topPrio..lowPrio] are actually executed. All handlers
falling within a valid range are executed strictly in
sequence according to priority. Consequently, depending
on the level on which the handler has been added,
(sub)program levels may change during execution of this
routine. Handlers with an identical priority are
executed in reverse order of their declaration.
*)
PROCEDURE NotifyAll(): BOOLEAN;
(*
EvtAcceptTester provided for your convenience, returns
TRUE always
*)
PROCEDURE DoForAllClasses(cp: DoForClassProc);
PROCEDURE DoForAllHandlers(class: EventClass; hp: DoForHandlerProc);
END Handlers.