1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the Free
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 #include "gtktreeitem.h"
21 #include "gtksignal.h"
31 typedef void (*GtkTreeSignal) (GtkObject *object,
36 static void gtk_tree_class_init (GtkTreeClass *klass);
37 static void gtk_tree_init (GtkTree *tree);
38 static void gtk_tree_destroy (GtkObject *object);
39 static void gtk_tree_map (GtkWidget *widget);
40 static void gtk_tree_unmap (GtkWidget *widget);
41 static void gtk_tree_realize (GtkWidget *widget);
42 static void gtk_tree_draw (GtkWidget *widget,
44 static gint gtk_tree_expose (GtkWidget *widget,
45 GdkEventExpose *event);
46 static gint gtk_tree_motion_notify (GtkWidget *widget,
47 GdkEventMotion *event);
48 static gint gtk_tree_button_press (GtkWidget *widget,
49 GdkEventButton *event);
50 static gint gtk_tree_button_release (GtkWidget *widget,
51 GdkEventButton *event);
52 static void gtk_tree_size_request (GtkWidget *widget,
53 GtkRequisition *requisition);
54 static void gtk_tree_size_allocate (GtkWidget *widget,
55 GtkAllocation *allocation);
56 static void gtk_tree_add (GtkContainer *container,
58 static void gtk_tree_remove (GtkContainer *container,
60 static void gtk_tree_foreach (GtkContainer *container,
62 gpointer callback_data);
64 static void gtk_real_tree_select_child (GtkTree *tree,
66 static void gtk_real_tree_unselect_child (GtkTree *tree,
69 static void gtk_tree_marshal_signal (GtkObject *object,
74 static GtkContainerClass *parent_class = NULL;
75 static gint tree_signals[LAST_SIGNAL] = { 0 };
80 static guint tree_type = 0;
84 GtkTypeInfo tree_info =
88 sizeof (GtkTreeClass),
89 (GtkClassInitFunc) gtk_tree_class_init,
90 (GtkObjectInitFunc) gtk_tree_init,
94 tree_type = gtk_type_unique (gtk_container_get_type (), &tree_info);
101 gtk_tree_class_init (GtkTreeClass *class)
103 GtkObjectClass *object_class;
104 GtkWidgetClass *widget_class;
105 GtkContainerClass *container_class;
107 object_class = (GtkObjectClass*) class;
108 widget_class = (GtkWidgetClass*) class;
109 container_class = (GtkContainerClass*) class;
111 parent_class = gtk_type_class (gtk_container_get_type ());
113 tree_signals[SELECTION_CHANGED] =
114 gtk_signal_new ("selection_changed",
117 GTK_SIGNAL_OFFSET (GtkTreeClass, selection_changed),
118 gtk_signal_default_marshaller,
120 tree_signals[SELECT_CHILD] =
121 gtk_signal_new ("select_child",
124 GTK_SIGNAL_OFFSET (GtkTreeClass, select_child),
125 gtk_tree_marshal_signal,
128 tree_signals[UNSELECT_CHILD] =
129 gtk_signal_new ("unselect_child",
132 GTK_SIGNAL_OFFSET (GtkTreeClass, unselect_child),
133 gtk_tree_marshal_signal,
137 gtk_object_class_add_signals (object_class, tree_signals, LAST_SIGNAL);
139 object_class->destroy = gtk_tree_destroy;
141 widget_class->map = gtk_tree_map;
142 widget_class->unmap = gtk_tree_unmap;
143 widget_class->realize = gtk_tree_realize;
144 widget_class->draw = gtk_tree_draw;
145 widget_class->expose_event = gtk_tree_expose;
146 widget_class->motion_notify_event = gtk_tree_motion_notify;
147 widget_class->button_press_event = gtk_tree_button_press;
148 widget_class->button_release_event = gtk_tree_button_release;
149 widget_class->size_request = gtk_tree_size_request;
150 widget_class->size_allocate = gtk_tree_size_allocate;
152 container_class->add = gtk_tree_add;
153 container_class->remove = gtk_tree_remove;
154 container_class->foreach = gtk_tree_foreach;
156 class->selection_changed = NULL;
157 class->select_child = gtk_real_tree_select_child;
158 class->unselect_child = gtk_real_tree_unselect_child;
162 gtk_tree_init (GtkTree *tree)
164 tree->children = NULL;
165 tree->root_tree = NULL;
166 tree->selection = NULL;
167 tree->tree_owner = NULL;
168 tree->selection_mode = GTK_SELECTION_SINGLE;
169 tree->indent_value = 9;
170 tree->current_indent = 0;
172 tree->view_mode = GTK_TREE_VIEW_LINE;
179 return GTK_WIDGET (gtk_type_new (gtk_tree_get_type ()));
183 gtk_tree_append (GtkTree *tree,
187 g_return_if_fail (tree != NULL);
188 g_return_if_fail (GTK_IS_TREE_ITEM (child));
190 gtk_tree_insert(tree, child, -1);
194 gtk_tree_prepend (GtkTree *tree,
197 g_return_if_fail (tree != NULL);
198 g_return_if_fail (GTK_IS_TREE_ITEM (child));
200 gtk_tree_insert(tree, child, 0);
205 gtk_tree_insert (GtkTree *tree,
211 g_return_if_fail (tree != NULL || child != NULL);
212 g_return_if_fail (GTK_IS_TREE_ITEM(child));
214 /* set parent widget to item */
215 gtk_widget_set_parent (child, GTK_WIDGET (tree));
217 if (GTK_WIDGET_VISIBLE (child->parent))
219 if (GTK_WIDGET_REALIZED (child->parent) &&
220 !GTK_WIDGET_REALIZED (child))
221 gtk_widget_realize (child);
223 if (GTK_WIDGET_MAPPED (child->parent) &&
224 !GTK_WIDGET_MAPPED (child))
225 gtk_widget_map (child);
228 nchildren = g_list_length (tree->children);
230 if ((position < 0) || (position > nchildren))
231 position = nchildren;
233 if (position == nchildren)
235 tree->children = g_list_append(tree->children, child);
239 g_list_insert(tree->children, child, position);
242 if (GTK_WIDGET_VISIBLE (tree))
243 gtk_widget_queue_resize (GTK_WIDGET (tree));
248 gtk_tree_add (GtkContainer *container,
253 g_return_if_fail (container != NULL);
254 g_return_if_fail (GTK_IS_TREE (container));
255 g_return_if_fail (widget != NULL);
257 tree = GTK_TREE (container);
259 gtk_widget_set_parent (widget, GTK_WIDGET (container));
260 if (GTK_WIDGET_VISIBLE (widget->parent))
262 if (GTK_WIDGET_REALIZED (widget->parent) &&
263 !GTK_WIDGET_REALIZED (widget))
264 gtk_widget_realize (widget);
266 if (GTK_WIDGET_MAPPED (widget->parent) &&
267 !GTK_WIDGET_MAPPED (widget))
268 gtk_widget_map (widget);
271 tree->children = g_list_append (tree->children, widget);
274 if (!tree->selection && (tree->selection_mode == GTK_SELECTION_BROWSE))
276 gtk_tree_select_child (tree, widget);
280 if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (container))
281 gtk_widget_queue_resize (widget);
286 gtk_tree_button_press (GtkWidget *widget,
287 GdkEventButton *event)
292 g_return_val_if_fail (widget != NULL, FALSE);
293 g_return_val_if_fail (GTK_IS_TREE (widget), FALSE);
294 g_return_val_if_fail (event != NULL, FALSE);
296 tree = GTK_TREE (widget);
297 item = gtk_get_event_widget ((GdkEvent*) event);
299 while (!gtk_type_is_a (GTK_WIDGET_TYPE (item), gtk_tree_item_get_type ()))
302 switch(event->button)
305 gtk_tree_select_child (tree, item);
308 if(GTK_TREE_ITEM(item)->subtree) gtk_tree_item_expand(GTK_TREE_ITEM(item));
311 if(GTK_TREE_ITEM(item)->subtree) gtk_tree_item_collapse(GTK_TREE_ITEM(item));
319 gtk_tree_button_release (GtkWidget *widget,
320 GdkEventButton *event)
325 g_return_val_if_fail (widget != NULL, FALSE);
326 g_return_val_if_fail (GTK_IS_TREE (widget), FALSE);
327 g_return_val_if_fail (event != NULL, FALSE);
329 tree = GTK_TREE (widget);
330 item = gtk_get_event_widget ((GdkEvent*) event);
336 gtk_tree_child_position (GtkTree *tree,
343 g_return_val_if_fail (tree != NULL, -1);
344 g_return_val_if_fail (GTK_IS_TREE (tree), -1);
345 g_return_val_if_fail (child != NULL, -1);
348 children = tree->children;
352 if (child == GTK_WIDGET (children->data))
356 children = children->next;
364 gtk_tree_clear_items (GtkTree *tree,
368 g_return_if_fail (tree != NULL);
369 g_return_if_fail (GTK_IS_TREE (tree));
374 gtk_tree_destroy (GtkObject *object)
380 g_return_if_fail (object != NULL);
381 g_return_if_fail (GTK_IS_TREE (object));
383 tree = GTK_TREE (object);
385 children = tree->children;
388 child = children->data;
389 children = children->next;
391 child->parent = NULL;
392 gtk_object_unref (GTK_OBJECT (child));
393 gtk_widget_destroy (child);
396 g_list_free (tree->children);
398 if(tree->root_tree == NULL)
399 g_list_free (tree->selection);
401 if (GTK_OBJECT_CLASS (parent_class)->destroy)
402 (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
406 gtk_tree_draw (GtkWidget *widget,
412 GdkRectangle child_area;
416 g_return_if_fail (widget != NULL);
417 g_return_if_fail (GTK_IS_TREE (widget));
418 g_return_if_fail (area != NULL);
420 if (GTK_WIDGET_DRAWABLE (widget))
422 tree = GTK_TREE (widget);
424 children = tree->children;
427 child = children->data;
428 children = children->next;
430 if (gtk_widget_intersect (child, area, &child_area))
431 gtk_widget_draw (child, &child_area);
433 if((subtree = GTK_TREE_ITEM(child)->subtree) &&
434 GTK_WIDGET_VISIBLE(subtree) &&
435 gtk_widget_intersect (subtree, area, &child_area))
436 gtk_widget_draw (subtree, &child_area);
443 gtk_tree_expose (GtkWidget *widget,
444 GdkEventExpose *event)
448 GdkEventExpose child_event;
452 g_return_val_if_fail (widget != NULL, FALSE);
453 g_return_val_if_fail (GTK_IS_TREE (widget), FALSE);
454 g_return_val_if_fail (event != NULL, FALSE);
456 if (GTK_WIDGET_DRAWABLE (widget))
458 tree = GTK_TREE (widget);
460 child_event = *event;
462 children = tree->children;
465 child = children->data;
466 children = children->next;
468 if (GTK_WIDGET_NO_WINDOW (child) &&
469 gtk_widget_intersect (child, &event->area, &child_event.area))
470 gtk_widget_event (child, (GdkEvent*) &child_event);
479 gtk_tree_foreach (GtkContainer *container,
480 GtkCallback callback,
481 gpointer callback_data)
488 g_return_if_fail (container != NULL);
489 g_return_if_fail (GTK_IS_TREE (container));
490 g_return_if_fail (callback != NULL);
492 tree = GTK_TREE (container);
493 children = tree->children;
497 child = children->data;
498 children = children->next;
500 (* callback) (child, callback_data);
502 if(GTK_TREE_ITEM(child)->subtree)
503 (* callback)(GTK_TREE_ITEM(child)->subtree, callback_data);
508 gtk_tree_map (GtkWidget *widget)
515 g_return_if_fail (widget != NULL);
516 g_return_if_fail (GTK_IS_TREE (widget));
518 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
519 tree = GTK_TREE (widget);
521 gdk_window_show (widget->window);
523 if(GTK_IS_TREE(widget->parent))
525 /* set root tree for this tree */
526 tree->root_tree = GTK_TREE(widget->parent)->root_tree;
528 tree->level = GTK_TREE(GTK_WIDGET(tree)->parent)->level+1;
529 tree->indent_value = GTK_TREE(GTK_WIDGET(tree)->parent)->indent_value;
530 tree->current_indent = GTK_TREE(GTK_WIDGET(tree)->parent)->current_indent +
532 tree->view_mode = GTK_TREE(GTK_WIDGET(tree)->parent)->view_mode;
533 tree->view_line = GTK_TREE(GTK_WIDGET(tree)->parent)->view_line;
536 tree->root_tree = tree;
538 children = tree->children;
541 child = children->data;
542 children = children->next;
544 if (GTK_WIDGET_VISIBLE (child) &&
545 !GTK_WIDGET_MAPPED (child))
546 gtk_widget_map (child);
548 if ((child = GTK_WIDGET(GTK_TREE_ITEM(child)->subtree)) &&
549 GTK_WIDGET_VISIBLE (child) &&
550 !GTK_WIDGET_MAPPED (child))
551 gtk_widget_map (child);
556 gtk_tree_marshal_signal (GtkObject *object,
563 rfunc = (GtkTreeSignal) func;
565 (* rfunc) (object, GTK_VALUE_OBJECT (args[0]), func_data);
569 gtk_tree_motion_notify (GtkWidget *widget,
570 GdkEventMotion *event)
572 g_return_val_if_fail (widget != NULL, FALSE);
573 g_return_val_if_fail (GTK_IS_TREE (widget), FALSE);
574 g_return_val_if_fail (event != NULL, FALSE);
576 g_print("gtk_tree_motion_notify\n");
582 gtk_tree_realize (GtkWidget *widget)
584 GdkWindowAttr attributes;
585 gint attributes_mask;
588 g_return_if_fail (widget != NULL);
589 g_return_if_fail (GTK_IS_TREE (widget));
591 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
593 attributes.window_type = GDK_WINDOW_CHILD;
594 attributes.x = widget->allocation.x;
595 attributes.y = widget->allocation.y;
596 attributes.width = widget->allocation.width;
597 attributes.height = widget->allocation.height;
598 attributes.wclass = GDK_INPUT_OUTPUT;
599 attributes.visual = gtk_widget_get_visual (widget);
600 attributes.colormap = gtk_widget_get_colormap (widget);
601 attributes.event_mask = GDK_EXPOSURE_MASK;
603 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
605 widget->window = gdk_window_new (widget->parent->window, &attributes, attributes_mask);
606 gdk_window_set_user_data (widget->window, widget);
608 widget->style = gtk_style_attach (widget->style, widget->window);
609 gdk_window_set_background (widget->window, &widget->style->white);
614 gtk_tree_remove (GtkContainer *container,
619 g_return_if_fail (container != NULL);
620 g_return_if_fail (GTK_IS_TREE (container));
621 g_return_if_fail (widget != NULL);
622 g_return_if_fail (container == GTK_CONTAINER (widget->parent));
624 item_list = g_list_alloc ();
625 item_list->data = widget;
627 gtk_tree_remove_items (GTK_TREE (container), item_list);
629 g_list_free (item_list);
633 gtk_tree_remove_items (GtkTree *tree,
637 GList *selected_widgets;
639 GtkTree *real_tree, *root_tree;
641 g_return_if_fail (tree != NULL);
642 g_return_if_fail (GTK_IS_TREE (tree));
644 root_tree = GTK_TREE(GTK_TREE_ROOT_TREE(tree));
646 selected_widgets = NULL;
651 widget = tmp_list->data;
652 tmp_list = tmp_list->next;
654 /* get real owner of this widget */
655 real_tree = GTK_TREE(widget->parent);
657 if (widget->state == GTK_STATE_SELECTED)
658 selected_widgets = g_list_prepend (selected_widgets, widget);
660 /* remove this item of his real parent */
661 real_tree->children = g_list_remove (real_tree->children, widget);
663 /* delete subtree if there is no children in it */
664 if(real_tree->children == NULL &&
665 real_tree != root_tree)
667 gtk_tree_item_remove_subtree(GTK_TREE_ITEM(real_tree->tree_owner));
670 /* remove subtree associate at this item if it exist */
671 if(GTK_TREE_ITEM(widget)->subtree)
673 if (GTK_WIDGET_MAPPED (GTK_TREE_ITEM(widget)->subtree))
674 gtk_widget_unmap (GTK_TREE_ITEM(widget)->subtree);
676 gtk_widget_unparent (GTK_TREE_ITEM(widget)->subtree);
679 /* remove really widget for this item */
680 if (GTK_WIDGET_MAPPED (widget))
681 gtk_widget_unmap (widget);
683 gtk_widget_unparent (widget);
686 if (selected_widgets)
688 tmp_list = selected_widgets;
691 widget = tmp_list->data;
692 tmp_list = tmp_list->next;
694 gtk_tree_unselect_child (tree, widget);
698 g_list_free (selected_widgets);
700 if (root_tree->children && !root_tree->selection &&
701 (root_tree->selection_mode == GTK_SELECTION_BROWSE))
703 widget = root_tree->children->data;
704 gtk_tree_select_child (root_tree, widget);
707 if (GTK_WIDGET_VISIBLE (root_tree))
708 gtk_widget_queue_resize (GTK_WIDGET (root_tree));
712 gtk_tree_select_child (GtkTree *tree,
716 gtk_signal_emit (GTK_OBJECT (tree), tree_signals[SELECT_CHILD], child);
721 gtk_tree_select_item (GtkTree *tree,
727 g_return_if_fail (tree != NULL);
728 g_return_if_fail (GTK_IS_TREE (tree));
730 tmp_list = g_list_nth (tree->children, item);
732 gtk_tree_select_child (tree, GTK_WIDGET (tmp_list->data));
737 gtk_tree_size_allocate (GtkWidget *widget,
738 GtkAllocation *allocation)
741 GtkWidget *child, *subtree;
742 GtkAllocation child_allocation;
746 g_return_if_fail (widget != NULL);
747 g_return_if_fail (GTK_IS_TREE (widget));
748 g_return_if_fail (allocation != NULL);
750 tree = GTK_TREE (widget);
752 widget->allocation = *allocation;
753 if (GTK_WIDGET_REALIZED (widget))
754 gdk_window_move_resize (widget->window,
755 allocation->x, allocation->y,
756 allocation->width, allocation->height);
760 child_allocation.x = GTK_CONTAINER (tree)->border_width;
761 child_allocation.y = GTK_CONTAINER (tree)->border_width;
762 child_allocation.width = allocation->width - child_allocation.x * 2;
764 children = tree->children;
768 child = children->data;
769 children = children->next;
771 if (GTK_WIDGET_VISIBLE (child))
773 child_allocation.height = child->requisition.height;
775 gtk_widget_size_allocate (child, &child_allocation);
777 child_allocation.y += child_allocation.height;
779 if((subtree = GTK_TREE_ITEM(child)->subtree))
780 if(GTK_WIDGET_VISIBLE (subtree))
782 child_allocation.height = subtree->requisition.height;
783 gtk_widget_size_allocate (subtree, &child_allocation);
784 child_allocation.y += child_allocation.height;
793 gtk_tree_size_request (GtkWidget *widget,
794 GtkRequisition *requisition)
797 GtkWidget *child, *subtree;
801 g_return_if_fail (widget != NULL);
802 g_return_if_fail (GTK_IS_TREE (widget));
803 g_return_if_fail (requisition != NULL);
805 tree = GTK_TREE (widget);
806 requisition->width = 0;
807 requisition->height = 0;
809 children = tree->children;
812 child = children->data;
813 children = children->next;
815 if (GTK_WIDGET_VISIBLE (child))
817 gtk_widget_size_request (child, &child->requisition);
819 requisition->width = MAX (requisition->width, child->requisition.width);
820 requisition->height += child->requisition.height;
822 if((subtree = GTK_TREE_ITEM(child)->subtree) &&
823 GTK_WIDGET_VISIBLE (subtree))
825 gtk_widget_size_request (subtree, &subtree->requisition);
827 requisition->width = MAX (requisition->width,
828 subtree->requisition.width);
830 requisition->height += subtree->requisition.height;
835 requisition->width += GTK_CONTAINER (tree)->border_width * 2;
836 requisition->height += GTK_CONTAINER (tree)->border_width * 2;
838 requisition->width = MAX (requisition->width, 1);
839 requisition->height = MAX (requisition->height, 1);
844 gtk_tree_unmap (GtkWidget *widget)
847 g_return_if_fail (widget != NULL);
848 g_return_if_fail (GTK_IS_TREE (widget));
850 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
851 gdk_window_hide (widget->window);
856 gtk_tree_unselect_child (GtkTree *tree,
859 gtk_signal_emit (GTK_OBJECT (tree), tree_signals[UNSELECT_CHILD], child);
863 gtk_tree_unselect_item (GtkTree *tree,
869 g_return_if_fail (tree != NULL);
870 g_return_if_fail (GTK_IS_TREE (tree));
872 tmp_list = g_list_nth (tree->children, item);
874 gtk_tree_unselect_child (tree, GTK_WIDGET (tmp_list->data));
879 gtk_real_tree_select_child (GtkTree *tree,
882 GList *selection, *root_selection;
887 g_return_if_fail (tree != NULL);
888 g_return_if_fail (GTK_IS_TREE (tree));
889 g_return_if_fail (child != NULL);
890 g_return_if_fail (GTK_IS_TREE_ITEM (child));
892 root_selection = tree->root_tree->selection;
894 switch (tree->root_tree->selection_mode)
896 case GTK_SELECTION_SINGLE:
898 selection = root_selection;
900 /* remove old selection list */
903 tmp_item = selection->data;
905 if (tmp_item != child)
907 gtk_tree_item_deselect (GTK_TREE_ITEM (tmp_item));
909 tmp_list = selection;
910 selection = selection->next;
912 root_selection = g_list_remove_link (root_selection, tmp_list);
914 g_list_free (tmp_list);
917 selection = selection->next;
920 if (child->state == GTK_STATE_NORMAL)
922 gtk_tree_item_select (GTK_TREE_ITEM (child));
923 root_selection = g_list_prepend (root_selection, child);
925 else if (child->state == GTK_STATE_SELECTED)
927 gtk_tree_item_deselect (GTK_TREE_ITEM (child));
928 root_selection = g_list_remove (root_selection, child);
931 tree->root_tree->selection= root_selection;
933 gtk_signal_emit (GTK_OBJECT (tree->root_tree),
934 tree_signals[SELECTION_CHANGED]);
936 case GTK_SELECTION_BROWSE:
937 selection = root_selection;
941 tmp_item = selection->data;
943 if (tmp_item != child)
945 gtk_tree_item_deselect (GTK_TREE_ITEM (tmp_item));
947 tmp_list = selection;
948 selection = selection->next;
950 root_selection = g_list_remove_link (root_selection, tmp_list);
952 g_list_free (tmp_list);
955 selection = selection->next;
958 tree->root_tree->selection= root_selection;
960 if (child->state == GTK_STATE_NORMAL)
962 gtk_tree_item_select (GTK_TREE_ITEM (child));
963 root_selection = g_list_prepend (root_selection, child);
964 tree->root_tree->selection= root_selection;
965 gtk_signal_emit (GTK_OBJECT (tree->root_tree),
966 tree_signals[SELECTION_CHANGED]);
970 case GTK_SELECTION_MULTIPLE:
971 if (child->state == GTK_STATE_NORMAL)
973 gtk_tree_item_select (GTK_TREE_ITEM (child));
974 root_selection = g_list_prepend (root_selection, child);
975 tree->root_tree->selection= root_selection;
976 gtk_signal_emit (GTK_OBJECT (tree->root_tree),
977 tree_signals[SELECTION_CHANGED]);
979 else if (child->state == GTK_STATE_SELECTED)
981 gtk_tree_item_deselect (GTK_TREE_ITEM (child));
982 root_selection = g_list_remove (root_selection, child);
983 tree->root_tree->selection= root_selection;
984 gtk_signal_emit (GTK_OBJECT (tree->root_tree),
985 tree_signals[SELECTION_CHANGED]);
989 case GTK_SELECTION_EXTENDED:
995 gtk_real_tree_unselect_child (GtkTree *tree,
999 g_return_if_fail (tree != NULL);
1000 g_return_if_fail (GTK_IS_TREE (tree));
1001 g_return_if_fail (child != NULL);
1002 g_return_if_fail (GTK_IS_TREE_ITEM (child));
1004 switch (tree->selection_mode)
1006 case GTK_SELECTION_SINGLE:
1007 case GTK_SELECTION_MULTIPLE:
1008 case GTK_SELECTION_BROWSE:
1009 if (child->state == GTK_STATE_SELECTED)
1011 GtkTree* root_tree = GTK_TREE_ROOT_TREE(tree);
1012 gtk_tree_item_deselect (GTK_TREE_ITEM (child));
1013 root_tree->selection = g_list_remove (root_tree->selection, child);
1014 gtk_signal_emit (GTK_OBJECT (tree->root_tree),
1015 tree_signals[SELECTION_CHANGED]);
1019 case GTK_SELECTION_EXTENDED:
1025 gtk_tree_set_selection_mode (GtkTree *tree,
1026 GtkSelectionMode mode)
1028 g_return_if_fail (tree != NULL);
1029 g_return_if_fail (GTK_IS_TREE (tree));
1031 tree->selection_mode = mode;
1035 gtk_tree_set_view_mode (GtkTree *tree,
1036 GtkTreeViewMode mode)
1038 g_return_if_fail (tree != NULL);
1039 g_return_if_fail (GTK_IS_TREE (tree));
1041 tree->view_mode = mode;
1045 gtk_tree_set_view_lines (GtkTree *tree,
1048 g_return_if_fail (tree != NULL);
1049 g_return_if_fail (GTK_IS_TREE (tree));
1051 tree->view_line = flag;