static void cb_dialog_goto_go_clicked (G_GNUC_UNUSED GtkWidget *button, GotoState *state) { GnmEvalPos ep; GnmRangeRef range; gint cols = gtk_spin_button_get_value_as_int (state->spin_cols); gint rows = gtk_spin_button_get_value_as_int (state->spin_rows); GnmValue *val = dialog_goto_get_val (state); Sheet *sheet = wb_control_cur_sheet (WORKBOOK_CONTROL (state->wbcg)); if (val == NULL) return; val->v_range.cell.b.row = val->v_range.cell.a.row + (rows - 1); val->v_range.cell.b.col = val->v_range.cell.a.col + (cols - 1); eval_pos_init_sheet (&ep, sheet); gnm_cellref_make_abs (&range.a, &val->v_range.cell.a, &ep); gnm_cellref_make_abs (&range.b, &val->v_range.cell.b, &ep); value_release (val); wb_control_jump (WORKBOOK_CONTROL (state->wbcg), sheet, &range); #if 0 gnome_entry_append_history (state->goto_text, TRUE, text); #endif return; }
/* * 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); }
GnmSolver * nlsolve_solver_factory (GnmSolverFactory *factory, GnmSolverParameters *params) { GnmSolver *res = g_object_new (GNM_SOLVER_TYPE, "params", params, NULL); GnmNlsolve *nl = g_new0 (GnmNlsolve, 1); GSList *input_cells, *l; int n; GnmValue const *vinput = gnm_solver_param_get_input (params); GnmEvalPos ep; GnmCellRef origin; nl->parent = GNM_SOLVER (res); nl->maximize = (params->problem_type == GNM_SOLVER_MAXIMIZE); eval_pos_init_sheet (&ep, params->sheet); if (vinput) { gnm_cellref_make_abs (&origin, &vinput->v_range.cell.a, &ep); nl->origin.col = origin.col; nl->origin.row = origin.row; nl->input_width = value_area_get_width (vinput, &ep); nl->input_height = value_area_get_height (vinput, &ep); } nl->debug = gnm_solver_debug (); nl->max_iter = params->options.max_iter; nl->min_factor = 1e-10; nl->target = gnm_solver_param_get_target_cell (params); nl->vars = g_ptr_array_new (); input_cells = gnm_solver_param_get_input_cells (params); for (l = input_cells; l; l = l->next) g_ptr_array_add (nl->vars, l->data); g_slist_free (input_cells); n = nl->vars->len; nl->x0 = g_new (gnm_float, n); nl->xk = g_new (gnm_float, n); g_signal_connect (res, "prepare", G_CALLBACK (gnm_nlsolve_prepare), nl); g_signal_connect (res, "start", G_CALLBACK (gnm_nlsolve_start), nl); g_signal_connect (res, "stop", G_CALLBACK (gnm_nlsolve_stop), nl); g_object_set_data_full (G_OBJECT (res), PRIVATE_KEY, nl, (GDestroyNotify)gnm_nlsolve_final); return res; }