+
+static gboolean
+refilter_idle_handler (gpointer userdata)
+{
+ ModestHeaderView *self = MODEST_HEADER_VIEW (userdata);
+ ModestHeaderViewPrivate *priv;
+ GtkTreeModel *filter_model;
+ GtkTreeModel *filtered_model;
+ gint i;
+ gboolean has_more;
+
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE (self);
+ filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+ filtered_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
+
+ if (filtered_model != priv->filtered_model) {
+ priv->refilter_handler_id = 0;
+ priv->filtered_model = NULL;
+ return FALSE;
+ }
+
+ if (!gtk_tree_model_sort_iter_is_valid (GTK_TREE_MODEL_SORT (filtered_model), &(priv->refilter_iter))) {
+ priv->refilter_handler_id = 0;
+ priv->filtered_model = NULL;
+ modest_header_view_refilter_by_chunks (self);
+ return FALSE;
+ }
+
+ i = 0;
+ do {
+ GtkTreePath *path;
+ path = gtk_tree_model_get_path (priv->filtered_model, &(priv->refilter_iter));
+ gtk_tree_model_row_changed (priv->filtered_model, path, &(priv->refilter_iter));
+ gtk_tree_path_free (path);
+ i++;
+
+ has_more = gtk_tree_model_iter_next (priv->filtered_model, &(priv->refilter_iter));
+ } while (i < 100 && has_more);
+
+ if (has_more) {
+ return TRUE;
+ } else {
+ priv->filtered_model = NULL;
+ priv->refilter_handler_id = 0;
+ return FALSE;
+ }
+}
+
+static void
+modest_header_view_refilter_by_chunks (ModestHeaderView *self)
+{
+ ModestHeaderViewPrivate *priv;
+ GtkTreeModel *filter_model;
+
+ g_return_if_fail (MODEST_IS_HEADER_VIEW (self));
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE (self);
+
+ if (priv->refilter_handler_id > 0) {
+ g_source_remove (priv->refilter_handler_id);
+ priv->refilter_handler_id = 0;
+ }
+
+ filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+ priv->filtered_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
+
+ if (gtk_tree_model_get_iter_first (priv->filtered_model, &(priv->refilter_iter))) {
+ priv->refilter_handler_id = g_idle_add (refilter_idle_handler, self);
+ }
+}