home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / oberon / system1 / dialoggraphics.mod (.txt) < prev    next >
Oberon Text  |  1977-12-31  |  8KB  |  191 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10i.Scn.Fnt
  3. StampElems
  4. Alloc
  5. 31 Oct 94
  6. Syntax10b.Scn.Fnt
  7. MODULE DialogGraphics; (* based on GraphicElems by CAS mod NW 19.3.91/ HM 27.9.93 *)
  8.     (** Markus Knasm
  9. ller 22 Sep 94 - 
  10.     IMPORT DialogFrames, Dialogs, DialogTexts, Display, Files, GraphicFrames, Graphics, In, MenuViewers, 
  11.         Oberon, TextFrames, TextPrinter, Texts, Viewers;
  12.     CONST 
  13.         MM = 1; ML = 0; MR = 2;
  14.         menu = "System.Close  System.Copy  System.Grow  Draw.Delete  DialogGraphics.Update ";
  15.         mm = TextFrames.mm; Scale = mm DIV 10;
  16.         dUnit = TextFrames.Unit; pUnit = TextPrinter.Unit;
  17.         GripW = 15 * Scale DIV dUnit; GripH = GripW;
  18.         W* = 100; H* = 100; 
  19.     TYPE
  20.         Item* = POINTER TO ItemDesc;
  21.         ItemDesc* = RECORD(Dialogs.ObjectDesc)
  22.             graph*: Graphics.Graph;
  23.             empty: BOOLEAN;
  24.             xg, yg: INTEGER;
  25.         END;
  26.         Frame = POINTER TO FrameDesc;
  27.         FrameDesc = RECORD (GraphicFrames.FrameDesc)
  28.             elem: Item
  29.         END;
  30.     VAR x0, x1, y0, y1: INTEGER; w: Texts.Writer;
  31.     PROCEDURE box (obj: Graphics.Object; VAR done: BOOLEAN);
  32.     BEGIN
  33.         IF obj.x < x0 THEN x0 := obj.x END;
  34.         IF x1 < obj.x + obj.w THEN x1 := obj.x + obj.w END;
  35.         IF obj.y < y0 THEN y0 := obj.y END;
  36.         IF y1 < obj.y + obj.h THEN y1 := obj.y + obj.h END
  37.     END box;
  38.     PROCEDURE Max (x, y: INTEGER): INTEGER;
  39.     BEGIN IF x > y THEN RETURN x ELSE RETURN y END
  40.     END Max;
  41.     PROCEDURE CopyGraph (g: Graphics.Graph): Graphics.Graph;
  42.         VAR g1: Graphics.Graph;
  43.     BEGIN
  44.         Graphics.SelectArea (g, MIN (INTEGER), MIN (INTEGER), MAX (INTEGER), MAX (INTEGER));
  45.         NEW (g1); Graphics.Copy (g, g1, 0, 0); Graphics.Deselect (g1);
  46.         RETURN g1
  47.     END CopyGraph;
  48.     PROCEDURE (g: Item) Draw* (x, y: INTEGER; f: Display.Frame);
  49.     (** displays the object at (x, y) in frame f *)
  50.         VAR x0, y0, w, h, mode: INTEGER; f1: GraphicFrames.Frame;
  51.     BEGIN
  52.         g.GetDim (x0, y0, w, h);
  53.         IF g.selected THEN mode := Display.invert ELSE mode := Display.replace END;
  54.         IF g.empty OR (x < f.X) OR (y < f.Y) OR (x + w > f.X + f.W) OR (y + h > f.Y + f.H) THEN
  55.             Display.ReplPatternC (f, Display.white, Display.grey1, x, y, w, h, 0, 0, mode)
  56.         ELSE
  57.             NEW (f1); GraphicFrames.Open (f1, g.graph, g.xg, g.yg, f (DialogFrames.Frame).col, FALSE);
  58.             f1.X := x; f1.Y := y; f1.W := w; f1.H := h;
  59.             GraphicFrames.Restore (f1); 
  60.         END
  61.     END Draw;
  62.     PROCEDURE (g: Item) Print* (x, y: INTEGER);
  63.     (** prints the object at printer coordinates (x, y) *)
  64.         VAR x0, y0, w, h: INTEGER;
  65.     BEGIN
  66.         g.GetPDim (x0, y0, w, h);    
  67.         IF ~g.empty THEN
  68.             Graphics.Print (g.graph, SHORT (g.xg * 4) + x, SHORT (g.yg * 4) + y + h)
  69.         END
  70.     END Print;
  71.     PROCEDURE (g: Item) Copy* (VAR dup: Dialogs.Object);
  72.     (** allocates dup and makes a deep copy of o. Before calling this methode dup should be equal NIL *)
  73.         VAR x: Item; 
  74.     BEGIN
  75.         IF dup = NIL THEN NEW (x); dup := x ELSE x := dup(Item) END; 
  76.         g.Copy^ (dup); x.graph := CopyGraph (g.graph); x.xg := g.xg; x.yg := g.yg;
  77.         x.empty := g.empty
  78.     END Copy;
  79.     PROCEDURE (g: Item) Load* (VAR r: Files.Rider);
  80.     (** reads the object from rider r *)
  81.     BEGIN 
  82.         g.Load^ (r); Files.ReadBool (r, g.empty); Files.ReadInt (r, g.xg); Files.ReadInt (r, g.yg);
  83.         NEW (g.graph); Graphics.Load (g.graph, r)
  84.     END Load;
  85.     PROCEDURE (g: Item) Store* (VAR r: Files.Rider);
  86.     (** writes the object to rider r *)
  87.     BEGIN 
  88.         g.Store^ (r); Files.WriteBool (r, g.empty); Files.WriteInt (r, g.xg); Files.WriteInt (r, g.yg);
  89.         Graphics.Store (g.graph, r)
  90.     END Store;
  91.     PROCEDURE (g: Item) Handle* (f: Display.Frame; VAR m: Display.FrameMsg);
  92.     (** handles messages which were sent to frame f *)
  93.         VAR t: Texts.Text;
  94.     BEGIN
  95.         g.Handle^ (f, m);
  96.         WITH f: DialogFrames.Frame DO
  97.             WITH m: Oberon.InputMsg DO
  98.                 IF (m.id = Oberon.track) & ((m.keys = {MM}) OR (m.keys = {MR}) OR (m.keys = {ML})) & (g.cmd[0] # 0X) THEN 
  99.                     DialogTexts.GetParText (g.par, g.panel, t);
  100.                     g.CallCmd (f, Viewers.This (m.X, m.Y), t) 
  101.                 END
  102.             ELSE
  103.             END
  104.         ELSE
  105.         END
  106.     END Handle;
  107.     PROCEDURE MarkMenu (f: Frame);
  108.         VAR r: Texts.Reader; v: Viewers.Viewer; t: Texts.Text; ch: CHAR;
  109.     BEGIN 
  110.         v := Viewers.This (f.X, f.Y);
  111.         IF v IS MenuViewers.Viewer THEN
  112.             t := v.dsc(TextFrames.Frame).text;
  113.             IF t.len > 0 THEN Texts.OpenReader (r, t, t.len - 1); Texts.Read (r, ch) ELSE ch := 0X END;
  114.             IF ch # "!" THEN Texts.Write (w, "!"); Texts.Append (t, w.buf) END
  115.         END 
  116.     END MarkMenu;
  117.     PROCEDURE HandleFrame (f0: Display.Frame; VAR msg: Display.FrameMsg);
  118.         VAR f: Frame; f1: Frame;
  119.     BEGIN
  120.         f := f0(Frame);
  121.         IF msg IS Oberon.InputMsg THEN 
  122.             GraphicFrames.Handle (f, msg);
  123.             WITH msg: Oberon.InputMsg DO
  124.                 IF (msg.id = Oberon.consume) OR (msg.id = Oberon.track) & (msg.keys # {}) THEN
  125.                     MarkMenu (f)
  126.                 END
  127.             END
  128.         ELSIF msg IS Oberon.CopyMsg THEN
  129.             NEW (f1); GraphicFrames.Open (f1, f.graph, f.Xg, f.Yg, f.col, f.ticked);
  130.             f1.handle := f.handle; f1.elem := f.elem;
  131.             msg(Oberon.CopyMsg).F := f1
  132.         ELSE GraphicFrames.Handle (f, msg)
  133.         END 
  134.     END HandleFrame;
  135.     PROCEDURE (g: Item) Edit* ();
  136.     (** opens a graphic frame for editing the properties of the object *)
  137.         VAR v: Viewers.Viewer; f: Frame; x, y: INTEGER;
  138.     BEGIN
  139.         NEW (f); GraphicFrames.Open (f, CopyGraph (g.graph), 0, 0, Display.black, TRUE); 
  140.         f.elem := g; f.handle := HandleFrame;
  141.         Oberon.AllocateSystemViewer (Oberon.Mouse.X, x, y);
  142.         v := MenuViewers.New (TextFrames.NewMenu ("DialogGraphics.Graph", menu), f, TextFrames.menuH, x, y)
  143.     END Edit;
  144.     PROCEDURE (g: Item) Open;
  145.     BEGIN
  146.         x0 := MAX (INTEGER); x1 := MIN (INTEGER); y0 := MAX (INTEGER); y1 := MIN (INTEGER);
  147.         Graphics.Enumerate (g.graph, box);
  148.         IF x0 = MAX (INTEGER) THEN x0 := 0; y0 := 0; g.empty := TRUE; g.xg := 0; g.yg := 0 
  149.         ELSE g.xg := - x0; g.yg := - y1; DEC (x1, x0); DEC (y1, y0); g.empty := FALSE
  150.         END
  151.     END Open;
  152.     PROCEDURE Insert*;   
  153.     (** Insert (name | ^ ) inserts a graphic - item in the panel containing the caret position *)
  154.         VAR w, h, x, y, xh, yh: INTEGER; g: Item; p: Dialogs.Panel; name: ARRAY 64 OF CHAR;
  155.     BEGIN 
  156.         NEW (g); 
  157.         DialogFrames.GetCaretPosition (p, x, y);
  158.         IF (p # NIL) THEN
  159.             g.Init; In.Open; In.Name (name);
  160.             IF ~In.Done THEN COPY ("", name); In.Open END;
  161.             g.SetName (name); 
  162.             NEW (g.graph); Graphics.Open (g.graph, name); g.Open;
  163.             In.Int (xh); In.Int (yh); In.Int (w); In.Int (h);
  164.             IF In.Done THEN 
  165.                 w := Max (x1, w); h := Max (y1, h); x := xh; y := yh;
  166.             ELSIF g.empty THEN 
  167.                 w := W; h := H
  168.             ELSE
  169.                 w := x1; h := y1
  170.             END;
  171.             g.SetDim (x, y, w, h, FALSE); 
  172.             p.Insert (g, FALSE) 
  173.         ELSE
  174.             Dialogs.res := Dialogs.noPanelSelected
  175.         END;
  176.         IF Dialogs.res # 0 THEN Dialogs.Error ("DialogGraphics") END;
  177.     END Insert;
  178.     PROCEDURE Update*;
  179.         VAR v: Viewers.Viewer; f: Frame; r: Texts.Reader; t: Texts.Text; ch: CHAR; x, y, w, h: INTEGER;
  180.     BEGIN
  181.         v := Oberon.Par.vwr; f := v.dsc.next(Frame); t := v.dsc(TextFrames.Frame).text;
  182.         GraphicFrames.Deselect (f); f.elem.graph := CopyGraph (f.graph);
  183.         f.elem.Open; f.elem.GetDim (x, y, w, h);
  184.         w := Max (x1, w); h := Max (y1, h); f.elem.SetDim (x, y, w, h, FALSE);
  185.         f.elem.Restore; f.elem.panel.MarkMenu;
  186.         Texts.OpenReader (r, t, t.len - 1); Texts.Read (r, ch);
  187.         IF ch = "!" THEN Texts.Delete (t, t.len - 1, t.len) END
  188.     END Update;
  189. BEGIN Texts.OpenWriter (w)
  190. END DialogGraphics.
  191.