Refactoring of mail header view.
authorSergio Villar Senin <svillar@igalia.com>
Tue, 2 Dec 2008 16:05:33 +0000 (16:05 +0000)
committerSergio Villar Senin <svillar@igalia.com>
Tue, 2 Dec 2008 16:05:33 +0000 (16:05 +0000)
* Refactored the mail header view. Now we have the interface
  ModestMailHeaderView providing support for alternate implementations.
* Now old ModestMailHeaderView is ModestCompactMailHeaderView
* Added new ModestCompactMailHeaderView, with a style made by labels.
* Added signal show details to mail header view hierarchy
  (implementation for signal emition only in compact view).
* Some code cleanups and style enhancements.

Loading message after showing message view:
* Added methods for loading the messages in message view _after_ view
  is shown. We use the code in message_reader already available.

Other changes:
* Proper bold/greying of elements in folder view.

pmo-trunk-r6498

15 files changed:
src/hildon2/modest-folder-window.c
src/hildon2/modest-header-window.c
src/hildon2/modest-msg-view-window.c
src/modest-ui-actions.c
src/widgets/Makefile.am
src/widgets/modest-expander-mail-header-view.c [new file with mode: 0644]
src/widgets/modest-expander-mail-header-view.h [new file with mode: 0644]
src/widgets/modest-folder-view.c
src/widgets/modest-gtkhtml-msg-view.c
src/widgets/modest-mail-header-view.c
src/widgets/modest-mail-header-view.h
src/widgets/modest-mozembed-msg-view.c
src/widgets/modest-msg-view-window.h
src/widgets/modest-msg-view.c
src/widgets/modest-msg-view.h

index f9a9996..a1295ab 100644 (file)
@@ -399,5 +399,8 @@ on_folder_activated (ModestFolderView *folder_view,
        modest_window_mgr_register_window (modest_runtime_get_window_mgr (), 
                                           MODEST_WINDOW (headerwin),
                                           MODEST_WINDOW (self));
+
+       modest_window_set_active_account (MODEST_WINDOW (headerwin), 
+                                         modest_window_get_active_account (MODEST_WINDOW (self)));
        gtk_widget_show (GTK_WIDGET (headerwin));
 }
index 9c876a8..b0ebd6f 100644 (file)
@@ -43,6 +43,8 @@
 #include <modest-defs.h>
 #include <modest-widget-memory.h>
 #include <modest-ui-actions.h>
+#include <modest-platform.h>
+#include <modest-text-utils.h>
 #include <hildon/hildon-button.h>
 #include <hildon/hildon-program.h>
 #include <hildon/hildon-banner.h>
@@ -65,6 +67,10 @@ struct _ModestHeaderWindowPrivate {
 
        TnyFolder *folder;
 
+       /* banners */
+       GtkWidget *updating_banner;
+       guint updating_banner_timeout;
+
        /* signals */
        GSList *sighandlers;
 
@@ -105,6 +111,9 @@ static void on_header_activated (ModestHeaderView *header_view,
                                 TnyHeader *header,
                                 GtkTreePath *path,
                                 ModestHeaderWindow *header_window);
+static void on_updating_msg_list (ModestHeaderView *header_view,
+                                 gboolean starting,
+                                 gpointer user_data);
 
 
 /* globals */
@@ -175,6 +184,8 @@ modest_header_window_init (ModestHeaderWindow *obj)
        priv->contents_view = NULL;
        priv->contents_state = CONTENTS_STATE_NONE;
        priv->folder = NULL;
+       priv->updating_banner = NULL;
+       priv->updating_banner_timeout = 0;
        
        modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(),
                                            GTK_WINDOW(obj),
@@ -196,6 +207,15 @@ modest_header_window_finalize (GObject *obj)
           call this function before */
        modest_header_window_disconnect_signals (MODEST_WINDOW (obj));  
 
+       if (priv->updating_banner_timeout > 0) {
+               g_source_remove (priv->updating_banner_timeout);
+               priv->updating_banner_timeout = 0;
+       }
+       if (priv->updating_banner) {
+               gtk_widget_destroy (priv->updating_banner);
+               priv->updating_banner = NULL;
+       }
+
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
@@ -226,7 +246,13 @@ connect_signals (ModestHeaderWindow *self)
                modest_signal_mgr_connect (priv->sighandlers, G_OBJECT (priv->header_view),
                                           "header-activated",
                                           G_CALLBACK (on_header_activated), self);
-
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT (priv->header_view), 
+                                          "updating-msg-list",
+                                          G_CALLBACK (on_updating_msg_list), 
+                                          self);
+       
        /* TODO: connect header view activate */
 
        /* new message button */
@@ -419,8 +445,12 @@ static void setup_menu (ModestHeaderWindow *self)
 
        app_menu = hildon_app_menu_new ();
 
+       add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_viewer_newemail"),
+                    G_CALLBACK (modest_ui_actions_on_new_msg));
        add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_sendandreceive"),
                     G_CALLBACK (modest_ui_actions_on_send_receive));
+       add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_messagedetails"),
+                    G_CALLBACK (modest_ui_actions_on_details));
 
        hildon_stackable_window_set_main_menu (HILDON_STACKABLE_WINDOW (self), 
                                               HILDON_APP_MENU (app_menu));
@@ -526,3 +556,79 @@ on_header_activated (ModestHeaderView *header_view,
 {
        modest_ui_actions_on_header_activated (header_view, header, path, MODEST_WINDOW (header_window));
 }
+
+static void
+updating_banner_destroyed (gpointer data,
+                          GObject *where_the_object_was)
+{
+       ModestHeaderWindowPrivate *priv = NULL;
+
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE (data);
+
+       priv->updating_banner = NULL;
+}
+
+static gboolean
+show_updating_banner (gpointer user_data)
+{
+       ModestHeaderWindowPrivate *priv = NULL;
+
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE (user_data);
+
+       if (priv->updating_banner == NULL) {
+
+               /* We're outside the main lock */
+               gdk_threads_enter ();
+               priv->updating_banner = 
+                       modest_platform_animation_banner (GTK_WIDGET (user_data), NULL,
+                                                         _CS ("ckdg_pb_updating"));
+
+               /* We need this because banners in Maemo could be
+                  destroyed by dialogs so we need to properly update
+                  our reference to it */
+               g_object_weak_ref (G_OBJECT (priv->updating_banner),
+                                  updating_banner_destroyed,
+                                  user_data);
+               gdk_threads_leave ();
+       }
+
+       /* Remove timeout */
+       priv->updating_banner_timeout = 0;
+       return FALSE;
+}
+
+/**
+ * We use this function to show/hide a progress banner showing
+ * "Updating" while the header view is being filled. We're not showing
+ * it unless the update takes more than 2 seconds
+ *
+ * If starting = TRUE then the refresh is starting, otherwise it means
+ * that is has just finished
+ */
+static void 
+on_updating_msg_list (ModestHeaderView *header_view,
+                     gboolean starting,
+                     gpointer user_data)
+{
+       ModestHeaderWindowPrivate *priv = NULL;
+
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE (user_data);
+       
+       /* Remove old timeout */
+       if (priv->updating_banner_timeout > 0) {
+               g_source_remove (priv->updating_banner_timeout);
+               priv->updating_banner_timeout = 0;
+       }
+
+       /* Create a new timeout */
+       if (starting) {
+               priv->updating_banner_timeout = 
+                       g_timeout_add (2000, show_updating_banner, user_data);
+       } else {
+               /* Remove the banner if exists */
+               if (priv->updating_banner) {
+                       gtk_widget_destroy (priv->updating_banner);
+                       priv->updating_banner = NULL;
+               }
+       }
+}
index cf48dc7..a35bc6b 100644 (file)
 #define MYDOCS_ENV "MYDOCSDIR"
 #define DOCS_FOLDER ".documents"
 
+typedef struct _ModestMsgViewWindowPrivate ModestMsgViewWindowPrivate;
+struct _ModestMsgViewWindowPrivate {
+
+       GtkWidget   *msg_view;
+       GtkWidget   *main_scroll;
+       GtkWidget   *find_toolbar;
+       gchar       *last_search;
+
+       /* Progress observers */
+       GtkWidget        *progress_bar;
+       GSList           *progress_widgets;
+
+       /* Tollbar items */
+       GtkWidget   *progress_toolitem;
+       GtkWidget   *cancel_toolitem;
+       GtkWidget   *prev_toolitem;
+       GtkWidget   *next_toolitem;
+       ModestToolBarModes current_toolbar_mode;
+
+       /* Optimized view enabled */
+       gboolean optimized_view;
+
+       /* Whether this was created via the *_new_for_search_result() function. */
+       gboolean is_search_result;
+
+       /* Whether the message is in outbox */
+       gboolean is_outbox;
+       
+       /* A reference to the @model of the header view 
+        * to allow selecting previous/next messages,
+        * if the message is currently selected in the header view.
+        */
+       const gchar *header_folder_id;
+       GtkTreeModel *header_model;
+       GtkTreeRowReference *row_reference;
+       GtkTreeRowReference *next_row_reference;
+
+       gulong clipboard_change_handler;
+       gulong queue_change_handler;
+       gulong account_removed_handler;
+       gulong row_changed_handler;
+       gulong row_deleted_handler;
+       gulong row_inserted_handler;
+       gulong rows_reordered_handler;
+
+       guint purge_timeout;
+       GtkWidget *remove_attachment_banner;
+
+       guint progress_bar_timeout;
+
+       gchar *msg_uid;
+       
+       GSList *sighandlers;
+};
+
 static void  modest_msg_view_window_class_init   (ModestMsgViewWindowClass *klass);
 static void  modest_msg_view_window_init         (ModestMsgViewWindow *obj);
 static void  modest_header_view_observer_init(
@@ -163,6 +218,10 @@ static gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
                                                     GtkScrollType scroll_type,
                                                     gboolean horizontal,
                                                     gpointer userdata);
+static gboolean message_reader (ModestMsgViewWindow *window,
+                               ModestMsgViewWindowPrivate *priv,
+                               TnyHeader *header,
+                               GtkTreeRowReference *row_reference);
 
 /* list my signals */
 enum {
@@ -175,61 +234,6 @@ static const GtkToggleActionEntry msg_view_toggle_action_entries [] = {
        { "FindInMessage",    MODEST_TOOLBAR_ICON_FIND,    N_("qgn_toolb_gene_find"), NULL, NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
 };
 
-typedef struct _ModestMsgViewWindowPrivate ModestMsgViewWindowPrivate;
-struct _ModestMsgViewWindowPrivate {
-
-       GtkWidget   *msg_view;
-       GtkWidget   *main_scroll;
-       GtkWidget   *find_toolbar;
-       gchar       *last_search;
-
-       /* Progress observers */
-       GtkWidget        *progress_bar;
-       GSList           *progress_widgets;
-
-       /* Tollbar items */
-       GtkWidget   *progress_toolitem;
-       GtkWidget   *cancel_toolitem;
-       GtkWidget   *prev_toolitem;
-       GtkWidget   *next_toolitem;
-       ModestToolBarModes current_toolbar_mode;
-
-       /* Optimized view enabled */
-       gboolean optimized_view;
-
-       /* Whether this was created via the *_new_for_search_result() function. */
-       gboolean is_search_result;
-
-       /* Whether the message is in outbox */
-       gboolean is_outbox;
-       
-       /* A reference to the @model of the header view 
-        * to allow selecting previous/next messages,
-        * if the message is currently selected in the header view.
-        */
-       const gchar *header_folder_id;
-       GtkTreeModel *header_model;
-       GtkTreeRowReference *row_reference;
-       GtkTreeRowReference *next_row_reference;
-
-       gulong clipboard_change_handler;
-       gulong queue_change_handler;
-       gulong account_removed_handler;
-       gulong row_changed_handler;
-       gulong row_deleted_handler;
-       gulong row_inserted_handler;
-       gulong rows_reordered_handler;
-
-       guint purge_timeout;
-       GtkWidget *remove_attachment_banner;
-
-       guint progress_bar_timeout;
-
-       gchar *msg_uid;
-       
-       GSList *sighandlers;
-};
-
 #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                     MODEST_TYPE_MSG_VIEW_WINDOW, \
                                                     ModestMsgViewWindowPrivate))
@@ -282,11 +286,21 @@ save_state (ModestWindow *self)
                                   MODEST_CONF_MSG_VIEW_WINDOW_KEY);
 }
 
-static 
-gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
-                                             GtkScrollType scroll_type,
-                                             gboolean horizontal,
-                                             gpointer userdata)
+static void
+restore_settings (ModestMsgViewWindow *self)
+{
+       ModestConf *conf;
+
+       conf = modest_runtime_get_conf ();
+       modest_widget_memory_restore (conf,
+                                     G_OBJECT(self), 
+                                     MODEST_CONF_MSG_VIEW_WINDOW_KEY);
+}
+
+static gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
+                                                    GtkScrollType scroll_type,
+                                                    gboolean horizontal,
+                                                    gpointer userdata)
 {
        ModestMsgViewWindowPrivate *priv;
        gboolean return_value;
@@ -839,6 +853,8 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self,
                          G_CALLBACK (modest_ui_actions_on_msg_attachment_clicked), obj);
        g_signal_connect (G_OBJECT(priv->msg_view), "recpt_activated",
                          G_CALLBACK (modest_ui_actions_on_msg_recpt_activated), obj);
