5 * README README README README README README README README README README
6 * README README README README README README README README README README
7 * README README README README README README README README README README
8 * README README README README README README README README README README
9 * README README README README README README README README README README
10 * README README README README README README README README README README
11 * README README README README README README README README README README
12 * README README README README README README README README README README
13 * README README README README README README README README README README
14 * README README README README README README README README README README
15 * README README README README README README README README README README
16 * README README README README README README README README README README
17 * README README README README README README README README README README
19 * DO NOT!!! I REPEAT DO NOT! EVER LOOK AT THIS CODE AS AN EXAMPLE OF WHAT YOUR
20 * CODE SHOULD LOOK LIKE.
22 * IT IS VERY CONFUSING, AND IS MEANT TO TEST A LOT OF CODE IN THE TREE. WHILE
23 * IT IS ACTUALLY CORRECT CODE, IT IS NOT USEFUL.
26 GtkWidget *left_tree_view;
27 GtkWidget *top_right_tree_view;
28 GtkWidget *bottom_right_tree_view;
29 GtkTreeModel *left_tree_model;
30 GtkTreeModel *top_right_tree_model;
31 GtkTreeModel *bottom_right_tree_model;
32 GtkWidget *sample_tree_view_top;
33 GtkWidget *sample_tree_view_bottom;
35 #define column_data "my_column_data"
37 static void move_row (GtkTreeModel *src,
38 GtkTreeIter *src_iter,
40 GtkTreeIter *dest_iter);
42 /* Kids, don't try this at home. */
44 /* Small GtkTreeModel to model columns */
45 typedef struct _ViewColumnModel ViewColumnModel;
46 typedef struct _ViewColumnModelClass ViewColumnModelClass;
48 struct _ViewColumnModel
56 struct _ViewColumnModelClass
58 GObjectClass parent_class;
61 static void view_column_model_init (ViewColumnModel *model)
63 model->stamp = g_random_int ();
67 view_column_model_get_n_columns (GtkTreeModel *tree_model)
73 view_column_model_get_column_type (GtkTreeModel *tree_model,
81 return GTK_TYPE_TREE_VIEW_COLUMN;
83 return G_TYPE_INVALID;
88 view_column_model_get_iter (GtkTreeModel *tree_model,
93 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
97 g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
99 i = gtk_tree_path_get_indices (path)[0];
100 list = g_list_nth (view_model->columns, i);
105 iter->stamp = view_model->stamp;
106 iter->user_data = list;
112 view_column_model_get_path (GtkTreeModel *tree_model,
115 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
120 g_return_val_if_fail (iter->stamp == view_model->stamp, NULL);
122 for (list = view_model->columns; list; list = list->next)
124 if (list == (GList *)iter->user_data)
131 retval = gtk_tree_path_new ();
132 gtk_tree_path_append_index (retval, i);
137 view_column_model_get_value (GtkTreeModel *tree_model,
142 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
144 g_return_if_fail (column < 2);
145 g_return_if_fail (view_model->stamp == iter->stamp);
146 g_return_if_fail (iter->user_data != NULL);
150 g_value_init (value, G_TYPE_STRING);
151 g_value_set_string (value, gtk_tree_view_column_get_title (GTK_TREE_VIEW_COLUMN (((GList *)iter->user_data)->data)));
155 g_value_init (value, GTK_TYPE_TREE_VIEW_COLUMN);
156 g_value_set_object (value, ((GList *)iter->user_data)->data);
161 view_column_model_iter_next (GtkTreeModel *tree_model,
164 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
166 g_return_val_if_fail (view_model->stamp == iter->stamp, FALSE);
167 g_return_val_if_fail (iter->user_data != NULL, FALSE);
169 iter->user_data = ((GList *)iter->user_data)->next;
170 return iter->user_data != NULL;
174 view_column_model_iter_children (GtkTreeModel *tree_model,
178 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
180 /* this is a list, nodes have no children */
184 /* but if parent == NULL we return the list itself as children of the
188 if (view_model->columns)
190 iter->stamp = view_model->stamp;
191 iter->user_data = view_model->columns;
199 view_column_model_iter_has_child (GtkTreeModel *tree_model,
206 view_column_model_iter_n_children (GtkTreeModel *tree_model,
209 return g_list_length (((ViewColumnModel *)tree_model)->columns);
213 view_column_model_iter_nth_child (GtkTreeModel *tree_model,
218 ViewColumnModel *view_model = (ViewColumnModel *)tree_model;
223 iter->stamp = view_model->stamp;
224 iter->user_data = g_list_nth ((GList *)view_model->columns, n);
226 return (iter->user_data != NULL);
230 view_column_model_iter_parent (GtkTreeModel *tree_model,
238 view_column_model_tree_model_init (GtkTreeModelIface *iface)
240 iface->get_n_columns = view_column_model_get_n_columns;
241 iface->get_column_type = view_column_model_get_column_type;
242 iface->get_iter = view_column_model_get_iter;
243 iface->get_path = view_column_model_get_path;
244 iface->get_value = view_column_model_get_value;
245 iface->iter_next = view_column_model_iter_next;
246 iface->iter_children = view_column_model_iter_children;
247 iface->iter_has_child = view_column_model_iter_has_child;
248 iface->iter_n_children = view_column_model_iter_n_children;
249 iface->iter_nth_child = view_column_model_iter_nth_child;
250 iface->iter_parent = view_column_model_iter_parent;
254 view_column_model_drag_data_get (GtkTreeDragSource *drag_source,
256 GtkSelectionData *selection_data)
258 if (gtk_tree_set_row_drag_data (selection_data,
259 GTK_TREE_MODEL (drag_source),
267 view_column_model_drag_data_delete (GtkTreeDragSource *drag_source,
270 /* Nothing -- we handle moves on the dest side */
276 view_column_model_row_drop_possible (GtkTreeDragDest *drag_dest,
277 GtkTreePath *dest_path,
278 GtkSelectionData *selection_data)
280 GtkTreeModel *src_model;
282 if (gtk_tree_get_row_drag_data (selection_data,
286 if (src_model == left_tree_model ||
287 src_model == top_right_tree_model ||
288 src_model == bottom_right_tree_model)
296 view_column_model_drag_data_received (GtkTreeDragDest *drag_dest,
298 GtkSelectionData *selection_data)
300 GtkTreeModel *src_model;
301 GtkTreePath *src_path = NULL;
302 gboolean retval = FALSE;
304 if (gtk_tree_get_row_drag_data (selection_data,
308 GtkTreeIter src_iter;
309 GtkTreeIter dest_iter;
312 /* We are a little lazy here, and assume if we can't convert dest
313 * to an iter, we need to append. See gtkliststore.c for a more
314 * careful handling of this.
316 have_dest = gtk_tree_model_get_iter (GTK_TREE_MODEL (drag_dest), &dest_iter, dest);
318 if (gtk_tree_model_get_iter (src_model, &src_iter, src_path))
320 if (src_model == left_tree_model ||
321 src_model == top_right_tree_model ||
322 src_model == bottom_right_tree_model)
324 move_row (src_model, &src_iter, GTK_TREE_MODEL (drag_dest),
325 have_dest ? &dest_iter : NULL);
330 gtk_tree_path_free (src_path);
337 view_column_model_drag_source_init (GtkTreeDragSourceIface *iface)
339 iface->drag_data_get = view_column_model_drag_data_get;
340 iface->drag_data_delete = view_column_model_drag_data_delete;
344 view_column_model_drag_dest_init (GtkTreeDragDestIface *iface)
346 iface->drag_data_received = view_column_model_drag_data_received;
347 iface->row_drop_possible = view_column_model_row_drop_possible;
351 view_column_model_get_type (void)
353 static GType view_column_model_type = 0;
355 if (!view_column_model_type)
357 static const GTypeInfo view_column_model_info =
359 sizeof (GtkListStoreClass),
360 NULL, /* base_init */
361 NULL, /* base_finalize */
362 NULL, /* class_init */
363 NULL, /* class_finalize */
364 NULL, /* class_data */
365 sizeof (GtkListStore),
367 (GInstanceInitFunc) view_column_model_init,
370 static const GInterfaceInfo tree_model_info =
372 (GInterfaceInitFunc) view_column_model_tree_model_init,
377 static const GInterfaceInfo drag_source_info =
379 (GInterfaceInitFunc) view_column_model_drag_source_init,
384 static const GInterfaceInfo drag_dest_info =
386 (GInterfaceInitFunc) view_column_model_drag_dest_init,
391 view_column_model_type = g_type_register_static (G_TYPE_OBJECT, "ViewModelColumn", &view_column_model_info, 0);
392 g_type_add_interface_static (view_column_model_type,
395 g_type_add_interface_static (view_column_model_type,
396 GTK_TYPE_TREE_DRAG_SOURCE,
398 g_type_add_interface_static (view_column_model_type,
399 GTK_TYPE_TREE_DRAG_DEST,
403 return view_column_model_type;
407 update_columns (GtkTreeView *view, ViewColumnModel *view_model)
409 GList *old_columns = view_model->columns;
410 gint old_length, length;
413 view_model->columns = gtk_tree_view_get_columns (view_model->view);
415 /* As the view tells us one change at a time, we can do this hack. */
416 length = g_list_length (view_model->columns);
417 old_length = g_list_length (old_columns);
418 if (length != old_length)
423 /* where are they different */
424 for (a = old_columns, b = view_model->columns; a && b; a = a->next, b = b->next)
426 if (a->data != b->data)
430 path = gtk_tree_path_new ();
431 gtk_tree_path_append_index (path, i);
432 if (length < old_length)
435 gtk_tree_model_row_deleted (GTK_TREE_MODEL (view_model), path);
440 iter.stamp = view_model->stamp;
442 gtk_tree_model_row_inserted (GTK_TREE_MODEL (view_model), path, &iter);
444 gtk_tree_path_free (path);
453 new_order = g_new (int, length);
454 a = old_columns; b = view_model->columns;
456 while (a->data == b->data)
465 if (a->next->data == b->data)
468 while (b->data != a->data)
473 for (i = 0; i < m; i++)
475 for (i = m; i < m+n; i++)
478 for (i = m + n +1; i < length; i++)
484 while (a->data != b->data)
489 for (i = 0; i < m; i++)
492 for (i = m+1; i < m + n+ 1; i++)
493 new_order[i] = i - 1;
494 for (i = m + n + 1; i < length; i++)
498 path = gtk_tree_path_new ();
499 gtk_tree_model_rows_reordered (GTK_TREE_MODEL (view_model),
503 gtk_tree_path_free (path);
507 g_list_free (old_columns);
510 static GtkTreeModel *
511 view_column_model_new (GtkTreeView *view)
513 GtkTreeModel *retval;
515 retval = GTK_TREE_MODEL (g_object_new (view_column_model_get_type (), NULL));
516 ((ViewColumnModel *)retval)->view = view;
517 ((ViewColumnModel *)retval)->columns = gtk_tree_view_get_columns (view);
519 g_signal_connect (view, "columns_changed", G_CALLBACK (update_columns), retval);
528 add_clicked (GtkWidget *button, gpointer data)
533 GtkTreeViewColumn *column;
534 GtkTreeSelection *selection;
535 GtkCellRenderer *cell;
536 gchar *label = g_strdup_printf ("Column %d", i);
538 cell = gtk_cell_renderer_text_new ();
539 column = gtk_tree_view_column_new_with_attributes (label, cell, "text", 0, NULL);
540 g_object_set_data_full (G_OBJECT (column), column_data, label, g_free);
541 gtk_tree_view_column_set_reorderable (column, TRUE);
542 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
543 gtk_tree_view_column_set_resizable (column, TRUE);
544 gtk_list_store_append (GTK_LIST_STORE (left_tree_model), &iter);
545 gtk_list_store_set (GTK_LIST_STORE (left_tree_model), &iter, 0, label, 1, column, -1);
548 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view));
549 gtk_tree_selection_select_iter (selection, &iter);
553 get_visible (GtkTreeViewColumn *tree_column,
554 GtkCellRenderer *cell,
555 GtkTreeModel *tree_model,
559 GtkTreeViewColumn *column;
561 gtk_tree_model_get (tree_model, iter, 1, &column, -1);
564 gtk_cell_renderer_toggle_set_active (GTK_CELL_RENDERER_TOGGLE (cell),
565 gtk_tree_view_column_get_visible (column));
570 set_visible (GtkCellRendererToggle *cell,
574 GtkTreeView *tree_view = (GtkTreeView *) data;
575 GtkTreeViewColumn *column;
578 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
580 model = gtk_tree_view_get_model (tree_view);
582 gtk_tree_model_get_iter (model, &iter, path);
583 gtk_tree_model_get (model, &iter, 1, &column, -1);
587 gtk_tree_view_column_set_visible (column, ! gtk_tree_view_column_get_visible (column));
588 gtk_tree_model_row_changed (model, path, &iter);
590 gtk_tree_path_free (path);
594 move_to_left (GtkTreeModel *src,
595 GtkTreeIter *src_iter,
596 GtkTreeIter *dest_iter)
599 GtkTreeViewColumn *column;
600 GtkTreeSelection *selection;
603 gtk_tree_model_get (src, src_iter, 0, &label, 1, &column, -1);
605 if (src == top_right_tree_model)
606 gtk_tree_view_remove_column (GTK_TREE_VIEW (sample_tree_view_top), column);
608 gtk_tree_view_remove_column (GTK_TREE_VIEW (sample_tree_view_bottom), column);
610 /* gtk_list_store_remove (GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (data))), &iter);*/
612 /* Put it back on the left */
614 gtk_list_store_insert_before (GTK_LIST_STORE (left_tree_model),
617 gtk_list_store_append (GTK_LIST_STORE (left_tree_model), &iter);
619 gtk_list_store_set (GTK_LIST_STORE (left_tree_model), &iter, 0, label, 1, column, -1);
620 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view));
621 gtk_tree_selection_select_iter (selection, &iter);
627 move_to_right (GtkTreeIter *src_iter,
629 GtkTreeIter *dest_iter)
632 GtkTreeViewColumn *column;
635 gtk_tree_model_get (GTK_TREE_MODEL (left_tree_model),
636 src_iter, 0, &label, 1, &column, -1);
637 gtk_list_store_remove (GTK_LIST_STORE (left_tree_model), src_iter);
641 GtkTreePath *path = gtk_tree_model_get_path (dest, dest_iter);
642 before = (gtk_tree_path_get_indices (path))[0];
643 gtk_tree_path_free (path);
646 if (dest == top_right_tree_model)
647 gtk_tree_view_insert_column (GTK_TREE_VIEW (sample_tree_view_top), column, before);
649 gtk_tree_view_insert_column (GTK_TREE_VIEW (sample_tree_view_bottom), column, before);
655 move_up_or_down (GtkTreeModel *src,
656 GtkTreeIter *src_iter,
658 GtkTreeIter *dest_iter)
660 GtkTreeViewColumn *column;
664 gtk_tree_model_get (src, src_iter, 0, &label, 1, &column, -1);
668 GtkTreePath *path = gtk_tree_model_get_path (dest, dest_iter);
669 before = (gtk_tree_path_get_indices (path))[0];
670 gtk_tree_path_free (path);
673 if (src == top_right_tree_model)
674 gtk_tree_view_remove_column (GTK_TREE_VIEW (sample_tree_view_top), column);
676 gtk_tree_view_remove_column (GTK_TREE_VIEW (sample_tree_view_bottom), column);
678 if (dest == top_right_tree_model)
679 gtk_tree_view_insert_column (GTK_TREE_VIEW (sample_tree_view_top), column, before);
681 gtk_tree_view_insert_column (GTK_TREE_VIEW (sample_tree_view_bottom), column, before);
687 move_row (GtkTreeModel *src,
688 GtkTreeIter *src_iter,
690 GtkTreeIter *dest_iter)
692 if (src == left_tree_model)
693 move_to_right (src_iter, dest, dest_iter);
694 else if (dest == left_tree_model)
695 move_to_left (src, src_iter, dest_iter);
697 move_up_or_down (src, src_iter, dest, dest_iter);
701 add_left_clicked (GtkWidget *button,
706 GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (data));
708 gtk_tree_selection_get_selected (selection, NULL, &iter);
710 move_to_left (gtk_tree_view_get_model (GTK_TREE_VIEW (data)), &iter, NULL);
714 add_right_clicked (GtkWidget *button, gpointer data)
718 GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view));
720 gtk_tree_selection_get_selected (selection, NULL, &iter);
722 move_to_right (&iter, gtk_tree_view_get_model (GTK_TREE_VIEW (data)), NULL);
726 selection_changed (GtkTreeSelection *selection, GtkWidget *button)
728 if (gtk_tree_selection_get_selected (selection, NULL, NULL))
729 gtk_widget_set_sensitive (button, TRUE);
731 gtk_widget_set_sensitive (button, FALSE);
734 static GtkTargetEntry row_targets[] = {
735 { "GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_APP, 0}
739 main (int argc, char *argv[])
742 GtkWidget *hbox, *vbox;
743 GtkWidget *vbox2, *bbox;
745 GtkTreeViewColumn *column;
746 GtkCellRenderer *cell;
748 GtkTreeModel *sample_model;
751 gtk_init (&argc, &argv);
753 /* First initialize all the models for signal purposes */
754 left_tree_model = (GtkTreeModel *) gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
755 sample_model = (GtkTreeModel *) gtk_list_store_new (1, G_TYPE_STRING);
756 sample_tree_view_top = gtk_tree_view_new_with_model (sample_model);
757 sample_tree_view_bottom = gtk_tree_view_new_with_model (sample_model);
758 top_right_tree_model = (GtkTreeModel *) view_column_model_new (GTK_TREE_VIEW (sample_tree_view_top));
759 bottom_right_tree_model = (GtkTreeModel *) view_column_model_new (GTK_TREE_VIEW (sample_tree_view_bottom));
760 top_right_tree_view = gtk_tree_view_new_with_model (top_right_tree_model);
761 bottom_right_tree_view = gtk_tree_view_new_with_model (bottom_right_tree_model);
763 for (i = 0; i < 10; i++)
766 gchar *string = g_strdup_printf ("%d", i);
767 gtk_list_store_append (GTK_LIST_STORE (sample_model), &iter);
768 gtk_list_store_set (GTK_LIST_STORE (sample_model), &iter, 0, string, -1);
772 /* Set up the test windows. */
773 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
774 g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
775 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
776 gtk_window_set_title (GTK_WINDOW (window), "Top Window");
777 swindow = gtk_scrolled_window_new (NULL, NULL);
778 gtk_container_add (GTK_CONTAINER (window), swindow);
779 gtk_container_add (GTK_CONTAINER (swindow), sample_tree_view_top);
780 gtk_widget_show_all (window);
782 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
783 g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
784 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
785 gtk_window_set_title (GTK_WINDOW (window), "Bottom Window");
786 swindow = gtk_scrolled_window_new (NULL, NULL);
787 gtk_container_add (GTK_CONTAINER (window), swindow);
788 gtk_container_add (GTK_CONTAINER (swindow), sample_tree_view_bottom);
789 gtk_widget_show_all (window);
791 /* Set up the main window */
792 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
793 g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
794 gtk_window_set_default_size (GTK_WINDOW (window), 500, 300);
795 vbox = gtk_vbox_new (FALSE, 8);
796 gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
797 gtk_container_add (GTK_CONTAINER (window), vbox);
799 hbox = gtk_hbox_new (FALSE, 8);
800 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
803 cell = gtk_cell_renderer_text_new ();
805 swindow = gtk_scrolled_window_new (NULL, NULL);
806 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
807 left_tree_view = gtk_tree_view_new_with_model (left_tree_model);
808 gtk_container_add (GTK_CONTAINER (swindow), left_tree_view);
809 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (left_tree_view), -1,
810 "Unattached Columns", cell, "text", 0, NULL);
811 cell = gtk_cell_renderer_toggle_new ();
812 g_signal_connect (cell, "toggled", G_CALLBACK (set_visible), left_tree_view);
813 column = gtk_tree_view_column_new_with_attributes ("Visible", cell, NULL);
814 gtk_tree_view_append_column (GTK_TREE_VIEW (left_tree_view), column);
816 gtk_tree_view_column_set_cell_data_func (column, cell, get_visible, NULL, NULL);
817 gtk_box_pack_start (GTK_BOX (hbox), swindow, TRUE, TRUE, 0);
820 vbox2 = gtk_vbox_new (FALSE, 8);
821 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
823 bbox = gtk_vbutton_box_new ();
824 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_SPREAD);
825 gtk_box_pack_start (GTK_BOX (vbox2), bbox, TRUE, TRUE, 0);
827 button = gtk_button_new_with_mnemonic ("<< (_Q)");
828 gtk_widget_set_sensitive (button, FALSE);
829 g_signal_connect (button, "clicked", G_CALLBACK (add_left_clicked), top_right_tree_view);
830 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (top_right_tree_view)),
831 "changed", G_CALLBACK (selection_changed), button);
832 gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
834 button = gtk_button_new_with_mnemonic (">> (_W)");
835 gtk_widget_set_sensitive (button, FALSE);
836 g_signal_connect (button, "clicked", G_CALLBACK (add_right_clicked), top_right_tree_view);
837 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view)),
838 "changed", G_CALLBACK (selection_changed), button);
839 gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
841 bbox = gtk_vbutton_box_new ();
842 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_SPREAD);
843 gtk_box_pack_start (GTK_BOX (vbox2), bbox, TRUE, TRUE, 0);
845 button = gtk_button_new_with_mnemonic ("<< (_E)");
846 gtk_widget_set_sensitive (button, FALSE);
847 g_signal_connect (button, "clicked", G_CALLBACK (add_left_clicked), bottom_right_tree_view);
848 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (bottom_right_tree_view)),
849 "changed", G_CALLBACK (selection_changed), button);
850 gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
852 button = gtk_button_new_with_mnemonic (">> (_R)");
853 gtk_widget_set_sensitive (button, FALSE);
854 g_signal_connect (button, "clicked", G_CALLBACK (add_right_clicked), bottom_right_tree_view);
855 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (left_tree_view)),
856 "changed", G_CALLBACK (selection_changed), button);
857 gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
861 vbox2 = gtk_vbox_new (FALSE, 8);
862 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0);
864 swindow = gtk_scrolled_window_new (NULL, NULL);
865 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
866 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (top_right_tree_view), FALSE);
867 cell = gtk_cell_renderer_text_new ();
868 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (top_right_tree_view), -1,
869 NULL, cell, "text", 0, NULL);
870 cell = gtk_cell_renderer_toggle_new ();
871 g_signal_connect (cell, "toggled", G_CALLBACK (set_visible), top_right_tree_view);
872 column = gtk_tree_view_column_new_with_attributes (NULL, cell, NULL);
873 gtk_tree_view_column_set_cell_data_func (column, cell, get_visible, NULL, NULL);
874 gtk_tree_view_append_column (GTK_TREE_VIEW (top_right_tree_view), column);
876 gtk_container_add (GTK_CONTAINER (swindow), top_right_tree_view);
877 gtk_box_pack_start (GTK_BOX (vbox2), swindow, TRUE, TRUE, 0);
879 swindow = gtk_scrolled_window_new (NULL, NULL);
880 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
881 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (bottom_right_tree_view), FALSE);
882 cell = gtk_cell_renderer_text_new ();
883 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (bottom_right_tree_view), -1,
884 NULL, cell, "text", 0, NULL);
885 cell = gtk_cell_renderer_toggle_new ();
886 g_signal_connect (cell, "toggled", G_CALLBACK (set_visible), bottom_right_tree_view);
887 column = gtk_tree_view_column_new_with_attributes (NULL, cell, NULL);
888 gtk_tree_view_column_set_cell_data_func (column, cell, get_visible, NULL, NULL);
889 gtk_tree_view_append_column (GTK_TREE_VIEW (bottom_right_tree_view), column);
890 gtk_container_add (GTK_CONTAINER (swindow), bottom_right_tree_view);
891 gtk_box_pack_start (GTK_BOX (vbox2), swindow, TRUE, TRUE, 0);
895 gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (left_tree_view),
898 G_N_ELEMENTS (row_targets),
900 gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW (left_tree_view),
902 G_N_ELEMENTS (row_targets),
905 gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (top_right_tree_view),
908 G_N_ELEMENTS (row_targets),
910 gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW (top_right_tree_view),
912 G_N_ELEMENTS (row_targets),
915 gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (bottom_right_tree_view),
918 G_N_ELEMENTS (row_targets),
920 gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW (bottom_right_tree_view),
922 G_N_ELEMENTS (row_targets),
926 gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), FALSE, FALSE, 0);
928 hbox = gtk_hbox_new (FALSE, 8);
929 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
930 button = gtk_button_new_with_mnemonic ("_Add new Column");
931 g_signal_connect (button, "clicked", G_CALLBACK (add_clicked), left_tree_model);
932 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
934 gtk_widget_show_all (window);