home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / Chip_2004-07_cd1.bin / tema / aos / files / Oberon.exe / Oberon / Docu.exe / Docu / Cups.Mod (.txt) < prev    next >
Oberon Text  |  2000-02-29  |  5KB  |  120 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.     Cups.Mod, jm 08.10.93
  6.     Fun example of a coffee cup. Coffee can be poured from one cup
  7.     to another by dropping one into another.
  8. MODULE Cups; (** portable *)
  9. IMPORT Files, Display, Display3, Objects, Gadgets;
  10.     Cup* = POINTER TO CupDesc;
  11.     CupDesc* = RECORD (Gadgets.FrameDesc)
  12.         coffee*: INTEGER;
  13.     END;
  14. PROCEDURE Size(F: Cup): INTEGER;
  15. BEGIN RETURN (F.W - 6) * (F.H - 6)
  16. END Size;
  17. PROCEDURE CupAttr(F: Cup; VAR M: Objects.AttrMsg);
  18. BEGIN
  19.     IF M.id = Objects.get THEN
  20.         IF M.name = "Gen" THEN M.class := Objects.String; COPY("Cups.NewCup", M.s); M.res := 0
  21.         ELSIF M.name = "Coffee" THEN M.class := Objects.Int; M.i := F.coffee; M.res := 0 
  22.         ELSE Gadgets.framehandle(F, M)
  23.         END
  24.     ELSIF M.id = Objects.set THEN
  25.         IF M.name = "Coffee" THEN
  26.             IF M.class = Objects.Int THEN
  27.                 F.coffee := SHORT(M.i);
  28.                 IF F.coffee > Size(F) THEN F.coffee := Size(F) END;
  29.                 M.res := 0
  30.             END;
  31.         ELSE Gadgets.framehandle(F, M);
  32.         END
  33.     ELSIF M.id = Objects.enum THEN
  34.         M.Enum("Coffee"); Gadgets.framehandle(F, M)
  35. END CupAttr;
  36. PROCEDURE RestoreCup(F: Cup; M: Display3.Mask; x, y, w, h: INTEGER);
  37. BEGIN
  38.     Display3.ReplConst(M, Display.BG, x, y, w, h, Display.replace);
  39.     Display3.ReplConst(M, Display3.blue, x, y, 2, h, Display.replace);
  40.     Display3.ReplConst(M, Display3.blue, x, y, w, 2, Display.replace);
  41.     Display3.ReplConst(M, Display3.blue, x + w - 2, y, 2, h, Display.replace);
  42.     IF F.coffee > Size(F) THEN F.coffee := Size(F) END;
  43.     Display3.ReplConst(M, Display3.FG, x + 3, y + 3, w - 6, F.coffee DIV (w - 6), Display.replace);
  44.     IF Gadgets.selected IN F.state THEN Display3.FillPattern(M, Display3.white, Display3.selectpat, x, y, x, y, w, h, Display.paint) END
  45. END RestoreCup;
  46. PROCEDURE CopyCup*(VAR M: Objects.CopyMsg; from, to: Cup);
  47. BEGIN to.coffee := from.coffee;
  48.     Gadgets.CopyFrame(M, from, to);
  49. END CopyCup;
  50. PROCEDURE CupHandler*(F: Objects.Object; VAR M: Objects.ObjMsg);
  51. VAR x, y, w, h: INTEGER; F0: Cup; R: Display3.Mask; f: Cup; space, take: INTEGER;
  52. BEGIN
  53.     WITH F: Cup DO
  54.         IF M IS Display.FrameMsg THEN
  55.             WITH M: Display.FrameMsg DO
  56.                 IF (M.F = NIL) OR (M.F = F) THEN    (* message addressed to this frame *)
  57.                     x := M.x + F.X; y := M.y + F.Y; w := F.W; h := F.H; (* calculate display coordinates *)
  58.                     IF M IS Display.DisplayMsg THEN
  59.                         WITH M: Display.DisplayMsg DO
  60.                             IF M.device = Display.screen THEN
  61.                                 IF (M.id = Display.full) OR (M.F = NIL) THEN
  62.                                     Gadgets.MakeMask(F, x, y, M.dlink, R);
  63.                                     RestoreCup(F, R, x, y, w, h)
  64.                                 ELSIF M.id = Display.area THEN
  65.                                     Gadgets.MakeMask(F, x, y, M.dlink, R);
  66.                                     Display3.AdjustMask(R, x + M.u, y + h - 1 + M.v, M.w, M.h);
  67.                                     RestoreCup(F, R, x, y, w, h)
  68.                                 END
  69.                             ELSE
  70.                                 Gadgets.framehandle(F, M)
  71.                             END
  72.                         END
  73.                     ELSIF M IS Display.ConsumeMsg THEN
  74.                         WITH M: Display.ConsumeMsg DO
  75.                             IF (M.id = Display.drop) & (M.obj IS Cup) THEN
  76.                                 f := M.obj(Cup);
  77.                                 space := Size(F) - F.coffee;
  78.                                 IF f.coffee < space THEN take := f.coffee
  79.                                 ELSE take := space
  80.                                 END;
  81.                                 F.coffee := F.coffee + take; f.coffee := f.coffee - take;
  82.                                 Gadgets.Update(F); Gadgets.Update(f);
  83.                                 M.res := 0
  84.                             END
  85.                         END
  86.                     ELSE Gadgets.framehandle(F, M)
  87.                     END
  88.                 END
  89.             END
  90.         (* Object messages *)
  91.         ELSIF M IS Objects.AttrMsg THEN CupAttr(F, M(Objects.AttrMsg))
  92.         ELSIF M IS Objects.FileMsg THEN
  93.             WITH M: Objects.FileMsg DO
  94.                 IF M.id = Objects.store THEN
  95.                     Files.WriteInt(M.R, F.coffee);
  96.                     Gadgets.framehandle(F, M)
  97.                 ELSIF M.id = Objects.load THEN
  98.                     Files.ReadInt(M.R, F.coffee);
  99.                     Gadgets.framehandle(F, M)
  100.                 END
  101.             END
  102.         ELSIF M IS Objects.CopyMsg THEN
  103.             WITH M: Objects.CopyMsg DO
  104.                 IF M.stamp = F.stamp THEN M.obj := F.dlink    (* copy msg arrives again *)
  105.                 ELSE (* first time copy message arrives *)
  106.                     NEW(F0); F.stamp := M.stamp; F.dlink := F0; CopyCup(M, F, F0); M.obj := F0
  107.                 END
  108.             END
  109.         ELSE    (* unknown msg, framehandler might know it *)
  110.             Gadgets.framehandle(F, M)
  111.         END
  112. END CupHandler;
  113. PROCEDURE NewCup*;
  114. VAR F: Cup;
  115. BEGIN NEW(F); F.W := 30; F.H := 30; F.coffee := Size(F); F.handle := CupHandler; Objects.NewObj := F;
  116. END NewCup;
  117. END Cups.
  118. System.Free Cups ~
  119. Gadgets.Insert Cups.NewCup ~
  120.