home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2002 January / VPR0201B.ISO / APUPDATE / VC / TXC0601A / TXC0601A.LZH / _IDMFILE.C < prev    next >
C/C++ Source or Header  |  2001-04-19  |  26KB  |  1,031 lines

  1. /*
  2.     FILE関係のIDMコマンド処理群
  3.         Start 99年11月19日
  4. */
  5.  
  6. #if __TXC__
  7.     #include <_wz.h>
  8.     #include <windows.h>
  9.     #include <windowsx.h>
  10.     #include <_idm.h>
  11. #else
  12.     #include "_sys.h"
  13. #endif
  14. #include "_idmlib.h"
  15.  
  16. //##基本
  17.  
  18. #if WZFUNC_EDITOR
  19. BOOL txuiFileOpenPrim(TX* text,int modeFileOpen,TXOFN_ARG* arg)
  20. {
  21. // text=NULLでもいい
  22.     wchar wszfilename[CCHPATHNAME] = {0};
  23. #if 0//WCE0.99A 970924 2回聞いてた
  24.     if (sh->modeFileOpen == FILEOPEN_CLOSEOPEN && text) {
  25.         if (!txuiIsClose(text)) return FALSE;
  26.     }
  27. #endif
  28.     //WCE0.91 970906 「ファイル|最近開いたファイル」で「開く」をするとアプリケーションエラーになった
  29.     if (text) wstrcpy(wszfilename,text->wszfilename);
  30.     #if WINDOWSCE    //WZ4.00Ac 990205 PWZ:無題ファイルやWZ ICONから「ファイルを開く」したとき、標準フォルダを始めに表示するようにした。
  31.     if (wszfilename[0] == 0) {pathtowpath(sh->szFolderDefault,wszfilename);wpathSetDir(wszfilename);}
  32.     #endif
  33.     if (txuiGetOpenFileNameW(text,wszfilename,NULL,arg)) {
  34. //winformation(wszfilename);
  35. #if 0    //WCE0.95 970923 「ファイル|開く」でEXEファイルを指定すると、EXEが起動した
  36.         if (wpathIsExt(wszfilename,L".exe")) {
  37.             shellOpenW(wszfilename);
  38. //winformation(wszfilename);
  39.             return FALSE;
  40.         }
  41. #endif
  42.         forkstdPrimW(wszfilename,(arg && arg->fReadonly) ? (UNIX?L"-v":L"/v") : NULL,modeFileOpen);
  43. //        osExecW(wszfilename);
  44.         return TRUE;
  45.     }
  46.     return FALSE;
  47. }
  48. #endif
  49.  
  50. //##保存
  51.  
  52. static BOOL alltextGetEdit(void)
  53. {
  54.     int i;
  55.     for (i = 0;i < sh->nOpen;i++) {
  56.         HWND cur = textRead(i);
  57.         if (cur && SendMessage(cur,WM_TXGETEDIT,0,0)) {
  58.             return TRUE;
  59.         }
  60.     }
  61.     return FALSE;
  62. }
  63.  
  64. static BOOL alltextSave(void)
  65. {
  66.     int i;
  67.     for (i = 0;i < sh->nOpen;i++) {
  68.         HWND cur = textRead(i);
  69.         if (cur && SendMessage(cur,WM_TXGETEDIT,0,0)) {
  70.             if (!SendMessage(cur,WM_TXUISAVE,0,0)) return FALSE;
  71.         }
  72.     }
  73.     return TRUE;
  74. }
  75.  
  76. static BOOL uialltextSave(void)
  77. {
  78.     if (alltextGetEdit()) {
  79.         int ret = question("修正テキストを出力しますか?");
  80.         if (ret == IDCANCEL) return FALSE;
  81.         if (ret == IDYES) {
  82.             if (!alltextSave()) return FALSE;
  83.         }
  84.     }
  85.     return TRUE;
  86. }
  87.  
  88. BOOL txIDM_UISAVEALL(TX* text)
  89. {
  90.     if (!text->fFrame) return FALSE;
  91.     alltextSave();
  92.     return TRUE;
  93. }
  94.  
  95. BOOL txIDM_UISAVE(TX* text)
  96. {
  97.     return txuiSave(text);
  98. }
  99.  
  100. BOOL txIDM_UISAVEEDITED(TX* text)
  101. {
  102.     if (txGetEdit(text)) return txuiSave(text);
  103.     return FALSE;
  104. }
  105.  
  106. #if WZFUNC_EDITOR
  107. BOOL txIDM_UISAVEAS(TX* text)
  108. {
  109.     if (!text->fFrame) return FALSE;//WCE0.92 970918 
  110.     txuiSaveAs(text);
  111.     return TRUE;
  112. }
  113.  
  114. BOOL txIDM_UISAVEASVZ(TX* text)
  115. {
  116.     if (!text->fFrame) return FALSE;//WCE0.92 970918 
  117.     if (text->mailedit) {
  118.         //WZ3.90P 981205 MAIL EDITORでVZキーのEsc-Sで上書き保存するとMAIL EDITOR終了時に書きこみエラーでハングアップ
  119.         //WZ3.90P 981205 MAIL EDITORではEsc-Sの操作をできなくした。
  120.         if (question("上書き保存します。\nよろしいですか?") == IDYES) {
  121.             txuiSave(text);
  122.         }
  123.     } else {
  124.         txuiSaveAsVz(text);
  125.     }
  126.     return TRUE;
  127. }
  128. #endif
  129.  
  130. //##閉じる
  131.  
  132. void txIDM_PRJ_SAVERESUME(TX* text);
  133.  
  134. static BOOL alltextQuit(TX* text)
  135. {
  136. //WZ4.00Dd 000526 newarg:text for txIDM_PRJ_SAVERESUME
  137.     int i;
  138.     #if !WINDOWSCE && WZFUNC_EDITOR
  139.     txIDM_PRJ_SAVERESUME(text);    //WZ4.00Dd 000526 
  140.     #endif
  141.     for (i = 0;i < sh->nOpen;i++) {
  142.         HWND cur = textRead(i);
  143.         if (cur) {
  144.             PostMessage(cur,WM_TXQUITMT,0,0);    //WZ4.00Ec 010124 IDM_UIQUITALL等で多重化テキストが閉じないのを改良
  145.         }
  146.     }
  147.     return TRUE;
  148. }
  149.  
  150. static BOOL txuiQuit(TX* text)
  151. {
  152. // テキストを終了する。エラーなら0を返す
  153.     if (!text->fReadOnly && txGetEdit(text)) {
  154.         if (wquestion(rcStringW(32),txGetTitleFilenameW(text)) != IDYES) return FALSE;
  155.     }
  156.     txQuit(text);
  157.     return TRUE;
  158. }
  159.  
  160. #if WZFUNC_EDITOR
  161. BOOL txIDM_UICLOSEALLVZ(TX* text)
  162. {
  163. // エディタを終了(確認メッセージ付き)
  164.     if (!text->fFrame) return FALSE;//WCE0.92 970918 
  165.     if (!uialltextSave()) return FALSE;
  166.     if (question("エディタを終了しますか?") == IDYES) return alltextQuit(text);
  167.     return FALSE;
  168. }
  169. #endif
  170.  
  171. BOOL txIDM_UICLOSEALLFORCE(TX* text)
  172. {
  173. // 修正テキストは全保存して終了
  174. //WZ3.90I 981103 new
  175.     if (!text->fFrame) return FALSE;
  176.     if (alltextSave()) {
  177.         alltextQuit(text);
  178.         return TRUE;
  179.     }
  180.     return FALSE;
  181. }
  182.  
  183. BOOL txIDM_UIQUITALL(TX* text)
  184. {
  185. // 「終了してよいですか?」
  186.     if (!text->fFrame) return FALSE;//WCE0.92 970918 
  187.     if (alltextGetEdit()) {
  188.         if (question(rcString(37)) != IDYES) return FALSE;
  189.     }
  190.     alltextQuit(text);
  191.     return TRUE;
  192. }
  193.  
  194. BOOL txIDM_UISAVECLOSE(TX* text)
  195. {
  196.     if (!text->fFrame) return FALSE;
  197.     if (txuiSave(text)) {
  198.         txuiClose(text);
  199.         return TRUE;
  200.     }
  201.     return FALSE;
  202. }
  203.  
  204. BOOL txIDM_UIQUIT(TX* text)
  205. {
  206.     if (!text->fFrame) return FALSE;//WCE0.92 970918 
  207.     txuiQuit(text);
  208.     return TRUE;
  209. }
  210.  
  211. BOOL txIDM_UIEXIT(TX* text)
  212. {
  213.     if (!text->fFrame) return FALSE;//WCE0.92 970918 
  214.     txuiCloseAllEvery(text);
  215.     return TRUE;
  216. }
  217.  
  218. BOOL txIDM_UICLOSE(TX* text)
  219. {
  220.     if (!text->fFrame) return FALSE;//WCE0.92 970918 
  221.     txuiClose(text);
  222.     return TRUE;
  223. }
  224.  
  225. //##開く
  226. #if WZFUNC_EDITOR
  227. BOOL txIDM_UICLOSEOPEN(TX* text)
  228. {
  229.     if (!text->fFrame) return FALSE;//WCE0.92 970918 
  230.     if (txuiIsClose(text)) {    //WZ3.90L 981125 閉じて開く:保存するかの問い合わせを先に行うようにした。
  231.         txuiFileOpenPrim(text,FILEOPEN_CLOSEOPENFORCE,NULL);
  232.         return TRUE;
  233.     }
  234.     return FALSE;
  235. }
  236. void txNew(TX* text,BOOL fNewProcess)
  237. {
  238. // fNewProcessなら必ず新規プロセスを立ち上げる
  239. // そうでなければ、設定による
  240. // textはNULLでもいい
  241.     wchar szSw[10 + CCHPATHNAME] = {0};
  242.     if (text) {
  243.         // 拡張子情報の継承
  244.     #if UNIX
  245.         sprintf_W(szSw,L"-e\"%s\"",txGetFileExtW(text));
  246.     #else
  247.         sprintf_W(szSw,L"/e\"%s\"",txGetFileExtW(text));
  248.     #endif
  249.     };
  250.     if (fNewProcess) {
  251.         forkexW(NULL,szSw,TXFORK_FORKWZ,NULL);
  252.     } else {
  253.         forkstdW(NULL,szSw);
  254.     }
  255. }
  256. BOOL txIDM_NEW(TX* text)
  257. {
  258.     txNew(text,FALSE);
  259.     return TRUE;
  260. }
  261. BOOL txIDM_NEWPROCESS(TX* text)
  262. {
  263.     txNew(text,TRUE);
  264.     return TRUE;
  265. }
  266. #if !__TXC__
  267. BOOL TXAPI txuiFileOpen(TX* text)
  268. {
  269. // text=NULLでもいい
  270. //WZ3.90J 981111 argを指定 for コモンファイルオープンダイアログ
  271.     TXOFN_ARG arg;
  272.     structClear(arg);
  273.     arg.fEnableFiler = TRUE;    //WZ4.00Bn 991006 
  274.     return txuiFileOpenPrim(text,sh->modeFileOpen,&arg);
  275. }
  276. BOOL TXAPI txuiFileOpenVz(TX* text)
  277. {
  278.     TXOFN_ARG arg;
  279.     structClear(arg);arg.fOpenVz = TRUE;
  280.     arg.fEnableFiler = TRUE;    //WZ4.00Bn 991006 
  281.     return txuiFileOpenPrim(text,sh->modeFileOpen,&arg);
  282. }
  283. #endif    // !__TXC__
  284. BOOL txuiFileOpenReadVz(TX* text)
  285. {
  286. //WZ3.90I 981103 
  287.     TXOFN_ARG arg;
  288.     structClear(arg);arg.fOpenVz = TRUE;arg.fReadonly = TRUE;
  289.     arg.fEnableFiler = TRUE;    //WZ4.00Bn 991006 
  290.     return txuiFileOpenPrim(text,sh->modeFileOpen,&arg);
  291. }
  292. BOOL txIDM_UIOPEN(TX* text)
  293. {
  294.     return txuiFileOpen(text);
  295. }
  296. BOOL txIDM_UIOPENVZ(TX* text)
  297. {
  298.     return txuiFileOpenVz(text);
  299. }
  300. BOOL txIDM_UIOPENREADVZ(TX* text)
  301. {
  302.     return txuiFileOpenReadVz(text);
  303. }
  304. BOOL uiOpenHistFile(void)
  305. {
  306.     mchar* sz = dialogaSelHistEx("最近使ったファイル",HIST_FILE,SELHIST_FILEOPEN,NULL);
  307.     if (sz) {
  308.         wchar szfilename[CCHPATHNAME];
  309.         strtowstr(sz,-1,szfilename,CCHPATHNAME);
  310.         forkstdW(szfilename,NULL);
  311.         return TRUE;
  312.     }
  313.     return FALSE;
  314. }
  315. BOOL txIDM_UIOPENHIST(TX* text)
  316. {
  317.     return uiOpenHistFile();
  318. }
  319. #if !WINDOWSCE
  320. BOOL txIDM_DUP(TX* text)
  321. {
  322.     if (text->wszfilename[0]) {    //XZ0.20 990713 無題ファイルはIDM_DUPできないようにした。
  323.         #if UNIX
  324.         if (text->fFrame) forkstdW(text->wszfilename,L"-gd -v");
  325.         #else
  326.         if (text->fFrame) forkstdW(text->wszfilename,L"/gd /v");
  327.         #endif
  328.         return TRUE;
  329.     }
  330.     return FALSE;
  331. }
  332. #endif
  333. BOOL txIDM_UIGENE(TX* text)
  334. {
  335.     txuiGene(text);
  336.     return TRUE;
  337. }
  338. #endif    // WZFUNC_EDITOR
  339.  
  340. BOOL txIDM_UIREOPEN(TX* text)
  341. {
  342.     return txuiReopenInternal(text);
  343. }
  344.  
  345. #if !WINDOWSCE && WZFUNC_EDITOR
  346. BOOL txIDM_OPENBACKUP(TX* text)
  347. {
  348.     if (!txAutosaveAtOpenEx(text,AUTOSAVE_OPEN_UIBACKUPFORCE)) {
  349.         wchar wsz[CCHPATHNAME];
  350.         if (txGetBackupFilenameW(text,text->wszfilename,wsz)) {
  351.             forkstdW(wsz,NULL);
  352.             return TRUE;
  353.         }
  354.     }
  355.     return FALSE;
  356. }
  357. #endif
  358.  
  359. //##新規作成ウィザード
  360. //WZ3.90J 981112 new
  361.  
  362. #if !__TXC__ && WZFUNC_EDITOR
  363.  
  364. enum {IDD_EXT=100};
  365. typedef struct {
  366.     mchar szcfg[CCHWORD];
  367. } DIALOG_UINEW;
  368.  
  369. BOOL CALLBACK dlgprocUiNew(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  370. {
  371.     HDIALOG hd = dialogFromHwnd(hwnd);
  372.     DIALOG_UINEW* context = dialogGetCustdata(hd);
  373.     switch(message) {
  374.         case WM_INITDIALOG: {
  375.             PostMessage(hwnd,WM_TXUSER,0,0);
  376.             break;
  377.         }
  378.         case WM_TXUSER: {
  379.             HWND hctrl = GetDlgItem(hwnd,IDD_LIST);
  380.             configtxMakeList(hctrl,MAKELIST_LISTBOX|CFGLIST_NAME);
  381.             ListBox_SetCurSel(hctrl,0);
  382.             FORWARD_WM_COMMAND(hwnd,IDD_LIST,hctrl,LBN_SELCHANGE,PostMessage);
  383.             break;
  384.         }
  385.         case WM_COMMAND: {
  386.             int id = GET_WM_COMMAND_ID(wParam,lParam);
  387.             int cmd = GET_WM_COMMAND_CMD(wParam,lParam);
  388.             switch(id) {
  389.                 case IDD_LIST: {
  390.                     if (cmd == LBN_SELCHANGE) {
  391.                         HWND hctrl = GetDlgItem(hwnd,id);
  392.                         int isel = ListBox_GetCurSel(hctrl);
  393.                         if (isel >= 0) {
  394.                             mchar szName[CCHWORD];
  395.                             ListBox_GetItemText_A(hctrl,isel,szName,CCHWORD);
  396.                             sstrcpy(context->szcfg,szName);
  397. //printf("%s\n",szName);
  398.                             {
  399.                                 HSTRBLK sb = sbNewAllocEx(1024);
  400.                                 configtxMakeList(sb,MAKELIST_STRBLK|CFGLIST_ALL);
  401.                                 {
  402.                                     int i;
  403.                                     for (i = 0;;i++) {
  404.                                         mchar* szItem = sbRead(sb,i);
  405.                                         if (!szItem) break;
  406.                                         {
  407.                                             int lch = csszGetWordLen(szItem);
  408.                                             if (lch == strlen(szName) && !strnicmp(szName,szItem,lch)) {
  409.                                                 mchar* p = csszGetWordTop(szItem + lch);
  410.                                                 HSTRBLK sbExt = dialogGetItemStrblk(hd,IDD_EXT);
  411.                                                 sbDelAll(sbExt);
  412. //statprintf(szItem);
  413.                                                 while(1) {
  414.                                                     int lch = csszGetWordLen(p);
  415.                                                     if (!lch) break;
  416.                                                     {
  417.                                                         mchar* szAlloc = strdupLen(p,lch);
  418. //information(szAlloc);
  419.                                                         sbAdd(sbExt,szAlloc);
  420.                                                         free(szAlloc);
  421.                                                     }
  422.                                                     p = csszGetWordTop(p + lch);
  423.                                                 }
  424.                                                 dialogWriteItem(hd,IDD_EXT);
  425.                                                 {
  426.                                                     mchar* p = sbRead(sbExt,0);
  427.                                                     SetDlgItemText_A(hwnd,IDD_EXT,p ? p : ".txt");
  428.                                                 }
  429.                                                 break;
  430.                                             }
  431.                                         }
  432.                                     }
  433.                                 }
  434.                                 sbDelete(sb);
  435.                             }
  436.                         }
  437.                     }
  438.                     break;
  439.                 }
  440.             }
  441.             break;
  442.         }
  443.     }
  444.     return FALSE;
  445. }
  446.  
  447. BOOL txuiNew(TX* text)
  448. {
  449. // textはNULLでも可
  450.     BOOL ret = FALSE;
  451.     HDIALOG hd = dialog("新規作成");
  452.     mchar szExt[CCHWORD] = {0};
  453.     HSTRBLK sb = sbNewAllocEx(1024);
  454.     int idList;
  455.     DIALOG_UINEW context;
  456.     //
  457.     dialogSetDlgproc(hd,dlgprocUiNew);
  458.     structClear(context);
  459.     dialogSetCustdata(hd,&context);
  460.     //
  461.     dialogControlID(hd,IDD_LIST);
  462. //    dialogControlStyle(hd,LBS_STANDARD|WS_GROUP|WS_TABSTOP|WS_CHILD|WS_VISIBLE);
  463.     idList = dialogAddListbox(hd,"一覧(&L):",30,WINDOWSCE ? 5 : 10);
  464.     dialogSetNotifyAsOK(hd,idList,LBN_DBLCLK);    //WZ4.00Be 990512 
  465.     dialogControlStyle(hd,0);
  466.     //
  467.     dialogControlStrblk(hd,sb);
  468.     dialogControlID(hd,IDD_EXT);
  469.     dialogString(hd,"拡張子(&E):",10,szExt,CCHWORD,19);
  470.     //
  471.     if (dialogOpen(hd)) {
  472.         mchar sw[CCHWORD];
  473.     #if UNIX
  474.         sprintf_A(sw,"-e\"%s\" -cfg\"%s\"",szExt,context.szcfg);
  475.     #else
  476.         sprintf_A(sw,"/e\"%s\" /cfg\"%s\"",szExt,context.szcfg);
  477.     #endif
  478. //information(sw);
  479.         forkstd(NULL,sw);
  480.         ret = TRUE;
  481.     }
  482.     sbDelete(sb);
  483.     return ret;
  484. }
  485.  
  486. BOOL txIDM_UINEW(TX* text)
  487. {
  488.     return txuiNew(text);
  489. }
  490.  
  491. #endif // !__TXC__
  492.  
  493. //##プロジェクト
  494. //WZ3.90I 981030 start
  495. #if !WINDOWSCE && WZFUNC_EDITOR
  496.  
  497. void txProjectOpen(TX* text)
  498. {
  499.     txJumpFileTop(text);
  500.     while(1) {
  501.         if (txGetChar(text) == '#') {
  502.             // コメント
  503.         } else {
  504.             txJumpTagPrim(text,1);
  505.         }
  506.         if (!txNextPara(text)) break;
  507.     }
  508. }
  509.  
  510. static BOOL txProjectSearch(TX* text,mchar* sz)
  511. {
  512.     int len = strGetWordLen(sz);
  513.     txJumpFileTop(text);
  514.     while(1) {
  515.         if (txCmpIParatopLen(text,sz,len)) return TRUE;
  516.         if (!txNextPara(text)) break;
  517.     }
  518.     return FALSE;
  519. }
  520.  
  521. BOOL txuiProject(TX* text,int mode)
  522. {
  523. // mode=0:開く
  524. // mode=1:保存
  525. // mode=2:追加
  526. // mode=3:RESUME用に保存    //WZ4.00Dd 000526 
  527. // mode=4:RESUMEを開く        //WZ4.00Dd 000526 
  528.     wchar wszfilename[CCHPATHNAME];
  529.     //
  530.     if (mode == 3 || mode == 4) {
  531.         wpathFullConfig(wszfilename,L"resume.tpj");
  532.         mode = (mode == 3) ? 1 : 0;
  533.     } else {
  534.         TXOFN_ARG arg;
  535.         //
  536.         wstrcpy(wszfilename,text->wszfilename);
  537.         if (wszfilename[0] == 0) {
  538.             wpathSetDefault(wszfilename);
  539.         }
  540.         #if !__TXC__
  541.         {    // プロジェクト保存のフォルダを指定できるようにした
  542.             CONFIGAPP app;
  543.             configappLoad(&app);
  544.             if (app.prj_path[0]) {
  545.                 pathtowpath(app.prj_path,wszfilename);
  546.                 wpathSetDir(wszfilename);
  547.             }
  548.         }
  549.         #endif // !__TXC__
  550.         wpathSetFileName(wszfilename,L"*.tpj");
  551.         //
  552.         structClear(arg);
  553.         if (mode == 0) {
  554.         } else {
  555.             arg.fSaveAs = TRUE;
  556.             if (mode == 2) arg.fNoOverwriteConfirm = TRUE;
  557.         }
  558.         //
  559.         {
  560.             static wchar* tsz[] = {L"プロジェクトを開く",L"プロジェクトを保存",L"プロジェクトに追加"};
  561.             DWORD ret = FALSE;
  562.             if ((mode == 1 || mode == 2) && sh->szfilenamePrj[0]) {
  563.                 //WZ4.00Dd 000526 プロジェクトを開いた後に、プロジェクトの保存や追加を行うと、開いたプロジェクトファイルに保存や追加が簡単に行えるようにした。
  564.                 mchar* op = (mode==1) ? "保存" : "追加";
  565.                 int q = question("前回開いた次のプロジェクトファイルに%sしますか?\n    %s\n\n別のファイルに%sするには[いいえ]を選択してください。",op,sh->szfilenamePrj,op);
  566.                 if (q == IDCANCEL) return FALSE;
  567.                 if (q == IDYES) {
  568.                     ret = TRUE;
  569.                     pathtowpath(sh->szfilenamePrj,wszfilename);
  570.                 }
  571.             }
  572.             if (!ret) ret = txuiGetOpenFileNameW(text,wszfilename,tsz[mode],&arg);
  573.             if (!ret) return FALSE;
  574.         }
  575.     }
  576. //winformation(wszfilename);
  577.     if (mode == 0) {
  578.         TX* text2 = textopenW(wszfilename);
  579.         wpathtopath(wszfilename,sh->szfilenamePrj);
  580.         txProjectOpen(text2);
  581.         textclose(text2);
  582.     } else {
  583.         TX* text2 = textopenW(wszfilename);
  584.         HWND hwnd = CreateWindow_W(
  585.             L"LISTBOX",NULL,WS_CHILD,
  586.             0,0,0,0,
  587.             text->hwndbase,0,_hinstance,NULL
  588.         );
  589. //if (hwnd) beep();
  590.         if (mode == 1) {
  591.             txDeleteText(text2);
  592.         }
  593.         {
  594.             HWND cur = wndtxGetLast();
  595.             for (;cur;cur = wndtxGetPrev(cur)) {
  596.                 TXSWL_LPARAM arg;
  597.                 structClear(arg);
  598.                 arg.mode = TXSWL_PRJ;
  599.                 SendMessage(cur,WM_TXSETWINDOWLIST,hwnd,*(LPARAM*)&arg);
  600.             }
  601.             {
  602.                 int n = ListBox_GetCount(hwnd);
  603.                 int i;
  604.                 for (i = 0;i < n;i++) {
  605.                     mchar buff[1024];
  606.                     ListBox_GetItemText_A(hwnd,i,buff,cchof(buff));
  607.                     if (mode == 2) {
  608.                         if (txProjectSearch(text2,buff)) txDeletePara(text2);
  609.                         txJumpFileEnd(text2);
  610.                     }
  611.                     txInsert(text2,buff);txInsertReturn(text2);
  612.                 }
  613.             }
  614.         }
  615.         DestroyWindow(hwnd);
  616. //dialogaText(text2,NULL);
  617.         txSave(text2);
  618.         textclose(text2);
  619.     }
  620.     return TRUE;
  621. }
  622.  
  623. BOOL txIDM_PRJ_UIOPEN(TX* text)
  624. {
  625.     return txuiProject(text,0);
  626. }
  627.  
  628. BOOL txIDM_PRJ_UISAVE(TX* text)
  629. {
  630.     return txuiProject(text,1);
  631. }
  632.  
  633. BOOL txIDM_PRJ_UISAVEADD(TX* text)
  634. {
  635.     return txuiProject(text,2);
  636. }
  637.  
  638. BOOL txIDM_RESUME(TX* text)
  639. {
  640. //WZ4.00Dd 000526 new
  641.     return txuiProject(text,4);
  642. }
  643.  
  644. void txIDM_PRJ_SAVERESUME(TX* text)
  645. {
  646. //WZ4.00Dd 000526 new
  647.     txuiProject(text,3);
  648. }
  649.  
  650. #endif    // !WINDOWSCE
  651.  
  652. //##バイナリ編集
  653.  
  654. #if !WINDOWSCE && WZFUNC_EDITOR
  655.  
  656. int txuiFlushFile(TX* text)
  657. {
  658. // テキストが編集されていたら、保存するかどうかのメッセージボックスを出して
  659. // [はい]なら保存してIDYES、[いいえ]ならIDNO、[キャンセル]ならFALSEを返す。
  660. // テキストが編集されていなかったらIDOKを返す。
  661. //WZ3.90I 981101 new
  662.     if (!text->fReadOnly && txGetEdit(text)) {
  663.         int ret = wquestion(L"%sは更新されています。保存しますか?",txGetTitleFilenameW(text));
  664.         if (ret == IDYES) {
  665.             if (txuiSave(text)) return IDYES;
  666.             return FALSE;
  667.         } else if (ret == IDNO) {
  668.             return IDNO;
  669.         } else {
  670.             return FALSE;
  671.         }
  672.     }
  673.     return IDOK;
  674. }
  675.  
  676. BOOL txIDM_SWITCHBINARY(TX* text)
  677. {
  678.     IFILE adr = txGetAddress(text);
  679. //    if (text->fMemo) return FALSE;    //WZ4.00Dd 000601 
  680.     if (!text->fFrame) return FALSE;    //WZ4.00Eb 001223 GREP等でIDM_SWITCHBINARYできないようにした。
  681.     if (!txuiFlushFile(text)) return FALSE;
  682.     txJumpFileTop(text);
  683.     text->fBinedit ^= TRUE;
  684.     text->fBinary = text->fBinedit;
  685.     txReopenInternalExW(text,NULL,FALSE,NULL);
  686.     //
  687.     text->fOverWrite = text->fBinedit;
  688.     text->fCountNline = text->fBinedit;
  689.     txFlush(text);
  690.     txJumpAddress(text,adr);
  691.     if (text->ly < txGetLyCenter(text)) txSetLyCenter(text);    //WZ4.00Ec 010124 バイナリ切替したとき、内容が空でないのに、EOF位置でly=0になって空テキストのように見える場合があるのをとりあえず改良。
  692.     if (text->fBinedit) {
  693.         wndImeSetOpen(text->hwndtext,FALSE);
  694.     }
  695.     return TRUE;
  696. }
  697.  
  698. #endif    // !WINDOWSCE
  699.  
  700. //##ウィンドウ
  701.  
  702. static BOOL _next(TX* text,int d)
  703. {
  704.     int nMax = sh->nOpen;
  705.     if (IsIconic(text->hwndbase) || !IsWindowVisible(text->hwndbase) || nMax <= 1) return FALSE;
  706.     {
  707.         int idx = textSearch(text->hwndbase);
  708.         if (idx >= 0) {
  709.             do {
  710.                 idx += d;
  711.                 if (idx < 0) idx = nMax - 1;
  712.                 idx %= nMax;
  713.                 {
  714.                     HWND cur = textRead(idx);
  715.                     if (cur && !IsIconic(cur) && IsWindowVisible(cur)) {
  716.                         wndtxSetActive(cur);
  717.                         return TRUE;
  718.                     }
  719.                 }
  720.             } while (text->hwndbase != textRead(idx));
  721.         }
  722.     }
  723.     return FALSE;
  724. }
  725.  
  726. BOOL txIDM_NEXTWINDOW(TX* text)
  727. {
  728. //WZ3.90L 981125 new
  729.     return _next(text,1);
  730. }
  731.  
  732. BOOL txIDM_PREVWINDOW(TX* text)
  733. {
  734. //WZ3.90L 981125 new
  735.     return _next(text,-1);
  736. }
  737.  
  738. //##その他
  739.  
  740. #if !WINDOWSCE
  741. BOOL txIDM_HTML_BROWSER(TX* text)
  742. {
  743. //WZ4.00Bl 990908 _html.cから移動
  744. //WZ4.00Bl 990908 (!PWZ)IDM_HTML_BROWSERをTEXT_HTML以外のテキストでも使えるようにした。ユーザ要望。
  745.     if (text->fEdit) {
  746.         int ret = question("%sは変更されています。\n保存しますか?",text->szfilename);
  747.         if (ret == IDCANCEL) return FALSE;
  748.         if (ret == IDYES) {
  749.             if (!txuiSave(text)) return FALSE;
  750.         }
  751.     }
  752.     #if !UNIX
  753.     return osOpenURL(text->szfilename,text->hwndbase);
  754.     #endif
  755. }
  756. #endif    // !WINDOWSCE
  757.  
  758. #if !__TXC__
  759. BOOL TXAPI txuiInsertFile(TX* text)
  760. {
  761. // 複数ファイルの指定はできない
  762.     wchar wszfilename[CCHPATHNAME] = {0};
  763.     DWORD ret;
  764.     wstrcpy(wszfilename,text->wszfilename);
  765.     #if !WINDOWSCE
  766.     {//WZ3.90L 981116 パスが指定されていたらそれを使う。
  767.         CONFIGAPP app;
  768.         configappLoad(&app);
  769.         if (app.if_path[0]) {
  770.             pathtowpath(app.if_path,wszfilename);
  771.             wpathSetDir(wszfilename);
  772.             wpathSetFileName(wszfilename,L"*.*");
  773.         }
  774.     }
  775.     #endif
  776.     ret = txuiGetOpenFileNameW(text,wszfilename,L"挿入ファイル",NULL);
  777.     if (ret) {
  778.         #if WZFUNC_CONV
  779.         if (fileIsWztext_W(wszfilename)) {
  780.             int ret = wquestion(L"%s\nはWZ文書です。TML文書に変換して挿入しますか?",wszfilename);
  781.             if (ret == IDCANCEL) return FALSE;
  782.             if (ret == IDYES) {
  783.                 txSelectOverwriteModal(text);
  784.                 return txInsertFileWztext(text,wszfilename,0);
  785.             }
  786.         }
  787.         #endif
  788.         txSelectOverwriteModal(text);
  789.         return txInsertFileW(text,wszfilename);
  790.     }
  791.     return FALSE;
  792. }
  793. #endif // !__TXC__
  794.  
  795. BOOL txIDM_UIINSERTFILE(TX* text)
  796. {
  797.     BOOL fOverwrite = txSelectGetOverwrite(text);
  798.     IFILE adr0 = txGetParaTop(text);
  799.     if (txuiInsertFile(text)) {
  800.         if (!fOverwrite) {    // txSelectOverwriteModalが実行されるときは選択できない。
  801.             //WZ3.90K 981113 挿入した部分を選択するようにした for 「編集|テキストの変換」
  802.             txSelectEx(text,CLIP_MOUSE);
  803.             txJumpAddress(text,adr0);
  804.         }
  805.         return TRUE;
  806.     }
  807.     return FALSE;
  808. }
  809.  
  810. #if !WINDOWSCE && !__TXC__ && WZFUNC_EDITOR
  811. BOOL _txIDM_SEND(TX* text,int idm)
  812. {
  813.     if (!text->wszfilename[0]) {
  814.         information("ファイル名を付けてください");
  815.         return FALSE;
  816.     } else if (txuiSaveMacroFile(text)) {
  817.         wchar wsz[CCHPATHNAME + 30];
  818.         sprintf_W(wsz,L"%s\"%s\"",(idm == IDM_SENDATTACH) ? L"-sa" :L"-s",text->wszfilename);
  819. //winformation(wsz);
  820.         apIDM_MAILER(wsz);
  821.         return TRUE;
  822.     }
  823.     return FALSE;
  824. }
  825. #endif
  826.  
  827. void txSplitPara(TX* text)
  828. {
  829.     if (!txchIsReturn(txGetPrevChar(text))) txInsertReturn(text);
  830. }
  831.  
  832. #if !WINDOWSCE && !__TXC__
  833. BOOL txIDM_UIADDTOFILE(TX* text)
  834. {
  835.     // 選択した文字をファイルの末尾に追加する。
  836.     // そのファイルをWZで開いているときには、その末尾に追加する。
  837.     BOOL ret = FALSE;
  838.     if (!text->fClip) {
  839.         information("追加したい文字を選択してから再度実行してください");
  840.     } else {
  841.         HDIALOG hd = dialog("ファイルへ追加");
  842.         HSTRBLK sb = historyOpen("addfile",4096);
  843.         mchar szfilename[CCHPATHNAME] = {0};
  844.         dialogControlRefer(hd,"*.*");
  845.         dialogControlStrblkHist(hd,sb);
  846.         dialogString(hd,"ファイル名(&N):",12,szfilename,CCHPATHNAME,30);
  847.         if (dialogOpen(hd)) {
  848.             wchar* wsz = wstrdupA(szfilename);
  849.             HWND hwnd = isopenW(wsz);
  850.             free(wsz);
  851.             if (hwnd) {
  852.                 TX* text2 = textopen(NULL);
  853.                 txInsertTextSelect(text2,text);
  854.                 txJumpFileTop(text2);
  855.                 SendMessage(hwnd,WM_TXJUMPFILEEND,0,0);
  856.                 {
  857.                     COPYDATASTRUCT cds;
  858.                     cds.dwData = WM_COPYDATA_INSERT;
  859.                     cds.cbData = txGetTextSize(text2);
  860.                     cds.lpData = text2->buff + text2->cur;
  861.                     SendMessage(hwnd,WM_COPYDATA,NULL,&cds);
  862.                 }
  863.                 SendMessage(hwnd,WM_TXSPLITPARA,0,0);
  864.                 textclose(text2);
  865.             } else {
  866.                 TX* text2 = textopen(szfilename);
  867.                 txJumpFileEnd(text2);
  868.                 txInsertTextSelect(text2,text);
  869.                 txSplitPara(text2);
  870.                 txSave(text2);
  871.                 textclose(text2);
  872.             }
  873.             ret = TRUE;
  874.         }
  875.         historyClose("addfile",sb);
  876.     }
  877.     return ret;
  878. }
  879. #endif
  880.  
  881. BOOL txIDM_SWITCHREADMODE(TX* text)
  882. {
  883.     if (txGetViewmode(text)) {
  884.         //WZ3.90N 981202 「表示|閲覧」でビューモードの解除ができるようにした。
  885.         //WZ4.00Bl 990913 閲覧で開いたファイルをIDM_SWITCHREADMODEで編集しようとするとき確認ダイアログを出さないようにした。ユーザ要望(実際にファイルがリードオンリーの場合のみにしてほしい)。
  886.         int ret = fileIsReadonlyW(text->wszfilename) ? question("編集を行いますか?\n※この文書は、上書き不可能なファイルなのでビューモードで開かれています。") : IDYES;
  887.         if (ret == IDYES) {
  888.             text->fSemiViewMode = FALSE;
  889.             text->fReadMode = FALSE;
  890.             text->fEditable = TRUE;
  891.             txFlushMenuCheck(text,FMC_CONFIG);
  892.             txDoCaption(text);
  893.             txFileLockModal(text);    //WZ4.00Bl 990917 IDM_SWITCHREADMODEで編集可能にしたとき排他制御を掛けるようにした。
  894.         }
  895.     } else {
  896.         text->fReadMode ^= TRUE;
  897.         if (text->fReadMode) {//WCE0.91 970911 
  898.             wndImeSetOpen(text->hwndtext,FALSE);
  899.         } else {
  900.             wndImeSetOpen(text->hwndtext,(text->modeImeAtOpen == ISF_ON));
  901.         }
  902.         txFlushMenuCheck(text,FMC_CONFIG);
  903.         txDoCaption(text);    //WZ3.90I 981103 
  904.     }
  905.     return TRUE;
  906. }
  907.  
  908. BOOL txIDM_FILEMENUVZ(TX* text)
  909. {
  910.     if (!text->fFrame) return FALSE;//WCE0.92 970918 
  911.     #if POCKETWZ
  912.     {
  913.         HMENU hmenu = menuNew();
  914.         if (hmenu) {
  915.             #if WZFUNC_EDITOR
  916.             wmenuStr(hmenu,L"ファイルのオープン(&O)...",IDM_UIOPENVZ);
  917.             #endif
  918.             wmenuStr(hmenu,L"ファイルのクローズ(&C)",IDM_UICLOSE);
  919.             wmenuStr(hmenu,L"ファイルのセーブ(&S)...",IDM_UISAVEASVZ);
  920.             #if WZFUNC_EDITOR
  921.             wmenuStr(hmenu,L"新規ファイルオープン(&N)",IDM_NEW);
  922.             menuSepa(hmenu);
  923. //                        wmenuStr(hmenu,L"Read onlyオープン(&R)",xxx);
  924.             wmenuStr(hmenu,L"クローズ・オープン(&L)...",IDM_UICLOSEOPEN);
  925.             wmenuStr(hmenu,L"既存ファイルへ追加(&A)...",IDM_UIAPPENDVZ);
  926.             wmenuStr(hmenu,L"ファイル名の変更(&P)...",IDM_UIRENAMEVZ);
  927. //                        wmenuStr(hmenu,L"テキストの2重化(&D)",xxx);
  928.             menuSepa(hmenu);
  929.             #endif
  930.             wmenuStr(hmenu,L"編集のやり直し(&U)...",IDM_UIREOPEN);
  931.             wmenuStr(hmenu,L"カーr{ル位置へ挿入(&I)...",IDM_UIINSERTFILE);
  932.             wmenuStr(hmenu,L"全ファイルのクローズ(&X)",IDM_UIEXIT);
  933.             #if WZFUNC_EDITOR
  934.             wmenuStr(hmenu,L"エディタを終了(&Q)",IDM_UICLOSEALLVZ);    //WZ4.00A 981230 VZライクの「F1|エディタを終了」の動作をWZ3に合わせた。
  935.             #endif
  936.             // メニューの先頭項目を選択状態にするのは無理みたいだ。
  937.             TrackPopupMenu(hmenu,TPM_LEFTALIGN|TPM_BOTTOMALIGN,0,0,0,text->hwndbase,NULL);
  938.             menuDelete(hmenu);
  939.         }
  940.     }
  941.     #else
  942.     {
  943.         HMENU hmenu = menuLoad(_szuiwz,"Vz\\File");
  944.         PostMessage(text->hwndbase,WM_KEYDOWN,VK_DOWN,0);    //WZ4.00Bl 990904 IDM_FILEMENUVZでメニュー先頭の項目を選択表示して開く様にした。
  945.         txHmenuOpenKey(text,hmenu);
  946.         menuDelete(hmenu);
  947.     }
  948.     #endif
  949.     return TRUE;
  950. }
  951.  
  952. #if WZFUNC_EDITOR
  953. BOOL txIDM_UIAPPENDVZ(TX* text)
  954. {
  955.     if (!text->fFrame) return FALSE;//WCE0.92 970918 
  956.     {
  957.         wchar wszfilename[CCHPATHNAME];
  958.         wstrcpy(wszfilename,text->wszfilename);
  959.         if (txuiGetOpenFileNameW(text,wszfilename,L"追加ファイル",NULL)) {
  960.             BOOL ret = FALSE;
  961.             TX* textDst = textopenW(wszfilename);
  962.             if (textDst) {
  963.                 txJumpFileEnd(textDst);
  964.                 txInsertTextSelect(textDst,text);
  965.                 ret = txSave(textDst);
  966.             }
  967.             textclose(textDst);
  968.             if (!ret) wattention(L"%sへの追加に失敗しました",wszfilename);
  969.             return ret;
  970.         }
  971.     }
  972.     return FALSE;
  973. }
  974.  
  975. BOOL txIDM_UIRENAMEVZ(TX* text)
  976. {
  977.     if (!text->fFrame) return FALSE;//WCE0.92 970918 
  978.     {
  979.         wchar wszfilename[CCHPATHNAME];
  980.         TXOFN_ARG arg;
  981.         wstrcpy(wszfilename,text->wszfilename);
  982.         structClear(arg);arg.fSaveAsVz = TRUE;    //WZ4.00Db 000210 IDM_UIRENAMEVZではWZ独自のダイアログを使用するようにした。Windows標準だと拡張子が追加されてしまう場合があるため。
  983.         if (txuiGetOpenFileNameW(text,wszfilename,L"ファイル名の変更",&arg)) {
  984.             wstrcpy(text->wszfilename,wszfilename);
  985.             wstrtostr(text->wszfilename,-1,text->szfilename,CCHPATHNAME);    //WZ4.00Db 000212 IDM_UIRENAMEVZでtext->szfilenameも更新するようにした。
  986.             text->fEdit = TRUE;
  987.             txDoCaption(text);
  988.             if (fileIsExistW(wszfilename)) {
  989.                 wstatprintf(L"%sはすでに存在します",wszfilename);
  990.             }
  991.             return TRUE;
  992.         }
  993.     }
  994.     return FALSE;
  995. }
  996. #endif
  997.  
  998. //##プラグイン
  999.  
  1000. #if __TXC__
  1001. void __pluginGetProperty(mchar* prop,txstr res)
  1002. {
  1003. //information("%s",prop);
  1004.     if (!stricmp(prop,"name")) res = "ファイルIDM処理";
  1005.     if (!stricmp(prop,"author")) res = sysGetName();
  1006.     if (!stricmp(prop,"version")) res = sysGetVersionPrim();
  1007. }
  1008.  
  1009. static HOOKRESULT CALLBACK wndprocTextHook(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  1010. {
  1011.     if (message == WM_TXEVENT && wParam == TXEVENT_IDMEXEC) {
  1012.         TX* text = hwndtextGetText(hwnd);
  1013.         int idm = lParam;
  1014.         switch(idm) {
  1015.             case IDM_UIOPEN: {    // サンプル
  1016. statprintf("IDM_UIOPEN by macro");
  1017.                 txIDM_UIOPEN(text);
  1018.                 return HOOK_CAPTURE;
  1019.             }
  1020.         }
  1021.     }
  1022.     return HOOK_CONTINUE;
  1023. }
  1024.  
  1025. void __on_txFrameNew(TX* text)
  1026. {
  1027.     txSetHookWndproctextTxpcode(text,wndprocTextHook);
  1028. }
  1029.  
  1030. #endif
  1031.