static void cb_dialog_so_styled_response (GtkWidget *dialog, gint response_id, DialogSOStyled *state) { if (response_id == GTK_RESPONSE_HELP) return; if (response_id == GTK_RESPONSE_OK) { GSList *new_props = go_object_properties_collect (state->so); force_new_style (state->so); cmd_generic (GNM_WBC (state->wbcg), _("Format Object"), make_undo (state->so, state->orig_props), make_undo (state->so, new_props)); state->orig_props = NULL; } gtk_widget_destroy (dialog); }
static void check_for_changed_options (SolverState *state) { Sheet *sheet = state->sheet; if (!gnm_solver_param_equal (sheet->solver_parameters, state->orig_params)) { GOUndo *undo = set_params (sheet, state->orig_params); GOUndo *redo = set_params (sheet, sheet->solver_parameters); cmd_generic (GNM_WBC (state->wbcg), _("Changing solver parameters"), undo, redo); g_object_unref (state->orig_params); state->orig_params = gnm_solver_param_dup (sheet->solver_parameters, sheet); } }
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; }
static void cb_dialog_so_size_apply_clicked (G_GNUC_UNUSED GtkWidget *button, SOSizeState *state) { char const *name; GOUndo *undo = NULL, *redo = NULL; char const *undo_name = NULL; int cnt = 0; if (state->so_size_needs_restore || state->so_pos_needs_restore) { char const *label = state->so_pos_needs_restore ? _("Move Object") : _("Resize Object"); sheet_object_set_anchor (state->so, state->old_anchor); if (!cmd_objects_move (GNM_WBC (state->wbcg), g_slist_prepend (NULL, state->so), g_slist_prepend (NULL, sheet_object_anchor_dup (state->active_anchor)), FALSE, label)) dialog_so_size_load (state); } name = gtk_entry_get_text (state->nameentry); if (name == NULL) name = ""; if (strcmp (name, state->old_name) != 0) { char *old_name, *new_name; g_object_get (G_OBJECT (state->so), "name", &old_name, NULL); undo = go_undo_combine (undo, set_params (state->so, old_name)); new_name = (*name == '\0') ? NULL : g_strdup (name); redo = go_undo_combine (redo, set_params (state->so, new_name)); undo_name = _("Set Object Name"); cnt++; } if (state->so_print_check_changed) { gboolean val = ((state->so->flags & SHEET_OBJECT_PRINT) != 0); undo = go_undo_combine (undo, set_print_flag (state->so, val)); redo = go_undo_combine (redo, set_print_flag (state->so, !val)); undo_name = _("Set Object Print Property"); cnt++; } if (state->so_mode_changed) { int new_mode = gnm_so_anchor_mode_chooser_get_mode (state->modecombo); int old_mode = state->so->anchor.mode; undo = go_undo_combine (undo, set_mode (state->so, old_mode)); redo = go_undo_combine (redo, set_mode (state->so, new_mode)); undo_name = _("Set Object Anchor Mode"); cnt++; } if (cnt > 0) { if (cnt > 1) undo_name = _("Set Object Properties"); state->so_name_changed = state->so_print_check_changed = state->so_mode_changed = cmd_generic (GNM_WBC (state->wbcg), undo_name, undo, redo); } dialog_so_size_button_sensitivity (state); return; }