Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

コンボボックスのサブクラス化処理を簡素化する #1463

Merged
merged 5 commits into from
Nov 22, 2020
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 17 additions & 72 deletions sakura_core/dlg/CDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -747,109 +747,54 @@ static void DeleteRecentItem(
}
}

LRESULT CALLBACK SubEditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
LRESULT CALLBACK SubEditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
{
SComboBoxItemDeleter* data = (SComboBoxItemDeleter*)::GetProp( hwnd, TSTR_SUBCOMBOBOXDATA );
HWND hwndCombo = reinterpret_cast<HWND>(dwRefData);
switch( uMsg ){
case WM_KEYDOWN:
{
if( wParam == VK_DELETE ){
HWND hwndCombo = data->hwndCombo;
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
BOOL bShow = Combo_GetDroppedState(hwndCombo);
int nIndex = Combo_GetCurSel(hwndCombo);
if( bShow && 0 <= nIndex ){
DeleteRecentItem(hwndCombo, nIndex, data->pRecent);
DeleteRecentItem(hwndCombo, nIndex, reinterpret_cast<CRecent*>(::GetProp(hwndCombo, TSTR_SUBCOMBOBOXDATA)));
}
}
break;
}
case WM_DESTROY:
{
::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)data->pEditWndProc);
::RemoveProp(hwnd, TSTR_SUBCOMBOBOXDATA);
data->pEditWndProc = NULL;
break;
}
default:
break;
}
return CallWindowProc(data->pEditWndProc, hwnd, uMsg, wParam, lParam);
return ::DefSubclassProc(hwnd, uMsg, wParam, lParam);
}

LRESULT CALLBACK SubListBoxProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
LRESULT CALLBACK SubListBoxProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
SComboBoxItemDeleter* data = (SComboBoxItemDeleter*)::GetProp( hwnd, TSTR_SUBCOMBOBOXDATA );
HWND hwndCombo = reinterpret_cast<HWND>(dwRefData);
switch( uMsg ){
case WM_KEYDOWN:
{
if( wParam == VK_DELETE ){
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
HWND hwndCombo = data->hwndCombo;
int nIndex = Combo_GetCurSel(hwndCombo);
if( 0 <= nIndex ){
DeleteRecentItem(hwndCombo, nIndex, data->pRecent);
DeleteRecentItem(hwndCombo, nIndex, reinterpret_cast<CRecent*>(::GetProp(hwndCombo, TSTR_SUBCOMBOBOXDATA)));
return 0;
}
}
break;
}
case WM_DESTROY:
{
::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)data->pListBoxWndProc);
::RemoveProp(hwnd, TSTR_SUBCOMBOBOXDATA);
data->pListBoxWndProc = NULL;
break;
}
default:
break;
}
return CallWindowProc(data->pListBoxWndProc, hwnd, uMsg, wParam, lParam);
return ::DefSubclassProc(hwnd, uMsg, wParam, lParam);
}

LRESULT CALLBACK SubComboBoxProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
void CDialog::SetComboBoxDeleter(HWND hwndCtl, CRecent* pRecent)
{
SComboBoxItemDeleter* data = (SComboBoxItemDeleter*)::GetProp( hwnd, TSTR_SUBCOMBOBOXDATA );
switch( uMsg ){
case WM_CTLCOLOREDIT:
{
if( NULL == data->pEditWndProc ){
HWND hwndCtl = (HWND)lParam;
data->pEditWndProc = (WNDPROC)::GetWindowLongPtr(hwndCtl, GWLP_WNDPROC);
::SetProp(hwndCtl, TSTR_SUBCOMBOBOXDATA, data);
::SetWindowLongPtr(hwndCtl, GWLP_WNDPROC, (LONG_PTR)SubEditProc);
}
break;
}
case WM_CTLCOLORLISTBOX:
{
if( NULL == data->pListBoxWndProc ){
HWND hwndCtl = (HWND)lParam;
data->pListBoxWndProc = (WNDPROC)::GetWindowLongPtr(hwndCtl, GWLP_WNDPROC);
::SetProp(hwndCtl, TSTR_SUBCOMBOBOXDATA, data);
::SetWindowLongPtr(hwndCtl, GWLP_WNDPROC, (LONG_PTR)SubListBoxProc);
}
break;
}
case WM_DESTROY:
{
::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)data->pComboBoxWndProc);
::RemoveProp(hwnd, TSTR_SUBCOMBOBOXDATA);
data->pComboBoxWndProc = NULL;
break;
}
assert(pRecent);

default:
break;
}
return CallWindowProc(data->pComboBoxWndProc, hwnd, uMsg, wParam, lParam);
}

