/* * Sets virt_row, virt_col to the block coordinates for the * block containing pixel (x, y). Also sets o_x, o_y, to the * pixel coordinates of the origin of the block. Returns * TRUE if a block is found, FALSE if (x,y) is not * in any block. * * All coordinates are with respect to the canvas origin. */ static SheetBlock * gnucash_grid_find_block_by_pixel (GnucashGrid *grid, gint x, gint y, VirtualCellLocation *vcell_loc) { SheetBlock *block; VirtualCellLocation vc_loc = { 1, 0 }; g_return_val_if_fail(y >= 0, NULL); g_return_val_if_fail(x >= 0, NULL); do { block = gnucash_sheet_get_block (grid->sheet, vc_loc); if (!block) return NULL; if (block->visible && y >= block->origin_y && y < block->origin_y + block->style->dimensions->height) { if (vcell_loc) vcell_loc->virt_row = vc_loc.virt_row; break; } vc_loc.virt_row++; } while (vc_loc.virt_row < grid->sheet->num_virt_rows); if (vc_loc.virt_row == grid->sheet->num_virt_rows) return NULL; do { block = gnucash_sheet_get_block (grid->sheet, vc_loc); if (!block) return NULL; if (block->visible && x >= block->origin_x && x < block->origin_x + block->style->dimensions->width) { if (vcell_loc) vcell_loc->virt_col = vc_loc.virt_col; break; } vc_loc.virt_col++; } while (vc_loc.virt_col < grid->sheet->num_virt_cols); if (vc_loc.virt_col == grid->sheet->num_virt_cols) return NULL; return block; }
/* * Returns the coordinates for the editor bounding box */ void gnc_item_edit_get_pixel_coords (GncItemEdit *item_edit, int *x, int *y, int *w, int *h) { GnucashSheet *sheet = item_edit->sheet; SheetBlock *block; int xd, yd; block = gnucash_sheet_get_block (sheet, item_edit->virt_loc.vcell_loc); if (block == NULL) return; xd = block->origin_x; yd = block->origin_y; gnucash_sheet_style_get_cell_pixel_rel_coords (item_edit->style, item_edit->virt_loc.phys_row_offset, item_edit->virt_loc.phys_col_offset, x, y, w, h); // alter cell size of first column if (item_edit->virt_loc.phys_col_offset == 0) { *x = *x + 1; *w = *w - 1; } *x += xd; *y += yd; }
static gboolean gnucash_grid_find_cell_by_pixel (GnucashGrid *grid, gint x, gint y, VirtualLocation *virt_loc) { SheetBlock *block; SheetBlockStyle *style; CellDimensions *cd; gint row = 0; gint col = 0; g_return_val_if_fail (virt_loc != NULL, FALSE); block = gnucash_sheet_get_block (grid->sheet, virt_loc->vcell_loc); if (block == NULL) return FALSE; /* now make x, y relative to the block origin */ x -= block->origin_x; y -= block->origin_y; style = block->style; if (style == NULL) return FALSE; do { cd = gnucash_style_get_cell_dimensions (style, row, 0); if (y >= cd->origin_y && y < cd->origin_y + cd->pixel_height) break; row++; } while (row < style->nrows); if (row == style->nrows) return FALSE; do { cd = gnucash_style_get_cell_dimensions (style, row, col); if (x >= cd->origin_x && x < cd->origin_x + cd->pixel_width) break; col++; } while (col < style->ncols); if (col == style->ncols) return FALSE; if (virt_loc) virt_loc->phys_row_offset = row; if (virt_loc) virt_loc->phys_col_offset = col; return TRUE; }
static void gnucash_cursor_get_pixel_coords (GnucashCursor *cursor, gint *x, gint *y, gint *w, gint *h) { GnucashSheet *sheet = cursor->sheet; VirtualCellLocation vcell_loc; CellDimensions *cd; VirtualCell *vcell; SheetBlock *block; gint col; vcell_loc.virt_row = cursor->row; vcell_loc.virt_col = cursor->col; block = gnucash_sheet_get_block (sheet, vcell_loc); if (!block) return; vcell = gnc_table_get_virtual_cell (sheet->table, vcell_loc); if (!vcell) return; for (col = 0; col < vcell->cellblock->num_cols; col++) { BasicCell *cell; cell = gnc_cellblock_get_cell (vcell->cellblock, 0, col); if (cell && cell->cell_name) break; } *y = block->origin_y; cd = gnucash_style_get_cell_dimensions (block->style, 0, col); if (cd) *x = cd->origin_x; else *x = block->origin_x; for (col = vcell->cellblock->num_cols - 1; col >= 0; col--) { BasicCell *cell; cell = gnc_cellblock_get_cell (vcell->cellblock, 0, col); if (cell && cell->cell_name) break; } *h = block->style->dimensions->height; cd = gnucash_style_get_cell_dimensions (block->style, 0, col); if (cd) *w = cd->origin_x + cd->pixel_width - *x; else *w = block->style->dimensions->width - *x; }