]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Add seb128
[evince.git] / shell / ev-view.c
index 0380e226f4aab36719cfc1d41730fd5bec2f6ef6..6ef026b60c7b814630df6775a46470ce775374f2 100644 (file)
@@ -206,7 +206,8 @@ static void       draw_one_page                              (EvView
                                                              gint                page,
                                                              GdkRectangle       *page_area,
                                                              GtkBorder          *border,
                                                              gint                page,
                                                              GdkRectangle       *page_area,
                                                              GtkBorder          *border,
-                                                             GdkRectangle       *expose_area);
+                                                             GdkRectangle       *expose_area,
+                                                             gboolean           *page_ready);
 static void      draw_loading_text                          (EvView             *view,
                                                              GdkRectangle       *page_area,
                                                              GdkRectangle       *expose_area);
 static void      draw_loading_text                          (EvView             *view,
                                                              GdkRectangle       *page_area,
                                                              GdkRectangle       *expose_area);
@@ -438,7 +439,7 @@ view_update_range_and_current_page (EvView *view)
                GdkRectangle current_area, unused, page_area;
                GtkBorder border;
                gboolean found = FALSE;
                GdkRectangle current_area, unused, page_area;
                GtkBorder border;
                gboolean found = FALSE;
-               gint area_max, area;
+               gint area_max = -1, area;
                int i;
 
                if (!(view->vadjustment && view->hadjustment))
                int i;
 
                if (!(view->vadjustment && view->hadjustment))
@@ -1079,22 +1080,20 @@ static void
 goto_fitr_dest (EvView *view, EvLinkDest *dest)
 {
        EvPoint doc_point;
 goto_fitr_dest (EvView *view, EvLinkDest *dest)
 {
        EvPoint doc_point;
-       int page;
        double zoom;
 
        zoom = zoom_for_size_best_fit (ev_link_dest_get_right (dest) - ev_link_dest_get_left (dest),
        double zoom;
 
        zoom = zoom_for_size_best_fit (ev_link_dest_get_right (dest) - ev_link_dest_get_left (dest),
-                                      ev_link_dest_get_top (dest) - ev_link_dest_get_bottom (dest),
+                                      ev_link_dest_get_bottom (dest) - ev_link_dest_get_top (dest),
                                       ev_view_get_width (view),
                                       ev_view_get_height (view), 0, 0);
 
        ev_view_set_sizing_mode (view, EV_SIZING_FREE);
        ev_view_set_zoom (view, zoom, FALSE);
 
                                       ev_view_get_width (view),
                                       ev_view_get_height (view), 0, 0);
 
        ev_view_set_sizing_mode (view, EV_SIZING_FREE);
        ev_view_set_zoom (view, zoom, FALSE);
 
-       page = ev_link_dest_get_page (dest);
        doc_point.x = ev_link_dest_get_left (dest);
        doc_point.y = ev_link_dest_get_top (dest);
        
        doc_point.x = ev_link_dest_get_left (dest);
        doc_point.y = ev_link_dest_get_top (dest);
        
-       view->current_page = page;
+       view->current_page = ev_link_dest_get_page (dest);
        view->pending_point = doc_point;
        view->pending_scroll = SCROLL_TO_PAGE_POSITION;
 
        view->pending_point = doc_point;
        view->pending_scroll = SCROLL_TO_PAGE_POSITION;
 
@@ -1139,7 +1138,7 @@ goto_fith_dest (EvView *view, EvLinkDest *dest)
        ev_page_cache_get_size (view->page_cache, page, 0, 1.0, &doc_width, &doc_height);
 
        doc_point.x = 0;
        ev_page_cache_get_size (view->page_cache, page, 0, 1.0, &doc_width, &doc_height);
 
        doc_point.x = 0;
-       doc_point.y = doc_height - ev_link_dest_get_top (dest);
+       doc_point.y = ev_link_dest_get_top (dest);
 
        zoom = zoom_for_size_fit_width (doc_width, ev_link_dest_get_top (dest),
                                        ev_view_get_width (view),
 
        zoom = zoom_for_size_fit_width (doc_width, ev_link_dest_get_top (dest),
                                        ev_view_get_width (view),
@@ -1194,7 +1193,7 @@ goto_xyz_dest (EvView *view, EvLinkDest *dest)
        }
 
        doc_point.x = ev_link_dest_get_left (dest);
        }
 
        doc_point.x = ev_link_dest_get_left (dest);
-       doc_point.y = height - ev_link_dest_get_top (dest);
+       doc_point.y = ev_link_dest_get_top (dest);
 
        view->current_page = page;
        view->pending_point = doc_point;
 
        view->current_page = page;
        view->pending_point = doc_point;
@@ -1236,6 +1235,9 @@ goto_dest (EvView *view, EvLinkDest *dest)
                case EV_LINK_DEST_TYPE_XYZ:
                        goto_xyz_dest (view, dest);
                        break;
                case EV_LINK_DEST_TYPE_XYZ:
                        goto_xyz_dest (view, dest);
                        break;
+               case EV_LINK_DEST_TYPE_PAGE_LABEL:
+                       ev_page_cache_set_page_label (view->page_cache, ev_link_dest_get_page_label (dest));
+                       break;
                default:
                        g_assert_not_reached ();
        }
                default:
                        g_assert_not_reached ();
        }
