Esempio n. 1
0
void wxListBoxBase::SetSelection(int n)
{
    if ( !HasMultipleSelection() )
        DoChangeSingleSelection(n);

    DoSetSelection(n, true);
}
Esempio n. 2
0
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
    }
    else if ( param == LBN_DBLCLK )
    {
        evtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED;
    }
    else
    {
        // some event we're not interested in
        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)));
    }

    // We get events even when mouse is clicked outside of any valid item from
    // Windows, just ignore them.
    if ( n == wxNOT_FOUND )
       return false;

    if ( param == LBN_SELCHANGE )
    {
        if ( !DoChangeSingleSelection(n) )
            return false;
    }

    // Do generate an event otherwise.
    return SendEvent(evtType, n, true /* selection */);
}
Esempio n. 3
0
void wxListBox::GTKOnSelectionChanged()
{
    if ( HasFlag(wxLB_MULTIPLE | wxLB_EXTENDED) )
    {
        CalcAndSendEvent();
    }
    else // single selection
    {
        const int item = GetSelection();
        if (item >= 0 && DoChangeSingleSelection(item))
            SendEvent(wxEVT_LISTBOX, item, true);
    }
}
Esempio n. 4
0
bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
{
    wxEventType evtType;
    if ( param == LBN_SELCHANGE )
    {
        if ( HasMultipleSelection() )
            return CalcAndSendEvent();

        evtType = wxEVT_LISTBOX;
    }
    else if ( param == LBN_DBLCLK )
    {
        // 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
    {
        // some event we're not interested in
        return false;
    }

    const int n = ListBox_GetCurSel(GetHwnd());

    // We get events even when mouse is clicked outside of any valid item from
    // Windows, just ignore them.
    if ( n == wxNOT_FOUND )
       return false;

    if ( param == LBN_SELCHANGE )
    {
        if ( !DoChangeSingleSelection(n) )
            return false;
    }

    // Do generate an event otherwise.
    return SendEvent(evtType, n, true /* selection */);
}