+int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
+ unsigned int column, bool ascending )
+{
+ // sort branches before leaves
+ bool item1_is_container = IsContainer(item1);
+ bool item2_is_container = IsContainer(item2);
+
+ if (item1_is_container && !item2_is_container)
+ return 1;
+ if (item2_is_container && !item1_is_container)
+ return -1;
+
+ wxVariant value1,value2;
+ GetValue( value1, item1, column );
+ GetValue( value2, item2, column );
+
+ if (!ascending)
+ {
+ wxVariant temp = value1;
+ value1 = value2;
+ value2 = temp;
+ }
+
+ if (value1.GetType() == wxT("string"))
+ {
+ wxString str1 = value1.GetString();
+ wxString str2 = value2.GetString();
+ int res = str1.Cmp( str2 );
+ if (res) return res;
+ } else
+ if (value1.GetType() == wxT("long"))
+ {
+ long l1 = value1.GetLong();
+ long l2 = value2.GetLong();
+ long res = l1-l2;
+ if (res) return res;
+ } else
+ if (value1.GetType() == wxT("double"))
+ {
+ double d1 = value1.GetDouble();
+ double d2 = value2.GetDouble();
+ if (d1 < d2) return 1;
+ if (d1 > d2) return -1;
+ } else
+ if (value1.GetType() == wxT("datetime"))
+ {
+ wxDateTime dt1 = value1.GetDateTime();
+ wxDateTime dt2 = value2.GetDateTime();
+ if (dt1.IsEarlierThan(dt2)) return 1;
+ if (dt2.IsEarlierThan(dt1)) return -11;
+ }
+
+ // items must be different
+ unsigned long litem1 = (unsigned long) item1.GetID();
+ unsigned long litem2 = (unsigned long) item2.GetID();
+
+ if (!ascending)
+ return litem2-litem2;
+
+ return litem1-litem2;
+}
+
+// ---------------------------------------------------------
+// wxDataViewIndexListModel
+// ---------------------------------------------------------
+
+wxDataViewIndexListModel::wxDataViewIndexListModel( unsigned int initial_size )
+{
+ // build initial index
+ unsigned int i;
+ for (i = 1; i < initial_size+1; i++)
+ m_hash.Add( (void*) i );
+ m_lastIndex = initial_size + 1;
+}
+
+wxDataViewIndexListModel::~wxDataViewIndexListModel()
+{
+}
+
+void wxDataViewIndexListModel::RowPrepended()
+{
+ unsigned int id = m_lastIndex++;
+ m_hash.Insert( (void*) id, 0 );
+ wxDataViewItem item( (void*) id );
+ ItemAdded( wxDataViewItem(0), item );
+}
+
+void wxDataViewIndexListModel::RowInserted( unsigned int before )
+{
+ unsigned int id = m_lastIndex++;
+ m_hash.Insert( (void*) id, before );
+ wxDataViewItem item( (void*) id );
+ ItemAdded( wxDataViewItem(0), item );
+}
+
+void wxDataViewIndexListModel::RowAppended()
+{
+ unsigned int id = m_lastIndex++;
+ m_hash.Add( (void*) id );
+ wxDataViewItem item( (void*) id );
+ ItemAdded( wxDataViewItem(0), item );
+}
+
+void wxDataViewIndexListModel::RowDeleted( unsigned int row )
+{
+ wxDataViewItem item( m_hash[row] );
+ wxDataViewModel::ItemDeleted( wxDataViewItem(0), item );
+ m_hash.RemoveAt( row );
+}
+
+void wxDataViewIndexListModel::RowChanged( unsigned int row )
+{
+ wxDataViewModel::ItemChanged( GetItem(row) );
+}
+
+void wxDataViewIndexListModel::RowValueChanged( unsigned int row, unsigned int col )
+{
+ wxDataViewModel::ValueChanged( GetItem(row), col );
+}
+
+unsigned int wxDataViewIndexListModel::GetRow( const wxDataViewItem &item ) const
+{
+ // assert for not found
+ return (unsigned int) m_hash.Index( item.GetID() );
+}
+
+wxDataViewItem wxDataViewIndexListModel::GetItem( unsigned int row ) const
+{
+ return wxDataViewItem( m_hash[row] );
+}
+
+int wxDataViewIndexListModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
+ unsigned int column, bool ascending )
+{
+ if (ascending)
+ return GetRow(item1) - GetRow(item2);
+
+ return GetRow(item2) - GetRow(item1);
+}
+
+void wxDataViewIndexListModel::GetValue( wxVariant &variant,
+ const wxDataViewItem &item, unsigned int col ) const
+{
+ GetValue( variant, GetRow(item), col );
+}
+
+bool wxDataViewIndexListModel::SetValue( const wxVariant &variant,
+ const wxDataViewItem &item, unsigned int col )
+{
+ return SetValue( variant, GetRow(item), col );
+}
+
+wxDataViewItem wxDataViewIndexListModel::GetParent( const wxDataViewItem & WXUNUSED(item) ) const
+{
+ return wxDataViewItem(0);
+}
+
+bool wxDataViewIndexListModel::IsContainer( const wxDataViewItem &item ) const
+{
+ // only the invisible root item has children
+ if (!item.IsOk())
+ return true;
+
+ return false;
+}
+
+wxDataViewItem wxDataViewIndexListModel::GetFirstChild( const wxDataViewItem &parent ) const
+{
+ if (!parent.IsOk())
+ {
+ if (m_hash.GetCount() == 0)
+ return wxDataViewItem(0);
+
+ return wxDataViewItem( m_hash[0]);
+ }
+
+ return wxDataViewItem(0);
+}
+
+wxDataViewItem wxDataViewIndexListModel::GetNextSibling( const wxDataViewItem &item ) const
+{
+ if (!item.IsOk())
+ return wxDataViewItem(0);
+
+ int pos = m_hash.Index( item.GetID() );
+ if ((pos == wxNOT_FOUND) || (pos == (int) (m_hash.GetCount()-1)))
+ return wxDataViewItem(0);
+
+ return wxDataViewItem( m_hash[pos+1] );
+}
+