home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / lora299s.zip / CDIALOG.CPP < prev    next >
C/C++ Source or Header  |  1998-05-12  |  26KB  |  869 lines

  1.  
  2. // LoraBBS Version 2.99 Free Edition
  3. // Copyright (C) 1987-98 Marco Maccaferri
  4. //
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License as published by
  7. // the Free Software Foundation; either version 2 of the License, or
  8. // (at your option) any later version.
  9. //
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19. #include "_ldefs.h"
  20. #include "cpc.h"
  21.  
  22. #if defined(__OS2__)
  23. extern HAB hab;
  24. HWND hwndHelpInstance = NULL;
  25. #elif defined(__NT__)
  26. extern HINSTANCE hinst;
  27. #endif
  28.  
  29. typedef struct {
  30.    USHORT cbSize;
  31.    class CDialog *Dlg;
  32. } CDIALOG_DATA;
  33.  
  34. // ----------------------------------------------------------------------
  35. // Dialog window procedure
  36. // ----------------------------------------------------------------------
  37.  
  38. #if defined(__OS2__)
  39. MRESULT EXPENTRY CDialogDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  40. #elif defined(__NT__)
  41. BOOL CALLBACK CDialogDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  42. #endif
  43. {
  44.    int i;
  45.    class CDialog *dlgClass;
  46.    CPC_MSGMAP_ENTRY *msgMap = NULL;
  47.  
  48. #if defined(__OS2__)
  49.    dlgClass = (class CDialog *)WinQueryWindowULong (hwnd, QWL_USER);
  50. #elif defined(__NT__)
  51.    dlgClass = (class CDialog *)GetWindowLong (hwnd, GWL_USERDATA);
  52. #endif
  53.  
  54.    if (dlgClass != NULL) {
  55.       dlgClass->m_msg = msg;
  56. #if defined(__OS2__)
  57.       dlgClass->m_mp1 = mp1;
  58.       dlgClass->m_mp2 = mp2;
  59. #elif defined(__NT__)
  60.       dlgClass->m_wParam = wParam;
  61.       dlgClass->m_lParam = lParam;
  62. #endif
  63.  
  64.       msgMap = dlgClass->GetMessageMap ();
  65.    }
  66.  
  67.    switch (msg) {
  68. #if defined(__OS2__)
  69.       case WM_INITDLG: {
  70.          CDIALOG_DATA *cData = (CDIALOG_DATA *)mp2;
  71. #elif defined(__NT__)
  72.       case WM_INITDIALOG: {
  73.          CDIALOG_DATA *cData = (CDIALOG_DATA *)lParam;
  74. #endif
  75.  
  76.          dlgClass = cData->Dlg;
  77.          dlgClass->m_hWnd = hwnd;
  78.          dlgClass->lv_Selected = -1;
  79. #if defined(__OS2__)
  80.          WinSetWindowULong (hwnd, QWL_USER, (ULONG)dlgClass);
  81. #elif defined(__NT__)
  82.          SetWindowLong (hwnd, GWL_USERDATA, (LONG)dlgClass);
  83. #endif
  84.  
  85.          dlgClass->OnInitDialog ();
  86. #if defined(__OS2__)
  87.          break;
  88. #elif defined(__NT__)
  89.          return ((BOOL)TRUE);
  90. #endif
  91.       }
  92.  
  93. #if defined(__OS2__)
  94.       case WM_CONTROL:
  95.          for (i = 0; msgMap[i].pfn != NULL; i++) {
  96.             if (msgMap[i].nMessage == msg) {
  97.                if (msgMap[i].nID >= SHORT1FROMMP (mp1) && msgMap[i].nLastID <= SHORT1FROMMP (mp1)) {
  98.                   if (msgMap[i].nCode == SHORT2FROMMP (mp1)) {
  99.                      (dlgClass->*msgMap[i].pfn) ();
  100.                      break;
  101.                   }
  102.                }
  103.             }
  104.          }
  105.          return (0);
  106. #endif
  107.  
  108. #if defined(__NT__)
  109.       case WM_NOTIFY: {
  110.          LPNMHDR pnmh = (LPNMHDR)lParam;
  111.          NM_LISTVIEW *pnmv = (NM_LISTVIEW *)lParam;
  112.  
  113.          if (pnmh->code == NM_DBLCLK)
  114.             dlgClass->OnOK ();
  115.          else if (pnmh->code == LVN_ITEMCHANGED) {
  116.             if (!(pnmv->uNewState & LVIS_SELECTED) && (pnmv->uOldState & LVIS_SELECTED))
  117.                dlgClass->lv_Selected = -1;
  118.             if (pnmv->uNewState & LVIS_SELECTED)
  119.                dlgClass->lv_Selected = (SHORT)pnmv->iItem;
  120.          }
  121.          else {
  122.             for (i = 0; msgMap[i].pfn != NULL; i++) {
  123.                if (msgMap[i].nMessage == msg && msgMap[i].nCode == pnmh->code) {
  124.                   if (msgMap[i].nID >= pnmh->idFrom && msgMap[i].nLastID <= pnmh->idFrom) {
  125.                      (dlgClass->*msgMap[i].pfn) ();
  126.                      break;
  127.                   }
  128.                }
  129.             }
  130.          }
  131.          return (0);
  132.       }
  133. #endif
  134.  
  135. #if defined(__OS2__)
  136.       case WM_CHAR:
  137.          if (SHORT1FROMMP (mp1) & KC_VIRTUALKEY && SHORT2FROMMP (mp2) == VK_F1)
  138.             dlgClass->OnHelp ();
  139.          break;
  140. #endif
  141.  
  142.       case WM_HELP:
  143.          dlgClass->OnHelp ();
  144.          break;
  145. /*
  146. #if defined(__OS2__)
  147.       case WM_HELP: {
  148.          USHORT id;
  149.          HWND hwndHelpInstance;
  150.  
  151.          id = WinQueryWindowUShort (hwnd, QWS_ID);
  152.          hwndHelpInstance = WinQueryHelpInstance (dlgClass->owner_hWnd);
  153.          WinSendMsg (hwndHelpInstance, HM_DISPLAY_HELP, MPFROM2SHORT (id, 0), MPFROMSHORT (HM_RESOURCEID));
  154.          break;
  155.       }
  156. #endif
  157. */
  158.  
  159.       case WM_COMMAND:
  160. #if defined(__OS2__)
  161.          switch (SHORT1FROMMP (mp1)) {
  162. #elif defined(__NT__)
  163.          switch (LOWORD (wParam)) {
  164. #endif
  165.             case IDOK:
  166.                dlgClass->OnOK ();
  167.                break;
  168.             case IDCANCEL:
  169.                dlgClass->OnCancel ();
  170.                break;
  171.             case IDHELP:
  172.                dlgClass->OnHelp ();
  173.                break;
  174.             default:
  175.                for (i = 0; msgMap[i].pfn != NULL; i++) {
  176. #if defined(__OS2__)
  177.                   if (msgMap[i].nMessage == msg) {
  178.                      if (msgMap[i].nID >= SHORT1FROMMP (mp1) && msgMap[i].nLastID <= SHORT1FROMMP (mp1)) {
  179. #elif defined(__NT__)
  180.                   if (msgMap[i].nMessage == msg && msgMap[i].nCode == HIWORD (wParam)) {
  181.                      if (msgMap[i].nID >= LOWORD (wParam) && msgMap[i].nLastID <= LOWORD (wParam)) {
  182. #endif
  183.                         (dlgClass->*msgMap[i].pfn) ();
  184.                         break;
  185.                      }
  186.                   }
  187.                }
  188.                break;
  189.          }
  190.          return (0);
  191.  
  192. #if defined(__NT__)
  193.       case WM_CLOSE:
  194.          EndDialog (hwnd, FALSE);
  195.          break;
  196. #endif
  197.  
  198.       default:
  199.          if (msgMap != NULL) {
  200.             for (i = 0; msgMap[i].pfn != NULL; i++) {
  201.                if (msgMap[i].nMessage == msg) {
  202.                   (dlgClass->*msgMap[i].pfn) ();
  203.                   return (0);
  204.                }
  205.             }
  206.          }
  207.          break;
  208.    }
  209.  
  210. #if defined(__OS2__)
  211.    return (WinDefDlgProc (hwnd, msg, mp1, mp2));
  212. #elif defined(__NT__)
  213.    return ((BOOL)FALSE);
  214. #endif
  215. }
  216.  
  217. CDialog::CDialog (PSZ dialogTemplate, HWND p_hWnd)
  218. {
  219.    strcpy (dlgTemplate, dialogTemplate);
  220.    owner_hWnd = p_hWnd;
  221.    help_hWnd = NULL;
  222. #if defined(__OS2__)
  223.    WinSetPointer (HWND_DESKTOP, WinQuerySysPointer (HWND_DESKTOP, SPTR_WAIT, FALSE));
  224. #elif defined(__NT__)
  225. #endif
  226. }
  227.  
  228. CDialog::~CDialog (void)
  229. {
  230. #if defined(__OS2__)
  231.    if (help_hWnd != NULL)
  232.       WinDestroyHelpInstance (help_hWnd);
  233. #elif defined(__NT__)
  234. #endif
  235. }
  236.  
  237. VOID CDialog::Center (VOID)
  238. {
  239. #if defined(__OS2__)
  240.    RECTL rc;
  241. #elif defined(__NT__)
  242.    RECT rc;
  243. #endif
  244.  
  245. #if defined(__OS2__)
  246.    WinQueryWindowRect (m_hWnd, &rc);
  247.    rc.yTop = (WinQuerySysValue (HWND_DESKTOP, SV_CYSCREEN) - (rc.yTop - rc.yBottom)) / 2;
  248.    rc.xLeft = (WinQuerySysValue (HWND_DESKTOP, SV_CXSCREEN) - (rc.xRight - rc.xLeft)) / 2;
  249.    WinSetWindowPos (m_hWnd, NULL, rc.xLeft, rc.yTop, 0, 0, SWP_MOVE);
  250. #elif defined(__NT__)
  251.    GetWindowRect (m_hWnd, &rc);
  252.    rc.top = (GetSystemMetrics (SM_CYSCREEN) - (rc.bottom - rc.top)) / 2;
  253.    rc.left = (GetSystemMetrics (SM_CXSCREEN) - (rc.right - rc.left)) / 2;
  254.    SetWindowPos (m_hWnd, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE|SWP_NOZORDER);
  255. #endif
  256. }
  257.  
  258. LONG CDialog::DoModal (VOID)
  259. {
  260.    LONG ulResult = 0L;
  261.    CDIALOG_DATA cDialog;
  262.  
  263.    cDialog.cbSize = sizeof (CDIALOG_DATA);
  264.    cDialog.Dlg = this;
  265.  
  266. #if defined(__OS2__)
  267.    WinSetPointer (HWND_DESKTOP, WinQuerySysPointer (HWND_DESKTOP, SPTR_ARROW, FALSE));
  268.    ulResult = WinDlgBox (HWND_DESKTOP, owner_hWnd, CDialogDlgProc, NULLHANDLE, atoi (dlgTemplate), &cDialog);
  269. #elif defined(__NT__)
  270.    ulResult = DialogBoxParam (hinst, MAKEINTRESOURCE (atoi (dlgTemplate)), owner_hWnd, (DLGPROC)CDialogDlgProc, (LPARAM)&cDialog);
  271. #endif
  272.  
  273.    return (ulResult);
  274. }
  275.  
  276. // ----------------------------------------------------------------------
  277. // Windowing API replacement
  278. // ----------------------------------------------------------------------
  279.  
  280. VOID CDialog::EndDialog (USHORT Result)
  281. {
  282. #if defined(__OS2__)
  283.    WinDismissDlg (m_hWnd, Result);
  284. #elif defined(__NT__)
  285.    ::EndDialog (m_hWnd, Result);
  286. #endif
  287. }
  288.  
  289. VOID CDialog::GetDlgItemText (int id, PSZ text, USHORT size)
  290. {
  291. #if defined(__OS2__)
  292.    WinQueryDlgItemText (m_hWnd, id, size, text);
  293. #elif defined(__NT__)
  294.    ::GetDlgItemText (m_hWnd, id, text, size);
  295. #endif
  296. }
  297.  
  298. VOID CDialog::GetDlgItemText (int id, USHORT size, PSZ text)
  299. {
  300. #if defined(__OS2__)
  301.    WinQueryDlgItemText (m_hWnd, id, size, text);
  302. #elif defined(__NT__)
  303.    ::GetDlgItemText (m_hWnd, id, text, size);
  304. #endif
  305. }
  306.  
  307. USHORT CDialog::GetDlgItemTextLength (int id)
  308. {
  309. #if defined(__OS2__)
  310.    return ((USHORT)(WinQueryDlgItemTextLength (m_hWnd, id) + 1));
  311. #elif defined(__NT__)
  312.    return ((USHORT)(::GetWindowTextLength (GetDlgItem (m_hWnd, id)) + 1));
  313. #endif
  314. }
  315.  
  316. VOID CDialog::SetDlgItemText (int id, PSZ text)
  317. {
  318. #if defined(__OS2__)
  319.    WinSetDlgItemText (m_hWnd, id, text);
  320. #elif defined(__NT__)
  321.    ::SetDlgItemText (m_hWnd, id, text);
  322. #endif
  323. }
  324.  
  325. VOID CDialog::SetFocus (int id)
  326. {
  327. #if defined(__OS2__)
  328.    WinSetFocus (HWND_DESKTOP, WinWindowFromID (m_hWnd, id));
  329. #elif defined(__NT__)
  330.    ::SetFocus (GetDlgItem (m_hWnd, id));
  331. #endif
  332. }
  333.  
  334. VOID CDialog::WinHelp (PSZ help_file, int topic_id, PSZ title)
  335. {
  336.    CHAR helpFile[128];
  337.  
  338.    getcwd (helpFile, sizeof (helpFile) - 1);
  339.    if (helpFile[strlen (helpFile) - 1] != '\\')
  340.       strcat (helpFile, "\\");
  341.    strcat (helpFile, help_file);
  342.  
  343. #if defined(__OS2__)
  344.    CHAR *p;
  345.    HELPINIT hini;
  346.  
  347.    if ((p = strchr (helpFile, '>')) != NULL)
  348.       *p = '\0';
  349.  
  350.    if (help_hWnd == NULL) {
  351.       hini.cb = sizeof (HELPINIT);
  352.       hini.ulReturnCode = 0L;
  353.       hini.pszTutorialName = NULL;
  354.       hini.phtHelpTable = (PHELPTABLE)MAKELONG (1, 0xFFFF);
  355.       hini.hmodHelpTableModule = NULL;
  356.       hini.hmodAccelActionBarModule = NULL;
  357.       hini.idAccelTable = 0;
  358.       hini.idActionBar = 0;
  359.       hini.pszHelpWindowTitle = title;
  360.       hini.fShowPanelId = CMIC_HIDE_PANEL_ID;
  361.       hini.pszHelpLibraryName = helpFile;
  362.       if ((help_hWnd = WinCreateHelpInstance (hab, &hini)) != NULL)
  363.          WinAssociateHelpInstance (help_hWnd, owner_hWnd);
  364.    }
  365.    if (help_hWnd != NULL)
  366.       WinSendMsg (help_hWnd, HM_DISPLAY_HELP, MPFROM2SHORT (topic_id, 0), MPFROMSHORT (HM_RESOURCEID));
  367.  
  368. #elif defined(__NT__)
  369.    title = title;
  370.    ::WinHelp (owner_hWnd, helpFile, HELP_CONTEXT, topic_id);
  371. #endif
  372. }
  373.  
  374. // ----------------------------------------------------------------------
  375. // Dialog control messages
  376. // ----------------------------------------------------------------------
  377.  
  378. USHORT CDialog::BM_QueryCheck (int id)
  379. {
  380. #if defined(__OS2__)
  381.    return ((USHORT)WinSendDlgItemMsg (m_hWnd, id, BM_QUERYCHECK, 0L, 0L));
  382. #elif defined(__NT__)
  383.    return ((USHORT)SendDlgItemMessage (m_hWnd, id, BM_GETCHECK, 0, 0L));
  384. #endif
  385. }
  386.  
  387. VOID CDialog::BM_SetCheck (int id, USHORT value)
  388. {
  389. #if defined(__OS2__)
  390.    WinSendDlgItemMsg (m_hWnd, id, BM_SETCHECK, MPFROMSHORT (value), 0L);
  391. #elif defined(__NT__)
  392.    SendDlgItemMessage (m_hWnd, id, BM_SETCHECK, (WPARAM)value, 0L);
  393. #endif
  394. }
  395.  
  396. VOID CDialog::CB_AddString (int id, PSZ value)
  397. {
  398. #if defined(__OS2__)
  399.    WinSendDlgItemMsg (m_hWnd, id, LM_INSERTITEM, MPFROMSHORT (LIT_END), MPFROMP (value));
  400. #elif defined(__NT__)
  401.    SendDlgItemMessage (m_hWnd, id, CB_ADDSTRING, 0, (LPARAM)value);
  402. #endif
  403. }
  404.  
  405. VOID CDialog::CB_SelectItem (int id, USHORT value)
  406. {
  407. #if defined(__OS2__)
  408.    WinSendDlgItemMsg (m_hWnd, id, LM_SELECTITEM, MPFROMSHORT (value), MPFROMSHORT (TRUE));
  409. #elif defined(__NT__)
  410.    SendDlgItemMessage (m_hWnd, id, CB_SETCURSEL, (WPARAM)value, 0L);
  411. #endif
  412. }
  413.  
  414. USHORT CDialog::CB_QuerySelection (int id)
  415. {
  416. #if defined(__OS2__)
  417.    return ((USHORT)WinSendDlgItemMsg (m_hWnd, id, LM_QUERYSELECTION, MPFROMSHORT (LIT_FIRST), 0L));
  418. #elif defined(__NT__)
  419.    return ((USHORT)SendDlgItemMessage (m_hWnd, id, CB_GETCURSEL, 0, 0L));
  420. #endif
  421. }
  422.  
  423. VOID CDialog::EM_SetTextLimit (int id, USHORT value)
  424. {
  425. #if defined(__OS2__)
  426.    WinSendDlgItemMsg (m_hWnd, id, EM_SETTEXTLIMIT, MPFROMSHORT (value), 0L);
  427. #elif defined(__NT__)
  428.    SendDlgItemMessage (m_hWnd, id, EM_SETLIMITTEXT, (WPARAM)value, 0L);
  429. #endif
  430. }
  431.  
  432. VOID CDialog::LM_AddString (int id, PSZ value)
  433. {
  434. #if defined(__OS2__)
  435.    WinSendDlgItemMsg (m_hWnd, id, LM_INSERTITEM, MPFROMSHORT (LIT_END), MPFROMP (value));
  436. #elif defined(__NT__)
  437.    SendDlgItemMessage (m_hWnd, id, LB_ADDSTRING, 0, (LPARAM)value);
  438. #endif
  439. }
  440.  
  441. VOID CDialog::LM_SetItemText (int id, USHORT value, PSZ text)
  442. {
  443. #if defined(__OS2__)
  444.    WinSendDlgItemMsg (m_hWnd, id, LM_SETITEMTEXT, MPFROMSHORT (value), MPFROMP (text));
  445. #elif defined(__NT__)
  446.    SendDlgItemMessage (m_hWnd, id, LB_INSERTSTRING, (WPARAM)value, (LPARAM)text);
  447.    SendDlgItemMessage (m_hWnd, id, LB_DELETESTRING, (WPARAM)(value + 1), 0L);
  448.    SendDlgItemMessage (m_hWnd, id, LB_SELECTSTRING, (WPARAM)value, (LPARAM)text);
  449. #endif
  450. }
  451.  
  452. VOID CDialog::LM_DeleteAll (int id)
  453. {
  454. #if defined(__OS2__)
  455.    WinSendDlgItemMsg (m_hWnd, id, LM_DELETEALL, 0L, 0L);
  456. #elif defined(__NT__)
  457.    SendDlgItemMessage (m_hWnd, id, LB_RESETCONTENT, 0, 0L);
  458. #endif
  459. }
  460.  
  461. VOID CDialog::LM_DeleteItem (int id, USHORT value)
  462. {
  463. #if defined(__OS2__)
  464.    WinSendDlgItemMsg (m_hWnd, id, LM_DELETEITEM, MPFROMSHORT (value), 0L);
  465. #elif defined(__NT__)
  466.    SendDlgItemMessage (m_hWnd, id, LB_DELETESTRING, (WPARAM)value, 0L);
  467. #endif
  468. }
  469.  
  470. VOID CDialog::LM_SelectItem (int id, USHORT value)
  471. {
  472. #if defined(__OS2__)
  473.    WinSendDlgItemMsg (m_hWnd, id, LM_SELECTITEM, MPFROMSHORT (value), MPFROMSHORT (TRUE));
  474. #elif defined(__NT__)
  475.    SendDlgItemMessage (m_hWnd, id, LB_SETCURSEL, (WPARAM)value, 0L);
  476. #endif
  477. }
  478.  
  479. USHORT CDialog::LM_QueryItemCount (int id)
  480. {
  481. #if defined(__OS2__)
  482.    return ((USHORT)WinSendDlgItemMsg (m_hWnd, id, LM_QUERYITEMCOUNT, 0L, 0L));
  483. #elif defined(__NT__)
  484.    return ((USHORT)SendDlgItemMessage (m_hWnd, id, LB_GETCOUNT, 0, 0L));
  485. #endif
  486. }
  487.  
  488. VOID CDialog::LM_QueryItemText (int id, USHORT value, USHORT size, PSZ text)
  489. {
  490. #if defined(__OS2__)
  491.    WinSendDlgItemMsg (m_hWnd, id, LM_QUERYITEMTEXT, MPFROM2SHORT (value, size), MPFROMP (text));
  492. #elif defined(__NT__)
  493.    SendDlgItemMessage (m_hWnd, id, LB_GETTEXT, (WPARAM)value, (LPARAM)text);
  494.    size = size;
  495. #endif
  496. }
  497.  
  498. USHORT CDialog::LM_QuerySelection (int id)
  499. {
  500. #if defined(__OS2__)
  501.    return ((USHORT)WinSendDlgItemMsg (m_hWnd, id, LM_QUERYSELECTION, MPFROMSHORT (LIT_FIRST), 0L));
  502. #elif defined(__NT__)
  503.    return ((USHORT)SendDlgItemMessage (m_hWnd, id, LB_GETCURSEL, 0, 0L));
  504. #endif
  505. }
  506.  
  507. #if defined(__OS2__)
  508.  
  509. ULONG nFields, listDataSize, subItem;
  510. PFIELDINFO pFieldInfo, pTopField;
  511. LV_PLISTDATA pRecord;
  512.  
  513. #elif defined(__NT__)
  514.  
  515. LV_COLUMN lvC;
  516. LV_ITEM lvI;
  517.  
  518. #endif
  519.  
  520. VOID CDialog::LVM_AllocateColumns (int id, int value)
  521. {
  522. #if defined(__OS2__)
  523.    HWND hwndContainer;
  524.    CNRINFO cnrInfo;
  525.  
  526.    hwndContainer = WinWindowFromID (m_hWnd, id);
  527.  
  528.    memset (&cnrInfo, 0, sizeof (CNRINFO));
  529.    cnrInfo.cb = sizeof (CNRINFO);
  530.    cnrInfo.flWindowAttr = CV_DETAIL|CA_DETAILSVIEWTITLES;
  531.    WinSendMsg (hwndContainer, CM_SETCNRINFO, MPFROMP (&cnrInfo), MPFROMLONG (CMA_FLWINDOWATTR));
  532.  
  533.    nFields = value;
  534.    pFieldInfo = (PFIELDINFO)WinSendMsg (hwndContainer, CM_ALLOCDETAILFIELDINFO, (MPARAM)nFields, (MPARAM)0);
  535.    pTopField = pFieldInfo;
  536.  
  537.    subItem = 0L;
  538.    pRecord = NULL;
  539. #elif defined(__NT__)
  540.    id = id;
  541.    value = value;
  542.  
  543.    InitCommonControls ();
  544.  
  545.    lvC.mask = LVCF_FMT|LVCF_TEXT|LVCF_SUBITEM|LVCF_WIDTH;
  546.    lvC.iSubItem = 0;
  547.    lvC.pszText = "";
  548.    lvC.cx = 50;
  549.    lvC.fmt = LVCFMT_LEFT;
  550.  
  551.    lvI.mask = 0;
  552.    lvI.iItem = -1;
  553.    lvI.iSubItem = 0;
  554. #endif
  555. }
  556.  
  557. VOID CDialog::LVM_InsertColumn (int id, PSZ text, int align)
  558. {
  559. #if defined(__OS2__)
  560.    FIELDINFOINSERT fieldinsert;
  561.  
  562.    pFieldInfo->cb = sizeof (FIELDINFO);
  563.    pFieldInfo->pTitleData = text;
  564.    pFieldInfo->flData = CFA_STRING|CFA_VCENTER|CFA_SEPARATOR|CFA_HORZSEPARATOR;
  565.    if (align == LVC_LEFT)
  566.       pFieldInfo->flData |= CFA_LEFT;
  567.    else if (align == LVC_CENTER)
  568.       pFieldInfo->flData |= CFA_CENTER;
  569.    else if (align == LVC_RIGHT)
  570.       pFieldInfo->flData |= CFA_RIGHT;
  571.    pFieldInfo->flTitle = CFA_FITITLEREADONLY|CFA_VCENTER|CFA_CENTER|CFA_SEPARATOR;
  572.    pFieldInfo->offStruct = sizeof (RECORDCORE) + sizeof (COLUMNDATA) * subItem;
  573.    pFieldInfo->pUserData = NULL;
  574.    pFieldInfo->cxWidth = 0L;
  575.    subItem++;
  576.  
  577.    if ((pFieldInfo = pFieldInfo->pNextFieldInfo) == NULL) {
  578.       fieldinsert.cb = sizeof (FIELDINFOINSERT);
  579.       fieldinsert.pFieldInfoOrder = (PFIELDINFO)CMA_FIRST;
  580.       fieldinsert.fInvalidateFieldInfo = TRUE;
  581.       fieldinsert.cFieldInfoInsert = nFields;
  582.       WinSendMsg (WinWindowFromID (m_hWnd, id), CM_INSERTDETAILFIELDINFO, MPFROMP (pTopField), MPFROMP (&fieldinsert));
  583.    }
  584. #elif defined(__NT__)
  585.    lvC.pszText = text;
  586.    if (align == LVC_LEFT)
  587.       lvC.fmt = LVCFMT_LEFT;
  588.    else if (align == LVC_CENTER)
  589.       lvC.fmt = LVCFMT_CENTER;
  590.    else if (align == LVC_RIGHT)
  591.       lvC.fmt = LVCFMT_RIGHT;
  592.    ListView_InsertColumn (GetDlgItem (m_hWnd, id), lvC.iSubItem++, &lvC);
  593. #endif
  594. }
  595.  
  596. VOID CDialog::LVM_DeleteItem (int id, int item)
  597. {
  598. #if defined(__OS2__)
  599.    PRECORDCORE pRecord;
  600.  
  601.    if (item >= 0) {
  602.       if ((pRecord = (PRECORDCORE)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, 0L, MPFROM2SHORT (CMA_FIRST, CMA_ITEMORDER))) != NULL)
  603.          do {
  604.             if (item == 0)
  605.                break;
  606.             item--;
  607.          } while ((pRecord = (PRECORDCORE)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, MPFROMP (pRecord), MPFROM2SHORT (CMA_NEXT, CMA_ITEMORDER))) != NULL);
  608.       if (pRecord != NULL)
  609.          WinSendDlgItemMsg (m_hWnd, id, CM_REMOVERECORD, MPFROMP (&pRecord), MPFROM2SHORT (1, CMA_FREE|CMA_INVALIDATE));
  610.       lv_Selected = -1;
  611.    }
  612. #elif defined(__NT__)
  613.    ListView_DeleteItem (GetDlgItem (m_hWnd, id), item);
  614. #endif
  615. }
  616.  
  617. VOID CDialog::LVM_DeleteAll (int id)
  618. {
  619. #if defined(__OS2__)
  620.    WinSendDlgItemMsg (m_hWnd, id, CM_REMOVERECORD, NULL, MPFROM2SHORT (0, CMA_FREE|CMA_INVALIDATE));
  621.    lv_Selected = -1;
  622. #elif defined(__NT__)
  623.    ListView_DeleteAllItems (GetDlgItem (m_hWnd, id));
  624. #endif
  625. }
  626.  
  627. int CDialog::LVM_QuerySelectedItem (int id)
  628. {
  629. #if defined(__OS2__)
  630.    int RetVal = -1;
  631.    PRECORDCORE pSelected, pRecord;
  632.  
  633.    if ((pSelected = (PRECORDCORE)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORDEMPHASIS, MPFROMSHORT (CMA_FIRST), MPFROMSHORT (CRA_SELECTED))) != NULL) {
  634.       pRecord = (PRECORDCORE)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, 0L, MPFROM2SHORT (CMA_FIRST, CMA_ITEMORDER));
  635.       do {
  636.          RetVal++;
  637.          if (pRecord == pSelected)
  638.             break;
  639.       } while ((pRecord = (PRECORDCORE)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, MPFROMP (pRecord), MPFROM2SHORT (CMA_NEXT, CMA_ITEMORDER))) != NULL);
  640.    }
  641.  
  642.    return (RetVal);
  643. #elif defined(__NT__)
  644.    id = id;
  645.  
  646.    return (lv_Selected);
  647. #endif
  648. }
  649.  
  650. VOID CDialog::LVM_QueryItemText (int id, int item, int column, PSZ text)
  651. {
  652. #if defined(__OS2__)
  653.    LV_PLISTDATA pRecord;
  654.  
  655.    if (item >= 0 && text != NULL) {
  656.       if ((pRecord = (LV_PLISTDATA)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, 0L, MPFROM2SHORT (CMA_FIRST, CMA_ITEMORDER))) != NULL)
  657.          do {
  658.             if (item == 0)
  659.                break;
  660.             item--;
  661.          } while ((pRecord = (LV_PLISTDATA)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, MPFROMP (pRecord), MPFROM2SHORT (CMA_NEXT, CMA_ITEMORDER))) != NULL);
  662.       if (pRecord != NULL) {
  663.          strcpy (text, pRecord->Column[column].Data);
  664.          pRecord->Column[column].pszData = pRecord->Column[column].Data;
  665.       }
  666.    }
  667. #elif defined(__NT__)
  668.    ListView_GetItemText (GetDlgItem (m_hWnd, id), item, column, text, 128);
  669. #endif
  670. }
  671.  
  672. int CDialog::LVM_QueryItemCount (int id)
  673. {
  674. #if defined(__OS2__)
  675.    int RetVal = 0;
  676.    LV_PLISTDATA pRecord;
  677.  
  678.    if ((pRecord = (LV_PLISTDATA)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, 0L, MPFROM2SHORT (CMA_FIRST, CMA_ITEMORDER))) != NULL)
  679.       do {
  680.          RetVal++;
  681.       } while ((pRecord = (LV_PLISTDATA)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, MPFROMP (pRecord), MPFROM2SHORT (CMA_NEXT, CMA_ITEMORDER))) != NULL);
  682.  
  683.    return (RetVal);
  684. #elif defined(__NT__)
  685.    return (ListView_GetItemCount (GetDlgItem (m_hWnd, id)));
  686. #endif
  687. }
  688.  
  689. VOID CDialog::LVM_SetItemText (int id, int item, int column, PSZ text)
  690. {
  691. #if defined(__OS2__)
  692.    LV_PLISTDATA pRecord;
  693.  
  694.    if (item >= 0 && text != NULL) {
  695.       if ((pRecord = (LV_PLISTDATA)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, 0L, MPFROM2SHORT (CMA_FIRST, CMA_ITEMORDER))) != NULL)
  696.          do {
  697.             if (item == 0)
  698.                break;
  699.             item--;
  700.          } while ((pRecord = (LV_PLISTDATA)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, MPFROMP (pRecord), MPFROM2SHORT (CMA_NEXT, CMA_ITEMORDER))) != NULL);
  701.       if (pRecord != NULL) {
  702.          strcpy (pRecord->Column[column].Data, text);
  703.       }
  704.    }
  705. #elif defined(__NT__)
  706.    ListView_SetItemText (GetDlgItem (m_hWnd, id), item, column, text);
  707. #endif
  708. }
  709.  
  710. VOID CDialog::LVM_SelectItem (int id, int item)
  711. {
  712. #if defined(__OS2__)
  713.    int i = item;
  714.    LV_PLISTDATA pRecord;
  715.  
  716.    if (item >= 0) {
  717.       if ((pRecord = (LV_PLISTDATA)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, 0L, MPFROM2SHORT (CMA_FIRST, CMA_ITEMORDER))) != NULL)
  718.          do {
  719.             if (i-- == 0)
  720.                break;
  721.          } while ((pRecord = (LV_PLISTDATA)WinSendDlgItemMsg (m_hWnd, id, CM_QUERYRECORD, MPFROMP (pRecord), MPFROM2SHORT (CMA_NEXT, CMA_ITEMORDER))) != NULL);
  722.       if (pRecord != NULL) {
  723.          WinSendDlgItemMsg (m_hWnd, id, CM_SETRECORDEMPHASIS, MPFROMP (pRecord), MPFROM2SHORT (TRUE, CRA_SELECTED|CRA_CURSORED));
  724.          if (item == 0)
  725.             WinSendDlgItemMsg (m_hWnd, id, WM_CHAR, MPFROM2SHORT (KC_VIRTUALKEY, 0), MPFROM2SHORT (0, VK_UP));
  726.          else if (item == (LVM_QueryItemCount (id) - 1))
  727.             WinSendDlgItemMsg (m_hWnd, id, WM_CHAR, MPFROM2SHORT (KC_VIRTUALKEY, 0), MPFROM2SHORT (0, VK_DOWN));
  728.          else {
  729.             WinSendDlgItemMsg (m_hWnd, id, WM_CHAR, MPFROM2SHORT (KC_VIRTUALKEY, 0), MPFROM2SHORT (0, VK_DOWN));
  730.             WinSendDlgItemMsg (m_hWnd, id, WM_CHAR, MPFROM2SHORT (KC_VIRTUALKEY, 0), MPFROM2SHORT (0, VK_UP));
  731.          }
  732.       }
  733.    }
  734. #elif defined(__NT__)
  735.    ListView_SetItemState (GetDlgItem (m_hWnd, id), item, LVIS_FOCUSED|LVIS_SELECTED, LVIS_FOCUSED|LVIS_SELECTED);
  736.    ListView_EnsureVisible (GetDlgItem (m_hWnd, id), item, FALSE);
  737. #endif
  738. }
  739.  
  740. VOID CDialog::LVM_InsertItem (int id)
  741. {
  742. #if defined(__OS2__)
  743.    RECORDINSERT recordInsert;
  744.  
  745.    if (pRecord != NULL) {
  746.       recordInsert.cb = sizeof (RECORDINSERT);
  747.       recordInsert.pRecordOrder = (PRECORDCORE)CMA_END;
  748.       recordInsert.zOrder = (ULONG)CMA_TOP;
  749.       recordInsert.cRecordsInsert = 1;
  750.       recordInsert.fInvalidateRecord = FALSE;
  751.       recordInsert.pRecordParent = NULL;
  752.       WinSendMsg (WinWindowFromID (m_hWnd, id), CM_INSERTRECORD, MPFROMP (pRecord), MPFROMP (&recordInsert));
  753.    }
  754.  
  755.    if ((pRecord = (LV_PLISTDATA)WinSendMsg (WinWindowFromID (m_hWnd, id), CM_ALLOCRECORD, (MPARAM)(sizeof (COLUMNDATA) * nFields), (MPARAM)1)) != NULL) {
  756.       pRecord->RecordCore.hptrIcon = NULLHANDLE;
  757.       pRecord->RecordCore.pszIcon = "";
  758.    }
  759. #elif defined(__NT__)
  760.    lvI.iItem = LVM_QueryItemCount (id);
  761.    ListView_InsertItem (GetDlgItem (m_hWnd, id), &lvI);
  762. #endif
  763. }
  764.  
  765. VOID CDialog::LVM_SetItemText (int id, int column, PSZ text)
  766. {
  767. #if defined(__OS2__)
  768.    id = id;
  769.    strcpy (pRecord->Column[column].Data, text);
  770.    pRecord->Column[column].pszData = pRecord->Column[column].Data;
  771. #elif defined(__NT__)
  772.    ListView_SetItemText (GetDlgItem (m_hWnd, id), lvI.iItem, column, text);
  773. #endif
  774. }
  775.  
  776. VOID CDialog::LVM_InvalidateView (int id)
  777. {
  778. #if defined(__OS2__)
  779.    RECORDINSERT recordInsert;
  780.  
  781.    if (pRecord != NULL) {
  782.       recordInsert.cb = sizeof (RECORDINSERT);
  783.       recordInsert.pRecordOrder = (PRECORDCORE)CMA_END;
  784.       recordInsert.zOrder = (ULONG)CMA_TOP;
  785.       recordInsert.cRecordsInsert = 1;
  786.       recordInsert.fInvalidateRecord = FALSE;
  787.       recordInsert.pRecordParent = NULL;
  788.       WinSendMsg (WinWindowFromID (m_hWnd, id), CM_INSERTRECORD, MPFROMP (pRecord), MPFROMP (&recordInsert));
  789.  
  790.       pRecord = NULL;
  791.    }
  792.  
  793.    WinSendMsg (WinWindowFromID (m_hWnd, id), CM_INVALIDATEDETAILFIELDINFO, 0L, 0L);
  794. #elif defined(__NT__)
  795.    int i;
  796.  
  797.    for (i = 0; i < lvC.iSubItem; i++)
  798.       ListView_SetColumnWidth (GetDlgItem (m_hWnd, id), i, LVSCW_AUTOSIZE_USEHEADER);
  799.  
  800.    ::ShowWindow (GetDlgItem (m_hWnd, id), SW_SHOW);
  801. #endif
  802. }
  803.  
  804. LONG CDialog::SPBM_QueryValue (int id)
  805. {
  806.    LONG Value;
  807.  
  808. #if defined(__OS2__)
  809.    WinSendDlgItemMsg (m_hWnd, id, SPBM_QUERYVALUE, MPFROMP (&Value), MPFROM2SHORT (0, SPBQ_DONOTUPDATE));
  810. #elif defined(__NT__)
  811.    CHAR Temp[32];
  812.  
  813.    GetDlgItemText (id, Temp, GetDlgItemTextLength (id));
  814.    Value = atol (Temp);
  815. #endif
  816.  
  817.    return (Value);
  818. }
  819.  
  820. VOID CDialog::SPBM_SetCurrentValue (int id, LONG value)
  821. {
  822. #if defined(__OS2__)
  823.    WinSendDlgItemMsg (m_hWnd, id, SPBM_SETCURRENTVALUE, MPFROMLONG (value), 0L);
  824. #elif defined(__NT__)
  825.    CHAR Temp[32];
  826.  
  827.    sprintf (Temp, "%lu", value);
  828.    SetDlgItemText (id, Temp);
  829. #endif
  830. }
  831.  
  832. VOID CDialog::SPBM_SetLimits (int id, LONG highest, LONG lowest)
  833. {
  834. #if defined(__OS2__)
  835.    WinSendDlgItemMsg (m_hWnd, id, SPBM_SETLIMITS, MPFROMLONG (highest), MPFROMLONG (lowest));
  836. #elif defined(__NT__)
  837.    id = id;
  838.    highest = highest;
  839.    lowest = lowest;
  840. #endif
  841. }
  842.  
  843. // ----------------------------------------------------------------------
  844. // Windows message processing
  845. // ----------------------------------------------------------------------
  846.  
  847. VOID CDialog::OnCancel (VOID)
  848. {
  849.    EndDialog (FALSE);
  850. }
  851.  
  852. VOID CDialog::OnHelp (VOID)
  853. {
  854. }
  855.  
  856. USHORT CDialog::OnInitDialog (VOID)
  857. {
  858.    return (TRUE);
  859. }
  860.  
  861. VOID CDialog::OnOK (VOID)
  862. {
  863.    EndDialog (TRUE);
  864. }
  865.  
  866. BEGIN_MESSAGE_MAP(CDialog, CDialog)
  867. END_MESSAGE_MAP()
  868.  
  869.