// Author: Julian Smart
// Modified by: Vadim Zeitlin (owner drawn stuff)
// Created:
-// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
{
m_noItems = 0;
m_updateHorizontalExtent = false;
- m_selectedByKeyboard = false;
}
bool wxListBox::Create(wxWindow *parent,
bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
{
wxEventType evtType;
- int n = wxNOT_FOUND;
if ( param == LBN_SELCHANGE )
{
if ( HasMultipleSelection() )
return CalcAndSendEvent();
- evtType = wxEVT_COMMAND_LISTBOX_SELECTED;
-
- if ( m_selectedByKeyboard )
- {
- // We shouldn't use the mouse position to find the item as mouse
- // can be anywhere, ask the listbox itself. Notice that this can't
- // be used when the item is selected using the mouse however as
- // LB_GETCARETINDEX will always return a valid item, even if the
- // mouse is clicked below all the items, which is why we find the
- // item ourselves below in this case.
- n = SendMessage(GetHwnd(), LB_GETCARETINDEX, 0, 0);
- }
- //else: n will be determined below from the mouse position
+ evtType = wxEVT_LISTBOX;
}
else if ( param == LBN_DBLCLK )
{
- evtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED;
+ // Clicking under the last item in the listbox generates double click
+ // event for the currently selected item which is rather surprising.
+ // Avoid the surprise by checking that we do have an item under mouse.
+ const DWORD pos = ::GetMessagePos();
+ const wxPoint pt(GET_X_LPARAM(pos), GET_Y_LPARAM(pos));
+ if ( HitTest(ScreenToClient(pt)) == wxNOT_FOUND )
+ return false;
+
+ evtType = wxEVT_LISTBOX_DCLICK;
}
else
{
return false;
}
- // Find the item position if it was a mouse-generated selection event or a
- // double click event (which is always generated using the mouse)
- if ( n == wxNOT_FOUND )
- {
- const DWORD pos = ::GetMessagePos();
- const wxPoint pt(GET_X_LPARAM(pos), GET_Y_LPARAM(pos));
- n = HitTest(ScreenToClient(wxPoint(pt)));
- }
+ const int n = ListBox_GetCurSel(GetHwnd());
// We get events even when mouse is clicked outside of any valid item from
// Windows, just ignore them.
return SendEvent(evtType, n, true /* selection */);
}
-WXLRESULT
-wxListBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
-{
- // Remember whether there was a keyboard or mouse event before
- // LBN_SELCHANGE: this allows us to correctly determine the item affected
- // by it in MSWCommand() above in any case.
- if ( WM_KEYFIRST <= nMsg && nMsg <= WM_KEYLAST )
- m_selectedByKeyboard = true;
- else if ( WM_MOUSEFIRST <= nMsg && nMsg <= WM_MOUSELAST )
- m_selectedByKeyboard = false;
-
- return wxListBoxBase::MSWWindowProc(nMsg, wParam, lParam);
-}
-
// ----------------------------------------------------------------------------
// owner-drawn list boxes support
// ----------------------------------------------------------------------------