Index: sakura_core/sakura_rc.h =================================================================== --- sakura_core/sakura_rc.h (リビジョン 46472) +++ sakura_core/sakura_rc.h (リビジョン 46473) @@ -468,13 +468,13 @@ #define IDC_BTN_RELOAD 1417 #define IDC_CHECK_DIFF_OPT_BLINE 1418 #define IDC_CHECK_DIFF_OPT_TABSPC 1419 -#define IDC_BTN_NOTIFYONLY 1420 +#define IDC_RADIO_NOTIFYONLY 1420 #define IDC_FRAME_DIFF_FILE12 1421 #define IDC_LIST_DIFF_FILES 1422 #define IDC_FILEUPDATEMSG 1423 #define IDC_FRAME_DIFF_DST 1424 #define IDC_LIST_CTRLCODE 1425 -#define IDC_BTN_NOSUPERVISION 1426 +#define IDC_RADIO_NOSUPERVISION 1426 #define IDC_BTN_CLOSE 1427 #define IDC_UPDATEDFILENAME 1428 #define IDC_QUERYRELOADMSG 1429 @@ -640,6 +640,7 @@ #define IDC_BUTTON_EXPAND 1595 // #define IDC_BUTTON_COLLAPSE 1596 // #define IDC_BUTTON_CHECK 1597 // +#define IDC_RADIO_CONTINUE 1598 #define IDS_AUTHOR_PAGE 4054 #define IDS_ABOUT_DESCRIPTION 4056 #define IDD_TYPELIST 5000 Index: sakura_core/sakura_rc.rc =================================================================== --- sakura_core/sakura_rc.rc (リビジョン 46472) +++ sakura_core/sakura_rc.rc (リビジョン 46473) @@ -592,19 +592,22 @@ CBS_SORT | WS_VSCROLL | WS_TABSTOP END -IDD_FILEUPDATEQUERY DIALOG DISCARDABLE 0, 0, 223, 107 +IDD_FILEUPDATEQUERY DIALOG DISCARDABLE 0, 0, 223, 133 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION CAPTION "ファイルが更新されました" FONT 9, "MS Pゴシック" BEGIN PUSHBUTTON "再読込(&R)",IDC_BTN_RELOAD,7,63,50,14 - DEFPUSHBUTTON "閉じる(&C)",IDC_BTN_CLOSE,59,63,50,14 - PUSHBUTTON "以後通知メッセージのみ(&M)",IDC_BTN_NOTIFYONLY,7,81,102, - 14 - PUSHBUTTON "以後更新を監視しない(&N)",IDC_BTN_NOSUPERVISION, 114,81, - 102,14 + DEFPUSHBUTTON "無視(&I)",IDC_BTN_CLOSE,59,63,50,14 + GROUPBOX "これ以降", IDC_STATIC, 7, 85, 209, 41 + CONTROL "また選択肢を表示する(&J)", IDC_RADIO_CONTINUE, "Button", + WS_GROUP|BS_AUTORADIOBUTTON, 15, 98, 96, 8 + CONTROL "更新の監視をやめる(&N)", IDC_RADIO_NOSUPERVISION, "Button", + BS_AUTORADIOBUTTON, 15, 110, 80, 8 + CONTROL "通知メッセージだけにする(&M)", IDC_RADIO_NOTIFYONLY, "Button", + BS_AUTORADIOBUTTON, 100, 110, 112, 8 EDITTEXT IDC_UPDATEDFILENAME,7,7,209,25,ES_READONLY | - NOT WS_TABSTOP | ES_MULTILINE + NOT WS_TABSTOP | ES_MULTILINE | WS_GROUP LTEXT "このファイルは外部のエディタ等で変更されています。", IDC_FILEUPDATEMSG,7,36,209,8 LTEXT "",IDC_QUERYRELOADMSG,7,48,209,8 Index: sakura_core/dlg/CDlgFileUpdateQuery.h =================================================================== --- sakura_core/dlg/CDlgFileUpdateQuery.h (リビジョン 46472) +++ sakura_core/dlg/CDlgFileUpdateQuery.h (リビジョン 46473) @@ -42,13 +42,18 @@ : m_pFilename( filename ) , m_bModified( IsModified ) { + ResetControlState(); } virtual BOOL OnInitDialog( HWND, WPARAM wParam, LPARAM lParam ); virtual BOOL OnBnClicked( int ); + UINT GetControlState( int controlID ) const; ///< ダイアログが閉じたときのコントロールの状態を返す。コントロールIDが無効なら0を返す。 + void ResetControlState(); private: const TCHAR* m_pFilename; bool m_bModified; + static const int StatefulControlIDs[3]; + UINT m_ControlStates[_countof(StatefulControlIDs)]; ///< GetCheckState()用の記憶領域。 }; #endif Index: sakura_core/dlg/CDlgFileUpdateQuery.cpp =================================================================== --- sakura_core/dlg/CDlgFileUpdateQuery.cpp (リビジョン 46472) +++ sakura_core/dlg/CDlgFileUpdateQuery.cpp (リビジョン 46473) @@ -32,14 +32,30 @@ #include "stdafx.h" #include "dlg/CDlgFileUpdateQuery.h" +#include +#include #include "sakura_rc.h" +/// ダイアログの状態を変数に保存する。 +static void SaveControlStates( HWND hwndDlg, const int* controlIDs, int numberofControlIDs, UINT* outControlStates ) +{ + std::transform( controlIDs, controlIDs + numberofControlIDs, outControlStates, std::bind1st( std::ptr_fun(IsDlgButtonChecked), hwndDlg ) ); +} +/// 変数の状態をダイアログに反映する。 +static void LoadControlStates( HWND hwndDlg, const int* controlIDs, int numberofControlIDs, const UINT* controlStates ) +{ + for(int i = 0; i < numberofControlIDs; ++i) { + CheckDlgButton( hwndDlg, controlIDs[i], controlStates[i] ); + } +} + + BOOL CDlgFileUpdateQuery::OnInitDialog( HWND hWnd, WPARAM wParam, LPARAM lParam ) { ::DlgItem_SetText( hWnd, IDC_UPDATEDFILENAME, m_pFilename ); ::DlgItem_SetText( hWnd, IDC_QUERYRELOADMSG, m_bModified ? L"再ロードを行うと変更が失われますがよろしいですか?":L"再ロードしますか?" ); - + LoadControlStates( hWnd, StatefulControlIDs, _countof(StatefulControlIDs), this->m_ControlStates ); return CDialog::OnInitDialog( hWnd, wParam, lParam ); } @@ -48,25 +64,60 @@ */ BOOL CDlgFileUpdateQuery::OnBnClicked(int id) { - int result; switch( id ){ case IDC_BTN_RELOAD: // 再読込 - result = 1; - break; - case IDC_BTN_CLOSE: // 閉じる - result = 0; - break; - case IDC_BTN_NOTIFYONLY: // 以後通知メッセージのみ - result = 2; - break; - case IDC_BTN_NOSUPERVISION: // 以後更新を監視しない - result = 3; - break; + SaveControlStates( this->GetHwnd(), StatefulControlIDs, _countof(StatefulControlIDs), this->m_ControlStates ); + CloseDialog( 1 ); + return 0; + + case IDC_BTN_CLOSE: // 無視 + SaveControlStates( this->GetHwnd(), StatefulControlIDs, _countof(StatefulControlIDs), this->m_ControlStates ); + CloseDialog( 0 ); + return 0; + + case IDCANCEL: + // ファイルの更新を無視するだけでなく + // オプションの状態も無視する。⇒変数に反映しない。⇒SaveControlStates()を呼ばない。 + CloseDialog( 0 ); + return 0; + + case IDC_RADIO_CONTINUE: // 以後も選択肢を表示する + case IDC_RADIO_NOSUPERVISION: // 以後更新を監視しない + case IDC_RADIO_NOTIFYONLY: // 以後通知メッセージのみ + return 1; + default: - result = 0; - break; + return 0; } - CloseDialog( result ); - +} + +/** ダイアログが閉じたときのコントロールの状態を返す。コントロールIDが無効なら0を返す。 +*/ +UINT CDlgFileUpdateQuery::GetControlState( int controlID ) const +{ + for(int i = 0; i < _countof(StatefulControlIDs); ++i) { + if(StatefulControlIDs[i] == controlID) { + return this->m_ControlStates[i]; + } + } return 0; } + +void CDlgFileUpdateQuery::ResetControlState() +{ + for(int i = 0; i < _countof(StatefulControlIDs); ++i) switch(StatefulControlIDs[i]) { + case IDC_RADIO_CONTINUE: // 以後も選択肢を表示する + this->m_ControlStates[i] = BST_CHECKED; + break; + + case IDC_RADIO_NOSUPERVISION: // 以後更新を監視しない + case IDC_RADIO_NOTIFYONLY: // 以後通知メッセージのみ + default: + this->m_ControlStates[i] = BST_UNCHECKED; + break; + } +} + +const int CDlgFileUpdateQuery::StatefulControlIDs[] = { + IDC_RADIO_CONTINUE, IDC_RADIO_NOSUPERVISION, IDC_RADIO_NOTIFYONLY +}; Index: sakura_core/CAutoReloadAgent.cpp =================================================================== --- sakura_core/CAutoReloadAgent.cpp (リビジョン 46472) +++ sakura_core/CAutoReloadAgent.cpp (リビジョン 46473) @@ -121,24 +121,14 @@ IDD_FILEUPDATEQUERY, 0 ); - - switch( result ){ - case 1: // 再読込 + if( result == 1 ) { // 再読込 /* 同一ファイルの再オープン */ pcDoc->m_cDocFileOperation.ReloadCurrentFile( pcDoc->m_cDocFile.m_sFileInfo.eCharCode ); - m_eWatchUpdate = WU_QUERY; - break; - case 2: // 以後通知メッセージのみ - m_eWatchUpdate = WU_NOTIFY; - break; - case 3: // 以後更新を監視しない - m_eWatchUpdate = WU_NONE; - break; - case 0: // CLOSE - default: - m_eWatchUpdate = WU_QUERY; - break; } + // m_eWatchUpdateがリセットされてしまうので値の設定は再読み込み後に行うこと。 + m_eWatchUpdate = dlg.GetControlState( IDC_RADIO_NOSUPERVISION ) == BST_CHECKED ? WU_NONE : // 以後更新を監視しない + dlg.GetControlState( IDC_RADIO_NOTIFYONLY ) == BST_CHECKED ? WU_NOTIFY : // 以後通知メッセージのみ + WU_QUERY; // 監視の継続 ResumeWatching(); //監視再開 }