home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2002 March
/
VPR0203B.ISO
/
APUPDATE
/
VC
/
TXC0601S
/
TXC0601S.LZH
/
_IDMCUR.C
< prev
next >
Wrap
Text File
|
2000-03-06
|
15KB
|
595 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"
//##文字単位の移動
BOOL _txkeySelectWin(TX* text,int idm)
{
if (sh->fMacroPlay) return FALSE;
if (text->modeEditor == ME_WIN) {
if (
(text->fKeyVkShift == 0 && GetKeyState(VK_SHIFT) < 0) ||
text->fKeyVkShift == 2
) {
if (text->fClip && text->fClipMouse) {
// 既に選択中
} else {
if (sh->fMacroRec) keymacroAddIdm(IDM_KM_SELECT);
if (text->modeKeyClip == MC_WZ) {
txSelectEx(text,CLIP_WZ);
} else if (text->modeKeyClip == MC_VZ) {
txSelectEx(text,CLIP_VZ);
} else {
txSelectEx(text,CLIP_CHAR);
}
text->fClipMouse = TRUE;
}
return TRUE;
}
}
if (text->fClip && text->fClipMouse) {
BOOL ret = 0;
if (sh->fMacroRec) keymacroAddIdm(IDM_SELECTQUIT);
{
IFILE adrTop = txGetAddressSelectTop(text);
IFILE adrEnd = txGetAddressSelectEnd(text);
BOOL fPrev = txSelectGetPrev(text);
int lyClip = text->lyClip;
txSetUndisp(text);
txSelectQuit(text);
if (!sh->fNoUpDownAtClipMouse) { //WZ3.90I 981103
if (idm == IDM_LEFT || idm == IDM_UP) {
ret = 2; // idm != 0で、範囲の先頭・末尾に移動した場合は2を返す。
txJumpAddress(text,adrTop);
if (!fPrev) txSetLy(text,lyClip);
} else if (idm == IDM_RIGHT || idm == IDM_DOWN) {
ret = 2; // idm != 0で、範囲の先頭・末尾に移動した場合は2を返す。
txJumpAddress(text,adrEnd);
if (fPrev) txSetLy(text,lyClip);
}
}
txSetDisp(text);
}
return ret;
}
return FALSE;
}
BOOL txkeySelectWin(TX* text)
{
return _txkeySelectWin(text,0);
}
static void txIdmRight(TX* text)
{
if (text->cur0 - text->cury == text->curysize) {
//WZ4.00Bl 990909 IDM_JUMPLINETAIL後にIDM_RIGHTしたときは、次の行の先頭へ移動するようにした。ユーザ要望。
txRightBytes(text,0);
} else {
txRight(text);
}
}
static BOOL _txIDM_RIGHT(TX* text,int idm)
{
text->fTxfDirect += text->fTxf; // これしないと選択表示が乱れることがある
if (text->fCursorNoLf && text->cur0 - text->cury + txGetCharSize(text,text->cur) >= text->curysize) {
//WZ3.90J 981109
} else if (text->fClip == CLIP_BOX) { //WZ4.00Bl 990907 箱形選択時は一時的にフリーカーソルにした。ユーザ要望。
txRightFree(text);
} else if (txGetFreeCursor(text) && !text->fClip && (idm != IDM_RIGHTBINEDIT)) {
// 選択中はフリーカーソルOFF
if (_txkeySelectWin(text,idm) != 2) txRightFree(text);
} else if (text->fBinedit && txIsCurDigitH(text)) {
txSetCurDigitL(text);
#if !WZFUNC_TABBEAM && WZFUNC_EDITOR //WZ3.90O 981203
} else if (txGetApfu(text) && txGetChar(text) == CHAR_TAB) {
//WCE1.01 980127
text->fUndispCursor++;
while(1) {
if (!txRight(text)) break;
if (txGetChar(text) != CHAR_TAB) break;
}
text->fUndispCursor--;
txDispCursor(text);
txDispLocate(text);
#endif
} else {
#if WZFUNC_EDITOR
int iClm;
if (
txGetMultiClm(text) &&
!text->fNoClmMove && //WCE1.01 980312
((iClm = txClmFromLy(text,text->ly)) + 1 < text->nClm) &&
(
(text->cur0 - text->cury + txGetCharSize(text,text->cur) == text->curysize) ||
txIsCurFree(text)
)
) {
int lyClmTop = txClmGetLy(text,iClm);
int lcywindow = txClmGetLy(text,iClm + 1) - lyClmTop;
if (IsAtPrint(text)) {
}
if (txGetDownAble(text,lcywindow)) {
text->fUndispCursor++;
if (iClm + 1 < text->nClm) {
txDownN(text,lcywindow);
} else {
txNextRollN(text,lcywindow);
}
txJumpLineTop(text);
text->fUndispCursor--;
txDispCursor(text);
txDispLocate(text);
} else {
if (_txkeySelectWin(text,idm) != 2) txIdmRight(text); //WZ4.00A 981229 2段組編集で右段に行がないとき左段で→を使って次の行に移動できるようにした。
}
} else {
if (_txkeySelectWin(text,idm) != 2) txIdmRight(text);
}
#else
if (_txkeySelectWin(text,idm) != 2) txIdmRight(text);
#endif
}
text->fTxfDirect -= text->fTxf;
txfRightChartopTxf(text);
return TRUE;
}
BOOL txIDM_RIGHTBINEDIT(TX* text)
{
return _txIDM_RIGHT(text,IDM_RIGHTBINEDIT);
}
BOOL txIDM_RIGHT(TX* text)
{
return _txIDM_RIGHT(text,IDM_RIGHT);
}
BOOL txIDM_LEFT(TX* text)
{
text->fTxfDirect += text->fTxf; // これしないと選択表示が乱れることがある
if (text->fCursorNoLf && text->cury == text->cur0) {
//WZ3.90J 981109
} else if (text->fClip == CLIP_BOX) { //WZ4.00Bl 990907 箱形選択時は一時的にフリーカーソルにした。ユーザ要望。
txLeftFree(text);
} else if (txGetFreeCursor(text)) {
if (_txkeySelectWin(text,IDM_LEFT) != 2) txLeftFree(text);
} else if (text->fBinedit && txIsCurDigitL(text)) {
txSetCurDigitH(text);
#if !WZFUNC_TABBEAM && WZFUNC_EDITOR //WZ3.90O 981203
} else if (txGetApfu(text) && txGetPrevChar(text) == CHAR_TAB) {
//WCE1.01 980127
text->fUndispCursor++;
while(1) {
if (!txLeft(text)) break;
if (txGetPrevChar(text) != CHAR_TAB) break;
}
text->fUndispCursor--;
txDispCursor(text);
txDispLocate(text);
#endif
} else {
#if WZFUNC_EDITOR
int iClm;
if (
txGetMultiClm(text) &&
!text->fNoClmMove && //WCE1.01 980312
((iClm = txClmFromLy(text,text->ly)) > 0) &&
text->cury == text->cur0
) {
int lcywindow = text->lcywindow / text->nClm;
if (txGetUpAble(text,lcywindow)) {
text->fUndispCursor++;
if (iClm == 0) {
txPrevRollN(text,lcywindow);
} else {
txUpN(text,lcywindow);
}
txJumpLineEnd(text);
text->fUndispCursor--;
txDispCursor(text);
txDispLocate(text);
}
} else {
if (_txkeySelectWin(text,IDM_LEFT) != 2) txLeft(text);
}
#else
if (_txkeySelectWin(text,IDM_LEFT) != 2) txLeft(text);
#endif
}
text->fTxfDirect -= text->fTxf;
txfLeftChartopTxf(text);
return TRUE;
}
//##単語単位の移動
BOOL txIDM_LEFTWORD(TX* text)
{
txkeySelectWin(text);
txLeftWord(text);
txfLeftChartopTxf(text);
return TRUE;
}
BOOL txIDM_LEFTWORDMI(TX* text)
{
txkeySelectWin(text);
txLeftWordMi(text);
txfLeftChartopTxf(text);
return TRUE;
}
BOOL txIDM_RIGHTWORD(TX* text)
{
txkeySelectWin(text);
txRightWord(text);
txfRightChartopTxf(text);
return TRUE;
}
BOOL txIDM_RIGHTWORDMI(TX* text)
{
txkeySelectWin(text);
txRightWordMi(text);
txfRightChartopTxf(text);
return TRUE;
}
BOOL txIDM_JUMPWORDTOPMI(TX* text)
{
txkeySelectWin(text);
txJumpWordTopMi(text);
txfLeftChartopTxf(text);
return TRUE;
}
BOOL txIDM_JUMPWORDENDMI(TX* text)
{
txkeySelectWin(text);
txJumpWordEndMi(text);
txfRightChartopTxf(text);
return TRUE;
}
//##行内の移動
BOOL txIDM_JUMPLINETOP(TX* text)
{
txkeySelectWin(text);
txJumpLineTop(text);
return TRUE;
}
BOOL txIDM_JUMPLINETAIL(TX* text)
{
txkeySelectWin(text);
txJumpLineTail(text);
return TRUE;
}
BOOL txIDM_JUMPPARATOP(TX* text)
{
txJumpParaTop(text);
return TRUE;
}
BOOL txIDM_JUMPPARAEND(TX* text)
{
txJumpParaEnd(text);
return TRUE;
}
//##行単位の移動
BOOL txIDM_DOWNHIGH(TX* text)
{
txNextRollN(text,4);
return TRUE;
}
BOOL txIDM_UPHIGH(TX* text)
{
txPrevRollN(text,4);
return TRUE;
}
BOOL txIDM_NEXTROLL(TX* text)
{
int nRepeat = text->nRepeatKey;
if (text->idmPrev == IDM_NEXTROLL && text->wtmIdmPrevD < 100) {
nRepeat = text->nKeyScrollAcc;
if (nRepeat > text->lcywindow) nRepeat = text->lcywindow;
if (nRepeat <= 0) nRepeat = 1;
}
txNextRollN(text,nRepeat);
return TRUE;
}
BOOL txIDM_PREVROLL(TX* text)
{
int nRepeat = text->nRepeatKey;
if (text->idmPrev == IDM_PREVROLL && text->wtmIdmPrevD < 100) {
nRepeat = text->nKeyScrollAcc;
if (nRepeat > text->lcywindow) nRepeat = text->lcywindow;
if (nRepeat <= 0) nRepeat = 1;
}
txPrevRollN(text,nRepeat);
return TRUE;
}
BOOL txIDM_DOWN(TX* text)
{
int nRepeat = text->nRepeatKey;
if (
(text->idmPrev == IDM_DOWN) &&
(text->ly + 1 >= text->lcywindow - txGetLcySmlower(text)) &&
!keymacroGetBusy() //WZ4.00Ac 990207
) {
text->nrepeat = text->nrepeat + nRepeat; // for __TXC__
if (text->nrepeat > text->nKeyScrollAccStart) {
text->nrepeat = text->nKeyScrollAccStart + 1;
nRepeat = text->nKeyScrollAcc;
// if (text->nSameIdm > 4) nRepeat *= 2;// 更に加速
if (nRepeat > text->lcywindow) nRepeat = text->lcywindow;
if (nRepeat <= 0) nRepeat = 1;
if (text->nSameIdm < 200) text->nSameIdm = text->nSameIdm + 1; // for __TXC__
} else if (text->wtmIdmPrevD > 100) {
text->nrepeat = 0;
text->nSameIdm = 0;
}
#if 0//WZ3.90I 981103 fReadModeでスクロールするのは使いにくいので廃止
} else if (text->fReadMode && text->idmPrev == IDM_DOWN && text->wtmIdmPrevD < 100) {
nRepeat = text->nKeyScrollAcc;
if (nRepeat > text->lcywindow) nRepeat = text->lcywindow;
if (nRepeat <= 0) nRepeat = 1;
if (text->nSameIdm < 200) text->nSameIdm++;
#endif
} else {
text->nrepeat = 0;
text->nSameIdm = 0;
}
if (_txkeySelectWin(text,IDM_DOWN) != 2) {
#if 1//WZ3.90I 981103 fReadModeでスクロールするのは使いにくいので廃止
txDownN(text,nRepeat);
#else
if (text->fReadMode && !txIsCurscreenDispEof(text)) { //PWZ2BETA0.3 980522 txIsCurscreenDispEof
txNextRollN(text,nRepeat);
} else {
txDownN(text,nRepeat);
}
#endif
}
txfRightChartopTxf(text);
return TRUE;
}
BOOL txIDM_UP(TX* text)
{
int nRepeat = text->nRepeatKey;
if (
(text->idmPrev == IDM_UP) &&
text->ly <= text->lcySmupper &&
!keymacroGetBusy() //WZ4.00Ac 990207 キーボードマクロ記録再生中はUp/Downによるスクロール加速をしないようにした。スクロール加速がされると、カーソルを期待した行数Up/Downするキーボードマクロがつくれない。
) {
text->nrepeat = text->nrepeat + nRepeat; // for __TXC__
if (text->nrepeat > text->nKeyScrollAccStart) {
text->nrepeat = text->nKeyScrollAccStart + 1;
nRepeat = text->nKeyScrollAcc;
// if (text->nSameIdm > 4) nRepeat *= 2;// 更に加速
if (nRepeat > text->lcywindow) nRepeat = text->lcywindow;
if (nRepeat <= 0) nRepeat = 1;
if (text->nSameIdm < 200) text->nSameIdm = text->nSameIdm + 1; // for __TXC__
} else if (text->wtmIdmPrevD > 100) {
text->nrepeat = 0;
text->nSameIdm = 0;
}
#if 0//WZ3.90I 981103 fReadModeでスクロールするのは使いにくいので廃止
} else if (text->fReadMode && text->idmPrev == IDM_UP && text->wtmIdmPrevD < 100) {
nRepeat = text->nKeyScrollAcc;
if (nRepeat > text->lcywindow) nRepeat = text->lcywindow;
if (nRepeat <= 0) nRepeat = 1;
if (text->nSameIdm < 200) text->nSameIdm++;
#endif
} else {
text->nrepeat = 0;
text->nSameIdm = 0;
}
if (_txkeySelectWin(text,IDM_UP) != 2) {
#if 1//WZ3.90I 981103 fReadModeでスクロールするのは使いにくいので廃止
txUpN(text,nRepeat);
#else
if (text->fReadMode && !txIsCurscreenDispEof(text)) {//PWZ2BETA0.3 980522 txIsCurscreenDispEof
txPrevRollN(text,nRepeat);
} else {
txUpN(text,nRepeat);
}
#endif
}
txfRightChartopTxf(text);
return TRUE;
}
//##ページ単位の移動
static BOOL _txIDM_PAGEUP(TX* text,int idm)
{
BOOL fNoPagingMode = (text->fFilelist || (idm == IDM_PAGEUPPRIM)); //WZ4.00Ba 990303 VZ準拠キー定義でFILERでPageUp/Downが効かないことがあった。
if (!fNoPagingMode && sh->pagingmode == 'S') {
txSearchContinuePrev(text);
} else if (!fNoPagingMode && sh->pagingmode == 'C') {
txHeadlineSearchPrev(text);
} else {
txkeySelectWin(text);
if (text->fHalfPage) {
txPrevHalfPage(text);
} else {
txPrevPage(text);
}
}
return TRUE;
}
BOOL txIDM_PAGEUPPRIM(TX* text)
{
return _txIDM_PAGEUP(text,IDM_PAGEUPPRIM);
}
BOOL txIDM_PAGEUP(TX* text)
{
return _txIDM_PAGEUP(text,IDM_PAGEUP);
}
static BOOL _txIDM_PAGEDOWN(TX* text,int idm)
{
BOOL fNoPagingMode = (text->fFilelist || (idm == IDM_PAGEDOWNPRIM)); //WZ4.00Ba 990303 VZ準拠キー定義でFILERでPageUp/Downが効かないことがあった。
if (!fNoPagingMode && sh->pagingmode == 'S') {
txSearchContinue(text);
} else if (!fNoPagingMode && sh->pagingmode == 'C') {
txHeadlineSearchNext(text);
} else {
txkeySelectWin(text);
if (text->fHalfPage) {
txNextHalfPage(text);
} else {
txNextPage(text);
}
}
return TRUE;
}
BOOL txIDM_PAGEDOWNPRIM(TX* text)
{
return _txIDM_PAGEDOWN(text,IDM_PAGEDOWNPRIM);
}
BOOL txIDM_PAGEDOWN(TX* text)
{
return _txIDM_PAGEDOWN(text,IDM_PAGEDOWN);
}
BOOL txIDM_JUMPSCREENTOP(TX* text)
{
txkeySelectWin(text);
if (text->flpPreview) {
//WZ3.90H 980918 プレビューの場合は段の下まで移動。この方が使いやすい
int iClm = txClmFromLy(text,text->ly);
int ly = txClmGetLy(text,iClm);
txJumpLy(text,ly);
txJumpX(text,text->x0);//WZ4.00Ba 990228
} else {
txJumpLy(text,text->lcySmupper);
txJumpX(text,text->x0);//WZ4.00Ba 990228 IDM_JUMPSCREENTOPでカーソル桁位置を保存するようにした
#if !WINDOWSCE && !__TXC__
if (text->idmLast == IDM_JUMPSCREENTOP && text->fVzEs) {
txAsStart(text,TRUE);
}
#endif
}
return TRUE;
}
BOOL txIDM_JUMPSCREENEND(TX* text)
{
txkeySelectWin(text);
if (text->flpPreview) {
//WZ3.90H 980918 プレビューの場合は段の下まで移動。この方が使いやすい
int iClm = txClmFromLy(text,text->ly);
int lcy = txClmGetLy(text,iClm+1);
txJumpLy(text,lcy - 1);
txJumpX(text,text->x0);//WZ4.00Ba 990228
} else {
txJumpLy(text,text->lcywindow - txGetLcySmlower(text) - 1);
txJumpX(text,text->x0);//WZ4.00Ba 990228 IDM_JUMPSCREENENDでカーソル桁位置を保存するようにした
#if !WINDOWSCE && !__TXC__
if (text->idmLast == IDM_JUMPSCREENEND && text->fVzEs) {
txAsStart(text,FALSE);
}
#endif
}
return TRUE;
}
//##大域移動
BOOL txIDM_JUMPFILETOPLINE(TX* text)
{
if (txkeySelectWin(text)) {
txJumpFileTop(text);
} else {
txJumpFileTopLine(text);
}
return TRUE;
}
BOOL txIDM_JUMPFILEENDLINE(TX* text)
{
if (txkeySelectWin(text)) {
txJumpFileEnd(text);
} else {
txJumpFileEndLine(text);
}
return TRUE;
}
BOOL txIDM_JUMPFILETOP(TX* text)
{
txkeySelectWin(text);
txJumpFileTop(text);
return TRUE;
}
BOOL txIDM_JUMPFILEEND(TX* text)
{
txkeySelectWin(text);
txJumpFileEnd(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_LEFT: { // サンプル
statprintf("IDM_LEFT by macro");
txIDM_LEFT(text);
return HOOK_CAPTURE;
}
}
}
return HOOK_CONTINUE;
}
void __on_txFrameNew(TX* text)
{
txSetHookWndproctextTxpcode(text,wndprocTextHook);
}
#endif