X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fgtk-glade%2Fmodest-ui.c;h=843edea916b5c818b8841ad20504ec3c2fd9a4e7;hp=7db235e5584a1c783c3c6b9f2e5ed2b1a60ce091;hb=0b7a6ab4edbeb404c1b93a7431802bcd45625d08;hpb=dc65f9ff58d0c6ac3d24c8023741e34e2b4cad58 diff --git a/src/gtk-glade/modest-ui.c b/src/gtk-glade/modest-ui.c index 7db235e..843edea 100644 --- a/src/gtk-glade/modest-ui.c +++ b/src/gtk-glade/modest-ui.c @@ -7,6 +7,9 @@ #include #include +/* TODO: put in auto* */ +#include + #ifdef HAVE_CONFIG_H #include #endif /*HAVE_CONFIG_H*/ @@ -21,8 +24,7 @@ #include "../modest-tny-msg-view.h" #include "../modest-tny-transport-actions.h" - -//#include "modest.glade.h" +#include "../modest-text-utils.h" #define MODEST_GLADE PREFIX "/share/modest/glade/modest.glade" #define MODEST_GLADE_MAIN_WIN "main" @@ -43,6 +45,9 @@ static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_m static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder); +void on_account_settings1_activate (GtkMenuItem *, + gpointer); + static void on_password_requested (ModestTnyAccountStore *account_store, const gchar *account_name, gpointer user_data); @@ -54,6 +59,8 @@ static void on_message_clicked (ModestTnyFolderTreeView *folder_tree, gpointer data); static void on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui); +static void on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui); + static void on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui); static void register_toolbar_callbacks (ModestUI *modest_ui); @@ -191,15 +198,19 @@ 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); return NULL; } + /* FIXME: could be used, but doesn't work atm. + * glade_xml_signal_autoconnect(priv->glade_xml); + */ + priv->modest_acc_mgr = modest_acc_mgr; g_object_ref (priv->modest_conf = modest_conf); @@ -221,10 +232,11 @@ modest_ui_show_main_window (ModestUI *modest_ui) ModestUIPrivate *priv; GtkWidget *folder_view, *header_view; GtkWidget *message_view; + GtkWidget *account_settings_item; GtkWidget *folder_view_holder, *header_view_holder, - *message_view_holder; + *mail_paned; priv = MODEST_UI_GET_PRIVATE(modest_ui); @@ -261,16 +273,27 @@ modest_ui_show_main_window (ModestUI *modest_ui) G_CALLBACK(on_folder_clicked), modest_ui); message_view = GTK_WIDGET(modest_tny_msg_view_new (NULL)); - message_view_holder = glade_xml_get_widget (priv->glade_xml, "mail_view"); if (!message_view) { g_warning ("failed to create message view"); return FALSE; } - gtk_container_add (GTK_CONTAINER(message_view_holder), message_view); + mail_paned = glade_xml_get_widget (priv->glade_xml, "mail_paned"); + gtk_paned_add2 (GTK_PANED(mail_paned), message_view); g_signal_connect (header_view, "message_selected", G_CALLBACK(on_message_clicked), - modest_ui); + modest_ui); + + account_settings_item = glade_xml_get_widget (priv->glade_xml, "account_settings1"); + if (!account_settings_item) + { + g_warning ("The account settings item isn't available!\n"); + return FALSE; + } + + g_signal_connect (account_settings_item, "activate", + G_CALLBACK(on_account_settings1_activate), + modest_ui); register_toolbar_callbacks (modest_ui); @@ -300,6 +323,11 @@ register_toolbar_callbacks (ModestUI *modest_ui) if (button) g_signal_connect (button, "clicked", G_CALLBACK(on_new_mail_clicked), modest_ui); + + button = glade_xml_get_widget (priv->glade_xml, "toolb_reply"); + if (button) + g_signal_connect (button, "clicked", + G_CALLBACK(on_reply_clicked), modest_ui); } @@ -319,9 +347,11 @@ modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to, const gchar* subject, const gchar *body, const GSList* att) { - GtkWidget *win; + GtkWidget *win, *to_entry, *subject_entry, *body_view; + ModestUIPrivate *priv; GtkWidget *btn; + GtkTextBuffer *buf; priv = MODEST_UI_GET_PRIVATE(modest_ui); int height = modest_conf_get_int (priv->modest_conf, @@ -337,7 +367,19 @@ modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to, 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"); + subject_entry = glade_xml_get_widget (priv->glade_xml, "subject_entry"); + body_view = glade_xml_get_widget (priv->glade_xml, "body_view"); + + 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)); + 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); @@ -376,8 +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; + 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)); + + 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)); + + 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, @@ -411,7 +535,7 @@ static void on_message_clicked (ModestTnyFolderTreeView *folder_tree, TnyMsgIface *message, gpointer data) { - GtkWidget *scrollview; + GtkWidget *paned; ModestTnyMsgView *msg_view; ModestUIPrivate *priv; @@ -419,10 +543,8 @@ static void on_message_clicked (ModestTnyFolderTreeView *folder_tree, g_return_if_fail (data); priv = MODEST_UI_GET_PRIVATE(data); - scrollview = glade_xml_get_widget (priv->glade_xml,"mail_view"); - - msg_view = MODEST_TNY_MSG_VIEW( - gtk_bin_get_child(GTK_BIN(scrollview))); + paned = glade_xml_get_widget (priv->glade_xml,"mail_paned"); + msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned))); modest_tny_msg_view_set_message (msg_view, message); @@ -439,17 +561,6 @@ on_password_requested (ModestTnyAccountStore *account_store, GtkWidget *passentry; gint retval; const gchar *infostring=g_strconcat("Please enter the password for ", account_name, ".", NULL); - /* - dialog = gtk_message_dialog_new_with_markup (NULL, - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_INFO, - GTK_BUTTONS_CLOSE, - "This dialog asks you for the password for account %s\n" - "However, it's not working yet. So for now, use\n" - "gconf-editor, and stay tuned!", - account_name); - */ - passdialog = gtk_dialog_new_with_buttons("MyDialog", NULL, @@ -481,7 +592,9 @@ on_password_requested (ModestTnyAccountStore *account_store, NULL); break; case GTK_RESPONSE_CANCEL: - g_message("Dann halt nich!\n"); + /* FIXME: + * What happens, if canceled?" + */ break; } @@ -496,8 +609,6 @@ on_password_requested (ModestTnyAccountStore *account_store, static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder) { - GtkTreeViewColumn *column; - GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); GtkWidget *header_tree; header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder)); @@ -506,39 +617,11 @@ modest_main_window_header_tree (TnyMsgFolderIface *folder) return NULL; } - column = gtk_tree_view_column_new_with_attributes(_("Date"), renderer, - "text", - TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN, - NULL); - gtk_tree_view_column_set_resizable (column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(header_tree), column); - - - - column = gtk_tree_view_column_new_with_attributes(_("From"), renderer, - "text", - TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN, - NULL); - gtk_tree_view_column_set_resizable (column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(header_tree), column); - - - column = gtk_tree_view_column_new_with_attributes(_("Subject"), renderer, - "text", - TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN, - NULL); - gtk_tree_view_column_set_resizable (column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(header_tree), column); - - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(header_tree), TRUE); - gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(header_tree), TRUE); - return GTK_WIDGET(header_tree); } - static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr, TnyAccountStoreIface *account_store) @@ -547,7 +630,7 @@ modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr, GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); GtkWidget *folder_tree; - folder_tree = modest_tny_folder_tree_view_new (account_store); + folder_tree = GTK_WIDGET(modest_tny_folder_tree_view_new (account_store)); if (!folder_tree) { g_warning ("could not create folder list"); return NULL; @@ -583,6 +666,140 @@ on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui) } +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; + gint limit = 76; /* TODO: make configurable */ + gchar *quoted; + + buf = gtk_text_buffer_new(NULL); + dest = tny_text_buffer_stream_new(buf); + + /* 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? */ + 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 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); + + quoted = modest_text_utils_quote (buf, from, sent_date, limit); + + 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 TnyMsgIface *msg; + const TnyMsgFolderIface *folder; + 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); + 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 { + g_warning("no header"); + return; + } + + modest_ui_show_edit_window (modest_ui, from, /* cc */ "", /* bcc */ "", re_sub->str, quoted, NULL); + g_free(quoted); + g_string_free(re_sub, TRUE); +} + + +static void +on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) +{ + GtkTreeSelection *sel; + GtkWidget *paned; + GtkTreeModel *model; + GtkTreeIter iter; + GtkScrolledWindow *scroll; + + TnyMsgHeaderIface *header; + + 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); + + scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned))); + g_return_if_fail (scroll); + + msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned))); + g_return_if_fail (msg_view); + + 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)) { + /* 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... */