home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1999 March / VPR9903A.BIN / APUPDATE / VC / Tx300d / TX300D.LZH / FILE.C < prev    next >
Text File  |  1997-10-13  |  48KB  |  1,873 lines

  1. // WZ EDITOR 標準機能 ファイル
  2. // Copyright 1995-96 TY
  3.  
  4. #include <windows.h>
  5. #include <windowsx.h>
  6. #include "dialog.h"
  7. #include "_filer.h"
  8. #include "adrbook.h"    //2.99 970315 
  9.  
  10. //3.00A 970429 メッセージの全角カナ->半角カナ化
  11.  
  12. //{###ダイアログ}
  13.  
  14. DWORD TXAPI txofnGetSaveFileName(tx *text,mchar *szfilename,mchar *szCaption)
  15. {
  16. // 保存ファイル名指定コモンダイアログ
  17. // szfilenameの内容がデフォルトで表示されます。
  18. // szfilenameに指定されたファイル名が返されます。
  19. // szfilename[0] = 0としておくと、デフォルトのマスクが表示されます。
  20. // <例>
  21. //    {
  22. //        mchar szfilename[CCHPATHNAME];
  23. //        szfilename[0] = 0;
  24. //        if (txofnGetSaveFileName(text,szfilename,"保存先")) {
  25. //            information(szfilename);
  26. //        }
  27. //    }
  28.     return txofnGetSaveFileNameEx(text,szfilename,szCaption,0);
  29. }
  30.  
  31. DWORD TXAPIBASE txofnGetOpenFileName(tx *text,mchar *szfilename,mchar *szCaption)
  32. {
  33. // オープンファイル名指定コモンダイアログ
  34. // txofnGetSaveFileNameと同じ様に使います
  35.     return txofnGetOpenFileNameEx(text,szfilename,szCaption,0);
  36. }
  37.  
  38. DWORD TXAPIBASE txofnReferFileName(tx *text,mchar *szfilename,mchar *szCaption)
  39. {
  40. // コモンダイアログを使ったファイル名参照
  41. // txofnGetOpenFileNameと同じ様に使います
  42.     if (szCaption == NULL || *szCaption == 0) szCaption = "ファイルの参照";
  43.     return txofnGetOpenFileNameEx(text,szfilename,szCaption,TXOFN_NOREADONLY|TXOFN_REFER);
  44. }
  45.  
  46. //{###VZ互換ファイルコマンド}
  47. //VZ Editorのファイルコマンドと互換性の高いコマンドを提供します。
  48.  
  49. #define VZOFN_REFER            0x01
  50. #define VZOFN_READONLY        0x02
  51. #define VZOFN_ENABLE_MULTI    0x04    //3.00A 970429 複数指定有効?
  52.  
  53. struct {
  54.     int ctrlFileName;
  55.     int mode;
  56.     HWND hwndFileName;
  57.     HWND hdlg;
  58.     HDIALOG hd;
  59. } ovf;
  60.  
  61. BOOL dlgprocOpenVz(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  62. {
  63.     switch(message) {
  64.         case WM_INITDIALOG: {
  65.             ovf.hdlg = hwnd;
  66.             ovf.hwndFileName = GetDlgItem(hwnd,ovf.ctrlFileName);
  67.             break;
  68.         }
  69.         case WM_COMMAND: {
  70.             int id = LOWORD(wParam);
  71.             switch(id) {
  72.                 case IDOK: {
  73.                     mchar szfile[CCHPATHNAME];
  74.                     GetWindowText(ovf.hwndFileName,szfile,cchof(szfile));
  75.                     if (pathIsFileName(szfile)) {
  76.                         //3.00A 970429 file.vzuiInsertFileでファイル名に空白を含むファイルを挿入できなかった
  77.                         mchar sz[CCHPATHNAME+2];
  78.                         strcpy(sz,szfile);
  79.                         pathSetFull(sz);
  80.                         pathSetLong(sz);
  81.                         SetWindowText(ovf.hwndFileName,sz);
  82.                     } else {
  83.                         mchar buff[CCHPATHNAME];
  84.                         if (szfile[0] == 0) {//3.00B1 970522 file.vzuiOpenで空打ちしてファイラーを起動したときファイラーのパスをカレントディレクトリに設定するようにした
  85.                             driveGetCurDir(0,szfile);
  86.                             pathSetDir(szfile);
  87.                         }
  88.                         //1.00B vzのファイルオープンダイアログでファイラーを起動したとき、ダイアログを消す様にした
  89.                         //1.00C vzのファイルオープンダイアログでファイラーを起動し、ファイル選択後、ファイラーを終わるようにした
  90.                         if (ovf.mode & VZOFN_REFER) {//3.00A 970429 == -> &
  91. #if 1//2.99F 970403 
  92.                             //1.01 ""でくくる
  93.                             //2.00E "-p" -> "-f"
  94.                             sprintf(buff,"-O%u filer.txe -f\"%s\" -c",text->hwndbase,szfile);
  95.                             wzExec(buff);//1.00H2 
  96. #else
  97.                             //1.01 ""でくくる
  98.                             //2.00E "-p" -> "-f"
  99.                             sprintf(buff,"-O%u filer.txe -f\"%s\" -c",text->hwndbase,szfile);
  100.                             wzExec(buff);//1.00H2 
  101. #endif
  102.                         } else if (ovf.mode & VZOFN_READONLY) {//3.00A 970429 == -> &
  103. #if 1//2.99F 970403 
  104.                             //1.01 ""でくくる
  105.                             //2.00E "-p" -> "-f"
  106.                             sprintf(buff,"filer.txe -f\"%s\" -c -r",szfile);
  107.                             wzExec(buff);//1.00H2 
  108.                             // EndDialogは後
  109.                             EndDialog(hwnd,0);
  110. #else
  111.                             EndDialog(hwnd,0);
  112.                             //1.01 ""でくくる
  113.                             //2.00E "-p" -> "-f"
  114.                             sprintf(buff,"filer.txe -f\"%s\" -c -r",szfile);
  115.                             wzExec(buff);//1.00H2 
  116. #endif
  117.                         } else {
  118. #if 1//2.99F 970403 
  119.                             //1.01 ""でくくる
  120.                             //2.00E "-p" -> "-f"
  121.                             sprintf(buff,"filer.txe -f\"%s\" -c",szfile);//1.00C vzのファイルオープンダイアログでパス指定してファイラーを起動したときのバグ修正
  122.                             wzExec(buff);//1.00H2 
  123.                             // EndDialogは後
  124.                             EndDialog(hwnd,0);
  125. #else
  126.                             EndDialog(hwnd,0);
  127.                             //1.01 ""でくくる
  128.                             //2.00E "-p" -> "-f"
  129.                             sprintf(buff,"filer.txe -f\"%s\" -c",szfile);//1.00C vzのファイルオープンダイアログでパス指定してファイラーを起動したときのバグ修正
  130.                             wzExec(buff);//1.00H2 
  131. #endif
  132.                         }
  133.                         return TRUE;
  134.                     }
  135.                     break;
  136.                 }
  137.             }
  138.             break;
  139.         }
  140.     }
  141.     return FALSE;
  142. }
  143.  
  144. void ovfs(mchar *szfilename)
  145. {
  146.     SetWindowText(ovf.hwndFileName,szfilename);
  147.     SendMessage(ovf.hdlg,WM_TXDIALOGREAD,0,0);
  148.     EndDialog(ovf.hdlg,TRUE);
  149. }
  150.  
  151. static BOOL _vzgetopenfilename(mchar *szfilename,mchar *szcaption,int mode)
  152. {
  153. //1.01 ロングファイル名対応。複数指定も可。""で括られる。
  154. //3.00A 970429 ""で括られないことがあった
  155. //3.00A 970429 modeにVZOFN_ENABLE_MULTIを指定したときだけ、複数指定ができるようにした
  156. // modeが0またはVZOFN_READONLYの場合、ファイラーを起動してオープンができる。複数オープンもできる。
  157. // この場合は返り値としてFALSEを返し、ファイラーから直接ファイルをオープンする。
  158.     while(1) {
  159.         HDIALOG hd;
  160.         txstr szfile = szfilename;
  161.         txstr szcur;
  162.         if (szcaption) {
  163.             hd = dialog(szcaption);
  164.         } else {
  165.             hd = dialog("ファイル名");
  166.         }
  167.         dialogControlHistRead(hd,HIST_FILE);
  168.         ovf.ctrlFileName = dialogStr(hd,"ファイル名(&F):",szfile,10,40);
  169.         ovf.mode = mode;
  170.         driveGetCurDir(0,szcur);
  171.         dialogIndent(hd,4);
  172.         dialogCaption(hd,"カレント " + szcur);
  173.         dialogIndent(hd,12);
  174.         {
  175.             PMACROFUNC pfunc;
  176.             if (macroGetFuncAddress("dlgprocOpenVz",&pfunc)) {
  177.                 dialogSetHook(hd,&pfunc);
  178.             }
  179.         }
  180.         if (dialogOpen(hd)) {
  181. #if 1//1.01 ロングファイル名対応
  182.     #if 1//3.00A 970429 
  183.             strcpymax(szfilename,szfile,CCHPATHNAME);
  184.             mchar *pEnd = szfilename + strGetWordLen(szfilename);
  185.             if (*strGetWordTop(pEnd)) {
  186.                 if (!(mode & VZOFN_ENABLE_MULTI)) {
  187.                     information("複数ファイルの指定はできません");
  188.                     #if 1
  189.                     szfilename[0] = 0;
  190.                     #else
  191.                     *pEnd = 0;
  192.                     pathFormLong(szfilename);
  193.                     #endif
  194.                     continue;
  195.                 }
  196.             }
  197.     #else
  198.             // 複数指定されることもある
  199.             strcpy(szfilename,szfile);
  200.             if (szfilename[0] == '"') {
  201.                 // 何もしない
  202.             } else {
  203.                 mchar *p = strGetWordTop(szfilename);
  204.                 p += strGetWordLen(szfilename);
  205.                 p = strGetWordTop(szfilename);
  206.                 if (*p == 0) {
  207.                     // 複数指定されてないときだけ、pathSetFullする
  208.                     pathSetFull(szfilename);
  209.                 }
  210.             }
  211.     #endif
  212. //information(szfilename);
  213. #else
  214.             strcpy(szfilename,szfile);
  215.             pathSetFull(szfilename);
  216. #endif
  217.             return TRUE;
  218.         }
  219.         return FALSE;
  220.     }
  221. }
  222.  
  223. // 1.00CでTXAPIとした
  224. BOOL TXAPI vzgetopenfilename(mchar *szfilename,mchar *szcaption)
  225. {
  226. // VZライクのファイルオープンダイアログをオープン
  227. // szcaptionでダイアログのタイトルを指定してください。
  228. // ファイル名が指定されたら、szfilenameにセットしTRUEを返します。
  229. // 指定されなかったら、FALSEを返します。
  230. //1.01 仕様変更:ファイル名を""で括って返すようにしました。
  231. //3.00A 970429 複数指定されることはなくした
  232.     return _vzgetopenfilename(szfilename,szcaption,0);
  233. }
  234.  
  235. // 1.00Bで追加
  236. // 1.00CでTXAPIとした
  237. BOOL TXAPI vzreferfilename(mchar *szfilename,mchar *szcaption)
  238. {
  239. // VZライクのファイル参照ダイアログをオープン
  240. // szcaptionでダイアログのタイトルを指定してください。
  241. // ファイル名が指定されたら、szfilenameにセットしTRUEを返します。
  242. // 指定されなかったら、FALSEを返します。
  243. //1.01 仕様変更:ファイル名を""で括って返すようにしました。
  244. //3.00A 970429 複数指定されることはなくした
  245.     return _vzgetopenfilename(szfilename,szcaption,VZOFN_REFER);
  246. }
  247.  
  248. // 選択された範囲をszfilenameに追加出力する
  249. // fdeletetextが真なら、上書き出力する
  250. static BOOL append(mchar *szfilename,BOOL fdeletetext)
  251. {
  252.     BOOL ret = FALSE;
  253.     txInitText(text2);
  254.     txSetFileName(text2,szfilename);
  255.     txOpenText(text2);
  256.     if (fdeletetext) txDeleteText(text2);
  257.     txJumpFileEnd(text2);
  258.     txSelectTsPush(text);
  259.     txTsPop(text2);
  260.     ret = txSave(text2);
  261.     txClose(text2);
  262.     return ret;
  263. }
  264.  
  265. // ファイル名を一つ入力
  266. // これはロングファイル名の問題はない
  267. static BOOL vzinputfilename(mchar szfilename[CCHPATHNAME],mchar *szcaption)
  268. {
  269.     while(1) {
  270.         HDIALOG hd = dialog(szcaption);
  271.         txstr szcur;
  272.         dialogControlHistRead(hd,HIST_FILE);
  273.         dialogStrC(hd,"ファイル名(&F):",szfilename,10,CCHPATHNAME,40);
  274.         driveGetCurDir(0,szcur);
  275.         dialogIndent(hd,4);
  276.         dialogCaption(hd,"カレント " + szcur);
  277.         dialogIndent(hd,12);
  278.         if (dialogOpen(hd)) {
  279.             pathSetFull(szfilename);
  280.             if (pathIsFileName(szfilename)) return TRUE;
  281.             information("ファイル名 %s の指定は間違っています",szfilename);
  282.         } else {
  283.             return FALSE;
  284.         }
  285.     }
  286. }
  287.  
  288. vzuiOpen
  289. {
  290.     // ファイルのオープン
  291.     // ファイラーと連動したファイルオープン
  292.     //{#VZ} {Esc}O %O ^%O
  293.     //{#EMACS} %O
  294.     mchar szfilename[CCHPATHNAME] = {0};
  295.     
  296.     if (vzgetopenfilename(szfilename,"入力ファイル")) {
  297. //information(szfilename);
  298.         txOpenForkExFast(text,szfilename);
  299.     }
  300. }
  301.  
  302. vzuiOpenRead
  303. {
  304.     // Read onlyオープン
  305.     // ファイラーと連動したRead onlyオープン
  306.     //{#VZ} {Esc}R %R ^%R
  307.     //{#EMACS} %R
  308.     mchar szfilename[CCHPATHNAME] = {0};
  309.     
  310.     //1.00F VZ.KEYのESC+R(Read Only オープン)でファイラーを起動してそこからファイルをオープンすると、リードオンリーオープンにならなかった
  311.     if (_vzgetopenfilename(szfilename,"入力ファイル",VZOFN_READONLY)) {
  312. //information(szfilename);
  313.         txOpenForkExFast(text,szfilename + " --R");
  314.     }
  315. }
  316.  
  317. vzuiSave
  318. {
  319.     // ファイルのセーブ
  320.     // 出力ファイル名の入力ウィンドウをそのまま実行すれば「上書き保存」、
  321.     // 名前を変更して実行すれば「名前を付けて保存」となる。
  322.     //{#VZ} {Esc}S %S ^%S
  323.     //{#EMACS} %S
  324.     mchar szfilename[CCHPATHNAME];
  325.     strcpy(szfilename,text->szfilename);
  326.     if (text->fReadOnly) {//1.00B 950628 リードオンリーでも保存していた
  327.         attention("%s は上書き禁止ですので保存できません",szfilename);
  328.         return FALSE;
  329.     }
  330.     if (vzinputfilename(szfilename,"出力ファイル")) {
  331.         pathFormLong(szfilename);    //1.01 ""に対応
  332.         if (text->fClip) {
  333.             if (fileIsExist(szfilename)) {
  334.                 if (question("%sはすでに存在します。\n選択されたテキストを%sに上書き保存しますか?",szfilename,pathGetFileName(szfilename)) != IDYES) {
  335.                     return FALSE;
  336.                 }
  337.             }
  338.             if (append(szfilename,TRUE)) {
  339.                 return TRUE;
  340.             } else {
  341.                 attention("%sへのセーブに失敗しました",szfilename);
  342.                 return FALSE;
  343.             }
  344.         } else {
  345. #if 1//1.99C 
  346.             if (!strcmp(szfilename,text->szfilename)) {
  347.                 //2.00E vzuiSaveでファイルの名前を変更しなければtxSaveを行う様にした
  348.                 return txSave(text);
  349.             } else {
  350.                 if (txSaveAs(text,szfilename,text->crSave,text->kcSave,0)) {
  351.                     return TRUE;
  352.                 } else {
  353.                     attention("%s には保存できません",szfilename);
  354.                     return FALSE;
  355.                 }
  356.             }
  357. #else
  358.             if (txSaveTo(text,szfilename)) {
  359.                 txAddFileHist(text,szfilename);//1.00D VZ.KEYのAlt+Sで指定したファイル名がファイル名ヒストリに入っていなかった
  360.                 strcpy(text->szfilename,szfilename);
  361.                 text->fEdit = FALSE;
  362.                 wndtxDoCaption();
  363.                 txDispLocate(text);//1.00H4 ステータスバーの「変更」がすぐ消えなかった
  364.             } else {
  365.                 attention("%s には保存できません",szfilename);
  366.             }
  367. #endif
  368.         }
  369.     }
  370.     return FALSE;
  371. }
  372.  
  373. vzuiAppend
  374. {
  375.     // 既存ファイルへ追加
  376.     // 編集テキスト全体もしくは選択範囲を、既存ファイルの末尾に
  377.     // 追加出力する。
  378.     //{#VZ} {Esc}A %A ^%A
  379.     //{#EMACS} %A
  380.     mchar szfilename[CCHPATHNAME] = {0};
  381.     
  382.     if (vzreferfilename(szfilename,"追加ファイル")) {
  383.         BOOL fselected = text->fClip;
  384.         if (!fselected) txSelectAll(text);
  385.         szfilename[strGetWordLen(szfilename)] = 0;//2.00D vzuiAppendでファイラーから追加ファイルを選択できなかった
  386.         pathFormLong(szfilename);    //1.01 ""に対応
  387.         if (!append(szfilename,FALSE)) {
  388.             attention("%sへの追加に失敗しました",szfilename);
  389.         }
  390.         if (!fselected) txSelectQuit(text);
  391.     }
  392. }
  393.  
  394. vzuiRename
  395. {
  396.     // ファイル名の変更
  397.     // 編集ファイルのファイル名を変更して編集を続ける
  398.     // 保存は行われません
  399.     //{#VZ} {Esc}P %P ^%P
  400.     //{#EMACS} %P
  401.     mchar szfilename[CCHPATHNAME];
  402.     strcpy(szfilename,text->szfilename);
  403.     if (vzinputfilename(szfilename,"ファイル名の変更")) {
  404.         strcpy(text->szfilename,szfilename);
  405.         text->fEdit = TRUE;
  406.         wndtxDoCaption();
  407.         if (fileIsExist(szfilename)) {
  408.             statprintf("%sはすでに存在します",szfilename);
  409.         }
  410.     }
  411. }
  412.  
  413. //1.00A 950628 VZ.KEY/VZ98.KEYでEsc-Nが効かなかった
  414. vzuiNew
  415. {
  416.     // 新規ファイルオープン
  417.     // 入力ダイアログでファイル名を決定してから新規ウィンドウを開く
  418.     //{#VZ} {Esc}N %N ^%N
  419.     //{#EMACS} %N
  420.     mchar szfilename[CCHPATHNAME];
  421.     strcpy(szfilename,text->szfilename);
  422.     if (vzinputfilename(szfilename,"新規ファイル")) {
  423.         txOpenForkFast(text,szfilename + " --n --A");//1.00F vzuiNewでもテキストパス検索が有効になっていたので、無効にした
  424.     }
  425. }
  426.  
  427. vzuiCloseOpen
  428. {
  429.     // クローズ・オープン
  430.     // 現テキストを閉じて、別ファイルを新たに開く
  431.     //{#VZ} {Esc}L %L ^%L
  432.     //{#EMACS} %L
  433.     mchar szfilename[CCHPATHNAME] = {0};
  434.     
  435.     if (getedit) {
  436.         int ret = question("修正テキストを出力しますか?");
  437.         if (ret == IDCANCEL) return;
  438.         if (ret == IDYES) {
  439.             save;
  440.         }
  441.     }
  442.     if (vzreferfilename(szfilename,"入力ファイル")) {
  443.         txOpenFile(text,szfilename);
  444.     }
  445. }
  446.  
  447. vzuiInsertFile
  448. {
  449.     // カーソル位置へ挿入
  450.     // カーソル位置にファイルを挿入する
  451.     //{#VZ} {Esc}I %I ^%I
  452.     //{#EMACS} %I
  453.     mchar szfilename[CCHPATHNAME] = {0};
  454. #if 1//3.00A 970429 
  455.     if (_vzgetopenfilename(szfilename,"挿入ファイル",VZOFN_REFER|VZOFN_ENABLE_MULTI)) {
  456.         txInsertFileMulti(text,szfilename);
  457.         return TRUE;
  458.     }
  459.     return FALSE;
  460. #else
  461.     if (vzreferfilename(szfilename,"挿入ファイル")) {
  462.     #if 1//1.00C 複数ファイル指定対応
  463.         txInsertFileMulti(text,szfilename);//2.99 970317 Multi化
  464.     #else
  465.         txInitText(text2);
  466.         txSetFileName(text2,szfilename);
  467.         txOpenText(text2);
  468.         txJumpFileTop(text2);
  469.         txSelectPara(text2);
  470.         txJumpFileEnd(text2);
  471.         txSelectTsPush(text2);
  472.         txTsPop(text);
  473.         txClose(text2);
  474.     #endif
  475.     }
  476. #endif
  477. }
  478.  
  479. static BOOL uialltextSave(void)
  480. {
  481.     if (alltextGetEdit()) {
  482.         int ret = question("修正テキストを出力しますか?");
  483.         if (ret == IDCANCEL) return FALSE;
  484.         if (ret == IDYES) {
  485.             if (!alltextSave()) return FALSE;
  486.         }
  487.     }
  488.     return TRUE;
  489. }
  490.  
  491. vzuiCloseAll
  492. {
  493.     // エディタを終了(確認メッセージ付き)
  494.     //{#VZ} {Esc}Q %Q ^%Q
  495.     //{#EMACS} %Q
  496.     if (!uialltextSave()) return;
  497.     if (question("エディタを終了しますか?") == IDYES) alltextQuit();
  498. }
  499.  
  500. //{###プロジェクト}
  501. //WZ Editorのプロジェクトを操作する機能を提供します。
  502.  
  503. static BOOL _uiPrjResume(BOOL fConfirm)
  504. {
  505.     if (fConfirm && !uialltextSave()) return FALSE;
  506.     txSetUndisp(text);
  507.         text->share->fProjectOpening = TRUE;
  508. #if 1//1.00F 余計な、「修正テキストを保存しますか」をカット
  509.         alltextQuit();
  510. #else
  511.         txuiCloseAll(text);
  512. #endif
  513.     txSetDisp(text);
  514.     return TRUE;
  515. }
  516.  
  517. BOOL TXCMDBASE uiPrjResume(TX* text)
  518. {
  519.     // 前回終了時の状態を復元
  520.     // 「全てのWZ Editorを閉じる」などのコマンドで終了したときの
  521.     // デスクトップ配置を復元
  522.     return _uiPrjResume(TRUE);
  523. }
  524.  
  525. PrjSave
  526. {
  527.     // プロジェクトの保存
  528.     // 標準プロジェクトファイル「WZ.TPJ」または、そのとき開いていた
  529.     // プロジェクトファイルに上書き保存
  530.     //{#VZ} {Esc}W
  531.     wzlock(LOCK_HIST);//1.01A 
  532.     alltextToHist();
  533.     histSave();
  534.     wzunlock(LOCK_HIST);//1.01A 
  535. }
  536.  
  537. static BOOL _PrjOpen(mchar *_szfilename,BOOL fConfirm)
  538. {
  539.     if (fConfirm && !uialltextSave()) return FALSE;
  540.     PrjSave();//1.00F プロジェクトオープン中に別のプロジェクトを開くと、閉じられるプロジェクトの内容が保存されていなかった
  541.     mchar szfilename[CCHPATHNAME];
  542.     strcpy(szfilename,_szfilename);
  543.     pathSetExt(szfilename,".tpj");
  544.     if (!fileIsExist(szfilename)) return FALSE;
  545.     strcpy(text->share->szproject,szfilename);
  546.     histLoad();
  547.     return _uiPrjResume(FALSE);
  548. }
  549.  
  550. BOOL TXAPI PrjOpen(mchar *_szfilename)
  551. {
  552. // _szfilenameのプロジェクトを開く
  553. //1.00Cで追加
  554.     return _PrjOpen(_szfilename,TRUE);
  555. }
  556.  
  557. #if 1
  558.     #include "prof.h"
  559.     static mchar _szPrjHistKey[] = "szPrjHist";
  560. #else
  561. permanent txstr szPrjHist(CCHPATHNAME);
  562. #endif
  563.  
  564. static void SetPrjFileName(mchar szfilename[CCHPATHNAME])
  565. {
  566. #if 1//1.00F 前回プロジェクトをOpen/Saveしたディレクトリを覚える様にした
  567.     strcpy(szfilename,"-c ");
  568.     mchar*p = szfilename + strlen(szfilename);
  569.     #if 1    // permanentだと、最後にプロジェクトを開いた時のszPrjHistではなく、
  570.             // 最後に閉じたウィンドウのszPrjHistがiniに書き込まれてしまう。
  571.         TxProfile ini;
  572.         profWzIniNew(&ini,"prmFILE");
  573.         profReadStr(&ini,_szPrjHistKey,p,CCHPATHNAME,"");
  574.         profDelete(&ini);
  575.     #else
  576.         strcpy(p,szPrjHist);
  577.     #endif
  578.     pathSetFileName(p,"*.tpj");
  579. #else
  580.     strcpy(szfilename,"-c *.tpj");
  581. #endif
  582. }
  583.  
  584. static void SetPrjHist(mchar *szfilename)
  585. {
  586. #if 1
  587.     TxProfile ini;
  588.     profWzIniNew(&ini,"prmFILE");
  589.     profWriteStr(&ini,_szPrjHistKey,szfilename);
  590.     profDelete(&ini);
  591. #else
  592.     szPrjHist = szfilename;
  593. #endif
  594. }
  595.  
  596. BOOL TXAPI TXCMDBASE uiPrjOpen(void)
  597. {
  598. // プロジェクトを開く
  599. // プロジェクトファイル名を指定してデスクトップ配置を復元
  600. // 編集中のファイルがあると、保存全クローズ(問い合わせあり)し、
  601. // 平行する複数のプロジェクトを入れ替える。
  602. #if 0//1.01A 
  603.     #ifdef __FLAT__
  604.     information("現在のWZ32ではプロジェクト機能は使えません");
  605.     return FALSE;
  606.     #endif
  607. #endif
  608.     if (!uialltextSave()) return FALSE;
  609.     mchar szfilename[CCHPATHNAME];
  610.     SetPrjFileName(szfilename);
  611.     while(1) {
  612.         if (txofnReferFileName(text,szfilename,"プロジェクトを開く")) {
  613.             pathSetExt(szfilename,".tpj");
  614.             if (!fileIsExist(szfilename)) {
  615.                 attention("%sは存在しません。\n正しいファイルを指定してください",szfilename);
  616.                 continue;
  617.             }
  618.             SetPrjHist(szfilename);
  619.             return _PrjOpen(szfilename,FALSE);
  620.         }
  621.         break;
  622.     }
  623.     return FALSE;
  624. }
  625.  
  626. BOOL TXAPI TXCMDBASE uiPrjSaveTo(void)
  627. {
  628. // 名前をつけてプロジェクトの保存
  629. // 現在のデスクトップ配置を、任意のプロジェクトファイル名で保存
  630. #if 0//1.01A 
  631.     #ifdef __FLAT__
  632.     information("現在のWZ32ではプロジェクト機能は使えません");
  633.     return FALSE;
  634.     #endif
  635. #endif
  636.     mchar szfilename[CCHPATHNAME];
  637.     SetPrjFileName(szfilename);
  638.     while(1) {
  639.         if (txofnReferFileName(text,szfilename,"プロジェクトの保存")) {
  640.             pathSetExt(szfilename,".tpj");
  641.             if (fileIsExist(szfilename)) {
  642.                 int ret = question("%sはすでに存在します。\n上書きしてよいですか?",szfilename);
  643.                 if (ret != IDYES) continue;
  644.             }
  645.             strcpy(text->share->szproject,szfilename);
  646.             PrjSave();//1.01A 
  647.             SetPrjHist(szfilename);
  648.             return TRUE;
  649.         }
  650.         break;
  651.     }
  652.     return FALSE;
  653. }
  654.  
  655. #if 0//1.00Cでのバグ修正により、これらのコマンドは多分不要
  656.  
  657. vzuiPrjCloseAll
  658. {
  659.     // 「修正テキストを出力しますか?」と尋ね、
  660.     // 「エディタを終了」と尋ね、全終了します。
  661.     // WZICONを常駐していてもプロジェクトを保存する
  662.     if (!uialltextSave()) return;
  663.     if (question("エディタを終了しますか?") == IDYES) {
  664.         PrjSave();//1.01A 
  665.         text->share->szproject[0] = 0;//1.00C
  666.         alltextQuit();
  667.     }
  668. }
  669.  
  670. uiPrjCloseAll
  671. {
  672.     // 「修正テキストを出力しますか?」と尋ね、全終了
  673.     // WZICONを常駐していてもプロジェクトを保存する
  674.     if (!uialltextSave()) return;
  675.     PrjSave();//1.01A 
  676.     text->share->szproject[0] = 0;//1.00C
  677.     alltextQuit();
  678. }
  679.  
  680. uiPrjCloseAllEvery
  681. {
  682.     // テキスト毎に「出力しますか?」を尋ね、全終了
  683.     // WZICONを常駐していてもプロジェクトを保存する
  684.     PrjSave();//1.01A 
  685.     text->share->szproject[0] = 0;//1.00C
  686.     uicloseallevery;
  687. }
  688.  
  689. uiPrjCloseAllForce
  690. {
  691.     // 全テキストを保存してエディタの終了
  692.     // 修正テキストは全保存し、全終了
  693.     // WZICONを常駐していてもプロジェクトを保存する
  694.     PrjSave();//1.01A 
  695.     text->share->szproject[0] = 0;//1.00C
  696.     uicloseallforce;
  697. }
  698.  
  699. #endif
  700.  
  701. //{###ファイル}
  702.  
  703. //1.97 EXEからTX-Cに移動
  704. BOOL TXAPI TXCMDBASE txMulti(TX* text)
  705. {
  706. // 多重化
  707.     return txOp(text,TXOP_TXMULTI,0,0);
  708. }
  709.  
  710. void TXAPI wzopen(LPCSTR szfilename)
  711. {
  712. // szfilenameのファイルをWZ Editorでオープン
  713.     txOpenForkFast(text,szfilename);
  714. }
  715.  
  716. //2.96A 970211 ファイラーを起動
  717. BOOL TXCMDBASE filer(TX* text)
  718. {
  719. // ファイラーを起動
  720.     macroFork("filer");    // ファイラーは高速オープンは使わない
  721.     return TRUE;
  722. }
  723.  
  724. //
  725.  
  726. #define IDD_DELETE        1000
  727. #define IDD_CALC        1001
  728. #define IDD_NPAGEALL    1002
  729.  
  730. //2.90 histだけでなくsbにも対応
  731.  
  732. int ctrlHist;
  733. int iHist;
  734. HHIST _hist;
  735. HSTRBLK _sb;
  736.  
  737. static void FlushHistList(HWND hwnd)
  738. {
  739.     HWND hctrl = GetDlgItem(hwnd,ctrlHist);
  740.     int i = sbGetCount(_sb);
  741.     SendMessage(hctrl,LB_RESETCONTENT,0,0);
  742.     if (_hist == HIST_FILE) {//1.01A "ファイルリストのファイルを開く"改良
  743.         txstr sz;
  744.         UINT tab = 4 * 18;
  745.         SendMessage(hctrl,LB_SETTABSTOPS,1,(LPARAM)&tab);
  746.         while (--i >= 0) {
  747.             mchar* szstr = sbRead(_sb,i);
  748.             sz = pathGetFileName(szstr);
  749.             sz += "\t(";
  750.             sz += szstr;
  751.             sz += ")";
  752.             SendMessage(hctrl,LB_ADDSTRING,0,(LPARAM)(mchar*)sz);
  753.         }
  754.     } else {
  755.         while (--i >= 0) {
  756.             mchar* szstr = sbRead(_sb,i);
  757.             SendMessage(hctrl,LB_ADDSTRING,0,(LPARAM)szstr);
  758.         }
  759.     }
  760. }
  761.  
  762. BOOL dialogUiHistory(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  763. {
  764.     switch(message) {
  765.         case WM_INITDIALOG: {
  766.             FlushHistList(hwnd);
  767.             SendDlgItemMessage(hwnd,ctrlHist,LB_SETCURSEL,0,0);
  768.             break;
  769.         }
  770.         case WM_COMMAND: {
  771.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  772.             int id = WM_COMMAND_GetId(wParam);
  773.             switch(id) {
  774.                 case IDOK: {
  775.                     iHist = SendDlgItemMessage(hwnd,ctrlHist,LB_GETCURSEL,0,0);
  776.                     break;
  777.                 }
  778.                 case IDD_DELETE: {//1.92 ヒストリの削除機能追加
  779.                     iHist = SendDlgItemMessage(hwnd,ctrlHist,LB_GETCURSEL,0,0);
  780.                     if (iHist != LB_ERR) {
  781.                         int i = sbGetCount(_sb) - iHist - 1;
  782.                         sbDelI(_sb,i);
  783.                         //
  784.                         FlushHistList(hwnd);
  785.                         SendDlgItemMessage(hwnd,ctrlHist,LB_SETCURSEL,iHist,0);
  786.                     }
  787.                     break;
  788.                 }
  789.             }
  790.             if (id == ctrlHist && notify == LBN_DBLCLK) {
  791.                 PostMessage(hwnd,WM_COMMAND,IDOK,0);
  792.             }
  793.             break;
  794.         }
  795.     }
  796.     return FALSE;
  797. }
  798.  
  799. static mchar* _uiSelectHistory(mchar* szcaption,HANDLETX hist,int width,int height)
  800. {
  801. //3.00B1 970612 
  802.     if (_hist || _sb) return NULL;
  803.     
  804.     mchar* ret = NULL;
  805.     _sb = sbFromHist(hist);
  806.     _hist = sbToHist(hist);
  807.     HDIALOG hd = dialog(szcaption);
  808.     
  809.     PMACROFUNC pfunc;
  810.     macroGetFuncAddress("dialogUiHistory",&pfunc);
  811.     dialogSetHook(hd,&pfunc);
  812.     
  813.     ctrlHist = _dialogList(hd,NULL,width,height);
  814.     //
  815.     dialogLFV(hd);
  816.     int cx = 12;
  817.     dialogOK(hd,cx);
  818.     dialogCancel(hd,cx);
  819.     dialogControlID(hd,IDD_DELETE);
  820.     dialogButtonCmd(hd,"削除(&D)",NULL,cx);
  821.     //
  822.     if (dialogOpen(hd)) {
  823.         int i = sbGetCount(_sb);
  824.         ret = sbRead(_sb,i-iHist-1);
  825.     }
  826.     _hist = NULL;
  827.     _sb = NULL;
  828.     return ret;
  829. }
  830.  
  831. mchar* TXAPI uiSelectHistory(mchar* szcaption,HANDLETX hist)
  832. {
  833. // szcaptionのキャプションで、histのヒストリを選択するダイアログを出し、
  834. // 選択されたヒストリ文字列を返す。キャンセルされたらNULLを返す
  835. //2.90 histはHIST_XXXでもHSTRBLKでも両方に対応した
  836. //1.00H で追加
  837.     return _uiSelectHistory(szcaption,hist,40,15);
  838. }
  839.  
  840. BOOL TXCMDBASE uiOpenHist(TX* text)
  841. {
  842. //ファイルヒストリから選んだファイルをオープン
  843. //1.00H で追加
  844.     mchar* szfilename = _uiSelectHistory("ファイルヒストリのファイルを開く",HIST_FILE,60,15);//3.00B1 970612 file.uiOpenHistの横幅拡大
  845.     if (szfilename) {
  846.         txOpenForkFast(text,szfilename);
  847.         return TRUE;
  848.     }
  849.     return FALSE;
  850. }
  851.  
  852. BOOL TXCMDBASE allSave(TX* text)
  853. {
  854. // オープン中の全テキストについて編集されているものをセーブします
  855. //1.91A で追加
  856.     return alltextSave();
  857. }
  858.  
  859. // カーソル位置のファイルを開く
  860. // カーソル位置の文字列がファイル名で、ファイルが存在すれば、
  861. // そのファイルをオープンします。
  862. // Copyright 1995 TY
  863.  
  864. #include "wintxx.h"
  865. // 例:       ^ カーソルがこの位置で実行すると"wintxx.h"をオープン
  866.  
  867. // ファイルが存在するか。拡張子省略/パス検索も行って調べる
  868. BOOL isfileexist(txstr szfilename)
  869. {
  870.     HFILE hf = _lopen(szfilename,OF_READ);
  871.     
  872.     if (hf != HFILE_ERROR) {
  873.         _lclose(hf);
  874.         return TRUE;
  875.     }
  876.     BYTE path[CCHPATHNAME];
  877.     strcpy(path,szfilename);
  878.     if (pathSearchExt(path,wzGetEnv(WZENV_EXT))) return TRUE;//1.00F
  879.     if (pathSearch(path,pathGetFileName(szfilename),wzGetEnv(WZENV_PATH),wzGetEnv(WZENV_EXT))) return TRUE;
  880.     return FALSE;
  881. }
  882.  
  883. int uiBackup(mchar* szfilename)
  884. {
  885.     HDIALOG hd = dialog("バックアップ");
  886.     dialogCaption(hd,"バックアップファイル");
  887.     dialogIndent(hd,4);
  888.     dialogCaption(hd,szfilename);
  889.     dialogIndent(hd,-4);
  890.     dialogCaption(hd,"が作成できません");
  891.     int mode = 0;
  892.     dialogControlRadioV(hd);
  893.     dialogRadioID(hd,&mode,
  894.         "バックアップディレクトリを作成して保存",
  895.         "バックアップディレクトリを作成しないで保存",
  896.         "保存をキャンセル"
  897.     );
  898.     dialogLFV(hd);
  899.     if (dialogOpen(hd)) {
  900.         return mode;
  901.     }
  902.     return -1;
  903. }
  904.  
  905. cfo
  906. {
  907. //#WZKEY    +^A
  908. #WZMENU FILE(F)
  909.     // カーソル位置のファイルオープン
  910.     // :  #include "wintxx.h"
  911.     // :             ^ カーソルがこの位置で実行すると"wintxx.h"をオープン
  912.     // by TY
  913.     setundisp;
  914.     IFILE address = getaddress;
  915.     txstr szfilename(CCHPATHNAME);
  916.     {
  917.         // 先頭文字へジャンプ
  918.         while(1) {
  919.             int c = getchar;
  920.             if (isalnum(c)) {
  921.                 jumpwordtopmi;
  922.                 if (!left) break;
  923.             } else if (c == '.' || c == '\\' || c == ':' || c == '_') {
  924.                 // ファイル名構成子
  925.                 if (!left) break;
  926.             } else {
  927.                 right;
  928.                 break;
  929.             }
  930.         }
  931.         selectquit;select;
  932.         // 末尾の次の文字へジャンプ
  933.         while(1) {
  934.             int c = getchar;
  935.             if (isalnum(c)) {
  936.                 jumpwordendmi;
  937. //                if (!right) break;//1.00C jumpwordendmi仕様変更に対応
  938.             } else if (c == '.' || c == '\\' || c == ':' || c == '_') {
  939.                 // ファイル名構成子
  940.                 if (!right) break;
  941.             } else {
  942.                 break;
  943.             }
  944.         }
  945.         getword(szfilename);
  946.         selectquit;
  947.     }
  948.     jumpaddress(address);
  949.     setdisp;
  950.     //
  951.     if (isfileexist(szfilename)) {
  952.         openforkfast(szfilename);
  953.     } else {
  954.         dispinfo("ファイル\"%s\"見つかりません",szfilename);
  955.     }
  956. }
  957.  
  958. static mchar _szpagef[] = "%ld 頁";
  959.  
  960. BOOL dlgprocInfo(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  961. {
  962.     switch(message) {
  963.         case WM_COMMAND: {
  964.             int id = WM_COMMAND_GetId(wParam);
  965.             int notify = WM_COMMAND_GetNotify(wParam,lParam);
  966.             switch(id) {
  967.                 case IDD_CALC: {
  968.                     NPAGE all = txLpOp(text,TXLPOP_CALC_NPAGEALL);
  969.                     mchar buff[20];
  970.                     sprintf(buff,_szpagef,all);
  971.                     Static_SetText(GetDlgItem(hwnd,IDD_NPAGEALL),buff);
  972.                     break;
  973.                 }
  974.             }
  975.         }
  976.     }
  977.     return FALSE;
  978. }
  979.  
  980. #define bytesToKB(size)    (size / 1024 + (size % 1024 > 0))
  981.  
  982. static NLINE txGetNlineall(TX* text,NPARA* pNparaAll)
  983. {
  984. //2.99D 970329 new
  985.     NLINE nlineAll;
  986.     IFILE adr = txGetAddress(text);
  987.     int ly = text->ly;
  988.     int xbase = text->xbase;
  989.     text->fNoCursor++;
  990.     txSetUndisp(text);
  991.     txJumpFileTop(text);
  992.     text->fCountNline++;
  993.     txJumpFileEnd(text);
  994.     text->fCountNline--;
  995.     if (pNparaAll) *pNparaAll = text->npara;
  996.     nlineAll = text->nline;
  997.     txJumpAddress(text,adr);
  998.     txSetLy(text,ly);
  999.     text->xbase = xbase;
  1000.     txFlushLx(text);
  1001.     txSetDisp(text);
  1002.     text->fNoCursor--;
  1003.     return nlineAll;
  1004. }
  1005.  
  1006. //1.94 
  1007. BOOL TXCMDBASE uiFileInformation(TX* text)
  1008. {
  1009. // 文書の情報
  1010.     HDIALOG hd = dialogbig("ファイルインフォメーション");    //2.99D 970330 dialogbig化
  1011.     dialogSetContexthelp(hd,TRUE);
  1012.     int lx = 15;
  1013.     int id;
  1014.     
  1015.     dialogSetH(hd);
  1016.     dialogSetGroupRight(hd,DTCX * 70);
  1017.     dialogSetHookEx(hd,"\m.dlgprocInfo");
  1018.     
  1019.     if (text->szfilename[0]) {
  1020.         dialogGroup(hd,"ファイル");
  1021.             dialogCaption(hd,"ファイル名:");
  1022.             dialogSetPosLX(hd,lx);
  1023.             id = dialogCaptionDynamic(hd,pathGetFileName(text->szfilename),40);
  1024.             dialogControlHelp(hd,288);
  1025.             _dialogAddControlInfo(hd,id);
  1026.             dialogLF(hd);
  1027.             //2.97 970223 
  1028.             dialogCaption(hd,"フルパス名:");
  1029.             dialogSetPosLX(hd,lx);
  1030.             id = dialogCaptionDynamic(hd,text->szfilename,40);
  1031.             dialogControlHelp(hd,288);
  1032.             _dialogAddControlInfo(hd,id);
  1033.             dialogLF(hd);
  1034.             //
  1035.             mchar buffsize[CCHWORD];
  1036.             dialogCaption(hd,"サイズ:");
  1037.             dialogSetPosLX(hd,lx);
  1038.             sprintf(buffsize,"%ldKB (%ld バイト)",bytesToKB(text->sizefileReal),text->sizefileReal);
  1039.             id = dialogCaptionDynamic(hd,buffsize,40);//2.00C 20では足りない
  1040.             dialogControlHelp(hd,289);
  1041.             _dialogAddControlInfo(hd,id);
  1042.             dialogLF(hd);
  1043.             //
  1044.             TM tm;
  1045.             mchar buffdate[CCHWORD];
  1046.             itimeToTm(&text->timeFile,&tm);
  1047.             sprintf(buffdate,"%2d/%2d/%2d %2d:%02d:%02d",
  1048.                 tm.tm_year,tm.tm_mon + 1,tm.tm_mday,
  1049.                 tm.tm_hour,tm.tm_min,tm.tm_sec
  1050.             );
  1051.             dialogCaption(hd,"日付:");
  1052.             dialogSetPosLX(hd,lx);
  1053.             id = dialogCaptionDynamic(hd,buffdate,20);
  1054.             dialogControlHelp(hd,290);
  1055.             _dialogAddControlInfo(hd,id);
  1056.             dialogLF(hd);
  1057.             //1.97 
  1058.             static mchar* tszFiletype[] = {"テキストファイル","テキストファイル(装飾・体裁付き)","WZ文書ファイル","WZ圧縮文書ファイル","HTMLファイル"};
  1059.             int itype = 0;
  1060.             if (text->fWztext) {
  1061.                 itype = 2;
  1062.                 if (text->fWztextArc) itype++;
  1063.             } else if (text->fHTML) {
  1064.                 itype = 4;
  1065.             } else if (text->fForm) {
  1066.                 itype = 1;//2.00B 
  1067.             }
  1068.             dialogCaption(hd,"ファイルタイプ:");
  1069.             dialogSetPosLX(hd,lx);
  1070.             id = dialogCaptionDynamic(hd,tszFiletype[itype],40);
  1071.             dialogControlHelp(hd,291);
  1072.             _dialogAddControlInfo(hd,id);
  1073.             dialogLF(hd);
  1074.             //
  1075.             if (text->fWztext) {
  1076.                 // CR+LF,SJIS固定なので、表示しない
  1077.             } else {
  1078.                 static mchar* tszReturn[] = {"CR+LF (Windows,DOS)","CR (Macintosh)","LF (Unix)"};
  1079.                 dialogCaption(hd,"改行コード:");
  1080.                 dialogSetPosLX(hd,lx);
  1081.                 id = dialogCaptionDynamic(hd,tszReturn[text->crOpen],30);
  1082.                 dialogControlHelp(hd,194);
  1083.                 _dialogAddControlInfo(hd,id);
  1084.                 dialogLF(hd);
  1085.                 //
  1086.                 static mchar* tszChar[] = {"SHIFT-JIS","JIS","EUC","UNICODE"};
  1087.                 dialogCaption(hd,"文字コード:");
  1088.                 dialogSetPosLX(hd,lx);
  1089.                 id = dialogCaptionDynamic(hd,tszChar[text->kcOpen],20);
  1090.                 dialogControlHelp(hd,196);
  1091.                 _dialogAddControlInfo(hd,id);
  1092.                 dialogLF(hd);
  1093.             }
  1094.         dialogGroupEnd(hd);
  1095.         dialogLF(hd);
  1096.     }
  1097.     
  1098.     dialogGroup(hd,"文書");
  1099.         {
  1100.             mchar buffsizetext[CCHWORD];
  1101.             IFILE size = txGetTextSize(text);
  1102.             dialogCaption(hd,"サイズ:");
  1103.             dialogSetPosLX(hd,lx);
  1104.             sprintf(buffsizetext,"%ldKB (%ld バイト)",bytesToKB(size),size);
  1105.             id = dialogCaptionDynamic(hd,buffsizetext,40);//2.00C 20では足りない
  1106.             dialogControlHelp(hd,301);
  1107.             _dialogAddControlInfo(hd,id);
  1108.             dialogLF(hd);
  1109.         }
  1110.         {//2.99D 970329 文書の情報に段落数と行数を表示するようにした。
  1111.             mchar buffsizetext[CCHWORD];
  1112.             NPARA nparaAll;
  1113.             NLINE nlineAll = txGetNlineall(text,&nparaAll);
  1114.             dialogCaption(hd,"段落数:");
  1115.             dialogSetPosLX(hd,lx);
  1116.             sprintf(buffsizetext,"%ld行",nparaAll);
  1117.             id = dialogCaptionDynamic(hd,buffsizetext,40);//2.00C 20では足りない
  1118.             dialogControlHelp(hd,301);
  1119.             _dialogAddControlInfo(hd,id);
  1120.             dialogLF(hd);
  1121.             //
  1122.             dialogCaption(hd,"行数:");
  1123.             dialogSetPosLX(hd,lx);
  1124.             sprintf(buffsizetext,"%ld行",nlineAll);
  1125.             id = dialogCaptionDynamic(hd,buffsizetext,40);//2.00C 20では足りない
  1126.             dialogControlHelp(hd,301);
  1127.             _dialogAddControlInfo(hd,id);
  1128.             dialogLF(hd);
  1129.         }
  1130.         {
  1131.             mchar buff[CCHWORD];
  1132.             id = dialogCaptionDynamic(hd,"総ページ数:",10);
  1133.             dialogControlHelp(hd,302);
  1134.             _dialogAddControlInfo(hd,id);
  1135.             if (text->editmode != 2) {
  1136.                 dialogSetPosLX(hd,lx);
  1137.                 dialogCaptionDynamic(hd,"テキストモード・高速モードでは総ページ数はわかりません。",50);
  1138.                 dialogLF(hd);
  1139.                 dialogSetPosLX(hd,lx);
  1140.                 dialogCaption(hd,"詳細モードで調べることができます。");
  1141.                 dialogLF(hd);
  1142.             } else {
  1143.                 dialogSetPosLX(hd,lx);
  1144.                 if (text->editmode == 2 && text->lp->npageall) {
  1145.                     sprintf(buff,_szpagef,text->lp->npageall);
  1146.                     // 文書に表や桁揃えが含まれていると正確でないことがある。
  1147.                     // "計算"を行うと正確な値になる。
  1148.                     strcat(buff," (およその値です)");
  1149.                 } else {
  1150.                     strcpy(buff,"不明");
  1151.                 }
  1152.                 dialogControlID(hd,IDD_NPAGEALL);
  1153.                 dialogCaption(hd,buff);
  1154.                 dialogLF(hd);
  1155.                 dialogSetPosLX(hd,lx);
  1156.                 dialogControlEnable(hd,(text->editmode == 2));
  1157.                 dialogControlID(hd,IDD_CALC);
  1158.                 dialogButton(hd,"計算",NULL,10);
  1159.                 dialogLF(hd);
  1160.             }
  1161.         }
  1162.     dialogGroupEnd(hd);
  1163.     
  1164.     dialogOpen(hd);
  1165.     return TRUE;
  1166. }
  1167.  
  1168. //旧:usermenu.umcMiFile
  1169. menuFileMi
  1170. {
  1171. #WZKEY
  1172. // MIFESライクファイルメニュー
  1173. //{#MI} {F1}
  1174.     call("menu.ファイル(MIFESライク)");
  1175. }
  1176.  
  1177. //タイトルを出すとカーソルを動かしてのコマンド指定がVZと異なってしまう
  1178. //旧:usermenu.umcVzFile
  1179. menuFileVz
  1180. {
  1181. #WZKEY
  1182. // VZ準拠ファイルメニュー
  1183. //{#VZ} {F1}
  1184. //{#EMACS} {F1}
  1185.     call("menu.ファイル(VZ互換)");
  1186. }
  1187.  
  1188. int uiFileType(TXFILETYPE* filetype,mchar* szfilename)
  1189. {
  1190.     HDIALOG hd;
  1191.     
  1192.     if (szfilename) {
  1193.         hd = dialog(szfilename + " のファイル形式");
  1194.     } else {
  1195.         hd = dialog("ファイルの形式");
  1196.     }
  1197.     
  1198. #if 0
  1199.     dialogStrC(hd,"拡張子(&E):",filetype->szext,16,cchof(filetype->szext),10);
  1200. #endif
  1201.     dialogSelectIDB(hd,"改行コード(&R):",&filetype->crSave,16,24,"CR+LF(Windows,DOS)","CR(Macintosh)","LF(Unix)");
  1202.     //
  1203.     #ifdef __FLAT__
  1204.     dialogSelectIDB(hd,"文字コード(&C):",&filetype->kcSave,16,24,"SHIFT-JIS","JIS","EUC","UNICODE");
  1205.     #else
  1206.     dialogSelectIDB(hd,"文字コード(&C):",&filetype->kcSave,16,24,"SHIFT-JIS","JIS","EUC");
  1207.     #endif
  1208.     
  1209.     return dialogOpen(hd);
  1210. }
  1211.  
  1212. #define NEWFILE_WZTEXT    3    // WZ文書
  1213. #define NEWFILE_HTML    4    // HTML
  1214. #define NEWFILE_TXTEXT    2    // 装飾・体裁付きテキスト文書
  1215. #define NEWFILE_BINARY    6    // バイナリ
  1216. #define NEWFILE_PLAIN    7    // プレーンテキスト
  1217.  
  1218. //2.00B [ファイル]-[新規作成]をわかりやすくした
  1219. BOOL TXAPI TXCMDBASE txuiOpenNew(TX* text)
  1220. {
  1221. // 新規テキスト作成ダイアログ
  1222. //{#MS} ^N
  1223.     if (text->pcc && text->pcc->fPlaintext) {//3.00B1 970613 
  1224.         wzExec("");
  1225.         return TRUE;
  1226.     }
  1227.     HDIALOG hd = dialog("新規作成");
  1228.     dialogSetContexthelp(hd,TRUE);
  1229.     int mode = 0;
  1230.     if (text->fWztext) {
  1231.         mode = NEWFILE_WZTEXT;
  1232.     } else if (text->fHTML) {
  1233.         mode = NEWFILE_HTML;
  1234.     } else if (text->fForm) {
  1235.         mode = NEWFILE_TXTEXT;//2.97A 970303 
  1236. #if 0//3.00B1 970523 
  1237.     } else if (text->fBinedit) {
  1238.         mode = NEWFILE_BINARY;//3.00B1 970523 
  1239.     } else if (text->pcc && text->pcc->fPlaintext) {
  1240.         mode = NEWFILE_PLAIN;//3.00B1 970523 
  1241. #endif
  1242.     }
  1243.     dialogControlRadioV(hd);
  1244.     dialogControlHelp(hd,-480);
  1245.     dialogRadioID(hd,&mode,
  1246.         "テキスト文書(&T)",
  1247.         "メール(&M)",
  1248.         "装飾・体裁付きテキスト文書(&A)",
  1249.         "WZ文書(&W)",
  1250.         "HTML(&H)",
  1251.         "Cプログラム(&C)"
  1252. //        ,"バイナリ(&B)"
  1253. //        ,"ベタテキスト(&P)"
  1254.     );
  1255.     dialogLFV(hd);
  1256.     dialogOK(hd,14);
  1257.     dialogCancel(hd,14);
  1258.     int iddTemplate = dialogCmd(hd,"テンプレート(&E) >>",14);
  1259.     int ret = dialogOpen(hd);
  1260.     if (ret) {
  1261.         if (ret == iddTemplate) {
  1262.             txstr szfilename;
  1263.             strcpy(szfilename,text->szexedir);
  1264.             szfilename += "template\\*.*";
  1265.             if (mode == NEWFILE_HTML) {//2.98 970304 テンプレートにHTMLを追加
  1266.                 pathSetFileName(szfilename,SZHTMLMASK);
  1267.             }
  1268. //information("%s",szfilename);
  1269.             if (txofnGetOpenFileNameEx(text,szfilename,"テンプレートから新規作成",TXOFN_FOCUSFILE) == TXOFN_OK) {
  1270.                 //2.98 970304 
  1271.                 txstr szcmd = "/template:\""+szfilename+"\"";
  1272.                 if (pathIsExt(szfilename,".htm") || pathIsExt(szfilename,".html")) {
  1273.                     mode = NEWFILE_HTML;
  1274.                 }
  1275.                 if (mode == NEWFILE_HTML) {
  1276.                     szcmd += " /T.htm /E1";
  1277.                 }
  1278.                 wzExec(szcmd);
  1279.                 return TRUE;
  1280.             }
  1281.             return FALSE;
  1282.         }
  1283.         switch(mode) {
  1284.             case 0: {
  1285.                 wzExec("/T.txt");
  1286.                 return TRUE;
  1287.             }
  1288.             case 1: {
  1289.                 wzExec("/T.log");
  1290.                 return TRUE;
  1291.             }
  1292.             case NEWFILE_TXTEXT: {
  1293.                 wzExec("/T.txt /Ttx /E1");
  1294.                 return TRUE;
  1295.             }
  1296.             case NEWFILE_WZTEXT: {
  1297.                 wzExec("/T.wz");
  1298.                 return TRUE;
  1299.             }
  1300.             case NEWFILE_HTML: {
  1301. #if 1//2.99D 970331 テキストモードで開くにしていてもHTMLを新規作成すると体裁モードになった
  1302.                 wzExec("/T.htm");
  1303. #else
  1304.                 wzExec("/T.htm /E1");
  1305. #endif
  1306.                 return TRUE;
  1307.             }
  1308.             case 5: {
  1309.                 wzExec("/T.C");
  1310.                 return TRUE;
  1311.             }
  1312.             case NEWFILE_BINARY: {//3.00B1 970523 
  1313.                 wzExec("/b /b0");
  1314.                 return TRUE;
  1315.             }
  1316.             case NEWFILE_PLAIN: {//3.00B1 970523 
  1317.                 wzExec("/bt /b0");
  1318.                 return TRUE;
  1319.             }
  1320.         }
  1321.     }
  1322.     return FALSE;
  1323. }
  1324.  
  1325. //2.99D 970402 
  1326. BOOL TXAPI TXCMDBASE txuiUpdateClose(TX* text)
  1327. {
  1328. // テキストが編集されていたら上書き保存して閉じる
  1329. // 編集されてなかったら閉じる
  1330. //2.99D 970402 new
  1331.     if (text->fEdit) {
  1332.         if (txuiSave(text)) {
  1333.             return txuiClose(text);
  1334.         }
  1335.     } else {
  1336.         return txuiClose(text);
  1337.     }
  1338.     return 0;
  1339. }
  1340.  
  1341. //##常駐
  1342.  
  1343. static HWND textGetStayAlways(void)
  1344. {
  1345.     SHARE* sh = text1->share;
  1346.     HWND ret = NULL;
  1347.     int i;
  1348.     
  1349.     wzlock(LOCK_WZPROCESS);
  1350.     for (i = 0;i < sh->nOpen;i++) {
  1351.         if (sh->tWzprocess[i].modeProcess & WZPROCESS_STAYALWAYS) {
  1352.             ret = sh->tWzprocess[i].hwnd;
  1353.             break;
  1354.         }
  1355.     }
  1356.     wzunlock(LOCK_WZPROCESS);
  1357.     return ret;
  1358. }
  1359.  
  1360. stay
  1361. {
  1362. // WZの常駐
  1363.     #if 1    //3.00B2 970614 NT3.51/WZ16でWZの常駐ONでWZ Iconが起動するとファイルオープンダイアログが出た
  1364.         macroFork("wzicon /hw /i- /co");
  1365.     #else
  1366.         #if 1///2.96 970209 WZ常駐を高速化("/I"追加)
  1367.             #if 1///2.99D 970330 sw
  1368.                 macroFork("wzicon /hw /i-");
  1369.             #else
  1370.                 macroFork("wzicon /H /I");
  1371.             #endif
  1372.         #else
  1373.         macroFork("wzicon --H");
  1374.         #endif
  1375.     #endif
  1376. }
  1377.  
  1378. flushStay
  1379. {
  1380.     HWND hwnd = textGetStayAlways();
  1381.     SHARE* sh = text1->share;
  1382.     if (sh->config.fenvstayalways) {
  1383.         if (!hwnd) {
  1384.             stay();
  1385.         }
  1386.     } else {
  1387.         if (hwnd) {
  1388.             PostMessage(hwnd,WM_CLOSE,0,0);
  1389.         }
  1390.     }
  1391. }
  1392.  
  1393. //##バイナリ編集
  1394.  
  1395. int TXAPI txuiFlushFile(TX* text)
  1396. {
  1397. // テキストが編集されていたら、保存するかどうかのメッセージボックスを出して
  1398. // [はい]なら保存してIDYES、[いいえ]ならIDNO、[キャンセル]ならFALSEを返す。
  1399. // テキストが編集されていなかったらIDOKを返す。
  1400. //2.00Eで追加
  1401. //2.92 返り値の仕様変更
  1402. #if 1//2.92 
  1403.     if (!text->fReadOnly && txGetEdit(text)) {
  1404.         int ret = question("%sは更新されています。保存しますか?",txGetTitleFilename(text));
  1405.         if (ret == IDYES) {
  1406.             if (txuiSave(text)) return IDYES;
  1407.             return FALSE;
  1408.         } else if (ret == IDNO) {
  1409.             return IDNO;
  1410.         } else {
  1411.             return FALSE;
  1412.         }
  1413.     }
  1414.     return IDOK;
  1415. #else
  1416.     if (!text->fReadOnly && txGetEdit(text)) {
  1417.         int ret = question("%sは更新されています。保存しますか?",txGetTitleFilename(text));
  1418.         if (ret == IDYES) {
  1419.             return txuiSave(text);
  1420.         } else if (ret == IDNO) {
  1421.             return TRUE;
  1422.         } else {
  1423.             return FALSE;
  1424.         }
  1425.     }
  1426.     return TRUE;
  1427. #endif
  1428. }
  1429.  
  1430. BOOL TXAPI TXCMDBASE txBinedit(TX* text)
  1431. {
  1432. // バイナリ編集モードに入る/抜ける
  1433. //2.00Eで追加
  1434.     if (text->editmode != 0) {
  1435.         information("体裁・詳細モードではバイナリ編集モードの切り替えはできません");//3.00A2 970507 高速->体裁
  1436.         return FALSE;
  1437.     }
  1438. #if 0
  1439.     if (!text->fBinedit && !text->fEnvDev) {
  1440.         BOOL fOK = FALSE;
  1441.         #ifdef __FLAT__
  1442.         if (text->fTempMem) fOK = TRUE;
  1443.         #endif
  1444.         if (!fOK) {
  1445.             if (
  1446.                 question(
  1447.                     "64KBを越えるファイルをバイナリ編集すると、各行の行頭のアドレス表示が不正確になります。\n"
  1448.                     "WZ32を使用し[設定]-[編集]-[テンポラリファイル]を[作成しない]に設定すれば、\n"
  1449.                     "この制限はありません。\n"
  1450.                     "\nバイナリ編集しますか?"
  1451.                 ) != IDYES
  1452.             ) return FALSE;
  1453.         }
  1454.     }
  1455. #endif
  1456.     if (!txuiFlushFile(text)) return FALSE;
  1457.     IFILE adr = txGetAddress(text);
  1458.     txJumpFileTop(text);
  1459.     text->fBinedit = text->fBinedit ^ 1;
  1460.     text->fBinary = text->fBinedit;
  1461.     text->fConfigBinedit = text->fBinedit;//3.00C 971013 [ツール]-[追加機能]-[バイナリ/テキスト編集切替]で、バイナリ->テキストの切替ができなかった
  1462.     txReopenInternal(text);
  1463.     //
  1464.     text->fOverWrite = text->fBinedit;
  1465.     txFlush(text);
  1466.     txJumpAddress(text,adr);
  1467.     return TRUE;
  1468. }
  1469.  
  1470. //##メール
  1471. //2.90 
  1472.  
  1473. // whereis("c:\\*.*","wzeditor.exe",szdst)の様に使用。
  1474. static BOOL whereis(mchar *szpath,mchar *szfind,txstr szdst)
  1475. {
  1476.     #ifdef __FLAT__
  1477.     WIN32_FIND_DATA ffd;
  1478.     #else
  1479.     FILEFIND filefind;
  1480.     #endif
  1481.     mchar szfilename[CCHPATHNAME];
  1482.     
  1483.     // 通常ファイル
  1484.     strcpy(szfilename,szpath);
  1485.     #ifdef __FLAT__
  1486.     {
  1487.         HANDLE hfind = FindFirstFile(szpath,&ffd);
  1488.         if (hfind != INVALID_HANDLE_VALUE) {
  1489.             do {
  1490.                 if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue;
  1491.                 if (!stricmp(szfind,ffd.cFileName)) {
  1492.                     pathSetFileName(szfilename,ffd.cFileName);
  1493.                     szdst = szfilename;
  1494.                     return TRUE;
  1495.                 }
  1496.             } while(FindNextFile(hfind,&ffd));
  1497.             FindClose(hfind);
  1498.         }
  1499.     }
  1500.     #else
  1501.     if (!fileFindFirst(szpath,FA_NORMAL,&filefind)) {
  1502.         do {
  1503.             if (!stricmp(szfind,filefind.name)) {
  1504.                 pathSetFileName(szfilename,filefind.name);
  1505.                 szdst = szfilename;
  1506.                 return TRUE;
  1507.             }
  1508.         } while (!fileFindNext(&filefind));
  1509.     }
  1510.     #endif
  1511.     // サブディレクトリ
  1512.     {
  1513.         strcpy(szfilename,szpath);
  1514.         pathSetFileName(szfilename,"*.*");
  1515.         #ifdef __FLAT__
  1516.         {
  1517.             HANDLE hfind = FindFirstFile(szfilename,&ffd);
  1518.             if (hfind != INVALID_HANDLE_VALUE) {
  1519.                 do {
  1520.                     if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
  1521.                         if (ffd.cFileName[0] != '.') {
  1522.                             txstr szsubpath(CCHPATHNAME);
  1523.                             szsubpath = szpath;
  1524.                             pathSetFileName(szsubpath,ffd.cFileName + "\\" + pathGetFileName(szsubpath));
  1525.                             if (whereis(szsubpath,szfind,szdst)) return TRUE;
  1526.                         }
  1527.                     }
  1528.                 } while(FindNextFile(hfind,&ffd));
  1529.                 FindClose(hfind);
  1530.             }
  1531.         }
  1532.         #else
  1533.         if (!fileFindFirst(szfilename,FA_DIREC,&filefind)) {
  1534.             do {
  1535.                 if (filefind.attrib & FA_DIREC) {
  1536.                     if (filefind.name[0] != '.') {
  1537.                         txstr szsubpath(CCHPATHNAME);
  1538.                         szsubpath = szpath;
  1539.                         pathSetFileName(szsubpath,filefind.name + "\\" + pathGetFileName(szsubpath));
  1540.                         if (whereis(szsubpath,szfind,szdst)) return TRUE;
  1541.                     }
  1542.                 }
  1543.             } while (!fileFindNext(&filefind));
  1544.         }
  1545.         #endif
  1546.     }
  1547.     return FALSE;
  1548. }
  1549.  
  1550. #if 0
  1551. DWORD convprocIdMail(DWORD data,int mode)
  1552. {
  1553.     static int t[] = {
  1554.         MAIL_MSMAIL,MAIL_EUDORAPRO,MAIL_BECKY,
  1555.     };
  1556.     if (mode == TXDIALOG_READ) {
  1557.         return t[data];
  1558.     } else {
  1559.         int i;
  1560.         for (i = 0;i < 3;i++) {
  1561.             if (t[i] == data) return i;
  1562.         }
  1563.         return 0;
  1564.     }
  1565. }
  1566. #endif
  1567.  
  1568. #ifndef __FLAT__
  1569. extern "shell.dll" {
  1570.     #include <shellapi.h>
  1571. }
  1572. #endif
  1573.  
  1574. #define IDD_DROP        100
  1575.  
  1576. // 始めは、whereisでメーラのEXEを検索しようと思ったが、複数インストー
  1577. //ルされている場合、EXEがサーバーにある場合、にうまくいかないの
  1578. //で、アイコンをドロップしてもらうことにした。
  1579.  
  1580. static int mailerGetID(mchar* szfilename,mchar* szarg)
  1581. {
  1582.     if (pathEquFileName(szfilename,"explorer")) {
  1583.         if (szarg && strstr(szarg,"Internet Mail.{")) return MAIL_MSMAIL;
  1584.         return 0;
  1585.     }
  1586.     if (pathEquFileName(szfilename,"rebecca")) return MAIL_BECKY;
  1587.     if (pathEquFileName(szfilename,"eudora32")) return MAIL_EUDORAPRO;
  1588.     return 0;
  1589. }
  1590.  
  1591. static int mailerGetString(int id)
  1592. {
  1593.     switch(id) {
  1594.         case MAIL_MSMAIL: return "Internet Mail";
  1595.         case MAIL_BECKY: return "Becky!";
  1596.         case MAIL_EUDORAPRO: return "Eudora PRO";
  1597.     }
  1598.     return NULL;
  1599. }
  1600.  
  1601. static void settext(TX* text,TXCONFIGSHARE* shcfg)
  1602. {
  1603.     txSetEditmode(text,EDITMODE_TEXT);
  1604.     txDeleteText(text);
  1605.     txInsertLine(text,".メーラのアイコンをここにドロップしてください");
  1606.     txInsertLine(text,"[ヒント]スタートメニューからメーラを選択するには、スタートメニューを右クリックして[開く]を実行します。");
  1607.     //
  1608.     TXCONFIGSHARE *shcfg = &text->share->config;
  1609.     mchar* sz = mailerGetString(shcfg->idMailer);
  1610.     if (sz) {
  1611.         txInsertLine(text,"現在の設定は、「%s」(%s)です。",sz,shcfg->szMailer);
  1612.     } else if (shcfg->szMailer[0]) {
  1613.         txInsertLine(text,"現在の設定は、簡単送信未対応のメーラ(%s)です。",shcfg->szMailer);
  1614.     } else {
  1615.         txInsertLine(text,"現在は、設定されていません。");
  1616.     }
  1617.     txSetEditmode(text,EDITMODE_FORM);
  1618.     txJumpFileTop(text);
  1619. }
  1620.  
  1621. BOOL dlgprocConfigMailer(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  1622. {
  1623.     TXCONFIGSHARE *shcfg = &text->share->config;
  1624.     switch(message) {
  1625.         case WM_INITDIALOG: {
  1626.             HWND hctrl = GetDlgItem(hwnd,IDD_DROP);
  1627.             TX* text = (TX*)SendMessage(hctrl,TXWM_GETTX,0,0);
  1628.             DragAcceptFiles(text->hwndtext,TRUE);
  1629.             //
  1630.             text->fSetWidthByWindow = TRUE;
  1631.             text->fScrollBarH = FALSE;
  1632.             text->fScrollBarV = FALSE;
  1633.             text->fDispLine = FALSE;
  1634.             strcpy(text->tsztitle[0],".");
  1635.             text->fDispTitle = TRUE;
  1636.             text->fForm = TRUE;
  1637.             txFlush(text);
  1638.             //
  1639.             settext(text,shcfg);
  1640.             break;
  1641.         }
  1642.         case WM_TXUSER: {
  1643.             HWND hctrl = GetDlgItem(hwnd,IDD_DROP);
  1644.             TX* text = (TX*)SendMessage(hctrl,TXWM_GETTX,0,0);
  1645.             mchar szfilename[CCHPATHNAME];
  1646.             DragQueryFile((HDROP)wParam,0,szfilename,cchof(szfilename));
  1647.             DragFinish((HDROP)wParam);
  1648.             txstr szfullname(CCHPATHNAME);
  1649.             strcpy(szfullname,szfilename);
  1650.             if (pathIsExt(szfilename,".lnk")) {
  1651.                 txOp(text,TXOP_SHORTCUTRESOLVE,szfilename,(mchar*)szfullname);
  1652.                 mchar szarg[CCHPATHNAME];
  1653.                 if (txOp(text,TXOP_SHORTCUTGETARG,szfilename,szarg) && szarg[0]) {
  1654.                     shcfg->idMailer = mailerGetID(szfullname,szarg);
  1655.                     szfullname += " ";
  1656.                     szfullname += szarg;
  1657.                 } else {
  1658.                     shcfg->idMailer = mailerGetID(szfullname,NULL);
  1659.                 }
  1660.             } else {
  1661.                 shcfg->idMailer = mailerGetID(szfullname,NULL);
  1662.             }
  1663.             strcpymax(shcfg->szMailer,szfullname,cchof(shcfg->szMailer));
  1664.             settext(text,shcfg);
  1665.             break;
  1666.         }
  1667.     }
  1668.     return FALSE;
  1669. }
  1670.  
  1671. BOOL __wndproctext(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  1672. {
  1673.     switch(message) {
  1674.         case WM_DROPFILES: {
  1675.             if (GetParent(hwnd) != text->hwndbase) { // dialogなら...
  1676.                 SendMessage(GetParent(hwnd),WM_TXUSER,wParam,lParam);
  1677.                 return 0;
  1678.             }
  1679.         }
  1680.     }
  1681.     return FALSE;
  1682. }
  1683.  
  1684. #if 0    //2.99D 970331 廃止
  1685. configMailer
  1686. {
  1687.     HDIALOG hd = dialog("メーラの設定");
  1688.     int lx = 16;
  1689.     TXCONFIGSHARE *shcfg = &text->share->config;
  1690. #if 1
  1691.     dialogSetHookEx(hd,"\m.dlgprocConfigMailer");
  1692.     dialogCaption(hd,"WZから呼び出すメーラの指定:");
  1693.     DTRECT r;
  1694.     dialogGetPos(hd,&r);
  1695.     r.cx = DTCX * 60;
  1696.     r.cy = DTCY * 10;
  1697.     __dialogAddItem(hd,TXWS_SZCLASS,"",IDD_DROP,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_BORDER|WS_CHILD|WS_VISIBLE);
  1698.     dialogLF(hd);
  1699.     dialogCaption(hd,"WZのメニューから「ファイル|メール送信」を実行すると、指定したメーラを呼び出します。");
  1700.     dialogCaption(hd,"このときにWZで作成していた文書はクリップボードにコピーされます。");
  1701.     dialogCaption(hd,"メーラで、メッセージの作成を実行し、メッセージの入力ウィンドウでペーストすると、");
  1702.     dialogCaption(hd,"WZで作成した文書をコピーできます。");
  1703.     //
  1704.     macroHookWndText();
  1705.     int ret = dialogOpen(hd);
  1706.     macroHookWndTextFree();
  1707.     //
  1708.     if (ret) {
  1709.         txConfigOp(text,TXCONFIGOP_SHARESAVE,NULL);
  1710.     }
  1711.     return ret;
  1712. #else
  1713.     PMACROFUNC pfunc;
  1714.     macroGetFuncAddress("convprocIdMail",&pfunc);
  1715.     dialogControlConvert(hd,&pfunc);
  1716.     dialogSelectIDW(hd,"メーラ(&M):",&shcfg->idMailer,lx,20,"Internet Mail","Eudora PRO","Becky!");
  1717.     dialogStrC(hd,"コマンド名(&C):",shcfg->szMailer,lx,cchof(shcfg->szMailer),30);
  1718.     return dialogOpen(hd);
  1719. #endif
  1720. }
  1721. #endif
  1722.  
  1723. #define IDD_EMAIL        100
  1724. #define IDD_EMAIL_SEL    101
  1725.  
  1726. BOOL dlgprocConfigEmail(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  1727. {
  1728.     switch(message) {
  1729.         case WM_COMMAND: {
  1730.             int id = WM_COMMAND_GetId(wParam);
  1731.             if (id == IDD_EMAIL_SEL) {
  1732.                 TX* text = txuiAbNew();
  1733.                 if (text) {
  1734.                     txstr szEmail;
  1735.                     txAbSearchItem(text,"email",szEmail);
  1736.                     SetDlgItemText(hwnd,IDD_EMAIL,szEmail);
  1737.                     txAbDelete(text);
  1738.                 }
  1739.             }
  1740.             break;
  1741.         }
  1742.     }
  1743.     return FALSE;
  1744. }
  1745.  
  1746. BOOL TXAPI txuiInputEmail(TX* text,mchar* szCaption,txstr szEmail)
  1747. {
  1748.     HDIALOG hd = dialog(szCaption);
  1749.     dialogSetHookEx(hd,"\m.dlgprocConfigEmail");
  1750.     //
  1751.     dialogControlID(hd,IDD_EMAIL);
  1752.     dialogStr(hd,"E-mail(&E)アドレス:",szEmail,16,40);
  1753.     //
  1754.     dialogControlID(hd,IDD_EMAIL_SEL);
  1755.     dialogButton(hd,"住所録(&A)...",NULL,16);
  1756.     //
  1757.     if (dialogOpen(hd)) {
  1758.         if (szEmail[0]) return TRUE;
  1759.     }
  1760.     return FALSE;
  1761. }
  1762.  
  1763. permanent txstr p_szEmail;
  1764.  
  1765. #ifdef __FLAT__
  1766. static BOOL mailerExec(TX* text)
  1767. {
  1768.     //2.98 970310 renew
  1769.     if (!text->ehHwnd) {
  1770.     #if 1//2.99 970315 "mailto"を使う
  1771.         // 送信先E-mailアドレスの指定
  1772.         if (txuiInputEmail(text,"メール送信先",p_szEmail)) {
  1773.             // クリップボードへコピー。
  1774.             txClipCopy(text,0,txGetTextSize(text),HCLIP_WIN,CLIP_CHAR);
  1775.             TXCONFIGSHARE *shcfg = &text->share->config;
  1776.             // 起動
  1777.             text->share->fehSendMailDoing = TRUE;
  1778.             text->share->wtmSendMailStart = GetCurrentTime();
  1779.             if (shcfg->idMailer == MAIL_BECKY) {//2.99 970315 
  1780.                 WinExec(shcfg->szMailer + " /A" + p_szEmail,SW_SHOWNORMAL);
  1781.             } else {
  1782.                 ShellExecute(text->hwndbase,"open","mailto:" + p_szEmail,NULL,NULL,SW_SHOWNORMAL);
  1783.             }
  1784.         }
  1785.     #else
  1786.         // クリップボードへコピー。
  1787.         txClipCopy(text,0,txGetTextSize(text),HCLIP_WIN,CLIP_CHAR);
  1788.         TXCONFIGSHARE *shcfg = &text->share->config;
  1789.         // 起動。
  1790.         mchar* szAdr = "test@domain.co.jp";
  1791.         if (shcfg->idMailer == MAIL_BECKY) {//2.99 970315 
  1792.             WinExec(shcfg->szMailer + " /A" + szAdr,SW_SHOWNORMAL);
  1793.         } else {
  1794.             #if 1//2.99 970315 
  1795.             // "mailto"の場合はアドレスも指定する必要あり。
  1796.             ShellExecute(text->hwndbase,"open","mailto:" + szAdr,NULL,NULL,SW_SHOWNORMAL);
  1797.             #else
  1798.             WinExec(shcfg->szMailer,SW_SHOWNORMAL);
  1799.             #endif
  1800.         }
  1801.         return TRUE;
  1802.     #endif
  1803.     }
  1804.     return FALSE;
  1805. }
  1806. #endif
  1807.  
  1808. BOOL TXCMDBASE sendMail(TX* text)
  1809. {
  1810. // メール送信
  1811. //2.90 [ファイル]-[送信]コマンド追加
  1812. #if 1//2.90 
  1813.     #ifdef __FLAT__
  1814.         if (!textGetStayAlways()) {
  1815.             //2.99C 970326 WZが常駐してないときはメール送信できないようにした
  1816.         #if 1//2.99D 970402 具合がよくないのですぐ終わる
  1817.             information("メールを送信するには、WZを常駐させてください。\n");
  1818.             return FALSE;
  1819.         #else
  1820.             int ret = question(
  1821.                 "メールを送信するには、WZを常駐させてください。\n"
  1822.                 "WZを常駐しますか?"
  1823.             );
  1824.             if (ret == IDYES) {
  1825.                 stay();
  1826.             } else {
  1827.                 return FALSE;
  1828.             }
  1829.         #endif
  1830.         }
  1831.         if (!text->share->config.fEnableEhMail) {//2.99I 970405 WZを常駐してても「メーラのフックを行う」がOFFだとメール送信できないので、メッセージを出すようにした。
  1832.             information(
  1833.                 "WZからメールを送信するには、常駐WZで[メーラのフックを行う]オプションをONにしてください。\n"
  1834.                 "このオプションを指定するには、タスクバーに常駐している常駐WZを右クリックして、設定を選んでください。\n"
  1835.             );
  1836.             return FALSE;
  1837.         }
  1838.         if (text->modeMail) {//2.98 970310 メーラのエディタフック起動の場合
  1839.             if (text->fEdit) txuiSave(text);
  1840.             return txuiClose(text);
  1841.         } else {
  1842.         #if 1//2.99 970315 
  1843.             return mailerExec(text);
  1844.         #else
  1845.             TXCONFIGSHARE *shcfg = &text->share->config;
  1846.             if (!shcfg->szMailer[0]) {
  1847.                 if (!configMailer()) return FALSE;
  1848.                 if (!shcfg->szMailer[0]) return FALSE;
  1849.             }
  1850.             return mailerExec(text);
  1851.         #endif
  1852.         }
  1853.     #else
  1854.         information(
  1855.             "WZ16ではメール送信は行えません。\n"
  1856.             "WZからメールを送信するには、WZ32で行ってください。"
  1857.         );
  1858.         return FALSE;
  1859.     #endif
  1860. #else
  1861.     // exchangeを使ってメールを送信します。
  1862.     // 実行前にexchangeを起動しておいてください。
  1863.     //2.00Eで追加
  1864.     #ifdef __FLAT__
  1865.         return txSendMail(text);
  1866.     #else
  1867.         information("WZ16ではメール送信は使えません");
  1868.         return FALSE;
  1869.     #endif
  1870. #endif
  1871. }
  1872.  
  1873.