X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/74052fe83bbeb7e37e98d57c88a05e8a1425c86d..4c7d530a267f11be1e9cf20d7bfa5313286fee1c:/src/msw/combobox.cpp?ds=sidebyside diff --git a/src/msw/combobox.cpp b/src/msw/combobox.cpp index 71e4192405..7ae8dfc956 100644 --- a/src/msw/combobox.cpp +++ b/src/msw/combobox.cpp @@ -39,8 +39,13 @@ #endif #include "wx/clipbrd.h" +#include "wx/wupdlock.h" #include "wx/msw/private.h" +#if wxUSE_UXTHEME + #include "wx/msw/uxtheme.h" +#endif + #if wxUSE_TOOLTIPS #include "wx/tooltip.h" #endif // wxUSE_TOOLTIPS @@ -233,8 +238,23 @@ WXLRESULT wxComboBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPara long fromOld, toOld; GetSelection(&fromOld, &toOld); + + // if an editable combobox has a not empty text not from the + // list, it tries to autocomplete it from the list when it is + // resized, but we don't want this to happen as it doesn't seem + // to make any sense, so we forcefully restore the old text + wxString textOld; + if ( !HasFlag(wxCB_READONLY) && GetCurrentSelection() == -1 ) + textOld = GetValue(); + + // eliminate flickering during following hacks + wxWindowUpdateLocker lock(this); + WXLRESULT result = wxChoice::MSWWindowProc(nMsg, wParam, lParam); + if ( !textOld.empty() && GetValue() != textOld ) + SetLabel(textOld); + long fromNew, toNew; GetSelection(&fromNew, &toNew); @@ -312,6 +332,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 @@ -343,6 +375,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()); @@ -364,7 +397,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; } @@ -416,6 +449,14 @@ WXHWND wxComboBox::GetEditHWND() const return hWndEdit; } +wxWindow *wxComboBox::GetEditableWindow() +{ + wxASSERT_MSG( !HasFlag(wxCB_READONLY), + _T("read-only combobox doesn't have any edit control") ); + + return this; +} + // ---------------------------------------------------------------------------- // wxComboBox creation // ---------------------------------------------------------------------------- @@ -581,15 +622,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) @@ -624,7 +662,7 @@ void wxComboBox::OnUpdateDelete(wxUpdateUIEvent& event) void wxComboBox::OnUpdateSelectAll(wxUpdateUIEvent& event) { - event.Enable(IsEditable() && GetLastPosition() > 0); + event.Enable(IsEditable() && !wxTextEntry::IsEmpty()); } #if wxUSE_TOOLTIPS @@ -639,4 +677,22 @@ void wxComboBox::DoSetToolTip(wxToolTip *tip) #endif // wxUSE_TOOLTIPS +#if wxUSE_UXTHEME + +bool wxComboBox::SetHint(const wxString& hintOrig) +{ + wxString hint(hintOrig); + if ( wxUxThemeEngine::GetIfActive() ) + { + // under XP (but not Vista) there is a bug in cue banners + // implementation for combobox edit control: the first character is + // partially chopped off, so prepend a space to make it fully visible + hint.insert(0, " "); + } + + return wxTextEntry::SetHint(hint); +} + +#endif // wxUSE_UXTHEME + #endif // wxUSE_COMBOBOX