]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktreeitem.c
Revert name change
[~andy/gtk] / gtk / gtktreeitem.c
index 1d6d44c2b087e1ba3f2a3a52f349d1ef1d6ffd8d..c137e3482e9a9a323b0f7bd48f17e1312415efb7 100644 (file)
@@ -2,27 +2,45 @@
  * 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 "config.h"
+
 #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"
+
+#define GTK_DISABLE_DEPRECATED
+#include "gtkalias.h"
 
 #include "tree_plus.xpm"
 #include "tree_minus.xpm"
@@ -56,17 +74,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 +90,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 +122,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 +137,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 +162,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))
@@ -217,9 +223,6 @@ static void
 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;
   tree_item->subtree = NULL;
@@ -246,8 +249,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 +257,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 +274,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 +294,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 +329,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 +337,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 +345,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 +357,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 +385,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 +394,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 +415,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 +425,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);
@@ -464,10 +442,7 @@ 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)
     (* GTK_WIDGET_CLASS (parent_class)->realize) (widget);
   
@@ -481,33 +456,29 @@ static void
 gtk_tree_item_size_request (GtkWidget      *widget,
                            GtkRequisition *requisition)
 {
-  GtkBin *bin;
-  GtkTreeItem* item;
-
-  g_return_if_fail (widget != NULL);
-  g_return_if_fail (GTK_IS_TREE_ITEM (widget));
-  g_return_if_fail (requisition != NULL);
-
-  bin = GTK_BIN (widget);
-  item = GTK_TREE_ITEM(widget);
+  GtkBin *bin = GTK_BIN (widget);
+  GtkTreeItem *item = GTK_TREE_ITEM (widget);
+  GtkRequisition child_requisition;
 
   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);
     }
 }
 
@@ -515,29 +486,22 @@ static void
 gtk_tree_item_size_allocate (GtkWidget     *widget,
                             GtkAllocation *allocation)
 {
-  GtkBin *bin;
-  GtkTreeItem* item;
+  GtkBin *bin = GTK_BIN (widget);
+  GtkTreeItem *item = GTK_TREE_ITEM (widget);
   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);
-
   widget->allocation = *allocation;
   if (GTK_WIDGET_REALIZED (widget))
     gdk_window_move_resize (widget->window,
                            allocation->x, allocation->y,
                            allocation->width, allocation->height);
 
-  bin = GTK_BIN (widget);
-  item = GTK_TREE_ITEM(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 +531,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 +554,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 +563,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 +585,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 +593,41 @@ 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,134 +635,99 @@ 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);
-
   if (event->type == GDK_BUTTON_PRESS
        && GTK_WIDGET_IS_SENSITIVE(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);
+  struct {
+    GtkWidget *container;
+    GdkEventExpose *event;
+  } *data = client_data;
 
-  return FALSE;
+  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);
-  g_return_val_if_fail (GTK_IS_TREE_ITEM (widget), FALSE);
-  g_return_val_if_fail (event != NULL, FALSE);
+  struct {
+    GtkWidget *container;
+    GdkEventExpose *event;
+  } data;
 
-  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;
 }
 
 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 +742,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,13 +756,12 @@ 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))
     return;
 
-  if (GTK_WIDGET (item)->parent && GTK_IS_TREE (GTK_WIDGET (item)->parent))
+  if (GTK_IS_TREE (GTK_WIDGET (item)->parent))
     gtk_tree_select_child (GTK_TREE (GTK_WIDGET (item)->parent),
                           GTK_WIDGET (item));
   else
@@ -833,7 +783,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 +811,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) 
@@ -889,18 +837,13 @@ gtk_real_tree_item_collapse (GtkTreeItem *tree_item)
 static void
 gtk_tree_item_destroy (GtkObject *object)
 {
-  GtkTreeItem* item;
+  GtkTreeItem* item = GTK_TREE_ITEM(object);
   GtkWidget* child;
 
-  g_return_if_fail (object != NULL);
-  g_return_if_fail (GTK_IS_TREE_ITEM (object));
-
 #ifdef TREE_DEBUG
   g_message("+ gtk_tree_item_destroy [object %#x]\n", (int)object);
 #endif /* TREE_DEBUG */
 
-  item = GTK_TREE_ITEM(object);
-
   /* free sub tree if it exist */
   child = item->subtree;
   if (child)
@@ -955,7 +898,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);
   
@@ -995,14 +937,8 @@ gtk_tree_item_remove_subtree (GtkTreeItem* item)
 static void
 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);
-  item = GTK_TREE_ITEM(widget);
+  GtkBin *bin = GTK_BIN (widget);
+  GtkTreeItem* item = GTK_TREE_ITEM(widget);
 
   GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
 
@@ -1022,15 +958,10 @@ gtk_tree_item_map (GtkWidget *widget)
 static void
 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));
+  GtkBin *bin = GTK_BIN (widget);
+  GtkTreeItem* item = GTK_TREE_ITEM(widget);
 
   GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
-  bin = GTK_BIN (widget);
-  item = GTK_TREE_ITEM(widget);
 
   gdk_window_hide (widget->window);
 
@@ -1051,18 +982,16 @@ gtk_tree_item_forall (GtkContainer *container,
                      GtkCallback   callback,
                      gpointer      callback_data)
 {
-  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);
-
-  bin = GTK_BIN (container);
-  tree_item = GTK_TREE_ITEM (container);
+  GtkBin *bin = GTK_BIN (container);
+  GtkTreeItem *tree_item = GTK_TREE_ITEM (container);
 
   if (bin->child)
     (* 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"