static void comment_view_set_bounds (SheetObjectView *sov, double const *coords, gboolean visible) { CommentView *cv = (CommentView *)sov; GocPoints *points = goc_points_new (3); GocItem *item = GOC_ITEM (GOC_GROUP (sov)->children->data); if (visible) { SheetObject *so = sheet_object_view_get_so (sov); SheetControlGUI const *scg = GNM_SIMPLE_CANVAS (item->canvas)->scg; double scale; gint64 x, y, dx; int far_col; GnmRange const *r = gnm_sheet_merge_is_corner (so->sheet, &so->anchor.cell_bound.start); scale = 1. / item->canvas->pixels_per_unit; if (r != NULL) far_col = 1 + r->end.col; else far_col = 1 + so->anchor.cell_bound.start.col; /* TODO : This could be optimized using the offsets associated with the visible region */ /* Add 1 to y because we measure from start, x is measured from end, so * it does not need it */ y = scg_colrow_distance_get (scg, FALSE, 0, so->anchor.cell_bound.start.row)+ 1; points->points[0].y = scale * y; points->points[1].y = scale * y; points->points[2].y = scale * y + cv->comment_indicator_size; dx = cv->comment_indicator_size; x = scg_colrow_distance_get (scg, TRUE, 0, far_col); points->points[0].x = scale * x - dx; points->points[1].x = scale * x; points->points[2].x = scale * x; goc_item_set (item, "points", points, NULL); goc_points_unref (points); goc_item_show (GOC_ITEM (sov)); } else goc_item_hide (GOC_ITEM (sov)); }
/* Somewhat magic. * We do not honour all of the anchor flags. All that is used is the far corner. */ static void vcombo_set_bounds (SheetObjectView *sov, double const *coords, gboolean visible) { GocGroup *view = GOC_GROUP (sov); if (visible) { double scale = goc_canvas_get_pixels_per_unit (GOC_ITEM (view)->canvas); double h = (coords[3] - coords[1]) + 1.; if (h > 20.) /* clip vertically */ h = 20.; h /= scale; goc_item_set (GOC_ITEM (view->children->data), /* put it outside the cell */ "x", ((coords[2] >= 0.)? coords[2] / scale: (coords[0] / scale - h + 1.)), "y", coords [3] / scale - h + 1., "width", h, /* force a square, use h for width too */ "height", h, NULL); goc_item_show (GOC_ITEM (view)); } else goc_item_hide (GOC_ITEM (view)); }
static void so_image_view_set_bounds (SheetObjectView *sov, double const *coords, gboolean visible) { GocItem *view = GOC_ITEM (GOC_GROUP (sov)->children->data); double scale = goc_canvas_get_pixels_per_unit (view->canvas); if (visible) { double x, y, width, height; double old_x1, old_y1, old_x2, old_y2, old_width, old_height; GdkPixbuf *placeholder = g_object_get_data (G_OBJECT (view), "tile"); x = MIN (coords [0], coords [2]) / scale; y = MIN (coords [1], coords [3]) / scale; width = fabs (coords [2] - coords [0]) / scale; height = fabs (coords [3] - coords [1]) / scale; goc_item_get_bounds (view, &old_x1, &old_y1, &old_x2, &old_y2); goc_item_set (view, "x", x, "y", y, "width", width, "height", height, NULL); /* regenerate the image if necessary */ old_width = fabs (old_x1 - old_x2); old_height = fabs (old_y1 - old_y2); if (placeholder != NULL && (fabs (width - old_width) > 0.5 || fabs (height - old_height) > 0.5)) { GdkPixbuf *newimage = go_pixbuf_tile (placeholder, (guint)width, (guint)height); goc_item_set (view, "pixbuf", newimage, NULL); g_object_unref (newimage); } goc_item_show (view); } else goc_item_hide (view); }