More patches from Bo, reduced wxDataViewModel, more sorting preps

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47410 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2007-07-13 00:35:39 +00:00
parent cb3c7fdda6
commit d5025dc00f
5 changed files with 382 additions and 353 deletions

View File

@@ -24,7 +24,7 @@
#if defined(__WXGTK20__)
// for testing
// #define wxUSE_GENERICDATAVIEWCTRL 1
#define wxUSE_GENERICDATAVIEWCTRL 1
#elif defined(__WXMAC__)
#else
#define wxUSE_GENERICDATAVIEWCTRL 1
@@ -112,11 +112,8 @@ public:
// define hierachy
virtual bool HasChildren( const wxDataViewItem &item ) const = 0;
virtual int GetChildCount( const wxDataViewItem &item ) const = 0;
virtual wxDataViewItem GetParent( const wxDataViewItem &child ) const = 0;
virtual wxDataViewItem GetFirstChild( const wxDataViewItem &parent ) const = 0;
virtual wxDataViewItem GetNextSibling( const wxDataViewItem &item ) const = 0;
virtual wxDataViewItem GetNthChild( const wxDataViewItem &parent, unsigned int n ) const = 0;
// delegated notifiers
virtual bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item );

View File

@@ -145,33 +145,6 @@ public:
return ((ID == 1) || (ID == 2) || (ID == 5) || (ID == 0));
}
virtual int GetChildCount( const wxDataViewItem &item ) const
{
int ID = item.GetID();
switch (ID)
{
case 0: return 1;
case 1: return 2;
case 2: return 2;
case 5: return 2;
}
return 0;
}
virtual wxDataViewItem GetParent( const wxDataViewItem &child ) const
{
int ID = child.GetID();
switch (ID)
{
case 2:
case 5: return wxDataViewItem( 1 );
case 3:
case 4: return wxDataViewItem( 2 );
case 6:
case 7: return wxDataViewItem( 5 );
}
return wxDataViewItem(0);
}
virtual wxDataViewItem GetFirstChild( const wxDataViewItem &parent ) const
{
int ID = parent.GetID();
@@ -195,42 +168,6 @@ public:
case 6: return wxDataViewItem( 7 );
}
return wxDataViewItem(0);
}
virtual wxDataViewItem GetNthChild( const wxDataViewItem &parent, unsigned int n ) const
{
if (!parent.IsOk())
{
// root node
if (n == 0)
return wxDataViewItem( 1 );
return wxDataViewItem( 0 );
}
int ID = parent.GetID();
switch (ID)
{
case 1:
{
if (n == 0) return wxDataViewItem( 2 );
else if (n == 1) return wxDataViewItem( 5 );
}
break;
case 2:
{
if (n == 0) return wxDataViewItem( 3 );
else if (n == 1) return wxDataViewItem( 4 );
}
break;
case 5:
{
if (n == 0) return wxDataViewItem( 6 );
else if (n == 1) return wxDataViewItem( 7 );
}
break;
}
return wxDataViewItem(0);
}
};

View File

@@ -26,8 +26,14 @@
const wxChar wxDataViewCtrlNameStr[] = wxT("dataviewCtrl");
bool operator == (const wxDataViewItem &left, const wxDataViewItem &right)
{
return (left.GetID() == right.GetID() );
}
// ---------------------------------------------------------
// wxDataViewListModel
// wxDataViewModel
// ---------------------------------------------------------
wxDataViewModel::wxDataViewModel()

View File