+       g_signal_connect (G_OBJECT(priv->msg_view), "show_details",
+                         G_CALLBACK (modest_ui_actions_on_details), obj);
        g_signal_connect (G_OBJECT(priv->msg_view), "link_contextual",
                          G_CALLBACK (modest_ui_actions_on_msg_link_contextual), obj);
        g_signal_connect (G_OBJECT (priv->msg_view), "fetch_image",
@@ -873,6 +889,8 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self,
        g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_view_window_find_toolbar_search), obj);
        priv->last_search = NULL;
 
+       modest_msg_view_window_show_toolbar (MODEST_WINDOW (obj), TRUE);
+
        /* Init the clipboard actions dim status */
        modest_msg_view_grab_focus(MODEST_MSG_VIEW (priv->msg_view));
 
@@ -969,8 +987,101 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg,
 
        tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
        update_window_title (MODEST_MSG_VIEW_WINDOW (window));
+
        /* gtk_widget_show_all (GTK_WIDGET (window)); */
        modest_msg_view_window_update_priority (window);
+       /* Check dimming rules */
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (window), MODEST_DIMMING_RULES_CLIPBOARD);
+
+       return MODEST_WINDOW(window);
+}
+
+ModestWindow *
+modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view, 
+                                             const gchar *modest_account_name,
+                                             const gchar *msg_uid,
+                                             GtkTreeRowReference *row_reference)
+{
+       ModestMsgViewWindow *window = NULL;
+       ModestMsgViewWindowPrivate *priv = NULL;
+       TnyFolder *header_folder = NULL;
+       ModestWindowMgr *mgr = NULL;
+       GtkTreePath *path;
+       GtkTreeIter iter;
+
+       mgr = modest_runtime_get_window_mgr ();
+       window = MODEST_MSG_VIEW_WINDOW (modest_window_mgr_get_msg_view_window (mgr));
+       g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), NULL);
+
+       modest_msg_view_window_construct (window, modest_account_name, msg_uid);
+
+       priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+       /* Remember the message list's TreeModel so we can detect changes 
+        * and change the list selection when necessary: */
+
+       if (header_view != NULL){
+               header_folder = modest_header_view_get_folder(header_view);
+               /* This could happen if the header folder was
+                  unseleted before opening this msg window (for
+                  example if the user selects an account in the
+                  folder view of the main window */
+               if (header_folder) {
+                       priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) == TNY_FOLDER_TYPE_OUTBOX);
+                       priv->header_folder_id = tny_folder_get_id(header_folder);
+                       g_assert(priv->header_folder_id != NULL);
+                       g_object_unref(header_folder);
+               }
+       }
+
+       /* Setup row references and connect signals */
+       priv->header_model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+
+       if (row_reference) {
+               priv->row_reference = gtk_tree_row_reference_copy (row_reference);
+               priv->next_row_reference = gtk_tree_row_reference_copy (row_reference);
+               select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE, priv->is_outbox);
+       } else {
+               priv->row_reference = NULL;
+               priv->next_row_reference = NULL;
+       }
+
+       /* Connect signals */
+       priv->row_changed_handler = 
+               g_signal_connect (GTK_TREE_MODEL(priv->header_model), "row-changed",
+                                 G_CALLBACK(modest_msg_view_window_on_row_changed),
+                                 window);
+       priv->row_deleted_handler = 
+               g_signal_connect (GTK_TREE_MODEL(priv->header_model), "row-deleted",
+                                 G_CALLBACK(modest_msg_view_window_on_row_deleted),
+                                 window);
+       priv->row_inserted_handler = 
+               g_signal_connect (GTK_TREE_MODEL(priv->header_model), "row-inserted",
+                                 G_CALLBACK(modest_msg_view_window_on_row_inserted),
+                                 window);
+       priv->rows_reordered_handler = 
+               g_signal_connect(GTK_TREE_MODEL(priv->header_model), "rows-reordered",
+                                G_CALLBACK(modest_msg_view_window_on_row_reordered),
+                                window);
+
+       if (header_view != NULL){
+               modest_header_view_add_observer(header_view,
+                               MODEST_HEADER_VIEW_OBSERVER(window));
+       }
+
+       tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), NULL);
+
+       path = gtk_tree_row_reference_get_path (row_reference);
+       if (gtk_tree_model_get_iter (priv->header_model, &iter, path)) {
+               TnyHeader *header;
+               gtk_tree_model_get (priv->header_model, &iter, 
+                                   TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+                                   &header, -1);
+               message_reader (window, priv, header, row_reference);
+       }
+       gtk_tree_path_free (path);
 
        /* Check dimming rules */
        modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
index 3fb1cc0..fcf54b1 100644 (file)
@@ -873,9 +873,9 @@ typedef struct {
 
 typedef struct {
        GtkTreeModel *model;
-       TnyList *headers;
+       TnyHeader *header;
        OpenMsgBannerInfo *banner_info;
-       GHashTable *row_refs_per_header;
+       GtkTreeRowReference *rowref;
 } OpenMsgHelper;
 
 gboolean
@@ -895,43 +895,42 @@ open_msg_banner_idle (gpointer userdata)
        
 }
 
-static void
-open_msg_cb (ModestMailOperation *mail_op, 
-            TnyHeader *header,  
-            gboolean canceled,
-            TnyMsg *msg, 
-            GError *err,
-            gpointer user_data)
+static GtkWidget *
+get_header_view_from_window (ModestWindow *window)
 {
-       ModestWindowMgr *mgr = NULL;
-       ModestWindow *parent_win = NULL;
-       ModestWindow *win = NULL;
-       TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
-       gchar *account = NULL;
-       TnyFolder *folder;
-       gboolean open_in_editor = FALSE;
-       OpenMsgHelper *helper = (OpenMsgHelper *) user_data;
+       GtkWidget *header_view;
 
-       /* Do nothing if there was any problem with the mail
-          operation. The error will be shown by the error_handler of
-          the mail operation */
-       if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
-               return;
+       if (MODEST_IS_MAIN_WINDOW (window)) {
+               header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
+#ifdef MODEST_TOOLKIT_HILDON2
+       } else if (MODEST_IS_HEADER_WINDOW (window)){
+               header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (window)));
+#endif
+       } else {
+               header_view = NULL;
+       }
 
-       parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op);
-       folder = tny_header_get_folder (header);
+       return header_view;
+}
 
-       /* Mark header as read */
-       headers_action_mark_as_read (header, MODEST_WINDOW(parent_win), NULL);
+static gchar *
+get_info_from_header (TnyHeader *header, gboolean *is_draft)
+{
+       TnyFolder *folder;
+       gchar *account = NULL;
+       TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
 
+       *is_draft = FALSE;
+
+       folder = tny_header_get_folder (header);
        /* Gets folder type (OUTBOX headers will be opened in edit window */
        if (modest_tny_folder_is_local_folder (folder)) {
                folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
                if (folder_type == TNY_FOLDER_TYPE_INVALID)
                        g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
        }
-
-
+               
        if (folder_type == TNY_FOLDER_TYPE_OUTBOX) {
                TnyTransportAccount *traccount = NULL;
                ModestTnyAccountStore *accstore = modest_runtime_get_account_store();
@@ -950,16 +949,7 @@ open_msg_cb (ModestMailOperation *mail_op,
 
                                /* Only open messages in outbox with the editor if they are in Failed state */
                                if (status == MODEST_TNY_SEND_QUEUE_FAILED) {
-                                       open_in_editor = TRUE;
-                               } 
-#ifdef  MODEST_TOOLKIT_HILDON2
-                               else {
-                                       /* In Fremantle we can not
-                                          open any message from
-                                          outbox which is not in
-                                          failed state */
-                                       g_object_unref(traccount);
-                                       goto cleanup;
+                                       *is_draft = TRUE;
                                }
 #endif
                        }
@@ -968,9 +958,42 @@ open_msg_cb (ModestMailOperation *mail_op,
                        g_warning("Cannot get transport account for message in outbox!!");
                }
        } else if (folder_type == TNY_FOLDER_TYPE_DRAFTS) {
-               open_in_editor = TRUE; /* Open in editor if the message is in the Drafts folder */
+               *is_draft = TRUE; /* Open in editor if the message is in the Drafts folder */
        }
 
+       g_object_unref (folder);
+
+       return account;
+}
+
+static void
+open_msg_cb (ModestMailOperation *mail_op, 
+            TnyHeader *header,  
+            gboolean canceled,
+            TnyMsg *msg, 
+            GError *err,
+            gpointer user_data)
+{
+       ModestWindowMgr *mgr = NULL;
+       ModestWindow *parent_win = NULL;
+       ModestWindow *win = NULL;
+       gchar *account = NULL;
+       gboolean open_in_editor = FALSE;
+       OpenMsgHelper *helper = (OpenMsgHelper *) user_data;
+       
+       /* Do nothing if there was any problem with the mail
+          operation. The error will be shown by the error_handler of
+          the mail operation */
+       if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
+               return;
+
+       parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op);
+
+       /* Mark header as read */
+       headers_action_mark_as_read (header, MODEST_WINDOW(parent_win), NULL);
+
+       account = get_info_from_header (header, &open_in_editor);
+
        /* Get account */
        if (!account)
                account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (parent_win)));
@@ -1003,12 +1026,10 @@ open_msg_cb (ModestMailOperation *mail_op,
                win = modest_msg_edit_window_new (msg, account, TRUE);
        } else {
                gchar *uid = modest_tny_folder_get_header_unique_id (header);
-               GtkTreeRowReference *row_reference;
 
-               row_reference = (GtkTreeRowReference *) g_hash_table_lookup (helper->row_refs_per_header, header);
-               if (row_reference && helper->model) {           
+               if (helper->rowref && helper->model) {          
                        win = modest_msg_view_window_new_with_header_model (msg, account, (const gchar*) uid,
-                                                                           helper->model, row_reference);
+                                                                           helper->model, helper->rowref);
                } else {
                        win = modest_msg_view_window_new_for_attachment (msg, account, (const gchar*) uid);
                }
@@ -1034,7 +1055,6 @@ cleanup:
        /* Free */
        g_free(account);
        g_object_unref (parent_win);
-       g_object_unref (folder);
 }
 
 static gboolean
@@ -1167,18 +1187,24 @@ get_account_from_header_list (TnyList *headers)
        return account;
 }
 
-static void 
-foreach_unregister_headers (gpointer data,
-                           gpointer user_data)
+static TnyAccount*
+get_account_from_header (TnyHeader *header)
 {
-       ModestWindowMgr *mgr = (ModestWindowMgr *) user_data;
-       TnyHeader *header = TNY_HEADER (data);
+       TnyAccount *account = NULL;
+       TnyFolder *folder;
 
-       modest_window_mgr_unregister_header (mgr, header);
+       folder = tny_header_get_folder (header);
+               
+       if (folder) {
+               account = tny_folder_get_account (folder);
+               g_object_unref (folder);
+       }
+               
+       return account;
 }
 
 static void
-open_msgs_helper_destroyer (gpointer user_data)
+open_msg_helper_destroyer (gpointer user_data)
 {
        OpenMsgHelper *helper = (OpenMsgHelper *) user_data;
 
@@ -1197,13 +1223,13 @@ open_msgs_helper_destroyer (gpointer user_data)
                helper->banner_info = NULL;
        }
        g_object_unref (helper->model);
-       g_object_unref (helper->headers);
-       g_hash_table_destroy (helper->row_refs_per_header);
+       g_object_unref (helper->header);
+       gtk_tree_row_reference_free (helper->rowref);
        g_slice_free (OpenMsgHelper, helper);
 }
 
 static void
