home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2002 March
/
VPR0203B.ISO
/
APUPDATE
/
VC
/
TXC0601H
/
TXC0601H.LZH
/
_IDMFILE.C
< prev
next >
Wrap
C/C++ Source or Header
|
2001-04-19
|
26KB
|
1,031 lines
/*
FILE関係のIDMコマンド処理群
Start 99年11月19日
*/
#if __TXC__
#include <_wz.h>
#include <windows.h>
#include <windowsx.h>
#include <_idm.h>
#else
#include "_sys.h"
#endif
#include "_idmlib.h"
//##基本
#if WZFUNC_EDITOR
BOOL txuiFileOpenPrim(TX* text,int modeFileOpen,TXOFN_ARG* arg)
{
// text=NULLでもいい
wchar wszfilename[CCHPATHNAME] = {0};
#if 0//WCE0.99A 970924 2回聞いてた
if (sh->modeFileOpen == FILEOPEN_CLOSEOPEN && text) {
if (!txuiIsClose(text)) return FALSE;
}
#endif
//WCE0.91 970906 「ファイル|最近開いたファイル」で「開く」をするとアプリケーションエラーになった
if (text) wstrcpy(wszfilename,text->wszfilename);
#if WINDOWSCE //WZ4.00Ac 990205 PWZ:無題ファイルやWZ ICONから「ファイルを開く」したとき、標準フォルダを始めに表示するようにした。
if (wszfilename[0] == 0) {pathtowpath(sh->szFolderDefault,wszfilename);wpathSetDir(wszfilename);}
#endif
if (txuiGetOpenFileNameW(text,wszfilename,NULL,arg)) {
//winformation(wszfilename);
#if 0 //WCE0.95 970923 「ファイル|開く」でEXEファイルを指定すると、EXEが起動した
if (wpathIsExt(wszfilename,L".exe")) {
shellOpenW(wszfilename);
//winformation(wszfilename);
return FALSE;
}
#endif
forkstdPrimW(wszfilename,(arg && arg->fReadonly) ? (UNIX?L"-v":L"/v") : NULL,modeFileOpen);
// osExecW(wszfilename);
return TRUE;
}
return FALSE;
}
#endif
//##保存
static BOOL alltextGetEdit(void)
{
int i;
for (i = 0;i < sh->nOpen;i++) {
HWND cur = textRead(i);
if (cur && SendMessage(cur,WM_TXGETEDIT,0,0)) {
return TRUE;
}
}
return FALSE;
}
static BOOL alltextSave(void)
{
int i;
for (i = 0;i < sh->nOpen;i++) {
HWND cur = textRead(i);
if (cur && SendMessage(cur,WM_TXGETEDIT,0,0)) {
if (!SendMessage(cur,WM_TXUISAVE,0,0)) return FALSE;
}
}
return TRUE;
}
static BOOL uialltextSave(void)
{
if (alltextGetEdit()) {
int ret = question("修正テキストを出力しますか?");
if (ret == IDCANCEL) return FALSE;
if (ret == IDYES) {
if (!alltextSave()) return FALSE;
}
}
return TRUE;
}
BOOL txIDM_UISAVEALL(TX* text)
{
if (!text->fFrame) return FALSE;
alltextSave();
return TRUE;
}
BOOL txIDM_UISAVE(TX* text)
{
return txuiSave(text);
}
BOOL txIDM_UISAVEEDITED(TX* text)
{
if (txGetEdit(text)) return txuiSave(text);
return FALSE;
}
#if WZFUNC_EDITOR
BOOL txIDM_UISAVEAS(TX* text)
{
if (!text->fFrame) return FALSE;//WCE0.92 970918
txuiSaveAs(text);
return TRUE;
}
BOOL txIDM_UISAVEASVZ(TX* text)
{
if (!text->fFrame) return FALSE;//WCE0.92 970918
if (text->mailedit) {
//WZ3.90P 981205 MAIL EDITORでVZキーのEsc-Sで上書き保存するとMAIL EDITOR終了時に書きこみエラーでハングアップ
//WZ3.90P 981205 MAIL EDITORではEsc-Sの操作をできなくした。
if (question("上書き保存します。\nよろしいですか?") == IDYES) {
txuiSave(text);
}
} else {
txuiSaveAsVz(text);
}
return TRUE;
}
#endif
//##閉じる
void txIDM_PRJ_SAVERESUME(TX* text);
static BOOL alltextQuit(TX* text)
{
//WZ4.00Dd 000526 newarg:text for txIDM_PRJ_SAVERESUME
int i;
#if !WINDOWSCE && WZFUNC_EDITOR
txIDM_PRJ_SAVERESUME(text); //WZ4.00Dd 000526
#endif
for (i = 0;i < sh->nOpen;i++) {
HWND cur = textRead(i);
if (cur) {
PostMessage(cur,WM_TXQUITMT,0,0); //WZ4.00Ec 010124 IDM_UIQUITALL等で多重化テキストが閉じないのを改良
}
}
return TRUE;
}
static BOOL txuiQuit(TX* text)
{
// テキストを終了する。エラーなら0を返す
if (!text->fReadOnly && txGetEdit(text)) {
if (wquestion(rcStringW(32),txGetTitleFilenameW(text)) != IDYES) return FALSE;
}
txQuit(text);
return TRUE;
}
#if WZFUNC_EDITOR
BOOL txIDM_UICLOSEALLVZ(TX* text)
{
// エディタを終了(確認メッセージ付き)
if (!text->fFrame) return FALSE;//WCE0.92 970918
if (!uialltextSave()) return FALSE;
if (question("エディタを終了しますか?") == IDYES) return alltextQuit(text);
return FALSE;
}
#endif
BOOL txIDM_UICLOSEALLFORCE(TX* text)
{
// 修正テキストは全保存して終了
//WZ3.90I 981103 new
if (!text->fFrame) return FALSE;
if (alltextSave()) {
alltextQuit(text);
return TRUE;
}
return FALSE;
}
BOOL txIDM_UIQUITALL(TX* text)
{
// 「終了してよいですか?」
if (!text->fFrame) return FALSE;//WCE0.92 970918
if (alltextGetEdit()) {
if (question(rcString(37)) != IDYES) return FALSE;
}
alltextQuit(text);
return TRUE;
}
BOOL txIDM_UISAVECLOSE(TX* text)
{
if (!text->fFrame) return FALSE;
if (txuiSave(text)) {
txuiClose(text);
return TRUE;
}
return FALSE;
}
BOOL txIDM_UIQUIT(TX* text)
{
if (!text->fFrame) return FALSE;//WCE0.92 970918
txuiQuit(text);
return TRUE;
}
BOOL txIDM_UIEXIT(TX* text)
{
if (!text->fFrame) return FALSE;//WCE0.92 970918
txuiCloseAllEvery(text);
return TRUE;
}
BOOL txIDM_UICLOSE(TX* text)
{
if (!text->fFrame) return FALSE;//WCE0.92 970918
txuiClose(text);
return TRUE;
}
//##開く
#if WZFUNC_EDITOR
BOOL txIDM_UICLOSEOPEN(TX* text)
{
if (!text->fFrame) return FALSE;//WCE0.92 970918
if (txuiIsClose(text)) { //WZ3.90L 981125 閉じて開く:保存するかの問い合わせを先に行うようにした。
txuiFileOpenPrim(text,FILEOPEN_CLOSEOPENFORCE,NULL);
return TRUE;
}
return FALSE;
}
void txNew(TX* text,BOOL fNewProcess)
{
// fNewProcessなら必ず新規プロセスを立ち上げる
// そうでなければ、設定による
// textはNULLでもいい
wchar szSw[10 + CCHPATHNAME] = {0};
if (text) {
// 拡張子情報の継承
#if UNIX
sprintf_W(szSw,L"-e\"%s\"",txGetFileExtW(text));
#else
sprintf_W(szSw,L"/e\"%s\"",txGetFileExtW(text));
#endif
};
if (fNewProcess) {
forkexW(NULL,szSw,TXFORK_FORKWZ,NULL);
} else {
forkstdW(NULL,szSw);
}
}
BOOL txIDM_NEW(TX* text)
{
txNew(text,FALSE);
return TRUE;
}
BOOL txIDM_NEWPROCESS(TX* text)
{
txNew(text,TRUE);
return TRUE;
}
#if !__TXC__
BOOL TXAPI txuiFileOpen(TX* text)
{
// text=NULLでもいい
//WZ3.90J 981111 argを指定 for コモンファイルオープンダイアログ
TXOFN_ARG arg;
structClear(arg);
arg.fEnableFiler = TRUE; //WZ4.00Bn 991006
return txuiFileOpenPrim(text,sh->modeFileOpen,&arg);
}
BOOL TXAPI txuiFileOpenVz(TX* text)
{
TXOFN_ARG arg;
structClear(arg);arg.fOpenVz = TRUE;
arg.fEnableFiler = TRUE; //WZ4.00Bn 991006
return txuiFileOpenPrim(text,sh->modeFileOpen,&arg);
}
#endif // !__TXC__
BOOL txuiFileOpenReadVz(TX* text)
{
//WZ3.90I 981103
TXOFN_ARG arg;
structClear(arg);arg.fOpenVz = TRUE;arg.fReadonly = TRUE;
arg.fEnableFiler = TRUE; //WZ4.00Bn 991006
return txuiFileOpenPrim(text,sh->modeFileOpen,&arg);
}
BOOL txIDM_UIOPEN(TX* text)
{
return txuiFileOpen(text);
}
BOOL txIDM_UIOPENVZ(TX* text)
{
return txuiFileOpenVz(text);
}
BOOL txIDM_UIOPENREADVZ(TX* text)
{
return txuiFileOpenReadVz(text);
}
BOOL uiOpenHistFile(void)
{
mchar* sz = dialogaSelHistEx("最近使ったファイル",HIST_FILE,SELHIST_FILEOPEN,NULL);
if (sz) {
wchar szfilename[CCHPATHNAME];
strtowstr(sz,-1,szfilename,CCHPATHNAME);
forkstdW(szfilename,NULL);
return TRUE;
}
return FALSE;
}
BOOL txIDM_UIOPENHIST(TX* text)
{
return uiOpenHistFile();
}
#if !WINDOWSCE
BOOL txIDM_DUP(TX* text)
{
if (text->wszfilename[0]) { //XZ0.20 990713 無題ファイルはIDM_DUPできないようにした。
#if UNIX
if (text->fFrame) forkstdW(text->wszfilename,L"-gd -v");
#else
if (text->fFrame) forkstdW(text->wszfilename,L"/gd /v");
#endif
return TRUE;
}
return FALSE;
}
#endif
BOOL txIDM_UIGENE(TX* text)
{
txuiGene(text);
return TRUE;
}
#endif // WZFUNC_EDITOR
BOOL txIDM_UIREOPEN(TX* text)
{
return txuiReopenInternal(text);
}
#if !WINDOWSCE && WZFUNC_EDITOR
BOOL txIDM_OPENBACKUP(TX* text)
{
if (!txAutosaveAtOpenEx(text,AUTOSAVE_OPEN_UIBACKUPFORCE)) {
wchar wsz[CCHPATHNAME];
if (txGetBackupFilenameW(text,text->wszfilename,wsz)) {
forkstdW(wsz,NULL);
return TRUE;
}
}
return FALSE;
}
#endif
//##新規作成ウィザード
//WZ3.90J 981112 new
#if !__TXC__ && WZFUNC_EDITOR
enum {IDD_EXT=100};
typedef struct {
mchar szcfg[CCHWORD];
} DIALOG_UINEW;
BOOL CALLBACK dlgprocUiNew(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDIALOG hd = dialogFromHwnd(hwnd);
DIALOG_UINEW* context = dialogGetCustdata(hd);
switch(message) {
case WM_INITDIALOG: {
PostMessage(hwnd,WM_TXUSER,0,0);
break;
}
case WM_TXUSER: {
HWND hctrl = GetDlgItem(hwnd,IDD_LIST);
configtxMakeList(hctrl,MAKELIST_LISTBOX|CFGLIST_NAME);
ListBox_SetCurSel(hctrl,0);
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);
switch(id) {
case IDD_LIST: {
if (cmd == LBN_SELCHANGE) {
HWND hctrl = GetDlgItem(hwnd,id);
int isel = ListBox_GetCurSel(hctrl);
if (isel >= 0) {
mchar szName[CCHWORD];
ListBox_GetItemText_A(hctrl,isel,szName,CCHWORD);
sstrcpy(context->szcfg,szName);
//printf("%s\n",szName);
{
HSTRBLK sb = sbNewAllocEx(1024);
configtxMakeList(sb,MAKELIST_STRBLK|CFGLIST_ALL);
{
int i;
for (i = 0;;i++) {
mchar* szItem = sbRead(sb,i);
if (!szItem) break;
{
int lch = csszGetWordLen(szItem);
if (lch == strlen(szName) && !strnicmp(szName,szItem,lch)) {
mchar* p = csszGetWordTop(szItem + lch);
HSTRBLK sbExt = dialogGetItemStrblk(hd,IDD_EXT);
sbDelAll(sbExt);
//statprintf(szItem);
while(1) {
int lch = csszGetWordLen(p);
if (!lch) break;
{
mchar* szAlloc = strdupLen(p,lch);
//information(szAlloc);
sbAdd(sbExt,szAlloc);
free(szAlloc);
}
p = csszGetWordTop(p + lch);
}
dialogWriteItem(hd,IDD_EXT);
{
mchar* p = sbRead(sbExt,0);
SetDlgItemText_A(hwnd,IDD_EXT,p ? p : ".txt");
}
break;
}
}
}
}
sbDelete(sb);
}
}
}
break;
}
}
break;
}
}
return FALSE;
}
BOOL txuiNew(TX* text)
{
// textはNULLでも可
BOOL ret = FALSE;
HDIALOG hd = dialog("新規作成");
mchar szExt[CCHWORD] = {0};
HSTRBLK sb = sbNewAllocEx(1024);
int idList;
DIALOG_UINEW context;
//
dialogSetDlgproc(hd,dlgprocUiNew);
structClear(context);
dialogSetCustdata(hd,&context);
//
dialogControlID(hd,IDD_LIST);
// dialogControlStyle(hd,LBS_STANDARD|WS_GROUP|WS_TABSTOP|WS_CHILD|WS_VISIBLE);
idList = dialogAddListbox(hd,"一覧(&L):",30,WINDOWSCE ? 5 : 10);
dialogSetNotifyAsOK(hd,idList,LBN_DBLCLK); //WZ4.00Be 990512
dialogControlStyle(hd,0);
//
dialogControlStrblk(hd,sb);
dialogControlID(hd,IDD_EXT);
dialogString(hd,"拡張子(&E):",10,szExt,CCHWORD,19);
//
if (dialogOpen(hd)) {
mchar sw[CCHWORD];
#if UNIX
sprintf_A(sw,"-e\"%s\" -cfg\"%s\"",szExt,context.szcfg);
#else
sprintf_A(sw,"/e\"%s\" /cfg\"%s\"",szExt,context.szcfg);
#endif
//information(sw);
forkstd(NULL,sw);
ret = TRUE;
}
sbDelete(sb);
return ret;
}
BOOL txIDM_UINEW(TX* text)
{
return txuiNew(text);
}
#endif // !__TXC__
//##プロジェクト
//WZ3.90I 981030 start
#if !WINDOWSCE && WZFUNC_EDITOR
void txProjectOpen(TX* text)
{
txJumpFileTop(text);
while(1) {
if (txGetChar(text) == '#') {
// コメント
} else {
txJumpTagPrim(text,1);
}
if (!txNextPara(text)) break;
}
}
static BOOL txProjectSearch(TX* text,mchar* sz)
{
int len = strGetWordLen(sz);
txJumpFileTop(text);
while(1) {
if (txCmpIParatopLen(text,sz,len)) return TRUE;
if (!txNextPara(text)) break;
}
return FALSE;
}
BOOL txuiProject(TX* text,int mode)
{
// mode=0:開く
// mode=1:保存
// mode=2:追加
// mode=3:RESUME用に保存 //WZ4.00Dd 000526
// mode=4:RESUMEを開く //WZ4.00Dd 000526
wchar wszfilename[CCHPATHNAME];
//
if (mode == 3 || mode == 4) {
wpathFullConfig(wszfilename,L"resume.tpj");
mode = (mode == 3) ? 1 : 0;
} else {
TXOFN_ARG arg;
//
wstrcpy(wszfilename,text->wszfilename);
if (wszfilename[0] == 0) {
wpathSetDefault(wszfilename);
}
#if !__TXC__
{ // プロジェクト保存のフォルダを指定できるようにした
CONFIGAPP app;
configappLoad(&app);
if (app.prj_path[0]) {
pathtowpath(app.prj_path,wszfilename);
wpathSetDir(wszfilename);
}
}
#endif // !__TXC__
wpathSetFileName(wszfilename,L"*.tpj");
//
structClear(arg);
if (mode == 0) {
} else {
arg.fSaveAs = TRUE;
if (mode == 2) arg.fNoOverwriteConfirm = TRUE;
}
//
{
static wchar* tsz[] = {L"プロジェクトを開く",L"プロジェクトを保存",L"プロジェクトに追加"};
DWORD ret = FALSE;
if ((mode == 1 || mode == 2) && sh->szfilenamePrj[0]) {
//WZ4.00Dd 000526 プロジェクトを開いた後に、プロジェクトの保存や追加を行うと、開いたプロジェクトファイルに保存や追加が簡単に行えるようにした。
mchar* op = (mode==1) ? "保存" : "追加";
int q = question("前回開いた次のプロジェクトファイルに%sしますか?\n %s\n\n別のファイルに%sするには[いいえ]を選択してください。",op,sh->szfilenamePrj,op);
if (q == IDCANCEL) return FALSE;
if (q == IDYES) {
ret = TRUE;
pathtowpath(sh->szfilenamePrj,wszfilename);
}
}
if (!ret) ret = txuiGetOpenFileNameW(text,wszfilename,tsz[mode],&arg);
if (!ret) return FALSE;
}
}
//winformation(wszfilename);
if (mode == 0) {
TX* text2 = textopenW(wszfilename);
wpathtopath(wszfilename,sh->szfilenamePrj);
txProjectOpen(text2);
textclose(text2);
} else {
TX* text2 = textopenW(wszfilename);
HWND hwnd = CreateWindow_W(
L"LISTBOX",NULL,WS_CHILD,
0,0,0,0,
text->hwndbase,0,_hinstance,NULL
);
//if (hwnd) beep();
if (mode == 1) {
txDeleteText(text2);
}
{
HWND cur = wndtxGetLast();
for (;cur;cur = wndtxGetPrev(cur)) {
TXSWL_LPARAM arg;
structClear(arg);
arg.mode = TXSWL_PRJ;
SendMessage(cur,WM_TXSETWINDOWLIST,hwnd,*(LPARAM*)&arg);
}
{
int n = ListBox_GetCount(hwnd);
int i;
for (i = 0;i < n;i++) {
mchar buff[1024];
ListBox_GetItemText_A(hwnd,i,buff,cchof(buff));
if (mode == 2) {
if (txProjectSearch(text2,buff)) txDeletePara(text2);
txJumpFileEnd(text2);
}
txInsert(text2,buff);txInsertReturn(text2);
}
}
}
DestroyWindow(hwnd);
//dialogaText(text2,NULL);
txSave(text2);
textclose(text2);
}
return TRUE;
}
BOOL txIDM_PRJ_UIOPEN(TX* text)
{
return txuiProject(text,0);
}
BOOL txIDM_PRJ_UISAVE(TX* text)
{
return txuiProject(text,1);
}
BOOL txIDM_PRJ_UISAVEADD(TX* text)
{
return txuiProject(text,2);
}
BOOL txIDM_RESUME(TX* text)
{
//WZ4.00Dd 000526 new
return txuiProject(text,4);
}
void txIDM_PRJ_SAVERESUME(TX* text)
{
//WZ4.00Dd 000526 new
txuiProject(text,3);
}
#endif // !WINDOWSCE
//##バイナリ編集
#if !WINDOWSCE && WZFUNC_EDITOR
int txuiFlushFile(TX* text)
{
// テキストが編集されていたら、保存するかどうかのメッセージボックスを出して
// [はい]なら保存してIDYES、[いいえ]ならIDNO、[キャンセル]ならFALSEを返す。
// テキストが編集されていなかったらIDOKを返す。
//WZ3.90I 981101 new
if (!text->fReadOnly && txGetEdit(text)) {
int ret = wquestion(L"%sは更新されています。保存しますか?",txGetTitleFilenameW(text));
if (ret == IDYES) {
if (txuiSave(text)) return IDYES;
return FALSE;
} else if (ret == IDNO) {
return IDNO;
} else {
return FALSE;
}
}
return IDOK;
}
BOOL txIDM_SWITCHBINARY(TX* text)
{
IFILE adr = txGetAddress(text);
// if (text->fMemo) return FALSE; //WZ4.00Dd 000601
if (!text->fFrame) return FALSE; //WZ4.00Eb 001223 GREP等でIDM_SWITCHBINARYできないようにした。
if (!txuiFlushFile(text)) return FALSE;
txJumpFileTop(text);
text->fBinedit ^= TRUE;
text->fBinary = text->fBinedit;
txReopenInternalExW(text,NULL,FALSE,NULL);
//
text->fOverWrite = text->fBinedit;
text->fCountNline = text->fBinedit;
txFlush(text);
txJumpAddress(text,adr);
if (text->ly < txGetLyCenter(text)) txSetLyCenter(text); //WZ4.00Ec 010124 バイナリ切替したとき、内容が空でないのに、EOF位置でly=0になって空テキストのように見える場合があるのをとりあえず改良。
if (text->fBinedit) {
wndImeSetOpen(text->hwndtext,FALSE);
}
return TRUE;
}
#endif // !WINDOWSCE
//##ウィンドウ
static BOOL _next(TX* text,int d)
{
int nMax = sh->nOpen;
if (IsIconic(text->hwndbase) || !IsWindowVisible(text->hwndbase) || nMax <= 1) return FALSE;
{
int idx = textSearch(text->hwndbase);
if (idx >= 0) {
do {
idx += d;
if (idx < 0) idx = nMax - 1;
idx %= nMax;
{
HWND cur = textRead(idx);
if (cur && !IsIconic(cur) && IsWindowVisible(cur)) {
wndtxSetActive(cur);
return TRUE;
}
}
} while (text->hwndbase != textRead(idx));
}
}
return FALSE;
}
BOOL txIDM_NEXTWINDOW(TX* text)
{
//WZ3.90L 981125 new
return _next(text,1);
}
BOOL txIDM_PREVWINDOW(TX* text)
{
//WZ3.90L 981125 new
return _next(text,-1);
}
//##その他
#if !WINDOWSCE
BOOL txIDM_HTML_BROWSER(TX* text)
{
//WZ4.00Bl 990908 _html.cから移動
//WZ4.00Bl 990908 (!PWZ)IDM_HTML_BROWSERをTEXT_HTML以外のテキストでも使えるようにした。ユーザ要望。
if (text->fEdit) {
int ret = question("%sは変更されています。\n保存しますか?",text->szfilename);
if (ret == IDCANCEL) return FALSE;
if (ret == IDYES) {
if (!txuiSave(text)) return FALSE;
}
}
#if !UNIX
return osOpenURL(text->szfilename,text->hwndbase);
#endif
}
#endif // !WINDOWSCE
#if !__TXC__
BOOL TXAPI txuiInsertFile(TX* text)
{
// 複数ファイルの指定はできない
wchar wszfilename[CCHPATHNAME] = {0};
DWORD ret;
wstrcpy(wszfilename,text->wszfilename);
#if !WINDOWSCE
{//WZ3.90L 981116 パスが指定されていたらそれを使う。
CONFIGAPP app;
configappLoad(&app);
if (app.if_path[0]) {
pathtowpath(app.if_path,wszfilename);
wpathSetDir(wszfilename);
wpathSetFileName(wszfilename,L"*.*");
}
}
#endif
ret = txuiGetOpenFileNameW(text,wszfilename,L"挿入ファイル",NULL);
if (ret) {
#if WZFUNC_CONV
if (fileIsWztext_W(wszfilename)) {
int ret = wquestion(L"%s\nはWZ文書です。TML文書に変換して挿入しますか?",wszfilename);
if (ret == IDCANCEL) return FALSE;
if (ret == IDYES) {
txSelectOverwriteModal(text);
return txInsertFileWztext(text,wszfilename,0);
}
}
#endif
txSelectOverwriteModal(text);
return txInsertFileW(text,wszfilename);
}
return FALSE;
}
#endif // !__TXC__
BOOL txIDM_UIINSERTFILE(TX* text)
{
BOOL fOverwrite = txSelectGetOverwrite(text);
IFILE adr0 = txGetParaTop(text);
if (txuiInsertFile(text)) {
if (!fOverwrite) { // txSelectOverwriteModalが実行されるときは選択できない。
//WZ3.90K 981113 挿入した部分を選択するようにした for 「編集|テキストの変換」
txSelectEx(text,CLIP_MOUSE);
txJumpAddress(text,adr0);
}
return TRUE;
}
return FALSE;
}
#if !WINDOWSCE && !__TXC__ && WZFUNC_EDITOR
BOOL _txIDM_SEND(TX* text,int idm)
{
if (!text->wszfilename[0]) {
information("ファイル名を付けてください");
return FALSE;
} else if (txuiSaveMacroFile(text)) {
wchar wsz[CCHPATHNAME + 30];
sprintf_W(wsz,L"%s\"%s\"",(idm == IDM_SENDATTACH) ? L"-sa" :L"-s",text->wszfilename);
//winformation(wsz);
apIDM_MAILER(wsz);
return TRUE;
}
return FALSE;
}
#endif
void txSplitPara(TX* text)
{
if (!txchIsReturn(txGetPrevChar(text))) txInsertReturn(text);
}
#if !WINDOWSCE && !__TXC__
BOOL txIDM_UIADDTOFILE(TX* text)
{
// 選択した文字をファイルの末尾に追加する。
// そのファイルをWZで開いているときには、その末尾に追加する。
BOOL ret = FALSE;
if (!text->fClip) {
information("追加したい文字を選択してから再度実行してください");
} else {
HDIALOG hd = dialog("ファイルへ追加");
HSTRBLK sb = historyOpen("addfile",4096);
mchar szfilename[CCHPATHNAME] = {0};
dialogControlRefer(hd,"*.*");
dialogControlStrblkHist(hd,sb);
dialogString(hd,"ファイル名(&N):",12,szfilename,CCHPATHNAME,30);
if (dialogOpen(hd)) {
wchar* wsz = wstrdupA(szfilename);
HWND hwnd = isopenW(wsz);
free(wsz);
if (hwnd) {
TX* text2 = textopen(NULL);
txInsertTextSelect(text2,text);
txJumpFileTop(text2);
SendMessage(hwnd,WM_TXJUMPFILEEND,0,0);
{
COPYDATASTRUCT cds;
cds.dwData = WM_COPYDATA_INSERT;
cds.cbData = txGetTextSize(text2);
cds.lpData = text2->buff + text2->cur;
SendMessage(hwnd,WM_COPYDATA,NULL,&cds);
}
SendMessage(hwnd,WM_TXSPLITPARA,0,0);
textclose(text2);
} else {
TX* text2 = textopen(szfilename);
txJumpFileEnd(text2);
txInsertTextSelect(text2,text);
txSplitPara(text2);
txSave(text2);
textclose(text2);
}
ret = TRUE;
}
historyClose("addfile",sb);
}
return ret;
}
#endif
BOOL txIDM_SWITCHREADMODE(TX* text)
{
if (txGetViewmode(text)) {
//WZ3.90N 981202 「表示|閲覧」でビューモードの解除ができるようにした。
//WZ4.00Bl 990913 閲覧で開いたファイルをIDM_SWITCHREADMODEで編集しようとするとき確認ダイアログを出さないようにした。ユーザ要望(実際にファイルがリードオンリーの場合のみにしてほしい)。
int ret = fileIsReadonlyW(text->wszfilename) ? question("編集を行いますか?\n※この文書は、上書き不可能なファイルなのでビューモードで開かれています。") : IDYES;
if (ret == IDYES) {
text->fSemiViewMode = FALSE;
text->fReadMode = FALSE;
text->fEditable = TRUE;
txFlushMenuCheck(text,FMC_CONFIG);
txDoCaption(text);
txFileLockModal(text); //WZ4.00Bl 990917 IDM_SWITCHREADMODEで編集可能にしたとき排他制御を掛けるようにした。
}
} else {
text->fReadMode ^= TRUE;
if (text->fReadMode) {//WCE0.91 970911
wndImeSetOpen(text->hwndtext,FALSE);
} else {
wndImeSetOpen(text->hwndtext,(text->modeImeAtOpen == ISF_ON));
}
txFlushMenuCheck(text,FMC_CONFIG);
txDoCaption(text); //WZ3.90I 981103
}
return TRUE;
}
BOOL txIDM_FILEMENUVZ(TX* text)
{
if (!text->fFrame) return FALSE;//WCE0.92 970918
#if POCKETWZ
{
HMENU hmenu = menuNew();
if (hmenu) {
#if WZFUNC_EDITOR
wmenuStr(hmenu,L"ファイルのオープン(&O)...",IDM_UIOPENVZ);
#endif
wmenuStr(hmenu,L"ファイルのクローズ(&C)",IDM_UICLOSE);
wmenuStr(hmenu,L"ファイルのセーブ(&S)...",IDM_UISAVEASVZ);
#if WZFUNC_EDITOR
wmenuStr(hmenu,L"新規ファイルオープン(&N)",IDM_NEW);
menuSepa(hmenu);
// wmenuStr(hmenu,L"Read onlyオープン(&R)",xxx);
wmenuStr(hmenu,L"クローズ・オープン(&L)...",IDM_UICLOSEOPEN);
wmenuStr(hmenu,L"既存ファイルへ追加(&A)...",IDM_UIAPPENDVZ);
wmenuStr(hmenu,L"ファイル名の変更(&P)...",IDM_UIRENAMEVZ);
// wmenuStr(hmenu,L"テキストの2重化(&D)",xxx);
menuSepa(hmenu);
#endif
wmenuStr(hmenu,L"編集のやり直し(&U)...",IDM_UIREOPEN);
wmenuStr(hmenu,L"カーr{ル位置へ挿入(&I)...",IDM_UIINSERTFILE);
wmenuStr(hmenu,L"全ファイルのクローズ(&X)",IDM_UIEXIT);
#if WZFUNC_EDITOR
wmenuStr(hmenu,L"エディタを終了(&Q)",IDM_UICLOSEALLVZ); //WZ4.00A 981230 VZライクの「F1|エディタを終了」の動作をWZ3に合わせた。
#endif
// メニューの先頭項目を選択状態にするのは無理みたいだ。
TrackPopupMenu(hmenu,TPM_LEFTALIGN|TPM_BOTTOMALIGN,0,0,0,text->hwndbase,NULL);
menuDelete(hmenu);
}
}
#else
{
HMENU hmenu = menuLoad(_szuiwz,"Vz\\File");
PostMessage(text->hwndbase,WM_KEYDOWN,VK_DOWN,0); //WZ4.00Bl 990904 IDM_FILEMENUVZでメニュー先頭の項目を選択表示して開く様にした。
txHmenuOpenKey(text,hmenu);
menuDelete(hmenu);
}
#endif
return TRUE;
}
#if WZFUNC_EDITOR
BOOL txIDM_UIAPPENDVZ(TX* text)
{
if (!text->fFrame) return FALSE;//WCE0.92 970918
{
wchar wszfilename[CCHPATHNAME];
wstrcpy(wszfilename,text->wszfilename);
if (txuiGetOpenFileNameW(text,wszfilename,L"追加ファイル",NULL)) {
BOOL ret = FALSE;
TX* textDst = textopenW(wszfilename);
if (textDst) {
txJumpFileEnd(textDst);
txInsertTextSelect(textDst,text);
ret = txSave(textDst);
}
textclose(textDst);
if (!ret) wattention(L"%sへの追加に失敗しました",wszfilename);
return ret;
}
}
return FALSE;
}
BOOL txIDM_UIRENAMEVZ(TX* text)
{
if (!text->fFrame) return FALSE;//WCE0.92 970918
{
wchar wszfilename[CCHPATHNAME];
TXOFN_ARG arg;
wstrcpy(wszfilename,text->wszfilename);
structClear(arg);arg.fSaveAsVz = TRUE; //WZ4.00Db 000210 IDM_UIRENAMEVZではWZ独自のダイアログを使用するようにした。Windows標準だと拡張子が追加されてしまう場合があるため。
if (txuiGetOpenFileNameW(text,wszfilename,L"ファイル名の変更",&arg)) {
wstrcpy(text->wszfilename,wszfilename);
wstrtostr(text->wszfilename,-1,text->szfilename,CCHPATHNAME); //WZ4.00Db 000212 IDM_UIRENAMEVZでtext->szfilenameも更新するようにした。
text->fEdit = TRUE;
txDoCaption(text);
if (fileIsExistW(wszfilename)) {
wstatprintf(L"%sはすでに存在します",wszfilename);
}
return TRUE;
}
}
return FALSE;
}
#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) {
case IDM_UIOPEN: { // サンプル
statprintf("IDM_UIOPEN by macro");
txIDM_UIOPEN(text);
return HOOK_CAPTURE;
}
}
}
return HOOK_CONTINUE;
}
void __on_txFrameNew(TX* text)
{
txSetHookWndproctextTxpcode(text,wndprocTextHook);
}
#endif