home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / Chip_2004-07_cd1.bin / tema / aos / files / Oberon.exe / Oberon / Docu.exe / Docu / Diagrams.Mod (.txt) < prev    next >
Oberon Text  |  2000-02-29  |  4KB  |  117 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 Diagrams; (** portable *)    (*HM/JG 10.10.93*)
  6. IMPORT Files, Display, Display3, Objects, Gadgets;
  7. CONST margin = 1; black = 15;
  8.     Frame* = POINTER TO FrameDesc;
  9.     FrameDesc* = RECORD (Gadgets.FrameDesc)
  10.         col*: INTEGER;
  11.     END;
  12.     UpdateMsg* = RECORD (Display.FrameMsg)
  13.         n*: INTEGER
  14.     END;
  15. PROCEDURE FrameAttr(F: Frame; VAR M: Objects.AttrMsg);
  16. BEGIN
  17.     IF M.id = Objects.get THEN
  18.         IF M.name = "Gen" THEN
  19.         M.class := Objects.String; COPY("Diagrams.NewFrame", M.s); M.res := 0
  20.         ELSE Gadgets.framehandle(F, M)
  21.         END
  22.     ELSIF M.id = Objects.set THEN Gadgets.framehandle(F, M)
  23.     ELSIF M.id = Objects.enum THEN
  24.         M.Enum("Value"); Gadgets.framehandle(F, M)
  25. END FrameAttr;
  26. PROCEDURE RestoreFrame(F: Frame; M: Display3.Mask; x, y, w, h: INTEGER);
  27. BEGIN
  28.     Display3.FilledRect3D(M, Display3.topC, Display3.bottomC, F.col, x, y, w, h, margin, Display.replace);
  29.     IF Gadgets.selected IN F.state THEN
  30.         Display3.FillPattern(M, Display3.white, Display3.selectpat, x, y, x, y, w, h, Display.paint)
  31. END RestoreFrame;
  32. PROCEDURE UpdateDiagram(F: Frame; M: Display3.Mask; n, x, y, w, h: INTEGER; VAR res: INTEGER);
  33. BEGIN
  34.     IF Display3.Visible(M, x, y, w, h) THEN
  35.         x := x + margin; y := y + margin; w := w - margin*2; h := h - margin*2;
  36.         Display.CopyBlock (x + 2, y, w - 2, h, x, y, Display.replace);
  37.         IF n*4 <= h THEN
  38.             Display.ReplConst(black, x + w - 2, y, 1, n*4, Display.replace);
  39.             Display.ReplConst(F.col, x + w - 2, y + n*4, 1, h - n*4, Display.replace);
  40.             res := 0
  41.         ELSE Display.ReplConst(black, x + w - 2, y, 1, h, Display.replace); res := 1
  42.         END
  43. END UpdateDiagram;
  44. PROCEDURE CopyFrame*(VAR M: Objects.CopyMsg; from, to: Frame);
  45. BEGIN
  46.     to.col := from.col;
  47.     Gadgets.CopyFrame(M, from, to);
  48. END CopyFrame;
  49. PROCEDURE FrameHandler*(F: Objects.Object; VAR M: Objects.ObjMsg);
  50.     VAR x, y, w, h: INTEGER; F0: Frame; R: Display3.Mask;
  51. BEGIN
  52.     WITH F: Frame DO
  53.         IF M IS Display.FrameMsg THEN
  54.             WITH M: Display.FrameMsg DO
  55.                 IF (M.F = NIL) OR (M.F = F) THEN    (* message addressed to this frame *)
  56.                     x := M.x + F.X; y := M.y + F.Y; w := F.W; h := F.H; (* calculate display coordinates *)
  57.                     IF M IS Display.DisplayMsg THEN
  58.                         WITH M: Display.DisplayMsg DO
  59.                             IF M.device = Display.screen THEN
  60.                                 IF (M.id = Display.full) OR (M.F = NIL) THEN
  61.                                     Gadgets.MakeMask(F, x, y, M.dlink, R);
  62.                                     RestoreFrame(F, R, x, y, w, h)
  63.                                 ELSIF M.id = Display.area THEN
  64.                                     Gadgets.MakeMask(F, x, y, M.dlink, R);
  65.                                     Display3.AdjustMask(R, x + M.u, y + h - 1 + M.v, M.w, M.h);
  66.                                     RestoreFrame(F, R, x, y, w, h)
  67.                                 END
  68.                             ELSIF M.device = Display.printer THEN
  69.                             END
  70.                         END
  71.                     ELSIF M IS UpdateMsg THEN
  72.                         WITH M: UpdateMsg DO
  73.                             Gadgets.MakeMask(F, x, y, M.dlink, R);
  74.                             UpdateDiagram(F, R, M.n, x, y, w, h, M.res); M.res := -1;
  75.                         END
  76.                     ELSE Gadgets.framehandle(F, M)
  77.                     END
  78.                 ELSIF M IS UpdateMsg THEN
  79.                     WITH M: UpdateMsg DO
  80.                         Gadgets.MakeMask(F, x, y, M.dlink, R);
  81.                         UpdateDiagram(F, R, M.n, x, y, w, h, M.res)
  82.                     END
  83.                 END
  84.             END
  85.         (* Object messages *)
  86.         ELSIF M IS Objects.AttrMsg THEN FrameAttr(F, M(Objects.AttrMsg))
  87.         ELSIF M IS Objects.FileMsg THEN
  88.             WITH M: Objects.FileMsg DO
  89.                 IF M.id = Objects.store THEN (* store private data here *)
  90.                     Files.WriteInt(M.R, F.col);
  91.                     Gadgets.framehandle(F, M)
  92.                 ELSIF M.id = Objects.load THEN (* load private data here *)
  93.                     Files.ReadInt(M.R, F.col);
  94.                     Gadgets.framehandle(F, M)
  95.                 END
  96.             END
  97.         ELSIF M IS Objects.CopyMsg THEN
  98.             WITH M: Objects.CopyMsg DO
  99.                 IF M.stamp = F.stamp THEN M.obj := F.dlink    (* copy msg arrives again *)
  100.                 ELSE    (* first time copy message arrives *)
  101.                     NEW(F0); F.stamp := M.stamp; F.dlink := F0; CopyFrame(M, F, F0); M.obj := F0
  102.                 END
  103.             END
  104.         ELSE    (* unknown msg, framehandler might know it *)
  105.             Gadgets.framehandle(F, M)
  106.         END
  107. END FrameHandler;
  108. PROCEDURE NewFrame*;
  109.     VAR F: Frame;
  110. BEGIN
  111.     NEW(F); F.W := 20; F.H := 20; F.col := 14; F.handle := FrameHandler;
  112.     Objects.NewObj := F
  113. END NewFrame;
  114. END Diagrams.
  115. System.Free Simulator Diagrams ~
  116. Gadgets.Insert Diagrams.NewFrame ~
  117.