aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog39
-rw-r--r--mail/folder-browser-factory.c14
-rw-r--r--mail/folder-browser.c152
-rw-r--r--mail/folder-browser.h10
-rw-r--r--mail/mail-callbacks.c49
-rw-r--r--mail/mail-callbacks.h3
-rw-r--r--mail/mail-config.c48
-rw-r--r--mail/mail-config.h3
-rw-r--r--mail/mail-send-recv.c16
9 files changed, 314 insertions, 20 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 05ef8d82cf..485db80a67 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,42 @@
+2001-06-25 jacob berkman <jacob@ximian.com>
+
+ * mail-send-recv.c (free_send_data): sync folders after we've
+ gotten mail
+
+ * folder-browser-factory.c (control_activate): set the ui
+ component on the folder browser
+ (control_activate): update the view preview item
+ (control_deactivate): don't sync the folder here
+ (control_deactivate): unset the ui component of the folder browser
+
+ * mail-callbacks.c (toggle_flags): stuff from jleach to add an
+ importance keybinding
+ (mark_as_important): ditto
+ (toggle_as_important): again
+
+ * mail-config.c (mail_config_get_show_preview):
+ (mail_config_set_show_preview): basically a copy of
+ get_thread_list() but for the preview pane
+
+ * folder-browser.c (folder_browser_destroy): unref the our ui
+ component
+ (folder_browser_set_ui_component): new function for setting the ui
+ component
+ (save_cursor_pos):
+ (set_cursor_pos): try to show the selected row when the preview
+ pane is shown
+ (folder_browser_set_message_preview): implement
+ (folder_browser_toggle_preview): toggle the preview (duh)
+ (on_key_press): add keybindings for marking as important (!), and
+ hiding the preview pane (q)
+ (etree_key): clean up a little bit, and make enter either show the
+ preview pane or open the message
+ (fb_resize_cb): only save the paned size if the preview is alread
+ shown
+ (folder_browser_gui_init): pass ourselves to fb_resize_cb
+ (on_message_selected): only add the timeout if the preview is
+ shown
+
2001-06-25 Jeffrey Stedfast <fejj@ximian.com>
* folder-browser.c (folder_browser_destroy): Unref the invisible
diff --git a/mail/folder-browser-factory.c b/mail/folder-browser-factory.c
index 5f959cdc50..70e149a6bd 100644
--- a/mail/folder-browser-factory.c
+++ b/mail/folder-browser-factory.c
@@ -76,6 +76,7 @@ BonoboUIVerb verbs [] = {
BONOBO_UI_UNSAFE_VERB ("MessageMarkAllAsRead", mark_all_as_seen),
BONOBO_UI_UNSAFE_VERB ("MessageMarkAsRead", mark_as_seen),
BONOBO_UI_UNSAFE_VERB ("MessageMarkAsUnRead", mark_as_unseen),
+ BONOBO_UI_UNSAFE_VERB ("MessageMarkAsImportant", mark_as_important),
BONOBO_UI_UNSAFE_VERB ("MessageMove", move_msg),
BONOBO_UI_UNSAFE_VERB ("MessageOpen", open_message),
BONOBO_UI_UNSAFE_VERB ("MessageReplyAll", reply_to_all),
@@ -245,6 +246,7 @@ control_activate (BonoboControl *control,
g_return_if_fail (container != CORBA_OBJECT_NIL);
folder_browser = bonobo_control_get_widget (control);
+ folder_browser_set_ui_component (FOLDER_BROWSER (folder_browser), uic);
bonobo_ui_component_add_verb_list_with_data (
uic, verbs, folder_browser);
@@ -254,6 +256,12 @@ control_activate (BonoboControl *control,
bonobo_ui_util_set_ui (
uic, EVOLUTION_DATADIR,
"evolution-mail.xml", "evolution-mail");
+
+ state = mail_config_get_show_preview (FOLDER_BROWSER (folder_browser)->uri);
+ bonobo_ui_component_set_prop (uic, "/commands/ViewPreview", "state", state ? "1" : "0", NULL);
+ bonobo_ui_component_add_listener (uic, "ViewPreview", folder_browser_toggle_preview, folder_browser);
+ /* FIXME: this kind of bypasses bonobo but seems the only way when we change components */
+ folder_browser_toggle_preview (uic, "", Bonobo_UIComponent_STATE_CHANGED, state ? "1" : "0", folder_browser);
state = mail_config_get_thread_list (FOLDER_BROWSER (folder_browser)->uri);
bonobo_ui_component_set_prop (uic, "/commands/ViewThreaded", "state", state ? "1" : "0", NULL);
@@ -307,9 +315,15 @@ control_deactivate (BonoboControl *control,
bonobo_ui_component_rm (uic, "/", NULL);
bonobo_ui_component_unset_container (uic);
+ /* turn this back on to get the old (broken) behaviour of
+ * synching when leaving a folder
+ */
+#if 0
if (fb->folder)
mail_sync_folder (fb->folder, NULL, NULL);
+#endif
+ folder_browser_set_ui_component (fb, NULL);
folder_browser_discard_view_menus (fb);
}
diff --git a/mail/folder-browser.c b/mail/folder-browser.c
index b50fae4a5d..80b7247bcc 100644
--- a/mail/folder-browser.c
+++ b/mail/folder-browser.c
@@ -77,7 +77,6 @@ static GdkAtom clipboard_atom = GDK_NONE;
static GByteArray *clipboard_selection = NULL;
static GtkWidget *invisible = NULL;
-static void fb_resize_cb (GtkWidget *w, GtkAllocation *a);
static void update_unread_count (CamelObject *, gpointer, gpointer);
static GtkObjectClass *folder_browser_parent_class;
@@ -112,6 +111,9 @@ folder_browser_destroy (GtkObject *object)
if (folder_browser->shell != CORBA_OBJECT_NIL)
CORBA_Object_release (folder_browser->shell, &ev);
+
+ if (folder_browser->uicomp)
+ bonobo_object_unref (BONOBO_OBJECT (folder_browser->uicomp));
g_free (folder_browser->uri);
@@ -579,6 +581,19 @@ folder_browser_set_uri (FolderBrowser *folder_browser, const char *uri)
return TRUE;
}
+void
+folder_browser_set_ui_component (FolderBrowser *fb, BonoboUIComponent *uicomp)
+{
+ g_return_if_fail (IS_FOLDER_BROWSER (fb));
+
+ if (fb->uicomp)
+ bonobo_object_unref (BONOBO_OBJECT (fb->uicomp));
+
+ if (uicomp)
+ bonobo_object_ref (BONOBO_OBJECT (uicomp));
+
+ fb->uicomp = uicomp;
+}
extern CamelFolder *drafts_folder, *sent_folder, *outbox_folder;
@@ -656,13 +671,64 @@ folder_browser_is_outbox (FolderBrowser *fb)
return fb->folder == outbox_folder;
}
+static int
+save_cursor_pos (FolderBrowser *fb)
+{
+ ETreePath node;
+ GtkAdjustment *adj;
+ int row, y, height;
+
+ node = e_tree_get_cursor (fb->message_list->tree);
+ if (!node)
+ return -1;
+
+ row = e_tree_row_of_node (fb->message_list->tree, node);
+
+ e_tree_get_cell_geometry (fb->message_list->tree, row, 0,
+ NULL, &y, NULL, &height);
+
+ adj = e_scroll_frame_get_vadjustment (E_SCROLL_FRAME (fb->message_list));
+ y += adj->value - ((mail_config_get_paned_size () - height) / 2);
+
+ return y;
+}
+
+static void
+set_cursor_pos (FolderBrowser *fb, int y)
+{
+ GtkAdjustment *adj;
+
+ if (y == -1)
+ return;
+
+ adj = e_scroll_frame_get_vadjustment (E_SCROLL_FRAME (fb->message_list));
+ gtk_adjustment_set_value (adj, (gfloat)y);
+}
+
+static gboolean do_message_selected(FolderBrowser *fb);
+
void
folder_browser_set_message_preview (FolderBrowser *folder_browser, gboolean show_message_preview)
{
if (folder_browser->preview_shown == show_message_preview)
return;
-
- g_warning ("FIXME: implement me");
+
+ folder_browser->preview_shown = show_message_preview;
+
+ if (show_message_preview) {
+ int y;
+ y = save_cursor_pos (folder_browser);
+ e_paned_set_position (E_PANED (folder_browser->vpaned),
+ mail_config_get_paned_size ());
+ gtk_widget_show (GTK_WIDGET (folder_browser->mail_display));
+ do_message_selected (folder_browser);
+ set_cursor_pos (folder_browser, y);
+ } else {
+ e_paned_set_position (E_PANED (folder_browser->vpaned),
+ 10000);
+ gtk_widget_hide (GTK_WIDGET (folder_browser->mail_display));
+ mail_display_set_message(folder_browser->mail_display, NULL);
+ }
}
enum {
@@ -756,6 +822,22 @@ folder_browser_search_query_changed (ESearchBar *esb, FolderBrowser *fb)
}
void
+folder_browser_toggle_preview (BonoboUIComponent *component,
+ const char *path,
+ Bonobo_UIComponent_EventType type,
+ const char *state,
+ gpointer user_data)
+{
+ FolderBrowser *fb = user_data;
+
+ if (type != Bonobo_UIComponent_STATE_CHANGED)
+ return;
+
+ mail_config_set_show_preview (fb->uri, atoi (state));
+ folder_browser_set_message_preview (fb, atoi (state));
+}
+
+void
folder_browser_toggle_threads (BonoboUIComponent *component,
const char *path,
Bonobo_UIComponent_EventType type,
@@ -1284,6 +1366,16 @@ on_key_press (GtkWidget *widget, GdkEventKey *key, gpointer data)
on_right_click (fb->message_list->tree, row, path, 2,
(GdkEvent *)key, fb);
return TRUE;
+ case '!':
+ toggle_as_important (NULL, fb, NULL);
+ return TRUE;
+ case 'q':
+ case 'Q':
+ if (fb->preview_shown && fb->uicomp)
+ bonobo_ui_component_set_prop (fb->uicomp,
+ "/commands/ViewPreview",
+ "state", "0", NULL);
+ return TRUE;
}
return FALSE;
@@ -1297,25 +1389,39 @@ etree_key (ETree *tree, int row, ETreePath path, int col, GdkEvent *ev, FolderBr
if ((ev->key.state & GDK_CONTROL_MASK) != 0)
return FALSE;
- if (ev->key.keyval != GDK_space && ev->key.keyval != GDK_BackSpace)
- return on_key_press ((GtkWidget *)tree, (GdkEventKey *)ev, fb);
vadj = e_scroll_frame_get_vadjustment (fb->mail_display->scroll);
page_size = vadj->page_size - vadj->step_increment;
- if (ev->key.keyval == GDK_BackSpace) {
- if (vadj->value > vadj->lower + page_size)
- vadj->value -= page_size;
- else
- vadj->value = vadj->lower;
- } else {
+ switch (ev->key.keyval) {
+ case GDK_space:
if (vadj->value < vadj->upper - vadj->page_size - page_size)
vadj->value += page_size;
else
vadj->value = vadj->upper - vadj->page_size;
+ gtk_adjustment_value_changed (vadj);
+ break;
+ case GDK_BackSpace:
+ if (vadj->value > vadj->lower + page_size)
+ vadj->value -= page_size;
+ else
+ vadj->value = vadj->lower;
+ gtk_adjustment_value_changed (vadj);
+ break;
+ case GDK_Return:
+ case GDK_KP_Enter:
+ case GDK_ISO_Enter:
+ if (fb->preview_shown)
+ open_msg (NULL, fb);
+ else if (fb->uicmp)
+ bonobo_ui_component_set_prop (fb->uicomp,
+ "/commands/ViewPreview",
+ "state", "1", NULL);
+ break;
+ default:
+ return on_key_press ((GtkWidget *)tree, (GdkEventKey *)ev, fb);
}
- gtk_adjustment_value_changed (vadj);
return TRUE;
}
@@ -1332,6 +1438,13 @@ on_double_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *even
}
static void
+fb_resize_cb (GtkWidget *w, GtkAllocation *a, FolderBrowser *fb)
+{
+ if (fb->preview_shown)
+ mail_config_set_paned_size (a->height);
+}
+
+static void
folder_browser_gui_init (FolderBrowser *fb)
{
/* The panned container */
@@ -1381,7 +1494,7 @@ folder_browser_gui_init (FolderBrowser *fb)
gtk_widget_show (GTK_WIDGET (fb->message_list));
gtk_signal_connect (GTK_OBJECT (fb->message_list), "size_allocate",
- GTK_SIGNAL_FUNC (fb_resize_cb), NULL);
+ GTK_SIGNAL_FUNC (fb_resize_cb), fb);
e_paned_add2 (E_PANED (fb->vpaned), GTK_WIDGET (fb->mail_display));
e_paned_set_position (E_PANED (fb->vpaned), mail_config_get_paned_size ());
@@ -1488,7 +1601,9 @@ on_message_selected (MessageList *ml, const char *uid, FolderBrowser *fb)
g_free(fb->new_uid);
fb->new_uid = g_strdup(uid);
- fb->loading_id = gtk_timeout_add(100, (GtkFunction)do_message_selected, fb);
+
+ if (fb->preview_shown)
+ fb->loading_id = gtk_timeout_add(100, (GtkFunction)do_message_selected, fb);
}
static void
@@ -1515,7 +1630,9 @@ my_folder_browser_init (GtkObject *object)
*/
fb->message_list = (MessageList *)message_list_new ();
fb->mail_display = (MailDisplay *)mail_display_new ();
-
+
+ fb->preview_shown = TRUE;
+
e_scroll_frame_set_policy(E_SCROLL_FRAME(fb->message_list),
GTK_POLICY_NEVER,
GTK_POLICY_ALWAYS);
@@ -1601,8 +1718,3 @@ folder_browser_new (const GNOME_Evolution_Shell shell)
E_MAKE_TYPE (folder_browser, "FolderBrowser", FolderBrowser, folder_browser_class_init, folder_browser_init, PARENT_TYPE);
-
-static void fb_resize_cb (GtkWidget *w, GtkAllocation *a)
-{
- mail_config_set_paned_size (a->height);
-}
diff --git a/mail/folder-browser.h b/mail/folder-browser.h
index 4372d8cc22..943bcf2fc8 100644
--- a/mail/folder-browser.h
+++ b/mail/folder-browser.h
@@ -30,6 +30,7 @@ struct _FolderBrowser {
BonoboPropertyBag *properties;
GNOME_Evolution_Shell shell;
+ BonoboUIComponent *uicomp;
/*
* The current URI being displayed by the FolderBrowser
@@ -84,6 +85,9 @@ struct fb_ondemand_closure {
GtkType folder_browser_get_type (void);
GtkWidget *folder_browser_new (const GNOME_Evolution_Shell shell);
+void folder_browser_set_ui_component (FolderBrowser *fb,
+ BonoboUIComponent *uicomp);
+
gboolean folder_browser_set_uri (FolderBrowser *folder_browser,
const char *uri);
@@ -113,6 +117,12 @@ void hide_none(GtkWidget *w, FolderBrowser *fb);
void hide_subject(GtkWidget *w, FolderBrowser *fb);
void hide_sender(GtkWidget *w, FolderBrowser *fb);
+void folder_browser_toggle_preview (BonoboUIComponent *component,
+ const char *path,
+ Bonobo_UIComponent_EventType type,
+ const char *state,
+ gpointer user_data);
+
void folder_browser_toggle_threads (BonoboUIComponent *component,
const char *path,
Bonobo_UIComponent_EventType type,
diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c
index 730df51c5e..e5e359e219 100644
--- a/mail/mail-callbacks.c
+++ b/mail/mail-callbacks.c
@@ -1024,6 +1024,42 @@ flag_messages(FolderBrowser *fb, guint32 mask, guint32 set)
return i;
}
+static int
+toggle_flags (FolderBrowser *fb, guint32 mask)
+{
+ MessageList *ml = fb->message_list;
+ GPtrArray *uids;
+ int i;
+
+ if (ml->folder == NULL)
+ return 0;
+
+ /* could just use specific callback but i'm lazy */
+ uids = g_ptr_array_new ();
+ message_list_foreach (ml, enumerate_msg, uids);
+ camel_folder_freeze (ml->folder);
+ for (i = 0; i < uids->len; i++) {
+ gint flags;
+
+ flags = camel_folder_get_message_flags (ml->folder, uids->pdata[i]);
+
+ if (flags & mask)
+ camel_folder_set_message_flags (ml->folder, uids->pdata[i], mask, 0);
+ else {
+ if ((mask & CAMEL_MESSAGE_FLAGGED) && (flags & CAMEL_MESSAGE_DELETED))
+ camel_folder_set_message_flags (ml->folder, uids->pdata[i], CAMEL_MESSAGE_DELETED, 0);
+ camel_folder_set_message_flags (ml->folder, uids->pdata[i], mask, mask);
+ }
+
+ g_free (uids->pdata[i]);
+ }
+ camel_folder_thaw (ml->folder);
+
+ g_ptr_array_free (uids, TRUE);
+
+ return i;
+}
+
void
mark_as_seen (BonoboUIComponent *uih, void *user_data, const char *path)
{
@@ -1043,6 +1079,19 @@ mark_all_as_seen (BonoboUIComponent *uih, void *user_data, const char *path)
flag_messages (FOLDER_BROWSER (user_data), CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
}
+void
+mark_as_important (BonoboUIComponent *uih, void *user_data, const char *path)
+{
+ flag_messages (FOLDER_BROWSER (user_data), CAMEL_MESSAGE_DELETED, 0);
+ flag_messages (FOLDER_BROWSER (user_data), CAMEL_MESSAGE_FLAGGED, CAMEL_MESSAGE_FLAGGED);
+}
+
+void
+toggle_as_important (BonoboUIComponent *uih, void *user_data, const char *path)
+{
+ toggle_flags (FOLDER_BROWSER (user_data), CAMEL_MESSAGE_FLAGGED);
+}
+
static void
do_edit_messages(CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, void *data)
{
diff --git a/mail/mail-callbacks.h b/mail/mail-callbacks.h
index 836401e520..cb7ee409e4 100644
--- a/mail/mail-callbacks.h
+++ b/mail/mail-callbacks.h
@@ -85,6 +85,9 @@ void invert_selection (BonoboUIComponent *uih, void *user_data, const char
void mark_as_seen (BonoboUIComponent *uih, void *user_data, const char *path);
void mark_all_as_seen (BonoboUIComponent *uih, void *user_data, const char *path);
void mark_as_unseen (BonoboUIComponent *uih, void *user_data, const char *path);
+void mark_as_important (BonoboUIComponent *uih, void *user_data, const char *path);
+void toggle_as_important (BonoboUIComponent *uih, void *user_data, const char *path);
+
void edit_message (BonoboUIComponent *uih, void *user_data, const char *path);
void open_message (BonoboUIComponent *uih, void *user_data, const char *path);
void expunge_folder (BonoboUIComponent *uih, void *user_data, const char *path);
diff --git a/mail/mail-config.c b/mail/mail-config.c
index dadf4e3123..1bf052fa5b 100644
--- a/mail/mail-config.c
+++ b/mail/mail-config.c
@@ -51,6 +51,7 @@
#include "Mail.h"
typedef struct {
+ gboolean show_preview;
gboolean thread_list;
gboolean hide_deleted;
gint paned_size;
@@ -72,6 +73,7 @@ typedef struct {
char *default_charset;
GHashTable *threaded_hash;
+ GHashTable *preview_hash;
} MailConfig;
static const char GCONFPATH[] = "/apps/Evolution/Mail";
@@ -793,6 +795,52 @@ mail_config_is_configured (void)
}
gboolean
+mail_config_get_show_preview (const char *uri)
+{
+ if (uri) {
+ gboolean value = FALSE;
+
+ if (!config->preview_hash)
+ config->preview_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ else
+ value = GPOINTER_TO_INT (g_hash_table_lookup (config->preview_hash, uri));
+
+ if (!value) {
+ /* just in case we got a NULL because it just wasn't in the hash table yet */
+ gboolean def;
+ char *str;
+
+ str = g_strdup_printf ("=%s/config/Mail=/Preview/%s", evolution_dir, uri);
+ value = gnome_config_get_bool_with_default (str, &def);
+ g_free (str);
+
+ if (!def) {
+ g_hash_table_insert (config->preview_hash, g_strdup (uri),
+ GINT_TO_POINTER (value));
+ return value;
+ }
+ } else
+ return value;
+ }
+
+ /* return the default value */
+
+ return config->show_preview;
+}
+
+void
+mail_config_set_show_preview (const char *uri, gboolean value)
+{
+ if (uri) {
+ if (!config->preview_hash)
+ config->preview_hash = g_hash_table_new (g_str_hash, g_str_equal);
+
+ g_hash_table_insert (config->preview_hash, g_strdup (uri), GINT_TO_POINTER (value));
+ } else
+ config->show_preview = value;
+}
+
+gboolean
mail_config_get_thread_list (const char *uri)
{
if (uri) {
diff --git a/mail/mail-config.h b/mail/mail-config.h
index a068e9f4ac..bd030f6f28 100644
--- a/mail/mail-config.h
+++ b/mail/mail-config.h
@@ -107,6 +107,9 @@ gboolean mail_config_is_configured (void);
gboolean mail_config_get_thread_list (const char *uri);
void mail_config_set_thread_list (const char *uri, gboolean value);
+gboolean mail_config_get_show_preview (const char *uri);
+void mail_config_set_show_preview (const char *uri, gboolean value);
+
gboolean mail_config_get_hide_deleted (void);
void mail_config_set_hide_deleted (gboolean value);
diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c
index f59f322a3d..ac1d58ab19 100644
--- a/mail/mail-send-recv.c
+++ b/mail/mail-send-recv.c
@@ -50,6 +50,10 @@
#include "mail-ops.h"
#include "mail-send-recv.h"
+#include "folder-browser-factory.h"
+#include "folder-browser.h"
+#include "e-util/e-list.h"
+
#define d(x)
/* ms between status updates to the gui */
@@ -164,6 +168,8 @@ static void
free_send_data(void)
{
struct _send_data *data = send_data;
+ EList *list;
+ EIterator *it;
g_assert(g_hash_table_size(data->active) == 0);
@@ -179,6 +185,16 @@ free_send_data(void)
}
g_free(data);
send_data = NULL;
+
+ list = folder_browser_factory_get_control_list ();
+ for (it = e_list_get_iterator (list); e_iterator_is_valid (it); e_iterator_next (it)) {
+ BonoboControl *control = e_iterator_get (it);
+ if (control) {
+ FolderBrowser *fb = bonobo_control_get_widget (control);
+ if (fb && fb->folder)
+ mail_sync_folder (fb->folder, NULL, NULL);
+ }
+ }
}