home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / sp15demo.zip / libsrc.zip / LIBSRC / ODIALOGS.PAS < prev    next >
Pascal/Delphi Source File  |  1996-02-10  |  28KB  |  902 lines

  1. UNIT ODialogs;
  2.  
  3. {**************************************************************************
  4.  *                                                                        *
  5.  *    Dialog box definitions for Object-PM                                *
  6.  *    (C) 1993,94 Vision Software Chemnitz                                *
  7.  *                                                                        *
  8.  *    Last modified: 30.10.1994                                           *
  9.  *                                                                        *
  10.  **************************************************************************}
  11.  
  12. {$R-,D-,S-}
  13.  
  14.  
  15. INTERFACE
  16.  
  17. USES ObjectPM,PmWin,PmStdDlg;
  18.  
  19. TYPE
  20.      {List for List boxes}
  21.      PListBoxItems=^TListBoxItems;
  22.      TListBoxItems=RECORD
  23.                          item:STRING;
  24.                          aindex:WORD;
  25.                          Data:POINTER; {Private data}
  26.                          cbData:LONGWORD; {Count of private data}
  27.                          Next:PListBoxItems;
  28.                    END;
  29.  
  30. CONST
  31.    {VMT Indices}
  32.    TDialog_HandleEvent    :WORD      = 5;        {_VMT_}
  33.    TDialog_DefDlgProc     :WORD      = 6;
  34.  
  35. TYPE
  36.     PDialog=^TDialog;
  37.     TDialog=OBJECT(TOPMLObject)
  38.                    HwndDlg:Hwnd;
  39.                    {*******Do not change this location -- its hard coded***}
  40.                    FUNCTION DialogHandleEvent(Dlg:HWND;Msg:LONGWORD; {_VMT_}
  41.                             Para1,Para2:LONGWORD):LONGWORD;VIRTUAL  {index 5};
  42.                    PROCEDURE DefDlgProc(VAR Msg: TMessage);VIRTUAL  {index 6};
  43.                    {*******************************************************}
  44.                    CONSTRUCTOR Init(Parent,Owner:HWND;hmod:HModule;idDlg:LONGWORD;
  45.                                     pCreateParams:Pointer);
  46.                    DESTRUCTOR Done;VIRTUAL;
  47.                    FUNCTION ExecDialog:LONGWORD;VIRTUAL;
  48.                    PROCEDURE GetDlg(VAR Dlg:HWND);VIRTUAL;
  49.                    PROCEDURE CenterDlgBox(Dlg:HWND);VIRTUAL;
  50.  
  51.                    PROCEDURE WMInitDlg(VAR Msg:TMessage);
  52.                                            VIRTUAL WM_FIRST+WM_INITDLG;
  53.                    PROCEDURE WMControl(VAR Msg:TMessage);
  54.                                            VIRTUAL WM_FIRST+WM_CONTROL;
  55.                    PROCEDURE WMCommand(VAR Msg:TMessage);
  56.                                            VIRTUAL WM_FIRST+WM_COMMAND;
  57.              END;
  58.  
  59.  
  60.     PNoteBookPages=^TNoteBookPages;
  61.     TNoteBookPages=RECORD
  62.                          Dlg:PDialog;
  63.                          id:ULONG;
  64.                          next:PNoteBookPages;
  65.                    END;
  66.  
  67.     PNoteBookDialog=^TNoteBookDialog;
  68.     TNoteBookDialog=OBJECT(TDialog)
  69.                         NotebookID:LONGWORD;
  70.                         Notebook:HWND;
  71.                         ActualPageID:ULONG;
  72.                         Pages:PNoteBookPages;
  73.                         CONSTRUCTOR Init(Parent,Owner:HWND;hmod:HModule;
  74.                                          idDlg,idNotebook:LONGWORD;
  75.                                          pCreateParams:Pointer);
  76.                         DESTRUCTOR Done;VIRTUAL;
  77.                         FUNCTION InsertPage(id:ULONG;Dlg:PDialog;
  78.                                             Order,Options:WORD;
  79.                                             TabText,StatusText:STRING):ULONG;VIRTUAL;
  80.                         PROCEDURE PageOpened(id:ULONG;Dlg:PDialog);VIRTUAL;
  81.                         PROCEDURE PageClosed(id:ULONG;Dlg:PDialog);VIRTUAL;
  82.                         FUNCTION GetDlgFromID(id:ULONG):PDialog;VIRTUAL;
  83.                         FUNCTION GetIDFromDlg(Dlg:PDialog):ULONG;VIRTUAL;
  84.                         PROCEDURE SelectPage(id:ULONG);VIRTUAL;
  85.  
  86.                         PROCEDURE SetMajorTabDimensions(W,H:WORD);VIRTUAL;
  87.                         PROCEDURE SetMinorTabDimensions(W,H:WORD);VIRTUAL;
  88.                         PROCEDURE SetPageButtonDimensions(W,H:WORD);VIRTUAL;
  89.                         PROCEDURE InitializeNoteBookPages;VIRTUAL;
  90.                         PROCEDURE DestroyNoteBookPages;VIRTUAL;
  91.                         PROCEDURE SetColors(typ:WORD;value:LONGINT);VIRTUAL;
  92.  
  93.                         PROCEDURE WMInitDlg(VAR Msg:TMessage);
  94.                                            VIRTUAL WM_FIRST+WM_INITDLG;
  95.                         PROCEDURE WMControl(VAR Msg:TMessage);
  96.                                            VIRTUAL WM_FIRST+WM_CONTROL;
  97.                         PROCEDURE WMClose(VAR msg:TMessage);
  98.                                            VIRTUAL WM_FIRST+WM_CLOSE;
  99.              END;
  100.  
  101. VAR
  102.     FileOpenDlgWildCards:STRING;
  103.     FileOpenDlgTitle:String[40];
  104.     FileOpenDlgOkName:String[40];
  105.     FileSaveDlgWildCards:STRING;
  106.     FileSaveDlgTitle:String[40];
  107.     FileSaveDlgOkName:String[40];
  108.  
  109.     StdDlgProcAddr:POINTER;
  110.     StartDlgProcAddr:POINTER;
  111.  
  112. FUNCTION FileOpenDialog(Win:HWND;VAR result:STRING):Boolean;
  113. FUNCTION FileSaveDialog(Win:HWND;VAR result:STRING):Boolean;
  114.  
  115. FUNCTION ListBoxInsertString(Dlg:HWND;where:LONGINT;s:STRING):WORD;
  116. PROCEDURE FillListBox(Dlg:HWND;id:LONGWORD;List:PListBoxItems);
  117. PROCEDURE NewListBoxItem(VAR List:PListBoxItems;item:STRING;Data:POINTER;
  118.                          cbData:LONGWORD;Sort:BOOLEAN);
  119. PROCEDURE DialogGetText(Dlg:HWND;id:LONGWORD;VAR s:STRING;cb:BYTE);
  120. PROCEDURE DialogSetText(Dlg:HWND;id:LONGWORD;s:STRING);
  121. PROCEDURE ListBoxGetSelItem(Dlg:HWND;id:LONGWORD;VAR result:TListBoxItems;
  122.                             VAR List:PListBoxItems;Erase:BOOLEAN);
  123. PROCEDURE DeleteListBox(VAR List:PListBoxItems);
  124. PROCEDURE SetTextLimit(Dlg:HWND;id:LONGWORD;Limit:BYTE);
  125. PROCEDURE SetMenuText(Frame:HWND;Id:LONGWORD;s:STRING);
  126. PROCEDURE InsertMainMenu(Frame:HWND;pos:INTEGER;id:WORD;s:STRING);
  127. PROCEDURE InsertSubMenu(Frame:HWND;MainMenuID:WORD;pos:INTEGER;id:WORD;s:STRING);
  128. PROCEDURE RemoveSubMenu(Frame:HWND;id:WORD);
  129. PROCEDURE RemoveSubMenuByPos(Frame:HWND;MainMenuID:WORD;pos:Integer);
  130. PROCEDURE SetCheckBoxState(Dlg:HWND;Id:LONGWORD;Setit:LONGWORD);
  131. FUNCTION GetCheckBoxState(Dlg:HWND;Id:LONGWORD):LONGWORD;
  132. FUNCTION GetRadioButtonState(Dlg:HWND;Id:LONGWORD):LONGWORD;
  133. PROCEDURE SetRadioButtonState(Dlg:HWND;Id:LONGWORD;Setit:LONGWORD);
  134.  
  135.  
  136. IMPLEMENTATION
  137.  
  138. VAR
  139.    DialogVMT:POINTER;
  140.  
  141. {***************************************************************************
  142. *                                                                          *
  143. *                 Common functions                                         *
  144. *                                                                          *
  145. ****************************************************************************}
  146.  
  147. FUNCTION GetCheckBoxState(Dlg:HWND;Id:LONGWORD):LONGWORD;
  148. BEGIN
  149.      GetCheckBoxState:=WinSendDlgItemMsg(Dlg,id,BM_QUERYCHECK,0,0);
  150. END;
  151.  
  152. PROCEDURE SetCheckBoxState(Dlg:HWND;Id:LONGWORD;Setit:LONGWORD);
  153. VAR  para1:LONGWORD;
  154. BEGIN
  155.      IF Setit<>0 THEN Para1:=1
  156.      ELSE Para1:=0;
  157.      WinSendDlgItemMsg(Dlg,id,BM_SETCHECK,para1,0);
  158. END;
  159.  
  160. FUNCTION GetRadioButtonState(Dlg:HWND;Id:LONGWORD):LONGWORD;
  161. BEGIN
  162.      GetRadioButtonState:=WinSendDlgItemMsg(Dlg,id,BM_QUERYCHECK,0,0);
  163. END;
  164.  
  165. PROCEDURE SetRadioButtonState(Dlg:HWND;Id:LONGWORD;Setit:LONGWORD);
  166. VAR  para1:LONGWORD;
  167. BEGIN
  168.      IF Setit<>0 THEN Para1:=1
  169.      ELSE Para1:=0;
  170.      WinSendDlgItemMsg(Dlg,id,BM_SETCHECK,para1,0);
  171. END;
  172.  
  173. PROCEDURE SetMenuText(Frame:HWND;Id:LONGWORD;s:STRING);
  174. VAR  HwndMenu:HWND;
  175.      cs:CSTRING;
  176. BEGIN
  177.      cs:=s;
  178.      HwndMenu:=WinWindowFromID(Frame,FID_MENU);
  179.      IF HwndMenu=0 THEN exit;
  180.      WinSendMsg(HwndMenu,MM_SETITEMTEXT,id,LONGWORD(@cs));
  181. END;
  182.  
  183. PROCEDURE RemoveSubMenuByPos(Frame:HWND;MainMenuID:WORD;pos:INTEGER);
  184. VAR  HwndMenu:HWND;
  185.      p,p1,p2:LONGWORD;
  186.      mi:MENUITEM;
  187.      Menu:HWND;
  188. BEGIN
  189.     HwndMenu:=WinWindowFromID(Frame,FID_MENU);
  190.     IF HwndMenu=0 THEN exit;
  191.     p1:=LONGWORD(@mi);
  192.     p2:=MPFROM2SHORT(MainMenuID,1);
  193.     IF WinSendMsg(HwndMenu,MM_QUERYITEM,p2,p1)=0 THEN exit;
  194.     Menu:=mi.hwndSubMenu;
  195.     WinSendMsg(Menu,MM_DELETEITEMBYPOS,pos,0);
  196. END;
  197.  
  198.  
  199. PROCEDURE InsertMainMenu(Frame:HWND;pos:INTEGER;id:WORD;s:STRING);
  200. VAR  HwndMenu:HWND;
  201.      p1,p2:LONGWORD;
  202.      mi:MENUITEM;
  203.      cs:CSTRING;
  204. BEGIN
  205.     HwndMenu:=WinWindowFromID(Frame,FID_MENU);
  206.     IF HwndMenu=0 THEN exit;
  207.     IF id=65535 THEN mi.afStyle:=MIS_SEPARATOR
  208.     ELSE mi.afStyle:=MIS_TEXT;
  209.     mi.afStyle:=mi.afStyle OR MIS_SUBMENU;
  210.     mi.iPosition:=pos;
  211.     mi.afAttribute:=0;
  212.     mi.hwndSubMenu:=WinCreateMenu(HwndMenu, NIL);;
  213.     mi.hitem:=0;
  214.     mi.id:=id;
  215.     cs:=s;
  216.     p1:=LONGWORD(@mi);
  217.     p2:=LONGWORD(@cs);
  218.     WinSendMsg(HwndMenu,MM_INSERTITEM,p1,p2);
  219. END;
  220.  
  221.  
  222. PROCEDURE InsertSubMenu(Frame:HWND;MainMenuID:WORD;pos:INTEGER;id:WORD;s:STRING);
  223. VAR  HwndMenu:HWND;
  224.      p,p1,p2:LONGWORD;
  225.      mi:MENUITEM;
  226.      Menu:HWND;
  227.      cs:CSTRING;
  228. BEGIN
  229.     HwndMenu:=WinWindowFromID(Frame,FID_MENU);
  230.     IF HwndMenu=0 THEN exit;
  231.     cs:=s;
  232.     p:=LONGWORD(@cs);
  233.     p1:=LONGWORD(@mi);
  234.     p2:=MPFROM2SHORT(MainMenuID,1);
  235.     IF WinSendMsg(HwndMenu,MM_QUERYITEM,p2,p1)=0 THEN exit;
  236.     Menu:=mi.hwndSubMenu;
  237.     IF Menu=0 THEN exit;
  238.     mi.iPosition:=pos;
  239.     IF id=65535 THEN mi.afStyle:=MIS_SEPARATOR
  240.     ELSE mi.afStyle:=MIS_TEXT;
  241.     mi.afAttribute:=0;
  242.     mi.id:=id;
  243.     mi.hwndSubMenu:=0;
  244.     mi.hitem:=0;
  245.     p1:=LONGWORD(@mi);
  246.     WinSendMsg(Menu,MM_INSERTITEM,p1,p);
  247. END;
  248.  
  249. PROCEDURE RemoveSubMenu(Frame:HWND;id:WORD);
  250. VAR  HwndMenu:HWND;
  251.      p:LONGWORD;
  252. BEGIN
  253.     HwndMenu:=WinWindowFromID(Frame,FID_MENU);
  254.     IF HwndMenu=0 THEN exit;
  255.     p:=MPFROM2SHORT(id,1);
  256.     WinSendMsg(HwndMenu,MM_DELETEITEM,p,0);
  257. END;
  258.  
  259.  
  260. PROCEDURE DeleteListBox(VAR List:PListBoxItems);
  261. VAR  Help:PListBoxItems;
  262. BEGIN
  263.      WHILE List<>NIL DO
  264.      BEGIN
  265.           Help:=List^.Next;
  266.           IF List^.cbData<>0 THEN IF List^.Data<>NIL
  267.           THEN FreeMem(List^.Data,List^.cbData);
  268.           Dispose(List);
  269.           List:=Help;
  270.      END;
  271. END;
  272.  
  273. PROCEDURE ListBoxGetSelItem(Dlg:HWND;id:LONGWORD;VAR result:TListBoxItems;
  274.                             VAR List:PListBoxItems;Erase:BOOLEAN);
  275. VAR  HwndElement:HWND;
  276.      aindex:WORD;
  277.      Help,HList:PListBoxItems;
  278.      pbSource,pbDest:^Byte;
  279. Label l;
  280. BEGIN
  281.      HwndElement:=WinWindowFromID(Dlg,id);
  282.      IF HwndElement=0 THEN exit;
  283.      aindex:=WinSendMsg(HwndElement,LM_QUERYSELECTION,LIT_FIRST,0);
  284.      Result.Item:='';
  285.      Result.aindex:=65535;
  286.      HList:=List;
  287.      WHILE HList<>NIL DO
  288.      BEGIN
  289.           IF HList^.aindex=aIndex THEN
  290.           BEGIN
  291.                Result:=HList^;
  292.                IF result.cbData>0 THEN if result.Data<>NIL THEN
  293.                BEGIN
  294.                     GetMem(result.Data,result.cbData);
  295.                     pbsource:=HList^.Data;
  296.                     pbDest:=result.Data;
  297.                     move(pbSource^,pbDest^,result.cbData);
  298.                END;
  299.                goto l;
  300.           END;
  301.           HList:=HList^.Next;
  302.      END;
  303. l:
  304.      Result.Next:=NIL;
  305.      IF Erase THEN DeleteListBox(List);
  306. END;
  307.  
  308. PROCEDURE NewListBoxItem(VAR List:PListBoxItems;item:STRING;Data:POINTER;
  309.                          cbData:LONGWORD;Sort:BOOLEAN);
  310. VAR  dummy:PListBoxItems;
  311.      Prev:PListBoxItems;
  312. LABEL l,l1;
  313. BEGIN
  314.      IF List=NIL THEN
  315.      BEGIN
  316.           New(List);
  317.           dummy:=List;
  318.           dummy^.Next:=NIL;
  319.      END
  320.      ELSE
  321.      BEGIN
  322.           IF Sort THEN
  323.           BEGIN
  324.                dummy:=List;
  325.                Prev:=NIL;
  326.                WHILE dummy<>NIL DO
  327.                BEGIN
  328.                     IF dummy^.Item>Item THEN goto l;
  329.                     Prev:=dummy;
  330.                     dummy:=dummy^.Next;
  331.                END;
  332.                {No Item found --> Append at end of List}
  333.                New(Prev^.Next);
  334.                dummy:=Prev^.Next;
  335.                dummy^.Next:=NIL;
  336.                goto l1;
  337. l:
  338.                {Insert the item at this position}
  339.                IF Prev=NIL THEN {At start of the list}
  340.                BEGIN
  341.                     dummy:=List;
  342.                     New(List);
  343.                     List^.Next:=dummy;
  344.                     dummy:=List;
  345.                END
  346.                ELSE {at position after Prev}
  347.                BEGIN
  348.                     dummy:=Prev^.Next;
  349.                     New(Prev^.Next);
  350.                     Prev:=Prev^.Next;
  351.                     Prev^.Next:=dummy;
  352.                     dummy:=Prev;
  353.                END;
  354.           END
  355.           ELSE
  356.           BEGIN
  357.                dummy:=List;
  358.                WHILE dummy^.Next<>NIL do dummy:=dummy^.Next;
  359.                New(dummy^.Next);
  360.                dummy:=dummy^.Next;
  361.                dummy^.Next:=NIL;
  362.           END;
  363.      END;
  364. l1:
  365.      dummy^.item:=item;
  366.      dummy^.aindex:=0;
  367.      dummy^.Data:=Data;
  368.      dummy^.cbData:=cbData;
  369. END;
  370.  
  371. FUNCTION ListBoxInsertString(Dlg:HWND;where:LONGINT;s:STRING):WORD;
  372. VAR  aindex:WORD;
  373.      cs:CSTRING;
  374. BEGIN
  375.      cs:=s;
  376.      aindex:=WinSendMsg(Dlg,LM_INSERTITEM,where,LONGWORD(@cs));
  377.      ListBoxInsertString:=aIndex;
  378. END;
  379.  
  380. PROCEDURE FillListBox(Dlg:HWND;id:LONGWORD;List:PListBoxItems);
  381. VAR  HwndElement:HWND;
  382. BEGIN
  383.      HwndElement:=WinWindowFromID(Dlg,id);
  384.      IF HwndElement=0 THEN exit;
  385.      WinEnableWindowUpdate(hwndElement,FALSE);
  386.  
  387.      WHILE List<>NIL DO
  388.      BEGIN
  389.           List^.aIndex:=ListBoxInsertString(HwndElement,LIT_END,List^.item);
  390.           List:=List^.Next;
  391.      END;
  392.      WinShowWindow(HwndElement,TRUE);
  393. END;
  394.  
  395. PROCEDURE DialogSetText(Dlg:HWND;id:LONGWORD;s:STRING);
  396. VAR  HwndElement:HWND;
  397.      cs:CSTRING;
  398. BEGIN
  399.      HwndElement:=WinWindowFromID(Dlg,id);
  400.      IF HwndElement=0 THEN exit;
  401.      cs:=s;
  402.      WinSetWindowText(HwndElement,cs);
  403. END;
  404.  
  405. PROCEDURE DialogGetText(Dlg:HWND;id:LONGWORD;VAR s:STRING;cb:BYTE);
  406. VAR  HwndElement:HWND;
  407.      t:BYTE;
  408. BEGIN
  409.      HwndElement:=WinWindowFromID(Dlg,id);
  410.      IF HwndElement=0 THEN exit;
  411.      s[0] := #0;
  412.      IF WinQueryWindowText(HwndElement,cb,s[1]) = 0 THEN exit;
  413.      IF cb=0 THEN exit;
  414.      FOR t:=1 TO cb-1 DO IF s[t]=#0 THEN {first #0 terminates the string}
  415.      BEGIN
  416.           s[0]:=chr(t-1);
  417.           exit;
  418.      END;
  419. END;
  420.  
  421. PROCEDURE SetTextLimit(Dlg:HWND;id:LONGWORD;Limit:BYTE);
  422. VAR  HwndElement:HWND;
  423. BEGIN
  424.      HwndElement:=WinWindowFromID(Dlg,id);
  425.      IF HwndElement=0 THEN exit;
  426.      WinSendMsg(HwndElement,EM_SETTEXTLIMIT,Limit,0);
  427. END;
  428.  
  429. {***************************************************************************
  430. *                                                                          *
  431. *  Object TDialog                                                          *
  432. *                                                                          *
  433. ****************************************************************************}
  434.  
  435. PROCEDURE TDialog.GetDlg(VAR Dlg:HWND);
  436. BEGIN
  437.      Dlg:=hwnddlg;
  438. END;
  439.  
  440. PROCEDURE TDialog.CenterDlgBox(Dlg:HWND);
  441. VAR  swpParent:SWP;
  442.      swpDialog:SWP;
  443.      xDiv,yDiv,xdiv1,ydiv1:LONGWORD;
  444.      DlgParent:HWND;
  445. BEGIN
  446.      DlgParent:=WinQueryWindow(Dlg,QW_PARENT);
  447.      WinQueryWindowPos(DlgParent,SwpParent);
  448.      WinQueryWindowPos(Dlg,SwpDialog);
  449.      xDiv:=swpParent.cx DIV 2;
  450.      yDiv:=swpParent.cy DIV 2;
  451.      xdiv1:=swpDialog.cx DIV 2;
  452.      ydiv1:=swpDialog.cy DIV 2;
  453.      IF xdiv>xdiv1 THEN swpDialog.x:=xdiv-xdiv1;
  454.      IF ydiv>ydiv1 THEN swpDialog.y:=ydiv-ydiv1;
  455.      WinSetWindowPos(Dlg,swpDialog.HwndInsertBehind,swpDialog.x,
  456.                      swpDialog.y,swpDialog.cx,swpDialog.cy,
  457.                      swpDialog.fl OR SWP_ACTIVATE);
  458. END;
  459.  
  460. PROCEDURE TDialog.WMInitDlg(VAR Msg:TMessage);
  461. BEGIN
  462.      CenterDlgBox(Msg.Receiver);
  463.      Msg.Handled:=TRUE;
  464.      Msg.Result:=1; {!!!} {Dont remove this - Radiobuttons wont work}
  465. END;
  466.  
  467. PROCEDURE TDialog.WMControl(VAR Msg:TMessage);
  468. BEGIN
  469. END;
  470.  
  471. {Call the standard Dialog procedure}
  472. PROCEDURE TDialog.DefDlgProc(var Msg: TMessage);
  473. BEGIN
  474.      Msg.Result:=WinDefDlgProc(Msg.Receiver,Msg.Message,Msg.Param1,Msg.Param2);
  475.      Msg.Handled:=TRUE;
  476. END;
  477.  
  478. {This function will be called as a result of the WM_COMMAND message
  479.  It will call the Command procedure or DefCommandProc}
  480. PROCEDURE TDialog.WMCommand(VAR Msg: TMessage);
  481. BEGIN
  482.      PerformDMTMsg(@SELF,Msg,Msg.Param1Lo,TDialog_DefDlgProc);   {_VMT_}
  483.      {Handle it via DMT}
  484. END;
  485.  
  486.  
  487. FUNCTION TDialog.DialogHandleEvent(Dlg:HWND;Msg:LONGWORD;
  488.                                    Para1,Para2:LONGWORD):LONGWORD;
  489. VAR  aMsg:TMessage;
  490.      DMTFound:BOOLEAN;
  491. BEGIN
  492.      aMsg.Receiver:=Dlg;
  493.      aMsg.Param1:=LONGWORD(Para1);
  494.      aMsg.Param2:=LONGWORD(Para2);
  495.      aMsg.Message:=Msg;
  496.      aMsg.Result:=0;
  497.      aMsg.Handled:=FALSE;  {not handled yet}
  498.      DMTFound:=FALSE;
  499.      {Check for dynamic methods}
  500.      ASM
  501.         MOV EDI,$SELF
  502.         MOV EDI,[EDI+0]      //Get VMT Pointer
  503.         MOV ESI,[EDI+0]      //Get DMT Pointer
  504.         MOV ECX,[ESI+0]      //number of DMT entries
  505.         CMP ECX,0
  506.         JE !NoDMT            //no dynamic methods
  507.         ADD ESI,4            //onto first DMT entry
  508.         MOV EAX,$Msg
  509. !DMTLoop:
  510.         CMP [ESI+0],EAX
  511.         JE !DMTHere          //Message found
  512.         ADD ESI,8            //next DMT entry
  513.         LOOP !DMTLoop
  514.         JMP !NoDMT
  515. !DMTHere:
  516.         MOVB $DMTFound,1
  517.         LEA EAX,$aMsg
  518.         PUSH EAX             //Parameter for dynamic method call
  519.         MOV EAX,[ESI+4]      //Method index in VMT
  520.         MOV ESI,$SELF
  521.         PUSH ESI             //VMT for dynamic method
  522.         CALLN32 [EDI+EAX*4]  //--> jump to method
  523. !NoDMT:
  524.      END;
  525.      IF DMTFound THEN
  526.      BEGIN
  527.           IF not aMsg.Handled THEN DefDlgProc(aMsg);  {not handled}
  528.      END
  529.      ELSE
  530.      BEGIN
  531.           DefDlgProc(aMsg);  {Standard window handler}
  532.      END;
  533.      DialogHandleEvent:=aMsg.result;
  534. END;
  535.  
  536.  
  537. FUNCTION StdDlgProc(Win:HWND;Msg:LONGWORD;
  538.                     para1,para2:POINTER):LONGWORD;CDECL;
  539. BEGIN
  540.      ASM
  541.         //Prepare the parameters for a call to DialogHandleEvent
  542.         PUSHL $Win
  543.         PUSHL $Msg
  544.         PUSHL $para1
  545.         PUSHL $para2
  546.  
  547.         PUSHL 0             //Get VMT pointer
  548.         PUSHL $Win
  549.         MOV AL,2
  550.         CALLDLL PMWIN,843   //WinQueryWindowUlong
  551.         ADD ESP,8
  552.         MOV EDI,EAX
  553.  
  554.         PUSH EDI            //SELF Pointer
  555.         MOV EDI,[EDI+0]     //Get VMT pointer for HandleEvent
  556.         MOV EAX,5           //TDialog_HandleEvent = 5     {_VMT_}
  557.         CALLN32 [EDI+EAX*4] // --> Jump into method
  558.         MOV $!FuncResult,EAX
  559.      END;
  560. END;
  561.  
  562. FUNCTION StartDlgProc(Win:HWND;msg:LONGWORD;
  563.                       para1,para2:LONGWORD):LONGWORD;CDECL;
  564. BEGIN
  565.     ASM
  566.         //Prepare the parameters for a call to DialogHandleEvent
  567.         PUSHL $Win
  568.         PUSHL $Msg
  569.         PUSHL $para1
  570.         PUSHL $para2
  571.  
  572.         MOV EDI,ODIALOGS.DialogVMT   //Get VMT Pointer
  573.  
  574.         PUSH EDI                     //VMT Pointer
  575.         MOV EDI,[EDI+0]              //get VMT pointer for HandleEvent
  576.         MOV EAX,5                    //TDialog_HandleEvent = 5     {_VMT_}
  577.         CALLN32 [EDI+EAX*4]          // --> Jump into method
  578.         MOV $!FuncResult,EAX
  579.     END;
  580. END;
  581.  
  582. CONSTRUCTOR TDialog.Init(Parent,Owner:HWND;hmod:HModule;idDlg:LONGWORD;
  583.                          PCreateParams:POINTER);
  584. BEGIN
  585.      IF DialogVMT<>NIL THEN REPEAT UNTIL DialogVmT=NIL; {Block other threads}
  586.      DialogVMT:=POINTER(SELF); {for StartHandler}
  587.      hwnddlg:=0;
  588.      hwnddlg:=WinLoadDlg(Parent,Owner,@StartDlgProc,hmod,idDlg,PCreateParams);
  589.      IF HwndDlg<>0 THEN
  590.      BEGIN
  591.           WinSetWindowULong(hwndDlg,QWL_USER,LONGWORD(SELF));
  592.           WinSubClassWindow(hwndDlg,@StdDlgProc);
  593.      END;
  594.      DialogVMT:=NIL;   {allow other threads to proceed}
  595. END;
  596.  
  597. DESTRUCTOR TDialog.Done;
  598. BEGIN
  599.      IF HwndDlg<>0 THEN
  600.      BEGIN
  601.           WinDestroyWindow(hwnddlg);
  602.           HwndDlg:=0;
  603.      END;
  604. END;
  605.  
  606. FUNCTION TDialog.ExecDialog:LONGWORD;
  607. VAR  r:LONGWORD;
  608. BEGIN
  609.      r:=WinProcessDlg(hwnddlg);
  610.      WinDestroyWindow(hwnddlg);
  611.      HwndDlg:=0;
  612.      ExecDialog:=r;
  613. END;
  614.  
  615.  
  616. {***************************************************************************
  617.  *                                                                         *
  618.  *  Object TNotebookDialog                                                 *
  619.  *                                                                         *
  620.  ***************************************************************************}
  621.  
  622.  
  623. CONSTRUCTOR TNotebookDialog.Init(Parent,Owner:HWND;hmod:HModule;
  624.                      idDlg,idNotebook:LONGWORD;pCreateParams:Pointer);
  625. BEGIN
  626.      NotebookID:=idNotebook;
  627.      ActualPageID:=0;
  628.      Pages:=NIL;
  629.      Inherited Init(Parent,Owner,hmod,idDlg,pCreateParams);
  630.      InitializeNoteBookPages;
  631. END;
  632.  
  633. DESTRUCTOR TNoteBookDialog.Done;
  634. VAR  dummy,next:PNoteBookPages;
  635. BEGIN
  636.      INHERITED.Done;
  637.      dummy:=Pages;
  638.      WHILE dummy<>NIL DO
  639.      BEGIN
  640.           next:=dummy^.next;
  641.           dispose(dummy);
  642.           dummy:=next;
  643.      END;
  644. END;
  645.  
  646. PROCEDURE TNoteBookDialog.SetColors(typ:WORD;value:LONGINT);
  647. BEGIN
  648.      WinSendMsg(NoteBook,BKM_SETNOTEBOOKCOLORS,value,typ);
  649. END;
  650.  
  651. PROCEDURE TNoteBookDialog.WMInitDlg(VAR Msg:TMessage);
  652. BEGIN
  653.      NoteBook:=WinWindowFromID(Msg.Receiver,NotebookID);
  654. END;
  655.  
  656. PROCEDURE TNoteBookDialog.SelectPage(id:ULONG);
  657. BEGIN
  658.      WinSendMsg(Notebook,BKM_TURNTOPAGE,id,0);
  659. END;
  660.  
  661. PROCEDURE TNoteBookDialog.PageOpened(id:ULONG;Dlg:PDialog);
  662. BEGIN
  663.      ActualPageID:=id;
  664. END;
  665.  
  666. PROCEDURE TNoteBookDialog.PageClosed(id:ULONG;Dlg:PDialog);
  667. BEGIN
  668. END;
  669.  
  670. PROCEDURE TNoteBookDialog.WMControl(VAR Msg:TMessage);
  671. VAR  notify:PPAGESELECTNOTIFY;
  672.      dnotify:PDELETENOTIFY;
  673.      p:PDialog;
  674.      hwndPage:HWND;
  675.      result:ULONG;
  676.      dummy:PNoteBookPages;
  677. BEGIN
  678.      Inherited WMControl(msg);
  679.      IF msg.param1lo=NoteBookID THEN
  680.      BEGIN
  681.           CASE msg.param1hi OF
  682.             BKN_PAGESELECTED:
  683.             BEGIN
  684.                notify:=POINTER(msg.param2);
  685.                IF notify<>NIL THEN
  686.                BEGIN
  687.                     p:=GetDlgFromID(notify^.ulPageIDCur);
  688.                     PageClosed(notify^.ulPageIDCur,p);
  689.                     p:=GetDlgFromID(notify^.ulPageIDNew);
  690.                     PageOpened(notify^.ulPageIDNew,p);
  691.                END;
  692.             END;
  693.             BKN_PAGEDELETED:
  694.             BEGIN
  695.                  dnotify:=POINTER(msg.param2);
  696.                  IF dnotify<>NIL THEN
  697.                  BEGIN
  698.                       hwndPage:=dnotify^.hwndPage;
  699.                       result:=0;
  700.                       dummy:=Pages;
  701.                       WHILE dummy<>NIL DO
  702.                       BEGIN
  703.                          IF dummy^.Dlg<>NIL THEN
  704.                            IF dummy^.Dlg^.HwndDlg=hwndPage
  705.                               THEN result:=dummy^.ID;
  706.                          dummy:=dummy^.Next;
  707.                       END;
  708.                       IF result<>0 THEN
  709.                         PageClosed(result,GetDlgFromID(result));
  710.                  END;
  711.             END;
  712.           END; {case}
  713.      END;
  714. END;
  715.  
  716. PROCEDURE TNotebookDialog.SetMajorTabDimensions(W,H:WORD);
  717. BEGIN
  718.      WinSendMsg(Notebook,BKM_SETDIMENSIONS,MPFROM2SHORT(W,H),BKA_MAJORTAB);
  719. END;
  720.  
  721. PROCEDURE TNotebookDialog.SetMinorTabDimensions(W,H:WORD);
  722. BEGIN
  723.      WinSendMsg(Notebook,BKM_SETDIMENSIONS,MPFROM2SHORT(W,H),BKA_MINORTAB);
  724. END;
  725.  
  726. PROCEDURE TNotebookDialog.SetPageButtonDimensions(W,H:WORD);
  727. BEGIN
  728.      WinSendMsg(Notebook,BKM_SETDIMENSIONS,MPFROM2SHORT(W,H),BKA_PAGEBUTTON);
  729. END;
  730.  
  731. FUNCTION TNoteBookDialog.GetDlgFromID(id:ULONG):PDialog;
  732. VAR  result:PDialog;
  733.      dummy:PNoteBookPages;
  734. BEGIN
  735.      result:=NIL;
  736.      dummy:=Pages;
  737.      WHILE dummy<>NIL DO
  738.      BEGIN
  739.           IF dummy^.ID=ID THEN result:=dummy^.Dlg;
  740.           dummy:=dummy^.Next;
  741.      END;
  742.      GetDlgFromID:=result;
  743. END;
  744.  
  745. FUNCTION TNoteBookDialog.GetIDFromDlg(Dlg:PDialog):ULONG;
  746. VAR  result:ULONG;
  747.      dummy:PNoteBookPages;
  748. BEGIN
  749.      result:=0;
  750.      dummy:=Pages;
  751.      WHILE dummy<>NIL DO
  752.      BEGIN
  753.           IF dummy^.Dlg=Dlg THEN result:=dummy^.ID;
  754.           dummy:=dummy^.Next;
  755.      END;
  756.      GetIDFromDlg:=result;
  757. END;
  758.  
  759. PROCEDURE TNoteBookDialog.InitializeNoteBookPages;
  760. BEGIN
  761. END;
  762.  
  763. PROCEDURE TNotebookDialog.DestroyNoteBookPages;
  764. BEGIN
  765. END;
  766.  
  767. PROCEDURE TNotebookDialog.WMClose(VAR msg:TMessage);
  768. BEGIN
  769.      PageClosed(ActualPageID,GetDlgFromID(ActualPageID));
  770.      DestroyNoteBookPages;
  771. END;
  772.  
  773. FUNCTION TNotebookDialog.InsertPage(id:ULONG;Dlg:PDialog;
  774.                   Order,Options:WORD;TabText,StatusText:STRING):ULONG;
  775. VAR  result:ULONG;
  776.      r:ULONG;
  777.      dummy:PNoteBookPages;
  778.      cTabText,cStatusText:CSTRING;
  779. LABEL l;
  780. BEGIN
  781.      cTabText:=TabText;
  782.      cStatusText:=StatusText;
  783.      result:=0;
  784.  
  785.      IF Notebook=0 THEN goto l;
  786.  
  787.      result:=WinSendMsg(NoteBook,BKM_INSERTPAGE,id,MPFROM2SHORT(Options,Order));
  788.      IF result=0 THEN goto l;
  789.  
  790.      IF Options AND BKA_STATUSTEXTON=BKA_STATUSTEXTON THEN
  791.      BEGIN
  792.           r:=WinSendMsg(Notebook,BKM_SETSTATUSLINETEXT,result,
  793.                         ULONG(@cStatusText));
  794.           IF r<>1 THEN goto l;
  795.      END;
  796.  
  797.      r:=WinSendMsg(Notebook,BKM_SETTABTEXT,result,ULONG(@cTabText));
  798.      IF r<>1 THEN goto l;
  799.  
  800.      IF Dlg<>NIL THEN
  801.      BEGIN
  802.           r:=WinSendMsg(Notebook,BKM_SetPageWindowHWND,result,Dlg^.HwndDlg);
  803.           IF r<>1 THEN goto l;
  804.      END;
  805.  
  806.      IF Pages=NIL THEN
  807.      BEGIN
  808.           New(Pages);
  809.           dummy:=Pages;
  810.      END
  811.      ELSE
  812.      BEGIN
  813.           dummy:=Pages;
  814.           WHILE dummy^.next<>NIL DO dummy:=dummy^.Next;
  815.           New(dummy^.Next);
  816.           dummy:=dummy^.Next;
  817.      END;
  818.  
  819.      dummy^.Dlg:=Dlg;
  820.      dummy^.id:=result;
  821.      dummy^.Next:=NIL;
  822. l:
  823.      InsertPage:=result;
  824. END;
  825.  
  826.  
  827. {***************************************************************************
  828. *                                                                          *
  829. *  File Open/File Save Standard Dialogs                                    *
  830. *                                                                          *
  831. ****************************************************************************}
  832.  
  833. FUNCTION FileOpenDialog(Win:HWND;VAR result:STRING):BOOLEAN;
  834. VAR  Dlg:FileDlg;
  835.      cTitle,cOKName:CSTRING;
  836. BEGIN
  837.      FillChar(dlg,sizeof(FileDlg),0); {Clear Dialog structure}
  838.  
  839.      cTitle:=FileOpenDlgTitle;
  840.      cOKName:=FileOpenDlgOKName;
  841.      Dlg.pszTitle:=@cTitle;
  842.      Dlg.pszOkButton:=@cOKName;
  843.      Dlg.szFullFile:=FileOpenDlgWildCards;
  844.      Dlg.cbSize:=sizeof(FileDlg);
  845.      Dlg.fl:=FDS_OPEN_DIALOG | FDS_CENTER | FDS_ENABLEFILELB;
  846.      WinFileDlg(HWND_DESKTOP,Win,Dlg);
  847.      IF Dlg.lReturn=1 THEN {DID_OK}
  848.      BEGIN
  849.           result:=dlg.szFullFile;
  850.           FileOpenDialog:=TRUE;
  851.      END
  852.      ELSE
  853.      BEGIN
  854.           result:='';
  855.           FileOpenDialog:=FALSE;
  856.      END;
  857.      {UpcaseStr(result);}
  858. END;
  859.  
  860.  
  861. FUNCTION FileSaveDialog(Win:HWND;VAR result:STRING):BOOLEAN;
  862. VAR  Dlg:FileDlg;
  863.      cTitle,cOKName:CSTRING;
  864. BEGIN
  865.      FillChar(dlg,sizeof(FileDlg),0); {Clear Dialog structure}
  866.  
  867.      cTitle:=FileSaveDlgTitle;
  868.      cOKName:=FileSaveDlgOKName;
  869.      Dlg.pszTitle:=@cTitle;
  870.      Dlg.pszOkButton:=@cOKName;
  871.      Dlg.szFullFile:=FileSaveDlgWildCards;
  872.      Dlg.cbSize:=sizeof(FileDlg);
  873.      Dlg.fl:=FDS_SAVEAS_DIALOG | FDS_CENTER | FDS_ENABLEFILELB;
  874.      WinFileDlg(HWND_DESKTOP,Win,Dlg);
  875.      IF Dlg.lReturn=1 THEN {DID_OK}
  876.      BEGIN
  877.           result:=dlg.szFullFile;
  878.           FileSaveDialog:=TRUE;
  879.      END
  880.      ELSE
  881.      BEGIN
  882.           result:='';
  883.           FileSaveDialog:=FALSE;
  884.      END;
  885.      {UpcaseStr(result);}
  886. END;
  887.  
  888.  
  889. {$D+}
  890.  
  891. BEGIN
  892.      FileOpenDlgTitle:='Open a file';
  893.      FileOpenDlgWildcards:='*.*';
  894.      FileOpenDlgOkname:='Open';
  895.      FileSaveDlgTitle:='Save file as';
  896.      FileSaveDlgWildcards:='*.*';
  897.      FileSaveDlgOkname:='Save';
  898.      StdDlgProcAddr:=@StdDlgProc;
  899.      StartDlgProcAddr:=@StartDlgProc;
  900.      DialogVMT:=NIL;
  901. END.
  902.