X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=7d1d4ef70df3185874d452c40ca4ad9f664cbc38;hp=d5bd712113cdedcb3d80cc5b786fc92ee0e5c333;hb=9d8de13bc46137931a2790969dcb1fb932c7bcc6;hpb=e46546c5c14f2c3b601a03f633b266a5616b9710 diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index d5bd712..7d1d4ef 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -32,6 +32,7 @@ #endif /*HAVE_CONFIG_H*/ #include +#include #include #include #include @@ -90,6 +91,7 @@ typedef struct _ReplyForwardHelper { guint reply_forward_type; ReplyForwardAction action; gchar *account_name; + GtkWidget *parent_window; } ReplyForwardHelper; /* @@ -235,12 +237,41 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) gchar *message = NULL; gchar *desc = NULL; gint response; + gboolean found; + ModestWindowMgr *mgr; g_return_if_fail (MODEST_IS_WINDOW(win)); header_list = get_selected_headers (win); if (!header_list) return; + /* Check if any of the headers is already opened */ + iter = tny_list_create_iterator (header_list); + found = FALSE; + mgr = modest_runtime_get_window_mgr (); + while (!tny_iterator_is_done (iter) && !found) { + header = TNY_HEADER (tny_iterator_get_current (iter)); + if (modest_window_mgr_find_window_by_header (mgr, header)) + found = TRUE; + g_object_unref (header); + tny_iterator_next (iter); + } + g_object_unref (iter); + + if (found) { + gchar *num, *msg; + + num = g_strdup_printf ("%d", tny_list_get_length (header_list)); + msg = g_strdup_printf (_("mcen_nc_unable_to_delete_n_messages"), num); + + modest_platform_run_information_dialog (GTK_WINDOW (win), (const gchar *) msg); + + g_free (msg); + g_free (num); + g_object_unref (header_list); + return; + } + /* Select message */ if (tny_list_get_length(header_list) > 1) message = g_strdup(_("emev_nc_delete_messages")); @@ -249,6 +280,8 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) header = TNY_HEADER (tny_iterator_get_current (iter)); desc = g_strdup_printf ("%s", tny_header_get_subject (header)); message = g_strdup_printf(_("emev_nc_delete_message"), desc); + g_object_unref (header); + g_object_unref (iter); } /* Confirmation dialog */ @@ -275,7 +308,6 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) g_free(message); g_free(desc); g_object_unref (header_list); - g_object_unref (iter); } @@ -313,8 +345,14 @@ modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win) clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); selection = gtk_clipboard_wait_for_text (clipboard); - modest_address_book_add_address (selection); - g_free (selection); + /* Question: why is the clipboard being used here? + * It doesn't really make a lot of sense. */ + + if (selection) + { + modest_address_book_add_address (selection); + g_free (selection); + } } void @@ -542,6 +580,8 @@ open_msg_cb (ModestMailOperation *mail_op, if (folder_type == TNY_FOLDER_TYPE_DRAFTS) { win = modest_msg_edit_window_new (msg, account); } else { + gchar *uid = modest_tny_folder_get_header_unique_id (header); + if (MODEST_IS_MAIN_WINDOW (parent_win)) { GtkWidget *header_view; GtkTreeSelection *sel; @@ -562,16 +602,18 @@ open_msg_cb (ModestMailOperation *mail_op, g_list_free (sel_list); win = modest_msg_view_window_new_with_header_model (msg, - account, + account, + (const gchar*) uid, model, row_reference); gtk_tree_row_reference_free (row_reference); } else { - win = modest_msg_view_window_new (msg, account); + win = modest_msg_view_window_new (msg, account, (const gchar*) uid); } } else { - win = modest_msg_view_window_new (msg, account); + win = modest_msg_view_window_new (msg, account, (const gchar*) uid); } + g_free (uid); } /* Register and show new window */ @@ -600,7 +642,7 @@ modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op, const GError *error; error = modest_mail_operation_get_error (mail_op); - if (error->code == MODEST_MAIL_OPERATION_ERROR_SIZE_LIMIT) { + if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) { GObject *win = modest_mail_operation_get_source (mail_op); modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, @@ -630,9 +672,13 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win) TnyHeader *header; header = TNY_HEADER (tny_iterator_get_current (iter)); - window = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header)); - if (window) + 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)); + gtk_window_present (GTK_WINDOW (window)); + } g_object_unref (header); tny_iterator_next (iter); @@ -692,8 +738,6 @@ reply_forward_cb (ModestMailOperation *mail_op, ModestWindow *msg_win; ModestEditType edit_type; gchar *from; - GError *err = NULL; - TnyFolder *folder = NULL; TnyAccount *account = NULL; ModestWindowMgr *mgr; gchar *signature = NULL; @@ -750,33 +794,24 @@ reply_forward_cb (ModestMailOperation *mail_op, goto cleanup; } - folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS); - if (!folder) { - g_printerr ("modest: failed to find Drafts folder\n"); - 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 the windows */ + /* Create and register the windows */ msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name); mgr = modest_runtime_get_window_mgr (); modest_window_mgr_register_window (mgr, msg_win); + if (rf_helper->parent_window != NULL) { + gdouble parent_zoom; + + parent_zoom = modest_window_get_zoom (MODEST_WINDOW (rf_helper->parent_window)); + modest_window_set_zoom (msg_win, parent_zoom); + } + /* Show edit window */ gtk_widget_show_all (GTK_WIDGET (msg_win)); cleanup: if (new_msg) g_object_unref (G_OBJECT (new_msg)); - if (folder) - g_object_unref (G_OBJECT (folder)); if (account) g_object_unref (G_OBJECT (account)); g_object_unref (msg); @@ -868,6 +903,8 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) rf_helper->reply_forward_type = reply_forward_type; rf_helper->action = action; rf_helper->account_name = g_strdup (modest_window_get_active_account (win)); + if ((win != NULL) && (MODEST_IS_WINDOW (win))) + rf_helper->parent_window = GTK_WIDGET (win); if (!rf_helper->account_name) rf_helper->account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); @@ -1129,6 +1166,9 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view, else gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject")); } + + /* Update toolbar dimming state */ + modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window)); } void @@ -1193,9 +1233,6 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, set_active_account_from_tny_account (TNY_ACCOUNT (folder_store), MODEST_WINDOW (main_window)); /* Show account details */ modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS); - } else if (modest_tny_folder_store_is_virtual_local_folders (folder_store )) { - //TODO: Set the virtual folder store as the "active account" somehow: - modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS); } else { if (TNY_IS_FOLDER (folder_store) && selected) { @@ -1221,6 +1258,9 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL); } } + + /* Update toolbar dimming state */ + modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window)); } void @@ -1331,6 +1371,11 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi modest_msg_edit_window_free_msg_data (edit_window, data); return; } + + if (!strcmp (account_name, MODEST_ACTUAL_LOCAL_FOLDERS_ACCOUNT_ID)) { + account_name = g_strdup (data->account_name); + } + transport_account = TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), @@ -1350,6 +1395,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi modest_mail_operation_save_to_drafts (mail_operation, transport_account, + data->draft_msg, from, data->to, data->cc, @@ -1392,6 +1438,11 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) g_printerr ("modest: no account found\n"); return; } + MsgData *data = modest_msg_edit_window_get_msg_data (edit_window); + + if (!strcmp (account_name, MODEST_ACTUAL_LOCAL_FOLDERS_ACCOUNT_ID)) { + account_name = g_strdup (data->account_name); + } /* Get the currently-active transport account for this modest account: */ TnyTransportAccount *transport_account = @@ -1401,18 +1452,46 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) if (!transport_account) { g_printerr ("modest: no transport account found for '%s'\n", account_name); g_free (account_name); + modest_msg_edit_window_free_msg_data (edit_window, data); return; } gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name); + /* mail content checks and dialogs */ + if (data->subject == NULL || data->subject[0] == '\0') { + GtkResponseType response; + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window), + _("mcen_nc_subject_is_empty_send")); + if (response == GTK_RESPONSE_CANCEL) { + g_free (account_name); + return; + } + } + + if (data->plain_body == NULL || data->plain_body[0] == '\0') { + GtkResponseType response; + gchar *note_message; + gchar *note_subject = data->subject; + if (note_subject == NULL || note_subject[0] == '\0') + note_subject = _("mail_va_no_subject"); + note_message = g_strdup_printf (_("emev_ni_ui_smtp_message_null"), note_subject); + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window), + note_message); + g_free (note_message); + if (response == GTK_RESPONSE_CANCEL) { + g_free (account_name); + return; + } + } + /* Create the mail operation */ ModestMailOperation *mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_SEND, G_OBJECT(edit_window)); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation); - MsgData *data = modest_msg_edit_window_get_msg_data (edit_window); modest_mail_operation_send_new_mail (mail_operation, transport_account, + data->draft_msg, from, data->to, data->cc, @@ -1987,7 +2066,7 @@ modest_ui_actions_on_cut (GtkAction *action, GtkTextBuffer *buffer; GtkClipboard *clipboard; - clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget)); gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE); } @@ -2000,7 +2079,7 @@ modest_ui_actions_on_copy (GtkAction *action, GtkClipboard *clipboard; GtkWidget *focused_widget; - clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); focused_widget = gtk_window_get_focus (GTK_WINDOW (window)); if (GTK_IS_LABEL (focused_widget)) { gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1); @@ -2038,7 +2117,7 @@ modest_ui_actions_on_paste (GtkAction *action, GtkTextBuffer *buffer; GtkClipboard *clipboard; - clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget)); gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE); } @@ -2066,6 +2145,21 @@ modest_ui_actions_on_select_all (GtkAction *action, gtk_text_buffer_get_end_iter (buffer, &end); gtk_text_buffer_select_range (buffer, &start, &end); } + else if ((MODEST_IS_FOLDER_VIEW (focused_widget)) || + (MODEST_IS_HEADER_VIEW (focused_widget))) { + + GtkTreeSelection *selection = NULL; + + /* Get header view */ + GtkWidget *header_view = focused_widget; + if (MODEST_IS_FOLDER_VIEW (focused_widget)) + header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window), + MODEST_WIDGET_TYPE_HEADER_VIEW); + + /* Select all messages */ + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view)); + gtk_tree_selection_select_all (selection); + } } void @@ -2772,6 +2866,61 @@ modest_ui_actions_on_settings (GtkAction *action, } void +modest_ui_actions_on_help (GtkAction *action, + ModestWindow *win) +{ + const gchar *help_id = NULL; + + if (MODEST_IS_MAIN_WINDOW (win)) { + const gchar *action_name; + action_name = gtk_action_get_name (action); + + if (!strcmp (action_name, "FolderViewCSMHelp") || + !strcmp (action_name, "HeaderViewCSMHelp")) { + GtkWidget *folder_view; + TnyFolderStore *folder_store; + /* Get selected folder */ + folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), + MODEST_WIDGET_TYPE_FOLDER_VIEW); + folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); + + /* Switch help_id */ + if (TNY_IS_FOLDER (folder_store)) { + switch (tny_folder_get_folder_type (TNY_FOLDER (folder_store))) { + case TNY_FOLDER_TYPE_NORMAL: + help_id = "applications_email_userfolder"; + break; + case TNY_FOLDER_TYPE_INBOX: + help_id = "applications_email_inbox"; + break; + case TNY_FOLDER_TYPE_OUTBOX: + help_id = "applications_email_outbox"; + break; + case TNY_FOLDER_TYPE_SENT: + help_id = "applications_email_sent"; + break; + case TNY_FOLDER_TYPE_DRAFTS: + help_id = "applications_email_drafts"; + break; + case TNY_FOLDER_TYPE_ARCHIVE: + help_id = "applications_email_archive"; + break; + default: + help_id = NULL; + } + } + } else { + help_id = "applications_email_mainview"; + } + } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) { + help_id = "applications_email_viewer"; + } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) + help_id = "applications_email_editor"; + + modest_platform_show_help (GTK_WINDOW (win), help_id); +} + +void modest_ui_actions_on_retrieve_msg_contents (GtkAction *action, ModestWindow *window) { @@ -2803,7 +2952,7 @@ modest_ui_actions_on_email_menu_activated (GtkAction *action, g_return_if_fail (MODEST_IS_WINDOW (window)); /* Update dimmed */ - modest_window_check_dimming_rules (window); + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); } void @@ -2813,7 +2962,7 @@ modest_ui_actions_on_edit_menu_activated (GtkAction *action, g_return_if_fail (MODEST_IS_WINDOW (window)); /* Update dimmed */ - modest_window_check_dimming_rules (window); + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); } void @@ -2823,7 +2972,7 @@ modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action, g_return_if_fail (MODEST_IS_WINDOW (window)); /* Update dimmed */ - modest_window_check_dimming_rules (window); + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); } void @@ -2833,7 +2982,7 @@ modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action, g_return_if_fail (MODEST_IS_WINDOW (window)); /* Update dimmed */ - modest_window_check_dimming_rules (window); + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); } void @@ -2843,5 +2992,22 @@ modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action, g_return_if_fail (MODEST_IS_WINDOW (window)); /* Update dimmed */ - modest_window_check_dimming_rules (window); + modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); +} + +void +modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + /* Update dimmed */ + modest_window_check_dimming_rules_group (window, "ModestToolbarDimmingRules"); +} + +void +modest_ui_actions_on_search_messages (GtkAction *action, ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + modest_platform_show_search_messages (GTK_WINDOW (window)); }