home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / tvision / tvpas / xviews.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1992-11-10  |  17.2 KB  |  678 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      XVIEWS.PAS                        *)
  3. (*                                                        *)
  4. (*              Erweiterte Fensterobjekte                 *)
  5. (*       (C) 1992 by Christian Ohr & DMV-Verlag           *)
  6. (* ------------------------------------------------------ *)
  7. {$R-,S-,I-,B-,D-,L-,V-,A+,F+,O+,X+}
  8.  
  9.  
  10. UNIT XViews;
  11.  
  12.  
  13. INTERFACE
  14.  
  15.  
  16. USES Objects, Views, Drivers, Menus, XMenus, App;
  17.  
  18. CONST
  19.   cmSysMenu     = 140;
  20.   cmShrink      = 141;
  21.   cmWhoIsWindow = 142;
  22.   cmWinMenu     = 143;
  23.  
  24.   wfShrink    = $10;
  25.   sfShrunk    = $1000;
  26.  
  27.   cBlueMenuWindow = cBlueWindow + #2#3#4#5#6#7;
  28.   cCyanMenuWindow = cCyanWindow + #2#3#4#5#6#7;
  29.   cGrayMenuWindow = cGrayWindow + #2#3#4#5#6#7;
  30.  
  31.  
  32. TYPE
  33.   (* Das Rahmenobjekt für tShrinkWindow. Es stellt        *)
  34.   (* zusätzlich einen Shrink-Button zur Verfügung. Wird   *)
  35.   (* er gedrückt, wird ein entsprechendes Ereignis zum    *)
  36.   (* Fenster geschickt                                    *)
  37.  
  38.   pShrinkFrame = ^tShrinkFrame;
  39.   tShrinkFrame = OBJECT(tFrame)
  40.     PROCEDURE Draw; VIRTUAL;
  41.     PROCEDURE HandleEvent(VAR Event: tEvent); VIRTUAL;
  42.   END;
  43.  
  44.  
  45.   (* Das Rahmenobjekt für tXWindow. Wird das Schließfeld  *)
  46.   (* betätigt, setzt es den Befehl cmSysMenu ab.          *)
  47.  
  48.   pXFrame = ^tXFrame;
  49.   tXFrame = OBJECT(tShrinkFrame)
  50.     PROCEDURE Draw; VIRTUAL;
  51.     PROCEDURE HandleEvent(VAR Event: tEvent); VIRTUAL;
  52.   END;
  53.  
  54.  
  55.   (* Ein Fenster, das auf die Botschaft cmWhoIsWindow     *)
  56.   (* seine Adresse bekannt gibt und sich somit auch als   *)
  57.   (* Fenstertyp identifiziert. Wichtig f. die Window-List *)
  58.   (* in XDIALOGS. Kann sich außerdem selbst numerieren.   *)
  59.  
  60.   pIDWindow = ^tIDWindow;
  61.   tIDWindow = OBJECT(tWindow)
  62.     CONSTRUCTOR Init (VAR Bounds: tRect; ATitle: tTitleStr;
  63.                       ANumber: INTEGER);
  64.     DESTRUCTOR Done; VIRTUAL;
  65.     CONSTRUCTOR Load (VAR S: tStream);
  66.     PROCEDURE HandleEvent(VAR Event: tEvent); VIRTUAL;
  67.   END;
  68.  
  69.  
  70.   (* Diese Fensterart besitzt seine eigene Menü- und      *)
  71.   (* Statuszeile. Diese werden über InitMenuBar bzw.      *)
  72.   (* InitStatusLine initialisiert. Der Befehl cmWinMenu   *)
  73.   (* aktiviert die fensterinterne Menüzeile               *)
  74.  
  75.   pMenuWindow = ^tMenuWindow;
  76.   tMenuWindow = OBJECT(tIDWindow)
  77.     WinMenuBar: pMenuBar;
  78.     WinStatusLine: pStatusLine;
  79.     CONSTRUCTOR Init (VAR Bounds: tRect; ATitle: tTitleStr;
  80.                       ANumber: INTEGER);
  81.     CONSTRUCTOR Load (VAR S: tStream);
  82.     PROCEDURE Close; VIRTUAL;
  83.     FUNCTION GetPalette: pPalette; VIRTUAL;
  84.     PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
  85.     PROCEDURE InitMenuBar; VIRTUAL;
  86.     PROCEDURE InitStatusLine; VIRTUAL;
  87.     PROCEDURE SetState (AState: WORD; Enable: BOOLEAN);
  88.                        VIRTUAL;
  89.     PROCEDURE Store (VAR S: tStream); VIRTUAL;
  90.   END;
  91.  
  92.  
  93.   (* Ein Fenster v. Typ tShrinkWindow kann a. Symbolgröße *)
  94.   (* zusammenschrumpfen, falls das Bit wfShrink in Flags  *)
  95.   (* gesetzt ist (default)                                *)
  96.  
  97.   pShrinkWindow = ^tShrinkWindow;
  98.   tShrinkWindow = OBJECT(tMenuWindow)
  99.     SaveFlags: BYTE;
  100.     SaveOptions: WORD;
  101.     SaveBounds: tRect;
  102.     CONSTRUCTOR Init(VAR Bounds: tRect; ATitle: tTitleStr;
  103.                      ANumber: INTEGER);
  104.     CONSTRUCTOR Load (VAR S: tStream);
  105.     PROCEDURE ChangeBounds (VAR Bounds: tRect); VIRTUAL;
  106.     FUNCTION GetPalette: pPalette; VIRTUAL;
  107.     PROCEDURE HandleEvent(VAR Event: tEvent); VIRTUAL;
  108.     PROCEDURE InitFrame; VIRTUAL;
  109.     PROCEDURE SetState (AState: WORD; Enable: BOOLEAN);
  110.                        VIRTUAL;
  111.     PROCEDURE Shrink(Enable: BOOLEAN); VIRTUAL;
  112.     PROCEDURE SizeLimits (VAR Min, Max: tPoint); VIRTUAL;
  113.     PROCEDURE Store (VAR S: tStream); VIRTUAL;
  114.   END;
  115.  
  116.  
  117.   (* Ein Fenster, das den Schließknopf doppelt belegt.    *)
  118.   (* Wird er mit der linken Maustaste angeklickt bzw.wird *)
  119.   (* Ctrl-F3 gedrückt, öffnet sich ein Systemmenü. Mit d. *)
  120.   (* rechten Maustaste bzw. Alt-F3 schließt es sich wie   *)
  121.   (* gewohnt.                                             *)
  122.  
  123.   pXWindow = ^tXWindow;
  124.   tXWindow = OBJECT(tShrinkWindow)
  125.     SysMenu: pMenu;
  126.     CONSTRUCTOR Init(VAR Bounds: tRect; ATitle: tTitleStr;
  127.                      ANumber: INTEGER; ASysMenu: pMenu);
  128.     CONSTRUCTOR Load (VAR S: tStream);
  129.     PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
  130.     PROCEDURE InitFrame; VIRTUAL;
  131.   END;
  132.  
  133.  
  134.  
  135. CONST
  136.   rShrinkFrame: tStreamRec = (
  137.     ObjType: 1400;
  138.     VmtLink: Ofs(TypeOf(tShrinkFrame)^);
  139.     Load:    @tShrinkFrame.Load;
  140.     Store:   @tShrinkFrame.Store
  141.   );
  142.   rXFrame: tStreamRec = (
  143.     ObjType: 1401;
  144.     VmtLink: Ofs(TypeOf(tXFrame)^);
  145.     Load:    @tXFrame.Load;
  146.     Store:   @tXFrame.Store
  147.   );
  148.   rIDWindow: tStreamRec = (
  149.     ObjType: 1402;
  150.     VmtLink: Ofs(TypeOf(tIDWindow)^);
  151.     Load:    @tIDWindow.Load;
  152.     Store:   @tIDWindow.Store
  153.   );
  154.   rMenuWindow: tStreamRec = (
  155.     ObjType: 1403;
  156.     VmtLink: Ofs(TypeOf(tMenuWindow)^);
  157.     Load:    @tMenuWindow.Load;
  158.     Store:   @tMenuWindow.Store
  159.   );
  160.   rShrinkWindow: tStreamRec = (
  161.     ObjType: 1404;
  162.     VmtLink: Ofs(TypeOf(tShrinkWindow)^);
  163.     Load:    @tShrinkWindow.Load;
  164.     Store:   @tShrinkWindow.Store
  165.   );
  166.   rXWindow: tStreamRec = (
  167.     ObjType: 1405;
  168.     VmtLink: Ofs(TypeOf(tXWindow)^);
  169.     Load:    @tXWindow.Load;
  170.     Store:   @tXWindow.Store
  171.   );
  172.  
  173.  
  174. FUNCTION  wnAutoNumber: INTEGER;
  175. PROCEDURE InitStdSysMenu;
  176. PROCEDURE RegisterXViews;
  177.  
  178.  
  179. VAR
  180.   StdSysMenu: pMenu;
  181.  
  182.  
  183. IMPLEMENTATION
  184.  
  185.  
  186. CONST
  187.   WinNumberFlag : INTEGER = 0;
  188.  
  189.  
  190.  
  191. (* ------------------------------------------------------ *)
  192. (*                     tShrinkFrame                       *)
  193. (* ------------------------------------------------------ *)
  194.  
  195.  
  196. PROCEDURE tShrinkFrame.Draw;
  197. VAR
  198.   Color: BYTE;
  199.   C: CHAR;
  200. BEGIN
  201.   tFrame.Draw;
  202.   IF Owner^.GetState(sfSelected) AND
  203.      (pWindow(Owner)^.Flags AND wfShrink <> 0) THEN BEGIN
  204.     IF GetState(sfDragging) THEN
  205.       Color := 5 ELSE
  206.       Color := 3;
  207.     IF pWindow(Owner)^.GetState(sfShrunk) THEN
  208.       C := #24 ELSE BEGIN
  209.       C := #25;
  210.       IF (pWindow(Owner)^.Number > 0) AND
  211.          (Owner^.Size.X > MinWinSize.X + 6) THEN
  212.         WriteChar(Size.X - 10, 0, Chr(pWindow(Owner)^.Number
  213.                   + 48), Color, 1);
  214.     END;
  215.     WriteChar(Size.X - 8,  0, '[', Color, 1);
  216.     WriteChar(Size.X - 7,  0, C, 5, 1);
  217.     WriteChar(Size.X - 6,  0, ']', Color, 1);
  218.   END;
  219. END;
  220.  
  221.  
  222. PROCEDURE tShrinkFrame.HandleEvent (VAR Event: tEvent);
  223.  
  224.   FUNCTION ShrinkButtonPosition: BOOLEAN;
  225.   VAR
  226.     P: tPoint;
  227.   BEGIN
  228.     MakeLocal(Event.Where, P);
  229.     ShrinkButtonPosition :=
  230.       (P.Y = 0) AND (P.X > Size.X-9) AND (P.X < Size.X - 5)
  231.        AND (Event.Buttons = mbLeftButton)
  232.        AND (pShrinkWindow(Owner)^.Flags AND wfShrink <> 0);
  233.   END;
  234.  
  235. BEGIN
  236.   IF (Event.What = evMouseDown) AND
  237.       ShrinkButtonPosition THEN BEGIN
  238.     Event.What := evCommand;
  239.     Event.Command := cmShrink;
  240.     PutEvent(Event);
  241.     ClearEvent(Event);
  242.   END;
  243.   tFrame.HandleEvent(Event);
  244. END;
  245.  
  246.  
  247.  
  248. (* ------------------------------------------------------ *)
  249. (*                        tXFrame                         *)
  250. (* ------------------------------------------------------ *)
  251.  
  252.  
  253. PROCEDURE tXFrame.Draw;
  254. BEGIN
  255.   tShrinkFrame.Draw;
  256.   IF Owner^.GetState(sfSelected) THEN
  257.     WriteChar(3, 0, #31, 5, 1);
  258. END;
  259.  
  260.  
  261. PROCEDURE tXFrame.HandleEvent (VAR Event: tEvent);
  262.  
  263.   FUNCTION CloseButtonPosition: BOOLEAN;
  264.   VAR
  265.     P: tPoint;
  266.   BEGIN
  267.     MakeLocal(Event.Where, P);
  268.     CloseButtonPosition :=
  269.       (P.Y = 0) AND (P.X > 1) AND (P.X < 5)
  270.        AND (Event.Buttons = mbLeftButton)
  271.        AND (pXWindow(Owner)^.SysMenu <> NIL);
  272.   END;
  273.  
  274. BEGIN
  275.   IF (Event.What = evMouseDown) AND
  276.       CloseButtonPosition THEN BEGIN
  277.     Event.What := evCommand;
  278.     Event.Command := cmSysMenu;
  279.     PutEvent(Event);
  280.     ClearEvent(Event);
  281.   END;
  282.   tShrinkFrame.HandleEvent(Event);
  283. END;
  284.  
  285.  
  286. (* ------------------------------------------------------ *)
  287. (*                      tIDWindow                         *)
  288. (* ------------------------------------------------------ *)
  289.  
  290.  
  291. CONSTRUCTOR tIDWindow.Init(VAR Bounds: tRect; ATitle:
  292.                            tTitleStr; ANumber: INTEGER);
  293. BEGIN
  294.   IF (ANumber > 0) AND (ANumber < 10) THEN
  295.     IF WinNumberFlag AND (1 SHL ANumber) = 0 THEN
  296.       WinNumberFlag := WinNumberFlag OR (1 SHL ANumber) ELSE
  297.       ANumber := wnNoNumber;
  298.   tWindow.Init(Bounds, ATitle, ANumber);
  299. END;
  300.  
  301.  
  302. DESTRUCTOR tIDWindow.Done;
  303. BEGIN
  304.   IF Number <> wnNoNumber THEN
  305.     WinNumberFlag := WinNumberFlag AND NOT (1 SHL Number);
  306.   tWindow.Done;
  307. END;
  308.  
  309.  
  310. CONSTRUCTOR tIDWindow.Load (VAR S: tStream);
  311. BEGIN
  312.   tWindow.Load(S);
  313.   IF (Number > 0) AND (Number < 10) THEN
  314.     WinNumberFlag := WinNumberFlag OR (1 SHL Number);
  315. END;
  316.  
  317.  
  318. PROCEDURE tIDWindow.HandleEvent(VAR Event: tEvent);
  319. BEGIN
  320.   IF (Event.What = evBroadcast) AND
  321.      (Event.Command = cmWhoIsWindow) THEN ClearEvent(Event);
  322.   tWindow.HandleEvent(Event);
  323. END;
  324.  
  325.  
  326.  
  327. (* ------------------------------------------------------ *)
  328. (*                     tMenuWindow                        *)
  329. (* ------------------------------------------------------ *)
  330.  
  331.  
  332. CONSTRUCTOR tMenuWindow.Init (VAR Bounds: tRect; ATitle:
  333.                               tTitleStr; ANumber: INTEGER);
  334. BEGIN
  335.   tIDWindow.Init(Bounds, ATitle, ANumber);
  336.   InitMenuBar;
  337.   InitStatusLine;
  338.   IF WinMenuBar <> NIL THEN
  339.     Insert(WinMenuBar);
  340.   IF WinStatusLine <> NIL THEN
  341.     Insert(WinStatusLine);
  342.   MinWinSize.X := 32;
  343.   MinWinSize.Y :=  9;
  344. END;
  345.  
  346.  
  347. CONSTRUCTOR tMenuWindow.Load (VAR S: tStream);
  348. BEGIN
  349.   tIDWindow.Load(S);
  350.   GetSubViewPtr(S, WinMenuBar);
  351.   GetSubViewPtr(S, WinStatusLine);
  352. END;
  353.  
  354.  
  355. PROCEDURE tMenuWindow.Close;
  356. BEGIN
  357.   Message(Desktop, evBroadcast, cmOwnerCloses, @Self);
  358.   tIDWindow.Close;
  359. END;
  360.  
  361.  
  362. FUNCTION tMenuWindow.GetPalette: PPalette;
  363. CONST
  364.   P: STRING[Length(cBlueMenuWindow)] = cBlueMenuWindow;
  365. BEGIN
  366.   GetPalette := @P;
  367. END;
  368.  
  369.  
  370. PROCEDURE tMenuWindow.HandleEvent (VAR Event: tEvent);
  371. BEGIN
  372.   tIDWindow.HandleEvent(Event);
  373.   IF (Event.What = evCommand) AND
  374.      (Event.Command = cmWinMenu) AND
  375.      (WinMenuBar <> NIL) THEN BEGIN
  376.     Message(WinMenuBar, evCommand, cmMenu, @Self);
  377.     ClearEvent(Event);
  378.   END;
  379. END;
  380.  
  381.  
  382. PROCEDURE tMenuWindow.InitMenuBar;
  383. BEGIN
  384.   WinMenuBar := NIL;
  385. END;
  386.  
  387.  
  388. PROCEDURE tMenuWindow.InitStatusLine;
  389. BEGIN
  390.   WinStatusLine := NIL;
  391. END;
  392.  
  393.  
  394. PROCEDURE tMenuWindow.SetState (AState: WORD;
  395.                                 Enable: BOOLEAN);
  396. BEGIN
  397.   tIDWindow.SetState(AState, Enable);
  398.   IF AState = sfSelected THEN BEGIN
  399.     IF WinMenuBar <> NIL THEN
  400.       IF GetState(sfSelected) THEN
  401.         WinMenuBar^.Show ELSE
  402.         WinMenuBar^.Hide;
  403.     IF WinStatusLine <> NIL THEN
  404.       IF GetState(sfSelected) THEN
  405.         WinStatusLine^.Show ELSE
  406.         WinStatusLine^.Hide;
  407.   END;
  408. END;
  409.  
  410.  
  411. PROCEDURE tMenuWindow.Store (VAR S: tStream);
  412. BEGIN
  413.   tIDWindow.Store(S);
  414.   PutSubViewPtr(S, WinMenuBar);
  415.   PutSubViewPtr(S, WinStatusLine);
  416. END;
  417.  
  418.  
  419.  
  420. (* ------------------------------------------------------ *)
  421. (*                    tShrinkWindow                       *)
  422. (* ------------------------------------------------------ *)
  423.  
  424.  
  425. CONSTRUCTOR tShrinkWindow.Init(VAR Bounds: tRect; ATitle:
  426.                                tTitleStr; ANumber: INTEGER);
  427. BEGIN
  428.   tMenuWindow.Init(Bounds, ATitle, ANumber);
  429.   Flags := Flags OR wfShrink;
  430. END;
  431.  
  432.  
  433. CONSTRUCTOR tShrinkWindow.Load (VAR S: tStream);
  434. BEGIN
  435.   tMenuWindow.Load(S);
  436.   S.Read(SaveFlags, SizeOf(BYTE));
  437.   S.Read(SaveOptions, SizeOf(WORD));
  438.   S.Read(SaveBounds, SizeOf(tRect));
  439. END;
  440.  
  441.  
  442. PROCEDURE tShrinkWindow.ChangeBounds (VAR Bounds: tRect);
  443. VAR
  444.   NewSize : tPoint;
  445.   Min, Max: tPoint;
  446. BEGIN
  447.   (* Entspricht so in etwa 'Locate'. Notwendig, da        *)
  448.   (* tGroup.ChangeBounds nicht Locate, sondern wieder die *)
  449.   (* ChangeBounds-Methode der Subviews aufruft. Somit wür-*)
  450.   (* den symbolisierte Fenster ihre Größe ändern, wenn    *)
  451.   (* die Anzahl der Bildschirmzeilen verändert wird.      *)
  452.  
  453.   SizeLimits(Min, Max);
  454.   NewSize.X := Bounds.B.X - Bounds.A.X;
  455.   NewSize.Y := Bounds.B.Y - Bounds.A.Y;
  456.   IF NewSize.X < Min.X THEN
  457.     Bounds.B.X := Bounds.A.X + Min.X ELSE
  458.     IF NewSize.X > Max.X THEN
  459.       Bounds.B.X := Bounds.A.X + Max.X;
  460.   IF NewSize.Y < Min.Y THEN
  461.     Bounds.B.Y := Bounds.A.Y + Min.Y ELSE
  462.     IF NewSize.Y > Max.Y THEN
  463.       Bounds.B.Y := Bounds.A.Y + Max.Y;
  464.   tMenuWindow.ChangeBounds(Bounds);
  465. END;
  466.  
  467.  
  468. FUNCTION tShrinkWindow.GetPalette: PPalette;
  469. CONST
  470.   cShrunkWin : STRING[Length(cCyanMenuWindow)]
  471.              = cCyanMenuWindow;
  472. BEGIN
  473.   IF GetState(sfShrunk) THEN
  474.     GetPalette := @cShrunkWin ELSE
  475.     GetPalette := tMenuWindow.GetPalette;
  476. END;
  477.  
  478.  
  479. PROCEDURE tShrinkWindow.HandleEvent(VAR Event: tEvent);
  480. BEGIN
  481.   tMenuWindow.HandleEvent(Event);
  482.   IF (Event.What = evCommand) AND (Event.Command = cmShrink)
  483.      AND CommandEnabled(cmShrink)
  484.      AND (Flags AND wfShrink <> 0) THEN
  485.     Shrink(NOT GetState(sfShrunk)) ELSE Exit;
  486.   ClearEvent(Event);
  487. END;
  488.  
  489.  
  490. PROCEDURE tShrinkWindow.InitFrame;
  491. VAR
  492.   R: tRect;
  493. BEGIN
  494.   GetExtent(R);
  495.   Frame := New(pShrinkFrame, Init(R));
  496. END;
  497.  
  498.  
  499. PROCEDURE tShrinkWindow.SetState (AState: WORD;
  500.                                 Enable: BOOLEAN);
  501.  
  502.   PROCEDURE HideAll (P: pView); FAR;
  503.   BEGIN
  504.     IF (P <> pView(Frame)) THEN P^.Hide;
  505.   END;
  506.  
  507.   PROCEDURE ShowAll (P: pView); FAR;
  508.   BEGIN
  509.     IF (P <> pView(Frame)) THEN P^.Show;
  510.   END;
  511.  
  512. BEGIN
  513.   IF GetState(sfShrunk) THEN BEGIN
  514.     tIDWindow.SetState(AState, Enable);
  515.     IF GetState(sfShrunk) THEN
  516.       ForEach(@HideAll) ELSE
  517.       ForEach(@ShowAll);
  518.   END ELSE BEGIN
  519.     tMenuWindow.SetState(AState, Enable);
  520.     IF GetState(sfShrunk) THEN
  521.       ForEach(@HideAll);
  522.   END;
  523.   IF (AState = sfSelected) AND Enable THEN
  524.     IF Flags AND wfShrink <> 0 THEN
  525.       EnableCommands([cmShrink]) ELSE
  526.       DisableCommands([cmShrink]);
  527. END;
  528.  
  529.  
  530. PROCEDURE tShrinkWindow.Shrink (Enable: BOOLEAN);
  531. VAR
  532.   R: tRect;
  533.   Min, Max: tPoint;
  534. BEGIN
  535.   SetState(sfShrunk, Enable);
  536.   IF Enable THEN BEGIN
  537.     SaveFlags := Flags;
  538.     SaveOptions := Options;
  539.     GetBounds(R);
  540.     SaveBounds.Copy(R);
  541.     Flags := Flags AND NOT (wfGrow + wfZoom);
  542.     Options := Options AND NOT ofTileable;
  543.     SizeLimits(Min, Max);
  544.     Owner^.GetExtent(R);
  545.     MoveTo(R.B.X - Min.X, R.B.Y - Succ(Number) * Min.Y);
  546.     GrowTo(Min.X, Min.Y);
  547.     Owner^.SelectNext(FALSE);
  548.   END ELSE BEGIN
  549.     Flags := SaveFlags;
  550.     IF Flags and wfZoom <> 0 THEN
  551.       EnableCommands([cmZoom]) ELSE
  552.       DisableCommands([cmZoom]);
  553.     Options := SaveOptions;
  554.     Locate(SaveBounds);
  555.   END;
  556. END;
  557.  
  558.  
  559. PROCEDURE tShrinkWindow.SizeLimits (VAR Min, Max: tPoint);
  560. BEGIN
  561.   tMenuWindow.SizeLimits(Min, Max);
  562.   IF GetState(sfShrunk) THEN BEGIN
  563.     Min.Y := 2;
  564.     Max := Min;
  565.   END;
  566. END;
  567.  
  568.  
  569. PROCEDURE tShrinkWindow.Store (VAR S: tStream);
  570. BEGIN
  571.   tMenuWindow.Store(S);
  572.   S.Write(SaveFlags, SizeOf(BYTE));
  573.   S.Write(SaveOptions, SizeOf(WORD));
  574.   S.Write(SaveBounds, SizeOf(tRect));
  575. END;
  576.  
  577.  
  578.  
  579. (* ------------------------------------------------------ *)
  580. (*                      tXWindow                          *)
  581. (* ------------------------------------------------------ *)
  582.  
  583.  
  584. CONSTRUCTOR tXWindow.Init(VAR Bounds: tRect; ATitle:
  585.                           tTitleStr; ANumber: INTEGER;
  586.                           ASysMenu: pMenu);
  587. BEGIN
  588.   tShrinkWindow.Init(Bounds, ATitle, ANumber);
  589.   SysMenu := ASysMenu;
  590. END;
  591.  
  592.  
  593. CONSTRUCTOR tXWindow.Load (VAR S: tStream);
  594. BEGIN
  595.   tShrinkWindow.Load(S);
  596.   SysMenu := StdSysMenu;
  597. END;
  598.  
  599.  
  600. PROCEDURE tXWindow.HandleEvent (VAR Event: tEvent);
  601.  
  602.   PROCEDURE SysMenuBox;
  603.   VAR
  604.     R: tRect;
  605.     P: pMenuBox;
  606.   BEGIN
  607.     REPEAT UNTIL NOT MouseEvent(Event, evNothing);
  608.     R.Assign(0, 0, 10, 2);
  609.     P := New(pAltF3MenuBox, Init(R, SysMenu, NIL));
  610.     P^.MoveTo(Origin.X + 2, Origin.Y + 1);
  611.     Message(P, evBroadcast, cmCommandSetChanged, NIL);
  612.     Event.What := evCommand;
  613.     Event.Command := Desktop^.ExecView(P);
  614.     Event.InfoPtr := @Self;
  615.     Dispose(P, Done);
  616.     IF Event.Command <> 0 THEN PutEvent(Event);
  617.     ClearEvent(Event);
  618.   END;
  619.  
  620. BEGIN
  621.   tShrinkWindow.HandleEvent(Event);
  622.  
  623.   IF (Event.What = evCommand) AND
  624.      (Event.Command = cmSysMenu) AND
  625.      (SysMenu <> NIL) THEN SysMenuBox;
  626. END;
  627.  
  628.  
  629. PROCEDURE tXWindow.InitFrame;
  630. VAR
  631.   R: tRect;
  632. BEGIN
  633.   GetExtent(R);
  634.   Frame := New(pXFrame, Init(R));
  635. END;
  636.  
  637.  
  638. PROCEDURE InitStdSysMenu;
  639. BEGIN
  640.   StdSysMenu := NewMenu(NIL);
  641.   StartMenuAt(StdSysMenu);
  642.     AddItem('~S~chließen', 'Alt-F3', kbAltF3, cmClose, 0);
  643.     AddLine;
  644.     AddItem('Sym~b~ol', '', kbNoKey, cmShrink, 0);
  645.     AddItem('~V~ollbild', 'F5', kbF5, cmZoom, 0);
  646.     AddItem('~W~eiter', 'F6', kbF6, cmNext, 0);
  647.     AddItem('~Z~urück', 'Shift-F6', kbShiftF6, cmPrev, 0);
  648. END;
  649.  
  650.  
  651. FUNCTION wnAutoNumber: INTEGER;
  652. VAR
  653.   I: INTEGER;
  654. BEGIN
  655.   I := 1;
  656.   WHILE (I < 10) AND (WinNumberFlag AND (1 SHL I) <> 0) DO
  657.     Inc(I);
  658.   wnAutoNumber := I MOD 10;
  659. END;
  660.  
  661.  
  662. PROCEDURE RegisterXViews;
  663. BEGIN
  664.   RegisterType(rShrinkFrame);
  665.   RegisterType(rXFrame);
  666.   RegisterType(rIDWindow);
  667.   RegisterType(rMenuWindow);
  668.   RegisterType(rShrinkWindow);
  669.   RegisterType(rXWindow);
  670. END;
  671.  
  672.  
  673. END.
  674.  
  675.  
  676. (* ------------------------------------------------------ *)
  677. (*                 Ende von XVIEWS.PAS                    *)
  678.