#include <string.h>
#include <tny-account-store.h>
#include <tny-fs-stream.h>
+#include <tny-vfs-stream.h>
#include <config.h>
static void text_buffer_refresh_attributes (WPTextBuffer *buffer, ModestMsgEditWindow *window);
static void text_buffer_delete_range (GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end, gpointer userdata);
-static void text_buffer_mark_set (GtkTextBuffer *buffer, GtkTextIter *location, GtkTextMark *mark, gpointer userdata);
static void text_buffer_can_undo (GtkTextBuffer *buffer, gboolean can_undo, 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 modest_msg_edit_window_color_button_change (ModestMsgEditWindow *window,
gpointer userdata);
static void modest_msg_edit_window_size_change (GtkCheckMenuItem *menu_item,
static void modest_msg_edit_window_clipboard_owner_change (GtkClipboard *clipboard,
GdkEvent *event,
ModestMsgEditWindow *window);
+static void update_window_title (ModestMsgEditWindow *window);
static void update_dimmed (ModestMsgEditWindow *window);
static void
-text_buffer_mark_set (GtkTextBuffer *buffer, GtkTextIter *iter, GtkTextMark *mark, gpointer userdata)
-{
- ModestMsgEditWindow *window;
- ModestMsgEditWindowPrivate *priv;
- GdkRectangle location;
- gint v_scroll_min_value = 0;
- gint v_scroll_max_value = 0;
- gint v_scroll_visible;
- GtkAdjustment *vadj;
- GtkTextMark *insert_mark;
- GtkTextIter insert_iter;
-
- g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (userdata));
- g_return_if_fail (GTK_IS_TEXT_MARK (mark));
- window = MODEST_MSG_EDIT_WINDOW (userdata);
- priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
-
- 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), &insert_iter, insert_mark);
- gtk_text_view_get_iter_location (GTK_TEXT_VIEW (priv->msg_body), &insert_iter, &location);
-
- if (priv->header_box)
- v_scroll_min_value += priv->header_box->allocation.height + DEFAULT_MAIN_VBOX_SPACING;
- v_scroll_min_value += location.y;
- v_scroll_max_value = v_scroll_min_value + location.height;
-
- v_scroll_visible = GTK_WIDGET (window)->allocation.height;
-
- vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll));
-
- if (((gdouble) v_scroll_min_value) < vadj->value)
- gtk_adjustment_set_value (vadj, v_scroll_min_value);
- else if (((gdouble) v_scroll_max_value) > (vadj->value + vadj->page_size))
- gtk_adjustment_set_value (vadj, ((gdouble)v_scroll_max_value) - vadj->page_size);
-}
-
-static void
init_window (ModestMsgEditWindow *obj)
{
GtkWidget *from_caption, *to_caption, *subject_caption;
g_signal_connect (G_OBJECT (priv->text_buffer), "refresh_attributes",
G_CALLBACK (text_buffer_refresh_attributes), obj);
- g_signal_connect (G_OBJECT (priv->text_buffer), "mark-set",
- G_CALLBACK (text_buffer_mark_set), obj);
g_signal_connect (G_OBJECT (priv->text_buffer), "delete-range",
G_CALLBACK (text_buffer_delete_range), obj);
g_signal_connect (G_OBJECT (priv->text_buffer), "can-undo",
g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field))),
"changed", G_CALLBACK (to_field_changed), obj);
to_field_changed (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field)), MODEST_MSG_EDIT_WINDOW (obj));
+ g_signal_connect (G_OBJECT (priv->subject_field), "changed", G_CALLBACK (subject_field_changed), obj);
priv->scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
if (bcc)
modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->bcc_field), bcc);
if (subject)
- gtk_entry_set_text (GTK_ENTRY(priv->subject_field), subject);
+ gtk_entry_set_text (GTK_ENTRY(priv->subject_field), subject);
+
+ update_window_title (self);
/* gtk_text_buffer_set_can_paste_rich_text (priv->text_buffer, TRUE); */
wp_text_buffer_reset_buffer (WP_TEXT_BUFFER (priv->text_buffer), TRUE);
- body = modest_tny_msg_get_body (msg, FALSE);
+ body = modest_tny_msg_get_body (msg, TRUE);
if ((body == NULL)||(body[0] == '\0')) {
g_free (body);
tool_item = GTK_WIDGET (gtk_tool_item_new ());
priv->font_color_button = hildon_color_button_new ();
GTK_WIDGET_UNSET_FLAGS (tool_item, GTK_CAN_FOCUS);
+ GTK_WIDGET_UNSET_FLAGS (priv->font_color_button, GTK_CAN_FOCUS);
gtk_container_add (GTK_CONTAINER (tool_item), priv->font_color_button);
gtk_tool_item_set_expand (GTK_TOOL_ITEM (tool_item), TRUE);
gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (tool_item), TRUE);
restore_settings (MODEST_MSG_EDIT_WINDOW(obj));
- gtk_window_set_title (GTK_WINDOW(obj), "Modest");
gtk_window_set_icon_from_file (GTK_WINDOW(obj), MODEST_APP_ICON, NULL);
g_signal_connect (G_OBJECT(obj), "delete-event",
data = g_slice_new0 (MsgData);
data->from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
account_name);
+ data->account_name = g_strdup (account_name);
data->to = g_strdup (modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR (priv->to_field)));
data->cc = g_strdup (modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR (priv->cc_field)));
data->bcc = g_strdup (modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR (priv->bcc_field)));
data->subject = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->subject_field)));
+ if (priv->draft_msg) {
+ data->draft_msg = g_object_ref (priv->draft_msg);
+ } else {
+ data->draft_msg = NULL;
+ }
GtkTextBuffer *buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->msg_body));
GtkTextIter b, e;
g_free (data->subject);
g_free (data->plain_body);
g_free (data->html_body);
+ if (data->draft_msg != NULL) {
+ g_object_unref (data->draft_msg);
+ data->draft_msg = NULL;
+ }
+ g_free (data->account_name);
/* TODO: Free data->attachments? */
ModestMsgEditWindowPrivate *priv;
GtkWidget *dialog = NULL;
gint response = 0;
- gchar *filename = NULL;
+ gchar *uri = NULL, *filename = NULL;
priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
response = gtk_dialog_run (GTK_DIALOG (dialog));
switch (response) {
case GTK_RESPONSE_OK:
+ uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog));
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
break;
default:
}
gtk_widget_destroy (dialog);
+ if (uri) {
+
+ GnomeVFSHandle *handle = NULL;
+ GnomeVFSResult result;
+
+ result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ);
+ if (result == GNOME_VFS_OK) {
+ TnyMimePart *mime_part;
+ TnyStream *stream;
+ const gchar *mime_type = NULL;
+ gchar *basename;
+ gchar *content_id;
+ GnomeVFSFileInfo info;
+
+ if (gnome_vfs_get_file_info_from_handle (handle, &info, GNOME_VFS_FILE_INFO_GET_MIME_TYPE) == GNOME_VFS_OK)
+ 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_mime_part_construct_from_stream (mime_part, stream, mime_type);
+
+ content_id = g_strdup_printf ("%d", priv->last_cid);
+ tny_mime_part_set_content_id (mime_part, content_id);
+ g_free (content_id);
+ priv->last_cid++;
+
+ basename = g_path_get_basename (filename);
+ tny_mime_part_set_filename (mime_part, basename);
+ g_free (basename);
+
+ priv->attachments = g_list_prepend (priv->attachments, mime_part);
+ modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
+ mime_part);
+ gtk_widget_set_no_show_all (priv->attachments_caption, FALSE);
+ gtk_widget_show_all (priv->attachments_caption);
+ }
+ g_free (filename);
+ }
+}
+
+void
+modest_msg_edit_window_attach_file_noninteractive (
+ ModestMsgEditWindow *window,
+ gchar *filename)
+{
+
+ ModestMsgEditWindowPrivate *priv;
+
+ priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
+
if (filename) {
gint file_id;
if (gtk_check_menu_item_get_active (menu_item)) {
gchar *markup;
+ WPTextBufferFormat format;
label = gtk_bin_get_child (GTK_BIN (menu_item));
new_size_index = atoi (gtk_label_get_text (GTK_LABEL (label)));
-
- if (!wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FONT_SIZE,
- (gpointer) wp_get_font_size_index (new_size_index, 12)))
- wp_text_view_reset_and_show_im (WP_TEXT_VIEW (priv->msg_body));
+ memset (&format, 0, sizeof (format));
+ format.cs.font_size = TRUE;
+ format.font_size = wp_get_font_size_index (new_size_index, DEFAULT_FONT_SIZE);
+ wp_text_buffer_set_format (WP_TEXT_BUFFER (priv->text_buffer), &format);
+
+/* if (!wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FONT_SIZE, */
+/* (gpointer) wp_get_font_size_index (new_size_index, 12))) */
+/* wp_text_view_reset_and_show_im (WP_TEXT_VIEW (priv->msg_body)); */
text_buffer_refresh_attributes (WP_TEXT_BUFFER (priv->text_buffer), MODEST_MSG_EDIT_WINDOW (window));
markup = g_strconcat ("<span font_family='Serif'>", gtk_label_get_text (GTK_LABEL (label)), "</span>", NULL);
font_size, DEFAULT_FONT_SIZE);
fmt.cs.font_size = TRUE;
}
- gtk_widget_destroy (dialog);
-
- gtk_widget_grab_focus(GTK_WIDGET(priv->msg_body));
wp_text_buffer_set_format(WP_TEXT_BUFFER(priv->text_buffer), &fmt);
}
-
+ gtk_widget_destroy (dialog);
+
+ gtk_widget_grab_focus(GTK_WIDGET(priv->msg_body));
}
void
}
}
}
+ gtk_text_iter_forward_char (&iter);
}
}
GdkEventFocus *event,
gpointer userdata)
{
+
update_dimmed (MODEST_MSG_EDIT_WINDOW (userdata));
return FALSE;
}
action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CopyMenu");
gtk_action_set_sensitive (action, (selection != NULL) && (!MODEST_IS_ATTACHMENTS_VIEW (focused)));
}
+
+static void
+update_window_title (ModestMsgEditWindow *window)
+{
+ ModestMsgEditWindowPrivate *priv = NULL;
+ const gchar *subject;
+
+ priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
+ subject = gtk_entry_get_text (GTK_ENTRY (priv->subject_field));
+ if (subject == NULL || subject[0] == '\0')
+ subject = _("mail_va_new_email");
+
+ gtk_window_set_title (GTK_WINDOW (window), subject);
+
+}
+
+static void
+subject_field_changed (GtkEditable *editable,
+ ModestMsgEditWindow *window)
+{
+ update_window_title (window);
+}