home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 1995 May / pcw-0595.bin / demos / databeck / wsounds / setup.dir / wswsrc.exe / EVENTDLG.PAS < prev    next >
Pascal/Delphi Source File  |  1992-12-02  |  15KB  |  463 lines

  1. { Unit EventDlg - for tracking events }
  2.  
  3. Unit EventDlg;
  4.  
  5. INTERFACE
  6. uses WinTypes, WinProcs, WinDos, WObjects, Strings, MMSystem, BWCC, StdWnds,
  7.      Win31,DataObj, WaveUtil, WAVEIO, DiskDlg;
  8.  
  9. TYPE
  10.    EventString = RECORD
  11.                    Name   : Array[0..30] of CHAR;
  12.                    Sound  : Integer;
  13.                    WDInfo : WaveDataType;
  14.                    END;
  15. const
  16.    dn_EventDlg = 'EVENTDlg';
  17.    ID_EventLB     = 1800;
  18.    ID_EventDataLB = 1801;
  19.    ID_EventAct    = 1802;
  20.    ID_ActFile     = 1803;
  21.  
  22.    EventCount = 12;
  23.    MaxNorm    = 4;
  24.    HookEvents : Array[0..EventCount-1] of EventString =
  25.                    ((Name:'Close Window'#0; Sound:0),
  26.                     (Name:'Minimize Window'#0; Sound:0),
  27.                     (Name:'Restore Window'#0; Sound:0),
  28.                     (Name:'Open Dialog Box'#0; Sound:0),
  29.                     (Name:'Move Scroll Bar'#0; Sound:0),
  30.                     (Name:'Question'#0; Sound:0),
  31.                     (Name:'Exclamation'#0; Sound:0),
  32.                     (Name:'Critical Stop'#0; Sound:0),
  33.                     (Name:'Default Beep'#0; Sound:0),
  34.                     (Name:'Asterisk'#0; Sound:0),
  35.                     (Name:'Windows Exit'#0; Sound:0),
  36.                     (Name:'Windows Start'#0; Sound:0)
  37.                    );
  38.  
  39. VAR
  40.    EventsActive : Word;
  41.    EventFile : File OF EventString;
  42.    EventVirgin : array [0..13] of BOOL;
  43.    EventFiles : array [0..13,0..255] of char;
  44. type
  45.   PEventDlg = ^TEventDlg;
  46.   TEventDlg = object(TDialog)
  47.     SelectActive : PCheckBox;
  48.     EventLB,
  49.     EventDataLB : PListBox;
  50.     constructor Init(AParent: PWindowsObject;AName: PChar);
  51.     PROCEDURE  OK(VAR Msg : TMessage);Virtual id_First + id_Ok;
  52.     procedure  Cancel(var Msg: TMessage); virtual id_First + id_Cancel;
  53.     Procedure HandleEventSwitch(VAR Msg : TMessage);virtual id_First + id_EventAct;
  54.     procedure HandleEventLB(VAR Msg : TMessage);virtual id_First + id_EventLB;
  55.     procedure HandleEventDataLB(VAR Msg : TMessage);virtual id_First + id_EventDataLB;
  56.     procedure HandlePlayDB(Var Msg:TMessage);virtual;
  57.     Destructor Done;virtual;
  58.     procedure SetupWindow; virtual;
  59.   end;
  60.  
  61. Procedure LoadEvents;
  62. Procedure CheckEvents;
  63. PROCEDURE HookInstall(Install: Boolean);
  64. PROCEDURE ReadIniProfiles;
  65. FUNCTION WriteINIProfiles : BOOL;
  66. PROCEDURE ChangeEvent (Idx: Integer; Value: PChar);
  67.  
  68. implementation
  69.  
  70. VAR
  71.    PWT    : PWaveData;
  72.  
  73. PROCEDURE HookInstall; EXTERNAL 'WswHook';
  74. PROCEDURE ReadIniProfiles; EXTERNAL 'WswHook';
  75. FUNCTION WriteIniProfiles; EXTERNAL 'WswHook';
  76. PROCEDURE ChangeEvent; EXTERNAL 'WswHook';
  77.  
  78.   
  79. constructor TEventDlg.Init(AParent: PWindowsObject;AName: PChar);
  80. begin
  81.   TDialog.Init(AParent, AName);
  82.   SelectActive := New(PCheckBox,InitResource(@self,ID_EventAct));
  83.   EventLB := New(PListBox,InitResource(@Self,ID_EventLB));
  84.   EventDataLB := New(PListBox, InitResource(@Self, ID_EventDataLB));
  85. end;
  86.  
  87. procedure TEventDlg.SetupWindow;
  88. VAR
  89.  Count : Byte;
  90. Begin
  91.   TDialog.SetupWindow;
  92.   SelectActive^.SetCheck(EventsActive);
  93.   For Count := 0 to EventCount-1 DO EventLB^.AddString(HookEvents[Count].Name);
  94.   EventDataLB^.AddString('<no sound>');
  95.   WD_InsertAll(WaveCollect, EventDataLB);
  96.   EventLB^.SetSelIndex(0);
  97.   EventDataLB^.SetSelIndex(0);
  98.   SetDlgItemText (HWindow,ID_ActFile,EventFiles[0]);
  99. end;
  100.  
  101. procedure   TEventDlg.HandleEventLB(var Msg: TMessage);
  102. Var
  103.    Idx : Integer;
  104. begin
  105.   IF (WaveCollect^.Count <= 0) THEN BEGIN
  106.       END
  107.   ELSE BEGIN
  108.     case Msg.LParamHi of
  109.        lbn_SelChange, lbn_DblClk:
  110.          begin
  111.            if Msg.LParamHi = lbn_SelChange then BEGIN
  112.               Idx := EventLB^.GetSelIndex;
  113.               SetDlgItemText (HWindow,ID_ActFile,EventFiles[Idx]);
  114.               if (ord(EventFiles[idx,0])=0) then SetDlgItemText (HWindow,ID_ActFile,'<no sound>');
  115. {              EventDataLB^.SetSelIndex(HookEvents[Idx].Sound);}
  116.               IF HookEvents[Idx].Sound = -1 then EventDataLB^.SetSelIndex(0);
  117.               END;
  118.            if Msg.LParamHi = lbn_DblClk then BEGIN
  119.               SndPlaySound (EventFiles[Idx],SND_ASYNC);
  120.               END;
  121.          end;
  122.      end;
  123.      END;
  124. end;
  125.  
  126. procedure   TEventDlg.HandleEventDataLB(var Msg: TMessage);
  127. Var
  128.    Idx, IdxDB : Integer;
  129.    DiskDUmmy : Array[0..255] of char;
  130. begin
  131.   IF (WaveCollect^.Count <= 0) THEN BEGIN
  132.       END
  133.   ELSE BEGIN
  134.     case Msg.LParamHi of
  135.        lbn_SelChange, lbn_DblClk:
  136.          begin
  137.            if Msg.LParamHi = lbn_SelChange then BEGIN
  138.               IdxDB := EventDataLB^.GetSelIndex;
  139.               Idx := EventLB^.GetSelIndex;
  140.               IF IdxDB>0 then
  141.                Begin
  142.                 EventVirgin[Idx] := FALSE;
  143.                 HookEvents[Idx].Sound := IdxDB;
  144.                 PWT := WaveCollect^.At(IdxDB-1);
  145.                 Move(PWT^.WD, HookEvents[Idx].WDInfo,SizeOf(PWT^.WD));
  146.                 PWaveData(WaveCollect^.At(IdxDB-1))^.GetData(WaveDummy);
  147.                 DiskDummy[0] := WaveDummy.DiskDrive;
  148.                 DiskDummy[1] := #0;
  149.                 StrCat(DiskDummy, ':');
  150.                 StrCat(DiskDummy,WaveDummy.PathName);
  151.                 StrCat(DiskDummy,WaveDummy.FileName);
  152.                 StrCopy (EventFiles[Idx],DiskDummy);
  153.             {    ChangeEvent (Idx,DiskDummy);}
  154.                 SetDlgItemText (HWindow,ID_ActFile,DiskDummy);
  155. {                writeln ('Set    ',DiskDummy);}
  156.                End
  157.               Else
  158.                Begin
  159.                 HookEvents[Idx].Sound := -1;
  160.                 StrCopy (EventFiles[Idx],'');
  161.               {  ChangeEvent (Idx,'');}
  162.                 SetDlgItemText (HWindow,ID_ActFile,'<no sound>');
  163. {                writeln ('Clear');}
  164.                End;
  165.               END;
  166.            if Msg.LParamHi = lbn_DblClk then BEGIN
  167.               HandlePlayDB(Msg);
  168.               END;
  169.          end;
  170.      end;
  171.      END;
  172. end;
  173.  
  174.  
  175. procedure TEventDlg.HandlePlayDB(Var Msg:TMessage);
  176. VAR
  177.    Message,IDx,BWCCMes : Integer;
  178.    PWTest : PWaveData;
  179.    MDummy : Array[0..100] of Char;
  180.  
  181. BEGIN
  182. {--------------------------------------------------------------------}
  183. {--------------------- Play dialog box ------------------------------}
  184.    Message := EventDataLB^.GetSelIndex-1;
  185.    IF (Message >= 0) AND (Message < WaveCollect^.Count) THEN
  186.     Begin
  187.      PWaveData(WaveCollect^.At(Message))^.GetData(WaveDummy);
  188.      DPlayObj := New(PDiskPlay,Init(@self));
  189.      DPlayObj^.DiskPlayDlg(WaveDummy, Message);
  190.      DPlayObj^.Done;
  191.  
  192.  
  193.    IF (DiskIntoDataBase = TRUE) THEN BEGIN
  194.       DiskIntoDataBase := FALSE;
  195.       StrCopy(MDummy,'Database changes can only be accessed from the database dialog box');
  196.          BWCCMes := BWCCMessageBox(HWindow,MDummy,'Wicked Sounds for Windows: Note',MB_Ok+mb_IconInformation);
  197.          END
  198.       ELSE BEGIN
  199.          END;
  200.  
  201.  
  202.    DiskDummy[0] := WaveDummy.DiskDrive;
  203.    DiskDummy[1] := #0;
  204.    StrCat(DiskDummy, ':');
  205.    StrCat(DiskDummy,WaveDummy.PathName);
  206.    StrCat(DiskDummy,WaveDummy.FileName);
  207.  
  208.    IF Message = idOK THEN sndPlaySound(DiskDummy,SND_Async);
  209. End;
  210. {----------------------------------------------------------------------}
  211. {----------------------------------------------------------------------}
  212.    END;
  213.  
  214. procedure   TEventDlg.HandleEventSwitch(var Msg: TMessage);
  215. Var st : array [0..5] of char;
  216. BEGIN
  217.    IF (SelectActive^.GetCheck = bf_Unchecked) THEN BEGIN
  218.       Str (bf_checked:5,st);
  219.       WriteProfileString ('WSW_Captain_Hooks_Log','EventsActive',st);
  220.       EventsActive := bf_Checked;
  221.       SelectActive^.SetCheck(EventsActive);
  222.       HookInstall(TRUE);
  223.       END
  224.    ELSE BEGIN
  225.       EventsActive := bf_UnChecked;
  226.       Str (bf_unchecked:5,st);
  227.       WriteProfileString ('WSW_Captain_Hooks_Log','EventsActive',st);
  228.       SelectActive^.SetCheck(EventsActive);
  229.       HookInstall (FALSE);
  230.       END;
  231.    END;
  232.  
  233. procedure   TEventDlg.Cancel(var Msg: TMessage);
  234. BEGIN
  235.    LoadEvents;
  236.    TDialog.Cancel(Msg);
  237.    END;
  238.  
  239. PROCEDURE   TEventDlg.OK(VAR Msg : TMessage);
  240. VAR
  241.   MDummy : Array[0..50] of Char;
  242.   Count  : Byte;
  243.   Sub    : Array[0..255] of Char;
  244. BEGIN
  245. {   Assign(EventFile,WF_EVE);}
  246. {$I-}
  247. {   ReWrite(EventFile);}
  248. {$I+}
  249. {   IF IOResult = 0 THEN BEGIN
  250.       FOR Count := 0 to EventCount-1 DO
  251.        Begin
  252.         Write(EventFile,HookEvents[Count]);
  253.         Close(EventFile);
  254.        End;
  255.       END}
  256.  
  257.       For Count := 0 to MaxNorm do
  258.        Begin
  259.         WriteProfileString ('WSW_Extended_Sounds',HookEvents[Count].Name,EventFiles[Count]);
  260.         ChangeEvent (Count,EventFIles[count]);
  261.        End;
  262.  
  263.  StrCopy (sub,EventFiles[MaxNorm+1]);
  264.  StrCat  (sub,',Question');
  265.  WriteProfileString ('Sounds','SystemQuestion',sub);
  266.  
  267.  StrCopy (sub,EventFiles[MaxNorm+2]);
  268.  StrCat  (sub,',Exclamation');
  269.  WriteProfileString ('Sounds','SystemExclamation',sub);
  270.  
  271.  StrCopy (sub,EventFiles[MaxNorm+3]);
  272.  StrCat  (sub,',Critical Stop');
  273.  WriteProfileString ('Sounds','SystemHand',sub);
  274.  
  275.  StrCopy (sub,EventFiles[MaxNorm+4]);
  276.  StrCat  (sub,',Default Beep');
  277.  WriteProfileString ('Sounds','SystemDefault',sub);
  278.  
  279.  StrCopy (sub,EventFiles[MaxNorm+5]);
  280.  StrCat  (sub,',Asterisk');
  281.  WriteProfileString ('Sounds','SystemAsterisk',sub);
  282.  
  283.  StrCopy (sub,EventFiles[MaxNorm+6]);
  284.  StrCat  (sub,',Windows Exit');
  285.  WriteProfileString ('Sounds','SystemExit',sub);
  286.  
  287.  StrCopy (sub,EventFiles[MaxNorm+7]);
  288.  StrCat  (sub,',Windows Start');
  289.  WriteProfileString ('Sounds','SystemStart',sub);
  290.  
  291.  WriteProfileString (NIL,NIL,NIL);  { Flush INI buffer }
  292.  SendMessage (HWND_BROADCAST,WM_WININICHANGE,0,0); { Indicate that WIN.INI has changed }
  293.  
  294. {   ELSE BEGIN
  295.       StrCopy(MDummy,'Info file write error');
  296.       BWCCMessageBox(HWindow,MDummy,'Wicked Sounds for Windows: Note',MB_Ok+ MB_IconStop);
  297.       END;}
  298.    TDialog.OK(Msg);
  299.    END;
  300.  
  301. Destructor TEventDlg.Done;
  302. BEGIN
  303.    Dispose(SelectActive,Done);
  304.    Dispose(EventLB,Done);
  305.    Dispose(EventDataLB,Done);
  306. {   IF EventsActive = bf_Unchecked THEN HookInstall(FALSE)
  307.    ELse HookInstall(True);}
  308.    TDialog.Done;
  309.    END;
  310.  
  311. Procedure Extract (Nr : Integer);
  312. Var SubString : Array [0..255] of char;
  313.     i         : Integer;
  314. Begin
  315. for i:= 0 to 254 do SubString[i] := #0;
  316.  
  317. i:=0;
  318. while (EventFiles[Nr,i]<>',') do
  319.  Begin
  320.   Substring [i] := EventFiles[Nr,i];
  321.   Inc(i,1);
  322.  End;
  323. Substring[i+1]:= #0;
  324. StrCopy (EventFiles[nr],Substring);
  325. End;
  326.  
  327. Procedure LoadEvents;
  328. VAR
  329.    ECount : Byte;
  330.    MainIdx: Integer;
  331.    Message: Integer;
  332.    DiskDummy: Array[0..255] of char;
  333. BEGIN
  334.  for ECount := 0 to MaxNorm do
  335.   Begin
  336.    GetProfileString ('WSW_Extended_Sounds',HookEvents[ECount].Name,'SYSTEMDEFAULT',@EventFiles[ECount],199);
  337.    ChangeEvent (ECount,EventFiles[ECount]);
  338.   End;
  339.  
  340.  GetProfileString ('sounds','SystemQuestion','SYSTEMDEFAULT',@EventFiles[ECount+1],199);
  341.  Extract (ECount+1);
  342.  GetProfileString ('sounds','SystemExclamation','SYSTEMDEFAULT',@EventFiles[ECount+2],199);
  343.  Extract (ECount+2);
  344.  GetProfileString ('sounds','SystemHand','SYSTEMDEFAULT',@EventFiles[ECount+3],199);
  345.  Extract (ECount+3);
  346.  GetProfileString ('sounds','SystemDefault','SYSTEMDEFAULT',@EventFiles[ECount+4],199);
  347.  Extract (ECount+4);
  348.  GetProfileString ('sounds','SystemAsterisk','SYSTEMDEFAULT',@EventFiles[ECount+5],199);
  349.  Extract (ECount+5);
  350.  GetProfileString ('sounds','SystemExit','SYSTEMDEFAULT',@EventFiles[ECount+6],199);
  351.  Extract (ECount+6);
  352.  GetProfileString ('sounds','SystemStart','SYSTEMDEFAULT',@EventFiles[ECount+7],199);
  353.  Extract (ECount+7);
  354.  
  355. {   IF Exists(WF_EVE) THEN BEGIN
  356.       Assign(EventFile,WF_EVE); }
  357. {$I-}
  358. {   ReSet(EventFile);}
  359. {$I+}
  360. {   IF IOResult = 0 THEN BEGIN
  361.       FOR ECount := 0 to EventCount-1 DO BEGIN
  362.          Read(EventFile,HookEvents[ECount]);
  363.          EventVirgin[ECount] := TRUE;
  364.          Message := HookEvents[ECount].Sound-1;
  365.  
  366.          IF (Message > 0) AND (Message < WaveCollect^.Count) THEN
  367.          Begin
  368.           PWaveData(WaveCollect^.At(Message))^.GetData(WaveDummy);
  369.           DiskDummy[0] := WaveDummy.DiskDrive;
  370.           DiskDummy[1] := #0;
  371.           StrCat(DiskDummy, ':');
  372.           StrCat(DiskDummy,WaveDummy.PathName);
  373.           StrCat(DiskDummy,WaveDummy.FileName);
  374.           ChangeEvent (ECount,DiskDummy);}
  375. {          writeln ('Set   ',DiskDummy);}
  376. {         End;
  377.  
  378.          IF Message<1 then
  379.           Begin
  380.            ChangeEvent (ECount,'');}
  381. {           writeln ('Clear');}
  382. {          End;
  383.  
  384.           PWT := New(PWaveData,Init(HookEvents[ECount].WDInfo));
  385.           IF WaveCollect^.Search(PWT,MainIdx) = False THEN HookEvents[ECount].Sound := 0;
  386.           Dispose(PWT,Done);
  387.          END;
  388.       Close(EventFile);
  389.       END
  390.    END;}
  391.   END;
  392.  
  393. Procedure CheckEvents;
  394. {Make sure whether file is still in database, or whether position should be changed}
  395. VAR
  396.    ECount : Byte;
  397.    EvChanged : BOOLEAN;
  398.    MainIdx: Integer;
  399.    Message: Integer;
  400.    Count : Integer;
  401.    DiskDummy: Array[0..255] of char;
  402. BEGIN
  403.    EvChanged := False;
  404.    FOR ECount := 0 to EventCount-1 DO BEGIN
  405.  
  406. {Read Sound number}
  407.       Message := HookEvents[ECount].Sound;
  408.  
  409. {Sound number = No sound}
  410.       IF Message<1 then Begin
  411.          ChangeEvent (ECount,'');
  412.          HookEvents[ECount].Sound := -1;
  413.          EvChanged := TRUE;
  414.          End
  415. {Sound number missing}
  416.       ELSE BEGIN
  417.          PWT := New(PWaveData,Init(HookEvents[ECount].WDInfo));
  418.          WriteLn('Hmm, Name : ',PWT^.WD.FileName);
  419. {Sound not found in database}
  420.          IF WaveCollect^.Search(PWT,MainIdx) = False THEN BEGIN
  421.             HookEvents[ECount].Sound := -1;
  422.             ChangeEvent (ECount,'');
  423.             EvChanged := TRUE;
  424.             WriteLn('not a sound');
  425.             END
  426.          ELSE BEGIN
  427. {Sound number passed to database when needed}
  428.             IF (MainIdx <> HookEvents[ECount].Sound-1) THEN BEGIN
  429.                WriteLn('Find new sound');
  430.                WriteLn('Old : ',HookEvents[ECount].Sound);
  431.                HookEvents[ECount].Sound:= MainIdx+1;
  432.                WriteLn('New : ',HookEvents[ECount].Sound);
  433.                PWaveData(WaveCollect^.At(MainIdx))^.GetData(WaveDummy);
  434.                DiskDummy[0] := WaveDummy.DiskDrive;
  435.                DiskDummy[1] := #0;
  436.                StrCat(DiskDummy, ':');
  437.                StrCat(DiskDummy,WaveDummy.PathName);
  438.                StrCat(DiskDummy,WaveDummy.FileName);
  439.                ChangeEvent (ECount,DiskDummy);
  440.                EvChanged := TRUE;
  441.                END;
  442.             END;
  443.          Dispose(PWT,Done);
  444.          END;
  445.       END;
  446.       IF EvChanged THEN BEGIN
  447.          Assign(EventFile,WF_EVE);
  448. {$I-}
  449.          ReWrite(EventFile);
  450. {$I+}
  451.          IF IOResult = 0 THEN BEGIN
  452.             FOR Count := 0 to EventCount-1 DO Write(EventFile,HookEvents[Count]);
  453.             Close(EventFile);
  454.             END;
  455.          END;
  456.    END;
  457.  
  458. BEGIN
  459.    EventsActive := bf_Unchecked;
  460.    ReadIniProfiles;
  461.    LoadEvents;
  462.    END.
  463.