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; }
static GODataCache * gdcs_allocate (GODataCacheSource const *src) { GnmDataCacheSource *gdcs = (GnmDataCacheSource *)src; GODataCache *res; g_return_val_if_fail (gdcs->src_sheet != NULL, NULL); if (NULL != gdcs->src_name) { GnmParsePos pp; GnmEvalPos ep; GnmNamedExpr *nexpr = expr_name_lookup ( parse_pos_init_sheet (&pp, gdcs->src_sheet), gdcs->src_name->str); if (NULL != nexpr) { GnmValue *v = expr_name_eval (nexpr, eval_pos_init_sheet (&ep, gdcs->src_sheet), GNM_EXPR_EVAL_PERMIT_NON_SCALAR | GNM_EXPR_EVAL_PERMIT_EMPTY); if (NULL != v) { value_release (v); } } } res = g_object_new (GO_DATA_CACHE_TYPE, NULL); return res; }
/** * dialog_goal_seek: * @wbcg: * @sheet: * * Create the dialog (guru). * **/ void dialog_goal_seek (WBCGtk *wbcg, Sheet *sheet) { GoalSeekState *state; GladeXML *gui; g_return_if_fail (IS_SHEET (sheet)); /* Testing hook. */ if (wbcg == NULL) { GnmRangeRef *range = g_object_get_data (G_OBJECT (sheet), "ssconvert-goal-seek"); if (range) { Sheet *start_sheet, *end_sheet; GnmEvalPos ep; GnmRange r; gnm_rangeref_normalize (range, eval_pos_init_sheet (&ep, sheet), &start_sheet, &end_sheet, &r); g_return_if_fail (start_sheet == sheet); dialog_goal_seek_test (sheet, &r); return; } } g_return_if_fail (wbcg != NULL); /* Only pop up one copy per workbook */ if (gnumeric_dialog_raise_if_exists (wbcg, GOALSEEK_KEY)) return; gui = gnm_glade_xml_new (GO_CMD_CONTEXT (wbcg), "goalseek.glade", NULL, NULL); if (gui == NULL) return; state = g_new (GoalSeekState, 1); state->wbcg = wbcg; state->wb = wb_control_get_workbook (WORKBOOK_CONTROL (wbcg)); state->sheet = sheet; state->gui = gui; state->warning_dialog = NULL; state->cancelled = TRUE; if (dialog_init (state)) { go_gtk_notice_dialog (wbcg_toplevel (wbcg), GTK_MESSAGE_ERROR, _("Could not create the Goal-Seek dialog.")); g_free (state); return; } gnumeric_keyed_dialog (state->wbcg, GTK_WINDOW (state->dialog), GOALSEEK_KEY); gtk_widget_show (state->dialog); }
/* * Advanced Filter tool. */ gint advanced_filter (WorkbookControl *wbc, data_analysis_output_t *dao, GnmValue *database, GnmValue *criteria, gboolean unique_only_flag) { GSList *crit, *rows; GnmEvalPos ep; GnmRange r, s; SheetView *sv; Sheet *sheet = criteria->v_range.cell.a.sheet; /* I don't like this -- minimal fix for now. 509427. */ if (!VALUE_IS_CELLRANGE (criteria)) return analysis_tools_invalid_field; crit = parse_database_criteria ( eval_pos_init_sheet (&ep, wb_control_cur_sheet (wbc)), database, criteria); if (crit == NULL) return analysis_tools_invalid_field; rows = find_rows_that_match (sheet, database->v_range.cell.a.col, database->v_range.cell.a.row + 1, database->v_range.cell.b.col, database->v_range.cell.b.row, crit, unique_only_flag); free_criterias (crit); if (rows == NULL) return analysis_tools_no_records_found; dao_prepare_output (wbc, dao, _("Filtered")); filter (dao, sheet, rows, database->v_range.cell.a.col, database->v_range.cell.b.col, database->v_range.cell.a.row, database->v_range.cell.b.row); g_slist_free_full (rows, (GDestroyNotify)g_free); sv = sheet_get_view (sheet, wb_control_view (wbc)); s = r = *(selection_first_range (sv, NULL, NULL)); r.end.row = r.start.row; sv_selection_reset (sv); sv_selection_add_range (sv, &r); sv_selection_add_range (sv, &s); wb_control_menu_state_update (wbc, MS_FILTER_STATE_CHANGED); return analysis_tools_noerr; }
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; }
/** * stf_export_sheet: * @stfe: an export options struct * @sheet: the sheet to export * * Writes the @sheet to the callback function * * Return value: returns TRUE on success, FALSE otherwise **/ static gboolean stf_export_sheet (GnmStfExport *stfe, Sheet *sheet) { int col, row; GnmRange r; GnmRangeRef *range; g_return_val_if_fail (stfe != NULL, FALSE); g_return_val_if_fail (IS_SHEET (sheet), FALSE); range = g_object_get_data (G_OBJECT (sheet->workbook), "ssconvert-range"); if (range) { Sheet *start_sheet, *end_sheet; GnmEvalPos ep; gnm_rangeref_normalize (range, eval_pos_init_sheet (&ep, sheet), &start_sheet, &end_sheet, &r); if (start_sheet != sheet) return TRUE; } else r = sheet_get_extent (sheet, FALSE, TRUE); for (row = r.start.row; row <= r.end.row; row++) { for (col = r.start.col; col <= r.end.col; col++) { GnmCell *cell = sheet_cell_get (sheet, col, row); if (!stf_export_cell (stfe, cell)) return FALSE; } if (!gsf_output_csv_write_eol (GSF_OUTPUT_CSV (stfe))) return FALSE; } return TRUE; }
static gboolean analysis_tool_advanced_filter_engine_run (data_analysis_output_t *dao, analysis_tools_data_advanced_filter_t *info) { GnmRange range; char *name; GnmValue *database = info->base.range_1; GnmValue *criteria = info->base.range_2; gint err = analysis_tools_noerr; GSList *crit, *rows; GnmEvalPos ep; dao_set_italic (dao, 0, 0, 0, 2); set_cell_text_col (dao, 0, 0, _("/Advanced Filter:" "/Source Range:" "/Criteria Range:")); range_init_value (&range, database); name = global_range_name (database->v_range.cell.a.sheet, &range); dao_set_cell (dao, 1, 1, name); g_free (name); range_init_value (&range, criteria); name = global_range_name (criteria->v_range.cell.a.sheet, &range); dao_set_cell (dao, 1, 2, name); g_free (name); dao->offset_row = 3; crit = parse_database_criteria ( eval_pos_init_sheet (&ep, wb_control_cur_sheet (info->base.wbc)), database, criteria); if (crit == NULL) { err = analysis_tools_invalid_field; goto finish; } rows = find_rows_that_match (database->v_range.cell.a.sheet, database->v_range.cell.a.col, database->v_range.cell.a.row + 1, database->v_range.cell.b.col, database->v_range.cell.b.row, crit, info->unique_only_flag); free_criterias (crit); if (rows == NULL) { err = analysis_tools_no_records_found; goto finish; } filter (dao, database->v_range.cell.a.sheet, rows, database->v_range.cell.a.col, database->v_range.cell.b.col, database->v_range.cell.a.row, database->v_range.cell.b.row); g_slist_free_full (rows, (GDestroyNotify)g_free); finish: if (err != analysis_tools_noerr) { dao_set_merge (dao, 0,0, 1, 0); if (err == analysis_tools_no_records_found) dao_set_cell (dao, 0, 0, _("No matching records were found.")); else if (err == analysis_tools_invalid_field) dao_set_cell (dao, 0, 0, _("The given criteria are invalid.")); else dao_set_cell_printf (dao, 0, 0, _("An unexpected error has occurred: " "%d."), err); } dao_redraw_respan (dao); return analysis_tools_noerr; }