+static void
+pdf_document_forms_form_field_button_set_state (EvDocumentForms *document,
+ EvFormField *field,
+ gboolean state)
+{
+ PopplerFormField *poppler_field;
+
+ poppler_field = POPPLER_FORM_FIELD (g_object_get_data (G_OBJECT (field), "poppler-field"));
+ if (!poppler_field)
+ return;
+
+ poppler_form_field_button_set_state (poppler_field, state);
+}
+
+static gboolean
+pdf_document_forms_form_field_button_get_state (EvDocumentForms *document,
+ EvFormField *field)
+{
+ PopplerFormField *poppler_field;
+ gboolean state;
+
+ poppler_field = POPPLER_FORM_FIELD (g_object_get_data (G_OBJECT (field), "poppler-field"));
+ if (!poppler_field)
+ return FALSE;
+
+ state = poppler_form_field_button_get_state (poppler_field);
+
+ return state;
+}
+
+static gchar *
+pdf_document_forms_form_field_choice_get_item (EvDocumentForms *document,
+ EvFormField *field,
+ gint index)
+{
+ PopplerFormField *poppler_field;
+ gchar *text;
+
+ poppler_field = POPPLER_FORM_FIELD (g_object_get_data (G_OBJECT (field), "poppler-field"));
+ if (!poppler_field)
+ return NULL;
+
+ text = poppler_form_field_choice_get_item (poppler_field, index);
+
+ return text;
+}
+
+static int
+pdf_document_forms_form_field_choice_get_n_items (EvDocumentForms *document,
+ EvFormField *field)
+{
+ PopplerFormField *poppler_field;
+ gint n_items;
+
+ poppler_field = POPPLER_FORM_FIELD (g_object_get_data (G_OBJECT (field), "poppler-field"));
+ if (!poppler_field)
+ return -1;
+
+ n_items = poppler_form_field_choice_get_n_items (poppler_field);
+
+ return n_items;
+}
+
+static gboolean
+pdf_document_forms_form_field_choice_is_item_selected (EvDocumentForms *document,
+ EvFormField *field,
+ gint index)
+{
+ PopplerFormField *poppler_field;
+ gboolean selected;
+
+ poppler_field = POPPLER_FORM_FIELD (g_object_get_data (G_OBJECT (field), "poppler-field"));
+ if (!poppler_field)
+ return FALSE;
+
+ selected = poppler_form_field_choice_is_item_selected (poppler_field, index);
+
+ return selected;
+}
+
+static void
+pdf_document_forms_form_field_choice_select_item (EvDocumentForms *document,
+ EvFormField *field,
+ gint index)
+{
+ PopplerFormField *poppler_field;
+
+ poppler_field = POPPLER_FORM_FIELD (g_object_get_data (G_OBJECT (field), "poppler-field"));
+ if (!poppler_field)
+ return;
+
+ poppler_form_field_choice_select_item (poppler_field, index);
+}
+
+static void
+pdf_document_forms_form_field_choice_toggle_item (EvDocumentForms *document,
+ EvFormField *field,
+ gint index)
+{
+ PopplerFormField *poppler_field;
+
+ poppler_field = POPPLER_FORM_FIELD (g_object_get_data (G_OBJECT (field), "poppler-field"));
+ if (!poppler_field)
+ return;
+
+ poppler_form_field_choice_toggle_item (poppler_field, index);
+}
+
+static void
+pdf_document_forms_form_field_choice_unselect_all (EvDocumentForms *document,
+ EvFormField *field)
+{
+ PopplerFormField *poppler_field;
+
+ poppler_field = POPPLER_FORM_FIELD (g_object_get_data (G_OBJECT (field), "poppler-field"));
+ if (!poppler_field)
+ return;
+
+ poppler_form_field_choice_unselect_all (poppler_field);
+}
+
+static void
+pdf_document_forms_form_field_choice_set_text (EvDocumentForms *document,
+ EvFormField *field,
+ const gchar *text)
+{
+ PopplerFormField *poppler_field;
+
+ poppler_field = POPPLER_FORM_FIELD (g_object_get_data (G_OBJECT (field), "poppler-field"));
+ if (!poppler_field)
+ return;
+
+ poppler_form_field_choice_set_text (poppler_field, text);
+}
+
+static gchar *
+pdf_document_forms_form_field_choice_get_text (EvDocumentForms *document,
+ EvFormField *field)
+{
+ PopplerFormField *poppler_field;
+ gchar *text;
+
+ poppler_field = POPPLER_FORM_FIELD (g_object_get_data (G_OBJECT (field), "poppler-field"));
+ if (!poppler_field)
+ return NULL;
+
+ text = poppler_form_field_choice_get_text (poppler_field);
+
+ return text;
+}
+
+static void
+pdf_document_document_forms_iface_init (EvDocumentFormsIface *iface)
+{
+ iface->get_form_fields = pdf_document_forms_get_form_fields;
+ iface->form_field_text_get_text = pdf_document_forms_form_field_text_get_text;
+ iface->form_field_text_set_text = pdf_document_forms_form_field_text_set_text;
+ iface->form_field_button_set_state = pdf_document_forms_form_field_button_set_state;
+ iface->form_field_button_get_state = pdf_document_forms_form_field_button_get_state;
+ iface->form_field_choice_get_item = pdf_document_forms_form_field_choice_get_item;
+ iface->form_field_choice_get_n_items = pdf_document_forms_form_field_choice_get_n_items;
+ iface->form_field_choice_is_item_selected = pdf_document_forms_form_field_choice_is_item_selected;
+ iface->form_field_choice_select_item = pdf_document_forms_form_field_choice_select_item;
+ iface->form_field_choice_toggle_item = pdf_document_forms_form_field_choice_toggle_item;
+ iface->form_field_choice_unselect_all = pdf_document_forms_form_field_choice_unselect_all;
+ iface->form_field_choice_set_text = pdf_document_forms_form_field_choice_set_text;
+ iface->form_field_choice_get_text = pdf_document_forms_form_field_choice_get_text;
+}
+
+/* Layers */
+static gboolean
+pdf_document_layers_has_layers (EvDocumentLayers *document)
+{
+#ifdef HAVE_POPPLER_LAYERS_ITER_NEW
+ PdfDocument *pdf_document = PDF_DOCUMENT (document);
+ PopplerLayersIter *iter;
+
+ iter = poppler_layers_iter_new (pdf_document->document);
+ if (!iter)
+ return FALSE;
+ poppler_layers_iter_free (iter);
+
+ return TRUE;
+#else
+ return FALSE;
+#endif /* HAVE_POPPLER_LAYERS_ITER_NEW */
+}
+
+#ifdef HAVE_POPPLER_LAYERS_ITER_NEW
+static void
+build_layers_tree (PdfDocument *pdf_document,
+ GtkTreeModel *model,
+ GtkTreeIter *parent,
+ PopplerLayersIter *iter)
+{
+ do {
+ GtkTreeIter tree_iter;
+ PopplerLayersIter *child;
+ PopplerLayer *layer;
+ EvLayer *ev_layer = NULL;
+ gboolean visible;
+ gchar *markup;
+ gint rb_group = 0;
+
+ layer = poppler_layers_iter_get_layer (iter);
+ if (layer) {
+ markup = g_markup_escape_text (poppler_layer_get_title (layer), -1);
+ visible = poppler_layer_is_visible (layer);
+ rb_group = poppler_layer_get_radio_button_group_id (layer);
+ pdf_document->layers = g_list_append (pdf_document->layers,
+ g_object_ref (layer));
+ ev_layer = ev_layer_new (g_list_length (pdf_document->layers) - 1,
+ poppler_layer_is_parent (layer),
+ rb_group);
+ } else {
+ gchar *title;
+
+ title = poppler_layers_iter_get_title (iter);
+ markup = g_markup_escape_text (title, -1);
+ g_free (title);
+
+ visible = FALSE;
+ layer = NULL;
+ }
+
+ gtk_tree_store_append (GTK_TREE_STORE (model), &tree_iter, parent);
+ gtk_tree_store_set (GTK_TREE_STORE (model), &tree_iter,
+ EV_DOCUMENT_LAYERS_COLUMN_TITLE, markup,
+ EV_DOCUMENT_LAYERS_COLUMN_VISIBLE, visible,
+ EV_DOCUMENT_LAYERS_COLUMN_ENABLED, TRUE, /* FIXME */
+ EV_DOCUMENT_LAYERS_COLUMN_SHOWTOGGLE, (layer != NULL),
+ EV_DOCUMENT_LAYERS_COLUMN_RBGROUP, rb_group,
+ EV_DOCUMENT_LAYERS_COLUMN_LAYER, ev_layer,
+ -1);
+ if (ev_layer)
+ g_object_unref (ev_layer);
+ g_free (markup);
+
+ child = poppler_layers_iter_get_child (iter);
+ if (child)
+ build_layers_tree (pdf_document, model, &tree_iter, child);
+ poppler_layers_iter_free (child);
+ } while (poppler_layers_iter_next (iter));
+}
+#endif /* HAVE_POPPLER_LAYERS_ITER_NEW */
+
+static GtkTreeModel *
+pdf_document_layers_get_layers (EvDocumentLayers *document)
+{
+ GtkTreeModel *model = NULL;
+#ifdef HAVE_POPPLER_LAYERS_ITER_NEW
+ PdfDocument *pdf_document = PDF_DOCUMENT (document);
+ PopplerLayersIter *iter;
+
+ iter = poppler_layers_iter_new (pdf_document->document);
+ if (iter) {
+ model = (GtkTreeModel *) gtk_tree_store_new (EV_DOCUMENT_LAYERS_N_COLUMNS,
+ G_TYPE_STRING, /* TITLE */
+ G_TYPE_OBJECT, /* LAYER */
+ G_TYPE_BOOLEAN, /* VISIBLE */
+ G_TYPE_BOOLEAN, /* ENABLED */
+ G_TYPE_BOOLEAN, /* SHOWTOGGLE */
+ G_TYPE_INT); /* RBGROUP */
+ build_layers_tree (pdf_document, model, NULL, iter);
+ poppler_layers_iter_free (iter);
+ }
+
+#endif
+ return model;
+}
+
+static void
+pdf_document_layers_show_layer (EvDocumentLayers *document,
+ EvLayer *layer)
+{
+#ifdef HAVE_POPPLER_LAYERS_ITER_NEW
+ PdfDocument *pdf_document = PDF_DOCUMENT (document);
+ guint layer_id = ev_layer_get_id (layer);
+
+ poppler_layer_show (POPPLER_LAYER (g_list_nth_data (pdf_document->layers, layer_id)));
+#else
+ return;
+#endif /* HAVE_POPPLER_LAYERS_ITER_NEW */
+}
+
+static void
+pdf_document_layers_hide_layer (EvDocumentLayers *document,
+ EvLayer *layer)
+{
+#ifdef HAVE_POPPLER_LAYERS_ITER_NEW
+ PdfDocument *pdf_document = PDF_DOCUMENT (document);
+ guint layer_id = ev_layer_get_id (layer);
+
+ poppler_layer_hide (POPPLER_LAYER (g_list_nth_data (pdf_document->layers, layer_id)));
+#else
+ return;
+#endif /* HAVE_POPPLER_LAYERS_ITER_NEW */
+}
+
+static gboolean
+pdf_document_layers_layer_is_visible (EvDocumentLayers *document,
+ EvLayer *layer)
+{
+#ifdef HAVE_POPPLER_LAYERS_ITER_NEW
+ PdfDocument *pdf_document = PDF_DOCUMENT (document);
+ guint layer_id = ev_layer_get_id (layer);
+
+ return poppler_layer_is_visible (POPPLER_LAYER (g_list_nth_data (pdf_document->layers, layer_id)));
+#else
+ return FALSE;
+#endif /* HAVE_POPPLER_LAYERS_ITER_NEW */
+}
+
+static void
+pdf_document_document_layers_iface_init (EvDocumentLayersIface *iface)