static void cb_append_clicked (G_GNUC_UNUSED GtkWidget *ignore, SheetManager *state) { WorkbookSheetState *old_state; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); GtkTreeIter iter; Sheet *sheet, *old_sheet; workbook_signals_block (state); old_state = workbook_sheet_state_new (wb); old_sheet = workbook_sheet_by_index (wb, 0); workbook_sheet_add (wb, -1, gnm_sheet_get_max_cols (old_sheet), gnm_sheet_get_max_rows (old_sheet)); cmd_reorganize_sheets (wbc, old_state, NULL); update_undo (state, wbc); workbook_signals_unblock (state); sheet = workbook_sheet_by_index (wb, workbook_sheet_count (wb) - 1); g_signal_handler_block (state->model, state->model_row_insertion_listener); gtk_list_store_append (state->model, &iter); g_signal_handler_unblock (state->model, state->model_row_insertion_listener); set_sheet_info_at_iter (state, &iter, sheet); cb_selection_changed (NULL, state); }
static void dialog_goto_load_names (GotoState *state) { Sheet *sheet; LoadNames closure; int i, l; gtk_tree_store_clear (state->model); closure.state = state; gtk_tree_store_append (state->model, &closure.iter, NULL); gtk_tree_store_set (state->model, &closure.iter, SHEET_NAME, _("Workbook Level"), ITEM_NAME, NULL, SHEET_POINTER, NULL, EXPRESSION, NULL, -1); workbook_foreach_name (state->wb, FALSE, (GHFunc)cb_load_names, &closure); l = workbook_sheet_count (state->wb); for (i = 0; i < l; i++) { sheet = workbook_sheet_by_index (state->wb, i); gtk_tree_store_append (state->model, &closure.iter, NULL); gtk_tree_store_set (state->model, &closure.iter, SHEET_NAME, sheet->name_unquoted, ITEM_NAME, NULL, SHEET_POINTER, sheet, EXPRESSION, NULL, -1); } }
static GOFileSaver * find_file_saver(const gchar *filename, WorkbookView *view, Workbook *workbook, GODoc *document, GError **error) { GOFileSaver *saver = NULL; const gchar saver_id[] = "Gnumeric_stf:stf_assistant"; GString *saver_options; gint i, n_sheets; GError *local_error = NULL; saver = go_file_saver_for_id(saver_id); if (!saver) { g_set_error(error, CHUPA_DECOMPOSER_ERROR, CHUPA_DECOMPOSER_ERROR_FEED, "[decomposer][excel][feed][error][saver][create][%s]" ": file saver doesn't found: <%s>", filename, saver_id); return NULL; } saver_options = g_string_new("eol=unix separator='\t'"); n_sheets = workbook_sheet_count(workbook); for (i = 0; i < n_sheets; i++) { Sheet *sheet; GnmRange total_range; sheet = workbook_sheet_by_index(workbook, i); total_range = sheet_get_extent(sheet, TRUE); if (sheet_is_region_empty(sheet, &total_range)) { chupa_debug("[decomposer][excel][feed][saver][sheet][ignore][%s]" ": ignore empty sheet: <%s>(%d)", filename, sheet->name_quoted, i); continue; } g_string_append_printf(saver_options, " sheet=%s", sheet->name_quoted); chupa_debug("[decomposer][excel][feed][saver][sheet][use][%s]: <%s>(%d)", filename, sheet->name_quoted, i); } if (go_file_saver_set_export_options(saver, document, saver_options->str, &local_error)) { g_set_error(error, CHUPA_DECOMPOSER_ERROR, CHUPA_DECOMPOSER_ERROR_FEED, "[decomposer][excel][feed][error][saver][option][%s]" ": <%s>(%s): <%s>(%s:%d)", filename, saver_id, saver_options->str, local_error->message, g_quark_to_string(local_error->domain), local_error->code); g_error_free(local_error); saver = NULL; } g_string_free(saver_options, TRUE); return saver; }
static void cb_add_clicked (G_GNUC_UNUSED GtkWidget *ignore, SheetManager *state) { GtkTreeIter sel_iter, iter; GtkTreeSelection *selection = gtk_tree_view_get_selection (state->sheet_list); GList *selected_rows; int index = -1; WorkbookSheetState *old_state; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); Sheet *sheet, *old_sheet = NULL; g_return_if_fail (selection != NULL); g_return_if_fail (gtk_tree_selection_count_selected_rows (selection) == 1); selected_rows = gtk_tree_selection_get_selected_rows (selection, NULL); gtk_tree_model_get_iter (GTK_TREE_MODEL (state->model), &sel_iter, (GtkTreePath *) selected_rows->data); g_list_free_full (selected_rows, (GDestroyNotify) gtk_tree_path_free); gtk_tree_model_get (GTK_TREE_MODEL (state->model), &sel_iter, SHEET_POINTER, &old_sheet, -1); index = old_sheet->index_in_wb; workbook_signals_block (state); old_state = workbook_sheet_state_new (wb); workbook_sheet_add (wb, index, gnm_sheet_get_max_cols (old_sheet), gnm_sheet_get_max_rows (old_sheet)); cmd_reorganize_sheets (wbc, old_state, NULL); update_undo (state, wbc); workbook_signals_unblock (state); g_signal_handler_block (state->model, state->model_row_insertion_listener); sheet = workbook_sheet_by_index (wb, index); gtk_list_store_insert_before (state->model, &iter, &sel_iter); g_signal_handler_unblock (state->model, state->model_row_insertion_listener); set_sheet_info_at_iter (state, &iter, sheet); cb_selection_changed (NULL, state); }
/** Get a reference to a particular sheet in a Gnumeric workbook, identifying it either by index or by name. If an integer is specified, this should be 1-based (rather than 0-based). */ USER_OBJECT_ RGnumeric_sheetInWorkbook(USER_OBJECT_ workbookRef, USER_OBJECT_ index) { Workbook *workbook; USER_OBJECT_ ans = NULL_USER_OBJECT; Sheet *sheet; workbook = RGnumeric_resolveWorkbookReference(workbookRef); if(IS_INTEGER(index)) sheet = workbook_sheet_by_index(workbook, INTEGER_DATA(index)[0] - 1); else { sheet = workbook_sheet_by_name(workbook, CHAR_DEREF(STRING_ELT(index, 0))); } if(sheet) ans = RGnumeric_sheetReference(sheet); return(ans); }
/* Add all of the sheets to the sheet_list */ static void populate_sheet_list (SheetManager *state) { GtkTreeSelection *selection; GtkTreeIter iter; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); Sheet *cur_sheet = wb_control_cur_sheet (wbc); int i, n = workbook_sheet_count (wb); GtkTreePath *sel_path = NULL; selection = gtk_tree_view_get_selection (state->sheet_list); g_signal_handler_block (selection, state->model_selection_changed_listener); if (state->model_row_insertion_listener) g_signal_handler_block (state->model, state->model_row_insertion_listener); gtk_list_store_clear (state->model); gtk_label_set_text (GTK_LABEL (state->warning), ""); for (i = 0 ; i < n ; i++) { Sheet *sheet = workbook_sheet_by_index (wb, i); gtk_list_store_append (state->model, &iter); set_sheet_info_at_iter (state, &iter, sheet); if (sheet == cur_sheet) sel_path = gtk_tree_model_get_path (GTK_TREE_MODEL (state->model), &iter); } if (sel_path) { gtk_tree_selection_select_path (selection, sel_path); gtk_tree_path_free (sel_path); } if (state->model_row_insertion_listener) g_signal_handler_unblock (state->model, state->model_row_insertion_listener); g_signal_handler_unblock (selection, state->model_selection_changed_listener); /* Init the buttons & selection */ cb_selection_changed (NULL, state); }
static void dialog_sheet_order_update_sheet_order (SheetManager *state) { GtkTreeIter iter; Workbook *wb = wb_control_get_workbook (GNM_WBC (state->wbcg)); int i, n_sheets, n_children; GtkTreeModel *model = GTK_TREE_MODEL (state->model); GtkTreeSelection *sel = gtk_tree_view_get_selection (state->sheet_list); n_sheets = workbook_sheet_count (wb); n_children = gtk_tree_model_iter_n_children (model, NULL); if (n_sheets != n_children) { /* This signal also occurs when sheets are added or deleted. We handle this */ /* when those signals arrive. */ return; } for (i = 0; i < n_sheets; i++) { gchar *name, *new_name; gboolean is_locked; gboolean is_visible; gboolean is_rtl; GdkRGBA *back, *fore; Sheet *sheet_wb = workbook_sheet_by_index (wb, i); Sheet *sheet_model; gboolean selected; int j, row_max, col_max; for (j = i; j < n_children; j++) { if (!gtk_tree_model_iter_nth_child (model, &iter, NULL, j)) break; gtk_tree_model_get (model, &iter, SHEET_POINTER, &sheet_model, -1); if (sheet_model == sheet_wb) break; } if (j == i) continue; if (!gtk_tree_model_iter_nth_child (model, &iter, NULL, j)) break; selected = gtk_tree_selection_iter_is_selected (sel, &iter); gtk_tree_model_get (model, &iter, SHEET_LOCKED, &is_locked, SHEET_VISIBLE, &is_visible, SHEET_ROW_MAX, &row_max, SHEET_COL_MAX, &col_max, SHEET_NAME, &name, SHEET_NEW_NAME, &new_name, SHEET_POINTER, &sheet_model, BACKGROUND_COLOUR, &back, FOREGROUND_COLOUR, &fore, SHEET_DIRECTION, &is_rtl, -1); gtk_list_store_remove (state->model, &iter); g_signal_handler_block (state->model, state->model_row_insertion_listener); gtk_list_store_insert (state->model, &iter, i); g_signal_handler_unblock (state->model, state->model_row_insertion_listener); gtk_list_store_set (state->model, &iter, SHEET_LOCKED, is_locked, SHEET_LOCK_IMAGE, is_locked ? state->image_padlock : state->image_padlock_no, SHEET_VISIBLE, is_visible, SHEET_VISIBLE_IMAGE, is_visible ? state->image_visible : NULL, SHEET_ROW_MAX, row_max, SHEET_COL_MAX, col_max, SHEET_NAME, name, SHEET_NEW_NAME, new_name, SHEET_POINTER, sheet_model, BACKGROUND_COLOUR, back, FOREGROUND_COLOUR, fore, SHEET_DIRECTION, is_rtl, SHEET_DIRECTION_IMAGE, is_rtl ? state->image_rtl : state->image_ltr, -1); if (back) gdk_rgba_free (back); if (fore) gdk_rgba_free (fore); g_free (name); g_free (new_name); if (selected) gtk_tree_selection_select_iter (sel, &iter); } cb_selection_changed (NULL, state); }
/** * Other things we could index * - The names of external refernces * - functions used * - plugins used **/ static int ssindex (char const *file, GOIOContext *ioc) { int i, res = 0; GSList *objs, *ptr; char *str = go_shell_arg_to_uri (file); IndexerState state; GsfOutput *gsf_stdout; Workbook *wb; state.wb_view = workbook_view_new_from_uri (str, NULL, ioc, ssindex_import_encoding); g_free (str); if (state.wb_view == NULL) return 1; state.sheet = NULL; gsf_stdout = gsf_output_stdio_new_FILE ("<stdout>", stdout, TRUE); state.output = gsf_xml_out_new (gsf_stdout); gsf_xml_out_start_element (state.output, "gnumeric"); state.wb = wb = wb_view_get_workbook (state.wb_view); workbook_foreach_name (wb, TRUE, (GHFunc)cb_index_name, &state); for (i = 0; i < workbook_sheet_count (wb); i++) { state.sheet = workbook_sheet_by_index (wb, i); gsf_xml_out_simple_element (state.output, "data", state.sheet->name_unquoted); /* cell content */ sheet_cell_foreach (state.sheet, (GHFunc)&cb_index_cell, &state); /* now the objects */ objs = sheet_objects_get (state.sheet, NULL, G_TYPE_NONE); for (ptr = objs ; ptr != NULL ; ptr = ptr->next) { GObject *obj = ptr->data; char *str = NULL; if (gnm_object_has_readable_prop (obj, "text", G_TYPE_STRING, &str) && str) { gsf_xml_out_simple_element (state.output, "data", str); g_free (str); } else if (GNM_IS_SO_GRAPH (obj)) ssindex_chart (&state, (GogObject *)sheet_object_graph_get_gog (GNM_SO (obj))); } g_slist_free (objs); /* Various stuff in styles. */ sheet_style_foreach (state.sheet, (GFunc)cb_index_styles, &state); /* Local names. */ gnm_sheet_foreach_name (state.sheet, (GHFunc)cb_index_name, &state); } gsf_xml_out_end_element (state.output); /* </gnumeric> */ gsf_output_close (gsf_stdout); g_object_unref (gsf_stdout); g_object_unref (wb); return res; }
GnumericSheetPtr gnumeric_get_sheet(GnumericWorkbookPtr workbook, int index) { WorkbookView *wbv = (WorkbookView *)workbook; Sheet *sheet = workbook_sheet_by_index (wb_view_get_workbook (wbv), index); return (GnumericSheetPtr*)sheet; }