/** * clipboard_copy_range: * * Entry point to the clipboard copy code */ GnmCellRegion * clipboard_copy_range (Sheet *sheet, GnmRange const *r) { GnmCellRegion *cr; GSList *merged, *ptr; GSList *objects; g_return_val_if_fail (IS_SHEET (sheet), NULL); g_return_val_if_fail (range_is_sane (r), NULL); cr = gnm_cell_region_new (sheet); cr->base = r->start; cr->cols = range_width (r); cr->rows = range_height (r); cr->col_state = colrow_get_states (sheet, TRUE, r->start.col, r->end.col); cr->row_state = colrow_get_states (sheet, FALSE, r->start.row, r->end.row); sheet_foreach_cell_in_range ( sheet, CELL_ITER_IGNORE_NONEXISTENT, r->start.col, r->start.row, r->end.col, r->end.row, (CellIterFunc) cb_clipboard_prepend_cell, cr); objects = sheet_objects_get (sheet, r, G_TYPE_NONE); g_slist_foreach (objects, (GFunc)cb_dup_objects, cr); g_slist_free (objects); cr->styles = sheet_style_get_range (sheet, r); merged = gnm_sheet_merge_get_overlap (sheet, r); for (ptr = merged ; ptr != NULL ; ptr = ptr->next) { GnmRange *tmp = gnm_range_dup (ptr->data); range_translate (tmp, sheet, -r->start.col, -r->start.row); cr->merged = g_slist_prepend (cr->merged, tmp); } g_slist_free (merged); return cr; }
/** * 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; }