X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fgtk-glade%2Fmodest-ui.c;h=ba5a004f928c7251d3e4653f6a1686d23150c4c9;hp=a51008472b28772e01cc737e86f6484f764ada3f;hb=674685c46e0ffd6a061f21930a1a33e5f579fa91;hpb=df6be154c51576cb795b074615358107bccd603b diff --git a/src/gtk-glade/modest-ui.c b/src/gtk-glade/modest-ui.c index a510084..ba5a004 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" @@ -45,7 +47,8 @@ static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder); void on_account_settings1_activate (GtkMenuItem *, - gpointer); + gpointer); + static void on_password_requested (ModestTnyAccountStore *account_store, const gchar *account_name, gpointer user_data); @@ -63,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 { @@ -80,7 +85,7 @@ struct _ModestUIPrivate { ModestWindowMgr *modest_window_mgr; TnyAccountStoreIface *account_store; - GtkWindow *main_window; + GtkWindow *main_window; GladeXML *glade_xml; @@ -196,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); @@ -373,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); @@ -414,8 +422,8 @@ modest_ui_last_window_closed (GObject *obj, gpointer data) } void -on_account_selector_selection_changed(GtkWidget *widget, - gpointer user_data) +on_account_selector_selection_changed (GtkWidget *widget, + gpointer user_data) { GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget)); GtkTreeIter iter; @@ -498,7 +506,6 @@ on_account_settings1_activate (GtkMenuItem *menuitem, g_object_unref(glade_xml); } - static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree, TnyMsgFolderIface *folder, @@ -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,203 +648,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) -{ - 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; - - 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? */ - 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); - - gtk_text_buffer_get_iter_at_line(buf, &iter1, 0); - while (TRUE) { - /* at each beginning of this while, iter1 must be at the beginning of - the (next) line to quote */ - - /* debug */ - iter2 = iter1; - gtk_text_iter_forward_to_line_end(&iter2); - txt = gtk_text_buffer_get_text (buf, &iter1, &iter2, FALSE); - printf("%s\n", txt); - /* check whether line is already quoted */ - iter2 = iter1; - - gtk_text_iter_forward_word_end(&iter2); - txt = gtk_text_buffer_get_text (buf, &iter1, &iter2, FALSE); - - /* 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) >= 48) { - - gtk_text_iter_set_line_offset(&iter2, 48); - - /* 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 brakepoint in line) */ - gtk_text_iter_backward_word_start(&iter2); - - /* check for one-word line (up to iter2), don't break then */ - if (!gtk_text_iter_compare(&iter1, &iter2) < 0) { - gtk_text_iter_forward_word_end(&iter2); /*BUG*/ - } - - 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); - - gtk_text_iter_forward_line(&iter1); - - /* 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 the next line is mergable: */ - iter3 = iter1; - if (!gtk_text_iter_forward_line(&iter3)) { - break; - } - - /* iter3 ist 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_word_end(&iter2); - txt = gtk_text_buffer_get_text(buf, &iter3, &iter2, FALSE); - if (strcmp(txt, "> ") == 0) { - continue; - } - - /* now merge in the next line */ - if (!gtk_text_iter_forward_to_line_end(&iter1)) { - break; - } - iter2 = iter1; - gtk_text_iter_forward_char(&iter2); - - tmp = gtk_text_iter_get_offset(&iter1); - - /* do the merge */ - gtk_text_buffer_delete (buf, &iter1, &iter2); - gtk_text_buffer_get_iter_at_offset(buf, &iter1, tmp); - - gtk_text_iter_set_line_offset(&iter1, 0); - - } else { - /* line must not be broken, we're done. */ - if (!gtk_text_iter_forward_line(&iter1)) { - break; - } - } - } else { - /* line was already quoted */ - if (!gtk_text_iter_forward_line(&iter1)) { - break; - } - } - } - - 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; 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); - quoted = modest_ui_quote_msg(msg); - - } 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) { @@ -892,19 +725,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... */ @@ -914,13 +748,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); @@ -949,10 +785,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);