static void ev_page_accessible_get_extents (AtkComponent *atk_component, gint *x, gint *y, gint *width, gint *height, AtkCoordType coord_type) { EvPageAccessible *self; EvView *view; GdkRectangle page_area; GtkBorder border; EvRectangle doc_rect, atk_rect; self = EV_PAGE_ACCESSIBLE (atk_component); view = ev_page_accessible_get_view (self); ev_view_get_page_extents (view, self->priv->page, &page_area, &border); doc_rect.x1 = page_area.x; doc_rect.y1 = page_area.y; doc_rect.x2 = page_area.x + page_area.width; doc_rect.y2 = page_area.y + page_area.height; _transform_doc_rect_to_atk_rect (self->priv->view_accessible, self->priv->page, &doc_rect, &atk_rect, coord_type); *x = atk_rect.x1; *y = atk_rect.y1; *width = atk_rect.x2 - atk_rect.x1; *height = atk_rect.y2 - atk_rect.y1; }
static gint ev_page_accessible_get_offset_at_point (AtkText *text, gint x, gint y, AtkCoordType coords) { EvPageAccessible *self = EV_PAGE_ACCESSIBLE (text); EvView *view = ev_page_accessible_get_view (self); GtkWidget *toplevel; EvRectangle *areas = NULL; EvRectangle *rect = NULL; guint n_areas = 0; guint i; gint x_widget, y_widget; gint offset=-1; GdkPoint view_point; gdouble doc_x, doc_y; GtkBorder border; GdkRectangle page_area; if (!view->page_cache) return -1; ev_page_cache_get_text_layout (view->page_cache, self->priv->page, &areas, &n_areas); if (!areas) return -1; view_point.x = x; view_point.y = y; toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self)); gtk_widget_translate_coordinates (GTK_WIDGET (self), toplevel, 0, 0, &x_widget, &y_widget); view_point.x -= x_widget; view_point.y -= y_widget; if (coords == ATK_XY_SCREEN) { gint x_window, y_window; gdk_window_get_origin (gtk_widget_get_window (toplevel), &x_window, &y_window); view_point.x -= x_window; view_point.y -= y_window; } ev_view_get_page_extents (view, self->priv->page, &page_area, &border); _ev_view_transform_view_point_to_doc_point (view, &view_point, &page_area, &border, &doc_x, &doc_y); for (i = 0; i < n_areas; i++) { rect = areas + i; if (doc_x >= rect->x1 && doc_x <= rect->x2 && doc_y >= rect->y1 && doc_y <= rect->y2) offset = i; } return offset; }
static gint ev_view_accessible_get_offset_at_point (AtkText *text, gint x, gint y, AtkCoordType coords) { GtkWidget *widget, *toplevel; EvRectangle *areas = NULL; EvRectangle *rect = NULL; guint n_areas = 0; guint i = 0; EvPageCache *page_cache; gint x_window, y_window, x_widget, y_widget; gint offset=-1, rx, ry; gdouble scale; GtkBorder border; GdkRectangle page_area; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text)); if (widget == NULL) /* State is defunct */ return -1; page_cache = EV_VIEW (widget)->page_cache; if (!page_cache) return -1; ev_view_get_page_extents (EV_VIEW (widget), EV_VIEW (widget)->current_page, &page_area, &border); scale = EV_VIEW (widget)->scale; ev_page_cache_get_text_layout (page_cache, EV_VIEW (widget)->current_page, &areas, &n_areas); if (!areas) return -1; rx = x; ry = y; rx -= page_area.x; ry -= page_area.y; rx += EV_VIEW (widget)->scroll_x; ry += EV_VIEW (widget)->scroll_y; toplevel = gtk_widget_get_toplevel (widget); gtk_widget_translate_coordinates (widget, toplevel, 0, 0, &x_widget, &y_widget); rx -= x_widget; ry -= y_widget; if (coords == ATK_XY_SCREEN) { gdk_window_get_origin (gtk_widget_get_window (toplevel), &x_window, &y_window); rx -= x_window; ry -= y_window; } rx /= scale; ry /= scale; for (i = 0; i < n_areas; i++) { rect = areas + i; if (rx >= rect->x1 && rx <= rect->x2 && ry >= rect->y1 && ry <= rect->y2) offset = i; } return offset; }
static void ev_view_accessible_get_character_extents (AtkText *text, gint offset, gint *x, gint *y, gint *width, gint *height, AtkCoordType coords) { GtkWidget *widget, *toplevel; EvRectangle *areas = NULL; EvRectangle *rect = NULL; guint n_areas = 0; EvPageCache *page_cache; gint x_widget, y_widget, x_window, y_window; gdouble scale; GtkBorder border; GdkRectangle page_area; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text)); if (widget == NULL) /* State is defunct */ return; page_cache = EV_VIEW (widget)->page_cache; if (!page_cache) return; ev_view_get_page_extents (EV_VIEW (widget), EV_VIEW (widget)->current_page, &page_area, &border); scale = EV_VIEW (widget)->scale; ev_page_cache_get_text_layout (page_cache, EV_VIEW (widget)->current_page, &areas, &n_areas); if (!areas) return; if (offset >= n_areas) return; rect = areas + offset; *x = (int)(rect->x1 * scale); *y = (int)(rect->y1 * scale); *width = (int)(fabs (rect->x2 - rect->x1) * scale); *height = (int)(fabs (rect->y2 - rect->y1) * scale); toplevel = gtk_widget_get_toplevel (widget); gtk_widget_translate_coordinates (widget, toplevel, 0, 0, &x_widget, &y_widget); *x += x_widget; *y += y_widget; if (coords == ATK_XY_SCREEN) { gdk_window_get_origin (gtk_widget_get_window (toplevel), &x_window, &y_window); *x += x_window; *y += y_window; } *x -= EV_VIEW (widget)->scroll_x; *y -= EV_VIEW (widget)->scroll_y; *x += page_area.x; *y += page_area.y; }