[evolution-rss] Delete artcles no longer in the feed should be a checkbox



commit e9f0044124da8f05c94eb86b1aa43f97e6e15990
Author: Lucian Langa <lucilanga gnome org>
Date:   Sat Feb 20 21:20:52 2010 +0200

    Delete artcles no longer in the feed should be a checkbox

 TODO                     |    4 -
 src/rss-config-factory.c | 1113 +++++++++++++++++++++++++++++-----------------
 src/rss-config-factory.h |   33 ++-
 src/rss-ui.glade         |    6 +-
 src/rss.c                |  200 ++++++---
 src/rss.h                |   89 +++-
 6 files changed, 948 insertions(+), 497 deletions(-)
---
diff --git a/TODO b/TODO
index b25e5d5..87ee384 100644
--- a/TODO
+++ b/TODO
@@ -7,14 +7,12 @@
 	* offline storage for article's home page
 	* implement web controls for diferent redering <Webkits> or <Gecko>
 	* when adding a feed as opml file offer to import (file detection)
-	* run-time migration function from text/evolution-rss-feed -> x-evolution/evolution-rss-feed
 	* cache large feeds
 	* fix recursivity on layer_find_pos
 	* provide predefined groups of feeds (OSS & co)
 	* evolution import rss add no. of retries
 	* slow delete operation on large folders
 	* add handling parser error to setup_feed (check HIG for error msg)
-	* handle slash categories
 	* use combo popup for moving and placement of feed folders
 	* check webbuttons for webkit
 	* cancel operation should cancel fetching feed components
@@ -41,7 +39,5 @@
 	* image contained in feeds displayed after the coments ??
 	* accept feeds clicked from mails - add feed option to right click context menu
 	* when delete folder remove any pending filter process
-	* Delete artcles no longer in the feed should be a checkbox
 	* when import opml print opml title
-	* add configure option when import for searching rss in the html page
 	* import without fetching (add without validate ?)
diff --git a/src/rss-config-factory.c b/src/rss-config-factory.c
index c291130..2f0cc41 100644
--- a/src/rss-config-factory.c
+++ b/src/rss-config-factory.c
@@ -430,7 +430,8 @@ build_dialog_add(gchar *url, gchar *feed_text)
 	gchar *flabel = NULL;
 	gchar *fname;
 	gboolean fhtml = FALSE;
-	gboolean del_unread = FALSE;
+	gboolean del_unread = FALSE, 
+		del_notpresent = FALSE;
 	gboolean auth_enabled;
 	guint del_feed = 0;
 	gpointer key = NULL;
@@ -440,11 +441,21 @@ build_dialog_add(gchar *url, gchar *feed_text)
 	GtkWidget *authuser, *authpass;
 	GtkWidget *adv_options, *entry1, *entry2, *feed_name;
 	GtkToggleButton *useauth;
-	GtkWidget *feed_name_label, *location_button, *location_label;
-	GtkWidget *combobox1, *checkbutton1, *checkbutton2, *checkbutton3;
-	GtkWidget *radiobutton1, *radiobutton2, *radiobutton3;
-	GtkWidget *radiobutton4, *radiobutton5, *radiobutton6, *radiobutton7;
-	GtkWidget *ttl_value;
+	GtkWidget *feed_name_label,
+		*location_button,
+		*location_label;
+	GtkWidget *combobox1,
+		*checkbutton1,
+		*checkbutton2,
+		*checkbutton3,
+		*radiobutton1, 
+		*radiobutton2,
+		*radiobutton3,
+		*radiobutton4,
+		*radiobutton5,
+		*radiobutton6,
+		*radiobutton7,
+		*ttl_value;
 	GtkWidget *spinbutton1, *spinbutton2;
 	GtkWidget *checkbutton4;
 	GtkImage *image;
@@ -486,6 +497,8 @@ build_dialog_add(gchar *url, gchar *feed_text)
 			g_hash_table_lookup(rf->hrdel_feed, key));
 		del_unread = GPOINTER_TO_INT(
 			g_hash_table_lookup(rf->hrdel_unread, key));
+		del_notpresent = GPOINTER_TO_INT(
+			g_hash_table_lookup(rf->hrdel_notpresent, key));
 		feed->del_days = GPOINTER_TO_INT(
 			g_hash_table_lookup(rf->hrdel_days, key));
 		feed->del_messages = GPOINTER_TO_INT(
@@ -516,31 +529,47 @@ build_dialog_add(gchar *url, gchar *feed_text)
 		location_button = GTK_WIDGET (gtk_builder_get_object(gui, "location_button"));
 
 		gtk_widget_show(location_button);
-		location_label = GTK_WIDGET (gtk_builder_get_object(gui, "location_label"));
+		location_label = GTK_WIDGET (
+			gtk_builder_get_object(gui,
+			"location_label"));
 		gtk_widget_show(location_label);
 		gtk_label_set_use_markup(GTK_LABEL(entry2), 1);
 	} else
 		gtk_label_set_text(GTK_LABEL(entry2), flabel);
 
 	combobox1 = GTK_WIDGET (gtk_builder_get_object(gui, "combobox1"));
-	gtk_combo_box_set_active(GTK_COMBO_BOX(combobox1), 0);
+	gtk_combo_box_set_active(
+		GTK_COMBO_BOX(combobox1),
+		0);
 
 	checkbutton1 = GTK_WIDGET (gtk_builder_get_object(gui, "html_check"));
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton1), 1-fhtml);
+	gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (checkbutton1),
+		1-fhtml);
 
 	checkbutton2 = GTK_WIDGET (gtk_builder_get_object(gui, "enabled_check"));
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton2), feed->enabled);
+	gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (checkbutton2),
+		feed->enabled);
 
 	checkbutton3 = GTK_WIDGET (gtk_builder_get_object(gui, "validate_check"));
 	if (url)
 		gtk_widget_set_sensitive(checkbutton3, FALSE);
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton3), feed->validate);
+	gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (checkbutton3),
+		feed->validate);
 
 	spinbutton1 = GTK_WIDGET (gtk_builder_get_object(gui, "storage_sb1"));
 	spinbutton2 = GTK_WIDGET (gtk_builder_get_object(gui, "storage_sb2"));
 	if (feed->del_messages)
-		gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbutton1), feed->del_messages);
-	g_signal_connect(spinbutton1, "changed", G_CALLBACK(del_messages_cb), feed);
+		gtk_spin_button_set_value(
+			GTK_SPIN_BUTTON(spinbutton1),
+			feed->del_messages);
+	g_signal_connect(
+		spinbutton1,
+		"changed",
+		G_CALLBACK(del_messages_cb),
+		feed);
 
 	radiobutton1 = GTK_WIDGET (gtk_builder_get_object(gui, "storage_rb1"));
 	radiobutton2 = GTK_WIDGET (gtk_builder_get_object(gui, "storage_rb2"));
@@ -551,11 +580,15 @@ build_dialog_add(gchar *url, gchar *feed_text)
 	radiobutton6 = GTK_WIDGET (gtk_builder_get_object(gui, "ttl_disabled"));
 	ttl_value = GTK_WIDGET (gtk_builder_get_object(gui, "ttl_value"));
 	image = (GtkImage *)gtk_builder_get_object (gui, "image1");
-	gtk_spin_button_set_range((GtkSpinButton *)ttl_value, 0, (guint)MAX_TTL);
+	gtk_spin_button_set_range(
+		(GtkSpinButton *)ttl_value,
+		0,
+		(guint)MAX_TTL);
 
 	/*set feed icon*/
 	if (key) {
-		gtk_image_set_from_icon_name(image,
+		gtk_image_set_from_icon_name(
+			image,
 			g_hash_table_lookup(icons, key) ? key : "rss",
 			GTK_ICON_SIZE_SMALL_TOOLBAR);
 		gtk_widget_show(GTK_WIDGET(image));
@@ -572,11 +605,6 @@ build_dialog_add(gchar *url, gchar *feed_text)
 			GTK_TOGGLE_BUTTON(radiobutton3),
 			1);
 		break;
-	case 3:         //articles not present in feed
-		gtk_toggle_button_set_active(
-			GTK_TOGGLE_BUTTON(radiobutton7),
-			1);
-		break;
 	default:
 		gtk_toggle_button_set_active(
 			GTK_TOGGLE_BUTTON(radiobutton1),
@@ -599,6 +627,9 @@ build_dialog_add(gchar *url, gchar *feed_text)
 	gtk_toggle_button_set_active (
 		GTK_TOGGLE_BUTTON (checkbutton4),
 		del_unread);
+	gtk_toggle_button_set_active(
+		GTK_TOGGLE_BUTTON(radiobutton7),
+		del_notpresent);
 
 	gtk_spin_button_set_value(
 		GTK_SPIN_BUTTON(ttl_value),
@@ -744,21 +775,23 @@ actions_dialog_add(add_feed *feed, gchar *url)
 		feed->validate = gtk_toggle_button_get_active(
 			GTK_TOGGLE_BUTTON(checkbutton3));
 		while (i<4) {
-			if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton1)))
-				break;
-			i++;
-			if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton2)))
+			if (gtk_toggle_button_get_active(
+				GTK_TOGGLE_BUTTON(radiobutton1)))
 				break;
 			i++;
-			if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton3)))
+			if (gtk_toggle_button_get_active(
+				GTK_TOGGLE_BUTTON(radiobutton2)))
 				break;
 			i++;
-			if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton7)))
+			if (gtk_toggle_button_get_active(
+				GTK_TOGGLE_BUTTON(radiobutton3)))
 				break;
 		}
 		feed->del_feed = i;
 		feed->del_unread = gtk_toggle_button_get_active(
 			GTK_TOGGLE_BUTTON(checkbutton4));
+		feed->del_notpresent = gtk_toggle_button_get_active(
+			GTK_TOGGLE_BUTTON(radiobutton7));
 		gtk_spin_button_update((GtkSpinButton *)spinbutton1);
 		feed->del_messages = gtk_spin_button_get_value((GtkSpinButton *)spinbutton1);
 		gtk_spin_button_update((GtkSpinButton *)spinbutton2);
