X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktreeitem.c;h=90e6f79cb2d26a2b01c17ad2e21e03cb1ed99745;hb=f35439bfacf90900e2c24f7ae3da173183c79d34;hp=dc4cb886e04275711ae3f7f902c4bd2acef74ed7;hpb=2c9eb3a5725420394322ecedb1556d59b5b4bcaa;p=~andy%2Fgtk diff --git a/gtk/gtktreeitem.c b/gtk/gtktreeitem.c index dc4cb886e..90e6f79cb 100644 --- a/gtk/gtktreeitem.c +++ b/gtk/gtktreeitem.c @@ -24,13 +24,20 @@ * 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" @@ -64,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_focus (GtkWidget *widget); static void gtk_tree_item_paint (GtkWidget *widget, GdkRectangle *area); 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, @@ -85,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*); @@ -119,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); } @@ -145,11 +146,8 @@ gtk_tree_item_class_init (GtkTreeItemClass *class) 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_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; @@ -163,45 +161,45 @@ 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); } /* 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)) @@ -223,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; @@ -251,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 ()); @@ -260,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)); } @@ -298,9 +293,7 @@ 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) @@ -322,23 +315,11 @@ 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 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)); @@ -347,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)); @@ -356,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); @@ -365,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); @@ -378,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) @@ -407,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; @@ -416,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); } @@ -437,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) @@ -448,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); @@ -466,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) @@ -486,7 +461,6 @@ gtk_tree_item_size_request (GtkWidget *widget, 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); @@ -525,7 +499,6 @@ gtk_tree_item_size_allocate (GtkWidget *widget, 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); @@ -571,8 +544,8 @@ 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); @@ -581,6 +554,8 @@ gtk_tree_item_draw_lines (GtkWidget *widget) 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) + @@ -592,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) @@ -601,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; @@ -624,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); } @@ -635,11 +609,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 (widget != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (widget)); g_return_if_fail (area != NULL); @@ -651,7 +623,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) @@ -663,7 +634,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 @@ -693,30 +664,20 @@ gtk_tree_item_paint (GtkWidget *widget, } 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); @@ -725,61 +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 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_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_expose (GtkWidget *widget, GdkEventExpose *event) { - GdkEventExpose child_event; - GtkBin *bin; - - 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); if (GTK_WIDGET_DRAWABLE (widget)) { - bin = GTK_BIN (widget); - gtk_tree_item_paint (widget, &event->area); - child_event = *event; - if (bin->child && GTK_WIDGET_NO_WINDOW (bin->child) && - gtk_widget_intersect (bin->child, &event->area, &child_event.area)) - gtk_widget_event (bin->child, (GdkEvent*) &child_event); - } - - return FALSE; -} - -static gint -gtk_tree_item_focus_in (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); - - 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); - - 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; } @@ -787,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); @@ -808,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); @@ -823,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)) @@ -851,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) @@ -880,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) @@ -910,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 @@ -973,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); @@ -1016,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); @@ -1043,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); @@ -1072,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); @@ -1083,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"