]>
git.saurik.com Git - wxWidgets.git/blob - samples/widgets/itemcontainer.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Program: wxWidgets Widgets Sample
3 // Name: itemcontainer.cpp
4 // Purpose: Part of the widgets sample showing wxComboBox
7 // License: wxWindows license
8 /////////////////////////////////////////////////////////////////////////////
10 // ============================================================================
12 // ============================================================================
14 // ----------------------------------------------------------------------------
16 // ----------------------------------------------------------------------------
18 // for compilers that support precompilation, includes "wx/wx.h".
19 #include "wx/wxprec.h"
25 // for all others, include the necessary headers
32 #include "wx/ctrlsub.h"
33 #include "itemcontainer.h"
36 // Help track client data objects in wxItemContainer instances.
37 class TrackedClientData
: public wxClientData
41 TrackedClientData(ItemContainerWidgetsPage
* tracker
, int value
)
45 m_tracker
->StartTrackingData();
48 virtual ~TrackedClientData()
50 m_tracker
->StopTrackingData();
59 ItemContainerWidgetsPage
*m_tracker
;
62 DECLARE_NO_COPY_CLASS(TrackedClientData
)
65 // ============================================================================
67 // ============================================================================
69 ItemContainerWidgetsPage::ItemContainerWidgetsPage(WidgetsBookCtrl
*book
,
70 wxImageList
*image_list
,
71 const char *const icon
[])
72 : WidgetsPage(book
, image_list
, icon
), m_trackedDataObjects(0)
74 m_items
.Add(_T("This"));
75 m_items
.Add(_T("is"));
77 m_items
.Add(_T("List"));
78 m_items
.Add(_T("of"));
79 m_items
.Add(_T("strings"));
80 m_itemsSorted
= m_items
;
83 ItemContainerWidgetsPage::~ItemContainerWidgetsPage()
87 wxClientData
* ItemContainerWidgetsPage::CreateClientData(int value
)
89 return new TrackedClientData(this, value
);
92 void ItemContainerWidgetsPage::StartTrackingData()
94 ++m_trackedDataObjects
;
97 void ItemContainerWidgetsPage::StopTrackingData()
99 --m_trackedDataObjects
;
102 bool ItemContainerWidgetsPage::VerifyAllClientDataDestroyed()
104 if ( m_trackedDataObjects
)
106 wxString message
= _T("Bug in managing wxClientData: ");
107 if ( m_trackedDataObjects
> 0 )
108 message
<< m_trackedDataObjects
<< _T(" lost objects");
110 message
<< (-m_trackedDataObjects
) << _T(" extra deletes");
118 void ItemContainerWidgetsPage::StartTest(const wxString
& label
)
120 m_container
->Clear();
121 wxLogMessage(_T("Test - %s:"), label
.c_str());
124 void ItemContainerWidgetsPage::EndTest(const wxMaybeSortedArrayString
& items
)
126 const unsigned count
= m_container
->GetCount();
128 bool ok
= count
== items
.GetCount();
131 wxFAIL_MSG(_T("Item count does not match."));
135 for ( unsigned i
= 0; i
< count
; ++i
)
137 wxString str
= m_container
->GetString(i
);
138 if ( str
!= items
[i
] )
140 wxFAIL_MSG(wxString::Format(
141 _T("Wrong string \"%s\" at position %d (expected \"%s\")"),
142 str
.c_str(), i
, items
[i
].c_str()));
147 if ( m_container
->HasClientUntypedData() )
149 void *data
= m_container
->GetClientData(i
);
150 if ( data
&& !VerifyClientData((wxUIntPtr
)data
, str
) )
156 else if ( m_container
->HasClientObjectData() )
158 TrackedClientData
* obj
= (TrackedClientData
*)m_container
->GetClientObject(i
);
159 if ( obj
&& !VerifyClientData(obj
->GetValue(), str
) )
169 wxLogMessage(DumpContainerData(items
));
173 m_container
->Clear();
174 ok
&= VerifyAllClientDataDestroyed();
176 wxLogMessage(_T("...%s"), ok
? _T("passed") : _T("failed"));
180 ItemContainerWidgetsPage::DumpContainerData(const wxMaybeSortedArrayString
& expected
) const
183 str
<< _T("Current content:\n");
186 for ( i
= 0; i
< m_container
->GetCount(); ++i
)
188 str
<< _T(" - ") << m_container
->GetString(i
) << _T(" [");
189 if ( m_container
->HasClientObjectData() )
192 obj
= (TrackedClientData
*)m_container
->GetClientObject(i
);
194 str
<< obj
->GetValue();
196 else if ( m_container
->HasClientUntypedData() )
198 void *data
= m_container
->GetClientData(i
);
200 str
<< (wxUIntPtr
)data
;
205 str
<< _T("Expected content:\n");
206 for ( i
= 0; i
< expected
.GetCount(); ++i
)
208 const wxString
& item
= expected
[i
];
209 str
<< _T(" - ") << item
<< _T("[");
210 for( unsigned j
= 0; j
< m_items
.GetCount(); ++j
)
212 if ( m_items
[j
] == item
)
221 bool ItemContainerWidgetsPage::VerifyClientData(wxUIntPtr i
, const wxString
& str
)
223 if ( i
> m_items
.GetCount() || m_items
[i
] != str
)
225 wxLogMessage(_T("Client data for '%s' does not match."), str
.c_str());
232 void ItemContainerWidgetsPage::OnButtonTestItemContainer(wxCommandEvent
&)
234 m_container
= GetContainer();
235 wxASSERT_MSG(m_container
, _T("Widget must have a test widget"));
237 wxLogMessage(_T("wxItemContainer test for %s, %s:"),
238 GetWidget()->GetClassInfo()->GetClassName(),
239 (m_container
->IsSorted() ? "Sorted" : "Unsorted"));
241 const wxMaybeSortedArrayString
&
242 expected_result
= m_container
->IsSorted() ? m_itemsSorted
245 StartTest(_T("Append one item"));
246 wxString item
= m_items
[0];
247 m_container
->Append(item
);
248 EndTest(wxArrayString(1, &item
));
250 StartTest(_T("Append some items"));
251 m_container
->Append(m_items
);
252 EndTest(expected_result
);
254 StartTest(_T("Append some items with data objects"));
255 wxClientData
**objects
= new wxClientData
*[m_items
.GetCount()];
257 for ( i
= 0; i
< m_items
.GetCount(); ++i
)
258 objects
[i
] = CreateClientData(i
);
259 m_container
->Append(m_items
, objects
);
260 EndTest(expected_result
);
263 StartTest(_T("Append some items with data"));
264 void **data
= new void *[m_items
.GetCount()];
265 for ( i
= 0; i
< m_items
.GetCount(); ++i
)
267 m_container
->Append(m_items
, data
);
268 EndTest(expected_result
);
271 StartTest(_T("Append some items with data, one by one"));
272 for ( i
= 0; i
< m_items
.GetCount(); ++i
)
273 m_container
->Append(m_items
[i
], (void*)i
);
274 EndTest(expected_result
);
276 StartTest(_T("Append some items with data objects, one by one"));
277 for ( i
= 0; i
< m_items
.GetCount(); ++i
)
278 m_container
->Append(m_items
[i
], CreateClientData(i
));
279 EndTest(expected_result
);
281 if ( !m_container
->IsSorted() )
283 StartTest(_T("Insert in reverse order with data, one by one"));
284 for ( unsigned i
= m_items
.GetCount(); i
; --i
)
285 m_container
->Insert(m_items
[i
- 1], 0, (void*)(i
- 1));
286 EndTest(expected_result
);