static void text_buffer_apply_tag (GtkTextBuffer *buffer, GtkTextTag *tag,
GtkTextIter *start, GtkTextIter *end,
gpointer userdata);
+static void text_buffer_insert_text (GtkTextBuffer *buffer,
+ GtkTextIter *location,
+ gchar *text,
+ gint len,
+ ModestMsgEditWindow *window);
static void text_buffer_delete_images_by_id (GtkTextBuffer *buffer, const gchar * image_id);
static void subject_field_changed (GtkEditable *editable, ModestMsgEditWindow *window);
static void subject_field_insert_text (GtkEditable *editable,
gpointer user_data);
static gboolean on_zoom_minus_plus_not_implemented (ModestWindow *window);
-
static void set_zoom_do_nothing (ModestWindow *window, gdouble zoom);
-
static gdouble get_zoom_do_nothing (ModestWindow *window);
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, gboolean only_if_focused);
+static void text_buffer_end_user_action (GtkTextBuffer *buffer,
+ ModestMsgEditWindow *userdata);
+static void text_buffer_mark_set (GtkTextBuffer *buffer,
+ GtkTextIter *iter,
+ GtkTextMark *mark,
+ ModestMsgEditWindow *userdata);
+void vadj_changed (GtkAdjustment *adj,
+ ModestMsgEditWindow *window);
+
+static ModestPair *find_transport_from_message_sender (ModestPairList *transports,
+ TnyMsg *msg);
+
+
+
+
static void DEBUG_BUFFER (WPTextBuffer *buffer)
{
#ifdef DEBUG
typedef struct _ModestMsgEditWindowPrivate ModestMsgEditWindowPrivate;
struct _ModestMsgEditWindowPrivate {
GtkWidget *msg_body;
+ GtkWidget *frame;
GtkWidget *header_box;
ModestPairList *from_field_protos;
GtkWidget *from_field;
+ const gchar *original_account_name;
GtkWidget *to_field;
GtkWidget *cc_field;
gchar *last_search;
GtkWidget *scroll;
- GtkWidget *scroll_area;
- gint last_vadj_upper;
+ guint scroll_drag_timeout_id;
+ gdouble last_upper;
gint last_cid;
TnyList *attachments;
TnyList *images;
+ guint64 images_size;
+ gint images_count;
TnyHeaderFlags priority_flags;
priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(obj);
priv->msg_body = NULL;
+ priv->frame = NULL;
priv->from_field = NULL;
priv->to_field = NULL;
priv->cc_field = NULL;
priv->subject_field = NULL;
priv->attachments = TNY_LIST (tny_simple_list_new ());
priv->images = TNY_LIST (tny_simple_list_new ());
+ priv->images_size = 0;
+ priv->images_count = 0;
priv->last_cid = 0;
priv->cc_caption = NULL;
priv->clipboard_text = NULL;
priv->sent = FALSE;
- priv->last_vadj_upper = 0;
+ priv->scroll_drag_timeout_id = 0;
+ priv->last_upper = 0.0;
modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(),
GTK_WINDOW(obj),"applications_email_editor");
return transports;
}
-void vadj_changed (GtkAdjustment *adj,
- ModestMsgEditWindow *window)
+/**
+ * Search an (account, address) ModestPairList for a pair whose
+ * address matches the one in the From: header of a TnyMsg
+ *
+ * @result: A ModestPair * with a matching address, or NULL if none found
+ */
+static ModestPair *
+find_transport_from_message_sender (ModestPairList *transports, TnyMsg *msg)
{
- ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
+ g_return_val_if_fail (transports, NULL);
+ g_return_val_if_fail (msg, NULL);
- GdkRectangle rectangle, cursor_rectangle;
- GtkTextIter position;
- gboolean visible;
- gint cursor_bottom;
-
- /* We detect if cursor is visible using the full height, not only the center. This
- seems to work */
- gtk_text_view_get_visible_rect (GTK_TEXT_VIEW (priv->msg_body), &rectangle);
- gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (priv->text_buffer),
- &position,
- gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (priv->text_buffer)));
- gtk_text_view_get_iter_location (GTK_TEXT_VIEW (priv->msg_body), &position, &cursor_rectangle);
-
- cursor_bottom = (cursor_rectangle.y + cursor_rectangle.height);
- visible = (cursor_rectangle.y >= rectangle.y) && (cursor_bottom < (rectangle.y + rectangle.height));
-
- if (gtk_widget_is_focus (priv->msg_body) &&
- !visible) {
- if (priv->last_vadj_upper != adj->upper) {
- GtkTextMark *insert;
-
- insert = gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (priv->text_buffer));
- gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (priv->msg_body),
- insert, 0.1, FALSE, 0.0, 0.0);
+ ModestPair *account_pair = NULL;
+ TnyHeader *header = tny_msg_get_header (msg);
+
+ if (header != NULL && tny_header_get_from (header)) {
+ char *from_addr = modest_text_utils_get_email_address (tny_header_get_from (header));
+ GSList *iter;
+ for (iter = transports; iter && !account_pair; iter = iter->next) {
+ ModestPair *pair = (ModestPair *) iter->data;
+ char *account_addr = modest_text_utils_get_email_address ((char *) pair->second);
+ if (account_addr && !strcasecmp(from_addr, account_addr)) {
+ account_pair = pair;
+ }
+ g_free (account_addr);
}
+ g_free (from_addr);
}
- priv->last_vadj_upper = adj->upper;
+
+ if (header)
+ g_object_unref (header);
+
+ return account_pair;
}
static void window_focus (GtkWindow *window,
modest_window_check_dimming_rules_group (MODEST_WINDOW (userdata), MODEST_DIMMING_RULES_CLIPBOARD);
}
+gboolean
+scroll_drag_timeout (gpointer userdata)
+{
+ ModestMsgEditWindow *win = (ModestMsgEditWindow *) userdata;
+ ModestMsgEditWindowPrivate *priv;
+
+ priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(win);
+
+ correct_scroll_without_drag_check (win, TRUE);
+
+ priv->scroll_drag_timeout_id = 0;
+
+ return FALSE;
+}
+
+static void
+correct_scroll_without_drag_check (ModestMsgEditWindow *w, gboolean only_if_focused)
+{
+ ModestMsgEditWindowPrivate *priv;
+ GtkTextMark *insert;
+ GtkTextIter iter;
+ GdkRectangle rectangle;
+ GtkAdjustment *vadj;
+ gdouble new_value;
+ gint offset;
+ GdkWindow *window;
+
+ priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(w);
+
+ if (only_if_focused && !gtk_widget_is_focus (priv->msg_body))
+ return;
+
+ insert = gtk_text_buffer_get_insert (priv->text_buffer);
+ gtk_text_buffer_get_iter_at_mark (priv->text_buffer, &iter, insert);
+
+ gtk_text_view_get_iter_location (GTK_TEXT_VIEW (priv->msg_body), &iter, &rectangle);
+ vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll));
+ offset = priv->msg_body->allocation.y;
+
+ new_value = vadj->value;
+
+ if ((offset + rectangle.y + rectangle.height) >
+ ((gint) (vadj->value +vadj->page_size))) {
+ 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)) {
+ new_value = (offset + rectangle.y - vadj->page_size * 0.75);
+ if (((gint) (new_value + vadj->page_size)) < (offset + rectangle.y + rectangle.height))
+ new_value = offset + rectangle.y + rectangle.height - (gint) vadj->page_size;
+ if (new_value < 0.0)
+ new_value = 0.0;
+ if (new_value > vadj->value)
+ new_value = vadj->value;
+ }
+
+ if (vadj->value != new_value) {
+ g_signal_emit_by_name (GTK_TEXT_VIEW(priv->msg_body)->layout,
+ "invalidated");
+ vadj->value = new_value;
+ gtk_adjustment_value_changed (vadj);
+ /* invalidate body */
+ window = gtk_widget_get_parent_window (priv->msg_body);
+ if (window)
+ gdk_window_invalidate_rect (window, NULL, TRUE);
+ }
+
+}
+
+static void
+correct_scroll (ModestMsgEditWindow *w)
+{
+ ModestMsgEditWindowPrivate *priv;
+
+ priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(w);
+ if (gtk_grab_get_current () == priv->msg_body) {
+ if (priv->scroll_drag_timeout_id == 0) {
+ priv->scroll_drag_timeout_id = g_timeout_add (500, (GSourceFunc) scroll_drag_timeout,
+ (gpointer) w);
+ }
+ return;
+ }
+
+ correct_scroll_without_drag_check (w, TRUE);
+}
+
+static void
+text_buffer_end_user_action (GtkTextBuffer *buffer,
+ ModestMsgEditWindow *userdata)
+{
+
+ correct_scroll (userdata);
+}
+
+static void
+text_buffer_mark_set (GtkTextBuffer *buffer,
+ GtkTextIter *iter,
+ GtkTextMark *mark,
+ ModestMsgEditWindow *userdata)
+{
+ gtk_text_buffer_begin_user_action (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)
+{
+ ModestMsgEditWindowPrivate *priv;
+
+ priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
+
+ if (priv->last_upper != adj->upper) {
+ priv->last_upper = adj->upper;
+ correct_scroll (window);
+ }
+}
static void
connect_signals (ModestMsgEditWindow *obj)
G_CALLBACK (text_buffer_can_redo), obj);
g_signal_connect (G_OBJECT (priv->text_buffer), "changed",
G_CALLBACK (body_changed), obj);
+ g_signal_connect (G_OBJECT (priv->text_buffer), "insert-text",
+ G_CALLBACK (text_buffer_insert_text), obj);
g_signal_connect (G_OBJECT (obj), "window-state-event",
G_CALLBACK (modest_msg_edit_window_window_state_event),
NULL);
+ g_signal_connect (G_OBJECT (priv->text_buffer), "end-user-action",
+ G_CALLBACK (text_buffer_end_user_action), obj);
+ g_signal_connect (G_OBJECT (priv->text_buffer), "mark-set",
+ G_CALLBACK (text_buffer_mark_set), obj);
g_signal_connect_after (G_OBJECT (priv->text_buffer), "apply-tag",
G_CALLBACK (text_buffer_apply_tag), obj);
g_signal_connect_swapped (G_OBJECT (priv->to_field), "open-addressbook",
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
GError *error = NULL;
GtkSizeGroup *size_group;
- GtkWidget *frame;
GtkWidget *subject_box;
GtkWidget *attachment_icon;
GtkWidget *window_box;
main_vbox = gtk_vbox_new (FALSE, DEFAULT_MAIN_VBOX_SPACING);
gtk_box_pack_start (GTK_BOX(main_vbox), priv->header_box, FALSE, FALSE, 0);
- frame = gtk_frame_new (NULL);
- gtk_box_pack_start (GTK_BOX(main_vbox), frame, TRUE, TRUE, 0);
+ priv->frame = gtk_frame_new (NULL);
+ gtk_box_pack_start (GTK_BOX(main_vbox), priv->frame, TRUE, TRUE, 0);
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (priv->scroll), main_vbox);
gtk_container_set_focus_vadjustment (GTK_CONTAINER (main_vbox), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll)));
- g_signal_connect (G_OBJECT (gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll))),
- "changed",
- G_CALLBACK (vadj_changed),
- obj);
gtk_widget_show_all (GTK_WIDGET(priv->scroll));
window_box = gtk_vbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (window_box), priv->scroll, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER(obj), window_box);
- priv->scroll_area = modest_scroll_area_new (priv->scroll, priv->msg_body);
- gtk_container_add (GTK_CONTAINER (frame), priv->scroll_area);
+
+ gtk_box_pack_start (GTK_BOX (window_box), priv->scroll, TRUE, TRUE, 0);
+
+ gtk_container_add (GTK_CONTAINER (priv->frame), priv->msg_body);
/* Set window icon */
window_icon = modest_platform_get_icon (MODEST_APP_MSG_EDIT_ICON, MODEST_ICON_SIZE_BIG);
g_object_unref (priv->outbox_msg);
priv->outbox_msg = NULL;
}
+ if (priv->scroll_drag_timeout_id > 0) {
+ g_source_remove (priv->scroll_drag_timeout_id);
+ priv->scroll_drag_timeout_id = 0;
+ }
g_free (priv->msg_uid);
g_free (priv->last_search);
g_slist_free (priv->font_items_group);
}
static GdkPixbuf *
-pixbuf_from_stream (TnyStream *stream, const gchar *mime_type)
+pixbuf_from_stream (TnyStream *stream, const gchar *mime_type, guint64 *stream_size)
{
GdkPixbufLoader *loader;
GdkPixbuf *pixbuf;
+ guint64 size;
+
+ size = 0;
loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, NULL);
- if (loader == NULL)
+ if (loader == NULL) {
+ if (stream_size)
+ *stream_size = 0;
return NULL;
+ }
tny_stream_reset (TNY_STREAM (stream));
while (!tny_stream_is_eos (TNY_STREAM (stream))) {
unsigned char read_buffer[128];
gint readed;
readed = tny_stream_read (TNY_STREAM (stream), (char *) read_buffer, 128);
+ size += readed;
if (!gdk_pixbuf_loader_write (loader, read_buffer, readed, NULL))
break;
}
pixbuf = new_pixbuf;
}
+ if (stream_size)
+ *stream_size = size;
+
return pixbuf;
}
const gchar *cid = tny_mime_part_get_content_id (part);
const gchar *mime_type = tny_mime_part_get_content_type (part);
if ((cid != NULL)&&(mime_type != NULL)) {
+ guint64 stream_size;
TnyStream *stream = tny_mime_part_get_stream (part);
- GdkPixbuf *pixbuf = pixbuf_from_stream (stream, mime_type);
+ GdkPixbuf *pixbuf = pixbuf_from_stream (stream, mime_type, &stream_size);
+
+
g_object_unref (stream);
if (pixbuf != NULL) {
+ priv->images_count ++;
+ priv->images_size += stream_size;
wp_text_buffer_replace_image (WP_TEXT_BUFFER (priv->text_buffer), cid, pixbuf);
g_object_unref (pixbuf);
}
}
g_object_unref (part);
}
+ g_object_unref (iter);
}
static void
}
g_object_unref (part);
}
+ g_object_unref (iter);
}
static void
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));
text_buffer_can_undo (priv->text_buffer, FALSE, self);
text_buffer_can_redo (priv->text_buffer, FALSE, self);
modest_window_set_active_account (MODEST_WINDOW(obj), account_name);
- account_pair = modest_pair_list_find_by_first_as_string (priv->from_field_protos, account_name);
+ account_pair = find_transport_from_message_sender (priv->from_field_protos, msg);
+ if (account_pair == NULL) {
+ account_pair = modest_pair_list_find_by_first_as_string (priv->from_field_protos, account_name);
+ }
if (account_pair != NULL)
modest_combo_box_set_active_id (MODEST_COMBO_BOX (priv->from_field), account_pair->first);
+ priv->original_account_name = account_pair ? (const gchar *) account_pair->first : NULL;
+
parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new ();
menu_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_MENU, FALSE);
toolbar_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_TOOLBAR, TRUE);
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);
text_buffer_refresh_attributes (WP_TEXT_BUFFER (priv->text_buffer), MODEST_MSG_EDIT_WINDOW (obj));
- modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj));
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (obj));
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
wp_text_buffer_save_document (WP_TEXT_BUFFER(priv->text_buffer), get_formatted_data_cb, &string_buffer);
+ gtk_text_buffer_set_modified (priv->text_buffer, TRUE);
+
return g_string_free (string_buffer, FALSE);
}
g_object_unref (part);
tny_iterator_next (att_iter);
}
+ g_object_unref (att_iter);
data->priority_flags = priv->priority_flags;
g_slice_free (MsgData, data);
}
+void
+modest_msg_edit_window_get_parts_size (ModestMsgEditWindow *window,
+ gint *parts_count,
+ guint64 *parts_size)
+{
+ ModestMsgEditWindowPrivate *priv;
+
+ priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
+
+ modest_attachments_view_get_sizes (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), parts_count, parts_size);
+
+ /* TODO: add images */
+ *parts_size += priv->images_size;
+ *parts_count += priv->images_count;
+
+}
+
ModestMsgEditFormat
modest_msg_edit_window_get_format (ModestMsgEditWindow *self)
{
result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ);
if (result == GNOME_VFS_OK) {
GdkPixbuf *pixbuf;
- GnomeVFSFileInfo info;
+ GnomeVFSFileInfo *info;
gchar *filename, *basename, *escaped_filename;
TnyMimePart *mime_part;
gchar *content_id;
const gchar *mime_type = NULL;
GnomeVFSURI *vfs_uri;
+ guint64 stream_size;
vfs_uri = gnome_vfs_uri_new (uri);
filename = gnome_vfs_unescape_string_for_display (escaped_filename);
g_free (escaped_filename);
gnome_vfs_uri_unref (vfs_uri);
+ info = gnome_vfs_file_info_new ();
- if (gnome_vfs_get_file_info (uri, &info, GNOME_VFS_FILE_INFO_GET_MIME_TYPE
+ if (gnome_vfs_get_file_info (uri, info, GNOME_VFS_FILE_INFO_GET_MIME_TYPE
| GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE)
== GNOME_VFS_OK)
- mime_type = gnome_vfs_file_info_get_mime_type (&info);
+ mime_type = gnome_vfs_file_info_get_mime_type (info);
mime_part = tny_platform_factory_new_mime_part
(modest_runtime_get_platform_factory ());
tny_mime_part_set_filename (mime_part, basename);
g_free (basename);
- pixbuf = pixbuf_from_stream (stream, mime_type);
+ pixbuf = pixbuf_from_stream (stream, mime_type, &stream_size);
if (pixbuf != NULL) {
+ priv->images_size += stream_size;
+ priv->images_count ++;
insert_mark = gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (priv->text_buffer));
gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (priv->text_buffer), &position, insert_mark);
wp_text_buffer_insert_image (WP_TEXT_BUFFER (priv->text_buffer), &position, g_strdup (tny_mime_part_get_content_id (mime_part)), pixbuf);
gtk_text_buffer_set_modified (priv->text_buffer, TRUE);
g_free (filename);
g_object_unref (mime_part);
+ gnome_vfs_file_info_unref (info);
}
}
ModestMsgEditWindow *window,
const gchar *uri)
{
+ GnomeVFSHandle *handle = NULL;
+ ModestMsgEditWindowPrivate *priv;
+ GnomeVFSResult result;
+
g_return_if_fail (window);
g_return_if_fail (uri);
- ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
-
+ priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
- GnomeVFSHandle *handle = NULL;
- GnomeVFSResult result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ);
+ result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ);
if (result == GNOME_VFS_OK) {
TnyMimePart *mime_part;
TnyStream *stream;
gchar *escaped_filename;
gchar *filename;
gchar *content_id;
- GnomeVFSFileInfo info;
+ GnomeVFSFileInfo *info;
GnomeVFSURI *vfs_uri;
vfs_uri = gnome_vfs_uri_new (uri);
filename = gnome_vfs_unescape_string_for_display (escaped_filename);
g_free (escaped_filename);
gnome_vfs_uri_unref (vfs_uri);
+
+ info = gnome_vfs_file_info_new ();
if (gnome_vfs_get_file_info (uri,
- &info,
+ info,
GNOME_VFS_FILE_INFO_GET_MIME_TYPE)
== GNOME_VFS_OK)
- mime_type = gnome_vfs_file_info_get_mime_type (&info);
+ mime_type = gnome_vfs_file_info_get_mime_type (info);
mime_part = tny_platform_factory_new_mime_part
(modest_runtime_get_platform_factory ());
stream = TNY_STREAM (tny_vfs_stream_new (handle));
tny_list_prepend (priv->attachments, (GObject *) mime_part);
modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
- mime_part);
+ mime_part,
+ info->size == 0, info->size);
gtk_widget_set_no_show_all (priv->attachments_caption, FALSE);
gtk_widget_show_all (priv->attachments_caption);
gtk_text_buffer_set_modified (priv->text_buffer, TRUE);
g_free (filename);
g_object_unref (mime_part);
+ gnome_vfs_file_info_unref (info);
}
}
gtk_text_buffer_set_modified (priv->text_buffer, TRUE);
g_object_unref (mime_part);
}
+ g_object_unref (iter);
}
g_object_unref (att_list);
wp_text_buffer_undo (WP_TEXT_BUFFER (priv->text_buffer));
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
}
wp_text_buffer_redo (WP_TEXT_BUFFER (priv->text_buffer));
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
}
{
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (userdata));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (userdata));
modest_window_check_dimming_rules_group (MODEST_WINDOW (userdata), MODEST_DIMMING_RULES_CLIPBOARD);
return FALSE;
}
ModestMsgEditWindow *editor)
{
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (editor));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (editor));
}
static void
body_changed (GtkTextBuffer *buffer, ModestMsgEditWindow *editor)
{
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (editor));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (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
modest_msg_edit_window_is_modified (ModestMsgEditWindow *editor)
{
ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor);
+ const char *account_name;
GtkTextBuffer *buffer;
buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->to_field));
return TRUE;
if (gtk_text_buffer_get_modified (priv->text_buffer))
return TRUE;
+ account_name = modest_combo_box_get_active_id (MODEST_COMBO_BOX (priv->from_field));
+ if (!priv->original_account_name || strcmp(account_name, priv->original_account_name)) {
+ return TRUE;
+ }
return FALSE;
}
update_window_title (window);
gtk_text_buffer_set_modified (priv->text_buffer, TRUE);
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
}
static void
g_string_free (result, TRUE);
}
+static void
+text_buffer_insert_text (GtkTextBuffer *buffer,
+ GtkTextIter *iter,
+ gchar *new_text,
+ gint new_text_length,
+ ModestMsgEditWindow *window)
+{
+ GString *result = g_string_new ("");
+ gchar *current;
+ gint result_len = 0;
+ gboolean changed = FALSE;
+
+ for (current = new_text; current != NULL && *current != '\0'; current = g_utf8_next_char (current)) {
+ gunichar c = g_utf8_get_char_validated (current, 8);
+ /* Invalid unichar, stop */
+ if (c == -1)
+ break;
+ /* a bullet */
+ switch (c) {
+ case 0x2022:
+ result = g_string_append_c (result, ' ');
+ changed = TRUE;
+ break;
+ default:
+ result = g_string_append_unichar (result, c);
+ }
+ result_len++;
+ }
+
+ if (changed) {
+ g_signal_stop_emission_by_name (G_OBJECT (buffer), "insert-text");
+ g_signal_handlers_block_by_func(G_OBJECT(buffer), G_CALLBACK(text_buffer_insert_text), window);
+ g_signal_emit_by_name (buffer, "insert-text",
+ (gpointer) iter,
+ (gpointer) result->str, (gpointer) result->len,
+ (gpointer) window);
+ g_signal_handlers_unblock_by_func(G_OBJECT(buffer), G_CALLBACK(text_buffer_insert_text), window);
+ }
+
+ g_string_free (result, TRUE);
+}
+
void
modest_msg_edit_window_toggle_find_toolbar (ModestMsgEditWindow *window,
gboolean show)
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;
g_return_if_fail (TNY_IS_MIME_PART (part));
tny_list_prepend (priv->attachments, (GObject *) part);
- modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), part);
+ modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), part, TRUE, 0);
gtk_widget_set_no_show_all (priv->attachments_caption, FALSE);
gtk_widget_show_all (priv->attachments_caption);
gtk_text_buffer_set_modified (priv->text_buffer, TRUE);