X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e9717bd5d8ff2e3ff91d99d44850b1d2485f5edf..ccd5d46c7b69632eaa231e8fc7801dd5af2faaa8:/src/msw/combobox.cpp diff --git a/src/msw/combobox.cpp b/src/msw/combobox.cpp index bd3650dc3b..5faed26cb5 100644 --- a/src/msw/combobox.cpp +++ b/src/msw/combobox.cpp @@ -205,13 +205,6 @@ LRESULT APIENTRY _EXPORT wxComboEditWndProc(HWND hWnd, } } break; - - case WM_CUT: - case WM_COPY: - case WM_PASTE: - if( win->HandleClipboardEvent( message ) ) - return 0; - break; } return ::CallWindowProc(CASTWNDPROC gs_wndprocEdit, hWnd, message, wParam, lParam); @@ -302,6 +295,11 @@ bool wxComboBox::MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam) case WM_KILLFOCUS: return HandleKillFocus((WXHWND)wParam); + + case WM_CUT: + case WM_COPY: + case WM_PASTE: + return HandleClipboardEvent(msg); } return false; @@ -314,6 +312,18 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD id) switch ( param ) { + case CBN_DROPDOWN: + // remember the last selection, just as wxChoice does + m_lastAcceptedSelection = GetCurrentSelection(); + if ( m_lastAcceptedSelection == -1 ) + { + // but unlike with wxChoice we may have no selection but still + // have some text and we should avoid erasing it if the drop + // down is cancelled (see #8474) + m_lastAcceptedSelection = wxID_NONE; + } + break; + case CBN_SELENDOK: #ifndef __SMARTPHONE__ // we need to reset this to prevent the selection from being undone @@ -345,6 +355,7 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD id) // logical as the text does change) case CBN_EDITCHANGE: + if ( m_allowTextEvents ) { wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId()); @@ -366,7 +377,7 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD id) } // skip wxChoice version as it would generate its own events for - // CBN_SELENDOK + // CBN_SELENDOK and also interfere with our handling of CBN_DROPDOWN return true; } @@ -396,12 +407,13 @@ bool wxComboBox::MSWShouldPreProcessMessage(WXMSG *pMsg) WXHWND wxComboBox::GetEditHWNDIfAvailable() const { - POINT pt = { 4, 4 }; - WXHWND hWndEdit = (WXHWND)::ChildWindowFromPoint(GetHwnd(), pt); - if ( hWndEdit == GetHWND() ) - hWndEdit = NULL; + // notice that a slightly safer alternative could be to use FindWindowEx() + // but it's not available under WinCE so just take the first child for now + // to keep one version of the code for all platforms and fix it later if + // problems are discovered - return hWndEdit; + // we assume that the only child of the combobox is the edit window + return (WXHWND)::GetWindow(GetHwnd(), GW_CHILD); } WXHWND wxComboBox::GetEditHWND() const @@ -582,15 +594,12 @@ void wxComboBox::OnRedo(wxCommandEvent& WXUNUSED(event)) void wxComboBox::OnDelete(wxCommandEvent& WXUNUSED(event)) { - long from, to; - GetSelection(& from, & to); - if (from != -1 && to != -1) - Remove(from, to); + RemoveSelection(); } void wxComboBox::OnSelectAll(wxCommandEvent& WXUNUSED(event)) { - SetSelection(-1, -1); + SelectAll(); } void wxComboBox::OnUpdateCut(wxUpdateUIEvent& event) @@ -610,12 +619,12 @@ void wxComboBox::OnUpdatePaste(wxUpdateUIEvent& event) void wxComboBox::OnUpdateUndo(wxUpdateUIEvent& event) { - event.Enable( CanUndo() ); + event.Enable( IsEditable() && CanUndo() ); } void wxComboBox::OnUpdateRedo(wxUpdateUIEvent& event) { - event.Enable( CanRedo() ); + event.Enable( IsEditable() && CanRedo() ); } void wxComboBox::OnUpdateDelete(wxUpdateUIEvent& event) @@ -625,7 +634,7 @@ void wxComboBox::OnUpdateDelete(wxUpdateUIEvent& event) void wxComboBox::OnUpdateSelectAll(wxUpdateUIEvent& event) { - event.Enable(IsEditable() && GetLastPosition() > 0); + event.Enable(IsEditable() && !wxTextEntry::IsEmpty()); } #if wxUSE_TOOLTIPS