gtk_cmclist_thaw(GTK_CMCLIST(summaryview->ctree));
}
+void summary_thaw_with_status(SummaryView *summaryview)
+{
+ if (summaryview) {
+ summary_status_show(summaryview);
+ gtk_cmclist_thaw(GTK_CMCLIST(summaryview->ctree));
+ }
+}
+
void summary_grab_focus(SummaryView *summaryview)
{
if (summaryview)
debug_print("Creating summary view...\n");
summaryview = g_new0(SummaryView, 1);
-#if !(GTK_CHECK_VERSION(2,12,0))
- summaryview->tooltips = tips;
-#endif
#define SUMMARY_VBOX_SPACING 3
vbox = gtk_vbox_new(FALSE, SUMMARY_VBOX_SPACING);
summaryview->sort_type = SORT_ASCENDING;
/* Init summaryview extra data */
-#ifndef G_OS_WIN32
summaryview->simplify_subject_preg = NULL;
-#endif
summary_clear_list(summaryview);
summary_set_column_titles(summaryview);
summary_colorlabel_menu_create(summaryview, FALSE);
msginfo = gtk_cmctree_node_get_row_data(ctree, node);
+ cm_return_if_fail(msginfo != NULL);
+
if (MSG_IS_DELETED(msginfo->flags))
summaryview->deleted++;
gtk_box_pack_start(GTK_BOX(hbox), label,
FALSE, FALSE, 0);
- if (summaryview->sort_key == sort_by[type]) {
+ if (summaryview->sort_key == sort_by[type] ||
+ (summaryview->sort_key == SORT_BY_THREAD_DATE &&
+ sort_by[SORT_BY_DATE] && type == S_COL_DATE)) {
arrow = gtk_arrow_new
(summaryview->sort_type == SORT_ASCENDING
? GTK_ARROW_DOWN : GTK_ARROW_UP,
cmp_func = (GtkCMCListCompareFunc)summary_cmp_by_from;
break;
case SORT_BY_SUBJECT:
-#ifndef G_OS_WIN32
if (summaryview->simplify_subject_preg)
cmp_func = (GtkCMCListCompareFunc)summary_cmp_by_simplified_subject;
else
-#endif
cmp_func = (GtkCMCListCompareFunc)summary_cmp_by_subject;
break;
case SORT_BY_SCORE:
extract_address(from_text);
}
if (!from_text)
- _("(No From)");
+ from_text = _("(No From)");
} else {
gchar *tmp = summary_complete_address(msginfo->from);
if (tmp) {
from_text = msginfo->from;
else {
from_text = msginfo->from;
- extract_address(from_text);
+ if (from_text)
+ extract_address(from_text);
}
if (!from_text)
- _("(No From)");
+ from_text = _("(No From)");
}
}
to_text = to_text ? to_text : _("(No From)");
}
}
- snprintf(tmp2, BUFFSIZE-1, "--> %s", to_text);
+ snprintf(tmp2, BUFFSIZE-1, "➜ %s", to_text);
tmp2[BUFFSIZE-1]='\0';
text[col_pos[S_COL_FROM]] = tmp2;
}
-#ifndef G_OS_WIN32
if (summaryview->simplify_subject_preg != NULL)
text[col_pos[S_COL_SUBJECT]] = msginfo->subject ?
string_remove_match(tmp3, BUFFSIZE, msginfo->subject,
summaryview->simplify_subject_preg) :
_("(No Subject)");
else
-#endif
text[col_pos[S_COL_SUBJECT]] = msginfo->subject ? msginfo->subject :
_("(No Subject)");
if ((vert_layout || small_layout) && prefs_common.two_line_vert) {
if (!FOLDER_SHOWS_TO_HDR(summaryview->folder_item)) {
- gchar *tmp = g_markup_printf_escaped(_("%s\n<span color='%s' style='italic'>From: %s, on %s</span>"),
+ gchar *tmp = g_markup_printf_escaped(g_strconcat("%s\n",
+ "<span color='%s' style='italic'>",
+ _("From: %s, on %s"), "</span>", NULL),
text[col_pos[S_COL_SUBJECT]],
color_dim_rgb,
text[col_pos[S_COL_FROM]],
text[col_pos[S_COL_DATE]]);
text[col_pos[S_COL_SUBJECT]] = tmp;
} else {
- gchar *tmp = g_markup_printf_escaped(_("%s\n<span color='%s' style='italic'>To: %s, on %s</span>"),
+ gchar *tmp = g_markup_printf_escaped(g_strconcat("%s\n",
+ "<span color='%s' style='italic'>",
+ _("To: %s, on %s"), "</span>", NULL),
text[col_pos[S_COL_SUBJECT]],
color_dim_rgb,
text[col_pos[S_COL_TO]],
chg->unset_flags, chg->unset_tmp_flags);
break;
default:
- g_warning("shouldn't happen\n");
+ g_warning("unknown change op");
}
g_free(chg);
}
if (!mdata)
return FALSE;
+ summary_lock(mdata->summaryview);
if (mdata->msginfo == summary_get_selected_msg(mdata->summaryview))
msginfo_mark_as_read(mdata->summaryview, mdata->msginfo,
mdata->summaryview->selected);
procmsg_msginfo_free(mdata->msginfo);
mdata->summaryview->mark_as_read_timeout_tag = 0;
+ summary_unlock(mdata->summaryview);
g_free(mdata);
return FALSE;
data->msginfo = procmsg_msginfo_new_ref(msginfo);
if (summaryview->mark_as_read_timeout_tag != 0)
g_source_remove(summaryview->mark_as_read_timeout_tag);
-
-#if GLIB_CHECK_VERSION(2,14,0)
summaryview->mark_as_read_timeout_tag =
g_timeout_add_seconds(prefs_common.mark_as_read_delay,
msginfo_mark_as_read_timeout, data);
-#else
- summaryview->mark_as_read_timeout_tag =
- g_timeout_add(prefs_common.mark_as_read_delay * 1000,
- msginfo_mark_as_read_timeout, data);
-#endif
} else if (new_window || !prefs_common.mark_as_read_on_new_window) {
msginfo_mark_as_read(summaryview, msginfo, row);
}
if (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, _("Mark all as read"), NULL,
+ "folder as read?"), GTK_STOCK_NO, GTK_STOCK_YES, NULL,
TRUE, NULL, ALERT_QUESTION, G_ALERTDEFAULT);
if ((val & ~G_ALERTDISABLE) != G_ALERTALTERNATE)
folder_item_set_batch(summaryview->folder_item, FALSE);
END_LONG_OPERATION(summaryview);
- node = summary_find_next_msg(summaryview, sel_last);
- if (!node)
+ if (summaryview->sort_type == SORT_ASCENDING) {
+ node = summary_find_next_msg(summaryview, sel_last);
+ if (!node || prefs_common.next_on_delete == FALSE)
+ node = summary_find_prev_msg(summaryview, sel_last);
+ } else {
node = summary_find_prev_msg(summaryview, sel_last);
-
+ if (!node || prefs_common.next_on_delete == FALSE)
+ node = summary_find_next_msg(summaryview, sel_last);
+ }
summary_select_node(summaryview, node, prefs_common.always_show_msg, TRUE);
if (prefs_common.immediate_exec || folder_has_parent_of_type(item, F_TRASH)) {
if (prefs_common.immediate_exec) {
summary_execute(summaryview);
} else {
- GtkCMCTreeNode *node = summary_find_next_msg(summaryview, sel_last);
- if (!node)
+ GtkCMCTreeNode *node = NULL;
+ if (summaryview->sort_type == SORT_ASCENDING) {
+ node = summary_find_next_msg(summaryview, sel_last);
+ if (!node)
+ node = summary_find_prev_msg(summaryview, sel_last);
+ } else {
node = summary_find_prev_msg(summaryview, sel_last);
+ if (!node)
+ node = summary_find_next_msg(summaryview, sel_last);
+ }
summary_select_node(summaryview, node, summaryview->display_msg, TRUE);
summary_status_show(summaryview);
}
if (!summaryview->folder_item ||
FOLDER_TYPE(summaryview->folder_item->folder) == F_NEWS) return;
- to_folder = foldersel_folder_sel(summaryview->folder_item->folder,
- FOLDER_SEL_MOVE, NULL, FALSE);
+ to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_MOVE, NULL, FALSE);
summary_move_selected_to(summaryview, to_folder);
}
if (!summaryview->folder_item) return;
- to_folder = foldersel_folder_sel(summaryview->folder_item->folder,
- FOLDER_SEL_COPY, NULL, FALSE);
+ to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_COPY, NULL, FALSE);
summary_copy_selected_to(summaryview, to_folder);
}
summary_status_show(summaryview);
}
-void summary_select_thread(SummaryView *summaryview, gboolean delete_thread)
+void summary_select_thread(SummaryView *summaryview, gboolean delete_thread,
+ gboolean trash_thread)
{
GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
GtkCMCTreeNode *node = NULL;
g_list_free(copy);
END_LONG_OPERATION(summaryview);
- if (delete_thread) {
+ if (trash_thread) {
if (FOLDER_TYPE(summaryview->folder_item->folder) == F_NEWS)
summary_delete(summaryview);
else
summary_delete_trash(summaryview);
- }
+ } else if (delete_thread)
+ summary_delete(summaryview);
+
summary_status_show(summaryview);
}
if (!new_selected &&
gtkut_ctree_node_is_selected(ctree, node)) {
summary_unselect_all(summaryview);
- new_selected = summary_find_next_msg(summaryview, node);
- if (!new_selected)
- new_selected = summary_find_prev_msg
- (summaryview, node);
+ if (summaryview->sort_type == SORT_ASCENDING) {
+ new_selected = summary_find_next_msg(summaryview, node);
+ if (!new_selected)
+ new_selected = summary_find_prev_msg(summaryview, node);
+ } else {
+ new_selected = summary_find_prev_msg(summaryview, node);
+ if (!new_selected)
+ new_selected = summary_find_next_msg(summaryview, node);
+ }
}
gtk_sctree_remove_node((GtkSCTree *)ctree, node);
}
}
} else
- g_warning("invalid number of color elements (%d)\n", n);
+ g_warning("invalid number of color elements (%d)", n);
/* reset "dont_toggle" state */
g_object_set_data(G_OBJECT(menu), "dont_toggle",
void summaryview_destroy(SummaryView *summaryview)
{
-#ifndef G_OS_WIN32
if(summaryview->simplify_subject_preg) {
regfree(summaryview->simplify_subject_preg);
g_free(summaryview->simplify_subject_preg);
summaryview->simplify_subject_preg = NULL;
}
-#endif
}
static void summary_tags_menu_item_apply_tags_activate_cb(GtkWidget *widget,
gpointer data)
#define BREAK_ON_MODIFIER_KEY() \
if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
+/* Copied from gtkcmclist.c, if it changes there, it has to change
+ * here as well. This is an ugly hack, there must be a better way to
+ * find out how much to move for page up/down. */
+#define CELL_SPACING 1
static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
SummaryView *summaryview)
{
MessageView *messageview;
GtkAdjustment *adj;
gboolean mod_pressed;
+ gfloat row_align = 0;
if (!event)
return TRUE;
gtk_widget_grab_focus(summaryview->folderview->ctree);
mainwindow_exit_folder(summaryview->mainwin);
return TRUE;
- case GDK_KEY_Home:
- case GDK_KEY_End:
+ case GDK_KEY_Home: case GDK_KEY_KP_Home:
+ case GDK_KEY_End: case GDK_KEY_KP_End:
+ case GDK_KEY_Up: case GDK_KEY_KP_Up:
+ case GDK_KEY_Down: case GDK_KEY_KP_Down:
+ case GDK_KEY_Page_Up: case GDK_KEY_KP_Page_Up:
+ case GDK_KEY_Page_Down: case GDK_KEY_KP_Page_Down:
if ((node = summaryview->selected) != NULL) {
GtkCMCTreeNode *next = NULL;
- next = (event->keyval == GDK_KEY_Home)
- ? gtk_cmctree_node_nth(ctree, 0)
- : gtk_cmctree_node_nth(ctree,
- g_list_length(GTK_CMCLIST(ctree)->row_list)-1);
+ switch (event->keyval) {
+ case GDK_KEY_Home: case GDK_KEY_KP_Home:
+ next = gtk_cmctree_node_nth(ctree, 0);
+ break;
+ case GDK_KEY_End: case GDK_KEY_KP_End:
+ next = gtk_cmctree_node_nth(ctree,
+ g_list_length(GTK_CMCLIST(ctree)->row_list)-1);
+ row_align = 1;
+ break;
+ case GDK_KEY_Up: case GDK_KEY_KP_Up:
+ next = gtk_cmctree_node_nth(ctree,
+ MAX(0, GTK_CMCLIST(ctree)->focus_row - 1));
+ break;
+ case GDK_KEY_Down: case GDK_KEY_KP_Down:
+ next = gtk_cmctree_node_nth(ctree,
+ MIN(GTK_CMCLIST(ctree)->focus_row + 1, GTK_CMCLIST(ctree)->rows));
+ row_align = 1;
+ break;
+ case GDK_KEY_Page_Up: case GDK_KEY_KP_Page_Up:
+ next = gtk_cmctree_node_nth(ctree,
+ MAX(0, GTK_CMCLIST(ctree)->focus_row -
+ (2 * GTK_CMCLIST(ctree)->clist_window_height -
+ GTK_CMCLIST(ctree)->row_height - CELL_SPACING) /
+ (2 * (GTK_CMCLIST(ctree)->row_height + CELL_SPACING))));
+ break;
+ case GDK_KEY_Page_Down: case GDK_KEY_KP_Page_Down:
+ next = gtk_cmctree_node_nth(ctree,
+ MIN(GTK_CMCLIST(ctree)->rows - 1, GTK_CMCLIST(ctree)->focus_row +
+ (2 * GTK_CMCLIST(ctree)->clist_window_height -
+ GTK_CMCLIST(ctree)->row_height - CELL_SPACING) /
+ (2 * (GTK_CMCLIST(ctree)->row_height + CELL_SPACING))));
+ row_align = 1;
+ break;
+ }
+
if (next) {
gtk_sctree_select_with_state
(GTK_SCTREE(ctree), next, (event->state & ~GDK_CONTROL_MASK) );
/* Deprecated - what are the non-deprecated equivalents? */
if (gtk_cmctree_node_is_visible(GTK_CMCTREE(ctree), next) != GTK_VISIBILITY_FULL)
- gtk_cmctree_node_moveto(GTK_CMCTREE(ctree), next, 0, 0, 0);
+ gtk_cmctree_node_moveto(GTK_CMCTREE(ctree), next, 0, row_align, 0);
summaryview->selected = next;
}
}
}
return FALSE;
}
+#undef CELL_SPACING
static void quicksearch_execute_cb(QuickSearch *quicksearch, gpointer data)
{
static void summary_date_clicked(GtkWidget *button, SummaryView *summaryview)
{
- summary_sort_by_column_click(summaryview, SORT_BY_DATE);
+ if (summaryview->sort_key == SORT_BY_THREAD_DATE)
+ summary_sort_by_column_click(summaryview, SORT_BY_THREAD_DATE);
+ else
+ summary_sort_by_column_click(summaryview, SORT_BY_DATE);
}
static void summary_from_clicked(GtkWidget *button, SummaryView *summaryview)
g_list_free( msgList );
}
-#ifndef G_OS_WIN32
static regex_t *summary_compile_simplify_regexp(gchar *simplify_subject_regexp)
{
int err;
return preg;
}
-#endif
void summary_set_prefs_from_folderitem(SummaryView *summaryview, FolderItem *item)
{
FolderSortKey sort_key;
cm_return_if_fail(item != NULL);
/* Subject simplification */
-#ifndef G_OS_WIN32
if(summaryview->simplify_subject_preg) {
regfree(summaryview->simplify_subject_preg);
g_free(summaryview->simplify_subject_preg);
if(item->prefs && item->prefs->simplify_subject_regexp &&
item->prefs->simplify_subject_regexp[0] && item->prefs->enable_simplify_subject)
summaryview->simplify_subject_preg = summary_compile_simplify_regexp(item->prefs->simplify_subject_regexp);
-#endif
+
/* Sorting */
sort_key = item->sort_key;
sort_type = item->sort_type;
guint new, unread, unreadmarked, marked, total;
guint replied, forwarded, locked, ignored, watched;
static gboolean tips_initialized = FALSE;
-#if !(GTK_CHECK_VERSION(2,12,0))
- GtkTooltips *tips = summaryview->tooltips;
-#endif
if (prefs_common.layout_mode != SMALL_LAYOUT) {
if (tips_initialized) {