ValidationStatus gnm_validation_eval_range (WorkbookControl *wbc, Sheet *sheet, GnmCellPos const *pos, GnmRange const *r, gboolean *showed_dialog) { GnmValue *result; validation_eval_t closure; GnmEvalPos ep; GnmValue *cell_range = value_new_cellrange_r (sheet, r); closure.wbc = wbc; closure.sheet = sheet; closure.pos = pos; closure.showed_dialog = showed_dialog; closure.status = GNM_VALIDATION_STATUS_VALID; eval_pos_init_pos (&ep, sheet, pos); result = workbook_foreach_cell_in_range (&ep, cell_range, CELL_ITER_ALL, (CellIterFunc) validation_eval_range_cb, &closure); value_release (cell_range); if (result == NULL) return GNM_VALIDATION_STATUS_VALID; return closure.status; }
void gnm_scenario_item_set_range (GnmScenarioItem *sci, const GnmSheetRange *sr) { if (sr) { GnmValue *v = value_new_cellrange_r (sr->sheet != sci->dep.sheet ? sr->sheet : NULL, &sr->range); GnmExprTop const *texpr = gnm_expr_top_new_constant (v); dependent_managed_set_expr (&sci->dep, texpr); gnm_expr_top_unref (texpr); } else dependent_managed_set_expr (&sci->dep, NULL); }
static GnmExpr const *analysis_tool_combine_area (GnmValue *val_1, GnmValue *val_2, Workbook *wb) { GnmFunc *fd_array; GnmExpr const *expr; if (val_1->type == VALUE_CELLRANGE && val_2->type == VALUE_CELLRANGE && val_1->v_range.cell.a.sheet == val_2->v_range.cell.a.sheet) { GnmRange r_1, r_2; gboolean combined = FALSE; range_init_rangeref (&r_1, &val_1->v_range.cell); range_init_rangeref (&r_2, &val_2->v_range.cell); if (r_1.start.row == r_2.start.row && range_height (&r_1) == range_height (&r_2)) { if (r_1.end.col == r_2.start.col - 1) { combined = TRUE; r_1.end.col = r_2.end.col; } else if (r_2.end.col == r_1.start.col - 1) { combined = TRUE; r_1.start.col = r_2.start.col; } } else if (r_1.start.col == r_2.start.col && range_width (&r_1) == range_width (&r_2)) { if (r_1.end.row == r_2.start.row - 1) { combined = TRUE; r_1.end.row = r_2.end.row; } else if (r_2.end.row == r_1.start.row - 1) { combined = TRUE; r_1.start.row = r_2.start.row; } } if (combined) { GnmValue *val = value_new_cellrange_r (val_1->v_range.cell.a.sheet, &r_1); return gnm_expr_new_constant (val); } } fd_array = gnm_func_lookup_or_add_placeholder ("ARRAY"); gnm_func_ref (fd_array); expr = gnm_expr_new_funcall2 (fd_array, gnm_expr_new_constant (value_dup (val_1)), gnm_expr_new_constant (value_dup (val_2))); gnm_func_unref (fd_array); return expr; }
static GnmValue * get_single_cache_key_from_value (GnmValue const *r, GnmEvalPos const *ep) { GnmValue *key; GnmSheetRange sr; GnmRangeRef const *rr; Sheet *end_sheet; int h, w; const int min_size = 25; rr = value_get_rangeref (r); gnm_rangeref_normalize (rr, ep, &sr.sheet, &end_sheet, &sr.range); if (sr.sheet != end_sheet) return NULL; /* 3D */ h = range_height (&sr.range); w = range_width (&sr.range); if (h < min_size && w < min_size && h * w < min_size) return NULL; key = value_new_cellrange_r (sr.sheet, &sr.range); return key; }