home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / tp6goodi / toggle / screen.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1991-01-31  |  8.3 KB  |  285 lines

  1. unit Screen;
  2.  
  3. interface
  4.  
  5.   uses
  6.     Crt, Dos, Objects, Drivers, Views, Menus, Dialogs, App,
  7.     Help_Cmd;
  8.  
  9.   type
  10.     PToggleKeysView = ^TToggleKeysView;
  11.     TToggleKeysView = object(TView)
  12.       OldStatusWord : Word;
  13.       constructor Init(var Bounds: TRect);
  14.       procedure Draw; virtual;
  15.       procedure Update;
  16.     end;
  17.  
  18.   procedure CheckIfKeyPressed( CurrentHelpCtx : word );
  19.  
  20. implementation
  21.  
  22. const
  23.   coNoObject   = 0;
  24.   coDeskTop    = 1;
  25.   coDialog     = 2;
  26.   coMenuBar    = 3;
  27.   coEditWindow = 4;
  28.  
  29. var
  30.   KbdStatusWord : Word absolute $0040:$0017;
  31.   AltPressed : boolean;
  32.   CtrlPressed : boolean;
  33.   ShiftPressed : boolean;
  34.   SecCnt : byte;
  35.   OldHelpCtx : word;
  36.   OldSec, NewSec : byte;
  37.   CurrentObjectType : byte;
  38.  
  39.    {------ ToggleKeys Window object ----------}
  40.  
  41.   constructor TToggleKeysView.Init(var Bounds: TRect);
  42.   begin
  43.     TView.Init(Bounds);
  44.     OldStatusWord := 0;
  45.   end;
  46.  
  47.   procedure TToggleKeysView.Draw;
  48.   var
  49.     S: String[16];
  50.     B: TDrawBuffer;
  51.     C: Byte;
  52.   begin
  53.     OldStatusWord := KbdStatusWord;
  54.  
  55.     { KBDStatusWord at $0040:$0017
  56.       $80 : Ins Active
  57.       $40 : Caps Lock Active
  58.       $20 : Num Lock Active
  59.       $10 : Scroll Lock Active
  60.       $08 : Alt Depressed
  61.       $04 : Ctrl Depressed
  62.       $02 : Left Shift Depressed
  63.       $01 : Right Shift Depressed
  64.     }
  65.       C := GetColor(2);
  66.       S := '                ';
  67.       if (OldStatusWord and $40) <> 0 then
  68.         begin
  69.           S[ 2 ] := 'C';
  70.           S[ 3 ] := 'A';
  71.           S[ 4 ] := 'P';
  72.           S[ 5 ] := 'S';
  73.         end;
  74.       if (OldStatusWord and $20) <> 0 then
  75.         begin
  76.           S[ 7 ] := 'N';
  77.           S[ 8 ] := 'U';
  78.           S[ 9 ] := 'M';
  79.         end;
  80.       if (OldStatusWord and $10) <> 0 then
  81.         begin
  82.           S[ 11 ] := 'S';
  83.           S[ 12 ] := 'C';
  84.           S[ 13 ] := 'R';
  85.           S[ 14 ] := 'O';
  86.           S[ 15 ] := 'L';
  87.           S[ 16 ] := 'L';
  88.         end;
  89.     MoveChar(B, ' ', C, 15);
  90.     MoveStr(B, S, C);
  91.     WriteLine(0, 0, Size.X, 1, B);
  92.   end;
  93.  
  94.   procedure TToggleKeysView.Update;
  95.   begin
  96.     if (OldStatusWord <> KbdStatusWord) then DrawView;
  97.   end;
  98.  
  99.   procedure CheckIfKeyPressed( CurrentHelpCtx : word );
  100.  
  101.     { KBDStatusWord at $0040:$0017
  102.     $80 : Ins Active
  103.     $40 : Caps Lock Active
  104.     $20 : Num Lock Active
  105.     $10 : Scroll Lock Active
  106.     $08 : Alt Depressed
  107.     $04 : Ctrl Depressed
  108.     $02 : Left Shift Depressed
  109.     $01 : Right Shift Depressed
  110.   }
  111.  
  112.     const
  113.       ShiftKeyMask = 3;
  114.       CtrlKeyMask = 4;
  115.       AltKeyMask = 8;
  116.  
  117.     var
  118.       h,m,s,hund: word;
  119.       CurrentMenuItem : PMenuItem;
  120.  
  121.       function KeyReleased( TheKeyMask : byte ) : boolean;
  122.  
  123.         var
  124.           KbdFlagInfo : word;
  125.  
  126.         begin { KeyReleased }
  127.           KbdFlagInfo := KbdStatusWord;
  128.           KeyReleased := False;
  129.           if ( KbdFlagInfo and TheKeyMask ) = 0 then
  130.             KeyReleased := True;
  131.         end; { KeyReleased }
  132.  
  133.       function FindHelpCtx(AMenu: PMenu; Ctx: word): PMenuItem;
  134.  
  135.         { Copyright (c) 1990 by Danny Thorpe                           }
  136.  
  137.         var P,Q: PMenuItem;
  138.         begin { FindHelpCtx }
  139.           P := AMenu^.Items;
  140.           while P <> nil do
  141.             begin
  142.             if (P^.HelpCtx = Ctx) and not P^.Disabled then
  143.                 begin
  144.                 FindHelpCtx := P;
  145.                 Exit;
  146.                 end
  147.             else
  148.             if (P^.Command = 0) and (P^.Name <> nil) then
  149.               begin
  150.               Q := FindHelpCtx(P^.SubMenu, Ctx);
  151.               if Q <> nil then
  152.                 begin
  153.                 FindHelpCtx := Q;
  154.                 Exit;
  155.                 end;
  156.               end;
  157.             P := P^.Next;
  158.             end;
  159.           FindHelpCtx := nil;
  160.         end; { FindHelpCtx }
  161.  
  162.       procedure ResetFlagsAndHelpCtx( var OldHelpCtx  : word;
  163.                                           KeysHelpCtx : word );
  164.  
  165.         begin { ResetFlagsAndHelpCtx }
  166.           SecCnt := 0;
  167.           ShiftPressed := False;
  168.           CtrlPressed := False;
  169.           AltPressed := False;
  170.         { Restore the help context.  Be sure you have the right type. }
  171.           case CurrentObjectType of
  172.             coNoObject : ;
  173.             coDeskTop  : DeskTop^.HelpCtx := OldHelpCtx;
  174.             coDialog   : PDialog( DeskTop^.Current )^.HelpCtx := OldHelpCtx;
  175.             coMenuBar  :
  176.               begin
  177.               { Submenu pulled down }
  178.                 CurrentMenuItem :=
  179.                   FindHelpCtx( MenuBar^.Menu, KeysHelpCtx );
  180.               { Submenu not pulled down }
  181.                 if CurrentMenuItem <> nil then
  182.                   CurrentMenuItem^.HelpCtx := OldHelpCtx;
  183.               end;
  184.             {coEditWindow : PEditWindow( DeskTop^.Current )^.HelpCtx := OldHelpCtx;}
  185.           end; { case }
  186.         end; { ResetFlagsAndHelpCtx }
  187.  
  188.     procedure ChangeHelpCtx( var OldHelpCtx, CurrentHelpCtx : word;
  189.                                  NewStatusCtx : word );
  190.  
  191.       begin { ChangeHelpCtx }
  192.         if DeskTop^.Current = nil then
  193.           begin
  194.           { No dialogs or editor windows open }
  195.             OldHelpCtx := CurrentHelpCtx;
  196.             if MenuBar^.Current <> nil then
  197.               begin
  198.               { Submenu pulled down }
  199.                 CurrentMenuItem :=
  200.                   FindHelpCtx( MenuBar^.Menu, OldHelpCtx );
  201.                 CurrentMenuItem^.HelpCtx := NewStatusCtx;
  202.                 CurrentObjectType := coMenuBar;
  203.               end
  204.             else
  205.               begin
  206.                 { Not in the menu }
  207.                 DeskTop^.HelpCtx := NewStatusCtx;
  208.                 CurrentObjectType := coDeskTop;
  209.               end;
  210.           end
  211.         else
  212.         { Use the TypeOf funxtion to determine what kind of window is open }
  213.           if typeof( DeskTop^.Current^ ) = typeof( TDialog ) then
  214.             begin
  215.               OldHelpCtx := PDialog( DeskTop^.Current )^.HelpCtx;
  216.               PDialog( DeskTop^.Current )^.HelpCtx := NewStatusCtx;
  217.               CurrentObjectType := coDialog;
  218.             end
  219.           else
  220.           {if typeof( DeskTop^.Current^ ) = typeof( TEditWindow ) then
  221.             begin
  222.               OldHelpCtx := PEditWindow( DeskTop^.Current )^.HelpCtx;
  223.               PEditWindow( DeskTop^.Current )^.HelpCtx := NewStatusCtx;
  224.               CurrentObjectType := coEditWindow;
  225.             end;}
  226.       end; { ChangeHelpCtx }
  227.  
  228.     begin { CheckIfKeyPressed }
  229.  
  230.     { Check if the key was pressed and is now released. }
  231.       if KeyReleased( AltKeyMask ) and AltPressed then
  232.         ResetFlagsAndHelpCtx( OldHelpCtx, hcAltKeys )
  233.       else
  234.         if KeyReleased( CtrlKeyMask ) and CtrlPressed then
  235.           ResetFlagsAndHelpCtx( OldHelpCtx, hcCtrlKeys )
  236.         else
  237.           if KeyReleased( ShiftKeyMask ) and ShiftPressed then
  238.             ResetFlagsAndHelpCtx( OldHelpCtx, hcShiftKeys );
  239.  
  240.     { Check if a second has passed }
  241.       GetTime(h,m,s,hund);
  242.       NewSec := s;
  243.       if NewSec <> OldSec then
  244.         begin
  245.         { A second has passed, so check for a pressed key,
  246.           if the key is pressed increment the counter and set flag. }
  247.           if not KeyReleased( ShiftKeyMask ) then
  248.             begin
  249.               inc( SecCnt );
  250.               ShiftPressed := True
  251.             end
  252.           else
  253.             if not KeyReleased( CtrlKeyMask ) then
  254.               begin
  255.                 inc( SecCnt );
  256.                 CtrlPressed := True
  257.               end
  258.             else
  259.               if not KeyReleased( AltKeyMask ) then
  260.                 begin
  261.                   inc( SecCnt );
  262.                   AltPressed := True
  263.                 end;
  264.         { if counter reaches its limit change the help context }
  265.           if SecCnt = 2 then
  266.             begin
  267.               if ShiftPressed then
  268.                 ChangeHelpCtx( OldHelpCtx, CurrentHelpCtx, hcShiftKeys )
  269.               else
  270.                 if CtrlPressed then
  271.                   ChangeHelpCtx( OldHelpCtx, CurrentHelpCtx, hcCtrlKeys )
  272.                 else
  273.                   if AltPressed then
  274.                     ChangeHelpCtx( OldHelpCtx, CurrentHelpCtx, hcAltKeys );
  275.             end;
  276.           OldSec := NewSec;
  277.         end;
  278.     end; { CheckIfKeyPressed }
  279.  
  280. begin
  281.   OldHelpCtx := hcNoContext;
  282.   CurrentObjectType := coNoObject;
  283.   NewSec := 0;
  284.   OldSec := 0;
  285. end.