/* message handling */
static void summary_mark_row (SummaryView *summaryview,
GtkCTreeNode *row);
+static void summary_lock_row (SummaryView *summaryview,
+ GtkCTreeNode *row);
static void summary_mark_row_as_read (SummaryView *summaryview,
GtkCTreeNode *row);
static void summary_mark_row_as_unread (SummaryView *summaryview,
GtkCTreeNode *row);
-static void summary_mark_row_as_locked (SummaryView *summaryview,
- GtkCTreeNode *row);
static void summary_delete_row (SummaryView *summaryview,
GtkCTreeNode *row);
static void summary_unmark_row (SummaryView *summaryview,
GtkCTreeNode *node,
gpointer data);
+void summary_processing(SummaryView *summaryview, GSList * mlist);
static void summary_filter_func (GtkCTree *ctree,
GtkCTreeNode *node,
gpointer data);
SummaryView *summaryview);
static void summary_score_clicked (GtkWidget *button,
SummaryView *summaryview);
+static void summary_locked_clicked (GtkWidget *button,
+ SummaryView *summaryview);
static void summary_start_drag (GtkWidget *widget,
int button,
static gint summary_cmp_by_score (GtkCList *clist,
gconstpointer ptr1,
gconstpointer ptr2);
+static gint summary_cmp_by_locked (GtkCList *clist,
+ gconstpointer ptr1, gconstpointer ptr2);
static gint summary_cmp_by_label (GtkCList *clist,
gconstpointer ptr1,
gconstpointer ptr2);
-#if MARK_ALL_READ
-static void summary_mark_all_read (SummaryView *summaryview);
-#endif
-
GtkTargetEntry summary_drag_types[1] =
{
{"text/plain", GTK_TARGET_SAME_APP, TARGET_DUMMY}
{N_("/_Mark/---"), NULL, NULL, 0, "<Separator>"},
{N_("/_Mark/Mark as unr_ead"), NULL, summary_mark_as_unread, 0, NULL},
{N_("/_Mark/Mark as rea_d"), NULL, summary_mark_as_read, 0, NULL},
- {N_("/_Mark/Mark as _locked"), NULL, summary_mark_as_locked, 0, NULL},
{N_("/_Mark/Mark all read"), NULL, summary_mark_all_read, 0, NULL},
{N_("/_Mark/Ignore thread"), NULL, summary_ignore_thread, 0, NULL},
{N_("/_Mark/Unignore thread"), NULL, summary_unignore_thread, 0, NULL},
N_("Date"), /* S_COL_DATE */
N_("Size"), /* S_COL_SIZE */
N_("No."), /* S_COL_NUMBER */
- N_("Score") /* S_COL_SCORE */
+ N_("Score"), /* S_COL_SCORE */
+ N_("L") /* S_COL_LOCKED */
};
SummaryView *summary_create(void)
}
folder_update_op_count();
}
- else if (!summaryview->filtering_happened) {
- summary_write_cache(summaryview);
- }
-
- summaryview->filtering_happened = FALSE;
-
+
+ summary_write_cache(summaryview);
+
summaryview->folderview->opened = selected_node;
gtk_clist_freeze(GTK_CLIST(ctree));
mlist = item->folder->get_msg_list(item->folder, item, !update_cache);
+ summary_processing(summaryview, mlist);
+
for(cur = mlist ; cur != NULL ; cur = g_slist_next(cur)) {
MsgInfo * msginfo = (MsgInfo *) cur->data;
menu_set_sensitive(ifactory, "/Mark/Mark as unread", TRUE);
menu_set_sensitive(ifactory, "/Mark/Mark as read", TRUE);
- menu_set_sensitive(ifactory, "/Mark/Mark as locked", TRUE);
menu_set_sensitive(ifactory, "/Mark/Mark all read", TRUE);
menu_set_sensitive(ifactory, "/Mark/Ignore thread", TRUE);
menu_set_sensitive(ifactory, "/Mark/Unignore thread", TRUE);
for (; node != NULL; node = GTK_CTREE_NODE_PREV(node)) {
msginfo = gtk_ctree_node_get_row_data(ctree, node);
- if (!MSG_IS_DELETED(msginfo->flags)) break;
+ if (!MSG_IS_DELETED(msginfo->flags))
+ break;
}
return node;
for (; node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
msginfo = gtk_ctree_node_get_row_data(ctree, node);
- if (!MSG_IS_DELETED(msginfo->flags)) break;
+ if (!MSG_IS_DELETED(msginfo->flags))
+ break;
}
return node;
case SORT_BY_SCORE:
cmp_func = (GtkCListCompareFunc)summary_cmp_by_score;
break;
+ case SORT_BY_LOCKED:
+ cmp_func = (GtkCListCompareFunc)summary_cmp_by_locked;
+ break;
case SORT_BY_LABEL:
cmp_func = (GtkCListCompareFunc)summary_cmp_by_label;
break;
text[col_pos[S_COL_SCORE]] = itos_buf(col_score, msginfo->threadscore);
#else
text[col_pos[S_COL_SCORE]] = itos_buf(col_score, msginfo->score);
-#endif
+#endif
if (msginfo->date_t) {
procheader_date_get_localtime(date_modified,
debug_print(_("Message %d is marked\n"), msginfo->msgnum);
}
+static void summary_lock_row(SummaryView *summaryview, GtkCTreeNode *row)
+{
+ /* almost verbatim summary_mark_row(); may want a menu action? */
+ gboolean changed = FALSE;
+ GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+ MsgInfo *msginfo;
+
+ msginfo = gtk_ctree_node_get_row_data(ctree, row);
+ if (MSG_IS_DELETED(msginfo->flags))
+ summaryview->deleted--;
+ if (MSG_IS_MOVE(msginfo->flags)) {
+ summaryview->moved--;
+ changed = TRUE;
+ }
+ if (MSG_IS_COPY(msginfo->flags)) {
+ summaryview->copied--;
+ changed = TRUE;
+ }
+ if (changed && !prefs_common.immediate_exec) {
+ msginfo->to_folder->op_count--;
+ if (msginfo->to_folder->op_count == 0)
+ folderview_update_item(msginfo->to_folder, 0);
+ }
+ msginfo->to_folder = NULL;
+ MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
+ MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
+ MSG_SET_PERM_FLAGS(msginfo->flags, MSG_LOCKED);
+ CHANGE_FLAGS(msginfo);
+ summary_set_row_marks(summaryview, row);
+ debug_print(_("Message %d is locked\n"), msginfo->msgnum);
+}
+
void summary_mark(SummaryView *summaryview)
{
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
summary_set_row_marks(summaryview, row);
}
-static void summary_mark_row_as_locked(SummaryView *summaryview,
- GtkCTreeNode *row)
-{
- GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
- MsgInfo *msginfo;
-
- msginfo = gtk_ctree_node_get_row_data(ctree, row);
- if (MSG_IS_DELETED(msginfo->flags)) {
- msginfo->to_folder = NULL;
- MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
- summaryview->deleted--;
- }
- if (!MSG_IS_LOCKED(msginfo->flags)) {
- MSG_SET_PERM_FLAGS(msginfo->flags, MSG_LOCKED);
- debug_print(_("Message %d is marked as locked\n"),
- msginfo->msgnum);
- }
-
- CHANGE_FLAGS(msginfo);
-
- summary_set_row_marks(summaryview, row);
-}
-
void summary_mark_as_unread(SummaryView *summaryview)
{
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
summary_status_show(summaryview);
}
-void summary_mark_as_locked(SummaryView *summaryview)
-{
- GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
- GList *cur;
-
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
- summary_mark_row_as_locked(summaryview,
- GTK_CTREE_NODE(cur->data));
-
- summary_status_show(summaryview);
-}
-
static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
{
gboolean changed = FALSE;
msginfo = gtk_ctree_node_get_row_data(ctree, row);
+ if (MSG_IS_LOCKED(msginfo->flags)) return;
+
if (MSG_IS_DELETED(msginfo->flags)) return;
if (MSG_IS_MOVE(msginfo->flags)) {
}
}
+void summary_processing(SummaryView *summaryview, GSList * mlist)
+{
+ GSList * processing_list;
+ FolderItem * folder_item;
+ GSList * cur;
+ gchar * id;
+ gchar * buf;
+
+ folder_item = summaryview->folder_item;
+ if (folder_item == NULL)
+ return;
+
+ processing_list = folder_item->prefs->processing;
+
+ if (processing_list == NULL)
+ return;
+
+ summary_lock(summaryview);
+
+ buf = g_strdup_printf(_("Processing (%s)..."), folder_item->path);
+ debug_print(buf);
+ STATUSBAR_PUSH(summaryview->mainwin, buf);
+ g_free(buf);
+
+ main_window_cursor_wait(summaryview->mainwin);
+
+ summaryview->folder_table = g_hash_table_new(NULL, NULL);
+
+ for(cur = mlist ; cur != NULL ; cur = cur->next) {
+ MsgInfo * msginfo;
+
+ msginfo = (MsgInfo *) cur->data;
+ filter_msginfo_move_or_delete(processing_list, msginfo,
+ summaryview->folder_table);
+ }
+
+ folder_item_scan_foreach(summaryview->folder_table);
+ folderview_update_item_foreach(summaryview->folder_table);
+
+ g_hash_table_destroy(summaryview->folder_table);
+ summaryview->folder_table = NULL;
+
+ if (prefs_common.immediate_exec) {
+ summary_unlock(summaryview);
+ summary_execute(summaryview);
+ summary_lock(summaryview);
+ } else
+ summary_status_show(summaryview);
+
+ debug_print(_("done.\n"));
+ STATUSBAR_POP(summaryview->mainwin);
+ main_window_cursor_normal(summaryview->mainwin);
+
+ summary_unlock(summaryview);
+}
+
void summary_filter(SummaryView *summaryview)
{
if (!prefs_common.fltlist && !global_processing) {
CLIST_BUTTON_SIGNAL_CONNECT(S_COL_FROM , summary_from_clicked);
CLIST_BUTTON_SIGNAL_CONNECT(S_COL_SUBJECT, summary_subject_clicked);
CLIST_BUTTON_SIGNAL_CONNECT(S_COL_SCORE, summary_score_clicked);
+ CLIST_BUTTON_SIGNAL_CONNECT(S_COL_LOCKED, summary_locked_clicked);
#undef CLIST_BUTTON_SIGNAL_CONNECT
summary_status_show(summaryview);
}
break;
+ case S_COL_LOCKED:
+ if (MSG_IS_LOCKED(msginfo->flags)) {
+ MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_LOCKED);
+ CHANGE_FLAGS(msginfo);
+ summary_set_row_marks(summaryview, row);
+ }
+ else
+ summary_lock_row(summaryview, row);
+ break;
default:
break;
}
summary_sort(summaryview, SORT_BY_SCORE);
}
+static void summary_locked_clicked(GtkWidget *button,
+ SummaryView *summaryview)
+{
+ summary_sort(summaryview, SORT_BY_LOCKED);
+}
+
static void summary_size_clicked(GtkWidget *button, SummaryView *summaryview)
{
summary_sort(summaryview, SORT_BY_SIZE);
return summary_cmp_by_date(clist, ptr1, ptr2);
}
+static gint summary_cmp_by_locked(GtkCList *clist,
+ gconstpointer ptr1, gconstpointer ptr2)
+{
+ MsgInfo *msginfo1 = ((GtkCListRow *)ptr1)->data;
+ MsgInfo *msginfo2 = ((GtkCListRow *)ptr2)->data;
+
+ return MSG_IS_LOCKED(msginfo1->flags) - MSG_IS_LOCKED(msginfo2->flags);
+}
+
static void summary_ignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpointer data)
{
SummaryView *summaryview = (SummaryView *) data;
summary_status_show(summaryview);
}
+
+
+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 = item->folder->get_msg_list(item->folder, item,
+ TRUE);
+
+ for(cur = mlist ; cur != NULL ; cur = cur->next) {
+ MsgInfo * msginfo;
+
+ msginfo = (MsgInfo *) cur->data;
+ filter_msginfo_move_or_delete(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 = 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);
+ }
+}
+
+
/*
* End of Source.
*/