home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1998 September / VPR9809B.ISO / APUPDATE / VC / Wzgd300c / WZGD300C.LZH / wzicon.c < prev    next >
Text File  |  1997-10-20  |  29KB  |  1,008 lines

  1. // WZ Icon
  2. // Thanks dieさん
  3.  
  4. // 95/04/18   alpha version
  5. //   /04/21   自分自身で閉じたときに対応
  6. //   /04/23   位置保存機能追加
  7. //   /05/01   ファイルヒストリなど追加
  8. //   /05/07   ファイルオープン時のデフォルトフィルタ対応
  9. //2.94 970122 高速オープン対応
  10. //2.98 970307 設定ダイアログ追加
  11.  
  12.  
  13. // modefied by y.mikome
  14. ////////////////////////////////////////////////////
  15. #define __CLIPBORD__    1
  16. #define __SUBMENU__        1
  17. #define __WINDOW__        1
  18. ////////////////////////////////////////////////////
  19.  
  20. #pragma TXE
  21.  
  22. #include <windows.h>
  23. #include <windowsx.h>
  24. #include "prof.h"
  25. #import "shellapi"    // #include "shellapi.h"だとTCWのヘッダファイルを見に行ってしまう
  26. #include "dialog.h"
  27. #include "winregtx.h"    //3.00C 971016 
  28.  
  29. #define WZSC_NEWFILE        1001
  30. #define WZSC_OPENFILE        1002
  31. #define WZSC_GREP            1003
  32. #define WZSC_SETUP            1004
  33. #define WZSC_RESTOREPOS        1005
  34. #define WZSC_PRJOPEN        1006
  35. #define WZSC_TOPMOST        1007    // 950516 TY
  36. #define WZSC_OPENFILEBODY    1008    //1.00C TY
  37. #define WZSC_CONFIG            1009    //2.98 970307 
  38. #define WZSC_ABOUT            1010    //3.00B1 970612 
  39.  
  40. #define WZSC_DIRECTORYFIRST    1500    // 950513 TY
  41. #define WZSC_HISTORYFIRST    2000
  42.  
  43. #define WM_WZICON_OPENMENU        (WM_TXUSER + 0)
  44. #define WM_TRAY_CALLBACK        (WM_TXUSER + 1)
  45. #define WM_WZICON_OPENMENUPRIM    (WM_TXUSER + 2)    //3.00B1 970612 
  46.  
  47. static const mchar szApp[] = "WZ Icon";
  48. static const mchar szKeySavePos[] = "savepos";
  49. static const mchar szKeyLeft[] = "left";
  50. static const mchar szKeyTop[] = "top";
  51. static const mchar szForceMax[] = "forcemax";
  52. // 950516 TY
  53. static const mchar szKeyTopMost[] = "topmost";
  54. static TX* _textWzicon;                //2.94 970121 WZ Icon text
  55. static HMENU _hmenuFiler;            //2.94 970122 "ファイラー"サブメニューハンドル(参照専用)
  56.  
  57. // 設定内容変数
  58. BOOL g_fCanClose = FALSE;
  59. BOOL g_fSavePos;
  60. int g_nSaveLeft;
  61. int g_nSaveTop;
  62. #ifdef __SUBMENU__    // ヒストリの数はpermanentで記憶する
  63. #define WZSC_REJUME        1020
  64. static HMENU _hmenuDocument;
  65. permanent BOOL g_fClipbord = 1;
  66. permanent BOOL g_fExplorer = 0;
  67. permanent int g_nHistMax = 10;;
  68. permanent int g_nDirMax = 10;
  69. #else
  70. int g_nHistMax;
  71. // 950513 TY
  72. int g_nDirMax = 10;
  73. #endif
  74. BOOL g_fTopMost;    // 常に手前に表示
  75.  
  76. #ifdef __WINDOW__
  77. static HMENU _hmenuWindow;
  78. BOOL wndGetExistToplevel(HWND hwnd)
  79. {
  80.     HWND cur = GetWindow(GetDesktopWindow(),GW_CHILD);
  81.     while(cur) {
  82.         if (cur == hwnd) return TRUE;
  83.         cur = GetWindow(cur,GW_HWNDNEXT);
  84.     }
  85.     return FALSE;
  86. }
  87. #endif
  88.  
  89. #ifdef __FLAT__
  90. //1.00H4 タスクバーのアイコンになるようにした
  91. void TrayMessage( HWND hWnd, UINT message)
  92. {
  93.     if (!_fwin40) return;
  94.     
  95.     NOTIFYICONDATA tnd;
  96.     strcpy(tnd.szTip,"WZ Editor");
  97.     
  98.     switch(message) {
  99.         case NIM_ADD: {
  100.             tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
  101.             break;
  102.         }
  103.         case NIM_MODIFY: {
  104.             tnd.uFlags = NIF_TIP;
  105.             break;
  106.         }
  107.         case NIM_DELETE: {
  108.             tnd.uFlags = 0;
  109.             break;
  110.         }
  111.     }
  112.     
  113.     tnd.uID = (UINT)IDI_WINLOGO;
  114.     tnd.cbSize = sizeof(NOTIFYICONDATA);
  115.     tnd.hWnd = hWnd;
  116.     tnd.uCallbackMessage = WM_TRAY_CALLBACK;
  117.     //
  118.     mchar szmodulename[CCHPATHNAME];
  119.     GetModuleFileName(_textWzicon->hInstance,szmodulename,CCHPATHNAME);
  120.     HICON hiconBig;
  121.     HICON hicon;
  122.     ExtractIconEx(szmodulename,0,&hiconBig,&hicon,1);
  123.     tnd.hIcon = hicon;
  124.     //
  125.     Shell_NotifyIcon(message, &tnd);
  126. }
  127. #endif
  128.  
  129. // 設定
  130. void ReadProfile(void)
  131. {
  132.     TxProfile prof;
  133.     profWzIniNew(&prof, szApp);
  134.     
  135.     g_fSavePos = (BOOL)profReadInt(&prof, szKeySavePos, FALSE);
  136.     g_fTopMost = (BOOL)profReadInt(&prof, szKeyTopMost, FALSE);
  137.     g_nSaveLeft = profReadInt(&prof, szKeyLeft, 0);
  138.     g_nSaveTop = profReadInt(&prof, szKeyTop, 0);
  139. #ifndef __SUBMENU__    // ヒストリの数はpermanentで記憶する
  140.     g_nHistMax = profReadInt(&prof, szForceMax, _textWzicon->nDispFileHist);
  141. #endif
  142.  
  143.     profDelete(&prof);
  144. }
  145.  
  146. void WriteProfile(void)
  147. {
  148.     TxProfile prof;
  149.     profWzIniNew(&prof, szApp);
  150.     
  151.     RECT rc;
  152.     GetWindowRect(_textWzicon->hwndbase, &rc);
  153.     g_nSaveLeft = rc.left;
  154.     g_nSaveTop = rc.top;
  155.     
  156.     profWriteInt(&prof, szKeySavePos, (int)g_fSavePos);
  157.     profWriteInt(&prof, szKeyTopMost, (int)g_fTopMost);
  158.     profWriteInt(&prof, szKeyLeft, g_nSaveLeft);
  159.     profWriteInt(&prof, szKeyTop, g_nSaveTop);
  160.     
  161.     profDelete(&prof);
  162. }
  163.  
  164. static void FlushTopmost(void)
  165. {
  166.     SetWindowPos(_textWzicon->hwndbase,
  167.         g_fTopMost? HWND_TOPMOST : HWND_NOTOPMOST,
  168.         0,0,0,0,SWP_NOMOVE|SWP_NOSIZE
  169.     );
  170. }
  171.  
  172. //2.98 970311 
  173. static void ehFlush(void)
  174. {
  175. #ifdef __FLAT__
  176.     #if 1//3.00B1 970610 NT3.51でテキストキャプチャー、メールフックできなかった
  177.     TXCONFIGSHARE* shcfg = &text->share->config;
  178.     // 既にTXOP_EHSTARTしている場合は、設定をフラッシュさせる
  179.     txOp(text,TXOP_EHEND,0,0);
  180.     //
  181.     if (shcfg->fEnableEh || shcfg->fEnableEhMail) {
  182.         // START
  183.         txOp(text,TXOP_EHSTART,0,0);
  184.     }
  185.     #else
  186.     if (_fwin40) {//2.99D 970401 95/NT4.0のみにした
  187.         TXCONFIGSHARE* shcfg = &text->share->config;
  188.         // 既にTXOP_EHSTARTしている場合は、設定をフラッシュさせる
  189.         txOp(text,TXOP_EHEND,0,0);
  190.         //
  191.         if (shcfg->fEnableEh || shcfg->fEnableEhMail) {
  192.             // START
  193.             txOp(text,TXOP_EHSTART,0,0);
  194.         }
  195.     }
  196.     #endif
  197. #endif
  198. }
  199.  
  200. //2.98 970311 設定ダイアログ
  201. //3.00A2 970507 NT3.51でもWZ Iconの設定ダイアログが使える様にして、メーラのフックなどの設定ができるようにした
  202. uiConfig
  203. {
  204.     HDIALOG hd = dialog("WZ Iconの設定");
  205.     dialogSetContexthelp(hd,TRUE);
  206.     TXCONFIGSHARE* shcfg = &text->share->config;
  207.     mchar szVkEhStart[2] = {shcfg->vkEhStart,0};
  208.     BOOL fEnableEh = shcfg->fEnableEh;//2.99B 970323 
  209.     BOOL fEnableEhMail = shcfg->fEnableEhMail;//2.99B 970323 
  210.     BOOL fHookReadonly = shcfg->fHookReadonly;//3.00A2 970503 
  211.     mchar szUserhook[CCHPATHNAME] = {0};    //3.00C 971016 
  212. #ifdef __FLAT__
  213.         static char _szkey[] = "Software\\VillageCenter\\WZ EDITOR\\3.0";//3.00C 971016 
  214.         static char _szkey_szUserhook[] = "_wzhk_userhook";//3.00C 971016 
  215.         {
  216.             HKEY hkey;
  217.             DWORD size = sizeof(szUserhook);
  218.             DWORD kind = REG_SZ;
  219.             if (RegCreateKey(HKEY_LOCAL_MACHINE,_szkey,&hkey) == ERROR_SUCCESS) {
  220.                 RegQueryValueEx(hkey,_szkey_szUserhook,NULL,&kind,szUserhook,&size);
  221.                 RegCloseKey(hkey);
  222.             }
  223.         }
  224.         //
  225.         dialogHeadline(hd,"メーラのフック",40);
  226.         dialogControlHelp(hd,422);
  227.         dialogCheckB(hd,"メーラのフックを行う(&M)",&shcfg->fEnableEhMail);
  228.         //2.99B 970322 
  229.         dialogControlHelp(hd,423);
  230.         dialogControlGuide(hd,"ミリ秒",6);
  231.         dialogIntW(hd,"フック開始時のウェイト数(&W)",&shcfg->wtmEhmailStartWait,20,6);//2.99F 970404 5->6
  232.         dialogControlHelp(hd,424);
  233.         dialogControlGuide(hd,"ミリ秒",6);
  234.         dialogIntW(hd,"メール送信時のウェイト数(&S)",&shcfg->wtmEhmailSendWait,20,6);//2.99F 970404 5->6
  235.         dialogControlHelp(hd,516);
  236.         dialogStrC(hd,"ユーザ定義(&U):",szUserhook,14,sizeof(szUserhook),25);//3.00C 971016 
  237.         //
  238.         dialogHeadline(hd,"テキストキャプチャー",40);
  239.         dialogControlHelp(hd,425);
  240.         dialogCheckB(hd,"テキストキャプチャーを行う(&T)",&shcfg->fEnableEh);
  241.         dialogControlHelp(hd,426);
  242.         dialogStrC(hd,"テキストキャプチャーキー(&K):  Alt+Ctrl+",szVkEhStart,26,2,4);
  243.         //3.00A2 970503 設定により、メールのビューアーもフック、キャプチャーできるようにした
  244.         dialogHeadline(hd,"詳細",40);
  245.         dialogControlHelp(hd,499);
  246.         dialogCheckB(hd,"ビューアーもフック、キャプチャーする(&V)",&shcfg->fHookReadonly);
  247.         if (_fwinnt351) {//3.00B2 970615 
  248.             dialogHeadline(hd,"表示",40);
  249.             dialogCheck(hd,"終了時位置保存(&P)",&g_fSavePos);
  250. //            dialogCheck(hd,"常に前面に表示(&O)",&g_fTopMost);// iminai
  251.         }
  252. #else
  253.         dialogCheck(hd,"終了時位置保存(&S)",&g_fSavePos);
  254.         dialogCheck(hd,"常に前面に表示(&T)",&g_fTopMost);
  255. #endif
  256. #ifdef __SUBMENU__    // 拡張機能の設定を追加
  257.         dialogHeadline(hd,"y.mikome拡張",40);
  258.         dialogCheck(hd, "クリップボード監視する", &g_fClipbord);
  259.         dialogCheck(hd, "エクスプローラを使う", &g_fExplorer);
  260.         dialogInt(hd, "ファイルヒストリの数", &g_nHistMax, 20, 6);
  261.         dialogInt(hd, "フォルダヒストリの数", &g_nDirMax, 20, 6);
  262. #endif
  263.  
  264.     if (dialogOpen(hd)) {
  265.         #ifdef __FLAT__
  266.             shcfg->vkEhStart = szVkEhStart[0];
  267.             txConfigOp(text,TXCONFIGOP_SHARESAVE,0);
  268.             {//3.00C 971016 
  269.                 HKEY hkey;
  270.                 DWORD kind = REG_SZ;
  271.                 if (RegCreateKey(HKEY_LOCAL_MACHINE,_szkey,&hkey) == ERROR_SUCCESS) {
  272.                     RegSetValueEx(hkey,_szkey_szUserhook,NULL,&kind,szUserhook,strsize(szUserhook));
  273.                     RegCloseKey(hkey);
  274.                 }
  275.             }
  276. #if 1//2.99B 970323 動的設定変更は不可能。フック先でエラーが起こったりする
  277.             if (
  278.                 fEnableEh != shcfg->fEnableEh ||
  279.                 fEnableEhMail != shcfg->fEnableEhMail ||
  280.                 fHookReadonly != shcfg->fHookReadonly    //3.00A2 970503 
  281.             ) {
  282.     #if 1//3.00A2 970507 NT3.51だと、ファイルオープンダイアログも一緒に出ちゃった
  283.                 MessageBox(_textWzicon->hwndbase,"新しい設定を有効にするには、Windowsを再起動してください","WZ Icon",MB_OK);
  284.     #else
  285.                 information("新しい設定を有効にするには、Windowsを再起動してください");
  286.     #endif
  287.             }
  288. #else
  289.             ehFlush();
  290. #endif
  291.         #endif
  292.     }
  293. }
  294.  
  295. static BOOL _fModal;//2.99B 970322 WZ Iconでファイルオープンダイアログを複数開けてしまった
  296.  
  297. static BOOL CheckModal(void)
  298. {
  299. //2.99B 970322 new
  300.     if (_fModal) return TRUE;//2.99B 970322 
  301.     if (_textWzicon->fDisenableForModal) {//2.99B 970322 
  302.         beep();// err音
  303.         return TRUE;
  304.     }
  305.     return FALSE;
  306. }
  307.  
  308. //3.00B1 970612 new
  309. uiAbout
  310. {
  311.     ABOUTINFO info;
  312.     memset(&info,0,sizeof(info));
  313.     info.szicon = "iconWzIcon";
  314.     info.szappname = "WZ Icon";
  315.     info.szversion = "version " + VER_WZEDITOR;
  316.     about(&info);
  317. }
  318.  
  319. #ifdef __CLIPBORD__
  320. static HWND hwndNext;
  321. static BOOL fClipbord =FALSE;
  322. static BOOL IsClipOther(tx *text)
  323. {
  324.     if (clipGetKind(HCLIP_WIN) && !clipIsWz()) return TRUE;
  325.     if (text->share->hclipLastCopy == HCLIP_WIN) return TRUE;
  326.     return FALSE;
  327. }
  328. #define WZ_CLIPWINTOTS        (WM_TXUSER + 3)
  329. #endif
  330.  
  331.  
  332. // フックプロシージャ
  333. HOOKRESULT
  334. __wndprocbase(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  335. {
  336.     //2.94 970122 
  337.     if (textTarget != _textWzicon) return HOOK_CONTINUE;
  338.     TX* text = _textWzicon;
  339.     //
  340.     mchar szPath[CCHPATHNAME + 10];
  341.     switch (uMsg) {
  342. #ifdef __CLIPBORD__
  343.         case WM_CHANGECBCHAIN: {
  344.             if (fClipbord) {
  345.                 // チェインの削除メッセージが来た
  346.                 if((HWND)wParam == hwndNext) {
  347.                     // 次が削除されるならチェインの作り直しが必要
  348.                     hwndNext = (HWND)LOWORD(lParam);
  349.                 } else if(hwndNext) {
  350.                     // 関係ないなら次のチェインに引き渡す
  351.                     SendMessage(hwndNext,uMsg,wParam,lParam);
  352.                 }
  353.             }
  354.             macroHookWndBaseReturn(0);
  355.             break;
  356.         }
  357.         case WM_DRAWCLIPBOARD: {
  358. //            if (fClipbord && text->share->hclipLastCopy != HCLIP_TS) {
  359.             if (fClipbord) {
  360.                 // クリップボードに変更がある
  361.                 PostMessage(text->hwndbase, WZ_CLIPWINTOTS, 0, 0L);
  362.                 // PostMessageで作業しないと、別プロセスWZでコピーしたときハングアップする
  363.                 if (hwndNext) {
  364.                     // 次のチェインに引き渡す
  365.                     SendMessage(hwndNext,uMsg,wParam,lParam);
  366.                 }
  367.             }
  368.             macroHookWndBaseReturn(0);
  369.             break;
  370.         }
  371.         case WZ_CLIPWINTOTS: {
  372.                 int lch = memClipPaste(NULL, HCLIP_WIN);
  373.                 if (lch) {
  374.                     if (IsClipOther(text)) {
  375.                         txstr sz(lch+1);
  376.                         memClipPaste((mchar*)sz, HCLIP_WIN);
  377.                         sz[lch]=0;
  378.                         memClipCopy((mchar*)sz, lch, HCLIP_TS, CLIP_CHAR);
  379.                         //こんなの入れてみました。(^_^;
  380.                         text->share->hclipLastCopy = HCLIP_TS;
  381.                     }
  382.                 }
  383.             macroHookWndBaseReturn(0);
  384.             break;
  385.         }
  386. #endif
  387.         #ifdef __FLAT__
  388.         case WM_TRAY_CALLBACK: {
  389.             WPARAM uID  = wParam;
  390.             LPARAM uMouseMsg = lParam;
  391.             switch(uMouseMsg) {
  392.                 case WM_LBUTTONDOWN: {
  393.                     if (CheckModal()) break;//2.99B 970322 
  394.                     wndtxSetActive(text->hwndbase);
  395.                     #if 0//2.90 
  396.                     PostMessage(hwnd,WM_WZICON_OPENMENU,0,0);
  397.                     #else
  398.                     PostMessage(hwnd, WM_SYSCOMMAND, WZSC_OPENFILEBODY, 0);
  399.                     #endif
  400.                     break;
  401.                 }
  402.                 #if 1//2.90 
  403.                 case WM_RBUTTONDOWN: {
  404.                     if (CheckModal()) break;//2.99B 970322 
  405.                     wndtxSetActive(text->hwndbase);
  406.                     PostMessage(hwnd,WM_WZICON_OPENMENU,0,0);
  407.                     break;
  408.                 }
  409.                 #endif
  410.             }
  411.             return TRUE;
  412.         }
  413.         #endif
  414.         case WM_WZICON_OPENMENU: {
  415.             if (_fwin40 && GetActiveWindow() != text->hwndbase) {
  416.                 //1.01A WZ32でWindows95のとき、ダイアログ表示中にメニューが開いてしまった
  417.             } else {
  418.                 menuOpenMouse(GetSystemMenu(text->hwndbase,FALSE));
  419.             }
  420.             break;
  421.         }
  422.         case WM_WZICON_OPENMENUPRIM: {//3.00B1 970612 
  423.             menuOpenMouse(GetSystemMenu(text->hwndbase,FALSE));
  424.             break;
  425.         }
  426.         case WM_COMMAND: {
  427. //            if ((HWND)WM_COMMAND_GetHwndCtrl(wParam,lParam) != GetSystemMenu(text->hwndbase,FALSE)) break;
  428.         }
  429.         case WM_SYSCOMMAND: {
  430.             // メニュー
  431.             UINT uID = (UINT)wParam;
  432.             if ((uID >= WZSC_HISTORYFIRST) &&
  433.                 (uID < WZSC_HISTORYFIRST + g_nHistMax)) {
  434.                 uID -= WZSC_HISTORYFIRST;
  435.                 txOpenForkFast(
  436.                     text,
  437.                     histRead(HIST_FILE, histGetCount(HIST_FILE) - uID - 1)
  438.                 );
  439.             } else if (WZSC_DIRECTORYFIRST <= uID && uID < WZSC_DIRECTORYFIRST + g_nDirMax) {
  440.                 // 950513 TY
  441.                 uID -= WZSC_DIRECTORYFIRST;
  442. #ifdef __SUBMENU__    // パスヒストリをエクスプローラで開く
  443.                 BOOL fshift = (GetKeyState(VK_SHIFT) < 0);
  444.                 if ((g_fExplorer && !fshift) || (!g_fExplorer && fshift)) {
  445.                     mchar szpath[CCHPATHNAME];
  446.                     strcpy(szpath, histRead(HIST_PATH, histGetCount(HIST_PATH) - uID - 1));
  447.                     pathForm(szpath);
  448.                     if (_fwin40) {
  449.                         exec("explorer.exe ,"+szpath);
  450.                     } else {
  451.                         shellExecute(szpath, "open");
  452.                     }
  453.                 } else
  454. #endif
  455.                 txOpenForkFast(
  456.                     text,
  457.                     "filer.txe -f\"" + histRead(HIST_PATH, histGetCount(HIST_PATH) - uID - 1) + "\""
  458.                 );
  459.                 //2.00E "-p"->"-f"
  460.                 //2.00E5 -f[] -> -f""
  461.             } else {
  462.                 switch (uID) {
  463.                     case WZSC_NEWFILE: {
  464.                         txuiOpenNew(text);//2.00B WZ Iconの新規作成の仕様を、WZ Editorと同じにした
  465.                         break;
  466.                     }
  467.                     case WZSC_OPENFILE: {
  468.                         #if 1//1.00C
  469.                         PostMessage(hwnd, WM_SYSCOMMAND, WZSC_OPENFILEBODY, 0);
  470.                         #else
  471.                         PostMessage(hwnd, WM_QUERYOPEN, 0, 0);
  472.                         #endif
  473.                         break;
  474.                     }
  475.                     case WZSC_OPENFILEBODY: {
  476. #if 0
  477. call("uiopen.main");
  478. #else
  479.                         szPath[0] = '\0';
  480.                         _fModal = TRUE;//2.99B 970322 
  481.                         DWORD ret = txofnGetOpenFileName(text, szPath, "ファイルを開く");
  482.                         _fModal = FALSE;
  483.                         if (ret) {
  484.                             //1.00C WzIconのファイルでビューモードでファイルが開けなかった
  485.                             mchar *szsw = "";
  486.                             if (ret & TXOFN_READONLY) szsw = " --R";
  487.                             if (ret & TXOFN_VIEWMODE) szsw = " -v";
  488.                             txOpenForkFast(text, szPath + szsw);
  489.                         }
  490. #endif
  491.                         break;
  492.                     }
  493.                     case WZSC_GREP: {
  494.                         //1.99B IDM__GREP etc 廃止
  495.                         callPost("search.grep");
  496.                         break;
  497.                     }
  498.                     case WZSC_PRJOPEN: {
  499.                         callPost("file.uiPrjOpen");//wz.mnu
  500.                         break;
  501.                     }
  502. #ifdef __SUBMENU__
  503.                     case WZSC_REJUME: {
  504.                         callPost("file.uiPrjResume");//wz.mnu
  505.                         break;
  506.                     }
  507. #endif
  508.                     case WZSC_SETUP: {
  509.                         g_fSavePos = ! g_fSavePos;
  510.                         break;
  511.                     }
  512.                     case WZSC_TOPMOST: {
  513.                         g_fTopMost = ! g_fTopMost;
  514.                         FlushTopmost();
  515.                         break;
  516.                     }
  517.                     case WZSC_CONFIG: {
  518.                         uiConfig();
  519.                         break;
  520.                     }
  521.                     case WZSC_ABOUT: {//3.00B1 970612 
  522.                         uiAbout();
  523.                         break;
  524.                     }
  525.                     case WZSC_RESTOREPOS: {
  526.                         SetWindowPos(
  527.                             hwnd,NULL,
  528.                             g_nSaveLeft,g_nSaveTop,0,0,
  529.                             SWP_NOSIZE|SWP_NOZORDER
  530.                         );
  531.                         break;
  532.                     }
  533.                     default: {
  534.                         if ((uID & 0xFFF0) == SC_CLOSE) {
  535.                             g_fCanClose = TRUE;
  536.                             if (uMsg == WM_COMMAND) {
  537.                                 PostMessage(hwnd,WM_CLOSE,0,0);
  538.                             }
  539.                         }
  540.                         return HOOK_CONTINUE;
  541.                     }
  542.                 }
  543.             }
  544.             macroHookWndBaseReturn(0);
  545.             break;
  546.         }
  547.         case WM_INITMENUPOPUP: {
  548.             // メニュー更新
  549.             HMENU hMenu = (HMENU)wParam;
  550. #ifdef __SUBMENU__    // ファイルメニューの体裁を [ファイル名主部    パス名]とする
  551.             if (hMenu == _hmenuDocument) {
  552.                 menuDelAll(hMenu);
  553.                 int id = WZSC_HISTORYFIRST;
  554.                 int n = histGetCount(HIST_FILE);
  555.                 int i;
  556.                 for (i = 0;i < g_nHistMax;i++) {
  557.                     if (n == 0) break;
  558.                     mchar *p = histRead(HIST_FILE, --n);
  559.                     mchar szdir[CCHPATHNAME];
  560.                     strcpy(szdir, p);
  561.                     pathForm(szdir);
  562.                     if (strlen(szdir) > 30) {
  563.                         if (iskanji(szdir[29])) szdir[29]=0; else szdir[30]=0;
  564.                         strcat(szdir, "...");
  565.                     }
  566.                     sprintf(szPath, "%s\t%s", pathGetFileName(p), szdir);
  567.                     menuStr(hMenu,szPath, id++);
  568.                 }
  569.                 menuTx(hMenu,"任意のファイルを開く(&M)...", "\m.uiopen");//★
  570.                 macroHookWndBaseReturn(0);
  571. #else
  572.             if (hMenu == GetSystemMenu(text->hwndbase,FALSE)) {// これやんないと、サブメニューにまでヒストリーが登場してしまふ
  573. #if 0//2.98 970307 
  574.                 CheckMenuItem(hMenu,WZSC_SETUP,g_fSavePos ? MF_CHECKED : MF_UNCHECKED);
  575.                 CheckMenuItem(hMenu,WZSC_TOPMOST,g_fTopMost ? MF_CHECKED : MF_UNCHECKED);
  576. #endif
  577.                 int nMax = histGetCount(HIST_FILE);
  578.                 int idx;
  579.                 for (idx = 0;idx < g_nHistMax;idx++) {
  580.                     RemoveMenu(hMenu, WZSC_HISTORYFIRST + idx, MF_BYCOMMAND);
  581.                     if (idx < nMax) {
  582.                         mchar chIdx = ((idx + 1) <= 9) ? (idx + 1 + '0') : ' ';
  583.                         sprintf(szPath,"&%c %s",chIdx,histRead(HIST_FILE,nMax-idx-1));
  584.                         AppendMenu(hMenu,MF_STRING,WZSC_HISTORYFIRST + idx,szPath);
  585.                     }
  586.                 }
  587.                 macroHookWndBaseReturn(0);
  588. #endif
  589. #ifdef __WINDOW__
  590.             } else if (hMenu == _hmenuWindow) {
  591.                 menuDelAll(hMenu);
  592.                 static mchar szAppName[] = "WZ Editor";
  593.                 int lchAppName = sizeof(szAppName)-1;
  594.                 int i;
  595.                 int j;
  596.                 for (i = 0;i < text->share->nOpen;i++) {
  597.                     HWND cur = textRead(i);
  598.                     if (!cur) continue;
  599.                     BOOL fexist = wndGetExistToplevel(cur);
  600.                     if (fexist && GetWindow(cur,GW_OWNER)) {
  601.                         // オーナが居る場合は無視
  602.                     } else {
  603.                         #define CAPTIONSIZE    (CCHAPPNAME + CCHPATHNAME)
  604.                         mchar szcaption[3 + CAPTIONSIZE];// 3:for "&1 "
  605.                         mchar *p = szcaption;
  606.  
  607.                         *p++ = ' ';
  608.                         // get caption
  609.                         if (fexist) {
  610.                             GetWindowText(cur,p,CAPTIONSIZE);
  611.                             if (!strcmp(p, "WZ Icon")) continue;    //WZ Iconは表示しない
  612.                             
  613.                             mchar *q = stristr(p, " / 多重化");
  614.                             if (q) *q= 0;
  615.                             // Editorなら、アプリ名を取り除く
  616.                             if (_fwin40) {
  617.                                 mchar *q = stristr(p, " - " + szAppName);
  618.                                 if (q) *q= 0;
  619.                             } else {
  620.                                 if (!strnicmp(p,szAppName,lchAppName)) {
  621.                                     strcpy(p,p+lchAppName+3);//+3:" - "
  622.                                 }
  623.                             }
  624.                             // フルパス?
  625.                             if (pathGetFull(p)) {
  626.                                 txstr sz = p;
  627.                                 mchar *q = pathGetFileName(sz);
  628.                                 q[-1] = 0;
  629.                                 strcpy(p, q + "\t" + sz);
  630.                             }
  631.                         } else {
  632.                             // アプリエラーなどで落ちた
  633.                             strcpy(p,"(無効ウィンドウ)");
  634.                         }
  635.                         // add
  636.                         UINT fCheck = (cur == text->hwndbase) * MF_CHECKED;
  637.                         InsertMenu(hMenu,0,MF_BYPOSITION|MF_STRING|fCheck,IDM_TXWINDOWTOP + i,szcaption);
  638.                         // search
  639.                         if (text->hwndbase == cur) j = i;
  640.                     }
  641.                 }
  642. #endif
  643.             } else if (hMenu == _hmenuFiler) {
  644.                 // これやんないと、WZ EDITORディレクトリヒストリーが登場してしまふ
  645.                 menuDelAll(hMenu);
  646.                 int id = WZSC_DIRECTORYFIRST;
  647.                 int n = histGetCount(HIST_PATH);
  648.                 int i;
  649. #ifdef __SUBMENU__    // パスメニューの体裁を [パス主部    フルパス]とする
  650.                 for (i = 0;i < g_nDirMax;i++) {
  651.                     if (n == 0) break;
  652.                     mchar *p = histRead(HIST_PATH, --n);
  653.                     mchar szname[CCHPATHNAME];
  654.                     mchar szdir[CCHPATHNAME];
  655.                     strcpy(szdir, p);
  656.                     pathForm(szdir);
  657.                     strcpy(szname, pathGetFileName(szdir));
  658.                     if (strlen(szdir) > 30) {
  659.                         if (iskanji(szdir[29])) szdir[29]=0; else szdir[30]=0;
  660.                         strcat(szdir, "...");
  661.                     }
  662.                     sprintf(szPath, "%s\t%s", szname, szdir);
  663.                     menuStr(hMenu,szPath,id++);
  664.                 }
  665.                 menuTx(hMenu,"任意のフォルダを開く(&M)...", "\m.uifolder");//★
  666. #else
  667.                 for (i = 0;i < 10;i++) {
  668.                     if (n == 0) break;
  669.                     menuStr(hMenu,"&"+chartostr('0'+i)+"\t"+histRead(HIST_PATH,--n),id++);
  670.                 }
  671. #endif
  672.                 macroHookWndBaseReturn(0);
  673.                 break;
  674.             }
  675.             break;
  676.         }
  677.         case WM_DROPFILES: {
  678.             #if 1
  679.             //1.01A ファイルドロップ(複数対応)
  680.             mchar szfilename[CCHPATHNAME];
  681.             int n = DragQueryFile((HDROP)wParam,-1,szfilename,cchof(szfilename));
  682.             int i;
  683.             
  684.             for (i = 0;i < n;i++) {
  685.                 DragQueryFile((HDROP)wParam,i,szfilename,cchof(szfilename));
  686.                 txOpenForkFast(text,szfilename);
  687.             }
  688.             DragFinish((HDROP)wParam);
  689.             #else
  690.             // ファイルドロップ(一個だけ)
  691.             shellDragQueryFileOnce(
  692.                 (HDROP)wParam, szPath, CCHPATHNAME);
  693.             txOpenForkFast(text, szPath);
  694.             #endif
  695.             macroHookWndBaseReturn(0);
  696.             break;
  697.         }
  698.         case WM_QUERYOPEN: {
  699.             // アイコンダブルクリック
  700.             //1.00C WzIconを「アプリケーションの切り替え」でアクティブにしたときマウスが効かなかった
  701.             //WM_QUERYOPENではダイアログを開いてはいけなかった
  702.             #ifdef __FLAT__
  703.             if (_fwin40) break;
  704.             #endif
  705.             #if 0//1.01A WZ16で、ダブルクリックで[新規作成]にするには、これを1にしてください
  706.             PostMessage(hwnd, WM_SYSCOMMAND, WZSC_NEWFILE, 0);
  707.             #else
  708.             PostMessage(hwnd, WM_SYSCOMMAND, WZSC_OPENFILEBODY, 0);
  709.             #endif
  710.             macroHookWndBaseReturn(FALSE);
  711.             break;
  712.         }
  713.         case WM_QUERYENDSESSION: {
  714.             g_fCanClose = TRUE;
  715.             return HOOK_CONTINUE;
  716.         }
  717.         case WM_TXQUERYCLOSE: {
  718.             #if 1//2.90 WM_TXQUERYCLOSEのオリジナルルーチンを通す
  719.             {
  720.                 static BOOL f;
  721.                 if (f) {
  722.                     return HOOK_CONTINUE;
  723.                 } else {
  724.                     f = TRUE;
  725.                     BOOL ret = SendMessage(hwnd,uMsg,wParam,lParam);
  726.                     f = FALSE;
  727.                     if (!ret) {
  728.                         macroHookWndBaseReturn(FALSE);
  729.                         return HOOK_CAPTURE;
  730.                     }
  731.                 }
  732.             }
  733.             #endif
  734.             WriteProfile();
  735.             #ifdef __FLAT__
  736.             TrayMessage(text->hwndbase,NIM_DELETE);
  737.             #endif
  738.             #if 1//1.00F Windows標準のタスクマネージャでWZIconを終了できなかった
  739.             macroHookWndBaseReturn(TRUE);
  740.             #else
  741.             macroHookWndBaseReturn(g_fCanClose);
  742.             #endif
  743.             break;
  744.         }
  745. #ifdef __FLAT__    //3.00B1 970612 WZ Iconのショートカットにショートカットキーを割り当てると、そのショートカットキーを押すとWZ Iconの右クリックメニューを表示するようにした。これで出ない時(WZ Iconがアクティブウィンドウの場合)はAlt+Spaceで出る。
  746.         case WM_ACTIVATE: {
  747.             if (_fwin40) {
  748.                 BOOL fActive = LOWORD(wParam);
  749.                 if (fActive == WA_ACTIVE) {
  750.                     if (GetParent(lParam) == hwnd) {
  751.                         // WZ Iconが開いたダイアログが閉じられた場合はなにもしない
  752.                     } else {
  753.                         PostMessage(hwnd,WM_WZICON_OPENMENUPRIM,0,0);
  754.                     }
  755.                 }
  756.             }
  757.             return HOOK_CONTINUE;
  758.         }
  759. #endif
  760.         case WM_TXCLOSE: {//3.00B2 970615 
  761.             _textWzicon = NULL;
  762.             return HOOK_CONTINUE;
  763.         }
  764.         default: {
  765.             // フックしない
  766.             return HOOK_CONTINUE;
  767.         }
  768.     }
  769.     // フック済み
  770.     return HOOK_CAPTURE;
  771. }
  772.  
  773. // メニュー設定
  774. void CreateWZIconMenu(TX* text)
  775. {
  776.     HMENU hMenu = GetSystemMenu(text->hwndbase,FALSE);
  777.     
  778.     // SC_RESTORE は消しちゃ駄目かな?
  779.     RemoveMenu(hMenu,SC_ICON,MF_BYCOMMAND);
  780.     RemoveMenu(hMenu,SC_ZOOM,MF_BYCOMMAND);
  781.     RemoveMenu(hMenu,SC_SIZE,MF_BYCOMMAND);
  782.     if (_fwin40) {
  783.         RemoveMenu(hMenu,SC_RESTORE,MF_BYCOMMAND);
  784.         RemoveMenu(hMenu,SC_MOVE,MF_BYCOMMAND);
  785.         RemoveMenu(hMenu,0,MF_BYPOSITION);
  786.     }
  787.     // 最後のコマンドの境界
  788.     InsertMenu(hMenu,0,MF_BYPOSITION|MF_SEPARATOR,0,NULL);
  789.     // コマンド
  790. #ifdef __SUBMENU__    // wz.mnuに[新規作成]があるときはサブメニュー方式を使う
  791.     if (txmenuOp(TXMENUOP_SEARCH, "新規作成",0)) {
  792.         HMENU _hmenuNew = CreateMenu();
  793.         InsertMenu(hMenu,0,MF_BYPOSITION|MF_POPUP,(UINT)_hmenuNew,"新規作成(&N)");
  794.         txmenuOp(TXMENUOP_LOAD, "新規作成",_hmenuNew);
  795.     } else
  796. #endif
  797.     InsertMenu(hMenu,0,MF_BYPOSITION,WZSC_NEWFILE,"新規作成(&N)");
  798.     InsertMenu(hMenu,1,MF_BYPOSITION,WZSC_OPENFILE,"ファイルを開く(&O)...");//1.00D Internal
  799.     InsertMenu(hMenu,2,MF_BYPOSITION,WZSC_PRJOPEN,"プロジェクトを開く(&P)...");//1.00D Internal
  800.     // ファイラーサブメニュー
  801.     _hmenuFiler = CreateMenu();
  802.     InsertMenu(_hmenuFiler,0,MF_BYPOSITION,0,"0");
  803. #ifdef __SUBMENU__    // Explorerでパスヒストリを開くオプション
  804.     if (g_fExplorer) {
  805.         InsertMenu(hMenu,2,MF_BYPOSITION|MF_POPUP,(UINT)_hmenuFiler,"フォルダー(&F)");
  806.     } else {
  807.         InsertMenu(hMenu,2,MF_BYPOSITION|MF_POPUP,(UINT)_hmenuFiler,"ファイラー(&F)");// 950513 TY
  808.     }
  809. #else
  810.     InsertMenu(hMenu,3,MF_BYPOSITION|MF_POPUP,(UINT)_hmenuFiler,"ファイラー(&F)");// 950513 TY
  811. #endif
  812.     //
  813.     InsertMenu(hMenu,4,MF_BYPOSITION,WZSC_GREP,"Grep検索(&G)");//1.00D Internal
  814. #if 1//3.00A2 970507 NT3.51でも設定ダイアログ使える様にした
  815.     //3.00B2 970615 Win3.1のWZ Iconの設定復活。終了時位置保存が指定できるようにした
  816.     InsertMenu(hMenu,5,MF_BYPOSITION,WZSC_CONFIG,"設定(&S)...");
  817. #else
  818.     #if 1//2.99G 970404 WZ16,WinNT3.51のWZ Iconの設定ダイアログで設定を変更しても利かなかったので、設定を削除
  819.     if (_fwin40) {
  820.         InsertMenu(hMenu,5,MF_BYPOSITION,WZSC_CONFIG,"設定(&S)...");
  821.     }
  822.     #else
  823.     InsertMenu(hMenu,5,MF_BYPOSITION,WZSC_CONFIG,"設定(&S)...");
  824.     #endif
  825. #endif
  826. #if 0//2.98 970307 
  827.     if (!_fwin40) {
  828.         InsertMenu(hMenu,5,MF_BYPOSITION,WZSC_SETUP,"終了時位置保存(&S)");
  829.         InsertMenu(hMenu,6,MF_BYPOSITION,WZSC_TOPMOST,"常に前面に表示(&T)");
  830.     }
  831. #endif
  832.     InsertMenu(hMenu,6,MF_BYPOSITION,WZSC_ABOUT,"バージョン情報(&A)...");//3.00B1 970612 WZ Iconにバージョン情報を追加
  833.     // ファイルヒストリリストリの境界
  834. #ifdef __SUBMENU__    // ファイルヒストリはサブメニューで表示する
  835.     _hmenuDocument = CreateMenu();
  836.     InsertMenu(_hmenuDocument,0,MF_BYPOSITION,0,"0");
  837.     InsertMenu(hMenu,2,MF_BYPOSITION|MF_POPUP,(UINT)_hmenuDocument,"ドキュメント(&D)");// 950513 TY
  838.     InsertMenu(hMenu, 4, MF_BYPOSITION|MF_SEPARATOR, 0, NULL);
  839.     InsertMenu(hMenu,6,MF_BYPOSITION,WZSC_REJUME,"前回終了時の復元(&R)");
  840.     InsertMenu(hMenu, 7, MF_BYPOSITION|MF_SEPARATOR, 0, NULL);
  841. #else
  842.     AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
  843. #endif
  844. #ifdef __WINDOW__
  845.     _hmenuWindow = CreateMenu();
  846.     InsertMenu(hMenu,3,MF_BYPOSITION|MF_POPUP,(UINT)_hmenuWindow,"ウィンドウ(&W)");// 950513 TY
  847. #endif
  848. #ifdef __SUBMENU__    // wz.mnuに[WZICON追加機能]があるときはサブメニュー方式を追加
  849.     if (txmenuOp(TXMENUOP_SEARCH, "WZICON追加機能",0)) {
  850.         HMENU _hmenuNew = CreateMenu();
  851.         InsertMenu(hMenu,9,MF_BYPOSITION|MF_POPUP,(UINT)_hmenuNew,"追加機能(&E)");
  852.         txmenuOp(TXMENUOP_LOAD, "WZICON追加機能",_hmenuNew);
  853.     }
  854. #endif
  855. }
  856.  
  857. #if 0//3.00B1 970612 
  858. BOOL __txeclosemulti(HWND hwndprev)
  859. {
  860. //3.00B1 970612 
  861.     wndtxSetActive(hwndprev);
  862.     PostMessage(hwndprev,WM_WZICON_OPENMENUPRIM,0,0);
  863.     return TRUE;
  864. }
  865. #endif
  866.  
  867. // エントリ
  868. void __txenew(void)
  869. {
  870.     //2.94 970122 
  871.     _textWzicon = text;
  872.     text->fTxeOpenHigh = TRUE;
  873.     txSetFileName(text,NULL);//2.99G 970405 WZ Iconで設定ダイアログのコンテキストヘルプのフォントが変だった
  874.     // ウィンドウ設定
  875.     HWND hwnd = text->hwndbase;
  876.     text->fNoWndText = TRUE;
  877.     text->fNoOpenText = TRUE;
  878.     text->fNoProfile = TRUE;
  879. #if 0//2.99D 970401 NT3.51
  880.     if (!_fwin40) {
  881.         // ShowWindow() ではなぜかだめ・・
  882.         PostMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0L);
  883.     }
  884. #endif
  885.     SetWindowText(hwnd, szApp);
  886.     shellDragAcceptFiles(TRUE);
  887.     CreateWZIconMenu(text);
  888.     ReadProfile();
  889. #if 0//3.00B2 970615 
  890.     if (g_fSavePos) {
  891.         PostMessage(hwnd, WM_SYSCOMMAND, WZSC_RESTOREPOS, 0L);
  892.     }
  893. #endif
  894.     // 950516 TY
  895.     FlushTopmost();
  896.     // フックする
  897.     macroHookWndBase();
  898.     textSetProcessMode(hwnd,WZPROCESS_STAYALWAYS);
  899.     //2.99D 970401 NT3.51
  900.     text->nCmdShow = SW_MINIMIZE;
  901.     //
  902.     #ifdef __FLAT__//1.00H4
  903.     if (_fwin40) {
  904.         text->nCmdShow = SW_HIDE;
  905.     }
  906.     #endif
  907.     if (g_fSavePos) {//3.00B2 970615 
  908.         text->nCmdShow = SW_HIDE;
  909.     }
  910. #ifdef __CLIPBORD__
  911.     if (!fClipbord && g_fClipbord) {
  912.         hwndNext    = SetClipboardViewer(text->hwndbase);
  913.         fClipbord=TRUE;
  914.     }
  915. #endif
  916. }
  917.  
  918. // apidbに登録されないように
  919. void main(void)
  920. {
  921.     //1.00H5 __txenewから移動。__txenewでやるとタスクバーにアイコンが複数出てしまう
  922.     #ifdef __FLAT__//1.00H4 
  923.     if (_fwin40) {
  924.         TX* text = _textWzicon;
  925.         TrayMessage(text->hwndbase,NIM_ADD);
  926.         // 最後に開かれた自分以外のWZ窓をアクティブにする
  927.         wzlock(LOCK_WZPROCESS);
  928.         {
  929.             HWND hwndActive = NULL;
  930.             int i;
  931.             for (i = 0;i < text->share->nOpen;i++) {
  932.                 HWND hwnd = textRead(i);
  933.                 if (hwnd && hwnd != _textWzicon->hwndbase) hwndActive = hwnd;
  934.             }
  935.             PostMessage(hwndActive,WM_TXACTIVE,0,0);
  936.         }
  937.         wzunlock(LOCK_WZPROCESS);
  938.     }
  939.     #endif
  940.     ehFlush();//2.98 970311 
  941.     if (g_fSavePos) {//3.00B2 970615 
  942.         PostMessage(text->hwndbase, WM_SYSCOMMAND, WZSC_RESTOREPOS, 0L);
  943.         text->nCmdShow = SW_MINIMIZE;
  944.         ShowWindow(text->hwndbase,text->nCmdShow);
  945.     }
  946. }
  947.  
  948. #ifdef __SUBMENU__    // 不要なファイルヒストリを削除 [クローズ]イベントマクロ用に割り当てる
  949. void close(TX *text)
  950. {
  951.     if (
  952.         stristr(".stx .tmp", pathGetExt(text->szfilename)) ||
  953.         stristr(text->szfilename, "\\temp\\") ||
  954.         stristr(text->szfilename, "\\tmp\\") ||
  955.         strchr(text->szfilename, '~')
  956.     ) {
  957.         sbDel(sbFromHist(HIST_FILE), text->szfilename);
  958.     }
  959.     // タグジャンプで開くとパスがない?
  960.     sbDel(sbFromHist(HIST_FILE), pathGetFileName(text->szfilename));
  961.     sbDel(sbFromHist(HIST_PATH), "*.*");
  962. }
  963. void _uiopen (BOOL fFolder)
  964. {
  965.     //static mchar _hist[] = fFolder ? "WZICON_UIFOLDER" : "WZICON_UIFILE";
  966.     mchar *_hist;
  967.     if (fFolder) _hist = "WZICON_UIFOLDER"; else _hist = "WZICON_UIFILE";
  968.     HSTRBLK sb = historyOpen(_hist,512);
  969.     txstr szpath;
  970.     if (sbGetCount(sb)>1) szpath = sbRead(sb, sbGetCount(sb)-1);
  971.     HDIALOG hd = dialog(fFolder ? "フォルダを開く" : "ファイルを開く");
  972.     dialogControlRefer(hd, fFolder ? "-d" : "");
  973.     dialogControlHist(hd, sb);
  974. //    dialogControlStyle(hd, CBS_SORT|CBS_SIMPLE|WS_CHILD|WS_VISIBLE|WS_TABSTOP);
  975.     dialogStr(hd, "", szpath, 0, 40);
  976. //    dialogControlStyle(hd, 0);
  977.     if (dialogOpen(hd)) {
  978.         if (fFolder) {
  979.             if(!pathDirExist(szpath)) {
  980.                 information("%sは存在しません。",szpath);
  981.             } else {
  982.                 if (g_fExplorer) {
  983.                     if (_fwin40) {
  984.                         exec("explorer.exe ,"+szpath);
  985.                     } else {
  986.                         shellExecute(szpath, "open");
  987.                     }
  988.                 } else {
  989.                     txOpenForkFast(text,"filer.txe -f\"" + szpath + "\"");
  990.                 }
  991.                 sbAddHist(sbFromHist(HIST_PATH), szpath+"\\*.*");
  992.             }
  993.         } else {
  994.             openforkfast(szpath);
  995.         }
  996.     }
  997.     historyClose(_hist, sb);
  998. }
  999. uiopen
  1000. {
  1001.     _uiopen(0);
  1002. }
  1003. uifolder
  1004. {
  1005.     _uiopen(1);
  1006. }
  1007. #endif
  1008.