home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2002 March
/
VPR0203B.ISO
/
APUPDATE
/
VC
/
TXC0601A
/
TXC0601A.LZH
/
_IDMEDIT.C
< prev
next >
Wrap
C/C++ Source or Header
|
2001-02-07
|
22KB
|
910 lines
/*
編集関係のIDMコマンド処理群
Start 99年11月19日
*/
#if __TXC__
#include <_wz.h>
#include <windows.h>
#include <windowsx.h>
#include <_idm.h>
#else
#include "_sys.h"
#endif
#include "_idmlib.h"
//##基本
static BOOL txIdmPreHeadline(TX* text)
{
//WZ4.00Bn 991010 「見出し文字列を表示しない」場合の見出し行の行頭でIDM_INSERTRETURN・IDM_DELETEPREVしたときに見出しを保存して改行・削除するようにした。ユーザ要望。
//WZ4.00Bn 991010 new
if (text->fNoDispHeadlineString) {
int iHeadline = txIbuffGetHeadline(text,text->curpara,NULL);
if (iHeadline && text->cur0 - text->curpara == txHeadlineGetLen(text,iHeadline)) {
txJumpParaTop(text);
return TRUE;
}
}
return FALSE;
}
//##削除操作
BOOL txIDM_DELETECHAR(TX* text)
{
if (text->fBinedit) {
txDeleteBytes(text,1); //WZ4.00Ab 990203
} else if (txKeisenIsNeedOp(text,IDM_DELETECHAR) && txKeisenOp(text,IDM_DELETECHAR,NULL)) {
//WCE1.01 980116
#if 0 //WZ4.00A 981227 「タブを字下げとみなす」ON時にタブをまとめて削除する機能は不評だったので外した
} else if (txGetApfu(text) && txGetChar(text) == CHAR_TAB) {
//WCE1.01 980127
text->fUndispCursor++;
while(1) {
if (!txDeleteChar(text)) break;
if (txGetChar(text) != CHAR_TAB) break;
}
text->fUndispCursor--;
txDispCursor(text);
txDispLocate(text);
#endif
} else {
text->fTxfDirect += text->fTxf;
if (!(text->fTxf && txfDeleteChartag(text))) {
if (txIsCurReturn(text) && txApfEnterConnect(text)) {
// OK
} else {
if (text->fApf && !text->fApfing) {
txApfEnterDeleteParaform(text);
} else {
txApfEnterModal(text);
txDeleteChar(text);
}
}
}
text->fNoApfExitAtNparaChange = TRUE;
//
text->fTxfDirect -= text->fTxf;
txfDeleteNullTxf(text);
txfRightChartopTxf(text);
}
return TRUE;
}
BOOL txIDM_DELETEPREV(TX* text)
{
if (text->fBinedit) {
if (txLeftBytes(text,1)) txDeleteBytes(text,1); //WZ4.00Ab 990203
} else if (txKeisenIsNeedOp(text,IDM_DELETEPREV) && txKeisenOp(text,IDM_DELETEPREV,NULL)) {
//WCE1.01 980116
#if 0 //WZ4.00A 981227 「タブを字下げとみなす」ON時にタブをまとめて削除する機能は不評だったので外した
} else if (txGetApfu(text) && txGetPrevChar(text) == CHAR_TAB) {
//WCE1.01 980127
text->fUndispCursor++;
while(1) {
if (!txLeft(text)) break;
txDeleteChar(text);
if (txGetPrevChar(text) != CHAR_TAB) break;
}
text->fUndispCursor--;
txDispCursor(text);
txDispLocate(text);
#endif
} else {
txfLeftChartailTxf(text);
txIdmPreHeadline(text);
if (text->fTxf && txIsCurParaTop(text) && txfGetIndent(text,TRUE)) {
//WZ4.00Bj 990813 BsキーでTMLの字下げを削除できるようにした。
// MAILのテンプレート指定ダイアログで誤ってTabで字下げしてしまうとBsで削除できなかったので。
// Shift+Tabで削除できるようにしたが、Bsの方が直感的なので。
} else if (!(text->fTxf && txfDeleteChartagPrev(text))) {
#if 1//WCE1.01 980206
txApfEnterModal(text);
if (
text->fApfing &&
(txIbuffIsTop(text,text->cur0) || txIbuffGetPrevByte(text,text->cur0) == CHAR_LF) //WZ4.00Bl 990911 自動整形で文頭で{Bs}したときに字下げなどを削除するようにした。
) {
// 行頭でBSした場合
txApfEnterConnectPrev(text);
} else {
txDeletePrev(text);
}
#else
if (
!txIbuffIsTop(text,text->cur0) &&
txIbuffGetPrevByte(text,text->cur0) == CHAR_LF &&
txApfEnterConnectPrev(text)
) {
// 行頭でBSした場合
} else {
txApfEnterModal(text);
txDeletePrev(text);
}
#endif
}
text->fNoApfExitAtNparaChange = TRUE;
//
txfDeleteNullTxf(text);
txfRightChartopTxf(text);
}
return TRUE;
}
BOOL txIDM_DELETEWORD(TX* text)
{
if (!txfDeleteChartag(text)) {
txDeleteWord(text);
}
//
txfDeleteNullTxf(text);
txfRightChartopTxf(text);
return TRUE;
}
BOOL txIDM_DELETEWORDMI(TX* text)
{
if (!txfDeleteChartag(text)) {
txDeleteWordMi(text);
}
//
txfDeleteNullTxf(text);
txfRightChartopTxf(text);
return TRUE;
}
BOOL txIDM_DELETEWORDPREV(TX* text)
{
txfLeftChartailTxf(text);
if (!txfDeleteChartagPrev(text)) {
txDeletePrevWord(text);
}
//
txfDeleteNullTxf(text);
txfRightChartopTxf(text);
return TRUE;
}
BOOL txIDM_DELETEPREVWORD(TX* text)
{
txDeletePrevWord(text);
return TRUE;
}
BOOL txIDM_DELETEPARATOP(TX* text)
{
txDeleteParaTop(text);
return TRUE;
}
BOOL txIDM_DELETEPARAEND(TX* text)
{
txDeleteParaEnd(text);
return TRUE;
}
BOOL txIDM_DELETEPARA(TX* text)
{
txDeletePara(text);
return TRUE;
}
BOOL txIDM_DELETELINE(TX* text)
{
txDeleteLine(text);
return TRUE;
}
BOOL txIDM_DELETEPARALINETOP(TX* text)
{
txDeleteParalineTop(text);
return TRUE;
}
BOOL txIDM_DELETEPARALINEEND(TX* text)
{
txDeleteParalineEnd(text);
return TRUE;
}
BOOL txIDM_DELETEPARALINE(TX* text)
{
txDeleteParaline(text);
return TRUE;
}
//##挿入操作
BOOL txIDM_INSERTFIND(TX* text)
{
txInsert(text,sh->search.szfind);
return TRUE;
}
BOOL txIDM_INSERTPARA(TX* text)
{
txInsertPara(text);
return TRUE;
}
BOOL txIDM_SWITCHINSERT(TX* text)
{
txSwitchInsert(text);
return TRUE;
}
BOOL txIDM_DUPEPARA(TX* text)
{
// カーソル位置の論理行を二重化。
//WZ4.00Bl 990909 IDM_DUPEPARAで選択されている場合は範囲内を二重化するようにした。
IFILE adr0 = txGetAddress(text);
if (text->fClip) {
TX* text2 = textopen(NULL);
if (text2) {
txSetUndisp(text);
txInsertTextSelect(text2,text);
txJumpSelectEnd(text);
txSelectQuit(text);
txCurInsertTextArea(text,text2,0,txGetTextSize(text2));
txSetDisp(text);
}
textclose(text2);
} else {
IFILE adrTop = txGetParaTop(text);
IFILE adrEnd = txGetParaTail(text);
IFILE lch = adrEnd - adrTop + 10;
int ly = text->ly;
mchar* szbuff = malloc(lch);
if (szbuff) {
txSetUndispSilent(text);
txGetParaEx(text,szbuff,lch);
txJumpParaTop(text);
txInsert(text,szbuff);
txInsertReturn(text);
txJumpAddress(text,adr0);
txSetLy(text,ly);
txSetDispSilent(text);
free(szbuff);
}
}
return TRUE;
}
//##アンドゥ操作
BOOL txIDM_UNDOPARA(TX* text)
{
text->fNoApfExitAtNparaChange = TRUE;
txUndoPara(text);
return TRUE;
}
BOOL txIDM_UNDO(TX* text)
{
text->fNoApfExitAtNparaChange = TRUE;
txUndo(text);
return TRUE;
}
BOOL txIDM_REDO(TX* text)
{
txRedo(text);
return TRUE;
}
BOOL txIDM_UNDELETE(TX* text)
{
//WCE0.91 970912 削除文字(文字列)の復活
HSTRBLK sb = sbFromHist(HIST_DELSTR);
int i = sbGetCount(sb);
if (i) {
BOOL fPrev = FALSE;
mchar* sz;
i--;
sz = sbRead(sb,i);
if (sz[0] == 0x01) {
fPrev = TRUE;
sz++;
}
if (fPrev) {
txInsert(text,sz);
} else {
txCurInsertBuff(text,sz,strlen(sz));
}
sbDelI(sb,i);
return TRUE;
}
return FALSE;
}
//##タブ操作
BOOL txDeleteClipMouse(TX* text,int idm)
{
if (text->fClipMouse || (text->modeEditor == ME_WIN && text->fClip && !text->fClipSearch)) { //WZ4.00A 981229 Windows準拠キーで、Alt+F8で開始した箱型選択をDeleteキーで削除できるようにした。
switch(idm) {
case IDM_DELETECHAR:
case IDM_DELETEPREV: {
if (txKeisenIsNeedOp(text,IDM_CLEAR) && txKeisenOp(text,IDM_CLEAR,NULL)) {
//WCE1.01 980210
return TRUE;
}
//WCE0.91 970912 選択して削除でクリップボードにコピーしないようにした
txSelectDelete(text);
return TRUE;
}
}
}
return FALSE;
}
BOOL txIDM_TAB(TX* text)
{
if (text->fTxf && (text->filekind != TEXT_HTML)) { //WZ4.00A 981230 HTML編集で「TABLEを表で表示」後、Tabが入力できるようにした。
if (txfIsCurParaTop(text) || text->fClip) {
txfIndentInc(text);
} else {
// 桁揃えを挿入
txfBeam(text);
txfBeamFlush(text,TRUE);
}
} else if (
((txApfCheckEnter(text) || text->fApfing) && txIsCurLineTop(text)) || //WZ4.00Bj 990812 text->fApf -> txApfCheckEnter(text)に変更。for MAIL EDITORで「ヘッダも表示」しているとき段落先頭でTabが挿入できなかった。
(text->fApf && text->fClip)
) {
txApfIndentInc(text);
} else if (txGetApfu(text) && (txIsCurParaTop(text)||text->fClip)) {
txApfuIndentInc(text);
} else if (text->fClip && !txIsClipInPara(text)) {
txIndentInc(text);
} else {
txDeleteClipMouse(text,IDM_DELETECHAR); //WZ4.00Aa 990111 選択してTabを入力した場合、選択した部分を削除するようにした
txWriteTab(text);
if (text->fApfu2 || text->fApfuBeamtab) { //WZ3.90P 981206 fApfuBeamtab時に対応
txfBeamFlush(text,TRUE);
}
}
return TRUE;
}
static BOOL txIsCurParaTopMy(TX* text)
{
// カーソル位置が段落先頭のタブを除いた位置にあるかどうか返す
//WCE1.01 980127 new
IBUFF len = text->cur0 - text->curpara;
mchar* p = text->buff + text->curpara;
while(len--) {
if (*p++ != CHAR_TAB) {
return FALSE;
}
}
return TRUE;
}
BOOL txIDM_SHIFTTAB(TX* text)
{
if (text->fTxf && (text->filekind != TEXT_HTML)) { //WZ4.00A 981230 TEXT_HTMLの動作を改良。
if (txfIsCurParaTop(text) || text->fClip) {
txfIndentDec(text);
}
} else if (
((text->fApf || text->fApfing) && txIsCurLineTop(text)) ||
(text->fApf && text->fClip)
) {
txApfIndentDec(text);
} else if (txGetApfu(text) && (txIsCurParaTopMy(text)||text->fClip)) {
//WCE1.01 980127 カーソルが本文先頭にある場合でも使える様にした
if (txGetChar(text) != CHAR_TAB && txGetPrevChar(text) == CHAR_TAB) {
txLeft(text);//WCE1.01 980127
}
txApfuIndentDec(text);
} else if (txGetApfu(text) && txGetPrevChar(text) == CHAR_TAB) {
//WCE1.01 980225 for 段落内改行直後の小見出し
txDeletePrev(text);
} else if (text->fClip && !txIsClipInPara(text)) {
txIndentDec(text);
} else {
//WZ3.90I 981102 選択してないときは現在行の行頭のタブを1つ削除する
//WZ4.00Bl 990911 タブでスペースコードを入力ONのとき、選択しないでIDM_SHIFTTABにも対応。
if (text->fTabToSpace ? txIbuffIsNspace(text,text->curpara,text->tabsize) : text->buff[text->curpara] == CHAR_TAB) {
int bytes = text->fTabToSpace ? text->tabsize : 1;
if (txGetAddress(text) == txGetParaTop(text)) {
txDeleteBytes(text,bytes);
} else {
IFILE adr0 = txGetAddress(text);
int ly0 = text->ly;
txSetUndisp(text);
txJumpParaTop(text);
if (txDeleteBytes(text,bytes)) adr0 -= bytes;
txJumpAddress(text,adr0);
txSetLy(text,ly0);
txSetDisp(text);
}
}
}
return TRUE;
}
//##改行操作
#if WINDOWSCE
void txFlushLyForInput(TX* text)
{
if (_pspc) { //WZ4.00Bi 990728 PsPC:入力位置が入力パッドにかかった場合はカーソルy座標を繰り上げるようにした //WZ4.00Bj 990814 改善
int cy = GetSystemMetrics(SM_CYSCREEN) - GetSystemMetrics(SM_CYCAPTION);
POINT p;
p.x = 0;p.y = lyToY(text,text->ly);
ClientToScreen(text->hwndtext,&p);
if (p.y + text->cyLine * 2 + 80 > cy) { // 入力パッドの標準サイズは縦80ドット。CE2.11以降はサイズを調べられるがCE2.0ではできない。
int ly1;
p.x = 0;p.y = cy - 80 - text->cyLine * 5;
ScreenToClient(text->hwndtext,&p);
ly1 = yToLy(text,p.y);
if (ly1 < text->ly) txSetLy(text,ly1);
}
} else { //WZ4.00Bi 990728 PWZ:最下行で入力するとき1行スクロールするようにして、IME変換が2行にわたっても表示されるようにした。
if (text->ly >= text->lcywindow - 2) {
txSetLy(text,text->ly - 1);
}
}
}
#else
void txFlushLyForInput(TX* text)
{
}
#endif
static BOOL _txIDM_INSERTRETURN(TX* text,int idm)
{
txFlushLyForInput(text);
txIdmPreHeadline(text);
if (!txIsCurParaTop(text)) {
//WZ4.00Bl 990911 自動整形モードONで整形中でないときに改行すると、整形してから改行するようにした。箇条書きなどが新しい行に引き継がれるように。ユーザ要望。
// ただし段落先頭では使いにくいので、やらない。
txApfEnterModal(text);
}
if (text->fNoDispHeadlineString) { //WZ4.00Bn 991010
int iHeadline = txIbuffGetHeadline(text,text->curpara,NULL);
if (iHeadline && text->cur0 - text->curpara == txHeadlineGetLen(text,iHeadline)) {
txJumpParaTop(text);
}
}
if (txKeisenIsNeedOp(text,idm) && txKeisenOp(text,idm,NULL)) {
//WCE1.01 980116
} else {
txfSplit(text);
if (text->fApfing) {
#if 1//WCE1.01 980331 全面改良
txSetUndispSilent(text);
txCurInsertReturn(text);
txApfExit(text);
//
txNextPara(text);
// set text->apf;
if (idm == IDM_SHIFTENTER) {
PARAFORM_ARTICLE* article = &text->apf;
if (article->lchArticle) {
article->lcxIndent += article->lchArticle;
memset(&article->articleTop,0,&article->articleEnd - &article->articleTop);
}
} else {
if (text->apf.fArticleSub) {
//WCE1.01 980331 小見出しは引き継がない
text->apf.lchArticle = 0;
} else {
txApfIncrementArticle(text);
}
}
// enter
text->fApfing = TRUE;
text->nparaApf = text->npara;
text->nline0Apf = text->nline;
txFlushMenuCheck(text,FMC_FORM);//WCE0.95 970923
txFlushCury(text);
txFlushLx(text);//WCE1.01 980126 カーソル位置が変だった
txSetDispSilent(text);
text->fNoApfExitAtNparaChange = TRUE;
#else
txSetUndispSilent(text);
txWriteReturn(text);
txApfExit(text);
text->fApfing = TRUE;
txFlushMenuCheck(text,FMC_FORM);//WCE0.95 970923
text->nparaApf = text->npara;
text->nline0Apf = text->nline;//WCE1.00.1 970925
// これしないと{Enter}で行分割したときのカーソル位置が変
txJumpParaTop(text);
//
if (idm == IDM_SHIFTENTER) {
PARAFORM_ARTICLE* article = &text->apf;
if (article->lchArticle) {
article->lcxIndent += article->lchArticle;
memset(&article->articleTop,0,&article->articleEnd - &article->articleTop);
}
} else {
txApfIncrementArticle(text);
}
txFlushLx(text);//WCE1.01 980126 カーソル位置が変だった
txSetDispSilent(text);
text->fNoApfExitAtNparaChange = TRUE;
#endif
} else if (idm == IDM_SHIFTENTER && (txGetApfu(text) || text->fTxf)) {
if (text->modeApfu || text->fApfuTab || text->fApfuBeamtab) {
//PWZ2BETA0.3 980516 段落体裁の場合は、
// CHAR_CRによる段落内改行はしない。
// PWZ1.0や他のエディタとの親和性を高める
text->fApfuShiftEnter++;
txWriteReturn(text);
text->fApfuShiftEnter--;
} else {
//WCE1.01 980225 CHAR_CRを段落内改行とみなす様にした。
txInsertChar(text,CHAR_CR);
}
} else {
txWriteReturn(text);
}
txfRightChartopTxf(text);
}
txFlushLyForInput(text);
return TRUE;
}
BOOL txIDM_SHIFTENTER(TX* text)
{
return _txIDM_INSERTRETURN(text,IDM_SHIFTENTER);
}
BOOL txIDM_INSERTRETURN(TX* text)
{
return _txIDM_INSERTRETURN(text,IDM_INSERTRETURN);
}
//##移動操作
//WZ4.00Ec 010125 カーソル段落を上下に移動するIDM_MOVEPREVPARA/IDM_MOVENEXTPARAを追加。
static BOOL txParaIsEof(TX* text)
{
return txIbuffIsEof(text,txIbuffGetParaEnd(text,text->curpara));
}
static BOOL _txIDM_MOVENEXTPARA(TX* text,BOOL fPrev)
{
//WZ4.00Ec 010125 new
BOOL ret = FALSE;
if (text->fClip) {
if (txPrivatePush(text)) {
IFILE size = txSelectGetSize(text);
ret = TRUE;
txSetUndisp(text);
txSelectDelete(text);
(fPrev?txPrevPara:txNextPara)(text);
txPrivatePopJump(text);
txSelectEx(text,CLIP_MOUSE);
txLeftBytes(text,size);
txSetDisp(text);
}
} else {
if (fPrev ? (text->npara >= 2) : !txParaIsEof(text)) {
mchar* p = txGetParaAlloc(text);
if (p) {
txSetUndisp(text);
if (txDeleteParaPrim(text)) {
ret = TRUE;
(fPrev?txPrevPara:txNextPara)(text);
txCurInsertReturn(text);
txCurInsert(text,p);
}
txSetDisp(text);
}
free(p);
}
}
return ret;
}
BOOL txIDM_MOVEPREVPARA(TX* text)
{
//WZ4.00Ec 010125 new
return _txIDM_MOVENEXTPARA(text,TRUE);
}
BOOL txIDM_MOVENEXTPARA(TX* text)
{
//WZ4.00Ec 010125 new
return _txIDM_MOVENEXTPARA(text,FALSE);
}
//##選択操作
BOOL txIDM_SELECT(TX* text)
{
txSelect(text);
return TRUE;
}
BOOL txIDM_SELECTWORD(TX* text)
{
txSelectWord(text);
return TRUE;
}
BOOL txIDM_SELECTLINE(TX* text)
{
if (text->fClip) {
txSelectQuit(text);
} else {
txSelectEx(text,CLIP_LINE);
}
return TRUE;
}
BOOL txIDM_SELECTBOX(TX* text)
{
txSelectBox(text);
return TRUE;
}
BOOL txIDM_SELECTALL(TX* text)
{
txSelectAll(text);
return TRUE;
}
#if !WINDOWSCE
BOOL txIDM_SELECTSWITCH(TX* text)
{
if (txGetAddress(text) == text->clipcur0 || text->fClip == 0) {
int fClip = 0;
switch(text->fClip) {
case 0: fClip = CLIP_CHAR;break;
case CLIP_CHAR: fClip = CLIP_WORD;break;
case CLIP_WORD: fClip = CLIP_SENTENCE;break;
case CLIP_SENTENCE: fClip = CLIP_LINECUR;break;
case CLIP_LINE:
case CLIP_LINECUR: fClip = CLIP_PARACUR;break;
}
txSelectEx(text,fClip);
} else {
txSelectQuit(text);
}
return TRUE;
}
#endif
//##カットアンドペースト
#if !__TXC__
BOOL txIDM_POP(TX* text)
{
#if 1//WCE0.93 970920 テキストスタック実装
//WZ4.00Bl 990912 「テキストスタックのペースト後、カーソルを移動する」がONのとき、VZ.KEY以外の場合も反映するようにした。ユーザ要望。特に問題はない。
BOOL fJump = (text->fJumpTxPasteEnd); //WZ4.00A 981229 VZ準拠キー定義で「ペースト後カーソル移動」ONのとき、IDM_POPでカーソルを移動するようにした。
txSelectOverwriteModal(text); //WZ4.00Bl 990912 IDM_POPを選択置換するようにした。
if (
(!clipIsWz() && clipGetExistText()) ||
!tsGetExist()
) {
txClipPaste(text,HCLIP_WIN,fJump,0);
clipClear(HCLIP_WIN);
} else {
txClipPaste(text,HCLIP_TS,fJump,0);
{
TSHANDLE ts;
if (tsOpen(&ts)) {
tsClearTop(&ts);
tsClose(&ts);
}
}
clipClear(HCLIP_WIN);
}
return TRUE;
#else
txClipPaste(text,HCLIP_WIN,FALSE,0);
clipClear(HCLIP_WIN);//WCE0.91 970912 VZ.KEY ^J改良
return TRUE;
#endif
}
#endif // !__TXC__
BOOL txIDM_PASTE(TX* text)
{
if (txKeisenIsNeedOp(text,IDM_PASTE) && txKeisenOp(text,IDM_PASTE,NULL)) {
//WCE1.01 980210
} else {
txSelectOverwriteModal(text);
txPaste(text);
}
return TRUE;
}
BOOL txIDM_PASTESELECT(TX* text)
{
txSetUndisp(text);
txSelectOverwriteModal(text); //WZ4.00Bl 990912 IDM_PASTESELECTを選択置換するようにした。
{
IFILE adr0 = txGetAddress(text);
int ly0 = text->ly;
txClipPaste(text,HCLIP_WIN,TRUE,CLIP_CHAR);
txSelectEx(text,CLIP_MOUSE);
txJumpAddress(text,adr0);txSetLy(text,ly0);
}
txSetDisp(text);
return TRUE;
}
BOOL txIDM_PASTECHAR(TX* text)
{
txSelectOverwriteModal(text); //WZ4.00Bl 990912 IDM_PASTECHARを選択置換するようにした。
txClipPaste(text,HCLIP_WIN,TRUE,CLIP_CHAR);
return TRUE;
}
#if !__TXC__
BOOL txIDM_PASTEVZ(TX* text)
{
#if 1 //WZ4.00Ec 010131 VZ.KEYで、^J後、テキストスタックにデータがある時に^KCした場合、テキストスタックからペーストするようにした。
if (clipGetExistText()) {
if (text->fJumpTxPasteEnd) {
txPaste(text);
} else {
txClipPaste(text,HCLIP_WIN,FALSE,0);
}
return TRUE;
} else if (tsGetExist()) {
txClipPaste(text,HCLIP_TS,text->fJumpTxPasteEnd,0);
return TRUE;
}
return FALSE;
#else
if (text->fJumpTxPasteEnd) {
txPaste(text);
} else {
txClipPaste(text,HCLIP_WIN,FALSE,0);
}
return TRUE;
#endif
}
#endif
static BOOL txIdmCopycut(TX* text,int idm)
{
// 通常のカット/コピーを行うか返す。
// 行わない場合は必要に応じて段落のコピー等を行う。
//WZ3.90I 981103 new
if (text->fClip) {
return TRUE;
} else {
BOOL fClipboardNoSelect = text->fClipboardNoSelect;
switch(idm) {
case IDM_CUTVZ:
case IDM_COPYQUITVZ: fClipboardNoSelect = TRUE;break;
}
if (fClipboardNoSelect) {
switch(idm) {
case IDM_CUT:
case IDM_CUTVZ: {
txClipCopyEx(text,0,0,HCLIP_WIN,CLIP_COPYPARA1,0,0);
#if 1//WZ4.00Bl 990911 4Bα1.5で変更した「選択しないでIDM_CUTVZしたとき削除バッファに入れる」動作を元に戻して入れないようにしてVZの仕様に合わせた。ユーザ要望。
txDeletePara(text);
#else
#if !WINDOWSCE
text->fPushDeleteString++; //WZ4.00Bj 990825 選択しないでIDM_CUTVZしたとき削除した内容を削除バッファに入れるようにした(!PWZ)。
#endif
txDeletePara(text);
#if !WINDOWSCE
text->fPushDeleteString--;
#endif
#endif
break;
}
case IDM_CLEAR: {
txDeletePara(text);
break;
}
case IDM_COPY:
case IDM_COPYQUIT:
case IDM_COPYQUITVZ: {
txClipCopyEx(text,0,0,HCLIP_WIN,CLIP_COPYPARA1,0,0);
break;
}
}
}
return FALSE;
}
}
BOOL txIDM_CUT(TX* text)
{
if (txIdmCopycut(text,IDM_CUT)) {
if (txKeisenIsNeedOp(text,IDM_CUT) && txKeisenOp(text,IDM_CUT,NULL)) {
//WCE1.01 980210
} else {
txSelectCopyDelete(text);
}
}
return TRUE;
}
BOOL txIDM_CUTVZ(TX* text)
{
if (txIdmCopycut(text,IDM_CUTVZ)) {
if (txKeisenIsNeedOp(text,IDM_CUTVZ) && txKeisenOp(text,IDM_CUTVZ,NULL)) {
//WCE1.01 980210
} else {
txSelectCopyDelete(text);
}
}
return TRUE;
}
BOOL txIDM_CLEAR(TX* text)
{
if (txIdmCopycut(text,IDM_CLEAR)) {
if (txKeisenIsNeedOp(text,IDM_CLEAR) && txKeisenOp(text,IDM_CLEAR,NULL)) {
//WZ3.90O 981203
} else {
txSelectDelete(text);
}
}
return TRUE;
}
BOOL txIDM_COPY(TX* text)
{
if (txIdmCopycut(text,IDM_COPY)) {
txSelectCopy(text);
text->fClipMouse = TRUE; //WZ3.90I 981029 WZ3.0のtxClipboardCopyの仕様に合わせた
}
return TRUE;
}
BOOL txIDM_COPYQUIT(TX* text)
{
if (txIdmCopycut(text,IDM_COPYQUIT)) {
txSelectCopyQuit(text);
}
return TRUE;
}
BOOL txIDM_COPYQUITVZ(TX* text)
{
if (txIdmCopycut(text,IDM_COPYQUITVZ)) {
txSelectCopyQuit(text);
}
return TRUE;
}
//##プラグイン
#if __TXC__
void __pluginGetProperty(mchar* prop,txstr res)
{
//information("%s",prop);
if (!stricmp(prop,"name")) res = "編集IDM処理";
if (!stricmp(prop,"author")) res = sysGetName();
if (!stricmp(prop,"version")) res = sysGetVersionPrim();
}
static HOOKRESULT CALLBACK wndprocTextHook(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
if (message == WM_TXEVENT && wParam == TXEVENT_IDMEXEC) {
TX* text = hwndtextGetText(hwnd);
int idm = lParam;
switch(idm) {
case IDM_COPY: { // サンプル
statprintf("IDM_COPY by macro");
txIDM_COPY(text);
return HOOK_CAPTURE;
}
}
}
return HOOK_CONTINUE;
}
void __on_txFrameNew(TX* text)
{
txSetHookWndproctextTxpcode(text,wndprocTextHook);
}
#endif