]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Updated Ukrainian translation.
[evince.git] / shell / ev-view.c
index 5d7df6b3a5f1b768e50aabe3f36448a82c45d02e..7fe99552eb4e3ea83c3c9cf6454bad465bcb0537 100644 (file)
@@ -42,6 +42,7 @@
 #define EV_IS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EV_TYPE_VIEW))
 #define EV_VIEW_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), EV_TYPE_VIEW, EvViewClass))
 
 #define EV_IS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EV_TYPE_VIEW))
 #define EV_VIEW_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), EV_TYPE_VIEW, EvViewClass))
 
+
 enum {
        PROP_0,
        PROP_STATUS,
 enum {
        PROP_0,
        PROP_STATUS,
@@ -86,6 +87,11 @@ typedef enum {
        EV_VIEW_CURSOR_DRAG
 } EvViewCursor;
 
        EV_VIEW_CURSOR_DRAG
 } EvViewCursor;
 
+typedef enum {
+       EV_VIEW_FIND_NEXT,
+       EV_VIEW_FIND_PREV
+} EvViewFindDirection;
+
 #define ZOOM_IN_FACTOR  1.2
 #define ZOOM_OUT_FACTOR (1.0/ZOOM_IN_FACTOR)
 
 #define ZOOM_IN_FACTOR  1.2
 #define ZOOM_OUT_FACTOR (1.0/ZOOM_IN_FACTOR)
 
@@ -230,8 +236,6 @@ static void       find_page_at_location                      (EvView
                                                              gint               *page,
                                                              gint               *x_offset,
                                                              gint               *y_offset);
                                                              gint               *page,
                                                              gint               *x_offset,
                                                              gint               *y_offset);
