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

  1. /*
  2.     編集関係の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. static BOOL txIdmPreHeadline(TX* text)
  19. {
  20. //WZ4.00Bn 991010 「見出し文字列を表示しない」場合の見出し行の行頭でIDM_INSERTRETURN・IDM_DELETEPREVしたときに見出しを保存して改行・削除するようにした。ユーザ要望。
  21. //WZ4.00Bn 991010 new
  22.     if (text->fNoDispHeadlineString) {
  23.         int iHeadline = txIbuffGetHeadline(text,text->curpara,NULL);
  24.         if (iHeadline && text->cur0 - text->curpara == txHeadlineGetLen(text,iHeadline)) {
  25.             txJumpParaTop(text);
  26.             return TRUE;
  27.         }
  28.     }
  29.     return FALSE;
  30. }
  31.  
  32. //##削除操作
  33.  
  34. BOOL txIDM_DELETECHAR(TX* text)
  35. {
  36.     if (text->fBinedit) {
  37.         txDeleteBytes(text,1);    //WZ4.00Ab 990203 
  38.     } else if (txKeisenIsNeedOp(text,IDM_DELETECHAR) && txKeisenOp(text,IDM_DELETECHAR,NULL)) {
  39.         //WCE1.01 980116 
  40. #if 0    //WZ4.00A 981227 「タブを字下げとみなす」ON時にタブをまとめて削除する機能は不評だったので外した
  41.     } else if (txGetApfu(text) && txGetChar(text) == CHAR_TAB) {
  42.         //WCE1.01 980127 
  43.         text->fUndispCursor++;
  44.         while(1) {
  45.             if (!txDeleteChar(text)) break;
  46.             if (txGetChar(text) != CHAR_TAB) break;
  47.         }
  48.         text->fUndispCursor--;
  49.         txDispCursor(text);
  50.         txDispLocate(text);
  51. #endif
  52.     } else {
  53.         text->fTxfDirect += text->fTxf;
  54.         if (!(text->fTxf && txfDeleteChartag(text))) {
  55.             if (txIsCurReturn(text) && txApfEnterConnect(text)) {
  56.                 // OK
  57.             } else {
  58.                 if (text->fApf && !text->fApfing) {
  59.                     txApfEnterDeleteParaform(text);
  60.                 } else {
  61.                     txApfEnterModal(text);
  62.                     txDeleteChar(text);
  63.                 }
  64.             }
  65.         }
  66.         text->fNoApfExitAtNparaChange = TRUE;
  67.         //
  68.         text->fTxfDirect -= text->fTxf;
  69.         txfDeleteNullTxf(text);
  70.         txfRightChartopTxf(text);
  71.     }
  72.     return TRUE;
  73. }
  74.  
  75. BOOL txIDM_DELETEPREV(TX* text)
  76. {
  77.     if (text->fBinedit) {
  78.         if (txLeftBytes(text,1)) txDeleteBytes(text,1);    //WZ4.00Ab 990203 
  79.     } else if (txKeisenIsNeedOp(text,IDM_DELETEPREV) && txKeisenOp(text,IDM_DELETEPREV,NULL)) {
  80.         //WCE1.01 980116 
  81. #if 0    //WZ4.00A 981227 「タブを字下げとみなす」ON時にタブをまとめて削除する機能は不評だったので外した
  82.     } else if (txGetApfu(text) && txGetPrevChar(text) == CHAR_TAB) {
  83.         //WCE1.01 980127 
  84.         text->fUndispCursor++;
  85.         while(1) {
  86.             if (!txLeft(text)) break;
  87.             txDeleteChar(text);
  88.             if (txGetPrevChar(text) != CHAR_TAB) break;
  89.         }
  90.         text->fUndispCursor--;
  91.         txDispCursor(text);
  92.         txDispLocate(text);
  93. #endif
  94.     } else {
  95.         txfLeftChartailTxf(text);
  96.         txIdmPreHeadline(text);
  97.         if (text->fTxf && txIsCurParaTop(text) && txfGetIndent(text,TRUE)) {
  98.             //WZ4.00Bj 990813 BsキーでTMLの字下げを削除できるようにした。
  99.             // MAILのテンプレート指定ダイアログで誤ってTabで字下げしてしまうとBsで削除できなかったので。
  100.             // Shift+Tabで削除できるようにしたが、Bsの方が直感的なので。
  101.         } else if (!(text->fTxf && txfDeleteChartagPrev(text))) {
  102. #if 1//WCE1.01 980206 
  103.             txApfEnterModal(text);
  104.             if (
  105.                 text->fApfing &&
  106.                 (txIbuffIsTop(text,text->cur0) || txIbuffGetPrevByte(text,text->cur0) == CHAR_LF)    //WZ4.00Bl 990911 自動整形で文頭で{Bs}したときに字下げなどを削除するようにした。
  107.             ) {
  108.                 // 行頭でBSした場合
  109.                 txApfEnterConnectPrev(text);
  110.             } else {
  111.                 txDeletePrev(text);
  112.             }
  113. #else
  114.             if (
  115.                 !txIbuffIsTop(text,text->cur0) &&
  116.                 txIbuffGetPrevByte(text,text->cur0) == CHAR_LF &&
  117.                 txApfEnterConnectPrev(text)
  118.             ) {
  119.                 // 行頭でBSした場合
  120.             } else {
  121.                 txApfEnterModal(text);
  122.                 txDeletePrev(text);
  123.             }
  124. #endif
  125.         }
  126.         text->fNoApfExitAtNparaChange = TRUE;
  127.         //
  128.         txfDeleteNullTxf(text);
  129.         txfRightChartopTxf(text);
  130.     }
  131.     return TRUE;
  132. }
  133.  
  134. BOOL txIDM_DELETEWORD(TX* text)
  135. {
  136.     if (!txfDeleteChartag(text)) {
  137.         txDeleteWord(text);
  138.     }
  139.     //
  140.     txfDeleteNullTxf(text);
  141.     txfRightChartopTxf(text);
  142.     return TRUE;
  143. }
  144.  
  145. BOOL txIDM_DELETEWORDMI(TX* text)
  146. {
  147.     if (!txfDeleteChartag(text)) {
  148.         txDeleteWordMi(text);
  149.     }
  150.     //
  151.     txfDeleteNullTxf(text);
  152.     txfRightChartopTxf(text);
  153.     return TRUE;
  154. }
  155.  
  156. BOOL txIDM_DELETEWORDPREV(TX* text)
  157. {
  158.     txfLeftChartailTxf(text);
  159.     if (!txfDeleteChartagPrev(text)) {
  160.         txDeletePrevWord(text);
  161.     }
  162.     //
  163.     txfDeleteNullTxf(text);
  164.     txfRightChartopTxf(text);
  165.     return TRUE;
  166. }
  167.  
  168. BOOL txIDM_DELETEPREVWORD(TX* text)
  169. {
  170.     txDeletePrevWord(text);
  171.     return TRUE;
  172. }
  173.  
  174. BOOL txIDM_DELETEPARATOP(TX* text)
  175. {
  176.     txDeleteParaTop(text);
  177.     return TRUE;
  178. }
  179.  
  180. BOOL txIDM_DELETEPARAEND(TX* text)
  181. {
  182.     txDeleteParaEnd(text);
  183.     return TRUE;
  184. }
  185.  
  186. BOOL txIDM_DELETEPARA(TX* text)
  187. {
  188.     txDeletePara(text);
  189.     return TRUE;
  190. }
  191.  
  192. BOOL txIDM_DELETELINE(TX* text)
  193. {
  194.     txDeleteLine(text);
  195.     return TRUE;
  196. }
  197.  
  198. BOOL txIDM_DELETEPARALINETOP(TX* text)
  199. {
  200.     txDeleteParalineTop(text);
  201.     return TRUE;
  202. }
  203.  
  204. BOOL txIDM_DELETEPARALINEEND(TX* text)
  205. {
  206.     txDeleteParalineEnd(text);
  207.     return TRUE;
  208. }
  209.  
  210. BOOL txIDM_DELETEPARALINE(TX* text)
  211. {
  212.     txDeleteParaline(text);
  213.     return TRUE;
  214. }
  215.  
  216. //##挿入操作
  217.  
  218. BOOL txIDM_INSERTFIND(TX* text)
  219. {
  220.     txInsert(text,sh->search.szfind);
  221.     return TRUE;
  222. }
  223.  
  224. BOOL txIDM_INSERTPARA(TX* text)
  225. {
  226.     txInsertPara(text);
  227.     return TRUE;
  228. }
  229.  
  230. BOOL txIDM_SWITCHINSERT(TX* text)
  231. {
  232.     txSwitchInsert(text);
  233.     return TRUE;
  234. }
  235.  
  236. BOOL txIDM_DUPEPARA(TX* text)
  237. {
  238.     // カーソル位置の論理行を二重化。
  239.     //WZ4.00Bl 990909 IDM_DUPEPARAで選択されている場合は範囲内を二重化するようにした。
  240.     IFILE adr0 = txGetAddress(text);
  241.     if (text->fClip) {
  242.         TX* text2 = textopen(NULL);
  243.         if (text2) {
  244.             txSetUndisp(text);
  245.             txInsertTextSelect(text2,text);
  246.             txJumpSelectEnd(text);
  247.             txSelectQuit(text);
  248.             txCurInsertTextArea(text,text2,0,txGetTextSize(text2));
  249.             txSetDisp(text);
  250.         }
  251.         textclose(text2);
  252.     } else {
  253.         IFILE adrTop = txGetParaTop(text);
  254.         IFILE adrEnd = txGetParaTail(text);
  255.         IFILE lch = adrEnd - adrTop + 10;
  256.         int ly = text->ly;
  257.         mchar* szbuff = malloc(lch);
  258.         if (szbuff) {
  259.             txSetUndispSilent(text);
  260.             txGetParaEx(text,szbuff,lch);
  261.             txJumpParaTop(text);
  262.             txInsert(text,szbuff);
  263.             txInsertReturn(text);
  264.             txJumpAddress(text,adr0);
  265.             txSetLy(text,ly);
  266.             txSetDispSilent(text);
  267.             free(szbuff);
  268.         }
  269.     }
  270.     return TRUE;
  271. }
  272.  
  273. //##アンドゥ操作
  274.  
  275. BOOL txIDM_UNDOPARA(TX* text)
  276. {
  277.     text->fNoApfExitAtNparaChange = TRUE;
  278.     txUndoPara(text);
  279.     return TRUE;
  280. }
  281.  
  282. BOOL txIDM_UNDO(TX* text)
  283. {
  284.     text->fNoApfExitAtNparaChange = TRUE;
  285.     txUndo(text);
  286.     return TRUE;
  287. }
  288.  
  289. BOOL txIDM_REDO(TX* text)
  290. {
  291.     txRedo(text);
  292.     return TRUE;
  293. }
  294.  
  295. BOOL txIDM_UNDELETE(TX* text)
  296. {
  297.     //WCE0.91 970912 削除文字(文字列)の復活
  298.     HSTRBLK sb = sbFromHist(HIST_DELSTR);
  299.     int i = sbGetCount(sb);
  300.     if (i) {
  301.         BOOL fPrev = FALSE;
  302.         mchar* sz;
  303.         i--;
  304.         sz = sbRead(sb,i);
  305.         if (sz[0] == 0x01) {
  306.             fPrev = TRUE;
  307.             sz++;
  308.         }
  309.         if (fPrev) {
  310.             txInsert(text,sz);
  311.         } else {
  312.             txCurInsertBuff(text,sz,strlen(sz));
  313.         }
  314.         sbDelI(sb,i);
  315.         return TRUE;
  316.     }
  317.     return FALSE;
  318. }
  319.  
  320. //##タブ操作
  321.  
  322. BOOL txDeleteClipMouse(TX* text,int idm)
  323. {
  324.     if (text->fClipMouse || (text->modeEditor == ME_WIN && text->fClip && !text->fClipSearch)) {    //WZ4.00A 981229 Windows準拠キーで、Alt+F8で開始した箱型選択をDeleteキーで削除できるようにした。
  325.         switch(idm) {
  326.             case IDM_DELETECHAR:
  327.             case IDM_DELETEPREV: {
  328.                 if (txKeisenIsNeedOp(text,IDM_CLEAR) && txKeisenOp(text,IDM_CLEAR,NULL)) {
  329.                     //WCE1.01 980210 
  330.                     return TRUE;
  331.                 }
  332.                 //WCE0.91 970912 選択して削除でクリップボードにコピーしないようにした
  333.                 txSelectDelete(text);
  334.                 return TRUE;
  335.             }
  336.         }
  337.     }
  338.     return FALSE;
  339. }
  340.  
  341. BOOL txIDM_TAB(TX* text)
  342. {
  343.     if (text->fTxf && (text->filekind != TEXT_HTML)) {    //WZ4.00A 981230 HTML編集で「TABLEを表で表示」後、Tabが入力できるようにした。
  344.         if (txfIsCurParaTop(text) || text->fClip) {
  345.             txfIndentInc(text);
  346.         } else {
  347.             // 桁揃えを挿入
  348.             txfBeam(text);
  349.             txfBeamFlush(text,TRUE);
  350.         }
  351.     } else if (
  352.         ((txApfCheckEnter(text) || text->fApfing) && txIsCurLineTop(text)) ||    //WZ4.00Bj 990812 text->fApf -> txApfCheckEnter(text)に変更。for MAIL EDITORで「ヘッダも表示」しているとき段落先頭でTabが挿入できなかった。
  353.         (text->fApf && text->fClip)
  354.     ) {
  355.         txApfIndentInc(text);
  356.     } else if (txGetApfu(text) && (txIsCurParaTop(text)||text->fClip)) {
  357.         txApfuIndentInc(text);
  358.     } else if (text->fClip && !txIsClipInPara(text)) {
  359.         txIndentInc(text);
  360.     } else {
  361.         txDeleteClipMouse(text,IDM_DELETECHAR);    //WZ4.00Aa 990111 選択してTabを入力した場合、選択した部分を削除するようにした
  362.         txWriteTab(text);
  363.         if (text->fApfu2 || text->fApfuBeamtab) {    //WZ3.90P 981206 fApfuBeamtab時に対応
  364.             txfBeamFlush(text,TRUE);
  365.         }
  366.     }
  367.     return TRUE;
  368. }
  369.  
  370. static BOOL txIsCurParaTopMy(TX* text)
  371. {
  372. // カーソル位置が段落先頭のタブを除いた位置にあるかどうか返す
  373. //WCE1.01 980127 new
  374.     IBUFF len = text->cur0 - text->curpara;
  375.     mchar* p = text->buff + text->curpara;
  376.     while(len--) {
  377.         if (*p++ != CHAR_TAB) {
  378.             return FALSE;
  379.         }
  380.     }
  381.     return TRUE;
  382. }
  383.  
  384. BOOL txIDM_SHIFTTAB(TX* text)
  385. {
  386.     if (text->fTxf && (text->filekind != TEXT_HTML)) {    //WZ4.00A 981230 TEXT_HTMLの動作を改良。
  387.         if (txfIsCurParaTop(text) || text->fClip) {
  388.             txfIndentDec(text);
  389.         }
  390.     } else if (
  391.         ((text->fApf || text->fApfing) && txIsCurLineTop(text)) ||
  392.         (text->fApf && text->fClip)
  393.     ) {
  394.         txApfIndentDec(text);
  395.     } else if (txGetApfu(text) && (txIsCurParaTopMy(text)||text->fClip)) {
  396.         //WCE1.01 980127 カーソルが本文先頭にある場合でも使える様にした
  397.         if (txGetChar(text) != CHAR_TAB && txGetPrevChar(text) == CHAR_TAB) {
  398.             txLeft(text);//WCE1.01 980127 
  399.         }
  400.         txApfuIndentDec(text);
  401.     } else if (txGetApfu(text) && txGetPrevChar(text) == CHAR_TAB) {
  402.         //WCE1.01 980225 for 段落内改行直後の小見出し
  403.         txDeletePrev(text);
  404.     } else if (text->fClip && !txIsClipInPara(text)) {
  405.         txIndentDec(text);
  406.     } else {
  407.         //WZ3.90I 981102 選択してないときは現在行の行頭のタブを1つ削除する
  408.         //WZ4.00Bl 990911 タブでスペースコードを入力ONのとき、選択しないでIDM_SHIFTTABにも対応。
  409.         if (text->fTabToSpace ? txIbuffIsNspace(text,text->curpara,text->tabsize) : text->buff[text->curpara] == CHAR_TAB) {
  410.             int bytes = text->fTabToSpace ? text->tabsize : 1;
  411.             if (txGetAddress(text) == txGetParaTop(text)) {
  412.                 txDeleteBytes(text,bytes);
  413.             } else {
  414.                 IFILE adr0 = txGetAddress(text);
  415.                 int ly0 = text->ly;
  416.                 txSetUndisp(text);
  417.                     txJumpParaTop(text);
  418.                     if (txDeleteBytes(text,bytes)) adr0 -= bytes;
  419.                     txJumpAddress(text,adr0);
  420.                     txSetLy(text,ly0);
  421.                 txSetDisp(text);
  422.             }
  423.         }
  424.     }
  425.     return TRUE;
  426. }
  427.  
  428. //##改行操作
  429.  
  430. #if WINDOWSCE
  431. void txFlushLyForInput(TX* text)
  432. {
  433.     if (_pspc) {    //WZ4.00Bi 990728 PsPC:入力位置が入力パッドにかかった場合はカーソルy座標を繰り上げるようにした    //WZ4.00Bj 990814 改善
  434.         int cy = GetSystemMetrics(SM_CYSCREEN) - GetSystemMetrics(SM_CYCAPTION);
  435.         POINT p;
  436.         p.x = 0;p.y = lyToY(text,text->ly);
  437.         ClientToScreen(text->hwndtext,&p);
  438.         if (p.y + text->cyLine * 2 + 80 > cy) {    // 入力パッドの標準サイズは縦80ドット。CE2.11以降はサイズを調べられるがCE2.0ではできない。
  439.             int ly1;
  440.             p.x = 0;p.y = cy - 80 - text->cyLine * 5;
  441.             ScreenToClient(text->hwndtext,&p);
  442.             ly1 = yToLy(text,p.y);
  443.             if (ly1 < text->ly) txSetLy(text,ly1);
  444.         }
  445.     } else {    //WZ4.00Bi 990728 PWZ:最下行で入力するとき1行スクロールするようにして、IME変換が2行にわたっても表示されるようにした。
  446.         if (text->ly >= text->lcywindow - 2) {
  447.             txSetLy(text,text->ly - 1);
  448.         }
  449.     }
  450. }
  451. #else
  452. void txFlushLyForInput(TX* text)
  453. {
  454. }
  455. #endif
  456.  
  457. static BOOL _txIDM_INSERTRETURN(TX* text,int idm)
  458. {
  459.     txFlushLyForInput(text);
  460.     txIdmPreHeadline(text);
  461.     if (!txIsCurParaTop(text)) {
  462.         //WZ4.00Bl 990911 自動整形モードONで整形中でないときに改行すると、整形してから改行するようにした。箇条書きなどが新しい行に引き継がれるように。ユーザ要望。
  463.         // ただし段落先頭では使いにくいので、やらない。
  464.         txApfEnterModal(text);
  465.     }
  466.     if (text->fNoDispHeadlineString) {    //WZ4.00Bn 991010 
  467.         int iHeadline = txIbuffGetHeadline(text,text->curpara,NULL);
  468.         if (iHeadline && text->cur0 - text->curpara == txHeadlineGetLen(text,iHeadline)) {
  469.             txJumpParaTop(text);
  470.         }
  471.     }
  472.     if (txKeisenIsNeedOp(text,idm) && txKeisenOp(text,idm,NULL)) {
  473.         //WCE1.01 980116 
  474.     } else {
  475.         txfSplit(text);
  476.         if (text->fApfing) {
  477. #if 1//WCE1.01 980331 全面改良
  478.             txSetUndispSilent(text);
  479.             txCurInsertReturn(text);
  480.             txApfExit(text);
  481.             //
  482.             txNextPara(text);
  483.             // set text->apf;
  484.             if (idm == IDM_SHIFTENTER) {
  485.                 PARAFORM_ARTICLE* article = &text->apf;
  486.                 if (article->lchArticle) {
  487.                     article->lcxIndent += article->lchArticle;
  488.                     memset(&article->articleTop,0,&article->articleEnd - &article->articleTop);
  489.                 }
  490.             } else {
  491.                 if (text->apf.fArticleSub) {
  492.                     //WCE1.01 980331 小見出しは引き継がない
  493.                     text->apf.lchArticle = 0;
  494.                 } else {
  495.                     txApfIncrementArticle(text);
  496.                 }
  497.             }
  498.             // enter
  499.             text->fApfing = TRUE;
  500.             text->nparaApf = text->npara;
  501.             text->nline0Apf = text->nline;
  502.             txFlushMenuCheck(text,FMC_FORM);//WCE0.95 970923 
  503.             txFlushCury(text);
  504.             txFlushLx(text);//WCE1.01 980126 カーソル位置が変だった
  505.             txSetDispSilent(text);
  506.             text->fNoApfExitAtNparaChange = TRUE;
  507. #else
  508.             txSetUndispSilent(text);
  509.             txWriteReturn(text);
  510.             txApfExit(text);
  511.             text->fApfing = TRUE;
  512.             txFlushMenuCheck(text,FMC_FORM);//WCE0.95 970923 
  513.             text->nparaApf = text->npara;
  514.             text->nline0Apf = text->nline;//WCE1.00.1 970925 
  515.             // これしないと{Enter}で行分割したときのカーソル位置が変
  516.             txJumpParaTop(text);
  517.             //
  518.             if (idm == IDM_SHIFTENTER) {
  519.                 PARAFORM_ARTICLE* article = &text->apf;
  520.                 if (article->lchArticle) {
  521.                     article->lcxIndent += article->lchArticle;
  522.                     memset(&article->articleTop,0,&article->articleEnd - &article->articleTop);
  523.                 }
  524.             } else {
  525.                 txApfIncrementArticle(text);
  526.             }
  527.             txFlushLx(text);//WCE1.01 980126 カーソル位置が変だった
  528.             txSetDispSilent(text);
  529.             text->fNoApfExitAtNparaChange = TRUE;
  530. #endif
  531.         } else if (idm == IDM_SHIFTENTER && (txGetApfu(text) || text->fTxf)) {
  532.             if (text->modeApfu || text->fApfuTab || text->fApfuBeamtab) {
  533.                 //PWZ2BETA0.3 980516 段落体裁の場合は、
  534.                 // CHAR_CRによる段落内改行はしない。
  535.                 // PWZ1.0や他のエディタとの親和性を高める
  536.                 text->fApfuShiftEnter++;
  537.                 txWriteReturn(text);
  538.                 text->fApfuShiftEnter--;
  539.             } else {
  540.                 //WCE1.01 980225 CHAR_CRを段落内改行とみなす様にした。
  541.                 txInsertChar(text,CHAR_CR);
  542.             }
  543.         } else {
  544.             txWriteReturn(text);
  545.         }
  546.         txfRightChartopTxf(text);
  547.     }
  548.     txFlushLyForInput(text);
  549.     return TRUE;
  550. }
  551.  
  552. BOOL txIDM_SHIFTENTER(TX* text)
  553. {
  554.     return _txIDM_INSERTRETURN(text,IDM_SHIFTENTER);
  555. }
  556.  
  557. BOOL txIDM_INSERTRETURN(TX* text)
  558. {
  559.     return _txIDM_INSERTRETURN(text,IDM_INSERTRETURN);
  560. }
  561.  
  562. //##移動操作
  563. //WZ4.00Ec 010125 カーソル段落を上下に移動するIDM_MOVEPREVPARA/IDM_MOVENEXTPARAを追加。
  564.  
  565. static BOOL txParaIsEof(TX* text)
  566. {
  567.     return txIbuffIsEof(text,txIbuffGetParaEnd(text,text->curpara));
  568. }
  569.  
  570. static BOOL _txIDM_MOVENEXTPARA(TX* text,BOOL fPrev)
  571. {
  572. //WZ4.00Ec 010125 new
  573.     BOOL ret = FALSE;
  574.     if (text->fClip) {
  575.         if (txPrivatePush(text)) {
  576.             IFILE size = txSelectGetSize(text);
  577.             ret = TRUE;
  578.             txSetUndisp(text);
  579.             txSelectDelete(text);
  580.             (fPrev?txPrevPara:txNextPara)(text);
  581.             txPrivatePopJump(text);
  582.             txSelectEx(text,CLIP_MOUSE);
  583.             txLeftBytes(text,size);
  584.             txSetDisp(text);
  585.         }
  586.     } else {
  587.         if (fPrev ? (text->npara >= 2) : !txParaIsEof(text)) {
  588.             mchar* p = txGetParaAlloc(text);
  589.             if (p) {
  590.                 txSetUndisp(text);
  591.                 if (txDeleteParaPrim(text)) {
  592.                     ret = TRUE;
  593.                     (fPrev?txPrevPara:txNextPara)(text);
  594.                     txCurInsertReturn(text);
  595.                     txCurInsert(text,p);
  596.                 }
  597.                 txSetDisp(text);
  598.             }
  599.             free(p);
  600.         }
  601.     }
  602.     return ret;
  603. }
  604.  
  605. BOOL txIDM_MOVEPREVPARA(TX* text)
  606. {
  607. //WZ4.00Ec 010125 new
  608.     return _txIDM_MOVENEXTPARA(text,TRUE);
  609. }
  610.  
  611. BOOL txIDM_MOVENEXTPARA(TX* text)
  612. {
  613. //WZ4.00Ec 010125 new
  614.     return _txIDM_MOVENEXTPARA(text,FALSE);
  615. }
  616.  
  617. //##選択操作
  618.  
  619. BOOL txIDM_SELECT(TX* text)
  620. {
  621.     txSelect(text);
  622.     return TRUE;
  623. }
  624.  
  625. BOOL txIDM_SELECTWORD(TX* text)
  626. {
  627.     txSelectWord(text);
  628.     return TRUE;
  629. }
  630.  
  631. BOOL txIDM_SELECTLINE(TX* text)
  632. {
  633.     if (text->fClip) {
  634.         txSelectQuit(text);
  635.     } else {
  636.         txSelectEx(text,CLIP_LINE);
  637.     }
  638.     return TRUE;
  639. }
  640.  
  641. BOOL txIDM_SELECTBOX(TX* text)
  642. {
  643.     txSelectBox(text);
  644.     return TRUE;
  645. }
  646.  
  647. BOOL txIDM_SELECTALL(TX* text)
  648. {
  649.     txSelectAll(text);
  650.     return TRUE;
  651. }
  652.  
  653. #if !WINDOWSCE
  654. BOOL txIDM_SELECTSWITCH(TX* text)
  655. {
  656.     if (txGetAddress(text) == text->clipcur0 || text->fClip == 0) {
  657.         int fClip = 0;
  658.         switch(text->fClip) {
  659.             case 0: fClip = CLIP_CHAR;break;
  660.             case CLIP_CHAR: fClip = CLIP_WORD;break;
  661.             case CLIP_WORD: fClip = CLIP_SENTENCE;break;
  662.             case CLIP_SENTENCE: fClip = CLIP_LINECUR;break;
  663.             case CLIP_LINE:
  664.             case CLIP_LINECUR: fClip = CLIP_PARACUR;break;
  665.         }
  666.         txSelectEx(text,fClip);
  667.     } else {
  668.         txSelectQuit(text);
  669.     }
  670.     return TRUE;
  671. }
  672. #endif
  673.  
  674. //##カットアンドペースト
  675.  
  676. #if !__TXC__
  677. BOOL txIDM_POP(TX* text)
  678. {
  679. #if 1//WCE0.93 970920 テキストスタック実装
  680.     //WZ4.00Bl 990912 「テキストスタックのペースト後、カーソルを移動する」がONのとき、VZ.KEY以外の場合も反映するようにした。ユーザ要望。特に問題はない。
  681.     BOOL fJump = (text->fJumpTxPasteEnd);    //WZ4.00A 981229 VZ準拠キー定義で「ペースト後カーソル移動」ONのとき、IDM_POPでカーソルを移動するようにした。
  682.     txSelectOverwriteModal(text);    //WZ4.00Bl 990912 IDM_POPを選択置換するようにした。
  683.     if (
  684.         (!clipIsWz() && clipGetExistText()) ||
  685.         !tsGetExist()
  686.     ) {
  687.         txClipPaste(text,HCLIP_WIN,fJump,0);
  688.         clipClear(HCLIP_WIN);
  689.     } else {
  690.         txClipPaste(text,HCLIP_TS,fJump,0);
  691.         {
  692.             TSHANDLE ts;
  693.             if (tsOpen(&ts)) {
  694.                 tsClearTop(&ts);
  695.                 tsClose(&ts);
  696.             }
  697.         }
  698.         clipClear(HCLIP_WIN);
  699.     }
  700.     return TRUE;
  701. #else
  702.     txClipPaste(text,HCLIP_WIN,FALSE,0);
  703.     clipClear(HCLIP_WIN);//WCE0.91 970912 VZ.KEY ^J改良
  704.     return TRUE;
  705. #endif
  706. }
  707. #endif    // !__TXC__
  708.  
  709. BOOL txIDM_PASTE(TX* text)
  710. {
  711.     if (txKeisenIsNeedOp(text,IDM_PASTE) && txKeisenOp(text,IDM_PASTE,NULL)) {
  712.         //WCE1.01 980210 
  713.     } else {
  714.         txSelectOverwriteModal(text);
  715.         txPaste(text);
  716.     }
  717.     return TRUE;
  718. }
  719.  
  720. BOOL txIDM_PASTESELECT(TX* text)
  721. {
  722.     txSetUndisp(text);
  723.     txSelectOverwriteModal(text);    //WZ4.00Bl 990912 IDM_PASTESELECTを選択置換するようにした。
  724.     {
  725.         IFILE adr0 = txGetAddress(text);
  726.         int ly0 = text->ly;
  727.         txClipPaste(text,HCLIP_WIN,TRUE,CLIP_CHAR);
  728.         txSelectEx(text,CLIP_MOUSE);
  729.         txJumpAddress(text,adr0);txSetLy(text,ly0);
  730.     }
  731.     txSetDisp(text);
  732.     return TRUE;
  733. }
  734.  
  735. BOOL txIDM_PASTECHAR(TX* text)
  736. {
  737.     txSelectOverwriteModal(text);    //WZ4.00Bl 990912 IDM_PASTECHARを選択置換するようにした。
  738.     txClipPaste(text,HCLIP_WIN,TRUE,CLIP_CHAR);
  739.     return TRUE;
  740. }
  741.  
  742. #if !__TXC__
  743. BOOL txIDM_PASTEVZ(TX* text)
  744. {
  745. #if 1    //WZ4.00Ec 010131 VZ.KEYで、^J後、テキストスタックにデータがある時に^KCした場合、テキストスタックからペーストするようにした。
  746.     if (clipGetExistText()) {
  747.         if (text->fJumpTxPasteEnd) {
  748.             txPaste(text);
  749.         } else {
  750.             txClipPaste(text,HCLIP_WIN,FALSE,0);
  751.         }
  752.         return TRUE;
  753.     } else if (tsGetExist()) {
  754.         txClipPaste(text,HCLIP_TS,text->fJumpTxPasteEnd,0);
  755.         return TRUE;
  756.     }
  757.     return FALSE;
  758. #else
  759.     if (text->fJumpTxPasteEnd) {
  760.         txPaste(text);
  761.     } else {
  762.         txClipPaste(text,HCLIP_WIN,FALSE,0);
  763.     }
  764.     return TRUE;
  765. #endif
  766. }
  767. #endif
  768.  
  769. static BOOL txIdmCopycut(TX* text,int idm)
  770. {
  771. // 通常のカット/コピーを行うか返す。
  772. // 行わない場合は必要に応じて段落のコピー等を行う。
  773. //WZ3.90I 981103 new
  774.     if (text->fClip) {
  775.         return TRUE;
  776.     } else {
  777.         BOOL fClipboardNoSelect = text->fClipboardNoSelect;
  778.         switch(idm) {
  779.             case IDM_CUTVZ:
  780.             case IDM_COPYQUITVZ: fClipboardNoSelect = TRUE;break;
  781.         }
  782.         if (fClipboardNoSelect) {
  783.             switch(idm) {
  784.                 case IDM_CUT:
  785.                 case IDM_CUTVZ: {
  786.                     txClipCopyEx(text,0,0,HCLIP_WIN,CLIP_COPYPARA1,0,0);
  787.     #if 1//WZ4.00Bl 990911 4Bα1.5で変更した「選択しないでIDM_CUTVZしたとき削除バッファに入れる」動作を元に戻して入れないようにしてVZの仕様に合わせた。ユーザ要望。
  788.                     txDeletePara(text);
  789.     #else
  790.                     #if !WINDOWSCE
  791.                     text->fPushDeleteString++;    //WZ4.00Bj 990825 選択しないでIDM_CUTVZしたとき削除した内容を削除バッファに入れるようにした(!PWZ)。
  792.                     #endif
  793.                     txDeletePara(text);
  794.                     #if !WINDOWSCE
  795.                     text->fPushDeleteString--;
  796.                     #endif
  797.     #endif
  798.                     break;
  799.                 }
  800.                 case IDM_CLEAR: {
  801.                     txDeletePara(text);
  802.                     break;
  803.                 }
  804.                 case IDM_COPY:
  805.                 case IDM_COPYQUIT:
  806.                 case IDM_COPYQUITVZ: {
  807.                     txClipCopyEx(text,0,0,HCLIP_WIN,CLIP_COPYPARA1,0,0);
  808.                     break;
  809.                 }
  810.             }
  811.         }
  812.         return FALSE;
  813.     }
  814. }
  815.  
  816. BOOL txIDM_CUT(TX* text)
  817. {
  818.     if (txIdmCopycut(text,IDM_CUT)) {
  819.         if (txKeisenIsNeedOp(text,IDM_CUT) && txKeisenOp(text,IDM_CUT,NULL)) {
  820.             //WCE1.01 980210 
  821.         } else {
  822.             txSelectCopyDelete(text);
  823.         }
  824.     }
  825.     return TRUE;
  826. }
  827.  
  828. BOOL txIDM_CUTVZ(TX* text)
  829. {
  830.     if (txIdmCopycut(text,IDM_CUTVZ)) {
  831.         if (txKeisenIsNeedOp(text,IDM_CUTVZ) && txKeisenOp(text,IDM_CUTVZ,NULL)) {
  832.             //WCE1.01 980210 
  833.         } else {
  834.             txSelectCopyDelete(text);
  835.         }
  836.     }
  837.     return TRUE;
  838. }
  839.  
  840. BOOL txIDM_CLEAR(TX* text)
  841. {
  842.     if (txIdmCopycut(text,IDM_CLEAR)) {
  843.         if (txKeisenIsNeedOp(text,IDM_CLEAR) && txKeisenOp(text,IDM_CLEAR,NULL)) {
  844.             //WZ3.90O 981203 
  845.         } else {
  846.             txSelectDelete(text);
  847.         }
  848.     }
  849.     return TRUE;
  850. }
  851.  
  852. BOOL txIDM_COPY(TX* text)
  853. {
  854.     if (txIdmCopycut(text,IDM_COPY)) {
  855.         txSelectCopy(text);
  856.         text->fClipMouse = TRUE;    //WZ3.90I 981029 WZ3.0のtxClipboardCopyの仕様に合わせた
  857.     }
  858.     return TRUE;
  859. }
  860.  
  861. BOOL txIDM_COPYQUIT(TX* text)
  862. {
  863.     if (txIdmCopycut(text,IDM_COPYQUIT)) {
  864.         txSelectCopyQuit(text);
  865.     }
  866.     return TRUE;
  867. }
  868.  
  869. BOOL txIDM_COPYQUITVZ(TX* text)
  870. {
  871.     if (txIdmCopycut(text,IDM_COPYQUITVZ)) {
  872.         txSelectCopyQuit(text);
  873.     }
  874.     return TRUE;
  875. }
  876.  
  877. //##プラグイン
  878.  
  879. #if __TXC__
  880. void __pluginGetProperty(mchar* prop,txstr res)
  881. {
  882. //information("%s",prop);
  883.     if (!stricmp(prop,"name")) res = "編集IDM処理";
  884.     if (!stricmp(prop,"author")) res = sysGetName();
  885.     if (!stricmp(prop,"version")) res = sysGetVersionPrim();
  886. }
  887.  
  888. static HOOKRESULT CALLBACK wndprocTextHook(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  889. {
  890.     if (message == WM_TXEVENT && wParam == TXEVENT_IDMEXEC) {
  891.         TX* text = hwndtextGetText(hwnd);
  892.         int idm = lParam;
  893.         switch(idm) {
  894.             case IDM_COPY: {    // サンプル
  895. statprintf("IDM_COPY by macro");
  896.                 txIDM_COPY(text);
  897.                 return HOOK_CAPTURE;
  898.             }
  899.         }
  900.     }
  901.     return HOOK_CONTINUE;
  902. }
  903.  
  904. void __on_txFrameNew(TX* text)
  905. {
  906.     txSetHookWndproctextTxpcode(text,wndprocTextHook);
  907. }
  908.  
  909. #endif
  910.