X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-view.c;h=d02d885032191c38bc90d00310cde2a66a9669b1;hb=479ac9953cc364161b7ec1541e6234223079d988;hp=f46f1652c577d24a935e557a96b4f7706b9d4fb4;hpb=1923aac54c1e2e100187d7556dedb85866035146;p=evince.git diff --git a/shell/ev-view.c b/shell/ev-view.c index f46f1652..d02d8850 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -231,6 +231,7 @@ static void find_changed_cb (EvDocument 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, @@ -1598,6 +1599,24 @@ ev_view_get_form_field_at_location (EvView *view, 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) { @@ -1618,25 +1637,70 @@ ev_view_form_field_button_create_widget (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; } @@ -1647,18 +1711,26 @@ ev_view_form_field_text_save (EvView *view, { 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); } } @@ -1702,12 +1774,10 @@ ev_view_form_field_text_create_widget (EvView *view, 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); @@ -1726,7 +1796,7 @@ ev_view_form_field_text_create_widget (EvView *view, 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); @@ -1752,11 +1822,17 @@ ev_view_form_field_choice_save (EvView *view, { 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), @@ -1771,9 +1847,11 @@ ev_view_form_field_choice_save (EvView *view, } field->changed = FALSE; ev_pixbuf_cache_reload_page (view->pixbuf_cache, + field_region, field->page, view->rotation, view->scale); + gdk_region_destroy (field_region); } } @@ -3895,9 +3973,15 @@ find_changed_cb (EvDocument *document, int page, EvView *view) 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