X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c2ef70ec8aae8e28bfc82d59c0519d06234dd4ec..36d9119341753b2f6f606571702a9b906050a07c:/src/univ/combobox.cpp diff --git a/src/univ/combobox.cpp b/src/univ/combobox.cpp index 54ce379716..b8b6fc8435 100644 --- a/src/univ/combobox.cpp +++ b/src/univ/combobox.cpp @@ -9,16 +9,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -/* - TODO: - - +1. typing in the text should select the string in listbox - +2. scrollbars in listbox are unusable - +3. the initially selected item is not selected - ?4. kbd interface (what does GTK do?) - 5. there is still autoscrolling without scrollbars - but is it bad? - */ - // ============================================================================ // declarations // ============================================================================ @@ -136,6 +126,9 @@ protected: // filter mouse move events happening outside the list box void OnMouseMove(wxMouseEvent& event); + // set m_clicked value from here + void OnLeftUp(wxMouseEvent& event); + // called whenever the user selects or activates a listbox item void OnSelect(wxCommandEvent& event); @@ -145,6 +138,9 @@ protected: const wxString& strArg); private: + // has the mouse been released on this control? + bool m_clicked; + DECLARE_EVENT_TABLE() }; @@ -183,6 +179,7 @@ BEGIN_EVENT_TABLE(wxComboListBox, wxListBox) EVT_LISTBOX(-1, wxComboListBox::OnSelect) EVT_LISTBOX_DCLICK(-1, wxComboListBox::OnSelect) EVT_MOTION(wxComboListBox::OnMouseMove) + EVT_LEFT_UP(wxComboListBox::OnLeftUp) END_EVENT_TABLE() BEGIN_EVENT_TABLE(wxComboControl, wxControl) @@ -341,7 +338,7 @@ bool wxComboControl::Show(bool show) if (m_btn) m_btn->Show(show); - + if (m_text) m_text->Show(show); @@ -382,6 +379,7 @@ void wxComboControl::ShowPopup() m_winPopup->PositionNearCombo(); // show it + m_popup->OnShow(); m_winPopup->Popup(m_text); m_text->SelectAll(); m_popup->SetSelection(m_text->GetValue()); @@ -521,22 +519,28 @@ bool wxComboListBox::SetSelection(const wxString& value) void wxComboListBox::OnSelect(wxCommandEvent& event) { - // first update the combo and close the listbox - m_combo->OnSelect(event.GetString()); - - // next let the user code have the event - - // all fields are already filled by the listbox, just change the event - // type and send it to the combo - wxCommandEvent event2 = event; - event2.SetEventType(wxEVT_COMMAND_COMBOBOX_SELECTED); - event2.SetEventObject(m_combo); - event2.SetId(m_combo->GetId()); - m_combo->ProcessEvent(event2); + if ( m_clicked ) + { + // first update the combo and close the listbox + m_combo->OnSelect(event.GetString()); + + // next let the user code have the event + + // all fields are already filled by the listbox, just change the event + // type and send it to the combo + wxCommandEvent event2 = event; + event2.SetEventType(wxEVT_COMMAND_COMBOBOX_SELECTED); + event2.SetEventObject(m_combo); + event2.SetId(m_combo->GetId()); + m_combo->ProcessEvent(event2); + } + //else: ignore the events resultign from just moving the mouse initially } void wxComboListBox::OnShow() { + // nobody clicked us yet + m_clicked = FALSE; } bool wxComboListBox::PerformAction(const wxControlAction& action, @@ -555,6 +559,14 @@ bool wxComboListBox::PerformAction(const wxControlAction& action, return wxListBox::PerformAction(action, numArg, strArg); } +void wxComboListBox::OnLeftUp(wxMouseEvent& event) +{ + // we should dismiss the combo now + m_clicked = TRUE; + + event.Skip(); +} + void wxComboListBox::OnMouseMove(wxMouseEvent& event) { // while a wxComboListBox is shown, it always has capture, so if it doesn't