wxDataViewCtrl* GetOwner() { return m_owner; }
GtkWxTreeModel* GetGtkModel() { return m_gtk_model; }
+ // item can be deleted already in the model
+ int GetIndexOf( const wxDataViewItem &parent, const wxDataViewItem &item );
+
protected:
void InitTree();
wxGtkTreeModelNode *FindNode( const wxDataViewItem &item );
gtype = G_TYPE_STRING;
else
{
- gtype = G_TYPE_STRING;
- // wxFAIL_MSG( wxT("non-string columns not supported yet") );
+ gtype = G_TYPE_POINTER;
+ // wxFAIL_MSG( wxT("non-string columns not supported for searching yet") );
}
return gtype;
{
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);
+ if (parent)
+ {
+ g_return_val_if_fail (wxtree_model->stamp == parent->stamp, FALSE);
+ }
return wxtree_model->internal->iter_children( iter, parent );
}
bool wxGtkDataViewModelNotifier::ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item )
{
+#if 0
+ // using _get_path for a deleted item cannot be
+ // a good idea
GtkTreeIter iter;
iter.stamp = m_wxgtk_model->stamp;
iter.user_data = (gpointer) item.GetID();
-
GtkTreePath *path = wxgtk_tree_model_get_path(
GTK_TREE_MODEL(m_wxgtk_model), &iter );
+#else
+ // so get the path from the parent
+ GtkTreeIter iter;
+ iter.stamp = m_wxgtk_model->stamp;
+ iter.user_data = (gpointer) parent.GetID();
+ GtkTreePath *path = wxgtk_tree_model_get_path(
+ GTK_TREE_MODEL(m_wxgtk_model), &iter );
+ // and add the final index ourselves
+ int index = m_owner->GtkGetInternal()->GetIndexOf( parent, item );
+ gtk_tree_path_append_index( path, index );
+#endif
+
gtk_tree_model_row_deleted(
GTK_TREE_MODEL(m_wxgtk_model), path );
gtk_tree_path_free (path);
void wxDataViewRenderer::EnableEllipsize(wxEllipsizeMode mode)
{
+#ifdef __WXGTK26__
if ( gtk_check_version(2, 6, 0) != NULL )
return;
g_value_set_enum( &gvalue, static_cast<PangoEllipsizeMode>(mode) );
g_object_set_property( G_OBJECT(rend), "ellipsize", &gvalue );
g_value_unset( &gvalue );
+#else // GTK < 2.6
+ wxUnusedVar(mode);
+#endif // GTK 2.6/before
}
wxEllipsizeMode wxDataViewRenderer::GetEllipsizeMode() const
{
+#ifdef __WXGTK26__
if ( gtk_check_version(2, 6, 0) != NULL )
return wxELLIPSIZE_NONE;
g_value_unset( &gvalue );
return mode;
+#else // GTK < 2.6
+ return wxELLIPSIZE_NONE;
+#endif // GTK 2.6/before
}
void
GtkTreePath *wxDataViewCtrlInternal::get_path( GtkTreeIter *iter )
{
+ // When this is called from ItemDeleted(), the item is already
+ // deleted in the model.
+
GtkTreePath *retval = gtk_tree_path_new ();
if (m_wx_model->IsVirtualListModel())
return TRUE;
}
- wxDataViewItem item( (void*) parent->user_data );
+
+ wxDataViewItem item;
+ if (parent)
+ item = wxDataViewItem( (void*) parent->user_data );
if (!m_wx_model->IsContainer( item ))
return FALSE;
}
}
+// item can be deleted already in the model
+int wxDataViewCtrlInternal::GetIndexOf( const wxDataViewItem &parent, const wxDataViewItem &item )
+{
+ wxGtkTreeModelNode *parent_node = FindNode( parent );
+ wxGtkTreeModelChildren &children = parent_node->GetChildren();
+ size_t j;
+ for (j = 0; j < children.GetCount(); j++)
+ {
+ if (children[j] == item.GetID())
+ return j;
+ }
+ return -1;
+}
+
+
static wxGtkTreeModelNode*
wxDataViewCtrlInternal_FindNode( wxDataViewModel * model, wxGtkTreeModelNode *treeNode, const wxDataViewItem &item )
{
if( node && node->GetNodes().GetCount() != 0 )
{
int len = node->GetNodes().GetCount();
- wxGtkTreeModelNodes nodes = node->GetNodes();
+ wxGtkTreeModelNodes &nodes = node->GetNodes();
int j = 0;
for( ; j < len; j ++)
{