@@ -60,11 +60,6 @@ static const int PADDING_TOPBOTTOM = 1;
// the expander space margin
static const int EXPANDER_MARGIN = 4;
bool operator == ( const wxDataViewItem & left, const wxDataViewItem & right )
{
return left.GetID() == right.GetID();
}
//-----------------------------------------------------------------------------
// wxDataViewHeaderWindow
//-----------------------------------------------------------------------------
@@ -393,7 +388,7 @@ public:
void DestroyTree();
private:
wxDataViewTreeNode * GetTreeNodeByRow( unsigned int row );
wxDataViewTreeNode * GetTreeNodeByItem( const wxDataViewItem & item ) { return NULL; }
wxDataViewTreeNode * GetTreeNodeByItem( const wxDataViewItem & item ){};
int RecalculateCount() ;
@@ -1690,13 +1685,21 @@ void wxDataViewMainWindow::OnRenameTimer()
m_currentCol->GetRenderer()->StartEditing( m_currentRow, labelRect );
}
//------------------------------------------------------------------
// Helper class for do operation on the tree node
//------------------------------------------------------------------
class DoJob
{
public:
DoJob(){};
virtual ~DoJob() { }
virtual ~DoJob(){};
virtual bool operator() ( wxDataViewTreeNode * node ) = 0 ;
//The return value control how the tree-walker tranverse the tree
// 0: Job done, stop tranverse and return
// 1: Ignore the current node's subtree and continue
// 2: Job not done, continue
enum { OK = 0 , IGR = 1, CONT = 2 };
virtual int operator() ( wxDataViewTreeNode * node ) = 0 ;
};
class ItemAddJob: public DoJob
@@ -1704,20 +1707,19 @@ class ItemAddJob: public DoJob
public:
ItemAddJob( const wxDataViewItem & parent, const wxDataViewItem & item )
{ this->parent = parent ; this->item = item ; }
virtual ~ItemAddJob() { }
virtual ~ItemAddJob(){};
virtual bool operator() ( wxDataViewTreeNode * node )
virtual int operator() ( wxDataViewTreeNode * node )
{
if( node->GetItem() == parent )
{
wxDataViewTreeNode * newnode = new wxDataViewTreeNode( node );
newnode->SetItem(item);
node->AppendChild( newnode);
return true;
return OK;
}
return false;
return CONT;
}
private:
wxDataViewItem parent, item;
};
@@ -1733,8 +1735,17 @@ bool Walker( wxDataViewTreeNode * node, DoJob & func )
for( ; i < len ; i ++ )
{
wxDataViewTreeNode * n = nodes[i];
if( func( n ) )
switch( func( n ) )
{
case DoJob::OK :
return true ;
case DoJob::IGR:
continue;
case DoJob::CONT:
default:
;
}
if( Walker( n , func ) )
return true;
}
@@ -1742,6 +1753,7 @@ bool Walker( wxDataViewTreeNode * node, DoJob & func )
}
bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxDataViewItem & item)
{
ItemAddJob job( parent, item);
@@ -1981,11 +1993,13 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
dc.SetBrush( wxNullBrush );
if( node->HasChildren() )
{
dc.DrawRoundedRectangle( expander_x,expander_y,expander_width,expander_width, 1.0);
dc.DrawLine( expander_x + 2 , expander_y + expander_width/2, expander_x + expander_width - 2, expander_y + expander_width/2 );
if( !node->IsOpen() )
dc.DrawLine( expander_x + expander_width/2, expander_y + 2, expander_x + expander_width/2, expander_y + expander_width -2 );
//dc.DrawRoundedRectangle( expander_x,expander_y,expander_width,expander_width, 1.0);
//dc.DrawLine( expander_x + 2 , expander_y + expander_width/2, expander_x + expander_width - 2, expander_y + expander_width/2 );
wxRect rect( expander_x , expander_y, expander_width, expander_width);
if( node->IsOpen() )
wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, wxCONTROL_EXPANDED );
else
wxRendererNative::Get().DrawTreeItemButton( this, dc, rect );
}
else
{
@@ -2320,19 +2334,21 @@ public:
RowToItemJob( unsigned int row , int current ) { this->row = row; this->current = current ;}
virtual ~RowToItemJob(){};
virtual bool operator() ( wxDataViewTreeNode * node )
virtual int operator() ( wxDataViewTreeNode * node )
{
if( current == row)
{
ret = node->GetItem() ;
return true;
return DoJob::OK;
}
current ++;
return false;
if ( node->IsOpen())
return DoJob::CONT;
else
return DoJob::IGR;
}
wxDataViewItem GetResult(){ return ret; }
private:
unsigned int row;
int current ;
@@ -2349,9 +2365,8 @@ wxDataViewItem wxDataViewMainWindow::GetItemByRow(unsigned int row)
class RowToTreeNodeJob: public DoJob
{
public:
RowToTreeNodeJob( unsigned int row , int current )
{ this->row = row; this->current = current ; ret = NULL ; }
virtual ~RowToTreeNodeJob() { }
RowToTreeNodeJob( unsigned int row , int current ) { this->row = row; this->current = current ; ret = NULL ; }
virtual ~RowToTreeNodeJob(){};
virtual int operator() ( wxDataViewTreeNode * node )
{
@@ -2386,7 +2401,7 @@ class CountJob : public DoJob
{
public:
CountJob(){ count = 0 ; }
virtual ~CountJob() { }
virtual ~CountJob(){};
virtual int operator () ( wxDataViewTreeNode * node )
{
@@ -2460,12 +2475,16 @@ public:
ItemToRowJob(const wxDataViewItem & item){ this->item = item ; ret = 0 ; }
virtual ~ItemToRowJob(){};
virtual bool operator() ( wxDataViewTreeNode * node)
virtual int operator() ( wxDataViewTreeNode * node)
{
ret ++;
if( node->GetItem() == item )
return true;
return false;
return DoJob::OK;
if( node->IsOpen())
return DoJob::CONT;
else
return DoJob::IGR;
}
//the row number is begin from zero

View File

@@ -52,9 +52,10 @@ WX_DEFINE_ARRAY_PTR( wxGtkTreeModelNode*, wxGtkTreeModelNodes );
class wxGtkTreeModelNode
{
public:
wxGtkTreeModelNode( wxGtkTreeModelNode* parent )
wxGtkTreeModelNode( wxGtkTreeModelNode* parent, const wxDataViewItem &item )
{
m_parent = parent;
m_item = item;
}
~wxGtkTreeModelNode()
@@ -82,7 +83,6 @@ public:
unsigned int GetChildCount() { return m_children.GetCount(); }
wxDataViewItem &GetItem() { return m_item; }
void SetItem( wxDataViewItem& item ) { m_item = item; }
bool HasChildren() { return m_hasChildren; }
void SetHasChildren( bool has ) { m_hasChildren = has; }
@@ -102,14 +102,7 @@ typedef struct _GtkWxTreeModel GtkWxTreeModel;
class wxGtkTreeModel
{
public:
wxGtkTreeModel( wxDataViewModel *wx_model, GtkWxTreeModel *gtk_model )
{
m_wx_model = wx_model;
m_gtk_model = gtk_model;
m_root = NULL;
InitTree();
}
wxGtkTreeModel( wxDataViewModel *wx_model, GtkWxTreeModel *owner );
~wxGtkTreeModel();
gboolean get_iter( GtkTreeIter *iter, GtkTreePath *path );
@@ -121,14 +114,18 @@ public:
gboolean iter_nth_child( GtkTreeIter *iter, GtkTreeIter *parent, gint n );
gboolean iter_parent( GtkTreeIter *iter, GtkTreeIter *child );
wxDataViewModel* GetDataViewModel() { return m_wx_model; }
GtkWxTreeModel* GetOwner() { return m_owner; }
protected:
void InitTree();
wxGtkTreeModelNode *FindNode( GtkTreeIter *iter );
void BuildBranch( wxGtkTreeModelNode *branch );
private:
wxGtkTreeModelNode *m_root;
wxDataViewModel *m_wx_model;
GtkWxTreeModel *m_gtk_model;
GtkWxTreeModel *m_owner;
};
//-----------------------------------------------------------------------------
@@ -160,12 +157,10 @@ struct _GtkWxTreeModel
/*< private >*/
gint stamp;
wxDataViewModel *model;
wxGtkTreeModel *model;
gint sort_column_id;
GtkSortType order;
GtkTreeIterCompareFunc default_sort_func;
GtkTreeIterCompareFunc sort_func;
};
struct _GtkWxTreeModelClass
@@ -328,17 +323,15 @@ wxgtk_tree_model_init (GtkWxTreeModel *tree_model)
tree_model->stamp = g_random_int();
tree_model->sort_column_id = -2;
tree_model->order = GTK_SORT_ASCENDING;
tree_model->sort_func = NULL;
tree_model->default_sort_func = NULL;
}
static void
wxgtk_tree_model_finalize (GObject *object)
{
/* GtkWxTreeModel *tree_model = GTK_WX_LIST_STORE (object); */
GtkWxTreeModel *tree_model = GTK_WX_TREE_MODEL(object);
/* we need to sort out, which class deletes what */
/* delete tree_model->model; */
delete tree_model->model;
/* must chain up */
(* list_parent_class->finalize) (object);
@@ -365,7 +358,7 @@ wxgtk_tree_model_get_n_columns (GtkTreeModel *tree_model)
GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model;
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), 0);
return wxtree_model->model->GetColumnCount();
return wxtree_model->model->GetDataViewModel()->GetColumnCount();
}
static GType
@@ -377,7 +370,7 @@ wxgtk_tree_model_get_column_type (GtkTreeModel *tree_model,
GType gtype = G_TYPE_INVALID;
wxString wxtype = wxtree_model->model->GetColumnType( (unsigned int) index );
wxString wxtype = wxtree_model->model->GetDataViewModel()->GetColumnType( (unsigned int) index );
if (wxtype == wxT("string"))
gtype = G_TYPE_STRING;
@@ -398,26 +391,7 @@ wxgtk_tree_model_get_iter (GtkTreeModel *tree_model,
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), FALSE);
g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
wxDataViewModel *model = wxtree_model->model;
int depth = gtk_tree_path_get_depth( path );
wxDataViewItem item;
int i;
for (i = 0; i < depth; i++)
{
gint pos = gtk_tree_path_get_indices (path)[i];
item = model->GetNthChild( item, (unsigned int) pos );
if (!item.IsOk())
return FALSE;
}
iter->stamp = wxtree_model->stamp;
iter->user_data = (gpointer) item.GetID();
return TRUE;
return wxtree_model->model->get_iter( iter, path );
}
static GtkTreePath *
@@ -428,37 +402,7 @@ wxgtk_tree_model_get_path (GtkTreeModel *tree_model,
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), NULL);
g_return_val_if_fail (iter->stamp == GTK_WX_TREE_MODEL (wxtree_model)->stamp, NULL);
GtkTreePath *retval = gtk_tree_path_new ();
wxDataViewItem item( (wxUint32) iter->user_data );
wxDataViewModel *model = wxtree_model->model;
while (item.IsOk())
{
int n = 0;
wxDataViewItem parent = model->GetParent( item );
if (!parent.IsOk())
wxPrintf( wxT("wrong parent\n") );
wxDataViewItem node = model->GetFirstChild( parent );
while (node.GetID() != item.GetID())
{
node = model->GetNextSibling( node );
if (!node.IsOk())
wxPrintf( wxT("wrong node\n") );
n++;
}
gtk_tree_path_prepend_index( retval, n );
item = model->GetParent( item );
}
return retval;
return wxtree_model->model->get_path( iter );
}
static void
@@ -470,7 +414,7 @@ wxgtk_tree_model_get_value (GtkTreeModel *tree_model,
GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model;
g_return_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model) );
wxDataViewModel *model = wxtree_model->model;
wxDataViewModel *model = wxtree_model->model->GetDataViewModel();
wxString mtype = model->GetColumnType( (unsigned int) column );
if (mtype == wxT("string"))
{
@@ -493,19 +437,9 @@ wxgtk_tree_model_iter_next (GtkTreeModel *tree_model,
{
GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model;
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), FALSE);
g_return_val_if_fail (wxtree_model->stamp == iter->stamp, FALSE);
wxDataViewModel *model = wxtree_model->model;
wxDataViewItem item( (wxUint32) iter->user_data );
item = model->GetNextSibling( item );
if (!item.IsOk())
return FALSE;
iter->user_data = (gpointer) item.GetID();
return TRUE;
return wxtree_model->model->iter_next( iter );
}
static gboolean
@@ -515,20 +449,9 @@ wxgtk_tree_model_iter_children (GtkTreeModel *tree_model,
{
GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model;
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), FALSE);
g_return_val_if_fail (wxtree_model->stamp == parent->stamp, FALSE);
wxDataViewModel *model = wxtree_model->model;
wxDataViewItem item( (wxUint32) parent->user_data );
item = model->GetFirstChild( item );
if (!item.IsOk())
return FALSE;
iter->stamp = wxtree_model->stamp;
iter->user_data = (gpointer) item.GetID();
return TRUE;
return wxtree_model->model->iter_children( iter, parent );
}
static gboolean
@@ -537,14 +460,9 @@ wxgtk_tree_model_iter_has_child (GtkTreeModel *tree_model,
{
GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model;
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), FALSE);
g_return_val_if_fail (wxtree_model->stamp == iter->stamp, FALSE);
wxDataViewModel *model = wxtree_model->model;
wxDataViewItem item( (wxUint32) iter->user_data );
return model->HasChildren( item );
return wxtree_model->model->iter_has_child( iter );
}
static gint
@@ -553,14 +471,9 @@ wxgtk_tree_model_iter_n_children (GtkTreeModel *tree_model,
{
GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model;
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), FALSE);
g_return_val_if_fail (wxtree_model->stamp == iter->stamp, 0);
wxDataViewModel *model = wxtree_model->model;
wxDataViewItem item( (wxUint32) iter->user_data );
return model->GetChildCount( item );
return wxtree_model->model->iter_n_children( iter );
}
static gboolean
@@ -572,34 +485,7 @@ wxgtk_tree_model_iter_nth_child (GtkTreeModel *tree_model,
GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model;
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), FALSE);
wxDataViewModel *model = wxtree_model->model;
if (!parent)
{
wxDataViewItem item;
item = model->GetNthChild( item, n );
if (!item.IsOk())
return FALSE;
iter->stamp = wxtree_model->stamp;
iter->user_data = (gpointer) item.GetID();
}
else
{
g_return_val_if_fail (wxtree_model->stamp == parent->stamp, FALSE);
wxDataViewItem item( (wxUint32) parent->user_data );
item = model->GetNthChild( item, n );
if (!item.IsOk())
return FALSE;
iter->stamp = wxtree_model->stamp;
iter->user_data = (gpointer) item.GetID();
}
return TRUE;
return wxtree_model->model->iter_nth_child( iter, parent, n );
}
static gboolean
@@ -609,21 +495,9 @@ wxgtk_tree_model_iter_parent (GtkTreeModel *tree_model,
{
GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model;
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), FALSE);
g_return_val_if_fail (wxtree_model->stamp == child->stamp, FALSE);
wxDataViewModel *model = wxtree_model->model;
wxDataViewItem item( (wxUint32) child->user_data );
item = model->GetParent( item );
if (!item.IsOk())
return FALSE;
iter->stamp = wxtree_model->stamp;
iter->user_data = (gpointer) item.GetID();
return TRUE;
return wxtree_model->model->iter_parent( iter, child );
}
/* sortable */
@@ -659,11 +533,6 @@ void wxgtk_tree_model_set_sort_column_id (GtkTreeSortable *sortabl
(tree_model->order == order))
return;
if (sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
{
g_return_if_fail (tree_model->default_sort_func != NULL);
}
tree_model->sort_column_id = sort_column_id;
tree_model->order = order;
@@ -679,13 +548,9 @@ void wxgtk_tree_model_set_sort_func (GtkTreeSortable *sortabl
gpointer data,
GtkDestroyNotify destroy)
{
GtkWxTreeModel *tree_model = (GtkWxTreeModel *) sortable;
g_return_if_fail (GTK_IS_WX_TREE_MODEL (sortable) );
g_return_if_fail (func != NULL);
tree_model->sort_func = func;
wxPrintf( "wxgtk_tree_model_set_sort_func, sort_column_id = %d\n", sort_column_id );
// sort
}
@@ -695,14 +560,9 @@ void wxgtk_tree_model_set_default_sort_func (GtkTreeSortable *sortabl
gpointer data,
GtkDestroyNotify destroy)
{
GtkWxTreeModel *tree_model = (GtkWxTreeModel *) sortable;
g_return_if_fail (GTK_IS_WX_TREE_MODEL (sortable) );
g_return_if_fail (func != NULL);
tree_model->default_sort_func = func;
wxPrintf( "wxgtk_tree_model_set_default_sort_func\n" );
}
@@ -711,6 +571,214 @@ gboolean wxgtk_tree_model_has_default_sort_func (GtkTreeSortable *sortabl
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 );
}
}
}
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;
node = node->GetChildren().Item( (size_t) pos );
}
iter->stamp = m_owner->stamp;
iter->user_data = (gpointer) node->GetItem().GetID();
return TRUE;
}
GtkTreePath *wxGtkTreeModel::get_path( GtkTreeIter *iter )
{
GtkTreePath *retval = gtk_tree_path_new ();
wxGtkTreeModelNode *node = FindNode( iter );
while (node->GetParent())
{
wxGtkTreeModelNode *parent = node->GetParent();
int pos = parent->GetChildren().Index( parent );
gtk_tree_path_prepend_index( retval, pos );
node = parent;
}
return retval;
}
gboolean wxGtkTreeModel::iter_next( GtkTreeIter *iter )
{
wxDataViewItem item( (wxUint32) iter->user_data );
item = m_wx_model->GetNextSibling( item );
if (!item.IsOk())
return FALSE;
iter->user_data = (gpointer) item.GetID();
return TRUE;
}
gboolean wxGtkTreeModel::iter_children( GtkTreeIter *iter, GtkTreeIter *parent )
{
wxDataViewItem item( (wxUint32) parent->user_data );
if (!m_wx_model->HasChildren( item ))
return FALSE;
wxGtkTreeModelNode *parent_node = FindNode( parent );
BuildBranch( parent_node );
wxGtkTreeModelNode *first_child_node = parent_node->GetChildren().Item( 0 );
iter->stamp = m_owner->stamp;
iter->user_data = (gpointer) first_child_node->GetItem().GetID();
return TRUE;
}
gboolean wxGtkTreeModel::iter_has_child( GtkTreeIter *iter )
{
wxDataViewItem item( (wxUint32) iter->user_data );
return m_wx_model->HasChildren( item );
}
gint wxGtkTreeModel::iter_n_children( GtkTreeIter *iter )
{
wxDataViewItem item( (wxUint32) iter->user_data );
if (!m_wx_model->HasChildren( item ))
return 0;
wxGtkTreeModelNode *parent_node = FindNode( iter );
BuildBranch( parent_node );
return parent_node->GetChildCount();
}
gboolean wxGtkTreeModel::iter_nth_child( GtkTreeIter *iter, GtkTreeIter *parent, gint n )
{
wxUint32 id = 0;
if (parent) id = (wxUint32) parent->user_data;
wxDataViewItem item( id );
if (!m_wx_model->HasChildren( item ))
return FALSE;
wxGtkTreeModelNode *parent_node = FindNode( parent );
BuildBranch( parent_node );
wxGtkTreeModelNode *child_node = parent_node->GetChildren().Item( (size_t) n );
if (!child_node)
return FALSE;
iter->stamp = m_owner->stamp;
iter->user_data = (gpointer) child_node->GetItem().GetID();
return TRUE;
}
gboolean wxGtkTreeModel::iter_parent( GtkTreeIter *iter, GtkTreeIter *child )
{
wxDataViewItem item( (wxUint32) child->user_data );
wxGtkTreeModelNode *node = FindNode( child );
node = node->GetParent();
if (!node)
return FALSE;
iter->stamp = m_owner->stamp;
iter->user_data = (gpointer) node->GetItem().GetID();
return TRUE;
}
void wxGtkTreeModel::InitTree()
{
wxDataViewItem item;
m_root = new wxGtkTreeModelNode( NULL, item );
BuildBranch( m_root );
}
static wxGtkTreeModelNode*
wxGtkTreeModel_FindNode( wxGtkTreeModelNode *node, const wxDataViewItem &item )
{
if (!node) return NULL;
size_t count = node->GetChildCount();
size_t i;
for (i = 0; i < count; i++)
{
wxGtkTreeModelNode *child = node->GetChildren().Item( i );
if (child->GetItem().GetID() == item.GetID())
return child;
wxGtkTreeModelNode *node2 = wxGtkTreeModel_FindNode( child, item );
if (node2)
return node2;
}
return NULL;
}
wxGtkTreeModelNode *wxGtkTreeModel::FindNode( GtkTreeIter *iter )
{
if (!iter)
return m_root;
wxDataViewItem item( (wxUint32) iter->user_data );
wxGtkTreeModelNode *result = wxGtkTreeModel_FindNode( m_root, item );
if (!result)
{
wxPrintf( "Not found %d\n", (int) iter->user_data );
char *crash = NULL;
*crash = 0;
}
return result;
}
//-----------------------------------------------------------------------------
// define new GTK+ class wxGtkRendererRenderer
//-----------------------------------------------------------------------------
@@ -1900,7 +1968,7 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column,
wxDataViewItem item( (wxUint32) iter->user_data );
wxVariant value;
tree_model->model->GetValue( value, item, cell->GetOwner()->GetModelColumn() );
tree_model->model->GetDataViewModel()->GetValue( value, item, cell->GetOwner()->GetModelColumn() );
if (value.GetType() != cell->GetVariantType())
wxLogError( wxT("Wrong type, required: %s but: %s"),
@@ -2361,15 +2429,17 @@ bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model )
if (!wxDataViewCtrlBase::AssociateModel( model ))
return false;
GtkWxTreeModel *gtk_store = wxgtk_tree_model_new();
gtk_store->model = model;
GtkWxTreeModel *gtkwx_tree_model = wxgtk_tree_model_new();
wxGtkTreeModel *wxgtk_tree_model = new wxGtkTreeModel( model, gtkwx_tree_model );
m_notifier = new wxGtkDataViewModelNotifier( gtk_store, model, this );
gtkwx_tree_model->model = wxgtk_tree_model;
m_notifier = new wxGtkDataViewModelNotifier( gtkwx_tree_model, model, this );
model->AddNotifier( m_notifier );
gtk_tree_view_set_model( GTK_TREE_VIEW(m_treeview), GTK_TREE_MODEL(gtk_store) );
g_object_unref( gtk_store );
gtk_tree_view_set_model( GTK_TREE_VIEW(m_treeview), GTK_TREE_MODEL(gtkwx_tree_model) );
g_object_unref( gtkwx_tree_model );
return true;
}