fixed selecting the items in the combobox with a simple (not double) click

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14609 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-03-15 18:08:25 +00:00
parent f9a853668a
commit 55f095d4c1
2 changed files with 79 additions and 25 deletions

View File

@@ -136,6 +136,9 @@ protected:
// filter mouse move events happening outside the list box // filter mouse move events happening outside the list box
void OnMouseMove(wxMouseEvent& event); void OnMouseMove(wxMouseEvent& event);
// set m_clicked value from here
void OnLeftUp(wxMouseEvent& event);
// called whenever the user selects or activates a listbox item // called whenever the user selects or activates a listbox item
void OnSelect(wxCommandEvent& event); void OnSelect(wxCommandEvent& event);
@@ -145,6 +148,9 @@ protected:
const wxString& strArg); const wxString& strArg);
private: private:
// has the mouse been released on this control?
bool m_clicked;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
@@ -183,6 +189,7 @@ BEGIN_EVENT_TABLE(wxComboListBox, wxListBox)
EVT_LISTBOX(-1, wxComboListBox::OnSelect) EVT_LISTBOX(-1, wxComboListBox::OnSelect)
EVT_LISTBOX_DCLICK(-1, wxComboListBox::OnSelect) EVT_LISTBOX_DCLICK(-1, wxComboListBox::OnSelect)
EVT_MOTION(wxComboListBox::OnMouseMove) EVT_MOTION(wxComboListBox::OnMouseMove)
EVT_LEFT_UP(wxComboListBox::OnLeftUp)
END_EVENT_TABLE() END_EVENT_TABLE()
BEGIN_EVENT_TABLE(wxComboControl, wxControl) BEGIN_EVENT_TABLE(wxComboControl, wxControl)
@@ -341,7 +348,7 @@ bool wxComboControl::Show(bool show)
if (m_btn) if (m_btn)
m_btn->Show(show); m_btn->Show(show);
if (m_text) if (m_text)
m_text->Show(show); m_text->Show(show);
@@ -382,6 +389,7 @@ void wxComboControl::ShowPopup()
m_winPopup->PositionNearCombo(); m_winPopup->PositionNearCombo();
// show it // show it
m_popup->OnShow();
m_winPopup->Popup(m_text); m_winPopup->Popup(m_text);
m_text->SelectAll(); m_text->SelectAll();
m_popup->SetSelection(m_text->GetValue()); m_popup->SetSelection(m_text->GetValue());
@@ -521,22 +529,28 @@ bool wxComboListBox::SetSelection(const wxString& value)
void wxComboListBox::OnSelect(wxCommandEvent& event) void wxComboListBox::OnSelect(wxCommandEvent& event)
{ {
// first update the combo and close the listbox if ( m_clicked )
m_combo->OnSelect(event.GetString()); {
// first update the combo and close the listbox
m_combo->OnSelect(event.GetString());
// next let the user code have the event // next let the user code have the event
// all fields are already filled by the listbox, just change the event // all fields are already filled by the listbox, just change the event
// type and send it to the combo // type and send it to the combo
wxCommandEvent event2 = event; wxCommandEvent event2 = event;
event2.SetEventType(wxEVT_COMMAND_COMBOBOX_SELECTED); event2.SetEventType(wxEVT_COMMAND_COMBOBOX_SELECTED);
event2.SetEventObject(m_combo); event2.SetEventObject(m_combo);
event2.SetId(m_combo->GetId()); event2.SetId(m_combo->GetId());
m_combo->ProcessEvent(event2); m_combo->ProcessEvent(event2);
}
//else: ignore the events resultign from just moving the mouse initially
} }
void wxComboListBox::OnShow() void wxComboListBox::OnShow()
{ {
// nobody clicked us yet
m_clicked = FALSE;
} }
bool wxComboListBox::PerformAction(const wxControlAction& action, bool wxComboListBox::PerformAction(const wxControlAction& action,
@@ -555,6 +569,14 @@ bool wxComboListBox::PerformAction(const wxControlAction& action,
return wxListBox::PerformAction(action, numArg, strArg); 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) void wxComboListBox::OnMouseMove(wxMouseEvent& event)
{ {
// while a wxComboListBox is shown, it always has capture, so if it doesn't // while a wxComboListBox is shown, it always has capture, so if it doesn't

View File

@@ -805,11 +805,6 @@ wxSize wxListBox::DoGetBestClientSize() const
bool wxListBox::SendEvent(wxEventType type, int item) bool wxListBox::SendEvent(wxEventType type, int item)
{ {
// don't generate select events while the mouse is captured, we will only
// send them once it is released
if ( (type == wxEVT_COMMAND_LISTBOX_SELECTED) && (GetCapture() == this) )
return FALSE;
wxCommandEvent event(type, m_windowId); wxCommandEvent event(type, m_windowId);
event.SetEventObject(this); event.SetEventObject(this);
@@ -1054,6 +1049,19 @@ void wxListBox::Activate(int item)
// input handling // input handling
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/*
The numArg here is the listbox item index while the strArg is used
differently for the different actions:
a) for wxACTION_LISTBOX_FIND it has the natural meaning: this is the string
to find
b) for wxACTION_LISTBOX_SELECT and wxACTION_LISTBOX_EXTENDSEL it is used
to decide if the listbox should send the notification event (it is empty)
or not (it is not): this allows us to reuse the same action for when the
user is dragging the mouse when it has been released although in the
first case no notification is sent while in the second it is sent.
*/
bool wxListBox::PerformAction(const wxControlAction& action, bool wxListBox::PerformAction(const wxControlAction& action,
long numArg, long numArg,
const wxString& strArg) const wxString& strArg)
@@ -1081,7 +1089,11 @@ bool wxListBox::PerformAction(const wxControlAction& action,
else if ( action == wxACTION_LISTBOX_SELECT ) else if ( action == wxACTION_LISTBOX_SELECT )
{ {
DeselectAll(item); DeselectAll(item);
SelectAndNotify(item);
if ( strArg.empty() )
SelectAndNotify(item);
else
Select(TRUE, item);
} }
else if ( action == wxACTION_LISTBOX_SELECTADD ) else if ( action == wxACTION_LISTBOX_SELECTADD )
Select(TRUE, item); Select(TRUE, item);
@@ -1257,14 +1269,33 @@ bool wxStdListboxInputHandler::HandleKey(wxInputConsumer *consumer,
switch ( keycode ) switch ( keycode )
{ {
// movement // movement
case WXK_UP: action = wxACTION_LISTBOX_MOVEUP; break; case WXK_UP:
case WXK_DOWN: action = wxACTION_LISTBOX_MOVEDOWN; break; action = wxACTION_LISTBOX_MOVEUP;
break;
case WXK_DOWN:
action = wxACTION_LISTBOX_MOVEDOWN;
break;
case WXK_PAGEUP: case WXK_PAGEUP:
case WXK_PRIOR: action = wxACTION_LISTBOX_PAGEUP; break;
case WXK_PRIOR:
action = wxACTION_LISTBOX_PAGEUP;
break;
case WXK_PAGEDOWN: case WXK_PAGEDOWN:
case WXK_NEXT: action = wxACTION_LISTBOX_PAGEDOWN; break;
case WXK_HOME: action = wxACTION_LISTBOX_START; break; case WXK_NEXT:
case WXK_END: action = wxACTION_LISTBOX_END; break; action = wxACTION_LISTBOX_PAGEDOWN;
break;
case WXK_HOME:
action = wxACTION_LISTBOX_START;
break;
case WXK_END:
action = wxACTION_LISTBOX_END;
break;
// selection // selection
case WXK_SPACE: case WXK_SPACE:
@@ -1346,7 +1377,6 @@ bool wxStdListboxInputHandler::HandleMouse(wxInputConsumer *consumer,
winCapture->ReleaseMouse(); winCapture->ReleaseMouse();
m_btnCapture = 0; m_btnCapture = 0;
// generate the last event to triiger sending the selection event
action = m_actionMouse; action = m_actionMouse;
} }
//else: the mouse wasn't presed over the listbox, only released here //else: the mouse wasn't presed over the listbox, only released here
@@ -1396,7 +1426,9 @@ bool wxStdListboxInputHandler::HandleMouseMove(wxInputConsumer *consumer,
if ( IsValidIndex(lbox, item) ) if ( IsValidIndex(lbox, item) )
{ {
lbox->PerformAction(m_actionMouse, item); // pass something into strArg to tell the listbox that it shouldn't
// send the notification message: see PerformAction() above
lbox->PerformAction(m_actionMouse, item, _T("no"));
} }
// else: don't pass invalid index to the listbox // else: don't pass invalid index to the listbox
} }