2006-05-18 [colin] 2.2.0cvs33
[claws.git] / src / summaryview.c
index 26838294bebf933a8a84872be9d1e16234a1a5ad..86a1576545eb4c23d2a637d69d4713b040bef6e4 100644 (file)
@@ -751,6 +751,7 @@ void summary_init(SummaryView *summaryview)
        summary_clear_list(summaryview);
        summary_set_column_titles(summaryview);
        summary_colorlabel_menu_create(summaryview, FALSE);
+       main_create_mailing_list_menu (summaryview->mainwin, NULL);     
        summary_set_menu_sensitive(summaryview);
 
 }
@@ -847,6 +848,9 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 
        is_refresh = (item == summaryview->folder_item) ? TRUE : FALSE;
 
+       if (!is_refresh)
+               main_create_mailing_list_menu (summaryview->mainwin, NULL);
+
        if (!prefs_common.summary_quicksearch_sticky
         && !prefs_common.summary_quicksearch_recurse
         && !quicksearch_is_running(summaryview->quicksearch)
@@ -1059,20 +1063,66 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                }
        } else {
                switch (prefs_common.select_on_entry) {
-                       case SELECTONENTRY_NEW:
+                       case SELECTONENTRY_MNU:
                                node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_MARKED, FALSE);
+                               if (node == NULL)
+                                       node = summary_find_next_flagged_msg(summaryview, NULL,
                                                                     MSG_NEW, FALSE);
                                if (node == NULL)
                                        node = summary_find_next_flagged_msg(summaryview, NULL,
                                                                     MSG_UNREAD, FALSE);
                                break;
-                       case SELECTONENTRY_UNREAD:
+                       case SELECTONENTRY_MUN:
                                node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_MARKED, FALSE);
+                               if (node == NULL)
+                                       node = summary_find_next_flagged_msg(summaryview, NULL,
                                                                     MSG_UNREAD, FALSE);
                                if (node == NULL)
                                        node = summary_find_next_flagged_msg(summaryview, NULL,
                                                                     MSG_NEW, FALSE);
                                break;
+                       case SELECTONENTRY_NMU:
+                               node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_NEW, FALSE);
+                               if (node == NULL)
+                                       node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_MARKED, FALSE);
+                               if (node == NULL)
+                                       node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_UNREAD, FALSE);
+                               break;
+                       case SELECTONENTRY_NUM:
+                               node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_NEW, FALSE);
+                               if (node == NULL)
+                                       node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_UNREAD, FALSE);
+                               if (node == NULL)
+                                       node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_MARKED, FALSE);
+                               break;
+                       case SELECTONENTRY_UNM:
+                               node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_UNREAD, FALSE);
+                               if (node == NULL)
+                                       node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_NEW, FALSE);
+                               if (node == NULL)
+                                       node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_MARKED, FALSE);
+                               break;
+                       case SELECTONENTRY_UMN:
+                               node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_UNREAD, FALSE);
+                               if (node == NULL)
+                                       node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_MARKED, FALSE);
+                               if (node == NULL)
+                                       node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_NEW, FALSE);
+                               break;
                        default:
                                node = NULL;
                }
