/** * advanced_filter_ok_clicked_cb: * @button: * @state: * * Retrieve the information from the dialog and call the advanced_filter. * Note that we assume that the ok_button is only active if the entry fields * contain sensible data. **/ static void advanced_filter_ok_clicked_cb (G_GNUC_UNUSED GtkWidget *button, AdvancedFilterState *state) { data_analysis_output_t dao; GnmValue *input; GnmValue *criteria; char *text; GtkWidget *w; int err = 0; gboolean unique; input = gnm_expr_entry_parse_as_value ( GNM_EXPR_ENTRY (state->input_entry), state->sheet); criteria = gnm_expr_entry_parse_as_value (state->input_entry_2, state->sheet); parse_output ((GenericToolState *) state, &dao); w = glade_xml_get_widget (state->gui, "unique-button"); unique = (1 == gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w))); err = advanced_filter (WORKBOOK_CONTROL (state->wbcg), &dao, input, criteria, unique); value_release (input); value_release (criteria); switch (err) { case OK: gtk_widget_destroy (state->dialog); break; case ERR_INVALID_FIELD: error_in_entry ((GenericToolState *) state, GTK_WIDGET (state->input_entry_2), _("The given criteria are invalid.")); break; case NO_RECORDS_FOUND: go_gtk_notice_nonmodal_dialog ((GtkWindow *) state->dialog, &(state->warning_dialog), GTK_MESSAGE_INFO, _("No matching records were found.")); break; default: text = g_strdup_printf (_("An unexpected error has occurred: " "%d."), err); error_in_entry ((GenericToolState *) state, GTK_WIDGET (state->input_entry), text); g_free (text); break; } return; }
/** * cb_dialog_solve_clicked: * @button: * @state: * * **/ static void cb_dialog_solve_clicked (G_GNUC_UNUSED GtkWidget *button, SolverState *state) { GnmSolverResult *res; GnmSolverParameters *param = state->sheet->solver_parameters; GError *err = NULL; if (state->warning_dialog != NULL) { gtk_widget_destroy (state->warning_dialog); state->warning_dialog = NULL; } extract_settings (state); if (!gnm_solver_param_valid (param, &err)) { GtkWidget *top = gtk_widget_get_toplevel (state->dialog); go_gtk_notice_dialog (GTK_WINDOW (top), GTK_MESSAGE_ERROR, "%s", err->message); goto out; } check_for_changed_options (state); res = run_solver (state, param); gnm_app_recalc (); if (res != NULL) { if ((res->quality == GNM_SOLVER_RESULT_OPTIMAL || res->quality == GNM_SOLVER_RESULT_FEASIBLE) && param->options.add_scenario) solver_add_scenario (state, res, param->options.scenario_name); g_object_unref (res); } else if (err) { go_gtk_notice_nonmodal_dialog (GTK_WINDOW (state->dialog), &(state->warning_dialog), GTK_MESSAGE_ERROR, "%s", err->message); } out: if (err) g_error_free (err); }
static void cb_dialog_model_type_clicked (G_GNUC_UNUSED GtkWidget *button, SolverState *state) { GnmSolverModelType type; gboolean any; type = gnm_gui_group_value (state->gui, model_type_group); any = fill_algorithm_combo (state, type); if (!any) { go_gtk_notice_nonmodal_dialog (GTK_WINDOW (state->dialog), &(state->warning_dialog), GTK_MESSAGE_INFO, _("Looking for a subject for your thesis? " "Maybe you would like to write a solver for " "Gnumeric?")); } }
/** * advanced_filter_ok_clicked_cb: * @button: * @state: * * Retrieve the information from the dialog and call the advanced_filter. * Note that we assume that the ok_button is only active if the entry fields * contain sensible data. **/ static void advanced_filter_ok_clicked_cb (G_GNUC_UNUSED GtkWidget *button, AdvancedFilterState *state) { data_analysis_output_t *dao; GnmValue *input; GnmValue *criteria; char *text; GtkWidget *w; int err = 0; gboolean unique; input = gnm_expr_entry_parse_as_value ( GNM_EXPR_ENTRY (state->input_entry), state->sheet); criteria = gnm_expr_entry_parse_as_value (state->input_entry_2, state->sheet); dao = parse_output ((GenericToolState *) state, NULL); w = go_gtk_builder_get_widget (state->gui, "unique-button"); unique = (1 == gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w))); if (dao->type == InPlaceOutput) err = advanced_filter (WORKBOOK_CONTROL (state->wbcg), dao, input, criteria, unique); else { analysis_tools_data_advanced_filter_t * data = g_new0 (analysis_tools_data_advanced_filter_t, 1); data->base.wbc = WORKBOOK_CONTROL (state->wbcg); data->base.range_1 = input; data->base.range_2 = criteria; data->unique_only_flag = unique; if (cmd_analysis_tool (WORKBOOK_CONTROL (state->wbcg), state->sheet, dao, data, analysis_tool_advanced_filter_engine, FALSE)) { err = data->base.err; g_free (data); } else err = analysis_tools_noerr; } if (dao->type == InPlaceOutput || err != analysis_tools_noerr) { value_release (input); value_release (criteria); g_free (dao); } switch (err) { case analysis_tools_noerr: gtk_widget_destroy (state->dialog); break; case analysis_tools_invalid_field: error_in_entry ((GenericToolState *) state, GTK_WIDGET (state->input_entry_2), _("The given criteria are invalid.")); break; case analysis_tools_no_records_found: go_gtk_notice_nonmodal_dialog ((GtkWindow *) state->dialog, &(state->warning_dialog), GTK_MESSAGE_INFO, _("No matching records were found.")); break; default: text = g_strdup_printf (_("An unexpected error has occurred: " "%d."), err); error_in_entry ((GenericToolState *) state, GTK_WIDGET (state->input_entry), text); g_free (text); break; } return; }
static void cb_merge_merge_clicked (G_GNUC_UNUSED GtkWidget *ignore, MergeState *state) { GtkTreeIter this_iter; gint n = 0; char *data_string = NULL, *field_string = NULL; GSList *data_list = NULL, *field_list = NULL; GnmValue *v_zone; gint field_problems = 0; gint min_length = gnm_sheet_get_max_rows (state->sheet); gint max_length = 0; v_zone = gnm_expr_entry_parse_as_value (state->zone, state->sheet); g_return_if_fail (v_zone != NULL); while (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (state->model), &this_iter, NULL, n)) { GnmValue *v_data, *v_field; gtk_tree_model_get (GTK_TREE_MODEL (state->model), &this_iter, DATA_RANGE, &data_string, FIELD_LOCATION, &field_string, -1); v_data = value_new_cellrange_str (state->sheet, data_string); v_field = value_new_cellrange_str (state->sheet, field_string); g_free (data_string); g_free (field_string); g_return_if_fail (v_data != NULL && v_field != NULL); if (!global_range_contained (state->sheet, v_field, v_zone)) field_problems++; data_list = g_slist_prepend (data_list, v_data); field_list = g_slist_prepend (field_list, v_field); n++; } if (field_problems > 0) { char *text; if (field_problems == 1) text = g_strdup (_("One field is not part of the merge zone!")); else text = g_strdup_printf (_("%i fields are not part of the merge zone!"), field_problems); go_gtk_notice_nonmodal_dialog ((GtkWindow *) state->dialog, &(state->warning_dialog), GTK_MESSAGE_ERROR, "%s", text); g_free (text); value_release (v_zone); range_list_destroy (data_list); range_list_destroy (field_list); return; } g_slist_foreach (data_list, cb_merge_find_shortest_column, &min_length); g_slist_foreach (data_list, cb_merge_find_longest_column, &max_length); if (min_length < max_length) { char *text = g_strdup_printf (_("The data columns range in length from " "%i to %i. Shall we trim the lengths to " "%i and proceed?"), min_length, max_length, min_length); if (go_gtk_query_yes_no (GTK_WINDOW (state->dialog), TRUE, "%s", text)) { g_slist_foreach (data_list, cb_merge_trim_data, &min_length); g_free (text); } else { g_free (text); value_release (v_zone); range_list_destroy (data_list); range_list_destroy (field_list); return; } } if (!cmd_merge_data (WORKBOOK_CONTROL (state->wbcg), state->sheet, v_zone, field_list, data_list)) gtk_widget_destroy (state->dialog); }
/** * 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; }