#include "statusbar.h"
#include "filter.h"
#include "folder.h"
+#include "colorlabel.h"
#include "addressbook.h"
#include "addr_compl.h"
#include "scoring.h"
#include "prefs_folder_item.h"
#include "filtering.h"
-#include "labelcolors.h"
#include "pixmaps/dir-open.xpm"
#include "pixmaps/mark.xpm"
gpointer data);
static void summary_set_menu_sensitive (SummaryView *summaryview);
-static void summary_set_add_sender_menu (SummaryView *summaryview);
static void summary_select_node (SummaryView *summaryview,
GtkCTreeNode *node,
static GtkCTreeNode *summary_find_prev_marked_msg
(SummaryView *summaryview,
GtkCTreeNode *current_node);
+static GtkCTreeNode *summary_find_next_labeled_msg
+ (SummaryView *summaryview,
+ GtkCTreeNode *current_node);
+static GtkCTreeNode *summary_find_prev_labeled_msg
+ (SummaryView *summaryview,
+ GtkCTreeNode *current_node);
static GtkCTreeNode *summary_find_msg_by_msgnum
(SummaryView *summaryview,
guint msgnum);
GtkCTreeNode *node,
gpointer data);
+static void summary_colorlabel_menu_item_activate_cb
+ (GtkWidget *widget,
+ gpointer data);
+static void summary_colorlabel_menu_item_activate_item_cb
+ (GtkMenuItem *label_menu_item,
+ gpointer data);
+static void summary_colorlabel_menu_create(SummaryView *summaryview);
+
/* callback functions */
static void summary_toggle_pressed (GtkWidget *eventbox,
GdkEventButton *event,
guint time,
SummaryView *summaryview);
+static void summary_add_address_cb (SummaryView *summaryview,
+ guint action,
+ GtkWidget *widget);
+
/* custom compare functions for sorting */
static gint summary_cmp_by_num (GtkCList *clist,
#endif
{N_("/_Mark/Ignore thread"), NULL, summary_ignore_thread, 0, NULL},
{N_("/_Mark/Unignore thread"), NULL, summary_unignore_thread, 0, NULL},
+ {N_("/Color la_bel"), NULL, NULL, 0, NULL},
{N_("/---"), NULL, NULL, 0, "<Separator>"},
{N_("/_Reply"), NULL, summary_reply_cb, COMPOSE_REPLY, NULL},
NULL, summary_reply_cb, COMPOSE_FORWARD_AS_ATTACH, NULL},
{N_("/---"), NULL, NULL, 0, "<Separator>"},
{N_("/Add sender to address _book"),
- NULL, NULL, 0, NULL},
+ NULL, summary_add_address_cb, 0, NULL},
{N_("/---"), NULL, NULL, 0, "<Separator>"},
{N_("/Open in new _window"), NULL, summary_open_msg, 0, NULL},
{N_("/View so_urce"), NULL, summary_view_source, 0, NULL},
{N_("/Select _all"), NULL, summary_select_all, 0, NULL}
};
-#define LABEL_COLORS_ELEMS labelcolors_get_color_count()
-
-static void label_menu_item_activate_cb(GtkWidget *widget, gpointer data)
-{
- guint color = GPOINTER_TO_UINT(data);
- SummaryView *view = gtk_object_get_data(GTK_OBJECT(widget), "view");
-
- g_return_if_fail(view);
-
- /* "dont_toggle" state set? */
- if (gtk_object_get_data(GTK_OBJECT(view->label_menu), "dont_toggle"))
- return;
-
- summary_set_label(view, color, NULL);
-}
-
-/* summary_set_label_color() - labelcolor parameter is the color *flag*
- * for the messsage; not the color index */
-void summary_set_label_color(GtkCTree *ctree, GtkCTreeNode *node,
- guint labelcolor)
-{
- GdkColor color;
- GtkStyle *style, *prev_style, *ctree_style;
- MsgInfo *msginfo;
- gint color_index;
-
- color_index = labelcolor == 0 ? -1 : (gint) labelcolor - 1;
-
- ctree_style = gtk_widget_get_style(GTK_WIDGET(ctree));
-
- prev_style = gtk_ctree_node_get_row_style(ctree, node);
-
- if (!prev_style)
- prev_style = ctree_style;
-
- style = gtk_style_copy(prev_style);
-
- if (color_index < 0 || color_index >= LABEL_COLORS_ELEMS) {
- color_index = 0;
- color.red = ctree_style->fg[GTK_STATE_NORMAL].red;
- color.green = ctree_style->fg[GTK_STATE_NORMAL].green;
- color.blue = ctree_style->fg[GTK_STATE_NORMAL].blue;
- style->fg[GTK_STATE_NORMAL] = color;
-
- color.red = ctree_style->fg[GTK_STATE_SELECTED].red;
- color.green = ctree_style->fg[GTK_STATE_SELECTED].green;
- color.blue = ctree_style->fg[GTK_STATE_SELECTED].blue;
- style->fg[GTK_STATE_SELECTED] = color;
- gtk_ctree_node_set_row_style(ctree, node, style);
- }
- else {
- color = labelcolors_get_color(color_index);
- }
-
- msginfo = gtk_ctree_node_get_row_data(ctree, node);
-
- MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_LABEL);
- MSG_SET_LABEL_VALUE(msginfo->flags, labelcolor);
-
- if ( style ) {
- style->fg[GTK_STATE_NORMAL] = color;
- style->fg[GTK_STATE_SELECTED] = color;
- gtk_ctree_node_set_row_style(ctree, node, style);
- }
-}
-
-void summary_set_label(SummaryView *summaryview, guint labelcolor, GtkWidget *widget)
-{
- GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
- GtkCList *clist = GTK_CLIST(summaryview->ctree);
- GList *cur;
-
- for (cur = clist->selection; cur != NULL; cur = cur->next)
- summary_set_label_color(ctree, GTK_CTREE_NODE(cur->data), labelcolor);
-}
-
-static void label_menu_item_activate_item_cb(GtkMenuItem *label_menu_item, gpointer data)
-{
- SummaryView *summaryview;
- GtkMenuShell *label_menu;
- GtkCheckMenuItem **items;
- int n;
- GList *cur, *sel;
-
- summaryview = (SummaryView *) data;
- g_return_if_fail(summaryview);
- if (NULL == (sel = GTK_CLIST(summaryview->ctree)->selection))
- return;
-
- label_menu = GTK_MENU_SHELL(summaryview->label_menu);
- g_return_if_fail(label_menu);
-
- items = alloca( (LABEL_COLORS_ELEMS + 1) * sizeof(GtkWidget *));
- g_return_if_fail(items);
-
- /* NOTE: don't return prematurely because we set the "dont_toggle" state
- * for check menu items */
- gtk_object_set_data(GTK_OBJECT(label_menu), "dont_toggle", GINT_TO_POINTER(1));
-
- /* clear items. get item pointers. */
- for (n = 0, cur = label_menu->children; cur != NULL; cur = cur->next) {
- if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
- gtk_check_menu_item_set_state(GTK_CHECK_MENU_ITEM(cur->data), FALSE);
- items[n] = GTK_CHECK_MENU_ITEM(cur->data);
- n++;
- }
- }
-
- if (n == (LABEL_COLORS_ELEMS + 1)) {
- /* iterate all messages and set the state of the appropriate items */
- for (; sel != NULL; sel = sel->next) {
- MsgInfo *msginfo = gtk_ctree_node_get_row_data(GTK_CTREE(summaryview->ctree),
- GTK_CTREE_NODE(sel->data));
- gint menu_item;
- if (msginfo) {
- menu_item = MSG_GET_LABEL_VALUE(msginfo->flags);
- if (!items[menu_item]->active)
- gtk_check_menu_item_set_state(items[menu_item], TRUE);
- }
- }
- }
- else
- g_warning("invalid number of color elements (%d)\n", n);
-
- /* reset "dont_toggle" state */
- gtk_object_set_data(GTK_OBJECT(label_menu), "dont_toggle", GINT_TO_POINTER(0));
-}
-
-static void summary_create_label_menu(SummaryView *summaryview)
-{
- const gint LABEL_MENU_POS = 5;
- GtkWidget *label_menu_item;
- GtkWidget *label_menu;
- GtkWidget *item;
- gint i;
-
- label_menu_item = gtk_menu_item_new_with_label(_("Label"));
- gtk_menu_insert(GTK_MENU(summaryview->popupmenu), label_menu_item, LABEL_MENU_POS);
- gtk_signal_connect(GTK_OBJECT(label_menu_item), "activate",
- GTK_SIGNAL_FUNC(label_menu_item_activate_item_cb), summaryview);
-
- gtk_widget_show(label_menu_item);
- summaryview->label_menu_item = label_menu_item;
-
- label_menu = gtk_menu_new();
-
- /* create sub items. for the menu item activation callback we pass the
- * index of label_colors[] as data parameter. for the None color we pass
- * an invalid (high) value. also we attach a data pointer so we can
- * always get back the SummaryView pointer. */
-
- item = gtk_check_menu_item_new_with_label(_("None"));
- gtk_menu_append(GTK_MENU(label_menu), item);
- gtk_signal_connect(GTK_OBJECT(item), "activate",
- GTK_SIGNAL_FUNC(label_menu_item_activate_cb),
- GUINT_TO_POINTER(0));
- gtk_object_set_data(GTK_OBJECT(item), "view", summaryview);
- gtk_widget_show(item);
-
- item = gtk_menu_item_new();
- gtk_menu_append(GTK_MENU(label_menu), item);
- gtk_widget_show(item);
-
- /* create pixmap/label menu items */
- for (i = 0; i < LABEL_COLORS_ELEMS; i++) {
- item = labelcolors_create_check_color_menu_item(i);
- gtk_menu_append(GTK_MENU(label_menu), item);
- gtk_signal_connect(GTK_OBJECT(item), "activate",
- GTK_SIGNAL_FUNC(label_menu_item_activate_cb),
- GUINT_TO_POINTER(i + 1));
- gtk_object_set_data(GTK_OBJECT(item), "view", summaryview);
- gtk_widget_show(item);
- }
-
- gtk_widget_show(label_menu);
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menu_item), label_menu);
- summaryview->label_menu = label_menu;
-}
-
SummaryView *summary_create(void)
{
SummaryView *summaryview;
gtk_widget_show(pixmap);
summary_clear_list(summaryview);
+ summary_colorlabel_menu_create(summaryview);
summary_set_menu_sensitive(summaryview);
- summary_create_label_menu(summaryview);
}
STATUSBAR_POP(summaryview->mainwin);
is_refresh = (!prefs_common.open_inbox_on_inc &&
- item == summaryview->folder_item) ? TRUE : FALSE;
+ item == summaryview->folder_item &&
+ update_cache == FALSE) ? TRUE : FALSE;
if (is_refresh) {
selected_msgnum = summary_get_msgnum(summaryview,
summaryview->selected);
}
if (summaryview->folder_item->folder->type != F_NEWS) {
- if (summaryview->folder_item->stype != F_TRASH)
- menu_set_sensitive(ifactory, "/Delete", TRUE);
menu_set_sensitive(ifactory, "/Move...", TRUE);
menu_set_sensitive(ifactory, "/Copy...", TRUE);
+ if (summaryview->folder_item->stype != F_TRASH)
+ menu_set_sensitive(ifactory, "/Delete", TRUE);
}
- gtk_widget_set_sensitive(summaryview->label_menu_item, TRUE);
menu_set_sensitive(ifactory, "/Execute", TRUE);
+ menu_set_sensitive(ifactory, "/Mark", TRUE);
+ menu_set_sensitive(ifactory, "/Mark/Mark", TRUE);
+ menu_set_sensitive(ifactory, "/Mark/Unmark", TRUE);
+
+ menu_set_sensitive(ifactory, "/Mark/Mark as unread", TRUE);
+ menu_set_sensitive(ifactory, "/Mark/Mark as read", TRUE);
+#if MARK_ALL_READ
+ menu_set_sensitive(ifactory, "/Mark/Mark all read", TRUE);
+#endif
+ menu_set_sensitive(ifactory, "/Mark/Ignore thread", TRUE);
+ menu_set_sensitive(ifactory, "/Mark/Unignore thread", TRUE);
+
+ menu_set_sensitive(ifactory, "/Color label", TRUE);
+
sens = (selection == SUMMARY_SELECTED_MULTIPLE) ? FALSE : TRUE;
menu_set_sensitive(ifactory, "/Reply", sens);
menu_set_sensitive(ifactory, "/Reply to sender", sens);
menu_set_sensitive(ifactory, "/Reply to all", sens);
menu_set_sensitive(ifactory, "/Forward", TRUE);
menu_set_sensitive(ifactory, "/Forward as attachment", TRUE);
+ menu_set_sensitive(ifactory, "/Add sender to address book", sens);
menu_set_sensitive(ifactory, "/Open in new window", sens);
menu_set_sensitive(ifactory, "/View source", sens);
menu_set_sensitive(ifactory, "/Save as...", sens);
menu_set_sensitive(ifactory, "/Print...", TRUE);
- menu_set_sensitive(ifactory, "/Mark", TRUE);
-
- menu_set_sensitive(ifactory, "/Mark/Mark", TRUE);
- menu_set_sensitive(ifactory, "/Mark/Unmark", TRUE);
-
- menu_set_sensitive(ifactory, "/Mark/Mark as unread", TRUE);
- menu_set_sensitive(ifactory, "/Mark/Mark as read", TRUE);
-#if MARK_ALL_READ
- menu_set_sensitive(ifactory, "/Mark/Mark all read", TRUE);
-#endif
- menu_set_sensitive(ifactory, "/Mark/Ignore thread", TRUE);
- menu_set_sensitive(ifactory, "/Mark/Unignore thread", TRUE);
-
menu_set_sensitive(ifactory, "/Select all", TRUE);
if (summaryview->folder_item->folder->account)
menu_set_sensitive(ifactory, "/Follow-up and reply to", sens);
}
-static void summary_set_add_sender_menu(SummaryView *summaryview)
-{
- GtkWidget *menu;
- GtkWidget *submenu;
- MsgInfo *msginfo;
- gchar *from;
-
- menu = gtk_item_factory_get_item(summaryview->popupfactory,
- "/Add sender to address book");
- msginfo = gtk_ctree_node_get_row_data(GTK_CTREE(summaryview->ctree),
- summaryview->selected);
- if (!msginfo || !msginfo->from) {
- gtk_widget_set_sensitive(menu, FALSE);
- submenu = gtk_menu_new();
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), submenu);
- return;
- }
-
- gtk_widget_set_sensitive(menu, TRUE);
- Xstrdup_a(from, msginfo->from, return);
- eliminate_address_comment(from);
- extract_address(from);
- addressbook_add_submenu(menu, msginfo->fromname, from, NULL);
-
-}
-
void summary_select_next_unread(SummaryView *summaryview)
{
GtkCTreeNode *node;
}
}
+void summary_select_next_labeled(SummaryView *summaryview)
+{
+ GtkCTreeNode *node;
+ GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+
+ node = summary_find_next_labeled_msg(summaryview,
+ summaryview->selected);
+
+ if (!node) {
+ AlertValue val;
+
+ val = alertpanel(_("No more labeled messages"),
+ _("No labeled message found. "
+ "Search from the beginning?"),
+ _("Yes"), _("No"), NULL);
+ if (val != G_ALERTDEFAULT) return;
+ node = summary_find_next_labeled_msg(summaryview,
+ NULL);
+ }
+ if (!node) {
+ alertpanel_notice(_("No labeled messages."));
+ } else {
+ gtk_sctree_unselect_all(GTK_SCTREE(ctree));
+ gtk_sctree_select(GTK_SCTREE(ctree), node);
+ if (summaryview->displayed == node)
+ summaryview->displayed = NULL;
+ summary_display_msg(summaryview, node, FALSE);
+ }
+}
+
+void summary_select_prev_labeled(SummaryView *summaryview)
+{
+ GtkCTreeNode *node;
+ GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+
+ node = summary_find_prev_labeled_msg(summaryview,
+ summaryview->selected);
+
+ if (!node) {
+ AlertValue val;
+
+ val = alertpanel(_("No more labeled messages"),
+ _("No labeled message found. "
+ "Search from the end?"),
+ _("Yes"), _("No"), NULL);
+ if (val != G_ALERTDEFAULT) return;
+ node = summary_find_prev_labeled_msg(summaryview,
+ NULL);
+ }
+ if (!node) {
+ alertpanel_notice(_("No labeled messages."));
+ } else {
+ gtk_sctree_unselect_all(GTK_SCTREE(ctree));
+ gtk_sctree_select(GTK_SCTREE(ctree), node);
+ if (summaryview->displayed == node)
+ summaryview->displayed = NULL;
+ summary_display_msg(summaryview, node, FALSE);
+ }
+}
+
void summary_select_by_msgnum(SummaryView *summaryview, guint msgnum)
{
GtkCTreeNode *node;
return node;
}
+static GtkCTreeNode *summary_find_next_labeled_msg(SummaryView *summaryview,
+ GtkCTreeNode *current_node)
+{
+ GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+ GtkCTreeNode *node;
+ MsgInfo *msginfo;
+
+ if (current_node)
+ node = GTK_CTREE_NODE_NEXT(current_node);
+ else
+ node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
+
+ for (; node != NULL; node = GTK_CTREE_NODE_NEXT(node)) {
+ msginfo = gtk_ctree_node_get_row_data(ctree, node);
+ if (MSG_GET_COLORLABEL_VALUE(msginfo->flags) > 0) break;
+ }
+
+ return node;
+}
+
+static GtkCTreeNode *summary_find_prev_labeled_msg(SummaryView *summaryview,
+ GtkCTreeNode *current_node)
+{
+ GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+ GtkCTreeNode *node;
+ MsgInfo *msginfo;
+
+ if (current_node)
+ node = GTK_CTREE_NODE_PREV(current_node);
+ else
+ node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list_end);
+
+ for (; node != NULL; node = GTK_CTREE_NODE_PREV(node)) {
+ msginfo = gtk_ctree_node_get_row_data(ctree, node);
+ if (MSG_GET_COLORLABEL_VALUE(msginfo->flags) > 0) break;
+ }
+
+ return node;
+}
+
static GtkCTreeNode *summary_find_msg_by_msgnum(SummaryView *summaryview,
guint msgnum)
{
}
if(parent) {
parentinfo = gtk_ctree_node_get_row_data(ctree, parent);
- if(parentinfo && MSG_IS_IGNORE_THREAD(parentinfo->flags)) {
-
- if (MSG_IS_NEW(msginfo->flags))
- summaryview->newmsgs--;
- if (MSG_IS_UNREAD(msginfo->flags))
- summaryview->unread--;
-
+ if(!MSG_IS_IGNORE_THREAD(msginfo->flags) && parentinfo && MSG_IS_IGNORE_THREAD(parentinfo->flags)) {
MSG_SET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
}
}
GTKUT_CTREE_NODE_SET_ROW_DATA(node, msginfo);
summary_set_marks_func(ctree, node, summaryview);
- if (MSG_GET_LABEL(msginfo->flags))
- summary_set_label_color(ctree, node, MSG_GET_LABEL_VALUE(msginfo->flags));
+ if (MSG_GET_COLORLABEL(msginfo->flags))
+ summary_set_colorlabel_color(ctree, node, MSG_GET_COLORLABEL_VALUE(msginfo->flags));
/* preserve previous node if the message is
duplicated */
GTKUT_CTREE_NODE_SET_ROW_DATA(node, msginfo);
summary_set_marks_func(ctree, node, summaryview);
- if ( MSG_GET_LABEL(msginfo->flags) )
- summary_set_label_color(ctree, node, MSG_GET_LABEL_VALUE(msginfo->flags));
+ if ( MSG_GET_COLORLABEL(msginfo->flags) )
+ summary_set_colorlabel_color(ctree, node, MSG_GET_COLORLABEL_VALUE(msginfo->flags));
if (msginfo->msgid && *msginfo->msgid &&
g_hash_table_lookup(msgid_table, msginfo->msgid)
if (node) {
msginfo = gtk_ctree_node_get_row_data(ctree, node);
- if (msginfo && MSG_IS_UNREAD(msginfo->flags))
+ if (msginfo && MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
return TRUE;
node = GTK_CTREE_ROW(node)->children;
} else
}
if (prefs_common.bold_unread &&
- (MSG_IS_UNREAD(flags) ||
+ ((MSG_IS_UNREAD(flags) && !MSG_IS_IGNORE_THREAD(flags)) ||
(!GTK_CTREE_ROW(row)->expanded &&
GTK_CTREE_ROW(row)->children &&
summary_have_unread_children(summaryview, row))))
style = small_style;
gtk_ctree_node_set_row_style(ctree, row, style);
+
+ if (MSG_GET_COLORLABEL(flags))
+ summary_set_colorlabel_color(ctree, row,
+ MSG_GET_COLORLABEL_VALUE(flags));
}
void summary_set_marks_selected(SummaryView *summaryview)
summaryview->folder_table);
}
+/* color label */
+
+#define N_COLOR_LABELS colorlabel_get_color_count()
+
+static void summary_colorlabel_menu_item_activate_cb(GtkWidget *widget,
+ gpointer data)
+{
+ guint color = GPOINTER_TO_UINT(data);
+ SummaryView *summaryview;
+
+ summaryview = gtk_object_get_data(GTK_OBJECT(widget), "summaryview");
+ g_return_if_fail(summaryview != NULL);
+
+ /* "dont_toggle" state set? */
+ if (gtk_object_get_data(GTK_OBJECT(summaryview->colorlabel_menu),
+ "dont_toggle"))
+ return;
+
+ summary_set_colorlabel(summaryview, color, NULL);
+}
+
+/* summary_set_colorlabel_color() - labelcolor parameter is the color *flag*
+ * for the messsage; not the color index */
+void summary_set_colorlabel_color(GtkCTree *ctree, GtkCTreeNode *node,
+ guint labelcolor)
+{
+ GdkColor color;
+ GtkStyle *style, *prev_style, *ctree_style;
+ MsgInfo *msginfo;
+ gint color_index;
+
+ msginfo = gtk_ctree_node_get_row_data(ctree, node);
+ MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_CLABEL_FLAG_MASK);
+ MSG_SET_COLORLABEL_VALUE(msginfo->flags, labelcolor);
+
+ color_index = labelcolor == 0 ? -1 : (gint)labelcolor - 1;
+ ctree_style = gtk_widget_get_style(GTK_WIDGET(ctree));
+ prev_style = gtk_ctree_node_get_row_style(ctree, node);
+
+ if (color_index < 0 || color_index >= N_COLOR_LABELS) {
+ if (!prev_style) return;
+ style = gtk_style_copy(prev_style);
+ color = ctree_style->fg[GTK_STATE_NORMAL];
+ style->fg[GTK_STATE_NORMAL] = color;
+ color = ctree_style->fg[GTK_STATE_SELECTED];
+ style->fg[GTK_STATE_SELECTED] = color;
+ } else {
+ if (prev_style)
+ style = gtk_style_copy(prev_style);
+ else
+ style = gtk_style_copy(ctree_style);
+ color = colorlabel_get_color(color_index);
+ style->fg[GTK_STATE_NORMAL] = color;
+ style->fg[GTK_STATE_SELECTED] = color;
+ }
+
+ gtk_ctree_node_set_row_style(ctree, node, style);
+}
+
+void summary_set_colorlabel(SummaryView *summaryview, guint labelcolor,
+ GtkWidget *widget)
+{
+ GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+ GtkCList *clist = GTK_CLIST(summaryview->ctree);
+ GList *cur;
+
+ for (cur = clist->selection; cur != NULL; cur = cur->next)
+ summary_set_colorlabel_color(ctree, GTK_CTREE_NODE(cur->data),
+ labelcolor);
+}
+
+static void summary_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item,
+ gpointer data)
+{
+ SummaryView *summaryview;
+ GtkMenuShell *menu;
+ GtkCheckMenuItem **items;
+ gint n;
+ GList *cur, *sel;
+
+ summaryview = (SummaryView *)data;
+ g_return_if_fail(summaryview != NULL);
+
+ sel = GTK_CLIST(summaryview->ctree)->selection;
+ if (!sel) return;
+
+ menu = GTK_MENU_SHELL(summaryview->colorlabel_menu);
+ g_return_if_fail(menu != NULL);
+
+ Xalloca(items, (N_COLOR_LABELS + 1) * sizeof(GtkWidget *), return);
+
+ /* NOTE: don't return prematurely because we set the "dont_toggle"
+ * state for check menu items */
+ gtk_object_set_data(GTK_OBJECT(menu), "dont_toggle",
+ GINT_TO_POINTER(1));
+
+ /* clear items. get item pointers. */
+ for (n = 0, cur = menu->children; cur != NULL; cur = cur->next) {
+ if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
+ gtk_check_menu_item_set_state
+ (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
+ items[n] = GTK_CHECK_MENU_ITEM(cur->data);
+ n++;
+ }
+ }
+
+ if (n == (N_COLOR_LABELS + 1)) {
+ /* iterate all messages and set the state of the appropriate
+ * items */
+ for (; sel != NULL; sel = sel->next) {
+ MsgInfo *msginfo;
+ gint clabel;
+
+ msginfo = gtk_ctree_node_get_row_data
+ (GTK_CTREE(summaryview->ctree),
+ GTK_CTREE_NODE(sel->data));
+ if (msginfo) {
+ clabel = MSG_GET_COLORLABEL_VALUE(msginfo->flags);
+ if (!items[clabel]->active)
+ gtk_check_menu_item_set_state
+ (items[clabel], TRUE);
+ }
+ }
+ } else
+ g_warning("invalid number of color elements (%d)\n", n);
+
+ /* reset "dont_toggle" state */
+ gtk_object_set_data(GTK_OBJECT(menu), "dont_toggle",
+ GINT_TO_POINTER(0));
+}
+
+static void summary_colorlabel_menu_create(SummaryView *summaryview)
+{
+ GtkWidget *label_menuitem;
+ GtkWidget *menu;
+ GtkWidget *item;
+ gint i;
+
+ label_menuitem = gtk_item_factory_get_item(summaryview->popupfactory,
+ "/Color label");
+ gtk_signal_connect(GTK_OBJECT(label_menuitem), "activate",
+ GTK_SIGNAL_FUNC(summary_colorlabel_menu_item_activate_item_cb),
+ summaryview);
+
+ gtk_widget_show(label_menuitem);
+
+ menu = gtk_menu_new();
+
+ /* create sub items. for the menu item activation callback we pass the
+ * index of label_colors[] as data parameter. for the None color we
+ * pass an invalid (high) value. also we attach a data pointer so we
+ * can always get back the SummaryView pointer. */
+
+ item = gtk_check_menu_item_new_with_label(_("None"));
+ gtk_menu_append(GTK_MENU(menu), item);
+ gtk_signal_connect(GTK_OBJECT(item), "activate",
+ GTK_SIGNAL_FUNC(summary_colorlabel_menu_item_activate_cb),
+ GUINT_TO_POINTER(0));
+ gtk_object_set_data(GTK_OBJECT(item), "summaryview", summaryview);
+ gtk_widget_show(item);
+
+ item = gtk_menu_item_new();
+ gtk_menu_append(GTK_MENU(menu), item);
+ gtk_widget_show(item);
+
+ /* create pixmap/label menu items */
+ for (i = 0; i < N_COLOR_LABELS; i++) {
+ item = colorlabel_create_check_color_menu_item(i);
+ gtk_menu_append(GTK_MENU(menu), item);
+ gtk_signal_connect(GTK_OBJECT(item), "activate",
+ GTK_SIGNAL_FUNC(summary_colorlabel_menu_item_activate_cb),
+ GUINT_TO_POINTER(i + 1));
+ gtk_object_set_data(GTK_OBJECT(item), "summaryview",
+ summaryview);
+ gtk_widget_show(item);
+ }
+
+ gtk_widget_show(menu);
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
+ summaryview->colorlabel_menu = menu;
+}
+
/* callback functions */
static void summary_toggle_pressed(GtkWidget *eventbox, GdkEventButton *event,
if (!event) return;
if (event->button == 3) {
- /* right clicked */
- summary_set_add_sender_menu(summaryview);
+ // Right button clicked
+ // summary_set_add_sender_menu(summaryview);
gtk_menu_popup(GTK_MENU(summaryview->popupmenu), NULL, NULL,
NULL, NULL, event->button, event->time);
} else if (event->button == 2) {
static void summary_open_row(GtkSCTree *sctree, SummaryView *summaryview)
{
- if (summaryview->folder_item->stype == F_DRAFT)
+ if (summaryview->folder_item->stype == F_DRAFT ||
+ summaryview->folder_item->stype == F_OUTBOX ||
+ summaryview->folder_item->stype == F_QUEUE)
summary_reedit(summaryview);
else
summary_open_msg(summaryview);
MsgInfo *msginfo1 = ((GtkCListRow *)ptr1)->data;
MsgInfo *msginfo2 = ((GtkCListRow *)ptr2)->data;
- return MSG_GET_LABEL(msginfo1->flags) - MSG_GET_LABEL(msginfo2->flags);
+ return MSG_GET_COLORLABEL(msginfo1->flags) - MSG_GET_COLORLABEL(msginfo2->flags);
}
static gint summary_cmp_by_score(GtkCList *clist,
MSG_SET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
CHANGE_FLAGS(msginfo);
-
+
summary_set_row_marks(summaryview, row);
debug_print(_("Message %d is marked as ignore thread\n"),
msginfo->msgnum);
summary_status_show(summaryview);
}
+static void summary_add_address_cb( SummaryView *summaryview, guint action, GtkWidget *widget ) {
+ MsgInfo *msginfo;
+ gchar *from;
+
+ msginfo = gtk_ctree_node_get_row_data(GTK_CTREE(summaryview->ctree),
+ summaryview->selected);
+ if (!msginfo) return;
+
+ Xstrdup_a(from, msginfo->from, return);
+ eliminate_address_comment(from);
+ extract_address(from);
+ addressbook_add_contact( msginfo->fromname, from, NULL );
+}
+
+/*
+ * End of Source.
+ */
+