diff options
Diffstat (limited to 'shell/e-shell-view.c')
-rw-r--r-- | shell/e-shell-view.c | 137 |
1 files changed, 71 insertions, 66 deletions
diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c index 7387781e54..650e76030d 100644 --- a/shell/e-shell-view.c +++ b/shell/e-shell-view.c @@ -275,6 +275,27 @@ cleanup_delayed_selection (EShellView *shell_view) } } +static GtkWidget * +find_socket (GtkContainer *container) +{ + GList *children, *tmp; + + children = gtk_container_children (container); + while (children) { + if (BONOBO_IS_SOCKET (children->data)) + return children->data; + else if (GTK_IS_CONTAINER (children->data)) { + GtkWidget *socket = find_socket (children->data); + if (socket) + return socket; + } + tmp = children->next; + g_list_free_1 (children); + children = tmp; + } + return NULL; +} + static void setup_verb_sensitivity_for_folder (EShellView *shell_view, const char *path) @@ -309,6 +330,51 @@ setup_verb_sensitivity_for_folder (EShellView *shell_view, } +/* Callbacks for the EStorageSet. */ + +static void +storage_set_removed_folder_callback (EStorageSet *storage_set, + const char *path, + void *data) +{ + EShellView *shell_view; + EShellViewPrivate *priv; + GtkWidget *socket; + View *view; + int destroy_connection_id; + int page_num; + char *uri; + + shell_view = E_SHELL_VIEW (data); + priv = shell_view->priv; + + uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); + view = g_hash_table_lookup (priv->uri_to_view, uri); + g_free (uri); + + if (view == NULL) + return; + + socket = find_socket (GTK_CONTAINER (view->control)); + priv->sockets = g_list_remove (priv->sockets, socket); + + destroy_connection_id = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (socket), + "e_shell_view_destroy_connection_id")); + gtk_signal_disconnect (GTK_OBJECT (socket), destroy_connection_id); + + page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), view->control); + + gtk_widget_destroy (view->control); + + g_hash_table_remove (priv->uri_to_view, view->uri); + view_destroy (view); + + gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), page_num); + + e_shell_view_display_uri (shell_view, E_SHELL_VIEW_DEFAULT_URI); +} + + /* Folder bar pop-up handling. */ static void @@ -1331,8 +1397,11 @@ e_shell_view_construct (EShellView *shell_view, bonobo_ui_component_thaw (priv->ui_component, NULL); gtk_signal_connect_while_alive (GTK_OBJECT (shell), "line_status_changed", - GTK_SIGNAL_FUNC (shell_line_status_changed_cb), view, - GTK_OBJECT (view)); + GTK_SIGNAL_FUNC (shell_line_status_changed_cb), shell_view, + GTK_OBJECT (shell_view)); + + gtk_signal_connect (GTK_OBJECT (e_shell_get_storage_set (shell)), "removed_folder", + GTK_SIGNAL_FUNC (storage_set_removed_folder_callback), shell_view); e_shell_user_creatable_items_handler_setup_menus (e_shell_get_user_creatable_items_handler (priv->shell), shell_view); @@ -1664,27 +1733,6 @@ setup_corba_interface (EShellView *shell_view, /* Socket destruction handling. */ -static GtkWidget * -find_socket (GtkContainer *container) -{ - GList *children, *tmp; - - children = gtk_container_children (container); - while (children) { - if (BONOBO_IS_SOCKET (children->data)) - return children->data; - else if (GTK_IS_CONTAINER (children->data)) { - GtkWidget *socket = find_socket (children->data); - if (socket) - return socket; - } - tmp = children->next; - g_list_free_1 (children); - children = tmp; - } - return NULL; -} - static void socket_destroy_cb (GtkWidget *socket_widget, gpointer data) { @@ -2015,49 +2063,6 @@ e_shell_view_display_uri (EShellView *shell_view, return retval; } -gboolean -e_shell_view_remove_control_for_uri (EShellView *shell_view, - const char *uri) -{ - EShellViewPrivate *priv; - View *view; - GtkWidget *socket; - GtkWidget *control; - int page_num; - int destroy_connection_id; - - g_return_val_if_fail (shell_view != NULL, FALSE); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE); - - priv = shell_view->priv; - - /* Get the control, remove it from our hash of controls */ - view = g_hash_table_lookup (priv->uri_to_view, uri); - if (view == NULL) { - g_message ("Trying to remove view for non-existing URI -- %s", uri); - return FALSE; - } - - control = view->control; - g_hash_table_remove (priv->uri_to_view, view->uri); - view_destroy (view); - - /* Get the socket, remove it from our list of sockets */ - socket = find_socket (GTK_CONTAINER (control)); - priv->sockets = g_list_remove (priv->sockets, socket); - - /* disconnect from the destroy signal */ - destroy_connection_id = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (socket), - "e_shell_view_destroy_connection_id")); - gtk_signal_disconnect (GTK_OBJECT (socket), destroy_connection_id); - - /* Remove the notebook page, destroying the control and socket */ - page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), control); - gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), page_num); - - return TRUE; -} - void e_shell_view_show_shortcut_bar (EShellView *shell_view, |