aboutsummaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
Diffstat (limited to 'shell')
-rw-r--r--shell/ChangeLog36
-rw-r--r--shell/Evolution-ShellComponent.idl13
-rw-r--r--shell/e-storage-set-view.c6
-rw-r--r--shell/evolution-shell-component-client.c32
-rw-r--r--shell/evolution-shell-component-client.h12
-rw-r--r--shell/evolution-shell-component.c93
-rw-r--r--shell/evolution-shell-component.h49
-rw-r--r--shell/evolution-test-component.c2
8 files changed, 194 insertions, 49 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog
index 6d4f8262cd..5fb29e2c3c 100644
--- a/shell/ChangeLog
+++ b/shell/ChangeLog
@@ -1,3 +1,39 @@
+2002-09-04 Ettore Perazzoli <ettore@ximian.com>
+
+ * e-storage-set-view.c (popup_folder_menu): Remove the context
+ menu items using
+ evolution_shell_component_client_unpopulate_folder_context_menu()
+ instead of doing it ourself, since BonoboUI sucks.
+
+ * evolution-shell-component-client.c
+ (evolution_shell_component_client_unpopulate_folder_context_menu):
+ New.
+
+ * evolution-test-component.c (register_component): Pass NULL as
+ @unpopulate_folder_context_menu_fn to
+ evolution_shell_component_new().
+
+ * evolution-shell-component.c: New member
+ unpopulate_folder_context_menu_fn in
+ EvolutionShellComponentPrivate. New member uic in
+ EvolutionShellComponentPrivate.
+ (init): Init new members to NULL.
+ (destroy): bonobo_object_unref() priv->uic if not NULL.
+ (evolution_shell_component_new): New arg
+ @unpopulate_folder_context_menu_fn.
+ (evolution_shell_component_construct): Likewise.
+ (impl_populateFolderContextMenu): Set priv->uic to the newly
+ created UIComponent.
+ (impl_unpopulateFolderContextMenu): New, implementation for the
+ ::unpopulateFolderContextMenu CORBA method.
+ (class_init): Install.
+
+ * Evolution-ShellComponent.idl (unpopulateFolderContextMenu): New
+ method.
+ (AlreadyPopulated): New exception.
+ (populateFolderContextMenu): Can raise it.
+ (NotPopulated): New exception.
+
2002-09-03 Ettore Perazzoli <ettore@ximian.com>
* e-storage-set-view.c (popup_folder_menu): Create an Items
diff --git a/shell/Evolution-ShellComponent.idl b/shell/Evolution-ShellComponent.idl
index 96557353b9..9441b73b79 100644
--- a/shell/Evolution-ShellComponent.idl
+++ b/shell/Evolution-ShellComponent.idl
@@ -62,6 +62,8 @@ module Evolution {
exception OldOwnerHasDied {};
exception UnsupportedSchema {};
exception UnsupportedType {};
+ exception AlreadyPopulated {};
+ exception NotPopulated {};
/* List of folders that the component supports. */
readonly attribute FolderTypeList supportedTypes;
@@ -129,7 +131,16 @@ module Evolution {
@physical_uri. */
void populateFolderContextMenu (in Bonobo::UIContainer uih,
in string physical_uri,
- in string type);
+ in string type)
+ raises (AlreadyPopulated);
+
+ /* After you are done, you have to remove the items. This is
+ because of BonoboUI sucking and not allowing the shell to
+ remove the items itself. */
+ void unpopulateFolderContextMenu (in Bonobo::UIContainer uih,
+ in string physical_uri,
+ in string type)
+ raises (NotPopulated);
/* Make the component create a new item of the specify @id in
the folder specified by @parent_folder_physical_uri. This
diff --git a/shell/e-storage-set-view.c b/shell/e-storage-set-view.c
index 872da97eba..0b8b7642a9 100644
--- a/shell/e-storage-set-view.c
+++ b/shell/e-storage-set-view.c
@@ -804,7 +804,11 @@ popup_folder_menu (EStorageSetView *storage_set_view,
if (folder_property_items_data != NULL)
remove_property_items (storage_set_view, folder_property_items_data);
- bonobo_ui_component_rm (priv->ui_component, EVOLUTION_SHELL_COMPONENT_POPUP_PLACEHOLDER, NULL);
+ if (handler != NULL)
+ evolution_shell_component_client_unpopulate_folder_context_menu (handler,
+ priv->ui_container,
+ e_folder_get_physical_uri (folder),
+ e_folder_get_type_string (folder));
gtk_widget_destroy (GTK_WIDGET (menu));
diff --git a/shell/evolution-shell-component-client.c b/shell/evolution-shell-component-client.c
index 6d97c6e241..9276c6fa0f 100644
--- a/shell/evolution-shell-component-client.c
+++ b/shell/evolution-shell-component-client.c
@@ -840,6 +840,38 @@ evolution_shell_component_client_populate_folder_context_menu (EvolutionShellCom
CORBA_exception_free (&ev);
}
+void
+evolution_shell_component_client_unpopulate_folder_context_menu (EvolutionShellComponentClient *shell_component_client,
+ BonoboUIContainer *container,
+ const char *physical_uri,
+ const char *type)
+{
+ Bonobo_UIContainer corba_container;
+ EvolutionShellComponentClientPrivate *priv;
+ GNOME_Evolution_ShellComponent corba_shell_component;
+ CORBA_Environment ev;
+
+ g_return_if_fail (shell_component_client != NULL);
+ g_return_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client));
+ g_return_if_fail (physical_uri != NULL);
+ g_return_if_fail (type != NULL);
+
+ priv = shell_component_client->priv;
+
+ CORBA_exception_init (&ev);
+
+ corba_shell_component = bonobo_object_corba_objref (BONOBO_OBJECT (shell_component_client));
+ corba_container = bonobo_object_corba_objref (BONOBO_OBJECT (container));
+
+ GNOME_Evolution_ShellComponent_unpopulateFolderContextMenu (corba_shell_component,
+ corba_container,
+ physical_uri,
+ type,
+ &ev);
+
+ CORBA_exception_free (&ev);
+}
+
void
evolution_shell_component_client_request_quit (EvolutionShellComponentClient *shell_component_client,
diff --git a/shell/evolution-shell-component-client.h b/shell/evolution-shell-component-client.h
index fdb3650432..0c302b38e5 100644
--- a/shell/evolution-shell-component-client.h
+++ b/shell/evolution-shell-component-client.h
@@ -119,10 +119,14 @@ void evolution_shell_component_client_async_xfer_folder (EvolutionShellCompo
EvolutionShellComponentClientCallback callback,
void *data);
-void evolution_shell_component_client_populate_folder_context_menu (EvolutionShellComponentClient *shell_component_client,
- BonoboUIContainer *container,
- const char *physical_uri,
- const char *type);
+void evolution_shell_component_client_populate_folder_context_menu (EvolutionShellComponentClient *shell_component_client,
+ BonoboUIContainer *container,
+ const char *physical_uri,
+ const char *type);
+void evolution_shell_component_client_unpopulate_folder_context_menu (EvolutionShellComponentClient *shell_component_client,
+ BonoboUIContainer *container,
+ const char *physical_uri,
+ const char *type);
void evolution_shell_component_client_request_quit (EvolutionShellComponentClient *shell_component_client,
EvolutionShellComponentClientCallback callback,
diff --git a/shell/evolution-shell-component.c b/shell/evolution-shell-component.c
index cfe318b610..44f7e42c3d 100644
--- a/shell/evolution-shell-component.c
+++ b/shell/evolution-shell-component.c
@@ -65,6 +65,7 @@ struct _EvolutionShellComponentPrivate {
EvolutionShellComponentRemoveFolderFn remove_folder_fn;
EvolutionShellComponentXferFolderFn xfer_folder_fn;
EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn;
+ EvolutionShellComponentUnpopulateFolderContextMenuFn unpopulate_folder_context_menu_fn;
EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn;
EvolutionShellComponentRequestQuitFn request_quit_fn;
@@ -72,6 +73,10 @@ struct _EvolutionShellComponentPrivate {
GSList *user_creatable_item_types; /* UserCreatableItemType */
+ /* This is used for
+ populateFolderContextMenu/unpopulateFolderContextMenu. */
+ BonoboUIComponent *uic;
+
int ping_timeout_id;
void *closure;
@@ -637,7 +642,6 @@ impl_populateFolderContextMenu (PortableServer_Servant servant,
BonoboObject *bonobo_object;
EvolutionShellComponent *shell_component;
EvolutionShellComponentPrivate *priv;
- BonoboUIComponent *uic;
bonobo_object = bonobo_object_from_servant (servant);
shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object);
@@ -646,13 +650,49 @@ impl_populateFolderContextMenu (PortableServer_Servant servant,
if (priv->populate_folder_context_menu_fn == NULL)
return;
- uic = bonobo_ui_component_new_default ();
- bonobo_ui_component_set_container (uic, corba_uih);
+ if (priv->uic != NULL) {
+ CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
+ ex_GNOME_Evolution_ShellComponent_AlreadyPopulated,
+ NULL);
+ return;
+ }
+
+ priv->uic = bonobo_ui_component_new_default ();
+ bonobo_ui_component_set_container (priv->uic, corba_uih);
bonobo_object_release_unref (corba_uih, NULL);
- (* priv->populate_folder_context_menu_fn) (shell_component, uic, physical_uri, type, priv->closure);
+ (* priv->populate_folder_context_menu_fn) (shell_component, priv->uic, physical_uri, type, priv->closure);
+}
+
+static void
+impl_unpopulateFolderContextMenu (PortableServer_Servant servant,
+ const Bonobo_UIContainer corba_uih,
+ const CORBA_char *physical_uri,
+ const CORBA_char *type,
+ CORBA_Environment *ev)
+{
+ BonoboObject *bonobo_object;
+ EvolutionShellComponent *shell_component;
+ EvolutionShellComponentPrivate *priv;
+
+ bonobo_object = bonobo_object_from_servant (servant);
+ shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object);
+ priv = shell_component->priv;
+
+ if (priv->unpopulate_folder_context_menu_fn == NULL)
+ return;
+
+ if (priv->uic == NULL) {
+ CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
+ ex_GNOME_Evolution_ShellComponent_NotPopulated,
+ NULL);
+ return;
+ }
- bonobo_object_unref (BONOBO_OBJECT (uic));
+ (* priv->unpopulate_folder_context_menu_fn) (shell_component, priv->uic, physical_uri, type, priv->closure);
+
+ bonobo_object_unref (BONOBO_OBJECT (priv->uic));
+ priv->uic = NULL;
}
static void
@@ -763,6 +803,9 @@ destroy (GtkObject *object)
user_creatable_item_type_free ((UserCreatableItemType *) sp->data);
g_slist_free (priv->user_creatable_item_types);
+ if (priv->uic != NULL)
+ bonobo_object_unref (BONOBO_OBJECT (priv->uic));
+
g_free (priv);
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
@@ -910,6 +953,7 @@ class_init (EvolutionShellComponentClass *klass)
epv->removeFolderAsync = impl_removeFolderAsync;
epv->xferFolderAsync = impl_xferFolderAsync;
epv->populateFolderContextMenu = impl_populateFolderContextMenu;
+ epv->unpopulateFolderContextMenu = impl_unpopulateFolderContextMenu;
epv->userCreateNewItem = impl_userCreateNewItem;
epv->sendReceive = impl_sendReceive;
epv->requestQuit = impl_requestQuit;
@@ -929,17 +973,20 @@ init (EvolutionShellComponent *shell_component)
priv->folder_types = NULL;
priv->external_uri_schemas = NULL;
- priv->create_view_fn = NULL;
- priv->create_folder_fn = NULL;
- priv->remove_folder_fn = NULL;
- priv->xfer_folder_fn = NULL;
- priv->populate_folder_context_menu_fn = NULL;
+ priv->create_view_fn = NULL;
+ priv->create_folder_fn = NULL;
+ priv->remove_folder_fn = NULL;
+ priv->xfer_folder_fn = NULL;
+ priv->populate_folder_context_menu_fn = NULL;
+ priv->unpopulate_folder_context_menu_fn = NULL;
+
+ priv->owner_client = NULL;
+ priv->user_creatable_item_types = NULL;
+ priv->closure = NULL;
- priv->owner_client = NULL;
- priv->user_creatable_item_types = NULL;
- priv->closure = NULL;
+ priv->ping_timeout_id = -1;
- priv->ping_timeout_id = -1;
+ priv->uic = NULL;
shell_component->priv = priv;
}
@@ -954,6 +1001,7 @@ evolution_shell_component_construct (EvolutionShellComponent *shell_component,
EvolutionShellComponentRemoveFolderFn remove_folder_fn,
EvolutionShellComponentXferFolderFn xfer_folder_fn,
EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn,
+ EvolutionShellComponentUnpopulateFolderContextMenuFn unpopulate_folder_context_menu_fn,
EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn,
EvolutionShellComponentRequestQuitFn request_quit_fn,
void *closure)
@@ -967,13 +1015,14 @@ evolution_shell_component_construct (EvolutionShellComponent *shell_component,
priv = shell_component->priv;
- priv->create_view_fn = create_view_fn;
- priv->create_folder_fn = create_folder_fn;
- priv->remove_folder_fn = remove_folder_fn;
- priv->xfer_folder_fn = xfer_folder_fn;
- priv->populate_folder_context_menu_fn = populate_folder_context_menu_fn;
- priv->get_dnd_selection_fn = get_dnd_selection_fn;
- priv->request_quit_fn = request_quit_fn;
+ priv->create_view_fn = create_view_fn;
+ priv->create_folder_fn = create_folder_fn;
+ priv->remove_folder_fn = remove_folder_fn;
+ priv->xfer_folder_fn = xfer_folder_fn;
+ priv->populate_folder_context_menu_fn = populate_folder_context_menu_fn;
+ priv->unpopulate_folder_context_menu_fn = unpopulate_folder_context_menu_fn;
+ priv->get_dnd_selection_fn = get_dnd_selection_fn;
+ priv->request_quit_fn = request_quit_fn;
priv->closure = closure;
@@ -1018,6 +1067,7 @@ evolution_shell_component_new (const EvolutionShellComponentFolderType folder_ty
EvolutionShellComponentRemoveFolderFn remove_folder_fn,
EvolutionShellComponentXferFolderFn xfer_folder_fn,
EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn,
+ EvolutionShellComponentUnpopulateFolderContextMenuFn unpopulate_folder_context_menu_fn,
EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn,
EvolutionShellComponentRequestQuitFn request_quit_fn,
void *closure)
@@ -1036,6 +1086,7 @@ evolution_shell_component_new (const EvolutionShellComponentFolderType folder_ty
remove_folder_fn,
xfer_folder_fn,
populate_folder_context_menu_fn,
+ unpopulate_folder_context_menu_fn,
get_dnd_selection_fn,
request_quit_fn,
closure);
diff --git a/shell/evolution-shell-component.h b/shell/evolution-shell-component.h
index 1689c59822..c162e1e8a6 100644
--- a/shell/evolution-shell-component.h
+++ b/shell/evolution-shell-component.h
@@ -103,6 +103,11 @@ typedef void (* EvolutionShellComponentPopulateFolderContextMenuFn) (EvolutionSh
const char *physical_uri,
const char *type,
void *closure);
+typedef void (* EvolutionShellComponentUnpopulateFolderContextMenuFn) (EvolutionShellComponent *shell_component,
+ BonoboUIComponent *uic,
+ const char *physical_uri,
+ const char *type,
+ void *closure);
typedef char * (* EvolutionShellComponentGetDndSelectionFn) (EvolutionShellComponent *shell_component,
const char *physical_uri,
int type,
@@ -166,27 +171,29 @@ struct _EvolutionShellComponentClass {
GtkType evolution_shell_component_get_type (void);
-void evolution_shell_component_construct (EvolutionShellComponent *shell_component,
- const EvolutionShellComponentFolderType folder_types[],
- const char *external_uri_schemas[],
- EvolutionShellComponentCreateViewFn create_view_fn,
- EvolutionShellComponentCreateFolderFn create_folder_fn,
- EvolutionShellComponentRemoveFolderFn remove_folder_fn,
- EvolutionShellComponentXferFolderFn xfer_folder_fn,
- EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn,
- EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn,
- EvolutionShellComponentRequestQuitFn request_quit_fn,
- void *closure);
-EvolutionShellComponent *evolution_shell_component_new (const EvolutionShellComponentFolderType folder_types[],
- const char *external_uri_schemas[],
- EvolutionShellComponentCreateViewFn create_view_fn,
- EvolutionShellComponentCreateFolderFn create_folder_fn,
- EvolutionShellComponentRemoveFolderFn remove_folder_fn,
- EvolutionShellComponentXferFolderFn xfer_folder_fn,
- EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn,
- EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn,
- EvolutionShellComponentRequestQuitFn request_quit_fn,
- void *closure);
+void evolution_shell_component_construct (EvolutionShellComponent *shell_component,
+ const EvolutionShellComponentFolderType folder_types[],
+ const char *external_uri_schemas[],
+ EvolutionShellComponentCreateViewFn create_view_fn,
+ EvolutionShellComponentCreateFolderFn create_folder_fn,
+ EvolutionShellComponentRemoveFolderFn remove_folder_fn,
+ EvolutionShellComponentXferFolderFn xfer_folder_fn,
+ EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn,
+ EvolutionShellComponentUnpopulateFolderContextMenuFn unpopulate_folder_context_menu_fn,
+ EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn,
+ EvolutionShellComponentRequestQuitFn request_quit_fn,
+ void *closure);
+EvolutionShellComponent *evolution_shell_component_new (const EvolutionShellComponentFolderType folder_types[],
+ const char *external_uri_schemas[],
+ EvolutionShellComponentCreateViewFn create_view_fn,
+ EvolutionShellComponentCreateFolderFn create_folder_fn,
+ EvolutionShellComponentRemoveFolderFn remove_folder_fn,
+ EvolutionShellComponentXferFolderFn xfer_folder_fn,
+ EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn,
+ EvolutionShellComponentUnpopulateFolderContextMenuFn unpopulate_folder_context_menu_fn,
+ EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn,
+ EvolutionShellComponentRequestQuitFn request_quit_fn,
+ void *closure);
EvolutionShellClient *evolution_shell_component_get_owner (EvolutionShellComponent *shell_component);
void evolution_shell_component_add_user_creatable_item (EvolutionShellComponent *shell_component,
diff --git a/shell/evolution-test-component.c b/shell/evolution-test-component.c
index bdc59073b8..18e11e65e7 100644
--- a/shell/evolution-test-component.c
+++ b/shell/evolution-test-component.c
@@ -595,7 +595,7 @@ register_component (void)
shell_component = evolution_shell_component_new (folder_types,
NULL,
create_view_fn,
- NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
request_quit_fn,
NULL);