| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Program:     wxWidgets Widgets Sample
 
- // Name:        itemcontainer.cpp
 
- // Purpose:     Part of the widgets sample showing wxComboBox
 
- // Created:     20.07.07
 
- // Licence:     wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- // ============================================================================
 
- // declarations
 
- // ============================================================================
 
- // ----------------------------------------------------------------------------
 
- // headers
 
- // ----------------------------------------------------------------------------
 
- // for compilers that support precompilation, includes "wx/wx.h".
 
- #include "wx/wxprec.h"
 
- #ifdef __BORLANDC__
 
-     #pragma hdrstop
 
- #endif
 
- // for all others, include the necessary headers
 
- #ifndef WX_PRECOMP
 
-     #include "wx/log.h"
 
-     #include "wx/event.h"
 
- #endif
 
- #include "wx/ctrlsub.h"
 
- #include "itemcontainer.h"
 
- // Help track client data objects in wxItemContainer instances.
 
- class TrackedClientData : public wxClientData
 
- {
 
- public:
 
-     TrackedClientData(ItemContainerWidgetsPage* tracker, int value)
 
-         : m_tracker(tracker),
 
-           m_value(value)
 
-     {
 
-         m_tracker->StartTrackingData();
 
-     }
 
-     virtual ~TrackedClientData()
 
-     {
 
-         m_tracker->StopTrackingData();
 
-     }
 
-     int GetValue() const
 
-     {
 
-         return m_value;
 
-     }
 
- private:
 
-     ItemContainerWidgetsPage *m_tracker;
 
-     int m_value;
 
-     wxDECLARE_NO_COPY_CLASS(TrackedClientData);
 
- };
 
- // ============================================================================
 
- // implementation
 
- // ============================================================================
 
- ItemContainerWidgetsPage::ItemContainerWidgetsPage(WidgetsBookCtrl *book,
 
-                                                    wxImageList *image_list,
 
-                                                    const char *const icon[])
 
- : WidgetsPage(book, image_list, icon), m_trackedDataObjects(0)
 
- {
 
-     m_items.Add(wxT("This"));
 
-     m_items.Add(wxT("is"));
 
-     m_items.Add(wxT("a"));
 
-     m_items.Add(wxT("List"));
 
-     m_items.Add(wxT("of"));
 
-     m_items.Add(wxT("strings"));
 
-     m_itemsSorted = m_items;
 
- }
 
- ItemContainerWidgetsPage::~ItemContainerWidgetsPage()
 
- {
 
- }
 
- wxClientData* ItemContainerWidgetsPage::CreateClientData(int value)
 
- {
 
-     return new TrackedClientData(this, value);
 
- }
 
- void ItemContainerWidgetsPage::StartTrackingData()
 
- {
 
-     ++m_trackedDataObjects;
 
- }
 
- void ItemContainerWidgetsPage::StopTrackingData()
 
- {
 
-     --m_trackedDataObjects;
 
- }
 
- bool ItemContainerWidgetsPage::VerifyAllClientDataDestroyed()
 
- {
 
-     if ( m_trackedDataObjects )
 
-     {
 
-         wxString message = wxT("Bug in managing wxClientData: ");
 
-         if ( m_trackedDataObjects > 0 )
 
-             message << m_trackedDataObjects << wxT(" lost objects");
 
-         else
 
-             message << (-m_trackedDataObjects) << wxT(" extra deletes");
 
-         wxFAIL_MSG(message);
 
-         return false;
 
-     }
 
-     return true;
 
- }
 
- void ItemContainerWidgetsPage::StartTest(const wxString& label)
 
- {
 
-     m_container->Clear();
 
-     wxLogMessage(wxT("Test - %s:"), label.c_str());
 
- }
 
- void ItemContainerWidgetsPage::EndTest(const wxArrayString& items)
 
- {
 
-     const unsigned count = m_container->GetCount();
 
-     bool ok = count == items.GetCount();
 
-     if ( !ok )
 
-     {
 
-         wxFAIL_MSG(wxT("Item count does not match."));
 
-     }
 
-     else
 
-     {
 
-         for ( unsigned i = 0; i < count; ++i )
 
-         {
 
-             wxString str = m_container->GetString(i);
 
-             if ( str != items[i] )
 
-             {
 
-                 wxFAIL_MSG(wxString::Format(
 
-                             wxT("Wrong string \"%s\" at position %d (expected \"%s\")"),
 
-                            str.c_str(), i, items[i].c_str()));
 
-                 ok = false;
 
-                 break;
 
-             }
 
-             if ( m_container->HasClientUntypedData() )
 
-             {
 
-                 void *data = m_container->GetClientData(i);
 
-                 if ( data && !VerifyClientData((wxUIntPtr)data, str) )
 
-                 {
 
-                     ok = false;
 
-                     break;
 
-                 }
 
-             }
 
-             else if ( m_container->HasClientObjectData() )
 
-             {
 
-                 TrackedClientData* obj = (TrackedClientData*)m_container->GetClientObject(i);
 
-                 if ( obj && !VerifyClientData(obj->GetValue(), str) )
 
-                 {
 
-                     ok = false;
 
-                     break;
 
-                 }
 
-             }
 
-         }
 
-         if ( !ok )
 
-         {
 
-             wxLogMessage(DumpContainerData(items));
 
-         }
 
-     }
 
-     m_container->Clear();
 
-     ok &= VerifyAllClientDataDestroyed();
 
-     wxLogMessage(wxT("...%s"), ok ? wxT("passed") : wxT("failed"));
 
- }
 
