]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktreeitem.c
Deprecate flag macros for toplevel, state, no window and composite child
[~andy/gtk] / gtk / gtktreeitem.c
index 523ba05aa9ee27bb27519b8f65b780361ab3e61b..7b2ae9cea97b8929b9a72d436885c97e81daa974 100644 (file)
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
  */
 
+#undef GTK_DISABLE_DEPRECATED
+
+#include "config.h"
+
 #include "gtklabel.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"
@@ -81,8 +89,6 @@ 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 gint gtk_tree_item_subtree_button_click (GtkWidget *widget);
 static void gtk_tree_item_subtree_button_changed_state (GtkWidget *widget);
@@ -115,6 +121,7 @@ gtk_tree_item_get_type (void)
         (GtkClassInitFunc) NULL,
       };
 
+      I_("GtkTreeItem");
       tree_item_type = gtk_type_unique (gtk_item_get_type (), &tree_item_info);
     }
 
@@ -156,18 +163,18 @@ gtk_tree_item_class_init (GtkTreeItemClass *class)
   class->collapse = gtk_real_tree_item_collapse;
 
   tree_item_signals[EXPAND_TREE] =
-    gtk_signal_new ("expand",
+    gtk_signal_new (I_("expand"),
                    GTK_RUN_FIRST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkTreeItemClass, expand),
-                   gtk_marshal_VOID__VOID,
+                   _gtk_marshal_VOID__VOID,
                    GTK_TYPE_NONE, 0);
   tree_item_signals[COLLAPSE_TREE] =
-    gtk_signal_new ("collapse",
+    gtk_signal_new (I_("collapse"),
                    GTK_RUN_FIRST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkTreeItemClass, collapse),
-                   gtk_marshal_VOID__VOID,
+                   _gtk_marshal_VOID__VOID,
                    GTK_TYPE_NONE, 0);
 }
 
@@ -215,8 +222,6 @@ static void
 gtk_tree_item_init (GtkTreeItem *tree_item)
 {
   GtkWidget *eventbox, *pixmapwid;
-  
-  g_return_if_fail (GTK_IS_TREE_ITEM (tree_item));
 
   tree_item->expanded = FALSE;
   tree_item->subtree = NULL;
@@ -225,14 +230,14 @@ gtk_tree_item_init (GtkTreeItem *tree_item)
   /* create an event box containing one pixmaps */
   eventbox = gtk_event_box_new();
   gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK);
-  gtk_signal_connect(GTK_OBJECT(eventbox), "state_changed",
-                    (GtkSignalFunc)gtk_tree_item_subtree_button_changed_state, 
+  gtk_signal_connect(GTK_OBJECT(eventbox), "state-changed",
+                    G_CALLBACK (gtk_tree_item_subtree_button_changed_state),
                     (gpointer)NULL);
   gtk_signal_connect(GTK_OBJECT(eventbox), "realize",
-                    (GtkSignalFunc)gtk_tree_item_subtree_button_changed_state, 
+                    G_CALLBACK (gtk_tree_item_subtree_button_changed_state),
                     (gpointer)NULL);
-  gtk_signal_connect(GTK_OBJECT(eventbox), "button_press_event",
-                    (GtkSignalFunc)gtk_tree_item_subtree_button_click,
+  gtk_signal_connect(GTK_OBJECT(eventbox), "button-press-event",
+                    G_CALLBACK (gtk_tree_item_subtree_button_click),
                     (gpointer)NULL);
   gtk_object_set_user_data(GTK_OBJECT(eventbox), tree_item);
   tree_item->pixmaps_box = eventbox;
@@ -243,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 ());
@@ -252,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));
 }
@@ -312,17 +315,6 @@ gtk_tree_item_set_subtree (GtkTreeItem *tree_item,
     gtk_widget_hide (subtree);
 
   gtk_widget_set_parent (subtree, GTK_WIDGET (tree_item)->parent);
-
-  if (GTK_WIDGET_REALIZED (subtree->parent))
-    gtk_widget_realize (subtree);
-
-  if (GTK_WIDGET_VISIBLE (subtree->parent) && GTK_WIDGET_VISIBLE (subtree))
-    {
-      if (GTK_WIDGET_MAPPED (subtree->parent))
-       gtk_widget_map (subtree);
-
-      gtk_widget_queue_resize (subtree);
-    }
 }
 
 void
@@ -392,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;
 
@@ -401,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);
     }
@@ -432,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);
@@ -449,12 +441,9 @@ gtk_tree_item_remove_pixmaps (GtkTreeItem *tree_item)
 
 static void
 gtk_tree_item_realize (GtkWidget *widget)