void CDialog::SetComboBoxDeleter( HWND hwndCtl, SComboBoxItemDeleter* data )
{
if( NULL == data->pRecent ){
COMBOBOXINFO info = { sizeof(COMBOBOXINFO) };
if (!::GetComboBoxInfo(hwndCtl, &info))
return;
}
data->hwndCombo = hwndCtl;
data->pComboBoxWndProc = (WNDPROC)::GetWindowLongPtr(hwndCtl, GWLP_WNDPROC);
::SetProp(hwndCtl, TSTR_SUBCOMBOBOXDATA, data);
::SetWindowLongPtr(hwndCtl, GWLP_WNDPROC, (LONG_PTR)SubComboBoxProc);
::SetProp(hwndCtl, TSTR_SUBCOMBOBOXDATA, pRecent);
::SetWindowSubclass(info.hwndItem, SubEditProc, 0, reinterpret_cast<DWORD_PTR>(hwndCtl));
::SetWindowSubclass(info.hwndList, SubListBoxProc, 0, reinterpret_cast<DWORD_PTR>(hwndCtl));
}
12 changes: 1 addition & 11 deletions sakura_core/dlg/CDialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,6 @@ struct SAnchorList
EAnchorStyle anchor;
};

struct SComboBoxItemDeleter
{
CRecent* pRecent;
HWND hwndCombo;
WNDPROC pComboBoxWndProc;
WNDPROC pEditWndProc;
WNDPROC pListBoxWndProc;
SComboBoxItemDeleter(): pRecent(NULL), hwndCombo(NULL), pComboBoxWndProc(NULL), pEditWndProc(NULL), pListBoxWndProc(NULL){}
};

/*-----------------------------------------------------------------------
クラスの宣言
-----------------------------------------------------------------------*/
Expand Down Expand Up @@ -125,7 +115,7 @@ class CDialog

void ResizeItem( HWND hTarget, const POINT& ptDlgDefalut, const POINT& ptDlgNew, const RECT& rcItemDefault, EAnchorStyle anchor, bool bUpdate = true);
void GetItemClientRect( int wID, RECT& rc );
static void SetComboBoxDeleter( HWND hwndCtl, SComboBoxItemDeleter* data );
static void SetComboBoxDeleter( HWND hwndCtl, CRecent* pRecent );
public:

static bool DirectoryUp(WCHAR* szDir);
Expand Down
9 changes: 2 additions & 7 deletions sakura_core/dlg/CDlgExec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,8 @@ BOOL CDlgExec::OnInitDialog( HWND hwnd, WPARAM wParam, LPARAM lParam )
}

BOOL bRet = CDialog::OnInitDialog(hwnd, wParam, lParam);

m_comboDel = SComboBoxItemDeleter();
m_comboDel.pRecent = &m_cRecentCmd;
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_m_szCommand), &m_comboDel);
m_comboDelCur = SComboBoxItemDeleter();
m_comboDelCur.pRecent = &m_cRecentCur;
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_CUR_DIR), &m_comboDelCur);
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_m_szCommand), &m_cRecentCmd);
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_CUR_DIR), &m_cRecentCur);
return bRet;
}

Expand Down
2 changes: 0 additions & 2 deletions sakura_core/dlg/CDlgExec.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,7 @@ class CDlgExec final : public CDialog
bool m_bEditable; /* 編集ウィンドウへの入力可能 */ // 2009.02.21 ryoji

protected:
SComboBoxItemDeleter m_comboDel;
CRecentCmd m_cRecentCmd;
SComboBoxItemDeleter m_comboDelCur;
CRecentCurDir m_cRecentCur;

int GetData( void ) override; /* ダイアログデータの取得 */
Expand Down
4 changes: 1 addition & 3 deletions sakura_core/dlg/CDlgFind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,7 @@ void CDlgFind::ChangeView( LPARAM pcEditView )
BOOL CDlgFind::OnInitDialog( HWND hwnd, WPARAM wParam, LPARAM lParam )
{
BOOL bRet = CDialog::OnInitDialog(hwnd, wParam, lParam);
m_comboDel = SComboBoxItemDeleter();
m_comboDel.pRecent = &m_cRecentSearch;
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_TEXT), &m_comboDel);
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_TEXT), &m_cRecentSearch);

// フォント設定 2012/11/27 Uchi
HFONT hFontOld = (HFONT)::SendMessageAny( GetItemHwnd( IDC_COMBO_TEXT ), WM_GETFONT, 0, 0 );
Expand Down
1 change: 0 additions & 1 deletion sakura_core/dlg/CDlgFind.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ class CDlgFind final : public CDialog
CLogicPoint m_ptEscCaretPos_PHY; // 検索開始時のカーソル位置退避エリア

