+#if WXWIN_COMPATIBILITY_2_4
+
+// ----------------------------------------------------------------------------
+// wxVariantDataStringList
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_BASE wxVariantDataStringList: public wxVariantData
+{
+DECLARE_DYNAMIC_CLASS(wxVariantDataStringList)
+public:
+ wxVariantDataStringList() {}
+ wxVariantDataStringList(const wxStringList& list) { m_value = list; }
+
+ wxStringList& GetValue() const { return (wxStringList&) m_value; }
+ void SetValue(const wxStringList& value);
+
+ virtual bool Eq(wxVariantData& data) const;
+#if wxUSE_STD_IOSTREAM
+ virtual bool Write(wxSTD ostream& str) const;
+#endif
+ virtual bool Write(wxString& str) const;
+#if wxUSE_STD_IOSTREAM
+ virtual bool Read(wxSTD istream& str);
+#endif
+ virtual bool Read(wxString& str);
+ virtual wxString GetType() const { return wxT("stringlist"); };
+
+protected:
+ wxStringList m_value;
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxVariantDataStringList, wxVariantData)
+
+void wxVariantDataStringList::SetValue(const wxStringList& value)
+{
+ m_value = value;
+}
+
+bool wxVariantDataStringList::Eq(wxVariantData& data) const
+{
+ wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Eq: argument mismatch") );
+
+ wxVariantDataStringList& listData = (wxVariantDataStringList&) data;
+ wxStringList::compatibility_iterator node1 = m_value.GetFirst();
+ wxStringList::compatibility_iterator node2 = listData.GetValue().GetFirst();
+ while (node1 && node2)
+ {
+ wxString str1 ( node1->GetData() );
+ wxString str2 ( node2->GetData() );
+ if (str1 != str2)
+ return false;
+ node1 = node1->GetNext();
+ node2 = node2->GetNext();
+ }
+ if (node1 || node2) return false;
+ return true;
+}
+
+#if wxUSE_STD_IOSTREAM
+bool wxVariantDataStringList::Write(wxSTD ostream& str) const
+{
+ wxString s;
+ Write(s);
+ str << (const char*) s.mb_str();
+ return true;
+}
+#endif
+
+bool wxVariantDataStringList::Write(wxString& str) const
+{
+ str.Empty();
+ wxStringList::compatibility_iterator node = m_value.GetFirst();
+ while (node)
+ {
+ const wxChar* s = node->GetData();
+ if (node != m_value.GetFirst())
+ str += wxT(" ");
+ str += s;
+ node = node->GetNext();
+ }
+
+ return true;
+}
+
+#if wxUSE_STD_IOSTREAM
+bool wxVariantDataStringList::Read(wxSTD istream& WXUNUSED(str))
+{
+ wxFAIL_MSG(wxT("Unimplemented"));
+ // TODO
+ return false;
+}
+#endif
+
+bool wxVariantDataStringList::Read(wxString& WXUNUSED(str))
+{
+ wxFAIL_MSG(wxT("Unimplemented"));
+ // TODO
+ return false;
+}
+
+#endif //2.4 compat
+
+#if WXWIN_COMPATIBILITY_2_4
+
+wxVariant::wxVariant(const wxStringList& val, const wxString& name)
+{
+ m_data = new wxVariantDataStringList(val);
+ m_name = name;
+}
+
+bool wxVariant::operator== (const wxStringList& value) const
+{
+ wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") );
+
+ wxVariantDataStringList other(value);
+ return (GetData()->Eq(other));
+}
+
+bool wxVariant::operator!= (const wxStringList& value) const
+{
+ wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") );
+
+ wxVariantDataStringList other(value);
+ return !(GetData()->Eq(other));
+}
+
+void wxVariant::operator= (const wxStringList& value)
+{
+ if (GetType() == wxT("stringlist") &&
+ m_data->GetRefCount() == 1)
+ {
+ ((wxVariantDataStringList*)GetData())->SetValue(value);
+ }
+ else
+ {
+ UnRef();
+ m_data = new wxVariantDataStringList(value);
+ }
+}
+
+// wxVariant
+
+wxStringList& wxVariant::GetStringList() const
+{
+ wxASSERT( (GetType() == wxT("stringlist")) );
+
+ return (wxStringList&) ((wxVariantDataStringList*) m_data)->GetValue();
+}
+
+#endif
+
+// Treat a list variant as an array
+wxVariant wxVariant::operator[] (size_t idx) const
+{
+#if WXWIN_COMPATIBILITY_2_4
+ wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for array operator") );
+#else
+ wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for array operator") );
+#endif
+
+ if (GetType() == wxT("list"))
+ {
+ wxVariantDataList* data = (wxVariantDataList*) m_data;
+ wxASSERT_MSG( (idx < data->GetValue().GetCount()), wxT("Invalid index for array") );
+ return * (wxVariant*) (data->GetValue().Item(idx)->GetData());
+ }
+#if WXWIN_COMPATIBILITY_2_4
+ else if (GetType() == wxT("stringlist"))
+ {
+ wxVariantDataStringList* data = (wxVariantDataStringList*) m_data;
+ wxASSERT_MSG( (idx < data->GetValue().GetCount()), wxT("Invalid index for array") );
+
+ wxString str( (const wxChar*) (data->GetValue().Item(idx)->GetData()) );
+ wxVariant variant( str );
+ return variant;
+ }
+#endif
+ return wxNullVariant;
+}
+
+wxVariant& wxVariant::operator[] (size_t idx)
+{
+ // We can't return a reference to a variant for a string list, since the string
+ // is actually stored as a char*, not a variant.
+
+ wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for array operator") );
+
+ wxVariantDataList* data = (wxVariantDataList*) m_data;
+ wxASSERT_MSG( (idx < data->GetValue().GetCount()), wxT("Invalid index for array") );
+
+ return * (wxVariant*) (data->GetValue().Item(idx)->GetData());
+}
+
+// Return the number of elements in a list
+size_t wxVariant::GetCount() const
+{
+#if WXWIN_COMPATIBILITY_2_4
+ wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for GetCount()") );
+#else
+ wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for GetCount()") );
+#endif
+
+ if (GetType() == wxT("list"))
+ {
+ wxVariantDataList* data = (wxVariantDataList*) m_data;
+ return data->GetValue().GetCount();
+ }
+#if WXWIN_COMPATIBILITY_2_4
+ else if (GetType() == wxT("stringlist"))
+ {
+ wxVariantDataStringList* data = (wxVariantDataStringList*) m_data;
+ return data->GetValue().GetCount();
+ }
+#endif
+ return 0;
+}
+
+// ----------------------------------------------------------------------------