home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2002 March
/
VPR0203B.ISO
/
APUPDATE
/
VC
/
TXC0601A
/
TXC0601A.LZH
/
_IDMTOOL.C
< prev
next >
Wrap
C/C++ Source or Header
|
2001-05-23
|
167KB
|
6,066 lines
/*
ツール関係のIDMコマンド処理群
Start 99年11月19日
*/
#if __TXC__
#include <_wz.h>
#include <windows.h>
#include <windowsx.h>
#pragma multidef+
#include <commctrl.h>
#pragma multidef-
#include <_idm.h>
#else
#include "_sys.h"
#endif
#include "_idmlib.h"
#include "_list.h"
#include "_proof.h"
static BOOL txuiConvertTable(TX* text);
static BOOL txuiConvertKeisen(TX* text);
BOOL txCaseWord(TX* text,BOOL fToLower);
//##文字の変換
BOOL txIDM_ZENHANWORD(TX* text)
{
//WZ4.00Bl 990911 IDM_ZENHANWORD(カーソル位置の1語または範囲内の全角/半角変換)を追加
// 選択時は、範囲の先頭文字を見てどちらの変換をするか判断します。
int fClip = text->fClip;
txSetUndisp(text);
if (text->fClip) {
txJumpSelectTop(text);
} else {
txSelect(text);
if (isspace(txGetChar(text))){
txRightWord(text);
} else {
TXCHAR ch = txGetChar(text);
if (txchIsKanji(ch) && IschWord(pch_zen2han(text->buff+text->cur))) {
//WZ4.00Bn 991006 IDM_ZENHANWORDをIDM_ZENHANWORDしたとき1回で半角に変換するようにした。
mchar* p = text->buff + text->cur;
mchar* p0 = p;
while(1) {
if (!IschWord(pch_zen2han(p))) break;
p += 2;
}
txRightBytes(text,p - p0);
} else {
txJumpWordEnd(text);
}
}
txJumpSelectTop(text);
}
if (txchIsKanji(txGetChar(text))) {
txJankToAnk(text);
txJkataToKana(text);
} else {
txAnkToJank(text);
txKanaToJkata(text);
}
if (fClip) {
text->fClipMouse = TRUE;
} else {
// 範囲選択してないときは次の文字へ移動
txJumpSelectEnd(text);
txSelectQuit(text);
}
txSetDisp(text);
return TRUE;
}
BOOL txIDM_CASEWORD(TX* text)
{
//WZ4.00Bl 990911 IDM_CASEWORD(カーソル位置の1語または範囲内の大文字/小文字変換)を追加。
// 選択時は、範囲の先頭文字を見てどちらの変換をするか判断します。
int fClip = text->fClip;
txSetUndisp(text);
if (text->fClip) {
txJumpSelectTop(text);
} else {
txSelect(text);
txJumpWordEndMi(text);
txJumpSelectTop(text);
}
{
TXCHAR c = txGetChar(text);
BOOL fKanji = txchIsKanji(c);
if (fKanji) {
txJankToAnk(text);
c = txGetChar(text);
}
txCaseWord(text,!islower(c));
if (fKanji) {
txAnkToJank(text);
}
}
if (fClip) {
text->fClipMouse = TRUE;
} else {
txSelectQuit(text);
}
txSetDisp(text);
return TRUE;
}
void txAdjustZenHanSpace(TX* text,BOOL fSet)
{
// fSet=TRUE : 全角文字と半角文字の間に空白を一つあけます。
// fSet=FALSE: 全角文字と半角文字の間の空白を削除します。
// 範囲選択されているときは範囲内、されていないときはテキスト全体で処理
if (!txGetEditable(text)) return; //WZ4.00Ac 990206
if (text->fClip) {
txWalkStart(text);
} else {
if (question("文書のすべての全角/半角文字間の空白を調整します。\nよろしいですか?") != IDYES) return; //WZ3.90N 981130 変換の確認を付けた
txMarkCur(text);
txSetUndisp(text);
txJumpFileTop(text);
}
if (fSet) {
while(1) {
mchar* p = text->buff + text->cur;
mchar c = *p;
if (text->fClip && !txIsWalking(text)) break;
if (isalnum(c)) {
// 次の文字が漢字なら空白を挿入
if (!txRight(text)) break;
p = text->buff + text->cur;
if (tbisideo(*p)) {
txInsertChar(text,' ');
}
} else if (tbisideo(c)) {
TXCHAR ch = txGetChar(text);
if (strchr("。。.?・!」)…",ch)) {
//3.00A4 970509 英数字と全角文字の間に空白を空ける: 句読点と半角文字の間にも空白が入った
if (!txRight(text)) break;
} else {
// 次の文字がalnumなら空白を挿入
if (!txRight(text)) break;
p = text->buff + text->cur;
if (isalnum(*p)) {
txInsertChar(text,' ');
}
}
} else {
if (!txRight(text)) break;
}
}
} else {
while(1) {
mchar* p = text->buff + text->cur;
mchar c = *p;
if (text->fClip && !txIsWalking(text)) break;
if (isalnum(c)) {
// 次の文字が空白+漢字なら空白を削除
if (!txRight(text)) break;
p = text->buff + text->cur;
if (*p == ' ' && tbisideo(p[1])) {
txDeleteChar(text);
}
} else if (tbisideo(c)) {
// 次の文字が空白+alnumなら空白を削除
if (!txRight(text)) break;
p = text->buff + text->cur;
if (*p == ' ' && isalnum(p[1])) {
txDeleteChar(text);
}
} else {
if (!txRight(text)) break;
}
}
}
if (text->fClip) {
txWalkEnd(text);
} else {
txJumpMarkCur(text);
txSetDisp(text);
}
}
BOOL txSetZenHanSpace(TX* text)
{
// 英数字と全角文字の間に空白を空ける
// 範囲選択されているときは範囲内、されてないときはテキスト全体が対象
txAdjustZenHanSpace(text,TRUE);
return TRUE;
}
BOOL txClearZenHanSpace(TX* text)
{
// 英数字と全角文字の間の空白を削除
// 範囲選択されているときは範囲内、されてないときはテキスト全体が対象
txAdjustZenHanSpace(text,FALSE);
return TRUE;
}
BOOL txCaseWord(TX* text,BOOL fToLower)
{
// !fToLower:大文字/fToLower:小文字変換
// 半角文字のみ変換
// カーソル位置から1語を変換
// 範囲選択しているときは、その範囲を変換。
if (!txGetEditable(text)) return FALSE; //WZ4.00Ac 990206
if (!text->fClip) {
int c = text->buff[text->cur];
if (!(isalpha(c) || c=='_' || c == '$')) return FALSE;
}
{
IFILE cur0 = txGetAddress(text);
if (text->fClip) {
txWalkStart(text);
} else {
txSetUndisp(text);
}
while(1) {
int c = text->buff[text->cur];
if (text->fClip) {
if (!txIsWalking(text)) break;
} else {
if (!(isalpha(c) || c=='_' || c == '$')) break;
}
if (fToLower) {
if (isupper(c)) {
txInsertChar(text,c | 0x20); // tolower
txDeleteChar(text);
} else {
if (!txRight(text)) break;
}
} else {
if (islower(c)) {
// 先に文字を挿入する。文字装飾を保護するため
txInsertChar(text,c & 0xDF); // toupper
txDeleteChar(text);
} else {
if (!txRight(text)) break;
}
}
}
if (text->fClip) {
txWalkEnd(text);
} else {
IFILE left = txGetAddress(text) - cur0;
txLeftBytes(text,left);
txSetDisp(text);
}
}
return TRUE;
}
#if !__TXC__
BOOL TXAPI txuiConvertChar(TX* text)
{
static int mode = 0;
HDIALOG hd = dialog("変換");
dialogSetCustdata(hd,text);
//
dialogControlRadioV(hd);
dialogSetDialoghelp(hd,3); // "文字の変換"
dialogChoiceRadio(hd,&mode,
"半角文字と全角文字の変換(&C)...",
"大文字へ変換(&U)",
"小文字へ変換(&L)",
_pspc ? "[A]の間に空白を空ける(&A)" : "英数字と全角文字の間に空白を空ける(&A)",
_pspc ? "[A]の間の空白を詰める(&Z)" : "英数字と全角文字の間の空白を詰める(&Z)",
"タブを空白に変換(&T)",
"空白をタブに変換(&P)", //WZ4.00Bl 990911 「編集|変換」に「空白をタブに変換」を追加。
#if !WZFUNC_CONVERTTEXT
"改行付きテキストをプレーンテキストに変換(&M)",
"改行付きテキストに変換(&P)",
#endif
#if WINDOWSCE
"テキストの変換(&E)...", //WZ4.00Ab 990118 PWZ:「編集|変換」の項目変更
#endif
#if !WINDOWSCE
"行末の空白を除去(&S)", //WZ3.90L 981116
"表の変換(&B)...", //WZ3.90J 981110
#if !UNIX
"罫線文字の変換(&K)...", //WZ3.90J 981110
#endif
#endif
NULL
);
if (_pspc) {
dialogCaption(hd," [A] = 英数字と全角文字");
hd->cx = DTCX * 30;hd->cy = DTCY * 13;
}
#if WINDOWSCE2
hd->dialog->y = 0; //WCE1.01 980312
#endif
if (dialogOpen(hd)) {
switch(mode) {
case 0:return txuiConvertCharZenhan(text);
case 1: txCaseWord(text,FALSE);break;
case 2: txCaseWord(text,TRUE);break;
case 3: txSetZenHanSpace(text);break;
case 4: txClearZenHanSpace(text);break;
case 5: {
if (!text->fClip && question("文書のすべてのタブを変換します。\nよろしいですか?") != IDYES) {
//WZ3.90N 981130 変換の確認を付けた
} else {
txTabToSpace(text);
}
break;
}
case 6: {
if (question("文書のすべて行を変換します。\nよろしいですか?") == IDYES) {
txSpaceToTab(text);
}
break;
}
#if WZFUNC_CONVERTTEXT
#if WINDOWSCE
case 7: txIDM_UICONVERTTEXT(text);break;
#else
case 7: {
//WZ3.90L 981116
if (question("文書のすべての行末の余白を削除します。\nよろしいですか?") == IDYES) {
NPARA npara = text->npara;
int ich = txGetParaIch(text);
int ly = text->ly;
txSetUndisp(text);
txDeleteTailSpace(text);
txJumpNpara(text,npara);txJumpParaIchEx(text,ich);txSetLy(text,ly);
txSetDisp(text);
}
break;
}
case 8: txuiConvertTable(text);break; //WZ3.90J 981110
#if !UNIX
case 9: txuiConvertKeisen(text);break; //WZ3.90J 981110
#endif
#endif
#else
case 7: txMailtextToPlaintext(text);break;
// case 8:txPlaintextToWordtext(text);break;// for DEBUG
case 8: txPlaintextToMailtext(text);break;
#if !WINDOWSCE
case 9: txuiConvertTable(text);break; //WZ3.90J 981110
#if !UNIX
case 10: txuiConvertKeisen(text);break; //WZ3.90J 981110
#endif
#endif
#endif
}
return TRUE;
}
return FALSE;
}
#endif // !__TXC__
//##関数定義を検索
//WZ3.90H 980911 new
BOOL txIbuffIsFunctionDefine(TX* text,IBUFF ibuff,HEADLINE_INFO* res)
{
// ibuffから始まる段落が、C関数定義の行かどうかを返す。
// ibuffから段落終わりまでにGAPが存在してはいけない
// 関数定義の場合は、res->offset,res->lchをセットする。
// 関数定義でなければ、res->offset = res->lch = 0にする。
//WZ3.90H 980911 new
IBUFF paraend = txIbuffGetParaEnd(text,ibuff);
BOOL f = FALSE;
mchar* szstr = text->buff + ibuff;
mchar* p = szstr;
mchar* pEnd = text->buff + paraend;
mchar c0 = *pEnd;
*pEnd = 0;
if (p = strchr(p,'(')) {
mchar* q = szstr;
int nWord = 0;
while(1) {
int lch = 0;
while(isspace(*q)) q++;
if (*q == '(') break;
while(IschWord(*q) || *q == '*' || *q == ':') {lch++;q++;} //WZ3.90G 980827 ':' C++関数に対応
if (lch == 0) {
nWord = 0;
break;
}
nWord++;
if (res) {
res->lch = lch;
res->offset = q - szstr - lch;
}
}
if (nWord >= 2) {
//WZ4.00A 981227 Cプログラムで"else if (a==0)"の行が見出しになったのを改良
//WZ4.00Bj 990824 Cプログラムで"else if (a)"の行が見出しになったのを改良
//WZ4.00Bj 990824 (...)にも対応のため、renew
mchar* top = strGetWordTop(szstr);
int lch = strGetWordLen(top);
if (lch == 4 && !memcmp(top,"else",4)) {
} else {
if (p = strchr(p,')')) {
p++;
while(isspace(*p)) p++;
if (*p == '{') { //WZ4.00Aa 990108 "void func(void) {"形式もC関数定義と見なすようにした
p++;
while(isspace(*p)) p++;
}
if (*p == 0) f = TRUE;
}
}
}
}
*pEnd = c0;
if (f) return TRUE;
if (res) structClear(*res);
return FALSE;
}
#if !WINDOWSCE
typedef struct {
FOLDER_WALK walk;
TX* text;
TX* textCache;
HWND hwndTitle;
mchar szFind[CCHWORD];
int lchFind;
LIST* list;
BOOL fOnCache;
BOOL fFlushText; //WZ3.90H 980927 textのキャッシュを更新?
} SEARCHFUNC;
typedef struct {
LISTITEM head; // 必ず先頭にこれを入れる
// mydata
mchar szname[CCHWORD];
int npara;
mchar szfilename[CCHPATHNAME];
} SF_ITEM;
#define IDD_SEARCHFUNC 101
#define IDD_FLUSHCACHETEXT 102
static void cacheAdd(SEARCHFUNC* arg,mchar* pFind,int lchFind,mchar* szfilename,NPARA npara)
{
// キャッシュに追加
TX* text = arg->textCache;
txJumpFileTop(text);
txInsertChar(text,'"');txInsert(text,szfilename);txInsert(text,"\" ");
txInsertf(text,"%ld ",npara);
txInsertChar(text,'"');txInsertBuff(text,pFind,lchFind);txInsertChar(text,'"');
txInsertReturn(text);
}
static void cacheDelFile(SEARCHFUNC* arg,mchar *szfilename)
{
// szfilenameと同じファイル名のエントリを除く
TX* text = arg->textCache;
mchar szFind[CCHPATHNAME];
SEARCHMODE searchmode = SEARCH_PARATOP|SEARCH_NOSENSECASE|SEARCH_NOESC|SEARCH_CUR;
//
txJumpFileTop(text);
strcpy(szFind,szfilename);
pathSetLong(szFind);
//
while(1) {
if (txSearchEx(text,szFind,searchmode)) {
txDeletePara(text);
txJumpParaTop(text);
} else {
break;
}
}
}
static BOOL _SearchFunctionFile(SEARCHFUNC* arg,wchar* wszfilename,BOOL fCacheMatch);
static void cacheSearch(SEARCHFUNC* arg)
{
// キャッシュから検索
TX* text = arg->textCache;
mchar szFind[CCHPATHNAME];
//
listDelAll(arg->list);listDispAll(arg->list);
if (arg->lchFind == 0) return; //WZ4.00Ea 001111 検索文字列が空の時は検索処理をしないで高速化
//
txJumpFileTop(text);
strcpy(szFind,arg->szFind);pathSetLong(szFind);
arg->fOnCache = TRUE;
//dialogaText(text,NULL);
while(1) {
int cch;
if (cch = txSearchEx(text,szFind,0)) {
txRightBytes(text,cch-1);
if (txIsCurReturn(text)) {
mchar buff[CCHPATHNAME + 40];
txGetParaEx(text,buff,sizeof(buff));
//information(buff);
{
mchar szfilename[CCHPATHNAME];
wchar wsz[CCHPATHNAME];
mchar* p = buff;
NPARA npara;
sstrcpylen(szfilename,p,strGetWordLen(p));
pathFormLong(szfilename);
p += strGetWordLen(p);
npara = atoi(strGetWordTop(p));
strtowstr(szfilename,-1,wsz,CCHPATHNAME);
//// _mailer.cの関数へのジャンプで遅い。関数定義がずれてないか調べているため。もっと早くできないか。
if (!fileIsExistW(wsz)) {
//WZ4.00Bg 990719 存在しないファイルがキャッシュに書かれているときに無限ループした。
mchar szfilename[CCHPATHNAME];
wpathtopath(wsz,szfilename);
//printf("%s %d\n",szfilename,npara);
//WZ4.00Bg 990719
cacheDelFile(arg,szfilename);
// retry
listDelAll(arg->list);listDispAll(arg->list);
txJumpFileTop(text);
} else if (npara && _SearchFunctionFile(arg,wsz,npara)) {
SF_ITEM* item = zmalloc(sizeof(SF_ITEM));
strcpy(item->szfilename,szfilename);
item->npara = npara;
sstrcpy(item->szname,pathGetFileName(item->szfilename));
listAdd(arg->list,item);
listDispAll(arg->list);
} else {
_SearchFunctionFile(arg,wsz,0);
}
}
}
} else {
break;
}
}
arg->fOnCache = FALSE;
}
static void sfAdd(SEARCHFUNC* arg,TX* text,NPARA npara)
{
if (!arg->fOnCache && !arg->fFlushText) {
SF_ITEM* item = zmalloc(sizeof(SF_ITEM));
strcpy(item->szfilename,text->szfilename);
item->npara = npara;
sstrcpy(item->szname,pathGetFileName(item->szfilename));
listAdd(arg->list,item);
listDispAll(arg->list);
}
}
static BOOL sfRe(SEARCHFUNC* arg,TX* text,mchar* szRe,int iTag,BOOL fCacheMatch)
{
txJumpFileTop(text);
txSetHigh(text);
while(1) {
if (txSearchEx(text,szRe,SEARCH_REWZ|SEARCH_CUR)) {
int lch = retagGetLch(iTag);
if (lch == arg->lchFind) {
mchar szbuff[CCHWORD];
retagGetEx(iTag,szbuff,CCHWORD);
//statprintf(szbuff);
if (!memcmp(szbuff,arg->szFind,arg->lchFind)) {
if (fCacheMatch) {
if (fCacheMatch == text->npara) {
textclose(text);
return TRUE;
}
} else {
sfAdd(arg,text,text->npara);
}
}
}
if (!fCacheMatch) {
mchar szbuff[CCHWORD];
retagGetEx(iTag,szbuff,CCHWORD);
cacheAdd(arg,szbuff,lch,text->szfilename,text->npara);
}
} else {
break;
}
if (!txNextPara(text)) break;
}
txResetHigh(text);
return FALSE;
}
static BOOL _SearchFunctionFile(SEARCHFUNC* arg,wchar* wszfilename,BOOL fCacheMatch)
{
// fCacheMatch != 0なら、arg->szFindがfCacheMatchと等しい段落にあればTRUE、
// なければFALSEを返す
// fCacheMatch == 0なら、wszfilenameについてarg->szFindにマッチするエントリを
// arg->listおよびキャッシュに追加する。
TX* text;
IFILE adr0;
int ly0;
if (arg->fFlushText) {
text = arg->text;
adr0 = txGetAddress(text);
ly0 = text->ly;
txSetUndisp(text);
} else {
text = textopenW(wszfilename);
}
if (!text) return FALSE; //WZ4.00Bl 990917 排他制御読み書き禁止で関数定義を検索するとアプリエラーになる場合があったのを修正。
if (!fCacheMatch) cacheDelFile(arg,text->szfilename);
{ // 関数定義
txJumpFileTop(text);
{
IBUFF ibuff = text->cur;
NPARA npara = 1;
while(1) {
HEADLINE_INFO res;
if (txIbuffIsFunctionDefine(text,ibuff,&res)) {
mchar* p = text->buff + ibuff + res.offset;
if (res.lch == arg->lchFind) {
if (!memcmp(p,arg->szFind,arg->lchFind)) {
if (fCacheMatch) {
if (fCacheMatch == npara) {textclose(text);return TRUE;}
} else {
sfAdd(arg,text,npara);
}
}
}
if (!fCacheMatch) {
//if (arg->fFlushText) {mchar* sz = strdupLen(p,text->lchHeadlineContent);information(sz);free(sz);}
cacheAdd(arg,p,res.lch,text->szfilename,npara);
}
}
ibuff = txIbuffGetNextPara(text,ibuff);
if (ibuff == IBUFF_ERROR) break;
npara++;
}
}
}
{ // #define
if (sfRe(arg,text,"^\\s*#define\\s+(\\w+)",0,fCacheMatch)) return TRUE;
}
{ // typedef FOLDER_WALK
if (sfRe(arg,text,"^\\s*}\\s+(\\w+)\\s*;",0,fCacheMatch)) return TRUE;
if (sfRe(arg,text,"^\\s*typedef.+(\\w+)\\s*;",0,fCacheMatch)) return TRUE;
}
//
if (arg->fFlushText) {
txJumpAddress(text,adr0);
txSetLy(text,ly0);
txSetDisp(text);
} else {
textclose(text);
}
if (fCacheMatch) return FALSE;
return TRUE;
}
static BOOL SearchFunctionFile(SEARCHFUNC* arg,wchar* wszfilename)
{
if (wpathIsBackupfile(wszfilename)) return FALSE;
{
wchar buff[CCHWORD];
wstrcpy(buff,L"関数定義を検索中(中止=Esc押し続け) - ");
wsstrcat(buff,wpathGetFileName(wszfilename));
SetWindowText_W(arg->hwndTitle,buff);
if (GetAsyncKeyState(VK_ESCAPE) < 0) {
arg->walk.fAborted = TRUE;
return FALSE;
}
}
return _SearchFunctionFile(arg,wszfilename,FALSE);
}
static BOOL SearchFunction(SEARCHFUNC* arg,wchar* wszPath)
{
int ret;
listDelAll(arg->list);
arg->walk.appContext = arg;
arg->walk.appProc = SearchFunctionFile;
#if __TXC__
arg->walk.fTXC = TRUE;
#endif
ret = folderWalk(&arg->walk,wszPath);
txDoCaption(arg->text);
return ret;
}
typedef struct {
mchar szpath[CCHPATHNAME];
SEARCHFUNC arg;
BOOL fFirst;
BOOL fJump;
BOOL fTimer;
SF_ITEM item;
} SF_DIALOG;
static BBOOL _fOpenMulti = FALSE; //WZ3.90H 980915
// 設定
static mchar p_szmask[CCHWORD];
static BBOOL p_fSearchSubDirectory = TRUE;
static void searchfuncConfigGetset(BOOL fSet)
{
TX* text = txMbxOpenWzapp("uiSearchFunction");
if (text) {
txMsghdrGetsetIntInitB(text,"fSubDir:",TRUE,&p_fSearchSubDirectory,fSet);
txMsghdrGetsetStringInit(text,"mask:","*.c;*.cpp;*.h",p_szmask,cchof(p_szmask),fSet);
}
txMbxClose(text);
}
static void searchfuncConfigLoad(void)
{
searchfuncConfigGetset(FALSE);
}
static void searchfuncConfigSave(void)
{
searchfuncConfigGetset(TRUE);
}
void buttonSetDefault(HWND hwnd,BOOL fSet)
{
DWORD ws = GetWindowLong(hwnd,GWL_STYLE);
if (fSet) ws |= BS_DEFPUSHBUTTON; else ws &= ~BS_DEFPUSHBUTTON;
SetWindowLong(hwnd,GWL_STYLE,ws);
}
static void hwndSearchFunctionFlushDefButton(HWND hwnd)
{
#if 0 //WZ3.90I 981102 使いにくいので廃止
HDIALOG hd = dialogFromHwnd(hwnd);
SF_DIALOG* context = (LPVOID)dialogGetCustdata(hd);
if (context->arg.szFind[0]) {
BOOL fSearch = (context->arg.list->n == 0);
if (fSearch) {
HWND hctrl = GetDlgItem(hwnd,IDD_SEARCH);
SetFocus(hctrl);
buttonSetDefault(hctrl,TRUE);
buttonSetDefault(GetDlgItem(hwnd,IDD_JUMP),FALSE);
} else {
HWND hctrl = GetDlgItem(hwnd,IDD_JUMP);
SetFocus(hctrl);
buttonSetDefault(hctrl,TRUE);
buttonSetDefault(GetDlgItem(hwnd,IDD_SEARCH),FALSE);
}
} else {
SetFocus(GetDlgItem(hwnd,IDD_SEARCHFUNC));
}
#endif
}
static void searchfuncOnTimer(HWND hwnd,BOOL fMove)
{
HDIALOG hd = dialogFromHwnd(hwnd);
SF_DIALOG* context = (LPVOID)dialogGetCustdata(hd);
//
context->fTimer = FALSE;
wndSetTimer(hwnd,WM_TIMER_TXUSER,0);
dialogRead(hd);
{
SEARCHFUNC* arg = &context->arg;
arg->lchFind = strlen(arg->szFind);
cacheSearch(arg);
if (fMove) {
hwndSearchFunctionFlushDefButton(hwnd);
if (arg->list->n >= 2) SetFocus(arg->list->hwnd);
} else {
// 通常はフォーカスをボタンに移動しない。移動すると使いにくい
}
}
}
BOOL CALLBACK dlgprocSearchFunction(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
SF_DIALOG* context = (LPVOID)dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
LIST* list = listFromHwnd(GetDlgItem(hwnd,IDD_LIST));
SF_ITEM item;
SUBLISTITEMATR* atr = &list->tSubitem[0];
atr->type = LISTITEM_SZ;
atr->offset = (LPBYTE)item.szname - (LPBYTE)&item;
atr->cx = dtcx(DTCX * 20);
atr++;
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 = dtcx(DTCX * 40);
atr++;
list->nSubitem = atr - &list->tSubitem[0];
//
context->fFirst = TRUE;
PostMessage(hwnd,WM_TXUSER,0,0);
//
{
SEARCHFUNC* arg = &context->arg;
arg->list = list;
arg->lchFind = strlen(arg->szFind);
cacheSearch(arg);
hwndSearchFunctionFlushDefButton(hwnd);
if (arg->list->n >= 2) SetFocus(arg->list->hwnd);
return INITDIALOG_FALSE;
}
break;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
int cmd = GET_WM_COMMAND_CMD(wParam,lParam);
LIST* list = listFromHwnd(GetDlgItem(hwnd,IDD_LIST));
switch(id) {
case IDD_SEARCHFUNC: {
if (!context->fFirst) {
if (cmd == CBN_EDITCHANGE || cmd == CBN_SELCHANGE) {
context->fTimer = TRUE;
wndSetTimer(hwnd,WM_TIMER_TXUSER,500);
}
}
break;
}
case IDD_JUMP: {
if (context->fTimer) {
// まだ更新してなかったら、更新する
SendMessage(hwnd,WM_TIMER,WM_TIMER_TXUSER,0);
}
{
SF_ITEM* item = listReadCur(list);
if (item) {
context->item = *item;
context->fJump = TRUE;
}
}
break;
}
case IDD_FLUSHCACHETEXT: {
// キャッシュ内の現在のテキストの関数一覧を更新する。
SEARCHFUNC* arg = &context->arg;
if (arg->text->fEdit) {
information("テキストは編集されています。\n保存してから再度実行してください。");
} else {
arg->fFlushText = TRUE;
arg->lchFind = 0;
_SearchFunctionFile(arg,NULL,FALSE);
arg->fFlushText = FALSE;
//
searchfuncOnTimer(hwnd,TRUE);
}
return TRUE;
}
case IDD_SEARCH: {
mchar szpath[CCHPATHNAME];
dialogRead(hd);
strcpy(szpath,context->szpath);
pathSetDir(szpath);
pathSetFileName(szpath,p_szmask);
//
{
wchar wsz[CCHPATHNAME];
SEARCHFUNC* arg = &context->arg;
strtowstr(szpath,-1,wsz,CCHPATHNAME);
//winformation(wsz);
arg->walk.fSearchSubFolder = p_fSearchSubDirectory;
arg->hwndTitle = hwnd;
arg->lchFind = strlen(arg->szFind);
//information(arg.szFind);
//
SearchFunction(arg,wsz);
SetWindowText_A(hwnd,"関数定義を検索");
cacheSearch(arg);
hwndSearchFunctionFlushDefButton(hwnd);
}
return TRUE;
}
}
break;
}
case WM_TIMER: {
searchfuncOnTimer(hwnd,FALSE);
break;
}
case WM_TXUSER: {
context->fFirst = FALSE;
break;
}
case WM_NOTIFY: { //WZ4.00Bl 990914 (!PWZ)「関数定義を検索」でリストをダブルクリックしてジャンプするようにした。ユーザ要望。
LISTNOTIFY* notify = (LPVOID)lParam;
LIST* list = listFromHwnd(GetDlgItem(hwnd,IDD_LIST));
if (list && notify->hdr.hwndFrom == list->hwnd) {
if (notify->hdr.code == LISTN_FORWARD && notify->message == WM_LBUTTONDBLCLK) {
PostMessage(hwnd,WM_COMMAND,IDD_JUMP,0);
}
}
break;
}
}
return FALSE;
}
static void pathForm(mchar* szpath)
{
// pathをDOSのパス形式に変換
// "a:\wz\wz.exe" -> "a:\wz"
// "a:\abc" -> "a:\"
//WZ3.90H 980911 new
pathSetFileName(szpath,NULL);
pathFormDirDos(szpath);
}
BOOL txIDM_SEARCHFUNCTION(TX* text)
{
HDIALOG hd = dialog("関数定義を検索");
static mchar szhist[] = "searchfunction";
HSTRBLK sb = historyOpen(szhist,4096);
DTRECT r;
SF_DIALOG context;
//
searchfuncConfigLoad();
//
structClear(context);
context.arg.text = text;
context.arg.walk.fNoSearchWindows = TRUE;
context.arg.walk.fNoSearchBinaryFiletype = TRUE;
context.arg.walk.fNoSearchBigFile = TRUE;
{
wchar wszdicname[CCHPATHNAME];
context.arg.textCache = textopenW(wpathFullConfig(wszdicname,L"dtgcache.dic"));
txSetHigh(context.arg.textCache); //WZ3.90I 981005 高速化
}
//
dialogSetCustdata(hd,&context);
dialogSetDlgproc(hd,dlgprocSearchFunction);
//
strcpy(context.szpath,text->szfilename);
pathForm(context.szpath);
//
txGetWordAfterEx(text,context.arg.szFind,CCHWORD);
//
dialogControlID(hd,IDD_SEARCHFUNC);
dialogControlStrblkHist(hd,sb);hd->fHistRead = TRUE;
dialogString(hd,"検索する関数(&S):",16,context.arg.szFind,CCHWORD,20);
dialogString(hd,"検索マスク(&M):",16,p_szmask,cchof(p_szmask),20);
//
dialogControlRefer(hd,"-d *.*");
dialogString(hd,"検索フォルダ(&F):",16,context.szpath,CCHPATHNAME,37);
//
dialogSetH(hd);
dialogCheckB(hd,"サブフォルダも検索(&U)",&p_fSearchSubDirectory);
dialogCheckB(hd,"多重化(&I)",&_fOpenMulti); //WZ3.90H 980915
dialogLFSetV(hd);
//
dialogSpaceV(hd);
dialogCaption(hd,"一覧(&D):");
dialogGetPos(hd,&r);
r.cx = DTCX * 60;
r.cy = DTCY * 9;
// 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,IDD_JUMP);
dialogCmdDefault(hd,"ジャンプ(&J)",13);
dialogCancel(hd,13);
dialogSpaceV(hd);
dialogControlID(hd,IDD_SEARCH);
dialogCmd(hd,"検索(&X)",13);
dialogControlID(hd,IDD_FLUSHCACHETEXT);
dialogCmd(hd,"テキストを更新(&L)",13);
//
dialogOpen(hd);
//
txSave(context.arg.textCache);
textclose(context.arg.textCache);
searchfuncConfigSave();
//
if (context.fJump) { // ダイアログを閉じてからジャンプする for 他でダイアログオープン中が出ないように。
mchar sz[40];
jumphistAdd(text);
//WZ4.00Bl 990922 /k -> /kpj for 「設定の切り替え」の記憶を読むように。
#if UNIX
sprintf_A(sz,"-kpj -J%d -Yc %s",context.item.npara,_fOpenMulti ? "-mt" : "");
#else
sprintf_A(sz,"/kpj /J%d /Yc %s",context.item.npara,_fOpenMulti ? "/mt" : "");
#endif
forkstd(context.item.szfilename,sz);
histAdd(sb,context.arg.szFind);
}
historyClose(szhist,sb);
return TRUE;
}
#endif // !WINDOWSCE
//##文字列の補完
// HIST_STRも補完辞書として活用
// HIST_COMPLETEに学習する
static mchar _szCompleteHist[] = "HIST_COMPLETE";
#define SIZE_COMPLETEHIST 1024
#define IFIND_HIST_LAST 24999
#define IFIND_END_HISTCOMPLETE 24999
#define IFIND_TOP_HISTCOMPLETE 20000
#define IFIND_END_HISTSTR 19999
#define IFIND_TOP_HISTSTR 15000
#define IFIND_END_HISTSEARCH 14999
#define IFIND_TOP_HISTSEARCH 10000
#define IFIND_HIST_TOP 10000
#define IFIND_NONE -1
static int _completeSearchHist(HHIST h,int ifind,BOOL fPrev,mchar* szdst,mchar* szstr)
{
int top;
int end;
HSTRBLK sb;
if (h == HIST_SEARCH) {
top = IFIND_TOP_HISTSEARCH;
end = IFIND_END_HISTSEARCH;
sb = sbFromHist(h);
#if 0//WCE0.91 970914
} else if (h == HIST_STR) {
top = IFIND_TOP_HISTSTR;
end = IFIND_END_HISTSTR;
sb = sbFromHist(h);
#endif
} else {
top = IFIND_TOP_HISTCOMPLETE;
end = IFIND_END_HISTCOMPLETE;
sb = h;
}
//
if (ifind == end) {
ifind = sbGetCount(sb);
} else {
ifind -= top;
}
//
if (fPrev) {
ifind = sbiSearchNext(sb,szstr,ifind);
} else {
ifind = sbiSearchPrev(sb,szstr,ifind);
}
//
if (ifind == -1) {
if (fPrev) {
ifind = IFIND_NONE;
} else {
ifind = 0;
}
} else {
strcpymax(szdst,sbRead(sb,ifind),CCHWORD);
ifind += top;
}
return ifind;
}
static int completeSearchHist(int ifind,BOOL fPrev,mchar* szdst,mchar* szstr,HSTRBLK sbComplete)
{
#if 1//WCE0.91 970914
if (IFIND_TOP_HISTCOMPLETE <= ifind && ifind <= IFIND_END_HISTCOMPLETE) {
ifind = _completeSearchHist(sbComplete,ifind,fPrev,szdst,szstr);
if (ifind != 0) return ifind;
ifind = IFIND_END_HISTSEARCH;
}
return _completeSearchHist(HIST_SEARCH,ifind,fPrev,szdst,szstr);
#else
if (IFIND_TOP_HISTCOMPLETE <= ifind && ifind <= IFIND_END_HISTCOMPLETE) {
ifind = _completeSearchHist(sbComplete,ifind,fPrev,szdst,szstr);
if (ifind != 0) return ifind;
ifind = IFIND_END_HISTSTR;
}
if (IFIND_TOP_HISTSTR <= ifind && ifind <= IFIND_END_HISTSTR) {
ifind = _completeSearchHist(HIST_STR,ifind,fPrev,szdst,szstr);
if (ifind != 0) return ifind;
ifind = IFIND_END_HISTSEARCH;
}
return _completeSearchHist(HIST_SEARCH,ifind,fPrev,szdst,szstr);
#endif
}
static int _completeSearch(mchar szdst[CCHWORD],mchar* szstr,int ifind,BOOL fPrev,HSTRBLK sbComplete)
{
szdst[0] = 0;
if (ifind == IFIND_NONE) {
} else if (ifind >= IFIND_HIST_TOP) {
ifind = completeSearchHist(ifind,fPrev,szdst,szstr,sbComplete);
} else {
wchar wszfilename[CCHPATHNAME];
TX* text = textopenW(wpathFullConfig(wszfilename,L"complete.dic"));
if (text) {
text->fHeadlineStringStd = TRUE;//PWZ2BETA0.3 980509
if (fPrev) {
txJumpPara(text,ifind);
} else {
txJumpPara(text,ifind + 1);
}
if (
szstr[0] && //2.99D 970402 新規作成で開いた直後、文字列の補完を行うとハングした
txSearchEx(text,szstr,(fPrev ? SEARCH_PREV : SEARCH_CUR)|SEARCH_NOSENSECASE|SEARCH_NOSENSEZENHAN|SEARCH_PARATOP)
) {
mchar sz[CCHLINE];
txGetParaEx(text,sz,cchof(sz));
ifind = text->npara;
strcpymax(szdst,sz,CCHWORD);
} else {
if (fPrev) {
ifind = IFIND_HIST_TOP;
} else {
ifind = IFIND_NONE;
}
}
} else {
if (fPrev) {
ifind = IFIND_HIST_TOP;
} else {
ifind = IFIND_NONE;
}
}
textclose(text);
}
return ifind;
}
static int completeSearch(mchar szdst[CCHWORD],mchar* szstr,int i,BOOL fPrev,HSTRBLK sbComplete)
{
while(1) {
i = _completeSearch(szdst,szstr,i,fPrev,sbComplete);
if (i == IFIND_NONE) return i;
if (szdst[0]) return i;
}
}
static BOOL _complete(tx* text,BOOL fPrev,HSTRBLK sbComplete)
{
static mchar _szstr[CCHWORD]; // 前回検索をかけた文字列
static int _ifind; // 前回検索をかけたインデックス
static IFILE _adr = -1; // 前回検索をかけたアドレス
static int _lchInsert; // 前回挿入したバイト数
static BOOL _fPrev = -1; // 前回の方向
static mchar szbuff[CCHWORD];// 前回挿入した文字列
BOOL ret = FALSE;
mchar szstr[CCHWORD];
IFILE adr = txGetAddress(text);
if (adr == _adr) {
if (_ifind == -1) {
if (_fPrev == fPrev) {
return FALSE;
} else {
if (fPrev) {
_ifind = IFIND_HIST_TOP - 1;
} else {
_ifind = IFIND_HIST_LAST;
}
}
}
} else {
if (szbuff[0]) sbAddHist(sbComplete,szbuff); // 学習
txSelectEx(text,CLIP_CHAR);
txLeft(text);
txJumpWordTopMi(text);
txGetWordEx(text,szstr,cchof(szstr));
txSelectQuit(text);
//1.99A 補完できないときにカーソルが単語の先頭に飛んだ
txRightBytes(text,strlen(szstr));
//
strcpy(_szstr,szstr);
_ifind = IFIND_HIST_LAST;
_lchInsert = 0;
}
{
int i = completeSearch(szbuff,_szstr,_ifind,fPrev,sbComplete);
if (i >= 0) {
_ifind = i;
if (_lchInsert) {
txLeftBytes(text,_lchInsert);
txDeleteBytes(text,_lchInsert);
} else {
int lchOld = strlen(_szstr);
txLeftBytes(text,lchOld);//1.99A
txDeleteBytes(text,lchOld);
}
_lchInsert = strlen(szbuff);
txInsert(text,szbuff);
ret = TRUE;
} else {
_ifind = -1;
}
}
_adr = txGetAddress(text);
_fPrev = fPrev;
return ret;
}
static BOOL complete(tx* text,BOOL fPrev)
{
//WCE0.91 970914 文字列の補完追加
HSTRBLK sb = historyOpen(_szCompleteHist,SIZE_COMPLETEHIST);
BOOL ret;
text->fUndispSelect++;
text->fUndispCursor++;
ret = _complete(text,fPrev,sb);
text->fUndispSelect--;
text->fUndispCursor--;
txDispCursor(text);
txDispLocate(text);
historyClose(_szCompleteHist,sb);
return ret;
}
BOOL txIDM_COMPLETEPREV(TX* text)
{
return complete(text,TRUE);
}
BOOL txIDM_COMPLETENEXT(TX* text)
{
return complete(text,FALSE);
}
static BOOL completeAddDic(mchar* szstr)
{
//WZ3.90H 980912 new
if (szstr[0] == 0) {
return FALSE;
} else {
BOOL ret = FALSE;
mchar szfilename[CCHPATHNAME];
TX* text = textopen(pathFullConfig(szfilename,"complete.dic"));
{
BOOL f = FALSE;
while(1) {
if (txSearchEx(text,szstr,SEARCH_CUR|SEARCH_NOSENSECASE|SEARCH_NOSENSEZENHAN|SEARCH_PARATOP)) {
mchar sz[CCHWORD];
txGetParaEx(text,sz,CCHWORD);
if (!stricmp(sz,szstr)) {
f = TRUE;
statprintf("%sは既に登録されています",szstr);
break;
}
if (!txNextPara(text)) break;
} else {
break;
}
}
if (!f) {
txJumpFileTop(text);
txInsert(text,szstr);
txInsertReturn(text);
txSave(text);
statprintf("%sを登録しました",szstr);
ret = TRUE;
}
}
textclose(text);
return ret;
}
}
static BOOL uiCompleteAddDic(mchar* szstr)
{
//WZ3.90H 980912 new
HDIALOG hd = dialog("文字列補完辞書への登録");
BOOL ret = FALSE;
mchar sz[CCHWORD];
strcpy(sz,szstr);
dialogString(hd,"登録する文字列(&S):",20,sz,CCHWORD,30);
if (dialogOpen(hd)) {
ret = completeAddDic(sz);
}
return ret;
}
//##入力支援
// テキストファイルを指定して、そのファイルを辞書として使って入力支援できるようにした
//WZ3.90H 980912 new
#if !WINDOWSCE
#define IDD_TOP_PREV 200
#define IDD_TOP_NEXT 201
#define IDD_END_PREV 202
#define IDD_END_NEXT 203
#define IDD_TARGET 204
#define IDD_LISTCAPTION 206
#define IDD_TEXT 207
#define IDD_TEXTPARA 208 // 209も使用
#define IDD_HISTSEARCH 210
#define IDD_GUIDE 211
#define IDD_WRING 212
#define IDD_ADDDIC 213
#define IDD_LIST_PREVIEW 214
#define IDD_SELECT 215
#define IDD_REFERTEXTFILE 216
#define IDTIMER_COMPLETE (WM_TIMER_TXUSER)
// 設定
static BOOL _fSearchText;
static BOOL _fSearchHistSearch;
static BOOL _fSearchTextPara;
static BOOL _fCompleteWring;
static mchar p_szCompleteFile[CCHPATHNAME];
static void uicompleteConfigGetset(BOOL fSet)
{
//WZ4.00Ab 990117 new
TX* text = txMbxOpenWzapp("uiComplete");
if (text) {
txMsghdrGetsetIntInit(text,"fText:",TRUE,&_fSearchText,fSet);
txMsghdrGetsetIntInit(text,"fHist:",TRUE,&_fSearchHistSearch,fSet);
txMsghdrGetsetInt(text,"fPara:",&_fSearchTextPara,fSet);
txMsghdrGetsetIntInit(text,"fWring:",TRUE,&_fCompleteWring,fSet);
txMsghdrGetsetString(text,"file:",p_szCompleteFile,CCHPATHNAME,fSet);
}
txMbxClose(text);
}
static void uicompleteConfigLoad(void)
{
uicompleteConfigGetset(FALSE);
}
static void uicompleteConfigSave(void)
{
uicompleteConfigGetset(TRUE);
}
typedef struct {
HSTRBLK sb;
BOOL fEdit;
BOOL fCanceled;//3.00B1 970522
TX* text;
NPARA npara;
mchar szTarget[CCHWORD];
//
HWND hwnd;
TX* textPreview;
LIST* list;
BOOL fFlushListing;
BOOL fDialogWriting; //WZ4.00Bl 990915
} COMPLETECONTEXT;
typedef struct {
LISTITEM listitem; // 必ず先頭にこれを入れる
// mydata
int npara;
mchar szcontent[CCHWORD];
BOOL fReferFile;
} IC_ITEM;
static void myPostMessage(HWND hwnd,int message,WPARAM wParam,LPARAM lParam)
{
MSG msg;
if (PeekMessage(&msg,hwnd,message,message,PM_NOREMOVE)) {
// 既にポストされている場合は、ポストしない
} else {
PostMessage(hwnd,message,wParam,lParam);
}
}
static void FlushSelect(TX* text,BOOL fLeft)
{
if (txFlushSelectNow(text)) {
if (text->clipendnow <= text->cliptopnow) {
if (fLeft) return;
txSelectJump(text);
}
if (!fLeft) return;
txSelectJump(text);
}
}
static BOOL mylistFind(LIST* list,mchar* sz)
{
int i;
for (i = 0;i < list->n;i++) {
IC_ITEM* item = listRead(list,i);
if (!strcmp(item->szcontent,sz)) return TRUE;
}
return FALSE;
}
static void mylistAdd(LIST* list,mchar* sz,NPARA npara,BOOL fReferFile)
{
IC_ITEM* item = zmalloc(sizeof(IC_ITEM));
sstrcpy(item->szcontent,sz);
item->npara = npara;
item->fReferFile = fReferFile;
listAdd(list,item);listDispAll(list);
}
static int SearchTextDic(COMPLETECONTEXT* context,TX* text,SEARCHMODE mode,BOOL fReferFile)
{
if (txSearchEx(text,context->szTarget,SEARCH_NOSENSECASE|mode)) {
mchar szPara[CCHPATHNAME];
if (_fSearchTextPara) {
mchar*p = szPara;
txGetParaEx(text,szPara,cchof(szPara));
// 行頭のスペースを削除
while(1) {
if (isspace(*p)) {
p++;
} else if (*p == '/' && p[1] == '/') {
p += 2;
} else {
break;
}
}
mylistAdd(context->list,p,text->npara,fReferFile);
return TRUE;
} else {
int lch = strlen(context->szTarget);
IFILE adr = txGetAddress(text);
txJumpWordTopMi(text);
txSelectEx(text,CLIP_CHAR);
txJumpWordEndMi(text);
txGetWordEx(text,szPara,cchof(szPara));
txJumpAddress(text,adr);
if (_fCompleteWring && strnicmp(szPara,context->szTarget,lch)) {
// 絞り込みの場合で、単語頭が一致しない場合
} else {
if (!mylistFind(context->list,szPara)) {
mylistAdd(context->list,szPara,text->npara,fReferFile);
return TRUE;
}
}
}
return FALSE;
}
return -1;
}
static void GetTextDic(COMPLETECONTEXT* context,TX* text,BOOL fReferFile)
{
txFlushSelectNow(text);
{
BOOL fSelect = text->fClip;
IFILE cliptopnow = text->cliptopnow;
IFILE adr = txGetAddress(text);
int n = 0;
int ly = text->ly;
txSetUndisp(text);
text->fUndispSelect++; //WZ4.00Aa 990108
if (!_fSearchTextPara) {
// 単語取得の場合は、2つ、カーソル位置の近くで補完をする
SearchTextDic(context,text,SEARCH_PREV,fReferFile);
SearchTextDic(context,text,SEARCH_PREV,fReferFile);
SearchTextDic(context,text,SEARCH_PREV,fReferFile);
}
txJumpFileTop(text);
{
while(1) {
int ret = SearchTextDic(context,text,0,fReferFile);
if (GetAsyncKeyState(VK_ESCAPE) < 0) {//3.00B1 970522 入力支援:検索に時間がかかるときは{Esc}で中止できるようにした
SetDlgItemText(context->hwnd,IDD_GUIDE,"(中止しました)");
context->fCanceled = TRUE;
break;
}
if (ret == TRUE) {
n++;
if (n > 20) {
//あまり多いときは途中でやめないと遅い
SetDlgItemText(context->hwnd,IDD_GUIDE,"(マッチ数が多いので省略しました)");
break;
}
} else if (ret == -1) {
break;
}
}
}
text->fUndispSelect--; //WZ4.00Aa 990108
if (fSelect) {
txJumpAddress(text,cliptopnow);
txSetLy(text,ly);
txSelectEx(text,CLIP_CHAR);
text->fClipMouse = TRUE;
} else {
txSelectQuit(text);
txJumpAddress(text,adr);
txSetLy(text,ly);
}
txSetDispEx(text);
}
}
static void makeCompleteFormText(LIST* list,TX* text,mchar* szTarget)
{
SEARCHMODE mode = _fCompleteWring ? SEARCH_PARATOP : 0;
while(1) {
if (txSearchEx(text,szTarget,mode|SEARCH_NOSENSECASE|SEARCH_CUR)) {
mchar sz[CCHWORD];
txGetParaEx(text,sz,CCHWORD);
if (!mylistFind(list,sz)) {
mylistAdd(list,sz,0,FALSE);
}
txNextPara(text);
} else {
break;
}
}
}
static void makeCompleteFormStrblk(LIST* list,HSTRBLK sb,mchar* szTarget)
{
int n = sbGetCount(sb);
sbSetSenseCase(sb,FALSE);
for (;n--;) {
mchar* sz = sbRead(sb,n);
mchar* p;
if (p = stristr(sz,szTarget)) {
if (_fCompleteWring && p != sz) {
} else {
if (!mylistFind(list,sz)) {
mylistAdd(list,sz,0,FALSE);
}
}
}
}
}
static void completeOnSelchange(COMPLETECONTEXT* context)
{
LIST* list = context->list;
IC_ITEM* item = listReadCur(list);
TX* text = context->textPreview;
if (item && text) {
txSetUndisp(text);
txDeleteText(text);
if (_fSearchTextPara && item->npara) {
TX* textSrc = context->text;
mchar szpara[CCHPATHNAME];
if (item->fReferFile) {
textSrc = textopen(p_szCompleteFile);
}
txSetUndispEx(textSrc);
txJumpNpara(textSrc,item->npara);
txGetParaEx(textSrc,szpara,cchof(szpara));
txSetDispEx(textSrc);
if (item->fReferFile) textclose(textSrc);
//
txInsert(text,szpara);
txJumpFileTop(text);
txSearchEx(text,context->szTarget,SEARCH_CUR|SEARCH_SELECT|SEARCH_NOSENSECASE);
txJumpWordTop(text);
txSelectEx(text,CLIP_CHAR);
txJumpWordEnd(text);
} else {
txInsert(text,item->szcontent);
}
txSetDisp(text);
EnableWindow(GetDlgItem(context->hwnd,IDD_JUMP),(item->npara && !item->fReferFile));
}
}
static void completeFlush(HWND hwnd,int idd)
{
HDIALOG hd = dialogFromHwnd(hwnd);
COMPLETECONTEXT* context = dialogGetCustdata(hd);
context->fFlushListing++;
listDelAll(context->list);listDispAll(context->list);
{// タブ等は除く
mchar* dst = context->szTarget;
mchar* src = context->szTarget;
while(1) {
mchar c = *src++;
if (c == 0) break;
if (tbiskanji(c) && *src) {
*dst++ = c;
*dst++ = *src++;
} else if (c > ' ') {
*dst++ = c;
}
}
*dst = 0;
}
if (context->szTarget[0]) {
SetDlgItemText(hwnd,IDD_GUIDE,"");
if (!_fSearchTextPara) {
// [1]補完ヒストリから検索
makeCompleteFormStrblk(context->list,context->sb,context->szTarget);
// [2]キーワードから検索 //WZ4.00Aa 990108 renew
if (context->text->keyword) {
TX* text = txGetKeywordText(context->text);
txJumpFileTop(text);
makeCompleteFormText(context->list,text,context->szTarget);
txJumpFileTop(text);
}
// [3]complete.dicから検索
{
mchar szfilename[CCHPATHNAME];
TX* text = textopen(pathFullConfig(szfilename,"complete.dic"));
makeCompleteFormText(context->list,text,context->szTarget);
textclose(text);
}
// [4]検索ヒストリから検索
if (_fSearchHistSearch) {
makeCompleteFormStrblk(context->list,sbFromHist(HIST_SEARCH),context->szTarget);
}
}
// [5]テキストから検索
if (_fSearchText) {
GetTextDic(context,context->text,FALSE);
}
if (p_szCompleteFile[0]) {//3.00B1 970522
TX* text = textopen(p_szCompleteFile);
GetTextDic(context,text,TRUE);
textclose(text);
}
}
context->fFlushListing--;
//
if (context->list) {
LIST* list = context->list;
completeOnSelchange(context);
if (list->n && idd != IDD_TARGET) SetFocus(list->hwnd);
}
}
BOOL CALLBACK dlgprocComplete(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//WZ4.00Bl 990915 補完対象文字を変更しなかったときは入力支援後削除する機能が働いていなかったので修正。
HDIALOG hd = dialogFromHwnd(hwnd);
COMPLETECONTEXT* context = dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
context->hwnd = hwnd;
context->list = listFromHwnd(GetDlgItem(hwnd,IDD_LIST));
{
LIST* list = context->list;
IC_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.szcontent - (LPBYTE)&item;
atr->cx = -1;
atr++;
list->nSubitem = atr - &list->tSubitem[0];
}
//
myPostMessage(hwnd,WM_TXUSER,0,0);
// フォーカス順序をリストボックスをテキストボックスの直後にする
SetWindowPos(GetDlgItem(hwnd,IDD_LISTCAPTION),GetDlgItem(hwnd,IDD_TARGET),0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
SetWindowPos(GetDlgItem(hwnd,IDD_LIST),GetDlgItem(hwnd,IDD_LISTCAPTION),0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
//
context->textPreview = WzBox_GetTx(GetDlgItem(hwnd,IDD_LIST_PREVIEW));
{
TX* text = context->textPreview;
if (text) {
text->fScrollBarH = TRUE;
text->fScrollBarV = TRUE;
text->fDispLine = FALSE;
text->dlgcode = DLGC_WANTARROWS;
text->fNoCursor = TRUE;
txFlush(text);
}
}
//WZ4.00Bl 990915
context->fDialogWriting++;
dialogWriteItem(hd,-1);
context->fDialogWriting--;
SetTimer(hwnd,IDTIMER_COMPLETE,500,NULL);
//WZ4.00Bl 990915 入力支援で「補完対象」に文字を追加できるように、選択しないようにした。ユーザ要望。
{
HWND hctrl = GetDlgItem(hwnd,IDD_TARGET);
int lch = Edit_GetTextLength(hctrl);
Edit_SetSel(hctrl,lch,lch);
}
return INITDIALOG_SKIP_FALSE;
}
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) {
completeOnSelchange(context);
} else if (notify->hdr.code == LISTN_FORWARD && notify->message == WM_LBUTTONDBLCLK) {
PostMessage(hwnd,WM_COMMAND,IDOK,0);
return FALSE;
}
}
break;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
int notify = GET_WM_COMMAND_CMD(wParam,lParam);
switch(id) {
case IDCANCEL: {//3.00B1 970522
if (context->fCanceled) {
context->fCanceled = FALSE;
return TRUE;
}
break;
}
case IDOK: {
LIST* list = context->list;
IC_ITEM* item = listReadCur(list);
if (item) {
TX* text = context->text;
if (!context->fEdit) {
// 補完文字列が変化してなければ...
txSelectDelete(text);
}
if (_fSearchTextPara) {
TX* textSrc = context->textPreview;
if (textSrc) {
if (textSrc->fClip) {
txPrivatePush(textSrc);
txPrivatePaste(text);
txPrivateDeleteTop(textSrc);
} else {
txInsertText(text,textSrc);
}
}
} else {
txInsert(text,item->szcontent);
sbAddHist(context->sb,item->szcontent); // 補完ヒストリに追加
}
}
break;
}
case IDD_TARGET: {
if (notify == EN_UPDATE && !context->fDialogWriting) {
context->fEdit = TRUE;
SetTimer(hwnd,IDTIMER_COMPLETE,500,NULL);
}
break;
}
case IDD_TOP_PREV: {
TX* text = context->textPreview;
if (text) {
FlushSelect(text,TRUE);
txLeftWordMi(text);
}
break;
}
case IDD_TOP_NEXT: {
TX* text = context->textPreview;
if (text) {
FlushSelect(text,TRUE);
txRightWordMi(text);
}
break;
}
case IDD_END_PREV: {
TX* text = context->textPreview;
if (text) {
FlushSelect(text,FALSE);
txLeftWordMi(text);
}
break;
}
case IDD_END_NEXT: {
TX* text = context->textPreview;
if (text) {
FlushSelect(text,FALSE);
txRightWordMi(text);
}
break;
}
case IDD_ALL: {//3.00B1 970522
TX* text = context->textPreview;
if (text) txSelectAll(text);
break;
}
case IDD_REFERTEXTFILE: {//3.00B1 970522
if (notify == EN_CHANGE) {
myPostMessage(hwnd,WM_TXUSER,id,0);
}
break;
}
case IDD_WRING:
case IDD_TEXT:
case IDD_TEXTPARA:
case IDD_TEXTPARA+1:
case IDD_HISTSEARCH: {
myPostMessage(hwnd,WM_TXUSER,id,0);
break;
}
case IDD_JUMP: {
LIST* list = context->list;
IC_ITEM* item = listReadCur(list);
if (item && item->npara && !item->fReferFile) {
TX* text = context->text;
txSetUndisp(text);
txSelectQuit(text);
txJumpNpara(text,item->npara);
txSetDisp(text);
return FALSE;
}
return TRUE;
}
case IDD_ADDDIC: {
LIST* list = context->list;
IC_ITEM* item = listReadCur(list);
if (item) {
uiCompleteAddDic(item->szcontent);
} else {
mchar buff[CCHWORD];
GetDlgItemText(hwnd,IDD_TARGET,buff,cchof(buff));
uiCompleteAddDic(buff);
}
return TRUE;
}
}
return FALSE;
}
case WM_DESTROY: {
KillTimer(hwnd,IDTIMER_COMPLETE);
break;
}
case WM_TIMER: {
KillTimer(hwnd,IDTIMER_COMPLETE);
myPostMessage(hwnd,WM_TXUSER,IDD_TARGET,0);
break;
}
case WM_TXUSER: {
// WM_COMMANDが残っている場合は処理しない。高速化
{
MSG msg;
if (PeekMessage(&msg,hwnd,WM_COMMAND,WM_COMMAND,PM_NOREMOVE)) {
myPostMessage(hwnd,WM_TXUSER,wParam,0);
return FALSE;
}
}
//
dialogRead(hd);
EnableWindow(GetDlgItem(hwnd,IDD_TEXTPARA),(_fSearchText||p_szCompleteFile[0]));
EnableWindow(GetDlgItem(hwnd,IDD_HISTSEARCH),!_fSearchTextPara);
EnableWindow(GetDlgItem(hwnd,IDD_WRING),!_fSearchTextPara);
EnableWindow(GetDlgItem(hwnd,IDD_TOP_PREV),_fSearchTextPara);
EnableWindow(GetDlgItem(hwnd,IDD_TOP_NEXT),_fSearchTextPara);
EnableWindow(GetDlgItem(hwnd,IDD_END_PREV),_fSearchTextPara);
EnableWindow(GetDlgItem(hwnd,IDD_END_NEXT),_fSearchTextPara);
//
switch(wParam) {
case IDD_LIST: break;
default: {
completeFlush(hwnd,wParam);
break;
}
}
break;
}
}
return FALSE;
}
BOOL txIDM_UICOMPLETE(TX* text)
{
// 入力支援
//{#MS} {F4}
HDIALOG hd = dialog("入力支援");
static mchar _szCompleteFileHist[] = "completeRefer";
HSTRBLK sbFile = historyOpen(_szCompleteFileHist,2048);
HSTRBLK sb = historyOpen(_szCompleteHist,SIZE_COMPLETEHIST);
COMPLETECONTEXT context;
DTRECT rCmd;
DTRECT r;
int lxg = 16;
int lx = 20;
//
uicompleteConfigLoad();
//
structClear(context);
context.text = text;
context.sb = sb;
if (text->fClip) {
txGetWordEx(text,context.szTarget,CCHWORD);
text->fClipMouse = TRUE;
} else {
if (!txIsCurParaTop(text)) {
txSelectEx(text,CLIP_CHAR);
text->fClipMouse = TRUE;
txLeftWordMi(text);
txGetWordEx(text,context.szTarget,CCHWORD);
}
}
if (context.szTarget[0] <= ' ') {
// 空白や改行なら、補完対象文字列はなしとする
context.szTarget[0] = 0;
context.fEdit = TRUE;
txSelectQuit(text);
}
//
dialogSetDlgproc(hd,dlgprocComplete);
dialogSetCustdata(hd,&context);
dialogControlID(hd,IDD_TARGET);
dialogString(hd,"補完対象(&S):",lxg,context.szTarget,CCHWORD,lx);
dialogControlID(hd,IDD_LISTCAPTION);
dialogCaptionDynamic(hd,"補完候補(&I):",20);
//
dialogGetPos(hd,&r);
r.cx = DTCX * 60;
r.cy = DTCY * 9;
// listRegister(); //WZ4.00Ca 991128
__dialogAddItem(hd,szclassList,NULL,IDD_LIST,&r,WS_GROUP|WS_TABSTOP|WS_BORDER|WS_CHILD|WS_VISIBLE|LIST_WS_DEFAULT);
dialogSetPosY(hd,r.y + r.cy);
//
dialogControlID(hd,IDD_GUIDE);
dialogCaptionDynamic(hd,NULL,40);
dialogLFV(hd);
dialogGetPos(hd,&rCmd);
dialogLF(hd);
dialogGetPos(hd,&r);
r.cx = DTCX * 60;
r.cy = DTCY * 4;
__dialogAddItem(hd,TXWS_SZCLASSA,"",IDD_LIST_PREVIEW,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL);
r.y += r.cy + DTCYINT;
dialogSetPos(hd,&r);
dialogSetH(hd);
dialogControlID(hd,IDD_TOP_PREV);
dialogPushbutton(hd,"&<",10);
dialogControlID(hd,IDD_TOP_NEXT);
dialogPushbutton(hd,"> &K",10);
//3.00B1 970522
dialogIndent(hd,3);
dialogControlID(hd,IDD_ALL);
dialogPushbutton(hd,"全て(&A)",10);
//
dialogSetPosLX(hd,60 - 21);
dialogControlID(hd,IDD_END_PREV);
dialogPushbutton(hd,"< &L",10);
dialogControlID(hd,IDD_END_NEXT);
dialogPushbutton(hd,"&>",10);
dialogSetV(hd);
dialogLF(hd);
dialogSpaceV(hd);
dialogControlHist(hd,sbFile);
dialogControlRefer(hd,"");
dialogControlHelp(hd,511);
dialogControlID(hd,IDD_REFERTEXTFILE);
dialogString(hd,"参照ファイル(&F):",16,p_szCompleteFile,CCHPATHNAME,33);
//
dialogLFV(hd);
dialogSetPos(hd,&rCmd);dialogIndent(hd,1);
dialogOK(hd,21);
dialogCancel(hd,21);
dialogSpaceV(hd);
//
dialogControlID(hd,IDD_ADDDIC);
dialogCmd(hd,"辞書に追加(&D)...",21);
dialogControlID(hd,IDD_JUMP);
dialogCmd(hd,"ジャンプ(&J)",21);
dialogSpaceV(hd);
dialogControlID(hd,IDD_TEXT);
dialogCheck(hd,"テキストも検索(&T)",&_fSearchText);
//2.98 970309 入力支援:「段落の取得」復活
// 常用はしないけど、さっき入力したところをもう一度という無計画なとこが、
// 元の入力支援のいいとこだったと思うんです(kitamakuraさん)。
dialogIndent(hd,2);
dialogControlRadioV(hd);
dialogControlID(hd,IDD_TEXTPARA);
dialogCheck(hd,"段落取得(&P)",&_fSearchTextPara);
dialogIndent(hd,-2);
dialogControlID(hd,IDD_HISTSEARCH);
dialogCheck(hd,"検索ヒストリも検索(&H)",&_fSearchHistSearch);
dialogControlID(hd,IDD_WRING);
dialogCheck(hd,"絞り込み(&R)",&_fCompleteWring);
//
dialogOpen(hd);
//
historyClose(_szCompleteFileHist,sbFile);
historyClose(_szCompleteHist,sb);
uicompleteConfigSave();
return TRUE;
}
#endif // !WINDOWSCE
//##ソート
enum {
IDD_SORTMODE=100,
IDD_SORTCLM=110,
};
static BYTE _sortmode;
static BYTE _sortclm = 1;
static BBOOL _fSortPrev;
static BBOOL _fSortNoSenseCase; //WZ4.00Bn 991006
BOOL CALLBACK dlgprocSort(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
switch(message) {
case WM_INITDIALOG: {
PostMessage(hwnd,WM_TXUSER,0,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_SORTMODE:
case IDD_SORTMODE+1:
case IDD_SORTMODE+2: {
PostMessage(hwnd,WM_TXUSER,0,0);
break;
}
}
break;
}
case WM_TXUSER: {
dialogRead(hd);
EnableDlgItem(hwnd,IDD_SORTCLM,(_sortmode != 0));
break;
}
}
return FALSE;
}
BOOL txIDM_UISORT(TX* text)
{
HDIALOG hd = dialog("ソート");
BOOL fArea = (text->fClip && !txIsClipInPara(text));
//
dialogSetDlgproc(hd,dlgprocSort);
//
dialogControlRadioV(hd);
dialogControlID(hd,IDD_SORTMODE);
dialogChoiceRadioB(hd,&_sortmode,"行でソート(&L)","タブ区切り(&T)"/*,"カンマ区切り(&C)"*/,NULL);
if (!_pspc) dialogLFV(hd);
// dialogSetPosY(hd,dialogGetPosY(hd) + DTCY);
dialogControlID(hd,IDD_SORTCLM);
dialogControlGuide(hd,"番目の項目でソート",20);
dialogControlUpdown(hd,1,20); //WZ4.00Ea 001127
dialogIntegerB(hd,NULL,0,&_sortclm,6);
dialogLF(hd);
dialogSpaceV(hd);dialogSpaceV(hd);
dialogCheckB(hd,"逆順(&P)",&_fSortPrev);
dialogControlReverseBool(hd);
dialogCheckB(hd,"大文字と小文字を区別(&C)",&_fSortNoSenseCase); //WZ4.00Bn 991006 IDM_UISORTに「大文字と小文字を区別」するかどうかのオプションを追加。
dialogControlEnable(hd,fArea);
dialogCheck(hd,"範囲内をソート(&B)",&fArea);
//
if (dialogOpen(hd)) {
SORTARG arg;
structClear(arg);
arg.sizeStruct = sizeof(arg);
arg.fBack = _fSortPrev;
arg.fNoSenseCase = _fSortNoSenseCase;
if (_sortmode) {
arg.iItem = (_sortclm > 0) ? _sortclm - 1 : 0;
arg.fCsv = 1;
}
txSetUndisp(text);
{
int ly0 = text->ly;
if (fArea) {
IFILE adrTop = txGetAddressSelectTop(text);
IFILE adrEnd = txGetAddressSelectEnd(text);
int lineEnd;
if (!txSelectGetPrev(text)) ly0 = text->lyClip;
txSelectQuit(text);
txJumpAddress(text,adrEnd);arg.lineEnd = lineEnd = text->npara;
if (txIsCurParaTop(text) && arg.lineEnd >= 2) arg.lineEnd--; //WZ4.00Bn 991006 行単位で範囲選択し、範囲内のソートをすると1行余計にソートされたのを修正。
txJumpAddress(text,adrTop);arg.lineTop = text->npara;
txSort(text,&arg);
txJumpNpara(text,lineEnd);txSelectEx(text,CLIP_MOUSE);
txJumpNpara(text,arg.lineTop);
} else {
NPARA npara = text->npara;
arg.nparaCur = npara;
txSort(text,&arg);
txJumpNpara(text,arg.nparaCur);
}
txSetLy(text,ly0);
}
txSetDisp(text);
}
return TRUE;
}
//##IME
#if !__TXC__
void TXAPI txSwitchIme(TX* text)
{
//WCE0.91 970908 IMEをON/OFFするコマンドを新設
wndImeSetOpen(text->hwndtext,!wndImeGetOpen(text->hwndtext));
}
#endif
#if WINDOWSCE
//WCE1.01 980320 for 単語登録
#if !WINDOWSCE211 //WZ4.00Be 990405
typedef struct {
LPWSTR lpReading;
LPWSTR lpWord;
} REGISTERWORD;
#endif
BOOL WINAPI ImmConfigureIMEW(LPVOID,HWND,DWORD,LPVOID);
// dialog mode of ImmConfigureIME
#define IME_CONFIG_GENERAL 1
#define IME_CONFIG_REGISTERWORD 2
#define IME_CONFIG_SELECTDICTIONARY 3
#endif
#if !__TXC__
BOOL _txIDM_UIIMEREGISTERWORD(TX* text,HWND hwndParent)
{
// 単語登録を行う。text=NULLも可能
#if UNIX
return FALSE;
#else
#ifdef UNICODE
if (_pspc) {
information("PsPC/PocketPCでは利用できません"); //WZ4.00Ea 001126
return FALSE;
} else {
wchar wszbuff[CCHWORD] = {0};
wchar wszReading[CCHWORD] = {0};
REGISTERWORD regword;
structClear(regword);
if (text && txIsClipInPara(text)) {
mchar szbuff[CCHWORD];
txGetWordEx(text,szbuff,sizeof(szbuff));
strtowstr(szbuff,-1,wszbuff,wcchof(wszbuff));
}
regword.lpReading = wszReading;
regword.lpWord = wszbuff;
ImmConfigureIMEW(NULL,hwndParent,IME_CONFIG_REGISTERWORD,®word);
return TRUE;
}
#else
mchar szbuff[CCHWORD] = {0};
mchar szReading[CCHWORD] = {0};
REGISTERWORD regword;
structClear(regword);
if (text && txIsClipInPara(text)) {
txGetWordEx(text,szbuff,sizeof(szbuff));
}
regword.lpReading = szReading;
regword.lpWord = szbuff;
ImmConfigureIME(GetKeyboardLayout(0),hwndParent,IME_CONFIG_REGISTERWORD,®word);
return TRUE;
#endif
#endif
}
#endif // !__TXC__
#if !UNIX && !__TXC__
BOOL TXAPI txuiImeConvert(TX* text)
{
//WCE0.91 970908 「最近、IMEで確定した文字列の再変換」コマンドを新設
#if !WINDOWSCE
if (text->fClip) { //WZ3.90I 981028 IME98を使って再変換ができるようにした。
TX* text2 = textopen(NULL);
txInsertTextSelect(text2,text);
txJumpFileTop(text2);
{
wchar* wsz = wstrdupLenA(text2->buff + text2->cur,txGetTextSize(text2));
BSTR bstr = ime98GetPhonetic(wsz);
if (bstr) {
//winformation((wchar*)bstr);
text->fClipMouse = TRUE;
wndImeSetOpen(text->hwndtext,TRUE);//WCE0.92 970919 IMEが閉じてるときダメだった
{
HIMC himc = ImmGetContext(text->hwndtext);
mchar* sz = strdupW(bstr);
ImmSetCompositionString(himc,SCS_SETSTR,sz,strlensize(sz),NULL,0);
free(sz);
ImmReleaseContext(text->hwndtext,himc);
}
SysFreeString(bstr);
}
free(wsz);
}
textclose(text2);
return TRUE;
}
#endif
return (BOOL)dialogaSelHistEx("最近、IMEで確定した文字列の再変換",HIST_IME,SELHIST_IMECONVERT,text);
}
#endif
//##各種挿入
BOOL txIDM_UIINSERTCONTROL(TX* text)
{
// コントロールコードを挿入
TX* textDst = text;
BOOL ret = FALSE;
{
TX* text = textopen(NULL);
if (text) {
HDIALOG hd = dialog("制御文字の入力");
int idList;
{
int i;
for (i = 0;i <= 0x1B;i++) {
mchar szbuff[CCHWORD];
if (i == 0x0A) continue;//0x0Aは入力できない
sprintf(szbuff,"%c: Ctrl-%c",i+'@',i+'@');
txInsert(text,szbuff);
txInsertReturn(text);
}
txJumpFileTop(text);
}
idList = dialogList(hd,NULL,text,20,10);
dialogSetNotifyAsOK(hd,idList,LBN_DBLCLK);//WCE0.95 970923
if (dialogOpen(hd)) {
int code = text->npara;
code--;
if (code >= 0x0A) code++;
txInsertChar(textDst,code);
ret = TRUE;
}
}
textclose(text);
}
return ret;
}
static int strGetIch(mchar* sz,int offset)
{
// szのoffset目の文字が先頭から何文字目か返す
mchar* pe = sz + offset;
int ich = 0;
while(sz < pe) {
mchar c = *sz;
if (tbiskanji(c)) {
sz += tbkanjisize(sz);
ich++;
} else if (c) {
sz++;
ich++;
} else break;
}
return ich;
}
static mchar* strGetIchStr(mchar* sz,int ich)
{
// szのich目の文字列のポインタを返す
// ichが大きすぎるときはszの\0へのポインタを返す
while(ich) {
mchar c = *sz;
if (tbiskanji(c)) {
sz += tbkanjisize(sz);
ich--;
} else if (c) {
sz++;
ich--;
} else break;
}
return sz;
}
static UINT _txInsertBrace(TX* text,UINT index)
{
//WCE0.91 970909 半角括弧対応
//WZ3.90I 981023 “”と‘’を追加。
static mchar szkakko[] = "()[]「」〔〕『』【】《》“”‘’()[]{}「」";
TXCHAR ch = txGetChar(text);
mchar *p = strchr(szkakko,ch);
txSetUndispSilent(text);
if (p) {
index = strGetIch(szkakko,p - szkakko);
if ((index & 1) == 1) {
txDeletePrev(text);
txDeleteChar(text);
index++;
}
}
//
p = strGetIchStr(szkakko,index);
if (*p == 0) {
p = szkakko;
index = 0;
}
{
mchar* pe = strGetIchStr(szkakko,index + 2);
txInsertBuff(text,p,pe-p);
txLeft(text);
}
txSetDispSilent(text);
return index;
}
#if !__TXC__
void TXAPI txInsertBrace(TX* text)
{
// 全角括弧挿入(学習つき)
// 全角括弧のペアを挿入後、カーソルを括弧の中にセット
// 連続して実行すると、いくつかの種類の括弧をトグル切り替え
// 最後に挿入したペアを覚えていて、次挿入するときは、そのペアを挿入します。
//{#MS} +^K
//{#MI} +^K
//{#VZ} ^]
//3.00A3 970507 new
if (text->fClip && txIsClipInPara(text)) {
//WCE0.91 970909 範囲選択対応
mchar sz[CCHLINE];
int lch = txGetWordEx(text,sz,cchof(sz));
if (lch + 1 < cchof(sz)) { // 文字列が失われる場合は実行しない
txSetUndispSilent(text);
txSelectDelete(text);
sh->edit_iInsertBrace = _txInsertBrace(text,sh->edit_iInsertBrace);
txCurInsertBuff(text,sz,lch);
txSelectEx(text,CLIP_CHAR);
text->fClipMouse = TRUE;
txRightBytes(text,lch);
txSetDispSilent(text);
}
} else {
sh->edit_iInsertBrace = _txInsertBrace(text,sh->edit_iInsertBrace);
}
}
#endif // !__TXC__
BOOL txIDM_UIINSERTSEARCH(TX* text)
{
mchar* sz = dialogaSelHist("最近、検索した文字列の挿入",HIST_SEARCH);
if (sz) {
txInsertAtKeisen(text,sz); //WZ3.90E 980812
return TRUE;
}
return FALSE;
}
BOOL txIDM_UIINSERTCOPY(TX* text)
{
mchar* sz = dialogaSelHist("最近、コピーした文字列の挿入",HIST_COPY);
if (sz) {
txInsertAtKeisen(text,sz); //WZ3.90E 980812
return TRUE;
}
return FALSE;
}
BOOL txIDM_UIINSERTSTR(TX* text)
{
mchar* sz = dialogaSelHist("最近、入力した文字列の挿入",HIST_STR);
if (sz) {
txInsertAtKeisen(text,sz); //WZ3.90E 980812
return TRUE;
}
return FALSE;
}
#if WZFUNC_HTMLHIGH && !__TXC__
BOOL txIDM_UIINSERTFILENAME(TX* text)
{
mchar szfilename[CCHPATHNAME] = {0};
if (txuiGetOpenFileNameHtml(text,szfilename,"*.*")) {
pathFlushSepa(szfilename,'\\');
txInsertChar(text,'"');txInsert(text,szfilename);txInsertChar(text,'"');
return TRUE;
}
return FALSE;
}
#endif
//##慣用句の挿入
//WZ3.90H 980910 汎用化
#if !__TXC__
typedef struct {
TX* textTarget;
TX* textContent;
TX* textDest;
mchar szHeadline[CCHWORD];
WORD fSearchlist:1; //WZ3.90H 980910
//WZ3.90H 980910
SEARCH_PACKET search;
SEARCHOPT opt;
LIST* list;
} INSERTTEMPLATE;
static void inserttemplateOnChange(HWND hwnd,INSERTTEMPLATE* context,BOOL fEnable)
{
HDIALOG hd = dialogFromHwnd(hwnd);
if (context->fSearchlist) {
#if !WINDOWSCE
SetDlgItemText_A(hwnd,IDD_SBLIST_SET,fEnable ? "<-名前の変更(&0)" : "<-変更(&0)");
#endif
} else {
if (_pspc) {
SetDlgItemText_A(hwnd,IDD_SBLIST_SET,fEnable ? "<-名前変更" : "<-変更");
} else {
SetDlgItemText_A(hwnd,IDD_SBLIST_SET,fEnable ? "<-名前の変更(&E)" : "<-変更(&E)");
}
}
EnableDlgItem(hwnd,IDD_SBLIST_SET,!!context->list->n); //WZ4.00Bn 991005
EnableDlgItem(hwnd,IDD_SBLIST_ADD,!fEnable);
EnableDlgItem(hwnd,IDD_SBLIST_ADDCHILD,!fEnable);
EnableWindow(context->textContent->hwndtext,!fEnable);
#if !WINDOWSCE
if (context->fSearchlist) {
BOOL f = !fEnable;
TX* text = context->textContent;
dialogRead(hd);
txMsghdrGetString(text,"Search:",NULL,context->search.szfind,cchof(context->search.szfind));
txMsghdrGetString(text,"Replace:",NULL,context->search.szreplace,cchof(context->search.szreplace));
{
mchar sz[CCHWORD] = {0};
txMsghdrGetString(text,"Searchmode:",NULL,sz,cchof(sz));
context->opt.fRe = !!re(sz,"<RE>");
context->opt.fWord = !!re(sz,"<WORD>");
context->opt.fSenseCase = !!re(sz,"<SENSECASE>");
context->opt.fSearchNoSymbol = !!re(sz,"<SEARCHNOSYMBOL>");
context->opt.fNoEsc = !!re(sz,"<NOESC>"); //WZ4.00Bo 991011 検索スタイルで「\を通常文字として検索」も記憶するようにした。
context->opt.fFuzzy = !!re(sz,"<FUZZY>");
context->opt.fReplaceConfirm = !!re(sz,"<REPLACECONFIRM>");
#if SEARCHOPT_DIALOG_NEW //WZ3.90L 981123
searchoptSetupMode(&context->opt);
#endif
//information("%s %d",sz,context->opt.fWord);
}
dialogWrite(hd);
EnableDlgItem(hwnd,IDD_SEARCH,f);
EnableDlgItem(hwnd,IDD_REPLACE,f);
EnableDlgItem(hwnd,IDD_WORD,f);
EnableDlgItem(hwnd,IDD_SENSECASE,f);
EnableDlgItem(hwnd,IDD_NOSYMBOL,f);
EnableDlgItem(hwnd,IDD_RE,f);
EnableDlgItem(hwnd,IDD_FUZZY,f);
EnableDlgItem(hwnd,IDD_REPLACECONFIRM,f);
PostMessage(hwnd,WM_TXUSER+1,0,0);
}
#endif
}
#if !WINDOWSCE
static void inserttemplateOnSet(HWND hwnd,INSERTTEMPLATE* context)
{
HDIALOG hd = dialogFromHwnd(hwnd);
if (context->fSearchlist) {
TX* text = context->textContent;
dialogRead(hd);
txMsghdrSet(text,"Search:",context->search.szfind);
txMsghdrSet(text,"Replace:",context->search.szreplace);
#if SEARCHOPT_DIALOG_NEW //WZ3.90L 981123
searchoptToSearchmode(&context->opt); // for set opt.fRe etc
#endif
{
mchar sz[CCHWORD] = {0};
if (context->opt.fRe) sstrcat(sz,"RE|");
if (context->opt.fWord) sstrcat(sz,"WORD|");
if (context->opt.fSenseCase) sstrcat(sz,"SENSECASE|");
if (context->opt.fSearchNoSymbol) sstrcat(sz,"SEARCHNOSYMBOL|");
if (context->opt.fNoEsc) sstrcat(sz,"NOESC|");//WZ4.00Bo 991011
if (context->opt.fFuzzy) sstrcat(sz,"FUZZY|");
if (context->opt.fReplaceConfirm) sstrcat(sz,"REPLACECONFIRM|");
txMsghdrSet(text,"Searchmode:",sz);
//information(sz);
}
}
}
#else
#define inserttemplateOnSet(hwnd,context)
#endif
BOOL CALLBACK dlgprocInsertTemplate(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
INSERTTEMPLATE* context = dialogGetCustdata(hd);
HWND hwndOutline = GetDlgItem(hwnd,IDD_OUTLINE_TREE);
// OUTLINECONTROL* outline = outlineGetContext(hwndOutline);
LIST* list = context->list;
switch(message) {
case WM_INITDIALOG: {
context->list = list = listTvNew();
list->hwnd = hwndOutline;
list->text = context->textTarget;
list->iHeadlineMin = 1;
olFlush(list);
listJump(list,sh->nparaTemplateTarget);
listTvDispAll(list);
if (list->n == 0) inserttemplateOnChange(hwnd,context,0); //WZ4.00Bn 991005
//
PostMessage(hwnd,WM_TXUSER+1,0,0);
return INITDIALOG_SKIP_TRUE;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
switch(id) {
case IDOK: {
olSaveEdited(list,FALSE);
if (context->fSearchlist) {
} else {
TX* text = context->textContent;
TX* textDst = context->textDest;
if (txGetTextSize(text)) {
txSelectOverwriteModal(textDst); //WZ3.90O 981203
txJumpParaTop(textDst);
if (1) { // "<>"に対応
if (txSearchEx(text,"<>",0)) {
IFILE adr = txGetAddress(textDst);
txSetUndisp(textDst);
txInsertText(textDst,text);
txJumpAddressNear(textDst,adr);
if (txSearchEx(textDst,"<>",0)) {
txDeleteChar(textDst);
txDeleteChar(textDst);
}
txSetDisp(textDst);
} else {
txInsertText(textDst,text);
}
} else {
txInsertText(textDst,text);
}
} else {
// 「内容」が空のときは「名前」を文字列として挿入
mchar* sz = GetWindowTextAlloc_A(GetDlgItem(hwnd,IDD_OUTLINE_NAME));
txInsert(textDst,sz);
free(sz);
}
}
break;
}
case IDCANCEL: {
olSaveEdited(list,TRUE);
break;
}
case IDD_SBLIST_SET: {
inserttemplateOnSet(hwnd,context);
olSetText(list,context->textContent,GetDlgItem(hwnd,IDD_OUTLINE_NAME));
break;
}
case IDD_SBLIST_ADD:
case IDD_SBLIST_ADDCHILD: {
HWND hwndEdit = GetDlgItem(hwnd,IDD_OUTLINE_NAME);
mchar* sz = GetWindowTextAlloc_A(hwndEdit);
OUTLINEITEM* now = listReadCur(list);
{ //WZ4.00Bn 991005 検索スタイルが空のときに追加ができなかったのを修正。
BOOL fChild = (id == IDD_SBLIST_ADDCHILD)||(now == NULL);
int iHeadline = now ? (now->head.iHeadline + fChild) : 1;
if (check_iHeadline(iHeadline)) {
inserttemplateOnSet(hwnd,context); //WZ4.00Bj 990830 検索置換スタイルの「追加」で検索語などがセットされなかったのを修正。
olInsert(list,now,sz,iHeadline,(!fChild*OLI_INSERTPREV)|OLI_INSERTCONTENT,context->textContent);
}
}
free(sz);
break;
}
case IDD_OUTLINE_UP: olMoveUp(list);break;
case IDD_OUTLINE_DOWN: olMoveDown(list);break;
case IDD_OUTLINE_CUT: {
olCut(list);
if (list->n == 0) inserttemplateOnChange(hwnd,context,0); //WZ4.00Bn 991005
break;
}
case IDD_OUTLINE_PASTE: olPaste(list);break;
#if !WINDOWSCE //WZ4.00Bj 990830 検索置換スタイルで検索オプションボックスのEnable状態をセットするようにした。
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;
#endif
}
break;
}
case WM_DESTROY: {
sh->nparaTemplateTarget = list->iCur;
listDelete(list);
context->list = NULL; //WZ4.00Bl 990915
break;
}
case WM_NOTIFY: {
TV_DISPINFO* nm = (LPVOID)lParam;
if (list && nm->hdr.hwndFrom == list->hwnd) {
if (list->fRemaking) return 0;
switch(nm->hdr.code) {
case TVN_SELCHANGED: {
listTvGetCur(list);
olGetText(list,context->textContent,GetDlgItem(hwnd,IDD_OUTLINE_NAME));
inserttemplateOnChange(hwnd,context,listGetCurNestChilds(list));
break;
}
}
}
break;
}
case WM_TXUSER+1: {
wndSetEnableSearchOption(hwnd);
break;
}
}
return FALSE;
}
static BOOL dialogaSelectOutline(TX* text,int mode,SEARCH_PACKET* pSearch)
{
// 慣用句の挿入、検索リストなど。
//WZ3.90H 980910 renew
BOOL fSearchlist = (mode == 1);
HDIALOG hd = dialog(fSearchlist ? "検索のスタイル" : "慣用句の挿入"); //WZ3.90L 981115 "検索リスト"はWZ3の同一名称別機能とまぎらわしいので名前を変更。
wchar wszdicname[CCHPATHNAME];
TX* textTarget = textopenW(wpathFullConfig(wszdicname,fSearchlist ? L"search.dic" : L"template.dic"));
TX* textContent = textopen(NULL); // 内容
INSERTTEMPLATE context;
BOOL ret;
//
#if UNIX
kcToTBEx(textTarget,KC_SJIS);////
#endif
textTarget->fHeadlineStringStd = TRUE;//PWZ2BETA0.3 980509
structClear(context);
context.textTarget = textTarget;
context.textContent = textContent;
context.textDest = text;
context.fSearchlist = fSearchlist;
//WCE0.94 970922 慣用句のテキストウィンドウでアンドゥできるようにした
txClose(textContent);
textContent->fEnableUndo = TRUE;
txOpenText(textContent);
//
dialogSetCustdata(hd,&context);
dialogSetDlgproc(hd,dlgprocInsertTemplate);
//
dialogCaption(hd,"一覧(&L):");
{
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * 20;
r.cy = DTCY * (fSearchlist ? 13 : 9-_pspc);
__dialogAddItem(hd,WC_TREEVIEWA,NULL,IDD_OUTLINE_TREE,&r,TVS_TREELIST);
dialogSetPosY(hd,r.y + r.cy);
dialogSpaceV(hd);
}
//
dialogLFV(hd);
dialogSetPosLF(hd);
if (!_pspc) dialogSetPosY(hd,DTCY * 2);
dialogControlID(hd,IDD_SBLIST_SET);
dialogPushbutton(hd,NULL,14-_pspc*3);
#if !WINDOWSCE
if (fSearchlist) {hd->fAutoAccessKey = TRUE;hd->chAutoAccessKey = '1';}
#endif
dialogControlID(hd,IDD_SBLIST_ADD);
dialogPushbutton(hd,"<-追加(&A)",14);
dialogControlID(hd,IDD_SBLIST_ADDCHILD);
dialogPushbutton(hd,"<-子の追加(&C)",14);
dialogSpaceV(hd);
dialogSetH(hd);
dialogControlID(hd,IDD_OUTLINE_UP);
dialogPushbutton(hd,"↑(&B)",5+SFF);
dialogControlID(hd,IDD_OUTLINE_DOWN);
dialogPushbutton(hd,"↓(&N)",5+SFF);
dialogLFSetV(hd);
dialogControlID(hd,IDD_OUTLINE_CUT);
dialogPushbutton(hd,"切り取り(&T)",11+SFF*2);
dialogControlID(hd,IDD_OUTLINE_PASTE);
dialogPushbutton(hd,"貼り付け(&P)",11+SFF*2);
if (fSearchlist) hd->fAutoAccessKey = FALSE;
//
if (_pspc) {
dialogLF(hd);
dialogSetPosX(hd,DTCX);
} else {
dialogLFV(hd);
}
dialogControlID(hd,IDD_OUTLINE_NAME);
dialogString(hd,fSearchlist?"名前(&N):":"名前(&M):",7+_pspc+SFF*2,context.szHeadline,cchof(context.szHeadline),20);
dialogControlID(hd,IDD_OUTLINE_CONTENT);
if (fSearchlist) {
#if !WINDOWSCE
context.search = sh->search;
context.opt.text = text;
searchoptFromSearchmode(&context.opt,context.search.searchmode);
//
dialogSpaceV(hd);
dialogControlID(hd,IDD_SEARCH);
dialogControlHist(hd,HIST_SEARCH);
dialogString(hd,"検索(&S):",7+SFF*2,context.search.szfind,CCHWORD,20);
dialogControlID(hd,IDD_REPLACE);
dialogControlHist(hd,HIST_SEARCH);
dialogString(hd,"置換(&R):",7+SFF*2,context.search.szreplace,CCHWORD,20);
//
dialogSetPosLF(hd); //WZ3.90L 981115
dialogAddSearchopt(hd,&context.opt,2);
//
dialogEditWz(hd,NULL,textContent,0,0,0);
//WZ3.90L 981115
dialogLFV(hd);dialogSetPosY(hd,DTCY/2);dialogIndent(hd,-9);
dialogOK(hd,10);
dialogCancel(hd,10);
#endif
} else {
#if WINDOWSCE2
dialogEditWz(hd,"内容(&O):",textContent,28+_pspc*2,9-_pspc*5+_pocketpc,WS_HSCROLL|WS_VSCROLL);//WCE1.01 980312 10->9
#else
dialogEditWz(hd,"内容(&O):",textContent,28,10,WS_HSCROLL|WS_VSCROLL);
#endif
}
{//WCE0.91 970911
TX* text = textContent;
text->dlgcode = DLGC_WANTALLKEYS;
txKeyLoadFrame(text);//WCE0.91 970910 慣用句でもWZのキー定義で使いたい。使えるようにした
}
//
ret = dialogOpen(hd);
if (ret == IDOK && fSearchlist) {
#if !WINDOWSCE
*pSearch = context.search;
pSearch->searchmode = searchoptToSearchmode(&context.opt);
#endif
}
//
// sh->nparaTemplateTarget = context.nparaTarget;
textclose(textTarget);
textclose(textContent);
#if 1//XZ0.10 990625 CancelされてもTRUEが返っていた。
return !!ret;
#else
return TRUE;
#endif
}
BOOL txIDM_UIINSERTTEMPLATE(TX* text)
{
return dialogaSelectOutline(text,0,NULL);
}
#if !WINDOWSCE
BOOL txuiSearchlist(TX* text,SEARCH_PACKET* search)
{
return dialogaSelectOutline(text,1,search);
}
#endif
#endif // !__TXC__
//##日付の挿入
#define IDD_DATEINSERT 100
#define IDD_DATEFORMAT 110 // 110-119
mchar* tszYoubi[] = {"日","月","火","水","木","金","土"};
void sprintfDate(mchar szdst[CCHWORD],mchar* szDateFormat,TX* text)
{
// text:NULLでも可
static mchar* tszYoubiE[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
static mchar* tszYoubiEs[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
static mchar* tszMonthE[] = {
"January","February","March","April","May","June",
"July","August","September","October","November","December"
};
SYSTEMTIME st;
GetLocalTime(&st);
{
mchar szbuff[CCHWORD] = {0}; // 出力先
mchar* p = szDateFormat;
mchar* p0 = p;
while(1) {
mchar c = *p;
if (c == 0) break;
if (c == '%') {
// 大文字はtxVar、小文字は日時
BOOL f02d = FALSE;
mchar* szf = "%d";
mchar buff[CCHWORD] = {0};
mchar c = p[1];
int nc = 1;
if (p > p0) {
sstrcatlen(szbuff,p0,p - p0);
}
//
p++;
p0 = p;
if (c == 0) break;
//
if (c == '2') {
szf = "%2d";
p++;
c = *p;
p0 = p;
if (c == 0) break;
} else {
mchar* q = p + 1;
while(c == *q) {
q++;
nc++;
}
if (nc == 2) {
f02d = TRUE;
szf = "%02d";
}
}
//
switch(c) {
case 'y': { // 年
if (nc == 4) {
sprintf(buff,"%4d",st.wYear);
p += 4;
} else if (nc == 1) {
sprintf(buff,"平成%d",st.wYear-1988);
p++;
} else {
sprintf(buff,szf,st.wYear % 100);
p += 1 + f02d;
}
break;
}
case 'm': { // 月
if (nc == 4) {
strcpy(buff,tszMonthE[st.wMonth-1]);
p += 4;
} else if (nc == 3) {
strcpylen(buff,tszMonthE[st.wMonth-1],3);
p += 3;
} else {
sprintf(buff,szf,st.wMonth);
p += 1 + f02d;
}
break;
}
case 'd': { // 日にち dd d
sprintf(buff,szf,st.wDay);
p += 1 + f02d;
break;
}
case 'w': { // 曜日
if (nc == 4) {
strcpy(buff,tszYoubiE[st.wDayOfWeek]);
p += 4;
} else if (nc == 3) {
strcpy(buff,tszYoubiEs[st.wDayOfWeek]);
p += 3;
} else {
strcpy(buff,tszYoubi[st.wDayOfWeek]);
p++;
}
break;
}
case 'h': { // 時
sprintf(buff,szf,st.wHour);
p += 1 + f02d;
break;
}
case 't': { // 分
sprintf(buff,szf,st.wMinute);
p += 1 + f02d;
break;
}
case 's': { // 秒
sprintf(buff,szf,st.wSecond);
p += 1 + f02d;
break;
}
default: {
// %NAME(NAME:英大文字列+数字列)なら、txVarReadString(SF_NAME)を出力
if (isupper(c)) {
#if !__TXC__
mchar* p0 = p;
mchar szKey[CCHWORD];
while(isupper(*p)) p++;
while(isdigit(*p)) p++;
if (text) {
strcpy(szKey,"SF_");
sstrcatlen(szKey,p0,p - p0);
sstrcpy(buff,txVarReadString(text,szKey,NULL));
if (text->fTxfVarConfig && buff[0] == 0) {
strcpy(buff,"%");
sstrcat(buff,szKey + 3);
}
}
#endif // !__TXC__
} else {
// "%x" ->"x"
if (!tbiskanji(c)) {
szbuff[0] = c;
szbuff[1] = 0;
p++;
}
}
break;
}
}
sstrcat(szbuff,buff);
p0 = p;
} else {
p++;
}
}
if (p > p0) {
sstrcatlen(szbuff,p0,p - p0);
}
//
strcpy(szdst,szbuff);
}
}
//PWZ2BETA0.3 980524 ////ファイル名の自動決定と、似たような関数は統合できる?
typedef struct {
HSTRBLK sb;
mchar szDate[CCHWORD]; // 日付フォーマット
mchar szResult[CCHPATHNAME]; // 解釈結果
BOOL fMente; // メンテナンスモード?
} INSERTDATE;
static void FlushDispInsertDate(HWND hwnd)
{
HDIALOG hd = dialogFromHwnd(hwnd);
INSERTDATE* context = dialogGetCustdata(hd);
dialogRead(hd);
sprintfDate(context->szResult,context->szDate,NULL);
SetDlgItemText_A(hwnd,IDD_DATEINSERT,context->szResult);
}
static void FlushDispItems(HWND hwnd)
{
HDIALOG hd = dialogFromHwnd(hwnd);
INSERTDATE* context = dialogGetCustdata(hd);
HWND hctrl = GetDlgItem(hwnd,IDD_SBLIST);
int isel = ListBox_GetCurSel(hctrl);
if (isel >= 0) {
mchar* szClms = sbRead(context->sb,isel);
mchar* p = strchr(szClms,CHAR_TAB);
sstrcpy(context->szDate,p ? p + 1 : "");
if (context->fMente) {
dialogWrite(hd);
}
}
}
static void ItemsToList(HWND hwnd,mchar* szName,BOOL fAdd)
{
HDIALOG hd = dialogFromHwnd(hwnd);
INSERTDATE* context = dialogGetCustdata(hd);
HWND hctrl = GetDlgItem(hwnd,IDD_SBLIST);
int isel = ListBox_GetCurSel(hctrl);
dialogRead(hd);
{
mchar szData[CCHNAME + CCHWORD];
sstrcpy(szData,szName);
sstrcat(szData,"\t");
sstrcat(szData,context->szDate);
{
int i = isel;
if (fAdd) {
if (!sbInsert(context->sb,0,szData)) {
winformation(rcStringW(74));
}
isel = 0;
} else {
sbDelI(context->sb,i);
if (!sbInsert(context->sb,i,szData)) {
winformation(rcStringW(74));
}
}
ListBox_SetStrblkFirstclm(hctrl,context->sb);
ListBox_SetCurSel(hctrl,isel);
}
}
}
BOOL CALLBACK dlgprocInsertDate(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
INSERTDATE* context = dialogGetCustdata(hd);
if (subdlgprocSblist(hwnd,message,wParam,lParam,context->sb)) return TRUE;
switch(message) {
case WM_INITDIALOG: {
// ドロップダウンリストで選択してもWM_COMMANDが来ないので、
// タイマを使う
SetTimer(hwnd,WM_TIMER_TXUSER,500,NULL);
{
HWND hctrl = GetDlgItem(hwnd,IDD_SBLIST);
ListBox_SetStrblkFirstclm(hctrl,context->sb);
ListBox_SetCurSel(hctrl,sh->edit_iInsertDate);//WCE0.91 970911
FlushDispItems(hwnd);
}
FlushDispInsertDate(hwnd);
break;
}
case SBLISTN_ADD: {
ItemsToList(hwnd,(mchar*)lParam,TRUE);
break;
}
case SBLISTN_SET: {
ItemsToList(hwnd,(mchar*)lParam,FALSE);
break;
}
case SBLISTN_FLUSHLIST: {
HWND hctrl = GetDlgItem(hwnd,IDD_SBLIST);
ListBox_SetStrblkFirstclm(hctrl,context->sb);
break;
}
case SBLISTN_FLUSHCONTENT: {
FlushDispItems(hwnd);
break;
}
case WM_COMMAND: {
int cmd = GET_WM_COMMAND_CMD(wParam,lParam);
int id;
switch(id = GET_WM_COMMAND_ID(wParam,lParam)) {
case IDD_DATEFORMAT: {
FlushDispInsertDate(hwnd);
break;
}
case IDOK: {//WCE0.91 970911
HWND hctrl = GetDlgItem(hwnd,IDD_SBLIST);
sh->edit_iInsertDate = ListBox_GetCurSel(hctrl);
FlushDispInsertDate(hwnd);//WCE0.91 970911
break;
}
}
break;
}
case WM_TIMER: {
switch(wParam) {
case WM_TIMER_TXUSER: {
FlushDispInsertDate(hwnd);
break;
}
}
break;
}
}
return FALSE;
}
static BOOL _txuiInsertDate(TX* text,BOOL fMente)
{
//PWZ2BETA0.3 980519 「日付・時刻の挿入」全面改良
HDIALOG hd = dialog(fMente ? "日付・時刻の挿入の詳細" : "日付・時刻の挿入");
static mchar szHist[] = "pwzDateEx"; //PWZ2BETA0.3 980519 旧"pwzDate"
HSTRBLK sb = historyOpen(szHist,4096);
int ret;
int idEdit = 0;
int y; // for _pspc
DTRECT r;
INSERTDATE context;
structClear(context);
context.sb = sb;
context.fMente = fMente;
dialogSetCustdata(hd,&context);
#if !__TXC__
dialogSetDialoghelp(hd,8); // "日付・時刻の挿入"
#endif // !__TXC__
//sbDelAll(sb); // debug
if (sbGetCount(sb) == 0) {
sbAdd(sb,"xx年xx月xx日xx曜\t%yy年%2m月%2d日 %w曜");
sbAdd(sb,"年/月/日 曜日\t%yy/%2m/%2d %www");
sbAdd(sb,"年月日\t%yy%mm%dd");
sbAdd(sb,"xx時xx分\t%hh時%tt分");
sbAdd(sb,"時:分\t%hh:%tt");
sbAdd(sb,"年/月/日 時:分\t%yy/%mm/%dd %hh:%tt");
}
dialogSetDlgproc(hd,dlgprocInsertDate);
if (context.fMente) {
dialogCaption(hd,"書式(&F):");
dialogString(hd,NULL,0,context.szDate,cchof(context.szDate),30);
}
if (context.fMente) {
//
dialogLF(hd);
dialogSpaceV(hd);
dialogCaption(hd,"プレビュー:");
dialogControlID(hd,IDD_DATEINSERT);
dialogCaptionDynamic(hd,NULL,30);
//
if (_pspc) {
y = dialogGetPosY(hd);
} else {
dialogLFV(hd);
dialogSetPosLX(hd,36);
dialogSetPosY(hd,DTCY * 3);
}
dialogControlID(hd,IDD_SBLIST_ADD);
dialogPushbutton(hd,"追加(&A)->",14);
dialogControlID(hd,IDD_SBLIST_SET);
dialogPushbutton(hd,"変更(&E)->",14);
dialogSpaceV(hd);
dialogIndent(hd,3);
dialogControlID(hd,IDD_SBLIST_DEL);
dialogPushbutton(hd,"削除(&D)...",11);
dialogControlID(hd,IDD_SBLIST_UP);
dialogPushbutton(hd,"↑(&B)",11);
dialogControlID(hd,IDD_SBLIST_DOWN);
dialogPushbutton(hd,"↓(&N)",11);
// dialogPushbutton(hd,"<-読み込み(&L)",14);
}
//
if (_pspc) {
#if WINDOWSCE
if (context.fMente) {
dialogSetPosY(hd,y);
dialogSetPosLX(hd,15);
} else {
dialogLFV(hd);
}
#endif
} else {
dialogLFV(hd);
}
dialogControlID(hd,IDD_SBLIST);
if (context.fMente) {
#if WINDOWSCE2
dialogAddListbox(hd,"一覧(&L):",14,7-_pspc*2); //WCE1.01 980312 8->7
#else
dialogAddListbox(hd,"一覧(&L):",14,8);
#endif
} else {
dialogSetNotifyAsOK(hd,IDD_SBLIST,LBN_DBLCLK);//WCE0.91 970911
dialogAddListbox(hd,"一覧(&L):",WINDOWSCE ? 20 : 24,5);
}
//
if (!context.fMente) {
#if WINDOWSCE
dialogLFV(hd);
#else
//WZ4.00Ab 990204 「日付・時刻の挿入」に[OK],[キャンセル]ボタンを付けた
dialogCmdLFV(hd);
dialogOK(hd,14);
dialogCancel(hd,14);
dialogSpaceV(hd);
#endif
idEdit = dialogCmd(hd,"詳細(&E) >>",14);
dialogLF(hd);
dialogCaption(hd,"プレビュー:");
dialogControlID(hd,IDD_DATEINSERT);
dialogCaptionDynamic(hd,NULL,38);
}
//
{
if (ret = dialogOpen(hd)) {
//winformation(L"%d %d",ret,idEdit);
if (ret == idEdit) {
ret = 2;
} else {
ret = TRUE;
txSelectOverwriteModal(text); //WZ3.90O 981203
txInsert(text,context.szResult);
}
}
}
historyClose(szHist,sb);
return ret;
}
BOOL txIDM_UIINSERTDATE(TX* text)
{
int ret = _txuiInsertDate(text,FALSE);
if (ret == 2) {
return _txuiInsertDate(text,TRUE);
}
return ret;
}
//##最近削除した文字列の挿入
#if !__TXC__
#define IDD_DELEDSTRLIST 100
BOOL CALLBACK dlgprocInsertDelete(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
TX* text = dialogGetCustdata(hd);
HWND hctrl = GetDlgItem(hwnd,IDD_DELEDSTRLIST);
switch(message) {
case WM_INITDIALOG: {
ListBox_SetDeletedFromUndo(hctrl,text);
ListBox_SetCurSel(hctrl,0);
break;
}
case WM_COMMAND: {
switch(GET_WM_COMMAND_ID(wParam,lParam)) {
case IDOK: {
int isel = ListBox_GetCurSel(hctrl);
if (isel >= 0) {
mchar* sz = ListBox_GetItemTextAlloc_A(hctrl,isel);
if (sz) {
txInsertAtKeisen(text,sz);
}
free(sz);
}
break;
}
}
break;
}
}
return FALSE;
}
BOOL txIDM_UIINSERTDELETE(TX* text)
{
HDIALOG hd = dialog("最近、削除した文字列の挿入");
dialogSetCustdata(hd,text);
dialogSetDlgproc(hd,dlgprocInsertDelete);
//
dialogSetNotifyAsOK(hd,IDD_DELEDSTRLIST,LBN_DBLCLK);
dialogControlID(hd,IDD_DELEDSTRLIST);
dialogAddListbox(hd,NULL,30,5);
if (dialogOpen(hd)) {
return TRUE;
}
return FALSE;
}
#endif // !__TXC__
//##外部ヘルプ
//WCE1.01 980205 new
#if !WINDOWSCE && !UNIX
#ifdef UNICODE
BOOL WinHelp_A(HWND hwnd,mchar* lpszHelp,UINT uCommand,DWORD dwData)
{
wchar* wszHelp = wstrdupA(lpszHelp);
wchar* wData = wstrdupA(dwData);
BOOL ret = WinHelp(hwnd,wszHelp,uCommand,wData);
free(wszHelp);
free(wData);
return ret;
}
#else
#define WinHelp_A WinHelp
#endif
#if !__TXC__
void txHelpOpenW(TX* text,wchar* _wszfilename)
{
// カーソル位置の単語で_wszfilenameのWindowsHELPを引く
if (!wstricmp(_wszfilename,L"TX")) {
txIdmExec(text,IDM_MACRO_HELPAPI);
} else {
mchar szWord[CCHWORD];
txGetWordAfterEx(text,szWord,CCHWORD);
{
wchar wszfilename[CCHPATHNAME] = {0};
mchar szfilename[CCHPATHNAME];
wpathSetFileName(wszfilename,_wszfilename);
wpathtopath(wszfilename,szfilename);
if (szWord[0]) {
WinHelp_A(text->hwndbase,szfilename,HELP_PARTIALKEY,(LPARAM)(mchar*)szWord);
} else {
WinHelp_A(text->hwndbase,szfilename,HELP_CONTENTS,0);
}
}
}
}
void txHelpOpen(TX* text,mchar* szfilename)
{
if (szfilename[0]) { //WZ4.00A 981230 NULLチェックを追加
wchar* wsz = wstrdupA(szfilename);
txHelpOpenW(text,wsz);
free(wsz);
}
}
#endif // !__TXC__
void txHelpOpenExtend(TX* text,int iHelp)
{
//WZ4.00A 981230 外部ヘルプの設定がされていないときに、外部ヘルプを参照すると、メモリが足りないというエラーメッセージが出ることがあったのを改良。
//WZ4.00A 981230 new
//WZ4.00Ee 010411 renew
if (iHelp == 0 && text->aszHelp1 && text->aszHelp1[0]) {
txHelpOpen(text,text->aszHelp1);
} else if (iHelp == 1 && text->aszHelp2 && text->aszHelp2[0]) {
txHelpOpen(text,text->aszHelp2);
} else {
information("外部ヘルプを参照するには、「文書の設定|ヘルプ」で設定してください");
}
}
#endif // !WINDOWSCE
//##辞書の参照
#if WINDOWSCE && !WINDOWSCE1
#include "_pwzreg.h"
static BOOL wordicGetFilenameExe(wchar* wszfilename)
{
#if __TXC__
// DTonic.exeのフルパスをwszfilenameにセットしてください。
wstrcpy(wszfilename,L"\\Windows\\DTonic.exe");
return TRUE;
#else
HKEY hkey;
BOOL ret = FALSE;
if (regOpenKey_W(HKEY_CURRENT_USER,L"Software\\EAST\\DTONIC\\Settings",&hkey) == ERROR_SUCCESS) {
if (regQueryValue_W(hkey,L"ExePath",wszfilename,CCHPATHNAME) == ERROR_SUCCESS) {
wpathSetDir(wszfilename);
wpathSetFileName(wszfilename,L"DTonic.exe");
//winformation(wszfilename);
ret = TRUE;
}
regCloseKey(hkey);
}
return ret;
#endif
}
BOOL wordicGetExist(void)
{
// 辞書があるかどうか調べる
wchar wsz[CCHPATHNAME];
return wordicGetFilenameExe(wsz);
}
static BOOL wordicGetExecute(void)
{
// 辞書ソフトが起動されているかどうか調べる
//WZ4.00Ba 990228 new
HANDLE hMutex = CreateMutex(NULL,TRUE,L"DTONICBROWSER");
BOOL ret = FALSE;
if (hMutex) {
if (GetLastError() == ERROR_ALREADY_EXISTS) {
ret = TRUE;
CloseHandle(hMutex);
} else {
CloseHandle(hMutex);
ReleaseMutex(hMutex);
}
}
return ret;
}
static void wordicRefer(void)
{
// 辞書ソフトが起動されている場合に、クリップボードの単語を検索するように指示
//WZ4.00Ba 990228 new
UINT msg = RegisterWindowMessage(L"EAST DTONICCLASS");
PostMessage(HWND_BROADCAST,msg,0,0);
}
static BOOL wordicExecRefer(void)
{
// 辞書ソフトを起動し、クリップボードの単語を検索するように指示
//WZ4.00Ba 990228 new
wchar wsz[CCHPATHNAME];
if (wordicGetFilenameExe(wsz)) {
return WinExecEx_W(wsz,L"-SRCH");
}
return FALSE;
}
static void wordicSetWord(TX* text)
{
// 検索する単語をクリップボードにコピー
//WZ4.00Ba 990228 new
if (txIsClipInPara(text)) {
txSelectCopy(text);
} else {
mchar sz[CCHWORD];
txGetWordAfterEx(text,sz,CCHWORD);
{
TX* text2 = textopen(NULL);
txInsert(text2,sz);
txSelectEx(text2,CLIP_ALL);
txSelectCopy(text2);
textclose(text2);
}
}
}
BOOL txDicWord(TX* text)
{
// カーソル位置の単語で辞書を検索する。
//WZ4.00Ba 990228 new
wordicSetWord(text);
if (wordicGetExecute()) {
wordicRefer();
} else {
wordicExecRefer();
}
return TRUE;
}
#endif // WINDOWSCE
//##文書の情報
enum {
IDD_FILETYPE_CHANGE = 1000,
IDD_RELOAD,
IDD_CHARCODE,
IDD_CRCODE,
IDD_DATE, //WZ4.00Bl 990915
IDD_DATE_CHANGE, //WZ4.00Bl 990915
};
void sprintFiletime(mchar* szbuff,FILETIME* filetime)
{
FILETIME ft;
SYSTEMTIME st;
FileTimeToLocalFileTime(filetime,&ft);
FileTimeToSystemTime(&ft,&st);
sprintf(szbuff,"%2d/%2d/%2d %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
}
void sprintFiletimeDate(mchar* szbuff,FILETIME* filetime)
{
FILETIME ft;
SYSTEMTIME st;
FileTimeToLocalFileTime(filetime,&ft);
FileTimeToSystemTime(&ft,&st);
sprintf(szbuff,"%2d/%2d/%2d",st.wYear,st.wMonth,st.wDay);
}
void sprintFiletimeTime(mchar* szbuff,FILETIME* filetime)
{
FILETIME ft;
SYSTEMTIME st;
FileTimeToLocalFileTime(filetime,&ft);
FileTimeToSystemTime(&ft,&st);
sprintf(szbuff,"%02d:%02d:%02d",st.wHour,st.wMinute,st.wSecond);
}
void sprintSizeKB(mchar* szbuff,IFILE size)
{
sprintf(szbuff,"%ldKB (%ld バイト)",divmod(size,1024),size);
}
static NLINE txGetNlineall(TX* text,NPARA* pNparaAll)
{
NLINE nlineAll;
IFILE adr = txGetAddress(text);
int ly = text->ly;
int xbase = text->xbase;
text->fNoCursor++;
txSetUndisp(text);
txJumpFileTop(text);
text->fCountNline++;
txJumpFileEnd(text);
text->fCountNline--;
if (pNparaAll) *pNparaAll = text->npara;
nlineAll = text->nline;
txJumpAddress(text,adr);
txSetLy(text,ly);
text->xbase = xbase;
txFlushLx(text);
txSetDisp(text);
text->fNoCursor--;
return nlineAll;
}
typedef struct {
int nZenkaku;
int nHankaku;
} COUNTCHARS;
static void CountChars(mchar* p,int size,COUNTCHARS* cc)
{
// pからsizeまでの内容をカウント
while(size > 0) {
mchar c = *p;
#if TB_EUC
if (iseuc(c)) {
int l = eucGetCharSize(p);
if (c == CHAR_EUC_KANA) {
cc->nHankaku++;
} else if (!(c == 0xA1 && p[1] == 0xA1)) { // ' '以外
cc->nZenkaku++;
}
size -= l;
p += l;
} else {
if (c > ' ') {
cc->nHankaku++;
}
size--;
p++;
}
#else
if (iskanji(c)) {
if (!(c == 0x81 && p[1] == 0x40)) { // ' '以外
cc->nZenkaku++;
}
size -= 2;
p += 2;
} else {
if (c > ' ') {
cc->nHankaku++;
}
size--;
p++;
}
#endif
}
}
static void txCountChars(TX* text,COUNTCHARS* cc)
{
structClear(*cc);
if (text->fHigh) {
CountChars(text->buff,text->cur0,cc);
CountChars(text->buff + text->cur,text->sizebuff - text->cur,cc);
} else {
CountChars(text->buff,text->curgap,cc);
CountChars(text->buff + text->curpara,text->sizebuff - text->curpara,cc);
}
}
static int kcConvertIndex(int kc,BOOL fToIndex)
{
//WZ3.90H 980927 EUC,JIS対応
#if WINDOWSCE
#if 1//WZ4.00Ab 990118 PWZもEUC,JIS対応
return kc;
#else
if (fToIndex) {
switch(kc) {
case KC_UNICODE: return 1;
case KC_UNICODEBETA: return 2;
}
return 0;
} else {
switch(kc) {
case 1: return KC_UNICODE;
case 2: return KC_UNICODEBETA;
}
return KC_SJIS;
}
#endif
#else
return kc;
#endif
}
#define IDD_NPARA 100
#define IDD_NLINE 101
#define IDD_NPAGE 102
#define IDD_CHARS 103
typedef struct {
TX* text;
BOOL fInitTextinfo;
BOOL fReload;
BYTE kcOpen;
} FILEINFO;
static int _ipageTextinfo;
static void txGetExt(TX* text,mchar szExt[CCHWORD])
{
if (text->wszfilename[0]) {
wstrtostr(wpathGetExt(text->wszfilename),-1,szExt,CCHWORD);
} else if (text->pcc->wszExt[0]) {
wstrtostr(text->pcc->wszExt,-1,szExt,CCHWORD);
} else {
szExt[0] = 0;
}
}
#if WZFUNC_EMAIL||WZFUNC_MAILBASE
static void txMsghdrGetDateFiletime(TX* text,FILETIME* ft)
{
mchar szDate[CCHWORD];
{
TEXTTOPEXIT context;
txResetTexttopEnter(text,&context);
txMsghdrGetString(text,"Date:",NULL,szDate,cchof(szDate));
txResetTexttopExit(text,&context);
}
strToFiletime(szDate,strlen(szDate),ft,0);
}
#endif
BOOL CALLBACK dlgprocTextinfo(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
FILEINFO* context = dialogGetCustdata(hd);
TX* text = context->text;
switch(message) {
case WM_TXDIALOG_PAGECHANGED: {
_ipageTextinfo = wParam;
if (wParam == 1 && !context->fInitTextinfo) {
//WCE0.93 970920 「文書の情報」文字数行数はオンデマンドで数える
mchar szbuff[120];
//
NPARA nparaAll;
NLINE nlineAll = txGetNlineall(text,&nparaAll);
sprintf(szbuff,"%ld行",nparaAll);
SetDlgItemText_A(hwnd,IDD_NPARA,szbuff);
//
sprintf(szbuff,"%ld行",nlineAll);
SetDlgItemText_A(hwnd,IDD_NLINE,szbuff);
if (text->height) {
sprintf(szbuff,"%ldページ",divmod(nlineAll,text->height));
SetDlgItemText_A(hwnd,IDD_NPAGE,szbuff);
}
{
COUNTCHARS cc;
txCountChars(text,&cc);
sprintf(szbuff,"全角%d文字、半角%d文字、計%d文字",cc.nZenkaku,cc.nHankaku,cc.nZenkaku+cc.nHankaku);
SetDlgItemText_A(hwnd,IDD_CHARS,szbuff);
}
//
context->fInitTextinfo = TRUE;
}
break;
}
case WM_COMMAND: {
int cmd = GET_WM_COMMAND_CMD(wParam,lParam);
int id = GET_WM_COMMAND_ID(wParam,lParam);
switch(id) {
case IDD_RELOAD: {
int isel = ComboBox_GetCurSel(GetDlgItem(hwnd,IDD_CHARCODE));
mchar szCode[CCHWORD];
GetDlgItemText_A(hwnd,IDD_CHARCODE,szCode,CCHWORD);
if (question("文字コード「%s」として再読み込みします。\n%sよろしいですか?",szCode,text->fEdit ? "編集内容は失われます。\n" : "") == IDYES) {
context->fReload = TRUE;
context->kcOpen = isel;
PostMessage(GetParent(hwnd),WM_COMMAND,IDCANCEL,0);
return TRUE;
}
return TRUE;
}
#if !__TXC__
case IDD_FILETYPE_CHANGE: {
//PWZ2BETA0.3 980516 new
HDIALOG hd = dialog("拡張子の変更");
BOOL fNewfile = !text->wszfilename[0];
HSTRBLK sb = sbNewAllocEx(1024);
mchar szExt[CCHWORD];
txGetExt(text,szExt);
configtxMakeList(sb,MAKELIST_STRBLK|CFGLIST_EXT_NAME);
dialogControlStrblk(hd,sb);
dialogString(hd,"拡張子(&E):",10,szExt,cchof(szExt),20);
if (!fNewfile) {
dialogCaption(hd,"※ 実際のファイルの名前も変更します。");
}
if (dialogOpen(hd)) {
if (szExt[0] != '.') {
information("%s の指定は間違っています\n . から始まる拡張子を指定してください",szExt);
} else {
BOOL fOK = FALSE;
wchar *wszExt;
mchar* p = strstr(szExt," (");
if (p) *p = 0; // " (name)"を取り除く
wszExt = wstrdupA(szExt);
if (!fNewfile) {
BOOL fExist = fileIsExistW(text->wszfilename);
wchar wsz[CCHPATHNAME];
//
wstrcpy(wsz,text->wszfilename);
wpathSetExt(wsz,wszExt);
//
txFileLoadAllUnlock(text);
//
if (fileIsExistW(wsz)) {
if (wquestionNoYes(L"%sは存在します。上書きしますか?",wsz) == IDNO) {
} else {
if (fExist) {
if (CopyFile_W(text->wszfilename,wsz,FALSE)) {
DeleteFile_W(text->wszfilename);
fOK = TRUE;
} else {
////err
}
} else {
fOK = TRUE;
}
}
} else {
if (fExist) {
if (MoveFile_W(text->wszfilename,wsz)) {
fOK = TRUE;
} else {
////err
}
} else {
fOK = TRUE;
}
}
if (fOK) {
wstrcpy(text->wszfilename,wsz);
histAddW(HIST_FILE,wsz);
txFileLockModal(text);
}
} else {
if (text->pcc) {
fOK = TRUE;
wsstrcpy(text->pcc->wszExt,wszExt);
}
}
free(wszExt);
if (fOK) {
txConfigGet(text);
if (fNewfile && text->fTxfEnable && text->fFrame && txGetTextSize(text) == 0) {//PWZ2BETA0.6 980619 fFrameのチェックを追加
//PWZ2BETA0.5 980617 新規作成のTMLにヘッダを埋め込むようにした
txSetTml(text);
text->fEdit = FALSE;
txFlushTexttop(text);
} else {//PWZ2BETA0.9A 980623 .TMLからの拡張子変更の処理を改善
if (!text->fTxfEnable) {
if (text->texttop) {
txResetTexttop(text);
}
text->fTxf = FALSE;
}
}
txFlush(text);
txDoCaption(text);
}
// close
PostMessage(GetParent(hwnd),WM_COMMAND,IDCANCEL,0);
}
}
sbDelete(sb);
break;
}
#endif // !__TXC__
#if (WZFUNC_EMAIL||WZFUNC_MAILBASE) && !__TXC__
case IDD_DATE_CHANGE: { //WZ4.00Bl 990915
#if WZFUNC_MAILBASE
txuiMaileditSetDate(text);
#else
txMaileditSetDateNow(text);
#endif
{
FILETIME ft;
mchar szbuff[CCHWORD];
txMsghdrGetDateFiletime(text,&ft);
sprintFiletime(szbuff,&ft);
SetDlgItemText_A(hwnd,IDD_DATE,szbuff);
}
break;
}
#endif
}
break;
}
}
return FALSE;
}
static void dialogIndentClm(HDIALOG hd)
{
if (_pspc) {
dialogLF(hd);
dialogSetPosLX(hd,4);
} else {
dialogSetPosLX(hd,12);
}
}
static BOOL _txIDM_UIINFO(TX* text)
{
HDIALOG hd0 = dialog("文書の情報");
HDIALOG hd;
MAILEDIT* mailedit = text->mailedit;
mchar szfilename[CCHPATHNAME];
mchar szbuff[120];
mchar szSubject[CCHWORD];
BYTE ikc = kcConvertIndex(text->kcSave,TRUE);
FILEINFO context;
structClear(context);
context.text = text;
dialogSetCustdata(hd0,&context);
dialogSetDlgproc(hd0,dlgprocTextinfo);
dialogSetStartPage(hd0,_ipageTextinfo);
//
hd = dialog("ファイル");
//WZ3.90I 981017 TMLだけダイアログページを増やすのは使いにくかった
if (text->fTML) {
txfGetSubject(text,szSubject,CCHWORD);
dialogString(hd,"タイトル(&T):",11,szSubject,CCHWORD,34);
}
dialogSetH(hd);
//PWZ2BETA0.3 980515
{
dialogCaption(hd,"拡張子");
dialogIndentClm(hd);
txGetExt(text,szbuff);
if (szbuff[0] == 0) strcpy(szbuff,"(なし)");
if (text->szEditor[0]) {
sstrcat(szbuff," (");sstrcat(szbuff,text->szEditor);sstrcat(szbuff,")");
}
dialogCaptionDynamic(hd,szbuff,20-_pspc*5);
#if !__TXC__
if (!text->mailedit) { //PWZ2BETA0.8 980622 MAIL EDITORでは「ファイル|文書の情報」で拡張子を変更できないようにした
dialogControlID(hd,IDD_FILETYPE_CHANGE);
dialogPushbutton(hd,"変更(&E)...",10);
}
#endif // !__TXC__
dialogLF(hd);
}
//
if (text->wszfilename[0]) {
WIN32_FIND_DATAW ffd;
{
HANDLE hfind = FindFirstFile_W(text->wszfilename,&ffd);
if (hfind != INVALID_HANDLE_VALUE) {
FindClose(hfind);
}
}
wstrtostr(text->wszfilename,-1,szfilename,CCHPATHNAME);
//
dialogCaption(hd,"ファイル名");
dialogIndentClm(hd);
dialogCaptionDynamic(hd,pathGetFileName(szfilename),50-_pspc*23);
dialogLF(hd);
dialogCaption(hd,"フルパス名");
dialogIndentClm(hd);
dialogCaptionDynamicEx(hd,szfilename,50-_pspc*23,2);//WCE0.91 970911 30*1->50*2に拡大
dialogLF(hd);
dialogCaption(hd,"サイズ");
dialogIndentClm(hd);
sprintSizeKB(szbuff,text->sizefileReal);
dialogCaptionDynamic(hd,szbuff,30-_pspc*3);
dialogLF(hd);
if (text->mailedit) { //WZ4.00Bl 990915 MAIL/NOTE EDITORの「ファイル|文書の情報」の日付の表示を改良。
#if WZFUNC_EMAIL||WZFUNC_MAILBASE
FILETIME ft;
txMsghdrGetDateFiletime(text,&ft);
dialogCaption(hd,"日付:");
dialogIndentClm(hd);
sprintFiletime(szbuff,&ft);
dialogControlID(hd,IDD_DATE);
dialogCaptionDynamic(hd,szbuff,30);
#if !__TXC__
//WZ4.00Bl 990915 MAIL/NOTE EDITORの「ファイル|文書の情報」で現在の日付に変更できるようにした。
dialogControlID(hd,IDD_DATE_CHANGE);
dialogPushbutton(hd,"変更(&E)",8);
#endif // !__TXC__
dialogLF(hd);
#endif
} else {
#if !WINDOWSCE && !UNIX // CEでは未サポート
//WZ4.00Ac 990206 「文書の情報」で、作成日を表示するようにした。
dialogCaption(hd,"作成日");
dialogIndentClm(hd);
sprintFiletime(szbuff,&ffd.ftCreationTime);
dialogCaptionDynamic(hd,szbuff,30);
dialogLF(hd);
#endif
if (fileIsExistW(text->wszfilename)) {
dialogCaption(hd,"更新日");
dialogIndentClm(hd);
sprintFiletime(szbuff,&text->timeFile);
dialogCaptionDynamic(hd,szbuff,30-_pspc*3);
dialogLF(hd);
#if 0 // 参照日は表示しても意味がない。
dialogCaption(hd,"参照日");
dialogIndentClm(hd);
sprintFiletime(szbuff,&ffd.ftLastAccessTime);
dialogCaptionDynamic(hd,szbuff,30);
dialogLF(hd);
#endif
#if UNIX
dialogCaption(hd,"アクセス権");
dialogIndentClm(hd);
sprintFilemask(szbuff,ffd.st_mode);
dialogCaptionDynamic(hd,szbuff,30);
dialogLF(hd);
#endif
} else {
//WCE0.94 970922 存在しないファイルを開いたときは、「文書の情報」で、「ファイルは存在していません」を表示。
dialogCaption(hd,"ファイルは存在していません");
}
}
} else {
dialogCaption(hd,"(まだファイルに保存されていません)");//WCE0.93 970919
}
dialogAddPage(hd0,hd);
//
hd = dialog("文書サイズ");
dialogSetCaptionNoLfPSPC(hd,TRUE);
{
dialogSetH(hd);
//
dialogCaption(hd,"サイズ");
dialogIndentClm(hd);
sprintSizeKB(szbuff,txGetTextSize(text));
dialogCaptionDynamic(hd,szbuff,30);
dialogLF(hd);
dialogCaption(hd,"段落数");
dialogIndentClm(hd);
dialogControlID(hd,IDD_NPARA);
dialogCaptionDynamic(hd,NULL,30);
dialogLF(hd);
dialogCaption(hd,"行数");
dialogIndentClm(hd);
dialogControlID(hd,IDD_NLINE);
dialogCaptionDynamic(hd,NULL,40);
dialogLF(hd);
if (text->height) {
dialogCaption(hd,"ページ数");
dialogIndentClm(hd);
dialogControlID(hd,IDD_NPAGE);
dialogCaptionDynamic(hd,NULL,40);
dialogLF(hd);
}
//
dialogControlID(hd,IDD_CHARS);
dialogCaptionDynamic(hd,NULL,55);
}
dialogAddPage(hd0,hd);
//WCE0.93 970919 「文書の情報」ダイアログに「文字コード」タブを追加
hd = dialog("文字コード");
{
//WZ3.90H 980927 「文書の情報」で文字コードを指定した再読み込みをサポート
//WZ4.00Bl 990916 (PWZ)「文書の情報」で文字コードを指定した再読み込みをサポート。ユーザ要望(SJISとEUCの認識に失敗した場合に困る)
dialogSetH(hd);
dialogControlID(hd,IDD_CHARCODE);
dialogControlHelp(hd,240);
dialogChoiceB(hd,"文字コード(&C):",14,&ikc,20,"シフトJIS","JIS","EUC","Unicode","Unicodeベタ",NULL);
dialogLFIndentPSPC(hd,14); //WZ4.00Ea 001127
dialogControlID(hd,IDD_RELOAD);
dialogControlHelp(hd,239);
dialogCmd(hd,"再読み込み(&R)...",16);
dialogLFSetV(hd);
dialogSpaceV(hd);
#if UNIX
dialogControlHelp(hd,240);
dialogChoiceB(hd,"改行コード(&P):",14,&text->crSave,20,"Windowsファイル(CR+LF)","MACファイル(CR)","標準(LF)",NULL);//WZ3.90J 981109
#else
dialogControlHelp(hd,240);
dialogChoiceB(hd,"改行コード(&P):",14,&text->crSave,20,"標準(CR+LF)","MACファイル(CR)","UNIXファイル(LF)",NULL);//WZ3.90J 981109
#endif
dialogControlHelp(hd,240);
dialogChoiceB(hd,"EOFコード(&E):",14,&text->fAppendEof,20,"なし","あり",NULL);//WZ3.90J 981110
}
dialogAddPage(hd0,hd);
//
if (dialogOpen(hd0)) {
text->kcSave = kcConvertIndex(ikc,FALSE);
//PWZ2BETA0.3 980515
if (text->fTML) {
TEXTTOPEXIT context;
txResetTexttopEnter(text,&context);
txMsghdrSet(text,"Subject:",szSubject);
txResetTexttopExit(text,&context);
//
txDoCaption(text);
}
return TRUE;
}
if (context.fReload) {
text->pcc->fKcOpen = TRUE;
text->pcc->kcOpen = context.kcOpen;
txReopenInternalExW(text,NULL,0,text->pcc);
return FALSE;
}
return FALSE;
}
BOOL txIDM_UIINFO(TX* text)
{
// if (text->fMemo) return FALSE; //WZ4.00Dd 000601
if (!text->fFrame) return FALSE; //WZ4.00Eb 001223 GREP等でIDM_UIINFOできないようにした。
return _txIDM_UIINFO(text);
}
//##見出しスタイル
#if WZFUNC_HEADLINECONVERT
//WZ4.00Be 990512 PWZ:テキストの変換に見出しの変換機能を追加。
#define HEADLINECONVERT_SUBWIN WINDOWSCE //WZ4.00Be 990512 サブウィンドウ表示?
static mchar _szfilenameCfg[] = "HEAD";
static mchar _szStyle0[CCHWORD];
static void headstyle_txMsghdrGetset(TX* text,HEADLINE_SET* head,BOOL fSet)
{
int i;
for (i = 0;i < HEADLINE_N;i++) {
mchar sz[] = {'H',i + '1',':',0};
txMsghdrGetsetString(text,sz,head->t[i].sz,CCHHEADLINE,fSet);
}
if (!fSet) {
int i;
for (i = 0;i < HEADLINE_N;i++) {
head->t[i].fDelete = FALSE;
}
}
}
static void styleArgInit(STYLESHEETARG* arg,HEADLINE_SET* context)
{
structClear(*arg);
arg->szfilenameCfg = _szfilenameCfg;
arg->txMsghdrGetset = headstyle_txMsghdrGetset;
arg->appContext = context;
#if __TXC__
arg->fTXC = TRUE;
#endif
}
int headline_uistyle(HEADLINE_SET* context)
{
STYLESHEETARG arg;
styleArgInit(&arg,context);
return stylesheet_uiMente(&arg,_szStyle0);
}
static BOOL styleLoad(mchar* szStyle,HEADLINE_SET* context)
{
STYLESHEETARG arg;
styleArgInit(&arg,context);
return stylesheet_Load(&arg,szStyle);
}
static BOOL styleSave(mchar* szStyle,HEADLINE_SET* context)
{
STYLESHEETARG arg;
styleArgInit(&arg,context);
return stylesheet_Save(&arg,szStyle);
}
#endif // WZFUNC_HEADLINECONVERT
//##テキストの変換
//WZ3.90K 981113 new
enum {
IDD_LIST2 = 100,IDD_HEADLINE_SRCMENU,IDD_HEADLINE_DSTMENU,
IDD_CONVERTHEADLINE_SRC,IDD_CONVERTHEADLINE_DST, //WZ4.00Be 990512
IDD_HEADLINE_SRC = 1000,
IDD_HEADLINE_SRCDEL = 1050,
IDD_HEADLINE_DST = 1100,
};
#if WZFUNC_EDITOR
static mchar* _tszCt[] = { // CT_xxxの値と対応。
"プレーンテキスト","改行付きテキスト",
// "記号付きテキスト", // 要らないだろう。
"体裁認識テキスト",
#if WZFUNC_HTMLHIGH
"HTMLテキスト",
#endif
"TMLテキスト","ワープロ用テキスト",
"体裁認識(PWZ2.00以前)","タブ体裁(PWZ)",NULL,
};
#else
static mchar* _tszCt[] = { // CT_xxxの値と対応。
"プレーンテキスト","改行付きテキスト","TMLテキスト",
NULL,
};
#endif
#if 0
static BOOL txIsSymbolFront(TX* text)
{
// textの段落先頭からカーソル位置の手前までが記号だけでできているかどうか返す
//WZ3.90K 981113 new
mchar* p = text->buff + text->curpara;
mchar* pEnd = text->buff + text->cur0;
while(p < pEnd) {
int ct = GetCharType(text,p);
if (ct == CT_SYMBOL || ct == CT_SPACE) {
} else {
return FALSE;
}
p += txGetCharSize(text,p);
}
return TRUE;
}
#endif
typedef struct tagContextConverttext {
TX* text;
int ctSrc;
int ctDst;
HEADLINE_SET headSrc;
HEADLINE_SET headDst;
BOOL fKeep; //WZ4.00Ac 990206 前回の条件を再現
} DIALOG_CONVERTTEXT;
#if WZFUNC_HEADLINECONVERT
#if WZFUNC_HTMLHIGH //WZ4.00Be 990512
#define ctIsNoHeadline(ct) (ct == CT_HTML || ct == CT_TML) // 見出し文字列を持たない?
#else
#define ctIsNoHeadline(ct) (ct == CT_TML) // 見出し文字列を持たない?
#endif
#endif
#if WZFUNC_HEADLINECONVERT
static void dialogAddHeadlineConverttext(HDIALOG hd,DIALOG_CONVERTTEXT* context,BOOL fDst)
{
int i;
HEADLINE_SET* head = fDst ? &context->headDst : &context->headSrc;
#if !HEADLINECONVERT_SUBWIN
dialogSetPosY(hd,dialogGetPosY(hd) - DTCY + UNIX*DTCY);
dialogSetPosLF(hd);
#endif
dialogSetH(hd);
if (fDst) {
dialogSetPosLX(hd,6);
dialogControlID(hd,IDD_HEADLINE_DSTMENU);dialogPushbutton(hd,"見出し(&M)...",10+_pspc*2+SFF*2); //WZ4.00Be 990512 &W->&L
} else {
dialogSetPosLX(hd,3);
dialogControlID(hd,IDD_HEADLINE_SRCMENU);dialogPushbutton(hd,"見出し(&L)...",10+_pspc*2+SFF*2); //WZ4.00Be 990512 &E->&M
}
if (!fDst) {dialogSetPosLX(hd,16);hd->dtyAdd = DTCYINT;dialogCaption(hd,"削除:");}
dialogLF(hd);
dialogSetIntXY(hd,0,0);
for (i = 0;i < HEADLINE_N;i++) {
mchar sz[CCHWORD];
if (fDst) {
#if HEADLINECONVERT_SUBWIN
sprintf_A(sz,"&%d:",i + 1);
#else
if (i == 0) {
strcpy(sz,"1(&A):");
} else {
sprintf_A(sz,"%d:",i + 1);
}
#endif
dialogControlID(hd,IDD_HEADLINE_DST + i);
dialogString(hd,sz,5,head->t[i].sz,CCHHEADLINE,14);
} else {
sprintf_A(sz,"&%d:",i + 1);
dialogControlID(hd,IDD_HEADLINE_SRC + i);
dialogString(hd,sz,2,head->t[i].sz,CCHHEADLINE,14);
//
dialogControlID(hd,IDD_HEADLINE_SRCDEL + i);
dialogCheckB(hd,NULL,&head->t[i].fDelete);
}
dialogLF(hd);
}
dialogSetV(hd);
dialogResetInt(hd);
}
static void cmdprocConvertText(HWND hwnd,DIALOG_CONVERTTEXT* context,int id)
{
HWND hctrl = GetDlgItem(hwnd,id);
HDIALOG hd = dialogFromHwnd(hwnd);
TX* text = context->text;
switch(id) {
case IDD_HEADLINE_SRCMENU:
case IDD_HEADLINE_DSTMENU: {
enum {IDD_H_STD=100,IDD_H_CLEAR,IDD_H_TEXT,IDD_H_STYLE};
BOOL fDst = (id == IDD_HEADLINE_DSTMENU);
HEADLINE_SET* head = (fDst) ? &context->headDst : &context->headSrc;
HMENU hmenu = menuNew();
int cmd;
RECT r;
SetFocus(GetDlgItem(hwnd,fDst ? IDD_HEADLINE_DST : IDD_HEADLINE_SRC));
GetWindowRect(hctrl,&r);
menuStr(hmenu,"標準の見出し文字(&S)",IDD_H_STD);
menuStr(hmenu,"この文書の見出し文字(&T)",IDD_H_TEXT);
menuStr(hmenu,"スタイル(&Q)...",IDD_H_STYLE);
menuStr(hmenu,"クリア(&Z)",IDD_H_CLEAR);
cmd = menuOpenEx(hmenu,MENU_CMD,r.left,r.bottom,hwnd);
menuDelete(hmenu);
dialogRead(hd);
switch(cmd) {
case IDD_H_STYLE: {
if (headline_uistyle(head) == IDOK) {
dialogWrite(hd);
}
break;
}
case IDD_H_STD: {
int i;
for (i = 0;i < HEADLINE_N;i++) {
int n = i + 1;
mchar* dst = head->t[i].sz;
while(n--) *dst++ = '.';
*dst = 0;
if (!fDst) head->t[i].fDelete = TRUE;
}
dialogWrite(hd);
break;
}
case IDD_H_TEXT: {
int i;
for (i = 0;i < HEADLINE_N;i++) {
txHeadlineGet(text,i,head->t[i].sz);
if (!fDst) head->t[i].fDelete = FALSE;
}
dialogWrite(hd);
break;
}
case IDD_H_CLEAR: {
int i;
for (i = 0;i < HEADLINE_N;i++) {
head->t[i].sz[0] = 0;
if (!fDst) head->t[i].fDelete = FALSE;
}
dialogWrite(hd);
break;
}
}
break;
}
}
}
static void convertHeadlineSetEnable(HWND hwndBase,int id,HWND hwndTarget)
{
HWND hctrl = GetDlgItem(hwndBase,id);
int ct = ListBox_GetCurSel(hctrl);
BOOL fEnable = !ctIsNoHeadline(ct);
int i;
for (i = 0;i < HEADLINE_N;i++) {
EnableDlgItem(hwndTarget,IDD_HEADLINE_SRC+i,fEnable);
}
}
BOOL CALLBACK dlgprocConvertHeadline(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//WZ4.00Be 990512 new
HDIALOG hd = dialogFromHwnd(hwnd);
DIALOG_CONVERTTEXT* context = dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
convertHeadlineSetEnable(GetParent(hwnd),IDD_LIST,hwnd);
break;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
cmdprocConvertText(hwnd,context,id);
break;
}
}
return FALSE;
}
#endif
int txGetCT(TX* text)
{
if (text->fTxf || text->fTxfEnable) return CT_TML;
switch(text->filekind) {
case TEXT_PLAIN: return CT_PLAINTEXT;
#if WZFUNC_EDITOR
#if WZFUNC_TABBEAM
case TEXT_APFU: return CT_AUTOFORMTEXT;
case TEXT_DOCUMENT: return CT_AUTOFORMTEXT;
#else
case TEXT_APFU: return CT_AUTOFORMTEXTOLD;
case TEXT_DOCUMENT: return CT_TABFORMTEXT;
#endif
#endif
case TEXT_WZ: return CT_TML;
#if WZFUNC_HTMLHIGH
case TEXT_HTML: return CT_HTML;
case TEXT_XML: return CT_HTML;
#endif
case TEXT_TEXT: return CT_PLAINTEXT;
case TEXT_PROGRAM: return CT_PLAINTEXT;
}
return CT_PLAINTEXT;
}
BOOL CALLBACK dlgprocConvertText(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
DIALOG_CONVERTTEXT* context = dialogGetCustdata(hd);
TX* text = context->text;
switch(message) {
case WM_INITDIALOG: {
HWND hctrl = GetDlgItem(hwnd,IDD_LIST);
HWND hctrl2 = GetDlgItem(hwnd,IDD_LIST2);
{
mchar** p = _tszCt;
for (;*p;p++) {
ListBox_AddString_A(hctrl,*p);
ListBox_AddString_A(hctrl2,*p);
}
}
{
if (context->fKeep) {
ListBox_SetCurSel(hctrl,context->ctSrc);
ListBox_SetCurSel(hctrl2,context->ctDst);
} else {
int ct = txGetCT(text);
ListBox_SetCurSel(hctrl,ct);
ListBox_SetCurSel(hctrl2,1);
#if __DEV__
#if WZFUNC_HTMLHIGH
ListBox_SetCurSel(hctrl2,ct == CT_HTML ? 4 : 1);
#else
ListBox_SetCurSel(hctrl2,1);
#endif
#endif
}
FORWARD_WM_COMMAND(hwnd,IDD_LIST,hctrl,LBN_SELCHANGE,PostMessage);
}
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 IDOK: {
HWND hctrl = GetDlgItem(hwnd,IDD_LIST);
HWND hctrl2 = GetDlgItem(hwnd,IDD_LIST2);
context->ctSrc = ListBox_GetCurSel(hctrl);
context->ctDst = ListBox_GetCurSel(hctrl2);
break;
}
#if WZFUNC_HEADLINECONVERT
case IDD_LIST: {
if (cmd == LBN_SELCHANGE) {
#if 1//WZ4.00Be 990512
convertHeadlineSetEnable(hwnd,id,hwnd);
#else
int ct = ListBox_GetCurSel(hctrl);
BOOL fEnable = !ctIsNoHeadline(ct);
int i;
for (i = 0;i < HEADLINE_N;i++) {
EnableDlgItem(hwnd,IDD_HEADLINE_SRC+i,fEnable);
}
#endif
}
break;
}
#endif
#if WZFUNC_HEADLINECONVERT && HEADLINECONVERT_SUBWIN
case IDD_CONVERTHEADLINE_SRC:
case IDD_CONVERTHEADLINE_DST: {
HDIALOG hd = dialog((id == IDD_CONVERTHEADLINE_SRC)?"変換元の見出し":"変換先の見出し");
hd->fCaptionOkBtn = FALSE;
dialogSetDlgproc(hd,dlgprocConvertHeadline);
dialogSetCustdata(hd,context);
dialogAddHeadlineConverttext(hd,context,(id == IDD_CONVERTHEADLINE_DST));
// dialogLFV(hd);dialogClose(hd,8);
dialogOpen(hd);
break;
}
#endif
}
#if WZFUNC_HEADLINECONVERT
cmdprocConvertText(hwnd,context,id); //WZ4.00Be 990512
#endif
break;
}
}
return FALSE;
}
BOOL txIDM_UICONVERTTEXT(TX* text)
{
// 次の場合に必要なので見出しの変換も付けた。
// テキストの見出しをTMLに変換する:"..."の場合は見出し文字を取りたい、
// 見出し文字を付けてないTMLをテキストに変換する:見出し文字を付けて変換したい。
// 受け取った著者原稿の正規化に必要な機能は、改行付きテキストのプレーンへの変換、見出しの認識、語句統一。
static BBOOL _mode;
HDIALOG hd;
DIALOG_CONVERTTEXT context;
BOOL ret = FALSE;
int y;
//
if (!txGetEditable(text)) return FALSE; //WZ4.00Ac 990206
//
hd = dialog("テキストの変換");
dialogSetDlgproc(hd,dlgprocConvertText);
structClear(context);
if (text->converttext) {context = *text->converttext;context.fKeep = TRUE;}
context.text = text;
dialogSetCustdata(hd,&context);
//
if (!WINDOWSCE || _pspc) {
dialogControlRadioV(hd);
}
dialogChoiceRadioB(hd,&_mode,"クリップボードにコピー(&C)","テキストを直接変換(&T)",NULL);
//
dialogSpaceV(hd);dialogSpaceV(hd);
dialogSetPosLF(hd);y = dialogGetPosY(hd);
dialogControlID(hd,IDD_LIST);
dialogAddListbox(hd,"変換元(&S):",22,6-_pspc*3);
#if WZFUNC_HEADLINECONVERT
#if HEADLINECONVERT_SUBWIN
dialogSetPosY(hd,y-DTCY/3);dialogSetPosLX(hd,12);
dialogControlID(hd,IDD_CONVERTHEADLINE_SRC);
dialogPushbutton(hd,"見出し(&L)...",12-!_pspc*2);
#else
dialogAddHeadlineConverttext(hd,&context,FALSE);
#endif
#endif
if (_pspc) {
dialogLF(hd);
} else {
dialogLFV(hd);dialogSetPosY(hd,y);dialogSetPosLF(hd);
dialogSetPosY(hd,dialogGetPosY(hd) + DTCY*5);dialogCaption(hd,"→");
dialogLFV(hd);
}
dialogSetPosLF(hd);y = dialogGetPosY(hd); //WZ4.00Be 990512
dialogControlID(hd,IDD_LIST2);
dialogAddListbox(hd,"変換先(&E):",22,6-_pspc*3);
#if WZFUNC_HEADLINECONVERT
#if HEADLINECONVERT_SUBWIN
dialogSetPosY(hd,y-DTCY/3);dialogSetPosLX(hd,12);
dialogControlID(hd,IDD_CONVERTHEADLINE_DST);
dialogPushbutton(hd,"見出し(&M)...",12-!_pspc*2);
#else
dialogAddHeadlineConverttext(hd,&context,TRUE);
#endif
#endif
//
if (dialogOpen(hd)) {
if (context.ctSrc != context.ctDst) {
if (!text->converttext) text->converttext = malloc(sizeof(DIALOG_CONVERTTEXT));
#if __TXC__
memcpy(text->converttext,&context,sizeof(DIALOG_CONVERTTEXT));
#else
//WZ4.00Ca 991201 TX-Cではこのコードはうまく動かない。
if (text->converttext) *text->converttext = context;
#endif
#if WZFUNC_HEADLINECONVERT
if (ctIsNoHeadline(context.ctSrc)) {
// この場合は見出しの変換をしないのでゼロクリアする。
HEADLINE_SET* head = &context.headSrc;
int i;
for (i = 0;i < HEADLINE_N;i++) {
head->t[i].sz[0] = 0;
head->t[i].fDelete = FALSE;
}
}
#endif
txConvertText(text,context.ctSrc,context.ctDst,&context.headSrc,&context.headDst,!_mode);
}
ret = TRUE;
}
return ret;
}
//##文書校正・スペルチェック
#if !WINDOWSCE
typedef struct {
BYTE configTop;
mchar szfilenameDic[CCHPATHNAME];
BYTE kutoten;
BYTE buntai;
BYTE kanji_kana;
BYTE kuten_brace;
BYTE suffix_kana;
BYTE reader;
BYTE homophone;
BYTE itaiji;
BYTE ukemi;
BYTE strong;
BYTE sijisi;
BYTE ranuki;
BYTE hitei;
BYTE josi_continue;
BYTE digit_zenhan;
BBOOL fWordStandardize;
BYTE fCheckLongPara;
WORD lcxLongPara;
BBOOL fSpellCheck;
mchar szfilenameSplchkUserDic[CCHPATHNAME];
BBOOL fSplchkNoupper;
BBOOL fSplchkNodigit;
BBOOL fSplchkShort; // nSplchkShort文字以下は無視
BBOOL fSplchkClearTempDic; // 一時辞書を削除してから検索
BBOOL fSplchkCur; // カーソル位置の単語のみを検索。
BBOOL fSplchkNoUrl; //WZ3.90L 981116 URLは無視
BYTE nSplchkShort;
BYTE configEnd;
//
TX* text;
HSTRBLK sbSplchkTempDic; // 一時辞書
// スペルチェック専用モード
BOOL fSplchkMode; // スペルチェック専用モード
BOOL fSpellChecked; // 調査を行った?
// 用語統一専用モード
BOOL fReWording;
// 内部状態
BOOL fSearching;
int iSubitemSort;
} PROOF_DIALOG;
static mchar _szfilenameProofCfg[] = "PROOF";
static mchar _szStyle0[CCHWORD];
static mchar* _tszReplaced[] = {"","済"};
static BBOOL _fBreaked;
static HWND _hdlg;
static BOOL AbortProc(void)
{
if (_hdlg) {
MSG msg;
while(!_fBreaked && PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE) {
_fBreaked = TRUE;
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return _fBreaked;
}
return FALSE;
}
static void txMsghdrGetsetProofStyle(TX* text,PROOF_DIALOG* context,BOOL fSet)
{
txMsghdrGetsetIntB(text,"KUTOTEN:",&context->kutoten,fSet);
txMsghdrGetsetIntB(text,"DEARU_DESUMASU:",&context->buntai,fSet);
txMsghdrGetsetIntB(text,"KANJI_KANA:",&context->kanji_kana,fSet);
txMsghdrGetsetIntB(text,"KUTEN_BRACE:",&context->kuten_brace,fSet);
txMsghdrGetsetIntB(text,"SUFFIX_KANA:",&context->suffix_kana,fSet);
txMsghdrGetsetIntB(text,"READER:",&context->reader,fSet);
txMsghdrGetsetIntB(text,"HOMOPHONE:",&context->homophone,fSet);
txMsghdrGetsetIntB(text,"ITAIJI:",&context->itaiji,fSet);
txMsghdrGetsetIntB(text,"UKEMI:",&context->ukemi,fSet);
txMsghdrGetsetIntB(text,"STRONG:",&context->strong,fSet);
txMsghdrGetsetIntB(text,"SIJISI:",&context->sijisi,fSet);
txMsghdrGetsetIntB(text,"RANUKI:",&context->ranuki,fSet);
txMsghdrGetsetIntB(text,"HITEI:",&context->hitei,fSet);
txMsghdrGetsetIntB(text,"JOSI_CONTINUE:",&context->josi_continue,fSet);
txMsghdrGetsetIntB(text,"DIGIT_ZENHAN:",&context->digit_zenhan,fSet);
txMsghdrGetsetIntB(text,"WS:",&context->fWordStandardize,fSet);
txMsghdrGetsetString(text,"WSDIC:",context->szfilenameDic,cchof(context->szfilenameDic),fSet);
txMsghdrGetsetIntB(text,"SPLCHK:",&context->fSpellCheck,fSet);
txMsghdrGetsetString(text,"SPLCHK_USERDIC:",context->szfilenameSplchkUserDic,CCHPATHNAME,fSet);
txMsghdrGetsetIntB(text,"SPLCHK_NOUPPER:",&context->fSplchkNoupper,fSet);
txMsghdrGetsetIntB(text,"SPLCHK_NODIGIT:",&context->fSplchkNodigit,fSet);
txMsghdrGetsetIntB(text,"SPLCHK_NOURL:",&context->fSplchkNoUrl,fSet);//WZ3.90L 981116
//
if (!context->fSplchkShort) context->nSplchkShort = 0;
txMsghdrGetsetIntB(text,"SPLCHK_NOSHORT:",&context->nSplchkShort,fSet);
context->fSplchkShort = !!context->nSplchkShort;
}
static void proofstyleArgInit(STYLESHEETARG* arg,PROOF_DIALOG* context)
{
structClear(*arg);
arg->szfilenameCfg = _szfilenameProofCfg;
arg->txMsghdrGetset = txMsghdrGetsetProofStyle;
arg->appContext = context;
#if __TXC__
arg->fTXC = TRUE;
#endif
}
static int uistyle(PROOF_DIALOG* context)
{
STYLESHEETARG arg;
proofstyleArgInit(&arg,context);
return stylesheet_uiMente(&arg,_szStyle0);
}
static BOOL proofstyleLoad(mchar* szStyle,PROOF_DIALOG* context)
{
STYLESHEETARG arg;
proofstyleArgInit(&arg,context);
return stylesheet_Load(&arg,szStyle);
}
static BOOL proofstyleSave(mchar* szStyle,PROOF_DIALOG* context)
{
STYLESHEETARG arg;
proofstyleArgInit(&arg,context);
return stylesheet_Save(&arg,szStyle);
}
static void splchkOpenTempDic(PROOF_DIALOG* context)
{
context->sbSplchkTempDic = historyOpen("splchkTempDic",8192);
}
static void splchkCloseTempDic(PROOF_DIALOG* context)
{
if (context->sbSplchkTempDic) {
historyClose("splchkTempDic",context->sbSplchkTempDic);
context->sbSplchkTempDic = NULL;
}
}
static int splchkExec(PROOF_DIALOG* context,LIST* list)
{
mchar szfilenameDic[CCHPATHNAME];
int ret = 0;
TX* textDic = textopen(pathFullConfig(szfilenameDic,"spell.dic"));
TX* textDicUser = context->szfilenameSplchkUserDic[0] ? textopen(context->szfilenameSplchkUserDic) : NULL;
DWORD scmode = 0;
if (context->fSplchkNoupper) scmode |= SPLCHK_NOUPPER;
if (context->fSplchkNodigit) scmode |= SPLCHK_NODIGIT;
if (context->fSplchkNoUrl) scmode |= SPLCHK_NOURL;
if (context->fSplchkShort && context->nSplchkShort) scmode |= context->nSplchkShort;
if (context->fSplchkClearTempDic) sbDelAll(context->sbSplchkTempDic);
if (context->fSplchkCur) scmode |= SPLCHK_CUR;
#if __TXC__
scmode |= SPLCHK_TXC;
#endif
ret += txSpellCheck(context->text,textDic,textDicUser,context->sbSplchkTempDic,list,scmode,NULL);
textclose(textDic);
textclose(textDicUser);
return ret;
}
static void dialogAddSpellCheck(HDIALOG hd,PROOF_DIALOG* context,BOOL fCommand)
{
dialogSetCustdata(hd,context);
//
dialogSetH(hd);
// dialogControlID(hd,IDD_WSDIC);
dialogControlRefer(hd,"*.dic");
dialogControlHelp(hd,242);
dialogString(hd,"ユーザ辞書(&U):",14,context->szfilenameSplchkUserDic,CCHPATHNAME,30);
// dialogControlID(hd,IDD_WSEDIT);
// dialogPushbutton(hd,"編集",5);
dialogLFSetV(hd);
dialogControlHelp(hd,243);
dialogCheckB(hd,"全て大文字の単語は無視(&I)",&context->fSplchkNoupper);
dialogControlHelp(hd,244);
dialogCheckB(hd,"数字が付いた単語は無視(&N)",&context->fSplchkNodigit);
dialogControlHelp(hd,245);
dialogCheckB(hd,"URLは無視(&L)",&context->fSplchkNoUrl);
dialogControlHelp(hd,246);
dialogCheckB(hd,"一時辞書をクリアしてからチェック(&T)",&context->fSplchkClearTempDic);
dialogSetH(hd);
dialogControlHelp(hd,247);
dialogCheckB(hd,"短い単語は無視(&W):",&context->fSplchkShort);
dialogControlUpdown(hd,1,5);
dialogControlGuide(hd,"文字以下",8);
dialogIntegerB(hd,NULL,0,&context->nSplchkShort,6);
dialogLFSetV(hd);
}
BOOL CALLBACK dlgprocSpellCheck(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
PROOF_DIALOG* context = (LPVOID)dialogGetCustdata(hd);
switch(message) {
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
if (id == IDD_STYLE) {
int ret = 0;
dialogRead(hd);
ret = uistyle(context);
if (ret == IDOK) dialogWrite(hd);
return TRUE;
}
break;
}
}
return FALSE;
}
static BOOL _txuiSpellCheck(TX* text,int mode)
{
//WZ3.90L 981116 メニューから選ぶスペルチェックは全チェックの簡単なUIに。
BOOL fSplchkCur = (mode == 1); // カーソル位置の単語
PROOF_DIALOG _context;
PROOF_DIALOG* context = &_context;
mchar buff[CCHWORD];
HDIALOG hd;
BOOL ret = FALSE;
//uiRegisterWord("c:\\_wz\\u_spell.dic","","ユーザ辞書へ登録");return TRUE;
//
structClear(*context);
context->text = text;
proofstyleLoad("前回のスペルチェック",context);
splchkOpenTempDic(context);
if (fSplchkCur) {
context->fSplchkCur = !(text->fClip && !text->fClipSearch) && (isalpha(txGetChar(text)) || isalpha(txGetPrevChar(text)));
}
if (fSplchkCur) {
if (context->fSplchkCur) {
// カーソル位置の検査では、「前回のスペルチェック」の設定を使う。
splchkExec(context,NULL);
ret = TRUE;
} else {
// カーソル位置の検査でカーソル位置が英単語でなければ何もしない。
}
} else {
sprintf_A(buff,"スペルチェック%s",context->fSplchkCur ? " - カーソル位置の単語" : "");
hd = dialog(buff);
//
dialogAddSpellCheck(hd,context,TRUE);
dialogSetDlgproc(hd,dlgprocSpellCheck);
dialogLFV(hd);
dialogOK(hd,14);
dialogCancel(hd,14);
dialogSpaceV(hd);
dialogControlID(hd,IDD_STYLE);
dialogCmd(hd,"スタイル(&Q)...",14);
if (dialogOpen(hd)) {
proofstyleSave("前回のスペルチェック",context);
splchkExec(context,NULL);
ret = TRUE;
}
}
splchkCloseTempDic(context);
return ret;
}
BOOL txIDM_UISPLCHK(TX* text)
{
return _txuiSpellCheck(text,0);
}
BOOL txIDM_UISPLCHKCUR(TX* text)
{
return _txuiSpellCheck(text,1);
}
#if WZFUNC_EDITOR
static BOOL txdicSearchCategory(TX* text,mchar* szCategory)
{
txJumpFileTop(text);
while(1) {
if (txSearchEx(text,".#",SEARCH_CUR|SEARCH_PARATOP)) {
if (txCmpParaOffset(text,szCategory,2)) return TRUE;
if (!txNextPara(text)) break;
} else {
break;
}
}
return FALSE;
}
static void txdicDeleteCategory(TX* text,mchar* szCategory)
{
if (txdicSearchCategory(text,szCategory)) {
txSelectEx(text,CLIP_CHAR);
if (txNextPara(text) && txSearchEx(text,".#",SEARCH_CUR|SEARCH_PARATOP)) {
} else {
txJumpFileEnd(text);
}
txSelectDelete(text);
}
}
static void txdicCopyCategory(TX* text,mchar* szCategory,TX* textDst)
{
if (txdicSearchCategory(text,szCategory)) {
txSelectEx(text,CLIP_CHAR);
if (txNextPara(text) && txSearchEx(text,".#",SEARCH_CUR|SEARCH_PARATOP)) {
} else {
txJumpFileEnd(text);
}
txJumpFileEnd(textDst);
txInsertTextSelect(textDst,text);
}
}
static void txdicSwapSrcDst(TX* text,mchar* szCategory)
{
if (txdicSearchCategory(text,szCategory)) {
if (txNextPara(text)) {
while(1) {
if (txCmpIParatop(text,".#")) break;
{
mchar* pTop = text->buff + text->cur;
mchar* pEnd = pTop + txGetParaContentLen(text);
mchar* p = memchr(pTop,CHAR_TAB,pEnd - pTop);
if (p) {
mchar* sz = strdupLen(pTop,p - pTop);
txDeleteBytes(text,p - pTop + 1);
pTop = text->buff + text->cur;
pEnd = pTop + txGetParaContentLen(text);
p = memchr(pTop,CHAR_TAB,pEnd - p);
if (p) {
txRightBytes(text,p - pTop);
} else {
txJumpParaEnd(text);
}
txInsertChar(text,CHAR_TAB);
txInsert(text,sz);
free(sz);
}
}
if (!txNextPara(text)) break;
}
}
}
}
static TX* ProofDicMake(PROOF_DIALOG* context)
{
mchar szfilenameDic[CCHPATHNAME];
TX* text = textopen(pathFullConfig(szfilenameDic,"proof.dic"));
TX* textDst = textopen(NULL);
#if UNIX
kcToTBEx(text,KC_SJIS);
#endif
switch(context->kutoten) {
case 1: txdicCopyCategory(text,"KUTOTEN_to_SIRO",textDst);break;
case 2: txdicCopyCategory(text,"KUTOTEN_to_KURO",textDst);break;
}
switch(context->buntai) {
case 1: {
txdicCopyCategory(text,"DEARU_DESUMASU",textDst);
txdicSwapSrcDst(textDst,"DEARU_DESUMASU");
//dialogaText(textDst,NULL);
break;
}
case 2: {
txdicCopyCategory(text,"DEARU_DESUMASU",textDst);
break;
}
}
switch(context->kanji_kana) {
case 1: {
txdicCopyCategory(text,"KANJI_KANA",textDst);
txdicSwapSrcDst(textDst,"KANJI_KANA");break;
break;
}
case 2: txdicCopyCategory(text,"KANJI_KANA",textDst);break;
}
if (context->kuten_brace) txdicCopyCategory(text,"KUTEN_BRACE",textDst);
if (context->suffix_kana) txdicCopyCategory(text,"SUFFIX_KANA",textDst);
if (context->reader) txdicCopyCategory(text,"READER",textDst);
if (context->homophone) txdicCopyCategory(text,"HOMOPHONE",textDst);
if (context->itaiji) txdicCopyCategory(text,"ITAIJI",textDst);
if (context->ukemi) txdicCopyCategory(text,"UKEMI",textDst);
if (context->strong) txdicCopyCategory(text,"STRONG",textDst);
if (context->sijisi) txdicCopyCategory(text,"SIJISI",textDst);
if (context->ranuki) txdicCopyCategory(text,"RANUKI",textDst);
if (context->hitei) txdicCopyCategory(text,"HITEI",textDst);
if (context->josi_continue) txdicCopyCategory(text,"JOSI_CONTINUE",textDst);
if (context->digit_zenhan) txdicCopyCategory(text,"DIGIT_ZENHAN",textDst);
if (context->fCheckLongPara) {
txJumpFileEnd(textDst);
txInsertf(textDst,"\t%d\t,,LONGPARA",context->lcxLongPara * 2);
txInsertReturn(textDst);
}
textclose(text);
// 辞書が空ならNULLを返す
if (txGetTextSize(textDst)) return textDst;
textclose(textDst);return NULL;
}
static void listFlushProofDeleteArea(LIST* list,IFILE adrTop,IFILE adrEnd,WORD_STANDARDIZE_ITEM* notdelete)
{
// adrTopからadrEnd(adrEndは含まない)にかかるアイテムを削除する
WORD_STANDARDIZE_ITEM* cur0 = listReadCur(list);
WORD_STANDARDIZE_ITEM* now = (LPVOID)list->top;
for (;now;) {
WORD_STANDARDIZE_ITEM* next = (LPVOID)now->head.next;
if (now != notdelete) {
if (adrTop <= now->adrFind && now->adrFind < adrEnd) {
listDel(list,now);
} else if (adrTop <= now->adrFind+now->lchFind && now->adrFind+now->lchFind < adrEnd) {
listDel(list,now);
}
}
now = next;
}
listJumpItem(list,cur0);
}
static void listFlushProofReplace(LIST* list,IFILE adrFind,int lchFind,int lchReplace,WORD_STANDARDIZE_ITEM* src)
{
// srcのadrFind:lchFindをlchReplaceに置き換えたとき、他のリストアイテムの位置を移動する。
WORD_STANDARDIZE_ITEM* now = (LPVOID)list->top;
int d = lchReplace - lchFind;
for (;now;now = (LPVOID)now->head.next) {
if (now != src) {
if (now->adrFind <= adrFind && adrFind < now->adrFind + now->lchFind) {
// srcを完全に含む場合は、長さを調整する。
now->lchFind += d;
}
if (now->adrFind >= adrFind) {
now->adrFind += d;
}
}
}
}
static void proofOpenContextMenu(HWND hwnd,BOOL fByKey);
static BOOL issepastr(mchar* str)
{
// strが|で区切られたものかどうか返す
return strchr(str,'|');
}
static BOOL proofProcCmd(HWND hwnd,int id)
{
HDIALOG hd = dialogFromHwnd(hwnd);
PROOF_DIALOG* context = (LPVOID)dialogGetCustdata(hd);
LIST* list = listh_GetList(GetDlgItem(hwnd,IDD_LIST));
TX* text = context->text;
if (context->fSplchkMode && id == IDD_SPLCHK) {
if (context->fSpellChecked) id = IDD_EXEC;
}
switch(id) {
case IDD_SPLCHK:
case IDD_START: {
if (context->fSearching) {
_fBreaked = TRUE;
} else {
context->fSearching = TRUE;
dialogRead(hd);
#if 1//WZ4.00Ec 010129 用語統一で前回使用した辞書を覚えるようにした。
proofstyleSave("前回の校正",context);
#else
if (!context->fReWording) proofstyleSave("前回の校正",context);
#endif
{
int ret = 0;
EnableDlgItem(hwnd,IDD_EXEC,FALSE);
EnableDlgItem(hwnd,IDD_EXECALL,FALSE);
EnableDlgItem(hwnd,IDD_DELETE,FALSE);
EnableDlgItem(hwnd,IDCANCEL,FALSE);
SetDlgItemText_A(hwnd,id,"中止");
_fBreaked = FALSE;
_hdlg = hwnd;
listDelAll(list);
if (!context->fSplchkMode) {
UINT mode = 0;
#if __TXC__
mode |= SPLCHK_TXC;
#endif
if (!context->fReWording) {
TX* textDic = ProofDicMake(context);
//dialogaText(textDic,NULL);
if (textDic) {
ret += txWordStandardize(context->text,textDic,list,mode,AbortProc);
textclose(textDic);
}
}
if ((context->fReWording || context->fWordStandardize) && context->szfilenameDic[0] && !_fBreaked) {
TX* textDic = textopen(context->szfilenameDic);
ret += txWordStandardize(context->text,textDic,list,mode,AbortProc);
textclose(textDic);
}
}
if (context->fSpellCheck && !_fBreaked) {
ret += splchkExec(context,list);
}
listJumpTop(list);
listNotifySelchange(list);
EnableDlgItem(hwnd,IDCANCEL,TRUE);
if (context->fSplchkMode) {
context->fSpellChecked = TRUE;
EnableDlgItem(hwnd,IDD_SAME,TRUE); //WZ4.00Bf 990524 hd->hwnd
EnableDlgItem(hwnd,IDD_DELETE,TRUE);//WZ4.00Bf 990524 hd->hwnd
EnableDlgItem(hwnd,IDD_START,TRUE); //WZ4.00Bf 990524 hd->hwnd
SetDlgItemText_A(hwnd,id,id == IDD_SPLCHK ? "修正(&X)" : "再調査(&S)");
} else {
SetDlgItemText_A(hwnd,IDD_START,"調査");
}
{
BOOL f = !!list->n;
EnableDlgItem(hwnd,IDD_EXEC,f);
EnableDlgItem(hwnd,IDD_EXECALL,f);
EnableDlgItem(hwnd,IDD_DELETE,f);
}
SetFocus(list->hwnd);
_hdlg = NULL;
//
statprintf("%d個あります",ret);
if (_fBreaked) statprintf("中止しました");
}
context->fSearching = FALSE;
}
return TRUE;
}
case IDD_DELETE: {
if (!context->fSearching) {
WORD_STANDARDIZE_ITEM* item = listWalkStart(list);
for (;item;) {
WORD_STANDARDIZE_ITEM* next = listWalkNext(list,item);
sbAddHist(context->sbSplchkTempDic,item->szFind); // 一時辞書に記憶
listDel(list,item);
item = next;
}
listDispAll(list);
}
break;
}
case IDD_DELETEALL: {
//WZ4.00Bl 990909 「用語統一|操作|同じ綴りを全て無視」でアプリエラーになる場合があったのを修正。
if (listReadCur(list)) {
WORD_STANDARDIZE_ITEM item = *(WORD_STANDARDIZE_ITEM*)listReadCur(list);
WORD_STANDARDIZE_ITEM* now;
sbAddHist(context->sbSplchkTempDic,item.szFind); //一時辞書に記憶
listSelectQuit(list);
for (now = (LPVOID)list->top;now;) {
WORD_STANDARDIZE_ITEM* next = (LPVOID)now->head.next;
if (!strcmp(now->szFind,item.szFind)) {
listDel(list,now);
}
now = next;
}
listDispAll(list);
listNotifySelchange(list);
}
break;
}
case IDD_EXECALL:
case IDD_EXEC: {
BOOL fAll = (id == IDD_EXECALL);
WORD_STANDARDIZE_ITEM* item = fAll ? list->top : listWalkStart(list);
int nReplace = 0;
int i = 0;
int per0 = 0;
txSetUndisp(text);
txSelectQuit(text);
for (;item;item = fAll ? item->head.next : listWalkNext(list,item),i++) {
if (!item->fDisReplaceable) {
mchar* pInsert = item->szReplace;
int lch;
if (fAll) {
int per = (i * 100) / list->n;
if (per0 != per) {per0 = per;statprintf("%d%%",per);}
}
if (issepastr(item->szReplace)) {
pInsert = sepastrGetIndexStr(item->szReplace,item->head.iMultiString,&lch);
} else {
lch = strlen(pInsert);
}
if (pInsert[0] == '<') {
// コメント、指摘
} else {
mchar* pComment = memchr(pInsert,'<',lch);
int lchReplace = pComment ? pComment - pInsert : lch;
txJumpAddress(text,item->adrFind);
txDeleteBytes(text,item->lchFind);
txInsertBuff(text,pInsert,lchReplace);
nReplace++;
//
listFlushProofReplace(list,item->adrFind,item->lchFind,lchReplace,item);
item->lchFind = lchReplace;
// 済みにセット
item->fReplaced = TRUE;
}
}
}
listDispAll(list);
listNotifySelchange(list);
txSetDisp(text);
statprintf("%d個、置換しました",nReplace);
if (id == IDD_EXEC && i == 1) listUserDown(list);
return TRUE;
}
case IDD_CLEAR: {
memset(&context->configTop,0,&context->configEnd - &context->configTop);
dialogWrite(hd);
PostMessage(hwnd,WM_TXUSER,0,0);
return TRUE;
}
case IDD_STYLE: {
int ret = 0;
dialogRead(hd);
ret = uistyle(context);
if (ret == IDOK) dialogWrite(hd);
PostMessage(hwnd,WM_TXUSER,0,0);
return TRUE;
}
case IDD_FLONGPARA:
case IDD_WS: {
PostMessage(hwnd,WM_TXUSER,0,0);
break;
}
case IDD_WSEDIT: {
dialogRead(hd);
forkstd(context->szfilenameDic,NULL);
break;
}
case IDD_SPLCHK_DETAIL: {
HDIALOG hd = dialog("スペルチェックの詳細");
dialogAddSpellCheck(hd,context,FALSE);
dialogOpen(hd);
break;
}
case IDD_SAME: {
WORD_STANDARDIZE_ITEM* item = listReadCur(list);
WORD_STANDARDIZE_ITEM* now;
int n = 0;
listSelectQuit(list);
for (now = (LPVOID)list->top;now;now = (LPVOID)now->head.next) {
if (!strcmp(now->szFind,item->szFind)) {
listSelectItem(list,now);n++;
// スペルチェックの場合は、候補も同じものにセットする。
now->head.iMultiString = item->head.iMultiString;
}
}
listDispAll(list);
listNotifySelchange(list);
statprintf("%d個あります",n);
break;
}
case IDD_UNDO: {
WORD_STANDARDIZE_ITEM* item = listWalkStart(list);
for (;item;item = listWalkNext(list,item)) {
if (!item->fDisReplaceable && !item->fDisUndoable && !item->fEdited) {
int lch0 = item->lchFind;
txJumpAddress(text,item->adrFind);
txDeleteBytes(text,item->lchFind);
//
item->lchFind = strlen(item->szFind);
txInsert(text,item->szFind);
//
listFlushProofReplace(list,item->adrFind,lch0,item->lchFind,item);
// 済みをリセット
item->fReplaced = FALSE;
}
}
listDispAll(list);
listNotifySelchange(list);
break;
}
case IDD_MENU: {
proofOpenContextMenu(hwnd,TRUE);
break;
}
case IDD_EDIT: {
WORD_STANDARDIZE_ITEM* item = listReadCur(list);
listNotifySelchange(list); // 表示をフラッシュ
if (item) {
HDIALOG hd = dialog("編集");
int ly0 = text->ly;
TX* text2 = txAllocText(0);
text2->fEnableUndo = TRUE;
text2->tabsize = text->tabsize;
// text2->fSetWidthByWindow = TRUE;
txOpenText(text2);
{
IFILE adrTop;
txSetUndisp(text);
txJumpAddress(text,item->adrFind);
txJumpParaTop(text);
adrTop = txGetAddress(text);
{
int cch = txGetParaContentLen(text) + 10;
IFILE adr2 = item->adrFind - adrTop;
mchar* buff = malloc(cch);
txGetParaEx(text,buff,cch);
txInsert(text2,buff);
txJumpAddress(text2,adr2);
txSelectEx(text2,CLIP_MOUSE);
//information("%d %d",adr2 + item->lchFind,txGetTextSize(text2));
txJumpAddress(text2,adr2 + item->lchFind);
}
listNotifySelchange(list);
txSetDisp(text);
}
dialogEditWz(hd,"段落の内容(&C):",text2,60,10,WS_VSCROLL|WS_HSCROLL);
dialogLFV(hd);
dialogControlID(hd,IDOK);dialogCmdDefault(hd,"&OK",10);
dialogCancel(hd,10);
if (dialogOpen(hd)) {
txSetUndisp(text);
txSelectQuit(text);
//
txJumpAddress(text,item->adrFind);
txJumpParaTop(text);
{
IFILE size0 = txGetTextSize(text);
IFILE adrFind = txGetAddress(text);
txDeletePara(text);
{
IFILE lchFind = size0 - txGetTextSize(text);
IFILE adr0 = txGetAddress(text);
txInsertText(text,text2);
txInsertReturn(text);
{
IFILE lch = txGetAddress(text) - adr0;
listFlushProofDeleteArea(list,adrFind,adrFind+lchFind,item);
listFlushProofReplace(list,adrFind,lchFind,lch,item);
item->fDisReplaceable = TRUE;
item->fDisUndoable = TRUE;
item->fEdited = TRUE;
item->fReplaced = TRUE;
item->lchFind = lch;
item->adrFind = adrFind;
}
}
}
listDispAll(list);
listNotifySelchange(list);
txSetLy(text,ly0);
txSetDisp(text);
}
textclose(text2);
}
break;
}
}
return FALSE;
}
static void proofOpenContextMenu(HWND hwnd,BOOL fByKey)
{
HDIALOG hd = dialogFromHwnd(hwnd);
PROOF_DIALOG* context = (LPVOID)dialogGetCustdata(hd);
LIST* list = listh_GetList(GetDlgItem(hwnd,IDD_LIST));
if (listReadCur(list)) {
HMENU hmenu = menuNew();
int cmd;
menuStr(hmenu,"無視(&D)",IDD_DELETE);
menuStr(hmenu,"同じ綴りを全て無視(&F)",IDD_DELETEALL);
menuSepa(hmenu);
menuStr(hmenu,"同じ綴りを全て選択(&S)",IDD_SAME);
menuSepa(hmenu);
menuStr(hmenu,"編集(&E)",IDD_EDIT);
menuStr(hmenu,"修正(&X)",IDD_EXEC);
menuStr(hmenu,"元に戻す(&U)",IDD_UNDO);
menuSepa(hmenu);
// menuStr(hmenu,"先頭を大文字にする(&T)",IDD_Aaa);
if (fByKey) {
RECT r;
listGetItemRect(list,&r);
ClientToScreen(list->hwnd,(LPVOID)&r);// warning OK
cmd = menuSelectXY(hmenu,r.left,r.top);
} else {
cmd = menuSelectMouse(hmenu);
}
if (cmd > 0) {
proofProcCmd(hwnd,cmd);
}
} else {
information("操作対象を一覧から選んでください"); //WZ4.00Bm 990928 一覧が空のときに校正の操作メニューが出ない説明を付けた。
}
}
static int keyhookProc(WPARAM wParam,LPARAM lParam)
{
if (wParam == VK_MENU) return TRUE;
return FALSE;
}
BOOL CALLBACK dlgprocProof(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
PROOF_DIALOG* context = (LPVOID)dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
LIST* list = listh_GetList(GetDlgItem(hwnd,IDD_LIST));
WORD_STANDARDIZE_ITEM item;
SUBLISTITEMATR* atr = &list->tSubitem[0];
list->fNoHeaderTrack = TRUE; //WZ4.00Cc 000122 用語統一/自動校正でヘッダカラム幅を変更できないようにした。
//
#if !UNIX
listSetHfont(list,GetStockObject(DEFAULT_GUI_FONT));
#endif
//
atr->type = LISTITEM_CHOICEB;
atr->offset = (LPBYTE)&item.fReplaced - (LPBYTE)&item;
atr->cx = dtcxListString(list,"済");
atr->tszIndex = _tszReplaced;
atr++;
atr->type = LISTITEM_INT;
atr->offset = (LPBYTE)&item.npara - (LPBYTE)&item;
atr->cx = dtcx(DTCX * 5);
strcpy(atr->szGuide,"段落");
atr++;
atr->type = LISTITEM_SZ;
atr->offset = (LPBYTE)item.szFind - (LPBYTE)&item;
atr->cx = dtcx(DTCX * 20);
strcpy(atr->szGuide,"検出単語");
atr++;
atr->type = LISTITEM_SZ;
atr->offset = (LPBYTE)item.szReplace - (LPBYTE)&item;
atr->fMultiString = TRUE;
atr->cx = -1;
strcpy(atr->szGuide,"置換候補");
atr++;
//
list->nSubitem = atr - &list->tSubitem[0];
listHeaderSetup(list);
//
EnableDlgItem(hwnd,IDD_EXEC,FALSE);
EnableDlgItem(hwnd,IDD_EXECALL,FALSE);
PostMessage(hwnd,WM_TXUSER,0,0);
break;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
if (proofProcCmd(hwnd,id)) return TRUE;
break;
}
case WM_NOTIFY: {
LISTNOTIFY* notify = lParam;
LIST* list = listh_GetList(GetDlgItem(hwnd,IDD_LIST));
if (list && notify->hdr.hwndFrom == list->hwnd) {
switch(notify->hdr.code) {
case LISTN_SELCHANGE: {
WORD_STANDARDIZE_ITEM* item = listReadCur(list);
if (item) {
TX* text = context->text;
txSetUndisp(text);
txSelectQuit(text);
txJumpAddress(text,item->adrFind);
txSelectEx(text,CLIP_CHAR);text->fClipSearch = TRUE;
txRightBytes(text,item->lchFind);
txSetLy(text,2); // ダイアログに重ならないように
txSetDisp(text);
}
break;
}
case LISTN_FORWARD: {
switch(notify->message) {
case WM_KEYDOWN: {
switch(notify->wParam) {
case VK_DELETE: PostMessage(hwnd,WM_COMMAND,IDD_DELETE,0);break;
}
break;
}
case WM_SYSKEYDOWN: {
switch(notify->wParam) {
case VK_RETURN: {
#if 0 // ダイアログでAlt+Enterを押すとビープ音が出てしまうが、以下では抑止できなかった。
BYTE buff[256];
GetKeyboardState(buff);
buff[VK_MENU] &= 0x7E;
SetKeyboardState(buff);
//
hwndControlProcWmKey(hwnd);
//
keyhookStart(keyhookProc);
keyhookEnd();
#endif
#if 0 //WZ4.00Ca 991128
{
int n = sbGetCount(context->sbSplchkTempDic);int i;
for (i = 0;i < n;i++) printf("%s\n",sbRead(context->sbSplchkTempDic,i));
information("%d",sbiSearchLen(context->sbSplchkTempDic,"API45",3));
}
#endif
// proofOpenContextMenu(hwnd,TRUE);
return TRUE;
}
}
break;
}
#if !WINDOWSCE
case WM_RBUTTONDOWN: {
proofOpenContextMenu(hwnd,FALSE);
break;
}
#endif
}
break;
}
}
}
if (notify->hdr.hwndFrom == GetDlgItem(hwnd,IDD_LIST)) {
HD_NOTIFY* header = (LPVOID)lParam;
if (header->hdr.code == HDN_ITEMCLICK) {
int iSubitem = listHeaderConvertIndex(list,header->iItem);
WORD_STANDARDIZE_ITEM* item = listReadCur(list);
listSort(list,iSubitem,(context->iSubitemSort == iSubitem));
context->iSubitemSort = (context->iSubitemSort == iSubitem) ? -1 : iSubitem;
listJumpItem(list,item);
#if 0//WZ4.00Cc 000122
} else if (header->hdr.code == HDN_BEGINTRACK) {
statprintf("幅は変更できません");
return TRUE; // 幅の変更不可
#endif
}
}
break;
}
case WM_TXUSER: {
BOOL f = (context->fReWording) ? TRUE : IsDlgButtonChecked(hwnd,IDD_WS);
EnableDlgItem(hwnd,IDD_WSDIC,f);
EnableDlgItem(hwnd,IDD_WSEDIT,f);
//
f = IsDlgButtonChecked(hwnd,IDD_FLONGPARA);
EnableDlgItem(hwnd,IDD_LONGPARA,f);
break;
}
}
return FALSE;
}
static BOOL _txuiProof(TX* text,int mode)
{
// mode == 1: スペルチェック(廃止)
// mode == 2: 用語統一 //WZ3.90L 981116
BOOL fReWording = (mode == 2);
BOOL fSplchk = (mode == 1);
HDIALOG hd = dialog(fReWording ? "用語統一" : (fSplchk ? "スペルチェック" : "校正"));
PROOF_DIALOG contextBody;
PROOF_DIALOG* context = &contextBody;
HSTRBLK sb = historyOpen("proofWsDic",4096);
DTRECT r;
DTRECT r0;
IFILE adr0 = txGetAddress(text);
//
structClear(*context);
context->text = text;
proofstyleLoad("前回の校正",context);
splchkOpenTempDic(context);
//context->fSpellCheck = TRUE;
// pathFullConfig(context->szfilenameDic,"vc.dic");
//
dialogSetDlgproc(hd,dlgprocProof);
dialogSetCustdata(hd,context);
context->fReWording = fReWording;
//
if (fSplchk) {
/* インターフェースが難しかったので、逐次で実現した。
context->fSplchkMode = TRUE;
context->fSpellCheck = TRUE;
dialogAddSpellCheck(hd,context,TRUE);
dialogSpaceV(hd);dialogSpaceV(hd);dialogSpaceV(hd);dialogSpaceV(hd);
dialogSpaceV(hd);dialogSpaceV(hd);dialogSpaceV(hd);dialogSpaceV(hd);
dialogSpaceV(hd);dialogSpaceV(hd);dialogSpaceV(hd);dialogSpaceV(hd);
*/
} else {
if (!fReWording) {
dialogHeadline(hd,"統一",26);
dialogChoiceB(hd,"句読点(&I):",10,&context->kutoten,16,"調査しない","、。",",.",NULL);
dialogChoiceB(hd,"文体(&F):",10,&context->buntai,16,"調査しない","です・ます調","だ・である調",NULL);
dialogCaptionGuide(hd,"漢字と仮名の多用(&K):");
dialogChoiceB(hd,NULL,0,&context->kanji_kana,16,"調査しない","仮名を多用","漢字を多用",NULL);
dialogCheckB(hd,"同音異義語(&H)",&context->homophone);
dialogCheckB(hd,"閉じ括弧の句点(&B)",&context->kuten_brace);
dialogGetPos(hd,&r0);
dialogCheckB(hd,"送り仮名を本則に(&O)",&context->suffix_kana);
dialogCheckB(hd,"リーダー記号(&R)",&context->reader);
}
// 用語統一
if (!fReWording) {
dialogControlID(hd,IDD_WS);
dialogCheckB(hd,"用語統一(&W)",&context->fWordStandardize);
}
dialogSetH(hd);
dialogControlID(hd,IDD_WSDIC);
#if !__TXC__
{
//WZ3.90L 981116 用語統一辞書の拡張子はRELにした。
mchar szpath[CCHPATHNAME];
CONFIGAPP app;
configappLoad(&app);strcpy(szpath,app.dicpath);if (szpath[0]) pathSetDir(szpath);
pathSetFileName(szpath,"*.rel");
dialogControlRefer(hd,szpath);
//information(szpath);
}
#endif
dialogControlStrblkHist(hd,sb);
dialogString(hd," 辞書:",7,context->szfilenameDic,CCHPATHNAME,35);
dialogControlID(hd,IDD_WSEDIT);
dialogPushbutton(hd,"編集",5);
dialogSetV(hd);
//
if (!fReWording) {
dialogSetPosLX(hd,24);
dialogSetPosY(hd,r0.y - DTCYINT);
dialogSetH(hd);
dialogCheckB(hd,"スペルチェック(&E):",&context->fSpellCheck);
dialogControlID(hd,IDD_SPLCHK_DETAIL);
dialogPushbutton(hd,"詳細(&G)...",10);
dialogSetV(hd);
dialogSetPosLX(hd,24);
dialogSetPosY(hd,r0.y + DTCYBOX + DTCYINT);
//
dialogCheckB(hd,"異体字を現代字に(&L)",&context->itaiji);
dialogCheckB(hd,"全角数字2桁、半角数字1桁(&2)",&context->digit_zenhan);
dialogLFV(hd);
dialogSetPosLX(hd,28);
dialogHeadline(hd,"指摘",30);
//
dialogGetPos(hd,&r0);
dialogSetH(hd);
hd->dtyAdd = DTCYINT;
dialogControlID(hd,IDD_FLONGPARA);
dialogCheckB(hd,"長い段落(&P):",&context->fCheckLongPara);
dialogControlID(hd,IDD_LONGPARA);
dialogControlGuide(hd,"文字",4);
dialogControlUpdown(hd,40,500);
dialogIntegerW(hd,"全角",4,&context->lcxLongPara,6-SFF*2);
dialogSetV(hd);
r0.y += DTCYBOX + DTCYINT;
dialogSetPos(hd,&r0);
//
dialogCheckB(hd,"受け身(&U)",&context->ukemi);
dialogCheckB(hd,"強調表現(&T)",&context->strong);
dialogCheckB(hd,"指示詞(&J)",&context->sijisi);
r0.x += DTCX * 15;
dialogSetPos(hd,&r0);
dialogCheckB(hd,"ら抜き(&V)",&context->ranuki);
dialogCheckB(hd,"否定(&N)",&context->hitei);
dialogCheckB(hd,"助詞の連続(&C)",&context->josi_continue);
}
}
//
dialogLF(hd);
{
int lcxList = 73;
r.y = dialogGetPosY(hd);
if (context->fSplchkMode) {
/* lcxList = 60;
dialogSetPosY(hd,r.y - DTCYKEY);dialogSetPosLX(hd,lcxList-8-1);
dialogCaptionGuide(hd,"一覧(&D):");
*/
} else {
dialogSetPosY(hd,r.y - DTCYBOX);dialogSetPosLX(hd,lcxList-7-SFF);
dialogControlID(hd,IDD_MENU);
dialogPushbutton(hd,"操作(&M)",7+SFF); //WZ3.90L 981116 "メニュー"から"操作"に変更。
//
dialogSetPosY(hd,r.y - DTCYKEY);dialogSetPosLX(hd,lcxList-8-7-1);
#if UNIX
{
int cyInt0 = hd->cyInt;
hd->cyInt = 0;
dialogCaptionDynamic(hd,"一覧 &D:",8);
hd->cyInt = cyInt0;
}
#else
dialogCaptionGuide(hd,"一覧(&D):");
#endif
}
dialogSetPosLX(hd,0);
r.x = dialogGetPosX(hd);
r.cx = DTCX * lcxList;
r.cy = DTCY * 10;
__dialogAddItem(hd,szclassListH,NULL,IDD_LIST,&r,WS_GROUP|WS_TABSTOP|WS_BORDER|WS_CHILD|WS_VISIBLE);
dialogSetPosY(hd,r.y + r.cy + DTCYINT);
}
//
#if 0
dialogSetH(hd);
dialogControlID(hd,IDD_DELETE);
dialogPushbutton(hd,"一覧から除く(&X)",16);
dialogSetV(hd);
#endif
//
dialogLFV(hd);
if (context->fSplchkMode) {
/* dialogControlID(hd,IDD_SPLCHK);
dialogCmdDefault(hd,"調査",17);
dialogControlID(hd,IDCANCEL);
dialogCmd(hd,"閉じる",17);
dialogSpaceV(hd);
dialogControlEnable(hd,FALSE);
dialogControlID(hd,IDD_SAME);
dialogPushbuttonBig(hd,"同じ綴りも訂正(&A)",17);
dialogControlEnable(hd,FALSE);
dialogControlID(hd,IDD_DELETE);
dialogPushbuttonBig(hd,"無視(&Z)",17);
dialogSpaceV(hd);
dialogControlEnable(hd,FALSE);
dialogControlID(hd,IDD_START);
dialogPushbuttonBig(hd,"再調査(&S)",12);
dialogControlID(hd,IDD_STYLE);
dialogPushbuttonBig(hd,"スタイル(&Q)...",12);
*/
} else {
if (!fReWording) {
dialogIndent(hd,-13);
}
dialogControlID(hd,IDD_START);
dialogCmdDefault(hd,"調査",12);
dialogControlID(hd,IDCANCEL);
dialogCmd(hd,"閉じる",12);
dialogSpaceV(hd);
dialogControlID(hd,IDD_EXEC);
dialogCmd(hd,"修正(&X)",12);
dialogControlID(hd,IDD_EXECALL);
dialogCmd(hd,"一括修正(&A)",12);
dialogSpaceV(hd);
dialogControlID(hd,IDD_CLEAR);
dialogCmd(hd,"クリア(&Z)",12);
dialogControlID(hd,IDD_STYLE);
dialogCmd(hd,UNIX?"スタイル(&Q)...":"スタイル(&Q)...",12);
}
//
dialogOpen(hd);
txMarkEx(text,0,adr0); // すぐに元の位置に戻れるように
if (text->fClip) text->fClipMouse = TRUE;
historyClose("proofWsDic",sb);
splchkCloseTempDic(context);
return TRUE;
}
BOOL txIDM_PROOFAUTO(TX* text)
{
return _txuiProof(text,0);
}
BOOL txIDM_UIREWORDING(TX* text)
{
return _txuiProof(text,2);
}
#endif // WZFUNC_EDITOR
#endif // !WINDOWSCE
//##全角と半角の変換
static void FlushDispAc(HWND hwnd)
{
if (GetDlgItem(hwnd,IDD_AUTOCORRECT)) {
BOOL f = IsDlgButtonChecked(hwnd,IDD_AUTOCORRECT);
EnableDlgItem(hwnd,IDD_KATA,f);
EnableDlgItem(hwnd,IDD_HIRA,f);
EnableDlgItem(hwnd,IDD_ALPHABET,f);
EnableDlgItem(hwnd,IDD_NUMBER,f);
EnableDlgItem(hwnd,IDD_SPACE,f);
EnableDlgItem(hwnd,IDD_KIGOU,f);
EnableDlgItem(hwnd,IDD_BRACE,f);
EnableDlgItem(hwnd,IDD_CLEAR,f);
}
}
BOOL CALLBACK dlgprocConvertChar(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_INITDIALOG: {
FORWARD_WM_COMMAND(hwnd,IDD_AUTOCORRECT,NULL,0,PostMessage);
break;
}
case WM_COMMAND: {
int id = GET_WM_COMMAND_ID(wParam,lParam);
int notify = GET_WM_COMMAND_CMD(wParam,lParam);
switch(id) {
case IDD_AUTOCORRECT: {
FlushDispAc(hwnd);
break;
}
case IDD_CLEAR: {
ComboBox_SetCurSel(GetDlgItem(hwnd,IDD_KATA),0);
ComboBox_SetCurSel(GetDlgItem(hwnd,IDD_HIRA),0);
ComboBox_SetCurSel(GetDlgItem(hwnd,IDD_ALPHABET),0);
ComboBox_SetCurSel(GetDlgItem(hwnd,IDD_NUMBER),0);
ComboBox_SetCurSel(GetDlgItem(hwnd,IDD_SPACE),0);
ComboBox_SetCurSel(GetDlgItem(hwnd,IDD_KIGOU),0);
CheckDlgButton(hwnd,IDD_BRACE,FALSE);
return TRUE;
}
}
break;
}
}
return FALSE;
}
void dialogAddConvertChar(HDIALOG hd,CCCONTEXT* ccc)
{
int lxg = 12;
int lcx = 12+SFF;
dialogControlID(hd,IDD_KATA);
dialogControlHelp(hd,116);
dialogChoice(hd,"カタカナ(&K):",lxg,&ccc->modeKata,lcx,"そのまま","半角へ","全角へ","ひらがなへ",NULL);
//
dialogControlID(hd,IDD_HIRA);
dialogControlHelp(hd,117);
dialogChoice(hd,"ひらがな(&N):",lxg,&ccc->modeHira,lcx,"そのまま","半角カタカナへ",NULL);
//
dialogControlID(hd,IDD_ALPHABET);
dialogControlHelp(hd,118);
dialogChoice(hd,"アルファベット(&L):",lxg,&ccc->modeAlphabet,lcx,"そのまま","半角へ","全角へ",NULL);
//
#if 0 ///未実装
dialogControlID(hd,IDD_BRACE);
dialogCheck(hd,"「」を[]へ(&B)",&ccc->fJbraceToBrace);
#endif
//
#if !WINDOWSCE
// dialogCaption(hd,"全角数字2文字を半角に"); // 未完成
// dialogCaption(hd,"半角数字1文字を全角に"); // 未完成
#endif
if (!_pspc) {
dialogLFV(hd);
dialogSpaceH(hd);
lxg = 8+SFF;
}
dialogControlID(hd,IDD_NUMBER);
dialogControlHelp(hd,119);
dialogChoice(hd,"数字(&U):",lxg,&ccc->modeNumber,lcx,"そのまま","半角へ","全角へ",NULL);
//
dialogControlID(hd,IDD_KIGOU);
dialogControlHelp(hd,120);
dialogChoice(hd,"記号(&I):",lxg,&ccc->modeKigou,lcx,"そのまま","半角へ","全て半角へ","全角へ","全て全角へ",NULL); //WZ3.90N 981130 中黒も半角カナに変換する「全て半角へ」を追加。 //WZ4.00Bn 991006 「全て全角へ」を追加。
//
dialogControlID(hd,IDD_SPACE);
dialogControlHelp(hd,121);
dialogChoice(hd,"空白(&S):",lxg,&ccc->modeSpace,lcx,"そのまま","半角へ","全角へ",NULL);
//
dialogLF(hd);//WCE0.94 970921
dialogSpaceV(hd);
dialogControlID(hd,IDD_CLEAR);
dialogControlHelp(hd,122);
dialogPushbutton(hd,"クリア(&Z)",12);
}
// ー・
void ccToCcc(CHARCONVERT* cc,CCCONTEXT* ccc)
{
structClear(*ccc);
ccc->fAutoCollect = cc->fAc;
ccc->fJbraceToBrace = cc->fJbraceToBrace;
ccc->modeKata = (cc->fJkataToKana + cc->fKanaToJkata * 2 + cc->fKanaToJhira * 3);
ccc->modeHira = cc->fJhiraToKana;
ccc->modeAlphabet = cc->fJalphabetToAnk + cc->fAlphabetToJank * 2;
ccc->modeNumber = cc->fJnumberToAnk + cc->fNumberToJank * 2;
ccc->modeSpace = cc->fJspaceToAnk + cc->fSpaceToJank * 2;
if (cc->fKigouToJank) {
ccc->modeKigou = 3 + cc->fZenHanKanaAll;
} else if (cc->fJkigouToAnk) {
ccc->modeKigou = 1 + cc->fZenHanKanaAll;
}
}
void ccFromCcc(CHARCONVERT* cc,CCCONTEXT* ccc)
{
cc->fAc = ccc->fAutoCollect;
cc->fJbraceToBrace = ccc->fJbraceToBrace;
cc->fJkataToKana = (ccc->modeKata == 1);
cc->fKanaToJkata = (ccc->modeKata == 2);
cc->fKanaToJhira = (ccc->modeKata == 3);
//WZ3.90N 981130
cc->fZenHanKanaAll = FALSE;
if (ccc->modeKata == 4) {
cc->fJkataToKana = TRUE;
cc->fZenHanKanaAll = TRUE;
}
//
cc->fJhiraToKana = ccc->modeHira;
cc->fJalphabetToAnk = (ccc->modeAlphabet == 1);
cc->fAlphabetToJank = (ccc->modeAlphabet == 2);
cc->fJnumberToAnk = (ccc->modeNumber == 1);
cc->fNumberToJank = (ccc->modeNumber == 2);
cc->fJspaceToAnk = (ccc->modeSpace == 1);
cc->fSpaceToJank = (ccc->modeSpace == 2);
cc->fJkigouToAnk = (ccc->modeKigou == 1 || ccc->modeKigou == 2);
cc->fKigouToJank = (ccc->modeKigou == 3 || ccc->modeKigou == 4);
cc->fZenHanKanaAll = (ccc->modeKigou == 2 || ccc->modeKigou == 4);
}
static BOOL _txuiConvertChar(TX* text,CHARCONVERT* cc)
{
CCCONTEXT ccc;
HDIALOG hd = dialog("文字の変換");
//WZ3.90N 981130
dialogCaption(hd,text->fClip ? "範囲内の文字を変換します" : "文書のすべての文字を変換します");
dialogSetPosLF(hd);
//
ccToCcc(cc,&ccc);
dialogSetDlgproc(hd,dlgprocConvertChar);
dialogAddConvertChar(hd,&ccc);
if (!_pspc) {
dialogCmdLFV(hd);
dialogOK(hd,12);
dialogCancel(hd,12);
}
if (dialogOpen(hd)) {
ccFromCcc(cc,&ccc);
return TRUE;
}
return FALSE;
}
#if !__TXC__
BOOL TXAPI txuiConvertCharZenhan(TX* text)
{
// 半角文字と全角文字の変換
if (_txuiConvertChar(text,&sh->charconvert)) {
shconfigWriteConfigshare();
#if 1//WCE1.01 980322 MIPSで「半角文字と全角文字の変換」が機能しなかった
{
CHARCONVERT cc;
memcpy(&cc,&sh->charconvert,sizeof(cc));
txCharConvert(text,&cc);
}
#else
txCharConvert(text,&sh->charconvert);
#endif
return TRUE;
}
return FALSE;
}
#endif // !__TXC__
//##表の変換
#if !POCKETWZ && !__TXC__
static BOOL txuiConvertTable(TX* text)
{
// 表の変換
//WZ3.90J 981110 new
if (!txGetEditable(text)) return FALSE; //WZ4.00Ac 990206
if (!text->fTxf) {
information("タグ表示OFFのTMLファイルでしか実行できません");
} else if (!text->fClip) {
information("変換する部分を選択してください");
} else {
HDIALOG hd = dialog("表の変換");
int mode = 0;
{ // setup mode
txWalkStart(text);
if (txfCellGetExist(text)) {
mode = 2;
} else {
mchar szline[CCHLINE];
txGetParaEx(text,szline,CCHLINE);
{
mchar* pTab = strchrlast(szline,CHAR_TAB);
mchar* pCsv = strchrlast(szline,',');
// 最後にTABと','のどちらが出現したかによって認識する。
mode = (pTab > pCsv) ? 0 : 1;
}
}
txWalkEnd(text);
}
dialogControlRadioV(hd);
dialogChoiceRadio(hd,&mode,
"タブ区切りの表 → WZの表",
"カンマ区切りの表 → WZの表",
"WZの表 → タブ区切りの表",
"WZの表 → カンマ区切りの表",
NULL
);
if (dialogOpen(hd)) {
BOOL fToWz = (mode == 0 || mode == 1);
BOOL fFromWz = (mode == 2 || mode == 3);
BOOL fTab = (mode == 0 || mode == 2);
BOOL fCsv = (mode == 1 || mode == 3);
txWalkStart(text);
while(txIsWalking(text)) {
txJumpParaTop(text);
if (fFromWz) {
int i;
for (i = 0;;i++) {
if (!txfCellJumpClm(text,1)) break;
txDeleteChar(text);
if (!txfCellGetExistRear(text)) break;
if (i != 0) {
txInsertChar(text,fTab ? CHAR_TAB : ',');
}
}
} else {
txInsertCell(text);
while(1) {
TXCHAR c = txGetChar(text);
if (txIsCurReturn(text)) break;
if ((fTab && c == CHAR_TAB) || (fCsv && c == ',')) {
txDeleteChar(text);
txInsertCell(text);
}
if (!txRight(text)) break;
}
txInsertCell(text);
}
//
if (!txNextPara(text)) break;
}
if (txPrevPara(text)) {
txfRowSetLineBottom(text,TRUE);
txJumpParaTop(text);txfCellFlush(text);
}
txWalkEnd(text);
return TRUE;
}
}
return FALSE;
}
#endif // !POCKETWZ
//##罫線の変換
#if WINDOWSMT
static mchar _szNEC[] = "「」コカヨルスレケンイョホム、ニヌゼソ瘋オメアユ・ハヘツ艷ナ";
static mchar _szJIS[] = "─━┘└┴┷┛┸┗┻┐┌┬┯│┤┥├┼┝┿┓┰┏┳┃┨┫┠╂┣╋";
BOOL txConvertKeisenNecToJis(TX* text)
{
// ファイル内のNEC罫線をJISに変換
txSetUndispEx(text);
txJumpFileTop(text);
txSetHigh(text);
while(1) {
if (text->buff[text->cur] == 0x86) {//3.00C 971013 84->86 「罫線の変換」バグ対処
TXCHAR ch = txGetChar(text);
mchar* p;
if (p = strchr(_szNEC,ch)) {
txDeleteChar(text);
p = _szJIS + (p - _szNEC);
txInsertChar(text,MAKEWORD(p[1],*p));
} else { //WZ4.00Ei 010523 「NEC・JIS罫線の変換」でハングアップすることがあるのを修正。
if (!txRight(text)) break;
}
} else {
if (!txRight(text)) break;
}
}
txJumpFileTop(text);
txResetHigh(text);
txSetDispEx(text);
return TRUE;
}
BOOL txConvertKeisenJisToNec(TX* text)
{
// ファイル内のJIS罫線をNECに変換
txSetUndispEx(text);
txJumpFileTop(text);
txSetHigh(text);
while(1) {
if (text->buff[text->cur] == 0x84) {//3.00C 971013 86->84 「罫線の変換」バグ対処
TXCHAR ch = txGetChar(text);
mchar* p;
if (p = strchr(_szJIS,ch)) {
txDeleteChar(text);
p = _szNEC + (p - _szJIS);
txInsertChar(text,MAKEWORD(p[1],*p));
} else { //WZ4.00Ei 010523
if (!txRight(text)) break;
}
} else {
if (!txRight(text)) break;
}
}
txJumpFileTop(text);
txResetHigh(text);
txSetDispEx(text);
return TRUE;
}
static BOOL txuiConvertKeisen(TX* text)
{
// 罫線の変換
//WZ3.90J 981110 new
HDIALOG hd;
int modeConvertKeisen = 0; // permanent
if (!txGetEditable(text)) return FALSE; //WZ4.00Ac 990206
//
hd = dialog("罫線の変換");
dialogCaption(hd,"文書のすべての罫線文字コードを変換します");
//
dialogControlRadioV(hd);
dialogChoiceRadio(hd,&modeConvertKeisen,
"JIS罫線をNEC罫線に変換(&N)",
"NEC罫線をJIS罫線に変換(&J)",
NULL
);
if (dialogOpen(hd)) {
switch(modeConvertKeisen) {
case 0:return txConvertKeisenJisToNec(text);
case 1:return txConvertKeisenNecToJis(text);
}
}
return FALSE;
}
#endif // WINDOWSMT
//##マクロ
#if WZFUNC_TXC
BOOL txIDM_MACRO_HELP(TX* text)
{
wchar wsz[CCHPATHNAME];
#if __DEV__
wpathFullConfig(wsz,L"txc.tml");
#elif UNIX
wpathFullConfig(wsz,L"txc/txc.tml");
#else
wpathFullConfig(wsz,L"txc\\txc.tml");
#endif
forkstdW(wsz,UNIX?L"-v":L"/v");
return TRUE;
}
BOOL txIDM_MACRO_HELPAPI(TX* text)
{
wchar wsz[CCHPATHNAME];
#if __DEV__
wpathFullConfig(wsz,L"api.tml");
#elif UNIX
wpathFullConfig(wsz,L"txc/api.tml");
#else
wpathFullConfig(wsz,L"txc\\api.tml");
#endif
{
NPARA npara = 1;
TX* text2 = textopenExW(wsz,TXO_TML);
if (text2) {
mchar szfind[CCHWORD];
txGetWordAfterEx(text,szfind,CCHWORD);
//information(szfind);
if (txSearchEx(text2,szfind,SEARCH_WORD|SEARCH_PARATOP)) {
} else {
mchar szfindtx[CCHWORD];
strcpy(szfindtx,"tx");
sstrcat(szfindtx,szfind);
txSearchEx(text2,szfindtx,SEARCH_WORD|SEARCH_NOSENSECASE|SEARCH_PARATOP);
}
npara = text2->npara;
}
textclose(text2);
//winformation(L"%s %d",wsz,npara);
{
wchar wsw[CCHWORD];
#if UNIX
sprintf_W(wsw,L"-v -j%d",npara);
#else
sprintf_W(wsw,L"/v /j%d",npara);
#endif
forkstdW(wsz,wsw);
}
}
return TRUE;
}
#endif
//##プラグイン
#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) {
#if !WINDOWSCE
case IDM_UIREWORDING: { // サンプル
statprintf("用語統一 by macro");
txIDM_UIREWORDING(text);
return HOOK_CAPTURE;
}
case IDM_PROOFAUTO: { // サンプル
statprintf("校正 by macro");
txIDM_PROOFAUTO(text);
return HOOK_CAPTURE;
}
case IDM_UISPLCHK: { // サンプル
statprintf("スペルチェック by macro");
txIDM_UISPLCHK(text);
return HOOK_CAPTURE;
}
case IDM_UICONVERTTEXT: { // サンプル
statprintf("テキストの変換 by macro");
txIDM_UICONVERTTEXT(text);
return HOOK_CAPTURE;
}
case IDM_SEARCHFUNCTION: { // サンプル
statprintf("関数定義の検索 by macro");
txIDM_SEARCHFUNCTION(text);
return HOOK_CAPTURE;
}
#endif
case IDM_UIINFO: { // サンプル
statprintf("文書の情報 by macro");
txIDM_UIINFO(text);
return HOOK_CAPTURE;
}
}
}
return HOOK_CONTINUE;
}
void __on_txFrameNew(TX* text)
{
txSetHookWndproctextTxpcode(text,wndprocTextHook);
}
void __pluginHelp(TX* text)
{
// test
information("HELP");
}
void __pluginConfig(TX* text)
{
// test
information("CONFIG");
}
#endif