diff options
Diffstat (limited to 'shell/e-shell-view.c')
-rw-r--r-- | shell/e-shell-view.c | 265 |
1 files changed, 86 insertions, 179 deletions
diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c index c7e68613eb..f1a03a772b 100644 --- a/shell/e-shell-view.c +++ b/shell/e-shell-view.c @@ -56,7 +56,6 @@ #include "evolution-shell-view.h" #include "e-gray-bar.h" -#include "e-history.h" #include "e-shell-constants.h" #include "e-shell-folder-title-bar.h" #include "e-shell-utils.h" @@ -90,9 +89,6 @@ struct _EShellViewPrivate { BonoboUIComponent *ui_component; BonoboUIContainer *ui_container; - /* History of visited (evolution:) URIs. */ - EHistory *history; - /* Currently displayed URI. */ char *uri; @@ -151,7 +147,6 @@ struct _EShellViewPrivate { enum { SHORTCUT_BAR_VISIBILITY_CHANGED, FOLDER_BAR_VISIBILITY_CHANGED, - VIEW_CHANGED, LAST_SIGNAL }; @@ -188,7 +183,6 @@ static const char *get_storage_set_path_from_uri (const char *uri); /* Boo. */ static void new_folder_cb (EStorageSet *storage_set, const char *path, void *data); -static gboolean display_uri (EShellView *shell_view, const char *uri, gboolean add_to_history); /* View handling. */ @@ -320,42 +314,6 @@ setup_verb_sensitivity_for_folder (EShellView *shell_view, bonobo_ui_component_set_prop (ui_component, "/commands/RenameFolder", "sensitive", prop, NULL); } - -static void -update_navigation_buttons (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - e_shell_folder_title_bar_update_navigation_buttons (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), - e_history_has_prev (priv->history), - e_history_has_next (priv->history)); -} - -static int -history_uri_matching_func (const void *a, - const void *b) -{ - const char *s1, *s2; - - s1 = (const char *) a; - s2 = (const char *) b; - - return strcmp (s1, s2); -} - -static void -remove_uri_from_history (EShellView *shell_view, - const char *uri) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - e_history_remove_matching (priv->history, uri, history_uri_matching_func); -} - /* This implements the behavior for when the folder which is currently displayed gets deleted. */ @@ -496,16 +454,7 @@ storage_set_removed_folder_callback (EStorageSet *storage_set, priv = shell_view->priv; uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); - - remove_uri_from_history (shell_view, uri); - update_navigation_buttons (shell_view); - - /* (Note that at this point the current URI in the history might have - been changed and not match the current view. But we catch this case - when checking if this was the current view, below.) */ - view = g_hash_table_lookup (priv->uri_to_view, uri); - g_free (uri); if (view == NULL) @@ -873,6 +822,23 @@ folder_selected_cb (EStorageSetView *storage_set_view, switch_on_folder_tree_click (shell_view, path); } +/* Callback called when a storage in the tree view is clicked. */ +static void +storage_selected_cb (EStorageSetView *storage_set_view, + const char *name, + void *data) +{ + EShellView *shell_view; + char *path; + + shell_view = E_SHELL_VIEW (data); + + path = g_strconcat (G_DIR_SEPARATOR_S, name, NULL); + switch_on_folder_tree_click (shell_view, path); + + g_free (path); +} + /* Callbacks for the folder context menu in the folder bar. */ static void @@ -955,47 +921,6 @@ offline_toggle_clicked_cb (GtkButton *button, } -/* Navigation button callbacks. */ - -static void -back_clicked_callback (EShellFolderTitleBar *title_bar, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - const char *new_uri; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - if (! e_history_has_prev (priv->history)) - return; - - new_uri = (const char *) e_history_prev (priv->history); - - display_uri (shell_view, new_uri, FALSE); -} - -static void -forward_clicked_callback (EShellFolderTitleBar *title_bar, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - const char *new_uri; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - if (! e_history_has_next (priv->history)) - return; - - new_uri = (const char *) e_history_next (priv->history); - - display_uri (shell_view, new_uri, FALSE); -} - - /* Widget setup. */ static void @@ -1008,10 +933,12 @@ setup_storage_set_subwindow (EShellView *shell_view) priv = shell_view->priv; - storage_set_view = e_storage_set_new_view (e_shell_get_storage_set (priv->shell), + storage_set_view = e_storage_set_view_new (e_shell_get_storage_set (priv->shell), priv->ui_container); gtk_signal_connect (GTK_OBJECT (storage_set_view), "folder_selected", GTK_SIGNAL_FUNC (folder_selected_cb), shell_view); + gtk_signal_connect (GTK_OBJECT (storage_set_view), "storage_selected", + GTK_SIGNAL_FUNC (storage_selected_cb), shell_view); gtk_signal_connect (GTK_OBJECT (storage_set_view), "folder_context_menu_popping_up", GTK_SIGNAL_FUNC (folder_context_menu_popping_up_cb), shell_view); gtk_signal_connect (GTK_OBJECT (storage_set_view), "folder_context_menu_popped_down", @@ -1216,10 +1143,6 @@ setup_widgets (EShellView *shell_view) priv->folder_title_bar = e_shell_folder_title_bar_new (); gtk_signal_connect (GTK_OBJECT (priv->folder_title_bar), "title_toggled", GTK_SIGNAL_FUNC (title_bar_toggled_cb), shell_view); - gtk_signal_connect (GTK_OBJECT (priv->folder_title_bar), "back_clicked", - GTK_SIGNAL_FUNC (back_clicked_callback), shell_view); - gtk_signal_connect (GTK_OBJECT (priv->folder_title_bar), "forward_clicked", - GTK_SIGNAL_FUNC (forward_clicked_callback), shell_view); priv->view_hpaned = e_hpaned_new (); e_paned_pack1 (E_PANED (priv->view_hpaned), priv->storage_set_view_box, FALSE, FALSE); @@ -1303,15 +1226,8 @@ destroy (GtkObject *object) storage set used for the delayed selection mechanism. */ cleanup_delayed_selection (shell_view); - /* This is necessary to remove the signal handler for folder_new on the - storage set used for the delayed selection mechanism. */ - cleanup_delayed_selection (shell_view); - gtk_object_unref (GTK_OBJECT (priv->tooltips)); - if (priv->history != NULL) - gtk_object_unref (GTK_OBJECT (priv->history)); - if (priv->shell != NULL) bonobo_object_unref (BONOBO_OBJECT (priv->shell)); @@ -1382,18 +1298,6 @@ class_init (EShellViewClass *klass) GTK_TYPE_NONE, 1, GTK_TYPE_INT); - signals[VIEW_CHANGED] - = gtk_signal_new ("view_changed", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EShellViewClass, view_changed), - e_marshal_NONE__POINTER_POINTER_POINTER_POINTER, - GTK_TYPE_NONE, 4, - GTK_TYPE_STRING, - GTK_TYPE_STRING, - GTK_TYPE_STRING, - GTK_TYPE_STRING); - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); load_images (); @@ -1409,7 +1313,6 @@ init (EShellView *shell_view) priv->shell = NULL; priv->corba_interface = NULL; priv->ui_component = NULL; - priv->history = e_history_new ((EHistoryItemFreeFunc) g_free); priv->uri = NULL; priv->delayed_selection = NULL; @@ -1635,8 +1538,8 @@ e_shell_view_construct (EShellView *shell_view, GTK_SIGNAL_FUNC (storage_set_removed_folder_callback), shell_view, GTK_OBJECT (shell_view)); - e_shell_user_creatable_items_handler_attach_menus (e_shell_get_user_creatable_items_handler (priv->shell), - shell_view); + e_shell_user_creatable_items_handler_setup_menus (e_shell_get_user_creatable_items_handler (priv->shell), + shell_view); return view; } @@ -1783,19 +1686,30 @@ update_for_current_uri (EShellView *shell_view) path = get_storage_set_path_from_uri (priv->uri); - folder = NULL; folder_name = NULL; type = NULL; unread_count = 0; - if (path != NULL) { + if (path == NULL) { + folder = NULL; + } else { folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell), path); if (folder != NULL) { folder_name = e_folder_get_name (folder); type = e_folder_get_type_string (folder); unread_count = e_folder_get_unread_count (folder); - } + } else if (path != NULL) { + EStorage *storage; + + storage = e_storage_set_get_storage (e_shell_get_storage_set (priv->shell), path + 1); + unread_count = 0; + + if (storage != NULL) { + folder_name = e_storage_get_display_name (storage); + type = e_storage_get_toplevel_node_type (storage); + } + } } if (unread_count > 0) @@ -1896,6 +1810,7 @@ set_current_notebook_page (EShellView *shell_view, if (current_page != -1 && current_page != 0) { current = gtk_notebook_get_nth_page (notebook, current_page); + old_control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (current)); bonobo_control_frame_set_autoactivate (old_control_frame, FALSE); } @@ -1990,10 +1905,17 @@ socket_destroy_cb (GtkWidget *socket_widget, gpointer data) path = get_storage_set_path_from_uri (uri); folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell), path); - if (folder != NULL) + if (folder != NULL) { folder_type = e_folder_get_type_string (folder); - else - folder_type = NULL; + } else { + EStorage *storage; + + storage = e_storage_set_get_storage (e_shell_get_storage_set (priv->shell), path + 1); + if (storage == NULL) + folder_type = NULL; + else + folder_type = e_storage_get_toplevel_node_type (storage); + } /* See if we were actively viewing the uri for the socket that's being closed */ current_uri = e_shell_view_get_current_uri (shell_view); @@ -2018,6 +1940,27 @@ socket_destroy_cb (GtkWidget *socket_widget, gpointer data) static const char * +get_type_for_storage (EShellView *shell_view, + const char *name, + const char **physical_uri_return) +{ + EShellViewPrivate *priv; + EStorageSet *storage_set; + EStorage *storage; + + priv = shell_view->priv; + + storage_set = e_shell_get_storage_set (priv->shell); + storage = e_storage_set_get_storage (storage_set, name); + if (!storage) + return NULL; + + *physical_uri_return = e_storage_get_toplevel_node_uri (storage); + + return e_storage_get_toplevel_node_type (storage); +} + +static const char * get_type_for_folder (EShellView *shell_view, const char *path, const char **physical_uri_return) @@ -2054,6 +1997,7 @@ get_view_for_uri (EShellView *shell_view, GtkWidget *socket; Bonobo_Control corba_control; const char *path; + const char *slash; const char *physical_uri; const char *folder_type; int destroy_connection_id; @@ -2068,8 +2012,13 @@ get_view_for_uri (EShellView *shell_view, if (*path == '\0') return NULL; - folder_type = get_type_for_folder (shell_view, path, &physical_uri); - if (folder_type == NULL || strcmp (folder_type, "noselect") == 0) + /* FIXME: This code needs to be made more robust. */ + slash = strchr (path + 1, G_DIR_SEPARATOR); + if (slash == NULL || slash[1] == '\0') + folder_type = get_type_for_storage (shell_view, path + 1, &physical_uri); + else + folder_type = get_type_for_folder (shell_view, path, &physical_uri); + if (folder_type == NULL) return NULL; folder_type_registry = e_shell_get_folder_type_registry (e_shell_view_get_shell (shell_view)); @@ -2164,22 +2113,18 @@ create_new_view_for_uri (EShellView *shell_view, return TRUE; } -static gboolean -display_uri (EShellView *shell_view, - const char *uri, - gboolean add_to_history) +gboolean +e_shell_view_display_uri (EShellView *shell_view, + const char *uri) { EShellViewPrivate *priv; View *view; gboolean retval; - priv = shell_view->priv; - - if (uri == NULL && priv->uri == NULL) - return TRUE; + g_return_val_if_fail (shell_view != NULL, FALSE); + g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE); - if (priv->uri != NULL && uri != NULL && strcmp (priv->uri, uri) == 0) - return TRUE; + priv = shell_view->priv; bonobo_window_freeze (BONOBO_WINDOW (shell_view)); @@ -2217,11 +2162,6 @@ display_uri (EShellView *shell_view, retval = TRUE; end: - if (add_to_history && retval == TRUE && priv->uri != NULL) - e_history_add (priv->history, g_strdup (priv->uri)); - - update_navigation_buttons (shell_view); - g_free (priv->set_folder_uri); priv->set_folder_uri = NULL; @@ -2234,25 +2174,9 @@ display_uri (EShellView *shell_view, bonobo_window_thaw (BONOBO_WINDOW (shell_view)); - gtk_signal_emit (GTK_OBJECT (shell_view), signals[VIEW_CHANGED], - e_shell_view_get_current_path (shell_view), - e_shell_view_get_current_uri (shell_view), - e_shell_view_get_current_folder_type (shell_view), - e_shell_view_get_current_component_id (shell_view)); - return retval; } -gboolean -e_shell_view_display_uri (EShellView *shell_view, - const char *uri) -{ - g_return_val_if_fail (shell_view != NULL, FALSE); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE); - - return display_uri (shell_view, uri, TRUE); -} - void e_shell_view_show_shortcut_bar (EShellView *shell_view, @@ -2310,8 +2234,8 @@ e_shell_view_show_folder_bar (EShellView *shell_view, e_title_bar_set_button_mode (E_TITLE_BAR (priv->storage_set_title_bar), E_TITLE_BAR_BUTTON_MODE_CLOSE); - e_shell_folder_title_bar_set_title_clickable (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), - FALSE); + e_shell_folder_title_bar_set_clickable (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), + FALSE); } else { if (GTK_WIDGET_VISIBLE (priv->storage_set_view_box)) { /* FIXME this is a private field! */ @@ -2324,8 +2248,8 @@ e_shell_view_show_folder_bar (EShellView *shell_view, e_title_bar_set_button_mode (E_TITLE_BAR (priv->storage_set_title_bar), E_TITLE_BAR_BUTTON_MODE_PIN); - e_shell_folder_title_bar_set_title_clickable (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), - TRUE); + e_shell_folder_title_bar_set_clickable (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), + TRUE); } priv->folder_bar_shown = !! show; @@ -2475,23 +2399,6 @@ e_shell_view_get_current_folder_type (EShellView *shell_view) return get_type_for_folder (shell_view, current_path, NULL); } -const char * -e_shell_view_get_current_component_id (EShellView *shell_view) -{ - EShellViewPrivate *priv; - EFolderTypeRegistry *type_registry; - EvolutionShellComponentClient *component_client; - const char *current_folder_type; - - priv = shell_view->priv; - - type_registry = e_shell_get_folder_type_registry (priv->shell); - current_folder_type = e_shell_view_get_current_folder_type (shell_view); - component_client = e_folder_type_registry_get_handler_for_type (type_registry, current_folder_type); - - return evolution_shell_component_client_get_id (component_client); -} - /** * e_shell_view_save_settings: |