X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9330d5afb6550c058ba3381a193f2ccaa66097c4..0738b901b17340f09766524b8d9d79e9ed1268e7:/src/gtk/dataview.cpp diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 0110325a42..a35bbbd9f8 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -540,7 +540,7 @@ wxgtk_tree_model_get_column_type (GtkTreeModel *tree_model, else { gtype = G_TYPE_STRING; - // wxFAIL_MSG( _T("non-string columns not supported yet") ); + // wxFAIL_MSG( wxT("non-string columns not supported yet") ); } return gtype; @@ -591,7 +591,7 @@ wxgtk_tree_model_get_value (GtkTreeModel *tree_model, } else { - wxFAIL_MSG( _T("non-string columns not supported yet") ); + wxFAIL_MSG( wxT("non-string columns not supported yet") ); } } @@ -601,9 +601,8 @@ wxgtk_tree_model_iter_next (GtkTreeModel *tree_model, { GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model; - //if (wxtree_model->stamp != iter->stamp) - // wxPrintf( "crash\n" ); - // TODO: remove this code + // This happens when clearing the view by calling .._set_model( NULL ); + if (iter->stamp == 0) return FALSE; g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), FALSE); g_return_val_if_fail (wxtree_model->stamp == iter->stamp, FALSE); @@ -639,7 +638,7 @@ wxgtk_tree_model_iter_n_children (GtkTreeModel *tree_model, GtkTreeIter *iter) { GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model; - g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), FALSE); + g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), 0); g_return_val_if_fail ( !iter || wxtree_model->stamp == iter->stamp, 0); return wxtree_model->internal->iter_n_children( iter ); @@ -854,7 +853,7 @@ typedef struct _GtkWxCellRendererTextClass GtkWxCellRendererTextClass; struct _GtkWxCellRendererText { GtkCellRendererText parent; - + wxDataViewRenderer *wx_renderer; }; @@ -970,7 +969,7 @@ static GtkCellEditable *gtk_wx_cell_renderer_text_start_editing( event.SetColumn( wx_renderer->GetOwner()->GetModelColumn() ); event.SetItem( item ); dv->HandleWindowEvent( event ); - + if (event.IsAllowed()) return GTK_CELL_RENDERER_CLASS(text_cell_parent_class)-> start_editing( gtk_renderer, gdk_event, widget, path, background_area, cell_area, flags ); @@ -1489,16 +1488,9 @@ bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsig bool wxGtkDataViewModelNotifier::Cleared() { - gtk_tree_view_set_model( GTK_TREE_VIEW(m_owner->m_treeview), NULL ); - - // this will create a new GTK model m_owner->GtkGetInternal()->Cleared(); - SetGtkModel( m_owner->GtkGetInternal()->GetGtkModel() ); - - gtk_tree_view_set_model( GTK_TREE_VIEW(m_owner->m_treeview), GTK_TREE_MODEL(m_wxgtk_model) ); - - return false; + return true; } // --------------------------------------------------------- @@ -1561,17 +1553,25 @@ wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype, wxDataViewC { m_renderer = NULL; + // we haven't changed them yet + m_usingDefaultAttrs = true; + // NOTE: SetMode() and SetAlignment() needs to be called in the renderer's ctor, // after the m_renderer pointer has been initialized } +void wxDataViewRenderer::GtkPackIntoColumn(GtkTreeViewColumn *column) +{ + gtk_tree_view_column_pack_end( column, m_renderer, TRUE /* expand */); +} + void wxDataViewRenderer::GtkInitHandlers() { if (!gtk_check_version(2,6,0)) { g_signal_connect (GTK_CELL_RENDERER(m_renderer), "editing_started", - G_CALLBACK (wxgtk_renderer_editing_started), - this); + G_CALLBACK (wxgtk_renderer_editing_started), + this); } } @@ -1691,37 +1691,76 @@ int wxDataViewRenderer::GetAlignment() const return m_alignment; } -// --------------------------------------------------------- -// wxDataViewTextRenderer -// --------------------------------------------------------- +void wxDataViewRenderer::EnableEllipsize(wxEllipsizeMode mode) +{ + if ( gtk_check_version(2, 6, 0) != NULL ) + return; -extern "C" { -static void wxGtkTextRendererEditedCallback( GtkCellRendererText *renderer, - gchar *arg1, gchar *arg2, gpointer user_data ); + // we use the same values in wxEllipsizeMode as PangoEllipsizeMode so we + // can just cast between them + GValue gvalue = { 0, }; + g_value_init( &gvalue, PANGO_TYPE_ELLIPSIZE_MODE ); + g_value_set_enum( &gvalue, static_cast(mode) ); + g_object_set_property( G_OBJECT(m_renderer), "ellipsize", &gvalue ); + g_value_unset( &gvalue ); } -static void wxGtkTextRendererEditedCallback( GtkCellRendererText *WXUNUSED(renderer), - gchar *arg1, gchar *arg2, gpointer user_data ) +wxEllipsizeMode wxDataViewRenderer::GetEllipsizeMode() const { - wxDataViewRenderer *cell = (wxDataViewRenderer*) user_data; + if ( gtk_check_version(2, 6, 0) != NULL ) + return wxELLIPSIZE_NONE; - wxString tmp = wxGTK_CONV_BACK_FONT(arg2, cell->GetOwner()->GetOwner()->GetFont()); - wxVariant value = tmp; - if (!cell->Validate( value )) - return; + GValue gvalue = { 0, }; + g_value_init( &gvalue, PANGO_TYPE_ELLIPSIZE_MODE ); + g_object_get_property( G_OBJECT(m_renderer), "ellipsize", &gvalue ); + wxEllipsizeMode + mode = static_cast(g_value_get_enum( &gvalue )); + g_value_unset( &gvalue ); - wxDataViewModel *model = cell->GetOwner()->GetOwner()->GetModel(); + return mode; +} - GtkTreePath *path = gtk_tree_path_new_from_string( arg1 ); +void +wxDataViewRenderer::GtkOnTextEdited(const gchar *itempath, const wxString& str) +{ + wxVariant value(str); + if (!Validate( value )) + return; + + GtkTreePath *path = gtk_tree_path_new_from_string( itempath ); GtkTreeIter iter; - cell->GetOwner()->GetOwner()->GtkGetInternal()->get_iter( &iter, path ); + GetOwner()->GetOwner()->GtkGetInternal()->get_iter( &iter, path ); wxDataViewItem item( (void*) iter.user_data );; gtk_tree_path_free( path ); - unsigned int model_col = cell->GetOwner()->GetModelColumn(); + GtkOnCellChanged(value, item, GetOwner()->GetModelColumn()); +} + +void +wxDataViewRenderer::GtkOnCellChanged(const wxVariant& value, + const wxDataViewItem& item, + unsigned col) +{ + wxDataViewModel *model = GetOwner()->GetOwner()->GetModel(); + model->ChangeValue( value, item, col ); +} + +// --------------------------------------------------------- +// wxDataViewTextRenderer +// --------------------------------------------------------- + +extern "C" +{ + +static void wxGtkTextRendererEditedCallback( GtkCellRendererText *WXUNUSED(renderer), + gchar *arg1, gchar *arg2, gpointer user_data ) +{ + wxDataViewRenderer *cell = (wxDataViewRenderer*) user_data; + + cell->GtkOnTextEdited(arg1, wxGTK_CONV_BACK_FONT( + arg2, cell->GetOwner()->GetOwner()->GetFont())); +} - model->SetValue( value, item, model_col ); - model->ValueChanged( item, model_col ); } IMPLEMENT_CLASS(wxDataViewTextRenderer, wxDataViewRenderer) @@ -1751,29 +1790,25 @@ wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxD SetAlignment(align); } -bool wxDataViewTextRenderer::SetValue( const wxVariant &value ) +bool wxDataViewTextRenderer::SetTextValue(const wxString& str) { - wxString tmp = value; - GValue gvalue = { 0, }; g_value_init( &gvalue, G_TYPE_STRING ); - g_value_set_string( &gvalue, wxGTK_CONV_FONT( tmp, GetOwner()->GetOwner()->GetFont() ) ); + g_value_set_string( &gvalue, wxGTK_CONV_FONT( str, GetOwner()->GetOwner()->GetFont() ) ); g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue ); g_value_unset( &gvalue ); return true; } -bool wxDataViewTextRenderer::GetValue( wxVariant &value ) const +bool wxDataViewTextRenderer::GetTextValue(wxString& str) const { GValue gvalue = { 0, }; g_value_init( &gvalue, G_TYPE_STRING ); g_object_get_property( G_OBJECT(m_renderer), "text", &gvalue ); - wxString tmp = wxGTK_CONV_BACK_FONT( g_value_get_string( &gvalue ), const_cast(this)->GetOwner()->GetOwner()->GetFont() ); + str = wxGTK_CONV_BACK_FONT( g_value_get_string( &gvalue ), const_cast(this)->GetOwner()->GetOwner()->GetFont() ); g_value_unset( &gvalue ); - value = tmp; - return true; } @@ -1799,20 +1834,23 @@ void wxDataViewTextRenderer::SetAlignment( int align ) } // --------------------------------------------------------- -// wxDataViewTextRendererAttr +// wxDataViewBitmapRenderer // --------------------------------------------------------- -IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer) +namespace +{ -wxDataViewTextRendererAttr::wxDataViewTextRendererAttr( const wxString &varianttype, - wxDataViewCellMode mode, int align ) : - wxDataViewTextRenderer( varianttype, mode, align ) +// set "pixbuf" property on the given renderer +void SetPixbufProp(GtkCellRenderer *renderer, GdkPixbuf *pixbuf) { + GValue gvalue = { 0, }; + g_value_init( &gvalue, G_TYPE_OBJECT ); + g_value_set_object( &gvalue, pixbuf ); + g_object_set_property( G_OBJECT(renderer), "pixbuf", &gvalue ); + g_value_unset( &gvalue ); } -// --------------------------------------------------------- -// wxDataViewBitmapRenderer -// --------------------------------------------------------- +} // anonymous namespace IMPLEMENT_CLASS(wxDataViewBitmapRenderer, wxDataViewRenderer) @@ -1820,7 +1858,7 @@ wxDataViewBitmapRenderer::wxDataViewBitmapRenderer( const wxString &varianttype, int align ) : wxDataViewRenderer( varianttype, mode, align ) { - m_renderer = (GtkCellRenderer*) gtk_cell_renderer_pixbuf_new(); + m_renderer = gtk_cell_renderer_pixbuf_new(); SetMode(mode); SetAlignment(align); @@ -1833,38 +1871,23 @@ bool wxDataViewBitmapRenderer::SetValue( const wxVariant &value ) wxBitmap bitmap; bitmap << value; - // This may create a Pixbuf representation in the - // wxBitmap object (and it will stay there) - GdkPixbuf *pixbuf = bitmap.GetPixbuf(); - - GValue gvalue = { 0, }; - g_value_init( &gvalue, G_TYPE_OBJECT ); - g_value_set_object( &gvalue, pixbuf ); - g_object_set_property( G_OBJECT(m_renderer), "pixbuf", &gvalue ); - g_value_unset( &gvalue ); - - return true; + // GetPixbuf() may create a Pixbuf representation in the wxBitmap + // object (and it will stay there and remain owned by wxBitmap) + SetPixbufProp(m_renderer, bitmap.GetPixbuf()); } - - if (value.GetType() == wxT("wxIcon")) + else if (value.GetType() == wxT("wxIcon")) { - wxIcon bitmap; - bitmap << value; + wxIcon icon; + icon << value; - // This may create a Pixbuf representation in the - // wxBitmap object (and it will stay there) - GdkPixbuf *pixbuf = bitmap.GetPixbuf(); - - GValue gvalue = { 0, }; - g_value_init( &gvalue, G_TYPE_OBJECT ); - g_value_set_object( &gvalue, pixbuf ); - g_object_set_property( G_OBJECT(m_renderer), "pixbuf", &gvalue ); - g_value_unset( &gvalue ); - - return true; + SetPixbufProp(m_renderer, icon.GetPixbuf()); + } + else + { + return false; } - return false; + return true; } bool wxDataViewBitmapRenderer::GetValue( wxVariant &WXUNUSED(value) ) const @@ -1909,8 +1932,7 @@ static void wxGtkToggleRendererToggledCallback( GtkCellRendererToggle *renderer, unsigned int model_col = cell->GetOwner()->GetModelColumn(); - model->SetValue( value, item, model_col ); - model->ValueChanged( item, model_col ); + model->ChangeValue( value, item, model_col ); } IMPLEMENT_CLASS(wxDataViewToggleRenderer, wxDataViewRenderer) @@ -2347,10 +2369,7 @@ END_EVENT_TABLE() void wxDataViewDateRendererPopupTransient::OnCalendar( wxCalendarEvent &event ) { - wxDateTime date = event.GetDate(); - wxVariant value = date; - m_model->SetValue( value, m_item, m_col ); - m_model->ValueChanged( m_item, m_col ); + m_model->ChangeValue( event.GetDate(), m_item, m_col ); DismissAndNotify(); } @@ -2416,67 +2435,63 @@ bool wxDataViewDateRenderer::Activate( wxRect WXUNUSED(cell), wxDataViewModel *m IMPLEMENT_CLASS(wxDataViewIconTextRenderer, wxDataViewCustomRenderer) -wxDataViewIconTextRenderer::wxDataViewIconTextRenderer( - const wxString &varianttype, wxDataViewCellMode mode, int align ) : - wxDataViewCustomRenderer( varianttype, mode, align ) +wxDataViewIconTextRenderer::wxDataViewIconTextRenderer + ( + const wxString &varianttype, + wxDataViewCellMode mode, + int align + ) + : wxDataViewTextRenderer(varianttype, mode, align) { - SetMode(mode); - SetAlignment(align); + m_rendererIcon = gtk_cell_renderer_pixbuf_new(); } wxDataViewIconTextRenderer::~wxDataViewIconTextRenderer() { } -bool wxDataViewIconTextRenderer::SetValue( const wxVariant &value ) +void wxDataViewIconTextRenderer::GtkPackIntoColumn(GtkTreeViewColumn *column) { - m_value << value; - return true; -} + // add the icon renderer first + gtk_tree_view_column_pack_start(column, m_rendererIcon, FALSE /* !expand */); -bool wxDataViewIconTextRenderer::GetValue( wxVariant &WXUNUSED(value) ) const -{ - return false; + // add the text renderer too + wxDataViewRenderer::GtkPackIntoColumn(column); } -bool wxDataViewIconTextRenderer::Render( wxRect cell, wxDC *dc, int state ) +bool wxDataViewIconTextRenderer::SetValue( const wxVariant &value ) { - const wxIcon &icon = m_value.GetIcon(); - int offset = 0; - if (icon.IsOk()) - { - int yoffset = wxMax( 0, (cell.height - icon.GetHeight()) / 2 ); - dc->DrawIcon( icon, cell.x, cell.y + yoffset ); - offset = icon.GetWidth() + 4; - } + m_value << value; - RenderText( m_value.GetText(), offset, cell, dc, state ); + SetTextValue(m_value.GetText()); + SetPixbufProp(m_rendererIcon, m_value.GetIcon().GetPixbuf()); return true; } -wxSize wxDataViewIconTextRenderer::GetSize() const +bool wxDataViewIconTextRenderer::GetValue(wxVariant& value) const { - wxSize size; - if (m_value.GetIcon().IsOk()) - size.x = 4 + m_value.GetIcon().GetWidth(); - wxCoord x,y,d; - GetView()->GetTextExtent( m_value.GetText(), &x, &y, &d ); - size.x += x; - size.y = y+d; - return size; -} + wxString str; + if ( !GetTextValue(str) ) + return false; -wxControl* wxDataViewIconTextRenderer::CreateEditorCtrl( - wxWindow *WXUNUSED(parent), wxRect WXUNUSED(labelRect), const wxVariant &WXUNUSED(value) ) -{ - return NULL; + // user doesn't have any way to edit the icon so leave it unchanged + value << wxDataViewIconText(str, m_value.GetIcon()); + + return true; } -bool wxDataViewIconTextRenderer::GetValueFromEditorCtrl( - wxControl* WXUNUSED(editor), wxVariant &WXUNUSED(value) ) +void +wxDataViewIconTextRenderer::GtkOnCellChanged(const wxVariant& value, + const wxDataViewItem& item, + unsigned col) { - return false; + // we receive just the text part of our value as it's the only one which + // can be edited, but we need the full wxDataViewIconText value for the + // model + wxVariant valueIconText; + valueIconText << wxDataViewIconText(value.GetString(), m_value.GetIcon()); + wxDataViewTextRenderer::GtkOnCellChanged(valueIconText, item, col); } // --------------------------------------------------------- @@ -2517,14 +2532,8 @@ gtk_dataview_header_button_press_callback( GtkWidget *WXUNUSED(widget), return FALSE; } -extern "C" { -static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column, - GtkCellRenderer *cell, - GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data ); -} - +extern "C" +{ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column), GtkCellRenderer *renderer, @@ -2543,122 +2552,109 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column), if (!wx_model->IsVirtualListModel()) { - - if (wx_model->IsContainer( item )) - { - if (wx_model->HasContainerColumns( item ) || (cell->GetOwner()->GetModelColumn() == 0)) + gboolean visible; + if (wx_model->IsContainer( item )) { - GValue gvalue = { 0, }; - g_value_init( &gvalue, G_TYPE_BOOLEAN ); - g_value_set_boolean( &gvalue, TRUE ); - g_object_set_property( G_OBJECT(renderer), "visible", &gvalue ); - g_value_unset( &gvalue ); + visible = wx_model->HasContainerColumns( item ) || + (cell->GetOwner()->GetModelColumn() == 0); } else { - GValue gvalue = { 0, }; - g_value_init( &gvalue, G_TYPE_BOOLEAN ); - g_value_set_boolean( &gvalue, FALSE ); - g_object_set_property( G_OBJECT(renderer), "visible", &gvalue ); - g_value_unset( &gvalue ); - - return; + visible = true; } - } - else - { + GValue gvalue = { 0, }; g_value_init( &gvalue, G_TYPE_BOOLEAN ); - g_value_set_boolean( &gvalue, TRUE ); + g_value_set_boolean( &gvalue, visible ); g_object_set_property( G_OBJECT(renderer), "visible", &gvalue ); g_value_unset( &gvalue ); - } + if ( !visible ) + return; } wxVariant value; wx_model->GetValue( value, item, cell->GetOwner()->GetModelColumn() ); if (value.GetType() != cell->GetVariantType()) + { wxLogError( wxT("Wrong type, required: %s but: %s"), value.GetType().c_str(), cell->GetVariantType().c_str() ); + } cell->SetValue( value ); - if (cell->GtkHasAttributes()) - { - wxDataViewItemAttr attr; - bool colour_set = false; - bool style_set = false; - bool weight_set = false; - if (wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr )) - { - // this must be a GtkCellRendererText - wxColour colour = attr.GetColour(); - if (colour.IsOk()) - { - const GdkColor * const gcol = colour.GetColor(); - - GValue gvalue = { 0, }; - g_value_init( &gvalue, GDK_TYPE_COLOR ); - g_value_set_boxed( &gvalue, gcol ); - g_object_set_property( G_OBJECT(renderer), "foreground_gdk", &gvalue ); - g_value_unset( &gvalue ); + // deal with attributes + wxDataViewItemAttr attr; + if ( !wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr ) + && cell->GtkIsUsingDefaultAttrs() ) + { + // no custom attributes specified and we're already using the default + // ones -- nothing to do + return; + } - colour_set = true; - } + bool usingDefaultAttrs = true; + if (attr.HasColour()) + { + const GdkColor * const gcol = attr.GetColour().GetColor(); - if (attr.GetItalic()) - { - GValue gvalue = { 0, }; - g_value_init( &gvalue, PANGO_TYPE_STYLE ); - g_value_set_enum( &gvalue, PANGO_STYLE_ITALIC ); - g_object_set_property( G_OBJECT(renderer), "style", &gvalue ); - g_value_unset( &gvalue ); + GValue gvalue = { 0, }; + g_value_init( &gvalue, GDK_TYPE_COLOR ); + g_value_set_boxed( &gvalue, gcol ); + g_object_set_property( G_OBJECT(renderer), "foreground_gdk", &gvalue ); + g_value_unset( &gvalue ); - style_set = true; - } + usingDefaultAttrs = false; + } + else + { + GValue gvalue = { 0, }; + g_value_init( &gvalue, G_TYPE_BOOLEAN ); + g_value_set_boolean( &gvalue, FALSE ); + g_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue ); + g_value_unset( &gvalue ); + } - if (attr.GetBold()) - { - GValue gvalue = { 0, }; - g_value_init( &gvalue, PANGO_TYPE_WEIGHT ); - g_value_set_enum( &gvalue, PANGO_WEIGHT_BOLD ); - g_object_set_property( G_OBJECT(renderer), "weight", &gvalue ); - g_value_unset( &gvalue ); + if (attr.GetItalic()) + { + GValue gvalue = { 0, }; + g_value_init( &gvalue, PANGO_TYPE_STYLE ); + g_value_set_enum( &gvalue, PANGO_STYLE_ITALIC ); + g_object_set_property( G_OBJECT(renderer), "style", &gvalue ); + g_value_unset( &gvalue ); - weight_set = true; - } - } + usingDefaultAttrs = false; + } + else + { + GValue gvalue = { 0, }; + g_value_init( &gvalue, G_TYPE_BOOLEAN ); + g_value_set_boolean( &gvalue, FALSE ); + g_object_set_property( G_OBJECT(renderer), "style-set", &gvalue ); + g_value_unset( &gvalue ); + } - if (!style_set) - { - GValue gvalue = { 0, }; - g_value_init( &gvalue, G_TYPE_BOOLEAN ); - g_value_set_boolean( &gvalue, FALSE ); - g_object_set_property( G_OBJECT(renderer), "style-set", &gvalue ); - g_value_unset( &gvalue ); - } - if (!weight_set) - { - GValue gvalue = { 0, }; - g_value_init( &gvalue, G_TYPE_BOOLEAN ); - g_value_set_boolean( &gvalue, FALSE ); - g_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue ); - g_value_unset( &gvalue ); - } + if (attr.GetBold()) + { + GValue gvalue = { 0, }; + g_value_init( &gvalue, PANGO_TYPE_WEIGHT ); + g_value_set_enum( &gvalue, PANGO_WEIGHT_BOLD ); + g_object_set_property( G_OBJECT(renderer), "weight", &gvalue ); + g_value_unset( &gvalue ); - if (!colour_set) - { - GValue gvalue = { 0, }; - g_value_init( &gvalue, G_TYPE_BOOLEAN ); - g_value_set_boolean( &gvalue, FALSE ); - g_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue ); - g_value_unset( &gvalue ); - } + usingDefaultAttrs = false; + } + else + { + GValue gvalue = { 0, }; + g_value_init( &gvalue, G_TYPE_BOOLEAN ); + g_value_set_boolean( &gvalue, FALSE ); + g_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue ); + g_value_unset( &gvalue ); } #if 0 @@ -2683,8 +2679,11 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column), } #endif + cell->GtkSetUsingDefaultAttrs(usingDefaultAttrs); } +} // extern "C" + #include WX_DEFINE_LIST(wxDataViewColumnList) @@ -2712,7 +2711,6 @@ void wxDataViewColumn::Init(wxAlignment align, int flags, int width) { m_isConnected = false; - GtkCellRenderer *renderer = (GtkCellRenderer *) GetRenderer()->GetGtkHandle(); GtkTreeViewColumn *column = gtk_tree_view_column_new(); m_column = (GtkWidget*) column; @@ -2731,10 +2729,13 @@ void wxDataViewColumn::Init(wxAlignment align, int flags, int width) gtk_box_pack_end( GTK_BOX(box), GTK_WIDGET(m_label), FALSE, FALSE, 1 ); gtk_tree_view_column_set_widget( column, box ); - gtk_tree_view_column_pack_end( column, renderer, TRUE ); + wxDataViewRenderer * const colRenderer = GetRenderer(); + GtkCellRenderer * const cellRenderer = colRenderer->GetGtkHandle(); + + colRenderer->GtkPackIntoColumn(column); - gtk_tree_view_column_set_cell_data_func( column, renderer, - wxGtkTreeCellDataFunc, (gpointer) GetRenderer(), NULL ); + gtk_tree_view_column_set_cell_data_func( column, cellRenderer, + wxGtkTreeCellDataFunc, (gpointer) colRenderer, NULL ); } void wxDataViewColumn::OnInternalIdle() @@ -3031,10 +3032,10 @@ void wxGtkTreeModelNode::Resort() // Sort the ptrs gs_internal = m_internal; ptrs.Sort( &wxGtkTreeModelChildPtrCmp ); - + wxGtkTreeModelChildren temp; void** base_ptr = &(m_children[0]); - // Transfer positions to new_order array and + // Transfer positions to new_order array and // IDs to temp for (i = 0; i < child_count; i++) { @@ -3074,13 +3075,13 @@ void wxGtkTreeModelNode::Resort() #if 0 // Too slow - + wxGtkTreeModelChildren temp; WX_APPEND_ARRAY( temp, m_children ); gs_internal = m_internal; m_children.Sort( &wxGtkTreeModelChildCmp ); - + unsigned int pos; for (pos = 0; pos < child_count; pos++) { @@ -3103,7 +3104,7 @@ void wxGtkTreeModelNode::Resort() gtk_tree_path_free (path); delete [] new_order; - + unsigned int pos; for (pos = 0; pos < node_count; pos++) { @@ -3320,17 +3321,16 @@ wxDataViewCtrlInternal::row_drop_possible(GtkTreeDragDest *WXUNUSED(drag_dest), bool wxDataViewCtrlInternal::Cleared() { + GtkWidget* tree_widget = GetOwner()->GtkGetTreeView(); + gtk_tree_view_set_model( GTK_TREE_VIEW(tree_widget), NULL ); + gtk_tree_view_set_model( GTK_TREE_VIEW(tree_widget), GTK_TREE_MODEL(m_gtk_model) ); + if (m_root) { delete m_root; InitTree(); } - // Create new GTK model - g_object_unref( m_gtk_model ); - m_gtk_model = wxgtk_tree_model_new(); - m_gtk_model->internal = this; - return true; } @@ -3411,9 +3411,9 @@ gboolean wxDataViewCtrlInternal::get_iter( GtkTreeIter *iter, GtkTreePath *path if (m_wx_model->IsVirtualListModel()) { wxDataViewVirtualListModel *wx_model = (wxDataViewVirtualListModel*) m_wx_model; - + unsigned int i = (unsigned int)gtk_tree_path_get_indices (path)[0]; - + if (i >= wx_model->GetCount()) return FALSE; @@ -3503,10 +3503,16 @@ gboolean wxDataViewCtrlInternal::iter_next( GtkTreeIter *iter ) int n = ( (wxUIntPtr) iter->user_data ) -1; if (n == -1) + { + iter->user_data = NULL; return FALSE; + } - if (n >= (int) wx_model->GetCount()) + if (n >= (int) wx_model->GetCount()-1) + { + iter->user_data = NULL; return FALSE; + } // user_data is just the index +1 (+2 because we need the next) iter->user_data = (gpointer) (n+2); @@ -3515,14 +3521,19 @@ gboolean wxDataViewCtrlInternal::iter_next( GtkTreeIter *iter ) { wxGtkTreeModelNode *parent = FindParentNode( iter ); if( parent == NULL ) + { + iter->user_data = NULL; return FALSE; + } int pos = parent->GetChildren().Index( iter->user_data ); if (pos == (int) parent->GetChildCount()-1) + { + iter->user_data = NULL; return FALSE; + } - iter->stamp = m_gtk_model->stamp; iter->user_data = parent->GetChildren().Item( pos+1 ); } @@ -3544,6 +3555,14 @@ gboolean wxDataViewCtrlInternal::iter_children( GtkTreeIter *iter, GtkTreeIter * } else { + if (iter == NULL) + { + if (m_root->GetChildCount() == 0) return FALSE; + iter->stamp = m_gtk_model->stamp; + iter->user_data = (gpointer) m_root->GetChildren().Item( 0 ); + return TRUE; + } + wxDataViewItem item( (void*) parent->user_data ); if (!m_wx_model->IsContainer( item )) @@ -3572,13 +3591,16 @@ gboolean wxDataViewCtrlInternal::iter_has_child( GtkTreeIter *iter ) wxDataViewVirtualListModel *wx_model = (wxDataViewVirtualListModel*) m_wx_model; if (iter == NULL) - return (gint) wx_model->GetCount(); - + return (wx_model->GetCount() > 0); + // this is a list, nodes have no children return FALSE; } else { + if (iter == NULL) + return (m_root->GetChildCount() > 0); + wxDataViewItem item( (void*) iter->user_data ); bool is_container = m_wx_model->IsContainer( item ); @@ -3623,8 +3645,6 @@ gint wxDataViewCtrlInternal::iter_n_children( GtkTreeIter *iter ) BuildBranch( parent_node ); - // wxPrintf( "iter_n_children %d\n", parent_node->GetChildCount() ); - return parent_node->GetChildCount(); } } @@ -3665,8 +3685,6 @@ gboolean wxDataViewCtrlInternal::iter_nth_child( GtkTreeIter *iter, GtkTreeIter BuildBranch( parent_node ); - // wxPrintf( "iter_nth_child %d\n", n ); - iter->stamp = m_gtk_model->stamp; iter->user_data = parent_node->GetChildren().Item( n ); @@ -4015,8 +4033,6 @@ gtk_dataview_motion_notify_callback( GtkWidget *WXUNUSED(widget), GtkTreeIter iter; dv->GtkGetInternal()->get_iter( &iter, path ); - // wxPrintf( "mouse %d %d\n", (int) gdk_event->x, (int) gdk_event->y ); - gtk_tree_path_free( path ); } } @@ -4095,8 +4111,6 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator ) { - Init(); - if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator )) { @@ -4200,13 +4214,10 @@ void wxDataViewCtrl::OnInternalIdle() bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model ) { - if (GetModel()) + if ( m_internal ) { delete m_internal; m_internal = NULL; - - delete m_notifier; - m_notifier = NULL; } if (!wxDataViewCtrlBase::AssociateModel( model )) @@ -4634,6 +4645,10 @@ void wxDataViewCtrl::GtkEnableSelectionEvents() G_CALLBACK (wxdataview_selection_changed_callback), this); } +// ---------------------------------------------------------------------------- +// visual attributes stuff +// ---------------------------------------------------------------------------- + // static wxVisualAttributes wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) @@ -4641,9 +4656,12 @@ wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) return GetDefaultAttributesFromGTKWidget(gtk_tree_view_new); } +void wxDataViewCtrl::DoApplyWidgetStyle(GtkRcStyle *style) +{ + wxDataViewCtrlBase::DoApplyWidgetStyle(style); + gtk_widget_modify_style(m_treeview, style); +} -#endif - // !wxUSE_GENERICDATAVIEWCTRL +#endif // !wxUSE_GENERICDATAVIEWCTRL -#endif - // wxUSE_DATAVIEWCTRL +#endif // wxUSE_DATAVIEWCTRL