aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2001-06-16 05:40:12 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2001-06-16 05:40:12 +0800
commit7395fd6ba14d1267ec54719687d461ac7707f8fb (patch)
treeaee5d69a1aec941182074bc5627776f4abc1f101 /mail
parentf0d0478ea1e4f44df4743554808ff04d887b3038 (diff)
downloadgsoc2013-evolution-7395fd6ba14d1267ec54719687d461ac7707f8fb.tar
gsoc2013-evolution-7395fd6ba14d1267ec54719687d461ac7707f8fb.tar.gz
gsoc2013-evolution-7395fd6ba14d1267ec54719687d461ac7707f8fb.tar.bz2
gsoc2013-evolution-7395fd6ba14d1267ec54719687d461ac7707f8fb.tar.lz
gsoc2013-evolution-7395fd6ba14d1267ec54719687d461ac7707f8fb.tar.xz
gsoc2013-evolution-7395fd6ba14d1267ec54719687d461ac7707f8fb.tar.zst
gsoc2013-evolution-7395fd6ba14d1267ec54719687d461ac7707f8fb.zip
Implemented.
2001-06-15 Jeffrey Stedfast <fejj@ximian.com> * component-factory.c (destination_folder_handle_drop): Implemented. * message-list.c (message_list_construct): Don't connect to the DnD signals here. (message_list_drag_data_get): Removed. (add_uid): Removed. * folder-browser.c (my_folder_browser_init): Connect to DnD signals. (message_list_drag_data_get): Implemented. svn path=/trunk/; revision=10257
Diffstat (limited to 'mail')
-rw-r--r--mail/ChangeLog12
-rw-r--r--mail/component-factory.c21
-rw-r--r--mail/folder-browser.c237
-rw-r--r--mail/message-list.c128
4 files changed, 235 insertions, 163 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index ceabc5f8a5..17d70172d4 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,5 +1,17 @@
2001-06-15 Jeffrey Stedfast <fejj@ximian.com>
+ * component-factory.c (destination_folder_handle_drop): Implemented.
+
+ * message-list.c (message_list_construct): Don't connect to the
+ DnD signals here.
+ (message_list_drag_data_get): Removed.
+ (add_uid): Removed.
+
+ * folder-browser.c (my_folder_browser_init): Connect to DnD signals.
+ (message_list_drag_data_get): Implemented.
+
+2001-06-15 Jeffrey Stedfast <fejj@ximian.com>
+
* mail-ops.c (mail_send_message): Fixed misuse of an uninitialized
variable.
diff --git a/mail/component-factory.c b/mail/component-factory.c
index a4b95c30aa..de73ff269a 100644
--- a/mail/component-factory.c
+++ b/mail/component-factory.c
@@ -68,7 +68,7 @@ static GHashTable *storages_hash;
static char *accepted_dnd_types[] = {
"message/rfc822", /* if we drag from nautilus or something... */
- "x-evolution-folder-dnd", /* if we drag from an evolution folder... */
+ "x-evolution-dnd", /* if we drag from an evolution folder... */
NULL
};
@@ -345,19 +345,28 @@ destination_folder_handle_drop (EvolutionShellComponentDndDestinationFolder *fol
camel_object_unref (CAMEL_OBJECT (stream));
} else {
/* x-evolution-dnd */
- char *uri, *in, *inptr, *inend;
+ char *url, *name, *in, *inptr, *inend;
CamelFolder *source;
GPtrArray *uids;
- /* format is "uri uid1\0uid2\0uid3\0...\0uidn" */
+ /* format: "url folder_name uid1\0uid2\0uid3\0...\0uidn" */
in = data->bytes._buffer;
inend = in + data->bytes._length;
inptr = strchr (in, ' ');
- uri = g_strndup (data->bytes._buffer, inptr - in);
- source = mail_tool_uri_to_folder (uri, NULL);
- g_free (uri);
+ url = g_strndup (in, inptr - in);
+
+ name = inptr + 1;
+ inptr = strchr (name, ' ');
+ name = g_strndup (name, inptr - name);
+
+ source = mail_tool_get_folder_from_urlname (url, name, 0, NULL);
+ g_free (name);
+ g_free (url);
+
+ if (!source)
+ return FALSE;
/* split the uids */
inptr++;
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);
}
diff --git a/mail/message-list.c b/mail/message-list.c
index 3ae49c8e35..64729048f1 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -153,15 +153,6 @@ static struct {
{ NULL, NULL }
};
-enum DndTargetTyhpe {
- DND_TARGET_LIST_TYPE_URI,
-};
-#define URI_LIST_TYPE "text/uri-list"
-static GtkTargetEntry drag_types[] = {
- { URI_LIST_TYPE, 0, DND_TARGET_LIST_TYPE_URI },
-};
-static const int num_drag_types = sizeof (drag_types) / sizeof (drag_types[0]);
-
#ifdef SMART_ADDRESS_COMPARE
static EMailAddress *
e_mail_address_new (const char *address)
@@ -218,12 +209,12 @@ e_mail_address_compare (gconstpointer address1, gconstpointer address2)
return g_strcasecmp (addr1->address, addr2->address);
}
-
+
if (!addr1->wname)
return -1;
if (!addr2->wname)
return 1;
-
+
if (!addr1->wname->last && !addr2->wname->last) {
/* neither has a last name - default to address? */
/* FIXME: what do we compare next? */
@@ -232,30 +223,30 @@ e_mail_address_compare (gconstpointer address1, gconstpointer address2)
return g_strcasecmp (addr1->address, addr2->address);
}
-
+
if (!addr1->wname->last)
return -1;
if (!addr2->wname->last)
return 1;
-
+
retval = g_strcasecmp (addr1->wname->last, addr2->wname->last);
if (retval)
return retval;
-
+
/* last names are identical - compare first names */
-
+
if (!addr1->wname->first && !addr2->wname->first)
return g_strcasecmp (addr1->address, addr2->address);
-
+
if (!addr1->wname->first)
return -1;
if (!addr2->wname->first)
return 1;
-
+
retval = g_strcasecmp (addr1->wname->first, addr2->wname->first);
if (retval)
return retval;
-
+
return g_strcasecmp (addr1->address, addr2->address);
}
#endif /* SMART_ADDRESS_COMPARE */
@@ -381,7 +372,7 @@ message_list_select (MessageList *message_list, int base_row,
CamelMessageInfo *info;
int vrow, last;
ETree *et = message_list->tree;
-
+
if (!GTK_WIDGET_HAS_FOCUS (message_list))
gtk_widget_grab_focus (GTK_WIDGET (message_list));
@@ -454,73 +445,6 @@ message_list_select_uid (MessageList *message_list, const char *uid)
}
}
-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)
-{
- MessageList *mlist = (MessageList *) user_data;
- CamelMessageInfo *minfo;
- GPtrArray *uids = NULL;
- char *tmpl, *tmpdir, *filename, *subject;
-
- switch (info) {
- case DND_TARGET_LIST_TYPE_URI:
- /* 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;
- }
-
- minfo = get_message_info (mlist, path);
- if (minfo == NULL) {
- g_warning("Row %d is invalid", row);
- g_free(tmpl);
- return;
- }
- 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);
-
- uids = g_ptr_array_new ();
- message_list_foreach (mlist, add_uid, uids);
-
- mail_msg_wait(mail_save_messages(mlist->folder, uids, filename, NULL, NULL));
-
- gtk_selection_data_set (selection_data, selection_data->target, 8,
- (guchar *) filename, strlen (filename));
-
- g_free (tmpl);
- g_free (filename);
- break;
- default:
- break;
- }
-}
-
/*
* SimpleTableModel::col_count
*/
@@ -1223,32 +1147,32 @@ static void
message_list_construct (MessageList *message_list)
{
ETableExtras *extras;
-
+
message_list->model =
e_tree_memory_callbacks_new (ml_tree_icon_at,
-
+
ml_column_count,
-
+
ml_has_save_id,
ml_get_save_id,
-
+
ml_has_get_node_by_id,
ml_get_node_by_id,
-
+
ml_tree_value_at,
ml_tree_set_value_at,
ml_tree_is_cell_editable,
-
+
ml_duplicate_value,
ml_free_value,
ml_initialize_value,
ml_value_is_empty,
ml_value_to_string,
-
+
message_list);
gtk_object_ref (GTK_OBJECT (message_list->model));
gtk_object_sink (GTK_OBJECT (message_list->model));
-
+
e_tree_memory_set_expanded_default(E_TREE_MEMORY(message_list->model), TRUE);
/*
@@ -1260,26 +1184,18 @@ message_list_construct (MessageList *message_list)
extras,
EVOLUTION_ETSPECDIR "/message-list.etspec",
NULL);
-
+
message_list->tree = e_tree_scrolled_get_tree(E_TREE_SCROLLED (message_list));
e_tree_root_node_set_visible (message_list->tree, FALSE);
-
+
gtk_object_sink (GTK_OBJECT (extras));
-
+
gtk_signal_connect (GTK_OBJECT (message_list->tree), "cursor_activated",
GTK_SIGNAL_FUNC (on_cursor_activated_cmd),
message_list);
-
+
gtk_signal_connect (GTK_OBJECT (message_list->tree), "click",
GTK_SIGNAL_FUNC (on_click), message_list);
-
- /* drag & drop */
- e_tree_drag_source_set (message_list->tree, GDK_BUTTON1_MASK,
- drag_types, num_drag_types, GDK_ACTION_MOVE);
-
- gtk_signal_connect (GTK_OBJECT (message_list->tree), "drag_data_get",
- GTK_SIGNAL_FUNC (message_list_drag_data_get),
- message_list);
}
GtkWidget *