<> <> <> <> <> DIRECTORY UndoEvent USING [Change, Event, EventBody, SubEvent, SubEventBody, UndoProc]; UndoEventImpl: CEDAR PROGRAM EXPORTS UndoEvent = BEGIN OPEN UndoEvent; Create: PUBLIC PROC RETURNS [Event] = { RETURN [NEW[EventBody _ [subevents: NIL]]] }; Note: PUBLIC PROC [event: Event, undoProc: UndoProc, undoRef: REF Change] = { IF event = NIL THEN RETURN; event.subevents _ NEW[SubEventBody _ [next: event.subevents, undoProc: undoProc, undoRef: undoRef]] }; Undo: PUBLIC PROC [undoEvent: Event, currentEvent: Event _ NIL] = { <> <> sub: SubEvent; IF undoEvent=NIL THEN RETURN; sub _ undoEvent.subevents; undoEvent.subevents _ NIL; UNTIL sub=NIL DO sub.undoProc[sub.undoRef,currentEvent]; sub _ sub.next; ENDLOOP }; Reset: PUBLIC PROC [event: Event] = { IF event # NIL THEN event.subevents _ NIL }; Empty: PUBLIC PROC [event: Event] RETURNS [BOOL] = { RETURN [event=NIL OR event.subevents=NIL] }; END.