Revision: 10804 https://osdn.net/projects/ttssh2/scm/svn/commits/10804 Author: zmatsuo Date: 2023-07-23 16:07:16 +0900 (Sun, 23 Jul 2023) Log Message: ----------- ログダイアログを logdlg.cpp,h に分離した - teraterm/teraterm/logdlg.cpp,h 追加 Modified Paths: -------------- trunk/teraterm/teraterm/CMakeLists.txt trunk/teraterm/teraterm/filesys_log.cpp trunk/teraterm/teraterm/filesys_log.h trunk/teraterm/teraterm/ttermpro.v16.vcxproj trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters trunk/teraterm/teraterm/ttermpro.v17.vcxproj trunk/teraterm/teraterm/ttermpro.v17.vcxproj.filters trunk/teraterm/teraterm/vtwin.cpp Added Paths: ----------- trunk/teraterm/teraterm/logdlg.cpp trunk/teraterm/teraterm/logdlg.h -------------- next part -------------- Modified: trunk/teraterm/teraterm/CMakeLists.txt =================================================================== --- trunk/teraterm/teraterm/CMakeLists.txt 2023-07-22 14:34:59 UTC (rev 10803) +++ trunk/teraterm/teraterm/CMakeLists.txt 2023-07-23 07:07:16 UTC (rev 10804) @@ -11,8 +11,9 @@ add_executable( ${PACKAGE_NAME} WIN32 - addsetting.cpp - addsetting.h + ${CMAKE_CURRENT_BINARY_DIR}/../common/svnversion.h + WSAAsyncGetAddrInfo.c + WSAAsyncGetAddrInfo.h broadcast.cpp broadcast.h buffer.c @@ -23,14 +24,8 @@ checkeol.h clipboar.c clipboar.h - coding_pp.cpp - coding_pp.h - coding_pp.rc - coding_pp_res.h commlib.c commlib.h - dnddlg.cpp - dnddlg.h filesys.cpp filesys.h filesys_log.cpp @@ -38,22 +33,14 @@ filesys_log_res.h filesys_proto.cpp filesys_proto.h - font_pp.cpp - font_pp.h - font_pp.rc - font_pp_res.h - ftdlg.cpp - ftdlg.h keyboard.c keyboard.h prnabort.cpp prnabort.h - protodlg.cpp - protodlg.h scp.cpp scp.h - setupdirdlg.cpp - setupdirdlg.h + sendmem.cpp + sendmem.h sizetip.c sizetip.h teklib.c @@ -65,9 +52,11 @@ teraprn.cpp teraprn.h teraterm.cpp + teraterm_manifest.rc teraterml.h theme.h themefile.cpp + tt-version.rc ttdde.c ttdde.h ttdebug.cpp @@ -74,6 +63,7 @@ ttdebug.h ttdialog.c ttdialog.h + ttermpro.rc ttfileio.c ttfileio.h ttime.c @@ -86,6 +76,9 @@ ttwinman.h ttwsk.c ttwsk.h + unicode.cpp + unicode.h + unicode_test.h vtdisp.c vtdisp.h vtterm.c @@ -94,46 +87,76 @@ vtwin.h winjump.c winjump.h - WSAAsyncGetAddrInfo.c - WSAAsyncGetAddrInfo.h - sendmem.cpp - sendmem.h - # - uni_combining.map - # - ttermpro.rc - tt-version.rc - teraterm_manifest.rc - # - ${CMAKE_CURRENT_BINARY_DIR}/../common/svnversion.h - # - unicode_test.h - unicode.h - unicode.cpp - unicode_asian_width.tbl - unicode_combine.tbl - unicode_emoji.tbl - # - ftdlg_lite.h - ftdlg_lite.cpp +) + +set(SRC_DIALOG + addsetting.cpp + addsetting.h + clipboarddlg.cpp clipboarddlg.h - clipboarddlg.cpp + coding_pp.cpp + coding_pp.h + coding_pp.rc + coding_pp_res.h debug_pp.cpp debug_pp.h debug_pp.rc debug_pp_res.h + dnddlg.cpp + dnddlg.h + font_pp.cpp + font_pp.h + font_pp.rc + font_pp_res.h + ftdlg.cpp + ftdlg.h + ftdlg_lite.cpp + ftdlg_lite.h + logdlg.cpp + logdlg.h + protodlg.cpp + protodlg.h sendfiledlg.cpp sendfiledlg.h - # + setupdirdlg.cpp + setupdirdlg.h themedlg.cpp themedlg.h themedlg.rc themedlg_res.h - ) +) target_sources( ${PACKAGE_NAME} PRIVATE + ${SRC_DIALOG} +) + +source_group( + "dialog" + FILES ${SRC_DIALOG}) + +target_sources( + ${PACKAGE_NAME} + PRIVATE + ../teraterm/uni2sjis.map + ../teraterm/unisym2decsp.map + ../ttpcmn/sjis2uni.map + uni_combining.map + unicode_asian_width.tbl + unicode_combine.tbl + unicode_emoji.tbl +) + +source_group( + "table_datas" + REGULAR_EXPRESSION + "(map|tbl)$" +) + +target_sources( + ${PACKAGE_NAME} + PRIVATE ../common/tt_res.h ../common/ttcommon.h ../common/ttddecmnd.h @@ -152,11 +175,7 @@ ../common/dllutil.h ../common/codeconv.h ../common/tipwin.h - # - ../teraterm/unisym2decsp.map - ../teraterm/uni2sjis.map - ../ttpcmn/sjis2uni.map - ) +) target_sources( ${PACKAGE_NAME} @@ -166,16 +185,10 @@ ) source_group( - "table_datas" - REGULAR_EXPRESSION - "(map|tbl)$" - ) - -source_group( "common" REGULAR_EXPRESSION "..\/common\/" - ) +) target_sources( ${PACKAGE_NAME} Modified: trunk/teraterm/teraterm/filesys_log.cpp =================================================================== --- trunk/teraterm/teraterm/filesys_log.cpp 2023-07-22 14:34:59 UTC (rev 10803) +++ trunk/teraterm/teraterm/filesys_log.cpp 2023-07-23 07:07:16 UTC (rev 10804) @@ -336,423 +336,6 @@ } } -/** - * \x83_\x83C\x83A\x83\x8D\x83O\x82̓\xE0\x97e\x82\xF0 ts \x82ɏ\x91\x82\xAB\x96߂\xB5 - * - * TODO - * \x83_\x83C\x83A\x83\x8D\x83O\x82Őݒ肵\x82\xBD\x92l\x82͈ꎞ\x93I\x82Ȃ\xE0\x82̂\xC5 - * \x90ݒ\xE8\x82\xF0\x8F㏑\x82\xAB\x82\xB7\x82\xE9\x82̂͗ǂ\xAD\x82Ȃ\xA2\x82̂ł͂Ȃ\xA2\x82\xBE\x82낤\x82\xA9? - */ -static void SetLogFlags(HWND Dialog) -{ - WORD BinFlag, val; - - GetRB(Dialog, &BinFlag, IDC_FOPTBIN, IDC_FOPTBIN); - ts.LogBinary = BinFlag; - - GetRB(Dialog, &val, IDC_APPEND, IDC_APPEND); - ts.Append = val; - - if (!BinFlag) { - GetRB(Dialog, &val, IDC_PLAINTEXT, IDC_PLAINTEXT); - ts.LogTypePlainText = val; - - GetRB(Dialog, &val, IDC_TIMESTAMP, IDC_TIMESTAMP); - ts.LogTimestamp = val; - } - - GetRB(Dialog, &val, IDC_HIDEDIALOG, IDC_HIDEDIALOG); - ts.LogHideDialog = val; - - GetRB(Dialog, &val, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST); - ts.LogAllBuffIncludedInFirst = val; - - ts.LogTimestampType = (WORD)(GetCurSel(Dialog, IDC_TIMESTAMPTYPE) - 1); -} - -/** - * \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x83`\x83F\x83b\x83N - * - * @param[in] filename - * @param[out] exist TURE/FALSE - * @param[out] bom 0 no BOM (or file not exist) - * 1 UTF-8 - * 2 UTF-16LE - * 3 UTF-16BE - */ -static void CheckLogFile(const wchar_t *filename, BOOL *exist, int *bom) -{ - *exist = FALSE; - *bom = 0; - - // \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9? - DWORD logdir = GetFileAttributesW(filename); - if ((logdir != INVALID_FILE_ATTRIBUTES) && ((logdir & FILE_ATTRIBUTE_DIRECTORY) == 0)) { - // \x83t\x83@\x83C\x83\x8B\x82\xAA\x82\xA0\x82\xC1\x82\xBD - *exist = TRUE; - - // BOM\x97L\x82\xE8/\x96\xB3\x82\xB5\x83`\x83F\x83b\x83N - FILE *fp = _wfopen(filename, L"rb"); - if (fp != NULL) { - unsigned char tmp[4]; - size_t l = fread(tmp, 1, sizeof(tmp), fp); - fclose(fp); - if (l < 2) { - *bom = 0; - } else if (l >= 2 && tmp[0] == 0xff && tmp[1] == 0xfe) { - // UTF-16LE - *bom = 2; - } else if (l >= 2 && tmp[0] == 0xfe && tmp[1] == 0xff) { - // UTF-16BE - *bom = 3; - } else if (l >= 3 && tmp[0] == 0xef && tmp[1] == 0xbb && tmp[2] == 0xbf) { - // UTF-8 - *bom = 1; - } else { - *bom = 0; - } - } - } -} - -typedef struct { - FLogDlgInfo_t *info; - // work - BOOL file_exist; - int current_bom; // \x91\xB6\x8D݂\xB7\x82\xE9\x83t\x83@\x83C\x83\x8B\x82̃G\x83\x93\x83R\x81[\x83f\x83B\x83\x93\x83O\x81i\x83t\x83@\x83C\x83\x8B\x82\xCCBOM\x82\xA9\x82画\x92\xE8\x81j - UINT_PTR timer; - BOOL enable_timer; - WNDPROC proc; - TTTSet *pts; - TComVar *pcv; -} LogDlgWork_t; - - -/* - * Log \x83_\x83C\x83A\x83\x8D\x83O\x82̂\xA4\x82\xBF\x81AEnable/Disable \x82\xAA\x95ω\xBB\x82\xB7\x82\xE9\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B - * - * - Append - * \x8Ew\x92肳\x82ꂽ\x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9\x8Fꍇ\x82\xCD Enable - * \x8Ew\x92肳\x82ꂽ\x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB5\x82Ȃ\xA2\x8Fꍇ\x82\xCD Disable - * - * - BOM, Encoding - * Text \x82\xA9\x82\xC2 New/Overwrite \x82̏ꍇ\x82\xC9 Enable - * \x82\xBB\x82\xA4\x82łȂ\xA2\x8Fꍇ\x82\xC9 Disable - * BOM \x82̓t\x83@\x83C\x83\x8B\x82̐擪\x82\xA9\x82珑\x82\xAB\x8D\x9E\x82ނƂ\xAB\x82\xB5\x82\xA9\x88Ӗ\xA1\x82\xAA\x82Ȃ\xA2 - * Encoding \x82͒NjL\x82ł\xE0\x88Ӗ\xA1\x82\xAA\x82\xA0\x82邪\x81A\x8A\xF9\x91\xB6\x83t\x83@\x83C\x83\x8B\x82̃G\x83\x93\x83R\x81[\x83f\x83B\x83\x93\x83O\x82\xF0 - * \x8B\xAD\x90\xA7\x93I\x82Ƀ_\x83C\x83A\x83\x8D\x83O\x82ɔ\xBD\x89f\x82\xB7\x82\xE9\x82̂ŁA\x83\x86\x81[\x83U\x82ɂ\xE6\x82\xE9\x8Ew\x92\xE8\x82͂\xB3\x82\xB9\x82Ȃ\xA2 - * - * - Plain Text, Timestamp, Timestamp \x8E\xED\x95\xCA - * Text \x82̏ꍇ\x82\xCD Enable - * Binary \x82̏ꍇ\x82\xCD Disable - * - * - Timestamp \x8E\xED\x95\xCA - * Timestamp=on \x82̏ꍇ\x82\xCD Enable - * Timestamp=off \x82̏ꍇ\x82\xCD Disable - */ - -static void ArrangeControls(HWND Dialog, LogDlgWork_t *work, - WORD Append, WORD LogBinary, - WORD LogTypePlainText, WORD LogTimestamp) -{ - if (work->file_exist) { - // Append \x83\x89\x83W\x83I\x83{\x83^\x83\x93\x82́A\x83t\x83@\x83C\x83\x8B\x82\xAA\x82\xA0\x82\xE9\x82Ƃ\xAB\x82\xBE\x82\xAF\x97L\x8C\xF8\x82ɂȂ\xE9 - EnableWindow(GetDlgItem(Dialog, IDC_APPEND), TRUE); - - if (Append > 0) { - CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND); - } - else { - CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE); - } - } - else { // \x83t\x83@\x83C\x83\x8B\x82\xAA\x82Ȃ\xA2 -> \x90V\x8BK - EnableWindow(GetDlgItem(Dialog, IDC_APPEND), FALSE); - CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE); - } - - if (!LogBinary && !Append) { - EnableWindow(GetDlgItem(Dialog, IDC_BOM), TRUE); - EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), TRUE); - } - else { - EnableWindow(GetDlgItem(Dialog, IDC_BOM), FALSE); - EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), FALSE); - } - - if (LogBinary) { - CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTBIN); - - DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_PLAINTEXT); - DisableDlgItem(Dialog, IDC_TIMESTAMP, IDC_TIMESTAMP); - DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); - } - else { - CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTTEXT); - - EnableDlgItem(Dialog, IDC_PLAINTEXT, IDC_PLAINTEXT); - EnableDlgItem(Dialog, IDC_TIMESTAMP, IDC_TIMESTAMP); - EnableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); - - if (LogTypePlainText) { - SetRB(Dialog, 1, IDC_PLAINTEXT, IDC_PLAINTEXT); - } - if (LogTimestamp) { - SetRB(Dialog, 1, IDC_TIMESTAMP, IDC_TIMESTAMP); - } - else { - DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); - } - } - - if (work->file_exist && Append) { - // \x8A\xF9\x91\xB6\x83t\x83@\x83C\x83\x8B\x82̃G\x83\x93\x83R\x81[\x83f\x83B\x83\x93\x83O\x82f\x82\xB7\x82\xE9 - int bom = work->current_bom; - int cur = - bom == 1 ? 0 : - bom == 2 ? 1 : - bom == 3 ? 2 : 0; - SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, cur, 0); - } -} - -static void CheckLogFile(HWND Dialog, const wchar_t *filename, LogDlgWork_t *work) -{ - BOOL exist; - int bom; - CheckLogFile(filename, &exist, &bom); - work->file_exist = exist; - work->current_bom = bom; -} - -static LRESULT CALLBACK FNameEditProc(HWND dlg, UINT msg, - WPARAM wParam, LPARAM lParam) -{ - LogDlgWork_t *work = (LogDlgWork_t *)GetWindowLongPtr(dlg, GWLP_USERDATA); - switch (msg) { - case WM_KEYDOWN: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_KILLFOCUS: - work->enable_timer = FALSE; - break; - } - return CallWindowProcW(work->proc, dlg, msg, wParam, lParam); -} - -static INT_PTR CALLBACK LogFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam) -{ - static const DlgTextInfo TextInfos[] = { - { 0, "DLG_TABSHEET_TITLE_LOG" }, - { IDC_SENDFILE_FILENAME_TITLE, "DLG_FOPT_FILENAME_TITLE" }, - { IDC_FOPTTEXT, "DLG_FOPT_TEXT" }, - { IDC_FOPTBIN, "DLG_FOPT_BINARY" }, - { IDC_BOM, "DLG_FOPT_BOM" }, - { IDC_APPEND, "DLG_FOPT_APPEND" }, - { IDC_PLAINTEXT, "DLG_FOPT_PLAIN" }, - { IDC_HIDEDIALOG, "DLG_FOPT_HIDEDIALOG" }, - { IDC_ALLBUFF_INFIRST, "DLG_FOPT_ALLBUFFINFIRST" }, - { IDC_TIMESTAMP, "DLG_FOPT_TIMESTAMP" }, - { IDC_NEW_OVERWRITE, "DLG_FOPT_NEW_OVERWRITE" }, - { IDC_APPEND_GROUP, "DLG_FOPT_APPEND_LABEL" }, - { IDC_BINARY_GROUP, "DLG_FOPT_BINARY_LABEL" }, - }; - static const I18nTextInfo timestamp_list[] = { - { "DLG_FOPT_TIMESTAMP_LOCAL", L"Local Time" }, - { "DLG_FOPT_TIMESTAMP_UTC", L"UTC" }, - { "DLG_FOPT_TIMESTAMP_ELAPSED_LOGGING", L"Elapsed Time (Logging)" }, - { "DLG_FOPT_TIMESTAMP_ELAPSED_CONNECTION", L"Elapsed Time (Connection)" }, - }; - LogDlgWork_t *work = (LogDlgWork_t *)GetWindowLongPtr(Dialog, DWLP_USER); - - if (Message == RegisterWindowMessage(HELPMSGSTRING)) { - // \x83R\x83\x82\x83\x93\x83_\x83C\x83A\x83\x8D\x83O\x82\xA9\x82\xE7\x82̃w\x83\x8B\x83v\x83\x81\x83b\x83Z\x81[\x83W\x82\xF0\x95t\x82\xAF\x91ւ\xA6\x82\xE9 - Message = WM_COMMAND; - wParam = IDHELP; - } - switch (Message) { - case WM_INITDIALOG: { - work = (LogDlgWork_t *)lParam; - TTTSet *pts = work->pts; - SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)work); - ::DragAcceptFiles(Dialog, TRUE); - - SetDlgTextsW(Dialog, TextInfos, _countof(TextInfos), pts->UILanguageFileW); - SetI18nListW("Tera Term", Dialog, IDC_TIMESTAMPTYPE, timestamp_list, _countof(timestamp_list), - pts->UILanguageFileW, 0); - - SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-8"); - SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16LE"); - SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16BE"); - SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0); - - // \x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x90ݒ肷\x82\xE9 - // \x83t\x83@\x83C\x83\x8B\x82̃`\x83F\x83b\x83N\x81A\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82̐ݒ\xE8\x82\xE0\x8Ds\x82\xED\x82\xEA\x82\xE9 - // WM_COMMAND, EN_CHANGE \x82\xAA\x94\xAD\x90\xB6\x82\xB7\x82\xE9 - wchar_t *fname = FLogGetLogFilename(work->info->filename); - SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname); - free(fname); - HWND file_edit = GetDlgItem(Dialog, IDC_FOPT_FILENAME_EDIT); - SetWindowLongPtr(file_edit, GWLP_USERDATA, (LONG_PTR)work); - work->proc = (WNDPROC)SetWindowLongPtrW(file_edit, GWLP_WNDPROC, (LONG_PTR)FNameEditProc); - - // timestamp \x8E\xED\x95\xCA - int tstype = pts->LogTimestampType == TIMESTAMP_LOCAL ? 0 : - pts->LogTimestampType == TIMESTAMP_UTC ? 1 : - pts->LogTimestampType == TIMESTAMP_ELAPSED_LOGSTART ? 2 : - pts->LogTimestampType == TIMESTAMP_ELAPSED_CONNECTED ? 3 : 0; - SendDlgItemMessageA(Dialog, IDC_TIMESTAMPTYPE, CB_SETCURSEL, tstype, 0); - - // Hide dialog \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X - if (pts->LogHideDialog) { - SetRB(Dialog, 1, IDC_HIDEDIALOG, IDC_HIDEDIALOG); - } - - // Include screen buffer \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X - if (pts->LogAllBuffIncludedInFirst) { - SetRB(Dialog, 1, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST); - } - - CenterWindow(Dialog, GetParent(Dialog)); - - SetFocus(GetDlgItem(Dialog, IDC_FOPT_FILENAME_EDIT)); - - work->enable_timer = TRUE; - work->timer = SetTimer(Dialog, 0, 1000, NULL); - - return TRUE; - } - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDOK: { - wchar_t *filename; - hGetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, &filename); - work->info->filename = filename; - work->info->append = IsDlgButtonChecked(Dialog, IDC_APPEND) == BST_CHECKED; - work->info->bom = IsDlgButtonChecked(Dialog, IDC_BOM) == BST_CHECKED; - work->info->code = (LogCode_t)SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_GETCURSEL, 0, 0); - SetLogFlags(Dialog); - EndDialog(Dialog, IDOK); - break; - } - case IDCANCEL: - EndDialog(Dialog, IDCANCEL); - break; - case IDHELP: - OpenHelpCV(work->pcv, HH_HELP_CONTEXT, HlpFileLog); - break; - case IDC_FOPT_FILENAME_BUTTON: { - /* save current dir */ - const wchar_t *UILanguageFile = work->pts->UILanguageFileW; - - wchar_t *fname_ini; - hGetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, &fname_ini); - - const wchar_t* simple_log_filter = L"*.txt;*.log"; - wchar_t *FNFilter = GetCommonDialogFilterWW(simple_log_filter, UILanguageFile); - - wchar_t *caption; - wchar_t *uimsg; - GetI18nStrWW("Tera Term", "FILEDLG_TRANS_TITLE_LOG", - TitLog, UILanguageFile, &uimsg); - aswprintf(&caption, L"Tera Term: %s", uimsg); - free(uimsg); - - TTOPENFILENAMEW ofn = {}; - //ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT; - ofn.Flags |= OFN_EXPLORER | OFN_ENABLESIZING; - ofn.Flags |= OFN_SHOWHELP; - ofn.hwndOwner = Dialog; - ofn.lpstrFilter = FNFilter; - ofn.nFilterIndex = 1; - ofn.lpstrFile = fname_ini; - ofn.lpstrTitle = caption; - ofn.lpstrInitialDir = work->pts->LogDefaultPathW; - wchar_t *fname; - BOOL Ok = TTGetSaveFileNameW(&ofn, &fname); - if (Ok) { - SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname); - free(fname); - } - free(caption); - free(FNFilter); - free(fname_ini); - - break; - } - case IDC_NEW_OVERWRITE: - case IDC_APPEND: - case IDC_FOPTTEXT: - case IDC_FOPTBIN: - case IDC_TIMESTAMP: - { - WORD Appnd, LogBinary, LogTypePlainText, LogTimestamp; - GetRB(Dialog, &Appnd, IDC_APPEND, IDC_APPEND); - GetRB(Dialog, &LogBinary, IDC_FOPTBIN, IDC_FOPTBIN); - GetRB(Dialog, &LogTypePlainText, IDC_PLAINTEXT, IDC_PLAINTEXT); - GetRB(Dialog, &LogTimestamp, IDC_TIMESTAMP, IDC_TIMESTAMP); - ArrangeControls(Dialog, work, Appnd, LogBinary, LogTypePlainText, LogTimestamp); - } - break; - case IDC_FOPT_FILENAME_EDIT: - if (HIWORD(wParam) == EN_CHANGE){ - wchar_t *filename; - hGetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, &filename); - CheckLogFile(Dialog, filename, work); - free(filename); - { - WORD Appnd, LogBinary, LogTypePlainText, LogTimestamp; - GetRB(Dialog, &Appnd, IDC_APPEND, IDC_APPEND); - GetRB(Dialog, &LogBinary, IDC_FOPTBIN, IDC_FOPTBIN); - GetRB(Dialog, &LogTypePlainText, IDC_PLAINTEXT, IDC_PLAINTEXT); - GetRB(Dialog, &LogTimestamp, IDC_TIMESTAMP, IDC_TIMESTAMP); - ArrangeControls(Dialog, work, Appnd, LogBinary, LogTypePlainText, LogTimestamp); - } - } - break; - } - break; - case WM_DROPFILES: { - // \x95\xA1\x90\x94\x83h\x83\x8D\x83b\x83v\x82\xB3\x82\xEA\x82Ă\xE0\x8Dŏ\x89\x82\xCC1\x82\xBE\x82\xAF\x82\xF0\x88\xB5\x82\xA4 - HDROP hDrop = (HDROP)wParam; - const UINT len = DragQueryFileW(hDrop, 0, NULL, 0); - if (len == 0) { - DragFinish(hDrop); - return TRUE; - } - wchar_t *filename = (wchar_t *)malloc(sizeof(wchar_t) * (len + 1)); - DragQueryFileW(hDrop, 0, filename, len + 1); - filename[len] = '\0'; - CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND); - SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename); - SendDlgItemMessage(Dialog, IDC_FOPT_FILENAME_EDIT, EM_SETSEL, len, len); - free(filename); - DragFinish(hDrop); - return TRUE; - } - case WM_TIMER: { - if (!work->enable_timer) { - KillTimer(Dialog, work->timer); - work->timer = 0; - break; - } - wchar_t *fname = FLogGetLogFilename(work->info->filename); - SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname); - SendDlgItemMessageW(Dialog, IDC_FOPT_FILENAME_EDIT, EM_SETSEL, 0, -1); - free(fname); - work->timer = SetTimer(Dialog, 0, 1000, NULL); - break; - } - case WM_DESTROY: - if (work->timer != 0) { - KillTimer(Dialog, work->timer); - } - break; - } - return FALSE; -} - static void OpenLogFile(PFileVar fv) { // LogLockExclusive \x82\xAA\x97L\x8C\xF8\x82ȏꍇ\x82ɂ܂\xC1\x82\xBD\x82\xAD\x8B\xA4\x97L\x82\xB5\x82Ȃ\xA2\x82ƁA @@ -1390,26 +973,6 @@ } /** - * \x83\x8D\x83O\x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x8AJ\x82\xAD - * @param[in,out] info.filename \x83t\x83@\x83C\x83\x8B\x96\xBC\x8F\x89\x8A\xFA\x92l - * OK\x8E\x9E\x81A\x83t\x83@\x83C\x83\x8B\x96\xBC\x81A\x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7free()\x82\xB7\x82邱\x82\xC6 - * @retval TRUE [ok] \x82\xAA\x89\x9F\x82\xB3\x82ꂽ - * @retval FALSE \x83L\x83\x83\x83\x93\x83Z\x83\x8B\x82\xB3\x82ꂽ - */ -BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info) -{ - LogDlgWork_t *work = (LogDlgWork_t *)calloc(sizeof(LogDlgWork_t), 1); - work->info = info; - work->pts = &ts; - work->pcv = &cv; - INT_PTR ret = TTDialogBoxParam( - hInst, MAKEINTRESOURCE(IDD_LOGDLG), - hWnd, LogFnHook, (LPARAM)work); - free(work); - return ret == IDOK ? TRUE : FALSE; -} - -/** * \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x96\xBC\x97p\x82̏C\x8F\xFC\x82\xF0\x8Ds\x82\xA4,\x83t\x83@\x83C\x83\x8B\x96\xBC\x95\x94\x95\xAA\x82̂\xDD * - strftime() \x82Ɠ\xAF\x82\xB6\x93\xFA\x95t\x93W\x8AJ * - \x90ݒ肳\x82ꂽ\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x83t\x83H\x83\x8B\x83_\x82\xF0\x92lj\xC1 Modified: trunk/teraterm/teraterm/filesys_log.h =================================================================== --- trunk/teraterm/teraterm/filesys_log.h 2023-07-22 14:34:59 UTC (rev 10803) +++ trunk/teraterm/teraterm/filesys_log.h 2023-07-23 07:07:16 UTC (rev 10804) @@ -47,13 +47,6 @@ } LogCode_t; // log -typedef struct { - wchar_t *filename; // [in] \x83t\x83@\x83C\x83\x8B\x96\xBC\x8F\x89\x8A\xFA\x92l(NULL=default) [out] \x93\xFC\x97̓t\x83@\x83C\x83\x8B\x96\xBC\x81Afree()\x82\xB7\x82邱\x82\xC6 - BOOL append; // TRUE/FALSE = append/new(overwrite) - BOOL bom; // TRUE = BOM\x82\xA0\x82\xE8 - LogCode_t code; -} FLogDlgInfo_t; -BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info); void FLogAddCommentDlg(HINSTANCE hInst, HWND hWnd); wchar_t *FLogGetLogFilename(const wchar_t *log_filename); wchar_t *FLogGetLogFilenameBase(const wchar_t *filename); Added: trunk/teraterm/teraterm/logdlg.cpp =================================================================== --- trunk/teraterm/teraterm/logdlg.cpp (rev 0) +++ trunk/teraterm/teraterm/logdlg.cpp 2023-07-23 07:07:16 UTC (rev 10804) @@ -0,0 +1,490 @@ +/* + * (C) 2023- TeraTerm Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#if !defined(_CRTDBG_MAP_ALLOC) +#define _CRTDBG_MAP_ALLOC +#endif +#include <stdlib.h> +#include <crtdbg.h> +#include <windows.h> +#include <htmlhelp.h> +#include <assert.h> + +#include "teraterm.h" +#include "tttypes.h" +#include "ftdlg.h" +#include "ttwinman.h" +#include "ttcommon.h" +#include "ttlib.h" +#include "dlglib.h" +#include "helpid.h" +#include "asprintf.h" +#include "win32helper.h" + +#include "filesys_log_res.h" +#include "filesys_log.h" + +#include "logdlg.h" + +#define TitLog L"Log" + +typedef struct { + FLogDlgInfo_t *info; + // work + BOOL file_exist; + int current_bom; // \x91\xB6\x8D݂\xB7\x82\xE9\x83t\x83@\x83C\x83\x8B\x82̃G\x83\x93\x83R\x81[\x83f\x83B\x83\x93\x83O\x81i\x83t\x83@\x83C\x83\x8B\x82\xCCBOM\x82\xA9\x82画\x92\xE8\x81j + UINT_PTR timer; + BOOL enable_timer; + WNDPROC proc; + TTTSet *pts; + TComVar *pcv; +} LogDlgWork_t; + +/** + * \x83_\x83C\x83A\x83\x8D\x83O\x82̓\xE0\x97e\x82\xF0 ts \x82ɏ\x91\x82\xAB\x96߂\xB5 + * + * TODO + * \x83_\x83C\x83A\x83\x8D\x83O\x82Őݒ肵\x82\xBD\x92l\x82͈ꎞ\x93I\x82Ȃ\xE0\x82̂\xC5 + * \x90ݒ\xE8\x82\xF0\x8F㏑\x82\xAB\x82\xB7\x82\xE9\x82̂͗ǂ\xAD\x82Ȃ\xA2\x82̂ł͂Ȃ\xA2\x82\xBE\x82낤\x82\xA9? + */ +static void SetLogFlags(HWND Dialog) +{ + WORD BinFlag, val; + + GetRB(Dialog, &BinFlag, IDC_FOPTBIN, IDC_FOPTBIN); + ts.LogBinary = BinFlag; + + GetRB(Dialog, &val, IDC_APPEND, IDC_APPEND); + ts.Append = val; + + if (!BinFlag) { + GetRB(Dialog, &val, IDC_PLAINTEXT, IDC_PLAINTEXT); + ts.LogTypePlainText = val; + + GetRB(Dialog, &val, IDC_TIMESTAMP, IDC_TIMESTAMP); + ts.LogTimestamp = val; + } + + GetRB(Dialog, &val, IDC_HIDEDIALOG, IDC_HIDEDIALOG); + ts.LogHideDialog = val; + + GetRB(Dialog, &val, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST); + ts.LogAllBuffIncludedInFirst = val; + + ts.LogTimestampType = (WORD)(GetCurSel(Dialog, IDC_TIMESTAMPTYPE) - 1); +} + +/** + * \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x83`\x83F\x83b\x83N + * + * @param[in] filename + * @param[out] exist TURE/FALSE + * @param[out] bom 0 no BOM (or file not exist) + * 1 UTF-8 + * 2 UTF-16LE + * 3 UTF-16BE + */ +static void CheckLogFile(const wchar_t *filename, BOOL *exist, int *bom) +{ + *exist = FALSE; + *bom = 0; + + // \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9? + DWORD logdir = GetFileAttributesW(filename); + if ((logdir != INVALID_FILE_ATTRIBUTES) && ((logdir & FILE_ATTRIBUTE_DIRECTORY) == 0)) { + // \x83t\x83@\x83C\x83\x8B\x82\xAA\x82\xA0\x82\xC1\x82\xBD + *exist = TRUE; + + // BOM\x97L\x82\xE8/\x96\xB3\x82\xB5\x83`\x83F\x83b\x83N + FILE *fp = _wfopen(filename, L"rb"); + if (fp != NULL) { + unsigned char tmp[4]; + size_t l = fread(tmp, 1, sizeof(tmp), fp); + fclose(fp); + if (l < 2) { + *bom = 0; + } else if (l >= 2 && tmp[0] == 0xff && tmp[1] == 0xfe) { + // UTF-16LE + *bom = 2; + } else if (l >= 2 && tmp[0] == 0xfe && tmp[1] == 0xff) { + // UTF-16BE + *bom = 3; + } else if (l >= 3 && tmp[0] == 0xef && tmp[1] == 0xbb && tmp[2] == 0xbf) { + // UTF-8 + *bom = 1; + } else { + *bom = 0; + } + } + } +} + +/* + * Log \x83_\x83C\x83A\x83\x8D\x83O\x82̂\xA4\x82\xBF\x81AEnable/Disable \x82\xAA\x95ω\xBB\x82\xB7\x82\xE9\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B + * + * - Append + * \x8Ew\x92肳\x82ꂽ\x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9\x8Fꍇ\x82\xCD Enable + * \x8Ew\x92肳\x82ꂽ\x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB5\x82Ȃ\xA2\x8Fꍇ\x82\xCD Disable + * + * - BOM, Encoding + * Text \x82\xA9\x82\xC2 New/Overwrite \x82̏ꍇ\x82\xC9 Enable + * \x82\xBB\x82\xA4\x82łȂ\xA2\x8Fꍇ\x82\xC9 Disable + * BOM \x82̓t\x83@\x83C\x83\x8B\x82̐擪\x82\xA9\x82珑\x82\xAB\x8D\x9E\x82ނƂ\xAB\x82\xB5\x82\xA9\x88Ӗ\xA1\x82\xAA\x82Ȃ\xA2 + * Encoding \x82͒NjL\x82ł\xE0\x88Ӗ\xA1\x82\xAA\x82\xA0\x82邪\x81A\x8A\xF9\x91\xB6\x83t\x83@\x83C\x83\x8B\x82̃G\x83\x93\x83R\x81[\x83f\x83B\x83\x93\x83O\x82\xF0 + * \x8B\xAD\x90\xA7\x93I\x82Ƀ_\x83C\x83A\x83\x8D\x83O\x82ɔ\xBD\x89f\x82\xB7\x82\xE9\x82̂ŁA\x83\x86\x81[\x83U\x82ɂ\xE6\x82\xE9\x8Ew\x92\xE8\x82͂\xB3\x82\xB9\x82Ȃ\xA2 + * + * - Plain Text, Timestamp, Timestamp \x8E\xED\x95\xCA + * Text \x82̏ꍇ\x82\xCD Enable + * Binary \x82̏ꍇ\x82\xCD Disable + * + * - Timestamp \x8E\xED\x95\xCA + * Timestamp=on \x82̏ꍇ\x82\xCD Enable + * Timestamp=off \x82̏ꍇ\x82\xCD Disable + */ +static void ArrangeControls(HWND Dialog, LogDlgWork_t *work, + WORD Append, WORD LogBinary, + WORD LogTypePlainText, WORD LogTimestamp) +{ + if (work->file_exist) { + // Append \x83\x89\x83W\x83I\x83{\x83^\x83\x93\x82́A\x83t\x83@\x83C\x83\x8B\x82\xAA\x82\xA0\x82\xE9\x82Ƃ\xAB\x82\xBE\x82\xAF\x97L\x8C\xF8\x82ɂȂ\xE9 + EnableWindow(GetDlgItem(Dialog, IDC_APPEND), TRUE); + + if (Append > 0) { + CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND); + } + else { + CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE); + } + } + else { // \x83t\x83@\x83C\x83\x8B\x82\xAA\x82Ȃ\xA2 -> \x90V\x8BK + EnableWindow(GetDlgItem(Dialog, IDC_APPEND), FALSE); + CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE); + } + + if (!LogBinary && !Append) { + EnableWindow(GetDlgItem(Dialog, IDC_BOM), TRUE); + EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), TRUE); + } + else { + EnableWindow(GetDlgItem(Dialog, IDC_BOM), FALSE); + EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), FALSE); + } + + if (LogBinary) { + CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTBIN); + + DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_PLAINTEXT); + DisableDlgItem(Dialog, IDC_TIMESTAMP, IDC_TIMESTAMP); + DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); + } + else { + CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTTEXT); + + EnableDlgItem(Dialog, IDC_PLAINTEXT, IDC_PLAINTEXT); + EnableDlgItem(Dialog, IDC_TIMESTAMP, IDC_TIMESTAMP); + EnableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); + + if (LogTypePlainText) { + SetRB(Dialog, 1, IDC_PLAINTEXT, IDC_PLAINTEXT); + } + if (LogTimestamp) { + SetRB(Dialog, 1, IDC_TIMESTAMP, IDC_TIMESTAMP); + } + else { + DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); + } + } + + if (work->file_exist && Append) { + // \x8A\xF9\x91\xB6\x83t\x83@\x83C\x83\x8B\x82̃G\x83\x93\x83R\x81[\x83f\x83B\x83\x93\x83O\x82f\x82\xB7\x82\xE9 + int bom = work->current_bom; + int cur = + bom == 1 ? 0 : + bom == 2 ? 1 : + bom == 3 ? 2 : 0; + SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, cur, 0); + } +} + +static void CheckLogFile(HWND Dialog, const wchar_t *filename, LogDlgWork_t *work) +{ + BOOL exist; + int bom; + CheckLogFile(filename, &exist, &bom); + work->file_exist = exist; + work->current_bom = bom; +} + +static LRESULT CALLBACK FNameEditProc(HWND dlg, UINT msg, + WPARAM wParam, LPARAM lParam) +{ + LogDlgWork_t *work = (LogDlgWork_t *)GetWindowLongPtr(dlg, GWLP_USERDATA); + switch (msg) { + case WM_KEYDOWN: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_KILLFOCUS: + work->enable_timer = FALSE; + break; + } + return CallWindowProcW(work->proc, dlg, msg, wParam, lParam); +} + +static INT_PTR CALLBACK LogFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam) +{ + static const DlgTextInfo TextInfos[] = { + { 0, "DLG_TABSHEET_TITLE_LOG" }, + { IDC_SENDFILE_FILENAME_TITLE, "DLG_FOPT_FILENAME_TITLE" }, + { IDC_FOPTTEXT, "DLG_FOPT_TEXT" }, + { IDC_FOPTBIN, "DLG_FOPT_BINARY" }, + { IDC_BOM, "DLG_FOPT_BOM" }, + { IDC_APPEND, "DLG_FOPT_APPEND" }, + { IDC_PLAINTEXT, "DLG_FOPT_PLAIN" }, + { IDC_HIDEDIALOG, "DLG_FOPT_HIDEDIALOG" }, + { IDC_ALLBUFF_INFIRST, "DLG_FOPT_ALLBUFFINFIRST" }, + { IDC_TIMESTAMP, "DLG_FOPT_TIMESTAMP" }, + { IDC_NEW_OVERWRITE, "DLG_FOPT_NEW_OVERWRITE" }, + { IDC_APPEND_GROUP, "DLG_FOPT_APPEND_LABEL" }, + { IDC_BINARY_GROUP, "DLG_FOPT_BINARY_LABEL" }, + }; + static const I18nTextInfo timestamp_list[] = { + { "DLG_FOPT_TIMESTAMP_LOCAL", L"Local Time" }, + { "DLG_FOPT_TIMESTAMP_UTC", L"UTC" }, + { "DLG_FOPT_TIMESTAMP_ELAPSED_LOGGING", L"Elapsed Time (Logging)" }, + { "DLG_FOPT_TIMESTAMP_ELAPSED_CONNECTION", L"Elapsed Time (Connection)" }, + }; + LogDlgWork_t *work = (LogDlgWork_t *)GetWindowLongPtr(Dialog, DWLP_USER); + + if (Message == RegisterWindowMessage(HELPMSGSTRING)) { + // \x83R\x83\x82\x83\x93\x83_\x83C\x83A\x83\x8D\x83O\x82\xA9\x82\xE7\x82̃w\x83\x8B\x83v\x83\x81\x83b\x83Z\x81[\x83W\x82\xF0\x95t\x82\xAF\x91ւ\xA6\x82\xE9 + Message = WM_COMMAND; + wParam = IDHELP; + } + switch (Message) { + case WM_INITDIALOG: { + work = (LogDlgWork_t *)lParam; + TTTSet *pts = work->pts; + SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)work); + ::DragAcceptFiles(Dialog, TRUE); + + SetDlgTextsW(Dialog, TextInfos, _countof(TextInfos), pts->UILanguageFileW); + SetI18nListW("Tera Term", Dialog, IDC_TIMESTAMPTYPE, timestamp_list, _countof(timestamp_list), + pts->UILanguageFileW, 0); + + SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-8"); + SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16LE"); + SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16BE"); + SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0); + + // \x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x90ݒ肷\x82\xE9 + // \x83t\x83@\x83C\x83\x8B\x82̃`\x83F\x83b\x83N\x81A\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82̐ݒ\xE8\x82\xE0\x8Ds\x82\xED\x82\xEA\x82\xE9 + // WM_COMMAND, EN_CHANGE \x82\xAA\x94\xAD\x90\xB6\x82\xB7\x82\xE9 + wchar_t *fname = FLogGetLogFilename(work->info->filename); + SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname); + free(fname); + HWND file_edit = GetDlgItem(Dialog, IDC_FOPT_FILENAME_EDIT); + SetWindowLongPtr(file_edit, GWLP_USERDATA, (LONG_PTR)work); + work->proc = (WNDPROC)SetWindowLongPtrW(file_edit, GWLP_WNDPROC, (LONG_PTR)FNameEditProc); + + // timestamp \x8E\xED\x95\xCA + int tstype = pts->LogTimestampType == TIMESTAMP_LOCAL ? 0 : + pts->LogTimestampType == TIMESTAMP_UTC ? 1 : + pts->LogTimestampType == TIMESTAMP_ELAPSED_LOGSTART ? 2 : + pts->LogTimestampType == TIMESTAMP_ELAPSED_CONNECTED ? 3 : 0; + SendDlgItemMessageA(Dialog, IDC_TIMESTAMPTYPE, CB_SETCURSEL, tstype, 0); + + // Hide dialog \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X + if (pts->LogHideDialog) { + SetRB(Dialog, 1, IDC_HIDEDIALOG, IDC_HIDEDIALOG); + } + + // Include screen buffer \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X + if (pts->LogAllBuffIncludedInFirst) { + SetRB(Dialog, 1, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST); + } + + CenterWindow(Dialog, GetParent(Dialog)); + + SetFocus(GetDlgItem(Dialog, IDC_FOPT_FILENAME_EDIT)); + + work->enable_timer = TRUE; + work->timer = SetTimer(Dialog, 0, 1000, NULL); + + return TRUE; + } + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: { + wchar_t *filename; + hGetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, &filename); + work->info->filename = filename; + work->info->append = IsDlgButtonChecked(Dialog, IDC_APPEND) == BST_CHECKED; + work->info->bom = IsDlgButtonChecked(Dialog, IDC_BOM) == BST_CHECKED; + work->info->code = (LogCode_t)SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_GETCURSEL, 0, 0); + SetLogFlags(Dialog); + EndDialog(Dialog, IDOK); + break; + } + case IDCANCEL: + EndDialog(Dialog, IDCANCEL); + break; + case IDHELP: + OpenHelpCV(work->pcv, HH_HELP_CONTEXT, HlpFileLog); + break; + case IDC_FOPT_FILENAME_BUTTON: { + /* save current dir */ + const wchar_t *UILanguageFile = work->pts->UILanguageFileW; + + wchar_t *fname_ini; + hGetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, &fname_ini); + + const wchar_t* simple_log_filter = L"*.txt;*.log"; + wchar_t *FNFilter = GetCommonDialogFilterWW(simple_log_filter, UILanguageFile); + + wchar_t *caption; + wchar_t *uimsg; + GetI18nStrWW("Tera Term", "FILEDLG_TRANS_TITLE_LOG", + TitLog, UILanguageFile, &uimsg); + aswprintf(&caption, L"Tera Term: %s", uimsg); + free(uimsg); + + TTOPENFILENAMEW ofn = {}; + //ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT; + ofn.Flags |= OFN_EXPLORER | OFN_ENABLESIZING; + ofn.Flags |= OFN_SHOWHELP; + ofn.hwndOwner = Dialog; + ofn.lpstrFilter = FNFilter; + ofn.nFilterIndex = 1; + ofn.lpstrFile = fname_ini; + ofn.lpstrTitle = caption; + ofn.lpstrInitialDir = work->pts->LogDefaultPathW; + wchar_t *fname; + BOOL Ok = TTGetSaveFileNameW(&ofn, &fname); + if (Ok) { + SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname); + free(fname); + } + free(caption); + free(FNFilter); + free(fname_ini); + + break; + } + case IDC_NEW_OVERWRITE: + case IDC_APPEND: + case IDC_FOPTTEXT: + case IDC_FOPTBIN: + case IDC_TIMESTAMP: + { + WORD Appnd, LogBinary, LogTypePlainText, LogTimestamp; + GetRB(Dialog, &Appnd, IDC_APPEND, IDC_APPEND); + GetRB(Dialog, &LogBinary, IDC_FOPTBIN, IDC_FOPTBIN); + GetRB(Dialog, &LogTypePlainText, IDC_PLAINTEXT, IDC_PLAINTEXT); + GetRB(Dialog, &LogTimestamp, IDC_TIMESTAMP, IDC_TIMESTAMP); + ArrangeControls(Dialog, work, Appnd, LogBinary, LogTypePlainText, LogTimestamp); + } + break; + case IDC_FOPT_FILENAME_EDIT: + if (HIWORD(wParam) == EN_CHANGE){ + wchar_t *filename; + hGetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, &filename); + CheckLogFile(Dialog, filename, work); + free(filename); + { + WORD Appnd, LogBinary, LogTypePlainText, LogTimestamp; + GetRB(Dialog, &Appnd, IDC_APPEND, IDC_APPEND); + GetRB(Dialog, &LogBinary, IDC_FOPTBIN, IDC_FOPTBIN); + GetRB(Dialog, &LogTypePlainText, IDC_PLAINTEXT, IDC_PLAINTEXT); + GetRB(Dialog, &LogTimestamp, IDC_TIMESTAMP, IDC_TIMESTAMP); + ArrangeControls(Dialog, work, Appnd, LogBinary, LogTypePlainText, LogTimestamp); + } + } + break; + } + break; + case WM_DROPFILES: { + // \x95\xA1\x90\x94\x83h\x83\x8D\x83b\x83v\x82\xB3\x82\xEA\x82Ă\xE0\x8Dŏ\x89\x82\xCC1\x82\xBE\x82\xAF\x82\xF0\x88\xB5\x82\xA4 + HDROP hDrop = (HDROP)wParam; + const UINT len = DragQueryFileW(hDrop, 0, NULL, 0); + if (len == 0) { + DragFinish(hDrop); + return TRUE; + } + wchar_t *filename = (wchar_t *)malloc(sizeof(wchar_t) * (len + 1)); + DragQueryFileW(hDrop, 0, filename, len + 1); + filename[len] = '\0'; + CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND); + SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename); + SendDlgItemMessage(Dialog, IDC_FOPT_FILENAME_EDIT, EM_SETSEL, len, len); + free(filename); + DragFinish(hDrop); + return TRUE; + } + case WM_TIMER: { + if (!work->enable_timer) { + KillTimer(Dialog, work->timer); + work->timer = 0; + break; + } + wchar_t *fname = FLogGetLogFilename(work->info->filename); + SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname); + SendDlgItemMessageW(Dialog, IDC_FOPT_FILENAME_EDIT, EM_SETSEL, 0, -1); + free(fname); + work->timer = SetTimer(Dialog, 0, 1000, NULL); + break; + } + case WM_DESTROY: + if (work->timer != 0) { + KillTimer(Dialog, work->timer); + } + break; + } + return FALSE; +} + +/** + * \x83\x8D\x83O\x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x8AJ\x82\xAD + * @param[in,out] info.filename \x83t\x83@\x83C\x83\x8B\x96\xBC\x8F\x89\x8A\xFA\x92l + * OK\x8E\x9E\x81A\x83t\x83@\x83C\x83\x8B\x96\xBC\x81A\x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7free()\x82\xB7\x82邱\x82\xC6 + * @retval TRUE [ok] \x82\xAA\x89\x9F\x82\xB3\x82ꂽ + * @retval FALSE \x83L\x83\x83\x83\x93\x83Z\x83\x8B\x82\xB3\x82ꂽ + */ +BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info) +{ + LogDlgWork_t *work = (LogDlgWork_t *)calloc(sizeof(LogDlgWork_t), 1); + work->info = info; + work->pts = &ts; + work->pcv = &cv; + INT_PTR ret = TTDialogBoxParam( + hInst, MAKEINTRESOURCE(IDD_LOGDLG), + hWnd, LogFnHook, (LPARAM)work); + free(work); + return ret == IDOK ? TRUE : FALSE; +} Copied: trunk/teraterm/teraterm/logdlg.h (from rev 10803, trunk/teraterm/teraterm/filesys_log.h) =================================================================== --- trunk/teraterm/teraterm/logdlg.h (rev 0) +++ trunk/teraterm/teraterm/logdlg.h 2023-07-23 07:07:16 UTC (rev 10804) @@ -0,0 +1,40 @@ +/* + * (C) 2023- TeraTerm Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "filesys_log.h" // for LogCode_t + +typedef struct { + wchar_t *filename; // [in] \x83t\x83@\x83C\x83\x8B\x96\xBC\x8F\x89\x8A\xFA\x92l(NULL=default) [out] \x93\xFC\x97̓t\x83@\x83C\x83\x8B\x96\xBC\x81Afree()\x82\xB7\x82邱\x82\xC6 + BOOL append; // TRUE/FALSE = append/new(overwrite) + BOOL bom; // TRUE = BOM\x82\xA0\x82\xE8 + LogCode_t code; +} FLogDlgInfo_t; + +BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info); Modified: trunk/teraterm/teraterm/ttermpro.v16.vcxproj =================================================================== --- trunk/teraterm/teraterm/ttermpro.v16.vcxproj 2023-07-22 14:34:59 UTC (rev 10803) +++ trunk/teraterm/teraterm/ttermpro.v16.vcxproj 2023-07-23 07:07:16 UTC (rev 10804) @@ -172,6 +172,7 @@ <ClCompile Include="font_pp.cpp" /> <ClCompile Include="ftdlg.cpp" /> <ClCompile Include="keyboard.c" /> + <ClCompile Include="logdlg.cpp" /> <ClCompile Include="scp.cpp" /> <ClCompile Include="sendfiledlg.cpp" /> <ClCompile Include="setupdirdlg.cpp" /> @@ -228,6 +229,7 @@ <ClInclude Include="filesys_log_res.h" /> <ClInclude Include="font_pp.h" /> <ClInclude Include="font_pp_res.h" /> + <ClInclude Include="logdlg.h" /> <ClInclude Include="scp.h" /> <ClInclude Include="sendfiledlg.h" /> <ClInclude Include="sendmem.h" /> Modified: trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters =================================================================== --- trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters 2023-07-22 14:34:59 UTC (rev 10803) +++ trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters 2023-07-23 07:07:16 UTC (rev 10804) @@ -228,6 +228,9 @@ <ClCompile Include="charset.cpp"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="logdlg.cpp"> + <Filter>dialog</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <Image Include="..\..\cygterm\cygterm.ico"> @@ -525,5 +528,8 @@ <ClInclude Include="charset.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="logdlg.h"> + <Filter>dialog</Filter> + </ClInclude> </ItemGroup> </Project> Modified: trunk/teraterm/teraterm/ttermpro.v17.vcxproj =================================================================== --- trunk/teraterm/teraterm/ttermpro.v17.vcxproj 2023-07-22 14:34:59 UTC (rev 10803) +++ trunk/teraterm/teraterm/ttermpro.v17.vcxproj 2023-07-23 07:07:16 UTC (rev 10804) @@ -172,6 +172,7 @@ <ClCompile Include="font_pp.cpp" /> <ClCompile Include="ftdlg.cpp" /> <ClCompile Include="keyboard.c" /> + <ClCompile Include="logdlg.cpp" /> <ClCompile Include="scp.cpp" /> <ClCompile Include="sendfiledlg.cpp" /> <ClCompile Include="setupdirdlg.cpp" /> @@ -228,6 +229,7 @@ <ClInclude Include="filesys_log_res.h" /> <ClInclude Include="font_pp.h" /> <ClInclude Include="font_pp_res.h" /> + <ClInclude Include="logdlg.h" /> <ClInclude Include="scp.h" /> <ClInclude Include="sendfiledlg.h" /> <ClInclude Include="sendmem.h" /> @@ -334,4 +336,4 @@ <UserProperties RESOURCE_FILE="ttermpro.rc" /> </VisualStudio> </ProjectExtensions> -</Project> +</Project> \ No newline at end of file Modified: trunk/teraterm/teraterm/ttermpro.v17.vcxproj.filters =================================================================== --- trunk/teraterm/teraterm/ttermpro.v17.vcxproj.filters 2023-07-22 14:34:59 UTC (rev 10803) +++ trunk/teraterm/teraterm/ttermpro.v17.vcxproj.filters 2023-07-23 07:07:16 UTC (rev 10804) @@ -228,6 +228,9 @@ <ClCompile Include="charset.cpp"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="logdlg.cpp"> + <Filter>dialog</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <Image Include="..\..\cygterm\cygterm.ico"> @@ -525,5 +528,8 @@ <ClInclude Include="charset.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="logdlg.h"> + <Filter>dialog</Filter> + </ClInclude> </ItemGroup> -</Project> +</Project> \ No newline at end of file Modified: trunk/teraterm/teraterm/vtwin.cpp =================================================================== --- trunk/teraterm/teraterm/vtwin.cpp 2023-07-22 14:34:59 UTC (rev 10803) +++ trunk/teraterm/teraterm/vtwin.cpp 2023-07-23 07:07:16 UTC (rev 10804) @@ -110,6 +110,7 @@ #include "ttcmn_notify2.h" #include "scp.h" #include "ttcommdlg.h" +#include "logdlg.h" #include <initguid.h> #if _MSC_VER < 1600