static gint summary_toggle_pressed (GtkWidget *eventbox,
GdkEventButton *event,
SummaryView *summaryview);
+static gint summary_folder_eventbox_pressed
+ (GtkWidget *eventbox,
+ GdkEventButton *event,
+ SummaryView *summaryview);
static gboolean summary_button_pressed (GtkWidget *ctree,
GdkEventButton *event,
SummaryView *summaryview);
static gboolean summary_key_pressed (GtkWidget *ctree,
GdkEventKey *event,
SummaryView *summaryview);
-static void summary_open_row (GtkSCTree *sctree,
- SummaryView *summaryview);
static void summary_tree_expanded (GtkCTree *ctree,
GtkCTreeNode *node,
SummaryView *summaryview);
gint y,
guint time,
SummaryView *summaryview);
-
+static void summary_drag_end(GtkWidget *widget,
+ GdkDragContext *drag_context,
+ SummaryView *summaryview);
/* custom compare functions for sorting */
static gint summary_cmp_by_mark (GtkCList *clist,
MsgInfo *msg);
static gboolean summary_update_msg (gpointer source, gpointer data);
-static gboolean summary_update_folder_item_name(gpointer source, gpointer data);
+static gboolean summary_update_folder_item_hook(gpointer source, gpointer data);
+static gboolean summary_update_folder_hook(gpointer source, gpointer data);
GtkTargetEntry summary_drag_types[2] =
{
GtkWidget *toggle_arrow;
GtkWidget *popupmenu;
GtkWidget *toggle_search;
- GtkTooltips *search_tip;
GtkItemFactory *popupfactory;
gint n_entries;
QuickSearch *quicksearch;
debug_print("Creating summary view...\n");
summaryview = g_new0(SummaryView, 1);
+ summaryview->tips = gtk_tooltips_new();
#define SUMMARY_VBOX_SPACING 3
vbox = gtk_vbox_new(FALSE, SUMMARY_VBOX_SPACING);
stat_box2 = gtk_hbox_new(FALSE, 0);
gtk_widget_show(stat_box2);
- search_tip = gtk_tooltips_new();
toggle_search = gtk_toggle_button_new();
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle_search),
prefs_common.show_searchbar);
gtk_widget_show(toggle_search);
- gtk_tooltips_set_tip(GTK_TOOLTIPS(search_tip),
+ gtk_tooltips_set_tip(GTK_TOOLTIPS(summaryview->tips),
toggle_search,
_("Toggle quick search bar"), NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
+#ifndef MAEMO
gtk_box_pack_start(GTK_BOX(vbox), scrolledwin, TRUE, TRUE, 0);
+#endif
gtk_widget_set_size_request(vbox,
prefs_common.summaryview_width,
prefs_common.summaryview_height);
quicksearch = quicksearch_new();
gtk_box_pack_start(GTK_BOX(vbox), quicksearch_get_widget(quicksearch), FALSE, FALSE, 0);
+#ifdef MAEMO
+ gtk_box_pack_start(GTK_BOX(vbox), scrolledwin, TRUE, TRUE, 0);
+#endif
quicksearch_set_execute_callback(quicksearch, quicksearch_execute_cb, summaryview);
g_signal_connect (G_OBJECT(toggle_search), "toggled",
hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, summary_update_msg, (gpointer) summaryview);
summaryview->folder_item_update_callback_id =
hooks_register_hook(FOLDER_ITEM_UPDATE_HOOKLIST,
- summary_update_folder_item_name,
+ summary_update_folder_item_hook,
+ (gpointer) summaryview);
+ summaryview->folder_update_callback_id =
+ hooks_register_hook(FOLDER_UPDATE_HOOKLIST,
+ summary_update_folder_hook,
(gpointer) summaryview);
summaryview->target_list = gtk_target_list_new(summary_drag_types, 2);
else
quicksearch_hide(quicksearch);
- if (prefs_common.layout_mode == WIDE_MSGLIST_LAYOUT)
+ if (prefs_common.layout_mode == WIDE_MSGLIST_LAYOUT ||
+ prefs_common.layout_mode == SMALL_LAYOUT)
gtk_widget_hide(summaryview->toggle_eventbox);
return summaryview;
gtk_box_pack_end(GTK_BOX(summaryview->stat_box), summaryview->statlabel_msgs, FALSE, FALSE, 4);
gtk_widget_show_all(summaryview->stat_box);
gtk_widget_show_all(summaryview->stat_box2);
- if (prefs_common.layout_mode == WIDE_MSGLIST_LAYOUT)
+ if (prefs_common.layout_mode == WIDE_MSGLIST_LAYOUT ||
+ prefs_common.layout_mode == SMALL_LAYOUT)
gtk_widget_hide(summaryview->toggle_eventbox);
else
gtk_widget_show(summaryview->toggle_eventbox);
break;
case VERTICAL_LAYOUT:
+ case SMALL_LAYOUT:
gtk_box_pack_start(GTK_BOX(summaryview->stat_box), summaryview->hbox_l, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(summaryview->stat_box2), summaryview->statlabel_msgs, FALSE, FALSE, 4);
gtk_widget_show_all(summaryview->stat_box);
gtk_widget_show_all(summaryview->stat_box2);
- gtk_widget_show(summaryview->toggle_eventbox);
+ if (prefs_common.layout_mode == SMALL_LAYOUT)
+ gtk_widget_hide(summaryview->toggle_eventbox);
+ else
+ gtk_widget_show(summaryview->toggle_eventbox);
+
break;
}
gtk_widget_unref(summaryview->hbox_l);
pango_font_description_free(font_desc);
}
+static void summary_set_folder_pixmap(SummaryView *summaryview, StockPixmap icon)
+{
+ GtkWidget *pixmap;
+ if (!summaryview->folder_pixmap_eventbox) {
+ summaryview->folder_pixmap_eventbox = gtk_event_box_new();
+ gtk_widget_show(summaryview->folder_pixmap_eventbox);
+ gtk_box_pack_start(GTK_BOX(summaryview->hbox_l), summaryview->folder_pixmap_eventbox, FALSE, FALSE, 4);
+ gtk_box_reorder_child(GTK_BOX(summaryview->hbox_l), summaryview->folder_pixmap_eventbox, 0); /* search_toggle before */
+ g_signal_connect(G_OBJECT(summaryview->folder_pixmap_eventbox), "button_press_event",
+ G_CALLBACK(summary_folder_eventbox_pressed),
+ summaryview);
+ }
+ if (summaryview->folder_pixmap)
+ gtk_widget_destroy(summaryview->folder_pixmap);
+
+ pixmap = stock_pixmap_widget(summaryview->hbox_l, icon);
+ gtk_container_add(GTK_CONTAINER(summaryview->folder_pixmap_eventbox), pixmap);
+ gtk_widget_show(pixmap);
+ summaryview->folder_pixmap = pixmap;
+}
+
void summary_init(SummaryView *summaryview)
{
GtkWidget *pixmap;
summary_set_fonts(summaryview);
- pixmap = stock_pixmap_widget(summaryview->hbox_l, STOCK_PIXMAP_DIR_OPEN);
- gtk_box_pack_start(GTK_BOX(summaryview->hbox_l), pixmap, FALSE, FALSE, 4);
- gtk_box_reorder_child(GTK_BOX(summaryview->hbox_l), pixmap, 0);
- gtk_widget_show(pixmap);
- summaryview->folder_pixmap = pixmap;
+ summary_set_folder_pixmap(summaryview, STOCK_PIXMAP_DIR_OPEN);
pixmap = stock_pixmap_widget(summaryview->hbox, STOCK_PIXMAP_QUICKSEARCH);
gtk_container_add (GTK_CONTAINER(summaryview->toggle_search), pixmap);
is_refresh = (item == summaryview->folder_item) ? TRUE : FALSE;
- if (!is_refresh)
+ if (!is_refresh) {
main_create_mailing_list_menu (summaryview->mainwin, NULL);
-
+ if (prefs_common.layout_mode == SMALL_LAYOUT) {
+ if (item) {
+ mainwindow_enter_folder(summaryview->mainwin);
+ gtk_widget_grab_focus(summaryview->ctree);
+ }
+ }
+ }
if (!prefs_common.summary_quicksearch_sticky
&& !prefs_common.summary_quicksearch_recurse
&& !quicksearch_is_running(summaryview->quicksearch)
FOLDER_SHOWS_TO_HDR(item) &&
!summaryview->col_state[summaryview->col_pos[S_COL_TO]].visible)
type = S_COL_TO;
- if (prefs_common.trans_hdr)
+ if(type == S_COL_NUMBER)
title = gettext(col_label[type]);
else
- title = col_label[type];
+ title = prefs_common_translated_header_name(col_label[type]);
break;
default:
title = gettext(col_label[type]);
if (!mlist) return;
- debug_print("\tSetting summary from message data...");
+ debug_print("\tSetting summary from message data...\n");
STATUSBAR_PUSH(summaryview->mainwin,
_("Setting summary from message data..."));
gdk_flush();
if (!new_window) {
if (summaryview->displayed == row)
return;
- else
+ else if (summaryview->messageview)
summaryview->messageview->filtered = FALSE;
}
g_return_if_fail(row != NULL);
g_return_if_fail(msginfo);
- if (new_window) {
+ if (new_window && prefs_common.layout_mode != SMALL_LAYOUT) {
MessageView *msgview;
msgview = messageview_create_with_new_window(summaryview->mainwin);
} else {
MessageView *msgview;
- msgview = summaryview->messageview;
- summaryview->last_displayed = summaryview->displayed;
- summaryview->displayed = row;
- if (!messageview_is_visible(msgview)) {
- main_window_toggle_message_view(summaryview->mainwin);
- GTK_EVENTS_FLUSH();
+ if (prefs_common.layout_mode == SMALL_LAYOUT) {
+ if (summaryview->ext_messageview == NULL)
+ summaryview->ext_messageview = messageview_create_with_new_window(summaryview->mainwin);
+ else
+ gtkut_window_popup(summaryview->ext_messageview->window);
+ msgview = summaryview->ext_messageview;
+ summaryview->last_displayed = summaryview->displayed;
+ summaryview->displayed = row;
+ val = messageview_show(msgview, msginfo, all_headers);
+ if (GTK_CLIST(msgview->mimeview->ctree)->row_list == NULL)
+ gtk_widget_grab_focus(summaryview->ctree);
+ gtkut_ctree_node_move_if_on_the_edge(ctree, row,
+ GTK_CLIST(summaryview->ctree)->focus_row);
+ } else {
+ msgview = summaryview->messageview;
+ summaryview->last_displayed = summaryview->displayed;
+ summaryview->displayed = row;
+ if (!messageview_is_visible(msgview)) {
+ main_window_toggle_message_view(summaryview->mainwin);
+ GTK_EVENTS_FLUSH();
+ }
+ val = messageview_show(msgview, msginfo, all_headers);
+ if (GTK_CLIST(msgview->mimeview->ctree)->row_list == NULL)
+ gtk_widget_grab_focus(summaryview->ctree);
+ gtkut_ctree_node_move_if_on_the_edge(ctree, row,
+ GTK_CLIST(summaryview->ctree)->focus_row);
}
- val = messageview_show(msgview, msginfo, all_headers);
- if (GTK_CLIST(msgview->mimeview->ctree)->row_list == NULL)
- gtk_widget_grab_focus(summaryview->ctree);
- gtkut_ctree_node_move_if_on_the_edge(ctree, row,
- GTK_CLIST(summaryview->ctree)->focus_row);
}
if (val == 0 && MSG_IS_UNREAD(msginfo->flags)) {
msginfo = gtk_ctree_node_get_row_data(ctree, summaryview->selected);
source_window_show_msg(srcwin, msginfo);
source_window_show(srcwin);
+#ifdef MAEMO
+ maemo_window_full_screen_if_needed(GTK_WINDOW(srcwin->window));
+ maemo_connect_key_press_to_mainwindow(GTK_WINDOW(srcwin->window));
+#endif
}
void summary_reedit(SummaryView *summaryview)
void summary_toggle_view(SummaryView *summaryview)
{
+ if (prefs_common.layout_mode == SMALL_LAYOUT)
+ return;
if (!messageview_is_visible(summaryview->messageview) &&
summaryview->selected)
summary_display_msg(summaryview,
summary_set_row_marks(summaryview, row);
}
} else {
- log_error(_("An error happened while learning.\n"));
+ log_error(LOG_PROTOCOL, _("An error happened while learning.\n"));
}
prefs_common.immediate_exec = immediate_exec;
if (!summaryview->folder_item) return;
if (!prefs_common.live_dangerously) {
+ gchar *buf = NULL;
+ int num = g_list_length(GTK_CLIST(summaryview->ctree)->selection);
+ if (num == 1)
+ buf = g_strdup_printf(_(
+ "Do you really want to delete the selected message?"));
+ else
+ buf = g_strdup_printf(_(
+ "Do you really want to delete the %d selected messages?"),
+ num);
aval = alertpanel(_("Delete message(s)"),
- _("Do you really want to delete selected message(s)?"),
+ buf,
GTK_STOCK_CANCEL, "+"GTK_STOCK_DELETE, NULL);
+ g_free(buf);
if (aval != G_ALERTALTERNATE) return;
}
Xstrdup_a(filename, msginfo->subject, return);
subst_for_filename(filename);
}
- if (g_getenv ("G_BROKEN_FILENAMES") &&
- filename && !g_utf8_validate(filename, -1, NULL)) {
+ if (filename && !g_utf8_validate(filename, -1, NULL)) {
gchar *oldstr = filename;
filename = conv_codeset_strdup(filename,
conv_get_locale_charset_str(),
_("Filtering"),
_("There are some filtering rules that belong to an account.\n"
"Please choose what to do with these rules:"),
- GTK_STOCK_CANCEL, _("+_Filter"), NULL, TRUE, vbox);
- if ((val & ~G_ALERTDISABLE) == G_ALERTDEFAULT) {
+ GTK_STOCK_CANCEL, _("_Filter"), NULL, TRUE, G_ALERTALTERNATE, vbox);
+
+ if ((val & ~G_ALERTDISABLE) != G_ALERTALTERNATE) {
return FALSE;
} else if (val & G_ALERTDISABLE)
prefs_common.ask_apply_per_account_filtering_rules = FALSE;
if (hooks_invoke(MAIL_MANUAL_FILTERING_HOOKLIST, &mail_filtering_data))
return;
- filter_message_by_msginfo(filtering_rules, msginfo, NULL);
+ filter_message_by_msginfo(filtering_rules, msginfo, NULL,
+ FILTERING_MANUALLY, NULL);
}
void summary_msginfo_filter_open(FolderItem * item, MsgInfo *msginfo,
g_signal_connect(G_OBJECT(ctree), "button_press_event",
G_CALLBACK(summary_button_pressed),
summaryview);
+#ifndef MAEMO
g_signal_connect(G_OBJECT(ctree), "popup-menu",
G_CALLBACK(summary_popup_menu), summaryview);
+#else
+ gtk_widget_tap_and_hold_setup(GTK_WIDGET(ctree), NULL, NULL,
+ GTK_TAP_AND_HOLD_NONE | GTK_TAP_AND_HOLD_NO_INTERNALS);
+ g_signal_connect(G_OBJECT(ctree), "tap-and-hold",
+ G_CALLBACK(summary_popup_menu), summaryview);
+#endif
g_signal_connect(G_OBJECT(ctree), "button_release_event",
G_CALLBACK(summary_button_released),
summaryview);
g_signal_connect(G_OBJECT(ctree), "drag_data_get",
G_CALLBACK(summary_drag_data_get),
summaryview);
+ g_signal_connect(G_OBJECT(ctree), "drag_end",
+ G_CALLBACK(summary_drag_end),
+ summaryview);
gtk_drag_dest_set(ctree, GTK_DEST_DEFAULT_ALL & ~GTK_DEST_DEFAULT_HIGHLIGHT,
summary_drag_types, 2,
/* callback functions */
+static gint summary_folder_eventbox_pressed(GtkWidget *eventbox, GdkEventButton *event,
+ SummaryView *summaryview)
+{
+ if (event) {
+ gtk_widget_grab_focus(summaryview->folderview->ctree);
+ mainwindow_exit_folder(summaryview->mainwin);
+ }
+ return TRUE;
+}
+
static gint summary_toggle_pressed(GtkWidget *eventbox, GdkEventButton *event,
SummaryView *summaryview)
{
/* FALLTHROUGH */
case GDK_Escape:
gtk_widget_grab_focus(summaryview->folderview->ctree);
+ mainwindow_exit_folder(summaryview->mainwin);
return TRUE;
case GDK_Home:
case GDK_End:
case GDK_t:
case GDK_l:
case GDK_c:
+ case GDK_a:
if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) == 0) {
g_signal_stop_emission_by_name(G_OBJECT(widget),
"key_press_event");
}
}
-static void summary_open_row(GtkSCTree *sctree, SummaryView *summaryview)
+void summary_open_row(GtkSCTree *sctree, SummaryView *summaryview)
{
if (FOLDER_SHOWS_TO_HDR(summaryview->folder_item))
summary_reedit(summaryview);
if (summary_is_locked(summaryview)
&& !GTK_SCTREE(ctree)->selecting_range
+ && summaryview->messageview
&& summaryview->messageview->mimeview
&& summaryview->messageview->mimeview->type == MIMEVIEW_TEXT
&& summaryview->messageview->mimeview->textview->loading) {
if (procmsg_spam_learner_learn(msginfo, NULL, FALSE) == 0)
summary_msginfo_unset_flags(msginfo, MSG_SPAM, 0);
else
- log_error(_("An error happened while learning.\n"));
+ log_error(LOG_PROTOCOL, _("An error happened while learning.\n"));
} else if (!MSG_IS_REPLIED(msginfo->flags) &&
!MSG_IS_FORWARDED(msginfo->flags)) {
marked_unread = TRUE;
context = gtk_drag_begin(widget, summaryview->target_list,
GDK_ACTION_MOVE|GDK_ACTION_COPY|GDK_ACTION_DEFAULT, button, event);
gtk_drag_set_icon_default(context);
+ if (prefs_common.layout_mode == SMALL_LAYOUT) {
+ GtkWidget *paned = GTK_WIDGET_PTR(summaryview)->parent;
+ if (paned && GTK_IS_PANED(paned)) {
+ mainwindow_reset_paned(GTK_PANED(paned));
+ }
+ }
+}
+
+static gboolean summary_return_to_list(void *data)
+{
+ SummaryView *summaryview = (SummaryView *)data;
+ mainwindow_enter_folder(summaryview->mainwin);
+ return FALSE;
+}
+
+static void summary_drag_end (GtkWidget *widget,
+ GdkDragContext *drag_context,
+ SummaryView *summaryview)
+{
+ if (prefs_common.layout_mode == SMALL_LAYOUT) {
+ g_timeout_add(250, summary_return_to_list, summaryview);
+ }
}
static void summary_drag_data_get(GtkWidget *widget,
GtkWidget *ctree = summaryview->ctree;
GtkWidget *pixmap;
- gtk_widget_destroy(summaryview->folder_pixmap);
-
stock_pixmap_gdk(ctree, STOCK_PIXMAP_MARK, &markxpm, &markxpmmask);
stock_pixmap_gdk(ctree, STOCK_PIXMAP_DELETED, &deletedxpm, &deletedxpmmask);
stock_pixmap_gdk(ctree, STOCK_PIXMAP_NEW, &newxpm, &newxpmmask);
stock_pixmap_gdk(ctree, STOCK_PIXMAP_MOVED, &movedxpm, &movedxpmmask);
stock_pixmap_gdk(ctree, STOCK_PIXMAP_COPIED, &copiedxpm, &copiedxpmmask);
- pixmap = stock_pixmap_widget(summaryview->hbox, STOCK_PIXMAP_DIR_OPEN);
- gtk_box_pack_start(GTK_BOX(summaryview->hbox), pixmap, FALSE, FALSE, 4);
- gtk_box_reorder_child(GTK_BOX(summaryview->hbox), pixmap, 1); /* search_toggle before */
- gtk_widget_show(pixmap);
- summaryview->folder_pixmap = pixmap;
+ summary_set_folder_pixmap(summaryview, STOCK_PIXMAP_DIR_OPEN);
pixmap = stock_pixmap_widget(summaryview->hbox, STOCK_PIXMAP_QUICKSEARCH);
gtk_container_remove (GTK_CONTAINER(summaryview->toggle_search),
return FALSE;
}
-static gboolean summary_update_folder_item_name(gpointer source, gpointer data)
+void summary_update_unread(SummaryView *summaryview, FolderItem *removed_item)
+{
+ guint new, unread, unreadmarked, marked, total;
+ static gboolean tips_initialized = FALSE;
+
+ if (prefs_common.layout_mode != SMALL_LAYOUT) {
+ if (tips_initialized) {
+ summary_set_folder_pixmap(summaryview, STOCK_PIXMAP_DIR_OPEN);
+ gtk_tooltips_set_tip(GTK_TOOLTIPS(summaryview->tips),
+ summaryview->folder_pixmap_eventbox,
+ NULL, NULL);
+ tips_initialized = FALSE;
+ }
+ return;
+ }
+ folder_count_total_msgs(&new, &unread, &unreadmarked, &marked, &total);
+ if (removed_item) {
+ total -= removed_item->total_msgs;
+ new -= removed_item->new_msgs;
+ unread -= removed_item->unread_msgs;
+ }
+
+ if (new > 0 || unread > 0) {
+ tips_initialized = TRUE;
+ summary_set_folder_pixmap(summaryview, STOCK_PIXMAP_DIR_OPEN_HRM);
+ gtk_tooltips_set_tip(GTK_TOOLTIPS(summaryview->tips),
+ summaryview->folder_pixmap_eventbox,
+ _("Go back to the folder list (You have unread messages)"), NULL);
+ } else {
+ tips_initialized = TRUE;
+ summary_set_folder_pixmap(summaryview, STOCK_PIXMAP_DIR_OPEN);
+ gtk_tooltips_set_tip(GTK_TOOLTIPS(summaryview->tips),
+ summaryview->folder_pixmap_eventbox,
+ _("Go back to the folder list"), NULL);
+ }
+}
+
+static gboolean summary_update_folder_item_hook(gpointer source, gpointer data)
{
FolderItemUpdateData *hookdata = (FolderItemUpdateData *)source;
SummaryView *summaryview = (SummaryView *)data;
gtk_label_set_text(GTK_LABEL(summaryview->statlabel_folder), name);
g_free(name);
}
+ summary_update_unread(summaryview, NULL);
+
+ return FALSE;
+}
+
+static gboolean summary_update_folder_hook(gpointer source, gpointer data)
+{
+ FolderUpdateData *hookdata;
+ SummaryView *summaryview = (SummaryView *)data;
+ hookdata = source;
+ if (hookdata->update_flags & FOLDER_REMOVE_FOLDERITEM)
+ summary_update_unread(summaryview, hookdata->item);
+ else
+ summary_update_unread(summaryview, NULL);
return FALSE;
}