X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fgtk-glade%2Fmodest-ui.c;h=f50eae3a9c43b3628e887398761db30c5a51cc6d;hb=8db724acde57179f20bbcba7298e631f9e6989f2;hp=05d3c4be01a12b95cd08fd06df4ca961e985b7b8;hpb=6ed23d6ec6b9a8ecd3145df32925c977ae777a72;p=modest diff --git a/src/gtk-glade/modest-ui.c b/src/gtk-glade/modest-ui.c index 05d3c4b..f50eae3 100644 --- a/src/gtk-glade/modest-ui.c +++ b/src/gtk-glade/modest-ui.c @@ -24,6 +24,8 @@ #include "../modest-tny-msg-view.h" #include "../modest-tny-transport-actions.h" +#include "../modest-text-utils.h" +#include "../modest-tny-msg-actions.h" #define MODEST_GLADE PREFIX "/share/modest/glade/modest.glade" #define MODEST_GLADE_MAIN_WIN "main" @@ -64,6 +66,8 @@ static void on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui); static void register_toolbar_callbacks (ModestUI *modest_ui); +static void reply_to_msg (ModestUI *modest_ui, TnyMsgHeaderIface *header, + ModestTnyMsgView *msg_view); /* list my signals */ enum { @@ -197,9 +201,9 @@ modest_ui_new (ModestConf *modest_conf) g_signal_connect (account_store_iface, "password_requested", G_CALLBACK(on_password_requested), NULL); + glade_init (); - priv->glade_xml = glade_xml_new (MODEST_GLADE, - NULL,NULL); + priv->glade_xml = glade_xml_new (MODEST_GLADE, NULL,NULL); if (!priv->glade_xml) { g_warning ("failed to do glade stuff"); g_object_unref (obj); @@ -374,8 +378,11 @@ modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to, gtk_entry_set_text(GTK_ENTRY(to_entry), to); buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view)); - gtk_text_buffer_set_text(buf, body, -1); - + if (body) { + gtk_text_buffer_set_text(buf, body, -1); + } else { + gtk_text_buffer_set_text(buf, "", -1); + } g_signal_connect (win, "destroy", G_CALLBACK(hide_edit_window), NULL); @@ -622,8 +629,6 @@ static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr, TnyAccountStoreIface *account_store) { - GtkTreeViewColumn *column; - GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); GtkWidget *folder_tree; folder_tree = GTK_WIDGET(modest_tny_folder_tree_view_new (account_store)); @@ -631,25 +636,7 @@ modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr, g_warning ("could not create folder list"); return NULL; } - - column = gtk_tree_view_column_new_with_attributes(_("All Mail Folders"), - renderer,"text", - TNY_ACCOUNT_TREE_MODEL_NAME_COLUMN, - NULL); - gtk_tree_view_column_set_resizable (column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(folder_tree), column); - - column = gtk_tree_view_column_new_with_attributes(_("Unread"), - renderer, "text", - TNY_ACCOUNT_TREE_MODEL_UNREAD_COLUMN, - NULL); - gtk_tree_view_column_set_resizable (column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(folder_tree), column); - - - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(folder_tree), TRUE); - gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(folder_tree), TRUE); - + return folder_tree; } @@ -661,228 +648,51 @@ on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui) modest_ui_show_edit_window (modest_ui, "", "", "", "", "", NULL); } -static gchar* -modest_ui_quote_msg(const TnyMsgIface *src, const gchar *from, time_t sent_date) -{ - GList *parts; - TnyMsgMimePartIface *part; - TnyStreamIface* stream; - TnyTextBufferStream *dest; - TnyMsgMimePartIface *body = NULL; - GtkTextBuffer *buf; - GtkTextIter begin, end, iter1, iter2, iter3; - gchar *txt, *line; - gint tmp; - gint indent; - gboolean break_line; - gchar sent_str[101]; - gchar from_cut[82]; - gchar reply_head[202]; - - buf = gtk_text_buffer_new(NULL); - dest = tny_text_buffer_stream_new(buf); - parts = (GList*) tny_msg_iface_get_parts (src); - - while (parts) { - /* TODO: maybe we'd like to quote more than one part? - * cleanup, fix leaks - */ - TnyMsgMimePartIface *part = - TNY_MSG_MIME_PART_IFACE(parts->data); - if (tny_msg_mime_part_iface_content_type_is (part, "text/plain")) { - body = part; - break; - } - parts = parts->next; - } - if (!body) { - return ""; - } - buf = gtk_text_buffer_new (NULL); - stream = TNY_STREAM_IFACE(tny_text_buffer_stream_new (buf)); - - tny_stream_iface_reset (stream); - tny_msg_mime_part_iface_decode_to_stream (body, stream); - tny_stream_iface_reset (stream); - - /* format sent_date */ - strftime(sent_str, 100, "%c", localtime(&sent_date)); - strncpy(from_cut, from, 80); - sprintf(reply_head, "On %s, %s wrote:\n", sent_str, from_cut); - - gtk_text_buffer_get_iter_at_line(buf, &iter1, 0); - gtk_text_buffer_insert(buf, &iter1, reply_head, -1); - gtk_text_buffer_get_iter_at_line(buf, &iter1, 1); - while (TRUE) { - /* at each beginning of this while, iter1 must be at the beginning of - the (next) line to quote */ - - iter2 = iter1; - if (gtk_text_iter_get_chars_in_line(&iter1) > 1) { - /* check whether line is already quoted */ - iter2 = iter1; - gtk_text_iter_forward_char (&iter2); - txt = gtk_text_buffer_get_text (buf, &iter1, &iter2, FALSE); - } else { - txt = ""; - } - /* insert quotation mark */ - tmp = gtk_text_iter_get_offset(&iter1); - gtk_text_buffer_insert(buf, &iter1, "> ", -1); - - /* still at the beginning of the line */ - gtk_text_buffer_get_iter_at_offset(buf, &iter1, tmp); - iter2 = iter1; - - if (strcmp(txt, ">") != 0) { - - /* line was not already quoted */ - - /* now check whether the line must be broken: */ - if (gtk_text_iter_get_chars_in_line(&iter2) >= 79) { - - gtk_text_iter_set_line_offset(&iter2, 79); - - /* move iter1 behind quote mark at the beginnig of the line */ - gtk_text_iter_forward_word_end(&iter1); - - /* save iter2 position */ - iter3 = iter2; - - /* move iter2 back one word (from breakpoint in line) */ - gtk_text_iter_backward_word_start(&iter2); - - /* check for one-word line (up to iter2) */ - if (!gtk_text_iter_compare(&iter1, &iter2) < 0) { - gtk_text_iter_forward_word_end(&iter2); /* BUG? */ - } - - /* insert linebreak */ - tmp = gtk_text_iter_get_offset(&iter2); - gtk_text_buffer_insert(buf, &iter2, "\n", -1); - gtk_text_buffer_get_iter_at_offset(buf, &iter1, tmp); - - /* move to the beginning of the "new" line */ - gtk_text_iter_forward_line(&iter1); - - /* try to kill 1 space */ - iter2 = iter1; - gtk_text_iter_forward_char(&iter2); - txt = gtk_text_buffer_get_text(buf, &iter1, &iter2, FALSE); - if (strcmp(txt, " ") == 0) { - tmp = gtk_text_iter_get_offset(&iter1); - gtk_text_buffer_delete(buf, &iter1, &iter2); - gtk_text_buffer_get_iter_at_offset(buf, &iter1, tmp); - } - - /* check whether there is a next line to merge */ - iter3 = iter1; - if (!gtk_text_iter_forward_line(&iter3)) { - continue; - } - /* iter3 is now at the beginning of the next line.*/ - - /* check for empty line */ - if (gtk_text_iter_get_chars_in_line(&iter3) < 2) { - continue; - } - - /* check for quote */ - iter2 = iter3; - gtk_text_iter_forward_char (&iter2); - txt = gtk_text_buffer_get_text(buf, &iter3, &iter2, FALSE); - if (strcmp(txt, ">") == 0) { - /* iter1 is still at the beginning of the newly broken - * so we don't have to cleanup */ - continue; - } - - if (!gtk_text_iter_forward_to_line_end(&iter1)) { - /* no further lines to merge */ - continue; - } - - /* "mark" newline */ - iter2 = iter1; - gtk_text_iter_forward_char(&iter2); - - /* do the merge */ - tmp = gtk_text_iter_get_offset(&iter1); - gtk_text_buffer_delete (buf, &iter1, &iter2); - gtk_text_buffer_get_iter_at_offset (buf, &iter1, tmp); - - /* insert space */ - gtk_text_buffer_insert(buf, &iter1, " ", -1); - gtk_text_buffer_get_iter_at_offset (buf, &iter1, tmp); - - /* move to beginning of line and continue */ - gtk_text_iter_set_line_offset(&iter1, 0); - continue; - - } else { - /* line doesn't have to be broken, we're done. */ - if (!gtk_text_iter_forward_line(&iter1)) { - break; - } - continue; - } - } else { - /* line was already quoted */ - if (!gtk_text_iter_forward_line(&iter1)) { - break; - } - continue; - } - } - - gtk_text_buffer_get_bounds (buf, &begin, &end); - txt = gtk_text_buffer_get_text (buf, &begin, &end, FALSE); - - return txt; -} - static void -modest_ui_reply_to_msg (ModestUI *modest_ui, TnyMsgHeaderIface *header, +reply_to_msg (ModestUI *modest_ui, TnyMsgHeaderIface *header, ModestTnyMsgView *msg_view) { - const gchar *subject, *from, *quoted; - time_t sent_date; const TnyMsgIface *msg; const TnyMsgFolderIface *folder; - gchar *re_sub; - - quoted = ""; - if (header) { - folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header)); - if (!folder) { - g_warning ("cannot find folder"); - return; - } - - msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder), header); - if (!msg) { - g_warning ("cannot find msg"); - return; - } - subject = tny_msg_header_iface_get_subject(header); - /* TODO: checks, free */ - re_sub = malloc(strlen(subject) + 5); - strcpy (re_sub, "Re: "); - strcat (re_sub, subject); - /* FIXME: honor replyto, cc */ - from = tny_msg_header_iface_get_from(header); - sent_date = tny_msg_header_iface_get_date_sent(header); - quoted = modest_ui_quote_msg(msg, from, sent_date); - - } else { - printf("no header\n"); + GString *re_sub; + const gchar *subject, *from; + GtkTextBuffer *unquoted; + gchar *quoted; + time_t sent_date; + gint line_limit = 76; + + if (!header) { + g_warning("no header"); + return; + } + folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header)); + if (!folder) { + g_warning ("cannot find folder"); return; } - modest_ui_show_edit_window (modest_ui, from, "FIXME:cc", /* bcc */ "", re_sub, quoted, NULL); + msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder), header); + if (!msg) { + g_warning ("cannot find msg"); + return; + } + subject = tny_msg_header_iface_get_subject(header); + re_sub = g_string_new(subject); + g_string_prepend(re_sub, "Re: "); + /* FIXME: honor replyto, cc */ + from = tny_msg_header_iface_get_from(header); + sent_date = tny_msg_header_iface_get_date_sent(header); + + unquoted = modest_tny_msg_view_get_selected_text(msg_view); + quoted = modest_tny_msg_actions_quote(msg, from, sent_date, line_limit, unquoted); + + modest_ui_show_edit_window (modest_ui, from, /* cc */ "", /* bcc */ "", re_sub->str, quoted, NULL); + g_free(quoted); + if (unquoted != NULL) + g_object_unref(unquoted); + g_string_free(re_sub, TRUE); } -/* WIP, testing az */ static void on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) { @@ -917,19 +727,20 @@ on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view)); g_return_if_fail (sel); - if (!gtk_tree_selection_get_selected (sel, &model, &iter)) + if (!gtk_tree_selection_get_selected (sel, &model, &iter)) { /* no message was selected. TODO: disable reply button in this case */ + g_warning("nothing to reply to"); return; + } gtk_tree_model_get (model, &iter, TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); - modest_ui_reply_to_msg (modest_ui, header, msg_view); + reply_to_msg (modest_ui, header, msg_view); } - /* FIXME: truly evil --> we cannot really assume that * there is only one edit window open... */ @@ -939,13 +750,15 @@ on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui) ModestTnyTransportActions *actions; ModestUIPrivate *priv; GtkWidget *to_entry, *subject_entry, *body_view; - const gchar *to, *subject; + const gchar *to, *subject, *email_from; gchar *body; GtkTextIter start, end; GtkTextBuffer *buf; TnyAccountStoreIface *account_store; const GList *transport_accounts; TnyTransportAccountIface *transport_account; + ModestConf *conf; + ModestAccountMgr *acc_mgr; g_return_if_fail (modest_ui); @@ -974,10 +787,20 @@ on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui) gtk_text_buffer_get_bounds (buf, &start, &end); body = gtk_text_buffer_get_text (buf, &start, &end, FALSE); - g_message ("sending %s ==> %s", subject, to); + /* FIXME: HACK! */ + conf = MODEST_CONF(modest_conf_new()); + acc_mgr = MODEST_ACCOUNT_MGR(modest_account_mgr_new (conf)); + if (!acc_mgr) { + g_warning ("failed to instantiate account mgr"); + return; + } + email_from = modest_account_mgr_get_identity_string(acc_mgr, "myidentity", MODEST_ACCOUNT_EMAIL, NULL); + /* end HACK */ + + g_message("sending \"%s\" %s ==> %s", subject, email_from, to); modest_tny_transport_actions_send_message (actions, transport_account, - "dirk-jan.binnema@nokia.com", + email_from, to, "", "", subject, body); g_free (body);