1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * GtkToolbar copyright (C) Federico Mena
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
23 * file for a list of people on the GTK+ Team. See the ChangeLog
24 * files for a list of changes. These files are distributed with
25 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
28 #include "gtkbutton.h"
29 #include "gtktogglebutton.h"
30 #include "gtkradiobutton.h"
34 #include "gtktoolbar.h"
37 #define DEFAULT_SPACE_SIZE 5
38 #define DEFAULT_SPACE_STYLE GTK_TOOLBAR_SPACE_EMPTY
40 #define SPACE_LINE_DIVISION 10
41 #define SPACE_LINE_START 3
42 #define SPACE_LINE_END 7
59 typedef struct _GtkToolbarChildSpace GtkToolbarChildSpace;
60 struct _GtkToolbarChildSpace
62 GtkToolbarChild child;
64 gint alloc_x, alloc_y;
67 static void gtk_toolbar_class_init (GtkToolbarClass *class);
68 static void gtk_toolbar_init (GtkToolbar *toolbar);
69 static void gtk_toolbar_set_arg (GtkObject *object,
72 static void gtk_toolbar_get_arg (GtkObject *object,
75 static void gtk_toolbar_destroy (GtkObject *object);
76 static void gtk_toolbar_map (GtkWidget *widget);
77 static void gtk_toolbar_unmap (GtkWidget *widget);
78 static void gtk_toolbar_draw (GtkWidget *widget,
80 static gint gtk_toolbar_expose (GtkWidget *widget,
81 GdkEventExpose *event);
82 static void gtk_toolbar_size_request (GtkWidget *widget,
83 GtkRequisition *requisition);
84 static void gtk_toolbar_size_allocate (GtkWidget *widget,
85 GtkAllocation *allocation);
86 static void gtk_toolbar_add (GtkContainer *container,
88 static void gtk_toolbar_remove (GtkContainer *container,
90 static void gtk_toolbar_forall (GtkContainer *container,
91 gboolean include_internals,
93 gpointer callback_data);
94 static void gtk_real_toolbar_orientation_changed (GtkToolbar *toolbar,
95 GtkOrientation orientation);
96 static void gtk_real_toolbar_style_changed (GtkToolbar *toolbar,
97 GtkToolbarStyle style);
100 static GtkContainerClass *parent_class;
102 static guint toolbar_signals[LAST_SIGNAL] = { 0 };
106 gtk_toolbar_get_type (void)
108 static GtkType toolbar_type = 0;
112 static const GtkTypeInfo toolbar_info =
116 sizeof (GtkToolbarClass),
117 (GtkClassInitFunc) gtk_toolbar_class_init,
118 (GtkObjectInitFunc) gtk_toolbar_init,
119 /* reserved_1 */ NULL,
120 /* reserved_2 */ NULL,
121 (GtkClassInitFunc) NULL,
124 toolbar_type = gtk_type_unique (gtk_container_get_type (), &toolbar_info);
131 gtk_toolbar_class_init (GtkToolbarClass *class)
133 GtkObjectClass *object_class;
134 GtkWidgetClass *widget_class;
135 GtkContainerClass *container_class;
137 object_class = (GtkObjectClass *) class;
138 widget_class = (GtkWidgetClass *) class;
139 container_class = (GtkContainerClass *) class;
141 parent_class = gtk_type_class (gtk_container_get_type ());
143 toolbar_signals[ORIENTATION_CHANGED] =
144 gtk_signal_new ("orientation_changed",
147 GTK_SIGNAL_OFFSET (GtkToolbarClass, orientation_changed),
148 gtk_marshal_NONE__INT,
151 toolbar_signals[STYLE_CHANGED] =
152 gtk_signal_new ("style_changed",
155 GTK_SIGNAL_OFFSET (GtkToolbarClass, style_changed),
156 gtk_marshal_NONE__INT,
160 gtk_object_class_add_signals (object_class, toolbar_signals, LAST_SIGNAL);
162 object_class->destroy = gtk_toolbar_destroy;
163 object_class->set_arg = gtk_toolbar_set_arg;
164 object_class->get_arg = gtk_toolbar_get_arg;
166 widget_class->map = gtk_toolbar_map;
167 widget_class->unmap = gtk_toolbar_unmap;
168 widget_class->draw = gtk_toolbar_draw;
169 widget_class->expose_event = gtk_toolbar_expose;
170 widget_class->size_request = gtk_toolbar_size_request;
171 widget_class->size_allocate = gtk_toolbar_size_allocate;
173 container_class->add = gtk_toolbar_add;
174 container_class->remove = gtk_toolbar_remove;
175 container_class->forall = gtk_toolbar_forall;
176 container_class->focus = NULL;
178 class->orientation_changed = gtk_real_toolbar_orientation_changed;
179 class->style_changed = gtk_real_toolbar_style_changed;
181 gtk_object_add_arg_type ("GtkToolbar::orientation", GTK_TYPE_ORIENTATION,
182 GTK_ARG_READWRITE, ARG_ORIENTATION);
183 gtk_object_add_arg_type ("GtkToolbar::toolbar_style", GTK_TYPE_TOOLBAR_STYLE,
184 GTK_ARG_READWRITE, ARG_TOOLBAR_STYLE);
185 gtk_object_add_arg_type ("GtkToolbar::space_size", GTK_TYPE_UINT,
186 GTK_ARG_READWRITE, ARG_SPACE_SIZE);
187 gtk_object_add_arg_type ("GtkToolbar::space_style", GTK_TYPE_TOOLBAR_SPACE_STYLE,
188 GTK_ARG_READWRITE, ARG_SPACE_STYLE);
189 gtk_object_add_arg_type ("GtkToolbar::relief", GTK_TYPE_RELIEF_STYLE,
190 GTK_ARG_READWRITE, ARG_RELIEF);
194 gtk_toolbar_init (GtkToolbar *toolbar)
196 GTK_WIDGET_SET_FLAGS (toolbar, GTK_NO_WINDOW);
197 GTK_WIDGET_UNSET_FLAGS (toolbar, GTK_CAN_FOCUS);
199 toolbar->num_children = 0;
200 toolbar->children = NULL;
201 toolbar->orientation = GTK_ORIENTATION_HORIZONTAL;
202 toolbar->style = GTK_TOOLBAR_ICONS;
203 toolbar->relief = GTK_RELIEF_NORMAL;
204 toolbar->space_size = DEFAULT_SPACE_SIZE;
205 toolbar->space_style = DEFAULT_SPACE_STYLE;
206 toolbar->tooltips = gtk_tooltips_new ();
207 toolbar->button_maxw = 0;
208 toolbar->button_maxh = 0;
212 gtk_toolbar_set_arg (GtkObject *object,
216 GtkToolbar *toolbar = GTK_TOOLBAR (object);
220 case ARG_ORIENTATION:
221 gtk_toolbar_set_orientation (toolbar, GTK_VALUE_ENUM (*arg));
223 case ARG_TOOLBAR_STYLE:
224 gtk_toolbar_set_style (toolbar, GTK_VALUE_ENUM (*arg));
227 gtk_toolbar_set_space_size (toolbar, GTK_VALUE_UINT (*arg));
229 case ARG_SPACE_STYLE:
230 gtk_toolbar_set_space_style (toolbar, GTK_VALUE_ENUM (*arg));
233 gtk_toolbar_set_button_relief (toolbar, GTK_VALUE_ENUM (*arg));
239 gtk_toolbar_get_arg (GtkObject *object,
243 GtkToolbar *toolbar = GTK_TOOLBAR (object);
247 case ARG_ORIENTATION:
248 GTK_VALUE_ENUM (*arg) = toolbar->orientation;
250 case ARG_TOOLBAR_STYLE:
251 GTK_VALUE_ENUM (*arg) = toolbar->style;
254 GTK_VALUE_UINT (*arg) = toolbar->space_size;
256 case ARG_SPACE_STYLE:
257 GTK_VALUE_ENUM (*arg) = toolbar->space_style;
260 GTK_VALUE_ENUM (*arg) = toolbar->relief;
263 arg->type = GTK_TYPE_INVALID;
269 gtk_toolbar_new (GtkOrientation orientation,
270 GtkToolbarStyle style)
274 toolbar = gtk_type_new (gtk_toolbar_get_type ());
276 toolbar->orientation = orientation;
277 toolbar->style = style;
279 return GTK_WIDGET (toolbar);
283 gtk_toolbar_destroy (GtkObject *object)
288 g_return_if_fail (object != NULL);
289 g_return_if_fail (GTK_IS_TOOLBAR (object));
291 toolbar = GTK_TOOLBAR (object);
293 gtk_object_unref (GTK_OBJECT (toolbar->tooltips));
294 toolbar->tooltips = NULL;
296 for (children = toolbar->children; children; children = children->next)
298 GtkToolbarChild *child;
300 child = children->data;
302 if (child->type != GTK_TOOLBAR_CHILD_SPACE)
304 gtk_widget_ref (child->widget);
305 gtk_widget_unparent (child->widget);
306 gtk_widget_destroy (child->widget);
307 gtk_widget_unref (child->widget);
313 g_list_free (toolbar->children);
314 toolbar->children = NULL;
316 if (GTK_OBJECT_CLASS (parent_class)->destroy)
317 (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
321 gtk_toolbar_map (GtkWidget *widget)
325 GtkToolbarChild *child;
327 g_return_if_fail (widget != NULL);
328 g_return_if_fail (GTK_IS_TOOLBAR (widget));
330 toolbar = GTK_TOOLBAR (widget);
331 GTK_WIDGET_SET_FLAGS (toolbar, GTK_MAPPED);
333 for (children = toolbar->children; children; children = children->next)
335 child = children->data;
337 if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
338 && GTK_WIDGET_VISIBLE (child->widget) && !GTK_WIDGET_MAPPED (child->widget))
339 gtk_widget_map (child->widget);
344 gtk_toolbar_unmap (GtkWidget *widget)
348 GtkToolbarChild *child;
350 g_return_if_fail (widget != NULL);
351 g_return_if_fail (GTK_IS_TOOLBAR (widget));
353 toolbar = GTK_TOOLBAR (widget);
354 GTK_WIDGET_UNSET_FLAGS (toolbar, GTK_MAPPED);
356 for (children = toolbar->children; children; children = children->next)
358 child = children->data;
360 if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
361 && GTK_WIDGET_VISIBLE (child->widget) && GTK_WIDGET_MAPPED (child->widget))
362 gtk_widget_unmap (child->widget);
367 gtk_toolbar_paint_space_line (GtkWidget *widget,
369 GtkToolbarChild *child)
372 GtkToolbarChildSpace *child_space;
374 g_return_if_fail (widget != NULL);
375 g_return_if_fail (GTK_IS_TOOLBAR (widget));
376 g_return_if_fail (child != NULL);
377 g_return_if_fail (child->type == GTK_TOOLBAR_CHILD_SPACE);
379 toolbar = GTK_TOOLBAR (widget);
381 child_space = (GtkToolbarChildSpace *) child;
383 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
384 gtk_paint_vline (widget->style, widget->window,
385 GTK_WIDGET_STATE (widget), area, widget,
387 child_space->alloc_y + toolbar->button_maxh *
388 SPACE_LINE_START / SPACE_LINE_DIVISION,
389 child_space->alloc_y + toolbar->button_maxh *
390 SPACE_LINE_END / SPACE_LINE_DIVISION,
391 child_space->alloc_x +
392 (toolbar->space_size -
393 widget->style->klass->xthickness) / 2);
395 gtk_paint_hline (widget->style, widget->window,
396 GTK_WIDGET_STATE (widget), area, widget,
398 child_space->alloc_x + toolbar->button_maxw *
399 SPACE_LINE_START / SPACE_LINE_DIVISION,
400 child_space->alloc_x + toolbar->button_maxw *
401 SPACE_LINE_END / SPACE_LINE_DIVISION,
402 child_space->alloc_y +
403 (toolbar->space_size -
404 widget->style->klass->ythickness) / 2);
408 gtk_toolbar_draw (GtkWidget *widget,
413 GtkToolbarChild *child;
414 GdkRectangle child_area;
416 g_return_if_fail (widget != NULL);
417 g_return_if_fail (GTK_IS_TOOLBAR (widget));
419 if (GTK_WIDGET_DRAWABLE (widget))
421 toolbar = GTK_TOOLBAR (widget);
423 for (children = toolbar->children; children; children = children->next)
425 child = children->data;
427 if (child->type == GTK_TOOLBAR_CHILD_SPACE)
429 if (toolbar->space_style == GTK_TOOLBAR_SPACE_LINE)
430 gtk_toolbar_paint_space_line (widget, area, child);
432 else if (gtk_widget_intersect (child->widget, area, &child_area))
433 gtk_widget_draw (child->widget, &child_area);
439 gtk_toolbar_expose (GtkWidget *widget,
440 GdkEventExpose *event)
444 GtkToolbarChild *child;
445 GdkEventExpose child_event;
447 g_return_val_if_fail (widget != NULL, FALSE);
448 g_return_val_if_fail (GTK_IS_TOOLBAR (widget), FALSE);
449 g_return_val_if_fail (event != NULL, FALSE);
451 if (GTK_WIDGET_DRAWABLE (widget))
453 toolbar = GTK_TOOLBAR (widget);
455 child_event = *event;
457 for (children = toolbar->children; children; children = children->next)
459 child = children->data;
461 if (child->type == GTK_TOOLBAR_CHILD_SPACE)
463 if (toolbar->space_style == GTK_TOOLBAR_SPACE_LINE)
464 gtk_toolbar_paint_space_line (widget, &event->area, child);
466 else if (GTK_WIDGET_NO_WINDOW (child->widget)
467 && gtk_widget_intersect (child->widget, &event->area, &child_event.area))
468 gtk_widget_event (child->widget, (GdkEvent *) &child_event);
476 gtk_toolbar_size_request (GtkWidget *widget,
477 GtkRequisition *requisition)
481 GtkToolbarChild *child;
483 gint button_maxw, button_maxh;
484 gint widget_maxw, widget_maxh;
485 GtkRequisition child_requisition;
487 g_return_if_fail (widget != NULL);
488 g_return_if_fail (GTK_IS_TOOLBAR (widget));
489 g_return_if_fail (requisition != NULL);
491 toolbar = GTK_TOOLBAR (widget);
493 requisition->width = GTK_CONTAINER (toolbar)->border_width * 2;
494 requisition->height = GTK_CONTAINER (toolbar)->border_width * 2;
501 for (children = toolbar->children; children; children = children->next)
503 child = children->data;
507 case GTK_TOOLBAR_CHILD_SPACE:
508 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
509 requisition->width += toolbar->space_size;
511 requisition->height += toolbar->space_size;
515 case GTK_TOOLBAR_CHILD_BUTTON:
516 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
517 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
518 if (GTK_WIDGET_VISIBLE (child->widget))
520 gtk_widget_size_request (child->widget, &child_requisition);
523 button_maxw = MAX (button_maxw, child_requisition.width);
524 button_maxh = MAX (button_maxh, child_requisition.height);
529 case GTK_TOOLBAR_CHILD_WIDGET:
530 if (GTK_WIDGET_VISIBLE (child->widget))
532 gtk_widget_size_request (child->widget, &child_requisition);
534 widget_maxw = MAX (widget_maxw, child_requisition.width);
535 widget_maxh = MAX (widget_maxh, child_requisition.height);
537 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
538 requisition->width += child_requisition.width;
540 requisition->height += child_requisition.height;
546 g_assert_not_reached ();
550 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
552 requisition->width += nbuttons * button_maxw;
553 requisition->height += MAX (button_maxh, widget_maxh);
557 requisition->width += MAX (button_maxw, widget_maxw);
558 requisition->height += nbuttons * button_maxh;
561 toolbar->button_maxw = button_maxw;
562 toolbar->button_maxh = button_maxh;
566 gtk_toolbar_size_allocate (GtkWidget *widget,
567 GtkAllocation *allocation)
571 GtkToolbarChild *child;
572 GtkToolbarChildSpace *child_space;
574 GtkRequisition child_requisition;
577 g_return_if_fail (widget != NULL);
578 g_return_if_fail (GTK_IS_TOOLBAR (widget));
579 g_return_if_fail (allocation != NULL);
581 toolbar = GTK_TOOLBAR (widget);
582 widget->allocation = *allocation;
584 border_width = GTK_CONTAINER (toolbar)->border_width;
586 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
587 alloc.x = allocation->x + border_width;
589 alloc.y = allocation->y + border_width;
591 for (children = toolbar->children; children; children = children->next)
593 child = children->data;
597 case GTK_TOOLBAR_CHILD_SPACE:
599 child_space = (GtkToolbarChildSpace *) child;
601 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
603 child_space->alloc_x = alloc.x;
604 child_space->alloc_y = allocation->y + (allocation->height - toolbar->button_maxh) / 2;
605 alloc.x += toolbar->space_size;
609 child_space->alloc_x = allocation->x + (allocation->width - toolbar->button_maxw) / 2;
610 child_space->alloc_y = alloc.y;
611 alloc.y += toolbar->space_size;
616 case GTK_TOOLBAR_CHILD_BUTTON:
617 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
618 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
619 if (!GTK_WIDGET_VISIBLE (child->widget))
622 alloc.width = toolbar->button_maxw;
623 alloc.height = toolbar->button_maxh;
625 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
626 alloc.y = allocation->y + (allocation->height - toolbar->button_maxh) / 2;
628 alloc.x = allocation->x + (allocation->width - toolbar->button_maxw) / 2;
630 gtk_widget_size_allocate (child->widget, &alloc);
632 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
633 alloc.x += toolbar->button_maxw;
635 alloc.y += toolbar->button_maxh;
639 case GTK_TOOLBAR_CHILD_WIDGET:
640 if (!GTK_WIDGET_VISIBLE (child->widget))
643 gtk_widget_get_child_requisition (child->widget, &child_requisition);
645 alloc.width = child_requisition.width;
646 alloc.height = child_requisition.height;
648 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
649 alloc.y = allocation->y + (allocation->height - child_requisition.height) / 2;
651 alloc.x = allocation->x + (allocation->width - child_requisition.width) / 2;
653 gtk_widget_size_allocate (child->widget, &alloc);
655 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
656 alloc.x += child_requisition.width;
658 alloc.y += child_requisition.height;
663 g_assert_not_reached ();
669 gtk_toolbar_add (GtkContainer *container,
672 g_return_if_fail (container != NULL);
673 g_return_if_fail (GTK_IS_TOOLBAR (container));
674 g_return_if_fail (widget != NULL);
676 gtk_toolbar_append_widget (GTK_TOOLBAR (container), widget, NULL, NULL);
680 gtk_toolbar_remove (GtkContainer *container,
685 GtkToolbarChild *child;
687 g_return_if_fail (container != NULL);
688 g_return_if_fail (GTK_IS_TOOLBAR (container));
689 g_return_if_fail (widget != NULL);
691 toolbar = GTK_TOOLBAR (container);
693 for (children = toolbar->children; children; children = children->next)
695 child = children->data;
697 if ((child->type != GTK_TOOLBAR_CHILD_SPACE) && (child->widget == widget))
699 gboolean was_visible;
701 was_visible = GTK_WIDGET_VISIBLE (widget);
702 gtk_widget_unparent (widget);
704 toolbar->children = g_list_remove_link (toolbar->children, children);
706 g_list_free (children);
707 toolbar->num_children--;
709 if (was_visible && GTK_WIDGET_VISIBLE (container))
710 gtk_widget_queue_resize (GTK_WIDGET (container));
718 gtk_toolbar_forall (GtkContainer *container,
719 gboolean include_internals,
720 GtkCallback callback,
721 gpointer callback_data)
725 GtkToolbarChild *child;
727 g_return_if_fail (container != NULL);
728 g_return_if_fail (GTK_IS_TOOLBAR (container));
729 g_return_if_fail (callback != NULL);
731 toolbar = GTK_TOOLBAR (container);
733 for (children = toolbar->children; children; children = children->next)
735 child = children->data;
737 if (child->type != GTK_TOOLBAR_CHILD_SPACE)
738 (*callback) (child->widget, callback_data);
743 gtk_toolbar_append_item (GtkToolbar *toolbar,
745 const char *tooltip_text,
746 const char *tooltip_private_text,
748 GtkSignalFunc callback,
751 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
753 tooltip_text, tooltip_private_text,
754 icon, callback, user_data,
755 toolbar->num_children);
759 gtk_toolbar_prepend_item (GtkToolbar *toolbar,
761 const char *tooltip_text,
762 const char *tooltip_private_text,
764 GtkSignalFunc callback,
767 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
769 tooltip_text, tooltip_private_text,
770 icon, callback, user_data,
775 gtk_toolbar_insert_item (GtkToolbar *toolbar,
777 const char *tooltip_text,
778 const char *tooltip_private_text,
780 GtkSignalFunc callback,
784 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
786 tooltip_text, tooltip_private_text,
787 icon, callback, user_data,
792 gtk_toolbar_append_space (GtkToolbar *toolbar)
794 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
798 toolbar->num_children);
802 gtk_toolbar_prepend_space (GtkToolbar *toolbar)
804 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
812 gtk_toolbar_insert_space (GtkToolbar *toolbar,
815 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
823 gtk_toolbar_append_widget (GtkToolbar *toolbar,
825 const gchar *tooltip_text,
826 const gchar *tooltip_private_text)
828 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
830 tooltip_text, tooltip_private_text,
832 toolbar->num_children);
836 gtk_toolbar_prepend_widget (GtkToolbar *toolbar,
838 const gchar *tooltip_text,
839 const gchar *tooltip_private_text)
841 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
843 tooltip_text, tooltip_private_text,
845 toolbar->num_children);
849 gtk_toolbar_insert_widget (GtkToolbar *toolbar,
851 const char *tooltip_text,
852 const char *tooltip_private_text,
855 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
857 tooltip_text, tooltip_private_text,
863 gtk_toolbar_append_element (GtkToolbar *toolbar,
864 GtkToolbarChildType type,
867 const char *tooltip_text,
868 const char *tooltip_private_text,
870 GtkSignalFunc callback,
873 return gtk_toolbar_insert_element (toolbar, type, widget, text,
874 tooltip_text, tooltip_private_text,
875 icon, callback, user_data,
876 toolbar->num_children);
880 gtk_toolbar_prepend_element (GtkToolbar *toolbar,
881 GtkToolbarChildType type,
884 const char *tooltip_text,
885 const char *tooltip_private_text,
887 GtkSignalFunc callback,
890 return gtk_toolbar_insert_element (toolbar, type, widget, text,
891 tooltip_text, tooltip_private_text,
892 icon, callback, user_data, 0);
896 gtk_toolbar_insert_element (GtkToolbar *toolbar,
897 GtkToolbarChildType type,
900 const char *tooltip_text,
901 const char *tooltip_private_text,
903 GtkSignalFunc callback,
907 GtkToolbarChild *child;
910 g_return_val_if_fail (toolbar != NULL, NULL);
911 g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
912 if (type == GTK_TOOLBAR_CHILD_WIDGET)
914 g_return_val_if_fail (widget != NULL, NULL);
915 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
917 else if (type != GTK_TOOLBAR_CHILD_RADIOBUTTON)
918 g_return_val_if_fail (widget == NULL, NULL);
920 if (type == GTK_TOOLBAR_CHILD_SPACE)
921 child = (GtkToolbarChild *) g_new (GtkToolbarChildSpace, 1);
923 child = g_new (GtkToolbarChild, 1);
931 case GTK_TOOLBAR_CHILD_SPACE:
932 child->widget = NULL;
933 ((GtkToolbarChildSpace *) child)->alloc_x =
934 ((GtkToolbarChildSpace *) child)->alloc_y = 0;
937 case GTK_TOOLBAR_CHILD_WIDGET:
938 child->widget = widget;
941 case GTK_TOOLBAR_CHILD_BUTTON:
942 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
943 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
944 if (type == GTK_TOOLBAR_CHILD_BUTTON)
946 child->widget = gtk_button_new ();
947 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
949 else if (type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
951 child->widget = gtk_toggle_button_new ();
952 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
953 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget),
958 child->widget = gtk_radio_button_new (widget
959 ? gtk_radio_button_group (GTK_RADIO_BUTTON (widget))
961 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
962 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget), FALSE);
965 GTK_WIDGET_UNSET_FLAGS (child->widget, GTK_CAN_FOCUS);
968 gtk_signal_connect (GTK_OBJECT (child->widget), "clicked",
969 callback, user_data);
971 if (toolbar->style == GTK_TOOLBAR_BOTH_HORIZ)
972 box = gtk_hbox_new (FALSE, 0);
974 box = gtk_vbox_new (FALSE, 0);
975 gtk_container_add (GTK_CONTAINER (child->widget), box);
976 gtk_widget_show (box);
980 child->label = gtk_label_new (text);
981 gtk_box_pack_end (GTK_BOX (box), child->label, FALSE, FALSE, 0);
982 if (toolbar->style != GTK_TOOLBAR_ICONS)
983 gtk_widget_show (child->label);
988 child->icon = GTK_WIDGET (icon);
989 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
990 if (toolbar->style != GTK_TOOLBAR_TEXT)
991 gtk_widget_show (child->icon);
994 gtk_widget_show (child->widget);
998 g_assert_not_reached ();
1001 if ((type != GTK_TOOLBAR_CHILD_SPACE) && tooltip_text)
1002 gtk_tooltips_set_tip (toolbar->tooltips, child->widget,
1003 tooltip_text, tooltip_private_text);
1005 toolbar->children = g_list_insert (toolbar->children, child, position);
1006 toolbar->num_children++;
1008 if (type != GTK_TOOLBAR_CHILD_SPACE)
1010 gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
1012 if (GTK_WIDGET_REALIZED (child->widget->parent))
1013 gtk_widget_realize (child->widget);
1015 if (GTK_WIDGET_VISIBLE (child->widget->parent) && GTK_WIDGET_VISIBLE (child->widget))
1017 if (GTK_WIDGET_MAPPED (child->widget->parent))
1018 gtk_widget_map (child->widget);
1020 gtk_widget_queue_resize (child->widget);
1024 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1026 return child->widget;
1030 gtk_toolbar_set_orientation (GtkToolbar *toolbar,
1031 GtkOrientation orientation)
1033 g_return_if_fail (toolbar != NULL);
1034 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1036 gtk_signal_emit (GTK_OBJECT (toolbar), toolbar_signals[ORIENTATION_CHANGED], orientation);
1040 gtk_toolbar_set_style (GtkToolbar *toolbar,
1041 GtkToolbarStyle style)
1043 g_return_if_fail (toolbar != NULL);
1044 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1046 gtk_signal_emit (GTK_OBJECT (toolbar), toolbar_signals[STYLE_CHANGED], style);
1050 gtk_toolbar_set_space_size (GtkToolbar *toolbar,
1053 g_return_if_fail (toolbar != NULL);
1054 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1056 if (toolbar->space_size != space_size)
1058 toolbar->space_size = space_size;
1059 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1064 gtk_toolbar_set_space_style (GtkToolbar *toolbar,
1065 GtkToolbarSpaceStyle space_style)
1067 g_return_if_fail (toolbar != NULL);
1068 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1070 if (toolbar->space_style != space_style)
1072 toolbar->space_style = space_style;
1073 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1078 gtk_toolbar_set_tooltips (GtkToolbar *toolbar,
1081 g_return_if_fail (toolbar != NULL);
1082 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1085 gtk_tooltips_enable (toolbar->tooltips);
1087 gtk_tooltips_disable (toolbar->tooltips);
1091 gtk_toolbar_set_button_relief (GtkToolbar *toolbar,
1092 GtkReliefStyle relief)
1095 GtkToolbarChild *child;
1097 g_return_if_fail (toolbar != NULL);
1098 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1100 if (toolbar->relief != relief)
1102 toolbar->relief = relief;
1104 for (children = toolbar->children; children; children = children->next)
1106 child = children->data;
1107 if (child->type == GTK_TOOLBAR_CHILD_BUTTON ||
1108 child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON ||
1109 child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
1110 gtk_button_set_relief (GTK_BUTTON (child->widget), relief);
1113 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1118 gtk_toolbar_get_button_relief (GtkToolbar *toolbar)
1120 g_return_val_if_fail (toolbar != NULL, GTK_RELIEF_NORMAL);
1121 g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
1123 return toolbar->relief;
1127 gtk_real_toolbar_orientation_changed (GtkToolbar *toolbar,
1128 GtkOrientation orientation)
1130 g_return_if_fail (toolbar != NULL);
1131 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1133 if (toolbar->orientation != orientation)
1135 toolbar->orientation = orientation;
1136 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1141 gtk_real_toolbar_style_changed (GtkToolbar *toolbar,
1142 GtkToolbarStyle style)
1145 GtkToolbarChild *child;
1146 GtkWidget* box = NULL;
1148 g_return_if_fail (toolbar != NULL);
1149 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1151 if (toolbar->style != style)
1153 toolbar->style = style;
1155 for (children = toolbar->children; children; children = children->next)
1157 child = children->data;
1159 if (child->type == GTK_TOOLBAR_CHILD_BUTTON ||
1160 child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON ||
1161 child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
1164 case GTK_TOOLBAR_ICONS:
1165 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1166 gtk_widget_show (child->icon);
1168 if (child->label && GTK_WIDGET_VISIBLE (child->label))
1169 gtk_widget_hide (child->label);
1173 case GTK_TOOLBAR_TEXT:
1174 if (child->icon && GTK_WIDGET_VISIBLE (child->icon))
1175 gtk_widget_hide (child->icon);
1177 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1178 gtk_widget_show (child->label);
1182 case GTK_TOOLBAR_BOTH:
1183 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1184 gtk_widget_show (child->icon);
1186 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1187 gtk_widget_show (child->label);
1189 box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
1191 if (GTK_IS_HBOX (box))
1195 gtk_object_ref (GTK_OBJECT (child->icon));
1196 gtk_container_remove (GTK_CONTAINER (box),
1201 gtk_object_ref (GTK_OBJECT (child->label));
1202 gtk_container_remove (GTK_CONTAINER (box),
1205 gtk_container_remove (GTK_CONTAINER (child->widget),
1208 box = gtk_vbox_new (FALSE, 0);
1209 gtk_widget_show (box);
1213 gtk_box_pack_end (GTK_BOX (box), child->label, FALSE, FALSE, 0);
1214 gtk_object_unref (GTK_OBJECT (child->label));
1218 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
1219 gtk_object_unref (GTK_OBJECT (child->icon));
1221 gtk_container_add (GTK_CONTAINER (child->widget),
1227 case GTK_TOOLBAR_BOTH_HORIZ:
1228 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1229 gtk_widget_show (child->icon);
1230 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1231 gtk_widget_show (child->label);
1233 box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
1235 if (GTK_IS_VBOX (box))
1239 gtk_object_ref (GTK_OBJECT (child->icon));
1240 gtk_container_remove (GTK_CONTAINER (box),
1245 gtk_object_ref (GTK_OBJECT (child->label));
1246 gtk_container_remove (GTK_CONTAINER (box),
1249 gtk_container_remove (GTK_CONTAINER (child->widget),
1252 box = gtk_hbox_new (FALSE, 0);
1253 gtk_widget_show (box);
1257 gtk_box_pack_end (GTK_BOX (box), child->label, TRUE, TRUE, 0);
1258 gtk_object_unref (GTK_OBJECT (child->label));
1262 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
1263 gtk_object_unref (GTK_OBJECT (child->icon));
1265 gtk_container_add (GTK_CONTAINER (child->widget), box);
1272 g_assert_not_reached ();
1276 gtk_widget_queue_resize (GTK_WIDGET (toolbar));