-open_msgs_performer(gboolean canceled, 
+open_msg_performer(gboolean canceled, 
                    GError *err,
                    GtkWindow *parent_window,
                    TnyAccount *account,
@@ -1212,25 +1238,21 @@ open_msgs_performer(gboolean canceled,
        ModestMailOperation *mail_op = NULL;
        gchar *error_msg;
        ModestProtocolType proto;
-       TnyList *not_opened_headers;
        TnyConnectionStatus status;
        gboolean show_open_draft = FALSE;
        OpenMsgHelper *helper = NULL;
 
        helper = (OpenMsgHelper *) user_data;
-       not_opened_headers = helper->headers;
 
        status = tny_account_get_connection_status (account);
        if (err || canceled) {
-               /* Unregister the already registered headers */
-               tny_list_foreach (not_opened_headers, foreach_unregister_headers, 
-                                 modest_runtime_get_window_mgr ());
+               modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), helper->header);
                /* Free the helper */
-               open_msgs_helper_destroyer (helper);
-
+               open_msg_helper_destroyer (helper);
+               
                /* In memory full conditions we could get this error here */
                check_memory_full_error ((GtkWidget *) parent_window, err);
-
+               
                goto clean;
        }
 
@@ -1239,52 +1261,65 @@ open_msgs_performer(gboolean canceled,
        if (proto == MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
                proto = MODEST_PROTOCOLS_STORE_MAILDIR;
        }
+       
+       ModestProtocol *protocol;
+       ModestProtocolRegistry *protocol_registry;
+       gchar *subject;
+               
+       protocol_registry = modest_runtime_get_protocol_registry ();
+       subject = tny_header_dup_subject (helper->header);
 
-       /* Create the error messages */
-       if (tny_list_get_length (not_opened_headers) == 1) {
-               ModestProtocol *protocol;
-               ModestProtocolRegistry *protocol_registry;
-               TnyIterator *iter;
-               TnyHeader *header;
-               gchar *subject;
-
-               protocol_registry = modest_runtime_get_protocol_registry ();
-               iter = tny_list_create_iterator (not_opened_headers);
-               header = TNY_HEADER (tny_iterator_get_current (iter));
-               subject = tny_header_dup_subject (header);
+       protocol = modest_protocol_registry_get_protocol_by_type (protocol_registry, proto);
+       error_msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
+       if (subject)
+               g_free (subject);
+               
+       if (error_msg == NULL) {
+               error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
+       }
 
-               protocol = modest_protocol_registry_get_protocol_by_type (protocol_registry, proto);
-               error_msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
-               if (subject)
-                       g_free (subject);
-               g_object_unref (header);
-               g_object_unref (iter);
+       if (modest_protocol_registry_protocol_type_has_tag (protocol_registry,
+                                                           proto,
+                                                           MODEST_PROTOCOL_REGISTRY_LOCAL_STORE_PROTOCOLS)) { 
+               TnyFolder *folder;
+               TnyFolderType folder_type;
 
-               if (error_msg == NULL) {
-                       error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
-               }
+               folder = tny_header_get_folder (helper->header);
+               folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
+               show_open_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
+               g_object_unref (folder);
+       }
 
-               if (modest_protocol_registry_protocol_type_has_tag (protocol_registry,
-                                                                   proto,
-                                                                   MODEST_PROTOCOL_REGISTRY_LOCAL_STORE_PROTOCOLS)) { 
-                       TnyHeader *header;
-                       TnyFolder *folder;
-                       TnyIterator *iter;
-                       TnyFolderType folder_type;
+#ifdef MODEST_TOOLKIT_HILDON2
+       gboolean is_draft;
+       gchar *account_name = get_info_from_header (helper->header, &is_draft);
 
-                       iter = tny_list_create_iterator (not_opened_headers);
-                       header = TNY_HEADER (tny_iterator_get_current (iter));
-                       folder = tny_header_get_folder (header);
-                       folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
-                       show_open_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
-                       g_object_unref (folder);
-                       g_object_unref (header);
-                       g_object_unref (iter);
+       if (!is_draft) {
+               ModestWindow *window;
+               GtkWidget *header_view;
+               gchar *uid;
+
+               header_view = get_header_view_from_window (MODEST_WINDOW (parent_window));
+               uid = modest_tny_folder_get_header_unique_id (helper->header);
+               if (header_view) {
+                       window = modest_msg_view_window_new_from_header_view 
+                               (MODEST_HEADER_VIEW (header_view), account_name, uid, helper->rowref);
+                       if (window != NULL) {
+                               if (!modest_window_mgr_register_window (modest_runtime_get_window_mgr (),
+                                                                       window, NULL)) {
+                                       gtk_widget_destroy (GTK_WIDGET (window));
+                               } else {
+                                       gtk_widget_show_all (GTK_WIDGET(window));
+                               }
+                       }
                }
-       } else {
-               error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
+               g_free (account_name);
+               g_free (uid);
+               open_msg_helper_destroyer (helper);
+               goto clean;
        }
-
+       g_free (account_name);
+#endif
        /* Create the mail operation */
        mail_op = 
                modest_mail_operation_new_with_error_handling ((GObject *) parent_window,
@@ -1305,11 +1340,15 @@ open_msgs_performer(gboolean canceled,
                                                                   helper->banner_info);
        }
 
+       TnyList *headers;
+       headers = TNY_LIST (tny_simple_list_new ());
+       tny_list_prepend (headers, G_OBJECT (helper->header));
        modest_mail_operation_get_msgs_full (mail_op,
-                                            not_opened_headers,
+                                            headers,
                                             open_msg_cb,
                                             helper,
-                                            open_msgs_helper_destroyer);
+                                            open_msg_helper_destroyer);
+       g_object_unref (headers);
 
        /* Frees */
  clean:
@@ -1324,196 +1363,100 @@ open_msgs_performer(gboolean canceled,
  * same when trying to open messages.
  */
 static void
-open_msgs_from_headers (TnyList *headers, GtkTreePath *path, ModestWindow *win)
+open_msg_from_header (TnyHeader *header, GtkTreeRowReference *rowref, ModestWindow *win)
 {
        ModestWindowMgr *mgr = NULL;
-       TnyIterator *iter = NULL, *iter_not_opened = NULL;
-       TnyList *not_opened_headers = NULL;
-       TnyHeaderFlags flags = 0;
        TnyAccount *account;
-       gint uncached_msgs = 0;
+       gboolean cached = FALSE;
+       gboolean found;
        GtkWidget *header_view = NULL;
-       GtkTreeModel *model;
-       GHashTable *refs_for_headers;
        OpenMsgHelper *helper;
-       GtkTreeSelection *sel;
-       GList *sel_list = NULL, *sel_list_iter = NULL;
+       ModestWindow *window;
+               
+       g_return_if_fail (header != NULL && rowref != NULL);
 
-       g_return_if_fail (headers != NULL);
+       mgr = modest_runtime_get_window_mgr ();
 
-       /* Check that only one message is selected for opening */
-       if (tny_list_get_length (headers) != 1) {
-               modest_platform_information_banner ((win) ? GTK_WIDGET (win) : NULL,
-                                                   NULL, _("mcen_ib_select_one_message"));
+        /* get model */
+       header_view = get_header_view_from_window (MODEST_WINDOW (win));
+       if (header_view == NULL)
                return;
-       }
-
-       mgr = modest_runtime_get_window_mgr ();
-       iter = tny_list_create_iterator (headers);
 
        /* Get the account */
-       account = get_account_from_header_list (headers);
-
+       account = get_account_from_header (header);
        if (!account)
                return;
 
-       if (!MODEST_IS_MAIN_WINDOW (win) && path == NULL)
-               return;
-       
-        /* get model */
-       if (MODEST_IS_MAIN_WINDOW (win)) {
-               header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
-#ifdef MODEST_TOOLKIT_HILDON2
-       } else if (MODEST_IS_HEADER_WINDOW (win)){
-#endif
-               header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
-       }
-
-       if (!header_view)
-               return;
-
-       model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
-       if (path && MODEST_IS_HEADER_WINDOW (win)) {
-               sel_list = g_list_prepend (NULL, gtk_tree_path_copy (path));
-       } else {
-               /* Get the selections, we need to get the references to the
-                  rows here because the treeview/model could dissapear (the
-                  user might want to select another folder)*/
-               sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
-               sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
-       }
-       refs_for_headers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, 
-                                                 (GDestroyNotify) gtk_tree_row_reference_free);
-
-       /* Look if we already have a message view for each header. If
-          true, then remove the header from the list of headers to
-          open */
-       sel_list_iter = sel_list;
-
-       not_opened_headers = tny_simple_list_new ();
-       while (!tny_iterator_is_done (iter) && sel_list_iter) {
-
-               ModestWindow *window = NULL;
-               TnyHeader *header = NULL;
-               gboolean found = FALSE;
-
-               header = TNY_HEADER (tny_iterator_get_current (iter));
-               if (header)
-                       flags = tny_header_get_flags (header);
-
-               window = NULL;
-               found = modest_window_mgr_find_registered_header (mgr, header, &window);
-
-               /* Do not open again the message and present the
-                  window to the user */
-               if (found) {
-                       if (window) {
+       window = NULL;
+       found = modest_window_mgr_find_registered_header (mgr, header, &window);
+               
+       /* Do not open again the message and present the
+          window to the user */
+       if (found) {
+               if (window) {
 #ifndef MODEST_TOOLKIT_HILDON2
-                               gtk_window_present (GTK_WINDOW (window));
+                       gtk_window_present (GTK_WINDOW (window));
 #endif
-                       } else {
-                               /* the header has been registered already, we don't do
-                                * anything but wait for the window to come up*/
-                               g_debug ("header %p already registered, waiting for window", header);
-                       }
                } else {
-                       GtkTreeRowReference *row_reference;
-
-                       tny_list_append (not_opened_headers, G_OBJECT (header));
-                       /* Create a new row reference and add it to the hash table */
-                       row_reference = gtk_tree_row_reference_new (model, (GtkTreePath *) sel_list_iter->data);
-                       g_hash_table_insert (refs_for_headers, header, row_reference);
+                       /* the header has been registered already, we don't do
+                        * anything but wait for the window to come up*/
+                       g_debug ("header %p already registered, waiting for window", header);
                }
-
-               if (header)
-                       g_object_unref (header);
-
-               /* Go to next */
-               tny_iterator_next (iter);
-               sel_list_iter = g_list_next (sel_list_iter);
+               goto cleanup;
        }
-       g_object_unref (iter);
-       iter = NULL;
-       g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
-       g_list_free (sel_list);
 
        /* Open each message */
-       if (tny_list_get_length (not_opened_headers) == 0) {
-               g_hash_table_destroy (refs_for_headers);
-               goto cleanup;
-       }
-       
-       /* If some messages would have to be downloaded, ask the user to 
-        * make a connection. It's generally easier to do this here (in the mainloop) 
-        * than later in a thread:
-        */
-       if (tny_list_get_length (not_opened_headers) > 0) {
-               uncached_msgs = header_list_count_uncached_msgs (not_opened_headers);
-
-               if (uncached_msgs > 0) {
-                       /* Allways download if we are online. */
-                       if (!tny_device_is_online (modest_runtime_get_device ())) {
-                               gint response;
-
-                               /* If ask for user permission to download the messages */
-                               response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
-                                                                                   ngettext("mcen_nc_get_msg",
-                                                                                            "mcen_nc_get_msgs",
-                                                                                            uncached_msgs));
-
-                               /* End if the user does not want to continue */
-                               if (response == GTK_RESPONSE_CANCEL) {
-                                       g_hash_table_destroy (refs_for_headers);
-                                       goto cleanup;
-                               }
+       cached = tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED;
+       if (!cached) {
+               /* Allways download if we are online. */
+               if (!tny_device_is_online (modest_runtime_get_device ())) {
+                       gint response;
+
+                       /* If ask for user permission to download the messages */
+                       response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
+                                                                           _("mcen_nc_get_msg"));
+
+                       /* End if the user does not want to continue */
+                       if (response == GTK_RESPONSE_CANCEL) {
+                               goto cleanup;
                        }
                }
        }
 
-       /* Register the headers before actually creating the windows: */
-       iter_not_opened = tny_list_create_iterator (not_opened_headers);
-       while (!tny_iterator_is_done (iter_not_opened)) {
-               TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter_not_opened));
-               if (header) {
-                       modest_window_mgr_register_header (mgr, header, NULL);
-                       g_object_unref (header);
-               }
-               tny_iterator_next (iter_not_opened);
-       }
-       g_object_unref (iter_not_opened);
-       iter_not_opened = NULL;
+       /* We register the window for opening */
+       modest_window_mgr_register_header (mgr, header, NULL);
 
        /* Create the helper. We need to get a reference to the model
           here because it could change while the message is readed
           (the user could switch between folders) */
        helper = g_slice_new (OpenMsgHelper);
-       helper->model = g_object_ref (model);
-       helper->headers = g_object_ref (not_opened_headers);
-       helper->row_refs_per_header = refs_for_headers;
+       helper->model = g_object_ref (gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)));
+       helper->header = g_object_ref (header);
+       helper->rowref = gtk_tree_row_reference_copy (rowref);
        helper->banner_info = NULL;
 
        /* Connect to the account and perform */
-       if (uncached_msgs > 0) {
+       if (!cached) {
                modest_platform_connect_and_perform ((GtkWindow *) win, TRUE, g_object_ref (account), 
-                                                    open_msgs_performer, helper);
+                                                    open_msg_performer, helper);
        } else {
                /* Call directly the performer, do not need to connect */
-               open_msgs_performer (FALSE, NULL, (GtkWindow *) win, 
-                                    g_object_ref (account), helper);
+               open_msg_performer (FALSE, NULL, (GtkWindow *) win, 
+                                   g_object_ref (account), helper);
        }
 cleanup:
        /* Clean */
        if (account)
                g_object_unref (account);
-       if (not_opened_headers)
-               g_object_unref (not_opened_headers);
 }
 
 void
 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
 {
        TnyList *headers;
+       TnyHeader *header;
+       gint headers_count;
+       TnyIterator *iter;
        
        /* we check for low-mem; in that case, show a warning, and don't allow
         * opening
@@ -1526,8 +1469,26 @@ modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
        if (!headers)
                return;
 
+       headers_count = tny_list_get_length (headers);
+       if (headers_count != 1) {
+               if (headers_count > 1) {
+                       /* Don't allow activation if there are more than one message selected */
+                       modest_platform_information_banner (NULL, NULL, _("mcen_ib_select_one_message"));
+               }
+
+               g_object_unref (headers);
+               return;
+       }
+
+       iter = tny_list_create_iterator (headers);
+       header = TNY_HEADER (tny_iterator_get_current (iter));
+       g_object_unref (iter);
+
        /* Open them */
-       open_msgs_from_headers (headers, NULL, win);
+       if (header) {
+               open_msg_from_header (header, NULL, win);
+               g_object_unref (header);
+       }
 
        g_object_unref(headers);
 }
