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; }
/** * value_area_foreach: * @v: const #GnmValue * @ep: const #GnmEvalPos * @flags: #CellIterFlags * @func: (scope call): #GnmValueIterFunc * @user_data: * * For each existing element in an array or range , invoke the * callback routine. * * Returns: (transfer none): * non-NULL on error, or VALUE_TERMINATE if some invoked routine requested * to stop (by returning non-NULL). **/ GnmValue * value_area_foreach (GnmValue const *v, GnmEvalPos const *ep, CellIterFlags flags, GnmValueIterFunc func, gpointer user_data) { GnmValueIter v_iter; GnmValue *tmp; g_return_val_if_fail (func != NULL, NULL); if (VALUE_IS_CELLRANGE (v)) { WrapperClosure wrap; GnmRange r; Sheet *start_sheet, *end_sheet; gnm_rangeref_normalize (&v->v_range.cell, ep, &start_sheet, &end_sheet, &r); wrap.v_iter.ep = ep; wrap.v_iter.region = v; wrap.func = func; wrap.user_data = user_data; wrap.base_col = r.start.col; wrap.base_row = r.start.row; return workbook_foreach_cell_in_range (ep, v, flags, (CellIterFunc) cb_wrapper_foreach_cell_in_area, &wrap); } v_iter.ep = ep; v_iter.region = v; v_iter.cell_iter = NULL; /* If not an array, apply func to singleton */ if (!VALUE_IS_ARRAY (v)) { v_iter.x = v_iter.y = 0; v_iter.v = v; return (*func) (&v_iter, user_data); } for (v_iter.x = v->v_array.x; v_iter.x-- > 0;) for (v_iter.y = v->v_array.y; v_iter.y-- > 0;) { v_iter.v = v->v_array.vals [v_iter.x][v_iter.y]; if ((tmp = (*func)(&v_iter, user_data)) != NULL) return tmp; } return NULL; }
GnmValue * global_range_list_foreach (GSList *gr_list, GnmEvalPos const *ep, CellIterFlags flags, CellIterFunc handler, gpointer closure) { GnmValue *v; for (; gr_list != NULL; gr_list = gr_list->next) { v = workbook_foreach_cell_in_range (ep, gr_list->data, flags, handler, closure); if (v != NULL) return v; } return NULL; }