*/
#include "gtkbutton.h"
+#include "gtktogglebutton.h"
+#include "gtkradiobutton.h"
#include "gtklabel.h"
#include "gtkvbox.h"
#include "gtktoolbar.h"
static GtkContainerClass *parent_class;
-static gint toolbar_signals[LAST_SIGNAL] = { 0 };
+static guint toolbar_signals[LAST_SIGNAL] = { 0 };
guint
gtk_toolbar_destroy (GtkObject *object)
{
GtkToolbar *toolbar;
- GList *children;
- GtkToolbarChild *child;
+ GList *children;
g_return_if_fail (object != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (object));
toolbar = GTK_TOOLBAR (object);
- gtk_tooltips_unref (toolbar->tooltips);
+ gtk_object_unref (GTK_OBJECT (toolbar->tooltips));
+ toolbar->tooltips = NULL;
for (children = toolbar->children; children; children = children->next)
{
+ GtkToolbarChild *child;
+
child = children->data;
if (child->type != GTK_TOOLBAR_CHILD_SPACE)
{
- child->widget->parent = NULL;
- gtk_object_unref (GTK_OBJECT (child->widget));
+ gtk_widget_ref (child->widget);
+ gtk_widget_unparent (child->widget);
gtk_widget_destroy (child->widget);
+ gtk_widget_unref (child->widget);
}
g_free (child);
}
g_list_free (toolbar->children);
-
+ toolbar->children = NULL;
+
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
gtk_toolbar_map (GtkWidget *widget)
{
GtkToolbar *toolbar;
- GList *children;
- GtkToolbarChild *child;
+ GList *children;
+ GtkToolbarChild *child;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (widget));
gtk_toolbar_unmap (GtkWidget *widget)
{
GtkToolbar *toolbar;
- GList *children;
- GtkToolbarChild *child;
+ GList *children;
+ GtkToolbarChild *child;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (widget));
gtk_toolbar_draw (GtkWidget *widget,
GdkRectangle *area)
{
- GtkToolbar *toolbar;
- GList *children;
- GtkToolbarChild *child;
- GdkRectangle child_area;
+ GtkToolbar *toolbar;
+ GList *children;
+ GtkToolbarChild *child;
+ GdkRectangle child_area;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (widget));
gtk_toolbar_expose (GtkWidget *widget,
GdkEventExpose *event)
{
- GtkToolbar *toolbar;
- GList *children;
- GtkToolbarChild *child;
- GdkEventExpose child_event;
+ GtkToolbar *toolbar;
+ GList *children;
+ GtkToolbarChild *child;
+ GdkEventExpose child_event;
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_TOOLBAR (widget), FALSE);
GtkRequisition *requisition)
{
GtkToolbar *toolbar;
- GList *children;
- GtkToolbarChild *child;
- gint nbuttons;
- gint button_maxw, button_maxh;
- gint widget_maxw, widget_maxh;
+ GList *children;
+ GtkToolbarChild *child;
+ gint nbuttons;
+ gint button_maxw, button_maxh;
+ gint widget_maxw, widget_maxh;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (widget));
break;
case GTK_TOOLBAR_CHILD_BUTTON:
+ case GTK_TOOLBAR_CHILD_RADIOBUTTON:
+ case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
if (GTK_WIDGET_VISIBLE (child->widget))
{
gtk_widget_size_request (child->widget, &child->widget->requisition);
gtk_toolbar_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
- GtkToolbar *toolbar;
- GList *children;
- GtkToolbarChild *child;
- GtkAllocation alloc;
- gint border_width;
+ GtkToolbar *toolbar;
+ GList *children;
+ GtkToolbarChild *child;
+ GtkAllocation alloc;
+ gint border_width;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (widget));
break;
case GTK_TOOLBAR_CHILD_BUTTON:
+ case GTK_TOOLBAR_CHILD_RADIOBUTTON:
+ case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
+ if (!GTK_WIDGET_VISIBLE (child->widget))
+ break;
+
alloc.width = toolbar->button_maxw;
alloc.height = toolbar->button_maxh;
break;
case GTK_TOOLBAR_CHILD_WIDGET:
+ if (!GTK_WIDGET_VISIBLE (child->widget))
+ break;
+
alloc.width = child->widget->requisition.width;
alloc.height = child->widget->requisition.height;
g_return_if_fail (GTK_IS_TOOLBAR (container));
g_return_if_fail (widget != NULL);
- gtk_toolbar_append_widget (GTK_TOOLBAR (container), widget, NULL);
+ gtk_toolbar_append_widget (GTK_TOOLBAR (container), widget, NULL, NULL);
}
static void
GtkWidget *widget)
{
GtkToolbar *toolbar;
- GList *children;
- GtkToolbarChild *child;
+ GList *children;
+ GtkToolbarChild *child;
g_return_if_fail (container != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (container));
if ((child->type != GTK_TOOLBAR_CHILD_SPACE) && (child->widget == widget))
{
+ gboolean was_visible;
+
+ was_visible = GTK_WIDGET_VISIBLE (widget);
gtk_widget_unparent (widget);
toolbar->children = g_list_remove_link (toolbar->children, children);
g_list_free (children);
toolbar->num_children--;
- if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (container))
+ if (was_visible && GTK_WIDGET_VISIBLE (container))
gtk_widget_queue_resize (GTK_WIDGET (container));
break;
gpointer callback_data)
{
GtkToolbar *toolbar;
- GList *children;
- GtkToolbarChild *child;
+ GList *children;
+ GtkToolbarChild *child;
g_return_if_fail (container != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (container));
gtk_toolbar_append_item (GtkToolbar *toolbar,
const char *text,
const char *tooltip_text,
+ const char *tooltip_private_text,
GtkWidget *icon,
GtkSignalFunc callback,
gpointer user_data)
{
- return gtk_toolbar_insert_item (toolbar, text, tooltip_text, icon,
- callback, user_data, toolbar->num_children);
+ return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
+ NULL, text,
+ tooltip_text, tooltip_private_text,
+ icon, callback, user_data,
+ toolbar->num_children);
}
GtkWidget *
gtk_toolbar_prepend_item (GtkToolbar *toolbar,
const char *text,
const char *tooltip_text,
+ const char *tooltip_private_text,
GtkWidget *icon,
GtkSignalFunc callback,
gpointer user_data)
{
- return gtk_toolbar_insert_item (toolbar, text, tooltip_text, icon,
- callback, user_data, 0);
+ return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
+ NULL, text,
+ tooltip_text, tooltip_private_text,
+ icon, callback, user_data,
+ 0);
}
GtkWidget *
gtk_toolbar_insert_item (GtkToolbar *toolbar,
const char *text,
const char *tooltip_text,
+ const char *tooltip_private_text,
GtkWidget *icon,
GtkSignalFunc callback,
gpointer user_data,
gint position)
{
- GtkToolbarChild *child;
- GtkWidget *vbox;
-
- g_return_val_if_fail (toolbar != NULL, NULL);
- g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
-
- child = g_new (GtkToolbarChild, 1);
-
- child->type = GTK_TOOLBAR_CHILD_BUTTON;
- child->widget = gtk_button_new ();
-
- if (callback)
- gtk_signal_connect (GTK_OBJECT (child->widget), "clicked",
- callback, user_data);
-
- if (tooltip_text)
- gtk_tooltips_set_tips (toolbar->tooltips, child->widget, tooltip_text);
-
- if (text)
- child->label = gtk_label_new (text);
- else
- child->label = NULL;
-
- if (icon)
- child->icon = GTK_WIDGET (icon);
- else
- child->icon = NULL;
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_add (GTK_CONTAINER (child->widget), vbox);
- gtk_widget_show (vbox);
-
- if (child->icon)
- gtk_box_pack_start (GTK_BOX (vbox), child->icon, FALSE, FALSE, 0);
-
- if (child->label)
- gtk_box_pack_start (GTK_BOX (vbox), child->label, FALSE, FALSE, 0);
-
- switch (toolbar->style)
- {
- case GTK_TOOLBAR_ICONS:
- if (child->icon)
- gtk_widget_show (child->icon);
- break;
-
- case GTK_TOOLBAR_TEXT:
- if (child->label)
- gtk_widget_show (child->label);
- break;
-
- case GTK_TOOLBAR_BOTH:
- if (child->icon)
- gtk_widget_show (child->icon);
-
- if (child->label)
- gtk_widget_show (child->label);
-
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- gtk_widget_show (child->widget);
-
- toolbar->children = g_list_insert (toolbar->children, child, position);
- toolbar->num_children++;
-
- gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
-
- if (GTK_WIDGET_VISIBLE (toolbar))
- {
- if (GTK_WIDGET_REALIZED (toolbar)
- && !GTK_WIDGET_REALIZED (child->widget))
- gtk_widget_realize (child->widget);
-
- if (GTK_WIDGET_MAPPED (toolbar)
- && !GTK_WIDGET_MAPPED (child->widget))
- gtk_widget_map (child->widget);
- }
-
- if (GTK_WIDGET_VISIBLE (child->widget) && GTK_WIDGET_VISIBLE (toolbar))
- gtk_widget_queue_resize (child->widget);
-
- return child->widget;
+ return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
+ NULL, text,
+ tooltip_text, tooltip_private_text,
+ icon, callback, user_data,
+ position);
}
void
gtk_toolbar_append_space (GtkToolbar *toolbar)
{
- gtk_toolbar_insert_space (toolbar, toolbar->num_children);
+ gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
+ NULL, NULL,
+ NULL, NULL,
+ NULL, NULL, NULL,
+ toolbar->num_children);
}
void
gtk_toolbar_prepend_space (GtkToolbar *toolbar)
{
- gtk_toolbar_insert_space (toolbar, 0);
+ gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
+ NULL, NULL,
+ NULL, NULL,
+ NULL, NULL, NULL,
+ 0);
}
void
gtk_toolbar_insert_space (GtkToolbar *toolbar,
gint position)
{
- GtkToolbarChild *child;
-
- g_return_if_fail (toolbar != NULL);
- g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
-
- child = g_new (GtkToolbarChild, 1);
- child->type = GTK_TOOLBAR_CHILD_SPACE;
- child->widget = NULL;
- child->icon = NULL;
- child->label = NULL;
-
- toolbar->children = g_list_insert (toolbar->children, child, position);
- toolbar->num_children++;
-
- if (GTK_WIDGET_VISIBLE (toolbar))
- gtk_widget_queue_resize (GTK_WIDGET (toolbar));
+ gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
+ NULL, NULL,
+ NULL, NULL,
+ NULL, NULL, NULL,
+ position);
}
void
-gtk_toolbar_append_widget (GtkToolbar *toolbar,
- GtkWidget *widget,
- const char *tooltip_text)
+gtk_toolbar_append_widget (GtkToolbar *toolbar,
+ GtkWidget *widget,
+ const gchar *tooltip_text,
+ const gchar *tooltip_private_text)
{
- gtk_toolbar_insert_widget (toolbar, widget, tooltip_text, toolbar->num_children);
+ gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
+ widget, NULL,
+ tooltip_text, tooltip_private_text,
+ NULL, NULL, NULL,
+ toolbar->num_children);
}
void
-gtk_toolbar_prepend_widget (GtkToolbar *toolbar,
- GtkWidget *widget,
- const char *tooltip_text)
+gtk_toolbar_prepend_widget (GtkToolbar *toolbar,
+ GtkWidget *widget,
+ const gchar *tooltip_text,
+ const gchar *tooltip_private_text)
{
- gtk_toolbar_insert_widget (toolbar, widget, tooltip_text, 0);
+ gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
+ widget, NULL,
+ tooltip_text, tooltip_private_text,
+ NULL, NULL, NULL,
+ toolbar->num_children);
}
void
gtk_toolbar_insert_widget (GtkToolbar *toolbar,
GtkWidget *widget,
const char *tooltip_text,
+ const char *tooltip_private_text,
gint position)
+{
+ gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
+ widget, NULL,
+ tooltip_text, tooltip_private_text,
+ NULL, NULL, NULL,
+ position);
+}
+
+GtkWidget *
+gtk_toolbar_append_element (GtkToolbar *toolbar,
+ GtkToolbarChildType type,
+ GtkWidget *widget,
+ const char *text,
+ const char *tooltip_text,
+ const char *tooltip_private_text,
+ GtkWidget *icon,
+ GtkSignalFunc callback,
+ gpointer user_data)
+{
+ return gtk_toolbar_insert_element (toolbar, type, widget, text,
+ tooltip_text, tooltip_private_text,
+ icon, callback, user_data,
+ toolbar->num_children);
+}
+
+GtkWidget *
+gtk_toolbar_prepend_element (GtkToolbar *toolbar,
+ GtkToolbarChildType type,
+ GtkWidget *widget,
+ const char *text,
+ const char *tooltip_text,
+ const char *tooltip_private_text,
+ GtkWidget *icon,
+ GtkSignalFunc callback,
+ gpointer user_data)
+{
+ return gtk_toolbar_insert_element (toolbar, type, widget, text,
+ tooltip_text, tooltip_private_text,
+ icon, callback, user_data, 0);
+}
+
+GtkWidget *
+gtk_toolbar_insert_element (GtkToolbar *toolbar,
+ GtkToolbarChildType type,
+ GtkWidget *widget,
+ const char *text,
+ const char *tooltip_text,
+ const char *tooltip_private_text,
+ GtkWidget *icon,
+ GtkSignalFunc callback,
+ gpointer user_data,
+ gint position)
{
GtkToolbarChild *child;
+ GtkWidget *vbox;
- g_return_if_fail (toolbar != NULL);
- g_return_if_fail (widget != NULL);
+ g_return_val_if_fail (toolbar != NULL, NULL);
+ g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
+ g_return_val_if_fail ((type != GTK_TOOLBAR_CHILD_WIDGET) || (widget != NULL), NULL);
child = g_new (GtkToolbarChild, 1);
- child->type = GTK_TOOLBAR_CHILD_WIDGET;
- child->widget = widget;
- child->icon = NULL;
- child->label = NULL;
+ child->type = type;
+ child->icon = NULL;
+ child->label = NULL;
+
+ switch (type)
+ {
+ case GTK_TOOLBAR_CHILD_SPACE:
+ child->widget = NULL;
+ break;
+
+ case GTK_TOOLBAR_CHILD_WIDGET:
+ child->widget = widget;
+ break;
+
+ case GTK_TOOLBAR_CHILD_BUTTON:
+ case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
+ case GTK_TOOLBAR_CHILD_RADIOBUTTON:
+ if (type == GTK_TOOLBAR_CHILD_BUTTON)
+ child->widget = gtk_button_new ();
+ else if (type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
+ {
+ child->widget = gtk_toggle_button_new ();
+ gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget),
+ FALSE);
+ }
+ else
+ {
+ child->widget = gtk_radio_button_new (widget
+ ? gtk_radio_button_group (GTK_RADIO_BUTTON (widget))
+ : NULL);
+ gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget), FALSE);
+ }
+
+ if (callback)
+ gtk_signal_connect (GTK_OBJECT (child->widget), "clicked",
+ callback, user_data);
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (child->widget), vbox);
+ gtk_widget_show (vbox);
- if (tooltip_text)
- gtk_tooltips_set_tips (toolbar->tooltips, child->widget, tooltip_text);
+ if (icon)
+ {
+ child->icon = GTK_WIDGET (icon);
+ gtk_box_pack_start (GTK_BOX (vbox), child->icon, FALSE, FALSE, 0);
+ if (toolbar->style != GTK_TOOLBAR_TEXT)
+ gtk_widget_show (child->icon);
+ }
+
+ if (text)
+ {
+ child->label = gtk_label_new (text);
+ gtk_box_pack_start (GTK_BOX (vbox), child->label, FALSE, FALSE, 0);
+ if (toolbar->style != GTK_TOOLBAR_ICONS)
+ gtk_widget_show (child->label);
+ }
+
+ gtk_widget_show (child->widget);
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+ if ((type != GTK_TOOLBAR_CHILD_SPACE) && tooltip_text)
+ gtk_tooltips_set_tip (toolbar->tooltips, child->widget,
+ tooltip_text, tooltip_private_text);
toolbar->children = g_list_insert (toolbar->children, child, position);
toolbar->num_children++;
- gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
+ if (type != GTK_TOOLBAR_CHILD_SPACE)
+ gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
- if (GTK_WIDGET_VISIBLE (toolbar))
+ if ((type != GTK_TOOLBAR_CHILD_SPACE) && GTK_WIDGET_VISIBLE (toolbar))
{
if (GTK_WIDGET_REALIZED (toolbar)
&& !GTK_WIDGET_REALIZED (child->widget))
gtk_widget_realize (child->widget);
-
+
if (GTK_WIDGET_MAPPED (toolbar)
&& !GTK_WIDGET_MAPPED (child->widget))
gtk_widget_map (child->widget);
}
- if (GTK_WIDGET_VISIBLE (child->widget) && GTK_WIDGET_VISIBLE (toolbar))
- gtk_widget_queue_resize (child->widget);
+ if (GTK_WIDGET_VISIBLE (toolbar) &&
+ ((type == GTK_TOOLBAR_CHILD_SPACE) ||
+ GTK_WIDGET_VISIBLE (child->widget)))
+ gtk_widget_queue_resize (GTK_WIDGET (toolbar));
+
+ return child->widget;
}
void
{
child = children->data;
- if (child->type == GTK_TOOLBAR_CHILD_BUTTON)
+ if (child->type == GTK_TOOLBAR_CHILD_BUTTON ||
+ child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON ||
+ child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
switch (style)
{
case GTK_TOOLBAR_ICONS: