home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2002 March
/
VPR0203B.ISO
/
APUPDATE
/
VC
/
TXC0601A
/
TXC0601A.LZH
/
_IDMJUMP.C
< prev
next >
Wrap
C/C++ Source or Header
|
2001-01-29
|
47KB
|
1,795 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"
#include "_list.h"
BOOL txuiSearchList(TX* text,SEARCH_PACKET* search);
//##基本
void txStatusbarFlushDispPagingmode(TX* text)
{
txDispAll(text); //WZ4.00Bl 990909 for 検索モード時のみ検索文字列色分けON
txStatusbarSetPaneString(
text,STATUSBAR_PANE_PAGINGMODE,
sh->pagingmode == 'P' ? "ページ" : (sh->pagingmode == 'S' ? "検索" : "見出")
);
txStatusbarSetPaneString(text,STATUSBAR_PANE_FILENAME,(sh->pagingmode=='S')?sh->search.szfind:NULL); //WZ4.00Bl 990904 VZ.KEYで検索モードの時にステータスバーに検索文字列を表示するようにした。ユーザ要望。
}
mchar* GetFind(void)
{
return sh->search.szfind;
}
//##検索置換ダイアログ
#if !WINDOWSCE && !__TXC__
static BOOL searchlist(TX* text)
{
return txuiSearchlist(text,&sh->search);
}
#endif
BOOL CALLBACK dlgprocSearch(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
SEARCHOPT* opt = dialogGetCustdata(hd);
TX* text = opt->text;
switch(message) {
case WM_INITDIALOG: {
PostMessage(hwnd,WM_TXUSER,0,0);
PostMessage(hwnd,WM_TXUSER+1,0,0); //WZ3.90H 980908
if (text->fWestern && text->hfontSearch) { //WZ3.90K 981112
SendMessage(GetDlgItem(hwnd,IDD_SEARCH),WM_SETFONT,text->hfontSearch,TRUE);
SendMessage(GetDlgItem(hwnd,IDD_REPLACE),WM_SETFONT,text->hfontSearch,TRUE);
}
return FALSE;
}
case WM_COMMAND: {
switch(GET_WM_COMMAND_ID(wParam,lParam)) {
case IDD_SEARCHMODE:
case IDD_SEARCHMODE+1:
case IDD_SEARCHMODE+2:
case IDD_SEARCHMODE+3:
case IDD_FUZZY:
case IDD_RE: PostMessage(hwnd,WM_TXUSER+1,0,0);break; //WZ3.90H 980908
case IDD_HISTORY: { //WZ3.90H 980910
searchoptFromSearchmode(opt,sh->search.searchmode);
dialogWrite(hd);
PostMessage(hwnd,WM_TXUSER+1,0,0);
break;
}
#if !WINDOWSCE && !__TXC__
case IDD_LIST: {
if (searchlist(text)) {
searchoptFromSearchmode(opt,sh->search.searchmode);
dialogWrite(hd);
PostMessage(hwnd,WM_TXUSER+1,0,0);
}
break;
}
#endif
case IDD_GET: opt->fSearchSet = TRUE;break; //WZ3.90H 980910
}
break;
}
case WM_TXUSER: {
if (sh->fSearchGetText || txIsClipInPara(text)) { //WZ3.90I 981103 選択されている場合は検索文字列を取り込む。
int type = GetCharType(text,text->buff + text->cur);
//WZ3.90O 981204 選択していてカーソルが改行上にあると取り込まれなかった
if (!txIsClipInPara(text) && (type == CT_EOF || type == CT_LF || type == CT_SPACE)) {
//WCE1.01 980402 これらの場合は検索文字列に取り込まない
} else {
mchar buff[CCHSEARCH];
txGetWordEx(text,buff,cchof(buff));
SetDlgItemText_A(hwnd,IDD_SEARCH,buff);
SetFocus(GetDlgItem(hwnd,IDD_SEARCH));
}
}
break;
}
case WM_TXUSER+1: { //WZ3.90H 980908
wndSetEnableSearchOption(hwnd);
break;
}
}
return FALSE;
}
static BOOL uiSearch(TX* text,BOOL mode)
{
BOOL fReplace = !!(mode & 0x02);
HDIALOG hd = dialog(fReplace ? "置換" : "検索");
SEARCHOPT opt;
//
structClear(opt);
opt.text = text;
opt.fSearchSet = (mode & 0x01);
opt.fArea = fReplace && (text->fClip && !txIsClipInPara(text));
opt.fReplace = fReplace;
#if 1//WZ4.00Bl 990908 for searchmodeInit
searchoptFromSearchmode(&opt,text->searchmode);
#else
searchoptFromSearchmode(&opt,sh->search.searchmode);
#endif
//
#if WINDOWSCE
hd->fPspcNoLimitSize = FALSE; //WZ4.00Eb 010103 マクロから_pspcスタイルのダイアログを使うにはこれを指定すること。
dialogSetDialoghelp(hd,4); // "「検索」「置換」ダイアログの使い方"
#endif
dialogSetCustdata(hd,&opt);
dialogSetDlgproc(hd,dlgprocSearch);
dialogControlID(hd,IDD_SEARCH);
dialogControlHist(hd,HIST_SEARCH);
dialogControlHelp(hd,237);
dialogString(hd,"検索(&S):",12-_pspc*4,sh->search.szfind,CCHSEARCH,33-_pspc*8);
if (fReplace) {
dialogControlID(hd,IDD_REPLACE);
dialogControlHist(hd,HIST_SEARCH);
dialogControlHelp(hd,238);
dialogString(hd,"置換(&R):",12-_pspc*4,sh->search.szreplace,CCHSEARCH,33-_pspc*8);
}
//
dialogSetH(hd);
dialogIndent(hd,13);
dialogControlID(hd,IDD_HISTORY);
dialogControlHelp(hd,228);
#if WINDOWSCE //WZ4.00Bb 990309 CEではアクセスキーAlt+Hは使えない。ヘルプと重なっている。
dialogPushbutton(hd,fReplace ? "前回の置換(&I)" : "前回の検索(&I)",16);
#else
dialogPushbutton(hd,fReplace ? "前回の置換(&H)" : "前回の検索(&H)",16);
#endif
#if !WINDOWSCE && !__TXC__
dialogControlID(hd,IDD_LIST);
dialogControlHelp(hd,229);
dialogPushbutton(hd,"スタイル(&Q)...",16); //WZ3.90L 981115 "検索リスト"はWZ3の同一名称別機能とまぎらわしいので名前を変更。
#endif
dialogLFSetV(hd);
//
dialogSetPosLF(hd);
if (!_pspc) dialogIndent(hd,3);
dialogAddSearchopt(hd,&opt,fReplace);
//
if (_pspc) {
dialogLF(hd);
dialogSetPosX(hd,DTCX);
} else {
dialogLFV(hd);
#if SEARCHOPT_DIALOG_NEW //WZ3.90J 981112
#if WINDOWSCE
dialogIndent(hd,6);
#else
dialogIndent(hd,5);
#endif
#endif
dialogSetPosY(hd,DTCY/2);
#if !WINDOWSCE
dialogOK(hd,10);
dialogCancel(hd,10);
#endif
}
if (!fReplace && !opt.fSearchSet) {
dialogSpaceV(hd);
dialogControlID(hd,IDD_GET);
dialogControlHelp(hd,232);
dialogCmd(hd,"取得(&G)",10);
#if !WINDOWSCE
dialogControlID(hd,IDD_UISEARCHSELECT);
dialogControlHelp(hd,233);
dialogCmd(hd,"閲覧(&N)",10);
#endif
}
//
{
int ret;
if (ret = dialogOpen(hd)) { //WZ3.90H 980906
text->searchmode = sh->search.searchmode = searchoptToSearchmode(&opt); //WZ4.00Bo 991011 text->searchmodeにもセット。検索してもう一度検索ダイアログを開いたときに前回の検索オプションをONにするようにした。ユーザ要望。
//information("%d",strlen(sh->search.szfind));
#if WINDOWSCE
searchoptSearchExec(&opt);
#else
if (ret == IDD_UISEARCHSELECT) {
txuiSearchList(text,&sh->search);
} else {
#if !__TXC__ && WZFUNC_EDITOR
if (opt.fOpenTempWindow) txMultiWindow(text,TRUE);
#endif
searchoptSearchExec(&opt);
}
#endif
return TRUE;
}
}
return FALSE;
}
BOOL txIDM_UISEARCH(TX* text)
{
return uiSearch(text,FALSE);
}
BOOL txuiSearchGet(TX* text,SEARCH_PACKET* search)
{
if (uiSearch(text,0x01)) {
*search = sh->search;
return TRUE;
}
return FALSE;
}
BOOL txIDM_UISEARCHSET(TX* text)
{
if (uiSearch(text,0x01)) {
if (text->modeEditor == ME_VZ) { //WZ4.00Bj 990830 VZキー以外でIDM_UISEARCHSETすると検索モードになってPageUp/Downができなくなったのを改良。
sh->pagingmode = sh->search.szfind[0] ? 'S' : 'P';
}
txStatusbarFlushDispPagingmode(text);
return TRUE;
} else {
sh->pagingmode = 'P';
txStatusbarFlushDispPagingmode(text);
return FALSE;
}
}
BOOL txIDM_UIREPLACE(TX* text)
{
return uiSearch(text,0x02);
}
BOOL txIDM_UIREPLACEQUERY(TX* text)
{
sh->search.searchmode |= REPLACE_CONFIRM;
text->searchmode |= REPLACE_CONFIRM; //WZ4.00Ec 010123
return txIDM_UIREPLACE(text);
}
BOOL txIDM_UIREPLACENOQUERY(TX* text)
{
sh->search.searchmode &= ~REPLACE_CONFIRM;
text->searchmode &= ~REPLACE_CONFIRM; //WZ4.00Ec 010123 IDM_UIREPLACENOQUERYを動作するようにした。
return txIDM_UIREPLACE(text);
}
//##検索
BOOL txIDM_UISEARCHPREV(TX* text)
{
text->searchmode |= SEARCH_PREV;
return txIDM_UISEARCH(text);
}
BOOL txIDM_UISEARCHNEXT(TX* text)
{
text->searchmode &= ~SEARCH_PREV;
return txIDM_UISEARCH(text);
}
BOOL txIDM_SEARCHGET(TX* text)
{
if (text->idmPrev == IDM_SEARCHGET) {
} else {
sh->search.szfind[0] = 0;
}
if (txIsClipInPara(text)) { //WZ3.90M 981128 IDM_SEARCHGETで選択時は選択文字を追加。
mchar buff[CCHSEARCH];
txGetWordEx(text,buff,CCHSEARCH);
txSelectQuit(text);
sstrcat(sh->search.szfind,buff);
} else {
int len = strlen(sh->search.szfind);
IBUFF cur = text->cur + len;
int type0 = 0;
BOOL fFirst = TRUE;
for (;;) {
int type = GetCharType(text,text->buff + cur);
if (type == CT_EOF || type == CT_LF) break;//WCE1.01 980322 空テキストでIDM_SEARCHGETすると無限ループに入った //WZ4.00Bl 990904 IDM_SEARCHGETで改行で止まるようにした。ユーザ要望。
if (!fFirst && type != type0) break;
cur += txGetCharSize(text,cur);
type0 = type;
if (fFirst && (type == CT_SYMBOL || type == CT_SPACE)) {
//WZ4.00Bl 990904 IDM_SEARCHGETで記号や空白で区切らないようにした。ユーザ要望
} else {
fFirst = FALSE;
}
}
strcpylenmax(sh->search.szfind,text->buff + text->cur,cur - text->cur,sizeof(sh->search.szfind));
}
{
wchar buff[CCHSEARCH];
strtowstr(sh->search.szfind,-1,buff,CCHSEARCH);
wstatprintf(L"%s",buff); //WZ4.00A 981224 IDM_SEARCHGETで%を含む文字を取得したときに取得文字の表示がおかしかった。
}
#if 1//WZ3.90L 981125 VZ以外でIDM_SEARCHGETするとPAGEUP/DOWNで検索になってしまった。
if (text->modeEditor == ME_VZ) {
sh->pagingmode = 'S';
txStatusbarFlushDispPagingmode(text); //WZ4.00Bl 990904 IDM_SEARCHGETしたときステータスバーの表示を「検索」モードにした。
}
#else
sh->pagingmode = 'S';
#endif
return TRUE;
}
BOOL txIDM_TOSEARCHBOX(TX* text)
{
//WZ4.00Ca 000103 (PWZ)IDM_TOSEARCHBOXでコマンドバーの検索ボックスにフォーカスを移動するようにした。
if (text->hwndCBCB && (WINDOWSCE||txGetDispToolbar(text))) { //WZ4.00A 981224 ツールバーが非表示の時にCtrl+Fで検索ダイアログが開かない場合があった。
if (text->fClip && !text->fClipSearch && txIsClipInPara(text)) {
//WCE0.91 970914 選択してCtrl+Fしたときはその文字列を検索ボックスに取り込む
// VZ,MIでも選択したときは取り込む
mchar szbuff[CCHSEARCH];
txGetWordEx(text,szbuff,CCHSEARCH);
SetWindowText_A(text->hwndCBCB,szbuff);
}
SetFocus(text->hwndCBCB);
} else {
txIDM_UISEARCH(text);
}
return TRUE;
}
void txSearchAlltextInit(TX* text,SEARCHMODE searchmode)
{
//WZ4.00Bl 990916 new
if (searchmode & SEARCH_ALLTEXT) {
wzlock(LOCK_WZPROCESS);
{
int n = sh->nOpen;
WZPROCESS* p = sh->tWzprocess;
for (;n--;p++) {
p->fSearched = (text->hwndbase == p->hwnd);
}
}
wzunlock(LOCK_WZPROCESS);
}
}
BOOL txIDM_UIREPLACECONTINUE(TX* text)
{
txSearchAlltextInit(text,sh->search.searchmode);
PostMessage(text->hwndtext,WM_TXIDLEEXEC,IDLE_EXECFIND,TRUE);
return TRUE;
}
BOOL txIDM_SWITCHPAGE(TX* text)
{
if (sh->pagingmode == 'P') {
if (text->fSearchTitle) {
sh->pagingmode = 'C';
} else {
if (*GetFind()) {
sh->pagingmode = 'S';
} else {
sh->pagingmode = 'P';
}
}
} else if (sh->pagingmode == 'C') {
if (*GetFind()) {
sh->pagingmode = 'S';
} else {
sh->pagingmode = 'P';
}
} else {
sh->pagingmode = 'P';
}
#if 0//WZ4.00Bl 990904
switch(sh->pagingmode) {
case 'C': wstatprintf(L"見出し");break;
case 'S': wstatprintf(L"検索");break;
case 'P': wstatprintf(L"ページ");break;
}
#endif
txStatusbarFlushDispPagingmode(text);
return TRUE;
}
BOOL txIDM_CLEARSEARCHMODE(TX* text)
{
sh->pagingmode = 'P';
txStatusbarFlushDispPagingmode(text);
return TRUE;
}
static BOOL _txIDM_SEARCHCONTINUE(TX* text,int idm)
{
if (
text->fClipMouse && !text->fClipSearch && txIsClipInPara(text) &&
txGetAddressSelectTop(text) != txGetAddressSelectEnd(text) //WZ4.00Bp 991014 選択範囲が空のときは、選択した単語を検索する動作は無効にした。
) { //WZ4.00Bl 990908 選択してIDM_SEARCHCONTINUE/PREVすると選択した単語を検索するようにした。ユーザ要望。
//beep();
txGetWordEx(text,sh->search.szfind,cchof(sh->search.szfind));
}
((idm == IDM_SEARCHCONTINUEPREV)?txSearchContinuePrev:txSearchContinue)(text);
return TRUE;
}
BOOL txIDM_SEARCHCONTINUEPREV(TX* text)
{
return _txIDM_SEARCHCONTINUE(text,IDM_SEARCHCONTINUEPREV);
}
BOOL txIDM_SEARCHCONTINUE(TX* text)
{
return _txIDM_SEARCHCONTINUE(text,IDM_SEARCHCONTINUE);
}
void SetFind(mchar* szfind)
{
sstrcpy(sh->search.szfind,szfind);
histAdd(HIST_SEARCH,sh->search.szfind);
}
void txInitSearchContinueCB(TX* text)
{
mchar szfind[CCHSEARCH];
if (
text->fClip && !text->fClipSearch && txIsClipInPara(text) &&
txGetAddressSelectTop(text) != txGetAddressSelectEnd(text) //WZ4.00Bp 991014 選択範囲が空のときは、選択した単語を検索する動作は無効にした。
) {
// 選択されていたら取り込む
// VZ,MIでも選択したときは取り込む
txGetWordEx(text,szfind,cchof(szfind));
SetWindowText_A(text->hwndCBCB,szfind);
} else {
GetWindowText_A(text->hwndCBCB,szfind,cchof(szfind));
}
if (szfind[0]) {
//WCE0.91 970906 検索ボックスを使った検索は必ず曖昧検索をするようにした
#if 1//WCE0.99A 970924 検索ボックスで検索すると、置換確認がクリアされた
SEARCHMODE sm0 = (sh->search.searchmode & REPLACE_CONFIRM);
sh->search.searchmode = SEARCH_NOSENSECASE|SEARCH_NOSENSEZENHAN|sm0;
#else
sh->search.searchmode = SEARCH_NOSENSECASE|SEARCH_NOSENSEZENHAN;
#endif
SetFind(szfind);
}
}
BOOL txIDM_SEARCHCONTINUECBPREV(TX* text)
{
txInitSearchContinueCB(text);
txSearchContinuePrev(text);
SetFocus(text->hwndtext);//WCE0.95 970923 検索BOXの↑/↓で検索したときフォーカスをテキストに戻す
return TRUE;
}
BOOL txIDM_SEARCHCONTINUECB(TX* text)
{
txInitSearchContinueCB(text);
txSearchContinue(text);
SetFocus(text->hwndtext);//WCE0.95 970923 検索BOXの↑/↓で検索したときフォーカスをテキストに戻す
return TRUE;
}
//##インクリメンタル検索
//WZ4.00Ca 991212 インクリメンタル検索コマンド IDM_ISEARCH,IDM_ISEARCHPREV,IDM_ISEARCHREを追加。
void txIsearchNext(TX* text,SEARCHMODE searchmode)
{
SEARCHMODE mode = SEARCH_FORWARD|SEARCH_NOSENSECASE|searchmode;
if (text->isearch->szIsearch[0]) {
BOOL ret = FALSE;
IFILE adr = txGetAddress(text);
IFILE adrCurscreen = txGetAddressCurscreen(text);
int ly = text->ly;
txSetUndisp(text);
if (text->isearch->fIsearchLastFail) {
text->isearch->fIsearchLastFail = FALSE;
if (mode & SEARCH_PREV) {
txJumpFileEnd(text);
} else {
txJumpFileTop(text);
}
text->isearch->fIsearchWrapped = TRUE;
}
sstrcpy(sh->search.szfind,text->isearch->szIsearch);sh->search.searchmode = mode & ~SEARCH_CUR;
ret = txSearchEx(text,text->isearch->szIsearch,mode);
if (!ret) {
text->isearch->fIsearchLastFail = TRUE;
}
if (ret) {
text->isearch->adrIsearch = txGetAddress(text);
if ((mode & SEARCH_PREV) && !(mode & SEARCH_CUR)) {
// 連続実行時でBackward時は実行しない
} else {
txRightBytes(text,ret-1);
}
txSetLy(text,ly);
} else {
txJumpAddress(text,adr);
txSetLyCurscreen(text,adrCurscreen);
}
txSetDisp(text);
txIsearchStatprintf(text,ret,mode);
strcpy(text->isearch->szIsearch0,text->isearch->szIsearch);
} else {
txIsearchStatprintf(text,TRUE,searchmode);
}
}
static void isearch(TX* text,SEARCHMODE searchmode)
{
if (text->fBinedit) return; //WZ4.00Ec 010129 バイナリ編集モードではインクリメンタルサーチを使えない様にした。落ちる場合があった。
if (!text->isearch) text->isearch = zmalloc(sizeof(TX_ISEARCH));
if (!text->isearch) return;
if (txIsearchIsContinueIdm(text,text->idmLast)) {
// 連続実行
if (!text->isearch->fIsearching) {
text->isearch->fIsearching = TRUE;
}
if (!text->isearch->szIsearch[0]) strcpy(text->isearch->szIsearch,text->isearch->szIsearch0);
txIsearchNext(text,searchmode|text->isearch->Isearchmode);
} else {
// if (!text->isearch->fIsearching) {
text->isearch->fIsearching = TRUE;
text->isearch->szIsearch[0] = 0;
text->isearch->fIsearchWrapped = FALSE;
text->isearch->adrIsearch0 = text->isearch->adrIsearch = txGetAddress(text);
text->isearch->fIsearchLastFail = FALSE;
text->isearch->Isearchmode = searchmode & (SEARCH_REWZ|SEARCH_PREV); //WZ4.00Ec 010129 IDM_ISEARCHPREVの一回目が下方向になるのを修正。
// }
txIsearchNext(text,searchmode|SEARCH_CUR);
}
}
BOOL txIDM_ISEARCHPREV(TX* text)
{
// インクリメンタルサーチ(上方向)
isearch(text,SEARCH_PREV);
return TRUE;
}
BOOL txIDM_ISEARCH(TX* text)
{
// インクリメンタルサーチ(下方向)
isearch(text,0);
return TRUE;
}
BOOL txIDM_ISEARCHRE(TX* text)
{
isearch(text,SEARCH_REWZ);
return TRUE;
}
//##GREP
#if __TXC__
mchar* sbReadLast(HSTRBLK sb)
{
//WZ4.00Ab 990202 new
int n = sbGetCount(sb);
if (n) {
return sbRead(sb,n-1);
}
return NULL;
}
#endif // __TXC__
BOOL txIDM_GREP(TX* text)
{
mchar szWord[CCHSEARCH] = {0};
if (txIsClipInPara(text)) {
txGetWordEx(text,szWord,CCHSEARCH);
if (strchr(szWord,'"')) szWord[0] = 0; // 検索文字列に " は含めない
} else { //WZ4.00Ab 990202 IDM_GREP:で最後に検索した文字列を検索文字列にセットするようにした。
mchar* p = sbReadLast(sbFromHist(HIST_SEARCH));
if (p) sstrcpy(szWord,p);
}
if (szWord[0]) {
mchar szArg[CCHSEARCH + 20];
#if UNIX
sprintf_A(szArg,"=s\"%s\"",szWord);
#else
sprintf_A(szArg,"-s\"%s\"",szWord);
#endif
{
wchar* wsz = wstrdupA(szArg);
apGrep(wsz,AP_SINGLE);
free(wsz);
}
} else {
apGrep(NULL,AP_SINGLE);
}
return TRUE;
}
//##しおり
#define IDD_UMLIST 100
#define IDD_REGISTER 102
#define IDD_KILL 103
#define IDD_ADD 104
static void markFlushPrim(HWND hctrl,TX* text,int index)
{
mchar szline[CCHLINE];
txGetParaEx(text,szline,cchof(szline));
{ // tab->space
mchar* p = szline;
while(1) {
p = strchr(szline,'\t');
if (!p) break;
if (p) *p = ' ';
}
}
#if 1 //WCE0.95 970923 マーク、最近参照した位置のテキストの表示が変だった
//WCE0.95 970923 実機では、%hs,%hc,%lc,%ls使えない様だ。
{
mchar szbuff[CCHLINE + 20];
sprintf(szbuff,"%d):%d %s",index,text->npara,szline);
#if 1//WCE1.01 980115 UNICODE
ListBox_AddString_A(hctrl,szbuff);
#else
{
wchar wsz[CCHLINE + 20];
strtowstr(szbuff,-1,wsz,wcchof(wsz));
ListBox_AddString(hctrl,wsz);
}
#endif
}
#else
{
wchar wszbuff[CCHLINE + 20];
wsprintf(wszbuff,L"%d):%d %hs",index,text->npara,szline);
ListBox_AddString(hctrl,wszbuff);
}
#endif
}
static void markFlush(TX* text,HWND hwnd,BOOL fUiRefer)
{
HWND hctrl = GetDlgItem(hwnd,IDD_UMLIST);
int i;
ListBox_ResetContent(hctrl);
txSetUndispExSilent(text);
if (fUiRefer) {
int n = MAXREFERPOS;
int i;
for (i = text->iAdrRefer;n--;) {
i--;
if (i < 0) i = MAXREFERPOS - 1;
txJumpAddress(text,text->tAdrRefer[i]);
markFlushPrim(hctrl,text,i);
}
} else {
for (i = 1;i < MAXMARK;i++) {
txJumpAddress(text,text->mark[i]);
markFlushPrim(hctrl,text,i);
}
}
txSetDispExSilent(text);
}
BOOL CALLBACK dlgprocMark(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
TX* text = (TX*)dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
HWND hctrl = GetDlgItem(hwnd,IDD_UMLIST);
markFlush(text,hwnd,FALSE);
if (text->iLastJumpMark) {
ListBox_SetCurSel(hctrl,text->iLastJumpMark - 1);
} else {
ListBox_SetCurSel(hctrl,0);
}
break;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
int notify = GET_WM_COMMAND_CMD(wParam,lParam);
switch(id) {
case IDD_JUMP: {
HWND hctrl = GetDlgItem(hwnd,IDD_UMLIST);
int i = ListBox_GetCurSel(hctrl);
if (i != LB_ERR) {
txJumpMarkN(text,i + 1);
text->iLastJumpMark = i + 1;
}
break;
}
case IDD_REGISTER: {
HWND hctrl = GetDlgItem(hwnd,IDD_UMLIST);
int i = ListBox_GetCurSel(hctrl);
if (i != LB_ERR) {
txMarkN(text,i + 1);
text->iLastJumpMark = i + 1;
markFlush(text,hwnd,FALSE);
ListBox_SetCurSel(hctrl,i);
}
break;
}
}
break;
}
}
return FALSE;
}
#if !__TXC__
BOOL TXAPI txuiMark(TX* text)
{
// しおり
HDIALOG hd = dialog("しおり");
IFILE adr = txGetAddress(text);
int cx = 12;
DTRECT r;
txMarkCur(text);
text->fNoMarkCur++;
//
// dialogSetContexthelp(hd,TRUE);
dialogSetNotifyAsOK(hd,IDD_UMLIST,LBN_DBLCLK);
dialogSetDlgproc(hd,dlgprocMark);
dialogSetCustdata(hd,text);
dialogGetPos(hd,&r);
r.cx = DTCX * 50 - _pspc*DTCX*20;
r.cy = DTCY * 6;
__dialogAddItem(hd,"LISTBOX",NULL,IDD_UMLIST,&r,LBS_NOTIFY|LBS_USETABSTOPS|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_CHILD|WS_VISIBLE|WS_TABSTOP);
dialogSetPosY(hd,r.y + r.cy);
if (_pspc) {
dialogSetH(hd);
} else {
dialogLFV(hd);
}
dialogControlID(hd,IDD_JUMP);
dialogControlHelp(hd,218);
dialogCmdDefault(hd,"ジャンプ(&J)",cx);
//
dialogControlID(hd,IDD_REGISTER);
dialogControlHelp(hd,219);
dialogCmd(hd,"はさむ(&R)",cx);
//
if (!_pspc) {
dialogSpaceV(hd);
dialogCancel(hd,cx);
}
#if !WINDOWSCE
dialogSetNoButton(hd);
#endif
if (!dialogOpen(hd)) {
txJumpAddress(text,adr);
}
text->fNoMarkCur--;
return TRUE;
}
#endif // !__TXC__
void txAddRefer(TX* text,IFILE adr)
{
if (text->iAdrRefer >= MAXREFERPOS) text->iAdrRefer = 0;
text->tAdrRefer[text->iAdrRefer++] = adr;
if (text->iAdrRefer >= MAXREFERPOS) text->iAdrRefer = 0;
}
BOOL CALLBACK dlgprocUiRefer(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
TX* text = (TX*)dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
HWND hctrl = GetDlgItem(hwnd,IDD_UMLIST);
markFlush(text,hwnd,TRUE);
break;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
int notify = GET_WM_COMMAND_CMD(wParam,lParam);
switch(id) {
case IDD_UMLIST: {
if (notify == LBN_SELCHANGE) {
HWND hctrl = GetDlgItem(hwnd,IDD_UMLIST);
int i = ListBox_GetCurSel(hctrl);
if (i != LB_ERR) {
int index = text->iAdrRefer - (i + 1);
if (index < 0) index += MAXREFERPOS;
txJumpAddress(text,text->tAdrRefer[index]);
}
}
break;
}
case IDD_ADD: {//WCE0.92 970918
txAddRefer(text,txGetAddress(text));
markFlush(text,hwnd,TRUE);
break;
}
}
break;
}
}
return FALSE;
}
#if !__TXC__
BOOL TXAPI txuiRefer(TX* text)
{
// 最近参照した位置
HDIALOG hd = dialog("最近参照した位置");
IFILE adr = txGetAddress(text);
DTRECT r;
//
// dialogSetContexthelp(hd,TRUE);
dialogSetDlgproc(hd,dlgprocUiRefer);
dialogSetCustdata(hd,text);
dialogGetPos(hd,&r);
r.cx = DTCX * 50;
r.cy = DTCY * 10;
__dialogAddItem(hd,"LISTBOX",NULL,IDD_UMLIST,&r,LBS_NOTIFY|LBS_USETABSTOPS|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_CHILD|WS_VISIBLE|WS_TABSTOP);
dialogSetPosY(hd,r.y + r.cy);
dialogSetNotifyAsOK(hd,IDD_UMLIST,LBN_DBLCLK);//WCE0.99A 970924
dialogControlID(hd,IDD_ADD);
dialogPushbuttonBig(hd,"追加(&A)",12);
if (!dialogOpen(hd)) {
txJumpAddress(text,adr);
}
return TRUE;
}
#endif // !__TXC__
//##ハイパーリンク 進む/戻る
static BOOL _txLinkhistJumpPrev(TX* text,BOOL fGetAble)
{
// 戻る
BOOL ret = FALSE;
if (text->linkhist) {
LINKHIST* linkhist = text->linkhist;
if (linkhist->index > linkhist->n) linkhist->index = linkhist->n;
if (linkhist->index) {
if (!fGetAble) {
linkhist->index--;
txJumpAddress(text,linkhist->tAdr[linkhist->index]);
}
ret = TRUE;
}
}
return ret;
}
BOOL txLinkhistJumpPrev(TX* text)
{
// 戻る
return _txLinkhistJumpPrev(text,FALSE);
}
BOOL txLinkhistJumpPrevGetAble(TX* text)
{
// 戻る
return _txLinkhistJumpPrev(text,TRUE);
}
static BOOL _txLinkhistJumpNext(TX* text,BOOL fGetAble)
{
// 進む
BOOL ret = FALSE;
if (text->linkhist) {
LINKHIST* linkhist = text->linkhist;
if (linkhist->index + 1 < linkhist->n) {
if (!fGetAble) {
txJumpAddress(text,linkhist->tAdr[++linkhist->index]);
}
ret = TRUE;
}
}
return ret;
}
BOOL txLinkhistJumpNext(TX* text)
{
// 進む
return _txLinkhistJumpNext(text,FALSE);
}
BOOL txLinkhistJumpNextGetAble(TX* text)
{
// 進む
return _txLinkhistJumpNext(text,TRUE);
}
//##各種ジャンプ
//WZ4.00Bj 990824 最後に編集した位置にジャンプできるようにした。
enum {
JUMP_LINE,JUMP_PAGE,JUMP_LASTEDIT,JUMP_EDITPARA,JUMP_HEADLINE,JUMP_LINKPREV,JUMP_URL,
JUMP_BITMAP,JUMP_TABLE,JUMP_BEAM,JUMP_FOOTNOTE,
JUMP_RUBY,JUMP_LINK,JUMP_PROOF,
JUMP_BOLD,JUMP_UNDERLINE,JUMP_ITALIC,
JUMP_FONT
};
static mchar* _tszTml[] = {
"行","ページ","最後編集","変更行","見出し","リンク元へ戻る","URL",
"図","表","桁揃え","脚注",
"ルビ","リンク","校正",
"太字","下線","斜体",
"フォント指定",NULL
};
static BOOL txfSearchTag(TX* text,mchar* szTag,SEARCHMODE searchmode)
{
IFILE adr0 = txGetAddress(text);
int ly0 = text->ly;
BOOL ret = FALSE;
mchar szFind[CCHWORD];
searchmode |= SEARCH_NOSENSECASE;
//
sprintf_A(szFind,"\x1F%s",szTag);
text->fTxf = FALSE;
txSetUndisp(text);
//
if (searchmode & SEARCH_PREV) {
txfLeftChartail(text);
}
while(1) {
int result = txSearchEx(text,szFind,searchmode);
if (!result) break;
{
TEXTCHAR* p = text->buff + text->cur;
if (!IschTagname(p[result - 1])) {
ret = TRUE;
break;
}
// if (!txRightBytes(text,txfTagGetLch(p))) break; // これすると次のタグがスキップされちゃう。
}
}
text->fTxf = TRUE;
txFlush(text);
if (ret) {
txfRightChartop(text);
} else {
txJumpAddress(text,adr0);
txSetLy(text,ly0);
statprintf("見つかりません");
}
txSetDisp(text);
return ret; //WZ3.90P 981206
}
#if 0
static BOOL txfSearchTag(TX* text,mchar* szTag,BOOL fPrev)
{
IFILE adr0 = txGetAddress(text);
BOOL ret = FALSE;
text->fTxf = FALSE;txSetUndisp(text);
while(1) {
if (!txSearchEx(text,"\x1F",0)) break;
statprintf("%d",txGetAddress(text));
{
TEXTCHAR* p = text->buff + text->cur;
TEXTCHAR* pName = txfTagGetName(p);
if (txfTagNameIs(pName,"IMG")) {
ret = TRUE;
break;
}
// if (!txRightBytes(text,txfTagGetLch(p))) break; // これすると次のタグがスキップされちゃう。
}
}
text->fTxf = TRUE;txFlush(text);
if (ret) {txfRightChartop(text);} else {txJumpAddress(text,adr0);}
txSetDisp(text);
}
#endif
BOOL txSearchTable(TX* text,SEARCHMODE searchmode)
{
// text->fTxfEnable時はTMLの表、それ以外は罫線表を検索する
IFILE adr0 = txGetAddress(text);
int ly0 = text->ly;
BOOL ret = FALSE;
BOOL fPrev = (searchmode & SEARCH_PREV);
txSetUndisp(text);
if (txfCellGetExist(text)) {
while(1) {
if (fPrev ? !txPrevPara(text) : !txNextPara(text)) break;
if (!txfCellGetExist(text)) break;
}
}
while(1) {
if (fPrev ? !txPrevPara(text) : !txNextPara(text)) break;
if (txfCellGetExist(text)) {
ret = TRUE;
if (fPrev) {
while(1) {
if (!txPrevPara(text)) break;
if (!txfCellGetExist(text)) {txNextPara(text);break;}
}
}
break;
}
}
if (!ret) {
txJumpAddress(text,adr0);
txSetLy(text,ly0);
statprintf("見つかりません");
}
txSetDisp(text);
return ret; //WZ3.90P 981206
}
BOOL txSearchURL(TX* text,SEARCHMODE searchmode)
{
IFILE adr0 = txGetAddress(text);
int ly0 = text->ly;
BOOL ret = FALSE;
BOOL fPrev = (searchmode & SEARCH_PREV);
txSetUndisp(text);
if ((fPrev) ? txPrevPara(text) : txNextPara(text)) {
if (txSearchEx(text,"\\w+://\\w+",searchmode|SEARCH_REWZ|SEARCH_NOSELECT)) {
ret = TRUE;
}
}
if (!ret) {
txJumpAddress(text,adr0);
txSetLy(text,ly0);
statprintf("見つかりません");
}
txSetDisp(text);
return ret;
}
BOOL txJumpPage(TX* text,NPAGE npage)
{
if (npage == 0) npage = 1;
if (text->flpPreview) {
if (npage < text->npage) {
txJumpAddress(text,text->tPageatr[npage].ifilePagetop);
return TRUE;
} else if (npage > text->npage) {
txSetUndisp(text);
while(text->npage < npage) {
if (!txNextPage(text)) break;
}
txSetDisp(text);
return (text->npage == npage);
} else {
return TRUE;
}
} else if (text->height && text->fLineD) {
txJumpLine(text,text->height*(npage-1));
return TRUE;
}
return FALSE;
}
static BOOL txJumpkind(TX* text,int jumpkind,int jumpline,SEARCHMODE searchmode)
{
BOOL ret = FALSE;
BOOL fPrev = (searchmode & SEARCH_PREV);
int idm = 0;
mchar* szTag = NULL;
switch(jumpkind) {
case JUMP_LINE: {
if (text->fLineD) {
ret = txJumpLine(text,jumpline);
} else {
ret = txJumpPara(text,jumpline);
}
break;
}
case JUMP_PAGE: ret = txJumpPage(text,jumpline);break;
case JUMP_LASTEDIT: {
txSetUndisp(text);
txMarkCur(text); //WZ4.00Bl 990914 最後に編集した位置へジャンプする前にカーソル位置をマークするようにした。ユーザ要望。
txJumpAddress(text,text->adrLastEdit);
txSetLyCenter(text);
txSetDisp(text);
ret = TRUE;
break;
}
case JUMP_EDITPARA: idm = fPrev ? IDM_JUMPPREVEDITPARA : IDM_JUMPNEXTEDITPARA;break;
case JUMP_HEADLINE: idm = fPrev ? IDM_JUMPPREVHEAD : IDM_JUMPNEXTHEAD;break;
case JUMP_LINKPREV: {
if (fPrev) {
ret = txLinkhistJumpPrev(text);
} else {
ret = txLinkhistJumpNext(text);
}
break;
}
case JUMP_BITMAP: szTag = "*IMG";break;
case JUMP_TABLE: ret = txSearchTable(text,searchmode);break;
case JUMP_URL: ret = txSearchURL(text,searchmode);break;
case JUMP_BEAM: {
if (text->fTxf) {
szTag = "*BEAM";
} else {
#if !__TXC__
ret = txSearchTabbeam(text,searchmode);
#endif // !__TXC__
}
break;
}
case JUMP_FOOTNOTE: szTag = "*FOOTNOTE";break;
case JUMP_RUBY: szTag = "RUBY";break;
case JUMP_LINK: szTag = "A";break;
case JUMP_PROOF: szTag = "PROOF";break;
case JUMP_BOLD: szTag = "B";break;
case JUMP_UNDERLINE: szTag = "U";break;
case JUMP_ITALIC: szTag = "I";break;
case JUMP_FONT: szTag = "FONT";break;
}
if (idm) {
txIdmExec(text,idm);
}
if (szTag && text->fTxf) {
ret = txfSearchTag(text,szTag,searchmode);
}
return ret;
}
enum {
IDD_JUMPCAPTION=100,IDD_JUMPLINE,IDD_JUMPLINEPREV
};
static int _jumpline;
static int _jumpkind;
static BBOOL _fjumpprev;
static void ListBox_AddStrings(HWND hwnd,mchar** tsz)
{
for (;*tsz;tsz++) {
ListBox_AddString_A(hwnd,*tsz);
}
}
static int szToJumpkind(mchar* sz)
{
mchar** tsz = _tszTml;
for (;*tsz;tsz++) {
if (!stricmp(*tsz,sz)) return tsz - _tszTml;
}
return 0;
}
static int hwndGetJumpkind(HWND hwnd)
{
HWND hctrl = GetDlgItem(hwnd,IDD_LIST);
int isel = ListBox_GetCurSel(hctrl);
if (isel >= 0) {
mchar buff[CCHWORD];
ListBox_GetItemText_A(hctrl,isel,buff,CCHWORD);
return szToJumpkind(buff);
}
return 0;
}
static void hwndSetJumpkind(HWND hwnd,int jumpkind)
{
HWND hctrl = GetDlgItem(hwnd,IDD_LIST);
int isel = ListBox_FindStringExact(hctrl,-1,_tszTml[jumpkind]);
if (isel < 0) isel = 0;
ListBox_SetCurSel(hctrl,isel);
}
BOOL CALLBACK dlgprocJump(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
TX* text = dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
HWND hctrl = GetDlgItem(hwnd,IDD_LIST);
static mchar* tszTxt[] = {"行","ページ","最後編集","変更行","URL","表","桁揃え","見出し",NULL};
ListBox_AddStrings(hctrl,(text->fTxf) ? _tszTml : tszTxt);
hwndSetJumpkind(hwnd,_jumpkind);
FORWARD_WM_COMMAND(hwnd,IDD_LIST,hctrl,CBN_SELCHANGE,PostMessage);
if (_jumpkind == JUMP_LINE || _jumpkind == JUMP_PAGE) {
PostMessage(hwnd,WM_TXUSER,0,0);
}
break;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
int cmd = GET_WM_COMMAND_CMD(wParam,lParam);
HWND hctrl = GET_WM_COMMAND_HWND(wParam,lParam);
switch(id) {
case IDD_LIST: {
if (cmd == LBN_SELCHANGE) {
int kind = hwndGetJumpkind(hwnd);
mchar* szCaption = NULL;
switch(kind) {
case JUMP_LINE: szCaption = _pspc?"行:":"行(&C):";break;
case JUMP_PAGE: szCaption = _pspc?"頁:":"ページ(&C):";break;
}
SetDlgItemText_A(hwnd,IDD_JUMPCAPTION,szCaption ? szCaption : "");
EnableDlgItem(hwnd,IDD_JUMPLINE,!!szCaption);
EnableDlgItem(hwnd,IDD_JUMPLINEPREV,!szCaption && (kind != JUMP_LASTEDIT));
//
if (_pspc) {
SetDlgItemText_A(hwnd,IDD_JUMPLINEPREV,(kind == JUMP_LINKPREV) ? "リンク先" : "上方向");
} else {
SetDlgItemText_A(hwnd,IDD_JUMPLINEPREV,(kind == JUMP_LINKPREV) ? "リンク先へ進む(&P)" : "上方向へジャンプ(&P)");
}
PostMessage(hwnd,WM_TXUSER+1,0,0);
}
break;
}
case IDD_JUMPLINEPREV: {
PostMessage(hwnd,WM_TXUSER+1,0,0);
break;
}
case IDOK: {
_jumpkind = hwndGetJumpkind(hwnd);
break;
}
}
break;
}
case WM_TXUSER: {
HWND hctrl = GetDlgItem(hwnd,IDD_JUMPLINE);
SetFocus(hctrl);
Edit_SetSel(hctrl,0,-1);
break;
}
case WM_TXUSER+1: {
int kind = hwndGetJumpkind(hwnd);
if (kind == JUMP_LINKPREV) {
BOOL fEnable = IsDlgButtonChecked(hwnd,IDD_JUMPLINEPREV) ? txLinkhistJumpNextGetAble(text) : txLinkhistJumpPrevGetAble(text);
EnableDlgItemEx(hwnd,IDOK,fEnable,IDD_LIST);
} else {
EnableDlgItem(hwnd,IDOK,TRUE);
}
break;
}
}
return FALSE;
}
static BOOL _txJumpNext(TX* text,BOOL fPrev)
{
int jumpkind = _jumpkind;
if (jumpkind == JUMP_LINE || jumpkind == JUMP_PAGE) jumpkind = JUMP_EDITPARA;
return txJumpkind(text,jumpkind,0,fPrev ? SEARCH_PREV : 0);
}
BOOL txIDM_JUMPPREV(TX* text)
{
return _txJumpNext(text,TRUE);
}
BOOL txIDM_JUMPNEXT(TX* text)
{
return _txJumpNext(text,FALSE);
}
BOOL txIDM_UIJUMP(TX* text)
{
if (text->fBinedit) {
#if !POCKETWZ
HDIALOG hd = dialog("ジャンプ");
mchar szAdr[CCHWORD];
sprintf_A(szAdr,"%08lX",txGetAddress(text));
dialogString(hd,"アドレス(&L):",12,szAdr,CCHWORD,12);
if (dialogOpen(hd)) {
mchar*p = szAdr;
IFILE adr = 0;
for (;*p;) {
mchar c = *p++;
if (!isXdigiti(c)) break;
adr *= 16;
adr += xdigitToIntI(c);
}
{
int ly0 = text->ly;
txSetUndisp(text);
txJumpAddress(text,adr);
if (text->fJumpCursorCenter) {
txSetLyCenter(text);
} else {
txSetLy(text,ly0);
}
txSetDisp(text);
}
}
#endif
} else {
#if 1//WZ3.90L 981117 ジャンプ機能を高度化
HDIALOG hd = dialog("ジャンプ");
//
dialogSetDlgproc(hd,dlgprocJump);
dialogSetCustdata(hd,text);
//
dialogControlID(hd,IDD_LIST);
dialogAddListbox(hd,"移動先(&D):",15-_pspc*5,5+_pocketpc*2);
//
dialogLFV(hd);
dialogAddPosY(hd,DTCY);
dialogSetPosLF(hd);
dialogSetH(hd);
hd->dtyAdd = DTCYKEY - DTCY;
dialogControlID(hd,IDD_JUMPCAPTION);
dialogCaptionDynamic(hd,NULL,10-_pspc*3);
dialogControlID(hd,IDD_JUMPLINE);
dialogControlUpdown(hd,1,10000);
dialogInteger(hd,NULL,0,&_jumpline,8);
dialogLF(hd);
dialogControlID(hd,IDD_JUMPLINEPREV);
dialogCheckB(hd,_pspc?"上方向":"上方向へジャンプ(&P)",&_fjumpprev);
//
if (dialogOpen(hd)) {
SEARCHMODE searchmode = _fjumpprev ? SEARCH_PREV : 0;
if (_jumpkind == JUMP_LINKPREV) searchmode = !_fjumpprev ? SEARCH_PREV : 0; // この場合は逆転
txJumpkind(text,_jumpkind,_jumpline,searchmode);
return TRUE;
}
return FALSE;
#else
HDIALOG hd = dialog("ジャンプ");
static int line = 0;
dialogInteger(hd,"行番号(&L):",12,&line,5);
if (dialogOpen(hd)) {
if (text->fLineD) {
txJumpLine(text,line);
} else {
txJumpPara(text,line);
}
}
#endif
}
return TRUE;
}
BOOL txIDM_SELECTJUMP(TX* text)
{
if (text->fClip) {
txSelectJump(text);
} else { //WZ4.00Bl 990909 選択しないでIDM_SELECTJUMPしたとき、前回選択開始位置とのジャンプを行うようにした。ユーザ要望。
if (txGetAddress(text) == text->cliptop) {
txJumpMarkCur(text);
} else {
txMarkCur(text);
txJumpAddress(text,text->cliptop);
}
}
return TRUE;
}
//##前位置へ戻る
//WZ3.90H 980928 new
enum {
IDD_PREVIEW = 900,IDD_PREVPAGE,IDD_NEXTPAGE,
};
typedef struct {
TX* text;
TX* textPreview;
BOOL fFlushListing;
LIST* list;
// result
BOOL fJumpMarkCur; // 直前位置へ戻る
JH_ITEM item;
} JH_DIALOG;
static mchar _szJumpMarkCur[] = "直前位置へ戻る";
static void jumphistOnSelchange(HWND hwnd)
{
HDIALOG hd = dialogFromHwnd(hwnd);
JH_DIALOG* context = (LPVOID)dialogGetCustdata(hd);
JH_ITEM* item = listReadCur(context->list);
TX* textDst = context->textPreview;
txSetUndisp(textDst);
txDeleteText(textDst);
if (item) {
BOOL fJumpMarkCur = !strcmp(item->szfilename,_szJumpMarkCur);
#if 1//WZ4.00Bm 990927 「前位置へ戻る」のプレビュー画面で文字コードの自動判別ができてなかった。
TX* text = textopenEx(fJumpMarkCur ? context->text->szfilename : item->szfilename,TXO_KCAUTOMODAL|TXO_CRAUTOMODAL);
#else
TX* text = textopen(fJumpMarkCur ? context->text->szfilename : item->szfilename);
#endif
txSetHigh(text);
if (fJumpMarkCur) { // 「直前位置」
txJumpAddress(text,context->text->mark[0]);
item->npara = text->npara;
txJumpFileTop(text);
}
{
IBUFF ibuff = text->cur;
NPARA npara = item->npara;
{
int n = item->npara;
// 100行手前の内容から、(10行手前では使いにくかった)
if (n > 100) {
npara = 100;
txInsert(textDst,"(以上省略)\n");
} else {
npara = n;
}
n -= npara;
while(n--) {
IBUFF ibuffN = txIbuffGetNextPara(text,ibuff);
if (ibuffN == IBUFF_ERROR) break;
ibuff = ibuffN;
}
}
{
int n = npara + 100; // npara+100行分までの内容をコピー
BOOL fEofed = FALSE;
for (;n--;) {
txInsertBuff(textDst,text->buff + ibuff,txIbuffGetParaContentEnd(text,ibuff)-ibuff);
txInsertReturn(textDst);
ibuff = txIbuffGetNextPara(text,ibuff);
if (ibuff == IBUFF_ERROR) {fEofed = TRUE;break;}
}
if (!fEofed) txInsert(textDst,"(以下省略)\n");
}
wstrcpy(textDst->wszfilename,text->wszfilename);txConfigGet(textDst);txFlush(textDst);
txJumpNpara(textDst,npara);
txSetLyCenter(textDst);
}
textclose(text);
}
txSetDisp(textDst);
}
BOOL CALLBACK dlgprocJumpHist(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
JH_DIALOG* context = (LPVOID)dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
LIST* list = listFromHwnd(GetDlgItem(hwnd,IDD_LIST));
JH_ITEM item;
SUBLISTITEMATR* atr = &list->tSubitem[0];
atr->type = LISTITEM_INT;
atr->offset = (LPBYTE)&item.npara - (LPBYTE)&item;
atr->cx = dtcx(DTCX * 6);
atr++;
atr->type = LISTITEM_SZ;
atr->offset = (LPBYTE)item.szfilename - (LPBYTE)&item;
atr->cx = -1;
atr++;
list->nSubitem = atr - &list->tSubitem[0];
context->list = list;
//
{
TX* text = context->textPreview = WzBox_GetTx(GetDlgItem(hwnd,IDD_PREVIEW));
text->tabsize = 2;
text->fDispUnder = TRUE;
txFlush(text);
}
// 最初に、txJumpMarkCurの飛び先を入れる。for 「直前位置へ戻る」代替
{
JH_ITEM* item = zmalloc(sizeof(JH_ITEM));
strcpy(item->szfilename,_szJumpMarkCur);
listAdd(context->list,item);
}
//
{
HSTRBLK sb = sbFromHist(HIST_JUMP);
int n = sbGetCount(sb);
for (;n--;) {
mchar* sz = sbRead(sb,n);
JH_ITEM* item = zmalloc(sizeof(JH_ITEM));
histjumpstrAnalyze(sz,item);
listAdd(context->list,item);
}
}
//
jumphistOnSelchange(hwnd);
break;
}
case WM_NOTIFY: {
LISTNOTIFY* notify = lParam;
LIST* list = context->list;
if (list && notify->hdr.hwndFrom == list->hwnd) {
if (notify->hdr.code == LISTN_SELCHANGE) {
jumphistOnSelchange(hwnd);
}
}
break;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
LIST* list = listFromHwnd(GetDlgItem(hwnd,IDD_LIST));
switch(id) {
case IDOK: {
JH_ITEM* item = listReadCur(list);
if (item) {
if (!strcmp(item->szfilename,_szJumpMarkCur)) context->fJumpMarkCur = TRUE;
context->item = *item;
}
break;
}
case IDD_PREVPAGE: {
txPrevPage1(context->textPreview);
return TRUE;
}
case IDD_NEXTPAGE: {
txNextPage1(context->textPreview);
return TRUE;
}
}
break;
}
}
return FALSE;
}
BOOL txIDM_UIJUMPBACK(TX* text)
{
//// いずれLISTで実現している部分をTEXTで実装し、検索が使えるようにしたい。
HDIALOG hd = dialog("前位置へ戻る");
DTRECT r;
JH_DIALOG context;
//
structClear(context);
context.text = text;
//
dialogSetDlgproc(hd,dlgprocJumpHist);
dialogSetCustdata(hd,&context);
dialogGetPos(hd,&r);
r.cx = DTCX * 60;
r.cy = DTCY * 6;
// listRegister();
__dialogAddItem(hd,szclassList,NULL,IDD_LIST,&r,WS_GROUP|WS_TABSTOP|WS_BORDER|WS_CHILD|WS_VISIBLE|LIST_WS_DEFAULT);
//
r.y += r.cy + DTCY;
r.cy = DTCY * 16; // プレビューが大きい方が使いやすい
__dialogAddItem(hd,TXWS_SZCLASSA,NULL,IDD_PREVIEW,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_VSCROLL|WS_VSCROLL|WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP);
//
dialogLFV(hd);
//
dialogControlID(hd,IDOK);
dialogCmdDefault(hd,"ジャンプ(&J)",16);
dialogControlID(hd,IDCANCEL);
dialogCmd(hd,"キャンセル(&C)",16);
dialogSpaceV(hd);
dialogControlID(hd,IDD_PREVPAGE);
dialogCmd(hd,"前ページ(&<)",16);
dialogControlID(hd,IDD_NEXTPAGE);
dialogCmd(hd,"後ページ(&>)",16);
//
if (dialogOpen(hd)) {
if (context.fJumpMarkCur) {
txJumpMarkCur(text);
return TRUE;
} else if (context.item.npara) {
mchar sz[40];
jumphistAdd(text);
#if UNIX
sprintf_A(sz,"-k -J%d -Yc",context.item.npara);
#else
sprintf_A(sz,"/k /J%d /Yc",context.item.npara);
#endif
forkstd(context.item.szfilename,sz);
return TRUE;
}
}
return FALSE;
}
//##検索閲覧
#if !WINDOWSCE
#define IDD_COPY 101
typedef struct {
LISTITEM head; // 必ず先頭にこれを入れる
// mydata
int npara;
mchar szpara[CCHWORD];
} SL_ITEM;
typedef struct {
TX* text;
SEARCH_PACKET* search;
BOOL fFlushListing;
LIST* list;
} SL_DIALOG;
static void searchlistFlush(HWND hwnd)
{
HDIALOG hd = dialogFromHwnd(hwnd);
SL_DIALOG* context = (LPVOID)dialogGetCustdata(hd);
TX* text = context->text;
SEARCH_PACKET* search = context->search;
SEARCHMODE searchmode = search->searchmode;
LIST* list = context->list;
txSetUndispEx(text);
txJumpFileTop(text);
listDelAll(list);
context->fFlushListing++;
for (searchmode |= SEARCH_CUR;;searchmode &= ~SEARCH_CUR) {
if (txSearchEx(text,search->szfind,searchmode)) {
SL_ITEM* item = zmalloc(sizeof(SL_ITEM));
item->npara = text->npara;
txGetParaEx(text,item->szpara,cchof(item->szpara));
listAdd(list,item);
listDispAll(list);
} else {
break;
}
}
context->fFlushListing--;
txSetDispEx(text);
{ //WZ4.00Bl 990926 検索閲覧で見つけた件数を表示するようにした。
mchar sz[CCHWORD];
mchar szfind[30];
sstrcpy(szfind,search->szfind); // 画面に収まるように。
sprintf_A(sz,"検索閲覧 - %s : %d件",szfind,list->n);
SetWindowText_A(hwnd,sz);
}
}
BOOL CALLBACK dlgprocSearchList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
SL_DIALOG* context = (LPVOID)dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
LIST* list = listFromHwnd(GetDlgItem(hwnd,IDD_LIST));
SL_ITEM item;
SUBLISTITEMATR* atr = &list->tSubitem[0];
//information("%d %d %d",(LPBYTE)&list->fSelect - (LPBYTE)list,(LPBYTE)(&list->tSubitem[0]) - (LPBYTE)list,(LPBYTE)(&list->tSubitem[1]) - (LPBYTE)list);
atr->type = LISTITEM_INT;
atr->offset = (LPBYTE)&item.npara - (LPBYTE)&item;
atr->cx = dtcx(DTCX * 6);
atr++;
atr->type = LISTITEM_SZ;
atr->offset = (LPBYTE)item.szpara - (LPBYTE)&item;
atr->cx = -1;
atr++;
list->nSubitem = atr - &list->tSubitem[0];
context->list = list;
//
searchlistFlush(hwnd);
break;
}
case WM_NOTIFY: {
LISTNOTIFY* notify = lParam;
LIST* list = context->list;
if (list && notify->hdr.hwndFrom == list->hwnd) {
if (notify->hdr.code == LISTN_SELCHANGE && !context->fFlushListing) {
SL_ITEM* item = listReadCur(list);
if (item) txJumpNpara(context->text,item->npara);
}
}
break;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
LIST* list = listFromHwnd(GetDlgItem(hwnd,IDD_LIST));
switch(id) {
case IDD_COPY: {
SL_ITEM* item = listReadCur(list);
TX* text = context->text;
if (item) {
txSetUndispEx(text);
txJumpNpara(text,item->npara);
txSelectEx(text,CLIP_CHAR);
txNextPara(text);
txSelectCopy(text);
txSelectQuit(text);
txSetDispEx(text);
}
return TRUE;
}
case IDD_SEARCH: {
if (txuiSearchGet(context->text,context->search)) {
searchlistFlush(hwnd);
}
return TRUE;
}
}
break;
}
}
return FALSE;
}
BOOL txuiSearchList(TX* text,SEARCH_PACKET* search)
{
// 検索閲覧では下線、検索文字列の表示を強制ON
BOOL fDispUnder0 = text->fDispUnder;
BOOL fDispFind0 = text->fDispFind;
IFILE adr = txGetAddress(text);
HDIALOG hd = dialog("検索閲覧");
DTRECT r;
SL_DIALOG context;
//
structClear(context);
context.text = text;
context.search = search;
//
text->fDispUnder = TRUE;
if (!text->fDispFind) text->fDispFind = COLORING_COLOR_UNDER;
txFlush(text);
//
dialogSetDlgproc(hd,dlgprocSearchList);
dialogSetCustdata(hd,&context);
dialogGetPos(hd,&r);
r.cx = DTCX * 60;
r.cy = DTCY * 15;
// listRegister();
__dialogAddItem(hd,szclassList,NULL,IDD_LIST,&r,WS_GROUP|WS_TABSTOP|WS_BORDER|WS_CHILD|WS_VISIBLE|LIST_WS_DEFAULT);
dialogLFV(hd);
//
dialogControlID(hd,IDOK);
dialogCmdDefault(hd,"ジャンプ(&J)",12);
dialogControlID(hd,IDD_COPY);
dialogCmd(hd,"コピー(&C)",12);
dialogControlID(hd,IDD_SEARCH);
dialogCmd(hd,"条件(&S)...",12);
dialogCancel(hd,12);
//
if (dialogOpen(hd) != IDOK) {
txSetUndisp(text);
txJumpAddress(text,adr);
} else {
txSetUndisp(text);
}
//
text->fDispUnder = fDispUnder0;
text->fDispFind = fDispFind0;
txFlush(text);
txSetDisp(text);
//
return TRUE;
}
#endif // !WINDOWSCE
//##プラグイン
#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_UISEARCH: { // サンプル
statprintf("IDM_UISEARCH by macro");
txIDM_UISEARCH(text);
return HOOK_CAPTURE;
}
case IDM_UIREPLACE: { // サンプル
statprintf("IDM_UIREPLACE by macro");
txIDM_UIREPLACE(text);
return HOOK_CAPTURE;
}
case IDM_GREP: { // サンプル
statprintf("IDM_GREP by macro");
txIDM_GREP(text);
return HOOK_CAPTURE;
}
}
}
return HOOK_CONTINUE;
}
void __on_txFrameNew(TX* text)
{
txSetHookWndproctextTxpcode(text,wndprocTextHook);
}
#endif