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
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 +148,9 @@ protected:
const wxString& strArg);
private:
// has the mouse been released on this control?
bool m_clicked;
DECLARE_EVENT_TABLE()
};
@@ -183,6 +189,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 +348,7 @@ bool wxComboControl::Show(bool show)
if (m_btn)
m_btn->Show(show);
if (m_text)
m_text->Show(show);
@@ -382,6 +389,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 +529,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());
if ( m_clicked )
{
// 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
// 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);
// 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 +569,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

View File

@@ -805,11 +805,6 @@ wxSize wxListBox::DoGetBestClientSize() const
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);
event.SetEventObject(this);
@@ -1054,6 +1049,19 @@ void wxListBox::Activate(int item)
// 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,
long numArg,
const wxString& strArg)
@@ -1081,7 +1089,11 @@ bool wxListBox::PerformAction(const wxControlAction& action,
else if ( action == wxACTION_LISTBOX_SELECT )
{
DeselectAll(item);
SelectAndNotify(item);
if ( strArg.empty() )
SelectAndNotify(item);
else
Select(TRUE, item);
}
else if ( action == wxACTION_LISTBOX_SELECTADD )
Select(TRUE, item);
@@ -1257,14 +1269,33 @@ bool wxStdListboxInputHandler::HandleKey(wxInputConsumer *consumer,
switch ( keycode )
{
// movement
case WXK_UP: action = wxACTION_LISTBOX_MOVEUP; break;
case WXK_DOWN: action = wxACTION_LISTBOX_MOVEDOWN; break;
case WXK_UP:
action = wxACTION_LISTBOX_MOVEUP;
break;
case WXK_DOWN:
action = wxACTION_LISTBOX_MOVEDOWN;
break;
case WXK_PAGEUP:
case WXK_PRIOR: action = wxACTION_LISTBOX_PAGEUP; break;
case WXK_PRIOR:
action = wxACTION_LISTBOX_PAGEUP;
break;
case WXK_PAGEDOWN:
case WXK_NEXT: action = wxACTION_LISTBOX_PAGEDOWN; break;
case WXK_HOME: action = wxACTION_LISTBOX_START; break;
case WXK_END: action = wxACTION_LISTBOX_END; break;
case WXK_NEXT:
action = wxACTION_LISTBOX_PAGEDOWN;
break;
case WXK_HOME:
action = wxACTION_LISTBOX_START;
break;
case WXK_END:
action = wxACTION_LISTBOX_END;
break;
// selection
case WXK_SPACE:
@@ -1346,7 +1377,6 @@ bool wxStdListboxInputHandler::HandleMouse(wxInputConsumer *consumer,
winCapture->ReleaseMouse();
m_btnCapture = 0;
// generate the last event to triiger sending the selection event
action = m_actionMouse;
}
//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) )
{
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
}