@@ -2354,15 +2315,15 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
                                       GtkTreePath *path,
                                       ModestWindow *window)
 {
-       TnyList *headers;
+       GtkWidget *open_widget;
+       GtkTreeRowReference *rowref;
 
        g_return_if_fail (MODEST_IS_WINDOW(window));
+       g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
+       g_return_if_fail (TNY_IS_HEADER (header));
 
-       if (!header)
-               return;
-
-       if (MODEST_IS_MAIN_WINDOW (window) &&
-           modest_header_view_count_selected_headers (header_view) > 1) {
+       if (modest_header_view_count_selected_headers (header_view) > 1) {
+               /* Don't allow activation if there are more than one message selected */
                modest_platform_information_banner (NULL, NULL, _("mcen_ib_select_one_message"));
                return;
        }
@@ -2380,16 +2341,9 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
                        return;
        }
 
-       if (MODEST_IS_MAIN_WINDOW (window)) {
-               headers = modest_header_view_get_selected_headers (header_view);
-       } else {
-               headers = tny_simple_list_new ();
-               tny_list_prepend (TNY_LIST (headers), G_OBJECT (header));
-       }
-
-       open_msgs_from_headers (headers, path, MODEST_WINDOW (window));
-
-       g_object_unref (headers);
+       rowref = gtk_tree_row_reference_new (gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)), path);
+       open_msg_from_header (header, rowref, MODEST_WINDOW (window));
+       gtk_tree_row_reference_free (rowref);
 }
 
 static void
@@ -4418,6 +4372,19 @@ modest_ui_actions_on_details (GtkAction *action,
                        /* Show details of each header */
                        do_headers_action (win, headers_action_show_details, header_view);
                }
+#ifdef MODEST_TOOLKIT_HILDON2
+       } else if (MODEST_IS_HEADER_WINDOW (win)) {
+               TnyFolder *folder;
+               GtkWidget *header_view;
+
+               header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
+               folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
+               if (folder) {
+                       modest_platform_run_folder_details_dialog (GTK_WINDOW (win), 
+                                                                  folder);
+                       g_object_unref (folder);
+               }
+#endif
        }
 }
 
index f69e6ed..86ecbff 100644 (file)
@@ -46,10 +46,14 @@ libmodest_widgets_la_SOURCES=          \
        modest-attachments-view.h      \
        modest-combo-box.c             \
        modest-combo-box.h             \
+       modest-compact-mail-header-view.c \
+       modest-compact-mail-header-view.h \
        modest-default-account-settings-dialog.h \
        modest-dnd.c                   \
        modest-dnd.h                   \
        modest-easysetup-wizard-page.c \
+       modest-expander-mail-header-view.c      \
+       modest-expander-mail-header-view.h      \
        modest-folder-view.c           \
        modest-global-settings-dialog.c \
        modest-global-settings-dialog.h \
@@ -70,8 +74,8 @@ libmodest_widgets_la_SOURCES=          \
        modest-isearch-view.h          \
        modest-limit-retrieve-combo-box.h \
        modest-limit-retrieve-combo-box.c \
-       modest-mail-header-view.c      \
-       modest-mail-header-view.h      \
+       modest-mail-header-view.h \
+       modest-mail-header-view.c \
        modest-main-window.h           \
        modest-mime-part-view.c        \
        modest-mime-part-view.h        \
