static void cb_check_name (G_GNUC_UNUSED gpointer key, GnmNamedExpr *nexpr, CheckName *user) { GnmValue *v; if (nexpr->scope == NULL || nexpr->is_hidden || !nexpr->texpr) return; v = gnm_expr_top_get_range (nexpr->texpr); if (v != NULL) { if (v->type == VALUE_CELLRANGE) { GnmRangeRef const *ref = &v->v_range.cell; if (!ref->a.col_relative && !ref->b.col_relative && !ref->a.row_relative && !ref->b.row_relative && eval_sheet (ref->a.sheet, user->sheet) == user->sheet && eval_sheet (ref->b.sheet, user->sheet) == user->sheet && MIN (ref->a.col, ref->b.col) == user->r->start.col && MAX (ref->a.col, ref->b.col) == user->r->end.col && MIN (ref->a.row, ref->b.row) == user->r->start.row && MAX (ref->a.row, ref->b.row) == user->r->end.row) user->res = nexpr; } value_release (v); } }
static GnmValue * dialog_goto_get_val (GotoState *state) { char const *text = gtk_entry_get_text (state->goto_text); Sheet *sheet = wb_control_cur_sheet (WORKBOOK_CONTROL (state->wbcg)); GnmValue *val = value_new_cellrange_str (sheet, text); if (val == NULL) { GnmParsePos pp; GnmNamedExpr *nexpr = expr_name_lookup (parse_pos_init_sheet (&pp, sheet), text); if (nexpr != NULL && !expr_name_is_placeholder (nexpr)) { val = gnm_expr_top_get_range (nexpr->texpr); } } return val; }
/* * This is called when something is entered in the location entry. * We either go there (if the text refers to a cell by address or * name), or we try to define a name for the selection. */ gboolean wb_control_parse_and_jump (WorkbookControl *wbc, char const *text) { Sheet *sheet = wb_control_cur_sheet (wbc); GnmParsePos pp; GnmEvalPos ep; GnmValue *target; GnmRangeRef range; SheetView *sv; if (text == NULL || *text == '\0') return FALSE; sv = wb_control_cur_sheet_view (wbc); parse_pos_init_editpos (&pp, sv); target = value_new_cellrange_parsepos_str (&pp, text, GNM_EXPR_PARSE_DEFAULT); if (target == NULL) { /* Not an address; is it a name? */ GnmParsePos pp; GnmNamedExpr *nexpr = expr_name_lookup ( parse_pos_init_sheet (&pp, sheet), text); /* If no name, or just a placeholder exists create a name */ if (nexpr == NULL || expr_name_is_placeholder (nexpr)) { wb_create_name (wbc, text, &pp); return FALSE; } else { target = gnm_expr_top_get_range (nexpr->texpr); if (target == NULL) { go_cmd_context_error_invalid (GO_CMD_CONTEXT (wbc), _("Address"), text); return FALSE; } } } eval_pos_init_editpos (&ep, sv); gnm_cellref_make_abs (&range.a, &target->v_range.cell.a, &ep); gnm_cellref_make_abs (&range.b, &target->v_range.cell.b, &ep); value_release (target); return wb_control_jump (wbc, sheet, &range); }
/** * global_range_list_parse: * @sheet: Sheet where the range specification is relatively parsed to * @str : a range or list of ranges to parse (ex: "A1", "A1:B1,C2,Sheet2!D2:D4") * * Parses a list of ranges, relative to the @sheet and returns a list with the * results. * * Returns a GSList containing Values of type VALUE_CELLRANGE, or NULL on failure **/ GSList * global_range_list_parse (Sheet *sheet, char const *str) { GnmParsePos pp; GnmExprTop const *texpr; GSList *ranges = NULL; GnmValue *v; g_return_val_if_fail (IS_SHEET (sheet), NULL); g_return_val_if_fail (str != NULL, NULL); texpr = gnm_expr_parse_str (str, parse_pos_init_sheet (&pp, sheet), GNM_EXPR_PARSE_FORCE_EXPLICIT_SHEET_REFERENCES | GNM_EXPR_PARSE_PERMIT_MULTIPLE_EXPRESSIONS | GNM_EXPR_PARSE_UNKNOWN_NAMES_ARE_STRINGS, NULL, NULL); if (texpr != NULL) { if (GNM_EXPR_GET_OPER (texpr->expr) == GNM_EXPR_OP_SET) { GnmExpr const *expr = texpr->expr; int i; for (i = 0; i < expr->set.argc; i++) { v = gnm_expr_get_range (expr->set.argv[i]); if (v == NULL) { range_list_destroy (ranges); ranges = NULL; break; } else ranges = g_slist_prepend (ranges, v); } } else { v = gnm_expr_top_get_range (texpr); if (v != NULL) ranges = g_slist_prepend (ranges, v); } gnm_expr_top_unref (texpr); } return g_slist_reverse (ranges); }