Revision: 9053 https://osdn.net/projects/ttssh2/scm/svn/commits/9053 Author: zmatsuo Date: 2020-12-20 21:06:16 +0900 (Sun, 20 Dec 2020) Log Message: ----------- ttpfile.dll のダイアログを使用しないようにした - filesys.cpp, filesys_proto.cpp, vtwin.cpp へ移動 - GetSetupFname() - GetTransFname() - GetMultiFname() - GetGetFname() - SetFileVar() - GetXFname() Modified Paths: -------------- trunk/teraterm/teraterm/filesys.cpp trunk/teraterm/teraterm/filesys.h trunk/teraterm/teraterm/filesys_log.rc trunk/teraterm/teraterm/filesys_log_res.h trunk/teraterm/teraterm/filesys_proto.cpp trunk/teraterm/teraterm/vtwin.cpp -------------- next part -------------- Modified: trunk/teraterm/teraterm/filesys.cpp =================================================================== --- trunk/teraterm/teraterm/filesys.cpp 2020-12-20 12:06:06 UTC (rev 9052) +++ trunk/teraterm/teraterm/filesys.cpp 2020-12-20 12:06:16 UTC (rev 9053) @@ -90,6 +90,7 @@ static HMODULE HTTFILE = NULL; static int TTFILECount = 0; +#if 0 PGetSetupFname GetSetupFname; PGetTransFname GetTransFname; PGetMultiFname GetMultiFname; @@ -96,6 +97,7 @@ PGetGetFname GetGetFname; PSetFileVar SetFileVar; PGetXFname GetXFname; +#endif PProtoInit ProtoInit; PProtoParse ProtoParse; PProtoTimeOutProc ProtoTimeOutProc; @@ -103,6 +105,7 @@ PTTFILESetUILanguageFile TTFILESetUILanguageFile; PTTFILESetFileSendFilter TTFILESetFileSendFilter; +#if 0 #define IdGetSetupFname 1 #define IdGetTransFname 2 #define IdGetMultiFname 3 @@ -109,6 +112,7 @@ #define IdGetGetFname 4 #define IdSetFileVar 5 #define IdGetXFname 6 +#endif #define IdProtoInit 7 #define IdProtoParse 8 @@ -136,6 +140,7 @@ Err = FALSE; +#if 0 GetSetupFname = (PGetSetupFname)GetProcAddress(HTTFILE, MAKEINTRESOURCE(IdGetSetupFname)); if (GetSetupFname==NULL) @@ -165,6 +170,7 @@ MAKEINTRESOURCE(IdGetXFname)); if (GetXFname==NULL) Err = TRUE; +#endif ProtoInit = (PProtoInit)GetProcAddress(HTTFILE, MAKEINTRESOURCE(IdProtoInit)); @@ -305,6 +311,248 @@ } } +/* \x83_\x83C\x83A\x83\x8D\x83O\x82𒆉\x9B\x82Ɉړ\xAE\x82\xB7\x82\xE9 */ +static void CenterCommonDialog(HWND hDlg) +{ + /* hDlg\x82̐e\x82\xAA\x83_\x83C\x83A\x83\x8D\x83O\x82̃E\x83B\x83\x93\x83h\x83E\x83n\x83\x93\x83h\x83\x8B */ + HWND hWndDlgRoot = GetParent(hDlg); + CenterWindow(hWndDlgRoot, GetParent(hWndDlgRoot)); +} + +static HFONT DlgFoptFont; +static UINT_PTR CALLBACK TransFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam) +{ + static const DlgTextInfo text_info[] = { + { IDC_FOPT, "DLG_FOPT" }, + { IDC_FOPTBIN, "DLG_FOPT_BINARY" }, + }; + LPOPENFILENAME ofn; + LPWORD pw; + LPOFNOTIFY notify; + LOGFONT logfont; + HFONT font; + const char *UILanguageFile = ts.UILanguageFile; + + switch (Message) { + case WM_INITDIALOG: + ofn = (LPOPENFILENAME)lParam; + pw = (LPWORD)ofn->lCustData; + SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)pw); + + font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0); + GetObject(font, sizeof(LOGFONT), &logfont); + if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) { + SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0)); + } + else { + DlgFoptFont = NULL; + } + + SetI18nDlgStrs("Tera Term", Dialog, text_info, _countof(text_info), UILanguageFile); + + SetRB(Dialog,*pw & 1,IDC_FOPTBIN,IDC_FOPTBIN); + + CenterCommonDialog(Dialog); + + return TRUE; + case WM_COMMAND: // for old style dialog + switch (LOWORD(wParam)) { + case IDOK: + pw = (LPWORD)GetWindowLongPtr(Dialog,DWLP_USER); + if (pw!=NULL) + GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN); + if (DlgFoptFont != NULL) { + DeleteObject(DlgFoptFont); + } + break; + case IDCANCEL: + if (DlgFoptFont != NULL) { + DeleteObject(DlgFoptFont); + } + break; + } + break; + case WM_NOTIFY: // for Explorer-style dialog + notify = (LPOFNOTIFY)lParam; + switch (notify->hdr.code) { + case CDN_FILEOK: + pw = (LPWORD)GetWindowLongPtr(Dialog,DWLP_USER); + if (pw!=NULL) + GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN); + if (DlgFoptFont != NULL) { + DeleteObject(DlgFoptFont); + } + break; + } + break; + } + return FALSE; +} + +static BOOL _GetTransFname(PFileVar fv, PCHAR CurDir, WORD FuncId, LPLONG Option) +{ + char uimsg[MAX_UIMSG]; + char *FNFilter; + OPENFILENAME ofn; + WORD optw; + wchar_t TempDir[MAXPATHLEN]; + BOOL Ok; + char FileName[MAX_PATH]; + const char *UILanguageFile = ts.UILanguageFile; + + /* save current dir */ + _GetCurrentDirectoryW(_countof(TempDir), TempDir); + + memset(&ofn, 0, sizeof(OPENFILENAME)); + + strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE); + switch (FuncId) { + case GTF_SEND: + get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case GTF_BP: + get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + default: + return FALSE; + } + + FNFilter = GetCommonDialogFilterA(ts.FileSendFilter, UILanguageFile); + + ExtractFileName(fv->FullName, FileName ,sizeof(FileName)); + strncpy_s(fv->FullName, sizeof(fv->FullName), FileName, _TRUNCATE); + ofn.lStructSize = get_OPENFILENAME_SIZE(); + ofn.hwndOwner = fv->HMainWin; + ofn.lpstrFilter = FNFilter; + ofn.nFilterIndex = 1; + ofn.lpstrFile = fv->FullName; + ofn.nMaxFile = sizeof(fv->FullName); + ofn.lpstrInitialDir = CurDir; + + switch (FuncId) { + case GTF_SEND: + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING; + ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT); + + ofn.lpfnHook = (LPOFNHOOKPROC)(&TransFnHook); + optw = (WORD)*Option; + ofn.lCustData = (LPARAM)&optw; + break; + case GTF_BP: + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + break; + } + + ofn.Flags |= OFN_SHOWHELP; + + ofn.lpstrTitle = fv->DlgCaption; + + ofn.hInstance = hInst; + + Ok = GetOpenFileName(&ofn); + free(FNFilter); + + if (Ok) { + *Option = (long)optw; + + fv->DirLen = ofn.nFileOffset; + + if (CurDir!=NULL) { + memcpy(CurDir,fv->FullName,fv->DirLen-1); + CurDir[fv->DirLen-1] = 0; + } + } + /* restore dir */ + _SetCurrentDirectoryW(TempDir); + return Ok; +} + +static void _SetFileVar(PFileVar fv) +{ + int i; + char uimsg[MAX_UIMSG]; + char c; + const char *UILanguageFile = ts.UILanguageFile; + + GetFileNamePos(fv->FullName,&(fv->DirLen),&i); + c = fv->FullName[fv->DirLen]; + if (c=='\\'||c=='/') fv->DirLen++; + strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE); + switch (fv->OpId) { + case OpLog: + get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpSendFile: + get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpKmtRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_KMTRCV", uimsg, sizeof(uimsg), TitKmtRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpKmtGet: + get_lang_msg("FILEDLG_TRANS_TITLE_KMTGET", uimsg, sizeof(uimsg), TitKmtGet, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpKmtSend: + get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpKmtFin: + get_lang_msg("FILEDLG_TRANS_TITLE_KMTFIN", uimsg, sizeof(uimsg), TitKmtFin, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpXRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpXSend: + get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpYRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_YRCV", uimsg, sizeof(uimsg), TitYRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpYSend: + get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpZRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_ZRCV", uimsg, sizeof(uimsg), TitZRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpZSend: + get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpBPRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_BPRCV", uimsg, sizeof(uimsg), TitBPRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpBPSend: + get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpQVRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_QVRCV", uimsg, sizeof(uimsg), TitQVRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpQVSend: + get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + } +} + void FileSendStart(void) { LONG Option = 0; @@ -333,7 +581,7 @@ if (ts.TransBin) Option |= LOGDLG_BINARY; SendVar->FullName[0] = 0; - if (! (*GetTransFname)(SendVar, FileDirExpanded, GTF_SEND, &Option)) { + if (! _GetTransFname(SendVar, FileDirExpanded, GTF_SEND, &Option)) { FileTransEnd(OpSendFile); return; } @@ -340,7 +588,7 @@ ts.TransBin = CheckFlag(Option, LOGDLG_BINARY); } else - (*SetFileVar)(SendVar); + _SetFileVar(SendVar); SendVar->FileHandle = CreateFile(SendVar->FullName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); Modified: trunk/teraterm/teraterm/filesys.h =================================================================== --- trunk/teraterm/teraterm/filesys.h 2020-12-20 12:06:06 UTC (rev 9052) +++ trunk/teraterm/teraterm/filesys.h 2020-12-20 12:06:16 UTC (rev 9053) @@ -33,6 +33,8 @@ #ifdef __cplusplus extern "C" { #endif + +#if 0 typedef BOOL (PASCAL *PGetSetupFname) (HWND HWin, WORD FuncId, PTTSet ts); typedef BOOL (PASCAL *PGetTransFname) @@ -44,6 +46,7 @@ typedef void (PASCAL *PSetFileVar) (PFileVar fv); typedef BOOL (PASCAL *PGetXFname) (HWND HWin, BOOL Receive, LPLONG Option, PFileVar fv, PCHAR CurDir); +#endif typedef void (PASCAL *PProtoInit) (int Proto, PFileVar fv, PCHAR pv, PComVar cv, PTTSet ts); typedef BOOL (PASCAL *PProtoParse) @@ -57,6 +60,7 @@ typedef BOOL (PASCAL *PTTFILESetFileSendFilter) (char *file); +#if 0 extern PGetSetupFname GetSetupFname; extern PGetTransFname GetTransFname; extern PGetMultiFname GetMultiFname; @@ -63,12 +67,15 @@ extern PGetGetFname GetGetFname; extern PSetFileVar SetFileVar; extern PGetXFname GetXFname; +#endif extern PProtoInit ProtoInit; extern PProtoParse ProtoParse; extern PProtoTimeOutProc ProtoTimeOutProc; extern PProtoCancel ProtoCancel; +#if 0 extern PTTFILESetUILanguageFile TTFILESetUILanguageFile; extern PTTFILESetFileSendFilter TTFILESetFileSendFilter; +#endif BOOL LoadTTFILE(void); BOOL FreeTTFILE(void); Modified: trunk/teraterm/teraterm/filesys_log.rc =================================================================== --- trunk/teraterm/teraterm/filesys_log.rc 2020-12-20 12:06:06 UTC (rev 9052) +++ trunk/teraterm/teraterm/filesys_log.rc 2020-12-20 12:06:16 UTC (rev 9053) @@ -93,7 +93,44 @@ EDITTEXT IDC_EDIT_COMMENT,6,3,189,12,ES_AUTOHSCROLL END +IDD_FOPT DIALOGEX 0, 0, 300, 67 +STYLE DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS +FONT 8, "Tahoma", 0, 0, 0x0 +BEGIN + GROUPBOX "Option",IDC_FOPT,5,2,290,59 + CONTROL "Bina&ry",IDC_FOPTBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,10,60,16 + CONTROL "&Append",IDC_FOPTAPPEND,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,100,10,60,16 + CONTROL "&Plain text",IDC_PLAINTEXT,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,179,10,80,16 + CONTROL "Hide &dialog",IDC_HIDEDIALOG,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,10,24,88,16 + CONTROL "In&clude screen buffer",IDC_ALLBUFF_INFIRST,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,100,24,96,16 + CONTROL "&Timestamp",IDC_TIMESTAMP,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,10,38,80,16 + COMBOBOX IDC_TIMESTAMPTYPE,90,40,120,60,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP +END +IDD_XOPT DIALOGEX 0, 0, 300, 30 +STYLE DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS +FONT 8, "Tahoma", 0, 0, 0x0 +BEGIN + GROUPBOX "Option",IDC_XOPT,5,2,290,25 + CONTROL "Check&sum",IDC_XOPTCHECK,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE | WS_GROUP,10,10,70,16 + CONTROL "&CRC",IDC_XOPTCRC,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,80,10,50,16 + CONTROL "1&K",IDC_XOPT1K,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,10,10,50,16 + CONTROL "Bina&ry",IDC_XOPTBIN,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,130,10,60,16 +END + +IDD_GETFNDLG DIALOGEX 20, 20, 150, 59 +STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Tera Term: Kermit Get" +FONT 10, "System", 0, 0, 0x0 +BEGIN + RTEXT "&Filename:",IDC_FILENAME,12,13,47,10 + EDITTEXT IDC_GETFN,62,11,72,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,12,36,34,14 + PUSHBUTTON "Cancel",IDCANCEL,54,36,40,14 + PUSHBUTTON "&Help",IDC_GETFNHELP,101,36,34,14 +END + + ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO Modified: trunk/teraterm/teraterm/filesys_log_res.h =================================================================== --- trunk/teraterm/teraterm/filesys_log_res.h 2020-12-20 12:06:06 UTC (rev 9052) +++ trunk/teraterm/teraterm/filesys_log_res.h 2020-12-20 12:06:16 UTC (rev 9053) @@ -2,12 +2,11 @@ // Microsoft Visual C++ \x82Ő\xB6\x90\xAC\x82\xB3\x82ꂽ\x83C\x83\x93\x83N\x83\x8B\x81[\x83h \x83t\x83@\x83C\x83\x8B\x81B // filesys_log.rc \x82Ŏg\x97p // -// IDD_COMMENT_DIALOG \x82\xC6 IDD_LOGDLG \x82\xCD -// common/tt_res.h \x82Ɠ\xAF\x82\xB6\x92l\x82ɂ\xB7\x82邱\x82\xC6 -// #define IDD_COMMENT_DIALOG 110 #define IDD_LOGDLG 115 +#define IDD_FOPT 130 #define IDC_EDIT_COMMENT 1000 +#define IDC_FOPTAPPEND 1002 #define IDC_PLAINTEXT 1003 #define IDC_TIMESTAMP 1004 #define IDC_HIDEDIALOG 1005 @@ -14,6 +13,14 @@ #define IDC_ALLBUFF_INFIRST 1006 #define IDC_TIMESTAMPTYPE 1007 #define IDC_BOM 1008 +#define IDC_XOPTCHECK 1101 +#define IDC_XOPTCRC 1102 +#define IDC_XOPT1K 1103 +#define IDC_XOPTBIN 1104 +#define IDD_XOPT 1105 +#define IDD_GETFNDLG 2000 +#define IDC_GETFN 2001 +#define IDC_GETFNHELP 2099 #define IDC_FOPT_FILENAME_BUTTON 2596 #define IDC_SENDFILE_FILENAME_TITLE 2598 #define IDC_FOPT_FILENAME_EDIT 2599 @@ -22,9 +29,13 @@ #define IDC_FOPTTEXT 2609 #define IDC_NEW_OVERWRITE 2612 #define IDC_APPEND 2613 +#define IDC_FOPT_BINARY 2614 +#define IDC_FOPT 65535 +#define IDC_XOPT 65535 +#define IDC_FILENAME 65535 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 Modified: trunk/teraterm/teraterm/filesys_proto.cpp =================================================================== --- trunk/teraterm/teraterm/filesys_proto.cpp 2020-12-20 12:06:06 UTC (rev 9052) +++ trunk/teraterm/teraterm/filesys_proto.cpp 2020-12-20 12:06:16 UTC (rev 9053) @@ -772,6 +772,225 @@ FreeFileVar_(&FileVar); } +/* \x83_\x83C\x83A\x83\x8D\x83O\x82𒆉\x9B\x82Ɉړ\xAE\x82\xB7\x82\xE9 */ +static void CenterCommonDialog(HWND hDlg) +{ + /* hDlg\x82̐e\x82\xAA\x83_\x83C\x83A\x83\x8D\x83O\x82̃E\x83B\x83\x93\x83h\x83E\x83n\x83\x93\x83h\x83\x8B */ + HWND hWndDlgRoot = GetParent(hDlg); + CenterWindow(hWndDlgRoot, GetParent(hWndDlgRoot)); +} + +//static char FileSendFilter[128]; +static HFONT DlgXoptFont; + +/* Hook function for XMODEM file name dialog box */ +static UINT_PTR CALLBACK XFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam) +{ + static const DlgTextInfo text_info[] = { + { IDC_XOPT, "DLG_XOPT" }, + { IDC_XOPTCHECK, "DLG_XOPT_CHECKSUM" }, + { IDC_XOPTCRC, "DLG_XOPT_CRC" }, + { IDC_XOPT1K, "DLG_XOPT_1K" }, + { IDC_XOPTBIN, "DLG_XOPT_BINARY" }, + }; + LPOPENFILENAME ofn; + WORD Hi, Lo; + LPLONG pl; + LPOFNOTIFY notify; + LOGFONT logfont; + HFONT font; + const char *UILanguageFile = ts.UILanguageFile; + + switch (Message) { + case WM_INITDIALOG: + ofn = (LPOPENFILENAME)lParam; + pl = (LPLONG)ofn->lCustData; + SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)pl); + + font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0); + GetObject(font, sizeof(LOGFONT), &logfont); + if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgXoptFont, UILanguageFile)) { + SendDlgItemMessage(Dialog, IDC_XOPT, WM_SETFONT, (WPARAM)DlgXoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_XOPTCHECK, WM_SETFONT, (WPARAM)DlgXoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_XOPTCRC, WM_SETFONT, (WPARAM)DlgXoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_XOPT1K, WM_SETFONT, (WPARAM)DlgXoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_XOPTBIN, WM_SETFONT, (WPARAM)DlgXoptFont, MAKELPARAM(TRUE,0)); + } + else { + DlgXoptFont = NULL; + } + + SetI18nDlgStrs("Tera Term", Dialog, text_info, _countof(text_info), UILanguageFile); + + if (LOWORD(*pl)==0xFFFF) { // Send + ShowDlgItem(Dialog, IDC_XOPT1K, IDC_XOPT1K); + Hi = 0; + if (HIWORD(*pl) == Xopt1kCRC || HIWORD(*pl) == Xopt1kCksum) { + Hi = 1; + } + SetRB(Dialog, Hi, IDC_XOPT1K, IDC_XOPT1K); + } + else { // Recv + ShowDlgItem(Dialog, IDC_XOPTCHECK, IDC_XOPTCRC); + Hi = HIWORD(*pl); + if (Hi == Xopt1kCRC) { + Hi = XoptCRC; + } + else if (Hi == Xopt1kCksum) { + Hi = XoptCheck; + } + SetRB(Dialog, Hi, IDC_XOPTCHECK, IDC_XOPTCRC); + + ShowDlgItem(Dialog,IDC_XOPTBIN,IDC_XOPTBIN); + SetRB(Dialog,LOWORD(*pl),IDC_XOPTBIN,IDC_XOPTBIN); + } + CenterCommonDialog(Dialog); + return TRUE; + case WM_COMMAND: // for old style dialog + switch (LOWORD(wParam)) { + case IDOK: + pl = (LPLONG)GetWindowLongPtr(Dialog,DWLP_USER); + if (pl!=NULL) + { + if (LOWORD(*pl)==0xFFFF) { // Send + Lo = 0xFFFF; + + GetRB(Dialog, &Hi, IDC_XOPT1K, IDC_XOPT1K); + if (Hi > 0) { // force CRC if 1K + Hi = Xopt1kCRC; + } + else { + Hi = XoptCRC; + } + } + else { // Recv + GetRB(Dialog, &Lo, IDC_XOPTBIN, IDC_XOPTBIN); + GetRB(Dialog, &Hi, IDC_XOPTCHECK, IDC_XOPTCRC); + } + *pl = MAKELONG(Lo,Hi); + } + if (DlgXoptFont != NULL) { + DeleteObject(DlgXoptFont); + } + break; + case IDCANCEL: + if (DlgXoptFont != NULL) { + DeleteObject(DlgXoptFont); + } + break; + } + break; + case WM_NOTIFY: // for Explorer-style dialog + notify = (LPOFNOTIFY)lParam; + switch (notify->hdr.code) { + case CDN_FILEOK: + pl = (LPLONG)GetWindowLongPtr(Dialog,DWLP_USER); + if (pl!=NULL) { + if (LOWORD(*pl) == 0xFFFF) { // Send + Lo = 0xFFFF; + + GetRB(Dialog, &Hi, IDC_XOPT1K, IDC_XOPT1K); + if (Hi > 0) { // force CRC if 1K + Hi = Xopt1kCRC; + } + else { + Hi = XoptCRC; + } + } + else { // Recv + GetRB(Dialog, &Lo, IDC_XOPTBIN, IDC_XOPTBIN); + GetRB(Dialog, &Hi, IDC_XOPTCHECK, IDC_XOPTCRC); + } + *pl = MAKELONG(Lo, Hi); + } + if (DlgXoptFont != NULL) { + DeleteObject(DlgXoptFont); + } + break; + } + break; + } + return FALSE; +} + +static BOOL _GetXFname(HWND HWin, BOOL Receive, LPLONG Option, PFileVar fv, PCHAR CurDir) +{ + LONG opt; + BOOL Ok; + const char *FileSendFilter = ts.FileSendFilter; + const char *UILanguageFile = ts.UILanguageFile; + + char *FNFilter = GetCommonDialogFilterA(!Receive ? FileSendFilter : NULL, UILanguageFile); + + fv->FullName[0] = 0; + if (!Receive) { + if (strlen(FileSendFilter) > 0) { + // \x83t\x83B\x83\x8B\x83^\x82\xAA\x83\x8F\x83C\x83\x8B\x83h\x83J\x81[\x83h\x82ł͂Ȃ\xAD\x81A\x82\xBB\x82̃t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9\x8Fꍇ + // \x82\xA0\x82炩\x82\xB6\x82߃f\x83t\x83H\x83\x8B\x83g\x82̃t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x93\xFC\x82\xEA\x82Ă\xA8\x82\xAD (2008.5.18 maya) + if (!isInvalidFileNameChar(FileSendFilter)) { + char file[MAX_PATH]; + strncpy_s(file, sizeof(file), CurDir, _TRUNCATE); + AppendSlash(file, sizeof(file)); + strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE); + if (_access(file, 0) == 0) { + strncpy_s(fv->FullName, sizeof(fv->FullName), FileSendFilter, _TRUNCATE); + } + } + } + } + + OPENFILENAME ofn = {}; + ofn.lStructSize = get_OPENFILENAME_SIZE(); + ofn.hwndOwner = HWin; + ofn.lpstrFilter = FNFilter; + ofn.nFilterIndex = 1; + ofn.lpstrFile = fv->FullName; + ofn.nMaxFile = sizeof(fv->FullName); + ofn.lpstrInitialDir = CurDir; + opt = *Option; + if (! Receive) + { + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + opt = opt | 0xFFFF; + } + else { + ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT; + } + ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING; + ofn.Flags |= OFN_SHOWHELP; + ofn.lCustData = (LPARAM)&opt; + ofn.lpstrTitle = fv->DlgCaption; + ofn.lpfnHook = XFnHook; + ofn.lpTemplateName = MAKEINTRESOURCE(IDD_XOPT); + ofn.hInstance = hInst; + + /* save current dir */ + wchar_t TempDir[MAXPATHLEN]; + _GetCurrentDirectoryW(_countof(TempDir), TempDir); + if (!Receive) + { + Ok = GetOpenFileName(&ofn); + } + else { + Ok = GetSaveFileName(&ofn); + } + _SetCurrentDirectoryW(TempDir); + + if (Ok) { + fv->DirLen = ofn.nFileOffset; + fv->FnPtr = ofn.nFileOffset; + memcpy(CurDir,fv->FullName,fv->DirLen-1); + CurDir[fv->DirLen-1] = 0; + + if (Receive) + *Option = opt; + else + *Option = MAKELONG(LOWORD(*Option),HIWORD(opt)); + } + + return Ok; +} + /** * OnIdle()#teraterm.cpp\x82\xA9\x82\xE7\x83R\x81[\x83\x8B\x82\xB3\x82\xEA\x82\xE9 * cv.ProtoFlag \x82\xAA 0 \x88ȊO\x82̂Ƃ\xAB @@ -809,6 +1028,362 @@ ProtoEnd(); } +static INT_PTR CALLBACK GetFnDlg(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam) +{ + static const DlgTextInfo text_info[] = { + { 0, "DLG_GETFN_TITLE" }, + { IDC_FILENAME, "DLG_GETFN_FILENAME" }, + { IDOK, "BTN_OK" }, + { IDCANCEL, "BTN_CANCEL" }, + { IDC_GETFNHELP, "BTN_HELP" }, + }; + PFileVar fv; + char TempFull[MAX_PATH]; + int i, j; + const char *UILanguageFile = ts.UILanguageFile; + + switch (Message) { + case WM_INITDIALOG: + fv = (PFileVar)lParam; + SetWindowLongPtr(Dialog, DWLP_USER, lParam); + SendDlgItemMessage(Dialog, IDC_GETFN, EM_LIMITTEXT, sizeof(TempFull)-1,0); + SetI18nDlgStrs("Tera Term", Dialog, text_info, _countof(text_info), UILanguageFile); + return TRUE; + + case WM_COMMAND: + fv = (PFileVar)GetWindowLongPtr(Dialog,DWLP_USER); + switch (LOWORD(wParam)) { + case IDOK: + if (fv!=NULL) { + GetDlgItemText(Dialog, IDC_GETFN, TempFull, sizeof(TempFull)); + if (strlen(TempFull)==0) return TRUE; + GetFileNamePos(TempFull,&i,&j); + FitFileName(&(TempFull[j]),sizeof(TempFull) - j, NULL); + strncat_s(fv->FullName,sizeof(fv->FullName),&(TempFull[j]),_TRUNCATE); + } + EndDialog(Dialog, 1); + return TRUE; + case IDCANCEL: + EndDialog(Dialog, 0); + return TRUE; + case IDC_GETFNHELP: + if (fv!=NULL) { + // \x8CĂяo\x82\xB5\x8C\xB3\x82\xAA\x83w\x83\x8B\x83vID\x82\xF0\x8F\x80\x94\x{142DC2}\xE9 + PostMessage(fv->HMainWin,WM_USER_DLGHELP2,0,0); + } + break; + } + } + return FALSE; +} + +static BOOL _GetGetFname(HWND HWin, PFileVar fv, PTTSet ts) +{ + SetDialogFont(ts->DialogFontName, ts->DialogFontPoint, ts->DialogFontCharSet, + ts->UILanguageFile, "Tera Term", "DLG_SYSTEM_FONT"); + return (BOOL)TTDialogBoxParam(hInst, + MAKEINTRESOURCE(IDD_GETFNDLG), + HWin, GetFnDlg, (LPARAM)fv); +} + +static HFONT DlgFoptFont; + +static UINT_PTR CALLBACK TransFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam) +{ + static const DlgTextInfo text_info[] = { + { IDC_FOPT, "DLG_FOPT" }, + { IDC_FOPTBIN, "DLG_FOPT_BINARY" }, + }; + LPOPENFILENAME ofn; + LPWORD pw; + LPOFNOTIFY notify; + LOGFONT logfont; + HFONT font; + const char *UILanguageFile = ts.UILanguageFile; + + switch (Message) { + case WM_INITDIALOG: + ofn = (LPOPENFILENAME)lParam; + pw = (LPWORD)ofn->lCustData; + SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)pw); + + font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0); + GetObject(font, sizeof(LOGFONT), &logfont); + if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) { + SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0)); + SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0)); + } + else { + DlgFoptFont = NULL; + } + + SetI18nDlgStrs("Tera Term", Dialog, text_info, _countof(text_info), UILanguageFile); + + SetRB(Dialog,*pw & 1,IDC_FOPTBIN,IDC_FOPTBIN); + + CenterCommonDialog(Dialog); + + return TRUE; + case WM_COMMAND: // for old style dialog + switch (LOWORD(wParam)) { + case IDOK: + pw = (LPWORD)GetWindowLongPtr(Dialog,DWLP_USER); + if (pw!=NULL) + GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN); + if (DlgFoptFont != NULL) { + DeleteObject(DlgFoptFont); + } + break; + case IDCANCEL: + if (DlgFoptFont != NULL) { + DeleteObject(DlgFoptFont); + } + break; + } + break; + case WM_NOTIFY: // for Explorer-style dialog + notify = (LPOFNOTIFY)lParam; + switch (notify->hdr.code) { + case CDN_FILEOK: + pw = (LPWORD)GetWindowLongPtr(Dialog,DWLP_USER); + if (pw!=NULL) + GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN); + if (DlgFoptFont != NULL) { + DeleteObject(DlgFoptFont); + } + break; + } + break; + } + return FALSE; +} + +static BOOL _GetMultiFname(PFileVar fv, PCHAR CurDir, WORD FuncId, LPWORD Option) +{ + int i, len; + char uimsg[MAX_UIMSG]; + char *FNFilter; + OPENFILENAME ofn; + wchar_t TempDir[MAXPATHLEN]; + BOOL Ok; + char defaultFName[MAX_PATH]; + const char *FileSendFilter = ts.FileSendFilter; + const char *UILanguageFile = ts.UILanguageFile; + + /* save current dir */ + _GetCurrentDirectoryW(_countof(TempDir), TempDir); + + fv->NumFname = 0; + + strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE); + switch (FuncId) { + case GMF_KERMIT: + get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case GMF_Z: + get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case GMF_QV: + get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case GMF_Y: + get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + default: + return FALSE; + } + + /* moemory should be zero-initialized */ + fv->FnStrMemHandle = GlobalAlloc(GHND, FnStrMemSize); + if (fv->FnStrMemHandle == NULL) { + MessageBeep(0); + return FALSE; + } + else { + fv->FnStrMem = (char *)GlobalLock(fv->FnStrMemHandle); + if (fv->FnStrMem == NULL) { + GlobalFree(fv->FnStrMemHandle); + fv->FnStrMemHandle = 0; + MessageBeep(0); + return FALSE; + } + } + + FNFilter = GetCommonDialogFilterA(FileSendFilter, UILanguageFile); + + memset(&ofn, 0, sizeof(OPENFILENAME)); + ofn.lStructSize = get_OPENFILENAME_SIZE(); + ofn.hwndOwner = fv->HMainWin; + ofn.lpstrFilter = FNFilter; + ofn.nFilterIndex = 1; + ofn.lpstrFile = fv->FnStrMem; + ofn.nMaxFile = FnStrMemSize; + ofn.lpstrTitle= fv->DlgCaption; + ofn.lpstrInitialDir = CurDir; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + ofn.Flags |= OFN_ALLOWMULTISELECT | OFN_EXPLORER; + ofn.Flags |= OFN_SHOWHELP; + ofn.lCustData = 0; + if (FuncId==GMF_Z) { + ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING; + ofn.lCustData = (LPARAM)Option; + ofn.lpfnHook = TransFnHook; + ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT); + } else if (FuncId==GMF_Y) { + // TODO: YMODEM + + } + + ofn.hInstance = hInst; + + // \x83t\x83B\x83\x8B\x83^\x82\xAA\x83\x8F\x83C\x83\x8B\x83h\x83J\x81[\x83h\x82ł͂Ȃ\xAD\x81A\x82\xBB\x82̃t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9\x8Fꍇ + // \x82\xA0\x82炩\x82\xB6\x82߃f\x83t\x83H\x83\x8B\x83g\x82̃t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x93\xFC\x82\xEA\x82Ă\xA8\x82\xAD (2008.5.18 maya) + if (strlen(FileSendFilter) > 0 && !isInvalidFileNameChar(FileSendFilter)) { + char file[MAX_PATH]; + strncpy_s(file, sizeof(file), CurDir, _TRUNCATE); + AppendSlash(file, sizeof(file)); + strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE); + if (_access(file, 0) == 0) { + strncpy_s(defaultFName, sizeof(defaultFName), FileSendFilter, _TRUNCATE); + ofn.lpstrFile = defaultFName; + } + } + + Ok = GetOpenFileName(&ofn); + free(FNFilter); + + if (Ok) { + /* count number of file names */ + len = strlen(fv->FnStrMem); + i = 0; + while (len>0) { + i = i + len + 1; + fv->NumFname++; + len = strlen(&fv->FnStrMem[i]); + } + + fv->NumFname--; + + if (fv->NumFname<1) { // single selection + fv->NumFname = 1; + fv->DirLen = ofn.nFileOffset; + strncpy_s(fv->FullName, sizeof(fv->FullName),fv->FnStrMem, _TRUNCATE); + fv->FnPtr = 0; + } + else { // multiple selection + strncpy_s(fv->FullName, sizeof(fv->FullName),fv->FnStrMem, _TRUNCATE); + AppendSlash(fv->FullName,sizeof(fv->FullName)); + fv->DirLen = strlen(fv->FullName); + fv->FnPtr = strlen(fv->FnStrMem)+1; + } + + memcpy(CurDir,fv->FullName,fv->DirLen); + CurDir[fv->DirLen] = 0; + if ((fv->DirLen>3) && + (CurDir[fv->DirLen-1]=='\\')) + CurDir[fv->DirLen-1] = 0; + + fv->FNCount = 0; + } + + GlobalUnlock(fv->FnStrMemHandle); + if (! Ok) { + GlobalFree(fv->FnStrMemHandle); + fv->FnStrMemHandle = NULL; + } + + /* restore dir */ + _SetCurrentDirectoryW(TempDir); + + return Ok; +} + +static void _SetFileVar(PFileVar fv) +{ + int i; + char uimsg[MAX_UIMSG]; + char c; + const char *UILanguageFile = ts.UILanguageFile; + + GetFileNamePos(fv->FullName,&(fv->DirLen),&i); + c = fv->FullName[fv->DirLen]; + if (c=='\\'||c=='/') fv->DirLen++; + strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE); + switch (fv->OpId) { + case OpLog: + get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpSendFile: + get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpKmtRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_KMTRCV", uimsg, sizeof(uimsg), TitKmtRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpKmtGet: + get_lang_msg("FILEDLG_TRANS_TITLE_KMTGET", uimsg, sizeof(uimsg), TitKmtGet, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpKmtSend: + get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpKmtFin: + get_lang_msg("FILEDLG_TRANS_TITLE_KMTFIN", uimsg, sizeof(uimsg), TitKmtFin, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpXRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpXSend: + get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpYRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_YRCV", uimsg, sizeof(uimsg), TitYRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpYSend: + get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpZRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_ZRCV", uimsg, sizeof(uimsg), TitZRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpZSend: + get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpBPRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_BPRCV", uimsg, sizeof(uimsg), TitBPRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpBPSend: + get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpQVRcv: + get_lang_msg("FILEDLG_TRANS_TITLE_QVRCV", uimsg, sizeof(uimsg), TitQVRcv, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case OpQVSend: + get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + } +} + void KermitStart(int mode) { WORD w; @@ -823,7 +1398,7 @@ { char FileDirExpanded[MAX_PATH]; ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); - if (!(*GetMultiFname)(FileVar, FileDirExpanded, GMF_KERMIT, &w) || + if (!_GetMultiFname(FileVar, FileDirExpanded, GMF_KERMIT, &w) || (FileVar->NumFname==0)) { ProtoEnd(); @@ -831,7 +1406,7 @@ } } else - (*SetFileVar)(FileVar); + _SetFileVar(FileVar); break; case IdKmtReceive: FileVar->OpId = OpKmtRcv; @@ -840,7 +1415,7 @@ FileVar->OpId = OpKmtSend; if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0) { - if (! (*GetGetFname)(FileVar->HMainWin,FileVar, &ts) || + if (! _GetGetFname(FileVar->HMainWin,FileVar, &ts) || (strlen(FileVar->FullName)==0)) { ProtoEnd(); @@ -848,7 +1423,7 @@ } } else - (*SetFileVar)(FileVar); + _SetFileVar(FileVar); break; case IdKmtFinish: FileVar->OpId = OpKmtFin; @@ -942,8 +1517,8 @@ char FileDirExpanded[MAX_PATH]; ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt); - if (! (*GetXFname)(FileVar->HMainWin, - mode==IdXReceive,&Option,FileVar,FileDirExpanded)) + if (! _GetXFname(FileVar->HMainWin, + mode==IdXReceive,&Option,FileVar,FileDirExpanded)) { ProtoEnd(); return; @@ -988,7 +1563,7 @@ } } else - (*SetFileVar)(FileVar); + _SetFileVar(FileVar); if (mode==IdXReceive) FileVar->FileHandle = _lcreat(FileVar->FullName,0); @@ -1093,7 +1668,7 @@ FileVar->OpId = OpYSend; if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0) { - if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_Y,&Opt) || + if (! _GetMultiFname(FileVar,FileDirExpanded,GMF_Y,&Opt) || (FileVar->NumFname==0)) { ProtoEnd(); @@ -1102,13 +1677,13 @@ //ts.XmodemBin = Opt; } else - (*SetFileVar)(FileVar); + _SetFileVar(FileVar); } else { FileVar->OpId = OpYRcv; // \x83t\x83@\x83C\x83\x8B\x93]\x91\x97\x8E\x9E\x82̃I\x83v\x83V\x83\x87\x83\x93\x82\xCD"Yopt1K"\x82Ɍ\x88\x82ߑł\xBF\x81B Opt = Yopt1K; - (*SetFileVar)(FileVar); + _SetFileVar(FileVar); } TalkStatus = IdTalkQuiet; @@ -1165,7 +1740,7 @@ { char FileDirExpanded[MAX_PATH]; ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); - if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_Z,&Opt) || + if (! _GetMultiFname(FileVar,FileDirExpanded,GMF_Z,&Opt) || (FileVar->NumFname==0)) { if (mode == IdZAutoS) { @@ -1177,7 +1752,7 @@ ts.XmodemBin = Opt; } else - (*SetFileVar)(FileVar); + _SetFileVar(FileVar); } else /* IdZReceive or IdZAutoR */ FileVar->OpId = OpZRcv; @@ -1226,6 +1801,87 @@ return TRUE; } +static BOOL _GetTransFname(PFileVar fv, PCHAR CurDir, WORD FuncId, LPLONG Option) +{ + char uimsg[MAX_UIMSG]; + char *FNFilter; + OPENFILENAME ofn; + WORD optw; + wchar_t TempDir[MAXPATHLEN]; + BOOL Ok; + char FileName[MAX_PATH]; + const char *UILanguageFile = ts.UILanguageFile; + + /* save current dir */ + _GetCurrentDirectoryW(_countof(TempDir), TempDir); + + memset(&ofn, 0, sizeof(OPENFILENAME)); + + strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE); + switch (FuncId) { + case GTF_SEND: + get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + case GTF_BP: + get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile); + strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE); + break; + default: + return FALSE; + } + + FNFilter = GetCommonDialogFilterA(ts.FileSendFilter, UILanguageFile); + + ExtractFileName(fv->FullName, FileName ,sizeof(FileName)); + strncpy_s(fv->FullName, sizeof(fv->FullName), FileName, _TRUNCATE); + ofn.lStructSize = get_OPENFILENAME_SIZE(); + ofn.hwndOwner = fv->HMainWin; + ofn.lpstrFilter = FNFilter; + ofn.nFilterIndex = 1; + ofn.lpstrFile = fv->FullName; + ofn.nMaxFile = sizeof(fv->FullName); + ofn.lpstrInitialDir = CurDir; + + switch (FuncId) { + case GTF_SEND: + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING; + ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT); + + ofn.lpfnHook = (LPOFNHOOKPROC)(&TransFnHook); + optw = (WORD)*Option; + ofn.lCustData = (LPARAM)&optw; + break; + case GTF_BP: + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + break; + } + + ofn.Flags |= OFN_SHOWHELP; + + ofn.lpstrTitle = fv->DlgCaption; + + ofn.hInstance = hInst; + + Ok = GetOpenFileName(&ofn); + free(FNFilter); + + if (Ok) { + *Option = (long)optw; + + fv->DirLen = ofn.nFileOffset; + + if (CurDir!=NULL) { + memcpy(CurDir,fv->FullName,fv->DirLen-1); + CurDir[fv->DirLen-1] = 0; + } + } + /* restore dir */ + _SetCurrentDirectoryW(TempDir); + return Ok; +} + void BPStart(int mode) { LONG Option = 0; @@ -1240,7 +1896,7 @@ char FileDirExpanded[MAX_PATH]; ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); FileVar->FullName[0] = 0; - if (! (*GetTransFname)(FileVar, FileDirExpanded, GTF_BP, &Option)) + if (! _GetTransFname(FileVar, FileDirExpanded, GTF_BP, &Option)) { ProtoEnd(); return; @@ -1247,7 +1903,7 @@ } } else - (*SetFileVar)(FileVar); + _SetFileVar(FileVar); } else /* IdBPReceive or IdBPAuto */ FileVar->OpId = OpBPRcv; @@ -1306,7 +1962,7 @@ { char FileDirExpanded[MAX_PATH]; ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); - if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_QV, &W) || + if (! _GetMultiFname(FileVar,FileDirExpanded,GMF_QV, &W) || (FileVar->NumFname==0)) { ProtoEnd(); @@ -1314,7 +1970,7 @@ } } else - (*SetFileVar)(FileVar); + _SetFileVar(FileVar); } else FileVar->OpId = OpQVRcv; Modified: trunk/teraterm/teraterm/vtwin.cpp =================================================================== --- trunk/teraterm/teraterm/vtwin.cpp 2020-12-20 12:06:06 UTC (rev 9052) +++ trunk/teraterm/teraterm/vtwin.cpp 2020-12-20 12:06:16 UTC (rev 9053) @@ -4820,6 +4820,124 @@ FreeTTDLG(); } +static BOOL _GetSetupFname(HWND HWin, WORD FuncId, PTTSet ts) +{ + int i, j; + OPENFILENAME ofn; + char uimsg[MAX_UIMSG]; + + // char FNameFilter[HostNameMaxLength + 1]; // 81(yutaka) + char FNameFilter[81]; // 81(yutaka) + wchar_t TempDir[MAXPATHLEN]; + char Dir[MAXPATHLEN]; + char Name[MAX_PATH]; + BOOL Ok; + const char *UILanguageFile = ts->UILanguageFile; + + /* save current dir */ + _GetCurrentDirectoryW(_countof(TempDir), TempDir); + + /* File name filter */ + memset(FNameFilter, 0, sizeof(FNameFilter)); + if (FuncId==GSF_LOADKEY) { + get_lang_msg("FILEDLG_KEYBOARD_FILTER", uimsg, sizeof(uimsg), "keyboard setup files (*.cnf)\\0*.cnf\\0\\0", UILanguageFile); + memcpy(FNameFilter, uimsg, sizeof(FNameFilter)); + } + else { + get_lang_msg("FILEDLG_SETUP_FILTER", uimsg, sizeof(uimsg), "setup files (*.ini)\\0*.ini\\0\\0", UILanguageFile); + memcpy(FNameFilter, uimsg, sizeof(FNameFilter)); + } + + /* OPENFILENAME record */ + memset(&ofn, 0, sizeof(OPENFILENAME)); + + ofn.lStructSize = get_OPENFILENAME_SIZE(); + ofn.hwndOwner = HWin; + ofn.lpstrFile = Name; + ofn.nMaxFile = sizeof(Name); + ofn.lpstrFilter = FNameFilter; + ofn.nFilterIndex = 1; + ofn.hInstance = hInst; + + if (FuncId==GSF_LOADKEY) { + ofn.lpstrDefExt = "cnf"; + GetFileNamePos(ts->KeyCnfFN,&i,&j); + strncpy_s(Name, sizeof(Name),&(ts->KeyCnfFN[j]), _TRUNCATE); + memcpy(Dir,ts->KeyCnfFN,i); + Dir[i] = 0; + + if ((strlen(Name)==0) || (_stricmp(Name,"KEYBOARD.CNF")==0)) + strncpy_s(Name, sizeof(Name),"KEYBOARD.CNF", _TRUNCATE); + } + else { + ofn.lpstrDefExt = "ini"; + GetFileNamePos(ts->SetupFName,&i,&j); + strncpy_s(Name, sizeof(Name),&(ts->SetupFName[j]), _TRUNCATE); + memcpy(Dir,ts->SetupFName,i); + Dir[i] = 0; + + if ((strlen(Name)==0) || (_stricmp(Name,"TERATERM.INI")==0)) + strncpy_s(Name, sizeof(Name),"TERATERM.INI", _TRUNCATE); + } + + if (strlen(Dir)==0) + strncpy_s(Dir, sizeof(Dir),ts->HomeDir, _TRUNCATE); + + SetCurrentDirectoryA(Dir); + + switch (FuncId) { + case GSF_SAVE: + ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_SHOWHELP; + // \x8F\x89\x8A\xFA\x83t\x83@\x83C\x83\x8B\x83f\x83B\x83\x8C\x83N\x83g\x83\x8A\x82\xF0\x83v\x83\x8D\x83O\x83\x89\x83\x80\x96{\x91̂\xAA\x82\xA0\x82\xE9\x89ӏ\x8A\x82ɌŒ肷\x82\xE9 (2005.1.6 yutaka) + // \x93ǂݍ\x9E\x82܂ꂽteraterm.ini\x82\xAA\x82\xA0\x82\xE9\x83f\x83B\x83\x8C\x83N\x83g\x83\x8A\x82ɌŒ肷\x82\xE9\x81B + // \x82\xB1\x82\xEA\x82ɂ\xE6\x82\xE8\x81A/F= \x82Ŏw\x92肳\x82ꂽ\x88ʒu\x82ɕۑ\xB6\x82\xB3\x82\xEA\x82\xE9\x82悤\x82ɂȂ\xE9\x81B(2005.1.26 yutaka) + // Windows Vista \x82ł̓t\x83@\x83C\x83\x8B\x96\xBC\x82܂Ŏw\x92肷\x82\xE9\x82\xC6 NULL \x82Ɠ\xAF\x82\xB6\x8B\x93\x93\xAE\x82\xF0\x82\xB7\x82\xE9\x82悤\x82Ȃ̂ŁA + // \x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x8A܂܂Ȃ\xA2\x8C`\x82Ńf\x83B\x83\x8C\x83N\x83g\x83\x8A\x82\xF0\x8Ew\x92肷\x82\xE9\x82悤\x82ɂ\xB5\x82\xBD\x81B(2006.9.16 maya) +// ofn.lpstrInitialDir = __argv[0]; +// ofn.lpstrInitialDir = ts->SetupFName; + ofn.lpstrInitialDir = Dir; + get_lang_msg("FILEDLG_SAVE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Save setup", UILanguageFile); + ofn.lpstrTitle = uimsg; + Ok = GetSaveFileName(&ofn); + if (Ok) + strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE); + break; + case GSF_RESTORE: + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP; + get_lang_msg("FILEDLG_RESTORE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Restore setup", UILanguageFile); + ofn.lpstrTitle = uimsg; + Ok = GetOpenFileName(&ofn); + if (Ok) + strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE); + break; + case GSF_LOADKEY: + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP; + get_lang_msg("FILEDLG_LOAD_KEYMAP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Load key map", UILanguageFile); + ofn.lpstrTitle = uimsg; + Ok = GetOpenFileName(&ofn); + if (Ok) + strncpy_s(ts->KeyCnfFN, sizeof(ts->KeyCnfFN),Name, _TRUNCATE); + break; + default: + assert(FALSE); + Ok = FALSE; + break; + } + +#if defined(_DEBUG) + if (!Ok) { + DWORD Err = GetLastError(); + DWORD DlgErr = CommDlgExtendedError(); + assert(Err == 0 && DlgErr == 0); + } +#endif + + /* restore dir */ + _SetCurrentDirectoryW(TempDir); + + return Ok; +} + void CVTWindow::OnSetupSave() { BOOL Ok; @@ -4827,12 +4945,8 @@ int ret; strncpy_s(TmpSetupFN, sizeof(TmpSetupFN),ts.SetupFName, _TRUNCATE); - if (! LoadTTFILE()) { - return; - } HelpId = HlpSetupSave; - Ok = (*GetSetupFname)(HVTWin,GSF_SAVE,&ts); - FreeTTFILE(); + Ok = _GetSetupFname(HVTWin,GSF_SAVE,&ts); if (! Ok) { return; } @@ -4891,7 +5005,7 @@ if (! LoadTTFILE()) { return; } - Ok = (*GetSetupFname)(HVTWin,GSF_RESTORE,&ts); + Ok = _GetSetupFname(HVTWin,GSF_RESTORE,&ts); FreeTTFILE(); if (Ok) { RestoreSetup(); @@ -5381,7 +5495,7 @@ if (! LoadTTFILE()) { return; } - Ok = (*GetSetupFname)(HVTWin,GSF_LOADKEY,&ts); + Ok = _GetSetupFname(HVTWin,GSF_LOADKEY,&ts); FreeTTFILE(); if (! Ok) { return;