home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1999 February / VPR9902A.BIN / APUPDATE / VC / Tx300d / TX300D.LZH / CUSTMIZE.C < prev    next >
C/C++ Source or Header  |  1997-06-13  |  110KB  |  4,056 lines

  1. // WZ EDITOR 標準機能 キー/メニュー/ツールバーカスタマイズ
  2. // Copyright 1995-96 TY
  3.  
  4. //{###設定}
  5.  
  6. //2.95 970127 高速オープン対応
  7. //2.96A 970214 text別キー、メニュー、ツールバーに対応
  8. //2.99A 970321 "←(S)"を"更新"に変更し、内容を変更してないときは灰色表示にした
  9.  
  10. #include <windows.h>
  11. #include <windowsx.h>
  12. #include "dialog.h"
  13. #include "dialoga.h"
  14. #include "edit.h"
  15.  
  16. #include "apidb2.h"
  17. #define apidbOpen()
  18. #define apidbClose()
  19.  
  20. #define MYDEBUG        0
  21.  
  22. //##common
  23.  
  24. static mchar _szcmdsepa[] = "--(区切り)--";
  25. static mchar _szcmdfilehist[] = "(ファイル ヒストリ)";
  26. static mchar _szcmdwindowlist[] = "(ウィンドウ リスト)";
  27. static mchar _szlast[] = "--(末尾)--";
  28.  
  29. #define IDD_KEYLIST            2000
  30. #define IDD_2KEY            2001
  31. #define IDD_2KEY_ADD        2002
  32. #define IDD_2KEY_DEL        2003
  33. #define IDD_SHIFT            2004
  34. #define IDD_ALT                2005
  35. #define IDD_CTRL            2006
  36. #define IDD_NEXT            2007
  37. #define IDD_BACK            2008
  38. #define IDD_CMDTEST            2009
  39. #define IDD_CMDUNDO            2010
  40. #define IDD_SELICON            2011
  41. #define IDD_ICON            2012
  42. #define IDD_REDUCE            2013
  43. #define IDD_SET                2014
  44. #define IDD_ADD                2015
  45. #define IDD_CLEAR            2016
  46. #define IDD_UP                2017
  47. #define IDD_DOWN            2018
  48. #define IDD_COMMAND            2019
  49. #define IDD_DISPLAY            2020
  50. #define IDD_DISPLAYGUIDE    2021
  51. #define IDD_LOAD            2022
  52. #define IDD_SAVE            2023
  53. #define IDD_EXEC            2024
  54. #define IDD_SEPARATOR        2025
  55. #define IDD_INSERT            2026
  56. #define IDD_FILEHIST        2027
  57. #define IDD_WINDOWLIST        2028
  58. #define IDD_NAME            2029
  59. #define IDD_DETAIL            2030
  60. #define IDD_PASTE            2031
  61. #define IDD_KEYDEF_LIST        2032
  62. #define IDD_KEYDEF_DEL        2033
  63. #define IDD_COPY            2034
  64. #define IDD_CUT                2035
  65. #define IDD_CONVERTKEY        2036
  66. #define IDD_COPYTEXT        2037
  67. #define IDD_OLDPATH            2038
  68. #define IDD_INSERTNEW        2039    //2.99A 970321 新規挿入ボタン
  69. #define IDD_DISPLAYSETAUTO    2040    //2.99C 970326 
  70. #define IDD_INIT            2041    //2.99D 970328 キー、メニュー、ツールバーのカスタマイズダイアログに[初期化]を追加
  71.  
  72. #define PICKUP_NOTFOUND        9999
  73. //
  74. #define ID_MENU                0
  75. #define ID_KEY                1
  76. #define ID_TOOLBAR            2
  77. #define idFromMode(mode)    (mode / 100)
  78. //
  79. #define PICKUP_MENUTOP        0
  80. #define PICKUP_MENUEND        99
  81. #define PICKUP_KEYTOP        100
  82. #define PICKUP_KEYEND        199
  83. #define PICKUP_TOOLBARTOP    200
  84. #define PICKUP_TOOLBAREND    299
  85. //
  86. #define PICKUP_MENUCUST        1
  87. #define PICKUP_MENUSEARCH    2
  88. #export
  89. #define PICKUP_MENUAPIDB    3
  90. #define PICKUP_MENUBARWZ    4
  91. #define PICKUP_MENU            5
  92. #define PICKUP_MENUAPIDB2    6
  93. #define PICKUP_KEYALL        101
  94. #define PICKUP_KEYWZ        102
  95. #define PICKUP_KEYSEARCH    103
  96. #define PICKUP_TOOLBARALL    201
  97. #define PICKUP_TOOLBARWZ    202
  98. #define PICKUP_TOOLBARSEARCH    203
  99. #endexport
  100.  
  101. #define MENU_N        100    // 編集可能なメニュー数
  102. #define MENUNEST_N    10    // 最大サブメニューネスト数
  103. typedef struct {
  104.     HWND hwnd;
  105.     TX* text;
  106.     //
  107.     mchar szcur[CCHNAME];
  108.     TXMENU *cur;
  109.     //
  110.     TXMENU* tmenu[MENU_N];
  111.     int nmenu;
  112.     //
  113.     TXMENU* tnestMenu[MENUNEST_N];
  114.     int tnestCmd[MENUNEST_N];
  115.     int nnest;
  116.     //
  117.     TXMENUITEM txmenuClip;
  118.     BOOL fTxmenuClip;
  119.     //
  120.     BOOL fMenubar;
  121.     BOOL fEdited;//2.99A 970321 編集された?
  122.     BOOL fNoSetEdit;//2.99A 970321 fEditedを変更しない?
  123.     mchar* szname;
  124. } MENUCONTEXT;
  125. static MENUCONTEXT* _menucontext;    // 設定中のメニュー for PICKUP_MENUAPIDB
  126.  
  127. // mode=PICKUP_MENUSEARCH: szargにnameを指定するとオフセットを返す
  128. DWORD TXAPI txmenuPickup(DWORD dst,int mode,mchar* szarg)
  129. {
  130.     if (mode <= PICKUP_MENUEND) {
  131.         if (mode == PICKUP_MENUAPIDB && _menucontext) {
  132.             for (int i = 0;i < _menucontext->nmenu;i++) {
  133.                 TXMENU* menu = _menucontext->tmenu[i];
  134.                 if (menu->fNew) {
  135.                     txInsert((tx*)dst,"menu.");
  136.                     txInsert((tx*)dst,menu->szname);
  137.                     txInsertReturn((tx*)dst);
  138.                 }
  139.             }
  140.         } else if (mode == PICKUP_MENUAPIDB2 && _menucontext) {
  141.             TX* text = (TX*)dst;
  142.             for (int i = 0;i < _menucontext->nmenu;i++) {
  143.                 TXMENU* menu = _menucontext->tmenu[i];
  144.                 if (menu->fNew) {
  145.                     txInsertLine(text,".##%sメニュー(Cmd:menu.%s)",menu->szname,menu->szname);
  146.                 }
  147.             }
  148.         }
  149.         tx* txmenu = (tx*)txmenuOp(TXMENUOP_OPEN,NULL,NULL);
  150.         txJumpFileTop(txmenu);
  151.         txstr szline;
  152.         int i;
  153.         for (i = 0;;i++) {
  154.             if (txSearchEx(txmenu,"[",SEARCH_CUR|SEARCH_NOSENSECASE|SEARCH_PARATOP)) {
  155.                 txGetLine(txmenu,szline);
  156.                 mchar* szname = &szline[1];
  157.                 mchar*p = strchr(szline,']');
  158.                 if (p) {
  159.                     mchar* szcaption = NULL;
  160.                     *p = 0;
  161.                     switch(mode) {
  162.                         case PICKUP_MENUSEARCH: {
  163.                             if (!stricmp(szname,szarg)) {
  164.                                 return i;
  165.                             }
  166.                             break;
  167.                         }
  168.                         case PICKUP_MENUAPIDB: {
  169.                             txInsert((tx*)dst,"menu.");
  170.                             txInsert((tx*)dst,szname);
  171.                             txInsertReturn((tx*)dst);
  172.                             break;
  173.                         }
  174.                         case PICKUP_MENUAPIDB2: {
  175.                             // ソートすると遅いのでメニューコマンドはソートしない
  176.                             TX* text = (TX*)dst;
  177.                             txInsertLine(text,".##%sメニュー(Cmd:menu.%s)",szname,szname);
  178.                             break;
  179.                         }
  180.                         case PICKUP_MENU: {
  181.                             SendMessage(dst,CB_ADDSTRING,0,(LPARAM)(mchar*)szname);
  182.                             break;
  183.                         }
  184.                         case PICKUP_MENUBARWZ: {
  185.                             int len;
  186.                             if (len = strimatch(szname,"bar_")) {
  187.                                 SendMessage(dst,CB_ADDSTRING,0,(LPARAM)(mchar*)&szname[len]);
  188.                             }
  189.                             break;
  190.                         }
  191.                         case PICKUP_MENUCUST: {
  192.                             SendMessage(dst,CB_ADDSTRING,0,(LPARAM)(mchar*)szname);
  193. #if 0
  194.                             if (mode == PICKUP_MENUCUST) {
  195.                                 strcpymax(_tmenu[_nmenu].szfunc,szname,CCHNAME);
  196.                                 _nmenu++;
  197.                             }
  198. #endif
  199.                             break;
  200.                         }
  201.                     }
  202.                 }
  203.                 if (!txNextPara(txmenu)) break;
  204.             } else {
  205.                 break;
  206.             }
  207.         }
  208.         txmenuOp(TXMENUOP_CLOSE,NULL,NULL);//2.00E2 
  209.         if (mode == PICKUP_MENUSEARCH) return PICKUP_NOTFOUND;
  210.         return TRUE;
  211.     }
  212.     {
  213.         int op = 0;
  214.         int ope = 0;//2.00E2 
  215.         BOOL fAll = TRUE;
  216.         BOOL fSearch = FALSE;
  217.         switch(mode) {
  218.             case PICKUP_KEYWZ: {
  219.                 fAll = FALSE;
  220.                 op = TXKEYOP_OPEN;
  221.                 ope = TXKEYOP_CLOSE;
  222.                 break;
  223.             }
  224.             case PICKUP_KEYALL: {
  225.                 op = TXKEYOP_OPEN;
  226.                 ope = TXKEYOP_CLOSE;
  227.                 break;
  228.             }
  229.             case PICKUP_KEYSEARCH: {
  230.                 op = TXKEYOP_OPEN;
  231.                 ope = TXKEYOP_CLOSE;
  232.                 fSearch = TRUE;
  233.                 break;
  234.             }
  235.             case PICKUP_TOOLBARWZ: {
  236.                 fAll = FALSE;
  237.                 op = TXTOOLBAROP_OPEN;
  238.                 ope = TXTOOLBAROP_CLOSE;
  239.                 break;
  240.             }
  241.             case PICKUP_TOOLBARALL: {
  242.                 op = TXTOOLBAROP_OPEN;
  243.                 ope = TXTOOLBAROP_CLOSE;
  244.                 break;
  245.             }
  246.             case PICKUP_TOOLBARSEARCH: {
  247.                 op = TXTOOLBAROP_OPEN;
  248.                 ope = TXTOOLBAROP_CLOSE;
  249.                 fSearch = TRUE;
  250.                 break;
  251.             }
  252.             default: {
  253.                 return FALSE;
  254.             }
  255.         }
  256.         tx* txkey = (tx*)txmenuOp(op,NULL,NULL);
  257.         txJumpFileTop(txkey);
  258.         txstr szline;
  259.         int i;
  260.         for (i = 0;;i++) {
  261.             if (txSearchEx(txkey,"[",SEARCH_CUR|SEARCH_NOSENSECASE|SEARCH_PARATOP)) {
  262.                 txGetLine(txkey,szline);
  263.                 mchar* szname = &szline[1];
  264.                 mchar*p = strchr(szline,']');
  265.                 if (p) {
  266.                     *p = 0;
  267.                     if (fSearch) {
  268.                         if (!stricmp(szname,szarg)) {
  269.                             return i;
  270.                         }
  271.                     } else if (!fAll && strimatch(szname,"txe_")) {
  272.                         // skip
  273.                     } else {
  274.                         SendMessage(dst,CB_ADDSTRING,0,(LPARAM)(mchar*)szname);
  275.                     }
  276.                 }
  277.                 if (!txNextPara(txkey)) break;
  278.             } else {
  279.                 break;
  280.             }
  281.         }
  282.         txmenuOp(ope,NULL,NULL);//2.00E2 
  283.         if (fSearch) return PICKUP_NOTFOUND;
  284.         return TRUE;
  285.     }
  286. }
  287.  
  288. static void txKeyLoadName(TX* text,mchar* szkey)
  289. {
  290.     txOp(text,TXOP_KEYLOADNAME,(LPARAM)szkey,0);
  291. }
  292.  
  293. #if 0//2.99C 970323 
  294. static void EnableDlgItem(HWND hwnd,int id,BOOL fenable)
  295. {
  296.     HWND hctrl = GetDlgItem(hwnd,id);
  297.     if (hctrl) EnableWindow(hctrl,fenable);
  298. }
  299.  
  300. static void EnableDlgItemEx(HWND hwnd,int id,BOOL fenable,int idDefault)
  301. {
  302. // idにフォーカスがあるときは、idDefaultにフォーカスを移す
  303. //2.99A 970321 new
  304.     HWND hctrl = GetDlgItem(hwnd,id);
  305.     if (hctrl) {
  306.         if (GetFocus() == hctrl) {
  307.             SetFocus(GetDlgItem(hwnd,idDefault));
  308.         }
  309.         EnableWindow(hctrl,fenable);
  310.     }
  311. }
  312. #endif
  313.  
  314. typedef struct {
  315.     TXTOOLBAR ttxtoolbar[TXTOOLBAR_N];
  316.     int ntoolbar;
  317.     int itoolbar;    // current
  318.     //
  319.     HWND hwnd;
  320.     TX* text;
  321.     TXTOOLBAR now;    // currentの設定中の内容
  322.     BOOL fEdited;//2.99A 970321 編集された?
  323.     BOOL fNoSetEdit;//2.99A 970321 fEditedを変更しない?
  324.     BOOL fNoSetDisplay;//3.00A3 970508 
  325. } TOOLBARCONTEXT;
  326.  
  327. typedef struct {
  328.     TX* text;
  329.     int id;
  330.     int op;
  331.     int opDel;
  332.     mchar* szcur;
  333.     mchar* szcaption;
  334.     LPVOID context;
  335. } DEFS;
  336.  
  337. BOOL dlgprocKeysload(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  338. {
  339.     HDIALOG hd = dialogFromHwnd(hwnd);
  340.     DEFS* defs = (LPVOID)dialogGetCustdata(hd);
  341.     TX* text = defs->text;
  342.     switch(message) {
  343.         case WM_INITDIALOG: {
  344.             HWND hctrl = GetDlgItem(hwnd,IDD_KEYDEF_LIST);
  345.             txmenuPickup(hctrl,defs->op,NULL);
  346.             comboboxSelectStr(hctrl,defs->szcur);
  347.             break;
  348.         }
  349.         case WM_COMMAND: {
  350.             int id = WM_COMMAND_GetId(wParam);
  351.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  352.             
  353.             switch(id) {
  354.                 case IDOK: {
  355.                     mchar szkey[10];
  356.                     HWND hctrl = GetDlgItem(hwnd,IDD_KEYDEF_LIST);
  357.                     SendMessage(hctrl,CB_GETLBTEXT,SendMessage(hctrl,CB_GETCURSEL,0,0),(LPARAM)szkey);
  358.                     if (defs->id == ID_KEY) {
  359.                         txKeyLoadName(text,szkey);
  360.                     } else {
  361.                         TOOLBARCONTEXT *context = defs->context;
  362.                         TXTOOLBAR ttxtoolbar[TXTOOLBAR_N];
  363.                         int ntoolbar = text->ntoolbar;
  364.                         memcpy(ttxtoolbar,text->ttxtoolbar,sizeof(ttxtoolbar));
  365.                         txOp(text,TXOP_TOOLBARLOADNAME,(LPARAM)szkey,0);
  366.                         //
  367.                         memcpy(context->ttxtoolbar,text->ttxtoolbar,sizeof(context->ttxtoolbar));
  368.                         context->ntoolbar = text->ntoolbar;
  369.                         //
  370.                         text->ntoolbar = ntoolbar;
  371.                         memcpy(text->ttxtoolbar,ttxtoolbar,sizeof(ttxtoolbar));
  372.                     }
  373.                     break;
  374.                 }
  375.                 case IDD_KEYDEF_DEL: {
  376.                     mchar szkey[CCHNAME];
  377.                     GetDlgItemText(hwnd,IDD_KEYDEF_LIST,szkey,CCHNAME);
  378.                     if (question("%s %s定義を削除しても良いですか。\n\n(削除のキャンセルはできません)",szkey,defs->szcaption) == IDYES) {
  379.                         txmenuOp(defs->opDel,szkey,NULL);
  380.                         //
  381.                         SendDlgItemMessage(hwnd,IDD_KEYDEF_LIST,CB_RESETCONTENT,0,0);
  382.                         txmenuPickup(
  383.                             GetDlgItem(hwnd,IDD_KEYDEF_LIST),
  384.                             defs->op,
  385.                             NULL
  386.                         );
  387.                         SendDlgItemMessage(hwnd,IDD_KEYDEF_LIST,CB_SETCURSEL,0,0);
  388.                     }
  389.                     break;
  390.                 }
  391.             }
  392.             break;
  393.         }
  394.     }
  395.     return FALSE;
  396. }
  397.  
  398. static BOOL keysLoad(HWND hwnd,TX* text,int mode,LPVOID context)
  399. {
  400. // キー、メニュー、ツールバーの読み込み
  401.     HDIALOG hd;
  402.     DEFS defs;
  403.     defs.text = text;
  404.     defs.id = idFromMode(mode);
  405.     defs.op = mode;
  406.     defs.context = context;
  407.     //
  408.     if (defs.id == ID_KEY) {
  409.         defs.szcur = text->szKey;
  410.         defs.szcaption = "キー";
  411.         defs.opDel = TXKEYOP_DEL;
  412.     } else if (defs.id == ID_MENU) {
  413.         defs.szcur = text->szMenu;
  414.         defs.szcaption = "メニュー";
  415.         defs.opDel = TXMENUOP_DEL;
  416.     } else {
  417.         defs.szcur = text->szToolbar;
  418.         defs.szcaption = "ツールバー";
  419.         defs.opDel = TXTOOLBAROP_DEL;
  420.     }
  421.     hd = dialog(defs.szcaption + "定義のロード");
  422.     dialogSetHookEx(hd,"\m.dlgprocKeysload");
  423.     dialogSetCustdata(hd,(DWORD)&defs);
  424.     //
  425.     DTRECT r;
  426.     dialogGetPos(hd,&r);
  427.     r.cx = DTCX * 20;
  428.     r.cy = DTCY * 8;
  429.     __dialogAddItem(hd,"COMBOBOX",NULL,IDD_KEYDEF_LIST,&r,CBS_AUTOHSCROLL|CBS_DROPDOWN|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|WS_GROUP);
  430.     //
  431.     r.x += r.cx + DTCXINT;
  432.     r.cx = DTCX * 10;
  433.     r.cy = DTCYCMDBUTTON;
  434.     _dialogAddButton(hd,"削除...",IDD_KEYDEF_DEL,&r);
  435.     //2.00E2 OKとCancelボタンがくっついた
  436.     r.x += r.cx;
  437.     r.y += r.cy;
  438.     dialogSetPos(hd,&r);
  439.     
  440.     BOOL ret = dialogOpen(hd);
  441.     return ret;
  442. }
  443.  
  444. //##メニュー
  445.  
  446. //{###設定}
  447.  
  448. static TXMENU* menuCreate(MENUCONTEXT* context,mchar* szname)
  449. {
  450.     if (context->nmenu < MENU_N) {
  451.         TXMENU* txmenu = malloc(sizeof(TXMENU));
  452.         if (txmenu) {
  453.             memset(txmenu,0,sizeof(TXMENU));
  454.             context->tmenu[context->nmenu++] = txmenu;
  455.             strcpy(txmenu->szname,szname);
  456. //information(szname);
  457.             txmenuOp(TXMENUOP_LOADEX,(LPVOID)txmenu,NULL);
  458.             return txmenu;
  459.         }
  460.     }
  461.     return NULL;
  462. }
  463.  
  464. static TXMENU* menuLoad(MENUCONTEXT* context,mchar* szname)
  465. {
  466.     int i;
  467.     for (i = 0;i < context->nmenu;i++) {
  468.         if (!stricmp(context->tmenu[i]->szname,szname)) {
  469.             return context->tmenu[i];
  470.         }
  471.     }
  472.     return menuCreate(context,szname);
  473. }
  474.  
  475. static BOOL _fEnableMenuNext;
  476. static BOOL _fEnableMenuBack;
  477.  
  478. static void menuCmdChanged(MENUCONTEXT* context)
  479. {
  480.     context->fNoSetEdit++;//2.99A 970321 
  481.     context->fEdited = FALSE;//2.99A 970321 
  482.     HWND hwnd = context->hwnd;
  483.     EnableDlgItemEx(hwnd,IDD_SET,FALSE,IDD_KEYLIST);//2.99A 970321 
  484.     int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  485.     mchar* szcmd = "";
  486.     mchar* szcaption = "";
  487.     if (isel < context->cur->nmenuitem) {
  488.         szcmd = context->cur->tmenuitem[isel].szcmd;
  489.         szcaption = context->cur->tmenuitem[isel].szcaption;
  490.     }
  491.     SetDlgItemText(hwnd,IDD_COMMAND,szcmd);
  492.     _fEnableMenuNext = strmatch(szcmd,"menu.");
  493. #if 1//2.99A 970321 
  494.     EnableDlgItemEx(hwnd,IDD_NEXT,_fEnableMenuNext,IDD_KEYLIST);
  495. #else
  496.     EnableWindow(GetDlgItem(hwnd,IDD_NEXT),_fEnableMenuNext);
  497. #endif
  498.     //
  499.     txstr szname = szcaption;
  500.     int chkey = 0;    // access key
  501.     {
  502.         mchar *p = szname;
  503.         while(1) {
  504.             p = strstr(p,"(&");
  505.             if (!p) break;
  506.             p += 2;
  507.             if (*p == '&') {
  508.                 p++;
  509.                 continue;
  510.             } else {
  511.                 chkey = *p;
  512.                 if (!strcmp(p + 1,")...")) {
  513.                     strcpy(p-2,"...");
  514.                 } else {
  515.                     p[-2] = 0;
  516.                 }
  517.                 break;
  518.             }
  519.         }
  520.     }
  521.     SetDlgItemText(hwnd,IDD_DISPLAY,szname);
  522.     mchar szkey[2] = {chkey,0};
  523.     SetDlgItemText(hwnd,IDD_DISPLAYGUIDE,szkey);
  524.     //
  525. //information(szcmd);
  526.     SendMessage(hwnd,CS_SETSZCMD,0,(LPARAM)szcmd);
  527.     context->fNoSetEdit--;//2.99A 970321 
  528. }
  529.  
  530. static void menuChanged(MENUCONTEXT* context,BOOL fJumpTop)
  531. {
  532.     HWND hwnd = context->hwnd;
  533.     HWND hctrl = GetDlgItem(hwnd,IDD_KEYLIST);
  534.     TXMENU *menu = context->cur;
  535.     ListBox_ResetContent(hctrl);
  536.     int i;
  537.     for (i = 0;i < menu->nmenuitem;i++) {
  538.         mchar* szcaption = menu->tmenuitem[i].szcaption;
  539.         mchar* szcmd = menu->tmenuitem[i].szcmd;
  540.         mchar* szhead = "";
  541.         if (strimatch(szcmd,"menu.")) szhead = "+ ";
  542.         
  543.         if (szcaption[0]) {
  544.             ListBox_AddString(hctrl,szhead + szcaption);
  545.         } else {
  546.             if (!stricmp(szcmd,"__sepa")) {
  547.                 ListBox_AddString(hctrl,_szcmdsepa);
  548.             } else if (!stricmp(szcmd,"__filehist")) {
  549.                 ListBox_AddString(hctrl,_szcmdfilehist);
  550.             } else if (!stricmp(szcmd,"__windowlist")) {
  551.                 ListBox_AddString(hctrl,_szcmdwindowlist);
  552.             } else {
  553.                 ListBox_AddString(hctrl,szhead + "名前なし");
  554.             }
  555.         }
  556.     }
  557.     ListBox_AddString(hctrl,_szlast);
  558.     if (fJumpTop) ListBox_SetCurSel(hctrl,0);
  559.     //
  560.     if (context->fMenubar) {
  561.         mchar* szname = menu->szname;
  562.         txstr sz;
  563.         int len;
  564.         if (
  565.             (len = strmatch(szname,"bar_")) ||
  566.             (len = strmatch(szname,"bartxe_"))
  567.         ) {
  568.             sz = (szname + len);
  569.             sz += "メニューバー";
  570.         } else {
  571.             sz = szname;
  572.             sz += "メニュー";
  573.         }
  574.         sz += "(&M)";
  575.         SetDlgItemText(hwnd,IDD_NAME,sz);
  576.     } else {
  577.         int isel = txmenuPickup(NULL,PICKUP_MENUSEARCH,menu->szname);
  578.         if (isel != PICKUP_NOTFOUND) {
  579.             SendDlgItemMessage(hwnd,IDD_NAME,CB_SETCURSEL,isel,0);
  580.         }
  581.     }
  582.     //
  583.     _fEnableMenuBack = context->nnest;
  584. #if 1//2.99A 970321 
  585.     EnableDlgItemEx(hwnd,IDD_BACK,_fEnableMenuBack,IDD_KEYLIST);
  586. #else
  587.     EnableWindow(GetDlgItem(hwnd,IDD_BACK),_fEnableMenuBack);
  588. #endif
  589. }
  590.  
  591. static void menuNext(MENUCONTEXT* context)
  592. {
  593.     HWND hwnd = context->hwnd;
  594.     if (context->nnest < MENUNEST_N) {
  595.         int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  596.         mchar* szcmd = context->cur->tmenuitem[isel].szcmd;
  597.         int len;
  598.         if (len = strimatch(szcmd,"menu.")) {
  599.             context->tnestMenu[context->nnest] = context->cur;
  600.             context->tnestCmd[context->nnest] = isel;
  601.             context->nnest++;
  602.             //
  603.             context->cur = menuLoad(context,szcmd + len);
  604.             menuChanged(context,TRUE);
  605.             menuCmdChanged(context);
  606.         }
  607.     }
  608. }
  609.  
  610. static void menuBack(MENUCONTEXT* context)
  611. {
  612.     HWND hwnd = context->hwnd;
  613.     if (context->nnest) {
  614.         --context->nnest;
  615.         context->cur = context->tnestMenu[context->nnest];
  616.         menuChanged(context,FALSE);
  617.         ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),context->tnestCmd[context->nnest]);
  618.         menuCmdChanged(context);
  619.     }
  620. }
  621.  
  622. static void menuOpenClose(MENUCONTEXT* context)
  623. {
  624.     if (_fEnableMenuNext) {
  625.         menuNext(context);
  626.     } else {
  627.         menuBack(context);
  628.     }
  629. }
  630.  
  631. static void menuWrite(MENUCONTEXT* context)
  632. {
  633.     context->fNoSetEdit++;//2.99A 970321 
  634.     context->fEdited = FALSE;//2.99A 970321 
  635.     HWND hwnd = context->hwnd;
  636.     EnableDlgItemEx(hwnd,IDD_SET,FALSE,IDD_KEYLIST);//2.99A 970321 
  637.     mchar szkey[CCHNAME];
  638.     GetDlgItemText(hwnd,IDD_DISPLAYGUIDE,szkey,CCHNAME);
  639.     mchar szcaption[CCHWORD];
  640.     GetDlgItemText(hwnd,IDD_DISPLAY,szcaption,CCHWORD);
  641.     txstr szname = szcaption;
  642.     if (szkey[0]) {
  643.         if (!strcmp(strright(szname,3),"...")) {
  644.             szname = strleft(szname,strlen(szname) - 3);
  645.             szname += "(&" + chartostr(toupper(szkey[0])) + ")";
  646.             szname += "...";
  647.         } else {
  648.             szname += "(&" + chartostr(toupper(szkey[0])) + ")";
  649.         }
  650.     }
  651.     //
  652.     int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  653.     if (isel < context->cur->nmenuitem) {
  654.         GetDlgItemText(hwnd,IDD_COMMAND,context->cur->tmenuitem[isel].szcmd,CCHWORD);
  655.         strcpymax(context->cur->tmenuitem[isel].szcaption,szname,CCHWORD);
  656.         menuChanged(context,FALSE);
  657.         ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),isel);
  658.     }
  659.     context->fNoSetEdit--;//2.99A 970321 
  660. }
  661.  
  662. static void menuSet(MENUCONTEXT* context,mchar* szcmd)
  663. {
  664.     HWND hwnd = context->hwnd;
  665.     int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  666.     if (isel < context->cur->nmenuitem) {
  667.         TXMENUITEM* item = &context->cur->tmenuitem[isel];
  668.         strcpymax(item->szcmd,szcmd,CCHWORD);
  669.         if (szcmd[0] == '_') {
  670.             item->szcaption[0] = 0;
  671.         } else {
  672.             mchar*p = strchr(szcmd,'.');
  673.             if (p) {
  674.                 strcpymax(item->szcaption,p + 1,CCHWORD);
  675.             }
  676.         }
  677.         menuChanged(context,FALSE);
  678.         ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),isel);
  679.         menuCmdChanged(context);
  680.     }
  681. }
  682.  
  683. static TXMENUITEM* menuInsert(MENUCONTEXT* context)
  684. {
  685.     HWND hwnd = context->hwnd;
  686.     int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  687.     //
  688.     TXMENU* menu = context->cur;
  689.     if (menu->nmenuitem < TXMENUITEM_N) {
  690.         if (i < menu->nmenuitem) {
  691.             memmove(
  692.                 &menu->tmenuitem[i+1],
  693.                 &menu->tmenuitem[i],
  694.                 (TXMENUITEM_N - i - 1) * sizeof(TXMENUITEM)
  695.             );
  696.         }
  697.         menu->nmenuitem++;
  698.         return &menu->tmenuitem[i];
  699.     }
  700.     return NULL;
  701. }
  702.  
  703. static BOOL menuCopy(MENUCONTEXT* context)
  704. {
  705.     HWND hwnd = context->hwnd;
  706.     int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  707.     TXMENU* menu = context->cur;
  708.     if (i < menu->nmenuitem) {
  709.         context->fTxmenuClip = TRUE;
  710.         context->txmenuClip = menu->tmenuitem[i];
  711.         EnableWindow(GetDlgItem(hwnd,IDD_PASTE),TRUE);
  712.         return TRUE;
  713.     }
  714.     return FALSE;
  715. }
  716.  
  717. static BOOL menuDel(MENUCONTEXT* context)
  718. {
  719.     HWND hwnd = context->hwnd;
  720.     int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  721.     //
  722.     TXMENU* menu = context->cur;
  723.     if (i < menu->nmenuitem) {
  724.         menuCopy(context);
  725.         //
  726.         memcpy(
  727.             &menu->tmenuitem[i],
  728.             &menu->tmenuitem[i+1],
  729.             (TXMENUITEM_N - i - 1) * sizeof(TXMENUITEM)
  730.         );
  731.         menu->nmenuitem--;
  732.         return TRUE;
  733.     }
  734.     return FALSE;
  735. }
  736.  
  737. static BOOL menuExistName(MENUCONTEXT* context,mchar* szname)
  738. {
  739.     if (txmenuOp(TXMENUOP_SEARCH,szname,NULL)) return TRUE;
  740.     //
  741.     int i;
  742.     for (i = 0;i < context->nmenu;i++) {
  743.         TXMENU* menu = context->tmenu[i];
  744.         if (menu->fNew) {
  745.             if (!stricmp(menu->szname,szname)) return TRUE;
  746.         }
  747.     }
  748.     return FALSE;
  749. }
  750.  
  751. static TXMENU* menuAdd(MENUCONTEXT* context,BOOL fNew)
  752. {
  753.     txstr szname(CCHWORD);
  754.     szname = context->cur->szname;
  755.     
  756.     if (context->nmenu == MENU_N) {
  757.         attention("これ以上追加できません。\n一回ウィンドウを閉じてからやり直してください。");
  758.         return NULL;
  759.     }
  760.     while(1) {
  761.         HDIALOG hd;
  762.         
  763.         if (fNew) {
  764.             hd = dialog("新規メニュー");
  765.         } else {
  766.             hd = dialog("名前を付けて保存");
  767.         }
  768.         
  769.         dialogStr(hd,"名前(&N):",szname,10,CCHNAME);
  770.         dialogCaption(hd,"    (30文字まで)");
  771.         dialogCaption(hd,"    (メニュバーは、頭に\"bar_\"をつけてください)");
  772.         
  773.         if (dialogOpen(hd)) {
  774.             int len = strlen(szname);
  775.             if (len == 0) {
  776.                 attention("名前は省略できません");
  777.                 continue;
  778.             }
  779.             if (len >= CCHNAME) {
  780.                 attention("長さ制限を越えています");
  781.                 continue;
  782.             }
  783.             if (menuExistName(context,szname)) {
  784.                 attention("名前 %s は既に使われています。\n別の名前を指定してください。",szname);
  785.                 continue;
  786.             }
  787.             //
  788.             TXMENU* menu = menuCreate(context,szname);
  789.             if (menu) {
  790.                 if (!fNew) {
  791.                     memcpy(menu,context->cur,sizeof(TXMENU));
  792.                 }
  793.                 strcpy(menu->szname,szname);
  794.                 menu->fNew = TRUE;
  795.                 menuCmdChanged(context);
  796.             }
  797.             return menu;
  798.         } else {
  799.             return NULL;
  800.         }
  801.         break;
  802.     }
  803. }
  804.  
  805. static BOOL myfileCopy(mchar* src,mchar* dst)
  806. {
  807. //2.99G 970404 wzprint.cfgなどは存在せず、fileCopyがエラーになって取り込みが中断されていた
  808.     if (fileIsExist(src)) {
  809.         return fileCopy(src,dst);
  810.     }
  811.     return TRUE;
  812. }
  813.  
  814. static BOOL initUiConfig(mchar* szfilename)
  815. {
  816. //2.99D 970328 new
  817.     txstr szOriginal = text->szexedir + szfilename;
  818.     pathSetExt(szOriginal,NULL);
  819.     szOriginal += "0";
  820.     pathSetExt(szOriginal,pathGetExt(szfilename));
  821. //information(szOriginal);
  822.     if (fileIsExist(szOriginal)) {
  823.         BOOL ret = TRUE;
  824.         {
  825.             txstr szSys = text->szexedir + szfilename;
  826. //information("%s %s",szOriginal,szSys);
  827.             if (!myfileCopy(szOriginal,szSys)) {
  828.                 information("%sから%sにコピー失敗しました。",szOriginal,szSys);
  829.                 ret = FALSE;
  830.             }
  831.         }
  832.         if (ret) {
  833.             mchar szUser[CCHPATHNAME];
  834.             pathFullConfig(szUser,szfilename);
  835.             if (fileIsExist(szUser)) {
  836.                 if (!myfileCopy(szOriginal,szUser)) {
  837.                     information("%sから%sにコピー失敗しました。",szOriginal,szUser);
  838.                     ret = FALSE;
  839.                 }
  840.             }
  841.         }
  842.         return ret;
  843.     } else {
  844.         information("%sがありません。",szOriginal);
  845.         return FALSE;
  846.     }
  847. }
  848.  
  849. BOOL dlgprocCustmenu(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  850. {
  851.     HDIALOG hd = dialogFromHwnd(hwnd);
  852.     MENUCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
  853.     CMDSEL_HOOK
  854.     switch(message) {
  855.         case WM_INITDIALOG: {
  856.             context->hwnd = hwnd;
  857.             context->cur = menuLoad(context,context->szcur);
  858.             menuChanged(context,TRUE);
  859.             menuCmdChanged(context);
  860.             EnableWindow(GetDlgItem(hwnd,IDD_PASTE),FALSE);
  861.             if (!context->fMenubar) {
  862.                 HWND hctrl = GetDlgItem(hwnd,IDD_NAME);
  863.                 SendMessage(hctrl,CB_RESETCONTENT,0,0);
  864.                 SendMessage(hctrl,CB_SETEXTENDEDUI,TRUE,0);
  865.                 txmenuPickup((DWORD)hctrl,PICKUP_MENUCUST,0);
  866.                 if (context->szname) {
  867.                     int isel = txmenuPickup(NULL,PICKUP_MENUSEARCH,context->szname);
  868.                     if (isel != PICKUP_NOTFOUND) {
  869.                         SendMessage(hctrl,CB_SETCURSEL,isel,0);
  870.                     }
  871.                 } else {
  872.                     ComboBox_SetCurSel(hctrl,0);
  873.                 }
  874.             }
  875.             break;
  876.         }
  877. #ifdef __FLAT__
  878.         case WM_CONTEXTMENU: {
  879.             if (wParam == GetDlgItem(hwnd,IDD_KEYLIST)) {
  880.                 FORWARD_WM_COMMAND(hwnd,IDD_DETAIL,0,0,SendMessage);
  881.             }
  882.             break;
  883.         }
  884. #endif
  885.         case WM_COMMAND: {
  886.             int id = WM_COMMAND_GetId(wParam);
  887.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  888.             
  889.             switch(id) {
  890.                 case IDD_COMMAND:
  891.                 case IDD_DISPLAYGUIDE:
  892.                 case IDD_DISPLAY: {
  893.                     //2.99A 970321 
  894.                     if (!context->fNoSetEdit && notify == EN_CHANGE) {
  895.                         context->fEdited = TRUE;
  896.                         EnableDlgItem(hwnd,IDD_SET,TRUE);
  897.                     }
  898.                     break;
  899.                 }
  900.                 case IDD_NAME: {
  901.                     if (!context->fMenubar) {
  902.                         mchar szname[CCHWORD];
  903.                         GetDlgItemText(hwnd,IDD_NAME,szname,CCHWORD);
  904.                         context->cur = menuLoad(context,szname);
  905.                         menuChanged(context,TRUE);
  906.                         menuCmdChanged(context);
  907.                     }
  908.                     break;
  909.                 }
  910.                 case IDD_KEYLIST: {
  911.                     if (notify == LBN_SELCHANGE) {
  912.                         menuCmdChanged(context);
  913.                         return TRUE;
  914.                     } else if (notify == LBN_DBLCLK) {
  915.                         menuOpenClose(context);
  916.                     }
  917.                     break;
  918.                 }
  919.                 case IDD_BACK: {
  920.                     menuBack(context);
  921.                     break;
  922.                 }
  923.                 case IDD_NEXT: {
  924.                     menuNext(context);
  925.                     return TRUE;
  926.                 }
  927.                 case IDOK: {
  928.                     if (GetKeyState(VK_SHIFT) < 0) {
  929.                         menuOpenClose(context);
  930.                         return TRUE;
  931.                     } else {
  932. #if 1//2.99A 970321 OKされたときに自動の"←"はしない。問い合わせる
  933.                         if (context->fEdited) {
  934.                             int ret = question("変更中の内容を更新しますか?");
  935.                             if (ret == IDYES) {
  936.                                 SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
  937.                             } else if (ret == IDCANCEL) {
  938.                                 return TRUE;
  939.                             }
  940.                         }
  941. #else
  942.                         //1.97 OKされたときは"←"もやる
  943.                         SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
  944. #endif
  945.                     }
  946.                     break;
  947.                 }
  948.                 case IDD_SET: {
  949.                     //2.99C 970326 「表示」が空の場合に対処
  950.                     mchar szDisp[CCHWORD];
  951.                     GetDlgItemText(hwnd,IDD_DISPLAY,szDisp,cchof(szDisp));
  952.                     if (!szDisp[0]) {
  953.                         SetDlgItemText(hwnd,IDD_DISPLAY,"(名前なし)");
  954.                     }
  955.                     //
  956.                     menuWrite(context);
  957. #if 1    //2.99A 970321 「サブメニューを開く」ボタンがフラッシュされてなかった
  958.                     menuCmdChanged(context);
  959. #endif
  960.                     return TRUE;
  961.                 }
  962.                 case IDD_INSERT: {
  963.                     if (menuInsert(context)) menuWrite(context);
  964.                     return TRUE;
  965.                 }
  966.                 case IDD_INSERTNEW: {//2.99A 970321 
  967.                     if (menuInsert(context)) {
  968.                         SetDlgItemText(hwnd,IDD_COMMAND,"");
  969.                         SetDlgItemText(hwnd,IDD_DISPLAYGUIDE,"");
  970.                         SetDlgItemText(hwnd,IDD_DISPLAY,"(名前なし)");//2.99C 970326 「表示」が空だと間抜けだった
  971.                         menuWrite(context);
  972.                         menuCmdChanged(context);
  973.                     }
  974.                     return TRUE;
  975.                 }
  976.                 case IDD_PASTE: {
  977.                     if (context->fTxmenuClip) {
  978.                         int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  979.                         TXMENUITEM* item;
  980.                         if (item = menuInsert(context)) {
  981.                             *item = context->txmenuClip;
  982.                             menuChanged(context,FALSE);
  983.                             ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),isel);
  984.                             menuCmdChanged(context);
  985.                         }
  986.                     }
  987.                     return TRUE;
  988.                 }
  989.                 case IDD_COPY: {
  990.                     menuCopy(context);
  991.                     return TRUE;
  992.                 }
  993.                 case IDD_CUT: {
  994.                     if (menuDel(context)) {
  995.                         int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  996.                         menuChanged(context,FALSE);
  997.                         ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),isel);
  998.                         menuCmdChanged(context);
  999.                     }
  1000.                     return TRUE;
  1001.                 }
  1002.                 case IDD_SEPARATOR: {
  1003.                     if (menuInsert(context)) menuSet(context,"__sepa");
  1004.                     return TRUE;
  1005.                 }
  1006.                 case IDD_FILEHIST: {
  1007.                     if (menuInsert(context)) menuSet(context,"__filehist");
  1008.                     return TRUE;
  1009.                 }
  1010.                 case IDD_WINDOWLIST: {
  1011.                     if (menuInsert(context)) menuSet(context,"__windowlist");
  1012.                     return TRUE;
  1013.                 }
  1014.                 case IDD_UP: {
  1015.                     int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  1016.                     TXMENU* menu = context->cur;
  1017.                     if (0 < i && i < menu->nmenuitem) {
  1018.                         TXMENUITEM item = menu->tmenuitem[i-1];
  1019.                         menu->tmenuitem[i-1] = menu->tmenuitem[i];
  1020.                         menu->tmenuitem[i] = item;
  1021.                         //
  1022.                         i--;
  1023.                         menuChanged(context,FALSE);
  1024.                         ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),i);
  1025.                     }
  1026.                     return TRUE;
  1027.                 }
  1028.                 case IDD_DOWN: {
  1029.                     int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  1030.                     TXMENU* menu = context->cur;
  1031.                     if (0 <= i && i + 1 < menu->nmenuitem) {
  1032.                         TXMENUITEM item = menu->tmenuitem[i+1];
  1033.                         menu->tmenuitem[i+1] = menu->tmenuitem[i];
  1034.                         menu->tmenuitem[i] = item;
  1035.                         //
  1036.                         i++;
  1037.                         menuChanged(context,FALSE);
  1038.                         ListBox_SetCurSel(GetDlgItem(hwnd,IDD_KEYLIST),i);
  1039.                     }
  1040.                     return TRUE;
  1041.                 }
  1042.                 case IDD_SAVE: {
  1043.                     menuAdd(context,FALSE);
  1044.                     return TRUE;
  1045.                 }
  1046.                 case IDD_LOAD: {
  1047.                     TXMENU* menu;
  1048.                     if (menu = menuAdd(context,TRUE)) {
  1049.                         if (menuInsert(context)) {
  1050.                             txstr sz = "menu." + menu->szname;
  1051.                             menuSet(context,sz);
  1052.                         }
  1053.                     }
  1054.                     return TRUE;
  1055.                 }
  1056.                 case IDD_DETAIL: {
  1057. #if 1//2.90 
  1058.                     HMENU hmenu = menuNew();
  1059.                     
  1060.                     menuStr(hmenu,"セパレータの挿入(&S)",IDD_SEPARATOR);
  1061.                     menuStr(hmenu,"ファイルヒストリの挿入(&F)",IDD_FILEHIST);
  1062.                     menuStr(hmenu,"ウィンドウリストの挿入(&W)",IDD_WINDOWLIST);
  1063.                     menuStr(hmenu,"新規メニューの挿入(&M)...",IDD_LOAD);
  1064.                     menuSepa(hmenu);
  1065.                     AppendMenu(hmenu,MF_STRING|(MF_GRAYED*!_fEnableMenuNext),IDD_NEXT,"サブメニューの編集(&O)\tダブルクリック");
  1066.                     AppendMenu(hmenu,MF_STRING|(MF_GRAYED*!_fEnableMenuBack),IDD_BACK,"親メニューの編集(&B)\tダブルクリック");
  1067.                     menuStr(hmenu,"名前を付けて保存(&A)...",IDD_SAVE);
  1068.                     menuSepa(hmenu);
  1069.                     menuStr(hmenu,"コピー(&C)",IDD_COPY);
  1070.                     menuStr(hmenu,"貼り付け(&P)",IDD_PASTE);
  1071.                     POINT point;
  1072.                     GetCursorPos(&point);
  1073.                     TrackPopupMenu(hmenu,TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN,point.x,point.y,0,hwnd,NULL);
  1074.                     menuDelete(hmenu);
  1075. #else
  1076.                     HDIALOG hd = dialog("詳細");
  1077.                     int cx = 24;
  1078.                     dialogControlID(hd,IDD_SEPARATOR);
  1079.                     dialogCmd(hd,"セパレータの挿入(&S)",cx);
  1080.                     dialogControlID(hd,IDD_FILEHIST);
  1081.                     dialogCmd(hd,"ファイルヒストリの挿入(&F)",cx);
  1082.                     dialogControlID(hd,IDD_WINDOWLIST);
  1083.                     dialogCmd(hd,"ウィンドウリストの挿入(&W)",cx);
  1084.                     dialogSpaceV(hd);
  1085.                     dialogControlID(hd,IDD_LOAD);
  1086.                     dialogCmd(hd,"新規メニューの挿入(&M)...",cx);
  1087.                     dialogControlID(hd,IDD_SAVE);
  1088.                     dialogCmd(hd,"名前を付けて保存(&A)...",cx);
  1089.                     #if 0
  1090.                     dialogSpaceV(hd);
  1091.                     dialogControlID(hd,IDD_CLEAR);
  1092.                     dialogCmd(hd,"削除(&D)...",cx);
  1093.                     #endif
  1094.                     int id = dialogOpen(hd);
  1095.                     if (id) SendMessage(hwnd,WM_COMMAND,id,0);
  1096. #endif
  1097.                     return TRUE;
  1098.                 }
  1099.                 case IDD_DISPLAYSETAUTO: {//2.99C 970326 
  1100.                     mchar sz[CCHWORD] = {0};
  1101.                     HWND hctrl = GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN);
  1102.                     int n = ListBox_GetCount(hctrl);
  1103.                     if (n >= 2) {
  1104.                         listboxGetItemText(hctrl,1,sz,CCHWORD);
  1105.                     } else if (n) {
  1106.                         listboxGetItemText(hctrl,0,sz,CCHWORD);
  1107.                     }
  1108.                     SetDlgItemText(hwnd,IDD_DISPLAY,sz);
  1109.                     break;
  1110.                 }
  1111.                 case IDD_INIT: {//2.99D 970328 
  1112.                     int ret = question("メニュー定義を初期状態に戻します。よろしいですか?");
  1113.                     if (ret == IDYES) {
  1114.                         // OK
  1115.                         return FALSE;
  1116.                     } else {
  1117.                         return TRUE;
  1118.                     }
  1119.                     break;
  1120.                 }
  1121.             }
  1122.             break;
  1123.         }
  1124.         case CSN_SETSZCMD: {
  1125.             SetDlgItemText(hwnd,IDD_COMMAND,(mchar*)lParam);
  1126. #if 0//2.99A 970321 コマンドを選ぶと「表示」がコマンド名になっていた
  1127.             {
  1128.                 mchar sz[CCHWORD];
  1129.                 listboxGetItemText(GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN),0,sz,CCHWORD);
  1130.                 SetDlgItemText(hwnd,IDD_DISPLAY,sz);
  1131.             }
  1132. #endif
  1133.             break;
  1134.         }
  1135.     }
  1136.     return FALSE;
  1137. }
  1138.  
  1139. //2.00E 
  1140. static mchar* captionGet(mchar* szCaption)
  1141. {
  1142.     static mchar buff[CCHPATHNAME];
  1143.     strcpy(buff,szCaption);
  1144.     return buff;
  1145. }
  1146.  
  1147. static BOOL txuiCustMenu(TX* text,mchar* szname,BOOL fMenubar)
  1148. {
  1149.     int ret = 0;
  1150.     
  1151.     apidbOpen();
  1152.     //
  1153.     MENUCONTEXT context;
  1154.     structClear(context);
  1155.     context.text = text;
  1156.     strcpy(context.szcur,text->szMenu);
  1157.     context.fMenubar = fMenubar;
  1158.     context.szname = szname;
  1159.     _menucontext = &context;
  1160.     {
  1161.         int cxMenu = (_fwin40 ? 27 : 30);
  1162.         HDIALOG hd;
  1163.         if (fMenubar) {
  1164.             hd = dialogbig(captionGet("メニューバーのカスタマイズ"));
  1165.         } else {
  1166.             hd = dialogbig(captionGet("メニューのカスタマイズ"));
  1167.         }
  1168.         dialogSetCustdata(hd,(DWORD)&context);
  1169.         dialogSetHookEx(hd,"\m.dlgprocCustmenu");
  1170.         dialogSetContexthelp(hd,TRUE);
  1171.         
  1172.         if (fMenubar) {
  1173.             dialogControlID(hd,IDD_NAME);
  1174.             dialogCaptionDynamic(hd,NULL,cxMenu);
  1175.         } else {
  1176.             DTRECT r;
  1177.             dialogGetPos(hd,&r);
  1178.             r.cx = DTCX * 22;
  1179.             r.cy = DTCY * 10;
  1180.             __dialogAddItem(hd,"COMBOBOX",NULL,IDD_NAME,&r,CBS_AUTOHSCROLL|CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|WS_GROUP);
  1181.             dialogControlHelp(hd,373);
  1182.             _dialogAddControlInfo(hd,IDD_NAME);
  1183.             dialogSetPosY(hd,r.y + DTCY * 2);
  1184.         
  1185.         }
  1186.         dialogControlID(hd,IDD_KEYLIST);
  1187.         dialogControlHelp(hd,374);
  1188.         dialogList(hd,NULL,NULL,cxMenu,(_fwin40 ? 18+2 : 16));
  1189. #if 1//2.99A 970321 メニューカスタマイズ:「サブメニューの編集」と「戻る」が必要
  1190.         dialogSetH(hd);
  1191.         dialogControlHelp(hd,383);
  1192.         dialogControlID(hd,IDD_NEXT);
  1193.         dialogButton(hd,"サブメニューの編集(&E)",NULL,18);//3.00B1 970612 (&S)->(&E)
  1194.         //
  1195.         dialogControlHelp(hd,384);
  1196.         dialogControlID(hd,IDD_BACK);
  1197.         dialogButton(hd,"戻る(&B)",NULL,8);    // 「親メニューに戻る」だとWZ16で大きすぎる
  1198.         dialogLFSetV(hd);
  1199. #endif
  1200.         int ey = dialogGetPosY(hd) - DTCYINT;
  1201.         dialogLFV(hd);
  1202. #if 1//2.90 
  1203.         dialogSetPosY(hd,dialogGetPosY(hd) + DTCY * 4);
  1204. #else
  1205.         dialogSetPosY(hd,dialogGetPosY(hd) + DTCY * 1);
  1206. #endif
  1207.         int cx = _fwin40 ? 7 : 10;
  1208. #if 1//2.99A 970321 
  1209.         dialogControlID(hd,IDD_SET);
  1210.         dialogControlHelp(hd,375);
  1211.         dialogCmd(hd,"更新(&S)",cx);
  1212.         dialogControlID(hd,IDD_INSERTNEW);
  1213.         dialogControlHelp(hd,376);
  1214.         dialogCmd(hd,"挿入(&A)",cx);
  1215. #else
  1216.         dialogControlID(hd,IDD_SET);
  1217.         dialogControlHelp(hd,375);
  1218.         dialogCmd(hd,"← (&S)",cx);
  1219.         dialogControlID(hd,IDD_INSERT);
  1220.         dialogControlHelp(hd,376);
  1221.         dialogCmd(hd,"追加(&A)",cx);
  1222. #endif
  1223. #if 1//2.90 
  1224.         dialogControlID(hd,IDD_CUT);
  1225.         dialogControlHelp(hd,378);
  1226.         dialogCmd(hd,"削除(&T)",cx);
  1227. #else
  1228.         dialogSpaceV(hd);
  1229.         dialogControlID(hd,IDD_DETAIL);
  1230.         dialogControlHelp(hd,377);
  1231.         dialogCmd(hd,"詳細(&E)...",cx);
  1232.         dialogSpaceV(hd);
  1233.         dialogControlID(hd,IDD_CUT);
  1234.         dialogControlHelp(hd,378);
  1235.         dialogCmd(hd,"削除(&T)",cx);
  1236.         dialogControlID(hd,IDD_COPY);
  1237.         dialogControlHelp(hd,379);
  1238.         dialogCmd(hd,"コピー(&C)",cx);
  1239.         dialogControlID(hd,IDD_PASTE);
  1240.         dialogControlHelp(hd,380);
  1241.         dialogCmd(hd,"貼付(&P)",cx);
  1242. #endif
  1243.         dialogSpaceV(hd);
  1244.         dialogControlID(hd,IDD_UP);
  1245.         dialogControlHelp(hd,381);
  1246.         dialogCmd(hd,"↑ (&U)",cx);
  1247.         dialogControlID(hd,IDD_DOWN);
  1248.         dialogControlHelp(hd,382);
  1249.         dialogCmd(hd,"↓ (&D)",cx);
  1250. #if 1//2.90 
  1251.         dialogSpaceV(hd);
  1252.         dialogControlID(hd,IDD_DETAIL);
  1253.         dialogControlHelp(hd,377);
  1254.         dialogCmd(hd,"他(&O)...",cx);
  1255. #endif
  1256.         dialogLFV(hd);
  1257.         //
  1258.         dialogSpaceV(hd);
  1259.         dialogGroup(hd,"内容(&C)");
  1260.         dialogSetGroupBottom(hd,ey);
  1261.         {
  1262.             DTRECT r1,r2;
  1263.             int cx = _fwin40 ? 38 : 30;
  1264.             if (_fwin40) {//2.90 
  1265.                 cmdselSetIdb(IDB_CMDDEFAULT);//2.90 
  1266.                 dialogControlID(hd,IDD_CMDSEL_TREELIST);
  1267.                 dialogTree(hd,"機能一覧(&L):",NULL,cx,10);//2.98 970308 コマンド一覧->機能一覧
  1268.                 //2.99A 970321 機能一覧の下に、操作メニュー追加
  1269.                 dialogControlID(hd,IDD_CMDSEL_CONTEXTMENU);
  1270.                 dialogButton(hd,"機能一覧の操作(&O)...",NULL,20);
  1271.             } else {
  1272.                 cmdselSetIdb(IDB_CMD);//2.90 
  1273.                 dialogGetPos(hd,&r1);
  1274.                 r1.cx = DTCX * 12;r1.cy = DTCY;
  1275.                 r2.x = r1.x + r1.cx + DTCX;
  1276.                 r2.y = r1.y;
  1277.                 r2.cx = DTCX * (cx - 12 - 1);
  1278.                 r2.cy = DTCYBOX;
  1279.                 //
  1280.                 r2.cy = DTCY * 10;
  1281.                 _dialogAddLtext(hd,"分類一覧(&L):",&r1);
  1282.                 _dialogAddCombobox(hd,IDD_CMDSEL_CATEGORY,&r2);
  1283.                 dialogControlHelp(hd,359);
  1284.                 _dialogAddControlInfo(hd,IDD_CMDSEL_CATEGORY);
  1285.                 r1.y = r2.y = r2.y + DTCY * 2;
  1286.                 //
  1287.                 {
  1288.                     DTRECT r = r1;r.cx = DTCX * 16;
  1289.                     _dialogAddLtext(hd,"コマンド一覧(&W):",&r);
  1290.                 }
  1291.                 r2.x = r1.x;r2.cx = DTCX * 31;r2.y += DTCY*3/2;//2.00B コマンド一覧を大きくした
  1292.                 _dialogAddCombobox(hd,IDD_CMDSEL_LIST,&r2);
  1293.                 dialogControlHelp(hd,360);
  1294.                 _dialogAddControlInfo(hd,IDD_CMDSEL_LIST);
  1295.                 r1.y = r2.y = r2.y + DTCY * 2;
  1296.                 dialogSetPosY(hd,r1.y);
  1297.                 //2.00E4 
  1298.                 dialogSetH(hd);
  1299.                 dialogControlID(hd,IDD_CMDSEL_SEARCH);
  1300.                 dialogControlHelp(hd,229);
  1301.                 dialogButtonCmd(hd,"検索(&F)...",NULL,15);
  1302.                 dialogControlID(hd,IDD_CMDSEL_SEARCHNEXT);
  1303.                 dialogControlHelp(hd,229);
  1304.                 dialogButtonCmd(hd,"次検索(&N)",NULL,15);
  1305.                 dialogLF(hd);
  1306.                 dialogSetV(hd);
  1307.                 dialogSpaceV(hd);
  1308.             }
  1309.             //
  1310.             dialogGetPos(hd,&r1);
  1311.             r1.cx = DTCX * 12;r1.cy = DTCY;
  1312.             r2.x = r1.x + r1.cx + DTCX;
  1313.             r2.y = r1.y;
  1314.             r2.cx = DTCX * (cx - 12 - 1);r2.cy = DTCYBOX;
  1315.             //
  1316.             _dialogAddLtext(hd,"コマンド(&X):",&r1);
  1317.             _dialogAddEditbox(hd,IDD_COMMAND,&r2);
  1318.             dialogControlHelp(hd,361);
  1319.             _dialogAddControlInfo(hd,IDD_COMMAND);
  1320. #if 0//2.90 
  1321.             r1.y = r2.y = r2.y + DTCYBOX + DTCYINT;
  1322.             _dialogAddButton(hd,"メニューの編集(&O)",IDD_NEXT,&r2);
  1323.             dialogControlHelp(hd,383);
  1324.             _dialogAddControlInfo(hd,IDD_NEXT);
  1325.             r1.y = r2.y = r2.y + DTCYBOX + DTCYINT;
  1326.             _dialogAddButton(hd,"戻る(&B)",IDD_BACK,&r2);
  1327.             dialogControlHelp(hd,384);
  1328.             _dialogAddControlInfo(hd,IDD_BACK);
  1329. #endif
  1330.             r1.y = r2.y = r2.y + DTCY * 2;
  1331.             _dialogAddLtext(hd,"表示(&Y):",&r1);
  1332.             _dialogAddEditbox(hd,IDD_DISPLAY,&r2);
  1333.             dialogControlHelp(hd,385);
  1334.             _dialogAddControlInfo(hd,IDD_DISPLAY);
  1335.             //2.99C 970326 「表示」にコマンドの説明をセットするボタンを追加
  1336. #if 1//2.99C 970326 
  1337.             r1.y = r2.y = r2.y + DTCYBOX + DTCYINT;
  1338.             _dialogAddButton(hd,"説明からコピー(&Z)",IDD_DISPLAYSETAUTO,&r2);
  1339.             dialogControlHelp(hd,431);
  1340.             _dialogAddControlInfo(hd,IDD_DISPLAYSETAUTO);
  1341.             r1.y = r2.y = r2.y + DTCYBOX + DTCYINT * 2;
  1342. #else
  1343.             //2.99C 970326 
  1344.             r1.y = r2.y = r2.y + DTCY * 2;
  1345.             dialogSetPosY(hd,r1.y);
  1346.             dialogControlID(hd,IDD_DISPLAYSETAUTO);
  1347.             dialogButton(hd,"コマンドの説明を表示(&Z)",NULL,30);
  1348.             dialogSpaceV(hd);
  1349.             r1.y = r2.y = dialogGetPosY(hd);
  1350. #endif
  1351.             //
  1352.             _dialogAddLtext(hd,"アクセスキー(&K):",&r1);
  1353.             _dialogAddEditbox(hd,IDD_DISPLAYGUIDE,&r2);
  1354.             dialogControlHelp(hd,386);
  1355.             _dialogAddControlInfo(hd,IDD_DISPLAYGUIDE);
  1356.         }
  1357.         dialogGroupEnd(hd);
  1358.         
  1359.         dialogLFV(hd);
  1360.         int xcmd = dialogGetPosX(hd) + DTCX * 1;
  1361.         
  1362.         dialogLF(hd);
  1363.         dialogSpaceV(hd);
  1364.         //2.00E4 
  1365.         dialogSetIntXY(hd,0,0);
  1366.         dialogCaption(hd,"コマンドの説明:");
  1367.         dialogResetInt(hd);
  1368.         DTRECT r;
  1369.         dialogGetPos(hd,&r);
  1370.         r.cx = DTCX * 80;
  1371.         r.cy = DTCY * (_fwin40 ? 7 : 4);
  1372.         _dialogAddListbox(hd,IDD_CMDSEL_EXPLAIN,&r);
  1373.         dialogControlHelp(hd,372);
  1374.         _dialogAddControlInfo(hd,IDD_CMDSEL_EXPLAIN);
  1375.         
  1376.         dialogLFV(hd);
  1377.         dialogSetPosX(hd,xcmd);
  1378.         int cx = _fwin40 ? 8 : 11;
  1379.         dialogOK(hd,cx);
  1380.         dialogCancel(hd,cx);
  1381.         
  1382.         dialogHelpID(hd,cx,"wz",IDH_CUSTMENU);
  1383.         dialogSpaceV(hd);
  1384.         
  1385.         //2.99D 970328 
  1386.         dialogSpaceV(hd);
  1387.         dialogControlID(hd,IDD_INIT);
  1388.         dialogCmd(hd,"初期化...",cx);
  1389.         
  1390.         ret = dialogOpen(hd);
  1391.     }
  1392.     if (ret == IDD_INIT) {//2.99D 970328 
  1393.         if (initUiConfig("wz.mnu")) {
  1394.             // OK
  1395.             call("custmize.createEnglishMenu");    // 英語メニューを自動生成する
  1396.             txFlushUI(text);
  1397.         }
  1398.         return FALSE;
  1399.     } else if (ret) {
  1400.         int i;
  1401.         for (i = 0;i < context.nmenu;i++) {
  1402.             txmenuOp(TXMENUOP_SAVEEX,(LPVOID)context.tmenu[i],NULL);
  1403.         }
  1404.         SendMessage(text->hwndbase,WM_TXFLUSHMENU,0,0);
  1405.         apidb2FlushCache();
  1406.     }
  1407.     // 後始末
  1408.     _menucontext = NULL;
  1409.     apidbClose();
  1410.     {
  1411.         int i;
  1412.         for (i = 0;i < context.nmenu;i++) {
  1413.             free(context.tmenu[i]);
  1414.         }
  1415.     }
  1416.     return ret;
  1417. }
  1418.  
  1419. BOOL TXCMDBASE menubar(void)
  1420. {
  1421. // メニューバーのカスタマイズ
  1422.     return txuiCustMenu(text,NULL,TRUE);
  1423. }
  1424.  
  1425. menuMouseR
  1426. {
  1427.     return txuiCustMenu(text,text->szMenuMouseR,FALSE);
  1428. }
  1429.  
  1430. menuMouseRClip
  1431. {
  1432.     return txuiCustMenu(text,text->szMenuMouseRClip,FALSE);
  1433. }
  1434.  
  1435. menu
  1436. {
  1437.     return txuiCustMenu(text,"ファイル",FALSE);// 初期値が"bar_xxx"だと良くないので明示
  1438. }
  1439.  
  1440. //##キー
  1441.  
  1442. //{###編集}
  1443.  
  1444. #define txGetFkey(text,ikind,ikey) \
  1445.     (text->tszfkey + (ikind) * FKEY_NKEY * FKEY_SIZE + (ikey) * FKEY_SIZE)
  1446.  
  1447. BOOL TXAPI _txKeySave(TX* text,mchar* szKey,BOOL fFKeySave)
  1448. {
  1449. // キーを保存
  1450. // fFKeySaveが真ならファンクションキー表示内容も保存
  1451. //3.00A2 970507 txKeySaveの補完のため、TXAPI化
  1452.     if (!szKey[0]) return FALSE;
  1453.     txmenuOp(TXKEYOP_DEL,szKey,NULL);
  1454.     //
  1455.     TX* txkey = (TX*)txmenuOp(TXKEYOP_OPEN,NULL,NULL);
  1456.     {
  1457.         txInsertf(txkey,"[%s]\n",szKey);
  1458.         //
  1459.         WZKEY wzkey;
  1460.         WZKEY wzkeyEnd = wzkeyGetEnd();
  1461.         for (wzkey = 1;wzkey <= wzkeyEnd;wzkey++) {
  1462.             WZCMD wzcmd = txKeyGetWzcmd(text,wzkey);
  1463.             if (wzcmd) {
  1464.                 if (WZCMD_PRETOP <= wzcmd && wzcmd <= WZCMD_PREEND) continue;
  1465.                 mchar szkey[CCHKEY];
  1466.                 txInsertf(txkey,"%s=%s\n",wzcmdToSzcmd(wzcmd),txWzkeyToSzkey(text,wzkey,szkey));
  1467.             }
  1468.         }
  1469.         if (fFKeySave && text->tszfkey) {
  1470.             int ikind;
  1471.             for (ikind = 0;ikind < FKEY_NKIND;ikind++) {
  1472.                 static mchar* tszcaption[FKEY_NKIND] = {
  1473.                     "","+SHIFT","+CTRL","+SHIFT+CTRL",
  1474.                 };
  1475.                 txInsertf(txkey,"FKEY%s=",tszcaption[ikind]);
  1476.                 int i;
  1477.                 for (i = 0;i < FKEY_NKEY;i++) {
  1478.                     txInsertf(txkey,"\"%s\" ",txGetFkey(text,ikind,i));
  1479.                 }
  1480.                 txInsert(txkey,"\n");
  1481.             }
  1482.         }
  1483.     }
  1484.     txmenuOp(TXKEYOP_CLOSE,NULL,NULL);
  1485.     text->share->fKeyInited = FALSE;// shareのキャッシングを無効化する
  1486.     return TRUE;
  1487. }
  1488.  
  1489. static BOOL txkeyPickup(HWND dst)
  1490. {
  1491.     return txmenuPickup(dst,PICKUP_KEYALL,NULL);
  1492. }
  1493.  
  1494. //{###設定}
  1495.  
  1496. BOOL TXAPI txKeySave(TX* text)
  1497. {
  1498. // 現在のキー定義をカレントキーファイルに保存します
  1499. // 使用中の.keyファイルも書き換えます
  1500. // ファンクションキー表示内容は保存しないので注意してください。
  1501. // ファンクションキー表示内容を保存するには
  1502. //   _txKeySave(text,text->szKey,TRUE);
  1503. // してください。
  1504. //2.96A 970214 旧wzkeySave
  1505.     return _txKeySave(text,text->szKey,FALSE);
  1506. }
  1507.  
  1508. mchar TXAPI *szkeyFromStr(mchar szkey[CCHKEY],mchar *szstr)
  1509. {
  1510. // 「Shift+LEFT」のようなszstrのキー指定を、
  1511. // szkeyに「+[LEFT]」のように変換します
  1512. // szkeyを返します
  1513.     mchar *dst = szkey;
  1514.     while(1) {
  1515.         int len;
  1516.         if (len = strmatch(szstr,"Shift+")) {
  1517.             szstr += len;
  1518.             *dst++ = '+';
  1519.         } else if (len = strmatch(szstr,"Ctrl+")) {
  1520.             szstr += len;
  1521.             *dst++ = '^';
  1522.         } else if (len = strmatch(szstr,"Alt+")) {
  1523.             szstr += len;
  1524.             *dst++ = '@';
  1525.         } else {
  1526.             break;
  1527.         }
  1528.     }
  1529.     if (strlen(szstr) >= 2) {
  1530.         mchar *p = strchr(szstr,'-');
  1531.         if (p) {
  1532.             int len = p - szstr;
  1533.             if (len >= 2) {
  1534.                 *dst++ = '[';
  1535.                 strcpylen(dst,szstr,len);
  1536.                 dst += len;
  1537.                 *dst++ = ']';
  1538.             } else {
  1539.                 *dst++ = *szstr;
  1540.             }
  1541.             p++;
  1542.             strcpy(dst,p);
  1543.         } else {
  1544.             *dst++ = '[';
  1545.             strcpy(dst,szstr);
  1546.             strcat(dst,"]");
  1547.         }
  1548.     } else {
  1549.         strcpy(dst,szstr);
  1550.     }
  1551.     return szkey;
  1552. }
  1553.  
  1554. //##UI
  1555.  
  1556. typedef struct {
  1557.     HWND hwnd;
  1558.     tx* text;
  1559.     WZCMD wzcmdClip;
  1560.     WZCMD wzcmdSeled;
  1561.     BOOL fCustCharKeyAble;
  1562.     BOOL fEdited;//2.99A 970321 編集された?
  1563.     BOOL fNoSetEdit;//2.99A 970321 fEditedを変更しない?
  1564. } KEYCONTEXT;
  1565.  
  1566. static void keylistPre(KEYCONTEXT* context,HWND hctrl,mchar *szkey,int npre)
  1567. {
  1568.     TX* text = context->text;
  1569.     WZKEY wzkey = txWzkeyFromSzkey(text,szkey);
  1570.     WZCMD wzcmd = txKeyGetWzcmd(text,wzkey);
  1571.     if (WZCMD_PRETOP <= wzcmd && wzcmd <= WZCMD_PREEND) {
  1572.         if (wzcmd == WZCMD_PRETOP + npre - 1) {
  1573.             mchar szpre[CCHKEY];
  1574.             if (*szkey == '[') {
  1575.                 strcpy(szpre,szkey+1);
  1576.                 *strchr(szpre,']') = 0;
  1577.             } else {
  1578.                 strcpy(szpre,"Ctrl+");
  1579.                 strcat(szpre,szkey+1);
  1580.             }
  1581.             strcat(szpre,"-");
  1582.             {
  1583.                 int ch;
  1584.                 for (ch = 0x40;ch <= 0x5F;ch++) {
  1585.                     ListBox_AddString(hctrl,szpre+chartostr(ch));
  1586.                 }
  1587.                 for (ch = '0';ch <= '9';ch++) {
  1588.                     ListBox_AddString(hctrl,szpre+chartostr(ch));
  1589.                 }
  1590.             }
  1591.         }
  1592.     }
  1593. }
  1594.  
  1595. // 現在リストボックスで選択されているキーのコードを返す
  1596. // 選択されているキーに応じてボタンのイネーブル状態も設定
  1597. static WZKEY keylistGetWzkey(KEYCONTEXT* context)
  1598. {
  1599.     HWND hwnd = context->hwnd;
  1600.     TX* text = context->text;
  1601.     int isel = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  1602.     if (isel != LB_ERR) {
  1603.         mchar szstr[CCHWORD];
  1604.         ListBox_GetText(GetDlgItem(hwnd,IDD_KEYLIST),isel,(LPARAM)szstr);
  1605.         
  1606.         mchar szkey[CCHKEY];
  1607.         szkeyFromStr(szkey,szstr);
  1608.         WZKEY wzkey = txWzkeyFromSzkey(text,szkey);
  1609.         
  1610.         EnableDlgItem(
  1611.             hwnd,IDD_2KEY_ADD,
  1612.             SendDlgItemMessage(hwnd,IDD_2KEY,CB_GETCURSEL,0,0) == 0 &&// 1ストロークキーを表示中
  1613.             txKeyGetWzcmd(text,wzkey) < WZCMD_PRETOP &&    // 2ストロークキーでない
  1614.             (
  1615.                 szkey[0] == '[' ||
  1616.                 (szkey[0] == '^' && isalpha(szkey[1]))
  1617.             )
  1618.         );
  1619.         
  1620.         return wzkey;
  1621.     }
  1622.     return 0;
  1623. }
  1624.  
  1625. static void keylistMake(KEYCONTEXT* context,int npre)
  1626. {
  1627.     HWND hwnd = context->hwnd;
  1628.     HWND hctrl = GetDlgItem(hwnd,IDD_KEYLIST);
  1629.     int isel = ListBox_GetCurSel(hctrl);
  1630.     if (isel == -1) isel = 0;
  1631.     ListBox_ResetContent(hctrl);
  1632.     EnableDlgItem(hwnd,IDD_2KEY_ADD,FALSE);
  1633.     if (npre) {
  1634.         mchar **tszvk = wzkeyGetVk();
  1635.         mchar *szvk;
  1636.         int i;
  1637.         for (i = 0;szvk = tszvk[i];i++) {
  1638.             keylistPre(context,hctrl,"[" + szvk + "]",npre);
  1639.         }
  1640.         int ch;
  1641.         for (ch = 'A';ch <= 'Z';ch++) {
  1642.             keylistPre(context,hctrl,"^" + chartostr(ch),npre);
  1643.         }
  1644.     } else {
  1645.         BOOL fchar = !context->fCustCharKeyAble;// [A]-[Z]が文字を生成する
  1646.         txstr szshift;
  1647.         if (IsDlgButtonChecked(hwnd,IDD_SHIFT)) szshift += "Shift+";
  1648.         if (IsDlgButtonChecked(hwnd,IDD_CTRL)) {
  1649.             fchar = FALSE;
  1650.             szshift += "Ctrl+";
  1651.         }
  1652.         if (IsDlgButtonChecked(hwnd,IDD_ALT)) {
  1653.             fchar = FALSE;
  1654.             szshift += "Alt+";
  1655.         }
  1656.         {
  1657.             mchar **tszvk = wzkeyGetVk();
  1658.             mchar *szvk;
  1659.             int i;
  1660.             for (i = 0;szvk = tszvk[i];i++) {
  1661.                 // Spaceは最後に追加する
  1662.                 // Shift状態が変わってもできるだけカーソル位置を同じにするため
  1663.                 if (!stricmp(szvk,"Space")) continue;
  1664.                 //
  1665.                 ListBox_AddString(hctrl,szshift+szvk);
  1666.             }
  1667.             if (
  1668.                 !IsDlgButtonChecked(hwnd,IDD_ALT) &&
  1669.                 (
  1670.                     IsDlgButtonChecked(hwnd,IDD_SHIFT) ||
  1671.                     IsDlgButtonChecked(hwnd,IDD_CTRL)
  1672.                 )
  1673.             ) {
  1674.                 ListBox_AddString(hctrl,szshift+"Space");
  1675.             }
  1676.         }
  1677.         if (!fchar) {
  1678.             int i;
  1679.             for (i = 0x40;i <= 0x5F;i++) {
  1680.                 int ch = i;
  1681.                 #if 0 //1.00H5 ここだけ変えても駄目。
  1682.                 switch(ch) {
  1683.                     case '@': ch = '2';break;
  1684.                     case '^': ch = '6';break;
  1685.                     case '\\': ch = '7';break;
  1686.                     case '_': ch = '-';break;
  1687.                 }
  1688.                 #endif
  1689.                 ListBox_AddString(hctrl,szshift+chartostr(ch));
  1690.             }
  1691.         }
  1692.     }
  1693.     SendDlgItemMessage(hwnd,IDD_2KEY,CB_SETCURSEL,npre,0);
  1694.     ListBox_SetCurSel(hctrl,isel);
  1695. }
  1696.  
  1697. // 2ストロークキーグループボックスの表示内容をフラッシュする
  1698. static void prelistFlush(KEYCONTEXT* context)
  1699. {
  1700.     HWND hwnd = context->hwnd;
  1701.     TX* text = context->text;
  1702.     WZCMD wzcmd;
  1703.     HWND hctrl = GetDlgItem(hwnd,IDD_2KEY);
  1704.     SendMessage(hctrl,CB_RESETCONTENT,0,0);
  1705.     SendMessage(hctrl,CB_ADDSTRING,0,(LPARAM)"1ストロークキー");
  1706.     for (wzcmd = WZCMD_PRETOP;wzcmd <= WZCMD_PREEND;wzcmd++) {
  1707.         WZKEY wzkey = txKeySearch(text,0,wzcmd);
  1708.         mchar szstr[CCHWORD];
  1709.         if (wzkey) {
  1710.             mchar szkey[CCHKEY];
  1711.             txWzkeyToSzkey(text,wzkey,szkey);
  1712.             szkeyToStr(szkey,szstr);
  1713.         } else {
  1714.             strcpy(szstr,"空き");
  1715.         }
  1716.         SendMessage(hctrl,CB_ADDSTRING,0,(LPARAM)szstr);
  1717.     }
  1718. }
  1719.  
  1720. static BOOL IsFKeyDisp(KEYCONTEXT* context,WZKEY wzkey,int *modeshift,int *ikey)
  1721. {
  1722. // wzkeyがファンクションバーに表示可能なものなら、modeshift/ikeyに
  1723. // ファンクションキー番号をセットしてTRUEを返す
  1724. // そうでなければFALSEを返す
  1725.     TX* text = context->text;
  1726.     BOOL ffkey = FALSE;
  1727.     mchar szkey[CCHKEY];
  1728.     txWzkeyToSzkey(text,wzkey,szkey);
  1729.     if (
  1730.         (
  1731.             strmatch(szkey,"[F") ||
  1732.             strmatch(szkey,"+[F") ||
  1733.             strmatch(szkey,"^[F") ||
  1734.             strmatch(szkey,"+^[F")
  1735.         ) &&
  1736.         (atoi(strstr(szkey,"[F") + 2) <= FKEY_NKEY)
  1737.     ) {
  1738.         //
  1739.         *modeshift = FKEY_NORMAL;
  1740.         if (szkey[0] == '+') {
  1741.             if (szkey[1] == '^') {
  1742.                 *modeshift = FKEY_SHIFTCTRL;
  1743.             } else {
  1744.                 *modeshift = FKEY_SHIFT;
  1745.             }
  1746.         } else if (szkey[0] == '^') {
  1747.             *modeshift = FKEY_CTRL;
  1748.         }
  1749.         //
  1750.         *ikey = atoi(strstr(szkey,"[F") + 2) - 1;
  1751.         return TRUE;
  1752.     }
  1753.     return FALSE;
  1754. }
  1755.  
  1756. static void keyFlushDisp(KEYCONTEXT* context)
  1757. {
  1758.     context->fNoSetEdit++;//2.99A 970321 
  1759.     context->fEdited = FALSE;//2.99A 970321 
  1760.     HWND hwnd = context->hwnd;
  1761.     EnableDlgItemEx(hwnd,IDD_SET,FALSE,IDD_KEYLIST);//2.99A 970321 
  1762.     TX* text = context->text;
  1763.     WZKEY wzkey = keylistGetWzkey(context);
  1764.     int modeshift;
  1765.     int ikey;
  1766.     HWND hctrl = GetDlgItem(hwnd,IDD_DISPLAY);
  1767.     BOOL fDisp = IsFKeyDisp(context,wzkey,&modeshift,&ikey);
  1768.     EnableWindow(hctrl,fDisp);
  1769.     EnableWindow(GetDlgItem(hwnd,IDD_DISPLAYGUIDE),fDisp);
  1770.     if (fDisp && text->tszfkey) {
  1771.         SetWindowText(hctrl,txGetFkey(text,modeshift,ikey));
  1772.     } else {
  1773.         SetWindowText(hctrl,"");
  1774.     }
  1775.     context->fNoSetEdit--;//2.99A 970321 
  1776. }
  1777.  
  1778. static BOOL keySave(KEYCONTEXT* context)
  1779. {
  1780.     HWND hwnd = context->hwnd;
  1781.     TX* text = context->text;
  1782.     txstr szstr = text->szKey;
  1783.     while(1) {
  1784.         HDIALOG hd = dialog("キー定義を名前を付けて保存");
  1785.         dialogStr(hd,"キー定義名:",szstr,12,20);
  1786.         if (dialogOpen(hd)) {
  1787.             if (txmenuPickup(NULL,PICKUP_KEYSEARCH,szstr) != PICKUP_NOTFOUND) {
  1788.                 int ret = question("%sは存在します。上書きしますか?",szstr);
  1789.                 if (ret == IDNO) return FALSE;
  1790.                 if (ret == IDYES) {
  1791.                     _txKeySave(text,szstr,TRUE);
  1792.                     return TRUE;
  1793.                 }
  1794.             } else {
  1795.                 _txKeySave(text,szstr,TRUE);
  1796.                 return TRUE;
  1797.             }
  1798.         } else {
  1799.             return FALSE;
  1800.         }
  1801.     }
  1802. }
  1803.  
  1804. static void keyChanged(KEYCONTEXT* context)
  1805. {
  1806.     context->fNoSetEdit++;//2.99A 970321 
  1807.     context->fEdited = FALSE;//2.99A 970321 
  1808.     HWND hwnd = context->hwnd;
  1809.     EnableDlgItemEx(hwnd,IDD_SET,FALSE,IDD_KEYLIST);//2.99A 970321 
  1810.     WZKEY wzkey = keylistGetWzkey(context);
  1811.     WZCMD wzcmd = txKeyGetWzcmd(context->text,wzkey);
  1812.     mchar* szcmd = wzcmdToSzcmd(wzcmd);
  1813.     if (wzcmd == 0) szcmd = "";
  1814.     SetDlgItemText(hwnd,IDD_COMMAND,szcmd);
  1815.     SendMessage(hwnd,CS_SETSZCMD,0,(LPARAM)szcmd);
  1816.     // ファンクションキー表示
  1817.     keyFlushDisp(context);
  1818.     context->fNoSetEdit--;//2.99A 970321 
  1819. }
  1820.  
  1821. static BOOL keyCopy(KEYCONTEXT* context)
  1822. {
  1823.     HWND hwnd = context->hwnd;
  1824.     TX* text = context->text;
  1825.     WZKEY wzkey = keylistGetWzkey(context);
  1826.     WZCMD wzcmd = txKeyGetWzcmd(text,wzkey);
  1827.     if (wzcmd) {
  1828.         context->wzcmdClip = wzcmd;
  1829.         EnableWindow(GetDlgItem(hwnd,IDD_PASTE),TRUE);
  1830.         return TRUE;
  1831.     }
  1832.     return FALSE;
  1833. }
  1834.  
  1835. BOOL dlgprocKeycust(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  1836. {
  1837.     HDIALOG hd = dialogFromHwnd(hwnd);
  1838.     KEYCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
  1839.     TX* text = context->text;
  1840.     CMDSEL_HOOK
  1841.     switch(message) {
  1842.         case WM_INITDIALOG: {
  1843.             context->hwnd = hwnd;
  1844.             prelistFlush(context);
  1845.             keylistMake(context,0);
  1846.             EnableDlgItem(hwnd,IDD_2KEY_DEL,FALSE);
  1847.             keyFlushDisp(context);
  1848.             EnableWindow(GetDlgItem(hwnd,IDD_PASTE),FALSE);
  1849.             keyChanged(context);//1.97 init
  1850.             break;
  1851.         }
  1852.         case WM_COMMAND: {
  1853.             int id = WM_COMMAND_GetId(wParam);
  1854.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  1855.             
  1856.             if (notify == LBN_SELCHANGE) {
  1857.                 if (id == IDD_KEYLIST) {
  1858.                     keyChanged(context);
  1859.                 }
  1860.             } else if (
  1861.                 id == IDD_SHIFT ||
  1862.                 id == IDD_CTRL ||
  1863.                 id == IDD_ALT
  1864.             ) {
  1865.                 keylistMake(context,0);
  1866.                 keyChanged(context);//2.00B キーカスタマイズのShift,Ctrl,Altをチェックしてもコマンドが変わらなかった
  1867.             } else if (id == IDD_2KEY_ADD) {
  1868.                 WZKEY wzkey = keylistGetWzkey(context);
  1869.                 mchar szkey[CCHKEY];
  1870.                 if (question("%s を2ストロークキーとして登録しますか?",txWzkeyToSzkey(text,wzkey,szkey)) == IDYES) {
  1871.                     txKeySetWzcmd(text,wzkey,WZCMD_PRETOP);
  1872.                     int npre = txKeyGetWzcmd(text,wzkey) - WZCMD_PRETOP + 1;
  1873.                     EnableDlgItem(hwnd,id,FALSE);
  1874.                     prelistFlush(context);
  1875.                     //
  1876.                     keylistMake(context,npre);
  1877.                     SendDlgItemMessage(hwnd,IDD_2KEY,CB_SETCURSEL,npre,0);
  1878.                 }
  1879.             }
  1880.             switch(id) {
  1881.                 case IDD_COMMAND:
  1882.                 case IDD_DISPLAY: {
  1883.                     //2.99A 970321 
  1884.                     if (!context->fNoSetEdit && notify == EN_CHANGE) {
  1885.                         context->fEdited = TRUE;
  1886.                         EnableDlgItem(hwnd,IDD_SET,TRUE);
  1887.                     }
  1888.                     break;
  1889.                 }
  1890.                 case IDD_2KEY: {
  1891.                     if (notify == CBN_SELCHANGE) {
  1892.                         int npre = SendDlgItemMessage(hwnd,IDD_2KEY,CB_GETCURSEL,0,0);
  1893.                         EnableDlgItem(hwnd,IDD_2KEY_DEL,txKeySearch(text,0,WZCMD_PRETOP + npre - 1));
  1894.                         EnableDlgItem(hwnd,IDD_SHIFT,!npre);
  1895.                         EnableDlgItem(hwnd,IDD_CTRL,!npre);
  1896.                         EnableDlgItem(hwnd,IDD_ALT,!npre);
  1897.                         keylistMake(context,npre);
  1898.                         keyChanged(context);//2.00D キーカスタマイズの2ストロークキーを選択してもコマンドが変わらなかった
  1899.                     }
  1900.                     break;
  1901.                 }
  1902.                 case IDD_LOAD: {
  1903.                     if (keysLoad(hwnd,context->text,PICKUP_KEYALL,NULL)) {
  1904.                         prelistFlush(context);
  1905.                         keylistMake(context,0);
  1906.                     }
  1907.                     return TRUE;
  1908.                 }
  1909.                 case IDD_SAVE: {
  1910.                     keySave(context);
  1911.                     return TRUE;
  1912.                 }
  1913.                 case IDD_2KEY_DEL: {
  1914.                     int npre = SendDlgItemMessage(hwnd,IDD_2KEY,CB_GETCURSEL,0,0);
  1915.                     WZKEY wzkey = txKeySearch(text,0,WZCMD_PRETOP + npre - 1);
  1916.                     mchar szkey[CCHKEY];
  1917.                     if (question("2ストロークキー %s を削除してもよろしいですか?",txWzkeyToSzkey(text,wzkey,szkey)) == IDYES) {
  1918.                         txKeySetWzcmd(text,wzkey,0);
  1919.                         prelistFlush(context);
  1920.                         keylistMake(context,npre);
  1921.                         EnableDlgItem(hwnd,id,FALSE);
  1922.                     }
  1923.                     break;
  1924.                 }
  1925.                 case IDD_SET: {
  1926.                     mchar szcmd[CCHWORD];
  1927.                     GetDlgItemText(hwnd,IDD_COMMAND,szcmd,CCHWORD);
  1928.                     WZCMD wzcmd = wzcmdRegister(szcmd);
  1929.                     WZKEY wzkey = keylistGetWzkey(context);
  1930.                     if (wzcmd) {
  1931.                         txKeySetWzcmd(text,wzkey,wzcmd);
  1932.                     }
  1933.                     // ファンクションキー表示
  1934.                     int modeshift;
  1935.                     int ikey;
  1936.                     if (IsFKeyDisp(context,wzkey,&modeshift,&ikey) && text->tszfkey) {
  1937.                         GetDlgItemText(hwnd,IDD_DISPLAY,txGetFkey(text,modeshift,ikey),FKEY_SIZE);
  1938.                     }
  1939.                     return TRUE;
  1940.                 }
  1941.                 case IDD_PASTE: {
  1942.                     if (context->wzcmdClip) {
  1943.                         WZKEY wzkey = keylistGetWzkey(context);
  1944.                         txKeySetWzcmd(text,wzkey,context->wzcmdClip);
  1945.                         keyChanged(context);
  1946.                     }
  1947.                     return TRUE;
  1948.                 }
  1949.                 case IDD_COPY: {
  1950.                     keyCopy(context);
  1951.                     return TRUE;
  1952.                 }
  1953.                 case IDD_CUT: {
  1954.                     WZKEY wzkey = keylistGetWzkey(context);
  1955.                     keyCopy(context);
  1956.                     // 削除
  1957.                     txKeySetWzcmd(text,wzkey,0);
  1958.                     // ファンクションキー表示
  1959.                     int modeshift;
  1960.                     int ikey;
  1961.                     if (IsFKeyDisp(context,wzkey,&modeshift,&ikey) && text->tszfkey) {
  1962.                         txGetFkey(text,modeshift,ikey)[0] = 0;
  1963.                     }
  1964.                     //
  1965.                     SetDlgItemText(hwnd,IDD_COMMAND,"");
  1966.                     SendMessage(hwnd,CS_SETSZCMD,0,(LPARAM)"");
  1967.                     return TRUE;
  1968.                 }
  1969.                 case IDD_CMDTEST: {
  1970.                     EndDialog(hwnd,id);
  1971.                     break;
  1972.                 }
  1973.                 case IDD_CMDUNDO: {
  1974.                     txKeyLoad(text);
  1975.                     break;
  1976.                 }
  1977.                 case IDOK: {
  1978. #if 1//2.99A 970321 OKされたときに自動の"←"はしない。問い合わせる
  1979.                     if (context->fEdited) {
  1980.                         int ret = question("変更中の内容を更新しますか?");
  1981.                         if (ret == IDYES) {
  1982.                             SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
  1983.                         } else if (ret == IDCANCEL) {
  1984.                             return TRUE;
  1985.                         }
  1986.                     }
  1987. #else
  1988.                     //1.97 OKされたときは"←"もやる
  1989.                     SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
  1990. #endif
  1991.                     //
  1992.                     context->wzcmdSeled = keylistGetWzkey(context);
  1993.                     break;
  1994.                 }
  1995.                 case IDD_INIT: {//2.99D 970328 
  1996.                     int ret = question("キー定義を初期状態に戻します。よろしいですか?");
  1997.                     if (ret == IDYES) {
  1998.                         // OK
  1999.                         return FALSE;
  2000.                     } else {
  2001.                         return TRUE;
  2002.                     }
  2003.                     break;
  2004.                 }
  2005.             }
  2006.             break;
  2007.         }
  2008.         case CSN_SETSZCMD: {
  2009.             SetDlgItemText(hwnd,IDD_COMMAND,(mchar*)lParam);
  2010.             break;
  2011.         }
  2012.     }
  2013.     return FALSE;
  2014. }
  2015.  
  2016. static WZKEY txuiKeyList(TX* text,int mode,BOOL fCustCharKeyAble)
  2017. {
  2018.     WZKEY ret = 0;
  2019.     
  2020.     apidbOpen();
  2021.     //
  2022.     KEYCONTEXT context;
  2023.     structClear(context);
  2024.     context.text = text;
  2025.     context.fCustCharKeyAble = fCustCharKeyAble;
  2026.     //
  2027.     {
  2028.         DTRECT rbutton;
  2029.         int xcmd;
  2030.         HDIALOG hd;
  2031.         if (mode == 0) {
  2032.             hd = dialogbig(captionGet("キー割り当ての変更"));
  2033.         } else {
  2034.             hd = dialogbig(captionGet("キーの選択"));
  2035.         }
  2036.         dialogSetHookEx(hd,"\m.dlgprocKeycust");
  2037.         dialogSetCustdata(hd,(DWORD)&context);
  2038.         dialogSetContexthelp(hd,TRUE);//2.00E4 カスタマイズダイアログにコンテキストヘルプを追加
  2039.         
  2040.         dialogGroup(hd,"キー(&K)");
  2041.         {
  2042.             int cx = (_fwin40 ? 25 : 30);//2.00E4 カスタマイズダイアログがWin95 640*480に完全に収まる様にした
  2043.             DTRECT r;
  2044.             //
  2045.             dialogGetPos(hd,&r);
  2046.             r.cx = DTCX * (cx - 11 - 1);
  2047.             r.cy = DTCY * 10;
  2048.             _dialogAddCombobox(hd,IDD_2KEY,&r);
  2049.             dialogControlHelp(hd,368);
  2050.             _dialogAddControlInfo(hd,IDD_2KEY);
  2051.             if (mode == 0) {
  2052.                 r.x += r.cx + DTCX;
  2053.                 r.cx = DTCX * 11;
  2054.                 r.cy = DTCYBUTTON;
  2055.                 _dialogAddButton(hd,"削除(&D)...",IDD_2KEY_DEL,&r);
  2056.                 dialogControlHelp(hd,369);
  2057.                 _dialogAddControlInfo(hd,IDD_2KEY_DEL);
  2058.             }
  2059.             r.y += DTCY * 2;
  2060.             dialogSetPosY(hd,r.y);
  2061.             //
  2062.             dialogControlID(hd,IDD_KEYLIST);
  2063.             dialogControlHelp(hd,367);
  2064.             dialogList(hd,NULL,NULL,cx,12);
  2065.             dialogSetFocus(hd,IDD_KEYLIST);
  2066.             //
  2067.             DTRECT r;
  2068.             dialogGetPos(hd,&r);
  2069.             DTRECT r0 = r;
  2070.             r.cy = DTCYKEY;
  2071.             r.cx = DTCX * (cx / 2);
  2072.             _dialogAddCheck(hd,"Shift(&1)",IDD_SHIFT,&r);
  2073.             r.x += r.cx;
  2074.             _dialogAddCheck(hd,"Ctrl(&2)",IDD_CTRL,&r);
  2075.             r.x = r0.x;
  2076.             r.y += r.cy + DTCYINT;
  2077.             _dialogAddCheck(hd,"Alt(&3)",IDD_ALT,&r);
  2078.             //
  2079.             r0.y = r.y + r.cy + DTCYINT * 2;
  2080.             r = r0;
  2081.             r.cx = DTCX * cx;
  2082.             r.cy = DTCYBUTTON;
  2083.             rbutton = r;
  2084.             if (mode == 0) {
  2085.                 _dialogAddButton(hd,"2ストロークキーに追加(&I)...",IDD_2KEY_ADD,&r);
  2086.                 dialogControlHelp(hd,371);
  2087.                 _dialogAddControlInfo(hd,IDD_2KEY_ADD);
  2088.             }
  2089.         }
  2090.         dialogGroupEnd(hd);
  2091.         int ey = dialogGetPosY(hd) - DTCYINT;
  2092.         
  2093.         if (mode == 0) {
  2094.             dialogLFV(hd);
  2095.             dialogSetPosY(hd,dialogGetPosY(hd) + DTCY * 7);
  2096.             int cx = _fwin40 ? 7 : 10;
  2097. #if 1//2.99A 970321 
  2098.             dialogControlID(hd,IDD_SET);
  2099.             dialogControlHelp(hd,363);
  2100.             dialogCmd(hd,"更新(&S)",cx);
  2101. #else
  2102.             dialogControlID(hd,IDD_SET);
  2103.             dialogControlHelp(hd,363);
  2104.             dialogCmd(hd,"← (&S)",cx);
  2105. #endif
  2106.             dialogControlID(hd,IDD_CUT);
  2107.             dialogControlHelp(hd,364);
  2108.             dialogCmd(hd,"消去(&T)",cx);
  2109.             dialogControlID(hd,IDD_COPY);
  2110.             dialogControlHelp(hd,365);
  2111.             dialogCmd(hd,"コピー(&C)",cx);
  2112.             dialogControlID(hd,IDD_PASTE);
  2113.             dialogControlHelp(hd,366);
  2114.             dialogCmd(hd,"貼付(&P)",cx);
  2115.             dialogLFV(hd);
  2116.             //
  2117.             dialogGroup(hd,"内容");
  2118.             dialogSetGroupBottom(hd,ey);
  2119.             {
  2120.                 DTRECT r1,r2;
  2121.                 int cx = _fwin40 ? 38 : 30;
  2122.                 if (_fwin40) {//2.90 
  2123.                     cmdselSetIdb(IDB_CMDDEFAULT);//2.90 
  2124.                     dialogControlID(hd,IDD_CMDSEL_TREELIST);
  2125.                     dialogTree(hd,"機能一覧(&L):",NULL,cx,10);//2.98 970308 コマンド一覧->機能一覧
  2126.                     //2.99A 970321 機能一覧の下に、操作メニュー追加
  2127.                     dialogControlID(hd,IDD_CMDSEL_CONTEXTMENU);
  2128.                     dialogButton(hd,"機能一覧の操作(&O)...",NULL,20);
  2129.                 } else {
  2130.                     cmdselSetIdb(IDB_CMD);//2.90 
  2131.                     dialogGetPos(hd,&r1);
  2132.                     r1.cx = DTCX * 12;
  2133.                     r1.cy = DTCY;
  2134.                     r2.x = r1.x + r1.cx + DTCX;
  2135.                     r2.y = r1.y;
  2136.                     r2.cx = DTCX * (cx - 12 - 1);
  2137.                     r2.cy = DTCY * 10;
  2138.                     _dialogAddLtext(hd,"分類一覧(&L):",&r1);
  2139.                     _dialogAddCombobox(hd,IDD_CMDSEL_CATEGORY,&r2);
  2140.                     dialogControlHelp(hd,359);
  2141.                     _dialogAddControlInfo(hd,IDD_CMDSEL_CATEGORY);
  2142.                     r1.y = r2.y = r2.y + DTCY * 2;
  2143.                     //
  2144.                     {
  2145.                         DTRECT r = r1;r.cx = DTCX * 16;
  2146.                         _dialogAddLtext(hd,"コマンド一覧(&W):",&r);
  2147.                     }
  2148.                     r2.x = r1.x;r2.cx = DTCX * 31;r2.y += DTCY*3/2;//2.00B コマンド一覧を大きくした
  2149.                     _dialogAddCombobox(hd,IDD_CMDSEL_LIST,&r2);
  2150.                     dialogControlHelp(hd,360);
  2151.                     _dialogAddControlInfo(hd,IDD_CMDSEL_LIST);
  2152.                     r1.y = r2.y = r2.y + DTCY * 2;
  2153.                     //
  2154.                     dialogSetPosY(hd,r1.y);
  2155.                     //2.00E4 
  2156.                     dialogControlID(hd,IDD_CMDSEL_SEARCH);
  2157.                     dialogControlHelp(hd,229);
  2158.                     dialogButtonCmd(hd,"検索(&F)...",NULL,16);
  2159.                     dialogControlID(hd,IDD_CMDSEL_SEARCHNEXT);
  2160.                     dialogControlHelp(hd,229);
  2161.                     dialogButtonCmd(hd,"次検索(&N)",NULL,16);
  2162.                 }
  2163.                 //
  2164.                 dialogSpaceV(hd);
  2165.                 dialogGetPos(hd,&r1);
  2166.                 r1.cx = DTCX * cx;
  2167.                 r1.cy = DTCY;
  2168.                 _dialogAddLtext(hd,"コマンド(&X):",&r1);
  2169.                 r1.y += r1.cy;
  2170.                 r1.cy = DTCYBOX;
  2171.                 _dialogAddEditbox(hd,IDD_COMMAND,&r1);
  2172.                 dialogControlHelp(hd,361);
  2173.                 _dialogAddControlInfo(hd,IDD_COMMAND);
  2174.                 r1.y += r1.cy + DTCYINT;
  2175.                 r1.cy = DTCY;
  2176.                 __dialogAddItem(hd,"STATIC","ファンクションキーの表示(&Y):",IDD_DISPLAYGUIDE,&r1,SS_LEFT|WS_GROUP|WS_CHILD|WS_VISIBLE);
  2177.                 r1.y += r1.cy;
  2178.                 r1.cy = DTCYBOX;
  2179.                 _dialogAddEditbox(hd,IDD_DISPLAY,&r1);
  2180.                 dialogControlHelp(hd,362);
  2181.                 _dialogAddControlInfo(hd,IDD_DISPLAY);
  2182.             }
  2183.             dialogGroupEnd(hd);
  2184.         }
  2185.         
  2186.         dialogLFV(hd);
  2187.         xcmd = dialogGetPosX(hd) + DTCX * 1;
  2188.         
  2189.         dialogLF(hd);
  2190.         //2.00E4 
  2191.         dialogSetIntXY(hd,0,0);
  2192.         dialogCaption(hd,"コマンドの説明:");
  2193.         dialogResetInt(hd);
  2194.         DTRECT r;
  2195.         dialogGetPos(hd,&r);
  2196.         r.cx = DTCX * 80;
  2197.         r.cy = DTCY * (_fwin40 ? 8 : 4);
  2198.         _dialogAddListbox(hd,IDD_CMDSEL_EXPLAIN,&r);
  2199.         dialogControlHelp(hd,372);
  2200.         _dialogAddControlInfo(hd,IDD_CMDSEL_EXPLAIN);
  2201.         
  2202.         dialogLFV(hd);
  2203.         dialogSetPosX(hd,xcmd);
  2204.         
  2205.         int cx = _fwin40 ? 8 : 11;
  2206.         dialogOK(hd,cx);
  2207.         dialogCancel(hd,cx);
  2208.         if (mode == 0) {
  2209.             dialogSpaceV(hd);
  2210.             dialogHelpID(hd,cx,"wz",IDH_CUSTKEY);
  2211.             
  2212.             dialogSpaceV(hd);
  2213.             dialogControlID(hd,IDD_LOAD);
  2214.             dialogCmd(hd,"読込み...",cx);
  2215.             dialogControlID(hd,IDD_SAVE);
  2216.             dialogCmd(hd,"別保存...",cx);
  2217.             //2.99D 970328 
  2218.             dialogControlID(hd,IDD_INIT);
  2219.             dialogCmd(hd,"初期化...",cx);
  2220.         }
  2221.         
  2222.         int idsel = dialogOpen(hd);
  2223.         if (idsel == IDD_INIT) {//2.99D 970328 
  2224.             if (initUiConfig("wz.key")) {
  2225.                 txFlushUI(text);
  2226.             }
  2227.             return FALSE;
  2228.         } else if (idsel == IDOK) {
  2229.             if (mode == 0) {
  2230.                 _txKeySave(text,text->szKey,TRUE);
  2231.                 txKeyLoad(text);
  2232.             } else {
  2233.                 ret = context.wzcmdSeled;
  2234.             }
  2235.         } else if (idsel == 0) {
  2236.             txKeyLoad(text);
  2237.         }
  2238.     }
  2239.     
  2240.     apidbClose();
  2241.     return ret;
  2242. }
  2243.  
  2244. //{###設定}
  2245.  
  2246. WZKEY TXAPI txSelectWzkey(TX* text)
  2247. {
  2248. // [キーの選択]ダイアログを出します。
  2249. // 選択されたキーを返します。選択されなかったときは0を返します。
  2250. //2.96A 970214 旧wzkeySelect
  2251.     return txuiKeyList(text,1,FALSE);
  2252. }
  2253.  
  2254. static BOOL txKeyIsCustAble(TX* text)
  2255. {
  2256.     if (txKeyIsEdited(text)) {
  2257. //information("%lX %lX",text,text1,text->szKey);
  2258.         information("キーが編集されています。\nキーカスタマイズできません");
  2259.         return FALSE;
  2260.     }
  2261.     return TRUE;
  2262. }
  2263.  
  2264. uiKeyCust
  2265. {
  2266.     if (!txKeyIsCustAble(text)) return FALSE;
  2267.     return txuiKeyList(text,0,FALSE);
  2268. }
  2269.  
  2270. uiKeyCustCharAble
  2271. {
  2272. // 文字キーもカスタマイズ可能なuiKeyCust
  2273.     if (!txKeyIsCustAble(text)) return FALSE;
  2274.     return txuiKeyList(text,0,TRUE);
  2275. }
  2276.  
  2277. BOOL TXCMDBASE key(void)
  2278. {
  2279. // キーのカスタマイズ
  2280.     return uiKeyCust();
  2281. }
  2282.  
  2283. //##キー一覧
  2284.  
  2285. static WZCMD keylistGetWzcmd(HWND hwnd,TX* text)
  2286. {
  2287.     int i = ListBox_GetCurSel(GetDlgItem(hwnd,IDD_KEYLIST));
  2288.     
  2289.     int j = 0;
  2290.     WZKEY wzkey;
  2291.     WZKEY wzkeyEnd = wzkeyGetEnd();
  2292.     for (wzkey = 0;wzkey <= wzkeyEnd;wzkey++) {
  2293.         WZCMD wzcmd = txKeyGetWzcmd(text,wzkey);
  2294.         if (wzcmd) {
  2295.             if (j == i) {
  2296.                 return wzcmd;
  2297.             }
  2298.             j++;
  2299.         }
  2300.     }
  2301.     return 0;
  2302. }
  2303.  
  2304. static void keylistFlush(HWND hwnd,TX* text)
  2305. {
  2306.     WZCMD wzcmd = keylistGetWzcmd(hwnd,text);
  2307.     SendMessage(hwnd,CS_SETSZCMD,0,(LPARAM)wzcmdToSzcmd(wzcmd));
  2308. }
  2309.  
  2310. BOOL dlgprocKeyList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  2311. {
  2312.     HDIALOG hd = dialogFromHwnd(hwnd);
  2313.     TX* text = (TX*)dialogGetCustdata(hd);
  2314.     CMDSEL_HOOK
  2315.     switch(message) {
  2316.         case WM_INITDIALOG: {
  2317.             HWND hctrl = GetDlgItem(hwnd,IDD_KEYLIST);
  2318.             WZKEY wzkeyEnd = wzkeyGetEnd();
  2319.             WZKEY wzkey;
  2320.             
  2321.             for (wzkey = 0;wzkey <= wzkeyEnd;wzkey++) {
  2322.                 WZCMD wzcmd = txKeyGetWzcmd(text,wzkey);
  2323.                 if (wzcmd) {
  2324.                     mchar szkey[CCHKEY];
  2325.                     mchar szstr[CCHWORD];
  2326.                     txWzkeyToSzkey(text,wzkey,szkey);
  2327.                     szkeyToStr(szkey,szstr);
  2328.                     ListBox_AddString(hctrl,szstr);
  2329.                 }
  2330.             }
  2331.             ListBox_SetCurSel(hctrl,0);
  2332.             keylistFlush(hwnd,text);
  2333.             break;
  2334.         }
  2335.         case WM_COMMAND: {
  2336.             int id = WM_COMMAND_GetId(wParam);
  2337.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  2338.             
  2339.             switch(id) {
  2340.                 case IDD_KEYLIST: {
  2341.                     if (notify == LBN_SELCHANGE) {
  2342.                         keylistFlush(hwnd,text);
  2343.                     }
  2344.                     break;
  2345.                 }
  2346.                 case IDD_EXEC: {
  2347.                     WZCMD wzcmd = keylistGetWzcmd(hwnd,text);
  2348.                     PostMessage(text->hwndbase,WM_COMMAND,IDM_WZCMDTOP + wzcmd,0);
  2349.                     break;
  2350.                 }
  2351.             }
  2352.             break;
  2353.         }
  2354.     }
  2355.     return FALSE;
  2356. }
  2357.  
  2358. BOOL TXCMDBASE uiKeyList(TX* text)
  2359. {
  2360. // キー一覧
  2361.     WZKEY ret = 0;
  2362.     apidbOpen();
  2363.     cmdselSetIdb(IDB_CMD);//2.90 
  2364.     {
  2365.         DTRECT rbutton;
  2366.         int xcmd;
  2367.         HDIALOG hd = dialogbig(captionGet("キー一覧"));
  2368.         dialogSetCustdata(hd,(DWORD)textf);
  2369.         dialogSetHookEx(hd,"\m.dlgprocKeyList");
  2370.         
  2371. #if 0    // 水平スクロールバーを付けようと思ったが、
  2372.         // スクロール処理は自分でしなければ
  2373.         // いけないみたいなので、面倒なので止める
  2374.         dialogControlStyle(hd,WS_HSCROLL|WS_GROUP|LBS_DISABLENOSCROLL);
  2375. #endif
  2376.         dialogControlID(hd,IDD_KEYLIST);
  2377.         dialogList(hd,"キー(&K):",NULL,30,10);
  2378.         
  2379.         dialogLFV(hd);
  2380.         dialogCaption(hd,NULL);
  2381.         dialogCaption(hd,"コマンドが割り当てられているキーの一覧です。");
  2382.         dialogCaption(hd,"[実行]で、実行してみることもできます。");
  2383.         
  2384.         dialogLF(hd);
  2385.         dialogSpaceV(hd);
  2386.         dialogSpaceV(hd);
  2387.         dialogCaption(hd,"コマンド:");
  2388.         DTRECT r;
  2389.         dialogGetPos(hd,&r);
  2390.         r.cx = DTCX * 80;
  2391.         r.cy = DTCY * (_fwin40 ? 8 : 6);
  2392.         _dialogAddListbox(hd,IDD_CMDSEL_EXPLAIN,&r);
  2393.         
  2394.         dialogLFV(hd);
  2395.         int cxbutton = 10;
  2396.         dialogSetPosX(hd,dialogGetPosX(hd) - cxbutton * DTCX - DTCX);
  2397.         dialogClose(hd,cxbutton);
  2398.         //
  2399.         dialogControlID(hd,IDD_EXEC);
  2400.         dialogCmd(hd,"実行(&X)",cxbutton);
  2401.         
  2402.         dialogOpen(hd);
  2403.     }
  2404.     
  2405.     apidbClose();
  2406.     return ret;
  2407. }
  2408.  
  2409. //##ツールバー
  2410.  
  2411. #ifndef __FLAT__
  2412. extern "shell.dll" {
  2413.     #include <shellapi.h>
  2414. }
  2415. #endif
  2416.  
  2417. static BOOL toolbarSave(TOOLBARCONTEXT* context,mchar* szname)
  2418. {
  2419.     txmenuOp(TXTOOLBAROP_DEL,szname,NULL);
  2420.     //
  2421.     tx* txkey = (tx*)txmenuOp(TXTOOLBAROP_OPEN,NULL,NULL);
  2422.     txInsertf(txkey,"[%s]\n",szname);
  2423.     {
  2424.         int i;
  2425.         TXTOOLBAR *src = context->ttxtoolbar;
  2426.         
  2427.         for (i = 0;i < context->ntoolbar;i++,src++) {
  2428.             int iicon = src->iicon;
  2429.             if (src->fReduce) iicon = -(iicon + 1);// "-0"はないので
  2430.             if (src->wzcmd == WZCMD_SEPARATOR) {
  2431.                 txInsertf(txkey,"__sepa\n");
  2432.             } else {
  2433.                 txInsertf(txkey,"%s=\"%s\" %d \"%s\"\n",wzcmdToSzcmd(src->wzcmd),src->sziconfilename,iicon,src->szcaption);
  2434.             }
  2435.         }
  2436.     }
  2437.     txmenuOp(TXTOOLBAROP_CLOSE,NULL,NULL);
  2438.     return TRUE;
  2439. }
  2440.  
  2441. #define CXICON    32
  2442. #define CYICON    32
  2443.  
  2444. static void drawIcon(HWND hwnd,TXTOOLBAR *tool)
  2445. {
  2446.     HWND hctrl = GetDlgItem(hwnd,IDD_ICON);
  2447.     InvalidateRect(hctrl,NULL,TRUE);
  2448.     UpdateWindow(hctrl);
  2449.     
  2450.     mchar szpath[CCHPATHNAME];
  2451.     pathSetFileName(szpath,tool->sziconfilename);
  2452.     
  2453.     HICON hicon = ExtractIcon(text->hInstance,szpath,tool->iicon);
  2454.     
  2455.     if (hicon >= 2) {
  2456.         HDC hdc = GetDC(hctrl);
  2457.         if (tool->fReduce) {
  2458.             HBITMAP hbitmaptmp = CreateCompatibleBitmap(hdc,CXICON,CYICON);
  2459.             HDC hdctmp = CreateCompatibleDC(hdc);
  2460.             SelectObject(hdctmp,hbitmaptmp);
  2461.             SelectObject(hdctmp,GetStockObject(NULL_PEN));
  2462.             SelectObject(hdctmp,text1->hbrushBtnFace);
  2463.             
  2464.             Rectangle(hdctmp,0,0,CXICON+1,CYICON+1);
  2465.             DrawIcon(hdctmp,0,0,hicon);
  2466.             
  2467.             SelectObject(hdc,GetStockObject(NULL_PEN));
  2468.             SelectObject(hdc,text1->hbrushBtnFace);
  2469.             Rectangle(hdc,0,0,CXICON,CYICON);
  2470.             StretchBlt(
  2471.                 hdc,0,0,CXICON/2,CYICON/2,
  2472.                 hdctmp,0,0,CXICON,CYICON,
  2473.                 SRCCOPY
  2474.             );
  2475.             
  2476.             DeleteDC(hdctmp);
  2477.             DeleteObject(hbitmaptmp);
  2478.         } else {
  2479.             DrawIcon(hdc,0,0,hicon);
  2480.         }
  2481.         ReleaseDC(hctrl,hdc);
  2482.     }
  2483. }
  2484.  
  2485. static WZCMD tlbFlush(TOOLBARCONTEXT* context)
  2486. {
  2487.     context->fNoSetEdit++;//2.99A 970321 
  2488.     context->fEdited = FALSE;//2.99A 970321 
  2489.     HWND hwnd = context->hwnd;
  2490.     EnableDlgItemEx(hwnd,IDD_SET,FALSE,IDD_KEYLIST);//2.99A 970321 
  2491.     //
  2492.     TXTOOLBAR *tool = &context->ttxtoolbar[context->itoolbar];
  2493. #if 1//2.00E 
  2494.     context->now = *tool;
  2495.     drawIcon(hwnd,&context->now);
  2496. #else
  2497.     drawIcon(hwnd,tool);
  2498. #endif
  2499.     CheckDlgButton(hwnd,IDD_REDUCE,tool->fReduce);
  2500.     SetDlgItemText(hwnd,IDD_DISPLAY,tool->szcaption);
  2501.     //
  2502.     WZCMD wzcmd = tool->wzcmd;
  2503.     mchar* szcmd = wzcmdToSzcmd(wzcmd);
  2504.     //1.99G NTでアプリエラーになった
  2505.     if (!szcmd) {
  2506.         szcmd = "";
  2507.     }
  2508.     //
  2509.     SetDlgItemText(hwnd,IDD_COMMAND,szcmd);
  2510.     SendMessage(hwnd,CS_SETSZCMD,0,(LPARAM)szcmd);
  2511.     context->fNoSetEdit--;//2.99A 970321 
  2512.     return tool->wzcmd;
  2513. }
  2514.  
  2515. static void tlbFlushlist(TOOLBARCONTEXT* context)
  2516. {
  2517.     HWND hwnd = context->hwnd;
  2518.     HWND hctrl = GetDlgItem(hwnd,IDD_KEYLIST);
  2519.     int i;
  2520.     int itop = SendMessage(hctrl,LB_GETTOPINDEX,0,0);
  2521.     SendMessage(hctrl,LB_RESETCONTENT,0,0);
  2522.     for (i = 0;i < context->ntoolbar;i++) {
  2523.         WZCMD wzcmd = context->ttxtoolbar[i].wzcmd;
  2524.         mchar* szcmd;
  2525.         if (wzcmd == WZCMD_SEPARATOR) {
  2526.             szcmd = _szcmdsepa;
  2527.         } else {
  2528.             szcmd = wzcmdToSzcmd(wzcmd);
  2529.         }
  2530.         ListBox_AddString(hctrl,szcmd);
  2531.     }
  2532.     ListBox_AddString(hctrl,_szlast);
  2533.     SendMessage(hctrl,LB_SETTOPINDEX,itop,0);
  2534.     ListBox_SetCurSel(hctrl,context->itoolbar);
  2535.     tlbFlush(context);
  2536. }
  2537.  
  2538. static void _tlbInsert(TOOLBARCONTEXT* context)
  2539. {
  2540.     memmove(
  2541.         &context->ttxtoolbar[context->itoolbar+1],
  2542.         &context->ttxtoolbar[context->itoolbar],
  2543.         (TXTOOLBAR_N - context->itoolbar - 1) * sizeof(TXTOOLBAR)
  2544.     );
  2545.     context->ntoolbar++;
  2546. }
  2547.  
  2548. static void tlbInsert(TOOLBARCONTEXT* context,WZCMD wzcmd)
  2549. {
  2550.     HWND hwnd = context->hwnd;
  2551.     _tlbInsert(context);
  2552.     
  2553.     TXTOOLBAR *dst = &context->ttxtoolbar[context->itoolbar];
  2554.     memset(dst,0,sizeof(*dst));
  2555.     
  2556.     mchar szcmd[CCHWORD];
  2557.     if (wzcmd == WZCMD_SEPARATOR) {
  2558.         strcpy(szcmd,"__sepa");
  2559.     } else {
  2560.         strcpy(szcmd,wzcmdToSzcmd(wzcmd));
  2561.     }
  2562.     dst->wzcmd = wzcmd;
  2563.     dst->iicon = TOOLBAR_ICONSTR;
  2564.     dst->fSelAble = TRUE;
  2565.     tlbFlushlist(context);
  2566. }
  2567.  
  2568. static void tlbDelete(TOOLBARCONTEXT* context)
  2569. {
  2570.     memcpy(
  2571.         &context->ttxtoolbar[context->itoolbar],
  2572.         &context->ttxtoolbar[context->itoolbar+1],
  2573.         (TXTOOLBAR_N - context->itoolbar - 1) * sizeof(TXTOOLBAR)
  2574.     );
  2575.     context->ntoolbar--;
  2576.     if (context->itoolbar > context->ntoolbar) context->itoolbar = context->ntoolbar;
  2577.     tlbFlushlist(context);
  2578. }
  2579.  
  2580. static void tlbRead(HWND hwnd,TXTOOLBAR *tool,TOOLBARCONTEXT* context)
  2581. {
  2582.     *tool = context->now;//2.00E 
  2583.     mchar szcmd[CCHWORD];
  2584.     GetDlgItemText(hwnd,IDD_COMMAND,szcmd,CCHWORD);
  2585.     if (*szcmd) {//1.99H セパレータでIDD_SETされると駄目だった
  2586.         tool->wzcmd = wzcmdRegister(szcmd);
  2587.         GetDlgItemText(hwnd,IDD_DISPLAY,tool->szcaption,CCHSWORD);
  2588.     }
  2589. }
  2590.  
  2591. static void tlbFlushButton(TOOLBARCONTEXT *context)
  2592. {
  2593.     HWND hwnd = context->hwnd;
  2594.     int i = context->itoolbar;
  2595.     EnableWindow(GetDlgItem(hwnd,IDD_UP),(i > 0));
  2596.     EnableWindow(GetDlgItem(hwnd,IDD_DOWN),(i + 1 < context->ntoolbar));
  2597.     EnableWindow(GetDlgItem(hwnd,IDD_CLEAR),(i < context->ntoolbar));//2.00B 
  2598. }
  2599.  
  2600. static BOOL tlbSave(TOOLBARCONTEXT *context)
  2601. {
  2602.     TX* text = context->text;
  2603.     txstr szstr = text->szToolbar;
  2604.     while(1) {
  2605.         HDIALOG hd = dialog("ツールバー定義を名前を付けて保存");
  2606.         dialogStr(hd,"ツールバー定義名:",szstr,20,20);
  2607.         if (dialogOpen(hd)) {
  2608.             if (txmenuPickup(NULL,PICKUP_TOOLBARSEARCH,szstr) != PICKUP_NOTFOUND) {
  2609.                 int ret = question("%sは存在します。上書きしますか?",szstr);
  2610.                 if (ret == IDNO) return FALSE;
  2611.                 if (ret == IDYES) {
  2612.                     toolbarSave(context,szstr);
  2613.                     return TRUE;
  2614.                 }
  2615.             } else {
  2616.                 toolbarSave(context,szstr);
  2617.                 return TRUE;
  2618.             }
  2619.         } else {
  2620.             return FALSE;
  2621.         }
  2622.     }
  2623. }
  2624.  
  2625. static void tlbSetEdited(TOOLBARCONTEXT *context)
  2626. {
  2627. //2.99A 970321 new
  2628.     context->fEdited = TRUE;
  2629.     EnableDlgItem(context->hwnd,IDD_SET,TRUE);
  2630. }
  2631.  
  2632.  
  2633. BOOL dlgprocToolbar(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  2634. {
  2635.     HDIALOG hd = dialogFromHwnd(hwnd);
  2636.     TOOLBARCONTEXT *context = (LPVOID)dialogGetCustdata(hd);
  2637.     TX* text = context->text;
  2638.     CMDSEL_HOOK
  2639.     switch(message) {
  2640.         case WM_INITDIALOG: {
  2641.             context->hwnd = hwnd;
  2642.             context->fNoSetDisplay++;//3.00A3 970508 
  2643.             tlbFlushlist(context);
  2644.             tlbFlushButton(context);
  2645.             context->fNoSetDisplay--;//3.00A3 970508 
  2646.             break;
  2647.         }
  2648.         case WM_COMMAND: {
  2649.             int id = WM_COMMAND_GetId(wParam);
  2650.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  2651.             
  2652.             if (id == IDD_KEYLIST && notify == LBN_SELCHANGE) {
  2653.                 context->itoolbar = ListBox_GetCurSel(GetDlgItem(hwnd,id));
  2654.                 context->fNoSetDisplay++;//3.00A3 970508 
  2655.                 tlbFlushButton(context);
  2656.                 tlbFlush(context);
  2657.                 context->fNoSetDisplay--;//3.00A3 970508 
  2658.                 return TRUE;
  2659.             }
  2660.             switch(id) {
  2661.                 case IDD_COMMAND:
  2662.                 case IDD_DISPLAY: {
  2663.                     //2.99A 970321 
  2664.                     if (!context->fNoSetEdit && notify == EN_CHANGE) {
  2665.                         tlbSetEdited(context);
  2666.                     }
  2667.                     break;
  2668.                 }
  2669.                 case IDOK: {
  2670. #if 1//2.99A 970321 OKされたときに自動の"←"はしない。問い合わせる
  2671.                     if (context->fEdited) {
  2672.                         int ret = question("変更中の内容を更新しますか?");
  2673.                         if (ret == IDYES) {
  2674.                             SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
  2675.                         } else if (ret == IDCANCEL) {
  2676.                             return TRUE;
  2677.                         }
  2678.                     }
  2679. #else
  2680.                     //1.97 OKされたときは"←"もやる
  2681.                     SendMessage(hwnd,WM_COMMAND,IDD_SET,0);
  2682. #endif
  2683.                     break;
  2684.                 }
  2685.                 case IDD_INSERTNEW: {//2.99A 970321 
  2686.                     _tlbInsert(context);
  2687.                     TXTOOLBAR *tool = &context->ttxtoolbar[context->itoolbar];
  2688.                     structClear(*tool);
  2689.                     tool->wzcmd = wzcmdFromSzcmd("txNull");
  2690.                     tlbFlushlist(context);
  2691.                     return TRUE;
  2692.                 }
  2693.                 case IDD_INSERT: {
  2694.                     _tlbInsert(context);
  2695.                     // IDD_SETへ
  2696.                 }
  2697.                 case IDD_SET: {
  2698.                     TXTOOLBAR *tool = &context->ttxtoolbar[context->itoolbar];
  2699.                     tlbRead(hwnd,tool,context);
  2700.                     tlbFlushlist(context);
  2701.                     return TRUE;
  2702.                 }
  2703.                 case IDD_UP: {
  2704.                     int i = context->itoolbar;
  2705.                     TXTOOLBAR* ttxtoolbar = context->ttxtoolbar;
  2706.                     if (i > 0) {
  2707.                         TXTOOLBAR tool = ttxtoolbar[i-1];
  2708.                         ttxtoolbar[i-1] = ttxtoolbar[i];
  2709.                         ttxtoolbar[i] = tool;
  2710.                         //
  2711.                         context->itoolbar--;
  2712.                         tlbFlushlist(context);
  2713.                     }
  2714.                     return TRUE;
  2715.                 }
  2716.                 case IDD_DOWN: {
  2717.                     int i = context->itoolbar;
  2718.                     TXTOOLBAR* ttxtoolbar = context->ttxtoolbar;
  2719.                     if (i + 1 < context->ntoolbar) {
  2720.                         TXTOOLBAR tool = ttxtoolbar[i+1];
  2721.                         ttxtoolbar[i+1] = ttxtoolbar[i];
  2722.                         ttxtoolbar[i] = tool;
  2723.                         //
  2724.                         context->itoolbar++;
  2725.                         tlbFlushlist(context);
  2726.                     }
  2727.                     return TRUE;
  2728.                 }
  2729.                 case IDD_CLEAR: {
  2730.                     tlbDelete(context);
  2731.                     return TRUE;
  2732.                 }
  2733.                 case IDD_SEPARATOR: {
  2734.                     tlbInsert(context,WZCMD_SEPARATOR);
  2735.                     return TRUE;
  2736.                 }
  2737.                 case IDD_SELICON: {
  2738. #if 1//2.00E "← (&S)"しないのにアイコンがセットされた
  2739.                     int iicon = context->now.iicon;
  2740.                     if (dialogaIconSelect(context->now.sziconfilename,&iicon)) {
  2741.                         context->now.iicon = iicon;
  2742.                         pathToWz(context->now.sziconfilename);
  2743.                         SendMessage(hwnd,WM_PAINT,0,0);
  2744.                         tlbSetEdited(context);//2.99A 970321 
  2745.                     }
  2746. #else
  2747.                     TXTOOLBAR *tool = &context->ttxtoolbar[context->itoolbar];
  2748.                     int iicon = tool->iicon;
  2749.                     if (dialogaIconSelect(tool->sziconfilename,&iicon)) {
  2750.                         tool->iicon = iicon;
  2751.                         pathToWz(tool->sziconfilename);
  2752.                         SendMessage(hwnd,WM_PAINT,0,0);
  2753.                     }
  2754. #endif
  2755.                     break;
  2756.                 }
  2757.                 case IDD_REDUCE: {
  2758. #if 1//2.00E 
  2759.                     context->now.fReduce = IsDlgButtonChecked(hwnd,IDD_REDUCE);
  2760.                     SendMessage(hwnd,WM_PAINT,0,0);
  2761.                     tlbSetEdited(context);//2.99A 970321 
  2762. #else
  2763.                     TXTOOLBAR *tool = &context->ttxtoolbar[context->itoolbar];
  2764.                     tool->fReduce = IsDlgButtonChecked(hwnd,IDD_REDUCE);
  2765.                     SendMessage(hwnd,WM_PAINT,0,0);
  2766. #endif
  2767.                     break;
  2768.                 }
  2769.                 case IDD_LOAD: {
  2770.                     if (keysLoad(hwnd,text,PICKUP_TOOLBARALL,context)) {
  2771.                         tlbFlushlist(context);
  2772.                     }
  2773.                     return TRUE;
  2774.                 }
  2775.                 case IDD_SAVE: {
  2776.                     tlbSave(context);
  2777.                     return TRUE;
  2778.                 }
  2779.                 case IDD_INIT: {//2.99D 970328 
  2780.                     int ret = question("ツールバー定義を初期状態に戻します。よろしいですか?");
  2781.                     if (ret == IDYES) {
  2782.                         // OK
  2783.                         return FALSE;
  2784.                     } else {
  2785.                         return TRUE;
  2786.                     }
  2787.                     break;
  2788.                 }
  2789.             }
  2790.             break;
  2791.         }
  2792.         case WM_PAINT: {
  2793. #if 1//2.00E 
  2794.             drawIcon(hwnd,&context->now);
  2795. #else
  2796.             drawIcon(hwnd,&context->ttxtoolbar[context->itoolbar]);
  2797. #endif
  2798.             break;
  2799.         }
  2800.         case CSN_SETSZCMD: {
  2801.             SetDlgItemText(hwnd,IDD_COMMAND,(mchar*)lParam);
  2802.             //1.99H 
  2803.             mchar szcaption[CCHWORD];
  2804.             listboxGetItemText(GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN),0,szcaption,CCHWORD);
  2805.             //3.00A3 970508 ツールバーのカスタマイズでチップヘルプがコマンド名になった
  2806.             if (!context->fNoSetDisplay/*3.00A3*/) {
  2807. #if 1//3.00A3 970508 
  2808.                 mchar sz[CCHWORD];
  2809.                 listboxGetItemText(GetDlgItem(hwnd,IDD_CMDSEL_EXPLAIN),1,sz,CCHWORD);
  2810.                 SetDlgItemText(hwnd,IDD_DISPLAY,sz);
  2811. #else
  2812.                 SetDlgItemText(hwnd,IDD_DISPLAY,szcaption);
  2813. #endif
  2814.             }
  2815.             break;
  2816.         }
  2817.     }
  2818.     return FALSE;
  2819. }
  2820.  
  2821. static int txuiCustToolbar(TX* text)
  2822. {
  2823.     int ret = 0;
  2824.     //2.96A 970214 ツールバーはロードされてないことがあるのでロードする。
  2825.     if (!text->szToolbar[0]) return 0;
  2826.     txOp(text,TXOP_TOOLBARLOADNAME,(LPARAM)text->szToolbar,0);
  2827.     //
  2828.     TOOLBARCONTEXT context;
  2829.     structClear(context);
  2830.     context.text = text;
  2831.     memcpy(context.ttxtoolbar,text->ttxtoolbar,sizeof(context.ttxtoolbar));
  2832.     context.ntoolbar = text->ntoolbar;
  2833.     //
  2834.     apidbOpen();
  2835.     //
  2836.     {
  2837.         HDIALOG hd = dialogbig(captionGet("ツールバーの変更"));
  2838.         dialogSetCustdata(hd,(DWORD)&context);
  2839.         dialogSetContexthelp(hd,TRUE);
  2840.         DTRECT r;
  2841.         
  2842.         {
  2843.             PMACROFUNC pfunc;
  2844.             macroGetFuncAddress("dlgprocToolbar",&pfunc);
  2845.             dialogSetHook(hd,&pfunc);
  2846.         }
  2847.         
  2848.         int cx = (_fwin40 ? 27 : 30);
  2849.         dialogControlID(hd,IDD_KEYLIST);
  2850.         dialogControlHelp(hd,387);
  2851.         dialogList(hd,"ボタン(&B):",NULL,cx,_fwin40 ? 21 : 19);
  2852.         int ey = dialogGetPosY(hd) - DTCYINT;
  2853.         
  2854.         dialogLFV(hd);
  2855.         dialogSetPosY(hd,dialogGetPosY(hd) + DTCY * (_fwin40 ? 4 : 5));
  2856.         int cx = _fwin40 ? 9 : 10;
  2857. #if 1//2.99A 970321 
  2858.         dialogControlID(hd,IDD_SET);
  2859.         dialogControlHelp(hd,388);
  2860.         dialogCmd(hd,"更新(&S)",cx);
  2861.         dialogControlID(hd,IDD_INSERTNEW);
  2862.         dialogControlHelp(hd,389);
  2863.         dialogCmd(hd,"挿入(&A)",cx);
  2864. #else
  2865.         dialogControlID(hd,IDD_SET);
  2866.         dialogControlHelp(hd,388);
  2867.         dialogCmd(hd,"← (&S)",cx);
  2868.         dialogControlID(hd,IDD_INSERT);
  2869.         dialogControlHelp(hd,389);
  2870.         dialogCmd(hd,"追加(&A)",cx);
  2871. #endif
  2872.         dialogControlID(hd,IDD_SEPARATOR);
  2873.         dialogControlHelp(hd,390);
  2874.         dialogCmd(hd,"セパレータ(&E)",cx);
  2875.         dialogControlID(hd,IDD_CLEAR);
  2876.         dialogControlHelp(hd,391);
  2877.         dialogCmd(hd,"削除(&T)",cx);
  2878.         dialogSpaceV(hd);
  2879.         dialogControlID(hd,IDD_UP);
  2880.         dialogControlHelp(hd,392);
  2881.         dialogCmd(hd,"↑ (&U)",cx);
  2882.         dialogControlID(hd,IDD_DOWN);
  2883.         dialogControlHelp(hd,393);
  2884.         dialogCmd(hd,"↓ (&D)",cx);
  2885.         dialogLFV(hd);
  2886.         //
  2887.         dialogSpaceV(hd);
  2888.         dialogGroup(hd,"内容");
  2889.         dialogSetGroupBottom(hd,ey);
  2890.         {
  2891.             DTRECT r1,r2;
  2892.             int cx = _fwin40 ? 38 : 30;
  2893.             if (_fwin40) {//2.90 
  2894.                 cmdselSetIdb(IDB_CMDDEFAULT);//2.90 
  2895.                 dialogControlID(hd,IDD_CMDSEL_TREELIST);
  2896.                 dialogTree(hd,"機能一覧(&L):",NULL,cx,10);//2.98 970308 コマンド一覧->機能一覧
  2897.                 //2.99A 970321 機能一覧の下に、操作メニュー追加
  2898.                 dialogControlID(hd,IDD_CMDSEL_CONTEXTMENU);
  2899.                 dialogButton(hd,"機能一覧の操作(&O)...",NULL,20);
  2900.             } else {
  2901.                 cmdselSetIdb(IDB_CMD);//2.90 
  2902.                 dialogGetPos(hd,&r1);
  2903.                 r1.cx = DTCX * 12;r1.cy = DTCY;
  2904.                 r2.x = r1.x + r1.cx + DTCX;
  2905.                 r2.y = r1.y;
  2906.                 r2.cx = DTCX * (cx - 12 - 1);r2.cy = DTCYBOX;
  2907.                 //
  2908.                 r2.cy = DTCY * 10;
  2909.                 _dialogAddLtext(hd,"分類一覧(&L):",&r1);
  2910.                 _dialogAddCombobox(hd,IDD_CMDSEL_CATEGORY,&r2);
  2911.                 dialogControlHelp(hd,359);
  2912.                 _dialogAddControlInfo(hd,IDD_CMDSEL_CATEGORY);
  2913.                 r1.y = r2.y = r2.y + DTCY * 2;
  2914.                 //
  2915.                 {
  2916.                     DTRECT r = r1;r.cx = DTCX * 16;
  2917.                     _dialogAddLtext(hd,"コマンド一覧(&W):",&r);
  2918.                 }
  2919.                 r2.x = r1.x;r2.cx = DTCX * 31;r2.y += DTCY*3/2;//2.00B コマンド一覧を大きくした
  2920.                 _dialogAddCombobox(hd,IDD_CMDSEL_LIST,&r2);
  2921.                 dialogControlHelp(hd,360);
  2922.                 _dialogAddControlInfo(hd,IDD_CMDSEL_LIST);
  2923.                 r1.y = r2.y = r2.y + DTCY * 2;
  2924.                 dialogSetPosY(hd,r1.y);
  2925.                 //2.00E4 
  2926.                 dialogSetH(hd);
  2927.                 dialogControlID(hd,IDD_CMDSEL_SEARCH);
  2928.                 dialogControlHelp(hd,229);
  2929.                 dialogButtonCmd(hd,"検索(&F)...",NULL,15);
  2930.                 dialogControlID(hd,IDD_CMDSEL_SEARCHNEXT);
  2931.                 dialogControlHelp(hd,229);
  2932.                 dialogButtonCmd(hd,"次検索(&N)",NULL,15);
  2933.                 dialogLF(hd);
  2934.                 dialogSetV(hd);
  2935.             }
  2936.             //
  2937.             dialogGetPos(hd,&r1);
  2938.             r1.cx = DTCX * 12;r1.cy = DTCY;
  2939.             r2.x = r1.x + r1.cx + DTCX;
  2940.             r2.y = r1.y;
  2941.             r2.cx = DTCX * (cx - 12 - 1);r2.cy = DTCYBOX;
  2942.             _dialogAddLtext(hd,"コマンド(&X):",&r1);
  2943.             _dialogAddEditbox(hd,IDD_COMMAND,&r2);
  2944.             dialogControlHelp(hd,361);
  2945.             _dialogAddControlInfo(hd,IDD_COMMAND);
  2946.             r1.y = r2.y = r2.y + DTCY * 2;
  2947.             __dialogAddItem(hd,"STATIC","チップヘルプ(&Y):",IDD_DISPLAYGUIDE,&r1,SS_LEFT|WS_GROUP|WS_CHILD|WS_VISIBLE);
  2948.             _dialogAddEditbox(hd,IDD_DISPLAY,&r2);
  2949.             dialogControlHelp(hd,394);
  2950.             _dialogAddControlInfo(hd,IDD_DISPLAY);
  2951.             dialogSetPosY(hd,r2.y + r2.cy + DTCYINT);
  2952.             //
  2953.             dialogGetPos(hd,&r);
  2954.             r.cx = DTCX * 8;
  2955.             r.cy = DTCYBUTTON;
  2956.             _dialogAddLtext(hd,"アイコン:",&r);
  2957.             r.x += r.cx;
  2958.             r.cx = DTCX * 5;
  2959.             r.cy = DTCY * 4;
  2960.             _dialogAddItem(hd,DCS_LTEXT,"",IDD_ICON,&r,0);
  2961.             int ey = r.y + r.cy;
  2962.             //
  2963.             r.x += r.cx;
  2964.             r.cx = DTCX * 14;
  2965.             r.cy = DTCYBUTTON;
  2966.             _dialogAddCheck(hd,"縮小表示(&R)",IDD_REDUCE,&r);
  2967.             dialogControlHelp(hd,395);
  2968.             _dialogAddControlInfo(hd,IDD_REDUCE);
  2969.             //
  2970.             r.y += r.cy;
  2971.             r.cx = DTCX * 16;
  2972.             r.cy = DTCYBUTTON;
  2973.             _dialogAddButton(hd,"アイコンの選択(&I)...",IDD_SELICON,&r);
  2974.             dialogControlHelp(hd,396);
  2975.             _dialogAddControlInfo(hd,IDD_SELICON);
  2976.             //
  2977.             dialogSetPosY(hd,ey);
  2978.         }
  2979.         dialogGroupEnd(hd);
  2980.         
  2981.         dialogLFV(hd);
  2982.         int xcmd = dialogGetPosX(hd) + DTCX * 1;
  2983.         
  2984.         dialogLF(hd);
  2985.         //2.00E4 
  2986.         dialogSetIntXY(hd,0,0);
  2987.         dialogCaption(hd,"コマンドの説明:");
  2988.         dialogResetInt(hd);
  2989.         DTRECT r;
  2990.         dialogGetPos(hd,&r);
  2991.         r.cx = DTCX * 80;
  2992.         r.cy = DTCY * (_fwin40 ? 7 : 4);
  2993.         _dialogAddListbox(hd,IDD_CMDSEL_EXPLAIN,&r);
  2994.         dialogControlHelp(hd,372);
  2995.         _dialogAddControlInfo(hd,IDD_CMDSEL_EXPLAIN);
  2996.         
  2997.         dialogLFV(hd);
  2998.         dialogSetPosX(hd,xcmd);
  2999.         
  3000.         int cx = _fwin40 ? 7 : 11;
  3001.         dialogOK(hd,cx);
  3002.         dialogCancel(hd,cx);
  3003.         dialogSpaceV(hd);
  3004.         dialogHelpID(hd,cx,"wz",IDH_CUSTTOOL);
  3005.         
  3006.         dialogSpaceV(hd);
  3007.         dialogControlID(hd,IDD_LOAD);
  3008.         dialogCmd(hd,"読込み...",cx);
  3009.         dialogControlID(hd,IDD_SAVE);
  3010.         dialogCmd(hd,"別保存...",cx);
  3011.         //2.99D 970328 
  3012.         dialogControlID(hd,IDD_INIT);
  3013.         dialogCmd(hd,"初期化...",cx);
  3014.         
  3015.         ret = dialogOpen(hd);
  3016.     }
  3017.     apidbClose();
  3018.     if (ret == IDD_INIT) {//2.99D 970328 
  3019.         if (initUiConfig("wz.bar")) {
  3020.             txFlushUI(text);
  3021.         }
  3022.         return FALSE;
  3023.     } else if (ret) {
  3024.         toolbarSave(&context,text->szToolbar);
  3025.         #if 1//2.96A 970214 WZ Filer対応
  3026.         txFlushUI(text);
  3027.         #else
  3028.         memcpy(text->ttxtoolbar,context.ttxtoolbar,sizeof(context.ttxtoolbar));
  3029.         text->ntoolbar = context.ntoolbar;
  3030.         txFlushToolbar(text);
  3031.         txFlush(text);    // commctrlは、txFlushToolbarだけだと駄目
  3032.         #endif
  3033.     }
  3034.     return ret;
  3035. }
  3036.  
  3037. BOOL TXCMDBASE toolbar(void)
  3038. {
  3039. // ツールバーのカスタマイズ
  3040.     return txuiCustToolbar(textf);
  3041. }
  3042.  
  3043. //## WZ1.0の設定の取り込み
  3044. // thanks y.mikomeさん
  3045. //2.00-2,2.00A rewrite
  3046.  
  3047. static mchar *tsz[] = {
  3048.     "\",",                        "\" ",
  3049.     "select.",                    "edit.select",
  3050.     "lp.uiPrint",                "word.uiPrint",
  3051.     "imetx.regword",            "stdlib.imeRegWord",
  3052.     "complete.main",            "edit.completeNext",
  3053.     "complete.main",            "edit.completePrev",
  3054.     "complate.add",                "edit.completeAdd",
  3055.     "bookmark.main",            "search.uiMark",
  3056.     "seikei.main",                "edit.uiFormText",
  3057.     "seikei.para",                "edit.formtext",
  3058.     "seikei.join",                "edit.formtextJoinAll",
  3059.     "seikei.all",                "edit.formtextall",
  3060.     "seikei.config",            "edit.uiFormText",
  3061.     "datetime.main",            "edit.uiInsertDate",
  3062.     "template.list",            "edit.uiInsertTemplate",
  3063.     "template.main",            "edit.uiInsertTemplate",
  3064.     "title.main",                "outline.main",
  3065.     //1.99A
  3066.     "usermenu.umcMouseR",        "edit.menuMouse",
  3067.     "usermenu.umcMouseRClip",    "edit.menuMouseRClip",
  3068.     //1.99D 
  3069.     "usermenu.umcMouseR",        "edit.menuMouse",
  3070.     "usermenu.umcMouseRClip",    "edit.menuMouseRClip",
  3071.     "usermenu.umcMiFile",        "file.menuFileMi",
  3072.     "usermenu.umcMiJump",        "search.menuJumpMi",//2.00A ucm->umc
  3073.     "usermenu.umcMiSearch",        "search.menuSearchMi",
  3074.     "usermenu.umcMiMark",        "search.menuMarkMi",
  3075.     "usermenu.umcVzFile",        "file.menuFileVz",
  3076.     //2.00A 
  3077.     "configtx.uiConfig",        "config.uiConfig",
  3078.     0,0
  3079. };
  3080.  
  3081. #define GUIDE_FOLDER    "フォルダ:\n    %s\n"
  3082.  
  3083. static BOOL wzkeyIsExist(mchar* szname)
  3084. {
  3085.     BOOL ret = FALSE;
  3086.     TX body;
  3087.     TX* text = &body;
  3088.     txInitText(text);
  3089.         mchar szfilename[CCHPATHNAME];
  3090.         pathFullConfig(szfilename,"wz.key");//2.00E 
  3091.         txSetFileName(text,szfilename);
  3092.         txOpenText(text);
  3093.         txJumpFileTop(text);
  3094.         ret = txSearchEx(text,"[" + szname + "]",0);
  3095.     txClose(text);
  3096.     return ret;
  3097. }
  3098.  
  3099. static BOOL wzkeyLoadWz10key(mchar* szname,mchar* szkeyfile)
  3100. {
  3101.     BOOL ret = FALSE;
  3102.     TX body;
  3103.     TX* text = &body;
  3104.     txInitText(text);
  3105.     {
  3106.         txSetFileName(text,szkeyfile);
  3107.         txOpenText(text);
  3108.         //
  3109.         jumpfiletop;
  3110.         select;
  3111.         if (searchpara("#key")) {
  3112.             nextpara;
  3113.             selectdelete;
  3114.             if (searchpara("#end")) {
  3115.                 select;
  3116.                 if (searchpara("#fkey")) {
  3117.                     nextpara;
  3118.                     selectdelete;
  3119.                     jumpparatop;
  3120.                     insert("FKEY=");
  3121.                     nextpara; deleteword;
  3122.                     insert("FKEY+SHIFT=");
  3123.                     nextpara; deleteword;
  3124.                     insert("FKEY+CTRL=");
  3125.                     nextpara; insertpara;
  3126.                     insert("FKEY+SHIFT+CTRL=\"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" ");
  3127.                     nextpara;
  3128.                     select;
  3129.                     jumpfileend;
  3130.                     selectdelete;
  3131.                     txReplaceEx(
  3132.                         text,
  3133.                         \"\t+\([A-Za-z.0-9]+\)[ \t]+\(.+\)$",
  3134.                         \"\1=\2",
  3135.                         SEARCH_ALL|SEARCH_RE
  3136.                     );
  3137.                     int i;
  3138.                     for (i = 0;tsz[i];i += 2) {
  3139.                         txReplaceEx(
  3140.                             text,
  3141.                             tsz[i],
  3142.                             tsz[i+1],
  3143.                             SEARCH_ALL|SEARCH_NOSENSECASE|SEARCH_WORD
  3144.                         );
  3145.                     }
  3146.                     ret = TRUE;
  3147.                 }
  3148.             }
  3149.         }
  3150.         if (ret) {
  3151.             TX* txkey = text;
  3152.             {
  3153.                 TX body;
  3154.                 TX* text = &body;
  3155.                 txInitText(text);
  3156.                 {
  3157.                     mchar szfilename[CCHPATHNAME];
  3158.                     pathFullConfig(szfilename,"wz.key");//2.00E 
  3159.                     txSetFileName(text,szfilename);
  3160.                     txOpenText(text);
  3161.                     txJumpFileEnd(text);
  3162.                     txInsertReturn(text);
  3163.                     txInsertf(text,"[%s]",szname);
  3164.                     txInsertReturn(text);
  3165.                     txInsertText(text,txkey);
  3166.                     txSave(text);
  3167.                 }
  3168.                 txClose(text);
  3169.             }
  3170.         }
  3171.     }
  3172.     txClose(text);
  3173.     return ret;
  3174. }
  3175.  
  3176. static BOOL wz10GetEnvkey(mchar* szOldPath,txstr szkey)
  3177. {
  3178.     BOOL ret = FALSE;
  3179.     inittext2;
  3180.     setfilename2(szOldPath + \"\wz.dat");
  3181.     opentext2;
  3182.     {
  3183.         jumpfiletop2;
  3184.         if (searchpara2("[Env]")) {
  3185.             if (searchpara2("key=")) {
  3186.                 rightword2;
  3187.                 getword2(szkey);
  3188.                 ret = TRUE;
  3189.             }
  3190.         }
  3191.     }
  3192.     close2;
  3193.     return ret;
  3194. }
  3195.  
  3196. static BOOL wz10ConvertKey(mchar* szOldPath)
  3197. {
  3198.     BOOL ret = FALSE;
  3199.     txstr szkey;
  3200.     
  3201.     if (!wz10GetEnvkey(szOldPath,szkey)) {
  3202.         information(GUIDE_FOLDER "のWZ EDITORはversion1.0ではありません。");
  3203.         return FALSE;
  3204.     }
  3205.     txstr szname = szkey + "_key";
  3206.     while(1) {
  3207.         HDIALOG hd = dialog("キー定義の名前付け");
  3208.         dialogStr(hd,"キーの名前:",szname,10,20);
  3209.         dialogCaption(hd,"ここで付けた名前が設定ダイアログの");
  3210.         dialogCaption(hd,"キー定義欄に表示されます。");
  3211.         //
  3212.         if (dialogOpen(hd)) {
  3213.             if (wzkeyIsExist(szname)) {
  3214.                 information("名前 %s は既に使われています。\n別の名前を指定してください",szname);
  3215.                 continue;
  3216.             } else {
  3217.                 if (wzkeyLoadWz10key(szname,szOldPath + "\\" + szkey + ".key")) {
  3218.                     information("キー定義を取り込みました。\n\n[設定]ダイアログ-[インターフェース]で、キー定義を\n\"%s\"に設定してください。\n",szname);
  3219.                     return TRUE;
  3220.                 } else {
  3221.                     attention("キー定義の取り込みに失敗しました");
  3222.                     return FALSE;
  3223.                 }
  3224.             }
  3225.         }
  3226.         break;
  3227.     }
  3228.     return FALSE;
  3229. }
  3230.  
  3231. static BOOL wz10CopyText(mchar* szOldPath,mchar* szNewPath)
  3232. {
  3233.     return cmd("mcopy \"" +  szNewPath + "\" \"" + szOldPath + "\\text\\\"");
  3234. }
  3235.  
  3236. BOOL dlgprocFromwz10(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  3237. {
  3238.     switch(message) {
  3239.         case WM_COMMAND: {
  3240.             int id = WM_COMMAND_GetId(wParam);
  3241.             switch(id) {
  3242.                 case IDD_CONVERTKEY:
  3243.                 case IDD_COPYTEXT: {
  3244.                     txstr szNewPath = text->szexedir;
  3245.                     pathForm(szNewPath);
  3246.                     //
  3247.                     mchar szpath[CCHPATHNAME];
  3248.                     GetDlgItemText(hwnd,IDD_OLDPATH,szpath,CCHPATHNAME);
  3249.                     
  3250.                     BOOL fFind = FALSE;
  3251.                     BOOL fWZ20 = FALSE;        // WZ2.0同士の再インストール? (未対応)
  3252.                     
  3253.                     if (fileIsExist(szpath + \"\wz.exe")) {
  3254.                         fFind = TRUE;
  3255.                     }
  3256.                     if (fileIsExist(szpath + \"\wzedit32.exe")) {
  3257.                         fFind = TRUE;
  3258.                     }
  3259.                     if (fileIsExist(szpath + \"\wzeditor.exe")) {
  3260.                         fFind = TRUE;
  3261.                         fWZ20= TRUE;
  3262.                     }
  3263.                     if (fFind) {
  3264.                         if (id == IDD_COPYTEXT) {
  3265.                             if (wz10CopyText(szpath,szNewPath)) {
  3266.                                 information("TEXTフォルダの内容をコピーしました");
  3267.                             } else {
  3268.                                 attention("TEXTフォルダの内容のコピーに失敗しました");
  3269.                             }
  3270.                         } else {
  3271.                             if (fWZ20) {
  3272.                                 information(GUIDE_FOLDER "のWZ EDITORはVer.2.0です。\nコンバートは実行しません。",szpath);
  3273.                             } else {
  3274.                                 wz10ConvertKey(szpath);
  3275.                             }
  3276.                         }
  3277.                     } else {
  3278.                         information(GUIDE_FOLDER "にWZ EDITORは存在しません。",szNewPath);
  3279.                     }
  3280.                     return TRUE;
  3281.                 }
  3282.             }
  3283.         }
  3284.     }
  3285.     return FALSE;
  3286. }
  3287.  
  3288. fromWZ10
  3289. {
  3290. // 旧版の設定を取り込み
  3291.     txstr szOldPath = text->szexedir;
  3292.     pathForm(szOldPath);
  3293.     //
  3294.     HDIALOG hd = dialog("旧版の設定の取り込み");
  3295.     dialogSetHookEx(hd,"\m.dlgprocFromwz10");
  3296.     dialogSetGroupRight(hd,DTCX * 60);
  3297.     //
  3298.     dialogGroup(hd,"旧版のWZのフォルダ(&F)");
  3299.         dialogControlRefer(hd,"-d");
  3300.         dialogControlID(hd,IDD_OLDPATH);
  3301.         dialogStr(hd,NULL,szOldPath,0,40);
  3302.     dialogGroupEnd(hd);
  3303.     //
  3304.     dialogGroup(hd,"説明");
  3305.         dialogCaption(hd,"旧版のWZ EDITORで使用していたキー定義を取り込みます。");
  3306.         dialogCaption(hd,"[TEXTフォルダのコピー]ボタンを押すと、");
  3307.         dialogCaption(hd,"旧版のWZのTEXTフォルダ内の文書ファイルをコピーします。");
  3308.     dialogGroupEnd(hd);
  3309.     //
  3310.     dialogLFV(hd);
  3311.     int lcx = 20;
  3312.     dialogControlID(hd,IDD_CONVERTKEY);
  3313.     dialogCmdDefault(hd,"キー定義の取り込み",lcx);
  3314.     //
  3315.     dialogControlID(hd,IDD_COPYTEXT);
  3316.     dialogCmd(hd,"TEXTフォルダのコピー(&T)",lcx);
  3317.     //
  3318.     dialogSpaceV(hd);
  3319.     dialogControlID(hd,IDCANCEL);
  3320.     dialogCmd(hd,"閉じる",lcx);
  3321.     //
  3322.     dialogOpen(hd);
  3323. }
  3324.  
  3325. //## WZ2.0 convert
  3326. //2.99C 970327 new
  3327.  
  3328. //#define GUIDE_FOLDER    "フォルダ:\n    %s\n"
  3329. //#define IDD_OLDPATH        100
  3330. //#define IDD_COPYTEXT    102
  3331.  
  3332. static BOOL wz20CopyText(mchar* szOldPath,mchar* szNewPath)
  3333. {
  3334.     return cmd("mcopy \"" +  szNewPath + "\" \"" + szOldPath + "\\text\\\"");
  3335. }
  3336.  
  3337. static BOOL txConvertCmdWz2To3(TX* text)
  3338. {
  3339.     static mchar* tsz[] = {
  3340.         "cmdlist.uiWzcmdList","apidb2.uiCmdList",
  3341.         "txJumpTag","search.txJumpTagEx",
  3342.         "edit.selectUp","txkeyUp",
  3343.         "edit.selectDown","txkeyDown",
  3344.         "edit.selectLeft","txkeyLeft",
  3345.         "edit.selectRight","txkeyRight",
  3346.         "edit.selectLeftWord","search.txkeyLeftWord",
  3347.         "edit.selectRightWord","search.txkeyRightWord",
  3348. #if 1//3.00A 970501 WZ2.0のMS.KEYを取り込んでShift+Ctrl+左右方向キーを押すとエラーになった
  3349.         "txLeftWordMi","search.txkeyLeftWord",
  3350.         "txRightWordMi","search.txkeyRightWord",
  3351.         "edit.selectWordTop","search.txkeyLeftWord",
  3352.         "edit.selectWordEnd","search.txkeyRightWord",
  3353. #else
  3354.         "edit.selectWordTop","search.txkeyJumpWordTop",
  3355.         "edit.selectWordEnd","search.txkeyJumpWordEnd",
  3356. #endif
  3357.         "edit.selectScreenTop","search.txkeyJumpScreenTop",
  3358.         "edit.selectScreenEnd","search.txkeyJumpScreenEnd",
  3359.         "edit.selectPrevPage","search.txkeyPrevPage",
  3360.         "edit.selectNextPage","search.txkeyNextPage",
  3361.         "edit.selectPrevHalfPage","search.txkeyPrevHalfPage",
  3362.         "edit.selectNextHalfPage","search.txkeyNextHalfPage",
  3363.         "edit.selectLineTop","search.txkeyJumpLineTop",
  3364.         "edit.selectLineEnd","search.txkeyJumpLineTail",
  3365.         "edit.selectFileTop","search.txkeyJumpFileTop",
  3366.         "edit.selectFileEnd","search.txkeyJumpFileEnd",
  3367.         "edit.selectParaTop","search.txkeyJumpParaTop",
  3368.         "edit.selectParaEnd","search.txkeyJumpParaEnd",
  3369.         "txkeyDeletePrev","edit.txkeyDeletePrev",
  3370.         "txDeleteChar","edit.txkeyDeleteChar",
  3371.         "txWriteReturn","edit.txkeyEnter",
  3372.         "txSearchContinue","search.txkeySearchContinue",
  3373.         "txSearchContinuePrev","search.txkeySearchContinuePrev",
  3374. // html
  3375.         "word.txCharStrong","html.insertTagContainer([STRONG])",
  3376.         "word.txCharEm","html.insertTagContainer([EM])",
  3377.         "word.txCharCite","html.insertTagContainer([CITE])",
  3378.         "word.txCharCode","html.insertTagContainer([CODE])",
  3379.         "word.txCharKbd","html.insertTagContainer([KBD])",
  3380.         "word.txCharSamp","html.insertTagContainer([SAMP])",
  3381.         "word.txCharVar","html.insertTagContainer([VAR])",
  3382.         "word.txCharSubscript","html.insertTagContainer([SUB])",
  3383.         "word.txCharSuperscript","html.insertTagContainer([SUP])",
  3384.         "word.txCharAddress","html.insertTagContainer([ADDRESS])",
  3385.         "word.txCharFixedfont","html.insertTagContainer([TT])",
  3386.         "word.txFormBlockquote","html.insertTagContainer([BLOCKQUOTE])",
  3387.         "word.txFormPre","html.insertTagContainer([PRE])",
  3388.         "word.txuiCharFontSize","html.uiColor",
  3389.         "word.htmlbrowser","html.htmlbrowser",
  3390.         "word.txFormTable","word.txuiConvertTable",
  3391.         "word.txuiFormIndent","word.txuiParaatr",
  3392.         "word.txuiInsertBitmapEx","word.txuiInsertBitmap",
  3393.         "word.txuiAnchor","html.txuiInsertAnchor",
  3394.         "word.txuiLinkBrowse","removed",
  3395.         "word.txLinkClear","removed",
  3396.         "word.txuiLinkTo","word.txuiLink",
  3397.         "word.txuiFormArticle","removed",
  3398.         "word.txFormDefine","html.insertArticle",
  3399.         "word.txFormDefineItem","removed",
  3400.         "word.txFormDefineDefine","removed",
  3401.         "word.txFormDefineList","removed",
  3402.         "word.txFormDefineListCompact","removed",
  3403.         "word.txFormDefineClear","removed",
  3404.         "word.txuiPropertyChar","edit.txkeyAltEnter",
  3405.         "word.txInsertP","edit.txkeyCtrlEnter",
  3406.         "word.txInsertBR","edit.txkeyShiftEnter",
  3407.         "word.txInsertBrClearAll","removed",
  3408.         "word.txInsertBrClearLeft","removed",
  3409.         "word.txInsertBrClearRight","removed",
  3410.         "word.txuiPropertyText","removed",
  3411.         "word.txLfToBr","removed",
  3412.         "word.txDeleteTag","html.clearTag",
  3413.         "word.txCharComment","html.uiInsertTagComment",
  3414. //
  3415.         "edit.txDeleteCharMs","edit.txkeyDeleteChar",
  3416.         "edit.txDeletePrevMs","edit.txkeyDeletePrev",
  3417.         "word.txFormTab","word.txInsertBeamtab",
  3418. //3.00A 970501 WZ2のMS.KEYを取り込むと、Shift+矢印で選択し、Shiftを離してPageUp/Downを押しても選択が解除されなかった
  3419.         "txNextPage","search.txkeyNextPage",
  3420.         "txPrevPage","search.txkeyPrevPage",
  3421.         0,0,
  3422.     };
  3423.     for (int i = 0;tsz[i];i += 2) {
  3424.         txReplaceEx(
  3425.             text,
  3426.             tsz[i],
  3427.             tsz[i+1],
  3428.             SEARCH_ALL|SEARCH_NOSENSECASE|SEARCH_WORD
  3429.         );
  3430.     }
  3431.     return TRUE;
  3432. }
  3433.  
  3434. #define CCUI20_KEY        0x01
  3435. #define CCUI20_MENU        0x02
  3436. #define CCUI20_TOOLBAR    0x04
  3437.  
  3438. //2.99G 970404 
  3439. static void _replace(TX* text,mchar* szSection,TX* textSrc)
  3440. {
  3441. // textのカーソル位置はszSectionの行頭であること
  3442. // この位置は変えない。
  3443.     SEARCHMODE sm = SEARCH_PARATOP|SEARCH_CUR|SEARCH_NOSENSECASE;
  3444.     IFILE adr = txGetAddress(text);
  3445.     txJumpFileTop(textSrc);
  3446.     if (txSearchEx(textSrc,szSection,sm)) {
  3447.         txSelectEx(text,CLIP_CHAR);
  3448.         txNextPara(text);
  3449.         if (txSearchEx(text,"[",sm)) {
  3450.         } else {
  3451.             txJumpFileEnd(text);
  3452.         }
  3453.         txSelectDelete(text);
  3454.         //
  3455.         txSelectEx(textSrc,CLIP_CHAR);
  3456.         txNextPara(textSrc);
  3457.         if (txSearchEx(textSrc,"[",sm)) {
  3458.         } else {
  3459.             txJumpFileEnd(textSrc);
  3460.         }
  3461.         txPrivatePush(textSrc);
  3462.         txPrivatePop(text);
  3463.     }
  3464. }
  3465.  
  3466. //2.99G 970404 WZ2.0のWZ.KEY,WZ.MNUを読み込むとファイラーのコマンドが置き換わってファイラーが使えなくなった
  3467. static void wz20ConvertReplaceFiler(TX* text,mchar* szFilename)
  3468. {
  3469.     TX* text2 = textopen(szFilename);
  3470.     if (text2) {
  3471.         SEARCHMODE sm = SEARCH_PARATOP|SEARCH_CUR|SEARCH_NOSENSECASE;
  3472.         //
  3473.         txJumpFileTop(text);
  3474.         if (txSearchEx(text,"[txe_filer]",sm)) {
  3475.             _replace(text,"[txe_filer]",text2);
  3476.         }
  3477.         //
  3478.         txJumpFileTop(text);
  3479.         if (txSearchEx(text,"[bartxe_filer]",sm)) {
  3480.             _replace(text,"[bartxe_filer]",text2);
  3481.         }
  3482.         //
  3483.         txJumpFileTop(text);
  3484.         while(1) {
  3485.             if (txSearchEx(text,"[FILER",sm)) {
  3486.                 txstr szline;
  3487.                 txGetPara(text,szline);
  3488.                 mchar* p = strchr(szline,']');
  3489.                 if (p) {
  3490.                     p[1] = 0;
  3491.                     _replace(text,szline,text2);
  3492.                 }
  3493.                 if (!txNextPara(text)) break;
  3494.             } else {
  3495.                 break;
  3496.             }
  3497.         }
  3498.         textclose(text2);
  3499.     }
  3500. }
  3501.  
  3502. static BOOL wz20ConvertConfig(mchar* _szOldPath,mchar* _szNewPath,WORD mode)
  3503. {
  3504.     BOOL ret = TRUE;
  3505.     txstr szOldPath = _szOldPath + "\\";
  3506.     txstr szNewPath = _szNewPath + "\\";
  3507.     if (mode & CCUI20_KEY) {
  3508.         TX* text = textopen(szOldPath + "wz.key");
  3509.         if (text) {
  3510.             txConvertCmdWz2To3(text);
  3511.             wz20ConvertReplaceFiler(text,szNewPath + "wz.key");//2.99G 970404 
  3512.             txSaveTo(text,szNewPath + "wz.key");
  3513.             textclose(text);
  3514.             statprintf("キー定義を取り込みました");wait(300);
  3515.         } else {
  3516.             information("キーの取り込みができませんでした");
  3517.             ret = FALSE;
  3518.         }
  3519.     }
  3520.     if (mode & CCUI20_MENU) {
  3521.         TX* text = textopen(szOldPath + "wz.mnu");
  3522.         if (text) {
  3523.             txConvertCmdWz2To3(text);
  3524.             wz20ConvertReplaceFiler(text,szNewPath + "wz.mnu");//2.99G 970404 
  3525.             //
  3526.             txJumpFileTop(text);
  3527.             if (txSearchEx(text,"[HTML挿入]",0) && txNextPara(text)) {
  3528.                 txInsertLine(text,"html.uiInsertTag=タグ(&G)...");
  3529.                 txInsertLine(text,"__sepa");
  3530.             }
  3531.             //
  3532.             txJumpFileTop(text);
  3533.             if (txSearchEx(text,"[カスタマイズ]",0) && txNextPara(text)) {
  3534.                 txInsertLine(text,"config.uiCustmize=カスタマイズ(&O)...");
  3535.                 txInsertLine(text,"__sepa");
  3536.             }
  3537.             //
  3538.             txJumpFileTop(text);
  3539.             if (txSearchEx(text,"[編集]",0)) {
  3540.                 if (txSearchEx(text,"[",SEARCH_PARATOP)) {
  3541.                     txPrevPara(text);
  3542.                     while(1) {
  3543.                         if (txIsCurReturn(text)) {
  3544.                             if (!txPrevPara(text)) break;
  3545.                         } else {
  3546.                             txNextPara(text);
  3547.                             break;
  3548.                         }
  3549.                     }
  3550.                     txInsertLine(text,"paraform.sw=自動インライン整形(&M)");
  3551.                 }
  3552.             }
  3553.             //2.99G 970404 メニューをひきつぐとWZ2.0のとりこみなくなって、とりこみの続きができなかった
  3554.             txJumpFileTop(text);
  3555.             if (txSearchEx(text,"[追加機能]",0)) {
  3556.                 if (txSearchEx(text,"[",SEARCH_PARATOP)) {
  3557.                     txPrevPara(text);
  3558.                     while(1) {
  3559.                         if (txIsCurReturn(text)) {
  3560.                             if (!txPrevPara(text)) break;
  3561.                         } else {
  3562.                             txNextPara(text);
  3563.                             break;
  3564.                         }
  3565.                     }
  3566.                     txInsertLine(text,"custmize.fromWZ20=WZ2.0の設定を取り込み(&2)...");
  3567.                 }
  3568.             }
  3569.             //
  3570.             txSaveTo(text,szNewPath + "wz.mnu");
  3571.             textclose(text);
  3572.             statprintf("メニュー定義を取り込みました");wait(300);
  3573.         } else {
  3574.             information("メニューの取り込みができませんでした");
  3575.             ret = FALSE;
  3576.         }
  3577.     }
  3578.     if (mode & CCUI20_TOOLBAR) {
  3579.         TX* text = textopen(szOldPath + "wz.bar");
  3580.         if (text) {
  3581.             txConvertCmdWz2To3(text);
  3582.             txSaveTo(text,szNewPath + "wz.bar");
  3583.             textclose(text);
  3584.             statprintf("ツールバー定義を取り込みました");wait(300);
  3585.             txFlushToolbar(textf);//3.00A4 970509 WZ20の設定の取り込みでツールバーを取り込んでも、ツールバービットマップキャッシュが更新されてなかった
  3586.         } else {
  3587.             information("ツールバーの取り込みができませんでした");
  3588.             ret = FALSE;
  3589.         }
  3590.     }
  3591.     return ret;
  3592. }
  3593.  
  3594. static BOOL CheckTextconfigEnable(void)
  3595. {
  3596.  
  3597.     txstr szPrg = text->szexedir + \"std_src\txcfgm.c";
  3598.     if (!fileIsExist(szPrg)) {
  3599.         information("WZを[最小]でインストールしているため、WZ2.0の設定と印刷スタイルを取り込むことはできません\n");
  3600.         return FALSE;
  3601.     }
  3602.     return TRUE;
  3603. }
  3604.  
  3605. static BOOL backupConfig(void)
  3606. {
  3607. //3.00A 970502 new
  3608.     int ret = question("現在のキー定義や設定のバックアップを取りますか?");
  3609.     if (ret == IDCANCEL) return FALSE;
  3610.     if (ret == IDYES) {
  3611.         mchar* tsz[] = {
  3612.             "wz.cfg","wzshare.cfg","wzprint.cfg",
  3613.             "wzp.cfg",//3.00B1 970613 
  3614.             "wz.key","wz.mnu","wz.bar",
  3615.             NULL
  3616.         };
  3617.         BOOL ret = TRUE;
  3618.         for (int i = 0;tsz[i];i++) {
  3619.             mchar szsrc[CCHPATHNAME];
  3620.             pathFullConfig(szsrc,tsz[i]);
  3621.             mchar szdst[CCHPATHNAME];
  3622.             strcpy(szdst,szsrc);
  3623.             mchar* p = pathGetFileName(szdst);
  3624.             if (toupper(*p) == 'W') *p = '_';
  3625.             if (!myfileCopy(szsrc,szdst)) {
  3626.                 information("%sから%sへのコピーに失敗しました",szsrc,szdst);
  3627.                 ret = FALSE;
  3628.                 break;
  3629.             }
  3630.         }
  3631.         information("wz*.cfg,wz.key,wz.mnu,wz.barを、\n_z*.cfg,_z.key,_z.mnu,_z.barにバックアップを取りました。");
  3632.         if (!ret) return FALSE;
  3633.     }
  3634.     return TRUE;
  3635. }
  3636.  
  3637. BOOL TXCMDBASE fromWZ20(TX* text)
  3638. {
  3639. // WZ2.0の設定を取り込み
  3640. //2.99C 970327 new
  3641.     txstr szOldPath = text->szexedir;
  3642.     pathForm(szOldPath);
  3643.     BOOL fConvertKey = TRUE;
  3644.     BOOL fConvertMenu = FALSE;        //2.99H 970405 メニューは標準で使ってもらうのが望ましいのでデフォルトでは変換OFF
  3645.     BOOL fConvertToolbar = TRUE;
  3646.     BOOL fConvertConfig = TRUE;
  3647.     BOOL fConvertLprint = TRUE;
  3648.     BOOL fCopyText = FALSE;
  3649. #if MYDEBUG    // for test
  3650. fConvertKey = FALSE;
  3651. fConvertMenu = FALSE;
  3652. fConvertToolbar = FALSE;
  3653. szOldPath = "c:\\wz20_16";
  3654. #endif
  3655.     //
  3656.     {
  3657.         txstr sz = text->szexedir + "txcfg.$$$";
  3658.         if (fileIsExist(sz)) {
  3659.             //2.99G 970404 いきなりマクロのコンパイルが始まるのはびっくりするのでメッセージを出す
  3660.             int ret = question("これからWZ2.0の設定の取り込みを実行します。\nWZのマクロのコンパイルなどが行われ、数分の時間がかかります\n実行してもよろしいですか?");
  3661.             if (ret != IDYES) return FALSE;
  3662.             //
  3663.             fileDelete(sz);
  3664. #if 1//2.99G 970404 空白が含まれるszexedirだとだめだった。
  3665.             macroFork("\"" + text->szexedir + "txcfgset.main\"");
  3666. #else
  3667.             macroFork(text->szexedir + "txcfgset.main");
  3668. #endif
  3669.             return TRUE;
  3670.         }
  3671.     }
  3672.     //
  3673.     HDIALOG hd = dialog("WZ2.0の設定の取り込み");
  3674.     int lcxh = 60;
  3675.     //
  3676.     dialogHeadline(hd,"WZ2.0のフォルダ",lcxh);
  3677.         dialogControlRefer(hd,"-d");
  3678.         dialogControlID(hd,IDD_OLDPATH);
  3679.         dialogStr(hd,"フォルダ(&F):",szOldPath,10,40);
  3680.     //
  3681.     dialogHeadline(hd,"取り込む内容",lcxh);
  3682.         dialogCheck(hd,"キー定義(&K)",&fConvertKey);
  3683.         dialogCheck(hd,"メニュー定義(&M)",&fConvertMenu);
  3684.             dialogIndent(hd,4);
  3685.             dialogCaption(hd,"メニュー定義は取り込まず、");//3.00A2 970507 
  3686.             dialogCaption(hd,"WZ3.0標準のメニューを使うことをおすすめします");//3.00A2 970507 
  3687.             dialogIndent(hd,-4);
  3688.         dialogCheck(hd,"ツールバー定義(&T)",&fConvertToolbar);
  3689.         dialogCheck(hd,"設定(&C)",&fConvertConfig);
  3690.         dialogCheck(hd,"印刷スタイル(&P)",&fConvertLprint);
  3691.         dialogCheck(hd,"TEXTフォルダのコピー(&O)",&fCopyText);
  3692.     //
  3693.     if (dialogOpen(hd)) {
  3694.         txstr szNewPath = text->szexedir;
  3695.         pathForm(szNewPath);
  3696. #if MYDEBUG    // for test
  3697. szNewPath = "c:\\wz30_32";
  3698. #endif
  3699.         //
  3700. #if 1//3.00A 970502 
  3701.         if (!backupConfig()) return FALSE;
  3702. #else
  3703.         int ret = question("現在のキー定義や設定のバックアップを取りますか?");
  3704.         if (ret == IDCANCEL) return FALSE;
  3705.         if (ret == IDYES) {
  3706.             mchar* tsz[] = {
  3707.                 "wz.cfg","wzshare.cfg","wzprint.cfg",
  3708.                 "wz.key","wz.mnu","wz.bar",
  3709.                 NULL
  3710.             };
  3711.             BOOL ret = TRUE;
  3712.             for (int i = 0;tsz[i];i++) {
  3713.                 mchar szsrc[CCHPATHNAME];
  3714.                 pathFullConfig(szsrc,tsz[i]);
  3715.                 mchar szdst[CCHPATHNAME];
  3716.                 strcpy(szdst,szsrc);
  3717.                 mchar* p = pathGetFileName(szdst);
  3718.                 if (toupper(*p) == 'W') *p = '_';
  3719.                 if (!myfileCopy(szsrc,szdst)) {
  3720.                     information("%sから%sへのコピーに失敗しました",szsrc,szdst);
  3721.                     ret = FALSE;
  3722.                     break;
  3723.                 }
  3724.             }
  3725.             information("wz*.cfg,wz.key,wz.mnu,wz.barを、\n_z*.cfg,_z.key,_z.mnu,_z.barにバックアップを取りました。");
  3726.             if (!ret) return FALSE;
  3727.         }
  3728. #endif
  3729.         //
  3730.         if (fileIsExist(szOldPath + \"\wzeditor.exe")) {
  3731.             if (fileIsExist(szNewPath + \"\wzeditor.exe")) {
  3732.                 if (fCopyText) {
  3733.                     if (wz20CopyText(szOldPath,szNewPath)) {
  3734.                         information("TEXTフォルダの内容をコピーしました。");
  3735.                     } else {
  3736.                         attention("TEXTフォルダの内容のコピーに失敗しました。");
  3737.                     }
  3738.                 }
  3739.                 if (fConvertKey) wz20ConvertConfig(szOldPath,szNewPath,CCUI20_KEY);
  3740.                 if (fConvertMenu) wz20ConvertConfig(szOldPath,szNewPath,CCUI20_MENU);
  3741.                 if (fConvertToolbar) wz20ConvertConfig(szOldPath,szNewPath,CCUI20_TOOLBAR);
  3742.                 // 最後に行う
  3743.                 if (fConvertConfig || fConvertLprint) {
  3744.                     if (CheckTextconfigEnable()) {
  3745.                         BOOL ret = TRUE;
  3746.                         {
  3747.                             TX* text = textopen(szOldPath + \"\std\txcfg.c");
  3748.                             fileDelete(szOldPath + \"\std\txcfg.txm");
  3749. //information(text->szfilename);
  3750.                             if (text) {
  3751.                                 txDeleteText(text);
  3752.                                 txInsert(text,"\nmain\n{\n");
  3753.                                 txInsert(text,"    call(\"txcfgm.writeStd\");\n");
  3754.                                 {
  3755.                                     mchar* tsz[] = {
  3756.                                         "txcfgset.c",
  3757.                                         "txcfgs1.c","txcfgs2.c","txcfgs3.c",
  3758.                                         "txcfgs4.c","txcfgs5.c","txcfgs6.c",
  3759.                                         "txcfgs7.c","txcfgs8.c","txcfgs9.c",
  3760.                                         NULL
  3761.                                     };
  3762.                                     for (i = 0;tsz[i];i++) {
  3763.                                         txInsertf(text,"    fileCopy(text->szexedir+\\\"%s\",\\\"%s%s\");\n",tsz[i],text->szexedir,tsz[i]);
  3764.                                     }
  3765.                                     txInsertf(text,"    mchar szfilename[CCHPATHNAME];\n");
  3766.                                     txInsertf(text,"    strcpy(szfilename,\\\"%s%s\");\n",text->szexedir,"txcfg.$$$");
  3767.                                     txInsertf(text,"    HFILE hfile = hfileCreate(szfilename);\n");
  3768.                                     txInsertf(text,"    hfileClose(hfile);\n");
  3769.                                 }
  3770.                                 txInsert(text,"    information(\"- 設定の取り込み -\\n\\nこのWZを全て終了しWZ3.0を起動して、「ツール|追加機能|WZ2.0の設定を取り込み」を実行してください。\\nこれで設定が取り込まれます\");\n");
  3771.                                 txInsert(text,"}\n");
  3772.                                 //
  3773.                                 txSave(text);
  3774.                                 textclose(text);
  3775.                             } else {
  3776.                                 information("err:%s%d",__FILE__,__LINE__);
  3777.                                 ret = FALSE;
  3778.                             }
  3779.                         }
  3780.                         if (ret) {
  3781. #if 1//2.99G 970404 
  3782.                             fileCopy(text->szexedir + \"std_src\txcfgm.c",szOldPath + \"\std\txcfgm.c");
  3783. #else
  3784.                             fileCopy(text->szexedir + \"std\txcfgm.c",szOldPath + \"\std\txcfgm.c");
  3785. #endif
  3786.                             fileDelete(szOldPath + \"\std\txcfgm.txm");
  3787.                             txOpenForkFast(text,text->szexedir + "std\\txcfg.txt");
  3788.                         }
  3789.                     }
  3790.                 } else {
  3791.                     //3.00A4 970509
  3792.                     information("設定を読み込みました。\n新しい設定は次に開くファイルから有効になります。\n今現在開いているWZの窓の設定は古いままです。\nこの窓で設定を行うと古い設定が保存されるので注意してください。");
  3793.                 }
  3794.             } else {
  3795.                 information(GUIDE_FOLDER "にWZ EDITORは存在しません。",szNewPath);
  3796.             }
  3797.         } else {
  3798.             information(GUIDE_FOLDER "にWZ EDITORは存在しません。",szOldPath);
  3799.         }
  3800.         return TRUE;
  3801.     }
  3802.     return FALSE;
  3803. }
  3804.  
  3805. static BOOL copyMacro(mchar* szOldPath,mchar* szNewPath)
  3806. {
  3807. //3.00A 970502 
  3808.     return cmd("mcopy \"" +  szNewPath + "\" \"" + szOldPath + "\\macro\\\"");
  3809. }
  3810.  
  3811. static BOOL copyFile(mchar* szOldPath,mchar* szNewPath,mchar* szfilename)
  3812. {
  3813.     return fileCopy(szOldPath + "\\" + szfilename,szNewPath + "\\" + szfilename);
  3814. }
  3815.  
  3816. permanent txstr szPathFromWz30;    //3.00A 970502 
  3817.  
  3818. BOOL TXCMDBASE fromWZ30(TX* text)
  3819. {
  3820. // WZ3.0の設定を取り込み
  3821. // ネットワークには対応していません。
  3822. //3.00A 970502 new
  3823.     txstr szOldPath;
  3824.     if (szPathFromWz30 != "") {
  3825.         szOldPath = szPathFromWz30;
  3826.     } else {
  3827.         szOldPath = text->szexedir;
  3828.         pathForm(szOldPath);
  3829.     }
  3830.     BOOL fConvertKey = TRUE;
  3831.     BOOL fConvertMenu = TRUE;
  3832.     BOOL fConvertToolbar = TRUE;
  3833.     BOOL fConvertConfig = TRUE;
  3834.     BOOL fConvertLprint = TRUE;
  3835.     BOOL fCopyText = TRUE;
  3836.     BOOL fCopyMacro = TRUE;
  3837.     BOOL fCopyIniDic = TRUE;//3.00A2 970503 
  3838.     //
  3839.     HDIALOG hd = dialog("他のWZ3.0の設定の取り込み");
  3840.     int lcxh = 60;
  3841.     //
  3842.     dialogHeadline(hd,"他のWZ3.0のフォルダ",lcxh);
  3843.         dialogControlRefer(hd,"-d");
  3844.         dialogControlID(hd,IDD_OLDPATH);
  3845.         dialogStr(hd,"フォルダ(&F):",szOldPath,10,40);
  3846.     //
  3847.     dialogHeadline(hd,"取り込む内容",lcxh);
  3848.         dialogCheck(hd,"キー定義(&K)",&fConvertKey);
  3849.         dialogCheck(hd,"メニュー定義(&M)",&fConvertMenu);
  3850.         dialogCheck(hd,"ツールバー定義(&T)",&fConvertToolbar);
  3851.         dialogCheck(hd,"設定(&C)",&fConvertConfig);
  3852.         dialogCheck(hd,"印刷スタイル(&P)",&fConvertLprint);
  3853.         dialogCheck(hd,"TEXTフォルダのコピー(&O)",&fCopyText);
  3854.         dialogCheck(hd,"MACROフォルダとAPIDBのコピー(&X)",&fCopyMacro);
  3855.         dialogCheck(hd,"マクロの設定と辞書ファイル(&I)",&fCopyIniDic);//3.00A2 970503 
  3856.     //
  3857.     if (dialogOpen(hd)) {
  3858.         szPathFromWz30 = szOldPath;
  3859.         txstr szNewPath = text->szexedir;
  3860.         pathForm(szNewPath);
  3861.         //
  3862.         if (!backupConfig()) return FALSE;
  3863.         //
  3864.         if (fileIsExist(szOldPath + \"\wzeditor.exe")) {
  3865.             if (fileIsExist(szNewPath + \"\wzeditor.exe")) {
  3866.                 if (fCopyText) {
  3867.                     if (wz20CopyText(szOldPath,szNewPath)) {
  3868.                         information("TEXTフォルダの内容をコピーしました。");
  3869.                     } else {
  3870.                         attention("TEXTフォルダの内容のコピーに失敗しました。");
  3871.                     }
  3872.                 }
  3873.                 if (fCopyMacro) {
  3874.                     if (copyMacro(szOldPath,szNewPath)) {
  3875.                         information("MACROフォルダの内容をコピーしました。");
  3876.                     } else {
  3877.                         attention("MACROフォルダの内容のコピーに失敗しました。");
  3878.                     }
  3879.                     copyFile(szOldPath,szNewPath,"txcmdusr.api");
  3880.                     copyFile(szOldPath,szNewPath,"txapiusr.api");
  3881.                 }
  3882.                 if (fConvertKey) copyFile(szOldPath,szNewPath,"wz.key");
  3883.                 if (fConvertMenu) {
  3884.                     copyFile(szOldPath,szNewPath,"wz.mnu");
  3885.                     // fromWZ30がメニューに存在しなければ、追加
  3886.                     TX* text = textopen(szNewPath + "\\wz.mnu");
  3887.                     if (text) {
  3888.                         if (!txSearchEx(text,"custmize.fromWZ30",SEARCH_NOSENSECASE)) {
  3889.                             txJumpFileTop(text);
  3890.                             if (txSearchEx(text,"[追加機能]",0)) {
  3891.                                 txNextPara(text);
  3892.                                 txInsertLine(text,"custmize.fromWZ30=他のWZ3.0の設定を取り込み(&3)...");
  3893.                                 txSave(text);
  3894.                             }
  3895.                         }
  3896.                         textclose(text);
  3897.                     }
  3898.                 }
  3899.                 if (fConvertToolbar) copyFile(szOldPath,szNewPath,"wz.bar");
  3900.                 if (fConvertConfig) {
  3901.                     copyFile(szOldPath,szNewPath,"wz.cfg");
  3902.                     copyFile(szOldPath,szNewPath,"wzp.cfg");//3.00B1 970613 
  3903.                     copyFile(szOldPath,szNewPath,"wzshare.cfg");
  3904.                 }
  3905.                 if (fConvertLprint) {
  3906.                     copyFile(szOldPath,szNewPath,"wzprint.cfg");
  3907.                 }
  3908.                 if (fCopyIniDic) {
  3909.                     cmd("mcopy \"" +  szNewPath + "\" \"" + szOldPath + "\\*.ini");
  3910.                     cmd("mcopy \"" +  szNewPath + "\" \"" + szOldPath + "\\*.dic");
  3911.                 }
  3912.             } else {
  3913.                 information(GUIDE_FOLDER "にWZ EDITORは存在しません。",szNewPath);
  3914.             }
  3915.         } else {
  3916.             information(GUIDE_FOLDER "にWZ EDITORは存在しません。",szOldPath);
  3917.         }
  3918.         return TRUE;
  3919.     }
  3920.     return FALSE;
  3921. }
  3922.  
  3923. BOOL TXCMDBASE textconfig(TX* text)
  3924. {
  3925. // 設定のテキスト化
  3926. //2.99D 970328 new
  3927.     if (!CheckTextconfigEnable()) return FALSE;
  3928.     HDIALOG hd = dialog("設定のテキスト化");
  3929.     dialogSetContexthelp(hd,TRUE);
  3930.     int mode = 0;
  3931.     dialogControlRadioV(hd);
  3932.     dialogControlHelp(hd,-434);
  3933.     dialogRadioID(hd,&mode,
  3934.         "現在の設定を設定テキストファイルに保存する(&W)",
  3935.         "現在の設定を設定テキストファイルから読み込んで設定する(&R)",
  3936.         "設定テキストファイルを開く(&O)"
  3937.     );
  3938.     if (dialogOpen(hd)) {
  3939.         switch(mode) {
  3940.             case 0: {
  3941.                 call("txcfgm");
  3942.                 break;
  3943.             }
  3944.             case 1: {
  3945.                 mchar szfilename[CCHPATHNAME];
  3946.                 pathFullConfig(szfilename,"txcfgset.c");
  3947.                 pathSetExt(szfilename,".main");
  3948. information(szfilename);
  3949.                 macroFork("\"" + szfilename + "\"");//2.99G 970404 ""でくくらないとロングファイル名だめ
  3950.                 break;
  3951.             }
  3952.             case 2: {
  3953.                 mchar szfilename[CCHPATHNAME];
  3954.                 pathFullConfig(szfilename,"txcfgset.c");
  3955.                 txOpenForkFast(text,szfilename);
  3956.                 break;
  3957.             }
  3958.         }
  3959.     }
  3960.     return TRUE;
  3961. }
  3962.  
  3963. static BOOL _createEnglishMenu(mchar* szJapaneseMenu)
  3964. {
  3965. // 英語メニューを作成します。
  3966.     statprintf("英語メニュー作成中...");
  3967.     TX* text = textopen(text1->szexedir + "wze.mnu");
  3968.     TX* textSrc = textopen(szJapaneseMenu);
  3969.     TX* textDic = textopen(text1->szexedir + "engmenu.dic");
  3970.     if (text && textSrc && textDic) {
  3971.         txDeleteText(text);
  3972.         txstr szline;
  3973.         txstr szfind;
  3974.         txstr szdic;
  3975.         while(1) {
  3976.             txGetPara(textSrc,szline);
  3977.             {
  3978.                 BOOL f = FALSE;
  3979.                 mchar* p = strchr(szline,'=');
  3980.                 if (p) {
  3981.                     txJumpFileTop(textDic);
  3982.                     txstrcpylen(szfind,szline,p - (mchar*)szline);
  3983.                     szfind += "\t";
  3984.                     if (txSearchEx(textDic,szfind,SEARCH_CUR)) {
  3985.                         txGetPara(textDic,szdic);
  3986.                         int lchCmd1 = strlen(szfind);
  3987.                         mchar* szJapanese = &szline[lchCmd1];
  3988.                         int chAccess = 0;
  3989.                         {
  3990.                             mchar* p = strstr(szJapanese,"(&");
  3991.                             if (p) chAccess = p[2];
  3992.                         }
  3993.                         mchar* szEnglish = &szdic[lchCmd1];
  3994.                         txInsert(text,szfind);
  3995.                         txDeletePrev(text);
  3996.                         txInsertChar(text,'=');
  3997.                         if (chAccess) {
  3998.                             mchar *p = strichr(szEnglish,chAccess);
  3999.                             if (p) {
  4000.                                 mchar c = *p;
  4001.                                 *p = 0;
  4002.                                 txInsert(text,szEnglish);
  4003.                                 txInsertChar(text,'&');
  4004.                                 txInsertChar(text,c);
  4005.                                 txInsert(text,p+1);
  4006.                             } else {
  4007.                                 txInsert(text,szEnglish);
  4008.                                 txInsertf(text,"(&%c)",chAccess);
  4009.                             }
  4010.                         } else {
  4011.                             txInsert(text,szEnglish);
  4012.                         }
  4013.                         if (strstr(szJapanese,"...")) {
  4014.                             txInsert(text,"...");
  4015.                         }
  4016.                         txInsertReturn(text);
  4017.                         f = TRUE;
  4018.                     }
  4019.                 }
  4020.                 if (!f) {
  4021.                     txInsert(text,szline);
  4022.                     txInsertReturn(text);
  4023.                 }
  4024.             }
  4025.             if (!txNextPara(textSrc)) break;
  4026.         }
  4027.         txSave(text);
  4028.     }
  4029.     textclose(textDic);
  4030.     textclose(textSrc);
  4031.     textclose(text);
  4032.     statprintf("英語メニュー作成完了しました");
  4033.     return TRUE;
  4034. }
  4035.  
  4036. createEnglishMenuForMaster
  4037. {
  4038.     return _createEnglishMenu(text1->szexedir + "_wz.mnu");
  4039. }
  4040.  
  4041. BOOL TXCMDBASE createEnglishMenu(TX* text)
  4042. {
  4043. // 英語メニューを作成します。
  4044. //2.99D 970328 new
  4045.     return _createEnglishMenu(text1->szexedir + "wz.mnu");
  4046. }
  4047.  
  4048. main
  4049. {
  4050.     uiKeyList(text);return;
  4051. //    key();
  4052.     menu();
  4053. //    toolbar();
  4054. }
  4055.  
  4056.