@@ -982,19 +1015,34 @@ hrfeed*
 save_feed_hash(gpointer name)
 {
 	hrfeed *saved_feed = g_new0(hrfeed, 1);
-	saved_feed->hrname = g_strdup(g_hash_table_lookup(rf->hrname, name));
-	saved_feed->hrname_r = g_strdup(g_hash_table_lookup(rf->hrname_r, lookup_key(name)));
-	saved_feed->hre = GPOINTER_TO_INT(g_hash_table_lookup(rf->hre, lookup_key(name)));
-	saved_feed->hrt = g_strdup(g_hash_table_lookup(rf->hrt, lookup_key(name)));
-	saved_feed->hrh = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrh, lookup_key(name)));
-	saved_feed->hr = g_strdup(g_hash_table_lookup(rf->hr, lookup_key(name)));
-	saved_feed->hrdel_feed = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_feed, lookup_key(name)));
-	saved_feed->hrdel_days = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_days, lookup_key(name)));
-	saved_feed->hrdel_messages = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_messages, lookup_key(name)));
-	saved_feed->hrdel_unread = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_unread, lookup_key(name)));
-	saved_feed->hrupdate = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrupdate, lookup_key(name)));
-	saved_feed->hrttl = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrttl, lookup_key(name)));
-	saved_feed->hrttl_multiply = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrttl_multiply, lookup_key(name)));
+	saved_feed->hrname = 
+		g_strdup(g_hash_table_lookup(rf->hrname, name));
+	saved_feed->hrname_r = 
+		g_strdup(g_hash_table_lookup(rf->hrname_r, lookup_key(name)));
+	saved_feed->hre = 
+		GPOINTER_TO_INT(g_hash_table_lookup(rf->hre, lookup_key(name)));
+	saved_feed->hrt = 
+		g_strdup(g_hash_table_lookup(rf->hrt, lookup_key(name)));
+	saved_feed->hrh = 
+		GPOINTER_TO_INT(g_hash_table_lookup(rf->hrh, lookup_key(name)));
+	saved_feed->hr = 
+		g_strdup(g_hash_table_lookup(rf->hr, lookup_key(name)));
+	saved_feed->hrdel_feed = 
+		GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_feed, lookup_key(name)));
+	saved_feed->hrdel_days = 
+		GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_days, lookup_key(name)));
+	saved_feed->hrdel_messages = 
+		GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_messages, lookup_key(name)));
+	saved_feed->hrdel_unread = 
+		GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_unread, lookup_key(name)));
+	saved_feed->hrdel_notpresent = 
+		GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_notpresent, lookup_key(name)));
+	saved_feed->hrupdate = 
+		GPOINTER_TO_INT(g_hash_table_lookup(rf->hrupdate, lookup_key(name)));
+	saved_feed->hrttl = 
+		GPOINTER_TO_INT(g_hash_table_lookup(rf->hrttl, lookup_key(name)));
+	saved_feed->hrttl_multiply = 
+		GPOINTER_TO_INT(g_hash_table_lookup(rf->hrttl_multiply, lookup_key(name)));
 	return saved_feed;
 }
 
@@ -1005,19 +1053,42 @@ save_feed_hash(gpointer name)
 void
 restore_feed_hash(gpointer name, hrfeed *s)
 {
-	g_hash_table_insert(rf->hrname, g_strdup(name), s->hrname);
-	g_hash_table_insert(rf->hrname_r, g_strdup(lookup_key(name)), s->hrname_r);
-	g_hash_table_insert(rf->hre, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hre));
-	g_hash_table_insert(rf->hrh, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrh));
-	g_hash_table_insert(rf->hrt, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrt));
-	g_hash_table_insert(rf->hr, g_strdup(lookup_key(name)), s->hr);
-	g_hash_table_insert(rf->hrdel_feed, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrdel_feed));
-	g_hash_table_insert(rf->hrdel_days, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrdel_days));
-	g_hash_table_insert(rf->hrdel_messages, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrdel_messages));
-	g_hash_table_insert(rf->hrdel_unread, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrdel_unread));
-	g_hash_table_insert(rf->hrupdate, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrupdate));
-	g_hash_table_insert(rf->hrttl, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrttl));
-	g_hash_table_insert(rf->hrttl_multiply, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrttl_multiply));
+	g_hash_table_insert(
+		rf->hrname, g_strdup(name), s->hrname);
+	g_hash_table_insert(
+		rf->hrname_r, g_strdup(lookup_key(name)), s->hrname_r);
+	g_hash_table_insert(
+		rf->hre, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hre));
+	g_hash_table_insert(
+		rf->hrh, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrh));
+	g_hash_table_insert(
+		rf->hrt, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrt));
+	g_hash_table_insert(
+		rf->hr, g_strdup(lookup_key(name)), s->hr);
+	g_hash_table_insert(
+		rf->hrdel_feed, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrdel_feed));
+	g_hash_table_insert(
+		rf->hrdel_days, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrdel_days));
+	g_hash_table_insert(
+		rf->hrdel_messages,
+		g_strdup(lookup_key(name)),
+		GINT_TO_POINTER(s->hrdel_messages));
+	g_hash_table_insert(
+		rf->hrdel_unread,
+		g_strdup(lookup_key(name)),
+		GINT_TO_POINTER(s->hrdel_unread));
+	g_hash_table_insert(
+		rf->hrdel_notpresent,
+		g_strdup(lookup_key(name)),
+		GINT_TO_POINTER(s->hrdel_notpresent));
+	g_hash_table_insert(
+		rf->hrupdate, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrupdate));
+	g_hash_table_insert(
+		rf->hrttl, g_strdup(lookup_key(name)), GINT_TO_POINTER(s->hrttl));
+	g_hash_table_insert(
+		rf->hrttl_multiply,
+		g_strdup(lookup_key(name)),
+		GINT_TO_POINTER(s->hrttl_multiply));
 	g_free(s);
 }
 
@@ -1036,6 +1107,7 @@ remove_feed_hash(gpointer name)
 	g_hash_table_remove(rf->hrdel_days, lookup_key(name));
 	g_hash_table_remove(rf->hrdel_messages, lookup_key(name));
 	g_hash_table_remove(rf->hrdel_unread, lookup_key(name));
+	g_hash_table_remove(rf->hrdel_notpresent, lookup_key(name));
 	g_hash_table_remove(rf->hrupdate, lookup_key(name));
 	g_hash_table_remove(rf->hrttl, lookup_key(name));
 	g_hash_table_remove(rf->hrttl_multiply, lookup_key(name));
