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 Lesser 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 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser 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-2000. 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 gint gtk_toolbar_expose (GtkWidget *widget,
79 GdkEventExpose *event);
80 static void gtk_toolbar_size_request (GtkWidget *widget,
81 GtkRequisition *requisition);
82 static void gtk_toolbar_size_allocate (GtkWidget *widget,
83 GtkAllocation *allocation);
84 static void gtk_toolbar_add (GtkContainer *container,
86 static void gtk_toolbar_remove (GtkContainer *container,
88 static void gtk_toolbar_forall (GtkContainer *container,
89 gboolean include_internals,
91 gpointer callback_data);
92 static void gtk_real_toolbar_orientation_changed (GtkToolbar *toolbar,
93 GtkOrientation orientation);
94 static void gtk_real_toolbar_style_changed (GtkToolbar *toolbar,
95 GtkToolbarStyle style);
98 static GtkContainerClass *parent_class;
100 static guint toolbar_signals[LAST_SIGNAL] = { 0 };
104 gtk_toolbar_get_type (void)
106 static GtkType toolbar_type = 0;
110 static const GtkTypeInfo toolbar_info =
114 sizeof (GtkToolbarClass),
115 (GtkClassInitFunc) gtk_toolbar_class_init,
116 (GtkObjectInitFunc) gtk_toolbar_init,
117 /* reserved_1 */ NULL,
118 /* reserved_2 */ NULL,
119 (GtkClassInitFunc) NULL,
122 toolbar_type = gtk_type_unique (gtk_container_get_type (), &toolbar_info);
129 gtk_toolbar_class_init (GtkToolbarClass *class)
131 GtkObjectClass *object_class;
132 GtkWidgetClass *widget_class;
133 GtkContainerClass *container_class;
135 object_class = (GtkObjectClass *) class;
136 widget_class = (GtkWidgetClass *) class;
137 container_class = (GtkContainerClass *) class;
139 parent_class = gtk_type_class (gtk_container_get_type ());
141 object_class->destroy = gtk_toolbar_destroy;
142 object_class->set_arg = gtk_toolbar_set_arg;
143 object_class->get_arg = gtk_toolbar_get_arg;
145 widget_class->map = gtk_toolbar_map;
146 widget_class->unmap = gtk_toolbar_unmap;
147 widget_class->expose_event = gtk_toolbar_expose;
148 widget_class->size_request = gtk_toolbar_size_request;
149 widget_class->size_allocate = gtk_toolbar_size_allocate;
151 container_class->add = gtk_toolbar_add;
152 container_class->remove = gtk_toolbar_remove;
153 container_class->forall = gtk_toolbar_forall;
154 container_class->focus = NULL;
156 class->orientation_changed = gtk_real_toolbar_orientation_changed;
157 class->style_changed = gtk_real_toolbar_style_changed;
159 toolbar_signals[ORIENTATION_CHANGED] =
160 gtk_signal_new ("orientation_changed",
162 GTK_CLASS_TYPE (object_class),
163 GTK_SIGNAL_OFFSET (GtkToolbarClass, orientation_changed),
164 gtk_marshal_VOID__INT,
167 toolbar_signals[STYLE_CHANGED] =
168 gtk_signal_new ("style_changed",
170 GTK_CLASS_TYPE (object_class),
171 GTK_SIGNAL_OFFSET (GtkToolbarClass, style_changed),
172 gtk_marshal_VOID__INT,
176 gtk_object_add_arg_type ("GtkToolbar::orientation", GTK_TYPE_ORIENTATION,
177 GTK_ARG_READWRITE, ARG_ORIENTATION);
178 gtk_object_add_arg_type ("GtkToolbar::toolbar_style", GTK_TYPE_TOOLBAR_STYLE,
179 GTK_ARG_READWRITE, ARG_TOOLBAR_STYLE);
180 gtk_object_add_arg_type ("GtkToolbar::space_size", GTK_TYPE_UINT,
181 GTK_ARG_READWRITE, ARG_SPACE_SIZE);
182 gtk_object_add_arg_type ("GtkToolbar::space_style", GTK_TYPE_TOOLBAR_SPACE_STYLE,
183 GTK_ARG_READWRITE, ARG_SPACE_STYLE);
184 gtk_object_add_arg_type ("GtkToolbar::relief", GTK_TYPE_RELIEF_STYLE,
185 GTK_ARG_READWRITE, ARG_RELIEF);
189 gtk_toolbar_init (GtkToolbar *toolbar)
191 GTK_WIDGET_SET_FLAGS (toolbar, GTK_NO_WINDOW);
192 GTK_WIDGET_UNSET_FLAGS (toolbar, GTK_CAN_FOCUS);
194 toolbar->num_children = 0;
195 toolbar->children = NULL;
196 toolbar->orientation = GTK_ORIENTATION_HORIZONTAL;
197 toolbar->style = GTK_TOOLBAR_ICONS;
198 toolbar->relief = GTK_RELIEF_NORMAL;
199 toolbar->space_size = DEFAULT_SPACE_SIZE;
200 toolbar->space_style = DEFAULT_SPACE_STYLE;
201 toolbar->tooltips = gtk_tooltips_new ();
202 toolbar->button_maxw = 0;
203 toolbar->button_maxh = 0;
207 gtk_toolbar_set_arg (GtkObject *object,
211 GtkToolbar *toolbar = GTK_TOOLBAR (object);
215 case ARG_ORIENTATION:
216 gtk_toolbar_set_orientation (toolbar, GTK_VALUE_ENUM (*arg));
218 case ARG_TOOLBAR_STYLE:
219 gtk_toolbar_set_style (toolbar, GTK_VALUE_ENUM (*arg));
222 gtk_toolbar_set_space_size (toolbar, GTK_VALUE_UINT (*arg));
224 case ARG_SPACE_STYLE:
225 gtk_toolbar_set_space_style (toolbar, GTK_VALUE_ENUM (*arg));
228 gtk_toolbar_set_button_relief (toolbar, GTK_VALUE_ENUM (*arg));
234 gtk_toolbar_get_arg (GtkObject *object,
238 GtkToolbar *toolbar = GTK_TOOLBAR (object);
242 case ARG_ORIENTATION:
243 GTK_VALUE_ENUM (*arg) = toolbar->orientation;
245 case ARG_TOOLBAR_STYLE:
246 GTK_VALUE_ENUM (*arg) = toolbar->style;
249 GTK_VALUE_UINT (*arg) = toolbar->space_size;
251 case ARG_SPACE_STYLE:
252 GTK_VALUE_ENUM (*arg) = toolbar->space_style;
255 GTK_VALUE_ENUM (*arg) = toolbar->relief;
258 arg->type = GTK_TYPE_INVALID;
264 gtk_toolbar_new (GtkOrientation orientation,
265 GtkToolbarStyle style)
269 toolbar = gtk_type_new (gtk_toolbar_get_type ());
271 toolbar->orientation = orientation;
272 toolbar->style = style;
274 return GTK_WIDGET (toolbar);
278 gtk_toolbar_destroy (GtkObject *object)
283 g_return_if_fail (object != NULL);
284 g_return_if_fail (GTK_IS_TOOLBAR (object));
286 toolbar = GTK_TOOLBAR (object);
288 if (toolbar->tooltips)
290 gtk_object_unref (GTK_OBJECT (toolbar->tooltips));
291 toolbar->tooltips = NULL;
294 for (children = toolbar->children; children; children = children->next)
296 GtkToolbarChild *child;
298 child = children->data;
300 if (child->type != GTK_TOOLBAR_CHILD_SPACE)
302 gtk_widget_ref (child->widget);
303 gtk_widget_unparent (child->widget);
304 gtk_widget_destroy (child->widget);
305 gtk_widget_unref (child->widget);
310 g_list_free (toolbar->children);
311 toolbar->children = NULL;
313 GTK_OBJECT_CLASS (parent_class)->destroy (object);
317 gtk_toolbar_map (GtkWidget *widget)
321 GtkToolbarChild *child;
323 g_return_if_fail (widget != NULL);
324 g_return_if_fail (GTK_IS_TOOLBAR (widget));
326 toolbar = GTK_TOOLBAR (widget);
327 GTK_WIDGET_SET_FLAGS (toolbar, GTK_MAPPED);
329 for (children = toolbar->children; children; children = children->next)
331 child = children->data;
333 if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
334 && GTK_WIDGET_VISIBLE (child->widget) && !GTK_WIDGET_MAPPED (child->widget))
335 gtk_widget_map (child->widget);
340 gtk_toolbar_unmap (GtkWidget *widget)
344 GtkToolbarChild *child;
346 g_return_if_fail (widget != NULL);
347 g_return_if_fail (GTK_IS_TOOLBAR (widget));
349 toolbar = GTK_TOOLBAR (widget);
350 GTK_WIDGET_UNSET_FLAGS (toolbar, GTK_MAPPED);
352 for (children = toolbar->children; children; children = children->next)
354 child = children->data;
356 if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
357 && GTK_WIDGET_VISIBLE (child->widget) && GTK_WIDGET_MAPPED (child->widget))
358 gtk_widget_unmap (child->widget);
363 gtk_toolbar_paint_space_line (GtkWidget *widget,
365 GtkToolbarChild *child)
368 GtkToolbarChildSpace *child_space;
370 g_return_if_fail (widget != NULL);
371 g_return_if_fail (GTK_IS_TOOLBAR (widget));
372 g_return_if_fail (child != NULL);
373 g_return_if_fail (child->type == GTK_TOOLBAR_CHILD_SPACE);
375 toolbar = GTK_TOOLBAR (widget);
377 child_space = (GtkToolbarChildSpace *) child;
379 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
380 gtk_paint_vline (widget->style, widget->window,
381 GTK_WIDGET_STATE (widget), area, widget,
383 child_space->alloc_y + toolbar->button_maxh *
384 SPACE_LINE_START / SPACE_LINE_DIVISION,
385 child_space->alloc_y + toolbar->button_maxh *
386 SPACE_LINE_END / SPACE_LINE_DIVISION,
387 child_space->alloc_x +
388 (toolbar->space_size -
389 widget->style->xthickness) / 2);
391 gtk_paint_hline (widget->style, widget->window,
392 GTK_WIDGET_STATE (widget), area, widget,
394 child_space->alloc_x + toolbar->button_maxw *
395 SPACE_LINE_START / SPACE_LINE_DIVISION,
396 child_space->alloc_x + toolbar->button_maxw *
397 SPACE_LINE_END / SPACE_LINE_DIVISION,
398 child_space->alloc_y +
399 (toolbar->space_size -
400 widget->style->ythickness) / 2);
404 gtk_toolbar_expose (GtkWidget *widget,
405 GdkEventExpose *event)
409 GtkToolbarChild *child;
411 g_return_val_if_fail (widget != NULL, FALSE);
412 g_return_val_if_fail (GTK_IS_TOOLBAR (widget), FALSE);
413 g_return_val_if_fail (event != NULL, FALSE);
415 if (GTK_WIDGET_DRAWABLE (widget))
417 toolbar = GTK_TOOLBAR (widget);
419 for (children = toolbar->children; children; children = children->next)
421 child = children->data;
423 if (child->type == GTK_TOOLBAR_CHILD_SPACE)
425 if (toolbar->space_style == GTK_TOOLBAR_SPACE_LINE)
426 gtk_toolbar_paint_space_line (widget, &event->area, child);
429 gtk_container_propagate_expose (GTK_CONTAINER (widget),
439 gtk_toolbar_size_request (GtkWidget *widget,
440 GtkRequisition *requisition)
444 GtkToolbarChild *child;
446 gint button_maxw, button_maxh;
447 gint widget_maxw, widget_maxh;
448 GtkRequisition child_requisition;
450 g_return_if_fail (widget != NULL);
451 g_return_if_fail (GTK_IS_TOOLBAR (widget));
452 g_return_if_fail (requisition != NULL);
454 toolbar = GTK_TOOLBAR (widget);
456 requisition->width = GTK_CONTAINER (toolbar)->border_width * 2;
457 requisition->height = GTK_CONTAINER (toolbar)->border_width * 2;
464 for (children = toolbar->children; children; children = children->next)
466 child = children->data;
470 case GTK_TOOLBAR_CHILD_SPACE:
471 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
472 requisition->width += toolbar->space_size;
474 requisition->height += toolbar->space_size;
478 case GTK_TOOLBAR_CHILD_BUTTON:
479 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
480 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
481 if (GTK_WIDGET_VISIBLE (child->widget))
483 gtk_widget_size_request (child->widget, &child_requisition);
486 button_maxw = MAX (button_maxw, child_requisition.width);
487 button_maxh = MAX (button_maxh, child_requisition.height);
492 case GTK_TOOLBAR_CHILD_WIDGET:
493 if (GTK_WIDGET_VISIBLE (child->widget))
495 gtk_widget_size_request (child->widget, &child_requisition);
497 widget_maxw = MAX (widget_maxw, child_requisition.width);
498 widget_maxh = MAX (widget_maxh, child_requisition.height);
500 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
501 requisition->width += child_requisition.width;
503 requisition->height += child_requisition.height;
509 g_assert_not_reached ();
513 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
515 requisition->width += nbuttons * button_maxw;
516 requisition->height += MAX (button_maxh, widget_maxh);
520 requisition->width += MAX (button_maxw, widget_maxw);
521 requisition->height += nbuttons * button_maxh;
524 toolbar->button_maxw = button_maxw;
525 toolbar->button_maxh = button_maxh;
529 gtk_toolbar_size_allocate (GtkWidget *widget,
530 GtkAllocation *allocation)
534 GtkToolbarChild *child;
535 GtkToolbarChildSpace *child_space;
537 GtkRequisition child_requisition;
540 g_return_if_fail (widget != NULL);
541 g_return_if_fail (GTK_IS_TOOLBAR (widget));
542 g_return_if_fail (allocation != NULL);
544 toolbar = GTK_TOOLBAR (widget);
545 widget->allocation = *allocation;
547 border_width = GTK_CONTAINER (toolbar)->border_width;
549 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
550 alloc.x = allocation->x + border_width;
552 alloc.y = allocation->y + border_width;
554 for (children = toolbar->children; children; children = children->next)
556 child = children->data;
560 case GTK_TOOLBAR_CHILD_SPACE:
562 child_space = (GtkToolbarChildSpace *) child;
564 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
566 child_space->alloc_x = alloc.x;
567 child_space->alloc_y = allocation->y + (allocation->height - toolbar->button_maxh) / 2;
568 alloc.x += toolbar->space_size;
572 child_space->alloc_x = allocation->x + (allocation->width - toolbar->button_maxw) / 2;
573 child_space->alloc_y = alloc.y;
574 alloc.y += toolbar->space_size;
579 case GTK_TOOLBAR_CHILD_BUTTON:
580 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
581 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
582 if (!GTK_WIDGET_VISIBLE (child->widget))
585 alloc.width = toolbar->button_maxw;
586 alloc.height = toolbar->button_maxh;
588 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
589 alloc.y = allocation->y + (allocation->height - toolbar->button_maxh) / 2;
591 alloc.x = allocation->x + (allocation->width - toolbar->button_maxw) / 2;
593 gtk_widget_size_allocate (child->widget, &alloc);
595 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
596 alloc.x += toolbar->button_maxw;
598 alloc.y += toolbar->button_maxh;
602 case GTK_TOOLBAR_CHILD_WIDGET:
603 if (!GTK_WIDGET_VISIBLE (child->widget))
606 gtk_widget_get_child_requisition (child->widget, &child_requisition);
608 alloc.width = child_requisition.width;
609 alloc.height = child_requisition.height;
611 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
612 alloc.y = allocation->y + (allocation->height - child_requisition.height) / 2;
614 alloc.x = allocation->x + (allocation->width - child_requisition.width) / 2;
616 gtk_widget_size_allocate (child->widget, &alloc);
618 if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
619 alloc.x += child_requisition.width;
621 alloc.y += child_requisition.height;
626 g_assert_not_reached ();
632 gtk_toolbar_add (GtkContainer *container,
635 g_return_if_fail (container != NULL);
636 g_return_if_fail (GTK_IS_TOOLBAR (container));
637 g_return_if_fail (widget != NULL);
639 gtk_toolbar_append_widget (GTK_TOOLBAR (container), widget, NULL, NULL);
643 gtk_toolbar_remove (GtkContainer *container,
648 GtkToolbarChild *child;
650 g_return_if_fail (container != NULL);
651 g_return_if_fail (GTK_IS_TOOLBAR (container));
652 g_return_if_fail (widget != NULL);
654 toolbar = GTK_TOOLBAR (container);
656 for (children = toolbar->children; children; children = children->next)
658 child = children->data;
660 if ((child->type != GTK_TOOLBAR_CHILD_SPACE) && (child->widget == widget))
662 gboolean was_visible;
664 was_visible = GTK_WIDGET_VISIBLE (widget);
665 gtk_widget_unparent (widget);
667 toolbar->children = g_list_remove_link (toolbar->children, children);
669 g_list_free (children);
670 toolbar->num_children--;
672 if (was_visible && GTK_WIDGET_VISIBLE (container))
673 gtk_widget_queue_resize (GTK_WIDGET (container));
681 gtk_toolbar_forall (GtkContainer *container,
682 gboolean include_internals,
683 GtkCallback callback,
684 gpointer callback_data)
688 GtkToolbarChild *child;
690 g_return_if_fail (container != NULL);
691 g_return_if_fail (GTK_IS_TOOLBAR (container));
692 g_return_if_fail (callback != NULL);
694 toolbar = GTK_TOOLBAR (container);
696 for (children = toolbar->children; children; children = children->next)
698 child = children->data;
700 if (child->type != GTK_TOOLBAR_CHILD_SPACE)
701 (*callback) (child->widget, callback_data);
706 gtk_toolbar_append_item (GtkToolbar *toolbar,
708 const char *tooltip_text,
709 const char *tooltip_private_text,
711 GtkSignalFunc callback,
714 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
716 tooltip_text, tooltip_private_text,
717 icon, callback, user_data,
718 toolbar->num_children);
722 gtk_toolbar_prepend_item (GtkToolbar *toolbar,
724 const char *tooltip_text,
725 const char *tooltip_private_text,
727 GtkSignalFunc callback,
730 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
732 tooltip_text, tooltip_private_text,
733 icon, callback, user_data,
738 gtk_toolbar_insert_item (GtkToolbar *toolbar,
740 const char *tooltip_text,
741 const char *tooltip_private_text,
743 GtkSignalFunc callback,
747 return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
749 tooltip_text, tooltip_private_text,
750 icon, callback, user_data,
755 gtk_toolbar_append_space (GtkToolbar *toolbar)
757 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
761 toolbar->num_children);
765 gtk_toolbar_prepend_space (GtkToolbar *toolbar)
767 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
775 gtk_toolbar_insert_space (GtkToolbar *toolbar,
778 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
786 gtk_toolbar_append_widget (GtkToolbar *toolbar,
788 const gchar *tooltip_text,
789 const gchar *tooltip_private_text)
791 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
793 tooltip_text, tooltip_private_text,
795 toolbar->num_children);
799 gtk_toolbar_prepend_widget (GtkToolbar *toolbar,
801 const gchar *tooltip_text,
802 const gchar *tooltip_private_text)
804 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
806 tooltip_text, tooltip_private_text,
812 gtk_toolbar_insert_widget (GtkToolbar *toolbar,
814 const char *tooltip_text,
815 const char *tooltip_private_text,
818 gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
820 tooltip_text, tooltip_private_text,
826 gtk_toolbar_append_element (GtkToolbar *toolbar,
827 GtkToolbarChildType type,
830 const char *tooltip_text,
831 const char *tooltip_private_text,
833 GtkSignalFunc callback,
836 return gtk_toolbar_insert_element (toolbar, type, widget, text,
837 tooltip_text, tooltip_private_text,
838 icon, callback, user_data,
839 toolbar->num_children);
843 gtk_toolbar_prepend_element (GtkToolbar *toolbar,
844 GtkToolbarChildType type,
847 const char *tooltip_text,
848 const char *tooltip_private_text,
850 GtkSignalFunc callback,
853 return gtk_toolbar_insert_element (toolbar, type, widget, text,
854 tooltip_text, tooltip_private_text,
855 icon, callback, user_data, 0);
859 gtk_toolbar_insert_element (GtkToolbar *toolbar,
860 GtkToolbarChildType type,
863 const char *tooltip_text,
864 const char *tooltip_private_text,
866 GtkSignalFunc callback,
870 GtkToolbarChild *child;
873 g_return_val_if_fail (toolbar != NULL, NULL);
874 g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
875 if (type == GTK_TOOLBAR_CHILD_WIDGET)
877 g_return_val_if_fail (widget != NULL, NULL);
878 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
880 else if (type != GTK_TOOLBAR_CHILD_RADIOBUTTON)
881 g_return_val_if_fail (widget == NULL, NULL);
883 if (type == GTK_TOOLBAR_CHILD_SPACE)
884 child = (GtkToolbarChild *) g_new (GtkToolbarChildSpace, 1);
886 child = g_new (GtkToolbarChild, 1);
894 case GTK_TOOLBAR_CHILD_SPACE:
895 child->widget = NULL;
896 ((GtkToolbarChildSpace *) child)->alloc_x =
897 ((GtkToolbarChildSpace *) child)->alloc_y = 0;
900 case GTK_TOOLBAR_CHILD_WIDGET:
901 child->widget = widget;
904 case GTK_TOOLBAR_CHILD_BUTTON:
905 case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
906 case GTK_TOOLBAR_CHILD_RADIOBUTTON:
907 if (type == GTK_TOOLBAR_CHILD_BUTTON)
909 child->widget = gtk_button_new ();
910 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
912 else if (type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
914 child->widget = gtk_toggle_button_new ();
915 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
916 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget),
921 child->widget = gtk_radio_button_new (widget
922 ? gtk_radio_button_group (GTK_RADIO_BUTTON (widget))
924 gtk_button_set_relief (GTK_BUTTON (child->widget), toolbar->relief);
925 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget), FALSE);
928 GTK_WIDGET_UNSET_FLAGS (child->widget, GTK_CAN_FOCUS);
931 gtk_signal_connect (GTK_OBJECT (child->widget), "clicked",
932 callback, user_data);
934 if (toolbar->style == GTK_TOOLBAR_BOTH_HORIZ)
935 box = gtk_hbox_new (FALSE, 0);
937 box = gtk_vbox_new (FALSE, 0);
938 gtk_container_add (GTK_CONTAINER (child->widget), box);
939 gtk_widget_show (box);
943 child->label = gtk_label_new (text);
944 gtk_box_pack_end (GTK_BOX (box), child->label, FALSE, FALSE, 0);
945 if (toolbar->style != GTK_TOOLBAR_ICONS)
946 gtk_widget_show (child->label);
951 child->icon = GTK_WIDGET (icon);
952 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
953 if (toolbar->style != GTK_TOOLBAR_TEXT)
954 gtk_widget_show (child->icon);
957 gtk_widget_show (child->widget);
961 g_assert_not_reached ();
964 if ((type != GTK_TOOLBAR_CHILD_SPACE) && tooltip_text)
965 gtk_tooltips_set_tip (toolbar->tooltips, child->widget,
966 tooltip_text, tooltip_private_text);
968 toolbar->children = g_list_insert (toolbar->children, child, position);
969 toolbar->num_children++;
971 if (type != GTK_TOOLBAR_CHILD_SPACE)
973 gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
975 if (GTK_WIDGET_REALIZED (child->widget->parent))
976 gtk_widget_realize (child->widget);
978 if (GTK_WIDGET_VISIBLE (child->widget->parent) && GTK_WIDGET_VISIBLE (child->widget))
980 if (GTK_WIDGET_MAPPED (child->widget->parent))
981 gtk_widget_map (child->widget);
983 gtk_widget_queue_resize (child->widget);
987 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
989 return child->widget;
993 gtk_toolbar_set_orientation (GtkToolbar *toolbar,
994 GtkOrientation orientation)
996 g_return_if_fail (toolbar != NULL);
997 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
999 gtk_signal_emit (GTK_OBJECT (toolbar), toolbar_signals[ORIENTATION_CHANGED], orientation);
1003 gtk_toolbar_set_style (GtkToolbar *toolbar,
1004 GtkToolbarStyle style)
1006 g_return_if_fail (toolbar != NULL);
1007 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1009 gtk_signal_emit (GTK_OBJECT (toolbar), toolbar_signals[STYLE_CHANGED], style);
1013 gtk_toolbar_set_space_size (GtkToolbar *toolbar,
1016 g_return_if_fail (toolbar != NULL);
1017 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1019 if (toolbar->space_size != space_size)
1021 toolbar->space_size = space_size;
1022 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1027 gtk_toolbar_set_space_style (GtkToolbar *toolbar,
1028 GtkToolbarSpaceStyle space_style)
1030 g_return_if_fail (toolbar != NULL);
1031 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1033 if (toolbar->space_style != space_style)
1035 toolbar->space_style = space_style;
1036 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1041 gtk_toolbar_set_tooltips (GtkToolbar *toolbar,
1044 g_return_if_fail (toolbar != NULL);
1045 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1048 gtk_tooltips_enable (toolbar->tooltips);
1050 gtk_tooltips_disable (toolbar->tooltips);
1054 gtk_toolbar_set_button_relief (GtkToolbar *toolbar,
1055 GtkReliefStyle relief)
1058 GtkToolbarChild *child;
1060 g_return_if_fail (toolbar != NULL);
1061 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1063 if (toolbar->relief != relief)
1065 toolbar->relief = relief;
1067 for (children = toolbar->children; children; children = children->next)
1069 child = children->data;
1070 if (child->type == GTK_TOOLBAR_CHILD_BUTTON ||
1071 child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON ||
1072 child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
1073 gtk_button_set_relief (GTK_BUTTON (child->widget), relief);
1076 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1081 gtk_toolbar_get_button_relief (GtkToolbar *toolbar)
1083 g_return_val_if_fail (toolbar != NULL, GTK_RELIEF_NORMAL);
1084 g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
1086 return toolbar->relief;
1090 gtk_real_toolbar_orientation_changed (GtkToolbar *toolbar,
1091 GtkOrientation orientation)
1093 g_return_if_fail (toolbar != NULL);
1094 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1096 if (toolbar->orientation != orientation)
1098 toolbar->orientation = orientation;
1099 gtk_widget_queue_resize (GTK_WIDGET (toolbar));
1104 gtk_real_toolbar_style_changed (GtkToolbar *toolbar,
1105 GtkToolbarStyle style)
1108 GtkToolbarChild *child;
1109 GtkWidget* box = NULL;
1111 g_return_if_fail (toolbar != NULL);
1112 g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
1114 if (toolbar->style != style)
1116 toolbar->style = style;
1118 for (children = toolbar->children; children; children = children->next)
1120 child = children->data;
1122 if (child->type == GTK_TOOLBAR_CHILD_BUTTON ||
1123 child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON ||
1124 child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
1127 case GTK_TOOLBAR_ICONS:
1128 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1129 gtk_widget_show (child->icon);
1131 if (child->label && GTK_WIDGET_VISIBLE (child->label))
1132 gtk_widget_hide (child->label);
1136 case GTK_TOOLBAR_TEXT:
1137 if (child->icon && GTK_WIDGET_VISIBLE (child->icon))
1138 gtk_widget_hide (child->icon);
1140 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1141 gtk_widget_show (child->label);
1145 case GTK_TOOLBAR_BOTH:
1146 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1147 gtk_widget_show (child->icon);
1149 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1150 gtk_widget_show (child->label);
1152 box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
1154 if (GTK_IS_HBOX (box))
1158 gtk_object_ref (GTK_OBJECT (child->icon));
1159 gtk_container_remove (GTK_CONTAINER (box),
1164 gtk_object_ref (GTK_OBJECT (child->label));
1165 gtk_container_remove (GTK_CONTAINER (box),
1168 gtk_container_remove (GTK_CONTAINER (child->widget),
1171 box = gtk_vbox_new (FALSE, 0);
1172 gtk_widget_show (box);
1176 gtk_box_pack_end (GTK_BOX (box), child->label, FALSE, FALSE, 0);
1177 gtk_object_unref (GTK_OBJECT (child->label));
1181 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
1182 gtk_object_unref (GTK_OBJECT (child->icon));
1184 gtk_container_add (GTK_CONTAINER (child->widget),
1190 case GTK_TOOLBAR_BOTH_HORIZ:
1191 if (child->icon && !GTK_WIDGET_VISIBLE (child->icon))
1192 gtk_widget_show (child->icon);
1193 if (child->label && !GTK_WIDGET_VISIBLE (child->label))
1194 gtk_widget_show (child->label);
1196 box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
1198 if (GTK_IS_VBOX (box))
1202 gtk_object_ref (GTK_OBJECT (child->icon));
1203 gtk_container_remove (GTK_CONTAINER (box),
1208 gtk_object_ref (GTK_OBJECT (child->label));
1209 gtk_container_remove (GTK_CONTAINER (box),
1212 gtk_container_remove (GTK_CONTAINER (child->widget),
1215 box = gtk_hbox_new (FALSE, 0);
1216 gtk_widget_show (box);
1220 gtk_box_pack_end (GTK_BOX (box), child->label, TRUE, TRUE, 0);
1221 gtk_object_unref (GTK_OBJECT (child->label));
1225 gtk_box_pack_end (GTK_BOX (box), child->icon, FALSE, FALSE, 0);
1226 gtk_object_unref (GTK_OBJECT (child->icon));
1228 gtk_container_add (GTK_CONTAINER (child->widget), box);
1235 g_assert_not_reached ();
1239 gtk_widget_queue_resize (GTK_WIDGET (toolbar));