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

  1. Oberon10.Scn.Fnt
  2. Syntax10.Scn.Fnt
  3. Syntax10i.Scn.Fnt
  4. Syntax10b.Scn.Fnt
  5. (* ETH Oberon, Copyright 2000 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
  6. Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
  7. MODULE BartSimpson; (** portable *)    (* Markus D
  8. twyler, 1996 *)
  9. IMPORT Out, Objects, Display, Input, Gadgets, Oberon, Modules, Pictures, Math, Display3, Printer, Printer3;
  10. CONST
  11.     LEyeX = 16.5; REyeX = 23.5;
  12.     LEyeY = 16.5; REyeY = 16.5;
  13.     EyeR = 1.5;
  14.     BartW = 34; BartH = 34;
  15.     MouseCoord* = POINTER TO MouseCoordDesc;
  16.     MouseCoordDesc* = RECORD (Gadgets.ObjDesc)
  17.         x, y: INTEGER;
  18.     END;
  19.     Frame* = POINTER TO FrameDesc;
  20.     FrameDesc* = RECORD(Gadgets.FrameDesc)
  21.         oldLX, oldLY, oldRX, oldRY: INTEGER;
  22.         col: INTEGER
  23.     END;
  24.     MoveMsg* = RECORD (Display.FrameMsg)
  25.     END;
  26.     task: Oberon.Task;        (* mouse controller *)
  27.     mouse: MouseCoord;    (* the model *)
  28.     bart: Pictures.Picture;    (* bart simpson picture *)
  29.     keys: SET;
  30.     oldX, oldY: INTEGER;
  31. PROCEDURE * MouseSpy(me: Oberon.Task);
  32. VAR U: Gadgets.UpdateMsg;
  33. BEGIN
  34.     Input.Mouse(keys, mouse.x, mouse.y);
  35.     IF (mouse.x # oldX) OR (mouse.y # oldY) THEN
  36.         oldX:= mouse.x; oldY:= mouse.y;
  37.         (* infrom all views about position change of mouse *)
  38.         U.F:= NIL; U.obj:= mouse; Objects.Stamp(U); U.res:= -1;
  39.         Display.Broadcast(U)
  40.     END;
  41.     me.time := Oberon.Time() + Input.TimeUnit DIV 10    (* 100 ms *)
  42. END MouseSpy;
  43. PROCEDURE MouseAttr(F: MouseCoord; VAR M: Objects.AttrMsg);
  44. BEGIN
  45.     IF M.id = Objects.get THEN
  46.         IF M.name = "Gen" THEN M.class:= Objects.String; COPY("BartSimpson.NewMouse", M.s); M.res:= 0
  47.         ELSIF M.name = "MouseX" THEN M.class:= Objects.Int; M.i:= F.x; M.res:= 0
  48.         ELSIF M.name = "MouseY" THEN M.class:= Objects.Int; M.i:= F.y; M.res:= 0
  49.         ELSE Gadgets.objecthandle(F, M)
  50.         END
  51.     ELSIF M.id = Objects.set THEN
  52.         Gadgets.objecthandle(F, M)
  53.     ELSIF M.id = Objects.enum THEN
  54.         M.Enum("MouseX"); M.Enum("MouseY"); Gadgets.objecthandle(F, M)
  55. END MouseAttr;
  56. PROCEDURE MouseHandler*(F: Objects.Object; VAR M: Objects.ObjMsg);
  57. BEGIN
  58.     WITH F: MouseCoord DO
  59.         IF M IS Objects.AttrMsg THEN
  60.             MouseAttr(F, M(Objects.AttrMsg))
  61.         ELSIF M IS Objects.CopyMsg THEN
  62.             WITH M: Objects.CopyMsg DO
  63.                 IF M.stamp = F.stamp THEN    (* we already got this message *)
  64.                     M.obj:= mouse
  65.                 ELSE
  66.                     F.stamp:= M.stamp;
  67.                     M.obj:= mouse
  68.                 END
  69.             END
  70.         ELSIF M IS Objects.FileMsg THEN
  71.             WITH M: Objects.FileMsg DO
  72.                 IF M.id = Objects.store THEN
  73.                     Gadgets.objecthandle(F, M)
  74.                 ELSIF M.id = Objects.load THEN
  75.                     Gadgets.objecthandle(F, M);
  76.                     Input.Mouse(keys, mouse.x, mouse.y)
  77.                 END
  78.             END
  79.         ELSE
  80.             Gadgets.objecthandle(F, M)
  81.         END
  82. END MouseHandler;
  83. PROCEDURE FrameAttr(F: Frame; VAR M: Objects.AttrMsg);
  84. (* handles Objects.AttrMsg. Each object has to set at least the Gen attribute *)
  85. BEGIN
  86.     IF M.id = Objects.get THEN
  87.         IF M.name = "Gen" THEN M.class:= Objects.String; COPY("BartSimpson.NewBart", M.s); M.res:= 0
  88.         ELSE Gadgets.framehandle(F, M)
  89.         END
  90.     ELSIF M.id = Objects.set THEN
  91.         Gadgets.framehandle(F, M);
  92.     ELSIF M.id = Objects.enum THEN
  93.         Gadgets.framehandle(F, M)
  94. END FrameAttr;
  95. PROCEDURE DrawEyes(F: Frame; M: Display3.Mask; x, y: INTEGER);
  96. VAR A: Objects.AttrMsg; mx, my, py, px: INTEGER; r, dx, dy, rp: REAL; 
  97. BEGIN
  98.     IF F.oldLX > 0 THEN
  99.         Display3.ReplConst(M, Display3.BG, F.oldLX, F.oldLY, 2, 2, Display.replace);
  100.         Display3.ReplConst(M, Display3.BG, F.oldRX, F.oldRY, 2, 2, Display.replace)
  101.     END;
  102.     A.id:= Objects.get; A.name:= "MouseX"; A.res:= -1; F.obj.handle(F.obj, A); mx:= SHORT(A.i);
  103.     A.id:= Objects.get; A.name:= "MouseY"; A.res:= -1; F.obj.handle(F.obj, A); my:= SHORT(A.i);
  104.     dx:= mx - LEyeX - x; dy:= my - LEyeY - y;
  105.     r:= Math.sqrt(dx*dx + dy*dy);
  106.     IF r > EyeR THEN rp:= EyeR ELSE rp:= r END;
  107.     py:= SHORT(ENTIER(dy * rp / r)) + y + SHORT(ENTIER(LEyeY)); px:= SHORT(ENTIER(dx * rp / r)) + x + SHORT(ENTIER(LEyeX));
  108.     Display3.ReplConst(M, Display3.FG, px, py, 2, 2, Display.replace);
  109.     F.oldLX:= px; F.oldLY:= py;
  110.     dx:= mx - REyeX - x; dy:= (my - REyeY - y);
  111.     r:= Math.sqrt(dx*dx + dy*dy);
  112.     IF r > EyeR THEN rp:= EyeR ELSE rp:= r END;
  113.     py:= SHORT(ENTIER(dy * rp / r)) + y + SHORT(ENTIER(REyeY)); px:= SHORT(ENTIER(dx * rp / r)) + x + SHORT(ENTIER(REyeX));
  114.     Display3.ReplConst(M, Display3.FG, px, py, 2, 2, Display.replace);
  115.     F.oldRX:= px; F.oldRY:= py;
  116. END DrawEyes;
  117. PROCEDURE RestoreFrame(F: Frame; M: Display3.Mask; x, y, w, h: INTEGER);
  118. (* handles a redraw of the whole view *)
  119. BEGIN
  120.     Oberon.RemoveMarks(x, y, w, h);
  121.     IF (F.obj # NIL) & (F.obj IS MouseCoord) THEN
  122.         Display3.FilledRect3D(M, Display3.topC, Display3.bottomC, Display3.groupC, x, y, w, h, 1, Display.replace);
  123.         (*Display3.EnumRect(M, fx, fy, w-2, h-2, DisplayBart);*)
  124.         Display3.Pict(M, bart, 0, 0, bart.width, bart.height, x, y, Display.replace);
  125.         F.oldLX:= -1;
  126.         DrawEyes(F, M, x, y)
  127.     END;
  128.     IF Gadgets.selected IN F.state THEN
  129.         Display3.FillPattern(M, Display3.white, Display3.selectpat, x, y, x, y, w, h, Display.paint)
  130. END RestoreFrame;
  131. PROCEDURE CopyFrame*(VAR M: Objects.CopyMsg; from, to: Frame);
  132. BEGIN
  133.     Gadgets.CopyFrame(M, from, to);
  134. END CopyFrame;
  135. PROCEDURE Print(F: Frame; VAR M: Display.DisplayMsg);
  136. VAR R: Display3.Mask;
  137.     PROCEDURE P(x: INTEGER): INTEGER;
  138.     BEGIN RETURN SHORT(x * Display.Unit DIV Printer.Unit)
  139.     END P;
  140. BEGIN
  141.     Gadgets.MakePrinterMask(F, M.x, M.y, M.dlink, R);
  142.     Printer3.Pict(R, bart, M.x, M.y, P(F.W), P(F.H), Display.replace);
  143. END Print;
  144. PROCEDURE FrameHandler*(F: Objects.Object; VAR M: Objects.ObjMsg);
  145. VAR x, y, w, h: INTEGER; R: Display3.Mask; F0: Frame;
  146. BEGIN
  147.     WITH F: Frame DO
  148.         IF M IS Display.FrameMsg THEN
  149.             WITH M: Display.FrameMsg DO
  150.                 IF (M.F = NIL) OR (M.F = F) THEN    (* message relevant for this frame *)
  151.                     x:= M.x + F.X; y:= M.y + F.Y; w:= F.W; h:= F.H;
  152.                     IF M IS Gadgets.UpdateMsg THEN
  153.                         WITH M: Gadgets.UpdateMsg DO
  154.                             IF (F.obj # NIL) & (M.obj = F.obj) THEN
  155.                                 Gadgets.MakeMask(F, x, y, M.dlink, R);
  156.                                 F.col := (F.col + 1) MOD 16;
  157.                                 Oberon.RemoveMarks(x, y, w, h);
  158.                                 DrawEyes(F, R, x, y)
  159.                             END
  160.                         END
  161.                     ELSIF M IS Display.DisplayMsg THEN
  162.                         WITH M: Display.DisplayMsg DO
  163.                             IF M.device = Display.screen THEN
  164.                                 IF (M.id = Display.full) OR (M.F = NIL) THEN
  165.                                     Gadgets.MakeMask(F, x, y, M.dlink, R);
  166.                                     RestoreFrame(F, R, x, y, w, h)
  167.                                 ELSIF M.id = Display.area THEN
  168.                                     Gadgets.MakeMask(F, x, y, M.dlink, R);
  169.                                     Display3.AdjustMask(R, x + M.u, y + h - 1 + M.v, M.w, M.h);
  170.                                     RestoreFrame(F, R, x, y, w, h)
  171.                                 END
  172.                             ELSIF M.device = Display.printer THEN Print(F, M)
  173.                             END
  174.                         END    (* WITH *)
  175.                     ELSIF M IS Oberon.InputMsg THEN
  176.                         Gadgets.framehandle(F, M)
  177.                     ELSE
  178.                         Gadgets.framehandle(F, M)
  179.                     END    (* IF *)
  180.                 END    (* IF *)
  181.             END    (* WITH *)
  182.         (* Object messages *)    
  183.         ELSIF M IS Objects.AttrMsg THEN
  184.             FrameAttr(F, M(Objects.AttrMsg))
  185.         ELSIF M IS Objects.CopyMsg THEN
  186.             WITH M: Objects.CopyMsg DO
  187.                 IF M.stamp = F.stamp THEN M.obj:= F.dlink    (* copy msg arrives again *)
  188.                 ELSE    (* first time copy message arrives *)
  189.                     NEW(F0); F.stamp:= M.stamp; F.dlink:= F0; CopyFrame(M, F, F0); M.obj:= F0
  190.                 END
  191.             END
  192.         ELSE
  193.             Gadgets.framehandle(F, M)
  194.         END
  195. END FrameHandler;
  196. PROCEDURE NewMouse*;
  197. BEGIN
  198.     Objects.NewObj:= mouse
  199. END NewMouse;
  200. PROCEDURE NewBart*;
  201. VAR F: Frame;
  202. BEGIN
  203.     NEW(F);
  204.     F.W:= BartW; F.H:= BartH; F.state:= {Gadgets.lockedsize};
  205.     F.handle:= FrameHandler;
  206.     Objects.NewObj:= F
  207. END NewBart;
  208. PROCEDURE Deinstall*;
  209. BEGIN
  210.     Oberon.Remove(task);
  211.     Out.String("MouseSpy removed !"); Out.Ln;
  212. END Deinstall;
  213. BEGIN
  214.     Out.String("BartSimpson by Mad 1994"); Out.Ln;
  215.     NEW(bart); IF bart = NIL THEN HALT(99) END;
  216.     Pictures.Open(bart, "Bart.Pict", TRUE);
  217.     IF bart.width # 32 THEN HALT(99) END;
  218.     NEW(mouse); IF mouse = NIL THEN HALT(99) END;
  219.     Input.Mouse(keys, mouse.x, mouse.y);
  220.     oldX:= mouse.x; oldY:= mouse.y;
  221.     mouse.handle:= MouseHandler;
  222.     NEW(task); IF task = NIL THEN HALT(99) END;
  223.     task.safe:= FALSE; task.time := Oberon.Time();
  224.     task.handle:= MouseSpy;
  225.     Oberon.Install(task);
  226.     Modules.InstallTermHandler(Deinstall)
  227. END BartSimpson.
  228. BartSimpson.Deinstall
  229. Gadgets.Insert BartSimpson.NewBart BartSimpson.NewMouse ~
  230. Gadgets.Link BartSimpson.NewMouse ~
  231.