From b452caf1791ce100a9f8f3024aa701a4344bbe7e Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Fri, 16 May 2008 19:51:18 +0000 Subject: ** Fixes bug #514383 2008-05-16 Matthew Barnes ** Fixes bug #514383 * plugins/mark-all-read/mark-all-read.c: Add a Cancel button. * mail/mail.error.xml: Remove the "ask-mark-read" error. * e-error.c (e_error_newv): Widget packing adjustments. svn path=/trunk/; revision=35504 --- plugins/mark-all-read/mark-all-read.c | 167 ++++++++++++++++++++++++++++++++-- 1 file changed, 157 insertions(+), 10 deletions(-) (limited to 'plugins/mark-all-read/mark-all-read.c') diff --git a/plugins/mark-all-read/mark-all-read.c b/plugins/mark-all-read/mark-all-read.c index 7e01b3f79a..1887d447a0 100644 --- a/plugins/mark-all-read/mark-all-read.c +++ b/plugins/mark-all-read/mark-all-read.c @@ -33,10 +33,161 @@ #include #include "e-util/e-error.h" +#define PRIMARY_TEXT \ + N_("Mark all messages in this folder and subfolders as read?") +#define SECONDARY_TEXT \ + N_("Do you want the operation to be performed also in the subfolders?") + void org_gnome_mark_all_read (EPlugin *ep, EMPopupTargetFolder *target); static void mar_got_folder (char *uri, CamelFolder *folder, void *data); static void mar_all_sub_folders (CamelStore *store, CamelFolderInfo *fi, CamelException *ex); +static void +button_clicked_cb (GtkButton *button, + GtkDialog *dialog) +{ + gpointer response; + + response = g_object_get_data (G_OBJECT (button), "response"); + gtk_dialog_response (dialog, GPOINTER_TO_INT (response)); +} + +static void +box_mapped_cb (GtkWidget *box, + GtkWidget *label) +{ + GtkRequisition requisition; + + /* In order to get decent line wrapping we need to wait until the + * box containing the buttons is mapped, and then resize the label + * to the same width as the box. */ + gtk_widget_size_request (box, &requisition); + gtk_widget_set_size_request (label, requisition.width, -1); +} + +static gint +prompt_user (void) +{ + GtkWidget *container; + GtkWidget *dialog; + GtkWidget *label1; + GtkWidget *label2; + GtkWidget *table; + GtkWidget *widget; + GtkWidget *vbox; + gchar *markup; + gint response; + + dialog = gtk_dialog_new (); + gtk_widget_hide (GTK_DIALOG (dialog)->action_area); + gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); + gtk_window_set_title ( + GTK_WINDOW (dialog), _("Mark All Messages as Read")); + g_signal_connect ( + dialog, "map", + G_CALLBACK (gtk_widget_queue_resize), NULL); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 12); + vbox = GTK_DIALOG (dialog)->vbox; + + /* Table */ + widget = gtk_table_new (3, 2, FALSE); + gtk_table_set_row_spacings (GTK_TABLE (widget), 12); + gtk_table_set_col_spacings (GTK_TABLE (widget), 12); + gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0); + gtk_widget_show (widget); + + table = widget; + + /* Question Icon */ + widget = gtk_image_new_from_stock ( + GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG); + gtk_misc_set_alignment (GTK_MISC (widget), 0.5, 0.0); + gtk_table_attach ( + GTK_TABLE (table), widget, 0, 1, 0, 3, + 0, GTK_EXPAND | GTK_FILL, 0, 0); + gtk_widget_show (widget); + + /* Primary Text */ + markup = g_markup_printf_escaped ( + "%s", gettext (PRIMARY_TEXT)); + widget = gtk_label_new (markup); + gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); + gtk_label_set_use_markup (GTK_LABEL (widget), TRUE); + gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.0); + gtk_table_attach ( + GTK_TABLE (table), widget, 1, 2, 0, 1, + 0, 0, 0, 0); + gtk_widget_show (widget); + g_free (markup); + label1 = widget; + + /* Secondary Text */ + widget = gtk_label_new (gettext (SECONDARY_TEXT)); + gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); + gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.0); + gtk_table_attach ( + GTK_TABLE (table), widget, 1, 2, 1, 2, + 0, GTK_EXPAND | GTK_FILL, 0, 0); + gtk_widget_show (widget); + label2 = widget; + + /* Action Area */ + widget = gtk_hbox_new (FALSE, 6); + g_signal_connect ( + widget, "map", + G_CALLBACK (box_mapped_cb), label1); + g_signal_connect ( + widget, "map", + G_CALLBACK (box_mapped_cb), label2); + gtk_table_attach ( + GTK_TABLE (table), widget, 1, 2, 2, 3, + GTK_EXPAND | GTK_FILL, 0, 0, 0); + gtk_widget_show (widget); + + container = widget; + + /* Cancel button */ + widget = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + g_object_set_data ( + G_OBJECT (widget), "response", + GINT_TO_POINTER (GTK_RESPONSE_CANCEL)); + g_signal_connect ( + widget, "clicked", + G_CALLBACK (button_clicked_cb), dialog); + gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); + gtk_widget_show (widget); + + /* "Current Folder and Subfolders" button */ + widget = gtk_button_new_with_mnemonic ( + _("Current Folder and _Subfolders")); + g_object_set_data ( + G_OBJECT (widget), "response", + GINT_TO_POINTER (GTK_RESPONSE_YES)); + g_signal_connect ( + widget, "clicked", + G_CALLBACK (button_clicked_cb), dialog); + gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); + gtk_widget_show (widget); + + /* "Current Folder Only" button */ + widget = gtk_button_new_with_mnemonic ( + _("Current _Folder Only")); + g_object_set_data ( + G_OBJECT (widget), "response", + GINT_TO_POINTER (GTK_RESPONSE_NO)); + g_signal_connect ( + widget, "clicked", + G_CALLBACK (button_clicked_cb), dialog); + gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); + gtk_widget_show (widget); + + response = gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (dialog); + + return response; +} + void org_gnome_mark_all_read (EPlugin *ep, EMPopupTargetFolder *t) { @@ -84,19 +235,15 @@ mar_got_folder (char *uri, CamelFolder *folder, void *data) return; } - if (info && (info->child || info->next)) { - response = e_error_run (NULL, "mail:ask-mark-read", NULL); - } else { - mark_all_as_read (folder); - return; - } + if (info && (info->child || info->next)) + response = prompt_user (); + else + response = GTK_RESPONSE_NO; - if (response == GTK_RESPONSE_NO) { + if (response == GTK_RESPONSE_NO) mark_all_as_read (folder); - } else if (response == GTK_RESPONSE_YES){ + else if (response == GTK_RESPONSE_YES) mar_all_sub_folders (store, info, &ex); - } - } static void -- cgit v1.2.3