// item can be deleted already in the model
int GetIndexOf( const wxDataViewItem &parent, const wxDataViewItem &item );
- virtual void OnInternalIdle();
+ void OnInternalIdle();
protected:
void InitTree();
#define GTK_TYPE_WX_TREE_MODEL (gtk_wx_tree_model_get_type ())
#define GTK_WX_TREE_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_WX_TREE_MODEL, GtkWxTreeModel))
-#define GTK_WX_TREE_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_WX_TREE_MODEL, GtkWxTreeModelClass))
#define GTK_IS_WX_TREE_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_WX_TREE_MODEL))
#define GTK_IS_WX_TREE_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_WX_TREE_MODEL))
-#define GTK_WX_TREE_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_WX_TREE_MODEL, GtkWxTreeModelClass))
GType gtk_wx_tree_model_get_type (void);
-typedef struct _GtkWxTreeModelClass GtkWxTreeModelClass;
-
struct _GtkWxTreeModel
{
GObject parent;
wxDataViewCtrlInternal *internal;
};
-struct _GtkWxTreeModelClass
-{
- GObjectClass list_parent_class;
-};
-
static GtkWxTreeModel *wxgtk_tree_model_new (void);
-static void wxgtk_tree_model_init (GtkWxTreeModel *tree_model);
-static void wxgtk_tree_model_class_init (GtkWxTreeModelClass *klass);
+static void wxgtk_tree_model_init (GTypeInstance* instance, void*);
-static void wxgtk_tree_model_tree_model_init (GtkTreeModelIface *iface);
-static void wxgtk_tree_model_sortable_init (GtkTreeSortableIface *iface);
-static void wxgtk_tree_model_drag_source_init(GtkTreeDragSourceIface *iface);
-static void wxgtk_tree_model_drag_dest_init (GtkTreeDragDestIface *iface);
+static void wxgtk_tree_model_tree_model_init (void* g_iface, void*);
+static void wxgtk_tree_model_sortable_init (void* g_iface, void*);
+static void wxgtk_tree_model_drag_source_init(void* g_iface, void*);
+static void wxgtk_tree_model_drag_dest_init (void* g_iface, void*);
-static void wxgtk_tree_model_finalize (GObject *object);
static GtkTreeModelFlags wxgtk_tree_model_get_flags (GtkTreeModel *tree_model);
static gint wxgtk_tree_model_get_n_columns (GtkTreeModel *tree_model);
static GType wxgtk_tree_model_get_column_type (GtkTreeModel *tree_model,
GtkTreePath *dest_path,
GtkSelectionData *selection_data);
-
-static GObjectClass *list_parent_class = NULL;
-
GType
gtk_wx_tree_model_get_type (void)
{
{
const GTypeInfo tree_model_info =
{
- sizeof (GtkWxTreeModelClass),
+ sizeof (GObjectClass),
NULL, /* base_init */
NULL, /* base_finalize */
- (GClassInitFunc) wxgtk_tree_model_class_init,
+ NULL,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GtkWxTreeModel),
0,
- (GInstanceInitFunc) wxgtk_tree_model_init,
+ wxgtk_tree_model_init,
};
static const GInterfaceInfo tree_model_iface_info =
{
- (GInterfaceInitFunc) wxgtk_tree_model_tree_model_init,
+ wxgtk_tree_model_tree_model_init,
NULL,
NULL
};
static const GInterfaceInfo sortable_iface_info =
{
- (GInterfaceInitFunc) wxgtk_tree_model_sortable_init,
+ wxgtk_tree_model_sortable_init,
NULL,
NULL
};
static const GInterfaceInfo drag_source_iface_info =
{
- (GInterfaceInitFunc) wxgtk_tree_model_drag_source_init,
+ wxgtk_tree_model_drag_source_init,
NULL,
NULL
};
static const GInterfaceInfo drag_dest_iface_info =
{
- (GInterfaceInitFunc) wxgtk_tree_model_drag_dest_init,
+ wxgtk_tree_model_drag_dest_init,
NULL,
NULL
};
}
static void
-wxgtk_tree_model_class_init (GtkWxTreeModelClass *klass)
-{
- list_parent_class = (GObjectClass*) g_type_class_peek_parent (klass);
- GObjectClass *object_class = (GObjectClass*) klass;
- object_class->finalize = wxgtk_tree_model_finalize;
-}
-
-static void
-wxgtk_tree_model_tree_model_init (GtkTreeModelIface *iface)
+wxgtk_tree_model_tree_model_init(void* g_iface, void*)
{
+ GtkTreeModelIface* iface = static_cast<GtkTreeModelIface*>(g_iface);
iface->get_flags = wxgtk_tree_model_get_flags;
iface->get_n_columns = wxgtk_tree_model_get_n_columns;
iface->get_column_type = wxgtk_tree_model_get_column_type;
}
static void
-wxgtk_tree_model_sortable_init (GtkTreeSortableIface *iface)
+wxgtk_tree_model_sortable_init(void* g_iface, void*)
{
+ GtkTreeSortableIface* iface = static_cast<GtkTreeSortableIface*>(g_iface);
iface->get_sort_column_id = wxgtk_tree_model_get_sort_column_id;
iface->set_sort_column_id = wxgtk_tree_model_set_sort_column_id;
iface->set_sort_func = wxgtk_tree_model_set_sort_func;
}
static void
-wxgtk_tree_model_drag_source_init(GtkTreeDragSourceIface *iface)
+wxgtk_tree_model_drag_source_init(void* g_iface, void*)
{
+ GtkTreeDragSourceIface* iface = static_cast<GtkTreeDragSourceIface*>(g_iface);
iface->row_draggable = wxgtk_tree_model_row_draggable;
iface->drag_data_delete = wxgtk_tree_model_drag_data_delete;
iface->drag_data_get = wxgtk_tree_model_drag_data_get;
}
static void
-wxgtk_tree_model_drag_dest_init (GtkTreeDragDestIface *iface)
+wxgtk_tree_model_drag_dest_init(void* g_iface, void*)
{
+ GtkTreeDragDestIface* iface = static_cast<GtkTreeDragDestIface*>(g_iface);
iface->drag_data_received = wxgtk_tree_model_drag_data_received;
iface->row_drop_possible = wxgtk_tree_model_row_drop_possible;
}
static void
-wxgtk_tree_model_init (GtkWxTreeModel *tree_model)
+wxgtk_tree_model_init(GTypeInstance* instance, void*)
{
+ GtkWxTreeModel* tree_model = GTK_WX_TREE_MODEL(instance);
tree_model->internal = NULL;
tree_model->stamp = g_random_int();
}
-static void
-wxgtk_tree_model_finalize (GObject *object)
-{
- /* must chain up */
- (* list_parent_class->finalize) (object);
-}
-
} // extern "C"
//-----------------------------------------------------------------------------
#define GTK_TYPE_WX_CELL_RENDERER_TEXT (gtk_wx_cell_renderer_text_get_type ())
#define GTK_WX_CELL_RENDERER_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_WX_CELL_RENDERER_TEXT, GtkWxCellRendererText))
-#define GTK_WX_CELL_RENDERER_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_WX_CELL_RENDERER_TEXT, GtkWxCellRendererTextClass))
#define GTK_IS_WX_CELL_RENDERER_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_WX_CELL_RENDERER_TEXT))
#define GTK_IS_WX_CELL_RENDERER_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_WX_CELL_RENDERER_TEXT))
-#define GTK_WX_CELL_RENDERER_TEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_WX_CELL_RENDERER_TEXT, GtkWxCellRendererTextClass))
GType gtk_wx_cell_renderer_text_get_type (void);
typedef struct _GtkWxCellRendererText GtkWxCellRendererText;
-typedef struct _GtkWxCellRendererTextClass GtkWxCellRendererTextClass;
struct _GtkWxCellRendererText
{
wxDataViewRenderer *wx_renderer;
};
-struct _GtkWxCellRendererTextClass
-{
- GtkCellRendererTextClass cell_parent_class;
-};
-
-
static GtkWxCellRendererText *gtk_wx_cell_renderer_text_new (void);
static void gtk_wx_cell_renderer_text_init (
- GtkWxCellRendererText *cell );
+ GTypeInstance* instance, void*);
static void gtk_wx_cell_renderer_text_class_init(
- GtkWxCellRendererTextClass *klass );
-static void gtk_wx_cell_renderer_text_finalize (
- GObject *object );
+ void* klass, void*);
static GtkCellEditable *gtk_wx_cell_renderer_text_start_editing(
GtkCellRenderer *cell,
GdkEvent *event,
{
const GTypeInfo cell_wx_info =
{
- sizeof (GtkWxCellRendererTextClass),
+ sizeof (GtkCellRendererTextClass),
NULL, /* base_init */
NULL, /* base_finalize */
- (GClassInitFunc) gtk_wx_cell_renderer_text_class_init,
+ gtk_wx_cell_renderer_text_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GtkWxCellRendererText),
0, /* n_preallocs */
- (GInstanceInitFunc) gtk_wx_cell_renderer_text_init,
+ gtk_wx_cell_renderer_text_init,
};
cell_wx_type = g_type_register_static( GTK_TYPE_CELL_RENDERER_TEXT,
}
static void
-gtk_wx_cell_renderer_text_init (GtkWxCellRendererText *cell)
+gtk_wx_cell_renderer_text_init(GTypeInstance* instance, void*)
{
+ GtkWxCellRendererText* cell = GTK_WX_CELL_RENDERER_TEXT(instance);
cell->wx_renderer = NULL;
}
static void
-gtk_wx_cell_renderer_text_class_init (GtkWxCellRendererTextClass *klass)
+gtk_wx_cell_renderer_text_class_init(void* klass, void*)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (klass);
text_cell_parent_class = (GObjectClass*) g_type_class_peek_parent (klass);
- object_class->finalize = gtk_wx_cell_renderer_text_finalize;
-
cell_class->start_editing = gtk_wx_cell_renderer_text_start_editing;
}
-static void
-gtk_wx_cell_renderer_text_finalize (GObject *object)
-{
- /* must chain up */
- (* G_OBJECT_CLASS (text_cell_parent_class)->finalize) (object);
-}
-
GtkWxCellRendererText*
gtk_wx_cell_renderer_text_new (void)
{
#define GTK_TYPE_WX_CELL_RENDERER (gtk_wx_cell_renderer_get_type ())
#define GTK_WX_CELL_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_WX_CELL_RENDERER, GtkWxCellRenderer))
-#define GTK_WX_CELL_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_WX_CELL_RENDERER, GtkWxCellRendererClass))
#define GTK_IS_WX_CELL_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_WX_CELL_RENDERER))
#define GTK_IS_WX_CELL_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_WX_CELL_RENDERER))
-#define GTK_WX_CELL_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_WX_CELL_RENDERER, GtkWxCellRendererClass))
GType gtk_wx_cell_renderer_get_type (void);
typedef struct _GtkWxCellRenderer GtkWxCellRenderer;
-typedef struct _GtkWxCellRendererClass GtkWxCellRendererClass;
struct _GtkWxCellRenderer
{
wxDataViewCustomRenderer *cell;
};
-struct _GtkWxCellRendererClass
-{
- GtkCellRendererClass cell_parent_class;
-};
-
-
static GtkCellRenderer *gtk_wx_cell_renderer_new (void);
static void gtk_wx_cell_renderer_init (
- GtkWxCellRenderer *cell );
+ GTypeInstance* instance, void*);
static void gtk_wx_cell_renderer_class_init(
- GtkWxCellRendererClass *klass );
-static void gtk_wx_cell_renderer_finalize (
- GObject *object );
+ void* klass, void*);
static void gtk_wx_cell_renderer_get_size (
GtkCellRenderer *cell,
GtkWidget *widget,
GdkRectangle *cell_area,
GtkCellRendererState flags );
-
-static GObjectClass *cell_parent_class = NULL;
-
} // extern "C"
GType
{
const GTypeInfo cell_wx_info =
{
- sizeof (GtkWxCellRendererClass),
+ sizeof (GtkCellRendererClass),
NULL, /* base_init */
NULL, /* base_finalize */
- (GClassInitFunc) gtk_wx_cell_renderer_class_init,
+ gtk_wx_cell_renderer_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GtkWxCellRenderer),
0, /* n_preallocs */
- (GInstanceInitFunc) gtk_wx_cell_renderer_init,
+ gtk_wx_cell_renderer_init,
};
cell_wx_type = g_type_register_static( GTK_TYPE_CELL_RENDERER,
}
static void
-gtk_wx_cell_renderer_init (GtkWxCellRenderer *cell)
+gtk_wx_cell_renderer_init(GTypeInstance* instance, void*)
{
+ GtkWxCellRenderer* cell = GTK_WX_CELL_RENDERER(instance);
cell->cell = NULL;
}
static void
-gtk_wx_cell_renderer_class_init (GtkWxCellRendererClass *klass)
+gtk_wx_cell_renderer_class_init(void* klass, void*)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (klass);
- cell_parent_class = (GObjectClass*) g_type_class_peek_parent (klass);
-
- object_class->finalize = gtk_wx_cell_renderer_finalize;
-
cell_class->get_size = gtk_wx_cell_renderer_get_size;
cell_class->render = gtk_wx_cell_renderer_render;
cell_class->activate = gtk_wx_cell_renderer_activate;
cell_class->start_editing = gtk_wx_cell_renderer_start_editing;
}
-static void
-gtk_wx_cell_renderer_finalize (GObject *object)
-{
- /* must chain up */
- (* G_OBJECT_CLASS (cell_parent_class)->finalize) (object);
-}
-
GtkCellRenderer*
gtk_wx_cell_renderer_new (void)
{
*height = calc_height;
}
+struct wxDataViewCustomRenderer::GTKRenderParams
+{
+ GdkWindow* window;
+ GdkRectangle* expose_area;
+ GtkWidget* widget;
+ GdkRectangle* background_area;
+ int flags;
+};
+
static void
gtk_wx_cell_renderer_render (GtkCellRenderer *renderer,
GdkWindow *window,
GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer;
wxDataViewCustomRenderer *cell = wxrenderer->cell;
- cell->GTKStashRenderParams(window, widget,
- background_area, expose_area, flags);
+ wxDataViewCustomRenderer::GTKRenderParams renderParams;
+ renderParams.window = window;
+ renderParams.expose_area = expose_area;
+ renderParams.widget = widget;
+ renderParams.background_area = background_area;
+ renderParams.flags = flags;
+ cell->GTKSetRenderParams(&renderParams);
wxRect rect(wxRectFromGDKRect(cell_area));
int xpad, ypad;
if (flags & GTK_CELL_RENDERER_FOCUSED)
state |= wxDATAVIEW_CELL_FOCUSED;
cell->WXCallRender( rect, dc, state );
+
+ cell->GTKSetRenderParams(NULL);
}
static gboolean
{
m_dc = NULL;
m_text_renderer = NULL;
+ m_renderParams = NULL;
if (no_init)
m_renderer = NULL;
cell_area.width -= xoffset;
gtk_cell_renderer_render( GTK_CELL_RENDERER(textRenderer),
- m_renderParams.window,
- m_renderParams.widget,
- m_renderParams.background_area,
+ m_renderParams->window,
+ m_renderParams->widget,
+ m_renderParams->background_area,
&cell_area,
- m_renderParams.expose_area,
- (GtkCellRendererState) m_renderParams.flags );
+ m_renderParams->expose_area,
+ GtkCellRendererState(m_renderParams->flags));
}
bool wxDataViewCustomRenderer::Init(wxDataViewCellMode mode, int align)
gtk_tree_view_set_cursor(GTK_TREE_VIEW(m_treeview), path, NULL, FALSE);
}
-void wxDataViewCtrl::StartEditor(const wxDataViewItem& item, unsigned int column)
+wxDataViewColumn *wxDataViewCtrl::GetCurrentColumn() const
+{
+ // The tree doesn't have any current item if it hadn't been created yet but
+ // it's arguably not an error to call this function in this case so just
+ // return NULL without asserting.
+ if ( !m_treeview )
+ return NULL;
+
+ GtkTreeViewColumn *col;
+ gtk_tree_view_get_cursor(GTK_TREE_VIEW(m_treeview), NULL, &col);
+ return FromGTKColumn(col);
+}
+
+void wxDataViewCtrl::EditItem(const wxDataViewItem& item, const wxDataViewColumn *column)
{
wxCHECK_RET( m_treeview,
"Current item can't be set before creating the control." );
+ wxCHECK_RET( item.IsOk(), "invalid item" );
+ wxCHECK_RET( column, "no column provided" );
// We need to make sure the model knows about this item or the path would
// be invalid and gtk_tree_view_set_cursor() would silently do nothing.
ExpandAncestors(item);
-
- wxDataViewColumn *dvcolumn = GetColumn(column);
- wxASSERT_MSG(dvcolumn, "Could not retrieve column");
- GtkTreeViewColumn *gcolumn = GTK_TREE_VIEW_COLUMN(dvcolumn->GetGtkHandle());
+
+ GtkTreeViewColumn *gcolumn = GTK_TREE_VIEW_COLUMN(column->GetGtkHandle());
// We also need to preserve the existing selection from changing.
// Unfortunately the only way to do it seems to use our own selection
// gtk_tree_view_get_path_at_pos() is the wrong function. It doesn't mind the header but returns column.
// See http://mail.gnome.org/archives/gtkmm-list/2005-January/msg00080.html
// So we have to use both of them.
- // Friedrich Haase 2010-9-20
+ item = wxDataViewItem(0);
+ column = NULL;
wxGtkTreePath path, pathScratch;
GtkTreeViewColumn* GtkColumn = NULL;
GtkTreeViewDropPosition pos = GTK_TREE_VIEW_DROP_INTO_OR_AFTER;
gint cell_y = 0;
// cannot directly call GtkGetTreeView(), HitTest is const and so is this pointer
- wxDataViewCtrl* ctrl = (wxDataViewCtrl*)this; // ugly workaround, ctrl is NOT const
- GtkTreeView* treeView = GTK_TREE_VIEW(ctrl->GtkGetTreeView());
+ wxDataViewCtrl* self = const_cast<wxDataViewCtrl *>(this); // ugly workaround, self is NOT const
+ GtkTreeView* treeView = GTK_TREE_VIEW(self->GtkGetTreeView());
// is there possibly a better suited function to get the column?
gtk_tree_view_get_path_at_pos( // and this is the wrong call but it delivers the column