home *** CD-ROM | disk | FTP | other *** search
/ Languages Around the World / LanguageWorld.iso / language / japanese / win_prog / win_jwp / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-31  |  47.1 KB  |  1,378 lines

  1. /* Copyright (C) Stephen Chung, 1991-1993.  All rights reserved. */
  2.  
  3. #include "jwp.h"
  4.  
  5. #include "idm.h"
  6. #include <stdarg.h>
  7. #ifdef CTL3D
  8.     #include <ctl3d.h>
  9. #endif CTL3D
  10.  
  11.  
  12. GLOBALOPTIONS   global;
  13. FILEOPTIONS     *fileoptions = NULL;
  14. FILEOPTIONS     *curfile = NULL;
  15. KANJIFONT       *InstalledFonts = NULL;
  16. ASCIIFONT       DefAsciiFont = { "Times New Roman", 12 };
  17. HANDLE          hInstance = NULL;
  18. HMENU           hmenu = NULL;
  19. HMENU           FullMenu, MinimalMenu;
  20. BOOL            Dialogs3D = FALSE;
  21.  
  22. static int        Untitled = 0;
  23. static BOOL     AllInitialized = FALSE;
  24.  
  25. static TOOLBARICON toolbar[] = {
  26.     { ID_KANA, 180, TBBORDER+2, 24, 24, 1, 0, NULL, "Kana_Undep", "Kana_Dep", "Kana_Grayed", "Kana_Pressed" },
  27.     { ID_ASCII, 210, TBBORDER+2, 24, 24, 0, 0, NULL, "Ascii_Undep", "Ascii_Dep", "Ascii_Grayed", "Ascii_Pressed" },
  28.     { ID_CONVERT, 250, TBBORDER+2, 24, 24, 0, 1, "CVT_Disabled", "CVT_Undep", NULL, NULL, "CVT_Pressed" },
  29.     { ID_BOLD, 290, TBBORDER+2, 24, 24, -1, 2, "Bold_Disabled", "Bold_Undep", "Bold_Dep", "Bold_Grayed", "Bold_Pressed" },
  30.     { ID_ITALICS, 320, TBBORDER+2, 24, 24, -1, 2, "Italics_Disabled", "Italics_Undep", "Italics_Dep", "Italics_Grayed", "Italics_Pressed" },
  31.     { ID_UNDERLINE, 350, TBBORDER+2, 24, 24, -1, 2, "Und_Disabled", "Und_Undep", "Und_Dep", "Und_Grayed", "Und_Pressed" },
  32.     { ID_REVERSE, 380, TBBORDER+2, 24, 24, -1, 2, "Rev_Disabled", "Rev_Undep", "Rev_Dep", "Rev_Grayed", "Rev_Pressed" },
  33.     { ID_HOLLOW, 410, TBBORDER+2, 24, 24, -1, 2, "Hollow_Disabled", "Hollow_Undep", "Hollow_Dep", "Hollow_Grayed", "Hollow_Pressed" },
  34.     { ID_SHADOW, 440, TBBORDER+2, 24, 24, -1, 2, "Shadow_Disabled", "Shadow_Undep", "Shadow_Dep", "Shadow_Grayed", "Shadow_Pressed" },
  35.     { ID_GLOSSARY, 480, TBBORDER+2, 24, 24, 0, 0, NULL, "Glossary_Undep", "Glossary_Dep", "Glossary_Grayed", "Glossary_Pressed" },
  36.     { ID_SPECIAL, 510, TBBORDER+2, 24, 24, 0, 0, NULL, "Special_Undep", "Special_Dep", "Special_Grayed", "Special_Pressed" },
  37.     { ID_LEFTRIGHT, 550, TBBORDER+2, 24, 24, -1, 0, "LR_Disabled", "LR_Undep", "LR_Dep", "LR_Grayed", "LR_Pressed" },
  38.     { ID_UPDOWN, 580, TBBORDER+2, 24, 24, -1, 0, "UD_Disabled", "UD_Undep", "UD_Dep", "UD_Grayed", "UD_Pressed" }
  39. };
  40.  
  41.  
  42.  
  43. LONG FAR PASCAL MainWinProc (HWND, WORD, WORD, LONG);
  44. extern LONG FAR PASCAL FileParentWinProc (HWND, WORD, WORD, LONG);
  45. extern LONG FAR PASCAL FileWinProc (HWND, WORD, WORD, LONG);
  46. extern LONG FAR PASCAL JeditProc (HWND, WORD, WORD, LONG);
  47. extern LONG FAR PASCAL JtextProc (HWND, WORD, WORD, LONG);
  48. extern LONG FAR PASCAL RulerProc (HWND, WORD, WORD, LONG);
  49. extern LONG FAR PASCAL ConvProc (HWND, WORD, WORD, LONG);
  50. extern LONG FAR PASCAL StatusProc (HWND, WORD, WORD, LONG);
  51. extern BOOL FAR PASCAL StatisticsProc (HWND, WORD, WORD, LONG);
  52. extern BOOL FAR PASCAL FileOpenDlgProc (HWND, WORD, WORD, LONG);
  53. extern BOOL FAR PASCAL FileSaveFormatProc (HWND, WORD, WORD, LONG);
  54. extern BOOL FAR PASCAL FileSaveAsDlgProc (HWND, WORD, WORD, LONG);
  55. extern BOOL FAR PASCAL DictionaryProc (HWND, WORD, WORD, LONG);
  56. extern LONG FAR PASCAL BigKanjiProc (HWND, WORD, WORD, LONG);
  57. extern BOOL FAR PASCAL KanjiInfoProc (HWND, WORD, WORD, LONG);
  58. extern BOOL FAR PASCAL JISInputProc (HWND, WORD, WORD, LONG);
  59. extern BOOL FAR PASCAL LookupProc (HWND, WORD, WORD, LONG);
  60. extern LONG FAR PASCAL LookupListProc (HWND, WORD, WORD, LONG);
  61. extern BOOL FAR PASCAL JISTableDlgProc (HWND, WORD, WORD, LONG);
  62. extern LONG FAR PASCAL JISTableProc (HWND, WORD, WORD, LONG);
  63. extern BOOL FAR PASCAL HotKeysProc (HWND, WORD, WORD, LONG);
  64. extern BOOL FAR PASCAL ChangeHotKeyProc (HWND, WORD, WORD, LONG);
  65. extern BOOL FAR PASCAL OptionsProc (HWND, WORD, WORD, LONG);
  66. extern BOOL FAR PASCAL GlossaryProc (HWND, WORD, WORD, LONG);
  67. extern BOOL FAR PASCAL GlossaryListProc (HWND, WORD, WORD, LONG);
  68. extern BOOL FAR PASCAL AboutProc (HWND, WORD, WORD, LONG);
  69. extern BOOL FAR PASCAL SimpleProc (HWND, WORD, WORD, LONG);
  70. extern LONG FAR PASCAL InputModeIconProc (HWND, WORD, WORD, LONG);
  71. extern BOOL FAR PASCAL InstalledFontsProc (HWND, WORD, WORD, LONG);
  72. extern BOOL FAR PASCAL UserConversionProc (HWND, WORD, WORD, LONG);
  73. extern BOOL FAR PASCAL EditUserConversionProc (HWND, WORD, WORD, LONG);
  74. extern BOOL FAR PASCAL SearchProc (HWND, WORD, WORD, LONG);
  75. extern BOOL FAR PASCAL ReplaceProc (HWND, WORD, WORD, LONG);
  76. extern BOOL FAR PASCAL ReplaceDlgProc (HWND, WORD, WORD, LONG);
  77. extern BOOL FAR PASCAL PrintProc (HWND, WORD, WORD, LONG);
  78. extern BOOL FAR PASCAL PageSetupProc (HWND, WORD, WORD, LONG);
  79. extern BOOL FAR PASCAL PrinterSetupProc (HWND, WORD, WORD, LONG);
  80. extern BOOL FAR PASCAL SummaryProc (HWND, WORD, WORD, LONG);
  81. extern BOOL FAR PASCAL HeaderProc (HWND, WORD, WORD, LONG);
  82. extern BOOL FAR PASCAL EditHeaderProc (HWND, WORD, WORD, LONG);
  83. extern BOOL FAR PASCAL FileFindProc (HWND, WORD, WORD, LONG);
  84. extern BOOL FAR PASCAL RunProc (HWND, WORD, WORD, LONG);
  85. extern BOOL FAR PASCAL TemplateProc (HWND, WORD, WORD, LONG);
  86. extern BOOL FAR PASCAL FormatParagraphProc (HWND, WORD, WORD, LONG);
  87.  
  88.  
  89. static void InitializeEverything(void)
  90. {
  91.     fileoptions = NULL;
  92.  
  93.     ReadOptionsFile();
  94.     InitPrinting();
  95.     InitFonts();
  96.     InitConversion();
  97.     ReadGlossary(global.glossary);
  98.     ReadConversionCache(global.convcache);
  99. }
  100.  
  101.  
  102.  
  103. void ErrorMessage(HWND hwnd, char *fmt, ...)
  104. {
  105.     va_list argptr;
  106.     char buffer[MAXLINELEN];
  107.  
  108.     va_start(argptr, fmt);
  109.     vsprintf(buffer, fmt, argptr);
  110.     va_end(argptr);
  111.  
  112.     MessageBeep(0);
  113.     MessageBox (hwnd, buffer, "Something is wrong...", MB_ICONEXCLAMATION | MB_OK);
  114. }
  115.  
  116.  
  117.  
  118. int Confirmation (HWND hwnd, char *fmt, ...)
  119. {
  120.     va_list argptr;
  121.     char buffer[MAXLINELEN];
  122.  
  123.     va_start(argptr, fmt);
  124.     vsprintf(buffer, fmt, argptr);
  125.     va_end(argptr);
  126.  
  127.     MessageBeep(0);
  128.     return (MessageBox (hwnd, buffer, "Please Confirm...", MB_ICONQUESTION | MB_YESNOCANCEL));
  129. }
  130.  
  131.  
  132.  
  133. int YesNo(HWND hwnd, char *fmt, ...)
  134. {
  135.     va_list argptr;
  136.     char buffer[MAXLINELEN];
  137.  
  138.     va_start(argptr, fmt);
  139.     vsprintf(buffer, fmt, argptr);
  140.     va_end(argptr);
  141.  
  142.     MessageBeep(0);
  143.     return (MessageBox (hwnd, buffer, "Please Confirm...", MB_ICONQUESTION | MB_YESNO));
  144. }
  145.  
  146.  
  147.  
  148. BOOL RetryMessage(char *fmt, ...)
  149. {
  150.     va_list argptr;
  151.     char buffer[MAXLINELEN];
  152.  
  153.     va_start(argptr, fmt);
  154.     vsprintf(buffer, fmt, argptr);
  155.     va_end(argptr);
  156.  
  157.     MessageBeep(0);
  158.     if (MessageBox (global.hwnd, buffer, "Something is wrong...",
  159.         MB_ICONEXCLAMATION | MB_RETRYCANCEL) == IDCANCEL) return (FALSE);
  160.     else
  161.         return (TRUE);
  162. }
  163.  
  164.  
  165.  
  166. static void AdjustAllChildWindows (int width, int height)
  167. {
  168.     int i;
  169.     int ToolBarHeight = 0, StatusBarHeight = 0;
  170.     RECT rect;
  171.  
  172.     if (global.tbhwnd != NULL) {
  173.         MoveWindow(global.tbhwnd, -1, -1, width + 2, TBHEIGHT + 2, TRUE);
  174.         ToolBarHeight = TBHEIGHT + 1;
  175.     }
  176.  
  177.     if (global.statushwnd != NULL) {
  178.         MoveWindow(global.statushwnd, -1, height - STATUSHEIGHT,
  179.                     width + 2, STATUSHEIGHT + 2, TRUE);
  180.         StatusBarHeight = STATUSHEIGHT;
  181.     }
  182.  
  183.     if (global.clienthwnd == NULL || global.convhwnd == NULL) return;
  184.  
  185.  
  186.     switch (global.listposition) {
  187.         case 0: MoveWindow(global.clienthwnd, 0, ToolBarHeight, width,
  188.                             height - StatusBarHeight - ToolBarHeight, TRUE);
  189.  
  190.                 if (!(GetWindowLong(global.convhwnd, GWL_STYLE) & WS_POPUP)) {
  191.                     DestroyWindow(global.convhwnd);
  192.                     global.convhwnd = CreateWindow("JWP Conversion Bar", NULL,
  193.                                                     WS_THICKFRAME | WS_VISIBLE | WS_POPUP,
  194.                                                     global.convbar.left, global.convbar.top,
  195.                                                     global.convbar.right, 0,
  196.                                                     global.hwnd, NULL, hInstance, NULL);
  197.                 }
  198.                 break;
  199.  
  200.         case 1: i = SYSFONT->height + 2 * BORDERSPACE +
  201.                         GetSystemMetrics(SM_CXVSCROLL) +
  202.                         2 * GetSystemMetrics(SM_CYBORDER);
  203.  
  204.                 if (GetWindowLong(global.convhwnd, GWL_STYLE) & WS_POPUP) {
  205.                     DestroyWindow(global.convhwnd);
  206.                     global.convhwnd = CreateWindow("JWP Conversion Bar", NULL,
  207.                                                     WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | WS_BORDER,
  208.                                                     -1, ToolBarHeight - 1, width + 2, i,
  209.                                                     global.hwnd, 3, hInstance, NULL);
  210.                 } else {
  211.                     MoveWindow(global.convhwnd, -1, ToolBarHeight - 1, width + 2, i, TRUE);
  212.                 }
  213.  
  214.                 MoveWindow(global.clienthwnd, 0, ToolBarHeight - 1 + i, width,
  215.                             height - StatusBarHeight - ToolBarHeight + 1 - i, TRUE);
  216.  
  217.                 break;
  218.  
  219.         case 2: i = SYSFONT->height + 2 * BORDERSPACE +
  220.                         GetSystemMetrics(SM_CXVSCROLL) +
  221.                         2 * GetSystemMetrics(SM_CYBORDER);
  222.  
  223.                 if (GetWindowLong(global.convhwnd, GWL_STYLE) & WS_POPUP) {
  224.                     DestroyWindow(global.convhwnd);
  225.                     global.convhwnd = CreateWindow("JWP Conversion Bar", NULL,
  226.                                                     WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | WS_BORDER,
  227.                                                     -1, height - StatusBarHeight - i, width + 2, i,
  228.                                                     global.hwnd, 3, hInstance, NULL);
  229.                 } else {
  230.                     MoveWindow(global.convhwnd, -1, height - StatusBarHeight - i,
  231.                                 width + 2, i, TRUE);
  232.                 }
  233.  
  234.                 MoveWindow(global.clienthwnd, 0, ToolBarHeight, width,
  235.                             height - StatusBarHeight - i - ToolBarHeight, TRUE);
  236.                 break;
  237.  
  238.     }
  239.  
  240.     InvalidateRect(global.hwnd, NULL, TRUE);
  241.     InvalidateRect(global.clienthwnd, NULL, TRUE);
  242. }
  243.  
  244.  
  245.  
  246. int PASCAL WinMain (HANDLE hThisInstance, HANDLE hPrevInstance,
  247.                     LPSTR lpszCmdParam, int nCmdShow)
  248. {
  249.     MSG                 msg;
  250.     HDC                 hdc;
  251.     WNDCLASS            wndclass;
  252.     RECT                rect;
  253.     HCURSOR             hcursor;
  254.     CLIENTCREATESTRUCT  clientcreate;
  255.     HWND                signonhwnd;
  256.     HANDLE              haccel;
  257.     extern BOOL         Read3DDialogOption(void);
  258.  
  259.  
  260.     if (!(GetWinFlags() & WF_PMODE)) {
  261.         ErrorMessage(global.hwnd, "This program requires protected mode.");
  262.         return (-1);
  263.     }
  264.  
  265.     hInstance = hThisInstance;
  266.  
  267.     hcursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
  268.     ShowCursor(TRUE);
  269.  
  270.     FullMenu = LoadMenu(hInstance, "FileMenu");
  271.     MinimalMenu = LoadMenu(hInstance, "NoFileMenu");
  272.  
  273.  
  274. #ifdef CTL3D
  275.     /* 3D dialogs */
  276.  
  277.     Dialogs3D = Read3DDialogOption();
  278.  
  279.     if (Dialogs3D) {
  280.         Dialogs3D = Ctl3dRegister(hInstance);
  281.         if (Dialogs3D) Ctl3dAutoSubclass(hInstance);
  282.     }
  283. #endif CTL3D
  284.  
  285.  
  286.     /* Register window classes */
  287.  
  288.     if (!hPrevInstance) {
  289.         wndclass.style          = CS_HREDRAW | CS_VREDRAW;
  290.         wndclass.lpfnWndProc    = MainWinProc;
  291.         wndclass.cbClsExtra     = 0;
  292.         wndclass.cbWndExtra     = 0;
  293.         wndclass.hInstance      = hThisInstance;
  294.         wndclass.hIcon          = LoadIcon(hThisInstance, "Icon1");
  295.         wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
  296.         wndclass.hbrBackground  = COLOR_APPWORKSPACE + 1;
  297.         wndclass.lpszMenuName   = NULL;
  298.         wndclass.lpszClassName  = "JWP Frame";
  299.  
  300.         RegisterClass(&wndclass);
  301.  
  302.         wndclass.cbWndExtra     = sizeof(FILEOPTIONS *);
  303.         wndclass.lpfnWndProc    = FileParentWinProc;
  304.         wndclass.hIcon          = LoadIcon(hThisInstance, "DocIcon");
  305.         wndclass.hbrBackground  = COLOR_WINDOW + 1;
  306.         wndclass.lpszClassName  = "JWP File Parent";
  307.  
  308.         RegisterClass(&wndclass);
  309.  
  310.         wndclass.style          = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  311.         wndclass.lpfnWndProc    = FileWinProc;
  312.         wndclass.hCursor        = LoadCursor(NULL, IDC_IBEAM);
  313.         wndclass.lpszClassName  = "JWP File";
  314.  
  315.         RegisterClass(&wndclass);
  316.  
  317.         wndclass.style          = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  318.         wndclass.cbWndExtra     = sizeof(FILEOPTIONS *) + 2 * sizeof(WORD) + sizeof(HWND);
  319.         wndclass.lpfnWndProc    = JeditProc;
  320.         wndclass.hIcon          = NULL;
  321.         wndclass.lpszClassName  = "JWP Japanese Edit Control";
  322.  
  323.         RegisterClass(&wndclass);
  324.  
  325.         wndclass.cbWndExtra     = 0;
  326.         wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
  327.         wndclass.lpfnWndProc    = RulerProc;
  328.         wndclass.lpszClassName  = "JWP Ruler";
  329.  
  330.         RegisterClass(&wndclass);
  331.  
  332.         wndclass.cbWndExtra     = 0;
  333.         wndclass.lpfnWndProc    = LookupListProc;
  334.         wndclass.lpszClassName  = "JWP Kanji Lookup List";
  335.  
  336.         RegisterClass(&wndclass);
  337.  
  338.         wndclass.cbWndExtra     = sizeof(KANJI *) + sizeof(int) + sizeof(BOOL);
  339.         wndclass.lpfnWndProc    = JtextProc;
  340.         wndclass.hbrBackground  = NULL;
  341.         wndclass.lpszClassName  = "JWP Text Box";
  342.  
  343.         RegisterClass(&wndclass);
  344.  
  345.         wndclass.cbWndExtra     = 0;
  346.         wndclass.lpfnWndProc    = JISTableProc;
  347.         wndclass.lpszClassName  = "JWP JIS Table";
  348.  
  349.         RegisterClass(&wndclass);
  350.  
  351.         wndclass.style          = CS_HREDRAW | CS_VREDRAW;
  352.         wndclass.cbWndExtra     = sizeof(WORD);
  353.         wndclass.lpfnWndProc    = BigKanjiProc;
  354.         wndclass.lpszClassName  = "JWP Big Kanji";
  355.  
  356.         RegisterClass(&wndclass);
  357.  
  358.         wndclass.cbWndExtra     = sizeof(HWND);
  359.         wndclass.lpfnWndProc    = InputModeIconProc;
  360.         wndclass.lpszClassName  = "JWP Input Mode Icon";
  361.  
  362.         RegisterClass(&wndclass);
  363.  
  364.         wndclass.cbWndExtra     = 0;
  365.         wndclass.lpfnWndProc    = ConvProc;
  366.         wndclass.hbrBackground  = NULL;
  367.         wndclass.lpszClassName  = "JWP Conversion Bar";
  368.  
  369.         RegisterClass(&wndclass);
  370.  
  371.         wndclass.lpfnWndProc    = StatusProc;
  372.         wndclass.lpszClassName  = "JWP Status";
  373.  
  374.         RegisterClass(&wndclass);
  375.     }
  376.  
  377.  
  378.     global.clienthwnd = NULL;
  379.  
  380.     {
  381.         BOOL maximized;
  382.         int x, y, width, length;
  383.  
  384.         maximized = ReadProgramSizeOptions (&x, &y, &width, &length);
  385.  
  386.         if (maximized) {
  387.             global.hwnd = CreateWindow("JWP Frame", PROGNAME,
  388.                                         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_MAXIMIZE,
  389.                                         CW_USEDEFAULT, CW_USEDEFAULT, width, length,
  390.                                         NULL, NULL, hThisInstance, NULL);
  391.             nCmdShow = SW_SHOWMAXIMIZED;
  392.         } else {
  393.             global.hwnd = CreateWindow("JWP Frame", PROGNAME,
  394.                                         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  395.                                         x, y, width, length,
  396.                                         NULL, NULL, hThisInstance, NULL);
  397.         }
  398.     }
  399.  
  400.     ShowWindow(global.hwnd, nCmdShow);
  401.     UpdateWindow(global.hwnd);
  402.  
  403.  
  404.     /* Create the sign-on message */
  405.  
  406.     signonhwnd = CreateDialog(hInstance, "SignOn", global.hwnd, SimpleProc);
  407.  
  408.  
  409.     /* Load accelerators */
  410.  
  411.     haccel = LoadAccelerators(hInstance, "Accelerator");
  412.     
  413.  
  414.     /* Initialize variables */
  415.  
  416.     global.mode = M_KANA;
  417.     global.active = NULL;
  418.     global.convsel = -1;
  419.     global.glisthwnd = NULL;
  420.  
  421.     global.cpos = (POINT far *) BlockAlloc(CPOSPAGESIZE);
  422.     global.cpossize = CPOSPAGESIZE;
  423.     global.cpospara = NULL;
  424.     global.cposcount = 0;
  425.  
  426.     InitializeEverything();
  427.  
  428.     global.leading = (int) ((double) PRINTFONT->leading * global.dispscale);
  429.     if (global.leading % 2 != 0) global.leading++;
  430.  
  431.     global.spacing = (int) ((double) PRINTFONT->spacing * global.dispscale);
  432.     if (global.spacing % 2 != 0) global.spacing++;
  433.  
  434.     SwitchMenu(0);      /* Full menu */
  435.  
  436.  
  437.     /* Take away the sign-on message */
  438.  
  439.     DestroyWindow(signonhwnd);
  440.  
  441.  
  442.     /* Others */
  443.  
  444.     global.gloslistdlg = MakeProcInstance(GlossaryListProc, hInstance);
  445.  
  446.     hdc = GetDC(global.hwnd);
  447.     GetTextMetrics(hdc, &(global.textmetric));
  448.     global.borderspace = AVGWIDTH;
  449.     ReleaseDC(global.hwnd, hdc);
  450.  
  451.  
  452.     if (global.draftview) CheckMenuItem(hmenu, IDM_VIEWDRAFT, MF_CHECKED | MF_BYCOMMAND);
  453.     if (global.showstatus) SendMessage(global.hwnd, WM_COMMAND, IDM_VIEWSTATUS, 0L);
  454.     if (global.showribbon) SendMessage(global.hwnd, WM_COMMAND, IDM_VIEWRIBBON, 0L);
  455.     if (global.showruler) CheckMenuItem(hmenu, IDM_VIEWRULER, MF_CHECKED | MF_BYCOMMAND);
  456.     if (global.showspecial) SendMessage(global.tbhwnd, BM_SETSTATE, TRUE, ID_SPECIAL);
  457.  
  458.     /* Create the conversion bar */
  459.  
  460.     switch (global.listposition) {
  461.         case 0: global.convhwnd = CreateWindow("JWP Conversion Bar", "Kanji List",
  462.                                                 WS_VISIBLE | WS_THICKFRAME | WS_POPUP,
  463.                                                 0, 0, 0, 0, global.hwnd, NULL, hInstance, NULL);
  464.                 ShowWindow(global.convhwnd, SW_SHOW);
  465.                 break;
  466.         case 1:
  467.         case 2: global.convhwnd = CreateWindow("JWP Conversion Bar", NULL,
  468.                                                 WS_CHILD | WS_VISIBLE | WS_BORDER,
  469.                                                 0, 0, 0, 0, global.hwnd, 3, hInstance, NULL);
  470.                 break;
  471.     }
  472.  
  473.  
  474.     /* Create the Client window */
  475.  
  476.     clientcreate.hWindowMenu = GetSubMenu(FullMenu, 6);
  477.     clientcreate.idFirstChild = ID_FIRSTFILE;
  478.  
  479.     global.clienthwnd = CreateWindow ("MDICLIENT", NULL,
  480.                                       WS_CHILD | WS_VISIBLE,
  481.                                       0, 0, 0, 0, global.hwnd, 1, hInstance,
  482.                                       (LPSTR) &clientcreate);
  483.  
  484.     /* Create the glossary list */
  485.  
  486.     if (global.glistvisible) SendMessage(global.hwnd, WM_COMMAND, IDM_VIEWGLOSSARY, 0L);
  487.  
  488.     SetActiveWindow(global.hwnd);
  489.  
  490.  
  491.     GetClientRect(global.hwnd, &rect);
  492.     AllInitialized = TRUE;
  493.     AdjustAllChildWindows(rect.right, rect.bottom);
  494.     UpdateWindow(global.hwnd);
  495.  
  496.     ShowCursor(FALSE);
  497.     SetCursor(hcursor);
  498.  
  499.  
  500.     /* Now create an empty file window? */
  501.  
  502.     {
  503.         char buffer[MAXLINELEN];
  504.         char word[MAXLINELEN];
  505.         char remains[MAXLINELEN];
  506.  
  507.         word[0] = '\0';
  508.         remains[0] = '\0';
  509.         _fstrcpy(buffer, lpszCmdParam);
  510.         sscanf(buffer, "%s %[^\n]", word, remains);
  511.  
  512.         if (!word[0]) {
  513.             global.active = NewFile (FN_NORMAL, TRUE);
  514.  
  515.             if (global.active != NULL) {
  516.                 char buffer[50];
  517.  
  518.                 global.active->filename[0] = '\0';
  519.                 sprintf(buffer, "Untitled #%d", ++Untitled);
  520.                 ShowFileWindow(buffer, global.active);
  521.             }
  522.         } else {
  523.             do {
  524.                 if (!DoFileOpen(word)) {
  525.                     ErrorMessage(global.hwnd, "Cannot open file '%s'.", word);
  526.                 }
  527.  
  528.                 strcpy(buffer, remains);
  529.                 word[0] = '\0';
  530.                 remains[0] = '\0';
  531.                 sscanf(buffer, "%s %[^\n]", word, remains);
  532.             } while (word[0]);
  533.         }
  534.     }
  535.  
  536.  
  537.     if (Dialogs3D != global.ctl3d) {
  538.         ErrorMessage(global.hwnd, PROGNAME " cannot create 3D dialog boxes!  "
  539.                                   "Maybe you are not running Windows 3.1?");
  540.     }
  541.  
  542.  
  543.     /* Message loop */
  544.  
  545.     while (GetMessage(&msg, NULL, 0, 0)) {
  546.         if (!TranslateAccelerator (global.hwnd, haccel, &msg)) {
  547.             TranslateMessage(&msg);
  548.             DispatchMessage(&msg);
  549.         }
  550.     }
  551.  
  552. #ifdef CTL3D
  553.     if (Dialogs3D) Ctl3dUnregister(hInstance);
  554. #endif CTL3D
  555.  
  556.     return (msg.wParam);
  557. }
  558.  
  559.  
  560.  
  561. void CenterDialogBox (HWND hwnd)
  562. {
  563.     RECT rect;
  564.  
  565.     GetWindowRect(hwnd, &rect);
  566.     OffsetRect(&rect, -rect.left, -rect.top);
  567.     MoveWindow(hwnd, ((GetSystemMetrics(SM_CXSCREEN) - rect.right ) / 2 + 4) & ~7,
  568.                      (GetSystemMetrics(SM_CYSCREEN) - rect.bottom) / 2,
  569.                      rect.right, rect.bottom, FALSE);
  570. }
  571.  
  572.  
  573.  
  574. BOOL FAR PASCAL CloseAllEnumProc (HWND hwnd, LONG lParam)
  575. {
  576.     FILEOPTIONS *f;
  577.  
  578.     if (GetWindow(hwnd, GW_OWNER)) return (TRUE);      /* Check for icon title */
  579.  
  580.     for (f = fileoptions; f != NULL; f = f->next) if (f->parent == hwnd) break;
  581.  
  582.     if (f == NULL) return (TRUE);       /* Not a valid window */
  583.  
  584.  
  585.     SendMessage(global.clienthwnd, WM_MDIMAXIMIZE, hwnd, 0L);
  586.  
  587.     if (!SendMessage(hwnd, WM_QUERYENDSESSION, 0, 0L)) return (FALSE);
  588.  
  589.     SendMessage(global.clienthwnd, WM_MDIDESTROY, hwnd, 0L);
  590.  
  591.     return (TRUE);
  592. }
  593.  
  594.  
  595.  
  596. static BOOL RedisplayFile (FILEOPTIONS *f)
  597. {
  598.     HDC hdc, hdcmem;
  599.     HBITMAP hbitmap;
  600.     HBRUSH hbrush;
  601.     RECT rect;
  602.  
  603.     if (IsIconic(f->hwnd) || IsIconic(f->parent)) return (FALSE);
  604.  
  605.     hdc = GetDC(f->hwnd);
  606.     hdcmem = CreateCompatibleDC(hdc);
  607.     SetTextColor(hdcmem, GetSysColor(COLOR_WINDOWTEXT));
  608.     SetBkColor(hdcmem, GetSysColor(COLOR_WINDOW));
  609.  
  610.     GetClientRect(f->hwnd, &rect);
  611.  
  612.     hbitmap = CreateCompatibleBitmap (hdc, rect.right, rect.bottom);
  613.     if (hbitmap == NULL) {
  614.         InvalidateRect(f->hwnd, NULL, TRUE);
  615.         UpdateWindow(f->hwnd);
  616.         return (FALSE);
  617.     }
  618.  
  619.     SelectObject(hdcmem, hbitmap);
  620.     hbrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
  621.     FillRect(hdcmem, &rect, hbrush);
  622.     DeleteObject(hbrush);
  623.  
  624.     HideCaret(f->hwnd);
  625.     RedrawFile(f, hdcmem, 0, 0, &rect, global.showspecial);
  626.  
  627.     BitBlt(hdc, 0, 0, rect.right, rect.bottom, hdcmem, 0, 0, SRCCOPY);
  628.  
  629.     if (f == global.active) {
  630.         if (FindCaret(f, TRUE))
  631.             DoCaret(f, CURX(f), CURY(f) - CURLINE(f)->height, TRUE);
  632.         else
  633.             DoCaret(f, 0, 0, FALSE);
  634.     }
  635.  
  636.     ShowCaret(f->hwnd);
  637.  
  638.     ReleaseDC(f->hwnd, hdc);
  639.     DeleteDC(hdcmem);
  640.     DeleteObject(hbitmap);
  641.  
  642.     return (TRUE);
  643. }
  644.  
  645.  
  646.  
  647. LONG FAR PASCAL MainWinProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  648. {
  649.     int         i;
  650.     RECT        rect;
  651.     char        buffer[15], far *cp;
  652.     HCURSOR        hcursor;
  653.     FILEOPTIONS *f;
  654.     static      LastSearchIsReplace = FALSE;
  655.  
  656.  
  657.     /* Takes care of menu items */
  658.  
  659.     switch (message) {
  660.  
  661.     case WM_MOVE:
  662.         if (AllInitialized) {
  663.             GetWindowRect(hwnd, &rect);
  664.  
  665.             if (global.glisthwnd != NULL) {
  666.                 SetWindowPos(global.glisthwnd, NULL,
  667.                              rect.left + global.glistsize.left,
  668.                              rect.top + global.glistsize.top,
  669.                              0, 0, SWP_NOSIZE | SWP_NOZORDER);
  670.             }
  671.             if (global.convhwnd != NULL && global.listposition == 0) {
  672.                 SetWindowPos(global.convhwnd, NULL,
  673.                              rect.left + global.convbar.left,
  674.                              rect.top + global.convbar.top,
  675.                              0, 0, SWP_NOSIZE | SWP_NOZORDER);
  676.             }
  677.  
  678.             SetActiveWindow(hwnd);
  679.         }
  680.         break;
  681.  
  682.     case WM_SIZE:
  683.         if (AllInitialized) {
  684.             AdjustAllChildWindows (LOWORD(lParam), HIWORD(lParam));
  685.  
  686.             for (f = fileoptions; f != NULL; f = f->next) {
  687.                 SELPARA1(f) = SELPARA2(f) = NULL;
  688.                 SELPOS1(f) = SELPOS2(f) = 0;
  689.                 SELTYPE(f) = SEL_SELECTION;
  690.                 SELNOW(f) = FALSE;
  691.             }
  692.         }
  693.         return (0);
  694.  
  695.     case WM_KEYDOWN:
  696.     case WM_CHAR:
  697.         if (global.active != NULL)
  698.             SendMessage(global.active->hwnd, message, wParam, lParam);
  699.         return (0);
  700.  
  701.     case WM_INITMENUPOPUP: {
  702.         if (hmenu == MinimalMenu) {
  703.             /* Nothing */
  704.         } else if (hmenu == FullMenu) {
  705.             if (global.active == NULL) return (0);
  706.  
  707.             switch (LOWORD(lParam)) {
  708.                 case 2:     /* Edit */
  709.                     if (SELPARA1(global.active) == NULL) {
  710.                         EnableMenuItem(hmenu, IDM_EDITCUT, MF_BYCOMMAND | MF_GRAYED);
  711.                         EnableMenuItem(hmenu, IDM_EDITCOPY, MF_BYCOMMAND | MF_GRAYED);
  712.                     } else {
  713.                         EnableMenuItem(hmenu, IDM_EDITCUT, MF_BYCOMMAND | MF_ENABLED);
  714.                         EnableMenuItem(hmenu, IDM_EDITCOPY, MF_BYCOMMAND | MF_ENABLED);
  715.                     }
  716.                     if (ClipboardFull()) {
  717.                         EnableMenuItem(hmenu, IDM_EDITPASTE, MF_BYCOMMAND | MF_ENABLED);
  718.                     } else {
  719.                         EnableMenuItem(hmenu, IDM_EDITPASTE, MF_BYCOMMAND | MF_GRAYED);
  720.                     }
  721.                     if (global.active->undo == NULL) {
  722.                         EnableMenuItem(hmenu, IDM_EDITUNDO, MF_BYCOMMAND | MF_GRAYED);
  723.                     } else {
  724.                         EnableMenuItem(hmenu, IDM_EDITUNDO, MF_BYCOMMAND | MF_ENABLED);
  725.                     }
  726.                     if (global.active->redo == NULL) {
  727.                         EnableMenuItem(hmenu, IDM_EDITREDO, MF_BYCOMMAND | MF_GRAYED);
  728.                     } else {
  729.                         EnableMenuItem(hmenu, IDM_EDITREDO, MF_BYCOMMAND | MF_ENABLED);
  730.                     }
  731.                     break;
  732.  
  733.                 case 4:     /* Kanji */
  734.                     if (SELPARA1(global.active) == NULL) {
  735.                         EnableMenuItem(hmenu, IDM_KANJIINFO, MF_BYCOMMAND | MF_GRAYED);
  736.                     } else {
  737.                         EnableMenuItem(hmenu, IDM_KANJIINFO, MF_BYCOMMAND | MF_ENABLED);
  738.                     }
  739.                     if (SELPARA1(global.active) == NULL) {
  740.                         EnableMenuItem(hmenu, IDM_KANJICONVERT, MF_BYCOMMAND | MF_GRAYED);
  741.                     } else {
  742.                         EnableMenuItem(hmenu, IDM_KANJICONVERT, MF_BYCOMMAND | MF_ENABLED);
  743.                     }
  744.                     break;
  745.             }
  746.         }
  747.         return (0);
  748.     }
  749.  
  750.     case WM_COMMAND:
  751.  
  752.         if (HIBYTE(wParam) == ID_TOOLBAR) {
  753.             switch (LOBYTE(wParam)) {
  754.                 case ID_GLOSSARY:
  755.                     SendMessage(hwnd, WM_COMMAND, IDM_VIEWGLOSSARY, 0L);
  756.                     break;
  757.  
  758.                 case ID_SPECIAL:
  759.                     SendMessage(hwnd, WM_COMMAND, IDM_VIEWSPECIAL, 0L);
  760.                     break;
  761.  
  762.                 /*
  763.                 case ID_LEFTRIGHT:
  764.                     i = SendMessage(global.tbhwnd, BM_GETSTATE, 0, ID_LEFTRIGHT);
  765.                     if (!i) {
  766.                         SendMessage(global.tbhwnd, BM_SETSTATE, TRUE, ID_LEFTRIGHT);
  767.                         SendMessage(global.tbhwnd, BM_SETSTATE, FALSE, ID_UPDOWN);
  768.                     }
  769.                     break;
  770.  
  771.                 case ID_UPDOWN:
  772.                     i = SendMessage(global.tbhwnd, BM_GETSTATE, 0, ID_UPDOWN);
  773.                     if (!i) {
  774.                         SendMessage(global.tbhwnd, BM_SETSTATE, FALSE, ID_LEFTRIGHT);
  775.                         SendMessage(global.tbhwnd, BM_SETSTATE, TRUE, ID_UPDOWN);
  776.                     }
  777.                     break;
  778.                 */
  779.  
  780.                 case ID_KANA:
  781.                     if (global.mode != M_KANA) ToggleInputMode();
  782.                     if (global.active != NULL)
  783.                         TakeCareOfThings(global.active, FALSE);
  784.                     break;
  785.  
  786.                 case ID_ASCII:
  787.                     if (global.mode != M_ASCII) ToggleInputMode();
  788.                     if (global.active != NULL)
  789.                         TakeCareOfThings(global.active, FALSE);
  790.                     break;
  791.  
  792.                 case ID_CONVERT:
  793.                     if (global.active != NULL) {
  794.                         SendMessage(global.active->hwnd, WM_COMMAND, IDM_KANJICONVERT, 0L);
  795.                     }
  796.                     break;
  797.             }
  798.  
  799.             return (0);
  800.         }
  801.  
  802.  
  803.         switch (wParam) {
  804.             case IDM_EDITUNDO:
  805.             case IDM_EDITREDO:
  806.             case IDM_EDITCUT:
  807.             case IDM_EDITCOPY:
  808.             case IDM_EDITPASTE:
  809.             case IDM_EDITCLEAR:
  810.             case IDM_EDITSELECTALL:
  811.             case IDM_KANJICONVERT:
  812.             case IDM_KANJILCONVERT:
  813.             case IDM_KANJIINFO:
  814.                 if (global.active != NULL)
  815.                     SendMessage(global.active->hwnd, WM_COMMAND, wParam, 0L);
  816.                 return (0);
  817.  
  818.             case IDM_TOGGLEMODE:
  819.                 ToggleInputMode ();
  820.                 if (global.active != NULL)
  821.                     TakeCareOfThings(global.active, TRUE);
  822.                 return (0);
  823.  
  824.             case IDM_TOGGLEGLOSSARY:
  825.                 global.dynamicglossary = !global.dynamicglossary;
  826.                 return (0);
  827.  
  828.             case IDM_FILENEW: {
  829.                 extern char far *TplChosen;
  830.  
  831.                 i = DialogBox (hInstance, "FileNew", hwnd, TemplateProc);
  832.  
  833.                 switch (i) {
  834.                     case -2: return (0);    /* Cancel */
  835.                     case -1: break;         /* Use None */
  836.                     default: if (TplChosen != NULL && TplChosen[0]) {
  837.                                 CreateUsingTemplate(TplChosen, ++Untitled);
  838.                                 return (0);
  839.                              }
  840.                              break;
  841.                 }
  842.  
  843.                 global.active = NewFile (FN_NORMAL, TRUE);
  844.                 if (global.active != NULL) {
  845.                     global.active->filename[0] = '\0';
  846.                     sprintf(buffer, "Untitled #%d", ++Untitled);
  847.                     ShowFileWindow(buffer, global.active);
  848.                 } else {
  849.                     ErrorMessage(global.hwnd, "Cannot open any more file windows!");
  850.                 }
  851.                 return (0);
  852.             }
  853.  
  854.             case IDM_FILEOPEN:
  855.                 DoFileOpen(NULL);
  856.                 return (0);
  857.  
  858.             case IDM_FILECLOSE:
  859.                 if (global.active != NULL) {
  860.                     if (!SendMessage(global.active->parent, WM_QUERYENDSESSION, 0, 0L))
  861.                         return (0);
  862.  
  863.                     global.active->changed = FALSE;
  864.  
  865.                     SendMessage(global.clienthwnd, WM_MDIDESTROY, global.active->parent, 0L);
  866.                 }
  867.                 return (0);
  868.  
  869.             case IDM_FILESAVE:
  870.                 DoFileSaveAs(FALSE);
  871.                 return (0);
  872.  
  873.             case IDM_FILESAVEAS:
  874.                 DoFileSaveAs(TRUE);
  875.                 return (0);
  876.  
  877.             case IDM_FILEPRINT:
  878.                 if (global.active != NULL) {
  879.                     i = DialogBox (hInstance, "Print", hwnd, PrintProc);
  880.  
  881.                     hcursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
  882.                     ShowCursor(TRUE);
  883.                     if (i) PrintFile (global.active);
  884.                     ShowCursor(FALSE);
  885.                     SetCursor(hcursor);
  886.                 }
  887.                 return (0);
  888.  
  889.             case IDM_FILEPRINTER:
  890.                 i = DialogBox (hInstance, "PrinterSetup", hwnd, PrinterSetupProc);
  891.  
  892.                 if (i) ChangePrinterOrFonts();
  893.                 return (0);
  894.  
  895.             case IDM_FILESUMMARY:
  896.                 if (global.active != NULL) {
  897.                     DialogBox (hInstance, "Summary", hwnd, SummaryProc);
  898.                 }
  899.                 return (0);
  900.  
  901.  
  902.             case IDM_FILEHEADERS:
  903.                 if (global.active != NULL) {
  904.                     DialogBox (hInstance, "Header", hwnd, HeaderProc);
  905.                 }
  906.                 return (0);
  907.  
  908.             case IDM_FILEFIND:
  909.                 DialogBox (hInstance, "FileFind", hwnd, FileFindProc);
  910.                 return (0);
  911.  
  912.             case IDM_FILEEXIT:
  913.                 if (SendMessage(hwnd, WM_COMMAND, IDM_WINDOWCLOSE, 0L)) {
  914.                     SendMessage(hwnd, WM_DESTROY, 0, 0L);
  915.                 }
  916.                 return (0);
  917.  
  918.             case IDM_FILEABOUT:
  919.                 DialogBox (hInstance, "About", hwnd, AboutProc);
  920.                 return (0);
  921.  
  922.             case IDM_VIEWDRAFT: {
  923.                 FILEOPTIONS *f;
  924.                 HCURSOR hcursor;
  925.  
  926.                 if (global.draftview) {
  927.                     CheckMenuItem(hmenu, IDM_VIEWDRAFT, MF_UNCHECKED | MF_BYCOMMAND);
  928.                     global.draftview = FALSE;
  929.                 } else {
  930.                     CheckMenuItem(hmenu, IDM_VIEWDRAFT, MF_CHECKED | MF_BYCOMMAND);
  931.                     global.draftview = TRUE;
  932.                 }
  933.  
  934.                 /* Try to redraw the entire window */
  935.  
  936.                 hcursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
  937.                 ShowCursor(TRUE);
  938.  
  939.                 for (f = fileoptions; f != NULL; f = f->next) {
  940.                     ReformatFile(f);
  941.                     RedisplayFile(f);
  942.                 }
  943.  
  944.                 ShowCursor(FALSE);
  945.                 SetCursor(hcursor);
  946.  
  947.                 return (0);
  948.             }
  949.  
  950.             case IDM_VIEWRIBBON: {
  951.                 RECT rect;
  952.  
  953.                 GetClientRect(global.hwnd, &rect);
  954.  
  955.                 if (global.tbhwnd != NULL) {
  956.                     CheckMenuItem(hmenu, IDM_VIEWRIBBON, MF_UNCHECKED | MF_BYCOMMAND);
  957.                     DestroyWindow(global.fonthwnd);
  958.                     DestroyWindow(global.tbhwnd);
  959.                     global.tbhwnd = global.fonthwnd = NULL;
  960.                 } else {
  961.                     CheckMenuItem(hmenu, IDM_VIEWRIBBON, MF_CHECKED | MF_BYCOMMAND);
  962.  
  963.                     global.tbhwnd = CreateToolbar (global.hwnd, -1, -1, rect.right + 2, TBHEIGHT + 2,
  964.                                                     1, ID_TOOLBAR, sizeof(toolbar) / sizeof(TOOLBARICON),
  965.                                                     hInstance, toolbar, "X_Cursor");
  966.  
  967.                     /* Create the font list in the toolbar */
  968.  
  969.                     global.fonthwnd = CreateWindow("combobox", "Font List", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST,
  970.                                                     2 * TBBORDER, TBBORDER+2, 160 - 2 * TBBORDER, 200, global.tbhwnd, ID_FONTBOX, hInstance, NULL);
  971.                     EnableWindow(global.fonthwnd, FALSE);
  972.                 }
  973.  
  974.                 AdjustAllChildWindows (rect.right, rect.bottom);
  975.                 return (0);
  976.             }
  977.  
  978.             case IDM_VIEWSTATUS: {
  979.                 RECT rect;
  980.  
  981.                 GetClientRect(global.hwnd, &rect);
  982.  
  983.                 if (global.statushwnd != NULL) {
  984.                     CheckMenuItem(hmenu, IDM_VIEWSTATUS, MF_UNCHECKED | MF_BYCOMMAND);
  985.                     DestroyWindow(global.statushwnd);
  986.                     global.statushwnd = NULL;
  987.                 } else {
  988.                     CheckMenuItem(hmenu, IDM_VIEWSTATUS, MF_CHECKED | MF_BYCOMMAND);
  989.                     global.statushwnd = CreateWindow ("JWP Status", "Status Bar",
  990.                                                       WS_CHILD | WS_VISIBLE | WS_BORDER,
  991.                                                       0, 0, 0, 0, global.hwnd, 2, hInstance, NULL);
  992.                 }
  993.  
  994.                 AdjustAllChildWindows (rect.right, rect.bottom);
  995.                 return (0);
  996.             }
  997.  
  998.             case IDM_VIEWRULER: {
  999.                 BOOL On;
  1000.                 FILEOPTIONS *f;
  1001.  
  1002.                 On = !global.showruler;
  1003.                 global.showruler = On;
  1004.  
  1005.                 if (On) {
  1006.                     CheckMenuItem(hmenu, IDM_VIEWRULER, MF_CHECKED | MF_BYCOMMAND);
  1007.                 } else {
  1008.                     CheckMenuItem(hmenu, IDM_VIEWRULER, MF_UNCHECKED | MF_BYCOMMAND);
  1009.                 }
  1010.  
  1011.                 for (f = fileoptions; f != NULL; f = f->next) {
  1012.                     DisplayRuler(f, On);
  1013.                     //InvalidateRect(f->parent, NULL, TRUE);
  1014.                 }
  1015.                 return (0);
  1016.             }
  1017.  
  1018.             case IDM_VIEWGLOSSARY:
  1019.                 if (global.glisthwnd != NULL) {
  1020.                     SendMessage(global.tbhwnd, BM_SETSTATE, FALSE, ID_GLOSSARY);
  1021.                     CheckMenuItem(hmenu, IDM_VIEWGLOSSARY, MF_UNCHECKED | MF_BYCOMMAND);
  1022.                     DestroyWindow(global.glisthwnd);
  1023.                     global.glisthwnd = NULL;
  1024.                 } else {
  1025.                     SendMessage(global.tbhwnd, BM_SETSTATE, TRUE, ID_GLOSSARY);
  1026.                     CheckMenuItem(hmenu, IDM_VIEWGLOSSARY, MF_CHECKED | MF_BYCOMMAND);
  1027.                     global.glisthwnd = CreateDialog(hInstance, "GlossaryList", hwnd, global.gloslistdlg);
  1028.                     SetActiveWindow(hwnd);
  1029.                 }
  1030.                 return (0);
  1031.  
  1032.             case IDM_VIEWSPECIAL: {
  1033.                 FILEOPTIONS *f;
  1034.                 HCURSOR hcursor;
  1035.  
  1036.                 if (global.showspecial) {
  1037.                     SendMessage(global.tbhwnd, BM_SETSTATE, FALSE, ID_SPECIAL);
  1038.                     CheckMenuItem(hmenu, IDM_VIEWSPECIAL, MF_UNCHECKED | MF_BYCOMMAND);
  1039.                     global.showspecial = FALSE;
  1040.                 } else {
  1041.                     SendMessage(global.tbhwnd, BM_SETSTATE, TRUE, ID_SPECIAL);
  1042.                     CheckMenuItem(hmenu, IDM_VIEWSPECIAL, MF_CHECKED | MF_BYCOMMAND);
  1043.                     global.showspecial = TRUE;
  1044.                 }
  1045.  
  1046.                 /* Try to redraw the entire window */
  1047.  
  1048.                 hcursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
  1049.                 ShowCursor(TRUE);
  1050.                 for (f = fileoptions; f != NULL; f = f->next) RedisplayFile(f);
  1051.                 ShowCursor(FALSE);
  1052.                 SetCursor(hcursor);
  1053.                 return (0);
  1054.             }
  1055.  
  1056.             case IDM_EDITSEARCH:
  1057.                 if (global.active == NULL) return (0);
  1058.                 i = DialogBox (hInstance, "Search", hwnd, SearchProc);
  1059.                 if (i) {
  1060.                     DoSearch();
  1061.                     LastSearchIsReplace = FALSE;
  1062.                 }
  1063.                 return (0);
  1064.  
  1065.             case IDM_CONTINUESEARCH:
  1066.                 if (global.active == NULL) return (0);
  1067.                 if (LastSearchIsReplace) DoReplace(); else DoSearch();
  1068.                 return (0);
  1069.  
  1070.             case IDM_EDITREPLACE:
  1071.                 if (global.active == NULL) return (0);
  1072.                 i = DialogBox (hInstance, "Replace", hwnd, ReplaceProc);
  1073.                 if (i) {
  1074.                     DoReplace();
  1075.                     LastSearchIsReplace = TRUE;
  1076.                 }
  1077.                 return (0);
  1078.  
  1079.             case IDM_WINDOWTILE:
  1080.                 SendMessage(global.clienthwnd, WM_MDITILE, 0, 0L);
  1081.                 return (0);
  1082.  
  1083.             case IDM_WINDOWCASCADE:
  1084.                 SendMessage(global.clienthwnd, WM_MDICASCADE, 0, 0L);
  1085.                 return (0);
  1086.  
  1087.             case IDM_WINDOWARRANGE:
  1088.                 SendMessage(global.clienthwnd, WM_MDIICONARRANGE, 0, 0L);
  1089.                 return (0);
  1090.  
  1091.             case IDM_WINDOWCLOSE: {
  1092.                 BOOL DoIt;
  1093.  
  1094.                 /* Any file opened? */
  1095.                 if (fileoptions == NULL) return (TRUE);
  1096.  
  1097.                 DoIt = EnumChildWindows(global.clienthwnd, CloseAllEnumProc, 0L);
  1098.  
  1099.                 if (DoIt) SwitchMenu (1);     /* Minimal menu */
  1100.                 return (DoIt);
  1101.             }
  1102.  
  1103.             case IDM_UTILITIESSTAT:
  1104.                 DialogBox (hInstance, "Statistics", hwnd, StatisticsProc);
  1105.                 return (0);
  1106.  
  1107.             case IDM_KANJIINPUT:
  1108.                 if (global.active != NULL) curfile = global.active;
  1109.                 else curfile = NULL;
  1110.  
  1111.                 DialogBox (hInstance, "KanjiInput", global.hwnd, JISInputProc);
  1112.                 return (0);
  1113.  
  1114.             case IDM_KANJILOOKUP:
  1115.                 if (global.active != NULL) curfile = global.active;
  1116.                 else curfile = NULL;
  1117.  
  1118.                 DialogBox (hInstance, "KanjiLookup", global.hwnd, LookupProc);
  1119.                 return (0);
  1120.  
  1121.             case IDM_KANJITABLE:
  1122.                 if (global.active != NULL) curfile = global.active;
  1123.                 else curfile = NULL;
  1124.  
  1125.                 DialogBox (hInstance, "JISTable", global.hwnd, JISTableDlgProc);
  1126.                 return (0);
  1127.  
  1128.             case IDM_UTILITIESOPTIONS:
  1129.                 DialogBox (hInstance, "Options", hwnd, OptionsProc);
  1130.  
  1131.                 /* 3D dialog boxes */
  1132.  
  1133. #ifdef CTL3D
  1134.                 if (Dialogs3D != global.ctl3d) {
  1135.                     if (Dialogs3D) {
  1136.                         Ctl3dUnregister(hInstance);
  1137.                         Dialogs3D = FALSE;
  1138.                     } else {
  1139.                         Dialogs3D = Ctl3dRegister(hInstance);
  1140.                         if (Dialogs3D) {
  1141.                             Ctl3dAutoSubclass(hInstance);
  1142.                         } else {
  1143.                             ErrorMessage(global.hwnd, PROGNAME " cannot create 3D dialog boxes!  "
  1144.                                                       "Maybe you are not running Windows 3.1?");
  1145.                             global.ctl3d = FALSE;
  1146.                         }
  1147.                     }
  1148.                 }
  1149. #endif CTL3D
  1150.  
  1151.                 return (0);
  1152.  
  1153.             case IDM_UTILITIESDICT: {
  1154.                 INPUTMODE oldmode;
  1155.  
  1156.                 oldmode = global.mode;
  1157.                 DialogBox (hInstance, "Dictionary", hwnd, DictionaryProc);
  1158.  
  1159.                 if (oldmode != global.mode) ToggleInputMode();
  1160.  
  1161.                 return (0);
  1162.             }
  1163.  
  1164.             case IDM_UTILITIESHOTKEYS:
  1165.                 DialogBox (hInstance, "HotKeys", hwnd, HotKeysProc);
  1166.                 return (0);
  1167.  
  1168.             case IDM_UTILITIESGLOSSARY: {
  1169.                 INPUTMODE oldmode;
  1170.                 BOOL dynamic;
  1171.  
  1172.                 oldmode = global.mode;
  1173.                 dynamic = global.dynamicglossary;
  1174.                 global.dynamicglossary = FALSE;
  1175.  
  1176.                 DialogBox (hInstance, "Glossary", hwnd, GlossaryProc);
  1177.  
  1178.                 if (oldmode != global.mode) ToggleInputMode();
  1179.                 global.dynamicglossary = dynamic;
  1180.  
  1181.                 return (0);
  1182.             }
  1183.  
  1184.             case IDM_UTILITIESCONVERT:
  1185.                 DialogBox (hInstance, "UserDict", hwnd, UserConversionProc);
  1186.                 return (0);
  1187.  
  1188.             case IDM_UTILITIESFONTS:
  1189.                 i = DialogBox (hInstance, "KanjiFonts", hwnd, InstalledFontsProc);
  1190.  
  1191.                 if (i) ChangePrinterOrFonts();
  1192.                 return (0);
  1193.  
  1194.             case IDM_FILERUN:
  1195.                 DialogBox (hInstance, "RunProg", hwnd, RunProc);
  1196.                 return (0);
  1197.  
  1198.             case IDM_FILE1:
  1199.             case IDM_FILE2:
  1200.             case IDM_FILE3:
  1201.             case IDM_FILE4: {
  1202.                 char *cp;
  1203.                 extern char *GetQuickFile(int);
  1204.  
  1205.                 cp = GetQuickFile(wParam - IDM_FILE1);
  1206.                 if (cp != NULL) {
  1207.                     if (!DoFileOpen(cp)) {
  1208.                         ErrorMessage(global.hwnd, "Cannot open file '%s'.", cp);
  1209.                     }
  1210.                 }
  1211.                 return (0);
  1212.             }
  1213.  
  1214.             case IDM_FORMATPAGE: {
  1215.                 FILEOPTIONS *f;
  1216.  
  1217.                 i = DialogBox (hInstance, "PageSetup", hwnd, PageSetupProc);
  1218.  
  1219.                 switch (i) {
  1220.                     case 0: break;
  1221.  
  1222.                     case 1: if (global.active != NULL) {
  1223.                                 global.active->linelen = CalcLineLength(global.active);
  1224.                                 ReformatFile(global.active);
  1225.                                 InvalidateRect(global.active->hwnd, NULL, TRUE);
  1226.                             }
  1227.                             break;
  1228.  
  1229.                     case 2: for (f = fileoptions; f != NULL; f = f->next) {
  1230.                                 f->linelen = CalcLineLength(f);
  1231.                                 ReformatFile(f);
  1232.                                 InvalidateRect(f->hwnd, NULL, TRUE);
  1233.                             }
  1234.                             break;
  1235.                 }
  1236.  
  1237.                 return (0);
  1238.             }
  1239.  
  1240.             case IDM_FORMATPARAGRAPH: {
  1241.                 POSITION p;
  1242.  
  1243.                 if (global.active == NULL) return (0);
  1244.                 i = DialogBox (hInstance, "FormatParagraph", hwnd, FormatParagraphProc);
  1245.  
  1246.                 if (i) {
  1247.                     if (SELPARA1(global.active) != NULL) {
  1248.                         PARAOF(p) = SELPARA1(global.active);
  1249.                         LINEOF(p) = PARAOF(p)->lines;
  1250.                         POSOF(p) = 0;
  1251.  
  1252.                         ReformatParagraph(global.active, p, SELPARA2(global.active)->next, OP_UPDATE | OP_MOVETOEND);
  1253.                     } else {
  1254.                         PARAOF(p) = CURPARA(global.active);
  1255.                         LINEOF(p) = PARAOF(p)->lines;
  1256.                         POSOF(p) = 0;
  1257.  
  1258.                         ReformatParagraph(global.active, p, PARAOF(p)->next, OP_UPDATE | OP_MOVETOEND);
  1259.                     }
  1260.                     SetReformatProc(NULL);
  1261.                 }
  1262.                 return (0);
  1263.             }
  1264.  
  1265.             case IDM_HELPINDEX:
  1266.             case IDM_HELPINTRODUCTION:
  1267.             case IDM_HELPENTERTEXT:
  1268.             case IDM_HELPMOVING:
  1269.             case IDM_HELPKANJIS:
  1270.             case IDM_HELPSPECIAL:
  1271.             case IDM_HELPFILES:
  1272.             case IDM_HELPPRINTING:
  1273.             case IDM_HELPTECHSUPPORT: {
  1274.                 switch (wParam) {
  1275.                     case IDM_HELPINDEX:
  1276.                         WinHelp(global.hwnd, global.help, HELP_INDEX, NULL);
  1277.                         return (0);
  1278.                     case IDM_HELPONHELP:
  1279.                         WinHelp(global.hwnd, NULL, HELP_HELPONHELP, NULL);
  1280.                         //WinHelp(global.hwnd, "C:\\WINDOWS\\WINHELP.HLP", HELP_INDEX, NULL);
  1281.                         return (0);
  1282.                     case IDM_HELPSEARCH:
  1283.                         WinHelp(global.hwnd, global.help, HELP_KEY, NULL);
  1284.                         return (0);
  1285.                     case IDM_HELPINTRODUCTION:
  1286.                         WinHelp(global.hwnd, global.help, HELP_CONTEXT, Topic_Introduction);
  1287.                         return (0);
  1288.                     case IDM_HELPENTERTEXT:
  1289.                         WinHelp(global.hwnd, global.help, HELP_CONTEXT, Topic_EnterText);
  1290.                         return (0);
  1291.                     case IDM_HELPMOVING:
  1292.                         WinHelp(global.hwnd, global.help, HELP_CONTEXT, Topic_MovingAround);
  1293.                         return (0);
  1294.                     case IDM_HELPKANJIS:
  1295.                         WinHelp(global.hwnd, global.help, HELP_CONTEXT, Topic_ManagingKanjis);
  1296.                         return (0);
  1297.                     case IDM_HELPSPECIAL:
  1298.                         WinHelp(global.hwnd, global.help, HELP_CONTEXT, Topic_SpecialFeatures);
  1299.                         return (0);
  1300.                     case IDM_HELPFILES:
  1301.                         WinHelp(global.hwnd, global.help, HELP_CONTEXT, Topic_WorkingWithFiles);
  1302.                         return (0);
  1303.                     case IDM_HELPPRINTING:
  1304.                         WinHelp(global.hwnd, global.help, HELP_CONTEXT, Topic_Printing);
  1305.                         return (0);
  1306.                     case IDM_HELPTECHSUPPORT:
  1307.                         WinHelp(global.hwnd, global.help, HELP_CONTEXT, Topic_TechnicalSupport);
  1308.                         return (0);
  1309.                 }
  1310.             }
  1311.         }
  1312.         break;
  1313.  
  1314.     case WM_SYSCOMMAND:
  1315.         switch (wParam & 0xfff0) {
  1316.             case SC_CLOSE:
  1317.                 if (!SendMessage(hwnd, WM_COMMAND, IDM_WINDOWCLOSE, 0L)) return (0);
  1318.                 break;
  1319.         }
  1320.         break;
  1321.  
  1322.     case WM_WININICHANGE: {
  1323.         HDC hdc;
  1324.         char buf[MAXLINELEN];
  1325.  
  1326.         cp = (char far *) lParam;
  1327.         if (cp == NULL || !_fstricmp(cp, "windows")) {
  1328.             hdc = GetPrinterDC(TRUE, buf);
  1329.             if (hdc == NULL) {
  1330.                 FreeMem(global.printer);
  1331.                 global.printer = "(None)";
  1332.                 break;
  1333.             }
  1334.             if (stricmp(buf, global.printer)) ChangePrinterOrFonts();
  1335.             DeleteDC(hdc);
  1336.         }
  1337.  
  1338.         break;
  1339.     }
  1340.  
  1341.  
  1342.     case WM_DESTROY:
  1343.         if (!SendMessage(hwnd, WM_COMMAND, IDM_WINDOWCLOSE, 0L)) return (0);
  1344.  
  1345.         FreeProcInstance (global.gloslistdlg);
  1346.  
  1347.         WriteOptionsFile(FALSE);
  1348.         WriteGlossary(global.glossary);
  1349.         WriteConversionCache(global.convcache);
  1350.         WriteUserConversions(global.userdict);
  1351.  
  1352.         FreeAllMemory();
  1353.  
  1354.         /* Free some ad hoc stuff */
  1355.  
  1356.         DeleteObject(DefAsciiFont.hfont);       /* ASCII font */
  1357.         DeleteObject(FullMenu);                 /* The menus */
  1358.         DeleteObject(MinimalMenu);
  1359.         DisplayKanjiBitmap(NULL, 0, 0, 0, 0, -1, 0, NULL);
  1360.  
  1361.         WinHelp(global.hwnd, global.help, HELP_QUIT, NULL);
  1362.         PostQuitMessage(0);
  1363.         return (0);
  1364.  
  1365.     case WM_RENDERFORMAT:
  1366.     case WM_DESTROYCLIPBOARD:
  1367.     case WM_RENDERALLFORMATS:
  1368.     case WM_ASKCBFORMATNAME:
  1369.     case WM_SIZECLIPBOARD:
  1370.     case WM_PAINTCLIPBOARD:
  1371.     case WM_HSCROLLCLIPBOARD:
  1372.     case WM_VSCROLLCLIPBOARD:
  1373.         return (ProcessClipboardMessage(hwnd, message, wParam, lParam));
  1374.     }
  1375.  
  1376.     return (DefFrameProc(hwnd, global.clienthwnd, message, wParam, lParam));
  1377. }
  1378.