X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=b640bde35bb5349deaf4ca6de6051920f49ffa46;hp=5dd4f0b8d297a7b1241fbac3eb439241a5cc00ed;hb=dc8f7048af4418298076c46916cd993597e292b8;hpb=579bf8bd3369925845202dac8c42fcec0fd98695 diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 5dd4f0b..b640bde 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -55,6 +55,7 @@ #include #include #include +#include "widgets/modest-folder-view.h" #include "widgets/modest-global-settings-dialog.h" #include "modest-connection-specific-smtp-window.h" #include "modest-account-mgr-helpers.h" @@ -72,6 +73,8 @@ #include #include +#include + typedef struct _GetMsgAsyncHelper { ModestWindow *window; ModestMailOperation *mail_op; @@ -127,6 +130,20 @@ static void _on_send_receive_progress_changed (ModestMailOperation *mail_op +static void +run_account_setup_wizard (ModestWindow *win) +{ + ModestEasysetupWizardDialog *wizard; + + g_return_if_fail (MODEST_IS_WINDOW(win)); + + 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)); +} + + void modest_ui_actions_on_about (GtkAction *action, ModestWindow *win) { @@ -365,19 +382,11 @@ modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win) void modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win) { - /* This is currently only implemented for Maemo, - * because it requires a providers preset file which is not publically available. - */ + /* This is currently only implemented for Maemo */ #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */ - gboolean accounts_exist = modest_account_mgr_has_accounts( - modest_runtime_get_account_mgr(), 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)); + if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) { + run_account_setup_wizard (win); + return; } else { /* Show the list of accounts: */ GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ()); @@ -424,6 +433,8 @@ on_smtp_servers_window_hide (GtkWindow* window, gpointer user_data) gtk_widget_destroy (GTK_WIDGET (window)); } + + void modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win) { @@ -474,6 +485,12 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) TnyAccount *account = NULL; ModestWindowMgr *mgr; gchar *signature = NULL, *blank_and_signature = NULL; + + /* if there are no accounts yet, just show the wizard */ + if (!modest_account_mgr_has_accounts (modest_runtime_get_account_mgr(), TRUE)) { + run_account_setup_wizard (win); + return; + } account_name = g_strdup(modest_window_get_active_account (win)); if (!account_name) @@ -519,13 +536,6 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) goto cleanup; } -/* tny_folder_add_msg (folder, msg, &err); */ -/* if (err) { */ -/* g_printerr ("modest: error adding msg to Drafts folder: %s", */ -/* err->message); */ -/* g_error_free (err); */ -/* goto cleanup; */ -/* } */ /* Create and register edit window */ /* This is destroyed by TOOD. */ @@ -585,6 +595,11 @@ open_msg_cb (ModestMailOperation *mail_op, /* If the header is in the drafts folder then open the editor, else the message view window */ if (folder_type == TNY_FOLDER_TYPE_DRAFTS) { + /* we cannot edit without a valid account... */ + if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) { + run_account_setup_wizard(parent_win); + goto cleanup; + } win = modest_msg_edit_window_new (msg, account); } else { gchar *uid = modest_tny_folder_get_header_unique_id (header); @@ -631,6 +646,7 @@ open_msg_cb (ModestMailOperation *mail_op, gtk_widget_show_all (GTK_WIDGET(win)); } +cleanup: /* Free */ g_free(account); g_object_unref (msg); @@ -668,29 +684,30 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win) ModestWindowMgr *mgr; TnyIterator *iter; ModestMailOperation *mail_op; + TnyList *not_opened_headers; /* Look if we already have a message view for each header. If true, then remove the header from the list of headers to open */ mgr = modest_runtime_get_window_mgr (); iter = tny_list_create_iterator (headers); + not_opened_headers = tny_simple_list_new (); while (!tny_iterator_is_done (iter)) { ModestWindow *window; TnyHeader *header; header = TNY_HEADER (tny_iterator_get_current (iter)); window = modest_window_mgr_find_window_by_header (mgr, header); - if (window) { - /* Do not open again the message and present - the window to the user */ - tny_list_remove (headers, G_OBJECT (header)); + /* Do not open again the message and present the + window to the user */ + if (window) gtk_window_present (GTK_WINDOW (window)); - } + else + tny_list_append (not_opened_headers, G_OBJECT (header)); g_object_unref (header); tny_iterator_next (iter); } - /* Open each message */ mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, @@ -699,13 +716,14 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win) NULL); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); modest_mail_operation_get_msgs_full (mail_op, - headers, + not_opened_headers, open_msg_cb, NULL, NULL); /* Clean */ + g_object_unref (not_opened_headers); g_object_unref (iter); - g_object_unref(mail_op); + g_object_unref (mail_op); } void @@ -886,6 +904,12 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) g_return_if_fail (MODEST_IS_WINDOW(win)); + /* we need an account when editing */ + if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) { + run_account_setup_wizard (win); + return; + } + header_list = get_selected_headers (win); if (!header_list) return; @@ -1215,8 +1239,9 @@ set_active_account_from_tny_account (TnyAccount *account, account store because that is the one that knows the name of the Modest account */ TnyAccount *modest_server_account = modest_server_account = - modest_tny_account_store_get_tny_account_by_id (modest_runtime_get_account_store (), - server_acc_name); + modest_tny_account_store_get_tny_account_by (modest_runtime_get_account_store (), + MODEST_TNY_ACCOUNT_STORE_QUERY_ID, + server_acc_name); const gchar *modest_acc_name = modest_tny_account_get_parent_modest_account_name_for_server_account (modest_server_account); @@ -1224,6 +1249,38 @@ set_active_account_from_tny_account (TnyAccount *account, g_object_unref (modest_server_account); } + +static void +folder_refreshed_cb (const GObject *obj, + TnyFolder *folder, + gpointer user_data) +{ + printf ("DEBUG: %s\n", __FUNCTION__); + ModestMainWindow *win = NULL; + GtkWidget *header_view; + + g_return_if_fail (TNY_IS_FOLDER (folder)); + + win = MODEST_MAIN_WINDOW (user_data); + header_view = + modest_main_window_get_child_widget(win, MODEST_WIDGET_TYPE_HEADER_VIEW); + + /* Check if folder is empty and set headers view contents style */ + if (tny_folder_get_all_count (folder) == 0) { + printf ("DEBUG: %s: tny_folder_get_all_count() returned 0.\n", __FUNCTION__); + modest_main_window_set_contents_style (win, + MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY); + } else { + printf ("DEBUG: %s: tny_folder_get_all_count() returned >0.\n", __FUNCTION__); + /* Restore configuration. There is no need to set the + contents style to headers because it was already + being done in folder_selection_changed */ + modest_widget_memory_restore (modest_runtime_get_conf (), + G_OBJECT(header_view), + MODEST_CONF_HEADER_VIEW_KEY); + } +} + void modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, TnyFolderStore *folder_store, @@ -1232,7 +1289,6 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, { ModestConf *conf; GtkWidget *header_view; - gboolean folder_empty = FALSE; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -1257,31 +1313,32 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, set_active_account_from_tny_account (account, MODEST_WINDOW (main_window)); g_object_unref (account); } - - /* Set folder on header view */ - modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), - TNY_FOLDER (folder_store)); + /* Set the header view, we could change it to + the empty view after the refresh */ + modest_main_window_set_contents_style (main_window, + MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); - /* Set main view style */ - folder_empty = tny_folder_get_all_count (TNY_FOLDER (folder_store)) == 0; - if (folder_empty) { - modest_main_window_set_contents_style (main_window, - MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY); - } - else { - modest_main_window_set_contents_style (main_window, - MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS); - modest_widget_memory_restore (conf, G_OBJECT(header_view), - MODEST_CONF_HEADER_VIEW_KEY); - } + modest_widget_memory_save (modest_runtime_get_conf(), + G_OBJECT(header_view), + MODEST_CONF_HEADER_VIEW_KEY); + + /* Set folder on header view. This function + will call tny_folder_refresh_async so we + pass a callback that will be called when + finished. We use that callback to set the + empty view if there are no messages */ + modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), + TNY_FOLDER (folder_store), + folder_refreshed_cb, + main_window); } else { /* Update the active account */ modest_window_set_active_account (MODEST_WINDOW (main_window), NULL); /* Do not show folder */ modest_widget_memory_save (conf, G_OBJECT (header_view), MODEST_CONF_HEADER_VIEW_KEY); - modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL); - } + modest_header_view_clear (MODEST_HEADER_VIEW(header_view)); + } } /* Update toolbar dimming state */ @@ -1329,7 +1386,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) { -// modest_platform_connect_and_wait ();; +// modest_platform_connect_and_wait (); } } gtk_widget_destroy (dialog); @@ -1814,7 +1871,7 @@ modest_ui_actions_on_rename_folder (GtkAction *action, modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); - modest_header_view_set_folder (MODEST_HEADER_VIEW (header_view), NULL); + modest_header_view_clear (MODEST_HEADER_VIEW (header_view)); modest_mail_operation_rename_folder (mail_op, TNY_FOLDER (folder), @@ -2190,6 +2247,8 @@ modest_ui_actions_on_select_all (GtkAction *action, /* Select all messages */ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view)); gtk_tree_selection_select_all (selection); + } else if (GTK_IS_HTML (focused_widget)) { + gtk_html_select_all (GTK_HTML (focused_widget)); } } @@ -2518,9 +2577,19 @@ create_move_to_dialog (ModestWindow *win, GTK_POLICY_AUTOMATIC); /* Create 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))); + *tree_view = modest_platform_create_folder_view (NULL); + + /* It could happen that we're trying to move a message from a + window (msg window for example) after the main window was + closed, so we can not just get the model of the folder + view */ + if (MODEST_IS_FOLDER_VIEW (folder_view)) + gtk_tree_view_set_model (GTK_TREE_VIEW (*tree_view), + gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view))); + else + modest_folder_view_update_model (MODEST_FOLDER_VIEW (*tree_view), + TNY_ACCOUNT_STORE (modest_runtime_get_account_store ())); + gtk_container_add (GTK_CONTAINER (scroll), *tree_view); /* Add scroll to dialog */ @@ -2529,6 +2598,9 @@ create_move_to_dialog (ModestWindow *win, gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); + /* Select INBOX or local account */ + modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (*tree_view)); + return dialog; } @@ -2611,16 +2683,17 @@ msgs_move_to_confirmation (GtkWindow *win, static void -tranasfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data) +transfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data) { ModestMsgViewWindow *self = NULL; - gboolean found = FALSE; g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (object)); self = MODEST_MSG_VIEW_WINDOW (object); - found = modest_msg_view_window_select_first_message (self); - g_return_if_fail (found); + /* If there are not more messages don't do anything. The + viewer will show the same message */ + if (!modest_msg_view_window_select_first_message (self)) + return; } void @@ -2679,7 +2752,7 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); /* Clean folder on header view before moving it */ - modest_header_view_set_folder (MODEST_HEADER_VIEW (header_view), NULL); + modest_header_view_clear (MODEST_HEADER_VIEW (header_view)); if (TNY_IS_FOLDER (src_folder)) { mail_op = @@ -2751,8 +2824,11 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, /* Get the folder view */ main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ())); - folder_view = modest_main_window_get_child_widget (main_window, - MODEST_WIDGET_TYPE_FOLDER_VIEW); + if (main_window) + folder_view = modest_main_window_get_child_widget (main_window, + MODEST_WIDGET_TYPE_FOLDER_VIEW); + else + folder_view = NULL; /* Create and run the dialog */ dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view); @@ -2790,10 +2866,10 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, headers, TNY_FOLDER (folder_store), TRUE, - tranasfer_msgs_from_viewer_cb, + transfer_msgs_from_viewer_cb, NULL); g_object_unref (G_OBJECT (mail_op)); - } + } g_object_unref (headers); g_object_unref (folder_store); } @@ -2826,22 +2902,34 @@ do_headers_action (ModestWindow *win, { TnyList *headers_list; TnyIterator *iter; + TnyHeader *header; + TnyFolder *folder; /* Get headers */ headers_list = get_selected_headers (win); if (!headers_list) return; - /* Call the function for each header */ + /* Get the folder */ iter = tny_list_create_iterator (headers_list); - while (!tny_iterator_is_done (iter)) { - TnyHeader *header; + header = TNY_HEADER (tny_iterator_get_current (iter)); + folder = tny_header_get_folder (header); + g_object_unref (header); + /* Call the function for each header */ + while (!tny_iterator_is_done (iter)) { header = TNY_HEADER (tny_iterator_get_current (iter)); func (header, win, user_data); g_object_unref (header); tny_iterator_next (iter); } + + /* Trick: do a poke status in order to speed up the signaling + of observers */ + tny_folder_poke_status (folder); + + /* Frees */ + g_object_unref (folder); g_object_unref (iter); g_object_unref (headers_list); } @@ -2998,6 +3086,36 @@ modest_ui_actions_on_edit_menu_activated (GtkAction *action, } void +modest_ui_actions_on_view_menu_activated (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void +modest_ui_actions_on_tools_menu_activated (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void +modest_ui_actions_on_attachment_menu_activated (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action, ModestWindow *window) {