home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / os2cl016.zip / pmdlg.cpp < prev    next >
C/C++ Source or Header  |  1996-02-05  |  12KB  |  508 lines

  1. /* 
  2.  
  3.  
  4.     pmdlg.cpp (emx+gcc) 
  5.  
  6.     1994,95 Giovanni Iachello
  7.     This is freeware software. You can use or modify it as you wish,
  8.     provided that the part of code that I wrote remains freeware.
  9.     Freeware means that the source code must be available on request 
  10.     to anyone.
  11.     You must also include this notice in all files derived from this
  12.     file.
  13.  
  14.  
  15. */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19.  
  20. #define INCL_WINMLE
  21. #include "pmwin.h"
  22. #include "pmdlg.h"
  23. #include "pmstdres.h"
  24.  
  25. /////////////////////////////////////////////////////////////////////////////
  26.  
  27. MRESULT PMDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  28. {
  29.     PMDialog* win=NULL;
  30.     if (msg==WM_INITDLG) {
  31.         win=(PMDialog*)mp2;
  32.         if (win) { 
  33.             WinSetWindowPtr(hwnd,0,win);
  34.             win->hwnd=hwnd;                  // e naturalmente aggiorna hwnd ... ;)
  35.             win->hwndFrame=hwnd;
  36.             win->init();
  37.             win->initdlg();
  38.             return (MRESULT)TRUE;               // if focus changed
  39.         }
  40.     }
  41.  
  42.     win = (PMDialog*)WinQueryWindowPtr(hwnd, 0);
  43.     if (win) {
  44.         PMEvent event(msg,mp1,mp2,CHARMSG(&msg),MOUSEMSG(&msg));
  45.         return win->msgProc(event);
  46.     }
  47.     return WinDefDlgProc(hwnd,msg,mp1,mp2);
  48. }
  49.  
  50.  
  51. /////////////////////////////////////////////////////////////////////////////
  52.  
  53. PMControl::PMControl(HWND parentDlg,void* iobj,int ilen,int iid) :
  54.     PMWin(WinQueryAnchorBlock(parentDlg))
  55. {
  56.     hwndFrame=parentDlg; obj=iobj; len=ilen; id=iid;
  57.     hwnd=WinWindowFromID(hwndFrame,id);
  58.     // this is not used because the library can determine the pointer to
  59.     // the PMControl in another way, and it does not work for some controls
  60.     // (MLE...). Anyway it is done for completeness.
  61.     WinSetWindowPtr(hwnd,0,this); // okkey
  62. }
  63.  
  64. BOOL PMControl::destroyWin()
  65. {
  66.     return WinDestroyWindow(hwnd);
  67. }
  68.  
  69. // inhibit creating controls.
  70. BOOL PMControl::createWin()
  71. {
  72.     return FALSE;
  73. }
  74.  
  75. /////////////////////////////////////////////////////////////////////////////
  76.  
  77. PMButton::PMButton(HWND parentDlg,void* iobj,int ilen,int iid) :
  78.     PMControl(parentDlg,iobj,ilen,iid) 
  79. {
  80. }
  81.  
  82. void PMButton::get() 
  83. }
  84.  
  85. void PMButton::set() 
  86. }
  87.  
  88. /////////////////////////////////////////////////////////////////////////////
  89.  
  90. PMRadioButtonGroup::PMRadioButtonGroup(HWND parentDlg,void* iobj,int ilen,int iid) :
  91.     PMButton(parentDlg,iobj,ilen,iid) 
  92. {
  93. }
  94.  
  95. void PMRadioButtonGroup::get() 
  96.     int ret=queryIndex();
  97.     *((int*)obj)=ret;
  98. }
  99.  
  100. void PMRadioButtonGroup::set() 
  101.     HWND hwndctrl=WinWindowFromID(hwndFrame,id+(*(int*)obj)); // trova hwnd del controllo da attivare
  102.     WinSendMsg(hwndctrl,BM_SETCHECK,(MPARAM)1,(MPARAM)0);
  103. }
  104.  
  105. /////////////////////////////////////////////////////////////////////////////
  106.  
  107. PMCheckBox::PMCheckBox(HWND parentDlg,void* iobj,int ilen,int iid) :
  108.     PMButton(parentDlg,iobj,ilen,iid) 
  109. {
  110. }
  111.  
  112. void PMCheckBox::get() 
  113.     int ret=queryCheck();
  114.     *((int*)obj)=ret;
  115. }
  116.  
  117. void PMCheckBox::set() 
  118.     setCheck(*((int*)obj));
  119. }
  120.  
  121. /////////////////////////////////////////////////////////////////////////////
  122.  
  123. PMEntryField::PMEntryField(HWND parentDlg,void* iobj,int ilen,int iid) :
  124.     PMControl(parentDlg,iobj,ilen,iid) 
  125.     WinSendDlgItemMsg(hwndFrame,id,EM_SETTEXTLIMIT,MPFROMSHORT(len),0);
  126. }
  127.  
  128. void PMEntryField::get() 
  129.     WinQueryDlgItemText(hwndFrame,id,len,(PSZ)obj);
  130. }
  131.  
  132. void PMEntryField::set() 
  133.     WinSetDlgItemText(hwndFrame,id,(PSZ)obj);
  134. }
  135.  
  136. /////////////////////////////////////////////////////////////////////////////
  137.  
  138. PMMultiLineEdit::PMMultiLineEdit(HWND parentDlg,void* iobj,int ilen,int iid) :
  139.     PMControl(parentDlg,iobj,ilen,iid) 
  140.     WinSendDlgItemMsg(hwndFrame,id,MLM_SETTEXTLIMIT,MPFROMSHORT(len),0);
  141. }
  142.  
  143. void PMMultiLineEdit::get() 
  144.     WinQueryDlgItemText(hwndFrame,id,len,(PSZ)obj);
  145. }
  146.  
  147. void PMMultiLineEdit::set() 
  148.     WinSetDlgItemText(hwndFrame,id,(PSZ)obj);
  149. }
  150.  
  151. ////////////////////////////////////////////////////////////////////////////
  152.  
  153. PMListBox::PMListBox(HWND parentDlg,void* iobj,int ilen,int iid) :
  154.     PMControl(parentDlg,iobj,ilen,iid) 
  155. }
  156.  
  157. PMListBox::~PMListBox()
  158. {
  159. }
  160.  
  161. void PMListBox::get()
  162. {
  163.     ULONG ret=(ULONG)WinSendMsg(hwnd,LM_QUERYSELECTION,MPFROMLONG(LIT_FIRST),(MPARAM)NULL);
  164.     *((int*)obj)=ret;
  165. }
  166.  
  167. void PMListBox::set()
  168. {
  169.     WinSendMsg(hwnd,LM_SELECTITEM,MPFROMLONG(*((int*)obj)),(MPARAM)NULL);
  170. }
  171.  
  172. ////////////////////////////////////////////////////////////////////////////
  173.  
  174. PMValueSet::PMValueSet(HWND parentDlg,void* iobj,int ilen,int iid) :
  175.     PMControl(parentDlg,iobj,ilen,iid) 
  176. }
  177.  
  178. void PMValueSet::get()
  179. {
  180.     MRESULT ret=querySelectedItem();
  181.     *((MRESULT*)obj)=ret;
  182. }
  183.  
  184. void PMValueSet::set()
  185. {
  186.     selectItem(*(MPARAM*)obj);
  187. }
  188.  
  189. ////////////////////////////////////////////////////////////////////////////
  190.  
  191. PMSpinButton::PMSpinButton(HWND parentDlg,void* iobj,int ilen,int iid) :
  192.     PMControl(parentDlg,iobj,ilen,iid) 
  193. }
  194.  
  195. void PMSpinButton::get()
  196. {
  197.     queryValue((PVOID)obj,0,SPBQ_ALWAYSUPDATE);
  198. }
  199.  
  200. void PMSpinButton::set()
  201. {
  202.     setCurrentValue(*(LONG*)obj);
  203. }
  204.  
  205. ////////////////////////////////////////////////////////////////////////////
  206.  
  207. PMScrollBar::PMScrollBar(HWND parentDlg, void* iobj, int ilen, int iid) :
  208.     PMControl(parentDlg,iobj,ilen,iid)
  209. {
  210. }
  211.  
  212. PMScrollBar::PMScrollBar(PMWin* win, int* iobj, int iid)    :
  213.     PMControl(win->getHwndFrame(),iobj,4,iid)
  214. {
  215. }
  216.  
  217. void PMScrollBar::get()
  218. {
  219.     *(int*)obj=int(queryPos());
  220. }
  221.  
  222. void PMScrollBar::set()
  223. {
  224.     setPos(SHORT(*(int*)obj));
  225. }
  226.  
  227. PMVertScrollBar::PMVertScrollBar(PMWin* win, int* iobj) :
  228.     PMScrollBar(win,iobj,FID_VERTSCROLL)
  229. {
  230. }
  231.  
  232. PMHorizScrollBar::PMHorizScrollBar(PMWin* win, int* iobj) :
  233.     PMScrollBar(win,iobj,FID_HORZSCROLL)
  234. {
  235. }
  236.  
  237.  
  238. /////////////////////////////////////////////////////////////////////////////
  239.  
  240. PMDialog::PMDialog(HWND p,HWND o) : PMWin("",WinQueryAnchorBlock(o)) // chiama il costruttore complesso che riempie createargs
  241. {
  242.     createArgs->hwndParent=p;
  243.     createArgs->hwndOwner=o;
  244.     createArgs->hmod=NULLHANDLE;    
  245. }
  246.  
  247. PMDialog::~PMDialog()
  248. {
  249. }
  250.  
  251. void PMDialog::init()
  252. {
  253. }
  254.  
  255. BOOL PMDialog::createWin()
  256. {
  257.     return FALSE;
  258. }
  259.  
  260. BOOL PMDialog::destroyWin()
  261. {
  262.     return WinDismissDlg(hwnd,FALSE);
  263. }
  264.  
  265.  
  266. BOOL PMDialog::dispachEvent(PMEvent & event)
  267. {
  268.     switch (event.msg) {
  269.         case WM_CONTROL: 
  270.             return control(SHORT1FROMMP(event.mp1),SHORT2FROMMP(event.mp1));
  271.         case WM_INITDLG:
  272.             return initdlg();
  273.     }               
  274.     return PMWin::dispachEvent(event);
  275. }
  276.  
  277. BOOL PMDialog::control(SHORT id,SHORT ctrlmsg)
  278. {
  279.     return FALSE;
  280. }    
  281.  
  282. BOOL PMDialog::initdlg()
  283. {
  284.     return FALSE;
  285. }    
  286.  
  287. BOOL PMDialog::command(USHORT id,USHORT cmddev)
  288. {
  289.     return FALSE;
  290. }    
  291.  
  292. /////////////////////////////////////////////////////////////////////////////
  293.  
  294. PMModalDialog::PMModalDialog(HWND p,HWND o,ULONG i,PMControlMap *icm,void* iobj) : 
  295.     PMDialog(p,o)
  296. {
  297.     id=i;
  298.     cm=icm;
  299.     obj=iobj;
  300.     delctlmap=FALSE;
  301. }
  302.  
  303. PMControl* PMModalDialog::controlFromID(int id)
  304.     PMControl* ctl;
  305.     ctl=(PMControl*)WinQueryWindowPtr(WinWindowFromID(hwnd,id),0); 
  306.     if (!ctl) {
  307.         PMControlMap* pcm=cm;
  308.         for ( ; pcm->createfn!=NULL; pcm++ ) 
  309.             if (pcm->id == id) { ctl=pcm->ctrl;    break; }
  310.     }
  311.     assert(ctl);
  312.     return ctl;
  313. }
  314.  
  315. PMModalDialog::~PMModalDialog()
  316. {
  317.     if (delctlmap) {
  318.         PMControlMap* pcm=cm;
  319.         for ( ; pcm->createfn!=NULL; pcm++ ) {
  320.             delete pcm->ctrl; // elimina i controlli creati...
  321.         }
  322.         delctlmap=FALSE;
  323.     }
  324. }
  325.  
  326. void PMModalDialog::init()
  327. {
  328.     PMControlMap* pcm=cm;
  329.     for ( ; pcm->createfn!=NULL; pcm++ ) {
  330.         PMControl* ctl=pcm->createfn(hwnd,(char*)obj+pcm->offset,pcm->len,pcm->id);
  331.         assert(ctl);
  332.         ctl->set(); // imposta sullo schermo
  333.         pcm->ctrl=ctl; // salva anche nella mappa dei controlli
  334.     }
  335.     delctlmap=TRUE;
  336.     WinSetFocus(HWND_DESKTOP,WinWindowFromID(hwnd,pcm->id));
  337. }    
  338.  
  339. void PMModalDialog::updateControls()
  340. {
  341.     PMControlMap* pcm=cm;
  342.     for ( ; pcm->createfn!=NULL; pcm++ ) {
  343.         pcm->ctrl->set(); // imposta sullo schermo
  344.     }
  345. }
  346.  
  347. void PMModalDialog::updateObject()
  348. {
  349.     PMControlMap* pcm=cm;
  350.     for ( ; pcm->createfn!=NULL; pcm++ ) {
  351.         pcm->ctrl->get(); // imposta nella struttura
  352.     }
  353. }
  354.  
  355. BOOL PMModalDialog::createWin()
  356. {
  357.     oldproc=WinDefDlgProc;
  358.     ULONG ret=WinDlgBox(createArgs->hwndParent,createArgs->hwndOwner,PMDlgProc,createArgs->hmod,id,this);
  359.     return ret;
  360. }
  361.  
  362. BOOL PMModalDialog::command(USHORT id,USHORT cmddev)
  363. {
  364.     if (id==DID_OK) {
  365.         WinDismissDlg(hwnd,TRUE);
  366.         updateObject();        
  367.     }
  368.     if (id==DID_CANCEL) WinDismissDlg(hwnd,FALSE);
  369.     return TRUE;
  370. }    
  371.  
  372. BOOL PMModelessDialog::createWin()
  373. {
  374.     oldproc=WinDefDlgProc;
  375.     ULONG ret=WinLoadDlg(createArgs->hwndParent,createArgs->hwndOwner,PMDlgProc,createArgs->hmod,id,this);
  376.     return ret;
  377. }
  378.     
  379.  
  380. /////////////////////////////////////////////////////////////////////////////
  381.  
  382. PMFontDialog::PMFontDialog(HWND parent,HWND owner,FONTMETRICS *ifm,ULONG type,PSZ title,PSZ preview) : 
  383.     PMDialog(parent,owner) 
  384. {
  385.     fm=ifm;
  386.     memset((void*)&fontdlg, 0 , sizeof(FONTDLG));
  387.     fontdlg.flType= type;
  388.     fontdlg.pszTitle=title;
  389.     fontdlg.pszPreview=preview;
  390.     fontdlg.pszFamilyname=new CHAR[CCHMAXPATH]; // alloca zpazio per il nome della famiglia
  391. }
  392.  
  393. PMFontDialog::~PMFontDialog()
  394. {
  395.     delete fontdlg.pszFamilyname;
  396. }
  397.  
  398. BOOL PMFontDialog::createWin()
  399. {
  400.     fontdlg.cbSize=sizeof(FONTDLG);
  401.     fontdlg.hpsScreen = WinGetScreenPS(HWND_DESKTOP);
  402.     fontdlg.hpsPrinter= NULLHANDLE;
  403.     fontdlg.pfnDlgProc= PMFontDlgProc; 
  404.     fontdlg.ulUser= (ULONG)this;
  405.  
  406.     strcpy (fontdlg.pszFamilyname,fm->szFamilyname);
  407.     fontdlg.usFamilyBufLen=CCHMAXPATH;
  408.     fontdlg.fxPointSize= MAKEFIXED (fm->sNominalPointSize / 10 , 0);
  409.     fontdlg.fl= FNTS_CENTER | FNTS_HELPBUTTON | FNTS_NOSYNTHESIZEDFONTS | FNTS_RESETBUTTON;
  410.     fontdlg.clrFore=CLR_NEUTRAL;
  411.     fontdlg.clrBack=CLR_BACKGROUND;
  412.     fontdlg.usWeight=fm->usWeightClass;
  413.     fontdlg.usWidth=fm->usWidthClass;
  414.  
  415.     oldproc=WinDefFontDlgProc;
  416.  
  417.     WinFontDlg (createArgs->hwndParent,createArgs->hwndOwner, &fontdlg);
  418.     return fontdlg.lReturn;
  419. }
  420.  
  421. MRESULT PMFontDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  422. {
  423.     PFONTDLG fdlg;
  424.     PMFontDialog* win=NULL;  // il puntatore alla struttura fontdlg e' in WinPtr 0.
  425.  
  426.     fdlg = (PFONTDLG)WinQueryWindowPtr(hwnd, 0);
  427.     win = (PMFontDialog*) fdlg->ulUser;
  428.     if (win) {
  429.         if (msg==WM_INITDLG) {
  430.             win->hwnd=hwnd;                  // e naturalmente aggiorna hwnd ... ;)
  431.             win->hwndFrame=hwnd;
  432.             win->init();
  433.         }
  434.         PMEvent event(msg,mp1,mp2,CHARMSG(&msg),MOUSEMSG(&msg));
  435.         return win->msgProc(event);
  436.     }
  437.     return WinDefFontDlgProc(hwnd,msg,mp1,mp2);
  438. }
  439.  
  440.  
  441. /////////////////////////////////////////////////////////////////////////////
  442.  
  443. PMFileDialog::PMFileDialog(HWND parent,HWND owner,PSZ file,PSZ title,PSZ OKButton,ULONG flags) : 
  444.     PMDialog(parent,owner) 
  445. {
  446.     memset((void*)&filedlg, 0 , sizeof(FILEDLG));
  447.     filedlg.pszTitle=title;
  448.     filedlg.pszOKButton=OKButton;
  449.     filedlg.fl=flags;
  450.     strncpy(filedlg.szFullFile,file,CCHMAXPATH);
  451. }
  452.  
  453. PMFileDialog::~PMFileDialog()
  454. {
  455. }
  456.  
  457. BOOL PMFileDialog::createWin()
  458. {
  459.     filedlg.cbSize=sizeof(FILEDLG);
  460.     filedlg.pfnDlgProc= PMFileDlgProc; 
  461.     filedlg.ulUser= (ULONG)this;
  462.     filedlg.fl|= FDS_CENTER | FDS_PRELOAD_VOLINFO | FDS_HELPBUTTON;
  463.     filedlg.pszIDrive="C:";
  464.  
  465.     oldproc=WinDefFileDlgProc;
  466.     
  467.     WinFileDlg (createArgs->hwndParent,createArgs->hwndOwner, &filedlg);
  468.     return filedlg.lReturn;
  469. }
  470.  
  471. MRESULT PMFileDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  472. {
  473.     PFILEDLG fdlg;
  474.     PMFileDialog* win=NULL;  // il puntatore alla struttura fontdlg e' in WinPtr 0.
  475.  
  476.     fdlg = (PFILEDLG)WinQueryWindowPtr(hwnd, 0);
  477.     win = (PMFileDialog*) fdlg->ulUser;
  478.     if (win) {
  479.         if (msg==WM_INITDLG) {
  480.             win->hwnd=hwnd;                  // e naturalmente aggiorna hwnd ... ;)
  481.             win->hwndFrame=hwnd;
  482.             win->init();
  483.         }
  484.         PMEvent event(msg,mp1,mp2,CHARMSG(&msg),MOUSEMSG(&msg));
  485.         return win->msgProc(event);
  486.     }
  487.     return WinDefFileDlgProc(hwnd,msg,mp1,mp2);
  488. }
  489.  
  490.  
  491.  
  492.