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