[ttssh2-commit] [10804] ログダイアログを logdlg.cpp,h に分離した

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2023年 7月 23日 (日) 16:07:16 JST


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\x82𔽉f\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\x82𔽉f\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


ttssh2-commit メーリングリストの案内
Back to archive index