static void summary_drag_end(GtkWidget *widget,
GdkDragContext *drag_context,
SummaryView *summaryview);
-/* custom compare functions for sorting */
+/* custom compare functions for sorting */
static gint summary_cmp_by_mark (GtkCMCList *clist,
gconstpointer ptr1,
gconstpointer ptr2);
static GtkActionEntry summary_popup_entries[] =
{
- {"SummaryViewPopup", NULL, "SummaryViewPopup" },
- {"SummaryViewPopup/ReplyTo", NULL, N_("Repl_y to") },
- {"SummaryViewPopup/Mark", NULL, N_("_Mark") },
- {"SummaryViewPopup/ColorLabel", NULL, N_("Color la_bel") },
- {"SummaryViewPopup/Tags", NULL, N_("Ta_gs") },
- {"SummaryViewPopup/CreateFilterRule", NULL, N_("Create _filter rule") },
+ {"SummaryViewPopup", NULL, "SummaryViewPopup", NULL, NULL, NULL },
+ {"SummaryViewPopup/ReplyTo", NULL, N_("Repl_y to"), NULL, NULL, NULL },
+ {"SummaryViewPopup/Mark", NULL, N_("_Mark"), NULL, NULL, NULL },
+ {"SummaryViewPopup/ColorLabel", NULL, N_("Color la_bel"), NULL, NULL, NULL },
+ {"SummaryViewPopup/Tags", NULL, N_("Ta_gs"), NULL, NULL, NULL },
+ {"SummaryViewPopup/CreateFilterRule", NULL, N_("Create _filter rule"), NULL, NULL, NULL },
#ifndef GENERIC_UMPC
- {"SummaryViewPopup/CreateProcessingRule", NULL, N_("Create processing rule") },
+ {"SummaryViewPopup/CreateProcessingRule", NULL, N_("Create processing rule"), NULL, NULL, NULL },
#endif
- {"SummaryViewPopup/View", NULL, N_("_View") },
+ {"SummaryViewPopup/View", NULL, N_("_View"), NULL, NULL, NULL },
};
static const gchar *const col_label[N_SUMMARY_COLS] = {
- "", /* S_COL_MARK */
- N_("S"), /* S_COL_STATUS */
- "", /* S_COL_MIME */
- N_("Subject"), /* S_COL_SUBJECT */
- N_("From"), /* S_COL_FROM */
- N_("To"), /* S_COL_TO */
- N_("Date"), /* S_COL_DATE */
- N_("Size"), /* S_COL_SIZE */
- N_("#"), /* S_COL_NUMBER */
- N_("Score"), /* S_COL_SCORE */
- "", /* S_COL_LOCKED */
- N_("Tags"), /* S_COL_TAGS */
+ "", /* S_COL_MARK */
+ N_("S"), /* S_COL_STATUS */
+ "", /* S_COL_MIME */
+ N_("Subject"), /* S_COL_SUBJECT */
+ N_("From"), /* S_COL_FROM */
+ N_("To"), /* S_COL_TO */
+ N_("Date"), /* S_COL_DATE */
+ N_("Size"), /* S_COL_SIZE */
+ N_("#"), /* S_COL_NUMBER */
+ N_("Score"), /* S_COL_SCORE */
+ "", /* S_COL_LOCKED */
+ N_("Tags"), /* S_COL_TAGS */
};
void summary_freeze(SummaryView *summaryview)
MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "Mark", "Message/Mark/Mark", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "Unmark", "Message/Mark/Unmark", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "Separator1", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
- MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "MarkUnread", "Message/Mark/MarkUnread", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "MarkRead", "Message/Mark/MarkRead", GTK_UI_MANAGER_MENUITEM)
+ MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "MarkUnread", "Message/Mark/MarkUnread", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "Separator2", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "MarkAllRead", "Message/Mark/MarkAllRead", GTK_UI_MANAGER_MENUITEM)
+ MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "MarkAllUnread", "Message/Mark/MarkAllUnread", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "Separator3", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "IgnoreThread", "Message/Mark/IgnoreThread", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "UnignoreThread", "Message/Mark/UnignoreThread", GTK_UI_MANAGER_MENUITEM)
gboolean sensitive;
gint i;
-#define N_ENTRIES 38
+#define N_ENTRIES 39
static struct {
const gchar *entry;
SensitiveCondMask cond;
FILL_TABLE("Menus/SummaryViewPopup/Mark", M_TARGET_EXIST);
FILL_TABLE("Menus/SummaryViewPopup/Mark/Mark", M_TARGET_EXIST);
FILL_TABLE("Menus/SummaryViewPopup/Mark/Unmark", M_TARGET_EXIST);
- FILL_TABLE("Menus/SummaryViewPopup/Mark/MarkUnread", M_TARGET_EXIST);
FILL_TABLE("Menus/SummaryViewPopup/Mark/MarkRead", M_TARGET_EXIST);
+ FILL_TABLE("Menus/SummaryViewPopup/Mark/MarkUnread", M_TARGET_EXIST);
FILL_TABLE("Menus/SummaryViewPopup/Mark/MarkAllRead", M_TARGET_EXIST);
+ FILL_TABLE("Menus/SummaryViewPopup/Mark/MarkAllUnread", M_TARGET_EXIST);
FILL_TABLE("Menus/SummaryViewPopup/Mark/IgnoreThread", M_TARGET_EXIST);
FILL_TABLE("Menus/SummaryViewPopup/Mark/UnignoreThread", M_TARGET_EXIST);
FILL_TABLE("Menus/SummaryViewPopup/Mark/WatchThread", M_TARGET_EXIST);
FILL_TABLE("Menus/SummaryViewPopup/Mark/UnwatchThread", M_TARGET_EXIST);
- FILL_TABLE("Menus/SummaryViewPopup/Mark/Unlock", M_TARGET_EXIST);
FILL_TABLE("Menus/SummaryViewPopup/Mark/Lock", M_TARGET_EXIST);
+ FILL_TABLE("Menus/SummaryViewPopup/Mark/Unlock", M_TARGET_EXIST);
FILL_TABLE("Menus/SummaryViewPopup/Mark/MarkSpam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
FILL_TABLE("Menus/SummaryViewPopup/Mark/MarkHam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
FILL_TABLE("Menus/SummaryViewPopup/ColorLabel", M_TARGET_EXIST);
GtkCMCTreeNode *node = summaryview->selected;
GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
- node = gtkut_ctree_node_prev(ctree, node);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = gtkut_ctree_node_prev(ctree, node);
+ else
+ node = gtkut_ctree_node_next(ctree, node);
if (node && node != summaryview->selected)
summary_select_node(summaryview, node, -1);
GtkCMCTreeNode *node = summaryview->selected;
GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
- node = gtkut_ctree_node_next(ctree, node);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = gtkut_ctree_node_next(ctree, node);
+ else
+ node = gtkut_ctree_node_prev(ctree, node);
if (node && node != summaryview->selected)
summary_select_node(summaryview, node, -1);
{
GtkCMCTreeNode *node;
- node = summary_find_prev_flagged_msg
- (summaryview, summaryview->selected, MSG_UNREAD, TRUE);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = summary_find_prev_flagged_msg
+ (summaryview, summaryview->selected, MSG_UNREAD, TRUE);
+ else
+ node = summary_find_next_flagged_msg
+ (summaryview, summaryview->selected, MSG_UNREAD, TRUE);
if (!node || node == summaryview->selected) {
AlertValue val = 0;
_("Internal error: unexpected value for prefs_common.next_unread_msg_dialog\n"));
}
if (val != G_ALERTALTERNATE) return;
- node = summary_find_prev_flagged_msg(summaryview, NULL,
- MSG_UNREAD, FALSE);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = summary_find_prev_flagged_msg(summaryview, NULL,
+ MSG_UNREAD, FALSE);
+ else
+ node = summary_find_next_flagged_msg(summaryview, NULL,
+ MSG_UNREAD, FALSE);
}
if (!node)
{
GtkCMCTreeNode *node = summaryview->selected;
- node = summary_find_next_flagged_msg
- (summaryview, node, MSG_UNREAD, TRUE);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = summary_find_next_flagged_msg
+ (summaryview, node, MSG_UNREAD, TRUE);
+ else
+ node = summary_find_prev_flagged_msg
+ (summaryview, node, MSG_UNREAD, TRUE);
if (node)
summary_select_node(summaryview, node, -1);
{
GtkCMCTreeNode *node;
- node = summary_find_prev_flagged_msg
- (summaryview, summaryview->selected, MSG_NEW, TRUE);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = summary_find_prev_flagged_msg
+ (summaryview, summaryview->selected, MSG_NEW, TRUE);
+ else
+ node = summary_find_next_flagged_msg
+ (summaryview, summaryview->selected, MSG_NEW, TRUE);
if (!node || node == summaryview->selected) {
AlertValue val = 0;
_("Internal error: unexpected value for prefs_common.next_unread_msg_dialog\n"));
}
if (val != G_ALERTALTERNATE) return;
- node = summary_find_prev_flagged_msg(summaryview, NULL,
- MSG_NEW, FALSE);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = summary_find_prev_flagged_msg(summaryview, NULL,
+ MSG_NEW, FALSE);
+ else
+ node = summary_find_next_flagged_msg(summaryview, NULL,
+ MSG_NEW, FALSE);
}
if (!node)
{
GtkCMCTreeNode *node = summaryview->selected;
- node = summary_find_next_flagged_msg
- (summaryview, node, MSG_NEW, TRUE);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = summary_find_next_flagged_msg
+ (summaryview, node, MSG_NEW, TRUE);
+ else
+ node = summary_find_prev_flagged_msg
+ (summaryview, node, MSG_NEW, TRUE);
if (node)
summary_select_node(summaryview, node, -1);
{
GtkCMCTreeNode *node;
- node = summary_find_prev_flagged_msg
- (summaryview, summaryview->selected, MSG_MARKED, TRUE);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = summary_find_prev_flagged_msg
+ (summaryview, summaryview->selected, MSG_MARKED, TRUE);
+ else
+ node = summary_find_next_flagged_msg
+ (summaryview, summaryview->selected, MSG_MARKED, TRUE);
if (!node) {
AlertValue val;
{
GtkCMCTreeNode *node = summaryview->selected;
- node = summary_find_next_flagged_msg
- (summaryview, node, MSG_MARKED, TRUE);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = summary_find_next_flagged_msg
+ (summaryview, node, MSG_MARKED, TRUE);
+ else
+ node = summary_find_prev_flagged_msg
+ (summaryview, node, MSG_MARKED, TRUE);
if (node)
summary_select_node(summaryview, node, -1);
{
GtkCMCTreeNode *node;
- node = summary_find_prev_flagged_msg
- (summaryview, summaryview->selected, MSG_CLABEL_FLAG_MASK, TRUE);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = summary_find_prev_flagged_msg
+ (summaryview, summaryview->selected, MSG_CLABEL_FLAG_MASK, TRUE);
+ else
+ node = summary_find_next_flagged_msg
+ (summaryview, summaryview->selected, MSG_CLABEL_FLAG_MASK, TRUE);
if (!node) {
AlertValue val;
{
GtkCMCTreeNode *node;
- node = summary_find_next_flagged_msg
- (summaryview, summaryview->selected, MSG_CLABEL_FLAG_MASK, TRUE);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = summary_find_next_flagged_msg
+ (summaryview, summaryview->selected, MSG_CLABEL_FLAG_MASK, TRUE);
+ else
+ node = summary_find_prev_flagged_msg
+ (summaryview, summaryview->selected, MSG_CLABEL_FLAG_MASK, TRUE);
if (!node) {
AlertValue val;
"Search from the beginning?"),
GTK_STOCK_NO, "+"GTK_STOCK_YES, NULL);
if (val != G_ALERTALTERNATE) return;
- node = summary_find_next_flagged_msg(summaryview, NULL,
- MSG_CLABEL_FLAG_MASK, TRUE);
+ if (summaryview->sort_type == SORT_ASCENDING)
+ node = summary_find_next_flagged_msg(summaryview, NULL,
+ MSG_CLABEL_FLAG_MASK, TRUE);
+ else
+ node = summary_find_prev_flagged_msg(summaryview, NULL,
+ MSG_CLABEL_FLAG_MASK, TRUE);
}
if (!node)
* 1, display the corresponding message in the message view, if
* @force_display is -1, obey prefs_common.always_show_msg.
**/
+
void summary_select_node(SummaryView *summaryview, GtkCMCTreeNode *node,
gint force_display)
{
if (!summaryview->folder_item)
return;
if (node) {
- summary_cancel_mark_read_timeout(summaryview);
gtkut_ctree_expand_parent_all(ctree, node);
summary_lock(summaryview);
msginfo->msgnum);
}
+static void summary_mark_row_as_unread(SummaryView *summaryview,
+ GtkCMCTreeNode *row)
+{
+ GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
+ MsgInfo *msginfo;
+
+ msginfo = gtk_cmctree_node_get_row_data(ctree, row);
+ cm_return_if_fail(msginfo);
+
+ if(MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags))
+ return;
+
+ summary_msginfo_set_flags(msginfo, MSG_UNREAD, 0);
+ summary_set_row_marks(summaryview, row);
+ debug_print("Message %d is marked as unread\n",
+ msginfo->msgnum);
+}
+
void summary_mark_as_read(SummaryView *summaryview)
{
GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
summary_status_show(summaryview);
}
+void summary_mark_as_unread(SummaryView *summaryview)
+{
+ GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
+ GList *cur;
+ gboolean froze = FALSE;
+
+ if (summary_is_locked(summaryview))
+ return;
+ START_LONG_OPERATION(summaryview, FALSE);
+ folder_item_set_batch(summaryview->folder_item, TRUE);
+ for (cur = GTK_CMCLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
+ summary_mark_row_as_unread(summaryview,
+ GTK_CMCTREE_NODE(cur->data));
+ folder_item_set_batch(summaryview->folder_item, FALSE);
+ END_LONG_OPERATION(summaryview);
+
+ summary_status_show(summaryview);
+}
+
void summary_msgs_lock(SummaryView *summaryview)
{
GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
summary_status_show(summaryview);
}
-void summary_mark_all_read(SummaryView *summaryview)
+void summary_mark_all_read(SummaryView *summaryview, gboolean ask_if_needed)
{
GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
GtkCMCTreeNode *node;
AlertValue val;
gboolean froze = FALSE;
- if (prefs_common.ask_mark_all_read) {
+ /* ask_if_needed is FALSE when user-asking is performed by caller,
+ commonly when the caller is a mark-as-read-recursive func */
+ if (ask_if_needed && prefs_common.ask_mark_all_read) {
val = alertpanel_full(_("Mark all as read"),
- _("Do you really want to mark all mails in this "
- "folder as read?"), GTK_STOCK_NO, GTK_STOCK_YES, NULL,
+ _("Do you really want to mark all mails in this folder as read?"),
+ GTK_STOCK_NO, GTK_STOCK_YES, NULL,
TRUE, NULL, ALERT_QUESTION, G_ALERTDEFAULT);
if ((val & ~G_ALERTDISABLE) != G_ALERTALTERNATE)
summary_status_show(summaryview);
}
+void summary_mark_all_unread(SummaryView *summaryview, gboolean ask_if_needed)
+{
+ GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
+ GtkCMCTreeNode *node;
+ AlertValue val;
+ gboolean froze = FALSE;
+
+ /* ask_if_needed is FALSE when user-asking is performed by caller,
+ commonly when the caller is a mark-as-unread-recursive func */
+ if (ask_if_needed && prefs_common.ask_mark_all_read) {
+ val = alertpanel_full(_("Mark all as unread"),
+ _("Do you really want to mark all mails in this folder as unread?"),
+ GTK_STOCK_NO, GTK_STOCK_YES, NULL,
+ TRUE, NULL, ALERT_QUESTION, G_ALERTDEFAULT);
+
+ if ((val & ~G_ALERTDISABLE) != G_ALERTALTERNATE)
+ return;
+ else if (val & G_ALERTDISABLE)
+ prefs_common.ask_mark_all_read = FALSE;
+ }
+
+ if (summary_is_locked(summaryview))
+ return;
+ START_LONG_OPERATION(summaryview, TRUE);
+ folder_item_set_batch(summaryview->folder_item, TRUE);
+ for (node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list); node != NULL;
+ node = gtkut_ctree_node_next(ctree, node))
+ summary_mark_row_as_unread(summaryview, node);
+ folder_item_set_batch(summaryview->folder_item, FALSE);
+ for (node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list); node != NULL;
+ node = gtkut_ctree_node_next(ctree, node)) {
+ if (!GTK_CMCTREE_ROW(node)->expanded)
+ summary_set_row_marks(summaryview, node);
+ }
+ END_LONG_OPERATION(summaryview);
+
+ summary_status_show(summaryview);
+}
+
void summary_mark_as_spam(SummaryView *summaryview, guint action, GtkWidget *widget)
{
GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
summary_status_show(summaryview);
}
-
-static void summary_mark_row_as_unread(SummaryView *summaryview,
- GtkCMCTreeNode *row)
-{
- GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
- MsgInfo *msginfo;
-
- msginfo = gtk_cmctree_node_get_row_data(ctree, row);
- cm_return_if_fail(msginfo);
- if (MSG_IS_DELETED(msginfo->flags)) {
- procmsg_msginfo_set_to_folder(msginfo, NULL);
- summary_msginfo_unset_flags(msginfo, MSG_DELETED, 0);
- summaryview->deleted--;
- }
-
- summary_msginfo_set_flags(msginfo, MSG_UNREAD, 0);
- debug_print("Message %d is marked as unread\n",
- msginfo->msgnum);
-
- summary_set_row_marks(summaryview, row);
-}
-
-void summary_mark_as_unread(SummaryView *summaryview)
-{
- GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
- GList *cur;
- gboolean froze = FALSE;
-
- if (summary_is_locked(summaryview))
- return;
- START_LONG_OPERATION(summaryview, FALSE);
- folder_item_set_batch(summaryview->folder_item, TRUE);
- for (cur = GTK_CMCLIST(ctree)->selection; cur != NULL && cur->data != NULL;
- cur = cur->next)
- summary_mark_row_as_unread(summaryview,
- GTK_CMCTREE_NODE(cur->data));
- folder_item_set_batch(summaryview->folder_item, FALSE);
- END_LONG_OPERATION(summaryview);
-
- summary_status_show(summaryview);
-}
-
static gboolean check_permission(SummaryView *summaryview, MsgInfo * msginfo)
{
GList * cur;
if (!summaryview->folder_item ||
FOLDER_TYPE(summaryview->folder_item->folder) == F_NEWS) return;
- to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_MOVE, NULL, FALSE);
+ to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_MOVE, NULL, FALSE,
+ ngettext(
+ "Select folder to move selected message to",
+ "Select folder to move selected messages to",
+ g_list_length(GTK_CMCLIST(summaryview->ctree)->selection))
+ );
summary_move_selected_to(summaryview, to_folder);
}
if (!summaryview->folder_item) return;
- to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_COPY, NULL, FALSE);
+ to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_COPY, NULL, FALSE,
+ ngettext(
+ "Select folder to copy selected message to",
+ "Select folder to copy selected messages to",
+ g_list_length(GTK_CMCLIST(summaryview->ctree)->selection))
+ );
summary_copy_selected_to(summaryview, to_folder);
}
return g_slist_reverse(msginfo_list);
}
+/*
+ * \brief get number of messages currently selected in SummaryView
+ *
+ * \param summaryview
+ *
+ * \return number of messages currently selected
+ */
+guint summary_get_selection_count(SummaryView *summaryview)
+{
+ cm_return_val_if_fail(summaryview != NULL, 0);
+ return g_list_length(GTK_CMCLIST(summaryview->ctree)->selection);
+}
+
static void summary_sort_by_column_click(SummaryView *summaryview,
FolderSortKey sort_key)
{
summary_watch_thread(summaryview);
}
+
void summary_toggle_show_read_messages(SummaryView *summaryview)
{
FolderItemUpdateData source;
cm_return_val_if_fail(hookdata->item != NULL, FALSE);
cm_return_val_if_fail(summaryview != NULL, FALSE);
- if (hookdata->update_flags & F_ITEM_UPDATE_NAME) {
+ if (hookdata->item == summaryview->folder_item &&
+ hookdata->update_flags & F_ITEM_UPDATE_NAME) {
gchar *name = folder_item_get_name(hookdata->item);
gtk_label_set_text(GTK_LABEL(summaryview->statlabel_folder), name);
g_free(name);