1b3f79822SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3b3f79822SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4b3f79822SAndrew Rist * or more contributor license agreements. See the NOTICE file 5b3f79822SAndrew Rist * distributed with this work for additional information 6b3f79822SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7b3f79822SAndrew Rist * to you under the Apache License, Version 2.0 (the 8b3f79822SAndrew Rist * "License"); you may not use this file except in compliance 9b3f79822SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13b3f79822SAndrew Rist * Unless required by applicable law or agreed to in writing, 14b3f79822SAndrew Rist * software distributed under the License is distributed on an 15b3f79822SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16b3f79822SAndrew Rist * KIND, either express or implied. See the License for the 17b3f79822SAndrew Rist * specific language governing permissions and limitations 18b3f79822SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20b3f79822SAndrew Rist *************************************************************/ 21b3f79822SAndrew Rist 22b3f79822SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_sc.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir // INCLUDE --------------------------------------------------------------- 28cdf0e10cSrcweir 29cdf0e10cSrcweir 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include "scitems.hxx" 32cdf0e10cSrcweir #include <editeng/eeitem.hxx> 33cdf0e10cSrcweir 34cdf0e10cSrcweir 35cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx> 36cdf0e10cSrcweir #include <com/sun/star/embed/XTransactedObject.hpp> 37cdf0e10cSrcweir 38cdf0e10cSrcweir #include <unotools/tempfile.hxx> 39cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx> 40cdf0e10cSrcweir #include <comphelper/storagehelper.hxx> 41cdf0e10cSrcweir #include <sot/storage.hxx> 42cdf0e10cSrcweir #include <vcl/svapp.hxx> 43cdf0e10cSrcweir #include <vcl/virdev.hxx> 44cdf0e10cSrcweir #include <vos/mutex.hxx> 45cdf0e10cSrcweir #include <sfx2/app.hxx> 46cdf0e10cSrcweir #include <sfx2/docfile.hxx> 47cdf0e10cSrcweir 48cdf0e10cSrcweir #include "transobj.hxx" 49cdf0e10cSrcweir #include "document.hxx" 50cdf0e10cSrcweir #include "viewopti.hxx" 51cdf0e10cSrcweir #include "editutil.hxx" 52cdf0e10cSrcweir #include "impex.hxx" 53cdf0e10cSrcweir #include "cell.hxx" 54cdf0e10cSrcweir #include "printfun.hxx" 55cdf0e10cSrcweir #include "docfunc.hxx" 56cdf0e10cSrcweir #include "scmod.hxx" 57cdf0e10cSrcweir 58cdf0e10cSrcweir // for InitDocShell 59cdf0e10cSrcweir #include <editeng/paperinf.hxx> 60cdf0e10cSrcweir #include <editeng/sizeitem.hxx> 61cdf0e10cSrcweir #include <svx/algitem.hxx> 62cdf0e10cSrcweir #include <svl/intitem.hxx> 63cdf0e10cSrcweir #include <svl/zforlist.hxx> 64cdf0e10cSrcweir #include "docsh.hxx" 65cdf0e10cSrcweir #include "markdata.hxx" 66cdf0e10cSrcweir #include "stlpool.hxx" 67cdf0e10cSrcweir #include "viewdata.hxx" 68cdf0e10cSrcweir #include "dociter.hxx" 69cdf0e10cSrcweir #include "cellsuno.hxx" 70cdf0e10cSrcweir 71cdf0e10cSrcweir using namespace com::sun::star; 72cdf0e10cSrcweir 73cdf0e10cSrcweir // ----------------------------------------------------------------------- 74cdf0e10cSrcweir 75cdf0e10cSrcweir #define SCTRANS_TYPE_IMPEX 1 76cdf0e10cSrcweir #define SCTRANS_TYPE_EDIT_RTF 2 77cdf0e10cSrcweir #define SCTRANS_TYPE_EDIT_BIN 3 78cdf0e10cSrcweir #define SCTRANS_TYPE_EMBOBJ 4 79cdf0e10cSrcweir 80cdf0e10cSrcweir // ----------------------------------------------------------------------- 81cdf0e10cSrcweir 82cdf0e10cSrcweir // static 83cdf0e10cSrcweir void ScTransferObj::GetAreaSize( ScDocument* pDoc, SCTAB nTab1, SCTAB nTab2, SCROW& nRow, SCCOL& nCol ) 84cdf0e10cSrcweir { 85cdf0e10cSrcweir SCCOL nMaxCol = 0; 86cdf0e10cSrcweir SCROW nMaxRow = 0; 87cdf0e10cSrcweir for( SCTAB nTab = nTab1; nTab <= nTab2; nTab++ ) 88cdf0e10cSrcweir { 89cdf0e10cSrcweir SCCOL nLastCol = 0; 90cdf0e10cSrcweir SCROW nLastRow = 0; 91cdf0e10cSrcweir // GetPrintArea instead of GetCellArea - include drawing objects 92cdf0e10cSrcweir if( pDoc->GetPrintArea( nTab, nLastCol, nLastRow ) ) 93cdf0e10cSrcweir { 94cdf0e10cSrcweir if( nLastCol > nMaxCol ) 95cdf0e10cSrcweir nMaxCol = nLastCol; 96cdf0e10cSrcweir if( nLastRow > nMaxRow ) 97cdf0e10cSrcweir nMaxRow = nLastRow; 98cdf0e10cSrcweir } 99cdf0e10cSrcweir } 100cdf0e10cSrcweir nRow = nMaxRow; 101cdf0e10cSrcweir nCol = nMaxCol; 102cdf0e10cSrcweir } 103cdf0e10cSrcweir 104cdf0e10cSrcweir // static 105cdf0e10cSrcweir void ScTransferObj::PaintToDev( OutputDevice* pDev, ScDocument* pDoc, double nPrintFactor, 106cdf0e10cSrcweir const ScRange& rBlock, sal_Bool bMetaFile ) 107cdf0e10cSrcweir { 108cdf0e10cSrcweir if (!pDoc) 109cdf0e10cSrcweir return; 110cdf0e10cSrcweir 111cdf0e10cSrcweir Point aPoint; 112cdf0e10cSrcweir Rectangle aBound( aPoint, pDev->GetOutputSize() ); //! use size from clip area? 113cdf0e10cSrcweir 114cdf0e10cSrcweir ScViewData aViewData(NULL,NULL); 115cdf0e10cSrcweir aViewData.InitData( pDoc ); 116cdf0e10cSrcweir 117cdf0e10cSrcweir aViewData.SetTabNo( rBlock.aEnd.Tab() ); 118cdf0e10cSrcweir aViewData.SetScreen( rBlock.aStart.Col(), rBlock.aStart.Row(), 119cdf0e10cSrcweir rBlock.aEnd.Col(), rBlock.aEnd.Row() ); 120cdf0e10cSrcweir 121cdf0e10cSrcweir ScPrintFunc::DrawToDev( pDoc, pDev, nPrintFactor, aBound, &aViewData, bMetaFile ); 122cdf0e10cSrcweir } 123cdf0e10cSrcweir 124cdf0e10cSrcweir // ----------------------------------------------------------------------- 125cdf0e10cSrcweir 126cdf0e10cSrcweir ScTransferObj::ScTransferObj( ScDocument* pClipDoc, const TransferableObjectDescriptor& rDesc ) : 127cdf0e10cSrcweir pDoc( pClipDoc ), 128cdf0e10cSrcweir aObjDesc( rDesc ), 129cdf0e10cSrcweir nDragHandleX( 0 ), 130cdf0e10cSrcweir nDragHandleY( 0 ), 131cdf0e10cSrcweir nDragSourceFlags( 0 ), 132cdf0e10cSrcweir bDragWasInternal( sal_False ), 133cdf0e10cSrcweir bUsedForLink( sal_False ), 134cdf0e10cSrcweir bUseInApi( false ) 135cdf0e10cSrcweir { 136cdf0e10cSrcweir DBG_ASSERT(pDoc->IsClipboard(), "wrong document"); 137cdf0e10cSrcweir 138cdf0e10cSrcweir // 139cdf0e10cSrcweir // get aBlock from clipboard doc 140cdf0e10cSrcweir // 141cdf0e10cSrcweir 142cdf0e10cSrcweir SCCOL nCol1; 143cdf0e10cSrcweir SCROW nRow1; 144cdf0e10cSrcweir SCCOL nCol2; 145cdf0e10cSrcweir SCROW nRow2; 146cdf0e10cSrcweir pDoc->GetClipStart( nCol1, nRow1 ); 147cdf0e10cSrcweir pDoc->GetClipArea( nCol2, nRow2, sal_True ); // real source area - include filtered rows 148cdf0e10cSrcweir nCol2 = sal::static_int_cast<SCCOL>( nCol2 + nCol1 ); 149cdf0e10cSrcweir nRow2 = sal::static_int_cast<SCROW>( nRow2 + nRow1 ); 150cdf0e10cSrcweir 151cdf0e10cSrcweir SCCOL nDummy; 152cdf0e10cSrcweir pDoc->GetClipArea( nDummy, nNonFiltered, sal_False ); 153cdf0e10cSrcweir bHasFiltered = (nNonFiltered < (nRow2 - nRow1)); 154cdf0e10cSrcweir ++nNonFiltered; // to get count instead of diff 155cdf0e10cSrcweir 156cdf0e10cSrcweir SCTAB nTab1=0; 157cdf0e10cSrcweir SCTAB nTab2=0; 158cdf0e10cSrcweir sal_Bool bFirst = sal_True; 159cdf0e10cSrcweir for (SCTAB i=0; i<=MAXTAB; i++) 160cdf0e10cSrcweir if (pDoc->HasTable(i)) 161cdf0e10cSrcweir { 162cdf0e10cSrcweir if (bFirst) 163cdf0e10cSrcweir nTab1 = i; 164cdf0e10cSrcweir nTab2 = i; 165cdf0e10cSrcweir bFirst = sal_False; 166cdf0e10cSrcweir } 167cdf0e10cSrcweir DBG_ASSERT(!bFirst, "no sheet selected"); 168cdf0e10cSrcweir 169cdf0e10cSrcweir // only limit to used cells if whole sheet was marked 170cdf0e10cSrcweir // (so empty cell areas can be copied) 171cdf0e10cSrcweir if ( nCol2>=MAXCOL && nRow2>=MAXROW ) 172cdf0e10cSrcweir { 173cdf0e10cSrcweir SCROW nMaxRow; 174cdf0e10cSrcweir SCCOL nMaxCol; 175cdf0e10cSrcweir GetAreaSize( pDoc, nTab1, nTab2, nMaxRow, nMaxCol ); 176cdf0e10cSrcweir if( nMaxRow < nRow2 ) 177cdf0e10cSrcweir nRow2 = nMaxRow; 178cdf0e10cSrcweir if( nMaxCol < nCol2 ) 179cdf0e10cSrcweir nCol2 = nMaxCol; 180cdf0e10cSrcweir } 181cdf0e10cSrcweir 182cdf0e10cSrcweir aBlock = ScRange( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2 ); 183cdf0e10cSrcweir nVisibleTab = nTab1; // valid table as default 184cdf0e10cSrcweir 185cdf0e10cSrcweir Rectangle aMMRect = pDoc->GetMMRect( nCol1,nRow1, nCol2,nRow2, nTab1 ); 186cdf0e10cSrcweir aObjDesc.maSize = aMMRect.GetSize(); 187cdf0e10cSrcweir PrepareOLE( aObjDesc ); 188cdf0e10cSrcweir } 189cdf0e10cSrcweir 190cdf0e10cSrcweir ScTransferObj::~ScTransferObj() 191cdf0e10cSrcweir { 192cdf0e10cSrcweir Application::GetSolarMutex().acquire(); 193cdf0e10cSrcweir 194cdf0e10cSrcweir ScModule* pScMod = SC_MOD(); 195cdf0e10cSrcweir if ( pScMod->GetClipData().pCellClipboard == this ) 196cdf0e10cSrcweir { 197cdf0e10cSrcweir DBG_ERROR("ScTransferObj wasn't released"); 198cdf0e10cSrcweir pScMod->SetClipObject( NULL, NULL ); 199cdf0e10cSrcweir } 200cdf0e10cSrcweir if ( pScMod->GetDragData().pCellTransfer == this ) 201cdf0e10cSrcweir { 202cdf0e10cSrcweir DBG_ERROR("ScTransferObj wasn't released"); 203cdf0e10cSrcweir pScMod->ResetDragObject(); 204cdf0e10cSrcweir } 205cdf0e10cSrcweir 206cdf0e10cSrcweir delete pDoc; // ScTransferObj is owner of clipboard document 207cdf0e10cSrcweir 208cdf0e10cSrcweir aDocShellRef.Clear(); // before releasing the mutex 209cdf0e10cSrcweir 210cdf0e10cSrcweir aDrawPersistRef.Clear(); // after the model 211cdf0e10cSrcweir 212cdf0e10cSrcweir Application::GetSolarMutex().release(); 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir // static 216cdf0e10cSrcweir ScTransferObj* ScTransferObj::GetOwnClipboard( Window* pUIWin ) 217cdf0e10cSrcweir { 218cdf0e10cSrcweir ScTransferObj* pObj = SC_MOD()->GetClipData().pCellClipboard; 219cdf0e10cSrcweir if ( pObj && pUIWin ) 220cdf0e10cSrcweir { 221cdf0e10cSrcweir // check formats to see if pObj is really in the system clipboard 222cdf0e10cSrcweir 223cdf0e10cSrcweir // pUIWin is NULL when called from core (IsClipboardSource), 224cdf0e10cSrcweir // in that case don't access the system clipboard, because the call 225cdf0e10cSrcweir // may be from other clipboard operations (like flushing, #86059#) 226cdf0e10cSrcweir 227cdf0e10cSrcweir TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pUIWin ) ); 228cdf0e10cSrcweir if ( !aDataHelper.HasFormat( SOT_FORMATSTR_ID_DIF ) ) 229cdf0e10cSrcweir { 230cdf0e10cSrcweir // DBG_ERROR("ScTransferObj wasn't released"); 231cdf0e10cSrcweir pObj = NULL; 232cdf0e10cSrcweir } 233cdf0e10cSrcweir } 234cdf0e10cSrcweir return pObj; 235cdf0e10cSrcweir } 236cdf0e10cSrcweir 237cdf0e10cSrcweir void ScTransferObj::AddSupportedFormats() 238cdf0e10cSrcweir { 239cdf0e10cSrcweir AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE ); 240cdf0e10cSrcweir AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ); 241cdf0e10cSrcweir AddFormat( SOT_FORMAT_GDIMETAFILE ); 242*a206ee71SArmin Le Grand AddFormat( SOT_FORMATSTR_ID_PNG ); 243cdf0e10cSrcweir AddFormat( SOT_FORMAT_BITMAP ); 244cdf0e10cSrcweir 245cdf0e10cSrcweir // ScImportExport formats 246cdf0e10cSrcweir AddFormat( SOT_FORMATSTR_ID_HTML ); 247cdf0e10cSrcweir AddFormat( SOT_FORMATSTR_ID_SYLK ); 248cdf0e10cSrcweir AddFormat( SOT_FORMATSTR_ID_LINK ); 249cdf0e10cSrcweir AddFormat( SOT_FORMATSTR_ID_DIF ); 250cdf0e10cSrcweir AddFormat( SOT_FORMAT_STRING ); 251cdf0e10cSrcweir 252cdf0e10cSrcweir AddFormat( SOT_FORMAT_RTF ); 253cdf0e10cSrcweir if ( aBlock.aStart == aBlock.aEnd ) 254cdf0e10cSrcweir AddFormat( SOT_FORMATSTR_ID_EDITENGINE ); 255cdf0e10cSrcweir } 256cdf0e10cSrcweir 257cdf0e10cSrcweir sal_Bool ScTransferObj::GetData( const datatransfer::DataFlavor& rFlavor ) 258cdf0e10cSrcweir { 259cdf0e10cSrcweir sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor ); 260cdf0e10cSrcweir sal_Bool bOK = sal_False; 261cdf0e10cSrcweir 262cdf0e10cSrcweir if( HasFormat( nFormat ) ) 263cdf0e10cSrcweir { 264cdf0e10cSrcweir if ( nFormat == SOT_FORMATSTR_ID_LINKSRCDESCRIPTOR || nFormat == SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) 265cdf0e10cSrcweir { 266cdf0e10cSrcweir bOK = SetTransferableObjectDescriptor( aObjDesc, rFlavor ); 267cdf0e10cSrcweir } 268cdf0e10cSrcweir else if ( ( nFormat == SOT_FORMAT_RTF || nFormat == SOT_FORMATSTR_ID_EDITENGINE ) && 269cdf0e10cSrcweir aBlock.aStart == aBlock.aEnd ) 270cdf0e10cSrcweir { 271cdf0e10cSrcweir // RTF from a single cell is handled by EditEngine 272cdf0e10cSrcweir 273cdf0e10cSrcweir SCCOL nCol = aBlock.aStart.Col(); 274cdf0e10cSrcweir SCROW nRow = aBlock.aStart.Row(); 275cdf0e10cSrcweir SCTAB nTab = aBlock.aStart.Tab(); 276cdf0e10cSrcweir 277cdf0e10cSrcweir const ScPatternAttr* pPattern = pDoc->GetPattern( nCol, nRow, nTab ); 278cdf0e10cSrcweir ScTabEditEngine aEngine( *pPattern, pDoc->GetEditPool() ); 279cdf0e10cSrcweir ScBaseCell* pCell = NULL; 280cdf0e10cSrcweir pDoc->GetCell( nCol, nRow, nTab, pCell ); 281cdf0e10cSrcweir if (pCell) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir if (pCell->GetCellType() == CELLTYPE_EDIT) 284cdf0e10cSrcweir { 285cdf0e10cSrcweir const EditTextObject* pObj; 286cdf0e10cSrcweir ((ScEditCell*)pCell)->GetData(pObj); 287cdf0e10cSrcweir aEngine.SetText( *pObj ); 288cdf0e10cSrcweir } 289cdf0e10cSrcweir else 290cdf0e10cSrcweir { 291cdf0e10cSrcweir String aText; 292cdf0e10cSrcweir pDoc->GetString( nCol, nRow, nTab, aText ); 293cdf0e10cSrcweir aEngine.SetText(aText); 294cdf0e10cSrcweir } 295cdf0e10cSrcweir } 296cdf0e10cSrcweir 297cdf0e10cSrcweir bOK = SetObject( &aEngine, 298cdf0e10cSrcweir (nFormat == FORMAT_RTF) ? SCTRANS_TYPE_EDIT_RTF : SCTRANS_TYPE_EDIT_BIN, 299cdf0e10cSrcweir rFlavor ); 300cdf0e10cSrcweir } 301cdf0e10cSrcweir else if ( ScImportExport::IsFormatSupported( nFormat ) || nFormat == SOT_FORMAT_RTF ) 302cdf0e10cSrcweir { 303cdf0e10cSrcweir // if this transfer object was used to create a DDE link, filtered rows 304cdf0e10cSrcweir // have to be included for subsequent calls (to be consistent with link data) 305cdf0e10cSrcweir if ( nFormat == SOT_FORMATSTR_ID_LINK ) 306cdf0e10cSrcweir bUsedForLink = sal_True; 307cdf0e10cSrcweir 308cdf0e10cSrcweir sal_Bool bIncludeFiltered = pDoc->IsCutMode() || bUsedForLink; 309cdf0e10cSrcweir 310cdf0e10cSrcweir ScImportExport aObj( pDoc, aBlock ); 311cdf0e10cSrcweir if ( bUsedForLink ) 312cdf0e10cSrcweir aObj.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::ToSpace, ' ', false ) ); 313cdf0e10cSrcweir aObj.SetFormulas( pDoc->GetViewOptions().GetOption( VOPT_FORMULAS ) ); 314cdf0e10cSrcweir aObj.SetIncludeFiltered( bIncludeFiltered ); 315cdf0e10cSrcweir 316cdf0e10cSrcweir // DataType depends on format type: 317cdf0e10cSrcweir 318cdf0e10cSrcweir if ( rFlavor.DataType.equals( ::getCppuType( (const ::rtl::OUString*) 0 ) ) ) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir rtl::OUString aString; 321cdf0e10cSrcweir if ( aObj.ExportString( aString, nFormat ) ) 322cdf0e10cSrcweir bOK = SetString( aString, rFlavor ); 323cdf0e10cSrcweir } 324cdf0e10cSrcweir else if ( rFlavor.DataType.equals( ::getCppuType( (const uno::Sequence< sal_Int8 >*) 0 ) ) ) 325cdf0e10cSrcweir { 326cdf0e10cSrcweir // SetObject converts a stream into a Int8-Sequence 327cdf0e10cSrcweir bOK = SetObject( &aObj, SCTRANS_TYPE_IMPEX, rFlavor ); 328cdf0e10cSrcweir } 329cdf0e10cSrcweir else 330cdf0e10cSrcweir { 331cdf0e10cSrcweir DBG_ERROR("unknown DataType"); 332cdf0e10cSrcweir } 333cdf0e10cSrcweir } 334*a206ee71SArmin Le Grand else if ( nFormat == SOT_FORMAT_BITMAP || nFormat == SOT_FORMATSTR_ID_PNG ) 335cdf0e10cSrcweir { 336cdf0e10cSrcweir Rectangle aMMRect = pDoc->GetMMRect( aBlock.aStart.Col(), aBlock.aStart.Row(), 337cdf0e10cSrcweir aBlock.aEnd.Col(), aBlock.aEnd.Row(), 338cdf0e10cSrcweir aBlock.aStart.Tab() ); 339cdf0e10cSrcweir VirtualDevice aVirtDev; 340cdf0e10cSrcweir aVirtDev.SetOutputSizePixel( aVirtDev.LogicToPixel( aMMRect.GetSize(), MAP_100TH_MM ) ); 341cdf0e10cSrcweir 342cdf0e10cSrcweir PaintToDev( &aVirtDev, pDoc, 1.0, aBlock, sal_False ); 343cdf0e10cSrcweir 344cdf0e10cSrcweir aVirtDev.SetMapMode( MapMode( MAP_PIXEL ) ); 345cdf0e10cSrcweir Bitmap aBmp = aVirtDev.GetBitmap( Point(), aVirtDev.GetOutputSize() ); 34645fd3b9aSArmin Le Grand bOK = SetBitmapEx( aBmp, rFlavor ); 347cdf0e10cSrcweir } 348cdf0e10cSrcweir else if ( nFormat == SOT_FORMAT_GDIMETAFILE ) 349cdf0e10cSrcweir { 350474a1d93SArmin Le Grand // #123405# Do not limit visual size calculation for metafile creation. 351474a1d93SArmin Le Grand // It seems unlikely that removing the limitation causes problems since 352474a1d93SArmin Le Grand // metafile creation means that no real pixel device in the needed size is 353474a1d93SArmin Le Grand // created. 354474a1d93SArmin Le Grand InitDocShell(false); 355474a1d93SArmin Le Grand 356cdf0e10cSrcweir SfxObjectShell* pEmbObj = aDocShellRef; 357cdf0e10cSrcweir 358cdf0e10cSrcweir // like SvEmbeddedTransfer::GetData: 359cdf0e10cSrcweir GDIMetaFile aMtf; 360cdf0e10cSrcweir VirtualDevice aVDev; 361cdf0e10cSrcweir MapMode aMapMode( pEmbObj->GetMapUnit() ); 362cdf0e10cSrcweir Rectangle aVisArea( pEmbObj->GetVisArea( ASPECT_CONTENT ) ); 363cdf0e10cSrcweir 364cdf0e10cSrcweir aVDev.EnableOutput( sal_False ); 365cdf0e10cSrcweir aVDev.SetMapMode( aMapMode ); 366cdf0e10cSrcweir aMtf.SetPrefSize( aVisArea.GetSize() ); 367cdf0e10cSrcweir aMtf.SetPrefMapMode( aMapMode ); 368cdf0e10cSrcweir aMtf.Record( &aVDev ); 369cdf0e10cSrcweir 370cdf0e10cSrcweir pEmbObj->DoDraw( &aVDev, Point(), aVisArea.GetSize(), JobSetup(), ASPECT_CONTENT ); 371cdf0e10cSrcweir 372cdf0e10cSrcweir aMtf.Stop(); 373cdf0e10cSrcweir aMtf.WindStart(); 374cdf0e10cSrcweir 375cdf0e10cSrcweir bOK = SetGDIMetaFile( aMtf, rFlavor ); 376cdf0e10cSrcweir } 377cdf0e10cSrcweir else if ( nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE ) 378cdf0e10cSrcweir { 379cdf0e10cSrcweir //TODO/LATER: differentiate between formats?! 380474a1d93SArmin Le Grand // #123405# Do limit visual size calculation to PageSize 381474a1d93SArmin Le Grand InitDocShell(true); // set aDocShellRef 382cdf0e10cSrcweir 383cdf0e10cSrcweir SfxObjectShell* pEmbObj = aDocShellRef; 384cdf0e10cSrcweir bOK = SetObject( pEmbObj, SCTRANS_TYPE_EMBOBJ, rFlavor ); 385cdf0e10cSrcweir } 386cdf0e10cSrcweir } 387cdf0e10cSrcweir return bOK; 388cdf0e10cSrcweir } 389cdf0e10cSrcweir 390cdf0e10cSrcweir sal_Bool ScTransferObj::WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, 391cdf0e10cSrcweir const datatransfer::DataFlavor& rFlavor ) 392cdf0e10cSrcweir { 393cdf0e10cSrcweir // called from SetObject, put data into stream 394cdf0e10cSrcweir 395cdf0e10cSrcweir sal_Bool bRet = sal_False; 396cdf0e10cSrcweir switch (nUserObjectId) 397cdf0e10cSrcweir { 398cdf0e10cSrcweir case SCTRANS_TYPE_IMPEX: 399cdf0e10cSrcweir { 400cdf0e10cSrcweir ScImportExport* pImpEx = (ScImportExport*)pUserObject; 401cdf0e10cSrcweir 402cdf0e10cSrcweir sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor ); 403cdf0e10cSrcweir // mba: no BaseURL for data exchange 404cdf0e10cSrcweir if ( pImpEx->ExportStream( *rxOStm, String(), nFormat ) ) 405cdf0e10cSrcweir bRet = ( rxOStm->GetError() == ERRCODE_NONE ); 406cdf0e10cSrcweir } 407cdf0e10cSrcweir break; 408cdf0e10cSrcweir 409cdf0e10cSrcweir case SCTRANS_TYPE_EDIT_RTF: 410cdf0e10cSrcweir case SCTRANS_TYPE_EDIT_BIN: 411cdf0e10cSrcweir { 412cdf0e10cSrcweir ScTabEditEngine* pEngine = (ScTabEditEngine*)pUserObject; 413cdf0e10cSrcweir if ( nUserObjectId == SCTRANS_TYPE_EDIT_RTF ) 414cdf0e10cSrcweir { 415cdf0e10cSrcweir pEngine->Write( *rxOStm, EE_FORMAT_RTF ); 416cdf0e10cSrcweir bRet = ( rxOStm->GetError() == ERRCODE_NONE ); 417cdf0e10cSrcweir } 418cdf0e10cSrcweir else 419cdf0e10cSrcweir { 420cdf0e10cSrcweir // #107722# can't use Write for EditEngine format because that would 421cdf0e10cSrcweir // write old format without support for unicode characters. 422cdf0e10cSrcweir // Get the data from the EditEngine's transferable instead. 423cdf0e10cSrcweir 424cdf0e10cSrcweir sal_uInt16 nParCnt = pEngine->GetParagraphCount(); 425cdf0e10cSrcweir if ( nParCnt == 0 ) 426cdf0e10cSrcweir nParCnt = 1; 427cdf0e10cSrcweir ESelection aSel( 0, 0, nParCnt-1, pEngine->GetTextLen(nParCnt-1) ); 428cdf0e10cSrcweir 429cdf0e10cSrcweir uno::Reference<datatransfer::XTransferable> xEditTrans = pEngine->CreateTransferable( aSel ); 430cdf0e10cSrcweir TransferableDataHelper aEditHelper( xEditTrans ); 431cdf0e10cSrcweir 432cdf0e10cSrcweir bRet = aEditHelper.GetSotStorageStream( rFlavor, rxOStm ); 433cdf0e10cSrcweir } 434cdf0e10cSrcweir } 435cdf0e10cSrcweir break; 436cdf0e10cSrcweir 437cdf0e10cSrcweir case SCTRANS_TYPE_EMBOBJ: 438cdf0e10cSrcweir { 439cdf0e10cSrcweir // TODO/MBA: testing 440cdf0e10cSrcweir SfxObjectShell* pEmbObj = (SfxObjectShell*) pUserObject; 441cdf0e10cSrcweir ::utl::TempFile aTempFile; 442cdf0e10cSrcweir aTempFile.EnableKillingFile(); 443cdf0e10cSrcweir uno::Reference< embed::XStorage > xWorkStore = 444cdf0e10cSrcweir ::comphelper::OStorageHelper::GetStorageFromURL( aTempFile.GetURL(), embed::ElementModes::READWRITE ); 445cdf0e10cSrcweir 446cdf0e10cSrcweir // write document storage 447cdf0e10cSrcweir pEmbObj->SetupStorage( xWorkStore, SOFFICE_FILEFORMAT_CURRENT, sal_False ); 448cdf0e10cSrcweir 449cdf0e10cSrcweir // mba: no relative ULRs for clipboard! 450cdf0e10cSrcweir SfxMedium aMedium( xWorkStore, String() ); 451cdf0e10cSrcweir bRet = pEmbObj->DoSaveObjectAs( aMedium, sal_False ); 452cdf0e10cSrcweir pEmbObj->DoSaveCompleted(); 453cdf0e10cSrcweir 454cdf0e10cSrcweir uno::Reference< embed::XTransactedObject > xTransact( xWorkStore, uno::UNO_QUERY ); 455cdf0e10cSrcweir if ( xTransact.is() ) 456cdf0e10cSrcweir xTransact->commit(); 457cdf0e10cSrcweir 458cdf0e10cSrcweir SvStream* pSrcStm = ::utl::UcbStreamHelper::CreateStream( aTempFile.GetURL(), STREAM_READ ); 459cdf0e10cSrcweir if( pSrcStm ) 460cdf0e10cSrcweir { 461cdf0e10cSrcweir rxOStm->SetBufferSize( 0xff00 ); 462cdf0e10cSrcweir *rxOStm << *pSrcStm; 463cdf0e10cSrcweir delete pSrcStm; 464cdf0e10cSrcweir } 465cdf0e10cSrcweir 466cdf0e10cSrcweir bRet = sal_True; 467cdf0e10cSrcweir 468cdf0e10cSrcweir xWorkStore->dispose(); 469cdf0e10cSrcweir xWorkStore = uno::Reference < embed::XStorage >(); 470cdf0e10cSrcweir rxOStm->Commit(); 471cdf0e10cSrcweir } 472cdf0e10cSrcweir break; 473cdf0e10cSrcweir 474cdf0e10cSrcweir default: 475cdf0e10cSrcweir DBG_ERROR("unknown object id"); 476cdf0e10cSrcweir } 477cdf0e10cSrcweir return bRet; 478cdf0e10cSrcweir } 479cdf0e10cSrcweir 480cdf0e10cSrcweir void ScTransferObj::ObjectReleased() 481cdf0e10cSrcweir { 482cdf0e10cSrcweir ScModule* pScMod = SC_MOD(); 483cdf0e10cSrcweir if ( pScMod->GetClipData().pCellClipboard == this ) 484cdf0e10cSrcweir pScMod->SetClipObject( NULL, NULL ); 485cdf0e10cSrcweir 486cdf0e10cSrcweir TransferableHelper::ObjectReleased(); 487cdf0e10cSrcweir } 488cdf0e10cSrcweir 489cdf0e10cSrcweir void ScTransferObj::DragFinished( sal_Int8 nDropAction ) 490cdf0e10cSrcweir { 491cdf0e10cSrcweir if ( nDropAction == DND_ACTION_MOVE && !bDragWasInternal && !(nDragSourceFlags & SC_DROP_NAVIGATOR) ) 492cdf0e10cSrcweir { 493cdf0e10cSrcweir // move: delete source data 494cdf0e10cSrcweir ScDocShell* pSourceSh = GetSourceDocShell(); 495cdf0e10cSrcweir if (pSourceSh) 496cdf0e10cSrcweir { 497cdf0e10cSrcweir ScMarkData aMarkData = GetSourceMarkData(); 498cdf0e10cSrcweir // external drag&drop doesn't copy objects, so they also aren't deleted: 499cdf0e10cSrcweir // #105703# bApi=sal_True, don't show error messages from drag&drop 500cdf0e10cSrcweir pSourceSh->GetDocFunc().DeleteContents( aMarkData, IDF_ALL & ~IDF_OBJECTS, sal_True, sal_True ); 501cdf0e10cSrcweir } 502cdf0e10cSrcweir } 503cdf0e10cSrcweir 504cdf0e10cSrcweir ScModule* pScMod = SC_MOD(); 505cdf0e10cSrcweir if ( pScMod->GetDragData().pCellTransfer == this ) 506cdf0e10cSrcweir pScMod->ResetDragObject(); 507cdf0e10cSrcweir 508cdf0e10cSrcweir xDragSourceRanges = NULL; // don't keep source after dropping 509cdf0e10cSrcweir 510cdf0e10cSrcweir TransferableHelper::DragFinished( nDropAction ); 511cdf0e10cSrcweir } 512cdf0e10cSrcweir 513cdf0e10cSrcweir void ScTransferObj::SetDragHandlePos( SCCOL nX, SCROW nY ) 514cdf0e10cSrcweir { 515cdf0e10cSrcweir nDragHandleX = nX; 516cdf0e10cSrcweir nDragHandleY = nY; 517cdf0e10cSrcweir } 518cdf0e10cSrcweir 519cdf0e10cSrcweir void ScTransferObj::SetVisibleTab( SCTAB nNew ) 520cdf0e10cSrcweir { 521cdf0e10cSrcweir nVisibleTab = nNew; 522cdf0e10cSrcweir } 523cdf0e10cSrcweir 524cdf0e10cSrcweir void ScTransferObj::SetDrawPersist( const SfxObjectShellRef& rRef ) 525cdf0e10cSrcweir { 526cdf0e10cSrcweir aDrawPersistRef = rRef; 527cdf0e10cSrcweir } 528cdf0e10cSrcweir 529cdf0e10cSrcweir void ScTransferObj::SetDragSource( ScDocShell* pSourceShell, const ScMarkData& rMark ) 530cdf0e10cSrcweir { 531cdf0e10cSrcweir ScRangeList aRanges; 532cdf0e10cSrcweir rMark.FillRangeListWithMarks( &aRanges, sal_False ); 533cdf0e10cSrcweir xDragSourceRanges = new ScCellRangesObj( pSourceShell, aRanges ); 534cdf0e10cSrcweir } 535cdf0e10cSrcweir 536cdf0e10cSrcweir void ScTransferObj::SetDragSourceFlags( sal_uInt16 nFlags ) 537cdf0e10cSrcweir { 538cdf0e10cSrcweir nDragSourceFlags = nFlags; 539cdf0e10cSrcweir } 540cdf0e10cSrcweir 541cdf0e10cSrcweir void ScTransferObj::SetDragWasInternal() 542cdf0e10cSrcweir { 543cdf0e10cSrcweir bDragWasInternal = sal_True; 544cdf0e10cSrcweir } 545cdf0e10cSrcweir 546cdf0e10cSrcweir void ScTransferObj::SetUseInApi( bool bSet ) 547cdf0e10cSrcweir { 548cdf0e10cSrcweir bUseInApi = bSet; 549cdf0e10cSrcweir } 550cdf0e10cSrcweir 551cdf0e10cSrcweir ScDocument* ScTransferObj::GetSourceDocument() 552cdf0e10cSrcweir { 553cdf0e10cSrcweir ScDocShell* pSourceDocSh = GetSourceDocShell(); 554cdf0e10cSrcweir if (pSourceDocSh) 555cdf0e10cSrcweir return pSourceDocSh->GetDocument(); 556cdf0e10cSrcweir return NULL; 557cdf0e10cSrcweir } 558cdf0e10cSrcweir 559cdf0e10cSrcweir ScDocShell* ScTransferObj::GetSourceDocShell() 560cdf0e10cSrcweir { 561cdf0e10cSrcweir ScCellRangesBase* pRangesObj = ScCellRangesBase::getImplementation( xDragSourceRanges ); 562cdf0e10cSrcweir if (pRangesObj) 563cdf0e10cSrcweir return pRangesObj->GetDocShell(); 564cdf0e10cSrcweir 565cdf0e10cSrcweir return NULL; // none set 566cdf0e10cSrcweir } 567cdf0e10cSrcweir 568cdf0e10cSrcweir ScMarkData ScTransferObj::GetSourceMarkData() 569cdf0e10cSrcweir { 570cdf0e10cSrcweir ScMarkData aMarkData; 571cdf0e10cSrcweir ScCellRangesBase* pRangesObj = ScCellRangesBase::getImplementation( xDragSourceRanges ); 572cdf0e10cSrcweir if (pRangesObj) 573cdf0e10cSrcweir { 574cdf0e10cSrcweir const ScRangeList& rRanges = pRangesObj->GetRangeList(); 575cdf0e10cSrcweir aMarkData.MarkFromRangeList( rRanges, sal_False ); 576cdf0e10cSrcweir } 577cdf0e10cSrcweir return aMarkData; 578cdf0e10cSrcweir } 579cdf0e10cSrcweir 580cdf0e10cSrcweir // 581cdf0e10cSrcweir // initialize aDocShellRef with a live document from the ClipDoc 582cdf0e10cSrcweir // 583474a1d93SArmin Le Grand // #123405# added parameter to allow size calculation without limitation 584474a1d93SArmin Le Grand // to PageSize, e.g. used for Metafile creation for clipboard. 585cdf0e10cSrcweir 586474a1d93SArmin Le Grand void ScTransferObj::InitDocShell(bool bLimitToPageSize) 587cdf0e10cSrcweir { 588cdf0e10cSrcweir if ( !aDocShellRef.Is() ) 589cdf0e10cSrcweir { 590cdf0e10cSrcweir ScDocShell* pDocSh = new ScDocShell; 591cdf0e10cSrcweir aDocShellRef = pDocSh; // ref must be there before InitNew 592cdf0e10cSrcweir 593cdf0e10cSrcweir pDocSh->DoInitNew(NULL); 594cdf0e10cSrcweir 595cdf0e10cSrcweir ScDocument* pDestDoc = pDocSh->GetDocument(); 596cdf0e10cSrcweir ScMarkData aDestMark; 597cdf0e10cSrcweir aDestMark.SelectTable( 0, sal_True ); 598cdf0e10cSrcweir 599cdf0e10cSrcweir pDestDoc->SetDocOptions( pDoc->GetDocOptions() ); // #i42666# 600cdf0e10cSrcweir 601cdf0e10cSrcweir String aTabName; 602cdf0e10cSrcweir pDoc->GetName( aBlock.aStart.Tab(), aTabName ); 603cdf0e10cSrcweir pDestDoc->RenameTab( 0, aTabName, sal_False ); // no UpdateRef (empty) 604cdf0e10cSrcweir 605cdf0e10cSrcweir pDestDoc->CopyStdStylesFrom( pDoc ); 606cdf0e10cSrcweir 607cdf0e10cSrcweir SCCOL nStartX = aBlock.aStart.Col(); 608cdf0e10cSrcweir SCROW nStartY = aBlock.aStart.Row(); 609cdf0e10cSrcweir SCCOL nEndX = aBlock.aEnd.Col(); 610cdf0e10cSrcweir SCROW nEndY = aBlock.aEnd.Row(); 611cdf0e10cSrcweir 612cdf0e10cSrcweir // widths / heights 613cdf0e10cSrcweir // (must be copied before CopyFromClip, for drawing objects) 614cdf0e10cSrcweir 615cdf0e10cSrcweir SCCOL nCol, nLastCol; 616cdf0e10cSrcweir SCTAB nSrcTab = aBlock.aStart.Tab(); 617cdf0e10cSrcweir pDestDoc->SetLayoutRTL(0, pDoc->IsLayoutRTL(nSrcTab)); 618cdf0e10cSrcweir for (nCol=nStartX; nCol<=nEndX; nCol++) 619cdf0e10cSrcweir if ( pDoc->ColHidden(nCol, nSrcTab, nLastCol) ) 620cdf0e10cSrcweir pDestDoc->ShowCol( nCol, 0, sal_False ); 621cdf0e10cSrcweir else 622cdf0e10cSrcweir pDestDoc->SetColWidth( nCol, 0, pDoc->GetColWidth( nCol, nSrcTab ) ); 623cdf0e10cSrcweir 624cdf0e10cSrcweir ScBitMaskCompressedArray< SCROW, sal_uInt8> & rDestRowFlags = 625cdf0e10cSrcweir pDestDoc->GetRowFlagsArrayModifiable(0); 626cdf0e10cSrcweir 627cdf0e10cSrcweir for (SCROW nRow = nStartY; nRow <= nEndY; ++nRow) 628cdf0e10cSrcweir { 629cdf0e10cSrcweir sal_uInt8 nSourceFlags = pDoc->GetRowFlags(nRow, nSrcTab); 630cdf0e10cSrcweir SCROW nLastRow = -1; 631cdf0e10cSrcweir if ( pDoc->RowHidden(nRow, nSrcTab, nLastRow) ) 632cdf0e10cSrcweir pDestDoc->ShowRow( nRow, 0, sal_False ); 633cdf0e10cSrcweir else 634cdf0e10cSrcweir { 635cdf0e10cSrcweir pDestDoc->SetRowHeight( nRow, 0, pDoc->GetOriginalHeight( nRow, nSrcTab ) ); 636cdf0e10cSrcweir 637cdf0e10cSrcweir // if height was set manually, that flag has to be copied, too 638cdf0e10cSrcweir if ( nSourceFlags & CR_MANUALSIZE ) 639cdf0e10cSrcweir rDestRowFlags.OrValue( nRow, CR_MANUALSIZE); 640cdf0e10cSrcweir } 641cdf0e10cSrcweir } 642cdf0e10cSrcweir 643cdf0e10cSrcweir if ( pDoc->GetDrawLayer() ) 644cdf0e10cSrcweir pDocSh->MakeDrawLayer(); 645cdf0e10cSrcweir 646cdf0e10cSrcweir // cell range is copied to the original position, but on the first sheet 647cdf0e10cSrcweir // -> bCutMode must be set 648cdf0e10cSrcweir // pDoc is always a Clipboard-document 649cdf0e10cSrcweir 650cdf0e10cSrcweir ScRange aDestRange( nStartX,nStartY,0, nEndX,nEndY,0 ); 651cdf0e10cSrcweir sal_Bool bWasCut = pDoc->IsCutMode(); 652cdf0e10cSrcweir if (!bWasCut) 653cdf0e10cSrcweir pDoc->SetClipArea( aDestRange, sal_True ); // Cut 654cdf0e10cSrcweir pDestDoc->CopyFromClip( aDestRange, aDestMark, IDF_ALL, NULL, pDoc, sal_False ); 655cdf0e10cSrcweir pDoc->SetClipArea( aDestRange, bWasCut ); 656cdf0e10cSrcweir 657cdf0e10cSrcweir StripRefs( pDoc, nStartX,nStartY, nEndX,nEndY, pDestDoc, 0,0 ); 658cdf0e10cSrcweir 659cdf0e10cSrcweir ScRange aMergeRange = aDestRange; 660cdf0e10cSrcweir pDestDoc->ExtendMerge( aMergeRange, sal_True ); 661cdf0e10cSrcweir 662cdf0e10cSrcweir pDoc->CopyDdeLinks( pDestDoc ); // copy values of DDE Links 663cdf0e10cSrcweir 664cdf0e10cSrcweir // page format (grid etc) and page size (maximum size for ole object) 665cdf0e10cSrcweir 666cdf0e10cSrcweir Size aPaperSize = SvxPaperInfo::GetPaperSize( PAPER_A4 ); // Twips 667cdf0e10cSrcweir ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); 668cdf0e10cSrcweir String aStyleName = pDoc->GetPageStyle( aBlock.aStart.Tab() ); 669cdf0e10cSrcweir SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName, SFX_STYLE_FAMILY_PAGE ); 670cdf0e10cSrcweir if (pStyleSheet) 671cdf0e10cSrcweir { 672cdf0e10cSrcweir const SfxItemSet& rSourceSet = pStyleSheet->GetItemSet(); 673cdf0e10cSrcweir aPaperSize = ((const SvxSizeItem&) rSourceSet.Get(ATTR_PAGE_SIZE)).GetSize(); 674cdf0e10cSrcweir 675cdf0e10cSrcweir // CopyStyleFrom kopiert SetItems mit richtigem Pool 676cdf0e10cSrcweir ScStyleSheetPool* pDestPool = pDestDoc->GetStyleSheetPool(); 677cdf0e10cSrcweir pDestPool->CopyStyleFrom( pStylePool, aStyleName, SFX_STYLE_FAMILY_PAGE ); 678cdf0e10cSrcweir } 679cdf0e10cSrcweir 680cdf0e10cSrcweir ScViewData aViewData( pDocSh, NULL ); 681cdf0e10cSrcweir aViewData.SetScreen( nStartX,nStartY, nEndX,nEndY ); 682cdf0e10cSrcweir aViewData.SetCurX( nStartX ); 683cdf0e10cSrcweir aViewData.SetCurY( nStartY ); 684cdf0e10cSrcweir 685cdf0e10cSrcweir pDestDoc->SetViewOptions( pDoc->GetViewOptions() ); 686cdf0e10cSrcweir 687cdf0e10cSrcweir // Size 688cdf0e10cSrcweir //! get while copying sizes 689cdf0e10cSrcweir 690cdf0e10cSrcweir long nPosX = 0; 691cdf0e10cSrcweir long nPosY = 0; 692cdf0e10cSrcweir 693cdf0e10cSrcweir for (nCol=0; nCol<nStartX; nCol++) 694cdf0e10cSrcweir nPosX += pDestDoc->GetColWidth( nCol, 0 ); 695cdf0e10cSrcweir nPosY += pDestDoc->GetRowHeight( 0, nStartY-1, 0 ); 696cdf0e10cSrcweir nPosX = (long) ( nPosX * HMM_PER_TWIPS ); 697cdf0e10cSrcweir nPosY = (long) ( nPosY * HMM_PER_TWIPS ); 698cdf0e10cSrcweir 699cdf0e10cSrcweir 700cdf0e10cSrcweir aPaperSize.Width() *= 2; // limit OLE object to double of page size 701cdf0e10cSrcweir aPaperSize.Height() *= 2; 702cdf0e10cSrcweir 703cdf0e10cSrcweir long nSizeX = 0; 704cdf0e10cSrcweir long nSizeY = 0; 705cdf0e10cSrcweir for (nCol=nStartX; nCol<=nEndX; nCol++) 706cdf0e10cSrcweir { 707cdf0e10cSrcweir long nAdd = pDestDoc->GetColWidth( nCol, 0 ); 708474a1d93SArmin Le Grand if ( bLimitToPageSize && nSizeX+nAdd > aPaperSize.Width() && nSizeX ) // above limit? 709cdf0e10cSrcweir break; 710cdf0e10cSrcweir nSizeX += nAdd; 711cdf0e10cSrcweir } 712cdf0e10cSrcweir for (SCROW nRow=nStartY; nRow<=nEndY; nRow++) 713cdf0e10cSrcweir { 714cdf0e10cSrcweir long nAdd = pDestDoc->GetRowHeight( nRow, 0 ); 715474a1d93SArmin Le Grand if ( bLimitToPageSize && nSizeY+nAdd > aPaperSize.Height() && nSizeY ) // above limit? 716cdf0e10cSrcweir break; 717cdf0e10cSrcweir nSizeY += nAdd; 718cdf0e10cSrcweir } 719cdf0e10cSrcweir nSizeX = (long) ( nSizeX * HMM_PER_TWIPS ); 720cdf0e10cSrcweir nSizeY = (long) ( nSizeY * HMM_PER_TWIPS ); 721cdf0e10cSrcweir 722cdf0e10cSrcweir // pDocSh->SetVisAreaSize( Size(nSizeX,nSizeY) ); 723cdf0e10cSrcweir 724cdf0e10cSrcweir Rectangle aNewArea( Point(nPosX,nPosY), Size(nSizeX,nSizeY) ); 725cdf0e10cSrcweir //TODO/LATER: why twice?! 726cdf0e10cSrcweir //pDocSh->SvInPlaceObject::SetVisArea( aNewArea ); 727cdf0e10cSrcweir pDocSh->SetVisArea( aNewArea ); 728cdf0e10cSrcweir 729cdf0e10cSrcweir pDocSh->UpdateOle(&aViewData, sal_True); 730cdf0e10cSrcweir 731cdf0e10cSrcweir //! SetDocumentModified? 732cdf0e10cSrcweir if ( pDestDoc->IsChartListenerCollectionNeedsUpdate() ) 733cdf0e10cSrcweir pDestDoc->UpdateChartListenerCollection(); 734cdf0e10cSrcweir } 735cdf0e10cSrcweir } 736cdf0e10cSrcweir 737cdf0e10cSrcweir // static 738cdf0e10cSrcweir SfxObjectShell* ScTransferObj::SetDrawClipDoc( sal_Bool bAnyOle ) 739cdf0e10cSrcweir { 740cdf0e10cSrcweir // update ScGlobal::pDrawClipDocShellRef 741cdf0e10cSrcweir 742cdf0e10cSrcweir delete ScGlobal::pDrawClipDocShellRef; 743cdf0e10cSrcweir if (bAnyOle) 744cdf0e10cSrcweir { 745cdf0e10cSrcweir ScGlobal::pDrawClipDocShellRef = 746cdf0e10cSrcweir new ScDocShellRef(new ScDocShell(SFX_CREATE_MODE_INTERNAL)); // there must be a ref 747cdf0e10cSrcweir (*ScGlobal::pDrawClipDocShellRef)->DoInitNew(NULL); 748cdf0e10cSrcweir return *ScGlobal::pDrawClipDocShellRef; 749cdf0e10cSrcweir } 750cdf0e10cSrcweir else 751cdf0e10cSrcweir { 752cdf0e10cSrcweir ScGlobal::pDrawClipDocShellRef = NULL; 753cdf0e10cSrcweir return NULL; 754cdf0e10cSrcweir } 755cdf0e10cSrcweir } 756cdf0e10cSrcweir 757cdf0e10cSrcweir // static 758cdf0e10cSrcweir void ScTransferObj::StripRefs( ScDocument* pDoc, 759cdf0e10cSrcweir SCCOL nStartX, SCROW nStartY, SCCOL nEndX, SCROW nEndY, 760cdf0e10cSrcweir ScDocument* pDestDoc, SCCOL nSubX, SCROW nSubY ) 761cdf0e10cSrcweir { 762cdf0e10cSrcweir if (!pDestDoc) 763cdf0e10cSrcweir { 764cdf0e10cSrcweir pDestDoc = pDoc; 765cdf0e10cSrcweir DBG_ASSERT(nSubX==0&&nSubY==0, "can't move within the document"); 766cdf0e10cSrcweir } 767cdf0e10cSrcweir 768cdf0e10cSrcweir // In a clipboard doc the data don't have to be on the first sheet 769cdf0e10cSrcweir 770cdf0e10cSrcweir SCTAB nSrcTab = 0; 771cdf0e10cSrcweir while (nSrcTab<MAXTAB && !pDoc->HasTable(nSrcTab)) 772cdf0e10cSrcweir ++nSrcTab; 773cdf0e10cSrcweir SCTAB nDestTab = 0; 774cdf0e10cSrcweir while (nDestTab<MAXTAB && !pDestDoc->HasTable(nDestTab)) 775cdf0e10cSrcweir ++nDestTab; 776cdf0e10cSrcweir 777cdf0e10cSrcweir if (!pDoc->HasTable(nSrcTab) || !pDestDoc->HasTable(nDestTab)) 778cdf0e10cSrcweir { 779cdf0e10cSrcweir DBG_ERROR("Sheet not found in ScTransferObj::StripRefs"); 780cdf0e10cSrcweir return; 781cdf0e10cSrcweir } 782cdf0e10cSrcweir 783cdf0e10cSrcweir SvNumberFormatter* pFormatter = pDoc->GetFormatTable(); 784cdf0e10cSrcweir ScRange aRef; 785cdf0e10cSrcweir 786cdf0e10cSrcweir ScCellIterator aIter( pDoc, nStartX, nStartY, nSrcTab, nEndX, nEndY, nSrcTab ); 787cdf0e10cSrcweir ScBaseCell* pCell = aIter.GetFirst(); 788cdf0e10cSrcweir while (pCell) 789cdf0e10cSrcweir { 790cdf0e10cSrcweir if (pCell->GetCellType() == CELLTYPE_FORMULA) 791cdf0e10cSrcweir { 792cdf0e10cSrcweir ScFormulaCell* pFCell = (ScFormulaCell*) pCell; 793cdf0e10cSrcweir sal_Bool bOut = sal_False; 794cdf0e10cSrcweir ScDetectiveRefIter aRefIter( pFCell ); 795cdf0e10cSrcweir while ( !bOut && aRefIter.GetNextRef( aRef ) ) 796cdf0e10cSrcweir { 797cdf0e10cSrcweir if ( aRef.aStart.Tab() != nSrcTab || aRef.aEnd.Tab() != nSrcTab || 798cdf0e10cSrcweir aRef.aStart.Col() < nStartX || aRef.aEnd.Col() > nEndX || 799cdf0e10cSrcweir aRef.aStart.Row() < nStartY || aRef.aEnd.Row() > nEndY ) 800cdf0e10cSrcweir bOut = sal_True; 801cdf0e10cSrcweir } 802cdf0e10cSrcweir if (bOut) 803cdf0e10cSrcweir { 804cdf0e10cSrcweir SCCOL nCol = aIter.GetCol() - nSubX; 805cdf0e10cSrcweir SCROW nRow = aIter.GetRow() - nSubY; 806cdf0e10cSrcweir 807cdf0e10cSrcweir ScBaseCell* pNew = 0; 808cdf0e10cSrcweir sal_uInt16 nErrCode = pFCell->GetErrCode(); 809cdf0e10cSrcweir if (nErrCode) 810cdf0e10cSrcweir { 811cdf0e10cSrcweir pNew = new ScStringCell( ScGlobal::GetErrorString(nErrCode) ); 812cdf0e10cSrcweir if ( ((const SvxHorJustifyItem*) pDestDoc->GetAttr( 813cdf0e10cSrcweir nCol,nRow,nDestTab, ATTR_HOR_JUSTIFY))->GetValue() == 814cdf0e10cSrcweir SVX_HOR_JUSTIFY_STANDARD ) 815cdf0e10cSrcweir pDestDoc->ApplyAttr( nCol,nRow,nDestTab, 816cdf0e10cSrcweir SvxHorJustifyItem(SVX_HOR_JUSTIFY_RIGHT, ATTR_HOR_JUSTIFY) ); 817cdf0e10cSrcweir } 818cdf0e10cSrcweir else if (pFCell->IsValue()) 819cdf0e10cSrcweir { 820cdf0e10cSrcweir double fVal = pFCell->GetValue(); 821cdf0e10cSrcweir pNew = new ScValueCell( fVal ); 822cdf0e10cSrcweir } 823cdf0e10cSrcweir else 824cdf0e10cSrcweir { 825cdf0e10cSrcweir String aStr; 826cdf0e10cSrcweir pFCell->GetString(aStr); 827cdf0e10cSrcweir if ( pFCell->IsMultilineResult() ) 828cdf0e10cSrcweir pNew = new ScEditCell( aStr, pDestDoc ); 829cdf0e10cSrcweir else 830cdf0e10cSrcweir pNew = new ScStringCell( aStr ); 831cdf0e10cSrcweir } 832cdf0e10cSrcweir pDestDoc->PutCell( nCol,nRow,nDestTab, pNew ); 833cdf0e10cSrcweir 834cdf0e10cSrcweir // number formats 835cdf0e10cSrcweir 836cdf0e10cSrcweir sal_uLong nOldFormat = ((const SfxUInt32Item*) 837cdf0e10cSrcweir pDestDoc->GetAttr(nCol,nRow,nDestTab, ATTR_VALUE_FORMAT))->GetValue(); 838cdf0e10cSrcweir if ( (nOldFormat % SV_COUNTRY_LANGUAGE_OFFSET) == 0 ) 839cdf0e10cSrcweir { 840cdf0e10cSrcweir sal_uLong nNewFormat = pFCell->GetStandardFormat( *pFormatter, 841cdf0e10cSrcweir nOldFormat ); 842cdf0e10cSrcweir pDestDoc->ApplyAttr( nCol,nRow,nDestTab, 843cdf0e10cSrcweir SfxUInt32Item(ATTR_VALUE_FORMAT, nNewFormat) ); 844cdf0e10cSrcweir } 845cdf0e10cSrcweir } 846cdf0e10cSrcweir } 847cdf0e10cSrcweir pCell = aIter.GetNext(); 848cdf0e10cSrcweir } 849cdf0e10cSrcweir } 850cdf0e10cSrcweir 851cdf0e10cSrcweir const com::sun::star::uno::Sequence< sal_Int8 >& ScTransferObj::getUnoTunnelId() 852cdf0e10cSrcweir { 853cdf0e10cSrcweir static com::sun::star::uno::Sequence< sal_Int8 > aSeq; 854cdf0e10cSrcweir if( !aSeq.getLength() ) 855cdf0e10cSrcweir { 856cdf0e10cSrcweir static osl::Mutex aCreateMutex; 857cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( aCreateMutex ); 858cdf0e10cSrcweir aSeq.realloc( 16 ); 859cdf0e10cSrcweir rtl_createUuid( reinterpret_cast< sal_uInt8* >( aSeq.getArray() ), 0, sal_True ); 860cdf0e10cSrcweir } 861cdf0e10cSrcweir return aSeq; 862cdf0e10cSrcweir } 863cdf0e10cSrcweir 864cdf0e10cSrcweir sal_Int64 SAL_CALL ScTransferObj::getSomething( const com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw( com::sun::star::uno::RuntimeException ) 865cdf0e10cSrcweir { 866cdf0e10cSrcweir sal_Int64 nRet; 867cdf0e10cSrcweir if( ( rId.getLength() == 16 ) && 868cdf0e10cSrcweir ( 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) ) ) 869cdf0e10cSrcweir { 870cdf0e10cSrcweir nRet = reinterpret_cast< sal_Int64 >( this ); 871cdf0e10cSrcweir } 872cdf0e10cSrcweir else 873cdf0e10cSrcweir nRet = TransferableHelper::getSomething(rId); 874cdf0e10cSrcweir return nRet; 875cdf0e10cSrcweir } 876cdf0e10cSrcweir 877cdf0e10cSrcweir 878