X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=b7d12f977dbae6f55be58fecc171e3cae6cd4b22;hp=0870c32602d076c67ca8e729e6fb7d9d2e279cf7;hb=95450fa69acf453d0ffdeabae6d6a67aeabac235;hpb=6719e06f03219d5ed65ebd96873f893b517cc62e diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 0870c32..b7d12f9 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -46,10 +47,12 @@ #include #include #include -#include +#include #include "modest-account-mgr-helpers.h" #include "modest-mail-operation.h" +#include "modest-text-utils.h" +#include /* For ConIcIap */ #ifdef MODEST_HAVE_EASYSETUP #include "easysetup/modest-easysetup-wizard.h" @@ -61,7 +64,6 @@ #include #include - typedef struct _GetMsgAsyncHelper { ModestWindow *window; TnyIterator *iter; @@ -87,8 +89,7 @@ static void read_msg_func (gpointer data, gpointer user_data); static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data); static void reply_forward (ReplyForwardAction action, ModestWindow *win); -static void modest_ui_actions_message_details_cb (gpointer msg_data, - gpointer helper_data); + static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title); @@ -109,7 +110,7 @@ modest_ui_actions_on_about (GtkAction *action, ModestWindow *win) gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about), _("a modest e-mail client\n\n" "design and implementation: Dirk-Jan C. Binnema\n" - "contributions from the fine people at KernelConcepts and Igalia\n" + "contributions from the fine people at KC and Ig\n" "uses the tinymail email framework written by Philip van Hoof")); gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors); gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org"); @@ -189,16 +190,13 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) if (MODEST_IS_MSG_VIEW_WINDOW (win)) { gtk_widget_destroy (GTK_WIDGET(win)); - } + } } void modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win) { - /* FIXME: save size of main window */ -/* save_sizes (main_window); */ -/* gtk_widget_destroy (GTK_WIDGET (win)); */ gtk_main_quit (); } @@ -230,25 +228,23 @@ modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win) void modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win) { - GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr()); - - //gboolean accounts_exist = account_names != NULL; - g_slist_free (account_names); /* This is currently only implemented for Maemo, * because it requires a providers preset file which is not publically available. */ #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */ - /* To test, while modest_account_mgr_account_names() is broken: accounts_exist = TRUE; */ + GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr()); + gboolean accounts_exist = account_names != NULL; + g_slist_free (account_names); + +/* To test, while modest_account_mgr_account_names() is broken: accounts_exist = TRUE; */ if (!accounts_exist) { /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */ ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new (); gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win)); gtk_dialog_run (GTK_DIALOG (wizard)); gtk_widget_destroy (GTK_WIDGET (wizard)); - } - else - { + } else { /* Show the list of accounts: */ GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ()); gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win)); @@ -256,29 +252,29 @@ modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win) gtk_widget_destroy (GTK_WIDGET(account_win)); } #else - GtkWidget *dialog, *label; - - /* Create the widgets */ - - dialog = gtk_dialog_new_with_buttons ("Message", - GTK_WINDOW(win), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_OK, - GTK_RESPONSE_NONE, - NULL); - label = gtk_label_new ("Hello World!"); - - /* Ensure that the dialog box is destroyed when the user responds. */ - - g_signal_connect_swapped (dialog, "response", - G_CALLBACK (gtk_widget_destroy), - dialog); - - /* Add the label, and show everything we've added to the dialog. */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), - label); - gtk_widget_show_all (dialog); + GtkWidget *dialog, *label; + + /* Create the widgets */ + + dialog = gtk_dialog_new_with_buttons ("Message", + GTK_WINDOW(win), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, + GTK_RESPONSE_NONE, + NULL); + label = gtk_label_new ("Hello World!"); + + /* Ensure that the dialog box is destroyed when the user responds. */ + + g_signal_connect_swapped (dialog, "response", + G_CALLBACK (gtk_widget_destroy), + dialog); + + /* Add the label, and show everything we've added to the dialog. */ + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), + label); + gtk_widget_show_all (dialog); #endif /* MODEST_PLATFORM_MAEMO */ } @@ -291,12 +287,16 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) gchar *account_name = NULL; gchar *from_str = NULL; GError *err = NULL; - TnyAccount *account; + TnyAccount *account = NULL; ModestWindowMgr *mgr; account_name = g_strdup(modest_window_get_active_account (win)); if (!account_name) account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); + if (!account_name) { + g_printerr ("modest: no account found\n"); + goto cleanup; + } account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), account_name, @@ -307,8 +307,12 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) } from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name); + if (!from_str) { + g_printerr ("modest: failed get from string for '%s'\n", account_name); + goto cleanup; + } - msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL); + msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL); if (!msg) { g_printerr ("modest: failed to create new msg\n"); goto cleanup; @@ -504,7 +508,7 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) folder = tny_header_get_folder (header); if (folder) { /* The callback will call it per each header */ - tny_folder_get_msg_async (folder, header, get_msg_cb, helper); + tny_folder_get_msg_async (folder, header, get_msg_cb, NULL, helper); g_object_unref (G_OBJECT (folder)); } else g_printerr ("modest: no folder for header\n"); @@ -580,6 +584,19 @@ modest_ui_actions_on_prev (GtkAction *action, } } +void +modest_ui_actions_on_sort (GtkAction *action, + ModestWindow *window) +{ + ModestWindowMgr *mgr; + + g_return_if_fail (MODEST_IS_WINDOW(window)); + + /* Show sorting dialog */ + mgr = modest_runtime_get_window_mgr (); + +} + static gboolean action_send (const gchar* account_name) @@ -589,14 +606,17 @@ action_send (const gchar* account_name) g_return_val_if_fail (account_name, FALSE); + /* Get the transport account according to the open connection, + * because the account might specify connection-specific SMTP servers. + */ tny_account = - modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), - account_name, - TNY_ACCOUNT_TYPE_TRANSPORT); + modest_tny_account_store_get_transport_account_for_open_connection (modest_runtime_get_account_store(), + account_name); if (!tny_account) { g_printerr ("modest: cannot get tny transport account for %s\n", account_name); return FALSE; } + send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account)); if (!send_queue) { g_object_unref (G_OBJECT(tny_account)); @@ -631,41 +651,80 @@ action_receive (const gchar* account_name) } /* Create the mail operation */ + /* TODO: The spec wants us to first do any pending deletions, before receiving. */ mail_op = modest_mail_operation_new (); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account)); + g_object_unref (G_OBJECT(tny_account)); g_object_unref (G_OBJECT (mail_op)); return TRUE; } +/** Check that an appropriate connection is open. + */ +gboolean check_for_connection (const gchar *account_name) +{ + TnyDevice *device = modest_runtime_get_device (); +/* + g_assert (TNY_IS_MAEMO_CONIC_DEVICE (device)); + + TnyMaemoConicDevice *maemo_device = TNY_MAEMO_CONIC_DEVICE (device); +*/ + + if (tny_device_is_online (device)) + return TRUE; + else { + tny_maemo_conic_device_connect (TNY_MAEMO_CONIC_DEVICE (device), NULL); + + /* TODO: Wait until a result. */ + return TRUE; + } +} void modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) { gchar *account_name; + + g_message ("%s: online? %s", __FUNCTION__, + tny_device_is_online(modest_runtime_get_device()) ? "yes":"no"); + + /* As per the UI spec, only the active account should be affected, + * else the default folder if there is no active account: */ account_name = g_strdup(modest_window_get_active_account(MODEST_WINDOW(win))); if (!account_name) account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); if (!account_name) { - g_printerr ("modest: cannot get account\n"); + g_printerr ("modest: cannot get default account\n"); return; } + + /* Do not continue if no suitable connection is open: */ + if (!check_for_connection (account_name)) + return; - if (!action_send(account_name)) - g_printerr ("modest: failed to send\n"); + /* As per the UI spec, + * for POP accounts, we should receive, + * for IMAP we should synchronize everything, including receiving, + * for SMTP we should send, + * first receiving, then sending: + */ if (!action_receive(account_name)) g_printerr ("modest: failed to receive\n"); + if (!action_send(account_name)) + g_printerr ("modest: failed to send\n"); + } void -modest_ui_actions_toggle_view (GtkAction *action, ModestMainWindow *main_window) +modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window) { ModestConf *conf; GtkWidget *header_view; @@ -766,35 +825,43 @@ get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data) TnyHeader *header; header = TNY_HEADER (tny_iterator_get_current (helper->iter)); tny_folder_get_msg_async (folder, header, - get_msg_cb, helper); + get_msg_cb, NULL, helper); g_object_unref (G_OBJECT(header)); } } void -modest_ui_actions_on_header_selected (ModestHeaderView *folder_view, +modest_ui_actions_on_header_selected (ModestHeaderView *header_view, TnyHeader *header, ModestMainWindow *main_window) { - GtkWidget *msg_preview; TnyFolder *folder; GetMsgAsyncHelper *helper; TnyList *list; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); - - msg_preview = modest_main_window_get_child_widget(main_window, - MODEST_WIDGET_TYPE_MSG_PREVIEW); - if (!msg_preview) - return; - + /* when there's no header, clear the msgview */ if (!header) { - modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL); + GtkWidget *msg_preview; + + /* Clear msg preview if exists */ + msg_preview = modest_main_window_get_child_widget(main_window, + MODEST_WIDGET_TYPE_MSG_PREVIEW); + + if (msg_preview) + modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL); return; } - folder = tny_header_get_folder (TNY_HEADER(header)); + /* Update Main window title */ + if (GTK_WIDGET_HAS_FOCUS (header_view)) { + const gchar *subject = tny_header_get_subject (header); + if (subject && strcmp (subject, "")) + gtk_window_set_title (GTK_WINDOW (main_window), subject); + else + gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject")); + } /* Create list */ list = tny_simple_list_new (); @@ -806,9 +873,11 @@ modest_ui_actions_on_header_selected (ModestHeaderView *folder_view, helper->iter = tny_list_create_iterator (list); helper->func = read_msg_func; + folder = tny_header_get_folder (TNY_HEADER(header)); + tny_folder_get_msg_async (TNY_FOLDER(folder), header, get_msg_cb, - helper); + NULL, helper); /* Frees */ g_object_unref (G_OBJECT (folder)); @@ -820,13 +889,9 @@ void modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header, ModestMainWindow *main_window) { - ModestWindow *win; + ModestWindow *win = NULL; TnyFolder *folder = NULL; TnyMsg *msg = NULL; - gchar *account = NULL; - GtkTreeModel *model = NULL; - GtkTreeSelection *sel = NULL; - GtkTreeIter iter; ModestWindowMgr *mgr; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -837,7 +902,7 @@ modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader folder = tny_header_get_folder (header); if (!folder) { g_printerr ("modest: cannot get folder for header\n"); - goto cleanup; + return; } /* FIXME: make async?; check error */ @@ -847,41 +912,39 @@ modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader goto cleanup; } - account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window))); - if (!account) - account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); + /* Look if we already have a message view for that header */ + mgr = modest_runtime_get_window_mgr (); + win = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header)); + + /* If not, create a new window */ + if (!win) { + gchar *account; + + account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window))); + if (!account) + account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); - /* Create and register message view window */ - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view)); - if (gtk_tree_selection_get_selected (sel, &model, &iter)) { - win = modest_msg_view_window_new_with_header_model (msg, account, model, iter); - } else { win = modest_msg_view_window_new (msg, account); - } - mgr = modest_runtime_get_window_mgr (); - modest_window_mgr_register_window (mgr, win); + modest_window_mgr_register_window (mgr, win); - gtk_window_set_transient_for (GTK_WINDOW (win), - GTK_WINDOW (main_window)); + gtk_window_set_transient_for (GTK_WINDOW (win), + GTK_WINDOW (main_window)); + } gtk_widget_show_all (GTK_WIDGET(win)); + + g_object_unref (G_OBJECT (msg)); cleanup: - g_free (account); - - if (folder) - g_object_unref (G_OBJECT (folder)); - if (msg) - g_object_unref (G_OBJECT (msg)); + g_object_unref (G_OBJECT (folder)); } void modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, - TnyFolder *folder, + TnyFolderStore *folder_store, gboolean selected, ModestMainWindow *main_window) { - gchar *txt; ModestConf *conf; GtkWidget *header_view; @@ -894,32 +957,22 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, conf = modest_runtime_get_conf (); - if (!selected) { /* the folder was unselected; save it's settings */ - modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view"); - gtk_window_set_title (GTK_WINDOW(main_window), "Modest"); - modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL); - } else { /* the folder was selected */ - if (folder) { /* folder may be NULL */ - guint num, unread; - gchar *title; - - num = tny_folder_get_all_count (folder); - unread = tny_folder_get_unread_count (folder); - - title = g_strdup_printf ("Modest: %s", - tny_folder_get_name (folder)); - - gtk_window_set_title (GTK_WINDOW(main_window), title); - g_free (title); - - txt = g_strdup_printf (_("%d %s, %d unread"), - num, num==1 ? _("item") : _("items"), unread); - //gtk_label_set_label (GTK_LABEL(folder_info_label), txt); - g_free (txt); + if (TNY_IS_FOLDER (folder_store)) { + + modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); + + if (selected) { + modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), + TNY_FOLDER (folder_store)); + modest_widget_memory_restore (conf, G_OBJECT(header_view), + "header-view"); + } else { + modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view"); + modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL); } - modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), folder); - modest_widget_memory_restore (conf, G_OBJECT(header_view), - "header-view"); + } else if (TNY_IS_ACCOUNT (folder_store)) { + + modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS); } } @@ -964,7 +1017,7 @@ modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemTyp gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300); if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { -// tny_device_force_online (modest_runtime_get_device()); +// tny_maemo_conic_device_connect (TNY_MAEMO_CONIC_DEVICE (modest_runtime_get_device()); } } gtk_widget_destroy (dialog); @@ -1036,10 +1089,9 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) return; } transport_account = - TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account + TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection (modest_runtime_get_account_store(), - account_name, - TNY_ACCOUNT_TYPE_TRANSPORT)); + account_name)); if (!transport_account) { g_printerr ("modest: no transport account found for '%s'\n", account_name); g_free (account_name); @@ -1061,7 +1113,8 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) data->subject, data->plain_body, data->html_body, - data->attachments); + data->attachments, + data->priority_flags); /* Frees */ g_free (from); g_free (account_name); @@ -1242,7 +1295,7 @@ ask_for_folder_name (GtkWindow *parent_window, void modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window) { - TnyFolder *parent_folder; + TnyFolderStore *parent_folder; GtkWidget *folder_view; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -1255,27 +1308,46 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view)); if (parent_folder) { - gchar *folder_name; - - folder_name = ask_for_folder_name (GTK_WINDOW (main_window), - _("Please enter a name for the new folder")); - - if (folder_name != NULL && strlen (folder_name) > 0) { - TnyFolder *new_folder; - ModestMailOperation *mail_op; - - mail_op = modest_mail_operation_new (); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), - mail_op); - - new_folder = modest_mail_operation_create_folder (mail_op, - TNY_FOLDER_STORE (parent_folder), - (const gchar *) folder_name); - if (new_folder) - g_object_unref (new_folder); - g_object_unref (mail_op); + gboolean finished = FALSE; + gint result; + gchar *folder_name = NULL, *suggested_name = NULL; + + /* Run the new folder dialog */ + while (!finished) { + result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window), + parent_folder, + suggested_name, + &folder_name); + + if (result == GTK_RESPONSE_REJECT) { + finished = TRUE; + } else { + ModestMailOperation *mail_op = modest_mail_operation_new (); + TnyFolder *new_folder = NULL; + + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + + new_folder = modest_mail_operation_create_folder (mail_op, + parent_folder, + (const gchar *) folder_name); + if (new_folder) { + g_object_unref (new_folder); + finished = TRUE; + } +/* else { */ +/* /\* TODO: check error and follow proper actions *\/ */ +/* /\* suggested_name = X; *\/ */ +/* /\* Show error to the user *\/ */ +/* modest_platform_run_information_dialog (GTK_WINDOW (main_window), */ +/* MODEST_INFORMATION_CREATE_FOLDER); */ +/* } */ + g_object_unref (mail_op); + } g_free (folder_name); + folder_name = NULL; } + g_object_unref (parent_folder); } } @@ -1284,7 +1356,7 @@ void modest_ui_actions_on_rename_folder (GtkAction *action, ModestMainWindow *main_window) { - TnyFolder *folder; + TnyFolderStore *folder; GtkWidget *folder_view; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -1296,7 +1368,7 @@ modest_ui_actions_on_rename_folder (GtkAction *action, folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view)); - if (folder) { + if (folder && TNY_IS_FOLDER (folder)) { gchar *folder_name; folder_name = ask_for_folder_name (GTK_WINDOW (main_window), _("Please enter a new name for the folder")); @@ -1309,7 +1381,7 @@ modest_ui_actions_on_rename_folder (GtkAction *action, mail_op); modest_mail_operation_rename_folder (mail_op, - folder, + TNY_FOLDER (folder), (const gchar *) folder_name); g_object_unref (mail_op); @@ -1322,9 +1394,9 @@ modest_ui_actions_on_rename_folder (GtkAction *action, static void delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) { - TnyFolder *folder; - ModestMailOperation *mail_op; + TnyFolderStore *folder; GtkWidget *folder_view; + gint response; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -1334,13 +1406,27 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) return; folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); - - mail_op = modest_mail_operation_new (); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), - mail_op); - modest_mail_operation_remove_folder (mail_op, folder, move_to_trash); - g_object_unref (G_OBJECT (mail_op)); + /* Ask the user */ + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (main_window), + MODEST_CONFIRMATION_DELETE_FOLDER, + folder); + + if (response == GTK_RESPONSE_OK) { + ModestMailOperation *mail_op = modest_mail_operation_new (); + + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash); + + /* Show error if happened */ + if (modest_mail_operation_get_error (mail_op)) + modest_platform_run_information_dialog (GTK_WINDOW (main_window), + MODEST_INFORMATION_DELETE_FOLDER); + + g_object_unref (G_OBJECT (mail_op)); + } + g_object_unref (G_OBJECT (folder)); } @@ -1457,6 +1543,17 @@ modest_ui_actions_on_copy (GtkAction *action, } void +modest_ui_actions_on_undo (GtkAction *action, + ModestWindow *window) +{ + if (MODEST_IS_MSG_EDIT_WINDOW (window)) { + modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window)); + } else { + g_return_if_reached (); + } +} + +void modest_ui_actions_on_paste (GtkAction *action, ModestWindow *window) { @@ -1510,68 +1607,348 @@ modest_ui_actions_on_change_zoom (GtkRadioAction *action, } } +void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action, + GtkRadioAction *selected, + ModestWindow *window) +{ + TnyHeaderFlags flags; + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + + flags = gtk_radio_action_get_current_value (selected); + modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags); +} + +void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action, + GtkRadioAction *selected, + ModestWindow *window) +{ + gint file_format; + + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + + file_format = gtk_radio_action_get_current_value (selected); + modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format); +} + + +void +modest_ui_actions_on_zoom_plus (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + modest_window_zoom_plus (MODEST_WINDOW (window)); +} + +void +modest_ui_actions_on_zoom_minus (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + modest_window_zoom_minus (MODEST_WINDOW (window)); +} + void modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle, ModestWindow *window) { + ModestWindowMgr *mgr; + gboolean fullscreen, active; g_return_if_fail (MODEST_IS_WINDOW (window)); - if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle))) { - gtk_window_fullscreen (GTK_WINDOW (window)); - } else { - gtk_window_unfullscreen (GTK_WINDOW (window)); + mgr = modest_runtime_get_window_mgr (); + + active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0; + fullscreen = modest_window_mgr_get_fullscreen_mode (mgr); + + if (active != fullscreen) { + modest_window_mgr_set_fullscreen_mode (mgr, active); + gtk_window_present (GTK_WINDOW (window)); } } +void +modest_ui_actions_on_change_fullscreen (GtkAction *action, + ModestWindow *window) +{ + ModestWindowMgr *mgr; + gboolean fullscreen; + + g_return_if_fail (MODEST_IS_WINDOW (window)); + + mgr = modest_runtime_get_window_mgr (); + fullscreen = modest_window_mgr_get_fullscreen_mode (mgr); + modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen); + + gtk_window_present (GTK_WINDOW (window)); +} + +/* + * Show the header details in a ModestDetailsDialog widget + */ static void -modest_ui_actions_message_details_cb (gpointer msg_data, - gpointer helper_data) +show_header_details (TnyHeader *header, + GtkWindow *window) { GtkWidget *dialog; - TnyMsg *msg = (TnyMsg *) msg_data; - TnyHeader *header; - GetMsgAsyncHelper *helper = (GetMsgAsyncHelper *) helper_data; - - header = tny_msg_get_header (msg); - dialog = modest_msg_view_details_dialog_new (GTK_WINDOW (helper->window), header); - g_object_unref (header); + /* Create dialog */ + dialog = modest_details_dialog_new_with_header (window, header); + + /* Run dialog */ gtk_widget_show_all (dialog); + gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (dialog); +} + +/* + * Show the folder details in a ModestDetailsDialog widget + */ +static void +show_folder_details (TnyFolder *folder, + GtkWindow *window) +{ + GtkWidget *dialog; + + /* Create dialog */ + dialog = modest_details_dialog_new_with_folder (window, folder); + /* Run dialog */ + gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } + void -modest_ui_actions_on_message_details (GtkAction *action, - ModestWindow *win) +modest_ui_actions_on_details (GtkAction *action, + ModestWindow *win) { TnyList * headers_list; - GetMsgAsyncHelper *helper; - - headers_list = get_selected_headers (win); - if (!headers_list) - return; - - helper = g_slice_new0 (GetMsgAsyncHelper); - helper->window = win; - helper->func = modest_ui_actions_message_details_cb; - helper->iter = tny_list_create_iterator (headers_list); - helper->user_data = NULL; + TnyIterator *iter; + TnyHeader *header; if (MODEST_IS_MSG_VIEW_WINDOW (win)) { TnyMsg *msg; msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win)); - if (!msg) + if (!msg) { return; - else { - modest_ui_actions_message_details_cb (msg, helper); + } else { + headers_list = get_selected_headers (win); + if (!headers_list) + return; + + iter = tny_list_create_iterator (headers_list); + + header = TNY_HEADER (tny_iterator_get_current (iter)); + show_header_details (header, GTK_WINDOW (win)); + g_object_unref (header); + + g_object_unref (iter); + } + } else if (MODEST_IS_MAIN_WINDOW (win)) { + GtkWidget *folder_view, *header_view; + + /* Check which widget has the focus */ + folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), + MODEST_WIDGET_TYPE_FOLDER_VIEW); + if (gtk_widget_is_focus (folder_view)) { + TnyFolder *folder; + + folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); + + /* Show only when it's a folder */ + if (!folder || !TNY_IS_FOLDER (folder)) + return; + + show_folder_details (folder, GTK_WINDOW (win)); + + } else { + header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), + MODEST_WIDGET_TYPE_HEADER_VIEW); + if (!gtk_widget_is_focus (header_view)) + return; + + headers_list = get_selected_headers (win); + if (!headers_list) + return; + + iter = tny_list_create_iterator (headers_list); + while (!tny_iterator_is_done (iter)) { + + header = TNY_HEADER (tny_iterator_get_current (iter)); + show_header_details (header, GTK_WINDOW (win)); + g_object_unref (header); + + tny_iterator_next (iter); + } + g_object_unref (iter); } - } else { - /* here we should add an implementation to run the message details dialog - from the main window */ - g_return_if_reached (); } } + +void +modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle, + ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + + modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle)); +} + +void +modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle, + ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + + modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle)); +} + +void +modest_ui_actions_toggle_folders_view (GtkAction *action, + ModestMainWindow *main_window) +{ + ModestConf *conf; + + g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); + + conf = modest_runtime_get_conf (); + + if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT) + modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE); + else + modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT); +} + +void +modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle, + ModestWindow *window) +{ + gboolean active, fullscreen = FALSE; + ModestWindowMgr *mgr; + + active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)); + + /* Check if we want to toggle the toolbar vuew in fullscreen + or normal mode */ + if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)), + "ViewShowToolbarFullScreen")) { + fullscreen = TRUE; + } + + /* Toggle toolbar */ + mgr = modest_runtime_get_window_mgr (); + modest_window_mgr_show_toolbars (mgr, active, fullscreen); +} + +void +modest_ui_actions_msg_edit_on_select_font (GtkAction *action, + ModestMsgEditWindow *window) +{ + modest_msg_edit_window_select_font (window); +} + +void +modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view, + const gchar *display_name, + GtkWindow *window) +{ + /* Do not change the application name if the widget has not + the focus. This callback could be called even if the folder + view has not the focus, because the handled signal could be + emitted when the folder view is redrawn */ + if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) { + if (display_name) + gtk_window_set_title (window, display_name); + else + gtk_window_set_title (window, " "); + } +} + +void +modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + modest_msg_edit_window_select_contacts (window); +} + + +void +modest_ui_actions_on_move_to (GtkAction *action, + ModestWindow *win) +{ + GtkWidget *dialog, *scroll, *folder_view, *tree_view; + gint result; + + g_return_if_fail (MODEST_IS_MAIN_WINDOW (win)); + + dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"), + GTK_WINDOW (win), + GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + NULL); + + /* Create scrolled window */ + scroll = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + /* Create folder view */ + folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), + MODEST_WIDGET_TYPE_FOLDER_VIEW); + tree_view = modest_folder_view_new (NULL); + gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), + gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view))); + + gtk_container_add (GTK_CONTAINER (scroll), tree_view); + + /* Add scroll to dialog */ + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), + scroll, FALSE, FALSE, 0); + + gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); + + result = gtk_dialog_run (GTK_DIALOG(dialog)); + if (result == GTK_RESPONSE_ACCEPT) { + TnyFolderStore *folder_store; + folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view)); + if (TNY_IS_ACCOUNT (folder_store)) { + } else { + ModestMailOperation *mail_op; + + /* Create mail operation */ + mail_op = modest_mail_operation_new (); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + + /* Get folder or messages to transfer */ + if (gtk_widget_is_focus (folder_view)) { + TnyFolderStore *src_folder; + src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); + + if (TNY_IS_FOLDER (src_folder)) + modest_mail_operation_xfer_folder (mail_op, + TNY_FOLDER (src_folder), + folder_store, + TRUE); + + /* Frees */ + g_object_unref (G_OBJECT (src_folder)); + } else { + } + g_object_unref (G_OBJECT (mail_op)); + } + g_object_unref (folder_store); + } + + gtk_widget_destroy (dialog); +}