X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/973dc9079c2e3408f5a57d956c6950a801959264..d169fa6aef264c5dfc300dd6666236d59f4e169a:/src/gtk/dataview.cpp diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index c1a3c82123..75849f7fab 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -155,7 +155,7 @@ public: ~wxGtkTreeModelNode() { - size_t count = m_children.GetCount(); + size_t count = m_nodes.GetCount(); size_t i; for (i = 0; i < count; i++) { @@ -975,9 +975,15 @@ static GtkCellEditable *gtk_wx_cell_renderer_start_editing( { GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer; wxDataViewCustomRenderer *cell = wxrenderer->cell; + + // Renderer doesn't support in-place editing if (!cell->HasEditorCtrl()) return NULL; + // An in-place editing control is still around + if (cell->GetEditorCtrl()) + return NULL; + GdkRectangle rect; gtk_wx_cell_renderer_get_size (renderer, widget, cell_area, &rect.x, @@ -1468,8 +1474,21 @@ wxDataViewCellMode wxDataViewRenderer::GetMode() const return ret; } -void wxDataViewRenderer::SetAlignment( int align ) +void wxDataViewRenderer::GtkUpdateAlignment() { + int align = m_alignment; + + // query alignment from column ? + if (align == -1) + { + // None there yet + if (GetOwner() == NULL) + return; + + align = GetOwner()->GetAlignment(); + align |= wxALIGN_CENTRE_VERTICAL; + } + // horizontal alignment: gfloat xalign = 0.0; @@ -1499,40 +1518,16 @@ void wxDataViewRenderer::SetAlignment( int align ) g_value_unset( &gvalue2 ); } -int wxDataViewRenderer::GetAlignment() const +void wxDataViewRenderer::SetAlignment( int align ) { - int ret = 0; - GValue gvalue; - - // horizontal alignment: - - g_object_get( G_OBJECT(m_renderer), "xalign", &gvalue, NULL ); - float xalign = g_value_get_float( &gvalue ); - if (xalign < 0.5) - ret |= wxALIGN_LEFT; - else if (xalign == 0.5) - ret |= wxALIGN_CENTER_HORIZONTAL; - else - ret |= wxALIGN_RIGHT; - g_value_unset( &gvalue ); - - - // vertical alignment: - - g_object_get( G_OBJECT(m_renderer), "yalign", &gvalue, NULL ); - float yalign = g_value_get_float( &gvalue ); - if (yalign < 0.5) - ret |= wxALIGN_TOP; - else if (yalign == 0.5) - ret |= wxALIGN_CENTER_VERTICAL; - else - ret |= wxALIGN_BOTTOM; - g_value_unset( &gvalue ); - - return ret; + m_alignment = align; + GtkUpdateAlignment(); } - +int wxDataViewRenderer::GetAlignment() const +{ + return m_alignment; +} // --------------------------------------------------------- // wxDataViewTextRenderer @@ -1546,7 +1541,7 @@ static void wxGtkTextRendererEditedCallback( GtkCellRendererText *renderer, static void wxGtkTextRendererEditedCallback( GtkCellRendererText *WXUNUSED(renderer), gchar *arg1, gchar *arg2, gpointer user_data ) { - wxDataViewTextRenderer *cell = (wxDataViewTextRenderer*) user_data; + wxDataViewRenderer *cell = (wxDataViewRenderer*) user_data; wxString tmp = wxGTK_CONV_BACK_FONT(arg2, cell->GetOwner()->GetOwner()->GetFont()); wxVariant value = tmp; @@ -1610,7 +1605,7 @@ bool wxDataViewTextRenderer::GetValue( wxVariant &value ) 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 ), wx_const_cast(wxDataViewTextRenderer*, this)->GetOwner()->GetOwner()->GetFont() ); + wxString tmp = wxGTK_CONV_BACK_FONT( g_value_get_string( &gvalue ), const_cast(this)->GetOwner()->GetOwner()->GetFont() ); g_value_unset( &gvalue ); value = tmp; @@ -2026,6 +2021,120 @@ wxSize wxDataViewProgressRenderer::GetSize() const return wxSize(40,12); } +// ------------------------------------- +// wxDataViewChoiceRenderer +// ------------------------------------- + +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_renderer = (GtkCellRenderer*) gtk_cell_renderer_combo_new(); + + GtkListStore *store = gtk_list_store_new( 1, G_TYPE_STRING ); + size_t n; + for (n = 0; n < m_choices.GetCount(); n++) + gtk_list_store_insert_with_values( store, NULL, n, 0, m_choices[n].utf8_str(), -1 ); + + 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); + + SetAlignment(alignment); + + g_signal_connect_after( m_renderer, "edited", G_CALLBACK(wxGtkTextRendererEditedCallback), this ); + + GtkInitHandlers(); + } + else +#endif + { + // Use custom cell code + wxDataViewCustomRenderer::Init(mode, alignment); + } +} + +bool wxDataViewChoiceRenderer::Render( wxRect rect, wxDC *dc, int state ) +{ + RenderText( m_data, 0, rect, dc, state ); + return true; +} + +wxSize wxDataViewChoiceRenderer::GetSize() const +{ + return wxSize(70,20); +} + +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(); + + 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 ), const_cast(this)->GetOwner()->GetOwner()->GetFont() ); + g_value_unset( &gvalue ); + value = temp; + wxPrintf( "temp %s\n", temp ); + } + else +#endif + value = m_data; + + return true; +} + +void wxDataViewChoiceRenderer::SetAlignment( int align ) +{ + wxDataViewCustomRenderer::SetAlignment(align); + + if (gtk_check_version(2,10,0)) + return; + + // horizontal alignment: + PangoAlignment pangoAlign = PANGO_ALIGN_LEFT; + if (align & wxALIGN_RIGHT) + pangoAlign = PANGO_ALIGN_RIGHT; + else if (align & wxALIGN_CENTER_HORIZONTAL) + pangoAlign = PANGO_ALIGN_CENTER; + + GValue gvalue = { 0, }; + g_value_init( &gvalue, gtk_cell_renderer_mode_get_type() ); + g_value_set_enum( &gvalue, pangoAlign ); + g_object_set_property( G_OBJECT(m_renderer), "alignment", &gvalue ); + g_value_unset( &gvalue ); +} + // --------------------------------------------------------- // wxDataViewDateRenderer // --------------------------------------------------------- @@ -2262,7 +2371,7 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column), wxDataViewModel *wx_model = tree_model->internal->GetDataViewModel(); - if (!wx_model->IsIndexListModel()) + if (!wx_model->IsVirtualListModel()) { if (wx_model->IsContainer( item )) @@ -2406,26 +2515,23 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column), } -IMPLEMENT_CLASS(wxDataViewColumn, wxDataViewColumnBase) - #include WX_DEFINE_LIST(wxDataViewColumnList) wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewRenderer *cell, unsigned int model_column, int width, - wxAlignment align, int flags ) : - wxDataViewColumnBase( title, cell, model_column, width, align, flags ) + wxAlignment align, int flags ) + : wxDataViewColumnBase( cell, model_column ) { Init( align, flags, width ); - gtk_tree_view_column_set_clickable( GTK_TREE_VIEW_COLUMN(m_column), TRUE ); SetTitle( title ); } wxDataViewColumn::wxDataViewColumn( const wxBitmap &bitmap, wxDataViewRenderer *cell, unsigned int model_column, int width, - wxAlignment align, int flags ) : - wxDataViewColumnBase( bitmap, cell, model_column, width, align, flags ) + wxAlignment align, int flags ) + : wxDataViewColumnBase( bitmap, cell, model_column ) { Init( align, flags, width ); @@ -2445,16 +2551,22 @@ void wxDataViewColumn::Init(wxAlignment align, int flags, int width) SetWidth( width ); + // Create container for icon and label + GtkWidget *box = gtk_hbox_new( FALSE, 1 ); + gtk_widget_show( box ); + // gtk_container_set_border_width((GtkContainer*)box, 2); + m_image = gtk_image_new(); + gtk_box_pack_start(GTK_BOX(box), m_image, FALSE, FALSE, 1); + m_label = gtk_label_new(""); + 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 ); gtk_tree_view_column_set_cell_data_func( column, renderer, wxGtkTreeCellDataFunc, (gpointer) GetRenderer(), NULL ); } -wxDataViewColumn::~wxDataViewColumn() -{ -} - void wxDataViewColumn::OnInternalIdle() { if (m_isConnected) @@ -2484,39 +2596,30 @@ void wxDataViewColumn::SetOwner( wxDataViewCtrl *owner ) void wxDataViewColumn::SetTitle( const wxString &title ) { - GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column); - - if (m_isConnected) - { - // disconnect before column->button gets recreated - g_signal_handlers_disconnect_by_func( column->button, - (GtkWidget*) gtk_dataview_header_button_press_callback, this); - - m_isConnected = false; - } - - // FIXME: can it really happen that we don't have the owner here?? wxDataViewCtrl *ctrl = GetOwner(); - gtk_tree_view_column_set_title( column, ctrl ? wxGTK_CONV_FONT(title, ctrl->GetFont()) + gtk_label_set_text( GTK_LABEL(m_label), ctrl ? wxGTK_CONV_FONT(title, ctrl->GetFont()) : wxGTK_CONV_SYS(title) ); - - gtk_tree_view_column_set_widget( column, NULL ); + if (title.empty()) + gtk_widget_hide( m_label ); + else + gtk_widget_show( m_label ); } wxString wxDataViewColumn::GetTitle() const { - const gchar *str = gtk_tree_view_column_get_title( GTK_TREE_VIEW_COLUMN(m_column) ); - return wxConvFileName->cMB2WX(str); + return wxGTK_CONV_BACK_FONT( + gtk_label_get_text( GTK_LABEL(m_label) ), + GetOwner()->GetFont() + ); } void wxDataViewColumn::SetBitmap( const wxBitmap &bitmap ) { wxDataViewColumnBase::SetBitmap( bitmap ); - GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column); if (bitmap.Ok()) { - GtkImage *gtk_image = GTK_IMAGE( gtk_image_new() ); + GtkImage *gtk_image = GTK_IMAGE(m_image); GdkBitmap *mask = (GdkBitmap *) NULL; if (bitmap.GetMask()) @@ -2532,13 +2635,11 @@ void wxDataViewColumn::SetBitmap( const wxBitmap &bitmap ) gtk_image_set_from_pixmap(GTK_IMAGE(gtk_image), bitmap.GetPixmap(), mask); } - gtk_widget_show( GTK_WIDGET(gtk_image) ); - - gtk_tree_view_column_set_widget( column, GTK_WIDGET(gtk_image) ); + gtk_widget_show( m_image ); } else { - gtk_tree_view_column_set_widget( column, NULL ); + gtk_widget_hide( m_image ); } } @@ -2564,6 +2665,9 @@ void wxDataViewColumn::SetAlignment( wxAlignment align ) xalign = 0.5; gtk_tree_view_column_set_alignment( column, xalign ); + + if (m_renderer && m_renderer->GetAlignment() == -1) + m_renderer->GtkUpdateAlignment(); } wxAlignment wxDataViewColumn::GetAlignment() const @@ -2582,7 +2686,7 @@ void wxDataViewColumn::SetSortable( bool sortable ) { GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column); - if (sortable) + if ( sortable ) { gtk_tree_view_column_set_sort_column_id( column, GetModelColumn() ); } @@ -2590,13 +2694,28 @@ void wxDataViewColumn::SetSortable( bool sortable ) { gtk_tree_view_column_set_sort_column_id( column, -1 ); gtk_tree_view_column_set_sort_indicator( column, FALSE ); + gtk_tree_view_column_set_clickable( column, FALSE ); } } bool wxDataViewColumn::IsSortable() const { GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column); - return (gtk_tree_view_column_get_sort_column_id( column ) != -1); + return gtk_tree_view_column_get_clickable( column ); +} + +void wxDataViewColumn::SetAsSortKey( bool WXUNUSED(sort) ) +{ + // it might not make sense to have this function in wxHeaderColumn at + // all in fact, changing of the sort order should only be done using the + // associated control API + wxFAIL_MSG( "not implemented" ); +} + +bool wxDataViewColumn::IsSortKey() const +{ + GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column); + return gtk_tree_view_column_get_sort_indicator( column ); } bool wxDataViewColumn::IsResizeable() const @@ -2653,7 +2772,7 @@ void wxDataViewColumn::SetWidth( int width ) gtk_tree_view_column_set_sizing( GTK_TREE_VIEW_COLUMN(m_column), GTK_TREE_VIEW_COLUMN_FIXED ); // TODO find a better calculation - gtk_tree_view_column_set_fixed_width( GTK_TREE_VIEW_COLUMN(m_column), 80 ); + gtk_tree_view_column_set_fixed_width( GTK_TREE_VIEW_COLUMN(m_column), wxDVC_DEFAULT_WIDTH ); #else // this is unpractical for large numbers of items and disables // user resizing, which is totally unexpected @@ -2752,7 +2871,7 @@ wxDataViewCtrlInternal::wxDataViewCtrlInternal( wxDataViewCtrl *owner, m_sort_column = -1; m_dataview_sort_column = NULL; - if (!m_wx_model->IsIndexListModel()) + if (!m_wx_model->IsVirtualListModel()) InitTree(); } @@ -2871,13 +2990,13 @@ bool wxDataViewCtrlInternal::Cleared() void wxDataViewCtrlInternal::Resort() { - if (!m_wx_model->IsIndexListModel()) + if (!m_wx_model->IsVirtualListModel()) m_root->Resort(); } bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ) { - if (!m_wx_model->IsIndexListModel()) + if (!m_wx_model->IsVirtualListModel()) { wxGtkTreeModelNode *parent_node = FindNode( parent ); if (m_wx_model->IsContainer( item )) @@ -2891,7 +3010,7 @@ bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDa bool wxDataViewCtrlInternal::ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item ) { - if (!m_wx_model->IsIndexListModel()) + if (!m_wx_model->IsVirtualListModel()) { wxGtkTreeModelNode *parent_node = FindNode( parent ); parent_node->DeleteChild( item.GetID() ); @@ -2928,7 +3047,7 @@ bool wxDataViewCtrlInternal::ValueChanged( const wxDataViewItem &item, unsigned GtkTreeModelFlags wxDataViewCtrlInternal::get_flags() { - if (m_wx_model->IsIndexListModel()) + if (m_wx_model->IsVirtualListModel()) return GTK_TREE_MODEL_LIST_ONLY; else return GTK_TREE_MODEL_ITERS_PERSIST; @@ -2936,7 +3055,7 @@ GtkTreeModelFlags wxDataViewCtrlInternal::get_flags() gboolean wxDataViewCtrlInternal::get_iter( GtkTreeIter *iter, GtkTreePath *path ) { - if (m_wx_model->IsIndexListModel()) + if (m_wx_model->IsVirtualListModel()) { wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model; @@ -2996,7 +3115,7 @@ GtkTreePath *wxDataViewCtrlInternal::get_path( GtkTreeIter *iter ) { GtkTreePath *retval = gtk_tree_path_new (); - if (m_wx_model->IsIndexListModel()) + if (m_wx_model->IsVirtualListModel()) { // user_data is just the index int i = (wxUIntPtr) iter->user_data; @@ -3023,7 +3142,7 @@ GtkTreePath *wxDataViewCtrlInternal::get_path( GtkTreeIter *iter ) gboolean wxDataViewCtrlInternal::iter_next( GtkTreeIter *iter ) { - if (m_wx_model->IsIndexListModel()) + if (m_wx_model->IsVirtualListModel()) { wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model; @@ -3057,7 +3176,7 @@ gboolean wxDataViewCtrlInternal::iter_next( GtkTreeIter *iter ) gboolean wxDataViewCtrlInternal::iter_children( GtkTreeIter *iter, GtkTreeIter *parent ) { - if (m_wx_model->IsIndexListModel()) + if (m_wx_model->IsVirtualListModel()) { // this is a list, nodes have no children if (parent) @@ -3090,7 +3209,7 @@ gboolean wxDataViewCtrlInternal::iter_children( GtkTreeIter *iter, GtkTreeIter * gboolean wxDataViewCtrlInternal::iter_has_child( GtkTreeIter *iter ) { - if (m_wx_model->IsIndexListModel()) + if (m_wx_model->IsVirtualListModel()) { // this is a list, nodes have no children return FALSE; @@ -3113,7 +3232,7 @@ gboolean wxDataViewCtrlInternal::iter_has_child( GtkTreeIter *iter ) gint wxDataViewCtrlInternal::iter_n_children( GtkTreeIter *iter ) { - if (m_wx_model->IsIndexListModel()) + if (m_wx_model->IsVirtualListModel()) { wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model; @@ -3140,7 +3259,7 @@ gint wxDataViewCtrlInternal::iter_n_children( GtkTreeIter *iter ) gboolean wxDataViewCtrlInternal::iter_nth_child( GtkTreeIter *iter, GtkTreeIter *parent, gint n ) { - if (m_wx_model->IsIndexListModel()) + if (m_wx_model->IsVirtualListModel()) { wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model; @@ -3181,7 +3300,7 @@ gboolean wxDataViewCtrlInternal::iter_nth_child( GtkTreeIter *iter, GtkTreeIter gboolean wxDataViewCtrlInternal::iter_parent( GtkTreeIter *iter, GtkTreeIter *child ) { - if (m_wx_model->IsIndexListModel()) + if (m_wx_model->IsVirtualListModel()) { return FALSE; } @@ -3442,14 +3561,9 @@ wxdataview_row_collapsed_callback( GtkTreeView* WXUNUSED(treeview), GtkTreeIter* // wxDataViewCtrl //----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -// InsertChild for wxDataViewCtrl -//----------------------------------------------------------------------------- - -static void wxInsertChildInDataViewCtrl( wxWindowGTK* parent, wxWindowGTK* child ) +void wxDataViewCtrl::AddChildGTK(wxWindowGTK* child) { - wxDataViewCtrl * dvc = (wxDataViewCtrl*) parent; - GtkWidget *treeview = dvc->GtkGetTreeView(); + GtkWidget* treeview = GtkGetTreeView(); // Insert widget in GtkTreeView if (GTK_WIDGET_REALIZED(treeview)) @@ -3578,6 +3692,8 @@ wxDataViewCtrl::~wxDataViewCtrl() if (m_notifier) GetModel()->RemoveNotifier( m_notifier ); + m_cols.Clear(); + // remove the model from the GtkTreeView before it gets destroyed by the // wxDataViewCtrlBase's dtor gtk_tree_view_set_model( GTK_TREE_VIEW(m_treeview), NULL ); @@ -3589,6 +3705,8 @@ void wxDataViewCtrl::Init() { m_notifier = NULL; m_internal = NULL; + + m_cols.DeleteContents( true ); } static GtkTargetEntry gs_target; @@ -3606,9 +3724,8 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, return false; } - m_insertCallback = wxInsertChildInDataViewCtrl; - m_widget = gtk_scrolled_window_new (NULL, NULL); + g_object_ref(m_widget); GtkScrolledWindowSetBorder(m_widget, style); @@ -3626,7 +3743,10 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, #ifdef __WXGTK26__ if (!gtk_check_version(2,6,0)) - gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), TRUE ); + { + bool fixed = (style & wxDV_VARIABLE_LINE_HEIGHT) == 0; + gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), fixed ); + } #endif if (style & wxDV_MULTIPLE) @@ -3718,6 +3838,14 @@ 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 + GtkWxTreeModel *gtk_model = wxgtk_tree_model_new(); m_internal = new wxDataViewCtrlInternal( this, model, gtk_model ); gtk_model->internal = m_internal; @@ -3778,6 +3906,28 @@ bool wxDataViewCtrl::PrependColumn( wxDataViewColumn *col ) return true; } +bool wxDataViewCtrl::InsertColumn( unsigned int pos, wxDataViewColumn *col ) +{ + if (!wxDataViewCtrlBase::InsertColumn(pos,col)) + return false; + + 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) + 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 ); + + return true; +} + unsigned int wxDataViewCtrl::GetColumnCount() const { return m_cols.GetCount(); @@ -3790,7 +3940,7 @@ wxDataViewColumn* wxDataViewCtrl::GetColumn( unsigned int pos ) const return NULL; wxDataViewColumnList::const_iterator iter; - for (iter = m_cols.begin(); iter != m_cols.end(); iter++) + for (iter = m_cols.begin(); iter != m_cols.end(); ++iter) { wxDataViewColumn *col = *iter; if (GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) == gtk_col) @@ -3807,9 +3957,7 @@ bool wxDataViewCtrl::DeleteColumn( wxDataViewColumn *column ) gtk_tree_view_remove_column( GTK_TREE_VIEW(m_treeview), GTK_TREE_VIEW_COLUMN(column->GetGtkHandle()) ); - m_cols.remove( column ); - - delete column; + m_cols.DeleteObject( column ); return true; } @@ -3817,14 +3965,14 @@ bool wxDataViewCtrl::DeleteColumn( wxDataViewColumn *column ) bool wxDataViewCtrl::ClearColumns() { wxDataViewColumnList::iterator iter; - for (iter = m_cols.begin(); iter != m_cols.end(); iter++) + for (iter = m_cols.begin(); iter != m_cols.end(); ++iter) { wxDataViewColumn *col = *iter; gtk_tree_view_remove_column( GTK_TREE_VIEW(m_treeview), GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) ); } - m_cols.clear(); + m_cols.Clear(); return true; } @@ -3865,6 +4013,15 @@ void wxDataViewCtrl::Collapse( const wxDataViewItem & item ) gtk_tree_path_free( path ); } +bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const +{ + GtkTreeIter iter; + iter.user_data = item.GetID(); + GtkTreePath *path = m_internal->get_path( &iter ); + gtk_tree_view_row_expanded( GTK_TREE_VIEW(m_treeview), path ); + gtk_tree_path_free( path ); +} + wxDataViewItem wxDataViewCtrl::GetSelection() const { GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); @@ -3958,6 +4115,7 @@ void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel ) for (i = 0; i < sel.GetCount(); i++) { GtkTreeIter iter; + iter.stamp = m_internal->GetGtkModel()->stamp; iter.user_data = (gpointer) sel[i].GetID(); gtk_tree_selection_select_iter( selection, &iter ); } @@ -3972,6 +4130,7 @@ void wxDataViewCtrl::Select( const wxDataViewItem & item ) GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); GtkTreeIter iter; + iter.stamp = m_internal->GetGtkModel()->stamp; iter.user_data = (gpointer) item.GetID(); gtk_tree_selection_select_iter( selection, &iter ); @@ -3985,6 +4144,7 @@ void wxDataViewCtrl::Unselect( const wxDataViewItem & item ) GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); GtkTreeIter iter; + iter.stamp = m_internal->GetGtkModel()->stamp; iter.user_data = (gpointer) item.GetID(); gtk_tree_selection_unselect_iter( selection, &iter ); @@ -3996,6 +4156,7 @@ bool wxDataViewCtrl::IsSelected( const wxDataViewItem & item ) const GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); GtkTreeIter iter; + iter.stamp = m_internal->GetGtkModel()->stamp; iter.user_data = (gpointer) item.GetID(); return gtk_tree_selection_iter_is_selected( selection, &iter );