X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7448d67c492d4e397e6de9d25955cab074ce6c14..bd27a41da5ec38e53c5dcbb9fb1267bdfe9d91e5:/src/gtk/dataview.cpp diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index b1882798fe..297f496801 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -975,11 +975,11 @@ 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; @@ -1086,7 +1086,7 @@ gtk_wx_cell_renderer_render (GtkCellRenderer *renderer, rect.y += cell_area->y; rect.width -= renderer->xpad * 2; rect.height -= renderer->ypad * 2; - + GdkRectangle dummy; if (gdk_rectangle_intersect (expose_area, &rect, &dummy)) { @@ -1477,18 +1477,18 @@ wxDataViewCellMode wxDataViewRenderer::GetMode() const 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; @@ -2040,18 +2040,18 @@ wxDataViewChoiceRenderer::wxDataViewChoiceRenderer( const wxArrayString &choices 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(); @@ -2077,7 +2077,7 @@ wxSize wxDataViewChoiceRenderer::GetSize() const bool wxDataViewChoiceRenderer::SetValue( const wxVariant &value ) { - + #ifdef __WXGTK26__ if (!gtk_check_version(2,6,0)) { @@ -2134,7 +2134,7 @@ void wxDataViewChoiceRenderer::SetAlignment( int align ) g_object_set_property( G_OBJECT(m_renderer), "alignment", &gvalue ); g_value_unset( &gvalue ); } - + // --------------------------------------------------------- // wxDataViewDateRenderer // --------------------------------------------------------- @@ -2515,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 ); @@ -2563,17 +2560,13 @@ void wxDataViewColumn::Init(wxAlignment align, int flags, int width) 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) @@ -2672,7 +2665,7 @@ 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(); } @@ -2693,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() ); } @@ -2701,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 @@ -3697,7 +3705,7 @@ void wxDataViewCtrl::Init() { m_notifier = NULL; m_internal = NULL; - + m_cols.DeleteContents( true ); } @@ -4005,6 +4013,17 @@ 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 ); + bool res = gtk_tree_view_row_expanded( GTK_TREE_VIEW(m_treeview), path ); + gtk_tree_path_free( path ); + + return res; +} + wxDataViewItem wxDataViewCtrl::GetSelection() const { GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); @@ -4094,12 +4113,23 @@ void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel ) gtk_tree_selection_unselect_all( selection ); + wxDataViewItem last_parent; + size_t i; for (i = 0; i < sel.GetCount(); i++) { + wxDataViewItem item = sel[i]; + wxDataViewItem parent = GetModel()->GetParent( item ); + if (parent) + { + if (parent != last_parent) + ExpandAncestors(item); + } + last_parent = parent; + GtkTreeIter iter; iter.stamp = m_internal->GetGtkModel()->stamp; - iter.user_data = (gpointer) sel[i].GetID(); + iter.user_data = (gpointer) item.GetID(); gtk_tree_selection_select_iter( selection, &iter ); } @@ -4108,6 +4138,8 @@ void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel ) void wxDataViewCtrl::Select( const wxDataViewItem & item ) { + ExpandAncestors(item); + GtkDisableSelectionEvents(); GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); @@ -4170,6 +4202,8 @@ void wxDataViewCtrl::UnselectAll() void wxDataViewCtrl::EnsureVisible(const wxDataViewItem& item, const wxDataViewColumn *WXUNUSED(column)) { + ExpandAncestors(item); + GtkTreeIter iter; iter.user_data = (gpointer) item.GetID(); GtkTreePath *path = m_internal->get_path( &iter );