X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktreeitem.c;h=90e6f79cb2d26a2b01c17ad2e21e03cb1ed99745;hb=f35439bfacf90900e2c24f7ae3da173183c79d34;hp=1d6d44c2b087e1ba3f2a3a52f349d1ef1d6ffd8d;hpb=2e99e7713dc73ea5b7a000ab03b4d64176b9ad40;p=~andy%2Fgtk diff --git a/gtk/gtktreeitem.c b/gtk/gtktreeitem.c index 1d6d44c2b..90e6f79cb 100644 --- a/gtk/gtktreeitem.c +++ b/gtk/gtktreeitem.c @@ -2,27 +2,42 @@ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public + * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. * - * You should have received a copy of the GNU Library General Public + * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ + +/* + * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GTK+ Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef GTK_DISABLE_DEPRECATED + +#include #include "gtklabel.h" -#include "gtktree.h" -#include "gtktreeitem.h" #include "gtkeventbox.h" #include "gtkpixmap.h" #include "gtkmain.h" +#include "gtkmarshalers.h" #include "gtksignal.h" +#define GTK_ENABLE_BROKEN +#include "gtktree.h" +#include "gtktreeitem.h" +#include "gtkintl.h" +#include "gtkalias.h" #include "tree_plus.xpm" #include "tree_minus.xpm" @@ -56,17 +71,12 @@ static void gtk_tree_item_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_tree_item_size_allocate (GtkWidget *widget, GtkAllocation *allocation); -static void gtk_tree_item_draw (GtkWidget *widget, +static void gtk_tree_item_paint (GtkWidget *widget, GdkRectangle *area); -static void gtk_tree_item_draw_focus (GtkWidget *widget); static gint gtk_tree_item_button_press (GtkWidget *widget, GdkEventButton *event); static gint gtk_tree_item_expose (GtkWidget *widget, GdkEventExpose *event); -static gint gtk_tree_item_focus_in (GtkWidget *widget, - GdkEventFocus *event); -static gint gtk_tree_item_focus_out (GtkWidget *widget, - GdkEventFocus *event); static void gtk_tree_item_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, @@ -77,10 +87,8 @@ static void gtk_real_tree_item_deselect (GtkItem *item); static void gtk_real_tree_item_toggle (GtkItem *item); static void gtk_real_tree_item_expand (GtkTreeItem *item); static void gtk_real_tree_item_collapse (GtkTreeItem *item); -static void gtk_real_tree_item_expand (GtkTreeItem *item); -static void gtk_real_tree_item_collapse (GtkTreeItem *item); static void gtk_tree_item_destroy (GtkObject *object); -static void gtk_tree_item_subtree_button_click (GtkWidget *widget); +static gint gtk_tree_item_subtree_button_click (GtkWidget *widget); static void gtk_tree_item_subtree_button_changed_state (GtkWidget *widget); static void gtk_tree_item_map(GtkWidget*); @@ -111,6 +119,7 @@ gtk_tree_item_get_type (void) (GtkClassInitFunc) NULL, }; + I_("GtkTreeItem"); tree_item_type = gtk_type_unique (gtk_item_get_type (), &tree_item_info); } @@ -125,41 +134,20 @@ gtk_tree_item_class_init (GtkTreeItemClass *class) GtkContainerClass *container_class; GtkItemClass *item_class; + parent_class = gtk_type_class (GTK_TYPE_ITEM); + object_class = (GtkObjectClass*) class; widget_class = (GtkWidgetClass*) class; item_class = (GtkItemClass*) class; container_class = (GtkContainerClass*) class; - parent_class = gtk_type_class (gtk_item_get_type ()); - - tree_item_signals[EXPAND_TREE] = - gtk_signal_new ("expand", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (GtkTreeItemClass, expand), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - tree_item_signals[COLLAPSE_TREE] = - gtk_signal_new ("collapse", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (GtkTreeItemClass, collapse), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, tree_item_signals, LAST_SIGNAL); - object_class->destroy = gtk_tree_item_destroy; widget_class->realize = gtk_tree_item_realize; widget_class->size_request = gtk_tree_item_size_request; widget_class->size_allocate = gtk_tree_item_size_allocate; - widget_class->draw = gtk_tree_item_draw; - widget_class->draw_focus = gtk_tree_item_draw_focus; widget_class->button_press_event = gtk_tree_item_button_press; widget_class->expose_event = gtk_tree_item_expose; - widget_class->focus_in_event = gtk_tree_item_focus_in; - widget_class->focus_out_event = gtk_tree_item_focus_out; widget_class->map = gtk_tree_item_map; widget_class->unmap = gtk_tree_item_unmap; @@ -171,32 +159,47 @@ gtk_tree_item_class_init (GtkTreeItemClass *class) class->expand = gtk_real_tree_item_expand; class->collapse = gtk_real_tree_item_collapse; + + tree_item_signals[EXPAND_TREE] = + gtk_signal_new (I_("expand"), + GTK_RUN_FIRST, + GTK_CLASS_TYPE (object_class), + GTK_SIGNAL_OFFSET (GtkTreeItemClass, expand), + _gtk_marshal_VOID__VOID, + GTK_TYPE_NONE, 0); + tree_item_signals[COLLAPSE_TREE] = + gtk_signal_new (I_("collapse"), + GTK_RUN_FIRST, + GTK_CLASS_TYPE (object_class), + GTK_SIGNAL_OFFSET (GtkTreeItemClass, collapse), + _gtk_marshal_VOID__VOID, + GTK_TYPE_NONE, 0); } /* callback for event box mouse event */ -static void +static gint gtk_tree_item_subtree_button_click (GtkWidget *widget) { GtkTreeItem* item; - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_EVENT_BOX (widget)); + g_return_val_if_fail (GTK_IS_EVENT_BOX (widget), FALSE); item = (GtkTreeItem*) gtk_object_get_user_data (GTK_OBJECT (widget)); if (!GTK_WIDGET_IS_SENSITIVE (item)) - return; + return FALSE; if (item->expanded) gtk_tree_item_collapse (item); else gtk_tree_item_expand (item); + + return TRUE; } /* callback for event box state changed */ static void gtk_tree_item_subtree_button_changed_state (GtkWidget *widget) { - g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_EVENT_BOX (widget)); if (GTK_WIDGET_VISIBLE (widget)) @@ -218,7 +221,6 @@ gtk_tree_item_init (GtkTreeItem *tree_item) { GtkWidget *eventbox, *pixmapwid; - g_return_if_fail (tree_item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); tree_item->expanded = FALSE; @@ -246,8 +248,7 @@ gtk_tree_item_init (GtkTreeItem *tree_item) gtk_container_add (GTK_CONTAINER (eventbox), pixmapwid); gtk_widget_show (pixmapwid); tree_item->plus_pix_widget = pixmapwid; - gtk_widget_ref (tree_item->plus_pix_widget); - gtk_object_sink (GTK_OBJECT (tree_item->plus_pix_widget)); + g_object_ref_sink (tree_item->plus_pix_widget); /* create pixmap for button '-' */ pixmapwid = gtk_type_new (gtk_pixmap_get_type ()); @@ -255,8 +256,7 @@ gtk_tree_item_init (GtkTreeItem *tree_item) gtk_container_add (GTK_CONTAINER (eventbox), pixmapwid); gtk_widget_show (pixmapwid); tree_item->minus_pix_widget = pixmapwid; - gtk_widget_ref (tree_item->minus_pix_widget); - gtk_object_sink (GTK_OBJECT (tree_item->minus_pix_widget)); + g_object_ref_sink (tree_item->minus_pix_widget); gtk_widget_set_parent (eventbox, GTK_WIDGET (tree_item)); } @@ -273,7 +273,7 @@ gtk_tree_item_new (void) } GtkWidget* -gtk_tree_item_new_with_label (gchar *label) +gtk_tree_item_new_with_label (const gchar *label) { GtkWidget *tree_item; GtkWidget *label_widget; @@ -293,51 +293,33 @@ void gtk_tree_item_set_subtree (GtkTreeItem *tree_item, GtkWidget *subtree) { - g_return_if_fail (tree_item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - g_return_if_fail (subtree != NULL); g_return_if_fail (GTK_IS_TREE (subtree)); - if(tree_item->subtree) { - g_warning("there is already a subtree for this tree item\n"); - return; - } + if (tree_item->subtree) + { + g_warning("there is already a subtree for this tree item\n"); + return; + } tree_item->subtree = subtree; - GTK_TREE(subtree)->tree_owner = GTK_WIDGET(tree_item); + GTK_TREE (subtree)->tree_owner = GTK_WIDGET (tree_item); /* show subtree button */ if (tree_item->pixmaps_box) gtk_widget_show (tree_item->pixmaps_box); - /* set parent widget */ - gtk_widget_set_parent(subtree, GTK_WIDGET(tree_item)->parent); - - if(GTK_WIDGET_VISIBLE(GTK_WIDGET(tree_item))) - { - if(GTK_WIDGET_REALIZED (GTK_WIDGET(tree_item)) && - !GTK_WIDGET_REALIZED (GTK_WIDGET(subtree))) - gtk_widget_realize (GTK_WIDGET(subtree)); - - if(GTK_WIDGET_MAPPED (GTK_WIDGET(tree_item)) && - !GTK_WIDGET_MAPPED (GTK_WIDGET(subtree))) - gtk_widget_map (GTK_WIDGET(subtree)); - } - if (tree_item->expanded) - gtk_widget_show(subtree); + gtk_widget_show (subtree); else - gtk_widget_hide(subtree); - - if (GTK_WIDGET_VISIBLE (tree_item) && GTK_WIDGET_VISIBLE (tree_item)) - gtk_widget_queue_resize (GTK_WIDGET(tree_item)); + gtk_widget_hide (subtree); + gtk_widget_set_parent (subtree, GTK_WIDGET (tree_item)->parent); } void gtk_tree_item_select (GtkTreeItem *tree_item) { - g_return_if_fail (tree_item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); gtk_item_select (GTK_ITEM (tree_item)); @@ -346,7 +328,6 @@ gtk_tree_item_select (GtkTreeItem *tree_item) void gtk_tree_item_deselect (GtkTreeItem *tree_item) { - g_return_if_fail (tree_item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); gtk_item_deselect (GTK_ITEM (tree_item)); @@ -355,7 +336,6 @@ gtk_tree_item_deselect (GtkTreeItem *tree_item) void gtk_tree_item_expand (GtkTreeItem *tree_item) { - g_return_if_fail (tree_item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); gtk_signal_emit (GTK_OBJECT (tree_item), tree_item_signals[EXPAND_TREE], NULL); @@ -364,7 +344,6 @@ gtk_tree_item_expand (GtkTreeItem *tree_item) void gtk_tree_item_collapse (GtkTreeItem *tree_item) { - g_return_if_fail (tree_item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); gtk_signal_emit (GTK_OBJECT (tree_item), tree_item_signals[COLLAPSE_TREE], NULL); @@ -377,7 +356,6 @@ gtk_tree_item_add_pixmaps (GtkTreeItem *tree_item) GdkColormap *colormap; GtkTreePixmaps *pixmap_node = NULL; - g_return_if_fail (tree_item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); if (tree_item->pixmaps) @@ -406,7 +384,7 @@ gtk_tree_item_add_pixmaps (GtkTreeItem *tree_item) pixmap_node = g_new (GtkTreePixmaps, 1); pixmap_node->colormap = colormap; - gdk_colormap_ref (colormap); + g_object_ref (colormap); pixmap_node->refcount = 1; @@ -415,14 +393,14 @@ gtk_tree_item_add_pixmaps (GtkTreeItem *tree_item) gdk_pixmap_create_from_xpm_d (GTK_WIDGET (tree_item)->window, &pixmap_node->mask_plus, NULL, - tree_plus); + (gchar **)tree_plus); /* create pixmaps for minus icon */ pixmap_node->pixmap_minus = gdk_pixmap_create_from_xpm_d (GTK_WIDGET (tree_item)->window, &pixmap_node->mask_minus, NULL, - tree_minus); + (gchar **)tree_minus); tree_item->pixmaps = pixmaps = g_list_prepend (pixmaps, pixmap_node); } @@ -436,7 +414,6 @@ gtk_tree_item_add_pixmaps (GtkTreeItem *tree_item) static void gtk_tree_item_remove_pixmaps (GtkTreeItem *tree_item) { - g_return_if_fail (tree_item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); if (tree_item->pixmaps) @@ -447,11 +424,11 @@ gtk_tree_item_remove_pixmaps (GtkTreeItem *tree_item) if (--pixmap_node->refcount == 0) { - gdk_colormap_unref (pixmap_node->colormap); - gdk_pixmap_unref (pixmap_node->pixmap_plus); - gdk_bitmap_unref (pixmap_node->mask_plus); - gdk_pixmap_unref (pixmap_node->pixmap_minus); - gdk_bitmap_unref (pixmap_node->mask_minus); + g_object_unref (pixmap_node->colormap); + g_object_unref (pixmap_node->pixmap_plus); + g_object_unref (pixmap_node->mask_plus); + g_object_unref (pixmap_node->pixmap_minus); + g_object_unref (pixmap_node->mask_minus); pixmaps = g_list_remove_link (pixmaps, tree_item->pixmaps); g_list_free_1 (tree_item->pixmaps); @@ -465,7 +442,6 @@ gtk_tree_item_remove_pixmaps (GtkTreeItem *tree_item) static void gtk_tree_item_realize (GtkWidget *widget) { - g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (widget)); if (GTK_WIDGET_CLASS (parent_class)->realize) @@ -483,8 +459,8 @@ gtk_tree_item_size_request (GtkWidget *widget, { GtkBin *bin; GtkTreeItem* item; + GtkRequisition child_requisition; - g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (widget)); g_return_if_fail (requisition != NULL); @@ -492,22 +468,24 @@ gtk_tree_item_size_request (GtkWidget *widget, item = GTK_TREE_ITEM(widget); requisition->width = (GTK_CONTAINER (widget)->border_width + - widget->style->klass->xthickness) * 2; + widget->style->xthickness) * 2; requisition->height = GTK_CONTAINER (widget)->border_width * 2; if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) { - gtk_widget_size_request (bin->child, &bin->child->requisition); + GtkRequisition pix_requisition; + + gtk_widget_size_request (bin->child, &child_requisition); - requisition->width += bin->child->requisition.width; + requisition->width += child_requisition.width; gtk_widget_size_request (item->pixmaps_box, - &item->pixmaps_box->requisition); - requisition->width += item->pixmaps_box->requisition.width + DEFAULT_DELTA + - GTK_TREE(widget->parent)->current_indent; + &pix_requisition); + requisition->width += pix_requisition.width + DEFAULT_DELTA + + GTK_TREE (widget->parent)->current_indent; - requisition->height += MAX (bin->child->requisition.height, - item->pixmaps_box->requisition.height); + requisition->height += MAX (child_requisition.height, + pix_requisition.height); } } @@ -518,10 +496,9 @@ gtk_tree_item_size_allocate (GtkWidget *widget, GtkBin *bin; GtkTreeItem* item; GtkAllocation child_allocation; - guint border_width; + gint border_width; int temp; - g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (widget)); g_return_if_fail (allocation != NULL); @@ -537,7 +514,7 @@ gtk_tree_item_size_allocate (GtkWidget *widget, if (bin->child) { border_width = (GTK_CONTAINER (widget)->border_width + - widget->style->klass->xthickness); + widget->style->xthickness); child_allocation.x = border_width + GTK_TREE(widget->parent)->current_indent; child_allocation.y = GTK_CONTAINER (widget)->border_width; @@ -567,13 +544,18 @@ gtk_tree_item_draw_lines (GtkWidget *widget) GtkTreeItem* item; GtkTree* tree; guint lx1, ly1, lx2, ly2; + GdkGC* gc; - g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (widget)); item = GTK_TREE_ITEM(widget); tree = GTK_TREE(widget->parent); + if (!tree->view_line) + return; + + gc = widget->style->text_gc[GTK_STATE_NORMAL]; + /* draw vertical line */ lx1 = item->pixmaps_box->allocation.width; lx1 = lx2 = ((lx1 / 2) + (lx1 % 2) + @@ -585,7 +567,7 @@ gtk_tree_item_draw_lines (GtkWidget *widget) ly2 = (ly2 / 2) + (ly2 % 2); if (tree != tree->root_tree) - gdk_draw_line (widget->window, widget->style->black_gc, lx1, ly1, lx2, ly2); + gdk_draw_line (widget->window, gc, lx1, ly1, lx2, ly2); /* draw vertical line for subtree connecting */ if(g_list_last(tree->children)->data != (gpointer)widget) @@ -594,15 +576,14 @@ gtk_tree_item_draw_lines (GtkWidget *widget) lx2 += DEFAULT_DELTA; if (item->subtree && item->expanded) - gdk_draw_line (widget->window, widget->style->black_gc, + gdk_draw_line (widget->window, gc, lx2, ly2, lx2, widget->allocation.height); /* draw horizontal line */ ly1 = ly2; lx2 += 2; - gdk_draw_line (widget->window, widget->style->black_gc, - lx1, ly1, lx2, ly2); + gdk_draw_line (widget->window, gc, lx1, ly1, lx2, ly2); lx2 -= DEFAULT_DELTA+2; ly1 = 0; @@ -617,7 +598,7 @@ gtk_tree_item_draw_lines (GtkWidget *widget) lx1 = lx2 -= tree->indent_value; if (g_list_last (tree->children)->data != item) - gdk_draw_line (widget->window, widget->style->black_gc, lx1, ly1, lx2, ly2); + gdk_draw_line (widget->window, gc, lx1, ly1, lx2, ly2); item = GTK_TREE_ITEM (tree->tree_owner); tree = GTK_TREE (GTK_WIDGET (tree)->parent); } @@ -625,22 +606,44 @@ gtk_tree_item_draw_lines (GtkWidget *widget) } static void -gtk_tree_item_draw (GtkWidget *widget, - GdkRectangle *area) +gtk_tree_item_paint (GtkWidget *widget, + GdkRectangle *area) { - GtkBin *bin; GdkRectangle child_area, item_area; GtkTreeItem* tree_item; - g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (widget)); g_return_if_fail (area != NULL); + /* FIXME: We should honor tree->view_mode, here - I think + * the desired effect is that when the mode is VIEW_ITEM, + * only the subitem is drawn as selected, not the entire + * line. (Like the way that the tree in Windows Explorer + * works). + */ if (GTK_WIDGET_DRAWABLE (widget)) { - bin = GTK_BIN (widget); tree_item = GTK_TREE_ITEM(widget); + if (widget->state == GTK_STATE_NORMAL) + { + gdk_window_set_back_pixmap (widget->window, NULL, TRUE); + gdk_window_clear_area (widget->window, area->x, area->y, area->width, area->height); + } + else + { + if (!GTK_WIDGET_IS_SENSITIVE (widget)) + gtk_paint_flat_box(widget->style, widget->window, + widget->state, GTK_SHADOW_NONE, + area, widget, "treeitem", + 0, 0, -1, -1); + else + gtk_paint_flat_box(widget->style, widget->window, + widget->state, GTK_SHADOW_ETCHED_OUT, + area, widget, "treeitem", + 0, 0, -1, -1); + } + /* draw left size of tree item */ item_area.x = 0; item_area.y = 0; @@ -648,69 +651,33 @@ gtk_tree_item_draw (GtkWidget *widget, GTK_TREE (widget->parent)->current_indent + 2); item_area.height = widget->allocation.height; + if (gdk_rectangle_intersect(&item_area, area, &child_area)) { - if (widget->state == GTK_STATE_NORMAL) - { - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); - gdk_window_clear_area (widget->window, area->x, area->y, area->width, area->height); - } - else - { - if (!GTK_WIDGET_IS_SENSITIVE (widget)) - gtk_paint_flat_box(widget->style, widget->window, - widget->state, GTK_STATE_INSENSITIVE, - area, widget, "treeitem", - 0, 0, -1, -1); - else - gtk_paint_flat_box(widget->style, widget->window, - widget->state, GTK_SHADOW_ETCHED_OUT, - area, widget, "treeitem", - 0, 0, -1, -1); - } - - gtk_tree_item_draw_lines(widget); + gtk_tree_item_draw_lines(widget); + if (tree_item->pixmaps_box && GTK_WIDGET_VISIBLE(tree_item->pixmaps_box) && gtk_widget_intersect (tree_item->pixmaps_box, area, &child_area)) gtk_widget_draw (tree_item->pixmaps_box, &child_area); } - - /* draw right side */ - if (gtk_widget_intersect (bin->child, area, &child_area)) - { - if (bin->child && - GTK_WIDGET_VISIBLE(bin->child) && - gtk_widget_intersect (bin->child, area, &child_area)) - gtk_widget_draw (bin->child, &child_area); - } if (GTK_WIDGET_HAS_FOCUS (widget)) - gtk_paint_focus (widget->style, widget->window, + gtk_paint_focus (widget->style, widget->window, GTK_WIDGET_STATE (widget), NULL, widget, "treeitem", 0, 0, - widget->allocation.width - 1, - widget->allocation.height - 1); + widget->allocation.width, + widget->allocation.height); } } -static void -gtk_tree_item_draw_focus (GtkWidget *widget) -{ - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_TREE_ITEM (widget)); - - gtk_widget_draw(widget, NULL); -} - static gint gtk_tree_item_button_press (GtkWidget *widget, GdkEventButton *event) { - g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_TREE_ITEM (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); @@ -719,49 +686,60 @@ gtk_tree_item_button_press (GtkWidget *widget, && !GTK_WIDGET_HAS_FOCUS (widget)) gtk_widget_grab_focus (widget); - return FALSE; + return (event->type == GDK_BUTTON_PRESS && GTK_WIDGET_IS_SENSITIVE(widget)); } -static gint -gtk_tree_item_expose (GtkWidget *widget, - GdkEventExpose *event) +static void +gtk_tree_item_expose_child (GtkWidget *child, + gpointer client_data) { - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (GTK_IS_TREE_ITEM (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - if (GTK_WIDGET_DRAWABLE (widget)) - gtk_tree_item_draw(widget, &event->area); - - return FALSE; + struct { + GtkWidget *container; + GdkEventExpose *event; + } *data = client_data; + + if (GTK_WIDGET_DRAWABLE (child) && + GTK_WIDGET_NO_WINDOW (child) && + (child->window == data->event->window)) + { + GdkEvent *child_event = gdk_event_new (GDK_EXPOSE); + child_event->expose = *data->event; + g_object_ref (child_event->expose.window); + + child_event->expose.region = gtk_widget_region_intersect (child, + data->event->region); + if (!gdk_region_empty (child_event->expose.region)) + { + gdk_region_get_clipbox (child_event->expose.region, &child_event->expose.area); + gtk_widget_send_expose (child, child_event); + } + gdk_event_free (child_event); + } } static gint -gtk_tree_item_focus_in (GtkWidget *widget, - GdkEventFocus *event) +gtk_tree_item_expose (GtkWidget *widget, + GdkEventExpose *event) { - g_return_val_if_fail (widget != NULL, FALSE); + struct { + GtkWidget *container; + GdkEventExpose *event; + } data; + g_return_val_if_fail (GTK_IS_TREE_ITEM (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); - GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS); - gtk_widget_draw_focus (widget); - - - return FALSE; -} - -static gint -gtk_tree_item_focus_out (GtkWidget *widget, - GdkEventFocus *event) -{ - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (GTK_IS_TREE_ITEM (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); + if (GTK_WIDGET_DRAWABLE (widget)) + { + gtk_tree_item_paint (widget, &event->area); - GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS); - gtk_widget_draw_focus (widget); + data.container = widget; + data.event = event; + gtk_container_forall (GTK_CONTAINER (widget), + gtk_tree_item_expose_child, + &data); + } return FALSE; } @@ -769,13 +747,10 @@ gtk_tree_item_focus_out (GtkWidget *widget, static void gtk_real_tree_item_select (GtkItem *item) { - GtkTreeItem *tree_item; GtkWidget *widget; - g_return_if_fail (item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (item)); - tree_item = GTK_TREE_ITEM (item); widget = GTK_WIDGET (item); gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_SELECTED); @@ -790,7 +765,6 @@ gtk_real_tree_item_deselect (GtkItem *item) GtkTreeItem *tree_item; GtkWidget *widget; - g_return_if_fail (item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (item)); tree_item = GTK_TREE_ITEM (item); @@ -805,7 +779,6 @@ gtk_real_tree_item_deselect (GtkItem *item) static void gtk_real_tree_item_toggle (GtkItem *item) { - g_return_if_fail (item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (item)); if(!GTK_WIDGET_IS_SENSITIVE(item)) @@ -833,7 +806,6 @@ gtk_real_tree_item_expand (GtkTreeItem *tree_item) { GtkTree* tree; - g_return_if_fail (tree_item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); if (tree_item->subtree && !tree_item->expanded) @@ -862,7 +834,6 @@ gtk_real_tree_item_collapse (GtkTreeItem *tree_item) { GtkTree* tree; - g_return_if_fail (tree_item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); if (tree_item->subtree && tree_item->expanded) @@ -892,7 +863,6 @@ gtk_tree_item_destroy (GtkObject *object) GtkTreeItem* item; GtkWidget* child; - g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (object)); #ifdef TREE_DEBUG @@ -955,7 +925,6 @@ gtk_tree_item_destroy (GtkObject *object) void gtk_tree_item_remove_subtree (GtkTreeItem* item) { - g_return_if_fail (item != NULL); g_return_if_fail (GTK_IS_TREE_ITEM(item)); g_return_if_fail (item->subtree != NULL); @@ -998,7 +967,6 @@ gtk_tree_item_map (GtkWidget *widget) GtkBin *bin; GtkTreeItem* item; - g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (widget)); bin = GTK_BIN (widget); @@ -1025,7 +993,6 @@ gtk_tree_item_unmap (GtkWidget *widget) GtkBin *bin; GtkTreeItem* item; - g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (widget)); GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED); @@ -1054,7 +1021,6 @@ gtk_tree_item_forall (GtkContainer *container, GtkBin *bin; GtkTreeItem *tree_item; - g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (container)); g_return_if_fail (callback != NULL); @@ -1065,4 +1031,9 @@ gtk_tree_item_forall (GtkContainer *container, (* callback) (bin->child, callback_data); if (include_internals && tree_item->subtree) (* callback) (tree_item->subtree, callback_data); + if (include_internals && tree_item->pixmaps_box) + (* callback) (tree_item->pixmaps_box, callback_data); } + +#define __GTK_TREE_ITEM_C__ +#include "gtkaliasdef.c"