@@ -1149,55 +1221,64 @@ feeds_dialog_disable(GtkDialog *d, gpointer data)
 GtkWidget*
 remove_feed_dialog(gchar *msg)
 {
-  GtkWidget *dialog1;
-  GtkWidget *dialog_vbox1;
-  GtkWidget *vbox1;
-  GtkWidget *checkbutton1;
-  GtkWidget *dialog_action_area1;
+	GtkWidget *dialog1;
+	GtkWidget *dialog_vbox1;
+	GtkWidget *vbox1;
+	GtkWidget *checkbutton1;
+	GtkWidget *dialog_action_area1;
 
 #if EVOLUTION_VERSION < 22904
-  dialog1 = e_error_new(
+	dialog1 = e_error_new(
 #else
-  dialog1 = e_alert_dialog_new_for_args(
+	dialog1 = e_alert_dialog_new_for_args(
 #endif
 		GTK_WINDOW(rf->preferences),
 		"org-gnome-evolution-rss:ask-delete-feed",
 		msg,
 		NULL);
-  gtk_window_set_keep_above(GTK_WINDOW(dialog1), TRUE);
-
-  dialog_vbox1 = GTK_DIALOG (dialog1)->vbox;
-  gtk_widget_show (dialog_vbox1);
-
-  vbox1 = gtk_vbox_new (FALSE, 10);
-  gtk_widget_show (vbox1);
-  gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
-  gtk_container_set_border_width (GTK_CONTAINER (vbox1), 10);
-
-  checkbutton1 = gtk_check_button_new_with_mnemonic (_("Remove folder contents"));
-  gtk_widget_show (checkbutton1);
-  gtk_toggle_button_set_active (
-	GTK_TOGGLE_BUTTON (checkbutton1),
-	gconf_client_get_bool(rss_gconf, GCONF_KEY_REMOVE_FOLDER, NULL));
-  g_signal_connect(
-	checkbutton1,
-	"clicked",
-	G_CALLBACK(start_check_cb),
-	(gpointer)GCONF_KEY_REMOVE_FOLDER);
-gtk_box_pack_start (
-	GTK_BOX (vbox1),
-	checkbutton1,
-	FALSE,
-	FALSE,
-	0);
-
-  dialog_action_area1 = GTK_DIALOG (dialog1)->action_area;
-  gtk_widget_show (dialog_action_area1);
-  gtk_button_box_set_layout (
+	gtk_window_set_keep_above(GTK_WINDOW(dialog1), TRUE);
+
+	dialog_vbox1 = GTK_DIALOG (dialog1)->vbox;
+	gtk_widget_show (dialog_vbox1);
+
+	vbox1 = gtk_vbox_new (FALSE, 10);
+	gtk_widget_show (vbox1);
+	gtk_box_pack_start (
+		GTK_BOX (dialog_vbox1),
+		vbox1,
+		TRUE,
+		TRUE,
+		0);
+	gtk_container_set_border_width (
+		GTK_CONTAINER (vbox1),
+		10);
+
+	checkbutton1 = gtk_check_button_new_with_mnemonic (_("Remove folder contents"));
+	gtk_widget_show (checkbutton1);
+	gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (checkbutton1),
+	gconf_client_get_bool(
+		rss_gconf,
+		GCONF_KEY_REMOVE_FOLDER, NULL));
+	g_signal_connect(
+		checkbutton1,
+		"clicked",
+		G_CALLBACK(start_check_cb),
+		(gpointer)GCONF_KEY_REMOVE_FOLDER);
+	gtk_box_pack_start (
+		GTK_BOX (vbox1),
+		checkbutton1,
+		FALSE,
+		FALSE,
+		0);
+
+	dialog_action_area1 = GTK_DIALOG (dialog1)->action_area;
+	gtk_widget_show (dialog_action_area1);
+	gtk_button_box_set_layout (
 		GTK_BUTTON_BOX (dialog_action_area1),
 		GTK_BUTTONBOX_END);
 
-  return dialog1;
+	return dialog1;
 }
 
 void
@@ -1211,7 +1292,7 @@ feeds_dialog_delete(GtkDialog *d, gpointer data)
 
 	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data));
 	if (gtk_tree_selection_get_selected(selection, &model, &iter)
-                && !rf->import) {
+		&& !rf->import) {
 			rf->import = 1;
 			gtk_tree_model_get (
 				model,
@@ -1268,7 +1349,11 @@ process_dialog_edit(add_feed *feed, gchar *url, gchar *feed_name)
 	gtk_progress_bar_set_text((GtkProgressBar *)progress, _("0% done"));
 	feed->progress=progress;
 	gtk_window_set_keep_above(GTK_WINDOW(msg_feeds), TRUE);
-	g_signal_connect(msg_feeds, "response", G_CALLBACK(msg_feeds_response), NULL);
+	g_signal_connect(
+		msg_feeds,
+		"response",
+		G_CALLBACK(msg_feeds_response),
+		NULL);
 	gtk_widget_show_all(msg_feeds);
 	while (gtk_events_pending ())
 		gtk_main_iteration ();
@@ -1362,12 +1447,18 @@ process_dialog_edit(add_feed *feed, gchar *url, gchar *feed_name)
 			g_hash_table_replace(rf->hrdel_messages,
 					g_strdup(key),
 					GINT_TO_POINTER(feed->del_messages));
-			g_hash_table_replace(rf->hrupdate,
+			g_hash_table_replace(
+					rf->hrupdate,
 					g_strdup(key),
 					GINT_TO_POINTER(feed->update));
-			g_hash_table_replace(rf->hrdel_unread,
+			g_hash_table_replace(
+					rf->hrdel_unread,
 					g_strdup(key),
 					GINT_TO_POINTER(feed->del_unread));
+			g_hash_table_replace(
+					rf->hrdel_notpresent,
+					g_strdup(key),
+					GINT_TO_POINTER(feed->del_notpresent));
 			g_free(key);
 		}
 	save_gconf_feed();
@@ -1379,23 +1470,28 @@ out:	gtk_widget_destroy(msg_feeds);
 static void
 feeds_dialog_edit(GtkDialog *d, gpointer data)
 {
-        GtkTreeSelection *selection;
-        GtkTreeModel     *model;
-        GtkTreeIter       iter;
-        gchar *name, *feed_name;
+	GtkTreeSelection *selection;
+	GtkTreeModel     *model;
+	GtkTreeIter       iter;
+	gchar *name, *feed_name;
 	gpointer key;
 	add_feed *feed = NULL;
 
-        /* This will only work in single or browse selection mode! */
-        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data));
-        if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
-                gtk_tree_model_get (model, &iter, 3, &feed_name, -1);
-                key = lookup_key(feed_name);
-                name = g_hash_table_lookup(rf->hr, key);
-                if (name) {
-                        feed = create_dialog_add(name, feed_name);
+	/* This will only work in single or browse selection mode! */
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data));
+	if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
+		gtk_tree_model_get (
+			model,
+			&iter,
+			3,
+			&feed_name,
+			-1);
+		key = lookup_key(feed_name);
+		name = g_hash_table_lookup(rf->hr, key);
+		if (name) {
+			feed = create_dialog_add(name, feed_name);
 			if (feed->dialog)
-                                gtk_widget_destroy(feed->dialog);
+				gtk_widget_destroy(feed->dialog);
 			process_dialog_edit(feed, name, feed_name);
 		}
 		if (feed->feed_url)
@@ -1757,78 +1853,129 @@ static void
 decorate_import_fs (gpointer data)
 {
 	GtkFileFilter *file_filter = gtk_file_filter_new ();
-        GtkFileFilter *filter = gtk_file_filter_new ();
-        GtkWidget *vbox1;
-        GtkWidget *checkbutton1;
-        GtkWidget *checkbutton2;
-        GtkWidget *checkbutton3;
-
-        gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (data), TRUE);
-        gtk_dialog_set_default_response (GTK_DIALOG (data), GTK_RESPONSE_OK);
-        gtk_file_chooser_set_local_only (data, FALSE);
-
-        gtk_file_filter_add_pattern (GTK_FILE_FILTER(file_filter), "*");
-        gtk_file_filter_set_name (GTK_FILE_FILTER(file_filter), _("All Files"));
-        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (data),
-                                        GTK_FILE_FILTER(file_filter));
-
-        file_filter = gtk_file_filter_new ();
-        gtk_file_filter_add_pattern (GTK_FILE_FILTER(file_filter), "*.opml");
-        gtk_file_filter_set_name (GTK_FILE_FILTER(file_filter), _("OPML Files"));
-        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (data),
-                                        GTK_FILE_FILTER(file_filter));
-
-        file_filter = gtk_file_filter_new ();
-        gtk_file_filter_add_pattern (GTK_FILE_FILTER(file_filter), "*.xml");
-        gtk_file_filter_set_name (GTK_FILE_FILTER(file_filter), _("XML Files"));
-        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (data),
-                                        GTK_FILE_FILTER(file_filter));
-
-        gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (data),
-                                        GTK_FILE_FILTER(file_filter));
-
-        gtk_file_filter_add_pattern (filter, "*.opml");
-        gtk_file_filter_add_pattern (filter, "*.xml");
-        gtk_file_chooser_set_filter(data, filter);
-
-        vbox1 = gtk_vbox_new (FALSE, 0);
-        checkbutton1 = gtk_check_button_new_with_mnemonic (
-                               _("Show article's summary"));
-        gtk_widget_show (checkbutton1);
-        gtk_box_pack_start (GTK_BOX (vbox1), checkbutton1, FALSE, TRUE, 0);
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton1), 1);
-
-        checkbutton2 = gtk_check_button_new_with_mnemonic (
-                                        _("Feed Enabled"));
-        gtk_widget_show (checkbutton2);
-        gtk_box_pack_start (GTK_BOX (vbox1), checkbutton2, FALSE, TRUE, 0);
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton2), 1);
-
-        checkbutton3 = gtk_check_button_new_with_mnemonic (
-                                              _("Validate feed"));
-
-        gtk_widget_show (checkbutton3);
-        gtk_box_pack_start (GTK_BOX (vbox1), checkbutton3, FALSE, TRUE, 0);
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton3), 1);
-
-        gtk_file_chooser_set_extra_widget(data, vbox1);
-        feed_html = 0;
-        feed_validate = feed_enabled = 1;
-
-        g_signal_connect(checkbutton1,
-                        "toggled",
-                        G_CALLBACK(import_toggle_cb_html),
-                        NULL);
-        g_signal_connect(checkbutton2,
-                        "toggled",
-                        G_CALLBACK(import_toggle_cb_ena),
-                        NULL);
-        g_signal_connect(checkbutton3,
+	GtkFileFilter *filter = gtk_file_filter_new ();
+	GtkWidget *vbox1;
+	GtkWidget *checkbutton1;
+	GtkWidget *checkbutton2;
+	GtkWidget *checkbutton3;
+
+	gtk_file_chooser_set_do_overwrite_confirmation (
+		GTK_FILE_CHOOSER (data),
+		TRUE);
+	gtk_dialog_set_default_response (
+		GTK_DIALOG (data),
+		GTK_RESPONSE_OK);
+	gtk_file_chooser_set_local_only (data, FALSE);
+
+	gtk_file_filter_add_pattern (
+		GTK_FILE_FILTER(file_filter), "*");
+	gtk_file_filter_set_name (
+		GTK_FILE_FILTER(file_filter),
+		_("All Files"));
+	gtk_file_chooser_add_filter (
+		GTK_FILE_CHOOSER (data),
+		GTK_FILE_FILTER(file_filter));
+
+	file_filter = gtk_file_filter_new ();
+	gtk_file_filter_add_pattern (
+		GTK_FILE_FILTER(file_filter),
+		"*.opml");
+	gtk_file_filter_set_name (
+		GTK_FILE_FILTER(file_filter),
+		_("OPML Files"));
+	gtk_file_chooser_add_filter (
+		GTK_FILE_CHOOSER (data),
+		GTK_FILE_FILTER(file_filter));
+
+	file_filter = gtk_file_filter_new ();
+	gtk_file_filter_add_pattern (
+		GTK_FILE_FILTER(file_filter),
+		"*.xml");
+	gtk_file_filter_set_name (
+		GTK_FILE_FILTER(file_filter),
+		_("XML Files"));
+	gtk_file_chooser_add_filter (
+		GTK_FILE_CHOOSER (data),
+		GTK_FILE_FILTER(file_filter));
+
+	gtk_file_chooser_set_filter (
+		GTK_FILE_CHOOSER (data),
+		GTK_FILE_FILTER(file_filter));
+
+	gtk_file_filter_add_pattern (filter, "*.opml");
+	gtk_file_filter_add_pattern (filter, "*.xml");
+	gtk_file_chooser_set_filter(data, filter);
+
+	vbox1 = gtk_vbox_new (FALSE, 0);
+	checkbutton1 = gtk_check_button_new_with_mnemonic (
+			_("Show article's summary"));
+	gtk_widget_show (checkbutton1);
+	gtk_box_pack_start (
+		GTK_BOX (vbox1),
+		checkbutton1,
+		FALSE,
+		TRUE,
+		0);
+	gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (checkbutton1),
+		1);
+
+	checkbutton2 = gtk_check_button_new_with_mnemonic (
+			_("Feed Enabled"));
+	gtk_widget_show (checkbutton2);
+	gtk_box_pack_start (
+		GTK_BOX (vbox1),
+		checkbutton2,
+		FALSE,
+		TRUE,
+		0);
+	gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (checkbutton2),
+		1);
+
+	checkbutton3 = gtk_check_button_new_with_mnemonic (
+			_("Validate feed"));
+
+	gtk_widget_show (checkbutton3);
+	gtk_box_pack_start (
+		GTK_BOX (vbox1),
+		checkbutton3,
+		FALSE,
+		TRUE,
+		0);
+	gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (checkbutton3),
+		1);
+
+	gtk_file_chooser_set_extra_widget(data, vbox1);
+	feed_html = 0;
+	feed_validate = feed_enabled = 1;
+
+	g_signal_connect(
+		checkbutton1,
+		"toggled",
+		G_CALLBACK(import_toggle_cb_html),
+		NULL);
+	g_signal_connect(
+		checkbutton2,
+		"toggled",
+		G_CALLBACK(import_toggle_cb_ena),
+		NULL);
+	g_signal_connect(
+		checkbutton3,
 		"toggled",
 		G_CALLBACK(import_toggle_cb_valid),
 		NULL);
-        g_signal_connect(data, "response", G_CALLBACK(select_file_response), NULL);
-        g_signal_connect(data, "destroy", G_CALLBACK(gtk_widget_destroy), data);
+	g_signal_connect(
+		data,
+		"response",
+		G_CALLBACK(select_file_response),
+		NULL);
+	g_signal_connect(
+		data,
+		"destroy",
+		G_CALLBACK(gtk_widget_destroy),
+		data);
 }
 
 GtkWidget* create_import_dialog (void);
@@ -1836,38 +1983,61 @@ GtkWidget* create_import_dialog (void);
 GtkWidget*
 create_import_dialog (void)
 {
-  GtkWidget *import_file_select;
-  GtkWidget *dialog_vbox5;
-  GtkWidget *dialog_action_area5;
-  GtkWidget *button1;
-  GtkWidget *button2;
+	GtkWidget *import_file_select;
+	GtkWidget *dialog_vbox5;
+	GtkWidget *dialog_action_area5;
+	GtkWidget *button1;
+	GtkWidget *button2;
 
-  import_file_select = gtk_file_chooser_dialog_new (_("Select import file"),
-				 NULL, GTK_FILE_CHOOSER_ACTION_OPEN, NULL, NULL);
-  gtk_window_set_keep_above(GTK_WINDOW(import_file_select), TRUE);
-  gtk_window_set_modal (GTK_WINDOW (import_file_select), TRUE);
-  gtk_window_set_destroy_with_parent (GTK_WINDOW (import_file_select), TRUE);
-  gtk_window_set_type_hint (GTK_WINDOW (import_file_select), GDK_WINDOW_TYPE_HINT_DIALOG);
+	import_file_select = 
+		gtk_file_chooser_dialog_new (
+			_("Select import file"),
+			NULL,
+			GTK_FILE_CHOOSER_ACTION_OPEN,
+			NULL,
+			NULL);
+	gtk_window_set_keep_above(
+		GTK_WINDOW(import_file_select),
+		TRUE);
+	gtk_window_set_modal (
+		GTK_WINDOW (import_file_select),
+		TRUE);
+	gtk_window_set_destroy_with_parent (
+		GTK_WINDOW (import_file_select),
+		TRUE);
+	gtk_window_set_type_hint (
+		GTK_WINDOW (import_file_select),
+		GDK_WINDOW_TYPE_HINT_DIALOG);
 
-  dialog_vbox5 = GTK_DIALOG (import_file_select)->vbox;
-  gtk_widget_show (dialog_vbox5);
+	dialog_vbox5 = GTK_DIALOG (import_file_select)->vbox;
+	gtk_widget_show (dialog_vbox5);
 
-  dialog_action_area5 = GTK_DIALOG (import_file_select)->action_area;
-  gtk_widget_show (dialog_action_area5);
-  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area5), GTK_BUTTONBOX_END);
+	dialog_action_area5 = GTK_DIALOG (import_file_select)->action_area;
+	gtk_widget_show (dialog_action_area5);
+	gtk_button_box_set_layout (
+		GTK_BUTTON_BOX (dialog_action_area5),
+		GTK_BUTTONBOX_END);
 
