/** * gnm_app_clipboard_cut_copy: * @wbc: the workbook control that requested the operation. * @is_cut: is this a cut or a copy. * @sv: The source sheet for the copy. * @area: A single rectangular range to be copied. * @animate_range: Do we want ot add an animated cursor around things. * * When Cutting we * Clear and free the contents of the clipboard and save the sheet and area * to be cut. DO NOT ACTUALLY CUT! Paste will move the region if this was a * cut operation. * * When Copying we * Clear and free the contents of the clipboard and COPY the designated region * into the clipboard. * * we need to pass @wbc as a control rather than a simple command-context so * that the control can claim the selection. **/ void gnm_app_clipboard_cut_copy (WorkbookControl *wbc, gboolean is_cut, SheetView *sv, GnmRange const *area, gboolean animate_cursor) { Sheet *sheet; g_return_if_fail (IS_SHEET_VIEW (sv)); g_return_if_fail (area != NULL); g_return_if_fail (app != NULL); gnm_app_clipboard_clear (FALSE); sheet = sv_sheet (sv); g_free (app->clipboard_cut_range); app->clipboard_cut_range = gnm_range_dup (area); sv_weak_ref (sv, &(app->clipboard_sheet_view)); if (!is_cut) app->clipboard_copied_contents = clipboard_copy_range (sheet, area); if (animate_cursor) { GList *l = g_list_append (NULL, (gpointer)area); sv_ant (sv, l); g_list_free (l); } if (wb_control_claim_selection (wbc)) { g_signal_emit (G_OBJECT (app), signals[CLIPBOARD_MODIFIED], 0); } else { gnm_app_clipboard_clear (FALSE); g_warning ("Unable to set selection ?"); } }
/** * 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; }