Defer SetHorizontalExtent to idle, also fixes (wxListBox::Delete ignores Freeze/Thaw and is verrrrry slow)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53743 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2008-05-25 20:54:30 +00:00
parent 5af86f4df5
commit 1ddb283ad5
2 changed files with 21 additions and 7 deletions

View File

@@ -147,11 +147,13 @@ protected:
virtual void* DoGetItemClientData(unsigned int n) const; virtual void* DoGetItemClientData(unsigned int n) const;
virtual int DoListHitTest(const wxPoint& point) const; virtual int DoListHitTest(const wxPoint& point) const;
bool m_updateHorizontalExtent;
virtual void OnInternalIdle();
// free memory (common part of Clear() and dtor) // free memory (common part of Clear() and dtor)
void Free(); void Free();
unsigned int m_noItems; unsigned int m_noItems;
int m_selected;
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;

View File

@@ -145,7 +145,7 @@ wxOwnerDrawn *wxListBox::CreateLboxItem(size_t WXUNUSED(n))
wxListBox::wxListBox() wxListBox::wxListBox()
{ {
m_noItems = 0; m_noItems = 0;
m_selected = 0; m_updateHorizontalExtent = false;
} }
bool wxListBox::Create(wxWindow *parent, bool wxListBox::Create(wxWindow *parent,
@@ -158,7 +158,7 @@ bool wxListBox::Create(wxWindow *parent,
const wxString& name) const wxString& name)
{ {
m_noItems = 0; m_noItems = 0;
m_selected = 0; m_updateHorizontalExtent = false;
// initialize base class fields // initialize base class fields
if ( !CreateControl(parent, id, pos, size, style, validator, name) ) if ( !CreateControl(parent, id, pos, size, style, validator, name) )
@@ -245,6 +245,17 @@ WXDWORD wxListBox::MSWGetStyle(long style, WXDWORD *exstyle) const
return msStyle; return msStyle;
} }
void wxListBox::OnInternalIdle()
{
wxWindow::OnInternalIdle();
if (m_updateHorizontalExtent)
{
SetHorizontalExtent(wxEmptyString);
m_updateHorizontalExtent = false;
}
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// implementation of wxListBoxBase methods // implementation of wxListBoxBase methods
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -265,7 +276,8 @@ void wxListBox::DoDeleteOneItem(unsigned int n)
SendMessage(GetHwnd(), LB_DELETESTRING, n, 0); SendMessage(GetHwnd(), LB_DELETESTRING, n, 0);
m_noItems--; m_noItems--;
SetHorizontalExtent(wxEmptyString); // SetHorizontalExtent(wxEmptyString); can be slow
m_updateHorizontalExtent = true;
UpdateOldSelections(); UpdateOldSelections();
} }
@@ -290,7 +302,7 @@ void wxListBox::DoClear()
ListBox_ResetContent(GetHwnd()); ListBox_ResetContent(GetHwnd());
m_noItems = 0; m_noItems = 0;
SetHorizontalExtent(); m_updateHorizontalExtent = true;
UpdateOldSelections(); UpdateOldSelections();
} }
@@ -468,7 +480,7 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items,
AssignNewItemClientData(n, clientData, i, type); AssignNewItemClientData(n, clientData, i, type);
} }
SetHorizontalExtent(); m_updateHorizontalExtent = true;
UpdateOldSelections(); UpdateOldSelections();
@@ -530,7 +542,7 @@ void wxListBox::SetString(unsigned int n, const wxString& s)
if ( wasSelected ) if ( wasSelected )
Select(n); Select(n);
SetHorizontalExtent(); m_updateHorizontalExtent = true;
} }
unsigned int wxListBox::GetCount() const unsigned int wxListBox::GetCount() const