-  button1 = gtk_button_new_from_stock ("gtk-cancel");
-  gtk_widget_show (button1);
-  gtk_dialog_add_action_widget (GTK_DIALOG (import_file_select), button1, GTK_RESPONSE_CANCEL);
-  GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT);
+	button1 = gtk_button_new_from_stock ("gtk-cancel");
+	gtk_widget_show (button1);
+	gtk_dialog_add_action_widget (
+		GTK_DIALOG (import_file_select),
+		button1,
+		GTK_RESPONSE_CANCEL);
+	GTK_WIDGET_SET_FLAGS (
+		button1,
+		GTK_CAN_DEFAULT);
 
-  button2 = gtk_button_new_from_stock ("gtk-open");
-  gtk_widget_show (button2);
-  gtk_dialog_add_action_widget (GTK_DIALOG (import_file_select), button2, GTK_RESPONSE_OK);
-  GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT);
+	button2 = gtk_button_new_from_stock ("gtk-open");
+	gtk_widget_show (button2);
+	gtk_dialog_add_action_widget (
+		GTK_DIALOG (import_file_select),
+		button2,
+		GTK_RESPONSE_OK);
+	GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT);
 
-  gtk_widget_grab_default (button2);
-  return import_file_select;
+	gtk_widget_grab_default (button2);
+	return import_file_select;
 }
 
 GtkWidget* create_export_dialog (void);
@@ -1875,42 +2045,64 @@ GtkWidget* create_export_dialog (void);
 GtkWidget*
 create_export_dialog (void)
 {
-  GtkWidget *export_file_select;
-  GtkWidget *vbox26;
-  GtkWidget *hbuttonbox1;
-  GtkWidget *button3;
-  GtkWidget *button4;
-
-  export_file_select = gtk_file_chooser_dialog_new (_("Select file to export"),
-				NULL, GTK_FILE_CHOOSER_ACTION_SAVE, NULL, NULL);
-  gtk_window_set_keep_above(GTK_WINDOW(export_file_select), TRUE);
-  g_object_set (export_file_select,
-                "local-only", FALSE,
-                NULL);
-  gtk_window_set_modal (GTK_WINDOW (export_file_select), TRUE);
-  gtk_window_set_resizable (GTK_WINDOW (export_file_select), TRUE);
-  gtk_window_set_destroy_with_parent (GTK_WINDOW (export_file_select), TRUE);
-  gtk_window_set_type_hint (GTK_WINDOW (export_file_select), GDK_WINDOW_TYPE_HINT_DIALOG);
+	GtkWidget *export_file_select;
+	GtkWidget *vbox26;
+	GtkWidget *hbuttonbox1;
+	GtkWidget *button3;
+	GtkWidget *button4;
+
+	export_file_select = gtk_file_chooser_dialog_new (
+				_("Select file to export"),
+				NULL,
+				GTK_FILE_CHOOSER_ACTION_SAVE,
+				NULL,
+				NULL);
+	gtk_window_set_keep_above(
+		GTK_WINDOW(export_file_select),
+		TRUE);
+	g_object_set (
+		export_file_select,
+		"local-only", FALSE,
+		NULL);
+	gtk_window_set_modal (
+		GTK_WINDOW (export_file_select),
+		TRUE);
+	gtk_window_set_resizable (
+		GTK_WINDOW (export_file_select),
+		TRUE);
+	gtk_window_set_destroy_with_parent (
+		GTK_WINDOW (export_file_select),
+		TRUE);
+	gtk_window_set_type_hint (
+		GTK_WINDOW (export_file_select),
+		GDK_WINDOW_TYPE_HINT_DIALOG);
 
-  vbox26 = GTK_DIALOG (export_file_select)->vbox;
-  gtk_widget_show (vbox26);
+	vbox26 = GTK_DIALOG (export_file_select)->vbox;
+	gtk_widget_show (vbox26);
 
-  hbuttonbox1 = GTK_DIALOG (export_file_select)->action_area;
-  gtk_widget_show (hbuttonbox1);
-  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_END);
+	hbuttonbox1 = GTK_DIALOG (export_file_select)->action_area;
+	gtk_widget_show (hbuttonbox1);
+	gtk_button_box_set_layout (
+		GTK_BUTTON_BOX (hbuttonbox1),
+		GTK_BUTTONBOX_END);
 
-  button3 = gtk_button_new_from_stock ("gtk-cancel");
-  gtk_widget_show (button3);
-  gtk_dialog_add_action_widget (GTK_DIALOG (export_file_select), button3, GTK_RESPONSE_CANCEL);
-  GTK_WIDGET_SET_FLAGS (button3, GTK_CAN_DEFAULT);
+	button3 = gtk_button_new_from_stock ("gtk-cancel");
+	gtk_widget_show (button3);
+	gtk_dialog_add_action_widget (
+		GTK_DIALOG (export_file_select),
+		button3,
+		GTK_RESPONSE_CANCEL);
+	GTK_WIDGET_SET_FLAGS (button3, GTK_CAN_DEFAULT);
 
-  button4 = gtk_button_new_from_stock ("gtk-save");
-  gtk_widget_show (button4);
-  gtk_dialog_add_action_widget (GTK_DIALOG (export_file_select), button4, GTK_RESPONSE_OK);
-  GTK_WIDGET_SET_FLAGS (button4, GTK_CAN_DEFAULT);
+	button4 = gtk_button_new_from_stock ("gtk-save");
+	gtk_widget_show (button4);
+	gtk_dialog_add_action_widget (
+		GTK_DIALOG (export_file_select),
+		button4, GTK_RESPONSE_OK);
+	GTK_WIDGET_SET_FLAGS (button4, GTK_CAN_DEFAULT);
 
-  gtk_widget_grab_default (button4);
-  return export_file_select;
+	gtk_widget_grab_default (button4);
+	return export_file_select;
 }
 
 static void
@@ -1988,19 +2180,20 @@ out:
 #endif
 
 	//gchar *tmp = g_strdup_printf("<outline text=\"%s\" title=\"%s\" type=\"%s\" xmlUrl=\"%s\" htmlUrl=\"%s\"/>\n",
-	tmp = g_strdup_printf("<outline text=\"%s\" title=\"%s\" type=\"rss\" xmlUrl=\"%s\" htmlUrl=\"%s\"/>\n",
-                key_esc, key_esc, url_esc, url_esc);
-        if (buffer != NULL)
-                buffer = g_strconcat(buffer, tmp, NULL);
-        else
-                buffer = g_strdup(tmp);
-        g_free(tmp);
-        count++;
+	tmp = g_strdup_printf(
+		"<outline text=\"%s\" title=\"%s\" type=\"rss\" xmlUrl=\"%s\" htmlUrl=\"%s\"/>\n",
+		key_esc, key_esc, url_esc, url_esc);
+	if (buffer != NULL)
+		buffer = g_strconcat(buffer, tmp, NULL);
+	else
+		buffer = g_strdup(tmp);
+	g_free(tmp);
+	count++;
 	fr = ((count*100)/g_hash_table_size(rf->hr));
-        gtk_progress_bar_set_fraction((GtkProgressBar *)user_data, fr/100);
-        what = g_strdup_printf(_("%2.0f%% done"), fr);
-        gtk_progress_bar_set_text((GtkProgressBar *)user_data, what);
-        g_free(what);
+	gtk_progress_bar_set_fraction((GtkProgressBar *)user_data, fr/100);
+	what = g_strdup_printf(_("%2.0f%% done"), fr);
+	gtk_progress_bar_set_text((GtkProgressBar *)user_data, what);
+	g_free(what);
 }
 
 void export_opml(gchar *file);
@@ -2008,64 +2201,64 @@ void export_opml(gchar *file);
 void
 export_opml(gchar *file)
 {
-        GtkWidget *import_dialog;
-        GtkWidget *import_label;
-        GtkWidget *import_progress;
-        char outstr[200];
+	GtkWidget *import_dialog;
+	GtkWidget *import_label;
+	GtkWidget *import_progress;
+	char outstr[200];
 	gchar *opml;
-        time_t t;
-        struct tm *tmp;
-        FILE *f;
+	time_t t;
+	struct tm *tmp;
+	FILE *f;
 
 
-        gchar *msg = g_strdup(_("Exporting feeds..."));
+	gchar *msg = g_strdup(_("Exporting feeds..."));
 #if EVOLUTION_VERSION < 22904
-        import_dialog = e_error_new(
+	import_dialog = e_error_new(
 			GTK_WINDOW(rf->preferences),
 			"shell:importing",
 			msg,
 			NULL);
 
 #else
-        import_dialog = e_alert_dialog_new_for_args(
+	import_dialog = e_alert_dialog_new_for_args(
 			GTK_WINDOW(rf->preferences),
 			"shell:importing",
 			msg,
 			NULL);
 #endif
-        gtk_window_set_keep_above(GTK_WINDOW(import_dialog), TRUE);
+	gtk_window_set_keep_above(GTK_WINDOW(import_dialog), TRUE);
 //        g_signal_connect(import_dialog, "response", G_CALLBACK(import_dialog_response), NULL);
-        import_label = gtk_label_new(_("Please wait"));
-        import_progress = gtk_progress_bar_new();
-        gtk_box_pack_start(
-			GTK_BOX(((GtkDialog *)import_dialog)->vbox),
-			import_label,
-			FALSE,
-			FALSE,
-			0);
-        gtk_box_pack_start(
-			GTK_BOX(((GtkDialog *)import_dialog)->vbox),
-			import_progress,
-			FALSE,
-			FALSE,
-			0);
+	import_label = gtk_label_new(_("Please wait"));
+	import_progress = gtk_progress_bar_new();
+	gtk_box_pack_start(
+		GTK_BOX(((GtkDialog *)import_dialog)->vbox),
+		import_label,
+		FALSE,
+		FALSE,
+		0);
+	gtk_box_pack_start(
+		GTK_BOX(((GtkDialog *)import_dialog)->vbox),
+		import_progress,
+		FALSE,
+		FALSE,
+		0);
 	gtk_widget_show_all(import_dialog);
 	g_free(msg);
 	count = 0;
 	g_hash_table_foreach(
-			rf->hrname,
-			construct_opml_line,
-			import_progress);
+		rf->hrname,
+		construct_opml_line,
+		import_progress);
 	gtk_widget_destroy(import_dialog);
 	t = time(NULL);
 	tmp = localtime(&t);
 	strftime(outstr, sizeof(outstr), "%a, %d %b %Y %H:%M:%S %z", tmp);
 	opml = g_strdup_printf("<opml version=\"1.1\">\n<head>\n"
-                "<title>Evolution-RSS Exported Feeds</title>\n"
-                "<dateModified>%s</dateModified>\n</head>\n<body>%s</body>\n</opml>\n",
-                outstr,
-                buffer);
-        g_free(buffer);
+		"<title>Evolution-RSS Exported Feeds</title>\n"
+		"<dateModified>%s</dateModified>\n</head>\n<body>%s</body>\n</opml>\n",
+		outstr,
+		buffer);
+	g_free(buffer);
 
 	f = fopen(file, "w+");
 	if (f) {
@@ -2097,17 +2290,17 @@ export_opml(gchar *file)
 static void
 select_export_response(GtkWidget *selector, guint response, gpointer user_data)
 {
-        if (response == GTK_RESPONSE_OK) {
-                char *name;
+	if (response == GTK_RESPONSE_OK) {
+		char *name;
 
-                name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (selector));
-                if (name) {
-                        gtk_widget_destroy(selector);
-                        export_opml(name);
-                        g_free(name);
-                }
-        } else
-                gtk_widget_destroy(selector);
+		name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (selector));
+		if (name) {
+			gtk_widget_destroy(selector);
+			export_opml(name);
+			g_free(name);
+		}
+	} else
+		gtk_widget_destroy(selector);
 
 }
 