CRecentSearch m_cRecentSearch;
SComboBoxItemDeleter m_comboDel;
CFontAutoDeleter m_cFontText;

protected:
Expand Down
23 changes: 6 additions & 17 deletions sakura_core/dlg/CDlgGrep.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -331,23 +331,12 @@ BOOL CDlgGrep::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
g_pOnFolderProc = (WNDPROC)GetWindowLongPtr(hFolder, GWLP_WNDPROC);
SetWindowLongPtr(hFolder, GWLP_WNDPROC, (LONG_PTR)OnFolderProc);

m_comboDelText = SComboBoxItemDeleter();
m_comboDelText.pRecent = &m_cRecentSearch;
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_TEXT), &m_comboDelText);
m_comboDelFile = SComboBoxItemDeleter();
m_comboDelFile.pRecent = &m_cRecentGrepFile;
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_FILE), &m_comboDelFile);
m_comboDelFolder = SComboBoxItemDeleter();
m_comboDelFolder.pRecent = &m_cRecentGrepFolder;
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_FOLDER), &m_comboDelFolder);

m_comboDelExcludeFile = SComboBoxItemDeleter();
m_comboDelExcludeFile.pRecent = &m_cRecentExcludeFile;
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_EXCLUDE_FILE), &m_comboDelExcludeFile);

m_comboDelExcludeFolder = SComboBoxItemDeleter();
m_comboDelExcludeFolder.pRecent = &m_cRecentExcludeFolder;
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_EXCLUDE_FOLDER), &m_comboDelExcludeFolder);
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_TEXT), &m_cRecentSearch);
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_FILE), &m_cRecentGrepFile);
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_FOLDER), &m_cRecentGrepFolder);

SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_EXCLUDE_FILE), &m_cRecentExcludeFile);
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_EXCLUDE_FOLDER), &m_cRecentExcludeFolder);

BOOL bRet = CDialog::OnInitDialog( hwndDlg, wParam, lParam );
if( !bRet ) return bRet;
Expand Down
9 changes: 0 additions & 9 deletions sakura_core/dlg/CDlgGrep.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,10 @@ class CDlgGrep : public CDialog
SFilePathLong m_szExcludeFolder; //!< 除外フォルダ
SFilePath m_szCurrentFilePath;
protected:
SComboBoxItemDeleter m_comboDelText;
CRecentSearch m_cRecentSearch;

SComboBoxItemDeleter m_comboDelFile;
CRecentGrepFile m_cRecentGrepFile;

SComboBoxItemDeleter m_comboDelFolder;
CRecentGrepFolder m_cRecentGrepFolder;

SComboBoxItemDeleter m_comboDelExcludeFile;
CRecentExcludeFile m_cRecentExcludeFile;

SComboBoxItemDeleter m_comboDelExcludeFolder;
CRecentExcludeFolder m_cRecentExcludeFolder;

std::vector<CFontAutoDeleter> m_cFontDeleters;
Expand Down
4 changes: 1 addition & 3 deletions sakura_core/dlg/CDlgGrepReplace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,7 @@ BOOL CDlgGrepReplace::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
/* コンボボックスのユーザー インターフェイスを拡張インターフェースにする */
Combo_SetExtendedUI( GetItemHwnd( IDC_COMBO_TEXT2 ), TRUE );

m_comboDelText2 = SComboBoxItemDeleter();
m_comboDelText2.pRecent = &m_cRecentReplace;
SetComboBoxDeleter( GetItemHwnd( IDC_COMBO_TEXT2 ), &m_comboDelText2 );
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_TEXT2), &m_cRecentReplace);

BOOL bRet = CDlgGrep::OnInitDialog( hwndDlg, wParam, lParam );
if( !bRet ) return bRet;
Expand Down
1 change: 0 additions & 1 deletion sakura_core/dlg/CDlgGrepReplace.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ class CDlgGrepReplace final : public CDlgGrep

protected:
CRecentReplace m_cRecentReplace;
SComboBoxItemDeleter m_comboDelText2;
CFontAutoDeleter m_cFontText2;

/*
Expand Down
10 changes: 2 additions & 8 deletions sakura_core/dlg/CDlgOpenFile_CommonFileDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,7 @@ class CDlgOpenFileData{

bool m_bInitCodePage;

SComboBoxItemDeleter m_combDelFile;
CRecentFile m_cRecentFile;
SComboBoxItemDeleter m_combDelFolder;
CRecentFolder m_cRecentFolder;

OPENFILENAME* m_pOf;
Expand Down Expand Up @@ -373,12 +371,8 @@ UINT_PTR CALLBACK OFNHookProc(
/* ビューモードの初期値セット */
::CheckDlgButton( pData->m_hwndOpenDlg, chx1, pData->m_bViewMode );

