static void wb_create_name (WorkbookControl *wbc, char const *text, GnmParsePos *pp) { GnmRange const *r; GnmCellRef a, b; GnmExpr const *target_range; r = selection_first_range (wb_control_cur_sheet_view (wbc), GO_CMD_CONTEXT (wbc), _("Define Name")); if (r != NULL) { a.sheet = b.sheet = wb_control_cur_sheet (wbc); a.col = r->start.col; a.row = r->start.row; b.col = r->end.col; b.row = r->end.row; a.col_relative = a.row_relative = b.col_relative = b.row_relative = FALSE; pp->sheet = NULL; /* make it a global name */ if (gnm_cellref_equal (&a, &b)) target_range = gnm_expr_new_cellref (&a); else target_range = gnm_expr_new_constant ( value_new_cellrange_unsafe (&a, &b)); cmd_define_name (wbc, text, pp, gnm_expr_top_new (target_range), NULL); } }
static GnmRange const * dialog_load_selection (SortFlowState *state, gboolean *col_rb) { GnmRange const *first; GnmSortData const *data; first = selection_first_range (state->sv, NULL, NULL); if (first != NULL) { gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (state->cell_sort_col_rb), (*col_rb = (first->end.row - first->start.row > first->end.col - first->start.col))); gnm_expr_entry_load_from_range (state->range_entry, state->sheet, first); } else gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (state->cell_sort_col_rb), (*col_rb = TRUE)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->cell_sort_header_check), sheet_range_has_heading (state->sheet, first, *col_rb, FALSE)); cb_sort_header_check (state); data = gnm_sheet_find_sort_setup (state->sheet, gnm_expr_entry_get_text (state->range_entry)); if (data != NULL) dialog_cell_sort_load_sort_setup (state, data); else cb_update_to_new_range (state); return first; }
static void dialog_goto_load_selection (GotoState *state) { SheetView *sv = wb_control_cur_sheet_view (WORKBOOK_CONTROL (state->wbcg)); GnmRange const *first = selection_first_range (sv, NULL, NULL); if (first != NULL) { gint rows = range_height (first); gint cols = range_width (first); GnmConventionsOut out; GString *str = g_string_new (NULL); GnmParsePos pp; GnmRangeRef rr; out.accum = str; out.pp = parse_pos_init_sheet (&pp, sv->sheet); out.convs = sheet_get_conventions (sv->sheet); gnm_cellref_init (&rr.a, NULL, first->start.col, first->start.row, TRUE); gnm_cellref_init (&rr.b, NULL, first->start.col, first->start.row, TRUE); rangeref_as_string (&out, &rr); gtk_entry_set_text (state->goto_text, str->str); gtk_editable_select_region (GTK_EDITABLE (state->goto_text), 0, -1); g_string_free (str, TRUE); cb_dialog_goto_update_sensitivity (NULL, state); gtk_spin_button_set_value (state->spin_rows, rows); gtk_spin_button_set_value (state->spin_cols, cols); } else cb_dialog_goto_update_sensitivity (NULL, state); }
/* * 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; }
/** * dialog_preload_selection: * @state: * @entry * * **/ static void dialog_preload_selection (GoalSeekState *state, GnmExprEntry *entry) { GnmRange const *sel; sel = selection_first_range (wb_control_cur_sheet_view (WORKBOOK_CONTROL (state->wbcg)), NULL, NULL); if (sel) gnm_expr_entry_load_from_range (entry, state->sheet, sel); }
/** * sv_select_cur_col: * @sv: The sheet * * Selects an entire column */ void sv_select_cur_col (SheetView *sv) { GnmRange const *sel = selection_first_range (sv, NULL, NULL); if (sel != NULL) { GnmRange r = *sel; sv_selection_reset (sv); sv_selection_add_full (sv, sv->edit_pos.col, sv->edit_pos.row, r.start.col, 0, r.end.col, gnm_sheet_get_last_row (sv->sheet)); sheet_update (sv->sheet); } }
void dialog_data_table (WBCGtk *wbcg) { GnmDialogDataTable *state; GnmRange const *r; GnmRange input_range; SheetView *sv; Sheet *sheet; g_return_if_fail (wbcg != NULL); if (wbc_gtk_get_guru (wbcg) || gnm_dialog_raise_if_exists (wbcg, DIALOG_DATA_TABLE_KEY)) return; sv = wb_control_cur_sheet_view (GNM_WBC (wbcg)); r = selection_first_range (sv, GO_CMD_CONTEXT (wbcg), _("Create Data Table")); if (NULL == r) return; if (range_width (r) <= 1 || range_height (r) <= 1) { GError *msg = g_error_new (go_error_invalid(), 0, _("The selection must have more than 1 column and row to create a Data Table.")); go_cmd_context_error (GO_CMD_CONTEXT (wbcg), msg); g_error_free (msg); return; } input_range = *r; input_range.start.col++; input_range.start.row++; sheet = sv_sheet (sv); if (sheet_range_splits_region (sheet, &input_range, NULL, GO_CMD_CONTEXT (wbcg), _("Data Table"))) return; if (cmd_cell_range_is_locked_effective (sheet, &input_range, GNM_WBC (wbcg), _("Data Table"))) return; state = g_new0 (GnmDialogDataTable, 1); state->wbcg = wbcg; state->sheet = sheet; state->input_range = input_range; if (data_table_init (state, wbcg)) { go_gtk_notice_dialog (wbcg_toplevel (wbcg), GTK_MESSAGE_ERROR, _("Could not create the Data Table definition dialog.")); g_free (state); } }
/** * cmd_paste_to_selection : * @dest_sv: The sheet into which things should be pasted * @flags: special paste flags (eg transpose) * * Using the current selection as a target * Full undo support. */ void cmd_paste_to_selection (WorkbookControl *wbc, SheetView *dest_sv, int paste_flags) { GnmRange const *r; GnmPasteTarget pt; if (!(r = selection_first_range (dest_sv, GO_CMD_CONTEXT (wbc), _("Paste")))) return; g_return_if_fail (r !=NULL); pt.sheet = dest_sv->sheet; pt.range = *r; pt.paste_flags = paste_flags; cmd_paste (wbc, &pt); }
/** * dialog_shuffle: * @wbcg: * @sheet: * * Show the dialog (guru). * **/ void dialog_shuffle (WBCGtk *wbcg) { ShuffleState *state; WorkbookControl *wbc; GtkWidget *w; char const *type; GnmRange const *r; g_return_if_fail (wbcg != NULL); wbc = WORKBOOK_CONTROL (wbcg); /* Only pop up one copy per workbook */ if (gnumeric_dialog_raise_if_exists (wbcg, SHUFFLE_KEY)) return; state = g_new (ShuffleState, 1); if (dialog_tool_init (state, wbcg, wb_control_cur_sheet (wbc), GNUMERIC_HELP_LINK_DATA_SHUFFLE, "shuffle.ui", "Shuffling", _("Could not create the Data Shuffling dialog."), SHUFFLE_KEY, G_CALLBACK (shuffle_ok_clicked_cb), NULL, G_CALLBACK (shuffle_update_sensitivity_cb), 0)) return; shuffle_update_sensitivity_cb (NULL, state); state->gdao = NULL; tool_load_selection ((GenericToolState *)state, FALSE); r = selection_first_range (state->sv, NULL, NULL); if (range_width (r) == 1) type = "shuffle_cols"; else if (range_height (r) == 1) type = "shuffle_rows"; else type = "shuffle_area"; w = go_gtk_builder_get_widget (state->gui, type); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE); gtk_widget_show (state->dialog); return; }
void dialog_tool_preset_to_range (GenericToolState *state) { GnmRange const *sel; GtkWidget *w; g_return_if_fail (state != NULL); g_return_if_fail (state->gdao != NULL); sel = selection_first_range (state->sv, NULL, NULL); gnm_dao_load_range (GNM_DAO (state->gdao), sel); gnm_dao_focus_output_range (GNM_DAO (state->gdao)); w = glade_xml_get_widget (state->gui, "notebook1"); g_return_if_fail (w && GTK_IS_NOTEBOOK (w)); gtk_notebook_set_current_page (GTK_NOTEBOOK(w), 0); }
void dialog_delete_cells (WBCGtk *wbcg) { DeleteCellState *state; WorkbookControl *wbc = GNM_WBC (wbcg); SheetView *sv = wb_control_cur_sheet_view (wbc); Sheet *sheet = sv_sheet (sv); GnmRange const *sel; GtkBuilder *gui; GtkWidget *w; int cols, rows; g_return_if_fail (wbcg != NULL); if (!(sel = selection_first_range (sv, GO_CMD_CONTEXT (wbc), _("Delete")))) return; cols = sel->end.col - sel->start.col + 1; rows = sel->end.row - sel->start.row + 1; if (range_is_full (sel, sheet, FALSE)) { cmd_delete_cols (wbc, sheet, sel->start.col, cols); return; } if (range_is_full (sel, sheet, TRUE)) { cmd_delete_rows (wbc, sheet, sel->start.row, rows); return; } if (gnm_dialog_raise_if_exists (wbcg, DELETE_CELL_DIALOG_KEY)) return; gui = gnm_gtk_builder_load ("res:ui/delete-cells.ui", NULL, GO_CMD_CONTEXT (wbcg)); if (gui == NULL) return; state = g_new (DeleteCellState, 1); state->wbcg = wbcg; state->sel = sel; state->gui = gui; state->sheet = sv_sheet (sv); state->dialog = go_gtk_builder_get_widget (state->gui, "Delete_cells"); if (state->dialog == NULL) { go_gtk_notice_dialog (wbcg_toplevel (wbcg), GTK_MESSAGE_ERROR, _("Could not create the Delete Cell dialog.")); g_free (state); return ; } w = go_gtk_builder_get_widget (state->gui, "okbutton"); g_signal_connect_swapped (G_OBJECT (w), "clicked", G_CALLBACK (cb_delete_cell_ok_clicked), state); w = go_gtk_builder_get_widget (state->gui, "cancelbutton"); g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (cb_delete_cell_cancel_clicked), state); gnm_dialog_setup_destroy_handlers (GTK_DIALOG (state->dialog), state->wbcg, GNM_DIALOG_DESTROY_CURRENT_SHEET_REMOVED); gnm_init_help_button ( go_gtk_builder_get_widget (state->gui, "helpbutton"), GNUMERIC_HELP_LINK_DELETE_CELLS); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (go_gtk_builder_get_widget (state->gui, cols < rows ? "radio_0" : "radio_1")), TRUE); wbc_gtk_attach_guru (state->wbcg, state->dialog); g_object_set_data_full (G_OBJECT (state->dialog), "state", state, (GDestroyNotify) cb_delete_cell_destroy); gnm_keyed_dialog (wbcg, GTK_WINDOW (state->dialog), DELETE_CELL_DIALOG_KEY); gtk_widget_show (state->dialog); }
/** * dialog_fill_series_tool_init: * @state: * * Create the dialog (guru). * **/ static void dialog_fill_series_tool_init (FillSeriesState *state) { GtkWidget *radio; char const *button; GnmRange const *sel; gboolean prefer_rows = FALSE; sel = selection_first_range (state->base.sv, NULL, NULL); /* Set the sensitivity of Unit day. */ radio = go_gtk_builder_get_widget (state->base.gui, "type_date"); g_signal_connect (G_OBJECT (radio), "clicked", G_CALLBACK (cb_type_button_clicked), state); state->stop_entry = go_gtk_builder_get_widget (state->base.gui, "stop_entry"); g_signal_connect_after (G_OBJECT (state->stop_entry), "changed", G_CALLBACK (cb_fill_series_update_sensitivity), state); state->step_entry = go_gtk_builder_get_widget (state->base.gui, "step_entry"); g_signal_connect_after (G_OBJECT (state->step_entry), "changed", G_CALLBACK (cb_fill_series_update_sensitivity), state); state->start_entry = go_gtk_builder_get_widget (state->base.gui, "start_entry"); g_signal_connect_after (G_OBJECT (state->start_entry), "changed", G_CALLBACK (cb_fill_series_update_sensitivity), state); state->date_steps_type = go_gtk_builder_get_widget (state->base.gui, "table-date-unit"); gtk_widget_set_sensitive (state->date_steps_type, FALSE); button = (sel == NULL || (prefer_rows = (range_width (sel) >= range_height (sel)))) ? "series_in_rows" : "series_in_cols"; radio = go_gtk_builder_get_widget (state->base.gui, button); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE); if (sel != NULL) { GnmCell *cell_start; GnmCell *cell_end; dialog_tool_preset_to_range (&state->base); cell_start = sheet_cell_get (state->base.sheet, sel->start.col, sel->start.row); if (cell_start) { char *content = gnm_cell_get_rendered_text (cell_start); if (content) { gtk_entry_set_text (GTK_ENTRY (state->start_entry), content); g_free (content); } } cell_end = prefer_rows ? sheet_cell_get (state->base.sheet, sel->end.col, sel->start.row) : sheet_cell_get (state->base.sheet, sel->start.col, sel->end.row); if (cell_end) { char *content = gnm_cell_get_rendered_text (cell_end); if (content) { gtk_entry_set_text (GTK_ENTRY (state->stop_entry), content); g_free (content); } } if (cell_start && cell_end) { float_to_entry (GTK_ENTRY(state->step_entry), (value_get_as_float(cell_end->value) - value_get_as_float(cell_start->value)) / (prefer_rows ? (sel->end.col-sel->start.col) : (sel->end.row-sel->start.row))); } } cb_fill_series_update_sensitivity (NULL, state); }
void dialog_merge (WBCGtk *wbcg) { MergeState *state; GtkBuilder *gui; GtkGrid *grid; GtkWidget *scrolled; GtkTreeViewColumn *column; GtkTreeSelection *selection; GnmRange const *r; g_return_if_fail (wbcg != NULL); if (gnumeric_dialog_raise_if_exists (wbcg, MERGE_KEY)) return; gui = gnm_gtk_builder_load ("merge.ui", NULL, GO_CMD_CONTEXT (wbcg)); if (gui == NULL) return; state = g_new0 (MergeState, 1); state->gui = gui; state->wbcg = wbcg; state->sheet = wb_control_cur_sheet (WORKBOOK_CONTROL (state->wbcg)); state->dialog = go_gtk_builder_get_widget (gui, "Merge"); state->warning_dialog = NULL; state->add_btn = go_gtk_builder_get_widget (gui, "add_button"); state->delete_btn = go_gtk_builder_get_widget (gui, "remove_button"); state->merge_btn = go_gtk_builder_get_widget (gui, "merge_button"); state->change_btn = go_gtk_builder_get_widget (gui, "change_button"); state->cancel_btn = go_gtk_builder_get_widget (gui, "cancel_button"); gtk_widget_set_size_request (state->delete_btn, 100, -1); gtk_button_set_alignment (GTK_BUTTON (state->add_btn), 0., .5); gtk_button_set_alignment (GTK_BUTTON (state->delete_btn), 0., .5); gtk_button_set_alignment (GTK_BUTTON (state->change_btn), 0., .5); grid = GTK_GRID (go_gtk_builder_get_widget (gui, "main-grid")); state->zone = gnm_expr_entry_new (wbcg, TRUE); gnm_expr_entry_set_flags (state->zone, GNM_EE_SINGLE_RANGE, GNM_EE_MASK); gnumeric_editable_enters (GTK_WINDOW (state->dialog), GTK_WIDGET (state->zone)); gtk_label_set_mnemonic_widget (GTK_LABEL (go_gtk_builder_get_widget (gui, "var1-label")), GTK_WIDGET (state->zone)); gtk_widget_set_hexpand (GTK_WIDGET (state->zone), TRUE); gtk_grid_attach (grid, GTK_WIDGET (state->zone), 1, 0, 2, 1); r = selection_first_range ( wb_control_cur_sheet_view (WORKBOOK_CONTROL (wbcg)), NULL, NULL); if (r != NULL) gnm_expr_entry_load_from_range (state->zone, state->sheet, r); state->data = gnm_expr_entry_new (wbcg, TRUE); gnm_expr_entry_set_flags (state->data, GNM_EE_SINGLE_RANGE, GNM_EE_MASK); gtk_widget_set_hexpand (GTK_WIDGET (state->data), TRUE); gtk_grid_attach (grid, GTK_WIDGET (state->data), 0, 5, 1, 1); state->field = gnm_expr_entry_new (wbcg, TRUE); gnm_expr_entry_set_flags (state->field, GNM_EE_SINGLE_RANGE, GNM_EE_MASK); gtk_widget_set_hexpand (GTK_WIDGET (state->field), TRUE); gtk_grid_attach (grid, GTK_WIDGET (state->field), 1, 5, 1, 1); scrolled = go_gtk_builder_get_widget (state->gui, "scrolled"); state->model = gtk_list_store_new (NUM_COLMNS, G_TYPE_STRING, G_TYPE_STRING); state->list = GTK_TREE_VIEW (gtk_tree_view_new_with_model (GTK_TREE_MODEL (state->model))); selection = gtk_tree_view_get_selection (state->list); gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE); column = gtk_tree_view_column_new_with_attributes (_("Input Data"), gtk_cell_renderer_text_new (), "text", DATA_RANGE, NULL); gtk_tree_view_column_set_sort_column_id (column, DATA_RANGE); gtk_tree_view_column_set_min_width (column, 150); gtk_tree_view_append_column (state->list, column); column = gtk_tree_view_column_new_with_attributes (_("Merge Field"), gtk_cell_renderer_text_new (), "text", FIELD_LOCATION, NULL); gtk_tree_view_column_set_sort_column_id (column, FIELD_LOCATION); gtk_tree_view_column_set_min_width (column, 100); gtk_tree_view_append_column (state->list, column); gtk_tree_view_set_headers_clickable (state->list, TRUE); gtk_container_add (GTK_CONTAINER (scrolled), GTK_WIDGET (state->list)); cb_merge_update_buttons (NULL, state); g_signal_connect (selection, "changed", G_CALLBACK (cb_merge_selection_changed), state); g_signal_connect_after (G_OBJECT (state->zone), "changed", G_CALLBACK (cb_merge_update_buttons), state); g_signal_connect_after (G_OBJECT (state->data), "changed", G_CALLBACK (cb_merge_update_buttons), state); g_signal_connect_after (G_OBJECT (state->field), "changed", G_CALLBACK (cb_merge_update_buttons), state); g_signal_connect (G_OBJECT (state->add_btn), "clicked", G_CALLBACK (cb_merge_add_clicked), state); g_signal_connect (G_OBJECT (state->change_btn), "clicked", G_CALLBACK (cb_merge_change_clicked), state); g_signal_connect (G_OBJECT (state->delete_btn), "clicked", G_CALLBACK (cb_merge_delete_clicked), state); g_signal_connect (G_OBJECT (state->merge_btn), "clicked", G_CALLBACK (cb_merge_merge_clicked), state); g_signal_connect (G_OBJECT (state->cancel_btn), "clicked", G_CALLBACK (cb_merge_cancel_clicked), state); gnm_dialog_setup_destroy_handlers (GTK_DIALOG (state->dialog), state->wbcg, GNM_DIALOG_DESTROY_CURRENT_SHEET_REMOVED); gnumeric_init_help_button ( go_gtk_builder_get_widget (state->gui, "help_button"), GNUMERIC_HELP_LINK_DATA_MERGE); gnumeric_keyed_dialog (state->wbcg, GTK_WINDOW (state->dialog), MERGE_KEY); /* a candidate for merging into attach guru */ g_object_set_data_full (G_OBJECT (state->dialog), "state", state, (GDestroyNotify) cb_merge_destroy); go_gtk_nonmodal_dialog (wbcg_toplevel (state->wbcg), GTK_WINDOW (state->dialog)); wbc_gtk_attach_guru (state->wbcg, GTK_WIDGET (state->dialog)); gtk_widget_show_all (GTK_WIDGET (state->dialog)); }
/** * stf_text_to_columns: * @wbc: The control making the request * @cc: * * Main routine, handles importing a file including all dialog mumbo-jumbo **/ void stf_text_to_columns (WorkbookControl *wbc, GOCmdContext *cc) { DialogStfResult_t *dialogresult = NULL; SheetView *sv; Sheet *src_sheet, *target_sheet; GnmRange const *src; GnmRange target; GsfOutput *buf; guint8 const *data; size_t data_len; sv = wb_control_cur_sheet_view (wbc); src_sheet = sv_sheet (sv); src = selection_first_range (sv, cc, _("Text to Columns")); if (src == NULL) return; if (range_width (src) > 1) { go_cmd_context_error (cc, g_error_new (go_error_invalid (), 0, _("Only one column of input data can be parsed at a time"))); return; } /* FIXME : how to do this cleanly ? */ if (!GNM_IS_WBC_GTK (wbc)) return; #warning Add UI for this target_sheet = src_sheet; target = *src; range_translate (&target, target_sheet, 1, 0); buf = gsf_output_memory_new (); sheet_foreach_cell_in_range (src_sheet, CELL_ITER_ALL, src->start.col, src->start.row, src->end.col, src->end.row, (CellIterFunc) &cb_get_content, buf); gsf_output_close (buf); data = gsf_output_memory_get_bytes (GSF_OUTPUT_MEMORY (buf)); data_len = (size_t)gsf_output_size (buf); if (data_len == 0) { go_cmd_context_error_import (GO_CMD_CONTEXT (cc), _("There is no data " "to convert")); } else { dialogresult = stf_dialog (WBC_GTK (wbc), NULL, FALSE, NULL, FALSE, _("Text to Columns"), data, data_len); } if (dialogresult != NULL) { GnmCellRegion *cr = stf_parse_region (dialogresult->parseoptions, dialogresult->text, NULL, target_sheet->workbook); if (cr != NULL) { stf_dialog_result_attach_formats_to_cr (dialogresult, cr); target.end.col = target.start.col + cr->cols - 1; target.end.row = target.start.row + cr->rows - 1; } if (cr == NULL || cmd_text_to_columns (wbc, src, src_sheet, &target, target_sheet, cr)) go_cmd_context_error_import (GO_CMD_CONTEXT (cc), _("Error while trying to " "parse data into sheet")); stf_dialog_result_free (dialogresult); } g_object_unref (buf); }