@@ -2180,27 +2373,29 @@ process_cookies(SoupCookieJar *jar)
 			"shell:importing",
 			msg,
 			NULL);
-        gtk_window_set_keep_above(GTK_WINDOW(import_dialog), TRUE);
-        g_signal_connect(
+	gtk_window_set_keep_above(
+		GTK_WINDOW(import_dialog),
+		TRUE);
+	g_signal_connect(
 		import_dialog,
 		"response",
 		G_CALLBACK(import_dialog_response),
 		NULL);
 	import_label = gtk_label_new(_("Please wait"));
 	import_progress = gtk_progress_bar_new();
-        gtk_box_pack_start(
+	gtk_box_pack_start(
 		GTK_BOX(((GtkDialog *)import_dialog)->vbox),
-                import_label,
-                FALSE,
-                FALSE,
-                0);
-        gtk_box_pack_start(
+		import_label,
+		FALSE,
+		FALSE,
+		0);
+	gtk_box_pack_start(
 		GTK_BOX(((GtkDialog *)import_dialog)->vbox),
-                import_progress,
-                FALSE,
-                FALSE,
-                0);
-        gtk_widget_show_all(import_dialog);
+		import_progress,
+		FALSE,
+		FALSE,
+		0);
+	gtk_widget_show_all(import_dialog);
 	ctotal = g_slist_length(list);
 	g_slist_foreach(list, (GFunc)inject_cookie, import_progress);
 	//reset cancel signal
@@ -2215,60 +2410,85 @@ select_import_cookies_response(GtkWidget *selector, guint response, gpointer use
 {
 	SoupCookieJar *jar;
 
-        if (response == GTK_RESPONSE_OK) {
-                char *name;
+	if (response == GTK_RESPONSE_OK) {
+		char *name;
 
-                name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (selector));
-                if (name) {
-                        gtk_widget_destroy(selector);
-                        if ((jar = import_cookies(name)))
+		name = gtk_file_chooser_get_filename (
+			GTK_FILE_CHOOSER (selector));
+		if (name) {
+			gtk_widget_destroy(selector);
+			if ((jar = import_cookies(name)))
 				process_cookies(jar);
-                        g_free(name);
-                }
-        } else
-                gtk_widget_destroy(selector);
+			g_free(name);
+		}
+	} else
+		gtk_widget_destroy(selector);
 
 }
 
 GtkWidget*
 create_import_cookies_dialog (void)
 {
-  GtkWidget *import_file_select;
-  GtkWidget *vbox26;
-  GtkWidget *hbuttonbox1;
-  GtkWidget *button3;
-  GtkWidget *button4;
-
-  import_file_select = gtk_file_chooser_dialog_new (_("Select file to import"),
-                                NULL, GTK_FILE_CHOOSER_ACTION_SAVE, NULL, NULL);
-  gtk_window_set_keep_above(GTK_WINDOW(import_file_select), TRUE);
-  g_object_set (import_file_select,
-                "local-only", FALSE,
-                NULL);
-  gtk_window_set_modal (GTK_WINDOW (import_file_select), TRUE);
-  gtk_window_set_resizable (GTK_WINDOW (import_file_select), TRUE);
-  gtk_window_set_destroy_with_parent (GTK_WINDOW (import_file_select), TRUE);
-  gtk_window_set_type_hint (GTK_WINDOW (import_file_select), GDK_WINDOW_TYPE_HINT_DIALOG);
+	GtkWidget *import_file_select;
+	GtkWidget *vbox26;
+	GtkWidget *hbuttonbox1;
+	GtkWidget *button3;
+	GtkWidget *button4;
+
+	import_file_select = gtk_file_chooser_dialog_new (
+				_("Select file to import"),
+				NULL,
+				GTK_FILE_CHOOSER_ACTION_SAVE,
+				NULL,
+				NULL);
+	gtk_window_set_keep_above(
+		GTK_WINDOW(import_file_select),
+		TRUE);
+	g_object_set (
+		import_file_select,
+		"local-only",
+		FALSE,
+		NULL);
+	gtk_window_set_modal (
+		GTK_WINDOW (import_file_select),
+		TRUE);
+	gtk_window_set_resizable (
+		GTK_WINDOW (import_file_select),
+		TRUE);
+	gtk_window_set_destroy_with_parent (
+		GTK_WINDOW (import_file_select),
+		TRUE);
+	gtk_window_set_type_hint (
+		GTK_WINDOW (import_file_select),
+		GDK_WINDOW_TYPE_HINT_DIALOG);
 
-  vbox26 = GTK_DIALOG (import_file_select)->vbox;
-  gtk_widget_show (vbox26);
+	vbox26 = GTK_DIALOG (import_file_select)->vbox;
+	gtk_widget_show (vbox26);
 
-  hbuttonbox1 = GTK_DIALOG (import_file_select)->action_area;
-  gtk_widget_show (hbuttonbox1);
-  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_END);
+	hbuttonbox1 = GTK_DIALOG (import_file_select)->action_area;
+	gtk_widget_show (hbuttonbox1);
+	gtk_button_box_set_layout (
+		GTK_BUTTON_BOX (hbuttonbox1),
+		GTK_BUTTONBOX_END);
 
-  button3 = gtk_button_new_from_stock ("gtk-cancel");
-  gtk_widget_show (button3);
-  gtk_dialog_add_action_widget (GTK_DIALOG (import_file_select), button3, GTK_RESPONSE_CANCEL);
-  GTK_WIDGET_SET_FLAGS (button3, GTK_CAN_DEFAULT);
+	button3 = gtk_button_new_from_stock ("gtk-cancel");
+	gtk_widget_show (button3);
+	gtk_dialog_add_action_widget (
+		GTK_DIALOG (import_file_select),
+		button3,
+		GTK_RESPONSE_CANCEL);
+	GTK_WIDGET_SET_FLAGS (button3, GTK_CAN_DEFAULT);
 
-  button4 = gtk_button_new_from_stock ("gtk-save");
-  gtk_widget_show (button4);
-  gtk_dialog_add_action_widget (GTK_DIALOG (import_file_select), button4, GTK_RESPONSE_OK);
-  GTK_WIDGET_SET_FLAGS (button4, GTK_CAN_DEFAULT);
+	button4 = gtk_button_new_from_stock ("gtk-save");
+	gtk_widget_show (button4);
+	gtk_dialog_add_action_widget (
+		GTK_DIALOG (import_file_select),
+		button4,
+		GTK_RESPONSE_OK);
+	GTK_WIDGET_SET_FLAGS (button4, GTK_CAN_DEFAULT);
 
-  gtk_widget_grab_default (button4);
-  return import_file_select;
+	gtk_widget_grab_default (button4);
+	return import_file_select;
 }
 
 void
@@ -2302,8 +2522,16 @@ decorate_import_cookies_fs (gpointer data)
 	gtk_file_filter_add_pattern (filter, "*.txt");
 	gtk_file_filter_add_pattern (filter, "*.sqlite");
 	gtk_file_chooser_set_filter(data, filter);
-	g_signal_connect(data, "response", G_CALLBACK(select_import_cookies_response), data);
-	g_signal_connect(data, "destroy", G_CALLBACK(gtk_widget_destroy), data);
+	g_signal_connect(
+		data,
+		"response",
+		G_CALLBACK(select_import_cookies_response),
+		data);
+	g_signal_connect(
+		data,
+		"destroy",
+		G_CALLBACK(gtk_widget_destroy),
+		data);
 }
 
 static void
@@ -2330,10 +2558,15 @@ decorate_export_fs (gpointer data)
 	gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (data),
 		GTK_FILE_FILTER(file_filter));
 
-        file_filter = gtk_file_filter_new ();
-        gtk_file_filter_add_pattern (GTK_FILE_FILTER(file_filter), "*.opml");
-        gtk_file_filter_set_name (GTK_FILE_FILTER(file_filter), _("OPML Files"));
-        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (data),
+	file_filter = gtk_file_filter_new ();
+	gtk_file_filter_add_pattern (
+		GTK_FILE_FILTER(file_filter),
+		"*.opml");
+	gtk_file_filter_set_name (
+		GTK_FILE_FILTER(file_filter),
+		_("OPML Files"));
+	gtk_file_chooser_add_filter (
+		GTK_FILE_CHOOSER (data),
 		GTK_FILE_FILTER(file_filter));
 
 	file_filter = gtk_file_filter_new ();
@@ -2346,57 +2579,70 @@ decorate_export_fs (gpointer data)
 		GTK_FILE_FILTER(file_filter));
 
 
