many wxItemContainer-related changes:

1. the main function for item insertion is now DoInsertItems() which allows
   for much more efficient addition of many new items at once
2. the items client data management is done entirely in wxItemContainer
   itself, the derived classes don't have to distinguish between void and
   object client data
3. many fixes for sorted controls, in particular implemented wxCB_SORT support
   in wxGTK combobox


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47730 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-07-26 13:54:14 +00:00
parent 7f73c398d5
commit a236aa2058
98 changed files with 2825 additions and 2678 deletions

View File

@@ -256,93 +256,17 @@ void wxListBox::DoSetFirstItem(int N)
SendMessage(GetHwnd(), LB_SETTOPINDEX, (WPARAM)N, (LPARAM)0);
}
void wxListBox::Delete(unsigned int n)
void wxListBox::DoDeleteOneItem(unsigned int n)
{
wxCHECK_RET( IsValid(n),
wxT("invalid index in wxListBox::Delete") );
// for owner drawn objects, the data is used for storing wxOwnerDrawn
// pointers and we shouldn't touch it
#if !wxUSE_OWNER_DRAWN
if ( !(m_windowStyle & wxLB_OWNERDRAW) )
#endif // !wxUSE_OWNER_DRAWN
if ( HasClientObjectData() )
{
delete GetClientObject(n);
}
SendMessage(GetHwnd(), LB_DELETESTRING, n, 0);
m_noItems--;
SetHorizontalExtent(wxEmptyString);
}
int wxListBox::DoAppend(const wxString& item)
{
int index = ListBox_AddString(GetHwnd(), item.wx_str());
m_noItems++;
#if wxUSE_OWNER_DRAWN
if ( m_windowStyle & wxLB_OWNERDRAW ) {
wxOwnerDrawn *pNewItem = CreateLboxItem(index); // dummy argument
pNewItem->SetName(item);
m_aItems.Insert(pNewItem, index);
ListBox_SetItemData(GetHwnd(), index, pNewItem);
pNewItem->SetFont(GetFont());
}
#endif // wxUSE_OWNER_DRAWN
SetHorizontalExtent(item);
return index;
}
void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData)
{
// avoid flicker - but don't need to do this for a hidden listbox
bool hideAndShow = IsShown();
if ( hideAndShow )
{
ShowWindow(GetHwnd(), SW_HIDE);
}
ListBox_ResetContent(GetHwnd());
m_noItems = choices.GetCount();
unsigned int i;
for (i = 0; i < m_noItems; i++)
{
ListBox_AddString(GetHwnd(), choices[i].wx_str());
if ( clientData )
{
SetClientData(i, clientData[i]);
}
}
#if wxUSE_OWNER_DRAWN
if ( m_windowStyle & wxLB_OWNERDRAW ) {
// first delete old items
WX_CLEAR_ARRAY(m_aItems);
// then create new ones
for ( unsigned int ui = 0; ui < m_noItems; ui++ ) {
wxOwnerDrawn *pNewItem = CreateLboxItem(ui);
pNewItem->SetName(choices[ui]);
m_aItems.Add(pNewItem);
ListBox_SetItemData(GetHwnd(), ui, pNewItem);
}
}
#endif // wxUSE_OWNER_DRAWN
SetHorizontalExtent();
if ( hideAndShow )
{
// show the listbox back if we hid it
ShowWindow(GetHwnd(), SW_SHOW);
}
}
int wxListBox::FindString(const wxString& s, bool bCase) const
{
// back to base class search for not native search type
@@ -356,7 +280,7 @@ int wxListBox::FindString(const wxString& s, bool bCase) const
return pos;
}
void wxListBox::Clear()
void wxListBox::DoClear()
{
Free();
@@ -373,15 +297,7 @@ void wxListBox::Free()
{
WX_CLEAR_ARRAY(m_aItems);
}
else
#endif // wxUSE_OWNER_DRAWN
if ( HasClientObjectData() )
{
for ( unsigned int n = 0; n < m_noItems; n++ )
{
delete GetClientObject(n);
}
}
}
void wxListBox::DoSetSelection(int N, bool select)
@@ -407,11 +323,6 @@ bool wxListBox::IsSelected(int N) const
return SendMessage(GetHwnd(), LB_GETSEL, N, 0) == 0 ? false : true;
}
wxClientData* wxListBox::DoGetItemClientObject(unsigned int n) const
{
return (wxClientData *)DoGetItemClientData(n);
}
void *wxListBox::DoGetItemClientData(unsigned int n) const
{
wxCHECK_MSG( IsValid(n), NULL,
@@ -420,11 +331,6 @@ void *wxListBox::DoGetItemClientData(unsigned int n) const
return (void *)SendMessage(GetHwnd(), LB_GETITEMDATA, n, 0);
}
void wxListBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData)
{
DoSetItemClientData(n, clientData);
}
void wxListBox::DoSetItemClientData(unsigned int n, void *clientData)
{
wxCHECK_RET( IsValid(n),
@@ -511,35 +417,53 @@ wxString wxListBox::GetString(unsigned int n) const
return result;
}
void
wxListBox::DoInsertItems(const wxArrayString& items, unsigned int pos)
int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items,
unsigned int pos,
void **clientData,
wxClientDataType type)
{
wxCHECK_RET( IsValidInsert(pos),
wxT("invalid index in wxListBox::InsertItems") );
MSWAllocStorage(items, LB_INITSTORAGE);
unsigned int nItems = items.GetCount();
for ( unsigned int i = 0; i < nItems; i++ )
const bool append = pos == GetCount();
// we must use CB_ADDSTRING when appending as only it works correctly for
// the sorted controls
const unsigned msg = append ? LB_ADDSTRING : LB_INSERTSTRING;
if ( append )
pos = 0;
int n = wxNOT_FOUND;
const unsigned int numItems = items.GetCount();
for ( unsigned int i = 0; i < numItems; i++ )
{
int idx = ListBox_InsertString(GetHwnd(), i + pos, items[i].wx_str());
n = MSWInsertOrAppendItem(pos, items[i], msg);
if ( n == wxNOT_FOUND )
return n;
if ( !append )
pos++;
++m_noItems;
#if wxUSE_OWNER_DRAWN
if ( m_windowStyle & wxLB_OWNERDRAW )
if ( HasFlag(wxLB_OWNERDRAW) )
{
wxOwnerDrawn *pNewItem = CreateLboxItem(idx);
wxOwnerDrawn *pNewItem = CreateLboxItem(n);
pNewItem->SetName(items[i]);
pNewItem->SetFont(GetFont());
m_aItems.Insert(pNewItem, idx);
m_aItems.Insert(pNewItem, n);
ListBox_SetItemData(GetHwnd(), idx, pNewItem);
ListBox_SetItemData(GetHwnd(), n, pNewItem);
}
#else
wxUnusedVar(idx);
#endif // wxUSE_OWNER_DRAWN
AssignNewItemClientData(n, clientData, i, type);
}
m_noItems += nItems;
SetHorizontalExtent();
return n;
}
int wxListBox::DoListHitTest(const wxPoint& point) const