2 * Copyright (C) 2001 Red Hat, Inc
3 * Author: Jonathan Blandford
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
23 * README README README README README README README README README README
24 * README README README README README README README README README README
25 * README README README README README README README README README README
26 * README README README README README README README README README README
27 * README README README README README README README README README README
28 * README README README README README README README README README README
29 * README README README README README README README README README README
30 * README README README README README README README README README README
31 * README README README README README README README README README README
32 * README README README README README README README README README README
33 * README README README README README README README README README README
34 * README README README README README README README README README README
35 * README README README README README README README README README README
37 * DO NOT!!! I REPEAT DO NOT! EVER LOOK AT THIS CODE AS AN EXAMPLE OF WHAT YOUR
38 * CODE SHOULD LOOK LIKE.
40 * IT IS VERY CONFUSING, AND IS MEANT TO TEST A LOT OF CODE IN THE TREE. WHILE
41 * IT IS ACTUALLY CORRECT CODE, IT IS NOT USEFUL.
44 GtkWidget *left_tree_view;
45 GtkWidget *top_right_tree_view;
46 GtkWidget *bottom_right_tree_view;
47 GtkTreeModel *left_tree_model;
48 GtkTreeModel *top_right_tree_model;
49 GtkTreeModel *bottom_right_tree_model;
50 GtkWidget *sample_tree_view_top;
51 GtkWidget *sample_tree_view_bottom;
53 #define column_data "my_column_data"
55 static void move_row (GtkTreeModel *src,
56 GtkTreeIter *src_iter,
58 GtkTreeIter *dest_iter);
60 /* Kids, don't try this at home. */
62 /* Small GtkTreeModel to model columns */
63 typedef struct _ViewColumnModel ViewColumnModel;
64 typedef struct _ViewColumnModelClass ViewColumnModelClass;
66 struct _ViewColumnModel
74 struct _ViewColumnModelClass
76 GtkListStoreClass parent_class;
79 static void view_column_model_init (ViewColumnModel *model)
81 model->stamp = g_random_int ();
85 view_column_model_get_n_columns (GtkTreeModel *tree_model)
91 view_column_model_get_column_type (GtkTreeModel *tree_model,
99 return GTK_TYPE_TREE_VIEW_COLUMN;
101 return G_TYPE_INVALID;
106 view_column_model_get_iter (GtkTreeModel *tree_model,
111 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
115 g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
117 i = gtk_tree_path_get_indices (path)[0];
118 list = g_list_nth (view_model->columns, i);
123 iter->stamp = view_model->stamp;
124 iter->user_data = list;
130 view_column_model_get_path (GtkTreeModel *tree_model,
133 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
138 g_return_val_if_fail (iter->stamp == view_model->stamp, NULL);
140 for (list = view_model->columns; list; list = list->next)
142 if (list == (GList *)iter->user_data)
149 retval = gtk_tree_path_new ();
150 gtk_tree_path_append_index (retval, i);
155 view_column_model_get_value (GtkTreeModel *tree_model,
160 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
162 g_return_if_fail (column < 2);
163 g_return_if_fail (view_model->stamp == iter->stamp);
164 g_return_if_fail (iter->user_data != NULL);
168 g_value_init (value, G_TYPE_STRING);
169 g_value_set_string (value, gtk_tree_view_column_get_title (GTK_TREE_VIEW_COLUMN (((GList *)iter->user_data)->data)));
173 g_value_init (value, GTK_TYPE_TREE_VIEW_COLUMN);
174 g_value_set_object (value, ((GList *)iter->user_data)->data);
179 view_column_model_iter_next (GtkTreeModel *tree_model,
182 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
184 g_return_val_if_fail (view_model->stamp == iter->stamp, FALSE);
185 g_return_val_if_fail (iter->user_data != NULL, FALSE);
187 iter->user_data = ((GList *)iter->user_data)->next;
188 return iter->user_data != NULL;
192 view_column_model_iter_children (GtkTreeModel *tree_model,
196 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
198 /* this is a list, nodes have no children */
202 /* but if parent == NULL we return the list itself as children of the
206 if (view_model->columns)
208 iter->stamp = view_model->stamp;
209 iter->user_data = view_model->columns;
217 view_column_model_iter_has_child (GtkTreeModel *tree_model,
224 view_column_model_iter_n_children (GtkTreeModel *tree_model,
227 return g_list_length (((ViewColumnModel *)tree_model)->columns);
231 view_column_model_iter_nth_child (GtkTreeModel *tree_model,
236 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
241 iter->stamp = view_model->stamp;
242 iter->user_data = g_list_nth ((GList *)view_model->columns, n);
244 return (iter->user_data != NULL);
248 view_column_model_iter_parent (GtkTreeModel *tree_model,
256 view_column_model_tree_model_init (GtkTreeModelIface *iface)
258 iface->get_n_columns = view_column_model_get_n_columns;
259 iface->get_column_type = view_column_model_get_column_type;
260 iface->get_iter = view_column_model_get_iter;
261 iface->get_path = view_column_model_get_path;
262 iface->get_value = view_column_model_get_value;
263 iface->iter_next = view_column_model_iter_next;
264 iface->iter_children = view_column_model_iter_children;
265 iface->iter_has_child = view_column_model_iter_has_child;
266 iface->iter_n_children = view_column_model_iter_n_children;
267 iface->iter_nth_child = view_column_model_iter_nth_child;
268 iface->iter_parent = view_column_model_iter_parent;
272 view_column_model_drag_data_get (GtkTreeDragSource *drag_source,
274 GtkSelectionData *selection_data)
276 if (gtk_tree_set_row_drag_data (selection_data,
277 GTK_TREE_MODEL (drag_source),
285 view_column_model_drag_data_delete (GtkTreeDragSource *drag_source,
288 /* Nothing -- we handle moves on the dest side */
294 view_column_model_row_drop_possible (GtkTreeDragDest *drag_dest,
295 GtkTreePath *dest_path,
296 GtkSelectionData *selection_data)
298 GtkTreeModel *src_model;
300 if (gtk_tree_get_row_drag_data (selection_data,
304 if (src_model == left_tree_model ||
305 src_model == top_right_tree_model ||
306 src_model == bottom_right_tree_model)
314 view_column_model_drag_data_received (GtkTreeDragDest *drag_dest,
316 GtkSelectionData *selection_data)
318 GtkTreeModel *src_model;
319 GtkTreePath *src_path = NULL;
320 gboolean retval = FALSE;
322 if (gtk_tree_get_row_drag_data (selection_data,
326 GtkTreeIter src_iter;
327 GtkTreeIter dest_iter;
330 /* We are a little lazy here, and assume if we can't convert dest
331 * to an iter, we need to append. See gtkliststore.c for a more
332 * careful handling of this.
334 have_dest = gtk_tree_model_get_iter (GTK_TREE_MODEL (drag_dest), &dest_iter, dest);
336 if (gtk_tree_model_get_iter (src_model, &src_iter, src_path))
338 if (src_model == left_tree_model ||
339 src_model == top_right_tree_model ||
340 src_model == bottom_right_tree_model)
342 move_row (src_model, &src_iter, GTK_TREE_MODEL (drag_dest),
343 have_dest ? &dest_iter : NULL);
348 gtk_tree_path_free (src_path);
355 view_column_model_drag_source_init (GtkTreeDragSourceIface *iface)
357 iface->drag_data_get = view_column_model_drag_data_get;
358 iface->drag_data_delete = view_column_model_drag_data_delete;
362 view_column_model_drag_dest_init (GtkTreeDragDestIface *iface)
364 iface->drag_data_received = view_column_model_drag_data_received;
365 iface->row_drop_possible = view_column_model_row_drop_possible;
369 view_column_model_class_init (ViewColumnModelClass *klass)
373 G_DEFINE_TYPE_WITH_CODE (ViewColumnModel, view_column_model, GTK_TYPE_LIST_STORE,
374 G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, view_column_model_tree_model_init)
375 G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE, view_column_model_drag_source_init)
376 G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_DEST, view_column_model_drag_dest_init))
379 update_columns (GtkTreeView *view, ViewColumnModel *view_model)
381 GList *old_columns = view_model->columns;
382 gint old_length, length;
385 view_model->columns = gtk_tree_view_get_columns (view_model->view);
387 /* As the view tells us one change at a time, we can do this hack. */
388 length = g_list_length (view_model->columns);
389 old_length = g_list_length (old_columns);
390 if (length != old_length)
395 /* where are they different */
396 for (a = old_columns, b = view_model->columns; a && b; a = a->next, b = b->next)
398 if (a->data != b->data)
402 path = gtk_tree_path_new ();
403 gtk_tree_path_append_index (path, i);
404 if (length < old_length)
407 gtk_tree_model_row_deleted (GTK_TREE_MODEL (view_model), path);
412 iter.stamp = view_model->stamp;
414 gtk_tree_model_row_inserted (GTK_TREE_MODEL (view_model), path, &iter);
416 gtk_tree_path_free (path);
425 new_order = g_new (int, length);
426 a = old_columns; b = view_model->columns;
428 while (a->data == b->data)
437 if (a->next->data == b->data)
440 while (b->data != a->data)
445 for (i = 0; i < m; i++)
447 for (i = m; i < m+n; i++)
450 for (i = m + n +1; i < length; i++)
456 while (a->data != b->data)
461 for (i = 0; i < m; i++)
464 for (i = m+1; i < m + n+ 1; i++)
465 new_order[i] = i - 1;
466 for (i = m + n + 1; i < length; i++)
470 path = gtk_tree_path_new ();
471 gtk_tree_model_rows_reordered (GTK_TREE_MODEL (view_model),
475 gtk_tree_path_free (path);
479 g_list_free (old_columns);
482 static GtkTreeModel *
483 view_column_model_new (GtkTreeView *view)
485 GtkTreeModel *retval;
487 retval = g_object_new (view_column_model_get_type (), NULL);
488 ((ViewColumnModel *)retval)->view = view;
489 ((ViewColumnModel *)retval)->columns = gtk_tree_view_get_columns (view);
491 g_signal_connect (view, "columns_changed", G_CALLBACK (update_columns), retval);
500 add_clicked (GtkWidget *button, gpointer data)
505 GtkTreeViewColumn *column;
506 GtkTreeSelection *selection;
507 GtkCellRenderer *cell;
508 gchar *label = g_strdup_printf ("Column %d", i);
510 cell = gtk_cell_renderer_text_new ();
511 column = gtk_tree_view_column_new_with_attributes (label, cell, "text", 0, NULL);
512 g_object_set_data_full (G_OBJECT (column), column_data, label, g_free);
513 gtk_tree_view_column_set_reorderable (column, TRUE);
514 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
515 gtk_tree_view_column_set_resizable (column, TRUE);
516 gtk_list_store_append (GTK_LIST_STORE (left_tree_model), &iter);
517 gtk_list_store_set (GTK_LIST_STORE (left_tree_model), &iter, 0, label, 1, column, -1);
520 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view));
521 gtk_tree_selection_select_iter (selection, &iter);
525 get_visible (GtkTreeViewColumn *tree_column,
526 GtkCellRenderer *cell,
527 GtkTreeModel *tree_model,
531 GtkTreeViewColumn *column;
533 gtk_tree_model_get (tree_model, iter, 1, &column, -1);
536 gtk_cell_renderer_toggle_set_active (GTK_CELL_RENDERER_TOGGLE (cell),
537 gtk_tree_view_column_get_visible (column));
542 set_visible (GtkCellRendererToggle *cell,
546 GtkTreeView *tree_view = (GtkTreeView *) data;
547 GtkTreeViewColumn *column;
550 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
552 model = gtk_tree_view_get_model (tree_view);
554 gtk_tree_model_get_iter (model, &iter, path);
555 gtk_tree_model_get (model, &iter, 1, &column, -1);
559 gtk_tree_view_column_set_visible (column, ! gtk_tree_view_column_get_visible (column));
560 gtk_tree_model_row_changed (model, path, &iter);
562 gtk_tree_path_free (path);
566 move_to_left (GtkTreeModel *src,
567 GtkTreeIter *src_iter,
568 GtkTreeIter *dest_iter)
571 GtkTreeViewColumn *column;
572 GtkTreeSelection *selection;
575 gtk_tree_model_get (src, src_iter, 0, &label, 1, &column, -1);
577 if (src == top_right_tree_model)
578 gtk_tree_view_remove_column (GTK_TREE_VIEW (sample_tree_view_top), column);
580 gtk_tree_view_remove_column (GTK_TREE_VIEW (sample_tree_view_bottom), column);
582 /* gtk_list_store_remove (GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (data))), &iter);*/
584 /* Put it back on the left */
586 gtk_list_store_insert_before (GTK_LIST_STORE (left_tree_model),
589 gtk_list_store_append (GTK_LIST_STORE (left_tree_model), &iter);
591 gtk_list_store_set (GTK_LIST_STORE (left_tree_model), &iter, 0, label, 1, column, -1);
592 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view));
593 gtk_tree_selection_select_iter (selection, &iter);
599 move_to_right (GtkTreeIter *src_iter,
601 GtkTreeIter *dest_iter)
604 GtkTreeViewColumn *column;
607 gtk_tree_model_get (GTK_TREE_MODEL (left_tree_model),
608 src_iter, 0, &label, 1, &column, -1);
609 gtk_list_store_remove (GTK_LIST_STORE (left_tree_model), src_iter);
613 GtkTreePath *path = gtk_tree_model_get_path (dest, dest_iter);
614 before = (gtk_tree_path_get_indices (path))[0];
615 gtk_tree_path_free (path);
618 if (dest == top_right_tree_model)
619 gtk_tree_view_insert_column (GTK_TREE_VIEW (sample_tree_view_top), column, before);
621 gtk_tree_view_insert_column (GTK_TREE_VIEW (sample_tree_view_bottom), column, before);
627 move_up_or_down (GtkTreeModel *src,
628 GtkTreeIter *src_iter,
630 GtkTreeIter *dest_iter)
632 GtkTreeViewColumn *column;
636 gtk_tree_model_get (src, src_iter, 0, &label, 1, &column, -1);
640 GtkTreePath *path = gtk_tree_model_get_path (dest, dest_iter);
641 before = (gtk_tree_path_get_indices (path))[0];
642 gtk_tree_path_free (path);
645 if (src == top_right_tree_model)
646 gtk_tree_view_remove_column (GTK_TREE_VIEW (sample_tree_view_top), column);
648 gtk_tree_view_remove_column (GTK_TREE_VIEW (sample_tree_view_bottom), column);
650 if (dest == top_right_tree_model)
651 gtk_tree_view_insert_column (GTK_TREE_VIEW (sample_tree_view_top), column, before);
653 gtk_tree_view_insert_column (GTK_TREE_VIEW (sample_tree_view_bottom), column, before);
659 move_row (GtkTreeModel *src,
660 GtkTreeIter *src_iter,
662 GtkTreeIter *dest_iter)
664 if (src == left_tree_model)
665 move_to_right (src_iter, dest, dest_iter);
666 else if (dest == left_tree_model)
667 move_to_left (src, src_iter, dest_iter);
669 move_up_or_down (src, src_iter, dest, dest_iter);
673 add_left_clicked (GtkWidget *button,
678 GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (data));
680 gtk_tree_selection_get_selected (selection, NULL, &iter);
682 move_to_left (gtk_tree_view_get_model (GTK_TREE_VIEW (data)), &iter, NULL);
686 add_right_clicked (GtkWidget *button, gpointer data)
690 GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view));
692 gtk_tree_selection_get_selected (selection, NULL, &iter);
694 move_to_right (&iter, gtk_tree_view_get_model (GTK_TREE_VIEW (data)), NULL);
698 selection_changed (GtkTreeSelection *selection, GtkWidget *button)
700 if (gtk_tree_selection_get_selected (selection, NULL, NULL))
701 gtk_widget_set_sensitive (button, TRUE);
703 gtk_widget_set_sensitive (button, FALSE);
706 static GtkTargetEntry row_targets[] = {
707 { "GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_APP, 0}
711 main (int argc, char *argv[])
714 GtkWidget *hbox, *vbox;
715 GtkWidget *vbox2, *bbox;
717 GtkTreeViewColumn *column;
718 GtkCellRenderer *cell;
720 GtkTreeModel *sample_model;
723 gtk_init (&argc, &argv);
725 /* First initialize all the models for signal purposes */
726 left_tree_model = (GtkTreeModel *) gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
727 sample_model = (GtkTreeModel *) gtk_list_store_new (1, G_TYPE_STRING);
728 sample_tree_view_top = gtk_tree_view_new_with_model (sample_model);
729 sample_tree_view_bottom = gtk_tree_view_new_with_model (sample_model);
730 top_right_tree_model = (GtkTreeModel *) view_column_model_new (GTK_TREE_VIEW (sample_tree_view_top));
731 bottom_right_tree_model = (GtkTreeModel *) view_column_model_new (GTK_TREE_VIEW (sample_tree_view_bottom));
732 top_right_tree_view = gtk_tree_view_new_with_model (top_right_tree_model);
733 bottom_right_tree_view = gtk_tree_view_new_with_model (bottom_right_tree_model);
735 for (i = 0; i < 10; i++)
738 gchar *string = g_strdup_printf ("%d", i);
739 gtk_list_store_append (GTK_LIST_STORE (sample_model), &iter);
740 gtk_list_store_set (GTK_LIST_STORE (sample_model), &iter, 0, string, -1);
744 /* Set up the test windows. */
745 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
746 g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
747 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
748 gtk_window_set_title (GTK_WINDOW (window), "Top Window");
749 swindow = gtk_scrolled_window_new (NULL, NULL);
750 gtk_container_add (GTK_CONTAINER (window), swindow);
751 gtk_container_add (GTK_CONTAINER (swindow), sample_tree_view_top);
752 gtk_widget_show_all (window);
754 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
755 g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
756 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
757 gtk_window_set_title (GTK_WINDOW (window), "Bottom Window");
758 swindow = gtk_scrolled_window_new (NULL, NULL);
759 gtk_container_add (GTK_CONTAINER (window), swindow);
760 gtk_container_add (GTK_CONTAINER (swindow), sample_tree_view_bottom);
761 gtk_widget_show_all (window);
763 /* Set up the main window */
764 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
765 g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
766 gtk_window_set_default_size (GTK_WINDOW (window), 500, 300);
767 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
768 gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
769 gtk_container_add (GTK_CONTAINER (window), vbox);
771 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
772 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
775 cell = gtk_cell_renderer_text_new ();
777 swindow = gtk_scrolled_window_new (NULL, NULL);
778 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
779 left_tree_view = gtk_tree_view_new_with_model (left_tree_model);
780 gtk_container_add (GTK_CONTAINER (swindow), left_tree_view);
781 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (left_tree_view), -1,
782 "Unattached Columns", cell, "text", 0, NULL);
783 cell = gtk_cell_renderer_toggle_new ();
784 g_signal_connect (cell, "toggled", G_CALLBACK (set_visible), left_tree_view);
785 column = gtk_tree_view_column_new_with_attributes ("Visible", cell, NULL);
786 gtk_tree_view_append_column (GTK_TREE_VIEW (left_tree_view), column);
788 gtk_tree_view_column_set_cell_data_func (column, cell, get_visible, NULL, NULL);
789 gtk_box_pack_start (GTK_BOX (hbox), swindow, TRUE, TRUE, 0);
792 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
793 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
795 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
796 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_SPREAD);
797 gtk_box_pack_start (GTK_BOX (vbox2), bbox, TRUE, TRUE, 0);
799 button = gtk_button_new_with_mnemonic ("<< (_Q)");
800 gtk_widget_set_sensitive (button, FALSE);
801 g_signal_connect (button, "clicked", G_CALLBACK (add_left_clicked), top_right_tree_view);
802 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (top_right_tree_view)),
803 "changed", G_CALLBACK (selection_changed), button);
804 gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
806 button = gtk_button_new_with_mnemonic (">> (_W)");
807 gtk_widget_set_sensitive (button, FALSE);
808 g_signal_connect (button, "clicked", G_CALLBACK (add_right_clicked), top_right_tree_view);
809 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view)),
810 "changed", G_CALLBACK (selection_changed), button);
811 gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
813 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
814 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_SPREAD);
815 gtk_box_pack_start (GTK_BOX (vbox2), bbox, TRUE, TRUE, 0);
817 button = gtk_button_new_with_mnemonic ("<< (_E)");
818 gtk_widget_set_sensitive (button, FALSE);
819 g_signal_connect (button, "clicked", G_CALLBACK (add_left_clicked), bottom_right_tree_view);
820 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (bottom_right_tree_view)),
821 "changed", G_CALLBACK (selection_changed), button);
822 gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
824 button = gtk_button_new_with_mnemonic (">> (_R)");
825 gtk_widget_set_sensitive (button, FALSE);
826 g_signal_connect (button, "clicked", G_CALLBACK (add_right_clicked), bottom_right_tree_view);
827 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view)),
828 "changed", G_CALLBACK (selection_changed), button);
829 gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
833 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
834 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0);
836 swindow = gtk_scrolled_window_new (NULL, NULL);
837 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
838 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (top_right_tree_view), FALSE);
839 cell = gtk_cell_renderer_text_new ();
840 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (top_right_tree_view), -1,
841 NULL, cell, "text", 0, NULL);
842 cell = gtk_cell_renderer_toggle_new ();
843 g_signal_connect (cell, "toggled", G_CALLBACK (set_visible), top_right_tree_view);
844 column = gtk_tree_view_column_new_with_attributes (NULL, cell, NULL);
845 gtk_tree_view_column_set_cell_data_func (column, cell, get_visible, NULL, NULL);
846 gtk_tree_view_append_column (GTK_TREE_VIEW (top_right_tree_view), column);
848 gtk_container_add (GTK_CONTAINER (swindow), top_right_tree_view);
849 gtk_box_pack_start (GTK_BOX (vbox2), swindow, TRUE, TRUE, 0);
851 swindow = gtk_scrolled_window_new (NULL, NULL);
852 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
853 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (bottom_right_tree_view), FALSE);
854 cell = gtk_cell_renderer_text_new ();
855 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (bottom_right_tree_view), -1,
856 NULL, cell, "text", 0, NULL);
857 cell = gtk_cell_renderer_toggle_new ();
858 g_signal_connect (cell, "toggled", G_CALLBACK (set_visible), bottom_right_tree_view);
859 column = gtk_tree_view_column_new_with_attributes (NULL, cell, NULL);
860 gtk_tree_view_column_set_cell_data_func (column, cell, get_visible, NULL, NULL);
861 gtk_tree_view_append_column (GTK_TREE_VIEW (bottom_right_tree_view), column);
862 gtk_container_add (GTK_CONTAINER (swindow), bottom_right_tree_view);
863 gtk_box_pack_start (GTK_BOX (vbox2), swindow, TRUE, TRUE, 0);
867 gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (left_tree_view),
870 G_N_ELEMENTS (row_targets),
872 gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW (left_tree_view),
874 G_N_ELEMENTS (row_targets),
877 gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (top_right_tree_view),
880 G_N_ELEMENTS (row_targets),
882 gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW (top_right_tree_view),
884 G_N_ELEMENTS (row_targets),
887 gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (bottom_right_tree_view),
890 G_N_ELEMENTS (row_targets),
892 gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW (bottom_right_tree_view),
894 G_N_ELEMENTS (row_targets),
898 gtk_box_pack_start (GTK_BOX (vbox), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL),
901 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
902 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
903 button = gtk_button_new_with_mnemonic ("_Add new Column");
904 g_signal_connect (button, "clicked", G_CALLBACK (add_clicked), left_tree_model);
905 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
907 gtk_widget_show_all (window);