#if 0
void summary_processing(SummaryView *summaryview, GSList * mlist);
#endif
-static void summary_filter_func (GtkCTree *ctree,
- GtkCTreeNode *node,
- gpointer data);
+static void summary_filter_func (MsgInfo *msginfo);
static void summary_colorlabel_menu_item_activate_cb
(GtkWidget *widget,
guint info,
guint time,
SummaryView *summaryview);
+static void summary_drag_data_received(GtkWidget *widget,
+ GdkDragContext *drag_context,
+ gint x,
+ gint y,
+ GtkSelectionData *data,
+ guint info,
+ guint time,
+ SummaryView *summaryview);
+static gboolean summary_drag_motion_cb(GtkWidget *widget,
+ GdkDragContext *context,
+ gint x,
+ gint y,
+ guint time,
+ SummaryView *summaryview);
/* custom compare functions for sorting */
static gboolean summary_update_msg (gpointer source, gpointer data);
-GtkTargetEntry summary_drag_types[1] =
+GtkTargetEntry summary_drag_types[2] =
{
- {"text/plain", GTK_TARGET_SAME_APP, TARGET_DUMMY}
+ {"text/uri-list", 0, TARGET_MAIL_URI_LIST},
+ {"sylpheed-claws/internal", GTK_TARGET_SAME_APP, TARGET_DUMMY}
};
static GtkItemFactoryEntry summary_popup_entries[] =
summaryview->msginfo_update_callback_id =
hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, summary_update_msg, (gpointer) summaryview);
- summaryview->target_list = gtk_target_list_new(summary_drag_types, 1);
+ summaryview->target_list = gtk_target_list_new(summary_drag_types, 2);
summaryview->quicksearch = quicksearch;
msginfo = gtk_ctree_node_get_row_data(ctree, node);
/* Find msg with matching flags but ignore messages with
ignore flags, if searching for new or unread messages */
- if (!(((flags & (MSG_NEW | MSG_UNREAD)) != 0) && MSG_IS_IGNORE_THREAD(msginfo->flags)) &&
- (msginfo && (msginfo->flags.perm_flags & flags) != 0))
+ if ((msginfo && (msginfo->flags.perm_flags & flags) != 0) &&
+ !(((flags & (MSG_NEW | MSG_UNREAD)) != 0) && MSG_IS_IGNORE_THREAD(msginfo->flags))
+ )
break;
}
void summary_filter(SummaryView *summaryview, gboolean selected_only)
{
+ GSList *mlist = NULL, *cur_list;
summary_lock(summaryview);
folder_item_update_freeze();
for (cur = GTK_CLIST(summaryview->ctree)->selection;
cur != NULL && cur->data != NULL; cur = cur->next) {
- summary_filter_func(GTK_CTREE(summaryview->ctree),
- GTK_CTREE_NODE(cur->data),
- summaryview);
+ mlist = g_slist_prepend(mlist,
+ procmsg_msginfo_new_ref(
+ GTKUT_CTREE_NODE_GET_ROW_DATA(cur->data)));
}
+ mlist = g_slist_reverse(mlist);
} else {
- gtk_ctree_pre_recursive(GTK_CTREE(summaryview->ctree), NULL,
- GTK_CTREE_FUNC(summary_filter_func),
- summaryview);
+ mlist = folder_item_get_msg_list(summaryview->folder_item);
+ }
+ for (cur_list = mlist; cur_list; cur_list = cur_list->next) {
+ summary_filter_func((MsgInfo *)cur_list->data);
}
+ filtering_move_and_copy_msgs(mlist);
+ for (cur_list = mlist; cur_list; cur_list = cur_list->next) {
+ procmsg_msginfo_free((MsgInfo *)cur_list->data);
+ }
+ g_slist_free(mlist);
+
gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
folder_item_update_thaw();
summary_show(summaryview, summaryview->folder_item);
}
-static void summary_filter_func(GtkCTree *ctree, GtkCTreeNode *node,
- gpointer data)
+static void summary_filter_func(MsgInfo *msginfo)
{
MailFilteringData mail_filtering_data;
- MsgInfo *msginfo = GTKUT_CTREE_NODE_GET_ROW_DATA(node);
mail_filtering_data.msginfo = msginfo;
if (hooks_invoke(MAIL_MANUAL_FILTERING_HOOKLIST, &mail_filtering_data))
G_CALLBACK(summary_drag_data_get),
summaryview);
+ gtk_drag_dest_set(ctree, GTK_DEST_DEFAULT_ALL & ~GTK_DEST_DEFAULT_HIGHLIGHT,
+ summary_drag_types, 2,
+ GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_DEFAULT);
+
+ g_signal_connect(G_OBJECT(ctree), "drag_data_received",
+ G_CALLBACK(summary_drag_data_received),
+ summaryview);
+
+ g_signal_connect(G_OBJECT(ctree), "drag_motion",
+ G_CALLBACK(summary_drag_motion_cb),
+ summaryview);
+
return ctree;
}
(ctree, GTK_CTREE_NODE(cur->data));
tmp2 = procmsg_get_message_file(msginfo);
if (!tmp2) continue;
- tmp1 = g_strconcat("file://", tmp2, NULL);
+ if (msginfo->subject) {
+ gchar *san_subject = g_strdup(msginfo->subject);
+ gchar *dest = NULL;
+ subst_for_filename(san_subject);
+ dest = g_strdup_printf("%s%s%s.%d.txt",
+ get_tmp_dir(),
+ G_DIR_SEPARATOR_S,
+ san_subject, msginfo->msgnum);
+ g_free(san_subject);
+ san_subject = g_filename_from_utf8(dest, -1, NULL, NULL, NULL);
+ g_free(dest);
+ dest = san_subject;
+ if (copy_file(tmp2, dest, TRUE) == 0) {
+ g_free(tmp2);
+ tmp2 = dest;
+ }
+ }
+ tmp1 = g_strconcat("file://", tmp2, "\r\n", NULL);
g_free(tmp2);
if (!mail_list) {
}
}
+static gboolean summary_drag_motion_cb(GtkWidget *widget,
+ GdkDragContext *context,
+ gint x,
+ gint y,
+ guint time,
+ SummaryView *summaryview)
+{
+ FolderItem *item = summaryview->folder_item;
+ if (!(item && item->folder && folder_item_parent(item) != NULL
+ && FOLDER_CLASS(item->folder)->add_msg != NULL)) {
+ gdk_drag_status(context, 0, time);
+ return FALSE;
+ } else if (gtk_drag_get_source_widget(context) ==
+ mainwindow_get_mainwindow()->folderview->ctree) {
+ /* no folders */
+ gdk_drag_status(context, 0, time);
+ return FALSE;
+ } else if (gtk_drag_get_source_widget(context) ==
+ summaryview->ctree) {
+ /* not from same folder */
+ gdk_drag_status(context, 0, time);
+ return FALSE;
+ } else {
+ gdk_drag_status(context, GDK_ACTION_COPY, time);
+ return TRUE;
+ }
+}
+
+static void summary_drag_data_received(GtkWidget *widget,
+ GdkDragContext *drag_context,
+ gint x,
+ gint y,
+ GtkSelectionData *data,
+ guint info,
+ guint time,
+ SummaryView *summaryview)
+{
+ if (info == TARGET_MAIL_URI_LIST) {
+ FolderItem *item = summaryview->folder_item;
+ if (!item) {
+ gtk_drag_finish(drag_context, FALSE, FALSE, time);
+ return;
+ } else {
+ folderview_finish_dnd(data->data, drag_context, time, item);
+ }
+ }
+}
+
/* custom compare functions for sorting */
summary_ignore_thread(summaryview);
}
-#if 0 /* OLD PROCESSING */
-static gboolean processing_apply_func(GNode *node, gpointer data)
-{
- FolderItem *item;
- GSList * processing;
- SummaryView * summaryview = (SummaryView *) data;
-
- if (node == NULL)
- return FALSE;
-
- item = node->data;
- /* prevent from the warning */
- if (item->path == NULL)
- return FALSE;
- processing = item->prefs->processing;
-
-
- if (processing != NULL) {
- gchar * buf;
- GSList * mlist;
- GSList * cur;
-
- buf = g_strdup_printf(_("Processing (%s)..."), item->path);
- debug_print(buf);
- STATUSBAR_PUSH(summaryview->mainwin, buf);
- g_free(buf);
-
- mlist = folder_item_get_msg_list(item);
- for(cur = mlist ; cur != NULL && cur->data != NULL ; cur = cur->next) {
- MsgInfo * msginfo;
-
- msginfo = (MsgInfo *) cur->data;
- filter_message_by_msginfo(processing, msginfo, NULL);
- procmsg_msginfo_free(msginfo);
- }
-
- g_slist_free(mlist);
-
- STATUSBAR_POP(summaryview->mainwin);
- }
-
-
- return FALSE;
-}
-
-void processing_apply(SummaryView * summaryview)
-{
- GList * cur;
-
- for (cur = folder_get_list() ; cur != NULL && cur->data != NULL ; cur = g_list_next(cur)) {
- Folder *folder;
-
- folder = (Folder *) cur->data;
- g_node_traverse(folder->node, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
- processing_apply_func, summaryview);
- }
-}
-#endif
-
void summary_toggle_show_read_messages(SummaryView *summaryview)
{
FolderItemUpdateData source;