- alpha = (i == view->find_result) ? 0x90 : 0x20;
- ev_document_find_get_result (find, page,
- i, &rectangle);
- doc_rect_to_view_rect (view, page, &rectangle, &view_rectangle);
- draw_rubberband (GTK_WIDGET (view), view->bin_window,
- &view_rectangle, alpha);
- }
-}
-
-static void
-draw_one_page (EvView *view,
- gint page,
- GdkRectangle *page_area,
- GtkBorder *border,
- GdkRectangle *expose_area)
-{
- gint width, height;
- GdkPixbuf *scaled_image;
- GdkPixbuf *current_pixbuf;
- GdkRectangle overlap;
- GdkRectangle real_page_area;
-
- g_assert (view->document);
-
- if (! gdk_rectangle_intersect (page_area, expose_area, &overlap))
- return;
-
- ev_page_cache_get_size (view->page_cache,
- page, view->scale,
- &width, &height);
-
- ev_document_misc_paint_one_page (view->bin_window,
- GTK_WIDGET (view),
- page_area, border);
-
- /* Render the document itself */
- real_page_area = *page_area;
-
- real_page_area.x += border->left;
- real_page_area.y += border->top;
- real_page_area.width -= (border->left + border->right);
- real_page_area.height -= (border->top + border->bottom);
-
- if (! gdk_rectangle_intersect (&real_page_area, expose_area, &overlap))
- return;
-
- current_pixbuf = ev_pixbuf_cache_get_pixbuf (view->pixbuf_cache, page);
- if (current_pixbuf == NULL)
- scaled_image = NULL;
- else if (width == gdk_pixbuf_get_width (current_pixbuf) &&
- height == gdk_pixbuf_get_height (current_pixbuf))
- scaled_image = g_object_ref (current_pixbuf);
- else
- scaled_image = gdk_pixbuf_scale_simple (current_pixbuf,
- width, height,
- GDK_INTERP_NEAREST);
- if (scaled_image) {
- gdk_draw_pixbuf (view->bin_window,
- GTK_WIDGET (view)->style->fg_gc[GTK_STATE_NORMAL],
- scaled_image,
- overlap.x - real_page_area.x,
- overlap.y - real_page_area.y,
- overlap.x, overlap.y,
- overlap.width, overlap.height,
- GDK_RGB_DITHER_NORMAL,
- 0, 0);
- g_object_unref (scaled_image);
- }
-}
-
-static void
-ev_view_bin_expose (EvView *view,
- GdkEventExpose *event)
-{
- GdkRectangle rubberband;
- GList *l;
- int i;
-
- if (view->document == NULL)
- return;
-
- for (i = view->start_page; i <= view->end_page; i++) {
- GdkRectangle page_area;
- GtkBorder border;
-
- if (! get_page_extents (view, i, &page_area, &border))
- continue;
-
- draw_one_page (view, i, &page_area, &border, &(event->area));
-
- if (EV_IS_DOCUMENT_FIND (view->document)) {
- highlight_find_results (view, i);
- }
- }
-
- for (l = view->selections; l != NULL; l = l->next) {
- EvViewSelection *selection = (EvViewSelection *)l->data;
-
- doc_rect_to_view_rect (view, selection->page,
- &selection->rect, &rubberband);
- if (rubberband.width > 0 && rubberband.height > 0) {
- draw_rubberband (GTK_WIDGET (view), view->bin_window,
- &rubberband, 0x40);
- }
- }
-}
-
-static gboolean
-ev_view_expose_event (GtkWidget *widget,
- GdkEventExpose *event)
-{
- EvView *view = EV_VIEW (widget);
-
- if (event->window == view->bin_window)
- ev_view_bin_expose (view, event);
- else
- return GTK_WIDGET_CLASS (ev_view_parent_class)->expose_event (widget, event);
-
- return FALSE;
-}
-
-void
-ev_view_select_all (EvView *view)
-{
- int n_pages, i;
-
- clear_selection (view);
-
- n_pages = ev_page_cache_get_n_pages (view->page_cache);
- for (i = 0; i < n_pages; i++) {
- int width, height;
- EvViewSelection *selection;
-
- ev_page_cache_get_size (view->page_cache,
- view->current_page,
- 1.0,
- &width,
- &height);
-
- selection = g_new0 (EvViewSelection, 1);
- selection->page = i;
- selection->rect.x1 = selection->rect.y1 = 0;
- selection->rect.x2 = width;
- selection->rect.y2 = height;
-
- view->selections = g_list_append (view->selections, selection);
- }
-
- gtk_widget_queue_draw (GTK_WIDGET (view));
-}
-
-static char *
-get_selected_text (EvView *ev_view)
-{
- GString *text;
- GList *l;
-
- text = g_string_new (NULL);
-
- ev_document_doc_mutex_lock ();
-
- for (l = ev_view->selections; l != NULL; l = l->next) {
- EvViewSelection *selection = (EvViewSelection *)l->data;
- char *tmp;
-
- tmp = ev_document_get_text (ev_view->document,
- selection->page,
- &selection->rect);
- g_string_append (text, tmp);
- g_free (tmp);
- }
-
- ev_document_doc_mutex_unlock ();
-
- return g_string_free (text, FALSE);
-}
-
-void
-ev_view_copy (EvView *ev_view)
-{
- GtkClipboard *clipboard;
- char *text;
-
- if (!ev_document_can_get_text (ev_view->document)) {
- return;
- }
-
- text = get_selected_text (ev_view);
- clipboard = gtk_widget_get_clipboard (GTK_WIDGET (ev_view),
- GDK_SELECTION_CLIPBOARD);
- gtk_clipboard_set_text (clipboard, text, -1);
- g_free (text);
-}
-
-static void
-ev_view_primary_get_cb (GtkClipboard *clipboard,
- GtkSelectionData *selection_data,
- guint info,
- gpointer data)
-{
- EvView *ev_view = EV_VIEW (data);
- char *text;
-
- if (!ev_document_can_get_text (ev_view->document)) {
- return;
- }
-
- text = get_selected_text (ev_view);
- gtk_selection_data_set_text (selection_data, text, -1);
- g_free (text);
-}
-
-static void
-ev_view_primary_clear_cb (GtkClipboard *clipboard,
- gpointer data)
-{
- EvView *view = EV_VIEW (data);
-
- clear_selection (view);
-}
-
-static void
-ev_view_update_primary_selection (EvView *ev_view)
-{
- GtkClipboard *clipboard;
-
- clipboard = gtk_widget_get_clipboard (GTK_WIDGET (ev_view),
- GDK_SELECTION_PRIMARY);
-
- if (ev_view->selections) {
- if (!gtk_clipboard_set_with_owner (clipboard,
- targets,
- G_N_ELEMENTS (targets),
- ev_view_primary_get_cb,
- ev_view_primary_clear_cb,
- G_OBJECT (ev_view)))
- ev_view_primary_clear_cb (clipboard, ev_view);
- } else {
- if (gtk_clipboard_get_owner (clipboard) == G_OBJECT (ev_view))
- gtk_clipboard_clear (clipboard);
- }
-}
-
-static gboolean
-ev_view_button_press_event (GtkWidget *widget,
- GdkEventButton *event)
-{
- EvView *view = EV_VIEW (widget);
-
- if (!GTK_WIDGET_HAS_FOCUS (widget)) {
- gtk_widget_grab_focus (widget);
- }
-
- view->pressed_button = event->button;
-
- switch (event->button) {
- case 1:
- if (view->selections) {
- clear_selection (view);
- gtk_widget_queue_draw (widget);
- }
-
- view->selection_start.x = event->x;
- view->selection_start.y = event->y;
- break;
- }
-
- return TRUE;
-}
-
-static char *
-status_message_from_link (EvView *view, EvLink *link)
-{
- EvLinkType type;
- char *msg = NULL;
- char *page_label;
-
- type = ev_link_get_link_type (link);
-
- switch (type) {
- case EV_LINK_TYPE_TITLE:
- if (ev_link_get_title (link))
- msg = g_strdup (ev_link_get_title (link));
- break;
- case EV_LINK_TYPE_PAGE:
- page_label = ev_page_cache_get_page_label (view->page_cache, ev_link_get_page (link));
- msg = g_strdup_printf (_("Go to page %s"), page_label);
- g_free (page_label);
- break;
- case EV_LINK_TYPE_EXTERNAL_URI:
- msg = g_strdup (ev_link_get_uri (link));
- break;
- default:
- break;
- }
-
- return msg;
-}
-
-static void
-ev_view_set_status (EvView *view, const char *message)
-{
- g_return_if_fail (EV_IS_VIEW (view));
-
- if (message != view->status) {
- g_free (view->status);
- view->status = g_strdup (message);
- g_object_notify (G_OBJECT (view), "status");
- }
-}
-
-static void
-ev_view_set_find_status (EvView *view, const char *message)
-{
- g_return_if_fail (EV_IS_VIEW (view));
-
- g_free (view->find_status);
- view->find_status = g_strdup (message);
- g_object_notify (G_OBJECT (view), "find-status");
-}
-
-static GdkCursor *
-ev_view_create_invisible_cursor(void)
-{
- GdkBitmap *empty;
- GdkColor black = { 0, 0, 0, 0 };
- static char bits[] = { 0x00 };
-
- empty = gdk_bitmap_create_from_data (NULL, bits, 1, 1);
-
- return gdk_cursor_new_from_pixmap (empty, empty, &black, &black, 0, 0);
-}
-
-static void
-ev_view_set_cursor (EvView *view, EvViewCursor new_cursor)
-{
- GdkCursor *cursor = NULL;
- GdkDisplay *display;
- GtkWidget *widget;
-
- if (view->cursor == new_cursor) {
- return;
- }
-
- widget = gtk_widget_get_toplevel (GTK_WIDGET (view));
- display = gtk_widget_get_display (widget);
- view->cursor = new_cursor;
-
- switch (new_cursor) {
- case EV_VIEW_CURSOR_NORMAL:
- gdk_window_set_cursor (widget->window, NULL);
- break;
- case EV_VIEW_CURSOR_LINK:
- cursor = gdk_cursor_new_for_display (display, GDK_HAND2);
- break;
- case EV_VIEW_CURSOR_WAIT:
- cursor = gdk_cursor_new_for_display (display, GDK_WATCH);
- break;
- case EV_VIEW_CURSOR_HIDDEN:
- cursor = ev_view_create_invisible_cursor ();
- break;
-
- }
-
- if (cursor) {
- gdk_window_set_cursor (widget->window, cursor);
- gdk_cursor_unref (cursor);
- gdk_flush();
- }
-}
-
-
-static void
-find_page_at_location (EvView *view,
- gdouble x,
- gdouble y,
- gint *page,
- gint *x_offset,
- gint *y_offset)
-{
- int i;
-
- if (view->document == NULL)
- return;
-
- g_assert (page);
- g_assert (x_offset);
- g_assert (y_offset);
-
- for (i = view->start_page; i <= view->end_page; i++) {
- GdkRectangle page_area;
- GtkBorder border;
-
- if (! get_page_extents (view, i, &page_area, &border))
- continue;
-
- if ((x >= page_area.x + border.left) &&
- (x < page_area.x + page_area.width - border.right) &&
- (y >= page_area.y + border.top) &&
- (y < page_area.y + page_area.height - border.bottom)) {
- *page = i;
- *x_offset = x - (page_area.x + border.left);
- *y_offset = y - (page_area.y + border.top);
- return;
- }