static gchar * ev_page_accessible_get_selection (AtkText *text, gint selection_num, gint *start_pos, gint *end_pos) { EvPageAccessible *self = EV_PAGE_ACCESSIBLE (text); EvView *view = ev_page_accessible_get_view (self); gchar *selected_text = NULL; gchar *normalized_text = NULL; GList *l; *start_pos = -1; *end_pos = -1; if (selection_num != 0) return NULL; if (!EV_IS_SELECTION (view->document) || !view->selection_info.selections) return NULL; for (l = view->selection_info.selections; l != NULL; l = l->next) { EvViewSelection *selection = (EvViewSelection *)l->data; gint start, end; if (selection->page != self->priv->page) continue; if (get_selection_bounds (view, selection, &start, &end) && start != end) { EvPage *page; page = ev_document_get_page (view->document, selection->page); ev_document_doc_mutex_lock (); selected_text = ev_selection_get_selected_text (EV_SELECTION (view->document), page, selection->style, &(selection->rect)); ev_document_doc_mutex_unlock (); g_object_unref (page); *start_pos = start; *end_pos = end; } break; } if (selected_text) { normalized_text = g_utf8_normalize (selected_text, -1, G_NORMALIZE_NFKC); g_free (selected_text); } return normalized_text; }
static gboolean press (EvView * view, GdkEventButton *event, EvDocumentModel *model) { EvDocument *doc = ev_document_model_get_document (model); gint i = ev_document_model_get_page (model); if (event->button != 1) infodialog (help_text); nearest_annotation_text = NULL; extern EvMappingList * ev_document_annotations_get_annotations(); EvMappingList *mapping_list = ev_document_annotations_get_annotations (doc, ev_document_get_page(doc, i)); if(mapping_list) { gdouble nearest = G_MAXDOUBLE; GList *g = ev_mapping_list_get_list (mapping_list); for (;g;g=g->next) { EvMapping *mapping = g->data; EvAnnotation *annot = mapping->data; gdouble annottx = ev_document_model_get_scale (model)*(mapping->area.x1 + mapping->area.x2)/2; gdouble annotty = ev_document_model_get_scale (model)*(mapping->area.y1 + mapping->area.y2)/2; gdouble dist = (annottx-event->x)*(annottx-event->x) + (annotty-event->y)*(annotty-event->y); if(dist < nearest) { nearest = dist; nearest_annotation_text = ev_annotation_get_contents (annot); } } } //g_print("\n\npress signal (%f, %f) %s\n", event->x, event->y, nearest_annotation_text); return FALSE; }
static void ev_document_setup_cache (EvDocument *document) { EvDocumentPrivate *priv = document->priv; gint i; /* Cache some info about the document to avoid * going to the backends since it requires locks */ priv->n_pages = _ev_document_get_n_pages (document); for (i = 0; i < priv->n_pages; i++) { EvPage *page = ev_document_get_page (document, i); gdouble page_width = 0; gdouble page_height = 0; EvPageSize *page_size; gchar *page_label; _ev_document_get_page_size (document, page, &page_width, &page_height); if (i == 0) { priv->uniform_width = page_width; priv->uniform_height = page_height; priv->max_width = priv->uniform_width; priv->max_height = priv->uniform_height; priv->min_width = priv->uniform_width; priv->min_height = priv->uniform_height; } else if (priv->uniform && (priv->uniform_width != page_width || priv->uniform_height != page_height)) { /* It's a different page size. Backfill the array. */ int j; priv->page_sizes = g_new0 (EvPageSize, priv->n_pages); for (j = 0; j < i; j++) { page_size = &(priv->page_sizes[j]); page_size->width = priv->uniform_width; page_size->height = priv->uniform_height; } priv->uniform = FALSE; } if (!priv->uniform) { page_size = &(priv->page_sizes[i]); page_size->width = page_width; page_size->height = page_height; if (page_width > priv->max_width) priv->max_width = page_width; if (page_width < priv->min_width) priv->min_width = page_width; if (page_height > priv->max_height) priv->max_height = page_height; if (page_height < priv->min_height) priv->min_height = page_height; } page_label = _ev_document_get_page_label (document, page); if (page_label) { if (!priv->page_labels) priv->page_labels = g_new0 (gchar *, priv->n_pages); priv->page_labels[i] = page_label; priv->max_label = MAX (priv->max_label, g_utf8_strlen (page_label, 256)); } g_object_unref (page); } }
static gboolean find_annotated_pages (EvDocumentModel *model) { EvDocument *doc = ev_document_model_get_document (model); gint i; for (i=0; i< ev_document_get_n_pages(doc);i++) { extern EvMappingList * ev_document_annotations_get_annotations(); EvMappingList *mapping_list = ev_document_annotations_get_annotations (doc, ev_document_get_page(doc, i)); if(mapping_list) { annotated_pages = g_list_append (annotated_pages, GINT_TO_POINTER(i)); } } return (annotated_pages != NULL); }