Remove additional separation among headers and body in editor
[modest] / src / hildon2 / modest-msg-view-window.c
index 912cdcf..8f481f0 100644 (file)
@@ -230,7 +230,6 @@ static gboolean _modest_msg_view_window_map_event (GtkWidget *widget,
                                                   gpointer userdata);
 static void update_branding (ModestMsgViewWindow *self);
 
-
 /* list my signals */
 enum {
        MSG_CHANGED_SIGNAL,
@@ -290,22 +289,48 @@ static void
 save_state (ModestWindow *self)
 {
        modest_widget_memory_save (modest_runtime_get_conf (),
-                                  G_OBJECT(self), 
+                                  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)
+static gboolean
+modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
+                                    GtkScrollType scroll_type,
+                                    gboolean horizontal,
+                                    gpointer userdata)
 {
        ModestMsgViewWindowPrivate *priv;
-       gboolean return_value;
+       gint step = 0;
 
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
-       g_signal_emit_by_name (priv->main_scroll, "scroll-child", scroll_type, horizontal, &return_value);
-       return return_value;
+
+       switch (scroll_type) {
+       case GTK_SCROLL_STEP_UP:
+               step = -1;
+               break;
+       case GTK_SCROLL_STEP_DOWN:
+               step = +1;
+               break;
+       case GTK_SCROLL_PAGE_UP:
+               step = -6;
+               break;
+       case GTK_SCROLL_PAGE_DOWN:
+               step = +6;
+               break;
+       case GTK_SCROLL_START:
+               step = -100;
+               break;
+       case GTK_SCROLL_END:
+               step = +100;
+               break;
+       default:
+               step = 0;
+       }
+
+       if (step)
+               modest_maemo_utils_scroll_pannable((HildonPannableArea *) priv->main_scroll, 0, step);
+
+       return (gboolean) step;
 }
 
 static void
@@ -314,7 +339,7 @@ add_scroll_binding (GtkBindingSet *binding_set,
                    GtkScrollType scroll)
 {
        guint keypad_keyval = keyval - GDK_Left + GDK_KP_Left;
-       
+
        gtk_binding_entry_add_signal (binding_set, keyval, 0,
                                      "scroll_child", 2,
                                      GTK_TYPE_SCROLL_TYPE, scroll,
@@ -859,7 +884,7 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg,
        /* Setup row references and connect signals */
        priv->header_model = g_object_ref (model);
 
-       if (row_reference) {
+       if (row_reference && gtk_tree_row_reference_valid (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 (model, &(priv->next_row_reference), TRUE, priv->is_outbox);
@@ -1026,7 +1051,7 @@ modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view,
        priv->header_model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
        g_object_ref (priv->header_model);
 
-       if (row_reference) {
+       if (row_reference && gtk_tree_row_reference_valid (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);
@@ -1061,17 +1086,18 @@ modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view,
        tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), NULL);
        update_branding (MODEST_MSG_VIEW_WINDOW (window));
 
-       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, NULL, NULL, row_reference);
-               g_object_unref (header);
+       if (priv->row_reference) {
+               path = gtk_tree_row_reference_get_path (priv->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, NULL, NULL, priv->row_reference);
+                       g_object_unref (header);
+               }
+               gtk_tree_path_free (path);
        }
-       gtk_tree_path_free (path);
-
        /* Check dimming rules */
        modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
        modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
@@ -1685,7 +1711,6 @@ modest_msg_view_window_zoom_minus (ModestWindow *window)
        modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom_level);
 
        return TRUE;
-       
 }
 
 static gboolean
@@ -1705,52 +1730,11 @@ modest_msg_view_window_key_event (GtkWidget *window,
                        gtk_widget_event (focus, copy);
                        gdk_event_free (copy);
                        return TRUE;
-               } else 
-                       return FALSE;
-       }
-       if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up ||
-           event->keyval == GDK_Down || event->keyval == GDK_KP_Down ||
-           event->keyval == GDK_Page_Up || event->keyval == GDK_KP_Page_Up ||
-           event->keyval == GDK_Page_Down || event->keyval == GDK_KP_Page_Down ||
-           event->keyval == GDK_Home || event->keyval == GDK_KP_Home ||
-           event->keyval == GDK_End || event->keyval == GDK_KP_End) {
-               /* ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); */
-               /* gboolean return_value; */
-
-               if (event->type == GDK_KEY_PRESS) {
-                       GtkScrollType scroll_type;
-
-                       switch (event->keyval) {
-                       case GDK_Up: 
-                       case GDK_KP_Up:
-                               scroll_type = GTK_SCROLL_STEP_UP; break;
-                       case GDK_Down: 
-                       case GDK_KP_Down:
-                               scroll_type = GTK_SCROLL_STEP_DOWN; break;
-                       case GDK_Page_Up:
-                       case GDK_KP_Page_Up:
-                               scroll_type = GTK_SCROLL_PAGE_UP; break;
-                       case GDK_Page_Down:
-                       case GDK_KP_Page_Down:
-                               scroll_type = GTK_SCROLL_PAGE_DOWN; break;
-                       case GDK_Home:
-                       case GDK_KP_Home:
-                               scroll_type = GTK_SCROLL_START; break;
-                       case GDK_End:
-                       case GDK_KP_End:
-                               scroll_type = GTK_SCROLL_END; break;
-                       default: scroll_type = GTK_SCROLL_NONE;
-                       }
-
-                       /* g_signal_emit_by_name (G_OBJECT (priv->main_scroll), "scroll-child",  */
-                       /*                     scroll_type, FALSE, &return_value); */
-                       return FALSE;
                } else {
                        return FALSE;
                }
-       } else {
-               return FALSE;
        }
