X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgtk-glade%2Fmodest-ui.c;h=843edea916b5c818b8841ad20504ec3c2fd9a4e7;hb=0b7a6ab4edbeb404c1b93a7431802bcd45625d08;hp=445a17ddecf47d815713911f08c416c65126d1b3;hpb=06eaa326f9906637c0f8a24da45582457bcbdb05;p=modest diff --git a/src/gtk-glade/modest-ui.c b/src/gtk-glade/modest-ui.c index 445a17d..843edea 100644 --- a/src/gtk-glade/modest-ui.c +++ b/src/gtk-glade/modest-ui.c @@ -24,6 +24,7 @@ #include "../modest-tny-msg-view.h" #include "../modest-tny-transport-actions.h" +#include "../modest-text-utils.h" #define MODEST_GLADE PREFIX "/share/modest/glade/modest.glade" #define MODEST_GLADE_MAIN_WIN "main" @@ -44,8 +45,9 @@ static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_m static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder); -static void on_account_settings1_activate (GtkMenuItem *, - gpointer); +void on_account_settings1_activate (GtkMenuItem *, + gpointer); + static void on_password_requested (ModestTnyAccountStore *account_store, const gchar *account_name, gpointer user_data); @@ -196,9 +198,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); @@ -350,7 +352,7 @@ modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to, ModestUIPrivate *priv; GtkWidget *btn; GtkTextBuffer *buf; - + priv = MODEST_UI_GET_PRIVATE(modest_ui); int height = modest_conf_get_int (priv->modest_conf, MODEST_CONF_EDIT_WINDOW_HEIGHT,NULL); @@ -362,7 +364,7 @@ modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to, g_warning ("could not create new mail window"); return FALSE; } - + modest_window_mgr_register (priv->modest_window_mgr, G_OBJECT(win), MODEST_EDIT_WINDOW, 0); to_entry = glade_xml_get_widget (priv->glade_xml, "to_entry"); @@ -371,10 +373,13 @@ modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to, gtk_entry_set_text(GTK_ENTRY(subject_entry), subject); 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); @@ -413,26 +418,90 @@ modest_ui_last_window_closed (GObject *obj, gpointer data) gtk_main_quit (); } +void +on_account_selector_selection_changed (GtkWidget *widget, + gpointer user_data) +{ + GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget)); + GtkTreeIter iter; -static void + gchar *account_name; + + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter)) + { + gtk_tree_model_get(GTK_TREE_MODEL(model), + &iter, + 0, &account_name, + -1); + } + else + { + account_name="empty"; + } + + g_message("Value: '%s'\n", account_name); +} + +void on_account_settings1_activate (GtkMenuItem *menuitem, gpointer user_data) { + GladeXML *glade_xml; GtkWidget *advanced_account_setup; ModestUIPrivate *priv; gint retval; + GSList *account_name_list; + GSList *account_name_list_iter; + GtkListStore *account_names; + GtkTreeIter account_names_iter; + GtkWidget *account_selector; + GtkCellRenderer *renderer; priv = MODEST_UI_GET_PRIVATE(MODEST_UI(user_data)); - advanced_account_setup = glade_xml_get_widget(priv->glade_xml, "mailbox_setup_advanced"); + glade_xml = glade_xml_new(MODEST_GLADE, "mailbox_setup_advanced", NULL); + advanced_account_setup = glade_xml_get_widget(glade_xml, "mailbox_setup_advanced"); + + account_name_list=modest_account_mgr_account_names(priv->modest_acc_mgr, NULL); + account_names = gtk_list_store_new(1, G_TYPE_STRING); + + for (account_name_list_iter=account_name_list; + account_name_list_iter!=NULL; + account_name_list_iter=g_slist_next(account_name_list_iter)) + { + gtk_list_store_append(account_names, &account_names_iter); + gtk_list_store_set(account_names, &account_names_iter, + 0, account_name_list_iter->data, + -1); + } + + g_slist_free(account_name_list); + + account_selector = glade_xml_get_widget(glade_xml, "account_selector"); + gtk_combo_box_set_model(GTK_COMBO_BOX(account_selector), GTK_TREE_MODEL(account_names)); + + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (account_selector), renderer, TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (account_selector), renderer, + "text", 0, + NULL); + + g_signal_connect(GTK_WIDGET(account_selector), "changed", + G_CALLBACK(on_account_selector_selection_changed), + GTK_WIDGET(advanced_account_setup)); + + gtk_combo_box_set_active(GTK_COMBO_BOX(account_selector), 0); gtk_widget_show_all(GTK_WIDGET(advanced_account_setup)); retval=gtk_dialog_run(GTK_DIALOG(advanced_account_setup)); - gtk_widget_hide(GTK_WIDGET(advanced_account_setup)); -} + g_object_unref(account_names); + gtk_widget_destroy(GTK_WIDGET(advanced_account_setup)); + + g_object_unref(glade_xml); +} static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree, @@ -596,7 +665,8 @@ on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui) modest_ui_show_edit_window (modest_ui, "", "", "", "", "", NULL); } -static gchar* + +static gchar * modest_ui_quote_msg(const TnyMsgIface *src, const gchar *from, time_t sent_date) { GList *parts; @@ -605,23 +675,17 @@ modest_ui_quote_msg(const TnyMsgIface *src, const gchar *from, time_t sent_date) 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]; - + gint limit = 76; /* TODO: make configurable */ + gchar *quoted; + buf = gtk_text_buffer_new(NULL); dest = tny_text_buffer_stream_new(buf); - parts = (GList*) tny_msg_iface_get_parts (src); + /* is the warning in this line due to a bug in tinymail? */ + parts = (GList*) tny_msg_iface_get_parts (src); + while (parts) { - /* TODO: maybe we'd like to quote more than one part? - * cleanup, fix leaks - */ + /* 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")) { @@ -631,193 +695,63 @@ modest_ui_quote_msg(const TnyMsgIface *src, const gchar *from, time_t sent_date) parts = parts->next; } if (!body) { - return ""; + return NULL; } 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; + tny_stream_iface_reset (stream); + + quoted = modest_text_utils_quote (buf, from, sent_date, limit); - 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; + g_object_unref(stream); + g_object_unref(buf); + return quoted; } static void modest_ui_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 = ""; + GString *re_sub; + const gchar *subject, *from; + gchar *quoted; + time_t sent_date; + + 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); + 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); quoted = modest_ui_quote_msg(msg, from, sent_date); - } else { - printf("no header\n"); + g_warning("no header"); return; } - - modest_ui_show_edit_window (modest_ui, from, "FIXME:cc", /* bcc */ "", re_sub, quoted, NULL); + + modest_ui_show_edit_window (modest_ui, from, /* cc */ "", /* bcc */ "", re_sub->str, quoted, NULL); + g_free(quoted); + g_string_free(re_sub, TRUE); } -/* WIP, testing az */ static void on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) { @@ -832,11 +766,11 @@ on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) ModestTnyHeaderTreeView *header_view; ModestTnyMsgView *msg_view; ModestUIPrivate *priv; - + g_return_if_fail (modest_ui); priv = MODEST_UI_GET_PRIVATE(modest_ui); - + paned = glade_xml_get_widget (priv->glade_xml,"mail_paned"); g_return_if_fail (paned); @@ -848,23 +782,24 @@ on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll))); g_return_if_fail (header_view); - + 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); } - /* FIXME: truly evil --> we cannot really assume that * there is only one edit window open... */