home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1998 September
/
VPR9809B.ISO
/
APUPDATE
/
VC
/
Tx300d
/
TX300D.LZH
/
FILE.C
< prev
next >
Wrap
Text File
|
1997-10-13
|
48KB
|
1,873 lines
// WZ EDITOR 標準機能 ファイル
// Copyright 1995-96 TY
#include <windows.h>
#include <windowsx.h>
#include "dialog.h"
#include "_filer.h"
#include "adrbook.h" //2.99 970315
//3.00A 970429 メッセージの全角カナ->半角カナ化
//{###ダイアログ}
DWORD TXAPI txofnGetSaveFileName(tx *text,mchar *szfilename,mchar *szCaption)
{
// 保存ファイル名指定コモンダイアログ
// szfilenameの内容がデフォルトで表示されます。
// szfilenameに指定されたファイル名が返されます。
// szfilename[0] = 0としておくと、デフォルトのマスクが表示されます。
// <例>
// {
// mchar szfilename[CCHPATHNAME];
// szfilename[0] = 0;
// if (txofnGetSaveFileName(text,szfilename,"保存先")) {
// information(szfilename);
// }
// }
return txofnGetSaveFileNameEx(text,szfilename,szCaption,0);
}
DWORD TXAPIBASE txofnGetOpenFileName(tx *text,mchar *szfilename,mchar *szCaption)
{
// オープンファイル名指定コモンダイアログ
// txofnGetSaveFileNameと同じ様に使います
return txofnGetOpenFileNameEx(text,szfilename,szCaption,0);
}
DWORD TXAPIBASE txofnReferFileName(tx *text,mchar *szfilename,mchar *szCaption)
{
// コモンダイアログを使ったファイル名参照
// txofnGetOpenFileNameと同じ様に使います
if (szCaption == NULL || *szCaption == 0) szCaption = "ファイルの参照";
return txofnGetOpenFileNameEx(text,szfilename,szCaption,TXOFN_NOREADONLY|TXOFN_REFER);
}
//{###VZ互換ファイルコマンド}
//VZ Editorのファイルコマンドと互換性の高いコマンドを提供します。
#define VZOFN_REFER 0x01
#define VZOFN_READONLY 0x02
#define VZOFN_ENABLE_MULTI 0x04 //3.00A 970429 複数指定有効?
struct {
int ctrlFileName;
int mode;
HWND hwndFileName;
HWND hdlg;
HDIALOG hd;
} ovf;
BOOL dlgprocOpenVz(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_INITDIALOG: {
ovf.hdlg = hwnd;
ovf.hwndFileName = GetDlgItem(hwnd,ovf.ctrlFileName);
break;
}
case WM_COMMAND: {
int id = LOWORD(wParam);
switch(id) {
case IDOK: {
mchar szfile[CCHPATHNAME];
GetWindowText(ovf.hwndFileName,szfile,cchof(szfile));
if (pathIsFileName(szfile)) {
//3.00A 970429 file.vzuiInsertFileでファイル名に空白を含むファイルを挿入できなかった
mchar sz[CCHPATHNAME+2];
strcpy(sz,szfile);
pathSetFull(sz);
pathSetLong(sz);
SetWindowText(ovf.hwndFileName,sz);
} else {
mchar buff[CCHPATHNAME];
if (szfile[0] == 0) {//3.00B1 970522 file.vzuiOpenで空打ちしてファイラーを起動したときファイラーのパスをカレントディレクトリに設定するようにした
driveGetCurDir(0,szfile);
pathSetDir(szfile);
}
//1.00B vzのファイルオープンダイアログでファイラーを起動したとき、ダイアログを消す様にした
//1.00C vzのファイルオープンダイアログでファイラーを起動し、ファイル選択後、ファイラーを終わるようにした
if (ovf.mode & VZOFN_REFER) {//3.00A 970429 == -> &
#if 1//2.99F 970403
//1.01 ""でくくる
//2.00E "-p" -> "-f"
sprintf(buff,"-O%u filer.txe -f\"%s\" -c",text->hwndbase,szfile);
wzExec(buff);//1.00H2
#else
//1.01 ""でくくる
//2.00E "-p" -> "-f"
sprintf(buff,"-O%u filer.txe -f\"%s\" -c",text->hwndbase,szfile);
wzExec(buff);//1.00H2
#endif
} else if (ovf.mode & VZOFN_READONLY) {//3.00A 970429 == -> &
#if 1//2.99F 970403
//1.01 ""でくくる
//2.00E "-p" -> "-f"
sprintf(buff,"filer.txe -f\"%s\" -c -r",szfile);
wzExec(buff);//1.00H2
// EndDialogは後
EndDialog(hwnd,0);
#else
EndDialog(hwnd,0);
//1.01 ""でくくる
//2.00E "-p" -> "-f"
sprintf(buff,"filer.txe -f\"%s\" -c -r",szfile);
wzExec(buff);//1.00H2
#endif
} else {
#if 1//2.99F 970403
//1.01 ""でくくる
//2.00E "-p" -> "-f"
sprintf(buff,"filer.txe -f\"%s\" -c",szfile);//1.00C vzのファイルオープンダイアログでパス指定してファイラーを起動したときのバグ修正
wzExec(buff);//1.00H2
// EndDialogは後
EndDialog(hwnd,0);
#else
EndDialog(hwnd,0);
//1.01 ""でくくる
//2.00E "-p" -> "-f"
sprintf(buff,"filer.txe -f\"%s\" -c",szfile);//1.00C vzのファイルオープンダイアログでパス指定してファイラーを起動したときのバグ修正
wzExec(buff);//1.00H2
#endif
}
return TRUE;
}
break;
}
}
break;
}
}
return FALSE;
}
void ovfs(mchar *szfilename)
{
SetWindowText(ovf.hwndFileName,szfilename);
SendMessage(ovf.hdlg,WM_TXDIALOGREAD,0,0);
EndDialog(ovf.hdlg,TRUE);
}
static BOOL _vzgetopenfilename(mchar *szfilename,mchar *szcaption,int mode)
{
//1.01 ロングファイル名対応。複数指定も可。""で括られる。
//3.00A 970429 ""で括られないことがあった
//3.00A 970429 modeにVZOFN_ENABLE_MULTIを指定したときだけ、複数指定ができるようにした
// modeが0またはVZOFN_READONLYの場合、ファイラーを起動してオープンができる。複数オープンもできる。
// この場合は返り値としてFALSEを返し、ファイラーから直接ファイルをオープンする。
while(1) {
HDIALOG hd;
txstr szfile = szfilename;
txstr szcur;
if (szcaption) {
hd = dialog(szcaption);
} else {
hd = dialog("ファイル名");
}
dialogControlHistRead(hd,HIST_FILE);
ovf.ctrlFileName = dialogStr(hd,"ファイル名(&F):",szfile,10,40);
ovf.mode = mode;
driveGetCurDir(0,szcur);
dialogIndent(hd,4);
dialogCaption(hd,"カレント " + szcur);
dialogIndent(hd,12);
{
PMACROFUNC pfunc;
if (macroGetFuncAddress("dlgprocOpenVz",&pfunc)) {
dialogSetHook(hd,&pfunc);
}
}
if (dialogOpen(hd)) {
#if 1//1.01 ロングファイル名対応
#if 1//3.00A 970429
strcpymax(szfilename,szfile,CCHPATHNAME);
mchar *pEnd = szfilename + strGetWordLen(szfilename);
if (*strGetWordTop(pEnd)) {
if (!(mode & VZOFN_ENABLE_MULTI)) {
information("複数ファイルの指定はできません");
#if 1
szfilename[0] = 0;
#else
*pEnd = 0;
pathFormLong(szfilename);
#endif
continue;
}
}
#else
// 複数指定されることもある
strcpy(szfilename,szfile);
if (szfilename[0] == '"') {
// 何もしない
} else {
mchar *p = strGetWordTop(szfilename);
p += strGetWordLen(szfilename);
p = strGetWordTop(szfilename);
if (*p == 0) {
// 複数指定されてないときだけ、pathSetFullする
pathSetFull(szfilename);
}
}
#endif
//information(szfilename);
#else
strcpy(szfilename,szfile);
pathSetFull(szfilename);
#endif
return TRUE;
}
return FALSE;
}
}
// 1.00CでTXAPIとした
BOOL TXAPI vzgetopenfilename(mchar *szfilename,mchar *szcaption)
{
// VZライクのファイルオープンダイアログをオープン
// szcaptionでダイアログのタイトルを指定してください。
// ファイル名が指定されたら、szfilenameにセットしTRUEを返します。
// 指定されなかったら、FALSEを返します。
//1.01 仕様変更:ファイル名を""で括って返すようにしました。
//3.00A 970429 複数指定されることはなくした
return _vzgetopenfilename(szfilename,szcaption,0);
}
// 1.00Bで追加
// 1.00CでTXAPIとした
BOOL TXAPI vzreferfilename(mchar *szfilename,mchar *szcaption)
{
// VZライクのファイル参照ダイアログをオープン
// szcaptionでダイアログのタイトルを指定してください。
// ファイル名が指定されたら、szfilenameにセットしTRUEを返します。
// 指定されなかったら、FALSEを返します。
//1.01 仕様変更:ファイル名を""で括って返すようにしました。
//3.00A 970429 複数指定されることはなくした
return _vzgetopenfilename(szfilename,szcaption,VZOFN_REFER);
}
// 選択された範囲をszfilenameに追加出力する
// fdeletetextが真なら、上書き出力する
static BOOL append(mchar *szfilename,BOOL fdeletetext)
{
BOOL ret = FALSE;
txInitText(text2);
txSetFileName(text2,szfilename);
txOpenText(text2);
if (fdeletetext) txDeleteText(text2);
txJumpFileEnd(text2);
txSelectTsPush(text);
txTsPop(text2);
ret = txSave(text2);
txClose(text2);
return ret;
}
// ファイル名を一つ入力
// これはロングファイル名の問題はない
static BOOL vzinputfilename(mchar szfilename[CCHPATHNAME],mchar *szcaption)
{
while(1) {
HDIALOG hd = dialog(szcaption);
txstr szcur;
dialogControlHistRead(hd,HIST_FILE);
dialogStrC(hd,"ファイル名(&F):",szfilename,10,CCHPATHNAME,40);
driveGetCurDir(0,szcur);
dialogIndent(hd,4);
dialogCaption(hd,"カレント " + szcur);
dialogIndent(hd,12);
if (dialogOpen(hd)) {
pathSetFull(szfilename);
if (pathIsFileName(szfilename)) return TRUE;
information("ファイル名 %s の指定は間違っています",szfilename);
} else {
return FALSE;
}
}
}
vzuiOpen
{
// ファイルのオープン
// ファイラーと連動したファイルオープン
//{#VZ} {Esc}O %O ^%O
//{#EMACS} %O
mchar szfilename[CCHPATHNAME] = {0};
if (vzgetopenfilename(szfilename,"入力ファイル")) {
//information(szfilename);
txOpenForkExFast(text,szfilename);
}
}
vzuiOpenRead
{
// Read onlyオープン
// ファイラーと連動したRead onlyオープン
//{#VZ} {Esc}R %R ^%R
//{#EMACS} %R
mchar szfilename[CCHPATHNAME] = {0};
//1.00F VZ.KEYのESC+R(Read Only オープン)でファイラーを起動してそこからファイルをオープンすると、リードオンリーオープンにならなかった
if (_vzgetopenfilename(szfilename,"入力ファイル",VZOFN_READONLY)) {
//information(szfilename);
txOpenForkExFast(text,szfilename + " --R");
}
}
vzuiSave
{
// ファイルのセーブ
// 出力ファイル名の入力ウィンドウをそのまま実行すれば「上書き保存」、
// 名前を変更して実行すれば「名前を付けて保存」となる。
//{#VZ} {Esc}S %S ^%S
//{#EMACS} %S
mchar szfilename[CCHPATHNAME];
strcpy(szfilename,text->szfilename);
if (text->fReadOnly) {//1.00B 950628 リードオンリーでも保存していた
attention("%s は上書き禁止ですので保存できません",szfilename);
return FALSE;
}
if (vzinputfilename(szfilename,"出力ファイル")) {
pathFormLong(szfilename); //1.01 ""に対応
if (text->fClip) {
if (fileIsExist(szfilename)) {
if (question("%sはすでに存在します。\n選択されたテキストを%sに上書き保存しますか?",szfilename,pathGetFileName(szfilename)) != IDYES) {
return FALSE;
}
}
if (append(szfilename,TRUE)) {
return TRUE;
} else {
attention("%sへのセーブに失敗しました",szfilename);
return FALSE;
}
} else {
#if 1//1.99C
if (!strcmp(szfilename,text->szfilename)) {
//2.00E vzuiSaveでファイルの名前を変更しなければtxSaveを行う様にした
return txSave(text);
} else {
if (txSaveAs(text,szfilename,text->crSave,text->kcSave,0)) {
return TRUE;
} else {
attention("%s には保存できません",szfilename);
return FALSE;
}
}
#else
if (txSaveTo(text,szfilename)) {
txAddFileHist(text,szfilename);//1.00D VZ.KEYのAlt+Sで指定したファイル名がファイル名ヒストリに入っていなかった
strcpy(text->szfilename,szfilename);
text->fEdit = FALSE;
wndtxDoCaption();
txDispLocate(text);//1.00H4 ステータスバーの「変更」がすぐ消えなかった
} else {
attention("%s には保存できません",szfilename);
}
#endif
}
}
return FALSE;
}
vzuiAppend
{
// 既存ファイルへ追加
// 編集テキスト全体もしくは選択範囲を、既存ファイルの末尾に
// 追加出力する。
//{#VZ} {Esc}A %A ^%A
//{#EMACS} %A
mchar szfilename[CCHPATHNAME] = {0};
if (vzreferfilename(szfilename,"追加ファイル")) {
BOOL fselected = text->fClip;
if (!fselected) txSelectAll(text);
szfilename[strGetWordLen(szfilename)] = 0;//2.00D vzuiAppendでファイラーから追加ファイルを選択できなかった
pathFormLong(szfilename); //1.01 ""に対応
if (!append(szfilename,FALSE)) {
attention("%sへの追加に失敗しました",szfilename);
}
if (!fselected) txSelectQuit(text);
}
}
vzuiRename
{
// ファイル名の変更
// 編集ファイルのファイル名を変更して編集を続ける
// 保存は行われません
//{#VZ} {Esc}P %P ^%P
//{#EMACS} %P
mchar szfilename[CCHPATHNAME];
strcpy(szfilename,text->szfilename);
if (vzinputfilename(szfilename,"ファイル名の変更")) {
strcpy(text->szfilename,szfilename);
text->fEdit = TRUE;
wndtxDoCaption();
if (fileIsExist(szfilename)) {
statprintf("%sはすでに存在します",szfilename);
}
}
}
//1.00A 950628 VZ.KEY/VZ98.KEYでEsc-Nが効かなかった
vzuiNew
{
// 新規ファイルオープン
// 入力ダイアログでファイル名を決定してから新規ウィンドウを開く
//{#VZ} {Esc}N %N ^%N
//{#EMACS} %N
mchar szfilename[CCHPATHNAME];
strcpy(szfilename,text->szfilename);
if (vzinputfilename(szfilename,"新規ファイル")) {
txOpenForkFast(text,szfilename + " --n --A");//1.00F vzuiNewでもテキストパス検索が有効になっていたので、無効にした
}
}
vzuiCloseOpen
{
// クローズ・オープン
// 現テキストを閉じて、別ファイルを新たに開く
//{#VZ} {Esc}L %L ^%L
//{#EMACS} %L
mchar szfilename[CCHPATHNAME] = {0};
if (getedit) {
int ret = question("修正テキストを出力しますか?");
if (ret == IDCANCEL) return;
if (ret == IDYES) {
save;
}
}
if (vzreferfilename(szfilename,"入力ファイル")) {
txOpenFile(text,szfilename);
}
}
vzuiInsertFile
{
// カーソル位置へ挿入
// カーソル位置にファイルを挿入する
//{#VZ} {Esc}I %I ^%I
//{#EMACS} %I
mchar szfilename[CCHPATHNAME] = {0};
#if 1//3.00A 970429
if (_vzgetopenfilename(szfilename,"挿入ファイル",VZOFN_REFER|VZOFN_ENABLE_MULTI)) {
txInsertFileMulti(text,szfilename);
return TRUE;
}
return FALSE;
#else
if (vzreferfilename(szfilename,"挿入ファイル")) {
#if 1//1.00C 複数ファイル指定対応
txInsertFileMulti(text,szfilename);//2.99 970317 Multi化
#else
txInitText(text2);
txSetFileName(text2,szfilename);
txOpenText(text2);
txJumpFileTop(text2);
txSelectPara(text2);
txJumpFileEnd(text2);
txSelectTsPush(text2);
txTsPop(text);
txClose(text2);
#endif
}
#endif
}
static BOOL uialltextSave(void)
{
if (alltextGetEdit()) {
int ret = question("修正テキストを出力しますか?");
if (ret == IDCANCEL) return FALSE;
if (ret == IDYES) {
if (!alltextSave()) return FALSE;
}
}
return TRUE;
}
vzuiCloseAll
{
// エディタを終了(確認メッセージ付き)
//{#VZ} {Esc}Q %Q ^%Q
//{#EMACS} %Q
if (!uialltextSave()) return;
if (question("エディタを終了しますか?") == IDYES) alltextQuit();
}
//{###プロジェクト}
//WZ Editorのプロジェクトを操作する機能を提供します。
static BOOL _uiPrjResume(BOOL fConfirm)
{
if (fConfirm && !uialltextSave()) return FALSE;
txSetUndisp(text);
text->share->fProjectOpening = TRUE;
#if 1//1.00F 余計な、「修正テキストを保存しますか」をカット
alltextQuit();
#else
txuiCloseAll(text);
#endif
txSetDisp(text);
return TRUE;
}
BOOL TXCMDBASE uiPrjResume(TX* text)
{
// 前回終了時の状態を復元
// 「全てのWZ Editorを閉じる」などのコマンドで終了したときの
// デスクトップ配置を復元
return _uiPrjResume(TRUE);
}
PrjSave
{
// プロジェクトの保存
// 標準プロジェクトファイル「WZ.TPJ」または、そのとき開いていた
// プロジェクトファイルに上書き保存
//{#VZ} {Esc}W
wzlock(LOCK_HIST);//1.01A
alltextToHist();
histSave();
wzunlock(LOCK_HIST);//1.01A
}
static BOOL _PrjOpen(mchar *_szfilename,BOOL fConfirm)
{
if (fConfirm && !uialltextSave()) return FALSE;
PrjSave();//1.00F プロジェクトオープン中に別のプロジェクトを開くと、閉じられるプロジェクトの内容が保存されていなかった
mchar szfilename[CCHPATHNAME];
strcpy(szfilename,_szfilename);
pathSetExt(szfilename,".tpj");
if (!fileIsExist(szfilename)) return FALSE;
strcpy(text->share->szproject,szfilename);
histLoad();
return _uiPrjResume(FALSE);
}
BOOL TXAPI PrjOpen(mchar *_szfilename)
{
// _szfilenameのプロジェクトを開く
//1.00Cで追加
return _PrjOpen(_szfilename,TRUE);
}
#if 1
#include "prof.h"
static mchar _szPrjHistKey[] = "szPrjHist";
#else
permanent txstr szPrjHist(CCHPATHNAME);
#endif
static void SetPrjFileName(mchar szfilename[CCHPATHNAME])
{
#if 1//1.00F 前回プロジェクトをOpen/Saveしたディレクトリを覚える様にした
strcpy(szfilename,"-c ");
mchar*p = szfilename + strlen(szfilename);
#if 1 // permanentだと、最後にプロジェクトを開いた時のszPrjHistではなく、
// 最後に閉じたウィンドウのszPrjHistがiniに書き込まれてしまう。
TxProfile ini;
profWzIniNew(&ini,"prmFILE");
profReadStr(&ini,_szPrjHistKey,p,CCHPATHNAME,"");
profDelete(&ini);
#else
strcpy(p,szPrjHist);
#endif
pathSetFileName(p,"*.tpj");
#else
strcpy(szfilename,"-c *.tpj");
#endif
}
static void SetPrjHist(mchar *szfilename)
{
#if 1
TxProfile ini;
profWzIniNew(&ini,"prmFILE");
profWriteStr(&ini,_szPrjHistKey,szfilename);
profDelete(&ini);
#else
szPrjHist = szfilename;
#endif
}
BOOL TXAPI TXCMDBASE uiPrjOpen(void)
{
// プロジェクトを開く
// プロジェクトファイル名を指定してデスクトップ配置を復元
// 編集中のファイルがあると、保存全クローズ(問い合わせあり)し、
// 平行する複数のプロジェクトを入れ替える。
#if 0//1.01A
#ifdef __FLAT__
information("現在のWZ32ではプロジェクト機能は使えません");
return FALSE;
#endif
#endif
if (!uialltextSave()) return FALSE;
mchar szfilename[CCHPATHNAME];
SetPrjFileName(szfilename);
while(1) {
if (txofnReferFileName(text,szfilename,"プロジェクトを開く")) {
pathSetExt(szfilename,".tpj");
if (!fileIsExist(szfilename)) {
attention("%sは存在しません。\n正しいファイルを指定してください",szfilename);
continue;
}
SetPrjHist(szfilename);
return _PrjOpen(szfilename,FALSE);
}
break;
}
return FALSE;
}
BOOL TXAPI TXCMDBASE uiPrjSaveTo(void)
{
// 名前をつけてプロジェクトの保存
// 現在のデスクトップ配置を、任意のプロジェクトファイル名で保存
#if 0//1.01A
#ifdef __FLAT__
information("現在のWZ32ではプロジェクト機能は使えません");
return FALSE;
#endif
#endif
mchar szfilename[CCHPATHNAME];
SetPrjFileName(szfilename);
while(1) {
if (txofnReferFileName(text,szfilename,"プロジェクトの保存")) {
pathSetExt(szfilename,".tpj");
if (fileIsExist(szfilename)) {
int ret = question("%sはすでに存在します。\n上書きしてよいですか?",szfilename);
if (ret != IDYES) continue;
}
strcpy(text->share->szproject,szfilename);
PrjSave();//1.01A
SetPrjHist(szfilename);
return TRUE;
}
break;
}
return FALSE;
}
#if 0//1.00Cでのバグ修正により、これらのコマンドは多分不要
vzuiPrjCloseAll
{
// 「修正テキストを出力しますか?」と尋ね、
// 「エディタを終了」と尋ね、全終了します。
// WZICONを常駐していてもプロジェクトを保存する
if (!uialltextSave()) return;
if (question("エディタを終了しますか?") == IDYES) {
PrjSave();//1.01A
text->share->szproject[0] = 0;//1.00C
alltextQuit();
}
}
uiPrjCloseAll
{
// 「修正テキストを出力しますか?」と尋ね、全終了
// WZICONを常駐していてもプロジェクトを保存する
if (!uialltextSave()) return;
PrjSave();//1.01A
text->share->szproject[0] = 0;//1.00C
alltextQuit();
}
uiPrjCloseAllEvery
{
// テキスト毎に「出力しますか?」を尋ね、全終了
// WZICONを常駐していてもプロジェクトを保存する
PrjSave();//1.01A
text->share->szproject[0] = 0;//1.00C
uicloseallevery;
}
uiPrjCloseAllForce
{
// 全テキストを保存してエディタの終了
// 修正テキストは全保存し、全終了
// WZICONを常駐していてもプロジェクトを保存する
PrjSave();//1.01A
text->share->szproject[0] = 0;//1.00C
uicloseallforce;
}
#endif
//{###ファイル}
//1.97 EXEからTX-Cに移動
BOOL TXAPI TXCMDBASE txMulti(TX* text)
{
// 多重化
return txOp(text,TXOP_TXMULTI,0,0);
}
void TXAPI wzopen(LPCSTR szfilename)
{
// szfilenameのファイルをWZ Editorでオープン
txOpenForkFast(text,szfilename);
}
//2.96A 970211 ファイラーを起動
BOOL TXCMDBASE filer(TX* text)
{
// ファイラーを起動
macroFork("filer"); // ファイラーは高速オープンは使わない
return TRUE;
}
//
#define IDD_DELETE 1000
#define IDD_CALC 1001
#define IDD_NPAGEALL 1002
//2.90 histだけでなくsbにも対応
int ctrlHist;
int iHist;
HHIST _hist;
HSTRBLK _sb;
static void FlushHistList(HWND hwnd)
{
HWND hctrl = GetDlgItem(hwnd,ctrlHist);
int i = sbGetCount(_sb);
SendMessage(hctrl,LB_RESETCONTENT,0,0);
if (_hist == HIST_FILE) {//1.01A "ファイルリストのファイルを開く"改良
txstr sz;
UINT tab = 4 * 18;
SendMessage(hctrl,LB_SETTABSTOPS,1,(LPARAM)&tab);
while (--i >= 0) {
mchar* szstr = sbRead(_sb,i);
sz = pathGetFileName(szstr);
sz += "\t(";
sz += szstr;
sz += ")";
SendMessage(hctrl,LB_ADDSTRING,0,(LPARAM)(mchar*)sz);
}
} else {
while (--i >= 0) {
mchar* szstr = sbRead(_sb,i);
SendMessage(hctrl,LB_ADDSTRING,0,(LPARAM)szstr);
}
}
}
BOOL dialogUiHistory(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_INITDIALOG: {
FlushHistList(hwnd);
SendDlgItemMessage(hwnd,ctrlHist,LB_SETCURSEL,0,0);
break;
}
case WM_COMMAND: {
int notify = WM_COMMAND_GetNotify(wParam,lParam);
int id = WM_COMMAND_GetId(wParam);
switch(id) {
case IDOK: {
iHist = SendDlgItemMessage(hwnd,ctrlHist,LB_GETCURSEL,0,0);
break;
}
case IDD_DELETE: {//1.92 ヒストリの削除機能追加
iHist = SendDlgItemMessage(hwnd,ctrlHist,LB_GETCURSEL,0,0);
if (iHist != LB_ERR) {
int i = sbGetCount(_sb) - iHist - 1;
sbDelI(_sb,i);
//
FlushHistList(hwnd);
SendDlgItemMessage(hwnd,ctrlHist,LB_SETCURSEL,iHist,0);
}
break;
}
}
if (id == ctrlHist && notify == LBN_DBLCLK) {
PostMessage(hwnd,WM_COMMAND,IDOK,0);
}
break;
}
}
return FALSE;
}
static mchar* _uiSelectHistory(mchar* szcaption,HANDLETX hist,int width,int height)
{
//3.00B1 970612
if (_hist || _sb) return NULL;
mchar* ret = NULL;
_sb = sbFromHist(hist);
_hist = sbToHist(hist);
HDIALOG hd = dialog(szcaption);
PMACROFUNC pfunc;
macroGetFuncAddress("dialogUiHistory",&pfunc);
dialogSetHook(hd,&pfunc);
ctrlHist = _dialogList(hd,NULL,width,height);
//
dialogLFV(hd);
int cx = 12;
dialogOK(hd,cx);
dialogCancel(hd,cx);
dialogControlID(hd,IDD_DELETE);
dialogButtonCmd(hd,"削除(&D)",NULL,cx);
//
if (dialogOpen(hd)) {
int i = sbGetCount(_sb);
ret = sbRead(_sb,i-iHist-1);
}
_hist = NULL;
_sb = NULL;
return ret;
}
mchar* TXAPI uiSelectHistory(mchar* szcaption,HANDLETX hist)
{
// szcaptionのキャプションで、histのヒストリを選択するダイアログを出し、
// 選択されたヒストリ文字列を返す。キャンセルされたらNULLを返す
//2.90 histはHIST_XXXでもHSTRBLKでも両方に対応した
//1.00H で追加
return _uiSelectHistory(szcaption,hist,40,15);
}
BOOL TXCMDBASE uiOpenHist(TX* text)
{
//ファイルヒストリから選んだファイルをオープン
//1.00H で追加
mchar* szfilename = _uiSelectHistory("ファイルヒストリのファイルを開く",HIST_FILE,60,15);//3.00B1 970612 file.uiOpenHistの横幅拡大
if (szfilename) {
txOpenForkFast(text,szfilename);
return TRUE;
}
return FALSE;
}
BOOL TXCMDBASE allSave(TX* text)
{
// オープン中の全テキストについて編集されているものをセーブします
//1.91A で追加
return alltextSave();
}
// カーソル位置のファイルを開く
// カーソル位置の文字列がファイル名で、ファイルが存在すれば、
// そのファイルをオープンします。
// Copyright 1995 TY
#include "wintxx.h"
// 例: ^ カーソルがこの位置で実行すると"wintxx.h"をオープン
// ファイルが存在するか。拡張子省略/パス検索も行って調べる
BOOL isfileexist(txstr szfilename)
{
HFILE hf = _lopen(szfilename,OF_READ);
if (hf != HFILE_ERROR) {
_lclose(hf);
return TRUE;
}
BYTE path[CCHPATHNAME];
strcpy(path,szfilename);
if (pathSearchExt(path,wzGetEnv(WZENV_EXT))) return TRUE;//1.00F
if (pathSearch(path,pathGetFileName(szfilename),wzGetEnv(WZENV_PATH),wzGetEnv(WZENV_EXT))) return TRUE;
return FALSE;
}
int uiBackup(mchar* szfilename)
{
HDIALOG hd = dialog("バックアップ");
dialogCaption(hd,"バックアップファイル");
dialogIndent(hd,4);
dialogCaption(hd,szfilename);
dialogIndent(hd,-4);
dialogCaption(hd,"が作成できません");
int mode = 0;
dialogControlRadioV(hd);
dialogRadioID(hd,&mode,
"バックアップディレクトリを作成して保存",
"バックアップディレクトリを作成しないで保存",
"保存をキャンセル"
);
dialogLFV(hd);
if (dialogOpen(hd)) {
return mode;
}
return -1;
}
cfo
{
//#WZKEY +^A
#WZMENU FILE(F)
// カーソル位置のファイルオープン
// : #include "wintxx.h"
// : ^ カーソルがこの位置で実行すると"wintxx.h"をオープン
// by TY
setundisp;
IFILE address = getaddress;
txstr szfilename(CCHPATHNAME);
{
// 先頭文字へジャンプ
while(1) {
int c = getchar;
if (isalnum(c)) {
jumpwordtopmi;
if (!left) break;
} else if (c == '.' || c == '\\' || c == ':' || c == '_') {
// ファイル名構成子
if (!left) break;
} else {
right;
break;
}
}
selectquit;select;
// 末尾の次の文字へジャンプ
while(1) {
int c = getchar;
if (isalnum(c)) {
jumpwordendmi;
// if (!right) break;//1.00C jumpwordendmi仕様変更に対応
} else if (c == '.' || c == '\\' || c == ':' || c == '_') {
// ファイル名構成子
if (!right) break;
} else {
break;
}
}
getword(szfilename);
selectquit;
}
jumpaddress(address);
setdisp;
//
if (isfileexist(szfilename)) {
openforkfast(szfilename);
} else {
dispinfo("ファイル\"%s\"見つかりません",szfilename);
}
}
static mchar _szpagef[] = "%ld 頁";
BOOL dlgprocInfo(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
int notify = WM_COMMAND_GetNotify(wParam,lParam);
switch(id) {
case IDD_CALC: {
NPAGE all = txLpOp(text,TXLPOP_CALC_NPAGEALL);
mchar buff[20];
sprintf(buff,_szpagef,all);
Static_SetText(GetDlgItem(hwnd,IDD_NPAGEALL),buff);
break;
}
}
}
}
return FALSE;
}
#define bytesToKB(size) (size / 1024 + (size % 1024 > 0))
static NLINE txGetNlineall(TX* text,NPARA* pNparaAll)
{
//2.99D 970329 new
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;
}
//1.94
BOOL TXCMDBASE uiFileInformation(TX* text)
{
// 文書の情報
HDIALOG hd = dialogbig("ファイルインフォメーション"); //2.99D 970330 dialogbig化
dialogSetContexthelp(hd,TRUE);
int lx = 15;
int id;
dialogSetH(hd);
dialogSetGroupRight(hd,DTCX * 70);
dialogSetHookEx(hd,"\m.dlgprocInfo");
if (text->szfilename[0]) {
dialogGroup(hd,"ファイル");
dialogCaption(hd,"ファイル名:");
dialogSetPosLX(hd,lx);
id = dialogCaptionDynamic(hd,pathGetFileName(text->szfilename),40);
dialogControlHelp(hd,288);
_dialogAddControlInfo(hd,id);
dialogLF(hd);
//2.97 970223
dialogCaption(hd,"フルパス名:");
dialogSetPosLX(hd,lx);
id = dialogCaptionDynamic(hd,text->szfilename,40);
dialogControlHelp(hd,288);
_dialogAddControlInfo(hd,id);
dialogLF(hd);
//
mchar buffsize[CCHWORD];
dialogCaption(hd,"サイズ:");
dialogSetPosLX(hd,lx);
sprintf(buffsize,"%ldKB (%ld バイト)",bytesToKB(text->sizefileReal),text->sizefileReal);
id = dialogCaptionDynamic(hd,buffsize,40);//2.00C 20では足りない
dialogControlHelp(hd,289);
_dialogAddControlInfo(hd,id);
dialogLF(hd);
//
TM tm;
mchar buffdate[CCHWORD];
itimeToTm(&text->timeFile,&tm);
sprintf(buffdate,"%2d/%2d/%2d %2d:%02d:%02d",
tm.tm_year,tm.tm_mon + 1,tm.tm_mday,
tm.tm_hour,tm.tm_min,tm.tm_sec
);
dialogCaption(hd,"日付:");
dialogSetPosLX(hd,lx);
id = dialogCaptionDynamic(hd,buffdate,20);
dialogControlHelp(hd,290);
_dialogAddControlInfo(hd,id);
dialogLF(hd);
//1.97
static mchar* tszFiletype[] = {"テキストファイル","テキストファイル(装飾・体裁付き)","WZ文書ファイル","WZ圧縮文書ファイル","HTMLファイル"};
int itype = 0;
if (text->fWztext) {
itype = 2;
if (text->fWztextArc) itype++;
} else if (text->fHTML) {
itype = 4;
} else if (text->fForm) {
itype = 1;//2.00B
}
dialogCaption(hd,"ファイルタイプ:");
dialogSetPosLX(hd,lx);
id = dialogCaptionDynamic(hd,tszFiletype[itype],40);
dialogControlHelp(hd,291);
_dialogAddControlInfo(hd,id);
dialogLF(hd);
//
if (text->fWztext) {
// CR+LF,SJIS固定なので、表示しない
} else {
static mchar* tszReturn[] = {"CR+LF (Windows,DOS)","CR (Macintosh)","LF (Unix)"};
dialogCaption(hd,"改行コード:");
dialogSetPosLX(hd,lx);
id = dialogCaptionDynamic(hd,tszReturn[text->crOpen],30);
dialogControlHelp(hd,194);
_dialogAddControlInfo(hd,id);
dialogLF(hd);
//
static mchar* tszChar[] = {"SHIFT-JIS","JIS","EUC","UNICODE"};
dialogCaption(hd,"文字コード:");
dialogSetPosLX(hd,lx);
id = dialogCaptionDynamic(hd,tszChar[text->kcOpen],20);
dialogControlHelp(hd,196);
_dialogAddControlInfo(hd,id);
dialogLF(hd);
}
dialogGroupEnd(hd);
dialogLF(hd);
}
dialogGroup(hd,"文書");
{
mchar buffsizetext[CCHWORD];
IFILE size = txGetTextSize(text);
dialogCaption(hd,"サイズ:");
dialogSetPosLX(hd,lx);
sprintf(buffsizetext,"%ldKB (%ld バイト)",bytesToKB(size),size);
id = dialogCaptionDynamic(hd,buffsizetext,40);//2.00C 20では足りない
dialogControlHelp(hd,301);
_dialogAddControlInfo(hd,id);
dialogLF(hd);
}
{//2.99D 970329 文書の情報に段落数と行数を表示するようにした。
mchar buffsizetext[CCHWORD];
NPARA nparaAll;
NLINE nlineAll = txGetNlineall(text,&nparaAll);
dialogCaption(hd,"段落数:");
dialogSetPosLX(hd,lx);
sprintf(buffsizetext,"%ld行",nparaAll);
id = dialogCaptionDynamic(hd,buffsizetext,40);//2.00C 20では足りない
dialogControlHelp(hd,301);
_dialogAddControlInfo(hd,id);
dialogLF(hd);
//
dialogCaption(hd,"行数:");
dialogSetPosLX(hd,lx);
sprintf(buffsizetext,"%ld行",nlineAll);
id = dialogCaptionDynamic(hd,buffsizetext,40);//2.00C 20では足りない
dialogControlHelp(hd,301);
_dialogAddControlInfo(hd,id);
dialogLF(hd);
}
{
mchar buff[CCHWORD];
id = dialogCaptionDynamic(hd,"総ページ数:",10);
dialogControlHelp(hd,302);
_dialogAddControlInfo(hd,id);
if (text->editmode != 2) {
dialogSetPosLX(hd,lx);
dialogCaptionDynamic(hd,"テキストモード・高速モードでは総ページ数はわかりません。",50);
dialogLF(hd);
dialogSetPosLX(hd,lx);
dialogCaption(hd,"詳細モードで調べることができます。");
dialogLF(hd);
} else {
dialogSetPosLX(hd,lx);
if (text->editmode == 2 && text->lp->npageall) {
sprintf(buff,_szpagef,text->lp->npageall);
// 文書に表や桁揃えが含まれていると正確でないことがある。
// "計算"を行うと正確な値になる。
strcat(buff," (およその値です)");
} else {
strcpy(buff,"不明");
}
dialogControlID(hd,IDD_NPAGEALL);
dialogCaption(hd,buff);
dialogLF(hd);
dialogSetPosLX(hd,lx);
dialogControlEnable(hd,(text->editmode == 2));
dialogControlID(hd,IDD_CALC);
dialogButton(hd,"計算",NULL,10);
dialogLF(hd);
}
}
dialogGroupEnd(hd);
dialogOpen(hd);
return TRUE;
}
//旧:usermenu.umcMiFile
menuFileMi
{
#WZKEY
// MIFESライクファイルメニュー
//{#MI} {F1}
call("menu.ファイル(MIFESライク)");
}
//タイトルを出すとカーソルを動かしてのコマンド指定がVZと異なってしまう
//旧:usermenu.umcVzFile
menuFileVz
{
#WZKEY
// VZ準拠ファイルメニュー
//{#VZ} {F1}
//{#EMACS} {F1}
call("menu.ファイル(VZ互換)");
}
int uiFileType(TXFILETYPE* filetype,mchar* szfilename)
{
HDIALOG hd;
if (szfilename) {
hd = dialog(szfilename + " のファイル形式");
} else {
hd = dialog("ファイルの形式");
}
#if 0
dialogStrC(hd,"拡張子(&E):",filetype->szext,16,cchof(filetype->szext),10);
#endif
dialogSelectIDB(hd,"改行コード(&R):",&filetype->crSave,16,24,"CR+LF(Windows,DOS)","CR(Macintosh)","LF(Unix)");
//
#ifdef __FLAT__
dialogSelectIDB(hd,"文字コード(&C):",&filetype->kcSave,16,24,"SHIFT-JIS","JIS","EUC","UNICODE");
#else
dialogSelectIDB(hd,"文字コード(&C):",&filetype->kcSave,16,24,"SHIFT-JIS","JIS","EUC");
#endif
return dialogOpen(hd);
}
#define NEWFILE_WZTEXT 3 // WZ文書
#define NEWFILE_HTML 4 // HTML
#define NEWFILE_TXTEXT 2 // 装飾・体裁付きテキスト文書
#define NEWFILE_BINARY 6 // バイナリ
#define NEWFILE_PLAIN 7 // プレーンテキスト
//2.00B [ファイル]-[新規作成]をわかりやすくした
BOOL TXAPI TXCMDBASE txuiOpenNew(TX* text)
{
// 新規テキスト作成ダイアログ
//{#MS} ^N
if (text->pcc && text->pcc->fPlaintext) {//3.00B1 970613
wzExec("");
return TRUE;
}
HDIALOG hd = dialog("新規作成");
dialogSetContexthelp(hd,TRUE);
int mode = 0;
if (text->fWztext) {
mode = NEWFILE_WZTEXT;
} else if (text->fHTML) {
mode = NEWFILE_HTML;
} else if (text->fForm) {
mode = NEWFILE_TXTEXT;//2.97A 970303
#if 0//3.00B1 970523
} else if (text->fBinedit) {
mode = NEWFILE_BINARY;//3.00B1 970523
} else if (text->pcc && text->pcc->fPlaintext) {
mode = NEWFILE_PLAIN;//3.00B1 970523
#endif
}
dialogControlRadioV(hd);
dialogControlHelp(hd,-480);
dialogRadioID(hd,&mode,
"テキスト文書(&T)",
"メール(&M)",
"装飾・体裁付きテキスト文書(&A)",
"WZ文書(&W)",
"HTML(&H)",
"Cプログラム(&C)"
// ,"バイナリ(&B)"
// ,"ベタテキスト(&P)"
);
dialogLFV(hd);
dialogOK(hd,14);
dialogCancel(hd,14);
int iddTemplate = dialogCmd(hd,"テンプレート(&E) >>",14);
int ret = dialogOpen(hd);
if (ret) {
if (ret == iddTemplate) {
txstr szfilename;
strcpy(szfilename,text->szexedir);
szfilename += "template\\*.*";
if (mode == NEWFILE_HTML) {//2.98 970304 テンプレートにHTMLを追加
pathSetFileName(szfilename,SZHTMLMASK);
}
//information("%s",szfilename);
if (txofnGetOpenFileNameEx(text,szfilename,"テンプレートから新規作成",TXOFN_FOCUSFILE) == TXOFN_OK) {
//2.98 970304
txstr szcmd = "/template:\""+szfilename+"\"";
if (pathIsExt(szfilename,".htm") || pathIsExt(szfilename,".html")) {
mode = NEWFILE_HTML;
}
if (mode == NEWFILE_HTML) {
szcmd += " /T.htm /E1";
}
wzExec(szcmd);
return TRUE;
}
return FALSE;
}
switch(mode) {
case 0: {
wzExec("/T.txt");
return TRUE;
}
case 1: {
wzExec("/T.log");
return TRUE;
}
case NEWFILE_TXTEXT: {
wzExec("/T.txt /Ttx /E1");
return TRUE;
}
case NEWFILE_WZTEXT: {
wzExec("/T.wz");
return TRUE;
}
case NEWFILE_HTML: {
#if 1//2.99D 970331 テキストモードで開くにしていてもHTMLを新規作成すると体裁モードになった
wzExec("/T.htm");
#else
wzExec("/T.htm /E1");
#endif
return TRUE;
}
case 5: {
wzExec("/T.C");
return TRUE;
}
case NEWFILE_BINARY: {//3.00B1 970523
wzExec("/b /b0");
return TRUE;
}
case NEWFILE_PLAIN: {//3.00B1 970523
wzExec("/bt /b0");
return TRUE;
}
}
}
return FALSE;
}
//2.99D 970402
BOOL TXAPI TXCMDBASE txuiUpdateClose(TX* text)
{
// テキストが編集されていたら上書き保存して閉じる
// 編集されてなかったら閉じる
//2.99D 970402 new
if (text->fEdit) {
if (txuiSave(text)) {
return txuiClose(text);
}
} else {
return txuiClose(text);
}
return 0;
}
//##常駐
static HWND textGetStayAlways(void)
{
SHARE* sh = text1->share;
HWND ret = NULL;
int i;
wzlock(LOCK_WZPROCESS);
for (i = 0;i < sh->nOpen;i++) {
if (sh->tWzprocess[i].modeProcess & WZPROCESS_STAYALWAYS) {
ret = sh->tWzprocess[i].hwnd;
break;
}
}
wzunlock(LOCK_WZPROCESS);
return ret;
}
stay
{
// WZの常駐
#if 1 //3.00B2 970614 NT3.51/WZ16でWZの常駐ONでWZ Iconが起動するとファイルオープンダイアログが出た
macroFork("wzicon /hw /i- /co");
#else
#if 1///2.96 970209 WZ常駐を高速化("/I"追加)
#if 1///2.99D 970330 sw
macroFork("wzicon /hw /i-");
#else
macroFork("wzicon /H /I");
#endif
#else
macroFork("wzicon --H");
#endif
#endif
}
flushStay
{
HWND hwnd = textGetStayAlways();
SHARE* sh = text1->share;
if (sh->config.fenvstayalways) {
if (!hwnd) {
stay();
}
} else {
if (hwnd) {
PostMessage(hwnd,WM_CLOSE,0,0);
}
}
}
//##バイナリ編集
int TXAPI txuiFlushFile(TX* text)
{
// テキストが編集されていたら、保存するかどうかのメッセージボックスを出して
// [はい]なら保存してIDYES、[いいえ]ならIDNO、[キャンセル]ならFALSEを返す。
// テキストが編集されていなかったらIDOKを返す。
//2.00Eで追加
//2.92 返り値の仕様変更
#if 1//2.92
if (!text->fReadOnly && txGetEdit(text)) {
int ret = question("%sは更新されています。保存しますか?",txGetTitleFilename(text));
if (ret == IDYES) {
if (txuiSave(text)) return IDYES;
return FALSE;
} else if (ret == IDNO) {
return IDNO;
} else {
return FALSE;
}
}
return IDOK;
#else
if (!text->fReadOnly && txGetEdit(text)) {
int ret = question("%sは更新されています。保存しますか?",txGetTitleFilename(text));
if (ret == IDYES) {
return txuiSave(text);
} else if (ret == IDNO) {
return TRUE;
} else {
return FALSE;
}
}
return TRUE;
#endif
}
BOOL TXAPI TXCMDBASE txBinedit(TX* text)
{
// バイナリ編集モードに入る/抜ける
//2.00Eで追加
if (text->editmode != 0) {
information("体裁・詳細モードではバイナリ編集モードの切り替えはできません");//3.00A2 970507 高速->体裁
return FALSE;
}
#if 0
if (!text->fBinedit && !text->fEnvDev) {
BOOL fOK = FALSE;
#ifdef __FLAT__
if (text->fTempMem) fOK = TRUE;
#endif
if (!fOK) {
if (
question(
"64KBを越えるファイルをバイナリ編集すると、各行の行頭のアドレス表示が不正確になります。\n"
"WZ32を使用し[設定]-[編集]-[テンポラリファイル]を[作成しない]に設定すれば、\n"
"この制限はありません。\n"
"\nバイナリ編集しますか?"
) != IDYES
) return FALSE;
}
}
#endif
if (!txuiFlushFile(text)) return FALSE;
IFILE adr = txGetAddress(text);
txJumpFileTop(text);
text->fBinedit = text->fBinedit ^ 1;
text->fBinary = text->fBinedit;
text->fConfigBinedit = text->fBinedit;//3.00C 971013 [ツール]-[追加機能]-[バイナリ/テキスト編集切替]で、バイナリ->テキストの切替ができなかった
txReopenInternal(text);
//
text->fOverWrite = text->fBinedit;
txFlush(text);
txJumpAddress(text,adr);
return TRUE;
}
//##メール
//2.90
// whereis("c:\\*.*","wzeditor.exe",szdst)の様に使用。
static BOOL whereis(mchar *szpath,mchar *szfind,txstr szdst)
{
#ifdef __FLAT__
WIN32_FIND_DATA ffd;
#else
FILEFIND filefind;
#endif
mchar szfilename[CCHPATHNAME];
// 通常ファイル
strcpy(szfilename,szpath);
#ifdef __FLAT__
{
HANDLE hfind = FindFirstFile(szpath,&ffd);
if (hfind != INVALID_HANDLE_VALUE) {
do {
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue;
if (!stricmp(szfind,ffd.cFileName)) {
pathSetFileName(szfilename,ffd.cFileName);
szdst = szfilename;
return TRUE;
}
} while(FindNextFile(hfind,&ffd));
FindClose(hfind);
}
}
#else
if (!fileFindFirst(szpath,FA_NORMAL,&filefind)) {
do {
if (!stricmp(szfind,filefind.name)) {
pathSetFileName(szfilename,filefind.name);
szdst = szfilename;
return TRUE;
}
} while (!fileFindNext(&filefind));
}
#endif
// サブディレクトリ
{
strcpy(szfilename,szpath);
pathSetFileName(szfilename,"*.*");
#ifdef __FLAT__
{
HANDLE hfind = FindFirstFile(szfilename,&ffd);
if (hfind != INVALID_HANDLE_VALUE) {
do {
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (ffd.cFileName[0] != '.') {
txstr szsubpath(CCHPATHNAME);
szsubpath = szpath;
pathSetFileName(szsubpath,ffd.cFileName + "\\" + pathGetFileName(szsubpath));
if (whereis(szsubpath,szfind,szdst)) return TRUE;
}
}
} while(FindNextFile(hfind,&ffd));
FindClose(hfind);
}
}
#else
if (!fileFindFirst(szfilename,FA_DIREC,&filefind)) {
do {
if (filefind.attrib & FA_DIREC) {
if (filefind.name[0] != '.') {
txstr szsubpath(CCHPATHNAME);
szsubpath = szpath;
pathSetFileName(szsubpath,filefind.name + "\\" + pathGetFileName(szsubpath));
if (whereis(szsubpath,szfind,szdst)) return TRUE;
}
}
} while (!fileFindNext(&filefind));
}
#endif
}
return FALSE;
}
#if 0
DWORD convprocIdMail(DWORD data,int mode)
{
static int t[] = {
MAIL_MSMAIL,MAIL_EUDORAPRO,MAIL_BECKY,
};
if (mode == TXDIALOG_READ) {
return t[data];
} else {
int i;
for (i = 0;i < 3;i++) {
if (t[i] == data) return i;
}
return 0;
}
}
#endif
#ifndef __FLAT__
extern "shell.dll" {
#include <shellapi.h>
}
#endif
#define IDD_DROP 100
// 始めは、whereisでメーラのEXEを検索しようと思ったが、複数インストー
//ルされている場合、EXEがサーバーにある場合、にうまくいかないの
//で、アイコンをドロップしてもらうことにした。
static int mailerGetID(mchar* szfilename,mchar* szarg)
{
if (pathEquFileName(szfilename,"explorer")) {
if (szarg && strstr(szarg,"Internet Mail.{")) return MAIL_MSMAIL;
return 0;
}
if (pathEquFileName(szfilename,"rebecca")) return MAIL_BECKY;
if (pathEquFileName(szfilename,"eudora32")) return MAIL_EUDORAPRO;
return 0;
}
static int mailerGetString(int id)
{
switch(id) {
case MAIL_MSMAIL: return "Internet Mail";
case MAIL_BECKY: return "Becky!";
case MAIL_EUDORAPRO: return "Eudora PRO";
}
return NULL;
}
static void settext(TX* text,TXCONFIGSHARE* shcfg)
{
txSetEditmode(text,EDITMODE_TEXT);
txDeleteText(text);
txInsertLine(text,".メーラのアイコンをここにドロップしてください");
txInsertLine(text,"[ヒント]スタートメニューからメーラを選択するには、スタートメニューを右クリックして[開く]を実行します。");
//
TXCONFIGSHARE *shcfg = &text->share->config;
mchar* sz = mailerGetString(shcfg->idMailer);
if (sz) {
txInsertLine(text,"現在の設定は、「%s」(%s)です。",sz,shcfg->szMailer);
} else if (shcfg->szMailer[0]) {
txInsertLine(text,"現在の設定は、簡単送信未対応のメーラ(%s)です。",shcfg->szMailer);
} else {
txInsertLine(text,"現在は、設定されていません。");
}
txSetEditmode(text,EDITMODE_FORM);
txJumpFileTop(text);
}
BOOL dlgprocConfigMailer(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
TXCONFIGSHARE *shcfg = &text->share->config;
switch(message) {
case WM_INITDIALOG: {
HWND hctrl = GetDlgItem(hwnd,IDD_DROP);
TX* text = (TX*)SendMessage(hctrl,TXWM_GETTX,0,0);
DragAcceptFiles(text->hwndtext,TRUE);
//
text->fSetWidthByWindow = TRUE;
text->fScrollBarH = FALSE;
text->fScrollBarV = FALSE;
text->fDispLine = FALSE;
strcpy(text->tsztitle[0],".");
text->fDispTitle = TRUE;
text->fForm = TRUE;
txFlush(text);
//
settext(text,shcfg);
break;
}
case WM_TXUSER: {
HWND hctrl = GetDlgItem(hwnd,IDD_DROP);
TX* text = (TX*)SendMessage(hctrl,TXWM_GETTX,0,0);
mchar szfilename[CCHPATHNAME];
DragQueryFile((HDROP)wParam,0,szfilename,cchof(szfilename));
DragFinish((HDROP)wParam);
txstr szfullname(CCHPATHNAME);
strcpy(szfullname,szfilename);
if (pathIsExt(szfilename,".lnk")) {
txOp(text,TXOP_SHORTCUTRESOLVE,szfilename,(mchar*)szfullname);
mchar szarg[CCHPATHNAME];
if (txOp(text,TXOP_SHORTCUTGETARG,szfilename,szarg) && szarg[0]) {
shcfg->idMailer = mailerGetID(szfullname,szarg);
szfullname += " ";
szfullname += szarg;
} else {
shcfg->idMailer = mailerGetID(szfullname,NULL);
}
} else {
shcfg->idMailer = mailerGetID(szfullname,NULL);
}
strcpymax(shcfg->szMailer,szfullname,cchof(shcfg->szMailer));
settext(text,shcfg);
break;
}
}
return FALSE;
}
BOOL __wndproctext(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_DROPFILES: {
if (GetParent(hwnd) != text->hwndbase) { // dialogなら...
SendMessage(GetParent(hwnd),WM_TXUSER,wParam,lParam);
return 0;
}
}
}
return FALSE;
}
#if 0 //2.99D 970331 廃止
configMailer
{
HDIALOG hd = dialog("メーラの設定");
int lx = 16;
TXCONFIGSHARE *shcfg = &text->share->config;
#if 1
dialogSetHookEx(hd,"\m.dlgprocConfigMailer");
dialogCaption(hd,"WZから呼び出すメーラの指定:");
DTRECT r;
dialogGetPos(hd,&r);
r.cx = DTCX * 60;
r.cy = DTCY * 10;
__dialogAddItem(hd,TXWS_SZCLASS,"",IDD_DROP,&r,TXWS_TEXT|TXWS_OPENTEXT|WS_BORDER|WS_CHILD|WS_VISIBLE);
dialogLF(hd);
dialogCaption(hd,"WZのメニューから「ファイル|メール送信」を実行すると、指定したメーラを呼び出します。");
dialogCaption(hd,"このときにWZで作成していた文書はクリップボードにコピーされます。");
dialogCaption(hd,"メーラで、メッセージの作成を実行し、メッセージの入力ウィンドウでペーストすると、");
dialogCaption(hd,"WZで作成した文書をコピーできます。");
//
macroHookWndText();
int ret = dialogOpen(hd);
macroHookWndTextFree();
//
if (ret) {
txConfigOp(text,TXCONFIGOP_SHARESAVE,NULL);
}
return ret;
#else
PMACROFUNC pfunc;
macroGetFuncAddress("convprocIdMail",&pfunc);
dialogControlConvert(hd,&pfunc);
dialogSelectIDW(hd,"メーラ(&M):",&shcfg->idMailer,lx,20,"Internet Mail","Eudora PRO","Becky!");
dialogStrC(hd,"コマンド名(&C):",shcfg->szMailer,lx,cchof(shcfg->szMailer),30);
return dialogOpen(hd);
#endif
}
#endif
#define IDD_EMAIL 100
#define IDD_EMAIL_SEL 101
BOOL dlgprocConfigEmail(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message) {
case WM_COMMAND: {
int id = WM_COMMAND_GetId(wParam);
if (id == IDD_EMAIL_SEL) {
TX* text = txuiAbNew();
if (text) {
txstr szEmail;
txAbSearchItem(text,"email",szEmail);
SetDlgItemText(hwnd,IDD_EMAIL,szEmail);
txAbDelete(text);
}
}
break;
}
}
return FALSE;
}
BOOL TXAPI txuiInputEmail(TX* text,mchar* szCaption,txstr szEmail)
{
HDIALOG hd = dialog(szCaption);
dialogSetHookEx(hd,"\m.dlgprocConfigEmail");
//
dialogControlID(hd,IDD_EMAIL);
dialogStr(hd,"E-mail(&E)アドレス:",szEmail,16,40);
//
dialogControlID(hd,IDD_EMAIL_SEL);
dialogButton(hd,"住所録(&A)...",NULL,16);
//
if (dialogOpen(hd)) {
if (szEmail[0]) return TRUE;
}
return FALSE;
}
permanent txstr p_szEmail;
#ifdef __FLAT__
static BOOL mailerExec(TX* text)
{
//2.98 970310 renew
if (!text->ehHwnd) {
#if 1//2.99 970315 "mailto"を使う
// 送信先E-mailアドレスの指定
if (txuiInputEmail(text,"メール送信先",p_szEmail)) {
// クリップボードへコピー。
txClipCopy(text,0,txGetTextSize(text),HCLIP_WIN,CLIP_CHAR);
TXCONFIGSHARE *shcfg = &text->share->config;
// 起動
text->share->fehSendMailDoing = TRUE;
text->share->wtmSendMailStart = GetCurrentTime();
if (shcfg->idMailer == MAIL_BECKY) {//2.99 970315
WinExec(shcfg->szMailer + " /A" + p_szEmail,SW_SHOWNORMAL);
} else {
ShellExecute(text->hwndbase,"open","mailto:" + p_szEmail,NULL,NULL,SW_SHOWNORMAL);
}
}
#else
// クリップボードへコピー。
txClipCopy(text,0,txGetTextSize(text),HCLIP_WIN,CLIP_CHAR);
TXCONFIGSHARE *shcfg = &text->share->config;
// 起動。
mchar* szAdr = "test@domain.co.jp";
if (shcfg->idMailer == MAIL_BECKY) {//2.99 970315
WinExec(shcfg->szMailer + " /A" + szAdr,SW_SHOWNORMAL);
} else {
#if 1//2.99 970315
// "mailto"の場合はアドレスも指定する必要あり。
ShellExecute(text->hwndbase,"open","mailto:" + szAdr,NULL,NULL,SW_SHOWNORMAL);
#else
WinExec(shcfg->szMailer,SW_SHOWNORMAL);
#endif
}
return TRUE;
#endif
}
return FALSE;
}
#endif
BOOL TXCMDBASE sendMail(TX* text)
{
// メール送信
//2.90 [ファイル]-[送信]コマンド追加
#if 1//2.90
#ifdef __FLAT__
if (!textGetStayAlways()) {
//2.99C 970326 WZが常駐してないときはメール送信できないようにした
#if 1//2.99D 970402 具合がよくないのですぐ終わる
information("メールを送信するには、WZを常駐させてください。\n");
return FALSE;
#else
int ret = question(
"メールを送信するには、WZを常駐させてください。\n"
"WZを常駐しますか?"
);
if (ret == IDYES) {
stay();
} else {
return FALSE;
}
#endif
}
if (!text->share->config.fEnableEhMail) {//2.99I 970405 WZを常駐してても「メーラのフックを行う」がOFFだとメール送信できないので、メッセージを出すようにした。
information(
"WZからメールを送信するには、常駐WZで[メーラのフックを行う]オプションをONにしてください。\n"
"このオプションを指定するには、タスクバーに常駐している常駐WZを右クリックして、設定を選んでください。\n"
);
return FALSE;
}
if (text->modeMail) {//2.98 970310 メーラのエディタフック起動の場合
if (text->fEdit) txuiSave(text);
return txuiClose(text);
} else {
#if 1//2.99 970315
return mailerExec(text);
#else
TXCONFIGSHARE *shcfg = &text->share->config;
if (!shcfg->szMailer[0]) {
if (!configMailer()) return FALSE;
if (!shcfg->szMailer[0]) return FALSE;
}
return mailerExec(text);
#endif
}
#else
information(
"WZ16ではメール送信は行えません。\n"
"WZからメールを送信するには、WZ32で行ってください。"
);
return FALSE;
#endif
#else
// exchangeを使ってメールを送信します。
// 実行前にexchangeを起動しておいてください。
//2.00Eで追加
#ifdef __FLAT__
return txSendMail(text);
#else
information("WZ16ではメール送信は使えません");
return FALSE;
#endif
#endif
}