xref: /AOO41X/main/svx/source/svdraw/svdograf.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svx.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #define _ANIMATION
32*cdf0e10cSrcweir #include <unotools/streamwrap.hxx>
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir #include <sfx2/lnkbase.hxx>
35*cdf0e10cSrcweir #include <math.h>
36*cdf0e10cSrcweir #include <vcl/salbtype.hxx>
37*cdf0e10cSrcweir #include <sot/formats.hxx>
38*cdf0e10cSrcweir #include <sot/storage.hxx>
39*cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx>
40*cdf0e10cSrcweir #include <unotools/localfilehelper.hxx>
41*cdf0e10cSrcweir #include <svl/style.hxx>
42*cdf0e10cSrcweir #include <svtools/filter.hxx>
43*cdf0e10cSrcweir #include <svl/urihelper.hxx>
44*cdf0e10cSrcweir #include <svtools/grfmgr.hxx>
45*cdf0e10cSrcweir #include <vcl/svapp.hxx>
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir #include <sfx2/linkmgr.hxx>
48*cdf0e10cSrcweir #include <sfx2/docfile.hxx>
49*cdf0e10cSrcweir #include <svx/svdetc.hxx>
50*cdf0e10cSrcweir #include "svx/svdglob.hxx"
51*cdf0e10cSrcweir #include "svx/svdstr.hrc"
52*cdf0e10cSrcweir #include <svx/svdpool.hxx>
53*cdf0e10cSrcweir #include <svx/svdmodel.hxx>
54*cdf0e10cSrcweir #include <svx/svdpage.hxx>
55*cdf0e10cSrcweir #include <svx/svdmrkv.hxx>
56*cdf0e10cSrcweir #include <svx/svdpagv.hxx>
57*cdf0e10cSrcweir #include "svx/svdviter.hxx"
58*cdf0e10cSrcweir #include <svx/svdview.hxx>
59*cdf0e10cSrcweir #include "svtools/filter.hxx"
60*cdf0e10cSrcweir #include <svx/svdograf.hxx>
61*cdf0e10cSrcweir #include <svx/svdogrp.hxx>
62*cdf0e10cSrcweir #include <svx/xbitmap.hxx>
63*cdf0e10cSrcweir #include <svx/xbtmpit.hxx>
64*cdf0e10cSrcweir #include <svx/xflbmtit.hxx>
65*cdf0e10cSrcweir #include <svx/svdundo.hxx>
66*cdf0e10cSrcweir #include "svdfmtf.hxx"
67*cdf0e10cSrcweir #include <svx/sdgcpitm.hxx>
68*cdf0e10cSrcweir #include <editeng/eeitem.hxx>
69*cdf0e10cSrcweir #include <svx/sdr/properties/graphicproperties.hxx>
70*cdf0e10cSrcweir #include <svx/sdr/contact/viewcontactofgraphic.hxx>
71*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx>
72*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx>
73*cdf0e10cSrcweir #include <osl/thread.hxx>
74*cdf0e10cSrcweir #include <vos/mutex.hxx>
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
77*cdf0e10cSrcweir using namespace ::com::sun::star::io;
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir // -----------
80*cdf0e10cSrcweir // - Defines -
81*cdf0e10cSrcweir // -----------
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir #define GRAFSTREAMPOS_INVALID   0xffffffff
84*cdf0e10cSrcweir #define SWAPGRAPHIC_TIMEOUT     5000
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir // ------------------
88*cdf0e10cSrcweir // - SdrGraphicLink	-
89*cdf0e10cSrcweir // ------------------
90*cdf0e10cSrcweir 
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir const Graphic ImpLoadLinkedGraphic( const String& rFileName, const String& rFilterName )
93*cdf0e10cSrcweir {
94*cdf0e10cSrcweir 	Graphic aGraphic;
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir 	SfxMedium xMed( rFileName, STREAM_STD_READ, sal_True );
97*cdf0e10cSrcweir 	xMed.DownLoad();
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir 	SvStream* pInStrm = xMed.GetInStream();
100*cdf0e10cSrcweir 	if ( pInStrm )
101*cdf0e10cSrcweir 	{
102*cdf0e10cSrcweir 		pInStrm->Seek( STREAM_SEEK_TO_BEGIN );
103*cdf0e10cSrcweir 		GraphicFilter* pGF = GraphicFilter::GetGraphicFilter();
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir 		const sal_uInt16 nFilter = rFilterName.Len() && pGF->GetImportFormatCount()
106*cdf0e10cSrcweir 							? pGF->GetImportFormatNumber( rFilterName )
107*cdf0e10cSrcweir 							: GRFILTER_FORMAT_DONTKNOW;
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir 		String aEmptyStr;
110*cdf0e10cSrcweir 		com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > aFilterData( 1 );
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir 		// Room for improvment:
113*cdf0e10cSrcweir 		// As this is a linked graphic the GfxLink is not needed if saving/loading our own format.
114*cdf0e10cSrcweir 		// But this link is required by some filters to access the native graphic (pdf export/ms export),
115*cdf0e10cSrcweir 		// there we should create a new service to provide this data if needed
116*cdf0e10cSrcweir 		aFilterData[ 0 ].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CreateNativeLink" ) );
117*cdf0e10cSrcweir 		aFilterData[ 0 ].Value = Any( sal_True );
118*cdf0e10cSrcweir 		pGF->ImportGraphic( aGraphic, aEmptyStr, *pInStrm, nFilter, NULL, 0, &aFilterData );
119*cdf0e10cSrcweir 	}
120*cdf0e10cSrcweir 	return aGraphic;
121*cdf0e10cSrcweir }
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir class SdrGraphicUpdater;
124*cdf0e10cSrcweir class SdrGraphicLink : public sfx2::SvBaseLink
125*cdf0e10cSrcweir {
126*cdf0e10cSrcweir 	SdrGrafObj*			pGrafObj;
127*cdf0e10cSrcweir 	SdrGraphicUpdater*	pGraphicUpdater;
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir public:
130*cdf0e10cSrcweir 						SdrGraphicLink(SdrGrafObj* pObj);
131*cdf0e10cSrcweir 	virtual				~SdrGraphicLink();
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir 	virtual void		Closed();
134*cdf0e10cSrcweir 	virtual void		DataChanged( const String& rMimeType,
135*cdf0e10cSrcweir 								const ::com::sun::star::uno::Any & rValue );
136*cdf0e10cSrcweir 	void				DataChanged( const Graphic& rGraphic );
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 	sal_Bool				Connect() { return 0 != GetRealObject(); }
139*cdf0e10cSrcweir 	void				UpdateAsynchron();
140*cdf0e10cSrcweir 	void				RemoveGraphicUpdater();
141*cdf0e10cSrcweir };
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir class SdrGraphicUpdater : public ::osl::Thread
144*cdf0e10cSrcweir {
145*cdf0e10cSrcweir public:
146*cdf0e10cSrcweir     SdrGraphicUpdater( const String& rFileName, const String& rFilterName, SdrGraphicLink& );
147*cdf0e10cSrcweir     virtual ~SdrGraphicUpdater( void );
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir 	void SAL_CALL Terminate( void );
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir     sal_Bool GraphicLinkChanged( const String& rFileName ){ return mrFileName != rFileName;	};
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir protected:
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir 	/**	is called from the inherited create method and acts as the
156*cdf0e10cSrcweir 		main function of this thread.
157*cdf0e10cSrcweir 	*/
158*cdf0e10cSrcweir 	virtual void SAL_CALL run(void);
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir     /**	Called after the thread is terminated via the terminate
161*cdf0e10cSrcweir     	method.  Used to kill the thread by calling delete on this.
162*cdf0e10cSrcweir     */
163*cdf0e10cSrcweir     virtual void SAL_CALL onTerminated(void);
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir private:
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir     ::osl::Mutex	maMutex;
168*cdf0e10cSrcweir     const String&	mrFileName;
169*cdf0e10cSrcweir 	const String&	mrFilterName;
170*cdf0e10cSrcweir 	SdrGraphicLink& mrGraphicLink;
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir 	volatile bool mbIsTerminated;
173*cdf0e10cSrcweir };
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir SdrGraphicUpdater::SdrGraphicUpdater( const String& rFileName, const String& rFilterName, SdrGraphicLink& rGraphicLink )
176*cdf0e10cSrcweir : mrFileName( rFileName )
177*cdf0e10cSrcweir , mrFilterName( rFilterName )
178*cdf0e10cSrcweir , mrGraphicLink( rGraphicLink )
179*cdf0e10cSrcweir , mbIsTerminated( sal_False )
180*cdf0e10cSrcweir {
181*cdf0e10cSrcweir 	create();
182*cdf0e10cSrcweir }
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir SdrGraphicUpdater::~SdrGraphicUpdater( void )
185*cdf0e10cSrcweir {
186*cdf0e10cSrcweir }
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir void SdrGraphicUpdater::Terminate()
189*cdf0e10cSrcweir {
190*cdf0e10cSrcweir     ::osl::MutexGuard aGuard( maMutex );
191*cdf0e10cSrcweir     mbIsTerminated = sal_True;
192*cdf0e10cSrcweir }
193*cdf0e10cSrcweir 
194*cdf0e10cSrcweir void SAL_CALL SdrGraphicUpdater::onTerminated(void)
195*cdf0e10cSrcweir {
196*cdf0e10cSrcweir 	delete this;
197*cdf0e10cSrcweir }
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir void SAL_CALL SdrGraphicUpdater::run(void)
200*cdf0e10cSrcweir {
201*cdf0e10cSrcweir 	Graphic aGraphic( ImpLoadLinkedGraphic( mrFileName, mrFilterName ) );
202*cdf0e10cSrcweir 	::osl::MutexGuard aGuard(maMutex);
203*cdf0e10cSrcweir 	vos::OGuard aSolarGuard( Application::GetSolarMutex() );
204*cdf0e10cSrcweir 	if ( !mbIsTerminated )
205*cdf0e10cSrcweir 	{
206*cdf0e10cSrcweir 		mrGraphicLink.DataChanged( aGraphic );
207*cdf0e10cSrcweir 		mrGraphicLink.RemoveGraphicUpdater();
208*cdf0e10cSrcweir 	}
209*cdf0e10cSrcweir }
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir // -----------------------------------------------------------------------------
212*cdf0e10cSrcweir 
213*cdf0e10cSrcweir SdrGraphicLink::SdrGraphicLink(SdrGrafObj* pObj)
214*cdf0e10cSrcweir : ::sfx2::SvBaseLink( ::sfx2::LINKUPDATE_ONCALL, SOT_FORMATSTR_ID_SVXB )
215*cdf0e10cSrcweir , pGrafObj( pObj )
216*cdf0e10cSrcweir , pGraphicUpdater( NULL )
217*cdf0e10cSrcweir {
218*cdf0e10cSrcweir 	SetSynchron( sal_False );
219*cdf0e10cSrcweir }
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir // -----------------------------------------------------------------------------
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir SdrGraphicLink::~SdrGraphicLink()
224*cdf0e10cSrcweir {
225*cdf0e10cSrcweir 	if ( pGraphicUpdater )
226*cdf0e10cSrcweir 		pGraphicUpdater->Terminate();
227*cdf0e10cSrcweir }
228*cdf0e10cSrcweir 
229*cdf0e10cSrcweir // -----------------------------------------------------------------------------
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir void SdrGraphicLink::DataChanged( const Graphic& rGraphic )
232*cdf0e10cSrcweir {
233*cdf0e10cSrcweir 	pGrafObj->ImpSetLinkedGraphic( rGraphic );
234*cdf0e10cSrcweir }
235*cdf0e10cSrcweir 
236*cdf0e10cSrcweir // -----------------------------------------------------------------------------
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir void SdrGraphicLink::RemoveGraphicUpdater()
239*cdf0e10cSrcweir {
240*cdf0e10cSrcweir 	pGraphicUpdater = NULL;
241*cdf0e10cSrcweir }
242*cdf0e10cSrcweir 
243*cdf0e10cSrcweir // -----------------------------------------------------------------------------
244*cdf0e10cSrcweir 
245*cdf0e10cSrcweir void SdrGraphicLink::DataChanged( const String& rMimeType,
246*cdf0e10cSrcweir 								const ::com::sun::star::uno::Any & rValue )
247*cdf0e10cSrcweir {
248*cdf0e10cSrcweir 	SdrModel*       pModel      = pGrafObj ? pGrafObj->GetModel() : 0;
249*cdf0e10cSrcweir 	sfx2::LinkManager* pLinkManager= pModel  ? pModel->GetLinkManager() : 0;
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir 	if( pLinkManager && rValue.hasValue() )
252*cdf0e10cSrcweir 	{
253*cdf0e10cSrcweir 		pLinkManager->GetDisplayNames( this, 0, &pGrafObj->aFileName, 0, &pGrafObj->aFilterName );
254*cdf0e10cSrcweir 
255*cdf0e10cSrcweir 		Graphic aGraphic;
256*cdf0e10cSrcweir 		if( sfx2::LinkManager::GetGraphicFromAny( rMimeType, rValue, aGraphic ))
257*cdf0e10cSrcweir 		{
258*cdf0e10cSrcweir    			pGrafObj->NbcSetGraphic( aGraphic );
259*cdf0e10cSrcweir 			pGrafObj->ActionChanged();
260*cdf0e10cSrcweir 		}
261*cdf0e10cSrcweir 		else if( SotExchange::GetFormatIdFromMimeType( rMimeType ) != sfx2::LinkManager::RegisterStatusInfoId() )
262*cdf0e10cSrcweir 		{
263*cdf0e10cSrcweir 			// broadcasting, to update slidesorter
264*cdf0e10cSrcweir 			pGrafObj->BroadcastObjectChange();
265*cdf0e10cSrcweir 		}
266*cdf0e10cSrcweir 	}
267*cdf0e10cSrcweir }
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir // -----------------------------------------------------------------------------
270*cdf0e10cSrcweir 
271*cdf0e10cSrcweir void SdrGraphicLink::Closed()
272*cdf0e10cSrcweir {
273*cdf0e10cSrcweir 	// Die Verbindung wird aufgehoben; pLink des Objekts auf NULL setzen, da die Link-Instanz ja gerade destruiert wird.
274*cdf0e10cSrcweir 	pGrafObj->ForceSwapIn();
275*cdf0e10cSrcweir 	pGrafObj->pGraphicLink=NULL;
276*cdf0e10cSrcweir 	pGrafObj->ReleaseGraphicLink();
277*cdf0e10cSrcweir 	SvBaseLink::Closed();
278*cdf0e10cSrcweir }
279*cdf0e10cSrcweir 
280*cdf0e10cSrcweir // -----------------------------------------------------------------------------
281*cdf0e10cSrcweir 
282*cdf0e10cSrcweir void SdrGraphicLink::UpdateAsynchron()
283*cdf0e10cSrcweir {
284*cdf0e10cSrcweir 	if( GetObj() )
285*cdf0e10cSrcweir 	{
286*cdf0e10cSrcweir 		if ( pGraphicUpdater )
287*cdf0e10cSrcweir 		{
288*cdf0e10cSrcweir 			if ( pGraphicUpdater->GraphicLinkChanged( pGrafObj->GetFileName() ) )
289*cdf0e10cSrcweir 			{
290*cdf0e10cSrcweir 				pGraphicUpdater->Terminate();
291*cdf0e10cSrcweir 				pGraphicUpdater = new SdrGraphicUpdater( pGrafObj->GetFileName(), pGrafObj->GetFilterName(), *this );
292*cdf0e10cSrcweir 			}
293*cdf0e10cSrcweir 		}
294*cdf0e10cSrcweir 		else
295*cdf0e10cSrcweir 			pGraphicUpdater = new SdrGraphicUpdater( pGrafObj->GetFileName(), pGrafObj->GetFilterName(), *this );
296*cdf0e10cSrcweir 	}
297*cdf0e10cSrcweir }
298*cdf0e10cSrcweir 
299*cdf0e10cSrcweir // --------------
300*cdf0e10cSrcweir // - SdrGrafObj -
301*cdf0e10cSrcweir // --------------
302*cdf0e10cSrcweir 
303*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
304*cdf0e10cSrcweir // BaseProperties section
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir sdr::properties::BaseProperties* SdrGrafObj::CreateObjectSpecificProperties()
307*cdf0e10cSrcweir {
308*cdf0e10cSrcweir 	return new sdr::properties::GraphicProperties(*this);
309*cdf0e10cSrcweir }
310*cdf0e10cSrcweir 
311*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
312*cdf0e10cSrcweir // DrawContact section
313*cdf0e10cSrcweir 
314*cdf0e10cSrcweir sdr::contact::ViewContact* SdrGrafObj::CreateObjectSpecificViewContact()
315*cdf0e10cSrcweir {
316*cdf0e10cSrcweir 	return new sdr::contact::ViewContactOfGraphic(*this);
317*cdf0e10cSrcweir }
318*cdf0e10cSrcweir 
319*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
320*cdf0e10cSrcweir 
321*cdf0e10cSrcweir TYPEINIT1(SdrGrafObj,SdrRectObj);
322*cdf0e10cSrcweir 
323*cdf0e10cSrcweir // -----------------------------------------------------------------------------
324*cdf0e10cSrcweir 
325*cdf0e10cSrcweir SdrGrafObj::SdrGrafObj()
326*cdf0e10cSrcweir :	SdrRectObj(),
327*cdf0e10cSrcweir 	pGraphicLink	( NULL ),
328*cdf0e10cSrcweir 	bMirrored		( sal_False )
329*cdf0e10cSrcweir {
330*cdf0e10cSrcweir 	pGraphic = new GraphicObject;
331*cdf0e10cSrcweir 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT );
332*cdf0e10cSrcweir 	bNoShear = sal_True;
333*cdf0e10cSrcweir 
334*cdf0e10cSrcweir 	// #111096#
335*cdf0e10cSrcweir 	mbGrafAnimationAllowed = sal_True;
336*cdf0e10cSrcweir 
337*cdf0e10cSrcweir 	// #i25616#
338*cdf0e10cSrcweir 	mbLineIsOutsideGeometry = sal_True;
339*cdf0e10cSrcweir 	mbInsidePaint = sal_False;
340*cdf0e10cSrcweir 	mbIsPreview = sal_False;
341*cdf0e10cSrcweir 
342*cdf0e10cSrcweir 	// #i25616#
343*cdf0e10cSrcweir 	mbSupportTextIndentingOnLineWidthChange = sal_False;
344*cdf0e10cSrcweir }
345*cdf0e10cSrcweir 
346*cdf0e10cSrcweir // -----------------------------------------------------------------------------
347*cdf0e10cSrcweir 
348*cdf0e10cSrcweir SdrGrafObj::SdrGrafObj(const Graphic& rGrf, const Rectangle& rRect)
349*cdf0e10cSrcweir :	SdrRectObj		( rRect ),
350*cdf0e10cSrcweir 	pGraphicLink	( NULL ),
351*cdf0e10cSrcweir 	bMirrored		( sal_False )
352*cdf0e10cSrcweir {
353*cdf0e10cSrcweir 	pGraphic = new GraphicObject( rGrf );
354*cdf0e10cSrcweir 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT );
355*cdf0e10cSrcweir 	bNoShear = sal_True;
356*cdf0e10cSrcweir 
357*cdf0e10cSrcweir 	// #111096#
358*cdf0e10cSrcweir 	mbGrafAnimationAllowed = sal_True;
359*cdf0e10cSrcweir 
360*cdf0e10cSrcweir 	// #i25616#
361*cdf0e10cSrcweir 	mbLineIsOutsideGeometry = sal_True;
362*cdf0e10cSrcweir 	mbInsidePaint = sal_False;
363*cdf0e10cSrcweir 	mbIsPreview	= sal_False;
364*cdf0e10cSrcweir 
365*cdf0e10cSrcweir 	// #i25616#
366*cdf0e10cSrcweir 	mbSupportTextIndentingOnLineWidthChange = sal_False;
367*cdf0e10cSrcweir }
368*cdf0e10cSrcweir 
369*cdf0e10cSrcweir // -----------------------------------------------------------------------------
370*cdf0e10cSrcweir 
371*cdf0e10cSrcweir SdrGrafObj::SdrGrafObj( const Graphic& rGrf )
372*cdf0e10cSrcweir :	SdrRectObj(),
373*cdf0e10cSrcweir 	pGraphicLink	( NULL ),
374*cdf0e10cSrcweir 	bMirrored		( sal_False )
375*cdf0e10cSrcweir {
376*cdf0e10cSrcweir 	pGraphic = new GraphicObject( rGrf );
377*cdf0e10cSrcweir 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT );
378*cdf0e10cSrcweir 	bNoShear = sal_True;
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir 	// #111096#
381*cdf0e10cSrcweir 	mbGrafAnimationAllowed = sal_True;
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir 	// #i25616#
384*cdf0e10cSrcweir 	mbLineIsOutsideGeometry = sal_True;
385*cdf0e10cSrcweir 	mbInsidePaint = sal_False;
386*cdf0e10cSrcweir 	mbIsPreview	= sal_False;
387*cdf0e10cSrcweir 
388*cdf0e10cSrcweir 	// #i25616#
389*cdf0e10cSrcweir 	mbSupportTextIndentingOnLineWidthChange = sal_False;
390*cdf0e10cSrcweir }
391*cdf0e10cSrcweir 
392*cdf0e10cSrcweir // -----------------------------------------------------------------------------
393*cdf0e10cSrcweir 
394*cdf0e10cSrcweir SdrGrafObj::~SdrGrafObj()
395*cdf0e10cSrcweir {
396*cdf0e10cSrcweir 	delete pGraphic;
397*cdf0e10cSrcweir 	ImpLinkAbmeldung();
398*cdf0e10cSrcweir }
399*cdf0e10cSrcweir 
400*cdf0e10cSrcweir // -----------------------------------------------------------------------------
401*cdf0e10cSrcweir 
402*cdf0e10cSrcweir void SdrGrafObj::SetGraphicObject( const GraphicObject& rGrfObj )
403*cdf0e10cSrcweir {
404*cdf0e10cSrcweir 	*pGraphic = rGrfObj;
405*cdf0e10cSrcweir 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT );
406*cdf0e10cSrcweir 	pGraphic->SetUserData();
407*cdf0e10cSrcweir 	mbIsPreview = sal_False;
408*cdf0e10cSrcweir 	SetChanged();
409*cdf0e10cSrcweir 	BroadcastObjectChange();
410*cdf0e10cSrcweir }
411*cdf0e10cSrcweir 
412*cdf0e10cSrcweir // -----------------------------------------------------------------------------
413*cdf0e10cSrcweir 
414*cdf0e10cSrcweir const GraphicObject& SdrGrafObj::GetGraphicObject(bool bForceSwapIn) const
415*cdf0e10cSrcweir {
416*cdf0e10cSrcweir 	if(bForceSwapIn)
417*cdf0e10cSrcweir 	{
418*cdf0e10cSrcweir 		ForceSwapIn();
419*cdf0e10cSrcweir 	}
420*cdf0e10cSrcweir 
421*cdf0e10cSrcweir 	return *pGraphic;
422*cdf0e10cSrcweir }
423*cdf0e10cSrcweir 
424*cdf0e10cSrcweir // -----------------------------------------------------------------------------
425*cdf0e10cSrcweir 
426*cdf0e10cSrcweir void SdrGrafObj::NbcSetGraphic( const Graphic& rGrf )
427*cdf0e10cSrcweir {
428*cdf0e10cSrcweir 	pGraphic->SetGraphic( rGrf );
429*cdf0e10cSrcweir 	pGraphic->SetUserData();
430*cdf0e10cSrcweir 	mbIsPreview = sal_False;
431*cdf0e10cSrcweir }
432*cdf0e10cSrcweir 
433*cdf0e10cSrcweir void SdrGrafObj::SetGraphic( const Graphic& rGrf )
434*cdf0e10cSrcweir {
435*cdf0e10cSrcweir     NbcSetGraphic(rGrf);
436*cdf0e10cSrcweir 	SetChanged();
437*cdf0e10cSrcweir 	BroadcastObjectChange();
438*cdf0e10cSrcweir }
439*cdf0e10cSrcweir 
440*cdf0e10cSrcweir // -----------------------------------------------------------------------------
441*cdf0e10cSrcweir 
442*cdf0e10cSrcweir const Graphic& SdrGrafObj::GetGraphic() const
443*cdf0e10cSrcweir {
444*cdf0e10cSrcweir 	ForceSwapIn();
445*cdf0e10cSrcweir 	return pGraphic->GetGraphic();
446*cdf0e10cSrcweir }
447*cdf0e10cSrcweir 
448*cdf0e10cSrcweir // -----------------------------------------------------------------------------
449*cdf0e10cSrcweir 
450*cdf0e10cSrcweir Graphic SdrGrafObj::GetTransformedGraphic( sal_uIntPtr nTransformFlags ) const
451*cdf0e10cSrcweir {
452*cdf0e10cSrcweir     // #107947# Refactored most of the code to GraphicObject, where
453*cdf0e10cSrcweir     // everybody can use e.g. the cropping functionality
454*cdf0e10cSrcweir 
455*cdf0e10cSrcweir 	GraphicType	    eType = GetGraphicType();
456*cdf0e10cSrcweir     MapMode   		aDestMap( pModel->GetScaleUnit(), Point(), pModel->GetScaleFraction(), pModel->GetScaleFraction() );
457*cdf0e10cSrcweir     const Size      aDestSize( GetLogicRect().GetSize() );
458*cdf0e10cSrcweir     const sal_Bool      bMirror = ( nTransformFlags & SDRGRAFOBJ_TRANSFORMATTR_MIRROR ) != 0;
459*cdf0e10cSrcweir     const sal_Bool      bRotate = ( ( nTransformFlags & SDRGRAFOBJ_TRANSFORMATTR_ROTATE ) != 0 ) &&
460*cdf0e10cSrcweir         ( aGeo.nDrehWink && aGeo.nDrehWink != 18000 ) && ( GRAPHIC_NONE != eType );
461*cdf0e10cSrcweir 
462*cdf0e10cSrcweir     // #104115# Need cropping info earlier
463*cdf0e10cSrcweir     ( (SdrGrafObj*) this )->ImpSetAttrToGrafInfo();
464*cdf0e10cSrcweir     GraphicAttr aActAttr;
465*cdf0e10cSrcweir 
466*cdf0e10cSrcweir 	if( SDRGRAFOBJ_TRANSFORMATTR_NONE != nTransformFlags &&
467*cdf0e10cSrcweir         GRAPHIC_NONE != eType )
468*cdf0e10cSrcweir 	{
469*cdf0e10cSrcweir         // actually transform the graphic only in this case. On the
470*cdf0e10cSrcweir         // other hand, cropping will always happen
471*cdf0e10cSrcweir         aActAttr = aGrafInfo;
472*cdf0e10cSrcweir 
473*cdf0e10cSrcweir         if( bMirror )
474*cdf0e10cSrcweir 		{
475*cdf0e10cSrcweir 			sal_uInt16		nMirrorCase = ( aGeo.nDrehWink == 18000 ) ? ( bMirrored ? 3 : 4 ) : ( bMirrored ? 2 : 1 );
476*cdf0e10cSrcweir 			FASTBOOL	bHMirr = nMirrorCase == 2 || nMirrorCase == 4;
477*cdf0e10cSrcweir 			FASTBOOL	bVMirr = nMirrorCase == 3 || nMirrorCase == 4;
478*cdf0e10cSrcweir 
479*cdf0e10cSrcweir 			aActAttr.SetMirrorFlags( ( bHMirr ? BMP_MIRROR_HORZ : 0 ) | ( bVMirr ? BMP_MIRROR_VERT : 0 ) );
480*cdf0e10cSrcweir 		}
481*cdf0e10cSrcweir 
482*cdf0e10cSrcweir 		if( bRotate )
483*cdf0e10cSrcweir 			aActAttr.SetRotation( sal_uInt16(aGeo.nDrehWink / 10) );
484*cdf0e10cSrcweir 	}
485*cdf0e10cSrcweir 
486*cdf0e10cSrcweir     // #107947# Delegate to moved code in GraphicObject
487*cdf0e10cSrcweir     return GetGraphicObject().GetTransformedGraphic( aDestSize, aDestMap, aActAttr );
488*cdf0e10cSrcweir }
489*cdf0e10cSrcweir 
490*cdf0e10cSrcweir // -----------------------------------------------------------------------------
491*cdf0e10cSrcweir 
492*cdf0e10cSrcweir GraphicType SdrGrafObj::GetGraphicType() const
493*cdf0e10cSrcweir {
494*cdf0e10cSrcweir 	return pGraphic->GetType();
495*cdf0e10cSrcweir }
496*cdf0e10cSrcweir 
497*cdf0e10cSrcweir sal_Bool SdrGrafObj::IsAnimated() const
498*cdf0e10cSrcweir {
499*cdf0e10cSrcweir 	return pGraphic->IsAnimated();
500*cdf0e10cSrcweir }
501*cdf0e10cSrcweir 
502*cdf0e10cSrcweir sal_Bool SdrGrafObj::IsEPS() const
503*cdf0e10cSrcweir {
504*cdf0e10cSrcweir 	return pGraphic->IsEPS();
505*cdf0e10cSrcweir }
506*cdf0e10cSrcweir 
507*cdf0e10cSrcweir sal_Bool SdrGrafObj::IsRenderGraphic() const
508*cdf0e10cSrcweir {
509*cdf0e10cSrcweir 	return pGraphic->IsRenderGraphic();
510*cdf0e10cSrcweir }
511*cdf0e10cSrcweir 
512*cdf0e10cSrcweir sal_Bool SdrGrafObj::HasRenderGraphic() const
513*cdf0e10cSrcweir {
514*cdf0e10cSrcweir 	return pGraphic->HasRenderGraphic();
515*cdf0e10cSrcweir }
516*cdf0e10cSrcweir 
517*cdf0e10cSrcweir sal_Bool SdrGrafObj::IsSwappedOut() const
518*cdf0e10cSrcweir {
519*cdf0e10cSrcweir 	return mbIsPreview ? sal_True : pGraphic->IsSwappedOut();
520*cdf0e10cSrcweir }
521*cdf0e10cSrcweir 
522*cdf0e10cSrcweir const MapMode& SdrGrafObj::GetGrafPrefMapMode() const
523*cdf0e10cSrcweir {
524*cdf0e10cSrcweir 	return pGraphic->GetPrefMapMode();
525*cdf0e10cSrcweir }
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir const Size& SdrGrafObj::GetGrafPrefSize() const
528*cdf0e10cSrcweir {
529*cdf0e10cSrcweir 	return pGraphic->GetPrefSize();
530*cdf0e10cSrcweir }
531*cdf0e10cSrcweir 
532*cdf0e10cSrcweir // -----------------------------------------------------------------------------
533*cdf0e10cSrcweir 
534*cdf0e10cSrcweir void SdrGrafObj::SetGrafStreamURL( const String& rGraphicStreamURL )
535*cdf0e10cSrcweir {
536*cdf0e10cSrcweir 	mbIsPreview = sal_False;
537*cdf0e10cSrcweir 	if( !rGraphicStreamURL.Len() )
538*cdf0e10cSrcweir 	{
539*cdf0e10cSrcweir 		pGraphic->SetUserData();
540*cdf0e10cSrcweir 	}
541*cdf0e10cSrcweir 	else if( pModel->IsSwapGraphics() )
542*cdf0e10cSrcweir 	{
543*cdf0e10cSrcweir 		pGraphic->SetUserData( rGraphicStreamURL );
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir 		// set state of graphic object to 'swapped out'
546*cdf0e10cSrcweir 		if( pGraphic->GetType() == GRAPHIC_NONE )
547*cdf0e10cSrcweir 			pGraphic->SetSwapState();
548*cdf0e10cSrcweir 	}
549*cdf0e10cSrcweir }
550*cdf0e10cSrcweir 
551*cdf0e10cSrcweir // -----------------------------------------------------------------------------
552*cdf0e10cSrcweir 
553*cdf0e10cSrcweir String SdrGrafObj::GetGrafStreamURL() const
554*cdf0e10cSrcweir {
555*cdf0e10cSrcweir 	return pGraphic->GetUserData();
556*cdf0e10cSrcweir }
557*cdf0e10cSrcweir 
558*cdf0e10cSrcweir // -----------------------------------------------------------------------------
559*cdf0e10cSrcweir 
560*cdf0e10cSrcweir void SdrGrafObj::SetFileName(const String& rFileName)
561*cdf0e10cSrcweir {
562*cdf0e10cSrcweir 	aFileName = rFileName;
563*cdf0e10cSrcweir 	SetChanged();
564*cdf0e10cSrcweir }
565*cdf0e10cSrcweir 
566*cdf0e10cSrcweir // -----------------------------------------------------------------------------
567*cdf0e10cSrcweir 
568*cdf0e10cSrcweir void SdrGrafObj::SetFilterName(const String& rFilterName)
569*cdf0e10cSrcweir {
570*cdf0e10cSrcweir 	aFilterName = rFilterName;
571*cdf0e10cSrcweir 	SetChanged();
572*cdf0e10cSrcweir }
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir // -----------------------------------------------------------------------------
575*cdf0e10cSrcweir 
576*cdf0e10cSrcweir void SdrGrafObj::ForceSwapIn() const
577*cdf0e10cSrcweir {
578*cdf0e10cSrcweir 	if( mbIsPreview )
579*cdf0e10cSrcweir 	{
580*cdf0e10cSrcweir 		// removing preview graphic
581*cdf0e10cSrcweir 		const String aUserData( pGraphic->GetUserData() );
582*cdf0e10cSrcweir 
583*cdf0e10cSrcweir 		Graphic aEmpty;
584*cdf0e10cSrcweir 		pGraphic->SetGraphic( aEmpty );
585*cdf0e10cSrcweir 		pGraphic->SetUserData( aUserData );
586*cdf0e10cSrcweir 		pGraphic->SetSwapState();
587*cdf0e10cSrcweir 
588*cdf0e10cSrcweir 		const_cast< SdrGrafObj* >( this )->mbIsPreview = sal_False;
589*cdf0e10cSrcweir 	}
590*cdf0e10cSrcweir 	if ( pGraphicLink && pGraphic->IsSwappedOut() )
591*cdf0e10cSrcweir 		ImpUpdateGraphicLink( sal_False );
592*cdf0e10cSrcweir 	else
593*cdf0e10cSrcweir 		pGraphic->FireSwapInRequest();
594*cdf0e10cSrcweir 
595*cdf0e10cSrcweir 	if( pGraphic->IsSwappedOut() ||
596*cdf0e10cSrcweir 	    ( pGraphic->GetType() == GRAPHIC_NONE ) ||
597*cdf0e10cSrcweir 		( pGraphic->GetType() == GRAPHIC_DEFAULT ) )
598*cdf0e10cSrcweir 	{
599*cdf0e10cSrcweir 		Graphic aDefaultGraphic;
600*cdf0e10cSrcweir 		aDefaultGraphic.SetDefaultType();
601*cdf0e10cSrcweir 		pGraphic->SetGraphic( aDefaultGraphic );
602*cdf0e10cSrcweir 	}
603*cdf0e10cSrcweir }
604*cdf0e10cSrcweir 
605*cdf0e10cSrcweir // -----------------------------------------------------------------------------
606*cdf0e10cSrcweir 
607*cdf0e10cSrcweir void SdrGrafObj::ForceSwapOut() const
608*cdf0e10cSrcweir {
609*cdf0e10cSrcweir 	pGraphic->FireSwapOutRequest();
610*cdf0e10cSrcweir }
611*cdf0e10cSrcweir 
612*cdf0e10cSrcweir // -----------------------------------------------------------------------------
613*cdf0e10cSrcweir 
614*cdf0e10cSrcweir void SdrGrafObj::ImpLinkAnmeldung()
615*cdf0e10cSrcweir {
616*cdf0e10cSrcweir 	sfx2::LinkManager* pLinkManager = pModel != NULL ? pModel->GetLinkManager() : NULL;
617*cdf0e10cSrcweir 
618*cdf0e10cSrcweir 	if( pLinkManager != NULL && pGraphicLink == NULL )
619*cdf0e10cSrcweir 	{
620*cdf0e10cSrcweir 		if( aFileName.Len() )
621*cdf0e10cSrcweir 		{
622*cdf0e10cSrcweir 			pGraphicLink = new SdrGraphicLink( this );
623*cdf0e10cSrcweir 			pLinkManager->InsertFileLink( *pGraphicLink, OBJECT_CLIENT_GRF, aFileName, ( aFilterName.Len() ? &aFilterName : NULL ), NULL );
624*cdf0e10cSrcweir 			pGraphicLink->Connect();
625*cdf0e10cSrcweir 		}
626*cdf0e10cSrcweir 	}
627*cdf0e10cSrcweir }
628*cdf0e10cSrcweir 
629*cdf0e10cSrcweir // -----------------------------------------------------------------------------
630*cdf0e10cSrcweir 
631*cdf0e10cSrcweir void SdrGrafObj::ImpLinkAbmeldung()
632*cdf0e10cSrcweir {
633*cdf0e10cSrcweir 	sfx2::LinkManager* pLinkManager = pModel != NULL ? pModel->GetLinkManager() : NULL;
634*cdf0e10cSrcweir 
635*cdf0e10cSrcweir 	if( pLinkManager != NULL && pGraphicLink!=NULL)
636*cdf0e10cSrcweir 	{
637*cdf0e10cSrcweir 		// Bei Remove wird *pGraphicLink implizit deleted
638*cdf0e10cSrcweir 		pLinkManager->Remove( pGraphicLink );
639*cdf0e10cSrcweir 		pGraphicLink=NULL;
640*cdf0e10cSrcweir 	}
641*cdf0e10cSrcweir }
642*cdf0e10cSrcweir 
643*cdf0e10cSrcweir // -----------------------------------------------------------------------------
644*cdf0e10cSrcweir 
645*cdf0e10cSrcweir void SdrGrafObj::SetGraphicLink( const String& rFileName, const String& rFilterName )
646*cdf0e10cSrcweir {
647*cdf0e10cSrcweir 	ImpLinkAbmeldung();
648*cdf0e10cSrcweir 	aFileName = rFileName;
649*cdf0e10cSrcweir 	aFilterName = rFilterName;
650*cdf0e10cSrcweir 	ImpLinkAnmeldung();
651*cdf0e10cSrcweir 	pGraphic->SetUserData();
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir     // #92205# A linked graphic is per definition swapped out (has to be loaded)
654*cdf0e10cSrcweir     pGraphic->SetSwapState();
655*cdf0e10cSrcweir }
656*cdf0e10cSrcweir 
657*cdf0e10cSrcweir // -----------------------------------------------------------------------------
658*cdf0e10cSrcweir 
659*cdf0e10cSrcweir void SdrGrafObj::ReleaseGraphicLink()
660*cdf0e10cSrcweir {
661*cdf0e10cSrcweir 	ImpLinkAbmeldung();
662*cdf0e10cSrcweir 	aFileName = String();
663*cdf0e10cSrcweir 	aFilterName = String();
664*cdf0e10cSrcweir }
665*cdf0e10cSrcweir 
666*cdf0e10cSrcweir // -----------------------------------------------------------------------------
667*cdf0e10cSrcweir 
668*cdf0e10cSrcweir void SdrGrafObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
669*cdf0e10cSrcweir {
670*cdf0e10cSrcweir 	FASTBOOL bAnim = pGraphic->IsAnimated();
671*cdf0e10cSrcweir     FASTBOOL bRenderGraphic = pGraphic->HasRenderGraphic();
672*cdf0e10cSrcweir 	FASTBOOL bNoPresGrf = ( pGraphic->GetType() != GRAPHIC_NONE ) && !bEmptyPresObj;
673*cdf0e10cSrcweir 
674*cdf0e10cSrcweir 	rInfo.bResizeFreeAllowed = aGeo.nDrehWink % 9000 == 0 ||
675*cdf0e10cSrcweir 							   aGeo.nDrehWink % 18000 == 0 ||
676*cdf0e10cSrcweir 							   aGeo.nDrehWink % 27000 == 0;
677*cdf0e10cSrcweir 
678*cdf0e10cSrcweir 	rInfo.bResizePropAllowed = sal_True;
679*cdf0e10cSrcweir 	rInfo.bRotateFreeAllowed = bNoPresGrf && !bAnim && !bRenderGraphic;
680*cdf0e10cSrcweir 	rInfo.bRotate90Allowed = bNoPresGrf && !bAnim && !bRenderGraphic;
681*cdf0e10cSrcweir 	rInfo.bMirrorFreeAllowed = bNoPresGrf && !bAnim && !bRenderGraphic;
682*cdf0e10cSrcweir 	rInfo.bMirror45Allowed = bNoPresGrf && !bAnim && !bRenderGraphic;
683*cdf0e10cSrcweir 	rInfo.bMirror90Allowed = !bEmptyPresObj && !bRenderGraphic;
684*cdf0e10cSrcweir 	rInfo.bTransparenceAllowed = sal_False;
685*cdf0e10cSrcweir 	rInfo.bGradientAllowed = sal_False;
686*cdf0e10cSrcweir 	rInfo.bShearAllowed = sal_False;
687*cdf0e10cSrcweir 	rInfo.bEdgeRadiusAllowed=sal_False;
688*cdf0e10cSrcweir 	rInfo.bCanConvToPath = sal_False;
689*cdf0e10cSrcweir 	rInfo.bCanConvToPathLineToArea = sal_False;
690*cdf0e10cSrcweir 	rInfo.bCanConvToPolyLineToArea = sal_False;
691*cdf0e10cSrcweir 	rInfo.bCanConvToPoly = !IsEPS() && !bRenderGraphic;
692*cdf0e10cSrcweir 	rInfo.bCanConvToContour = (rInfo.bCanConvToPoly || LineGeometryUsageIsNecessary());
693*cdf0e10cSrcweir }
694*cdf0e10cSrcweir 
695*cdf0e10cSrcweir // -----------------------------------------------------------------------------
696*cdf0e10cSrcweir 
697*cdf0e10cSrcweir sal_uInt16 SdrGrafObj::GetObjIdentifier() const
698*cdf0e10cSrcweir {
699*cdf0e10cSrcweir 	return sal_uInt16( OBJ_GRAF );
700*cdf0e10cSrcweir }
701*cdf0e10cSrcweir 
702*cdf0e10cSrcweir // -----------------------------------------------------------------------------
703*cdf0e10cSrcweir 
704*cdf0e10cSrcweir /* The graphic of the GraphicLink will be loaded. If it is called with
705*cdf0e10cSrcweir    bAsynchron = true then the graphic will be set later via DataChanged
706*cdf0e10cSrcweir */
707*cdf0e10cSrcweir sal_Bool SdrGrafObj::ImpUpdateGraphicLink( sal_Bool bAsynchron ) const
708*cdf0e10cSrcweir {
709*cdf0e10cSrcweir     sal_Bool bRet = sal_False;
710*cdf0e10cSrcweir     if( pGraphicLink )
711*cdf0e10cSrcweir 	{
712*cdf0e10cSrcweir 		if ( bAsynchron )
713*cdf0e10cSrcweir 			pGraphicLink->UpdateAsynchron();
714*cdf0e10cSrcweir 		else
715*cdf0e10cSrcweir 			pGraphicLink->DataChanged( ImpLoadLinkedGraphic( aFileName, aFilterName ) );
716*cdf0e10cSrcweir         bRet = sal_True;
717*cdf0e10cSrcweir     }
718*cdf0e10cSrcweir 	return bRet;
719*cdf0e10cSrcweir }
720*cdf0e10cSrcweir 
721*cdf0e10cSrcweir // -----------------------------------------------------------------------------
722*cdf0e10cSrcweir 
723*cdf0e10cSrcweir void SdrGrafObj::ImpSetLinkedGraphic( const Graphic& rGraphic )
724*cdf0e10cSrcweir {
725*cdf0e10cSrcweir 	const sal_Bool bIsChanged = GetModel()->IsChanged();
726*cdf0e10cSrcweir 	NbcSetGraphic( rGraphic );
727*cdf0e10cSrcweir 	ActionChanged();
728*cdf0e10cSrcweir 	BroadcastObjectChange();
729*cdf0e10cSrcweir 	GetModel()->SetChanged( bIsChanged );
730*cdf0e10cSrcweir }
731*cdf0e10cSrcweir 
732*cdf0e10cSrcweir // -----------------------------------------------------------------------------
733*cdf0e10cSrcweir 
734*cdf0e10cSrcweir void SdrGrafObj::TakeObjNameSingul(XubString& rName) const
735*cdf0e10cSrcweir {
736*cdf0e10cSrcweir 	switch( pGraphic->GetType() )
737*cdf0e10cSrcweir 	{
738*cdf0e10cSrcweir 		case GRAPHIC_BITMAP:
739*cdf0e10cSrcweir         {
740*cdf0e10cSrcweir             const sal_uInt16 nId = ( ( pGraphic->IsTransparent() || ( (const SdrGrafTransparenceItem&) GetObjectItem( SDRATTR_GRAFTRANSPARENCE ) ).GetValue() ) ?
741*cdf0e10cSrcweir                                  ( IsLinkedGraphic() ? STR_ObjNameSingulGRAFBMPTRANSLNK : STR_ObjNameSingulGRAFBMPTRANS ) :
742*cdf0e10cSrcweir                                  ( IsLinkedGraphic() ? STR_ObjNameSingulGRAFBMPLNK : STR_ObjNameSingulGRAFBMP ) );
743*cdf0e10cSrcweir 
744*cdf0e10cSrcweir             rName=ImpGetResStr( nId );
745*cdf0e10cSrcweir         }
746*cdf0e10cSrcweir         break;
747*cdf0e10cSrcweir 
748*cdf0e10cSrcweir 		case GRAPHIC_GDIMETAFILE:
749*cdf0e10cSrcweir             rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFMTFLNK : STR_ObjNameSingulGRAFMTF );
750*cdf0e10cSrcweir         break;
751*cdf0e10cSrcweir 
752*cdf0e10cSrcweir         case GRAPHIC_NONE:
753*cdf0e10cSrcweir             rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFNONELNK : STR_ObjNameSingulGRAFNONE );
754*cdf0e10cSrcweir         break;
755*cdf0e10cSrcweir 
756*cdf0e10cSrcweir         default:
757*cdf0e10cSrcweir             rName=ImpGetResStr(  IsLinkedGraphic() ? STR_ObjNameSingulGRAFLNK : STR_ObjNameSingulGRAF );
758*cdf0e10cSrcweir         break;
759*cdf0e10cSrcweir 	}
760*cdf0e10cSrcweir 
761*cdf0e10cSrcweir 	const String aName(GetName());
762*cdf0e10cSrcweir 
763*cdf0e10cSrcweir 	if( aName.Len() )
764*cdf0e10cSrcweir 	{
765*cdf0e10cSrcweir 		rName.AppendAscii( " '" );
766*cdf0e10cSrcweir 		rName += aName;
767*cdf0e10cSrcweir 		rName += sal_Unicode( '\'' );
768*cdf0e10cSrcweir 	}
769*cdf0e10cSrcweir }
770*cdf0e10cSrcweir 
771*cdf0e10cSrcweir // -----------------------------------------------------------------------------
772*cdf0e10cSrcweir 
773*cdf0e10cSrcweir void SdrGrafObj::TakeObjNamePlural( XubString& rName ) const
774*cdf0e10cSrcweir {
775*cdf0e10cSrcweir 	switch( pGraphic->GetType() )
776*cdf0e10cSrcweir 	{
777*cdf0e10cSrcweir 		case GRAPHIC_BITMAP:
778*cdf0e10cSrcweir         {
779*cdf0e10cSrcweir             const sal_uInt16 nId = ( ( pGraphic->IsTransparent() || ( (const SdrGrafTransparenceItem&) GetObjectItem( SDRATTR_GRAFTRANSPARENCE ) ).GetValue() ) ?
780*cdf0e10cSrcweir                                  ( IsLinkedGraphic() ? STR_ObjNamePluralGRAFBMPTRANSLNK : STR_ObjNamePluralGRAFBMPTRANS ) :
781*cdf0e10cSrcweir                                  ( IsLinkedGraphic() ? STR_ObjNamePluralGRAFBMPLNK : STR_ObjNamePluralGRAFBMP ) );
782*cdf0e10cSrcweir 
783*cdf0e10cSrcweir             rName=ImpGetResStr( nId );
784*cdf0e10cSrcweir         }
785*cdf0e10cSrcweir         break;
786*cdf0e10cSrcweir 
787*cdf0e10cSrcweir 		case GRAPHIC_GDIMETAFILE:
788*cdf0e10cSrcweir             rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFMTFLNK : STR_ObjNamePluralGRAFMTF );
789*cdf0e10cSrcweir         break;
790*cdf0e10cSrcweir 
791*cdf0e10cSrcweir         case GRAPHIC_NONE:
792*cdf0e10cSrcweir             rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFNONELNK : STR_ObjNamePluralGRAFNONE );
793*cdf0e10cSrcweir         break;
794*cdf0e10cSrcweir 
795*cdf0e10cSrcweir         default:
796*cdf0e10cSrcweir             rName=ImpGetResStr(  IsLinkedGraphic() ? STR_ObjNamePluralGRAFLNK : STR_ObjNamePluralGRAF );
797*cdf0e10cSrcweir         break;
798*cdf0e10cSrcweir 	}
799*cdf0e10cSrcweir 
800*cdf0e10cSrcweir 	const String aName(GetName());
801*cdf0e10cSrcweir 
802*cdf0e10cSrcweir 	if( aName.Len() )
803*cdf0e10cSrcweir 	{
804*cdf0e10cSrcweir 		rName.AppendAscii( " '" );
805*cdf0e10cSrcweir 		rName += aName;
806*cdf0e10cSrcweir 		rName += sal_Unicode( '\'' );
807*cdf0e10cSrcweir 	}
808*cdf0e10cSrcweir }
809*cdf0e10cSrcweir 
810*cdf0e10cSrcweir // -----------------------------------------------------------------------------
811*cdf0e10cSrcweir 
812*cdf0e10cSrcweir SdrObject* SdrGrafObj::getFullDragClone() const
813*cdf0e10cSrcweir {
814*cdf0e10cSrcweir     // call parent
815*cdf0e10cSrcweir     SdrGrafObj* pRetval = static_cast< SdrGrafObj* >(SdrRectObj::getFullDragClone());
816*cdf0e10cSrcweir 
817*cdf0e10cSrcweir     // #i103116# the full drag clone leads to problems
818*cdf0e10cSrcweir     // with linked graphics, so reset the link in this
819*cdf0e10cSrcweir     // temporary interaction object and load graphic
820*cdf0e10cSrcweir     if(pRetval && IsLinkedGraphic())
821*cdf0e10cSrcweir     {
822*cdf0e10cSrcweir         pRetval->ForceSwapIn();
823*cdf0e10cSrcweir         pRetval->ReleaseGraphicLink();
824*cdf0e10cSrcweir     }
825*cdf0e10cSrcweir 
826*cdf0e10cSrcweir     return pRetval;
827*cdf0e10cSrcweir }
828*cdf0e10cSrcweir 
829*cdf0e10cSrcweir void SdrGrafObj::operator=( const SdrObject& rObj )
830*cdf0e10cSrcweir {
831*cdf0e10cSrcweir 	SdrRectObj::operator=( rObj );
832*cdf0e10cSrcweir 
833*cdf0e10cSrcweir 	const SdrGrafObj& rGraf = (SdrGrafObj&) rObj;
834*cdf0e10cSrcweir 
835*cdf0e10cSrcweir 	pGraphic->SetGraphic( rGraf.GetGraphic(), &rGraf.GetGraphicObject() );
836*cdf0e10cSrcweir 	aCropRect = rGraf.aCropRect;
837*cdf0e10cSrcweir 	aFileName = rGraf.aFileName;
838*cdf0e10cSrcweir 	aFilterName = rGraf.aFilterName;
839*cdf0e10cSrcweir 	bMirrored = rGraf.bMirrored;
840*cdf0e10cSrcweir 
841*cdf0e10cSrcweir 	if( rGraf.pGraphicLink != NULL)
842*cdf0e10cSrcweir 	{
843*cdf0e10cSrcweir 		SetGraphicLink( aFileName, aFilterName );
844*cdf0e10cSrcweir 	}
845*cdf0e10cSrcweir 
846*cdf0e10cSrcweir 	ImpSetAttrToGrafInfo();
847*cdf0e10cSrcweir }
848*cdf0e10cSrcweir 
849*cdf0e10cSrcweir // -----------------------------------------------------------------------------
850*cdf0e10cSrcweir // #i25616#
851*cdf0e10cSrcweir 
852*cdf0e10cSrcweir basegfx::B2DPolyPolygon SdrGrafObj::TakeXorPoly() const
853*cdf0e10cSrcweir {
854*cdf0e10cSrcweir 	if(mbInsidePaint)
855*cdf0e10cSrcweir 	{
856*cdf0e10cSrcweir 		basegfx::B2DPolyPolygon aRetval;
857*cdf0e10cSrcweir 
858*cdf0e10cSrcweir 		// take grown rectangle
859*cdf0e10cSrcweir 		const sal_Int32 nHalfLineWidth(ImpGetLineWdt() / 2);
860*cdf0e10cSrcweir 		const Rectangle aGrownRect(
861*cdf0e10cSrcweir 			aRect.Left() - nHalfLineWidth,
862*cdf0e10cSrcweir 			aRect.Top() - nHalfLineWidth,
863*cdf0e10cSrcweir 			aRect.Right() + nHalfLineWidth,
864*cdf0e10cSrcweir 			aRect.Bottom() + nHalfLineWidth);
865*cdf0e10cSrcweir 
866*cdf0e10cSrcweir 		XPolygon aXPoly(ImpCalcXPoly(aGrownRect, GetEckenradius()));
867*cdf0e10cSrcweir 		aRetval.append(aXPoly.getB2DPolygon());
868*cdf0e10cSrcweir 
869*cdf0e10cSrcweir 		return aRetval;
870*cdf0e10cSrcweir 	}
871*cdf0e10cSrcweir 	else
872*cdf0e10cSrcweir 	{
873*cdf0e10cSrcweir 		// call parent
874*cdf0e10cSrcweir 		return SdrRectObj::TakeXorPoly();
875*cdf0e10cSrcweir 	}
876*cdf0e10cSrcweir }
877*cdf0e10cSrcweir 
878*cdf0e10cSrcweir // -----------------------------------------------------------------------------
879*cdf0e10cSrcweir 
880*cdf0e10cSrcweir sal_uInt32 SdrGrafObj::GetHdlCount() const
881*cdf0e10cSrcweir {
882*cdf0e10cSrcweir 	return 8L;
883*cdf0e10cSrcweir }
884*cdf0e10cSrcweir 
885*cdf0e10cSrcweir // -----------------------------------------------------------------------------
886*cdf0e10cSrcweir 
887*cdf0e10cSrcweir SdrHdl* SdrGrafObj::GetHdl(sal_uInt32 nHdlNum) const
888*cdf0e10cSrcweir {
889*cdf0e10cSrcweir 	return SdrRectObj::GetHdl( nHdlNum + 1L );
890*cdf0e10cSrcweir }
891*cdf0e10cSrcweir 
892*cdf0e10cSrcweir // -----------------------------------------------------------------------------
893*cdf0e10cSrcweir 
894*cdf0e10cSrcweir void SdrGrafObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
895*cdf0e10cSrcweir {
896*cdf0e10cSrcweir 	SdrRectObj::NbcResize( rRef, xFact, yFact );
897*cdf0e10cSrcweir 
898*cdf0e10cSrcweir 	FASTBOOL bMirrX = xFact.GetNumerator() < 0;
899*cdf0e10cSrcweir 	FASTBOOL bMirrY = yFact.GetNumerator() < 0;
900*cdf0e10cSrcweir 
901*cdf0e10cSrcweir 	if( bMirrX != bMirrY )
902*cdf0e10cSrcweir 		bMirrored = !bMirrored;
903*cdf0e10cSrcweir }
904*cdf0e10cSrcweir 
905*cdf0e10cSrcweir // -----------------------------------------------------------------------------
906*cdf0e10cSrcweir 
907*cdf0e10cSrcweir void SdrGrafObj::NbcRotate(const Point& rRef, long nWink, double sn, double cs)
908*cdf0e10cSrcweir {
909*cdf0e10cSrcweir 	SdrRectObj::NbcRotate(rRef,nWink,sn,cs);
910*cdf0e10cSrcweir }
911*cdf0e10cSrcweir 
912*cdf0e10cSrcweir // -----------------------------------------------------------------------------
913*cdf0e10cSrcweir 
914*cdf0e10cSrcweir void SdrGrafObj::NbcMirror(const Point& rRef1, const Point& rRef2)
915*cdf0e10cSrcweir {
916*cdf0e10cSrcweir 	SdrRectObj::NbcMirror(rRef1,rRef2);
917*cdf0e10cSrcweir 	bMirrored = !bMirrored;
918*cdf0e10cSrcweir }
919*cdf0e10cSrcweir 
920*cdf0e10cSrcweir // -----------------------------------------------------------------------------
921*cdf0e10cSrcweir 
922*cdf0e10cSrcweir void SdrGrafObj::NbcShear(const Point& rRef, long nWink, double tn, FASTBOOL bVShear)
923*cdf0e10cSrcweir {
924*cdf0e10cSrcweir 	SdrRectObj::NbcRotate( rRef, nWink, tn, bVShear );
925*cdf0e10cSrcweir }
926*cdf0e10cSrcweir 
927*cdf0e10cSrcweir // -----------------------------------------------------------------------------
928*cdf0e10cSrcweir 
929*cdf0e10cSrcweir void SdrGrafObj::NbcSetSnapRect(const Rectangle& rRect)
930*cdf0e10cSrcweir {
931*cdf0e10cSrcweir 	SdrRectObj::NbcSetSnapRect(rRect);
932*cdf0e10cSrcweir }
933*cdf0e10cSrcweir 
934*cdf0e10cSrcweir // -----------------------------------------------------------------------------
935*cdf0e10cSrcweir 
936*cdf0e10cSrcweir void SdrGrafObj::NbcSetLogicRect( const Rectangle& rRect)
937*cdf0e10cSrcweir {
938*cdf0e10cSrcweir 	//int bChg=rRect.GetSize()!=aRect.GetSize();
939*cdf0e10cSrcweir 	SdrRectObj::NbcSetLogicRect(rRect);
940*cdf0e10cSrcweir }
941*cdf0e10cSrcweir 
942*cdf0e10cSrcweir // -----------------------------------------------------------------------------
943*cdf0e10cSrcweir 
944*cdf0e10cSrcweir SdrObjGeoData* SdrGrafObj::NewGeoData() const
945*cdf0e10cSrcweir {
946*cdf0e10cSrcweir 	return new SdrGrafObjGeoData;
947*cdf0e10cSrcweir }
948*cdf0e10cSrcweir 
949*cdf0e10cSrcweir // -----------------------------------------------------------------------------
950*cdf0e10cSrcweir 
951*cdf0e10cSrcweir void SdrGrafObj::SaveGeoData(SdrObjGeoData& rGeo) const
952*cdf0e10cSrcweir {
953*cdf0e10cSrcweir 	SdrRectObj::SaveGeoData(rGeo);
954*cdf0e10cSrcweir 	SdrGrafObjGeoData& rGGeo=(SdrGrafObjGeoData&)rGeo;
955*cdf0e10cSrcweir 	rGGeo.bMirrored=bMirrored;
956*cdf0e10cSrcweir }
957*cdf0e10cSrcweir 
958*cdf0e10cSrcweir // -----------------------------------------------------------------------------
959*cdf0e10cSrcweir 
960*cdf0e10cSrcweir void SdrGrafObj::RestGeoData(const SdrObjGeoData& rGeo)
961*cdf0e10cSrcweir {
962*cdf0e10cSrcweir 	//long		nDrehMerk = aGeo.nDrehWink;
963*cdf0e10cSrcweir 	//long		nShearMerk = aGeo.nShearWink;
964*cdf0e10cSrcweir 	//int	bMirrMerk = bMirrored;
965*cdf0e10cSrcweir 	Size		aSizMerk( aRect.GetSize() );
966*cdf0e10cSrcweir 
967*cdf0e10cSrcweir 	SdrRectObj::RestGeoData(rGeo);
968*cdf0e10cSrcweir 	SdrGrafObjGeoData& rGGeo=(SdrGrafObjGeoData&)rGeo;
969*cdf0e10cSrcweir 	bMirrored=rGGeo.bMirrored;
970*cdf0e10cSrcweir }
971*cdf0e10cSrcweir 
972*cdf0e10cSrcweir // -----------------------------------------------------------------------------
973*cdf0e10cSrcweir 
974*cdf0e10cSrcweir void SdrGrafObj::SetPage( SdrPage* pNewPage )
975*cdf0e10cSrcweir {
976*cdf0e10cSrcweir 	FASTBOOL bRemove = pNewPage == NULL && pPage != NULL;
977*cdf0e10cSrcweir 	FASTBOOL bInsert = pNewPage != NULL && pPage == NULL;
978*cdf0e10cSrcweir 
979*cdf0e10cSrcweir 	if( bRemove )
980*cdf0e10cSrcweir 	{
981*cdf0e10cSrcweir 		// hier kein SwapIn noetig, weil wenn nicht geladen, dann auch nicht animiert.
982*cdf0e10cSrcweir 		if( pGraphic->IsAnimated())
983*cdf0e10cSrcweir 			pGraphic->StopAnimation();
984*cdf0e10cSrcweir 
985*cdf0e10cSrcweir 		if( pGraphicLink != NULL )
986*cdf0e10cSrcweir 			ImpLinkAbmeldung();
987*cdf0e10cSrcweir 	}
988*cdf0e10cSrcweir 
989*cdf0e10cSrcweir 	SdrRectObj::SetPage( pNewPage );
990*cdf0e10cSrcweir 
991*cdf0e10cSrcweir 	if(aFileName.Len() && bInsert)
992*cdf0e10cSrcweir 		ImpLinkAnmeldung();
993*cdf0e10cSrcweir }
994*cdf0e10cSrcweir 
995*cdf0e10cSrcweir // -----------------------------------------------------------------------------
996*cdf0e10cSrcweir 
997*cdf0e10cSrcweir void SdrGrafObj::SetModel( SdrModel* pNewModel )
998*cdf0e10cSrcweir {
999*cdf0e10cSrcweir 	FASTBOOL bChg = pNewModel != pModel;
1000*cdf0e10cSrcweir 
1001*cdf0e10cSrcweir 	if( bChg )
1002*cdf0e10cSrcweir 	{
1003*cdf0e10cSrcweir 		if( pGraphic->HasUserData() )
1004*cdf0e10cSrcweir 		{
1005*cdf0e10cSrcweir 			ForceSwapIn();
1006*cdf0e10cSrcweir 			pGraphic->SetUserData();
1007*cdf0e10cSrcweir 		}
1008*cdf0e10cSrcweir 
1009*cdf0e10cSrcweir 		if( pGraphicLink != NULL )
1010*cdf0e10cSrcweir 			ImpLinkAbmeldung();
1011*cdf0e10cSrcweir 	}
1012*cdf0e10cSrcweir 
1013*cdf0e10cSrcweir 	// Model umsetzen
1014*cdf0e10cSrcweir 	SdrRectObj::SetModel(pNewModel);
1015*cdf0e10cSrcweir 
1016*cdf0e10cSrcweir 	if( bChg && aFileName.Len() )
1017*cdf0e10cSrcweir 		ImpLinkAnmeldung();
1018*cdf0e10cSrcweir }
1019*cdf0e10cSrcweir 
1020*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1021*cdf0e10cSrcweir 
1022*cdf0e10cSrcweir void SdrGrafObj::StartAnimation( OutputDevice* /*pOutDev*/, const Point& /*rPoint*/, const Size& /*rSize*/, long /*nExtraData*/)
1023*cdf0e10cSrcweir {
1024*cdf0e10cSrcweir 	// #111096#
1025*cdf0e10cSrcweir 	// use new graf animation
1026*cdf0e10cSrcweir 	SetGrafAnimationAllowed(sal_True);
1027*cdf0e10cSrcweir }
1028*cdf0e10cSrcweir 
1029*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1030*cdf0e10cSrcweir 
1031*cdf0e10cSrcweir void SdrGrafObj::StopAnimation(OutputDevice* /*pOutDev*/, long /*nExtraData*/)
1032*cdf0e10cSrcweir {
1033*cdf0e10cSrcweir 	// #111096#
1034*cdf0e10cSrcweir 	// use new graf animation
1035*cdf0e10cSrcweir 	SetGrafAnimationAllowed(sal_False);
1036*cdf0e10cSrcweir }
1037*cdf0e10cSrcweir 
1038*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1039*cdf0e10cSrcweir 
1040*cdf0e10cSrcweir FASTBOOL SdrGrafObj::HasGDIMetaFile() const
1041*cdf0e10cSrcweir {
1042*cdf0e10cSrcweir 	return( pGraphic->GetType() == GRAPHIC_GDIMETAFILE );
1043*cdf0e10cSrcweir }
1044*cdf0e10cSrcweir 
1045*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1046*cdf0e10cSrcweir 
1047*cdf0e10cSrcweir const GDIMetaFile* SdrGrafObj::GetGDIMetaFile() const
1048*cdf0e10cSrcweir {
1049*cdf0e10cSrcweir 	DBG_ERROR( "Invalid return value! Don't use it! (KA)" );
1050*cdf0e10cSrcweir 	return &GetGraphic().GetGDIMetaFile();
1051*cdf0e10cSrcweir }
1052*cdf0e10cSrcweir 
1053*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1054*cdf0e10cSrcweir 
1055*cdf0e10cSrcweir SdrObject* SdrGrafObj::DoConvertToPolyObj(sal_Bool bBezier) const
1056*cdf0e10cSrcweir {
1057*cdf0e10cSrcweir 	SdrObject* pRetval = NULL;
1058*cdf0e10cSrcweir 
1059*cdf0e10cSrcweir 	switch( GetGraphicType() )
1060*cdf0e10cSrcweir 	{
1061*cdf0e10cSrcweir 		case GRAPHIC_GDIMETAFILE:
1062*cdf0e10cSrcweir 		{
1063*cdf0e10cSrcweir 			// NUR die aus dem MetaFile erzeugbaren Objekte in eine Gruppe packen und zurueckliefern
1064*cdf0e10cSrcweir 			SdrObjGroup*			pGrp = new SdrObjGroup();
1065*cdf0e10cSrcweir 			ImpSdrGDIMetaFileImport aFilter(*GetModel());
1066*cdf0e10cSrcweir 			Point					aOutPos( aRect.TopLeft() );
1067*cdf0e10cSrcweir 			const Size				aOutSiz( aRect.GetSize() );
1068*cdf0e10cSrcweir 
1069*cdf0e10cSrcweir 			aFilter.SetScaleRect(GetSnapRect());
1070*cdf0e10cSrcweir 			aFilter.SetLayer(GetLayer());
1071*cdf0e10cSrcweir 
1072*cdf0e10cSrcweir 			sal_uInt32 nInsAnz = aFilter.DoImport(GetTransformedGraphic().GetGDIMetaFile(), *pGrp->GetSubList(), 0);
1073*cdf0e10cSrcweir 			if(nInsAnz)
1074*cdf0e10cSrcweir 			{
1075*cdf0e10cSrcweir 				pRetval = pGrp;
1076*cdf0e10cSrcweir 				pGrp->NbcSetLayer(GetLayer());
1077*cdf0e10cSrcweir 				pGrp->SetModel(GetModel());
1078*cdf0e10cSrcweir 				pRetval = ImpConvertAddText(pRetval, bBezier);
1079*cdf0e10cSrcweir 
1080*cdf0e10cSrcweir                 // convert all children
1081*cdf0e10cSrcweir                 if( pRetval )
1082*cdf0e10cSrcweir                 {
1083*cdf0e10cSrcweir                     SdrObject* pHalfDone = pRetval;
1084*cdf0e10cSrcweir                     pRetval = pHalfDone->DoConvertToPolyObj(bBezier);
1085*cdf0e10cSrcweir                     SdrObject::Free( pHalfDone ); // resulting object is newly created
1086*cdf0e10cSrcweir 
1087*cdf0e10cSrcweir                     if( pRetval )
1088*cdf0e10cSrcweir                     {
1089*cdf0e10cSrcweir                         // flatten subgroups. As we call
1090*cdf0e10cSrcweir                         // DoConvertToPolyObj() on the resulting group
1091*cdf0e10cSrcweir                         // objects, subgroups can exist (e.g. text is
1092*cdf0e10cSrcweir                         // a group object for every line).
1093*cdf0e10cSrcweir                         SdrObjList* pList = pRetval->GetSubList();
1094*cdf0e10cSrcweir                         if( pList )
1095*cdf0e10cSrcweir                             pList->FlattenGroups();
1096*cdf0e10cSrcweir                     }
1097*cdf0e10cSrcweir                 }
1098*cdf0e10cSrcweir 			}
1099*cdf0e10cSrcweir 			else
1100*cdf0e10cSrcweir 				delete pGrp;
1101*cdf0e10cSrcweir 			break;
1102*cdf0e10cSrcweir 		}
1103*cdf0e10cSrcweir 		case GRAPHIC_BITMAP:
1104*cdf0e10cSrcweir 		{
1105*cdf0e10cSrcweir 			// Grundobjekt kreieren und Fuellung ergaenzen
1106*cdf0e10cSrcweir 			pRetval = SdrRectObj::DoConvertToPolyObj(bBezier);
1107*cdf0e10cSrcweir 
1108*cdf0e10cSrcweir 			// Bitmap als Attribut retten
1109*cdf0e10cSrcweir 			if(pRetval)
1110*cdf0e10cSrcweir 			{
1111*cdf0e10cSrcweir 				// Bitmap als Fuellung holen
1112*cdf0e10cSrcweir 				SfxItemSet aSet(GetObjectItemSet());
1113*cdf0e10cSrcweir 
1114*cdf0e10cSrcweir 				aSet.Put(XFillStyleItem(XFILL_BITMAP));
1115*cdf0e10cSrcweir 				Bitmap aBitmap( GetTransformedGraphic().GetBitmap() );
1116*cdf0e10cSrcweir 				XOBitmap aXBmp(aBitmap, XBITMAP_STRETCH);
1117*cdf0e10cSrcweir 				aSet.Put(XFillBitmapItem(String(), aXBmp));
1118*cdf0e10cSrcweir 				aSet.Put(XFillBmpTileItem(sal_False));
1119*cdf0e10cSrcweir 
1120*cdf0e10cSrcweir 				pRetval->SetMergedItemSet(aSet);
1121*cdf0e10cSrcweir 			}
1122*cdf0e10cSrcweir 			break;
1123*cdf0e10cSrcweir 		}
1124*cdf0e10cSrcweir 		case GRAPHIC_NONE:
1125*cdf0e10cSrcweir 		case GRAPHIC_DEFAULT:
1126*cdf0e10cSrcweir 		{
1127*cdf0e10cSrcweir 			pRetval = SdrRectObj::DoConvertToPolyObj(bBezier);
1128*cdf0e10cSrcweir 			break;
1129*cdf0e10cSrcweir 		}
1130*cdf0e10cSrcweir 	}
1131*cdf0e10cSrcweir 
1132*cdf0e10cSrcweir 	return pRetval;
1133*cdf0e10cSrcweir }
1134*cdf0e10cSrcweir 
1135*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1136*cdf0e10cSrcweir 
1137*cdf0e10cSrcweir void SdrGrafObj::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
1138*cdf0e10cSrcweir {
1139*cdf0e10cSrcweir 	SetXPolyDirty();
1140*cdf0e10cSrcweir 	SdrRectObj::Notify( rBC, rHint );
1141*cdf0e10cSrcweir 	ImpSetAttrToGrafInfo();
1142*cdf0e10cSrcweir }
1143*cdf0e10cSrcweir 
1144*cdf0e10cSrcweir void SdrGrafObj::ImpSetAttrToGrafInfo()
1145*cdf0e10cSrcweir {
1146*cdf0e10cSrcweir 	const SfxItemSet& rSet = GetObjectItemSet();
1147*cdf0e10cSrcweir 	const sal_uInt16 nTrans = ( (SdrGrafTransparenceItem&) rSet.Get( SDRATTR_GRAFTRANSPARENCE ) ).GetValue();
1148*cdf0e10cSrcweir 	const SdrGrafCropItem&	rCrop = (const SdrGrafCropItem&) rSet.Get( SDRATTR_GRAFCROP );
1149*cdf0e10cSrcweir 
1150*cdf0e10cSrcweir 	aGrafInfo.SetLuminance( ( (SdrGrafLuminanceItem&) rSet.Get( SDRATTR_GRAFLUMINANCE ) ).GetValue() );
1151*cdf0e10cSrcweir 	aGrafInfo.SetContrast( ( (SdrGrafContrastItem&) rSet.Get( SDRATTR_GRAFCONTRAST ) ).GetValue() );
1152*cdf0e10cSrcweir 	aGrafInfo.SetChannelR( ( (SdrGrafRedItem&) rSet.Get( SDRATTR_GRAFRED ) ).GetValue() );
1153*cdf0e10cSrcweir 	aGrafInfo.SetChannelG( ( (SdrGrafGreenItem&) rSet.Get( SDRATTR_GRAFGREEN ) ).GetValue() );
1154*cdf0e10cSrcweir 	aGrafInfo.SetChannelB( ( (SdrGrafBlueItem&) rSet.Get( SDRATTR_GRAFBLUE ) ).GetValue() );
1155*cdf0e10cSrcweir 	aGrafInfo.SetGamma( ( (SdrGrafGamma100Item&) rSet.Get( SDRATTR_GRAFGAMMA ) ).GetValue() * 0.01 );
1156*cdf0e10cSrcweir 	aGrafInfo.SetTransparency( (sal_uInt8) FRound( Min( nTrans, (sal_uInt16) 100 )  * 2.55 ) );
1157*cdf0e10cSrcweir 	aGrafInfo.SetInvert( ( (SdrGrafInvertItem&) rSet.Get( SDRATTR_GRAFINVERT ) ).GetValue() );
1158*cdf0e10cSrcweir 	aGrafInfo.SetDrawMode( ( (SdrGrafModeItem&) rSet.Get( SDRATTR_GRAFMODE ) ).GetValue() );
1159*cdf0e10cSrcweir 	aGrafInfo.SetCrop( rCrop.GetLeft(), rCrop.GetTop(), rCrop.GetRight(), rCrop.GetBottom() );
1160*cdf0e10cSrcweir 
1161*cdf0e10cSrcweir 	SetXPolyDirty();
1162*cdf0e10cSrcweir 	SetRectsDirty();
1163*cdf0e10cSrcweir }
1164*cdf0e10cSrcweir 
1165*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1166*cdf0e10cSrcweir 
1167*cdf0e10cSrcweir void SdrGrafObj::ImpSetGrafInfoToAttr()
1168*cdf0e10cSrcweir {
1169*cdf0e10cSrcweir 	SetObjectItem( SdrGrafLuminanceItem( aGrafInfo.GetLuminance() ) );
1170*cdf0e10cSrcweir 	SetObjectItem( SdrGrafContrastItem( aGrafInfo.GetContrast() ) );
1171*cdf0e10cSrcweir 	SetObjectItem( SdrGrafRedItem( aGrafInfo.GetChannelR() ) );
1172*cdf0e10cSrcweir 	SetObjectItem( SdrGrafGreenItem( aGrafInfo.GetChannelG() ) );
1173*cdf0e10cSrcweir 	SetObjectItem( SdrGrafBlueItem( aGrafInfo.GetChannelB() ) );
1174*cdf0e10cSrcweir 	SetObjectItem( SdrGrafGamma100Item( FRound( aGrafInfo.GetGamma() * 100.0 ) ) );
1175*cdf0e10cSrcweir 	SetObjectItem( SdrGrafTransparenceItem( (sal_uInt16) FRound( aGrafInfo.GetTransparency() / 2.55 ) ) );
1176*cdf0e10cSrcweir 	SetObjectItem( SdrGrafInvertItem( aGrafInfo.IsInvert() ) );
1177*cdf0e10cSrcweir 	SetObjectItem( SdrGrafModeItem( aGrafInfo.GetDrawMode() ) );
1178*cdf0e10cSrcweir 	SetObjectItem( SdrGrafCropItem( aGrafInfo.GetLeftCrop(), aGrafInfo.GetTopCrop(), aGrafInfo.GetRightCrop(), aGrafInfo.GetBottomCrop() ) );
1179*cdf0e10cSrcweir }
1180*cdf0e10cSrcweir 
1181*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1182*cdf0e10cSrcweir 
1183*cdf0e10cSrcweir void SdrGrafObj::AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly )
1184*cdf0e10cSrcweir {
1185*cdf0e10cSrcweir 	Size aSize;
1186*cdf0e10cSrcweir 	Size aMaxSize( rMaxRect.GetSize() );
1187*cdf0e10cSrcweir 	if ( pGraphic->GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
1188*cdf0e10cSrcweir 		aSize = Application::GetDefaultDevice()->PixelToLogic( pGraphic->GetPrefSize(), MAP_100TH_MM );
1189*cdf0e10cSrcweir 	else
1190*cdf0e10cSrcweir 		aSize = OutputDevice::LogicToLogic( pGraphic->GetPrefSize(),
1191*cdf0e10cSrcweir 										    pGraphic->GetPrefMapMode(),
1192*cdf0e10cSrcweir 										    MapMode( MAP_100TH_MM ) );
1193*cdf0e10cSrcweir 
1194*cdf0e10cSrcweir 	if( aSize.Height() != 0 && aSize.Width() != 0 )
1195*cdf0e10cSrcweir 	{
1196*cdf0e10cSrcweir 		Point aPos( rMaxRect.TopLeft() );
1197*cdf0e10cSrcweir 
1198*cdf0e10cSrcweir 		// Falls Grafik zu gross, wird die Grafik
1199*cdf0e10cSrcweir 		// in die Seite eingepasst
1200*cdf0e10cSrcweir 		if ( (!bShrinkOnly                          ||
1201*cdf0e10cSrcweir 	    	 ( aSize.Height() > aMaxSize.Height() ) ||
1202*cdf0e10cSrcweir 		 	( aSize.Width()  > aMaxSize.Width()  ) )&&
1203*cdf0e10cSrcweir 		 	aSize.Height() && aMaxSize.Height() )
1204*cdf0e10cSrcweir 		{
1205*cdf0e10cSrcweir 			float fGrfWH =	(float)aSize.Width() /
1206*cdf0e10cSrcweir 							(float)aSize.Height();
1207*cdf0e10cSrcweir 			float fWinWH =	(float)aMaxSize.Width() /
1208*cdf0e10cSrcweir 							(float)aMaxSize.Height();
1209*cdf0e10cSrcweir 
1210*cdf0e10cSrcweir 			// Grafik an Pagesize anpassen (skaliert)
1211*cdf0e10cSrcweir 			if ( fGrfWH < fWinWH )
1212*cdf0e10cSrcweir 			{
1213*cdf0e10cSrcweir 				aSize.Width() = (long)(aMaxSize.Height() * fGrfWH);
1214*cdf0e10cSrcweir 				aSize.Height()= aMaxSize.Height();
1215*cdf0e10cSrcweir 			}
1216*cdf0e10cSrcweir 			else if ( fGrfWH > 0.F )
1217*cdf0e10cSrcweir 			{
1218*cdf0e10cSrcweir 				aSize.Width() = aMaxSize.Width();
1219*cdf0e10cSrcweir 				aSize.Height()= (long)(aMaxSize.Width() / fGrfWH);
1220*cdf0e10cSrcweir 			}
1221*cdf0e10cSrcweir 
1222*cdf0e10cSrcweir 			aPos = rMaxRect.Center();
1223*cdf0e10cSrcweir 		}
1224*cdf0e10cSrcweir 
1225*cdf0e10cSrcweir 		if( bShrinkOnly )
1226*cdf0e10cSrcweir 			aPos = aRect.TopLeft();
1227*cdf0e10cSrcweir 
1228*cdf0e10cSrcweir 		aPos.X() -= aSize.Width() / 2;
1229*cdf0e10cSrcweir 		aPos.Y() -= aSize.Height() / 2;
1230*cdf0e10cSrcweir 		SetLogicRect( Rectangle( aPos, aSize ) );
1231*cdf0e10cSrcweir 	}
1232*cdf0e10cSrcweir }
1233*cdf0e10cSrcweir 
1234*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1235*cdf0e10cSrcweir 
1236*cdf0e10cSrcweir IMPL_LINK( SdrGrafObj, ImpSwapHdl, GraphicObject*, pO )
1237*cdf0e10cSrcweir {
1238*cdf0e10cSrcweir 	SvStream* pRet = GRFMGR_AUTOSWAPSTREAM_NONE;
1239*cdf0e10cSrcweir 
1240*cdf0e10cSrcweir 	if( pO->IsInSwapOut() )
1241*cdf0e10cSrcweir 	{
1242*cdf0e10cSrcweir 		if( pModel && !mbIsPreview && pModel->IsSwapGraphics() && pGraphic->GetSizeBytes() > 20480 )
1243*cdf0e10cSrcweir 		{
1244*cdf0e10cSrcweir 			// test if this object is visualized from someone
1245*cdf0e10cSrcweir             // ## test only if there are VOCs other than the preview renderer
1246*cdf0e10cSrcweir 			if(!GetViewContact().HasViewObjectContacts(true))
1247*cdf0e10cSrcweir 			{
1248*cdf0e10cSrcweir 				const sal_uIntPtr	nSwapMode = pModel->GetSwapGraphicsMode();
1249*cdf0e10cSrcweir 
1250*cdf0e10cSrcweir 				if( ( pGraphic->HasUserData() || pGraphicLink ) &&
1251*cdf0e10cSrcweir 					( nSwapMode & SDR_SWAPGRAPHICSMODE_PURGE ) )
1252*cdf0e10cSrcweir 				{
1253*cdf0e10cSrcweir 					pRet = GRFMGR_AUTOSWAPSTREAM_LINK;
1254*cdf0e10cSrcweir 				}
1255*cdf0e10cSrcweir 				else if( nSwapMode & SDR_SWAPGRAPHICSMODE_TEMP )
1256*cdf0e10cSrcweir 				{
1257*cdf0e10cSrcweir 					pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1258*cdf0e10cSrcweir 					pGraphic->SetUserData();
1259*cdf0e10cSrcweir 				}
1260*cdf0e10cSrcweir 
1261*cdf0e10cSrcweir 				// #i102380#
1262*cdf0e10cSrcweir 				sdr::contact::ViewContactOfGraphic* pVC = dynamic_cast< sdr::contact::ViewContactOfGraphic* >(&GetViewContact());
1263*cdf0e10cSrcweir 
1264*cdf0e10cSrcweir 				if(pVC)
1265*cdf0e10cSrcweir 				{
1266*cdf0e10cSrcweir 					pVC->flushGraphicObjects();
1267*cdf0e10cSrcweir 				}
1268*cdf0e10cSrcweir 			}
1269*cdf0e10cSrcweir 		}
1270*cdf0e10cSrcweir 	}
1271*cdf0e10cSrcweir 	else if( pO->IsInSwapIn() )
1272*cdf0e10cSrcweir 	{
1273*cdf0e10cSrcweir 		// kann aus dem original Doc-Stream nachgeladen werden...
1274*cdf0e10cSrcweir 		if( pModel != NULL )
1275*cdf0e10cSrcweir 		{
1276*cdf0e10cSrcweir 			if( pGraphic->HasUserData() )
1277*cdf0e10cSrcweir 			{
1278*cdf0e10cSrcweir 				SdrDocumentStreamInfo aStreamInfo;
1279*cdf0e10cSrcweir 
1280*cdf0e10cSrcweir 				aStreamInfo.mbDeleteAfterUse = sal_False;
1281*cdf0e10cSrcweir 				aStreamInfo.maUserData = pGraphic->GetUserData();
1282*cdf0e10cSrcweir 
1283*cdf0e10cSrcweir 				SvStream* pStream = pModel->GetDocumentStream( aStreamInfo );
1284*cdf0e10cSrcweir 
1285*cdf0e10cSrcweir 				if( pStream != NULL )
1286*cdf0e10cSrcweir 				{
1287*cdf0e10cSrcweir 					Graphic aGraphic;
1288*cdf0e10cSrcweir 
1289*cdf0e10cSrcweir                     com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >* pFilterData = NULL;
1290*cdf0e10cSrcweir 
1291*cdf0e10cSrcweir 					if(mbInsidePaint && !GetViewContact().HasViewObjectContacts(true))
1292*cdf0e10cSrcweir                     {
1293*cdf0e10cSrcweir //							Rectangle aSnapRect(GetSnapRect());
1294*cdf0e10cSrcweir //							const Rectangle aSnapRectPixel(pOutDev->LogicToPixel(aSnapRect));
1295*cdf0e10cSrcweir 
1296*cdf0e10cSrcweir                         pFilterData = new com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >( 3 );
1297*cdf0e10cSrcweir 
1298*cdf0e10cSrcweir                         com::sun::star::awt::Size aPreviewSizeHint( 64, 64 );
1299*cdf0e10cSrcweir                         sal_Bool bAllowPartialStreamRead = sal_True;
1300*cdf0e10cSrcweir                         sal_Bool bCreateNativeLink = sal_False;
1301*cdf0e10cSrcweir                         (*pFilterData)[ 0 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "PreviewSizeHint" ) );
1302*cdf0e10cSrcweir                         (*pFilterData)[ 0 ].Value <<= aPreviewSizeHint;
1303*cdf0e10cSrcweir                         (*pFilterData)[ 1 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "AllowPartialStreamRead" ) );
1304*cdf0e10cSrcweir                         (*pFilterData)[ 1 ].Value <<= bAllowPartialStreamRead;
1305*cdf0e10cSrcweir                         (*pFilterData)[ 2 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "CreateNativeLink" ) );
1306*cdf0e10cSrcweir                         (*pFilterData)[ 2 ].Value <<= bCreateNativeLink;
1307*cdf0e10cSrcweir 
1308*cdf0e10cSrcweir                         mbIsPreview = sal_True;
1309*cdf0e10cSrcweir                     }
1310*cdf0e10cSrcweir 
1311*cdf0e10cSrcweir                     if( !GraphicFilter::GetGraphicFilter()->ImportGraphic( aGraphic, String(), *pStream,
1312*cdf0e10cSrcweir                                                         GRFILTER_FORMAT_DONTKNOW, NULL, 0, pFilterData ) )
1313*cdf0e10cSrcweir                     {
1314*cdf0e10cSrcweir                         const String aUserData( pGraphic->GetUserData() );
1315*cdf0e10cSrcweir 
1316*cdf0e10cSrcweir                         pGraphic->SetGraphic( aGraphic );
1317*cdf0e10cSrcweir                         pGraphic->SetUserData( aUserData );
1318*cdf0e10cSrcweir 
1319*cdf0e10cSrcweir                         // #142146# Graphic successfully swapped in.
1320*cdf0e10cSrcweir                         pRet = GRFMGR_AUTOSWAPSTREAM_LOADED;
1321*cdf0e10cSrcweir                     }
1322*cdf0e10cSrcweir                     delete pFilterData;
1323*cdf0e10cSrcweir 
1324*cdf0e10cSrcweir                     pStream->ResetError();
1325*cdf0e10cSrcweir 
1326*cdf0e10cSrcweir                     if( aStreamInfo.mbDeleteAfterUse || aStreamInfo.mxStorageRef.is() )
1327*cdf0e10cSrcweir                     {
1328*cdf0e10cSrcweir                         if ( aStreamInfo.mxStorageRef.is() )
1329*cdf0e10cSrcweir                         {
1330*cdf0e10cSrcweir                             aStreamInfo.mxStorageRef->dispose();
1331*cdf0e10cSrcweir                             aStreamInfo.mxStorageRef = 0;
1332*cdf0e10cSrcweir                         }
1333*cdf0e10cSrcweir 
1334*cdf0e10cSrcweir                         delete pStream;
1335*cdf0e10cSrcweir                     }
1336*cdf0e10cSrcweir                 }
1337*cdf0e10cSrcweir 			}
1338*cdf0e10cSrcweir 			else if( !ImpUpdateGraphicLink( sal_False ) )
1339*cdf0e10cSrcweir             {
1340*cdf0e10cSrcweir 				pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1341*cdf0e10cSrcweir             }
1342*cdf0e10cSrcweir 			else
1343*cdf0e10cSrcweir             {
1344*cdf0e10cSrcweir                 pRet = GRFMGR_AUTOSWAPSTREAM_LOADED;
1345*cdf0e10cSrcweir             }
1346*cdf0e10cSrcweir 		}
1347*cdf0e10cSrcweir 		else
1348*cdf0e10cSrcweir 			pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1349*cdf0e10cSrcweir 	}
1350*cdf0e10cSrcweir 
1351*cdf0e10cSrcweir 	return (long)(void*) pRet;
1352*cdf0e10cSrcweir }
1353*cdf0e10cSrcweir 
1354*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1355*cdf0e10cSrcweir 
1356*cdf0e10cSrcweir // #111096#
1357*cdf0e10cSrcweir // Access to GrafAnimationAllowed flag
1358*cdf0e10cSrcweir sal_Bool SdrGrafObj::IsGrafAnimationAllowed() const
1359*cdf0e10cSrcweir {
1360*cdf0e10cSrcweir 	return mbGrafAnimationAllowed;
1361*cdf0e10cSrcweir }
1362*cdf0e10cSrcweir 
1363*cdf0e10cSrcweir void SdrGrafObj::SetGrafAnimationAllowed(sal_Bool bNew)
1364*cdf0e10cSrcweir {
1365*cdf0e10cSrcweir 	if(mbGrafAnimationAllowed != bNew)
1366*cdf0e10cSrcweir 	{
1367*cdf0e10cSrcweir 		mbGrafAnimationAllowed = bNew;
1368*cdf0e10cSrcweir 		ActionChanged();
1369*cdf0e10cSrcweir 	}
1370*cdf0e10cSrcweir }
1371*cdf0e10cSrcweir 
1372*cdf0e10cSrcweir // #i25616#
1373*cdf0e10cSrcweir sal_Bool SdrGrafObj::IsObjectTransparent() const
1374*cdf0e10cSrcweir {
1375*cdf0e10cSrcweir 	if(((const SdrGrafTransparenceItem&)GetObjectItem(SDRATTR_GRAFTRANSPARENCE)).GetValue()
1376*cdf0e10cSrcweir 		|| pGraphic->IsTransparent())
1377*cdf0e10cSrcweir 	{
1378*cdf0e10cSrcweir 		return sal_True;
1379*cdf0e10cSrcweir 	}
1380*cdf0e10cSrcweir 
1381*cdf0e10cSrcweir 	return sal_False;
1382*cdf0e10cSrcweir }
1383*cdf0e10cSrcweir 
1384*cdf0e10cSrcweir Reference< XInputStream > SdrGrafObj::getInputStream()
1385*cdf0e10cSrcweir {
1386*cdf0e10cSrcweir 	Reference< XInputStream > xStream;
1387*cdf0e10cSrcweir 
1388*cdf0e10cSrcweir 	if( pModel )
1389*cdf0e10cSrcweir 	{
1390*cdf0e10cSrcweir //		if( !pGraphic->HasUserData() )
1391*cdf0e10cSrcweir //			pGraphic->SwapOut();
1392*cdf0e10cSrcweir 
1393*cdf0e10cSrcweir 		// kann aus dem original Doc-Stream nachgeladen werden...
1394*cdf0e10cSrcweir 		if( pGraphic->HasUserData() )
1395*cdf0e10cSrcweir 		{
1396*cdf0e10cSrcweir 			SdrDocumentStreamInfo aStreamInfo;
1397*cdf0e10cSrcweir 
1398*cdf0e10cSrcweir 			aStreamInfo.mbDeleteAfterUse = sal_False;
1399*cdf0e10cSrcweir 			aStreamInfo.maUserData = pGraphic->GetUserData();
1400*cdf0e10cSrcweir 
1401*cdf0e10cSrcweir 			SvStream* pStream = pModel->GetDocumentStream( aStreamInfo );
1402*cdf0e10cSrcweir 
1403*cdf0e10cSrcweir 			if( pStream )
1404*cdf0e10cSrcweir 				xStream.set( new utl::OInputStreamWrapper( pStream, sal_True ) );
1405*cdf0e10cSrcweir 		}
1406*cdf0e10cSrcweir 		else if( pGraphic && GetGraphic().IsLink() )
1407*cdf0e10cSrcweir 		{
1408*cdf0e10cSrcweir 			Graphic aGraphic( GetGraphic() );
1409*cdf0e10cSrcweir 			GfxLink aLink( aGraphic.GetLink() );
1410*cdf0e10cSrcweir 			sal_uInt32 nSize = aLink.GetDataSize();
1411*cdf0e10cSrcweir 			const void* pSourceData = (const void*)aLink.GetData();
1412*cdf0e10cSrcweir 			if( nSize && pSourceData )
1413*cdf0e10cSrcweir 			{
1414*cdf0e10cSrcweir 				sal_uInt8 * pBuffer = new sal_uInt8[ nSize ];
1415*cdf0e10cSrcweir 				if( pBuffer )
1416*cdf0e10cSrcweir 				{
1417*cdf0e10cSrcweir 					memcpy( pBuffer, pSourceData, nSize );
1418*cdf0e10cSrcweir 
1419*cdf0e10cSrcweir 					SvMemoryStream* pStream = new SvMemoryStream( (void*)pBuffer, (sal_Size)nSize, STREAM_READ );
1420*cdf0e10cSrcweir 					pStream->ObjectOwnsMemory( sal_True );
1421*cdf0e10cSrcweir 					xStream.set( new utl::OInputStreamWrapper( pStream, sal_True ) );
1422*cdf0e10cSrcweir 				}
1423*cdf0e10cSrcweir 			}
1424*cdf0e10cSrcweir 		}
1425*cdf0e10cSrcweir 
1426*cdf0e10cSrcweir 		if( !xStream.is() && aFileName.Len() )
1427*cdf0e10cSrcweir 		{
1428*cdf0e10cSrcweir 			SvFileStream* pStream = new SvFileStream( aFileName, STREAM_READ );
1429*cdf0e10cSrcweir 			if( pStream )
1430*cdf0e10cSrcweir 				xStream.set( new utl::OInputStreamWrapper( pStream ) );
1431*cdf0e10cSrcweir 		}
1432*cdf0e10cSrcweir 	}
1433*cdf0e10cSrcweir 
1434*cdf0e10cSrcweir 	return xStream;
1435*cdf0e10cSrcweir }
1436*cdf0e10cSrcweir 
1437*cdf0e10cSrcweir // eof
1438