* src/widgets/modest-header-view.c:
[modest] / src / maemo / modest-msg-edit-window.c
index 3fd0e73..309390e 100644 (file)
@@ -169,7 +169,7 @@ static void init_window (ModestMsgEditWindow *obj);
 
 gboolean scroll_drag_timeout (gpointer userdata);
 static void correct_scroll (ModestMsgEditWindow *w);
-static void correct_scroll_without_drag_check (ModestMsgEditWindow *w);
+static void correct_scroll_without_drag_check (ModestMsgEditWindow *w, gboolean only_if_focused);
 static void text_buffer_end_user_action (GtkTextBuffer *buffer,
                                         ModestMsgEditWindow *userdata);
 static void text_buffer_mark_set (GtkTextBuffer *buffer,
@@ -545,7 +545,7 @@ scroll_drag_timeout (gpointer userdata)
 
        priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(win);
 
-       correct_scroll_without_drag_check (win);
+       correct_scroll_without_drag_check (win, TRUE);
 
        priv->scroll_drag_timeout_id = 0;
 
@@ -553,7 +553,7 @@ scroll_drag_timeout (gpointer userdata)
 }
 
 static void
-correct_scroll_without_drag_check (ModestMsgEditWindow *w)
+correct_scroll_without_drag_check (ModestMsgEditWindow *w, gboolean only_if_focused)
 {
        ModestMsgEditWindowPrivate *priv;
        GtkTextMark *insert;
@@ -566,7 +566,7 @@ correct_scroll_without_drag_check (ModestMsgEditWindow *w)
 
        priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(w);
 
-       if (!gtk_widget_is_focus (priv->msg_body))
+       if (only_if_focused && !gtk_widget_is_focus (priv->msg_body))
                return;
 
        insert = gtk_text_buffer_get_insert (priv->text_buffer);
@@ -580,7 +580,7 @@ correct_scroll_without_drag_check (ModestMsgEditWindow *w)
        
        if ((offset + rectangle.y + rectangle.height) > 
            ((gint) (vadj->value +vadj->page_size))) {
-               new_value = (offset + rectangle.y) + vadj->page_size * 0.75;
+               new_value = (offset + rectangle.y) - vadj->page_size * 0.25;
                if (new_value > vadj->upper - vadj->page_size)
                        new_value = vadj->upper - vadj->page_size;
        } else if ((offset + rectangle.y) < ((gint) vadj->value)) {
@@ -620,7 +620,7 @@ correct_scroll (ModestMsgEditWindow *w)
                return;
        }
 
-       correct_scroll_without_drag_check (w);
+       correct_scroll_without_drag_check (w, TRUE);
 }
 
 static void
@@ -641,6 +641,30 @@ text_buffer_mark_set (GtkTextBuffer *buffer,
        gtk_text_buffer_end_user_action (buffer);
 }
 
+static void
+cut_clipboard_check (GtkTextView *text_view,
+                    gpointer userdata)
+{
+       GtkTextBuffer *buffer;
+       
+       buffer = gtk_text_view_get_buffer (text_view);
+       if (!modest_text_utils_buffer_selection_is_valid (buffer)) {
+               g_signal_stop_emission_by_name ((gpointer )text_view, "cut-clipboard");
+       }
+}
+
+static void
+copy_clipboard_check (GtkTextView *text_view,
+                    gpointer userdata)
+{
+       GtkTextBuffer *buffer;
+       
+       buffer = gtk_text_view_get_buffer (text_view);
+       if (!modest_text_utils_buffer_selection_is_valid (buffer)) {
+               g_signal_stop_emission_by_name ((gpointer )text_view, "copy-clipboard");
+       }
+}
+
 void vadj_changed (GtkAdjustment *adj,
                   ModestMsgEditWindow *window)
 {
@@ -720,6 +744,9 @@ connect_signals (ModestMsgEditWindow *obj)
                g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD)), "owner-change",
                                  G_CALLBACK (modest_msg_edit_window_clipboard_owner_change), obj);
 
+       g_signal_connect (G_OBJECT (priv->msg_body), "cut-clipboard", G_CALLBACK (cut_clipboard_check), NULL);
+       g_signal_connect (G_OBJECT (priv->msg_body), "copy-clipboard", G_CALLBACK (copy_clipboard_check), NULL);
+
 }
 
 static void
@@ -1228,7 +1255,7 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg, gboolean preserve_is_rich)
        gtk_text_buffer_get_start_iter (priv->text_buffer, &iter);
        gtk_text_buffer_place_cursor (priv->text_buffer, &iter);
 
-       modest_msg_edit_window_reset_modified (self);
+       modest_msg_edit_window_set_modified (self, FALSE);
 
        modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
        modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (self));
@@ -1528,7 +1555,6 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre
        g_object_unref (menu_rules_group);
        g_object_unref (toolbar_rules_group);
        g_object_unref (clipboard_rules_group);
-       gtk_widget_show_all (GTK_WIDGET (obj));
        modest_msg_edit_window_clipboard_owner_change (NULL, NULL, MODEST_MSG_EDIT_WINDOW (obj));
 
        set_msg (MODEST_MSG_EDIT_WINDOW (obj), msg, preserve_is_rich);
@@ -1540,7 +1566,7 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre
        modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), MODEST_DIMMING_RULES_CLIPBOARD);
        priv->update_caption_visibility = TRUE;
 
-       modest_msg_edit_window_reset_modified (MODEST_MSG_EDIT_WINDOW (obj));
+       modest_msg_edit_window_set_modified (MODEST_MSG_EDIT_WINDOW (obj), FALSE);
 
        /* Track account-removed signal, this window should be closed
           in the case we're creating a mail associated to the account
@@ -2995,18 +3021,19 @@ body_changed (GtkTextBuffer *buffer, ModestMsgEditWindow *editor)
 }
 
 void
-modest_msg_edit_window_reset_modified (ModestMsgEditWindow *editor)
+modest_msg_edit_window_set_modified (ModestMsgEditWindow *editor,
+                                    gboolean modified)
 {
        ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor);
        GtkTextBuffer *buffer;
 
        buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->to_field));
-       gtk_text_buffer_set_modified (buffer, FALSE);
+       gtk_text_buffer_set_modified (buffer, modified);
        buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->cc_field));
-       gtk_text_buffer_set_modified (buffer, FALSE);
+       gtk_text_buffer_set_modified (buffer, modified);
        buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->bcc_field));
-       gtk_text_buffer_set_modified (buffer, FALSE);
-       gtk_text_buffer_set_modified (priv->text_buffer, FALSE);
+       gtk_text_buffer_set_modified (buffer, modified);
+       gtk_text_buffer_set_modified (priv->text_buffer, modified);
 }
 
 gboolean
@@ -3374,6 +3401,7 @@ modest_msg_edit_window_find_toolbar_search (GtkWidget *widget,
        if (result) {
                gtk_text_buffer_select_range (priv->text_buffer, &match_start, &match_end);
                gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (priv->msg_body), &match_start, 0.0, TRUE, 0.0, 0.0);
+               correct_scroll_without_drag_check (MODEST_MSG_EDIT_WINDOW (window), FALSE);
        } else {
                g_free (priv->last_search);
                priv->last_search = NULL;