static SheetObjectView * gnm_soi_new_view (SheetObject *so, SheetObjectViewContainer *container) { SheetObjectImage *soi = SHEET_OBJECT_IMAGE (so); GocItem *item = NULL; item = goc_item_new ( gnm_pane_object_group (GNM_PANE (container)), so_image_goc_view_get_type (), NULL); if (soi->image) { goc_item_hide (goc_item_new (GOC_GROUP (item), GOC_TYPE_IMAGE, "image", soi->image, "crop-bottom", soi->crop_bottom, "crop-left", soi->crop_left, "crop-right", soi->crop_right, "crop-top", soi->crop_top, NULL)); } else { GdkPixbuf *placeholder = go_gdk_pixbuf_load_from_file ("res:gnm:pixmaps/unknown_image.png"); GdkPixbuf *pixbuf = gdk_pixbuf_copy (placeholder); goc_item_hide (goc_item_new (GOC_GROUP (item), GOC_TYPE_PIXBUF, "pixbuf", pixbuf, NULL)); g_object_unref (pixbuf); g_object_set_data (G_OBJECT (item), "tile", placeholder); } return gnm_pane_object_register (so, item, TRUE); }
static SheetObjectView * gnm_soi_new_view (SheetObject *so, SheetObjectViewContainer *container) { SheetObjectImage *soi = SHEET_OBJECT_IMAGE (so); GocItem *item = NULL; GdkPixbuf *pixbuf, *placeholder = NULL; pixbuf = soi_get_pixbuf (soi, 1.); if (pixbuf == NULL) { placeholder = gtk_icon_theme_load_icon ( gtk_icon_theme_get_default (), "unknown_image", 100, 0, NULL); pixbuf = gdk_pixbuf_copy (placeholder); } item = goc_item_new ( gnm_pane_object_group (GNM_PANE (container)), so_image_goc_view_get_type (), NULL); goc_item_hide (goc_item_new (GOC_GROUP (item), GOC_TYPE_PIXBUF, "pixbuf", pixbuf, NULL)); g_object_unref (G_OBJECT (pixbuf)); if (placeholder) g_object_set_data (G_OBJECT (item), "tile", placeholder); return gnm_pane_object_register (so, item, TRUE); }
static void goc_canvas_init (GocCanvas *canvas) { #ifdef GOFFICE_WITH_GTK GtkWidget *w = GTK_WIDGET (canvas); #endif canvas->root = GOC_GROUP (g_object_new (GOC_TYPE_GROUP, NULL)); canvas->root->base.canvas = canvas; canvas->pixels_per_unit = 1.; canvas->priv = g_new0 (GocCanvasPrivate, 1); #ifdef GOFFICE_WITH_GTK gtk_widget_add_events (w, GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_2BUTTON_PRESS | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_SMOOTH_SCROLL_MASK | GDK_SCROLL_MASK ); g_signal_connect (G_OBJECT (w), "button-press-event", G_CALLBACK (button_press_cb), NULL); g_signal_connect (G_OBJECT (w), "button-release-event", G_CALLBACK (button_release_cb), NULL); g_signal_connect (G_OBJECT (w), "motion-notify-event", G_CALLBACK (motion_cb), NULL); g_signal_connect (G_OBJECT (w), "key_press_event", (GCallback) key_press_cb, NULL); g_signal_connect (G_OBJECT (w), "key_release_event", (GCallback) key_release_cb, NULL); g_signal_connect (G_OBJECT (w), "size-allocate", (GCallback) size_changed_cb, NULL); g_signal_connect (G_OBJECT (w), "enter-notify-event", G_CALLBACK (enter_notify_cb), NULL); g_signal_connect (G_OBJECT (w), "leave-notify-event", G_CALLBACK (leave_notify_cb), NULL); #endif }
static SheetObjectView * gnm_so_path_new_view (SheetObject *so, SheetObjectViewContainer *container) { GnmSOPath *sop = GNM_SO_PATH (so); GnmSOPathView *item; /* FIXME: this is unsafe if the paths change after the view is created, * but this can't occur for now */ unsigned i; if (sop->path == NULL && sop->paths == NULL) return NULL; item = (GnmSOPathView *) goc_item_new ( gnm_pane_object_group (GNM_PANE (container)), so_path_goc_view_get_type (), NULL); if (sop->path) item->path = goc_item_new (GOC_GROUP (item), GOC_TYPE_PATH, "closed", TRUE, "fill-rule", TRUE, NULL); else { item->paths = g_ptr_array_sized_new (sop->paths->len); g_ptr_array_set_free_func (item->paths, g_object_unref); for (i = 0; i < sop->paths->len; i++) g_ptr_array_add (item->paths, goc_item_new (GOC_GROUP (item), GOC_TYPE_PATH, "closed", TRUE, "fill-rule", TRUE, NULL)); } cb_gnm_so_path_changed (sop, NULL, item); g_signal_connect_object (sop, "notify::style", G_CALLBACK (cb_gnm_so_path_changed), item, 0); return gnm_pane_object_register (so, GOC_ITEM (item), TRUE); }
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)); }
/** * gnm_cell_combo_view_new: * @so: #SheetObject * @type: #GType * @container: SheetObjectViewContainer (a GnmPane) * * Create and register an in cell combo to pick from an autofilter list. **/ SheetObjectView * gnm_cell_combo_view_new (SheetObject *so, GType type, SheetObjectViewContainer *container) { GnmPane *pane = GNM_PANE (container); GtkWidget *view_widget = gtk_button_new (); GocItem *ccombo = goc_item_new (pane->object_views, type, NULL); goc_item_new (GOC_GROUP (ccombo), GOC_TYPE_WIDGET, "widget", view_widget, NULL); gtk_widget_set_can_focus (view_widget, FALSE); gtk_container_add (GTK_CONTAINER (view_widget), ccombo_create_arrow (GNM_CCOMBO_VIEW (ccombo), so)); g_signal_connect_swapped (view_widget, "pressed", G_CALLBACK (cb_ccombo_button_pressed), ccombo); gtk_widget_show_all (view_widget); return gnm_pane_object_register (so, ccombo, FALSE); }
/* 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); }
static void cb_gnm_so_path_changed (GnmSOPath const *sop, G_GNUC_UNUSED GParamSpec *pspec, GnmSOPathView *group) { GList *ptr = GOC_GROUP (group)->children; for (; ptr && ptr->data; ptr = ptr->next) if (GOC_IS_PATH (ptr->data)) cb_gnm_so_path_style_changed (GOC_ITEM (ptr->data), sop); if (sop->text != NULL && *sop->text != 0) { /* set a font, a very bad solution, but will do until we move to GOString */ PangoFontDescription *desc = pango_font_description_from_string ("Sans 10"); GOStyle *style; if (group->text == NULL) { double x0, y0, x1, y1; if (group->path) goc_item_get_bounds (group->path, &x0, &y0, &x1, &y1); else { unsigned i; double mx, my, Mx, My; x0 = y0 = G_MAXDOUBLE; x1 = y1 = -G_MAXDOUBLE; for (i = 0; i < group->paths->len; i++) { goc_item_get_bounds (GOC_ITEM (g_ptr_array_index (group->paths, i)), &mx, &my, &Mx, &My); if (mx < x0) x0 = mx; if (my < y0) y0 = my; if (Mx > x1) x1 = Mx; if (My > y1) y1 = My; } } x1 -= x0 + sop->margin_pts.left + sop->margin_pts.right; y1 -= y0 + sop->margin_pts.top + sop->margin_pts.bottom; x0 += x1 / 2. + sop->margin_pts.left; y0 += y1 / 2. + sop->margin_pts.top; x1 = MAX (x1, DBL_MIN); y1 = MAX (y1, DBL_MIN); group->text = goc_item_new (GOC_GROUP (group), GOC_TYPE_TEXT, "anchor", GO_ANCHOR_CENTER, "clip", TRUE, "x", x0, "y", y0, "clip-height", y1, "clip-width", x1, "wrap-width", x1, "attributes", sop->markup, NULL); } style = go_styled_object_get_style (GO_STYLED_OBJECT (group->text)); go_style_set_font_desc (style, desc); goc_item_set (group->text, "text", sop->text, "attributes", sop->markup, NULL); } else if (group->text != NULL) { g_object_unref (group->text); group->text = NULL; } }