X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5bb82ad49f605933e95f8ca77714cf7f69e5f9af..13842bbf04f016973fe8ac676aa04e174719e548:/src/gtk/dataview.cpp?ds=sidebyside diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 9be15206b6..5e777e0250 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -279,7 +279,7 @@ public: // item can be deleted already in the model int GetIndexOf( const wxDataViewItem &parent, const wxDataViewItem &item ); - virtual void OnInternalIdle(); + void OnInternalIdle(); protected: void InitTree(); @@ -484,15 +484,11 @@ extern "C" { #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; @@ -502,21 +498,14 @@ struct _GtkWxTreeModel 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, @@ -580,9 +569,6 @@ static gboolean wxgtk_tree_model_row_drop_possible (GtkTreeDragDest *d GtkTreePath *dest_path, GtkSelectionData *selection_data); - -static GObjectClass *list_parent_class = NULL; - GType gtk_wx_tree_model_get_type (void) { @@ -592,41 +578,41 @@ 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 }; @@ -659,16 +645,9 @@ wxgtk_tree_model_new(void) } 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(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; @@ -684,8 +663,9 @@ wxgtk_tree_model_tree_model_init (GtkTreeModelIface *iface) } static void -wxgtk_tree_model_sortable_init (GtkTreeSortableIface *iface) +wxgtk_tree_model_sortable_init(void* g_iface, void*) { + GtkTreeSortableIface* iface = static_cast(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; @@ -694,34 +674,30 @@ wxgtk_tree_model_sortable_init (GtkTreeSortableIface *iface) } static void -wxgtk_tree_model_drag_source_init(GtkTreeDragSourceIface *iface) +wxgtk_tree_model_drag_source_init(void* g_iface, void*) { + GtkTreeDragSourceIface* iface = static_cast(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(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" //----------------------------------------------------------------------------- @@ -1066,15 +1042,12 @@ 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 { @@ -1083,19 +1056,11 @@ 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, @@ -1119,15 +1084,15 @@ gtk_wx_cell_renderer_text_get_type (void) { 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, @@ -1138,31 +1103,22 @@ gtk_wx_cell_renderer_text_get_type (void) } 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) { @@ -1208,15 +1164,12 @@ extern "C" { #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 { @@ -1226,19 +1179,11 @@ 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, @@ -1272,9 +1217,6 @@ static GtkCellEditable *gtk_wx_cell_renderer_start_editing( GdkRectangle *cell_area, GtkCellRendererState flags ); - -static GObjectClass *cell_parent_class = NULL; - } // extern "C" GType @@ -1286,15 +1228,15 @@ gtk_wx_cell_renderer_get_type (void) { 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, @@ -1305,34 +1247,23 @@ gtk_wx_cell_renderer_get_type (void) } 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) { @@ -1440,6 +1371,15 @@ gtk_wx_cell_renderer_get_size (GtkCellRenderer *renderer, *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, @@ -1453,8 +1393,13 @@ gtk_wx_cell_renderer_render (GtkCellRenderer *renderer, 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; @@ -1485,6 +1430,8 @@ gtk_wx_cell_renderer_render (GtkCellRenderer *renderer, if (flags & GTK_CELL_RENDERER_FOCUSED) state |= wxDATAVIEW_CELL_FOCUSED; cell->WXCallRender( rect, dc, state ); + + cell->GTKSetRenderParams(NULL); } static gboolean @@ -2423,6 +2370,7 @@ wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype, { m_dc = NULL; m_text_renderer = NULL; + m_renderParams = NULL; if (no_init) m_renderer = NULL; @@ -2472,12 +2420,12 @@ void wxDataViewCustomRenderer::RenderText( const wxString &text, 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) @@ -2570,11 +2518,13 @@ void wxDataViewProgressRenderer::GTKSetLabel() // Take care to not use GetOwner() here if the label is empty, we can be // called from ctor when GetOwner() is still NULL in this case. - g_value_set_string( &gvalue, - m_label.empty() ? "" - : wxGTK_CONV_FONT(m_label, - GetOwner()->GetOwner()->GetFont()) - ); + wxScopedCharBuffer buf; + if ( m_label.empty() ) + buf = wxScopedCharBuffer::CreateNonOwned(""); + else + buf = wxGTK_CONV_FONT(m_label, GetOwner()->GetOwner()->GetFont()); + + g_value_set_string( &gvalue, buf); g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue ); g_value_unset( &gvalue ); @@ -3812,7 +3762,7 @@ gboolean wxDataViewCtrlInternal::get_iter( GtkTreeIter *iter, GtkTreePath *path iter->stamp = m_gtk_model->stamp; // user_data is just the index +1 - iter->user_data = (gpointer) (i+1); + iter->user_data = wxUIntToPtr(i+1); return TRUE; } @@ -3915,7 +3865,7 @@ gboolean wxDataViewCtrlInternal::iter_next( GtkTreeIter *iter ) } // user_data is just the index +1 (+2 because we need the next) - iter->user_data = (gpointer) (n+2); + iter->user_data = wxUIntToPtr(n+2); } else { @@ -4069,7 +4019,7 @@ gboolean wxDataViewCtrlInternal::iter_nth_child( GtkTreeIter *iter, GtkTreeIter iter->stamp = m_gtk_model->stamp; // user_data is just the index +1 - iter->user_data = (gpointer) (n+1); + iter->user_data = wxUIntToPtr(n+1); return TRUE; } @@ -4890,18 +4840,31 @@ void wxDataViewCtrl::DoSetCurrentItem(const wxDataViewItem& item) 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 @@ -5067,7 +5030,8 @@ void wxDataViewCtrl::HitTest(const wxPoint& point, // 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; @@ -5075,8 +5039,8 @@ void wxDataViewCtrl::HitTest(const wxPoint& point, 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(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