static GOUndo * set_params (Sheet *sheet, GnmSolverParameters *params) { return go_undo_binary_new (sheet, g_object_ref (params), (GOUndoBinaryFunc)gnm_sheet_set_solver_params, NULL, g_object_unref); }
static GOUndo * set_params (SheetObject *so, char *name) { return go_undo_binary_new (g_object_ref (so), name, (GOUndoBinaryFunc)sheet_object_set_name, g_object_unref, g_free); }
static GOUndo * make_undo (GObject *so, GSList *props) { return go_undo_binary_new (g_object_ref (so), props, cb_set_props, g_object_unref, (GFreeFunc)go_object_properties_free); }
/** * clipboard_copy_range_undo: * @sheet: #Sheet * @r: #GnmRange * * Returns: (transfer full): A #GOUndo object that will restore the contents * of the given range. **/ GOUndo * clipboard_copy_range_undo (Sheet *sheet, GnmRange const *r) { GnmCellRegion *cr = clipboard_copy_range (sheet, r); g_return_val_if_fail (cr != NULL, NULL); return go_undo_binary_new (cr, gnm_sheet_range_new (sheet, r), (GOUndoBinaryFunc)cb_clipboard_copy_range_undo, (GFreeFunc)cellregion_unref, (GFreeFunc)g_free); }
static GOUndo * set_print_flag (SheetObject *so, gboolean print) { gboolean *p_print = g_new (gboolean, 1); *p_print = print; return go_undo_binary_new (g_object_ref (so), p_print, (GOUndoBinaryFunc)sheet_object_set_print_flag, g_object_unref, g_free); }
static GOUndo * set_mode (SheetObject *so, GnmSOAnchorMode mode) { GnmSOAnchorMode *p_mode = g_new (GnmSOAnchorMode, 1); *p_mode = mode; return go_undo_binary_new (g_object_ref (so), p_mode, (GOUndoBinaryFunc)sheet_object_set_anchor_mode, g_object_unref, g_free); }
GOUndo * expr_name_set_expr_undo_new (GnmNamedExpr *ne) { expr_name_ref (ne); gnm_expr_top_ref (ne->texpr); return go_undo_binary_new (ne, (gpointer)ne->texpr, (GOUndoBinaryFunc)expr_name_set_expr_ref, (GFreeFunc)expr_name_unref, (GFreeFunc)gnm_expr_top_unref); }
static GnmSolverResult * run_solver (SolverState *state, GnmSolverParameters *param) { GError *err = NULL; gboolean ok; GnmSheetRange sr; GOUndo *undo = NULL; GnmSolver *sol = NULL; GnmValue const *vinput; GtkWindow *top = GTK_WINDOW (gtk_widget_get_toplevel (state->dialog)); GnmSolverResult *res = NULL; state->ref_count++; sol = gnm_solver_factory_functional (param->options.algorithm, state->wbcg) ? gnm_solver_factory_create (param->options.algorithm, param) : NULL; if (!sol) { go_gtk_notice_dialog (top, GTK_MESSAGE_ERROR, _("The chosen solver is not functional.")); goto fail; } gtk_notebook_set_current_page (GTK_NOTEBOOK (state->notebook), -1); state->run.solver = sol; vinput = gnm_solver_param_get_input (param); gnm_sheet_range_from_value (&sr, vinput); if (!sr.sheet) sr.sheet = param->sheet; undo = clipboard_copy_range_undo (sr.sheet, &sr.range); g_signal_connect_swapped (G_OBJECT (sol), "notify::status", G_CALLBACK (cb_notify_status), state); g_signal_connect_swapped (G_OBJECT (sol), "notify::reason", G_CALLBACK (cb_notify_status), state); cb_notify_status (state); g_signal_connect_swapped (G_OBJECT (sol), "notify::result", G_CALLBACK (cb_notify_result), state); cb_notify_result (state); state->run.timer_source = g_timeout_add_seconds (1, (GSourceFunc)cb_timer_tick, state); cb_timer_tick (state); /* ---------------------------------------- */ ok = gnm_solver_start (sol, GNM_WBC (state->wbcg), &err); if (ok) { state->run.in_main++; go_cmd_context_set_sensitive (GO_CMD_CONTEXT (state->wbcg), FALSE); gtk_main (); go_cmd_context_set_sensitive (GO_CMD_CONTEXT (state->wbcg), TRUE); state->run.in_main--; ok = gnm_solver_has_solution (sol); } else if (err) { gnm_solver_set_reason (sol, err->message); } g_clear_error (&err); remove_objective_value_source (state); remove_timer_source (state); /* ---------------------------------------- */ if (ok) { GOUndo *redo; gnm_solver_store_result (sol); redo = clipboard_copy_range_undo (sr.sheet, &sr.range); if (param->options.program_report || param->options.sensitivity_report) { Workbook *wb = param->sheet->workbook; GOUndo *undo_report, *redo_report; undo_report = go_undo_binary_new (wb, workbook_sheet_state_new (wb), (GOUndoBinaryFunc)workbook_sheet_state_restore, NULL, (GFreeFunc)workbook_sheet_state_free); undo = go_undo_combine (undo, undo_report); create_report (sol, state); redo_report = go_undo_binary_new (wb, workbook_sheet_state_new (wb), (GOUndoBinaryFunc)workbook_sheet_state_restore, NULL, (GFreeFunc)workbook_sheet_state_free); redo = go_undo_combine (redo, redo_report); } cmd_generic (GNM_WBC (state->wbcg), _("Running solver"), undo, redo); res = g_object_ref (sol->result); undo = redo = NULL; } fail: if (undo) g_object_unref (undo); if (state->run.solver) { g_object_unref (state->run.solver); state->run.solver = NULL; } unref_state (state); return res; }