xref: /aoo41x/main/sc/source/ui/view/viewfun3.cxx (revision 52f1c2ee)
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