aboutsummaryrefslogtreecommitdiffstats
path: root/mail/e-mail-shell-content.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@src.gnome.org>2008-11-19 09:39:19 +0800
committerMatthew Barnes <mbarnes@src.gnome.org>2008-11-19 09:39:19 +0800
commitb06cdfab92313ca7b1ce9a88ccb0ffba33cb17ab (patch)
tree854d94e177216f4f6f2b2e9f2c150b7ec5d32e3d /mail/e-mail-shell-content.c
parentc3471bfaaad0a94b6f05b678c1eacbc55e72e2dc (diff)
downloadgsoc2013-evolution-b06cdfab92313ca7b1ce9a88ccb0ffba33cb17ab.tar
gsoc2013-evolution-b06cdfab92313ca7b1ce9a88ccb0ffba33cb17ab.tar.gz
gsoc2013-evolution-b06cdfab92313ca7b1ce9a88ccb0ffba33cb17ab.tar.bz2
gsoc2013-evolution-b06cdfab92313ca7b1ce9a88ccb0ffba33cb17ab.tar.lz
gsoc2013-evolution-b06cdfab92313ca7b1ce9a88ccb0ffba33cb17ab.tar.xz
gsoc2013-evolution-b06cdfab92313ca7b1ce9a88ccb0ffba33cb17ab.tar.zst
gsoc2013-evolution-b06cdfab92313ca7b1ce9a88ccb0ffba33cb17ab.zip
Progress update:
- Tighter integration of GalViewInstance and EShellView. - EBinding. Stolen from ExoBinding. Lets you bind GObject properties together to automatically keep their values in sync. This is a godsend. Added to e-util, but might even deserve a place in libedataserver. - EShellSettings. This is the concept I blogged about. Already started ripping apart em-mailer-prefs.c. Others to follow. Any place where we're monitoring GConf keys is a target. - Incremental progress on the calender and mailer. Got EMFolderView somewhat working, but I think I'll be killing off EMFolderBrowser. svn path=/branches/kill-bonobo/; revision=36795
Diffstat (limited to 'mail/e-mail-shell-content.c')
-rw-r--r--mail/e-mail-shell-content.c203
1 files changed, 195 insertions, 8 deletions
diff --git a/mail/e-mail-shell-content.c b/mail/e-mail-shell-content.c
index 144d70d671..6d1ffc0a08 100644
--- a/mail/e-mail-shell-content.c
+++ b/mail/e-mail-shell-content.c
@@ -22,11 +22,16 @@
#include "e-mail-shell-content.h"
#include <glib/gi18n.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-folder-browser.h"
+#include "em-folder-view.h"
#include "em-search-context.h"
+#include "em-utils.h"
+#include "mail-config.h"
#define E_MAIL_SHELL_CONTENT_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE \
@@ -34,9 +39,11 @@
struct _EMailShellContentPrivate {
GtkWidget *paned;
- GtkWidget *msglist;
+ GtkWidget *folder_view;
GtkWidget *preview;
+ GalViewInstance *view_instance;
+
guint paned_binding_id;
guint preview_visible : 1;
@@ -52,6 +59,20 @@ enum {
static gpointer parent_class;
static void
+mail_shell_content_display_view_cb (EMailShellContent *mail_shell_content,
+ GalView *gal_view)
+{
+ EMFolderView *folder_view;
+
+ folder_view = e_mail_shell_content_get_folder_view (mail_shell_content);
+
+ if (GAL_IS_VIEW_ETABLE (gal_view))
+ gal_view_etable_attach_tree (
+ GAL_VIEW_ETABLE (gal_view),
+ folder_view->list->tree);
+}
+
+static void
mail_shell_content_set_property (GObject *object,
guint property_id,
const GValue *value,
@@ -110,9 +131,9 @@ mail_shell_content_dispose (GObject *object)
priv->paned = NULL;
}
- if (priv->msglist != NULL) {
- g_object_unref (priv->msglist);
- priv->msglist = NULL;
+ if (priv->folder_view != NULL) {
+ g_object_unref (priv->folder_view);
+ priv->folder_view = NULL;
}
if (priv->preview != NULL) {
@@ -120,6 +141,11 @@ mail_shell_content_dispose (GObject *object)
priv->preview = 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);
}
@@ -139,9 +165,13 @@ static void
mail_shell_content_constructed (GObject *object)
{
EMailShellContentPrivate *priv;
+ EShellContent *shell_content;
+ EShellView *shell_view;
+ EShellViewClass *shell_view_class;
GConfBridge *bridge;
GtkWidget *container;
GtkWidget *widget;
+ GalViewCollection *view_collection;
const gchar *key;
priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (object);
@@ -149,6 +179,11 @@ mail_shell_content_constructed (GObject *object)
/* 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);
+ view_collection = shell_view_class->view_collection;
+
/* Build content widgets. */
container = GTK_WIDGET (object);
@@ -160,10 +195,9 @@ mail_shell_content_constructed (GObject *object)
container = widget;
- /*widget = em_folder_browser_new ();*/
- widget = gtk_label_new ("Message List");
+ widget = em_folder_view_new ();
gtk_paned_add1 (GTK_PANED (container), widget);
- priv->msglist = g_object_ref (widget);
+ priv->folder_view = g_object_ref (widget);
gtk_widget_show (widget);
widget = gtk_scrolled_window_new (NULL, NULL);
@@ -175,6 +209,11 @@ mail_shell_content_constructed (GObject *object)
gtk_paned_add2 (GTK_PANED (container), widget);
gtk_widget_show (widget);
+ /* Load the view instance. */
+
+ e_mail_shell_content_update_view_instance (
+ E_MAIL_SHELL_CONTENT (object));
+
/* Bind GObject properties to GConf keys. */
bridge = gconf_bridge_get ();
@@ -190,6 +229,8 @@ mail_shell_content_check_state (EShellContent *shell_content)
EMailShellContent *mail_shell_content;
guint32 state = 0;
+ /* FIXME */
+
mail_shell_content = E_MAIL_SHELL_CONTENT (shell_content);
return state;
@@ -284,6 +325,15 @@ e_mail_shell_content_new (EShellView *shell_view)
"shell-view", shell_view, NULL);
}
+EMFolderView *
+e_mail_shell_content_get_folder_view (EMailShellContent *mail_shell_content)
+{
+ g_return_val_if_fail (
+ E_IS_MAIL_SHELL_CONTENT (mail_shell_content), NULL);
+
+ return EM_FOLDER_VIEW (mail_shell_content->priv->folder_view);
+}
+
gboolean
e_mail_shell_content_get_preview_visible (EMailShellContent *mail_shell_content)
{
@@ -378,3 +428,140 @@ e_mail_shell_content_set_vertical_view (EMailShellContent *mail_shell_content,
g_object_notify (G_OBJECT (mail_shell_content), "vertical-view");
}
+
+void
+e_mail_shell_content_update_view_instance (EMailShellContent *mail_shell_content)
+{
+ EShellContent *shell_content;
+ EShellView *shell_view;
+ EShellViewClass *shell_view_class;
+ GalViewCollection *view_collection;
+ GalViewInstance *view_instance;
+ EMFolderView *folder_view;
+ 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;
+
+ folder_view = e_mail_shell_content_get_folder_view (mail_shell_content);
+ g_return_if_fail (folder_view->folder != NULL);
+ g_return_if_fail (folder_view->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;
+ }
+
+ /* TODO: Should this go through the mail-config API? */
+ view_id = mail_config_folder_to_safe_url (folder_view->folder);
+ view_instance = e_shell_view_new_view_instance (shell_view, view_id);
+ mail_shell_content->priv->view_instance = view_instance;
+
+ show_vertical_view = folder_view->list_active &&
+ 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 (
+ folder_view->folder, folder_view->folder_uri) ||
+ em_utils_folder_is_outbox (
+ folder_view->folder, folder_view->folder_uri) ||
+ em_utils_folder_is_sent (
+ folder_view->folder, folder_view->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 (
+ folder_view->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));
+}