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",
146 GTK_CLASS_TYPE (object_class),
147 GTK_SIGNAL_OFFSET (GtkToolbarClass, orientation_changed),
148 gtk_marshal_NONE__INT,
151 toolbar_signals[STYLE_CHANGED] =
152 gtk_signal_new ("style_changed",
154 GTK_CLASS_TYPE (object_class),
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 if (toolbar->tooltips)
295 gtk_object_unref (GTK_OBJECT (toolbar->tooltips));
296 toolbar->tooltips = NULL;
299 for (children = toolbar->children; children; children = children->next)
301 GtkToolbarChild *child;
303 child = children->data;
305 if (child->type != GTK_TOOLBAR_CHILD_SPACE)
307 gtk_widget_ref (child->widget);
308 gtk_widget_unparent (child->widget);
309 gtk_widget_destroy (child->widget);
310 gtk_widget_unref (child->widget);
315 g_list_free (toolbar->children);
316 toolbar->children = NULL;
318 GTK_OBJECT_CLASS (parent_class)->destroy (object);
322 gtk_toolbar_map (GtkWidget *widget)
326 GtkToolbarChild *child;
328 g_return_if_fail (widget != NULL);
329 g_return_if_fail (GTK_IS_TOOLBAR (widget));
331 toolbar = GTK_TOOLBAR (widget);
332 GTK_WIDGET_SET_FLAGS (toolbar, GTK_MAPPED);
334 for (children = toolbar->children; children; children = children->next)
336 child = children->data;
338 if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
339 && GTK_WIDGET_VISIBLE (child->widget) && !GTK_WIDGET_MAPPED (child->widget))
340 gtk_widget_map (child->widget);
345 gtk_toolbar_unmap (GtkWidget *widget)
349 GtkToolbarChild *child;
351 g_return_if_fail (widget != NULL);
352 g_return_if_fail (GTK_IS_TOOLBAR (widget));
354 toolbar = GTK_TOOLBAR (widget);
355 GTK_WIDGET_UNSET_FLAGS (toolbar, GTK_MAPPED);
357 for (children = toolbar->children; children; children = children->next)
359 child = children->data;
361 if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
362 && GTK_WIDGET_VISIBLE (child->widget) && GTK_WIDGET_MAPPED (child->widget))
363 gtk_widget_unmap (child->widget);
368 gtk_toolbar_paint_space_line (GtkWidget *widget,
370 GtkToolbarChild *child)
373 GtkToolbarChildSpace *child_space;
375 g_return_if_fail (widget != NULL);
376 g_return_if_fail (GTK_IS_TOOLBAR (widget));
377 g_return_if_fail (child != NULL);
378 g_return_if_fail (child->type == GTK_TOOLBAR_CHILD_SPACE);
380 toolbar = GTK_TOOLBAR (widget);
382 child_space = (GtkToolbarChildSpace *) child;
384 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
385 gtk_paint_vline (widget->style, widget->window,
386 GTK_WIDGET_STATE (widget), area, widget,
388 child_space->alloc_y + toolbar->button_maxh *
389 SPACE_LINE_START / SPACE_LINE_DIVISION,
390 child_space->alloc_y + toolbar->button_maxh *
391 SPACE_LINE_END / SPACE_LINE_DIVISION,
392 child_space->alloc_x +
393 (toolbar->space_size -
394 widget->style->xthickness) / 2);
396 gtk_paint_hline (widget->style, widget->window,
397 GTK_WIDGET_STATE (widget), area, widget,
399 child_space->alloc_x + toolbar->button_maxw *
400 SPACE_LINE_START / SPACE_LINE_DIVISION,
401 child_space->alloc_x + toolbar->button_maxw *
402 SPACE_LINE_END / SPACE_LINE_DIVISION,
403 child_space->alloc_y +
404 (toolbar->space_size -
405 widget->style->ythickness) / 2);
409 gtk_toolbar_draw (GtkWidget *widget,
414 GtkToolbarChild *child;
415 GdkRectangle child_area;
417 g_return_if_fail (widget != NULL);
418 g_return_if_fail (GTK_IS_TOOLBAR (widget));
420 if (GTK_WIDGET_DRAWABLE (widget))
422 toolbar = GTK_TOOLBAR (widget);
424 for (children = toolbar->children; children; children = children->next)
426 child = children->data;
428 if (child->type == GTK_TOOLBAR_CHILD_SPACE)
430 if (toolbar->space_style == GTK_TOOLBAR_SPACE_LINE)
431 gtk_toolbar_paint_space_line (widget, area, child);
433 else if (gtk_widget_intersect (child->widget, area, &child_area))
434 gtk_widget_draw (child->widget, &child_area);
440 gtk_toolbar_expose (GtkWidget *widget,
441 GdkEventExpose *event)
445 GtkToolbarChild *child;
446 GdkEventExpose child_event;
448 g_return_val_if_fail (widget != NULL, FALSE);
449 g_return_val_if_fail (GTK_IS_TOOLBAR (widget), FALSE);
450 g_return_val_if_fail (event != NULL, FALSE);
452 if (GTK_WIDGET_DRAWABLE (widget))
454 toolbar = GTK_TOOLBAR (widget);
456 child_event = *event;
458 for (children = toolbar->children; children; children = children->next)
460 child = children->data;
462 if (child->type == GTK_TOOLBAR_CHILD_SPACE)
464 if (toolbar->space_style == GTK_TOOLBAR_SPACE_LINE)
465 gtk_toolbar_paint_space_line (widget, &event->area, child);
467 else if (GTK_WIDGET_NO_WINDOW (child->widget)
468 && gtk_widget_intersect (child->widget, &event->area, &child_event.area))
469 gtk_widget_event (child->widget, (GdkEvent *) &child_event);
477 gtk_toolbar_size_request (GtkWidget *widget,
478 GtkRequisition *requisition)
482 GtkToolbarChild *child;
484 gint button_maxw, button_maxh;
485 gint widget_maxw, widget_maxh;
486 GtkRequisition child_requisition;
488 g_return_if_fail (widget != NULL);
489 g_return_if_fail (GTK_IS_TOOLBAR (widget));
490 g_return_if_fail (requisition != NULL);
492 toolbar = GTK_TOOLBAR (widget);
494 requisition->width = GTK_CONTAINER (toolbar)->border_width * 2;
495 requisition->height = GTK_CONTAINER (toolbar)->border_width * 2;
502 for (children = toolbar->children; children; children = children->next)
504 child = children->data;
508 case GTK_TOOLBAR_CHILD_SPACE:
509 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
510 requisition->width += toolbar->space_size;
512 requisition->height += toolbar->space_size;
516 case GTK_TOOLBAR_CHILD_BUTTON:
517 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
518 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
519 if (GTK_WIDGET_VISIBLE (child->widget))
521 gtk_widget_size_request (child->widget, &child_requisition);
524 button_maxw = MAX (button_maxw, child_requisition.width);
525 button_maxh = MAX (button_maxh, child_requisition.height);
530 case GTK_TOOLBAR_CHILD_WIDGET:
531 if (GTK_WIDGET_VISIBLE (child->widget))
533 gtk_widget_size_request (child->widget, &child_requisition);
535 widget_maxw = MAX (widget_maxw, child_requisition.width);
536 widget_maxh = MAX (widget_maxh, child_requisition.height);
538 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
539 requisition->width += child_requisition.width;
541 requisition->height += child_requisition.height;
547 g_assert_not_reached ();
551 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
553 requisition->width += nbuttons * button_maxw;
554 requisition->height += MAX (button_maxh, widget_maxh);
558 requisition->width += MAX (button_maxw, widget_maxw);
559 requisition->height += nbuttons * button_maxh;
562 toolbar->button_maxw = button_maxw;
563 toolbar->button_maxh = button_maxh;
567 gtk_toolbar_size_allocate (GtkWidget *widget,
568 GtkAllocation *allocation)
572 GtkToolbarChild *child;
573 GtkToolbarChildSpace *child_space;
575 GtkRequisition child_requisition;
578 g_return_if_fail (widget != NULL);
579 g_return_if_fail (GTK_IS_TOOLBAR (widget));
580 g_return_if_fail (allocation != NULL);
582 toolbar = GTK_TOOLBAR (widget);
583 widget->allocation = *allocation;
585 border_width = GTK_CONTAINER (toolbar)->border_width;
587 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
588 alloc.x = allocation->x + border_width;
590 alloc.y = allocation->y + border_width;
592 for (children = toolbar->children; children; children = children->next)
594 child = children->data;
598 case GTK_TOOLBAR_CHILD_SPACE:
600 child_space = (GtkToolbarChildSpace *) child;
602 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
604 child_space->alloc_x = alloc.x;
605 child_space->alloc_y = allocation->y + (allocation->height - toolbar->button_maxh) / 2;
606 alloc.x += toolbar->space_size;
610 child_space->alloc_x = allocation->x + (allocation->width - toolbar->button_maxw) / 2;
611 child_space->alloc_y = alloc.y;
612 alloc.y += toolbar->space_size;
617 case GTK_TOOLBAR_CHILD_BUTTON:
618 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
619 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
620 if (!GTK_WIDGET_VISIBLE (child->widget))
623 alloc.width = toolbar->button_maxw;
624 alloc.height = toolbar->button_maxh;
626 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
627 alloc.y = allocation->y + (allocation->height - toolbar->button_maxh) / 2;
629 alloc.x = allocation->x + (allocation->width - toolbar->button_maxw) / 2;
631 gtk_widget_size_allocate (child->widget, &alloc);
633 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
634 alloc.x += toolbar->button_maxw;
636 alloc.y += toolbar->button_maxh;
640 case GTK_TOOLBAR_CHILD_WIDGET:
641 if (!GTK_WIDGET_VISIBLE (child->widget))
644 gtk_widget_get_child_requisition (child->widget, &child_requisition);
646 alloc.width = child_requisition.width;
647 alloc.height = child_requisition.height;
649 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
650 alloc.y = allocation->y + (allocation->height - child_requisition.height) / 2;
652 alloc.x = allocation->x + (allocation->width - child_requisition.width) / 2;
654 gtk_widget_size_allocate (child->widget, &alloc);
656 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
657 alloc.x += child_requisition.width;
659 alloc.y += child_requisition.height;
664 g_assert_not_reached ();
670 gtk_toolbar_add (GtkContainer *container,
673 g_return_if_fail (container != NULL);
674 g_return_if_fail (GTK_IS_TOOLBAR (container));
675 g_return_if_fail (widget != NULL);
677 gtk_toolbar_append_widget (GTK_TOOLBAR (container), widget, NULL, NULL);
681 gtk_toolbar_remove (GtkContainer *container,
686 GtkToolbarChild *child;
688 g_return_if_fail (container != NULL);
689 g_return_if_fail (GTK_IS_TOOLBAR (container));
690 g_return_if_fail (widget != NULL);
692 toolbar = GTK_TOOLBAR (container);
694 for (children = toolbar->children; children; children = children->next)
696 child = children->data;
698 if ((child->type != GTK_TOOLBAR_CHILD_SPACE) && (child->widget == widget))
700 gboolean was_visible;
702 was_visible = GTK_WIDGET_VISIBLE (widget);
703 gtk_widget_unparent (widget);
705 toolbar->children = g_list_remove_link (toolbar->children, children);
707 g_list_free (children);
708 toolbar->num_children--;
710 if (was_visible && GTK_WIDGET_VISIBLE (container))
711 gtk_widget_queue_resize (GTK_WIDGET (container));
719 gtk_toolbar_forall (GtkContainer *container,
720 gboolean include_internals,
721 GtkCallback callback,
722 gpointer callback_data)
726 GtkToolbarChild *child;
728 g_return_if_fail (container != NULL);
729 g_return_if_fail (GTK_IS_TOOLBAR (container));
730 g_return_if_fail (callback != NULL);
732 toolbar = GTK_TOOLBAR (container);
734 for (children = toolbar->children; children; children = children->next)
736 child = children->data;
738 if (child->type != GTK_TOOLBAR_CHILD_SPACE)
739 (*callback) (child->widget, callback_data);
744 gtk_toolbar_append_item (GtkToolbar *toolbar,
746 const char *tooltip_text,
747 const char *tooltip_private_text,
749 GtkSignalFunc callback,
752 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
754 tooltip_text, tooltip_private_text,
755 icon, callback, user_data,
756 toolbar->num_children);
760 gtk_toolbar_prepend_item (GtkToolbar *toolbar,
762 const char *tooltip_text,
763 const char *tooltip_private_text,
765 GtkSignalFunc callback,
768 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
770 tooltip_text, tooltip_private_text,
771 icon, callback, user_data,
776 gtk_toolbar_insert_item (GtkToolbar *toolbar,
778 const char *tooltip_text,
779 const char *tooltip_private_text,
781 GtkSignalFunc callback,
785 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
787 tooltip_text, tooltip_private_text,
788 icon, callback, user_data,
793 gtk_toolbar_append_space (GtkToolbar *toolbar)
795 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
799 toolbar->num_children);
803 gtk_toolbar_prepend_space (GtkToolbar *toolbar)
805 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
813 gtk_toolbar_insert_space (GtkToolbar *toolbar,
816 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
824 gtk_toolbar_append_widget (GtkToolbar *toolbar,
826 const gchar *tooltip_text,
827 const gchar *tooltip_private_text)
829 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
831 tooltip_text, tooltip_private_text,
833 toolbar->num_children);
837 gtk_toolbar_prepend_widget (GtkToolbar *toolbar,
839 const gchar *tooltip_text,
840 const gchar *tooltip_private_text)
842 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
844 tooltip_text, tooltip_private_text,
850 gtk_toolbar_insert_widget (GtkToolbar *toolbar,
852 const char *tooltip_text,
853 const char *tooltip_private_text,
856 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
858 tooltip_text, tooltip_private_text,
864 gtk_toolbar_append_element (GtkToolbar *toolbar,
865 GtkToolbarChildType type,
868 const char *tooltip_text,
869 const char *tooltip_private_text,
871 GtkSignalFunc callback,
874 return gtk_toolbar_insert_element (toolbar, type, widget, text,
875 tooltip_text, tooltip_private_text,
876 icon, callback, user_data,
877 toolbar->num_children);
881 gtk_toolbar_prepend_element (GtkToolbar *toolbar,
882 GtkToolbarChildType type,
885 const char *tooltip_text,
886 const char *tooltip_private_text,
888 GtkSignalFunc callback,
891 return gtk_toolbar_insert_element (toolbar, type, widget, text,
892 tooltip_text, tooltip_private_text,
893 icon, callback, user_data, 0);
897 gtk_toolbar_insert_element (GtkToolbar *toolbar,
898 GtkToolbarChildType type,
901 const char *tooltip_text,
902 const char *tooltip_private_text,
904 GtkSignalFunc callback,
908 GtkToolbarChild *child;
911 g_return_val_if_fail (toolbar != NULL, NULL);
912 g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
913 if (type == GTK_TOOLBAR_CHILD_WIDGET)
915 g_return_val_if_fail (widget != NULL, NULL);
916 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
918 else if (type != GTK_TOOLBAR_CHILD_RADIOBUTTON)
919 g_return_val_if_fail (widget == NULL, NULL);
921 if (type == GTK_TOOLBAR_CHILD_SPACE)
922 child = (GtkToolbarChild *) g_new (GtkToolbarChildSpace, 1);
924 child = g_new (GtkToolbarChild, 1);
932 case GTK_TOOLBAR_CHILD_SPACE:
933 child->widget = NULL;
934 ((GtkToolbarChildSpace *) child)->alloc_x =
935 ((GtkToolbarChildSpace *) child)->alloc_y = 0;
938 case GTK_TOOLBAR_CHILD_WIDGET:
939 child->widget = widget;
942 case GTK_TOOLBAR_CHILD_BUTTON:
943 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
944 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
945 if (type == GTK_TOOLBAR_CHILD_BUTTON)
947 child->widget = gtk_button_new ();
948 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
950 else if (type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
952 child->widget = gtk_toggle_button_new ();
953 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
954 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget),
959 child->widget = gtk_radio_button_new (widget
960 ? gtk_radio_button_group (GTK_RADIO_BUTTON (widget))
962 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
963 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget), FALSE);
966 GTK_WIDGET_UNSET_FLAGS (child->widget, GTK_CAN_FOCUS);
969 gtk_signal_connect (GTK_OBJECT (child->widget), "clicked",
970 callback, user_data);
972 if (toolbar->style == GTK_TOOLBAR_BOTH_HORIZ)
973 box = gtk_hbox_new (FALSE, 0);
975 box = gtk_vbox_new (FALSE, 0);
976 gtk_container_add (GTK_CONTAINER (child->widget), box);
977 gtk_widget_show (box);
981 child->label = gtk_label_new (text);
982 gtk_box_pack_end (GTK_BOX (box), child->label, FALSE, FALSE, 0);
983 if (toolbar->style != GTK_TOOLBAR_ICONS)
984 gtk_widget_show (child->label);
989 child->icon = GTK_WIDGET (icon);
990 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
991 if (toolbar->style != GTK_TOOLBAR_TEXT)
992 gtk_widget_show (child->icon);
995 gtk_widget_show (child->widget);
999 g_assert_not_reached ();
1002 if ((type != GTK_TOOLBAR_CHILD_SPACE) && tooltip_text)
1003 gtk_tooltips_set_tip (toolbar->tooltips, child->widget,
1004 tooltip_text, tooltip_private_text);
1006 toolbar->children = g_list_insert (toolbar->children, child, position);
1007 toolbar->num_children++;
1009 if (type != GTK_TOOLBAR_CHILD_SPACE)
1011 gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
1013 if (GTK_WIDGET_REALIZED (child->widget->parent))
1014 gtk_widget_realize (child->widget);
1016 if (GTK_WIDGET_VISIBLE (child->widget->parent) && GTK_WIDGET_VISIBLE (child->widget))
1018 if (GTK_WIDGET_MAPPED (child->widget->parent))
1019 gtk_widget_map (child->widget);
1021 gtk_widget_queue_resize (child->widget);
1025 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1027 return child->widget;
1031 gtk_toolbar_set_orientation (GtkToolbar *toolbar,
1032 GtkOrientation orientation)
1034 g_return_if_fail (toolbar != NULL);
1035 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1037 gtk_signal_emit (GTK_OBJECT (toolbar), toolbar_signals[ORIENTATION_CHANGED], orientation);
1041 gtk_toolbar_set_style (GtkToolbar *toolbar,
1042 GtkToolbarStyle style)
1044 g_return_if_fail (toolbar != NULL);
1045 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1047 gtk_signal_emit (GTK_OBJECT (toolbar), toolbar_signals[STYLE_CHANGED], style);
1051 gtk_toolbar_set_space_size (GtkToolbar *toolbar,
1054 g_return_if_fail (toolbar != NULL);
1055 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1057 if (toolbar->space_size != space_size)
1059 toolbar->space_size = space_size;
1060 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1065 gtk_toolbar_set_space_style (GtkToolbar *toolbar,
1066 GtkToolbarSpaceStyle space_style)
1068 g_return_if_fail (toolbar != NULL);
1069 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1071 if (toolbar->space_style != space_style)
1073 toolbar->space_style = space_style;
1074 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1079 gtk_toolbar_set_tooltips (GtkToolbar *toolbar,
1082 g_return_if_fail (toolbar != NULL);
1083 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1086 gtk_tooltips_enable (toolbar->tooltips);
1088 gtk_tooltips_disable (toolbar->tooltips);
1092 gtk_toolbar_set_button_relief (GtkToolbar *toolbar,
1093 GtkReliefStyle relief)
1096 GtkToolbarChild *child;
1098 g_return_if_fail (toolbar != NULL);
1099 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1101 if (toolbar->relief != relief)
1103 toolbar->relief = relief;
1105 for (children = toolbar->children; children; children = children->next)
1107 child = children->data;
1108 if (child->type == GTK_TOOLBAR_CHILD_BUTTON ||
1109 child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON ||
1110 child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
1111 gtk_button_set_relief (GTK_BUTTON (child->widget), relief);
1114 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1119 gtk_toolbar_get_button_relief (GtkToolbar *toolbar)
1121 g_return_val_if_fail (toolbar != NULL, GTK_RELIEF_NORMAL);
1122 g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
1124 return toolbar->relief;
1128 gtk_real_toolbar_orientation_changed (GtkToolbar *toolbar,
1129 GtkOrientation orientation)
1131 g_return_if_fail (toolbar != NULL);
1132 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1134 if (toolbar->orientation != orientation)
1136 toolbar->orientation = orientation;
1137 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1142 gtk_real_toolbar_style_changed (GtkToolbar *toolbar,
1143 GtkToolbarStyle style)
1146 GtkToolbarChild *child;
1147 GtkWidget* box = NULL;
1149 g_return_if_fail (toolbar != NULL);
1150 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1152 if (toolbar->style != style)
1154 toolbar->style = style;
1156 for (children = toolbar->children; children; children = children->next)
1158 child = children->data;
1160 if (child->type == GTK_TOOLBAR_CHILD_BUTTON ||
1161 child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON ||
1162 child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
1165 case GTK_TOOLBAR_ICONS:
1166 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1167 gtk_widget_show (child->icon);
1169 if (child->label && GTK_WIDGET_VISIBLE (child->label))
1170 gtk_widget_hide (child->label);
1174 case GTK_TOOLBAR_TEXT:
1175 if (child->icon && GTK_WIDGET_VISIBLE (child->icon))
1176 gtk_widget_hide (child->icon);
1178 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1179 gtk_widget_show (child->label);
1183 case GTK_TOOLBAR_BOTH:
1184 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1185 gtk_widget_show (child->icon);
1187 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1188 gtk_widget_show (child->label);
1190 box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
1192 if (GTK_IS_HBOX (box))
1196 gtk_object_ref (GTK_OBJECT (child->icon));
1197 gtk_container_remove (GTK_CONTAINER (box),
1202 gtk_object_ref (GTK_OBJECT (child->label));
1203 gtk_container_remove (GTK_CONTAINER (box),
1206 gtk_container_remove (GTK_CONTAINER (child->widget),
1209 box = gtk_vbox_new (FALSE, 0);
1210 gtk_widget_show (box);
1214 gtk_box_pack_end (GTK_BOX (box), child->label, FALSE, FALSE, 0);
1215 gtk_object_unref (GTK_OBJECT (child->label));
1219 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
1220 gtk_object_unref (GTK_OBJECT (child->icon));
1222 gtk_container_add (GTK_CONTAINER (child->widget),
1228 case GTK_TOOLBAR_BOTH_HORIZ:
1229 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1230 gtk_widget_show (child->icon);
1231 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1232 gtk_widget_show (child->label);
1234 box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
1236 if (GTK_IS_VBOX (box))
1240 gtk_object_ref (GTK_OBJECT (child->icon));
1241 gtk_container_remove (GTK_CONTAINER (box),
1246 gtk_object_ref (GTK_OBJECT (child->label));
1247 gtk_container_remove (GTK_CONTAINER (box),
1250 gtk_container_remove (GTK_CONTAINER (child->widget),
1253 box = gtk_hbox_new (FALSE, 0);
1254 gtk_widget_show (box);
1258 gtk_box_pack_end (GTK_BOX (box), child->label, TRUE, TRUE, 0);
1259 gtk_object_unref (GTK_OBJECT (child->label));
1263 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
1264 gtk_object_unref (GTK_OBJECT (child->icon));
1266 gtk_container_add (GTK_CONTAINER (child->widget), box);
1273 g_assert_not_reached ();
1277 gtk_widget_queue_resize (GTK_WIDGET (toolbar));