Prompt the user to find out if he/she wants to go to the next folder with

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.

svn path=/trunk/; revision=15770
This commit is contained in:
Jeffrey Stedfast
2002-02-20 03:51:20 +00:00
committed by Jeffrey Stedfast
parent 7f2dde8abd
commit cf945fcde2
7 changed files with 241 additions and 15 deletions

View File

@ -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

View File

@ -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 */
};

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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);
}

View File

@ -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,