static void constraint_select_click (GtkTreeSelection *Selection, SolverState * state) { GtkTreeModel *store; GtkTreeIter iter; GnmSolverConstraint const *c; GnmValue const *lhs, *rhs; if (gtk_tree_selection_get_selected (Selection, &store, &iter)) gtk_tree_model_get (store, &iter, 1, &state->constr, -1); else state->constr = NULL; dialog_set_sec_button_sensitivity (NULL, state); if (state->constr == NULL) return; /* Fail? */ c = state->constr; lhs = gnm_solver_constraint_get_lhs (c); if (lhs) { GnmExprTop const *texpr = gnm_expr_top_new_constant (value_dup (lhs)); GnmParsePos pp; gnm_expr_entry_load_from_expr (state->lhs.entry, texpr, parse_pos_init_sheet (&pp, state->sheet)); gnm_expr_top_unref (texpr); } else gnm_expr_entry_load_from_text (state->lhs.entry, ""); rhs = gnm_solver_constraint_get_rhs (c); if (rhs && gnm_solver_constraint_has_rhs (c)) { GnmExprTop const *texpr = gnm_expr_top_new_constant (value_dup (rhs)); GnmParsePos pp; gnm_expr_entry_load_from_expr (state->rhs.entry, texpr, parse_pos_init_sheet (&pp, state->sheet)); gnm_expr_top_unref (texpr); } else gnm_expr_entry_load_from_text (state->rhs.entry, ""); gtk_combo_box_set_active (state->type_combo, c->type); }
/** * expr_name_downgrade_to_placeholder: * @nexpr: * * Takes a real non-placeholder name and converts it to being a placeholder. * unrefing its expression **/ void expr_name_downgrade_to_placeholder (GnmNamedExpr *nexpr) { g_return_if_fail (nexpr != NULL); expr_name_set_is_placeholder (nexpr, TRUE); expr_name_set_expr (nexpr, gnm_expr_top_new_constant (value_new_error_NAME (NULL))); }
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); }
/** * expr_name_add: * @pp: * @name: * @texpr: if texpr == NULL then create a placeholder with value #NAME? * @error_msg: * @link_to_container: * * Absorbs the reference to @texpr. * If @error_msg is non NULL it may hold a pointer to a translated descriptive * string. NOTE : caller is responsible for freeing the error message. * * The reference semantics of the new expression are * 1) new names with @link_to_container TRUE are referenced by the container. * The caller DOES NOT OWN a reference to the result, and needs to add their * own. * 2) if @link_to_container is FALSE the caller DOES OWN a reference, and * can free the result by unrefing the name. **/ GnmNamedExpr * expr_name_add (GnmParsePos const *pp, char const *name, GnmExprTop const *texpr, char **error_msg, gboolean link_to_container, GnmNamedExpr *stub) { GnmNamedExpr *nexpr = NULL; GnmNamedExprCollection *scope = NULL; g_return_val_if_fail (pp != NULL, NULL); g_return_val_if_fail (pp->sheet != NULL || pp->wb != NULL, NULL); g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (stub == NULL || stub->is_placeholder, NULL); if (texpr != NULL && expr_name_check_for_loop (name, texpr)) { gnm_expr_top_unref (texpr); if (error_msg) *error_msg = g_strdup_printf (_("'%s' has a circular reference"), name); return NULL; } scope = (pp->sheet != NULL) ? pp->sheet->names : pp->wb->names; /* see if there was a place holder */ nexpr = g_hash_table_lookup (scope->placeholders, name); if (nexpr != NULL) { if (texpr == NULL) { /* there was already a placeholder for this */ expr_name_ref (nexpr); return nexpr; } /* convert the placeholder into a real name */ g_hash_table_steal (scope->placeholders, name); nexpr->is_placeholder = FALSE; } else { nexpr = g_hash_table_lookup (scope->names, name); /* If this is a permanent name, we may be adding it */ /* on opening of a file, although */ /* the name is already in place. */ if (nexpr != NULL) { if (nexpr->is_permanent) link_to_container = FALSE; else { if (error_msg != NULL) *error_msg = (pp->sheet != NULL) ? g_strdup_printf (_("'%s' is already defined in sheet"), name) : g_strdup_printf (_("'%s' is already defined in workbook"), name); gnm_expr_top_unref (texpr); return NULL; } } } if (error_msg) *error_msg = NULL; if (nexpr == NULL) { if (stub != NULL) { nexpr = stub; stub->is_placeholder = FALSE; go_string_unref (stub->name); stub->name = go_string_new (name); } else { nexpr = expr_name_new (name); nexpr->is_placeholder = (texpr == NULL); } } parse_pos_init (&nexpr->pos, pp->wb, pp->sheet, pp->eval.col, pp->eval.row); if (texpr == NULL) texpr = gnm_expr_top_new_constant (value_new_error_NAME (NULL)); expr_name_set_expr (nexpr, texpr); if (link_to_container) gnm_named_expr_collection_insert (scope, nexpr); return nexpr; }