-{    
-  g_return_if_fail (GTK_IS_TREE_ITEM (widget));
+{
+  GTK_WIDGET_CLASS (parent_class)->realize (widget);
 
-  if (GTK_WIDGET_CLASS (parent_class)->realize)
-    (* GTK_WIDGET_CLASS (parent_class)->realize) (widget);
-  
   gdk_window_set_background (widget->window, 
                             &widget->style->base[GTK_STATE_NORMAL]);
 
@@ -465,16 +454,10 @@ static void
 gtk_tree_item_size_request (GtkWidget      *widget,
                            GtkRequisition *requisition)
 {
-  GtkBin *bin;
-  GtkTreeItem* item;
+  GtkBin *bin = GTK_BIN (widget);
+  GtkTreeItem *item = GTK_TREE_ITEM (widget);
   GtkRequisition child_requisition;
 
-  g_return_if_fail (GTK_IS_TREE_ITEM (widget));
-  g_return_if_fail (requisition != NULL);
-
-  bin = GTK_BIN (widget);
-  item = GTK_TREE_ITEM(widget);
-
   requisition->width = (GTK_CONTAINER (widget)->border_width +
                        widget->style->xthickness) * 2;
   requisition->height = GTK_CONTAINER (widget)->border_width * 2;
@@ -501,24 +484,18 @@ 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;
   gint border_width;
   int temp;
 
-  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 +
@@ -617,13 +594,9 @@ static void
 gtk_tree_item_paint (GtkWidget    *widget,
                     GdkRectangle *area)
 {
-  GtkBin *bin;
   GdkRectangle child_area, item_area;
   GtkTreeItem* tree_item;
 
-  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
@@ -632,7 +605,6 @@ gtk_tree_item_paint (GtkWidget    *widget,
    */
   if (GTK_WIDGET_DRAWABLE (widget))
     {
-      bin = GTK_BIN (widget);
       tree_item = GTK_TREE_ITEM(widget);
 
       if (widget->state == GTK_STATE_NORMAL)
@@ -644,7 +616,7 @@ gtk_tree_item_paint (GtkWidget    *widget,
        {
          if (!GTK_WIDGET_IS_SENSITIVE (widget)) 
            gtk_paint_flat_box(widget->style, widget->window,
-                              widget->state, GTK_STATE_INSENSITIVE,
+                              widget->state, GTK_SHADOW_NONE,
                               area, widget, "treeitem",
                               0, 0, -1, -1);
          else
@@ -670,15 +642,20 @@ gtk_tree_item_paint (GtkWidget    *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);
+            {
+              gtk_widget_queue_draw_area (tree_item->pixmaps_box,
+                                          child_area.x, child_area.y,
+                                          child_area.width, child_area.height);
+              gdk_window_process_updates (tree_item->pixmaps_box->window, TRUE);
+            }
        }
 
       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);
       
     }
 }
@@ -687,10 +664,6 @@ static gint
 gtk_tree_item_button_press (GtkWidget      *widget,
                            GdkEventButton *event)
 {
-
-  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))
@@ -699,18 +672,53 @@ gtk_tree_item_button_press (GtkWidget      *widget,
   return (event->type == GDK_BUTTON_PRESS && GTK_WIDGET_IS_SENSITIVE(widget));
 }
 
+static void
+gtk_tree_item_expose_child (GtkWidget *child,
+                            gpointer   client_data)
+{
+  struct {
+    GtkWidget *container;
+    GdkEventExpose *event;
+  } *data = client_data;
+
+  if (GTK_WIDGET_DRAWABLE (child) &&
+      !gtk_widget_get_has_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_expose (GtkWidget      *widget,
                      GdkEventExpose *event)
 {
-  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;
 
   if (GTK_WIDGET_DRAWABLE (widget))
     {
       gtk_tree_item_paint (widget, &event->area);
 
-      (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
+      data.container = widget;
+      data.event = event;
+
+      gtk_container_forall (GTK_CONTAINER (widget),
+                            gtk_tree_item_expose_child,
+                            &data);
    }
 
   return FALSE;
@@ -718,13 +726,11 @@ gtk_tree_item_expose (GtkWidget      *widget,
 
 static void
 gtk_real_tree_item_select (GtkItem *item)
-{    
-  GtkTreeItem *tree_item;
+{
   GtkWidget *widget;
 
   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);
@@ -758,7 +764,7 @@ gtk_real_tree_item_toggle (GtkItem *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
@@ -834,25 +840,21 @@ 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 (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)
     {
-      gtk_widget_ref (child);
+      g_object_ref (child);
       gtk_widget_unparent (child);
       gtk_widget_destroy (child);
-      gtk_widget_unref (child);
+      g_object_unref (child);
       item->subtree = NULL;
     }
   
@@ -860,10 +862,10 @@ gtk_tree_item_destroy (GtkObject *object)
   child = item->pixmaps_box;
   if (child)
     {
-      gtk_widget_ref (child);
+      g_object_ref (child);
       gtk_widget_unparent (child);
       gtk_widget_destroy (child);
-      gtk_widget_unref (child);
+      g_object_unref (child);
       item->pixmaps_box = NULL;
     }
   
@@ -872,7 +874,7 @@ gtk_tree_item_destroy (GtkObject *object)
   if (item->plus_pix_widget)
     {
       gtk_widget_destroy (item->plus_pix_widget);
-      gtk_widget_unref (item->plus_pix_widget);
+      g_object_unref (item->plus_pix_widget);
       item->plus_pix_widget = NULL;
     }
   
@@ -880,7 +882,7 @@ gtk_tree_item_destroy (GtkObject *object)
   if (item->minus_pix_widget)
     {
       gtk_widget_destroy (item->minus_pix_widget);
-      gtk_widget_unref (item->minus_pix_widget);
+      g_object_unref (item->minus_pix_widget);
       item->minus_pix_widget = NULL;
     }
   
@@ -938,13 +940,8 @@ gtk_tree_item_remove_subtree (GtkTreeItem* item)
 static void
 gtk_tree_item_map (GtkWidget *widget)
 {
-  GtkBin *bin;
-  GtkTreeItem* item;
-
-  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);
 
@@ -964,14 +961,10 @@ gtk_tree_item_map (GtkWidget *widget)
 static void
 gtk_tree_item_unmap (GtkWidget *widget)
 {
-  GtkBin *bin;
-  GtkTreeItem* item;
-
-  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);
 
@@ -992,17 +985,16 @@ gtk_tree_item_forall (GtkContainer *container,
                      GtkCallback   callback,
                      gpointer      callback_data)
 {
-  GtkBin *bin;
-  GtkTreeItem *tree_item;
-
-  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"