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 int DoListHitTest(const wxPoint& point) const;
bool m_updateHorizontalExtent;
virtual void OnInternalIdle();
// free memory (common part of Clear() and dtor)
void Free();
unsigned int m_noItems;
int m_selected;
virtual wxSize DoGetBestSize() const;

View File

@@ -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) )
@@ -245,6 +245,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 +276,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 +302,7 @@ void wxListBox::DoClear()
ListBox_ResetContent(GetHwnd());
m_noItems = 0;
SetHorizontalExtent();
m_updateHorizontalExtent = true;
UpdateOldSelections();
}
@@ -468,7 +480,7 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items,
AssignNewItemClientData(n, clientData, i, type);
}
SetHorizontalExtent();
m_updateHorizontalExtent = true;
UpdateOldSelections();
@@ -530,7 +542,7 @@ void wxListBox::SetString(unsigned int n, const wxString& s)
if ( wasSelected )
Select(n);
SetHorizontalExtent();
m_updateHorizontalExtent = true;
}
unsigned int wxListBox::GetCount() const