X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6549dd3ce3d87e08815b36abc8d8fe188044bc59..f2959820a5286e4b1595bb9c89de30fa69d6fc6a:/src/gtk/dataview.cpp diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 8518e49aea..c58858a7ff 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -2,7 +2,6 @@ // Name: src/gtk/dataview.cpp // Purpose: wxDataViewCtrl GTK+2 implementation // Author: Robert Roebling -// Id: $Id$ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -28,17 +27,27 @@ #include "wx/popupwin.h" #include "wx/listimpl.cpp" -#include "wx/gtk/private.h" #include "wx/gtk/dc.h" +#ifndef __WXGTK3__ #include "wx/gtk/dcclient.h" +#endif +#include +#include "wx/gtk/private.h" +#include "wx/gtk/private/event.h" #include "wx/gtk/private/gdkconv.h" +#include "wx/gtk/private/gtk2-compat.h" #include "wx/gtk/private/list.h" -#include "wx/gtk/private/event.h" using namespace wxGTKImpl; class wxGtkDataViewModelNotifier; +#ifdef __WXGTK3__ + #define wxConstGdkRect const GdkRectangle +#else + #define wxConstGdkRect GdkRectangle +#endif + //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -137,7 +146,8 @@ public: // any given moment. It's just simpler like this and we don't need anything // more for now. -extern "C" +extern "C" { +static gboolean wxdataview_selection_func(GtkTreeSelection * WXUNUSED(selection), GtkTreeModel * WXUNUSED(model), GtkTreePath * WXUNUSED(path), @@ -146,6 +156,7 @@ gboolean wxdataview_selection_func(GtkTreeSelection * WXUNUSED(selection), { return data == NULL; } +} class wxGtkTreeSelectionLock { @@ -185,8 +196,10 @@ private: // We can only use gtk_tree_selection_get_select_function() with 2.14+ // so check for its availability both during compile- and run-time. #if GTK_CHECK_VERSION(2, 14, 0) +#ifndef __WXGTK3__ if ( gtk_check_version(2, 14, 0) != NULL ) return; +#endif // If this assert is triggered, it means the code elsewhere has called // gtk_tree_selection_set_select_function() but currently doing this @@ -268,7 +281,15 @@ public: void SetDataViewSortColumn( wxDataViewColumn *column ) { m_dataview_sort_column = column; } wxDataViewColumn *GetDataViewSortColumn() { return m_dataview_sort_column; } - bool IsSorted() { return (m_sort_column >= 0); } + bool IsSorted() const { return m_sort_column >= 0; } + + // Should we be sorted either because we have a configured sort column or + // because we have a default sort order? + bool ShouldBeSorted() const + { + return IsSorted() || GetDataViewModel()->HasDefaultCompare(); + } + // accessors wxDataViewModel* GetDataViewModel() { return m_wx_model; } @@ -279,7 +300,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(); @@ -360,7 +381,7 @@ public: m_children.Add( id ); - if (m_internal->IsSorted() || m_internal->GetDataViewModel()->HasDefaultCompare()) + if (m_internal->ShouldBeSorted()) { gs_internal = m_internal; m_children.Sort( &wxGtkTreeModelChildCmp ); @@ -369,7 +390,7 @@ public: void InsertNode( wxGtkTreeModelNode* child, unsigned pos ) { - if (m_internal->IsSorted() || m_internal->GetDataViewModel()->HasDefaultCompare()) + if (m_internal->ShouldBeSorted()) { AddNode(child); return; @@ -407,7 +428,7 @@ public: { m_children.Insert( id, pos ); - if (m_internal->IsSorted() || m_internal->GetDataViewModel()->HasDefaultCompare()) + if (m_internal->ShouldBeSorted()) { gs_internal = m_internal; m_children.Sort( &wxGtkTreeModelChildCmp ); @@ -484,15 +505,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 +519,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 +590,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 +599,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 +666,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 +684,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 +695,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" //----------------------------------------------------------------------------- @@ -1017,7 +1014,7 @@ wxgtk_tree_model_set_sort_column_id (GtkTreeSortable *sortable, if (gs_lastLeftClickHeader) { wxDataViewCtrl *dv = tree_model->internal->GetOwner(); - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_COLUMN_SORTED, dv->GetId() ); event.SetDataViewColumn( gs_lastLeftClickHeader ); event.SetModel( dv->GetModel() ); dv->HandleWindowEvent( event ); @@ -1066,15 +1063,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,26 +1077,18 @@ 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, GtkWidget *widget, const gchar *path, - GdkRectangle *background_area, - GdkRectangle *cell_area, + wxConstGdkRect *background_area, + wxConstGdkRect *cell_area, GtkCellRendererState flags ); @@ -1119,15 +1105,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 +1124,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) { @@ -1174,8 +1151,8 @@ static GtkCellEditable *gtk_wx_cell_renderer_text_start_editing( GdkEvent *gdk_event, GtkWidget *widget, const gchar *path, - GdkRectangle *background_area, - GdkRectangle *cell_area, + wxConstGdkRect *background_area, + wxConstGdkRect *cell_area, GtkCellRendererState flags ) { GtkWxCellRendererText *wxgtk_renderer = (GtkWxCellRendererText *) gtk_renderer; @@ -1186,7 +1163,7 @@ static GtkCellEditable *gtk_wx_cell_renderer_text_start_editing( item(column->GetOwner()->GTKPathToItem(wxGtkTreePath(path))); wxDataViewCtrl *dv = column->GetOwner(); - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_START_EDITING, dv->GetId() ); event.SetDataViewColumn( column ); event.SetModel( dv->GetModel() ); event.SetColumn( column->GetModelColumn() ); @@ -1208,15 +1185,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,55 +1200,50 @@ 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 *rectangle, + wxConstGdkRect *rectangle, gint *x_offset, gint *y_offset, gint *width, gint *height ); static void gtk_wx_cell_renderer_render ( GtkCellRenderer *cell, +#ifdef __WXGTK3__ + cairo_t* cr, +#else GdkWindow *window, +#endif GtkWidget *widget, - GdkRectangle *background_area, - GdkRectangle *cell_area, + wxConstGdkRect *background_area, + wxConstGdkRect *cell_area, +#ifndef __WXGTK3__ GdkRectangle *expose_area, +#endif GtkCellRendererState flags ); static gboolean gtk_wx_cell_renderer_activate( GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path, - GdkRectangle *background_area, - GdkRectangle *cell_area, + wxConstGdkRect *background_area, + wxConstGdkRect *cell_area, GtkCellRendererState flags ); static GtkCellEditable *gtk_wx_cell_renderer_start_editing( GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path, - GdkRectangle *background_area, - GdkRectangle *cell_area, + wxConstGdkRect *background_area, + wxConstGdkRect *cell_area, GtkCellRendererState flags ); - -static GObjectClass *cell_parent_class = NULL; - } // extern "C" GType @@ -1286,15 +1255,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 +1274,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) { @@ -1344,8 +1302,8 @@ static GtkCellEditable *gtk_wx_cell_renderer_start_editing( GdkEvent *WXUNUSED(event), GtkWidget *widget, const gchar *path, - GdkRectangle *WXUNUSED(background_area), - GdkRectangle *cell_area, + wxConstGdkRect *WXUNUSED(background_area), + wxConstGdkRect *cell_area, GtkCellRendererState WXUNUSED(flags) ) { GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer; @@ -1385,7 +1343,7 @@ static GtkCellEditable *gtk_wx_cell_renderer_start_editing( static void gtk_wx_cell_renderer_get_size (GtkCellRenderer *renderer, GtkWidget *WXUNUSED(widget), - GdkRectangle *cell_area, + wxConstGdkRect *cell_area, gint *x_offset, gint *y_offset, gint *width, @@ -1440,28 +1398,67 @@ gtk_wx_cell_renderer_get_size (GtkCellRenderer *renderer, *height = calc_height; } +struct wxDataViewCustomRenderer::GTKRenderParams +{ +#ifdef __WXGTK3__ + cairo_t* cr; +#else + GdkWindow* window; + GdkRectangle* expose_area; +#endif + GtkWidget* widget; + wxConstGdkRect* background_area; + int flags; +}; + static void gtk_wx_cell_renderer_render (GtkCellRenderer *renderer, +#ifdef __WXGTK3__ + cairo_t* cr, +#else GdkWindow *window, +#endif GtkWidget *widget, - GdkRectangle *background_area, - GdkRectangle *cell_area, + wxConstGdkRect *background_area, + wxConstGdkRect *cell_area, +#ifndef __WXGTK3__ GdkRectangle *expose_area, +#endif GtkCellRendererState flags) { GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer; wxDataViewCustomRenderer *cell = wxrenderer->cell; - cell->GTKStashRenderParams(window, widget, - background_area, expose_area, flags); + wxDataViewCustomRenderer::GTKRenderParams renderParams; +#ifdef __WXGTK3__ + renderParams.cr = cr; +#else + renderParams.window = window; + renderParams.expose_area = expose_area; +#endif + renderParams.widget = widget; + renderParams.background_area = background_area; + renderParams.flags = flags; + cell->GTKSetRenderParams(&renderParams); wxRect rect(wxRectFromGDKRect(cell_area)); int xpad, ypad; gtk_cell_renderer_get_padding(renderer, &xpad, &ypad); rect = rect.Deflate(xpad, ypad); - wxWindowDC* dc = (wxWindowDC*) cell->GetDC(); + wxDC* dc = cell->GetDC(); +#ifdef __WXGTK3__ + wxGraphicsContext* context = dc->GetGraphicsContext(); + void* nativeContext = NULL; + if (context) + nativeContext = context->GetNativeContext(); + if (cr != nativeContext) + { + cairo_reference(cr); + dc->SetGraphicsContext(wxGraphicsContext::CreateFromNative(cr)); + } +#else wxWindowDCImpl *impl = (wxWindowDCImpl *) dc->GetImpl(); // Reinitialize wxWindowDC's GDK window if drawing occurs into a different @@ -1472,6 +1469,7 @@ gtk_wx_cell_renderer_render (GtkCellRenderer *renderer, impl->m_gdkwindow = window; impl->SetUpDC(); } +#endif int state = 0; if (flags & GTK_CELL_RENDERER_SELECTED) @@ -1485,6 +1483,11 @@ 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); +#ifdef __WXGTK3__ + dc->SetGraphicsContext(NULL); +#endif } static gboolean @@ -1493,8 +1496,8 @@ gtk_wx_cell_renderer_activate( GdkEvent *event, GtkWidget *widget, const gchar *path, - GdkRectangle *WXUNUSED(background_area), - GdkRectangle *cell_area, + wxConstGdkRect *WXUNUSED(background_area), + wxConstGdkRect *cell_area, GtkCellRendererState WXUNUSED(flags) ) { GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer; @@ -1701,12 +1704,17 @@ bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsig GTK_TREE_MODEL(wxgtk_model), &iter )); GdkRectangle cell_area; gtk_tree_view_get_cell_area( widget, path, gcolumn, &cell_area ); - +#ifdef __WXGTK3__ + GtkAdjustment* hadjust = gtk_scrollable_get_hadjustment(GTK_SCROLLABLE(widget)); +#else GtkAdjustment* hadjust = gtk_tree_view_get_hadjustment( widget ); +#endif double d = gtk_adjustment_get_value( hadjust ); int xdiff = (int) d; - int ydiff = gcolumn->button->allocation.height; + GtkAllocation a; + gtk_widget_get_allocation(GTK_WIDGET(gtk_tree_view_column_get_button(gcolumn)), &a); + int ydiff = a.height; // Redraw gtk_widget_queue_draw_area( GTK_WIDGET(widget), cell_area.x - xdiff, ydiff + cell_area.y, cell_area.width, cell_area.height ); @@ -1776,7 +1784,7 @@ wxgtk_cell_editable_editing_done( GtkCellEditable *WXUNUSED(editable), { wxDataViewColumn *column = wxrenderer->GetOwner(); wxDataViewCtrl *dv = column->GetOwner(); - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_EDITING_DONE, dv->GetId() ); event.SetDataViewColumn( column ); event.SetModel( dv->GetModel() ); wxDataViewItem item( s_user_data ); @@ -1793,7 +1801,7 @@ wxgtk_renderer_editing_started( GtkCellRenderer *WXUNUSED(cell), GtkCellEditable wxDataViewColumn *column = wxrenderer->GetOwner(); wxDataViewCtrl *dv = column->GetOwner(); - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_EDITING_STARTED, dv->GetId() ); event.SetDataViewColumn( column ); event.SetModel( dv->GetModel() ); wxDataViewItem item(dv->GTKPathToItem(wxGtkTreePath(path))); @@ -1804,7 +1812,7 @@ wxgtk_renderer_editing_started( GtkCellRenderer *WXUNUSED(cell), GtkCellEditable { s_user_data = item.GetID(); - g_signal_connect (GTK_CELL_EDITABLE (editable), "editing_done", + g_signal_connect (editable, "editing_done", G_CALLBACK (wxgtk_cell_editable_editing_done), (gpointer) wxrenderer ); @@ -1835,9 +1843,8 @@ void wxDataViewRenderer::GtkPackIntoColumn(GtkTreeViewColumn *column) void wxDataViewRenderer::GtkInitHandlers() { - if (!gtk_check_version(2,6,0)) { - g_signal_connect (GTK_CELL_RENDERER(m_renderer), "editing_started", + g_signal_connect (m_renderer, "editing_started", G_CALLBACK (wxgtk_renderer_editing_started), this); } @@ -1963,10 +1970,6 @@ int wxDataViewRenderer::GetAlignment() const void wxDataViewRenderer::EnableEllipsize(wxEllipsizeMode mode) { -#ifdef __WXGTK26__ - if ( gtk_check_version(2, 6, 0) != NULL ) - return; - GtkCellRendererText * const rend = GtkGetTextRenderer(); if ( !rend ) return; @@ -1978,17 +1981,10 @@ void wxDataViewRenderer::EnableEllipsize(wxEllipsizeMode mode) g_value_set_enum( &gvalue, static_cast(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; - GtkCellRendererText * const rend = GtkGetTextRenderer(); if ( !rend ) return wxELLIPSIZE_NONE; @@ -2001,9 +1997,6 @@ wxEllipsizeMode wxDataViewRenderer::GetEllipsizeMode() const g_value_unset( &gvalue ); return mode; -#else // GTK < 2.6 - return wxELLIPSIZE_NONE; -#endif // GTK 2.6/before } void @@ -2195,8 +2188,10 @@ void wxDataViewTextRenderer::SetAlignment( int align ) { wxDataViewRenderer::SetAlignment(align); +#ifndef __WXGTK3__ if (gtk_check_version(2,10,0)) return; +#endif // horizontal alignment: PangoAlignment pangoAlign = PANGO_ALIGN_LEFT; @@ -2302,12 +2297,10 @@ static void wxGtkToggleRendererToggledCallback( GtkCellRendererToggle *renderer, GValue gvalue = { 0, }; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_object_get_property( G_OBJECT(renderer), "active", &gvalue ); - bool tmp = g_value_get_boolean( &gvalue ); - g_value_unset( &gvalue ); // invert it - tmp = !tmp; + wxVariant value = !g_value_get_boolean( &gvalue ); + g_value_unset( &gvalue ); - wxVariant value = tmp; if (!cell->Validate( value )) return; @@ -2365,11 +2358,9 @@ bool wxDataViewToggleRenderer::GetValue( wxVariant &value ) const GValue gvalue = { 0, }; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_object_get_property( G_OBJECT(m_renderer), "active", &gvalue ); - bool tmp = g_value_get_boolean( &gvalue ); + value = g_value_get_boolean( &gvalue ) != 0; g_value_unset( &gvalue ); - value = tmp; - return true; } @@ -2377,6 +2368,7 @@ bool wxDataViewToggleRenderer::GetValue( wxVariant &value ) const // wxDataViewCustomRenderer // --------------------------------------------------------- +#ifndef __WXGTK3__ class wxDataViewCtrlDCImpl: public wxWindowDCImpl { public: @@ -2407,7 +2399,7 @@ public: wxWindowDC( new wxDataViewCtrlDCImpl( this, window ) ) { } }; - +#endif // --------------------------------------------------------- // wxDataViewCustomRenderer @@ -2423,6 +2415,7 @@ wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype, { m_dc = NULL; m_text_renderer = NULL; + m_renderParams = NULL; if (no_init) m_renderer = NULL; @@ -2472,12 +2465,18 @@ 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, +#ifdef __WXGTK3__ + m_renderParams->cr, +#else + m_renderParams->window, +#endif + m_renderParams->widget, + m_renderParams->background_area, &cell_area, - m_renderParams.expose_area, - (GtkCellRendererState) m_renderParams.flags ); +#ifndef __WXGTK3__ + m_renderParams->expose_area, +#endif + GtkCellRendererState(m_renderParams->flags)); } bool wxDataViewCustomRenderer::Init(wxDataViewCellMode mode, int align) @@ -2508,11 +2507,18 @@ wxDC *wxDataViewCustomRenderer::GetDC() { if (m_dc == NULL) { +#ifdef __WXGTK3__ + wxASSERT(m_renderParams); + cairo_t* cr = m_renderParams->cr; + wxASSERT(cr && cairo_status(cr) == 0); + m_dc = new wxGTKCairoDC(cr); +#else if (GetOwner() == NULL) return NULL; if (GetOwner()->GetOwner() == NULL) return NULL; m_dc = new wxDataViewCtrlDC( GetOwner()->GetOwner() ); +#endif } return m_dc; @@ -2530,32 +2536,23 @@ wxDataViewProgressRenderer::wxDataViewProgressRenderer( const wxString &label, { m_label = label; m_value = 0; + m_renderer = (GtkCellRenderer*) gtk_cell_renderer_progress_new(); -#ifdef __WXGTK26__ - if (!gtk_check_version(2,6,0)) - { - m_renderer = (GtkCellRenderer*) gtk_cell_renderer_progress_new(); - - SetMode(mode); - SetAlignment(align); + SetMode(mode); + SetAlignment(align); #if !wxUSE_UNICODE - // We can't initialize the renderer just yet because we don't have the - // pointer to the column that uses this renderer yet and so attempt to - // dereference GetOwner() to get the font that is used as a source of - // encoding in multibyte-to-Unicode conversion in GTKSetLabel() in - // non-Unicode builds would crash. So simply remember to do it later. - if ( !m_label.empty() ) - m_needsToSetLabel = true; - else -#endif // !wxUSE_UNICODE - GTKSetLabel(); - } + // We can't initialize the renderer just yet because we don't have the + // pointer to the column that uses this renderer yet and so attempt to + // dereference GetOwner() to get the font that is used as a source of + // encoding in multibyte-to-Unicode conversion in GTKSetLabel() in + // non-Unicode builds would crash. So simply remember to do it later. + if ( !m_label.empty() ) + m_needsToSetLabel = true; else -#endif +#endif // !wxUSE_UNICODE { - // Use custom cell code - wxDataViewCustomRenderer::Init(mode, align); + GTKSetLabel(); } } @@ -2587,29 +2584,17 @@ void wxDataViewProgressRenderer::GTKSetLabel() bool wxDataViewProgressRenderer::SetValue( const wxVariant &value ) { -#ifdef __WXGTK26__ - if (!gtk_check_version(2,6,0)) - { #if !wxUSE_UNICODE - if ( m_needsToSetLabel ) - GTKSetLabel(); + if ( m_needsToSetLabel ) + GTKSetLabel(); #endif // !wxUSE_UNICODE - gint tmp = (long) value; - GValue gvalue = { 0, }; - g_value_init( &gvalue, G_TYPE_INT ); - g_value_set_int( &gvalue, tmp ); - g_object_set_property( G_OBJECT(m_renderer), "value", &gvalue ); - g_value_unset( &gvalue ); - } - else -#endif - { - m_value = (long) value; - - if (m_value < 0) m_value = 0; - if (m_value > 100) m_value = 100; - } + gint tmp = (long) value; + GValue gvalue = { 0, }; + g_value_init( &gvalue, G_TYPE_INT ); + g_value_set_int( &gvalue, tmp ); + g_object_set_property( G_OBJECT(m_renderer), "value", &gvalue ); + g_value_unset( &gvalue ); return true; } @@ -2648,42 +2633,30 @@ wxDataViewChoiceRenderer::wxDataViewChoiceRenderer( const wxArrayString &choices wxDataViewCellMode mode, int alignment ) : wxDataViewCustomRenderer( "string", mode, alignment, true ) { - m_choices = choices; - -#ifdef __WXGTK26__ - if (!gtk_check_version(2,6,0)) + m_choices = choices; + m_renderer = (GtkCellRenderer*) gtk_cell_renderer_combo_new(); + GtkListStore *store = gtk_list_store_new( 1, G_TYPE_STRING ); + for (size_t n = 0; n < m_choices.GetCount(); n++) { - m_renderer = (GtkCellRenderer*) gtk_cell_renderer_combo_new(); - - GtkListStore *store = gtk_list_store_new( 1, G_TYPE_STRING ); - for (size_t n = 0; n < m_choices.GetCount(); n++) - { - gtk_list_store_insert_with_values( - store, NULL, n, 0, - static_cast(m_choices[n].utf8_str()), -1 ); - } + gtk_list_store_insert_with_values( + store, NULL, n, 0, + static_cast(m_choices[n].utf8_str()), -1 ); + } - g_object_set (m_renderer, - "model", store, - "text-column", 0, - "has-entry", FALSE, - NULL); + g_object_set (m_renderer, + "model", store, + "text-column", 0, + "has-entry", FALSE, + NULL); - bool editable = (mode & wxDATAVIEW_CELL_EDITABLE); - g_object_set (m_renderer, "editable", editable, NULL); + bool editable = (mode & wxDATAVIEW_CELL_EDITABLE) != 0; + g_object_set (m_renderer, "editable", editable, NULL); - SetAlignment(alignment); + SetAlignment(alignment); - g_signal_connect_after( m_renderer, "edited", G_CALLBACK(wxGtkTextRendererEditedCallback), this ); + g_signal_connect_after( m_renderer, "edited", G_CALLBACK(wxGtkTextRendererEditedCallback), this ); - GtkInitHandlers(); - } - else -#endif - { - // Use custom cell code - wxDataViewCustomRenderer::Init(mode, alignment); - } + GtkInitHandlers(); } bool wxDataViewChoiceRenderer::Render( wxRect rect, wxDC *dc, int state ) @@ -2699,44 +2672,26 @@ wxSize wxDataViewChoiceRenderer::GetSize() const bool wxDataViewChoiceRenderer::SetValue( const wxVariant &value ) { - -#ifdef __WXGTK26__ - if (!gtk_check_version(2,6,0)) - { - GValue gvalue = { 0, }; - g_value_init( &gvalue, G_TYPE_STRING ); - g_value_set_string(&gvalue, - wxGTK_CONV_FONT(value.GetString(), - GetOwner()->GetOwner()->GetFont())); - g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue ); - g_value_unset( &gvalue ); - } - else -#endif - m_data = value.GetString(); + GValue gvalue = { 0, }; + g_value_init( &gvalue, G_TYPE_STRING ); + g_value_set_string(&gvalue, + wxGTK_CONV_FONT(value.GetString(), + GetOwner()->GetOwner()->GetFont())); + g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue ); + g_value_unset( &gvalue ); return true; } bool wxDataViewChoiceRenderer::GetValue( wxVariant &value ) const { -#ifdef __WXGTK26__ - if (!gtk_check_version(2,6,0)) - { - GValue gvalue = { 0, }; - g_value_init( &gvalue, G_TYPE_STRING ); - g_object_get_property( G_OBJECT(m_renderer), "text", &gvalue ); - wxString temp = wxGTK_CONV_BACK_FONT(g_value_get_string(&gvalue), - GetOwner()->GetOwner()->GetFont()); - g_value_unset( &gvalue ); - value = temp; - - //wxPrintf( "temp %s\n", temp ); - // TODO: remove this code - } - else -#endif - value = m_data; + GValue gvalue = { 0, }; + g_value_init( &gvalue, G_TYPE_STRING ); + g_object_get_property( G_OBJECT(m_renderer), "text", &gvalue ); + wxString temp = wxGTK_CONV_BACK_FONT(g_value_get_string(&gvalue), + GetOwner()->GetOwner()->GetFont()); + g_value_unset( &gvalue ); + value = temp; return true; } @@ -2745,8 +2700,10 @@ void wxDataViewChoiceRenderer::SetAlignment( int align ) { wxDataViewCustomRenderer::SetAlignment(align); +#ifndef __WXGTK3__ if (gtk_check_version(2,10,0)) return; +#endif // horizontal alignment: PangoAlignment pangoAlign = PANGO_ALIGN_LEFT; @@ -2836,7 +2793,9 @@ bool wxDataViewIconTextRenderer::SetValue( const wxVariant &value ) m_value << value; SetTextValue(m_value.GetText()); - SetPixbufProp(m_rendererIcon, m_value.GetIcon().GetPixbuf()); + + const wxIcon& icon = m_value.GetIcon(); + SetPixbufProp(m_rendererIcon, icon.IsOk() ? icon.GetPixbuf() : NULL); return true; } @@ -2884,7 +2843,7 @@ gtk_dataview_header_button_press_callback( GtkWidget *WXUNUSED(widget), gs_lastLeftClickHeader = column; wxDataViewCtrl *dv = column->GetOwner(); - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_COLUMN_HEADER_CLICK, dv->GetId() ); event.SetDataViewColumn( column ); event.SetModel( dv->GetModel() ); if (dv->HandleWindowEvent( event )) @@ -2894,7 +2853,7 @@ gtk_dataview_header_button_press_callback( GtkWidget *WXUNUSED(widget), if (gdk_event->button == 3) { wxDataViewCtrl *dv = column->GetOwner(); - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, dv->GetId() ); event.SetDataViewColumn( column ); event.SetModel( dv->GetModel() ); if (dv->HandleWindowEvent( event )) @@ -3030,7 +2989,7 @@ void wxDataViewColumn::Init(wxAlignment align, int flags, int width) SetWidth( width ); // Create container for icon and label - GtkWidget *box = gtk_hbox_new( FALSE, 1 ); + GtkWidget* box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1); gtk_widget_show( box ); // gtk_container_set_border_width((GtkContainer*)box, 2); m_image = gtk_image_new(); @@ -3056,9 +3015,10 @@ void wxDataViewColumn::OnInternalIdle() if (gtk_widget_get_realized(GetOwner()->m_treeview)) { GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column); - if (column->button) + GtkWidget* button = gtk_tree_view_column_get_button(column); + if (button) { - g_signal_connect(column->button, "button_press_event", + g_signal_connect(button, "button_press_event", G_CALLBACK (gtk_dataview_header_button_press_callback), this); // otherwise the event will be blocked by GTK+ @@ -3105,20 +3065,7 @@ void wxDataViewColumn::SetBitmap( const wxBitmap &bitmap ) { GtkImage *gtk_image = GTK_IMAGE(m_image); - GdkBitmap *mask = NULL; - if (bitmap.GetMask()) - mask = bitmap.GetMask()->GetBitmap(); - - if (bitmap.HasPixbuf()) - { - gtk_image_set_from_pixbuf(GTK_IMAGE(gtk_image), - bitmap.GetPixbuf()); - } - else - { - gtk_image_set_from_pixmap(GTK_IMAGE(gtk_image), - bitmap.GetPixmap(), mask); - } + gtk_image_set_from_pixbuf(GTK_IMAGE(gtk_image), bitmap.GetPixbuf()); gtk_widget_show( m_image ); } else @@ -3185,19 +3132,19 @@ void wxDataViewColumn::SetSortable( bool sortable ) bool wxDataViewColumn::IsSortable() const { GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column); - return gtk_tree_view_column_get_clickable( column ); + return gtk_tree_view_column_get_clickable( column ) != 0; } bool wxDataViewColumn::IsSortKey() const { GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column); - return gtk_tree_view_column_get_sort_indicator( column ); + return gtk_tree_view_column_get_sort_indicator( column ) != 0; } bool wxDataViewColumn::IsResizeable() const { GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column); - return gtk_tree_view_column_get_resizable( column ); + return gtk_tree_view_column_get_resizable( column ) != 0; } bool wxDataViewColumn::IsHidden() const @@ -3267,7 +3214,7 @@ void wxDataViewColumn::SetReorderable( bool reorderable ) bool wxDataViewColumn::IsReorderable() const { - return gtk_tree_view_column_get_reorderable( GTK_TREE_VIEW_COLUMN(m_column) ); + return gtk_tree_view_column_get_reorderable( GTK_TREE_VIEW_COLUMN(m_column) ) != 0; } //----------------------------------------------------------------------------- @@ -3421,7 +3368,6 @@ wxDataViewCtrlInternal::wxDataViewCtrlInternal( wxDataViewCtrl *owner, wxDataVie m_owner = owner; m_wx_model = wx_model; - m_gtk_model = NULL; m_root = NULL; m_sort_order = GTK_SORT_ASCENDING; m_sort_column = -1; @@ -3547,7 +3493,7 @@ gboolean wxDataViewCtrlInternal::row_draggable( GtkTreeDragSource *WXUNUSED(drag if ( !item ) return FALSE; - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG, m_owner->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, m_owner->GetId() ); event.SetEventObject( m_owner ); event.SetItem( item ); event.SetModel( m_wx_model ); @@ -3616,7 +3562,7 @@ wxDataViewCtrlInternal::drag_data_received(GtkTreeDragDest *WXUNUSED(drag_dest), if ( !item ) return FALSE; - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DROP, m_owner->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_DROP, m_owner->GetId() ); event.SetEventObject( m_owner ); event.SetItem( item ); event.SetModel( m_wx_model ); @@ -3641,11 +3587,12 @@ wxDataViewCtrlInternal::row_drop_possible(GtkTreeDragDest *WXUNUSED(drag_dest), if ( !item ) return FALSE; - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE, m_owner->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE, m_owner->GetId() ); event.SetEventObject( m_owner ); event.SetItem( item ); event.SetModel( m_wx_model ); event.SetDataFormat(gtk_selection_data_get_target(selection_data)); + event.SetDataSize(gtk_selection_data_get_length(selection_data)); if (!m_owner->HandleWindowEvent( event )) return FALSE; @@ -3763,7 +3710,7 @@ bool wxDataViewCtrlInternal::ItemDeleted( const wxDataViewItem &parent, const wx bool wxDataViewCtrlInternal::ItemChanged( const wxDataViewItem &item ) { - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, m_owner->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, m_owner->GetId() ); event.SetEventObject( m_owner ); event.SetModel( m_owner->GetModel() ); event.SetItem( item ); @@ -3774,7 +3721,7 @@ bool wxDataViewCtrlInternal::ItemChanged( const wxDataViewItem &item ) bool wxDataViewCtrlInternal::ValueChanged( const wxDataViewItem &item, unsigned int view_column ) { - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, m_owner->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, m_owner->GetId() ); event.SetEventObject( m_owner ); event.SetModel( m_owner->GetModel() ); event.SetColumn( view_column ); @@ -4312,7 +4259,7 @@ wxdataview_selection_changed_callback( GtkTreeSelection* WXUNUSED(selection), wx if (!gtk_widget_get_realized(dv->m_widget)) return; - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_SELECTION_CHANGED, dv->GetId() ); event.SetItem( dv->GetSelection() ); event.SetModel( dv->GetModel() ); dv->HandleWindowEvent( event ); @@ -4322,7 +4269,7 @@ static void wxdataview_row_activated_callback( GtkTreeView* WXUNUSED(treeview), GtkTreePath *path, GtkTreeViewColumn *WXUNUSED(column), wxDataViewCtrl *dv ) { - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_ACTIVATED, dv->GetId() ); wxDataViewItem item(dv->GTKPathToItem(path)); event.SetItem( item ); @@ -4334,7 +4281,7 @@ static gboolean wxdataview_test_expand_row_callback( GtkTreeView* WXUNUSED(treeview), GtkTreeIter* iter, GtkTreePath *WXUNUSED(path), wxDataViewCtrl *dv ) { - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_EXPANDING, dv->GetId() ); wxDataViewItem item( (void*) iter->user_data );; event.SetItem( item ); @@ -4348,7 +4295,7 @@ static void wxdataview_row_expanded_callback( GtkTreeView* WXUNUSED(treeview), GtkTreeIter* iter, GtkTreePath *WXUNUSED(path), wxDataViewCtrl *dv ) { - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_EXPANDED, dv->GetId() ); wxDataViewItem item( (void*) iter->user_data );; event.SetItem( item ); @@ -4360,7 +4307,7 @@ static gboolean wxdataview_test_collapse_row_callback( GtkTreeView* WXUNUSED(treeview), GtkTreeIter* iter, GtkTreePath *WXUNUSED(path), wxDataViewCtrl *dv ) { - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_COLLAPSING, dv->GetId() ); wxDataViewItem item( (void*) iter->user_data );; event.SetItem( item ); @@ -4374,7 +4321,7 @@ static void wxdataview_row_collapsed_callback( GtkTreeView* WXUNUSED(treeview), GtkTreeIter* iter, GtkTreePath *WXUNUSED(path), wxDataViewCtrl *dv ) { - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_COLLAPSED, dv->GetId() ); wxDataViewItem item( (void*) iter->user_data );; event.SetItem( item ); @@ -4408,7 +4355,7 @@ void gtk_dataviewctrl_size_callback( GtkWidget *WXUNUSED(widget), wxWindow *child = node->GetData(); GtkRequisition req; - gtk_widget_size_request( child->m_widget, &req ); + gtk_widget_get_preferred_size(child->m_widget, NULL, &req); GtkAllocation alloc; alloc.x = child->m_x; @@ -4431,14 +4378,15 @@ gtk_dataview_motion_notify_callback( GtkWidget *WXUNUSED(widget), GdkEventMotion *gdk_event, wxDataViewCtrl *dv ) { + int x = gdk_event->x; + int y = gdk_event->y; if (gdk_event->is_hint) { - int x = 0; - int y = 0; - GdkModifierType state; - gdk_window_get_pointer(gdk_event->window, &x, &y, &state); - gdk_event->x = x; - gdk_event->y = y; +#ifdef __WXGTK3__ + gdk_window_get_device_position(gdk_event->window, gdk_event->device, &x, &y, NULL); +#else + gdk_window_get_pointer(gdk_event->window, &x, &y, NULL); +#endif } wxGtkTreePath path; @@ -4447,7 +4395,7 @@ gtk_dataview_motion_notify_callback( GtkWidget *WXUNUSED(widget), gint cell_y = 0; if (gtk_tree_view_get_path_at_pos( GTK_TREE_VIEW(dv->GtkGetTreeView()), - (int) gdk_event->x, (int) gdk_event->y, + x, y, path.ByRef(), &column, &cell_x, @@ -4489,7 +4437,7 @@ gtk_dataview_button_press_callback( GtkWidget *WXUNUSED(widget), &cell_y ); - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, dv->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, dv->GetId() ); if (path) event.SetItem(dv->GTKPathToItem(path)); event.SetModel( dv->GetModel() ); @@ -4517,6 +4465,11 @@ wxDataViewCtrl::~wxDataViewCtrl() // This won't do anything if we're not editing it wxcol->GetRenderer()->CancelEditing(); } + + GTKDisconnect(m_treeview); + GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(m_treeview)); + if (selection) + GTKDisconnect(selection); } m_cols.Clear(); @@ -4526,6 +4479,7 @@ wxDataViewCtrl::~wxDataViewCtrl() void wxDataViewCtrl::Init() { + m_treeview = NULL; m_internal = NULL; m_cols.DeleteContents( true ); @@ -4561,13 +4515,8 @@ bool wxDataViewCtrl::Create(wxWindow *parent, g_signal_connect (m_treeview, "size_allocate", G_CALLBACK (gtk_dataviewctrl_size_callback), this); -#ifdef __WXGTK26__ - if (!gtk_check_version(2,6,0)) - { - bool fixed = (style & wxDV_VARIABLE_LINE_HEIGHT) == 0; - gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), fixed ); - } -#endif + bool fixed = (style & wxDV_VARIABLE_LINE_HEIGHT) == 0; + gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), fixed ); if (style & wxDV_MULTIPLE) { @@ -4578,7 +4527,9 @@ bool wxDataViewCtrl::Create(wxWindow *parent, gtk_tree_view_set_headers_visible( GTK_TREE_VIEW(m_treeview), (style & wxDV_NO_HEADER) == 0 ); #ifdef __WXGTK210__ +#ifndef __WXGTK3__ if (!gtk_check_version(2,10,0)) +#endif { GtkTreeViewGridLines grid = GTK_TREE_VIEW_GRID_LINES_NONE; @@ -4671,13 +4622,8 @@ bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model ) if (!wxDataViewCtrlBase::AssociateModel( model )) return false; -#ifdef __WXGTK26__ - if (!gtk_check_version(2,6,0)) - { - bool fixed = (((GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) == 0) || (model->IsVirtualListModel())); - gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), fixed ); - } -#endif + bool fixed = (((GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) == 0) || (model->IsVirtualListModel())); + gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), fixed ); m_internal = new wxDataViewCtrlInternal( this, model ); @@ -4701,14 +4647,11 @@ bool wxDataViewCtrl::AppendColumn( wxDataViewColumn *col ) m_cols.Append( col ); -#ifdef __WXGTK26__ - if (!gtk_check_version(2,6,0)) + if (gtk_tree_view_column_get_sizing( GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) ) != + GTK_TREE_VIEW_COLUMN_FIXED) { - if (gtk_tree_view_column_get_sizing( GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) ) != - GTK_TREE_VIEW_COLUMN_FIXED) - gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), FALSE ); + gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), FALSE ); } -#endif gtk_tree_view_append_column( GTK_TREE_VIEW(m_treeview), GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) ); @@ -4723,14 +4666,11 @@ bool wxDataViewCtrl::PrependColumn( wxDataViewColumn *col ) m_cols.Insert( col ); -#ifdef __WXGTK26__ - if (!gtk_check_version(2,6,0)) + if (gtk_tree_view_column_get_sizing( GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) ) != + GTK_TREE_VIEW_COLUMN_FIXED) { - if (gtk_tree_view_column_get_sizing( GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) ) != - GTK_TREE_VIEW_COLUMN_FIXED) - gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), FALSE ); + gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), FALSE ); } -#endif gtk_tree_view_insert_column( GTK_TREE_VIEW(m_treeview), GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()), 0 ); @@ -4745,14 +4685,11 @@ bool wxDataViewCtrl::InsertColumn( unsigned int pos, wxDataViewColumn *col ) m_cols.Insert( pos, col ); -#ifdef __WXGTK26__ - if (!gtk_check_version(2,6,0)) + if (gtk_tree_view_column_get_sizing( GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) ) != + GTK_TREE_VIEW_COLUMN_FIXED) { - if (gtk_tree_view_column_get_sizing( GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) ) != - GTK_TREE_VIEW_COLUMN_FIXED) - gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), FALSE ); + gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), FALSE ); } -#endif gtk_tree_view_insert_column( GTK_TREE_VIEW(m_treeview), GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()), pos ); @@ -4852,7 +4789,7 @@ bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const GtkTreeIter iter; iter.user_data = item.GetID(); wxGtkTreePath path(m_internal->get_path( &iter )); - return gtk_tree_view_row_expanded( GTK_TREE_VIEW(m_treeview), path ); + return gtk_tree_view_row_expanded( GTK_TREE_VIEW(m_treeview), path ) != 0; } wxDataViewItem wxDataViewCtrl::DoGetCurrentItem() const @@ -4892,18 +4829,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 @@ -5024,7 +4974,7 @@ bool wxDataViewCtrl::IsSelected( const wxDataViewItem & item ) const iter.stamp = m_internal->GetGtkModel()->stamp; iter.user_data = (gpointer) item.GetID(); - return gtk_tree_selection_iter_is_selected( selection, &iter ); + return gtk_tree_selection_iter_is_selected( selection, &iter ) != 0; } void wxDataViewCtrl::SelectAll() @@ -5069,7 +5019,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; @@ -5077,8 +5028,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 @@ -5156,13 +5107,13 @@ void wxDataViewCtrl::GtkEnableSelectionEvents() wxVisualAttributes wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) { - return GetDefaultAttributesFromGTKWidget(gtk_tree_view_new); + return GetDefaultAttributesFromGTKWidget(gtk_tree_view_new()); } void wxDataViewCtrl::DoApplyWidgetStyle(GtkRcStyle *style) { wxDataViewCtrlBase::DoApplyWidgetStyle(style); - gtk_widget_modify_style(m_treeview, style); + GTKApplyStyle(m_treeview, style); } #endif // !wxUSE_GENERICDATAVIEWCTRL