aboutsummaryrefslogtreecommitdiffstats
path: root/mail/folder-browser.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/folder-browser.c')
-rw-r--r--mail/folder-browser.c237
1 files changed, 186 insertions, 51 deletions
diff --git a/mail/folder-browser.c b/mail/folder-browser.c
index 663dd40f6c..25c8a6c289 100644
--- a/mail/folder-browser.c
+++ b/mail/folder-browser.c
@@ -51,6 +51,25 @@
#define PARENT_TYPE (gtk_table_get_type ())
+
+enum DndTargetType {
+ DND_TARGET_TYPE_X_EVOLUTION_DND,
+ DND_TARGET_TYPE_MESSAGE_RFC822,
+ DND_TARGET_TYPE_URI_LIST,
+};
+
+#define X_EVOLUTION_DND_TYPE "x-evolution-dnd"
+#define MESSAGE_RFC822_TYPE "message/rfc822"
+#define URI_LIST_TYPE "text/uri-list"
+
+static GtkTargetEntry drag_types[] = {
+ { X_EVOLUTION_DND_TYPE, 0, DND_TARGET_TYPE_X_EVOLUTION_DND },
+ { MESSAGE_RFC822_TYPE, 0, DND_TARGET_TYPE_MESSAGE_RFC822 },
+ { URI_LIST_TYPE, 0, DND_TARGET_TYPE_URI_LIST },
+};
+
+static const int num_drag_types = sizeof (drag_types) / sizeof (drag_types[0]);
+
static void fb_resize_cb (GtkWidget *w, GtkAllocation *a);
static void update_unread_count (CamelObject *, gpointer, gpointer);
@@ -168,7 +187,7 @@ update_unread_count_main(CamelObject *object, gpointer event_data, gpointer user
}
static void
-update_unread_count(CamelObject *object, gpointer event_data, gpointer user_data)
+update_unread_count (CamelObject *object, gpointer event_data, gpointer user_data)
{
CamelFolder *folder = (CamelFolder *)object;
FolderBrowser *fb = user_data;
@@ -182,47 +201,153 @@ update_unread_count(CamelObject *object, gpointer event_data, gpointer user_data
}
static void
+add_uid (MessageList *ml, const char *uid, gpointer data)
+{
+ g_ptr_array_add ((GPtrArray *) data, g_strdup (uid));
+}
+
+static void
+message_list_drag_data_get (ETree *tree,
+ int row,
+ ETreePath path,
+ int col,
+ GdkDragContext *context,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time,
+ gpointer user_data)
+{
+ FolderBrowser *fb = FOLDER_BROWSER (user_data);
+ GPtrArray *uids = NULL;
+
+ switch (info) {
+ case DND_TARGET_TYPE_URI_LIST:
+ {
+ char *tmpl, *tmpdir, *filename, *subject;
+ CamelMessageInfo *minfo;
+
+ /* drag & drop into nautilus */
+ tmpl = g_strdup ("/tmp/evolution.XXXXXX");
+#ifdef HAVE_MKDTEMP
+ tmpdir = mkdtemp (tmpl);
+#else
+ tmpdir = mktemp (tmpl);
+ if (tmpdir) {
+ if (mkdir (tmpdir, S_IRWXU) == -1)
+ tmpdir = NULL;
+ }
+#endif
+ if (!tmpdir) {
+ g_free (tmpl);
+ return;
+ }
+ g_free (tmpl);
+
+ uids = g_ptr_array_new ();
+ message_list_foreach (fb->message_list, add_uid, uids);
+
+ minfo = camel_folder_get_message_info (fb->folder, uids->pdata[0]);
+
+ subject = g_strdup (camel_message_info_subject (minfo));
+ e_filename_make_safe (subject);
+ filename = g_strdup_printf ("%s/%s.eml", tmpdir, subject);
+ g_free (subject);
+
+ mail_msg_wait (mail_save_messages (fb->folder, uids, filename, NULL, NULL));
+
+ gtk_selection_data_set (selection_data, selection_data->target, 8,
+ (guchar *) filename, strlen (filename));
+ }
+ break;
+ case DND_TARGET_TYPE_MESSAGE_RFC822:
+ break;
+ case DND_TARGET_TYPE_X_EVOLUTION_DND:
+ {
+ GByteArray *array;
+ char *uri;
+ int i;
+
+ /* format: "url folder_name uid1\0uid2\0uid3\0...\0uidn" */
+
+ uids = g_ptr_array_new ();
+ message_list_foreach (fb->message_list, add_uid, uids);
+
+ uri = camel_url_to_string (CAMEL_SERVICE (camel_folder_get_parent_store (fb->folder))->url, 0);
+
+ /* write the url portion */
+ array = g_byte_array_new ();
+ g_byte_array_append (array, uri, strlen (uri));
+ g_byte_array_append (array, " ", 1);
+ g_free (uri);
+
+ /* write the folder_name portion */
+ g_byte_array_append (array, fb->folder->name, strlen (fb->folder->name));
+ g_byte_array_append (array, " ", 1);
+
+ /* write the uids */
+ for (i = 0; i < uids->len; i++) {
+ g_byte_array_append (array, uids->pdata[i], strlen (uids->pdata[i]));
+ g_free (uids->pdata[i]);
+
+ if (i + 1 < uids->len)
+ g_byte_array_append (array, "", 1);
+ }
+
+ g_ptr_array_free (uids, TRUE);
+
+ gtk_selection_data_set (selection_data, selection_data->target, 8,
+ array->data, array->len);
+
+ g_byte_array_free (array, FALSE);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void
got_folder(char *uri, CamelFolder *folder, void *data)
{
FolderBrowser *fb = data;
EvolutionStorage *storage;
-
- printf("got folder '%s' = %p\n", uri, folder);
-
+
+ d(printf ("got folder '%s' = %p\n", uri, folder));
+
if (fb->folder == folder)
goto done;
-
+
if (fb->folder)
- camel_object_unref((CamelObject *)fb->folder);
- g_free(fb->uri);
- fb->uri = g_strdup(uri);
+ camel_object_unref (CAMEL_OBJECT (fb->folder));
+ g_free (fb->uri);
+ fb->uri = g_strdup (uri);
fb->folder = folder;
-
+
if (folder == NULL)
goto done;
-
- camel_object_ref((CamelObject *)folder);
-
+
+ camel_object_ref (CAMEL_OBJECT (folder));
+
if ((storage = mail_lookup_storage (folder->parent_store))) {
gtk_object_unref (GTK_OBJECT (storage));
fb->unread_count = camel_folder_get_unread_message_count (folder);
- update_unread_count_main ((CamelObject *)folder, NULL, fb);
- camel_object_hook_event ((CamelObject *)folder, "message_changed",
+ update_unread_count_main (CAMEL_OBJECT (folder), NULL, fb);
+ camel_object_hook_event (CAMEL_OBJECT (folder), "message_changed",
update_unread_count, fb);
- camel_object_hook_event ((CamelObject *)folder, "folder_changed",
+ camel_object_hook_event (CAMEL_OBJECT (folder), "folder_changed",
update_unread_count, fb);
}
-
- gtk_widget_set_sensitive(GTK_WIDGET(fb->search), camel_folder_has_search_capability(folder));
+
+ gtk_widget_set_sensitive (GTK_WIDGET (fb->search), camel_folder_has_search_capability (folder));
message_list_set_threaded (fb->message_list, mail_config_get_thread_list (fb->uri));
- message_list_set_folder(fb->message_list, folder,
- folder_browser_is_drafts (fb) ||
- folder_browser_is_sent (fb) ||
- folder_browser_is_outbox (fb));
- vfolder_register_source(folder);
-done:
- gtk_object_unref((GtkObject *)fb);
-
+ message_list_set_folder (fb->message_list, folder,
+ folder_browser_is_drafts (fb) ||
+ folder_browser_is_sent (fb) ||
+ folder_browser_is_outbox (fb));
+ vfolder_register_source (folder);
+ done:
+ gtk_object_unref (GTK_OBJECT (fb));
+
/* Sigh, i dont like this (it can be set in reconfigure folder),
but its just easier right now to do it this way */
fb->reconfigure = FALSE;
@@ -241,7 +366,7 @@ folder_browser_set_uri (FolderBrowser *folder_browser, const char *uri)
but its just easier right now to do it this way */
folder_browser->reconfigure = FALSE;
}
-
+
return TRUE;
}
@@ -260,12 +385,12 @@ folder_browser_is_drafts (FolderBrowser *fb)
{
const GSList *accounts;
MailConfigAccount *account;
-
+
g_return_val_if_fail (IS_FOLDER_BROWSER (fb) && fb->uri, FALSE);
-
+
if (fb->folder == drafts_folder)
return TRUE;
-
+
accounts = mail_config_get_accounts ();
while (accounts) {
account = accounts->data;
@@ -274,6 +399,7 @@ folder_browser_is_drafts (FolderBrowser *fb)
return TRUE;
accounts = accounts->next;
}
+
return FALSE;
}
@@ -289,12 +415,12 @@ folder_browser_is_sent (FolderBrowser *fb)
{
const GSList *accounts;
MailConfigAccount *account;
-
+
g_return_val_if_fail (IS_FOLDER_BROWSER (fb) && fb->uri, FALSE);
-
+
if (fb->folder == sent_folder)
return TRUE;
-
+
accounts = mail_config_get_accounts ();
while (accounts) {
account = accounts->data;
@@ -303,6 +429,7 @@ folder_browser_is_sent (FolderBrowser *fb)
return TRUE;
accounts = accounts->next;
}
+
return FALSE;
}
@@ -325,7 +452,7 @@ folder_browser_set_message_preview (FolderBrowser *folder_browser, gboolean show
{
if (folder_browser->preview_shown == show_message_preview)
return;
-
+
g_warning ("FIXME: implement me");
}
@@ -345,15 +472,15 @@ static void
folder_browser_search_menu_activated (ESearchBar *esb, int id, FolderBrowser *fb)
{
EFilterBar *efb = (EFilterBar *)esb;
-
- printf("menyu activated\n");
-
+
+ d(printf("menu activated\n"));
+
switch (id) {
case ESB_SAVE:
- printf("Save vfolder\n");
+ d(printf("Save vfolder\n"));
if (efb->current_query) {
FilterRule *rule = vfolder_clone_rule(efb->current_query);
-
+
filter_rule_set_source(rule, FILTER_SOURCE_INCOMING);
vfolder_rule_add_source((VfolderRule *)rule, fb->uri);
vfolder_gui_add_rule((VfolderRule *)rule);
@@ -362,7 +489,8 @@ folder_browser_search_menu_activated (ESearchBar *esb, int id, FolderBrowser *fb
}
}
-static void folder_browser_config_search(EFilterBar *efb, FilterRule *rule, int id, const char *query, void *data)
+static void
+folder_browser_config_search (EFilterBar *efb, FilterRule *rule, int id, const char *query, void *data)
{
FolderBrowser *fb = FOLDER_BROWSER (data);
ESearchingTokenizer *st;
@@ -394,8 +522,9 @@ static void folder_browser_config_search(EFilterBar *efb, FilterRule *rule, int
partl = partl->next;
}
- printf("configuring search for search string '%s', rule is '%s'\n", query, rule->name);
-
+
+ d(printf("configuring search for search string '%s', rule is '%s'\n", query, rule->name));
+
mail_display_redisplay (fb->mail_display, FALSE);
}
@@ -403,16 +532,16 @@ static void
folder_browser_search_query_changed (ESearchBar *esb, FolderBrowser *fb)
{
char *search_word;
-
- printf("query changed\n");
-
+
+ d(printf("query changed\n"));
+
gtk_object_get (GTK_OBJECT (esb),
"query", &search_word,
NULL);
message_list_set_search (fb->message_list, search_word);
-
- printf("query is %s\n", search_word);
+
+ d(printf("query is %s\n", search_word));
g_free(search_word);
return;
}
@@ -1000,8 +1129,7 @@ folder_browser_gui_init (FolderBrowser *fb)
fb->vpaned = e_vpaned_new ();
gtk_widget_show (fb->vpaned);
- gtk_table_attach (
- GTK_TABLE (fb), fb->vpaned,
+ gtk_table_attach (GTK_TABLE (fb), fb->vpaned,
0, 1, 1, 3,
GTK_FILL | GTK_EXPAND,
GTK_FILL | GTK_EXPAND,
@@ -1194,10 +1322,17 @@ my_folder_browser_init (GtkObject *object)
gtk_signal_connect (GTK_OBJECT (fb->message_list->tree),
"double_click", GTK_SIGNAL_FUNC (on_double_click), fb);
-
- gtk_signal_connect (GTK_OBJECT(fb->message_list), "message_selected",
+
+ gtk_signal_connect (GTK_OBJECT (fb->message_list), "message_selected",
on_message_selected, fb);
-
+
+ /* drag & drop */
+ e_tree_drag_source_set (fb->message_list->tree, GDK_BUTTON1_MASK,
+ drag_types, num_drag_types, GDK_ACTION_MOVE);
+
+ gtk_signal_connect (GTK_OBJECT (fb->message_list->tree), "tree_drag_data_get",
+ GTK_SIGNAL_FUNC (message_list_drag_data_get), fb);
+
folder_browser_gui_init (fb);
}