@@ -1289,6 +1291,7 @@ ev_view_handle_link (EvView *view, EvLink *link)
                case EV_LINK_ACTION_TYPE_GOTO_REMOTE:
                case EV_LINK_ACTION_TYPE_EXTERNAL_URI:
                case EV_LINK_ACTION_TYPE_LAUNCH:
                case EV_LINK_ACTION_TYPE_GOTO_REMOTE:
                case EV_LINK_ACTION_TYPE_EXTERNAL_URI:
                case EV_LINK_ACTION_TYPE_LAUNCH:
+               case EV_LINK_ACTION_TYPE_NAMED:
                        g_signal_emit (view, signals[SIGNAL_EXTERNAL_LINK], 0, action);
                        break;
        }
                        g_signal_emit (view, signals[SIGNAL_EXTERNAL_LINK], 0, action);
                        break;
        }
@@ -1326,6 +1329,28 @@ page_label_from_dest (EvView *view, EvLinkDest *dest)
        return msg;
 }
 
        return msg;
 }
 
+static char *
+tip_from_action_named (EvLinkAction *action)
+{
+       const gchar *name = ev_link_action_get_name (action);
+       
+       if (g_ascii_strcasecmp (name, "FirstPage") == 0) {
+               return g_strdup (_("Go to first page"));
+       } else if (g_ascii_strcasecmp (name, "PrevPage") == 0) {
+               return g_strdup (_("Go to previous page"));
+       } else if (g_ascii_strcasecmp (name, "NextPage") == 0) {
+               return g_strdup (_("Go to next page"));
+       } else if (g_ascii_strcasecmp (name, "LastPage") == 0) {
+               return g_strdup (_("Go to last page"));
+       } else if (g_ascii_strcasecmp (name, "GoToPage") == 0) {
+               return g_strdup (_("Go to page"));
+       } else if (g_ascii_strcasecmp (name, "Find") == 0) {
+               return g_strdup (_("Find"));
+       }
+       
+       return NULL;
+}
+
 static char *
 tip_from_link (EvView *view, EvLink *link)
 {
 static char *
 tip_from_link (EvView *view, EvLink *link)
 {
@@ -1352,10 +1377,10 @@ tip_from_link (EvView *view, EvLink *link)
                        break;
                case EV_LINK_ACTION_TYPE_GOTO_REMOTE:
                        if (title) {
                        break;
                case EV_LINK_ACTION_TYPE_GOTO_REMOTE:
                        if (title) {
-                               msg = g_strdup_printf (_("Go to %s on file %s"), title,
+                               msg = g_strdup_printf (_("Go to %s on file ā€œ%sā€"), title,
                                                       ev_link_action_get_filename (action));
                        } else {
                                                       ev_link_action_get_filename (action));
                        } else {
-                               msg = g_strdup_printf (_("Go to file %s"),
+                               msg = g_strdup_printf (_("Go to file ā€œ%sā€"),
                                                       ev_link_action_get_filename (action));
                        }
                        
                                                       ev_link_action_get_filename (action));
                        }
                        
@@ -1367,6 +1392,9 @@ tip_from_link (EvView *view, EvLink *link)
                        msg = g_strdup_printf (_("Launch %s"),
                                               ev_link_action_get_filename (action));
                        break;
                        msg = g_strdup_printf (_("Launch %s"),
                                               ev_link_action_get_filename (action));
                        break;
+               case EV_LINK_ACTION_TYPE_NAMED:
+                       msg = tip_from_action_named (action);
+                       break;
                default:
                        if (title)
                                msg = g_strdup (title);
                default:
                        if (title)
                                msg = g_strdup (title);
@@ -1735,6 +1763,7 @@ ev_view_expose_event (GtkWidget      *widget,
        for (i = view->start_page; i <= view->end_page; i++) {
                GdkRectangle page_area;
                GtkBorder border;
        for (i = view->start_page; i <= view->end_page; i++) {
                GdkRectangle page_area;
                GtkBorder border;
+               gboolean page_ready = TRUE;
 
                if (!get_page_extents (view, i, &page_area, &border))
                        continue;
 
                if (!get_page_extents (view, i, &page_area, &border))
                        continue;
@@ -1742,9 +1771,9 @@ ev_view_expose_event (GtkWidget      *widget,
                page_area.x -= view->scroll_x;
                page_area.y -= view->scroll_y;
 
                page_area.x -= view->scroll_x;
                page_area.y -= view->scroll_y;
 
-               draw_one_page (view, i, &page_area, &border, &(event->area));
+               draw_one_page (view, i, &page_area, &border, &(event->area), &page_ready);
 
 
-               if (EV_IS_DOCUMENT_FIND (view->document))
+               if (page_ready && EV_IS_DOCUMENT_FIND (view->document))
                        highlight_find_results (view, i);
        }
 
                        highlight_find_results (view, i);
        }
 
@@ -2238,7 +2267,8 @@ draw_one_page (EvView          *view,
               gint             page,
               GdkRectangle    *page_area,
               GtkBorder       *border,
               gint             page,
               GdkRectangle    *page_area,
               GtkBorder       *border,
-              GdkRectangle    *expose_area)
+              GdkRectangle    *expose_area,
+              gboolean        *page_ready)
 {
        gint width, height;
        GdkPixbuf *current_pixbuf;
 {
        gint width, height;
        GdkPixbuf *current_pixbuf;
@@ -2265,6 +2295,7 @@ draw_one_page (EvView          *view,
        real_page_area.y += border->top;
        real_page_area.width -= (border->left + border->right);
        real_page_area.height -= (border->top + border->bottom);
        real_page_area.y += border->top;
        real_page_area.width -= (border->left + border->right);
        real_page_area.height -= (border->top + border->bottom);
+       *page_ready = TRUE;
 
        ev_document_misc_paint_one_page (GTK_WIDGET(view)->window,
                                         GTK_WIDGET (view),
 
        ev_document_misc_paint_one_page (GTK_WIDGET(view)->window,
                                         GTK_WIDGET (view),
@@ -2324,6 +2355,7 @@ draw_one_page (EvView          *view,
                        draw_loading_text (view,
                                           &real_page_area,
                                           expose_area);
                        draw_loading_text (view,
                                           &real_page_area,
                                           expose_area);
+                       *page_ready = FALSE;
                }
 
                if (scaled_selection) {
                }
 
                if (scaled_selection) {
@@ -4098,6 +4130,9 @@ ev_view_next_page (EvView *view)
        int page;
 
        g_return_val_if_fail (EV_IS_VIEW (view), FALSE);
        int page;
 
        g_return_val_if_fail (EV_IS_VIEW (view), FALSE);
+       
+       if (!view->page_cache)
+               return FALSE;
 
        page = ev_page_cache_get_current_page (view->page_cache);
 
 
        page = ev_page_cache_get_current_page (view->page_cache);
 
@@ -4124,6 +4159,9 @@ ev_view_previous_page (EvView *view)
 
        g_return_val_if_fail (EV_IS_VIEW (view), FALSE);
 
 
        g_return_val_if_fail (EV_IS_VIEW (view), FALSE);
 
+       if (!view->page_cache)
+               return FALSE;
+
        page = ev_page_cache_get_current_page (view->page_cache);
 
        if (view->dual_page && !view->presentation)
        page = ev_page_cache_get_current_page (view->page_cache);
 
        if (view->dual_page && !view->presentation)