home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 22 / saa / mnusched.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-01-04  |  10.2 KB  |  329 lines

  1. (* ----------------------------------------------------- *)
  2. (*                      MNUSCHED.PAS                     *)
  3. (*                                                       *)
  4. (* ■ MenuScheduler: Implementiert die für vertikale und  *)
  5. (*   horizontale Menüs gemeinsamen Methoden.             *)
  6. (* ■ SlideBarMenu: Ein horizontales Menü, das nur Ein-   *)
  7. (*   träge vom Type "SlideBarItem" aufnimmt. Soll als    *)
  8. (*   "Mainmenu" im Pulldownmenü gebraucht werden.        *)
  9. (* ■ PopUpMenu: Ein vertikales Menü, das alle Typen von  *)
  10. (*   Einträgen annimmt, die von "PopUpItem" abstammen.   *)
  11. (*   Gedacht als "Submenu" im Pulldownmenü; könnte auch  *)
  12. (*   als eigenständiges Menü gebraucht werden. Init      *)
  13. (*   müssen die Koordinaten für den Rahmen angegeben     *)
  14. (*   werden, auch hier findet keinerlei Überprüfung der  *)
  15. (*   Koordinaten statt.                                  *)
  16. (*                                                       *)
  17. (*           (c) 1991 by R.Reichert & toolbox            *)
  18. (* ----------------------------------------------------- *)
  19. UNIT MnuSched;
  20.  
  21. INTERFACE
  22.  
  23. USES Stuff, MouKey,   WinVSM, Windows,
  24.      Lists, SAASched, MnuItems;
  25.  
  26. CONST                                      { ReturnCodes: }
  27.   SchOk        = 0;  { alles Ok                           }
  28.   SchEvNotMine = 1;  { Event nicht meins                  }
  29.   SchActNext   = 2;  { aktiviere nächsten Scheduler       }
  30.   SchActPrev   = 3;  { aktiviere vorhergehenden Scheduler }
  31.   SchEvAccepted= 4;  { Event akzeptiert                   }
  32.  
  33.   ActNextSubMenu = 5;  { aktiviere vorhergehend. Untermenü}
  34.   ActPrevSubMenu = 6;  { aktiviere nächstes Untermenü     }
  35.   ActSubMenu     = 7;  { aktiviere aktuelles Untermenü    }
  36.  
  37.   MenuSelected   = 8;  { Menü - ExeItem gewählt           }
  38.   MenuCanceled   = 9;  { Menü - mit ESC abgebrochen, aber
  39.                          Einträge vom Typ "SwitchItem"
  40.                          können trotzem verändert sein,
  41.                          also immer abfragen              }
  42.   MenuItDirectSel= 10; { Menü - DirectExeItem wurde ange-
  43.                          wählt                            }
  44.  
  45. TYPE
  46.   MenuSchedulerPtr = ^MenuScheduler;
  47.   MenuScheduler    = OBJECT (SAAScheduler)
  48.  
  49.     ItemList : DListCollectionPtr;
  50.  
  51.     CONSTRUCTOR Init;
  52.     PROCEDURE Clear;                               VIRTUAL;
  53.     PROCEDURE Display;                             VIRTUAL;
  54.     PROCEDURE Add (NewItem : MenuItemPtr);         VIRTUAL;
  55.     PROCEDURE CheckEvent (VAR Ev : EventObj);      VIRTUAL;
  56.     PROCEDURE SetActive;                           VIRTUAL;
  57.     PROCEDURE SetPassive;                          VIRTUAL;
  58.     FUNCTION GetResult : BYTE;
  59.     FUNCTION GetItemNr (n:BYTE) : MenuItemPtr;     VIRTUAL;
  60.     DESTRUCTOR Done;                               VIRTUAL;
  61.   END;
  62.  
  63.   SlideBarMenuPtr = ^SlideBarMenu;
  64.   SlideBarMenu    = OBJECT (MenuScheduler)
  65.  
  66.     PROCEDURE CheckEvent (VAR Ev : EventObj);      VIRTUAL;
  67.   END;
  68.  
  69.   PopUpMenuPtr = ^PopUpMenu;
  70.   PopUpMenu    = OBJECT (MenuScheduler)
  71.     Win : WindowPtr;
  72.  
  73.     CONSTRUCTOR Init (x1, y1,
  74.                       x2, y2 : BYTE;
  75.                       VSM    : WExtVSMPtr);
  76.     PROCEDURE Open;
  77.     PROCEDURE Close;
  78.     PROCEDURE CheckEvent (VAR Ev : EventObj);      VIRTUAL;
  79.   END;
  80.  
  81. IMPLEMENTATION
  82.  
  83. (* ───────────────────────────────────────────────────── *)
  84. (*             Implementation von MenuScheduler          *)
  85. (* ───────────────────────────────────────────────────── *)
  86. CONSTRUCTOR MenuScheduler.Init;
  87. BEGIN
  88.   SAAScheduler.Init;
  89.   ActiveItem := 1;
  90.   ItemList := New (DListCollectionPtr, Init);
  91.   IF ItemList=NIL THEN
  92.     Fail;
  93. END;
  94.  
  95. PROCEDURE MenuScheduler.Clear;
  96. BEGIN
  97.   IF NOT Displayed THEN BEGIN
  98.     ItemList^.Clear;
  99.     ItemNum := 0;  ActiveItem := 0;
  100.   END;
  101. END;
  102.  
  103. PROCEDURE MenuScheduler.Display;
  104. BEGIN
  105.   SAAScheduler.Display;
  106.   MenuItemPtr (ItemList^.GotoFirstData)^.Display;
  107.   WHILE NOT (ItemList^.IsOnLast) DO
  108.     MenuItemPtr (ItemList^.GotoNextData)^.Display;
  109. END;
  110.  
  111. PROCEDURE MenuScheduler.Add (NewItem : MenuItemPtr);
  112. BEGIN
  113.   IF (NewItem<>NIL) AND (NOT Displayed) THEN BEGIN
  114.     ItemList^.Put (NewItem);
  115.     Inc (ItemNum);
  116.   END;
  117. END;
  118.  
  119. PROCEDURE MenuScheduler.CheckEvent (VAR Ev : EventObj);
  120.   VAR i, Answer : WORD;
  121.       SearchAct : BOOLEAN;
  122. BEGIN
  123.   ReturnCode := SchEvNotMine;
  124.   IF (NOT Displayed) THEN Exit;
  125.   SearchAct := FALSE;
  126.   IF (ReturnCode=SchEvNotMine) THEN BEGIN
  127.     IF Active THEN BEGIN
  128.       WITH MenuItemPtr (ItemList^.GetActData)^ DO BEGIN
  129.         CheckEvent (Ev);
  130.         Answer := GetReturnCode;
  131.       END;
  132.       IF Answer<>ItEvNotMine THEN
  133.         CASE Answer OF
  134.           ItEvAccepted : ReturnCode := SchEvAccepted;
  135.           ItDirectSelected : ReturnCode := MenuItDirectSel;
  136.           ItSelected : ReturnCode := MenuSelected;
  137.           ItActNext :
  138.             BEGIN
  139.               WITH MenuItemPtr (ItemList^.
  140.                      GotoNextData)^ DO BEGIN
  141.                 SetActive;
  142.                 IF GetReturnCode=ItFinish THEN BEGIN
  143.                   MenuItemPtr (ItemList^.
  144.                     GotoNextData)^.SetActive;
  145.                   Inc (ActiveItem);
  146.                 END;
  147.               END;
  148.               Inc (ActiveItem);
  149.               IF ActiveItem>ItemNum THEN
  150.                 ActiveItem := 1;
  151.               ReturnCode := SchEvAccepted;
  152.             END;
  153.           ItActPrev :
  154.             BEGIN
  155.               WITH MenuItemPtr (ItemList^.
  156.                      GotoPrevData)^ DO BEGIN
  157.                 SetActive;
  158.                 IF GetReturnCode=ItFinish THEN BEGIN
  159.                   MenuItemPtr (ItemList^.
  160.                     GotoPrevData)^.SetActive;
  161.                   Dec (ActiveItem);
  162.                 END;
  163.               END;
  164.               Dec (ActiveItem);
  165.               IF ActiveItem<1 THEN
  166.               ActiveItem := ItemNum;
  167.               ReturnCode := SchEvAccepted;
  168.             END;
  169.         END
  170.       ELSE
  171.         IF (Ev.EventType=EvKeyPressed) AND
  172.            (Ev.Key=ESC) THEN BEGIN
  173.           MenuItemPtr (ItemList^.GetActData)^.SetPassive;
  174.           ReturnCode := MenuCanceled;
  175.         END ELSE
  176.           SearchAct := TRUE;
  177.     END;
  178.  
  179.     IF (ActiveItem=0) OR (SearchAct) THEN BEGIN
  180.       i := 1;  Answer := 0;
  181.       WITH ItemList^ DO BEGIN
  182.         MenuItemPtr (GotoFirstData)^.SetMenu (Active);
  183.         MenuItemPtr (GetActData)^.CheckEvent (Ev);
  184.         Answer := MenuItemPtr (GetActData)^.GetReturnCode;
  185.         WHILE (NOT (IsOnLast)) AND
  186.               (Answer=ItEvNotMine) DO BEGIN
  187.           MenuItemPtr (GotoNextData)^.SetMenu (Active);
  188.           MenuItemPtr (GetActData)^.CheckEvent (Ev);
  189.           Answer := MenuItemPtr (GetActData)^.GetReturnCode;
  190.           Inc (i);
  191.         END;
  192.         IF (Answer=ItEvAccepted) OR
  193.            (Answer=ItSelected) THEN BEGIN
  194.           IF SearchAct THEN
  195.             GetItemNr (ActiveItem)^.SetPassive;
  196.           SetActNodeTo (i);
  197.           ActiveItem := i;
  198.           IF Answer=ItEvAccepted THEN
  199.             Self.ReturnCode := SchEvAccepted
  200.           ELSE
  201.             Self.ReturnCode := MenuSelected;
  202.           {^^^ sonst wird der von ItemList gesetzt }
  203.           MenuItemPtr (GetActData)^.SetActive;
  204.           SetActive;
  205.         END ELSE BEGIN
  206.           IF (Answer=ItDirectSelected) THEN BEGIN
  207.             ReturnCode := MenuItDirectSel;
  208.             ActiveItem := i;
  209.           END;
  210.           SetActNodeTo (ActiveItem);
  211.         END;
  212.       END;
  213.     END;
  214.   END;
  215. END;
  216.  
  217. PROCEDURE MenuScheduler.SetActive;
  218. BEGIN
  219.   IF Displayed THEN BEGIN
  220.     SAAScheduler.SetActive;
  221.     ItemList^.SetActNodeTo (ActiveItem);
  222.     MenuItemPtr (ItemList^.GetActData)^.SetActive;
  223.   END;
  224. END;
  225.  
  226. PROCEDURE MenuScheduler.SetPassive;
  227. BEGIN
  228.   IF Displayed THEN BEGIN
  229.     SAAScheduler.SetPassive;
  230.     ItemList^.SetActNodeTo (ActiveItem);
  231.     MenuItemPtr (ItemList^.GetActData)^.SetPassive;
  232.   END;
  233. END;
  234.  
  235. FUNCTION MenuScheduler.GetResult;
  236. BEGIN
  237.   GetResult := GetActiveItem;
  238. END;
  239.  
  240. FUNCTION MenuScheduler.GetItemNr (n : BYTE) : MenuItemPtr;
  241.   VAR i : WORD;
  242. BEGIN
  243.   i := 1;
  244.   GetItemNr := MenuItemPtr (ItemList^.GotoFirstData);
  245.   WHILE (i<ItemNum) AND (i<n) DO BEGIN
  246.     GetItemNr := MenuItemPtr (ItemList^.GotoNextData);
  247.     Inc (i);
  248.   END;
  249. END;
  250.  
  251. DESTRUCTOR MenuScheduler.Done;
  252. BEGIN
  253.   Dispose (ItemList, Done);
  254. END;
  255.  
  256. (* ───────────────────────────────────────────────────── *)
  257. (*            Implementation von SlideBarMenu            *)
  258. (* ───────────────────────────────────────────────────── *)
  259. PROCEDURE SlideBarMenu.CheckEvent (VAR Ev : EventObj);
  260. BEGIN
  261.   MenuScheduler.CheckEvent (Ev);
  262.   IF ReturnCode=SchEvNotMine THEN BEGIN
  263.     IF (Ev.EventType=EvKeyPressed) AND
  264.        (Ev.Key=CurDown) THEN
  265.       ReturnCode := ActSubMenu;
  266.   END ELSE
  267.     IF ReturnCode=MenuSelected THEN
  268.       ReturnCode := ActSubMenu;
  269. END;
  270.  
  271. (* ───────────────────────────────────────────────────── *)
  272. (*               Implementation von PopUpMenu            *)
  273. (* ───────────────────────────────────────────────────── *)
  274. CONSTRUCTOR PopUpMenu.Init (x1, y1,
  275.                             x2, y2 : BYTE;
  276.                             VSM    : WExtVSMPtr);
  277. BEGIN
  278.   IF MenuScheduler.Init THEN BEGIN
  279.     Win := New (WindowPtr, Init (VSM));
  280.     IF Win<>NIL THEN BEGIN
  281.       Win^.SetXY (x1, y1, x2, y2);
  282.       Win^.SetClearWin (On);
  283.       Win^.SetBackColor (MenuFrameColor);
  284.       Win^.SetColors (MenuFrameColor, 0, 0, 0);
  285.       Win^.SetFrame (1);
  286.     END ELSE
  287.       Fail;
  288.   END ELSE
  289.     Fail;
  290. END;
  291.  
  292. PROCEDURE PopUpMenu.Open;
  293. BEGIN
  294.   Win^.Open;
  295.   IF Win^.IsOpened THEN BEGIN
  296.     Display;
  297.     SetActive;
  298.   END;
  299. END;
  300.  
  301. PROCEDURE PopUpMenu.Close;
  302. BEGIN
  303.   SetPassive;
  304.   Win^.Close;
  305. END;
  306.  
  307. PROCEDURE PopUpMenu.CheckEvent (VAR Ev : EventObj);
  308. BEGIN
  309.   MenuScheduler.CheckEvent (Ev);
  310.   IF ReturnCode=MenuCanceled THEN
  311.     Close;
  312.   IF (ReturnCode=SchEvNotMine) AND
  313.      (Ev.EventType=EvKeyPressed) THEN BEGIN
  314.     IF (Ev.Key=CurLeft) THEN BEGIN
  315.       ReturnCode := ActPrevSubMenu;
  316.       Close;
  317.     END;
  318.     IF (Ev.Key=CurRight) THEN BEGIN
  319.       ReturnCode := ActNextSubMenu;
  320.       Close;
  321.     END;
  322.   END;
  323. END;
  324.  
  325. END.
  326. (* ----------------------------------------------------- *)
  327. (*                Ende von MNUSCHED.PAS                  *)
  328. (* ----------------------------------------------------- *)
  329.