+ if (order)
+ *order = tree_model->order;
+
+ return TRUE;
+}
+
+void wxgtk_tree_model_set_sort_column_id (GtkTreeSortable *sortable,
+ gint sort_column_id,
+ GtkSortType order)
+{
+ GtkWxTreeModel *tree_model = (GtkWxTreeModel *) sortable;
+
+ g_return_if_fail (GTK_IS_WX_TREE_MODEL (sortable) );
+
+ if ((tree_model->sort_column_id == sort_column_id) &&
+ (tree_model->order == order))
+ return;
+
+ tree_model->sort_column_id = sort_column_id;
+ tree_model->order = order;
+
+ gtk_tree_sortable_sort_column_changed (sortable);
+
+ wxPrintf( "wxgtk_tree_model_set_column_id, sort_column_id = %d, order = %d\n", sort_column_id, (int)order );
+ // sort
+}
+
+void wxgtk_tree_model_set_sort_func (GtkTreeSortable *sortable,
+ gint sort_column_id,
+ GtkTreeIterCompareFunc func,
+ gpointer data,
+ GtkDestroyNotify destroy)
+{
+ g_return_if_fail (GTK_IS_WX_TREE_MODEL (sortable) );
+ g_return_if_fail (func != NULL);
+
+ wxPrintf( "wxgtk_tree_model_set_sort_func, sort_column_id = %d\n", sort_column_id );
+ // sort
+}
+
+void wxgtk_tree_model_set_default_sort_func (GtkTreeSortable *sortable,
+ GtkTreeIterCompareFunc func,
+ gpointer data,
+ GtkDestroyNotify destroy)
+{
+ g_return_if_fail (GTK_IS_WX_TREE_MODEL (sortable) );
+ g_return_if_fail (func != NULL);
+
+ wxPrintf( "wxgtk_tree_model_set_default_sort_func\n" );
+}
+
+gboolean wxgtk_tree_model_has_default_sort_func (GtkTreeSortable *sortable)
+{
+ return FALSE;
+}
+
+
+//-----------------------------------------------------------------------------
+// wxGtkTreeModel
+//-----------------------------------------------------------------------------
+
+wxGtkTreeModel::wxGtkTreeModel( wxDataViewModel *wx_model, GtkWxTreeModel *owner )
+{
+ m_wx_model = wx_model;
+ m_owner = owner;
+ m_root = NULL;
+ InitTree();
+}
+
+wxGtkTreeModel::~wxGtkTreeModel()
+{
+}
+
+void wxGtkTreeModel::BuildBranch( wxGtkTreeModelNode *node )
+{
+ if (node->GetChildCount() == 0)
+ {
+ wxDataViewItem child = m_wx_model->GetFirstChild( node->GetItem() );
+ while (child.IsOk())
+ {
+ // wxPrintf( "AddItem %d\n", (int) child.GetID() );
+ node->Append( new wxGtkTreeModelNode( node, child ) );
+ child = m_wx_model->GetNextSibling( child );
+ }
+ }
+}
+
+bool wxGtkTreeModel::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item )
+{
+ wxGtkTreeModelNode *parent_node = FindNode( parent );
+ parent_node->Append( new wxGtkTreeModelNode( parent_node, item ) );
+ return true;
+}
+
+bool wxGtkTreeModel::ItemDeleted( const wxDataViewItem &item )
+{
+ wxGtkTreeModelNode *node = FindNode( item );
+ wxGtkTreeModelNode *parent = node->GetParent();
+ parent->GetChildren().Remove( node );
+ delete node;
+
+ return true;
+}
+
+gboolean wxGtkTreeModel::get_iter( GtkTreeIter *iter, GtkTreePath *path )
+{
+ int depth = gtk_tree_path_get_depth( path );
+
+ wxGtkTreeModelNode *node = m_root;
+
+ int i;
+ for (i = 0; i < depth; i++)
+ {
+ BuildBranch( node );
+
+ gint pos = gtk_tree_path_get_indices (path)[i];
+ if (pos < 0) return FALSE;
+ if ((size_t)pos >= node->GetChildCount()) return FALSE;