home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / Chip_2004-07_cd1.bin / tema / aos / files / Oberon.exe / Oberon / Docu.exe / Docu / ViewSkeleton.Mod (.txt) < prev    next >
Oberon Text  |  2000-02-29  |  6KB  |  162 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 ViewSkeleton; (** portable *)    (* jt, 13.12.94 *)
  6.     IMPORT Display, Display3, Fonts, Gadgets, Oberon, Objects;
  7.     TYPE
  8.         Frame* = POINTER TO FrameDesc;
  9.         FrameDesc* = RECORD (Gadgets.ViewDesc)
  10.             (* view is adjusted to model size, no border *)
  11.         END;
  12.     PROCEDURE ToModel (F: Frame; x, y: INTEGER; VAR M: Display.FrameMsg);
  13.         VAR obj: Display.Frame;
  14.     BEGIN
  15.         IF (F.obj # NIL) & (F.obj IS Display.Frame) THEN
  16.             obj := F.obj(Display.Frame);
  17.             M.x := x - obj.X; M.y := y + F.H - (obj.Y + obj.H);
  18.             Gadgets.Send(F, x, y, obj, M)
  19.         END
  20.     END ToModel;
  21.     PROCEDURE Restore (F: Frame; x, y: INTEGER; dlink: Objects.Object);
  22.         VAR R: Display3.Mask; M: Display.DisplayMsg;
  23.     BEGIN
  24.         Gadgets.MakeMask(F, x, y, dlink, R);    (* simplified *)
  25.         IF F.obj = NIL THEN
  26.             Display3.ReplConst(R, Display3.green, x, y, F.W, F.H, Display.replace);
  27.             Display3.String(R, Display3.FG, x + 3, y + 3, Fonts.Default,
  28.                                 "empty view", Display3.textmode)
  29.         ELSE
  30.             M.device := Display.screen; M.id := Display.full; M.F := NIL;
  31.             M.dlink := dlink; M.res := -1; ToModel(F, x, y, M)
  32.         END ;
  33.         IF Gadgets.selected IN F.state THEN
  34.             Display3.FillPattern(R, Display3.blue, Display3.selectpat,
  35.                                 x, y, x, y, F.W, F.H, Display3.paint)
  36.         END
  37.     END Restore;
  38.     PROCEDURE Adjust (F: Frame; X, Y, W, H: INTEGER);
  39.         VAR MM: Display.ModifyMsg;
  40.     BEGIN
  41.         MM.F := F; MM.mode := Display.display;
  42.         MM.dX := X - F.X; MM.dY := Y - F.Y; MM.dW := W - F.W; MM.dH := H - F.H;
  43.         MM.X := X; MM.Y := Y; MM.W := W; MM.H := H;
  44.         Display.Broadcast(MM)
  45.     END Adjust;
  46.     PROCEDURE Consume (F: Frame; x, y: INTEGER; VAR M: Display.ConsumeMsg);
  47.         VAR f: Objects.Object; CM: Display.ControlMsg;
  48.     BEGIN f := M.obj;
  49.         IF (M.id = Display.drop) & (M.F = F) & (F.obj = NIL) & (f IS Gadgets.Frame) THEN
  50.             WITH f: Gadgets.Frame DO
  51.                 f.slink := NIL;
  52.                 CM.id := Display.remove; CM.F := f; Display.Broadcast(CM);
  53.                 F.obj := f; f.X := 0; f.Y := 0; f.mask := NIL;
  54.                 F.state := f.state*{Gadgets.transparent};
  55.                 Adjust(F, F.X + M.u, F.Y + F.H - 1 + M.v, f.W, f.H); M.res := 0
  56.             END
  57.         ELSE ToModel(F, x, y, M)
  58.         END;
  59.     END Consume;
  60.     PROCEDURE UpdateMask (F: Frame; x, y: INTEGER; VAR M: Display3.UpdateMaskMsg);
  61.         VAR R: Display3.Mask; O: Display3.OverlapMsg;
  62.     BEGIN
  63.         IF M.F = F.obj THEN
  64.             NEW(R); Display3.Open(R);
  65.             Display3.Add(R, 0, -F.obj(Display.Frame).H+1,
  66.                                 F.obj(Display.Frame).W, F.obj(Display.Frame).H);
  67.             O.F := F.obj(Display.Frame); O.x := 0; O.y := 0; O.M := R; O.res := -1;
  68.             O.dlink := NIL; ToModel(F, x, y, O); M.res := 0
  69.         ELSIF M.F = F THEN
  70.             NEW(F.mask); Display3.Open(F.mask);
  71.             Display3.Add(F.mask, 0, -F.H+1, F.W, F.H);
  72.             F.mask.x := 0; F.mask.y := 0
  73.         ELSE ToModel(F, x, y, M)
  74.         END
  75.     END UpdateMask;
  76.     PROCEDURE FrameHandler* (F: Objects.Object; VAR M: Objects.ObjMsg);
  77.         VAR x, y, u, v: INTEGER; F0: Frame;
  78.     BEGIN
  79.         WITH F: Frame DO
  80.             IF M IS Objects.AttrMsg THEN
  81.                 WITH M: Objects.AttrMsg DO
  82.                     IF (M.id = Objects.get) & (M.name = "Gen") THEN
  83.                         M.s := "ViewSkeleton.NewFrame"; M.class := Objects.String; M.res := 0
  84.                     ELSE Gadgets.framehandle(F, M)
  85.                     END
  86.                 END
  87.             ELSIF M IS Objects.CopyMsg THEN
  88.                 WITH M: Objects.CopyMsg DO
  89.                     IF M.stamp = F.stamp THEN M.obj := F.dlink
  90.                     ELSE
  91.                         NEW(F0); F.stamp := M.stamp; F.dlink := F0;
  92.                         Gadgets.CopyFrame(M, F, F0); F0.border := F.border; M.obj := F0
  93.                     END
  94.                 END
  95.             ELSIF M IS Objects.FileMsg THEN Gadgets.framehandle(F, M)
  96.             ELSIF M IS Objects.BindMsg THEN Gadgets.framehandle(F, M)
  97.             ELSIF M IS Objects.LinkMsg THEN Gadgets.framehandle(F, M)
  98.             ELSIF M IS Objects.FindMsg THEN Gadgets.framehandle(F, M)
  99.             ELSIF M IS Display.FrameMsg THEN
  100.                 WITH M: Display.FrameMsg DO
  101.                     x := M.x + F.X; y := M.y + F.Y;
  102.                     u := M.x; v := M.y; (* save *)
  103.                     IF M IS Display.DisplayMsg THEN
  104.                         WITH M: Display.DisplayMsg DO
  105.                             IF M.device = Display.screen THEN
  106.                                 IF (M.F = NIL) OR (M.F = F) THEN Restore(F, x, y, M.dlink)
  107.                                 ELSE ToModel(F, x, y, M)
  108.                                 END
  109.                             ELSIF M.device = Display.printer THEN 
  110.                             END
  111.                         END
  112.                     ELSIF M IS Display.ConsumeMsg THEN
  113.                         Consume(F, x, y, M(Display.ConsumeMsg))
  114.                     ELSIF M IS Gadgets.UpdateMsg THEN 
  115.                         WITH M: Gadgets.UpdateMsg DO
  116.                             IF M.obj = F.obj THEN Restore(F, x, y, M.dlink)
  117.                             ELSE ToModel(F, x, y, M)
  118.                             END
  119.                         END
  120.                     ELSIF M IS Oberon.InputMsg THEN
  121.                         WITH M: Oberon.InputMsg DO
  122.                             IF F.obj # NIL THEN ToModel(F, x, y, M)
  123.                             ELSE Gadgets.framehandle(F, M)
  124.                             END
  125.                         END
  126.                     ELSIF M IS Oberon.ControlMsg THEN ToModel(F, x, y, M)
  127.                     ELSIF M IS Display.LocateMsg THEN Gadgets.framehandle(F, M)
  128.                     ELSIF M IS Display.SelectMsg THEN
  129.                         Gadgets.framehandle(F, M) (* should be more elaborate *)
  130.                     ELSIF M IS Display.ModifyMsg THEN
  131.                         WITH M: Display.ModifyMsg DO
  132.                             IF M.F = F THEN Gadgets.framehandle(F, M)
  133.                             ELSIF M.F = F.obj THEN
  134.                                 ToModel(F, x, y, M); Adjust(F, F.X + M.dX, F.Y + M.dY, M.W, M.H)
  135.                             ELSE ToModel(F, x, y, M)
  136.                             END
  137.                         END
  138.                     ELSIF M IS Display.ControlMsg THEN
  139.                         IF (M(Display.ControlMsg).id = Display.remove) & (M.F = F.obj) THEN
  140.                             F.obj := NIL; Gadgets.Update(F)
  141.                         END
  142.                     ELSIF M IS Display3.OverlapMsg THEN Gadgets.framehandle(F, M);
  143.                     ELSIF M IS Display3.UpdateMaskMsg THEN
  144.                         UpdateMask(F, x, y, M(Display3.UpdateMaskMsg))
  145.                     ELSE ToModel(F, x, y, M)    
  146.                     END;
  147.                     M.x := u; M.y := v (* restore *)
  148.                 END
  149.             ELSIF F.obj # NIL THEN F.obj.handle(F.obj, M)
  150.             END
  151.         END
  152.     END FrameHandler;
  153.     PROCEDURE InitFrame* (F: Frame);
  154.     BEGIN F.W := 100; F.H := 100; F.border := 0; F.handle := FrameHandler
  155.     END InitFrame;
  156.     PROCEDURE NewFrame*;
  157.         VAR F: Frame;
  158.     BEGIN NEW(F); InitFrame(F); Objects.NewObj := F;
  159.     END NewFrame;
  160. END ViewSkeleton.
  161. Gadgets.Insert ViewSkeleton.NewFrame ~
  162.