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