2 #include <glade/glade.h>
3 #include <glib/gi18n.h>
8 #endif /*HAVE_CONFIG_H*/
10 /* TODO: put in auto* */
11 #include <tny-text-buffer-stream.h>
12 #include <tny-msg-folder.h>
14 #include "../modest-ui.h"
15 #include "../modest-window-mgr.h"
16 #include "../modest-account-mgr.h"
17 #include "../modest-account-mgr.h"
18 #include "../modest-identity-mgr.h"
20 #include "../modest-tny-account-store.h"
21 #include "../modest-tny-folder-tree-view.h"
22 #include "../modest-tny-header-tree-view.h"
23 #include "../modest-tny-msg-view.h"
24 #include "../modest-tny-transport-actions.h"
25 #include "../modest-tny-store-actions.h"
27 #include "../modest-text-utils.h"
28 #include "../modest-tny-msg-actions.h"
30 #include "../modest-editor-window.h"
32 #include "modest-ui-glade.h"
33 #include "modest-ui-wizard.h"
35 #include "modest-ui-message-editor.h"
38 static void on_attach_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin);
40 static void on_send_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin);
45 ModestEditorWindow *edit_win;
51 static gboolean close_edit_confirm_dialog(ModestEditorWindow *edit_win)
56 mdialog = gtk_message_dialog_new(GTK_WINDOW(edit_win),
57 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
60 _("Message was modified.\nDiscard Changes?"));
61 gtk_widget_show_all (mdialog);
63 res=gtk_dialog_run(GTK_DIALOG(mdialog));
64 gtk_widget_destroy (mdialog);
65 if (res == GTK_RESPONSE_YES)
72 close_edit_window (GtkWidget *win, GdkEvent *event, gpointer data)
74 ModestEditorWindow *edit_win;
75 ModestUIPrivate *priv;
76 EditWinData *win_data;
78 edit_win = (ModestEditorWindow *)data;
79 win_data = modest_editor_window_get_data(edit_win);
80 priv = MODEST_UI_GET_PRIVATE(win_data->modest_ui);
82 // g_message("window was %s modified", modest_editor_window_get_modified(edit_win) ? "" : "not");
84 if (modest_editor_window_get_modified(edit_win)) {
85 if (close_edit_confirm_dialog(edit_win)) {
86 gtk_widget_hide (GTK_WIDGET(edit_win));
87 modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(edit_win));
88 gtk_widget_destroy(GTK_WIDGET(edit_win));
89 g_message("closing window");
91 g_message("not closing window");
94 gtk_widget_hide (GTK_WIDGET(edit_win));
95 modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(edit_win));
96 gtk_widget_destroy(GTK_WIDGET(edit_win));
97 g_message("closing window");
103 *modest_ui_new_editor_window (ModestUI *modest_ui, gpointer *user_data)
105 GtkWidget *top_container;
107 EditWinData *win_data;
109 glade_xml = glade_xml_new(MODEST_GLADE, "new_mail_top_container", NULL);
113 win_data = g_malloc(sizeof(EditWinData));
114 win_data->modest_ui = modest_ui;
115 win_data->glade_xml = glade_xml;
116 win_data->attachments = NULL;
118 *user_data = win_data;
120 top_container = glade_xml_get_widget(glade_xml, "new_mail_top_container");
121 if (!top_container) {
122 g_object_unref(G_OBJECT(glade_xml));
126 return GTK_CONTAINER(top_container);
131 modest_ui_editor_window_set_to_header(const gchar *to, gpointer window_data)
135 EditWinData *win_data;
137 win_data = (EditWinData *)window_data;
138 glade_xml = win_data->glade_xml;
139 w = glade_xml_get_widget(glade_xml, "to_entry");
140 gtk_entry_set_text(GTK_ENTRY(w), to);
147 modest_ui_editor_window_set_cc_header(const gchar *cc, gpointer window_data)
151 EditWinData *win_data;
153 win_data = (EditWinData *)window_data;
154 glade_xml = win_data->glade_xml;
156 w = glade_xml_get_widget(glade_xml, "cc_entry");
157 gtk_entry_set_text(GTK_ENTRY(w), cc);
164 modest_ui_editor_window_set_bcc_header(const gchar *bcc, gpointer window_data)
168 EditWinData *win_data;
170 win_data = (EditWinData *)window_data;
171 glade_xml = win_data->glade_xml;
173 w = glade_xml_get_widget(glade_xml, "bcc_entry");
174 gtk_entry_set_text(GTK_ENTRY(w), bcc);
181 modest_ui_editor_window_set_subject_header(const gchar *subject, gpointer window_data)
185 EditWinData *win_data;
187 win_data = (EditWinData *)window_data;
188 glade_xml = win_data->glade_xml;
190 w = glade_xml_get_widget(glade_xml, "subject_entry");
191 gtk_entry_set_text(GTK_ENTRY(w), subject);
198 modest_ui_editor_window_set_body(const gchar *body, gpointer window_data)
201 GtkWidget *body_view;
203 EditWinData *win_data;
205 win_data = (EditWinData *)window_data;
206 glade_xml = win_data->glade_xml;
208 body_view = glade_xml_get_widget(glade_xml, "body_view");
209 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
211 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buf), body, -1);
218 modest_ui_editor_window_update_attachments(gpointer window_data)
222 glade_xml = ((EditWinData *) window_data)->glade_xml;
224 //body_view = glade_xml_get_widget(glade_xml, "body_view");
231 void on_editor_entry_changed(GtkEditable *editable,
235 EditWinData *windata;
237 edit_win = (GtkWidget *)user_data;
238 windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
240 modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), TRUE);
245 void on_editor_buffer_changed (GtkTextBuffer *textbuffer,
250 edit_win = (GtkWidget *)user_data;
251 modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), TRUE);
256 new_editor_with_presets (ModestUI *modest_ui, const gchar *to_header,
257 const gchar *cc_header, const gchar *bcc_header,
258 const gchar *subject_header, const gchar *body)
264 EditWinData *windata;
265 ModestUIPrivate *priv;
268 g_return_if_fail (modest_ui);
270 edit_win = modest_editor_window_new(modest_ui);
271 windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
272 g_return_if_fail(windata);
274 glade_xml = windata->glade_xml;
275 btn = glade_xml_get_widget (glade_xml, "toolb_send");
276 g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked),
278 btn = glade_xml_get_widget (glade_xml, "toolb_attach");
279 g_signal_connect (btn, "clicked", G_CALLBACK(on_attach_button_clicked),
282 w = glade_xml_get_widget (glade_xml, "to_entry");
283 g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win);
284 w = glade_xml_get_widget (glade_xml, "subject_entry");
285 g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win);
286 w = glade_xml_get_widget (glade_xml, "body_view");
287 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
288 g_signal_connect(buf, "changed", G_CALLBACK(on_editor_buffer_changed), edit_win);
290 g_signal_connect (edit_win, "destroy-event", G_CALLBACK(close_edit_window),
292 g_signal_connect (edit_win, "delete-event", G_CALLBACK(close_edit_window),
295 priv = MODEST_UI_GET_PRIVATE(modest_ui);
296 height = modest_conf_get_int (priv->modest_conf,
297 MODEST_CONF_EDIT_WINDOW_HEIGHT, NULL);
298 width = modest_conf_get_int (priv->modest_conf,
299 MODEST_CONF_EDIT_WINDOW_WIDTH, NULL);
301 // g_message("new editor win@%dx%d", width, height);
303 gtk_widget_set_usize (GTK_WIDGET(edit_win), width, height);
304 if (strlen(subject_header) > 0)
305 gtk_window_set_title (GTK_WINDOW(edit_win), subject_header);
307 gtk_window_set_title (GTK_WINDOW(edit_win), _("Untitled"));
309 modest_window_mgr_register(priv->modest_window_mgr, G_OBJECT(edit_win), MODEST_EDIT_WINDOW, 0);
311 modest_editor_window_set_to_header(MODEST_EDITOR_WINDOW(edit_win), to_header);
312 modest_editor_window_set_cc_header(MODEST_EDITOR_WINDOW(edit_win), cc_header);
313 modest_editor_window_set_bcc_header(MODEST_EDITOR_WINDOW(edit_win), bcc_header);
314 modest_editor_window_set_subject_header(MODEST_EDITOR_WINDOW(edit_win), subject_header);
315 modest_editor_window_set_body(MODEST_EDITOR_WINDOW(edit_win), body);
317 modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), FALSE);
319 gtk_widget_show(edit_win);
324 on_new_mail_clicked (GtkWidget *widget, gpointer user_data)
326 ModestUI *modest_ui = (ModestUI *) modest_ui;
328 new_editor_with_presets(modest_ui, "", "", "", "", "");
333 quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype)
335 GtkTreeSelection *sel;
339 GtkScrolledWindow *scroll;
341 TnyMsgHeaderIface *header;
343 ModestTnyHeaderTreeView *header_view;
344 ModestTnyMsgView *msg_view;
345 ModestUIPrivate *priv;
347 const TnyMsgIface *msg;
348 const TnyMsgFolderIface *folder;
350 const gchar *subject, *from;
351 gchar *unquoted, *quoted;
353 gint line_limit = 76;
355 g_return_if_fail (modest_ui);
357 priv = MODEST_UI_GET_PRIVATE(modest_ui);
359 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
360 g_return_if_fail (paned);
362 scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
363 g_return_if_fail (scroll);
365 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
366 g_return_if_fail (msg_view);
368 header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
369 g_return_if_fail (header_view);
371 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
372 g_return_if_fail (sel);
374 if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
375 g_warning("nothing to reply to");
379 gtk_tree_model_get (model, &iter,
380 TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
384 g_warning("no header");
388 folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header));
390 g_warning ("cannot find folder");
394 msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder), header);
396 g_warning ("cannot find msg");
400 subject = tny_msg_header_iface_get_subject(header);
401 re_sub = g_string_new(subject);
402 /* FIXME: honor replyto, cc */
403 from = tny_msg_header_iface_get_from(header);
404 sent_date = tny_msg_header_iface_get_date_sent(header);
406 unquoted = modest_tny_msg_view_get_selected_text(msg_view);
407 quoted = modest_tny_msg_actions_quote(msg, from, sent_date, line_limit, unquoted);
410 case QUOTED_SEND_REPLY:
411 g_string_prepend(re_sub, _("Re: "));
412 new_editor_with_presets(modest_ui, from, /* cc */ "", /* bcc */ "", re_sub->str, quoted);
414 case QUOTED_SEND_FORWARD:
415 g_string_prepend(re_sub, _("Fwd: "));
416 new_editor_with_presets(modest_ui, /* from */ "", /* cc */ "", /* bcc */ "", re_sub->str, quoted);
423 g_string_free(re_sub, TRUE);
428 on_attach_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin)
430 /* open file selector */
433 gchar *filename = NULL;
435 dialog = gtk_file_chooser_dialog_new ("Open File",
436 GTK_WINDOW(modest_editwin),
437 GTK_FILE_CHOOSER_ACTION_OPEN,
438 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
439 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
442 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
445 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
446 printf ("file:%s\n", filename);
448 gtk_widget_destroy (dialog);
454 g_return_if_fail(g_str_has_suffix(filename, ".jpg")); /* for now... */
457 mime_type = "image/jpeg";
461 modest_editor_window_attach_file(modest_editwin, filename);
468 on_send_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin)
470 ModestTnyTransportActions *actions;
472 ModestUIPrivate *priv;
473 GtkWidget *to_entry, *subject_entry, *body_view;
474 const gchar *to, *subject, *email_from;
476 GtkTextIter start, end;
478 TnyAccountStoreIface *account_store;
479 const GList *transport_accounts;
480 TnyTransportAccountIface *transport_account;
481 ModestIdentityMgr *id_mgr;
482 EditWinData *win_data;
486 win_data = modest_editor_window_get_data(modest_editwin);
487 modest_ui = win_data->modest_ui;
489 g_return_if_fail (modest_ui);
491 actions = MODEST_TNY_TRANSPORT_ACTIONS
492 (modest_tny_transport_actions_new ());
494 priv = MODEST_UI_GET_PRIVATE(modest_ui);
496 account_store = priv->account_store;
498 tny_account_store_iface_get_transport_accounts (account_store);
499 if (!transport_accounts) {
500 g_message ("cannot send message: no transport account defined");
502 } else /* take the first one! */
504 TNY_TRANSPORT_ACCOUNT_IFACE(transport_accounts->data);
506 to_entry = glade_xml_get_widget (win_data->glade_xml, "to_entry");
507 subject_entry = glade_xml_get_widget (win_data->glade_xml, "subject_entry");
508 body_view = glade_xml_get_widget (win_data->glade_xml, "body_view");
510 to = gtk_entry_get_text (GTK_ENTRY(to_entry));
511 subject = gtk_entry_get_text (GTK_ENTRY(subject_entry));
513 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
514 gtk_text_buffer_get_bounds (buf, &start, &end);
515 body = gtk_text_buffer_get_text (buf, &start, &end, FALSE);
517 id_mgr = priv->modest_id_mgr;
518 email_from = modest_identity_mgr_get_identity_string(id_mgr,
519 MODEST_IDENTITY_DEFAULT_IDENTITY,
520 MODEST_IDENTITY_EMAIL, NULL);
521 attachments = modest_editor_window_get_attachments(modest_editwin);
522 /* while (attachments) {
523 printf("att: %s\n", (gchar *) attachments->data);
524 attachments = attachments->next;
529 g_message("sending \"%s\" %s ==> %s", subject, email_from, to);
531 modest_tny_transport_actions_send_message (actions,
539 g_object_unref (G_OBJECT(actions));
541 gtk_widget_hide (GTK_WIDGET(modest_editwin));
542 modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(modest_editwin));
543 if (GTK_IS_WIDGET(modest_editwin)) {
544 gtk_widget_destroy(GTK_WIDGET(modest_editwin));
546 g_warning("editor window has vanished!");