diff options
Diffstat (limited to 'mail/e-mail-shell-content.c')
-rw-r--r-- | mail/e-mail-shell-content.c | 1053 |
1 files changed, 0 insertions, 1053 deletions
diff --git a/mail/e-mail-shell-content.c b/mail/e-mail-shell-content.c deleted file mode 100644 index b801093116..0000000000 --- a/mail/e-mail-shell-content.c +++ /dev/null @@ -1,1053 +0,0 @@ -/* - * e-mail-shell-content.c - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#include "e-mail-shell-content.h" - -#include <glib/gi18n.h> -#include <camel/camel-store.h> -#include <libedataserver/e-data-server-util.h> - -#include "e-util/gconf-bridge.h" -#include "widgets/menus/gal-view-etable.h" -#include "widgets/menus/gal-view-instance.h" - -#include "em-search-context.h" -#include "em-utils.h" -#include "mail-config.h" -#include "mail-ops.h" - -#include "e-mail-reader.h" -#include "e-mail-search-bar.h" -#include "e-mail-shell-backend.h" -#include "e-mail-shell-view-actions.h" - -#define E_MAIL_SHELL_CONTENT_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE \ - ((obj), E_TYPE_MAIL_SHELL_CONTENT, EMailShellContentPrivate)) - -#define STATE_KEY_SCROLLBAR_POSITION "ScrollbarPosition" -#define STATE_KEY_SELECTED_MESSAGE "SelectedMessage" - -struct _EMailShellContentPrivate { - GtkWidget *paned; - GtkWidget *message_list; - GtkWidget *search_bar; - - EMFormatHTMLDisplay *html_display; - GalViewInstance *view_instance; - - /* ETable scrolling hack */ - gdouble default_scrollbar_position; - - guint paned_binding_id; - guint scroll_timeout_id; - - /* Signal handler IDs */ - guint message_list_built_id; - guint message_list_scrolled_id; - - guint preview_visible : 1; - guint suppress_message_selection : 1; - guint vertical_view : 1; - guint show_deleted : 1; -}; - -enum { - PROP_0, - PROP_PREVIEW_VISIBLE, - PROP_SHOW_DELETED, - PROP_VERTICAL_VIEW -}; - -static gpointer parent_class; -static GType mail_shell_content_type; - -static void -mail_shell_content_etree_unfreeze (MessageList *message_list, - GdkEvent *event) -{ - ETableItem *item; - GObject *object; - - item = e_tree_get_item (message_list->tree); - object = G_OBJECT (((GnomeCanvasItem *) item)->canvas); - - g_object_set_data (object, "freeze-cursor", 0); -} - -static void -mail_shell_content_message_list_scrolled_cb (EMailShellContent *mail_shell_content, - MessageList *message_list) -{ - EShellContent *shell_content; - EShellView *shell_view; - GKeyFile *key_file; - const gchar *folder_uri; - const gchar *key; - gchar *group_name; - gdouble position; - - /* Save the scrollbar position for the current folder. */ - - folder_uri = message_list->folder_uri; - - if (folder_uri == NULL) - return; - - shell_content = E_SHELL_CONTENT (mail_shell_content); - shell_view = e_shell_content_get_shell_view (shell_content); - key_file = e_shell_view_get_state_key_file (shell_view); - - key = STATE_KEY_SCROLLBAR_POSITION; - group_name = g_strdup_printf ("Folder %s", folder_uri); - position = message_list_get_scrollbar_position (message_list); - - g_key_file_set_double (key_file, group_name, key, position); - e_shell_view_set_state_dirty (shell_view); - - g_free (group_name); -} - -static gboolean -mail_shell_content_scroll_timeout_cb (EMailShellContent *mail_shell_content) -{ - EMailShellContentPrivate *priv = mail_shell_content->priv; - EShellContent *shell_content; - EShellView *shell_view; - MessageList *message_list; - EMailReader *reader; - GKeyFile *key_file; - const gchar *folder_uri; - const gchar *key; - gchar *group_name; - - /* Initialize the scrollbar position for the current folder - * and setup a callback to handle scrollbar position changes. */ - - shell_content = E_SHELL_CONTENT (mail_shell_content); - shell_view = e_shell_content_get_shell_view (shell_content); - key_file = e_shell_view_get_state_key_file (shell_view); - - reader = E_MAIL_READER (mail_shell_content); - message_list = e_mail_reader_get_message_list (reader); - folder_uri = message_list->folder_uri; - - if (folder_uri == NULL) - goto skip; - - /* Restore the message list scrollbar position. */ - - key = STATE_KEY_SCROLLBAR_POSITION; - group_name = g_strdup_printf ("Folder %s", folder_uri); - - if (g_key_file_has_key (key_file, group_name, key, NULL)) { - gdouble position; - - position = g_key_file_get_double ( - key_file, group_name, key, NULL); - message_list_set_scrollbar_position (message_list, position); - } - - g_free (group_name); - -skip: - priv->message_list_scrolled_id = g_signal_connect_swapped ( - message_list, "message-list-scrolled", - G_CALLBACK (mail_shell_content_message_list_scrolled_cb), - mail_shell_content); - - priv->scroll_timeout_id = 0; - - return FALSE; -} - -static void -mail_shell_content_message_list_built_cb (EMailShellContent *mail_shell_content, - MessageList *message_list) -{ - EMailShellContentPrivate *priv = mail_shell_content->priv; - EShellContent *shell_content; - EShellView *shell_view; - GtkScrolledWindow *scrolled_window; - GtkWidget *vscrollbar; - GKeyFile *key_file; - gchar *uid; - - g_signal_handler_disconnect ( - message_list, priv->message_list_built_id); - priv->message_list_built_id = 0; - - shell_content = E_SHELL_CONTENT (mail_shell_content); - shell_view = e_shell_content_get_shell_view (shell_content); - key_file = e_shell_view_get_state_key_file (shell_view); - - if (message_list->cursor_uid != NULL) - uid = NULL; - - else if (message_list->folder_uri == NULL) - uid = NULL; - - else if (mail_shell_content->priv->suppress_message_selection) - uid = NULL; - - else { - const gchar *folder_uri; - const gchar *key; - gchar *group_name; - - key = STATE_KEY_SELECTED_MESSAGE; - folder_uri = message_list->folder_uri; - group_name = g_strdup_printf ("Folder %s", folder_uri); - uid = g_key_file_get_string (key_file, group_name, key, NULL); - g_free (group_name); - } - - if (uid != NULL) { - CamelFolder *folder; - CamelMessageInfo *info; - - folder = message_list->folder; - info = camel_folder_get_message_info (folder, uid); - if (info != NULL) { - EMailReader *reader; - - reader = E_MAIL_READER (mail_shell_content); - e_mail_reader_set_message (reader, uid, TRUE); - camel_folder_free_message_info (folder, info); - } - - g_free (uid); - } - - /* FIXME This is a gross workaround for an ETable bug that I can't - * fix (Ximian bug #55303). - * - * Since e_canvas_item_region_show_relay() uses a timeout, - * we have to use a timeout of the same interval but a lower - * priority. */ - priv->scroll_timeout_id = g_timeout_add_full ( - G_PRIORITY_LOW, 250, (GSourceFunc) - mail_shell_content_scroll_timeout_cb, - mail_shell_content, NULL); - - /* FIXME This is another ugly hack to hide a side-effect of the - * previous workaround. */ - scrolled_window = GTK_SCROLLED_WINDOW (message_list); - vscrollbar = gtk_scrolled_window_get_vscrollbar (scrolled_window); - g_signal_connect_swapped ( - vscrollbar, "button-press-event", - G_CALLBACK (mail_shell_content_etree_unfreeze), - message_list); -} - -static void -mail_shell_content_display_view_cb (EMailShellContent *mail_shell_content, - GalView *gal_view) -{ - EMailReader *reader; - MessageList *message_list; - - reader = E_MAIL_READER (mail_shell_content); - message_list = e_mail_reader_get_message_list (reader); - - if (GAL_IS_VIEW_ETABLE (gal_view)) - gal_view_etable_attach_tree ( - GAL_VIEW_ETABLE (gal_view), message_list->tree); -} - -static void -mail_shell_content_message_selected_cb (EMailShellContent *mail_shell_content, - const gchar *message_uid, - MessageList *message_list) -{ - EShellContent *shell_content; - EShellView *shell_view; - GKeyFile *key_file; - const gchar *folder_uri; - const gchar *key; - gchar *group_name; - - folder_uri = message_list->folder_uri; - - /* This also gets triggered when selecting a store name on - * the sidebar such as "On This Computer", in which case - * 'folder_uri' will be NULL. */ - if (folder_uri == NULL) - return; - - shell_content = E_SHELL_CONTENT (mail_shell_content); - shell_view = e_shell_content_get_shell_view (shell_content); - key_file = e_shell_view_get_state_key_file (shell_view); - - key = STATE_KEY_SELECTED_MESSAGE; - group_name = g_strdup_printf ("Folder %s", folder_uri); - - if (message_uid != NULL) - g_key_file_set_string (key_file, group_name, key, message_uid); - else - g_key_file_remove_key (key_file, group_name, key, NULL); - e_shell_view_set_state_dirty (shell_view); - - g_free (group_name); -} - -static void -mail_shell_content_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (property_id) { - case PROP_PREVIEW_VISIBLE: - e_mail_shell_content_set_preview_visible ( - E_MAIL_SHELL_CONTENT (object), - g_value_get_boolean (value)); - return; - - case PROP_SHOW_DELETED: - e_mail_shell_content_set_show_deleted ( - E_MAIL_SHELL_CONTENT (object), - g_value_get_boolean (value)); - return; - - case PROP_VERTICAL_VIEW: - e_mail_shell_content_set_vertical_view ( - E_MAIL_SHELL_CONTENT (object), - g_value_get_boolean (value)); - return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -} - -static void -mail_shell_content_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - switch (property_id) { - case PROP_PREVIEW_VISIBLE: - g_value_set_boolean ( - value, - e_mail_shell_content_get_preview_visible ( - E_MAIL_SHELL_CONTENT (object))); - return; - - case PROP_SHOW_DELETED: - g_value_set_boolean ( - value, - e_mail_shell_content_get_show_deleted ( - E_MAIL_SHELL_CONTENT (object))); - return; - - case PROP_VERTICAL_VIEW: - g_value_set_boolean ( - value, - e_mail_shell_content_get_vertical_view ( - E_MAIL_SHELL_CONTENT (object))); - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -} - -static void -mail_shell_content_dispose (GObject *object) -{ - EMailShellContentPrivate *priv; - - priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (object); - - if (priv->paned != NULL) { - g_object_unref (priv->paned); - priv->paned = NULL; - } - - if (priv->message_list != NULL) { - g_object_unref (priv->message_list); - priv->message_list = NULL; - } - - if (priv->search_bar != NULL) { - g_object_unref (priv->search_bar); - priv->search_bar = NULL; - } - - if (priv->html_display != NULL) { - g_object_unref (priv->html_display); - priv->html_display = NULL; - } - - if (priv->view_instance != NULL) { - g_object_unref (priv->view_instance); - priv->view_instance = NULL; - } - - /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static void -mail_shell_content_constructed (GObject *object) -{ - EMailShellContentPrivate *priv; - EShellContent *shell_content; - EShellBackend *shell_backend; - EShellView *shell_view; - EShellViewClass *shell_view_class; - EMailReader *reader; - MessageList *message_list; - GConfBridge *bridge; - GtkWidget *container; - GtkWidget *widget; - GtkHTML *html; - GalViewCollection *view_collection; - const gchar *key; - - priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (object); - priv->html_display = em_format_html_display_new (); - - /* Chain up to parent's constructed() method. */ - G_OBJECT_CLASS (parent_class)->constructed (object); - - shell_content = E_SHELL_CONTENT (object); - shell_view = e_shell_content_get_shell_view (shell_content); - shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view); - shell_backend = e_shell_view_get_shell_backend (shell_view); - view_collection = shell_view_class->view_collection; - - html = EM_FORMAT_HTML (priv->html_display)->html; - - /* Build content widgets. */ - - container = GTK_WIDGET (object); - - widget = gtk_vpaned_new (); - gtk_container_add (GTK_CONTAINER (container), widget); - priv->paned = g_object_ref (widget); - gtk_widget_show (widget); - - container = widget; - - widget = message_list_new (shell_backend); - gtk_paned_add1 (GTK_PANED (container), widget); - priv->message_list = g_object_ref (widget); - gtk_widget_show (widget); - - widget = gtk_vbox_new (FALSE, 1); - gtk_paned_add2 (GTK_PANED (container), widget); - gtk_widget_show (widget); - - container = widget; - - widget = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy ( - GTK_SCROLLED_WINDOW (widget), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type ( - GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (widget), GTK_WIDGET (html)); - gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); - gtk_widget_show (GTK_WIDGET (html)); - gtk_widget_show (widget); - - widget = e_mail_search_bar_new (html); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - priv->search_bar = g_object_ref (widget); - gtk_widget_hide (widget); - - g_signal_connect_swapped ( - widget, "changed", - G_CALLBACK (em_format_redraw), priv->html_display); - - /* Load the view instance. */ - - e_mail_shell_content_update_view_instance ( - E_MAIL_SHELL_CONTENT (shell_content)); - - /* Bind GObject properties to GConf keys. */ - - bridge = gconf_bridge_get (); - - object = G_OBJECT (priv->paned); - key = "/apps/evolution/mail/display/paned_size"; - gconf_bridge_bind_property_delayed (bridge, key, object, "position"); - - object = G_OBJECT (shell_content); - key = "/apps/evolution/mail/display/show_deleted"; - gconf_bridge_bind_property (bridge, key, object, "show-deleted"); - - /* Message list customizations. */ - - reader = E_MAIL_READER (shell_content); - message_list = e_mail_reader_get_message_list (reader); - - g_signal_connect_swapped ( - message_list, "message-selected", - G_CALLBACK (mail_shell_content_message_selected_cb), - shell_content); -} - -static guint32 -mail_shell_content_check_state (EShellContent *shell_content) -{ - return e_mail_reader_check_state (E_MAIL_READER (shell_content)); -} - -static GtkActionGroup * -mail_shell_content_get_action_group (EMailReader *reader) -{ - EShellContent *shell_content; - EShellWindow *shell_window; - EShellView *shell_view; - - shell_content = E_SHELL_CONTENT (reader); - shell_view = e_shell_content_get_shell_view (shell_content); - shell_window = e_shell_view_get_shell_window (shell_view); - - return E_SHELL_WINDOW_ACTION_GROUP_MAIL (shell_window); -} - -static gboolean -mail_shell_content_get_hide_deleted (EMailReader *reader) -{ - EMailShellContent *mail_shell_content; - - mail_shell_content = E_MAIL_SHELL_CONTENT (reader); - - return !e_mail_shell_content_get_show_deleted (mail_shell_content); -} - -static EMFormatHTMLDisplay * -mail_shell_content_get_html_display (EMailReader *reader) -{ - EMailShellContentPrivate *priv; - - priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (reader); - - return priv->html_display; -} - -static MessageList * -mail_shell_content_get_message_list (EMailReader *reader) -{ - EMailShellContentPrivate *priv; - - priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (reader); - - return MESSAGE_LIST (priv->message_list); -} - -static EShellBackend * -mail_shell_content_get_shell_backend (EMailReader *reader) -{ - EShellContent *shell_content; - EShellView *shell_view; - - shell_content = E_SHELL_CONTENT (reader); - shell_view = e_shell_content_get_shell_view (shell_content); - - return e_shell_view_get_shell_backend (shell_view); -} - -static GtkWindow * -mail_shell_content_get_window (EMailReader *reader) -{ - EShellContent *shell_content; - EShellWindow *shell_window; - EShellView *shell_view; - - shell_content = E_SHELL_CONTENT (reader); - shell_view = e_shell_content_get_shell_view (shell_content); - shell_window = e_shell_view_get_shell_window (shell_view); - - return GTK_WINDOW (shell_window); -} - -static void -mail_shell_content_set_folder (EMailReader *reader, - CamelFolder *folder, - const gchar *folder_uri) -{ - EMailShellContentPrivate *priv; - EMailReaderIface *default_iface; - MessageList *message_list; - gboolean different_folder; - - priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (reader); - - message_list = e_mail_reader_get_message_list (reader); - - message_list_freeze (message_list); - - different_folder = - message_list->folder != NULL && - folder != message_list->folder; - - /* Chain up to interface's default set_folder() method. */ - default_iface = g_type_default_interface_peek (E_TYPE_MAIL_READER); - default_iface->set_folder (reader, folder, folder_uri); - - if (folder == NULL) - goto exit; - - mail_refresh_folder (folder, NULL, NULL); - - /* This function gets triggered several times at startup, - * so we don't want to reset the message suppression state - * unless we're actually switching to a different folder. */ - if (different_folder) - priv->suppress_message_selection = FALSE; - - /* This is a one-time-only callback. */ - if (message_list->cursor_uid == NULL && priv->message_list_built_id == 0) - priv->message_list_built_id = g_signal_connect_swapped ( - message_list, "message-list-built", - G_CALLBACK (mail_shell_content_message_list_built_cb), - reader); - -exit: - message_list_thaw (message_list); -} - -static void -mail_shell_content_show_search_bar (EMailReader *reader) -{ - EMailShellContentPrivate *priv; - - priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (reader); - - gtk_widget_show (priv->search_bar); -} - -static void -mail_shell_content_class_init (EMailShellContentClass *class) -{ - GObjectClass *object_class; - EShellContentClass *shell_content_class; - - parent_class = g_type_class_peek_parent (class); - g_type_class_add_private (class, sizeof (EMailShellContentPrivate)); - - object_class = G_OBJECT_CLASS (class); - object_class->set_property = mail_shell_content_set_property; - object_class->get_property = mail_shell_content_get_property; - object_class->dispose = mail_shell_content_dispose; - object_class->constructed = mail_shell_content_constructed; - - shell_content_class = E_SHELL_CONTENT_CLASS (class); - shell_content_class->new_search_context = em_search_context_new; - shell_content_class->check_state = mail_shell_content_check_state; - - g_object_class_install_property ( - object_class, - PROP_PREVIEW_VISIBLE, - g_param_spec_boolean ( - "preview-visible", - _("Preview is Visible"), - _("Whether the preview pane is visible"), - TRUE, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_SHOW_DELETED, - g_param_spec_boolean ( - "show-deleted", - "Show Deleted", - NULL, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_VERTICAL_VIEW, - g_param_spec_boolean ( - "vertical-view", - _("Vertical View"), - _("Whether vertical view is enabled"), - FALSE, - G_PARAM_READWRITE)); -} - -static void -mail_shell_content_iface_init (EMailReaderIface *iface) -{ - iface->get_action_group = mail_shell_content_get_action_group; - iface->get_hide_deleted = mail_shell_content_get_hide_deleted; - iface->get_html_display = mail_shell_content_get_html_display; - iface->get_message_list = mail_shell_content_get_message_list; - iface->get_shell_backend = mail_shell_content_get_shell_backend; - iface->get_window = mail_shell_content_get_window; - iface->set_folder = mail_shell_content_set_folder; - iface->show_search_bar = mail_shell_content_show_search_bar; -} - -static void -mail_shell_content_init (EMailShellContent *mail_shell_content) -{ - mail_shell_content->priv = - E_MAIL_SHELL_CONTENT_GET_PRIVATE (mail_shell_content); - - mail_shell_content->priv->preview_visible = TRUE; - - /* Postpone widget construction until we have a shell view. */ -} - -GType -e_mail_shell_content_get_type (void) -{ - return mail_shell_content_type; -} - -void -e_mail_shell_content_register_type (GTypeModule *type_module) -{ - static const GTypeInfo type_info = { - sizeof (EMailShellContentClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) mail_shell_content_class_init, - (GClassFinalizeFunc) NULL, - NULL, /* class_data */ - sizeof (EMailShellContent), - 0, /* n_preallocs */ - (GInstanceInitFunc) mail_shell_content_init, - NULL /* value_table */ - }; - - static const GInterfaceInfo iface_info = { - (GInterfaceInitFunc) mail_shell_content_iface_init, - (GInterfaceFinalizeFunc) NULL, - NULL /* interface_data */ - }; - - mail_shell_content_type = g_type_module_register_type ( - type_module, E_TYPE_SHELL_CONTENT, - "EMailShellContent", &type_info, 0); - - g_type_module_add_interface ( - type_module, mail_shell_content_type, - E_TYPE_MAIL_READER, &iface_info); -} - -GtkWidget * -e_mail_shell_content_new (EShellView *shell_view) -{ - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); - - return g_object_new ( - E_TYPE_MAIL_SHELL_CONTENT, - "shell-view", shell_view, NULL); -} - -gboolean -e_mail_shell_content_get_preview_visible (EMailShellContent *mail_shell_content) -{ - g_return_val_if_fail ( - E_IS_MAIL_SHELL_CONTENT (mail_shell_content), FALSE); - - return mail_shell_content->priv->preview_visible; -} - -void -e_mail_shell_content_set_preview_visible (EMailShellContent *mail_shell_content, - gboolean preview_visible) -{ - GtkPaned *paned; - GtkWidget *child; - - g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content)); - - if (preview_visible == mail_shell_content->priv->preview_visible) - return; - - paned = GTK_PANED (mail_shell_content->priv->paned); - child = gtk_paned_get_child2 (paned); - - if (preview_visible) - gtk_widget_show (child); - else - gtk_widget_hide (child); - - mail_shell_content->priv->preview_visible = preview_visible; - - g_object_notify (G_OBJECT (mail_shell_content), "preview-visible"); -} - -gboolean -e_mail_shell_content_get_show_deleted (EMailShellContent *mail_shell_content) -{ - g_return_val_if_fail ( - E_IS_MAIL_SHELL_CONTENT (mail_shell_content), FALSE); - - return mail_shell_content->priv->show_deleted; -} - -void -e_mail_shell_content_set_show_deleted (EMailShellContent *mail_shell_content, - gboolean show_deleted) -{ - g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content)); - - mail_shell_content->priv->show_deleted = show_deleted; - - g_object_notify (G_OBJECT (mail_shell_content), "show-deleted"); -} - -gboolean -e_mail_shell_content_get_vertical_view (EMailShellContent *mail_shell_content) -{ - g_return_val_if_fail ( - E_IS_MAIL_SHELL_CONTENT (mail_shell_content), FALSE); - - return mail_shell_content->priv->vertical_view; -} - -void -e_mail_shell_content_set_vertical_view (EMailShellContent *mail_shell_content, - gboolean vertical_view) -{ - GConfBridge *bridge; - GtkWidget *old_paned; - GtkWidget *new_paned; - GtkWidget *child1; - GtkWidget *child2; - guint binding_id; - const gchar *key; - - g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content)); - - if (vertical_view == mail_shell_content->priv->vertical_view) - return; - - bridge = gconf_bridge_get (); - old_paned = mail_shell_content->priv->paned; - binding_id = mail_shell_content->priv->paned_binding_id; - - child1 = gtk_paned_get_child1 (GTK_PANED (old_paned)); - child2 = gtk_paned_get_child2 (GTK_PANED (old_paned)); - - if (binding_id > 0) - gconf_bridge_unbind (bridge, binding_id); - - if (vertical_view) { - new_paned = gtk_hpaned_new (); - key = "/apps/evolution/mail/display/hpaned_size"; - } else { - new_paned = gtk_vpaned_new (); - key = "/apps/evolution/mail/display/paned_size"; - } - - gtk_widget_reparent (child1, new_paned); - gtk_widget_reparent (child2, new_paned); - gtk_widget_show (new_paned); - - gtk_widget_destroy (old_paned); - gtk_container_add (GTK_CONTAINER (mail_shell_content), new_paned); - - binding_id = gconf_bridge_bind_property_delayed ( - bridge, key, G_OBJECT (new_paned), "position"); - - mail_shell_content->priv->vertical_view = vertical_view; - mail_shell_content->priv->paned_binding_id = binding_id; - mail_shell_content->priv->paned = g_object_ref (new_paned); - - e_mail_shell_content_update_view_instance (mail_shell_content); - - g_object_notify (G_OBJECT (mail_shell_content), "vertical-view"); -} - -GalViewInstance * -e_mail_shell_content_get_view_instance (EMailShellContent *mail_shell_content) -{ - g_return_val_if_fail ( - E_IS_MAIL_SHELL_CONTENT (mail_shell_content), NULL); - - return mail_shell_content->priv->view_instance; -} - -void -e_mail_shell_content_set_search_strings (EMailShellContent *mail_shell_content, - GSList *search_strings) -{ - EMailSearchBar *search_bar; - ESearchingTokenizer *tokenizer; - - g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content)); - - search_bar = E_MAIL_SEARCH_BAR (mail_shell_content->priv->search_bar); - tokenizer = e_mail_search_bar_get_tokenizer (search_bar); - - e_searching_tokenizer_set_secondary_case_sensitivity (tokenizer, FALSE); - e_searching_tokenizer_set_secondary_search_string (tokenizer, NULL); - - while (search_strings != NULL) { - e_searching_tokenizer_add_secondary_search_string ( - tokenizer, search_strings->data); - search_strings = g_slist_next (search_strings); - } - - e_mail_search_bar_changed (search_bar); -} - -void -e_mail_shell_content_update_view_instance (EMailShellContent *mail_shell_content) -{ - EMailReader *reader; - EShellContent *shell_content; - EShellView *shell_view; - EShellViewClass *shell_view_class; - GalViewCollection *view_collection; - GalViewInstance *view_instance; - MessageList *message_list; - gboolean outgoing_folder; - gboolean show_vertical_view; - gchar *view_id; - - g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content)); - - shell_content = E_SHELL_CONTENT (mail_shell_content); - shell_view = e_shell_content_get_shell_view (shell_content); - shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view); - view_collection = shell_view_class->view_collection; - - reader = E_MAIL_READER (mail_shell_content); - message_list = e_mail_reader_get_message_list (reader); - - /* If no folder is selected, return silently. */ - if (message_list->folder == NULL) - return; - - /* If we have a folder, we should also have a URI. */ - g_return_if_fail (message_list->folder_uri != NULL); - - if (mail_shell_content->priv->view_instance != NULL) { - g_object_unref (mail_shell_content->priv->view_instance); - mail_shell_content->priv->view_instance = NULL; - } - - view_id = mail_config_folder_to_safe_url (message_list->folder); - view_instance = e_shell_view_new_view_instance (shell_view, view_id); - mail_shell_content->priv->view_instance = view_instance; - - show_vertical_view = - e_mail_shell_content_get_vertical_view (mail_shell_content); - - if (show_vertical_view) { - gchar *filename; - gchar *safe_view_id; - - /* Force the view instance into vertical view. */ - - g_free (view_instance->custom_filename); - g_free (view_instance->current_view_filename); - - safe_view_id = g_strdup (view_id); - e_filename_make_safe (safe_view_id); - - filename = g_strdup_printf ( - "custom_wide_view-%s.xml", safe_view_id); - view_instance->custom_filename = g_build_filename ( - view_collection->local_dir, filename, NULL); - g_free (filename); - - filename = g_strdup_printf ( - "current_wide_view-%s.xml", safe_view_id); - view_instance->current_view_filename = g_build_filename ( - view_collection->local_dir, filename, NULL); - g_free (filename); - - g_free (safe_view_id); - } - - g_free (view_id); - - outgoing_folder = - em_utils_folder_is_drafts ( - message_list->folder, message_list->folder_uri) || - em_utils_folder_is_outbox ( - message_list->folder, message_list->folder_uri) || - em_utils_folder_is_sent ( - message_list->folder, message_list->folder_uri); - - if (outgoing_folder) { - if (show_vertical_view) - gal_view_instance_set_default_view ( - view_instance, "Wide_View_Sent"); - else - gal_view_instance_set_default_view ( - view_instance, "As_Sent_Folder"); - } else if (show_vertical_view) { - gal_view_instance_set_default_view ( - view_instance, "Wide_View_Normal"); - } - - gal_view_instance_load (view_instance); - - if (!gal_view_instance_exists (view_instance)) { - gchar *state_filename; - - state_filename = mail_config_folder_to_cachename ( - message_list->folder, "et-header-"); - - if (g_file_test (state_filename, G_FILE_TEST_IS_REGULAR)) { - ETableSpecification *spec; - ETableState *state; - GalView *view; - gchar *spec_filename; - - spec = e_table_specification_new (); - spec_filename = g_build_filename ( - EVOLUTION_ETSPECDIR, - "message-list.etspec", - NULL); - e_table_specification_load_from_file ( - spec, spec_filename); - g_free (spec_filename); - - state = e_table_state_new (); - view = gal_view_etable_new (spec, ""); - - e_table_state_load_from_file ( - state, state_filename); - gal_view_etable_set_state ( - GAL_VIEW_ETABLE (view), state); - gal_view_instance_set_custom_view ( - view_instance, view); - - g_object_unref (state); - g_object_unref (view); - g_object_unref (spec); - } - - g_free (state_filename); - } - - g_signal_connect ( - view_instance, "display-view", - G_CALLBACK (mail_shell_content_display_view_cb), - mail_shell_content); - - mail_shell_content_display_view_cb ( - mail_shell_content, - gal_view_instance_get_current_view (view_instance)); -} |