diff options
-rw-r--r-- | mail/ChangeLog | 31 | ||||
-rw-r--r-- | mail/folder-browser.h | 8 | ||||
-rw-r--r-- | mail/mail-callbacks.c | 151 | ||||
-rw-r--r-- | mail/mail-config.c | 43 | ||||
-rw-r--r-- | mail/mail-config.h | 5 | ||||
-rw-r--r-- | mail/message-list.c | 16 | ||||
-rw-r--r-- | mail/message-list.h | 2 |
7 files changed, 241 insertions, 15 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 299490ce88..c422b0feb5 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,34 @@ +2002-02-19 Jeffrey Stedfast <fejj@ximian.com> + + * mail-callbacks.c (confirm_goto_next_folder): Prompt the user to + find out if he/she wants to go to the next folder with unread mail + in it. + (find_current_folder): Find a given CamelFolderInfo node based on + a given uri. + (find_next_folder_r): Recursively look for a CamelFOlderInfo node + which has unread messages. + (find_next_folder): Given a currently selected CamelFolderInfo + node, look for the next node containing unread messages. + (do_evil_kludgy_goto_next_folder_hack): Find the currently + selected folder and then find the very next folder after it that + contains unread messages and then select it via a CORBA call to + the shell. + (next_unread_msg): If we fail to find an unread message in the + message-list, prompt the user to find out if we should jump to the + next fodler containing unread messages. If so, call + do_evil_kludgy_goto_next_folder_hack(). + + * message-list.c (message_list_select): Return a boolean value + based on whether the call was successfull or not. + + * mail-config.c (mail_config_get_confirm_goto_next_folder): + (mail_config_set_confirm_goto_next_folder): + (mail_config_get_goto_next_folder): + (mail_config_set_goto_next_folder): All new functions, yay. + (config_read): Read in the confirm_goto_next_folder and + goto_next_folder config options. + (mail_config_write_on_exit): Same the options here. + 2002-02-15 Jeffrey Stedfast <fejj@ximian.com> * mail-account-gui.c (basename_from_uri): Ack, strip off the diff --git a/mail/folder-browser.h b/mail/folder-browser.h index 1b76f82c97..fd399df930 100644 --- a/mail/folder-browser.h +++ b/mail/folder-browser.h @@ -36,7 +36,7 @@ typedef enum _FolderBrowserSelectionState { struct _FolderBrowser { GtkTable parent; - + BonoboPropertyBag *properties; GNOME_Evolution_Shell shell; @@ -57,7 +57,7 @@ struct _FolderBrowser { char *new_uid; /* place to save the next uid during idle timeout */ char *loaded_uid; /* what we have loaded */ guint loading_id, seen_id; - + /* a folder we are expunging, dont use other than to compare the pointer value */ CamelFolder *expunging; @@ -84,10 +84,10 @@ struct _FolderBrowser { GtkWidget *invisible; GByteArray *clipboard_selection; - + /* for async events */ struct _MailAsyncEvent *async_event; - + int get_id; /* for getting folder op */ }; diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c index fa59e0e254..41733c7f23 100644 --- a/mail/mail-callbacks.c +++ b/mail/mail-callbacks.c @@ -2331,6 +2331,151 @@ undelete_msg (GtkWidget *button, gpointer user_data) flag_messages (FOLDER_BROWSER (user_data), CAMEL_MESSAGE_DELETED, 0); } + +static gboolean +confirm_goto_next_folder (FolderBrowser *fb) +{ + GtkWidget *dialog, *label, *checkbox; + int button; + + if (!mail_config_get_confirm_goto_next_folder ()) + return mail_config_get_goto_next_folder (); + + dialog = gnome_dialog_new (_("Go to next folder with unread messages?"), + GNOME_STOCK_BUTTON_YES, + GNOME_STOCK_BUTTON_NO, + NULL); + + e_gnome_dialog_set_parent (GNOME_DIALOG (dialog), FB_WINDOW (fb)); + + label = gtk_label_new (_("There are no more new messages in this folder.\n" + "Would you like to go to the next folder?")); + + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), label, TRUE, TRUE, 4); + + checkbox = gtk_check_button_new_with_label (_("Do not ask me again.")); + gtk_object_ref (GTK_OBJECT (checkbox)); + gtk_widget_show (checkbox); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), checkbox, TRUE, TRUE, 4); + + button = gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox))) + mail_config_set_confirm_goto_next_folder (FALSE); + + gtk_object_unref (GTK_OBJECT (checkbox)); + + if (button == 0) { + mail_config_set_goto_next_folder (TRUE); + return TRUE; + } else { + mail_config_set_goto_next_folder (FALSE); + return FALSE; + } +} + +static CamelFolderInfo * +find_current_folder (CamelFolderInfo *root, const char *current_uri) +{ + CamelFolderInfo *node, *current = NULL; + + node = root; + while (node) { + if (!strcmp (current_uri, node->url)) { + current = node; + break; + } + + current = find_current_folder (node->child, current_uri); + if (current) + break; + + node = node->sibling; + } + + return current; +} + +static CamelFolderInfo * +find_next_folder_r (CamelFolderInfo *node) +{ + CamelFolderInfo *next; + + while (node) { + if (node->unread_message_count > 0) + return node; + + next = find_next_folder_r (node->child); + if (next) + return next; + + node = node->sibling; + } + + return NULL; +} + +static CamelFolderInfo * +find_next_folder (CamelFolderInfo *current) +{ + CamelFolderInfo *next; + + /* first search subfolders... */ + next = find_next_folder_r (current->child); + if (next) + return next; + + /* now search siblings... */ + next = find_next_folder_r (current->sibling); + if (next) + return next; + + /* now go up one level (if we can) and search... */ + if (current->parent && current->parent->sibling) { + return find_next_folder_r (current->parent->sibling); + } else { + return NULL; + } +} + +static void +do_evil_kludgy_goto_next_folder_hack (FolderBrowser *fb) +{ + CamelFolderInfo *root, *current, *node; + CORBA_Environment ev; + CamelStore *store; + + store = camel_folder_get_parent_store (fb->folder); + + /* FIXME: loop over all available mail stores? */ + + root = camel_store_get_folder_info (store, "", CAMEL_STORE_FOLDER_INFO_RECURSIVE | + CAMEL_STORE_FOLDER_INFO_SUBSCRIBED, NULL); + + if (!root) + return; + + current = find_current_folder (root, fb->uri); + g_assert (current != NULL); + + node = find_next_folder (current); + if (node) { + g_warning ("doin' my thang..."); + CORBA_exception_init (&ev); + GNOME_Evolution_ShellView_changeCurrentView (fb->shell_view, "evolution:/local/Inbox", &ev); + if (ev._major != CORBA_NO_EXCEPTION) + g_warning ("got an exception"); + CORBA_exception_free (&ev); + } else { + g_warning ("can't find a folder with unread mail?"); + } + + camel_store_free_folder_info (store, root); +} + void next_msg (GtkWidget *button, gpointer user_data) { @@ -2350,8 +2495,10 @@ next_unread_msg (GtkWidget *button, gpointer user_data) if (FOLDER_BROWSER_IS_DESTROYED (fb)) return; - message_list_select (fb->message_list, MESSAGE_LIST_SELECT_NEXT, - 0, CAMEL_MESSAGE_SEEN, TRUE); + if (!message_list_select (fb->message_list, MESSAGE_LIST_SELECT_NEXT, 0, CAMEL_MESSAGE_SEEN, TRUE)) { + if (confirm_goto_next_folder (fb)) + do_evil_kludgy_goto_next_folder_hack (fb); + } } void diff --git a/mail/mail-config.c b/mail/mail-config.c index a5112b570b..2cc841b0d0 100644 --- a/mail/mail-config.c +++ b/mail/mail-config.c @@ -84,6 +84,8 @@ typedef struct { gboolean prompt_empty_subject; gboolean prompt_only_bcc; gboolean confirm_expunge; + gboolean confirm_goto_next_folder; + gboolean goto_next_folder; gboolean do_seen_timeout; int seen_timeout; gboolean empty_trash_on_exit; @@ -605,6 +607,10 @@ config_read (void) config->paned_size = bonobo_config_get_long_with_default (config->db, "/Mail/Display/paned_size", 200, NULL); + /* Goto next folder when user has reached the bottom of the message-list */ + config->goto_next_folder = bonobo_config_get_boolean_with_default ( + config->db, "/Mail/MessageList/goto_next_folder", FALSE, NULL); + /* Empty Subject */ config->prompt_empty_subject = bonobo_config_get_boolean_with_default ( config->db, "/Mail/Prompts/empty_subject", TRUE, NULL); @@ -617,6 +623,10 @@ config_read (void) config->confirm_expunge = bonobo_config_get_boolean_with_default ( config->db, "/Mail/Prompts/confirm_expunge", TRUE, NULL); + /* Goto next folder */ + config->confirm_goto_next_folder = bonobo_config_get_boolean_with_default ( + config->db, "/Mail/Prompts/confirm_goto_next_folder", TRUE, NULL); + /* PGP/GPG */ config->pgp_path = bonobo_config_get_string (config->db, "/Mail/PGP/path", NULL); @@ -910,7 +920,7 @@ mail_config_write_on_exit (void) /* Format */ bonobo_config_set_boolean (config->db, "/Mail/Format/send_html", config->send_html, NULL); - + /* Confirm Sending Unwanted HTML */ bonobo_config_set_boolean (config->db, "/Mail/Format/confirm_unwanted_html", config->confirm_unwanted_html, NULL); @@ -923,6 +933,10 @@ mail_config_write_on_exit (void) bonobo_config_set_long (config->db, "/Mail/Display/citation_color", config->citation_color, NULL); + /* Goto next folder */ + bonobo_config_set_boolean (config->db, "/Mail/MessageList/goto_next_folder", + config->goto_next_folder, NULL); + /* Empty Subject */ bonobo_config_set_boolean (config->db, "/Mail/Prompts/empty_subject", config->prompt_empty_subject, NULL); @@ -935,6 +949,10 @@ mail_config_write_on_exit (void) bonobo_config_set_boolean (config->db, "/Mail/Prompts/confirm_expunge", config->confirm_expunge, NULL); + /* Goto next folder */ + bonobo_config_set_boolean (config->db, "/Mail/Prompts/confirm_goto_next_folder", + config->confirm_goto_next_folder, NULL); + /* PGP/GPG */ bonobo_config_set_string_wrapper (config->db, "/Mail/PGP/path", config->pgp_path, NULL); @@ -1362,6 +1380,29 @@ mail_config_set_confirm_expunge (gboolean value) config->confirm_expunge = value; } +gboolean +mail_config_get_confirm_goto_next_folder (void) +{ + return config->confirm_goto_next_folder; +} + +void +mail_config_set_confirm_goto_next_folder (gboolean value) +{ + config->confirm_goto_next_folder = value; +} + +gboolean +mail_config_get_goto_next_folder (void) +{ + return config->goto_next_folder; +} + +void +mail_config_set_goto_next_folder (gboolean value) +{ + config->goto_next_folder = value; +} struct { char *bin; diff --git a/mail/mail-config.h b/mail/mail-config.h index 82dd654e8a..00065fdfd8 100644 --- a/mail/mail-config.h +++ b/mail/mail-config.h @@ -172,6 +172,11 @@ void mail_config_set_prompt_only_bcc (gboolean value); gboolean mail_config_get_confirm_expunge (void); void mail_config_set_confirm_expunge (gboolean value); +gboolean mail_config_get_confirm_goto_next_folder (void); +void mail_config_set_confirm_goto_next_folder (gboolean value); +gboolean mail_config_get_goto_next_folder (void); +void mail_config_set_goto_next_folder (gboolean value); + CamelPgpType mail_config_pgp_type_detect_from_path (const char *pgp); CamelPgpType mail_config_get_pgp_type (void); diff --git a/mail/message-list.c b/mail/message-list.c index f2dfcf1918..030791faa8 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -403,8 +403,10 @@ search_func (ETreeModel *model, ETreePath path, struct search_func_data *data) * message, or %MESSAGE_LIST_SELECT_PREVIOUS if it should find the * previous. If no suitable row is found, the selection will be * unchanged. + * + * Returns %TRUE if a new message has been selected or %FALSE otherwise. **/ -void +gboolean message_list_select (MessageList *message_list, MessageListSelectDirection direction, guint32 flags, @@ -413,23 +415,23 @@ message_list_select (MessageList *message_list, { struct search_func_data data; ETreeFindNextParams params = 0; - + if (!GTK_WIDGET_HAS_FOCUS (message_list)) gtk_widget_grab_focus (GTK_WIDGET (message_list)); - + data.message_list = message_list; data.flags = flags; data.mask = mask; - + if (direction == MESSAGE_LIST_SELECT_NEXT) params |= E_TREE_FIND_NEXT_FORWARD; else params |= E_TREE_FIND_NEXT_BACKWARD; - + if (wraparound) params |= E_TREE_FIND_NEXT_WRAP; - - e_tree_find_next (message_list->tree, params, (ETreePathFunc) search_func, &data); + + return e_tree_find_next (message_list->tree, params, (ETreePathFunc) search_func, &data); } diff --git a/mail/message-list.h b/mail/message-list.h index 42de65cbd8..d6965b5c71 100644 --- a/mail/message-list.h +++ b/mail/message-list.h @@ -116,7 +116,7 @@ void message_list_foreach (MessageList *message_list, MessageListForeachFunc callback, gpointer user_data); -void message_list_select (MessageList *message_list, +gboolean message_list_select (MessageList *message_list, MessageListSelectDirection direction, guint32 flags, guint32 mask, |