#include "wx/icon.h"
 #include "wx/imaglist.h"
 #include "wx/weakref.h"
+#include "wx/vector.h"
 
 #if !(defined(__WXGTK20__) || defined(__WXMAC__)) || defined(__WXUNIVERSAL__)
 // #if !(defined(__WXMAC__)) || defined(__WXUNIVERSAL__)
     wxDataViewIndexListModel( unsigned int initial_size = 0 );
     ~wxDataViewIndexListModel();
 
-    virtual void GetValue( wxVariant &variant,
+    virtual void GetValueByRow( wxVariant &variant,
                            unsigned int row, unsigned int col ) const = 0;
 
-    virtual bool SetValue( const wxVariant &variant,
+    virtual bool SetValueByRow( const wxVariant &variant,
                            unsigned int row, unsigned int col ) = 0;
 
-    virtual bool GetAttr( unsigned int WXUNUSED(row), unsigned int WXUNUSED(col), wxDataViewItemAttr &WXUNUSED(attr) )
+    virtual bool GetAttrByRow( unsigned int WXUNUSED(row), unsigned int WXUNUSED(col), wxDataViewItemAttr &WXUNUSED(attr) )
         { return false; }
 
     void RowPrepended();
     wxDataViewVirtualListModel( unsigned int initial_size = 0 );
     ~wxDataViewVirtualListModel();
 
-    virtual void GetValue( wxVariant &variant,
+    virtual void GetValueByRow( wxVariant &variant,
                            unsigned int row, unsigned int col ) const = 0;
 
-    virtual bool SetValue( const wxVariant &variant,
+    virtual bool SetValueByRow( const wxVariant &variant,
                            unsigned int row, unsigned int col ) = 0;
 
-    virtual bool GetAttr( unsigned int WXUNUSED(row), unsigned int WXUNUSED(col), wxDataViewItemAttr &WXUNUSED(attr) )
+    virtual bool GetAttrByRow( unsigned int WXUNUSED(row), unsigned int WXUNUSED(col), wxDataViewItemAttr &WXUNUSED(attr) )
         { return false; }
 
     void RowPrepended();
 
 #endif
 
+//-----------------------------------------------------------------------------
+// wxDataViewListStore
+//-----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_ADV wxDataViewListStoreLine
+{
+public:
+    wxDataViewListStoreLine( wxClientData *data = NULL )
+    {
+        m_data = data;
+    }
+    virtual ~wxDataViewListStoreLine()
+    {
+        delete m_data;
+    }
+
+    void SetData( wxClientData *data )
+        { if (m_data) delete m_data; m_data = data; }
+    wxClientData *GetData() const
+        { return m_data; }
+        
+    wxVector<wxVariant>  m_values;
+    
+private:
+    wxClientData    *m_data;
+};
+
+
+class WXDLLIMPEXP_ADV wxDataViewListStore: public wxDataViewIndexListModel
+{
+public:
+    wxDataViewListStore();
+    ~wxDataViewListStore();
+
+    void PrependColumn( const wxString &varianttype );
+    void InsertColumn( unsigned int pos, const wxString &varianttype );
+    void AppendColumn( const wxString &varianttype );
+    
+    void PrependStringColumn()                    
+        { PrependColumn( wxT("string") ); }
+    void InsertStringColumn( unsigned int pos )   
+        { InsertColumn( pos, wxT("string") ); }
+    void AppendStringColumn()                     
+        { AppendColumn( wxT("string") ); }
+    
+    void AppendItem( const wxVector<wxVariant> &values, wxClientData *data = NULL );
+    void PrependItem( const wxVector<wxVariant> &values, wxClientData *data = NULL );
+    void InsertItem(  unsigned int row, const wxVector<wxVariant> &values, wxClientData *data = NULL );
+    void DeleteItem( unsigned pos );
+    void DeleteAllItems();
+
+    void SetStringValue( const wxString &value, unsigned int row, unsigned int col )
+        { SetValueByRow( value, row, col ); }
+    wxString GetStringValue( unsigned int row, unsigned int col )
+        { wxVariant value; GetValueByRow( value, row, col ); return value.GetString(); }
+
+    // override base virtuals
+
+    virtual unsigned int GetColumnCount() const;
+
+    virtual wxString GetColumnType( unsigned int col ) const;
+
+    virtual void GetValueByRow( wxVariant &value,
+                           unsigned int row, unsigned int col ) const;
+
+    virtual bool SetValueByRow( const wxVariant &value,
+                           unsigned int row, unsigned int col );
+
+    
+public:
+    wxVector<wxDataViewListStoreLine*> m_data;
+    wxArrayString                      m_cols;
+};
+
+
 //-----------------------------------------------------------------------------
 // wxDataViewTreeStore
 //-----------------------------------------------------------------------------
 
 
         @see wxDataViewItemAttr.
     */
-    virtual bool GetAttr(unsigned int row, unsigned int col,
+    virtual bool GetAttrByRow(unsigned int row, unsigned int col,
                          wxDataViewItemAttr& attr);
 
     /**
     /**
         Override this to allow getting values from the model.
     */
-    virtual void GetValue(wxVariant& variant, unsigned int row,
+    virtual void GetValueByRow(wxVariant& variant, unsigned int row,
                           unsigned int col) const = 0;
 
     /**
     /**
         Called in order to set a value in the model.
     */
-    virtual bool SetValue(const wxVariant& variant, unsigned int row,
+    virtual bool SetValueByRow(const wxVariant& variant, unsigned int row,
                           unsigned int col) = 0;
 };
 
     wxDataViewTreeStore is a specialised wxDataViewModel for displaying simple
     trees very much like wxTreeCtrl does and it offers a similar API.
 
-    This class actually stores the entire tree (therefore its name) and implements
-    all virtual methods from the base class so it can be used directly without
-    having to derive any class from it.
+    This class actually stores the entire tree and the values (therefore its name) 
+    and implements all virtual methods from the base class so it can be used directly
+    without having to derive any class from it.
     This comes at the price of much reduced flexibility.
 
     @library{wxadv}
 
         return m_array.GetCount();
     }
 
-    virtual void GetValue( wxVariant &variant,
+    virtual void GetValueByRow( wxVariant &variant,
                            unsigned int row, unsigned int col ) const
     {
         if (col==0)
         }
     }
 
-    virtual bool GetAttr( unsigned int row, unsigned int col, wxDataViewItemAttr &attr )
+    virtual bool GetAttrByRow( unsigned int row, unsigned int col, wxDataViewItemAttr &attr )
     {
         if (col != 2)
             return false;
         return true;
     }
 
-    virtual bool SetValue( const wxVariant &variant,
+    virtual bool SetValueByRow( const wxVariant &variant,
                            unsigned int row, unsigned int col )
     {
         if (col == 0)
 
 void wxDataViewIndexListModel::GetValue( wxVariant &variant,
                            const wxDataViewItem &item, unsigned int col ) const
 {
-    GetValue( variant, GetRow(item), col );
+    GetValueByRow( variant, GetRow(item), col );
 }
 
 bool wxDataViewIndexListModel::SetValue( const wxVariant &variant,
                            const wxDataViewItem &item, unsigned int col )
 {
-    return SetValue( variant, GetRow(item), col );
+    return SetValueByRow( variant, GetRow(item), col );
 }
 
 bool wxDataViewIndexListModel::GetAttr( const wxDataViewItem &item, unsigned int col, wxDataViewItemAttr &attr )
 {
-    return GetAttr( GetRow(item), col, attr );
+    return GetAttrByRow( GetRow(item), col, attr );
 }
 
 wxDataViewItem wxDataViewIndexListModel::GetParent( const wxDataViewItem & WXUNUSED(item) ) const
 void wxDataViewVirtualListModel::GetValue( wxVariant &variant,
                            const wxDataViewItem &item, unsigned int col ) const
 {
-    GetValue( variant, GetRow(item), col );
+    GetValueByRow( variant, GetRow(item), col );
 }
 
 bool wxDataViewVirtualListModel::SetValue( const wxVariant &variant,
                            const wxDataViewItem &item, unsigned int col )
 {
-    return SetValue( variant, GetRow(item), col );
+    return SetValueByRow( variant, GetRow(item), col );
 }
 
 bool wxDataViewVirtualListModel::GetAttr( const wxDataViewItem &item, unsigned int col, wxDataViewItemAttr &attr )
 {
-    return GetAttr( GetRow(item), col, attr );
+    return GetAttrByRow( GetRow(item), col, attr );
 }
 
 wxDataViewItem wxDataViewVirtualListModel::GetParent( const wxDataViewItem & WXUNUSED(item) ) const
 
 #endif
 
+//-----------------------------------------------------------------------------
+// wxDataViewListStore
+//-----------------------------------------------------------------------------
+
+wxDataViewListStore::wxDataViewListStore()
+{
+}
+
+wxDataViewListStore::~wxDataViewListStore()
+{
+    wxVector<wxDataViewListStoreLine*>::iterator it;
+    for (it = m_data.begin(); it != m_data.end(); ++it)
+    {
+        wxDataViewListStoreLine* line = *it;
+        delete line;
+    }
+}
+
+void wxDataViewListStore::PrependColumn( const wxString &varianttype )
+{
+    m_cols.Insert( varianttype, 0 );
+}
+
+void wxDataViewListStore::InsertColumn( unsigned int pos, const wxString &varianttype )
+{
+    m_cols.Insert( varianttype, pos );
+}
+
+void wxDataViewListStore::AppendColumn( const wxString &varianttype )
+{
+    m_cols.Add( varianttype );
+}
+
+unsigned int wxDataViewListStore::GetColumnCount() const
+{
+    return m_cols.GetCount();
+}
+
+wxString wxDataViewListStore::GetColumnType( unsigned int pos ) const
+{
+    return m_cols[pos];
+}
+    
+void wxDataViewListStore::AppendItem( const wxVector<wxVariant> &values, wxClientData *data )
+{
+    wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data );
+    line->m_values = values;
+    m_data.push_back( line );
+    
+    RowAppended();
+}
+
+void wxDataViewListStore::PrependItem( const wxVector<wxVariant> &values, wxClientData *data )
+{
+    wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data );
+    line->m_values = values;
+    m_data.insert( m_data.begin(), line );
+    
+    RowPrepended();
+}
+
+void wxDataViewListStore::InsertItem(  unsigned int row, const wxVector<wxVariant> &values, wxClientData *data )
+{
+    wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data );
+    line->m_values = values;
+    m_data.insert( m_data.begin()+row, line );
+    
+    RowInserted( row );
+}
+
+void wxDataViewListStore::DeleteItem( unsigned row )
+{
+    wxVector<wxDataViewListStoreLine*>::iterator it = m_data.begin() + row;
+    m_data.erase( it );
+    
+    RowDeleted( row );
+}
+
+void wxDataViewListStore::DeleteAllItems()
+{
+    wxVector<wxDataViewListStoreLine*>::iterator it;
+    for (it = m_data.begin(); it != m_data.end(); ++it)
+    {
+        wxDataViewListStoreLine* line = *it;
+        delete line;
+    }
+    
+    Reset( 0 );
+}
+
+void wxDataViewListStore::GetValueByRow( wxVariant &value, unsigned int row, unsigned int col ) const
+{
+    wxDataViewListStoreLine *line = m_data[row];
+    value = line->m_values[col];
+}
+
+bool wxDataViewListStore::SetValueByRow( const wxVariant &value, unsigned int row, unsigned int col )
+{
+    wxDataViewListStoreLine *line = m_data[row];
+    line->m_values[col] = value;
+    
+    return true;
+}
+
 //-----------------------------------------------------------------------------
 // wxDataViewTreeStore
 //-----------------------------------------------------------------------------