fix bug 4239, 'Preferences: Text Options Header Display modal is not modal' (sic)
[claws.git] / src / plugins / att_remover / att_remover.c
index a60c1efa9e5e10c49dd88e0209438f01b717845c..f98e0d8d1b3151b71bfb7e9f4103eaf21cda73bd 100644 (file)
@@ -66,7 +66,7 @@ static PrefParam prefs[] = {
         NULL, NULL},
         {"win_height", "-1", &AttRemoverData.win_height, P_INT, NULL, 
          NULL, NULL},
-        {0,0,0,0}
+        {0,0,0,0,0,0,0}
 };
 
 enum {
@@ -87,7 +87,7 @@ static MimeInfo *find_first_text_part(MimeInfo *partinfo)
 static gboolean key_pressed_cb(GtkWidget *widget, GdkEventKey *event,
                                AttRemover *attremover)
 {
-       if (event && event->keyval == GDK_Escape)
+       if (event && event->keyval == GDK_KEY_Escape)
                gtk_widget_destroy(attremover->window);
 
        return FALSE;
@@ -116,7 +116,7 @@ static gint save_new_message(MsgInfo *oldmsg, MsgInfo *newmsg, MimeInfo *info,
        
        finalmsg = procmsg_msginfo_new_from_mimeinfo(newmsg, info);
        if (!finalmsg) {
-               procmsg_msginfo_free(newmsg);
+               procmsg_msginfo_free(&newmsg);
                return -1;
        }
 
@@ -129,18 +129,23 @@ static gint save_new_message(MsgInfo *oldmsg, MsgInfo *newmsg, MimeInfo *info,
                flags.tmp_flags &= ~MSG_HAS_ATTACHMENT;
 
        oldmsg->flags.perm_flags &= ~MSG_LOCKED;
+       msgnum = folder_item_add_msg(item, finalmsg->plaintext_file, &flags, TRUE);
+       if (msgnum < 0) {
+               g_warning("could not add message without attachments");
+               procmsg_msginfo_free(&newmsg);
+               procmsg_msginfo_free(&finalmsg);
+               return msgnum;
+       }
        folder_item_remove_msg(item, oldmsg->msgnum);
-       msgnum = folder_item_add_msg(item, finalmsg->plaintext_file, 
-                       &flags, TRUE);
        finalmsg->msgnum = msgnum;
-       procmsg_msginfo_free(newmsg);
-       procmsg_msginfo_free(finalmsg);
+       procmsg_msginfo_free(&newmsg);
+       procmsg_msginfo_free(&finalmsg);
                
        newmsg = folder_item_get_msginfo(item, msgnum);
        if (newmsg && item) {
                procmsg_msginfo_unset_flags(newmsg, ~0, ~0);
                procmsg_msginfo_set_flags(newmsg, flags.perm_flags, flags.tmp_flags);
-               procmsg_msginfo_free(newmsg);
+               procmsg_msginfo_free(&newmsg);
        }
        
        return msgnum;
@@ -168,12 +173,12 @@ static void remove_attachments_cb(GtkWidget *widget, AttRemover *attremover)
        partinfo = procmime_mimeinfo_next(partinfo);
        if (!partinfo || !gtk_tree_model_get_iter_first(model, &iter)) {
                gtk_widget_destroy(attremover->window);
-               procmsg_msginfo_free(newmsg);
+               procmsg_msginfo_free(&newmsg);
                return;
        }
 
        main_window_cursor_wait(mainwin);
-       gtk_cmclist_freeze(GTK_CMCLIST(summaryview->ctree));
+       summary_freeze(summaryview);
        folder_item_update_freeze();
        inc_lock();
        
@@ -242,11 +247,11 @@ static void remove_attachments_cb(GtkWidget *widget, AttRemover *attremover)
                         
        inc_unlock();
        folder_item_update_thaw();
-       gtk_cmclist_thaw(GTK_CMCLIST(summaryview->ctree));
+       summary_thaw(summaryview);
        main_window_cursor_normal(mainwin);
 
        if (msgnum > 0)
-               summary_select_by_msgnum(summaryview, msgnum);
+               summary_select_by_msgnum(summaryview, msgnum, TRUE);
 
        gtk_widget_destroy(attremover->window);
 }
@@ -296,9 +301,9 @@ static void fill_attachment_store(GtkTreeView *list_view, MimeInfo *partinfo)
                if (!name)
                        name = _("unknown");
                
-               label = g_strconcat(_("<b>Type: </b>"), content_type, "   ",
-                       _("<b>Size: </b>"), to_human_readable((goffset)partinfo->length),
-                       "\n", _("<b>Filename: </b>"), name, NULL);
+               label = g_strconcat("<b>",_("Type:"), "</b> ", content_type, "   <b>",
+                        _("Size:"), "</b> ", to_human_readable((goffset)partinfo->length),
+                       "\n", "<b>", _("Filename:"), "</b> ", name, NULL);
 
                gtk_list_store_append(list_store, &iter);
                gtk_list_store_set(list_store, &iter,
@@ -331,6 +336,7 @@ static void remove_attachments_dialog(AttRemover *attremover)
        gtk_container_set_border_width( GTK_CONTAINER(window), VBOX_BORDER);
        gtk_window_set_title(GTK_WINDOW(window), _("Remove attachments"));
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
+       gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG);
        gtk_window_set_modal(GTK_WINDOW(window), TRUE);
 
        g_signal_connect(G_OBJECT(window), "delete_event",
@@ -349,7 +355,7 @@ static void remove_attachments_dialog(AttRemover *attremover)
                                  -1));
        list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(model));
        g_object_unref(model);  
-       gtk_tree_view_set_rules_hint(list_view, prefs_common.use_stripes_everywhere);
+       gtk_tree_view_set_rules_hint(list_view, prefs_common_get_prefs()->use_stripes_everywhere);
        
        renderer = gtk_cell_renderer_toggle_new();
        g_signal_connect(renderer, "toggled", G_CALLBACK(remove_toggled_cb), model);
@@ -413,17 +419,19 @@ static void remove_attachments(GSList *msglist)
        SummaryView *summaryview = mainwin->summaryview;
        GSList *cur;
        gint msgnum = -1;
+       gint stripped_msgs = 0;
+       gint total_msgs = 0;
        
        if (alertpanel_full(_("Destroy attachments"),
                   _("Do you really want to remove all attachments from "
                   "the selected messages?\n\n"
                  "The deleted data will be unrecoverable."), 
-                 GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL,
-                  FALSE, NULL, ALERT_QUESTION, G_ALERTALTERNATE) != G_ALERTALTERNATE)
+                 GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, ALERTFOCUS_SECOND,
+                  FALSE, NULL, ALERT_QUESTION) != G_ALERTALTERNATE)
                return;
 
        main_window_cursor_wait(summaryview->mainwin);