-        gtk_file_filter_add_pattern (filter, "*.opml");
-        gtk_file_filter_add_pattern (filter, "*.xml");
-        gtk_file_chooser_set_filter(data, filter);
-        g_signal_connect(data, "response", G_CALLBACK(select_export_response), data);
-        g_signal_connect(data, "destroy", G_CALLBACK(gtk_widget_destroy), data);
+	gtk_file_filter_add_pattern (filter, "*.opml");
+	gtk_file_filter_add_pattern (filter, "*.xml");
+	gtk_file_chooser_set_filter(data, filter);
+	g_signal_connect(
+		data,
+		"response",
+		G_CALLBACK(select_export_response),
+		data);
+	g_signal_connect(
+		data,
+		"destroy",
+		G_CALLBACK(gtk_widget_destroy),
+		data);
 }
 
 static void
 export_cb (GtkWidget *widget, gpointer data)
 {
-        if (!rf->import) {
-                GtkWidget *export = create_export_dialog();
-                decorate_export_fs(export);
-                gtk_dialog_set_default_response (GTK_DIALOG (export), GTK_RESPONSE_OK);
-                if (g_hash_table_size(rf->hrname)<1) {
+	if (!rf->import) {
+		GtkWidget *export = create_export_dialog();
+		decorate_export_fs(export);
+		gtk_dialog_set_default_response (
+			GTK_DIALOG (export),
+			GTK_RESPONSE_OK);
+		if (g_hash_table_size(rf->hrname)<1) {
 #if EVOLUTION_VERSION < 22904
-                        e_error_run(GTK_WINDOW(export),
+			e_error_run(GTK_WINDOW(export),
 #else
-                        e_alert_run_dialog_for_args(GTK_WINDOW(export),
+			e_alert_run_dialog_for_args(GTK_WINDOW(export),
 #endif
-                                "org-gnome-evolution-rss:generr",
-                                _("No RSS feeds configured!\nUnable to export."),
-                                NULL);
-                        return;
-                }
-                gtk_widget_show(export);
+				"org-gnome-evolution-rss:generr",
+				_("No RSS feeds configured!\nUnable to export."),
+				NULL);
+			return;
+		}
+		gtk_widget_show(export);
 
 //              g_signal_connect(data, "response", G_CALLBACK(select_export_response), data);
 //              g_signal_connect(data, "destroy", G_CALLBACK(gtk_widget_destroy), data);
-        }
-        return;
+	}
+	return;
 }
 
 
 static void
 network_timeout_cb (GtkWidget *widget, gpointer data)
 {
-    gconf_client_set_float (rss_gconf, GCONF_KEY_NETWORK_TIMEOUT,
-                gtk_spin_button_get_value((GtkSpinButton*)widget), NULL);
+	gconf_client_set_float (
+		rss_gconf,
+		GCONF_KEY_NETWORK_TIMEOUT,
+		gtk_spin_button_get_value((GtkSpinButton*)widget),
+		NULL);
 }
 
 static void
 destroy_ui_data (gpointer data)
 {
-        UIData *ui = (UIData *) data;
+	UIData *ui = (UIData *) data;
 
 	g_return_if_fail(ui != NULL);
 
-        g_object_unref (ui->xml);
-        g_object_unref (ui->gconf);
-        g_free (ui);
+	g_object_unref (ui->xml);
+	g_object_unref (ui->gconf);
+	g_free (ui);
 }
 
 GtkWidget *e_plugin_lib_get_configure_widget (EPlugin *epl);
@@ -2405,8 +2651,8 @@ GtkWidget *
 e_plugin_lib_get_configure_widget (EPlugin *epl)
 {
 	GtkListStore  *store;
-        GtkTreeIter iter;
-        GtkWidget *hbox, *combo;
+	GtkTreeIter iter;
+	GtkWidget *hbox, *combo;
 #if !defined(HAVE_GECKO) && !defined (HAVE_WEBKIT)
 	GtkWidget *label_webkit;
 #endif
@@ -2466,22 +2712,36 @@ e_plugin_lib_get_configure_widget (EPlugin *epl)
 			gtk_combo_box_set_active(GTK_COMBO_BOX(combo), render);
 	}
 
-        gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combo),
-                                        renderer,
-                                        set_sensitive,
-                                        NULL, NULL);
+	gtk_cell_layout_set_cell_data_func (
+		GTK_CELL_LAYOUT (combo),
+		renderer,
+		set_sensitive,
+		NULL, NULL);
 
 #if !defined(HAVE_GECKO) && !defined (HAVE_WEBKIT)
-        label_webkit = GTK_WIDGET (gtk_builder_get_object(ui->xml, "label_webkits"));
-        gtk_label_set_text(GTK_LABEL(label_webkit), _("Note: In order to be able to use Mozilla (Firefox) or Apple Webkit \nas renders you need firefox or webkit devel package \ninstalled and evolution-rss should be recompiled to see those packages."));
-        gtk_widget_show(label_webkit);
+	label_webkit = GTK_WIDGET (
+			gtk_builder_get_object(ui->xml, "label_webkits"));
+	gtk_label_set_text(GTK_LABEL(label_webkit),
+		_("Note: In order to be able to use Mozilla (Firefox) or Apple Webkit \nas renders you need firefox or webkit devel package \ninstalled and evolution-rss should be recompiled to see those packages."));
+	gtk_widget_show(label_webkit);
 #endif
-        g_signal_connect (combo, "changed", G_CALLBACK (render_engine_changed), NULL);
-        gtk_widget_show(combo);
-        gtk_box_pack_start(GTK_BOX(ui->combobox), combo, FALSE, FALSE, 0);
+	g_signal_connect (
+		combo,
+		"changed",
+		G_CALLBACK (render_engine_changed),
+		NULL);
+	gtk_widget_show(combo);
+	gtk_box_pack_start(
+		GTK_BOX(ui->combobox),
+		combo,
+		FALSE,
+		FALSE,
+		0);
 
-	ui->check = GTK_WIDGET (gtk_builder_get_object(ui->xml, "enable_java"));
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->check),
+	ui->check = GTK_WIDGET (
+		gtk_builder_get_object(ui->xml, "enable_java"));
+	gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (ui->check),
 		gconf_client_get_bool(rss_gconf, GCONF_KEY_HTML_JAVA, NULL));
 	g_signal_connect(ui->check,
 		"clicked",
@@ -2515,22 +2775,41 @@ e_plugin_lib_get_configure_widget (EPlugin *epl)
 	//we have to have ui->import looked up
 
 #if LIBSOUP_VERSION >= 2026000
-	g_signal_connect(ui->import, "clicked", G_CALLBACK(import_cookies_cb), ui->import);
+	g_signal_connect(
+		ui->import,
+		"clicked",
+		G_CALLBACK(import_cookies_cb),
+		ui->import);
 #else
 	gtk_widget_set_sensitive(ui->import, FALSE);
 	gtk_widget_set_sensitive(ui->check, FALSE);
 #endif
 
 	ui->nettimeout = GTK_WIDGET (gtk_builder_get_object(ui->xml, "nettimeout"));
-	adj = gconf_client_get_float(rss_gconf, GCONF_KEY_NETWORK_TIMEOUT, NULL);
+	adj = gconf_client_get_float(
+			rss_gconf,
+			GCONF_KEY_NETWORK_TIMEOUT,
+			NULL);
 	if (adj < NETWORK_MIN_TIMEOUT) {
 		adj = 60;
-		gconf_client_set_float (rss_gconf, GCONF_KEY_NETWORK_TIMEOUT, adj, NULL);
+		gconf_client_set_float (
+			rss_gconf,
+			GCONF_KEY_NETWORK_TIMEOUT,
+			adj,
+			NULL);
 	}
 	if (adj)
 		gtk_spin_button_set_value((GtkSpinButton *)ui->nettimeout, adj);
-	g_signal_connect(ui->nettimeout, "changed", G_CALLBACK(network_timeout_cb), ui->nettimeout);
-	g_signal_connect(ui->nettimeout, "value-changed", G_CALLBACK(network_timeout_cb), ui->nettimeout);
+	g_signal_connect(
+		ui->nettimeout,
+		"changed",
+		G_CALLBACK(network_timeout_cb),
+		ui->nettimeout);
+	g_signal_connect(
+		ui->nettimeout,
+		"value-changed",
+		G_CALLBACK(network_timeout_cb),
+		ui->nettimeout);
 
 	//feed notification
 	ui->check = GTK_WIDGET (gtk_builder_get_object(ui->xml, "status_icon"));
@@ -2548,21 +2827,31 @@ e_plugin_lib_get_configure_widget (EPlugin *epl)
 		G_CALLBACK(start_check_cb),
 		(gpointer)GCONF_KEY_BLINK_ICON);
 	ui->check = GTK_WIDGET (gtk_builder_get_object(ui->xml, "feed_icon"));
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->check),
+	gtk_toggle_button_set_active (
+		GTK_TOGGLE_BUTTON (ui->check),
 		gconf_client_get_bool(rss_gconf, GCONF_KEY_FEED_ICON, NULL));
 	g_signal_connect(ui->check,
 		"clicked",
 		G_CALLBACK(start_check_cb),
 		(gpointer)GCONF_KEY_FEED_ICON);
 
-        ui->gconf = gconf_client_get_default ();
+	ui->gconf = gconf_client_get_default ();
 	hbox = gtk_vbox_new (FALSE, 0);
 
-        gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (gtk_builder_get_object(ui->xml, "settingsbox")), FALSE, FALSE, 0);
+	gtk_box_pack_start (
+		GTK_BOX (hbox),
+		GTK_WIDGET (gtk_builder_get_object(ui->xml, "settingsbox")),
+		FALSE,
+		FALSE,
+		0);
 
-	g_object_set_data_full (G_OBJECT (hbox), "ui-data", ui, destroy_ui_data);
+	g_object_set_data_full (
+		G_OBJECT (hbox),
+		"ui-data",
+		ui,
+		destroy_ui_data);
 
-        return hbox;
+	return hbox;
 }
 
 typedef struct _EConfigTargetRSS EConfigTargetRSS;
@@ -2600,7 +2889,8 @@ void rss_folder_factory_commit (EPlugin *epl, EConfigTarget *target)
 	gchar *url = (gchar *)g_object_get_data((GObject *)epl, "url");
 	gchar *ofolder = (gchar *)g_object_get_data((GObject *)epl, "ofolder");
 
-	EMConfigTargetFolder *targetfolder = (EMConfigTargetFolder *)target->config->target;
+	EMConfigTargetFolder *targetfolder = 
+		(EMConfigTargetFolder *)target->config->target;
 	gchar *main_folder = lookup_main_folder();
 	gchar *folder = targetfolder->folder->full_name;
 
@@ -2652,13 +2942,12 @@ void rss_folder_factory_commit (EPlugin *epl, EConfigTarget *target)
 		i++;
 		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton3)))
 			break;
-		i++;
-		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton7)))
-			break;
 	}
 	feed->del_feed=i;
 	feed->del_unread = gtk_toggle_button_get_active(
 				GTK_TOGGLE_BUTTON(checkbutton4));
+	feed->del_notpresent = gtk_toggle_button_get_active(
+				GTK_TOGGLE_BUTTON(radiobutton7));
 	gtk_spin_button_update((GtkSpinButton *)spinbutton1);
 	feed->del_messages = gtk_spin_button_get_value((GtkSpinButton *)spinbutton1);
 	gtk_spin_button_update((GtkSpinButton *)spinbutton2);
@@ -2731,9 +3020,9 @@ rss_folder_factory (EPlugin *epl, EConfigHookItemFactoryData *data)
 
 	//filter only rss folders
 	if (folder == NULL
-          || g_ascii_strncasecmp(folder, main_folder, strlen(main_folder))
-          || !g_ascii_strcasecmp(folder, main_folder))
-		goto out;
+		|| g_ascii_strncasecmp(folder, main_folder, strlen(main_folder))
+		|| !g_ascii_strcasecmp(folder, main_folder))
+			goto out;
 
 	ofolder = lookup_original_folder(folder, &found);
 	key = lookup_key(ofolder);
@@ -2817,7 +3106,7 @@ GtkWidget *
 #endif
 rss_config_control_new (void)
 {
-        GtkWidget *control_widget;
+	GtkWidget *control_widget;
 	GtkWidget *button1, *button2, *button3;
 	gchar *gladefile;
 	setupfeed *sf;
@@ -3152,8 +3441,16 @@ rss_config_control_new (void)
 
 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->use_proxy),
 		gconf_client_get_bool(rss_gconf, GCONF_KEY_USE_PROXY, NULL));
-	g_signal_connect(sf->use_proxy, "clicked", G_CALLBACK(start_check_cb), GCONF_KEY_USE_PROXY);
-	g_signal_connect(sf->details, "clicked", G_CALLBACK(details_cb), sf->gui);
+	g_signal_connect(
+		sf->use_proxy,
+		"clicked",
+		G_CALLBACK(start_check_cb),
+		GCONF_KEY_USE_PROXY);
+	g_signal_connect(
+		sf->details,
+		"clicked",
+		G_CALLBACK(details_cb),
+		sf->gui);
 #endif
 
 
