X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/84c5c49bca1bbabce3e26f43e8a6db23c419c531..591cc82deb5bc6dd0af6047ecfa7ce7cf4f8d859:/src/msw/listbox.cpp diff --git a/src/msw/listbox.cpp b/src/msw/listbox.cpp index aa082d4cdf..82b06b1432 100644 --- a/src/msw/listbox.cpp +++ b/src/msw/listbox.cpp @@ -145,7 +145,7 @@ wxOwnerDrawn *wxListBox::CreateLboxItem(size_t WXUNUSED(n)) wxListBox::wxListBox() { m_noItems = 0; - m_selected = 0; + m_updateHorizontalExtent = false; } bool wxListBox::Create(wxWindow *parent, @@ -158,7 +158,7 @@ bool wxListBox::Create(wxWindow *parent, const wxString& name) { m_noItems = 0; - m_selected = 0; + m_updateHorizontalExtent = false; // initialize base class fields if ( !CreateControl(parent, id, pos, size, style, validator, name) ) @@ -177,7 +177,8 @@ bool wxListBox::Create(wxWindow *parent, Append(choices[i]); } - // now we can compute our best size correctly, so do it if necessary + // now we can compute our best size correctly, so do it again + InvalidateBestSize(); SetInitialSize(size); return true; @@ -245,6 +246,17 @@ WXDWORD wxListBox::MSWGetStyle(long style, WXDWORD *exstyle) const return msStyle; } +void wxListBox::OnInternalIdle() +{ + wxWindow::OnInternalIdle(); + + if (m_updateHorizontalExtent) + { + SetHorizontalExtent(wxEmptyString); + m_updateHorizontalExtent = false; + } +} + // ---------------------------------------------------------------------------- // implementation of wxListBoxBase methods // ---------------------------------------------------------------------------- @@ -265,7 +277,8 @@ void wxListBox::DoDeleteOneItem(unsigned int n) SendMessage(GetHwnd(), LB_DELETESTRING, n, 0); m_noItems--; - SetHorizontalExtent(wxEmptyString); + // SetHorizontalExtent(wxEmptyString); can be slow + m_updateHorizontalExtent = true; UpdateOldSelections(); } @@ -290,7 +303,7 @@ void wxListBox::DoClear() ListBox_ResetContent(GetHwnd()); m_noItems = 0; - SetHorizontalExtent(); + m_updateHorizontalExtent = true; UpdateOldSelections(); } @@ -343,15 +356,6 @@ void wxListBox::DoSetItemClientData(unsigned int n, void *clientData) wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetClientData") ); -#if wxUSE_OWNER_DRAWN - if ( m_windowStyle & wxLB_OWNERDRAW ) - { - // client data must be pointer to wxOwnerDrawn, otherwise we would crash - // in OnMeasure/OnDraw. - wxFAIL_MSG(wxT("Can't use client data with owner-drawn listboxes")); - } -#endif // wxUSE_OWNER_DRAWN - if ( ListBox_SetItemData(GetHwnd(), n, clientData) == LB_ERR ) wxLogDebug(wxT("LB_SETITEMDATA failed")); } @@ -461,14 +465,12 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items, pNewItem->SetName(items[i]); pNewItem->SetFont(GetFont()); m_aItems.Insert(pNewItem, n); - - ListBox_SetItemData(GetHwnd(), n, pNewItem); } #endif // wxUSE_OWNER_DRAWN AssignNewItemClientData(n, clientData, i, type); } - SetHorizontalExtent(); + m_updateHorizontalExtent = true; UpdateOldSelections(); @@ -520,9 +522,6 @@ void wxListBox::SetString(unsigned int n, const wxString& s) { // 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 @@ -530,7 +529,7 @@ void wxListBox::SetString(unsigned int n, const wxString& s) if ( wasSelected ) Select(n); - SetHorizontalExtent(); + m_updateHorizontalExtent = true; } unsigned int wxListBox::GetCount() const @@ -734,17 +733,12 @@ bool wxListBox::MSWOnDraw(WXDRAWITEMSTRUCT *item) wxCHECK( ((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), false ); DRAWITEMSTRUCT *pStruct = (DRAWITEMSTRUCT *)item; - UINT itemID = pStruct->itemID; // the item may be -1 for an empty listbox - if ( itemID == (UINT)-1 ) + if ( pStruct->itemID == (UINT)-1 ) return false; - LRESULT data = ListBox_GetItemData(GetHwnd(), pStruct->itemID); - - wxCHECK( data && (data != LB_ERR), false ); - - wxListBoxItem *pItem = (wxListBoxItem *)data; + wxListBoxItem *pItem = (wxListBoxItem *)m_aItems[pStruct->itemID]; wxDCTemp dc((WXHDC)pStruct->hDC); wxPoint pt1(pStruct->rcItem.left, pStruct->rcItem.top);