-       gtk_cmclist_freeze(GTK_CMCLIST(summaryview->ctree));
+       summary_freeze(summaryview);
        folder_item_update_freeze();
        inc_lock();
 
@@ -432,31 +440,48 @@ static void remove_attachments(GSList *msglist)
                MsgInfo *newmsg = NULL;
                MimeInfo *info = NULL;
                MimeInfo *partinfo = NULL;
+               MimeInfo *nextpartinfo = NULL;
 
                if (!msginfo)
                        continue;
-               
+               total_msgs++;                   /* count all processed messages */
+
                newmsg = procmsg_msginfo_copy(msginfo);
                info = procmime_scan_message(newmsg);
        
                if ( !(partinfo = find_first_text_part(info)) ) {
-                       procmsg_msginfo_free(newmsg);
+                       procmsg_msginfo_free(&newmsg);
                        continue;
                }
-               partinfo->node->next = NULL;
-               partinfo->node->children = NULL;
-               info->node->children->data = partinfo;
+               /* only strip attachments where there is at least one */
+               nextpartinfo = procmime_mimeinfo_next(partinfo);
+               if (nextpartinfo) {
+                       partinfo->node->next = NULL;
+                       partinfo->node->children = NULL;
+                       info->node->children->data = partinfo;
 
-               msgnum = save_new_message(msginfo, newmsg, info, FALSE);                
+                       msgnum = save_new_message(msginfo, newmsg, info, FALSE);
+
+                       stripped_msgs++;        /* count messages with removed attachment(s) */
+               }
        }
+       if (stripped_msgs == 0) {
+               alertpanel_notice(_("The selected messages don't have any attachments."));
+       } else {
+               if (stripped_msgs != total_msgs)
+                       alertpanel_notice(_("Attachments removed from %d of the %d selected messages."),
+                                                       stripped_msgs, total_msgs);
+               else
+                       alertpanel_notice(_("Attachments removed from all %d selected messages."), total_msgs);
+       }       
 
        inc_unlock();
        folder_item_update_thaw();
-       gtk_cmclist_thaw(GTK_CMCLIST(summaryview->ctree));
+       summary_thaw(summaryview);
        main_window_cursor_normal(summaryview->mainwin);
 
        if (msgnum > 0) {
-               summary_select_by_msgnum(summaryview, msgnum);
+               summary_select_by_msgnum(summaryview, msgnum, TRUE);
        }
 }
 
@@ -477,12 +502,10 @@ static void remove_attachments_ui(GtkAction *action, gpointer data)
                
                if (!partinfo) {
                        alertpanel_notice(_("This message doesn't have any attachments."));
-                       g_slist_free(msglist);
-                       return;
+               } else {
+                       AttRemoverData.msginfo = msglist->data;
+                       remove_attachments_dialog(&AttRemoverData);
                }
-               
-               AttRemoverData.msginfo = msglist->data;
-               remove_attachments_dialog(&AttRemoverData);
        } else
                remove_attachments(msglist);
 
@@ -538,7 +561,7 @@ gboolean plugin_done(void)
                return TRUE;
         
        if (prefs_write_param(prefs, pref_file->fp) < 0) {
-               g_warning("failed to write AttRemover Plugin configuration\n");
+               g_warning("failed to write AttRemover Plugin configuration");
                prefs_file_close_revert(pref_file);
                return TRUE;
         }