diff options
Diffstat (limited to 'widgets/misc')
-rw-r--r-- | widgets/misc/ChangeLog | 5 | ||||
-rw-r--r-- | widgets/misc/Makefile.am | 2 | ||||
-rw-r--r-- | widgets/misc/e-bonobo-widget.c | 195 | ||||
-rw-r--r-- | widgets/misc/e-bonobo-widget.h | 75 |
4 files changed, 277 insertions, 0 deletions
diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog index e3017edf31..27f5be6337 100644 --- a/widgets/misc/ChangeLog +++ b/widgets/misc/ChangeLog @@ -1,3 +1,8 @@ +2001-08-08 Ettore Perazzoli <ettore@ximian.com> + + * e-bonobo-widget.c: New. + * e-bonobo-widget.h: New. + 2001-08-05 Ettore Perazzoli <ettore@ximian.com> [Added an "Activate" button to the search bar.] diff --git a/widgets/misc/Makefile.am b/widgets/misc/Makefile.am index cca7625d05..f8d6246f5b 100644 --- a/widgets/misc/Makefile.am +++ b/widgets/misc/Makefile.am @@ -12,6 +12,8 @@ noinst_LIBRARIES = \ libemiscwidgets.a libemiscwidgets_a_SOURCES = \ + e-bonobo-widget.c \ + e-bonobo-widget.h \ e-calendar.c \ e-calendar.h \ e-calendar-item.c \ diff --git a/widgets/misc/e-bonobo-widget.c b/widgets/misc/e-bonobo-widget.c new file mode 100644 index 0000000000..d584067c7e --- /dev/null +++ b/widgets/misc/e-bonobo-widget.c @@ -0,0 +1,195 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* e-bonobo-widget.c + * + * Copyright (C) 2001 Ximian, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: + * Michael Meeks <michael@ximian.com> + * Ettore Perazzoli <ettore@ximian.com> + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "e-bonobo-widget.h" + +#include <gal/util/e-util.h> + +#include <gdk/gdkprivate.h> +#include <gdk/gdkx.h> +#include <gdk/gdktypes.h> + + +#define PARENT_TYPE bonobo_widget_get_type () +static BonoboWidgetClass *parent_class = NULL; + + +static void +class_init (GtkObjectClass *object_class) +{ + parent_class = gtk_type_class (PARENT_TYPE); + + /* No method to override. */ +} + +static void +init (EBonoboWidget *bonobo_widget) +{ + /* Nothing to initialize. */ +} + + +static void +evolution_toplevel_property_get_fn (BonoboPropertyBag *bag, + BonoboArg *arg, + unsigned int arg_id, + CORBA_Environment *ev, + void *data) +{ + BonoboControlFrame *frame; + GtkWidget *toplevel; + char *id; + + frame = BONOBO_CONTROL_FRAME (data); + + toplevel = bonobo_control_frame_get_widget (frame); + while (toplevel->parent != NULL) + toplevel = toplevel->parent; + + if (BONOBO_IS_CONTROL (toplevel)) { + Bonobo_PropertyBag toplevel_property_bag; + + toplevel_property_bag = bonobo_control_get_ambient_properties (BONOBO_CONTROL (toplevel), NULL); + if (toplevel_property_bag == CORBA_OBJECT_NIL) + goto error; + + id = bonobo_property_bag_client_get_value_string (toplevel_property_bag, + E_BONOBO_WIDGET_TOPLEVEL_PROPERTY_ID, + NULL); + if (id == NULL) + goto error; + + *(char **)arg->_value = id; + return; + } + + id = bonobo_control_windowid_from_x11 (GDK_WINDOW_XWINDOW (toplevel->window)); + *(char **)arg->_value = CORBA_string_dup (id); + g_free (id); + + return; + + error: + /* FIXME: exception? */ + *(char **)arg->_value = CORBA_string_dup (""); +} + +static void +setup_toplevel_property (EBonoboWidget *widget) +{ + BonoboPropertyBag *property_bag; + BonoboControlFrame *control_frame; + + control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (widget)); + + if (!(property_bag = bonobo_control_frame_get_propbag (control_frame))) { + property_bag = bonobo_property_bag_new (NULL, NULL, NULL); + bonobo_control_frame_set_propbag (control_frame, property_bag); + } + + /* FIXME: Kill property bag when the frame dies. */ + + bonobo_property_bag_add_full (property_bag, E_BONOBO_WIDGET_TOPLEVEL_PROPERTY_ID, 0, + TC_Bonobo_Control_windowId, + NULL, "Toplevel Window ID", + BONOBO_PROPERTY_READABLE, + evolution_toplevel_property_get_fn, NULL, + control_frame); +} + + +EBonoboWidget * +e_bonobo_widget_construct_control_from_objref (EBonoboWidget *widget, + Bonobo_Control control, + Bonobo_UIContainer uic) +{ + g_return_val_if_fail (widget != NULL, NULL); + g_return_val_if_fail (E_IS_BONOBO_WIDGET (widget), NULL); + + if (bonobo_widget_construct_control_from_objref (BONOBO_WIDGET (widget), control, uic) == NULL) + return NULL; + + setup_toplevel_property (widget); + return widget; +} + +EBonoboWidget * +e_bonobo_widget_construct_control (EBonoboWidget *widget, + const char *moniker, + Bonobo_UIContainer uic) +{ + g_return_val_if_fail (widget != NULL, NULL); + g_return_val_if_fail (E_IS_BONOBO_WIDGET (widget), NULL); + g_return_val_if_fail (moniker != NULL, NULL); + + if (bonobo_widget_construct_control (BONOBO_WIDGET (widget), moniker, uic) == NULL) + return NULL; + + setup_toplevel_property (widget); + + return widget; +} + + +GtkWidget * +e_bonobo_widget_new_control (const char *moniker, + Bonobo_UIContainer uic) +{ + EBonoboWidget *widget; + + g_return_val_if_fail (moniker != NULL, NULL); + + widget = gtk_type_new (e_bonobo_widget_get_type ()); + widget = e_bonobo_widget_construct_control (widget, moniker, uic); + + if (widget == NULL) + return NULL; + + return GTK_WIDGET (widget); +} + +GtkWidget * +e_bonobo_widget_new_control_from_objref (Bonobo_Control control, + Bonobo_UIContainer uic) +{ + EBonoboWidget *widget; + + g_return_val_if_fail (control != CORBA_OBJECT_NIL, NULL); + + widget = gtk_type_new (E_TYPE_BONOBO_WIDGET); + + widget = e_bonobo_widget_construct_control_from_objref (widget, control, uic); + if (widget == NULL) + return NULL; + + return GTK_WIDGET (widget); +} + + +E_MAKE_TYPE (e_bonobo_widget, "EBonoboWidget", EBonoboWidget, class_init, init, PARENT_TYPE) diff --git a/widgets/misc/e-bonobo-widget.h b/widgets/misc/e-bonobo-widget.h new file mode 100644 index 0000000000..fd045d699d --- /dev/null +++ b/widgets/misc/e-bonobo-widget.h @@ -0,0 +1,75 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* e-bonobo-widget.h + * + * Copyright (C) 2001 Ximian, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ettore Perazzoli <ettore@ximian.com> + */ + +#ifndef _E_BONOBO_WIDGET_H_ +#define _E_BONOBO_WIDGET_H_ + +#include <bonobo/bonobo-widget.h> + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#define E_TYPE_BONOBO_WIDGET (e_bonobo_widget_get_type ()) +#define E_BONOBO_WIDGET(obj) (GTK_CHECK_CAST ((obj), E_TYPE_BONOBO_WIDGET, EBonoboWidget)) +#define E_BONOBO_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_BONOBO_WIDGET, EBonoboWidgetClass)) +#define E_IS_BONOBO_WIDGET(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_BONOBO_WIDGET)) +#define E_IS_BONOBO_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_BONOBO_WIDGET)) + + +typedef struct _EBonoboWidget EBonoboWidget; +typedef struct _EBonoboWidgetPrivate EBonoboWidgetPrivate; +typedef struct _EBonoboWidgetClass EBonoboWidgetClass; + +struct _EBonoboWidget { + BonoboWidget parent; + + EBonoboWidgetPrivate *priv; +}; + +struct _EBonoboWidgetClass { + BonoboWidgetClass parent_class; +}; + + +#define E_BONOBO_WIDGET_TOPLEVEL_PROPERTY_ID "bonobo:toplevel" + + +GtkType e_bonobo_widget_get_type (void); +EBonoboWidget *e_bonobo_widget_construct_control_from_objref (EBonoboWidget *widget, + Bonobo_Control control, + Bonobo_UIContainer uic); +EBonoboWidget *e_bonobo_widget_construct_control (EBonoboWidget *widget, + const char *moniker, + Bonobo_UIContainer uic); +GtkWidget *e_bonobo_widget_new_control (const char *moniker, + Bonobo_UIContainer uic); +GtkWidget *e_bonobo_widget_new_control_from_objref (Bonobo_Control control, + Bonobo_UIContainer uic); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _E_BONOBO_WIDGET_H_ */ |