diff --git a/GUI.cpp b/GUI.cpp index 385f251..d383fc1 100644 --- a/GUI.cpp +++ b/GUI.cpp @@ -28,9 +28,7 @@ #include "XG_NotesDialog.hpp" #include "XG_PatGenDialog.hpp" #include "XG_PatternDialog.hpp" -#include "XG_SeqGenDialog.hpp" #include "XG_SeqPatGenDialog.hpp" -#include "XG_SeqSolveDialog.hpp" #include "XG_SettingsDialog.hpp" #include "XG_SettingsDialog.cpp" #include "XG_ThemeDialog.hpp" @@ -110,9 +108,6 @@ dicts_t xg_dicts; // ヒントに追加があったか? bool xg_bHintsAdded = false; -// JSONファイルとして保存するか? -bool xg_bSaveAsJsonFile = true; - // 太枠をつけるか? bool xg_bAddThickFrame = true; @@ -836,7 +831,6 @@ void XgResetSettings(void) xg_bShowToolBar = true; s_bShowStatusBar = true; xg_bShowInputPalette = false; - xg_bSaveAsJsonFile = true; xg_bAddThickFrame = true; xg_bVerticalLayout = true; xg_bCharFeed = true; @@ -1021,8 +1015,6 @@ bool __fastcall XgLoadSettings(void) xg_bShowInputPalette = !!dwValue; } - xg_bSaveAsJsonFile = true; - if (!app_key.QueryDword(L"NumberToGenerate", dwValue)) { xg_nNumberToGenerate = dwValue; } @@ -1223,7 +1215,6 @@ bool __fastcall XgSaveSettings(void) app_key.SetDword(L"ShowStatusBar", s_bShowStatusBar); app_key.SetDword(L"ShowInputPalette", xg_bShowInputPalette); - app_key.SetDword(L"SaveAsJsonFile", xg_bSaveAsJsonFile); app_key.SetDword(L"NumberToGenerate", xg_nNumberToGenerate); app_key.SetDword(L"AddThickFrame", xg_bAddThickFrame); app_key.SetDword(L"CharFeed", xg_bCharFeed); @@ -1711,7 +1702,7 @@ void XgResizeCells(HWND hwnd, int nNewRows, int nNewCols) WCHAR xg_szDir[MAX_PATH] = L""; // 「保存先」参照。 -int CALLBACK XgBrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lParam*/, LPARAM /*lpData*/) noexcept +INT CALLBACK XgBrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lParam*/, LPARAM /*lpData*/) noexcept { if (uMsg == BFFM_INITIALIZED) { // 初期化の際に、フォルダーの場所を指定する。 @@ -2719,7 +2710,7 @@ BOOL __fastcall XgOnOpen(HWND hwnd) bool __fastcall XgDoSaveToLocation(HWND hwnd) { WCHAR szPath[MAX_PATH], szDir[MAX_PATH]; - WCHAR szName[32]; + WCHAR szName[64]; // パスを生成する。 StringCchCopy(szDir, _countof(szDir), xg_dirs_save_to[0].data()); @@ -2728,7 +2719,7 @@ bool __fastcall XgDoSaveToLocation(HWND hwnd) // ファイル名を生成する。 UINT u; for (u = 1; u <= 0xFFFF; u++) { - StringCchPrintf(szName, _countof(szName), L"%dx%d-%04u.xwj", xg_nRows, xg_nCols, u); + StringCchPrintf(szName, _countof(szName), L"Pat-%dx%d-%04u.xd", xg_nRows, xg_nCols, u); StringCchCopy(szPath, _countof(szPath), szDir); StringCchCat(szPath, _countof(szPath), szName); if (::GetFileAttributesW(szPath) == 0xFFFFFFFF) @@ -2859,15 +2850,11 @@ TRIVALUE XgGenerateFromPat(HWND hwnd) } // 問題の作成。 -bool __fastcall XgOnGenerate(HWND hwnd, bool multiple = false) +bool __fastcall XgOnGenerate(HWND hwnd) { INT_PTR nID; ::EnableWindow(xg_hwndInputPalette, FALSE); - if (multiple) { - // [問題の連続作成]ダイアログ。 - XG_SeqGenDialog dialog; - nID = static_cast(dialog.DoModal(hwnd)); - } else { + { // [問題の作成]ダイアログ。 XG_GenDialog dialog; dialog.m_bShowAnswer = xg_bShowAnswerOnGenerate; @@ -2879,7 +2866,7 @@ bool __fastcall XgOnGenerate(HWND hwnd, bool multiple = false) return false; } - if (!multiple && xg_bChoosePAT) { // 複数でなく、自動的にPAT.txtから選択するか? + if (xg_bChoosePAT) { // 複数でなく、自動的にPAT.txtから選択するか? auto tri_value = XgGenerateFromPat(hwnd); if (tri_value == TV_NEGATIVE) return false; // 失敗。 @@ -2912,7 +2899,7 @@ bool __fastcall XgOnGenerate(HWND hwnd, bool multiple = false) xg_dwlTick0 = ::GetTickCount64(); // キャンセルダイアログを表示し、実行を開始する。 ::EnableWindow(xg_hwndInputPalette, FALSE); - do { + { if (xg_bSmartResolution && xg_nRows >= 7 && xg_nCols >= 7) { XG_CancelSmartSolveDialog dialog; nID = dialog.DoModal(hwnd); @@ -2926,53 +2913,19 @@ bool __fastcall XgOnGenerate(HWND hwnd, bool multiple = false) // 生成成功のときはxg_nNumberGeneratedを増やす。 if (nID == IDOK && xg_bSolved) { ++xg_nNumberGenerated; - if (multiple) { - if (!XgDoSaveToLocation(hwnd)) { - s_bOutOfDiskSpace = true; - break; - } - // 初期化。 - xg_bSolved = false; - xg_bCheckingAnswer = false; - xg_xword.ResetAndSetSize(xg_nRows, xg_nCols); - xg_vVertInfo.clear(); - xg_vHorzInfo.clear(); - xg_vMarks.clear(); - xg_vMarkedCands.clear(); - xg_bSolvingEmpty = true; - xg_strHeader.clear(); - xg_strNotes.clear(); - xg_strFileName.clear(); - // 辞書を読み込む。 - XgLoadDictFile(xg_dict_name.c_str()); - XgSetInputModeFromDict(hwnd); - } } - } while (nID == IDOK && multiple && xg_nNumberGenerated < xg_nNumberToGenerate); + } ::EnableWindow(xg_hwndInputPalette, TRUE); // 初期化する。 - if (multiple) { + xg_bShowAnswer = xg_bShowAnswerOnGenerate; + if (xg_bSmartResolution && xg_bCancelled) { xg_xword.clear(); - xg_vMarkedCands.clear(); - xg_vMarks.clear(); - xg_vVertInfo.clear(); - xg_vHorzInfo.clear(); - xg_vecVertHints.clear(); - xg_vecHorzHints.clear(); - xg_bSolved = false; - xg_bCheckingAnswer = false; - xg_bShowAnswer = false; - } else { - xg_bShowAnswer = xg_bShowAnswerOnGenerate; - if (xg_bSmartResolution && xg_bCancelled) { - xg_xword.clear(); - } - - // ズームを全体に合わせる。 - XgFitZoom(hwnd); } + // ズームを全体に合わせる。 + XgFitZoom(hwnd); + return true; } @@ -5568,7 +5521,7 @@ void __fastcall XgGenerate(HWND hwnd, bool show_answer) // 二重マス単語の候補と配置を破棄する。 ::DestroyWindow(xg_hMarkingDlg); // 問題の作成。 - if (XgOnGenerate(hwnd, false)) { + if (XgOnGenerate(hwnd)) { flag = true; sa2->Get(); xg_ubUndoBuffer.Commit(UC_SETALL, sa1, sa2); diff --git a/XG_SeqGenDialog.hpp b/XG_SeqGenDialog.hpp deleted file mode 100644 index a1d53ea..0000000 --- a/XG_SeqGenDialog.hpp +++ /dev/null @@ -1,266 +0,0 @@ -#pragma once - -#include "XG_Window.hpp" - -// 保存先のパスのリスト。 -extern std::deque xg_dirs_save_to; - -// 連続生成の場合、問題を生成する数。 -extern int xg_nNumberToGenerate; - -// 「保存先」参照。 -int CALLBACK XgBrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lParam*/, LPARAM /*lpData*/) noexcept; - -// 保存先。 -extern WCHAR xg_szDir[MAX_PATH]; - -// [問題の連続作成]ダイアログ。 -class XG_SeqGenDialog : public XG_Dialog -{ -public: - XG_SeqGenDialog() noexcept - { - } - - BOOL OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) - { - // ダイアログを中央へ移動する。 - XgCenterDialog(hwnd); - // ドロップを有効にする。 - DragAcceptFiles(hwnd, TRUE); - // サイズの欄を設定する。 - ::SetDlgItemInt(hwnd, edt1, xg_nRows, FALSE); - ::SetDlgItemInt(hwnd, edt2, xg_nCols, FALSE); - // 現在の状態で好ましいと思われる単語の最大長を取得する。 - const auto n3 = XgGetPreferredMaxLength(); - ::SetDlgItemInt(hwnd, edt3, n3, FALSE); - // スマート解決か? - if (xg_bSmartResolution) { - ::CheckDlgButton(hwnd, chx2, BST_CHECKED); - } else { - ::CheckDlgButton(hwnd, chx2, BST_UNCHECKED); - } - // 保存先を設定する。 - WCHAR szFile[MAX_PATH]; - COMBOBOXEXITEMW item; - for (const auto& dir : xg_dirs_save_to) { - item.mask = CBEIF_TEXT; - item.iItem = -1; - StringCchCopy(szFile, _countof(szFile), dir.data()); - item.pszText = szFile; - item.cchTextMax = -1; - ::SendDlgItemMessageW(hwnd, cmb2, CBEM_INSERTITEMW, 0, - reinterpret_cast(&item)); - } - // コンボボックスの最初の項目を選択する。 - ::SendDlgItemMessageW(hwnd, cmb2, CB_SETCURSEL, 0, 0); - // 自動で再計算をするか? - if (xg_bAutoRetry) - ::CheckDlgButton(hwnd, chx1, BST_CHECKED); - // 生成する数を設定する。 - ::SetDlgItemInt(hwnd, edt4, xg_nNumberToGenerate, FALSE); - // IMEをOFFにする。 - { - HWND hwndCtrl = ::GetDlgItem(hwnd, edt1); - ::ImmAssociateContext(hwndCtrl, nullptr); - hwndCtrl = ::GetDlgItem(hwnd, edt2); - ::ImmAssociateContext(hwndCtrl, nullptr); - hwndCtrl = ::GetDlgItem(hwnd, edt3); - ::ImmAssociateContext(hwndCtrl, nullptr); - hwndCtrl = ::GetDlgItem(hwnd, edt4); - ::ImmAssociateContext(hwndCtrl, nullptr); - } - SendDlgItemMessageW(hwnd, scr1, UDM_SETRANGE, 0, MAKELPARAM(XG_MAX_SIZE, XG_MIN_SIZE)); - SendDlgItemMessageW(hwnd, scr2, UDM_SETRANGE, 0, MAKELPARAM(XG_MAX_SIZE, XG_MIN_SIZE)); - SendDlgItemMessageW(hwnd, scr3, UDM_SETRANGE, 0, MAKELPARAM(XG_MAX_WORD_LEN, XG_MIN_WORD_LEN)); - SendDlgItemMessageW(hwnd, scr4, UDM_SETRANGE, 0, MAKELPARAM(100, 1)); - if (::IsDlgButtonChecked(hwnd, chx2) == BST_CHECKED) { - EnableWindow(GetDlgItem(hwnd, stc1), TRUE); - EnableWindow(GetDlgItem(hwnd, edt3), TRUE); - EnableWindow(GetDlgItem(hwnd, scr3), TRUE); - } else { - EnableWindow(GetDlgItem(hwnd, stc1), FALSE); - EnableWindow(GetDlgItem(hwnd, edt3), FALSE); - EnableWindow(GetDlgItem(hwnd, scr3), FALSE); - } - return TRUE; - } - - void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) - { - int n1, n2, n3; - switch (id) - { - case IDOK: - // サイズの欄をチェックする。 - n1 = static_cast(::GetDlgItemInt(hwnd, edt1, nullptr, FALSE)); - if (n1 < XG_MIN_SIZE || n1 > XG_MAX_SIZE) { - ::SendDlgItemMessageW(hwnd, edt1, EM_SETSEL, 0, -1); - XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_ENTERINT), nullptr, MB_ICONERROR); - ::SetFocus(::GetDlgItem(hwnd, edt1)); - return; - } - n2 = static_cast(::GetDlgItemInt(hwnd, edt2, nullptr, FALSE)); - if (n2 < XG_MIN_SIZE || n2 > XG_MAX_SIZE) { - ::SendDlgItemMessageW(hwnd, edt2, EM_SETSEL, 0, -1); - XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_ENTERINT), nullptr, MB_ICONERROR); - ::SetFocus(::GetDlgItem(hwnd, edt2)); - return; - } - n3 = static_cast(::GetDlgItemInt(hwnd, edt3, nullptr, FALSE)); - if (n3 < XG_MIN_WORD_LEN || n3 > XG_MAX_WORD_LEN) { - ::SendDlgItemMessageW(hwnd, edt3, EM_SETSEL, 0, -1); - XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_ENTERINT), nullptr, MB_ICONERROR); - ::SetFocus(::GetDlgItem(hwnd, edt3)); - return; - } - xg_nMaxWordLen = n3; - // 自動で再計算をするか? - xg_bAutoRetry = (::IsDlgButtonChecked(hwnd, chx1) == BST_CHECKED); - // スマート解決か? - xg_bSmartResolution = (::IsDlgButtonChecked(hwnd, chx2) == BST_CHECKED); - // 保存先のパス名を取得する。 - WCHAR szFile[MAX_PATH]; - ::GetDlgItemTextW(hwnd, cmb2, szFile, _countof(szFile)); - { - const auto attrs = ::GetFileAttributesW(szFile); - if (attrs == 0xFFFFFFFF || !(attrs & FILE_ATTRIBUTE_DIRECTORY)) { - // パスがなければ作成する。 - if (!XgMakePathW(szFile)) { - // 作成に失敗。 - ::SendDlgItemMessageW(hwnd, cmb2, CB_SETEDITSEL, 0, -1); - XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_STORAGEINVALID), nullptr, MB_ICONERROR); - ::SetFocus(::GetDlgItem(hwnd, cmb2)); - return; - } - } - } - // 保存先をセットする。 - { - XGStringW strDir = szFile; - xg_str_trim(strDir); - { - auto end = xg_dirs_save_to.end(); - for (auto it = xg_dirs_save_to.begin(); it != end; it++) { - if (_wcsicmp((*it).data(), strDir.data()) == 0) { - xg_dirs_save_to.erase(it); - break; - } - } - xg_dirs_save_to.emplace_front(strDir); - } - } - // 問題の数を取得する。 - { - // 無制限ではない。 - BOOL bTranslated; - xg_nNumberToGenerate = ::GetDlgItemInt(hwnd, edt4, &bTranslated, FALSE); - if (!bTranslated || xg_nNumberToGenerate == 0) { - ::SendDlgItemMessageW(hwnd, edt4, EM_SETSEL, 0, -1); - XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_ENTERPOSITIVE), nullptr, MB_ICONERROR); - ::SetFocus(::GetDlgItem(hwnd, edt4)); - return; - } - } - // JSON形式として保存するか? - xg_bSaveAsJsonFile = true; - // 初期化する。 - { - xg_bSolved = false; - xg_bCheckingAnswer = false; - xg_bShowAnswer = false; - xg_xword.ResetAndSetSize(n1, n2); - xg_nRows = n1; - xg_nCols = n2; - xg_vVertInfo.clear(); - xg_vHorzInfo.clear(); - xg_vMarks.clear(); - xg_vMarkedCands.clear(); - // 偶数行数で黒マス線対称(タテ)の場合は連黒禁は不可。 - if (!(xg_nRows & 1) && (xg_nRules & RULE_LINESYMMETRYV) && (xg_nRules & RULE_DONTDOUBLEBLACK)) { - XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_EVENROWLINESYMV), nullptr, MB_ICONERROR); - break; - } - // 偶数列数で黒マス線対称(ヨコ)の場合は連黒禁は不可。 - if (!(xg_nCols & 1) && (xg_nRules & RULE_LINESYMMETRYH) && (xg_nRules & RULE_DONTDOUBLEBLACK)) { - XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_EVENCOLLINESYMH), nullptr, MB_ICONERROR); - break; - } - } - // ダイアログを閉じる。 - ::EndDialog(hwnd, IDOK); - break; - - case IDCANCEL: - // ダイアログを閉じる。 - ::EndDialog(hwnd, IDCANCEL); - break; - - case chx2: - if (::IsDlgButtonChecked(hwnd, chx2) == BST_CHECKED) { - EnableWindow(GetDlgItem(hwnd, stc1), TRUE); - EnableWindow(GetDlgItem(hwnd, edt3), TRUE); - EnableWindow(GetDlgItem(hwnd, scr3), TRUE); - } else { - EnableWindow(GetDlgItem(hwnd, stc1), FALSE); - EnableWindow(GetDlgItem(hwnd, edt3), FALSE); - EnableWindow(GetDlgItem(hwnd, scr3), FALSE); - } - break; - - case psh2: - { - // ユーザーに保存先の場所を問い合わせる。 - BROWSEINFOW bi; - ZeroMemory(&bi, sizeof(bi)); - bi.hwndOwner = hwnd; - bi.lpszTitle = XgLoadStringDx1(IDS_CROSSSTORAGE); - bi.ulFlags = BIF_RETURNONLYFSDIRS; - bi.lpfn = XgBrowseCallbackProc; - ::GetDlgItemTextW(hwnd, cmb2, xg_szDir, _countof(xg_szDir)); - LPITEMIDLIST pidl = ::SHBrowseForFolderW(&bi); - if (pidl) { - // パスをコンボボックスに設定。 - ::SHGetPathFromIDListW(pidl, szFile); - ::SetDlgItemTextW(hwnd, cmb2, szFile); - ::CoTaskMemFree(pidl); - } - } - break; - - default: - break; - } - } - - // 何かがドロップされた。 - void OnDropFiles(HWND hwnd, HDROP hdrop) noexcept - { - WCHAR szDir[MAX_PATH]; - DragQueryFile(hdrop, 0, szDir, _countof(szDir)); - if (PathIsDirectoryW(szDir)) // フォルダだった。 - { - ::SetDlgItemTextW(hwnd, cmb2, szDir); - } - DragFinish(hdrop); - } - - INT_PTR CALLBACK - DialogProcDx(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) override - { - switch (uMsg) - { - HANDLE_MSG(hwnd, WM_INITDIALOG, OnInitDialog); - HANDLE_MSG(hwnd, WM_COMMAND, OnCommand); - HANDLE_MSG(hwnd, WM_DROPFILES, OnDropFiles); - default: - break; - } - return 0; - } - - INT_PTR DoModal(HWND hwnd) - { - return DialogBoxDx(hwnd, IDD_SEQCREATE); - } -}; diff --git a/XG_SeqPatGenDialog.hpp b/XG_SeqPatGenDialog.hpp index 6e56466..e347ad1 100644 --- a/XG_SeqPatGenDialog.hpp +++ b/XG_SeqPatGenDialog.hpp @@ -2,6 +2,17 @@ #include "XG_Window.hpp" +// 保存先のパスのリスト。 +extern std::deque xg_dirs_save_to; + +// 生成する数。 +extern INT xg_nNumberToGenerate; + +// 保存先。 +extern WCHAR xg_szDir[MAX_PATH]; +// 保存先指定。 +INT CALLBACK XgBrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lParam*/, LPARAM /*lpData*/) noexcept; + // [黒マスパターンの連続作成]ダイアログ。 class XG_SeqPatGenDialog : public XG_Dialog { @@ -104,8 +115,6 @@ class XG_SeqPatGenDialog : public XG_Dialog return; } } - // JSON形式として保存するか? - xg_bSaveAsJsonFile = true; // 初期化する。 { xg_bSolved = false; diff --git a/XG_SeqSolveDialog.hpp b/XG_SeqSolveDialog.hpp deleted file mode 100644 index e7873e4..0000000 --- a/XG_SeqSolveDialog.hpp +++ /dev/null @@ -1,201 +0,0 @@ -#pragma once - -#include "XG_Window.hpp" - -// [解の連続作成]ダイアログ。 -class XG_SeqSolveDialog : public XG_Dialog -{ -public: - XG_SeqSolveDialog() noexcept - { - } - - BOOL OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) - { - // ダイアログを中央へ移動する。 - XgCenterDialog(hwnd); - // 保存先を設定する。 - WCHAR szFile[MAX_PATH]; - COMBOBOXEXITEMW item; - for (const auto& dir : xg_dirs_save_to) { - item.mask = CBEIF_TEXT; - item.iItem = -1; - StringCchCopy(szFile, _countof(szFile), dir.data()); - item.pszText = szFile; - item.cchTextMax = -1; - ::SendDlgItemMessageW(hwnd, cmb1, CBEM_INSERTITEMW, 0, - reinterpret_cast(&item)); - } - // コンボボックスの最初の項目を選択する。 - ::SendDlgItemMessageW(hwnd, cmb1, CB_SETCURSEL, 0, 0); - // 自動で再計算をするか? - if (xg_bAutoRetry) { - ::CheckDlgButton(hwnd, chx1, BST_CHECKED); - } - // 無制限か? - // 生成する数を設定する。 - ::SetDlgItemInt(hwnd, edt1, xg_nNumberToGenerate, FALSE); - // ファイルドロップを有効にする。 - ::DragAcceptFiles(hwnd, TRUE); - SendDlgItemMessageW(hwnd, scr1, UDM_SETRANGE, 0, MAKELPARAM(100, 2)); - return TRUE; - } - - void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) - { - WCHAR szFile[MAX_PATH]; - switch (id) - { - case IDOK: - // 保存先のパス名を取得する。 - ::GetDlgItemTextW(hwnd, cmb1, szFile, _countof(szFile)); - { - const auto attrs = ::GetFileAttributesW(szFile); - if (attrs == 0xFFFFFFFF || !(attrs & FILE_ATTRIBUTE_DIRECTORY)) { - // パスがなければ作成する。 - if (!XgMakePathW(szFile)) { - // 作成に失敗。 - ::SendDlgItemMessageW(hwnd, cmb1, CB_SETEDITSEL, 0, -1); - XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_STORAGEINVALID), nullptr, MB_ICONERROR); - ::SetFocus(::GetDlgItem(hwnd, cmb1)); - return; - } - } - } - // 保存先をセットする。 - { - XGStringW strDir = szFile; - xg_str_trim(strDir); - { - auto end = xg_dirs_save_to.end(); - for (auto it = xg_dirs_save_to.begin(); it != end; it++) { - if (_wcsicmp((*it).data(), strDir.data()) == 0) { - xg_dirs_save_to.erase(it); - break; - } - } - xg_dirs_save_to.emplace_front(strDir); - } - } - // 自動で再計算をするか? - xg_bAutoRetry = (::IsDlgButtonChecked(hwnd, chx1) == BST_CHECKED); - // 問題の数を取得する。 - { - BOOL bTranslated; - xg_nNumberToGenerate = ::GetDlgItemInt(hwnd, edt1, &bTranslated, FALSE); - if (!bTranslated || xg_nNumberToGenerate == 0) { - ::SendDlgItemMessageW(hwnd, edt1, EM_SETSEL, 0, -1); - XgCenterMessageBoxW(hwnd, XgLoadStringDx1(IDS_ENTERPOSITIVE), nullptr, MB_ICONERROR); - ::SetFocus(::GetDlgItem(hwnd, edt1)); - return; - } - } - // JSON形式で保存するか? - xg_bSaveAsJsonFile = true; - // 初期化する。 - xg_bSolved = false; - xg_bCheckingAnswer = false; - xg_bShowAnswer = false; - xg_vVertInfo.clear(); - xg_vHorzInfo.clear(); - xg_vMarks.clear(); - xg_vMarkedCands.clear(); - // ダイアログを閉じる。 - ::EndDialog(hwnd, IDOK); - break; - - case IDCANCEL: - // ダイアログを閉じる。 - ::EndDialog(hwnd, IDCANCEL); - break; - - case psh1: - // ユーザーに保存先を問い合わせる。 - { - BROWSEINFOW bi; - ZeroMemory(&bi, sizeof(bi)); - bi.hwndOwner = hwnd; - bi.lpszTitle = XgLoadStringDx1(IDS_CROSSSTORAGE); - bi.ulFlags = BIF_RETURNONLYFSDIRS; - bi.lpfn = XgBrowseCallbackProc; - ::GetDlgItemTextW(hwnd, cmb1, xg_szDir, _countof(xg_szDir)); - { - LPITEMIDLIST pidl = ::SHBrowseForFolderW(&bi); - if (pidl) { - // コンボボックスにパスを設定する。 - ::SHGetPathFromIDListW(pidl, szFile); - ::SetDlgItemTextW(hwnd, cmb1, szFile); - ::CoTaskMemFree(pidl); - } - } - } - break; - - default: - break; - } - } - - void OnDropFiles(HWND hwnd, HDROP hDrop) - { - // ドロップされたファイルのパス名を取得する。 - WCHAR szFile[MAX_PATH]; - ::DragQueryFileW(hDrop, 0, szFile, _countof(szFile)); - ::DragFinish(hDrop); - - // ショートカットだった場合は、ターゲットのパスを取得する。 - if (::lstrcmpiW(PathFindExtensionW(szFile), L".LNK") == 0) { - WCHAR szTarget[MAX_PATH]; - if (!XgGetPathOfShortcutW(szFile, szTarget)) { - ::MessageBeep(0xFFFFFFFF); - return; - } - StringCchCopy(szFile, _countof(szFile), szTarget); - } - - // ファイルの属性を確認する。 - const auto attrs = ::GetFileAttributesW(szFile); - if (attrs & FILE_ATTRIBUTE_DIRECTORY) { - // ディレクトリーだった。 - // 同じ項目がすでにあれば、削除する。 - const int i = static_cast(::SendDlgItemMessageW( - hwnd, cmb1, CB_FINDSTRINGEXACT, 0, - reinterpret_cast(szFile))); - if (i != CB_ERR) { - ::SendDlgItemMessageW(hwnd, cmb1, CB_DELETESTRING, i, 0); - } - // コンボボックスの最初に挿入する。 - COMBOBOXEXITEMW item; - item.mask = CBEIF_TEXT; - item.iItem = 0; - item.pszText = szFile; - item.cchTextMax = -1; - ::SendDlgItemMessageW(hwnd, cmb1, CBEM_INSERTITEMW, 0, - reinterpret_cast(&item)); - // コンボボックスの最初の項目を選択する。 - ::SendDlgItemMessageW(hwnd, cmb1, CB_SETCURSEL, 0, 0); - } else { - // ディレクトリーではなかった。 - ::MessageBeep(0xFFFFFFFF); - } - } - - INT_PTR CALLBACK - DialogProcDx(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) override - { - switch (uMsg) - { - HANDLE_MSG(hwnd, WM_INITDIALOG, OnInitDialog); - HANDLE_MSG(hwnd, WM_COMMAND, OnCommand); - HANDLE_MSG(hwnd, WM_DROPFILES, OnDropFiles); - default: - break; - } - return 0; - } - - INT_PTR DoModal(HWND hwnd) - { - return DialogBoxDx(hwnd, IDD_SEQSOLVE); - } -}; diff --git a/XWordGiver.hpp b/XWordGiver.hpp index 2626d3d..1f76705 100644 --- a/XWordGiver.hpp +++ b/XWordGiver.hpp @@ -1342,9 +1342,6 @@ extern XGStringW xg_strFileName; // ヒント追加フラグ。 extern bool xg_bHintsAdded; -// JSONファイルとして保存するか? -extern bool xg_bSaveAsJsonFile; - // 拗音変換用データ。 inline static const std::unordered_map xg_small2large = { diff --git a/lang/en_US.rc b/lang/en_US.rc index 36066b4..6203fe0 100644 --- a/lang/en_US.rc +++ b/lang/en_US.rc @@ -1818,9 +1818,6 @@ STRINGTABLE IDS_TT_PRINTPROBLEM, "Print crossword" IDS_TT_PRINTANSWER, "Print crossword answer" IDS_TT_SOLVENOADDBLACK, "Find a solution (without &adding blocks)" - IDS_TT_GENERATEREPEATEDLY, "Continuously generate crosswords" - IDS_TT_SOLVEREPEATEDLY, "Continuously find solutions" - IDS_TT_SOLVEREPEATEDLYNOADDBLACK, "Continuously find solutions (without adding blocks)" } ////////////////////////////////////////////////////////////////////////////// diff --git a/lang/ja_JP.rc b/lang/ja_JP.rc index 2e9ca80..d573673 100644 --- a/lang/ja_JP.rc +++ b/lang/ja_JP.rc @@ -1821,9 +1821,6 @@ STRINGTABLE IDS_TT_PRINTPROBLEM, "問題のみを印刷" IDS_TT_PRINTANSWER, "問題と解答を印刷" IDS_TT_SOLVENOADDBLACK, "解を求める(黒マス追加なし)" - IDS_TT_GENERATEREPEATEDLY, "問題を連続自動生成する" - IDS_TT_SOLVEREPEATEDLY, "連続で解を求める" - IDS_TT_SOLVEREPEATEDLYNOADDBLACK, "連続で解を求める(黒マス追加なし)" } //////////////////////////////////////////////////////////////////////////////