diff --git a/src/widgets/modest-expander-mail-header-view.c b/src/widgets/modest-expander-mail-header-view.c
new file mode 100644 (file)
index 0000000..dcb4f0c
--- /dev/null
@@ -0,0 +1,645 @@
+/* Copyright (c) 2007, Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ *   contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <config.h>
+//#include <glib/gi18n-lib.h>
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include <modest-text-utils.h>
+#include <modest-expander-mail-header-view.h>
+#include <modest-tny-folder.h>
+#include <modest-recpt-view.h>
+
+static GObjectClass *parent_class = NULL;
+
+typedef struct _ModestExpanderMailHeaderViewPriv ModestExpanderMailHeaderViewPriv;
+
+struct _ModestExpanderMailHeaderViewPriv
+{
+       GtkWidget    *fromto_label;
+       GtkWidget    *fromto_contents;
+       GtkWidget    *main_vbox;
+       GtkWidget    *expander;
+       GtkWidget    *headers_vbox;
+       GtkWidget    *subject_box;
+       GtkWidget    *priority_icon;
+       GtkSizeGroup *labels_size_group;
+       gboolean     is_outgoing;
+       gboolean     is_draft;
+       TnyHeader    *header;
+       TnyHeaderFlags priority_flags;
+};
+
+#define MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE(o)        \
+       (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, ModestExpanderMailHeaderViewPriv))
+
+/* GObject */
+static void modest_expander_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class);
+static void modest_expander_mail_header_view_class_init (ModestExpanderMailHeaderViewClass *klass);
+static void modest_expander_mail_header_view_finalize (GObject *object);
+
+/* TnyHeaderView interface */
+static void tny_header_view_init (gpointer g, gpointer iface_data);
+static void modest_expander_mail_header_view_set_header (TnyHeaderView *self, TnyHeader *header);
+static void modest_expander_mail_header_view_update_is_outgoing (TnyHeaderView *self);
+static void modest_expander_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header);
+static void modest_expander_mail_header_view_clear (TnyHeaderView *self);
+static void modest_expander_mail_header_view_clear_default (TnyHeaderView *self);
+
+/* ModestMailHeaderView interface */
+static void modest_mail_header_view_init (gpointer g, gpointer iface_data);
+static TnyHeaderFlags modest_expander_mail_header_view_get_priority (ModestMailHeaderView *self);
+static TnyHeaderFlags modest_expander_mail_header_view_get_priority_default (ModestMailHeaderView *headers_view);
+static void modest_expander_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags);
+static void modest_expander_mail_header_view_set_priority_default (ModestMailHeaderView *headers_view,
+                                                                  TnyHeaderFlags flags);
+static const GtkWidget *modest_expander_mail_header_view_add_custom_header (ModestMailHeaderView *self,
+                                                                           const gchar *label,
+                                                                           GtkWidget *custom_widget,
+                                                                           gboolean with_expander,
+                                                                           gboolean start);
+static const GtkWidget *modest_expander_mail_header_view_add_custom_header_default (ModestMailHeaderView *self,
+                                                                                   const gchar *label,
+                                                                                   GtkWidget *custom_widget,
+                                                                                   gboolean with_expander,
+                                                                                   gboolean start);
+
+/* internal */
+static void add_date_time_header (ModestExpanderMailHeaderView *mail_header, const gchar *name, time_t date);
+static void activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data);
+static void add_recpt_header (ModestExpanderMailHeaderView *widget, const gchar *field, const gchar *value);
+static void clean_headers (GtkWidget *vbox);
+static void expander_activate (GtkWidget *expander, ModestExpanderMailHeaderView *header_view);
+
+
+
+static void
+add_date_time_header (ModestExpanderMailHeaderView *mail_header, const gchar *name, time_t date)
+{
+       const guint BUF_SIZE = 64; 
+       gchar date_buf [BUF_SIZE];
+       gchar time_buf [BUF_SIZE];
+
+       ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (mail_header);
+       GtkWidget *hbox, *date_hbox, *time_hbox;
+       GtkWidget *label;
+
+       modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date);
+       modest_text_utils_strftime (time_buf, BUF_SIZE, "%X", date);
+
+       hbox = gtk_hbox_new (FALSE, 48);
+       date_hbox = gtk_hbox_new (FALSE, 12);
+       time_hbox = gtk_hbox_new (FALSE, 12);
+
+       label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (label), name);
+       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.0);
+       gtk_box_pack_start (GTK_BOX (date_hbox), label, FALSE, FALSE, 0);
+       gtk_size_group_add_widget (priv->labels_size_group, label);
+
+       label = gtk_label_new(date_buf);
+       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
+       gtk_box_pack_start (GTK_BOX (date_hbox), label, TRUE, TRUE, 0);
+
+       gtk_box_pack_start (GTK_BOX (hbox), date_hbox, FALSE, FALSE, 0);
+
+       label = gtk_label_new(NULL);
+       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
+       gtk_label_set_markup (GTK_LABEL (label), _("mail_va_time"));
+       gtk_box_pack_start (GTK_BOX (time_hbox), label, FALSE, FALSE, 0);
+
+       label = gtk_label_new(time_buf);
+       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
+       gtk_box_pack_start (GTK_BOX (time_hbox), label, TRUE, TRUE, 0);
+
+       gtk_box_pack_start (GTK_BOX (hbox), time_hbox, TRUE, TRUE, 0);
+
+       gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
+       gtk_widget_show (hbox);
+}
+
+static void
+activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data)
+{
+       ModestExpanderMailHeaderView * view = MODEST_EXPANDER_MAIL_HEADER_VIEW (user_data);
+
+       g_signal_emit_by_name (G_OBJECT (view), "recpt-activated", address);
+}
+
+
+static void
+add_recpt_header (ModestExpanderMailHeaderView *widget, const gchar *field, const gchar *value)
+{
+       ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (widget);
+       GtkWidget *hbox;
+       GtkWidget *label_field, *label_value;
+
+       hbox = gtk_hbox_new (FALSE, 12);
+       label_field = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (label_field), field);
+       gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
+       label_value = modest_recpt_view_new ();
+       modest_recpt_view_set_recipients (MODEST_RECPT_VIEW(label_value), value);
+       g_signal_connect (G_OBJECT (label_value), "activate", G_CALLBACK (activate_recpt), widget);
+
+       gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
+       gtk_box_pack_start (GTK_BOX (hbox), label_value, TRUE, TRUE, 0);
+       gtk_size_group_add_widget (priv->labels_size_group, label_field);
+       
+       gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
+
+       gtk_widget_show (hbox);
+}
+
+static void
+clean_headers (GtkWidget *vbox)
+{
+       GList *headers_list, *node;
+
+       headers_list = gtk_container_get_children (GTK_CONTAINER (vbox));
+
+       for (node = headers_list; node != NULL; node = g_list_next (node)) {
+               gtk_widget_destroy (GTK_WIDGET (node->data));
+       }
+       g_list_free (headers_list);
+}
+
+static void 
+modest_expander_mail_header_view_set_header (TnyHeaderView *self, TnyHeader *header)
+{
+       MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->set_header_func (self, header);
+       return;
+}
+
+static void
+modest_expander_mail_header_view_update_is_outgoing (TnyHeaderView *self)
+{
+       ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+       TnyFolder *folder = NULL;
+     
+       priv->is_outgoing = FALSE;
+
+       if (priv->header == NULL)
+               return;
+       
+       folder = tny_header_get_folder (priv->header);
+
+       if (folder) {
+               TnyFolderType folder_type = tny_folder_get_folder_type (folder);
+
+               switch (folder_type) {
+               case TNY_FOLDER_TYPE_DRAFTS:
+               case TNY_FOLDER_TYPE_OUTBOX:
+               case TNY_FOLDER_TYPE_SENT:
+                       priv->is_outgoing = TRUE;
+                       break;
+               default:
+                       priv->is_outgoing = FALSE;
+               }
+               priv->is_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
+
+               g_object_unref (folder);
+       }
+}
+
+static void 
+modest_expander_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header)
+{
+       ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+
+       if (header)
+               g_assert (TNY_IS_HEADER (header));
+
+       if (G_LIKELY (priv->header))
+               g_object_unref (G_OBJECT (priv->header));
+       priv->header = NULL;
+
+       clean_headers (priv->headers_vbox);
+
+       if (header && G_IS_OBJECT (header))
+       {
+               gchar *to, *from, *subject, *bcc, *cc;
+               GtkWidget *subject_label;
+
+               g_object_ref (G_OBJECT (header)); 
+               priv->header = header;
+
+               modest_expander_mail_header_view_update_is_outgoing (self);
+
+
+               to = tny_header_dup_to (header);
+               from = tny_header_dup_from (header);
+               subject = tny_header_dup_subject (header);
+               cc = tny_header_dup_cc (header);
+               bcc = tny_header_dup_bcc (header);
+
+               priv->subject_box = gtk_hbox_new (FALSE, 0);
+               subject_label = gtk_label_new (NULL);
+               if (subject && (subject[0] != '\0'))
+                       gtk_label_set_text (GTK_LABEL (subject_label), subject);
+               else
+                       gtk_label_set_text (GTK_LABEL (subject_label), _("mail_va_no_subject"));
+               gtk_label_set_single_line_mode (GTK_LABEL (subject_label), TRUE);
+               gtk_label_set_ellipsize (GTK_LABEL (subject_label), PANGO_ELLIPSIZE_END);
+               gtk_label_set_selectable (GTK_LABEL (subject_label), TRUE);
+               gtk_misc_set_alignment (GTK_MISC (subject_label), 0.0, 0.0);
+
+               priv->priority_icon = NULL;
+               gtk_box_pack_end (GTK_BOX (priv->subject_box), subject_label, TRUE, TRUE, 0);
+               if (priv->is_outgoing) {
+                       gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_to"));
+                       if (to)
+                               modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), to);
+                       if (cc)
+                               add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
+                       if (bcc)
+                               add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
+                       if (priv->is_draft&& from)
+                               add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_from"), from);
+                       modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"),
+                                                                  priv->subject_box, TRUE, TRUE);
+                       if (priv->is_draft)
+                               add_date_time_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_created"),
+                                                     tny_header_get_date_sent (header));
+                       else
+                               add_date_time_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_sent"),
+                                                     tny_header_get_date_sent (header));
+               } else {
+                       gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_from"));
+                       if (from)
+                               modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), from);
+                       if (to)
+                               add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_to"), to);
+                       if (cc)
+                               add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
+                       if (bcc)
+                               add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
+                       modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"),
+                                                                  priv->subject_box, TRUE, TRUE);
+                       add_date_time_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_date"),
+                                             tny_header_get_date_received (header));
+               }
+               g_free (subject);
+               g_free (to);
+               g_free (from);
+               g_free (cc);
+               g_free (bcc);
+       }
+
+       gtk_widget_show_all (GTK_WIDGET (self));
+
+       return;
+}
+
+static void 
+modest_expander_mail_header_view_clear (TnyHeaderView *self)
+{
+       MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->clear_func (self);
+       return;
+}
+
+static void 
+modest_expander_mail_header_view_clear_default (TnyHeaderView *self)
+{
+       ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+
+       if (G_LIKELY (priv->header))
+               g_object_unref (G_OBJECT (priv->header));
+       priv->header = NULL;
+
+       clean_headers (priv->headers_vbox);
+
+       gtk_label_set_text (GTK_LABEL (priv->fromto_label), "");
+       modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), "");
+
+       gtk_widget_hide (GTK_WIDGET(self));
+
+       return;
+}
+
+static void
+expander_activate (GtkWidget *expander, ModestExpanderMailHeaderView *header_view)
+{
+       ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (header_view);
+
+       gtk_widget_queue_resize (GTK_WIDGET (header_view));
+       gtk_widget_queue_draw (GTK_WIDGET (header_view));
+
+       if (gtk_expander_get_expanded (GTK_EXPANDER (expander))) {
+               if (gtk_widget_get_parent (priv->headers_vbox) == NULL) {
+                       gtk_box_pack_start (GTK_BOX(priv->main_vbox), priv->headers_vbox, TRUE, TRUE, 0);
+                       gtk_widget_show_all (GTK_WIDGET (priv->headers_vbox));
+               }
+       } else {
+               if (gtk_widget_get_parent (priv->headers_vbox) != NULL) {
+                       gtk_container_remove (GTK_CONTAINER (priv->main_vbox), priv->headers_vbox);
+               }
+       }
+       gtk_widget_queue_resize (GTK_WIDGET (priv->expander));
+       gtk_widget_queue_draw (GTK_WIDGET (priv->expander));
+}
+
+static const GtkWidget *
+modest_expander_mail_header_view_add_custom_header (ModestMailHeaderView *self,
+                                                   const gchar *label,
+                                                   GtkWidget *custom_widget,
+                                                   gboolean with_expander,
+                                                   gboolean start)
+{
+       return MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->add_custom_header_func (self, label,
+                                                                                         custom_widget, with_expander,
+                                                                                         start);
+}
+
+static const GtkWidget *
+modest_expander_mail_header_view_add_custom_header_default (ModestMailHeaderView *self,
+                                                           const gchar *label,
+                                                           GtkWidget *custom_widget,
+                                                           gboolean with_expander,
+                                                           gboolean start)
+{
+       ModestExpanderMailHeaderViewPriv *priv;
+       g_return_val_if_fail (MODEST_IS_EXPANDER_MAIL_HEADER_VIEW (self), NULL);
+       GtkWidget *hbox;
+       GtkWidget *label_field;
+
+       priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+       hbox = gtk_hbox_new (FALSE, 12);
+       label_field = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (label_field), label);
+       gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
+       gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
+       gtk_box_pack_start (GTK_BOX (hbox), custom_widget, TRUE, TRUE, 0);
+       gtk_size_group_add_widget (priv->labels_size_group, label_field);
+
+       if (with_expander) {
+               if (start)
+                       gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
+               else
+                       gtk_box_pack_end (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
+       } else {
+               if (start)
+                       gtk_box_pack_start (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
+               else
+                       gtk_box_pack_end (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
+       }
+
+       return hbox;
+}
+
+/**
+ * modest_expander_mail_header_view_new:
+ *
+ * Return value: a new #ModestHeaderView instance implemented for Gtk+
+ **/
+TnyHeaderView*
+modest_expander_mail_header_view_new (gboolean expanded)
+{
+       ModestExpanderMailHeaderViewPriv *priv;
+       ModestExpanderMailHeaderView *self = g_object_new (MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, NULL);
+
+       priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+       gtk_expander_set_expanded (GTK_EXPANDER (priv->expander), expanded);
+       expander_activate (priv->expander, self);
+
+       return TNY_HEADER_VIEW (self);
+}
+
+static void
+modest_expander_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class)
+{
+       ModestExpanderMailHeaderView *self = (ModestExpanderMailHeaderView *)instance;
+       ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+       GtkWidget *fromto_hbox = NULL;
+       GtkSizeGroup *expander_group = NULL;
+
+       priv->header = NULL;
+
+       priv->expander = gtk_expander_new (NULL);
+       priv->main_vbox = gtk_vbox_new (FALSE, 1);
+       gtk_box_pack_start (GTK_BOX (instance), priv->expander, FALSE, FALSE, 0);
+       gtk_box_pack_start (GTK_BOX (instance), priv->main_vbox, TRUE, TRUE, 0);
+       g_signal_connect_after (G_OBJECT (priv->expander), "activate", G_CALLBACK (expander_activate), instance);
+
+       fromto_hbox = gtk_hbox_new (FALSE, 12);
+       priv->fromto_label = gtk_label_new (NULL);
+       gtk_misc_set_alignment (GTK_MISC (priv->fromto_label), 1.0, 0.0);
+       priv->fromto_contents = modest_recpt_view_new ();
+       g_signal_connect (G_OBJECT (priv->fromto_contents), "activate", G_CALLBACK (activate_recpt), instance);
+
+       gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_label, FALSE, FALSE, 0);
+       gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_contents, TRUE, TRUE, 0);
+       gtk_box_pack_start (GTK_BOX (priv->main_vbox), fromto_hbox, FALSE, FALSE, 0);
+
+       priv->labels_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+       gtk_size_group_add_widget (priv->labels_size_group, priv->fromto_label);
+       
+       priv->headers_vbox = gtk_vbox_new (FALSE, 0);
+       gtk_container_set_focus_chain (GTK_CONTAINER (priv->headers_vbox), NULL);
+       g_object_ref (priv->headers_vbox);
+
+       expander_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+       gtk_size_group_add_widget (expander_group, priv->headers_vbox);
+       gtk_size_group_add_widget (expander_group, fromto_hbox);
+       g_object_unref (expander_group);
+
+       gtk_container_set_reallocate_redraws (GTK_CONTAINER (instance), TRUE);
+
+       priv->is_outgoing = FALSE;
+       priv->is_draft = FALSE;
+
+       return;
+}
+
+static void
+modest_expander_mail_header_view_finalize (GObject *object)
+{
+       ModestExpanderMailHeaderView *self = (ModestExpanderMailHeaderView *)object;    
+       ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+
+       if (G_LIKELY (priv->header))
+               g_object_unref (G_OBJECT (priv->header));
+       priv->header = NULL;
+
+       if (G_LIKELY (priv->headers_vbox))
+               g_object_unref (G_OBJECT (priv->headers_vbox));
+
+       priv->headers_vbox = NULL;
+
+       g_object_unref (priv->labels_size_group);
+
+       (*parent_class->finalize) (object);
+
+       return;
+}
+
+static void
+tny_header_view_init (gpointer g, gpointer iface_data)
+{
+       TnyHeaderViewIface *klass = (TnyHeaderViewIface *)g;
+
+       klass->set_header = modest_expander_mail_header_view_set_header;
+       klass->clear = modest_expander_mail_header_view_clear;
+
+       return;
+}
+
+static void
+modest_mail_header_view_init (gpointer g, gpointer iface_data)
+{
+       ModestMailHeaderViewIface *klass = (ModestMailHeaderViewIface *)g;
+
+       klass->get_priority = modest_expander_mail_header_view_get_priority;
+       klass->set_priority = modest_expander_mail_header_view_set_priority;
+       klass->add_custom_header = modest_expander_mail_header_view_add_custom_header;
+
+       return;
+}
+
+static void 
+modest_expander_mail_header_view_class_init (ModestExpanderMailHeaderViewClass *klass)
+{
+       GObjectClass *object_class;
+
+       parent_class = g_type_class_peek_parent (klass);
+       object_class = (GObjectClass*) klass;
+
+       klass->set_header_func = modest_expander_mail_header_view_set_header_default;
+       klass->clear_func = modest_expander_mail_header_view_clear_default;
+       klass->set_priority_func = modest_expander_mail_header_view_set_priority_default;
+       klass->get_priority_func = modest_expander_mail_header_view_get_priority_default;
+       klass->add_custom_header_func = modest_expander_mail_header_view_add_custom_header_default;
+
+       object_class->finalize = modest_expander_mail_header_view_finalize;
+
+       g_type_class_add_private (object_class, sizeof (ModestExpanderMailHeaderViewPriv));
+
+       return;
+}
+
+GType 
+modest_expander_mail_header_view_get_type (void)
+{
+       static GType type = 0;
+
+       if (G_UNLIKELY(type == 0))
+       {
+               static const GTypeInfo info = 
+               {
+                 sizeof (ModestExpanderMailHeaderViewClass),
+                 NULL,   /* base_init */
+                 NULL,   /* base_finalize */
+                 (GClassInitFunc) modest_expander_mail_header_view_class_init,   /* class_init */
+                 NULL,   /* class_finalize */
+                 NULL,   /* class_data */
+                 sizeof (ModestExpanderMailHeaderView),
+                 0,      /* n_preallocs */
+                 modest_expander_mail_header_view_instance_init    /* instance_init */
+               };
+
+               static const GInterfaceInfo tny_header_view_info = 
+               {
+                 (GInterfaceInitFunc) tny_header_view_init, /* interface_init */
+                 NULL,         /* interface_finalize */
+                 NULL          /* interface_data */
+               };
+
+               static const GInterfaceInfo modest_mail_header_view_info = 
+               {
+                 (GInterfaceInitFunc) modest_mail_header_view_init, /* interface_init */
+                 NULL,         /* interface_finalize */
+                 NULL          /* interface_data */
+               };
+
+               type = g_type_register_static (GTK_TYPE_HBOX,
+                       "ModestExpanderMailHeaderView",
+                       &info, 0);
+
+               g_type_add_interface_static (type, TNY_TYPE_HEADER_VIEW, 
+                       &tny_header_view_info);
+
+               g_type_add_interface_static (type, MODEST_TYPE_MAIL_HEADER_VIEW, 
+                       &modest_mail_header_view_info);
+
+       }
+
+       return type;
+}
+
+static TnyHeaderFlags
+modest_expander_mail_header_view_get_priority (ModestMailHeaderView *self)
+{
+       return MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->get_priority_func (self);
+}
+
+static TnyHeaderFlags
+modest_expander_mail_header_view_get_priority_default (ModestMailHeaderView *headers_view)
+{
+       ModestExpanderMailHeaderViewPriv *priv;
+
+       g_return_val_if_fail (MODEST_IS_EXPANDER_MAIL_HEADER_VIEW (headers_view), 0);
+       priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
+
+       return priv->priority_flags;
+}
+
+static void 
+modest_expander_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags)
+{
+       MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->set_priority_func (self, flags);
+       return;
+}
+
+static void
+modest_expander_mail_header_view_set_priority_default (ModestMailHeaderView *headers_view,
+                                                      TnyHeaderFlags flags)
+{
+       ModestExpanderMailHeaderViewPriv *priv;
+
+       g_return_if_fail (MODEST_IS_EXPANDER_MAIL_HEADER_VIEW (headers_view));
+       priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
+
+       priv->priority_flags = flags & TNY_HEADER_FLAG_PRIORITY_MASK ;
+
+       if (priv->priority_flags == TNY_HEADER_FLAG_NORMAL_PRIORITY) {
+               if (priv->priority_icon != NULL) {
+                       gtk_widget_destroy (priv->priority_icon);
+                       priv->priority_icon = NULL;
+               }
+       } else if (priv->priority_flags == TNY_HEADER_FLAG_HIGH_PRIORITY) {
+               priv->priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_high", GTK_ICON_SIZE_MENU);
+               gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
+               gtk_widget_show (priv->priority_icon);
+       } else if (priv->priority_flags == TNY_HEADER_FLAG_LOW_PRIORITY) {
+               priv->priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_low", GTK_ICON_SIZE_MENU);
+               gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
+               gtk_widget_show (priv->priority_icon);
+       }
+}
diff --git a/src/widgets/modest-expander-mail-header-view.h b/src/widgets/modest-expander-mail-header-view.h
new file mode 100644 (file)
index 0000000..0bdd712
--- /dev/null
@@ -0,0 +1,78 @@
+/* Copyright (c) 2007, 2008, Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ *   contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MODEST_EXPANDER_MAIL_HEADER_VIEW_H
+#define MODEST_EXPANDER_MAIL_HEADER_VIEW_H
+
+#include <gtk/gtk.h>
+#include <glib-object.h>
+
+#include <tny-header-view.h>
+#include <modest-mail-header-view.h>
+
+G_BEGIN_DECLS
+
+#define MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW             (modest_expander_mail_header_view_get_type ())
+#define MODEST_EXPANDER_MAIL_HEADER_VIEW(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, ModestExpanderMailHeaderView))
+#define MODEST_EXPANDER_MAIL_HEADER_VIEW_CLASS(vtable)    (G_TYPE_CHECK_CLASS_CAST ((vtable), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, ModestExpanderMailHeaderViewClass))
+#define MODEST_IS_EXPANDER_MAIL_HEADER_VIEW(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW))
+#define MODEST_IS_EXPANDER_MAIL_HEADER_VIEW_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW))
+#define MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS(inst)  (G_TYPE_INSTANCE_GET_CLASS ((inst), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, ModestExpanderMailHeaderViewClass))
+
+typedef struct _ModestExpanderMailHeaderView ModestExpanderMailHeaderView;
+typedef struct _ModestExpanderMailHeaderViewClass ModestExpanderMailHeaderViewClass;
+
+struct _ModestExpanderMailHeaderView
+{
+       GtkHBox parent;
+
+};
+
+struct _ModestExpanderMailHeaderViewClass
+{
+       GtkHBoxClass parent_class;
+
+       /* virtual methods */
+       void (*set_header_func) (TnyHeaderView *self, TnyHeader *header);
+       void (*clear_func) (TnyHeaderView *self);
+       void (*set_priority_func) (ModestMailHeaderView *self, TnyHeaderFlags flags);
+       TnyHeaderFlags (*get_priority_func) (ModestMailHeaderView *self);
+       const GtkWidget *(*add_custom_header_func) (ModestMailHeaderView *self,
+                                                   const gchar *label,
+                                                   GtkWidget *custom_widget,
+                                                   gboolean with_expander,
+                                                   gboolean start);
+};
+
+GType modest_expander_mail_header_view_get_type (void);
+TnyHeaderView* modest_expander_mail_header_view_new (gboolean expanded);                                                    
+
+G_END_DECLS
+
+#endif
index c65a7a9..aaa7cc0 100644 (file)
@@ -457,11 +457,15 @@ text_cell_data  (GtkTreeViewColumn *column,
                        gchar * substring;
                        if (number > 0) {
                                substring = g_strdup_printf (drafts?"TODO:%d messages":"TODO:%d new messages", number);
+                               item_name = g_strdup_printf ("<span weight='800'>%s</span>\n<span weight='800' size='x-small' color='grey'>%s</span>", 
+                                                            fname, substring);
+                               item_weight = 800;
                        } else {
                                substring = g_strdup ("");
+                               item_name = g_strdup_printf ("%s\n<span size='x-small' color='grey'>%s</span>", 
+                                                            fname, substring);
+                               item_weight = 400;
                        }
-                       item_name = g_strdup_printf ("%s\n<span size='x-small' color='grey'>%s</span>", 
-                                                    fname, substring);
                        g_free (substring);
                } else {
                        /* Use bold font style if there are unread or unset messages */
index 75c5526..fa95a26 100644 (file)
 #include <modest-tny-msg.h>
 #include <modest-text-utils.h>
 #include <widgets/modest-msg-view.h>
+#ifdef MODEST_TOOLKIT_HILDON2
+#include <widgets/modest-compact-mail-header-view.h>
+#else
 #include <widgets/modest-mail-header-view.h>
+#endif
 #include <widgets/modest-attachments-view.h>
 #include <modest-marshal.h>
 #include <widgets/modest-gtkhtml-mime-part-view.h>
@@ -71,6 +75,7 @@ static void     get_property (GObject *object, guint prop_id, GValue *value, GPa
 
 /* headers signals */
 static void on_recpt_activated (ModestMailHeaderView *header_view, const gchar *address, ModestGtkhtmlMsgView *msg_view);
+static void on_show_details (ModestMailHeaderView *header_view, ModestGtkhtmlMsgView *msg_view);
 static void on_attachment_activated (ModestAttachmentsView * att_view, TnyMimePart *mime_part, gpointer userdata);
 static void on_view_images_clicked (GtkButton * button, gpointer self);
 
@@ -1058,7 +1063,11 @@ modest_gtkhtml_msg_view_init (ModestGtkhtmlMsgView *obj)
        priv->msg                     = NULL;
 
        priv->body_view                 = GTK_WIDGET (g_object_new (MODEST_TYPE_GTKHTML_MIME_PART_VIEW, NULL));
-       priv->mail_header_view        = GTK_WIDGET(modest_mail_header_view_new (TRUE));
+#ifdef MODEST_TOOLKIT_HILDON2
+       priv->mail_header_view        = GTK_WIDGET(modest_compact_mail_header_view_new ());
+#else
+       priv->mail_header_view        = GTK_WIDGET(modest_expander_mail_header_view_new (TRUE));
+#endif
        priv->view_images_button = gtk_button_new_with_label (_("mail_bd_external_images"));
        gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
        gtk_widget_set_no_show_all (priv->view_images_button, TRUE);
@@ -1081,6 +1090,8 @@ modest_gtkhtml_msg_view_init (ModestGtkhtmlMsgView *obj)
 
        g_signal_connect (G_OBJECT (priv->mail_header_view), "recpt-activated", 
                          G_CALLBACK (on_recpt_activated), obj);
+       g_signal_connect (G_OBJECT (priv->mail_header_view), "show-details", 
+                         G_CALLBACK (on_show_details), obj);
 
        g_signal_connect (G_OBJECT (priv->attachments_view), "activate",
                          G_CALLBACK (on_attachment_activated), obj);
@@ -1417,6 +1428,13 @@ on_recpt_activated (ModestMailHeaderView *header_view,
 }
 
 static void
+on_show_details (ModestMailHeaderView *header_view, 
+                ModestGtkhtmlMsgView *self)
+{
+       g_signal_emit_by_name (G_OBJECT (self), "show-details");
+}
+
+static void
 on_attachment_activated (ModestAttachmentsView * att_view, TnyMimePart *mime_part, gpointer self)
 {
 
index 7a9ad29..7efb1dc 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, Nokia Corporation
+/* Copyright (c) 2008, Nokia Corporation
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  */
 
 #include <config.h>
-//#include <glib/gi18n-lib.h>
 
-#include <string.h>
-#include <gtk/gtk.h>
-#include <modest-text-utils.h>
-#include <modest-mail-header-view.h>
-#include <modest-tny-folder.h>
+#include <widgets/modest-mail-header-view.h>
+#include <modest-marshal.h>
 
-static GObjectClass *parent_class = NULL;
-
-/* signals */
 enum {
        RECPT_ACTIVATED_SIGNAL,
+       SHOW_DETAILS_SIGNAL,
        LAST_SIGNAL
 };
-
-typedef struct _ModestMailHeaderViewPriv ModestMailHeaderViewPriv;
-
-struct _ModestMailHeaderViewPriv
-{
-       GtkWidget    *fromto_label;
-       GtkWidget    *fromto_contents;
-       GtkWidget    *main_vbox;
-       GtkWidget    *expander;
-       GtkWidget    *headers_vbox;
-       GtkWidget    *subject_box;
-       GtkWidget    *priority_icon;
-       GtkSizeGroup *labels_size_group;
-       gboolean     is_outgoing;
-       gboolean     is_draft;
-       TnyHeader    *header;
-       TnyHeaderFlags priority_flags;
-};
-
-#define MODEST_MAIL_HEADER_VIEW_GET_PRIVATE(o) \
-       (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_MAIL_HEADER_VIEW, ModestMailHeaderViewPriv))
-
 static guint signals[LAST_SIGNAL] = {0};
 
-static void
-add_date_time_header (ModestMailHeaderView *mail_header, const gchar *name, time_t date)
-{
-       const guint BUF_SIZE = 64; 
-       gchar date_buf [BUF_SIZE];
-       gchar time_buf [BUF_SIZE];
-
-       ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (mail_header);
-       GtkWidget *hbox, *date_hbox, *time_hbox;
-       GtkWidget *label;
-
-       modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date);
-       modest_text_utils_strftime (time_buf, BUF_SIZE, "%X", date);
-
-       hbox = gtk_hbox_new (FALSE, 48);
-       date_hbox = gtk_hbox_new (FALSE, 12);
-       time_hbox = gtk_hbox_new (FALSE, 12);
-
-       label = gtk_label_new (NULL);
-       gtk_label_set_markup (GTK_LABEL (label), name);
-       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.0);
-       gtk_box_pack_start (GTK_BOX (date_hbox), label, FALSE, FALSE, 0);
-       gtk_size_group_add_widget (priv->labels_size_group, label);
-
-       label = gtk_label_new(date_buf);
-       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
-       gtk_box_pack_start (GTK_BOX (date_hbox), label, TRUE, TRUE, 0);
-
-       gtk_box_pack_start (GTK_BOX (hbox), date_hbox, FALSE, FALSE, 0);
-
-       label = gtk_label_new(NULL);
-       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
-       gtk_label_set_markup (GTK_LABEL (label), _("mail_va_time"));
-       gtk_box_pack_start (GTK_BOX (time_hbox), label, FALSE, FALSE, 0);
-
-       label = gtk_label_new(time_buf);
-       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
-       gtk_box_pack_start (GTK_BOX (time_hbox), label, TRUE, TRUE, 0);
-
-       gtk_box_pack_start (GTK_BOX (hbox), time_hbox, TRUE, TRUE, 0);
-
-       gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
-       gtk_widget_show (hbox);
-}
-
-static void
-activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data)
-{
-       ModestMailHeaderView * view = MODEST_MAIL_HEADER_VIEW (user_data);
-
-       g_signal_emit (G_OBJECT (view), signals[RECPT_ACTIVATED_SIGNAL], 0, address);
-}
-
-#if 0 /* This function is not used. murrayc. */
-static void
-add_header (ModestMailHeaderView *widget, const gchar *field, const gchar *value)
-{
-       ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (widget);
-       GtkWidget *hbox;
-       GtkWidget *label_field, *label_value;
-       GtkWidget *scroll_text;
-       GtkTextBuffer *text_buffer;
-
-       hbox = gtk_hbox_new (FALSE, 12);
-       label_field = gtk_label_new (NULL);
-       gtk_label_set_markup (GTK_LABEL (label_field), field);
-       gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
-       scroll_text = modest_scroll_text_new (NULL, 2);
-       label_value = (GtkWidget *) modest_scroll_text_get_text_view (MODEST_SCROLL_TEXT (scroll_text));
-       text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (label_value));
-       gtk_text_buffer_set_text (text_buffer, value, -1);
-
-       gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
-       gtk_box_pack_start (GTK_BOX (hbox), scroll_text, TRUE, TRUE, 0);
-       gtk_size_group_add_widget (priv->labels_size_group, label_field);
-       
-       gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
-       gtk_widget_show (hbox);
-       
-}
-#endif
-
-
-static void
-add_recpt_header (ModestMailHeaderView *widget, const gchar *field, const gchar *value)
-{
-       ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (widget);
-       GtkWidget *hbox;
-       GtkWidget *label_field, *label_value;
-
-       hbox = gtk_hbox_new (FALSE, 12);
-       label_field = gtk_label_new (NULL);
-       gtk_label_set_markup (GTK_LABEL (label_field), field);
-       gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
-       label_value = modest_recpt_view_new ();
-       modest_recpt_view_set_recipients (MODEST_RECPT_VIEW(label_value), value);
-       g_signal_connect (G_OBJECT (label_value), "activate", G_CALLBACK (activate_recpt), widget);
-
-       gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
-       gtk_box_pack_start (GTK_BOX (hbox), label_value, TRUE, TRUE, 0);
-       gtk_size_group_add_widget (priv->labels_size_group, label_field);
-       
-       gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
-
-       gtk_widget_show (hbox);
-}
-
-static void
-clean_headers (GtkWidget *vbox)
-{
-       GList *headers_list, *node;
-
-       headers_list = gtk_container_get_children (GTK_CONTAINER (vbox));
-
-       for (node = headers_list; node != NULL; node = g_list_next (node)) {
-               gtk_widget_destroy (GTK_WIDGET (node->data));
-       }
-       g_list_free (headers_list);
-}
-
-static void 
-modest_mail_header_view_set_header (TnyHeaderView *self, TnyHeader *header)
-{
-       MODEST_MAIL_HEADER_VIEW_GET_CLASS (self)->set_header_func (self, header);
-       return;
-}
-
-static void
-modest_mail_header_view_update_is_outgoing (TnyHeaderView *self)
-{
-       ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
-       TnyFolder *folder = NULL;
-     
-       priv->is_outgoing = FALSE;
-
-       if (priv->header == NULL)
-               return;
-       
-       folder = tny_header_get_folder (priv->header);
-
-       if (folder) {
-               TnyFolderType folder_type = tny_folder_get_folder_type (folder);
-
-               switch (folder_type) {
-               case TNY_FOLDER_TYPE_DRAFTS:
-               case TNY_FOLDER_TYPE_OUTBOX:
-               case TNY_FOLDER_TYPE_SENT:
-                       priv->is_outgoing = TRUE;
-                       break;
-               default:
-                       priv->is_outgoing = FALSE;
-               }
-               priv->is_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
-
-               g_object_unref (folder);
-       }
-}
-
-static void 
-modest_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header)
-{
-       ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
-
-       if (header)
-               g_assert (TNY_IS_HEADER (header));
-
-       if (G_LIKELY (priv->header))
-               g_object_unref (G_OBJECT (priv->header));
-       priv->header = NULL;
-
-       clean_headers (priv->headers_vbox);
-
-       if (header && G_IS_OBJECT (header))
-       {
-               gchar *to, *from, *subject, *bcc, *cc;
-               GtkWidget *subject_label;
-
-               g_object_ref (G_OBJECT (header)); 
-               priv->header = header;
-
-               modest_mail_header_view_update_is_outgoing (self);
-
-
-               to = tny_header_dup_to (header);
-               from = tny_header_dup_from (header);
-               subject = tny_header_dup_subject (header);
-               cc = tny_header_dup_cc (header);
-               bcc = tny_header_dup_bcc (header);
-
-               priv->subject_box = gtk_hbox_new (FALSE, 0);
-               subject_label = gtk_label_new (NULL);
-               if (subject && (subject[0] != '\0'))
-                       gtk_label_set_text (GTK_LABEL (subject_label), subject);
-               else
-                       gtk_label_set_text (GTK_LABEL (subject_label), _("mail_va_no_subject"));
-               gtk_label_set_single_line_mode (GTK_LABEL (subject_label), TRUE);
-               gtk_label_set_ellipsize (GTK_LABEL (subject_label), PANGO_ELLIPSIZE_END);
-               gtk_label_set_selectable (GTK_LABEL (subject_label), TRUE);
-               gtk_misc_set_alignment (GTK_MISC (subject_label), 0.0, 0.0);
-
-               /* TODO: code disabled until we can get real priority information from message */
-/*             if (tny_header_get_priority (header)) { */
-/*                     GtkWidget *priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_high", GTK_ICON_SIZE_MENU); */
-/*                     gtk_box_pack_start (GTK_BOX (subject_box), priority_icon, FALSE, FALSE, 0); */
-/*             } */
-               priv->priority_icon = NULL;
-               gtk_box_pack_end (GTK_BOX (priv->subject_box), subject_label, TRUE, TRUE, 0);
-               if (priv->is_outgoing) {
-                       gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_to"));
-                       if (to)
-                               modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), to);
-                       if (cc)
-                               add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
-                       if (bcc)
-                               add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
-                       if (priv->is_draft&& from)
-                               add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_from"), from);
-                       modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"),
-                                                                  priv->subject_box, TRUE, TRUE);
-                       if (priv->is_draft)
-                               add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_created"),
-                                                     tny_header_get_date_sent (header));
-                       else
-                               add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_sent"),
-                                                     tny_header_get_date_sent (header));
-               } else {
-                       gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_from"));
-                       if (from)
-                               modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), from);
-                       if (to)
-                               add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_to"), to);
-                       if (cc)
-                               add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
-                       if (bcc)
-                               add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
-                       modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"),
-                                                                  priv->subject_box, TRUE, TRUE);
-                       add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_date"),
-                                             tny_header_get_date_received (header));
-               }
-               g_free (subject);
-               g_free (to);
-               g_free (from);
-               g_free (cc);
-               g_free (bcc);
-       }
-
-       gtk_widget_show_all (GTK_WIDGET (self));
-
-       return;
-}
-
-static void 
-modest_mail_header_view_clear (TnyHeaderView *self)
-{
-       MODEST_MAIL_HEADER_VIEW_GET_CLASS (self)->clear_func (self);
-       return;
-}
-
-static void 
-modest_mail_header_view_clear_default (TnyHeaderView *self)
+TnyHeaderFlags
+modest_mail_header_view_get_priority (ModestMailHeaderView *self)
 {
-       ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
-
-       if (G_LIKELY (priv->header))
-               g_object_unref (G_OBJECT (priv->header));
-       priv->header = NULL;
-
-       clean_headers (priv->headers_vbox);
-
-       gtk_label_set_text (GTK_LABEL (priv->fromto_label), "");
-       modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), "");
-
-       gtk_widget_hide (GTK_WIDGET(self));
-
-       return;
+       return MODEST_MAIL_HEADER_VIEW_GET_IFACE (self)->get_priority (self);
 }
 
