home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / Chip_2004-07_cd1.bin / tema / aos / files / Oberon.exe / Oberon / Docu.exe / Docu / Reminders.Mod (.txt) < prev    next >
Oberon Text  |  2000-02-29  |  3KB  |  87 lines

  1. Oberon10.Scn.Fnt
  2. Syntax10.Scn.Fnt
  3. (* ETH Oberon, Copyright 2000 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
  4. Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
  5. MODULE Reminders; (** portable *)    (* jm 1.11.95 *)
  6.     IMPORT Attributes, Documents, Files, Gadgets, Oberon, Objects, Out;
  7.     (** Example of an object attached to a document. The object remembers
  8.     a message that is displayed in the log when the document is opened. *)
  9.     TYPE
  10.         Reminder* = POINTER TO ReminderDesc;
  11.         ReminderDesc* = RECORD (Gadgets.ObjDesc)
  12.             msg*: ARRAY 128 OF CHAR
  13.         END;
  14.     PROCEDURE Copy*(VAR M: Objects.CopyMsg; from, to: Reminder);
  15.     BEGIN
  16.         Gadgets.CopyObject(M, from, to);
  17.         to.msg := from.msg
  18.     END Copy;
  19.     PROCEDURE Handler* (obj: Objects.Object; VAR M: Objects.ObjMsg);
  20.         VAR obj0: Reminder;
  21.     BEGIN
  22.         WITH obj: Reminder DO
  23.             IF M IS Objects.AttrMsg THEN
  24.                 WITH M: Objects.AttrMsg DO
  25.                     IF (M.id = Objects.get) & (M.name = "Gen") THEN
  26.                         M.class := Objects.String; COPY("Reminders.New", M.s); M.res := 0
  27.                     ELSE Gadgets.objecthandle(obj, M)
  28.                     END
  29.                 END
  30.             ELSIF M IS Objects.CopyMsg THEN
  31.                 WITH M: Objects.CopyMsg DO
  32.                     IF M.stamp = obj.stamp THEN M.obj := obj.dlink    (* copy msg arrives again *)
  33.                     ELSE (* first time copy message arrives *)
  34.                         NEW(obj0); obj.stamp := M.stamp; obj.dlink := obj0; Copy(M, obj, obj0);
  35.                         M.obj := obj0
  36.                     END
  37.                 END
  38.             ELSIF M IS Objects.FileMsg THEN
  39.                 WITH M: Objects.FileMsg DO
  40.                     IF M.id = Objects.store THEN Files.WriteString(M.R, obj.msg)
  41.                     ELSIF M.id = Objects.load THEN Files.ReadString(M.R, obj.msg)
  42.                     END;
  43.                     Gadgets.objecthandle(obj, M)
  44.                 END
  45.             ELSIF M IS Gadgets.CmdMsg THEN (* executed when the document is opened *)
  46.                 WITH M: Gadgets.CmdMsg DO
  47.                     IF M.cmd = "PREPARE" THEN
  48.                         Out.String("Reminder: "); Out.String(obj.msg); Out.Ln
  49.                     ELSE Gadgets.objecthandle(obj, M)
  50.                     END
  51.                 END
  52.             ELSE Gadgets.objecthandle(obj, M)
  53.             END
  54.         END
  55.     END Handler;
  56.     PROCEDURE Init* (obj: Reminder; msg: ARRAY OF CHAR);
  57.     BEGIN obj.handle := Handler; COPY(msg, obj.msg)
  58.     END Init;
  59.     PROCEDURE New*;
  60.         VAR obj: Reminder;
  61.     BEGIN NEW(obj); Init(obj, ""); Objects.NewObj := obj
  62.     END New;
  63.     (** Attach a reminder to a document. *)
  64.     PROCEDURE Attach*;
  65.         VAR D: Documents.Document; R: Attributes.Reader; ch: CHAR; obj: Reminder;
  66.                 s: ARRAY 128 OF CHAR; i: INTEGER; M: Objects.LinkMsg;
  67.     BEGIN
  68.         D := Documents.MarkedDoc();
  69.         IF D # NIL THEN
  70.             Attributes.OpenReader(R, Oberon.Par.text, Oberon.Par.pos);
  71.             Attributes.Read(R, ch);
  72.             i := 0;
  73.             WHILE ~R.eot & (ch # "~") & (i < LEN(s) - 1) DO
  74.                 s[i] := ch; INC(i);
  75.                 Attributes.Read(R, ch)
  76.             END;
  77.             s[i] := 0X;
  78.             NEW(obj); Init(obj, s);
  79.             M.id := Objects.set; M.name := "Reminder"; M.obj := obj; M.res := -1;
  80.             D.handle(D, M);
  81.             IF M.res >= 0 THEN Out.String("  done") ELSE Out.String("  failed") END; Out.Ln
  82.         END
  83.     END Attach;
  84. END Reminders.
  85. Reminders.Attach ^ ~            Meeting on Thursday ~
  86.                                                 The Align button does not work ~
  87.