home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / turbopas / wndw55.arc / WNDWMGR.PAS < prev    next >
Pascal/Delphi Source File  |  1989-08-24  |  10KB  |  323 lines

  1. { =========================================================================== }
  2. { WndwMgr.pas - Multi-level Virtual Window demo             ver 5.5, 08-24-89 }
  3. {               to demonstrate powerful window management.                    }
  4. {                                                                             }
  5. { This program shows you how the window management utilities allow you to     }
  6. { access any window at any time.  You can even hide the top level window for  }
  7. { displaying later.                                                           }
  8. {   The demo places a very heavy load on screen processing by doing full      }
  9. { screen scrolling on the virtual screens and then updating them on the CRT.  }
  10. { Notice that the full windows are updated even if covered.  The constantly   }
  11. { scrolling screens are there just to make it more apparent where and how     }
  12. { fast the windows are being updated.                                         }
  13. {   ** !! NOTE: Set UseInt9handler to false when using integrated debugging.  }
  14. {   ** !!       Set back to true only when fully debugged and running.        }
  15. {   Run program.  Instructions are on the screen.                             }
  16. {   Copyright (C) 1987-1989 by James H. LeMay,  All rights reserved.          }
  17. { =========================================================================== }
  18. program ManagementDemo;
  19.  
  20. {$M 16384, 50000, 50000 }
  21. { R-,S-,I-,D-,T-,F-,V-,B-,N-,L+ }       { TP4 directives }
  22. {$A-,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-}  { TP5 directives }
  23.  
  24. uses
  25.   Crt,Qwik,Wndw,Keyb,Goof;
  26.  
  27. type
  28.   Str80 = string[80];
  29.  
  30. const
  31.   StrA: array[1..25] of Str80 = (
  32.     '╓──────────────────────────────────────────────────────────╖',
  33.     '╙─╥────────── E A G L E  Performance Software ───────────╥─╜',
  34.     '  ╙─╥───── P.O. Box 292786, Lewisville, TX  75029 ─────╥─╜',
  35.     '    ╙──────────────────────────────────────────────────╜',
  36.     'WNDW55.TPU  gives you  unparalleled  performance  in  window',
  37.     'software for  Turbo Pascal 5.5.  It features  fixed, hidden,',
  38.     'and true virtual windows with true random-access.   Now your',
  39.     'windows can be dynamically updated even if they are covered!',
  40.     'The  speed of  hidden and  virtual screens is phenomenal  as',
  41.     'they use the virtual writing routines of QWIK55.TPU.',
  42.     '',
  43.     'RANDOM ACCESS  is the power to  pull any  window  to the top',
  44.     'even  if they  are covered without  shuffling!   This  means',
  45.     'your  windows  can be in any order  and not  just stacked or',
  46.     'tiled.',
  47.     '',
  48.     'VIRTUAL WINDOWS -  The screens for virtual windows can be of',
  49.     'any  row  and  column  size in  a 64k buffer.  The  rows and',
  50.     'columns  can  range  from 1 to 255.  These  windows  can  be',
  51.     'resized, zoomed, or scrolled right on the screen!',
  52.     '',
  53.     'Programmers  will find the code very easy to use and simple.',
  54.     'All  the  hard  working  code is  kept transparent.  Several',
  55.     'window-relative and window management routines are included.',
  56.     '');
  57.  
  58.   { ASCII Key codes: }
  59.   Alt1     = #120;
  60.   Alt2     = #121;
  61.   Alt3     = #122;
  62.   Alt4     = #123;
  63.   LArr     = #75;
  64.   RArr     = #77;
  65.   UArr     = #72;
  66.   DArr     = #80;
  67.   HomeKey  = #71;
  68.   EndKey   = #79;
  69.   PgUp     = #73;
  70.   PgDn     = #81;
  71.   EscKey   = #27;
  72.   RetKey   = #13;
  73.   F5Key    = #63;
  74.   F10Key   = #68;
  75.  
  76.   ScrollLock = $10;
  77.   MoveMode   = $01;
  78.   ResizeMode = $02;
  79.   ScrollMode = $04;
  80.   AlterMode: byte = MoveMode;
  81.  
  82. var
  83.   RowStep,ColStep,i,Line,
  84.   FastRowStep,FastColStep: byte;
  85.   NumOfRows,NumOfCols:     integer;
  86.   Name:                    WindowNames;
  87.   Key:                     char;
  88.   ExtKey,Typematic:        boolean;
  89.  
  90. function ScrollLockOn: boolean;
  91. begin
  92.   ScrollLockOn:=((KeyStatus and ScrollLock)<>0);
  93. end;
  94.  
  95. procedure UpdateKeyStatus;
  96. var S: string[20];
  97. begin
  98.   if ScrollLockOn then
  99.     begin
  100.       if not VirtualFlag then AlterMode:=MoveMode;
  101.       Qwrite (CRTrows,61,White+GreenBG,#24#25#27#26);
  102.       case AlterMode of
  103.         MoveMode:   S:='-Move   ';
  104.         ResizeMode: S:='-Resize ';
  105.         ScrollMode: S:='-Scroll ';
  106.       end;
  107.       QwriteEos (Black +GreenBG,S);
  108.       QwriteEos (Yellow+GreenBG,' SCROLL');
  109.     end
  110.   else Qfill (CRTrows,61,1,20,GreenBG,' ');
  111. end;
  112.  
  113. { For this demo, not only are the windows being scrolled on the screen, }
  114. { but also in RAM whether they are seen or not!  So, let's give it a    }
  115. { heavy CPU and video load, but still see how fast it can go. }
  116. procedure UpdateWindows;
  117. begin
  118.   WriteToVirtual (Name);
  119.   WscrollUp;                 { For the heaviest load, scroll up entire screen }
  120.   WWrite (25,2,StrA[Line]);  { Wrap a new line at the bottom }
  121.   VUpdateWindow;
  122.   inc (Name);
  123.   if Name=Window4 then
  124.     begin
  125.       Name := Window1;
  126.       inc (Line);
  127.       Line := succ(pred(Line) mod 25);
  128.     end;
  129. end;
  130.  
  131. { Here's where the windows are updated!  When the keyboard is idle, the  }
  132. { following procedure is run.  You may change the contents of course.    }
  133. {$F+}
  134. procedure KbdIdle;
  135. begin
  136.   UpdateWindows;
  137.   WriteToCRT;
  138.   UpdateKeyStatus;
  139. end;
  140. {$F-}
  141.  
  142. procedure InitStepRates;
  143. begin
  144.   if CRTrows>40 then
  145.        FastRowStep:=4
  146.   else FastRowStep:=2;
  147.   FastColStep:=CRTcols div 20;
  148. end;
  149.  
  150. procedure AdjustStepRates;
  151. begin
  152.   if Typematic then
  153.     begin
  154.       ColStep:=FastColStep;
  155.       RowStep:=FastRowStep;
  156.     end
  157.   else
  158.     begin
  159.       ColStep:=1;
  160.       RowStep:=1;
  161.     end;
  162. end;
  163.  
  164. procedure GetSteps (VAR NumOfRows,NumOfCols: integer);
  165. var Rows,Cols: integer;
  166. begin
  167.   AdjustStepRates;
  168.   Rows:=0;
  169.   Cols:=0;
  170.   case Key of
  171.     UArr:    Rows :=-RowStep;
  172.     DArr:    Rows := RowStep;
  173.     LArr:    Cols :=-ColStep;
  174.     RArr:    Cols := ColStep;
  175.     PgUp:    Rows :=-255;
  176.     PgDn:    Rows := 255;
  177.     HomeKey: Cols :=-255;
  178.     EndKey:  Cols := 255;
  179.   end;
  180.   NumOfRows := Rows;
  181.   NumOfCols := Cols;
  182. end;
  183.  
  184. procedure AlterWindow;
  185. var Rows,Cols: integer;
  186. begin
  187.   if not VirtualFlag then AlterMode:=MoveMode;
  188.   if ExtKey then
  189.     begin
  190.       GetSteps (Rows,Cols);
  191.       case AlterMode of
  192.         MoveMode:    MoveWindow    (Rows,Cols);
  193.         ResizeMode:  VResizeWindow (Rows,Cols);
  194.         ScrollMode:  VScrollView   (Rows,Cols);
  195.       end;
  196.     end
  197.   else
  198.     if VirtualFlag then
  199.       case Key of
  200.         'M','m': AlterMode:=MoveMode;
  201.         'R','r': AlterMode:=ResizeMode;
  202.         'S','s': AlterMode:=ScrollMode;
  203.       end;
  204. end;
  205.  
  206. procedure WriteContents;
  207. begin
  208.   for i:=1 to 25 do
  209.     WWrite (i,2,StrA[i]);
  210. end;
  211.  
  212. procedure CreateScreen;
  213. begin
  214.   PreferMultiTask := true;
  215.   InitWindow (Yellow+BlackBG,true);
  216.   SetVirtualSize (25,80);   { To keep heap limited }
  217.   TitleOfs := 0;            { Place titles at extreme left or right }
  218.   with Margins do
  219.     begin
  220.     { TopMargin:=2; }
  221.       BottomMargin:=pred(CRTrows);
  222.     { RightMargin:=79;
  223.       Leftmargin:=2; }
  224.     end;
  225.   Qfill (CRTrows,1,1,CRTcols,GreenBG,' ');
  226.   Qwrite (CRTrows,2,White+GreenBG,'Alt:1-4');
  227.   QwriteEos (Black+GreenBG,'-Window Num  ');
  228.   QwriteEos (White+GreenBG,'ESC');
  229.   QwriteEos (Black+GreenBG,'-Hide  ');
  230.   QwriteEos (White+GreenBG,'F5');
  231.   QwriteEos (Black+GreenBG,'-Zoom  ');
  232.   QwriteEos (White+GreenBG,'F10');
  233.   QwriteEos (Black+GreenBG,'-Quit  ');
  234.   InitStepRates;
  235.   SetWindowModes ({ZoomMode or} CursorOffMode or VirtualMode);
  236.  
  237.   { -- Virtual Window 1 -- }
  238.   MakeWindow ( 1, 1,20,60,Black+BrownBG,Black+BrownBG,SingleBrdr,Window1);
  239.   WriteToVirtual (TWS.WSname);
  240.   TitleWindow (Top,Left,White+BrownBG,'1 Virtual Window ');
  241.   WriteContents;
  242.   VUpdateWindow;
  243.  
  244.   { -- Virtual Window 2 -- }
  245.   WriteToCRT;
  246.   MakeWindow ( 6,10,16,60,White+GreenBG,White+GreenBG,SingleBrdr,Window2);
  247.   WriteToVirtual (TWS.WSname);
  248.   TitleWindow (Top,Left,Yellow+GreenBG,'2 Virtual Window  ');
  249.   WriteContents;
  250.   VUpdateWindow;
  251.  
  252.   { -- Virtual Window 3 -- }
  253.   WriteToCRT;
  254.   MakeWindow (11,20,14,59,White+BlueBG,White+BlueBG,SingleBrdr,Window3);
  255.   WriteToVirtual (TWS.WSname);
  256.   TitleWindow (Top,Left,Yellow+BlueBG,'3 Virtual Window  ');
  257.   WriteContents;
  258.   VUpdateWindow;
  259.  
  260.   { -- Fixed Window 4 -- }
  261.   WriteToCRT;
  262.   SetWindowModes (CursorOffMode);
  263.   MakeWindow ( 7,42,17,32,Black+LightGrayBG,Black+LightGrayBG,HDoubleBrdr,
  264.               Window4);
  265.   TitleWindow (Top,Left  ,SameAttr,'4');
  266.   TitleWindow (Top,Center,SameAttr,' Fixed Window ');
  267.   WWriteC ( 1,'DYNAMIC UPDATING!!');
  268.   WBrdrH  ( 2);
  269.   WWriteC ( 3,'Instructions:');
  270.   TWS.WSLine := SingleBrdr;
  271.   WLineH  ( 4,3,TWS.Wcols-4);
  272.   WWrite  ( 5,3, 'ESC - Hide top window');
  273.   WWrite  ( 6,3, 'F5  - Zoom virtual window');
  274.   WWrite  ( 7,3, 'F10 - Quit');
  275.   WWrite  ( 8,3, 'Alt:1-4 - Access window');
  276.   WWrite  ( 9,3, 'With ScrollLock on:');
  277.   WWrite  (10,5,   'R - Resize mode');
  278.   WWrite  (11,5,   'S - Scroll mode');
  279.   WWrite  (12,5,   'M - Move   mode');
  280.   WWrite  (13,5,   'Then arrow keys.');
  281.   WWrite  (14,3, 'Ctrl-NumLock to freeze.');
  282.   WWrite  (15,3, 'Any other key to pause.');
  283.   WGotoRC (TWS.Wrows,1);
  284.   ChangeBorder (DoubleBrdr);
  285. end;
  286.  
  287. begin
  288. { Qsnow := false; }
  289.   Keyb.AddrKbdIdle := @KbdIdle;   { Set hook for KbdIdle routine! }
  290.   Keyb.UseInt9handler (true );    { Set to true for solid keyboard action. }
  291.                                   { !!! Set false for debugging !!! }
  292.   CreateScreen;
  293.   Line:=1;
  294.   Name:=Window1;
  295.  
  296.   repeat
  297.     Keyb.ReadKbd (Key,ExtKey,Typematic);
  298.     if ScrollLockOn then
  299.       AlterWindow;
  300.     if ExtKey then
  301.       case Key of
  302.         Alt1..Alt4:
  303.           begin
  304.             RestoreBorder;
  305.             AccessWindow (WindowNames (ord(Key)-pred(ord(Alt1))) );
  306.             ChangeBorder (DoubleBrdr);
  307.           end;
  308.         F5Key: VZoomWindow;
  309.       end
  310.     else
  311.       case Key of
  312.         EscKey: begin
  313.                   HideWindow;
  314.                   ChangeBorder (DoubleBrdr);
  315.                 end;
  316.       end;
  317.   until ExtKey and (Key=F10Key);
  318.  
  319.   AccessWindow (Window0);
  320.   WClrScr;
  321.   SetCursor (CursorInitial);
  322. end.
  323.