/** * gnm_app_clipboard_cut_copy_obj: * @wbc: #WorkbookControl * @is_cut: * @sv: #SheetView * @objects: (element-type SheetObject): a list of #SheetObject which is freed * * Different than copying/cutting a region, this can actually cuts an object **/ void gnm_app_clipboard_cut_copy_obj (WorkbookControl *wbc, gboolean is_cut, SheetView *sv, GSList *objects) { g_return_if_fail (IS_SHEET_VIEW (sv)); g_return_if_fail (objects != NULL); g_return_if_fail (app != NULL); gnm_app_clipboard_clear (FALSE); g_free (app->clipboard_cut_range); app->clipboard_cut_range = NULL; sv_weak_ref (sv, &(app->clipboard_sheet_view)); app->clipboard_copied_contents = clipboard_copy_obj (sv_sheet (sv), objects); if (is_cut) { cmd_objects_delete (wbc, objects, _("Cut Object")); objects = NULL; } 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 ?"); } g_slist_free (objects); }
/** * 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 ?"); } }
/** * 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); }
void gnm_shutdown (void) { GSList *plugin_states; gnm_app_clipboard_clear (TRUE); plugin_states = go_plugins_shutdown (); if (NULL != plugin_states) { gnm_conf_set_plugins_file_states (plugin_states); g_slist_free_full (plugin_states, g_free); } stf_shutdown (); gnm_xml_sax_write_shutdown (); gnm_xml_sax_read_shutdown (); gnm_autofill_shutdown (); print_shutdown (); gnm_func_shutdown_ (); gnm_rendered_value_shutdown (); dependent_types_shutdown (); gui_clipboard_shutdown (); clipboard_shutdown (); gnm_sheet_cell_shutdown (); gnm_expr_deriv_shutdown_ (); gnm_expr_shutdown_ (); parse_util_shutdown (); value_shutdown (); // The style leak printer may access font/border/color info so // shut styles down first. gnm_style_shutdown (); gnm_font_shutdown (); gnm_border_shutdown (); gnm_color_shutdown (); gnm_conf_shutdown (); _gnm_unregister_resource (); libgoffice_shutdown (); go_plugin_services_shutdown (); g_object_unref (gnm_app_get_app ()); gutils_shutdown (); }