diff --git a/src/rss-config-factory.h b/src/rss-config-factory.h
index fc7c989..a8e5dd5 100644
--- a/src/rss-config-factory.h
+++ b/src/rss-config-factory.h
@@ -22,10 +22,19 @@
 #define SQLITE_MAGIC "SQLite format 3"
 
 gboolean store_redraw(GtkTreeView *data);
-void import_dialog_response(GtkWidget *selector, guint response, gpointer user_data);
+void import_dialog_response(
+	GtkWidget *selector,
+	guint response,
+	gpointer user_data);
+
 void del_days_cb (GtkWidget *widget, add_feed *data);
 void delete_feed_folder_alloc(gchar *old_name);
-void rss_delete_folders (CamelStore *store, const char *full_name, CamelException *ex);
+
+void rss_delete_folders (
+	CamelStore *store,
+	const char *full_name,
+	CamelException *ex);
+
 void remove_feed_hash(gpointer name);
 void init_rss_prefs(void);
 void accept_cookies_cb(GtkWidget *widget, GtkWidget *data);
@@ -40,9 +49,23 @@ void restore_feed_hash(gpointer name, hrfeed *s);
 void feeds_dialog_disable(GtkDialog *d, gpointer data);
 GtkWidget *remove_feed_dialog(gchar *msg);
 void feeds_dialog_delete(GtkDialog *d, gpointer data);
-void process_dialog_edit(add_feed *feed, gchar *url, gchar *feed_name);
-void import_one_feed(gchar *url, gchar *title, gchar *prefix);
-xmlNode *iterate_import_file(xmlNode *src, gchar **url, xmlChar **title, guint type);
+
+void process_dialog_edit(
+	add_feed *feed,
+	gchar *url,
+	gchar *feed_name);
+
+void import_one_feed(
+	gchar *url,
+	gchar *title,
+	gchar *prefix);
+
+xmlNode *iterate_import_file(
+		xmlNode *src,
+		gchar **url,
+		xmlChar **title,
+		guint type);
+
 #if LIBSOUP_VERSION >= 2026000
 SoupCookieJar *import_cookies(gchar *file);
 void process_cookies(SoupCookieJar *jar);
diff --git a/src/rss-ui.glade b/src/rss-ui.glade
index 62d54ca..5c95b0d 100644
--- a/src/rss-ui.glade
+++ b/src/rss-ui.glade
@@ -950,9 +950,9 @@
     <property name="modal">True</property>
     <property name="destroy_with_parent">True</property>
     <property name="type_hint">dialog</property>
-    <property name="show_hidden">True</property>
     <property name="action">save</property>
     <property name="local_only">False</property>
+    <property name="show_hidden">True</property>
     <child internal-child="vbox">
       <object class="GtkVBox" id="vbox26">
         <property name="visible">True</property>
@@ -1439,16 +1439,14 @@
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkRadioButton" id="storage_rb4">
+                              <object class="GtkCheckButton" id="storage_rb4">
                                 <property name="label" translatable="yes">Delete articles that are no longer in the feed</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
                                 <property name="draw_indicator">True</property>
-                                <property name="group">storage_rb1</property>
                               </object>
                               <packing>
-                                <property name="expand">False</property>
                                 <property name="position">3</property>
                               </packing>
                             </child>
diff --git a/src/rss.c b/src/rss.c
index b13a9bf..d8a6b18 100644
--- a/src/rss.c
+++ b/src/rss.c
@@ -802,9 +802,18 @@ feed_to_xml(gchar *key)
 	xmlDocSetRootElement (doc, root);
 
 	xmlSetProp (root, (xmlChar *)"uid", (xmlChar *)(g_hash_table_lookup(rf->hrname, key)));
-	xmlSetProp (root, (xmlChar *)"enabled", (xmlChar *)(g_hash_table_lookup(rf->hre, lookup_key(key)) ? "true" : "false"));
-	xmlSetProp (root, (xmlChar *)"html", (xmlChar *)(g_hash_table_lookup(rf->hrh, lookup_key(key)) ? "true" : "false"));
-
+	xmlSetProp (
+		root,
+		(xmlChar *)"enabled",
+		(xmlChar *)(g_hash_table_lookup(
+				rf->hre,
+				lookup_key(key)) ? "true" : "false"));
+	xmlSetProp (
+		root,
+		(xmlChar *)"html",
+		(xmlChar *)(g_hash_table_lookup(
+				rf->hrh,
+				lookup_key(key)) ? "true" : "false"));
 
 	xmlNewTextChild (root, NULL, (xmlChar *)"name", (xmlChar *)key);
 	xmlNewTextChild (root, NULL, (xmlChar *)"url", (xmlChar *)g_hash_table_lookup(rf->hr, lookup_key(key)));
@@ -820,11 +829,25 @@ feed_to_xml(gchar *key)
 	ctmp = g_strdup_printf("%d", GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_messages, lookup_key(key))));
 	xmlSetProp (src, (xmlChar *)"messages", (xmlChar *)ctmp);
 	g_free(ctmp);
-	xmlSetProp (src, (xmlChar *)"unread",
-		(xmlChar *)(g_hash_table_lookup(rf->hrdel_unread, lookup_key(key)) ? "true" : "false"));
+	xmlSetProp (
+		src,
+		(xmlChar *)"unread",
+		(xmlChar *)(g_hash_table_lookup(
+				rf->hrdel_unread,
+				lookup_key(key)) ? "true" : "false"));
+	xmlSetProp (
+		src,
+		(xmlChar *)"notpresent",
+		(xmlChar *)(g_hash_table_lookup(
+				rf->hrdel_notpresent,
+				lookup_key(key)) ? "true" : "false"));
 
 	src = xmlNewTextChild (root, NULL, (xmlChar *)"ttl", NULL);
-	ctmp = g_strdup_printf("%d", GPOINTER_TO_INT(g_hash_table_lookup(rf->hrupdate, lookup_key(key))));
+	ctmp = g_strdup_printf(
+		"%d",
+		GPOINTER_TO_INT(g_hash_table_lookup(
+				rf->hrupdate,
+				lookup_key(key))));
 	xmlSetProp (src, (xmlChar *)"option", (xmlChar *)ctmp);
 	g_free(ctmp);
 	ctmp = g_strdup_printf("%d", GPOINTER_TO_INT(g_hash_table_lookup(rf->hrttl, lookup_key(key))));
@@ -1014,7 +1037,7 @@ feed_new_from_xml(char *xml)
 	guint del_feed=0;
 	guint del_days=0;
 	guint del_messages=0;
-	guint del_unread=0;
+	guint del_unread=0, del_notpresent=0;
 	guint ttl=0;
 	guint ttl_multiply=0;
 	guint update=0;
@@ -1050,7 +1073,14 @@ feed_new_from_xml(char *xml)
 			del_days = atoi(ctmp);
 			xml_set_prop (node, "messages", &ctmp);
 			del_messages = atoi(ctmp);
-			xml_set_bool (node, "unread", (gboolean *)&del_unread);
+			xml_set_bool (
+				node,
+				"unread",
+				(gboolean *)&del_unread);
+			xml_set_bool (
+				node,
+				"notpresent",
+				(gboolean *)&del_notpresent);
 		}
 		if (!strcmp ((char *)node->name, "ttl")) {
 			xml_set_prop (node, "option", &ctmp);
@@ -1065,36 +1095,58 @@ feed_new_from_xml(char *xml)
 	}
 
 	g_hash_table_insert(rf->hrname, name, uid);
-	g_hash_table_insert(rf->hrname_r, g_strdup(uid), g_strdup(name));
-	g_hash_table_insert(rf->hr, g_strdup(uid), url);
-	g_hash_table_insert(rf->hrh,
-				g_strdup(uid),
-				GINT_TO_POINTER(html));
-	g_hash_table_insert(rf->hrt, g_strdup(uid), type);
-	g_hash_table_insert(rf->hre,
-				g_strdup(uid),
-				GINT_TO_POINTER(enabled));
-	g_hash_table_insert(rf->hrdel_feed,
-				g_strdup(uid),
-				GINT_TO_POINTER(del_feed));
-	g_hash_table_insert(rf->hrdel_days,
-				g_strdup(uid),
-				GINT_TO_POINTER(del_days));
-	g_hash_table_insert(rf->hrdel_messages,
-				g_strdup(uid),
-				GINT_TO_POINTER(del_messages));
-	g_hash_table_insert(rf->hrdel_unread,
-				g_strdup(uid),
-				GINT_TO_POINTER(del_unread));
-	g_hash_table_insert(rf->hrupdate,
-				g_strdup(uid),
-				GINT_TO_POINTER(update));
-	g_hash_table_insert(rf->hrttl,
-				g_strdup(uid),
-				GINT_TO_POINTER(ttl));
-	g_hash_table_insert(rf->hrttl_multiply,
-				g_strdup(uid),
-				GINT_TO_POINTER(ttl_multiply));
+	g_hash_table_insert(
+		rf->hrname_r,
+		g_strdup(uid),
+		g_strdup(name));
+	g_hash_table_insert(
+		rf->hr,
+		g_strdup(uid),
+		url);
+	g_hash_table_insert(
+		rf->hrh,
+		g_strdup(uid),
+		GINT_TO_POINTER(html));
+	g_hash_table_insert(
+		rf->hrt,
+		g_strdup(uid),
+		type);
+	g_hash_table_insert(
+		rf->hre,
+		g_strdup(uid),
+		GINT_TO_POINTER(enabled));
+	g_hash_table_insert(
+		rf->hrdel_feed,
+		g_strdup(uid),
+		GINT_TO_POINTER(del_feed));
+	g_hash_table_insert(
+		rf->hrdel_days,
+		g_strdup(uid),
+		GINT_TO_POINTER(del_days));
+	g_hash_table_insert(
+		rf->hrdel_messages,
+		g_strdup(uid),
+		GINT_TO_POINTER(del_messages));
+	g_hash_table_insert(
+		rf->hrdel_unread,
+		g_strdup(uid),
+		GINT_TO_POINTER(del_unread));
+	g_hash_table_insert(
+		rf->hrdel_notpresent,
+		g_strdup(uid),
+		GINT_TO_POINTER(del_notpresent));
+	g_hash_table_insert(
+		rf->hrupdate,
+		g_strdup(uid),
+		GINT_TO_POINTER(update));
+	g_hash_table_insert(
+		rf->hrttl,
+		g_strdup(uid),
+		GINT_TO_POINTER(ttl));
+	g_hash_table_insert(
+		rf->hrttl_multiply,
+		g_strdup(uid),
+		GINT_TO_POINTER(ttl_multiply));
 	xmlFreeDoc (doc);
 	return TRUE;
 }
@@ -1218,18 +1270,30 @@ read_feeds(rssfeed *rf)
 		g_mkdir_with_parents (feed_dir, 0755);
 	feed_file = g_strdup_printf("%s/evolution-feeds", feed_dir);
 	g_free(feed_dir);
-	rf->hrname = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
-	rf->hrname_r = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+	rf->hrname = 
+		g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+	rf->hrname_r = 
+		g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
 	rf->hr = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
 	rf->hre = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-	rf->hrt = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
