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");
230 static void on_editor_entry_changed(GtkEditable *editable,
234 EditWinData *windata;
236 edit_win = (GtkWidget *)user_data;
237 windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
239 modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), TRUE);
243 static void on_editor_buffer_changed (GtkTextBuffer *textbuffer,
248 edit_win = (GtkWidget *)user_data;
249 modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), TRUE);
254 new_editor_with_presets (ModestUI *modest_ui, const gchar *to_header,
255 const gchar *cc_header, const gchar *bcc_header,
256 const gchar *subject_header, const gchar *body)
262 EditWinData *windata;
263 ModestUIPrivate *priv;
266 g_return_if_fail (modest_ui);
268 edit_win = modest_editor_window_new(modest_ui);
269 windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
270 g_return_if_fail(windata);
272 glade_xml = windata->glade_xml;
273 btn = glade_xml_get_widget (glade_xml, "toolb_send");
274 g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked),
276 btn = glade_xml_get_widget (glade_xml, "toolb_attach");
277 g_signal_connect (btn, "clicked", G_CALLBACK(on_attach_button_clicked),
280 w = glade_xml_get_widget (glade_xml, "to_entry");
281 g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win);
282 w = glade_xml_get_widget (glade_xml, "subject_entry");
283 g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win);
284 w = glade_xml_get_widget (glade_xml, "body_view");
285 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
286 g_signal_connect(buf, "changed", G_CALLBACK(on_editor_buffer_changed), edit_win);
288 g_signal_connect (edit_win, "destroy-event", G_CALLBACK(close_edit_window),
290 g_signal_connect (edit_win, "delete-event", G_CALLBACK(close_edit_window),
293 priv = MODEST_UI_GET_PRIVATE(modest_ui);
294 height = modest_conf_get_int (priv->modest_conf,
295 MODEST_CONF_EDIT_WINDOW_HEIGHT, NULL);
296 width = modest_conf_get_int (priv->modest_conf,
297 MODEST_CONF_EDIT_WINDOW_WIDTH, NULL);
299 // g_message("new editor win@%dx%d", width, height);
301 gtk_widget_set_usize (GTK_WIDGET(edit_win), width, height);
302 if (strlen(subject_header) > 0)
303 gtk_window_set_title (GTK_WINDOW(edit_win), subject_header);
305 gtk_window_set_title (GTK_WINDOW(edit_win), _("Untitled"));
307 modest_window_mgr_register(priv->modest_window_mgr, G_OBJECT(edit_win), MODEST_EDIT_WINDOW, 0);
309 modest_editor_window_set_to_header(MODEST_EDITOR_WINDOW(edit_win), to_header);
310 modest_editor_window_set_cc_header(MODEST_EDITOR_WINDOW(edit_win), cc_header);
311 modest_editor_window_set_bcc_header(MODEST_EDITOR_WINDOW(edit_win), bcc_header);
312 modest_editor_window_set_subject_header(MODEST_EDITOR_WINDOW(edit_win), subject_header);
313 modest_editor_window_set_body(MODEST_EDITOR_WINDOW(edit_win), body);
315 modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), FALSE);
317 gtk_widget_show(edit_win);
322 on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui)
324 new_editor_with_presets(modest_ui, "", "", "", "", "");
328 on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui)
334 EditWinData *windata;
335 ModestUIPrivate *priv;
338 g_return_if_fail (modest_ui);
339 //modest_ui_new_edit_window (modest_ui, "", "", "", "", "", NULL);
341 edit_win = modest_editor_window_new(modest_ui);
342 windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
343 g_return_if_fail(windata);
345 windata->edit_win = MODEST_EDITOR_WINDOW(edit_win);
346 glade_xml = windata->glade_xml;
347 btn = glade_xml_get_widget (glade_xml, "toolb_send");
348 g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked),
350 btn = glade_xml_get_widget (glade_xml, "toolb_attach");
351 g_signal_connect (btn, "clicked", G_CALLBACK(on_attach_button_clicked),
354 w = glade_xml_get_widget (glade_xml, "to_entry");
355 g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win);
356 w = glade_xml_get_widget (glade_xml, "subject_entry");
357 g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win);
358 w = glade_xml_get_widget (glade_xml, "body_view");
359 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
360 gtk_text_buffer_set_text(buf, "", -1);
361 g_signal_connect(buf, "changed", G_CALLBACK(on_editor_buffer_changed), edit_win);
363 g_signal_connect (edit_win, "destroy-event", G_CALLBACK(close_edit_window),
365 g_signal_connect (edit_win, "delete-event", G_CALLBACK(close_edit_window),
368 priv = MODEST_UI_GET_PRIVATE(windata->modest_ui);
369 height = modest_conf_get_int (priv->modest_conf,
370 MODEST_CONF_EDIT_WINDOW_HEIGHT, NULL);
371 width = modest_conf_get_int (priv->modest_conf,
372 MODEST_CONF_EDIT_WINDOW_WIDTH, NULL);
374 // g_message("new editor win@%dx%d", width, height);
376 gtk_widget_set_usize (GTK_WIDGET(edit_win), width, height);
377 gtk_window_set_title (GTK_WINDOW(edit_win), _("Untitled"));
378 modest_window_mgr_register(priv->modest_window_mgr, G_OBJECT(edit_win), MODEST_EDIT_WINDOW, 0);
379 gtk_widget_show(edit_win);
384 quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype)
386 GtkTreeSelection *sel;
390 GtkScrolledWindow *scroll;
392 TnyMsgHeaderIface *header;
394 ModestTnyHeaderTreeView *header_view;
395 ModestTnyMsgView *msg_view;
396 ModestUIPrivate *priv;
398 const TnyMsgIface *msg;
399 const TnyMsgFolderIface *folder;
401 const gchar *subject, *from;
402 gchar *unquoted, *quoted;
404 gint line_limit = 76;
406 g_return_if_fail (modest_ui);
408 priv = MODEST_UI_GET_PRIVATE(modest_ui);
410 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
411 g_return_if_fail (paned);
413 scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
414 g_return_if_fail (scroll);
416 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
417 g_return_if_fail (msg_view);
419 header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
420 g_return_if_fail (header_view);
422 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
423 g_return_if_fail (sel);
425 if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
426 g_warning("nothing to reply to");
430 gtk_tree_model_get (model, &iter,
431 TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
435 g_warning("no header");
439 folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header));
441 g_warning ("cannot find folder");
445 msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder), header);
447 g_warning ("cannot find msg");
451 subject = tny_msg_header_iface_get_subject(header);
452 re_sub = g_string_new(subject);
453 /* FIXME: honor replyto, cc */
454 from = tny_msg_header_iface_get_from(header);
455 sent_date = tny_msg_header_iface_get_date_sent(header);
457 unquoted = modest_tny_msg_view_get_selected_text(msg_view);
458 quoted = modest_tny_msg_actions_quote(msg, from, sent_date, line_limit, unquoted);
461 case QUOTED_SEND_REPLY:
462 g_string_prepend(re_sub, _("Re: "));
463 new_editor_with_presets(modest_ui, from, /* cc */ "", /* bcc */ "", re_sub->str, quoted);
465 case QUOTED_SEND_FORWARD:
466 g_string_prepend(re_sub, _("Fwd: "));
467 new_editor_with_presets(modest_ui, /* from */ "", /* cc */ "", /* bcc */ "", re_sub->str, quoted);
474 g_string_free(re_sub, TRUE);
479 on_attach_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin)
481 /* open file selector */
484 gchar *filename = NULL;
486 dialog = gtk_file_chooser_dialog_new ("Open File",
487 GTK_WINDOW(modest_editwin),
488 GTK_FILE_CHOOSER_ACTION_OPEN,
489 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
490 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
493 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
496 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
497 printf ("file:%s\n", filename);
499 gtk_widget_destroy (dialog);
505 g_return_if_fail(g_str_has_suffix(filename, ".jpg")); /* for now... */
508 mime_type = "image/jpeg";
512 modest_editor_window_attach_file(modest_editwin, filename);
519 on_send_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin)
521 ModestTnyTransportActions *actions;
523 ModestUIPrivate *priv;
524 GtkWidget *to_entry, *subject_entry, *body_view;
525 const gchar *to, *subject, *email_from;
527 GtkTextIter start, end;
529 TnyAccountStoreIface *account_store;
530 const GList *transport_accounts;
531 TnyTransportAccountIface *transport_account;
532 ModestIdentityMgr *id_mgr;
533 EditWinData *win_data;
537 win_data = modest_editor_window_get_data(modest_editwin);
538 modest_ui = win_data->modest_ui;
540 g_return_if_fail (modest_ui);
542 actions = MODEST_TNY_TRANSPORT_ACTIONS
543 (modest_tny_transport_actions_new ());
545 priv = MODEST_UI_GET_PRIVATE(modest_ui);
547 account_store = priv->account_store;
549 tny_account_store_iface_get_transport_accounts (account_store);
550 if (!transport_accounts) {
551 g_message ("cannot send message: no transport account defined");
553 } else /* take the first one! */
555 TNY_TRANSPORT_ACCOUNT_IFACE(transport_accounts->data);
557 to_entry = glade_xml_get_widget (win_data->glade_xml, "to_entry");
558 subject_entry = glade_xml_get_widget (win_data->glade_xml, "subject_entry");
559 body_view = glade_xml_get_widget (win_data->glade_xml, "body_view");
561 to = gtk_entry_get_text (GTK_ENTRY(to_entry));
562 subject = gtk_entry_get_text (GTK_ENTRY(subject_entry));
564 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
565 gtk_text_buffer_get_bounds (buf, &start, &end);
566 body = gtk_text_buffer_get_text (buf, &start, &end, FALSE);
568 id_mgr = priv->modest_id_mgr;
569 email_from = modest_identity_mgr_get_identity_string(id_mgr,
570 MODEST_IDENTITY_DEFAULT_IDENTITY,
571 MODEST_IDENTITY_EMAIL, NULL);
572 attachments = modest_editor_window_get_attachments(modest_editwin);
573 /* while (attachments) {
574 printf("att: %s\n", (gchar *) attachments->data);
575 attachments = attachments->next;
580 g_message("sending \"%s\" %s ==> %s", subject, email_from, to);
582 modest_tny_transport_actions_send_message (actions,
590 g_object_unref (G_OBJECT(actions));
592 gtk_widget_hide (GTK_WIDGET(modest_editwin));
593 modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(modest_editwin));
594 if (GTK_IS_WIDGET(modest_editwin)) {
595 gtk_widget_destroy(GTK_WIDGET(modest_editwin));
597 g_warning("editor window has vanished!");