home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / Chip_2004-07_cd1.bin / tema / aos / files / Oberon.exe / Oberon / Docu.exe / Docu / Graphs.Mod (.txt) < prev    next >
Oberon Text  |  2000-02-29  |  5KB  |  135 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 Graphs; (** portable *)
  6. IMPORT Files, Display, Attributes, Display3, Objects, Gadgets, Oberon;
  7. CONST
  8.     BufSize = 360;
  9.     ScaleFactor = 2.66;
  10.     Graph* = POINTER TO GraphDesc;
  11.     GraphDesc* = RECORD (Gadgets.FrameDesc)
  12.         col*: INTEGER;
  13.         beg*, end*: INTEGER;
  14.         x*: ARRAY BufSize OF REAL;
  15.         y*: ARRAY BufSize OF REAL
  16.     END;
  17. PROCEDURE GraphAttr(F: Graph; VAR M: Objects.AttrMsg);
  18. BEGIN
  19.     IF M.id = Objects.get THEN
  20.         IF M.name = "Gen" THEN M.class := Objects.String; COPY("Graphs.NewGraph", M.s); M.res := 0
  21.         ELSE Gadgets.framehandle(F, M)
  22.         END
  23.     ELSIF M.id = Objects.set THEN Gadgets.framehandle(F, M)
  24.     ELSIF M.id = Objects.enum THEN Gadgets.framehandle(F, M)
  25. END GraphAttr;
  26. PROCEDURE RestoreGraph(F: Graph; M: Display3.Mask; x, y, w, h: INTEGER);
  27. VAR i, p, q: INTEGER;
  28. BEGIN
  29.     Display3.FilledRect3D(M, Display3.bottomC, Display3.topC, F.col, x, y, w, h, 1, Display.replace);
  30.     p := x + w DIV 2; q := y + h DIV 2;
  31.     i := F.beg;
  32.     WHILE i # F.end DO
  33.         Display3.Dot(M, Display3.FG,
  34.             p + SHORT(ENTIER(F.x[i] * F.W / ScaleFactor + 0.5)),
  35.             q + SHORT(ENTIER(F.y[i] * F.H / ScaleFactor + 0.5)), Display3.replace);
  36.         i := (i + 1) MOD BufSize;
  37.     END;
  38.     IF Gadgets.selected IN F.state THEN
  39.         Display3.FillPattern(M, Display3.white, Display3.selectpat, x, y, x, y, w, h, Display.paint)
  40. END RestoreGraph;
  41. PROCEDURE CopyGraph*(VAR M: Objects.CopyMsg; from, to: Graph);
  42. BEGIN
  43.     to.col := from.col;
  44.     Gadgets.CopyFrame(M, from, to);
  45. END CopyGraph;
  46. PROCEDURE GraphHandler*(F: Objects.Object; VAR M: Objects.ObjMsg);
  47. VAR x, y, w, h, p, q: INTEGER; F0: Graph; R: Display3.Mask;
  48.     A: Objects.AttrMsg;
  49. BEGIN
  50.     WITH F: Graph DO
  51.         IF M IS Display.FrameMsg THEN
  52.             WITH M: Display.FrameMsg DO
  53.                 IF (M.F = NIL) OR (M.F = F) THEN    (* message addressed to this frame *)
  54.                     x := M.x + F.X; y := M.y + F.Y; w := F.W; h := F.H; (* calculate display coordinates *)
  55.                     IF M IS Display.DisplayMsg THEN
  56.                         WITH M: Display.DisplayMsg DO
  57.                             IF M.device = Display.screen THEN
  58.                                 IF (M.id = Display.full) OR (M.F = NIL) THEN
  59.                                     Gadgets.MakeMask(F, x, y, M.dlink, R);
  60.                                     RestoreGraph(F, R, x, y, w, h)
  61.                                 ELSIF M.id = Display.area THEN
  62.                                     Gadgets.MakeMask(F, x, y, M.dlink, R);
  63.                                     Display3.AdjustMask(R, x + M.u, y + h - 1 + M.v, M.w, M.h);
  64.                                     RestoreGraph(F, R, x, y, w, h)
  65.                                 END
  66.                             ELSE
  67.                                 Gadgets.framehandle(F, M)
  68.                             END
  69.                         END
  70.                     ELSIF M IS Gadgets.UpdateMsg THEN
  71.                         WITH M: Gadgets.UpdateMsg DO
  72.                             IF M.obj = F.obj THEN (* model has changed *)
  73.                                 A.id := Objects.get; A.name := "Real"; F.obj.handle(F.obj, A); F.x[F.end] := A.x;
  74.                                 A.id := Objects.get; A.name := "Imag"; F.obj.handle(F.obj, A); F.y[F.end] := A.x;
  75.                                 
  76.                                 (* Display new point added *)
  77.                                 Gadgets.MakeMask(F, x, y, M.dlink, R);
  78.                                 p := x + w DIV 2; q := y + h DIV 2;
  79.                                 Display3.Dot(R, Display3.FG,
  80.                                     p + SHORT(ENTIER(F.x[F.end] * F.W/ScaleFactor + 0.5)),
  81.                                     q + SHORT(ENTIER(F.y[F.end] * F.H/ScaleFactor + 0.5)), Display3.replace);
  82.                         
  83.                                 (* Increment buffer *)
  84.                                 F.end := (F.end + 1) MOD BufSize;
  85.                                 IF F.end = F.beg THEN F.beg := (F.beg + 1) MOD BufSize END
  86.                             ELSE Gadgets.framehandle(F, M) (* may be for this frame too *)
  87.                             END
  88.                         END
  89.                     ELSE Gadgets.framehandle(F, M)
  90.                     END
  91.                 END
  92.             END
  93.         (* Object messages *)
  94.         ELSIF M IS Objects.AttrMsg THEN GraphAttr(F, M(Objects.AttrMsg))
  95.         ELSIF M IS Objects.FileMsg THEN
  96.             WITH M: Objects.FileMsg DO
  97.                 IF M.id = Objects.store THEN 
  98.                     Files.WriteInt(M.R, F.col); Gadgets.framehandle(F, M) 
  99.                 ELSIF M.id = Objects.load THEN
  100.                     Files.ReadInt(M.R, F.col); Gadgets.framehandle(F, M);
  101.                     IF F.col < 0 THEN F.col := Display3.textbackC END
  102.                 END
  103.             END
  104.         ELSIF M IS Objects.CopyMsg THEN
  105.             WITH M: Objects.CopyMsg DO
  106.                 IF M.stamp = F.stamp THEN M.obj := F.dlink    (* copy msg arrives again *)
  107.                 ELSE    (* first time copy message arrives *)
  108.                     NEW(F0); F.stamp := M.stamp; F.dlink := F0; CopyGraph(M, F, F0); M.obj := F0
  109.                 END
  110.             END
  111.         ELSE    (* unknown msg, framehandler might know it *)
  112.             Gadgets.framehandle(F, M)
  113.         END
  114. END GraphHandler;
  115. PROCEDURE NewGraph*;
  116. VAR F: Graph;
  117. BEGIN NEW(F); F.W := 200; F.H := 200;
  118.     F.col := Display3.textbackC; F.beg := 0; F.end := 0;
  119.     F.handle := GraphHandler; Objects.NewObj := F;
  120. END NewGraph;
  121. PROCEDURE Clear*;
  122. VAR S: Attributes.Scanner; obj: Objects.Object;
  123. BEGIN
  124.     Attributes.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos);
  125.     Attributes.Scan(S);
  126.     IF S.class = Attributes.Name THEN
  127.         obj := Gadgets.FindObj(Gadgets.context, S.s);
  128.         IF (obj # NIL) & (obj IS Graph) THEN
  129.             WITH obj: Graph DO
  130.                 obj.beg := 0; obj.end := 0; Gadgets.Update(obj)
  131.             END
  132.         END
  133. END Clear;
  134. END Graphs.
  135.