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

  1. (* ----------------------------------------------------- *)
  2. (*                     FRAMEWIN.PAS                      *)
  3. (*                                                       *)
  4. (* ■ FrameWindow: Beinhaltet nur die Fähigkeit, einen    *)
  5. (*   Fensterrahmen in verschiedenen Arten und mit oder   *)
  6. (*   ohne Schatten zu zeichnen. Der Konstruktor Copy er- *)
  7. (*   laubt die Übernahme (ohne Prüfung) aller Daten aus  *)
  8. (*   einem anderen Objekt des gleichen Typs; Show        *)
  9. (*   zeichnet den Rahmen mit Hilfe von internen Methoden,*)
  10. (*   die keine Prüfung der Variablen vornehmen, also     *)
  11. (*   wirklich nur intern gebraucht werden sollten.       *)
  12. (*                                                       *)
  13. (*         (c) 1991 by R.Reichert & toolbox              *)
  14. (* ----------------------------------------------------- *)
  15. UNIT FrameWin;
  16.  
  17. INTERFACE
  18.  
  19. USES UBase, WinVSM;
  20.  
  21. CONST
  22.   On       = TRUE;
  23.   Off      = FALSE;
  24.   FrameNo  = 5;          { Anzahl Rahmenarten, Arten:     }
  25.   FSingle  = 1;          { einfach                        }
  26.   FDouble  = 2;          { doppelt                        }
  27.   FHorizD  = 3;          { horizontal doppelt             }
  28.   FVerticD = 4;          { vertikal doppelt               }
  29.   FMixed   = 5;          { rechts und unten doppelt       }
  30.   Frames   : ARRAY [1..FrameNo] OF STRING [8] =
  31.                ('┌┐└┘──││',  '╔╗╚╝══║║',
  32.                 '╒╕╘╛══││',  '╓╖╙╜──║║',
  33.                 '┌╖╘╝─═│║');
  34.   Invers   = $70;
  35.   StdFrCol = Invers;
  36.   StdTLCol = 15+Invers;
  37.   StdBLCol = Invers;
  38.   StdShaCol= Invers;
  39.  
  40. TYPE
  41.   FrameWindowPtr = ^FrameWindow;
  42.   FrameWindow =
  43.     OBJECT (Base)
  44.  
  45.       x1, y1, x2, y2,                  { Ecken            }
  46.       Frame,                           { Rahmenart        }
  47.       ShaCol,                          { Schattenfarbe    }
  48.       FrCol,                           { Rahmenfarbe      }
  49.       TLCol,                           { Kopfzeilenfarbe  }
  50.       BLCol : BYTE;                    { Fusszeilenfarbe  }
  51.       TL,                              { Kopfzeile        }
  52.       BL    : STRING;                  { Fusszeile        }
  53.       VarOk,                           { Variablen gültig?}
  54.       Shadow,                          { Schatten ?       }
  55.       Opened: BOOLEAN;                 { geöffnet ?       }
  56.       VSM   : WExtVSMPtr;
  57.  
  58.       CONSTRUCTOR Init (NewVSM : WExtVSMPtr);
  59.       CONSTRUCTOR Copy (NewFW  : FrameWindow);
  60.       PROCEDURE Show;                              VIRTUAL;
  61.       PROCEDURE Hide;                              VIRTUAL;
  62.       PROCEDURE DrawFrame;           { INTERN }    VIRTUAL;
  63.       PROCEDURE DrawTitles;          { INTERN }    VIRTUAL;
  64.       PROCEDURE DrawShadow;          { INTERN }    VIRTUAL;
  65.       PROCEDURE CheckVars;           { INTERN }    VIRTUAL;
  66.       { Die folgenden Set... Methoden übernehmen Daten nur,
  67.         wenn Opened FALSE ist.                            }
  68.       PROCEDURE SetColors
  69.         (FrameCol, TLineCol,
  70.          BLineCol, ShadowCol : BYTE);              VIRTUAL;
  71.       PROCEDURE SetTitles
  72.         (TopLine, BottomLine : STRING);            VIRTUAL;
  73.       PROCEDURE SetShadow (Sha : BOOLEAN);         VIRTUAL;
  74.       PROCEDURE SetFrame (NewFrame : BYTE);        VIRTUAL;
  75.       PROCEDURE SetXY (NewX1, NewY1,
  76.                        NewX2, NewY2 : BYTE);       VIRTUAL;
  77.  
  78.       FUNCTION IsOpened : BOOLEAN;                 VIRTUAL;
  79.       FUNCTION ShadowOn : BOOLEAN;                 VIRTUAL;
  80.       FUNCTION GetFrameCol : BYTE;                 VIRTUAL;
  81.       FUNCTION GetTLineCol : BYTE;                 VIRTUAL;
  82.       FUNCTION GetBLineCol : BYTE;                 VIRTUAL;
  83.       FUNCTION GetShadowCol: BYTE;                 VIRTUAL;
  84.       FUNCTION GetTopLine : STRING;                VIRTUAL;
  85.       FUNCTION GetBottomLine : STRING;             VIRTUAL;
  86.       FUNCTION GetVarOK : BOOLEAN;                 VIRTUAL;
  87.       FUNCTION GetFrame : BYTE;                    VIRTUAL;
  88.       FUNCTION GetX1 : BYTE;                       VIRTUAL;
  89.       FUNCTION GetY1 : BYTE;                       VIRTUAL;
  90.       FUNCTION GetX2 : BYTE;                       VIRTUAL;
  91.       FUNCTION GetY2 : BYTE;                       VIRTUAL;
  92.     END;
  93.  
  94. IMPLEMENTATION
  95.  
  96. CONSTRUCTOR FrameWindow.Init (NewVSM : WExtVSMPtr);
  97. BEGIN
  98.   IF NewVSM<>NIL THEN BEGIN
  99.     Opened := FALSE;
  100.     VSM    := NewVSM;
  101.     SetFrame (FSingle);                { einfacher Rahmen }
  102.     SetColors (StdFrCol, StdTLCol,          { Grundfarben }
  103.                StdBLCol, StdShaCol);
  104.     SetShadow (Off);                  { und kein Schatten }
  105.     SetXY (1, 1, VSM^.GetXLength, VSM^.GetYLength);
  106.                                            { volle Grösse }
  107.     SetTitles ('', '');                      { ohne Titel }
  108.     VarOk := TRUE;         { alles noch in bester Ordnung }
  109.   END;
  110. END;
  111.  
  112. CONSTRUCTOR FrameWindow.Copy (NewFW : FrameWindow);
  113. BEGIN
  114.   IF NewFW.VSM=NIL THEN Fail
  115.                    ELSE Self := NewFW;
  116. END;
  117.  
  118. (* ----------------------------------------------------- *)
  119. (* Show "zeichnet" das Fenster in den Bildschirm -       *)
  120. (* ACHTUNG: Welcher "Bildschirm" das ist, bestimmt das   *)
  121. (* Anwenderobjekt vom Typ ExtVSManager(Ptr), auf das VSM *)
  122. (* zeigt !                                               *)
  123. (* ----------------------------------------------------- *)
  124. PROCEDURE FrameWindow.Show;
  125. BEGIN
  126.   CheckVars;
  127.   IF VarOk THEN BEGIN
  128.     DrawFrame;                               { den Rahmen }
  129.     DrawTitles;                   { und die "Titel" sowie }
  130.     DrawShadow;                         { ev den Schatten }
  131.     Opened := TRUE;                          { "zeichnen" }
  132.   END;
  133. END;
  134.  
  135. PROCEDURE FrameWindow.Hide;
  136. BEGIN
  137.   Opened := FALSE;    { kann sich noch nicht "verstecken" }
  138. END;
  139.  
  140. PROCEDURE FrameWindow.DrawFrame;
  141. BEGIN
  142.   WITH VSM^ DO BEGIN
  143.     FillPart (Succ (x1), y1, Pred (x2), y1,
  144.               FrCol, Frames [Frame, 5]);
  145.     FillPart (Succ (x1), y2, Pred (x2), y2,
  146.               FrCol, Frames [Frame, 6]);
  147.     FillPart (x1, Succ (y1), x1, Pred (y2),
  148.               FrCol, Frames [Frame, 7]);
  149.     FillPart (x2, Succ (y1), x2, Pred (y2),
  150.               FrCol, Frames [Frame, 8]);
  151.     WriteChr (x1, y1, FrCol, Frames [Frame, 1]);
  152.     WriteChr (x2, y1, FrCol, Frames [Frame, 2]);
  153.     WriteChr (x1, y2, FrCol, Frames [Frame, 3]);
  154.     WriteChr (x2, y2, FrCol, Frames [Frame, 4]);
  155.   END;
  156. END;
  157.  
  158. PROCEDURE FrameWindow.DrawTitles;
  159. BEGIN
  160.   WITH VSM^ DO BEGIN
  161.     IF Length (TL) < Pred (x2-x1) THEN
  162.       WriteStr (x1+(x2-x1) DIV 2-Length (TL) DIV 2,
  163.                 y1, TLCol, TL);
  164.     IF Length (BL) < Pred (x2-x1) THEN
  165.       WriteStr (Pred (x2) - Length (BL), y2, BLCol, BL);
  166.   END;
  167. END;
  168.  
  169. PROCEDURE FrameWindow.DrawShadow;
  170. BEGIN
  171.   IF Shadow THEN
  172.     WITH VSM^ DO BEGIN
  173.       FillPartAttr (Succ (x2), Succ (y1+1),
  174.                     Succ (x2+1),Succ (y2), ShaCol);
  175.       FillPartAttr (Succ (x1+1), Succ (y2),
  176.                     Succ (x2+1), Succ (y2), ShaCol);
  177.     END;
  178. END;
  179.  
  180. (* ----------------------------------------------------- *)
  181. (* CheckVars setzt via SetXY die Koordinaten noch einmal,*)
  182. (* damit sichergestellt ist, dass der Schatten schon ON/ *)
  183. (* OFF gesetzt ist. So wird sichergestellt, dass der ev  *)
  184. (* vorhandene Schatten Platz hat (SetShadow kann auch    *)
  185. (* nach SetXY aufgerufen werden, dann ist keine Kontrolle*)
  186. (* mehr möglich).                                        *)
  187. (* ----------------------------------------------------- *)
  188. PROCEDURE FrameWindow.CheckVars;
  189. BEGIN
  190.   SetXY (x1, y1, x2, y2);
  191. END;
  192.  
  193. PROCEDURE FrameWindow.SetColors
  194.             (FrameCol, TLineCol,
  195.              BLineCol, ShadowCol : BYTE);
  196. BEGIN
  197.   IF NOT Opened THEN BEGIN
  198.     FrCol := FrameCol;  ShaCol := ShadowCol;
  199.     TLCol := TLineCol;  BLCol  := BLineCol;
  200.   END;
  201. END;
  202.  
  203. PROCEDURE FrameWindow.SetTitles
  204.             (TopLine, BottomLine : STRING);
  205. BEGIN
  206.   IF NOT Opened THEN BEGIN
  207.     TL := TopLine;  BL := BottomLine;
  208.   END;
  209. END;
  210.  
  211. PROCEDURE FrameWindow.SetShadow (Sha : BOOLEAN);
  212. BEGIN
  213.   IF NOT Opened THEN Shadow := Sha;
  214. END;
  215.  
  216. PROCEDURE FrameWindow.SetFrame (NewFrame : BYTE);
  217. BEGIN
  218.   IF (NOT Opened) AND
  219.      (NewFrame>=1) AND
  220.      (NewFrame<=FrameNo) THEN
  221.     Frame := NewFrame;
  222. END;
  223.  
  224. PROCEDURE FrameWindow.SetXY
  225.             (NewX1, NewY1, NewX2, NewY2 : BYTE);
  226.   VAR XL, YL : BYTE;
  227. BEGIN
  228.   IF NOT Opened THEN BEGIN
  229.     XL := VSM^.GetXLength;  YL := VSM^.GetYLength;
  230.     IF Shadow THEN BEGIN        { wenn Schatten, dann ist }
  231.       Dec (XL, 2);  Dec (YL, 1);   { Bildschirm "kleiner" }
  232.     END;
  233.     IF (NewX2>=1) AND (NewX2<=XL) AND
  234.        (NewX1>=1) AND (NewX1<NewX2) AND
  235.        (NewY2>=1) AND (NewY2<=YL) AND
  236.        (NewY1>=1) AND (NewY1<NewY2) THEN BEGIN
  237.       x1 := NewX1;  x2 := NewX2;
  238.       y1 := NewY1;  y2 := NewY2;
  239.       VarOk := TRUE;
  240.     END ELSE
  241.       VarOk := FALSE;
  242.   END;
  243. END;
  244.  
  245. FUNCTION FrameWindow.IsOpened : BOOLEAN;
  246. BEGIN
  247.   IsOpened := Opened;
  248. END;
  249.  
  250. FUNCTION FrameWindow.ShadowOn : BOOLEAN;
  251. BEGIN
  252.   ShadowOn := Shadow;
  253. END;
  254.  
  255. FUNCTION FrameWindow.GetFrameCol : BYTE;
  256. BEGIN
  257.   GetFrameCol := FrCol;
  258. END;
  259.  
  260. FUNCTION FrameWindow.GetTLineCol : BYTE;
  261. BEGIN
  262.   GetTLineCol := TLCol;
  263. END;
  264.  
  265. FUNCTION FrameWindow.GetBLineCol : BYTE;
  266. BEGIN
  267.   GetBLineCol := BLCol;
  268. END;
  269.  
  270. FUNCTION FrameWindow.GetShadowCol: BYTE;
  271. BEGIN
  272.   GetShadowCol := ShaCol;
  273. END;
  274.  
  275. FUNCTION FrameWindow.GetTopLine  : STRING;
  276. BEGIN
  277.   GetTopLine := TL;
  278. END;
  279.  
  280. FUNCTION FrameWindow.GetBottomLine : STRING;
  281. BEGIN
  282.   GetBottomLine := BL;
  283. END;
  284.  
  285. FUNCTION FrameWindow.GetVarOk : BOOLEAN;
  286. BEGIN
  287.   GetVarOk := VarOk;
  288. END;
  289.  
  290. FUNCTION FrameWindow.GetFrame : BYTE;
  291. BEGIN
  292.   GetFrame := Frame;
  293. END;
  294.  
  295. FUNCTION FrameWindow.GetX1 : BYTE;
  296. BEGIN
  297.   GetX1 := x1;
  298. END;
  299.  
  300. FUNCTION FrameWindow.GetY1 : BYTE;
  301. BEGIN
  302.   GetY1 := y1;
  303. END;
  304.  
  305. FUNCTION FrameWindow.GetX2 : BYTE;
  306. BEGIN
  307.   GetX2 := x2;
  308. END;
  309.  
  310. FUNCTION FrameWindow.GetY2 : BYTE;
  311. BEGIN
  312.   GetY2 := y2;
  313. END;
  314.  
  315. END.
  316. (* ----------------------------------------------------- *)
  317. (*               Ende von FRAMEWIN.PAS                   *)
  318. (* ----------------------------------------------------- *)
  319.