X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fgtk-glade%2Fmodest-ui.c;h=3e7f9e4d3d884c0f019a320ee5513247bebbd3d5;hb=8852855998585a12d217705e0034312fe3de5d06;hp=193b3b240ca6898007b9ad8cf8297baa5f383636;hpb=5dca2df20c2730248d2b5584bcf364466a6a459c;p=modest diff --git a/src/gtk-glade/modest-ui.c b/src/gtk-glade/modest-ui.c index 193b3b2..3e7f9e4 100644 --- a/src/gtk-glade/modest-ui.c +++ b/src/gtk-glade/modest-ui.c @@ -7,45 +7,49 @@ #include #include -/* TODO: put in auto* */ -#include - #ifdef HAVE_CONFIG_H #include #endif /*HAVE_CONFIG_H*/ +/* TODO: put in auto* */ +#include +#include + #include "../modest-ui.h" #include "../modest-window-mgr.h" #include "../modest-account-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" #include "../modest-tny-header-tree-view.h" #include "../modest-tny-msg-view.h" #include "../modest-tny-transport-actions.h" +#include "../modest-tny-store-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" -#define MODEST_GLADE_EDIT_WIN "new_mail" +#include "../modest-editor-window.h" +#include "modest-ui-glade.h" +#include "modest-ui-wizard.h" /* 'private'/'protected' functions */ static void modest_ui_class_init (ModestUIClass *klass); static void modest_ui_init (ModestUI *obj); static void modest_ui_finalize (GObject *obj); -static void modest_ui_window_destroy (GtkWidget *win, gpointer data); +static void modest_ui_window_destroy (GtkWidget *win, GdkEvent *event, gpointer data); static void modest_ui_last_window_closed (GObject *obj, gpointer data); -static GtkWidget* modest_main_window_toolbar (void); static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr, TnyAccountStoreIface *account_store); static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder); - -void on_account_settings1_activate (GtkMenuItem *, - gpointer); +//static void on_account_settings1_activate (GtkMenuItem *, +// gpointer); static void on_password_requested (ModestTnyAccountStore *account_store, const gchar *account_name, gpointer user_data); @@ -60,10 +64,35 @@ static void on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui); static void on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui); +static void on_forward_clicked (GtkWidget *widget, ModestUI *modest_ui); + +static void on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui); + +#if 1 +static void on_send_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin); +#else static void on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui); +#endif + +static void on_sendreceive_button_clicked (GtkWidget *widget, ModestUI *modest_ui); static void register_toolbar_callbacks (ModestUI *modest_ui); +typedef enum { + QUOTED_SEND_REPLY, + QUOTED_SEND_REPLY_ALL, + QUOTED_SEND_FORWARD +} quoted_send_type; + +static void quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype); + + +typedef struct { + ModestUI *modest_ui; + ModestEditorWindow *edit_win; + GladeXML *glade_xml; +} EditWinData; + /* list my signals */ enum { @@ -72,23 +101,6 @@ enum { LAST_SIGNAL }; - -typedef struct _ModestUIPrivate ModestUIPrivate; -struct _ModestUIPrivate { - - ModestConf *modest_conf; - ModestAccountMgr *modest_acc_mgr; - ModestWindowMgr *modest_window_mgr; - TnyAccountStoreIface *account_store; - - GtkWindow *main_window; - GladeXML *glade_xml; - - -}; -#define MODEST_UI_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ - MODEST_TYPE_UI, \ - ModestUIPrivate)) /* globals */ static GObjectClass *parent_class = NULL; @@ -118,6 +130,7 @@ modest_ui_get_type (void) return my_type; } + static void modest_ui_class_init (ModestUIClass *klass) { @@ -137,18 +150,21 @@ modest_ui_class_init (ModestUIClass *klass) /* etc. */ } + static void 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; } + static void modest_ui_finalize (GObject *obj) { @@ -158,6 +174,10 @@ modest_ui_finalize (GObject *obj) 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); priv->modest_conf = NULL; @@ -167,12 +187,14 @@ modest_ui_finalize (GObject *obj) priv->modest_window_mgr = NULL; } + GObject* 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); @@ -188,6 +210,14 @@ modest_ui_new (ModestConf *modest_conf) 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)); if (!account_store_iface) { @@ -197,7 +227,7 @@ 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); if (!priv->glade_xml) { @@ -211,6 +241,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; @@ -227,11 +258,13 @@ gboolean modest_ui_show_main_window (ModestUI *modest_ui) { GtkWidget *win; - int height, width; + gint height, width; ModestUIPrivate *priv; GtkWidget *folder_view, *header_view; GtkWidget *message_view; - GtkWidget *account_settings_item; + GtkWidget *account_settings_item; + GtkWidget *new_account_item; + GtkWidget *delete_item; GtkWidget *folder_view_holder, *header_view_holder, @@ -271,7 +304,7 @@ modest_ui_show_main_window (ModestUI *modest_ui) g_signal_connect (G_OBJECT(folder_view), "folder_selected", G_CALLBACK(on_folder_clicked), modest_ui); - message_view = GTK_WIDGET(modest_tny_msg_view_new (NULL)); + message_view = GTK_WIDGET(modest_tny_msg_view_new (NULL, priv->modest_conf)); if (!message_view) { g_warning ("failed to create message view"); return FALSE; @@ -281,26 +314,50 @@ modest_ui_show_main_window (ModestUI *modest_ui) 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"); + account_settings_item = glade_xml_get_widget (priv->glade_xml, "AccountSettingsMenuItem"); 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); + */ + + new_account_item = glade_xml_get_widget (priv->glade_xml, "NewAccountWizardMenuItem"); + if (!new_account_item) + { + g_warning ("The new account item isn't available!\n"); + return FALSE; + } + + g_signal_connect (new_account_item, "activate", + G_CALLBACK(new_wizard_account), + modest_ui); + + delete_item = glade_xml_get_widget (priv->glade_xml, "delete1"); + if (!delete_item) + { + g_warning ("The delete item isn't available!\n"); return FALSE; } - g_signal_connect (account_settings_item, "activate", - G_CALLBACK(on_account_settings1_activate), + g_signal_connect (delete_item, "activate", G_CALLBACK(on_delete_clicked), modest_ui); register_toolbar_callbacks (modest_ui); modest_window_mgr_register (priv->modest_window_mgr, G_OBJECT(win), MODEST_MAIN_WINDOW, 0); - g_signal_connect (win, "destroy", G_CALLBACK(modest_ui_window_destroy), + g_signal_connect (win, "destroy-event", G_CALLBACK(modest_ui_window_destroy), modest_ui); - gtk_widget_set_usize (GTK_WIDGET(win), height, width); + g_signal_connect (win, "delete-event", G_CALLBACK(modest_ui_window_destroy), + modest_ui); + gtk_widget_set_usize (GTK_WIDGET(win), width, height); gtk_window_set_title (GTK_WINDOW(win), PACKAGE_STRING); gtk_widget_show_all (win); @@ -324,24 +381,223 @@ register_toolbar_callbacks (ModestUI *modest_ui) G_CALLBACK(on_new_mail_clicked), modest_ui); button = glade_xml_get_widget (priv->glade_xml, "toolb_reply"); - if (button) + if (button) { g_signal_connect (button, "clicked", G_CALLBACK(on_reply_clicked), modest_ui); -} + gtk_widget_set_sensitive(button, FALSE); + } + + button = glade_xml_get_widget (priv->glade_xml, "toolb_reply_all"); + if (button) { + //g_signal_connect (button, "clicked", + // G_CALLBACK(on_reply_all_clicked), modest_ui); + gtk_widget_set_sensitive(button, FALSE); + } + button = glade_xml_get_widget (priv->glade_xml, "toolb_forward"); + if (button) { + g_signal_connect (button, "clicked", + G_CALLBACK(on_forward_clicked), modest_ui); + gtk_widget_set_sensitive(button, FALSE); + } + + button = glade_xml_get_widget (priv->glade_xml, "toolb_move_to"); + if (button) { + //g_signal_connect (button, "clicked", + // G_CALLBACK(on_move_to_clicked), modest_ui); + gtk_widget_set_sensitive(button, FALSE); + } + + button = glade_xml_get_widget (priv->glade_xml, "toolb_delete"); + if (button) { + g_signal_connect (button, "clicked", + G_CALLBACK(on_delete_clicked), modest_ui); + gtk_widget_set_sensitive(button, FALSE); + } + button = glade_xml_get_widget (priv->glade_xml, "toolb_send_receive"); + if (button) { + g_signal_connect (button, "clicked", + G_CALLBACK(on_sendreceive_button_clicked), modest_ui); + gtk_widget_set_sensitive(button, TRUE); + } +} +#if 0 static void -hide_edit_window (GtkWidget *win, gpointer data) +hide_edit_window (GtkWidget *win, GdkEvent *event, gpointer data) { + ModestUIPrivate *priv; + + priv = MODEST_UI_GET_PRIVATE(data); gtk_widget_hide (win); + modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(win)); +} +#endif + + +static gboolean close_edit_confirm_dialog(ModestEditorWindow *edit_win) +{ + GtkWidget *mdialog; + gint res; + + mdialog = gtk_message_dialog_new(GTK_WINDOW(edit_win), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, + _("Message was modified.\nDiscard Changes?")); + gtk_widget_show_all (mdialog); + + res=gtk_dialog_run(GTK_DIALOG(mdialog)); + gtk_widget_destroy (mdialog); + if (res == GTK_RESPONSE_YES) + return TRUE; + else + return FALSE; +} + +static void +close_edit_window (GtkWidget *win, GdkEvent *event, gpointer data) +{ + ModestEditorWindow *edit_win; + ModestUIPrivate *priv; + EditWinData *win_data; + + edit_win = (ModestEditorWindow *)data; + win_data = modest_editor_window_get_data(edit_win); + priv = MODEST_UI_GET_PRIVATE(win_data->modest_ui); + + // g_message("window was %s modified", modest_editor_window_get_modified(edit_win) ? "" : "not"); + + if (modest_editor_window_get_modified(edit_win)) { + if (close_edit_confirm_dialog(edit_win)) { + gtk_widget_hide (GTK_WIDGET(edit_win)); + modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(edit_win)); + gtk_widget_destroy(GTK_WIDGET(edit_win)); + // g_message("closing window"); + } /* else { + g_message("not closing window"); + }*/ + } +} + + +GtkContainer +*modest_ui_new_editor_window (ModestUI *modest_ui, gpointer *user_data) +{ + GtkWidget *top_container; + + GladeXML *glade_xml; + EditWinData *win_data; + + glade_xml = glade_xml_new(MODEST_GLADE, "new_mail_top_container", NULL); + if (!glade_xml) + return NULL; + + win_data = g_malloc(sizeof(EditWinData)); + win_data->modest_ui = modest_ui; + win_data->glade_xml = glade_xml; + *user_data = win_data; + + top_container = glade_xml_get_widget(glade_xml, "new_mail_top_container"); + if (!top_container) { + g_object_unref(G_OBJECT(glade_xml)); + return NULL; + } + + return GTK_CONTAINER(top_container); +} + + +gboolean +modest_ui_editor_window_set_to_header(const gchar *to, gpointer window_data) +{ + GladeXML *glade_xml; + GtkWidget *w; + EditWinData *win_data; + + win_data = (EditWinData *)window_data; + glade_xml = win_data->glade_xml; + w = glade_xml_get_widget(glade_xml, "to_entry"); + gtk_entry_set_text(GTK_ENTRY(w), to); + + return TRUE; +} + + +gboolean +modest_ui_editor_window_set_cc_header(const gchar *cc, gpointer window_data) +{ + GladeXML *glade_xml; + // GtkWidget *w; + EditWinData *win_data; + + win_data = (EditWinData *)window_data; + glade_xml = win_data->glade_xml; +/* + w = glade_xml_get_widget(glade_xml, "cc_entry"); + gtk_entry_set_text(GTK_ENTRY(w), cc); +*/ + return TRUE; } +gboolean +modest_ui_editor_window_set_bcc_header(const gchar *bcc, gpointer window_data) +{ + GladeXML *glade_xml; + // GtkWidget *w; + EditWinData *win_data; + + win_data = (EditWinData *)window_data; + glade_xml = win_data->glade_xml; +/* + w = glade_xml_get_widget(glade_xml, "bcc_entry"); + gtk_entry_set_text(GTK_ENTRY(w), bcc); +*/ + return TRUE; +} gboolean -modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to, +modest_ui_editor_window_set_subject_header(const gchar *subject, gpointer window_data) +{ + GladeXML *glade_xml; + GtkWidget *w; + EditWinData *win_data; + + win_data = (EditWinData *)window_data; + glade_xml = win_data->glade_xml; + + w = glade_xml_get_widget(glade_xml, "subject_entry"); + gtk_entry_set_text(GTK_ENTRY(w), subject); + + return TRUE; +} + + +gboolean +modest_ui_editor_window_set_body(const gchar *body, gpointer window_data) +{ + GladeXML *glade_xml; + GtkWidget *body_view; + GtkTextBuffer *buf; + EditWinData *win_data; + + win_data = (EditWinData *)window_data; + glade_xml = win_data->glade_xml; + + body_view = glade_xml_get_widget(glade_xml, "body_view"); + buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view)); + + gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buf), body, -1); + + return TRUE; +} + +#if 0 +gboolean +modest_ui_new_edit_window (ModestUI *modest_ui, const gchar* to, const gchar* cc, const gchar* bcc, const gchar* subject, const gchar *body, const GSList* att) @@ -364,8 +620,13 @@ modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to, return FALSE; } - modest_window_mgr_register (priv->modest_window_mgr, - G_OBJECT(win), MODEST_EDIT_WINDOW, 0); + /* FIXME: this also assumes that there can be only one edit window! */ + if (!modest_window_mgr_find_by_type(priv->modest_window_mgr, MODEST_EDIT_WINDOW)) { + /* there already is one edit win, maybe we should preserver its contents */ + 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"); @@ -379,8 +640,10 @@ modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to, } else { gtk_text_buffer_set_text(buf, "", -1); } - g_signal_connect (win, "destroy", G_CALLBACK(hide_edit_window), - NULL); + g_signal_connect (win, "destroy-event", G_CALLBACK(hide_edit_window), + modest_ui); + g_signal_connect (win, "delete-event", G_CALLBACK(hide_edit_window), + modest_ui); gtk_widget_set_usize (GTK_WIDGET(win), height, width); gtk_window_set_title (GTK_WINDOW(win), @@ -395,28 +658,33 @@ modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to, return TRUE; } - +#endif static void -modest_ui_window_destroy (GtkWidget *win, gpointer data) +modest_ui_window_destroy (GtkWidget *win, GdkEvent *event, gpointer data) { ModestUIPrivate *priv; g_return_if_fail (data); - - priv = MODEST_UI_GET_PRIVATE((ModestUI*)data); + g_return_if_fail(MODEST_IS_UI(data)); + priv = MODEST_UI_GET_PRIVATE((ModestUI *)data); + g_return_if_fail(priv); if (!modest_window_mgr_unregister (priv->modest_window_mgr, G_OBJECT(win))) g_warning ("modest window mgr: failed to unregister %p", G_OBJECT(win)); + else + gtk_widget_hide(win); } static void modest_ui_last_window_closed (GObject *obj, gpointer data) { + /* FIXME: Other cleanups todo? Finalize Tinymail? */ gtk_main_quit (); } + void on_account_selector_selection_changed (GtkWidget *widget, gpointer user_data) @@ -439,9 +707,12 @@ on_account_selector_selection_changed (GtkWidget *widget, } g_message("Value: '%s'\n", account_name); + + free(account_name); } -void +#if 0 +static void on_account_settings1_activate (GtkMenuItem *menuitem, gpointer user_data) { @@ -456,6 +727,8 @@ on_account_settings1_activate (GtkMenuItem *menuitem, GtkWidget *account_selector; GtkCellRenderer *renderer; + + g_return_if_fail(MODEST_IS_UI(user_data)); priv = MODEST_UI_GET_PRIVATE(MODEST_UI(user_data)); glade_xml = glade_xml_new(MODEST_GLADE, "mailbox_setup_advanced", NULL); @@ -501,6 +774,8 @@ on_account_settings1_activate (GtkMenuItem *menuitem, g_object_unref(glade_xml); } +#endif + static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree, @@ -508,7 +783,10 @@ on_folder_clicked (ModestTnyFolderTreeView *folder_tree, gpointer data) { GtkWidget *win; + GtkWidget *button; + GtkWidget *paned; ModestTnyHeaderTreeView *tree_view; + ModestTnyMsgView *msg_view; ModestUIPrivate *priv; GtkWidget *scrollview; @@ -526,19 +804,42 @@ on_folder_clicked (ModestTnyFolderTreeView *folder_tree, modest_tny_header_tree_view_set_folder (tree_view, folder); -} + button = glade_xml_get_widget (priv->glade_xml, "toolb_reply"); + if (button) { + gtk_widget_set_sensitive(button, FALSE); + } + button = glade_xml_get_widget (priv->glade_xml, "toolb_forward"); + if (button) { + gtk_widget_set_sensitive(button, FALSE); + } -static void on_message_clicked (ModestTnyFolderTreeView *folder_tree, + button = glade_xml_get_widget (priv->glade_xml, "toolb_delete"); + if (button) { + gtk_widget_set_sensitive(button, FALSE); + } + + paned = glade_xml_get_widget (priv->glade_xml,"mail_paned"); + g_return_if_fail (paned); + + msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned))); + g_return_if_fail (msg_view); + + modest_tny_msg_view_set_message (msg_view, NULL); +} + + +static void +on_message_clicked (ModestTnyFolderTreeView *folder_tree, TnyMsgIface *message, gpointer data) { GtkWidget *paned; + GtkWidget *button; ModestTnyMsgView *msg_view; ModestUIPrivate *priv; - g_return_if_fail (message); g_return_if_fail (data); priv = MODEST_UI_GET_PRIVATE(data); @@ -547,8 +848,21 @@ static void on_message_clicked (ModestTnyFolderTreeView *folder_tree, modest_tny_msg_view_set_message (msg_view, message); + button = glade_xml_get_widget (priv->glade_xml, "toolb_reply"); + if (button) { + gtk_widget_set_sensitive(button, TRUE); + } + button = glade_xml_get_widget (priv->glade_xml, "toolb_forward"); + if (button) { + gtk_widget_set_sensitive(button, TRUE); + } + button = glade_xml_get_widget (priv->glade_xml, "toolb_delete"); + if (button) { + gtk_widget_set_sensitive(button, TRUE); + } } + static void on_password_requested (ModestTnyAccountStore *account_store, const gchar *account_name, gpointer user_data) @@ -601,16 +915,25 @@ on_password_requested (ModestTnyAccountStore *account_store, } - - - - static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder) { + int i; + GSList *columns = NULL; GtkWidget *header_tree; + ModestTnyHeaderTreeViewColumn cols[] = { + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_COMPACT_HEADER + }; + + for (i = 0 ; i != sizeof(cols)/sizeof(ModestTnyHeaderTreeViewColumn); ++i) + columns = g_slist_append (columns, GINT_TO_POINTER(cols[i])); + + header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns, + MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL)); + g_slist_free (columns); - header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder)); if (!header_tree) { g_warning ("could not create header tree"); return NULL; @@ -620,13 +943,10 @@ modest_main_window_header_tree (TnyMsgFolderIface *folder) } - 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)); @@ -635,262 +955,148 @@ modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr, 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); + return folder_tree; +} +static void on_editor_entry_changed(GtkEditable *editable, + gpointer user_data) +{ + GtkWidget *edit_win; + EditWinData *windata; - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(folder_tree), TRUE); - gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(folder_tree), TRUE); + edit_win = (GtkWidget *)user_data; + windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win)); - return folder_tree; + modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), TRUE); } +static void on_editor_buffer_changed (GtkTextBuffer *textbuffer, + gpointer user_data) +{ + GtkWidget *edit_win; + EditWinData *windata; + + edit_win = (GtkWidget *)user_data; + windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win)); + + modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), TRUE); +} static void on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui) { + GtkWidget *edit_win; + GladeXML *glade_xml; + GtkWidget *btn, *w; + GtkTextBuffer *buf; + EditWinData *windata; + ModestUIPrivate *priv; + gint height, width; + g_return_if_fail (modest_ui); - modest_ui_show_edit_window (modest_ui, "", "", "", "", "", NULL); -} - - -static GString * -get_next_line(GtkTextBuffer *b, GtkTextIter *iter) -{ - GtkTextIter iter2; - gchar *tmp; - gint debi; - - debi = gtk_text_iter_get_line(iter); - gtk_text_buffer_get_iter_at_line_offset(b, - &iter2, - gtk_text_iter_get_line(iter), - gtk_text_iter_get_chars_in_line(iter) -1 - ); - tmp = gtk_text_buffer_get_text(b, &iter2, iter, FALSE); - gtk_text_iter_forward_line(iter); - return g_string_new(tmp); -} - -static int -get_indent_level(const char *l) -{ - int indent = 0; - while (l[0]) { - if (l[0] == '>') { - indent++; - if (l[1] == ' ') { - l++; - } - } else { - break; - } - l++; - - } - return indent; -} + //modest_ui_new_edit_window (modest_ui, "", "", "", "", "", NULL); -static void -unquote_line(GString *l) { - GString *r; - gchar *p; - - p = l->str; - while (p[0]) { - if (p[0] == '>') { - if (p[1] == ' ') { - p++; - } - } else { - break; - } - p++; - } - g_string_erase (l, 0, p - l->str); + edit_win = modest_editor_window_new(modest_ui); + windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win)); + g_return_if_fail(windata); + + windata->edit_win = MODEST_EDITOR_WINDOW(edit_win); + glade_xml = windata->glade_xml; + btn = glade_xml_get_widget (glade_xml, "toolb_send"); + g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked), + edit_win); + + w = glade_xml_get_widget (glade_xml, "to_entry"); + g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win); + w = glade_xml_get_widget (glade_xml, "subject_entry"); + g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win); + w = glade_xml_get_widget (glade_xml, "body_view"); + buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w)); + g_signal_connect(buf, "changed", G_CALLBACK(on_editor_buffer_changed), edit_win); + + g_signal_connect (edit_win, "destroy-event", G_CALLBACK(close_edit_window), + edit_win); + g_signal_connect (edit_win, "delete-event", G_CALLBACK(close_edit_window), + edit_win); + + priv = MODEST_UI_GET_PRIVATE(windata->modest_ui); + height = modest_conf_get_int (priv->modest_conf, + MODEST_CONF_EDIT_WINDOW_HEIGHT, NULL); + width = modest_conf_get_int (priv->modest_conf, + MODEST_CONF_EDIT_WINDOW_WIDTH, NULL); + + // g_message("new editor win@%dx%d", width, height); + + gtk_widget_set_usize (GTK_WIDGET(edit_win), width, height); + gtk_window_set_title (GTK_WINDOW(edit_win), _("Untitled")); + modest_window_mgr_register(priv->modest_window_mgr, G_OBJECT(edit_win), MODEST_EDIT_WINDOW, 0); + gtk_widget_show(edit_win); } + static void -append_quoted(GString *buf, const int indent, const GString *str, const int cutpoint) { - int i; - - for (i=0; i<=indent; i++) { - g_string_append(buf, "> "); - } - if (cutpoint > 0) { - g_string_append_len(buf, str->str, cutpoint); - } else { - g_string_append(buf, str->str); - } - g_string_append(buf, "\n"); -} - -static gint -get_breakpoint(const gchar *s, const gint indent, const gint limit) { - gint i, last; - - last = strlen(s); - if (last + 2 * indent < limit) - return last; - - i = strlen(s); - for ( ; i>0; i--) { - if (s[i] == ' ') { - if (i + 2 * indent <= limit) { - return i; - } else { - last = i; - } - } - } - return last; -} - -static gchar * -modest_ui_quote_msg(const TnyMsgIface *src, const gchar *from, time_t sent_date) +new_editor_with_presets (ModestUI *modest_ui, const gchar *to_header, + const gchar *cc_header, const gchar *bcc_header, + const gchar *subject_header, const gchar *body) { - GList *parts; - TnyMsgMimePartIface *part; - TnyStreamIface* stream; - TnyTextBufferStream *dest; - TnyMsgMimePartIface *body = NULL; + GtkWidget *edit_win; + GladeXML *glade_xml; + GtkWidget *btn, *w; GtkTextBuffer *buf; - GtkTextIter begin, end, iter1, iter2, iter3; - gchar *txt; - gint tmp; - gint limit = 76; - gint indent, breakpoint; - gint rem_indent; - gchar sent_str[101]; - GString *q, *l, *remaining; - - - 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? - * 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 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)); - q = g_string_new(""); - g_string_printf(q, "On %s, %s wrote:\n", sent_str, from); - - remaining = g_string_new(""); - gtk_text_buffer_get_iter_at_line(buf, &iter1, 0); - do { - l = get_next_line(buf, &iter1); - indent = get_indent_level(l->str); - unquote_line(l); - - if (remaining->len) { - if (l->len && indent == rem_indent) { - g_string_prepend(l, " "); - g_string_prepend(l, remaining->str); - } else { - do { - breakpoint = get_breakpoint(remaining->str, rem_indent, limit); - append_quoted(q, rem_indent, remaining, breakpoint); - g_string_erase(remaining, 0, breakpoint); - if (remaining->str[0] == ' ') { - g_string_erase(remaining, 0, 1); - } - } while (remaining->len); - } - } - g_string_free(remaining, TRUE); - breakpoint = get_breakpoint(l->str, indent, limit); - remaining = g_string_new(l->str + breakpoint); - if (remaining->str[0] == ' ') { - g_string_erase(remaining, 0, 1); - } - rem_indent = indent; - append_quoted(q, indent, l, breakpoint); - g_string_free(l, TRUE); - } while (!gtk_text_iter_is_end(&iter1)); - - g_object_unref(stream); - g_object_unref(buf); - return g_string_free(q, FALSE); -} + EditWinData *windata; + ModestUIPrivate *priv; + gint height, width; -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; - } + g_return_if_fail (modest_ui); - 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; - } + edit_win = modest_editor_window_new(modest_ui); + windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win)); + g_return_if_fail(windata); - modest_ui_show_edit_window (modest_ui, from, /* cc */ "", /* bcc */ "", re_sub->str, quoted, NULL); - g_free(quoted); - g_string_free(re_sub, TRUE); + glade_xml = windata->glade_xml; + btn = glade_xml_get_widget (glade_xml, "toolb_send"); + g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked), + edit_win); + + w = glade_xml_get_widget (glade_xml, "to_entry"); + g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win); + w = glade_xml_get_widget (glade_xml, "subject_entry"); + g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win); + w = glade_xml_get_widget (glade_xml, "body_view"); + buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w)); + g_signal_connect(buf, "changed", G_CALLBACK(on_editor_buffer_changed), edit_win); + + g_signal_connect (edit_win, "destroy-event", G_CALLBACK(close_edit_window), + edit_win); + g_signal_connect (edit_win, "delete-event", G_CALLBACK(close_edit_window), + edit_win); + + priv = MODEST_UI_GET_PRIVATE(windata->modest_ui); + height = modest_conf_get_int (priv->modest_conf, + MODEST_CONF_EDIT_WINDOW_HEIGHT, NULL); + width = modest_conf_get_int (priv->modest_conf, + MODEST_CONF_EDIT_WINDOW_WIDTH, NULL); + + // g_message("new editor win@%dx%d", width, height); + + gtk_widget_set_usize (GTK_WIDGET(edit_win), width, height); + gtk_window_set_title (GTK_WINDOW(edit_win), _("Untitled")); + modest_window_mgr_register(priv->modest_window_mgr, G_OBJECT(edit_win), MODEST_EDIT_WINDOW, 0); + + modest_editor_window_set_to_header(MODEST_EDITOR_WINDOW(edit_win), to_header); + modest_editor_window_set_cc_header(MODEST_EDITOR_WINDOW(edit_win), cc_header); + modest_editor_window_set_bcc_header(MODEST_EDITOR_WINDOW(edit_win), bcc_header); + modest_editor_window_set_subject_header(MODEST_EDITOR_WINDOW(edit_win), subject_header); + modest_editor_window_set_body(MODEST_EDITOR_WINDOW(edit_win), body); + + modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), FALSE); + + gtk_widget_show(edit_win); } static void -on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) -{ +quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype) { GtkTreeSelection *sel; GtkWidget *paned; GtkTreeModel *model; @@ -903,6 +1109,14 @@ on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) ModestTnyMsgView *msg_view; ModestUIPrivate *priv; + const TnyMsgIface *msg; + const TnyMsgFolderIface *folder; + GString *re_sub; + const gchar *subject, *from; + gchar *unquoted, *quoted; + time_t sent_date; + gint line_limit = 76; + g_return_if_fail (modest_ui); priv = MODEST_UI_GET_PRIVATE(modest_ui); @@ -923,7 +1137,6 @@ on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) 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; } @@ -932,33 +1145,93 @@ on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); - modest_ui_reply_to_msg (modest_ui, header, msg_view); + 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; + } + + 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); + /* 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); + + switch (qstype) { + case QUOTED_SEND_REPLY: + g_string_prepend(re_sub, _("Re: ")); + new_editor_with_presets(modest_ui, from, /* cc */ "", /* bcc */ "", re_sub->str, quoted); + break; + case QUOTED_SEND_FORWARD: + g_string_prepend(re_sub, _("Fwd: ")); + new_editor_with_presets(modest_ui, /* from */ "", /* cc */ "", /* bcc */ "", re_sub->str, quoted); + break; + default: + break; + } + g_free(quoted); + g_free(unquoted); + g_string_free(re_sub, TRUE); } -/* FIXME: truly evil --> we cannot really assume that - * there is only one edit window open... - */ static void -on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui) +on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) +{ + quoted_send_msg (modest_ui, QUOTED_SEND_REPLY); +} + + +static void +on_forward_clicked (GtkWidget *widget, ModestUI *modest_ui) +{ + quoted_send_msg (modest_ui, QUOTED_SEND_FORWARD); +} + + +static void +on_send_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin) { ModestTnyTransportActions *actions; + ModestUI *modest_ui; 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; + /* TnyAccountStoreIface *account_store; const GList *transport_accounts; TnyTransportAccountIface *transport_account; + ModestConf *conf; */ + ModestIdentityMgr *id_mgr; + EditWinData *win_data; + + + win_data = modest_editor_window_get_data(modest_editwin); + modest_ui = win_data->modest_ui; g_return_if_fail (modest_ui); actions = MODEST_TNY_TRANSPORT_ACTIONS (modest_tny_transport_actions_new ()); - priv = MODEST_UI_GET_PRIVATE(modest_ui); + priv = MODEST_UI_GET_PRIVATE(modest_ui); +#if 0 account_store = priv->account_store; transport_accounts = tny_account_store_iface_get_transport_accounts (account_store); @@ -968,10 +1241,10 @@ on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui) } else /* take the first one! */ transport_account = TNY_TRANSPORT_ACCOUNT_IFACE(transport_accounts->data); - - 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"); +#endif + to_entry = glade_xml_get_widget (win_data->glade_xml, "to_entry"); + subject_entry = glade_xml_get_widget (win_data->glade_xml, "subject_entry"); + body_view = glade_xml_get_widget (win_data->glade_xml, "body_view"); to = gtk_entry_get_text (GTK_ENTRY(to_entry)); subject = gtk_entry_get_text (GTK_ENTRY(subject_entry)); @@ -980,18 +1253,119 @@ 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); g_object_unref (G_OBJECT(actions)); - gtk_entry_set_text (GTK_ENTRY(to_entry), ""); - gtk_entry_set_text (GTK_ENTRY(subject_entry), ""); - gtk_text_buffer_set_text (buf, "", 0); + gtk_widget_hide (GTK_WIDGET(modest_editwin)); + modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(modest_editwin)); + if (GTK_IS_WIDGET(modest_editwin)) { + gtk_widget_destroy(GTK_WIDGET(modest_editwin)); + } else + g_warning("editor window has vanished!"); +} + + +static void +on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui) +{ + GtkTreeSelection *sel; + GtkWidget *paned; + GtkTreeModel *model; + GtkTreeIter iter; + GtkScrolledWindow *scroll; + GtkTreeModel *mymodel; + + 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); + + /* get all selected mails */ + if (G_LIKELY (gtk_tree_selection_get_selected (sel, &model, &iter))) + { + TnyMsgHeaderIface *header; + + gtk_tree_model_get (model, &iter, TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN, + &header, -1); + + if (G_LIKELY (header)) + { + TnyMsgFolderIface *folder; + // const TnyMsgIface *msg; + + if (GTK_IS_TREE_MODEL_SORT (model)) + { + mymodel = gtk_tree_model_sort_get_model + (GTK_TREE_MODEL_SORT (model)); + } else + mymodel = model; + + folder = (TnyMsgFolderIface*)tny_msg_header_iface_get_folder (header); + + /* this will make the message as deleted */ + /* tny_msg_folder_iface_expunge (folder); will finally delete messages */ + if (TNY_IS_MSG_FOLDER (folder)) + tny_msg_folder_iface_remove_message (folder, header); + gtk_widget_queue_draw (GTK_WIDGET (header_view)); + } + } +} + +static void +on_sendreceive_button_clicked (GtkWidget *widget, ModestUI *modest_ui) +{ + ModestUIPrivate *priv; + ModestTnyStoreActions *store_actions; + TnyAccountStoreIface *account_store; + const GList *store_accounts; + const GList *iter; + + g_return_if_fail (modest_ui); + + store_actions = MODEST_TNY_STORE_ACTIONS (modest_tny_store_actions_new ()); + priv = MODEST_UI_GET_PRIVATE(modest_ui); + + account_store = priv->account_store; + store_accounts = + tny_account_store_iface_get_store_accounts (account_store); + + for (iter = store_accounts; iter; iter = iter->next) + modest_tny_store_actions_update_folders (store_actions, + TNY_STORE_ACCOUNT_IFACE (iter->data)); + + /* TODO, lock, refresh display */ + + g_object_unref (store_actions); - gtk_widget_hide (glade_xml_get_widget (priv->glade_xml, "new_mail")); }