static void scenarios_delete_clicked_cb (G_GNUC_UNUSED GtkWidget *button, ScenariosState *state) { data_analysis_output_t dao; GtkTreeSelection *selection; GtkTreeIter iter; GtkTreeModel *model; gchar *value; gboolean all_deleted; GnmScenario *sc; GList *l; restore_old_values (state); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (state->scenarios_treeview)); dao_init_new_sheet (&dao); dao.sheet = state->base.sheet; if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) return; model = gtk_tree_view_get_model (GTK_TREE_VIEW (state->scenarios_treeview)); gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, 0, &value, -1); gtk_list_store_remove (GTK_LIST_STORE (model), &iter); sc = gnm_sheet_scenario_find (state->base.sheet, value); if (sc) g_object_set_data (G_OBJECT (sc), "marked_deleted", GUINT_TO_POINTER (TRUE)); set_selection_state (state, FALSE); all_deleted = TRUE; for (l = state->base.sheet->scenarios; l && all_deleted; l = l->next) { GnmScenario *sc = l->data; if (!g_object_get_data (G_OBJECT (sc), "marked_deleted")) all_deleted = FALSE; } gtk_widget_set_sensitive (state->summary_button, !all_deleted); }
gboolean gnm_dao_get_data (GnmDao *gdao, data_analysis_output_t **dao) { gboolean dao_ready = FALSE; int grp_val; g_return_val_if_fail (gdao != NULL, FALSE); grp_val = gnm_gui_group_value (gdao->gui, dao_group); dao_ready = ((grp_val != 2) || gnm_expr_entry_is_cell_ref (GNM_EXPR_ENTRY (gdao->output_entry), wb_control_cur_sheet (GNM_WBC (gdao->wbcg)), TRUE)); if (dao_ready && NULL != dao) { GtkWidget *button; GnmValue *output_range = NULL; switch (grp_val) { case 0: default: *dao = dao_init_new_sheet (*dao); break; case 1: *dao = dao_init (*dao, NewWorkbookOutput); break; case 2: output_range = gnm_expr_entry_parse_as_value (GNM_EXPR_ENTRY (gdao->output_entry), wb_control_cur_sheet (GNM_WBC (gdao->wbcg))); *dao = dao_init (*dao, RangeOutput); dao_load_from_value (*dao, output_range); value_release (output_range); break; case 3: (*dao) = dao_init ((*dao), InPlaceOutput); /* It is the callers responsibility to fill the */ /* dao with the appropriate range. */ break; } button = go_gtk_builder_get_widget (gdao->gui, "autofit_button"); (*dao)->autofit_flag = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (button)); (*dao)->clear_outputrange = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (gdao->clear_outputrange_button)); (*dao)->retain_format = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (gdao->retain_format_button)); (*dao)->retain_comments = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (gdao->retain_comments_button)); (*dao)->put_formulas = (gtk_combo_box_get_active (GTK_COMBO_BOX (gdao->put_menu)) != 0); } return dao_ready; }
/** * scenarios_ok_clicked_cb: * @button: * @state: * * Run the scenario manager tool. **/ static void scenario_add_ok_clicked_cb (G_GNUC_UNUSED GtkWidget *button, ScenariosState *state) { data_analysis_output_t dao; WorkbookControl *wbc; gchar *name; gchar *comment; GnmValue *cell_range; GtkWidget *entry, *comment_view; GtkTextBuffer *buf; GtkTextIter start, end; GnmScenario *sc; GnmSheetRange sr; cell_range = gnm_expr_entry_parse_as_value (GNM_EXPR_ENTRY (state->base.input_entry), state->base.sheet); if (!cell_range || !gnm_sheet_range_from_value (&sr, cell_range)) { go_gtk_notice_dialog (GTK_WINDOW (state->base.dialog), GTK_MESSAGE_ERROR, _("Invalid changing cells")); gnm_expr_entry_grab_focus (state->base.input_entry, TRUE); return; } if (sr.sheet && sr.sheet != state->base.sheet) { go_gtk_notice_dialog (GTK_WINDOW (state->base.dialog), GTK_MESSAGE_ERROR, _("Changing cells should be on the current " "sheet only.")); gnm_expr_entry_grab_focus (state->base.input_entry, TRUE); goto out; } entry = go_gtk_builder_get_widget (state->base.gui, "name_entry"); name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); if (scenario_name_used (state->base.sheet->scenarios, name)) { g_free (name); go_gtk_notice_dialog (GTK_WINDOW (state->base.dialog), GTK_MESSAGE_ERROR, _("Scenario name already used")); goto out; } else if (check_name (name)) { g_free (name); go_gtk_notice_dialog (GTK_WINDOW (state->base.dialog), GTK_MESSAGE_ERROR, _("Invalid scenario name")); goto out; } comment_view = go_gtk_builder_get_widget (state->base.gui, "comment_view"); buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (comment_view)); gtk_text_buffer_get_start_iter (buf, &start); gtk_text_buffer_get_end_iter (buf, &end); comment = g_strdup (gtk_text_buffer_get_text (buf, &start, &end, FALSE)); dao_init_new_sheet (&dao); dao.sheet = state->base.sheet; wbc = WORKBOOK_CONTROL (state->base.wbcg); sc = gnm_sheet_scenario_new (state->base.sheet, name); if (comment && comment[0]) gnm_scenario_set_comment (sc, comment); gnm_scenario_add_area (sc, &sr); cmd_scenario_add (wbc, sc, state->base.sheet); g_free (name); g_free (comment); gtk_widget_destroy (state->base.dialog); out: value_release (cell_range); return; }
static void scenario_summary (WorkbookControl *wbc, Sheet *sheet, GSList *results, Sheet **new_sheet) { summary_cb_t cb; GList *cur; GList *scenarios = sheet->scenarios; /* Initialize: Currently only new sheet output supported. */ dao_init_new_sheet (&cb.dao); dao_prepare_output (wbc, &cb.dao, _("Scenario Summary")); /* Titles. */ dao_set_cell (&cb.dao, 1, 1, _("Current Values")); dao_set_cell (&cb.dao, 0, 2, _("Changing Cells:")); /* Go through all scenarios. */ cb.row = 0; cb.names = g_hash_table_new (g_str_hash, g_str_equal); cb.sheet = sheet; cb.results = results; for (cb.col = 0, cur = scenarios; cur != NULL; cb.col++, cur = cur->next) { GnmScenario *s = cur->data; /* Scenario name. */ dao_set_cell (&cb.dao, 2 + cb.col, 1, s->name); scenario_for_each_value (s, (ScenarioValueCB) summary_cb, &cb); } /* Set the alignment of names of the changing cells to be right. */ dao_set_align (&cb.dao, 0, 3, 0, 2 + cb.row, GNM_HALIGN_RIGHT, GNM_VALIGN_BOTTOM); /* Result cells. */ if (results != NULL) scenario_summary_res_cells (wbc, results, &cb); /* Destroy the hash table. */ g_hash_table_foreach (cb.names, (GHFunc) rm_fun_cb, NULL); g_hash_table_destroy (cb.names); /* Clean up the report output. */ dao_set_bold (&cb.dao, 0, 0, 0, 2 + cb.row); dao_autofit_columns (&cb.dao); dao_set_cell (&cb.dao, 0, 0, _("Scenario Summary")); dao_set_colors (&cb.dao, 0, 0, cb.col + 1, 1, gnm_color_new_go (GO_COLOR_WHITE), gnm_color_new_go (DARK_GRAY)); dao_set_colors (&cb.dao, 0, 2, 0, 2 + cb.row, gnm_color_new_go (GO_COLOR_BLACK), gnm_color_new_go (LIGHT_GRAY)); dao_set_align (&cb.dao, 1, 1, cb.col + 1, 1, GNM_HALIGN_RIGHT, GNM_VALIGN_BOTTOM); *new_sheet = cb.dao.sheet; }