home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2002 January / VPR0201B.ISO / APUPDATE / VC / TXC0601S / TXC0601S.LZH / _IDMTXC.C < prev    next >
C/C++ Source or Header  |  2001-01-01  |  18KB  |  580 lines

  1. /*
  2.     TX-C/マクロのIDMコマンド処理群
  3.         Start 99年12月 4日
  4. */
  5.  
  6. #if __TXC__
  7.     #include <_wz.h>
  8.     #include <windows.h>
  9.     #include <windowsx.h>
  10.     #include <_idm.h>
  11. #else
  12.     #include "_sys.h"
  13. #endif
  14. #include "_idmlib.h"
  15. #include "_list.h"
  16.  
  17. //##設定の読み書き
  18.  
  19. mchar* txcGetsetEventMacro(mchar szEventMacros[CCHEVENTMACROS],BOOL fSet)
  20. {
  21. //WZ3.90L 981116 new
  22.     wchar wsz[CCHPATHNAME];
  23.     TX* text = textopenW(wpathFullConfig(wsz,L"txc.cfg"));
  24.     txMsghdrGetsetString(text,"eventmacro:",szEventMacros,CCHEVENTMACROS,fSet);
  25.     if (fSet) txSave(text);
  26.     textclose(text);
  27.     return szEventMacros;
  28. }
  29.  
  30. mchar* txcGetEventMacro(mchar buff[CCHEVENTMACROS])
  31. {
  32. //WZ3.90L 981116 new
  33.     return txcGetsetEventMacro(buff,FALSE);
  34. }
  35.  
  36. static void txcGetsetLastexec(mchar szLastexec[CCHWORD],BOOL fSet)
  37. {
  38. //WZ3.90L 981116 new
  39.     wchar wsz[CCHPATHNAME];
  40.     TX* text = textopenW(wpathFullConfig(wsz,L"txc.cfg"));
  41.     txMsghdrGetsetString(text,"lastexec:",szLastexec,CCHWORD,fSet);
  42.     if (fSet) txSave(text);
  43.     textclose(text);
  44. }
  45.  
  46. #if __TXC__
  47. mchar* strGetNextWordTop(mchar* szStr)
  48. {
  49. //WZ3.90I 981013 new
  50.     szStr = strGetWordTop(szStr);    //WZ3.90J 981108 
  51.     return strGetWordTop(szStr + strGetWordLen(szStr));
  52. }
  53. #endif
  54.  
  55. //##TX-Cの設定ダイアログ
  56.  
  57. #if WZFUNC_TXC    //WZ4.00Be 990513 
  58.  
  59. typedef struct {
  60.     LISTITEM head;    // 必ず先頭にこれを入れる
  61. // mydata
  62.     mchar szStatus[10];
  63.     mchar szModule[CCHWORD];
  64.     mchar szName[CCHWORD];
  65.     mchar szAuthor[40];
  66.     mchar szVersion[20];
  67.     WORD fConfig:1;
  68.     WORD fHelp:1;
  69. } PLUGIN_ITEM;
  70.  
  71. enum {
  72.     IDD_UP=100,IDD_DOWN,IDD_DELETE,IDD_ADD,IDD_STATUS,IDD_CONFIG,IDD_HELP,
  73. };
  74.  
  75. typedef struct {
  76.     TX* text;
  77.     LIST* list;
  78.     TXCOPTION copt;
  79.     mchar szEventMacros[CCHEVENTMACROS];
  80. } CONTEXT_TXCCONFIG;
  81.  
  82. static mchar _szOK[] = "OK";
  83. static mchar _szErr[] = "エラー";
  84. static mchar _szSkip[] = "無効";
  85.  
  86. mchar* szEventMacrosSetError(mchar szEventMacros[CCHEVENTMACROS],mchar* p)
  87. {
  88. // pの位置から始まるマクロ名をエラーとしてマークを付ける。
  89. // 次のマクロ名のアドレスを返す。
  90. // バッファオーバーした場合はマクロ名を削除してpを返す。
  91. //WZ4.00Ca 991204 new
  92.     if (p >= szEventMacros+2 && p[-2] == ' ') {
  93.         p[-1] = '!';
  94.         return strGetNextWordTop(p);
  95.     } else {
  96.         if (strlen(szEventMacros) + 1 > CCHEVENTMACROS) {
  97.             strcpy(p,strGetNextWordTop(p) - p);
  98.             return p;
  99.         } else {
  100.             memmove(p+1,p,strlen(p)+1);
  101.             p[0] = '!';
  102.             return strGetNextWordTop(p);
  103.         }
  104.     }
  105. }
  106.  
  107. static BOOL plugitemGetInfo(PLUGIN_ITEM* item)
  108. {
  109. // item->szModuleの情報を取得。エラーが発生した場合はFALSEを返す
  110.     strcpy(item->szName,"(不明)");
  111.     strcpy(item->szAuthor,"(不明)");
  112.     strcpy(item->szVersion,"(不明)");
  113.     if (strcmp(item->szStatus,_szErr)) {
  114.         mchar szMacro[120];
  115.         sstrcpy(szMacro,item->szModule);
  116.         sstrcat(szMacro,".__pluginGetProperty");
  117.         {
  118.             FARPROC pc = macroGetTxpcode(szMacro);
  119.             if (pc) {
  120.                 txstr str;
  121.                 DWORD tArg[2] = {&str,NULL};
  122. //information(szMacro);
  123.                 structClear(str);tArg[1] = "name";
  124.                 txpcodeCallAddress(pc,2,tArg);
  125.                 sstrcpy(item->szName,str.szString);
  126.                 //
  127.                 structClear(str);tArg[1] = "author";
  128.                 txpcodeCallAddress(pc,2,tArg);
  129.                 sstrcpy(item->szAuthor,str.szString);
  130.                 //
  131.                 structClear(str);tArg[1] = "version";
  132.                 txpcodeCallAddress(pc,2,tArg);
  133.                 sstrcpy(item->szVersion,str.szString);
  134.                 // __pluginGetPropertyできたときのみ、Config/Helpを調べる。
  135.                 // コンパイルエラーの場合に何度もコンパイルしないように。
  136.                 sstrcpy(szMacro,item->szModule);
  137.                 sstrcat(szMacro,".__pluginConfig");
  138.                 item->fConfig = !!macroGetTxpcode(szMacro);
  139.                 //
  140.                 sstrcpy(szMacro,item->szModule);
  141.                 sstrcat(szMacro,".__pluginHelp");
  142.                 item->fHelp = !!macroGetTxpcode(szMacro);
  143.                 return TRUE;
  144.             } else if (sh->fTxcCompileError) {
  145.                 // このmacroGetTxpcodeでエラーになった場合。
  146.                 strcpy(item->szStatus,_szErr);
  147.                 return FALSE;
  148.             }
  149.         }
  150.     }
  151.     return TRUE;
  152. }
  153.  
  154. static BOOL plugitemIsExist(LIST* list,mchar* szModule)
  155. {
  156.     int i;
  157.     for (i = 0;;i++) {
  158.         PLUGIN_ITEM* item = listRead(list,i);
  159.         if (!item) break;
  160.         if (!stricmp(szModule,item->szModule)) return TRUE;
  161.     }
  162.     return FALSE;
  163. }
  164.  
  165. static BOOL plugitemCheck(mchar* szModule)
  166. {
  167.     mchar szMacro[CCHWORD];
  168.     strcpy(szMacro,szModule);
  169.     sstrcat(szMacro,".__on_txFrameNew");
  170.     return macroGetTxpcode(szMacro);
  171. }
  172.  
  173. BOOL CALLBACK dlgprocTxcConfig(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  174. {
  175.     HDIALOG hd = dialogFromHwnd(hwnd);
  176.     CONTEXT_TXCCONFIG* context = (LPVOID)dialogGetCustdata(hd);
  177.     switch(message) {
  178.         case WM_INITDIALOG: {
  179.             if (GetDlgItem(hwnd,IDD_LIST)) {
  180.                 BOOL fEdit = FALSE;
  181.                 PLUGIN_ITEM item;
  182.                 #if WINDOWSCE
  183.                 LIST* list = listFromHwnd(GetDlgItem(hwnd,IDD_LIST));
  184.                 #else
  185.                 LIST* list = listh_GetList(GetDlgItem(hwnd,IDD_LIST));
  186.                 #endif
  187.                 SUBLISTITEMATR* atr = &list->tSubitem[0];
  188.                 context->list = list;
  189.                 list->fNoHeaderTrack = TRUE;    //WZ4.00Cb 000117 「TX-Cの設定|プラグイン」でヘッダカラム幅を変更できないようにした。
  190.                 list->fNoSelect = TRUE;            //WZ4.00Db 000213 「TX-Cの設定|プラグイン」で複数選択できないようにした。
  191.                 listSetFont(list,systemfontGetFaceName(),systemfontGetHeight());
  192.                 SetWindowLong(list->hwnd,GWL_ID,IDD_LIST);    // for context-help
  193. //                atr->type = LISTITEM_INT;
  194. //                atr->offset = (LPBYTE)&item.npara - (LPBYTE)&item;
  195. //                atr->cx = dtcx(DTCX * 6);
  196. //                    atr++;
  197.                 atr->type = LISTITEM_SZ;
  198.                 atr->offset = (LPBYTE)item.szStatus - (LPBYTE)&item;
  199.                 atr->cx = dtcxListString(list,"エラー");
  200.                 atr->fCenter = TRUE;
  201.                 #if !WINDOWSCE
  202.                 strcpy(atr->szGuide,"状態");
  203.                 #endif
  204.                     atr++;
  205.                 atr->type = LISTITEM_SZ;
  206.                 atr->offset = (LPBYTE)item.szModule - (LPBYTE)&item;
  207.                 atr->cx = dtcxList(list,DTCX*12);
  208.                 #if !WINDOWSCE
  209.                 strcpy(atr->szGuide,"マクロ名");
  210.                 #endif
  211.                     atr++;
  212.                 atr->type = LISTITEM_SZ;
  213.                 atr->offset = (LPBYTE)item.szAuthor - (LPBYTE)&item;
  214.                 atr->cx = dtcxList(list,DTCX*12);
  215.                 atr->fCenter = TRUE;
  216.                 #if !WINDOWSCE
  217.                 strcpy(atr->szGuide,"作者");
  218.                 #endif
  219.                     atr++;
  220.                 atr->type = LISTITEM_SZ;
  221.                 atr->offset = (LPBYTE)item.szVersion - (LPBYTE)&item;
  222.                 atr->cx = dtcxList(list,DTCX*(10-WINDOWSCE*2));
  223.                 atr->fCenter = TRUE;
  224.                 #if !WINDOWSCE
  225.                 strcpy(atr->szGuide,"バージョン");
  226.                 #endif
  227.                     atr++;
  228.                 atr->type = LISTITEM_SZ;
  229.                 atr->offset = (LPBYTE)item.szName - (LPBYTE)&item;
  230.                 atr->cx = -1;
  231.                 #if !WINDOWSCE
  232.                 strcpy(atr->szGuide,"説明");
  233.                 #endif
  234.                     atr++;
  235.                 list->nSubitem = atr - &list->tSubitem[0];
  236.                 listHeaderSetup(list);
  237.                 {
  238.                     mchar* p = context->szEventMacros;
  239.                     while(1) {
  240.                         int lch;
  241.                         p = strGetWordTop(p);
  242.                         lch = strGetWordLen(p);
  243.                         if (!lch) break;
  244.                         {
  245.                             PLUGIN_ITEM* item = zmalloc(sizeof(PLUGIN_ITEM));
  246.                             strcpy(item->szStatus,_szOK);
  247.                             if (p[0] == '!') {
  248.                                 strcpy(item->szStatus,_szErr);
  249.                                 p++;lch--;
  250.                             } else if (p[0] == '#') {
  251.                                 strcpy(item->szStatus,_szSkip);
  252.                                 p++;lch--;
  253.                             }
  254.                             sstrcpylen(item->szModule,p,lch);
  255.                             if (!plugitemGetInfo(item)) {
  256.                                 p = szEventMacrosSetError(context->szEventMacros,p);
  257.                                 lch = 0;
  258.                                 fEdit = TRUE;
  259.                             }
  260.                             listAdd(list,item);
  261.                         }
  262.                         p += lch;
  263.                     }
  264.                 }
  265.                 listDispAll(list);
  266.                 PostMessage(hwnd,WM_TXUSER,0,0);
  267.                 if (fEdit) txcSaveConfig(&context->copt);    // コンパイルエラーが出た場合はエラー状態を保存するためにセーブする。
  268.             }
  269.             break;
  270.         }
  271.         case WM_COMMAND: {
  272.             int id = GET_WM_COMMAND_ID(wParam,lParam);
  273.             LIST* list = context->list;
  274.             switch(id) {
  275.                 case IDD_UP: {
  276.                     listMoveUp(list);
  277.                     return TRUE;
  278.                 }
  279.                 case IDD_DOWN: {
  280.                     listMoveDown(list);
  281.                     return TRUE;
  282.                 }
  283.                 case IDD_DELETE: {
  284.                     PLUGIN_ITEM* item = listReadCur(list);
  285.                     if (item) {
  286.                         if (question("マクロ %s をプラグインから外します。\nディスク上のマクロプログラムファイルはそのまま残ります。\nよろしいですか?",item->szModule) == IDYES) {
  287.                             listDelCur(list);
  288.                             PostMessage(hwnd,WM_TXUSER,0,0);
  289.                         }
  290.                     }
  291.                     return TRUE;
  292.                 }
  293.                 case IDD_ADD: {
  294.                     HDIALOG hd = dialog("プラグインマクロに追加");
  295.                     mchar szfilename[CCHPATHNAME] = {0};
  296.                     dialogControlRefer(hd,"-a wz:\\macro\\*.*");
  297. //                    dialogControlRefer(hd,"-a c:\\program files\\wz editor\\*.*");
  298.                     dialogString(hd,"マクロ名(&N):",10,szfilename,cchof(szfilename),30);
  299.                     if (dialogOpen(hd)) {
  300.                         mchar szModule[CCHWORD];
  301.                         pathSetExt(szfilename,NULL);
  302.                         sstrcpy(szModule,pathGetFileName(szfilename));
  303.                         if (plugitemIsExist(list,szModule)) {
  304.                             information("%s は既に組み込まれています",szModule);
  305.                         } else if (!plugitemCheck(szModule)) {
  306.                             if (sh->fTxcCompileError) {
  307.                                 information("コンパイルエラーが発生しました。");
  308.                             } else {
  309.                                 information("%s はプラグインマクロではありません。",szModule);
  310.                             }
  311.                         } else {
  312.                             PLUGIN_ITEM* item = zmalloc(sizeof(PLUGIN_ITEM));
  313.                             strcpy(item->szStatus,_szOK);
  314.                             sstrcpy(item->szModule,szModule);
  315.                             plugitemGetInfo(item);
  316.                             listInsert(list,item);
  317.                             listDispAll(list);
  318.                             PostMessage(hwnd,WM_TXUSER,0,0);
  319.                         }
  320.                     }
  321.                     return TRUE;
  322.                 }
  323.                 case IDD_STATUS: {
  324.                     PLUGIN_ITEM* item = listReadCur(list);
  325.                     if (item) {
  326.                         HDIALOG hd = dialog("状態");
  327.                         int fOK = !strcmp(item->szStatus,_szOK);
  328.                         dialogChoiceRadio(hd,&fOK,"無効  ","&OK    ",NULL);    //WZ4.00Ca 991210 space : ダイアログが小さすぎるのを直す。
  329.                         if (dialogOpen(hd)) {
  330.                             strcpy(item->szStatus,fOK ? _szOK : _szSkip);
  331.                             listDispAll(list);
  332.                         }
  333.                     }
  334.                     return TRUE;
  335.                 }
  336.                 case IDD_CONFIG: {
  337.                     PLUGIN_ITEM* item = listReadCur(list);
  338.                     if (item && item->fConfig) {
  339.                         mchar szMacro[CCHWORD];
  340.                         strcpy(szMacro,item->szModule);
  341.                         sstrcat(szMacro,".__pluginConfig");
  342.                         macroExec(szMacro,context->text);
  343.                     }
  344.                     return TRUE;
  345.                 }
  346.                 case IDD_HELP: {
  347.                     PLUGIN_ITEM* item = listReadCur(list);
  348.                     if (item && item->fHelp) {
  349.                         mchar szMacro[CCHWORD];
  350.                         strcpy(szMacro,item->szModule);
  351.                         sstrcat(szMacro,".__pluginHelp");
  352.                         macroExec(szMacro,context->text);
  353.                     }
  354.                     return TRUE;
  355.                 }
  356.             }
  357.             break;
  358.         }
  359.         case WM_NOTIFY: {
  360.             LISTNOTIFY* notify = lParam;
  361.             LIST* list = context->list;
  362.             if (list && notify->hdr.hwndFrom == list->hwnd) {
  363.                 if (notify->hdr.code == LISTN_SELCHANGE) {
  364.                     PostMessage(hwnd,WM_TXUSER,0,0);
  365.                 }
  366.             }
  367.             break;
  368.         }
  369.         case WM_TXDIALOG_NOTIFY: {
  370.             //// XZ,PWZで動作するか要確認。
  371.             if (wParam == TXDLGN_PSN_APPLY) {
  372.                 LIST* list = context->list;
  373.                 int i;
  374.                 context->szEventMacros[0] = 0;
  375.                 for (i = 0;;i++) {
  376.                     PLUGIN_ITEM* item = listRead(list,i);
  377.                     if (!item) break;
  378.                     if (strlen(context->szEventMacros) + strlen(item->szModule) + 10 > cchof(context->szEventMacros)) {
  379.                         information("プラグインマクロが多すぎます");
  380.                         return TRUE;
  381.                     }
  382.                     if (context->szEventMacros[0]) strcat(context->szEventMacros," ");
  383.                     strcat(context->szEventMacros,!strcmp(item->szStatus,_szOK) ? " " : (!strcmp(item->szStatus,_szSkip) ? "#" : "!"));
  384.                     strcat(context->szEventMacros,item->szModule);
  385.                 }
  386.                 break;
  387.             }
  388.             break;
  389.         }
  390.         case WM_TXUSER: {
  391.             LIST* list = context->list;
  392.             PLUGIN_ITEM* item = listReadCur(list);
  393.             if (item) {
  394.                 EnableDlgItem(hwnd,IDD_CONFIG,item->fConfig);
  395.                 EnableDlgItem(hwnd,IDD_HELP,item->fHelp);
  396.             }
  397.             break;
  398.         }
  399.     }
  400.     return FALSE;
  401. }
  402.  
  403. BOOL txIDM_TXC_CONFIG(TX* text)
  404. {
  405.     BOOL ret = FALSE;
  406.     CONTEXT_TXCCONFIG context;
  407.     TXCOPTION* copt = &context.copt;
  408.     HDIALOG hd0 = dialog("TX-Cの設定");
  409.     HDIALOG hd;
  410.     //
  411.     hd0->fNoApplyNow = TRUE;
  412.     dialogSetDlgproc(hd0,dlgprocTxcConfig);
  413.     //
  414.     structClear(context);
  415.     txcLoadConfig(copt);
  416.     context.text = text;
  417.     txcGetEventMacro(context.szEventMacros);
  418.     dialogSetCustdata(hd0,&context);
  419.     //
  420. #if 1//WZ4.00Ca 991203 プラグインの設定を行いやすくした。組み込み順が重要なマクロもあるので。
  421.     if (!stricmp(context.szEventMacros,"plugin")) {    // ykome氏のマクロからの乗り換え
  422.         if (question("プラグイン管理をマクロからWZ本体に移しますか?") == IDYES) {
  423.             wchar wszfilename[CCHPATHNAME];
  424.             wchar* wsz = wstrdupA(copt->szpathMacro);
  425.             if (wpathSearch(wszfilename,L"plugin.cfg",wsz,NULL)) {
  426.                 mchar sz[CCHPATHNAME];
  427.                 txstr str;
  428.                 wpathtopath(wszfilename,sz);
  429.                 _permanentGetTxstr(sz,"eventmacro:",&str);
  430. //information(str.szString);
  431.                 sstrcpy(context.szEventMacros,str.szString);
  432.                 while(1) {    // 無効印'-'を'!'に置き換え。
  433.                     mchar* p = strchr(context.szEventMacros,'-');
  434.                     if (!p) break;
  435.                     *p = '!';
  436.                 }
  437.                 txcGetsetEventMacro(context.szEventMacros,TRUE);
  438.             }
  439.         }
  440.     }
  441.     hd = dialog("プラグイン");
  442.     {
  443.         DTRECT r;
  444.         dialogGetPos(hd,&r);
  445.         r.cx = DTCX * (60 + !WINDOWSCE*10 - _pspc*30);
  446.         r.cy = DTCY * (8 + !WINDOWSCE*5);
  447.         __dialogAddItem(hd,WINDOWSCE?szclassList:szclassListH,NULL,IDD_LIST,&r,WS_GROUP|WS_TABSTOP|WS_BORDER|WS_CHILD|WS_VISIBLE|(WINDOWSCE*WS_HSCROLL));
  448.         dialogControlHelpEx(hd,"txc",8);_dialogAddControlInfo(hd,IDD_LIST);
  449.         dialogSetPosY(hd,r.y + r.cy + DTCYINT);
  450.             dialogSetH(hd);
  451.         dialogControlHelpEx(hd,"txc",9);dialogControlID(hd,IDD_STATUS);dialogPushbutton(hd,"状態(&O)...",11-_pspc);
  452.         dialogControlHelpEx(hd,"txc",10);dialogControlID(hd,IDD_UP);dialogPushbutton(hd,"↑ &[",5);
  453.         dialogControlHelpEx(hd,"txc",11);dialogControlID(hd,IDD_DOWN);dialogPushbutton(hd,"↓ &]",5);
  454.             dialogIndent(hd,2 - 2*_pspc);
  455.         dialogControlHelpEx(hd,"txc",12);dialogControlID(hd,IDD_ADD);dialogPushbutton(hd,"新規登録(&N)...",12);
  456.         dialogControlHelpEx(hd,"txc",13);dialogControlID(hd,IDD_DELETE);dialogPushbutton(hd,"削除(&D)",8);
  457.             dialogLF(hd);
  458.         dialogControlHelpEx(hd,"txc",14);dialogControlID(hd,IDD_CONFIG);dialogPushbutton(hd,"設定(&S)...",11-_pspc);
  459.         dialogControlHelpEx(hd,"txc",15);dialogControlID(hd,IDD_HELP);dialogPushbutton(hd,"ヘルプ(&H)...",11-_pspc);
  460.     }
  461.     dialogAddPage(hd0,hd);
  462. #else
  463.     hd = dialog("マクロ");
  464.         dialogString(hd,"イベントマクロ(&E):",24,context.szEventMacros,cchof(CCHEVENTMACROS),30);
  465.         dialogCaption(hd,"    マクロ名を空白で区切って指定してください");
  466.     dialogAddPage(hd0,hd);
  467. #endif
  468.     //
  469.     hd = dialog("設定");
  470.         dialogControlHelpEx(hd,"txc",1);
  471.         dialogChoiceB(hd,"プラットフォーム(&P):",20,&copt->modePlatform,20,"Windows98/95/NT","WindowsCE1.0","WindowsCE2.0","UNIX",NULL);
  472.         //
  473.         dialogControlHelpEx(hd,"txc",2);
  474.         dialogCheckB(hd,"自動makeを行う(&M)",&copt->fAutoMake);
  475.         //
  476.         dialogControlHelpEx(hd,"txc",3);
  477.         dialogString(hd,"マクロパス(&R):",24,copt->szpathMacro,cchof(copt->szpathMacro),30);
  478.         dialogControlHelpEx(hd,"txc",4);
  479.         dialogString(hd,"includeファイルのパス(&I):",24,copt->szpathInclude,cchof(copt->szpathInclude),30);
  480.         dialogControlHelpEx(hd,"txc",5);
  481.         dialogString(hd,"出力ファイルのパス(&O):",24,copt->szpathOutput,cchof(copt->szpathOutput),30);
  482.     dialogAddPage(hd0,hd);
  483.     //
  484.     hd = dialog("メッセージ");
  485.         dialogControlHelpEx(hd,"txc",6);
  486.         dialogControlGuide(hd,"個のエラーでコンパイルを中止",28);
  487.         dialogIntegerW(hd,NULL,0,&copt->nErrorMessage,5);
  488.         dialogHeadline(hd,"ワーニングとレポートの出力",44);
  489.         dialogSetPosLF(hd);
  490.         dialogControlHelpEx(hd,"txc",7);
  491.         dialogCheckB(hd,"関数は呼ばれない(&N)",&copt->fWarnFuncNotCall);
  492.         dialogControlHelpEx(hd,"txc",7);
  493.         dialogCheckB(hd,"符号のミスマッチ(&S)",&copt->fWarnSignMismatch);
  494.         dialogControlHelpEx(hd,"txc",7);
  495.         dialogCheckB(hd,"小さいサイズへ代入(&L)",&copt->fWarnLoseDigit);
  496.         if (!_pspc) dialogLFV(hd);    //WZ4.00Ea 001127 !_pspc
  497.         dialogControlHelpEx(hd,"txc",7);
  498.         dialogCheckB(hd,"変数自動定義(&D)",&copt->fReportAutoDef);
  499.         dialogControlHelpEx(hd,"txc",7);
  500.         dialogCheckB(hd,"関数呼び出し変換(&F)",&copt->fReportTxapi);
  501.     dialogAddPage(hd0,hd);
  502.     //
  503.     if (dialogOpen(hd0)) {
  504.         txcSaveConfig(copt);
  505. //information(context.szEventMacros);
  506.         txcGetsetEventMacro(context.szEventMacros,TRUE);
  507.         ret = TRUE;
  508.     }
  509.     return ret;
  510. }
  511.  
  512. #endif
  513.  
  514. //##マクロの実行
  515.  
  516. #if WZFUNC_TXC
  517. BOOL txIDM_MACRO_UIEXEC(TX* text)
  518. {
  519.     BOOL ret = FALSE;
  520.     HDIALOG hd = dialog("マクロの実行");
  521.     HSTRBLK sb = historyOpen("macroexec",4096);
  522.     mchar szMacro[CCHWORD] = {0};
  523.     hd->fPpcPopup = TRUE;    //WZ4.00Eb 010101 
  524.     txcGetsetLastexec(szMacro,FALSE);
  525.     dialogControlStrblkHist(hd,sb);
  526.     dialogString(hd,"マクロ名(&M):",12,szMacro,cchof(szMacro),30);
  527.     if (dialogOpen(hd)) {
  528.         txcGetsetLastexec(szMacro,TRUE);
  529.         macroExec(szMacro,text);
  530.         ret = TRUE;
  531.     }
  532.     historyClose("macroexec",sb);
  533.     return ret;
  534. }
  535. #endif
  536.  
  537. //##プラグイン
  538.  
  539. #if __TXC__
  540. void __pluginGetProperty(mchar* prop,txstr res)
  541. {
  542. //information("%s",prop);
  543.     if (!stricmp(prop,"name")) res = "マクロ/TX-C IDM処理";
  544.     if (!stricmp(prop,"author")) res = sysGetName();
  545.     if (!stricmp(prop,"version")) res = sysGetVersionPrim();
  546. }
  547.  
  548. BOOL __pluginRelease(void)
  549. {
  550.     return TRUE;
  551. }
  552.  
  553. static HOOKRESULT CALLBACK wndprocTextHook(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  554. {
  555.     if (message == WM_TXEVENT && wParam == TXEVENT_IDMEXEC) {
  556.         TX* text = hwndtextGetText(hwnd);
  557.         int idm = lParam;
  558.         switch(idm) {
  559.             case IDM_MACRO_UIEXEC: {    // サンプル
  560. statprintf("IDM_MACRO_UIEXEC by macro");
  561.                 txIDM_MACRO_UIEXEC(text);
  562.                 return HOOK_CAPTURE;
  563.             }
  564.             case IDM_TXC_CONFIG: {    // サンプル
  565. statprintf("IDM_TXC_CONFIG by macro");
  566.                 txIDM_TXC_CONFIG(text);
  567.                 return HOOK_CAPTURE;
  568.             }
  569.         }
  570.     }
  571.     return HOOK_CONTINUE;
  572. }
  573.  
  574. void __on_txFrameNew(TX* text)
  575. {
  576.     txSetHookWndproctextTxpcode(text,wndprocTextHook);
  577. }
  578.  
  579. #endif
  580.