int page,
EvView *view);
static void job_finished_cb (EvPixbufCache *pixbuf_cache,
+ GdkRegion *region,
EvView *view);
static void page_changed_cb (EvPageCache *page_cache,
int new_page,
return NULL;
}
+static GdkRegion *
+ev_view_form_field_get_region (EvView *view,
+ EvFormField *field)
+{
+ EvRectangle field_area;
+ GdkRectangle view_area;
+ GList *forms_mapping;
+
+ forms_mapping = ev_pixbuf_cache_get_form_field_mapping (view->pixbuf_cache,
+ field->page);
+ ev_form_field_mapping_get_area (forms_mapping, field, &field_area);
+ doc_rect_to_view_rect (view, field->page, &field_area, &view_area);
+ view_area.x -= view->scroll_x;
+ view_area.y -= view->scroll_y;
+
+ return gdk_region_rectangle (&view_area);
+}
+
static gboolean
ev_view_forms_remove_widgets (EvView *view)
{
EvFormField *field)
{
EvFormFieldButton *field_button = EV_FORM_FIELD_BUTTON (field);
+ GdkRegion *field_region = NULL;
switch (field_button->type) {
case EV_FORM_FIELD_BUTTON_PUSH:
- break;
- case EV_FORM_FIELD_BUTTON_CHECK:
- case EV_FORM_FIELD_BUTTON_RADIO: {
+ return NULL;
+ case EV_FORM_FIELD_BUTTON_CHECK: {
gboolean state;
+ field_region = ev_view_form_field_get_region (view, field);
+
state = ev_document_forms_form_field_button_get_state (EV_DOCUMENT_FORMS (view->document),
field);
ev_document_forms_form_field_button_set_state (EV_DOCUMENT_FORMS (view->document),
field, !state);
- ev_pixbuf_cache_reload_page (view->pixbuf_cache,
- field->page,
- view->rotation,
- view->scale);
+ }
+ break;
+
+ case EV_FORM_FIELD_BUTTON_RADIO: {
+ gboolean state;
+ GList *forms_mapping, *l;
+
+ state = ev_document_forms_form_field_button_get_state (EV_DOCUMENT_FORMS (view->document),
+ field);
+ if (state && field_button->state)
+ return NULL;
+
+ field_region = ev_view_form_field_get_region (view, field);
+
+ /* For radio buttons we need to update also the region for the
+ * current selected item
+ */
+ forms_mapping = ev_pixbuf_cache_get_form_field_mapping (view->pixbuf_cache,
+ field->page);
+ for (l = forms_mapping; l; l = g_list_next (l)) {
+ EvFormField *radio = ((EvFormFieldMapping *)(l->data))->field;
+ GdkRegion *radio_region;
+
+ if (radio->id == field->id)
+ continue;
+
+ /* FIXME: only buttons in the same group should be updated */
+ if (!EV_IS_FORM_FIELD_BUTTON (radio) ||
+ EV_FORM_FIELD_BUTTON (radio)->type != EV_FORM_FIELD_BUTTON_RADIO ||
+ EV_FORM_FIELD_BUTTON (radio)->state != TRUE)
+ continue;
+
+ radio_region = ev_view_form_field_get_region (view, radio);
+ gdk_region_union (field_region, radio_region);
+ gdk_region_destroy (radio_region);
+ }
+
+ ev_document_forms_form_field_button_set_state (EV_DOCUMENT_FORMS (view->document),
+ field, TRUE);
+ field_button->state = TRUE;
}
break;
}
+
+ ev_pixbuf_cache_reload_page (view->pixbuf_cache,
+ field_region,
+ field->page,
+ view->rotation,
+ view->scale);
+ gdk_region_destroy (field_region);
return NULL;
}
{
EvFormField *field;
+ if (!view->document)
+ return;
+
field = g_object_get_data (G_OBJECT (widget), "form-field");
if (field->changed) {
EvFormFieldText *field_text = EV_FORM_FIELD_TEXT (field);
+ GdkRegion *field_region;
+
+ field_region = ev_view_form_field_get_region (view, field);
ev_document_forms_form_field_text_set_text (EV_DOCUMENT_FORMS (view->document),
field, field_text->text);
field->changed = FALSE;
ev_pixbuf_cache_reload_page (view->pixbuf_cache,
+ field_region,
field->page,
view->rotation,
view->scale);
+ gdk_region_destroy (field_region);
}
}
case EV_FORM_FIELD_TEXT_FILE_SELECT:
/* TODO */
case EV_FORM_FIELD_TEXT_NORMAL:
- case EV_FORM_FIELD_TEXT_PASSWORD:
text = gtk_entry_new ();
gtk_entry_set_has_frame (GTK_ENTRY (text), FALSE);
gtk_entry_set_max_length (GTK_ENTRY (text), field_text->max_len);
- gtk_entry_set_visibility (GTK_ENTRY (text),
- !(field_text->type == EV_FORM_FIELD_TEXT_PASSWORD));
+ gtk_entry_set_visibility (GTK_ENTRY (text), !field_text->is_password);
if (txt) {
gtk_entry_set_text (GTK_ENTRY (text), txt);
text = gtk_text_view_new ();
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
-
+
if (txt) {
gtk_text_buffer_set_text (buffer, txt, -1);
g_free (txt);
{
EvFormField *field;
+ if (!view->document)
+ return;
+
field = g_object_get_data (G_OBJECT (widget), "form-field");
if (field->changed) {
GList *l;
EvFormFieldChoice *field_choice = EV_FORM_FIELD_CHOICE (field);
+ GdkRegion *field_region;
+
+ field_region = ev_view_form_field_get_region (view, field);
if (field_choice->is_editable) {
ev_document_forms_form_field_choice_set_text (EV_DOCUMENT_FORMS (view->document),
}
field->changed = FALSE;
ev_pixbuf_cache_reload_page (view->pixbuf_cache,
+ field_region,
field->page,
view->rotation,
view->scale);
+ gdk_region_destroy (field_region);
}
}
static void
job_finished_cb (EvPixbufCache *pixbuf_cache,
+ GdkRegion *region,
EvView *view)
{
- gtk_widget_queue_draw (GTK_WIDGET (view));
+ if (region) {
+ gdk_window_invalidate_region (view->layout.bin_window,
+ region, TRUE);
+ } else {
+ gtk_widget_queue_draw (GTK_WIDGET (view));
+ }
}
static void