/** * cmd_paste : * @sheet: The destination sheet * @range : The range to paste to within the destination sheet. * @flags: Any paste special flags. * * Pastes the current cut buffer, copy buffer, or X selection to * the destination sheet range. * * When pasting a cut the destination MUST be the same size as the src. * * When pasting a copy the destination can be a singleton, or an integer * multiple of the size of the source. This is not tested here. * Full undo support. **/ void cmd_paste (WorkbookControl *wbc, GnmPasteTarget const *pt) { GnmCellRegion *content; GnmRange const *src_range; g_return_if_fail (pt != NULL); g_return_if_fail (IS_SHEET (pt->sheet)); src_range = gnm_app_clipboard_area_get (); content = gnm_app_clipboard_contents_get (); if (content == NULL && src_range != NULL) { /* Pasting a Cut */ GnmExprRelocateInfo rinfo; Sheet *src_sheet = gnm_app_clipboard_sheet_get (); /* Validate the size & shape of the target here. */ int const cols = (src_range->end.col - src_range->start.col); int const rows = (src_range->end.row - src_range->start.row); GnmRange dst = pt->range; if (range_is_singleton (&dst)) { dst.end.col = dst.start.col + cols; dst.end.row = dst.start.row + rows; } else if ((dst.end.col - dst.start.col) != cols || (dst.end.row - dst.start.row) != rows) { char *msg = g_strdup_printf ( _("destination has a different shape (%dRx%dC) than the original (%dRx%dC)\n\n" "Try selecting a single cell or an area of the same shape and size."), (dst.end.row - dst.start.row)+1, (dst.end.col - dst.start.col)+1, rows+1, cols+1); go_cmd_context_error_invalid (GO_CMD_CONTEXT (wbc), _("Unable to paste into selection"), msg); g_free (msg); return; } rinfo.reloc_type = GNM_EXPR_RELOCATE_MOVE_RANGE; rinfo.origin = *src_range; rinfo.col_offset = dst.start.col - rinfo.origin.start.col; rinfo.row_offset = dst.start.row - rinfo.origin.start.row; rinfo.origin_sheet = src_sheet; rinfo.target_sheet = pt->sheet; if (!cmd_paste_cut (wbc, &rinfo, TRUE, NULL)) gnm_app_clipboard_clear (TRUE); /* If this application has marked a selection use it */ } else if (content != NULL) cmd_paste_copy (wbc, pt, content); /* See if the control has access to information to paste */ else wb_control_paste_from_selection (wbc, pt); }
void gnm_app_clipboard_invalidate_sheet (Sheet *sheet) { /* Clear the cliboard to avoid dangling references to the deleted sheet */ if (sheet == gnm_app_clipboard_sheet_get ()) gnm_app_clipboard_clear (TRUE); else if (app->clipboard_copied_contents) cellregion_invalidate_sheet (app->clipboard_copied_contents, sheet); }