xref: /aoo4110/main/sw/source/ui/dochdl/swdtflvr.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_sw.hxx"
26*b1cdbd2cSJim Jagielski #ifdef PRECOMPILED
27*b1cdbd2cSJim Jagielski #include "ui_pch.hxx"
28*b1cdbd2cSJim Jagielski #endif
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XVisualObject.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XTransactedObject.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/Aspects.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XEmbedObjectClipboardCreator.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <svtools/embedtransfer.hxx>
38*b1cdbd2cSJim Jagielski #include <svtools/insdlg.hxx>
39*b1cdbd2cSJim Jagielski #include <unotools/tempfile.hxx>
40*b1cdbd2cSJim Jagielski #include <comphelper/storagehelper.hxx>
41*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
42*b1cdbd2cSJim Jagielski #include <unotools/ucbstreamhelper.hxx>
43*b1cdbd2cSJim Jagielski #include <sot/filelist.hxx>
44*b1cdbd2cSJim Jagielski #include <svx/svxdlg.hxx>
45*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx>
46*b1cdbd2cSJim Jagielski #include <osl/endian.h>
47*b1cdbd2cSJim Jagielski #include <sfx2/linkmgr.hxx>
48*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
49*b1cdbd2cSJim Jagielski #include <vcl/wrkwin.hxx>
50*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
51*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
52*b1cdbd2cSJim Jagielski #include <svl/stritem.hxx>
53*b1cdbd2cSJim Jagielski #include <svtools/imap.hxx>
54*b1cdbd2cSJim Jagielski #include <sot/storage.hxx>
55*b1cdbd2cSJim Jagielski #include <vcl/graph.hxx>
56*b1cdbd2cSJim Jagielski #include <svl/urihelper.hxx>
57*b1cdbd2cSJim Jagielski #include <svx/svdmodel.hxx>
58*b1cdbd2cSJim Jagielski #include <svx/xexch.hxx>
59*b1cdbd2cSJim Jagielski #include <svx/xmlexchg.hxx>
60*b1cdbd2cSJim Jagielski #include <svx/dbaexchange.hxx>
61*b1cdbd2cSJim Jagielski #include <svx/clipfmtitem.hxx>
62*b1cdbd2cSJim Jagielski #include <sfx2/mieclip.hxx>
63*b1cdbd2cSJim Jagielski #include <svx/svdetc.hxx>
64*b1cdbd2cSJim Jagielski #include <svx/xoutbmp.hxx>
65*b1cdbd2cSJim Jagielski #include <svl/urlbmk.hxx>
66*b1cdbd2cSJim Jagielski #include <svtools/htmlout.hxx>
67*b1cdbd2cSJim Jagielski #include <svx/hlnkitem.hxx>
68*b1cdbd2cSJim Jagielski #include <svtools/inetimg.hxx>
69*b1cdbd2cSJim Jagielski #include <editeng/paperinf.hxx>
70*b1cdbd2cSJim Jagielski #include <svx/fmview.hxx>
71*b1cdbd2cSJim Jagielski #include <editeng/scripttypeitem.hxx>
72*b1cdbd2cSJim Jagielski #include <sfx2/docfilt.hxx>
73*b1cdbd2cSJim Jagielski #include <svtools/imapobj.hxx>
74*b1cdbd2cSJim Jagielski #include <sfx2/docfile.hxx>
75*b1cdbd2cSJim Jagielski #include <unotools/transliterationwrapper.hxx>
76*b1cdbd2cSJim Jagielski #include <unotools/streamwrap.hxx>
77*b1cdbd2cSJim Jagielski #include <svtools/filter.hxx>
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski #include <svx/unomodel.hxx>
80*b1cdbd2cSJim Jagielski #include <fmturl.hxx>
81*b1cdbd2cSJim Jagielski #include <fmtinfmt.hxx>
82*b1cdbd2cSJim Jagielski #include <fmtfsize.hxx>
83*b1cdbd2cSJim Jagielski #include <swdtflvr.hxx>
84*b1cdbd2cSJim Jagielski #include <shellio.hxx>
85*b1cdbd2cSJim Jagielski #include <ddefld.hxx>
86*b1cdbd2cSJim Jagielski #include <doc.hxx>
87*b1cdbd2cSJim Jagielski #include <IDocumentUndoRedo.hxx>
88*b1cdbd2cSJim Jagielski #include <pagedesc.hxx>
89*b1cdbd2cSJim Jagielski #include <IMark.hxx>
90*b1cdbd2cSJim Jagielski #include <bookmrk.hxx>
91*b1cdbd2cSJim Jagielski #include <docary.hxx>
92*b1cdbd2cSJim Jagielski #include <section.hxx>
93*b1cdbd2cSJim Jagielski #include <ndtxt.hxx>
94*b1cdbd2cSJim Jagielski #include <edtwin.hxx>
95*b1cdbd2cSJim Jagielski #include <navicont.hxx>
96*b1cdbd2cSJim Jagielski #include <swcont.hxx>
97*b1cdbd2cSJim Jagielski #include <wrtsh.hxx>
98*b1cdbd2cSJim Jagielski #include <swmodule.hxx>
99*b1cdbd2cSJim Jagielski #include <view.hxx>
100*b1cdbd2cSJim Jagielski #include <docsh.hxx>
101*b1cdbd2cSJim Jagielski #include <wdocsh.hxx>
102*b1cdbd2cSJim Jagielski #include <fldbas.hxx>		//DDE
103*b1cdbd2cSJim Jagielski #include <swundo.hxx>		// fuer Undo-Ids
104*b1cdbd2cSJim Jagielski #include <pam.hxx>
105*b1cdbd2cSJim Jagielski #include <ndole.hxx>
106*b1cdbd2cSJim Jagielski #include <swwait.hxx>
107*b1cdbd2cSJim Jagielski #include <viewopt.hxx>
108*b1cdbd2cSJim Jagielski #include <swunodef.hxx>
109*b1cdbd2cSJim Jagielski #include <vcl/sound.hxx>
110*b1cdbd2cSJim Jagielski #include <swerror.h>
111*b1cdbd2cSJim Jagielski #include <SwCapObjType.hxx>
112*b1cdbd2cSJim Jagielski #include <cmdid.h>
113*b1cdbd2cSJim Jagielski #include <dochdl.hrc>
114*b1cdbd2cSJim Jagielski #include <comcore.hrc> // #111827#
115*b1cdbd2cSJim Jagielski #include <sot/stg.hxx>
116*b1cdbd2cSJim Jagielski #include <svx/svditer.hxx>
117*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
118*b1cdbd2cSJim Jagielski #include <editeng/fhgtitem.hxx>
119*b1cdbd2cSJim Jagielski #include <svx/svdpage.hxx>
120*b1cdbd2cSJim Jagielski #include <avmedia/mediawindow.hxx>
121*b1cdbd2cSJim Jagielski #include <swcrsr.hxx>
122*b1cdbd2cSJim Jagielski #include <SwRewriter.hxx>
123*b1cdbd2cSJim Jagielski #include <globals.hrc>
124*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
125*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
126*b1cdbd2cSJim Jagielski #include <swserv.hxx>
127*b1cdbd2cSJim Jagielski #include <switerator.hxx>
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski extern sal_Bool bFrmDrag;
130*b1cdbd2cSJim Jagielski extern sal_Bool bDDINetAttr;
131*b1cdbd2cSJim Jagielski extern sal_Bool bExecuteDrag;
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski #define OLESIZE	11905 - 2 * lMinBorder, 6 * MM50
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski #define SWTRANSFER_OBJECTTYPE_DRAWMODEL			0x00000001
137*b1cdbd2cSJim Jagielski #define SWTRANSFER_OBJECTTYPE_HTML              0x00000002
138*b1cdbd2cSJim Jagielski #define SWTRANSFER_OBJECTTYPE_RTF				0x00000004
139*b1cdbd2cSJim Jagielski #define SWTRANSFER_OBJECTTYPE_STRING			0x00000008
140*b1cdbd2cSJim Jagielski #define SWTRANSFER_OBJECTTYPE_SWOLE				0x00000010
141*b1cdbd2cSJim Jagielski #define SWTRANSFER_OBJECTTYPE_DDE				0x00000020
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski #define SWTRANSFER_GRAPHIC_INSERTED             0x00000040
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski using namespace ::svx;
146*b1cdbd2cSJim Jagielski using ::rtl::OUString;
147*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
148*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
149*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::datatransfer;
150*b1cdbd2cSJim Jagielski using namespace nsTransferBufferType;
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski #define DDE_TXT_ENCODING 	gsl_getSystemTextEncoding()
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski class SwTrnsfrDdeLink : public ::sfx2::SvBaseLink
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski 	String sName;
157*b1cdbd2cSJim Jagielski     ::sfx2::SvLinkSourceRef refObj;
158*b1cdbd2cSJim Jagielski 	SwTransferable& rTrnsfr;
159*b1cdbd2cSJim Jagielski 	SwDocShell* pDocShell;
160*b1cdbd2cSJim Jagielski 	sal_uLong nOldTimeOut;
161*b1cdbd2cSJim Jagielski 	sal_Bool bDelBookmrk : 1;
162*b1cdbd2cSJim Jagielski 	sal_Bool bInDisconnect : 1;
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 	sal_Bool FindDocShell();
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski     using sfx2::SvBaseLink::Disconnect;
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski protected:
169*b1cdbd2cSJim Jagielski 	virtual ~SwTrnsfrDdeLink();
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski public:
172*b1cdbd2cSJim Jagielski 	SwTrnsfrDdeLink( SwTransferable& rTrans, SwWrtShell& rSh );
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 	virtual void DataChanged( const String& rMimeType,
175*b1cdbd2cSJim Jagielski                               const uno::Any & rValue );
176*b1cdbd2cSJim Jagielski 	virtual void Closed();
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 	sal_Bool WriteData( SvStream& rStrm );
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 	void Disconnect( sal_Bool bRemoveDataAdvise );
181*b1cdbd2cSJim Jagielski };
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski // helper class for Action and Undo enclosing
184*b1cdbd2cSJim Jagielski class SwTrnsfrActionAndUndo
185*b1cdbd2cSJim Jagielski {
186*b1cdbd2cSJim Jagielski 	SwWrtShell *pSh;
187*b1cdbd2cSJim Jagielski     SwUndoId eUndoId;
188*b1cdbd2cSJim Jagielski public:
SwTrnsfrActionAndUndo(SwWrtShell * pS,SwUndoId nId,const SwRewriter * pRewriter=0,sal_Bool bDelSel=sal_False)189*b1cdbd2cSJim Jagielski     SwTrnsfrActionAndUndo( SwWrtShell *pS, SwUndoId nId,
190*b1cdbd2cSJim Jagielski                            const SwRewriter * pRewriter = 0,
191*b1cdbd2cSJim Jagielski                            sal_Bool bDelSel = sal_False)
192*b1cdbd2cSJim Jagielski         : pSh( pS ), eUndoId( nId )
193*b1cdbd2cSJim Jagielski 	{
194*b1cdbd2cSJim Jagielski         pSh->StartUndo( eUndoId, pRewriter );
195*b1cdbd2cSJim Jagielski 		if( bDelSel )
196*b1cdbd2cSJim Jagielski 			pSh->DelRight();
197*b1cdbd2cSJim Jagielski 		pSh->StartAllAction();
198*b1cdbd2cSJim Jagielski 	}
~SwTrnsfrActionAndUndo()199*b1cdbd2cSJim Jagielski 	~SwTrnsfrActionAndUndo()
200*b1cdbd2cSJim Jagielski 	{
201*b1cdbd2cSJim Jagielski         pSh->EndUndo();
202*b1cdbd2cSJim Jagielski 		pSh->EndAllAction();
203*b1cdbd2cSJim Jagielski 	}
204*b1cdbd2cSJim Jagielski };
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
208*b1cdbd2cSJim Jagielski 
SwTransferable(SwWrtShell & rSh)209*b1cdbd2cSJim Jagielski SwTransferable::SwTransferable( SwWrtShell& rSh )
210*b1cdbd2cSJim Jagielski 	: pWrtShell( &rSh ),
211*b1cdbd2cSJim Jagielski 	pCreatorView( 0 ),
212*b1cdbd2cSJim Jagielski 	pClpDocFac( 0 ),
213*b1cdbd2cSJim Jagielski 	pClpGraphic( 0 ),
214*b1cdbd2cSJim Jagielski 	pClpBitmap( 0 ),
215*b1cdbd2cSJim Jagielski 	pOrigGrf( 0 ),
216*b1cdbd2cSJim Jagielski 	pBkmk( 0 ),
217*b1cdbd2cSJim Jagielski 	pImageMap( 0 ),
218*b1cdbd2cSJim Jagielski 	pTargetURL( 0 ),
219*b1cdbd2cSJim Jagielski 	eBufferType( TRNSFR_NONE )
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski     rSh.GetView().AddTransferable(*this);
222*b1cdbd2cSJim Jagielski     SwDocShell* pDShell = rSh.GetDoc()->GetDocShell();
223*b1cdbd2cSJim Jagielski 	if( pDShell )
224*b1cdbd2cSJim Jagielski 	{
225*b1cdbd2cSJim Jagielski 		pDShell->FillTransferableObjectDescriptor( aObjDesc );
226*b1cdbd2cSJim Jagielski 		if( pDShell->GetMedium() )
227*b1cdbd2cSJim Jagielski 		{
228*b1cdbd2cSJim Jagielski 			const INetURLObject& rURLObj = pDShell->GetMedium()->GetURLObject();
229*b1cdbd2cSJim Jagielski 			aObjDesc.maDisplayName = URIHelper::removePassword(
230*b1cdbd2cSJim Jagielski 								rURLObj.GetMainURL( INetURLObject::NO_DECODE ),
231*b1cdbd2cSJim Jagielski 								INetURLObject::WAS_ENCODED,
232*b1cdbd2cSJim Jagielski 			   					INetURLObject::DECODE_UNAMBIGUOUS );
233*b1cdbd2cSJim Jagielski 		}
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski         PrepareOLE( aObjDesc );
236*b1cdbd2cSJim Jagielski 	}
237*b1cdbd2cSJim Jagielski }
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
240*b1cdbd2cSJim Jagielski 
~SwTransferable()241*b1cdbd2cSJim Jagielski SwTransferable::~SwTransferable()
242*b1cdbd2cSJim Jagielski {
243*b1cdbd2cSJim Jagielski     Application::GetSolarMutex().acquire();
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 	// der DDELink braucht noch die WrtShell!
246*b1cdbd2cSJim Jagielski 	if( refDdeLink.Is() )
247*b1cdbd2cSJim Jagielski 	{
248*b1cdbd2cSJim Jagielski 		((SwTrnsfrDdeLink*)&refDdeLink)->Disconnect( sal_True );
249*b1cdbd2cSJim Jagielski 		refDdeLink.Clear();
250*b1cdbd2cSJim Jagielski 	}
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 	pWrtShell = 0;
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski     // dvo 2002-05-30, #99239#: release reference to the document so that
255*b1cdbd2cSJim Jagielski     // aDocShellRef will delete it (if aDocShellRef is set). Otherwise, the OLE
256*b1cdbd2cSJim Jagielski     // nodes keep references to their sub-storage when the storage is already
257*b1cdbd2cSJim Jagielski     // dead.
258*b1cdbd2cSJim Jagielski 	delete pClpDocFac;
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski 	//JP 22.04.95: erst schliessen, dann kann die Ref. auch gecleared werden,
261*b1cdbd2cSJim Jagielski 	//				so das die DocShell auch tatsaechlich geloescht wird!
262*b1cdbd2cSJim Jagielski 	if( aDocShellRef.Is() )
263*b1cdbd2cSJim Jagielski 	{
264*b1cdbd2cSJim Jagielski         SfxObjectShell * pObj = aDocShellRef;
265*b1cdbd2cSJim Jagielski 		SwDocShell* pDocSh = (SwDocShell*)pObj;
266*b1cdbd2cSJim Jagielski 		pDocSh->DoClose();
267*b1cdbd2cSJim Jagielski 	}
268*b1cdbd2cSJim Jagielski 	aDocShellRef.Clear();
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski 	SwModule* pMod = SW_MOD();
271*b1cdbd2cSJim Jagielski     if(pMod)
272*b1cdbd2cSJim Jagielski     {
273*b1cdbd2cSJim Jagielski         if ( pMod->pDragDrop == this )
274*b1cdbd2cSJim Jagielski             pMod->pDragDrop = 0;
275*b1cdbd2cSJim Jagielski         else if ( pMod->pXSelection == this )
276*b1cdbd2cSJim Jagielski             pMod->pXSelection = 0;
277*b1cdbd2cSJim Jagielski     }
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski 	delete pClpGraphic;
280*b1cdbd2cSJim Jagielski 	delete pClpBitmap;
281*b1cdbd2cSJim Jagielski 	delete pImageMap;
282*b1cdbd2cSJim Jagielski 	delete pTargetURL;
283*b1cdbd2cSJim Jagielski 	delete pBkmk;
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski 	eBufferType = TRNSFR_NONE;
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski     Application::GetSolarMutex().release();
289*b1cdbd2cSJim Jagielski }
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
292*b1cdbd2cSJim Jagielski 
lcl_GetDoc(SwDocFac & rDocFac)293*b1cdbd2cSJim Jagielski static SwDoc * lcl_GetDoc(SwDocFac & rDocFac)
294*b1cdbd2cSJim Jagielski {
295*b1cdbd2cSJim Jagielski     SwDoc *const pDoc = rDocFac.GetDoc();
296*b1cdbd2cSJim Jagielski     ASSERT( pDoc, "Document not found" );
297*b1cdbd2cSJim Jagielski     if (pDoc)
298*b1cdbd2cSJim Jagielski     {
299*b1cdbd2cSJim Jagielski         pDoc->SetClipBoard( true );
300*b1cdbd2cSJim Jagielski     }
301*b1cdbd2cSJim Jagielski     return pDoc;
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
305*b1cdbd2cSJim Jagielski 
ObjectReleased()306*b1cdbd2cSJim Jagielski void SwTransferable::ObjectReleased()
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski 	SwModule *pMod = SW_MOD();
309*b1cdbd2cSJim Jagielski 	if( this == pMod->pDragDrop )
310*b1cdbd2cSJim Jagielski 		pMod->pDragDrop = 0;
311*b1cdbd2cSJim Jagielski 	else if( this == pMod->pXSelection )
312*b1cdbd2cSJim Jagielski 		pMod->pXSelection = 0;
313*b1cdbd2cSJim Jagielski }
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
316*b1cdbd2cSJim Jagielski 
AddSupportedFormats()317*b1cdbd2cSJim Jagielski void SwTransferable::AddSupportedFormats()
318*b1cdbd2cSJim Jagielski {
319*b1cdbd2cSJim Jagielski 	// only need if we are the current XSelection Object
320*b1cdbd2cSJim Jagielski 	SwModule *pMod = SW_MOD();
321*b1cdbd2cSJim Jagielski 	if( this == pMod->pXSelection )
322*b1cdbd2cSJim Jagielski 	{
323*b1cdbd2cSJim Jagielski 		SetDataForDragAndDrop( Point( 0,0) );
324*b1cdbd2cSJim Jagielski 	}
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
328*b1cdbd2cSJim Jagielski 
InitOle(SfxObjectShell * pDoc,SwDoc & rDoc)329*b1cdbd2cSJim Jagielski void SwTransferable::InitOle( SfxObjectShell* pDoc, SwDoc& rDoc )
330*b1cdbd2cSJim Jagielski {
331*b1cdbd2cSJim Jagielski 	//OleVisArea einstellen. Linke obere Ecke der Seite und Groesse
332*b1cdbd2cSJim Jagielski 	//der RealSize in Twips.
333*b1cdbd2cSJim Jagielski 	const Size aSz( OLESIZE );
334*b1cdbd2cSJim Jagielski 	SwRect aVis( Point( DOCUMENTBORDER, DOCUMENTBORDER ), aSz );
335*b1cdbd2cSJim Jagielski     pDoc->SetVisArea( aVis.SVRect() );
336*b1cdbd2cSJim Jagielski 	rDoc.set(IDocumentSettingAccess::BROWSE_MODE, true );
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
340*b1cdbd2cSJim Jagielski 
FindOLEObj(sal_Int64 & nAspect) const341*b1cdbd2cSJim Jagielski uno::Reference < embed::XEmbeddedObject > SwTransferable::FindOLEObj( sal_Int64& nAspect ) const
342*b1cdbd2cSJim Jagielski {
343*b1cdbd2cSJim Jagielski     uno::Reference < embed::XEmbeddedObject > xObj;
344*b1cdbd2cSJim Jagielski 	if( pClpDocFac )
345*b1cdbd2cSJim Jagielski 	{
346*b1cdbd2cSJim Jagielski 		SwIterator<SwCntntNode,SwFmtColl> aIter( *pClpDocFac->GetDoc()->GetDfltGrfFmtColl() );
347*b1cdbd2cSJim Jagielski 		for( SwCntntNode* pNd = aIter.First(); pNd; pNd = aIter.Next() )
348*b1cdbd2cSJim Jagielski 			if( ND_OLENODE == pNd->GetNodeType() )
349*b1cdbd2cSJim Jagielski 			{
350*b1cdbd2cSJim Jagielski                 xObj = ((SwOLENode*)pNd)->GetOLEObj().GetOleRef();
351*b1cdbd2cSJim Jagielski 				nAspect = ((SwOLENode*)pNd)->GetAspect();
352*b1cdbd2cSJim Jagielski 				break;
353*b1cdbd2cSJim Jagielski 			}
354*b1cdbd2cSJim Jagielski 	}
355*b1cdbd2cSJim Jagielski     return xObj;
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
359*b1cdbd2cSJim Jagielski 
FindOLEReplacementGraphic() const360*b1cdbd2cSJim Jagielski Graphic* SwTransferable::FindOLEReplacementGraphic() const
361*b1cdbd2cSJim Jagielski {
362*b1cdbd2cSJim Jagielski 	if( pClpDocFac )
363*b1cdbd2cSJim Jagielski 	{
364*b1cdbd2cSJim Jagielski 		SwIterator<SwCntntNode,SwFmtColl> aIter( *pClpDocFac->GetDoc()->GetDfltGrfFmtColl() );
365*b1cdbd2cSJim Jagielski 		for( SwCntntNode* pNd = aIter.First(); pNd; pNd = aIter.Next() )
366*b1cdbd2cSJim Jagielski 			if( ND_OLENODE == pNd->GetNodeType() )
367*b1cdbd2cSJim Jagielski 			{
368*b1cdbd2cSJim Jagielski                 return ((SwOLENode*)pNd)->GetGraphic();
369*b1cdbd2cSJim Jagielski 			}
370*b1cdbd2cSJim Jagielski 	}
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski     return NULL;
373*b1cdbd2cSJim Jagielski }
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
377*b1cdbd2cSJim Jagielski 
RemoveDDELinkFormat(const Window & rWin)378*b1cdbd2cSJim Jagielski void SwTransferable::RemoveDDELinkFormat( const Window& rWin )
379*b1cdbd2cSJim Jagielski {
380*b1cdbd2cSJim Jagielski 	RemoveFormat( SOT_FORMATSTR_ID_LINK );
381*b1cdbd2cSJim Jagielski 	CopyToClipboard( (Window*)&rWin );
382*b1cdbd2cSJim Jagielski }
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
385*b1cdbd2cSJim Jagielski 
GetData(const DATA_FLAVOR & rFlavor)386*b1cdbd2cSJim Jagielski sal_Bool SwTransferable::GetData( const DATA_FLAVOR& rFlavor )
387*b1cdbd2cSJim Jagielski {
388*b1cdbd2cSJim Jagielski 	sal_uInt32	nFormat = SotExchange::GetFormat( rFlavor );
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski     // we can only fullfil the request if
391*b1cdbd2cSJim Jagielski     // 1) we have data for this format
392*b1cdbd2cSJim Jagielski     // 2) we have either a clipboard document (pClpDocFac), or
393*b1cdbd2cSJim Jagielski     //    we have a SwWrtShell (so we can generate a new clipboard document)
394*b1cdbd2cSJim Jagielski     if( !HasFormat( nFormat ) || ( pClpDocFac == NULL && pWrtShell == NULL ) )
395*b1cdbd2cSJim Jagielski 		return sal_False;
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski 	if( !pClpDocFac )
398*b1cdbd2cSJim Jagielski 	{
399*b1cdbd2cSJim Jagielski         SelectionType nSelectionType = pWrtShell->GetSelectionType();
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski         // when pending we will not get the correct type, but nsSelectionType::SEL_TXT
402*b1cdbd2cSJim Jagielski         // as fallback. This *happens* durning D&D, so we need to check if we are in
403*b1cdbd2cSJim Jagielski         // the fallback and just try to get a graphic
404*b1cdbd2cSJim Jagielski         const bool bPending(pWrtShell->BasicActionPend());
405*b1cdbd2cSJim Jagielski 
406*b1cdbd2cSJim Jagielski         // SEL_GRF kommt vom ContentType der editsh
407*b1cdbd2cSJim Jagielski 		if(bPending || ((nsSelectionType::SEL_GRF | nsSelectionType::SEL_DRW_FORM) & nSelectionType))
408*b1cdbd2cSJim Jagielski 		{
409*b1cdbd2cSJim Jagielski 			pClpGraphic = new Graphic;
410*b1cdbd2cSJim Jagielski 			if( !pWrtShell->GetDrawObjGraphic( FORMAT_GDIMETAFILE, *pClpGraphic ))
411*b1cdbd2cSJim Jagielski 				pOrigGrf = pClpGraphic;
412*b1cdbd2cSJim Jagielski 			pClpBitmap = new Graphic;
413*b1cdbd2cSJim Jagielski 			if( !pWrtShell->GetDrawObjGraphic( FORMAT_BITMAP, *pClpBitmap ))
414*b1cdbd2cSJim Jagielski 				pOrigGrf = pClpBitmap;
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski 			// ist es ein URL-Button ?
417*b1cdbd2cSJim Jagielski 			String sURL, sDesc;
418*b1cdbd2cSJim Jagielski 			if( pWrtShell->GetURLFromButton( sURL, sDesc ) )
419*b1cdbd2cSJim Jagielski 			{
420*b1cdbd2cSJim Jagielski 				pBkmk = new INetBookmark( sURL, sDesc );
421*b1cdbd2cSJim Jagielski 				eBufferType = TRNSFR_INETFLD;
422*b1cdbd2cSJim Jagielski 			}
423*b1cdbd2cSJim Jagielski 		}
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski 		pClpDocFac = new SwDocFac;
426*b1cdbd2cSJim Jagielski         SwDoc *const pTmpDoc = lcl_GetDoc(*pClpDocFac);
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski 		pTmpDoc->LockExpFlds(); 	// nie die Felder updaten - Text so belassen
429*b1cdbd2cSJim Jagielski 		pWrtShell->Copy( pTmpDoc );
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 		// es wurde in der CORE eine neu angelegt (OLE-Objekte kopiert!)
432*b1cdbd2cSJim Jagielski         aDocShellRef = pTmpDoc->GetTmpDocShell();
433*b1cdbd2cSJim Jagielski 		if( aDocShellRef.Is() )
434*b1cdbd2cSJim Jagielski 			SwTransferable::InitOle( aDocShellRef, *pTmpDoc );
435*b1cdbd2cSJim Jagielski 		pTmpDoc->SetTmpDocShell( (SfxObjectShell*)NULL );
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski 		if( nSelectionType & nsSelectionType::SEL_TXT && !pWrtShell->HasMark() )
438*b1cdbd2cSJim Jagielski 		{
439*b1cdbd2cSJim Jagielski 			SwContentAtPos aCntntAtPos( SwContentAtPos::SW_INETATTR );
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski 			Point aPos( SwEditWin::GetDDStartPosX(), SwEditWin::GetDDStartPosY());
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski 			sal_Bool bSelect = bExecuteDrag &&
444*b1cdbd2cSJim Jagielski 							pWrtShell->GetView().GetDocShell() &&
445*b1cdbd2cSJim Jagielski 							!pWrtShell->GetView().GetDocShell()->IsReadOnly();
446*b1cdbd2cSJim Jagielski 			if( pWrtShell->GetContentAtPos( aPos, aCntntAtPos, bSelect ) )
447*b1cdbd2cSJim Jagielski 			{
448*b1cdbd2cSJim Jagielski 				pBkmk = new INetBookmark(
449*b1cdbd2cSJim Jagielski 						((SwFmtINetFmt*)aCntntAtPos.aFnd.pAttr)->GetValue(),
450*b1cdbd2cSJim Jagielski 						aCntntAtPos.sStr );
451*b1cdbd2cSJim Jagielski 				eBufferType = TRNSFR_INETFLD;
452*b1cdbd2cSJim Jagielski 				if( bSelect )
453*b1cdbd2cSJim Jagielski 					pWrtShell->SelectTxtAttr( RES_TXTATR_INETFMT );
454*b1cdbd2cSJim Jagielski 			}
455*b1cdbd2cSJim Jagielski 		}
456*b1cdbd2cSJim Jagielski 		if( pWrtShell->IsFrmSelected() )
457*b1cdbd2cSJim Jagielski 		{
458*b1cdbd2cSJim Jagielski 		 	SfxItemSet aSet( pWrtShell->GetAttrPool(), RES_URL, RES_URL );
459*b1cdbd2cSJim Jagielski 			pWrtShell->GetFlyFrmAttr( aSet );
460*b1cdbd2cSJim Jagielski 			const SwFmtURL& rURL = (SwFmtURL&)aSet.Get( RES_URL );
461*b1cdbd2cSJim Jagielski 			if( rURL.GetMap() )
462*b1cdbd2cSJim Jagielski 				pImageMap = new ImageMap( *rURL.GetMap() );
463*b1cdbd2cSJim Jagielski 			else if( rURL.GetURL().Len() )
464*b1cdbd2cSJim Jagielski 				pTargetURL = new INetImage( aEmptyStr, rURL.GetURL(),
465*b1cdbd2cSJim Jagielski 											rURL.GetTargetFrameName(),
466*b1cdbd2cSJim Jagielski 											aEmptyStr, Size() );
467*b1cdbd2cSJim Jagielski 		}
468*b1cdbd2cSJim Jagielski 	}
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski 	sal_Bool	bOK = sal_False;
471*b1cdbd2cSJim Jagielski 	if( TRNSFR_OLE == eBufferType )
472*b1cdbd2cSJim Jagielski 	{
473*b1cdbd2cSJim Jagielski         //TODO/MBA: testing - is this the "single OLE object" case?!
474*b1cdbd2cSJim Jagielski 		// aus dem ClipDoc das OLE-Object besorgen und von dem die Daten
475*b1cdbd2cSJim Jagielski 		// besorgen.
476*b1cdbd2cSJim Jagielski 		sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT; // will be set in the next statement
477*b1cdbd2cSJim Jagielski         uno::Reference < embed::XEmbeddedObject > xObj = FindOLEObj( nAspect );
478*b1cdbd2cSJim Jagielski 		Graphic* pOLEGraph = FindOLEReplacementGraphic();
479*b1cdbd2cSJim Jagielski         if( xObj.is() )
480*b1cdbd2cSJim Jagielski 		{
481*b1cdbd2cSJim Jagielski             TransferableDataHelper aD( new SvEmbedTransferHelper( xObj, pOLEGraph, nAspect ) );
482*b1cdbd2cSJim Jagielski             uno::Any aAny( aD.GetAny( rFlavor ));
483*b1cdbd2cSJim Jagielski 			if( aAny.hasValue() )
484*b1cdbd2cSJim Jagielski 				bOK = SetAny( aAny, rFlavor );
485*b1cdbd2cSJim Jagielski 		}
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 		// the following solution will be used in the case when the object can not generate the image
488*b1cdbd2cSJim Jagielski 		// TODO/LATER: in future the transferhelper must probably be created based on object and the replacement stream
489*b1cdbd2cSJim Jagielski 		if ( nFormat == SOT_FORMAT_GDIMETAFILE )
490*b1cdbd2cSJim Jagielski 		{
491*b1cdbd2cSJim Jagielski 			pOLEGraph = FindOLEReplacementGraphic();
492*b1cdbd2cSJim Jagielski 			if ( pOLEGraph )
493*b1cdbd2cSJim Jagielski 				bOK = SetGDIMetaFile( pOLEGraph->GetGDIMetaFile(), rFlavor );
494*b1cdbd2cSJim Jagielski 		}
495*b1cdbd2cSJim Jagielski 	}
496*b1cdbd2cSJim Jagielski 	else
497*b1cdbd2cSJim Jagielski 	{
498*b1cdbd2cSJim Jagielski 		switch( nFormat )
499*b1cdbd2cSJim Jagielski 		{
500*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_LINK:
501*b1cdbd2cSJim Jagielski 			if( refDdeLink.Is() )
502*b1cdbd2cSJim Jagielski 				bOK = SetObject( &refDdeLink,
503*b1cdbd2cSJim Jagielski 									SWTRANSFER_OBJECTTYPE_DDE, rFlavor );
504*b1cdbd2cSJim Jagielski 			break;
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_OBJECTDESCRIPTOR:
507*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_LINKSRCDESCRIPTOR:
508*b1cdbd2cSJim Jagielski 			bOK = SetTransferableObjectDescriptor( aObjDesc, rFlavor );
509*b1cdbd2cSJim Jagielski 			break;
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_DRAWING:
512*b1cdbd2cSJim Jagielski 			{
513*b1cdbd2cSJim Jagielski                 SwDoc *const pDoc = lcl_GetDoc(*pClpDocFac);
514*b1cdbd2cSJim Jagielski 				bOK = SetObject( pDoc->GetDrawModel(),
515*b1cdbd2cSJim Jagielski 								SWTRANSFER_OBJECTTYPE_DRAWMODEL, rFlavor );
516*b1cdbd2cSJim Jagielski 			}
517*b1cdbd2cSJim Jagielski 			break;
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski 		case SOT_FORMAT_STRING:
520*b1cdbd2cSJim Jagielski         {
521*b1cdbd2cSJim Jagielski             SwDoc *const pDoc = lcl_GetDoc(*pClpDocFac);
522*b1cdbd2cSJim Jagielski             bOK = SetObject( pDoc, SWTRANSFER_OBJECTTYPE_STRING, rFlavor );
523*b1cdbd2cSJim Jagielski         }
524*b1cdbd2cSJim Jagielski         break;
525*b1cdbd2cSJim Jagielski 		case SOT_FORMAT_RTF:
526*b1cdbd2cSJim Jagielski         {
527*b1cdbd2cSJim Jagielski             SwDoc *const pDoc = lcl_GetDoc(*pClpDocFac);
528*b1cdbd2cSJim Jagielski             bOK = SetObject( pDoc, SWTRANSFER_OBJECTTYPE_RTF, rFlavor );
529*b1cdbd2cSJim Jagielski         }
530*b1cdbd2cSJim Jagielski 			break;
531*b1cdbd2cSJim Jagielski 
532*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_HTML:
533*b1cdbd2cSJim Jagielski         {
534*b1cdbd2cSJim Jagielski             SwDoc *const pDoc = lcl_GetDoc(*pClpDocFac);
535*b1cdbd2cSJim Jagielski             bOK = SetObject( pDoc, SWTRANSFER_OBJECTTYPE_HTML, rFlavor );
536*b1cdbd2cSJim Jagielski         }
537*b1cdbd2cSJim Jagielski 			break;
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_SVXB:
540*b1cdbd2cSJim Jagielski 			if( eBufferType & TRNSFR_GRAPHIC && pOrigGrf )
541*b1cdbd2cSJim Jagielski 				bOK = SetGraphic( *pOrigGrf, rFlavor );
542*b1cdbd2cSJim Jagielski 			break;
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski 		case SOT_FORMAT_GDIMETAFILE:
545*b1cdbd2cSJim Jagielski 			if( eBufferType & TRNSFR_GRAPHIC )
546*b1cdbd2cSJim Jagielski 				bOK = SetGDIMetaFile( pClpGraphic->GetGDIMetaFile(), rFlavor );
547*b1cdbd2cSJim Jagielski 			break;
548*b1cdbd2cSJim Jagielski 		case SOT_FORMAT_BITMAP:
549*b1cdbd2cSJim Jagielski         case SOT_FORMATSTR_ID_PNG:
550*b1cdbd2cSJim Jagielski             // #126398#  Neither pClpBitmap nor pClpGraphic are necessarily set
551*b1cdbd2cSJim Jagielski             if( (eBufferType & TRNSFR_GRAPHIC) && (pClpBitmap != 0 || pClpGraphic != 0))
552*b1cdbd2cSJim Jagielski 				bOK = SetBitmapEx( (pClpBitmap ? pClpBitmap : pClpGraphic)->GetBitmapEx(), rFlavor );
553*b1cdbd2cSJim Jagielski 			break;
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_SVIM:
556*b1cdbd2cSJim Jagielski 			if( pImageMap )
557*b1cdbd2cSJim Jagielski 				bOK = SetImageMap( *pImageMap, rFlavor );
558*b1cdbd2cSJim Jagielski 			break;
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_INET_IMAGE:
561*b1cdbd2cSJim Jagielski 			if( pTargetURL )
562*b1cdbd2cSJim Jagielski 				bOK = SetINetImage( *pTargetURL, rFlavor );
563*b1cdbd2cSJim Jagielski 			break;
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_SOLK:
566*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK:
567*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR:
568*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_FILECONTENT:
569*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR:
570*b1cdbd2cSJim Jagielski 		case SOT_FORMAT_FILE:
571*b1cdbd2cSJim Jagielski 			if( (TRNSFR_INETFLD & eBufferType) && pBkmk )
572*b1cdbd2cSJim Jagielski 				bOK = SetINetBookmark( *pBkmk, rFlavor );
573*b1cdbd2cSJim Jagielski 			break;
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski 		case SOT_FORMATSTR_ID_EMBED_SOURCE:
576*b1cdbd2cSJim Jagielski //		default:
577*b1cdbd2cSJim Jagielski 			if( !aDocShellRef.Is() )
578*b1cdbd2cSJim Jagielski 			{
579*b1cdbd2cSJim Jagielski                 SwDoc *const pDoc = lcl_GetDoc(*pClpDocFac);
580*b1cdbd2cSJim Jagielski 				SwDocShell* pNewDocSh = new SwDocShell( pDoc,
581*b1cdbd2cSJim Jagielski 										 SFX_CREATE_MODE_EMBEDDED );
582*b1cdbd2cSJim Jagielski 				aDocShellRef = pNewDocSh;
583*b1cdbd2cSJim Jagielski 				aDocShellRef->DoInitNew( NULL );
584*b1cdbd2cSJim Jagielski 				SwTransferable::InitOle( aDocShellRef, *pDoc );
585*b1cdbd2cSJim Jagielski 			}
586*b1cdbd2cSJim Jagielski 			bOK = SetObject( &aDocShellRef, SWTRANSFER_OBJECTTYPE_SWOLE,
587*b1cdbd2cSJim Jagielski 							rFlavor );
588*b1cdbd2cSJim Jagielski 			break;
589*b1cdbd2cSJim Jagielski 		}
590*b1cdbd2cSJim Jagielski 	}
591*b1cdbd2cSJim Jagielski 	return bOK;
592*b1cdbd2cSJim Jagielski }
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
595*b1cdbd2cSJim Jagielski 
WriteObject(SotStorageStreamRef & xStream,void * pObject,sal_uInt32 nObjectType,const DATA_FLAVOR &)596*b1cdbd2cSJim Jagielski sal_Bool SwTransferable::WriteObject( SotStorageStreamRef& xStream,
597*b1cdbd2cSJim Jagielski 									void* pObject, sal_uInt32 nObjectType,
598*b1cdbd2cSJim Jagielski 									const DATA_FLAVOR& /*rFlavor*/ )
599*b1cdbd2cSJim Jagielski {
600*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
601*b1cdbd2cSJim Jagielski 	WriterRef xWrt;
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 	switch( nObjectType )
604*b1cdbd2cSJim Jagielski 	{
605*b1cdbd2cSJim Jagielski 	case SWTRANSFER_OBJECTTYPE_DRAWMODEL:
606*b1cdbd2cSJim Jagielski 		{
607*b1cdbd2cSJim Jagielski 			//JP 28.02.2001: dont change the sequence of commands - Bug 8
608*b1cdbd2cSJim Jagielski 			SdrModel *pModel = (SdrModel*)pObject;
609*b1cdbd2cSJim Jagielski 			xStream->SetBufferSize( 16348 );
610*b1cdbd2cSJim Jagielski 
611*b1cdbd2cSJim Jagielski 			// #108584#
612*b1cdbd2cSJim Jagielski 			// for the changed pool defaults from drawing layer pool set those
613*b1cdbd2cSJim Jagielski 			// attributes as hard attributes to preserve them for saving
614*b1cdbd2cSJim Jagielski 			const SfxItemPool& rItemPool = pModel->GetItemPool();
615*b1cdbd2cSJim Jagielski 			const SvxFontHeightItem& rDefaultFontHeight = (const SvxFontHeightItem&)rItemPool.GetDefaultItem(EE_CHAR_FONTHEIGHT);
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski 			// SW should have no MasterPages
618*b1cdbd2cSJim Jagielski 			DBG_ASSERT(0L == pModel->GetMasterPageCount(), "SW with MasterPages (!)");
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski 			for(sal_uInt16 a(0); a < pModel->GetPageCount(); a++)
621*b1cdbd2cSJim Jagielski 			{
622*b1cdbd2cSJim Jagielski 				const SdrPage* pPage = pModel->GetPage(a);
623*b1cdbd2cSJim Jagielski 				SdrObjListIter aIter(*pPage, IM_DEEPNOGROUPS);
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski 				while(aIter.IsMore())
626*b1cdbd2cSJim Jagielski 				{
627*b1cdbd2cSJim Jagielski 					SdrObject* pObj = aIter.Next();
628*b1cdbd2cSJim Jagielski 					const SvxFontHeightItem& rItem = (const SvxFontHeightItem&)pObj->GetMergedItem(EE_CHAR_FONTHEIGHT);
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski 					if(rItem.GetHeight() == rDefaultFontHeight.GetHeight())
631*b1cdbd2cSJim Jagielski 					{
632*b1cdbd2cSJim Jagielski 						pObj->SetMergedItem(rDefaultFontHeight);
633*b1cdbd2cSJim Jagielski 					}
634*b1cdbd2cSJim Jagielski 				}
635*b1cdbd2cSJim Jagielski 			}
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski 			{
638*b1cdbd2cSJim Jagielski                 uno::Reference<io::XOutputStream> xDocOut( new utl::OOutputStreamWrapper( *xStream ) );
639*b1cdbd2cSJim Jagielski 				if( SvxDrawingLayerExport( pModel, xDocOut ) )
640*b1cdbd2cSJim Jagielski 					xStream->Commit();
641*b1cdbd2cSJim Jagielski 			}
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski 			bRet = ERRCODE_NONE == xStream->GetError();
644*b1cdbd2cSJim Jagielski 		}
645*b1cdbd2cSJim Jagielski 		break;
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski 	case SWTRANSFER_OBJECTTYPE_SWOLE:
648*b1cdbd2cSJim Jagielski 		{
649*b1cdbd2cSJim Jagielski             SfxObjectShell*   pEmbObj = (SfxObjectShell*) pObject;
650*b1cdbd2cSJim Jagielski             try
651*b1cdbd2cSJim Jagielski             {
652*b1cdbd2cSJim Jagielski                 ::utl::TempFile     aTempFile;
653*b1cdbd2cSJim Jagielski                 aTempFile.EnableKillingFile();
654*b1cdbd2cSJim Jagielski                 uno::Reference< embed::XStorage > xWorkStore =
655*b1cdbd2cSJim Jagielski                     ::comphelper::OStorageHelper::GetStorageFromURL( aTempFile.GetURL(), embed::ElementModes::READWRITE );
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski                 // write document storage
658*b1cdbd2cSJim Jagielski                 pEmbObj->SetupStorage( xWorkStore, SOFFICE_FILEFORMAT_CURRENT, sal_False );
659*b1cdbd2cSJim Jagielski                 // mba: no BaseURL for clipboard
660*b1cdbd2cSJim Jagielski                 SfxMedium aMedium( xWorkStore, String() );
661*b1cdbd2cSJim Jagielski                 bRet = pEmbObj->DoSaveObjectAs( aMedium, sal_False );
662*b1cdbd2cSJim Jagielski                 pEmbObj->DoSaveCompleted();
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski                 uno::Reference< embed::XTransactedObject > xTransact( xWorkStore, uno::UNO_QUERY );
665*b1cdbd2cSJim Jagielski                 if ( xTransact.is() )
666*b1cdbd2cSJim Jagielski                     xTransact->commit();
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski                 SvStream* pSrcStm = ::utl::UcbStreamHelper::CreateStream( aTempFile.GetURL(), STREAM_READ );
669*b1cdbd2cSJim Jagielski                 if( pSrcStm )
670*b1cdbd2cSJim Jagielski                 {
671*b1cdbd2cSJim Jagielski                     xStream->SetBufferSize( 0xff00 );
672*b1cdbd2cSJim Jagielski                     *xStream << *pSrcStm;
673*b1cdbd2cSJim Jagielski                     delete pSrcStm;
674*b1cdbd2cSJim Jagielski                 }
675*b1cdbd2cSJim Jagielski 
676*b1cdbd2cSJim Jagielski                 bRet = sal_True;
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski                 xWorkStore->dispose();
679*b1cdbd2cSJim Jagielski                 xWorkStore = uno::Reference < embed::XStorage >();
680*b1cdbd2cSJim Jagielski                 xStream->Commit();
681*b1cdbd2cSJim Jagielski             }
682*b1cdbd2cSJim Jagielski             catch ( uno::Exception& )
683*b1cdbd2cSJim Jagielski             {}
684*b1cdbd2cSJim Jagielski 
685*b1cdbd2cSJim Jagielski             bRet = ( xStream->GetError() == ERRCODE_NONE );
686*b1cdbd2cSJim Jagielski 		}
687*b1cdbd2cSJim Jagielski 		break;
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski 
690*b1cdbd2cSJim Jagielski 	case SWTRANSFER_OBJECTTYPE_DDE:
691*b1cdbd2cSJim Jagielski 		{
692*b1cdbd2cSJim Jagielski 			xStream->SetBufferSize( 1024 );
693*b1cdbd2cSJim Jagielski 			SwTrnsfrDdeLink* pDdeLnk = (SwTrnsfrDdeLink*)pObject;
694*b1cdbd2cSJim Jagielski 			if( pDdeLnk->WriteData( *xStream ) )
695*b1cdbd2cSJim Jagielski 			{
696*b1cdbd2cSJim Jagielski 				xStream->Commit();
697*b1cdbd2cSJim Jagielski 				bRet = ERRCODE_NONE == xStream->GetError();
698*b1cdbd2cSJim Jagielski 			}
699*b1cdbd2cSJim Jagielski 		}
700*b1cdbd2cSJim Jagielski 		break;
701*b1cdbd2cSJim Jagielski 
702*b1cdbd2cSJim Jagielski 	case SWTRANSFER_OBJECTTYPE_HTML:
703*b1cdbd2cSJim Jagielski         GetHTMLWriter( aEmptyStr, String(), xWrt );
704*b1cdbd2cSJim Jagielski 		break;
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski 	case SWTRANSFER_OBJECTTYPE_RTF:
707*b1cdbd2cSJim Jagielski         GetRTFWriter( aEmptyStr, String(), xWrt );
708*b1cdbd2cSJim Jagielski 		break;
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski 	case SWTRANSFER_OBJECTTYPE_STRING:
711*b1cdbd2cSJim Jagielski         GetASCWriter( aEmptyStr, String(), xWrt );
712*b1cdbd2cSJim Jagielski 		if( xWrt.Is() )
713*b1cdbd2cSJim Jagielski 		{
714*b1cdbd2cSJim Jagielski 			SwAsciiOptions aAOpt;
715*b1cdbd2cSJim Jagielski 			aAOpt.SetCharSet( RTL_TEXTENCODING_UTF8 );
716*b1cdbd2cSJim Jagielski 			xWrt->SetAsciiOptions( aAOpt );
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski             // #102841# no start char for clipboard
719*b1cdbd2cSJim Jagielski             xWrt->bUCS2_WithStartChar = sal_False;
720*b1cdbd2cSJim Jagielski 		}
721*b1cdbd2cSJim Jagielski 		break;
722*b1cdbd2cSJim Jagielski 	}
723*b1cdbd2cSJim Jagielski 
724*b1cdbd2cSJim Jagielski 	if( xWrt.Is() )
725*b1cdbd2cSJim Jagielski 	{
726*b1cdbd2cSJim Jagielski 		SwDoc* pDoc = (SwDoc*)pObject;
727*b1cdbd2cSJim Jagielski 		xWrt->bWriteClipboardDoc = sal_True;
728*b1cdbd2cSJim Jagielski 		xWrt->bWriteOnlyFirstTable = 0 != (TRNSFR_TABELLE & eBufferType);
729*b1cdbd2cSJim Jagielski 		xWrt->SetShowProgress( sal_False );
730*b1cdbd2cSJim Jagielski 		SwWriter aWrt( *xStream, *pDoc );
731*b1cdbd2cSJim Jagielski 		if( !IsError( aWrt.Write( xWrt )) )
732*b1cdbd2cSJim Jagielski 		{
733*b1cdbd2cSJim Jagielski 			*xStream << '\0'; 				// terminate with a zero
734*b1cdbd2cSJim Jagielski 			xStream->Commit();
735*b1cdbd2cSJim Jagielski 			bRet = sal_True;
736*b1cdbd2cSJim Jagielski 		}
737*b1cdbd2cSJim Jagielski 	}
738*b1cdbd2cSJim Jagielski 
739*b1cdbd2cSJim Jagielski 	return bRet;
740*b1cdbd2cSJim Jagielski }
741*b1cdbd2cSJim Jagielski 
742*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
743*b1cdbd2cSJim Jagielski 
Cut()744*b1cdbd2cSJim Jagielski int SwTransferable::Cut()
745*b1cdbd2cSJim Jagielski {
746*b1cdbd2cSJim Jagielski 	int nRet = Copy( sal_True );
747*b1cdbd2cSJim Jagielski 	if( nRet )
748*b1cdbd2cSJim Jagielski 		DeleteSelection();
749*b1cdbd2cSJim Jagielski 	return nRet;
750*b1cdbd2cSJim Jagielski }
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
753*b1cdbd2cSJim Jagielski 
DeleteSelection()754*b1cdbd2cSJim Jagielski void SwTransferable::DeleteSelection()
755*b1cdbd2cSJim Jagielski {
756*b1cdbd2cSJim Jagielski     if(!pWrtShell)
757*b1cdbd2cSJim Jagielski         return;
758*b1cdbd2cSJim Jagielski     // Selektionsart vor Action-Klammerung erfragen
759*b1cdbd2cSJim Jagielski 	const int nSelection = pWrtShell->GetSelectionType();
760*b1cdbd2cSJim Jagielski 	pWrtShell->StartUndo( UNDO_DELETE );
761*b1cdbd2cSJim Jagielski 	if( ( nsSelectionType::SEL_TXT | nsSelectionType::SEL_TBL ) & nSelection )
762*b1cdbd2cSJim Jagielski 		pWrtShell->IntelligentCut( nSelection );
763*b1cdbd2cSJim Jagielski 	pWrtShell->DelRight();
764*b1cdbd2cSJim Jagielski 	pWrtShell->EndUndo( UNDO_DELETE );
765*b1cdbd2cSJim Jagielski }
766*b1cdbd2cSJim Jagielski 
767*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
768*b1cdbd2cSJim Jagielski 
PrepareForCopy(sal_Bool bIsCut)769*b1cdbd2cSJim Jagielski int SwTransferable::PrepareForCopy( sal_Bool bIsCut )
770*b1cdbd2cSJim Jagielski {
771*b1cdbd2cSJim Jagielski 	int nRet = 1;
772*b1cdbd2cSJim Jagielski     if(!pWrtShell)
773*b1cdbd2cSJim Jagielski         return 0;;
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 	String sGrfNm;
776*b1cdbd2cSJim Jagielski 	const int nSelection = pWrtShell->GetSelectionType();
777*b1cdbd2cSJim Jagielski 	if( nSelection == nsSelectionType::SEL_GRF )
778*b1cdbd2cSJim Jagielski 	{
779*b1cdbd2cSJim Jagielski 		pClpGraphic = new Graphic;
780*b1cdbd2cSJim Jagielski 		if( !pWrtShell->GetDrawObjGraphic( FORMAT_GDIMETAFILE, *pClpGraphic ))
781*b1cdbd2cSJim Jagielski 			pOrigGrf = pClpGraphic;
782*b1cdbd2cSJim Jagielski 		pClpBitmap = new Graphic;
783*b1cdbd2cSJim Jagielski 		if( !pWrtShell->GetDrawObjGraphic( FORMAT_BITMAP, *pClpBitmap ))
784*b1cdbd2cSJim Jagielski 			pOrigGrf = pClpBitmap;
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski 		pClpDocFac = new SwDocFac;
787*b1cdbd2cSJim Jagielski         SwDoc *const pDoc = lcl_GetDoc(*pClpDocFac);
788*b1cdbd2cSJim Jagielski         pWrtShell->Copy( pDoc );
789*b1cdbd2cSJim Jagielski 
790*b1cdbd2cSJim Jagielski         if (pOrigGrf && !pOrigGrf->GetBitmap().IsEmpty())
791*b1cdbd2cSJim Jagielski 		  AddFormat( SOT_FORMATSTR_ID_SVXB );
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski         PrepareOLE( aObjDesc );
794*b1cdbd2cSJim Jagielski 		AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR );
795*b1cdbd2cSJim Jagielski 
796*b1cdbd2cSJim Jagielski         // --> OD 2005-02-09 #119353# - robust
797*b1cdbd2cSJim Jagielski         const Graphic* pGrf = pWrtShell->GetGraphic();
798*b1cdbd2cSJim Jagielski         if( pGrf && pGrf->IsSupportedGraphic() )
799*b1cdbd2cSJim Jagielski         // <--
800*b1cdbd2cSJim Jagielski 		{
801*b1cdbd2cSJim Jagielski 			AddFormat( FORMAT_GDIMETAFILE );
802*b1cdbd2cSJim Jagielski             AddFormat( SOT_FORMATSTR_ID_PNG );
803*b1cdbd2cSJim Jagielski 			AddFormat( FORMAT_BITMAP );
804*b1cdbd2cSJim Jagielski 		}
805*b1cdbd2cSJim Jagielski 		eBufferType = TRNSFR_GRAPHIC;
806*b1cdbd2cSJim Jagielski 		pWrtShell->GetGrfNms( &sGrfNm, 0 );
807*b1cdbd2cSJim Jagielski 	}
808*b1cdbd2cSJim Jagielski 	else if ( nSelection == nsSelectionType::SEL_OLE )
809*b1cdbd2cSJim Jagielski 	{
810*b1cdbd2cSJim Jagielski         pClpDocFac = new SwDocFac;
811*b1cdbd2cSJim Jagielski         SwDoc *const pDoc = lcl_GetDoc(*pClpDocFac);
812*b1cdbd2cSJim Jagielski 		aDocShellRef = new SwDocShell( pDoc, SFX_CREATE_MODE_EMBEDDED);
813*b1cdbd2cSJim Jagielski 		aDocShellRef->DoInitNew( NULL );
814*b1cdbd2cSJim Jagielski 		pWrtShell->Copy( pDoc );
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski 		AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE );
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski         // --> OD #i98753#
819*b1cdbd2cSJim Jagielski         // set size of embedded object at the object description structure
820*b1cdbd2cSJim Jagielski         aObjDesc.maSize = OutputDevice::LogicToLogic( pWrtShell->GetObjSize(), MAP_TWIP, MAP_100TH_MM );
821*b1cdbd2cSJim Jagielski         // <--
822*b1cdbd2cSJim Jagielski         PrepareOLE( aObjDesc );
823*b1cdbd2cSJim Jagielski 		AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR );
824*b1cdbd2cSJim Jagielski 
825*b1cdbd2cSJim Jagielski         AddFormat( FORMAT_GDIMETAFILE );
826*b1cdbd2cSJim Jagielski 		eBufferType = TRNSFR_OLE;
827*b1cdbd2cSJim Jagielski 	}
828*b1cdbd2cSJim Jagielski 	//Gibt es ueberhaupt etwas zum bereitstellen?
829*b1cdbd2cSJim Jagielski 	else if ( pWrtShell->IsSelection() || pWrtShell->IsFrmSelected() ||
830*b1cdbd2cSJim Jagielski 			  pWrtShell->IsObjSelected() )
831*b1cdbd2cSJim Jagielski 	{
832*b1cdbd2cSJim Jagielski 		SwWait *pWait = 0;
833*b1cdbd2cSJim Jagielski 		if( pWrtShell->ShouldWait() )
834*b1cdbd2cSJim Jagielski 			pWait = new SwWait( *pWrtShell->GetView().GetDocShell(), true );
835*b1cdbd2cSJim Jagielski 
836*b1cdbd2cSJim Jagielski 		pClpDocFac = new SwDocFac;
837*b1cdbd2cSJim Jagielski 
838*b1cdbd2cSJim Jagielski 		// zusaetzlichen Cursor erzeugen, damit eine Gleichbehandlung
839*b1cdbd2cSJim Jagielski 		// von Tastatur- und Mausselektion moeglich ist.
840*b1cdbd2cSJim Jagielski 		// Im AddMode wird bei Tastaturselektion der neue Cursor erst
841*b1cdbd2cSJim Jagielski 		// beim Bewegen des Cursors nach Selektionsende erzeugt.
842*b1cdbd2cSJim Jagielski 		if( pWrtShell->IsAddMode() && pWrtShell->SwCrsrShell::HasSelection() )
843*b1cdbd2cSJim Jagielski 			pWrtShell->CreateCrsr();
844*b1cdbd2cSJim Jagielski 
845*b1cdbd2cSJim Jagielski         SwDoc *const pTmpDoc = lcl_GetDoc(*pClpDocFac);
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski 		pTmpDoc->LockExpFlds(); 	// nie die Felder updaten - Text so belassen
848*b1cdbd2cSJim Jagielski 		pWrtShell->Copy( pTmpDoc );
849*b1cdbd2cSJim Jagielski 
850*b1cdbd2cSJim Jagielski         {
851*b1cdbd2cSJim Jagielski             IDocumentMarkAccess* const pMarkAccess = pTmpDoc->getIDocumentMarkAccess();
852*b1cdbd2cSJim Jagielski             ::std::vector< ::sw::mark::IMark* > vDdeMarks;
853*b1cdbd2cSJim Jagielski             // find all DDE-Bookmarks
854*b1cdbd2cSJim Jagielski             for(IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getAllMarksBegin();
855*b1cdbd2cSJim Jagielski                 ppMark != pMarkAccess->getAllMarksEnd();
856*b1cdbd2cSJim Jagielski                 ppMark++)
857*b1cdbd2cSJim Jagielski             {
858*b1cdbd2cSJim Jagielski                 if(IDocumentMarkAccess::DDE_BOOKMARK == IDocumentMarkAccess::GetType(**ppMark))
859*b1cdbd2cSJim Jagielski                     vDdeMarks.push_back(ppMark->get());
860*b1cdbd2cSJim Jagielski             }
861*b1cdbd2cSJim Jagielski             // remove all DDE-Bookmarks, they are invalid inside the clipdoc!
862*b1cdbd2cSJim Jagielski             for(::std::vector< ::sw::mark::IMark* >::iterator ppMark = vDdeMarks.begin();
863*b1cdbd2cSJim Jagielski                 ppMark != vDdeMarks.end();
864*b1cdbd2cSJim Jagielski                 ppMark++)
865*b1cdbd2cSJim Jagielski                 pMarkAccess->deleteMark(*ppMark);
866*b1cdbd2cSJim Jagielski         }
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski 		// es wurde in der CORE eine neu angelegt (OLE-Objekte kopiert!)
869*b1cdbd2cSJim Jagielski         aDocShellRef = pTmpDoc->GetTmpDocShell();
870*b1cdbd2cSJim Jagielski 		if( aDocShellRef.Is() )
871*b1cdbd2cSJim Jagielski 			SwTransferable::InitOle( aDocShellRef, *pTmpDoc );
872*b1cdbd2cSJim Jagielski 		pTmpDoc->SetTmpDocShell( (SfxObjectShell*)NULL );
873*b1cdbd2cSJim Jagielski 
874*b1cdbd2cSJim Jagielski 		if( pWrtShell->IsObjSelected() )
875*b1cdbd2cSJim Jagielski 			eBufferType = TRNSFR_DRAWING;
876*b1cdbd2cSJim Jagielski 		else
877*b1cdbd2cSJim Jagielski 		{
878*b1cdbd2cSJim Jagielski 			eBufferType = TRNSFR_DOCUMENT;
879*b1cdbd2cSJim Jagielski 			if (pWrtShell->IntelligentCut(nSelection, sal_False) != SwWrtShell::NO_WORD)
880*b1cdbd2cSJim Jagielski 				eBufferType = (TransferBufferType)(TRNSFR_DOCUMENT_WORD | eBufferType);
881*b1cdbd2cSJim Jagielski 		}
882*b1cdbd2cSJim Jagielski 
883*b1cdbd2cSJim Jagielski 		int bDDELink = pWrtShell->IsSelection();
884*b1cdbd2cSJim Jagielski 		if( nSelection & nsSelectionType::SEL_TBL_CELLS )
885*b1cdbd2cSJim Jagielski 		{
886*b1cdbd2cSJim Jagielski 			eBufferType = (TransferBufferType)(TRNSFR_TABELLE | eBufferType);
887*b1cdbd2cSJim Jagielski 			bDDELink = pWrtShell->HasWholeTabSelection();
888*b1cdbd2cSJim Jagielski 		}
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski 		//Wenn's einer braucht OLE'n wir ihm was.
891*b1cdbd2cSJim Jagielski 		AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE );
892*b1cdbd2cSJim Jagielski 
893*b1cdbd2cSJim Jagielski 		//RTF vor das Metafile von OLE stellen, weil mit weniger verlusten
894*b1cdbd2cSJim Jagielski 		//behaftet.
895*b1cdbd2cSJim Jagielski 		if( !pWrtShell->IsObjSelected() )
896*b1cdbd2cSJim Jagielski 		{
897*b1cdbd2cSJim Jagielski 			AddFormat( FORMAT_RTF );
898*b1cdbd2cSJim Jagielski 			AddFormat( SOT_FORMATSTR_ID_HTML );
899*b1cdbd2cSJim Jagielski 		}
900*b1cdbd2cSJim Jagielski 		if( pWrtShell->IsSelection() )
901*b1cdbd2cSJim Jagielski 			AddFormat( FORMAT_STRING );
902*b1cdbd2cSJim Jagielski 
903*b1cdbd2cSJim Jagielski 		if( nSelection & ( nsSelectionType::SEL_DRW | nsSelectionType::SEL_DRW_FORM ))
904*b1cdbd2cSJim Jagielski 		{
905*b1cdbd2cSJim Jagielski 			AddFormat( SOT_FORMATSTR_ID_DRAWING );
906*b1cdbd2cSJim Jagielski 			if ( nSelection & nsSelectionType::SEL_DRW )
907*b1cdbd2cSJim Jagielski 			{
908*b1cdbd2cSJim Jagielski 				AddFormat( FORMAT_GDIMETAFILE );
909*b1cdbd2cSJim Jagielski                 AddFormat( SOT_FORMATSTR_ID_PNG );
910*b1cdbd2cSJim Jagielski 				AddFormat( FORMAT_BITMAP );
911*b1cdbd2cSJim Jagielski 			}
912*b1cdbd2cSJim Jagielski 			eBufferType = (TransferBufferType)( TRNSFR_GRAPHIC | eBufferType );
913*b1cdbd2cSJim Jagielski 
914*b1cdbd2cSJim Jagielski 			pClpGraphic = new Graphic;
915*b1cdbd2cSJim Jagielski 			if( !pWrtShell->GetDrawObjGraphic( FORMAT_GDIMETAFILE, *pClpGraphic ))
916*b1cdbd2cSJim Jagielski 				pOrigGrf = pClpGraphic;
917*b1cdbd2cSJim Jagielski 			pClpBitmap = new Graphic;
918*b1cdbd2cSJim Jagielski 			if( !pWrtShell->GetDrawObjGraphic( FORMAT_BITMAP, *pClpBitmap ))
919*b1cdbd2cSJim Jagielski 				pOrigGrf = pClpBitmap;
920*b1cdbd2cSJim Jagielski 
921*b1cdbd2cSJim Jagielski 			// ist es ein URL-Button ?
922*b1cdbd2cSJim Jagielski 			String sURL, sDesc;
923*b1cdbd2cSJim Jagielski 			if( pWrtShell->GetURLFromButton( sURL, sDesc ) )
924*b1cdbd2cSJim Jagielski 			{
925*b1cdbd2cSJim Jagielski 				AddFormat( FORMAT_STRING );
926*b1cdbd2cSJim Jagielski  				AddFormat( SOT_FORMATSTR_ID_SOLK );
927*b1cdbd2cSJim Jagielski  				AddFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK );
928*b1cdbd2cSJim Jagielski  				AddFormat( SOT_FORMATSTR_ID_FILECONTENT );
929*b1cdbd2cSJim Jagielski  				AddFormat( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR );
930*b1cdbd2cSJim Jagielski  				AddFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR );
931*b1cdbd2cSJim Jagielski 				eBufferType = (TransferBufferType)( TRNSFR_INETFLD | eBufferType );
932*b1cdbd2cSJim Jagielski 				nRet = sal_True;
933*b1cdbd2cSJim Jagielski 			}
934*b1cdbd2cSJim Jagielski 		}
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski 		// beim Cut hat DDE-Link keinen Sinn!!
937*b1cdbd2cSJim Jagielski 		SwDocShell* pDShell;
938*b1cdbd2cSJim Jagielski 		if( !bIsCut && bDDELink &&
939*b1cdbd2cSJim Jagielski 			0 != ( pDShell = pWrtShell->GetDoc()->GetDocShell()) &&
940*b1cdbd2cSJim Jagielski 			SFX_CREATE_MODE_STANDARD == pDShell->GetCreateMode() )
941*b1cdbd2cSJim Jagielski 		{
942*b1cdbd2cSJim Jagielski 			AddFormat( SOT_FORMATSTR_ID_LINK );
943*b1cdbd2cSJim Jagielski 			refDdeLink = new SwTrnsfrDdeLink( *this, *pWrtShell );
944*b1cdbd2cSJim Jagielski 		}
945*b1cdbd2cSJim Jagielski 
946*b1cdbd2cSJim Jagielski 		//ObjectDescriptor wurde bereits aus der alten DocShell gefuellt.
947*b1cdbd2cSJim Jagielski 		//Jetzt noch anpassen. Dadurch kann im GetData die erste Anfrage
948*b1cdbd2cSJim Jagielski 		//auch noch mit delayed rendering beantwortet werden.
949*b1cdbd2cSJim Jagielski 		aObjDesc.mbCanLink = sal_False;
950*b1cdbd2cSJim Jagielski 		Size aSz( OLESIZE );
951*b1cdbd2cSJim Jagielski 		aObjDesc.maSize = OutputDevice::LogicToLogic( aSz, MAP_TWIP, MAP_100TH_MM );
952*b1cdbd2cSJim Jagielski 
953*b1cdbd2cSJim Jagielski         PrepareOLE( aObjDesc );
954*b1cdbd2cSJim Jagielski         AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR );
955*b1cdbd2cSJim Jagielski 
956*b1cdbd2cSJim Jagielski 		delete pWait;
957*b1cdbd2cSJim Jagielski 	}
958*b1cdbd2cSJim Jagielski 	else
959*b1cdbd2cSJim Jagielski 		nRet = 0;
960*b1cdbd2cSJim Jagielski 
961*b1cdbd2cSJim Jagielski 	if( pWrtShell->IsFrmSelected() )
962*b1cdbd2cSJim Jagielski 	{
963*b1cdbd2cSJim Jagielski 		SfxItemSet aSet( pWrtShell->GetAttrPool(), RES_URL, RES_URL );
964*b1cdbd2cSJim Jagielski 		pWrtShell->GetFlyFrmAttr( aSet );
965*b1cdbd2cSJim Jagielski 		const SwFmtURL& rURL = (SwFmtURL&)aSet.Get( RES_URL );
966*b1cdbd2cSJim Jagielski 		if( rURL.GetMap() )
967*b1cdbd2cSJim Jagielski 		{
968*b1cdbd2cSJim Jagielski 			pImageMap = new ImageMap( *rURL.GetMap() );
969*b1cdbd2cSJim Jagielski 			AddFormat( SOT_FORMATSTR_ID_SVIM );
970*b1cdbd2cSJim Jagielski 		}
971*b1cdbd2cSJim Jagielski 		else if( rURL.GetURL().Len() )
972*b1cdbd2cSJim Jagielski 		{
973*b1cdbd2cSJim Jagielski 			pTargetURL = new INetImage( sGrfNm, rURL.GetURL(),
974*b1cdbd2cSJim Jagielski 										rURL.GetTargetFrameName(),
975*b1cdbd2cSJim Jagielski 										aEmptyStr, Size() );
976*b1cdbd2cSJim Jagielski 			AddFormat( SOT_FORMATSTR_ID_INET_IMAGE );
977*b1cdbd2cSJim Jagielski 		}
978*b1cdbd2cSJim Jagielski 	}
979*b1cdbd2cSJim Jagielski 
980*b1cdbd2cSJim Jagielski 	return nRet;
981*b1cdbd2cSJim Jagielski }
982*b1cdbd2cSJim Jagielski 
Copy(sal_Bool bIsCut)983*b1cdbd2cSJim Jagielski int SwTransferable::Copy( sal_Bool bIsCut )
984*b1cdbd2cSJim Jagielski {
985*b1cdbd2cSJim Jagielski     int nRet = PrepareForCopy( bIsCut );
986*b1cdbd2cSJim Jagielski     if ( nRet )
987*b1cdbd2cSJim Jagielski     {
988*b1cdbd2cSJim Jagielski         CopyToClipboard( &pWrtShell->GetView().GetEditWin() );
989*b1cdbd2cSJim Jagielski     }
990*b1cdbd2cSJim Jagielski 	return nRet;
991*b1cdbd2cSJim Jagielski }
992*b1cdbd2cSJim Jagielski 
993*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
994*b1cdbd2cSJim Jagielski 
CalculateAndCopy()995*b1cdbd2cSJim Jagielski int SwTransferable::CalculateAndCopy()
996*b1cdbd2cSJim Jagielski {
997*b1cdbd2cSJim Jagielski     if(!pWrtShell)
998*b1cdbd2cSJim Jagielski         return 0;
999*b1cdbd2cSJim Jagielski     SwWait aWait( *pWrtShell->GetView().GetDocShell(), true );
1000*b1cdbd2cSJim Jagielski 
1001*b1cdbd2cSJim Jagielski 	String aStr( pWrtShell->Calculate() );
1002*b1cdbd2cSJim Jagielski 
1003*b1cdbd2cSJim Jagielski 	pClpDocFac = new SwDocFac;
1004*b1cdbd2cSJim Jagielski     SwDoc *const pDoc = lcl_GetDoc(*pClpDocFac);
1005*b1cdbd2cSJim Jagielski     pWrtShell->Copy(pDoc, & aStr);
1006*b1cdbd2cSJim Jagielski 	eBufferType = TRNSFR_DOCUMENT;
1007*b1cdbd2cSJim Jagielski 	AddFormat( FORMAT_STRING );
1008*b1cdbd2cSJim Jagielski 
1009*b1cdbd2cSJim Jagielski 	CopyToClipboard( &pWrtShell->GetView().GetEditWin() );
1010*b1cdbd2cSJim Jagielski 
1011*b1cdbd2cSJim Jagielski 	return 1;
1012*b1cdbd2cSJim Jagielski }
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1015*b1cdbd2cSJim Jagielski 
CopyGlossary(SwTextBlocks & rGlossary,const String & rStr)1016*b1cdbd2cSJim Jagielski int SwTransferable::CopyGlossary( SwTextBlocks& rGlossary,
1017*b1cdbd2cSJim Jagielski 									const String& rStr )
1018*b1cdbd2cSJim Jagielski {
1019*b1cdbd2cSJim Jagielski     if(!pWrtShell)
1020*b1cdbd2cSJim Jagielski         return 0;
1021*b1cdbd2cSJim Jagielski     SwWait aWait( *pWrtShell->GetView().GetDocShell(), true );
1022*b1cdbd2cSJim Jagielski 
1023*b1cdbd2cSJim Jagielski 	pClpDocFac = new SwDocFac;
1024*b1cdbd2cSJim Jagielski     SwDoc *const pCDoc = lcl_GetDoc(*pClpDocFac);
1025*b1cdbd2cSJim Jagielski 
1026*b1cdbd2cSJim Jagielski 	SwNodes& rNds = pCDoc->GetNodes();
1027*b1cdbd2cSJim Jagielski 	SwNodeIndex aNodeIdx( *rNds.GetEndOfContent().StartOfSectionNode() );
1028*b1cdbd2cSJim Jagielski 	SwCntntNode* pCNd = rNds.GoNext( &aNodeIdx ); // gehe zum 1. ContentNode
1029*b1cdbd2cSJim Jagielski 	SwPaM aPam( *pCNd );
1030*b1cdbd2cSJim Jagielski 
1031*b1cdbd2cSJim Jagielski 	pCDoc->LockExpFlds(); 	// nie die Felder updaten - Text so belassen
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski 	pCDoc->InsertGlossary( rGlossary, rStr, aPam, 0 );
1034*b1cdbd2cSJim Jagielski 
1035*b1cdbd2cSJim Jagielski 	// es wurde in der CORE eine neu angelegt (OLE-Objekte kopiert!)
1036*b1cdbd2cSJim Jagielski     aDocShellRef = pCDoc->GetTmpDocShell();
1037*b1cdbd2cSJim Jagielski 	if( aDocShellRef.Is() )
1038*b1cdbd2cSJim Jagielski 		SwTransferable::InitOle( aDocShellRef, *pCDoc );
1039*b1cdbd2cSJim Jagielski     pCDoc->SetTmpDocShell( (SfxObjectShell*)NULL );
1040*b1cdbd2cSJim Jagielski 
1041*b1cdbd2cSJim Jagielski 	eBufferType = TRNSFR_DOCUMENT;
1042*b1cdbd2cSJim Jagielski 
1043*b1cdbd2cSJim Jagielski 	//Wenn's einer braucht OLE'n wir ihm was.
1044*b1cdbd2cSJim Jagielski 	AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE );
1045*b1cdbd2cSJim Jagielski     AddFormat( FORMAT_RTF );
1046*b1cdbd2cSJim Jagielski 	AddFormat( SOT_FORMATSTR_ID_HTML );
1047*b1cdbd2cSJim Jagielski 	AddFormat( FORMAT_STRING );
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski 	//ObjectDescriptor wurde bereits aus der alten DocShell gefuellt.
1050*b1cdbd2cSJim Jagielski 	//Jetzt noch anpassen. Dadurch kann im GetData die erste Anfrage
1051*b1cdbd2cSJim Jagielski 	//auch noch mit delayed rendering beantwortet werden.
1052*b1cdbd2cSJim Jagielski 	aObjDesc.mbCanLink = sal_False;
1053*b1cdbd2cSJim Jagielski 	Size aSz( OLESIZE );
1054*b1cdbd2cSJim Jagielski 	aObjDesc.maSize = OutputDevice::LogicToLogic( aSz, MAP_TWIP, MAP_100TH_MM );
1055*b1cdbd2cSJim Jagielski 
1056*b1cdbd2cSJim Jagielski     PrepareOLE( aObjDesc );
1057*b1cdbd2cSJim Jagielski     AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR );
1058*b1cdbd2cSJim Jagielski 
1059*b1cdbd2cSJim Jagielski 	CopyToClipboard( &pWrtShell->GetView().GetEditWin() );
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski 	return 1;
1062*b1cdbd2cSJim Jagielski }
1063*b1cdbd2cSJim Jagielski 
lcl_getTransferPointer(uno::Reference<XTransferable> & xRef)1064*b1cdbd2cSJim Jagielski static inline uno::Reference < XTransferable > * lcl_getTransferPointer ( uno::Reference < XTransferable > &xRef )
1065*b1cdbd2cSJim Jagielski {
1066*b1cdbd2cSJim Jagielski 	return &xRef;
1067*b1cdbd2cSJim Jagielski }
1068*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1069*b1cdbd2cSJim Jagielski 
IsPaste(const SwWrtShell & rSh,const TransferableDataHelper & rData)1070*b1cdbd2cSJim Jagielski sal_Bool SwTransferable::IsPaste( const SwWrtShell& rSh,
1071*b1cdbd2cSJim Jagielski 							  const TransferableDataHelper& rData )
1072*b1cdbd2cSJim Jagielski {
1073*b1cdbd2cSJim Jagielski     // Check the common case first: We can always paste our own data!
1074*b1cdbd2cSJim Jagielski     // #106503#: If _only_ the internal format can be pasted, this check will
1075*b1cdbd2cSJim Jagielski     // yield 'true', while the one below would give a (wrong) result 'false'.
1076*b1cdbd2cSJim Jagielski 
1077*b1cdbd2cSJim Jagielski     bool bIsPaste = ( GetSwTransferable( rData ) != NULL );
1078*b1cdbd2cSJim Jagielski 
1079*b1cdbd2cSJim Jagielski     // if it's not our own data, we need to have a closer look:
1080*b1cdbd2cSJim Jagielski     if( ! bIsPaste )
1081*b1cdbd2cSJim Jagielski     {
1082*b1cdbd2cSJim Jagielski         // determine the proper paste action, and return true if we find one
1083*b1cdbd2cSJim Jagielski         uno::Reference<XTransferable> xTransferable( rData.GetXTransferable() );
1084*b1cdbd2cSJim Jagielski 
1085*b1cdbd2cSJim Jagielski         sal_uInt16 nDestination = SwTransferable::GetSotDestination( rSh );
1086*b1cdbd2cSJim Jagielski         sal_uInt16 nSourceOptions =
1087*b1cdbd2cSJim Jagielski 					(( EXCHG_DEST_DOC_TEXTFRAME == nDestination ||
1088*b1cdbd2cSJim Jagielski 					   EXCHG_DEST_SWDOC_FREE_AREA == nDestination ||
1089*b1cdbd2cSJim Jagielski 					   EXCHG_DEST_DOC_TEXTFRAME_WEB == nDestination ||
1090*b1cdbd2cSJim Jagielski 					   EXCHG_DEST_SWDOC_FREE_AREA_WEB == nDestination )
1091*b1cdbd2cSJim Jagielski 									? EXCHG_IN_ACTION_COPY
1092*b1cdbd2cSJim Jagielski                      : EXCHG_IN_ACTION_MOVE);
1093*b1cdbd2cSJim Jagielski 
1094*b1cdbd2cSJim Jagielski         sal_uLong nFormat;          // output param for GetExchangeAction
1095*b1cdbd2cSJim Jagielski         sal_uInt16 nEventAction;    // output param for GetExchangeAction
1096*b1cdbd2cSJim Jagielski         sal_uInt16 nAction = SotExchange::GetExchangeAction(
1097*b1cdbd2cSJim Jagielski 								rData.GetDataFlavorExVector(),
1098*b1cdbd2cSJim Jagielski 								nDestination,
1099*b1cdbd2cSJim Jagielski 								nSourceOptions,  			/* ?? */
1100*b1cdbd2cSJim Jagielski 								EXCHG_IN_ACTION_DEFAULT,    /* ?? */
1101*b1cdbd2cSJim Jagielski 								nFormat, nEventAction, 0,
1102*b1cdbd2cSJim Jagielski 								lcl_getTransferPointer ( xTransferable ) );
1103*b1cdbd2cSJim Jagielski 
1104*b1cdbd2cSJim Jagielski         // if we find a suitable action, we can paste!
1105*b1cdbd2cSJim Jagielski         bIsPaste = (EXCHG_INOUT_ACTION_NONE != nAction);
1106*b1cdbd2cSJim Jagielski     }
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski 	return bIsPaste;
1109*b1cdbd2cSJim Jagielski }
1110*b1cdbd2cSJim Jagielski 
1111*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1112*b1cdbd2cSJim Jagielski 
Paste(SwWrtShell & rSh,TransferableDataHelper & rData)1113*b1cdbd2cSJim Jagielski int SwTransferable::Paste( SwWrtShell& rSh, TransferableDataHelper& rData )
1114*b1cdbd2cSJim Jagielski {
1115*b1cdbd2cSJim Jagielski     sal_uInt16 nEventAction, nAction=0,
1116*b1cdbd2cSJim Jagielski 		   nDestination = SwTransferable::GetSotDestination( rSh );
1117*b1cdbd2cSJim Jagielski     sal_uLong nFormat = 0;
1118*b1cdbd2cSJim Jagielski 
1119*b1cdbd2cSJim Jagielski 	if( GetSwTransferable( rData ) )
1120*b1cdbd2cSJim Jagielski 	{
1121*b1cdbd2cSJim Jagielski 		nAction = EXCHG_OUT_ACTION_INSERT_PRIVATE;
1122*b1cdbd2cSJim Jagielski 	}
1123*b1cdbd2cSJim Jagielski 	else
1124*b1cdbd2cSJim Jagielski 	{
1125*b1cdbd2cSJim Jagielski         sal_uInt16 nSourceOptions =
1126*b1cdbd2cSJim Jagielski                     (( EXCHG_DEST_DOC_TEXTFRAME == nDestination ||
1127*b1cdbd2cSJim Jagielski                     EXCHG_DEST_SWDOC_FREE_AREA == nDestination ||
1128*b1cdbd2cSJim Jagielski                     EXCHG_DEST_DOC_TEXTFRAME_WEB == nDestination ||
1129*b1cdbd2cSJim Jagielski                     EXCHG_DEST_SWDOC_FREE_AREA_WEB == nDestination )
1130*b1cdbd2cSJim Jagielski                                     ? EXCHG_IN_ACTION_COPY
1131*b1cdbd2cSJim Jagielski                                     : EXCHG_IN_ACTION_MOVE);
1132*b1cdbd2cSJim Jagielski         uno::Reference<XTransferable> xTransferable( rData.GetXTransferable() );
1133*b1cdbd2cSJim Jagielski         nAction = SotExchange::GetExchangeAction(
1134*b1cdbd2cSJim Jagielski                                     rData.GetDataFlavorExVector(),
1135*b1cdbd2cSJim Jagielski                                     nDestination,
1136*b1cdbd2cSJim Jagielski                                     nSourceOptions,             /* ?? */
1137*b1cdbd2cSJim Jagielski                                     EXCHG_IN_ACTION_DEFAULT,    /* ?? */
1138*b1cdbd2cSJim Jagielski                                     nFormat, nEventAction, 0,
1139*b1cdbd2cSJim Jagielski                                     lcl_getTransferPointer ( xTransferable ) );
1140*b1cdbd2cSJim Jagielski 	}
1141*b1cdbd2cSJim Jagielski 
1142*b1cdbd2cSJim Jagielski 	// special case for tables from draw application
1143*b1cdbd2cSJim Jagielski 	if( EXCHG_OUT_ACTION_INSERT_DRAWOBJ == (nAction & EXCHG_ACTION_MASK) )
1144*b1cdbd2cSJim Jagielski 	{
1145*b1cdbd2cSJim Jagielski 		if( rData.HasFormat( SOT_FORMAT_RTF ) )
1146*b1cdbd2cSJim Jagielski 		{
1147*b1cdbd2cSJim Jagielski 			nAction = EXCHG_OUT_ACTION_INSERT_STRING | (nAction & !EXCHG_ACTION_MASK);
1148*b1cdbd2cSJim Jagielski 			nFormat = SOT_FORMAT_RTF;
1149*b1cdbd2cSJim Jagielski 		}
1150*b1cdbd2cSJim Jagielski 	}
1151*b1cdbd2cSJim Jagielski 
1152*b1cdbd2cSJim Jagielski 	return EXCHG_INOUT_ACTION_NONE != nAction &&
1153*b1cdbd2cSJim Jagielski 			SwTransferable::PasteData( rData, rSh, nAction, nFormat,
1154*b1cdbd2cSJim Jagielski                                         nDestination, sal_False, sal_False );
1155*b1cdbd2cSJim Jagielski }
1156*b1cdbd2cSJim Jagielski 
1157*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1158*b1cdbd2cSJim Jagielski 
PasteData(TransferableDataHelper & rData,SwWrtShell & rSh,sal_uInt16 nAction,sal_uLong nFormat,sal_uInt16 nDestination,sal_Bool bIsPasteFmt,sal_Bool bIsDefault,const Point * pPt,sal_Int8 nDropAction,sal_Bool bPasteSelection)1159*b1cdbd2cSJim Jagielski int SwTransferable::PasteData( TransferableDataHelper& rData,
1160*b1cdbd2cSJim Jagielski 							SwWrtShell& rSh, sal_uInt16 nAction, sal_uLong nFormat,
1161*b1cdbd2cSJim Jagielski 							sal_uInt16 nDestination, sal_Bool bIsPasteFmt,
1162*b1cdbd2cSJim Jagielski 							sal_Bool bIsDefault,
1163*b1cdbd2cSJim Jagielski 							const Point* pPt, sal_Int8 nDropAction,
1164*b1cdbd2cSJim Jagielski 							sal_Bool bPasteSelection )
1165*b1cdbd2cSJim Jagielski {
1166*b1cdbd2cSJim Jagielski 	SwWait aWait( *rSh.GetView().GetDocShell(), false );
1167*b1cdbd2cSJim Jagielski 	SwTrnsfrActionAndUndo* pAction = 0;
1168*b1cdbd2cSJim Jagielski 	SwModule* pMod = SW_MOD();
1169*b1cdbd2cSJim Jagielski 
1170*b1cdbd2cSJim Jagielski 	int nRet = 0;
1171*b1cdbd2cSJim Jagielski     bool bCallAutoCaption = false;
1172*b1cdbd2cSJim Jagielski 
1173*b1cdbd2cSJim Jagielski 	if( pPt )
1174*b1cdbd2cSJim Jagielski 	{
1175*b1cdbd2cSJim Jagielski 		// external Drop
1176*b1cdbd2cSJim Jagielski 		if( bPasteSelection ? !pMod->pXSelection : !pMod->pDragDrop )
1177*b1cdbd2cSJim Jagielski 		{
1178*b1cdbd2cSJim Jagielski 			switch( nDestination )
1179*b1cdbd2cSJim Jagielski 			{
1180*b1cdbd2cSJim Jagielski 			case EXCHG_DEST_DOC_LNKD_GRAPH_W_IMAP:
1181*b1cdbd2cSJim Jagielski 			case EXCHG_DEST_DOC_LNKD_GRAPHOBJ:
1182*b1cdbd2cSJim Jagielski 			case EXCHG_DEST_DOC_GRAPH_W_IMAP:
1183*b1cdbd2cSJim Jagielski 			case EXCHG_DEST_DOC_GRAPHOBJ:
1184*b1cdbd2cSJim Jagielski 			case EXCHG_DEST_DOC_OLEOBJ:
1185*b1cdbd2cSJim Jagielski 			case EXCHG_DEST_DOC_DRAWOBJ:
1186*b1cdbd2cSJim Jagielski 			case EXCHG_DEST_DOC_URLBUTTON:
1187*b1cdbd2cSJim Jagielski 			case EXCHG_DEST_DOC_GROUPOBJ:
1188*b1cdbd2cSJim Jagielski 				// Rahmen/Objecte selektieren
1189*b1cdbd2cSJim Jagielski 				SwTransferable::SetSelInShell( rSh, sal_True, pPt );
1190*b1cdbd2cSJim Jagielski 				break;
1191*b1cdbd2cSJim Jagielski 
1192*b1cdbd2cSJim Jagielski 			// case EXCHG_DEST_DOC_TEXTFRAME:
1193*b1cdbd2cSJim Jagielski 			// case EXCHG_DEST_SWDOC_FREE_AREA:
1194*b1cdbd2cSJim Jagielski 			// case EXCHG_DEST_DOC_URLFIELD:
1195*b1cdbd2cSJim Jagielski 			default:
1196*b1cdbd2cSJim Jagielski 				SwTransferable::SetSelInShell( rSh, sal_False, pPt );
1197*b1cdbd2cSJim Jagielski 				break;
1198*b1cdbd2cSJim Jagielski 			}
1199*b1cdbd2cSJim Jagielski 		}
1200*b1cdbd2cSJim Jagielski 	}
1201*b1cdbd2cSJim Jagielski 	else if( ( !GetSwTransferable( rData ) || bIsPasteFmt ) &&
1202*b1cdbd2cSJim Jagielski 			!rSh.IsTableMode() && rSh.HasSelection() )
1203*b1cdbd2cSJim Jagielski 	{
1204*b1cdbd2cSJim Jagielski 		// dann die Selektionen loeschen
1205*b1cdbd2cSJim Jagielski 
1206*b1cdbd2cSJim Jagielski 		//Selektierten Inhalt loeschen,
1207*b1cdbd2cSJim Jagielski 		// - nicht bei Tabellen-Selektion
1208*b1cdbd2cSJim Jagielski 		// - nicht bei ReRead einer Grafik/DDEDaten
1209*b1cdbd2cSJim Jagielski 		// - nicht bei D&D, fuer die richtige Selektion wurde im
1210*b1cdbd2cSJim Jagielski 		//		Drop-Handler gesorgt
1211*b1cdbd2cSJim Jagielski 		sal_Bool bDelSel = sal_False;
1212*b1cdbd2cSJim Jagielski 		switch( nDestination )
1213*b1cdbd2cSJim Jagielski 		{
1214*b1cdbd2cSJim Jagielski 		case EXCHG_DEST_DOC_TEXTFRAME:
1215*b1cdbd2cSJim Jagielski 		case EXCHG_DEST_SWDOC_FREE_AREA:
1216*b1cdbd2cSJim Jagielski 		case EXCHG_DEST_DOC_TEXTFRAME_WEB:
1217*b1cdbd2cSJim Jagielski 		case EXCHG_DEST_SWDOC_FREE_AREA_WEB:
1218*b1cdbd2cSJim Jagielski 			bDelSel = sal_True;
1219*b1cdbd2cSJim Jagielski 			break;
1220*b1cdbd2cSJim Jagielski 		}
1221*b1cdbd2cSJim Jagielski 
1222*b1cdbd2cSJim Jagielski 		if( bDelSel )
1223*b1cdbd2cSJim Jagielski             // --> FME 2004-10-19 #i34830#
1224*b1cdbd2cSJim Jagielski 			pAction = new SwTrnsfrActionAndUndo( &rSh, UNDO_PASTE_CLIPBOARD, NULL,
1225*b1cdbd2cSJim Jagielski                                                  sal_True );
1226*b1cdbd2cSJim Jagielski             // <--
1227*b1cdbd2cSJim Jagielski 	}
1228*b1cdbd2cSJim Jagielski 
1229*b1cdbd2cSJim Jagielski     SwTransferable *pTrans=0, *pTunneledTrans=GetSwTransferable( rData );
1230*b1cdbd2cSJim Jagielski //    uno::Reference<XUnoTunnel> xTunnel( rData.GetTransferable(), UNO_QUERY );
1231*b1cdbd2cSJim Jagielski //    if ( xTunnel.is() )
1232*b1cdbd2cSJim Jagielski //    {
1233*b1cdbd2cSJim Jagielski //        sal_Int64 nHandle = xTunnel->getSomething( getUnoTunnelId() );
1234*b1cdbd2cSJim Jagielski //        if ( nHandle )
1235*b1cdbd2cSJim Jagielski //            pTunneledTrans = (SwTransferable*) (sal_IntPtr) nHandle;
1236*b1cdbd2cSJim Jagielski //    }
1237*b1cdbd2cSJim Jagielski 
1238*b1cdbd2cSJim Jagielski     // check for private drop
1239*b1cdbd2cSJim Jagielski     bool bPrivateDrop(pPt && (bPasteSelection ? 0 != (pTrans = pMod->pXSelection) : 0 != (pTrans = pMod->pDragDrop)));
1240*b1cdbd2cSJim Jagielski     bool bNeedToSelectBeforePaste(false);
1241*b1cdbd2cSJim Jagielski 
1242*b1cdbd2cSJim Jagielski     if(bPrivateDrop && DND_ACTION_LINK == nDropAction)
1243*b1cdbd2cSJim Jagielski     {
1244*b1cdbd2cSJim Jagielski         // internal drop on object, suppress bPrivateDrop to change internal fill
1245*b1cdbd2cSJim Jagielski         bPrivateDrop = false;
1246*b1cdbd2cSJim Jagielski         bNeedToSelectBeforePaste = true;
1247*b1cdbd2cSJim Jagielski     }
1248*b1cdbd2cSJim Jagielski 
1249*b1cdbd2cSJim Jagielski     if(bPrivateDrop && pPt && DND_ACTION_MOVE == nDropAction)
1250*b1cdbd2cSJim Jagielski     {
1251*b1cdbd2cSJim Jagielski         // check if dragged over a useful target. If yes, use as content exchange
1252*b1cdbd2cSJim Jagielski         // drop as if from external
1253*b1cdbd2cSJim Jagielski         const SwFrmFmt* pSwFrmFmt = rSh.GetFmtFromObj(*pPt);
1254*b1cdbd2cSJim Jagielski 
1255*b1cdbd2cSJim Jagielski         if(pSwFrmFmt && 0 != dynamic_cast< const SwDrawFrmFmt* >(pSwFrmFmt))
1256*b1cdbd2cSJim Jagielski         {
1257*b1cdbd2cSJim Jagielski             bPrivateDrop = false;
1258*b1cdbd2cSJim Jagielski             bNeedToSelectBeforePaste = true;
1259*b1cdbd2cSJim Jagielski         }
1260*b1cdbd2cSJim Jagielski     }
1261*b1cdbd2cSJim Jagielski 
1262*b1cdbd2cSJim Jagielski     if(bPrivateDrop)
1263*b1cdbd2cSJim Jagielski 	{
1264*b1cdbd2cSJim Jagielski 		// then internal Drag & Drop or XSelection
1265*b1cdbd2cSJim Jagielski 		nRet = pTrans->PrivateDrop( rSh, *pPt, DND_ACTION_MOVE == nDropAction,
1266*b1cdbd2cSJim Jagielski 									bPasteSelection );
1267*b1cdbd2cSJim Jagielski 	}
1268*b1cdbd2cSJim Jagielski     else if( !pPt && pTunneledTrans &&
1269*b1cdbd2cSJim Jagielski 			EXCHG_OUT_ACTION_INSERT_PRIVATE == nAction )
1270*b1cdbd2cSJim Jagielski 	{
1271*b1cdbd2cSJim Jagielski 		// then internal paste
1272*b1cdbd2cSJim Jagielski         nRet = pTunneledTrans->PrivatePaste( rSh );
1273*b1cdbd2cSJim Jagielski 	}
1274*b1cdbd2cSJim Jagielski 	else if( EXCHG_INOUT_ACTION_NONE != nAction )
1275*b1cdbd2cSJim Jagielski 	{
1276*b1cdbd2cSJim Jagielski 		if( !pAction )
1277*b1cdbd2cSJim Jagielski         {
1278*b1cdbd2cSJim Jagielski             // #111827#
1279*b1cdbd2cSJim Jagielski 			pAction = new SwTrnsfrActionAndUndo( &rSh, UNDO_PASTE_CLIPBOARD);
1280*b1cdbd2cSJim Jagielski         }
1281*b1cdbd2cSJim Jagielski 
1282*b1cdbd2cSJim Jagielski 		// im Drag&Drop duerfen keine MessageBoxen angezeigt werden
1283*b1cdbd2cSJim Jagielski 		sal_Bool bMsg = 0 == pPt;
1284*b1cdbd2cSJim Jagielski         sal_uInt8 nActionFlags = static_cast< sal_uInt8 >(( nAction >> 8 ) & 0xFF);
1285*b1cdbd2cSJim Jagielski 
1286*b1cdbd2cSJim Jagielski 		sal_uInt16 nClearedAction = ( nAction & EXCHG_ACTION_MASK );
1287*b1cdbd2cSJim Jagielski 		// Selektionen loeschen
1288*b1cdbd2cSJim Jagielski 
1289*b1cdbd2cSJim Jagielski 		switch( nClearedAction )
1290*b1cdbd2cSJim Jagielski 		{
1291*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_PRIVATE:
1292*b1cdbd2cSJim Jagielski ASSERT( pPt, "EXCHG_OUT_ACTION_INSERT_PRIVATE: was soll hier passieren?" );
1293*b1cdbd2cSJim Jagielski 			break;
1294*b1cdbd2cSJim Jagielski 
1295*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_MOVE_PRIVATE:
1296*b1cdbd2cSJim Jagielski ASSERT( pPt, "EXCHG_OUT_ACTION_MOVE_PRIVATE: was soll hier passieren?" );
1297*b1cdbd2cSJim Jagielski 			break;
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski 
1300*b1cdbd2cSJim Jagielski 		case EXCHG_IN_ACTION_MOVE:
1301*b1cdbd2cSJim Jagielski 		case EXCHG_IN_ACTION_COPY:
1302*b1cdbd2cSJim Jagielski 		case EXCHG_IN_ACTION_LINK:
1303*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_HTML:
1304*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_STRING:
1305*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_IMAGEMAP:
1306*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_REPLACE_IMAGEMAP:
1307*b1cdbd2cSJim Jagielski 
1308*b1cdbd2cSJim Jagielski 			// dann muss ueber das Format gegangen werden
1309*b1cdbd2cSJim Jagielski 			switch( nFormat )
1310*b1cdbd2cSJim Jagielski 			{
1311*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_DRAWING:
1312*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteSdrFormat( rData, rSh,
1313*b1cdbd2cSJim Jagielski 												SW_PASTESDR_INSERT, pPt,
1314*b1cdbd2cSJim Jagielski 												nActionFlags, bNeedToSelectBeforePaste);
1315*b1cdbd2cSJim Jagielski 				break;
1316*b1cdbd2cSJim Jagielski 
1317*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_HTML:
1318*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_HTML_SIMPLE:
1319*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_HTML_NO_COMMENT:
1320*b1cdbd2cSJim Jagielski 			case SOT_FORMAT_RTF:
1321*b1cdbd2cSJim Jagielski 			case SOT_FORMAT_STRING:
1322*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteFileContent( rData, rSh,
1323*b1cdbd2cSJim Jagielski 															nFormat, bMsg );
1324*b1cdbd2cSJim Jagielski 				break;
1325*b1cdbd2cSJim Jagielski 
1326*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK:
1327*b1cdbd2cSJim Jagielski 				{
1328*b1cdbd2cSJim Jagielski 					INetBookmark aBkmk;
1329*b1cdbd2cSJim Jagielski 					if( rData.GetINetBookmark( nFormat, aBkmk ) )
1330*b1cdbd2cSJim Jagielski 					{
1331*b1cdbd2cSJim Jagielski 						SwFmtINetFmt aFmt( aBkmk.GetURL(), aEmptyStr );
1332*b1cdbd2cSJim Jagielski 						rSh.InsertURL( aFmt, aBkmk.GetDescription() );
1333*b1cdbd2cSJim Jagielski 						nRet = 1;
1334*b1cdbd2cSJim Jagielski 					}
1335*b1cdbd2cSJim Jagielski 				}
1336*b1cdbd2cSJim Jagielski 				break;
1337*b1cdbd2cSJim Jagielski 
1338*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_SD_OLE:
1339*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteOLE( rData, rSh, nFormat,
1340*b1cdbd2cSJim Jagielski 													nActionFlags, bMsg );
1341*b1cdbd2cSJim Jagielski 				break;
1342*b1cdbd2cSJim Jagielski 
1343*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_SVIM:
1344*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteImageMap( rData, rSh );
1345*b1cdbd2cSJim Jagielski 				break;
1346*b1cdbd2cSJim Jagielski 
1347*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_SVXB:
1348*b1cdbd2cSJim Jagielski 			case SOT_FORMAT_BITMAP:
1349*b1cdbd2cSJim Jagielski             case SOT_FORMATSTR_ID_PNG:
1350*b1cdbd2cSJim Jagielski 			case SOT_FORMAT_GDIMETAFILE:
1351*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteGrf( rData, rSh, nFormat,
1352*b1cdbd2cSJim Jagielski 												SW_PASTESDR_INSERT,pPt,
1353*b1cdbd2cSJim Jagielski 												nActionFlags, nDropAction, bNeedToSelectBeforePaste);
1354*b1cdbd2cSJim Jagielski 				break;
1355*b1cdbd2cSJim Jagielski 
1356*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_XFORMS:
1357*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE:
1358*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_SBA_DATAEXCHANGE:
1359*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_SBA_CTRLDATAEXCHANGE:
1360*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteDBData( rData, rSh, nFormat,
1361*b1cdbd2cSJim Jagielski 											EXCHG_IN_ACTION_LINK == nClearedAction,
1362*b1cdbd2cSJim Jagielski 											pPt, bMsg );
1363*b1cdbd2cSJim Jagielski 				break;
1364*b1cdbd2cSJim Jagielski 
1365*b1cdbd2cSJim Jagielski 			case SOT_FORMAT_FILE:
1366*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteFileName( rData, rSh, nFormat,
1367*b1cdbd2cSJim Jagielski 								( EXCHG_IN_ACTION_MOVE == nClearedAction
1368*b1cdbd2cSJim Jagielski 									? SW_PASTESDR_REPLACE
1369*b1cdbd2cSJim Jagielski 									: EXCHG_IN_ACTION_LINK == nClearedAction
1370*b1cdbd2cSJim Jagielski 										? SW_PASTESDR_SETATTR
1371*b1cdbd2cSJim Jagielski 										: SW_PASTESDR_INSERT),
1372*b1cdbd2cSJim Jagielski 								pPt, nActionFlags, bMsg );
1373*b1cdbd2cSJim Jagielski 				break;
1374*b1cdbd2cSJim Jagielski 
1375*b1cdbd2cSJim Jagielski 			case SOT_FORMAT_FILE_LIST:
1376*b1cdbd2cSJim Jagielski 				// dann nur als Grafiken einfuegen
1377*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteFileList( rData, rSh,
1378*b1cdbd2cSJim Jagielski 									EXCHG_IN_ACTION_LINK == nClearedAction,
1379*b1cdbd2cSJim Jagielski 									pPt, bMsg );
1380*b1cdbd2cSJim Jagielski 				break;
1381*b1cdbd2cSJim Jagielski 
1382*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_SONLK:
1383*b1cdbd2cSJim Jagielski 				if( pPt )
1384*b1cdbd2cSJim Jagielski 				{
1385*b1cdbd2cSJim Jagielski 					NaviContentBookmark aBkmk;
1386*b1cdbd2cSJim Jagielski 					if( aBkmk.Paste( rData ) )
1387*b1cdbd2cSJim Jagielski 					{
1388*b1cdbd2cSJim Jagielski                         if(bIsDefault)
1389*b1cdbd2cSJim Jagielski                         {
1390*b1cdbd2cSJim Jagielski                             switch(aBkmk.GetDefaultDragType())
1391*b1cdbd2cSJim Jagielski                             {
1392*b1cdbd2cSJim Jagielski                                 case REGION_MODE_NONE: nClearedAction = EXCHG_IN_ACTION_COPY; break;
1393*b1cdbd2cSJim Jagielski                                 case REGION_MODE_EMBEDDED: nClearedAction = EXCHG_IN_ACTION_MOVE; break;
1394*b1cdbd2cSJim Jagielski                                 case REGION_MODE_LINK: nClearedAction = EXCHG_IN_ACTION_LINK; break;
1395*b1cdbd2cSJim Jagielski                             }
1396*b1cdbd2cSJim Jagielski                         }
1397*b1cdbd2cSJim Jagielski                         rSh.NavigatorPaste( aBkmk, nClearedAction );
1398*b1cdbd2cSJim Jagielski 						nRet = 1;
1399*b1cdbd2cSJim Jagielski 					}
1400*b1cdbd2cSJim Jagielski 				}
1401*b1cdbd2cSJim Jagielski 				break;
1402*b1cdbd2cSJim Jagielski 
1403*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_INET_IMAGE:
1404*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_NETSCAPE_IMAGE:
1405*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteTargetURL( rData, rSh,
1406*b1cdbd2cSJim Jagielski 														SW_PASTESDR_INSERT,
1407*b1cdbd2cSJim Jagielski 														pPt, sal_True );
1408*b1cdbd2cSJim Jagielski 				break;
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski 			default:
1411*b1cdbd2cSJim Jagielski 				ASSERT( pPt, "unbekanntes Format" );
1412*b1cdbd2cSJim Jagielski 			}
1413*b1cdbd2cSJim Jagielski 			break;
1414*b1cdbd2cSJim Jagielski 
1415*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_FILE:
1416*b1cdbd2cSJim Jagielski 			nRet = SwTransferable::_PasteFileName( rData, rSh, nFormat,
1417*b1cdbd2cSJim Jagielski 										SW_PASTESDR_INSERT, pPt,
1418*b1cdbd2cSJim Jagielski 										nActionFlags, bMsg );
1419*b1cdbd2cSJim Jagielski 			if( nRet & SWTRANSFER_GRAPHIC_INSERTED )
1420*b1cdbd2cSJim Jagielski                 bCallAutoCaption = true;
1421*b1cdbd2cSJim Jagielski             break;
1422*b1cdbd2cSJim Jagielski 
1423*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_OLE:
1424*b1cdbd2cSJim Jagielski 			nRet = SwTransferable::_PasteOLE( rData, rSh, nFormat,
1425*b1cdbd2cSJim Jagielski 												nActionFlags,bMsg );
1426*b1cdbd2cSJim Jagielski 			break;
1427*b1cdbd2cSJim Jagielski 
1428*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_DDE:
1429*b1cdbd2cSJim Jagielski 			{
1430*b1cdbd2cSJim Jagielski 				sal_Bool bReRead = 0 != CNT_HasGrf( rSh.GetCntType() );
1431*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteDDE( rData, rSh, bReRead, bMsg );
1432*b1cdbd2cSJim Jagielski 			}
1433*b1cdbd2cSJim Jagielski 			break;
1434*b1cdbd2cSJim Jagielski 
1435*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_HYPERLINK:
1436*b1cdbd2cSJim Jagielski 			{
1437*b1cdbd2cSJim Jagielski 				String sURL, sDesc;
1438*b1cdbd2cSJim Jagielski 				if( SOT_FORMAT_FILE == nFormat )
1439*b1cdbd2cSJim Jagielski 				{
1440*b1cdbd2cSJim Jagielski 					if( rData.GetString( nFormat, sURL ) && sURL.Len() )
1441*b1cdbd2cSJim Jagielski 					{
1442*b1cdbd2cSJim Jagielski 						SwTransferable::_CheckForURLOrLNKFile( rData, sURL, &sDesc );
1443*b1cdbd2cSJim Jagielski 						if( !sDesc.Len() )
1444*b1cdbd2cSJim Jagielski 							sDesc = sURL;
1445*b1cdbd2cSJim Jagielski 						nRet = 1;
1446*b1cdbd2cSJim Jagielski 					}
1447*b1cdbd2cSJim Jagielski 				}
1448*b1cdbd2cSJim Jagielski 				else
1449*b1cdbd2cSJim Jagielski 				{
1450*b1cdbd2cSJim Jagielski 					INetBookmark aBkmk;
1451*b1cdbd2cSJim Jagielski 					if( rData.GetINetBookmark( nFormat, aBkmk ) )
1452*b1cdbd2cSJim Jagielski 					{
1453*b1cdbd2cSJim Jagielski 						sURL = aBkmk.GetURL();
1454*b1cdbd2cSJim Jagielski 						sDesc = aBkmk.GetDescription();
1455*b1cdbd2cSJim Jagielski 						nRet = 1;
1456*b1cdbd2cSJim Jagielski 					}
1457*b1cdbd2cSJim Jagielski 				}
1458*b1cdbd2cSJim Jagielski 
1459*b1cdbd2cSJim Jagielski 				if( nRet )
1460*b1cdbd2cSJim Jagielski 				{
1461*b1cdbd2cSJim Jagielski 					SwFmtINetFmt aFmt( sURL, aEmptyStr );
1462*b1cdbd2cSJim Jagielski 					rSh.InsertURL( aFmt, sDesc );
1463*b1cdbd2cSJim Jagielski 				}
1464*b1cdbd2cSJim Jagielski 			}
1465*b1cdbd2cSJim Jagielski 			break;
1466*b1cdbd2cSJim Jagielski 
1467*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_GET_ATTRIBUTES:
1468*b1cdbd2cSJim Jagielski 			switch( nFormat )
1469*b1cdbd2cSJim Jagielski 			{
1470*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_DRAWING:
1471*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteSdrFormat( rData, rSh,
1472*b1cdbd2cSJim Jagielski 												SW_PASTESDR_SETATTR, pPt,
1473*b1cdbd2cSJim Jagielski 												nActionFlags, bNeedToSelectBeforePaste);
1474*b1cdbd2cSJim Jagielski 				break;
1475*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_SVXB:
1476*b1cdbd2cSJim Jagielski 			case SOT_FORMAT_GDIMETAFILE:
1477*b1cdbd2cSJim Jagielski 			case SOT_FORMAT_BITMAP:
1478*b1cdbd2cSJim Jagielski             case SOT_FORMATSTR_ID_PNG:
1479*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK:
1480*b1cdbd2cSJim Jagielski 			case SOT_FORMAT_FILE:
1481*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR:
1482*b1cdbd2cSJim Jagielski 			case SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR:
1483*b1cdbd2cSJim Jagielski 				nRet = SwTransferable::_PasteGrf( rData, rSh, nFormat,
1484*b1cdbd2cSJim Jagielski 												SW_PASTESDR_SETATTR, pPt,
1485*b1cdbd2cSJim Jagielski 												nActionFlags, nDropAction, bNeedToSelectBeforePaste);
1486*b1cdbd2cSJim Jagielski 				break;
1487*b1cdbd2cSJim Jagielski 			default:
1488*b1cdbd2cSJim Jagielski 				ASSERT( sal_False, "unbekanntes Format" );
1489*b1cdbd2cSJim Jagielski 			}
1490*b1cdbd2cSJim Jagielski 
1491*b1cdbd2cSJim Jagielski 			break;
1492*b1cdbd2cSJim Jagielski 
1493*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_DRAWOBJ:
1494*b1cdbd2cSJim Jagielski 			nRet = SwTransferable::_PasteSdrFormat( rData, rSh,
1495*b1cdbd2cSJim Jagielski 												SW_PASTESDR_INSERT, pPt,
1496*b1cdbd2cSJim Jagielski 												nActionFlags, bNeedToSelectBeforePaste);
1497*b1cdbd2cSJim Jagielski 			break;
1498*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_SVXB:
1499*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_GDIMETAFILE:
1500*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_BITMAP:
1501*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_GRAPH:
1502*b1cdbd2cSJim Jagielski 			nRet = SwTransferable::_PasteGrf( rData, rSh, nFormat,
1503*b1cdbd2cSJim Jagielski 												SW_PASTESDR_INSERT, pPt,
1504*b1cdbd2cSJim Jagielski 												nActionFlags, nDropAction, bNeedToSelectBeforePaste);
1505*b1cdbd2cSJim Jagielski 			break;
1506*b1cdbd2cSJim Jagielski 
1507*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_REPLACE_DRAWOBJ:
1508*b1cdbd2cSJim Jagielski 			nRet = SwTransferable::_PasteSdrFormat( rData, rSh,
1509*b1cdbd2cSJim Jagielski 												SW_PASTESDR_REPLACE, pPt,
1510*b1cdbd2cSJim Jagielski 												nActionFlags, bNeedToSelectBeforePaste);
1511*b1cdbd2cSJim Jagielski 			break;
1512*b1cdbd2cSJim Jagielski 
1513*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_REPLACE_SVXB:
1514*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_REPLACE_GDIMETAFILE:
1515*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_REPLACE_BITMAP:
1516*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_REPLACE_GRAPH:
1517*b1cdbd2cSJim Jagielski 			nRet = SwTransferable::_PasteGrf( rData, rSh, nFormat,
1518*b1cdbd2cSJim Jagielski 												SW_PASTESDR_REPLACE,pPt,
1519*b1cdbd2cSJim Jagielski 												nActionFlags, nDropAction, bNeedToSelectBeforePaste);
1520*b1cdbd2cSJim Jagielski 			break;
1521*b1cdbd2cSJim Jagielski 
1522*b1cdbd2cSJim Jagielski 		case EXCHG_OUT_ACTION_INSERT_INTERACTIVE:
1523*b1cdbd2cSJim Jagielski 			nRet = SwTransferable::_PasteAsHyperlink( rData, rSh, nFormat );
1524*b1cdbd2cSJim Jagielski 			break;
1525*b1cdbd2cSJim Jagielski 
1526*b1cdbd2cSJim Jagielski 		default:
1527*b1cdbd2cSJim Jagielski 			ASSERT( sal_False, "unbekannte Action" );
1528*b1cdbd2cSJim Jagielski 		}
1529*b1cdbd2cSJim Jagielski 	}
1530*b1cdbd2cSJim Jagielski 
1531*b1cdbd2cSJim Jagielski 	if( !bPasteSelection && rSh.IsFrmSelected() )
1532*b1cdbd2cSJim Jagielski 	{
1533*b1cdbd2cSJim Jagielski 		rSh.EnterSelFrmMode();
1534*b1cdbd2cSJim Jagielski 		//force ::SelectShell
1535*b1cdbd2cSJim Jagielski 		rSh.GetView().StopShellTimer();
1536*b1cdbd2cSJim Jagielski 	}
1537*b1cdbd2cSJim Jagielski 
1538*b1cdbd2cSJim Jagielski 	if( pAction )
1539*b1cdbd2cSJim Jagielski 		delete pAction;
1540*b1cdbd2cSJim Jagielski     if( bCallAutoCaption )
1541*b1cdbd2cSJim Jagielski         rSh.GetView().AutoCaption( GRAPHIC_CAP );
1542*b1cdbd2cSJim Jagielski 
1543*b1cdbd2cSJim Jagielski 	return nRet;
1544*b1cdbd2cSJim Jagielski }
1545*b1cdbd2cSJim Jagielski 
1546*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1547*b1cdbd2cSJim Jagielski 
GetSotDestination(const SwWrtShell & rSh,const Point * pPt)1548*b1cdbd2cSJim Jagielski sal_uInt16 SwTransferable::GetSotDestination( const SwWrtShell& rSh,
1549*b1cdbd2cSJim Jagielski 											const Point* pPt )
1550*b1cdbd2cSJim Jagielski {
1551*b1cdbd2cSJim Jagielski 	sal_uInt16 nRet = EXCHG_INOUT_ACTION_NONE;
1552*b1cdbd2cSJim Jagielski 
1553*b1cdbd2cSJim Jagielski 	ObjCntType eOType;
1554*b1cdbd2cSJim Jagielski 	if( pPt )
1555*b1cdbd2cSJim Jagielski 	{
1556*b1cdbd2cSJim Jagielski 		SdrObject *pObj = 0;
1557*b1cdbd2cSJim Jagielski 		eOType = rSh.GetObjCntType( *pPt, pObj );
1558*b1cdbd2cSJim Jagielski 	}
1559*b1cdbd2cSJim Jagielski 	else
1560*b1cdbd2cSJim Jagielski 		eOType = rSh.GetObjCntTypeOfSelection();
1561*b1cdbd2cSJim Jagielski 
1562*b1cdbd2cSJim Jagielski 	switch( eOType )
1563*b1cdbd2cSJim Jagielski 	{
1564*b1cdbd2cSJim Jagielski 	case OBJCNT_GRF:
1565*b1cdbd2cSJim Jagielski 		{
1566*b1cdbd2cSJim Jagielski 			sal_Bool bIMap, bLink;
1567*b1cdbd2cSJim Jagielski 			if( pPt )
1568*b1cdbd2cSJim Jagielski 			{
1569*b1cdbd2cSJim Jagielski 				bIMap = 0 != rSh.GetFmtFromObj( *pPt )->GetURL().GetMap();
1570*b1cdbd2cSJim Jagielski 				String aDummy;
1571*b1cdbd2cSJim Jagielski 				rSh.GetGrfAtPos( *pPt, aDummy, bLink );
1572*b1cdbd2cSJim Jagielski 			}
1573*b1cdbd2cSJim Jagielski 			else
1574*b1cdbd2cSJim Jagielski 			{
1575*b1cdbd2cSJim Jagielski 				bIMap = 0 != rSh.GetFlyFrmFmt()->GetURL().GetMap();
1576*b1cdbd2cSJim Jagielski 				String aDummy;
1577*b1cdbd2cSJim Jagielski 				rSh.GetGrfNms( &aDummy, 0 );
1578*b1cdbd2cSJim Jagielski 				bLink = 0 != aDummy.Len();
1579*b1cdbd2cSJim Jagielski 			}
1580*b1cdbd2cSJim Jagielski 
1581*b1cdbd2cSJim Jagielski 			if( bLink && bIMap )
1582*b1cdbd2cSJim Jagielski 				nRet = EXCHG_DEST_DOC_LNKD_GRAPH_W_IMAP;
1583*b1cdbd2cSJim Jagielski 			else if( bLink )
1584*b1cdbd2cSJim Jagielski 				nRet = EXCHG_DEST_DOC_LNKD_GRAPHOBJ;
1585*b1cdbd2cSJim Jagielski 			else if( bIMap )
1586*b1cdbd2cSJim Jagielski 				nRet = EXCHG_DEST_DOC_GRAPH_W_IMAP;
1587*b1cdbd2cSJim Jagielski 			else
1588*b1cdbd2cSJim Jagielski 				nRet = EXCHG_DEST_DOC_GRAPHOBJ;
1589*b1cdbd2cSJim Jagielski 		}
1590*b1cdbd2cSJim Jagielski 		break;
1591*b1cdbd2cSJim Jagielski 
1592*b1cdbd2cSJim Jagielski 	case OBJCNT_FLY:
1593*b1cdbd2cSJim Jagielski 		if( rSh.GetView().GetDocShell()->ISA(SwWebDocShell) )
1594*b1cdbd2cSJim Jagielski 			nRet = EXCHG_DEST_DOC_TEXTFRAME_WEB;
1595*b1cdbd2cSJim Jagielski 		else
1596*b1cdbd2cSJim Jagielski 			nRet = EXCHG_DEST_DOC_TEXTFRAME;
1597*b1cdbd2cSJim Jagielski 		break;
1598*b1cdbd2cSJim Jagielski 	case OBJCNT_OLE:		nRet = EXCHG_DEST_DOC_OLEOBJ;		break;
1599*b1cdbd2cSJim Jagielski 
1600*b1cdbd2cSJim Jagielski 	case OBJCNT_CONTROL:	/* no Action avail */
1601*b1cdbd2cSJim Jagielski 	case OBJCNT_SIMPLE:		nRet = EXCHG_DEST_DOC_DRAWOBJ; 		break;
1602*b1cdbd2cSJim Jagielski 	case OBJCNT_URLBUTTON:	nRet = EXCHG_DEST_DOC_URLBUTTON; 	break;
1603*b1cdbd2cSJim Jagielski 	case OBJCNT_GROUPOBJ:	nRet = EXCHG_DEST_DOC_GROUPOBJ;		break;
1604*b1cdbd2cSJim Jagielski 
1605*b1cdbd2cSJim Jagielski // was mmchen wir bei Mehrfachselektion???
1606*b1cdbd2cSJim Jagielski //	case OBJCNT_DONTCARE:
1607*b1cdbd2cSJim Jagielski 	default:
1608*b1cdbd2cSJim Jagielski 		{
1609*b1cdbd2cSJim Jagielski /*
1610*b1cdbd2cSJim Jagielski JP 13.07.98: Bug 52637: es wird ein URL-Feld erkannt also werden nur die
1611*b1cdbd2cSJim Jagielski 						Inhalte zugelassen. Das ist aber bestimmt nicht das
1612*b1cdbd2cSJim Jagielski 						gewollte.
1613*b1cdbd2cSJim Jagielski 			SwContentAtPos aCntntAtPos( SwContentAtPos::SW_INETATTR );
1614*b1cdbd2cSJim Jagielski 			SfxItemSet aSet( (SfxItemPool&)rSh.GetAttrPool(),
1615*b1cdbd2cSJim Jagielski 							RES_TXTATR_INETFMT, RES_TXTATR_INETFMT );
1616*b1cdbd2cSJim Jagielski 			if( pPt ? ((SwWrtShell&)rSh).GetContentAtPos( *pPt, aCntntAtPos, sal_False )
1617*b1cdbd2cSJim Jagielski 					 : (rSh.GetAttr( aSet ) && aSet.Count()) )
1618*b1cdbd2cSJim Jagielski 				nRet = EXCHG_DEST_DOC_URLFIELD;
1619*b1cdbd2cSJim Jagielski 			else
1620*b1cdbd2cSJim Jagielski */
1621*b1cdbd2cSJim Jagielski 			if( rSh.GetView().GetDocShell()->ISA(SwWebDocShell) )
1622*b1cdbd2cSJim Jagielski 				nRet = EXCHG_DEST_SWDOC_FREE_AREA_WEB;
1623*b1cdbd2cSJim Jagielski 			else
1624*b1cdbd2cSJim Jagielski 				nRet = EXCHG_DEST_SWDOC_FREE_AREA;
1625*b1cdbd2cSJim Jagielski 		}
1626*b1cdbd2cSJim Jagielski 	}
1627*b1cdbd2cSJim Jagielski 
1628*b1cdbd2cSJim Jagielski 	return nRet;
1629*b1cdbd2cSJim Jagielski }
1630*b1cdbd2cSJim Jagielski 
1631*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1632*b1cdbd2cSJim Jagielski 
_PasteFileContent(TransferableDataHelper & rData,SwWrtShell & rSh,sal_uLong nFmt,sal_Bool bMsg)1633*b1cdbd2cSJim Jagielski int SwTransferable::_PasteFileContent( TransferableDataHelper& rData,
1634*b1cdbd2cSJim Jagielski 									SwWrtShell& rSh, sal_uLong nFmt, sal_Bool bMsg )
1635*b1cdbd2cSJim Jagielski {
1636*b1cdbd2cSJim Jagielski 	sal_uInt16 nResId = MSG_CLPBRD_FORMAT_ERROR;
1637*b1cdbd2cSJim Jagielski 	int nRet = 0;
1638*b1cdbd2cSJim Jagielski 
1639*b1cdbd2cSJim Jagielski 	MSE40HTMLClipFormatObj aMSE40ClpObj;
1640*b1cdbd2cSJim Jagielski 
1641*b1cdbd2cSJim Jagielski 	SotStorageStreamRef xStrm;
1642*b1cdbd2cSJim Jagielski 	SvStream* pStream = 0;
1643*b1cdbd2cSJim Jagielski 	SwRead pRead = 0;
1644*b1cdbd2cSJim Jagielski 	rtl::OUString sData;
1645*b1cdbd2cSJim Jagielski 	switch( nFmt )
1646*b1cdbd2cSJim Jagielski 	{
1647*b1cdbd2cSJim Jagielski 	case SOT_FORMAT_STRING:
1648*b1cdbd2cSJim Jagielski 		{
1649*b1cdbd2cSJim Jagielski 			pRead = ReadAscii;
1650*b1cdbd2cSJim Jagielski 			if( rData.GetString( nFmt, sData ) )
1651*b1cdbd2cSJim Jagielski 			{
1652*b1cdbd2cSJim Jagielski 				pStream = new SvMemoryStream( (void*)sData.getStr(),
1653*b1cdbd2cSJim Jagielski 							sData.getLength() * sizeof( sal_Unicode ),
1654*b1cdbd2cSJim Jagielski 							STREAM_READ );
1655*b1cdbd2cSJim Jagielski #ifdef OSL_BIGENDIAN
1656*b1cdbd2cSJim Jagielski 				pStream->SetNumberFormatInt( NUMBERFORMAT_INT_BIGENDIAN );
1657*b1cdbd2cSJim Jagielski #else
1658*b1cdbd2cSJim Jagielski 				pStream->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
1659*b1cdbd2cSJim Jagielski #endif
1660*b1cdbd2cSJim Jagielski 
1661*b1cdbd2cSJim Jagielski 				SwAsciiOptions aAOpt;
1662*b1cdbd2cSJim Jagielski 				aAOpt.SetCharSet( RTL_TEXTENCODING_UCS2 );
1663*b1cdbd2cSJim Jagielski 				pRead->GetReaderOpt().SetASCIIOpts( aAOpt );
1664*b1cdbd2cSJim Jagielski 				break;
1665*b1cdbd2cSJim Jagielski 			}
1666*b1cdbd2cSJim Jagielski 		}
1667*b1cdbd2cSJim Jagielski 		// no break - because then test if we get a stream
1668*b1cdbd2cSJim Jagielski 
1669*b1cdbd2cSJim Jagielski 	default:
1670*b1cdbd2cSJim Jagielski 		if( rData.GetSotStorageStream( nFmt, xStrm ) )
1671*b1cdbd2cSJim Jagielski 		{
1672*b1cdbd2cSJim Jagielski 			if( ( SOT_FORMATSTR_ID_HTML_SIMPLE == nFmt ) ||
1673*b1cdbd2cSJim Jagielski                 ( SOT_FORMATSTR_ID_HTML_NO_COMMENT == nFmt ) )
1674*b1cdbd2cSJim Jagielski 			{
1675*b1cdbd2cSJim Jagielski 				pStream = aMSE40ClpObj.IsValid( *xStrm );
1676*b1cdbd2cSJim Jagielski 				pRead = ReadHTML;
1677*b1cdbd2cSJim Jagielski 				pRead->SetReadUTF8( sal_True );
1678*b1cdbd2cSJim Jagielski                 //pRead->SetBaseURL( aMSE40ClpObj.GetBaseURL() );
1679*b1cdbd2cSJim Jagielski 
1680*b1cdbd2cSJim Jagielski                 sal_Bool bNoComments =
1681*b1cdbd2cSJim Jagielski                     ( nFmt == SOT_FORMATSTR_ID_HTML_NO_COMMENT );
1682*b1cdbd2cSJim Jagielski                 pRead->SetIgnoreHTMLComments( bNoComments );
1683*b1cdbd2cSJim Jagielski 			}
1684*b1cdbd2cSJim Jagielski 			else
1685*b1cdbd2cSJim Jagielski 			{
1686*b1cdbd2cSJim Jagielski 				pStream = &xStrm;
1687*b1cdbd2cSJim Jagielski 				if( SOT_FORMAT_RTF == nFmt )
1688*b1cdbd2cSJim Jagielski 					pRead = SwReaderWriter::GetReader( READER_WRITER_RTF );
1689*b1cdbd2cSJim Jagielski 				else if( !pRead )
1690*b1cdbd2cSJim Jagielski                 {
1691*b1cdbd2cSJim Jagielski 					pRead = ReadHTML;
1692*b1cdbd2cSJim Jagielski     				pRead->SetReadUTF8( sal_True );
1693*b1cdbd2cSJim Jagielski                 }
1694*b1cdbd2cSJim Jagielski 			}
1695*b1cdbd2cSJim Jagielski 		}
1696*b1cdbd2cSJim Jagielski 		break;
1697*b1cdbd2cSJim Jagielski 	}
1698*b1cdbd2cSJim Jagielski 
1699*b1cdbd2cSJim Jagielski 	if( pStream && pRead )
1700*b1cdbd2cSJim Jagielski 	{
1701*b1cdbd2cSJim Jagielski 		Link aOldLink( rSh.GetChgLnk() );
1702*b1cdbd2cSJim Jagielski 		rSh.SetChgLnk( Link() );
1703*b1cdbd2cSJim Jagielski 
1704*b1cdbd2cSJim Jagielski         const SwPosition& rInsPos = *rSh.GetCrsr()->Start();
1705*b1cdbd2cSJim Jagielski 		SwReader aReader( *pStream, aEmptyStr, String(), *rSh.GetCrsr() );
1706*b1cdbd2cSJim Jagielski 		rSh.SaveTblBoxCntnt( &rInsPos );
1707*b1cdbd2cSJim Jagielski 		if( IsError( aReader.Read( *pRead )) )
1708*b1cdbd2cSJim Jagielski 			nResId = ERR_CLPBRD_READ;
1709*b1cdbd2cSJim Jagielski 		else
1710*b1cdbd2cSJim Jagielski 			nResId = 0, nRet = 1;
1711*b1cdbd2cSJim Jagielski 
1712*b1cdbd2cSJim Jagielski 		rSh.SetChgLnk( aOldLink );
1713*b1cdbd2cSJim Jagielski 		if( nRet )
1714*b1cdbd2cSJim Jagielski 			rSh.CallChgLnk();
1715*b1cdbd2cSJim Jagielski 	}
1716*b1cdbd2cSJim Jagielski 	else
1717*b1cdbd2cSJim Jagielski 		nResId = MSG_CLPBRD_FORMAT_ERROR;
1718*b1cdbd2cSJim Jagielski 
1719*b1cdbd2cSJim Jagielski 	// Exist a SvMemoryStream? (data in the OUString and xStrm is empty)
1720*b1cdbd2cSJim Jagielski 	if( pStream && !xStrm.Is() )
1721*b1cdbd2cSJim Jagielski 		delete pStream;
1722*b1cdbd2cSJim Jagielski 
1723*b1cdbd2cSJim Jagielski 	if( bMsg && nResId )
1724*b1cdbd2cSJim Jagielski 	{
1725*b1cdbd2cSJim Jagielski 		InfoBox( 0, SW_RES( nResId )).Execute();
1726*b1cdbd2cSJim Jagielski 	}
1727*b1cdbd2cSJim Jagielski 	return nRet;
1728*b1cdbd2cSJim Jagielski }
1729*b1cdbd2cSJim Jagielski 
1730*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1731*b1cdbd2cSJim Jagielski 
_PasteOLE(TransferableDataHelper & rData,SwWrtShell & rSh,sal_uLong nFmt,sal_uInt8 nActionFlags,sal_Bool bMsg)1732*b1cdbd2cSJim Jagielski int SwTransferable::_PasteOLE( TransferableDataHelper& rData, SwWrtShell& rSh,
1733*b1cdbd2cSJim Jagielski 								sal_uLong nFmt, sal_uInt8 nActionFlags, sal_Bool bMsg )
1734*b1cdbd2cSJim Jagielski {
1735*b1cdbd2cSJim Jagielski 	int nRet = 0;
1736*b1cdbd2cSJim Jagielski 	TransferableObjectDescriptor aObjDesc;
1737*b1cdbd2cSJim Jagielski     uno::Reference < io::XInputStream > xStrm;
1738*b1cdbd2cSJim Jagielski     uno::Reference < embed::XStorage > xStore;
1739*b1cdbd2cSJim Jagielski 	Reader* pRead = 0;
1740*b1cdbd2cSJim Jagielski 
1741*b1cdbd2cSJim Jagielski     // Get the preferred format
1742*b1cdbd2cSJim Jagielski     SotFormatStringId nId;
1743*b1cdbd2cSJim Jagielski 	if( rData.HasFormat( SOT_FORMATSTR_ID_EMBEDDED_OBJ ) )
1744*b1cdbd2cSJim Jagielski 		nId = SOT_FORMATSTR_ID_EMBEDDED_OBJ;
1745*b1cdbd2cSJim Jagielski 	else if( rData.HasFormat( SOT_FORMATSTR_ID_EMBED_SOURCE ) &&
1746*b1cdbd2cSJim Jagielski 			 rData.HasFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ))
1747*b1cdbd2cSJim Jagielski 		nId = SOT_FORMATSTR_ID_EMBED_SOURCE;
1748*b1cdbd2cSJim Jagielski 	else
1749*b1cdbd2cSJim Jagielski 		nId = 0;
1750*b1cdbd2cSJim Jagielski 
1751*b1cdbd2cSJim Jagielski     if( nId && rData.GetInputStream( nId, xStrm ) && xStrm.is() )
1752*b1cdbd2cSJim Jagielski 	{
1753*b1cdbd2cSJim Jagielski         // if there is an embedded object, first try if it's a writer object
1754*b1cdbd2cSJim Jagielski         // this will be inserted into the document by using a Reader
1755*b1cdbd2cSJim Jagielski         try
1756*b1cdbd2cSJim Jagielski         {
1757*b1cdbd2cSJim Jagielski             xStore = comphelper::OStorageHelper::GetStorageFromInputStream( xStrm );
1758*b1cdbd2cSJim Jagielski             switch( SotStorage::GetFormatID( xStore ) )
1759*b1cdbd2cSJim Jagielski             {
1760*b1cdbd2cSJim Jagielski                 case SOT_FORMATSTR_ID_STARWRITER_60:
1761*b1cdbd2cSJim Jagielski                 case SOT_FORMATSTR_ID_STARWRITERWEB_60:
1762*b1cdbd2cSJim Jagielski                 case SOT_FORMATSTR_ID_STARWRITERGLOB_60:
1763*b1cdbd2cSJim Jagielski 				case SOT_FORMATSTR_ID_STARWRITER_8:
1764*b1cdbd2cSJim Jagielski 				case SOT_FORMATSTR_ID_STARWRITERWEB_8:
1765*b1cdbd2cSJim Jagielski 				case SOT_FORMATSTR_ID_STARWRITERGLOB_8:
1766*b1cdbd2cSJim Jagielski                     pRead = ReadXML;
1767*b1cdbd2cSJim Jagielski                     break;
1768*b1cdbd2cSJim Jagielski                 default:
1769*b1cdbd2cSJim Jagielski                     try
1770*b1cdbd2cSJim Jagielski                     {
1771*b1cdbd2cSJim Jagielski                         uno::Reference < lang::XComponent > xComp( xStore, uno::UNO_QUERY );
1772*b1cdbd2cSJim Jagielski                         xComp->dispose();
1773*b1cdbd2cSJim Jagielski                         xStore = 0;
1774*b1cdbd2cSJim Jagielski                     }
1775*b1cdbd2cSJim Jagielski                     catch ( uno::Exception& )
1776*b1cdbd2cSJim Jagielski                     {
1777*b1cdbd2cSJim Jagielski                     }
1778*b1cdbd2cSJim Jagielski 
1779*b1cdbd2cSJim Jagielski                     break;
1780*b1cdbd2cSJim Jagielski             }
1781*b1cdbd2cSJim Jagielski         }
1782*b1cdbd2cSJim Jagielski         catch ( uno::Exception& )
1783*b1cdbd2cSJim Jagielski         {
1784*b1cdbd2cSJim Jagielski             // it wasn't a storage, but maybe it's a useful stream
1785*b1cdbd2cSJim Jagielski         }
1786*b1cdbd2cSJim Jagielski 
1787*b1cdbd2cSJim Jagielski         nFmt = nId;
1788*b1cdbd2cSJim Jagielski 	}
1789*b1cdbd2cSJim Jagielski 
1790*b1cdbd2cSJim Jagielski     if( pRead )
1791*b1cdbd2cSJim Jagielski 	{
1792*b1cdbd2cSJim Jagielski 		SwPaM &rPAM = *rSh.GetCrsr();
1793*b1cdbd2cSJim Jagielski         SwReader aReader( xStore, aEmptyStr, rPAM );
1794*b1cdbd2cSJim Jagielski         if( !IsError( aReader.Read( *pRead )) )
1795*b1cdbd2cSJim Jagielski             nRet = 1;
1796*b1cdbd2cSJim Jagielski         else if( bMsg )
1797*b1cdbd2cSJim Jagielski             InfoBox( 0, SW_RES(ERR_CLPBRD_READ) ).Execute();
1798*b1cdbd2cSJim Jagielski 	}
1799*b1cdbd2cSJim Jagielski     else
1800*b1cdbd2cSJim Jagielski 	{
1801*b1cdbd2cSJim Jagielski        	// temporary storage until the object is inserted
1802*b1cdbd2cSJim Jagielski 		uno::Reference< embed::XStorage > xTmpStor;
1803*b1cdbd2cSJim Jagielski         uno::Reference < embed::XEmbeddedObject > xObj;
1804*b1cdbd2cSJim Jagielski         ::rtl::OUString aName;
1805*b1cdbd2cSJim Jagielski        	comphelper::EmbeddedObjectContainer aCnt;
1806*b1cdbd2cSJim Jagielski 
1807*b1cdbd2cSJim Jagielski 		if ( xStrm.is() )
1808*b1cdbd2cSJim Jagielski 		{
1809*b1cdbd2cSJim Jagielski 			if ( !rData.GetTransferableObjectDescriptor( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aObjDesc ) )
1810*b1cdbd2cSJim Jagielski 			{
1811*b1cdbd2cSJim Jagielski 				DBG_ASSERT( !xStrm.is(), "An object without descriptor in clipboard!");
1812*b1cdbd2cSJim Jagielski 			}
1813*b1cdbd2cSJim Jagielski 		}
1814*b1cdbd2cSJim Jagielski 		else
1815*b1cdbd2cSJim Jagielski 		{
1816*b1cdbd2cSJim Jagielski 			if( rData.HasFormat( nFmt = SOT_FORMATSTR_ID_OBJECTDESCRIPTOR_OLE ) && rData.GetTransferableObjectDescriptor( nFmt, aObjDesc ) )
1817*b1cdbd2cSJim Jagielski  			{
1818*b1cdbd2cSJim Jagielski             	if ( !rData.GetInputStream( SOT_FORMATSTR_ID_EMBED_SOURCE_OLE, xStrm ) )
1819*b1cdbd2cSJim Jagielski                 	rData.GetInputStream( SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE, xStrm );
1820*b1cdbd2cSJim Jagielski 
1821*b1cdbd2cSJim Jagielski 				if ( !xStrm.is() )
1822*b1cdbd2cSJim Jagielski 				{
1823*b1cdbd2cSJim Jagielski 					// This is MSOLE object that should be created by direct using of system clipboard
1824*b1cdbd2cSJim Jagielski 					try
1825*b1cdbd2cSJim Jagielski 					{
1826*b1cdbd2cSJim Jagielski 						xTmpStor = ::comphelper::OStorageHelper::GetTemporaryStorage();
1827*b1cdbd2cSJim Jagielski 						uno::Reference < embed::XEmbedObjectClipboardCreator > xClipboardCreator(
1828*b1cdbd2cSJim Jagielski 							::comphelper::getProcessServiceFactory()->createInstance( ::rtl::OUString(
1829*b1cdbd2cSJim Jagielski 											RTL_CONSTASCII_USTRINGPARAM("com.sun.star.embed.MSOLEObjectSystemCreator")) ),
1830*b1cdbd2cSJim Jagielski 							uno::UNO_QUERY_THROW );
1831*b1cdbd2cSJim Jagielski 
1832*b1cdbd2cSJim Jagielski 						embed::InsertedObjectInfo aInfo = xClipboardCreator->createInstanceInitFromClipboard(
1833*b1cdbd2cSJim Jagielski 															xTmpStor,
1834*b1cdbd2cSJim Jagielski 															::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "DummyName" ) ),
1835*b1cdbd2cSJim Jagielski 															uno::Sequence< beans::PropertyValue >() );
1836*b1cdbd2cSJim Jagielski 
1837*b1cdbd2cSJim Jagielski 						// TODO/LATER: in future InsertedObjectInfo will be used to get container related information
1838*b1cdbd2cSJim Jagielski 						// for example whether the object should be an iconified one
1839*b1cdbd2cSJim Jagielski 						xObj = aInfo.Object;
1840*b1cdbd2cSJim Jagielski 					}
1841*b1cdbd2cSJim Jagielski 					catch( uno::Exception& )
1842*b1cdbd2cSJim Jagielski 					{}
1843*b1cdbd2cSJim Jagielski 				}
1844*b1cdbd2cSJim Jagielski 			}
1845*b1cdbd2cSJim Jagielski     	}
1846*b1cdbd2cSJim Jagielski 
1847*b1cdbd2cSJim Jagielski 		if ( xStrm.is() && !xObj.is() )
1848*b1cdbd2cSJim Jagielski         	xObj = aCnt.InsertEmbeddedObject( xStrm, aName );
1849*b1cdbd2cSJim Jagielski 
1850*b1cdbd2cSJim Jagielski         if( xObj.is() )
1851*b1cdbd2cSJim Jagielski 		{
1852*b1cdbd2cSJim Jagielski 			svt::EmbeddedObjectRef xObjRef( xObj, aObjDesc.mnViewAspect );
1853*b1cdbd2cSJim Jagielski 
1854*b1cdbd2cSJim Jagielski 			// try to get the replacement image from the clipboard
1855*b1cdbd2cSJim Jagielski 			Graphic aGraphic;
1856*b1cdbd2cSJim Jagielski 			sal_uLong nGrFormat = 0;
1857*b1cdbd2cSJim Jagielski 
1858*b1cdbd2cSJim Jagielski // (wg. Selection Manager bei Trustet Solaris)
1859*b1cdbd2cSJim Jagielski #ifndef SOLARIS
1860*b1cdbd2cSJim Jagielski /*
1861*b1cdbd2cSJim Jagielski             if( rData.GetGraphic( SOT_FORMATSTR_ID_SVXB, aGraphic ) )
1862*b1cdbd2cSJim Jagielski 				nGrFormat = SOT_FORMATSTR_ID_SVXB;
1863*b1cdbd2cSJim Jagielski 			else if( rData.GetGraphic( FORMAT_GDIMETAFILE, aGraphic ) )
1864*b1cdbd2cSJim Jagielski 				nGrFormat = SOT_FORMAT_GDIMETAFILE;
1865*b1cdbd2cSJim Jagielski 			else if( rData.GetGraphic( FORMAT_BITMAP, aGraphic ) )
1866*b1cdbd2cSJim Jagielski 				nGrFormat = SOT_FORMAT_BITMAP;
1867*b1cdbd2cSJim Jagielski */
1868*b1cdbd2cSJim Jagielski #endif
1869*b1cdbd2cSJim Jagielski 
1870*b1cdbd2cSJim Jagielski 			// insert replacement image ( if there is one ) into the object helper
1871*b1cdbd2cSJim Jagielski 			if ( nGrFormat )
1872*b1cdbd2cSJim Jagielski 			{
1873*b1cdbd2cSJim Jagielski 				datatransfer::DataFlavor aDataFlavor;
1874*b1cdbd2cSJim Jagielski 				SotExchange::GetFormatDataFlavor( nGrFormat, aDataFlavor );
1875*b1cdbd2cSJim Jagielski                	xObjRef.SetGraphic( aGraphic, aDataFlavor.MimeType );
1876*b1cdbd2cSJim Jagielski 			}
1877*b1cdbd2cSJim Jagielski 			else if ( aObjDesc.mnViewAspect == embed::Aspects::MSOLE_ICON )
1878*b1cdbd2cSJim Jagielski 			{
1879*b1cdbd2cSJim Jagielski 				// it is important to have an icon, let an empty graphic be used
1880*b1cdbd2cSJim Jagielski 				// if no other graphic is provided
1881*b1cdbd2cSJim Jagielski 				// TODO/LATER: in future a default bitmap could be used
1882*b1cdbd2cSJim Jagielski 				::rtl::OUString aMimeType;
1883*b1cdbd2cSJim Jagielski 				MapMode aMapMode( MAP_100TH_MM );
1884*b1cdbd2cSJim Jagielski 				aGraphic.SetPrefSize( Size( 2500, 2500 ) );
1885*b1cdbd2cSJim Jagielski 				aGraphic.SetPrefMapMode( aMapMode );
1886*b1cdbd2cSJim Jagielski                	xObjRef.SetGraphic( aGraphic, aMimeType );
1887*b1cdbd2cSJim Jagielski 			}
1888*b1cdbd2cSJim Jagielski 
1889*b1cdbd2cSJim Jagielski 			//Size einstellen. Ist ein Hack wg. Auslieferung, die Size sollte
1890*b1cdbd2cSJim Jagielski 			//an das InsertOle uebergeben werden!!!!!!!!!!
1891*b1cdbd2cSJim Jagielski 			Size aSize;
1892*b1cdbd2cSJim Jagielski 			if ( aObjDesc.mnViewAspect == embed::Aspects::MSOLE_ICON )
1893*b1cdbd2cSJim Jagielski 			{
1894*b1cdbd2cSJim Jagielski                	if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() )
1895*b1cdbd2cSJim Jagielski 					aSize = aObjDesc.maSize;
1896*b1cdbd2cSJim Jagielski 				else
1897*b1cdbd2cSJim Jagielski 				{
1898*b1cdbd2cSJim Jagielski 					MapMode aMapMode( MAP_100TH_MM );
1899*b1cdbd2cSJim Jagielski 					aSize = xObjRef.GetSize( &aMapMode );
1900*b1cdbd2cSJim Jagielski 				}
1901*b1cdbd2cSJim Jagielski 			}
1902*b1cdbd2cSJim Jagielski 			else if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() )
1903*b1cdbd2cSJim Jagielski 			{
1904*b1cdbd2cSJim Jagielski             	aSize = Size( aObjDesc.maSize );    //immer 100TH_MM
1905*b1cdbd2cSJim Jagielski                 MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( aObjDesc.mnViewAspect ) );
1906*b1cdbd2cSJim Jagielski                 aSize = OutputDevice::LogicToLogic( aSize, MAP_100TH_MM, aUnit );
1907*b1cdbd2cSJim Jagielski                 awt::Size aSz;
1908*b1cdbd2cSJim Jagielski 				try
1909*b1cdbd2cSJim Jagielski 				{
1910*b1cdbd2cSJim Jagielski 					aSz = xObj->getVisualAreaSize( aObjDesc.mnViewAspect );
1911*b1cdbd2cSJim Jagielski 				}
1912*b1cdbd2cSJim Jagielski 				catch( embed::NoVisualAreaSizeException& )
1913*b1cdbd2cSJim Jagielski 				{
1914*b1cdbd2cSJim Jagielski 					// in this case the provided size is used
1915*b1cdbd2cSJim Jagielski 				}
1916*b1cdbd2cSJim Jagielski 
1917*b1cdbd2cSJim Jagielski 				if ( aSz.Width != aSize.Width() || aSz.Height != aSize.Height() )
1918*b1cdbd2cSJim Jagielski 				{
1919*b1cdbd2cSJim Jagielski                 	aSz.Width = aSize.Width();
1920*b1cdbd2cSJim Jagielski                 	aSz.Height = aSize.Height();
1921*b1cdbd2cSJim Jagielski                 	xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz );
1922*b1cdbd2cSJim Jagielski 				}
1923*b1cdbd2cSJim Jagielski 			}
1924*b1cdbd2cSJim Jagielski 			else
1925*b1cdbd2cSJim Jagielski 			{
1926*b1cdbd2cSJim Jagielski 				// the descriptor contains the wrong object size
1927*b1cdbd2cSJim Jagielski 				// the following call will let the MSOLE objects cache the size if it is possible
1928*b1cdbd2cSJim Jagielski 				// it should be done while the object is running
1929*b1cdbd2cSJim Jagielski 				try
1930*b1cdbd2cSJim Jagielski 				{
1931*b1cdbd2cSJim Jagielski 					xObj->getVisualAreaSize( aObjDesc.mnViewAspect );
1932*b1cdbd2cSJim Jagielski 				}
1933*b1cdbd2cSJim Jagielski 				catch( uno::Exception& )
1934*b1cdbd2cSJim Jagielski 				{
1935*b1cdbd2cSJim Jagielski 				}
1936*b1cdbd2cSJim Jagielski 			}
1937*b1cdbd2cSJim Jagielski 			//Ende mit Hack!
1938*b1cdbd2cSJim Jagielski 
1939*b1cdbd2cSJim Jagielski             rSh.InsertOleObject( xObjRef );
1940*b1cdbd2cSJim Jagielski 			nRet = 1;
1941*b1cdbd2cSJim Jagielski 
1942*b1cdbd2cSJim Jagielski 			if( nRet && ( nActionFlags &
1943*b1cdbd2cSJim Jagielski 				( EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL >> 8) ))
1944*b1cdbd2cSJim Jagielski 				SwTransferable::_PasteTargetURL( rData, rSh, 0, 0, sal_False );
1945*b1cdbd2cSJim Jagielski 
1946*b1cdbd2cSJim Jagielski 			// let the object be unloaded if possible
1947*b1cdbd2cSJim Jagielski 			SwOLEObj::UnloadObject( xObj, rSh.GetDoc(), embed::Aspects::MSOLE_CONTENT );
1948*b1cdbd2cSJim Jagielski 		}
1949*b1cdbd2cSJim Jagielski 	}
1950*b1cdbd2cSJim Jagielski 	return nRet;
1951*b1cdbd2cSJim Jagielski }
1952*b1cdbd2cSJim Jagielski 
1953*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1954*b1cdbd2cSJim Jagielski 
1955*b1cdbd2cSJim Jagielski 
1956*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1957*b1cdbd2cSJim Jagielski 
_PasteTargetURL(TransferableDataHelper & rData,SwWrtShell & rSh,sal_uInt16 nAction,const Point * pPt,sal_Bool bInsertGRF)1958*b1cdbd2cSJim Jagielski int SwTransferable::_PasteTargetURL( TransferableDataHelper& rData,
1959*b1cdbd2cSJim Jagielski 									SwWrtShell& rSh, sal_uInt16 nAction,
1960*b1cdbd2cSJim Jagielski 									const Point* pPt, sal_Bool bInsertGRF )
1961*b1cdbd2cSJim Jagielski {
1962*b1cdbd2cSJim Jagielski 	int nRet = 0;
1963*b1cdbd2cSJim Jagielski 	INetImage aINetImg;
1964*b1cdbd2cSJim Jagielski 	if( ( rData.HasFormat( SOT_FORMATSTR_ID_INET_IMAGE ) &&
1965*b1cdbd2cSJim Jagielski 		  rData.GetINetImage( SOT_FORMATSTR_ID_INET_IMAGE, aINetImg )) ||
1966*b1cdbd2cSJim Jagielski 		( rData.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_IMAGE ) &&
1967*b1cdbd2cSJim Jagielski 		  rData.GetINetImage( SOT_FORMATSTR_ID_NETSCAPE_IMAGE, aINetImg )) )
1968*b1cdbd2cSJim Jagielski 	{
1969*b1cdbd2cSJim Jagielski 		if( aINetImg.GetImageURL().Len() && bInsertGRF )
1970*b1cdbd2cSJim Jagielski 		{
1971*b1cdbd2cSJim Jagielski 			String sURL( aINetImg.GetImageURL() );
1972*b1cdbd2cSJim Jagielski 			SwTransferable::_CheckForURLOrLNKFile( rData, sURL );
1973*b1cdbd2cSJim Jagielski 
1974*b1cdbd2cSJim Jagielski 			//!!! auf FileSystem abpruefen - nur dann ist es sinnvoll die
1975*b1cdbd2cSJim Jagielski 			// Grafiken zu testen !!!!
1976*b1cdbd2cSJim Jagielski 			Graphic aGrf;
1977*b1cdbd2cSJim Jagielski 			GraphicFilter *pFlt = GraphicFilter::GetGraphicFilter();
1978*b1cdbd2cSJim Jagielski 			nRet = GRFILTER_OK == GraphicFilter::LoadGraphic( sURL, aEmptyStr, aGrf, pFlt );
1979*b1cdbd2cSJim Jagielski 			if( nRet )
1980*b1cdbd2cSJim Jagielski 			{
1981*b1cdbd2cSJim Jagielski 				switch( nAction )
1982*b1cdbd2cSJim Jagielski 				{
1983*b1cdbd2cSJim Jagielski 				case SW_PASTESDR_INSERT:
1984*b1cdbd2cSJim Jagielski 					SwTransferable::SetSelInShell( rSh, sal_False, pPt );
1985*b1cdbd2cSJim Jagielski 					rSh.Insert( sURL, aEmptyStr, aGrf );
1986*b1cdbd2cSJim Jagielski 					break;
1987*b1cdbd2cSJim Jagielski 
1988*b1cdbd2cSJim Jagielski 				case SW_PASTESDR_REPLACE:
1989*b1cdbd2cSJim Jagielski 					if( rSh.IsObjSelected() )
1990*b1cdbd2cSJim Jagielski 					{
1991*b1cdbd2cSJim Jagielski 						rSh.ReplaceSdrObj( sURL, aEmptyStr, &aGrf );
1992*b1cdbd2cSJim Jagielski 						Point aPt( pPt ? *pPt : rSh.GetCrsrDocPos() );
1993*b1cdbd2cSJim Jagielski 						SwTransferable::SetSelInShell( rSh, sal_True, &aPt );
1994*b1cdbd2cSJim Jagielski 					}
1995*b1cdbd2cSJim Jagielski 					else
1996*b1cdbd2cSJim Jagielski 						rSh.ReRead( sURL, aEmptyStr, &aGrf );
1997*b1cdbd2cSJim Jagielski 					break;
1998*b1cdbd2cSJim Jagielski 
1999*b1cdbd2cSJim Jagielski 				case SW_PASTESDR_SETATTR:
2000*b1cdbd2cSJim Jagielski 					if( rSh.IsObjSelected() )
2001*b1cdbd2cSJim Jagielski 						rSh.Paste( aGrf, String() );
2002*b1cdbd2cSJim Jagielski 					else if( OBJCNT_GRF == rSh.GetObjCntTypeOfSelection() )
2003*b1cdbd2cSJim Jagielski 						rSh.ReRead( sURL, aEmptyStr, &aGrf );
2004*b1cdbd2cSJim Jagielski 					else
2005*b1cdbd2cSJim Jagielski 					{
2006*b1cdbd2cSJim Jagielski 						SwTransferable::SetSelInShell( rSh, sal_False, pPt );
2007*b1cdbd2cSJim Jagielski 						rSh.Insert( sURL, aEmptyStr, aGrf );
2008*b1cdbd2cSJim Jagielski 					}
2009*b1cdbd2cSJim Jagielski 					break;
2010*b1cdbd2cSJim Jagielski 				default:
2011*b1cdbd2cSJim Jagielski 					nRet = 0;
2012*b1cdbd2cSJim Jagielski 				}
2013*b1cdbd2cSJim Jagielski 			}
2014*b1cdbd2cSJim Jagielski 		}
2015*b1cdbd2cSJim Jagielski 		else
2016*b1cdbd2cSJim Jagielski 			nRet = 1;
2017*b1cdbd2cSJim Jagielski 	}
2018*b1cdbd2cSJim Jagielski 
2019*b1cdbd2cSJim Jagielski 	if( nRet )
2020*b1cdbd2cSJim Jagielski 	{
2021*b1cdbd2cSJim Jagielski 		SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
2022*b1cdbd2cSJim Jagielski 		rSh.GetFlyFrmAttr( aSet );
2023*b1cdbd2cSJim Jagielski 		SwFmtURL aURL( (SwFmtURL&)aSet.Get( RES_URL ) );
2024*b1cdbd2cSJim Jagielski 
2025*b1cdbd2cSJim Jagielski 		if( aURL.GetURL() != aINetImg.GetTargetURL() ||
2026*b1cdbd2cSJim Jagielski 			aURL.GetTargetFrameName() != aINetImg.GetTargetFrame() )
2027*b1cdbd2cSJim Jagielski 		{
2028*b1cdbd2cSJim Jagielski 			aURL.SetURL( aINetImg.GetTargetURL(), sal_False );
2029*b1cdbd2cSJim Jagielski 			aURL.SetTargetFrameName( aINetImg.GetTargetFrame() );
2030*b1cdbd2cSJim Jagielski 			aSet.Put( aURL );
2031*b1cdbd2cSJim Jagielski 			rSh.SetFlyFrmAttr( aSet );
2032*b1cdbd2cSJim Jagielski 		}
2033*b1cdbd2cSJim Jagielski 	}
2034*b1cdbd2cSJim Jagielski 	return nRet;
2035*b1cdbd2cSJim Jagielski }
2036*b1cdbd2cSJim Jagielski 
2037*b1cdbd2cSJim Jagielski 
2038*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2039*b1cdbd2cSJim Jagielski 
SetSelInShell(SwWrtShell & rSh,sal_Bool bSelectFrm,const Point * pPt)2040*b1cdbd2cSJim Jagielski void SwTransferable::SetSelInShell( SwWrtShell& rSh, sal_Bool bSelectFrm,
2041*b1cdbd2cSJim Jagielski 										const Point* pPt )
2042*b1cdbd2cSJim Jagielski {
2043*b1cdbd2cSJim Jagielski 	if( bSelectFrm )
2044*b1cdbd2cSJim Jagielski 	{
2045*b1cdbd2cSJim Jagielski 		// Rahmen/Objecte selektieren
2046*b1cdbd2cSJim Jagielski         if( pPt && !rSh.GetView().GetViewFrame()->GetDispatcher()->IsLocked() )
2047*b1cdbd2cSJim Jagielski 		{
2048*b1cdbd2cSJim Jagielski 			rSh.GetView().NoRotate();
2049*b1cdbd2cSJim Jagielski 			if( rSh.SelectObj( *pPt ))
2050*b1cdbd2cSJim Jagielski 			{
2051*b1cdbd2cSJim Jagielski 				rSh.HideCrsr();
2052*b1cdbd2cSJim Jagielski 				rSh.EnterSelFrmMode( pPt );
2053*b1cdbd2cSJim Jagielski 				bFrmDrag = sal_True;
2054*b1cdbd2cSJim Jagielski 			}
2055*b1cdbd2cSJim Jagielski 		}
2056*b1cdbd2cSJim Jagielski 	}
2057*b1cdbd2cSJim Jagielski 	else
2058*b1cdbd2cSJim Jagielski 	{
2059*b1cdbd2cSJim Jagielski 		if( rSh.IsFrmSelected() || rSh.IsObjSelected() )
2060*b1cdbd2cSJim Jagielski 		{
2061*b1cdbd2cSJim Jagielski 			rSh.UnSelectFrm();
2062*b1cdbd2cSJim Jagielski 			rSh.LeaveSelFrmMode();
2063*b1cdbd2cSJim Jagielski 			rSh.GetView().GetEditWin().StopInsFrm();
2064*b1cdbd2cSJim Jagielski 			bFrmDrag = sal_False;
2065*b1cdbd2cSJim Jagielski 		}
2066*b1cdbd2cSJim Jagielski 		else if( rSh.GetView().GetDrawFuncPtr() )
2067*b1cdbd2cSJim Jagielski 			rSh.GetView().GetEditWin().StopInsFrm();
2068*b1cdbd2cSJim Jagielski 
2069*b1cdbd2cSJim Jagielski 		rSh.EnterStdMode();
2070*b1cdbd2cSJim Jagielski 		if( pPt )
2071*b1cdbd2cSJim Jagielski 			rSh.SwCrsrShell::SetCrsr( *pPt, sal_True );
2072*b1cdbd2cSJim Jagielski 	}
2073*b1cdbd2cSJim Jagielski }
2074*b1cdbd2cSJim Jagielski 
2075*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2076*b1cdbd2cSJim Jagielski 
_PasteDDE(TransferableDataHelper & rData,SwWrtShell & rWrtShell,sal_Bool bReReadGrf,sal_Bool bMsg)2077*b1cdbd2cSJim Jagielski int SwTransferable::_PasteDDE( TransferableDataHelper& rData,
2078*b1cdbd2cSJim Jagielski 								SwWrtShell& rWrtShell, sal_Bool bReReadGrf,
2079*b1cdbd2cSJim Jagielski 								sal_Bool bMsg )
2080*b1cdbd2cSJim Jagielski {
2081*b1cdbd2cSJim Jagielski 	// Daten aus dem Clipboardformat
2082*b1cdbd2cSJim Jagielski 	String aApp, aTopic, aItem;
2083*b1cdbd2cSJim Jagielski 
2084*b1cdbd2cSJim Jagielski 	{
2085*b1cdbd2cSJim Jagielski 		SotStorageStreamRef xStrm;
2086*b1cdbd2cSJim Jagielski 		if( !rData.GetSotStorageStream( SOT_FORMATSTR_ID_LINK, xStrm ))
2087*b1cdbd2cSJim Jagielski 		{
2088*b1cdbd2cSJim Jagielski 			ASSERT( !&rWrtShell, "DDE Data not found." );
2089*b1cdbd2cSJim Jagielski 			return 0;
2090*b1cdbd2cSJim Jagielski 		}	//sinnvollen Fehler melden!!
2091*b1cdbd2cSJim Jagielski 
2092*b1cdbd2cSJim Jagielski         rtl_TextEncoding eEncoding = DDE_TXT_ENCODING;
2093*b1cdbd2cSJim Jagielski         xStrm->ReadCString( aApp, eEncoding );
2094*b1cdbd2cSJim Jagielski         xStrm->ReadCString( aTopic, eEncoding );
2095*b1cdbd2cSJim Jagielski         xStrm->ReadCString( aItem, eEncoding );
2096*b1cdbd2cSJim Jagielski 	}
2097*b1cdbd2cSJim Jagielski 
2098*b1cdbd2cSJim Jagielski 	String aCmd;
2099*b1cdbd2cSJim Jagielski     sfx2::MakeLnkName( aCmd, &aApp, aTopic, aItem );
2100*b1cdbd2cSJim Jagielski 
2101*b1cdbd2cSJim Jagielski 	// wollen wir jetzt eine Grafik einlesen ?
2102*b1cdbd2cSJim Jagielski 	sal_uLong nFormat;
2103*b1cdbd2cSJim Jagielski 	if( !rData.HasFormat( FORMAT_RTF ) &&
2104*b1cdbd2cSJim Jagielski 		!rData.HasFormat( SOT_FORMATSTR_ID_HTML ) &&
2105*b1cdbd2cSJim Jagielski 		!rData.HasFormat( FORMAT_STRING ) &&
2106*b1cdbd2cSJim Jagielski 		(rData.HasFormat( nFormat = FORMAT_GDIMETAFILE ) ||
2107*b1cdbd2cSJim Jagielski 		 rData.HasFormat( nFormat = FORMAT_BITMAP )) )
2108*b1cdbd2cSJim Jagielski 	{
2109*b1cdbd2cSJim Jagielski 		Graphic aGrf;
2110*b1cdbd2cSJim Jagielski 		int nRet = rData.GetGraphic( nFormat, aGrf );
2111*b1cdbd2cSJim Jagielski 		if( nRet )
2112*b1cdbd2cSJim Jagielski 		{
2113*b1cdbd2cSJim Jagielski 			String sLnkTyp( String::CreateFromAscii(
2114*b1cdbd2cSJim Jagielski 						RTL_CONSTASCII_STRINGPARAM( "DDE" )));
2115*b1cdbd2cSJim Jagielski 			if ( bReReadGrf )
2116*b1cdbd2cSJim Jagielski 				rWrtShell.ReRead( aCmd, sLnkTyp, &aGrf );
2117*b1cdbd2cSJim Jagielski 			else
2118*b1cdbd2cSJim Jagielski 				rWrtShell.Insert( aCmd, sLnkTyp, aGrf );
2119*b1cdbd2cSJim Jagielski 		}
2120*b1cdbd2cSJim Jagielski 		return nRet;
2121*b1cdbd2cSJim Jagielski 	}
2122*b1cdbd2cSJim Jagielski 
2123*b1cdbd2cSJim Jagielski     SwFieldType* pTyp = 0;
2124*b1cdbd2cSJim Jagielski 	sal_uInt16 i = 1,j;
2125*b1cdbd2cSJim Jagielski 	String aName;
2126*b1cdbd2cSJim Jagielski 	sal_Bool bAlreadyThere = sal_False, bDoublePaste = sal_False;
2127*b1cdbd2cSJim Jagielski 	sal_uInt16 nSize = rWrtShell.GetFldTypeCount();
2128*b1cdbd2cSJim Jagielski 	const ::utl::TransliterationWrapper& rColl = ::GetAppCmpStrIgnore();
2129*b1cdbd2cSJim Jagielski 
2130*b1cdbd2cSJim Jagielski 	do {
2131*b1cdbd2cSJim Jagielski 		aName = aApp;
2132*b1cdbd2cSJim Jagielski 		aName += String::CreateFromInt32( i );
2133*b1cdbd2cSJim Jagielski 		for( j = INIT_FLDTYPES; j < nSize; j++ )
2134*b1cdbd2cSJim Jagielski 		{
2135*b1cdbd2cSJim Jagielski 			pTyp = rWrtShell.GetFldType( j );
2136*b1cdbd2cSJim Jagielski 			if( RES_DDEFLD == pTyp->Which() )
2137*b1cdbd2cSJim Jagielski 			{
2138*b1cdbd2cSJim Jagielski 				String sTmp( ((SwDDEFieldType*)pTyp)->GetCmd() );
2139*b1cdbd2cSJim Jagielski 				if( rColl.isEqual( sTmp, aCmd ) &&
2140*b1cdbd2cSJim Jagielski                     sfx2::LINKUPDATE_ALWAYS == ((SwDDEFieldType*)pTyp)->GetType() )
2141*b1cdbd2cSJim Jagielski 				{
2142*b1cdbd2cSJim Jagielski 					aName = pTyp->GetName();
2143*b1cdbd2cSJim Jagielski 					bDoublePaste = sal_True;
2144*b1cdbd2cSJim Jagielski 					break;
2145*b1cdbd2cSJim Jagielski 				}
2146*b1cdbd2cSJim Jagielski 				else if( rColl.isEqual( aName, pTyp->GetName() ) )
2147*b1cdbd2cSJim Jagielski 					break;
2148*b1cdbd2cSJim Jagielski 			}
2149*b1cdbd2cSJim Jagielski 		}
2150*b1cdbd2cSJim Jagielski 		if( j == nSize )
2151*b1cdbd2cSJim Jagielski 			bAlreadyThere = sal_False;
2152*b1cdbd2cSJim Jagielski 		else
2153*b1cdbd2cSJim Jagielski 		{
2154*b1cdbd2cSJim Jagielski 			bAlreadyThere = sal_True;
2155*b1cdbd2cSJim Jagielski 			i++;
2156*b1cdbd2cSJim Jagielski 		}
2157*b1cdbd2cSJim Jagielski 	}
2158*b1cdbd2cSJim Jagielski 	while( bAlreadyThere && !bDoublePaste );
2159*b1cdbd2cSJim Jagielski 
2160*b1cdbd2cSJim Jagielski 	if( !bDoublePaste )
2161*b1cdbd2cSJim Jagielski 	{
2162*b1cdbd2cSJim Jagielski         SwDDEFieldType aType( aName, aCmd, sfx2::LINKUPDATE_ALWAYS );
2163*b1cdbd2cSJim Jagielski 		pTyp = rWrtShell.InsertFldType( aType );
2164*b1cdbd2cSJim Jagielski 	}
2165*b1cdbd2cSJim Jagielski 
2166*b1cdbd2cSJim Jagielski 
2167*b1cdbd2cSJim Jagielski 	SwDDEFieldType* pDDETyp = (SwDDEFieldType*)pTyp;
2168*b1cdbd2cSJim Jagielski 
2169*b1cdbd2cSJim Jagielski 	String aExpand;
2170*b1cdbd2cSJim Jagielski 	if( rData.GetString( FORMAT_STRING, aExpand ))
2171*b1cdbd2cSJim Jagielski 	{
2172*b1cdbd2cSJim Jagielski 		do {			// middle checked loop
2173*b1cdbd2cSJim Jagielski 
2174*b1cdbd2cSJim Jagielski 			// Wenn die Daten von einer Tabellenkalkulation kommen
2175*b1cdbd2cSJim Jagielski 			// fuegen wir eine DDE-Tabelle ein
2176*b1cdbd2cSJim Jagielski 			if( ( rData.HasFormat( SOT_FORMATSTR_ID_SYLK ) ||
2177*b1cdbd2cSJim Jagielski 				  rData.HasFormat( SOT_FORMATSTR_ID_SYLK_BIGCAPS ) ) &&
2178*b1cdbd2cSJim Jagielski 				aExpand.Len() &&
2179*b1cdbd2cSJim Jagielski 				 ( 1 < aExpand.GetTokenCount( '\n' ) ||
2180*b1cdbd2cSJim Jagielski 					   aExpand.GetTokenCount( '\t' )) )
2181*b1cdbd2cSJim Jagielski 			{
2182*b1cdbd2cSJim Jagielski 				String sTmp( aExpand );
2183*b1cdbd2cSJim Jagielski 				xub_StrLen nRows = sTmp.GetTokenCount( '\n' );
2184*b1cdbd2cSJim Jagielski 				if( nRows )
2185*b1cdbd2cSJim Jagielski 					--nRows;
2186*b1cdbd2cSJim Jagielski 				sTmp = sTmp.GetToken( 0, '\n' );
2187*b1cdbd2cSJim Jagielski 				xub_StrLen nCols = sTmp.GetTokenCount( '\t' );
2188*b1cdbd2cSJim Jagielski 
2189*b1cdbd2cSJim Jagielski 				// mindestens eine Spalte & Zeile muss vorhanden sein
2190*b1cdbd2cSJim Jagielski 				if( !nRows || !nCols )
2191*b1cdbd2cSJim Jagielski 				{
2192*b1cdbd2cSJim Jagielski 					if( bMsg )
2193*b1cdbd2cSJim Jagielski 						InfoBox(0, SW_RESSTR(STR_NO_TABLE)).Execute();
2194*b1cdbd2cSJim Jagielski 					pDDETyp = 0;
2195*b1cdbd2cSJim Jagielski 					break;
2196*b1cdbd2cSJim Jagielski 				}
2197*b1cdbd2cSJim Jagielski 
2198*b1cdbd2cSJim Jagielski                 rWrtShell.InsertDDETable(
2199*b1cdbd2cSJim Jagielski                     SwInsertTableOptions( tabopts::HEADLINE_NO_BORDER, 1 ), // TODO MULTIHEADER
2200*b1cdbd2cSJim Jagielski                     pDDETyp, nRows, nCols );
2201*b1cdbd2cSJim Jagielski 			}
2202*b1cdbd2cSJim Jagielski 			else if( 1 < aExpand.GetTokenCount( '\n' ) )
2203*b1cdbd2cSJim Jagielski 			{
2204*b1cdbd2cSJim Jagielski 				// mehrere Absaetze -> eine geschuetzte Section einfuegen
2205*b1cdbd2cSJim Jagielski 				if( rWrtShell.HasSelection() )
2206*b1cdbd2cSJim Jagielski 					rWrtShell.DelRight();
2207*b1cdbd2cSJim Jagielski 
2208*b1cdbd2cSJim Jagielski                 SwSectionData aSect( DDE_LINK_SECTION, aName );
2209*b1cdbd2cSJim Jagielski 				aSect.SetLinkFileName( aCmd );
2210*b1cdbd2cSJim Jagielski                 aSect.SetProtectFlag(true);
2211*b1cdbd2cSJim Jagielski 				rWrtShell.InsertSection( aSect );
2212*b1cdbd2cSJim Jagielski 
2213*b1cdbd2cSJim Jagielski 				pDDETyp = 0;				// FeldTypen wieder entfernen
2214*b1cdbd2cSJim Jagielski 			}
2215*b1cdbd2cSJim Jagielski 			else
2216*b1cdbd2cSJim Jagielski 			{
2217*b1cdbd2cSJim Jagielski 				// Einfuegen
2218*b1cdbd2cSJim Jagielski 				SwDDEField aSwDDEField( pDDETyp );
2219*b1cdbd2cSJim Jagielski 				rWrtShell.Insert( aSwDDEField );
2220*b1cdbd2cSJim Jagielski 			}
2221*b1cdbd2cSJim Jagielski 
2222*b1cdbd2cSJim Jagielski 		} while( sal_False );
2223*b1cdbd2cSJim Jagielski 	}
2224*b1cdbd2cSJim Jagielski 	else
2225*b1cdbd2cSJim Jagielski 		pDDETyp = 0;						// FeldTypen wieder entfernen
2226*b1cdbd2cSJim Jagielski 
2227*b1cdbd2cSJim Jagielski 	if( !pDDETyp && !bDoublePaste )
2228*b1cdbd2cSJim Jagielski 	{
2229*b1cdbd2cSJim Jagielski 		// FeldTyp wieder entfernen - Fehler aufgetreten!
2230*b1cdbd2cSJim Jagielski 		for( j = nSize; j >= INIT_FLDTYPES; --j )
2231*b1cdbd2cSJim Jagielski 			if( pTyp == rWrtShell.GetFldType( j ) )
2232*b1cdbd2cSJim Jagielski 			{
2233*b1cdbd2cSJim Jagielski 				rWrtShell.RemoveFldType( j );
2234*b1cdbd2cSJim Jagielski 				break;
2235*b1cdbd2cSJim Jagielski 			}
2236*b1cdbd2cSJim Jagielski 	}
2237*b1cdbd2cSJim Jagielski 
2238*b1cdbd2cSJim Jagielski 	return 1;
2239*b1cdbd2cSJim Jagielski }
2240*b1cdbd2cSJim Jagielski 
2241*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2242*b1cdbd2cSJim Jagielski 
_PasteSdrFormat(TransferableDataHelper & rData,SwWrtShell & rSh,sal_uInt16 nAction,const Point * pPt,sal_uInt8 nActionFlags,bool bNeedToSelectBeforePaste)2243*b1cdbd2cSJim Jagielski int SwTransferable::_PasteSdrFormat(  TransferableDataHelper& rData,
2244*b1cdbd2cSJim Jagielski 									SwWrtShell& rSh, sal_uInt16 nAction,
2245*b1cdbd2cSJim Jagielski 									const Point* pPt, sal_uInt8 nActionFlags, bool bNeedToSelectBeforePaste)
2246*b1cdbd2cSJim Jagielski {
2247*b1cdbd2cSJim Jagielski 	int nRet = 0;
2248*b1cdbd2cSJim Jagielski 	SotStorageStreamRef xStrm;
2249*b1cdbd2cSJim Jagielski 	if( rData.GetSotStorageStream( SOT_FORMATSTR_ID_DRAWING, xStrm ))
2250*b1cdbd2cSJim Jagielski 	{
2251*b1cdbd2cSJim Jagielski 		xStrm->SetVersion( SOFFICE_FILEFORMAT_50 );
2252*b1cdbd2cSJim Jagielski 
2253*b1cdbd2cSJim Jagielski         if(bNeedToSelectBeforePaste && pPt)
2254*b1cdbd2cSJim Jagielski         {
2255*b1cdbd2cSJim Jagielski             // if this is an internal drag, need to set the target right (select it), else
2256*b1cdbd2cSJim Jagielski             // still the source will be selected
2257*b1cdbd2cSJim Jagielski             SwTransferable::SetSelInShell( rSh, sal_True, pPt );
2258*b1cdbd2cSJim Jagielski         }
2259*b1cdbd2cSJim Jagielski 
2260*b1cdbd2cSJim Jagielski 		rSh.Paste( *xStrm, nAction, pPt );
2261*b1cdbd2cSJim Jagielski 		nRet = 1;
2262*b1cdbd2cSJim Jagielski 
2263*b1cdbd2cSJim Jagielski 		if( nRet && ( nActionFlags &
2264*b1cdbd2cSJim Jagielski 			( EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL >> 8) ))
2265*b1cdbd2cSJim Jagielski 			SwTransferable::_PasteTargetURL( rData, rSh, 0, 0, sal_False );
2266*b1cdbd2cSJim Jagielski 	}
2267*b1cdbd2cSJim Jagielski 	return nRet;
2268*b1cdbd2cSJim Jagielski }
2269*b1cdbd2cSJim Jagielski 
2270*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2271*b1cdbd2cSJim Jagielski 
_PasteGrf(TransferableDataHelper & rData,SwWrtShell & rSh,sal_uLong nFmt,sal_uInt16 nAction,const Point * pPt,sal_uInt8 nActionFlags,sal_Int8 nDropAction,bool bNeedToSelectBeforePaste)2272*b1cdbd2cSJim Jagielski int SwTransferable::_PasteGrf( TransferableDataHelper& rData, SwWrtShell& rSh,
2273*b1cdbd2cSJim Jagielski 								sal_uLong nFmt, sal_uInt16 nAction, const Point* pPt,
2274*b1cdbd2cSJim Jagielski 								sal_uInt8 nActionFlags, sal_Int8 nDropAction, bool bNeedToSelectBeforePaste)
2275*b1cdbd2cSJim Jagielski {
2276*b1cdbd2cSJim Jagielski 	int nRet = 0;
2277*b1cdbd2cSJim Jagielski 
2278*b1cdbd2cSJim Jagielski 	Graphic aGrf;
2279*b1cdbd2cSJim Jagielski 	INetBookmark aBkmk;
2280*b1cdbd2cSJim Jagielski 	sal_Bool bCheckForGrf = sal_False, bCheckForImageMap = sal_False;
2281*b1cdbd2cSJim Jagielski 
2282*b1cdbd2cSJim Jagielski 	switch( nFmt )
2283*b1cdbd2cSJim Jagielski 	{
2284*b1cdbd2cSJim Jagielski 	case SOT_FORMAT_BITMAP:
2285*b1cdbd2cSJim Jagielski     case SOT_FORMATSTR_ID_PNG:
2286*b1cdbd2cSJim Jagielski 	case SOT_FORMAT_GDIMETAFILE:
2287*b1cdbd2cSJim Jagielski 		nRet = rData.GetGraphic( nFmt, aGrf );
2288*b1cdbd2cSJim Jagielski 		break;
2289*b1cdbd2cSJim Jagielski 
2290*b1cdbd2cSJim Jagielski     case SOT_FORMATSTR_ID_SVXB:
2291*b1cdbd2cSJim Jagielski     {
2292*b1cdbd2cSJim Jagielski         SotStorageStreamRef xStm;
2293*b1cdbd2cSJim Jagielski 
2294*b1cdbd2cSJim Jagielski         if(rData.GetSotStorageStream(SOT_FORMATSTR_ID_SVXB, xStm))
2295*b1cdbd2cSJim Jagielski         {
2296*b1cdbd2cSJim Jagielski             *xStm >> aGrf;
2297*b1cdbd2cSJim Jagielski             nRet = (GRAPHIC_NONE != aGrf.GetType() && GRAPHIC_DEFAULT != aGrf.GetType());
2298*b1cdbd2cSJim Jagielski         }
2299*b1cdbd2cSJim Jagielski 
2300*b1cdbd2cSJim Jagielski         break;
2301*b1cdbd2cSJim Jagielski     }
2302*b1cdbd2cSJim Jagielski 
2303*b1cdbd2cSJim Jagielski 	case SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK:
2304*b1cdbd2cSJim Jagielski 	case SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR:
2305*b1cdbd2cSJim Jagielski 	case SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR:
2306*b1cdbd2cSJim Jagielski 		if( 0 != ( nRet = rData.GetINetBookmark( nFmt, aBkmk ) ))
2307*b1cdbd2cSJim Jagielski 		{
2308*b1cdbd2cSJim Jagielski /*				if( SW_PASTESDR_SETATTR != nAction )
2309*b1cdbd2cSJim Jagielski 			{
2310*b1cdbd2cSJim Jagielski 				INetURLObject aURL( aBkmk.GetURL() );
2311*b1cdbd2cSJim Jagielski 				bCheckForGrf = INET_PROT_FILE == aURL.GetProtocol();
2312*b1cdbd2cSJim Jagielski 				nRet = 0 != bCheckForGrf;
2313*b1cdbd2cSJim Jagielski 			}
2314*b1cdbd2cSJim Jagielski */
2315*b1cdbd2cSJim Jagielski 			if( SW_PASTESDR_SETATTR == nAction )
2316*b1cdbd2cSJim Jagielski 				nFmt = SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK;
2317*b1cdbd2cSJim Jagielski 			else
2318*b1cdbd2cSJim Jagielski 				bCheckForGrf = sal_True;
2319*b1cdbd2cSJim Jagielski 		}
2320*b1cdbd2cSJim Jagielski 		break;
2321*b1cdbd2cSJim Jagielski 
2322*b1cdbd2cSJim Jagielski 	case SOT_FORMAT_FILE:
2323*b1cdbd2cSJim Jagielski 		{
2324*b1cdbd2cSJim Jagielski 			String sTxt;
2325*b1cdbd2cSJim Jagielski 			if( 0 != ( nRet = rData.GetString( nFmt, sTxt ) ) )
2326*b1cdbd2cSJim Jagielski 			{
2327*b1cdbd2cSJim Jagielski 				String sDesc;
2328*b1cdbd2cSJim Jagielski 				SwTransferable::_CheckForURLOrLNKFile( rData, sTxt, &sDesc );
2329*b1cdbd2cSJim Jagielski 
2330*b1cdbd2cSJim Jagielski                 aBkmk = INetBookmark(
2331*b1cdbd2cSJim Jagielski                         URIHelper::SmartRel2Abs(INetURLObject(), sTxt, Link(), false ),
2332*b1cdbd2cSJim Jagielski                         sDesc );
2333*b1cdbd2cSJim Jagielski 				bCheckForGrf = sal_True;
2334*b1cdbd2cSJim Jagielski 				bCheckForImageMap = SW_PASTESDR_REPLACE == nAction;
2335*b1cdbd2cSJim Jagielski 			}
2336*b1cdbd2cSJim Jagielski 		}
2337*b1cdbd2cSJim Jagielski 		break;
2338*b1cdbd2cSJim Jagielski 
2339*b1cdbd2cSJim Jagielski 	default:
2340*b1cdbd2cSJim Jagielski 		nRet = rData.GetGraphic( nFmt, aGrf );
2341*b1cdbd2cSJim Jagielski 		break;
2342*b1cdbd2cSJim Jagielski 	}
2343*b1cdbd2cSJim Jagielski 
2344*b1cdbd2cSJim Jagielski 	if( bCheckForGrf )
2345*b1cdbd2cSJim Jagielski 	{
2346*b1cdbd2cSJim Jagielski 		//!!! auf FileSystem abpruefen - nur dann ist es sinnvoll die
2347*b1cdbd2cSJim Jagielski 		// Grafiken zu testen !!!!
2348*b1cdbd2cSJim Jagielski 		GraphicFilter *pFlt = GraphicFilter::GetGraphicFilter();
2349*b1cdbd2cSJim Jagielski 		nRet = GRFILTER_OK == GraphicFilter::LoadGraphic( aBkmk.GetURL(), aEmptyStr,
2350*b1cdbd2cSJim Jagielski 											aGrf, pFlt );
2351*b1cdbd2cSJim Jagielski 		if( !nRet && SW_PASTESDR_SETATTR == nAction &&
2352*b1cdbd2cSJim Jagielski 			SOT_FORMAT_FILE == nFmt &&
2353*b1cdbd2cSJim Jagielski 			// Bug 63031 - nur bei Rahmenselektion
2354*b1cdbd2cSJim Jagielski 			rSh.IsFrmSelected() )
2355*b1cdbd2cSJim Jagielski 		{
2356*b1cdbd2cSJim Jagielski 			// dann als Hyperlink hinter die Grafik setzen
2357*b1cdbd2cSJim Jagielski 			nFmt = SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK;
2358*b1cdbd2cSJim Jagielski 			nRet = sal_True;
2359*b1cdbd2cSJim Jagielski 		}
2360*b1cdbd2cSJim Jagielski 	}
2361*b1cdbd2cSJim Jagielski 
2362*b1cdbd2cSJim Jagielski     if(pPt && bNeedToSelectBeforePaste)
2363*b1cdbd2cSJim Jagielski     {
2364*b1cdbd2cSJim Jagielski         // when using internal D&Ds, still the source object is selected and
2365*b1cdbd2cSJim Jagielski         // this is necessary to get the correct source data which is also
2366*b1cdbd2cSJim Jagielski         // dependent from selection. After receiving the drag data it is
2367*b1cdbd2cSJim Jagielski         // now tiime to select the correct target object
2368*b1cdbd2cSJim Jagielski         SwTransferable::SetSelInShell( rSh, sal_True, pPt );
2369*b1cdbd2cSJim Jagielski     }
2370*b1cdbd2cSJim Jagielski 
2371*b1cdbd2cSJim Jagielski 	if( nRet )
2372*b1cdbd2cSJim Jagielski 	{
2373*b1cdbd2cSJim Jagielski         String sURL;
2374*b1cdbd2cSJim Jagielski 
2375*b1cdbd2cSJim Jagielski         if( rSh.GetView().GetDocShell()->ISA(SwWebDocShell)
2376*b1cdbd2cSJim Jagielski             // #123922# if link action is noted, also take URL
2377*b1cdbd2cSJim Jagielski             || DND_ACTION_LINK == nDropAction)
2378*b1cdbd2cSJim Jagielski         {
2379*b1cdbd2cSJim Jagielski             sURL = aBkmk.GetURL();
2380*b1cdbd2cSJim Jagielski         }
2381*b1cdbd2cSJim Jagielski 
2382*b1cdbd2cSJim Jagielski         switch( nAction )
2383*b1cdbd2cSJim Jagielski         {
2384*b1cdbd2cSJim Jagielski             case SW_PASTESDR_INSERT:
2385*b1cdbd2cSJim Jagielski             {
2386*b1cdbd2cSJim Jagielski                 SwTransferable::SetSelInShell( rSh, sal_False, pPt );
2387*b1cdbd2cSJim Jagielski                 rSh.Insert( sURL, aEmptyStr, aGrf );
2388*b1cdbd2cSJim Jagielski                 break;
2389*b1cdbd2cSJim Jagielski             }
2390*b1cdbd2cSJim Jagielski 
2391*b1cdbd2cSJim Jagielski             case SW_PASTESDR_REPLACE:
2392*b1cdbd2cSJim Jagielski             {
2393*b1cdbd2cSJim Jagielski                 if( rSh.IsObjSelected() )
2394*b1cdbd2cSJim Jagielski                 {
2395*b1cdbd2cSJim Jagielski                     // #123922# for D&D on draw objects, do for now the same for
2396*b1cdbd2cSJim Jagielski                     // SW_PASTESDR_REPLACE (D&D) as for SW_PASTESDR_SETATTR (D&D and
2397*b1cdbd2cSJim Jagielski                     // CTRL+SHIFT). The code below replaces the draw object with
2398*b1cdbd2cSJim Jagielski                     // a writer graphic; maybe this is an option later again if wanted
2399*b1cdbd2cSJim Jagielski                     rSh.Paste( aGrf, sURL );
2400*b1cdbd2cSJim Jagielski 
2401*b1cdbd2cSJim Jagielski                     // rSh.ReplaceSdrObj( sURL, aEmptyStr, &aGrf );
2402*b1cdbd2cSJim Jagielski                     // Point aPt( pPt ? *pPt : rSh.GetCrsrDocPos() );
2403*b1cdbd2cSJim Jagielski                     // SwTransferable::SetSelInShell( rSh, sal_True, &aPt );
2404*b1cdbd2cSJim Jagielski                 }
2405*b1cdbd2cSJim Jagielski                 else
2406*b1cdbd2cSJim Jagielski                 {
2407*b1cdbd2cSJim Jagielski                     // set graphic at writer graphic without link
2408*b1cdbd2cSJim Jagielski                     rSh.ReRead( sURL, aEmptyStr, &aGrf );
2409*b1cdbd2cSJim Jagielski                 }
2410*b1cdbd2cSJim Jagielski 
2411*b1cdbd2cSJim Jagielski                 break;
2412*b1cdbd2cSJim Jagielski             }
2413*b1cdbd2cSJim Jagielski 
2414*b1cdbd2cSJim Jagielski             case SW_PASTESDR_SETATTR:
2415*b1cdbd2cSJim Jagielski             {
2416*b1cdbd2cSJim Jagielski                 if( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK == nFmt )
2417*b1cdbd2cSJim Jagielski                 {
2418*b1cdbd2cSJim Jagielski                     if( rSh.IsFrmSelected() )
2419*b1cdbd2cSJim Jagielski                     {
2420*b1cdbd2cSJim Jagielski                         SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
2421*b1cdbd2cSJim Jagielski                         rSh.GetFlyFrmAttr( aSet );
2422*b1cdbd2cSJim Jagielski                         SwFmtURL aURL( (SwFmtURL&)aSet.Get( RES_URL ) );
2423*b1cdbd2cSJim Jagielski                         aURL.SetURL( aBkmk.GetURL(), sal_False );
2424*b1cdbd2cSJim Jagielski                         aSet.Put( aURL );
2425*b1cdbd2cSJim Jagielski                         rSh.SetFlyFrmAttr( aSet );
2426*b1cdbd2cSJim Jagielski                     }
2427*b1cdbd2cSJim Jagielski                 }
2428*b1cdbd2cSJim Jagielski                 else if( rSh.IsObjSelected() )
2429*b1cdbd2cSJim Jagielski                 {
2430*b1cdbd2cSJim Jagielski                     // set as attribute at DrawObject
2431*b1cdbd2cSJim Jagielski                     rSh.Paste( aGrf, sURL );
2432*b1cdbd2cSJim Jagielski                 }
2433*b1cdbd2cSJim Jagielski                 else if( OBJCNT_GRF == rSh.GetObjCntTypeOfSelection() )
2434*b1cdbd2cSJim Jagielski                 {
2435*b1cdbd2cSJim Jagielski                     // set as linked graphic at writer graphic frame
2436*b1cdbd2cSJim Jagielski                     rSh.ReRead( sURL, aEmptyStr, &aGrf );
2437*b1cdbd2cSJim Jagielski                 }
2438*b1cdbd2cSJim Jagielski                 else
2439*b1cdbd2cSJim Jagielski                 {
2440*b1cdbd2cSJim Jagielski                     SwTransferable::SetSelInShell( rSh, sal_False, pPt );
2441*b1cdbd2cSJim Jagielski                     rSh.Insert( aBkmk.GetURL(), aEmptyStr, aGrf );
2442*b1cdbd2cSJim Jagielski                 }
2443*b1cdbd2cSJim Jagielski                 break;
2444*b1cdbd2cSJim Jagielski             }
2445*b1cdbd2cSJim Jagielski             default:
2446*b1cdbd2cSJim Jagielski             {
2447*b1cdbd2cSJim Jagielski                 nRet = 0;
2448*b1cdbd2cSJim Jagielski                 break;
2449*b1cdbd2cSJim Jagielski             }
2450*b1cdbd2cSJim Jagielski         }
2451*b1cdbd2cSJim Jagielski     }
2452*b1cdbd2cSJim Jagielski 
2453*b1cdbd2cSJim Jagielski 	if( nRet )
2454*b1cdbd2cSJim Jagielski 	{
2455*b1cdbd2cSJim Jagielski 
2456*b1cdbd2cSJim Jagielski 		if( nActionFlags &
2457*b1cdbd2cSJim Jagielski 			(( EXCHG_OUT_ACTION_FLAG_INSERT_IMAGEMAP |
2458*b1cdbd2cSJim Jagielski 				EXCHG_OUT_ACTION_FLAG_REPLACE_IMAGEMAP ) >> 8) )
2459*b1cdbd2cSJim Jagielski 			SwTransferable::_PasteImageMap( rData, rSh );
2460*b1cdbd2cSJim Jagielski 
2461*b1cdbd2cSJim Jagielski 		if( nActionFlags &
2462*b1cdbd2cSJim Jagielski 			( EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL >> 8) )
2463*b1cdbd2cSJim Jagielski 			SwTransferable::_PasteTargetURL( rData, rSh, 0, 0, sal_False );
2464*b1cdbd2cSJim Jagielski 	}
2465*b1cdbd2cSJim Jagielski 	else if( bCheckForImageMap )
2466*b1cdbd2cSJim Jagielski 	{
2467*b1cdbd2cSJim Jagielski 		// oder sollte das File ein ImageMap-File sein?
2468*b1cdbd2cSJim Jagielski 		ImageMap aMap;
2469*b1cdbd2cSJim Jagielski 		SfxMedium aMed( INetURLObject(aBkmk.GetURL()).GetFull(),
2470*b1cdbd2cSJim Jagielski 							STREAM_STD_READ, sal_False );
2471*b1cdbd2cSJim Jagielski         SvStream* pStream = aMed.GetInStream();
2472*b1cdbd2cSJim Jagielski         if( pStream != NULL  &&
2473*b1cdbd2cSJim Jagielski             !pStream->GetError()  &&
2474*b1cdbd2cSJim Jagielski             // mba: no BaseURL for clipboard functionality
2475*b1cdbd2cSJim Jagielski             aMap.Read( *pStream, IMAP_FORMAT_DETECT, String() ) == IMAP_ERR_OK &&
2476*b1cdbd2cSJim Jagielski 			aMap.GetIMapObjectCount() )
2477*b1cdbd2cSJim Jagielski 		{
2478*b1cdbd2cSJim Jagielski 			SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
2479*b1cdbd2cSJim Jagielski 			rSh.GetFlyFrmAttr( aSet );
2480*b1cdbd2cSJim Jagielski 			SwFmtURL aURL( (SwFmtURL&)aSet.Get( RES_URL ) );
2481*b1cdbd2cSJim Jagielski 			aURL.SetMap( &aMap );
2482*b1cdbd2cSJim Jagielski 			aSet.Put( aURL );
2483*b1cdbd2cSJim Jagielski 			rSh.SetFlyFrmAttr( aSet );
2484*b1cdbd2cSJim Jagielski 			nRet = 1;
2485*b1cdbd2cSJim Jagielski 		}
2486*b1cdbd2cSJim Jagielski 	}
2487*b1cdbd2cSJim Jagielski 
2488*b1cdbd2cSJim Jagielski 	return nRet;
2489*b1cdbd2cSJim Jagielski }
2490*b1cdbd2cSJim Jagielski 
2491*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2492*b1cdbd2cSJim Jagielski 
_PasteImageMap(TransferableDataHelper & rData,SwWrtShell & rSh)2493*b1cdbd2cSJim Jagielski int SwTransferable::_PasteImageMap( TransferableDataHelper& rData,
2494*b1cdbd2cSJim Jagielski 									SwWrtShell& rSh )
2495*b1cdbd2cSJim Jagielski {
2496*b1cdbd2cSJim Jagielski 	int nRet = 0;
2497*b1cdbd2cSJim Jagielski 	if( rData.HasFormat( SOT_FORMATSTR_ID_SVIM ))
2498*b1cdbd2cSJim Jagielski 	{
2499*b1cdbd2cSJim Jagielski 		SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
2500*b1cdbd2cSJim Jagielski 		rSh.GetFlyFrmAttr( aSet );
2501*b1cdbd2cSJim Jagielski 		SwFmtURL aURL( (SwFmtURL&)aSet.Get( RES_URL ) );
2502*b1cdbd2cSJim Jagielski 		const ImageMap* pOld = aURL.GetMap();
2503*b1cdbd2cSJim Jagielski 
2504*b1cdbd2cSJim Jagielski 		// setzen oder ersetzen ist hier die Frage
2505*b1cdbd2cSJim Jagielski 		ImageMap aImageMap;
2506*b1cdbd2cSJim Jagielski 		if( rData.GetImageMap( SOT_FORMATSTR_ID_SVIM, aImageMap ) &&
2507*b1cdbd2cSJim Jagielski 			( !pOld || aImageMap != *pOld ))
2508*b1cdbd2cSJim Jagielski 		{
2509*b1cdbd2cSJim Jagielski 			aURL.SetMap( &aImageMap );
2510*b1cdbd2cSJim Jagielski 			aSet.Put( aURL );
2511*b1cdbd2cSJim Jagielski 			rSh.SetFlyFrmAttr( aSet );
2512*b1cdbd2cSJim Jagielski 		}
2513*b1cdbd2cSJim Jagielski 		nRet = 1;
2514*b1cdbd2cSJim Jagielski 	}
2515*b1cdbd2cSJim Jagielski 	return nRet;
2516*b1cdbd2cSJim Jagielski }
2517*b1cdbd2cSJim Jagielski 
2518*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2519*b1cdbd2cSJim Jagielski 
_PasteAsHyperlink(TransferableDataHelper & rData,SwWrtShell & rSh,sal_uLong nFmt)2520*b1cdbd2cSJim Jagielski int SwTransferable::_PasteAsHyperlink( TransferableDataHelper& rData,
2521*b1cdbd2cSJim Jagielski 										SwWrtShell& rSh, sal_uLong nFmt )
2522*b1cdbd2cSJim Jagielski {
2523*b1cdbd2cSJim Jagielski 	int nRet = 0;
2524*b1cdbd2cSJim Jagielski 	String sFile;
2525*b1cdbd2cSJim Jagielski 	if( rData.GetString( nFmt, sFile ) && sFile.Len() )
2526*b1cdbd2cSJim Jagielski 	{
2527*b1cdbd2cSJim Jagielski 		String sDesc;
2528*b1cdbd2cSJim Jagielski 		SwTransferable::_CheckForURLOrLNKFile( rData, sFile, &sDesc );
2529*b1cdbd2cSJim Jagielski 
2530*b1cdbd2cSJim Jagielski 		//#41801# ersteinmal die URL absolut machen
2531*b1cdbd2cSJim Jagielski 		INetURLObject aURL;
2532*b1cdbd2cSJim Jagielski 		aURL.SetSmartProtocol( INET_PROT_FILE );
2533*b1cdbd2cSJim Jagielski 		aURL.SetSmartURL( sFile );
2534*b1cdbd2cSJim Jagielski 		sFile = aURL.GetMainURL( INetURLObject::NO_DECODE );
2535*b1cdbd2cSJim Jagielski 
2536*b1cdbd2cSJim Jagielski 		switch( rSh.GetObjCntTypeOfSelection() )
2537*b1cdbd2cSJim Jagielski 		{
2538*b1cdbd2cSJim Jagielski 		case OBJCNT_FLY:
2539*b1cdbd2cSJim Jagielski 		case OBJCNT_GRF:
2540*b1cdbd2cSJim Jagielski 		case OBJCNT_OLE:
2541*b1cdbd2cSJim Jagielski 			{
2542*b1cdbd2cSJim Jagielski 				SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
2543*b1cdbd2cSJim Jagielski 				rSh.GetFlyFrmAttr( aSet );
2544*b1cdbd2cSJim Jagielski 				SwFmtURL aURL2( (SwFmtURL&)aSet.Get( RES_URL ) );
2545*b1cdbd2cSJim Jagielski 				aURL2.SetURL( sFile, sal_False );
2546*b1cdbd2cSJim Jagielski 				if( !aURL2.GetName().Len() )
2547*b1cdbd2cSJim Jagielski 					aURL2.SetName( sFile );
2548*b1cdbd2cSJim Jagielski 				aSet.Put( aURL2 );
2549*b1cdbd2cSJim Jagielski 				rSh.SetFlyFrmAttr( aSet );
2550*b1cdbd2cSJim Jagielski 			}
2551*b1cdbd2cSJim Jagielski 			break;
2552*b1cdbd2cSJim Jagielski 
2553*b1cdbd2cSJim Jagielski 		default:
2554*b1cdbd2cSJim Jagielski 			{
2555*b1cdbd2cSJim Jagielski 				rSh.InsertURL( SwFmtINetFmt( sFile, aEmptyStr ),
2556*b1cdbd2cSJim Jagielski 								sDesc.Len() ? sDesc : sFile );
2557*b1cdbd2cSJim Jagielski 			}
2558*b1cdbd2cSJim Jagielski 		}
2559*b1cdbd2cSJim Jagielski 		nRet = sal_True;
2560*b1cdbd2cSJim Jagielski 	}
2561*b1cdbd2cSJim Jagielski 	return nRet;
2562*b1cdbd2cSJim Jagielski }
2563*b1cdbd2cSJim Jagielski 
2564*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2565*b1cdbd2cSJim Jagielski 
_PasteFileName(TransferableDataHelper & rData,SwWrtShell & rSh,sal_uLong nFmt,sal_uInt16 nAction,const Point * pPt,sal_uInt8 nActionFlags,sal_Bool)2566*b1cdbd2cSJim Jagielski int SwTransferable::_PasteFileName( TransferableDataHelper& rData,
2567*b1cdbd2cSJim Jagielski 									SwWrtShell& rSh, sal_uLong nFmt,
2568*b1cdbd2cSJim Jagielski 									sal_uInt16 nAction, const Point* pPt,
2569*b1cdbd2cSJim Jagielski 									sal_uInt8 nActionFlags, sal_Bool /* bMsg */)
2570*b1cdbd2cSJim Jagielski {
2571*b1cdbd2cSJim Jagielski 	int nRet = SwTransferable::_PasteGrf( rData, rSh, nFmt, nAction,
2572*b1cdbd2cSJim Jagielski 											pPt, nActionFlags, 0, false);
2573*b1cdbd2cSJim Jagielski     if( nRet )
2574*b1cdbd2cSJim Jagielski         nRet |= SWTRANSFER_GRAPHIC_INSERTED;
2575*b1cdbd2cSJim Jagielski     if( !nRet )
2576*b1cdbd2cSJim Jagielski     {
2577*b1cdbd2cSJim Jagielski         String sFile, sDesc;
2578*b1cdbd2cSJim Jagielski         if( rData.GetString( nFmt, sFile ) && sFile.Len() )
2579*b1cdbd2cSJim Jagielski         {
2580*b1cdbd2cSJim Jagielski             INetURLObject aMediaURL;
2581*b1cdbd2cSJim Jagielski 
2582*b1cdbd2cSJim Jagielski             aMediaURL.SetSmartURL( sFile );
2583*b1cdbd2cSJim Jagielski             const String aMediaURLStr( aMediaURL.GetMainURL( INetURLObject::NO_DECODE ) );
2584*b1cdbd2cSJim Jagielski 
2585*b1cdbd2cSJim Jagielski             if( ::avmedia::MediaWindow::isMediaURL( aMediaURLStr ) )
2586*b1cdbd2cSJim Jagielski             {
2587*b1cdbd2cSJim Jagielski                 const SfxStringItem aMediaURLItem( SID_INSERT_AVMEDIA, aMediaURLStr );
2588*b1cdbd2cSJim Jagielski                 rSh.GetView().GetViewFrame()->GetDispatcher()->Execute(
2589*b1cdbd2cSJim Jagielski                                 SID_INSERT_AVMEDIA, SFX_CALLMODE_SYNCHRON,
2590*b1cdbd2cSJim Jagielski                                 &aMediaURLItem, 0L );
2591*b1cdbd2cSJim Jagielski             }
2592*b1cdbd2cSJim Jagielski             else
2593*b1cdbd2cSJim Jagielski             {
2594*b1cdbd2cSJim Jagielski                 sal_Bool bIsURLFile = SwTransferable::_CheckForURLOrLNKFile( rData, sFile, &sDesc );
2595*b1cdbd2cSJim Jagielski 
2596*b1cdbd2cSJim Jagielski                 //Eigenes FileFormat? -->Einfuegen, nicht fuer StarWriter/Web
2597*b1cdbd2cSJim Jagielski                 String sFileURL = URIHelper::SmartRel2Abs(INetURLObject(), sFile, Link(), false );
2598*b1cdbd2cSJim Jagielski                 const SfxFilter* pFlt = SW_PASTESDR_SETATTR == nAction
2599*b1cdbd2cSJim Jagielski                         ? 0 : SwIoSystem::GetFileFilter(
2600*b1cdbd2cSJim Jagielski                         sFileURL, aEmptyStr );
2601*b1cdbd2cSJim Jagielski                 if( pFlt && !rSh.GetView().GetDocShell()->ISA(SwWebDocShell)
2602*b1cdbd2cSJim Jagielski     /*
2603*b1cdbd2cSJim Jagielski     JP 02.07.98: warum nur fuer die Formate ??
2604*b1cdbd2cSJim Jagielski                     && ( pFlt->GetUserData() == FILTER_SW5 ||
2605*b1cdbd2cSJim Jagielski                     pFlt->GetUserData() == FILTER_SW4 ||
2606*b1cdbd2cSJim Jagielski                     pFlt->GetUserData() == FILTER_SW3 ||
2607*b1cdbd2cSJim Jagielski                     pFlt->GetUserData() == FILTER_SWG )
2608*b1cdbd2cSJim Jagielski     */
2609*b1cdbd2cSJim Jagielski                     )
2610*b1cdbd2cSJim Jagielski                 {
2611*b1cdbd2cSJim Jagielski     // und dann per PostUser Event den Bereich-Einfuegen-Dialog hochreissen
2612*b1cdbd2cSJim Jagielski                     SwSectionData * pSect = new SwSectionData(
2613*b1cdbd2cSJim Jagielski                                     FILE_LINK_SECTION,
2614*b1cdbd2cSJim Jagielski                                     rSh.GetDoc()->GetUniqueSectionName() );
2615*b1cdbd2cSJim Jagielski                     pSect->SetLinkFileName( sFileURL );
2616*b1cdbd2cSJim Jagielski                     pSect->SetProtectFlag( true );
2617*b1cdbd2cSJim Jagielski 
2618*b1cdbd2cSJim Jagielski                     Application::PostUserEvent( STATIC_LINK( &rSh, SwWrtShell,
2619*b1cdbd2cSJim Jagielski                                                 InsertRegionDialog ), pSect );
2620*b1cdbd2cSJim Jagielski                     nRet = 1;
2621*b1cdbd2cSJim Jagielski                     }
2622*b1cdbd2cSJim Jagielski                 else if( SW_PASTESDR_SETATTR == nAction ||
2623*b1cdbd2cSJim Jagielski                         ( bIsURLFile && SW_PASTESDR_INSERT == nAction ))
2624*b1cdbd2cSJim Jagielski                 {
2625*b1cdbd2cSJim Jagielski                     //Fremde Files koennen wir immerhin noch als Links
2626*b1cdbd2cSJim Jagielski                     //Einfuegen.
2627*b1cdbd2cSJim Jagielski 
2628*b1cdbd2cSJim Jagielski                     //#41801# ersteinmal die URL absolut machen
2629*b1cdbd2cSJim Jagielski                     INetURLObject aURL;
2630*b1cdbd2cSJim Jagielski                     aURL.SetSmartProtocol( INET_PROT_FILE );
2631*b1cdbd2cSJim Jagielski                     aURL.SetSmartURL( sFile );
2632*b1cdbd2cSJim Jagielski                     sFile = aURL.GetMainURL( INetURLObject::NO_DECODE );
2633*b1cdbd2cSJim Jagielski 
2634*b1cdbd2cSJim Jagielski                     switch( rSh.GetObjCntTypeOfSelection() )
2635*b1cdbd2cSJim Jagielski                     {
2636*b1cdbd2cSJim Jagielski                     case OBJCNT_FLY:
2637*b1cdbd2cSJim Jagielski                     case OBJCNT_GRF:
2638*b1cdbd2cSJim Jagielski                     case OBJCNT_OLE:
2639*b1cdbd2cSJim Jagielski                         {
2640*b1cdbd2cSJim Jagielski                             SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
2641*b1cdbd2cSJim Jagielski                             rSh.GetFlyFrmAttr( aSet );
2642*b1cdbd2cSJim Jagielski                             SwFmtURL aURL2( (SwFmtURL&)aSet.Get( RES_URL ) );
2643*b1cdbd2cSJim Jagielski                             aURL2.SetURL( sFile, sal_False );
2644*b1cdbd2cSJim Jagielski                             if( !aURL2.GetName().Len() )
2645*b1cdbd2cSJim Jagielski                                 aURL2.SetName( sFile );
2646*b1cdbd2cSJim Jagielski                             aSet.Put( aURL2 );
2647*b1cdbd2cSJim Jagielski                             rSh.SetFlyFrmAttr( aSet );
2648*b1cdbd2cSJim Jagielski                         }
2649*b1cdbd2cSJim Jagielski                         break;
2650*b1cdbd2cSJim Jagielski 
2651*b1cdbd2cSJim Jagielski                     default:
2652*b1cdbd2cSJim Jagielski                         {
2653*b1cdbd2cSJim Jagielski                             rSh.InsertURL( SwFmtINetFmt( sFile, aEmptyStr ),
2654*b1cdbd2cSJim Jagielski                                             sDesc.Len() ? sDesc : sFile );
2655*b1cdbd2cSJim Jagielski                         }
2656*b1cdbd2cSJim Jagielski                     }
2657*b1cdbd2cSJim Jagielski                     nRet = sal_True;
2658*b1cdbd2cSJim Jagielski                 }
2659*b1cdbd2cSJim Jagielski             }
2660*b1cdbd2cSJim Jagielski 		}
2661*b1cdbd2cSJim Jagielski 	}
2662*b1cdbd2cSJim Jagielski 	return nRet;
2663*b1cdbd2cSJim Jagielski }
2664*b1cdbd2cSJim Jagielski 
2665*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2666*b1cdbd2cSJim Jagielski 
_PasteDBData(TransferableDataHelper & rData,SwWrtShell & rSh,sal_uLong nFmt,sal_Bool bLink,const Point * pDragPt,sal_Bool bMsg)2667*b1cdbd2cSJim Jagielski int SwTransferable::_PasteDBData( TransferableDataHelper& rData,
2668*b1cdbd2cSJim Jagielski 									SwWrtShell& rSh, sal_uLong nFmt, sal_Bool bLink,
2669*b1cdbd2cSJim Jagielski 									const Point* pDragPt, sal_Bool bMsg )
2670*b1cdbd2cSJim Jagielski {
2671*b1cdbd2cSJim Jagielski 	int nRet = 0;
2672*b1cdbd2cSJim Jagielski 	String sTxt;
2673*b1cdbd2cSJim Jagielski 	if( rData.GetString( nFmt, sTxt ) && sTxt.Len() )
2674*b1cdbd2cSJim Jagielski 	{
2675*b1cdbd2cSJim Jagielski 		sal_uInt16 nWh = SOT_FORMATSTR_ID_SBA_CTRLDATAEXCHANGE == nFmt
2676*b1cdbd2cSJim Jagielski 					? 0
2677*b1cdbd2cSJim Jagielski 					: SOT_FORMATSTR_ID_SBA_DATAEXCHANGE == nFmt
2678*b1cdbd2cSJim Jagielski 								? (bLink
2679*b1cdbd2cSJim Jagielski 									? FN_QRY_MERGE_FIELD
2680*b1cdbd2cSJim Jagielski 									: FN_QRY_INSERT)
2681*b1cdbd2cSJim Jagielski 								: (bLink
2682*b1cdbd2cSJim Jagielski 									? 0
2683*b1cdbd2cSJim Jagielski 									: FN_QRY_INSERT_FIELD );
2684*b1cdbd2cSJim Jagielski         DataFlavorExVector& rVector = rData.GetDataFlavorExVector();
2685*b1cdbd2cSJim Jagielski 		sal_Bool bHaveColumnDescriptor = OColumnTransferable::canExtractColumnDescriptor(rVector, CTF_COLUMN_DESCRIPTOR | CTF_CONTROL_EXCHANGE);
2686*b1cdbd2cSJim Jagielski 		if ( SOT_FORMATSTR_ID_XFORMS == nFmt )
2687*b1cdbd2cSJim Jagielski 		{
2688*b1cdbd2cSJim Jagielski 			SdrObject* pObj;
2689*b1cdbd2cSJim Jagielski 			rSh.MakeDrawView();
2690*b1cdbd2cSJim Jagielski 			FmFormView* pFmView = PTR_CAST( FmFormView, rSh.GetDrawView() );
2691*b1cdbd2cSJim Jagielski 			if(pFmView) {
2692*b1cdbd2cSJim Jagielski 				const OXFormsDescriptor &rDesc = OXFormsTransferable::extractDescriptor(rData);
2693*b1cdbd2cSJim Jagielski                 if(0 != (pObj = pFmView->CreateXFormsControl(rDesc)))
2694*b1cdbd2cSJim Jagielski                 {
2695*b1cdbd2cSJim Jagielski                     rSh.SwFEShell::InsertDrawObj( *pObj, *pDragPt );
2696*b1cdbd2cSJim Jagielski                 }
2697*b1cdbd2cSJim Jagielski 			}
2698*b1cdbd2cSJim Jagielski 		}
2699*b1cdbd2cSJim Jagielski 		else if( nWh )
2700*b1cdbd2cSJim Jagielski 		{
2701*b1cdbd2cSJim Jagielski             SfxUsrAnyItem* pConnectionItem	= 0;
2702*b1cdbd2cSJim Jagielski 			SfxUsrAnyItem* pCursorItem		= 0;
2703*b1cdbd2cSJim Jagielski             SfxUsrAnyItem* pColumnItem		= 0;
2704*b1cdbd2cSJim Jagielski             SfxUsrAnyItem* pSourceItem		= 0;
2705*b1cdbd2cSJim Jagielski             SfxUsrAnyItem* pCommandItem		= 0;
2706*b1cdbd2cSJim Jagielski             SfxUsrAnyItem* pCommandTypeItem = 0;
2707*b1cdbd2cSJim Jagielski             SfxUsrAnyItem* pColumnNameItem	= 0;
2708*b1cdbd2cSJim Jagielski             SfxUsrAnyItem* pSelectionItem	= 0;
2709*b1cdbd2cSJim Jagielski 
2710*b1cdbd2cSJim Jagielski             sal_Bool bDataAvailable = sal_True;
2711*b1cdbd2cSJim Jagielski 	        ODataAccessDescriptor aDesc;
2712*b1cdbd2cSJim Jagielski             if(bHaveColumnDescriptor)
2713*b1cdbd2cSJim Jagielski                 aDesc = OColumnTransferable::extractColumnDescriptor(rData);
2714*b1cdbd2cSJim Jagielski             else if(ODataAccessObjectTransferable::canExtractObjectDescriptor(rVector) )
2715*b1cdbd2cSJim Jagielski                 aDesc = ODataAccessObjectTransferable::extractObjectDescriptor(rData);
2716*b1cdbd2cSJim Jagielski             else
2717*b1cdbd2cSJim Jagielski                 bDataAvailable = sal_False;
2718*b1cdbd2cSJim Jagielski 
2719*b1cdbd2cSJim Jagielski             if ( bDataAvailable )
2720*b1cdbd2cSJim Jagielski             {
2721*b1cdbd2cSJim Jagielski                 pConnectionItem = new SfxUsrAnyItem(FN_DB_CONNECTION_ANY, aDesc[daConnection]);
2722*b1cdbd2cSJim Jagielski                 pColumnItem = new SfxUsrAnyItem(FN_DB_COLUMN_ANY, aDesc[daColumnObject]);
2723*b1cdbd2cSJim Jagielski                 pSourceItem = new SfxUsrAnyItem(FN_DB_DATA_SOURCE_ANY, makeAny(aDesc.getDataSource()));
2724*b1cdbd2cSJim Jagielski                 pCommandItem = new SfxUsrAnyItem(FN_DB_DATA_COMMAND_ANY, aDesc[daCommand]);
2725*b1cdbd2cSJim Jagielski                 pCommandTypeItem = new SfxUsrAnyItem(FN_DB_DATA_COMMAND_TYPE_ANY, aDesc[daCommandType]);
2726*b1cdbd2cSJim Jagielski                 pColumnNameItem = new SfxUsrAnyItem(FN_DB_DATA_COLUMN_NAME_ANY, aDesc[daColumnName]);
2727*b1cdbd2cSJim Jagielski                 pSelectionItem = new SfxUsrAnyItem(FN_DB_DATA_SELECTION_ANY, aDesc[daSelection]);
2728*b1cdbd2cSJim Jagielski 				pCursorItem = new SfxUsrAnyItem(FN_DB_DATA_CURSOR_ANY, aDesc[daCursor]);
2729*b1cdbd2cSJim Jagielski             }
2730*b1cdbd2cSJim Jagielski 
2731*b1cdbd2cSJim Jagielski             SwView& rView = rSh.GetView();
2732*b1cdbd2cSJim Jagielski 			//force ::SelectShell
2733*b1cdbd2cSJim Jagielski 			rView.StopShellTimer();
2734*b1cdbd2cSJim Jagielski 
2735*b1cdbd2cSJim Jagielski 			SfxStringItem aDataDesc( nWh, sTxt );
2736*b1cdbd2cSJim Jagielski 			rView.GetViewFrame()->GetDispatcher()->Execute(
2737*b1cdbd2cSJim Jagielski                                 nWh, SFX_CALLMODE_ASYNCHRON, &aDataDesc,
2738*b1cdbd2cSJim Jagielski                                 pConnectionItem, pColumnItem,
2739*b1cdbd2cSJim Jagielski                                 pSourceItem, pCommandItem, pCommandTypeItem,
2740*b1cdbd2cSJim Jagielski                                 pColumnNameItem, pSelectionItem, pCursorItem,0L);
2741*b1cdbd2cSJim Jagielski             delete pConnectionItem;
2742*b1cdbd2cSJim Jagielski             delete pColumnItem;
2743*b1cdbd2cSJim Jagielski             delete pSourceItem;
2744*b1cdbd2cSJim Jagielski             delete pCommandItem;
2745*b1cdbd2cSJim Jagielski             delete pCommandTypeItem;
2746*b1cdbd2cSJim Jagielski             delete pColumnNameItem;
2747*b1cdbd2cSJim Jagielski 			delete pCursorItem;
2748*b1cdbd2cSJim Jagielski 		}
2749*b1cdbd2cSJim Jagielski 		else
2750*b1cdbd2cSJim Jagielski 		{
2751*b1cdbd2cSJim Jagielski 			SdrObject* pObj;
2752*b1cdbd2cSJim Jagielski 			rSh.MakeDrawView();
2753*b1cdbd2cSJim Jagielski 			FmFormView* pFmView = PTR_CAST( FmFormView, rSh.GetDrawView() );
2754*b1cdbd2cSJim Jagielski 			if (pFmView && bHaveColumnDescriptor)
2755*b1cdbd2cSJim Jagielski 			{
2756*b1cdbd2cSJim Jagielski 				if ( 0 != (pObj = pFmView->CreateFieldControl( OColumnTransferable::extractColumnDescriptor(rData) ) ) )
2757*b1cdbd2cSJim Jagielski                     rSh.SwFEShell::InsertDrawObj( *pObj, *pDragPt );
2758*b1cdbd2cSJim Jagielski 			}
2759*b1cdbd2cSJim Jagielski 		}
2760*b1cdbd2cSJim Jagielski 		nRet = 1;
2761*b1cdbd2cSJim Jagielski 	}
2762*b1cdbd2cSJim Jagielski 	else if( bMsg )
2763*b1cdbd2cSJim Jagielski 	{
2764*b1cdbd2cSJim Jagielski 		InfoBox( 0, SW_RES(MSG_CLPBRD_FORMAT_ERROR)).Execute();
2765*b1cdbd2cSJim Jagielski 	}
2766*b1cdbd2cSJim Jagielski 	return nRet;
2767*b1cdbd2cSJim Jagielski }
2768*b1cdbd2cSJim Jagielski 
2769*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2770*b1cdbd2cSJim Jagielski 
_PasteFileList(TransferableDataHelper & rData,SwWrtShell & rSh,sal_Bool bLink,const Point * pPt,sal_Bool bMsg)2771*b1cdbd2cSJim Jagielski int SwTransferable::_PasteFileList( TransferableDataHelper& rData,
2772*b1cdbd2cSJim Jagielski 									SwWrtShell& rSh, sal_Bool bLink,
2773*b1cdbd2cSJim Jagielski 									const Point* pPt, sal_Bool bMsg )
2774*b1cdbd2cSJim Jagielski {
2775*b1cdbd2cSJim Jagielski 	int nRet = 0;
2776*b1cdbd2cSJim Jagielski 	FileList aFileList;
2777*b1cdbd2cSJim Jagielski 	if( rData.GetFileList( SOT_FORMAT_FILE_LIST, aFileList ) &&
2778*b1cdbd2cSJim Jagielski 		aFileList.Count() )
2779*b1cdbd2cSJim Jagielski 	{
2780*b1cdbd2cSJim Jagielski 		sal_uInt16 nAct = bLink ? SW_PASTESDR_SETATTR : SW_PASTESDR_INSERT;
2781*b1cdbd2cSJim Jagielski 		String sFlyNm;
2782*b1cdbd2cSJim Jagielski 		// iterate over the filelist
2783*b1cdbd2cSJim Jagielski 		for( sal_uLong n = 0, nEnd = aFileList.Count(); n < nEnd; ++n )
2784*b1cdbd2cSJim Jagielski 		{
2785*b1cdbd2cSJim Jagielski 			TransferDataContainer* pHlp = new TransferDataContainer;
2786*b1cdbd2cSJim Jagielski 			pHlp->CopyString( FORMAT_FILE, aFileList.GetFile( n ));
2787*b1cdbd2cSJim Jagielski 			TransferableDataHelper aData( pHlp );
2788*b1cdbd2cSJim Jagielski 
2789*b1cdbd2cSJim Jagielski             if( SwTransferable::_PasteFileName( aData, rSh, SOT_FORMAT_FILE, nAct,
2790*b1cdbd2cSJim Jagielski 											pPt, sal_False, bMsg ))
2791*b1cdbd2cSJim Jagielski 			{
2792*b1cdbd2cSJim Jagielski 				if( bLink )
2793*b1cdbd2cSJim Jagielski 				{
2794*b1cdbd2cSJim Jagielski 					sFlyNm = rSh.GetFlyName();
2795*b1cdbd2cSJim Jagielski 					SwTransferable::SetSelInShell( rSh, sal_False, pPt );
2796*b1cdbd2cSJim Jagielski 				}
2797*b1cdbd2cSJim Jagielski 				nRet = 1;
2798*b1cdbd2cSJim Jagielski 			}
2799*b1cdbd2cSJim Jagielski 		}
2800*b1cdbd2cSJim Jagielski 		if( sFlyNm.Len() )
2801*b1cdbd2cSJim Jagielski 			rSh.GotoFly( sFlyNm );
2802*b1cdbd2cSJim Jagielski 	}
2803*b1cdbd2cSJim Jagielski 	else if( bMsg )
2804*b1cdbd2cSJim Jagielski 	{
2805*b1cdbd2cSJim Jagielski 		InfoBox( 0, SW_RES(MSG_CLPBRD_FORMAT_ERROR)).Execute();
2806*b1cdbd2cSJim Jagielski 	}
2807*b1cdbd2cSJim Jagielski 	return nRet;
2808*b1cdbd2cSJim Jagielski }
2809*b1cdbd2cSJim Jagielski 
2810*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2811*b1cdbd2cSJim Jagielski 
_CheckForURLOrLNKFile(TransferableDataHelper & rData,String & rFileName,String * pTitle)2812*b1cdbd2cSJim Jagielski sal_Bool SwTransferable::_CheckForURLOrLNKFile( TransferableDataHelper& rData,
2813*b1cdbd2cSJim Jagielski 										String& rFileName, String* pTitle )
2814*b1cdbd2cSJim Jagielski {
2815*b1cdbd2cSJim Jagielski 	sal_Bool bIsURLFile = sal_False;
2816*b1cdbd2cSJim Jagielski 	INetBookmark aBkmk;
2817*b1cdbd2cSJim Jagielski 	if( rData.GetINetBookmark( SOT_FORMATSTR_ID_SOLK, aBkmk ) )
2818*b1cdbd2cSJim Jagielski 	{
2819*b1cdbd2cSJim Jagielski 		rFileName = aBkmk.GetURL();
2820*b1cdbd2cSJim Jagielski 		if( pTitle )
2821*b1cdbd2cSJim Jagielski 			*pTitle = aBkmk.GetDescription();
2822*b1cdbd2cSJim Jagielski 		bIsURLFile = sal_True;
2823*b1cdbd2cSJim Jagielski 	}
2824*b1cdbd2cSJim Jagielski 	else
2825*b1cdbd2cSJim Jagielski 	{
2826*b1cdbd2cSJim Jagielski 		xub_StrLen nLen = rFileName.Len();
2827*b1cdbd2cSJim Jagielski 		if( 4 < nLen && '.' == rFileName.GetChar( nLen - 4 ))
2828*b1cdbd2cSJim Jagielski 		{
2829*b1cdbd2cSJim Jagielski 			String sExt( rFileName.Copy( nLen - 3 ));
2830*b1cdbd2cSJim Jagielski 			if( sExt.EqualsIgnoreCaseAscii( "url" ))
2831*b1cdbd2cSJim Jagielski 			{
2832*b1cdbd2cSJim Jagielski ASSERT( !&rFileName, "how do we read today .URL - Files?" );
2833*b1cdbd2cSJim Jagielski 			}
2834*b1cdbd2cSJim Jagielski 		}
2835*b1cdbd2cSJim Jagielski 	}
2836*b1cdbd2cSJim Jagielski 	return bIsURLFile;
2837*b1cdbd2cSJim Jagielski }
2838*b1cdbd2cSJim Jagielski 
2839*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2840*b1cdbd2cSJim Jagielski 
IsPasteSpecial(const SwWrtShell & rWrtShell,const TransferableDataHelper & rData)2841*b1cdbd2cSJim Jagielski sal_Bool SwTransferable::IsPasteSpecial( const SwWrtShell& rWrtShell,
2842*b1cdbd2cSJim Jagielski 									 const TransferableDataHelper& rData )
2843*b1cdbd2cSJim Jagielski {
2844*b1cdbd2cSJim Jagielski     // we can paste-special if there's an entry in the paste-special-format list
2845*b1cdbd2cSJim Jagielski     SvxClipboardFmtItem aClipboardFmtItem(0);
2846*b1cdbd2cSJim Jagielski     FillClipFmtItem( rWrtShell, rData, aClipboardFmtItem);
2847*b1cdbd2cSJim Jagielski     return aClipboardFmtItem.Count() > 0;
2848*b1cdbd2cSJim Jagielski }
2849*b1cdbd2cSJim Jagielski 
2850*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2851*b1cdbd2cSJim Jagielski 
PasteFormat(SwWrtShell & rSh,TransferableDataHelper & rData,sal_uLong nFormat)2852*b1cdbd2cSJim Jagielski int SwTransferable::PasteFormat( SwWrtShell& rSh,
2853*b1cdbd2cSJim Jagielski 									TransferableDataHelper& rData,
2854*b1cdbd2cSJim Jagielski 									sal_uLong nFormat )
2855*b1cdbd2cSJim Jagielski {
2856*b1cdbd2cSJim Jagielski 	SwWait aWait( *rSh.GetView().GetDocShell(), false );
2857*b1cdbd2cSJim Jagielski 	int nRet = 0;
2858*b1cdbd2cSJim Jagielski 
2859*b1cdbd2cSJim Jagielski 	sal_uLong nPrivateFmt = FORMAT_PRIVATE;
2860*b1cdbd2cSJim Jagielski 	SwTransferable *pClipboard = GetSwTransferable( rData );
2861*b1cdbd2cSJim Jagielski 	if( pClipboard &&
2862*b1cdbd2cSJim Jagielski 		((TRNSFR_DOCUMENT|TRNSFR_GRAPHIC|TRNSFR_OLE) & pClipboard->eBufferType ))
2863*b1cdbd2cSJim Jagielski 		nPrivateFmt = SOT_FORMATSTR_ID_EMBED_SOURCE;
2864*b1cdbd2cSJim Jagielski 
2865*b1cdbd2cSJim Jagielski 	if( pClipboard && nPrivateFmt == nFormat )
2866*b1cdbd2cSJim Jagielski 		nRet = pClipboard->PrivatePaste( rSh );
2867*b1cdbd2cSJim Jagielski 	else if( rData.HasFormat( nFormat ) )
2868*b1cdbd2cSJim Jagielski 	{
2869*b1cdbd2cSJim Jagielski         uno::Reference<XTransferable> xTransferable( rData.GetXTransferable() );
2870*b1cdbd2cSJim Jagielski 		sal_uInt16 nEventAction,
2871*b1cdbd2cSJim Jagielski 			   nDestination = SwTransferable::GetSotDestination( rSh ),
2872*b1cdbd2cSJim Jagielski 			   nSourceOptions =
2873*b1cdbd2cSJim Jagielski 					(( EXCHG_DEST_DOC_TEXTFRAME == nDestination ||
2874*b1cdbd2cSJim Jagielski 					   EXCHG_DEST_SWDOC_FREE_AREA == nDestination ||
2875*b1cdbd2cSJim Jagielski 					   EXCHG_DEST_DOC_TEXTFRAME_WEB == nDestination ||
2876*b1cdbd2cSJim Jagielski 					   EXCHG_DEST_SWDOC_FREE_AREA_WEB == nDestination )
2877*b1cdbd2cSJim Jagielski 										? EXCHG_IN_ACTION_COPY
2878*b1cdbd2cSJim Jagielski 										: EXCHG_IN_ACTION_MOVE),
2879*b1cdbd2cSJim Jagielski 			   nAction = SotExchange::GetExchangeAction(
2880*b1cdbd2cSJim Jagielski 									rData.GetDataFlavorExVector(),
2881*b1cdbd2cSJim Jagielski 									nDestination,
2882*b1cdbd2cSJim Jagielski 									nSourceOptions,  			/* ?? */
2883*b1cdbd2cSJim Jagielski 									EXCHG_IN_ACTION_DEFAULT,    /* ?? */
2884*b1cdbd2cSJim Jagielski 									nFormat, nEventAction, nFormat,
2885*b1cdbd2cSJim Jagielski 									lcl_getTransferPointer ( xTransferable ) );
2886*b1cdbd2cSJim Jagielski 
2887*b1cdbd2cSJim Jagielski 		if( EXCHG_INOUT_ACTION_NONE != nAction )
2888*b1cdbd2cSJim Jagielski 			nRet = SwTransferable::PasteData( rData, rSh, nAction, nFormat,
2889*b1cdbd2cSJim Jagielski                                                 nDestination, sal_True, sal_False );
2890*b1cdbd2cSJim Jagielski 	}
2891*b1cdbd2cSJim Jagielski 	return nRet;
2892*b1cdbd2cSJim Jagielski }
2893*b1cdbd2cSJim Jagielski 
2894*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2895*b1cdbd2cSJim Jagielski 
_TestAllowedFormat(const TransferableDataHelper & rData,sal_uLong nFormat,sal_uInt16 nDestination)2896*b1cdbd2cSJim Jagielski int SwTransferable::_TestAllowedFormat( const TransferableDataHelper& rData,
2897*b1cdbd2cSJim Jagielski 										sal_uLong nFormat, sal_uInt16 nDestination )
2898*b1cdbd2cSJim Jagielski {
2899*b1cdbd2cSJim Jagielski 	sal_uInt16 nAction = EXCHG_INOUT_ACTION_NONE, nEventAction;
2900*b1cdbd2cSJim Jagielski 	if( rData.HasFormat( nFormat )) {
2901*b1cdbd2cSJim Jagielski         uno::Reference<XTransferable> xTransferable( rData.GetXTransferable() );
2902*b1cdbd2cSJim Jagielski 		nAction = SotExchange::GetExchangeAction(
2903*b1cdbd2cSJim Jagielski 						rData.GetDataFlavorExVector(),
2904*b1cdbd2cSJim Jagielski 						nDestination, EXCHG_IN_ACTION_COPY,
2905*b1cdbd2cSJim Jagielski 						EXCHG_IN_ACTION_COPY, nFormat,
2906*b1cdbd2cSJim Jagielski 						nEventAction, nFormat,
2907*b1cdbd2cSJim Jagielski 						lcl_getTransferPointer ( xTransferable ) );
2908*b1cdbd2cSJim Jagielski     }
2909*b1cdbd2cSJim Jagielski 	return EXCHG_INOUT_ACTION_NONE != nAction;
2910*b1cdbd2cSJim Jagielski }
2911*b1cdbd2cSJim Jagielski 
2912*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2913*b1cdbd2cSJim Jagielski 
2914*b1cdbd2cSJim Jagielski /**
2915*b1cdbd2cSJim Jagielski  * the list of formats which will be offered to the user in the 'Paste
2916*b1cdbd2cSJim Jagielski  * Special...' dialog and the paste button menu
2917*b1cdbd2cSJim Jagielski  */
2918*b1cdbd2cSJim Jagielski static sal_uInt16 aPasteSpecialIds[] =
2919*b1cdbd2cSJim Jagielski {
2920*b1cdbd2cSJim Jagielski     SOT_FORMATSTR_ID_HTML,
2921*b1cdbd2cSJim Jagielski     SOT_FORMATSTR_ID_HTML_SIMPLE,
2922*b1cdbd2cSJim Jagielski     SOT_FORMATSTR_ID_HTML_NO_COMMENT,
2923*b1cdbd2cSJim Jagielski     FORMAT_RTF,
2924*b1cdbd2cSJim Jagielski     FORMAT_STRING,
2925*b1cdbd2cSJim Jagielski     SOT_FORMATSTR_ID_SONLK,
2926*b1cdbd2cSJim Jagielski     SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK,
2927*b1cdbd2cSJim Jagielski     SOT_FORMATSTR_ID_DRAWING,
2928*b1cdbd2cSJim Jagielski     SOT_FORMATSTR_ID_SVXB,
2929*b1cdbd2cSJim Jagielski     FORMAT_GDIMETAFILE,
2930*b1cdbd2cSJim Jagielski     FORMAT_BITMAP,
2931*b1cdbd2cSJim Jagielski     SOT_FORMATSTR_ID_SVIM,
2932*b1cdbd2cSJim Jagielski     SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR,
2933*b1cdbd2cSJim Jagielski     0
2934*b1cdbd2cSJim Jagielski };
2935*b1cdbd2cSJim Jagielski 
2936*b1cdbd2cSJim Jagielski 
PasteUnformatted(SwWrtShell & rSh,TransferableDataHelper & rData)2937*b1cdbd2cSJim Jagielski int SwTransferable::PasteUnformatted( SwWrtShell& rSh, TransferableDataHelper& rData )
2938*b1cdbd2cSJim Jagielski {
2939*b1cdbd2cSJim Jagielski     // Plain text == unformatted
2940*b1cdbd2cSJim Jagielski 	return SwTransferable::PasteFormat( rSh, rData, SOT_FORMAT_STRING );
2941*b1cdbd2cSJim Jagielski }
2942*b1cdbd2cSJim Jagielski 
2943*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2944*b1cdbd2cSJim Jagielski 
PasteSpecial(SwWrtShell & rSh,TransferableDataHelper & rData,sal_uLong & rFormatUsed)2945*b1cdbd2cSJim Jagielski int SwTransferable::PasteSpecial( SwWrtShell& rSh, TransferableDataHelper& rData, sal_uLong& rFormatUsed )
2946*b1cdbd2cSJim Jagielski {
2947*b1cdbd2cSJim Jagielski 	int nRet = 0;
2948*b1cdbd2cSJim Jagielski     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
2949*b1cdbd2cSJim Jagielski     SfxAbstractPasteDialog* pDlg = pFact->CreatePasteDialog( &rSh.GetView().GetEditWin() );
2950*b1cdbd2cSJim Jagielski 
2951*b1cdbd2cSJim Jagielski 	DataFlavorExVector aFormats( rData.GetDataFlavorExVector() );
2952*b1cdbd2cSJim Jagielski 	TransferableObjectDescriptor aDesc;
2953*b1cdbd2cSJim Jagielski 
2954*b1cdbd2cSJim Jagielski 	sal_uInt16 nDest = SwTransferable::GetSotDestination( rSh );
2955*b1cdbd2cSJim Jagielski 
2956*b1cdbd2cSJim Jagielski 	SwTransferable *pClipboard = GetSwTransferable( rData );
2957*b1cdbd2cSJim Jagielski 	if( pClipboard )
2958*b1cdbd2cSJim Jagielski 	{
2959*b1cdbd2cSJim Jagielski 		aDesc = pClipboard->aObjDesc;
2960*b1cdbd2cSJim Jagielski 		sal_uInt16 nResId;
2961*b1cdbd2cSJim Jagielski 		if( pClipboard->eBufferType & TRNSFR_DOCUMENT )
2962*b1cdbd2cSJim Jagielski 			nResId = STR_PRIVATETEXT;
2963*b1cdbd2cSJim Jagielski 		else if( pClipboard->eBufferType & TRNSFR_GRAPHIC )
2964*b1cdbd2cSJim Jagielski 			nResId = STR_PRIVATEGRAPHIC;
2965*b1cdbd2cSJim Jagielski 		else if( pClipboard->eBufferType == TRNSFR_OLE )
2966*b1cdbd2cSJim Jagielski 			nResId = STR_PRIVATEOLE;
2967*b1cdbd2cSJim Jagielski 		else
2968*b1cdbd2cSJim Jagielski 			nResId = 0;
2969*b1cdbd2cSJim Jagielski 
2970*b1cdbd2cSJim Jagielski 		if( nResId )
2971*b1cdbd2cSJim Jagielski 		{
2972*b1cdbd2cSJim Jagielski 			if( STR_PRIVATEOLE == nResId || STR_PRIVATEGRAPHIC == nResId )
2973*b1cdbd2cSJim Jagielski 			{
2974*b1cdbd2cSJim Jagielski 				// add SOT_FORMATSTR_ID_EMBED_SOURCE to the formats. This
2975*b1cdbd2cSJim Jagielski 				// format display then the private format name.
2976*b1cdbd2cSJim Jagielski 				DataFlavorEx aFlavorEx;
2977*b1cdbd2cSJim Jagielski 				aFlavorEx.mnSotId = SOT_FORMATSTR_ID_EMBED_SOURCE;
2978*b1cdbd2cSJim Jagielski 				aFormats.insert( aFormats.begin(), aFlavorEx );
2979*b1cdbd2cSJim Jagielski 			}
2980*b1cdbd2cSJim Jagielski 			pDlg->SetObjName( pClipboard->aObjDesc.maClassName,
2981*b1cdbd2cSJim Jagielski 								SW_RES( nResId ) );
2982*b1cdbd2cSJim Jagielski 			pDlg->Insert( SOT_FORMATSTR_ID_EMBED_SOURCE, aEmptyStr );
2983*b1cdbd2cSJim Jagielski 		}
2984*b1cdbd2cSJim Jagielski 	}
2985*b1cdbd2cSJim Jagielski 	else
2986*b1cdbd2cSJim Jagielski 	{
2987*b1cdbd2cSJim Jagielski 		if( rData.HasFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) )
2988*b1cdbd2cSJim Jagielski 			rData.GetTransferableObjectDescriptor(
2989*b1cdbd2cSJim Jagielski 								SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aDesc );
2990*b1cdbd2cSJim Jagielski 
2991*b1cdbd2cSJim Jagielski 		if( SwTransferable::_TestAllowedFormat( rData, SOT_FORMATSTR_ID_EMBED_SOURCE, nDest ))
2992*b1cdbd2cSJim Jagielski 			pDlg->Insert( SOT_FORMATSTR_ID_EMBED_SOURCE, aEmptyStr );
2993*b1cdbd2cSJim Jagielski 		if( SwTransferable::_TestAllowedFormat( rData, SOT_FORMATSTR_ID_LINK_SOURCE, nDest ))
2994*b1cdbd2cSJim Jagielski 			pDlg->Insert( SOT_FORMATSTR_ID_LINK_SOURCE, aEmptyStr );
2995*b1cdbd2cSJim Jagielski 	}
2996*b1cdbd2cSJim Jagielski 
2997*b1cdbd2cSJim Jagielski 	if( SwTransferable::_TestAllowedFormat( rData, SOT_FORMATSTR_ID_LINK, nDest ))
2998*b1cdbd2cSJim Jagielski 		pDlg->Insert( SOT_FORMATSTR_ID_LINK, SW_RES(STR_DDEFORMAT) );
2999*b1cdbd2cSJim Jagielski 
3000*b1cdbd2cSJim Jagielski 	for( sal_uInt16* pIds = aPasteSpecialIds; *pIds; ++pIds )
3001*b1cdbd2cSJim Jagielski 		if( SwTransferable::_TestAllowedFormat( rData, *pIds, nDest ))
3002*b1cdbd2cSJim Jagielski 			pDlg->Insert( *pIds, aEmptyStr );
3003*b1cdbd2cSJim Jagielski 
3004*b1cdbd2cSJim Jagielski     sal_uLong nFormat = pDlg->GetFormat( rData.GetTransferable() );
3005*b1cdbd2cSJim Jagielski 
3006*b1cdbd2cSJim Jagielski 	if( nFormat )
3007*b1cdbd2cSJim Jagielski 		nRet = SwTransferable::PasteFormat( rSh, rData, nFormat );
3008*b1cdbd2cSJim Jagielski 
3009*b1cdbd2cSJim Jagielski     if ( nRet )
3010*b1cdbd2cSJim Jagielski         rFormatUsed = nFormat;
3011*b1cdbd2cSJim Jagielski 
3012*b1cdbd2cSJim Jagielski     delete pDlg;
3013*b1cdbd2cSJim Jagielski 	return nRet;
3014*b1cdbd2cSJim Jagielski }
3015*b1cdbd2cSJim Jagielski 
3016*b1cdbd2cSJim Jagielski 
FillClipFmtItem(const SwWrtShell & rSh,const TransferableDataHelper & rData,SvxClipboardFmtItem & rToFill)3017*b1cdbd2cSJim Jagielski void SwTransferable::FillClipFmtItem( const SwWrtShell& rSh,
3018*b1cdbd2cSJim Jagielski 								const TransferableDataHelper& rData,
3019*b1cdbd2cSJim Jagielski 								SvxClipboardFmtItem & rToFill )
3020*b1cdbd2cSJim Jagielski {
3021*b1cdbd2cSJim Jagielski 	sal_uInt16 nDest = SwTransferable::GetSotDestination( rSh );
3022*b1cdbd2cSJim Jagielski 
3023*b1cdbd2cSJim Jagielski 	SwTransferable *pClipboard = GetSwTransferable( rData );
3024*b1cdbd2cSJim Jagielski 	if( pClipboard )
3025*b1cdbd2cSJim Jagielski 	{
3026*b1cdbd2cSJim Jagielski 		sal_uInt16 nResId;
3027*b1cdbd2cSJim Jagielski 		if( pClipboard->eBufferType & TRNSFR_DOCUMENT )
3028*b1cdbd2cSJim Jagielski 			nResId = STR_PRIVATETEXT;
3029*b1cdbd2cSJim Jagielski 		else if( pClipboard->eBufferType & TRNSFR_GRAPHIC )
3030*b1cdbd2cSJim Jagielski 			nResId = STR_PRIVATEGRAPHIC;
3031*b1cdbd2cSJim Jagielski 		else if( pClipboard->eBufferType == TRNSFR_OLE )
3032*b1cdbd2cSJim Jagielski 			nResId = STR_PRIVATEOLE;
3033*b1cdbd2cSJim Jagielski 		else
3034*b1cdbd2cSJim Jagielski 			nResId = 0;
3035*b1cdbd2cSJim Jagielski 
3036*b1cdbd2cSJim Jagielski 		if( nResId )
3037*b1cdbd2cSJim Jagielski 			rToFill.AddClipbrdFormat( SOT_FORMATSTR_ID_EMBED_SOURCE,
3038*b1cdbd2cSJim Jagielski 										SW_RES( nResId ) );
3039*b1cdbd2cSJim Jagielski 	}
3040*b1cdbd2cSJim Jagielski 	else
3041*b1cdbd2cSJim Jagielski 	{
3042*b1cdbd2cSJim Jagielski 		TransferableObjectDescriptor aDesc;
3043*b1cdbd2cSJim Jagielski 		if( rData.HasFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) )
3044*b1cdbd2cSJim Jagielski 			((TransferableDataHelper&)rData).GetTransferableObjectDescriptor(
3045*b1cdbd2cSJim Jagielski 								SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aDesc );
3046*b1cdbd2cSJim Jagielski 
3047*b1cdbd2cSJim Jagielski 		if( SwTransferable::_TestAllowedFormat( rData, SOT_FORMATSTR_ID_EMBED_SOURCE, nDest ))
3048*b1cdbd2cSJim Jagielski 			rToFill.AddClipbrdFormat( SOT_FORMATSTR_ID_EMBED_SOURCE,
3049*b1cdbd2cSJim Jagielski 											aDesc.maTypeName );
3050*b1cdbd2cSJim Jagielski 		if( SwTransferable::_TestAllowedFormat( rData, SOT_FORMATSTR_ID_LINK_SOURCE, nDest ))
3051*b1cdbd2cSJim Jagielski 			rToFill.AddClipbrdFormat( SOT_FORMATSTR_ID_LINK_SOURCE );
3052*b1cdbd2cSJim Jagielski 
3053*b1cdbd2cSJim Jagielski 		SotFormatStringId nFormat;
3054*b1cdbd2cSJim Jagielski 		if ( rData.HasFormat(nFormat = SOT_FORMATSTR_ID_EMBED_SOURCE_OLE) || rData.HasFormat(nFormat = SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE) )
3055*b1cdbd2cSJim Jagielski 		{
3056*b1cdbd2cSJim Jagielski 			String sName,sSource;
3057*b1cdbd2cSJim Jagielski             if ( SvPasteObjectHelper::GetEmbeddedName(rData,sName,sSource,nFormat) )
3058*b1cdbd2cSJim Jagielski 				rToFill.AddClipbrdFormat( nFormat, sName );
3059*b1cdbd2cSJim Jagielski 		}
3060*b1cdbd2cSJim Jagielski 	}
3061*b1cdbd2cSJim Jagielski 
3062*b1cdbd2cSJim Jagielski 	if( SwTransferable::_TestAllowedFormat( rData, SOT_FORMATSTR_ID_LINK, nDest ))
3063*b1cdbd2cSJim Jagielski 		rToFill.AddClipbrdFormat( SOT_FORMATSTR_ID_LINK, SW_RES(STR_DDEFORMAT) );
3064*b1cdbd2cSJim Jagielski 
3065*b1cdbd2cSJim Jagielski 	for( sal_uInt16* pIds = aPasteSpecialIds; *pIds; ++pIds )
3066*b1cdbd2cSJim Jagielski 		if( SwTransferable::_TestAllowedFormat( rData, *pIds, nDest ))
3067*b1cdbd2cSJim Jagielski 			rToFill.AddClipbrdFormat( *pIds, aEmptyStr );
3068*b1cdbd2cSJim Jagielski }
3069*b1cdbd2cSJim Jagielski 
SetDataForDragAndDrop(const Point & rSttPos)3070*b1cdbd2cSJim Jagielski void SwTransferable::SetDataForDragAndDrop( const Point& rSttPos )
3071*b1cdbd2cSJim Jagielski {
3072*b1cdbd2cSJim Jagielski     if(!pWrtShell)
3073*b1cdbd2cSJim Jagielski         return;
3074*b1cdbd2cSJim Jagielski     String sGrfNm;
3075*b1cdbd2cSJim Jagielski 	const int nSelection = pWrtShell->GetSelectionType();
3076*b1cdbd2cSJim Jagielski 	if( nsSelectionType::SEL_GRF == nSelection)
3077*b1cdbd2cSJim Jagielski 	{
3078*b1cdbd2cSJim Jagielski 		AddFormat( SOT_FORMATSTR_ID_SVXB );
3079*b1cdbd2cSJim Jagielski         // --> OD 2005-02-09 #119353# - robust
3080*b1cdbd2cSJim Jagielski         const Graphic* pGrf = pWrtShell->GetGraphic();
3081*b1cdbd2cSJim Jagielski         if ( pGrf && pGrf->IsSupportedGraphic() )
3082*b1cdbd2cSJim Jagielski         // <--
3083*b1cdbd2cSJim Jagielski 		{
3084*b1cdbd2cSJim Jagielski 			AddFormat( FORMAT_GDIMETAFILE );
3085*b1cdbd2cSJim Jagielski             AddFormat( SOT_FORMATSTR_ID_PNG );
3086*b1cdbd2cSJim Jagielski 			AddFormat( FORMAT_BITMAP );
3087*b1cdbd2cSJim Jagielski 		}
3088*b1cdbd2cSJim Jagielski 		eBufferType = TRNSFR_GRAPHIC;
3089*b1cdbd2cSJim Jagielski 		pWrtShell->GetGrfNms( &sGrfNm, 0 );
3090*b1cdbd2cSJim Jagielski 	}
3091*b1cdbd2cSJim Jagielski 	else if( nsSelectionType::SEL_OLE == nSelection )
3092*b1cdbd2cSJim Jagielski 	{
3093*b1cdbd2cSJim Jagielski 		AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE );
3094*b1cdbd2cSJim Jagielski         PrepareOLE( aObjDesc );
3095*b1cdbd2cSJim Jagielski 		AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR );
3096*b1cdbd2cSJim Jagielski 		AddFormat( FORMAT_GDIMETAFILE );
3097*b1cdbd2cSJim Jagielski 		eBufferType = TRNSFR_OLE;
3098*b1cdbd2cSJim Jagielski 	}
3099*b1cdbd2cSJim Jagielski 	//Gibt es ueberhaupt etwas zum bereitstellen?
3100*b1cdbd2cSJim Jagielski 	else if ( pWrtShell->IsSelection() || pWrtShell->IsFrmSelected() ||
3101*b1cdbd2cSJim Jagielski 			  pWrtShell->IsObjSelected() )
3102*b1cdbd2cSJim Jagielski 	{
3103*b1cdbd2cSJim Jagielski 		if( pWrtShell->IsObjSelected() )
3104*b1cdbd2cSJim Jagielski 			eBufferType = TRNSFR_DRAWING;
3105*b1cdbd2cSJim Jagielski 		else
3106*b1cdbd2cSJim Jagielski 		{
3107*b1cdbd2cSJim Jagielski 			eBufferType = TRNSFR_DOCUMENT;
3108*b1cdbd2cSJim Jagielski 			if( SwWrtShell::NO_WORD !=
3109*b1cdbd2cSJim Jagielski 				pWrtShell->IntelligentCut( nSelection, sal_False ))
3110*b1cdbd2cSJim Jagielski 				eBufferType = TransferBufferType( TRNSFR_DOCUMENT_WORD
3111*b1cdbd2cSJim Jagielski 													| eBufferType);
3112*b1cdbd2cSJim Jagielski 		}
3113*b1cdbd2cSJim Jagielski 
3114*b1cdbd2cSJim Jagielski 		if( nSelection & nsSelectionType::SEL_TBL_CELLS )
3115*b1cdbd2cSJim Jagielski 			eBufferType = (TransferBufferType)(TRNSFR_TABELLE | eBufferType);
3116*b1cdbd2cSJim Jagielski 
3117*b1cdbd2cSJim Jagielski 		AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE );
3118*b1cdbd2cSJim Jagielski 
3119*b1cdbd2cSJim Jagielski 		//RTF vor das Metafile von OLE stellen, weil mit weniger verlusten
3120*b1cdbd2cSJim Jagielski 		//behaftet.
3121*b1cdbd2cSJim Jagielski 		if( !pWrtShell->IsObjSelected() )
3122*b1cdbd2cSJim Jagielski 		{
3123*b1cdbd2cSJim Jagielski 			AddFormat( FORMAT_RTF );
3124*b1cdbd2cSJim Jagielski 			AddFormat( SOT_FORMATSTR_ID_HTML );
3125*b1cdbd2cSJim Jagielski 		}
3126*b1cdbd2cSJim Jagielski 		if( pWrtShell->IsSelection() )
3127*b1cdbd2cSJim Jagielski 			AddFormat( FORMAT_STRING );
3128*b1cdbd2cSJim Jagielski 
3129*b1cdbd2cSJim Jagielski 		if( nSelection & ( nsSelectionType::SEL_DRW | nsSelectionType::SEL_DRW_FORM ))
3130*b1cdbd2cSJim Jagielski 		{
3131*b1cdbd2cSJim Jagielski 			AddFormat( SOT_FORMATSTR_ID_DRAWING );
3132*b1cdbd2cSJim Jagielski 			if ( nSelection & nsSelectionType::SEL_DRW )
3133*b1cdbd2cSJim Jagielski 			{
3134*b1cdbd2cSJim Jagielski 				AddFormat( FORMAT_GDIMETAFILE );
3135*b1cdbd2cSJim Jagielski                 AddFormat( SOT_FORMATSTR_ID_PNG );
3136*b1cdbd2cSJim Jagielski 				AddFormat( FORMAT_BITMAP );
3137*b1cdbd2cSJim Jagielski 			}
3138*b1cdbd2cSJim Jagielski 			eBufferType = (TransferBufferType)( TRNSFR_GRAPHIC | eBufferType );
3139*b1cdbd2cSJim Jagielski 
3140*b1cdbd2cSJim Jagielski 			pClpGraphic = new Graphic;
3141*b1cdbd2cSJim Jagielski 			if( !pWrtShell->GetDrawObjGraphic( FORMAT_GDIMETAFILE, *pClpGraphic ))
3142*b1cdbd2cSJim Jagielski 				pOrigGrf = pClpGraphic;
3143*b1cdbd2cSJim Jagielski 			pClpBitmap = new Graphic;
3144*b1cdbd2cSJim Jagielski 			if( !pWrtShell->GetDrawObjGraphic( FORMAT_BITMAP, *pClpBitmap ))
3145*b1cdbd2cSJim Jagielski 				pOrigGrf = pClpBitmap;
3146*b1cdbd2cSJim Jagielski 
3147*b1cdbd2cSJim Jagielski 			// ist es ein URL-Button ?
3148*b1cdbd2cSJim Jagielski 			String sURL, sDesc;
3149*b1cdbd2cSJim Jagielski 			if( pWrtShell->GetURLFromButton( sURL, sDesc ) )
3150*b1cdbd2cSJim Jagielski 			{
3151*b1cdbd2cSJim Jagielski 				AddFormat( FORMAT_STRING );
3152*b1cdbd2cSJim Jagielski  				AddFormat( SOT_FORMATSTR_ID_SOLK );
3153*b1cdbd2cSJim Jagielski  				AddFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK );
3154*b1cdbd2cSJim Jagielski  				AddFormat( SOT_FORMATSTR_ID_FILECONTENT );
3155*b1cdbd2cSJim Jagielski  				AddFormat( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR );
3156*b1cdbd2cSJim Jagielski  				AddFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR );
3157*b1cdbd2cSJim Jagielski 				eBufferType = (TransferBufferType)( TRNSFR_INETFLD | eBufferType );
3158*b1cdbd2cSJim Jagielski 			}
3159*b1cdbd2cSJim Jagielski 		}
3160*b1cdbd2cSJim Jagielski 
3161*b1cdbd2cSJim Jagielski 		//ObjectDescriptor wurde bereits aus der alten DocShell gefuellt.
3162*b1cdbd2cSJim Jagielski 		//Jetzt noch anpassen. Dadurch kann im GetData die erste Anfrage
3163*b1cdbd2cSJim Jagielski 		//auch noch mit delayed rendering beantwortet werden.
3164*b1cdbd2cSJim Jagielski 		aObjDesc.mbCanLink = sal_False;
3165*b1cdbd2cSJim Jagielski 		aObjDesc.maDragStartPos = rSttPos;
3166*b1cdbd2cSJim Jagielski 		aObjDesc.maSize = OutputDevice::LogicToLogic( Size( OLESIZE ),
3167*b1cdbd2cSJim Jagielski 												MAP_TWIP, MAP_100TH_MM );
3168*b1cdbd2cSJim Jagielski         PrepareOLE( aObjDesc );
3169*b1cdbd2cSJim Jagielski         AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR );
3170*b1cdbd2cSJim Jagielski 	}
3171*b1cdbd2cSJim Jagielski 	else if( nSelection & nsSelectionType::SEL_TXT && !pWrtShell->HasMark() )
3172*b1cdbd2cSJim Jagielski 	{
3173*b1cdbd2cSJim Jagielski 		// ist nur ein Feld - Selektiert?
3174*b1cdbd2cSJim Jagielski 		SwContentAtPos aCntntAtPos( SwContentAtPos::SW_INETATTR );
3175*b1cdbd2cSJim Jagielski 		Point aPos( SwEditWin::GetDDStartPosX(), SwEditWin::GetDDStartPosY());
3176*b1cdbd2cSJim Jagielski 
3177*b1cdbd2cSJim Jagielski 		if( pWrtShell->GetContentAtPos( aPos, aCntntAtPos ) )
3178*b1cdbd2cSJim Jagielski 		{
3179*b1cdbd2cSJim Jagielski 			AddFormat( FORMAT_STRING );
3180*b1cdbd2cSJim Jagielski  			AddFormat( SOT_FORMATSTR_ID_SOLK );
3181*b1cdbd2cSJim Jagielski  			AddFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK );
3182*b1cdbd2cSJim Jagielski  			AddFormat( SOT_FORMATSTR_ID_FILECONTENT );
3183*b1cdbd2cSJim Jagielski  			AddFormat( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR );
3184*b1cdbd2cSJim Jagielski  			AddFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR );
3185*b1cdbd2cSJim Jagielski 			eBufferType = TRNSFR_INETFLD;
3186*b1cdbd2cSJim Jagielski 		}
3187*b1cdbd2cSJim Jagielski 	}
3188*b1cdbd2cSJim Jagielski 
3189*b1cdbd2cSJim Jagielski 	if( pWrtShell->IsFrmSelected() )
3190*b1cdbd2cSJim Jagielski 	{
3191*b1cdbd2cSJim Jagielski 		SfxItemSet aSet( pWrtShell->GetAttrPool(), RES_URL, RES_URL );
3192*b1cdbd2cSJim Jagielski 		pWrtShell->GetFlyFrmAttr( aSet );
3193*b1cdbd2cSJim Jagielski 		const SwFmtURL& rURL = (SwFmtURL&)aSet.Get( RES_URL );
3194*b1cdbd2cSJim Jagielski 		if( rURL.GetMap() )
3195*b1cdbd2cSJim Jagielski 		{
3196*b1cdbd2cSJim Jagielski 			pImageMap = new ImageMap( *rURL.GetMap() );
3197*b1cdbd2cSJim Jagielski 			AddFormat( SOT_FORMATSTR_ID_SVIM );
3198*b1cdbd2cSJim Jagielski 		}
3199*b1cdbd2cSJim Jagielski 		else if( rURL.GetURL().Len() )
3200*b1cdbd2cSJim Jagielski 		{
3201*b1cdbd2cSJim Jagielski 			pTargetURL = new INetImage( sGrfNm, rURL.GetURL(),
3202*b1cdbd2cSJim Jagielski 										rURL.GetTargetFrameName(),
3203*b1cdbd2cSJim Jagielski 										aEmptyStr, Size() );
3204*b1cdbd2cSJim Jagielski 			AddFormat( SOT_FORMATSTR_ID_INET_IMAGE );
3205*b1cdbd2cSJim Jagielski 		}
3206*b1cdbd2cSJim Jagielski 	}
3207*b1cdbd2cSJim Jagielski }
3208*b1cdbd2cSJim Jagielski 
StartDrag(Window * pWin,const Point & rPos)3209*b1cdbd2cSJim Jagielski void SwTransferable::StartDrag( Window* pWin, const Point& rPos )
3210*b1cdbd2cSJim Jagielski {
3211*b1cdbd2cSJim Jagielski     if(!pWrtShell)
3212*b1cdbd2cSJim Jagielski         return;
3213*b1cdbd2cSJim Jagielski     bOldIdle = pWrtShell->GetViewOptions()->IsIdle();
3214*b1cdbd2cSJim Jagielski 	bCleanUp = sal_True;
3215*b1cdbd2cSJim Jagielski 
3216*b1cdbd2cSJim Jagielski 	((SwViewOption *)pWrtShell->GetViewOptions())->SetIdle( sal_False );
3217*b1cdbd2cSJim Jagielski 
3218*b1cdbd2cSJim Jagielski 	if( pWrtShell->IsSelFrmMode() )
3219*b1cdbd2cSJim Jagielski 		pWrtShell->ShowCrsr();
3220*b1cdbd2cSJim Jagielski 
3221*b1cdbd2cSJim Jagielski     SW_MOD()->pDragDrop = this;
3222*b1cdbd2cSJim Jagielski 
3223*b1cdbd2cSJim Jagielski 	SetDataForDragAndDrop( rPos );
3224*b1cdbd2cSJim Jagielski 
3225*b1cdbd2cSJim Jagielski 	sal_Int8 nDragOptions = DND_ACTION_COPYMOVE | DND_ACTION_LINK;
3226*b1cdbd2cSJim Jagielski 	SwDocShell* pDShell = pWrtShell->GetView().GetDocShell();
3227*b1cdbd2cSJim Jagielski 	if( ( pDShell && pDShell->IsReadOnly() ) || pWrtShell->HasReadonlySel() )
3228*b1cdbd2cSJim Jagielski 		nDragOptions &= ~DND_ACTION_MOVE;
3229*b1cdbd2cSJim Jagielski 
3230*b1cdbd2cSJim Jagielski 	TransferableHelper::StartDrag( pWin, nDragOptions );
3231*b1cdbd2cSJim Jagielski }
3232*b1cdbd2cSJim Jagielski 
DragFinished(sal_Int8 nAction)3233*b1cdbd2cSJim Jagielski void SwTransferable::DragFinished( sal_Int8 nAction )
3234*b1cdbd2cSJim Jagielski {
3235*b1cdbd2cSJim Jagielski 	//Und noch die letzten Nacharbeiten damit alle Stati stimmen.
3236*b1cdbd2cSJim Jagielski 	if( DND_ACTION_MOVE == nAction	)
3237*b1cdbd2cSJim Jagielski 	{
3238*b1cdbd2cSJim Jagielski 		if( bCleanUp )
3239*b1cdbd2cSJim Jagielski 		{
3240*b1cdbd2cSJim Jagielski 			//Es wurde auserhalb des Writers gedroped. Wir muessen noch
3241*b1cdbd2cSJim Jagielski 			//loeschen.
3242*b1cdbd2cSJim Jagielski 
3243*b1cdbd2cSJim Jagielski 			pWrtShell->StartAllAction();
3244*b1cdbd2cSJim Jagielski             pWrtShell->StartUndo( UNDO_UI_DRAG_AND_MOVE );
3245*b1cdbd2cSJim Jagielski 			if ( pWrtShell->IsTableMode() )
3246*b1cdbd2cSJim Jagielski 				pWrtShell->DeleteTblSel();
3247*b1cdbd2cSJim Jagielski 			else
3248*b1cdbd2cSJim Jagielski 			{
3249*b1cdbd2cSJim Jagielski 				if ( !(pWrtShell->IsSelFrmMode() || pWrtShell->IsObjSelected()) )
3250*b1cdbd2cSJim Jagielski 					//SmartCut, eines der Blanks mitnehmen.
3251*b1cdbd2cSJim Jagielski 					pWrtShell->IntelligentCut( pWrtShell->GetSelectionType(), sal_True );
3252*b1cdbd2cSJim Jagielski 				pWrtShell->DelRight();
3253*b1cdbd2cSJim Jagielski 			}
3254*b1cdbd2cSJim Jagielski             pWrtShell->EndUndo( UNDO_UI_DRAG_AND_MOVE );
3255*b1cdbd2cSJim Jagielski 			pWrtShell->EndAllAction();
3256*b1cdbd2cSJim Jagielski 		}
3257*b1cdbd2cSJim Jagielski 		else
3258*b1cdbd2cSJim Jagielski 		{
3259*b1cdbd2cSJim Jagielski 			const int nSelection = pWrtShell->GetSelectionType();
3260*b1cdbd2cSJim Jagielski 			if( ( nsSelectionType::SEL_FRM | nsSelectionType::SEL_GRF |
3261*b1cdbd2cSJim Jagielski 				 nsSelectionType::SEL_OLE | nsSelectionType::SEL_DRW ) & nSelection )
3262*b1cdbd2cSJim Jagielski 			{
3263*b1cdbd2cSJim Jagielski 				pWrtShell->EnterSelFrmMode();
3264*b1cdbd2cSJim Jagielski 			}
3265*b1cdbd2cSJim Jagielski 		}
3266*b1cdbd2cSJim Jagielski 	}
3267*b1cdbd2cSJim Jagielski 	pWrtShell->GetView().GetEditWin().DragFinished();
3268*b1cdbd2cSJim Jagielski 
3269*b1cdbd2cSJim Jagielski 	if( pWrtShell->IsSelFrmMode() )
3270*b1cdbd2cSJim Jagielski 		pWrtShell->HideCrsr();
3271*b1cdbd2cSJim Jagielski 	else
3272*b1cdbd2cSJim Jagielski 		pWrtShell->ShowCrsr();
3273*b1cdbd2cSJim Jagielski //!!	else if( DND_ACTION_NONE != nAction )
3274*b1cdbd2cSJim Jagielski //!!		pWrtShell->ShowCrsr();
3275*b1cdbd2cSJim Jagielski //!!	else
3276*b1cdbd2cSJim Jagielski //!!	{
3277*b1cdbd2cSJim Jagielski //!!		//Muss wohl sein weil gescrollt wurde und ?...?
3278*b1cdbd2cSJim Jagielski //!!		pWrtShell->StartAction();
3279*b1cdbd2cSJim Jagielski //!!		pWrtShell->EndAction();
3280*b1cdbd2cSJim Jagielski //!!	}
3281*b1cdbd2cSJim Jagielski 
3282*b1cdbd2cSJim Jagielski 	((SwViewOption *)pWrtShell->GetViewOptions())->SetIdle( bOldIdle );
3283*b1cdbd2cSJim Jagielski }
3284*b1cdbd2cSJim Jagielski 
3285*b1cdbd2cSJim Jagielski 
3286*b1cdbd2cSJim Jagielski /*  */
3287*b1cdbd2cSJim Jagielski 
PrivatePaste(SwWrtShell & rShell)3288*b1cdbd2cSJim Jagielski int SwTransferable::PrivatePaste( SwWrtShell& rShell )
3289*b1cdbd2cSJim Jagielski {
3290*b1cdbd2cSJim Jagielski 	// erst den SelectionType erfragen, dann Action-Klammerung !!!!
3291*b1cdbd2cSJim Jagielski 	// (sonst wird nicht in eine TabellenSelektion gepastet!!!)
3292*b1cdbd2cSJim Jagielski 	ASSERT( !rShell.ActionPend(), "Paste darf nie eine Actionklammerung haben" );
3293*b1cdbd2cSJim Jagielski 	if ( !pClpDocFac )
3294*b1cdbd2cSJim Jagielski 		return sal_False; // the return value of the SwFEShell::Paste also is sal_Bool!
3295*b1cdbd2cSJim Jagielski 
3296*b1cdbd2cSJim Jagielski 	const int nSelection = rShell.GetSelectionType();
3297*b1cdbd2cSJim Jagielski 
3298*b1cdbd2cSJim Jagielski     // #111827#
3299*b1cdbd2cSJim Jagielski     SwRewriter aRewriter;
3300*b1cdbd2cSJim Jagielski 
3301*b1cdbd2cSJim Jagielski     SwTrnsfrActionAndUndo aAction( &rShell, UNDO_PASTE_CLIPBOARD);
3302*b1cdbd2cSJim Jagielski 
3303*b1cdbd2cSJim Jagielski     bool bKillPaMs = false;
3304*b1cdbd2cSJim Jagielski 
3305*b1cdbd2cSJim Jagielski 	//Selektierten Inhalt loeschen, nicht bei Tabellen-Selektion und
3306*b1cdbd2cSJim Jagielski 	//Tabelle im Clipboard
3307*b1cdbd2cSJim Jagielski 	if( rShell.HasSelection() && !( nSelection & nsSelectionType::SEL_TBL_CELLS))
3308*b1cdbd2cSJim Jagielski 	{
3309*b1cdbd2cSJim Jagielski         bKillPaMs = true;
3310*b1cdbd2cSJim Jagielski         rShell.SetRetainSelection( true );
3311*b1cdbd2cSJim Jagielski 		rShell.DelRight();
3312*b1cdbd2cSJim Jagielski 		// war ein Fly selektiert, so muss jetzt fuer eine gueltige
3313*b1cdbd2cSJim Jagielski 		// Cursor-Position gesorgt werden! (geparkter Cursor!)
3314*b1cdbd2cSJim Jagielski 		if( ( nsSelectionType::SEL_FRM | nsSelectionType::SEL_GRF |
3315*b1cdbd2cSJim Jagielski 			nsSelectionType::SEL_OLE | nsSelectionType::SEL_DRW |
3316*b1cdbd2cSJim Jagielski 			nsSelectionType::SEL_DRW_FORM ) & nSelection )
3317*b1cdbd2cSJim Jagielski 		{
3318*b1cdbd2cSJim Jagielski 			// den Cursor wieder positionieren
3319*b1cdbd2cSJim Jagielski 			Point aPt( rShell.GetCharRect().Pos() );
3320*b1cdbd2cSJim Jagielski 			rShell.SwCrsrShell::SetCrsr( aPt, sal_True );
3321*b1cdbd2cSJim Jagielski 		}
3322*b1cdbd2cSJim Jagielski         rShell.SetRetainSelection( false );
3323*b1cdbd2cSJim Jagielski 	}
3324*b1cdbd2cSJim Jagielski 
3325*b1cdbd2cSJim Jagielski     sal_Bool bInWrd = sal_False, bEndWrd = sal_False, bSttWrd = sal_False,
3326*b1cdbd2cSJim Jagielski          bSmart = 0 != (TRNSFR_DOCUMENT_WORD & eBufferType);
3327*b1cdbd2cSJim Jagielski 	if( bSmart )
3328*b1cdbd2cSJim Jagielski 	{
3329*b1cdbd2cSJim Jagielski // #108491# Why not for other Scripts? If TRNSFR_DOCUMENT_WORD is set, we have
3330*b1cdbd2cSJim Jagielski // a word in the buffer, word in this context means 'something with spaces at
3331*b1cdbd2cSJim Jagielski // beginning and end'. In this case we definitely want these spaces to be inserted
3332*b1cdbd2cSJim Jagielski // here.
3333*b1cdbd2cSJim Jagielski //      if( SCRIPTTYPE_LATIN != rShell.GetScriptType() )
3334*b1cdbd2cSJim Jagielski //          bSmart = sal_False;
3335*b1cdbd2cSJim Jagielski //      else
3336*b1cdbd2cSJim Jagielski //      {
3337*b1cdbd2cSJim Jagielski 			bInWrd = rShell.IsInWrd();
3338*b1cdbd2cSJim Jagielski 		 	bEndWrd = rShell.IsEndWrd();
3339*b1cdbd2cSJim Jagielski 			bSmart = bInWrd || bEndWrd;
3340*b1cdbd2cSJim Jagielski 			if( bSmart )
3341*b1cdbd2cSJim Jagielski 			{
3342*b1cdbd2cSJim Jagielski 		 		bSttWrd = rShell.IsSttWrd();
3343*b1cdbd2cSJim Jagielski 				if( bSmart && !bSttWrd && (bInWrd || bEndWrd) )
3344*b1cdbd2cSJim Jagielski 					rShell.SwEditShell::Insert(' ');
3345*b1cdbd2cSJim Jagielski 			}
3346*b1cdbd2cSJim Jagielski //      }
3347*b1cdbd2cSJim Jagielski 	}
3348*b1cdbd2cSJim Jagielski 
3349*b1cdbd2cSJim Jagielski 	int nRet = rShell.Paste( pClpDocFac->GetDoc() );
3350*b1cdbd2cSJim Jagielski 
3351*b1cdbd2cSJim Jagielski     if( bKillPaMs )
3352*b1cdbd2cSJim Jagielski         rShell.KillPams();
3353*b1cdbd2cSJim Jagielski 
3354*b1cdbd2cSJim Jagielski 	// Wenn Smart Paste dann Leerzeichen einfuegen
3355*b1cdbd2cSJim Jagielski 	if( nRet && bSmart && ((bInWrd && !bEndWrd )|| bSttWrd) )
3356*b1cdbd2cSJim Jagielski 		rShell.SwEditShell::Insert(' ');
3357*b1cdbd2cSJim Jagielski 
3358*b1cdbd2cSJim Jagielski 	return nRet;
3359*b1cdbd2cSJim Jagielski }
3360*b1cdbd2cSJim Jagielski 
PrivateDrop(SwWrtShell & rSh,const Point & rDragPt,sal_Bool bMove,sal_Bool bIsXSelection)3361*b1cdbd2cSJim Jagielski int SwTransferable::PrivateDrop( SwWrtShell& rSh, const Point& rDragPt,
3362*b1cdbd2cSJim Jagielski 								sal_Bool bMove, sal_Bool bIsXSelection )
3363*b1cdbd2cSJim Jagielski {
3364*b1cdbd2cSJim Jagielski 	int cWord	 = 0;
3365*b1cdbd2cSJim Jagielski 	sal_Bool bInWrd  = sal_False;
3366*b1cdbd2cSJim Jagielski 	sal_Bool bEndWrd = sal_False;
3367*b1cdbd2cSJim Jagielski 	sal_Bool bSttWrd = sal_False;
3368*b1cdbd2cSJim Jagielski 	sal_Bool bSttPara= sal_False;
3369*b1cdbd2cSJim Jagielski 	sal_Bool bTblSel = sal_False;
3370*b1cdbd2cSJim Jagielski 	sal_Bool bFrmSel = sal_False;
3371*b1cdbd2cSJim Jagielski 
3372*b1cdbd2cSJim Jagielski 	SwWrtShell& rSrcSh = *GetShell();
3373*b1cdbd2cSJim Jagielski 
3374*b1cdbd2cSJim Jagielski 	rSh.UnSetVisCrsr();
3375*b1cdbd2cSJim Jagielski 
3376*b1cdbd2cSJim Jagielski 	if( TRNSFR_INETFLD == eBufferType )
3377*b1cdbd2cSJim Jagielski 	{
3378*b1cdbd2cSJim Jagielski 		if( rSh.GetFmtFromObj( rDragPt ) )
3379*b1cdbd2cSJim Jagielski 		{
3380*b1cdbd2cSJim Jagielski 			INetBookmark aTmp;
3381*b1cdbd2cSJim Jagielski 			if( (TRNSFR_INETFLD & eBufferType) && pBkmk )
3382*b1cdbd2cSJim Jagielski 				aTmp = *pBkmk;
3383*b1cdbd2cSJim Jagielski 
3384*b1cdbd2cSJim Jagielski 			// Zielgrafik selektieren
3385*b1cdbd2cSJim Jagielski 			if( rSh.SelectObj( rDragPt ) )
3386*b1cdbd2cSJim Jagielski 			{
3387*b1cdbd2cSJim Jagielski 				rSh.HideCrsr();
3388*b1cdbd2cSJim Jagielski 				rSh.EnterSelFrmMode( &rDragPt );
3389*b1cdbd2cSJim Jagielski 				bFrmDrag = sal_True;
3390*b1cdbd2cSJim Jagielski 			}
3391*b1cdbd2cSJim Jagielski 
3392*b1cdbd2cSJim Jagielski 			const int nSelection = rSh.GetSelectionType();
3393*b1cdbd2cSJim Jagielski 
3394*b1cdbd2cSJim Jagielski 			// Draw-Objekte erstmal noch nicht beruecksichtigen
3395*b1cdbd2cSJim Jagielski 			if( nsSelectionType::SEL_GRF & nSelection )
3396*b1cdbd2cSJim Jagielski 			{
3397*b1cdbd2cSJim Jagielski 				SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
3398*b1cdbd2cSJim Jagielski 				rSh.GetFlyFrmAttr( aSet );
3399*b1cdbd2cSJim Jagielski 				SwFmtURL aURL( (SwFmtURL&)aSet.Get( RES_URL ) );
3400*b1cdbd2cSJim Jagielski 				aURL.SetURL( aTmp.GetURL(), sal_False );
3401*b1cdbd2cSJim Jagielski 				aSet.Put( aURL );
3402*b1cdbd2cSJim Jagielski 				rSh.SetFlyFrmAttr( aSet );
3403*b1cdbd2cSJim Jagielski 				return 1;
3404*b1cdbd2cSJim Jagielski 			}
3405*b1cdbd2cSJim Jagielski 
3406*b1cdbd2cSJim Jagielski 			if( nsSelectionType::SEL_DRW & nSelection )
3407*b1cdbd2cSJim Jagielski 			{
3408*b1cdbd2cSJim Jagielski 				rSh.LeaveSelFrmMode();
3409*b1cdbd2cSJim Jagielski 				rSh.UnSelectFrm();
3410*b1cdbd2cSJim Jagielski 				rSh.ShowCrsr();
3411*b1cdbd2cSJim Jagielski 				bFrmDrag = sal_False;
3412*b1cdbd2cSJim Jagielski 			}
3413*b1cdbd2cSJim Jagielski 		}
3414*b1cdbd2cSJim Jagielski 	}
3415*b1cdbd2cSJim Jagielski 
3416*b1cdbd2cSJim Jagielski 	if( &rSh != &rSrcSh && (nsSelectionType::SEL_GRF & rSh.GetSelectionType()) &&
3417*b1cdbd2cSJim Jagielski 		TRNSFR_GRAPHIC == eBufferType )
3418*b1cdbd2cSJim Jagielski 	{
3419*b1cdbd2cSJim Jagielski 		// ReRead auf die Grafik
3420*b1cdbd2cSJim Jagielski 		String sGrfNm, sFltNm;
3421*b1cdbd2cSJim Jagielski 		rSrcSh.GetGrfNms( &sGrfNm, &sFltNm );
3422*b1cdbd2cSJim Jagielski         rSh.ReRead( sGrfNm, sFltNm, rSrcSh.GetGraphic() );
3423*b1cdbd2cSJim Jagielski 		return 1;
3424*b1cdbd2cSJim Jagielski 	}
3425*b1cdbd2cSJim Jagielski 
3426*b1cdbd2cSJim Jagielski 	//Nicht in Selektionen oder selektierten Rahmen
3427*b1cdbd2cSJim Jagielski 	if( rSh.ChgCurrPam( rDragPt ) ||
3428*b1cdbd2cSJim Jagielski 		( rSh.IsSelFrmMode() && rSh.IsInsideSelectedObj( rDragPt )) )
3429*b1cdbd2cSJim Jagielski 		return 0;
3430*b1cdbd2cSJim Jagielski 
3431*b1cdbd2cSJim Jagielski 	if( rSrcSh.IsTableMode() )
3432*b1cdbd2cSJim Jagielski 		bTblSel = sal_True;
3433*b1cdbd2cSJim Jagielski 	else if( rSrcSh.IsSelFrmMode() || rSrcSh.IsObjSelected() )
3434*b1cdbd2cSJim Jagielski 	{
3435*b1cdbd2cSJim Jagielski 		// keine positionsgeschuetzten Objecte verschieben!
3436*b1cdbd2cSJim Jagielski 		if( bMove && rSrcSh.IsSelObjProtected( FLYPROTECT_POS ) )
3437*b1cdbd2cSJim Jagielski 			return 0;
3438*b1cdbd2cSJim Jagielski 
3439*b1cdbd2cSJim Jagielski 		bFrmSel = sal_True;
3440*b1cdbd2cSJim Jagielski 	}
3441*b1cdbd2cSJim Jagielski 
3442*b1cdbd2cSJim Jagielski 	const int nSel = rSrcSh.GetSelectionType();
3443*b1cdbd2cSJim Jagielski 
3444*b1cdbd2cSJim Jagielski     SwUndoId eUndoId = bMove ? UNDO_UI_DRAG_AND_MOVE : UNDO_UI_DRAG_AND_COPY;
3445*b1cdbd2cSJim Jagielski 
3446*b1cdbd2cSJim Jagielski     // #111827#
3447*b1cdbd2cSJim Jagielski     SwRewriter aRewriter;
3448*b1cdbd2cSJim Jagielski 
3449*b1cdbd2cSJim Jagielski     aRewriter.AddRule(UNDO_ARG1, rSrcSh.GetSelDescr());
3450*b1cdbd2cSJim Jagielski 
3451*b1cdbd2cSJim Jagielski 	if(rSrcSh.GetDoc() != rSh.GetDoc())
3452*b1cdbd2cSJim Jagielski         rSrcSh.StartUndo( eUndoId, &aRewriter );
3453*b1cdbd2cSJim Jagielski     rSh.StartUndo( eUndoId, &aRewriter );
3454*b1cdbd2cSJim Jagielski 
3455*b1cdbd2cSJim Jagielski 	rSh.StartAction();
3456*b1cdbd2cSJim Jagielski 	rSrcSh.StartAction();
3457*b1cdbd2cSJim Jagielski 
3458*b1cdbd2cSJim Jagielski 	if( &rSrcSh != &rSh )
3459*b1cdbd2cSJim Jagielski 	{
3460*b1cdbd2cSJim Jagielski 		rSh.EnterStdMode();
3461*b1cdbd2cSJim Jagielski 		rSh.SwCrsrShell::SetCrsr( rDragPt, sal_True );
3462*b1cdbd2cSJim Jagielski 		cWord = rSrcSh.IntelligentCut( nSel, sal_False );
3463*b1cdbd2cSJim Jagielski 	}
3464*b1cdbd2cSJim Jagielski 	else if( !bTblSel && !bFrmSel )
3465*b1cdbd2cSJim Jagielski 	{
3466*b1cdbd2cSJim Jagielski 		if( !rSh.IsAddMode() )
3467*b1cdbd2cSJim Jagielski         {
3468*b1cdbd2cSJim Jagielski             // --> OD 2008-03-19 #i87233#
3469*b1cdbd2cSJim Jagielski             if ( rSh.IsBlockMode() )
3470*b1cdbd2cSJim Jagielski             {
3471*b1cdbd2cSJim Jagielski                 // preserve order of cursors for block mode
3472*b1cdbd2cSJim Jagielski                 rSh.GoPrevCrsr();
3473*b1cdbd2cSJim Jagielski             }
3474*b1cdbd2cSJim Jagielski             // <--
3475*b1cdbd2cSJim Jagielski 			rSh.SwCrsrShell::CreateCrsr();
3476*b1cdbd2cSJim Jagielski         }
3477*b1cdbd2cSJim Jagielski 		rSh.SwCrsrShell::SetCrsr( rDragPt, sal_True, false );
3478*b1cdbd2cSJim Jagielski 		rSh.GoPrevCrsr();
3479*b1cdbd2cSJim Jagielski 		cWord = rSh.IntelligentCut( rSh.GetSelectionType(), sal_False );
3480*b1cdbd2cSJim Jagielski 		rSh.GoNextCrsr();
3481*b1cdbd2cSJim Jagielski 	}
3482*b1cdbd2cSJim Jagielski 
3483*b1cdbd2cSJim Jagielski 	bInWrd	= rSh.IsInWrd();
3484*b1cdbd2cSJim Jagielski 	bEndWrd = rSh.IsEndWrd();
3485*b1cdbd2cSJim Jagielski 	bSttWrd = !bEndWrd && rSh.IsSttWrd();
3486*b1cdbd2cSJim Jagielski 	bSttPara= rSh.IsSttPara();
3487*b1cdbd2cSJim Jagielski 
3488*b1cdbd2cSJim Jagielski 	Point aSttPt( SwEditWin::GetDDStartPosX(), SwEditWin::GetDDStartPosY() );
3489*b1cdbd2cSJim Jagielski 
3490*b1cdbd2cSJim Jagielski 	//JP 05.03.96: INetFelder erstmal selektieren !
3491*b1cdbd2cSJim Jagielski 	if( TRNSFR_INETFLD == eBufferType )
3492*b1cdbd2cSJim Jagielski 	{
3493*b1cdbd2cSJim Jagielski 		if( &rSrcSh == &rSh )
3494*b1cdbd2cSJim Jagielski 		{
3495*b1cdbd2cSJim Jagielski 			rSh.GoPrevCrsr();
3496*b1cdbd2cSJim Jagielski 			rSh.SwCrsrShell::SetCrsr( aSttPt, sal_True );
3497*b1cdbd2cSJim Jagielski 			rSh.SelectTxtAttr( RES_TXTATR_INETFMT );
3498*b1cdbd2cSJim Jagielski 			if( rSh.ChgCurrPam( rDragPt ) )
3499*b1cdbd2cSJim Jagielski 			{
3500*b1cdbd2cSJim Jagielski 				// nicht in sich selbst kopieren/verschieben
3501*b1cdbd2cSJim Jagielski 				rSh.DestroyCrsr();
3502*b1cdbd2cSJim Jagielski                 rSh.EndUndo();
3503*b1cdbd2cSJim Jagielski 				rSh.EndAction();
3504*b1cdbd2cSJim Jagielski 				rSh.EndAction();
3505*b1cdbd2cSJim Jagielski 				return 0;
3506*b1cdbd2cSJim Jagielski 			}
3507*b1cdbd2cSJim Jagielski 			rSh.GoNextCrsr();
3508*b1cdbd2cSJim Jagielski 		}
3509*b1cdbd2cSJim Jagielski 		else
3510*b1cdbd2cSJim Jagielski 		{
3511*b1cdbd2cSJim Jagielski 			rSrcSh.SwCrsrShell::SetCrsr( aSttPt, sal_True );
3512*b1cdbd2cSJim Jagielski 			rSrcSh.SelectTxtAttr( RES_TXTATR_INETFMT );
3513*b1cdbd2cSJim Jagielski 		}
3514*b1cdbd2cSJim Jagielski 
3515*b1cdbd2cSJim Jagielski 		// ist am Einfuege Punkt ein URL-Attribut? Dann das ersetzen,
3516*b1cdbd2cSJim Jagielski 		// also einfach eine Selektion aufspannen?
3517*b1cdbd2cSJim Jagielski 		rSh.DelINetAttrWithText();
3518*b1cdbd2cSJim Jagielski 		bDDINetAttr = sal_True;
3519*b1cdbd2cSJim Jagielski 	}
3520*b1cdbd2cSJim Jagielski 
3521*b1cdbd2cSJim Jagielski 	if ( rSrcSh.IsSelFrmMode() )
3522*b1cdbd2cSJim Jagielski 	{
3523*b1cdbd2cSJim Jagielski 		//Hack: Spezialbehandlung austricksen
3524*b1cdbd2cSJim Jagielski 		aSttPt -= aSttPt - rSrcSh.GetObjRect().Pos();
3525*b1cdbd2cSJim Jagielski 	}
3526*b1cdbd2cSJim Jagielski 
3527*b1cdbd2cSJim Jagielski 	sal_Bool bRet = rSrcSh.SwFEShell::Copy( &rSh, aSttPt, rDragPt, bMove,
3528*b1cdbd2cSJim Jagielski 											!bIsXSelection );
3529*b1cdbd2cSJim Jagielski 
3530*b1cdbd2cSJim Jagielski 	if( !bIsXSelection )
3531*b1cdbd2cSJim Jagielski 	{
3532*b1cdbd2cSJim Jagielski 		rSrcSh.Push();
3533*b1cdbd2cSJim Jagielski 		if ( bRet && bMove && !bFrmSel )
3534*b1cdbd2cSJim Jagielski 		{
3535*b1cdbd2cSJim Jagielski 			if ( bTblSel )
3536*b1cdbd2cSJim Jagielski             {
3537*b1cdbd2cSJim Jagielski                 /* #109590# delete table contents not cells */
3538*b1cdbd2cSJim Jagielski 				rSrcSh.Delete();
3539*b1cdbd2cSJim Jagielski             }
3540*b1cdbd2cSJim Jagielski 			else
3541*b1cdbd2cSJim Jagielski 			{
3542*b1cdbd2cSJim Jagielski 				//SmartCut, eines der Blank mitnehmen.
3543*b1cdbd2cSJim Jagielski 				rSh.SwCrsrShell::DestroyCrsr();
3544*b1cdbd2cSJim Jagielski 				if ( cWord == SwWrtShell::WORD_SPACE_BEFORE )
3545*b1cdbd2cSJim Jagielski 					rSh.ExtendSelection( sal_False );
3546*b1cdbd2cSJim Jagielski 				else if ( cWord == SwWrtShell::WORD_SPACE_AFTER )
3547*b1cdbd2cSJim Jagielski 					rSh.ExtendSelection();
3548*b1cdbd2cSJim Jagielski 				rSrcSh.DelRight();
3549*b1cdbd2cSJim Jagielski 			}
3550*b1cdbd2cSJim Jagielski 		}
3551*b1cdbd2cSJim Jagielski 		rSrcSh.KillPams();
3552*b1cdbd2cSJim Jagielski 		rSrcSh.Pop( sal_False );
3553*b1cdbd2cSJim Jagielski 
3554*b1cdbd2cSJim Jagielski         /* #109590# after dragging a table selection inside one shell
3555*b1cdbd2cSJim Jagielski             set cursor to the drop position. */
3556*b1cdbd2cSJim Jagielski         if( &rSh == &rSrcSh && ( bTblSel || rSh.IsBlockMode() ) )
3557*b1cdbd2cSJim Jagielski         {
3558*b1cdbd2cSJim Jagielski             rSrcSh.SwCrsrShell::SetCrsr(rDragPt);
3559*b1cdbd2cSJim Jagielski             rSrcSh.GetSwCrsr()->SetMark();
3560*b1cdbd2cSJim Jagielski         }
3561*b1cdbd2cSJim Jagielski 	}
3562*b1cdbd2cSJim Jagielski 
3563*b1cdbd2cSJim Jagielski 	if( bRet && !bTblSel && !bFrmSel )
3564*b1cdbd2cSJim Jagielski 	{
3565*b1cdbd2cSJim Jagielski 		if( (bInWrd || bEndWrd) &&
3566*b1cdbd2cSJim Jagielski 			(cWord == SwWrtShell::WORD_SPACE_AFTER ||
3567*b1cdbd2cSJim Jagielski 				cWord == SwWrtShell::WORD_SPACE_BEFORE) )
3568*b1cdbd2cSJim Jagielski 		{
3569*b1cdbd2cSJim Jagielski             if ( bSttWrd || (bInWrd && !bEndWrd))
3570*b1cdbd2cSJim Jagielski 				rSh.SwEditShell::Insert(' ', bIsXSelection);
3571*b1cdbd2cSJim Jagielski 			if ( !bSttWrd || (bInWrd && !bSttPara) )
3572*b1cdbd2cSJim Jagielski 			{
3573*b1cdbd2cSJim Jagielski 				rSh.SwapPam();
3574*b1cdbd2cSJim Jagielski 				if ( !bSttWrd )
3575*b1cdbd2cSJim Jagielski 					rSh.SwEditShell::Insert(' ', bIsXSelection);
3576*b1cdbd2cSJim Jagielski 				rSh.SwapPam();
3577*b1cdbd2cSJim Jagielski 			}
3578*b1cdbd2cSJim Jagielski 		}
3579*b1cdbd2cSJim Jagielski 
3580*b1cdbd2cSJim Jagielski 		if( bIsXSelection )
3581*b1cdbd2cSJim Jagielski 		{
3582*b1cdbd2cSJim Jagielski 			if( &rSrcSh == &rSh && !rSh.IsAddMode() )
3583*b1cdbd2cSJim Jagielski 			{
3584*b1cdbd2cSJim Jagielski 				rSh.SwCrsrShell::DestroyCrsr();
3585*b1cdbd2cSJim Jagielski 				rSh.GoPrevCrsr();
3586*b1cdbd2cSJim Jagielski 			}
3587*b1cdbd2cSJim Jagielski 			else
3588*b1cdbd2cSJim Jagielski 			{
3589*b1cdbd2cSJim Jagielski 				rSh.SwapPam();
3590*b1cdbd2cSJim Jagielski 				rSh.SwCrsrShell::ClearMark();
3591*b1cdbd2cSJim Jagielski 			}
3592*b1cdbd2cSJim Jagielski 		}
3593*b1cdbd2cSJim Jagielski 		else
3594*b1cdbd2cSJim Jagielski 		{
3595*b1cdbd2cSJim Jagielski 			if( rSh.IsAddMode() )
3596*b1cdbd2cSJim Jagielski 				rSh.SwCrsrShell::CreateCrsr();
3597*b1cdbd2cSJim Jagielski 			else
3598*b1cdbd2cSJim Jagielski 			{
3599*b1cdbd2cSJim Jagielski 				// Selektionsmodus einschalten
3600*b1cdbd2cSJim Jagielski 				rSh.SttSelect();
3601*b1cdbd2cSJim Jagielski 				rSh.EndSelect();
3602*b1cdbd2cSJim Jagielski 			}
3603*b1cdbd2cSJim Jagielski 		}
3604*b1cdbd2cSJim Jagielski 	}
3605*b1cdbd2cSJim Jagielski 
3606*b1cdbd2cSJim Jagielski 	if( bRet && bMove && bFrmSel )
3607*b1cdbd2cSJim Jagielski 		rSrcSh.LeaveSelFrmMode();
3608*b1cdbd2cSJim Jagielski 
3609*b1cdbd2cSJim Jagielski 	if( rSrcSh.GetDoc() != rSh.GetDoc() )
3610*b1cdbd2cSJim Jagielski         rSrcSh.EndUndo();
3611*b1cdbd2cSJim Jagielski     rSh.EndUndo();
3612*b1cdbd2cSJim Jagielski 
3613*b1cdbd2cSJim Jagielski 		// Shell in den richtigen Status versetzen
3614*b1cdbd2cSJim Jagielski 	if( &rSrcSh != &rSh && ( rSh.IsFrmSelected() || rSh.IsObjSelected() ))
3615*b1cdbd2cSJim Jagielski 		rSh.EnterSelFrmMode();
3616*b1cdbd2cSJim Jagielski 
3617*b1cdbd2cSJim Jagielski 	rSrcSh.EndAction();
3618*b1cdbd2cSJim Jagielski 	rSh.EndAction();
3619*b1cdbd2cSJim Jagielski 	return 1;
3620*b1cdbd2cSJim Jagielski }
3621*b1cdbd2cSJim Jagielski 
3622*b1cdbd2cSJim Jagielski // Interfaces for Selection
CreateSelection(SwWrtShell & rSh,const ViewShell * _pCreatorView)3623*b1cdbd2cSJim Jagielski void SwTransferable::CreateSelection( SwWrtShell& rSh,
3624*b1cdbd2cSJim Jagielski 									  const ViewShell * _pCreatorView )
3625*b1cdbd2cSJim Jagielski {
3626*b1cdbd2cSJim Jagielski 	SwModule *pMod = SW_MOD();
3627*b1cdbd2cSJim Jagielski 	SwTransferable* pNew = new SwTransferable( rSh );
3628*b1cdbd2cSJim Jagielski 
3629*b1cdbd2cSJim Jagielski 	/* #96392#*/
3630*b1cdbd2cSJim Jagielski  	pNew->pCreatorView = _pCreatorView;
3631*b1cdbd2cSJim Jagielski 
3632*b1cdbd2cSJim Jagielski     uno::Reference<
3633*b1cdbd2cSJim Jagielski             datatransfer::XTransferable > xRef( pNew );
3634*b1cdbd2cSJim Jagielski 	pMod->pXSelection = pNew;
3635*b1cdbd2cSJim Jagielski 	pNew->CopyToSelection( rSh.GetWin() );
3636*b1cdbd2cSJim Jagielski }
3637*b1cdbd2cSJim Jagielski 
ClearSelection(SwWrtShell & rSh,const ViewShell * _pCreatorView)3638*b1cdbd2cSJim Jagielski void SwTransferable::ClearSelection( SwWrtShell& rSh,
3639*b1cdbd2cSJim Jagielski 									 const ViewShell * _pCreatorView)
3640*b1cdbd2cSJim Jagielski {
3641*b1cdbd2cSJim Jagielski 	SwModule *pMod = SW_MOD();
3642*b1cdbd2cSJim Jagielski     if( pMod->pXSelection &&
3643*b1cdbd2cSJim Jagielski         ((!pMod->pXSelection->pWrtShell) || (pMod->pXSelection->pWrtShell == &rSh)) &&
3644*b1cdbd2cSJim Jagielski 		/* #96392# */
3645*b1cdbd2cSJim Jagielski         (!_pCreatorView || (pMod->pXSelection->pCreatorView == _pCreatorView)) )
3646*b1cdbd2cSJim Jagielski 	{
3647*b1cdbd2cSJim Jagielski 		TransferableHelper::ClearSelection( rSh.GetWin() );
3648*b1cdbd2cSJim Jagielski 	}
3649*b1cdbd2cSJim Jagielski }
3650*b1cdbd2cSJim Jagielski /* -----------------3/31/2003 11:46AM----------------
3651*b1cdbd2cSJim Jagielski 
3652*b1cdbd2cSJim Jagielski  --------------------------------------------------*/
getUnoTunnelId()3653*b1cdbd2cSJim Jagielski const Sequence< sal_Int8 >& SwTransferable::getUnoTunnelId()
3654*b1cdbd2cSJim Jagielski {
3655*b1cdbd2cSJim Jagielski     static Sequence< sal_Int8 > aSeq;
3656*b1cdbd2cSJim Jagielski     if( !aSeq.getLength() )
3657*b1cdbd2cSJim Jagielski     {
3658*b1cdbd2cSJim Jagielski         static osl::Mutex           aCreateMutex;
3659*b1cdbd2cSJim Jagielski         osl::Guard< osl::Mutex >    aGuard( aCreateMutex );
3660*b1cdbd2cSJim Jagielski         aSeq.realloc( 16 );
3661*b1cdbd2cSJim Jagielski         rtl_createUuid( reinterpret_cast< sal_uInt8* >( aSeq.getArray() ), 0, sal_True );
3662*b1cdbd2cSJim Jagielski     }
3663*b1cdbd2cSJim Jagielski     return aSeq;
3664*b1cdbd2cSJim Jagielski }
3665*b1cdbd2cSJim Jagielski /* -----------------3/31/2003 11:46AM----------------
3666*b1cdbd2cSJim Jagielski 
3667*b1cdbd2cSJim Jagielski  --------------------------------------------------*/
getSomething(const Sequence<sal_Int8> & rId)3668*b1cdbd2cSJim Jagielski sal_Int64 SwTransferable::getSomething( const Sequence< sal_Int8 >& rId ) throw( RuntimeException )
3669*b1cdbd2cSJim Jagielski {
3670*b1cdbd2cSJim Jagielski     sal_Int64 nRet;
3671*b1cdbd2cSJim Jagielski     if( ( rId.getLength() == 16 ) &&
3672*b1cdbd2cSJim Jagielski         ( 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) ) )
3673*b1cdbd2cSJim Jagielski     {
3674*b1cdbd2cSJim Jagielski         nRet = sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >( this ) );
3675*b1cdbd2cSJim Jagielski     }
3676*b1cdbd2cSJim Jagielski     else
3677*b1cdbd2cSJim Jagielski         nRet = TransferableHelper::getSomething(rId);
3678*b1cdbd2cSJim Jagielski     return nRet;
3679*b1cdbd2cSJim Jagielski }
3680*b1cdbd2cSJim Jagielski 
GetSwTransferable(const TransferableDataHelper & rData)3681*b1cdbd2cSJim Jagielski SwTransferable* SwTransferable::GetSwTransferable( const TransferableDataHelper& rData )
3682*b1cdbd2cSJim Jagielski {
3683*b1cdbd2cSJim Jagielski     SwTransferable* pSwTransferable = NULL;
3684*b1cdbd2cSJim Jagielski 
3685*b1cdbd2cSJim Jagielski     uno::Reference<XUnoTunnel> xTunnel( rData.GetTransferable(), UNO_QUERY );
3686*b1cdbd2cSJim Jagielski     if ( xTunnel.is() )
3687*b1cdbd2cSJim Jagielski     {
3688*b1cdbd2cSJim Jagielski         sal_Int64 nHandle = xTunnel->getSomething( getUnoTunnelId() );
3689*b1cdbd2cSJim Jagielski         if ( nHandle )
3690*b1cdbd2cSJim Jagielski             pSwTransferable = (SwTransferable*) (sal_IntPtr) nHandle;
3691*b1cdbd2cSJim Jagielski     }
3692*b1cdbd2cSJim Jagielski 
3693*b1cdbd2cSJim Jagielski     return pSwTransferable;
3694*b1cdbd2cSJim Jagielski 
3695*b1cdbd2cSJim Jagielski }
3696*b1cdbd2cSJim Jagielski 
3697*b1cdbd2cSJim Jagielski /*  */
3698*b1cdbd2cSJim Jagielski 
3699*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3700*b1cdbd2cSJim Jagielski 
SwTrnsfrDdeLink(SwTransferable & rTrans,SwWrtShell & rSh)3701*b1cdbd2cSJim Jagielski SwTrnsfrDdeLink::SwTrnsfrDdeLink( SwTransferable& rTrans, SwWrtShell& rSh )
3702*b1cdbd2cSJim Jagielski     : rTrnsfr( rTrans ), pDocShell( 0 ),
3703*b1cdbd2cSJim Jagielski     bDelBookmrk( sal_False ), bInDisconnect( sal_False )
3704*b1cdbd2cSJim Jagielski {
3705*b1cdbd2cSJim Jagielski     // hier kommen wir nur bei Tabellen- oder Text-Selection an
3706*b1cdbd2cSJim Jagielski     const int nSelection = rSh.GetSelectionType();
3707*b1cdbd2cSJim Jagielski     if( nsSelectionType::SEL_TBL_CELLS & nSelection )
3708*b1cdbd2cSJim Jagielski     {
3709*b1cdbd2cSJim Jagielski         SwFrmFmt* pFmt = rSh.GetTableFmt();
3710*b1cdbd2cSJim Jagielski         if( pFmt )
3711*b1cdbd2cSJim Jagielski             sName = pFmt->GetName();
3712*b1cdbd2cSJim Jagielski     }
3713*b1cdbd2cSJim Jagielski     else
3714*b1cdbd2cSJim Jagielski     {
3715*b1cdbd2cSJim Jagielski         // creating a temp. bookmark without undo
3716*b1cdbd2cSJim Jagielski         sal_Bool bUndo = rSh.DoesUndo();
3717*b1cdbd2cSJim Jagielski         rSh.DoUndo( sal_False );
3718*b1cdbd2cSJim Jagielski         sal_Bool bIsModified = rSh.IsModified();
3719*b1cdbd2cSJim Jagielski 
3720*b1cdbd2cSJim Jagielski         ::sw::mark::IMark* pMark = rSh.SetBookmark(
3721*b1cdbd2cSJim Jagielski             KeyCode(),
3722*b1cdbd2cSJim Jagielski             ::rtl::OUString(),
3723*b1cdbd2cSJim Jagielski             ::rtl::OUString(),
3724*b1cdbd2cSJim Jagielski             IDocumentMarkAccess::DDE_BOOKMARK);
3725*b1cdbd2cSJim Jagielski         if(pMark)
3726*b1cdbd2cSJim Jagielski         {
3727*b1cdbd2cSJim Jagielski             sName = pMark->GetName();
3728*b1cdbd2cSJim Jagielski             bDelBookmrk = sal_True;
3729*b1cdbd2cSJim Jagielski             if( !bIsModified )
3730*b1cdbd2cSJim Jagielski                 rSh.ResetModified();
3731*b1cdbd2cSJim Jagielski         }
3732*b1cdbd2cSJim Jagielski         else
3733*b1cdbd2cSJim Jagielski             sName.Erase();
3734*b1cdbd2cSJim Jagielski         rSh.DoUndo( bUndo );
3735*b1cdbd2cSJim Jagielski     }
3736*b1cdbd2cSJim Jagielski 
3737*b1cdbd2cSJim Jagielski     if( sName.Len() &&
3738*b1cdbd2cSJim Jagielski         0 != ( pDocShell = rSh.GetDoc()->GetDocShell() ) )
3739*b1cdbd2cSJim Jagielski     {
3740*b1cdbd2cSJim Jagielski         // dann erzeugen wir uns mal unseren "Server" und connecten uns
3741*b1cdbd2cSJim Jagielski         // zu diesem
3742*b1cdbd2cSJim Jagielski         refObj = pDocShell->DdeCreateLinkSource( sName );
3743*b1cdbd2cSJim Jagielski         if( refObj.Is() )
3744*b1cdbd2cSJim Jagielski         {
3745*b1cdbd2cSJim Jagielski             refObj->AddConnectAdvise( this );
3746*b1cdbd2cSJim Jagielski             refObj->AddDataAdvise( this,
3747*b1cdbd2cSJim Jagielski //                          SotExchange::GetFormatMimeType( FORMAT_RTF ),
3748*b1cdbd2cSJim Jagielski                             aEmptyStr,
3749*b1cdbd2cSJim Jagielski                             ADVISEMODE_NODATA | ADVISEMODE_ONLYONCE );
3750*b1cdbd2cSJim Jagielski             nOldTimeOut = refObj->GetUpdateTimeout();
3751*b1cdbd2cSJim Jagielski             refObj->SetUpdateTimeout( 0 );
3752*b1cdbd2cSJim Jagielski         }
3753*b1cdbd2cSJim Jagielski     }
3754*b1cdbd2cSJim Jagielski }
3755*b1cdbd2cSJim Jagielski 
3756*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3757*b1cdbd2cSJim Jagielski 
~SwTrnsfrDdeLink()3758*b1cdbd2cSJim Jagielski SwTrnsfrDdeLink::~SwTrnsfrDdeLink()
3759*b1cdbd2cSJim Jagielski {
3760*b1cdbd2cSJim Jagielski 	if( refObj.Is() )
3761*b1cdbd2cSJim Jagielski 		Disconnect( sal_True );
3762*b1cdbd2cSJim Jagielski }
3763*b1cdbd2cSJim Jagielski 
3764*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3765*b1cdbd2cSJim Jagielski 
DataChanged(const String &,const uno::Any &)3766*b1cdbd2cSJim Jagielski void SwTrnsfrDdeLink::DataChanged( const String& ,
3767*b1cdbd2cSJim Jagielski                                     const uno::Any& )
3768*b1cdbd2cSJim Jagielski {
3769*b1cdbd2cSJim Jagielski 	// tja das wars dann mit dem Link
3770*b1cdbd2cSJim Jagielski 	if( !bInDisconnect )
3771*b1cdbd2cSJim Jagielski 	{
3772*b1cdbd2cSJim Jagielski 		if( FindDocShell() && pDocShell->GetView() )
3773*b1cdbd2cSJim Jagielski 			rTrnsfr.RemoveDDELinkFormat( pDocShell->GetView()->GetEditWin() );
3774*b1cdbd2cSJim Jagielski 		Disconnect( sal_False );
3775*b1cdbd2cSJim Jagielski 	}
3776*b1cdbd2cSJim Jagielski }
3777*b1cdbd2cSJim Jagielski 
3778*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3779*b1cdbd2cSJim Jagielski 
WriteData(SvStream & rStrm)3780*b1cdbd2cSJim Jagielski sal_Bool SwTrnsfrDdeLink::WriteData( SvStream& rStrm )
3781*b1cdbd2cSJim Jagielski {
3782*b1cdbd2cSJim Jagielski     if( !refObj.Is() || !FindDocShell() )
3783*b1cdbd2cSJim Jagielski         return sal_False;
3784*b1cdbd2cSJim Jagielski 
3785*b1cdbd2cSJim Jagielski     rtl_TextEncoding eEncoding = DDE_TXT_ENCODING;
3786*b1cdbd2cSJim Jagielski     const ByteString aAppNm( GetpApp()->GetAppName(), eEncoding );
3787*b1cdbd2cSJim Jagielski     const ByteString aTopic( pDocShell->GetTitle( SFX_TITLE_FULLNAME ),
3788*b1cdbd2cSJim Jagielski                             eEncoding );
3789*b1cdbd2cSJim Jagielski     const ByteString aName( sName, eEncoding );
3790*b1cdbd2cSJim Jagielski 
3791*b1cdbd2cSJim Jagielski     sal_Char* pMem = new char[ aAppNm.Len() + aTopic.Len() + aName.Len() + 4 ];
3792*b1cdbd2cSJim Jagielski 
3793*b1cdbd2cSJim Jagielski     xub_StrLen nLen = aAppNm.Len();
3794*b1cdbd2cSJim Jagielski     memcpy( pMem, aAppNm.GetBuffer(), nLen );
3795*b1cdbd2cSJim Jagielski     pMem[ nLen++ ] = 0;
3796*b1cdbd2cSJim Jagielski     memcpy( pMem + nLen, aTopic.GetBuffer(), aTopic.Len() );
3797*b1cdbd2cSJim Jagielski     nLen = nLen + aTopic.Len();
3798*b1cdbd2cSJim Jagielski     pMem[ nLen++ ] = 0;
3799*b1cdbd2cSJim Jagielski     memcpy( pMem + nLen, aName.GetBuffer(), aName.Len() );
3800*b1cdbd2cSJim Jagielski     nLen = nLen + aName.Len();
3801*b1cdbd2cSJim Jagielski     pMem[ nLen++ ] = 0;
3802*b1cdbd2cSJim Jagielski     pMem[ nLen++ ] = 0;
3803*b1cdbd2cSJim Jagielski 
3804*b1cdbd2cSJim Jagielski     rStrm.Write( pMem, nLen );
3805*b1cdbd2cSJim Jagielski     delete[] pMem;
3806*b1cdbd2cSJim Jagielski 
3807*b1cdbd2cSJim Jagielski     IDocumentMarkAccess* const pMarkAccess = pDocShell->GetDoc()->getIDocumentMarkAccess();
3808*b1cdbd2cSJim Jagielski     IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->findMark(sName);
3809*b1cdbd2cSJim Jagielski     if(ppMark != pMarkAccess->getAllMarksEnd()
3810*b1cdbd2cSJim Jagielski         && IDocumentMarkAccess::GetType(**ppMark) != IDocumentMarkAccess::BOOKMARK)
3811*b1cdbd2cSJim Jagielski     {
3812*b1cdbd2cSJim Jagielski         // the mark is still a DdeBookmark
3813*b1cdbd2cSJim Jagielski         // we replace it with a Bookmark, so it will get saved etc.
3814*b1cdbd2cSJim Jagielski         ::sw::mark::IMark* const pMark = ppMark->get();
3815*b1cdbd2cSJim Jagielski         SwServerObject* const pServerObject = dynamic_cast<SwServerObject *>(&refObj);
3816*b1cdbd2cSJim Jagielski 
3817*b1cdbd2cSJim Jagielski         // collecting state of old mark
3818*b1cdbd2cSJim Jagielski         SwPaM aPaM(pMark->GetMarkStart());
3819*b1cdbd2cSJim Jagielski         *aPaM.GetPoint() = pMark->GetMarkStart();
3820*b1cdbd2cSJim Jagielski         if(pMark->IsExpanded())
3821*b1cdbd2cSJim Jagielski         {
3822*b1cdbd2cSJim Jagielski             aPaM.SetMark();
3823*b1cdbd2cSJim Jagielski             *aPaM.GetMark() = pMark->GetMarkEnd();
3824*b1cdbd2cSJim Jagielski         }
3825*b1cdbd2cSJim Jagielski         ::rtl::OUString sMarkName = pMark->GetName();
3826*b1cdbd2cSJim Jagielski 
3827*b1cdbd2cSJim Jagielski         // remove mark
3828*b1cdbd2cSJim Jagielski         pServerObject->SetNoServer(); // this removes the connection between SwServerObject and mark
3829*b1cdbd2cSJim Jagielski         // N.B. ppMark was not loaded from file and cannot have xml:id
3830*b1cdbd2cSJim Jagielski         pMarkAccess->deleteMark(ppMark);
3831*b1cdbd2cSJim Jagielski 
3832*b1cdbd2cSJim Jagielski         // recreate as Bookmark
3833*b1cdbd2cSJim Jagielski         ::sw::mark::IMark* const pNewMark = pMarkAccess->makeMark(
3834*b1cdbd2cSJim Jagielski             aPaM,
3835*b1cdbd2cSJim Jagielski             sMarkName,
3836*b1cdbd2cSJim Jagielski             IDocumentMarkAccess::BOOKMARK);
3837*b1cdbd2cSJim Jagielski         pServerObject->SetDdeBookmark(*pNewMark);
3838*b1cdbd2cSJim Jagielski     }
3839*b1cdbd2cSJim Jagielski 
3840*b1cdbd2cSJim Jagielski     bDelBookmrk = false;
3841*b1cdbd2cSJim Jagielski     return true;
3842*b1cdbd2cSJim Jagielski }
3843*b1cdbd2cSJim Jagielski 
3844*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3845*b1cdbd2cSJim Jagielski 
Disconnect(sal_Bool bRemoveDataAdvise)3846*b1cdbd2cSJim Jagielski void SwTrnsfrDdeLink::Disconnect( sal_Bool bRemoveDataAdvise )
3847*b1cdbd2cSJim Jagielski {
3848*b1cdbd2cSJim Jagielski     //JP 29.01.96 Bug 24432:
3849*b1cdbd2cSJim Jagielski     //		kein DataChanged mehr entgegen nehmen, wenn man
3850*b1cdbd2cSJim Jagielski     //		sich schon im Disconnet befindet!
3851*b1cdbd2cSJim Jagielski     // 		(DTOR vom Bookmark verschickt einen DataChanged!)
3852*b1cdbd2cSJim Jagielski     const sal_Bool bOldDisconnect = bInDisconnect;
3853*b1cdbd2cSJim Jagielski     bInDisconnect = sal_True;
3854*b1cdbd2cSJim Jagielski 
3855*b1cdbd2cSJim Jagielski     // den nicht verwendeten Bookmark wieder zerstoeren (ohne Undo!)?
3856*b1cdbd2cSJim Jagielski     if( bDelBookmrk && refObj.Is() && FindDocShell() )
3857*b1cdbd2cSJim Jagielski     {
3858*b1cdbd2cSJim Jagielski         SwDoc* pDoc = pDocShell->GetDoc();
3859*b1cdbd2cSJim Jagielski         ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo());
3860*b1cdbd2cSJim Jagielski 
3861*b1cdbd2cSJim Jagielski         // --> OD, CD, OS 2005-11-25 #i58448#
3862*b1cdbd2cSJim Jagielski         Link aSavedOle2Link( pDoc->GetOle2Link() );
3863*b1cdbd2cSJim Jagielski         pDoc->SetOle2Link( Link() );
3864*b1cdbd2cSJim Jagielski         // <--
3865*b1cdbd2cSJim Jagielski         sal_Bool bIsModified = pDoc->IsModified();
3866*b1cdbd2cSJim Jagielski 
3867*b1cdbd2cSJim Jagielski         IDocumentMarkAccess* const pMarkAccess = pDoc->getIDocumentMarkAccess();
3868*b1cdbd2cSJim Jagielski         // check, if DdeBookmark is already in its desctruction
3869*b1cdbd2cSJim Jagielski         IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->findMark(sName);
3870*b1cdbd2cSJim Jagielski         if ( ppMark != pMarkAccess->getAllMarksEnd() )
3871*b1cdbd2cSJim Jagielski         {
3872*b1cdbd2cSJim Jagielski             ::sw::mark::DdeBookmark* const pDdeBookmark = dynamic_cast< ::sw::mark::DdeBookmark* >(ppMark->get());
3873*b1cdbd2cSJim Jagielski             if ( pDdeBookmark && !pDdeBookmark->IsInDestruction() )
3874*b1cdbd2cSJim Jagielski             {
3875*b1cdbd2cSJim Jagielski                 pMarkAccess->deleteMark(ppMark);
3876*b1cdbd2cSJim Jagielski             }
3877*b1cdbd2cSJim Jagielski         }
3878*b1cdbd2cSJim Jagielski 
3879*b1cdbd2cSJim Jagielski         if( !bIsModified )
3880*b1cdbd2cSJim Jagielski             pDoc->ResetModified();
3881*b1cdbd2cSJim Jagielski         pDoc->SetOle2Link( aSavedOle2Link );
3882*b1cdbd2cSJim Jagielski 
3883*b1cdbd2cSJim Jagielski         bDelBookmrk = sal_False;
3884*b1cdbd2cSJim Jagielski     }
3885*b1cdbd2cSJim Jagielski 
3886*b1cdbd2cSJim Jagielski     if( refObj.Is() )
3887*b1cdbd2cSJim Jagielski     {
3888*b1cdbd2cSJim Jagielski         refObj->SetUpdateTimeout( nOldTimeOut );
3889*b1cdbd2cSJim Jagielski         refObj->RemoveConnectAdvise( this );
3890*b1cdbd2cSJim Jagielski         if( bRemoveDataAdvise )
3891*b1cdbd2cSJim Jagielski             // in einem DataChanged darf das SelectionObject NIE geloescht
3892*b1cdbd2cSJim Jagielski             // werden; wird schon von der Basisklasse erledigt
3893*b1cdbd2cSJim Jagielski             // (ADVISEMODE_ONLYONCE!!!!)
3894*b1cdbd2cSJim Jagielski             // Im normalen Disconnet aber schon!
3895*b1cdbd2cSJim Jagielski             refObj->RemoveAllDataAdvise( this );
3896*b1cdbd2cSJim Jagielski         refObj.Clear();
3897*b1cdbd2cSJim Jagielski     }
3898*b1cdbd2cSJim Jagielski     bInDisconnect = bOldDisconnect;
3899*b1cdbd2cSJim Jagielski }
3900*b1cdbd2cSJim Jagielski 
3901*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3902*b1cdbd2cSJim Jagielski 
FindDocShell()3903*b1cdbd2cSJim Jagielski sal_Bool SwTrnsfrDdeLink::FindDocShell()
3904*b1cdbd2cSJim Jagielski {
3905*b1cdbd2cSJim Jagielski 	TypeId aType( TYPE( SwDocShell ) );
3906*b1cdbd2cSJim Jagielski 	SfxObjectShell* pTmpSh = SfxObjectShell::GetFirst( &aType );
3907*b1cdbd2cSJim Jagielski 	while( pTmpSh )
3908*b1cdbd2cSJim Jagielski 	{
3909*b1cdbd2cSJim Jagielski 		if( pTmpSh == pDocShell )		// die wollen wir haben
3910*b1cdbd2cSJim Jagielski 		{
3911*b1cdbd2cSJim Jagielski 			if( pDocShell->GetDoc() )
3912*b1cdbd2cSJim Jagielski 				return sal_True;
3913*b1cdbd2cSJim Jagielski 			break;		// das Doc ist nicht mehr vorhanden, also raus!
3914*b1cdbd2cSJim Jagielski 		}
3915*b1cdbd2cSJim Jagielski 		pTmpSh = SfxObjectShell::GetNext( *pTmpSh, &aType );
3916*b1cdbd2cSJim Jagielski 	}
3917*b1cdbd2cSJim Jagielski 
3918*b1cdbd2cSJim Jagielski 	pDocShell = 0;
3919*b1cdbd2cSJim Jagielski 	return sal_False;
3920*b1cdbd2cSJim Jagielski }
3921*b1cdbd2cSJim Jagielski 
3922*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3923*b1cdbd2cSJim Jagielski 
Closed()3924*b1cdbd2cSJim Jagielski void SwTrnsfrDdeLink::Closed()
3925*b1cdbd2cSJim Jagielski {
3926*b1cdbd2cSJim Jagielski 	if( !bInDisconnect && refObj.Is() )
3927*b1cdbd2cSJim Jagielski 	{
3928*b1cdbd2cSJim Jagielski 		refObj->RemoveAllDataAdvise( this );
3929*b1cdbd2cSJim Jagielski 		refObj->RemoveConnectAdvise( this );
3930*b1cdbd2cSJim Jagielski 		refObj.Clear();
3931*b1cdbd2cSJim Jagielski 	}
3932*b1cdbd2cSJim Jagielski }
3933