1b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3b3f79822SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4b3f79822SAndrew Rist * or more contributor license agreements. See the NOTICE file
5b3f79822SAndrew Rist * distributed with this work for additional information
6b3f79822SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7b3f79822SAndrew Rist * to you under the Apache License, Version 2.0 (the
8b3f79822SAndrew Rist * "License"); you may not use this file except in compliance
9b3f79822SAndrew Rist * with the License. You may obtain a copy of the License at
10b3f79822SAndrew Rist *
11b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12b3f79822SAndrew Rist *
13b3f79822SAndrew Rist * Unless required by applicable law or agreed to in writing,
14b3f79822SAndrew Rist * software distributed under the License is distributed on an
15b3f79822SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b3f79822SAndrew Rist * KIND, either express or implied. See the License for the
17b3f79822SAndrew Rist * specific language governing permissions and limitations
18b3f79822SAndrew Rist * under the License.
19b3f79822SAndrew Rist *
20b3f79822SAndrew Rist *************************************************************/
21b3f79822SAndrew Rist
22b3f79822SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir
28cdf0e10cSrcweir
29cdf0e10cSrcweir //----------------------------------------------------------------------------
30cdf0e10cSrcweir
31cdf0e10cSrcweir #define _SV_NOXSOUND
32cdf0e10cSrcweir
33cdf0e10cSrcweir #define _BASE_DLGS_HXX
34cdf0e10cSrcweir #define _BIGINT_HXX
35cdf0e10cSrcweir #define _CACHESTR_HXX
36cdf0e10cSrcweir #define _CONFIG_HXX
37cdf0e10cSrcweir #define _CURSOR_HXX
38cdf0e10cSrcweir #define _CTRLTOOL_HXX
39cdf0e10cSrcweir #define _DLGCFG_HXX
40cdf0e10cSrcweir #define _DYNARR_HXX
41cdf0e10cSrcweir #define _EXTATTR_HXX
42cdf0e10cSrcweir #define _FILDLG_HXX
43cdf0e10cSrcweir #define _FONTDLG_HXX
44cdf0e10cSrcweir #define _FRM3D_HXX
45cdf0e10cSrcweir #define _INTRO_HXX
46cdf0e10cSrcweir #define _ISETBWR_HXX
47cdf0e10cSrcweir #define _NO_SVRTF_PARSER_HXX
48cdf0e10cSrcweir #define _MACRODLG_HXX
49cdf0e10cSrcweir #define _MODALDLG_HXX
50cdf0e10cSrcweir #define _MOREBUTTON_HXX
51cdf0e10cSrcweir #define _OUTLINER_HXX
52cdf0e10cSrcweir //#define _PRNDLG_HXX
53cdf0e10cSrcweir //#define _POLY_HXX
54cdf0e10cSrcweir #define _PVRWIN_HXX
55cdf0e10cSrcweir //#define _QUEUE_HXX
56cdf0e10cSrcweir #define _RULER_HXX
57cdf0e10cSrcweir #define _SCRWIN_HXX
58cdf0e10cSrcweir #define _SETBRW_HXX
59cdf0e10cSrcweir //#define _STACK_HXX
60cdf0e10cSrcweir //#define _STATUS_HXX ***
61cdf0e10cSrcweir #define _STDCTRL_HXX
62cdf0e10cSrcweir #define _STDMENU_HXX
63cdf0e10cSrcweir //#define _TAB_HXX
64cdf0e10cSrcweir #define _TABBAR_HXX
65cdf0e10cSrcweir #define _TREELIST_HXX
66cdf0e10cSrcweir #define _VALUESET_HXX
67cdf0e10cSrcweir #define _VCATTR_HXX
68cdf0e10cSrcweir #define _VCBRW_HXX
69cdf0e10cSrcweir #define _VCTRLS_HXX
70cdf0e10cSrcweir #define _VCSBX_HXX
71cdf0e10cSrcweir #define _VCONT_HXX
72cdf0e10cSrcweir #define _VDRWOBJ_HXX
73cdf0e10cSrcweir
74cdf0e10cSrcweir //#define _SELENG_HXX
75cdf0e10cSrcweir //#define _SOUND_HXX
76cdf0e10cSrcweir //#define _SYSDLG_HXX
77cdf0e10cSrcweir
78cdf0e10cSrcweir
79cdf0e10cSrcweir
80cdf0e10cSrcweir
81cdf0e10cSrcweir #define _PASSWD_HXX
82cdf0e10cSrcweir
83cdf0e10cSrcweir #define _SFX_DOCFILE_HXX
84cdf0e10cSrcweir //#define _SFX_DOCFILT_HXX
85cdf0e10cSrcweir #define _SFX_DOCINF_HXX
86cdf0e10cSrcweir #define _SFX_DOCSH_HXX
87cdf0e10cSrcweir //#define _SFXDOCFILT_HXX
88cdf0e10cSrcweir //#define _SFXDOCINF_HXX
89cdf0e10cSrcweir //#define _SFXDOCSH_HXX
90cdf0e10cSrcweir #define _SFX_PRNMON_HXX
91cdf0e10cSrcweir #define _SFX_RESMGR_HXX
92cdf0e10cSrcweir #define _SFX_TEMPLDLG_HXX
93cdf0e10cSrcweir //#define _SFXAPPWIN_HXX
94cdf0e10cSrcweir #define _SFXBASIC_HXX
95cdf0e10cSrcweir #define _SFXCTRLITEM
96cdf0e10cSrcweir #define _SFXDLGCFG_HXX
97cdf0e10cSrcweir //#define _SFXDISPATCH_HXX
98cdf0e10cSrcweir #define _SFXFILEDLG_HXX
99cdf0e10cSrcweir //#define _SFXIMGMGR_HXX
100cdf0e10cSrcweir #define _SFXIPFRM_HXX
101cdf0e10cSrcweir #define _SFX_MACRO_HXX
102cdf0e10cSrcweir #define _SFXMNUITEM_HXX
103cdf0e10cSrcweir #define _SFXMNUMGR_HXX
104cdf0e10cSrcweir #define _SFXMULTISEL_HXX
105cdf0e10cSrcweir //#define _SFXMSG_HXX
106cdf0e10cSrcweir #define _SFXMSGDESCR_HXX
107cdf0e10cSrcweir #define _SFXMSGPOOL_HXX
108cdf0e10cSrcweir #define _SFX_MINFITEM_HXX
109cdf0e10cSrcweir #define _SFXOBJFACE_HXX
110cdf0e10cSrcweir #define _SFXOBJFAC_HXX
111cdf0e10cSrcweir #define _SFX_SAVEOPT_HXX
112cdf0e10cSrcweir #define _SFXSTBITEM_HXX
113cdf0e10cSrcweir #define _SFXSTBMGR_HXX
114cdf0e10cSrcweir #define _SFXTBXCTRL_HXX
115cdf0e10cSrcweir #define _SFXTBXMGR_HXX
116cdf0e10cSrcweir
117cdf0e10cSrcweir #define _SI_HXX
118cdf0e10cSrcweir //#define _SI_DLL_HXX
119cdf0e10cSrcweir //#define _SIDLL_HXX
120cdf0e10cSrcweir //#define _SI_NOITEMS
121cdf0e10cSrcweir //#define _SI_NOOTHERFORMS
122cdf0e10cSrcweir //#define _SI_NOSBXCONTROLS
123cdf0e10cSrcweir //#define _SINOSBXCONTROLS
124cdf0e10cSrcweir //#define _SI_NODRW
125cdf0e10cSrcweir //#define _SI_NOCONTROL
126cdf0e10cSrcweir
127cdf0e10cSrcweir #define _SVBOXITM_HXX
128cdf0e10cSrcweir #define _SVCONTNR_HXX //
129cdf0e10cSrcweir
130cdf0e10cSrcweir #define _SDR_NOTRANSFORM
131cdf0e10cSrcweir
132cdf0e10cSrcweir #define _SVDRAG_HXX
133cdf0e10cSrcweir #define _SVINCVW_HXX
134cdf0e10cSrcweir //#define _SV_MULTISEL_HXX
135cdf0e10cSrcweir #define _SVRTV_HXX
136cdf0e10cSrcweir #define _SVTABBX_HXX
137cdf0e10cSrcweir #define _SVTREEBOX_HXX
138cdf0e10cSrcweir #define _SVTREELIST_HXX
139cdf0e10cSrcweir
140cdf0e10cSrcweir #define _SVX_DAILDLL_HXX
141cdf0e10cSrcweir #define _SVX_HYPHEN_HXX
142cdf0e10cSrcweir #define _SVX_IMPGRF_HXX
143cdf0e10cSrcweir #define _SVX_LAYCTRL_HXX
144cdf0e10cSrcweir #define _SVX_OPTITEMS_HXX
145cdf0e10cSrcweir #define _SVX_OPTGERL_HXX
146cdf0e10cSrcweir #define _SVX_OPTSAVE_HXX
147cdf0e10cSrcweir #define _SVX_OPTSPELL_HXX
148cdf0e10cSrcweir #define _SVX_OPTPATH_HXX
149cdf0e10cSrcweir #define _SVX_OPTLINGU_HXX
150cdf0e10cSrcweir #define _SVX_RULER_HXX
151cdf0e10cSrcweir #define _SVX_RULRITEM_HXX
152cdf0e10cSrcweir #define _SVX_SELCTRL_HXX
153cdf0e10cSrcweir #define _SVX_SPLWRAP_HXX
154cdf0e10cSrcweir #define _SVX_SPLDLG_HXX
155cdf0e10cSrcweir #define _SVX_STDDLG_HXX
156cdf0e10cSrcweir #define _SVX_THESDLG_HXX
157cdf0e10cSrcweir
158cdf0e10cSrcweir // INCLUDE -------------------------------------------------------------------
159cdf0e10cSrcweir
160cdf0e10cSrcweir #include "scitems.hxx"
161cdf0e10cSrcweir #include <svx/dbexch.hrc>
162cdf0e10cSrcweir #include <svx/svdetc.hxx>
163cdf0e10cSrcweir #include <svx/svditer.hxx>
164cdf0e10cSrcweir #include <svx/svdoole2.hxx>
165cdf0e10cSrcweir #include <svx/svdpage.hxx>
166cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
167cdf0e10cSrcweir #include <sfx2/docfile.hxx>
168cdf0e10cSrcweir #include <svl/stritem.hxx>
169cdf0e10cSrcweir #include <svl/ptitem.hxx>
170cdf0e10cSrcweir #include <svl/urlbmk.hxx>
171cdf0e10cSrcweir #include <sot/clsids.hxx>
172cdf0e10cSrcweir #include <sot/formats.hxx>
173cdf0e10cSrcweir #include <vcl/graph.hxx>
174cdf0e10cSrcweir #include <vcl/virdev.hxx>
175cdf0e10cSrcweir #include <vcl/msgbox.hxx>
176cdf0e10cSrcweir #include <tools/urlobj.hxx>
177cdf0e10cSrcweir #include <sot/exchange.hxx>
178cdf0e10cSrcweir #include <memory>
179cdf0e10cSrcweir
180cdf0e10cSrcweir #include "attrib.hxx"
181cdf0e10cSrcweir #include "patattr.hxx"
182cdf0e10cSrcweir #include "dociter.hxx"
183cdf0e10cSrcweir #include "viewfunc.hxx"
184cdf0e10cSrcweir #include "tabvwsh.hxx"
185cdf0e10cSrcweir #include "docsh.hxx"
186cdf0e10cSrcweir #include "docfunc.hxx"
187cdf0e10cSrcweir #include "undoblk.hxx"
188cdf0e10cSrcweir #include "refundo.hxx"
189cdf0e10cSrcweir #include "globstr.hrc"
190cdf0e10cSrcweir #include "global.hxx"
191cdf0e10cSrcweir #include "transobj.hxx"
192cdf0e10cSrcweir #include "drwtrans.hxx"
193cdf0e10cSrcweir #include "rangenam.hxx"
194cdf0e10cSrcweir #include "dbcolect.hxx"
195cdf0e10cSrcweir #include "impex.hxx" // Sylk-ID fuer CB
196cdf0e10cSrcweir #include "chgtrack.hxx"
197cdf0e10cSrcweir #include "waitoff.hxx"
198cdf0e10cSrcweir #include "scmod.hxx"
199cdf0e10cSrcweir #include "sc.hrc"
200cdf0e10cSrcweir #include "inputopt.hxx"
201cdf0e10cSrcweir #include "warnbox.hxx"
202cdf0e10cSrcweir #include "drwlayer.hxx"
203cdf0e10cSrcweir #include "editable.hxx"
204cdf0e10cSrcweir #include "transobj.hxx"
205cdf0e10cSrcweir #include "drwtrans.hxx"
206cdf0e10cSrcweir #include "docuno.hxx"
207cdf0e10cSrcweir #include "clipparam.hxx"
208cdf0e10cSrcweir #include "drawview.hxx"
209cdf0e10cSrcweir #include "chartlis.hxx"
210cdf0e10cSrcweir #include "charthelper.hxx"
211cdf0e10cSrcweir
212cdf0e10cSrcweir
213cdf0e10cSrcweir using namespace com::sun::star;
214cdf0e10cSrcweir
215cdf0e10cSrcweir // STATIC DATA ---------------------------------------------------------------
216cdf0e10cSrcweir
217cdf0e10cSrcweir
218cdf0e10cSrcweir //============================================================================
219cdf0e10cSrcweir
220cdf0e10cSrcweir // GlobalName der Writer-DocShell kommt jetzt aus comphelper/classids.hxx
221cdf0e10cSrcweir
222cdf0e10cSrcweir //----------------------------------------------------------------------------
223cdf0e10cSrcweir // C U T
224cdf0e10cSrcweir
CutToClip(ScDocument * pClipDoc,sal_Bool bIncludeObjects)225cdf0e10cSrcweir void ScViewFunc::CutToClip( ScDocument* pClipDoc, sal_Bool bIncludeObjects )
226cdf0e10cSrcweir {
227cdf0e10cSrcweir UpdateInputLine();
228cdf0e10cSrcweir
229cdf0e10cSrcweir ScEditableTester aTester( this );
230cdf0e10cSrcweir if (!aTester.IsEditable()) // selection editable?
231cdf0e10cSrcweir {
232cdf0e10cSrcweir ErrorMessage( aTester.GetMessageId() );
233cdf0e10cSrcweir return;
234cdf0e10cSrcweir }
235cdf0e10cSrcweir
236cdf0e10cSrcweir ScRange aRange; // zu loeschender Bereich
237cdf0e10cSrcweir if ( GetViewData()->GetSimpleArea( aRange ) == SC_MARK_SIMPLE )
238cdf0e10cSrcweir {
239cdf0e10cSrcweir ScDocument* pDoc = GetViewData()->GetDocument();
240cdf0e10cSrcweir ScDocShell* pDocSh = GetViewData()->GetDocShell();
241cdf0e10cSrcweir ScMarkData& rMark = GetViewData()->GetMarkData();
242cdf0e10cSrcweir const sal_Bool bRecord(pDoc->IsUndoEnabled()); // Undo/Redo
243cdf0e10cSrcweir
244cdf0e10cSrcweir ScDocShellModificator aModificator( *pDocSh );
245cdf0e10cSrcweir
246cdf0e10cSrcweir if ( !rMark.IsMarked() && !rMark.IsMultiMarked() ) // mark the range if not marked yet
247cdf0e10cSrcweir {
248cdf0e10cSrcweir DoneBlockMode();
249cdf0e10cSrcweir InitOwnBlockMode();
250cdf0e10cSrcweir rMark.SetMarkArea( aRange );
251cdf0e10cSrcweir MarkDataChanged();
252cdf0e10cSrcweir }
253cdf0e10cSrcweir
254cdf0e10cSrcweir CopyToClip( pClipDoc, sal_True, sal_False, bIncludeObjects ); // Ab ins Clipboard
255cdf0e10cSrcweir
256cdf0e10cSrcweir ScAddress aOldEnd( aRange.aEnd ); // Zusammengefasste Zellen im Bereich?
257cdf0e10cSrcweir pDoc->ExtendMerge( aRange, sal_True );
258cdf0e10cSrcweir
259cdf0e10cSrcweir ScDocument* pUndoDoc = NULL;
260cdf0e10cSrcweir if ( bRecord )
261cdf0e10cSrcweir {
262cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
263cdf0e10cSrcweir pUndoDoc->InitUndoSelected( pDoc, rMark );
264cdf0e10cSrcweir // all sheets - CopyToDocument skips those that don't exist in pUndoDoc
265cdf0e10cSrcweir ScRange aCopyRange = aRange;
266cdf0e10cSrcweir aCopyRange.aStart.SetTab(0);
267cdf0e10cSrcweir aCopyRange.aEnd.SetTab(pDoc->GetTableCount()-1);
268cdf0e10cSrcweir pDoc->CopyToDocument( aCopyRange, (IDF_ALL & ~IDF_OBJECTS) | IDF_NOCAPTIONS, sal_False, pUndoDoc );
269cdf0e10cSrcweir pDoc->BeginDrawUndo();
270cdf0e10cSrcweir }
271cdf0e10cSrcweir
272cdf0e10cSrcweir sal_uInt16 nExtFlags = 0;
273cdf0e10cSrcweir pDocSh->UpdatePaintExt( nExtFlags, aRange );
274cdf0e10cSrcweir
275cdf0e10cSrcweir HideCursor(); // Cursor aendert sich !
276cdf0e10cSrcweir
277cdf0e10cSrcweir rMark.MarkToMulti();
278cdf0e10cSrcweir pDoc->DeleteSelection( IDF_ALL, rMark );
279cdf0e10cSrcweir if ( bIncludeObjects )
280cdf0e10cSrcweir pDoc->DeleteObjectsInSelection( rMark );
281cdf0e10cSrcweir rMark.MarkToSimple();
282cdf0e10cSrcweir
283cdf0e10cSrcweir if ( !AdjustRowHeight( aRange.aStart.Row(), aRange.aEnd.Row() ) )
284cdf0e10cSrcweir pDocSh->PostPaint( aRange, PAINT_GRID, nExtFlags );
285cdf0e10cSrcweir
286cdf0e10cSrcweir if ( bRecord ) // erst jetzt ist Draw-Undo verfuegbar
287cdf0e10cSrcweir pDocSh->GetUndoManager()->AddUndoAction(
288cdf0e10cSrcweir new ScUndoCut( pDocSh, aRange, aOldEnd, rMark, pUndoDoc ) );
289cdf0e10cSrcweir
290cdf0e10cSrcweir aModificator.SetDocumentModified();
291cdf0e10cSrcweir ShowCursor(); // Cursor aendert sich !
292cdf0e10cSrcweir pDocSh->UpdateOle(GetViewData());
293cdf0e10cSrcweir
294cdf0e10cSrcweir CellContentChanged();
295cdf0e10cSrcweir }
296cdf0e10cSrcweir else
297cdf0e10cSrcweir ErrorMessage( STR_NOMULTISELECT );
298cdf0e10cSrcweir }
299cdf0e10cSrcweir
300cdf0e10cSrcweir
301cdf0e10cSrcweir //----------------------------------------------------------------------------
302cdf0e10cSrcweir // C O P Y
303cdf0e10cSrcweir
CopyToClip(ScDocument * pClipDoc,sal_Bool bCut,sal_Bool bApi,sal_Bool bIncludeObjects,sal_Bool bStopEdit)304cdf0e10cSrcweir sal_Bool ScViewFunc::CopyToClip( ScDocument* pClipDoc, sal_Bool bCut, sal_Bool bApi, sal_Bool bIncludeObjects, sal_Bool bStopEdit )
305cdf0e10cSrcweir {
306cdf0e10cSrcweir sal_Bool bDone = sal_False;
307cdf0e10cSrcweir if ( bStopEdit )
308cdf0e10cSrcweir UpdateInputLine();
309cdf0e10cSrcweir
310cdf0e10cSrcweir ScRange aRange;
311cdf0e10cSrcweir ScMarkType eMarkType = GetViewData()->GetSimpleArea( aRange );
312cdf0e10cSrcweir ScDocument* pDoc = GetViewData()->GetDocument();
313cdf0e10cSrcweir ScMarkData& rMark = GetViewData()->GetMarkData();
314cdf0e10cSrcweir if ( eMarkType == SC_MARK_SIMPLE || eMarkType == SC_MARK_SIMPLE_FILTERED )
315cdf0e10cSrcweir {
316cdf0e10cSrcweir if ( !pDoc->HasSelectedBlockMatrixFragment(
317cdf0e10cSrcweir aRange.aStart.Col(), aRange.aStart.Row(),
318cdf0e10cSrcweir aRange.aEnd.Col(), aRange.aEnd.Row(),
319cdf0e10cSrcweir rMark ) )
320cdf0e10cSrcweir {
321cdf0e10cSrcweir sal_Bool bSysClip = sal_False;
322cdf0e10cSrcweir if ( !pClipDoc ) // no clip doc specified
323cdf0e10cSrcweir {
324cdf0e10cSrcweir pClipDoc = new ScDocument( SCDOCMODE_CLIP ); // create one (deleted by ScTransferObj)
325cdf0e10cSrcweir bSysClip = sal_True; // and copy into system
326cdf0e10cSrcweir }
327cdf0e10cSrcweir
328cdf0e10cSrcweir if ( !bCut )
329cdf0e10cSrcweir {
330cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
331cdf0e10cSrcweir if ( pChangeTrack )
332cdf0e10cSrcweir pChangeTrack->ResetLastCut(); // kein CutMode mehr
333cdf0e10cSrcweir }
334cdf0e10cSrcweir
335cdf0e10cSrcweir if ( bSysClip && bIncludeObjects )
336cdf0e10cSrcweir {
337cdf0e10cSrcweir sal_Bool bAnyOle = pDoc->HasOLEObjectsInArea( aRange, &rMark );
338cdf0e10cSrcweir // update ScGlobal::pDrawClipDocShellRef
339cdf0e10cSrcweir ScDrawLayer::SetGlobalDrawPersist( ScTransferObj::SetDrawClipDoc( bAnyOle ) );
340cdf0e10cSrcweir }
341cdf0e10cSrcweir
342cdf0e10cSrcweir ScClipParam aClipParam(aRange, bCut);
343cdf0e10cSrcweir aClipParam.setSourceDocID( pDoc->GetDocumentID() );
344cdf0e10cSrcweir pDoc->CopyToClip(aClipParam, pClipDoc, &rMark, false, false, bIncludeObjects);
345cdf0e10cSrcweir
346cdf0e10cSrcweir if ( pDoc && pClipDoc )
347cdf0e10cSrcweir {
348cdf0e10cSrcweir ScDrawLayer* pDrawLayer = pClipDoc->GetDrawLayer();
349cdf0e10cSrcweir if ( pDrawLayer )
350cdf0e10cSrcweir {
351cdf0e10cSrcweir ScClipParam& rClipParam = pClipDoc->GetClipParam();
352cdf0e10cSrcweir ScRangeListVector& rRangesVector = rClipParam.maProtectedChartRangesVector;
353cdf0e10cSrcweir SCTAB nTabCount = pClipDoc->GetTableCount();
354cdf0e10cSrcweir for ( SCTAB nTab = 0; nTab < nTabCount; ++nTab )
355cdf0e10cSrcweir {
356cdf0e10cSrcweir SdrPage* pPage = pDrawLayer->GetPage( static_cast< sal_uInt16 >( nTab ) );
357cdf0e10cSrcweir if ( pPage )
358cdf0e10cSrcweir {
359cdf0e10cSrcweir ScChartHelper::FillProtectedChartRangesVector( rRangesVector, pDoc, pPage );
360cdf0e10cSrcweir }
361cdf0e10cSrcweir }
362cdf0e10cSrcweir }
363cdf0e10cSrcweir }
364cdf0e10cSrcweir
365cdf0e10cSrcweir if (bSysClip)
366cdf0e10cSrcweir {
367cdf0e10cSrcweir ScDrawLayer::SetGlobalDrawPersist(NULL);
368cdf0e10cSrcweir
369cdf0e10cSrcweir ScGlobal::SetClipDocName( pDoc->GetDocumentShell()->GetTitle( SFX_TITLE_FULLNAME ) );
370cdf0e10cSrcweir }
371cdf0e10cSrcweir pClipDoc->ExtendMerge( aRange, sal_True );
372cdf0e10cSrcweir
373cdf0e10cSrcweir if (bSysClip)
374cdf0e10cSrcweir {
375cdf0e10cSrcweir ScDocShell* pDocSh = GetViewData()->GetDocShell();
376cdf0e10cSrcweir TransferableObjectDescriptor aObjDesc;
377cdf0e10cSrcweir pDocSh->FillTransferableObjectDescriptor( aObjDesc );
378cdf0e10cSrcweir aObjDesc.maDisplayName = pDocSh->GetMedium()->GetURLObject().GetURLNoPass();
379cdf0e10cSrcweir // maSize is set in ScTransferObj ctor
380cdf0e10cSrcweir
381cdf0e10cSrcweir ScTransferObj* pTransferObj = new ScTransferObj( pClipDoc, aObjDesc );
382cdf0e10cSrcweir uno::Reference<datatransfer::XTransferable> xTransferable( pTransferObj );
383cdf0e10cSrcweir
384cdf0e10cSrcweir if ( ScGlobal::pDrawClipDocShellRef )
385cdf0e10cSrcweir {
386cdf0e10cSrcweir SfxObjectShellRef aPersistRef( &(*ScGlobal::pDrawClipDocShellRef) );
387cdf0e10cSrcweir pTransferObj->SetDrawPersist( aPersistRef ); // keep persist for ole objects alive
388cdf0e10cSrcweir }
389cdf0e10cSrcweir
390cdf0e10cSrcweir pTransferObj->CopyToClipboard( GetActiveWin() ); // system clipboard
391cdf0e10cSrcweir SC_MOD()->SetClipObject( pTransferObj, NULL ); // internal clipboard
392cdf0e10cSrcweir }
393cdf0e10cSrcweir
394cdf0e10cSrcweir bDone = sal_True;
395cdf0e10cSrcweir }
396cdf0e10cSrcweir else
397cdf0e10cSrcweir {
398cdf0e10cSrcweir if (!bApi)
399cdf0e10cSrcweir ErrorMessage(STR_MATRIXFRAGMENTERR);
400cdf0e10cSrcweir }
401cdf0e10cSrcweir }
402cdf0e10cSrcweir else if (eMarkType == SC_MARK_MULTI)
403cdf0e10cSrcweir {
404cdf0e10cSrcweir bool bSuccess = false;
405cdf0e10cSrcweir ScClipParam aClipParam;
406cdf0e10cSrcweir aClipParam.mbCutMode = false;
407cdf0e10cSrcweir rMark.MarkToSimple();
408cdf0e10cSrcweir rMark.FillRangeListWithMarks(&aClipParam.maRanges, false);
409cdf0e10cSrcweir
410cdf0e10cSrcweir do
411cdf0e10cSrcweir {
412cdf0e10cSrcweir if (bCut)
413cdf0e10cSrcweir // We con't support cutting of multi-selections.
414cdf0e10cSrcweir break;
415cdf0e10cSrcweir
416cdf0e10cSrcweir if (pClipDoc)
417cdf0e10cSrcweir // TODO: What's this for?
418cdf0e10cSrcweir break;
419cdf0e10cSrcweir
420cdf0e10cSrcweir ::std::auto_ptr<ScDocument> pDocClip(new ScDocument(SCDOCMODE_CLIP));
421cdf0e10cSrcweir
422cdf0e10cSrcweir // Check for geometrical feasibility of the ranges.
423cdf0e10cSrcweir bool bValidRanges = true;
424cdf0e10cSrcweir ScRangePtr p = aClipParam.maRanges.First();
425cdf0e10cSrcweir SCCOL nPrevColDelta = 0;
426cdf0e10cSrcweir SCROW nPrevRowDelta = 0;
427cdf0e10cSrcweir SCCOL nPrevCol = p->aStart.Col();
428cdf0e10cSrcweir SCROW nPrevRow = p->aStart.Row();
429cdf0e10cSrcweir SCCOL nPrevColSize = p->aEnd.Col() - p->aStart.Col() + 1;
430cdf0e10cSrcweir SCROW nPrevRowSize = p->aEnd.Row() - p->aStart.Row() + 1;
431cdf0e10cSrcweir for (p = aClipParam.maRanges.Next(); p; p = aClipParam.maRanges.Next())
432cdf0e10cSrcweir {
433cdf0e10cSrcweir if (pDoc->HasSelectedBlockMatrixFragment(
434cdf0e10cSrcweir p->aStart.Col(), p->aStart.Row(), p->aEnd.Col(), p->aEnd.Row(), rMark))
435cdf0e10cSrcweir {
436cdf0e10cSrcweir if (!bApi)
437cdf0e10cSrcweir ErrorMessage(STR_MATRIXFRAGMENTERR);
438cdf0e10cSrcweir return false;
439cdf0e10cSrcweir }
440cdf0e10cSrcweir
441cdf0e10cSrcweir SCCOL nColDelta = p->aStart.Col() - nPrevCol;
442cdf0e10cSrcweir SCROW nRowDelta = p->aStart.Row() - nPrevRow;
443cdf0e10cSrcweir
444cdf0e10cSrcweir if ((nColDelta && nRowDelta) || (nPrevColDelta && nRowDelta) || (nPrevRowDelta && nColDelta))
445cdf0e10cSrcweir {
446cdf0e10cSrcweir bValidRanges = false;
447cdf0e10cSrcweir break;
448cdf0e10cSrcweir }
449cdf0e10cSrcweir
450cdf0e10cSrcweir if (aClipParam.meDirection == ScClipParam::Unspecified)
451cdf0e10cSrcweir {
452cdf0e10cSrcweir if (nColDelta)
453cdf0e10cSrcweir aClipParam.meDirection = ScClipParam::Column;
454cdf0e10cSrcweir if (nRowDelta)
455cdf0e10cSrcweir aClipParam.meDirection = ScClipParam::Row;
456cdf0e10cSrcweir }
457cdf0e10cSrcweir
458cdf0e10cSrcweir SCCOL nColSize = p->aEnd.Col() - p->aStart.Col() + 1;
459cdf0e10cSrcweir SCROW nRowSize = p->aEnd.Row() - p->aStart.Row() + 1;
460cdf0e10cSrcweir
461cdf0e10cSrcweir if (aClipParam.meDirection == ScClipParam::Column && nRowSize != nPrevRowSize)
462cdf0e10cSrcweir {
463cdf0e10cSrcweir // column-oriented ranges must have identical row size.
464cdf0e10cSrcweir bValidRanges = false;
465cdf0e10cSrcweir break;
466cdf0e10cSrcweir }
467cdf0e10cSrcweir if (aClipParam.meDirection == ScClipParam::Row && nColSize != nPrevColSize)
468cdf0e10cSrcweir {
469cdf0e10cSrcweir // likewise, row-oriented ranges must have identical
470cdf0e10cSrcweir // column size.
471cdf0e10cSrcweir bValidRanges = false;
472cdf0e10cSrcweir break;
473cdf0e10cSrcweir }
474cdf0e10cSrcweir
475cdf0e10cSrcweir nPrevCol = p->aStart.Col();
476cdf0e10cSrcweir nPrevRow = p->aStart.Row();
477cdf0e10cSrcweir nPrevColDelta = nColDelta;
478cdf0e10cSrcweir nPrevRowDelta = nRowDelta;
479cdf0e10cSrcweir nPrevColSize = nColSize;
480cdf0e10cSrcweir nPrevRowSize = nRowSize;
481cdf0e10cSrcweir }
482cdf0e10cSrcweir if (!bValidRanges)
483cdf0e10cSrcweir break;
484cdf0e10cSrcweir
485cdf0e10cSrcweir pDoc->CopyToClip(aClipParam, pDocClip.get(), &rMark, false, false, bIncludeObjects);
486cdf0e10cSrcweir
487cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
488cdf0e10cSrcweir if ( pChangeTrack )
489cdf0e10cSrcweir pChangeTrack->ResetLastCut(); // kein CutMode mehr
490cdf0e10cSrcweir
491cdf0e10cSrcweir {
492cdf0e10cSrcweir ScDocShell* pDocSh = GetViewData()->GetDocShell();
493cdf0e10cSrcweir TransferableObjectDescriptor aObjDesc;
494cdf0e10cSrcweir pDocSh->FillTransferableObjectDescriptor( aObjDesc );
495cdf0e10cSrcweir aObjDesc.maDisplayName = pDocSh->GetMedium()->GetURLObject().GetURLNoPass();
496cdf0e10cSrcweir // maSize is set in ScTransferObj ctor
497cdf0e10cSrcweir
498cdf0e10cSrcweir ScTransferObj* pTransferObj = new ScTransferObj( pDocClip.release(), aObjDesc );
499cdf0e10cSrcweir uno::Reference<datatransfer::XTransferable> xTransferable( pTransferObj );
500cdf0e10cSrcweir
501cdf0e10cSrcweir if ( ScGlobal::pDrawClipDocShellRef )
502cdf0e10cSrcweir {
503cdf0e10cSrcweir SfxObjectShellRef aPersistRef( &(*ScGlobal::pDrawClipDocShellRef) );
504cdf0e10cSrcweir pTransferObj->SetDrawPersist( aPersistRef ); // keep persist for ole objects alive
505cdf0e10cSrcweir }
506cdf0e10cSrcweir
507cdf0e10cSrcweir pTransferObj->CopyToClipboard( GetActiveWin() ); // system clipboard
508cdf0e10cSrcweir SC_MOD()->SetClipObject( pTransferObj, NULL ); // internal clipboard
509cdf0e10cSrcweir }
510cdf0e10cSrcweir
511cdf0e10cSrcweir bSuccess = true;
512cdf0e10cSrcweir }
513cdf0e10cSrcweir while (false);
514cdf0e10cSrcweir
515cdf0e10cSrcweir if (!bSuccess && !bApi)
516cdf0e10cSrcweir ErrorMessage(STR_NOMULTISELECT);
517cdf0e10cSrcweir
518cdf0e10cSrcweir bDone = bSuccess;
519cdf0e10cSrcweir }
520cdf0e10cSrcweir else
521cdf0e10cSrcweir {
522cdf0e10cSrcweir if (!bApi)
523cdf0e10cSrcweir ErrorMessage(STR_NOMULTISELECT);
524cdf0e10cSrcweir }
525cdf0e10cSrcweir
526cdf0e10cSrcweir return bDone;
527cdf0e10cSrcweir }
528cdf0e10cSrcweir
CopyToTransferable()529cdf0e10cSrcweir ScTransferObj* ScViewFunc::CopyToTransferable()
530cdf0e10cSrcweir {
531cdf0e10cSrcweir ScRange aRange;
532cdf0e10cSrcweir if ( GetViewData()->GetSimpleArea( aRange ) == SC_MARK_SIMPLE )
533cdf0e10cSrcweir {
534cdf0e10cSrcweir ScDocument* pDoc = GetViewData()->GetDocument();
535cdf0e10cSrcweir ScMarkData& rMark = GetViewData()->GetMarkData();
536cdf0e10cSrcweir if ( !pDoc->HasSelectedBlockMatrixFragment(
537cdf0e10cSrcweir aRange.aStart.Col(), aRange.aStart.Row(),
538cdf0e10cSrcweir aRange.aEnd.Col(), aRange.aEnd.Row(),
539cdf0e10cSrcweir rMark ) )
540cdf0e10cSrcweir {
541cdf0e10cSrcweir ScDocument *pClipDoc = new ScDocument( SCDOCMODE_CLIP ); // create one (deleted by ScTransferObj)
542cdf0e10cSrcweir
543cdf0e10cSrcweir sal_Bool bAnyOle = pDoc->HasOLEObjectsInArea( aRange, &rMark );
544cdf0e10cSrcweir ScDrawLayer::SetGlobalDrawPersist( ScTransferObj::SetDrawClipDoc( bAnyOle ) );
545cdf0e10cSrcweir
546cdf0e10cSrcweir ScClipParam aClipParam(aRange, false);
547cdf0e10cSrcweir pDoc->CopyToClip(aClipParam, pClipDoc, &rMark, false, false, true);
548cdf0e10cSrcweir
549cdf0e10cSrcweir ScDrawLayer::SetGlobalDrawPersist(NULL);
550cdf0e10cSrcweir pClipDoc->ExtendMerge( aRange, sal_True );
551cdf0e10cSrcweir
552cdf0e10cSrcweir ScDocShell* pDocSh = GetViewData()->GetDocShell();
553cdf0e10cSrcweir TransferableObjectDescriptor aObjDesc;
554cdf0e10cSrcweir pDocSh->FillTransferableObjectDescriptor( aObjDesc );
555cdf0e10cSrcweir aObjDesc.maDisplayName = pDocSh->GetMedium()->GetURLObject().GetURLNoPass();
556cdf0e10cSrcweir ScTransferObj* pTransferObj = new ScTransferObj( pClipDoc, aObjDesc );
557cdf0e10cSrcweir return pTransferObj;
558cdf0e10cSrcweir }
559cdf0e10cSrcweir }
560cdf0e10cSrcweir
561cdf0e10cSrcweir return NULL;
562cdf0e10cSrcweir }
563cdf0e10cSrcweir
564cdf0e10cSrcweir //----------------------------------------------------------------------------
565cdf0e10cSrcweir // P A S T E
566cdf0e10cSrcweir
PasteDraw()567cdf0e10cSrcweir void ScViewFunc::PasteDraw()
568cdf0e10cSrcweir {
569cdf0e10cSrcweir ScViewData* pViewData = GetViewData();
570cdf0e10cSrcweir SCCOL nPosX = pViewData->GetCurX();
571cdf0e10cSrcweir SCROW nPosY = pViewData->GetCurY();
572cdf0e10cSrcweir Window* pWin = GetActiveWin();
573cdf0e10cSrcweir Point aPos = pWin->PixelToLogic( pViewData->GetScrPos( nPosX, nPosY,
574cdf0e10cSrcweir pViewData->GetActivePart() ) );
575cdf0e10cSrcweir ScDrawTransferObj* pDrawClip = ScDrawTransferObj::GetOwnClipboard( pWin );
576cdf0e10cSrcweir if (pDrawClip)
577cdf0e10cSrcweir PasteDraw( aPos, pDrawClip->GetModel(), sal_False,
578cdf0e10cSrcweir pDrawClip->GetSourceDocID() == pViewData->GetDocument()->GetDocumentID() );
579cdf0e10cSrcweir }
580cdf0e10cSrcweir
PasteFromSystem()581cdf0e10cSrcweir void ScViewFunc::PasteFromSystem()
582cdf0e10cSrcweir {
583cdf0e10cSrcweir UpdateInputLine();
584cdf0e10cSrcweir
585cdf0e10cSrcweir Window* pWin = GetActiveWin();
586cdf0e10cSrcweir ScTransferObj* pOwnClip = ScTransferObj::GetOwnClipboard( pWin );
587cdf0e10cSrcweir ScDrawTransferObj* pDrawClip = ScDrawTransferObj::GetOwnClipboard( pWin );
588cdf0e10cSrcweir
589cdf0e10cSrcweir if (pOwnClip)
590cdf0e10cSrcweir {
591cdf0e10cSrcweir // #129384# keep a reference in case the clipboard is changed during PasteFromClip
592cdf0e10cSrcweir uno::Reference<datatransfer::XTransferable> aOwnClipRef( pOwnClip );
593cdf0e10cSrcweir PasteFromClip( IDF_ALL, pOwnClip->GetDocument(),
594cdf0e10cSrcweir PASTE_NOFUNC, sal_False, sal_False, sal_False, INS_NONE, IDF_NONE,
595cdf0e10cSrcweir sal_True ); // allow warning dialog
596cdf0e10cSrcweir }
597cdf0e10cSrcweir else if (pDrawClip)
598cdf0e10cSrcweir PasteDraw();
599cdf0e10cSrcweir else
600cdf0e10cSrcweir {
601cdf0e10cSrcweir TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pWin ) );
602cdf0e10cSrcweir
603cdf0e10cSrcweir // if (pClipObj.Is())
604cdf0e10cSrcweir {
605cdf0e10cSrcweir sal_uLong nBiff8 = SotExchange::RegisterFormatName(
606cdf0e10cSrcweir String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Biff8")));
607cdf0e10cSrcweir sal_uLong nBiff5 = SotExchange::RegisterFormatName(
608cdf0e10cSrcweir String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Biff5")));
609cdf0e10cSrcweir
610cdf0e10cSrcweir // als erstes SvDraw-Model, dann Grafik
611cdf0e10cSrcweir // (Grafik darf nur bei einzelner Grafik drinstehen)
612cdf0e10cSrcweir
613cdf0e10cSrcweir if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ))
614cdf0e10cSrcweir {
615cdf0e10cSrcweir // special case for tables from drawing
616cdf0e10cSrcweir if( aDataHelper.HasFormat( SOT_FORMAT_RTF ) )
617cdf0e10cSrcweir {
618cdf0e10cSrcweir PasteFromSystem( FORMAT_RTF );
619cdf0e10cSrcweir }
620cdf0e10cSrcweir else
621cdf0e10cSrcweir {
622cdf0e10cSrcweir PasteFromSystem( SOT_FORMATSTR_ID_DRAWING );
623cdf0e10cSrcweir }
624cdf0e10cSrcweir }
625cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ))
626cdf0e10cSrcweir PasteFromSystem( SOT_FORMATSTR_ID_SVXB );
627cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_EMBED_SOURCE ))
628cdf0e10cSrcweir {
629cdf0e10cSrcweir // If it's a Writer object, insert RTF instead of OLE
630cdf0e10cSrcweir
631cdf0e10cSrcweir sal_Bool bDoRtf = sal_False;
632cdf0e10cSrcweir TransferableObjectDescriptor aObjDesc;
633cdf0e10cSrcweir if( aDataHelper.GetTransferableObjectDescriptor( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aObjDesc ) )
634cdf0e10cSrcweir {
635cdf0e10cSrcweir bDoRtf = ( ( aObjDesc.maClassName == SvGlobalName( SO3_SW_CLASSID ) ||
636cdf0e10cSrcweir aObjDesc.maClassName == SvGlobalName( SO3_SWWEB_CLASSID ) )
637cdf0e10cSrcweir && aDataHelper.HasFormat( SOT_FORMAT_RTF ) );
638cdf0e10cSrcweir }
639cdf0e10cSrcweir if ( bDoRtf )
640cdf0e10cSrcweir PasteFromSystem( FORMAT_RTF );
641cdf0e10cSrcweir else
642cdf0e10cSrcweir PasteFromSystem( SOT_FORMATSTR_ID_EMBED_SOURCE );
643cdf0e10cSrcweir }
644cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_LINK_SOURCE ))
645cdf0e10cSrcweir PasteFromSystem( SOT_FORMATSTR_ID_LINK_SOURCE );
646cdf0e10cSrcweir // the following format can not affect scenario from #89579#
647cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE ))
648cdf0e10cSrcweir PasteFromSystem( SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE );
649cdf0e10cSrcweir // FORMAT_PRIVATE no longer here (can't work if pOwnClip is NULL)
650cdf0e10cSrcweir else if (aDataHelper.HasFormat(nBiff8)) // before xxx_OLE formats
651cdf0e10cSrcweir PasteFromSystem(nBiff8);
652cdf0e10cSrcweir else if (aDataHelper.HasFormat(nBiff5))
653cdf0e10cSrcweir PasteFromSystem(nBiff5);
654cdf0e10cSrcweir else if (aDataHelper.HasFormat(FORMAT_RTF))
655cdf0e10cSrcweir PasteFromSystem(FORMAT_RTF);
656cdf0e10cSrcweir else if (aDataHelper.HasFormat(SOT_FORMATSTR_ID_HTML))
657cdf0e10cSrcweir PasteFromSystem(SOT_FORMATSTR_ID_HTML);
658cdf0e10cSrcweir else if (aDataHelper.HasFormat(SOT_FORMATSTR_ID_HTML_SIMPLE))
659cdf0e10cSrcweir PasteFromSystem(SOT_FORMATSTR_ID_HTML_SIMPLE);
660cdf0e10cSrcweir else if (aDataHelper.HasFormat(SOT_FORMATSTR_ID_SYLK))
661cdf0e10cSrcweir PasteFromSystem(SOT_FORMATSTR_ID_SYLK);
662cdf0e10cSrcweir else if (aDataHelper.HasFormat(FORMAT_STRING))
663cdf0e10cSrcweir PasteFromSystem(FORMAT_STRING);
664cdf0e10cSrcweir else if (aDataHelper.HasFormat(FORMAT_GDIMETAFILE))
665cdf0e10cSrcweir PasteFromSystem(FORMAT_GDIMETAFILE);
666cdf0e10cSrcweir else if (aDataHelper.HasFormat(FORMAT_BITMAP))
667cdf0e10cSrcweir PasteFromSystem(FORMAT_BITMAP);
668cdf0e10cSrcweir // #89579# xxx_OLE formats come last, like in SotExchange tables
669cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_EMBED_SOURCE_OLE ))
670cdf0e10cSrcweir PasteFromSystem( SOT_FORMATSTR_ID_EMBED_SOURCE_OLE );
671cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_LINK_SOURCE_OLE ))
672cdf0e10cSrcweir PasteFromSystem( SOT_FORMATSTR_ID_LINK_SOURCE_OLE );
673cdf0e10cSrcweir // else
674cdf0e10cSrcweir // ErrorMessage(STR_PASTE_ERROR);
675cdf0e10cSrcweir }
676cdf0e10cSrcweir // else
677cdf0e10cSrcweir // ErrorMessage(STR_PASTE_ERROR);
678cdf0e10cSrcweir }
679cdf0e10cSrcweir
680cdf0e10cSrcweir // keine Fehlermeldung, weil SID_PASTE in der idl das FastCall-Flag hat,
681cdf0e10cSrcweir // also auch gerufen wird, wenn nichts im Clipboard steht (#42531#)
682cdf0e10cSrcweir }
683cdf0e10cSrcweir
PasteFromTransferable(const uno::Reference<datatransfer::XTransferable> & rxTransferable)684cdf0e10cSrcweir void ScViewFunc::PasteFromTransferable( const uno::Reference<datatransfer::XTransferable>& rxTransferable )
685cdf0e10cSrcweir {
686cdf0e10cSrcweir ScTransferObj *pOwnClip=0;
687cdf0e10cSrcweir ScDrawTransferObj *pDrawClip=0;
688cdf0e10cSrcweir uno::Reference<lang::XUnoTunnel> xTunnel( rxTransferable, uno::UNO_QUERY );
689cdf0e10cSrcweir if ( xTunnel.is() )
690cdf0e10cSrcweir {
691cdf0e10cSrcweir sal_Int64 nHandle = xTunnel->getSomething( ScTransferObj::getUnoTunnelId() );
692cdf0e10cSrcweir if ( nHandle )
693cdf0e10cSrcweir pOwnClip = (ScTransferObj*) (sal_IntPtr) nHandle;
694cdf0e10cSrcweir else
695cdf0e10cSrcweir {
696cdf0e10cSrcweir nHandle = xTunnel->getSomething( ScDrawTransferObj::getUnoTunnelId() );
697cdf0e10cSrcweir if ( nHandle )
698cdf0e10cSrcweir pDrawClip = (ScDrawTransferObj*) (sal_IntPtr) nHandle;
699cdf0e10cSrcweir }
700cdf0e10cSrcweir }
701cdf0e10cSrcweir
702cdf0e10cSrcweir if (pOwnClip)
703cdf0e10cSrcweir {
704cdf0e10cSrcweir PasteFromClip( IDF_ALL, pOwnClip->GetDocument(),
705cdf0e10cSrcweir PASTE_NOFUNC, sal_False, sal_False, sal_False, INS_NONE, IDF_NONE,
706cdf0e10cSrcweir sal_True ); // allow warning dialog
707cdf0e10cSrcweir }
708cdf0e10cSrcweir else if (pDrawClip)
709cdf0e10cSrcweir {
710cdf0e10cSrcweir ScViewData* pViewData = GetViewData();
711cdf0e10cSrcweir SCCOL nPosX = pViewData->GetCurX();
712cdf0e10cSrcweir SCROW nPosY = pViewData->GetCurY();
713cdf0e10cSrcweir Window* pWin = GetActiveWin();
714cdf0e10cSrcweir Point aPos = pWin->PixelToLogic( pViewData->GetScrPos( nPosX, nPosY, pViewData->GetActivePart() ) );
715cdf0e10cSrcweir PasteDraw( aPos, pDrawClip->GetModel(), sal_False, pDrawClip->GetSourceDocID() == pViewData->GetDocument()->GetDocumentID() );
716cdf0e10cSrcweir }
717cdf0e10cSrcweir else
718cdf0e10cSrcweir {
719cdf0e10cSrcweir TransferableDataHelper aDataHelper( rxTransferable );
720cdf0e10cSrcweir {
721cdf0e10cSrcweir sal_uLong nBiff8 = SotExchange::RegisterFormatName(
722cdf0e10cSrcweir String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Biff8")));
723cdf0e10cSrcweir sal_uLong nBiff5 = SotExchange::RegisterFormatName(
724cdf0e10cSrcweir String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Biff5")));
725cdf0e10cSrcweir sal_uLong nFormatId = 0;
726cdf0e10cSrcweir // als erstes SvDraw-Model, dann Grafik
727cdf0e10cSrcweir // (Grafik darf nur bei einzelner Grafik drinstehen)
728cdf0e10cSrcweir
729cdf0e10cSrcweir if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ))
730cdf0e10cSrcweir nFormatId = SOT_FORMATSTR_ID_DRAWING;
731cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ))
732cdf0e10cSrcweir nFormatId = SOT_FORMATSTR_ID_SVXB;
733cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_EMBED_SOURCE ))
734cdf0e10cSrcweir {
735cdf0e10cSrcweir // If it's a Writer object, insert RTF instead of OLE
736cdf0e10cSrcweir sal_Bool bDoRtf = sal_False;
737cdf0e10cSrcweir TransferableObjectDescriptor aObjDesc;
738cdf0e10cSrcweir if( aDataHelper.GetTransferableObjectDescriptor( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aObjDesc ) )
739cdf0e10cSrcweir {
740cdf0e10cSrcweir bDoRtf = ( ( aObjDesc.maClassName == SvGlobalName( SO3_SW_CLASSID ) ||
741cdf0e10cSrcweir aObjDesc.maClassName == SvGlobalName( SO3_SWWEB_CLASSID ) )
742cdf0e10cSrcweir && aDataHelper.HasFormat( SOT_FORMAT_RTF ) );
743cdf0e10cSrcweir }
744cdf0e10cSrcweir if ( bDoRtf )
745cdf0e10cSrcweir nFormatId = FORMAT_RTF;
746cdf0e10cSrcweir else
747cdf0e10cSrcweir nFormatId = SOT_FORMATSTR_ID_EMBED_SOURCE;
748cdf0e10cSrcweir }
749cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_LINK_SOURCE ))
750cdf0e10cSrcweir nFormatId = SOT_FORMATSTR_ID_LINK_SOURCE;
751cdf0e10cSrcweir // the following format can not affect scenario from #89579#
752cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE ))
753cdf0e10cSrcweir nFormatId = SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE;
754cdf0e10cSrcweir // FORMAT_PRIVATE no longer here (can't work if pOwnClip is NULL)
755cdf0e10cSrcweir else if (aDataHelper.HasFormat(nBiff8)) // before xxx_OLE formats
756cdf0e10cSrcweir nFormatId = nBiff8;
757cdf0e10cSrcweir else if (aDataHelper.HasFormat(nBiff5))
758cdf0e10cSrcweir nFormatId = nBiff5;
759cdf0e10cSrcweir else if (aDataHelper.HasFormat(FORMAT_RTF))
760cdf0e10cSrcweir nFormatId = FORMAT_RTF;
761cdf0e10cSrcweir else if (aDataHelper.HasFormat(SOT_FORMATSTR_ID_HTML))
762cdf0e10cSrcweir nFormatId = SOT_FORMATSTR_ID_HTML;
763cdf0e10cSrcweir else if (aDataHelper.HasFormat(SOT_FORMATSTR_ID_HTML_SIMPLE))
764cdf0e10cSrcweir nFormatId = SOT_FORMATSTR_ID_HTML_SIMPLE;
765cdf0e10cSrcweir else if (aDataHelper.HasFormat(SOT_FORMATSTR_ID_SYLK))
766cdf0e10cSrcweir nFormatId = SOT_FORMATSTR_ID_SYLK;
767cdf0e10cSrcweir else if (aDataHelper.HasFormat(FORMAT_STRING))
768cdf0e10cSrcweir nFormatId = FORMAT_STRING;
769cdf0e10cSrcweir else if (aDataHelper.HasFormat(FORMAT_GDIMETAFILE))
770cdf0e10cSrcweir nFormatId = FORMAT_GDIMETAFILE;
771cdf0e10cSrcweir else if (aDataHelper.HasFormat(FORMAT_BITMAP))
772cdf0e10cSrcweir nFormatId = FORMAT_BITMAP;
773cdf0e10cSrcweir // #89579# xxx_OLE formats come last, like in SotExchange tables
774cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_EMBED_SOURCE_OLE ))
775cdf0e10cSrcweir nFormatId = SOT_FORMATSTR_ID_EMBED_SOURCE_OLE;
776cdf0e10cSrcweir else if (aDataHelper.HasFormat( SOT_FORMATSTR_ID_LINK_SOURCE_OLE ))
777cdf0e10cSrcweir nFormatId = SOT_FORMATSTR_ID_LINK_SOURCE_OLE;
778cdf0e10cSrcweir else
779cdf0e10cSrcweir return;
780cdf0e10cSrcweir
781cdf0e10cSrcweir PasteDataFormat( nFormatId, aDataHelper.GetTransferable(),
782cdf0e10cSrcweir GetViewData()->GetCurX(), GetViewData()->GetCurY(),
783cdf0e10cSrcweir NULL, sal_False, sal_False );
784cdf0e10cSrcweir }
785cdf0e10cSrcweir }
786cdf0e10cSrcweir }
787cdf0e10cSrcweir
PasteFromSystem(sal_uLong nFormatId,sal_Bool bApi)788cdf0e10cSrcweir sal_Bool ScViewFunc::PasteFromSystem( sal_uLong nFormatId, sal_Bool bApi )
789cdf0e10cSrcweir {
790cdf0e10cSrcweir UpdateInputLine();
791cdf0e10cSrcweir
792cdf0e10cSrcweir sal_Bool bRet = sal_True;
793cdf0e10cSrcweir Window* pWin = GetActiveWin();
794cdf0e10cSrcweir ScTransferObj* pOwnClip = ScTransferObj::GetOwnClipboard( pWin );
795cdf0e10cSrcweir if ( nFormatId == 0 && pOwnClip )
796cdf0e10cSrcweir {
797cdf0e10cSrcweir // #129384# keep a reference in case the clipboard is changed during PasteFromClip
798cdf0e10cSrcweir uno::Reference<datatransfer::XTransferable> aOwnClipRef( pOwnClip );
799cdf0e10cSrcweir PasteFromClip( IDF_ALL, pOwnClip->GetDocument(),
800cdf0e10cSrcweir PASTE_NOFUNC, sal_False, sal_False, sal_False, INS_NONE, IDF_NONE,
801cdf0e10cSrcweir !bApi ); // allow warning dialog
802cdf0e10cSrcweir }
803cdf0e10cSrcweir else
804cdf0e10cSrcweir {
805cdf0e10cSrcweir TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pWin ) );
806cdf0e10cSrcweir if ( !aDataHelper.GetTransferable().is() )
807cdf0e10cSrcweir return sal_False;
808cdf0e10cSrcweir
809cdf0e10cSrcweir bRet = PasteDataFormat( nFormatId, aDataHelper.GetTransferable(),
810cdf0e10cSrcweir GetViewData()->GetCurX(), GetViewData()->GetCurY(),
811cdf0e10cSrcweir NULL, sal_False, !bApi ); // allow warning dialog
812cdf0e10cSrcweir
813cdf0e10cSrcweir if ( !bRet && !bApi )
814cdf0e10cSrcweir ErrorMessage(STR_PASTE_ERROR);
815cdf0e10cSrcweir }
816cdf0e10cSrcweir return bRet;
817cdf0e10cSrcweir }
818cdf0e10cSrcweir
819cdf0e10cSrcweir
820cdf0e10cSrcweir //----------------------------------------------------------------------------
821cdf0e10cSrcweir // P A S T E
822cdf0e10cSrcweir
PasteOnDrawObjectLinked(const uno::Reference<datatransfer::XTransferable> & rxTransferable,SdrObject & rHitObj)823*52f1c2eeSArmin Le Grand sal_Bool ScViewFunc::PasteOnDrawObjectLinked(
824*52f1c2eeSArmin Le Grand const uno::Reference<datatransfer::XTransferable>& rxTransferable,
825*52f1c2eeSArmin Le Grand SdrObject& rHitObj)
826cdf0e10cSrcweir {
827*52f1c2eeSArmin Le Grand TransferableDataHelper aDataHelper( rxTransferable );
828*52f1c2eeSArmin Le Grand
829*52f1c2eeSArmin Le Grand if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ) )
830*52f1c2eeSArmin Le Grand {
831*52f1c2eeSArmin Le Grand SotStorageStreamRef xStm;
832*52f1c2eeSArmin Le Grand ScDrawView* pScDrawView = GetScDrawView();
833*52f1c2eeSArmin Le Grand
834*52f1c2eeSArmin Le Grand if( pScDrawView && aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_SVXB, xStm ) )
835*52f1c2eeSArmin Le Grand {
836*52f1c2eeSArmin Le Grand Graphic aGraphic;
837*52f1c2eeSArmin Le Grand
838*52f1c2eeSArmin Le Grand *xStm >> aGraphic;
839*52f1c2eeSArmin Le Grand
840*52f1c2eeSArmin Le Grand const String aEmpty;
841*52f1c2eeSArmin Le Grand const String aBeginUndo(ScGlobal::GetRscString(STR_UNDO_DRAGDROP));
842*52f1c2eeSArmin Le Grand
843*52f1c2eeSArmin Le Grand if(pScDrawView->ApplyGraphicToObject( rHitObj, aGraphic, aBeginUndo, aEmpty, aEmpty ))
844*52f1c2eeSArmin Le Grand {
845*52f1c2eeSArmin Le Grand return sal_True;
846*52f1c2eeSArmin Le Grand }
847*52f1c2eeSArmin Le Grand }
848*52f1c2eeSArmin Le Grand }
849*52f1c2eeSArmin Le Grand else if ( aDataHelper.HasFormat( SOT_FORMAT_GDIMETAFILE ) )
850*52f1c2eeSArmin Le Grand {
851*52f1c2eeSArmin Le Grand GDIMetaFile aMtf;
852*52f1c2eeSArmin Le Grand ScDrawView* pScDrawView = GetScDrawView();
853*52f1c2eeSArmin Le Grand
854*52f1c2eeSArmin Le Grand if( pScDrawView && aDataHelper.GetGDIMetaFile( FORMAT_GDIMETAFILE, aMtf ) )
855*52f1c2eeSArmin Le Grand {
856*52f1c2eeSArmin Le Grand const String aEmpty;
857*52f1c2eeSArmin Le Grand const String aBeginUndo(ScGlobal::GetRscString(STR_UNDO_DRAGDROP));
858*52f1c2eeSArmin Le Grand
859*52f1c2eeSArmin Le Grand if(pScDrawView->ApplyGraphicToObject( rHitObj, Graphic(aMtf), aBeginUndo, aEmpty, aEmpty ))
860*52f1c2eeSArmin Le Grand {
861*52f1c2eeSArmin Le Grand return sal_True;
862*52f1c2eeSArmin Le Grand }
863*52f1c2eeSArmin Le Grand }
864*52f1c2eeSArmin Le Grand }
865*52f1c2eeSArmin Le Grand else if ( aDataHelper.HasFormat( SOT_FORMAT_BITMAP ) || aDataHelper.HasFormat( SOT_FORMATSTR_ID_PNG ) )
866*52f1c2eeSArmin Le Grand {
867*52f1c2eeSArmin Le Grand BitmapEx aBmpEx;
868*52f1c2eeSArmin Le Grand ScDrawView* pScDrawView = GetScDrawView();
869*52f1c2eeSArmin Le Grand
870*52f1c2eeSArmin Le Grand if( pScDrawView && aDataHelper.GetBitmapEx( FORMAT_BITMAP, aBmpEx ) )
871*52f1c2eeSArmin Le Grand {
872*52f1c2eeSArmin Le Grand const String aEmpty;
873*52f1c2eeSArmin Le Grand const String aBeginUndo(ScGlobal::GetRscString(STR_UNDO_DRAGDROP));
874*52f1c2eeSArmin Le Grand
875*52f1c2eeSArmin Le Grand if(pScDrawView->ApplyGraphicToObject( rHitObj, Graphic(aBmpEx), aBeginUndo, aEmpty, aEmpty ))
876*52f1c2eeSArmin Le Grand {
877*52f1c2eeSArmin Le Grand return sal_True;
878*52f1c2eeSArmin Le Grand }
879*52f1c2eeSArmin Le Grand }
880*52f1c2eeSArmin Le Grand }
881*52f1c2eeSArmin Le Grand
882*52f1c2eeSArmin Le Grand return sal_False;
883cdf0e10cSrcweir }
884cdf0e10cSrcweir
lcl_SelHasAttrib(ScDocument * pDoc,SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,const ScMarkData & rTabSelection,sal_uInt16 nMask)885cdf0e10cSrcweir sal_Bool lcl_SelHasAttrib( ScDocument* pDoc, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
886cdf0e10cSrcweir const ScMarkData& rTabSelection, sal_uInt16 nMask )
887cdf0e10cSrcweir {
888cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount();
889cdf0e10cSrcweir for (SCTAB nTab=0; nTab<nTabCount; nTab++)
890cdf0e10cSrcweir if ( rTabSelection.GetTableSelect(nTab) && pDoc->HasAttrib( nCol1, nRow1, nTab, nCol2, nRow2, nTab, nMask ) )
891cdf0e10cSrcweir return sal_True;
892cdf0e10cSrcweir return sal_False;
893cdf0e10cSrcweir }
894cdf0e10cSrcweir
895cdf0e10cSrcweir //
896cdf0e10cSrcweir // Einfuegen auf Tabelle:
897cdf0e10cSrcweir //
898cdf0e10cSrcweir
899cdf0e10cSrcweir // internes Paste
900cdf0e10cSrcweir
901cdf0e10cSrcweir namespace {
902cdf0e10cSrcweir
903cdf0e10cSrcweir class CursorSwitcher
904cdf0e10cSrcweir {
905cdf0e10cSrcweir public:
CursorSwitcher(ScViewFunc * pViewFunc)906cdf0e10cSrcweir CursorSwitcher(ScViewFunc* pViewFunc) :
907cdf0e10cSrcweir mpViewFunc(pViewFunc)
908cdf0e10cSrcweir {
909cdf0e10cSrcweir mpViewFunc->HideCursor();
910cdf0e10cSrcweir }
911cdf0e10cSrcweir
~CursorSwitcher()912cdf0e10cSrcweir ~CursorSwitcher()
913cdf0e10cSrcweir {
914cdf0e10cSrcweir mpViewFunc->ShowCursor();
915cdf0e10cSrcweir }
916cdf0e10cSrcweir private:
917cdf0e10cSrcweir ScViewFunc* mpViewFunc;
918cdf0e10cSrcweir };
919cdf0e10cSrcweir
lcl_checkDestRangeForOverwrite(const ScRange & rDestRange,const ScDocument * pDoc,const ScMarkData & rMark,Window * pParentWnd)920cdf0e10cSrcweir bool lcl_checkDestRangeForOverwrite(const ScRange& rDestRange, const ScDocument* pDoc, const ScMarkData& rMark, Window* pParentWnd)
921cdf0e10cSrcweir {
922cdf0e10cSrcweir bool bIsEmpty = true;
923cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount();
924cdf0e10cSrcweir for (SCTAB nTab=0; nTab < nTabCount && bIsEmpty; ++nTab)
925cdf0e10cSrcweir {
926cdf0e10cSrcweir if (!rMark.GetTableSelect(nTab))
927cdf0e10cSrcweir continue;
928cdf0e10cSrcweir
929cdf0e10cSrcweir bIsEmpty = pDoc->IsBlockEmpty(nTab, rDestRange.aStart.Col(), rDestRange.aStart.Row(),
930cdf0e10cSrcweir rDestRange.aEnd.Col(), rDestRange.aEnd.Row());
931cdf0e10cSrcweir }
932cdf0e10cSrcweir
933cdf0e10cSrcweir if (!bIsEmpty)
934cdf0e10cSrcweir {
935cdf0e10cSrcweir ScReplaceWarnBox aBox(pParentWnd);
936cdf0e10cSrcweir if (aBox.Execute() != RET_YES)
937cdf0e10cSrcweir {
938cdf0e10cSrcweir // changing the configuration is within the ScReplaceWarnBox
939cdf0e10cSrcweir return false;
940cdf0e10cSrcweir }
941cdf0e10cSrcweir }
942cdf0e10cSrcweir return true;
943cdf0e10cSrcweir }
944cdf0e10cSrcweir
945cdf0e10cSrcweir }
946cdf0e10cSrcweir
PasteFromClip(sal_uInt16 nFlags,ScDocument * pClipDoc,sal_uInt16 nFunction,sal_Bool bSkipEmpty,sal_Bool bTranspose,sal_Bool bAsLink,InsCellCmd eMoveMode,sal_uInt16 nUndoExtraFlags,sal_Bool bAllowDialogs)947cdf0e10cSrcweir sal_Bool ScViewFunc::PasteFromClip( sal_uInt16 nFlags, ScDocument* pClipDoc,
948cdf0e10cSrcweir sal_uInt16 nFunction, sal_Bool bSkipEmpty,
949cdf0e10cSrcweir sal_Bool bTranspose, sal_Bool bAsLink,
950cdf0e10cSrcweir InsCellCmd eMoveMode, sal_uInt16 nUndoExtraFlags,
951cdf0e10cSrcweir sal_Bool bAllowDialogs )
952cdf0e10cSrcweir {
953cdf0e10cSrcweir if (!pClipDoc)
954cdf0e10cSrcweir {
955cdf0e10cSrcweir DBG_ERROR("PasteFromClip: pClipDoc=0 not allowed");
956cdf0e10cSrcweir return sal_False;
957cdf0e10cSrcweir }
958cdf0e10cSrcweir
959cdf0e10cSrcweir // fuer Undo etc. immer alle oder keine Inhalte sichern
960cdf0e10cSrcweir sal_uInt16 nContFlags = IDF_NONE;
961cdf0e10cSrcweir if (nFlags & IDF_CONTENTS)
962cdf0e10cSrcweir nContFlags |= IDF_CONTENTS;
963cdf0e10cSrcweir if (nFlags & IDF_ATTRIB)
964cdf0e10cSrcweir nContFlags |= IDF_ATTRIB;
965cdf0e10cSrcweir // evtl. Attribute ins Undo ohne sie vom Clip ins Doc zu kopieren
966cdf0e10cSrcweir sal_uInt16 nUndoFlags = nContFlags;
967cdf0e10cSrcweir if (nUndoExtraFlags & IDF_ATTRIB)
968cdf0e10cSrcweir nUndoFlags |= IDF_ATTRIB;
969cdf0e10cSrcweir // do not copy note captions into undo document
970cdf0e10cSrcweir nUndoFlags |= IDF_NOCAPTIONS;
971cdf0e10cSrcweir
972cdf0e10cSrcweir ScClipParam& rClipParam = pClipDoc->GetClipParam();
973cdf0e10cSrcweir if (rClipParam.isMultiRange())
974cdf0e10cSrcweir return PasteMultiRangesFromClip(
975cdf0e10cSrcweir nFlags, pClipDoc, nFunction, bSkipEmpty, bTranspose, bAsLink, bAllowDialogs,
976cdf0e10cSrcweir eMoveMode, nContFlags, nUndoFlags);
977cdf0e10cSrcweir
978cdf0e10cSrcweir sal_Bool bCutMode = pClipDoc->IsCutMode(); // if transposing, take from original clipdoc
979cdf0e10cSrcweir sal_Bool bIncludeFiltered = bCutMode;
980cdf0e10cSrcweir
981cdf0e10cSrcweir // paste drawing: also if IDF_NOTE is set (to create drawing layer for note captions)
982cdf0e10cSrcweir sal_Bool bPasteDraw = ( pClipDoc->GetDrawLayer() && ( nFlags & (IDF_OBJECTS|IDF_NOTE) ) );
983cdf0e10cSrcweir
984cdf0e10cSrcweir ScDocShellRef aTransShellRef; // for objects in xTransClip - must remain valid as long as xTransClip
985cdf0e10cSrcweir ScDocument* pOrigClipDoc = NULL;
986cdf0e10cSrcweir ::std::auto_ptr< ScDocument > xTransClip;
987cdf0e10cSrcweir if ( bTranspose )
988cdf0e10cSrcweir {
989cdf0e10cSrcweir SCCOL nX;
990cdf0e10cSrcweir SCROW nY;
991cdf0e10cSrcweir // include filtered rows until TransposeClip can skip them
992cdf0e10cSrcweir bIncludeFiltered = sal_True;
993cdf0e10cSrcweir pClipDoc->GetClipArea( nX, nY, sal_True );
994cdf0e10cSrcweir if ( nY > static_cast<sal_Int32>(MAXCOL) ) // zuviele Zeilen zum Transponieren
995cdf0e10cSrcweir {
996cdf0e10cSrcweir ErrorMessage(STR_PASTE_FULL);
997cdf0e10cSrcweir return sal_False;
998cdf0e10cSrcweir }
999cdf0e10cSrcweir pOrigClipDoc = pClipDoc; // fuer Referenzen
1000cdf0e10cSrcweir
1001cdf0e10cSrcweir if ( bPasteDraw )
1002cdf0e10cSrcweir {
1003cdf0e10cSrcweir aTransShellRef = new ScDocShell; // DocShell needs a Ref immediately
1004cdf0e10cSrcweir aTransShellRef->DoInitNew(NULL);
1005cdf0e10cSrcweir }
1006cdf0e10cSrcweir ScDrawLayer::SetGlobalDrawPersist(aTransShellRef);
1007cdf0e10cSrcweir
1008cdf0e10cSrcweir xTransClip.reset( new ScDocument( SCDOCMODE_CLIP ));
1009cdf0e10cSrcweir pClipDoc->TransposeClip( xTransClip.get(), nFlags, bAsLink );
1010cdf0e10cSrcweir pClipDoc = xTransClip.get();
1011cdf0e10cSrcweir
1012cdf0e10cSrcweir ScDrawLayer::SetGlobalDrawPersist(NULL);
1013cdf0e10cSrcweir }
1014cdf0e10cSrcweir
1015cdf0e10cSrcweir SCCOL nStartCol;
1016cdf0e10cSrcweir SCROW nStartRow;
1017cdf0e10cSrcweir SCTAB nStartTab;
1018cdf0e10cSrcweir SCCOL nEndCol;
1019cdf0e10cSrcweir SCROW nEndRow;
1020cdf0e10cSrcweir SCTAB nEndTab;
1021cdf0e10cSrcweir SCCOL nClipSizeX;
1022cdf0e10cSrcweir SCROW nClipSizeY;
1023cdf0e10cSrcweir pClipDoc->GetClipArea( nClipSizeX, nClipSizeY, sal_True ); // size in clipboard doc
1024cdf0e10cSrcweir
1025cdf0e10cSrcweir // size in target doc: include filtered rows only if CutMode is set
1026cdf0e10cSrcweir SCCOL nDestSizeX;
1027cdf0e10cSrcweir SCROW nDestSizeY;
1028cdf0e10cSrcweir pClipDoc->GetClipArea( nDestSizeX, nDestSizeY, bIncludeFiltered );
1029cdf0e10cSrcweir
1030cdf0e10cSrcweir ScDocument* pDoc = GetViewData()->GetDocument();
1031cdf0e10cSrcweir ScDocShell* pDocSh = GetViewData()->GetDocShell();
1032cdf0e10cSrcweir ScMarkData& rMark = GetViewData()->GetMarkData();
1033cdf0e10cSrcweir ::svl::IUndoManager* pUndoMgr = pDocSh->GetUndoManager();
1034cdf0e10cSrcweir const sal_Bool bRecord(pDoc->IsUndoEnabled());
1035cdf0e10cSrcweir
1036cdf0e10cSrcweir ScDocShellModificator aModificator( *pDocSh );
1037cdf0e10cSrcweir
1038cdf0e10cSrcweir ScRange aMarkRange;
1039cdf0e10cSrcweir ScMarkData aFilteredMark( rMark); // local copy for all modifications
1040cdf0e10cSrcweir ScMarkType eMarkType = GetViewData()->GetSimpleArea( aMarkRange, aFilteredMark);
1041cdf0e10cSrcweir bool bMarkIsFiltered = (eMarkType == SC_MARK_SIMPLE_FILTERED);
1042cdf0e10cSrcweir bool bNoPaste = ((eMarkType != SC_MARK_SIMPLE && !bMarkIsFiltered) ||
1043cdf0e10cSrcweir (bMarkIsFiltered && (eMoveMode != INS_NONE || bAsLink)));
1044cdf0e10cSrcweir if (!bNoPaste && !rMark.IsMarked())
1045cdf0e10cSrcweir {
1046cdf0e10cSrcweir // Create a selection with clipboard row count and check that for
1047cdf0e10cSrcweir // filtered.
1048cdf0e10cSrcweir nStartCol = GetViewData()->GetCurX();
1049cdf0e10cSrcweir nStartRow = GetViewData()->GetCurY();
1050cdf0e10cSrcweir nStartTab = GetViewData()->GetTabNo();
1051cdf0e10cSrcweir nEndCol = nStartCol + nDestSizeX;
1052cdf0e10cSrcweir nEndRow = nStartRow + nDestSizeY;
1053cdf0e10cSrcweir nEndTab = nStartTab;
1054cdf0e10cSrcweir aMarkRange = ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab);
1055cdf0e10cSrcweir if (ScViewUtil::HasFiltered( aMarkRange, pDoc))
1056cdf0e10cSrcweir {
1057cdf0e10cSrcweir bMarkIsFiltered = true;
1058cdf0e10cSrcweir // Fit to clipboard's row count unfiltered rows. If there is no
1059cdf0e10cSrcweir // fit assume that pasting is not possible. Note that nDestSizeY is
1060cdf0e10cSrcweir // size-1 (difference).
1061cdf0e10cSrcweir if (!ScViewUtil::FitToUnfilteredRows( aMarkRange, pDoc, nDestSizeY+1))
1062cdf0e10cSrcweir bNoPaste = true;
1063cdf0e10cSrcweir }
1064cdf0e10cSrcweir aFilteredMark.SetMarkArea( aMarkRange);
1065cdf0e10cSrcweir }
1066cdf0e10cSrcweir if (bNoPaste)
1067cdf0e10cSrcweir {
1068cdf0e10cSrcweir ErrorMessage(STR_MSSG_PASTEFROMCLIP_0);
1069cdf0e10cSrcweir return sal_False;
1070cdf0e10cSrcweir }
1071cdf0e10cSrcweir
1072cdf0e10cSrcweir SCROW nUnfilteredRows = aMarkRange.aEnd.Row() - aMarkRange.aStart.Row() + 1;
1073cdf0e10cSrcweir ScRangeList aRangeList;
1074cdf0e10cSrcweir if (bMarkIsFiltered)
1075cdf0e10cSrcweir {
1076cdf0e10cSrcweir ScViewUtil::UnmarkFiltered( aFilteredMark, pDoc);
1077cdf0e10cSrcweir aFilteredMark.FillRangeListWithMarks( &aRangeList, sal_False);
1078cdf0e10cSrcweir nUnfilteredRows = 0;
1079cdf0e10cSrcweir for (ScRange* p = aRangeList.First(); p; p = aRangeList.Next())
1080cdf0e10cSrcweir {
1081cdf0e10cSrcweir nUnfilteredRows += p->aEnd.Row() - p->aStart.Row() + 1;
1082cdf0e10cSrcweir }
1083cdf0e10cSrcweir #if 0
1084cdf0e10cSrcweir /* This isn't needed but could be a desired restriction. */
1085cdf0e10cSrcweir // For filtered, destination rows have to be an exact multiple of
1086cdf0e10cSrcweir // source rows. Note that nDestSizeY is size-1 (difference), so
1087cdf0e10cSrcweir // nDestSizeY==0 fits always.
1088cdf0e10cSrcweir if ((nUnfilteredRows % (nDestSizeY+1)) != 0)
1089cdf0e10cSrcweir {
1090cdf0e10cSrcweir /* FIXME: this should be a more descriptive error message then. */
1091cdf0e10cSrcweir ErrorMessage(STR_MSSG_PASTEFROMCLIP_0);
1092cdf0e10cSrcweir return sal_False;
1093cdf0e10cSrcweir }
1094cdf0e10cSrcweir #endif
1095cdf0e10cSrcweir }
1096cdf0e10cSrcweir
1097cdf0e10cSrcweir SCCOL nMarkAddX = 0;
1098cdf0e10cSrcweir SCROW nMarkAddY = 0;
1099cdf0e10cSrcweir
1100cdf0e10cSrcweir // Also for a filtered selection the area is used, for undo et al.
1101cdf0e10cSrcweir if ( aFilteredMark.IsMarked() || bMarkIsFiltered )
1102cdf0e10cSrcweir {
1103cdf0e10cSrcweir aMarkRange.GetVars( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab);
1104cdf0e10cSrcweir SCCOL nBlockAddX = nEndCol-nStartCol;
1105cdf0e10cSrcweir SCROW nBlockAddY = nEndRow-nStartRow;
1106cdf0e10cSrcweir
1107cdf0e10cSrcweir // #58422# Nachfrage, wenn die Selektion groesser als 1 Zeile/Spalte, aber kleiner
1108cdf0e10cSrcweir // als das Clipboard ist (dann wird ueber die Selektion hinaus eingefuegt)
1109cdf0e10cSrcweir
1110cdf0e10cSrcweir // ClipSize is not size, but difference
1111cdf0e10cSrcweir if ( ( nBlockAddX != 0 && nBlockAddX < nDestSizeX ) ||
1112cdf0e10cSrcweir ( nBlockAddY != 0 && nBlockAddY < nDestSizeY ) ||
1113cdf0e10cSrcweir ( bMarkIsFiltered && nUnfilteredRows < nDestSizeY+1 ) )
1114cdf0e10cSrcweir {
1115cdf0e10cSrcweir ScWaitCursorOff aWaitOff( GetFrameWin() );
1116cdf0e10cSrcweir String aMessage = ScGlobal::GetRscString( STR_PASTE_BIGGER );
1117cdf0e10cSrcweir QueryBox aBox( GetViewData()->GetDialogParent(),
1118cdf0e10cSrcweir WinBits(WB_YES_NO | WB_DEF_NO), aMessage );
1119cdf0e10cSrcweir if ( aBox.Execute() != RET_YES )
1120cdf0e10cSrcweir {
1121cdf0e10cSrcweir return sal_False;
1122cdf0e10cSrcweir }
1123cdf0e10cSrcweir }
1124cdf0e10cSrcweir
1125cdf0e10cSrcweir if (nBlockAddX > nDestSizeX)
1126cdf0e10cSrcweir nMarkAddX = nBlockAddX - nDestSizeX; // fuer Merge-Test
1127cdf0e10cSrcweir else
1128cdf0e10cSrcweir {
1129cdf0e10cSrcweir nEndCol = nStartCol + nDestSizeX;
1130cdf0e10cSrcweir if (nEndCol > aMarkRange.aEnd.Col())
1131cdf0e10cSrcweir {
1132cdf0e10cSrcweir // #i113553# larger range has to be included in aFilteredMark (for undo), but extending columns can't changed the filtered status
1133cdf0e10cSrcweir aMarkRange = ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab );
1134cdf0e10cSrcweir aFilteredMark.SetMarkArea( aMarkRange );
1135cdf0e10cSrcweir if (bMarkIsFiltered)
1136cdf0e10cSrcweir {
1137cdf0e10cSrcweir ScViewUtil::UnmarkFiltered( aFilteredMark, pDoc );
1138cdf0e10cSrcweir aFilteredMark.FillRangeListWithMarks( &aRangeList, sal_True );
1139cdf0e10cSrcweir }
1140cdf0e10cSrcweir }
1141cdf0e10cSrcweir }
1142cdf0e10cSrcweir
1143cdf0e10cSrcweir if (nBlockAddY > nDestSizeY)
1144cdf0e10cSrcweir nMarkAddY = nBlockAddY - nDestSizeY; // fuer Merge-Test
1145cdf0e10cSrcweir else
1146cdf0e10cSrcweir {
1147cdf0e10cSrcweir nEndRow = nStartRow + nDestSizeY;
1148cdf0e10cSrcweir if (bMarkIsFiltered || nEndRow > aMarkRange.aEnd.Row())
1149cdf0e10cSrcweir {
1150cdf0e10cSrcweir // Same as above if nothing was marked: re-fit selection to
1151cdf0e10cSrcweir // unfiltered rows. Extending the selection actually may
1152cdf0e10cSrcweir // introduce filtered rows where there weren't any before, so
1153cdf0e10cSrcweir // we also need to test for that.
1154cdf0e10cSrcweir aMarkRange = ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab);
1155cdf0e10cSrcweir if (bMarkIsFiltered || ScViewUtil::HasFiltered( aMarkRange, pDoc))
1156cdf0e10cSrcweir {
1157cdf0e10cSrcweir bMarkIsFiltered = true;
1158cdf0e10cSrcweir // Worst case: all rows up to the end of the sheet are filtered.
1159cdf0e10cSrcweir if (!ScViewUtil::FitToUnfilteredRows( aMarkRange, pDoc, nDestSizeY+1))
1160cdf0e10cSrcweir {
1161cdf0e10cSrcweir ErrorMessage(STR_PASTE_FULL);
1162cdf0e10cSrcweir return sal_False;
1163cdf0e10cSrcweir }
1164cdf0e10cSrcweir }
1165cdf0e10cSrcweir aMarkRange.GetVars( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab);
1166cdf0e10cSrcweir aFilteredMark.SetMarkArea( aMarkRange);
1167cdf0e10cSrcweir if (bMarkIsFiltered)
1168cdf0e10cSrcweir {
1169cdf0e10cSrcweir ScViewUtil::UnmarkFiltered( aFilteredMark, pDoc);
1170cdf0e10cSrcweir aFilteredMark.FillRangeListWithMarks( &aRangeList, sal_True);
1171cdf0e10cSrcweir }
1172cdf0e10cSrcweir }
1173cdf0e10cSrcweir }
1174cdf0e10cSrcweir }
1175cdf0e10cSrcweir else
1176cdf0e10cSrcweir {
1177cdf0e10cSrcweir nStartCol = GetViewData()->GetCurX();
1178cdf0e10cSrcweir nStartRow = GetViewData()->GetCurY();
1179cdf0e10cSrcweir nStartTab = GetViewData()->GetTabNo();
1180cdf0e10cSrcweir nEndCol = nStartCol + nDestSizeX;
1181cdf0e10cSrcweir nEndRow = nStartRow + nDestSizeY;
1182cdf0e10cSrcweir nEndTab = nStartTab;
1183cdf0e10cSrcweir }
1184cdf0e10cSrcweir
1185cdf0e10cSrcweir bool bOffLimits = !ValidCol(nEndCol) || !ValidRow(nEndRow);
1186cdf0e10cSrcweir
1187cdf0e10cSrcweir // Zielbereich, wie er angezeigt wird:
1188cdf0e10cSrcweir ScRange aUserRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab );
1189cdf0e10cSrcweir
1190cdf0e10cSrcweir // Sollen Zellen eingefuegt werden?
1191cdf0e10cSrcweir // (zu grosse nEndCol/nEndRow werden weiter unten erkannt)
1192cdf0e10cSrcweir sal_Bool bInsertCells = ( eMoveMode != INS_NONE && !bOffLimits );
1193cdf0e10cSrcweir if ( bInsertCells )
1194cdf0e10cSrcweir {
1195cdf0e10cSrcweir // #94115# Instead of EnterListAction, the paste undo action is merged into the
1196cdf0e10cSrcweir // insert action, so Repeat can insert the right cells
1197cdf0e10cSrcweir
1198cdf0e10cSrcweir MarkRange( aUserRange ); // wird vor CopyFromClip sowieso gesetzt
1199cdf0e10cSrcweir
1200cdf0e10cSrcweir // #72930# CutMode is reset on insertion of cols/rows but needed again on cell move
1201cdf0e10cSrcweir sal_Bool bCut = pClipDoc->IsCutMode();
1202cdf0e10cSrcweir if (!InsertCells( eMoveMode, bRecord, sal_True )) // is inserting possible?
1203cdf0e10cSrcweir {
1204cdf0e10cSrcweir return sal_False;
1205cdf0e10cSrcweir // #i21036# EnterListAction isn't used, and InsertCells doesn't insert
1206cdf0e10cSrcweir // its undo action on failure, so no undo handling is needed here
1207cdf0e10cSrcweir }
1208cdf0e10cSrcweir if ( bCut )
1209cdf0e10cSrcweir pClipDoc->SetCutMode( bCut );
1210cdf0e10cSrcweir }
1211cdf0e10cSrcweir else if (!bOffLimits)
1212cdf0e10cSrcweir {
1213cdf0e10cSrcweir sal_Bool bAskIfNotEmpty = bAllowDialogs &&
1214cdf0e10cSrcweir ( nFlags & IDF_CONTENTS ) &&
1215cdf0e10cSrcweir nFunction == PASTE_NOFUNC &&
1216cdf0e10cSrcweir SC_MOD()->GetInputOptions().GetReplaceCellsWarn();
1217cdf0e10cSrcweir if ( bAskIfNotEmpty )
1218cdf0e10cSrcweir {
1219cdf0e10cSrcweir if (!lcl_checkDestRangeForOverwrite(aUserRange, pDoc, aFilteredMark, GetViewData()->GetDialogParent()))
1220cdf0e10cSrcweir return false;
1221cdf0e10cSrcweir }
1222cdf0e10cSrcweir }
1223cdf0e10cSrcweir
1224cdf0e10cSrcweir SCCOL nClipStartX; // Clipboard-Bereich erweitern
1225cdf0e10cSrcweir SCROW nClipStartY;
1226cdf0e10cSrcweir pClipDoc->GetClipStart( nClipStartX, nClipStartY );
1227cdf0e10cSrcweir SCCOL nUndoEndCol = nClipStartX + nClipSizeX;
1228cdf0e10cSrcweir SCROW nUndoEndRow = nClipStartY + nClipSizeY; // end of source area in clipboard document
1229cdf0e10cSrcweir sal_Bool bClipOver = sal_False;
1230cdf0e10cSrcweir // #i68690# ExtendMerge for the clip doc must be called with the clipboard's sheet numbers.
1231cdf0e10cSrcweir // The same end column/row can be used for all calls because the clip doc doesn't contain
1232cdf0e10cSrcweir // content outside the clip area.
1233cdf0e10cSrcweir for (SCTAB nClipTab=0; nClipTab<=MAXTAB; nClipTab++)
1234cdf0e10cSrcweir if ( pClipDoc->HasTable(nClipTab) )
1235cdf0e10cSrcweir if ( pClipDoc->ExtendMerge( nClipStartX,nClipStartY, nUndoEndCol,nUndoEndRow, nClipTab, sal_False ) )
1236cdf0e10cSrcweir bClipOver = sal_True;
1237cdf0e10cSrcweir nUndoEndCol -= nClipStartX + nClipSizeX;
1238cdf0e10cSrcweir nUndoEndRow -= nClipStartY + nClipSizeY; // now contains only the difference added by ExtendMerge
1239cdf0e10cSrcweir nUndoEndCol = sal::static_int_cast<SCCOL>( nUndoEndCol + nEndCol );
1240cdf0e10cSrcweir nUndoEndRow = sal::static_int_cast<SCROW>( nUndoEndRow + nEndRow ); // destination area, expanded for merged cells
1241cdf0e10cSrcweir
1242cdf0e10cSrcweir // if (nUndoEndCol < nEndCol) nUndoEndCol = nEndCol;
1243cdf0e10cSrcweir // if (nUndoEndRow < nEndRow) nUndoEndRow = nEndRow;
1244cdf0e10cSrcweir
1245cdf0e10cSrcweir // nUndoEndCol += nMarkAddX;
1246cdf0e10cSrcweir // nUndoEndRow += nMarkAddY;
1247cdf0e10cSrcweir
1248cdf0e10cSrcweir if (nUndoEndCol>MAXCOL || nUndoEndRow>MAXROW)
1249cdf0e10cSrcweir {
1250cdf0e10cSrcweir ErrorMessage(STR_PASTE_FULL);
1251cdf0e10cSrcweir return sal_False;
1252cdf0e10cSrcweir }
1253cdf0e10cSrcweir
1254cdf0e10cSrcweir pDoc->ExtendMergeSel( nStartCol,nStartRow, nUndoEndCol,nUndoEndRow, aFilteredMark, sal_False );
1255cdf0e10cSrcweir
1256cdf0e10cSrcweir // Test auf Zellschutz
1257cdf0e10cSrcweir
1258cdf0e10cSrcweir ScEditableTester aTester( pDoc, nStartTab, nStartCol,nStartRow, nUndoEndCol,nUndoEndRow );
1259cdf0e10cSrcweir if (!aTester.IsEditable())
1260cdf0e10cSrcweir {
1261cdf0e10cSrcweir ErrorMessage(aTester.GetMessageId());
1262cdf0e10cSrcweir return sal_False;
1263cdf0e10cSrcweir }
1264cdf0e10cSrcweir
1265cdf0e10cSrcweir //! Test auf Ueberlappung
1266cdf0e10cSrcweir //! nur wirkliche Schnittmenge testen !!!!!!!
1267cdf0e10cSrcweir
1268cdf0e10cSrcweir // pDoc->HasCommonAttr( StartCol,nStartRow, nUndoEndCol,nUndoEndRow, nStartTab,
1269cdf0e10cSrcweir // pClipDoc, nClipStartX, nClipStartY );
1270cdf0e10cSrcweir
1271cdf0e10cSrcweir ScDocFunc& rDocFunc = pDocSh->GetDocFunc();
1272cdf0e10cSrcweir if ( bRecord )
1273cdf0e10cSrcweir {
1274cdf0e10cSrcweir String aUndo = ScGlobal::GetRscString( pClipDoc->IsCutMode() ? STR_UNDO_MOVE : STR_UNDO_COPY );
1275cdf0e10cSrcweir pUndoMgr->EnterListAction( aUndo, aUndo );
1276cdf0e10cSrcweir }
1277cdf0e10cSrcweir
1278cdf0e10cSrcweir if (bClipOver)
1279cdf0e10cSrcweir if (lcl_SelHasAttrib( pDoc, nStartCol,nStartRow, nUndoEndCol,nUndoEndRow, aFilteredMark, HASATTR_OVERLAPPED ))
1280cdf0e10cSrcweir { // "Cell merge not possible if cells already merged"
1281cdf0e10cSrcweir ScDocAttrIterator aIter( pDoc, nStartTab, nStartCol, nStartRow, nUndoEndCol, nUndoEndRow );
1282cdf0e10cSrcweir const ScPatternAttr* pPattern = NULL;
1283cdf0e10cSrcweir const ScMergeAttr* pMergeFlag = NULL;
1284cdf0e10cSrcweir const ScMergeFlagAttr* pMergeFlagAttr = NULL;
1285cdf0e10cSrcweir SCCOL nCol = -1;
1286cdf0e10cSrcweir SCROW nRow1 = -1;
1287cdf0e10cSrcweir SCROW nRow2 = -1;
1288cdf0e10cSrcweir while ( ( pPattern = aIter.GetNext( nCol, nRow1, nRow2 ) ) != NULL )
1289cdf0e10cSrcweir {
1290cdf0e10cSrcweir pMergeFlag = (const ScMergeAttr*) &pPattern->GetItem(ATTR_MERGE);
1291cdf0e10cSrcweir pMergeFlagAttr = (const ScMergeFlagAttr*) &pPattern->GetItem(ATTR_MERGE_FLAG);
1292cdf0e10cSrcweir if( ( pMergeFlag && pMergeFlag->IsMerged() ) || ( pMergeFlagAttr && pMergeFlagAttr->IsOverlapped() ) )
1293cdf0e10cSrcweir {
1294cdf0e10cSrcweir ScRange aRange(nCol, nRow1, nStartTab);
1295cdf0e10cSrcweir pDoc->ExtendOverlapped(aRange);
1296cdf0e10cSrcweir pDoc->ExtendMerge(aRange, sal_True, sal_True);
1297cdf0e10cSrcweir rDocFunc.UnmergeCells(aRange, bRecord, sal_True);
1298cdf0e10cSrcweir }
1299cdf0e10cSrcweir }
1300cdf0e10cSrcweir }
1301cdf0e10cSrcweir
1302cdf0e10cSrcweir if ( !bCutMode )
1303cdf0e10cSrcweir {
1304cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1305cdf0e10cSrcweir if ( pChangeTrack )
1306cdf0e10cSrcweir pChangeTrack->ResetLastCut(); // kein CutMode mehr
1307cdf0e10cSrcweir }
1308cdf0e10cSrcweir
1309cdf0e10cSrcweir sal_Bool bColInfo = ( nStartRow==0 && nEndRow==MAXROW );
1310cdf0e10cSrcweir sal_Bool bRowInfo = ( nStartCol==0 && nEndCol==MAXCOL );
1311cdf0e10cSrcweir
1312cdf0e10cSrcweir ScDocument* pUndoDoc = NULL;
1313cdf0e10cSrcweir ScDocument* pRefUndoDoc = NULL;
1314cdf0e10cSrcweir ScDocument* pRedoDoc = NULL;
1315cdf0e10cSrcweir ScRefUndoData* pUndoData = NULL;
1316cdf0e10cSrcweir
1317cdf0e10cSrcweir if ( bRecord )
1318cdf0e10cSrcweir {
1319cdf0e10cSrcweir pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
1320cdf0e10cSrcweir pUndoDoc->InitUndoSelected( pDoc, aFilteredMark, bColInfo, bRowInfo );
1321cdf0e10cSrcweir
1322cdf0e10cSrcweir // all sheets - CopyToDocument skips those that don't exist in pUndoDoc
1323cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount();
1324cdf0e10cSrcweir pDoc->CopyToDocument( nStartCol, nStartRow, 0, nUndoEndCol, nUndoEndRow, nTabCount-1,
1325cdf0e10cSrcweir nUndoFlags, sal_False, pUndoDoc );
1326cdf0e10cSrcweir
1327cdf0e10cSrcweir if ( bCutMode )
1328cdf0e10cSrcweir {
1329cdf0e10cSrcweir pRefUndoDoc = new ScDocument( SCDOCMODE_UNDO );
1330cdf0e10cSrcweir pRefUndoDoc->InitUndo( pDoc, 0, nTabCount-1, sal_False, sal_False );
1331cdf0e10cSrcweir
1332cdf0e10cSrcweir pUndoData = new ScRefUndoData( pDoc );
1333cdf0e10cSrcweir }
1334cdf0e10cSrcweir }
1335cdf0e10cSrcweir
1336cdf0e10cSrcweir sal_uInt16 nExtFlags = 0;
1337cdf0e10cSrcweir pDocSh->UpdatePaintExt( nExtFlags, nStartCol, nStartRow, nStartTab,
1338cdf0e10cSrcweir nEndCol, nEndRow, nEndTab ); // content before the change
1339cdf0e10cSrcweir
1340cdf0e10cSrcweir if (GetViewData()->IsActive())
1341cdf0e10cSrcweir {
1342cdf0e10cSrcweir DoneBlockMode();
1343cdf0e10cSrcweir InitOwnBlockMode();
1344cdf0e10cSrcweir }
1345cdf0e10cSrcweir rMark.SetMarkArea( aUserRange );
1346cdf0e10cSrcweir MarkDataChanged();
1347cdf0e10cSrcweir
1348cdf0e10cSrcweir HideCursor(); // Cursor aendert sich !
1349cdf0e10cSrcweir
1350cdf0e10cSrcweir //
1351cdf0e10cSrcweir // Aus Clipboard kopieren,
1352cdf0e10cSrcweir // wenn gerechnet werden soll, Originaldaten merken
1353cdf0e10cSrcweir //
1354cdf0e10cSrcweir
1355cdf0e10cSrcweir ScDocument* pMixDoc = NULL;
1356cdf0e10cSrcweir if ( bSkipEmpty || nFunction )
1357cdf0e10cSrcweir {
1358cdf0e10cSrcweir if ( nFlags & IDF_CONTENTS )
1359cdf0e10cSrcweir {
1360cdf0e10cSrcweir pMixDoc = new ScDocument( SCDOCMODE_UNDO );
1361cdf0e10cSrcweir pMixDoc->InitUndo( pDoc, nStartTab, nEndTab );
1362cdf0e10cSrcweir pDoc->CopyToDocument( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab,
1363cdf0e10cSrcweir IDF_CONTENTS, sal_False, pMixDoc );
1364cdf0e10cSrcweir }
1365cdf0e10cSrcweir }
1366cdf0e10cSrcweir
1367cdf0e10cSrcweir /* Make draw layer and start drawing undo.
1368cdf0e10cSrcweir - Needed before AdjustBlockHeight to track moved drawing objects.
1369cdf0e10cSrcweir - Needed before pDoc->CopyFromClip to track inserted note caption objects.
1370cdf0e10cSrcweir */
1371cdf0e10cSrcweir if ( bPasteDraw )
1372cdf0e10cSrcweir pDocSh->MakeDrawLayer();
1373cdf0e10cSrcweir if ( bRecord )
1374cdf0e10cSrcweir pDoc->BeginDrawUndo();
1375cdf0e10cSrcweir
1376cdf0e10cSrcweir sal_uInt16 nNoObjFlags = nFlags & ~IDF_OBJECTS;
1377cdf0e10cSrcweir if (!bAsLink)
1378cdf0e10cSrcweir {
1379cdf0e10cSrcweir // copy normally (original range)
1380cdf0e10cSrcweir pDoc->CopyFromClip( aUserRange, aFilteredMark, nNoObjFlags,
1381cdf0e10cSrcweir pRefUndoDoc, pClipDoc, sal_True, sal_False, bIncludeFiltered,
1382cdf0e10cSrcweir bSkipEmpty, (bMarkIsFiltered ? &aRangeList : NULL) );
1383cdf0e10cSrcweir
1384cdf0e10cSrcweir // bei Transpose Referenzen per Hand anpassen
1385cdf0e10cSrcweir if ( bTranspose && bCutMode && (nFlags & IDF_CONTENTS) )
1386cdf0e10cSrcweir pDoc->UpdateTranspose( aUserRange.aStart, pOrigClipDoc, aFilteredMark, pRefUndoDoc );
1387cdf0e10cSrcweir }
1388cdf0e10cSrcweir else if (!bTranspose)
1389cdf0e10cSrcweir {
1390cdf0e10cSrcweir // copy with bAsLink=TRUE
1391cdf0e10cSrcweir pDoc->CopyFromClip( aUserRange, aFilteredMark, nNoObjFlags, pRefUndoDoc, pClipDoc,
1392cdf0e10cSrcweir sal_True, sal_True, bIncludeFiltered, bSkipEmpty );
1393cdf0e10cSrcweir }
1394cdf0e10cSrcweir else
1395cdf0e10cSrcweir {
1396cdf0e10cSrcweir // alle Inhalte kopieren (im TransClipDoc stehen nur Formeln)
1397cdf0e10cSrcweir pDoc->CopyFromClip( aUserRange, aFilteredMark, nContFlags, pRefUndoDoc, pClipDoc );
1398cdf0e10cSrcweir }
1399cdf0e10cSrcweir
1400cdf0e10cSrcweir // skipped rows and merged cells don't mix
1401cdf0e10cSrcweir if ( !bIncludeFiltered && pClipDoc->HasClipFilteredRows() )
1402cdf0e10cSrcweir rDocFunc.UnmergeCells( aUserRange, sal_False, sal_True );
1403cdf0e10cSrcweir
1404cdf0e10cSrcweir pDoc->ExtendMergeSel( nStartCol, nStartRow, nEndCol, nEndRow, aFilteredMark, sal_True ); // Refresh
1405cdf0e10cSrcweir // und Bereich neu
1406cdf0e10cSrcweir
1407cdf0e10cSrcweir if ( pMixDoc ) // Rechenfunktionen mit Original-Daten auszufuehren ?
1408cdf0e10cSrcweir {
1409cdf0e10cSrcweir pDoc->MixDocument( aUserRange, nFunction, bSkipEmpty, pMixDoc );
1410cdf0e10cSrcweir }
1411cdf0e10cSrcweir delete pMixDoc;
1412cdf0e10cSrcweir
1413cdf0e10cSrcweir AdjustBlockHeight(); // update row heights before pasting objects
1414cdf0e10cSrcweir
1415cdf0e10cSrcweir ::std::vector< ::rtl::OUString > aExcludedChartNames;
1416cdf0e10cSrcweir SdrPage* pPage = NULL;
1417cdf0e10cSrcweir
1418cdf0e10cSrcweir if ( nFlags & IDF_OBJECTS )
1419cdf0e10cSrcweir {
1420cdf0e10cSrcweir ScDrawView* pScDrawView = GetScDrawView();
1421cdf0e10cSrcweir SdrModel* pModel = ( pScDrawView ? pScDrawView->GetModel() : NULL );
1422cdf0e10cSrcweir pPage = ( pModel ? pModel->GetPage( static_cast< sal_uInt16 >( nStartTab ) ) : NULL );
1423cdf0e10cSrcweir if ( pPage )
1424cdf0e10cSrcweir {
1425cdf0e10cSrcweir ScChartHelper::GetChartNames( aExcludedChartNames, pPage );
1426cdf0e10cSrcweir }
1427cdf0e10cSrcweir
1428cdf0e10cSrcweir // Paste the drawing objects after the row heights have been updated.
1429cdf0e10cSrcweir
1430cdf0e10cSrcweir pDoc->CopyFromClip( aUserRange, aFilteredMark, IDF_OBJECTS, pRefUndoDoc, pClipDoc,
1431cdf0e10cSrcweir sal_True, sal_False, bIncludeFiltered );
1432cdf0e10cSrcweir }
1433cdf0e10cSrcweir
1434cdf0e10cSrcweir //
1435cdf0e10cSrcweir //
1436cdf0e10cSrcweir //
1437cdf0e10cSrcweir
1438cdf0e10cSrcweir pDocSh->UpdatePaintExt( nExtFlags, nStartCol, nStartRow, nStartTab,
1439cdf0e10cSrcweir nEndCol, nEndRow, nEndTab ); // content after the change
1440cdf0e10cSrcweir
1441cdf0e10cSrcweir
1442cdf0e10cSrcweir // ggf. Autofilter-Koepfe loeschen
1443cdf0e10cSrcweir if (bCutMode)
1444cdf0e10cSrcweir if (pDoc->RefreshAutoFilter( nClipStartX,nClipStartY, nClipStartX+nClipSizeX,
1445cdf0e10cSrcweir nClipStartY+nClipSizeY, nStartTab ))
1446cdf0e10cSrcweir pDocSh->PostPaint( nClipStartX,nClipStartY,nStartTab,
1447cdf0e10cSrcweir nClipStartX+nClipSizeX,nClipStartY,nStartTab,
1448cdf0e10cSrcweir PAINT_GRID );
1449cdf0e10cSrcweir
1450cdf0e10cSrcweir ShowCursor(); // Cursor aendert sich !
1451cdf0e10cSrcweir
1452cdf0e10cSrcweir //! Block-Bereich bei RefUndoDoc weglassen !!!
1453cdf0e10cSrcweir
1454cdf0e10cSrcweir if ( bRecord )
1455cdf0e10cSrcweir {
1456cdf0e10cSrcweir // Redo-Daten werden erst beim ersten Undo kopiert
1457cdf0e10cSrcweir // ohne RefUndoDoc muss das Redo-Doc noch nicht angelegt werden
1458cdf0e10cSrcweir
1459cdf0e10cSrcweir if (pRefUndoDoc)
1460cdf0e10cSrcweir {
1461cdf0e10cSrcweir pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
1462cdf0e10cSrcweir pRedoDoc->InitUndo( pDoc, nStartTab, nEndTab, bColInfo, bRowInfo );
1463cdf0e10cSrcweir
1464cdf0e10cSrcweir // angepasste Referenzen ins Redo-Doc
1465cdf0e10cSrcweir
1466cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount();
1467cdf0e10cSrcweir pRedoDoc->AddUndoTab( 0, nTabCount-1 );
1468cdf0e10cSrcweir pDoc->CopyUpdated( pRefUndoDoc, pRedoDoc );
1469cdf0e10cSrcweir
1470cdf0e10cSrcweir // alte Referenzen ins Undo-Doc
1471cdf0e10cSrcweir
1472cdf0e10cSrcweir //! Tabellen selektieren ?
1473cdf0e10cSrcweir pUndoDoc->AddUndoTab( 0, nTabCount-1 );
1474cdf0e10cSrcweir pRefUndoDoc->DeleteArea( nStartCol, nStartRow, nEndCol, nEndRow, aFilteredMark, IDF_ALL );
1475cdf0e10cSrcweir pRefUndoDoc->CopyToDocument( 0,0,0, MAXCOL,MAXROW,nTabCount-1,
1476cdf0e10cSrcweir IDF_FORMULA, sal_False, pUndoDoc );
1477cdf0e10cSrcweir delete pRefUndoDoc;
1478cdf0e10cSrcweir }
1479cdf0e10cSrcweir
1480cdf0e10cSrcweir // DeleteUnchanged for pUndoData is in ScUndoPaste ctor,
1481cdf0e10cSrcweir // UndoData for redo is made during first undo
1482cdf0e10cSrcweir
1483cdf0e10cSrcweir ScUndoPasteOptions aOptions; // store options for repeat
1484cdf0e10cSrcweir aOptions.nFunction = nFunction;
1485cdf0e10cSrcweir aOptions.bSkipEmpty = bSkipEmpty;
1486cdf0e10cSrcweir aOptions.bTranspose = bTranspose;
1487cdf0e10cSrcweir aOptions.bAsLink = bAsLink;
1488cdf0e10cSrcweir aOptions.eMoveMode = eMoveMode;
1489cdf0e10cSrcweir
1490cdf0e10cSrcweir SfxUndoAction* pUndo = new ScUndoPaste( pDocSh,
1491cdf0e10cSrcweir nStartCol, nStartRow, nStartTab,
1492cdf0e10cSrcweir nUndoEndCol, nUndoEndRow, nEndTab, aFilteredMark,
1493cdf0e10cSrcweir pUndoDoc, pRedoDoc, nFlags | nUndoFlags,
1494cdf0e10cSrcweir pUndoData, NULL, NULL, NULL,
1495cdf0e10cSrcweir sal_False, &aOptions ); // sal_False = Redo data not yet copied
1496cdf0e10cSrcweir
1497cdf0e10cSrcweir if ( bInsertCells )
1498cdf0e10cSrcweir {
1499cdf0e10cSrcweir // Merge the paste undo action into the insert action.
1500cdf0e10cSrcweir // Use ScUndoWrapper so the ScUndoPaste pointer can be stored in the insert action.
1501cdf0e10cSrcweir
1502cdf0e10cSrcweir pUndoMgr->AddUndoAction( new ScUndoWrapper( pUndo ), sal_True );
1503cdf0e10cSrcweir }
1504cdf0e10cSrcweir else
1505cdf0e10cSrcweir pUndoMgr->AddUndoAction( pUndo );
1506cdf0e10cSrcweir pUndoMgr->LeaveListAction();
1507cdf0e10cSrcweir }
1508cdf0e10cSrcweir
1509cdf0e10cSrcweir sal_uInt16 nPaint = PAINT_GRID;
1510cdf0e10cSrcweir if (bColInfo)
1511cdf0e10cSrcweir {
1512cdf0e10cSrcweir nPaint |= PAINT_TOP;
1513cdf0e10cSrcweir nUndoEndCol = MAXCOL; // nur zum Zeichnen !
1514cdf0e10cSrcweir }
1515cdf0e10cSrcweir if (bRowInfo)
1516cdf0e10cSrcweir {
1517cdf0e10cSrcweir nPaint |= PAINT_LEFT;
1518cdf0e10cSrcweir nUndoEndRow = MAXROW; // nur zum Zeichnen !
1519cdf0e10cSrcweir }
1520cdf0e10cSrcweir pDocSh->PostPaint( nStartCol, nStartRow, nStartTab,
1521cdf0e10cSrcweir nUndoEndCol, nUndoEndRow, nEndTab, nPaint, nExtFlags );
1522cdf0e10cSrcweir // AdjustBlockHeight has already been called above
1523cdf0e10cSrcweir
1524cdf0e10cSrcweir aModificator.SetDocumentModified();
1525cdf0e10cSrcweir PostPasteFromClip(aUserRange, rMark);
1526cdf0e10cSrcweir
1527cdf0e10cSrcweir if ( nFlags & IDF_OBJECTS )
1528cdf0e10cSrcweir {
1529cdf0e10cSrcweir ScModelObj* pModelObj = ( pDocSh ? ScModelObj::getImplementation( pDocSh->GetModel() ) : NULL );
1530cdf0e10cSrcweir if ( pDoc && pPage && pModelObj )
1531cdf0e10cSrcweir {
1532cdf0e10cSrcweir bool bSameDoc = ( rClipParam.getSourceDocID() == pDoc->GetDocumentID() );
1533cdf0e10cSrcweir const ScRangeListVector& rProtectedChartRangesVector( rClipParam.maProtectedChartRangesVector );
1534cdf0e10cSrcweir ScChartHelper::CreateProtectedChartListenersAndNotify( pDoc, pPage, pModelObj, nStartTab,
1535cdf0e10cSrcweir rProtectedChartRangesVector, aExcludedChartNames, bSameDoc );
1536cdf0e10cSrcweir }
1537cdf0e10cSrcweir }
1538cdf0e10cSrcweir
1539cdf0e10cSrcweir return sal_True;
1540cdf0e10cSrcweir }
1541cdf0e10cSrcweir
PasteMultiRangesFromClip(sal_uInt16 nFlags,ScDocument * pClipDoc,sal_uInt16 nFunction,bool bSkipEmpty,bool bTranspose,bool bAsLink,bool bAllowDialogs,InsCellCmd eMoveMode,sal_uInt16,sal_uInt16 nUndoFlags)1542cdf0e10cSrcweir bool ScViewFunc::PasteMultiRangesFromClip(
1543cdf0e10cSrcweir sal_uInt16 nFlags, ScDocument* pClipDoc, sal_uInt16 nFunction,
1544cdf0e10cSrcweir bool bSkipEmpty, bool bTranspose, bool bAsLink, bool bAllowDialogs,
1545cdf0e10cSrcweir InsCellCmd eMoveMode, sal_uInt16 /*nContFlags*/, sal_uInt16 nUndoFlags)
1546cdf0e10cSrcweir {
1547cdf0e10cSrcweir ScViewData& rViewData = *GetViewData();
1548cdf0e10cSrcweir ScDocument* pDoc = rViewData.GetDocument();
1549cdf0e10cSrcweir ScDocShell* pDocSh = rViewData.GetDocShell();
1550cdf0e10cSrcweir ScMarkData aMark(rViewData.GetMarkData());
1551cdf0e10cSrcweir const ScAddress& rCurPos = rViewData.GetCurPos();
1552cdf0e10cSrcweir ScClipParam& rClipParam = pClipDoc->GetClipParam();
1553cdf0e10cSrcweir SCCOL nColSize = rClipParam.getPasteColSize();
1554cdf0e10cSrcweir SCROW nRowSize = rClipParam.getPasteRowSize();
1555cdf0e10cSrcweir
1556cdf0e10cSrcweir if (bTranspose)
1557cdf0e10cSrcweir {
1558cdf0e10cSrcweir if (static_cast<SCROW>(rCurPos.Col()) + nRowSize-1 > static_cast<SCROW>(MAXCOL))
1559cdf0e10cSrcweir {
1560cdf0e10cSrcweir ErrorMessage(STR_PASTE_FULL);
1561cdf0e10cSrcweir return false;
1562cdf0e10cSrcweir }
1563cdf0e10cSrcweir
1564cdf0e10cSrcweir ::std::auto_ptr<ScDocument> pTransClip(new ScDocument(SCDOCMODE_CLIP));
1565cdf0e10cSrcweir pClipDoc->TransposeClip(pTransClip.get(), nFlags, bAsLink);
1566cdf0e10cSrcweir pClipDoc = pTransClip.release();
1567cdf0e10cSrcweir SCCOL nTempColSize = nColSize;
1568cdf0e10cSrcweir nColSize = static_cast<SCCOL>(nRowSize);
1569cdf0e10cSrcweir nRowSize = static_cast<SCROW>(nTempColSize);
1570cdf0e10cSrcweir }
1571cdf0e10cSrcweir
1572cdf0e10cSrcweir if (!ValidCol(rCurPos.Col()+nColSize-1) || !ValidRow(rCurPos.Row()+nRowSize-1))
1573cdf0e10cSrcweir {
1574cdf0e10cSrcweir ErrorMessage(STR_PASTE_FULL);
1575cdf0e10cSrcweir return false;
1576cdf0e10cSrcweir }
1577cdf0e10cSrcweir
1578cdf0e10cSrcweir // Determine the first and last selected sheet numbers.
1579cdf0e10cSrcweir SCTAB nTab1 = aMark.GetFirstSelected();
1580cdf0e10cSrcweir SCTAB nTab2 = nTab1;
1581cdf0e10cSrcweir for (SCTAB i = nTab1+1; i <= MAXTAB; ++i)
1582cdf0e10cSrcweir if (aMark.GetTableSelect(i))
1583cdf0e10cSrcweir nTab2 = i;
1584cdf0e10cSrcweir
1585cdf0e10cSrcweir ScDocShellModificator aModificator(*pDocSh);
1586cdf0e10cSrcweir
1587cdf0e10cSrcweir // For multi-selection paste, we don't support cell duplication for larger
1588cdf0e10cSrcweir // destination range. In case the destination is marked, we reset it to
1589cdf0e10cSrcweir // the clip size.
1590cdf0e10cSrcweir ScRange aMarkedRange(rCurPos.Col(), rCurPos.Row(), nTab1,
1591cdf0e10cSrcweir rCurPos.Col()+nColSize-1, rCurPos.Row()+nRowSize-1, nTab2);
1592cdf0e10cSrcweir
1593cdf0e10cSrcweir // Extend the marked range to account for filtered rows in the destination
1594cdf0e10cSrcweir // area.
1595cdf0e10cSrcweir if (ScViewUtil::HasFiltered(aMarkedRange, pDoc))
1596cdf0e10cSrcweir {
1597cdf0e10cSrcweir if (!ScViewUtil::FitToUnfilteredRows(aMarkedRange, pDoc, nRowSize))
1598cdf0e10cSrcweir return false;
1599cdf0e10cSrcweir }
1600cdf0e10cSrcweir
1601cdf0e10cSrcweir bool bAskIfNotEmpty =
1602cdf0e10cSrcweir bAllowDialogs && (nFlags & IDF_CONTENTS) &&
1603cdf0e10cSrcweir nFunction == PASTE_NOFUNC && SC_MOD()->GetInputOptions().GetReplaceCellsWarn();
1604cdf0e10cSrcweir
1605cdf0e10cSrcweir if (bAskIfNotEmpty)
1606cdf0e10cSrcweir {
1607cdf0e10cSrcweir if (!lcl_checkDestRangeForOverwrite(aMarkedRange, pDoc, aMark, rViewData.GetDialogParent()))
1608cdf0e10cSrcweir return false;
1609cdf0e10cSrcweir }
1610cdf0e10cSrcweir
1611cdf0e10cSrcweir aMark.SetMarkArea(aMarkedRange);
1612cdf0e10cSrcweir MarkRange(aMarkedRange);
1613cdf0e10cSrcweir
1614cdf0e10cSrcweir bool bInsertCells = (eMoveMode != INS_NONE);
1615cdf0e10cSrcweir if (bInsertCells)
1616cdf0e10cSrcweir {
1617cdf0e10cSrcweir if (!InsertCells(eMoveMode, pDoc->IsUndoEnabled(), true))
1618cdf0e10cSrcweir return false;
1619cdf0e10cSrcweir }
1620cdf0e10cSrcweir
1621cdf0e10cSrcweir ::std::auto_ptr<ScDocument> pUndoDoc;
1622cdf0e10cSrcweir if (pDoc->IsUndoEnabled())
1623cdf0e10cSrcweir {
1624cdf0e10cSrcweir pUndoDoc.reset(new ScDocument(SCDOCMODE_UNDO));
1625cdf0e10cSrcweir pUndoDoc->InitUndoSelected(pDoc, aMark, false, false);
1626cdf0e10cSrcweir pDoc->CopyToDocument(aMarkedRange, nUndoFlags, false, pUndoDoc.get(), &aMark, true);
1627cdf0e10cSrcweir }
1628cdf0e10cSrcweir
1629cdf0e10cSrcweir ::std::auto_ptr<ScDocument> pMixDoc;
1630cdf0e10cSrcweir if ( bSkipEmpty || nFunction )
1631cdf0e10cSrcweir {
1632cdf0e10cSrcweir if ( nFlags & IDF_CONTENTS )
1633cdf0e10cSrcweir {
1634cdf0e10cSrcweir pMixDoc.reset(new ScDocument(SCDOCMODE_UNDO));
1635cdf0e10cSrcweir pMixDoc->InitUndoSelected(pDoc, aMark, false, false);
1636cdf0e10cSrcweir pDoc->CopyToDocument(aMarkedRange, IDF_CONTENTS, false, pMixDoc.get(), &aMark, true);
1637cdf0e10cSrcweir }
1638cdf0e10cSrcweir }
1639cdf0e10cSrcweir
1640cdf0e10cSrcweir /* Make draw layer and start drawing undo.
1641cdf0e10cSrcweir - Needed before AdjustBlockHeight to track moved drawing objects.
1642cdf0e10cSrcweir - Needed before pDoc->CopyFromClip to track inserted note caption objects.
1643cdf0e10cSrcweir */
1644cdf0e10cSrcweir if (nFlags & IDF_OBJECTS)
1645cdf0e10cSrcweir pDocSh->MakeDrawLayer();
1646cdf0e10cSrcweir if (pDoc->IsUndoEnabled())
1647cdf0e10cSrcweir pDoc->BeginDrawUndo();
1648cdf0e10cSrcweir
1649cdf0e10cSrcweir CursorSwitcher aCursorSwitch(this);
1650cdf0e10cSrcweir sal_uInt16 nNoObjFlags = nFlags & ~IDF_OBJECTS;
1651cdf0e10cSrcweir pDoc->CopyMultiRangeFromClip(rCurPos, aMark, nNoObjFlags, pClipDoc,
1652cdf0e10cSrcweir true, bAsLink, false, bSkipEmpty);
1653cdf0e10cSrcweir
1654cdf0e10cSrcweir if (pMixDoc.get())
1655cdf0e10cSrcweir pDoc->MixDocument(aMarkedRange, nFunction, bSkipEmpty, pMixDoc.get());
1656cdf0e10cSrcweir
1657cdf0e10cSrcweir AdjustBlockHeight(); // update row heights before pasting objects
1658cdf0e10cSrcweir
1659cdf0e10cSrcweir if (nFlags & IDF_OBJECTS)
1660cdf0e10cSrcweir {
1661cdf0e10cSrcweir // Paste the drawing objects after the row heights have been updated.
1662cdf0e10cSrcweir pDoc->CopyMultiRangeFromClip(rCurPos, aMark, IDF_OBJECTS, pClipDoc,
1663cdf0e10cSrcweir true, false, false, true);
1664cdf0e10cSrcweir }
1665cdf0e10cSrcweir
1666cdf0e10cSrcweir pDocSh->PostPaint(
1667cdf0e10cSrcweir aMarkedRange.aStart.Col(), aMarkedRange.aStart.Row(), nTab1,
1668cdf0e10cSrcweir aMarkedRange.aEnd.Col(), aMarkedRange.aEnd.Row(), nTab1, PAINT_GRID);
1669cdf0e10cSrcweir
1670cdf0e10cSrcweir if (pDoc->IsUndoEnabled())
1671cdf0e10cSrcweir {
1672cdf0e10cSrcweir ::svl::IUndoManager* pUndoMgr = pDocSh->GetUndoManager();
1673cdf0e10cSrcweir String aUndo = ScGlobal::GetRscString(
1674cdf0e10cSrcweir pClipDoc->IsCutMode() ? STR_UNDO_CUT : STR_UNDO_COPY);
1675cdf0e10cSrcweir pUndoMgr->EnterListAction(aUndo, aUndo);
1676cdf0e10cSrcweir
1677cdf0e10cSrcweir ScUndoPasteOptions aOptions; // store options for repeat
1678cdf0e10cSrcweir aOptions.nFunction = nFunction;
1679cdf0e10cSrcweir aOptions.bSkipEmpty = bSkipEmpty;
1680cdf0e10cSrcweir aOptions.bTranspose = bTranspose;
1681cdf0e10cSrcweir aOptions.bAsLink = bAsLink;
1682cdf0e10cSrcweir aOptions.eMoveMode = eMoveMode;
1683cdf0e10cSrcweir
1684cdf0e10cSrcweir ScUndoPaste* pUndo = new ScUndoPaste(pDocSh,
1685cdf0e10cSrcweir aMarkedRange.aStart.Col(),
1686cdf0e10cSrcweir aMarkedRange.aStart.Row(),
1687cdf0e10cSrcweir aMarkedRange.aStart.Tab(),
1688cdf0e10cSrcweir aMarkedRange.aEnd.Col(),
1689cdf0e10cSrcweir aMarkedRange.aEnd.Row(),
1690cdf0e10cSrcweir aMarkedRange.aEnd.Tab(),
1691cdf0e10cSrcweir aMark, pUndoDoc.release(), NULL, nFlags|nUndoFlags, NULL, NULL, NULL, NULL, false, &aOptions);
1692cdf0e10cSrcweir
1693cdf0e10cSrcweir if (bInsertCells)
1694cdf0e10cSrcweir pUndoMgr->AddUndoAction(new ScUndoWrapper(pUndo), true);
1695cdf0e10cSrcweir else
1696cdf0e10cSrcweir pUndoMgr->AddUndoAction(pUndo, false);
1697cdf0e10cSrcweir
1698cdf0e10cSrcweir pUndoMgr->LeaveListAction();
1699cdf0e10cSrcweir }
1700cdf0e10cSrcweir aModificator.SetDocumentModified();
1701cdf0e10cSrcweir PostPasteFromClip(aMarkedRange, aMark);
1702cdf0e10cSrcweir return true;
1703cdf0e10cSrcweir }
1704cdf0e10cSrcweir
PostPasteFromClip(const ScRange & rPasteRange,const ScMarkData & rMark)1705cdf0e10cSrcweir void ScViewFunc::PostPasteFromClip(const ScRange& rPasteRange, const ScMarkData& rMark)
1706cdf0e10cSrcweir {
1707cdf0e10cSrcweir ScViewData* pViewData = GetViewData();
1708cdf0e10cSrcweir ScDocShell* pDocSh = pViewData->GetDocShell();
1709cdf0e10cSrcweir ScDocument* pDoc = pViewData->GetDocument();
1710cdf0e10cSrcweir pDocSh->UpdateOle(pViewData);
1711cdf0e10cSrcweir
1712cdf0e10cSrcweir SelectionChanged();
1713cdf0e10cSrcweir
1714cdf0e10cSrcweir // #i97876# Spreadsheet data changes are not notified
1715cdf0e10cSrcweir ScModelObj* pModelObj = ScModelObj::getImplementation( pDocSh->GetModel() );
1716cdf0e10cSrcweir if ( pModelObj && pModelObj->HasChangesListeners() )
1717cdf0e10cSrcweir {
1718cdf0e10cSrcweir ScRangeList aChangeRanges;
1719cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount();
1720cdf0e10cSrcweir for ( SCTAB i = 0; i < nTabCount; ++i )
1721cdf0e10cSrcweir {
1722cdf0e10cSrcweir if ( rMark.GetTableSelect( i ) )
1723cdf0e10cSrcweir {
1724cdf0e10cSrcweir ScRange aChangeRange(rPasteRange);
1725cdf0e10cSrcweir aChangeRange.aStart.SetTab( i );
1726cdf0e10cSrcweir aChangeRange.aEnd.SetTab( i );
1727cdf0e10cSrcweir aChangeRanges.Append( aChangeRange );
1728cdf0e10cSrcweir }
1729cdf0e10cSrcweir }
1730cdf0e10cSrcweir pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
1731cdf0e10cSrcweir }
1732cdf0e10cSrcweir }
1733cdf0e10cSrcweir
1734cdf0e10cSrcweir
1735cdf0e10cSrcweir //----------------------------------------------------------------------------
1736cdf0e10cSrcweir // D R A G A N D D R O P
1737cdf0e10cSrcweir //
1738cdf0e10cSrcweir // innerhalb des Dokuments
1739cdf0e10cSrcweir
MoveBlockTo(const ScRange & rSource,const ScAddress & rDestPos,sal_Bool bCut,sal_Bool bRecord,sal_Bool bPaint,sal_Bool bApi)1740cdf0e10cSrcweir sal_Bool ScViewFunc::MoveBlockTo( const ScRange& rSource, const ScAddress& rDestPos,
1741cdf0e10cSrcweir sal_Bool bCut, sal_Bool bRecord, sal_Bool bPaint, sal_Bool bApi )
1742cdf0e10cSrcweir {
1743cdf0e10cSrcweir ScDocShell* pDocSh = GetViewData()->GetDocShell();
1744cdf0e10cSrcweir HideAllCursors(); // wegen zusammengefassten
1745cdf0e10cSrcweir
1746cdf0e10cSrcweir sal_Bool bSuccess = sal_True;
1747cdf0e10cSrcweir SCTAB nDestTab = rDestPos.Tab();
1748cdf0e10cSrcweir const ScMarkData& rMark = GetViewData()->GetMarkData();
1749cdf0e10cSrcweir if ( rSource.aStart.Tab() == nDestTab && rSource.aEnd.Tab() == nDestTab && rMark.GetSelectCount() > 1 )
1750cdf0e10cSrcweir {
1751cdf0e10cSrcweir // moving within one table and several tables selected -> apply to all selected tables
1752cdf0e10cSrcweir
1753cdf0e10cSrcweir if ( bRecord )
1754cdf0e10cSrcweir {
1755cdf0e10cSrcweir String aUndo = ScGlobal::GetRscString( bCut ? STR_UNDO_MOVE : STR_UNDO_COPY );
1756cdf0e10cSrcweir pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
1757cdf0e10cSrcweir }
1758cdf0e10cSrcweir
1759cdf0e10cSrcweir // collect ranges of consecutive selected tables
1760cdf0e10cSrcweir
1761cdf0e10cSrcweir ScRange aLocalSource = rSource;
1762cdf0e10cSrcweir ScAddress aLocalDest = rDestPos;
1763cdf0e10cSrcweir SCTAB nTabCount = pDocSh->GetDocument()->GetTableCount();
1764cdf0e10cSrcweir SCTAB nStartTab = 0;
1765cdf0e10cSrcweir while ( nStartTab < nTabCount && bSuccess )
1766cdf0e10cSrcweir {
1767cdf0e10cSrcweir while ( nStartTab < nTabCount && !rMark.GetTableSelect(nStartTab) )
1768cdf0e10cSrcweir ++nStartTab;
1769cdf0e10cSrcweir if ( nStartTab < nTabCount )
1770cdf0e10cSrcweir {
1771cdf0e10cSrcweir SCTAB nEndTab = nStartTab;
1772cdf0e10cSrcweir while ( nEndTab+1 < nTabCount && rMark.GetTableSelect(nEndTab+1) )
1773cdf0e10cSrcweir ++nEndTab;
1774cdf0e10cSrcweir
1775cdf0e10cSrcweir aLocalSource.aStart.SetTab( nStartTab );
1776cdf0e10cSrcweir aLocalSource.aEnd.SetTab( nEndTab );
1777cdf0e10cSrcweir aLocalDest.SetTab( nStartTab );
1778cdf0e10cSrcweir
1779cdf0e10cSrcweir bSuccess = pDocSh->GetDocFunc().MoveBlock(
1780cdf0e10cSrcweir aLocalSource, aLocalDest, bCut, bRecord, bPaint, bApi );
1781cdf0e10cSrcweir
1782cdf0e10cSrcweir nStartTab = nEndTab + 1;
1783cdf0e10cSrcweir }
1784cdf0e10cSrcweir }
1785cdf0e10cSrcweir
1786cdf0e10cSrcweir if ( bRecord )
1787cdf0e10cSrcweir pDocSh->GetUndoManager()->LeaveListAction();
1788cdf0e10cSrcweir }
1789cdf0e10cSrcweir else
1790cdf0e10cSrcweir {
1791cdf0e10cSrcweir // move the block as specified
1792cdf0e10cSrcweir bSuccess = pDocSh->GetDocFunc().MoveBlock(
1793cdf0e10cSrcweir rSource, rDestPos, bCut, bRecord, bPaint, bApi );
1794cdf0e10cSrcweir }
1795cdf0e10cSrcweir
1796cdf0e10cSrcweir ShowAllCursors();
1797cdf0e10cSrcweir if (bSuccess)
1798cdf0e10cSrcweir {
1799cdf0e10cSrcweir // Zielbereich markieren
1800cdf0e10cSrcweir ScAddress aDestEnd(
1801cdf0e10cSrcweir rDestPos.Col() + rSource.aEnd.Col() - rSource.aStart.Col(),
1802cdf0e10cSrcweir rDestPos.Row() + rSource.aEnd.Row() - rSource.aStart.Row(),
1803cdf0e10cSrcweir nDestTab );
1804cdf0e10cSrcweir
1805cdf0e10cSrcweir sal_Bool bIncludeFiltered = bCut;
1806cdf0e10cSrcweir if ( !bIncludeFiltered )
1807cdf0e10cSrcweir {
1808cdf0e10cSrcweir // find number of non-filtered rows
1809cdf0e10cSrcweir SCROW nPastedCount = pDocSh->GetDocument()->CountNonFilteredRows(
1810cdf0e10cSrcweir rSource.aStart.Row(), rSource.aEnd.Row(), rSource.aStart.Tab());
1811cdf0e10cSrcweir
1812cdf0e10cSrcweir if ( nPastedCount == 0 )
1813cdf0e10cSrcweir nPastedCount = 1;
1814cdf0e10cSrcweir aDestEnd.SetRow( rDestPos.Row() + nPastedCount - 1 );
1815cdf0e10cSrcweir }
1816cdf0e10cSrcweir
1817cdf0e10cSrcweir MarkRange( ScRange( rDestPos, aDestEnd ), sal_False ); //! sal_False ???
1818cdf0e10cSrcweir
1819cdf0e10cSrcweir pDocSh->UpdateOle(GetViewData());
1820cdf0e10cSrcweir SelectionChanged();
1821cdf0e10cSrcweir }
1822cdf0e10cSrcweir return bSuccess;
1823cdf0e10cSrcweir }
1824cdf0e10cSrcweir
1825cdf0e10cSrcweir // Link innerhalb des Dokuments
1826cdf0e10cSrcweir
LinkBlock(const ScRange & rSource,const ScAddress & rDestPos,sal_Bool bApi)1827cdf0e10cSrcweir sal_Bool ScViewFunc::LinkBlock( const ScRange& rSource, const ScAddress& rDestPos, sal_Bool bApi )
1828cdf0e10cSrcweir {
1829cdf0e10cSrcweir // Test auf Ueberlappung
1830cdf0e10cSrcweir
1831cdf0e10cSrcweir if ( rSource.aStart.Tab() == rDestPos.Tab() )
1832cdf0e10cSrcweir {
1833cdf0e10cSrcweir SCCOL nDestEndCol = rDestPos.Col() + ( rSource.aEnd.Col() - rSource.aStart.Col() );
1834cdf0e10cSrcweir SCROW nDestEndRow = rDestPos.Row() + ( rSource.aEnd.Row() - rSource.aStart.Row() );
1835cdf0e10cSrcweir
1836cdf0e10cSrcweir if ( rSource.aStart.Col() <= nDestEndCol && rDestPos.Col() <= rSource.aEnd.Col() &&
1837cdf0e10cSrcweir rSource.aStart.Row() <= nDestEndRow && rDestPos.Row() <= rSource.aEnd.Row() )
1838cdf0e10cSrcweir {
1839cdf0e10cSrcweir if (!bApi)
1840cdf0e10cSrcweir ErrorMessage( STR_ERR_LINKOVERLAP );
1841cdf0e10cSrcweir return sal_False;
1842cdf0e10cSrcweir }
1843cdf0e10cSrcweir }
1844cdf0e10cSrcweir
1845cdf0e10cSrcweir // Ausfuehren per Paste
1846cdf0e10cSrcweir
1847cdf0e10cSrcweir ScDocument* pDoc = GetViewData()->GetDocument();
1848cdf0e10cSrcweir ScDocument* pClipDoc = new ScDocument( SCDOCMODE_CLIP );
1849cdf0e10cSrcweir pDoc->CopyTabToClip( rSource.aStart.Col(), rSource.aStart.Row(),
1850cdf0e10cSrcweir rSource.aEnd.Col(), rSource.aEnd.Row(),
1851cdf0e10cSrcweir rSource.aStart.Tab(), pClipDoc );
1852cdf0e10cSrcweir
1853cdf0e10cSrcweir // Zielbereich markieren (Cursor setzen, keine Markierung)
1854cdf0e10cSrcweir
1855cdf0e10cSrcweir if ( GetViewData()->GetTabNo() != rDestPos.Tab() )
1856cdf0e10cSrcweir SetTabNo( rDestPos.Tab() );
1857cdf0e10cSrcweir
1858cdf0e10cSrcweir MoveCursorAbs( rDestPos.Col(), rDestPos.Row(), SC_FOLLOW_NONE, sal_False, sal_False );
1859cdf0e10cSrcweir
1860cdf0e10cSrcweir // Paste
1861cdf0e10cSrcweir
1862cdf0e10cSrcweir PasteFromClip( IDF_ALL, pClipDoc, PASTE_NOFUNC, sal_False, sal_False, sal_True ); // als Link
1863cdf0e10cSrcweir
1864cdf0e10cSrcweir delete pClipDoc;
1865cdf0e10cSrcweir
1866cdf0e10cSrcweir return sal_True;
1867cdf0e10cSrcweir }
1868cdf0e10cSrcweir
1869cdf0e10cSrcweir
1870cdf0e10cSrcweir
1871cdf0e10cSrcweir
1872