home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 09_10 / oop / saasched.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-06-12  |  8.6 KB  |  292 lines

  1. (* -----------------------------------------------------  *)
  2. (*                    SAASCHED.PAS                        *)
  3. (*                                                        *)
  4. (*  SAAScheduler: Verwaltet maximal MaxItems von SAAItem  *)
  5. (*  oder dessen Nachkommen. Anwendung: Siehe Demo.        *)
  6. (*                                                        *)
  7. (*          (c) 1991 by R.Reichert & TOOLBOX              *)
  8. (* ------------------------------------------------------ *)
  9. UNIT SAASched;
  10.  
  11. INTERFACE
  12.  
  13. USES MouKey, SAAItems;
  14.  
  15. CONST                    { Returncodes:                    }
  16.   SchOk     =   0;       { alles Ok                        }
  17.   SchFinish =   1;       { Scheduler beenden               }
  18.   MaxItems  =  20;       { maximale Anzahl Items/Scheduler }
  19.   Tab       =   9;
  20.   ShiftTab  = 271;
  21.  
  22. TYPE
  23.   ItemsArray = ARRAY [1..MaxItems] OF SAAItemPtr;
  24.  
  25.   SAASchedulerPtr = ^SAAScheduler;
  26.   SAAScheduler    = OBJECT
  27.     Items                          : ItemsArray;
  28.     Active, Displayed, HKDisplayed : BOOLEAN;
  29.     ActItem, ItemNum, SaveActItem  : WORD;
  30.     ReturnCode                     : BYTE;
  31.  
  32.     CONSTRUCTOR Init;
  33.     PROCEDURE   AddItem(NewItem : SAAItemPtr);     VIRTUAL;
  34.     PROCEDURE   Open;                              VIRTUAL;
  35.     PROCEDURE   Run;                               VIRTUAL;
  36.     PROCEDURE   RunBy(ItNr : BYTE);                VIRTUAL;
  37.     PROCEDURE   Display;                           VIRTUAL;
  38.     PROCEDURE   DisplayHotKeys;                    VIRTUAL;
  39.     PROCEDURE   Close;                             VIRTUAL;
  40.     PROCEDURE   CheckEvent(VAR Ev : EventObj);     VIRTUAL;
  41.     PROCEDURE   SetActive;                         VIRTUAL;
  42.     PROCEDURE   SetPassive;                        VIRTUAL;
  43.     PROCEDURE   SetDisplayedOff;                   VIRTUAL;
  44.     PROCEDURE   SetXYRel(dx, dy : INTEGER);        VIRTUAL;
  45.     PROCEDURE   SaveConfiguration;                 VIRTUAL;
  46.     PROCEDURE   RestoreConfiguration;              VIRTUAL;
  47.  
  48.     FUNCTION    GetReturnCode : BYTE;              VIRTUAL;
  49.     FUNCTION    IsActive : BOOLEAN;                VIRTUAL;
  50.     FUNCTION    GetActiveItem : BYTE;              VIRTUAL;
  51.     FUNCTION    GetItemNum : BYTE;                 VIRTUAL;
  52.     FUNCTION    IsDisplayed : BOOLEAN;             VIRTUAL;
  53.     FUNCTION    IsHKDisplayed : BOOLEAN;           VIRTUAL;
  54.     FUNCTION    GetSaveItem : BYTE;                VIRTUAL;
  55.     FUNCTION    GetItem(Nr : BYTE) : SAAItemPtr;   VIRTUAL;
  56.     DESTRUCTOR  Done;                              VIRTUAL;
  57.   END;
  58.  
  59. IMPLEMENTATION
  60.  
  61.   CONSTRUCTOR SAAScheduler.Init;
  62.   BEGIN
  63.     ReturnCode := 0;      Active      := FALSE;
  64.     ItemNum    := 0;      ActItem     := 0;
  65.     Displayed  := FALSE;  HKDisplayed := FALSE;
  66.   END;
  67.  
  68.   PROCEDURE SAAScheduler.AddItem(NewItem : SAAItemPtr);
  69.   BEGIN
  70.     IF (NewItem <> NIL) AND (ItemNum < MaxItems) THEN BEGIN
  71.       INC(ItemNum);  Items[ItemNum] := NewItem;
  72.     END;
  73.   END;
  74.  
  75.   PROCEDURE SAAScheduler.Open;
  76.   BEGIN
  77.     IF NOT Displayed THEN SaveConfiguration;
  78.     Display;
  79.     { dieser "Grundscheduler" hat noch keine Fenster o.ä. }
  80.   END;
  81.  
  82.   PROCEDURE SAAScheduler.Run;
  83.   BEGIN
  84.     RunBy(1);
  85.   END;
  86.  
  87.   PROCEDURE SAAScheduler.RunBy(ItNr : BYTE);
  88.   VAR
  89.     Ev   : EventObj;
  90.     Quit : BOOLEAN;
  91.   BEGIN
  92.     IF ItemNum = 0 THEN Exit;
  93.     IF NOT Displayed THEN Open;
  94.     SetPassive;                    { altes Item passiv ... }
  95.     ActItem := ItNr;  Quit := FALSE;
  96.     Items[ActItem]^.SetActive;     { ... und neues aktiv   }
  97.     REPEAT
  98.       EvHand^.WaitForEvent(EvAll, Ev);
  99.       CheckEvent(Ev);
  100.       Quit := (ReturnCode = SchFinish);
  101.                    { bis irgendein EndButton gewählt wurde }
  102.     UNTIL Quit;
  103.     ReturnCode := EndButPtr(Items[ActItem])^.GetSpecRC;
  104.                   { den Endbutton-spezifischen Returncode  }
  105.                   { übernehmen, siehe Demo                 }
  106.   END;
  107.  
  108.   PROCEDURE SAAScheduler.Display;
  109.   VAR
  110.     i : BYTE;
  111.   BEGIN
  112.     IF ItemNum > 0 THEN BEGIN
  113.       Displayed := TRUE;
  114.       FOR i := 1 TO ItemNum DO Items[i]^.Display;
  115.     END;
  116.   END;
  117.  
  118.   PROCEDURE SAAScheduler.DisplayHotKeys;
  119.   VAR
  120.     i : BYTE;
  121.   BEGIN
  122.     IF Displayed THEN BEGIN
  123.       HKDisplayed := TRUE;
  124.       FOR i := 1 TO ItemNum DO Items[i]^.DisplayHotKey;
  125.     END;
  126.   END;
  127.  
  128.   PROCEDURE SAAScheduler.CLOSE;
  129.   BEGIN
  130.     { Kein Fenster vorhanden ! }  SetDisplayedOff;
  131.   END;
  132.  
  133.   PROCEDURE SAAScheduler.CheckEvent(VAR Ev : EventObj);
  134.   VAR
  135.     i, j       : BYTE;
  136.     Answer, RC : BYTE;
  137.   BEGIN
  138.     IF ItemNum > 0 THEN BEGIN
  139.       ReturnCode := SchOk;
  140.       Items[ActItem]^.CheckEvent(Ev);
  141.       Answer := Items[ActItem]^.GetReturnCode;
  142.                { kann das aktive Item das Event auswerten? }
  143.       IF Answer = ItEvNotMine THEN BEGIN
  144.         j := 0;
  145.         FOR i := 1 TO ItemNum DO BEGIN  { nein, alle Items }
  146.           Items[i]^.CheckEvent(Ev);     { durchlaufen      }
  147.           RC := Items[i]^.GetReturnCode;
  148.           IF RC <> ItEvNotMine THEN BEGIN
  149.             j := i;
  150.             Items[ActItem]^.SetPassive;
  151.             ActItem := j;
  152.             Items[ActItem]^.SetActive;
  153.             IF RC = ItFinish THEN     { Endbutton gewählt? }
  154.               ReturnCode := SchFinish;
  155.           END;
  156.         END;
  157.         IF j = 0 THEN      { immer noch nicht ausgewertet? }
  158.           IF Ev.EventType = EvKeyPressed THEN
  159.             CASE Ev.Key OF
  160.               Tab : BEGIN
  161.                       Items[ActItem]^.SetPassive;
  162.                       INC(ActItem);
  163.                       IF ActItem > ItemNum THEN
  164.                         ActItem := 1;
  165.                       Items[ActItem]^.SetActive;
  166.                     END;
  167.               ShiftTab : BEGIN
  168.                            Items[ActItem]^.SetPassive;
  169.                            DEC(ActItem);
  170.                            IF ActItem = 0 THEN
  171.                              ActItem := ItemNum;
  172.                            Items[ActItem]^.SetActive;
  173.                          END;
  174.             END
  175.           ELSE
  176.             IF (Ev.EventType = EvKeyState) AND
  177.                (Ev.StateKey = Alt) THEN DisplayHotKeys;
  178.       END ELSE
  179.         IF Answer = ItFinish THEN
  180.           ReturnCode := SchFinish;
  181.                  { aktiver Button = angewählter Endbutton? }
  182.     END;
  183.   END;
  184.  
  185.   PROCEDURE SAAScheduler.SetActive;
  186.   BEGIN
  187.     IF ActItem > 0 THEN BEGIN
  188.       Active := TRUE;
  189.       Items[ActItem]^.SetActive;
  190.     END;
  191.   END;
  192.  
  193.   PROCEDURE SAAScheduler.SetPassive;
  194.   BEGIN
  195.     IF ActItem > 0 THEN BEGIN
  196.       Active := FALSE;
  197.       Items[ActItem]^.SetPassive;
  198.     END;
  199.   END;
  200.  
  201.   PROCEDURE SAAScheduler.SetXYRel(dx, dy : INTEGER);
  202.   VAR
  203.     i : BYTE;
  204.   BEGIN
  205.     IF ItemNum > 0 THEN BEGIN
  206.       FOR i := 1 TO ItemNum DO    { alle Items durchlaufen }
  207.         Items[i]^.SetXYRel(dx, dy);      { und verschieben }
  208.       Items[ActItem]^.SetActive;
  209.               { aktiven Item "aktivieren" => Cursor setzen }
  210.     END;
  211.   END;
  212.  
  213.   PROCEDURE SAAScheduler.SetDisplayedOff;
  214.   BEGIN
  215.     Displayed := FALSE;  HKDisplayed := FALSE;
  216.   END;
  217.  
  218.   PROCEDURE SAAScheduler.SaveConfiguration;
  219.   VAR
  220.     i : BYTE;
  221.   BEGIN
  222.     IF ItemNum > 0 THEN BEGIN
  223.       SaveActItem := ActItem;
  224.       FOR i := 1 TO ItemNum DO Items[i]^.SaveConfiguration;
  225.     END;
  226.   END;
  227.  
  228.   PROCEDURE SAAScheduler.RestoreConfiguration;
  229.   VAR
  230.     i : BYTE;
  231.   BEGIN
  232.     IF ItemNum > 0 THEN BEGIN
  233.       ActItem := SaveActItem;
  234.       FOR i := 1 TO ItemNum DO Items[i]^.RestoreConfiguration;
  235.     END;
  236.   END;
  237.  
  238.   FUNCTION SAAScheduler.GetReturnCode : BYTE;
  239.   BEGIN
  240.     GetReturnCode := ReturnCode;
  241.     ReturnCode    := SchOk;
  242.   END;
  243.  
  244.   FUNCTION SAAScheduler.IsActive : BOOLEAN;
  245.   BEGIN
  246.     IsActive := Active;
  247.   END;
  248.  
  249.   FUNCTION SAAScheduler.GetActiveItem : BYTE;
  250.   BEGIN
  251.     GetActiveItem := ActItem;
  252.   END;
  253.  
  254.   FUNCTION SAAScheduler.GetItemNum : BYTE;
  255.   BEGIN
  256.     GetItemNum := ItemNum;
  257.   END;
  258.  
  259.   FUNCTION SAAScheduler.IsDisplayed : BOOLEAN;
  260.   BEGIN
  261.     IsDisplayed := Displayed;
  262.   END;
  263.  
  264.   FUNCTION SAAScheduler.IsHKDisplayed : BOOLEAN;
  265.   BEGIN
  266.     IsHKDisplayed := HKDisplayed;
  267.   END;
  268.  
  269.   FUNCTION SAAScheduler.GetSaveItem : BYTE;
  270.   BEGIN
  271.     GetSaveItem := SaveActItem;
  272.   END;
  273.  
  274.   FUNCTION SAAScheduler.GetItem(Nr : BYTE) : SAAItemPtr;
  275.   BEGIN
  276.     IF (Nr > 0) AND(Nr <= ItemNum) THEN
  277.       GetItem := Items[Nr];
  278.   END;
  279.  
  280.   DESTRUCTOR SAAScheduler.Done;
  281.   VAR
  282.     i : BYTE;
  283.   BEGIN
  284.     IF ItemNum > 0 THEN
  285.       FOR i := 1 TO ItemNum DO        { Speicher der Items }
  286.         DISPOSE(Items[i], Done);      { freigeben          }
  287.   END;
  288.  
  289. END.
  290. (* ------------------------------------------------------ *)
  291. (*                 Ende von SAASCHED.PAS                  *)
  292.