-	rf->hrh = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-	rf->hruser = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
-	rf->hrpass = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
-	rf->hrdel_feed = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-	rf->hrdel_days = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-	rf->hrdel_messages = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-	rf->hrdel_unread = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+	rf->hrt = 
+		g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+	rf->hrh = 
+		g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+	rf->hruser = 
+		g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
+	rf->hrpass = 
+		g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
+	rf->hrdel_feed = 
+		g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+	rf->hrdel_days = 
+		g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+	rf->hrdel_messages = 
+		g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+	rf->hrdel_unread = 
+		g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+	rf->hrdel_notpresent = 
+		g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
 	rf->hrupdate = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
 	rf->hrttl = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
 	rf->hrttl_multiply = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
@@ -2683,7 +2747,16 @@ prepare_hashes(void)
 				g_free,
 				NULL);
 	if (rf->hrdel_unread == NULL)
-		rf->hrdel_unread = g_hash_table_new_full(g_str_hash,
+		rf->hrdel_unread = 
+			g_hash_table_new_full(
+				g_str_hash,
+				g_str_equal,
+				g_free,
+				NULL);
+	if (rf->hrdel_notpresent == NULL)
+		rf->hrdel_notpresent = 
+			g_hash_table_new_full(
+				g_str_hash,
 				g_str_equal,
 				g_free,
 				NULL);
@@ -2814,9 +2887,14 @@ add:
 		g_hash_table_insert(rf->hrdel_messages,
 			g_strdup(crc_feed),
 			GINT_TO_POINTER(feed->del_messages));
-		g_hash_table_insert(rf->hrdel_unread,
+		g_hash_table_insert(
+			rf->hrdel_unread,
 			g_strdup(crc_feed),
 			GINT_TO_POINTER(feed->del_unread));
+		g_hash_table_insert(
+			rf->hrdel_notpresent,
+			g_strdup(crc_feed),
+			GINT_TO_POINTER(feed->del_notpresent));
 		r->ttl = r->ttl ? r->ttl : DEFAULT_TTL;
 		if (feed->update == 2)
 			ttl = feed->ttl;
@@ -5867,7 +5945,7 @@ get_feed_age(RDF *r, gpointer name)
 	gchar *el, *feedid;
 	gchar *real_name;
 	gboolean match;
-	guint del_unread, del_feed;
+	guint del_unread, del_notpresent, del_feed;
 
 	gchar *real_folder = lookup_feed_folder(name);
 	d("Cleaning folder: %s\n", real_folder);
@@ -5877,21 +5955,25 @@ get_feed_age(RDF *r, gpointer name)
 		goto fail;
 	time (&now);
 
-	del_unread = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_unread, key));
-	del_feed = GPOINTER_TO_INT(g_hash_table_lookup(rf->hrdel_feed, key));
+	del_unread = GPOINTER_TO_INT(
+		g_hash_table_lookup(rf->hrdel_unread, key));
+	del_notpresent = GPOINTER_TO_INT(
+		g_hash_table_lookup(rf->hrdel_notpresent, key));
+	del_feed = GPOINTER_TO_INT(
+		g_hash_table_lookup(rf->hrdel_feed, key));
 	inhibit_read = 1;
-	if (del_feed == 3) {
+	if (del_notpresent) {
 		uids = camel_folder_get_uids (folder);
 		camel_folder_freeze(folder);
 		for (i = 0; i < uids->len; i++) {
 			el = NULL;
 			match = FALSE;
 			feedid  = (gchar *)camel_medium_get_header (
-							CAMEL_MEDIUM(camel_folder_get_message(
-								folder,
-								uids->pdata[i],
-								NULL)),
-							"X-Evolution-Rss-Feed-id");
+					CAMEL_MEDIUM(camel_folder_get_message(
+						folder,
+						uids->pdata[i],
+						NULL)),
+					"X-Evolution-Rss-Feed-id");
 			if (!r->uids)
 				break;
 
diff --git a/src/rss.h b/src/rss.h
index 6289151..5f5f2d7 100644
--- a/src/rss.h
+++ b/src/rss.h
@@ -102,6 +102,7 @@ typedef struct _hrfeed {
 	guint hrdel_days;
 	guint hrdel_messages;
 	guint hrdel_unread;
+	guint hrdel_notpresent;
 	guint hrupdate;
 	guint hrttl;
 	guint hrttl_multiply;
@@ -123,6 +124,7 @@ typedef struct _rssfeed {
 	GHashTable      *hrdel_days;		//option to delete messages older then days
 	GHashTable      *hrdel_messages;	//option to keep last messages
 	GHashTable      *hrdel_unread;		//option to delete unread messages too
+	GHashTable      *hrdel_notpresent;	//option to delete messages that are not present in the feed
 	GHashTable      *hrttl;
 	GHashTable      *hrttl_multiply;
 	GHashTable      *hrupdate;		//feeds update method
@@ -220,6 +222,7 @@ typedef struct ADD_FEED {
 	guint		del_days;	// delete messages over del_days old
 	guint		del_messages;	// delete all messages but the last del_messages
 	gboolean	del_unread;	// delete unread messages too
+	gboolean	del_notpresent;	// delete messages that are not present in the feed
 	guint		ttl;	// recommended update time
 	guint		ttl_multiply;	// how much we multiyply ttl value (minutes)
 	guint		update;	// feed update method global; ttl; disabled
@@ -323,18 +326,38 @@ typedef struct _rfMessage rfMessage;
 guint ftotal;
 guint farticle;
 
-void compare_enabled(gpointer key, gpointer value, guint *data);
+void compare_enabled(
+	gpointer key,
+	gpointer value,
+	guint *data);
 guint rss_find_enabled(void);
 void error_destroy(GtkObject *o, void *data);
-void error_response(GtkObject *o, int button, void *data);
+void error_response(
+	GtkObject *o,
+	int button,
+	void *data);
 void cancel_active_op(gpointer key);
-void browser_write(gchar *string, gint length, gchar *base);
-void user_pass_cb(RSS_AUTH *auth_info, gint response, GtkDialog *dialog);
-gboolean proxy_auth_dialog(gchar *title, gchar *user, gchar *pass);
+void browser_write(
+	gchar *string,
+	gint length,
+	gchar *base);
+void user_pass_cb(
+	RSS_AUTH *auth_info,
+	gint response,
+	GtkDialog *dialog);
+
+gboolean proxy_auth_dialog(
+	gchar *title,
+	gchar *user,
+	gchar *pass);
+
 gboolean timeout_soup(void);
 void network_timeout(void);
 gchar *feed_to_xml(gchar *key);
-void prepare_feed(gpointer key, gpointer value, gpointer user_data);
+void prepare_feed(
+	gpointer key,
+	gpointer value,
+	gpointer user_data);
 gboolean feed_new_from_xml(char *xml);
 char *feeds_uid_from_xml (const char *xml);
 void load_gconf_feed(void);
@@ -342,7 +365,9 @@ void migrate_old_config(gchar *feed_file);
 guint read_feeds(rssfeed *rf);
 void reload_cb (GtkWidget *button, gpointer data);
 void gecko_set_preferences(void);
-void browser_copy_selection(GtkWidget *widget, gpointer data);
+void browser_copy_selection(
+	GtkWidget *widget,
+	gpointer data);
 void browser_select_all(GtkWidget *widget, gpointer data);
 void webkit_set_preferences(void);
 #ifdef HAVE_WEBKIT
@@ -359,15 +384,24 @@ webkit_click (
 	gpointer user_data);
 #endif
 GtkDialog* create_user_pass_dialog(RSS_AUTH *auth);
-void err_destroy (GtkWidget *widget, guint response, gpointer data);
+void err_destroy (
+	GtkWidget *widget,
+	guint response,
+	gpointer data);
 void save_gconf_feed(void);
-void rss_error(gpointer key, gchar *name, gchar *error, gchar *emsg);
+void rss_error(
+	gpointer key,
+	gchar *name,
+	gchar *error,
+	gchar *emsg);
 void rss_select_folder(gchar *folder_name);
 gchar *lookup_chn_name_by_url(gchar *url);
 gboolean update_articles(gboolean disabler);
 gchar *lookup_main_folder(void);
 gchar *lookup_feed_folder(gchar *folder);
-gchar *lookup_original_folder(gchar *folder, gboolean *found);
+gchar *lookup_original_folder(
+	gchar *folder,
+	gboolean *found);
 gchar *decode_utf8_entities(gchar *str);
 gchar *decode_html_entities(gchar *str);
 gchar *get_real_channel_name(gchar *uri, gchar *failed);
@@ -389,19 +423,28 @@ void
 #if LIBSOUP_VERSION < 2003000
 finish_website (SoupMessage *msg, gpointer user_data);
 #else
-finish_website (SoupSession *soup_sess, SoupMessage *msg, gpointer user_data);
+finish_website (
+	SoupSession *soup_sess,
+	SoupMessage *msg,
+	gpointer user_data);
 #endif
 void
 #if LIBSOUP_VERSION < 2003000
 finish_enclosure (SoupMessage *msg, create_feed *user_data);
 #else
-finish_enclosure (SoupSession *soup_sess, SoupMessage *msg, create_feed *user_data);
+finish_enclosure (
+	SoupSession *soup_sess,
+	SoupMessage *msg,
+	create_feed *user_data);
 #endif
 void
 #if LIBSOUP_VERSION < 2003000
 finish_feed (SoupMessage *msg, gpointer user_data);
 #else
-finish_feed (SoupSession *soup_sess, SoupMessage *msg, gpointer user_data);
+finish_feed (
+	SoupSession *soup_sess,
+	SoupMessage *msg,
+	gpointer user_data);
 #endif
 void generic_finish_feed(rfMessage *msg, gpointer user_data);
 void textcb(
@@ -416,8 +459,14 @@ void download_chunk(
 #ifdef HAVE_GECKO
 void rss_mozilla_init(void);
 #endif
-void write_feeds_folder_line(gpointer key, gpointer value, FILE *file);
-void populate_reversed(gpointer key, gpointer value, GHashTable *hash);
+void write_feeds_folder_line(
+	gpointer key,
+	gpointer value,
+	FILE *file);
+void populate_reversed(
+	gpointer key,
+	gpointer value,
+	GHashTable *hash);
 gchar *rss_component_peek_base_directory(void);
 CamelStore *rss_component_peek_local_store(void);
 void custom_feed_timeout(void);
@@ -435,7 +484,10 @@ void
 #if LIBSOUP_VERSION < 2003000
 finish_update_feed_image (SoupMessage *msg, gpointer user_data);
 #else
-finish_update_feed_image (SoupSession *soup_sess, SoupMessage *msg, gpointer user_data);
+finish_update_feed_image (
+	SoupSession *soup_sess,
+	SoupMessage *msg,
+	gpointer user_data);
 #endif
 //#if EVOLUTION_VERSION >= 22900
 void get_shell(void *ep, ESEventTargetShell *t);
@@ -447,7 +499,10 @@ void update_main_folder(gchar *new_name);
 void search_rebase(gpointer key, gpointer value, gchar *oname);
 void gtkut_window_popup(GtkWidget *window);
 void flaten_status(gpointer msg, gpointer user_data);
-gboolean check_if_enabled (gpointer key, gpointer value, gpointer user_data);
+gboolean check_if_enabled (
+	gpointer key,
+	gpointer value,
+	gpointer user_data);
 void free_filter_uids (gpointer user_data, GObject *ex_msg);
 #if EVOLUTION_VERSION >= 22900
 void quit_cb(void *ep, EShellView *shell_view);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]