-static void       ev_view_queue_draw_page                    (EvView             *view,
-                                                             gint                page);
 
 /*** Hyperrefs ***/
 static EvLink*    get_link_at_location                       (EvView             *view,
 
 /*** Hyperrefs ***/
 static EvLink*    get_link_at_location                       (EvView             *view,
@@ -360,7 +364,8 @@ static void       ev_view_set_find_status                    (EvView
                                                              const char         *message);
 /*** Find ***/
 static void       jump_to_find_result                        (EvView             *view);
                                                              const char         *message);
 /*** Find ***/
 static void       jump_to_find_result                        (EvView             *view);
-static void       jump_to_find_page                          (EvView             *view);
+static void       jump_to_find_page                          (EvView             *view, 
+                                                             EvViewFindDirection direction);
 
 /*** Selection ***/
 static void       compute_selections                         (EvView             *view,
 
 /*** Selection ***/
 static void       compute_selections                         (EvView             *view,
@@ -483,6 +488,9 @@ view_set_adjustment_values (EvView         *view,
 static void
 view_update_range_and_current_page (EvView *view)
 {
 static void
 view_update_range_and_current_page (EvView *view)
 {
+       if (view->pending_scroll != SCROLL_TO_KEEP_POSITION)
+               return;
+
        /* Presentation trumps all other modes */
        if (view->presentation) {
                view->start_page = view->current_page;
        /* Presentation trumps all other modes */
        if (view->presentation) {
                view->start_page = view->current_page;
@@ -813,8 +821,8 @@ get_page_extents (EvView       *view,
                gint max_width;
                gint x, y;
 
                gint max_width;
                gint x, y;
 
-               ev_page_cache_get_max_width (view->page_cache, view->scale,
-                                            view->rotation, &max_width);
+               ev_page_cache_get_max_width (view->page_cache, view->rotation,
+                                            view->scale, &max_width);
                max_width = max_width + border->left + border->right;
                /* Get the location of the bounding box */
                if (view->dual_page) {
                max_width = max_width + border->left + border->right;
                /* Get the location of the bounding box */
                if (view->dual_page) {
@@ -997,14 +1005,6 @@ find_page_at_location (EvView  *view,
        *page = -1;
 }
 
        *page = -1;
 }
 
-static void
-ev_view_queue_draw_page (EvView *view,
-                        gint    page)
-{
-       /* FIXME: write */
-       gtk_widget_queue_draw (GTK_WIDGET (view));
-}
-
 static gboolean
 location_in_text (EvView  *view,
                  gdouble  x,
 static gboolean
 location_in_text (EvView  *view,
                  gdouble  x,
@@ -1566,6 +1566,28 @@ ev_view_button_release_event (GtkWidget      *widget,
        return FALSE;
 }
 
        return FALSE;
 }
 
+static gint
+ev_view_focus_in (GtkWidget     *widget,
+                 GdkEventFocus *event)
+{
+       if (EV_VIEW (widget)->pixbuf_cache)
+               ev_pixbuf_cache_style_changed (EV_VIEW (widget)->pixbuf_cache);
+       gtk_widget_queue_draw (widget);
+
+       return FALSE;
+}
+
+static gint
+ev_view_focus_out (GtkWidget     *widget,
+                    GdkEventFocus *event)
+{
+       if (EV_VIEW (widget)->pixbuf_cache)
+               ev_pixbuf_cache_style_changed (EV_VIEW (widget)->pixbuf_cache);
+       gtk_widget_queue_draw (widget);
+
+       return FALSE;
+}
+
 static gboolean
 ev_view_leave_notify_event (GtkWidget *widget, GdkEventCrossing   *event)
 {
 static gboolean
 ev_view_leave_notify_event (GtkWidget *widget, GdkEventCrossing   *event)
 {
@@ -1894,6 +1916,8 @@ ev_view_class_init (EvViewClass *class)
        widget_class->button_press_event = ev_view_button_press_event;
        widget_class->motion_notify_event = ev_view_motion_notify_event;
        widget_class->button_release_event = ev_view_button_release_event;
        widget_class->button_press_event = ev_view_button_press_event;
        widget_class->motion_notify_event = ev_view_motion_notify_event;
        widget_class->button_release_event = ev_view_button_release_event;
+       widget_class->focus_in_event = ev_view_focus_in;
+       widget_class->focus_out_event = ev_view_focus_out;
        widget_class->size_request = ev_view_size_request;
        widget_class->size_allocate = ev_view_size_allocate;
        widget_class->realize = ev_view_realize;
        widget_class->size_request = ev_view_size_request;
        widget_class->size_allocate = ev_view_size_allocate;
        widget_class->realize = ev_view_realize;
@@ -2035,7 +2059,7 @@ ev_view_init (EvView *view)
 static void
 find_changed_cb (EvDocument *document, int page, EvView *view)
 {
 static void
 find_changed_cb (EvDocument *document, int page, EvView *view)
 {
-       jump_to_find_page (view);
+       jump_to_find_page (view, EV_VIEW_FIND_NEXT);
        jump_to_find_result (view);
        update_find_status_message (view);
 
        jump_to_find_result (view);
        update_find_status_message (view);
 
@@ -2375,15 +2399,6 @@ ev_view_zoom_out (EvView *view)
        ev_view_set_zoom (view, ZOOM_OUT_FACTOR, TRUE);
 }
 
        ev_view_set_zoom (view, ZOOM_OUT_FACTOR, TRUE);
 }
 
-static void
-ev_view_set_rotation (EvView *view, int rotation)
-{
-       view->rotation = rotation;
-
-       ev_pixbuf_cache_clear (view->pixbuf_cache);
-       gtk_widget_queue_resize (GTK_WIDGET (view));
-}
-
 void
 ev_view_rotate_right (EvView *view)
 {
 void
 ev_view_rotate_right (EvView *view)
 {
@@ -2408,6 +2423,23 @@ ev_view_rotate_left (EvView *view)
        ev_view_set_rotation (view, rotation);
 }
 
        ev_view_set_rotation (view, rotation);
 }
 
+void
+ev_view_set_rotation (EvView *view, int rotation)
+{
+       view->rotation = rotation;
+
+       if (view->pixbuf_cache) {
+               ev_pixbuf_cache_clear (view->pixbuf_cache);
+               gtk_widget_queue_resize (GTK_WIDGET (view));
+       }
+}
+
+int
+ev_view_get_rotation (EvView *view)
+{
+       return view->rotation;
+}
+
 static double
 zoom_for_size_fit_width (int doc_width,
                         int doc_height,
 static double
 zoom_for_size_fit_width (int doc_width,
                         int doc_height,
@@ -2738,7 +2770,7 @@ jump_to_find_result (EvView *view)
 
        n_results = ev_document_find_get_n_results (find, page);
 
 
        n_results = ev_document_find_get_n_results (find, page);
 
-       if (n_results > view->find_result) {
+       if (n_results > 0  && view->find_result < n_results) {
                ev_document_find_get_result
                        (find, page, view->find_result, &rect);
 
                ev_document_find_get_result
                        (find, page, view->find_result, &rect);
 
@@ -2748,7 +2780,7 @@ jump_to_find_result (EvView *view)
 }
 
 static void
 }
 
 static void
-jump_to_find_page (EvView *view)
+jump_to_find_page (EvView *view, EvViewFindDirection direction)
 {
        int n_pages, i;
 
 {
        int n_pages, i;
 
@@ -2757,12 +2789,19 @@ jump_to_find_page (EvView *view)
        for (i = 0; i < n_pages; i++) {
                int has_results;
                int page;
        for (i = 0; i < n_pages; i++) {
                int has_results;
                int page;
+               
+               if (direction == EV_VIEW_FIND_NEXT)
+                       page = view->find_page + i;
+               else
+                       page = view->find_page - i;
+
 
 
-               page = i + view->find_page;
                if (page >= n_pages) {
                        page = page - n_pages;
                }
                if (page >= n_pages) {
                        page = page - n_pages;
                }
-
+               if (page < 0) 
+                       page = page + n_pages;
+               
                has_results = ev_document_find_page_has_results
                                (EV_DOCUMENT_FIND (view->document), page);
                if (has_results == -1) {
                has_results = ev_document_find_page_has_results
                                (EV_DOCUMENT_FIND (view->document), page);
                if (has_results == -1) {
@@ -2770,7 +2809,6 @@ jump_to_find_page (EvView *view)
                        break;
                } else if (has_results == 1) {
                        ev_page_cache_set_current_page (view->page_cache, page);
                        break;
                } else if (has_results == 1) {
                        ev_page_cache_set_current_page (view->page_cache, page);
-                       jump_to_find_result (view);
                        break;
                }
        }
                        break;
                }
        }
@@ -2803,14 +2841,15 @@ ev_view_find_next (EvView *view)
        view->find_result++;
 
        if (view->find_result >= n_results) {
        view->find_result++;
 
        if (view->find_result >= n_results) {
+
                view->find_result = 0;
                view->find_page++;
                view->find_result = 0;
                view->find_page++;
-
                if (view->find_page >= n_pages) {
                        view->find_page = 0;
                }
 
                if (view->find_page >= n_pages) {
                        view->find_page = 0;
                }
 
-               jump_to_find_page (view);
+               jump_to_find_page (view, EV_VIEW_FIND_NEXT);
+               jump_to_find_result (view);
        } else {
                jump_to_find_result (view);
                gtk_widget_queue_draw (GTK_WIDGET (view));
        } else {
                jump_to_find_result (view);
                gtk_widget_queue_draw (GTK_WIDGET (view));
@@ -2833,14 +2872,15 @@ ev_view_find_previous (EvView *view)
        view->find_result--;
 
        if (view->find_result < 0) {
        view->find_result--;
 
        if (view->find_result < 0) {
-               view->find_result = 0;
-               view->find_page--;
 
 
+               view->find_page--;
                if (view->find_page < 0) {
                        view->find_page = n_pages - 1;
                }
 
                if (view->find_page < 0) {
                        view->find_page = n_pages - 1;
                }
 
-               jump_to_find_page (view);
+               jump_to_find_page (view, EV_VIEW_FIND_PREV);
+               view->find_result = ev_document_find_get_n_results (find, view->current_page) - 1;
+               jump_to_find_result (view);
        } else {
                jump_to_find_result (view);
                gtk_widget_queue_draw (GTK_WIDGET (view));
        } else {
                jump_to_find_result (view);
                gtk_widget_queue_draw (GTK_WIDGET (view));
@@ -3145,8 +3185,9 @@ ev_view_select_all (EvView *view)
                EvViewSelection *selection;
 
                ev_page_cache_get_size (view->page_cache,
                EvViewSelection *selection;
 
                ev_page_cache_get_size (view->page_cache,
+                                       i,
                                        view->rotation,
                                        view->rotation,
-                                       i, 1.0, &width, &height);
+                                       1.0, &width, &height);
 
                selection = g_new0 (EvViewSelection, 1);
                selection->page = i;
 
                selection = g_new0 (EvViewSelection, 1);
                selection->page = i;