home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / quot210s.zip / src / quoter.c < prev    next >
C/C++ Source or Header  |  1998-12-03  |  36KB  |  969 lines

  1. /*
  2.  * quoter.c
  3.  *
  4.  * Main routines for the Quoteriser.
  5.  *
  6.  *      Created: 16th January, 1997
  7.  * Version 1.00: 8th April, 1997
  8.  * Version 2.00: 21st December, 1997
  9.  * Version 2.10: 28th October, 1998
  10.  *
  11.  * (C) 1997-1998 Nicholas Paul Sheppard
  12.  *
  13.  * This file is distributed under the GNU General Public License. See the
  14.  * file copying.txt for details.
  15.  */
  16.  
  17. #define INCL_WIN
  18. #include <os2.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include "quoter.h"
  22. #include "quotes.h"
  23. #include "authors.h"
  24. #include "types.h"
  25. #include "general.h"
  26. #include "threads.h"
  27. #include "pmutil.h"
  28.  
  29.  
  30. HAB        hab;
  31. HWND        hwndFrame, hwndMain, hwndMenu, hwndVertScroll;
  32. char          szAppName[64];
  33. PROGSTATE    ps;
  34.  
  35. /* internal function prototypes */
  36. void MenuSetUsedDBs(void);
  37. void MenuSetWindowTitle(void);
  38.  
  39. int main(int argc, char *argv[])
  40. {
  41.     HMQ    hmq;
  42.     QMSG    qmsg;
  43.     ULONG    flFrameFlags;
  44.     char    szMainClass[] = "MAIN";
  45.     QDBINFO    qdbinfo;
  46.     int    bQuoteOpen, bQuoteWritable;
  47.     ADBINFO    adbinfo;
  48.     int    bAuthorOpen, bAuthorWritable;
  49.     int    i;
  50.  
  51.     /* initialise global variables */
  52.     ps.szQuoteDB[0] = '\0';
  53.     ps.szAuthorDB[0] = '\0';
  54.     QuoteNullifyDB(&(ps.qdb));
  55.     AuthorNullifyDB(&(ps.adb));
  56.  
  57.     /* initialise local variables */
  58.     bQuoteOpen = 0;
  59.     bQuoteWritable = 0;
  60.     bAuthorOpen = 0;
  61.     bAuthorWritable = 0;
  62.  
  63.     /* parse command line */
  64.     i = 1;
  65.     while ((i < argc) && (argv[i][0] == '-')) {
  66.         if (argv[i][1] == 'q') {
  67.             i++;
  68.             if (i < argc) {
  69.                 if (QuoteDBStat(argv[i], &qdbinfo)) {
  70.                     if (QuoteOpenDB(argv[i], &(ps.qdb), ps.iQdbMode = qdbinfo.flMode)) {
  71.                         strcpy(prf.szQuoteDB1, argv[i]);
  72.                         dirfname(strcpy(ps.szQuoteDB, argv[i]));
  73.                         bQuoteOpen = 1;
  74.                         bQuoteWritable = (ps.iQdbMode & S_IWRITE) == S_IWRITE;
  75.                         SetUsedDB(prf.szQuoteDB1, NULL);
  76.                     }
  77.                 }
  78.             }
  79.         } else if (argv[i][1] == 'a') {
  80.             i++;
  81.             if (i < argc) {
  82.                 if (AuthorDBStat(argv[i], &adbinfo)) {
  83.                     if (AuthorOpenDB(argv[i], &(ps.adb), ps.iAdbMode = adbinfo.flMode)) {
  84.                         strcpy(prf.szAuthorDB1, argv[i]);
  85.                         dirfname(strcpy(ps.szAuthorDB, argv[i]));
  86.                         bAuthorOpen = 1;
  87.                         bAuthorWritable = (ps.iAdbMode & S_IWRITE) == S_IWRITE;
  88.                         SetUsedDB(NULL, prf.szAuthorDB1);
  89.                     }
  90.                 }
  91.             }
  92.         }
  93.         i++;
  94.     }
  95.  
  96.     if ((hab = WinInitialize(0)) == 0)
  97.         return (1);
  98.     hmq = WinCreateMsgQueue(hab, 0);
  99.  
  100.     /* display an introductory dialogue box */
  101.     WinDlgBox(HWND_DESKTOP, HWND_DESKTOP, IntroBoxProc, NULLHANDLE, IDD_INTRO, (PVOID)NULL);
  102.  
  103.     /* create the main window */
  104.     flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU | FCF_MENU | FCF_SIZEBORDER | FCF_MINMAX | FCF_TASKLIST | FCF_VERTSCROLL;
  105.     WinRegisterClass(hab, szMainClass, (PFNWP)MainWinProc, CS_SIZEREDRAW, 0); 
  106.     WinLoadString(hab, 0, IDS_APPNAME, sizeof(szAppName), szAppName);
  107.     hwndFrame = WinCreateStdWindow(HWND_DESKTOP, 0, &flFrameFlags, szMainClass,
  108.                     szAppName, 0L, NULLHANDLE, IDM_MAIN, &hwndMain);
  109.     if (hwndFrame != NULLHANDLE) {
  110.         /* initialise the main window */
  111.         GetWindowPosition(hwndFrame);
  112.         MenuSetWindowTitle();
  113.  
  114.         /* get some window handles we need */
  115.         hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
  116.         hwndVertScroll = WinWindowFromID(hwndFrame, FID_VERTSCROLL);
  117.  
  118.         /* initialise menu item enable states */
  119.         WinEnableMenuItem(hwndMenu, IDM_REORG_AUTHORS, bAuthorOpen);
  120.         WinEnableMenuItem(hwndMenu, IDM_REORG_QUOTES, bQuoteOpen);
  121.         WinEnableMenuItem(hwndMenu, IDM_CLOSE_AUTHORS, bAuthorOpen);
  122.         WinEnableMenuItem(hwndMenu, IDM_CLOSE_QUOTES, bQuoteOpen);
  123.         WinEnableMenuItem(hwndMenu, IDM_AUTHORS, bAuthorOpen);
  124.         WinEnableMenuItem(hwndMenu, IDM_ADD_AUTHOR, bAuthorWritable);
  125.         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR, bAuthorWritable);
  126.         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, bAuthorWritable);
  127.         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_ALL, bAuthorWritable);
  128.         WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR, bAuthorOpen);
  129.         WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_ALL, bAuthorOpen);
  130.         WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_NAME, bAuthorOpen);
  131.         WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_DESC, bAuthorOpen);
  132.         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR, bAuthorWritable);
  133.         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, bAuthorWritable);
  134.         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_ALL, bAuthorWritable);
  135.         WinEnableMenuItem(hwndMenu, IDM_IMPORT_AUTHORS, bAuthorWritable);
  136.         WinEnableMenuItem(hwndMenu, IDM_QUOTES, bQuoteOpen);
  137.         WinEnableMenuItem(hwndMenu, IDM_ADD_QUOTE, bQuoteWritable);
  138.         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE, bQuoteWritable);
  139.         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, bQuoteWritable);
  140.         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_ALL, bQuoteWritable);
  141.         WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE, bQuoteOpen);
  142.         WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_ALL, bQuoteOpen);
  143.         WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_KEY, bQuoteOpen);
  144.         WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_TEXT, bQuoteOpen);
  145.         WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_NAME, bQuoteOpen);
  146.         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE, bQuoteWritable);
  147.         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, bQuoteWritable);
  148.         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_ALL, bQuoteWritable);
  149.         WinEnableMenuItem(hwndMenu, IDM_IMPORT_QUOTES, bQuoteWritable);
  150.  
  151.         /* initialise last-used databases */
  152.         if ((prf.szQuoteDB1[0] != '\0') || (prf.szAuthorDB1[0] != '\0'))
  153.             MenuSetUsedDBs();
  154.  
  155.         /* disable scroll bar (painting will re-enable it later) */
  156.         WinEnableWindow(hwndVertScroll, FALSE);
  157.  
  158.         while (WinGetMsg(hab, &qmsg, (HWND)NULL, 0, 0))
  159.             WinDispatchMsg(hab, &qmsg);
  160.  
  161.         QuoteFreeQuote(&(ps.pqi), &(ps.pszText));
  162.         AuthorFreeAuthor(&(ps.pai), &(ps.pszDesc));
  163.  
  164.         WinDestroyWindow(hwndFrame);
  165.     }
  166.  
  167.     WinDestroyMsgQueue(hmq);
  168.     WinTerminate(hab);
  169.     return (0);
  170. }
  171.  
  172.  
  173. MRESULT EXPENTRY MainWinProc(HWND hwnd, ULONG message, MPARAM mp1, MPARAM mp2)
  174. /*
  175.  * Window procedure for the main window.
  176.  */
  177. {
  178.     char            szString[200], szMessage[200], szTitle[20];
  179.     static HAPP        happEditor = NULLHANDLE;
  180.     static THREADINFO    ti;
  181.     BOOL            bWritable = 0;
  182.     RECTL            rectl;
  183.  
  184.     switch (message) {
  185.         case WM_CREATE:
  186.             /* get settings from QUOTER.INI */
  187.             GetINISettings();
  188.  
  189.             /* initialise global variables */
  190.             happEditor = NULLHANDLE;
  191.             ps.iMode = Q_NONE;
  192.             ps.pqi = NULL;
  193.             ps.pai = NULL;
  194.             ps.pszText = ps.pszDesc = NULL;
  195.             ti.hwndCaller = hwnd;
  196.             ti.pps = &ps;
  197.  
  198.             /* initialise threads */
  199.             if (_beginthread((THREADPROC)ThreadPaint, NULL, THREADSTACK, (void *)(&ti)) == -1) {
  200.                 WinLoadString(hab, 0, IDS_THREADFAILED, sizeof(szMessage), szMessage);
  201.                 WinLoadString(hab, 0, IDS_ERROR, sizeof(szTitle), szTitle);
  202.                 WinMessageBox(HWND_DESKTOP, hwnd, szMessage, szTitle, 0, MB_ERROR);
  203.                 return ((MRESULT)TRUE);
  204.             }
  205.             return (FALSE);
  206.  
  207.         case WM_ERASEBACKGROUND:
  208.             return ((MRESULT)TRUE);
  209.  
  210.         case WM_APPTERMINATENOTIFY:
  211.             happEditor = NULLHANDLE;
  212.             return (FALSE);
  213.  
  214.         case WM_PRESPARAMCHANGED:
  215.         case WM_SIZE:
  216.             WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  217.             WinInvalidateRect(hwndMain, NULL, TRUE);
  218.             return (FALSE);
  219.  
  220.         case WM_PAINT:
  221.             WinSendMsg(hwndPaint, QM_PAINT, NULL, NULL);
  222.             return (FALSE);
  223.  
  224.         case WM_DESTROY:
  225.             /* free all of our memory */
  226.             QuoteFreeQuote(&(ps.pqi), &(ps.pszText));
  227.             AuthorFreeAuthor(&(ps.pai), &(ps.pszDesc));
  228.  
  229.             /* ensure that the databases are closed before exiting */
  230.             if (ps.qdb.dbfInfo != NULL)
  231.                 QuoteCloseDB(&(ps.qdb));
  232.             if (ps.adb.dbfInfo != NULL)
  233.                 AuthorCloseDB(&(ps.adb));
  234.  
  235.             /* save window position in QUOTER.INI */
  236.             SaveWindowPosition(hwndFrame);
  237.  
  238.             return (FALSE);
  239.  
  240.         case WM_VSCROLL:
  241.             WinQueryWindowRect(hwndMain, &rectl);
  242.             WinScrollWindow(hwndMain, 0L, ScrollMsgHandler(hwndVertScroll, message, mp1, mp2, &rectl, 1), &rectl, NULL, NULLHANDLE, NULL, SW_INVALIDATERGN);
  243.             return (FALSE);
  244.  
  245.         case WM_COMMAND:
  246.             switch (SHORT1FROMMP(mp1)) {
  247.                 case IDM_OPEN_QUOTES:
  248.                     ps.iMode = Q_NONE;
  249.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  250.                     if (MenuOpenQuotes(hwnd, NULL)) {
  251.                         SetUsedDB(prf.szQuoteDB1, NULL);
  252.                         MenuSetUsedDBs();
  253.                         bWritable = (ps.iQdbMode & S_IWRITE) == S_IWRITE;
  254.                         WinEnableMenuItem(hwndMenu, IDM_OPEN_QUOTES, FALSE);
  255.                         WinEnableMenuItem(hwndMenu, IDM_REORG_QUOTES, bWritable);
  256.                         WinEnableMenuItem(hwndMenu, IDM_CLOSE_QUOTES, TRUE);
  257.                         WinEnableMenuItem(hwndMenu, IDM_USEDDB1, FALSE);
  258.                         WinEnableMenuItem(hwndMenu, IDM_QUOTES, TRUE);
  259.                         WinEnableMenuItem(hwndMenu, IDM_ADD_QUOTE, bWritable);
  260.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE, bWritable);
  261.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_ALL, bWritable);
  262.                         WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE, TRUE);
  263.                         WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_ALL, TRUE);
  264.                         WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_KEY, TRUE);
  265.                         WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_TEXT, TRUE);
  266.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE, bWritable);
  267.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_ALL, bWritable);
  268.                         WinEnableMenuItem(hwndMenu, IDM_IMPORT_QUOTES, bWritable);
  269.                         if (ps.adb.dbfInfo != NULL)
  270.                             WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_NAME, TRUE);
  271.                         QuoteFreeQuote(&(ps.pqi), &(ps.pszText));
  272.                         AuthorFreeAuthor(&(ps.pai), &(ps.pszDesc));
  273.                         WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  274.                         WinInvalidateRect(hwndMain, NULL, TRUE);
  275.                         MenuSetWindowTitle();
  276.                     }
  277.                     return (FALSE);
  278.  
  279.                 case IDM_OPEN_AUTHORS:
  280.                     ps.iMode = Q_NONE;
  281.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  282.                     if (MenuOpenAuthors(hwnd, NULL)) {
  283.                         SetUsedDB(NULL, prf.szAuthorDB1);
  284.                         MenuSetUsedDBs();
  285.                         bWritable = (ps.iAdbMode & S_IWRITE) == S_IWRITE;
  286.                         WinEnableMenuItem(hwndMenu, IDM_OPEN_AUTHORS, FALSE);
  287.                         WinEnableMenuItem(hwndMenu, IDM_REORG_AUTHORS, bWritable);
  288.                         WinEnableMenuItem(hwndMenu, IDM_CLOSE_AUTHORS, TRUE);
  289.                         WinEnableMenuItem(hwndMenu, IDM_USEDDB1, FALSE);
  290.                         WinEnableMenuItem(hwndMenu, IDM_AUTHORS, TRUE);
  291.                         WinEnableMenuItem(hwndMenu, IDM_ADD_AUTHOR, bWritable);
  292.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR, bWritable);
  293.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_ALL, bWritable);
  294.                         WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR, TRUE);
  295.                         WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_ALL, TRUE);
  296.                         WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_NAME, TRUE);
  297.                         WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_DESC, TRUE);
  298.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR, bWritable);
  299.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_ALL, bWritable);
  300.                         WinEnableMenuItem(hwndMenu, IDM_IMPORT_AUTHORS, bWritable);
  301.                         if (ps.qdb.dbfInfo != NULL)
  302.                             WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_NAME, TRUE);
  303.                         QuoteFreeQuote(&(ps.pqi), &(ps.pszText));
  304.                         AuthorFreeAuthor(&(ps.pai), &(ps.pszDesc));
  305.                         WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  306.                         WinInvalidateRect(hwndMain, NULL, TRUE);
  307.                         MenuSetWindowTitle();
  308.                     }
  309.                     return (FALSE);
  310.  
  311.                 case IDM_REORG_QUOTES:
  312.                     if (_beginthread((THREADPROC)QuoteReorganiseDB, NULL, THREADSTACK, (void *)&(ps.qdb)) == -1) {
  313.                         WinLoadString(hab, 0, IDS_THREADFAILED, sizeof(szMessage), szMessage);
  314.                         WinLoadString(hab, 0, IDS_ERROR, sizeof(szTitle), szTitle);
  315.                         WinMessageBox(HWND_DESKTOP, hwnd, szMessage, szTitle, 0, MB_ERROR);
  316.                     }
  317.                     return (FALSE);
  318.  
  319.                 case IDM_REORG_AUTHORS:
  320.                     if (_beginthread((THREADPROC)AuthorReorganiseDB, NULL, THREADSTACK, (void *)&(ps.adb)) == 1) {
  321.                         WinLoadString(hab, 0, IDS_THREADFAILED, sizeof(szMessage), szMessage);
  322.                         WinLoadString(hab, 0, IDS_ERROR, sizeof(szTitle), szTitle);
  323.                         WinMessageBox(HWND_DESKTOP, hwnd, szMessage, szTitle, 0, MB_ERROR);
  324.                     }
  325.                     return (FALSE);
  326.  
  327.                 case IDM_CLOSE_QUOTES:
  328.                     ps.iMode = Q_NONE;
  329.                     QuoteCloseDB(&(ps.qdb));
  330.                     ps.szQuoteDB[0] = '\0';
  331.                     WinEnableMenuItem(hwndMenu, IDM_OPEN_QUOTES, TRUE);
  332.                     WinEnableMenuItem(hwndMenu, IDM_REORG_QUOTES, FALSE);
  333.                     WinEnableMenuItem(hwndMenu, IDM_CLOSE_QUOTES, FALSE);
  334.                     WinEnableMenuItem(hwndMenu, IDM_QUOTES, FALSE);
  335.                     WinEnableMenuItem(hwndMenu, IDM_ADD_QUOTE, FALSE);
  336.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE, FALSE);
  337.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  338.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_ALL, FALSE);
  339.                     WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE, FALSE);
  340.                     WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_ALL, FALSE);
  341.                     WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_KEY, FALSE);
  342.                     WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_TEXT, FALSE);
  343.                     WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_NAME, FALSE);
  344.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE, FALSE);
  345.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  346.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_ALL, FALSE);
  347.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  348.                     WinEnableMenuItem(hwndMenu, IDM_IMPORT_QUOTES, FALSE);
  349.                     if (ps.adb.dbfInfo == NULL)
  350.                         WinEnableMenuItem(hwndMenu, IDM_USEDDB1, TRUE);
  351.                     QuoteFreeQuote(&(ps.pqi), &(ps.pszText));
  352.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  353.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  354.                     MenuSetWindowTitle();
  355.                     return (FALSE);
  356.  
  357.                 case IDM_CLOSE_AUTHORS:
  358.                     ps.iMode = Q_NONE;
  359.                     AuthorCloseDB(&(ps.adb));
  360.                     ps.szAuthorDB[0] = '\0';
  361.                     WinEnableMenuItem(hwndMenu, IDM_OPEN_AUTHORS, TRUE);
  362.                     WinEnableMenuItem(hwndMenu, IDM_REORG_AUTHORS, FALSE);
  363.                     WinEnableMenuItem(hwndMenu, IDM_CLOSE_AUTHORS, FALSE);
  364.                     WinEnableMenuItem(hwndMenu, IDM_AUTHORS, FALSE);
  365.                     WinEnableMenuItem(hwndMenu, IDM_ADD_AUTHOR, FALSE);
  366.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR, FALSE);
  367.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  368.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_ALL, FALSE);
  369.                     WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR, FALSE);
  370.                     WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_ALL, FALSE);
  371.                     WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_NAME, FALSE);
  372.                     WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_DESC, FALSE);
  373.                     WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_NAME, FALSE);
  374.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR, FALSE);
  375.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  376.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_ALL, FALSE);
  377.                     WinEnableMenuItem(hwndMenu, IDM_IMPORT_AUTHORS, FALSE);
  378.                     if (ps.qdb.dbfInfo == NULL)
  379.                         WinEnableMenuItem(hwndMenu, IDM_USEDDB1, TRUE);
  380.                     AuthorFreeAuthor(&(ps.pai), &(ps.pszDesc));
  381.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  382.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  383.                     MenuSetWindowTitle();
  384.                     return (FALSE);
  385.  
  386.                 case IDM_USEDDB1:
  387.                     ps.iMode = Q_NONE;
  388.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  389.                     if (prf.szQuoteDB1[0] != '\0') {
  390.                         if (MenuOpenQuotes(hwnd, prf.szQuoteDB1)) {
  391.                             bWritable = (ps.iQdbMode & S_IWRITE) == S_IWRITE;
  392.                             WinEnableMenuItem(hwndMenu, IDM_OPEN_QUOTES, FALSE);
  393.                             WinEnableMenuItem(hwndMenu, IDM_REORG_QUOTES, bWritable);
  394.                             WinEnableMenuItem(hwndMenu, IDM_CLOSE_QUOTES, TRUE);
  395.                             WinEnableMenuItem(hwndMenu, IDM_QUOTES, TRUE);
  396.                             WinEnableMenuItem(hwndMenu, IDM_ADD_QUOTE, bWritable);
  397.                             WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE, bWritable);
  398.                             WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_ALL, bWritable);
  399.                             WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE, TRUE);
  400.                             WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_ALL, TRUE);
  401.                             WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_KEY, TRUE);
  402.                             WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_TEXT, TRUE);
  403.                             WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE, bWritable);
  404.                             WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_ALL, bWritable);
  405.                             WinEnableMenuItem(hwndMenu, IDM_IMPORT_QUOTES, TRUE);
  406.                             if (ps.adb.dbfInfo != NULL)
  407.                                 WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_NAME, TRUE);
  408.                             QuoteFreeQuote(&(ps.pqi), &(ps.pszText));
  409.                             AuthorFreeAuthor(&(ps.pai), &(ps.pszDesc));
  410.                             WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  411.                             WinInvalidateRect(hwndMain, NULL, TRUE);
  412.                             MenuSetWindowTitle();
  413.                         }
  414.                     }
  415.                     if (prf.szAuthorDB1[0] != '\0') {
  416.                         if (MenuOpenAuthors(hwnd, prf.szAuthorDB1)) {
  417.                             bWritable = (ps.iAdbMode & S_IWRITE) == S_IWRITE;
  418.                             WinEnableMenuItem(hwndMenu, IDM_OPEN_AUTHORS, FALSE);
  419.                             WinEnableMenuItem(hwndMenu, IDM_REORG_AUTHORS, bWritable);
  420.                             WinEnableMenuItem(hwndMenu, IDM_CLOSE_AUTHORS, TRUE);
  421.                             WinEnableMenuItem(hwndMenu, IDM_AUTHORS, TRUE);
  422.                             WinEnableMenuItem(hwndMenu, IDM_ADD_AUTHOR, bWritable);
  423.                             WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR, bWritable);
  424.                             WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_ALL, bWritable);
  425.                             WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR, TRUE);
  426.                             WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_ALL, TRUE);
  427.                             WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_NAME, TRUE);
  428.                             WinEnableMenuItem(hwndMenu, IDM_GET_AUTHOR_DESC, TRUE);
  429.                             WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR, bWritable);
  430.                             WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_ALL, bWritable);
  431.                             WinEnableMenuItem(hwndMenu, IDM_IMPORT_AUTHORS, TRUE);
  432.                             if (ps.qdb.dbfInfo != NULL)
  433.                                 WinEnableMenuItem(hwndMenu, IDM_GET_QUOTE_NAME, TRUE);
  434.                             QuoteFreeQuote(&(ps.pqi), &(ps.pszText));
  435.                             AuthorFreeAuthor(&(ps.pai), &(ps.pszDesc));
  436.                             WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  437.                             WinInvalidateRect(hwndMain, NULL, TRUE);
  438.                             MenuSetWindowTitle();
  439.                         }
  440.                     }
  441.                     return (FALSE);
  442.  
  443.                 case IDM_SETTINGS:
  444.                     WinDlgBox(HWND_DESKTOP, hwnd, SettingsBox, NULLHANDLE, IDD_SETTINGS, NULL);
  445.                     return (FALSE);
  446.  
  447.                 case IDM_COPY_TEXT:
  448.                     if ((ps.iMode == Q_QUOTE) || (ps.iMode == Q_AUTHOR))
  449.                         WinSendMsg(hwndPaint, QM_COPY, MPFROMSHORT(CF_TEXT), NULL);
  450.                     return (FALSE);
  451.  
  452.                 case IDM_COPY_METAFILE:
  453.                     if ((ps.iMode == Q_QUOTE) || (ps.iMode == Q_AUTHOR))
  454.                         WinSendMsg(hwndPaint, QM_COPY, MPFROMSHORT(CF_METAFILE), NULL);
  455.                     return (FALSE);
  456.  
  457.                 case IDM_ADD_QUOTE:
  458.                     ps.iMode = Q_NONE;
  459.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  460.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  461.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  462.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  463.                     if (MenuAddQuote(hwnd)) {
  464.                         ps.iMode = Q_QUOTE;
  465.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, TRUE);
  466.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, TRUE);
  467.                     } else {
  468.                         ps.iMode = Q_NONE;
  469.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  470.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  471.                     }
  472.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  473.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  474.                     return (FALSE);
  475.  
  476.                 case IDM_EDIT_QUOTE_CURRENT:
  477.                 case IDM_EDIT_QUOTE_ALL:
  478.                     ps.iMode = Q_SEARCHING;
  479.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  480.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  481.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  482.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  483.                     if (MenuEditQuote(hwnd, SHORT1FROMMP(mp1) == IDM_EDIT_QUOTE_CURRENT)) {
  484.                         ps.iMode = Q_QUOTE;
  485.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, TRUE);
  486.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, TRUE);
  487.                     } else {
  488.                         ps.iMode = Q_NONE;
  489.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  490.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  491.                     }
  492.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  493.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  494.                     return (FALSE);
  495.  
  496.                     ps.iMode = Q_NONE;
  497.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  498.                     QuoteDeleteQuote(&(ps.qdb), ps.szQuoteCode);
  499.                     ps.szQuoteCode[0] = '\0';
  500.                     QuoteFreeQuote(&(ps.pqi), &(ps.pszText));
  501.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  502.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  503.                     return (FALSE);
  504.  
  505.                 case IDM_DEL_QUOTE_CURRENT:
  506.                 case IDM_DEL_QUOTE_ALL:
  507.                     ps.iMode = Q_SEARCHING;
  508.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  509.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  510.                     MenuDelQuote(hwnd, SHORT1FROMMP(mp1) == IDM_DEL_QUOTE_CURRENT);
  511.                     ps.iMode = Q_NONE;
  512.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  513.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  514.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  515.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  516.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  517.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  518.                     return (FALSE);
  519.  
  520.                 case IDM_GET_QUOTE_ALL:
  521.                     ps.iMode = Q_SEARCHING;
  522.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  523.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  524.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  525.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  526.                     if (MenuGetQuoteAll(hwnd)) {
  527.                         ps.iMode = Q_QUOTE;
  528.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, TRUE);
  529.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, TRUE);
  530.                     } else {
  531.                         ps.iMode = Q_NONE;
  532.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  533.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  534.                     }
  535.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  536.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  537.                     return (FALSE);
  538.  
  539.                 case IDM_GET_QUOTE_KEY:
  540.                     ps.iMode = Q_SEARCHING;
  541.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  542.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  543.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  544.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  545.                     if (MenuGetQuoteKeyword(hwnd)) {
  546.                         ps.iMode = Q_QUOTE;
  547.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, TRUE);
  548.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, TRUE);
  549.                     } else {
  550.                         ps.iMode = Q_NONE;
  551.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  552.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  553.                     }
  554.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  555.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  556.                     return (FALSE);
  557.  
  558.                 case IDM_GET_QUOTE_TEXT:
  559.                     ps.iMode = Q_SEARCHING;
  560.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  561.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  562.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  563.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  564.                     if (MenuGetQuoteText(hwnd)) {
  565.                         ps.iMode = Q_QUOTE;
  566.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, TRUE);
  567.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, TRUE);
  568.                     } else {
  569.                         ps.iMode = Q_NONE;
  570.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, TRUE);
  571.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  572.                     }
  573.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  574.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  575.                     return (FALSE);
  576.  
  577.                 case IDM_GET_QUOTE_NAME:
  578.                     ps.iMode = Q_SEARCHING;
  579.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  580.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  581.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  582.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  583.                     if (MenuGetQuoteName(hwnd)) {
  584.                         ps.iMode = Q_QUOTE;
  585.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, TRUE);
  586.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, TRUE);
  587.                     } else {
  588.                         ps.iMode = Q_NONE;
  589.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  590.                         WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  591.                     }
  592.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  593.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  594.                     return (FALSE);
  595.  
  596.                 case IDM_IMPORT_QUOTES:
  597.                     ps.iMode = Q_SEARCHING;
  598.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  599.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  600.                     WinDlgBox(HWND_DESKTOP, hwnd, ImportQuotesBox, NULLHANDLE, IDD_IMPORT, NULL);
  601.                     ps.iMode = Q_NONE;
  602.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  603.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  604.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  605.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  606.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  607.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  608.                     return (FALSE);
  609.  
  610.                 case IDM_ADD_AUTHOR:
  611.                     ps.iMode = Q_NONE;
  612.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  613.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  614.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  615.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  616.                     if (MenuAddAuthor(hwnd)) {
  617.                         ps.iMode = Q_AUTHOR;
  618.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, TRUE);
  619.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, TRUE);
  620.                     } else {
  621.                         ps.iMode = Q_NONE;
  622.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  623.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  624.                     }
  625.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  626.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  627.                     return (FALSE);
  628.  
  629.                 case IDM_EDIT_AUTHOR_CURRENT:
  630.                 case IDM_EDIT_AUTHOR_ALL:
  631.                     ps.iMode = Q_SEARCHING;
  632.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  633.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  634.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  635.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  636.                     if (MenuEditAuthor(hwnd, SHORT1FROMMP(mp1) == IDM_EDIT_AUTHOR_CURRENT)) {
  637.                         ps.iMode = Q_AUTHOR;
  638.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, TRUE);
  639.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, TRUE);
  640.                     } else {
  641.                         ps.iMode = Q_NONE;
  642.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  643.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  644.                     }
  645.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  646.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  647.                     return (FALSE);
  648.  
  649.                 case IDM_DEL_AUTHOR_CURRENT:
  650.                 case IDM_DEL_AUTHOR_ALL:
  651.                     ps.iMode = Q_SEARCHING;
  652.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  653.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  654.                     MenuDelAuthor(hwnd, SHORT1FROMMP(mp1) == IDM_DEL_AUTHOR_CURRENT);
  655.                     ps.iMode = Q_NONE;
  656.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  657.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  658.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  659.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  660.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  661.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  662.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  663.                     return (FALSE);
  664.  
  665.                 case IDM_GET_AUTHOR_ALL:
  666.                     ps.iMode = Q_SEARCHING;
  667.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  668.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  669.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  670.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  671.                     if (MenuGetAuthorAll(hwnd)) {
  672.                         ps.iMode = Q_AUTHOR;
  673.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, TRUE);
  674.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, TRUE);
  675.                     } else {
  676.                         ps.iMode = Q_NONE;
  677.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  678.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  679.                     }
  680.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  681.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  682.                     return (FALSE);
  683.  
  684.                 case IDM_GET_AUTHOR_DESC:
  685.                     ps.iMode = Q_SEARCHING;
  686.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  687.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  688.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  689.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  690.                     if (MenuGetAuthorDesc(hwnd)) {
  691.                         ps.iMode = Q_AUTHOR;
  692.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, TRUE);
  693.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, TRUE);
  694.                     } else {
  695.                         ps.iMode = Q_NONE;
  696.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  697.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  698.                     }
  699.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  700.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  701.                     return (FALSE);
  702.  
  703.  
  704.                 case IDM_GET_AUTHOR_NAME:
  705.                     ps.iMode = Q_SEARCHING;
  706.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  707.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  708.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  709.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  710.                     if (MenuGetAuthorName(hwnd)) {
  711.                         ps.iMode = Q_AUTHOR;
  712.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, TRUE);
  713.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, TRUE);
  714.                     } else {
  715.                         ps.iMode = Q_NONE;
  716.                         WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  717.                         WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  718.                     }
  719.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  720.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  721.                     return (FALSE);
  722.  
  723.                 case IDM_IMPORT_AUTHORS:
  724.                     ps.iMode = Q_SEARCHING;
  725.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  726.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  727.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  728.                     WinDlgBox(HWND_DESKTOP, hwnd, ImportAuthorsBox, NULLHANDLE, IDD_IMPORT, NULL);
  729.                     ps.iMode = Q_NONE;
  730.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_AUTHOR_CURRENT, FALSE);
  731.                     WinEnableMenuItem(hwndMenu, IDM_DEL_AUTHOR_CURRENT, FALSE);
  732.                     WinEnableMenuItem(hwndMenu, IDM_EDIT_QUOTE_CURRENT, FALSE);
  733.                     WinEnableMenuItem(hwndMenu, IDM_DEL_QUOTE_CURRENT, FALSE);
  734.                     WinSendMsg(hwndPaint, QM_TYPESET, NULL, NULL);
  735.                     WinInvalidateRect(hwndMain, NULL, TRUE);
  736.                     return (FALSE);
  737.  
  738.                 case IDM_QOTD:
  739.                     WinDlgBox(HWND_DESKTOP, hwnd, QuoteOfTheDayBox, NULLHANDLE, IDD_QOTD, NULL);
  740.                     return (FALSE);
  741.  
  742.                 case IDM_EXIT:
  743.                     ps.iMode = Q_NONE;
  744.                     if (happEditor != NULLHANDLE)
  745.                         WinTerminateApp(happEditor);
  746.                     WinSendMsg(hwnd, WM_CLOSE, NULL, NULL);
  747.                     return (FALSE);
  748.  
  749.                 case IDM_GENHELP:
  750.                     if (happEditor == NULLHANDLE) {
  751.                         dircat(strcpy(szString, prf.szDocPath), "quoter.htm");
  752.                         strreplace(prf.szBrowserParams, "%", szString, szMessage);
  753.                         if ((happEditor = SpawnPM(hwnd, prf.szBrowser, szMessage)) == NULLHANDLE) {
  754.                             WinLoadString(hab, 0, IDS_SPAWNFAILED, sizeof(szString), szString);
  755.                             sprintf(szMessage, szString, prf.szEditor);
  756.                             WinLoadString(hab, 0, IDS_ERROR, sizeof(szTitle), szTitle);
  757.                             WinMessageBox(HWND_DESKTOP, hwnd, szMessage, szTitle, 0, MB_ERROR);
  758.                         }
  759.                     }
  760.                     return (FALSE);
  761.  
  762.                 case IDM_LICENSE:
  763.                     if (happEditor == NULLHANDLE) {
  764.                         dircat(strcpy(szString, prf.szDocPath), "copying.txt");
  765.                         strreplace(prf.szBrowserParams, "%", szString, szMessage);
  766.                         if ((happEditor = SpawnPM(hwnd, prf.szBrowser, szMessage)) == NULLHANDLE) {
  767.                             WinLoadString(hab, 0, IDS_SPAWNFAILED, sizeof(szString), szString);
  768.                             sprintf(szMessage, szString, prf.szEditor);
  769.                             WinLoadString(hab, 0, IDS_ERROR, sizeof(szTitle), szTitle);
  770.                             WinMessageBox(HWND_DESKTOP, hwnd, szMessage, szTitle, 0, MB_ERROR);
  771.                         }
  772.                     }
  773.                     return (FALSE);
  774.  
  775.                 case IDM_ABOUT:
  776.                     WinDlgBox(HWND_DESKTOP, hwnd, AboutBoxProc, NULLHANDLE, IDD_ABOUT, NULL);
  777.                     return (FALSE);
  778.                 }
  779.             return (FALSE);
  780.  
  781.         default:
  782.             return (WinDefWindowProc(hwnd, message, mp1, mp2));
  783.     }
  784.  
  785.     return (FALSE);
  786. }
  787.  
  788.  
  789. MRESULT EXPENTRY IntroBoxProc(HWND hwnd, ULONG message, MPARAM mp1, MPARAM mp2)
  790. /*
  791.  * Window procedure for the intro box. Does nothing except disappear when
  792.  * either the timer is up, or the "Okay" button is pressed.
  793.  */
  794. {
  795.     unsigned long    ulWidth, ulHeight;
  796.     RECTL        rectl;
  797.  
  798.     switch (message) {
  799.         case WM_INITDLG:
  800.             WinStartTimer(hab, hwnd, IDT_INTRO, 5000);
  801.             ulWidth = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN);
  802.             ulHeight = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
  803.             WinQueryWindowRect(hwnd, &rectl);
  804.             WinSetWindowPos(hwnd, HWND_TOP, (ulWidth - rectl.xRight) >> 1, (ulHeight - rectl.yTop) >> 1,
  805.                     0, 0, SWP_MOVE | SWP_ACTIVATE);
  806.             return (FALSE);
  807.  
  808.         case WM_COMMAND:
  809.             switch (SHORT1FROMMP(mp1)) {
  810.                 case IDC_INTRO_OKAY:
  811.                     WinStopTimer(hab, hwnd, IDT_INTRO);
  812.                     WinDismissDlg(hwnd, TRUE);
  813.                     return (FALSE);
  814.             }
  815.  
  816.         case WM_TIMER:
  817.             WinStopTimer(hab, hwnd, IDT_INTRO);
  818.             WinDismissDlg(hwnd, TRUE);
  819.             return (FALSE);
  820.  
  821.         default:
  822.             return (WinDefDlgProc(hwnd, message, mp1, mp2));
  823.     }
  824.  
  825.     return (FALSE);
  826. }
  827.  
  828.  
  829. MRESULT EXPENTRY AboutBoxProc(HWND hwnd, ULONG message, MPARAM mp1, MPARAM mp2)
  830. /*
  831.  * Window procedure for the about box. Does nothing except disappear when the
  832.  * "Okay" button is pressed.
  833.  */
  834. {
  835.     switch (message) {
  836.         case WM_COMMAND:
  837.             switch (SHORT1FROMMP(mp1)) {
  838.                 case IDC_ABOUT_OKAY:
  839.                     WinDismissDlg(hwnd, TRUE);
  840.                     return (FALSE);
  841.             }
  842.  
  843.         default:
  844.             return (WinDefDlgProc(hwnd, message, mp1, mp2));
  845.     }
  846.  
  847.     return (FALSE);
  848. }
  849.  
  850.  
  851. MRESULT EXPENTRY GetTextBox(HWND hwnd, ULONG message, MPARAM mp1, MPARAM mp2)
  852. /*
  853.  * Window procedure for the text entry dialogue box. Places a string entered
  854.  * by the user into a GETTEXT structure pointed to by mp2.
  855.  *
  856.  * The string is set to be empty if the box is cancelled.
  857.  */
  858. {
  859.     static GETTEXT    *pgt;
  860.  
  861.     switch (message) {
  862.         case WM_INITDLG:
  863.             pgt = (GETTEXT *)PVOIDFROMMP(mp2);
  864.             WinSendDlgItemMsg(hwnd, IDC_GETTEXT_TEXT, EM_SETTEXTLIMIT, MPFROMLONG(pgt->iMaxLength), 0);
  865.             if (pgt->pszTitle != NULL)
  866.                 WinSetWindowText(hwnd, pgt->pszTitle);
  867.             return (FALSE);
  868.  
  869.         case WM_COMMAND:
  870.             switch (SHORT1FROMMP(mp1)) {
  871.                 case IDC_GETTEXT_OKAY:
  872.                     WinQueryDlgItemText(hwnd, IDC_GETTEXT_TEXT, pgt->iMaxLength, pgt->pszString);
  873.                     WinDismissDlg(hwnd, TRUE);
  874.                     break;
  875.  
  876.                 case IDC_GETTEXT_CANCEL:
  877.                     pgt->pszString[0] = '\0';
  878.                     WinDismissDlg(hwnd, TRUE);
  879.                     break;
  880.             }
  881.  
  882.         default:
  883.  
  884.             return (WinDefDlgProc(hwnd, message, mp1, mp2));
  885.     }
  886.  
  887.     return (FALSE);
  888. }
  889.  
  890.  
  891. void MenuSetUsedDBs(void)
  892. /*
  893.  * Set the value of the last-used-databases item in the File menu.
  894.  */
  895. {
  896.     HWND        hwndFileMenu;
  897.     MENUITEM    mi;
  898.     BOOL        bExists;
  899.     char        szMenuText[CCHMAXPATH * 2], szTemp[CCHMAXPATH];
  900.  
  901.     /* see if the menu item already exists */
  902.     WinSendMsg(hwndMenu, MM_QUERYITEM, MPFROM2SHORT(IDM_FILE, FALSE), &mi);
  903.     hwndFileMenu = mi.hwndSubMenu;
  904.     bExists = (int)WinSendMsg(hwndFileMenu, MM_ITEMPOSITIONFROMID, MPFROM2SHORT(IDM_USEDDB1, FALSE), 0) != MIT_NONE;
  905.  
  906.     if (!bExists) {
  907.         /* add a menu separator */
  908.         mi.iPosition = MIT_END;
  909.         mi.afStyle = MIS_SEPARATOR;
  910.         mi.afAttribute = 0;
  911.         mi.id = 0;
  912.         mi.hwndSubMenu = 0;
  913.         mi.hItem = NULLHANDLE;
  914.         WinSendMsg(hwndFileMenu, MM_INSERTITEM, &mi, NULL);
  915.     }
  916.  
  917.     /* determine the text to put in the menu item */
  918.     szMenuText[0] = '\0';
  919.     if (prf.szQuoteDB1[0] != '\0') {
  920.         strcpy(szTemp, prf.szQuoteDB1);
  921.         strcat(szMenuText, dirfname(szTemp));
  922.     }
  923.     if (prf.szAuthorDB1[0] != '\0') {
  924.         if (prf.szQuoteDB1[0] != '\0')
  925.             strcat(szMenuText, " & ");
  926.         strcpy(szTemp, prf.szAuthorDB1);
  927.         strcat(szMenuText, dirfname(szTemp));
  928.     }
  929.  
  930.     /* put it in */
  931.     if (bExists)
  932.         WinSendMsg(hwndFileMenu, MM_SETITEMTEXT, MPFROMSHORT(IDM_USEDDB1), szMenuText);
  933.     else {
  934.         mi.iPosition = MIT_END;
  935.         mi.afStyle = MIS_TEXT;
  936.         mi.afAttribute = 0;
  937.         mi.id = IDM_USEDDB1;
  938.         mi.hwndSubMenu = 0;
  939.         mi.hItem = NULLHANDLE;
  940.         WinSendMsg(hwndFileMenu, MM_INSERTITEM, &mi, szMenuText);
  941.     }
  942. }
  943.  
  944.  
  945. void MenuSetWindowTitle(void)
  946. /*
  947.  * Set the main window title to "The Quoteriser: <quotes> & <authors>".
  948.  */
  949. {
  950.     char    szTitle[CCHMAXPATH * 2];
  951.  
  952.     /* determine the text to put in the title */
  953.     WinLoadString(hab, 0, IDS_APPNAME, sizeof(szTitle), szTitle);
  954.     if (ps.szQuoteDB[0] != '\0') {
  955.         strcat(szTitle, ": ");
  956.         strcat(szTitle, ps.szQuoteDB);
  957.     }
  958.     if (ps.szAuthorDB[0] != '\0') {
  959.         if (ps.szQuoteDB[0] != '\0')
  960.             strcat(szTitle, " & ");
  961.         else
  962.             strcat(szTitle, ": ");
  963.         strcat(szTitle, ps.szAuthorDB);
  964.     }
  965.  
  966.     /* put it in */
  967.     WinSetWindowText(hwndFrame, szTitle);
  968. }
  969.