home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 10 / Fresh_Fish_10_2352.bin / new / dev / obero / oberon / projectoberonsrc / menuviewers.mod (.txt) < prev    next >
Oberon Text  |  1994-10-17  |  8KB  |  211 lines

  1. Syntax10.Scn.Fnt
  2. MODULE MenuViewers; (*JG 26.8.90 / 16.9.93*)
  3.   IMPORT Input, Display, Viewers, Oberon;
  4.   CONST extend* = 0; reduce* = 1; FrameColor = 15;
  5.   TYPE
  6.     Viewer* = POINTER TO ViewerDesc;
  7.     ViewerDesc* = RECORD
  8.       (Viewers.ViewerDesc)
  9.       menuH*: INTEGER
  10.     END;
  11.     ModifyMsg* = RECORD
  12.       (Display.FrameMsg)
  13.       id*: INTEGER;
  14.       dY*, Y*, H*: INTEGER
  15.     END;
  16.   VAR Ancestor*: Viewer;
  17.   PROCEDURE Copy (V: Viewer; VAR V1: Viewer);
  18.     VAR Menu, Main: Display.Frame; M: Oberon.CopyMsg;
  19.   BEGIN
  20.     Menu := V.dsc; Main := V.dsc.next;
  21.     NEW(V1); V1^ := V^; V1.state := 0;
  22.     M.F := NIL; Menu.handle(Menu, M); V1.dsc := M.F;
  23.     M.F := NIL; Main.handle(Main, M); V1.dsc.next := M.F
  24.   END Copy;
  25.   PROCEDURE Draw (V: Viewers.Viewer);
  26.   BEGIN
  27.     Display.ReplConst(FrameColor, V.X, V.Y, 1, V.H, 0);
  28.     Display.ReplConst(FrameColor, V.X + V.W - 1, V.Y, 1, V.H, 0);
  29.     Display.ReplConst(FrameColor, V.X + 1, V.Y, V.W - 2, 1, 0);
  30.     Display.ReplConst(FrameColor, V.X + 1, V.Y + V.H - 1, V.W - 2, 1, 0)
  31.   END Draw;
  32.   PROCEDURE Extend (V: Viewer; newY: INTEGER);
  33.     VAR dH: INTEGER;
  34.   BEGIN dH := V.Y - newY;
  35.     IF dH > 0 THEN
  36.     Display.ReplConst(Display.black, V.X + 1, newY + 1, V.W - 2, dH, 0);
  37.     Display.ReplConst(FrameColor, V.X, newY, 1, dH, 0);
  38.     Display.ReplConst(FrameColor, V.X + V.W - 1, newY, 1, dH, 0);
  39.     Display.ReplConst(FrameColor, V.X + 1, newY, V.W - 2, 1, 0)
  40.   END
  41.   END Extend;
  42.   PROCEDURE Reduce (V: Viewer; newY: INTEGER);
  43.   BEGIN Display.ReplConst(FrameColor, V.X + 1, newY, V.W - 2, 1, 0)
  44.   END Reduce;
  45.   PROCEDURE Grow (V: Viewer; oldH: INTEGER);
  46.     VAR dH: INTEGER;
  47.   BEGIN dH := V.H - oldH;
  48.     IF dH > 0 THEN
  49.       Display.ReplConst(FrameColor, V.X, V.Y + oldH, 1, dH, 0);
  50.       Display.ReplConst(FrameColor, V.X + V.W - 1, V.Y + oldH, 1, dH, 0);
  51.       Display.ReplConst(FrameColor, V.X + 1, V.Y + V.H - 1, V.W - 2, 1, 0)
  52.     END
  53.   END Grow;
  54.   PROCEDURE Shrink (V: Viewer; newH: INTEGER);
  55.   BEGIN Display.ReplConst(FrameColor, V.X + 1, V.Y + newH - 1, V.W - 2, 1, 0)
  56.   END Shrink;
  57.   PROCEDURE Adjust (F: Display.Frame; id, dY, Y, H: INTEGER);
  58.     VAR M: ModifyMsg;
  59.   BEGIN M.id := id; M.dY := dY; M.Y := Y; M.H := H; F.handle(F, M); F.Y := Y; F.H := H
  60.   END Adjust;
  61.   PROCEDURE Restore (V: Viewer);
  62.     VAR Menu, Main: Display.Frame;
  63.   BEGIN
  64.     Menu := V.dsc; Main := V.dsc.next;
  65.     Oberon.RemoveMarks(V.X, V.Y, V.W, V.H);
  66.     Draw(V);
  67.     Menu.X := V.X + 1; Menu.Y := V.Y + V.H - 1; Menu.W := V.W - 2; Menu.H := 0;
  68.     Main.X := V.X + 1; Main.Y := V.Y + V.H - V.menuH; Main.W := V.W - 2; Main.H := 0;
  69.     IF V.H > V.menuH + 1 THEN
  70.       Adjust(Menu, extend, 0, V.Y + V.H - V.menuH, V.menuH - 1);
  71.       Adjust( Main, extend, 0, V.Y + 1, V.H - V.menuH - 1)
  72.     ELSE Adjust(Menu, extend, 0, V.Y + 1, V.H - 2)
  73.     END
  74.   END Restore;
  75.   PROCEDURE Modify (V: Viewer; Y, H: INTEGER);
  76.     VAR Menu, Main: Display.Frame;
  77.   BEGIN
  78.     Menu := V.dsc; Main := V.dsc.next;
  79.     IF Y < V.Y THEN (*extend*)
  80.       Oberon.RemoveMarks(V.X, Y, V.W, V.Y - Y);
  81.       Extend(V, Y);
  82.       IF H > V.menuH + 1 THEN
  83.         Adjust(Menu, extend, 0, Y + H - V.menuH, V.menuH - 1);
  84.         Adjust(Main, extend, 0, Y + 1, H - V.menuH - 1)
  85.       ELSE Adjust(Menu, extend, 0, Y + 1, H - 2)
  86.       END
  87.     ELSIF Y > V.Y THEN (*reduce*)
  88.       Oberon.RemoveMarks(V.X, V.Y, V.W, V.H);
  89.       IF H > V.menuH + 1 THEN
  90.         Adjust(Main, reduce, 0, Y + 1, H - V.menuH - 1);
  91.         Adjust(Menu, reduce, 0, Y + H - V.menuH, V.menuH - 1)
  92.       ELSE
  93.         Adjust(Main, reduce, 0, Y + H - V.menuH, 0);
  94.         Adjust(Menu, reduce, 0, Y + 1, H - 2)
  95.       END;
  96.       Reduce(V, Y)
  97.     END
  98.   END Modify;
  99.   PROCEDURE Change (V: Viewer; X, Y: INTEGER; Keys: SET);
  100.     VAR Menu, Main: Display.Frame;
  101.       V1: Viewers.Viewer; keysum: SET; Y0, dY, H: INTEGER;
  102.   BEGIN (*Keys # {}*)
  103.     Menu := V.dsc; Main := V.dsc.next;
  104.     Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, X, Y);
  105.     Display.ReplConst(Display.white, V.X + 1, V.Y + V.H - 1 - V.dsc.H, V.W - 2, V.dsc.H, 2);
  106.     Y0 := Y; 
  107.     keysum := Keys;
  108.     LOOP
  109.       Input.Mouse(Keys, X, Y);
  110.       IF Keys = {} THEN EXIT END;
  111.       keysum := keysum + Keys;
  112.       Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, X, Y)
  113.     END;
  114.     Display.ReplConst(Display.white, V.X + 1, V.Y + V.H - 1 - V.dsc.H, V.W - 2, V.dsc.H, 2);
  115.     IF ~(0 IN keysum) THEN
  116.       IF 1 IN keysum THEN V1 := Viewers.This(X, Y);
  117.         IF (V1 IS Viewer) & (Y > V1.Y + V1.H - V1(Viewer).menuH - 2) THEN Y := V1.Y + V1.H END;
  118.         Viewers.Close(V); Viewers.Open(V, X, Y); Restore(V)
  119.       ELSE
  120.         IF Y > Y0 THEN (*extend*) dY := Y - Y0;
  121.           V1 := Viewers.Next(V);
  122.           IF V1.state > 1 THEN
  123.             IF V1 IS Viewer THEN
  124.               IF V1.H < V1(Viewer).menuH + 2 THEN dY := 0
  125.                 ELSIF V1.H < V1(Viewer).menuH + 2 + dY THEN dY := V1.H - V1(Viewer).menuH - 2
  126.               END
  127.             ELSIF V1.H < 1 + dY THEN dY := V1.H - 1
  128.             END
  129.           ELSIF V1.H < dY THEN dY := V1.H
  130.           END;
  131.           Viewers.Change(V, V.Y + V.H + dY);
  132.           Oberon.RemoveMarks(V.X, V.Y, V.W, V.H);
  133.           Grow(V, V.H - dY);
  134.           IF V.H > V.menuH + 1 THEN
  135.             Adjust(Menu, extend, dY, V.Y + V.H - V.menuH, V.menuH - 1);
  136.             Adjust(Main, extend, dY, V.Y + 1, V.H - V.menuH - 1)
  137.           ELSE(*V.H > 1*)
  138.             Adjust(Menu, extend, dY, V.Y + 1, V.H - 2);
  139.             Adjust(Main, extend, dY, V.Y + V.H - V.menuH, 0)
  140.           END
  141.         ELSIF Y < Y0 THEN (*reduce*) dY := Y0 - Y;
  142.           IF V.H >= V.menuH + 2 THEN
  143.             IF V.H < V.menuH + 2 + dY THEN dY := V.H - V.menuH - 2 END;
  144.             Oberon.RemoveMarks(V.X, V.Y, V.W, V.H);
  145.             H := V.H - dY;
  146.             Adjust(Main, reduce, dY, V.Y + 1, H - V.menuH - 1);
  147.             Adjust(Menu, reduce, dY, V.Y + H - V.menuH, V.menuH - 1);
  148.             Shrink(V, H);
  149.             Viewers.Change(V, V.Y + H)
  150.           END
  151.         END
  152.       END
  153.     END
  154.   END Change;
  155.   PROCEDURE Suspend (V: Viewer);
  156.     VAR Menu, Main: Display.Frame;
  157.   BEGIN
  158.     Menu := V.dsc; Main := V.dsc.next;
  159.     Adjust(Main, reduce, 0, V.Y + V.H - V.menuH, 0);
  160.     Adjust(Menu, reduce, 0, V.Y + V.H - 1, 0)
  161.   END Suspend;
  162.   PROCEDURE Handle* (V: Display.Frame; VAR M: Display.FrameMsg);
  163.     VAR Menu, Main: Display.Frame; V1: Viewer;
  164.   BEGIN
  165.     WITH V: Viewer DO Ancestor := V;
  166.       Menu := V.dsc; Main := V.dsc.next;
  167.       IF M IS Oberon.InputMsg THEN
  168.         WITH M: Oberon.InputMsg DO
  169.           IF M.id = Oberon.track THEN
  170.             IF M.Y < V.Y + 1 THEN Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, M.X, M.Y)
  171.             ELSIF M.Y < V.Y + V.H - V.menuH THEN Main.handle(Main, M)
  172.             ELSIF M.Y < V.Y + V.H - V.menuH + 2 THEN Menu.handle(Menu, M)
  173.             ELSIF M.Y < V.Y + V.H - 1 THEN
  174.               IF 2 IN M.keys THEN Change(V, M.X, M.Y, M.keys)
  175.                 ELSE Menu.handle(Menu, M)
  176.               END
  177.             ELSE Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, M.X, M.Y)
  178.             END
  179.           ELSE Menu.handle(Menu, M); Main.handle(Main, M)
  180.           END
  181.         END
  182.       ELSIF M IS Oberon.ControlMsg THEN
  183.         WITH M: Oberon.ControlMsg DO
  184.           IF M.id = Oberon.mark THEN
  185.             Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, M.X, M.Y);
  186.             Oberon.DrawCursor(Oberon.Pointer, Oberon.Star, M.X, M.Y)
  187.           ELSE Menu.handle(Menu, M); Main.handle(Main, M)
  188.           END
  189.         END
  190.        ELSIF M IS Oberon.CopyMsg THEN
  191.          WITH M: Oberon.CopyMsg DO Copy(V(Viewer), V1); M.F := V1 END
  192.        ELSIF M IS Viewers.ViewerMsg THEN
  193.          WITH M: Viewers.ViewerMsg DO
  194.            IF M.id = Viewers.restore THEN Restore(V)
  195.            ELSIF M.id = Viewers.modify THEN Modify(V, M.Y, M.H)
  196.            ELSIF M.id = Viewers.suspend THEN Suspend(V)
  197.            END
  198.          END
  199.       ELSE Menu.handle(Menu, M); Main.handle(Main, M)
  200.       END
  201.     END
  202.   END Handle;
  203.   PROCEDURE New* (Menu, Main: Display.Frame; menuH, X, Y: INTEGER): Viewer; 
  204.     VAR V: Viewer;
  205.   BEGIN NEW(V);
  206.     V.handle := Handle; V.dsc := Menu; V.dsc.next := Main; V.menuH := menuH;
  207.     Viewers.Open(V, X, Y); Restore(V);
  208.     RETURN V
  209.   END New;
  210. END MenuViewers.
  211.