aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/menus
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/menus')
-rw-r--r--widgets/menus/gal-view-menus.c122
1 files changed, 70 insertions, 52 deletions
diff --git a/widgets/menus/gal-view-menus.c b/widgets/menus/gal-view-menus.c
index ac99ae1793..89eb38022a 100644
--- a/widgets/menus/gal-view-menus.c
+++ b/widgets/menus/gal-view-menus.c
@@ -21,14 +21,22 @@
#include <gal/util/e-xml-utils.h>
#include <gal/menus/gal-define-views-dialog.h>
#include <gal/widgets/e-unicode.h>
+#include <e-util/e-list.h>
struct _GalViewMenusPrivate {
GalViewCollection *collection;
int collection_changed_id;
BonoboUIVerb *verbs;
BonoboUIComponent *component;
+ EList *listenerClosures;
};
+typedef struct {
+ GalViewCollection *collection;
+ GalView *view;
+ const char *id;
+} ListenerClosure;
+
#define PARENT_TYPE (gtk_object_get_type())
static GtkObjectClass *gvm_parent_class;
@@ -37,32 +45,37 @@ static void collection_changed (GalViewCollection *collection,
#define d(x)
-typedef struct {
- GalViewCollection *collection;
- GalView *view;
-} CollectionAndView;
-
static void
free_verbs (GalViewMenus *gvm)
{
- BonoboUIVerb *verbs;
if (gvm->priv->verbs) {
- for (verbs = gvm->priv->verbs + 1; verbs->cname; verbs++) {
- CollectionAndView *cnv;
+ g_free(gvm->priv->verbs->cname);
+ g_free(gvm->priv->verbs);
+ }
+ gvm->priv->verbs = NULL;
+}
+
+static void
+closure_free (void *data, void *user_data)
+{
+ ListenerClosure *closure = data;
+ GalViewMenus *gvm = user_data;
- if (gvm->priv->component)
- bonobo_ui_component_remove_verb(gvm->priv->component, verbs->cname);
+ gtk_object_ref(GTK_OBJECT(closure->view));
+ gtk_object_ref(GTK_OBJECT(closure->collection));
- cnv = verbs->user_data;
- g_free(verbs->cname);
+ bonobo_ui_component_remove_listener (gvm->priv->component, closure->id);
- gtk_object_unref(GTK_OBJECT(cnv->collection));
- gtk_object_unref(GTK_OBJECT(cnv->view));
- g_free(cnv);
- }
- g_free(gvm->priv->verbs);
+ g_free (closure);
+}
+
+static void
+remove_listeners (GalViewMenus *gvm)
+{
+ if (gvm->priv->listenerClosures) {
+ gtk_object_unref (GTK_OBJECT(gvm->priv->listenerClosures));
}
- gvm->priv->verbs = NULL;
+ gvm->priv->listenerClosures = NULL;
}
static void
@@ -83,6 +96,7 @@ gvm_destroy (GtkObject *object)
gtk_object_unref(GTK_OBJECT(gvm->priv->collection));
free_verbs(gvm);
remove_xml(gvm);
+ remove_listeners(gvm);
g_free(gvm->priv);
gvm->priv = NULL;
@@ -105,6 +119,7 @@ gvm_init (GalViewMenus *gvm)
gvm->priv->collection_changed_id = 0;
gvm->priv->verbs = NULL;
gvm->priv->component = NULL;
+ gvm->priv->listenerClosures = NULL;
}
E_MAKE_TYPE(gal_view_menus, "GalViewMenus", GalViewMenus, gvm_class_init, gvm_init, PARENT_TYPE);
@@ -152,6 +167,22 @@ define_views(BonoboUIComponent *component,
gtk_widget_show(dialog);
}
+static void
+toggled_cb (BonoboUIComponent *component,
+ const char *path,
+ Bonobo_UIComponent_EventType type,
+ const char *state,
+ gpointer user_data)
+{
+ ListenerClosure *closure = user_data;
+
+ /* do nothing on state change to untoggled */
+ if (!strcmp (state, "0"))
+ return;
+
+ gal_view_collection_display_view(closure->collection, closure->view);
+}
+
static char *
build_menus(GalViewMenus *menus)
{
@@ -176,12 +207,19 @@ build_menus(GalViewMenus *menus)
bonobo_ui_node_set_attr(submenu, "_label", N_("_Current View"));
length = gal_view_collection_get_count(collection);
+
+ menus->priv->listenerClosures = e_list_new (NULL, closure_free, menus);
+
for (i = 0; i < length; i++) {
- char *verb;
char *label;
GalViewCollectionItem *item = gal_view_collection_get_view_item(collection, i);
+ ListenerClosure *closure;
+
menuitem = bonobo_ui_node_new_child(submenu, "menuitem");
bonobo_ui_node_set_attr(menuitem, "name", item->id);
+ bonobo_ui_node_set_attr(menuitem, "id", item->id);
+ bonobo_ui_node_set_attr(menuitem, "group", "GalViewMenus");
+ bonobo_ui_node_set_attr(menuitem, "type", "radio");
/* bonobo displays this string so it must be in locale */
label = e_utf8_to_locale_string(item->title);
@@ -190,9 +228,17 @@ build_menus(GalViewMenus *menus)
bonobo_ui_node_set_attr(menuitem, "_label", label);
g_free(label);
- verb = g_strdup_printf("DefineViews:%s", item->id);
- bonobo_ui_node_set_attr(menuitem, "verb", verb);
- g_free(verb);
+ closure = g_new (ListenerClosure, 1);
+ closure->collection = collection;
+ closure->view = item->view;
+ closure->id = item->id;
+
+ gtk_object_ref(GTK_OBJECT(closure->view));
+ gtk_object_ref(GTK_OBJECT(closure->collection));
+
+ bonobo_ui_component_add_listener (menus->priv->component, item->id, toggled_cb, closure);
+
+ e_list_append (menus->priv->listenerClosures, closure);
}
menuitem = bonobo_ui_node_new_child(submenu, "separator");
@@ -213,23 +259,11 @@ build_menus(GalViewMenus *menus)
return xml;
}
-static void
-show_view(BonoboUIComponent *component,
- gpointer user_data,
- const char *cname)
-{
- CollectionAndView *cnv = user_data;
- gal_view_collection_display_view(cnv->collection, cnv->view);
-}
-
static BonoboUIVerb *
build_verbs (GalViewMenus *menus)
{
- GalViewCollection *collection = menus->priv->collection;
- int count = gal_view_collection_get_count(collection);
- BonoboUIVerb *verbs = g_new(BonoboUIVerb, count + 2);
+ BonoboUIVerb *verbs = g_new(BonoboUIVerb, 2);
BonoboUIVerb *verb;
- int i;
verb = verbs;
verb->cname = g_strdup("DefineViews");
@@ -237,23 +271,6 @@ build_verbs (GalViewMenus *menus)
verb->user_data = menus;
verb->dummy = NULL;
verb ++;
- for (i = 0; i < count; i++) {
- CollectionAndView *cnv;
- GalViewCollectionItem *item = gal_view_collection_get_view_item(collection, i);
-
- cnv = g_new(CollectionAndView, 1);
- cnv->view = item->view;
- cnv->collection = collection;
-
- gtk_object_ref(GTK_OBJECT(cnv->view));
- gtk_object_ref(GTK_OBJECT(cnv->collection));
-
- verb->cname = g_strdup_printf("DefineViews:%s", item->id);
- verb->cb = show_view;
- verb->user_data = cnv;
- verb->dummy = NULL;
- verb++;
- }
verb->cname = NULL;
verb->cb = NULL;
@@ -271,6 +288,7 @@ build_stuff (GalViewMenus *gvm,
char *xml;
remove_xml(gvm);
+ remove_listeners(gvm);
xml = build_menus(gvm);
bonobo_ui_component_set_translate(gvm->priv->component, "/", xml, ev);
g_free(xml);