+update_page_cache (EvPageAction *page, GParamSpec *pspec, EvPageActionWidget *proxy)
+{
+ EvPageCache *page_cache;
+ guint signal_id;
+
+ page_cache = page->priv->page_cache;
+
+ /* clear the old signal */
+ if (proxy->signal_id > 0 && proxy->page_cache)
+ g_signal_handler_disconnect (proxy->page_cache, proxy->signal_id);
+
+ if (page_cache != NULL) {
+ signal_id = g_signal_connect_object (page_cache,
+ "page-changed",
+ G_CALLBACK (page_changed_cb),
+ proxy, 0);
+ /* Set the initial value */
+ page_changed_cb (page_cache,
+ ev_page_cache_get_current_page (page_cache),
+ proxy);
+ } else {
+ /* Or clear the entry */
+ signal_id = 0;
+ page_changed_cb (NULL, 0, proxy);
+ }
+ ev_page_action_widget_set_page_cache (proxy, page_cache);
+ proxy->signal_id = signal_id;
+}
+
+static gboolean
+build_new_tree_cb (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ GtkTreeModel *filter_model = GTK_TREE_MODEL (data);
+ EvLink *link;
+
+ gtk_tree_model_get (model, iter,
+ EV_DOCUMENT_LINKS_COLUMN_LINK, &link,
+ -1);
+
+ if (link && ev_link_get_link_type (link) == EV_LINK_TYPE_PAGE) {
+ GtkTreeIter filter_iter;
+
+ gtk_list_store_append (GTK_LIST_STORE (filter_model), &filter_iter);
+ gtk_list_store_set (GTK_LIST_STORE (filter_model), &filter_iter,
+ 0, iter,
+ -1);
+ }
+
+ if (link)
+ g_object_unref (link);
+
+ return FALSE;
+}
+
+static GtkTreeModel *
+get_filter_model_from_model (GtkTreeModel *model)
+{
+ GtkTreeModel *filter_model;
+
+ filter_model =
+ (GtkTreeModel *) g_object_get_data (G_OBJECT (model), EPA_FILTER_MODEL_DATA);
+ if (filter_model == NULL) {
+ filter_model = (GtkTreeModel *) gtk_list_store_new (1, GTK_TYPE_TREE_ITER);
+
+ gtk_tree_model_foreach (model,
+ build_new_tree_cb,
+ filter_model);
+ g_object_set_data_full (G_OBJECT (model), EPA_FILTER_MODEL_DATA, filter_model, g_object_unref);
+ }
+
+ return filter_model;
+}
+
+static gboolean
+match_selected_cb (GtkEntryCompletion *completion,
+ GtkTreeModel *filter_model,
+ GtkTreeIter *filter_iter,
+ EvPageActionWidget *proxy)