X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fgtk-glade%2Fmodest-ui.c;h=75ff923c2e46bc382199a6fed51ac142445cc6a7;hb=5cf98f0ac9cf7c47935ae5339de689eb63e79cb7;hp=cc6ae4b927c82f63ba47cf555b258a3e32ba1a87;hpb=34940dbacea2f48753a8c791d500a6622e2faa77;p=modest diff --git a/src/gtk-glade/modest-ui.c b/src/gtk-glade/modest-ui.c index cc6ae4b..75ff923 100644 --- a/src/gtk-glade/modest-ui.c +++ b/src/gtk-glade/modest-ui.c @@ -17,6 +17,7 @@ #include "../modest-ui.h" #include "../modest-window-mgr.h" #include "../modest-account-mgr.h" +#include "../modest-identity-mgr.h" #include "../modest-tny-account-store.h" #include "../modest-tny-folder-tree-view.h" @@ -24,6 +25,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 +67,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 { @@ -78,10 +83,11 @@ struct _ModestUIPrivate { ModestConf *modest_conf; ModestAccountMgr *modest_acc_mgr; + ModestIdentityMgr *modest_id_mgr; ModestWindowMgr *modest_window_mgr; TnyAccountStoreIface *account_store; - GtkWindow *main_window; + GtkWindow *main_window; GladeXML *glade_xml; @@ -143,6 +149,7 @@ modest_ui_init (ModestUI *obj) ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj); priv->modest_acc_mgr = NULL; + priv->modest_id_mgr = NULL; priv->modest_conf = NULL; priv->modest_window_mgr = NULL; priv->glade_xml = NULL; @@ -157,6 +164,10 @@ modest_ui_finalize (GObject *obj) if (priv->modest_acc_mgr) g_object_unref (priv->modest_acc_mgr); priv->modest_acc_mgr = NULL; + + if (priv->modest_id_mgr) + g_object_unref (priv->modest_id_mgr); + priv->modest_id_mgr = NULL; if (priv->modest_conf) g_object_unref (priv->modest_conf); @@ -173,6 +184,7 @@ modest_ui_new (ModestConf *modest_conf) GObject *obj; ModestUIPrivate *priv; ModestAccountMgr *modest_acc_mgr; + ModestIdentityMgr *modest_id_mgr; TnyAccountStoreIface *account_store_iface; g_return_val_if_fail (modest_conf, NULL); @@ -187,6 +199,14 @@ modest_ui_new (ModestConf *modest_conf) g_object_unref (obj); return NULL; } + + modest_id_mgr = + MODEST_IDENTITY_MGR(modest_identity_mgr_new (modest_conf)); + if (!modest_id_mgr) { + g_warning ("could not create ModestIdentityMgr instance"); + g_object_unref (obj); + return NULL; + } account_store_iface = TNY_ACCOUNT_STORE_IFACE(modest_tny_account_store_new (modest_acc_mgr)); @@ -211,6 +231,7 @@ modest_ui_new (ModestConf *modest_conf) */ priv->modest_acc_mgr = modest_acc_mgr; + priv->modest_id_mgr = modest_id_mgr; g_object_ref (priv->modest_conf = modest_conf); priv->account_store = account_store_iface; @@ -374,8 +395,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 +646,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 +653,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 +665,49 @@ 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; + gchar *unquoted, *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); + g_free(unquoted); + g_string_free(re_sub, TRUE); } -/* WIP, testing az */ static void on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) { @@ -917,19 +742,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 +765,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; + ModestIdentityMgr *id_mgr; g_return_if_fail (modest_ui); @@ -974,10 +802,15 @@ 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); + id_mgr = priv->modest_id_mgr; + email_from = modest_identity_mgr_get_identity_string(id_mgr, + MODEST_IDENTITY_DEFAULT_IDENTITY, + MODEST_IDENTITY_EMAIL, NULL); + + 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);