X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=backend%2Fpdf%2Fev-poppler.cc;h=f96fdd423399607ffa8bcf98a22bacf85940424d;hb=7172457c057ce9ec6011866e055f9c5ce6e284f2;hp=2068998ecded64b76070ec760f8db0379cbd074b;hpb=13a06349251874bd35d2f03c3fc93217cee749a2;p=evince.git diff --git a/backend/pdf/ev-poppler.cc b/backend/pdf/ev-poppler.cc index 2068998e..f96fdd42 100644 --- a/backend/pdf/ev-poppler.cc +++ b/backend/pdf/ev-poppler.cc @@ -19,6 +19,10 @@ #include "config.h" +#ifdef HAVE_POPPLER_FORM_FIELD_BUTTON_GET_BUTTON_TYPE +#define HAVE_FORMS +#endif + #include #include #include @@ -40,6 +44,7 @@ #include "ev-document-security.h" #include "ev-document-thumbnails.h" #include "ev-document-transition.h" +#include "ev-document-forms.h" #include "ev-selection.h" #include "ev-attachment.h" #include "ev-image.h" @@ -86,14 +91,14 @@ static void pdf_document_security_iface_init (EvDocumentSecurityIface static void pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface); static void pdf_document_document_links_iface_init (EvDocumentLinksIface *iface); static void pdf_document_document_images_iface_init (EvDocumentImagesIface *iface); +static void pdf_document_document_forms_iface_init (EvDocumentFormsIface *iface); static void pdf_document_document_fonts_iface_init (EvDocumentFontsIface *iface); static void pdf_document_find_iface_init (EvDocumentFindIface *iface); static void pdf_document_file_exporter_iface_init (EvFileExporterIface *iface); static void pdf_selection_iface_init (EvSelectionIface *iface); static void pdf_document_page_transition_iface_init (EvDocumentTransitionIface *iface); static void pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails, - gint page, - gint size, + EvRenderContext *rc, gint *width, gint *height); static int pdf_document_get_n_pages (EvDocument *document); @@ -105,7 +110,6 @@ static EvLink *ev_link_from_action (PdfDocument *pdf_document, static void pdf_document_search_free (PdfDocumentSearch *search); static void pdf_print_context_free (PdfPrintContext *ctx); - G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT, { G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT, @@ -118,6 +122,10 @@ G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT, pdf_document_document_links_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_IMAGES, pdf_document_document_images_iface_init); +#ifdef HAVE_FORMS + G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FORMS, + pdf_document_document_forms_iface_init); +#endif /* HAVE_FORMS */ G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FONTS, pdf_document_document_fonts_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FIND, @@ -191,6 +199,8 @@ pdf_document_dispose (GObject *object) if (pdf_document->fonts_iter) { poppler_fonts_iter_free (pdf_document->fonts_iter); } + + G_OBJECT_CLASS (pdf_document_parent_class)->dispose (object); } static void @@ -425,12 +435,12 @@ pdf_document_get_attachments (EvDocument *document) return g_list_reverse (retval); } -static GdkPixbuf * -pdf_document_render_pixbuf (EvDocument *document, - EvRenderContext *rc) +static cairo_surface_t * +pdf_document_render (EvDocument *document, + EvRenderContext *rc) { PdfDocument *pdf_document; - GdkPixbuf *pixbuf; + cairo_surface_t *surface; double width_points, height_points; gint width, height; @@ -448,6 +458,36 @@ pdf_document_render_pixbuf (EvDocument *document, height = (int) ((height_points * rc->scale) + 0.5); } +#ifdef HAVE_POPPLER_PAGE_RENDER + cairo_t *cr; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + width, height); + memset (cairo_image_surface_get_data (surface), 0xff, + cairo_image_surface_get_height (surface) * + cairo_image_surface_get_stride (surface)); + + cr = cairo_create (surface); + switch (rc->rotation) { + case 90: + cairo_translate (cr, width, 0); + break; + case 180: + cairo_translate (cr, width, height); + break; + case 270: + cairo_translate (cr, 0, height); + break; + default: + cairo_translate (cr, 0, 0); + } + cairo_scale (cr, rc->scale, rc->scale); + cairo_rotate (cr, rc->rotation * G_PI / 180.0); + poppler_page_render (POPPLER_PAGE (rc->data), cr); + cairo_destroy (cr); +#else /* HAVE_POPPLER_PAGE_RENDER */ + GdkPixbuf *pixbuf; + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height); @@ -458,9 +498,11 @@ pdf_document_render_pixbuf (EvDocument *document, rc->scale, rc->rotation, pixbuf); - - - return pixbuf; + surface = ev_document_misc_surface_from_pixbuf (pixbuf); + g_object_unref (pixbuf); +#endif /* HAVE_POPPLER_PAGE_RENDER */ + + return surface; } /* EvDocumentSecurity */ @@ -670,7 +712,7 @@ pdf_document_document_iface_init (EvDocumentIface *iface) iface->get_page_label = pdf_document_get_page_label; iface->has_attachments = pdf_document_has_attachments; iface->get_attachments = pdf_document_get_attachments; - iface->render_pixbuf = pdf_document_render_pixbuf; + iface->render = pdf_document_render; iface->get_text = pdf_document_get_text; iface->can_get_text = pdf_document_can_get_text; iface->get_info = pdf_document_get_info; @@ -1052,7 +1094,8 @@ pdf_document_links_get_links_model (EvDocumentLinks *document_links) model = (GtkTreeModel *) gtk_tree_store_new (EV_DOCUMENT_LINKS_COLUMN_NUM_COLUMNS, G_TYPE_STRING, G_TYPE_OBJECT, - G_TYPE_BOOLEAN); + G_TYPE_BOOLEAN, + G_TYPE_STRING); build_tree (pdf_document, model, NULL, iter); poppler_index_iter_free (iter); } @@ -1133,7 +1176,6 @@ pdf_document_images_get_images (EvDocumentImages *document_images, gint page) { GList *retval = NULL; -#ifdef HAVE_POPPLER_PAGE_GET_IMAGE_MAPPING PdfDocument *pdf_document; PopplerPage *poppler_page; GList *mapping_list; @@ -1162,7 +1204,7 @@ pdf_document_images_get_images (EvDocumentImages *document_images, poppler_page_free_image_mapping (mapping_list); g_object_unref (poppler_page); -#endif /* HAVE_POPPLER_PAGE_GET_IMAGE_MAPPING */ + return retval; } @@ -1173,32 +1215,15 @@ pdf_document_document_images_iface_init (EvDocumentImagesIface *iface) } static GdkPixbuf * -make_thumbnail_for_size (PdfDocument *pdf_document, - gint page, - int rotation, - gint size) +make_thumbnail_for_page (PdfDocument *pdf_document, + PopplerPage *poppler_page, + EvRenderContext *rc) { - PopplerPage *poppler_page; GdkPixbuf *pixbuf; int width, height; - double scale; - gdouble unscaled_width, unscaled_height; - - poppler_page = poppler_document_get_page (pdf_document->document, page); - g_return_val_if_fail (poppler_page != NULL, NULL); - pdf_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (pdf_document), page, - size, &width, &height); - poppler_page_get_size (poppler_page, &unscaled_width, &unscaled_height); - scale = width / unscaled_width; - - /* rotate */ - if (rotation == 90 || rotation == 270) { - int temp; - temp = width; - width = height; - height = temp; - } + pdf_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (pdf_document), + rc, &width, &height); pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height); @@ -1207,20 +1232,15 @@ make_thumbnail_for_size (PdfDocument *pdf_document, ev_document_fc_mutex_lock (); poppler_page_render_to_pixbuf (poppler_page, 0, 0, width, height, - scale, rotation, pixbuf); + rc->scale, rc->rotation, pixbuf); ev_document_fc_mutex_unlock (); - - - g_object_unref (poppler_page); return pixbuf; } static GdkPixbuf * pdf_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails, - gint page, - gint rotation, - gint size, + EvRenderContext *rc, gboolean border) { PdfDocument *pdf_document; @@ -1230,18 +1250,17 @@ pdf_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails pdf_document = PDF_DOCUMENT (document_thumbnails); - poppler_page = poppler_document_get_page (pdf_document->document, page); + poppler_page = poppler_document_get_page (pdf_document->document, rc->page); g_return_val_if_fail (poppler_page != NULL, NULL); pixbuf = poppler_page_get_thumbnail (poppler_page); - - if (pixbuf == NULL) { + if (!pixbuf) { /* There is no provided thumbnail. We need to make one. */ - pixbuf = make_thumbnail_for_size (pdf_document, page, rotation, size); + pixbuf = make_thumbnail_for_page (pdf_document, poppler_page, rc); } if (border) { - border_pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, rotation, pixbuf); + border_pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, pixbuf); g_object_unref (pixbuf); pixbuf = border_pixbuf; } @@ -1253,8 +1272,7 @@ pdf_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails static void pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails, - gint page, - gint size, + EvRenderContext *rc, gint *width, gint *height) { @@ -1263,10 +1281,8 @@ pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnail gint has_thumb; pdf_document = PDF_DOCUMENT (document_thumbnails); - poppler_page = poppler_document_get_page (pdf_document->document, page); + poppler_page = poppler_document_get_page (pdf_document->document, rc->page); - g_return_if_fail (width != NULL); - g_return_if_fail (height != NULL); g_return_if_fail (poppler_page != NULL); has_thumb = poppler_page_get_thumbnail_size (poppler_page, width, height); @@ -1275,9 +1291,19 @@ pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnail double page_width, page_height; poppler_page_get_size (poppler_page, &page_width, &page_height); - *width = size; - *height = (int) (size * page_height / page_width); + + *width = (gint) MAX (page_width * rc->scale, 1); + *height = (gint) MAX (page_height * rc->scale, 1); + } + + if (rc->rotation == 90 || rc->rotation == 270) { + gint temp; + + temp = *width; + *width = *height; + *height = temp; } + g_object_unref (poppler_page); } @@ -1576,11 +1602,15 @@ pdf_document_file_exporter_do_page (EvFileExporter *exporter, EvRenderContext *r poppler_page_render_to_ps (poppler_page, ctx->ps_file); break; case EV_FILE_FORMAT_PDF: +#ifdef HAVE_CAIRO_PDF + cairo_save (ctx->pdf_cairo); +#endif #ifdef HAVE_POPPLER_PAGE_RENDER poppler_page_render (poppler_page, ctx->pdf_cairo); #endif #ifdef HAVE_CAIRO_PDF cairo_show_page (ctx->pdf_cairo); + cairo_restore (ctx->pdf_cairo); #endif break; default: @@ -1611,11 +1641,11 @@ pdf_document_file_exporter_iface_init (EvFileExporterIface *iface) static void pdf_selection_render_selection (EvSelection *selection, EvRenderContext *rc, - GdkPixbuf **pixbuf, + cairo_surface_t **surface, EvRectangle *points, EvRectangle *old_points, - GdkColor *text, - GdkColor *base) + GdkColor *text, + GdkColor *base) { PdfDocument *pdf_document; double width_points, height_points; @@ -1624,22 +1654,54 @@ pdf_selection_render_selection (EvSelection *selection, pdf_document = PDF_DOCUMENT (selection); set_rc_data (pdf_document, rc); - poppler_page_get_size (POPPLER_PAGE (rc->data), &width_points, &height_points); + poppler_page_get_size (POPPLER_PAGE (rc->data), + &width_points, &height_points); width = (int) ((width_points * rc->scale) + 0.5); height = (int) ((height_points * rc->scale) + 0.5); - if (*pixbuf == NULL) { - * pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, - TRUE, 8, - width, height); + +#ifdef HAVE_POPPLER_PAGE_RENDER + cairo_t *cr; + + if (*surface == NULL) { + *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + width, height); + } - + + cr = cairo_create (*surface); + cairo_scale (cr, rc->scale, rc->scale); + cairo_surface_set_device_offset (*surface, 0, 0); + memset (cairo_image_surface_get_data (*surface), 0x00, + cairo_image_surface_get_height (*surface) * + cairo_image_surface_get_stride (*surface)); poppler_page_render_selection (POPPLER_PAGE (rc->data), - rc->scale, rc->rotation, *pixbuf, + cr, (PopplerRectangle *)points, (PopplerRectangle *)old_points, + POPPLER_SELECTION_NORMAL, /* SelectionStyle */ text, base); + cairo_destroy (cr); +#else /* HAVE_POPPLER_PAGE_RENDER */ + GdkPixbuf *pixbuf; + + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, + TRUE, 8, + width, height); + + poppler_page_render_selection_to_pixbuf (POPPLER_PAGE (rc->data), + rc->scale, rc->rotation, pixbuf, + (PopplerRectangle *)points, + (PopplerRectangle *)old_points, + POPPLER_SELECTION_NORMAL, /* SelectionStyle */ + text, + base); + if (*surface) + cairo_surface_destroy (*surface); + *surface = ev_document_misc_surface_from_pixbuf (pixbuf); + g_object_unref (pixbuf); +#endif /* HAVE_POPPLER_PAGE_RENDER */ } @@ -1655,8 +1717,9 @@ pdf_selection_get_selection_region (EvSelection *selection, set_rc_data (pdf_document, rc); - retval = poppler_page_get_selection_region ((PopplerPage *)rc->data, rc->scale, (PopplerRectangle *) points); - + retval = poppler_page_get_selection_region ((PopplerPage *)rc->data, + rc->scale, + (PopplerRectangle *) points); return retval; } @@ -1695,7 +1758,6 @@ static gdouble pdf_document_get_page_duration (EvDocumentTransition *trans, gint page) { -#ifdef HAVE_POPPLER_PAGE_GET_DURATION PdfDocument *pdf_document; PopplerPage *poppler_page; gdouble duration = -1; @@ -1709,9 +1771,6 @@ pdf_document_get_page_duration (EvDocumentTransition *trans, g_object_unref (poppler_page); return duration; -#else - return -1; -#endif /* HAVE_POPPLER_PAGE_GET_DURATION */ } static void @@ -1725,3 +1784,393 @@ pdf_document_new (void) { return PDF_DOCUMENT (g_object_new (PDF_TYPE_DOCUMENT, NULL)); } + +/* Forms */ +static void +pdf_document_get_crop_box (EvDocument *document, + int page, + EvRectangle *rect) +{ + PdfDocument *pdf_document; + PopplerPage *poppler_page; + PopplerRectangle poppler_rect; + + pdf_document = PDF_DOCUMENT (document); + poppler_page = poppler_document_get_page (pdf_document->document, page); + poppler_page_get_crop_box (poppler_page, &poppler_rect); + rect->x1 = poppler_rect.x1; + rect->x2 = poppler_rect.x2; + rect->y1 = poppler_rect.y1; + rect->y2 = poppler_rect.y2; +} + +#ifdef HAVE_FORMS +static EvFormField * +ev_form_field_from_poppler_field (PopplerFormField *poppler_field) +{ + EvFormField *ev_field = NULL; + gint id; + gdouble font_size; + gboolean is_read_only; + + id = poppler_form_field_get_id (poppler_field); + font_size = poppler_form_field_get_font_size (poppler_field); + is_read_only = poppler_form_field_is_read_only (poppler_field); + + switch (poppler_form_field_get_field_type (poppler_field)) { + case POPPLER_FORM_FIELD_TEXT: { + EvFormFieldText *field_text; + EvFormFieldTextType ev_text_type = EV_FORM_FIELD_TEXT_NORMAL; + + switch (poppler_form_field_text_get_text_type (poppler_field)) { + case POPPLER_FORM_TEXT_NORMAL: + ev_text_type = EV_FORM_FIELD_TEXT_NORMAL; + break; + case POPPLER_FORM_TEXT_MULTILINE: + ev_text_type = EV_FORM_FIELD_TEXT_MULTILINE; + break; + case POPPLER_FORM_TEXT_FILE_SELECT: + ev_text_type = EV_FORM_FIELD_TEXT_FILE_SELECT; + break; + } + + ev_field = ev_form_field_text_new (id, ev_text_type); + field_text = EV_FORM_FIELD_TEXT (ev_field); + + field_text->do_spell_check = poppler_form_field_text_do_spell_check (poppler_field); + field_text->do_scroll = poppler_form_field_text_do_scroll (poppler_field); + field_text->is_rich_text = poppler_form_field_text_is_rich_text (poppler_field); + field_text->is_password = poppler_form_field_text_is_password (poppler_field); + +#ifdef HAVE_POPPLER_FORM_FIELD_TEXT_GET_MAX_LEN + field_text->max_len = poppler_form_field_text_get_max_len (poppler_field); +#endif + field_text->text = poppler_form_field_text_get_text (poppler_field); + + } + break; + case POPPLER_FORM_FIELD_BUTTON: { + EvFormFieldButton *field_button; + EvFormFieldButtonType ev_button_type = EV_FORM_FIELD_BUTTON_PUSH; + + switch (poppler_form_field_button_get_button_type (poppler_field)) { + case POPPLER_FORM_BUTTON_PUSH: + ev_button_type = EV_FORM_FIELD_BUTTON_PUSH; + break; + case POPPLER_FORM_BUTTON_CHECK: + ev_button_type = EV_FORM_FIELD_BUTTON_CHECK; + break; + case POPPLER_FORM_BUTTON_RADIO: + ev_button_type = EV_FORM_FIELD_BUTTON_RADIO; + break; + } + + ev_field = ev_form_field_button_new (id, ev_button_type); + field_button = EV_FORM_FIELD_BUTTON (ev_field); + + field_button->state = poppler_form_field_button_get_state (poppler_field); + } + break; + case POPPLER_FORM_FIELD_CHOICE: { + EvFormFieldChoice *field_choice; + EvFormFieldChoiceType ev_choice_type = EV_FORM_FIELD_CHOICE_COMBO; + + switch (poppler_form_field_choice_get_choice_type (poppler_field)) { + case POPPLER_FORM_CHOICE_COMBO: + ev_choice_type = EV_FORM_FIELD_CHOICE_COMBO; + break; + case EV_FORM_FIELD_CHOICE_LIST: + ev_choice_type = EV_FORM_FIELD_CHOICE_LIST; + break; + } + + ev_field = ev_form_field_choice_new (id, ev_choice_type); + field_choice = EV_FORM_FIELD_CHOICE (ev_field); + + field_choice->is_editable = poppler_form_field_choice_is_editable (poppler_field); + field_choice->multi_select = poppler_form_field_choice_can_select_multiple (poppler_field); + field_choice->do_spell_check = poppler_form_field_choice_do_spell_check (poppler_field); + field_choice->commit_on_sel_change = poppler_form_field_choice_commit_on_change (poppler_field); + + /* TODO: we need poppler_form_field_choice_get_selected_items in poppler + field_choice->selected_items = poppler_form_field_choice_get_selected_items (poppler_field);*/ + if (field_choice->is_editable) + field_choice->text = poppler_form_field_choice_get_text (poppler_field); + } + break; + case POPPLER_FORM_FIELD_SIGNATURE: + /* TODO */ + ev_field = ev_form_field_signature_new (id); + break; + case POPPLER_FORM_FIELD_UNKNOWN: + break; + } + + ev_field->font_size = font_size; + ev_field->is_read_only = is_read_only; + + return ev_field; +} + +static GList * +pdf_document_forms_get_form_fields (EvDocumentForms *document, + gint page) +{ + PdfDocument *pdf_document; + PopplerPage *poppler_page; + GList *retval = NULL; + GList *fields; + GList *list; + double height; + + + pdf_document = PDF_DOCUMENT (document); + poppler_page = poppler_document_get_page (pdf_document->document, page); + fields = poppler_page_get_form_field_mapping (poppler_page); + poppler_page_get_size (poppler_page, NULL, &height); + + for (list = fields; list; list = list->next) { + PopplerFormFieldMapping *mapping; + EvFormFieldMapping *field_mapping; + + mapping = (PopplerFormFieldMapping *)list->data; + + field_mapping = g_new0 (EvFormFieldMapping, 1); + field_mapping->x1 = mapping->area.x1; + field_mapping->x2 = mapping->area.x2; + field_mapping->y1 = height - mapping->area.y2; + field_mapping->y2 = height - mapping->area.y1; + field_mapping->field = ev_form_field_from_poppler_field (mapping->field); + field_mapping->field->page = page; + + retval = g_list_prepend (retval, field_mapping); + } + poppler_page_free_form_field_mapping (fields); + g_object_unref (poppler_page); + + return g_list_reverse (retval); +} + +static gchar * +pdf_document_forms_form_field_text_get_text (EvDocumentForms *document, + EvFormField *field) + +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + gchar *text; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return NULL; + + text = poppler_form_field_text_get_text (poppler_field); + g_object_unref (poppler_field); + + return text; +} + +static void +pdf_document_forms_form_field_text_set_text (EvDocumentForms *document, + EvFormField *field, + const gchar *text) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return; + poppler_form_field_text_set_text (poppler_field, text); + g_object_unref (poppler_field); +} + +static void +pdf_document_forms_form_field_button_set_state (EvDocumentForms *document, + EvFormField *field, + gboolean state) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return; + + poppler_form_field_button_set_state (poppler_field, state); + g_object_unref (poppler_field); +} + +static gboolean +pdf_document_forms_form_field_button_get_state (EvDocumentForms *document, + EvFormField *field) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + gboolean state; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return FALSE; + + state = poppler_form_field_button_get_state (poppler_field); + g_object_unref (poppler_field); + + return state; +} + +static gchar * +pdf_document_forms_form_field_choice_get_item (EvDocumentForms *document, + EvFormField *field, + gint index) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + gchar *text; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return NULL; + + text = poppler_form_field_choice_get_item (poppler_field, index); + g_object_unref (poppler_field); + + return text; +} + +static int +pdf_document_forms_form_field_choice_get_n_items (EvDocumentForms *document, + EvFormField *field) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + gint n_items; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return -1; + + n_items = poppler_form_field_choice_get_n_items (poppler_field); + g_object_unref (poppler_field); + + return n_items; +} + +static gboolean +pdf_document_forms_form_field_choice_is_item_selected (EvDocumentForms *document, + EvFormField *field, + gint index) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + gboolean selected; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return FALSE; + + selected = poppler_form_field_choice_is_item_selected (poppler_field, index); + g_object_unref (poppler_field); + + return selected; +} + +static void +pdf_document_forms_form_field_choice_select_item (EvDocumentForms *document, + EvFormField *field, + gint index) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return; + + poppler_form_field_choice_select_item (poppler_field, index); + g_object_unref (poppler_field); +} + +static void +pdf_document_forms_form_field_choice_toggle_item (EvDocumentForms *document, + EvFormField *field, + gint index) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return; + + poppler_form_field_choice_toggle_item (poppler_field, index); + g_object_unref (poppler_field); +} + +static void +pdf_document_forms_form_field_choice_unselect_all (EvDocumentForms *document, + EvFormField *field) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return; + + poppler_form_field_choice_unselect_all (poppler_field); + g_object_unref (poppler_field); +} + +static void +pdf_document_forms_form_field_choice_set_text (EvDocumentForms *document, + EvFormField *field, + const gchar *text) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return; + + poppler_form_field_choice_set_text (poppler_field, text); + g_object_unref (poppler_field); +} + +static gchar * +pdf_document_forms_form_field_choice_get_text (EvDocumentForms *document, + EvFormField *field) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + PopplerFormField *poppler_field; + gchar *text; + + poppler_field = poppler_document_get_form_field (pdf_document->document, field->id); + if (!poppler_field) + return NULL; + + text = poppler_form_field_choice_get_text (poppler_field); + g_object_unref (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; +} +#endif /* HAVE_FORMS */