home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 May / PCWK5A99.ISO / Os2 / WINCARDS.ZIP / SOURCE / wincards.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-02-21  |  51.0 KB  |  1,514 lines

  1. /* wincards.cpp (emx+gcc) */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #define INCL_WIN
  6. #define INCL_GPI
  7. #define LCID_FONT       1
  8. #define ID_BUTTON       1
  9. #define WM_ROLLCARDS WM_USER+1
  10. #define WM_SEARCH    WM_USER+2
  11. #define MLEBUFFER       500
  12.  
  13. #define POINTSIZE_14            140
  14. #define POINTSIZE_12            120
  15. #define POINTSIZE_10            100
  16. #include <os2.h>
  17. #include "cardcpp.h"
  18. #include "WINCARDS.H"
  19. /*                                                              */
  20. /*                                                              */
  21. /* Define Global Variables                                      */
  22. /*                                                              */
  23. /*                                                              */
  24.  
  25. /*      Windows                                                 */
  26.  
  27. MRESULT EXPENTRY ClientWndProc (HWND, ULONG, MPARAM, MPARAM);
  28. MRESULT EXPENTRY IndexWndProc (HWND, ULONG, MPARAM, MPARAM);
  29.  
  30. /*      Dialogs                                                 */
  31.  
  32. MRESULT EXPENTRY SearchDlgProc (HWND, ULONG, MPARAM, MPARAM);
  33. MRESULT EXPENTRY AddDlgProc (HWND, ULONG, MPARAM, MPARAM);
  34. MRESULT EXPENTRY IndexDlgProc (HWND, ULONG, MPARAM, MPARAM);
  35. MRESULT EXPENTRY AboutDlgProc (HWND, ULONG, MPARAM, MPARAM);
  36.  
  37. HAB hab;
  38. QMSG qmsg;
  39. FATTRS fat;
  40. PSWP aSwp;
  41. PHWND phwndIndex;
  42. INT iCharheight, iCharwidth, iCardcount, iTempcount, iCardmove = 0;
  43. const int namesize = 41;
  44. CHAR * pszFilename = NULL;
  45. BOOL bChanged = FALSE;
  46. Linkedlist cardlist, templist;
  47. CHAR szMleBuf[MLEBUFFER];
  48.  
  49. Card newcard;
  50. CHAR blank[40] = {'\0'};
  51.  
  52. void editcard(HWND);
  53.  
  54. /*                                                              */
  55. /*              Begin main procedure                            */
  56. /*                                                              */
  57.  
  58. int main (int argc, CHAR * argv [])
  59. {
  60.     ULONG flFrameFlags;
  61.     static UCHAR  szClientClass[] = "wincards.child",
  62.     szFonttype[] = "System VIO",
  63.     szFilename[] = "Cardfile/2";
  64.     HPS hps;
  65.     HMQ hmq;
  66.     HDC hdc;
  67.     PFONTMETRICS pfm;
  68.     LONG lVertRes, lHorizRes, cMonoFonts, cFonts = 0;
  69.     SHORT sFontsize;
  70.     HWND hwndFrame, hwndClient;
  71.     INT iFontsize;
  72.  
  73.     /*      Perform initialization                                          */
  74.  
  75.     iCardcount = 1;
  76.     cardlist.Linkedlist();
  77.  
  78.     newcard.Wincard(blank, 0, 0);
  79.     cardlist.insertcard(newcard);
  80.  
  81.     hab = WinInitialize (0);
  82.     hmq = WinCreateMsgQueue (hab, 0);
  83.  
  84.     /*      Set up the space for the dynamic variables associated           */
  85.     /*      with the cards and dependent on the number of cards             */
  86.  
  87.     /*      Use C++ versions of functions to initialize dynamic storage --  */
  88.     /*      C versions are:                                                 */
  89.     /*      aSwp = malloc (iCardcount * sizeof(SWP));                       */
  90.     /*      phwndIndex = malloc (iCardcount * sizeof (HWND));               */
  91.  
  92.     if (argc > 1) pszFilename = argv[1];
  93.  
  94.     if (pszFilename != NULL)
  95.     {
  96.         fileopen (pszFilename);
  97.         iCardcount = verify(pszFilename);
  98.         cardlist = readcardfile(iCardcount, pszFilename);
  99.         aSwp = new SWP[iCardcount];
  100.         phwndIndex = new HWND[iCardcount];
  101.     }
  102.     else
  103.     {
  104.         aSwp = new SWP[1];
  105.         phwndIndex = new HWND[1];
  106.     }
  107.     /*                                                                      */
  108.     /*      Register client class                                           */
  109.     /*                                                                      */
  110.  
  111.     WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0L);
  112.  
  113.     /*                                                                      */
  114.     /* Omit FCF_SHELLPOS from flFrameFlags in favor of WinSetWindowPos      */
  115.     /*                                                                      */
  116.  
  117.     flFrameFlags = (    FCF_TITLEBAR      | FCF_SYSMENU |
  118.                         FCF_SIZEBORDER    | FCF_MINMAX   |
  119.                         FCF_MENU          | FCF_ACCELTABLE |
  120.                         FCF_ICON          | FCF_TASKLIST);
  121.  
  122.     /*                                                                      */
  123.     /*                                                                      */
  124.     /*      Create the standard frame window                                */
  125.     /*                                                                      */
  126.  
  127.     hwndFrame = WinCreateStdWindow(     HWND_DESKTOP,
  128.                                         WS_VISIBLE,
  129.                                         &flFrameFlags,
  130.                                         szClientClass,
  131.                                         szFilename,
  132.                                         0L,
  133.                                         NULLHANDLE,
  134.                                         ID_WINCARDS,
  135.                                         &hwndClient
  136.                                 );
  137.  
  138.     /*                                                                      */
  139.     /*      Set the window size and position according to the resolution    */
  140.     /*                                                                      */
  141.  
  142.     lVertRes=lHorizRes=100;
  143.  
  144.     hdc = WinOpenWindowDC(hwndClient);
  145.  
  146.     /*                                                                      */
  147.     /*          Query Device Capabilities                                   */
  148.     /*                                                                      */
  149.  
  150.     DevQueryCaps (hdc, CAPS_HEIGHT, 1L, &lVertRes);
  151.     DevQueryCaps (hdc, CAPS_WIDTH, 1l, &lHorizRes);
  152.  
  153.     /*                                                              */
  154.     /*      Set up to use the System VIO font for use in this       */
  155.     /*      Presentation Space (font has to be fixed pitch for      */
  156.     /*      purposes of simplification of the program and for       */
  157.     /*      imitation of the Windows version)                       */
  158.     /*                                                              */
  159.  
  160.     hps = WinBeginPaint (hwndFrame, NULLHANDLE, NULL);
  161.  
  162.     cMonoFonts = GpiQueryFonts  (
  163.                                         hps,
  164.                                         QF_PUBLIC,
  165.                                         szFonttype,
  166.                                         &cFonts,
  167.                                         0L,
  168.                                         (PFONTMETRICS) NULL
  169.                                 );
  170.  
  171.     /*      Allocate space for the four fonts                       */
  172.     /*      C version of function is:                               */
  173.     /*      pfm = malloc (cMonoFonts*sizeof(FONTMETRICS));          */
  174.  
  175.     pfm = new FONTMETRICS[cMonoFonts];
  176.  
  177.     /*      Load the font information into the pfm variable         */
  178.  
  179.     GpiQueryFonts (hps, QF_PUBLIC, szFonttype,
  180.     &cMonoFonts, sizeof (FONTMETRICS), pfm);
  181.  
  182.     WinEndPaint (hps);
  183.  
  184.     /*      Get a reasonable font size -- 14 point for big screens, */
  185.     /*      less for smaller                                        */
  186.  
  187.     if (lHorizRes >= 1024) sFontsize = POINTSIZE_14;
  188.     else if (lHorizRes >= 800) sFontsize = POINTSIZE_12;
  189.     else sFontsize = POINTSIZE_10;
  190.  
  191.     iFontsize=0;
  192.     while (pfm[iFontsize].sNominalPointSize < sFontsize) iFontsize++;
  193.  
  194.     /*      Set up the font                                         */
  195.  
  196.     fat.usRecordLength = sizeof (fat);
  197.     fat.fsSelection = 0L;
  198.     fat.lMatch = pfm[iFontsize].lMatch;
  199.     iCharheight = pfm[iFontsize].lMaxBaselineExt;
  200.     iCharwidth = pfm[iFontsize].lAveCharWidth;
  201.  
  202.     strcpy (fat.szFacename, (PCHAR) szFonttype);
  203.  
  204.     /*      C version is:                                                   */
  205.     /*      free (pfm);                                                     */
  206.  
  207.     delete (pfm);
  208.  
  209.     WinSetWindowPos (   hwndFrame,
  210.                         NULLHANDLE,
  211.                         (lHorizRes/2) - 1,
  212.                         (4*lVertRes/9) - 1,     /* x-coord, y-coord */
  213.                         lHorizRes/2,
  214.                         5*lVertRes/9,     /* take 5/9 of the screen */
  215.                         SWP_ACTIVATE | SWP_SIZE | SWP_MOVE
  216.                     );
  217.  
  218.     while (WinGetMsg (hab, &qmsg, 0L, 0, 0))
  219.         WinDispatchMsg (hab, &qmsg);
  220.  
  221.     WinDestroyWindow (hwndFrame);
  222.     WinDestroyMsgQueue (hmq);
  223.     WinTerminate (hab);
  224.  
  225.     return 0;
  226. }
  227.  
  228. /*                                                                      */
  229. /*              End main procedure                                      */
  230. /*                                                                      */
  231.  
  232. /*                                                                      */
  233. /*              Begin Client Window procedure                           */
  234. /*                                                                      */
  235.  
  236. MRESULT EXPENTRY ClientWndProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  237. {
  238.     HPS hps;
  239.     static FILEDLG fild;
  240.     static MLE_SEARCHDATA mlesrch;
  241.     static HWND hwndButton[4], hwndMLE, hwndDlg, hwndMain, hwndMenu;
  242.     static RECTL rcl;
  243.     INT i, id, iTextlength, iJump = 8;
  244.     LONG lStartsel, lEndsel, lOffset;
  245.     CHAR szCardindex[namesize], szSearchChar[2];
  246.     char* tempinfo;
  247.  
  248.     static CHAR *szButtonLabel[] = { "<<","<",">",">>"    };
  249.     static UCHAR  szIndexCardClass[] = "Index_value",
  250.                   pszFileopen[10] = "Open File",
  251.                   pszSaveas [8] = "Save As",
  252.                   pszMerge [14] = "File to Merge";
  253.     static CHAR pszFullFile[CCHMAXPATH] = "*.CRD";
  254.  
  255.     /*      For some reason, the FILEDLG variable won't initialize properly using   */
  256.     /*      memset(...) -- the elements have to be set to zero individually.        */
  257.  
  258.     FILEDLG InitializeFiledlgFields();
  259.  
  260.     switch (msg)
  261.     {
  262.     case WM_CREATE:
  263.  
  264.         szMleBuf[0] = '\0';
  265.  
  266.         /*                                                              */
  267.         /*      Create the four hot buttons                             */
  268.         /*                                                              */
  269.  
  270.         for (id = 0; id < 4; id++)
  271.         {
  272.             hwndButton[id] = WinCreateWindow(
  273.                                                 hwnd,
  274.                                                 WC_BUTTON,
  275.                                                 (PUCHAR) szButtonLabel[id],
  276.                                                 WS_VISIBLE | BS_PUSHBUTTON,
  277.                                                 ((id)*rcl.xRight)+ 1,
  278.                                                 2,
  279.                                                 rcl.xRight,
  280.                                                 rcl.yTop/10,
  281.                                                 hwnd,
  282.                                                 HWND_BOTTOM,
  283.                                                 id+1000,
  284.                                                 NULL,
  285.                                                 NULL
  286.                                             );
  287.         }
  288.  
  289.         /*                                                              */
  290.         /*      End hot button creation                                 */
  291.         /*                                                              */
  292.  
  293.         hwndMLE = WinCreateWindow (     hwnd,
  294.                                         WC_MLE,
  295.                                         NULL,
  296.                                         WS_VISIBLE | MLS_BORDER | MLS_WORDWRAP,
  297.                                         0,
  298.                                         0,
  299.                                         0,
  300.                                         0,
  301.                                         hwnd,
  302.                                         HWND_BOTTOM,
  303.                                         5000,
  304.                                         NULL,
  305.                                         NULL
  306.                                   );
  307.  
  308.         WinSendMsg (hwndMLE, MLM_SETBACKCOLOR, CLR_BACKGROUND, NULL);
  309.  
  310.         WinSendMsg (hwndMLE, MLM_SETFONT, (MPARAM) &fat, (MPARAM) 0);
  311.  
  312.         WinSetAccelTable (hab, NULLHANDLE, hwndMLE);
  313.  
  314.         /*                                                              */
  315.         /*      Create the index windows for the actual cards           */
  316.         /*                                                              */
  317.         WinRegisterClass (      hab,
  318.                                 szIndexCardClass,
  319.                                 IndexWndProc,
  320.                                 CS_SIZEREDRAW | CS_SYNCPAINT | CS_CLIPSIBLINGS,
  321.                                 0L
  322.                          );
  323.  
  324.         for (i = 0; i < iCardcount; i++)
  325.             phwndIndex[i] = WinCreateWindow(    hwnd,
  326.                                                 szIndexCardClass,
  327.                                                 NULL,
  328.                                                 WS_VISIBLE,
  329.                                                 0,
  330.                                                 0,
  331.                                                 0,
  332.                                                 0,
  333.                                                 hwnd,
  334.                                                 HWND_BOTTOM,
  335.                                                 i,       /* Set win id to # of card */
  336.                                                 NULL,
  337.                                                 NULL
  338.                                            );
  339.  
  340.         return 0;
  341.  
  342.     case WM_SIZE:
  343.  
  344.         WinEnableWindowUpdate(hwnd, FALSE);
  345.  
  346.         WinQueryWindowRect(hwnd, &rcl);
  347.  
  348.         rcl.xRight/=4;
  349.  
  350.         /*                                                              */
  351.         /*      Create the four hot buttons                             */
  352.         /*                                                              */
  353.  
  354.         for (id = 0; id < 4; id++)
  355.         {
  356.  
  357.             /*                                                              */
  358.             /*      First destroy any old ones left hanging around          */
  359.             /*                                                              */
  360.  
  361.             WinDestroyWindow(hwndButton[id]);
  362.  
  363.             /*                                                              */
  364.             /*      Then create new hot buttons, positioning them in the    */
  365.             /*      frame window as they are made                           */
  366.             /*                                                              */
  367.  
  368.             hwndButton[id] = WinCreateWindow(
  369.                                                 hwnd,
  370.                                                 WC_BUTTON,
  371.                                                 (PUCHAR) szButtonLabel[id],
  372.                                                 WS_VISIBLE | BS_PUSHBUTTON,
  373.                                                 ((id)*rcl.xRight)+ 1,
  374.                                                 2,
  375.                                                 rcl.xRight,
  376.                                                 rcl.yTop/10,
  377.                                                 hwnd,
  378.                                                 HWND_BOTTOM,
  379.                                                 id+1000,
  380.                                                 NULL,
  381.                                                 NULL
  382.                                     );
  383.         }
  384.  
  385.         /*                                                              */
  386.         /*      End hot button creation                                 */
  387.  
  388.         /*      Set the window size and position of the MLE window      */
  389.         /*                                                              */
  390.  
  391.         /*      Set the window position all the way at the back -- the  */
  392.         /*      index value windows will be moved behind it again       */
  393.  
  394.         WinSetWindowPos (       hwndMLE,
  395.                                 HWND_BOTTOM,
  396.                                 rcl.xLeft + 2,
  397.                                 (rcl.yTop/10) + 4,     /* x-coord, y-coord */
  398.                                 int (42.1 * iCharwidth),
  399.                                 int (11.8*iCharheight),
  400.                                 SWP_ACTIVATE | SWP_SIZE | SWP_MOVE);
  401.  
  402.         /*                                                              */
  403.         /*      Set the font to the correct value                       */
  404.         /*                                                              */
  405.  
  406.         WinSendMsg (hwndMLE, MLM_SETFONT, (MPARAM) &fat, (MPARAM) 0);
  407.  
  408.         /*                                                              */
  409.         /*      Set the bottom limit for text so that it doesn't        */
  410.         /*      scroll off the bottom                                   */
  411.         /*                                                              */
  412.  
  413.         WinSendMsg (hwndMLE, MLM_SETFORMATRECT, NULL, (MPARAM) MLFFMTRECT_LIMITVERT);
  414.  
  415.         /*      Place text on the MLE                                   */
  416.  
  417.         WinSendMsg (hwndMLE, MLM_SETIMPORTEXPORT,    MPFROMP (szMleBuf),
  418.         MPFROMSHORT ((USHORT) sizeof (szMleBuf)));
  419.  
  420.         for (id = 0; id < ((cardlist.showcard(0).shownumcardchars())-1) && (id < 440); id++)
  421.             szMleBuf[id] = (cardlist.showcard(0).showcardinfo())[id];
  422.  
  423.         WinSendMsg (hwndMLE, MLM_DISABLEREFRESH, NULL, NULL);
  424.  
  425.         /*      Clear the current contents of the MLE                   */
  426.  
  427.         iTextlength = (IPT) WinSendMsg (hwndMLE, MLM_QUERYTEXTLENGTH, NULL, NULL);
  428.  
  429.         WinSendMsg (hwndMLE, MLM_DELETE, 0, (MPARAM) iTextlength);
  430.  
  431.         bChanged = FALSE;
  432.  
  433.         lOffset = 0;
  434.  
  435.         WinSendMsg (hwndMLE, MLM_IMPORT, MPFROMP (&lOffset),
  436.         MPFROMSHORT ((USHORT) id));
  437.  
  438.         bChanged = FALSE;
  439.  
  440.         WinSendMsg (hwndMLE, MLM_ENABLEREFRESH, NULL, NULL);
  441.  
  442.         /*      Set the focus to the MLE                                */
  443.  
  444.         WinSetFocus (HWND_DESKTOP, hwndMLE);
  445.  
  446.         /*                                                              */
  447.         /*      Now draw the window:                                    */
  448.         /*      First set the window size and position, using the       */
  449.         /*      size of the font and the size of the client window      */
  450.         /*      to set the window size and position                     */
  451.         /*                                                              */
  452.  
  453.         aSwp[0].hwndInsertBehind = hwndMLE;
  454.  
  455.         for (id = 0; id < iCardcount; id++)
  456.         {
  457.             if (id > 0) aSwp[id].hwndInsertBehind = phwndIndex[id - 1];
  458.             aSwp[id].hwnd = phwndIndex[id];
  459.             aSwp[id].fl = (SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_ACTIVATE);
  460.             aSwp[id].cx = 42 * iCharwidth;
  461.             aSwp[id].cy = 13 * iCharheight;
  462.             aSwp[id].x = ((id * 2) * iCharwidth) + 2;
  463.             aSwp[id].y = (id * (iCharheight +3)) + (rcl.yTop/10) + 4;
  464.         }
  465.  
  466.         /*      n.b. hab is global                                               */
  467.  
  468.         WinSetMultWindowPos (hab, aSwp, iCardcount);
  469.  
  470.         WinEnableWindowUpdate (hwnd, TRUE);
  471.  
  472.         break;
  473.         return 0;
  474.  
  475.     case WM_ROLLCARDS:
  476.  
  477.         if (bChanged) editcard(hwndMLE);
  478.  
  479.         cardlist.movecard(iCardmove);
  480.  
  481.         strcpy(szMleBuf, (cardlist.showcard(0).showcardinfo()));
  482.  
  483.         /*      MLM_DISABLEREFRESH doesn't work!  Have to use WinEnableWindowUpdate   */
  484.  
  485.         WinEnableWindowUpdate (hwndMLE, FALSE);
  486.  
  487.         /*      Clear the current contents of the MLE                   */
  488.  
  489.         iTextlength = (IPT) WinSendMsg (hwndMLE, MLM_QUERYTEXTLENGTH, NULL, NULL);
  490.  
  491.         bChanged = FALSE;
  492.  
  493.         WinSendMsg (hwndMLE, MLM_DELETE, 0, (MPARAM) iTextlength);
  494.  
  495.         bChanged = FALSE;
  496.  
  497.         lOffset = 0;
  498.  
  499.         /*      Import new text                                         */
  500.  
  501.         id = ((cardlist.showcard(0).shownumcardchars())-1);
  502.         if (id < 0) id = 0;
  503.  
  504.         WinSendMsg (hwndMLE, MLM_IMPORT, MPFROMP (&lOffset),
  505.         MPFROMSHORT ((USHORT) id));
  506.  
  507.         WinShowWindow (hwndMLE, TRUE);
  508.  
  509.         bChanged = FALSE;
  510.  
  511.         /*      Set the focus to the MLE                                */
  512.  
  513.         WinSetFocus (HWND_DESKTOP, hwndMLE);
  514.  
  515.         /*      Update the index listings                               */
  516.  
  517.         for (id = 0; id < iCardcount; id++) WinInvalidateRect (phwndIndex[id], NULL, FALSE);
  518.  
  519.         return 0;
  520.  
  521.     case WM_CHAR:
  522.  
  523.         if (SHORT1FROMMP(mp1) &KC_KEYUP) return 0;
  524.  
  525.         szSearchChar[1] = '\0';
  526.         szSearchChar[0] = (CHAR) SHORT1FROMMP(mp2);
  527.  
  528.         if ((SHORT1FROMMP(mp1) &KC_SHIFT) && (SHORT1FROMMP(mp1) &KC_CTRL)
  529.                 && isalpha(szSearchChar[0]))
  530.         {
  531.             id = 0;
  532.             iCardmove = 0;
  533.  
  534.             if (cardlist.showcard(1) == szSearchChar) cardlist.movecard(1);
  535.             else
  536.             {
  537.                 do
  538.                 {
  539.                     cardlist.movecard(1);
  540.                     id++;
  541.                 }
  542.                 while (!(cardlist.showcard(0) == szSearchChar) && id < iCardcount);
  543.             }
  544.             WinSendMsg(hwnd, WM_ROLLCARDS, NULL, NULL);
  545.         }
  546.  
  547.         return 0;
  548.  
  549.     case WM_PAINT:
  550.  
  551.         hps = WinBeginPaint (hwnd, NULLHANDLE, NULL);
  552.  
  553.         GpiErase (hps);
  554.  
  555.         WinEndPaint (hps);
  556.  
  557.         return 0;
  558.  
  559.         /*      Process messages from the MLE window                    */
  560.  
  561.     case WM_CONTROL:
  562.  
  563.         switch (SHORT2FROMMP (mp1))
  564.         {
  565.         case MLN_OVERFLOW:
  566.  
  567.             DosBeep(880,100);
  568.             DosBeep(330,100);
  569.  
  570.             WinMessageBox(HWND_DESKTOP, hwnd, (const PUCHAR) "Too much text!", NULL, 0, MB_OK | MB_ICONEXCLAMATION);
  571.  
  572.             break;
  573.  
  574.         case MLN_PIXHORZOVERFLOW:
  575.         case MLN_HSCROLL:
  576.  
  577.             DosBeep(660,100);
  578.             DosBeep(880,100);
  579.             WinSendMsg(hwndMLE, MLM_UNDO, NULL, NULL);
  580.  
  581.             break;
  582.  
  583.         case MLN_CHANGE:
  584.  
  585.             /*      If the MLM text has changed, prepare to change the associated card      */
  586.             bChanged = TRUE;
  587.             break;
  588.         }
  589.         return 0;
  590.  
  591.     case WM_COMMAND:
  592.  
  593.         /*      This section handles the messages sent by the button    */
  594.         /*      windows --  the card number is increased or decremented */
  595.  
  596.         switch (COMMANDMSG(&msg)->cmd)
  597.         {
  598.  
  599.         case 1000:
  600.  
  601.             iCardmove = (-iJump);
  602.             WinSendMsg (hwnd, WM_ROLLCARDS, NULL, NULL);
  603.  
  604.             break;
  605.  
  606.         case 1001:
  607.  
  608.             iCardmove = (-1);
  609.             WinSendMsg (hwnd, WM_ROLLCARDS, NULL, NULL);
  610.  
  611.             break;
  612.  
  613.         case 1002:
  614.  
  615.             iCardmove = 1;
  616.             WinSendMsg (hwnd, WM_ROLLCARDS, NULL, NULL);
  617.  
  618.             break;
  619.  
  620.         case 1003:
  621.  
  622.             iCardmove = iJump;
  623.             WinSendMsg (hwnd, WM_ROLLCARDS, NULL, NULL);
  624.  
  625.             break;
  626.  
  627.             /*      Code to override the default cut/paste accelerator table        */
  628.  
  629.         case SRCH_C:
  630.  
  631.             szSearchChar[1] = '\0';
  632.             szSearchChar[0] = 'c';
  633.             id = 0;
  634.             iCardmove = 0;
  635.  
  636.             if (cardlist.showcard(1) == szSearchChar) cardlist.movecard(1);
  637.             else
  638.             {
  639.                 do
  640.                 {
  641.                     cardlist.movecard(1);
  642.                     id++;
  643.                 }
  644.                 while (!(cardlist.showcard(0) == szSearchChar) && id < iCardcount);
  645.             }
  646.  
  647.             WinSendMsg(hwnd, WM_ROLLCARDS, NULL, NULL);
  648.  
  649.             break;
  650.  
  651.         case SRCH_V:
  652.  
  653.             szSearchChar[1] = '\0';
  654.             szSearchChar[0] = 'v';
  655.             id = 0;
  656.             iCardmove = 0;
  657.  
  658.             if (cardlist.showcard(1) == szSearchChar) cardlist.movecard(1);
  659.             else
  660.             {
  661.                 do
  662.                 {
  663.                     cardlist.movecard(1);
  664.                     id++;
  665.                 }
  666.                 while (!(cardlist.showcard(0) == szSearchChar) && id < iCardcount);
  667.             }
  668.  
  669.             WinSendMsg(hwnd, WM_ROLLCARDS, NULL, NULL);
  670.  
  671.             break;
  672.  
  673.         case SRCH_X:
  674.  
  675.             szSearchChar[1] = '\0';
  676.             szSearchChar[0] = 'x';
  677.             id = 0;
  678.             iCardmove = 0;
  679.  
  680.             if (cardlist.showcard(1) == szSearchChar) cardlist.movecard(1);
  681.             else
  682.             {
  683.                 do
  684.                 {
  685.                     cardlist.movecard(1);
  686.                     id++;
  687.                 }
  688.                 while (!(cardlist.showcard(0) == szSearchChar) && id < iCardcount);
  689.             }
  690.  
  691.             WinSendMsg(hwnd, WM_ROLLCARDS, NULL, NULL);
  692.  
  693.             break;
  694.  
  695.             return (MRESULT) 0;
  696.         }
  697.  
  698.     case WM_INITMENU:
  699.         hwndMain = WinQueryWindow (hwnd, QW_PARENT);
  700.         hwndMenu = WinWindowFromID (WinQueryWindow (hwnd, QW_PARENT), FID_MENU);
  701.  
  702.         switch (SHORT1FROMMP (mp1))
  703.         {
  704.         case IDM_EDIT:
  705.  
  706.             /*      First check to see if text is selected; WinSendMsg must */
  707.             /*      be cast to LONG to prevent compiler warnings            */
  708.  
  709.             lStartsel = (LONG) WinSendMsg ( hwndMLE,
  710.             MLM_QUERYSEL,
  711.             (MPARAM) MLFQS_MINSEL,
  712.             0L );
  713.             lEndsel = (LONG) WinSendMsg (   hwndMLE,
  714.             MLM_QUERYSEL,
  715.             (MPARAM) MLFQS_MAXSEL,
  716.             0L );
  717.  
  718.             /*      If text is selected, enable copy and cut menu options   */
  719.  
  720.             if (lEndsel - lStartsel > 0L)
  721.             {
  722.                 WinSendMsg (    hwndMenu,
  723.                                 MM_SETITEMATTR,
  724.                                 MPFROM2SHORT (IDM_COPY, TRUE),
  725.                                 MPFROM2SHORT (MIA_DISABLED, 0));
  726.  
  727.                 WinSendMsg (    hwndMenu,
  728.                                 MM_SETITEMATTR,
  729.                                 MPFROM2SHORT (IDM_CUT, TRUE),
  730.                                 MPFROM2SHORT (MIA_DISABLED, 0));
  731.             }
  732.  
  733.             /*      Otherwise disable copy and cut                          */
  734.  
  735.             else
  736.             {
  737.                 WinSendMsg (    hwndMenu,
  738.                                 MM_SETITEMATTR,
  739.                                 MPFROM2SHORT (IDM_COPY, TRUE),
  740.                                 MPFROM2SHORT (MIA_DISABLED, MIA_DISABLED));
  741.  
  742.                 WinSendMsg (    hwndMenu,
  743.                                 MM_SETITEMATTR,
  744.                                 MPFROM2SHORT (IDM_CUT, TRUE),
  745.                                 MPFROM2SHORT (MIA_DISABLED, MIA_DISABLED));
  746.             }
  747.             return (MRESULT)0;
  748.             break;
  749.         }
  750.  
  751.         switch (SHORT1FROMMP (mp1))
  752.         {
  753.         case IDM_COPY:
  754.  
  755.             /*      Copy text from the MLE                                  */
  756.  
  757.             WinSendMsg (hwndMLE, MLM_COPY, 0L, 0L);
  758.  
  759.             return 0;
  760.  
  761.             /*      Cut text from the MLE                                   */
  762.  
  763.         case IDM_CUT:
  764.  
  765.             WinSendMsg (hwndMLE, MLM_CUT, 0L, 0L);
  766.             bChanged = TRUE;
  767.  
  768.             return 0;
  769.  
  770.             /*      Paste text into the MLE                                 */
  771.  
  772.         case IDM_PASTE:
  773.  
  774.             WinSendMsg (hwndMLE, MLM_PASTE, 0L, 0L);
  775.             bChanged = TRUE;
  776.  
  777.             return 0;
  778.  
  779.             /*      Edit the card title                                     */
  780.  
  781.         case IDM_INDEX:
  782.  
  783.             if (bChanged) editcard (hwndMLE);
  784.             bChanged = FALSE;
  785.  
  786.             WinDlgBox (HWND_DESKTOP, hwnd, IndexDlgProc, NULLHANDLE, IDD_INDEX, NULL);
  787.             WinSendMsg (hwnd, WM_ROLLCARDS, NULL, NULL);
  788.  
  789.             return 0;
  790.  
  791.             /*      Add a card                                              */
  792.  
  793.         case IDM_ADD:
  794.  
  795.             if (bChanged) editcard(hwndMLE);
  796.  
  797.             /*      Once old card has been edited new card does not need changes    */
  798.  
  799.             bChanged = FALSE;
  800.  
  801.             WinDlgBox (HWND_DESKTOP, hwnd, AddDlgProc, NULLHANDLE, IDD_ADD, NULL);
  802.  
  803.             /*      If a card was added, bChanged = TRUE -- delete old      */
  804.             /*      cards and redraw entire window                          */
  805.  
  806.             if (bChanged)
  807.             {
  808.                 for (i = 0; i < iCardcount; i++) WinDestroyWindow(phwndIndex[i]);
  809.  
  810.                 delete [] aSwp;
  811.                 delete [] phwndIndex;
  812.  
  813.                 iCardcount = iCardcount + 1;
  814.  
  815.                 aSwp = new SWP[iCardcount];
  816.                 phwndIndex = new HWND[iCardcount];
  817.  
  818.                 for (i = 0; i < iCardcount; i++)
  819.                     phwndIndex[i] = WinCreateWindow( hwnd,
  820.                                                      szIndexCardClass,
  821.                                                      NULL,
  822.                                                      WS_VISIBLE,
  823.                                                      0, 0, 0, 0,
  824.                                                      hwnd,
  825.                                                      HWND_BOTTOM,
  826.                                                      i,       /* Set win id to # of card */
  827.                                                      NULL,
  828.                                                      NULL
  829.                                                    );
  830.  
  831.                 bChanged = FALSE;
  832.  
  833.                 WinSendMsg (hwnd, WM_SIZE, NULL, NULL);
  834.             }
  835.             return 0;
  836.  
  837.             /*      Delete a card                                           */
  838.  
  839.         case IDM_DELETE:
  840.  
  841.             /*      Should have a message pop up here                       */
  842.  
  843.             iCardmove = 0;
  844.  
  845.             /*      Update the number of cards -- destroy old ones, create new      */
  846.  
  847.             for (i = 0; i < iCardcount; i++) WinDestroyWindow(phwndIndex[i]);
  848.  
  849.             /*      If the last card was deleted then start a new file --   */
  850.             /*      Explicitly destroy old list, start with a blank card    */
  851.  
  852.             if (!cardlist.delcard())
  853.             {
  854.                 iCardcount = 1;
  855.                 cardlist.~Linkedlist();
  856.                 newcard.Wincard(blank, 0, 0);
  857.                 cardlist.insertcard(newcard);
  858.             }
  859.             else iCardcount = iCardcount - 1;
  860.  
  861.             for (i = 0; i < iCardcount; i++)
  862.                 phwndIndex[i] = WinCreateWindow( hwnd,
  863.                                                  szIndexCardClass,
  864.                                                  NULL,
  865.                                                  WS_VISIBLE,
  866.                                                  0, 0, 0, 0,
  867.                                                  hwnd,
  868.                                                  HWND_BOTTOM,
  869.                                                  i,
  870.                                                  NULL,
  871.                                                  NULL
  872.                 );
  873.  
  874.             /*      Use WM_SIZE to update the number of card windows        */
  875.  
  876.             WinSendMsg (hwnd, WM_SIZE, NULL, NULL);
  877.  
  878.             return 0;
  879.  
  880.             /*      Duplicate a card                                        */
  881.  
  882.         case IDM_DUP:
  883.  
  884.             if (bChanged) editcard (hwndMLE);
  885.  
  886.             id = 0;
  887.  
  888.             /*      Get the information on the card and read it into variables      */
  889.  
  890.             strcpy(szCardindex,(cardlist.showcard(0)).showindexinfo());
  891.             id = (INT) (cardlist.showcard(0)).shownumcardchars();
  892.             tempinfo = new char [id];
  893.             strcpy(tempinfo, (cardlist.showcard(0)).showcardinfo());
  894.  
  895.             /*      Use the information to create a duplicate card and insert it    */
  896.  
  897.             newcard.Wincard(szCardindex, id, tempinfo);
  898.             cardlist.insertcard(newcard);
  899.             delete [] tempinfo;
  900.  
  901.             /*      Destroy old cards, update the number of cards in the list,      */
  902.             /*      and redraw                                                      */
  903.  
  904.             for (i = 0; i < iCardcount; i++) WinDestroyWindow(phwndIndex[i]);
  905.  
  906.             delete [] aSwp;
  907.             delete [] phwndIndex;
  908.  
  909.             iCardcount = iCardcount + 1;
  910.  
  911.             aSwp = new SWP[iCardcount];
  912.             phwndIndex = new HWND[iCardcount];
  913.  
  914.             for (i = 0; i < iCardcount; i++)
  915.                 phwndIndex[i] = WinCreateWindow(hwnd,
  916.                                                 szIndexCardClass,
  917.                                                 NULL,
  918.                                                 WS_VISIBLE,
  919.                                                 0,
  920.                                                 0,
  921.                                                 0,
  922.                                                 0,
  923.                                                 hwnd,
  924.                                                 HWND_BOTTOM,
  925.                                                 i,
  926.                                                 NULL,
  927.                                                 NULL
  928.                                                );
  929.  
  930.             bChanged = FALSE;
  931.             iCardmove = 0;
  932.  
  933.             /*      Use WM_SIZE to recreate the list with the correct number of cards       */
  934.  
  935.             WinSendMsg (hwnd, WM_SIZE, NULL, NULL);
  936.  
  937.             return 0;
  938.  
  939.         case IDM_FIND:
  940.  
  941.             if (WinDlgBox(HWND_DESKTOP, hwnd, SearchDlgProc, NULLHANDLE, IDD_SEARCH, &mlesrch))
  942.             {
  943.                 iCardmove = 1;
  944.                 i = 0;
  945.  
  946.                 WinEnableWindowUpdate(hwndMLE, FALSE);
  947.  
  948.                 while (i < iCardcount)
  949.                 {
  950.                     i++;
  951.                     cardlist.movecard(iCardmove);
  952.  
  953.                     strcpy(szMleBuf, (cardlist.showcard(0).showcardinfo()));
  954.  
  955.                     iTextlength = (IPT) WinSendMsg (hwndMLE, MLM_QUERYTEXTLENGTH, NULL, NULL);
  956.                     WinSendMsg (hwndMLE, MLM_DELETE, 0, (MPARAM) iTextlength);
  957.  
  958.                     bChanged = FALSE;
  959.  
  960.                     lOffset = 0;
  961.                     id = ((cardlist.showcard(0).shownumcardchars())-1);
  962.                     if (id < 0) id = 0;
  963.  
  964.                     WinSendMsg (hwndMLE, MLM_IMPORT, MPFROMP (&lOffset), MPFROMSHORT ((USHORT) id));
  965.  
  966.                     bChanged = FALSE;
  967.  
  968.                     WinSendMsg (hwndMLE, MLM_SEARCH, MPFROMLONG(MLFSEARCH_SELECTMATCH), MPFROMP(&mlesrch));
  969.  
  970.                     WinSetFocus (HWND_DESKTOP, hwndMLE);
  971.  
  972.                     /*      End loop if a match is found                                            */
  973.  
  974.                     lStartsel = (LONG) WinSendMsg ( hwndMLE, MLM_QUERYSEL, (MPARAM) MLFQS_MINSEL, 0L );
  975.                     lEndsel = (LONG) WinSendMsg (   hwndMLE, MLM_QUERYSEL, (MPARAM) MLFQS_MAXSEL, 0L );
  976.  
  977.                     /*      If text is selected, a match has been found -- end loop                 */
  978.  
  979.                     if (lEndsel - lStartsel > 0L)
  980.                     {
  981.                         i = iCardcount;
  982.                         for (id = 0; id < iCardcount; id++) WinInvalidateRect (phwndIndex[id], NULL, FALSE);
  983.                     }
  984.                 }
  985.  
  986.                 WinShowWindow(hwndMLE, TRUE);
  987.                 bChanged = FALSE;
  988.             }
  989.             return 0;
  990.  
  991.         case IDM_EXIT:
  992.  
  993.             /*      Quit and end program                                            */
  994.             /*      Free the memory set aside for the cards and the position info   */
  995.             /*      Use C++ functions to delete dynamically allocated memory --     */
  996.             /*      C versions are: free (aSwp); free (phwndIndex);                 */
  997.  
  998.             delete [] aSwp;
  999.             delete [] phwndIndex;
  1000.             WinSendMsg (hwnd, WM_CLOSE, NULL, NULL);
  1001.             return (MRESULT)0;
  1002.  
  1003.         case IDM_NEW:
  1004.  
  1005.             /*                                                      */
  1006.             /*      Nuke all windows and start over                 */
  1007.             /*                                                      */
  1008.             delete [] aSwp;
  1009.             for (id = 0; id < 4; id++) WinDestroyWindow(hwndButton[id]);
  1010.             for (id = 0; id < iCardcount; id++) WinDestroyWindow(phwndIndex[id]);
  1011.             delete [] phwndIndex;
  1012.             WinDestroyWindow(hwndMLE);
  1013.             iCardcount = 1;
  1014.             pszFilename = NULL;
  1015.             /*      Explicit use of destructor here for old list -- a temporary     */
  1016.             /*      variable could be used instead to reinitialize the list with    */
  1017.             /*      the assignment operator                                         */
  1018.  
  1019.             cardlist.~Linkedlist();
  1020.  
  1021.             /*      Start the new list with a blank card again              */
  1022.  
  1023.             newcard.Wincard(blank, 0, 0);
  1024.             cardlist.insertcard(newcard);
  1025.             aSwp = new SWP[iCardcount];
  1026.             phwndIndex = new HWND[iCardcount];
  1027.  
  1028.             /*      C versions of functions are:                            */
  1029.             /*      aSwp = malloc (iCardcount * sizeof(SWP));               */
  1030.             /*      phwndIndex = malloc (iCardcount * sizeof (HWND));       */
  1031.  
  1032.             WinSendMsg (hwnd, WM_CREATE, NULL, NULL);
  1033.             WinSendMsg (hwnd, WM_SIZE, NULL, NULL);
  1034.  
  1035.             return (MRESULT)0;
  1036.  
  1037.         case IDM_OPEN:
  1038.  
  1039.             /*                                                      */
  1040.             /*      Initialize file dialog box for Open File        */
  1041.             /*                                                      */
  1042.  
  1043.             fild = InitializeFiledlgFields();
  1044.             fild.x = 0;
  1045.             fild.y = 0;
  1046.             fild.fl = FDS_CENTER | FDS_OPEN_DIALOG;
  1047.             fild.pszTitle = pszFileopen;
  1048.  
  1049.             strcpy (fild.szFullFile, pszFullFile);
  1050.  
  1051.             hwndDlg = WinFileDlg (HWND_DESKTOP, hwnd, &fild);
  1052.             if (hwndDlg && (fild.lReturn == DID_OK))
  1053.             {
  1054.                 for (id = 0; id < 4; id++) WinDestroyWindow(hwndButton[id]);
  1055.                 for (id = 0; id < iCardcount; id++) WinDestroyWindow(phwndIndex[id]);
  1056.                 WinDestroyWindow(hwndMLE);
  1057.                 delete [] aSwp;
  1058.                 delete [] phwndIndex;
  1059.                 pszFilename = fild.szFullFile;
  1060.                 fileopen (pszFilename);
  1061.                 iCardcount = verify(pszFilename);
  1062.  
  1063.                 /*      Explicit use of destructor to get rid of old list                       */
  1064.  
  1065.                 cardlist.~Linkedlist();
  1066.  
  1067.                 cardlist = readcardfile(iCardcount, pszFilename);
  1068.                 aSwp = new SWP[iCardcount];
  1069.                 phwndIndex = new HWND[iCardcount];
  1070.             }
  1071.             else return (MRESULT)0;
  1072.  
  1073.             WinFreeFileDlgList(fild.papszFQFilename);
  1074.  
  1075.             WinSendMsg (hwnd, WM_CREATE, NULL, NULL);
  1076.             WinSendMsg (hwnd, WM_SIZE, NULL, NULL);
  1077.  
  1078.             return (MRESULT)0;
  1079.  
  1080.         case IDM_SAVE:
  1081.  
  1082.             if (bChanged) editcard (hwndMLE);
  1083.  
  1084.             if (pszFilename == NULL) WinSendMsg (hwnd, IDM_SAVEAS, NULL, NULL);
  1085.             else
  1086.                 writecardfile (cardlist, iCardcount, pszFilename);
  1087.  
  1088.             return (MRESULT)0;
  1089.  
  1090.         case IDM_SAVEAS:
  1091.  
  1092.             /*                                                      */
  1093.             /*      Initialize file dialog box for Save As          */
  1094.             /*                                                      */
  1095.  
  1096.             fild = InitializeFiledlgFields();
  1097.             fild.x = 0;
  1098.             fild.y = 0;
  1099.             fild.fl = FDS_CENTER | FDS_SAVEAS_DIALOG;
  1100.             fild.pszTitle = pszSaveas;
  1101.  
  1102.             strcpy (fild.szFullFile, pszFullFile);
  1103.  
  1104.             hwndDlg = WinFileDlg (HWND_DESKTOP, hwnd, &fild);
  1105.             if (hwndDlg && (fild.lReturn == DID_OK))
  1106.             {
  1107.                 if (bChanged) editcard (hwndMLE);
  1108.  
  1109.                 pszFilename = fild.szFullFile;
  1110.                 if (! (pszFilename == NULL))
  1111.                     writecardfile (cardlist, iCardcount, pszFilename);
  1112.  
  1113.                 /* Handle condition */
  1114.  
  1115.             }
  1116.  
  1117.             WinFreeFileDlgList(fild.papszFQFilename);
  1118.  
  1119.             return (MRESULT)0;
  1120.  
  1121.         case IDM_MERGE:
  1122.  
  1123.             /*                                                      */
  1124.             /*      Initialize file dialog box for merge            */
  1125.             /*                                                      */
  1126.  
  1127.             fild = InitializeFiledlgFields();
  1128.             fild.fl = FDS_OPEN_DIALOG;
  1129.             fild.pszTitle = pszMerge;
  1130.             fild.x = 2 * rcl.xRight;
  1131.             fild.y = rcl.yTop/2;
  1132.  
  1133.             strcpy (fild.szFullFile, pszFullFile);
  1134.  
  1135.             hwndDlg = WinFileDlg (HWND_DESKTOP, hwnd, &fild);
  1136.             if (hwndDlg && (fild.lReturn == DID_OK))
  1137.             {
  1138.  
  1139.                 /*      Read in the info for the file to be merged                      */
  1140.  
  1141.                 iTempcount = verify(fild.szFullFile);
  1142.                 templist = readcardfile(iTempcount, fild.szFullFile);
  1143.  
  1144.                 /*      Do the merge                                                    */
  1145.  
  1146.                 for (i = 0; (i < iTempcount) ; i++) cardlist.insertcard(templist.showcard(i));
  1147.  
  1148.                 /*      Do cleanup                                                      */
  1149.  
  1150.                 templist.~Linkedlist();
  1151.                 for (id = 0; id < 4; id++) WinDestroyWindow(hwndButton[id]);
  1152.                 for (id = 0; id < iCardcount; id++) WinDestroyWindow(phwndIndex[id]);
  1153.                 WinDestroyWindow(hwndMLE);
  1154.                 delete [] aSwp;
  1155.                 delete [] phwndIndex;
  1156.  
  1157.                 /*      Create the windows for the merged file                          */
  1158.  
  1159.                 iCardcount = iCardcount + iTempcount;
  1160.                 aSwp = new SWP[iCardcount];
  1161.                 phwndIndex = new HWND[iCardcount];
  1162.  
  1163.                 WinSendMsg (hwnd, WM_CREATE, NULL, NULL);
  1164.                 WinSendMsg (hwnd, WM_SIZE, NULL, NULL);
  1165.             }
  1166.  
  1167.             /*      Otherwise do nothing and return                                 */
  1168.  
  1169.             else return (MRESULT)0;
  1170.  
  1171.             WinFreeFileDlgList(fild.papszFQFilename);
  1172.  
  1173.             return (MRESULT)0;
  1174.  
  1175.         case IDM_ABOUT:
  1176.  
  1177.             WinDlgBox (HWND_DESKTOP, hwnd, AboutDlgProc, NULLHANDLE, IDD_ABOUT, NULL);
  1178.             return 0;
  1179.  
  1180.             return (MRESULT)0;
  1181.         }
  1182.         break;
  1183.  
  1184.     }
  1185.  
  1186.     return WinDefWindowProc (hwnd, msg, mp1, mp2);
  1187. }
  1188.  
  1189. /*                                                              */
  1190. /*      Procedure to create the index card window               */
  1191. /*                                                              */
  1192.  
  1193. MRESULT EXPENTRY IndexWndProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  1194. {
  1195.     HPS hps;
  1196.     static HWND hwndParent;
  1197.     RECTL rclIndex;
  1198.     POINTL ptl;
  1199.     static INT iThiscard;
  1200.     INT iIndex;
  1201.     CHAR szBuffer[40];
  1202.  
  1203.     iThiscard = WinQueryWindowUShort(hwnd, QWS_ID);
  1204.     hwndParent = WinQueryWindow (hwnd, QW_PARENT);
  1205.  
  1206.     switch (msg)
  1207.     {
  1208.     case WM_PAINT:
  1209.  
  1210.         /*                                                              */
  1211.         /*      Get the current size of the Client window               */
  1212.         /*                                                              */
  1213.  
  1214.         szBuffer[0] = '\0';
  1215.  
  1216.         hps=WinBeginPaint (hwnd, NULLHANDLE, NULL);
  1217.  
  1218.         GpiCreateLogFont (hps, NULL, LCID_FONT, &fat);
  1219.         GpiSetCharSet (hps, LCID_FONT);
  1220.  
  1221.         /*                                                              */
  1222.         /*      Draw a frame around the window                          */
  1223.         /*                                                              */
  1224.  
  1225.         WinQueryWindowRect (hwnd,&rclIndex);
  1226.         WinDrawBorder (hps, &rclIndex, 1, 1, CLR_NEUTRAL, CLR_BACKGROUND,
  1227.         DB_STANDARD | DB_INTERIOR) ;
  1228.  
  1229.         /*                                                              */
  1230.         /*      Put in a line to set the text on                        */
  1231.         /*                                                              */
  1232.  
  1233.         ptl.x = rclIndex.xLeft;
  1234.         ptl.y = rclIndex.yTop - (int (iCharheight*1.1));
  1235.         GpiMove (hps, &ptl);
  1236.         ptl.x = rclIndex.xRight;
  1237.         GpiLine (hps, &ptl);
  1238.  
  1239.         /*      Now place the text on the window                        */
  1240.  
  1241.         ptl.x = rclIndex.xLeft + 5;
  1242.         ptl.y = rclIndex.yTop - (int (iCharheight * .85));
  1243.  
  1244.         strcpy(szBuffer, (cardlist.showcard(iThiscard)).showindexinfo());
  1245.         iIndex = strlen(szBuffer);
  1246.  
  1247.         GpiCharStringAt (hps, &ptl, iIndex, (PUCHAR) szBuffer);
  1248.  
  1249.         /*      Reset to default font to avoid problems                 */
  1250.  
  1251.         GpiSetCharSet (hps, LCID_DEFAULT);
  1252.         GpiDeleteSetId (hps, LCID_FONT);
  1253.  
  1254.         WinEndPaint (hps);
  1255.  
  1256.         return (MRESULT)0;
  1257.  
  1258.         /*                                                              */
  1259.         /*      Process mouse click on the window                       */
  1260.         /*                                                              */
  1261.  
  1262.     case WM_BUTTON1DOWN:
  1263.     case WM_BUTTON1DBLCLK:
  1264.  
  1265.         iCardmove = iThiscard;
  1266.         WinSendMsg (hwndParent, WM_ROLLCARDS, NULL, NULL);
  1267.  
  1268.         return 0;
  1269.     }
  1270.     return WinDefWindowProc (hwnd, msg, mp1, mp2);
  1271. }
  1272.  
  1273. /*      Begin dialogs section                                   */
  1274.  
  1275. MRESULT EXPENTRY SearchDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  1276. {
  1277.     static CHAR szSearchfield[41];
  1278.     static MLE_SEARCHDATA mlesrchTemp;
  1279.     static PMLE_SEARCHDATA pmlesrchTemp;
  1280.  
  1281.     switch (msg)
  1282.     {
  1283.     case WM_INITDLG:
  1284.  
  1285.         pmlesrchTemp = PMLE_SEARCHDATA (PVOIDFROMMP (mp2));
  1286.  
  1287.         /*      Set the maximum number of characters to 40              */
  1288.  
  1289.         WinSendDlgItemMsg (hwnd, IDD_SEARCH, EM_SETTEXTLIMIT, MPFROM2SHORT(40,0), NULL);
  1290.  
  1291.         return 0;
  1292.  
  1293.     case WM_COMMAND:
  1294.         switch (COMMANDMSG(&msg)->cmd)
  1295.         {
  1296.         case DID_OK:
  1297.  
  1298.             WinQueryDlgItemText (hwnd, IDD_SEARCH, sizeof(szSearchfield), (PSZ) szSearchfield);
  1299.  
  1300.             mlesrchTemp.cb = sizeof (mlesrchTemp);
  1301.             mlesrchTemp.pchFind = szSearchfield;
  1302.             mlesrchTemp.pchReplace = NULL;
  1303.             mlesrchTemp.cchFind = 0;
  1304.             mlesrchTemp.cchReplace = 0;
  1305.             mlesrchTemp.iptStart = -1;
  1306.             mlesrchTemp.iptStop = -1;
  1307.  
  1308.             *pmlesrchTemp = mlesrchTemp;
  1309.  
  1310.             WinDismissDlg (hwnd, TRUE);
  1311.             return 0;
  1312.  
  1313.         case DID_CANCEL:
  1314.             WinDismissDlg (hwnd, FALSE);
  1315.             return 0;
  1316.         }
  1317.         break;
  1318.     }
  1319.     return WinDefDlgProc (hwnd, msg, mp1, mp2);
  1320. }
  1321.  
  1322. MRESULT EXPENTRY AddDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  1323. {
  1324.  
  1325.     CHAR szNewCardIndex[41];
  1326.     INT numchars;
  1327.     Card newcard;
  1328.     HWND hwndParent;
  1329.  
  1330.     switch (msg)
  1331.     {
  1332.     case WM_INITDLG:
  1333.  
  1334.         /*      Set the maximum number of characters to 40              */
  1335.  
  1336.         WinSendDlgItemMsg (hwnd, IDD_ADD, EM_SETTEXTLIMIT, MPFROM2SHORT(40,0), NULL);
  1337.         return 0;
  1338.  
  1339.     case WM_COMMAND:
  1340.         switch (COMMANDMSG(&msg)->cmd)
  1341.         {
  1342.         case DID_OK:
  1343.  
  1344.             szNewCardIndex[0] = '\0';
  1345.  
  1346.             WinQueryDlgItemText (hwnd, IDD_ADD, sizeof(szNewCardIndex), (PSZ)szNewCardIndex);
  1347.  
  1348.             numchars = 0;
  1349.             newcard.Wincard(szNewCardIndex, 0, 0);
  1350.             cardlist.insertcard(newcard);
  1351.  
  1352.             /*      If a card has been added, set the Changed flag          */
  1353.  
  1354.             bChanged = TRUE;
  1355.  
  1356.         case DID_CANCEL:
  1357.  
  1358.             iCardmove = 0;
  1359.             hwndParent = WinQueryWindow (hwnd, QW_PARENT);
  1360.             WinDismissDlg (hwnd, FALSE);
  1361.             return 0;
  1362.         }
  1363.         break;
  1364.     }
  1365.     return WinDefDlgProc (hwnd, msg, mp1, mp2);
  1366. }
  1367.  
  1368. MRESULT EXPENTRY IndexDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  1369. {
  1370.     INT numcardchars;
  1371.     CHAR szBuffer[41];
  1372.     char* tempinfo;
  1373.  
  1374.     switch (msg)
  1375.     {
  1376.     case WM_INITDLG:
  1377.  
  1378.         /*      Set the maximum number of characters to 40              */
  1379.  
  1380.         WinSendDlgItemMsg (hwnd, IDD_INDEX, EM_SETTEXTLIMIT, MPFROM2SHORT(40,0), NULL);
  1381.  
  1382.         /*      Put the current card's text in the field                */
  1383.  
  1384.         strcpy(szBuffer, (cardlist.showcard(0)).showindexinfo());
  1385.  
  1386. /*      szBuffer is larger than text limit to account for null byte     */
  1387.  
  1388.         WinSetDlgItemText (hwnd, IDD_INDEX, (PUCHAR) szBuffer);
  1389.  
  1390.         return 0;
  1391.  
  1392.     case WM_COMMAND:
  1393.         switch (COMMANDMSG(&msg)->cmd)
  1394.         {
  1395.         case DID_OK:
  1396.  
  1397.             WinQueryDlgItemText (hwnd, IDD_INDEX, sizeof(szBuffer), (PSZ)szBuffer);
  1398.  
  1399.             numcardchars = (INT) (cardlist.showcard(0)).shownumcardchars();
  1400.  
  1401.             tempinfo = new char [numcardchars];
  1402.  
  1403.             strcpy(tempinfo, (cardlist.showcard(0)).showcardinfo() );
  1404.  
  1405.             newcard.Wincard(szBuffer, numcardchars, tempinfo);
  1406.  
  1407.             delete [] tempinfo;
  1408.  
  1409.             /*      If this is not the first card                       */
  1410.  
  1411.             if (cardlist.delcard()) cardlist.insertcard(newcard);
  1412.             else
  1413.             {
  1414.                 cardlist.insertcard(newcard);
  1415.                 cardlist.movecard(-1);
  1416.                 cardlist.delcard();
  1417.             }
  1418.  
  1419.         case DID_CANCEL:
  1420.  
  1421.             iCardmove = 0;
  1422.             WinDismissDlg (hwnd, FALSE);
  1423.  
  1424.             return 0;
  1425.         }
  1426.         break;
  1427.     }
  1428.     return WinDefDlgProc (hwnd, msg, mp1, mp2);
  1429. }
  1430.  
  1431. MRESULT EXPENTRY AboutDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  1432. {
  1433.     switch (msg)
  1434.     {
  1435.     case WM_COMMAND:
  1436.         switch (COMMANDMSG(&msg)->cmd)
  1437.         {
  1438.         case DID_OK:
  1439.         case DID_CANCEL:
  1440.  
  1441.             WinDismissDlg(hwnd, TRUE);
  1442.             return 0;
  1443.         }
  1444.         break;
  1445.     }
  1446.     return WinDefDlgProc(hwnd, msg, mp1, mp2);
  1447. }
  1448.  
  1449. /*                                                              */
  1450. /*      Functions here                                          */
  1451. /*                                                              */
  1452.  
  1453. /*      Function to copy new MLE text onto a card       */
  1454.  
  1455. void editcard(HWND hwndMle)
  1456. {
  1457.     LONG lOffset;
  1458.     ULONG lCopy;
  1459.     INT i, numcardchars;
  1460.  
  1461.     for (i = 0; i < MLEBUFFER; i++)
  1462.         szMleBuf[i] = '\0';
  1463.     lOffset = 0;
  1464.  
  1465.     WinSendMsg (hwndMle, MLM_SETIMPORTEXPORT, MPFROMP (szMleBuf),
  1466.     MPFROMSHORT ((USHORT) sizeof (szMleBuf)));
  1467.  
  1468.     lCopy = (ULONG) WinSendMsg (hwndMle, MLM_QUERYFORMATTEXTLENGTH,
  1469.     MPFROMLONG (lOffset), MPFROMLONG (-1));
  1470.  
  1471.     /*      Cast to int -- required; add one space for the null character   */
  1472.  
  1473.     numcardchars = lCopy+1;
  1474.  
  1475.     WinSendMsg (hwndMle, MLM_EXPORT, MPFROMP (&lOffset), MPFROMP (&lCopy));
  1476.  
  1477.     newcard.Wincard((cardlist.showcard(0).showindexinfo()), (numcardchars), szMleBuf);
  1478.     if (cardlist.delcard()) cardlist.insertcard(newcard);
  1479.     else
  1480.     {
  1481.         cardlist.insertcard(newcard);
  1482.         cardlist.movecard(1);
  1483.         cardlist.delcard();
  1484.         iCardmove = 0;
  1485.     }
  1486.     bChanged = FALSE;
  1487.     return;
  1488. }
  1489.  
  1490. /*      Initialize file dialog                          */
  1491.  
  1492. FILEDLG InitializeFiledlgFields()
  1493. {
  1494.     FILEDLG fild;
  1495.     fild.cbSize = sizeof (FILEDLG);
  1496.     fild.ulUser = 0;
  1497.     fild.lReturn = 0;
  1498.     fild.lSRC = 0;
  1499.     fild.pszOKButton = 0;
  1500.     fild.pfnDlgProc = 0;
  1501.     fild.pszIType = 0;
  1502.     fild.papszITypeList = 0;
  1503.     fild.pszIDrive = 0;
  1504.     fild.papszIDriveList = 0;
  1505.     fild.hMod = 0;
  1506.     fild.szFullFile[CCHMAXPATH] = 0;
  1507.     fild.papszFQFilename = 0;
  1508.     fild.ulFQFCount = 0;
  1509.     fild.usDlgId = 0;
  1510.     fild.sEAType = 0;
  1511.  
  1512.     return fild;
  1513. }
  1514.