X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1e6feb95a79834836e88143b15d9f424ebe79621..bfedf6212c58824b38bffb7ebd9ec78479769141:/src/msw/listbox.cpp diff --git a/src/msw/listbox.cpp b/src/msw/listbox.cpp index e0ed9ed803..d74a1e4acb 100644 --- a/src/msw/listbox.cpp +++ b/src/msw/listbox.cpp @@ -93,7 +93,7 @@ class wxListBoxItem : public wxOwnerDrawn { public: - wxListBoxItem(const wxString& str = ""); + wxListBoxItem(const wxString& str = wxEmptyString); }; wxListBoxItem::wxListBoxItem(const wxString& str) : wxOwnerDrawn(str, FALSE) @@ -102,7 +102,7 @@ wxListBoxItem::wxListBoxItem(const wxString& str) : wxOwnerDrawn(str, FALSE) SetMarginWidth(0); } -wxOwnerDrawn *wxListBox::CreateItem(size_t WXUNUSED(n)) +wxOwnerDrawn *wxListBox::CreateLboxItem(size_t WXUNUSED(n)) { return new wxListBoxItem(); } @@ -145,8 +145,7 @@ bool wxListBox::Create(wxWindow *parent, if (parent) parent->AddChild(this); - wxSystemSettings settings; - SetBackgroundColour(settings.GetSystemColour(wxSYS_COLOUR_WINDOW)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); SetForegroundColour(parent->GetForegroundColour()); m_windowId = ( id == -1 ) ? (int)NewControlId() : id; @@ -239,7 +238,7 @@ wxListBox::~wxListBox() void wxListBox::SetupColours() { - SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); SetForegroundColour(GetParent()->GetForegroundColour()); } @@ -273,7 +272,7 @@ void wxListBox::Delete(int N) SendMessage(GetHwnd(), LB_DELETESTRING, N, 0); m_noItems--; - SetHorizontalExtent(""); + SetHorizontalExtent(wxEmptyString); } int wxListBox::DoAppend(const wxString& item) @@ -283,13 +282,13 @@ int wxListBox::DoAppend(const wxString& item) #if wxUSE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) { - wxOwnerDrawn *pNewItem = CreateItem(index); // dummy argument + wxOwnerDrawn *pNewItem = CreateLboxItem(index); // dummy argument pNewItem->SetName(item); - m_aItems.Add(pNewItem); + m_aItems.Insert(pNewItem, index); ListBox_SetItemData(GetHwnd(), index, pNewItem); pNewItem->SetFont(GetFont()); } -#endif +#endif // wxUSE_OWNER_DRAWN SetHorizontalExtent(item); @@ -314,31 +313,18 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) ListBox_AddString(GetHwnd(), choices[i]); if ( clientData ) { -#if wxUSE_OWNER_DRAWN - 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 + SetClientData(i, clientData[i]); } } #if wxUSE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) { // first delete old items - size_t ui = m_aItems.Count(); - while ( ui-- != 0 ) { - delete m_aItems[ui]; - } - m_aItems.Empty(); + WX_CLEAR_ARRAY(m_aItems); // then create new ones - for ( ui = 0; ui < (size_t)m_noItems; ui++ ) { - wxOwnerDrawn *pNewItem = CreateItem(ui); + for ( size_t ui = 0; ui < (size_t)m_noItems; ui++ ) { + wxOwnerDrawn *pNewItem = CreateLboxItem(ui); pNewItem->SetName(choices[ui]); m_aItems.Add(pNewItem); ListBox_SetItemData(GetHwnd(), ui, pNewItem); @@ -379,12 +365,7 @@ void wxListBox::Free() #if wxUSE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) { - size_t uiCount = m_aItems.Count(); - while ( uiCount-- != 0 ) { - delete m_aItems[uiCount]; - } - - m_aItems.Clear(); + WX_CLEAR_ARRAY(m_aItems); } else #endif // wxUSE_OWNER_DRAWN @@ -463,21 +444,32 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const if ( HasMultipleSelection() ) { - int no_sel = ListBox_GetSelCount(GetHwnd()); - if (no_sel != 0) { - int *selections = new int[no_sel]; - int rc = ListBox_GetSelItems(GetHwnd(), no_sel, selections); - - wxCHECK_MSG(rc != LB_ERR, -1, wxT("ListBox_GetSelItems failed")); + int countSel = ListBox_GetSelCount(GetHwnd()); + if ( countSel == LB_ERR ) + { + wxLogDebug(_T("ListBox_GetSelCount failed")); + } + else if ( countSel != 0 ) + { + int *selections = new int[countSel]; - aSelections.Alloc(no_sel); - for ( int n = 0; n < no_sel; n++ ) - aSelections.Add(selections[n]); + if ( ListBox_GetSelItems(GetHwnd(), + countSel, selections) == LB_ERR ) + { + wxLogDebug(wxT("ListBox_GetSelItems failed")); + countSel = -1; + } + else + { + aSelections.Alloc(countSel); + for ( int n = 0; n < countSel; n++ ) + aSelections.Add(selections[n]); + } delete [] selections; } - return no_sel; + return countSel; } else // single-selection listbox { @@ -501,7 +493,7 @@ int wxListBox::GetSelection() const // Find string for position wxString wxListBox::GetString(int N) const { - wxCHECK_MSG( N >= 0 && N < m_noItems, "", + wxCHECK_MSG( N >= 0 && N < m_noItems, wxEmptyString, wxT("invalid index in wxListBox::GetClientData") ); int len = ListBox_GetTextLen(GetHwnd(), N); @@ -522,7 +514,22 @@ wxListBox::DoInsertItems(const wxArrayString& items, int pos) int nItems = items.GetCount(); for ( int i = 0; i < nItems; i++ ) - ListBox_InsertString(GetHwnd(), i + pos, items[i]); + { + int idx = ListBox_InsertString(GetHwnd(), i + pos, items[i]); + +#if wxUSE_OWNER_DRAWN + if ( m_windowStyle & wxLB_OWNERDRAW ) + { + wxOwnerDrawn *pNewItem = CreateLboxItem(idx); + pNewItem->SetName(items[i]); + pNewItem->SetFont(GetFont()); + m_aItems.Insert(pNewItem, idx); + + ListBox_SetItemData(GetHwnd(), idx, pNewItem); + } +#endif // wxUSE_OWNER_DRAWN + } + m_noItems += nItems; SetHorizontalExtent(); @@ -564,8 +571,13 @@ void wxListBox::SetString(int N, const wxString& s) #if wxUSE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) + { // update item's text m_aItems[N]->SetName(s); + + // reassign the item's data + ListBox_SetItemData(GetHwnd(), N, m_aItems[N]); + } #endif //USE_OWNER_DRAWN } @@ -742,7 +754,7 @@ bool wxListBox::MSWOnMeasure(WXMEASUREITEMSTRUCT *item) wxDC dc; dc.SetHDC((WXHDC)hdc); - dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_ANSI_VAR_FONT)); + dc.SetFont(wxSystemSettings::GetFont(wxSYS_ANSI_VAR_FONT)); pStruct->itemHeight = dc.GetCharHeight() + 2*OWNER_DRAWN_LISTBOX_EXTRA_SPACE; pStruct->itemWidth = dc.GetCharWidth();