int gnumeric_sheet_set_cell_as_string(GnumericSheetPtr sheet, int x, int y, const char *str) { GnmCell *cell = sheet_cell_get((Sheet*)sheet,x,y); if (cell==NULL) { cell = sheet_cell_create((Sheet*)sheet,x,y); } // When we have set up cell types better, we can try this: // sheet_cell_set_text(cell,str,NULL); // For now we quote everything as strings: GnmValue *val = value_new_string(str); sheet_cell_set_value(cell,val); /* GnmStyle *mstyle; mstyle = gnm_style_new (); //gnm_style_set_format_text (mstyle, format); //gnm_style_get_pango_attrs(mstyle,NULL,1.0) printf("Setting WEIGHT\n"); gnm_style_set_font_strike (mstyle, TRUE); //gnm_style_set_font_bold (mstyle, TRUE); printf("Done.\n"); GnmRange r; r.start = r.end = cell->pos; sheet_style_apply_range (cell->base.sheet, &r, mstyle); */ return 0; }
/** * gnm_scenario_apply: * @sc: #GnmScenario * * Returns: (transfer full): the newly allocated #GOUndo. **/ GOUndo * gnm_scenario_apply (GnmScenario *sc) { GOUndo *undo = NULL; GSList *l; g_return_val_if_fail (GNM_IS_SCENARIO (sc), NULL); for (l = sc->items; l; l = l->next) { GnmScenarioItem *sci = l->data; GnmValue const *val = sci->value; GnmSheetRange sr; Sheet *sheet; if (!gnm_scenario_item_valid (sci, &sr)) continue; sheet = eval_sheet (sr.sheet, sc->sheet); if (val) { /* FIXME: think about arrays. */ GnmCell *cell = sheet_cell_fetch (sheet, sr.range.start.col, sr.range.start.row); sheet_cell_set_value (cell, value_dup (val)); } else { GOUndo *u = clipboard_copy_range_undo (sheet, &sr.range); /* FIXME: Clear the range. */ undo = go_undo_combine (undo, u); } } return undo; }
static void cb_dialog_cancel_clicked (G_GNUC_UNUSED GtkWidget *button, GoalSeekState *state) { state->cancelled = TRUE; if ((state->old_cell != NULL) && (state->old_value != NULL)) { sheet_cell_set_value (state->old_cell, state->old_value); workbook_recalc (state->wb); state->old_value = NULL; } gtk_widget_destroy (state->dialog); }
/* * We need a horizontal strip of 5 cells containing: * * 0. Formula cell. * 1: X value cell. * 2: Y target value. * 3: Min value. * 4: Max value. */ static void dialog_goal_seek_test (Sheet *sheet, const GnmRange *range) { GoalSeekState state; GnmCell *cell; int r, c; GoalSeekStatus status; g_return_if_fail (range->start.row == range->end.row); g_return_if_fail (range->start.col + 4 == range->end.col); memset (&state, 0, sizeof (state)); r = range->start.row; c = range->start.col; state.wb = sheet->workbook; state.sheet = sheet; state.set_cell = sheet_cell_fetch (sheet, c + 0, r); state.change_cell = sheet_cell_fetch (sheet, c + 1, r); state.old_value = value_dup (state.change_cell->value); cell = sheet_cell_fetch (sheet, c + 2, r); state.target_value = value_get_as_float (cell->value); cell = sheet_cell_fetch (sheet, c + 3, r); state.xmin = VALUE_IS_EMPTY (cell->value) ? -max_range_val : value_get_as_float (cell->value); cell = sheet_cell_fetch (sheet, c + 4, r); state.xmax = VALUE_IS_EMPTY (cell->value) ? max_range_val : value_get_as_float (cell->value); status = gnumeric_goal_seek (&state); if (status == GOAL_SEEK_OK) { /* Nothing */ } else { sheet_cell_set_value (state.change_cell, value_new_error_VALUE (NULL)); } value_release (state.old_value); }
static GoalSeekStatus goal_seek_eval (gnm_float x, gnm_float *y, void *vevaldata) { GoalEvalData const *evaldata = vevaldata; GnmValue *v = value_new_float (x); if (evaldata->update_ui) { sheet_cell_set_value (evaldata->xcell, v); } else { gnm_cell_set_value (evaldata->xcell, v); cell_queue_recalc (evaldata->xcell); } workbook_recalc (evaldata->state->wb); if (evaldata->ycell->value) { *y = value_get_as_float (evaldata->ycell->value) - evaldata->ytarget; if (gnm_finite (*y)) return GOAL_SEEK_OK; } return GOAL_SEEK_ERROR; }
static GODataCache * build_cache(void) { Workbook *wb; Sheet *sheet; GODataCache *cache; GnmRange *range; int row, col, numRows = 60, numCols = 5; wb = workbook_new(); sheet = workbook_sheet_add (wb, -1, 1024, 1024); for (row = 0; row < numRows; row++) { for (col = 0; col < numCols; col++) { GnmCell * tempCell = sheet_cell_create(sheet, col, row); GnmValue * tempVal; if (col == 0) { if (row%4 == 0) { tempVal = value_new_string_nocopy((char *)"A"); } else if (row%4 == 1) { tempVal = value_new_string_nocopy((char *)"B"); } else if (row%4 == 2) { tempVal = value_new_string_nocopy((char *)"C"); } else { tempVal = value_new_string_nocopy((char *)"D"); } } else if (col == 1) { tempVal = value_new_int(row); } else if (col == 2) { if (row%5 == 0) { tempVal = value_new_float(14.4); } else if (row%5 == 1) { tempVal = value_new_float(18.8); } else if (row%5 == 2) { tempVal = value_new_float(7.6); } else if (row%5 == 3) { tempVal = value_new_float(3.3); } else { tempVal = value_new_float(11.6); } } else if (col == 3) { tempVal = value_new_int(row % 10); } else if (col == 4) { if (row == 0) { GnmEvalPos *pos = g_new(GnmEvalPos, 1); pos = eval_pos_init(pos, sheet, col, row); tempVal = value_new_error_DIV0(pos); } else if (row == 1) { GnmEvalPos *pos = g_new(GnmEvalPos, 1); pos = eval_pos_init(pos, sheet, col, row); tempVal = value_new_error_NA(pos); } else if (row == 2) { GnmEvalPos *pos = g_new(GnmEvalPos, 1); pos = eval_pos_init(pos, sheet, col, row); tempVal = value_new_error_REF(pos); } else if (row == 3) { tempVal = value_new_bool(TRUE); } else if (row == 4) { tempVal = value_new_bool(FALSE); } else if (row == 5) { tempVal = value_new_empty(); } else { if (row%5 == 1) { tempVal = value_new_string_nocopy((char *)"a"); } else if (row%5 == 2) { tempVal = value_new_string_nocopy((char *)"b"); } else if (row%5 == 3) { tempVal = value_new_string_nocopy((char *)"c"); } else if (row%5 == 4) { tempVal = value_new_string_nocopy((char *)"d"); } else { tempVal = value_new_string_nocopy((char *)"e"); } } } sheet_cell_set_value(tempCell, tempVal); } } cache = g_object_new(GO_DATA_CACHE_TYPE, NULL); range = g_new(GnmRange, 1); range = range_init(range, 0, 0, numCols - 1, numRows - 1); go_data_cache_build_cache(cache, sheet, range); g_object_unref (wb); return cache; }
/** * cb_dialog_apply_clicked: * @button: * @state: * * Close (destroy) the dialog **/ static void cb_dialog_apply_clicked (G_GNUC_UNUSED GtkWidget *button, GoalSeekState *state) { char *status_str; GoalSeekStatus status; GnmValue *target; GnmRangeRef const *r; GOFormat *format; if (state->warning_dialog != NULL) gtk_widget_destroy (state->warning_dialog); /* set up source */ target = gnm_expr_entry_parse_as_value (state->set_cell_entry, state->sheet); if (target == NULL) { go_gtk_notice_nonmodal_dialog (GTK_WINDOW(state->dialog), &(state->warning_dialog), GTK_MESSAGE_ERROR, _("You should introduce a valid cell " "name in 'Set Cell:'!")); gnm_expr_entry_grab_focus (state->set_cell_entry, TRUE); return; } r = &target->v_range.cell; state->set_cell = sheet_cell_get (r->a.sheet, r->a.col, r->a.row); value_release (target); if (state->set_cell == NULL || !gnm_cell_has_expr (state->set_cell)) { go_gtk_notice_nonmodal_dialog (GTK_WINDOW(state->dialog), &(state->warning_dialog), GTK_MESSAGE_ERROR, _("The cell named in 'Set Cell:' " "must contain a formula!")); gnm_expr_entry_grab_focus (state->set_cell_entry, TRUE); return; } /* set up source */ target = gnm_expr_entry_parse_as_value (state->change_cell_entry, state->sheet); if (target == NULL) { go_gtk_notice_nonmodal_dialog (GTK_WINDOW(state->dialog), &(state->warning_dialog), GTK_MESSAGE_ERROR, _("You should introduce a valid cell " "name in 'By Changing Cell:'!")); gnm_expr_entry_grab_focus (state->change_cell_entry, TRUE); return; } r = &target->v_range.cell; state->change_cell = sheet_cell_fetch (r->a.sheet, r->a.col, r->a.row); value_release (target); if (gnm_cell_has_expr (state->change_cell)) { go_gtk_notice_nonmodal_dialog (GTK_WINDOW(state->dialog), &(state->warning_dialog), GTK_MESSAGE_ERROR, _("The cell named in 'By changing cell' " "must not contain a formula.")); gnm_expr_entry_grab_focus (state->change_cell_entry, TRUE); return; } format = gnm_style_get_format (gnm_cell_get_style (state->set_cell)); if (entry_to_float_with_format (GTK_ENTRY(state->to_value_entry), &state->target_value, TRUE, format)){ go_gtk_notice_nonmodal_dialog (GTK_WINDOW(state->dialog), &(state->warning_dialog), GTK_MESSAGE_ERROR, _("The value given in 'To Value:' " "is not valid.")); focus_on_entry (GTK_ENTRY(state->to_value_entry)); return; } format = gnm_style_get_format (gnm_cell_get_style (state->change_cell)); if (entry_to_float_with_format (GTK_ENTRY(state->at_least_entry), &state->xmin, TRUE, format)) { state->xmin = -max_range_val; gtk_entry_set_text (GTK_ENTRY (state->at_least_entry), ""); } if (entry_to_float_with_format (GTK_ENTRY(state->at_most_entry), &state->xmax, TRUE, format)) { state->xmax = +max_range_val; gtk_entry_set_text (GTK_ENTRY (state->at_most_entry), ""); } if ((state->old_cell != NULL) && (state->old_value != NULL)) { sheet_cell_set_value (state->old_cell, state->old_value); workbook_recalc (state->wb); state->old_value = NULL; } state->old_cell = state->change_cell; state->old_value = value_dup (state->change_cell->value); status = gnumeric_goal_seek (state); switch (status) { case GOAL_SEEK_OK: { const char *actual_str; const char *solution_str; GOFormat *format = go_format_general (); GnmValue *error_value = value_new_float (state->target_value - value_get_as_float (state->set_cell->value)); char *target_str = format_value (format, error_value, NULL, -1, workbook_date_conv (state->wb)); gtk_label_set_text (GTK_LABEL (state->target_value_label), target_str); g_free (target_str); value_release (error_value); status_str = g_strdup_printf (_("Goal seeking with cell %s found a solution."), cell_name (state->set_cell)); gtk_label_set_text (GTK_LABEL (state->result_label), status_str); g_free (status_str); /* FIXME? Do a format? */ actual_str = state->set_cell->value ? value_peek_string (state->set_cell->value) : ""; gtk_label_set_text (GTK_LABEL (state->current_value_label), actual_str); solution_str = state->change_cell->value ? value_peek_string (state->change_cell->value) : ""; gtk_label_set_text (GTK_LABEL (state->solution_label), solution_str); break; } default: status_str = g_strdup_printf (_("Goal seeking with cell %s did not find a solution."), cell_name (state->set_cell)); gtk_label_set_text (GTK_LABEL (state->result_label), status_str); g_free (status_str); gtk_label_set_text (GTK_LABEL (state->current_value_label), ""); gtk_label_set_text (GTK_LABEL (state->solution_label), ""); gtk_label_set_text (GTK_LABEL (state->target_value_label), ""); break; } state->cancelled = FALSE; gtk_widget_show (state->result_table); return; }