X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..87df17a11b0017d31c09f767bd921abb27193bee:/src/msw/listbox.cpp?ds=sidebyside diff --git a/src/msw/listbox.cpp b/src/msw/listbox.cpp index 3594e49841..e466ae97ee 100644 --- a/src/msw/listbox.cpp +++ b/src/msw/listbox.cpp @@ -100,7 +100,7 @@ wxListBoxItem::wxListBoxItem(const wxString& str) : wxOwnerDrawn(str, FALSE) SetMarginWidth(0); } -wxOwnerDrawn *wxListBox::CreateItem(size_t n) +wxOwnerDrawn *wxListBox::CreateItem(size_t WXUNUSED(n)) { return new wxListBoxItem(); } @@ -157,6 +157,12 @@ bool wxListBox::Create(wxWindow *parent, DWORD wstyle = WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | LBS_NOTIFY | LBS_HASSTRINGS /* | WS_CLIPSIBLINGS */; + + wxASSERT_MSG( !(style & wxLB_MULTIPLE) || !(style & wxLB_EXTENDED), + _T("only one of listbox selection modes can be specified") ); + if ( m_windowStyle & wxCLIP_SIBLINGS ) + wstyle |= WS_CLIPSIBLINGS; + if (m_windowStyle & wxLB_MULTIPLE) wstyle |= LBS_MULTIPLESEL; else if (m_windowStyle & wxLB_EXTENDED) @@ -307,8 +313,12 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) if ( clientData ) { #if wxUSE_OWNER_DRAWN - wxASSERT_MSG(clientData[i] == NULL, - wxT("Can't use client data with owner-drawn listboxes")); + if ( m_windowStyle & wxLB_OWNERDRAW ) + { + wxASSERT_MSG(clientData[i] == NULL, + wxT("Can't use client data with owner-drawn listboxes")); + } + ListBox_SetItemData(GetHwnd(), i, clientData[i]); #else // !wxUSE_OWNER_DRAWN ListBox_SetItemData(GetHwnd(), i, clientData[i]); #endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN @@ -653,7 +663,10 @@ wxSize wxListBox::DoGetBestSize() const wListbox += 3*cx; - int hListbox = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy)*(wxMax(m_noItems, 7)); + // don't make the listbox too tall (limit height to 10 items) but don't + // make it too small neither + int hListbox = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy)* + wxMin(wxMax(m_noItems, 3), 10); return wxSize(wListbox, hListbox); } @@ -664,41 +677,43 @@ wxSize wxListBox::DoGetBestSize() const bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) { + wxEventType evtType; if ( param == LBN_SELCHANGE ) { - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId); - event.SetEventObject( this ); - - wxArrayInt aSelections; - int n, count = GetSelections(aSelections); - if ( count > 0 ) - { - n = aSelections[0]; - if ( HasClientObjectData() ) - event.SetClientObject( GetClientObject(n) ); - else if ( HasClientUntypedData() ) - event.SetClientData( GetClientData(n) ); - event.SetString( GetString(n) ); - } - else - { - n = -1; - } - - event.m_commandInt = n; - - return GetEventHandler()->ProcessEvent(event); + evtType = wxEVT_COMMAND_LISTBOX_SELECTED; } else if ( param == LBN_DBLCLK ) { - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId); - event.SetEventObject( this ); + evtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED; + } + else + { + // some event we're not interested in + return FALSE; + } - return GetEventHandler()->ProcessEvent(event); + wxCommandEvent event(evtType, m_windowId); + event.SetEventObject( this ); + + wxArrayInt aSelections; + int n, count = GetSelections(aSelections); + if ( count > 0 ) + { + n = aSelections[0]; + if ( HasClientObjectData() ) + event.SetClientObject( GetClientObject(n) ); + else if ( HasClientUntypedData() ) + event.SetClientData( GetClientData(n) ); + event.SetString( GetString(n) ); + } + else + { + n = -1; } - //else: - return FALSE; + event.m_commandInt = n; + + return GetEventHandler()->ProcessEvent(event); } // ---------------------------------------------------------------------------- @@ -761,14 +776,13 @@ bool wxListBox::MSWOnDraw(WXDRAWITEMSTRUCT *item) wxListBoxItem *pItem = (wxListBoxItem *)data; - wxDC dc; - dc.SetHDC((WXHDC)pStruct->hDC, FALSE); + wxDCTemp dc((WXHDC)pStruct->hDC); wxRect rect(wxPoint(pStruct->rcItem.left, pStruct->rcItem.top), wxPoint(pStruct->rcItem.right, pStruct->rcItem.bottom)); return pItem->OnDrawItem(dc, rect, - (wxOwnerDrawn::wxODAction)pStruct->itemAction, - (wxOwnerDrawn::wxODStatus)pStruct->itemState); + (wxOwnerDrawn::wxODAction)pStruct->itemAction, + (wxOwnerDrawn::wxODStatus)pStruct->itemState); } #endif