@@ -1259,15 +1309,15 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
                gchar *const entry;
                SensitiveCond cond;
        } entry[] = {
-               {"/Reply"                       , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
-               {"/Reply to"                    , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
-               {"/Reply to/all"                , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
-               {"/Reply to/sender"             , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
-               {"/Reply to/mailing list"       , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
+               {"/Reply"                       , M_HAVE_ACCOUNT|M_TARGET_EXIST},
+               {"/Reply to"                    , M_HAVE_ACCOUNT|M_TARGET_EXIST},
+               {"/Reply to/all"                , M_HAVE_ACCOUNT|M_TARGET_EXIST},
+               {"/Reply to/sender"             , M_HAVE_ACCOUNT|M_TARGET_EXIST},
+               {"/Reply to/mailing list"       , M_HAVE_ACCOUNT|M_TARGET_EXIST},
 
                {"/Forward"                     , M_HAVE_ACCOUNT|M_TARGET_EXIST},
                {"/Forward as attachment"       , M_HAVE_ACCOUNT|M_TARGET_EXIST},
-               {"/Redirect"                    , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
+               {"/Redirect"                    , M_HAVE_ACCOUNT|M_TARGET_EXIST},
 
                {"/Move..."                     , M_TARGET_EXIST|M_ALLOW_DELETE|M_NOT_NEWS},
                {"/Copy..."                     , M_TARGET_EXIST|M_EXEC},
@@ -2170,8 +2220,7 @@ void summary_reflect_prefs(void)
        if (last_font && !strcmp(last_font, NORMAL_FONT))
                update_font = FALSE;
 
-       if (last_font)
-               g_free(last_font);
+       g_free(last_font);
        
        last_font = g_strdup(NORMAL_FONT);
 
@@ -2450,7 +2499,8 @@ static gchar *summary_complete_address(const gchar *addr)
 
        Xstrdup_a(email_addr, addr, return NULL);
        extract_address(email_addr);
-       g_return_val_if_fail(*email_addr, NULL);
+       if (!*email_addr)
+               return NULL;
 
        /*
         * completion stuff must be already initialized
@@ -3150,7 +3200,21 @@ void summary_mark_all_read(SummaryView *summaryview)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        GtkCTreeNode *node;
+       AlertValue val;
 
+       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, GTK_STOCK_YES, NULL,
+                         TRUE, NULL, ALERT_QUESTION, G_ALERTALTERNATE);
+
+               if (val == G_ALERTDEFAULT ||
+                   val == (G_ALERTDEFAULT|G_ALERTDISABLE))
+                       return;
+               else if (val == (G_ALERTALTERNATE|G_ALERTDISABLE))
+                       prefs_common.ask_mark_all_read = FALSE;
+       }
+       
        START_LONG_OPERATION(summaryview);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list); node != NULL;
@@ -3895,7 +3959,7 @@ gboolean summary_execute(SummaryView *summaryview)
                                        (summaryview, node);
                }
 
-               gtk_sctree_remove_node(ctree, node);
+               gtk_sctree_remove_node((GtkSCTree *)ctree, node);
        }
 
        folder_item_update_thaw();
@@ -4564,6 +4628,16 @@ static void summary_colorlabel_menu_create(SummaryView *summaryview, gboolean re
        summaryview->colorlabel_menu = menu;
 }
 
+static gboolean summary_popup_menu(GtkWidget *widget, gpointer data)
+{
+       SummaryView *summaryview = (SummaryView *)data;
+       summaryview->display_msg = messageview_is_visible(summaryview->messageview);
+
+       gtk_menu_popup(GTK_MENU(summaryview->popupmenu), NULL, NULL,
+                      NULL, NULL, 0, gtk_get_current_event_time());
+       return TRUE;
+}
+
 static GtkWidget *summary_ctree_create(SummaryView *summaryview)
 {
        GtkWidget *ctree;
@@ -4666,6 +4740,8 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
        g_signal_connect(G_OBJECT(ctree), "button_press_event",
                         G_CALLBACK(summary_button_pressed),
                         summaryview);
+       g_signal_connect(G_OBJECT(ctree), "popup-menu",
+                        G_CALLBACK(summary_popup_menu), summaryview);
        g_signal_connect(G_OBJECT(ctree), "button_release_event",
                         G_CALLBACK(summary_button_released),
                         summaryview);
@@ -4777,9 +4853,9 @@ static gboolean summary_button_released(GtkWidget *ctree, GdkEventButton *event,
        return FALSE;
 }
 
-void summary_pass_key_press_event(SummaryView *summaryview, GdkEventKey *event)
+gboolean summary_pass_key_press_event(SummaryView *summaryview, GdkEventKey *event)
 {
-       summary_key_pressed(summaryview->ctree, event, summaryview);
+       return summary_key_pressed(summaryview->ctree, event, summaryview);
 }
 
 #define BREAK_ON_MODIFIER_KEY() \
@@ -4994,6 +5070,7 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
        g_return_if_fail(msginfo != NULL);
 
+       main_create_mailing_list_menu (summaryview->mainwin, msginfo);
        toolbar_set_learn_button
                (summaryview->mainwin->toolbar,
                 MSG_IS_SPAM(msginfo->flags)?LEARN_HAM:LEARN_SPAM);
@@ -5842,19 +5919,22 @@ static void summary_find_answers (SummaryView *summaryview, MsgInfo *msg)
                summary_select_node(summaryview, node, TRUE, TRUE);
 }
 
-void summaryview_export_mbox_list(SummaryView *summaryview)
+gint summaryview_export_mbox_list(SummaryView *summaryview)
+/* return values: -2 skipped, -1 error, 0 OK */
 {
        GSList *list = summary_get_selected_msg_list(summaryview);
        gchar *mbox = filesel_select_file_save(_("Export to mbox file"), NULL);
+       gint ret;
        
        if (mbox == NULL || list == NULL)
-               return;
+               return -1;
                
-       export_list_to_mbox(list, mbox);
+       ret = export_list_to_mbox(list, mbox);
        
        g_slist_free(list);
        g_free(mbox);
        
+       return ret;
 }
 
 void summaryview_lock(SummaryView *summaryview, FolderItem *item)