LCOV - code coverage report
Current view: top level - sc/source/ui/view - viewfun3.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 166 981 16.9 %
Date: 2012-08-25 Functions: 2 18 11.1 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 158 2089 7.6 %

           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: */

Generated by: LCOV version 1.10