void SetSortOrder( GtkSortType sort_order ) { m_sort_order = sort_order; }
GtkSortType GetSortOrder() { return m_sort_order; }
+
+ void SetSortColumn( unsigned int column ) { m_sort_column = column; }
+ unsigned int GetSortColumn() { return m_sort_column; }
protected:
void InitTree();
GtkWxTreeModel *m_gtk_model;
wxDataViewCtrl *m_owner;
GtkSortType m_sort_order;
+ unsigned int m_sort_column;
};
int LINKAGEMODE wxGtkTreeModelNodeCmp( void* id1, void* id2 )
{
- int ret = g_internal->GetDataViewModel()->Compare( id1, id2 );
- if (g_internal->GetSortOrder() == GTK_SORT_DESCENDING)
- return -ret;
+ int ret = g_internal->GetDataViewModel()->Compare( id1, id2,
+ g_internal->GetSortColumn(), (g_internal->GetSortOrder() == GTK_SORT_ASCENDING) );
+
return ret;
}
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (sortable), FALSE);
if (sort_column_id)
- *sort_column_id = tree_model->internal->GetDataViewModel()->GetSortingColumn();
+ *sort_column_id = tree_model->internal->GetSortColumn();
if (order)
*order = tree_model->internal->GetSortOrder();
GtkWxTreeModel *tree_model = (GtkWxTreeModel *) sortable;
g_return_if_fail (GTK_IS_WX_TREE_MODEL (sortable) );
- if ((sort_column_id == (gint) tree_model->internal->GetDataViewModel()->GetSortingColumn()) &&
+ if ((sort_column_id == (gint) tree_model->internal->GetSortColumn()) &&
(order == tree_model->internal->GetSortOrder()))
return;
- tree_model->internal->GetDataViewModel()->SetSortingColumn( sort_column_id );
+ tree_model->internal->SetSortColumn( sort_column_id );
tree_model->internal->SetSortOrder( order );
gtk_tree_sortable_sort_column_changed (sortable);
tree_model->internal->GetDataViewModel()->Resort();
+
+ wxDataViewCtrl *dv = tree_model->internal->GetOwner();
+ wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED, dv->GetId() );
+ // TODO event.SetDataViewColumn( column );
+ event.SetModel( dv->GetModel() );
+ dv->GetEventHandler()->ProcessEvent( event );
}
void wxgtk_tree_model_set_sort_func (GtkTreeSortable *sortable,
event.SetDataViewColumn( column );
event.SetModel( dv->GetModel() );
if (dv->GetEventHandler()->ProcessEvent( event ))
- return TRUE;
+ return FALSE;
}
return FALSE;
m_gtk_model = gtk_model;
m_root = NULL;
m_sort_order = GTK_SORT_ASCENDING;
+ m_sort_column = 0;
InitTree();
}
return;
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_SELECTED, dv->GetId() );
- // TODO: item
+ event.SetItem( dv->GetSelection() );
event.SetModel( dv->GetModel() );
dv->GetEventHandler()->ProcessEvent( event );
}
dv->GetEventHandler()->ProcessEvent( event );
}
+static gboolean
+wxdataview_test_expand_row_callback( GtkTreeView* treeview, GtkTreeIter* iter,
+ GtkTreePath *path, wxDataViewCtrl *dv )
+{
+ wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, dv->GetId() );
+
+ wxDataViewItem item( (void*) iter->user_data );;
+ event.SetItem( item );
+ event.SetModel( dv->GetModel() );
+ dv->GetEventHandler()->ProcessEvent( event );
+
+ return !event.IsAllowed();
+}
+
+static void
+wxdataview_row_expanded_callback( GtkTreeView* treeview, GtkTreeIter* iter,
+ GtkTreePath *path, wxDataViewCtrl *dv )
+{
+ wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED, dv->GetId() );
+
+ wxDataViewItem item( (void*) iter->user_data );;
+ event.SetItem( item );
+ event.SetModel( dv->GetModel() );
+ dv->GetEventHandler()->ProcessEvent( event );
+}
+
+static gboolean
+wxdataview_test_collapse_row_callback( GtkTreeView* treeview, GtkTreeIter* iter,
+ GtkTreePath *path, wxDataViewCtrl *dv )
+{
+ wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING, dv->GetId() );
+
+ wxDataViewItem item( (void*) iter->user_data );;
+ event.SetItem( item );
+ event.SetModel( dv->GetModel() );
+ dv->GetEventHandler()->ProcessEvent( event );
+
+ return !event.IsAllowed();
+}
+
+static void
+wxdataview_row_collapsed_callback( GtkTreeView* treeview, GtkTreeIter* iter,
+ GtkTreePath *path, wxDataViewCtrl *dv )
+{
+ wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED, dv->GetId() );
+
+ wxDataViewItem item( (void*) iter->user_data );;
+ event.SetItem( item );
+ event.SetModel( dv->GetModel() );
+ dv->GetEventHandler()->ProcessEvent( event );
+}
+
//-----------------------------------------------------------------------------
-// wxDataViewCtrl
+ // wxDataViewCtrl
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
GtkEnableSelectionEvents();
- g_signal_connect_after (m_treeview, "row_activated",
+ g_signal_connect_after (m_treeview, "row-activated",
G_CALLBACK (wxdataview_row_activated_callback), this);
+ g_signal_connect (m_treeview, "test-collapse-row",
+ G_CALLBACK (wxdataview_test_collapse_row_callback), this);
+
+ g_signal_connect_after (m_treeview, "row-collapsed",
+ G_CALLBACK (wxdataview_row_collapsed_callback), this);
+
+ g_signal_connect (m_treeview, "test-expand-row",
+ G_CALLBACK (wxdataview_test_expand_row_callback), this);
+
+ g_signal_connect_after (m_treeview, "row-expanded",
+ G_CALLBACK (wxdataview_row_expanded_callback), this);
+
return true;
}
if (m_windowStyle & wxDV_MULTIPLE)
{
+ // Report the first one
+ GtkTreeModel *model;
+ GList *list = gtk_tree_selection_get_selected_rows( selection, &model );
+
+ if (list)
+ {
+ GtkTreePath *path = (GtkTreePath*) list->data;
+ GtkTreeIter iter;
+ m_internal->get_iter( &iter, path );
+
+ // delete list
+ g_list_foreach( list, (GFunc) gtk_tree_path_free, NULL );
+ g_list_free( list );
+
+ return wxDataViewItem( (void*) iter.user_data );
+ }
}
else
{
return wxDataViewItem(0);
}
+int wxDataViewCtrl::GetSelections( wxDataViewItemArray & sel ) const
+{
+ sel.Clear();
+
+ GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+ if (HasFlag(wxDV_MULTIPLE))
+ {
+ GtkTreeModel *model;
+ GList *list = gtk_tree_selection_get_selected_rows( selection, &model );
+
+ int count = 0;
+ while (list)
+ {
+ GtkTreePath *path = (GtkTreePath*) list->data;
+
+ GtkTreeIter iter;
+ m_internal->get_iter( &iter, path );
+
+ sel.Add( wxDataViewItem( (void*) iter.user_data ) );
+
+ list = g_list_next( list );
+ count++;
+ }
+
+ // delete list
+ g_list_foreach( list, (GFunc) gtk_tree_path_free, NULL );
+ g_list_free( list );
+
+ return count;
+ }
+ else
+ {
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gboolean has_selection = gtk_tree_selection_get_selected( selection, &model, &iter );
+ if (has_selection)
+ {
+ sel.Add( wxDataViewItem( (void*) iter.user_data) );
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel )
+{
+ GtkDisableSelectionEvents();
+
+ GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+
+ gtk_tree_selection_unselect_all( selection );
+
+ size_t i;
+ for (i = 0; i < sel.GetCount(); i++)
+ {
+ GtkTreeIter iter;
+ iter.user_data = (gpointer) sel[i].GetID();
+ gtk_tree_selection_select_iter( selection, &iter );
+ }
+
+ GtkEnableSelectionEvents();
+}
+
+void wxDataViewCtrl::Select( const wxDataViewItem & item )
+{
+ GtkDisableSelectionEvents();
+
+ GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+
+ GtkTreeIter iter;
+ iter.user_data = (gpointer) item.GetID();
+ gtk_tree_selection_select_iter( selection, &iter );
+
+ GtkEnableSelectionEvents();
+}
+
+void wxDataViewCtrl::Unselect( const wxDataViewItem & item )
+{
+ GtkDisableSelectionEvents();
+
+ GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+
+ GtkTreeIter iter;
+ iter.user_data = (gpointer) item.GetID();
+ gtk_tree_selection_unselect_iter( selection, &iter );
+
+ GtkEnableSelectionEvents();
+}
+
+bool wxDataViewCtrl::IsSelected( const wxDataViewItem & item ) const
+{
+ GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+
+ GtkTreeIter iter;
+ iter.user_data = (gpointer) item.GetID();
+
+ return gtk_tree_selection_iter_is_selected( selection, &iter );
+}
+
+void wxDataViewCtrl::SelectAll()
+{
+ GtkDisableSelectionEvents();
+
+ GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+
+ gtk_tree_selection_select_all( selection );
+
+ GtkEnableSelectionEvents();
+}
+
+void wxDataViewCtrl::UnselectAll()
+{
+ GtkDisableSelectionEvents();
+
+ GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+
+ gtk_tree_selection_unselect_all( selection );
+
+ GtkEnableSelectionEvents();
+}
+
+void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, wxDataViewColumn *column )
+{
+ GtkTreeIter iter;
+ iter.user_data = (gpointer) item.GetID();
+ GtkTreePath *path = m_internal->get_path( &iter );
+ gtk_tree_view_scroll_to_cell( GTK_TREE_VIEW(m_treeview), path, NULL, false, 0.0, 0.0 );
+ gtk_tree_path_free( path );
+}
+
void wxDataViewCtrl::DoSetExpanderColumn()
{
}
void wxDataViewCtrl::GtkDisableSelectionEvents()
{
GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
- g_signal_connect_after (selection, "changed",
- G_CALLBACK (wxdataview_selection_changed_callback), this);
+ g_signal_handlers_disconnect_by_func( selection,
+ (gpointer) (wxdataview_selection_changed_callback), this);
}
void wxDataViewCtrl::GtkEnableSelectionEvents()
{
GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
- g_signal_handlers_disconnect_by_func( selection,
- (gpointer) (wxdataview_selection_changed_callback), this);
+ g_signal_connect_after (selection, "changed",
+ G_CALLBACK (wxdataview_selection_changed_callback), this);
}
// static