home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1999 February / VPR9902A.BIN / APUPDATE / VC / Tx300d / TX300D.LZH / MACRO.C < prev    next >
C/C++ Source or Header  |  1997-06-15  |  22KB  |  848 lines

  1. // WZ EDITOR 標準機能 マクロ
  2. // Copyright 1995-96 TY
  3.  
  4. //{###マクロ}
  5.  
  6. #include <windows.h>
  7. #include <windowsx.h>
  8. #include "dialog.h"
  9. #include "config.h"
  10. #if 1//2.90 
  11.     #include "apidb2.h"
  12. #else
  13.     #include "apidb.h"
  14. #endif
  15.  
  16. BOOL TXAPIBASE callPost(mchar* szmacro)
  17. {
  18. // callと同じ様にszmacroのマクロを呼び出します。
  19. // callと異なる点は、PostMessageを使って呼び出す点です。
  20. // このためszmacroの実行は、callPostを呼び出してすぐでなく、アイドル時に行われます。
  21. // また、マクロ実行の返り値は取れません。
  22. // 実行が出来るかどうかを返します。
  23. //1.01A で追加
  24.     return PostMessage(txGetFrameNow()->hwndbase,WM_TXCALL,0,(LPARAM)szmacro);//2.99C 970324 text1->txGetFrameNow()
  25. }
  26.  
  27. static mchar* GetTestMacro(void)
  28. {
  29.     mchar *sztest = text->share->config.szmacrotest;
  30.     if (!sztest[0]) {
  31.         attention("テストマクロが登録されていません。\n[ツール]-[設定]-[マクロ]-[テストマクロ]で登録してください。");
  32.         return NULL;
  33.     }
  34.     return sztest;
  35. }
  36.  
  37. testOpen
  38. {
  39. // テストマクロを開く
  40. #if 1//2.95 970128 
  41.     mchar *sztest = GetTestMacro();
  42.     if (!sztest) return FALSE;
  43.     mchar szfilename[CCHPATHNAME];
  44.     strcpy(szfilename,sztest);
  45.     mchar* szExt = pathGetExt(szfilename);
  46.     mchar szfuncname[CCHPATHNAME] = {0};
  47.     if (*szExt) {
  48.         sprintf(szfuncname,"/s%s",szExt+1);
  49.         *szExt = 0;
  50.     }
  51.     pathAuto(szfilename,text->share->config.szenvtxpath,".txc;.c");
  52. //information("%s %s",szfilename,szfuncname);
  53.     forksw(szfilename,szfuncname);
  54.     return TRUE;
  55. #else
  56.     mchar *sztest = GetTestMacro();
  57.     if (!sztest) return FALSE;
  58.     txOpenForkFast(text,sztest);
  59.     return TRUE;
  60. #endif
  61. }
  62.  
  63. BOOL TXCMDBASE uiConfigTest(TX* text)
  64. {
  65. // テストマクロの設定
  66.     TXCONFIGSHARE *shcfg = &text->share->config;
  67.     HDIALOG hd = dialog("テストマクロの設定");
  68.     
  69.     dialogGroup(hd,"テストマクロ");
  70.         dialogControlHelp(hd,123);
  71.         dialogCaption(hd,"テストマクロ(&T):");
  72.         dialogStrC(hd,NULL,shcfg->szmacrotest,0,CCHWORD,28);
  73.         dialogControlHelp(hd,124);
  74.         dialogCheckB(hd,"テキストを保存してからテスト",&shcfg->fsave_at_macrotest);
  75.     dialogGroupEnd(hd);
  76.     
  77.     dialogLFV(hd);
  78.     dialogOK(hd,12);
  79.     int id = dialogCmd(hd,"編集(&E)",12);
  80.     dialogCancel(hd,12);
  81.     
  82.     int ret = dialogOpen(hd);
  83.     if (ret) {
  84.         #if 1
  85.         shcfgSavePartArray(szmacrotest);
  86.         shcfgSavePart(fsave_at_macrotest);
  87.         #else
  88.         txConfigOp(text,TXCONFIGOP_SHARESAVE,0);
  89.         #endif
  90.         if (ret == id) testOpen();
  91.         return TRUE;
  92.     }
  93.     return FALSE;
  94. }
  95.  
  96. BOOL TXCMDBASE test(TX* text)
  97. {
  98. // テストマクロを実行
  99.     mchar *sztest = GetTestMacro();
  100.     if (!sztest) return FALSE;
  101.     if (text->share->config.fsave_at_macrotest && text->fEdit) {
  102.         if (!txSave(text)) return FALSE;
  103.     }
  104.     // オートセーブを無効にする。
  105.     // マクロがどんな動作をしても平気な様に
  106.     text->fAutoSave = FALSE;
  107.     // コマンドラインを設定
  108.     mchar buff[CCHPATHNAME*2];
  109.     sprintf(buff,"\"%s\" /F\"%s\" /d /Y%d /i",text->szfilename,sztest,text->ly);
  110. #if 1//2.99D 970330 sw
  111.     if (text->fClip) {
  112.         sprintf(buff + strlen(buff)," /cl%u,%lu,%lu",txSelectGetMode(text),text->clipcur0,txGetAddress(text));
  113.     } else {    // for jump current position
  114.         sprintf(buff + strlen(buff)," /cl0,%lu",txGetAddress(text));
  115.     }
  116. #else
  117.     if (text->fClip) {
  118.         sprintf(buff + strlen(buff)," /S%u,%lu,%lu",txSelectGetMode(text),text->clipcur0,txGetAddress(text));
  119.     } else {    // for jump current position
  120.         sprintf(buff + strlen(buff)," /S0,%lu",txGetAddress(text));
  121.     }
  122. #endif
  123.     // 閉じる
  124.     txClose(text);
  125.     // 起動
  126.     //3.00B2 970615 txOpenFast->txOpen
  127.     // txOpenで同期起動しないと、起動し終わる前にtxQuitが実行されて
  128.     // 変になることがある。
  129.     if (!txOpen(text,buff)) {
  130.         attention("テストマクロを起動できません");
  131.     }
  132.     // 自分自身は終了
  133.     txQuit(text);
  134.     return;
  135. #if 0    //2.95 970128 旧コード
  136. #if 1
  137.     //1.01A WZ32で高速オープンONでテストマクロを実行すると問題があった
  138.     //1.01A テストマクロ実行で、範囲選択状態が失われないようにした
  139.     mchar buff[CCHPATHNAME+CCHPATHNAME];
  140.     sprintf(buff,"\"%s\" /F\"%s\" /d /Y%d /i",text->szfilename,sztest,text->ly);
  141.     if (text->fClip) {
  142.         sprintf(buff + strlen(buff)," /cl%u,%lu,%lu",txSelectGetMode(text),text->clipcur0,txGetAddress(text));
  143.     } else {    // for jump current position
  144.         sprintf(buff + strlen(buff)," /cl0,%lu",txGetAddress(text));
  145.     }
  146. //information(buff);
  147.     // openされてないことにする
  148.     SendMessage(text->hwndbase,WM_TXCLOSE,0,0);//1.99A outlineウィンドウを閉じる
  149.     if (!txClose(text)) return;
  150.     text->szfilename[0] = 0;
  151.     SetWindowText(text->hwndbase,"");
  152.     #if 1//1.92 遅いから元に戻した
  153.     if (!wzExec(buff)) {
  154.         attention("テストマクロを起動できません");
  155.     }
  156.     #else
  157.     // txOpenFastでテストマクロ実行窓が開くまで待つようにした
  158.     if (!txOpenFast(text,buff)) {
  159.         attention("テストマクロを起動できません");
  160.     }
  161.     #endif
  162.     // 自分自身は終了
  163.     txQuit(text);
  164.     return;
  165. #else
  166.     mchar szfilename[CCHPATHNAME];
  167.     strcpy(szfilename,text->szfilename);
  168.     // openされてないことにする
  169.     if (!txClose(text)) return;
  170.     text->szfilename[0] = 0;
  171.     SetWindowText(text->hwndbase,"");
  172.     //
  173.     mchar buff[CCHPATHNAME+CCHPATHNAME];
  174.     sprintf(buff,"\"%s\" --F\"%s\"",szfilename,sztest);
  175.     //1.00H2 
  176.     if (!wzExec(buff)) {
  177.         attention("テストマクロを起動できません");
  178.         return;
  179.     }
  180.     // 自分自身は終了
  181.     txQuit(text);
  182.     return;
  183. #endif
  184. #endif
  185. }
  186.  
  187. testInternal
  188. {
  189. // テキストの再読み込みをしないでテストマクロを実行します。
  190. // 2回目にこれを実行すると、テストマクロを更新していても以前に実行したテストマクロが実行されます。
  191. // これを回避するには、[マクロ]-[再読み込み]を実行してから、このコマンドを実行してください。
  192. //1.91A で追加
  193.     mchar *sztest = GetTestMacro();
  194.     if (!sztest) return FALSE;
  195.     if (text->share->config.fsave_at_macrotest && text->fEdit) {
  196.         if (!txSave(text)) return FALSE;
  197.     }
  198.     // オートセーブを無効にする。
  199.     // マクロがどんな動作をしても平気な様に
  200.     text->fAutoSave = FALSE;
  201.     //
  202.     call(sztest);
  203. }
  204.  
  205. int keymacroQ(mchar *szkey)
  206. {
  207.     HDIALOG hd = dialog("キー操作の記録");
  208.     dialogCaption(hd,szkey + " に登録します。よろしいですか?");
  209.     dialogSetH(hd);
  210.     int idreg = dialogCmd(hd,"登録",15);
  211.     int idcont = dialogCmd(hd,"継続",15);
  212.     int idbreak = dialogCmd(hd,"中止",15);
  213.     int ret;
  214.     if (ret = dialogOpen(hd)) {
  215.         if (ret == idreg) return IDYES;
  216.         if (ret == idbreak) return IDNO;
  217.     }
  218.     return IDCANCEL;
  219. }
  220.  
  221. BOOL TXCMDBASE textRegApidb(TX* text)
  222. {
  223. // テキストをAPIDBに登録
  224.     mchar szfilename[CCHPATHNAME];
  225.     mchar szsrcname[CCHPATHNAME];
  226.     if (text->szfilename[0] == 0) {
  227.         attention("新規ファイルは登録できません");
  228.         return;
  229.     }
  230.     statprintf("APIDBに登録中...");
  231.     strcpy(szsrcname,text->szfilename);
  232.     pathSetExt(szsrcname,NULL);
  233.     macroGetFullFileName(szsrcname,szfilename);
  234.     #if 1//2.90 
  235.     apidb2TakeinFile(szfilename);
  236.     apidb2FlushCache();
  237.     #else
  238.     apidbOpen();
  239.     apidbFlushFile(szfilename);
  240.     apidbClose();
  241.     #endif
  242.     statprintf("APIDBに登録完了");
  243. }
  244.  
  245. BOOL TXCMDBASE uiExec(TX* text)
  246. {
  247. //マクロコマンドを入力/実行
  248. //"test"のようにマクロファイル名を指定するとtestのmain関数を、
  249. //"test.func"の用にファイル名と関数名を指定するとその関数を実行します
  250. //1.00Cで追加
  251.     HDIALOG hd = dialog("実行マクロ");
  252.     txstr szstr;
  253.     dialogStr(hd,"マクロ:",szstr,5,20);
  254.     dialogIndent(hd,6);
  255.     dialogCaption(hd,"実行するマクロを指定してください");
  256.     dialogCaption(hd,"<例>\"test\":testマクロのmain関数を実行");
  257.     dialogCaption(hd,"<例>\"test.func\":testマクロのfunc関数を実行");
  258.     if (dialogOpen(hd)) call(szstr);
  259.     return TRUE;
  260. }
  261.  
  262. //{###表示}
  263.  
  264. typedef unsigned char  Uchar;
  265. typedef unsigned short Ushort;
  266.  
  267. WORD TXAPI sjis2jis(BYTE iCode1,BYTE iCode2)
  268. {
  269. // SJISコードからJISコードに変換
  270. //1.00DでAPIに追加
  271.     Uchar iByte1;                         /*JISコード1バイト目   */
  272.     Uchar iByte2;                         /*JISコード2バイト目   */
  273.     Ushort irtn;                          /*リターンコード       */
  274.     if ( iCode2 < 0x9f ) {
  275.         if ( iCode1 < 0xe0 ) {
  276.             iByte1 = ( iCode1 - 0x71 ) * 2 + 1;
  277.         }
  278.         else {
  279.             iByte1 = ( iCode1 - 0xb1 ) * 2 + 1;
  280.         }
  281.         iByte2 = iCode2 - 0x1f;
  282.         if ( iCode2 >= 0x80 ) {
  283.             iByte2 -= 0x01;
  284.         }
  285.     }
  286.     else {
  287.         if ( iCode1 < 0xe0 ) {
  288.             iByte1 = ( iCode1 - 0x70 ) * 2;
  289.         }
  290.         else {
  291.             iByte1 = ( iCode1 - 0xb0 ) * 2;
  292.         }
  293.         iByte2 = iCode2 - 0x7e;
  294.     }
  295.     irtn = (Ushort )(( iByte1 << 8 ) | iByte2 );
  296.     return irtn;
  297. }
  298.  
  299. WORD TXAPI jis2kuten(WORD iCode)
  300. {
  301. // JISコードから区点コードに変換
  302. //1.00DでAPIに追加
  303.     Ushort irtn;
  304.     Uchar iByte1 ,iByte2;
  305.     Uchar szHenkan[5];
  306.  
  307.     iCode = iCode - 0x2020;
  308.     iByte1 = ( iCode >> 8 ) & 0xff;
  309.     iByte2 = iCode & 0xff;
  310.     sprintf(szHenkan ,"%02d",iByte1 );
  311.     sprintf(&szHenkan[2] ,"%02d",iByte2 );
  312.     irtn = atoi( szHenkan );
  313.     return irtn;
  314. }
  315.  
  316. uiDispCharCode
  317. {
  318.     // 文字コード表示
  319.     // カーソル位置の文字コードのShift-JISおよびJISコードを調べる
  320.     // thanks Toru Nagashimaさん
  321.     //{#VZ} ^KJ
  322.     Uchar iCode1;                         /*漢字コード上1バイトの値  */
  323.     Uchar iCode2;                         /*漢字コード下1バイトの値  */
  324.     Ushort iCode3;                        /*JISコード変換後の値   */
  325.     Ushort iCode4;                        /*区点コード変換後の値    */
  326.     TXCHAR szCode;                        /*文字コード入力バッファ   */
  327.     szCode = getchar;                     /*文字コード取得       */
  328.  
  329.     if( txchIsKanji( szCode ) ) {
  330.         /*漢字の場合の処理*/
  331.         iCode1 = ( szCode >> 8 ) & 0xff;
  332.         iCode2 = szCode  & 0xff;
  333.         iCode3 = sjis2jis( iCode1 ,iCode2 );
  334.         iCode4 = jis2kuten( iCode3 );
  335.         information("文字  [%c]\n SJIS   [%X]\n  JIS   [%X]\n 区点  [%04d]",szCode ,szCode ,iCode3 ,iCode4 );
  336.     } else if ( szCode >= 0 && szCode <= 0x1f || szCode == 0x7f ) {
  337.         /*制御文字の場合の処理*/
  338.         information("文字  [ ]\n ASCII [%02X]\n",szCode ,szCode );
  339.     } else if ( szCode == 0x0d0a ) {
  340.         /*制御文字(復改)の場合の処理*/
  341.         information("文字  [  ]\n ASCII [%04X]\n",szCode ,szCode );
  342.     } else {
  343.         /*表示可能文字の場合の処理*/
  344.         information("文字  [%c]\n ASCII [%02X]\n",szCode ,szCode );
  345.     }
  346. }
  347.  
  348. //{###マクロ}
  349.  
  350. //1.90 usermenuから移動
  351. macrohelp
  352. {
  353.     txOpenForkExFast(text,text->szexedir + "std\\txc.txt -v");
  354. }
  355.  
  356. BOOL TXCMDBASE textCompile(TX* text)
  357. {
  358. // テキストをコンパイル
  359.     PostMessage(text->hwndbase,WM_COMMAND,IDM_TXMACROCOMPILETEXT,0);
  360.     return TRUE;
  361. }
  362.  
  363. BOOL TXCMDBASE textCompile16(TX* text)
  364. {
  365. // テキストをTX-C16でコンパイル
  366.     PostMessage(text->hwndbase,WM_COMMAND,IDM_TXMACROCOMPILETEXT,16);
  367.     return TRUE;
  368. }
  369.  
  370. BOOL TXCMDBASE textCompile32(TX* text)
  371. {
  372. // テキストをTX-C32でコンパイル
  373. #if 1
  374.     PostMessage(text->hwndbase,WM_COMMAND,IDM_TXMACROCOMPILETEXT,32);
  375.     return TRUE;
  376. #else
  377.     #ifdef __FLAT__
  378.     PostMessage(text->hwndbase,WM_COMMAND,IDM_TXMACROCOMPILETEXT,32);
  379.     return TRUE;
  380.     #else
  381.     information("WZ16ではTX-PCODE32のコンパイルはできません");
  382.     return FALSE;
  383.     #endif
  384. #endif
  385. }
  386.  
  387. BOOL TXCMDBASE textDump(TX* text)
  388. {
  389. // テキストのTX-PCODEをstdoutへダンプ出力
  390.     PostMessage(text->hwndbase,WM_COMMAND,IDM_TXMACRODUMPTEXT,0);
  391.     return TRUE;
  392. }
  393.  
  394. BOOL TXCMDBASE textExec(TX* text)
  395. {
  396. // テキストのmainマクロを実行
  397.     PostMessage(text->hwndbase,WM_COMMAND,IDM_TXMACROFORKTEXT,0);
  398.     return TRUE;
  399. }
  400.  
  401. //##ツールの追加
  402.  
  403. #define IDD_EXPLAIN        1001
  404. #define IDD_COMMANDS    1002
  405. #define IDD_FILENAME    1003
  406. #define IDD_REFER        1004
  407.  
  408. typedef struct {
  409.     mchar szfilename[CCHPATHNAME];
  410.     mchar szfiles[CCHPATHNAME];
  411.     mchar szsrcfiles[CCHPATHNAME];
  412.     tx* text;
  413.     HWND hwnd;
  414.     int fNoEdit;    // 再入防止
  415. } INSTALLCONTEXT;
  416.  
  417. static void install_explainFromText(INSTALLCONTEXT* context)
  418. {
  419.     HWND hctrl = GetDlgItem(context->hwnd,IDD_EXPLAIN);
  420.     ListBox_ResetContent(hctrl);
  421.     tx* text = context->text;
  422.     //3.00A4 970509 //{$FILE},//{$SOURCE}指定は、モジュールの説明部分で行う必要があります。そうしないと指定しても無視されます。
  423.     txstr szfiles;        // {$FILE}指定があったときは、その指定が入る
  424.     txstr szsrcfiles;    // {$SOURCE}指定があったときは、その指定が入る
  425.     //
  426.     txstr szline;
  427.     mchar buff[CCHLINE];
  428.     int i = 0;
  429.     txJumpFileTop(text);
  430.     for (;;i++) {
  431.         txGetLine(text,szline);
  432.         mchar *p = szline;
  433.         p = strGetWordTop(p);
  434.         if (*p == '/' && p[1] == '/') {
  435.             if (p[2] == '/' || (p[2] == '{' && p[3] != '$')) {
  436.                 // "///","//{"は除く
  437.                 //2.95 970131 "//{$"は除いてはいけなかった
  438.             } else {
  439.                 int len;
  440.                 p += 2;
  441.                 p = strGetWordTop(p);
  442.                 if (i == 0) {
  443.                     sprintf(buff,"%s(%s)",p,pathGetFileName(context->szfilename));
  444.                     ListBox_AddString(hctrl,buff);
  445.                 } else if (len = strimatch(p,"{$FILE}")) {
  446.                     szfiles = p + len;
  447.                 } else if (len = strimatch(p,"{$SOURCE}")) {
  448.                     szsrcfiles = p + len;
  449.                 } else {
  450.                     sprintf(buff,"  %s",p);
  451.                     ListBox_AddString(hctrl,buff);
  452.                 }
  453.             }
  454.         } else {
  455.             break;
  456.         }
  457.         if (!txNextPara(text)) break;
  458.     }
  459.     strcpymax(context->szfiles,szfiles,CCHPATHNAME);
  460.     strcpymax(context->szsrcfiles,szsrcfiles,CCHPATHNAME);
  461.     ListBox_SetCurSel(hctrl,0);
  462. }
  463.  
  464. static void install_cmdsFromText(INSTALLCONTEXT* context,BOOL fSave)
  465. {
  466.     tx* text = context->text;
  467.     HWND hctrl = NULL;
  468.     TXMENU txmenu;
  469.     if (fSave) {
  470.         memset(&txmenu,0,sizeof(txmenu));
  471.         strcpy(txmenu.szname,"追加機能");
  472.         txmenuOp(TXMENUOP_LOADEX,(LPVOID)&txmenu,NULL);
  473.     } else {
  474.         hctrl = GetDlgItem(context->hwnd,IDD_COMMANDS);
  475.         ListBox_ResetContent(hctrl);
  476.     }
  477.     //
  478.     txstr szline;
  479.     txstr szline2;
  480.     mchar buff[CCHLINE];
  481.     int i = 0;
  482.     txJumpFileTop(text);
  483.     for (;;i++) {
  484.         txGetLine(text,szline);
  485.         int len;
  486.         if (len = strmatch(szline,"_txcmd")) {
  487.             BOOL fMenu = FALSE;
  488.             mchar* szcmd = &szline[len];
  489.             mchar* szcaption = "";
  490.             //
  491.             while(*szcmd == ' '|| *szcmd == '\t') szcmd++;
  492.             {
  493.                 mchar*p = strchr(szcmd,'(');
  494.                 if (p) *p = 0;
  495.             }
  496.             if (!txNextPara(text)) break;
  497.             //
  498.             {
  499.                 while(1) {
  500.                     txGetLine(text,szline2);
  501.                     if (strstr(szline2,"{$")) {
  502.                         if (strstr(szline2,"{$WZMENU}")) fMenu = TRUE;
  503.                     } else {
  504.                         break;
  505.                     }
  506.                     if (!txNextPara(text)) break;
  507.                 }
  508.                 mchar*p = szline2;
  509.                 while(*p == ' '||*p == '\t') p++;
  510.                 if (*p == '/' && p[1] == '/' && p[2] != '/') {
  511.                     p += 2;
  512.                     while(*p == ' '||*p == '\t') p++;
  513.                     szcaption = p;
  514.                 }
  515.             }
  516.             if (fSave) {
  517. ///dialogaText(text,"config");
  518.                 if (fMenu) {
  519.                     BOOL fFound = FALSE;
  520.                     // 重複チェック
  521.                     int i;
  522.                     for (i = 0;i < txmenu.nmenuitem;i++) {
  523.                         if (!stricmp(txmenu.tmenuitem[i].szcmd,szcmd)) {
  524.                             fFound = TRUE;
  525.                             break;
  526.                         }
  527.                     }
  528.                     if (!fFound) {
  529.                         if (txmenu.nmenuitem < TXMENUITEM_N) {
  530.                             TXMENUITEM* item = &txmenu.tmenuitem[txmenu.nmenuitem++];
  531.                             strcpymax(item->szcmd,szcmd,CCHWORD);
  532.                             strcpymax(item->szcaption,szcaption,CCHWORD);
  533.                         }
  534.                     }
  535.                 }
  536.             } else {
  537.                 sprintf(buff," %s\t%s",szcmd,szcaption);
  538.                 ListBox_AddString(hctrl,buff);
  539.             }
  540.         }
  541.         if (!txNextPara(text)) break;
  542.     }
  543.     if (fSave) {
  544. #if 0
  545. {
  546.     int i;
  547.     for (i = 0;i < txmenu.nmenuitem;i++) {
  548.         information("%s",txmenu.tmenuitem[i].szcmd);
  549.     }
  550. }
  551. #endif
  552. //information("%d",txmenu.nmenuitem);
  553. //information("%s",txmenu.szname);
  554.         txmenuOp(TXMENUOP_SAVEEX,(LPVOID)&txmenu,NULL);
  555.     } else {
  556.         ListBox_SetCurSel(hctrl,0);
  557.     }
  558. }
  559.  
  560. static BOOL install_fileChanged(INSTALLCONTEXT* context)
  561. {
  562.     HWND hwnd = context->hwnd;
  563.     TX* text = context->text;
  564.     //
  565.     mchar _szfilename[CCHPATHNAME];
  566.     GetDlgItemText(hwnd,IDD_FILENAME,_szfilename,CCHPATHNAME);
  567.     static mchar *szexts = ".txm;.txe;.tll;.c;.txc";
  568.     // 検索
  569.     strcpy(context->szfilename,_szfilename);
  570.     pathAuto(context->szfilename,wzGetEnv(WZENV_TXPATH),szexts);
  571.     // 整え
  572.     pathSetExt(context->szfilename,NULL);
  573.     strlwr(context->szfilename);
  574.     // マクロかチェック
  575.     int txp = macroGetKind(context->szfilename);
  576.     if (txp == TXP_ERROR) {
  577.         return FALSE;
  578.     } else {
  579.         //1.99B 検索結果が反映されてなかった
  580.         context->fNoEdit++;
  581.         SetDlgItemText(hwnd,IDD_FILENAME,context->szfilename);
  582.         context->fNoEdit--;
  583.         //
  584.         txDeleteText(text);
  585.         //
  586.         DWORD size;
  587.         LPVOID pmem;
  588.         {
  589.             mchar szheaderfilename[CCHPATHNAME];
  590.             macroGetFullFileName(context->szfilename,szheaderfilename);
  591.             pmem = macroGetExport(szheaderfilename,&size);
  592.         }
  593.         if (pmem) {
  594.             if (memClipCopy(pmem,size,HCLIP_WIN,CLIP_CHAR)) {
  595.                 txPaste(text);
  596.                 // カテゴリを削除
  597.                 txJumpFileTop(text);
  598.                 while(1) {
  599.                     if (!txSearchEx(text,"//{###",SEARCH_CUR)) break;
  600.                     if (!txDeletePara(text)) break;
  601.                 }
  602.                 // カテゴリを指定
  603.                 txJumpFileTop(text);
  604.                 txstr szline;
  605.                 while(1) {
  606.                     txGetLine(text,szline);
  607.                     if (!strstr(szline,"//")) {
  608.                         // 前後に1行空ける
  609.                         txInsert(text,"\n\n//{###追加機能}\n\n");
  610.                         break;
  611.                     }
  612.                     if (!txNextPara(text)) break;
  613.                 }
  614.             }
  615.             memFree(pmem);
  616.         }
  617.         return TRUE;
  618.     }
  619. }
  620.  
  621. BOOL dlgprocInstall(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  622. {
  623.     static BOOL fEdited = FALSE;
  624.     HDIALOG hd = dialogFromHwnd(hwnd);
  625.     INSTALLCONTEXT* context = (LPVOID)dialogGetCustdata(hd);
  626.     switch(message) {
  627.         case WM_INITDIALOG: {
  628.             context->hwnd = hwnd;
  629.             install_explainFromText(context);
  630.             install_cmdsFromText(context,FALSE);
  631.             //
  632.             HWND hctrl = GetDlgItem(hwnd,IDD_COMMANDS);
  633.             int tab = DTCX * 30;
  634.             SendMessage(hctrl,LB_SETTABSTOPS,1,(LPARAM)&tab);
  635.             //
  636.             PostMessage(hwnd,WM_COMMAND,IDD_REFER,0);
  637.             break;
  638.         }
  639.         case WM_COMMAND: {
  640.             int id = WM_COMMAND_GetId(wParam);
  641.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  642.             
  643.             switch(id) {
  644.                 case IDD_FILENAME: {
  645.                     if (!context->fNoEdit) fEdited = TRUE;
  646.                     break;
  647.                 }
  648.                 case IDD_REFER: {
  649.                     mchar szfilename[CCHPATHNAME];
  650.                     GetDlgItemText(hwnd,IDD_FILENAME,szfilename,CCHPATHNAME);
  651.                     pathSetFileName(szfilename,\"*.c;*.txm;*.txe;*.tll");
  652. //pathSetFileName(szfilename,\"filer.txe");
  653. //pathSetFileName(szfilename,\"a:\editym.tll");
  654.                     if (txofnReferFileName(text,szfilename,"インストールするマクロファイル")) {
  655.                         SetDlgItemText(hwnd,IDD_FILENAME,szfilename);
  656.                     }
  657.                     return TRUE;
  658.                 }
  659.             }
  660.             break;
  661.         }
  662.         case WM_TXDIALOGENTERIDLE: {
  663.             if (fEdited) {
  664.                 fEdited = FALSE;
  665.                 //
  666.                 {
  667.                     BOOL fOK;
  668.                     if (fOK = install_fileChanged(context)) {
  669.                         install_explainFromText(context);
  670.                         install_cmdsFromText(context,FALSE);
  671.                     } else {
  672.                         ListBox_ResetContent(GetDlgItem(hwnd,IDD_EXPLAIN));
  673.                         ListBox_ResetContent(GetDlgItem(hwnd,IDD_COMMANDS));
  674.                     }
  675.                     EnableWindow(GetDlgItem(hwnd,IDOK),fOK);
  676.                 }
  677.             }
  678.             break;
  679.         }
  680.     }
  681.     return FALSE;
  682. }
  683.  
  684. BOOL TXCMDBASE uiInstall(TX* text)
  685. {
  686. // マクロのインストール
  687.     BOOL fInstallSource = FALSE;    // ソースもインストールする?
  688.     
  689.     INSTALLCONTEXT context;
  690.     memset(&context,0,sizeof(context));
  691.     TX _text;
  692.     TX* text = &_text;
  693.     txInitText(text);
  694.     txOpenText(text);
  695.     context.text = text;
  696.     
  697.     HDIALOG hd = dialog("マクロのインストール");
  698.     dialogSetHookEx(hd,"\m.dlgprocInstall");
  699.     dialogSetCustdata(hd,(DWORD)&context);
  700.     dialogSetGroupRight(hd,DTCX * 80);
  701.     
  702.     dialogGroup(hd,"インストールするマクロ");
  703.         dialogSetH(hd);
  704.         //
  705.         dialogControlID(hd,IDD_FILENAME);
  706.         dialogStrC(hd,"マクロファイル(&F):",context.szfilename,14,CCHPATHNAME,30);
  707.         //
  708.         dialogControlID(hd,IDD_REFER);
  709.         dialogCmd(hd,"参照(&R)...",12);
  710.         //
  711.         dialogLF(hd);
  712.         dialogSetV(hd);
  713.         dialogCheck(hd,"ソースプログラムもインストール(&S)",&fInstallSource);
  714.     dialogGroupEnd(hd);
  715.     
  716.     dialogSpaceV(hd);
  717.     dialogSpaceV(hd);
  718.     dialogControlID(hd,IDD_EXPLAIN);
  719.     dialogList(hd,"概要(&E):",NULL,79,6);
  720.     
  721.     dialogSpaceV(hd);
  722.     dialogSpaceV(hd);
  723.     dialogControlID(hd,IDD_COMMANDS);
  724.     dialogList(hd,"コマンド一覧(&C):",NULL,79,6);
  725.     
  726.     dialogCmdLFV(hd);
  727.     dialogOK(hd,10);
  728.     dialogCancel(hd,10);
  729.     
  730.     if (dialogOpen(hd)) {
  731.         txstr szsrcpath = context.szfilename;
  732.         pathSetFileName(szsrcpath,0);
  733.         txstr szcmd(500);
  734.         sprintf(szcmd,"mcopy \"%smacro\" -p\"%s\" ",text->szexedir,szsrcpath);
  735.         // バイナリ/ソースファイル
  736.         {
  737.             mchar szfull[CCHPATHNAME];
  738.             macroGetFullFileName(context.szfilename,szfull);
  739.             szcmd += "\"";
  740.             szcmd += pathGetFileName(szfull);
  741.             szcmd += "\" ";
  742.             // ソースファイル
  743.             if (fInstallSource) {
  744.                 if (context.szsrcfiles[0]) {
  745.                     // ソースファイルの指定あり
  746.                     szcmd += context.szsrcfiles;
  747.                 } else {
  748.                     mchar *tszext[] = {".c",".txc",".h",".txh",NULL};
  749.                     int i;
  750.                     mchar *szext;
  751.                     for (i = 0;szext = tszext[i];i++) {
  752.                         pathSetExt(szfull,szext);
  753.                         if (fileIsExist(szfull)) {
  754.                             szcmd += "\"";
  755.                             szcmd += pathGetFileName(szfull);
  756.                             szcmd += "\" ";
  757.                         }
  758.                     }
  759.                 }
  760.             }
  761.         }
  762. //information(context.szfiles);
  763.         szcmd += context.szfiles;
  764. //information("[%s]",szcmd);
  765.         cmd(szcmd);
  766.         //
  767.         #if 1//2.90 
  768. //dialogaText(text,"aaa");
  769.         apidb2TakeinText(text);
  770.         apidb2FlushCache();
  771.         #else
  772.         apidbOpen();
  773.         apidbFlushText(text);
  774.         apidbClose();
  775.         #endif
  776.         //
  777.         install_cmdsFromText(&context,TRUE);
  778.         SendMessage(text->hwndbase,WM_TXFLUSHMENU,0,0);
  779.         //1.99A インストール時のイベントマクロ呼び出し実装
  780.         {
  781.             txstr szauto = pathGetFileName(context.szfilename);
  782.             pathSetExt(szauto,".at_installed");
  783.             PMACROFUNC pfunc;
  784.             if (macroGetFuncAddress(szauto,&pfunc)) {
  785.                 DWORD ret;
  786.                 macroCallAddress(&pfunc,&ret,2,text,0);
  787.             }
  788.         }
  789.     }
  790.     txClose(text);
  791.     
  792.     return TRUE;
  793. }
  794.  
  795. //{###フィルタ・イベント}
  796.  
  797. //2.00E txuiReopenだけでは、txSwitchViewModeしてからオープンしたテキストを通常モードに変更できなかった
  798. ClearViewMode
  799. {
  800.     BOOL fViewMode = text->share->fViewMode;
  801.     text->share->fViewMode = FALSE;
  802.     txuiReopen(text);
  803.     text->share->fViewMode = fViewMode;
  804. }
  805.  
  806. void TXCMD at_viewmode(TX* text)
  807. {
  808. // view mode 定義マクロ
  809. // [設定]-[マクロ]-[イベントマクロ]-[ビュー]にこのコマンドが登録されています。
  810.     text->fNoFlushKey = TRUE;//2.00E4 
  811.     // キー割り当て
  812.     #key
  813.     txQuit                Q    {Enter} {Esc}                // 終了
  814.     .ClearViewMode        +{Enter}                        // 編集モード切り替え
  815.     txNextPage            C    {SPACE}                        // ページダウン
  816.     txPrevPage            R    +{SPACE} {Backspace}        // ページアップ
  817.     #end
  818. #if 0
  819.     //ツールバーやメニューを変更する場合は次の様にtxFlushUIしてください
  820.     //ただしこれをすると文書の設定ダイアログでOKすると、変更内容が登録されます。
  821.     text->fDispToolbar = TRUE;
  822.     strcpy(text->szToolbar,"HTMLファイル編集");
  823.     txFlushUI(text);
  824. #endif
  825. }
  826.  
  827. //
  828. DWORD op(TX* text,int op,LPARAM arg1,LPARAM arg2)
  829. {
  830.     DWORD ret;
  831.     switch(op) {
  832.         case MACROOP_OPENMAIL: {
  833.             macroCall("event.openMail",&ret,2,text,arg1);
  834.             return ret;
  835.         }
  836.         case MACROOP_OPENURL: {
  837.             macroCall("event.openURL",&ret,2,text,arg1);
  838.             return ret;
  839.         }
  840.         case MACROOP_TXSEARCHLISTEX: {
  841.             extern "search" int TXAPI txSearchlistEx(TX* _text,mchar* szFind,TXSEARCHLISTARG* arg);
  842.             return txSearchlistEx(text,(LPVOID)arg1,(TXSEARCHLISTARG*)arg2);
  843.         }
  844. //3.00A2 970505 MACROOP_REPLACEREPORT
  845.     }
  846. }
  847.  
  848.