X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fgtk-glade%2Fmodest-ui.c;h=3e7f9e4d3d884c0f019a320ee5513247bebbd3d5;hb=8852855998585a12d217705e0034312fe3de5d06;hp=80a6ac50d54ebaacf193dc9bb1084678a7e727c6;hpb=5ffd188b635c907be9a5978d3b88bc531e80c59d;p=modest diff --git a/src/gtk-glade/modest-ui.c b/src/gtk-glade/modest-ui.c index 80a6ac5..3e7f9e4 100644 --- a/src/gtk-glade/modest-ui.c +++ b/src/gtk-glade/modest-ui.c @@ -18,6 +18,7 @@ #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" @@ -25,31 +26,30 @@ #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); @@ -64,14 +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); -static void reply_to_msg (ModestUI *modest_ui, TnyMsgHeaderIface *header, - ModestTnyMsgView *msg_view); +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 { @@ -80,24 +101,6 @@ enum { LAST_SIGNAL }; - -typedef struct _ModestUIPrivate ModestUIPrivate; -struct _ModestUIPrivate { - - ModestConf *modest_conf; - ModestAccountMgr *modest_acc_mgr; - ModestIdentityMgr *modest_id_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; @@ -127,6 +130,7 @@ modest_ui_get_type (void) return my_type; } + static void modest_ui_class_init (ModestUIClass *klass) { @@ -146,6 +150,7 @@ modest_ui_class_init (ModestUIClass *klass) /* etc. */ } + static void modest_ui_init (ModestUI *obj) { @@ -159,6 +164,7 @@ modest_ui_init (ModestUI *obj) } + static void modest_ui_finalize (GObject *obj) { @@ -167,7 +173,7 @@ 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; @@ -181,6 +187,7 @@ modest_ui_finalize (GObject *obj) priv->modest_window_mgr = NULL; } + GObject* modest_ui_new (ModestConf *modest_conf) { @@ -202,7 +209,7 @@ 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) { @@ -220,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) { @@ -256,7 +263,8 @@ modest_ui_show_main_window (ModestUI *modest_ui) GtkWidget *folder_view, *header_view; GtkWidget *message_view; GtkWidget *account_settings_item; - GtkWidget *delete_item; + GtkWidget *new_account_item; + GtkWidget *delete_item; GtkWidget *folder_view_holder, *header_view_holder, @@ -296,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; @@ -306,18 +314,30 @@ 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 (account_settings_item, "activate", - G_CALLBACK(on_account_settings1_activate), - modest_ui); + 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) @@ -328,14 +348,16 @@ modest_ui_show_main_window (ModestUI *modest_ui) 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); @@ -359,28 +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) + 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, 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 -hide_edit_window (GtkWidget *win, gpointer data) +close_edit_window (GtkWidget *win, GdkEvent *event, gpointer data) { - gtk_widget_hide (win); + 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) @@ -403,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"); @@ -418,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), @@ -434,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) @@ -478,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) { @@ -495,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); @@ -540,6 +774,8 @@ on_account_settings1_activate (GtkMenuItem *menuitem, g_object_unref(glade_xml); } +#endif + static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree, @@ -547,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; @@ -565,15 +804,39 @@ 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; @@ -585,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) @@ -639,10 +915,6 @@ on_password_requested (ModestTnyAccountStore *account_store, } - - - - static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder) { @@ -654,14 +926,14 @@ modest_main_window_header_tree (TnyMsgFolderIface *folder) 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); - + if (!header_tree) { g_warning ("could not create header tree"); return NULL; @@ -671,7 +943,6 @@ modest_main_window_header_tree (TnyMsgFolderIface *folder) } - static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr, TnyAccountStoreIface *account_store) @@ -683,64 +954,149 @@ modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr, g_warning ("could not create folder list"); return NULL; } - + return folder_tree; } +static void on_editor_entry_changed(GtkEditable *editable, + 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_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); + //modest_ui_new_edit_window (modest_ui, "", "", "", "", "", NULL); + + 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 -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 *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; - } +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) +{ + GtkWidget *edit_win; + GladeXML *glade_xml; + GtkWidget *btn, *w; + GtkTextBuffer *buf; + EditWinData *windata; + ModestUIPrivate *priv; + gint height, width; - 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); + g_return_if_fail (modest_ui); + + 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); + + 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; @@ -753,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); @@ -773,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; } @@ -782,35 +1145,93 @@ on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui) TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); - 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, *email_from; gchar *body; GtkTextIter start, end; GtkTextBuffer *buf; - TnyAccountStoreIface *account_store; + /* TnyAccountStoreIface *account_store; const GList *transport_accounts; TnyTransportAccountIface *transport_account; - ModestConf *conf; + 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); @@ -820,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)); @@ -836,21 +1257,24 @@ on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui) 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, 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 (glade_xml_get_widget (priv->glade_xml, "new_mail")); + 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!"); } @@ -862,7 +1286,7 @@ on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui) GtkTreeModel *model; GtkTreeIter iter; GtkScrolledWindow *scroll; - GtkTreeModel *mymodel, *sortable; + GtkTreeModel *mymodel; ModestTnyHeaderTreeView *header_view; ModestTnyMsgView *msg_view; @@ -892,19 +1316,19 @@ on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui) { TnyMsgHeaderIface *header; - gtk_tree_model_get (model, &iter, TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN, + gtk_tree_model_get (model, &iter, TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); if (G_LIKELY (header)) { TnyMsgFolderIface *folder; - const TnyMsgIface *msg; + // const TnyMsgIface *msg; if (GTK_IS_TREE_MODEL_SORT (model)) { - mymodel = gtk_tree_model_sort_get_model + mymodel = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model)); - } else + } else mymodel = model; folder = (TnyMsgFolderIface*)tny_msg_header_iface_get_folder (header); @@ -917,3 +1341,31 @@ on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui) } } } + +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); + +}