aboutsummaryrefslogtreecommitdiffstats
path: root/shell/e-shell-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/e-shell-view.c')
-rw-r--r--shell/e-shell-view.c265
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: