home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 January / VPR0101B.BIN / APUPDATE / VC / TXC0620M / TXC0620M.LZH / _IDMLIB.C < prev    next >
C/C++ Source or Header  |  2000-03-06  |  30KB  |  1,187 lines

  1. /*
  2.     TXAPI_()にする必要はないが、EXEと_idmXXX両方で使い、複数の_idmXXXで使われる関数群
  3.     99年11月28日 日曜 start
  4.         TXAPIにするもの: 統一管理する関数、大規模な関数、速度が必要な関数。
  5. */
  6.  
  7. #if __TXC__
  8.     #include <_wz.h>
  9.     #include <windows.h>
  10.     #include <windowsx.h>
  11.     #pragma multidef+
  12.         #include <commctrl.h>
  13.     #pragma multidef-
  14.     #include <_idm.h>
  15.     #define UNIX_TXC    UNIX    // UNIX&&__TXC__
  16. #else
  17.     #include "_sys.h"
  18.     #define UNIX_TXC    0
  19. #endif
  20. #include "_idmlib.h"
  21. #include "_list.h"
  22.  
  23. #if __TXC__
  24.     mchar _szuiwz[] = "uieditor";        // UI定義ファイルの名前
  25.     mchar szclassList[] = "txList";        // "list"コントロール名
  26.     wchar wszclassList[] = TWCHAR("txList");    // "list"コントロール名
  27.     mchar szclassListH[] = "txListH";    // ヘッダ付き"list"コントロール名
  28.     wchar wszclassListH[] = TWCHAR("txListH");    // ヘッダ付き"list"コントロール名
  29.     wchar wszclassText[] = TWCHAR("txText");// TXウィンドウコントロール名
  30.     wchar wszclassPartition[] = TWCHAR("txPartition");
  31. #endif
  32.  
  33. BOOL txJumpFileLink(TX* text);
  34.  
  35. //##比較
  36.  
  37. int txCmpIParatopLen(TX* text,mchar* szstr,int lch)
  38. {
  39. // カーソル段落の先頭が文字列szstr:lchと等しいか返す
  40. // 等しければlch、等しくなければ0を返す
  41. // 比較できない場合もある。この場合は0を返す
  42. // 英大/小を区別しないで調べる
  43. //WZ3.90I 981030 new
  44.     if (!strnicmp(text->buff + text->curpara,szstr,lch)) return lch;
  45.     return 0;
  46. }
  47.  
  48. int txCmpParaOffset(TX* text,mchar* szstr,IBUFF offset)
  49. {
  50. // カーソル段落+offset以降の段落が文字列szstrと等しいか返す
  51. // 等しければszstrの長さ、等しくなければ0を返す
  52. // 比較できない場合もある。この場合は0を返す
  53. // 英大/小を区別して調べる
  54. //WZ3.90I 981017 new
  55.     int lch = strlen(szstr);
  56.     mchar* p = text->buff + text->curpara + offset;
  57.     mchar c = p[lch];
  58.     if (
  59.         (c == CHAR_CR || c == CHAR_LF) &&
  60.         !strncmp(p,szstr,lch)
  61.     ) return lch;
  62.     return 0;
  63. }
  64.  
  65. int txCmpIParatop(TX* text,mchar* szstr)
  66. {
  67. // カーソル段落の先頭が文字列szstrと等しいか返す
  68. // 等しければszstrの長さ、等しくなければ0を返す
  69. // 比較できない場合もある。この場合は0を返す
  70. // 英大/小を区別しないで調べる
  71. //WZ3.90E 980805 new
  72.     int lch = strlen(szstr);
  73.     if (!strnicmp(text->buff + text->curpara,szstr,lch)) return lch;
  74.     return 0;
  75. }
  76.  
  77. BOOL txIbuffIsNspace(TX* text,IBUFF ibuff,int n)
  78. {
  79. // ibuffがn個以上の半角空白かどうか返す。
  80.     mchar* p = text->buff + ibuff;
  81.     BOOL f = TRUE;
  82.     for (;n--;p++) {
  83.         if (*p != ' ') {f = FALSE;break;}
  84.     }
  85.     return f;
  86. }
  87.  
  88. //##text操作
  89.  
  90. BOOL txSelectGetOverwrite(TX* text)
  91. {
  92.     return (text->fClip && text->fClipMouse);
  93. }
  94.  
  95. void txFlushMenuCheckAll(TX* text)
  96. {
  97. //WZ3.90J 981109 new
  98.     txFlushMenuCheck(text,FMC_ALL);
  99. }
  100.  
  101. #if !UNIX_TXC
  102. void txRulerFlushDisp(TX* text)
  103. {
  104.     if (text->hwndRuler) InvalidateRect(text->hwndRuler,NULL,TRUE);
  105. }
  106. #endif
  107.  
  108. TX* textmsgopenWzapp(mchar* szName)
  109. {
  110.     return textmsgopen("wzapp",szName);    //WZ4.00Bg 990719 小文字化
  111. }
  112.  
  113. //##検索置換ダイアログ
  114.  
  115. #if SEARCHOPT_DIALOG_NEW    //WZ3.90J 981112 
  116. void searchoptSetupMode(SEARCHOPT* opt)
  117. {
  118. //WZ3.90L 981123 new
  119.     opt->mode = 0;
  120.     if (opt->fRe) {
  121.         opt->mode = 3;
  122.     } else if (opt->fFuzzy) {
  123.         opt->mode = 1;
  124.     } else if (opt->fWord) {
  125.         opt->mode = 2;
  126.     }
  127. }
  128. #endif
  129.  
  130. SEARCHMODE searchoptToSearchmode(SEARCHOPT* opt)
  131. {
  132. //WZ3.90H 980910 new
  133.     SEARCHMODE searchmode = SEARCH_NOSENSECASE;
  134. #if SEARCHOPT_DIALOG_NEW    //WZ3.90J 981112 
  135.     opt->fRe = (opt->mode == 3);
  136.     opt->fFuzzy = (opt->mode == 1);
  137.     opt->fWord = (opt->mode == 2);
  138. #endif
  139.     if (opt->fFuzzy) {
  140.         searchmode |= SEARCH_NOSENSEZENHAN|SEARCH_NOSENSECASE;
  141.     } else {
  142.         if (opt->fWord) searchmode |= SEARCH_WORD;
  143.         if (opt->fSenseCase) searchmode &= ~SEARCH_NOSENSECASE;
  144.     }
  145.     if (opt->fSearchNoSymbol) searchmode |= SEARCH_NOSYMBOL;
  146.     if (opt->fPrev) searchmode |= SEARCH_PREV;
  147.     if (opt->fReplaceConfirm) searchmode |= REPLACE_CONFIRM;
  148.     if (opt->fRe) searchmode |= SEARCH_RE;
  149.     if (opt->fNoEsc) searchmode |= SEARCH_NOESC;    //WZ4.00Bl 990908 
  150.     if (opt->fAllText) searchmode |= SEARCH_ALLTEXT;//WZ4.00Bl 990916 
  151.     return searchmode;
  152. }
  153.  
  154. void searchoptFromSearchmode(SEARCHOPT* opt,SEARCHMODE searchmode)
  155. {
  156.     opt->fWord = (searchmode & SEARCH_WORD);
  157.     opt->fSenseCase = !(searchmode & SEARCH_NOSENSECASE);
  158.     opt->fSearchNoSymbol = (searchmode & SEARCH_NOSYMBOL);
  159.     opt->fFuzzy = (searchmode & SEARCH_NOSENSEZENHAN);
  160.     opt->fPrev = (searchmode & SEARCH_PREV);
  161.     opt->fReplaceConfirm = (searchmode & REPLACE_CONFIRM);
  162.     opt->fRe = (searchmode & SEARCH_RE);            //WZ3.90G 980905 
  163.     opt->fNoEsc = !!(searchmode & SEARCH_NOESC);    //WZ4.00Bl 990908 
  164.     opt->fAllText = !!(searchmode & SEARCH_ALLTEXT);//WZ4.00Bl 990916 
  165. #if SEARCHOPT_DIALOG_NEW    //WZ3.90J 981112 
  166.     searchoptSetupMode(opt);    //WZ3.90L 981123 
  167. #endif
  168. }
  169.  
  170. void dialogAddSearchopt(HDIALOG hd,SEARCHOPT* opt,int mode)
  171. {
  172. //WZ3.90J 981112 モードとオプションに分離。
  173.     BOOL fGrep = (mode == 3);
  174.     BOOL fSearch = (mode == 0 || fGrep);
  175.     BOOL fReplace = (mode == 1);
  176.     BOOL fSearchlist = (mode == 2);
  177.     //
  178. #if SEARCHOPT_DIALOG_NEW    //WZ3.90J 981112 
  179.     dialogControlID(hd,IDD_SEARCHMODE);
  180.     dialogControlRadioV(hd);
  181.     dialogControlHelp(hd,-222);
  182.     dialogChoiceRadio(hd,&opt->mode,"基本(&M)","曖昧(&X)","単語(&W)","正規(&E)",NULL);
  183. #else
  184.     dialogControlID(hd,IDD_WORD);
  185.     dialogCheck(hd,"単語を検索(&W)",&opt->fWord);
  186.     dialogControlID(hd,IDD_FUZZY);
  187.     dialogCheck(hd,"曖昧な検索(&X)",&opt->fFuzzy);
  188.     dialogControlID(hd,IDD_RE);
  189.     dialogCheck(hd,"正規表現を使用(&E)",&opt->fRe);    //WZ3.90G 980905 
  190. #endif
  191.         dialogLFV(hd);
  192.     dialogControlID(hd,IDD_SENSECASE);
  193.     dialogControlHelp(hd,226);
  194.     dialogCheck(hd,PSPC?"大小文字を区別":"大文字と小文字を区別(&C)",&opt->fSenseCase);
  195.     //WZ4.00Bl 990908 "\を通常文字として検索"オプションを追加。
  196.     dialogControlID(hd,IDD_NOESC);
  197.     dialogControlHelp(hd,433);    //WZ4.00Bq 991015 
  198.     dialogCheck(hd,"\\を通常文字として検索(&Y)",&opt->fNoEsc);
  199.     //
  200.     dialogControlID(hd,IDD_NOSYMBOL);    //WZ3.90H 980908 
  201.     dialogControlHelp(hd,227);
  202.     dialogCheck(hd,PSPC?"空白記号スキップ":"空白と記号をスキップ(&O)",&opt->fSearchNoSymbol);
  203.     if (fSearch) {
  204.         if (!fGrep) {
  205.             dialogControlHelp(hd,230);
  206.             dialogCheck(hd,"上方向へ検索(&P)",&opt->fPrev);
  207.             #if !WINDOWSCE && WZFUNC_EDITOR
  208.             if (!fSearchlist) {
  209.                 //WZ4.00Bl 990916 (!PWZ)オープン中の全WZを対象とする検索置換ができるようにした。強いユーザ要望。
  210.                 dialogSetH(hd);
  211.                 dialogControlHelp(hd,434);    //WZ4.00Bq 991015 
  212.                 dialogCheck(hd,UNIX?"全XZを対象(&T)":"全WZを対象(&T)",&opt->fAllText);
  213.                 #if !__TXC__
  214.                 dialogControlHelp(hd,231);
  215.                 dialogCheck(hd,"多重化(&I)",&opt->fOpenTempWindow);
  216.                 #endif
  217.                 dialogLFSetV(hd);
  218.             }
  219.             #endif
  220.         }
  221.     } else {
  222.         dialogControlID(hd,IDD_REPLACECONFIRM);
  223.         dialogControlHelp(hd,234);
  224.         dialogCheck(hd,"置換の確認(&K)",&opt->fReplaceConfirm);
  225.         if (fReplace) {
  226.             #if !WINDOWSCE && WZFUNC_EDITOR
  227.             dialogCheck(hd,UNIX?"全XZを対象(&T)":"全WZを対象(&T)",&opt->fAllText);    //WZ4.00Bl 990916 
  228.             #endif
  229.             dialogControlHelp(hd,235);
  230.             dialogCheck(hd,"すべて置換(&A)",&opt->fAll);
  231.             dialogControlEnable(hd,opt->fArea);
  232.             dialogControlHelp(hd,236);
  233.             dialogCheck(hd,"範囲内の置換(&B)",&opt->fArea);
  234.         }
  235.     }
  236. }
  237.  
  238. #if !UNIX_TXC
  239. void wndSetEnableSearchOption(HWND hwnd)
  240. {
  241.     BOOL fRE = FALSE;
  242.     BOOL fFuzzy = FALSE;
  243. #if SEARCHOPT_DIALOG_NEW
  244.     int id;
  245.     for (id = IDD_SEARCHMODE;id < IDD_SEARCHMODE+4;id++) {
  246.         if (IsDlgButtonChecked(hwnd,id)) {
  247.             break;
  248.         }
  249.     }
  250.     id -= IDD_SEARCHMODE;
  251.     fRE = (id == 3);
  252.     fFuzzy = (id == 1);
  253. #else
  254.     fRE = IsDlgButtonChecked(hwnd,IDD_RE);
  255.     fFuzzy = IsDlgButtonChecked(hwnd,IDD_FUZZY);
  256. #endif
  257.     EnableDlgItem(hwnd,IDD_WORD,!(fRE|fFuzzy));
  258.     EnableDlgItem(hwnd,IDD_SENSECASE,!fFuzzy);
  259.     EnableDlgItem(hwnd,IDD_NOSYMBOL,!fRE);
  260.     EnableDlgItem(hwnd,IDD_FUZZY,!fRE);
  261. }
  262. #endif
  263.  
  264. //##文字列
  265.  
  266. mchar* sepastrGetIndexStr(mchar* str,int i,int* pLch)
  267. {
  268. // '|'で区切られた文字列のi番目のポインタと長さを返す。
  269.     int n = i;
  270.     mchar* p = str;
  271.     while(n--) {
  272.         mchar* p1 = strchr(p,'|');
  273.         if (!p1) {p += strlen(p);break;}
  274.         p = p1 + 1;
  275.     }
  276.     {
  277.         mchar* p1 = strchr(p,'|');
  278.         if (!p1) p1 = p + strlen(p);
  279.         *pLch = (p1 - p);
  280.         return p;
  281.     }
  282. }
  283.  
  284. void strDeleteTailSpaceTab(mchar* sz)
  285. {
  286. // szの末尾の空白・全角空白・タブを削除
  287.     mchar* p = sz;
  288.     mchar* p0 = p;
  289.     while(*p) {
  290.         if (*p == ' ' || *p == CHAR_TAB) {
  291.             p++;
  292.     #if TB_EUC
  293.         } else if (*p == 0xA1 && p[1] == 0xA1) {
  294.     #else
  295.         } else if (*p == 0x81 && p[1] == 0x40) {
  296.     #endif
  297.             p += 2;
  298.         } else {
  299.             p += 1 + (tbiskanji(*p) && p[1]);
  300.             p0 = p;
  301.         }
  302.     }
  303.     *p0 = 0;
  304. }
  305.  
  306. #if defined(__TXC__) && defined(UNICODE)
  307. int sprintf_A(LPSTR szDst,LPCSTR szFormat,...)
  308. {
  309.     return vsprintf_A(szDst,szFormat,(void*)(&szFormat + 1));
  310. }
  311. #endif
  312.  
  313. #if !UNIX_TXC
  314. void sprintSizePrim(mchar* szbuff,UINT size)
  315. {
  316. //WZ4.00Ca 991215 new
  317.     BOOL f = FALSE;
  318.     UCHAR c;
  319.     mchar buff[20];
  320.     mchar* dst = buff + sizeof(buff);
  321.     *--dst = 0;
  322.     #define OUT_DIGIT    {c = size % 10;size /= 10;*--dst = c + '0';f = (!size);}
  323.     OUT_DIGIT;
  324.     if (!f) {
  325.         OUT_DIGIT;
  326.         if (!f) {
  327.             OUT_DIGIT;
  328.             if (!f) {
  329.                 *--dst = ',';
  330.                 OUT_DIGIT;
  331.                 if (!f) {
  332.                     OUT_DIGIT;
  333.                     if (!f) {
  334.                         OUT_DIGIT;
  335.                         if (!f) {
  336.                             *--dst = ',';
  337.                             OUT_DIGIT;
  338.                             if (!f) {
  339.                                 OUT_DIGIT;
  340.                                 if (!f) {
  341.                                     OUT_DIGIT;
  342.                                     if (!f) {
  343.                                         *--dst = ',';
  344.                                         OUT_DIGIT;
  345.                                     }
  346.                                 }
  347.                             }
  348.                         }
  349.                     }
  350.                 }
  351.             }
  352.         }
  353.     }
  354.     strcpy(szbuff,dst);
  355. }
  356. #endif
  357.  
  358. mchar* wpathExtractRejectMask(wchar* wszpath,mchar* szReject,int cch)
  359. {
  360. //WZ4.00Ca 991218 new
  361. // wszpathの^指定を取り出して削除してszRejectに入れる。
  362.     wchar* p = wpathGetFileName(wszpath);
  363.     mchar* dst = szReject;
  364.     mchar* dst0 = dst;
  365.     while(1) {
  366.         wchar* p1 = wstrchr(p,L';');
  367.         if (p[0] == '^') {
  368.             if (p[1] != '^') {    // szReject
  369.                 if (dst > dst0) *dst++ = ';';
  370.                 {
  371.                     mchar buff[40];
  372.                     int lchbuff = wstrtostr(p,p1?p1-p:wstrlen(p),buff,cchof(buff)-1);
  373.                     buff[lchbuff] = 0;
  374.                     if (dst - dst0 + cchof(buff) + 5 > cch) break;
  375.                     strcpy(dst,buff+1);dst += strlen(dst);
  376.                 }
  377.                 if (p1) {
  378.                     wstrcpy(p,p1 + 1);
  379.                 } else {
  380.                     *p = 0;
  381.                     break;
  382.                 }
  383.             } else {
  384.                 wstrcpy(p,p + 1);
  385.                 if (p1) {
  386.                     p = p1;
  387.                 } else {
  388.                     break;
  389.                 }
  390.             }
  391.         } else {
  392.             if (p1) {
  393.                 p = p1 + 1;
  394.             } else {
  395.                 break;
  396.             }
  397.         }
  398.     }
  399.     *dst = 0;
  400.     if (wpathGetFileName(wszpath)[0] == 0) {
  401.         //WZ4.00Cb 000117 "^*.c"等のNOT指定は、通常マスク指定に続けて"*.*;^*.c"と記述する必要があったのを、いきなり"^*.c"の指定もできるようにした。
  402.         wpathSetFileName(wszpath,L"*.*");
  403.     }
  404.     return szReject;
  405. }
  406.  
  407. static int patoi(mchar** pp)
  408. {
  409.     mchar* p = *pp;
  410.     int ret = atoi(p);
  411.     if (*p == '-') p++;
  412.     while(isdigit(*p)) p++;
  413.     if (*p == ',') p++;
  414.     *pp = p;
  415.     return ret;
  416. }
  417.  
  418. void strToRect(mchar* p,RECT* r)
  419. {
  420.     r->left = patoi(&p);
  421.     r->top = patoi(&p);
  422.     r->right = patoi(&p);
  423.     r->bottom = patoi(&p);
  424. //information("%d,%d,%d,%d",r->left,r->top,r->right,r->bottom);
  425. }
  426.  
  427. //##ファイル名
  428.  
  429. BOOL wpathIsCszFiletype(wchar* wszfilename,mchar* cszExt)
  430. {
  431. // wszfilenameの拡張子がcszExtに含まれるかどうかを返す。
  432. //WZ4.00Bl 990915 new
  433.     wchar* wszExt = wpathGetExt(wszfilename);
  434.     mchar szExt[CCHWORD];
  435.     wstrtostr(wszExt,-1,szExt,cchof(szExt));
  436.     {
  437.         mchar* p = cszExt;
  438.         while(1) {
  439.             mchar* p1 = strchr(p,';');
  440.             if (p1) {
  441.                 if (!strnicmp(szExt,p,p1-p)) return TRUE;
  442.                 p = p1 + 1;
  443.             } else {
  444.                 if (!stricmp(szExt,p)) return TRUE;
  445.                 break;
  446.             }
  447.         }
  448.     }
  449.     return FALSE;
  450. }
  451.  
  452. BOOL wpathIsBinaryFiletype(wchar* wszfilename)
  453. {
  454.     return wpathIsCszFiletype(wszfilename,sh->cszExtBinary);
  455. }
  456.  
  457. //##Windows API 拡張
  458.  
  459. #if defined(__TXC__) && defined(UNICODE)
  460. //WCE1.01 980508 CCHWORDを変換バッファに使っていたらログインスクリプトが切れた。wstrdupに変更。
  461. BOOL WINAPI SetWindowText_A(HWND hwnd,LPCSTR lpsz)
  462. {
  463.     wchar* wsz = wstrdupA(lpsz);
  464.     int ret = wsz ? SetWindowText(hwnd,wsz) : FALSE;
  465.     free(wsz);
  466.     return ret;
  467. }
  468. int WINAPI GetWindowText_A(HWND hwnd,LPSTR lpsz,int cchMax)
  469. {
  470.     wchar* wsz = malloc(cchMax * sizeof(wchar));
  471.     int ret = 0;
  472.     if (wsz) {
  473.         GetWindowText(hwnd,wsz,cchMax);
  474.         ret = wstrtostr(wsz,-1,lpsz,cchMax);
  475.     }
  476.     if (ret) return ret-1;
  477.     return 0;
  478. }
  479. BOOL SetDlgItemText_A(HWND hwndDlg,int idControl,LPCSTR lpsz)
  480. {
  481.     return SetWindowText_A(GetDlgItem(hwndDlg,idControl),lpsz);
  482. }
  483. BOOL GetDlgItemText_A(HWND hwndDlg,int idControl,LPSTR lpsz,int cchMax)
  484. {
  485.     return GetWindowText_A(GetDlgItem(hwndDlg,idControl),lpsz,cchMax);
  486. }
  487. void ListBox_AddString_A(HWND hctrl,mchar* sz)
  488. {
  489. //WCE1.01 980115 new
  490.     wchar* wsz = wstrdupA(sz);
  491.     ListBox_AddString(hctrl,wsz);
  492.     free(wsz);
  493. }
  494. int ListBox_FindStringExact_A(HWND hctrl,int i,mchar* sz)
  495. {
  496. //WCE1.01 980118 new
  497.     wchar* wsz = wstrdupA(sz);
  498.     int ret = ListBox_FindStringExact(hctrl,i,wsz);
  499.     free(wsz);
  500.     return ret;
  501. }
  502. BOOL WinExecEx_W(wchar* wszfilenameExe,wchar* wszCmdline)
  503. {
  504.     PROCESS_INFORMATION procinfo;
  505.     return CreateProcess(
  506.         wszfilenameExe,
  507.         wszCmdline,
  508.         NULL,NULL,
  509.         FALSE,0,
  510.         NULL,NULL,
  511.         NULL,
  512.         &procinfo
  513.     );
  514. }
  515. #endif
  516.  
  517. #if defined(__TXC__) && WINDOWSCE
  518. BOOL IsIconic(HWND hwnd)
  519. {
  520. // CEでは実現できない
  521.     return FALSE;
  522. }
  523. #endif
  524.  
  525. #if !UNIX_TXC
  526. mchar* GetWindowTextAlloc_A(HWND hwnd)
  527. {
  528.     int lch = GetWindowTextLength(hwnd);
  529.     #ifdef UNICODE
  530.     int cch = (lch + 1) * sizeof(wchar);
  531.     #else
  532.     int cch = (lch + 1);
  533.     #endif
  534.     mchar* ret = malloc(cch);
  535.     if (ret) {
  536.         GetWindowText_A(hwnd,ret,cch);
  537.     }
  538.     return ret;
  539. }
  540. #endif
  541.  
  542. #if defined(__TXC__) && !defined(UNICODE) && !UNIX_TXC
  543. BOOL CopyFile_W(LPCWSTR lpszSrc,LPCWSTR lpszDst,BOOL fFailIfExists)
  544. {
  545.     mchar* szsrc = strdupW(lpszSrc);
  546.     mchar* szdst = strdupW(lpszDst);
  547.     BOOL ret = CopyFile(szsrc,szdst,fFailIfExists);
  548.     free(szsrc);
  549.     free(szdst);
  550.     return ret;
  551. }
  552. BOOL MoveFile_W(LPCWSTR lpszSrc,LPCWSTR lpszDst)
  553. {
  554.     mchar* szsrc = strdupW(lpszSrc);
  555.     mchar* szdst = strdupW(lpszDst);
  556.     BOOL ret = MoveFile(szsrc,szdst);
  557.     free(szsrc);
  558.     free(szdst);
  559.     return ret;
  560. }
  561. BOOL DeleteFile_W(LPCWSTR lpszFileName)
  562. {
  563.     mchar* szfilename = strdupW(lpszFileName);
  564.     BOOL ret = DeleteFile(szfilename);
  565.     free(szfilename);
  566.     return ret;
  567. }
  568. BOOL CreateDirectory_W(LPCWSTR lpszPath,LPSECURITY_ATTRIBUTES lpsa)
  569. {
  570.     mchar* szpath = strdupW(lpszPath);
  571.     BOOL ret = CreateDirectory(szpath,lpsa);
  572.     free(szpath);
  573.     return ret;
  574. }
  575. #endif
  576.  
  577. #if !UNIX_TXC
  578. BOOL wndGetRect(HWND hwnd,RECT* r)
  579. {
  580. // アイコン化されていてもオリジナル位置を返すGetWindowRect
  581. // アイコン化されているFILERなどを閉じるとウィンドウ位置の復活ができなくなった。
  582. //WZ3.90N 981202 new
  583. #if WINDOWSCE || UNIX
  584.     GetWindowRect(hwnd,r);
  585.     return TRUE;
  586. #else
  587.     WINDOWPLACEMENT p;
  588.     structClear(p);
  589.     p.length = sizeof(p);
  590.     GetWindowPlacement(hwnd,&p);
  591.     *r = p.rcNormalPosition;
  592.     return TRUE;    //WZ3.90P 981206 
  593. #endif
  594. }
  595. #endif
  596.  
  597. void filetimeAdd(FILETIME* ft,FILETIME* ftAdd)
  598. {
  599. // ftにftAddを足す
  600.     DWORD dwLowDateTime0 = ft->dwLowDateTime;
  601.     ft->dwLowDateTime += ftAdd->dwLowDateTime;
  602.     if (ft->dwLowDateTime < dwLowDateTime0) ft->dwHighDateTime++;
  603.     ft->dwHighDateTime += ftAdd->dwHighDateTime;
  604. }
  605.  
  606. //##最近ジャンプした位置
  607.  
  608. #ifdef _LIST_H
  609. void histjumpstrAnalyze(mchar* sz,JH_ITEM* item)
  610. {
  611.     item->npara = atoi(sz);
  612.     //
  613.     item->szfilename[0] = 0;
  614.     sz = strchr(sz,',');
  615.     if (sz) {
  616.         sz++;
  617.         sstrcpy(item->szfilename,sz);
  618.     }
  619. }
  620. void jumphistAdd(TX* text)
  621. {
  622.     if (text->fFrame && text->fOpen) {
  623.         JH_ITEM item;
  624.         HSTRBLK sb = sbFromHist(HIST_JUMP);
  625.         int n = sbGetCount(sb);
  626.         if (n) {
  627.             // 近い場所は追加しない。
  628.             histjumpstrAnalyze(sbRead(sb,n-1),&item);
  629.             if (!stricmp(item.szfilename,text->szfilename)) {
  630.                 if (myabs(text->npara - item.npara) < 10) return;
  631.             }
  632.         }
  633.         {
  634.             mchar buff[CCHPATHNAME + 20];
  635.             mchar* dst = buff;
  636.             itoa(text->npara,dst,10);dst += strlen(dst);
  637.             *dst++ = ',';
  638.             strcpy(dst,text->szfilename);
  639.             sbAddHist(sb,buff);
  640.         }
  641.     }
  642. }
  643. #endif
  644.  
  645. //##タグジャンプ
  646. // 行番号指定なし、検索文字列指定に対応
  647. #if WZFUNC_EDITOR
  648.  
  649. static mchar* tagjumpGetFilename(TX* text,mchar* p,mchar szfilename[CCHPATHNAME])
  650. {
  651. // テキストバッファポインタpから行末まで、存在するファイル名の記述があれば
  652. // szfilenameに取得してファイル名の末尾の次の文字へのテキストバッファポインタを返す
  653. // なければNULLを返す
  654.     mchar path[CCHPATHNAME];
  655.     
  656.     if (text->modeTagJump != TAGJUMP_VZ && !strncmp(p,"・",2)) {
  657.         // grep形式。高速化のため直ぐに判別
  658.         p += 2;
  659.         while(isspace(*p)) p++;
  660.         if (isdigit(*p)) return NULL;
  661.     }
  662.     while(1) {
  663.         BOOL fdq = FALSE;
  664.         mchar *top;
  665.         
  666.         // get top
  667.         while(1) {
  668.             mchar c = *p;
  669.             
  670.             if (c == 0x0A || c == 0x1A || c == 0) {
  671.                 return NULL;
  672.             } else if (c <= ' ' || c == '(' || c == ')' || c == ':') {
  673.                 p++;
  674.             } else {
  675.                 break;
  676.             }
  677.         }
  678.         top = p;
  679.         // get tail
  680.         while(1) {
  681.             mchar c = *p;
  682.             
  683.             if (c == 0x0A || c == 0x1A || c == 0) {
  684. #if 1//3.00A2 970504 「ファイル名+改行」でもタグジャンプするようにした(従来は「ファイル名+スペース+改行」でタグジャンプした)。
  685.                 break;
  686. #else
  687.                 return NULL;
  688. #endif
  689.             } else if (c == '"') {
  690.                 fdq ^= 1;
  691.                 p++;
  692.             } else if (c < ' ' || ((c == ' ' || c == '(' || c == ')') && !fdq)) {    //WZ4.00Bl 990925 タグジャンプ指定で""内の(と)はファイル名とみなすようにした。ユーザ要望。
  693.                 break;
  694.             } else if (c == ':' && isdigit(p[1])) {
  695.                 //2.00E "D:\WZ\TEST.C:256 void function()"の様な"ファイル名:行番号"形式のタグジャンプができなかった
  696.                 break;
  697.             } else {
  698.                 p++;
  699.             }
  700.         }
  701.         if (p > top && p[-1] == ':') p--;//1.00C タグジャンプを「ファイル名: 行番号」に対応させた
  702.         {
  703.             IBUFF len = p - top;
  704.             
  705.             if (len < CCHPATHNAME) {
  706.                 strcpylen(szfilename,top,len);
  707.                 if (text->modeTagJump != TAGJUMP_VZ && iskanji(szfilename[0])) {
  708.                     //2.92 標準では、漢字はファイル名としては認識しない
  709.                     break;
  710.                 }
  711.                 pathFormLong(szfilename);
  712. //information("%s",szfilename);
  713.                 // [1]フルパスならそれでジャンプ
  714.                 if (pathIsFull(szfilename) && fileIsExist(szfilename)) return p;
  715.                 // [1.5]サブフォルダ指定があれば、フルパスに変換してジャンプ    //WZ4.00Bl 990907 タグジャンプでサブフォルダ\ファイル名も使える様にした。ユーザ要望。
  716.                 if (pathGetFileName(szfilename) != szfilename) {
  717.                     mchar szbuff[CCHPATHNAME];
  718.                     wpathtopath(text->wszfilename,szbuff);
  719.                     pathSetFileName(szbuff,szfilename);
  720.                     if (fileIsExist(szbuff)) {
  721.                         strcpy(szfilename,szbuff);
  722.                         return p;
  723.                     }
  724.                 }
  725.                 //
  726.                 strcpy(szfilename,pathGetFileName(szfilename));
  727.                 // [2]現在の文書のフォルダでファイルを検索
  728.                 {
  729.                     mchar szbuff[CCHPATHNAME];
  730.                     wstrtostr(text->wszfilename,-1,szbuff,CCHPATHNAME);
  731.                     pathSetFileName(szbuff,szfilename);
  732.                     if (fileIsExist(szbuff)) {
  733.                         strcpy(szfilename,szbuff);
  734.                         return p;
  735.                     }
  736.                 }
  737.                 // [3]標準フォルダでファイルを検索
  738.                 if (sh->szFolderDefault[0]) {
  739.                     mchar szbuff[CCHPATHNAME];
  740.                     strcpy(szbuff,sh->szFolderDefault);
  741.                     pathSetDir(szbuff);
  742.                     pathSetFileName(szbuff,szfilename);
  743. //information(szbuff);
  744.                     if (fileIsExist(szbuff)) {
  745.                         strcpy(szfilename,szbuff);
  746.                         return p;
  747.                     }
  748.                 }
  749.                 // [4]文書パスのフォルダでファイルを検索
  750.                 {
  751.                     wchar wszfilename[CCHPATHNAME];
  752.                     strtowstr(szfilename,-1,wszfilename,CCHPATHNAME);
  753.                     if (wpathSearchPathtext(wszfilename)) {
  754.                         wstrtostr(wszfilename,-1,szfilename,CCHPATHNAME);
  755.                         return p;
  756.                     }
  757.                 }
  758.             }
  759.         }
  760.         if (text->modeTagJump != TAGJUMP_VZ) {
  761.             break;//2.92 
  762.         }
  763.     }
  764.     return NULL;
  765. }
  766.  
  767. static NPARA tagjumpGetNline(mchar* p,int* pLx,mchar szFind[CCHWORD],RECT* r)
  768. {
  769. //WZ3.90I 981030 rを追加
  770.     int a = 0;
  771.     r->left = INT_MAX;
  772.     szFind[0] = 0;
  773.     while(1) {
  774.         mchar c = *p;
  775.         int a0 = a;
  776.         a = 0;
  777.         
  778.         if (c == 0x0A || c == 0) {
  779.             return 0;
  780.         } else if (c == '"') {
  781.             strcpylenmax(szFind,p,strGetWordLen(p),CCHWORD);
  782.             pathFormLong(szFind);
  783.             {
  784.                 mchar* p = strchrs(szFind," \t");
  785.                 if (p) {
  786.                     // 空白やタブは検索できない
  787.                     *p = 0;
  788.                 }
  789.             }
  790.             return 0;
  791.         } else if (!a0 && isdigit(c)) {
  792.             IFILE line = 0;
  793.             IBUFF lch = 0;
  794.             
  795.             while(1) {
  796.                 mchar c = *p;
  797.                 
  798.                 if (isdigit(c)) {
  799.                     line *= 10;
  800.                     line += c - '0';
  801.                     p++;
  802.                 } else {
  803.                     break;
  804.                 }
  805.             }
  806.             if (*p == ',') {
  807.                 lch = atoi(p + 1);
  808.                 {    //WZ3.90I 981030 
  809.                     p++;
  810.                     while(isdigit(*p)) p++;
  811.                     if (*p == ',' && p[1] == '(') {
  812.                         p += 2;
  813.                         strToRect(p,r);
  814.                     }
  815.                 }
  816.             }
  817.             if (pLx) *pLx = lch;
  818.             return line;
  819.         } else if (iskanji(c)) {
  820.             p += 2;
  821.         } else {
  822.             if (isalpha(c)) {
  823.                 a = 1;
  824.             }
  825.             p++;
  826.         }
  827.     }
  828. }
  829.  
  830. static BOOL txJumpTagExec(TX* text,mchar* szfilename,NPARA npara,int lx,mchar* szFind,RECT* r)
  831. {
  832. // npara == 0            指定なし
  833. // lx < 0                指定なし
  834. // !szFind||!szFind[0]    指定なし
  835. // r:ウィンドウ位置 //WZ3.90I 981030 
  836.     wchar wsw[CCHWORD] = {0};
  837.     wchar wszfilename[CCHPATHNAME];
  838.     strtowstr(szfilename,-1,wszfilename,CCHPATHNAME);
  839.     if (szFind && szFind[0]) {
  840. #if 1//WCE0.95 970923 
  841.         if (strlen(szFind) < 5 + CCHWORD) {
  842.             mchar sw[CCHWORD];
  843.             #if UNIX
  844.             sprintf(sw,"-s%s",szFind);
  845.             #else
  846.             sprintf(sw,"/s%s",szFind);
  847.             #endif
  848.             strtowstr(sw,-1,wsw,wcchof(wsw));
  849.             forkstdW(wszfilename,wsw);
  850.         }
  851. #else
  852.         wsprintf(wsw,L"/s%hs",szFind);
  853.         forkstdW(wszfilename,wsw);
  854. #endif
  855.     } else {
  856.         //WZ4.00Bl 990912 プロジェクトのオープンでウィンドウ位置がTPJの内容に従ってなかったのを修正。
  857.         if (npara) {
  858.             //WZ4.00Bl 990922 /k -> /kpj for 「設定の切り替え」の記憶を読むように。
  859.             if (lx >= 0) {
  860.                 #if UNIX
  861.                 sprintf_W(wsw,L"-kpj -J%ld,%d -Yc",npara,lx);
  862.                 #else
  863.                 sprintf_W(wsw,L"/kpj /J%ld,%d /Yc",npara,lx);
  864.                 #endif
  865.             } else {
  866.                 #if UNIX
  867.                 sprintf_W(wsw,L"-kpj -J%ld -Yc",npara);
  868.                 #else
  869.                 sprintf_W(wsw,L"/kpj /J%ld /Yc",npara);
  870.                 #endif
  871.             }
  872.         }
  873.         if (r) {
  874.             #if UNIX
  875.             sprintf_W(wsw + wstrlen(wsw),L" -ow%d,%d,%d,%d",r->left,r->top,r->right,r->bottom);
  876.             #else
  877.             sprintf_W(wsw + wstrlen(wsw),L" /ow%d,%d,%d,%d",r->left,r->top,r->right,r->bottom);
  878.             #endif
  879.         }
  880. //winformation(wsw);
  881.         forkstdW(wszfilename,wsw);
  882.     }
  883.     return TRUE;
  884. }
  885.  
  886. BOOL txJumpTagPrim(TX* text,int mode)
  887. {
  888. // タグジャンプ
  889. // mode=1: PROJECTのオープン
  890.     mchar szfilename[CCHPATHNAME];
  891.     mchar szpara[CCHLINE*4];
  892.     if (mode == 0 && txfIbuffIsLink(text,text->cur)) {    //WZ4.00Ab 990125 TMLのリンクにカーソルを置いてタグジャンプしたときは、リンク先にジャンプするようにした。
  893.         txIbuffJumpLink(text,text->cur);
  894.         return TRUE;
  895.     }
  896.     #if !WINDOWSCE
  897.     if (mode == 0 && txIbuffIsUrl(text,text->cur)) {    //WZ4.00Bl 990908 (!PWZ)クリッカブルURL,E-Mailにカーソルを置いてタグジャンプできるようにした。ユーザ要望(音声化)。WZ3と同じ仕様。
  898.         txIbuffJumpLink(text,text->cur);
  899.         return TRUE;
  900.     }
  901.     #endif
  902.     txGetParaEx(text,szpara,cchof(szpara));
  903.     if (!strnicmp(szpara,"shell",5)) {
  904. #if !UNIX && !__TXC__
  905.         mchar* p = szpara + 5;
  906.         if (*p == '(') {
  907.             p = strchr(p,')');
  908.             if (!p) return FALSE;
  909.             p++;
  910.         }
  911.         p = strGetWordTop(p);
  912.         {
  913.             SHELLEXECUTEINFOW info;
  914.             wchar wszfilename[CCHPATHNAME];
  915.             wchar* wszPara = NULL;
  916.             strtowstr(p,-1,wszfilename,CCHPATHNAME);
  917.             {
  918.                 int lch = wstrGetWordLen(wszfilename);
  919.                 wchar* p = wszfilename + lch;
  920.                 if (*p) {
  921.                     *p = 0;
  922.                     wszPara = p + 1;
  923.                 }
  924.             }
  925.             structClear(info);
  926.             info.cbSize = sizeof(info);
  927.             info.lpVerb = L"Open";
  928.             info.lpFile = wszfilename;
  929.             info.lpParameters = wszPara;
  930.             info.nShow = SW_SHOWNORMAL;    //WCE1.01 980226 
  931.             return ShellExecuteEx_W(&info);
  932.         }
  933. #endif    // !UNIX
  934.     } else {
  935.         mchar* p = szpara;
  936.         p = tagjumpGetFilename(text,p,szfilename);
  937.         if (!p) {
  938.             #if !__TXC__ && WZFUNC_EDITOR
  939.             if (txGrepTagJump(text)) {
  940.                 // grep結果のタグジャンプ及び"ファイル名"へのジャンプ
  941.                 return TRUE;
  942.             }
  943.             #endif // !__TXC__
  944.             // THP用参照
  945.             #if 0    //WZ4.00Ab 990118 THP参照用のコードがあったので廃止。
  946.             {
  947.                 mchar* p = strstr(szpara,"≪");
  948.                 if (p) {
  949.                     mchar* p1;
  950.                     p += 2;
  951.                     p1 = strstr(p,"≫");
  952.                     if (p1) {
  953.                         mchar szHeadline[CCHWORD];
  954.                         sstrcpylen(szHeadline,p,p1-p);
  955.                         return txJumpThp(text,szHeadline);
  956.                     }
  957.                 }
  958.             }
  959.             #endif
  960.             if (mode == 0 && txJumpFileLink(text)) return TRUE;    //WZ4.00Bk 990904 WZ3の簡易リンクを復活。IDM_JUMPTAGでタグがない場合、カーソル位置の"ファイル名"または段落先頭の"ファイル名"のファイルを開く。
  961.             return FALSE;
  962.         }
  963.         {
  964.             mchar szFind[CCHWORD];
  965.             RECT r;
  966.             int lx = -1;
  967.             NPARA npara = tagjumpGetNline(p,&lx,szFind,&r);
  968. //information("%d",npara);
  969.             if (mode == 1) {
  970.                 // プロジェクトオープンではカーソル位置の指定は無視して
  971.                 // プロファイルのカーソル位置を優先。
  972.                 lx = -1;
  973.                 npara = 0;
  974.             }
  975. //information("%d %d %d %d",r.left,r.top,r.right,r.bottom);
  976.             return txJumpTagExec(text,szfilename,npara,lx,szFind,r.left == INT_MAX ? NULL : &r);
  977.         }
  978.     }
  979.     return FALSE;
  980. }
  981.  
  982. BOOL txJumpFileLink(TX* text)
  983. {
  984. // カーソル段落が簡易リンクならジャンプする。
  985. //WZ4.00Bk 990904 new
  986.     mchar* ppara = text->buff + text->curpara;
  987.     mchar* pend = ppara + txGetParaContentLen(text);
  988.     mchar* p = text->buff + text->cur;
  989.     mchar* p1;
  990.     mchar* p2;
  991.     if (p2 = memchr(p,'"',pend - p)) {
  992.         p1 = p;
  993.         for (;p1>=ppara;p1--) {
  994.             if (*p1 == '"') {
  995.                 int len = p2-p1-1;
  996.                 if (len > 0) {
  997.                     mchar szfilename[CCHPATHNAME];
  998.                     sstrcpylen(szfilename,p1+1,len);
  999. //information("[%s] %d",szfilename,len);
  1000.                     forkstd(szfilename,NULL);
  1001.                     return TRUE;
  1002.                 } else {
  1003.                     break;
  1004.                 }
  1005.             }
  1006.         }
  1007.     }
  1008.     if (p1 = memchr(ppara,'"',pend-ppara)) {
  1009.         if (p2 = memchr(p1+1,'"',pend-p1-1)) {
  1010.             int len = p2-p1-1;
  1011.             if (len > 0) {
  1012.                 mchar szfilename[CCHPATHNAME];
  1013.                 sstrcpylen(szfilename,p1+1,len);
  1014.                 forkstd(szfilename,NULL);
  1015. //information(szfilename);
  1016.                 return TRUE;
  1017.             }
  1018.         }
  1019.     }
  1020.     return FALSE;
  1021. }
  1022.  
  1023. void tagjumpreturnAdd(mchar* szfilename,IFILE adr);
  1024.  
  1025. #if !__TXC__ && WZFUNC_EDITOR
  1026. BOOL TXAPI txJumpTagEx(TX* text)
  1027. {
  1028. // タグジャンプ
  1029.     return txJumpTagPrim(text,0);
  1030. }
  1031. #endif // !__TXC__
  1032.  
  1033. #endif    // WZFUNC_EDITOR
  1034. //##ダイアログ
  1035.  
  1036. #if !UNIX_TXC
  1037. int questionOverwrite(wchar* wszfilename)
  1038. {
  1039. //WCE0.93 970920 
  1040.     HDIALOG hd = dialog("上書き確認");
  1041.     mchar szfilename[CCHPATHNAME];
  1042.     wstrtostr(wszfilename,-1,szfilename,CCHPATHNAME);
  1043.     dialogCaption(hd,szfilename);
  1044.     dialogCaption(hd,"は存在します。");
  1045.     dialogCaption(hd,"上書きしてもよろしいですか?");    //WZ4.00Db 000210 「移動」にも使われるので、「コピー」の語句を外した。
  1046.     dialogSetFocus(hd,IDNO);
  1047.     dialogSetH(hd);
  1048.     dialogControlID(hd,IDYES);
  1049.     dialogCmd(hd,"はい(&Y)",10);
  1050.     dialogControlID(hd,IDNO);
  1051.     dialogControlStyle(hd,WS_TABSTOP);    //XZ0.10 990623 方向キーでボタンを選べるようにした。
  1052.     dialogCmdDefault(hd,"いいえ(&N)",10);
  1053.     dialogControlID(hd,IDCANCEL);
  1054.     dialogCmd(hd,"キャンセル",10);
  1055.     dialogControlID(hd,IDIGNORE);
  1056.     dialogCmd(hd,"すべて上書き(&A)",15);
  1057.     {
  1058.         int ret = dialogOpen(hd);
  1059.         if (ret) return ret;
  1060.     }
  1061.     return IDCANCEL;    //WZ4.00Bj 990814 
  1062. }
  1063. #endif
  1064.  
  1065. //## sub dialog proc
  1066.  
  1067. #if !UNIX_TXC
  1068. BOOL subdlgprocSblist(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam,HSTRBLK sb)
  1069. {
  1070. // sbをListBoxで選択し、メンテナンス
  1071.     HDIALOG hd = dialogFromHwnd(hwnd);
  1072.     switch(message) {
  1073.         case WM_COMMAND: {
  1074.             int cmd = GET_WM_COMMAND_CMD(wParam,lParam);
  1075.             int id;
  1076.             switch(id = GET_WM_COMMAND_ID(wParam,lParam)) {
  1077.                 case IDD_SBLIST_ADD: {
  1078.                     HDIALOG hd = dialog("名前を付けて追加");
  1079.                     mchar szName[CCHNAME] = {0};
  1080.                     dialogString(hd,"名前(&N):",10,szName,CCHNAME,20);
  1081.                     if (dialogOpen(hd)) {
  1082.                         SendMessage(hwnd,SBLISTN_ADD,0,szName);
  1083.                     }
  1084.                     break;
  1085.                 }
  1086.                 case IDD_SBLIST_UP:
  1087.                 case IDD_SBLIST_DOWN: {
  1088.                     HWND hctrl = GetDlgItem(hwnd,IDD_SBLIST);
  1089.                     int isel = ListBox_GetCurSel(hctrl);
  1090.                     int i = isel;
  1091.                     mchar* sz = sbRead(sb,i);
  1092.                     if (id == IDD_SBLIST_UP && i == 0) break;
  1093.                     if (id == IDD_SBLIST_DOWN && i + 1 == sbGetCount(sb)) break;
  1094.                     if (sz) {
  1095.                         mchar* szInsert = strdup(sz);
  1096.                         if (szInsert) {
  1097.                             sbDelI(sb,i);
  1098.                             (id == IDD_SBLIST_UP) ? i-- : i++;
  1099.                             sbInsert(sb,i,szInsert);
  1100.                             SendMessage(hwnd,SBLISTN_FLUSHLIST,0,0);
  1101.                             ListBox_SetCurSel(hctrl,i);
  1102.                             free(szInsert);
  1103.                         }
  1104.                     }
  1105.                     break;
  1106.                 }
  1107.                 case IDD_SBLIST_DEL:
  1108.                 case IDD_SBLIST_SET: {
  1109.                     HWND hctrl = GetDlgItem(hwnd,IDD_SBLIST);
  1110.                     int isel = ListBox_GetCurSel(hctrl);
  1111.                     mchar szName[CCHNAME];
  1112.                     ListBox_GetItemText_A(hctrl,isel,szName,CCHNAME);
  1113.                     if (!szName[0]) break;
  1114.                     if (id == IDD_SBLIST_DEL) {
  1115.                         wchar wszName[CCHNAME];
  1116.                         strtowstr(szName,-1,wszName,CCHNAME);
  1117.                         if (wquestionYesNo(L"%sを削除しますか?",wszName) == IDYES) {
  1118.                             sbDelI(sb,isel);
  1119.                             SendMessage(hwnd,SBLISTN_FLUSHLIST,0,0);
  1120.                             ListBox_SetCurSel(hctrl,isel);
  1121.                             SendMessage(hwnd,SBLISTN_FLUSHCONTENT,0,0);
  1122.                         }
  1123.                     } else {
  1124.                         SendMessage(hwnd,SBLISTN_SET,0,szName);
  1125.                     }
  1126.                     break;
  1127.                 }
  1128.                 case IDD_SBLIST: {
  1129.                     if (cmd == LBN_SELCHANGE) {
  1130.                         SendMessage(hwnd,SBLISTN_FLUSHCONTENT,0,0);
  1131.                     }
  1132.                     break;
  1133.                 }
  1134.             }
  1135.             break;
  1136.         }
  1137.     }
  1138.     return FALSE;
  1139. }
  1140. #endif
  1141.  
  1142. //##インクリメンタル検索
  1143.  
  1144. void txIsearchStatprintf(TX* text,BOOL find,SEARCHMODE searchmode)
  1145. {
  1146.     mchar sz[CCHTXSTR] = {0};
  1147.     if (!find) strcat(sz,"Failing ");
  1148.     if (text->isearch->fIsearchWrapped) strcat(sz,"Wrapped ");
  1149.     if (searchmode & SEARCH_REWZ) strcat(sz,"Regexp ");
  1150.     strcat(sz,"I-search");
  1151.     if (searchmode & SEARCH_PREV) strcat(sz," backward");
  1152.     strcat(sz,": ");
  1153.     sstrcat(sz,text->isearch->szIsearch);
  1154.     txStatusbarPrintf(text,sz);
  1155. }
  1156.  
  1157. BOOL txIsearchIsContinueIdm(TX* text,int idm)
  1158. {
  1159. //WZ4.00Ab 990124 new
  1160.     if (idm == IDM_ISEARCHPREV) return TRUE;
  1161.     if (idm == IDM_ISEARCH) return TRUE;
  1162.     if (idm == IDM_ISEARCHRE) return TRUE;
  1163.     if (idm == IDM_DELETEPREV && text->isearch->szIsearch[0]) return TRUE;    //WZ4.00Bl 990909 
  1164.     return FALSE;
  1165. }
  1166.  
  1167. BOOL txIsearchQuit(TX* text)
  1168. {
  1169. //WZ4.00Ab 990124 new
  1170.     if (text->isearch && text->isearch->fIsearching) {
  1171.         text->isearch->fIsearching = FALSE;
  1172.         txStatusbarPrintf(text,NULL);
  1173.         return TRUE;
  1174.     }
  1175.     return FALSE;
  1176. }
  1177.  
  1178. void txIsearchQuitEm(TX* text)
  1179. {
  1180. // for emacs
  1181.     txIsearchQuit(text);
  1182.     if (txIsearchIsContinueIdm(text,text->idmPrev)) {
  1183.         txJumpAddress(text,text->isearch->adrIsearch0);
  1184.     }
  1185. }
  1186.  
  1187.