X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5ddb3b8c535567e281e7a437e5e700e82d1516b4..12bb29f5432174ecbd65549bda832d70d34a98ae:/src/msw/combobox.cpp?ds=inline diff --git a/src/msw/combobox.cpp b/src/msw/combobox.cpp index 46b1c482c1..d98241f0c4 100644 --- a/src/msw/combobox.cpp +++ b/src/msw/combobox.cpp @@ -32,14 +32,13 @@ #include "wx/msw/wrapcctl.h" // include "properly" #include "wx/settings.h" #include "wx/log.h" - // for wxEVT_COMMAND_TEXT_ENTER + // for wxEVT_TEXT_ENTER #include "wx/textctrl.h" #include "wx/app.h" #include "wx/brush.h" #endif #include "wx/clipbrd.h" -#include "wx/dynlib.h" #include "wx/wupdlock.h" #include "wx/msw/private.h" @@ -235,7 +234,7 @@ bool wxComboBox::MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam) if (SendMessage(GetHwnd(), CB_GETDROPPEDSTATE, 0, 0)) return false; - wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId); + wxCommandEvent event(wxEVT_TEXT_ENTER, m_windowId); const int sel = GetSelection(); event.SetInt(sel); @@ -275,26 +274,27 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD id) 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; - } - { - wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_DROPDOWN, GetId()); + wxCommandEvent event(wxEVT_COMBOBOX_DROPDOWN, GetId()); event.SetEventObject(this); ProcessCommand(event); } break; + case CBN_CLOSEUP: + // Do the same thing as in wxChoice but using different event type. + if ( m_pendingSelection != wxID_NONE ) { - wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_CLOSEUP, GetId()); + SendSelectionChangedEvent(wxEVT_COMBOBOX); + m_pendingSelection = wxID_NONE; + } + { + wxCommandEvent event(wxEVT_COMBOBOX_CLOSEUP, GetId()); event.SetEventObject(this); ProcessCommand(event); } break; + case CBN_SELENDOK: #ifndef __SMARTPHONE__ // we need to reset this to prevent the selection from being undone @@ -312,23 +312,16 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD id) // could get a wrong value when it calls our GetValue() ::SetWindowText(GetHwnd(), value.t_str()); - { - wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, GetId()); - event.SetInt(sel); - event.SetString(value); - InitCommandEventWithItems(event, sel); - - ProcessCommand(event); - } + SendSelectionChangedEvent(wxEVT_COMBOBOX); - // fall through: for compability with wxGTK, also send the text + // fall through: for compatibility with wxGTK, also send the text // update event when the selection changes (this also seems more // logical as the text does change) case CBN_EDITCHANGE: if ( m_allowTextEvents ) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId()); + wxCommandEvent event(wxEVT_TEXT, GetId()); // if sel != -1, value was already initialized above if ( sel == -1 ) @@ -378,26 +371,13 @@ bool wxComboBox::MSWShouldPreProcessMessage(WXMSG *pMsg) WXHWND wxComboBox::GetEditHWNDIfAvailable() const { -#if wxUSE_DYNLIB_CLASS + // FIXME-VC6: Only VC6 needs this guard, see WINVER definition in + // include/wx/msw/wrapwin.h #if defined(WINVER) && WINVER >= 0x0500 - typedef BOOL (WINAPI *GetComboBoxInfo_t)(HWND, COMBOBOXINFO*); - static GetComboBoxInfo_t s_pfnGetComboBoxInfo = NULL; - static bool s_triedToLoad = false; - if ( !s_triedToLoad ) - { - s_triedToLoad = true; - wxLoadedDLL dllUser32("user32.dll"); - wxDL_INIT_FUNC(s_pfn, GetComboBoxInfo, dllUser32); - } - - if ( s_pfnGetComboBoxInfo ) - { - WinStruct info; - (*s_pfnGetComboBoxInfo)(GetHwnd(), &info); + WinStruct info; + if ( MSWGetComboBoxInfo(&info) ) return info.hwndItem; - } #endif // WINVER >= 0x0500 -#endif // wxUSE_DYNLIB_CLASS if (HasFlag(wxCB_SIMPLE)) { @@ -679,4 +659,20 @@ bool wxComboBox::SetHint(const wxString& hintOrig) #endif // wxUSE_UXTHEME +wxSize wxComboBox::DoGetSizeFromTextSize(int xlen, int ylen) const +{ + wxSize tsize( wxChoice::DoGetSizeFromTextSize(xlen, ylen) ); + + if ( !HasFlag(wxCB_READONLY) ) + { + // Add the margins we have previously set + wxPoint marg( GetMargins() ); + marg.x = wxMax(0, marg.x); + marg.y = wxMax(0, marg.y); + tsize.IncBy( marg ); + } + + return tsize; +} + #endif // wxUSE_COMBOBOX