-static void
-expander_activate (GtkWidget *expander, ModestMailHeaderView *header_view)
+void
+modest_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags)
 {
-       ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (header_view);
-
-       gtk_widget_queue_resize (GTK_WIDGET (header_view));
-       gtk_widget_queue_draw (GTK_WIDGET (header_view));
-
-       if (gtk_expander_get_expanded (GTK_EXPANDER (expander))) {
-               if (gtk_widget_get_parent (priv->headers_vbox) == NULL) {
-                       gtk_box_pack_start (GTK_BOX(priv->main_vbox), priv->headers_vbox, TRUE, TRUE, 0);
-                       gtk_widget_show_all (GTK_WIDGET (priv->headers_vbox));
-               }
-       } else {
-               if (gtk_widget_get_parent (priv->headers_vbox) != NULL) {
-                       gtk_container_remove (GTK_CONTAINER (priv->main_vbox), priv->headers_vbox);
-               }
-       }
-       gtk_widget_queue_resize (GTK_WIDGET (priv->expander));
-       gtk_widget_queue_draw (GTK_WIDGET (priv->expander));
+       MODEST_MAIL_HEADER_VIEW_GET_IFACE (self)->set_priority (self, flags);
 }
 
 const GtkWidget *
-modest_mail_header_view_add_custom_header (ModestMailHeaderView *header_view,
+modest_mail_header_view_add_custom_header (ModestMailHeaderView *self,
                                           const gchar *label,
                                           GtkWidget *custom_widget,
                                           gboolean with_expander,
                                           gboolean start)
 {
-       ModestMailHeaderViewPriv *priv;
-       g_return_val_if_fail (MODEST_IS_MAIL_HEADER_VIEW (header_view), NULL);
-       GtkWidget *hbox;
-       GtkWidget *label_field;
-
-       priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (header_view);
-       hbox = gtk_hbox_new (FALSE, 12);
-       label_field = gtk_label_new (NULL);
-       gtk_label_set_markup (GTK_LABEL (label_field), label);
-       gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
-       gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
-       gtk_box_pack_start (GTK_BOX (hbox), custom_widget, TRUE, TRUE, 0);
-       gtk_size_group_add_widget (priv->labels_size_group, label_field);
-
-       if (with_expander) {
-               if (start)
-                       gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
-               else
-                       gtk_box_pack_end (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
-       } else {
-               if (start)
-                       gtk_box_pack_start (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
-               else
-                       gtk_box_pack_end (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
-       }
-
-       return hbox;
-}
-
-/**
- * modest_mail_header_view_new:
- *
- * Return value: a new #ModestHeaderView instance implemented for Gtk+
- **/
-TnyHeaderView*
-modest_mail_header_view_new (gboolean expanded)
-{
-       ModestMailHeaderViewPriv *priv;
-       ModestMailHeaderView *self = g_object_new (MODEST_TYPE_MAIL_HEADER_VIEW, NULL);
-
-       priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
-       gtk_expander_set_expanded (GTK_EXPANDER (priv->expander), expanded);
-       expander_activate (priv->expander, self);
-
-       return TNY_HEADER_VIEW (self);
+       return MODEST_MAIL_HEADER_VIEW_GET_IFACE (self)->add_custom_header (self, label, custom_widget, 
+                                                                           with_expander, start);
 }
 
 static void
-modest_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class)
-{
-       ModestMailHeaderView *self = (ModestMailHeaderView *)instance;
-       ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
-       GtkWidget *fromto_hbox = NULL;
-       GtkSizeGroup *expander_group = NULL;
-
-       priv->header = NULL;
-
-       priv->expander = gtk_expander_new (NULL);
-       priv->main_vbox = gtk_vbox_new (FALSE, 1);
-       gtk_box_pack_start (GTK_BOX (instance), priv->expander, FALSE, FALSE, 0);
-       gtk_box_pack_start (GTK_BOX (instance), priv->main_vbox, TRUE, TRUE, 0);
-       g_signal_connect_after (G_OBJECT (priv->expander), "activate", G_CALLBACK (expander_activate), instance);
-
-       fromto_hbox = gtk_hbox_new (FALSE, 12);
-       priv->fromto_label = gtk_label_new (NULL);
-       gtk_misc_set_alignment (GTK_MISC (priv->fromto_label), 1.0, 0.0);
-       priv->fromto_contents = modest_recpt_view_new ();
-       g_signal_connect (G_OBJECT (priv->fromto_contents), "activate", G_CALLBACK (activate_recpt), instance);
-
-       gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_label, FALSE, FALSE, 0);
-       gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_contents, TRUE, TRUE, 0);
-       gtk_box_pack_start (GTK_BOX (priv->main_vbox), fromto_hbox, FALSE, FALSE, 0);
-
-       priv->labels_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
-       gtk_size_group_add_widget (priv->labels_size_group, priv->fromto_label);
-       
-       priv->headers_vbox = gtk_vbox_new (FALSE, 0);
-       gtk_container_set_focus_chain (GTK_CONTAINER (priv->headers_vbox), NULL);
-       g_object_ref (priv->headers_vbox);
-
-       expander_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
-       gtk_size_group_add_widget (expander_group, priv->headers_vbox);
-       gtk_size_group_add_widget (expander_group, fromto_hbox);
-       g_object_unref (expander_group);
-
-       gtk_container_set_reallocate_redraws (GTK_CONTAINER (instance), TRUE);
-
-       priv->is_outgoing = FALSE;
-       priv->is_draft = FALSE;
-
-       return;
-}
-
-static void
-modest_mail_header_view_finalize (GObject *object)
-{
-       ModestMailHeaderView *self = (ModestMailHeaderView *)object;    
-       ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
-
-       if (G_LIKELY (priv->header))
-               g_object_unref (G_OBJECT (priv->header));
-       priv->header = NULL;
-
-       if (G_LIKELY (priv->headers_vbox))
-               g_object_unref (G_OBJECT (priv->headers_vbox));
-
-       priv->headers_vbox = NULL;
-
-       g_object_unref (priv->labels_size_group);
-
-       (*parent_class->finalize) (object);
-
-       return;
-}
-
-static void
-tny_header_view_init (gpointer g, gpointer iface_data)
-{
-       TnyHeaderViewIface *klass = (TnyHeaderViewIface *)g;
-
-       klass->set_header = modest_mail_header_view_set_header;
-       klass->clear = modest_mail_header_view_clear;
-
-       return;
-}
-
-static void 
-modest_mail_header_view_class_init (ModestMailHeaderViewClass *klass)
-{
-       GObjectClass *object_class;
-
-       parent_class = g_type_class_peek_parent (klass);
-       object_class = (GObjectClass*) klass;
-
-       klass->set_header_func = modest_mail_header_view_set_header_default;
-       klass->clear_func = modest_mail_header_view_clear_default;
-
-       object_class->finalize = modest_mail_header_view_finalize;
-
-       klass->recpt_activated = NULL;
-
-       g_type_class_add_private (object_class, sizeof (ModestMailHeaderViewPriv));
-
-       signals[RECPT_ACTIVATED_SIGNAL] =
-               g_signal_new ("recpt_activated",
-                             G_TYPE_FROM_CLASS (object_class),
-                             G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
-                             G_STRUCT_OFFSET(ModestMailHeaderViewClass, recpt_activated),
-                             NULL, NULL,
-                             g_cclosure_marshal_VOID__STRING,
-                             G_TYPE_NONE, 1, 
-                             G_TYPE_STRING);
-
-
-       return;
+modest_mail_header_view_base_init (gpointer g_class)
+{
+       static gboolean initialized = FALSE;
+
+       if (!initialized) {
+               
+               signals[RECPT_ACTIVATED_SIGNAL] =
+                       g_signal_new ("recpt_activated",
+                                     MODEST_TYPE_MAIL_HEADER_VIEW,
+                                     G_SIGNAL_RUN_FIRST,
+                                     G_STRUCT_OFFSET(ModestMailHeaderViewIface, recpt_activated),
+                                     NULL, NULL,
+                                     g_cclosure_marshal_VOID__STRING,
+                                     G_TYPE_NONE, 1, G_TYPE_STRING);
+               
+               signals[SHOW_DETAILS_SIGNAL] =
+                       g_signal_new ("show_details",
+                                     MODEST_TYPE_MAIL_HEADER_VIEW,
+                                     G_SIGNAL_RUN_FIRST,
+                                     G_STRUCT_OFFSET(ModestMailHeaderViewIface, show_details),
+                                     NULL, NULL,
+                                     g_cclosure_marshal_VOID__VOID,
+                                     G_TYPE_NONE, 0);
+               
+               initialized = TRUE;
+       }
 }
 
-GType 
+GType
 modest_mail_header_view_get_type (void)
 {
-       static GType type = 0;
-
-       if (G_UNLIKELY(type == 0))
-       {
-               static const GTypeInfo info = 
-               {
-                 sizeof (ModestMailHeaderViewClass),
-                 NULL,   /* base_init */
-                 NULL,   /* base_finalize */
-                 (GClassInitFunc) modest_mail_header_view_class_init,   /* class_init */
-                 NULL,   /* class_finalize */
-                 NULL,   /* class_data */
-                 sizeof (ModestMailHeaderView),
-                 0,      /* n_preallocs */
-                 modest_mail_header_view_instance_init    /* instance_init */
+       static GType my_type = 0;
+       if (!my_type) {
+               static const GTypeInfo my_info = {
+                       sizeof(ModestMailHeaderViewIface),
+                       modest_mail_header_view_base_init,   /* base init */
+                       NULL,           /* base finalize */
+                       NULL,           /* class_init */
+                       NULL,           /* class finalize */
+                       NULL,           /* class data */
+                       0,
+                       0,              /* n_preallocs */
+                       NULL,           /* instance_init */
+                       NULL
                };
 
-               static const GInterfaceInfo tny_header_view_info = 
-               {
-                 (GInterfaceInitFunc) tny_header_view_init, /* interface_init */
-                 NULL,         /* interface_finalize */
-                 NULL          /* interface_data */
-               };
-
-               type = g_type_register_static (GTK_TYPE_HBOX,
-                       "ModestMailHeaderView",
-                       &info, 0);
-
-               g_type_add_interface_static (type, TNY_TYPE_HEADER_VIEW, 
-                       &tny_header_view_info);
-
-       }
-
-       return type;
-}
-
-TnyHeaderFlags
-modest_mail_header_view_get_priority (ModestMailHeaderView *headers_view)
-{
-       ModestMailHeaderViewPriv *priv;
-
-       g_return_val_if_fail (MODEST_IS_MAIL_HEADER_VIEW (headers_view), 0);
-       priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
-
-       return priv->priority_flags;
-}
-
-void
-modest_mail_header_view_set_priority (ModestMailHeaderView *headers_view,
-                                     TnyHeaderFlags flags)
-{
-       ModestMailHeaderViewPriv *priv;
-
-       g_return_if_fail (MODEST_IS_MAIL_HEADER_VIEW (headers_view));
-       priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
+               my_type = g_type_register_static (G_TYPE_INTERFACE,
+                                                 "ModestMailHeaderView",
+                                                 &my_info, 0);
 
-       priv->priority_flags = flags & TNY_HEADER_FLAG_PRIORITY_MASK ;
+               g_type_interface_add_prerequisite (my_type,
+                                                  TNY_TYPE_HEADER_VIEW);
 
-       if (priv->priority_flags == TNY_HEADER_FLAG_NORMAL_PRIORITY) {
-               if (priv->priority_icon != NULL) {
-                       gtk_widget_destroy (priv->priority_icon);
-                       priv->priority_icon = NULL;
-               }
-       } else if (priv->priority_flags == TNY_HEADER_FLAG_HIGH_PRIORITY) {
-               priv->priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_high", GTK_ICON_SIZE_MENU);
-               gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
-               gtk_widget_show (priv->priority_icon);
-       } else if (priv->priority_flags == TNY_HEADER_FLAG_LOW_PRIORITY) {
-               priv->priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_low", GTK_ICON_SIZE_MENU);
-               gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
-               gtk_widget_show (priv->priority_icon);
        }
+       return my_type;
 }
index b7051c3..32aa9f2 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, Nokia Corporation
+/* Copyright (c) 2008, Nokia Corporation
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef MODEST_MAIL_HEADER_VIEW_H
-#define MODEST_MAIL_HEADER_VIEW_H
-
-#include <gtk/gtk.h>
-#include <glib-object.h>
+#ifndef __MODEST_MAIL_HEADER_VIEW_H__
+#define __MODEST_MAIL_HEADER_VIEW_H__
 
 #include <tny-header-view.h>
-#include <modest-recpt-view.h>
+#include <gtk/gtkwidget.h>
 
 G_BEGIN_DECLS
 
-#define MODEST_TYPE_MAIL_HEADER_VIEW             (modest_mail_header_view_get_type ())
-#define MODEST_MAIL_HEADER_VIEW(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEST_TYPE_MAIL_HEADER_VIEW, ModestMailHeaderView))
-#define MODEST_MAIL_HEADER_VIEW_CLASS(vtable)    (G_TYPE_CHECK_CLASS_CAST ((vtable), MODEST_TYPE_MAIL_HEADER_VIEW, ModestMailHeaderViewClass))
-#define MODEST_IS_MAIL_HEADER_VIEW(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEST_TYPE_MAIL_HEADER_VIEW))
-#define MODEST_IS_MAIL_HEADER_VIEW_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MODEST_TYPE_MAIL_HEADER_VIEW))
-#define MODEST_MAIL_HEADER_VIEW_GET_CLASS(inst)  (G_TYPE_INSTANCE_GET_CLASS ((inst), MODEST_TYPE_MAIL_HEADER_VIEW, ModestMailHeaderViewClass))
-
-typedef struct _ModestMailHeaderView ModestMailHeaderView;
-typedef struct _ModestMailHeaderViewClass ModestMailHeaderViewClass;
-
-struct _ModestMailHeaderView
-{
-       GtkHBox parent;
-
-};
-
-struct _ModestMailHeaderViewClass
-{
-       GtkHBoxClass parent_class;
-
-       /* virtual methods */
-       void (*set_header_func) (TnyHeaderView *self, TnyHeader *header);
-       void (*clear_func) (TnyHeaderView *self);
-
+/* convenience macros */
+#define MODEST_TYPE_MAIL_HEADER_VIEW             (modest_mail_header_view_get_type())
+#define MODEST_MAIL_HEADER_VIEW(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_MAIL_HEADER_VIEW,ModestMailHeaderView))
+#define MODEST_IS_MAIL_HEADER_VIEW(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_MAIL_HEADER_VIEW))
+#define MODEST_MAIL_HEADER_VIEW_GET_IFACE(obj)   (G_TYPE_INSTANCE_GET_INTERFACE((obj),MODEST_TYPE_MAIL_HEADER_VIEW,ModestMailHeaderViewIface))
+
+typedef struct _ModestMailHeaderView      ModestMailHeaderView;
+typedef struct _ModestMailHeaderViewIface ModestMailHeaderViewIface;
+
+struct _ModestMailHeaderViewIface {
+       GTypeInterface parent;
+
+       TnyHeaderFlags (*get_priority) (ModestMailHeaderView *self);
+       void (*set_priority) (ModestMailHeaderView *self, TnyHeaderFlags flags);
+       const GtkWidget *(*add_custom_header) (ModestMailHeaderView *self,
+                                              const gchar *label,
+                                              GtkWidget *custom_widget,
+                                              gboolean with_expander,
+                                              gboolean start);
+       
        /* signals */
-       void (*recpt_activated) (const gchar *address);
+       void (*show_details) (ModestMailHeaderView *msgview,
+                             gpointer user_data);
+       void (*recpt_activated)    (ModestMailHeaderView *msgview, const gchar *address,
+                                   gpointer user_data);
 };
 
-GType modest_mail_header_view_get_type (void);
-TnyHeaderView* modest_mail_header_view_new (gboolean expanded);
 
+/**
+ *
+ * modest_mail_header_view_get_type
+ *
+ * get the GType for the this interface
+ *
+ * Returns: the GType for this interface
+ */
+GType        modest_mail_header_view_get_type    (void) G_GNUC_CONST;
+
+TnyHeaderFlags modest_mail_header_view_get_priority (ModestMailHeaderView *self);
+void modest_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags);
 const GtkWidget *modest_mail_header_view_add_custom_header (ModestMailHeaderView *header_view,
                                                            const gchar *label,
                                                            GtkWidget *custom_widget,
                                                            gboolean with_expander,
                                                            gboolean start);
 
-TnyHeaderFlags modest_mail_header_view_get_priority (ModestMailHeaderView *header_view);
-void modest_mail_header_view_set_priority (ModestMailHeaderView *header_view, TnyHeaderFlags flags);
-                                                    
 
 G_END_DECLS
 
-#endif
+#endif /* __MODEST_MAIL_HEADER_VIEW_H__ */
index 2288d74..33b52af 100644 (file)
@@ -332,7 +332,7 @@ modest_mozembed_msg_view_init (ModestMozembedMsgView *obj)
        priv->current_zoom = 1.0;
 
        priv->body_view                 = GTK_WIDGET (g_object_new (MODEST_TYPE_MOZEMBED_MIME_PART_VIEW, NULL));
-       priv->mail_header_view        = GTK_WIDGET(modest_mail_header_view_new (TRUE));
+       priv->mail_header_view        = GTK_WIDGET(modest_compact_mail_header_view_new (TRUE));
        gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
        priv->attachments_view        = GTK_WIDGET(modest_attachments_view_new (NULL));
 
index 46d1678..b86e163 100644 (file)
@@ -33,6 +33,7 @@
 #include <tny-msg.h>
 #include <tny-folder.h>
 #include <widgets/modest-window.h>
+#include <widgets/modest-header-view.h>
 #include <gtk/gtktreemodel.h>
 #include <gtk/gtkenums.h>
 
@@ -111,6 +112,25 @@ ModestWindow*   modest_msg_view_window_new_with_header_model (TnyMsg *msg,
                                                              GtkTreeModel *model, 
                                                              GtkTreeRowReference *row_reference);
 
+/**
+ * modest_msg_view_window_new_from_header_view:
+ * @header_view: an #ModestHeaderView instance
+ * @modest_account_name: the account name 
+ * @msg_uid: the initial uid reserved by this window
+ * @row_reference: a #GtkTreeRowReference, pointing to the selected position @model.
+ * 
+ * instantiates a new #ModestMsgViewWindow widget. The account name is used to
+ * set the proper account when choosing reply/forward from the msg view window.
+ * It's different from new_with_header_model, as it creates the window and then
+ * loads the message in that window.
+ *
+ * Returns: a new #ModestMsgViewWindow, or NULL in case of error
+ */
+ModestWindow*   modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view, 
+                                                            const gchar *modest_account_name, 
+                                                            const gchar *msg_uid,
+                                                            GtkTreeRowReference *row_reference);
+
 
 /**
  * modest_msg_view_window_new_for_search_result:
index d79ad62..f8c4bb8 100644 (file)
@@ -38,6 +38,7 @@ enum {
        RECPT_ACTIVATED_SIGNAL,
        LINK_CONTEXTUAL_SIGNAL,
        FETCH_IMAGE_SIGNAL,
+       SHOW_DETAILS_SIGNAL,
        LAST_SIGNAL
 };
 static guint signals[LAST_SIGNAL] = {0};
@@ -163,6 +164,15 @@ modest_msg_view_base_init (gpointer g_class)
                                      modest_marshal_BOOLEAN__STRING_OBJECT,
                                      G_TYPE_BOOLEAN, 2, G_TYPE_STRING, G_TYPE_OBJECT);
                
+               signals[SHOW_DETAILS_SIGNAL] =
+                       g_signal_new ("show_details",
+                                     MODEST_TYPE_MSG_VIEW,
+                                     G_SIGNAL_RUN_FIRST,
+                                     G_STRUCT_OFFSET(ModestMsgViewIface, show_details),
+                                     NULL, NULL,
+                                     g_cclosure_marshal_VOID__VOID,
+                                     G_TYPE_NONE, 0);
+               
                initialized = TRUE;
        }
 }
index 02d819a..3a7930d 100644 (file)
@@ -80,6 +80,7 @@ struct _ModestMsgViewIface {
                                    gpointer user_data);
        gboolean (*fetch_image)    (ModestMsgView *msgview, const gchar *uri,
                                    TnyStream *stream);
+       void (*show_details)       (ModestMsgView *msgview, gpointer userdata);
 };