- wxString
 
- ItemContainerWidgetsPage::DumpContainerData(const wxArrayString& expected) const
 
- {
 
-     wxString str;
 
-     str << wxT("Current content:\n");
 
-     unsigned i;
 
-     for ( i = 0; i < m_container->GetCount(); ++i )
 
-     {
 
-         str << wxT(" - ") << m_container->GetString(i) << wxT(" [");
 
-         if ( m_container->HasClientObjectData() )
 
-         {
 
-             TrackedClientData *
 
-                 obj = (TrackedClientData*)m_container->GetClientObject(i);
 
-             if ( obj )
 
-                 str << obj->GetValue();
 
-         }
 
-         else if ( m_container->HasClientUntypedData() )
 
-         {
 
-             void *data = m_container->GetClientData(i);
 
-             if ( data )
 
-                 str << (wxUIntPtr)data;
 
-         }
 
-         str << wxT("]\n");
 
-     }
 
-     str << wxT("Expected content:\n");
 
-     for ( i = 0; i < expected.GetCount(); ++i )
 
-     {
 
-         const wxString& item = expected[i];
 
-         str << wxT(" - ") << item << wxT("[");
 
-         for( unsigned j = 0; j < m_items.GetCount(); ++j )
 
-         {
 
-             if ( m_items[j] == item )
 
-                 str << j;
 
-         }
 
-         str << wxT("]\n");
 
-     }
 
-     return str;
 
- }
 
- bool ItemContainerWidgetsPage::VerifyClientData(wxUIntPtr i, const wxString& str)
 
- {
 
-     if ( i > m_items.GetCount() || m_items[i] != str )
 
-     {
 
-         wxLogMessage(wxT("Client data for '%s' does not match."), str.c_str());
 
-         return false;
 
-     }
 
-     return true;
 
- }
 
- /* static */
 
- wxArrayString
 
- ItemContainerWidgetsPage::MakeArray(const wxSortedArrayString& sorted)
 
- {
 
-     wxArrayString a;
 
-     const size_t count = sorted.size();
 
-     a.reserve(count);
 
-     for ( size_t n = 0; n < count; n++ )
 
-         a.push_back(sorted[n]);
 
-     return a;
 
- }
 
- void ItemContainerWidgetsPage::OnButtonTestItemContainer(wxCommandEvent&)
 
- {
 
-     m_container = GetContainer();
 
-     wxASSERT_MSG(m_container, wxT("Widget must have a test widget"));
 
-     wxLogMessage(wxT("wxItemContainer test for %s, %s:"),
 
-                  GetWidget()->GetClassInfo()->GetClassName(),
 
-                  (m_container->IsSorted() ? "Sorted" : "Unsorted"));
 
-     const wxArrayString
 
-         expected_result = m_container->IsSorted() ? MakeArray(m_itemsSorted)
 
-                                                   : m_items;
 
-     StartTest(wxT("Append one item"));
 
-     wxString item = m_items[0];
 
-     m_container->Append(item);
 
-     EndTest(wxArrayString(1, &item));
 
-     StartTest(wxT("Append some items"));
 
-     m_container->Append(m_items);
 
-     EndTest(expected_result);
 
-     StartTest(wxT("Append some items with data objects"));
 
-     wxClientData **objects = new wxClientData *[m_items.GetCount()];
 
-     unsigned i;
 
-     for ( i = 0; i < m_items.GetCount(); ++i )
 
-         objects[i] = CreateClientData(i);
 
-     m_container->Append(m_items, objects);
 
-     EndTest(expected_result);
 
-     delete[] objects;
 
-     StartTest(wxT("Append some items with data"));
 
-     void **data = new void *[m_items.GetCount()];
 
-     for ( i = 0; i < m_items.GetCount(); ++i )
 
-         data[i] = wxUIntToPtr(i);
 
-     m_container->Append(m_items, data);
 
-     EndTest(expected_result);
 
-     delete[] data;
 
-     StartTest(wxT("Append some items with data, one by one"));
 
-     for ( i = 0; i < m_items.GetCount(); ++i )
 
-         m_container->Append(m_items[i], wxUIntToPtr(i));
 
-     EndTest(expected_result);
 
-     StartTest(wxT("Append some items with data objects, one by one"));
 
-     for ( i = 0; i < m_items.GetCount(); ++i )
 
-         m_container->Append(m_items[i], CreateClientData(i));
 
-     EndTest(expected_result);
 
-     if ( !m_container->IsSorted() )
 
-     {
 
-         StartTest(wxT("Insert in reverse order with data, one by one"));
 
-         for ( unsigned i = m_items.GetCount(); i; --i )
 
-             m_container->Insert(m_items[i - 1], 0, wxUIntToPtr(i - 1));
 
-         EndTest(expected_result);
 
-     }
 
- }
 
 
  |