pData->m_combDelFile = SComboBoxItemDeleter();
pData->m_combDelFile.pRecent = &pData->m_cRecentFile;
CDialog::SetComboBoxDeleter(pData->m_hwndComboMRU, &pData->m_combDelFile);
pData->m_combDelFolder = SComboBoxItemDeleter();
pData->m_combDelFolder.pRecent = &pData->m_cRecentFolder;
CDialog::SetComboBoxDeleter(pData->m_hwndComboOPENFOLDER, &pData->m_combDelFolder);
CDialog::SetComboBoxDeleter(pData->m_hwndComboMRU, &pData->m_cRecentFile);
CDialog::SetComboBoxDeleter(pData->m_hwndComboOPENFOLDER, &pData->m_cRecentFolder);
}
break;

Expand Down
8 changes: 2 additions & 6 deletions sakura_core/dlg/CDlgReplace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -343,12 +343,8 @@ BOOL CDlgReplace::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
::CheckDlgButton( GetHwnd(), IDC_RADIO_ALLAREA, TRUE );
}

m_comboDelText = SComboBoxItemDeleter();
m_comboDelText.pRecent = &m_cRecentSearch;
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_TEXT), &m_comboDelText);
m_comboDelText2 = SComboBoxItemDeleter();
m_comboDelText2.pRecent = &m_cRecentReplace;
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_TEXT2), &m_comboDelText2);
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_TEXT), &m_cRecentSearch);
SetComboBoxDeleter(GetItemHwnd(IDC_COMBO_TEXT2), &m_cRecentReplace);

BOOL bRet = CDialog::OnInitDialog( hwndDlg, wParam, lParam );
if( !bRet ) return bRet;
Expand Down
2 changes: 0 additions & 2 deletions sakura_core/dlg/CDlgReplace.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,7 @@ class CDlgReplace final : public CDialog

protected:
CRecentSearch m_cRecentSearch;
SComboBoxItemDeleter m_comboDelText;
CRecentReplace m_cRecentReplace;
SComboBoxItemDeleter m_comboDelText2;
CFontAutoDeleter m_cFontText;
CFontAutoDeleter m_cFontText2;

Expand Down
4 changes: 1 addition & 3 deletions sakura_core/dlg/CDlgTagJumpList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -522,9 +522,7 @@ BOOL CDlgTagJumpList::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
bRet = FALSE; //for set focus
}

m_comboDel = SComboBoxItemDeleter();
m_comboDel.pRecent = &m_cRecentKeyword;
SetComboBoxDeleter(hwndKey, &m_comboDel);
SetComboBoxDeleter(hwndKey, &m_cRecentKeyword);

/* 基底クラスメンバ */
CDialog::OnInitDialog( GetHwnd(), wParam, lParam );
Expand Down
1 change: 0 additions & 1 deletion sakura_core/dlg/CDlgTagJumpList.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,6 @@ class CDlgTagJumpList final : public CDialog
BOOL m_bOldTagJumpICase; //!< 前回の大文字小文字を同一視
BOOL m_bOldTagJumpPartialMatch; //!< 前回の文字列の途中にマッチ

SComboBoxItemDeleter m_comboDel;
CRecentTagjumpKeyword m_cRecentKeyword;

POINT m_ptDefaultSize;
Expand Down
4 changes: 1 addition & 3 deletions sakura_core/window/CMainToolBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -327,9 +327,7 @@ void CMainToolBar::CreateToolBar( void )
//検索ボックスを更新 // 関数化 2010/6/6 Uchi
AcceptSharedSearchKey();

m_comboDel = SComboBoxItemDeleter(); // 再表示用の初期化
m_comboDel.pRecent = &m_cRecentSearch;
CDialog::SetComboBoxDeleter(m_hwndSearchBox, &m_comboDel);
CDialog::SetComboBoxDeleter(m_hwndSearchBox, &m_cRecentSearch);

// コンボボックスの位置と幅を調整する
CMyRect rcCombo;
Expand Down
1 change: 0 additions & 1 deletion sakura_core/window/CMainToolBar.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ class CMainToolBar{
//フォント
HFONT m_hFontSearchBox; //!< 検索コンボボックスのフォント

SComboBoxItemDeleter m_comboDel;
CRecentSearch m_cRecentSearch;
CImageListMgr* m_pcIcons;
};
Expand Down