+       return FALSE;
 }
 
 gboolean
@@ -2063,9 +2047,14 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
           tree models and reports the deletion when the row is still
           there */
        if (!gtk_tree_row_reference_valid (priv->next_row_reference)) {
+               if (priv->next_row_reference) {
+                       gtk_tree_row_reference_free (priv->next_row_reference);
+               }
                if (gtk_tree_row_reference_valid (priv->row_reference)) {
                        priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
                        select_next_valid_row (priv->header_model, &(priv->next_row_reference), FALSE, priv->is_outbox);
+               } else {
+                       priv->next_row_reference = NULL;
                }
        }
        if (priv->next_row_reference)
@@ -2107,6 +2096,11 @@ modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window)
        g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), FALSE);
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
 
+       if (priv->row_reference && !gtk_tree_row_reference_valid (priv->row_reference)) {
+               gtk_tree_row_reference_free (priv->row_reference);
+               priv->row_reference = NULL;
+       }
+
        /* Return inmediatly if there is no header model */
        if (!priv->header_model || !priv->row_reference)
                return FALSE;
@@ -2188,11 +2182,11 @@ view_msg_cb (ModestMailOperation *mail_op,
        /* Update the row reference */
        if (priv->row_reference != NULL) {
                gtk_tree_row_reference_free (priv->row_reference);
-               priv->row_reference = row_reference?gtk_tree_row_reference_copy (row_reference):NULL;
+               priv->row_reference = (row_reference && gtk_tree_row_reference_valid (row_reference))?gtk_tree_row_reference_copy (row_reference):NULL;
                if (priv->next_row_reference != NULL) {
                        gtk_tree_row_reference_free (priv->next_row_reference);
                }
-               if (row_reference) {
+               if (priv->row_reference) {
                        priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
                        select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE, priv->is_outbox);
                } else {
@@ -2265,7 +2259,7 @@ modest_msg_view_window_update_priority (ModestMsgViewWindow *window)
 
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
 
-       if (priv->header_model && priv->row_reference) {
+       if (priv->header_model && priv->row_reference && gtk_tree_row_reference_valid (priv->row_reference)) {
                GtkTreeIter iter;
                GtkTreePath *path = NULL;
 
@@ -2688,7 +2682,8 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window,
                                        decode_in_provider = 
                                                modest_account_protocol_decode_part_to_stream_async (
                                                        MODEST_ACCOUNT_PROTOCOL (protocol),
-                                                       mime_part, 
+                                                       mime_part,
+                                                       NULL,
                                                        TNY_STREAM (temp_stream),
                                                        on_decode_to_stream_async_handler,
                                                        NULL,
@@ -2891,6 +2886,7 @@ save_mime_part_to_file (SaveMimePartInfo *info)
                                        modest_account_protocol_decode_part_to_stream (
                                                MODEST_ACCOUNT_PROTOCOL (protocol),
                                                pair->part,
+                                               pair->filename,
                                                stream,
                                                &written,
                                                &error);
@@ -3693,9 +3689,17 @@ modest_msg_view_window_reload (ModestMsgViewWindow *self)
                return;
 
        msg_uid = modest_msg_view_window_get_message_uid (self);
-        if (msg_uid)
-               if (!message_reader (self, priv, NULL, msg_uid, folder, priv->row_reference))
+        if (msg_uid) {
+               GtkTreeRowReference *row_reference;
+
+               if (priv->row_reference && gtk_tree_row_reference_valid (priv->row_reference)) {
+                       row_reference = priv->row_reference;
+               } else {
+                       row_reference = NULL;
+               }
+               if (!message_reader (self, priv, NULL, msg_uid, folder, row_reference))
                        g_warning ("Shouldn't happen, trying to reload a message failed");
+       }
 
        g_object_unref (folder);
 }