source: trunk/third/libbonoboui/bonobo/bonobo-ui-toolbar-control-item.c @ 18588

Revision 18588, 10.2 KB checked in by ghudson, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18587, which included commits to RCS files with non-trunk default branches.
Line 
1/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2/**
3 * bonobo-ui-toolbar-control-item.c: A special toolbar item for controls.
4 *
5 * Author:
6 *      Jon K Hellan (hellan@acm.org)
7 *
8 * Copyright 2000 Jon K Hellan.
9 * Copyright (C) 2001 Eazel, Inc.
10 */
11
12#include <config.h>
13#include <bonobo/bonobo-ui-private.h>
14#include <bonobo/bonobo-ui-toolbar-control-item.h>
15#include <bonobo/bonobo-exception.h>
16#include <bonobo/bonobo-property-bag-client.h>
17#include <libgnome/gnome-macros.h>
18
19GNOME_CLASS_BOILERPLATE (BonoboUIToolbarControlItem,
20                         bonobo_ui_toolbar_control_item,
21                         GObject,
22                         bonobo_ui_toolbar_button_item_get_type ());
23
24struct _BonoboUIToolbarControlItemPrivate {
25        GtkWidget    *widget;   /* The widget (of a control, or custom */
26        BonoboWidget *control;  /* The wrapped control - if a control, or NULL */
27        GtkWidget *button;      /* Button to display instead of control in
28                                   vertical mode */
29        GtkWidget *box;         /* Container for control and button. Which of
30                                   its children is visible depends on
31                                   orientation */
32        GtkWidget *eventbox;    /* The eventbox which makes tooltips work */
33
34        BonoboUIToolbarControlDisplay hdisplay;
35        BonoboUIToolbarControlDisplay vdisplay;
36};
37
38static void
39set_control_property_bag_value (BonoboUIToolbarControlItem *item,
40                                const char                 *name,
41                                BonoboArg                  *value)
42{
43        BonoboControlFrame *frame;
44        Bonobo_PropertyBag bag;
45
46        if (!item->priv->control)
47                return;
48
49        frame = bonobo_widget_get_control_frame (item->priv->control);
50        if (!frame)
51                return;
52
53        bag = bonobo_control_frame_get_control_property_bag (frame, NULL);
54        if (bag == CORBA_OBJECT_NIL)
55                return;
56
57        bonobo_pbclient_set_value (bag, name, value, NULL);
58
59        bonobo_object_release_unref (bag, NULL);
60}
61
62#define MAKE_SET_CONTROL_PROPERTY_BAG_VALUE(gtype, paramtype, capstype) \
63static void                                                             \
64set_control_property_bag_##gtype (BonoboUIToolbarControlItem *item,     \
65                                  const char *name,                     \
66                                  paramtype value)                      \
67{                                                                       \
68        BonoboArg *arg;                                                 \
69                                                                        \
70        arg = bonobo_arg_new (BONOBO_ARG_##capstype);                   \
71        BONOBO_ARG_SET_##capstype (arg, value);                         \
72        set_control_property_bag_value (item, name, arg);               \
73        bonobo_arg_release (arg);                                       \
74}
75
76MAKE_SET_CONTROL_PROPERTY_BAG_VALUE (gboolean, gboolean,     BOOLEAN)
77MAKE_SET_CONTROL_PROPERTY_BAG_VALUE (gint,     gint,         INT)
78MAKE_SET_CONTROL_PROPERTY_BAG_VALUE (string,   const char *, STRING)
79
80/* BonoboUIToolbarButtonItem virtual methods.  */
81static void
82impl_set_icon (BonoboUIToolbarButtonItem *button_item,
83               gpointer                   image)
84{
85        BonoboUIToolbarControlItemPrivate *priv;
86        BonoboUIToolbarControlItem *control_item;
87
88        control_item = BONOBO_UI_TOOLBAR_CONTROL_ITEM (button_item);
89        priv = control_item->priv;
90
91        bonobo_ui_toolbar_button_item_set_image (
92                BONOBO_UI_TOOLBAR_BUTTON_ITEM (priv->button), image);
93}
94
95static void
96impl_set_label (BonoboUIToolbarButtonItem *button_item,
97                const char                *label)
98{
99        BonoboUIToolbarControlItemPrivate *priv;
100        BonoboUIToolbarControlItem *control_item;
101
102        control_item = BONOBO_UI_TOOLBAR_CONTROL_ITEM (button_item);
103        priv = control_item->priv;
104
105        bonobo_ui_toolbar_button_item_set_label (
106                BONOBO_UI_TOOLBAR_BUTTON_ITEM (priv->button), label);
107        set_control_property_bag_string (control_item, "label", label);
108}
109
110/* BonoboUIToolbarItem methods.  */
111
112/*
113 * We are assuming that there's room in horizontal orientation, but not
114 * vertical. This can be made more sophisticated by looking at the control's
115 * requested geometry.
116 */
117static void
118impl_set_orientation (BonoboUIToolbarItem *item,
119                      GtkOrientation orientation)
120{
121        BonoboUIToolbarControlItem        *control_item;
122        BonoboUIToolbarControlDisplay      display;
123        BonoboUIToolbarControlItemPrivate *priv;
124
125        control_item = BONOBO_UI_TOOLBAR_CONTROL_ITEM (item);
126        priv = control_item->priv;
127
128        if (orientation == GTK_ORIENTATION_HORIZONTAL)
129                display = priv->hdisplay;
130        else
131                display = priv->vdisplay;
132       
133        switch (display) {
134
135        case BONOBO_UI_TOOLBAR_CONTROL_DISPLAY_CONTROL:
136                gtk_widget_hide (priv->button);
137                gtk_widget_show (priv->widget);
138                break;
139
140        case BONOBO_UI_TOOLBAR_CONTROL_DISPLAY_BUTTON:
141                gtk_widget_hide (priv->widget);
142                gtk_widget_show (priv->button);
143                break;
144
145        case BONOBO_UI_TOOLBAR_CONTROL_DISPLAY_NONE:
146                gtk_widget_hide (priv->widget);
147                gtk_widget_hide (priv->button);
148                break;
149
150        default:
151                g_assert_not_reached ();
152        }
153
154        set_control_property_bag_gint (control_item, "orientation", orientation);
155
156        GNOME_CALL_PARENT (BONOBO_UI_TOOLBAR_ITEM_CLASS, set_orientation,
157                           (item, orientation));
158}
159
160static void
161impl_set_style (BonoboUIToolbarItem     *item,
162                BonoboUIToolbarItemStyle style)
163{
164        BonoboUIToolbarControlItem *control_item;
165
166        control_item = BONOBO_UI_TOOLBAR_CONTROL_ITEM (item);
167        bonobo_ui_toolbar_item_set_style (
168                BONOBO_UI_TOOLBAR_ITEM (control_item->priv->button), style);
169        set_control_property_bag_gint (control_item, "style", style);
170}
171
172static void
173impl_set_want_label (BonoboUIToolbarItem     *item,
174                     gboolean                 want_label)
175{
176        BonoboUIToolbarControlItem *control_item;
177
178        control_item = BONOBO_UI_TOOLBAR_CONTROL_ITEM (item);
179        bonobo_ui_toolbar_item_set_want_label (
180                BONOBO_UI_TOOLBAR_ITEM (control_item->priv->button),
181                want_label);
182        set_control_property_bag_gboolean (control_item, "want_label", want_label);
183}
184
185static void
186impl_set_tooltip (BonoboUIToolbarItem     *item,
187                  GtkTooltips             *tooltips,
188                  const char              *tooltip)
189{
190        BonoboUIToolbarControlItem *control_item;
191        GtkWidget *eventbox;
192
193        control_item = BONOBO_UI_TOOLBAR_CONTROL_ITEM (item);
194        eventbox = control_item->priv->eventbox;
195       
196        if (tooltip && eventbox)
197                gtk_tooltips_set_tip (tooltips, eventbox, tooltip, NULL);
198}
199
200/* GObject methods.  */
201
202static void
203impl_dispose (GObject *object)
204{
205        BonoboUIToolbarControlItem *control_item;
206
207        control_item = (BonoboUIToolbarControlItem *) object;
208       
209        if (control_item->priv->widget) {
210                gtk_widget_destroy (control_item->priv->widget);
211                control_item->priv->control = NULL;
212                control_item->priv->widget = NULL;
213        }
214
215        GNOME_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
216}
217
218static void
219impl_finalize (GObject *object)
220{
221        BonoboUIToolbarControlItem *control_item;
222
223        control_item = (BonoboUIToolbarControlItem *) object;
224
225        g_free (control_item->priv);
226
227        GNOME_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
228}
229
230/* Gtk+ object initialization.  */
231
232static void
233bonobo_ui_toolbar_control_item_class_init (BonoboUIToolbarControlItemClass *klass)
234{
235        BonoboUIToolbarButtonItemClass *button_item_class;
236        BonoboUIToolbarItemClass *item_class;
237        GObjectClass *object_class;
238       
239        button_item_class = BONOBO_UI_TOOLBAR_BUTTON_ITEM_CLASS (klass);
240        item_class = BONOBO_UI_TOOLBAR_ITEM_CLASS (klass);
241        object_class = G_OBJECT_CLASS (klass);
242
243        button_item_class->set_icon  = impl_set_icon;
244        button_item_class->set_label = impl_set_label;
245        item_class->set_tooltip      = impl_set_tooltip;
246        item_class->set_orientation  = impl_set_orientation;
247        item_class->set_style        = impl_set_style;
248        item_class->set_want_label   = impl_set_want_label;
249
250        object_class->dispose  = impl_dispose;
251        object_class->finalize = impl_finalize;
252}
253
254static void
255bonobo_ui_toolbar_control_item_instance_init (BonoboUIToolbarControlItem *control_item)
256{
257        control_item->priv = g_new0 (BonoboUIToolbarControlItemPrivate, 1);
258}
259
260static void
261proxy_activate_cb (GtkWidget *button, GtkObject *item)
262{
263        g_signal_emit_by_name (item, "activate");
264}
265
266GtkWidget *
267bonobo_ui_toolbar_control_item_construct (
268        BonoboUIToolbarControlItem *control_item,
269        GtkWidget                  *widget,
270        Bonobo_Control              control_ref)
271{
272        BonoboUIToolbarControlItemPrivate *priv = control_item->priv;
273
274        if (!widget)
275                widget = bonobo_widget_new_control_from_objref (
276                        control_ref, CORBA_OBJECT_NIL);
277
278        if (!widget)
279                return NULL;
280
281        priv->widget   = widget;
282        priv->control  = BONOBO_IS_WIDGET (widget) ? BONOBO_WIDGET (widget) : NULL;
283        priv->button   = bonobo_ui_toolbar_button_item_new (NULL, NULL);
284        priv->eventbox = gtk_event_box_new ();
285        priv->box      = gtk_vbox_new (FALSE, 0);
286       
287        g_signal_connect (priv->button, "activate",
288                          G_CALLBACK (proxy_activate_cb), control_item);
289       
290        gtk_container_add (GTK_CONTAINER (priv->box), widget);
291        gtk_container_add (GTK_CONTAINER (priv->box), priv->button);
292
293        gtk_container_add (GTK_CONTAINER (priv->eventbox), priv->box);
294
295        gtk_widget_show (priv->widget);
296        gtk_widget_show (priv->box);
297        gtk_widget_show   (priv->eventbox);
298        gtk_container_add (GTK_CONTAINER (control_item), priv->eventbox);
299
300        return GTK_WIDGET (control_item);
301}
302
303GtkWidget *
304bonobo_ui_toolbar_control_item_new (Bonobo_Control control_ref)
305{
306        BonoboUIToolbarControlItem *control_item;
307        GtkWidget *ret;
308
309        control_item = g_object_new (
310                bonobo_ui_toolbar_control_item_get_type (), NULL);
311
312        ret = bonobo_ui_toolbar_control_item_construct (
313                control_item, NULL, control_ref);
314
315        if (!ret)
316                g_object_unref (control_item);
317
318        return ret;
319}
320
321GtkWidget *
322bonobo_ui_toolbar_control_item_new_widget (GtkWidget *custom_in_proc_widget)
323{
324        GtkWidget *ret;
325        BonoboUIToolbarControlItem *control_item;
326
327        control_item = g_object_new (
328                bonobo_ui_toolbar_control_item_get_type (), NULL);
329
330        ret = bonobo_ui_toolbar_control_item_construct (
331                control_item, custom_in_proc_widget, CORBA_OBJECT_NIL);
332
333        if (!ret)
334                g_object_unref (custom_in_proc_widget);
335
336        return ret;
337}
338
339void
340bonobo_ui_toolbar_control_item_set_display (BonoboUIToolbarControlItem    *item,
341                                            BonoboUIToolbarControlDisplay  hdisplay,
342                                            BonoboUIToolbarControlDisplay  vdisplay)
343{
344        g_return_if_fail (BONOBO_IS_UI_TOOLBAR_CONTROL_ITEM (item));
345
346        item->priv->hdisplay = hdisplay;
347        item->priv->vdisplay = vdisplay;
348}
349
350void
351bonobo_ui_toolbar_control_item_set_sensitive (BonoboUIToolbarControlItem *item,
352                                              gboolean                    sensitive)
353{
354        gboolean changed;
355
356        g_return_if_fail (BONOBO_IS_UI_TOOLBAR_CONTROL_ITEM (item));
357
358        changed = (( GTK_WIDGET_IS_SENSITIVE (item) && !sensitive) ||
359                   (!GTK_WIDGET_IS_SENSITIVE (item) &&  sensitive));
360
361        if (!changed || !item->priv->control)
362                return;
363
364        bonobo_control_frame_control_set_state (
365                bonobo_widget_get_control_frame (item->priv->control),
366                sensitive ? Bonobo_Gtk_StateNormal : Bonobo_Gtk_StateInsensitive);
367}
Note: See TracBrowser for help on using the repository browser.