+wxDataViewModel *g_model = NULL;
+
+class wxGtkTreeModelNode;
+
+extern "C" {
+typedef struct _GtkWxTreeModel GtkWxTreeModel;
+}
+
+//-----------------------------------------------------------------------------
+// wxDataViewCtrlInternal
+//-----------------------------------------------------------------------------
+
+class wxDataViewCtrlInternal
+{
+public:
+ wxDataViewCtrlInternal( wxDataViewCtrl *owner, wxDataViewModel *wx_model, GtkWxTreeModel *owner );
+ ~wxDataViewCtrlInternal();
+
+ gboolean get_iter( GtkTreeIter *iter, GtkTreePath *path );
+ GtkTreePath *get_path( GtkTreeIter *iter);
+ GtkTreePath *get_path_safe( GtkTreeIter *iter);
+ gboolean iter_next( GtkTreeIter *iter );
+ gboolean iter_children( GtkTreeIter *iter, GtkTreeIter *parent);
+ gboolean iter_has_child( GtkTreeIter *iter );
+ gint iter_n_children( GtkTreeIter *iter );
+ gboolean iter_nth_child( GtkTreeIter *iter, GtkTreeIter *parent, gint n );
+ gboolean iter_parent( GtkTreeIter *iter, GtkTreeIter *child );
+
+ wxDataViewModel* GetDataViewModel() { return m_wx_model; }
+ wxDataViewCtrl* GetOwner() { return m_owner; }
+ GtkWxTreeModel* GetGtkModel() { return m_gtk_model; }
+
+ bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item );
+ bool ItemDeleted( const wxDataViewItem &item );
+
+ void Resort();
+
+protected:
+ void InitTree();
+ wxGtkTreeModelNode *FindNode( const wxDataViewItem &item );
+ wxGtkTreeModelNode *FindNode( GtkTreeIter *iter );
+ wxGtkTreeModelNode *FindParentNode( const wxDataViewItem &item );
+ wxGtkTreeModelNode *FindParentNode( GtkTreeIter *iter );
+ void BuildBranch( wxGtkTreeModelNode *branch );
+
+private:
+ wxGtkTreeModelNode *m_root;
+ wxDataViewModel *m_wx_model;
+ GtkWxTreeModel *m_gtk_model;
+ wxDataViewCtrl *m_owner;
+};
+
+
+//-----------------------------------------------------------------------------
+// wxGtkTreeModelNode
+//-----------------------------------------------------------------------------
+
+int LINKAGEMODE wxGtkTreeModelNodeCmp( void *id1, void *id2 );
+
+WX_DEFINE_ARRAY_PTR( wxGtkTreeModelNode*, wxGtkTreeModelNodes );
+WX_DEFINE_SORTED_ARRAY( void* , wxGtkTreeModelChildren );
+
+class wxGtkTreeModelNode
+{
+public:
+ wxGtkTreeModelNode( wxGtkTreeModelNode* parent, const wxDataViewItem &item,
+ wxDataViewCtrlInternal *internal )
+ {
+ m_parent = parent;
+ m_item = item;
+ m_internal = internal;
+ g_model = internal->GetDataViewModel();
+ m_children = new wxGtkTreeModelChildren( wxGtkTreeModelNodeCmp );
+ }
+
+ ~wxGtkTreeModelNode()
+ {
+ g_model = m_internal->GetDataViewModel();
+ size_t count = m_children->GetCount();
+ size_t i;
+ for (i = 0; i < count; i++)
+ {
+ wxGtkTreeModelNode *child = m_nodes.Item( i );
+ delete child;
+ }
+ delete m_children;
+ }
+
+ unsigned int AddNode( wxGtkTreeModelNode* child )
+ {
+ g_model = m_internal->GetDataViewModel();
+ m_nodes.Add( child );
+ return m_children->Add( child->GetItem().GetID() );
+ }
+
+ unsigned int AddLeave( void* id )
+ {
+ g_model = m_internal->GetDataViewModel();
+ return m_children->Add( id );
+ }
+
+ void DeleteChild( void* id )
+ {
+ g_model = m_internal->GetDataViewModel();
+ size_t pos;
+ size_t count = m_children->GetCount();
+ for (pos = 0; pos < count; pos++)
+ {
+ if (m_children->Item( pos ) == id)
+ {
+ m_children->RemoveAt( pos );
+ break;
+ }
+ }
+ count = m_nodes.GetCount();
+ for (pos = 0; pos < count; pos++)
+ {
+ wxGtkTreeModelNode *node = m_nodes.Item( pos );
+ if (node->GetItem().GetID() == id)
+ {
+ m_nodes.RemoveAt( pos );
+ delete node;
+ break;
+ }
+ }
+
+ }
+
+ wxGtkTreeModelNode* GetParent()
+ { return m_parent; }
+ wxGtkTreeModelNodes &GetNodes()
+ { return m_nodes; }
+ wxGtkTreeModelChildren &GetChildren()
+ { return *m_children; }
+
+ unsigned int GetChildCount() { return m_children->GetCount(); }
+ unsigned int GetNodesCount() { return m_nodes.GetCount(); }
+
+ wxDataViewItem &GetItem() { return m_item; }
+ wxDataViewCtrlInternal *GetInternal() { return m_internal; }
+
+ void Resort();
+
+private:
+ wxGtkTreeModelNode *m_parent;
+ wxGtkTreeModelNodes m_nodes;
+ wxGtkTreeModelChildren *m_children;
+ wxDataViewItem m_item;
+ wxDataViewCtrlInternal *m_internal;
+};
+
+
+int LINKAGEMODE wxGtkTreeModelNodeCmp( void* id1, void* id2 )
+{
+ return g_model->Compare( id1, id2 );
+}