xref: /AOO41X/main/svx/source/svdraw/svdograf.cxx (revision d2c409beaf08df1dde491549f4e6b7c145bff343)
1f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3f6e50924SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4f6e50924SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5f6e50924SAndrew Rist  * distributed with this work for additional information
6f6e50924SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7f6e50924SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8f6e50924SAndrew Rist  * "License"); you may not use this file except in compliance
9f6e50924SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11f6e50924SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13f6e50924SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14f6e50924SAndrew Rist  * software distributed under the License is distributed on an
15f6e50924SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16f6e50924SAndrew Rist  * KIND, either express or implied.  See the License for the
17f6e50924SAndrew Rist  * specific language governing permissions and limitations
18f6e50924SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20f6e50924SAndrew Rist  *************************************************************/
21f6e50924SAndrew Rist 
22f6e50924SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #define _ANIMATION
28cdf0e10cSrcweir #include <unotools/streamwrap.hxx>
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include <sfx2/lnkbase.hxx>
31cdf0e10cSrcweir #include <math.h>
32cdf0e10cSrcweir #include <vcl/salbtype.hxx>
33cdf0e10cSrcweir #include <sot/formats.hxx>
34cdf0e10cSrcweir #include <sot/storage.hxx>
35cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx>
36cdf0e10cSrcweir #include <unotools/localfilehelper.hxx>
37cdf0e10cSrcweir #include <svl/style.hxx>
38cdf0e10cSrcweir #include <svtools/filter.hxx>
39cdf0e10cSrcweir #include <svl/urihelper.hxx>
40cdf0e10cSrcweir #include <svtools/grfmgr.hxx>
41cdf0e10cSrcweir #include <vcl/svapp.hxx>
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #include <sfx2/linkmgr.hxx>
44cdf0e10cSrcweir #include <sfx2/docfile.hxx>
45cdf0e10cSrcweir #include <svx/svdetc.hxx>
46cdf0e10cSrcweir #include "svx/svdglob.hxx"
47cdf0e10cSrcweir #include "svx/svdstr.hrc"
48cdf0e10cSrcweir #include <svx/svdpool.hxx>
49cdf0e10cSrcweir #include <svx/svdmodel.hxx>
50cdf0e10cSrcweir #include <svx/svdpage.hxx>
51cdf0e10cSrcweir #include <svx/svdmrkv.hxx>
52cdf0e10cSrcweir #include <svx/svdpagv.hxx>
53cdf0e10cSrcweir #include "svx/svdviter.hxx"
54cdf0e10cSrcweir #include <svx/svdview.hxx>
55cdf0e10cSrcweir #include "svtools/filter.hxx"
56cdf0e10cSrcweir #include <svx/svdograf.hxx>
57cdf0e10cSrcweir #include <svx/svdogrp.hxx>
58cdf0e10cSrcweir #include <svx/xbtmpit.hxx>
59cdf0e10cSrcweir #include <svx/xflbmtit.hxx>
60cdf0e10cSrcweir #include <svx/svdundo.hxx>
61cdf0e10cSrcweir #include "svdfmtf.hxx"
62cdf0e10cSrcweir #include <svx/sdgcpitm.hxx>
63cdf0e10cSrcweir #include <editeng/eeitem.hxx>
64cdf0e10cSrcweir #include <svx/sdr/properties/graphicproperties.hxx>
65cdf0e10cSrcweir #include <svx/sdr/contact/viewcontactofgraphic.hxx>
66cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx>
67cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx>
68cdf0e10cSrcweir #include <osl/thread.hxx>
69cdf0e10cSrcweir #include <vos/mutex.hxx>
70172c67b2SArmin Le Grand #include <drawinglayer/processor2d/objectinfoextractor2d.hxx>
71172c67b2SArmin Le Grand #include <drawinglayer/primitive2d/objectinfoprimitive2d.hxx>
7288b53a7cSArmin Le Grand #include <unotools/cacheoptions.hxx>
73414a0e15SArmin Le Grand #include <basegfx/matrix/b2dhommatrixtools.hxx>
74cdf0e10cSrcweir 
75cdf0e10cSrcweir using namespace ::com::sun::star::uno;
76cdf0e10cSrcweir using namespace ::com::sun::star::io;
77cdf0e10cSrcweir 
78cdf0e10cSrcweir // -----------
79cdf0e10cSrcweir // - Defines -
80cdf0e10cSrcweir // -----------
81cdf0e10cSrcweir 
82cdf0e10cSrcweir #define GRAFSTREAMPOS_INVALID   0xffffffff
83cdf0e10cSrcweir #define SWAPGRAPHIC_TIMEOUT     5000
84cdf0e10cSrcweir 
8588b53a7cSArmin Le Grand // #122985# it is not correct to se the swap-timeout to a hard-coded 5000ms as it was before.
8688b53a7cSArmin Le Grand // Added code and experimented what to do as a good compromize, see description
8788b53a7cSArmin Le Grand sal_uInt32 getCacheTimeInMs()
8888b53a7cSArmin Le Grand {
8988b53a7cSArmin Le Grand     static bool bSetAtAll(true);
9088b53a7cSArmin Le Grand 
9188b53a7cSArmin Le Grand     if(bSetAtAll)
9288b53a7cSArmin Le Grand     {
9388b53a7cSArmin Le Grand         static bool bSetToPreferenceTime(true);
9488b53a7cSArmin Le Grand 
9588b53a7cSArmin Le Grand         if(bSetToPreferenceTime)
9688b53a7cSArmin Le Grand         {
9788b53a7cSArmin Le Grand             const SvtCacheOptions aCacheOptions;
9888b53a7cSArmin Le Grand             const sal_Int32 nSeconds(aCacheOptions.GetGraphicManagerObjectReleaseTime());
9988b53a7cSArmin Le Grand 
10088b53a7cSArmin Le Grand             // the default is 10 minutes. The minimum is one minute, thus 60 seconds. When the minimum
10188b53a7cSArmin Le Grand             // should match to the former hard-coded 5 seconds, we have a divisor of 12 to use. For the
10288b53a7cSArmin Le Grand             // default of 10 minutes this would mean 50 seconds. Compared to before this is ten times
10388b53a7cSArmin Le Grand             // more (would allow better navigation by switching through pages) and is controllable
10488b53a7cSArmin Le Grand             // by the user by setting the tools/options/memory/Remove_from_memory_after setting. Seems
10588b53a7cSArmin Le Grand             // to be a good compromize to me.
10688b53a7cSArmin Le Grand             return nSeconds * 1000 / 12;
10788b53a7cSArmin Le Grand         }
10888b53a7cSArmin Le Grand         else
10988b53a7cSArmin Le Grand         {
11088b53a7cSArmin Le Grand             return SWAPGRAPHIC_TIMEOUT;
11188b53a7cSArmin Le Grand         }
11288b53a7cSArmin Le Grand     }
11388b53a7cSArmin Le Grand 
11488b53a7cSArmin Le Grand     return 0;
11588b53a7cSArmin Le Grand }
116cdf0e10cSrcweir 
117cdf0e10cSrcweir // ------------------
118cdf0e10cSrcweir // - SdrGraphicLink	-
119cdf0e10cSrcweir // ------------------
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 
122e6693332SEike Rathke const Graphic ImpLoadLinkedGraphic( const String aFileName, const String aFilterName )
123cdf0e10cSrcweir {
124cdf0e10cSrcweir 	Graphic aGraphic;
125cdf0e10cSrcweir 
126e6693332SEike Rathke 	SfxMedium xMed( aFileName, STREAM_STD_READ, sal_True );
127cdf0e10cSrcweir 	xMed.DownLoad();
128cdf0e10cSrcweir 
129cdf0e10cSrcweir 	SvStream* pInStrm = xMed.GetInStream();
130cdf0e10cSrcweir 	if ( pInStrm )
131cdf0e10cSrcweir 	{
132cdf0e10cSrcweir 		pInStrm->Seek( STREAM_SEEK_TO_BEGIN );
133cdf0e10cSrcweir 		GraphicFilter* pGF = GraphicFilter::GetGraphicFilter();
134cdf0e10cSrcweir 
135e6693332SEike Rathke 		const sal_uInt16 nFilter = aFilterName.Len() && pGF->GetImportFormatCount()
136e6693332SEike Rathke 							? pGF->GetImportFormatNumber( aFilterName )
137cdf0e10cSrcweir 							: GRFILTER_FORMAT_DONTKNOW;
138cdf0e10cSrcweir 
139cdf0e10cSrcweir 		com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > aFilterData( 1 );
140cdf0e10cSrcweir 
141cdf0e10cSrcweir 		// Room for improvment:
142cdf0e10cSrcweir 		// As this is a linked graphic the GfxLink is not needed if saving/loading our own format.
143cdf0e10cSrcweir 		// But this link is required by some filters to access the native graphic (pdf export/ms export),
144cdf0e10cSrcweir 		// there we should create a new service to provide this data if needed
145cdf0e10cSrcweir 		aFilterData[ 0 ].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CreateNativeLink" ) );
146cdf0e10cSrcweir 		aFilterData[ 0 ].Value = Any( sal_True );
1473706bbdeSArmin Le Grand 
1483706bbdeSArmin Le Grand         // #123042# for e.g SVG the path is needed, so hand it over here. I have no real idea
1493706bbdeSArmin Le Grand         // what consequences this may have; maybe this is not handed over by purpose here. Not
1503706bbdeSArmin Le Grand         // handing it over means that any GraphicFormat that internallv needs a path as base
1513706bbdeSArmin Le Grand         // to interpret included links may fail.
1523706bbdeSArmin Le Grand         // Alternatively the path may be set at the result after this call when it is known
1533706bbdeSArmin Le Grand         // that it is a SVG graphic, but only because noone yet tried to interpret it.
1543706bbdeSArmin Le Grand         pGF->ImportGraphic( aGraphic, aFileName, *pInStrm, nFilter, NULL, 0, &aFilterData );
155cdf0e10cSrcweir 	}
156cdf0e10cSrcweir 	return aGraphic;
157cdf0e10cSrcweir }
158cdf0e10cSrcweir 
159cdf0e10cSrcweir class SdrGraphicUpdater;
160cdf0e10cSrcweir class SdrGraphicLink : public sfx2::SvBaseLink
161cdf0e10cSrcweir {
162cdf0e10cSrcweir 	SdrGrafObj*			pGrafObj;
163cdf0e10cSrcweir 	SdrGraphicUpdater*	pGraphicUpdater;
164cdf0e10cSrcweir 
165cdf0e10cSrcweir public:
166cdf0e10cSrcweir 						SdrGraphicLink(SdrGrafObj* pObj);
167cdf0e10cSrcweir 	virtual				~SdrGraphicLink();
168cdf0e10cSrcweir 
169cdf0e10cSrcweir 	virtual void		Closed();
170cdf0e10cSrcweir 	virtual void		DataChanged( const String& rMimeType,
171cdf0e10cSrcweir 								const ::com::sun::star::uno::Any & rValue );
172cdf0e10cSrcweir 	void				DataChanged( const Graphic& rGraphic );
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 	sal_Bool				Connect() { return 0 != GetRealObject(); }
175cdf0e10cSrcweir 	void				UpdateAsynchron();
176cdf0e10cSrcweir 	void				RemoveGraphicUpdater();
177cdf0e10cSrcweir };
178cdf0e10cSrcweir 
179cdf0e10cSrcweir class SdrGraphicUpdater : public ::osl::Thread
180cdf0e10cSrcweir {
181cdf0e10cSrcweir public:
182cdf0e10cSrcweir     SdrGraphicUpdater( const String& rFileName, const String& rFilterName, SdrGraphicLink& );
183cdf0e10cSrcweir     virtual ~SdrGraphicUpdater( void );
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 	void SAL_CALL Terminate( void );
186cdf0e10cSrcweir 
187e6693332SEike Rathke     sal_Bool GraphicLinkChanged( const String& rFileName ){ return maFileName != rFileName;	};
188cdf0e10cSrcweir 
189cdf0e10cSrcweir protected:
190cdf0e10cSrcweir 
191cdf0e10cSrcweir 	/**	is called from the inherited create method and acts as the
192cdf0e10cSrcweir 		main function of this thread.
193cdf0e10cSrcweir 	*/
194cdf0e10cSrcweir 	virtual void SAL_CALL run(void);
195cdf0e10cSrcweir 
196cdf0e10cSrcweir     /**	Called after the thread is terminated via the terminate
197cdf0e10cSrcweir     	method.  Used to kill the thread by calling delete on this.
198cdf0e10cSrcweir     */
199cdf0e10cSrcweir     virtual void SAL_CALL onTerminated(void);
200cdf0e10cSrcweir 
201cdf0e10cSrcweir private:
202cdf0e10cSrcweir 
203e6693332SEike Rathke     const String	maFileName;
204e6693332SEike Rathke 	const String	maFilterName;
205cdf0e10cSrcweir 	SdrGraphicLink& mrGraphicLink;
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 	volatile bool mbIsTerminated;
208cdf0e10cSrcweir };
209cdf0e10cSrcweir 
210cdf0e10cSrcweir SdrGraphicUpdater::SdrGraphicUpdater( const String& rFileName, const String& rFilterName, SdrGraphicLink& rGraphicLink )
211e6693332SEike Rathke : maFileName( rFileName )
212e6693332SEike Rathke , maFilterName( rFilterName )
213cdf0e10cSrcweir , mrGraphicLink( rGraphicLink )
214cdf0e10cSrcweir , mbIsTerminated( sal_False )
215cdf0e10cSrcweir {
216cdf0e10cSrcweir 	create();
217cdf0e10cSrcweir }
218cdf0e10cSrcweir 
219cdf0e10cSrcweir SdrGraphicUpdater::~SdrGraphicUpdater( void )
220cdf0e10cSrcweir {
221cdf0e10cSrcweir }
222cdf0e10cSrcweir 
223cdf0e10cSrcweir void SdrGraphicUpdater::Terminate()
224cdf0e10cSrcweir {
225cdf0e10cSrcweir     mbIsTerminated = sal_True;
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
228cdf0e10cSrcweir void SAL_CALL SdrGraphicUpdater::onTerminated(void)
229cdf0e10cSrcweir {
230cdf0e10cSrcweir 	delete this;
231cdf0e10cSrcweir }
232cdf0e10cSrcweir 
233cdf0e10cSrcweir void SAL_CALL SdrGraphicUpdater::run(void)
234cdf0e10cSrcweir {
235e6693332SEike Rathke 	Graphic aGraphic( ImpLoadLinkedGraphic( maFileName, maFilterName ) );
236cdf0e10cSrcweir 	vos::OGuard aSolarGuard( Application::GetSolarMutex() );
237cdf0e10cSrcweir 	if ( !mbIsTerminated )
238cdf0e10cSrcweir 	{
239cdf0e10cSrcweir 		mrGraphicLink.DataChanged( aGraphic );
240cdf0e10cSrcweir 		mrGraphicLink.RemoveGraphicUpdater();
241cdf0e10cSrcweir 	}
242cdf0e10cSrcweir }
243cdf0e10cSrcweir 
244cdf0e10cSrcweir // -----------------------------------------------------------------------------
245cdf0e10cSrcweir 
246cdf0e10cSrcweir SdrGraphicLink::SdrGraphicLink(SdrGrafObj* pObj)
247cdf0e10cSrcweir : ::sfx2::SvBaseLink( ::sfx2::LINKUPDATE_ONCALL, SOT_FORMATSTR_ID_SVXB )
248cdf0e10cSrcweir , pGrafObj( pObj )
249cdf0e10cSrcweir , pGraphicUpdater( NULL )
250cdf0e10cSrcweir {
251cdf0e10cSrcweir 	SetSynchron( sal_False );
252cdf0e10cSrcweir }
253cdf0e10cSrcweir 
254cdf0e10cSrcweir // -----------------------------------------------------------------------------
255cdf0e10cSrcweir 
256cdf0e10cSrcweir SdrGraphicLink::~SdrGraphicLink()
257cdf0e10cSrcweir {
258cdf0e10cSrcweir 	if ( pGraphicUpdater )
259cdf0e10cSrcweir 		pGraphicUpdater->Terminate();
260cdf0e10cSrcweir }
261cdf0e10cSrcweir 
262cdf0e10cSrcweir // -----------------------------------------------------------------------------
263cdf0e10cSrcweir 
264cdf0e10cSrcweir void SdrGraphicLink::DataChanged( const Graphic& rGraphic )
265cdf0e10cSrcweir {
266cdf0e10cSrcweir 	pGrafObj->ImpSetLinkedGraphic( rGraphic );
267cdf0e10cSrcweir }
268cdf0e10cSrcweir 
269cdf0e10cSrcweir // -----------------------------------------------------------------------------
270cdf0e10cSrcweir 
271cdf0e10cSrcweir void SdrGraphicLink::RemoveGraphicUpdater()
272cdf0e10cSrcweir {
273cdf0e10cSrcweir 	pGraphicUpdater = NULL;
274cdf0e10cSrcweir }
275cdf0e10cSrcweir 
276cdf0e10cSrcweir // -----------------------------------------------------------------------------
277cdf0e10cSrcweir 
278cdf0e10cSrcweir void SdrGraphicLink::DataChanged( const String& rMimeType,
279cdf0e10cSrcweir 								const ::com::sun::star::uno::Any & rValue )
280cdf0e10cSrcweir {
281cdf0e10cSrcweir 	SdrModel*       pModel      = pGrafObj ? pGrafObj->GetModel() : 0;
282cdf0e10cSrcweir 	sfx2::LinkManager* pLinkManager= pModel  ? pModel->GetLinkManager() : 0;
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 	if( pLinkManager && rValue.hasValue() )
285cdf0e10cSrcweir 	{
286cdf0e10cSrcweir 		pLinkManager->GetDisplayNames( this, 0, &pGrafObj->aFileName, 0, &pGrafObj->aFilterName );
287cdf0e10cSrcweir 
288cdf0e10cSrcweir 		Graphic aGraphic;
289cdf0e10cSrcweir 		if( sfx2::LinkManager::GetGraphicFromAny( rMimeType, rValue, aGraphic ))
290cdf0e10cSrcweir 		{
291cdf0e10cSrcweir    			pGrafObj->NbcSetGraphic( aGraphic );
292cdf0e10cSrcweir 			pGrafObj->ActionChanged();
293cdf0e10cSrcweir 		}
294cdf0e10cSrcweir 		else if( SotExchange::GetFormatIdFromMimeType( rMimeType ) != sfx2::LinkManager::RegisterStatusInfoId() )
295cdf0e10cSrcweir 		{
296cdf0e10cSrcweir 			// broadcasting, to update slidesorter
297cdf0e10cSrcweir 			pGrafObj->BroadcastObjectChange();
298cdf0e10cSrcweir 		}
299cdf0e10cSrcweir 	}
300cdf0e10cSrcweir }
301cdf0e10cSrcweir 
302cdf0e10cSrcweir // -----------------------------------------------------------------------------
303cdf0e10cSrcweir 
304cdf0e10cSrcweir void SdrGraphicLink::Closed()
305cdf0e10cSrcweir {
306cdf0e10cSrcweir 	// Die Verbindung wird aufgehoben; pLink des Objekts auf NULL setzen, da die Link-Instanz ja gerade destruiert wird.
307cdf0e10cSrcweir 	pGrafObj->ForceSwapIn();
308cdf0e10cSrcweir 	pGrafObj->pGraphicLink=NULL;
309cdf0e10cSrcweir 	pGrafObj->ReleaseGraphicLink();
310cdf0e10cSrcweir 	SvBaseLink::Closed();
311cdf0e10cSrcweir }
312cdf0e10cSrcweir 
313cdf0e10cSrcweir // -----------------------------------------------------------------------------
314cdf0e10cSrcweir 
315cdf0e10cSrcweir void SdrGraphicLink::UpdateAsynchron()
316cdf0e10cSrcweir {
317cdf0e10cSrcweir 	if( GetObj() )
318cdf0e10cSrcweir 	{
319cdf0e10cSrcweir 		if ( pGraphicUpdater )
320cdf0e10cSrcweir 		{
321cdf0e10cSrcweir 			if ( pGraphicUpdater->GraphicLinkChanged( pGrafObj->GetFileName() ) )
322cdf0e10cSrcweir 			{
323cdf0e10cSrcweir 				pGraphicUpdater->Terminate();
324cdf0e10cSrcweir 				pGraphicUpdater = new SdrGraphicUpdater( pGrafObj->GetFileName(), pGrafObj->GetFilterName(), *this );
325cdf0e10cSrcweir 			}
326cdf0e10cSrcweir 		}
327cdf0e10cSrcweir 		else
328cdf0e10cSrcweir 			pGraphicUpdater = new SdrGraphicUpdater( pGrafObj->GetFileName(), pGrafObj->GetFilterName(), *this );
329cdf0e10cSrcweir 	}
330cdf0e10cSrcweir }
331cdf0e10cSrcweir 
332cdf0e10cSrcweir // --------------
333cdf0e10cSrcweir // - SdrGrafObj -
334cdf0e10cSrcweir // --------------
335cdf0e10cSrcweir 
336cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
337cdf0e10cSrcweir // BaseProperties section
338cdf0e10cSrcweir 
339cdf0e10cSrcweir sdr::properties::BaseProperties* SdrGrafObj::CreateObjectSpecificProperties()
340cdf0e10cSrcweir {
341cdf0e10cSrcweir 	return new sdr::properties::GraphicProperties(*this);
342cdf0e10cSrcweir }
343cdf0e10cSrcweir 
344cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
345cdf0e10cSrcweir // DrawContact section
346cdf0e10cSrcweir 
347cdf0e10cSrcweir sdr::contact::ViewContact* SdrGrafObj::CreateObjectSpecificViewContact()
348cdf0e10cSrcweir {
349cdf0e10cSrcweir 	return new sdr::contact::ViewContactOfGraphic(*this);
350cdf0e10cSrcweir }
351cdf0e10cSrcweir 
352cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
353172c67b2SArmin Le Grand // check if SVG and if try to get ObjectInfoPrimitive2D and extract info
354172c67b2SArmin Le Grand 
355172c67b2SArmin Le Grand void SdrGrafObj::onGraphicChanged()
356172c67b2SArmin Le Grand {
357172c67b2SArmin Le Grand     String aName;
358172c67b2SArmin Le Grand     String aTitle;
359172c67b2SArmin Le Grand     String aDesc;
360172c67b2SArmin Le Grand 
361172c67b2SArmin Le Grand     if(pGraphic)
362172c67b2SArmin Le Grand     {
363172c67b2SArmin Le Grand         const SvgDataPtr& rSvgDataPtr = pGraphic->GetGraphic().getSvgData();
364172c67b2SArmin Le Grand 
365172c67b2SArmin Le Grand         if(rSvgDataPtr.get())
366172c67b2SArmin Le Grand         {
367172c67b2SArmin Le Grand             const drawinglayer::primitive2d::Primitive2DSequence aSequence(rSvgDataPtr->getPrimitive2DSequence());
368172c67b2SArmin Le Grand 
369172c67b2SArmin Le Grand             if(aSequence.hasElements())
370172c67b2SArmin Le Grand             {
371172c67b2SArmin Le Grand                 drawinglayer::geometry::ViewInformation2D aViewInformation2D;
372172c67b2SArmin Le Grand                 drawinglayer::processor2d::ObjectInfoPrimitiveExtractor2D aProcessor(aViewInformation2D);
373172c67b2SArmin Le Grand 
374172c67b2SArmin Le Grand                 aProcessor.process(aSequence);
375172c67b2SArmin Le Grand 
376172c67b2SArmin Le Grand                 const drawinglayer::primitive2d::ObjectInfoPrimitive2D* pResult = aProcessor.getResult();
377172c67b2SArmin Le Grand 
378172c67b2SArmin Le Grand                 if(pResult)
379172c67b2SArmin Le Grand                 {
380172c67b2SArmin Le Grand                     aName = pResult->getName();
381172c67b2SArmin Le Grand 			        aTitle = pResult->getTitle();
382172c67b2SArmin Le Grand 			        aDesc = pResult->getDesc();
383172c67b2SArmin Le Grand                 }
384172c67b2SArmin Le Grand             }
385172c67b2SArmin Le Grand         }
386172c67b2SArmin Le Grand     }
387172c67b2SArmin Le Grand 
388172c67b2SArmin Le Grand     if(aName.Len())
389172c67b2SArmin Le Grand     {
390172c67b2SArmin Le Grand         SetName(aName);
391172c67b2SArmin Le Grand     }
392172c67b2SArmin Le Grand 
393172c67b2SArmin Le Grand     if(aTitle.Len())
394172c67b2SArmin Le Grand     {
395172c67b2SArmin Le Grand     	SetTitle(aTitle);
396172c67b2SArmin Le Grand     }
397172c67b2SArmin Le Grand 
398172c67b2SArmin Le Grand     if(aDesc.Len())
399172c67b2SArmin Le Grand     {
400172c67b2SArmin Le Grand     	SetDescription(aDesc);
401172c67b2SArmin Le Grand     }
402172c67b2SArmin Le Grand }
403172c67b2SArmin Le Grand 
404172c67b2SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
405cdf0e10cSrcweir 
406cdf0e10cSrcweir TYPEINIT1(SdrGrafObj,SdrRectObj);
407cdf0e10cSrcweir 
408cdf0e10cSrcweir // -----------------------------------------------------------------------------
409cdf0e10cSrcweir 
410cdf0e10cSrcweir SdrGrafObj::SdrGrafObj()
411cdf0e10cSrcweir :	SdrRectObj(),
412cdf0e10cSrcweir 	pGraphicLink	( NULL ),
413cdf0e10cSrcweir 	bMirrored		( sal_False )
414cdf0e10cSrcweir {
415cdf0e10cSrcweir 	pGraphic = new GraphicObject;
416ddde725dSArmin Le Grand     mpReplacementGraphic = 0;
41788b53a7cSArmin Le Grand 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), getCacheTimeInMs() );
418172c67b2SArmin Le Grand     onGraphicChanged();
419a5258243SPedro Giffuni 
420a5258243SPedro Giffuni     // #i118485# Shear allowed and possible now
421a5258243SPedro Giffuni     bNoShear = false;
422cdf0e10cSrcweir 
423cdf0e10cSrcweir 	// #111096#
424cdf0e10cSrcweir 	mbGrafAnimationAllowed = sal_True;
425cdf0e10cSrcweir 
426cdf0e10cSrcweir 	// #i25616#
427cdf0e10cSrcweir 	mbLineIsOutsideGeometry = sal_True;
428cdf0e10cSrcweir 	mbInsidePaint = sal_False;
429cdf0e10cSrcweir 	mbIsPreview = sal_False;
430cdf0e10cSrcweir 
431cdf0e10cSrcweir 	// #i25616#
432cdf0e10cSrcweir 	mbSupportTextIndentingOnLineWidthChange = sal_False;
433cdf0e10cSrcweir }
434cdf0e10cSrcweir 
435cdf0e10cSrcweir // -----------------------------------------------------------------------------
436cdf0e10cSrcweir 
437cdf0e10cSrcweir SdrGrafObj::SdrGrafObj(const Graphic& rGrf, const Rectangle& rRect)
438cdf0e10cSrcweir :	SdrRectObj		( rRect ),
439cdf0e10cSrcweir 	pGraphicLink	( NULL ),
440cdf0e10cSrcweir 	bMirrored		( sal_False )
441cdf0e10cSrcweir {
442cdf0e10cSrcweir 	pGraphic = new GraphicObject( rGrf );
443ddde725dSArmin Le Grand     mpReplacementGraphic = 0;
44488b53a7cSArmin Le Grand 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), getCacheTimeInMs() );
445172c67b2SArmin Le Grand     onGraphicChanged();
446a5258243SPedro Giffuni 
447a5258243SPedro Giffuni     // #i118485# Shear allowed and possible now
448a5258243SPedro Giffuni     bNoShear = false;
449cdf0e10cSrcweir 
450cdf0e10cSrcweir 	// #111096#
451cdf0e10cSrcweir 	mbGrafAnimationAllowed = sal_True;
452cdf0e10cSrcweir 
453cdf0e10cSrcweir 	// #i25616#
454cdf0e10cSrcweir 	mbLineIsOutsideGeometry = sal_True;
455cdf0e10cSrcweir 	mbInsidePaint = sal_False;
456cdf0e10cSrcweir 	mbIsPreview	= sal_False;
457cdf0e10cSrcweir 
458cdf0e10cSrcweir 	// #i25616#
459cdf0e10cSrcweir 	mbSupportTextIndentingOnLineWidthChange = sal_False;
460cdf0e10cSrcweir }
461cdf0e10cSrcweir 
462cdf0e10cSrcweir // -----------------------------------------------------------------------------
463cdf0e10cSrcweir 
464cdf0e10cSrcweir SdrGrafObj::SdrGrafObj( const Graphic& rGrf )
465cdf0e10cSrcweir :	SdrRectObj(),
466cdf0e10cSrcweir 	pGraphicLink	( NULL ),
467cdf0e10cSrcweir 	bMirrored		( sal_False )
468cdf0e10cSrcweir {
469cdf0e10cSrcweir 	pGraphic = new GraphicObject( rGrf );
470ddde725dSArmin Le Grand     mpReplacementGraphic = 0;
47188b53a7cSArmin Le Grand 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), getCacheTimeInMs() );
472172c67b2SArmin Le Grand     onGraphicChanged();
473a5258243SPedro Giffuni 
474a5258243SPedro Giffuni     // #i118485# Shear allowed and possible now
475a5258243SPedro Giffuni     bNoShear = false;
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 	// #111096#
478cdf0e10cSrcweir 	mbGrafAnimationAllowed = sal_True;
479cdf0e10cSrcweir 
480cdf0e10cSrcweir 	// #i25616#
481cdf0e10cSrcweir 	mbLineIsOutsideGeometry = sal_True;
482cdf0e10cSrcweir 	mbInsidePaint = sal_False;
483cdf0e10cSrcweir 	mbIsPreview	= sal_False;
484cdf0e10cSrcweir 
485cdf0e10cSrcweir 	// #i25616#
486cdf0e10cSrcweir 	mbSupportTextIndentingOnLineWidthChange = sal_False;
487cdf0e10cSrcweir }
488cdf0e10cSrcweir 
489cdf0e10cSrcweir // -----------------------------------------------------------------------------
490cdf0e10cSrcweir 
491cdf0e10cSrcweir SdrGrafObj::~SdrGrafObj()
492cdf0e10cSrcweir {
493cdf0e10cSrcweir 	delete pGraphic;
494ddde725dSArmin Le Grand     delete mpReplacementGraphic;
495cdf0e10cSrcweir 	ImpLinkAbmeldung();
496cdf0e10cSrcweir }
497cdf0e10cSrcweir 
498cdf0e10cSrcweir // -----------------------------------------------------------------------------
499cdf0e10cSrcweir 
500cdf0e10cSrcweir void SdrGrafObj::SetGraphicObject( const GraphicObject& rGrfObj )
501cdf0e10cSrcweir {
502cdf0e10cSrcweir 	*pGraphic = rGrfObj;
503ddde725dSArmin Le Grand     delete mpReplacementGraphic;
504ddde725dSArmin Le Grand     mpReplacementGraphic = 0;
50588b53a7cSArmin Le Grand 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), getCacheTimeInMs() );
506cdf0e10cSrcweir 	pGraphic->SetUserData();
507cdf0e10cSrcweir 	mbIsPreview = sal_False;
508cdf0e10cSrcweir 	SetChanged();
509cdf0e10cSrcweir 	BroadcastObjectChange();
510172c67b2SArmin Le Grand     onGraphicChanged();
511cdf0e10cSrcweir }
512cdf0e10cSrcweir 
513cdf0e10cSrcweir // -----------------------------------------------------------------------------
514cdf0e10cSrcweir 
515cdf0e10cSrcweir const GraphicObject& SdrGrafObj::GetGraphicObject(bool bForceSwapIn) const
516cdf0e10cSrcweir {
517cdf0e10cSrcweir 	if(bForceSwapIn)
518cdf0e10cSrcweir 	{
519cdf0e10cSrcweir 		ForceSwapIn();
520cdf0e10cSrcweir 	}
521cdf0e10cSrcweir 
522cdf0e10cSrcweir 	return *pGraphic;
523cdf0e10cSrcweir }
524cdf0e10cSrcweir 
525ddde725dSArmin Le Grand const GraphicObject* SdrGrafObj::GetReplacementGraphicObject() const
526ddde725dSArmin Le Grand {
527ddde725dSArmin Le Grand     if(!mpReplacementGraphic && pGraphic)
528ddde725dSArmin Le Grand     {
529ddde725dSArmin Le Grand         const SvgDataPtr& rSvgDataPtr = pGraphic->GetGraphic().getSvgData();
530ddde725dSArmin Le Grand 
531ddde725dSArmin Le Grand         if(rSvgDataPtr.get())
532ddde725dSArmin Le Grand         {
533ddde725dSArmin Le Grand             const_cast< SdrGrafObj* >(this)->mpReplacementGraphic = new GraphicObject(rSvgDataPtr->getReplacement());
534ddde725dSArmin Le Grand         }
535ddde725dSArmin Le Grand     }
536ddde725dSArmin Le Grand 
537ddde725dSArmin Le Grand     return mpReplacementGraphic;
538ddde725dSArmin Le Grand }
539ddde725dSArmin Le Grand 
540cdf0e10cSrcweir // -----------------------------------------------------------------------------
541cdf0e10cSrcweir 
542cdf0e10cSrcweir void SdrGrafObj::NbcSetGraphic( const Graphic& rGrf )
543cdf0e10cSrcweir {
544cdf0e10cSrcweir 	pGraphic->SetGraphic( rGrf );
545ddde725dSArmin Le Grand     delete mpReplacementGraphic;
546ddde725dSArmin Le Grand     mpReplacementGraphic = 0;
547cdf0e10cSrcweir 	pGraphic->SetUserData();
548cdf0e10cSrcweir 	mbIsPreview = sal_False;
549172c67b2SArmin Le Grand     onGraphicChanged();
550cdf0e10cSrcweir }
551cdf0e10cSrcweir 
552cdf0e10cSrcweir void SdrGrafObj::SetGraphic( const Graphic& rGrf )
553cdf0e10cSrcweir {
554cdf0e10cSrcweir     NbcSetGraphic(rGrf);
555cdf0e10cSrcweir 	SetChanged();
556cdf0e10cSrcweir 	BroadcastObjectChange();
557cdf0e10cSrcweir }
558cdf0e10cSrcweir 
559cdf0e10cSrcweir // -----------------------------------------------------------------------------
560cdf0e10cSrcweir 
561cdf0e10cSrcweir const Graphic& SdrGrafObj::GetGraphic() const
562cdf0e10cSrcweir {
563cdf0e10cSrcweir 	ForceSwapIn();
564cdf0e10cSrcweir 	return pGraphic->GetGraphic();
565cdf0e10cSrcweir }
566cdf0e10cSrcweir 
567cdf0e10cSrcweir // -----------------------------------------------------------------------------
568cdf0e10cSrcweir 
569cdf0e10cSrcweir Graphic SdrGrafObj::GetTransformedGraphic( sal_uIntPtr nTransformFlags ) const
570cdf0e10cSrcweir {
571cdf0e10cSrcweir     // #107947# Refactored most of the code to GraphicObject, where
572cdf0e10cSrcweir     // everybody can use e.g. the cropping functionality
573cdf0e10cSrcweir 
574cdf0e10cSrcweir 	GraphicType	    eType = GetGraphicType();
575cdf0e10cSrcweir     MapMode   		aDestMap( pModel->GetScaleUnit(), Point(), pModel->GetScaleFraction(), pModel->GetScaleFraction() );
576cdf0e10cSrcweir     const Size      aDestSize( GetLogicRect().GetSize() );
577cdf0e10cSrcweir     const sal_Bool      bMirror = ( nTransformFlags & SDRGRAFOBJ_TRANSFORMATTR_MIRROR ) != 0;
578cdf0e10cSrcweir     const sal_Bool      bRotate = ( ( nTransformFlags & SDRGRAFOBJ_TRANSFORMATTR_ROTATE ) != 0 ) &&
579cdf0e10cSrcweir         ( aGeo.nDrehWink && aGeo.nDrehWink != 18000 ) && ( GRAPHIC_NONE != eType );
580cdf0e10cSrcweir 
581cdf0e10cSrcweir     // #104115# Need cropping info earlier
582cdf0e10cSrcweir     ( (SdrGrafObj*) this )->ImpSetAttrToGrafInfo();
583cdf0e10cSrcweir     GraphicAttr aActAttr;
584cdf0e10cSrcweir 
585cdf0e10cSrcweir 	if( SDRGRAFOBJ_TRANSFORMATTR_NONE != nTransformFlags &&
586cdf0e10cSrcweir         GRAPHIC_NONE != eType )
587cdf0e10cSrcweir 	{
588cdf0e10cSrcweir         // actually transform the graphic only in this case. On the
589cdf0e10cSrcweir         // other hand, cropping will always happen
590cdf0e10cSrcweir         aActAttr = aGrafInfo;
591cdf0e10cSrcweir 
592cdf0e10cSrcweir         if( bMirror )
593cdf0e10cSrcweir 		{
594cdf0e10cSrcweir 			sal_uInt16		nMirrorCase = ( aGeo.nDrehWink == 18000 ) ? ( bMirrored ? 3 : 4 ) : ( bMirrored ? 2 : 1 );
595cdf0e10cSrcweir 			FASTBOOL	bHMirr = nMirrorCase == 2 || nMirrorCase == 4;
596cdf0e10cSrcweir 			FASTBOOL	bVMirr = nMirrorCase == 3 || nMirrorCase == 4;
597cdf0e10cSrcweir 
598cdf0e10cSrcweir 			aActAttr.SetMirrorFlags( ( bHMirr ? BMP_MIRROR_HORZ : 0 ) | ( bVMirr ? BMP_MIRROR_VERT : 0 ) );
599cdf0e10cSrcweir 		}
600cdf0e10cSrcweir 
601cdf0e10cSrcweir 		if( bRotate )
602cdf0e10cSrcweir 			aActAttr.SetRotation( sal_uInt16(aGeo.nDrehWink / 10) );
603cdf0e10cSrcweir 	}
604cdf0e10cSrcweir 
605cdf0e10cSrcweir     // #107947# Delegate to moved code in GraphicObject
606cdf0e10cSrcweir     return GetGraphicObject().GetTransformedGraphic( aDestSize, aDestMap, aActAttr );
607cdf0e10cSrcweir }
608cdf0e10cSrcweir 
609cdf0e10cSrcweir // -----------------------------------------------------------------------------
610cdf0e10cSrcweir 
611cdf0e10cSrcweir GraphicType SdrGrafObj::GetGraphicType() const
612cdf0e10cSrcweir {
613cdf0e10cSrcweir 	return pGraphic->GetType();
614cdf0e10cSrcweir }
615cdf0e10cSrcweir 
616cdf0e10cSrcweir sal_Bool SdrGrafObj::IsAnimated() const
617cdf0e10cSrcweir {
618cdf0e10cSrcweir 	return pGraphic->IsAnimated();
619cdf0e10cSrcweir }
620cdf0e10cSrcweir 
621cdf0e10cSrcweir sal_Bool SdrGrafObj::IsEPS() const
622cdf0e10cSrcweir {
623cdf0e10cSrcweir 	return pGraphic->IsEPS();
624cdf0e10cSrcweir }
625cdf0e10cSrcweir 
626cdf0e10cSrcweir sal_Bool SdrGrafObj::IsSwappedOut() const
627cdf0e10cSrcweir {
628cdf0e10cSrcweir 	return mbIsPreview ? sal_True : pGraphic->IsSwappedOut();
629cdf0e10cSrcweir }
630cdf0e10cSrcweir 
631cdf0e10cSrcweir const MapMode& SdrGrafObj::GetGrafPrefMapMode() const
632cdf0e10cSrcweir {
633cdf0e10cSrcweir 	return pGraphic->GetPrefMapMode();
634cdf0e10cSrcweir }
635cdf0e10cSrcweir 
636cdf0e10cSrcweir const Size& SdrGrafObj::GetGrafPrefSize() const
637cdf0e10cSrcweir {
638cdf0e10cSrcweir 	return pGraphic->GetPrefSize();
639cdf0e10cSrcweir }
640cdf0e10cSrcweir 
641cdf0e10cSrcweir // -----------------------------------------------------------------------------
642cdf0e10cSrcweir 
643cdf0e10cSrcweir void SdrGrafObj::SetGrafStreamURL( const String& rGraphicStreamURL )
644cdf0e10cSrcweir {
645cdf0e10cSrcweir 	mbIsPreview = sal_False;
646cdf0e10cSrcweir 	if( !rGraphicStreamURL.Len() )
647cdf0e10cSrcweir 	{
648cdf0e10cSrcweir 		pGraphic->SetUserData();
649cdf0e10cSrcweir 	}
650cdf0e10cSrcweir 	else if( pModel->IsSwapGraphics() )
651cdf0e10cSrcweir 	{
652cdf0e10cSrcweir 		pGraphic->SetUserData( rGraphicStreamURL );
653cdf0e10cSrcweir 
654cdf0e10cSrcweir 		// set state of graphic object to 'swapped out'
655cdf0e10cSrcweir 		if( pGraphic->GetType() == GRAPHIC_NONE )
656cdf0e10cSrcweir 			pGraphic->SetSwapState();
657cdf0e10cSrcweir 	}
658cdf0e10cSrcweir }
659cdf0e10cSrcweir 
660cdf0e10cSrcweir // -----------------------------------------------------------------------------
661cdf0e10cSrcweir 
662cdf0e10cSrcweir String SdrGrafObj::GetGrafStreamURL() const
663cdf0e10cSrcweir {
664cdf0e10cSrcweir 	return pGraphic->GetUserData();
665cdf0e10cSrcweir }
666cdf0e10cSrcweir 
667cdf0e10cSrcweir // -----------------------------------------------------------------------------
668cdf0e10cSrcweir 
669cdf0e10cSrcweir void SdrGrafObj::SetFileName(const String& rFileName)
670cdf0e10cSrcweir {
671cdf0e10cSrcweir 	aFileName = rFileName;
672cdf0e10cSrcweir 	SetChanged();
673cdf0e10cSrcweir }
674cdf0e10cSrcweir 
675cdf0e10cSrcweir // -----------------------------------------------------------------------------
676cdf0e10cSrcweir 
677cdf0e10cSrcweir void SdrGrafObj::SetFilterName(const String& rFilterName)
678cdf0e10cSrcweir {
679cdf0e10cSrcweir 	aFilterName = rFilterName;
680cdf0e10cSrcweir 	SetChanged();
681cdf0e10cSrcweir }
682cdf0e10cSrcweir 
683cdf0e10cSrcweir // -----------------------------------------------------------------------------
684cdf0e10cSrcweir 
685cdf0e10cSrcweir void SdrGrafObj::ForceSwapIn() const
686cdf0e10cSrcweir {
687cdf0e10cSrcweir 	if( mbIsPreview )
688cdf0e10cSrcweir 	{
689cdf0e10cSrcweir 		// removing preview graphic
690cdf0e10cSrcweir 		const String aUserData( pGraphic->GetUserData() );
691cdf0e10cSrcweir 
692cdf0e10cSrcweir 		Graphic aEmpty;
693cdf0e10cSrcweir 		pGraphic->SetGraphic( aEmpty );
694cdf0e10cSrcweir 		pGraphic->SetUserData( aUserData );
695cdf0e10cSrcweir 		pGraphic->SetSwapState();
696cdf0e10cSrcweir 
697cdf0e10cSrcweir 		const_cast< SdrGrafObj* >( this )->mbIsPreview = sal_False;
698cdf0e10cSrcweir 	}
699cdf0e10cSrcweir 	if ( pGraphicLink && pGraphic->IsSwappedOut() )
700cdf0e10cSrcweir 		ImpUpdateGraphicLink( sal_False );
701cdf0e10cSrcweir 	else
702cdf0e10cSrcweir 		pGraphic->FireSwapInRequest();
703cdf0e10cSrcweir 
704cdf0e10cSrcweir 	if( pGraphic->IsSwappedOut() ||
705cdf0e10cSrcweir 	    ( pGraphic->GetType() == GRAPHIC_NONE ) ||
706cdf0e10cSrcweir 		( pGraphic->GetType() == GRAPHIC_DEFAULT ) )
707cdf0e10cSrcweir 	{
708cdf0e10cSrcweir 		Graphic aDefaultGraphic;
709cdf0e10cSrcweir 		aDefaultGraphic.SetDefaultType();
710cdf0e10cSrcweir 		pGraphic->SetGraphic( aDefaultGraphic );
711cdf0e10cSrcweir 	}
712cdf0e10cSrcweir }
713cdf0e10cSrcweir 
714cdf0e10cSrcweir // -----------------------------------------------------------------------------
715cdf0e10cSrcweir 
716cdf0e10cSrcweir void SdrGrafObj::ForceSwapOut() const
717cdf0e10cSrcweir {
718cdf0e10cSrcweir 	pGraphic->FireSwapOutRequest();
719cdf0e10cSrcweir }
720cdf0e10cSrcweir 
721cdf0e10cSrcweir // -----------------------------------------------------------------------------
722cdf0e10cSrcweir 
723cdf0e10cSrcweir void SdrGrafObj::ImpLinkAnmeldung()
724cdf0e10cSrcweir {
725cdf0e10cSrcweir 	sfx2::LinkManager* pLinkManager = pModel != NULL ? pModel->GetLinkManager() : NULL;
726cdf0e10cSrcweir 
727cdf0e10cSrcweir 	if( pLinkManager != NULL && pGraphicLink == NULL )
728cdf0e10cSrcweir 	{
729cdf0e10cSrcweir 		if( aFileName.Len() )
730cdf0e10cSrcweir 		{
731cdf0e10cSrcweir 			pGraphicLink = new SdrGraphicLink( this );
732cdf0e10cSrcweir 			pLinkManager->InsertFileLink( *pGraphicLink, OBJECT_CLIENT_GRF, aFileName, ( aFilterName.Len() ? &aFilterName : NULL ), NULL );
733cdf0e10cSrcweir 			pGraphicLink->Connect();
734cdf0e10cSrcweir 		}
735cdf0e10cSrcweir 	}
736cdf0e10cSrcweir }
737cdf0e10cSrcweir 
738cdf0e10cSrcweir // -----------------------------------------------------------------------------
739cdf0e10cSrcweir 
740cdf0e10cSrcweir void SdrGrafObj::ImpLinkAbmeldung()
741cdf0e10cSrcweir {
742cdf0e10cSrcweir 	sfx2::LinkManager* pLinkManager = pModel != NULL ? pModel->GetLinkManager() : NULL;
743cdf0e10cSrcweir 
744cdf0e10cSrcweir 	if( pLinkManager != NULL && pGraphicLink!=NULL)
745cdf0e10cSrcweir 	{
746cdf0e10cSrcweir 		// Bei Remove wird *pGraphicLink implizit deleted
747cdf0e10cSrcweir 		pLinkManager->Remove( pGraphicLink );
748cdf0e10cSrcweir 		pGraphicLink=NULL;
749cdf0e10cSrcweir 	}
750cdf0e10cSrcweir }
751cdf0e10cSrcweir 
752cdf0e10cSrcweir // -----------------------------------------------------------------------------
753cdf0e10cSrcweir 
754cdf0e10cSrcweir void SdrGrafObj::SetGraphicLink( const String& rFileName, const String& rFilterName )
755cdf0e10cSrcweir {
756cdf0e10cSrcweir 	ImpLinkAbmeldung();
757cdf0e10cSrcweir 	aFileName = rFileName;
758cdf0e10cSrcweir 	aFilterName = rFilterName;
759cdf0e10cSrcweir 	ImpLinkAnmeldung();
760cdf0e10cSrcweir 	pGraphic->SetUserData();
761cdf0e10cSrcweir 
762cdf0e10cSrcweir     // #92205# A linked graphic is per definition swapped out (has to be loaded)
763cdf0e10cSrcweir     pGraphic->SetSwapState();
764cdf0e10cSrcweir }
765cdf0e10cSrcweir 
766cdf0e10cSrcweir // -----------------------------------------------------------------------------
767cdf0e10cSrcweir 
768cdf0e10cSrcweir void SdrGrafObj::ReleaseGraphicLink()
769cdf0e10cSrcweir {
770cdf0e10cSrcweir 	ImpLinkAbmeldung();
771cdf0e10cSrcweir 	aFileName = String();
772cdf0e10cSrcweir 	aFilterName = String();
773cdf0e10cSrcweir }
774cdf0e10cSrcweir 
775cdf0e10cSrcweir // -----------------------------------------------------------------------------
776cdf0e10cSrcweir 
777cdf0e10cSrcweir void SdrGrafObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
778cdf0e10cSrcweir {
779cdf0e10cSrcweir 	FASTBOOL bNoPresGrf = ( pGraphic->GetType() != GRAPHIC_NONE ) && !bEmptyPresObj;
780cdf0e10cSrcweir 
781cdf0e10cSrcweir 	rInfo.bResizeFreeAllowed = aGeo.nDrehWink % 9000 == 0 ||
782cdf0e10cSrcweir 							   aGeo.nDrehWink % 18000 == 0 ||
783cdf0e10cSrcweir 							   aGeo.nDrehWink % 27000 == 0;
784cdf0e10cSrcweir 
785cdf0e10cSrcweir 	rInfo.bResizePropAllowed = sal_True;
7865f27b83cSArmin Le Grand 	rInfo.bRotateFreeAllowed = bNoPresGrf;
7875f27b83cSArmin Le Grand 	rInfo.bRotate90Allowed = bNoPresGrf;
7885f27b83cSArmin Le Grand 	rInfo.bMirrorFreeAllowed = bNoPresGrf;
7895f27b83cSArmin Le Grand 	rInfo.bMirror45Allowed = bNoPresGrf;
790ddde725dSArmin Le Grand 	rInfo.bMirror90Allowed = !bEmptyPresObj;
791cdf0e10cSrcweir 	rInfo.bTransparenceAllowed = sal_False;
792cdf0e10cSrcweir 	rInfo.bGradientAllowed = sal_False;
793a5258243SPedro Giffuni 
794a5258243SPedro Giffuni     // #i118485# Shear allowed and possible now
795a5258243SPedro Giffuni 	rInfo.bShearAllowed = true;
796a5258243SPedro Giffuni 
797cdf0e10cSrcweir     rInfo.bEdgeRadiusAllowed=sal_False;
798ddde725dSArmin Le Grand 	rInfo.bCanConvToPath = !IsEPS();
799cdf0e10cSrcweir 	rInfo.bCanConvToPathLineToArea = sal_False;
800cdf0e10cSrcweir 	rInfo.bCanConvToPolyLineToArea = sal_False;
801ddde725dSArmin Le Grand 	rInfo.bCanConvToPoly = !IsEPS();
802cdf0e10cSrcweir 	rInfo.bCanConvToContour = (rInfo.bCanConvToPoly || LineGeometryUsageIsNecessary());
803cdf0e10cSrcweir }
804cdf0e10cSrcweir 
805cdf0e10cSrcweir // -----------------------------------------------------------------------------
806cdf0e10cSrcweir 
807cdf0e10cSrcweir sal_uInt16 SdrGrafObj::GetObjIdentifier() const
808cdf0e10cSrcweir {
809cdf0e10cSrcweir 	return sal_uInt16( OBJ_GRAF );
810cdf0e10cSrcweir }
811cdf0e10cSrcweir 
812cdf0e10cSrcweir // -----------------------------------------------------------------------------
813cdf0e10cSrcweir 
814cdf0e10cSrcweir /* The graphic of the GraphicLink will be loaded. If it is called with
815cdf0e10cSrcweir    bAsynchron = true then the graphic will be set later via DataChanged
816cdf0e10cSrcweir */
817cdf0e10cSrcweir sal_Bool SdrGrafObj::ImpUpdateGraphicLink( sal_Bool bAsynchron ) const
818cdf0e10cSrcweir {
819cdf0e10cSrcweir     sal_Bool bRet = sal_False;
820cdf0e10cSrcweir     if( pGraphicLink )
821cdf0e10cSrcweir 	{
822cdf0e10cSrcweir 		if ( bAsynchron )
823cdf0e10cSrcweir 			pGraphicLink->UpdateAsynchron();
824cdf0e10cSrcweir 		else
825cdf0e10cSrcweir 			pGraphicLink->DataChanged( ImpLoadLinkedGraphic( aFileName, aFilterName ) );
826cdf0e10cSrcweir         bRet = sal_True;
827cdf0e10cSrcweir     }
828cdf0e10cSrcweir 	return bRet;
829cdf0e10cSrcweir }
830cdf0e10cSrcweir 
831cdf0e10cSrcweir // -----------------------------------------------------------------------------
832cdf0e10cSrcweir 
833cdf0e10cSrcweir void SdrGrafObj::ImpSetLinkedGraphic( const Graphic& rGraphic )
834cdf0e10cSrcweir {
835cdf0e10cSrcweir 	const sal_Bool bIsChanged = GetModel()->IsChanged();
836cdf0e10cSrcweir 	NbcSetGraphic( rGraphic );
837cdf0e10cSrcweir 	ActionChanged();
838cdf0e10cSrcweir 	BroadcastObjectChange();
839cdf0e10cSrcweir 	GetModel()->SetChanged( bIsChanged );
840cdf0e10cSrcweir }
841cdf0e10cSrcweir 
842cdf0e10cSrcweir // -----------------------------------------------------------------------------
843cdf0e10cSrcweir 
844cdf0e10cSrcweir void SdrGrafObj::TakeObjNameSingul(XubString& rName) const
845cdf0e10cSrcweir {
846ddde725dSArmin Le Grand     if(pGraphic)
847ddde725dSArmin Le Grand     {
848ddde725dSArmin Le Grand         const SvgDataPtr& rSvgDataPtr = pGraphic->GetGraphic().getSvgData();
849ddde725dSArmin Le Grand 
850ddde725dSArmin Le Grand         if(rSvgDataPtr.get())
851ddde725dSArmin Le Grand         {
852ddde725dSArmin Le Grand             rName = ImpGetResStr(STR_ObjNameSingulGRAFSVG);
853ddde725dSArmin Le Grand         }
854ddde725dSArmin Le Grand         else
855ddde725dSArmin Le Grand         {
856cdf0e10cSrcweir 	        switch( pGraphic->GetType() )
857cdf0e10cSrcweir 	        {
858cdf0e10cSrcweir 		        case GRAPHIC_BITMAP:
859cdf0e10cSrcweir                 {
860cdf0e10cSrcweir                     const sal_uInt16 nId = ( ( pGraphic->IsTransparent() || ( (const SdrGrafTransparenceItem&) GetObjectItem( SDRATTR_GRAFTRANSPARENCE ) ).GetValue() ) ?
861cdf0e10cSrcweir                                          ( IsLinkedGraphic() ? STR_ObjNameSingulGRAFBMPTRANSLNK : STR_ObjNameSingulGRAFBMPTRANS ) :
862cdf0e10cSrcweir                                          ( IsLinkedGraphic() ? STR_ObjNameSingulGRAFBMPLNK : STR_ObjNameSingulGRAFBMP ) );
863cdf0e10cSrcweir 
864cdf0e10cSrcweir                     rName=ImpGetResStr( nId );
865cdf0e10cSrcweir                 }
866cdf0e10cSrcweir                 break;
867cdf0e10cSrcweir 
868cdf0e10cSrcweir 		        case GRAPHIC_GDIMETAFILE:
869cdf0e10cSrcweir                     rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFMTFLNK : STR_ObjNameSingulGRAFMTF );
870cdf0e10cSrcweir                 break;
871cdf0e10cSrcweir 
872cdf0e10cSrcweir                 case GRAPHIC_NONE:
873cdf0e10cSrcweir                     rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFNONELNK : STR_ObjNameSingulGRAFNONE );
874cdf0e10cSrcweir                 break;
875cdf0e10cSrcweir 
876cdf0e10cSrcweir                 default:
877cdf0e10cSrcweir                     rName=ImpGetResStr(  IsLinkedGraphic() ? STR_ObjNameSingulGRAFLNK : STR_ObjNameSingulGRAF );
878cdf0e10cSrcweir                 break;
879cdf0e10cSrcweir 	        }
880ddde725dSArmin Le Grand         }
881cdf0e10cSrcweir 
882cdf0e10cSrcweir 	    const String aName(GetName());
883cdf0e10cSrcweir 
884cdf0e10cSrcweir 	    if( aName.Len() )
885cdf0e10cSrcweir 	    {
886cdf0e10cSrcweir 		    rName.AppendAscii( " '" );
887cdf0e10cSrcweir 		    rName += aName;
888cdf0e10cSrcweir 		    rName += sal_Unicode( '\'' );
889cdf0e10cSrcweir 	    }
890cdf0e10cSrcweir     }
891ddde725dSArmin Le Grand }
892cdf0e10cSrcweir 
893cdf0e10cSrcweir // -----------------------------------------------------------------------------
894cdf0e10cSrcweir 
895cdf0e10cSrcweir void SdrGrafObj::TakeObjNamePlural( XubString& rName ) const
896cdf0e10cSrcweir {
897ddde725dSArmin Le Grand     if(pGraphic)
898ddde725dSArmin Le Grand     {
899ddde725dSArmin Le Grand         const SvgDataPtr& rSvgDataPtr = pGraphic->GetGraphic().getSvgData();
900ddde725dSArmin Le Grand 
901ddde725dSArmin Le Grand         if(rSvgDataPtr.get())
902ddde725dSArmin Le Grand         {
903ddde725dSArmin Le Grand             rName = ImpGetResStr(STR_ObjNamePluralGRAFSVG);
904ddde725dSArmin Le Grand         }
905ddde725dSArmin Le Grand         else
906ddde725dSArmin Le Grand         {
907cdf0e10cSrcweir 	        switch( pGraphic->GetType() )
908cdf0e10cSrcweir 	        {
909cdf0e10cSrcweir 		        case GRAPHIC_BITMAP:
910cdf0e10cSrcweir                 {
911cdf0e10cSrcweir                     const sal_uInt16 nId = ( ( pGraphic->IsTransparent() || ( (const SdrGrafTransparenceItem&) GetObjectItem( SDRATTR_GRAFTRANSPARENCE ) ).GetValue() ) ?
912cdf0e10cSrcweir                                          ( IsLinkedGraphic() ? STR_ObjNamePluralGRAFBMPTRANSLNK : STR_ObjNamePluralGRAFBMPTRANS ) :
913cdf0e10cSrcweir                                          ( IsLinkedGraphic() ? STR_ObjNamePluralGRAFBMPLNK : STR_ObjNamePluralGRAFBMP ) );
914cdf0e10cSrcweir 
915cdf0e10cSrcweir                     rName=ImpGetResStr( nId );
916cdf0e10cSrcweir                 }
917cdf0e10cSrcweir                 break;
918cdf0e10cSrcweir 
919cdf0e10cSrcweir 		        case GRAPHIC_GDIMETAFILE:
920cdf0e10cSrcweir                     rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFMTFLNK : STR_ObjNamePluralGRAFMTF );
921cdf0e10cSrcweir                 break;
922cdf0e10cSrcweir 
923cdf0e10cSrcweir                 case GRAPHIC_NONE:
924cdf0e10cSrcweir                     rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFNONELNK : STR_ObjNamePluralGRAFNONE );
925cdf0e10cSrcweir                 break;
926cdf0e10cSrcweir 
927cdf0e10cSrcweir                 default:
928cdf0e10cSrcweir                     rName=ImpGetResStr(  IsLinkedGraphic() ? STR_ObjNamePluralGRAFLNK : STR_ObjNamePluralGRAF );
929cdf0e10cSrcweir                 break;
930cdf0e10cSrcweir 	        }
931ddde725dSArmin Le Grand         }
932cdf0e10cSrcweir 
933cdf0e10cSrcweir 	    const String aName(GetName());
934cdf0e10cSrcweir 
935cdf0e10cSrcweir 	    if( aName.Len() )
936cdf0e10cSrcweir 	    {
937cdf0e10cSrcweir 		    rName.AppendAscii( " '" );
938cdf0e10cSrcweir 		    rName += aName;
939cdf0e10cSrcweir 		    rName += sal_Unicode( '\'' );
940cdf0e10cSrcweir 	    }
941cdf0e10cSrcweir     }
942ddde725dSArmin Le Grand }
943cdf0e10cSrcweir 
944cdf0e10cSrcweir // -----------------------------------------------------------------------------
945cdf0e10cSrcweir 
946cdf0e10cSrcweir SdrObject* SdrGrafObj::getFullDragClone() const
947cdf0e10cSrcweir {
948cdf0e10cSrcweir     // call parent
949cdf0e10cSrcweir     SdrGrafObj* pRetval = static_cast< SdrGrafObj* >(SdrRectObj::getFullDragClone());
950cdf0e10cSrcweir 
951cdf0e10cSrcweir     // #i103116# the full drag clone leads to problems
952cdf0e10cSrcweir     // with linked graphics, so reset the link in this
953cdf0e10cSrcweir     // temporary interaction object and load graphic
954cdf0e10cSrcweir     if(pRetval && IsLinkedGraphic())
955cdf0e10cSrcweir     {
956cdf0e10cSrcweir         pRetval->ForceSwapIn();
957cdf0e10cSrcweir         pRetval->ReleaseGraphicLink();
958cdf0e10cSrcweir     }
959cdf0e10cSrcweir 
960cdf0e10cSrcweir     return pRetval;
961cdf0e10cSrcweir }
962cdf0e10cSrcweir 
963cdf0e10cSrcweir void SdrGrafObj::operator=( const SdrObject& rObj )
964cdf0e10cSrcweir {
965cdf0e10cSrcweir 	SdrRectObj::operator=( rObj );
966cdf0e10cSrcweir 
967cdf0e10cSrcweir 	const SdrGrafObj& rGraf = (SdrGrafObj&) rObj;
968cdf0e10cSrcweir 
969cdf0e10cSrcweir 	pGraphic->SetGraphic( rGraf.GetGraphic(), &rGraf.GetGraphicObject() );
970cdf0e10cSrcweir 	aCropRect = rGraf.aCropRect;
971cdf0e10cSrcweir 	aFileName = rGraf.aFileName;
972cdf0e10cSrcweir 	aFilterName = rGraf.aFilterName;
973cdf0e10cSrcweir 	bMirrored = rGraf.bMirrored;
974cdf0e10cSrcweir 
975cdf0e10cSrcweir 	if( rGraf.pGraphicLink != NULL)
976cdf0e10cSrcweir 	{
977cdf0e10cSrcweir 		SetGraphicLink( aFileName, aFilterName );
978cdf0e10cSrcweir 	}
979cdf0e10cSrcweir 
980cdf0e10cSrcweir 	ImpSetAttrToGrafInfo();
981cdf0e10cSrcweir }
982cdf0e10cSrcweir 
983cdf0e10cSrcweir // -----------------------------------------------------------------------------
984cdf0e10cSrcweir // #i25616#
985cdf0e10cSrcweir 
986cdf0e10cSrcweir basegfx::B2DPolyPolygon SdrGrafObj::TakeXorPoly() const
987cdf0e10cSrcweir {
988cdf0e10cSrcweir 	if(mbInsidePaint)
989cdf0e10cSrcweir 	{
990cdf0e10cSrcweir 		basegfx::B2DPolyPolygon aRetval;
991cdf0e10cSrcweir 
992cdf0e10cSrcweir 		// take grown rectangle
993cdf0e10cSrcweir 		const sal_Int32 nHalfLineWidth(ImpGetLineWdt() / 2);
994cdf0e10cSrcweir 		const Rectangle aGrownRect(
995cdf0e10cSrcweir 			aRect.Left() - nHalfLineWidth,
996cdf0e10cSrcweir 			aRect.Top() - nHalfLineWidth,
997cdf0e10cSrcweir 			aRect.Right() + nHalfLineWidth,
998cdf0e10cSrcweir 			aRect.Bottom() + nHalfLineWidth);
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir 		XPolygon aXPoly(ImpCalcXPoly(aGrownRect, GetEckenradius()));
1001cdf0e10cSrcweir 		aRetval.append(aXPoly.getB2DPolygon());
1002cdf0e10cSrcweir 
1003cdf0e10cSrcweir 		return aRetval;
1004cdf0e10cSrcweir 	}
1005cdf0e10cSrcweir 	else
1006cdf0e10cSrcweir 	{
1007cdf0e10cSrcweir 		// call parent
1008cdf0e10cSrcweir 		return SdrRectObj::TakeXorPoly();
1009cdf0e10cSrcweir 	}
1010cdf0e10cSrcweir }
1011cdf0e10cSrcweir 
1012cdf0e10cSrcweir // -----------------------------------------------------------------------------
1013cdf0e10cSrcweir 
1014cdf0e10cSrcweir sal_uInt32 SdrGrafObj::GetHdlCount() const
1015cdf0e10cSrcweir {
1016cdf0e10cSrcweir 	return 8L;
1017cdf0e10cSrcweir }
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir // -----------------------------------------------------------------------------
1020cdf0e10cSrcweir 
1021cdf0e10cSrcweir SdrHdl* SdrGrafObj::GetHdl(sal_uInt32 nHdlNum) const
1022cdf0e10cSrcweir {
1023cdf0e10cSrcweir 	return SdrRectObj::GetHdl( nHdlNum + 1L );
1024cdf0e10cSrcweir }
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir // -----------------------------------------------------------------------------
1027cdf0e10cSrcweir 
1028cdf0e10cSrcweir void SdrGrafObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
1029cdf0e10cSrcweir {
1030cdf0e10cSrcweir 	SdrRectObj::NbcResize( rRef, xFact, yFact );
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir 	FASTBOOL bMirrX = xFact.GetNumerator() < 0;
1033cdf0e10cSrcweir 	FASTBOOL bMirrY = yFact.GetNumerator() < 0;
1034cdf0e10cSrcweir 
1035cdf0e10cSrcweir 	if( bMirrX != bMirrY )
1036cdf0e10cSrcweir 		bMirrored = !bMirrored;
1037cdf0e10cSrcweir }
1038cdf0e10cSrcweir 
1039cdf0e10cSrcweir // -----------------------------------------------------------------------------
1040cdf0e10cSrcweir 
1041cdf0e10cSrcweir void SdrGrafObj::NbcRotate(const Point& rRef, long nWink, double sn, double cs)
1042cdf0e10cSrcweir {
1043cdf0e10cSrcweir 	SdrRectObj::NbcRotate(rRef,nWink,sn,cs);
1044cdf0e10cSrcweir }
1045cdf0e10cSrcweir 
1046cdf0e10cSrcweir // -----------------------------------------------------------------------------
1047cdf0e10cSrcweir 
1048cdf0e10cSrcweir void SdrGrafObj::NbcMirror(const Point& rRef1, const Point& rRef2)
1049cdf0e10cSrcweir {
1050cdf0e10cSrcweir 	SdrRectObj::NbcMirror(rRef1,rRef2);
1051cdf0e10cSrcweir 	bMirrored = !bMirrored;
1052cdf0e10cSrcweir }
1053cdf0e10cSrcweir 
1054cdf0e10cSrcweir // -----------------------------------------------------------------------------
1055cdf0e10cSrcweir 
1056cdf0e10cSrcweir void SdrGrafObj::NbcShear(const Point& rRef, long nWink, double tn, FASTBOOL bVShear)
1057cdf0e10cSrcweir {
1058a5258243SPedro Giffuni     // #i118485# Call Shear now, old version redirected to rotate
1059a5258243SPedro Giffuni 	SdrRectObj::NbcShear(rRef, nWink, tn, bVShear);
1060cdf0e10cSrcweir }
1061cdf0e10cSrcweir 
1062cdf0e10cSrcweir // -----------------------------------------------------------------------------
1063cdf0e10cSrcweir 
1064cdf0e10cSrcweir void SdrGrafObj::NbcSetSnapRect(const Rectangle& rRect)
1065cdf0e10cSrcweir {
1066cdf0e10cSrcweir 	SdrRectObj::NbcSetSnapRect(rRect);
1067cdf0e10cSrcweir }
1068cdf0e10cSrcweir 
1069cdf0e10cSrcweir // -----------------------------------------------------------------------------
1070cdf0e10cSrcweir 
1071cdf0e10cSrcweir void SdrGrafObj::NbcSetLogicRect( const Rectangle& rRect)
1072cdf0e10cSrcweir {
1073cdf0e10cSrcweir 	//int bChg=rRect.GetSize()!=aRect.GetSize();
1074cdf0e10cSrcweir 	SdrRectObj::NbcSetLogicRect(rRect);
1075cdf0e10cSrcweir }
1076cdf0e10cSrcweir 
1077cdf0e10cSrcweir // -----------------------------------------------------------------------------
1078cdf0e10cSrcweir 
1079cdf0e10cSrcweir SdrObjGeoData* SdrGrafObj::NewGeoData() const
1080cdf0e10cSrcweir {
1081cdf0e10cSrcweir 	return new SdrGrafObjGeoData;
1082cdf0e10cSrcweir }
1083cdf0e10cSrcweir 
1084cdf0e10cSrcweir // -----------------------------------------------------------------------------
1085cdf0e10cSrcweir 
1086cdf0e10cSrcweir void SdrGrafObj::SaveGeoData(SdrObjGeoData& rGeo) const
1087cdf0e10cSrcweir {
1088cdf0e10cSrcweir 	SdrRectObj::SaveGeoData(rGeo);
1089cdf0e10cSrcweir 	SdrGrafObjGeoData& rGGeo=(SdrGrafObjGeoData&)rGeo;
1090cdf0e10cSrcweir 	rGGeo.bMirrored=bMirrored;
1091cdf0e10cSrcweir }
1092cdf0e10cSrcweir 
1093cdf0e10cSrcweir // -----------------------------------------------------------------------------
1094cdf0e10cSrcweir 
1095cdf0e10cSrcweir void SdrGrafObj::RestGeoData(const SdrObjGeoData& rGeo)
1096cdf0e10cSrcweir {
1097cdf0e10cSrcweir 	//long		nDrehMerk = aGeo.nDrehWink;
1098cdf0e10cSrcweir 	//long		nShearMerk = aGeo.nShearWink;
1099cdf0e10cSrcweir 	//int	bMirrMerk = bMirrored;
1100cdf0e10cSrcweir 	Size		aSizMerk( aRect.GetSize() );
1101cdf0e10cSrcweir 
1102cdf0e10cSrcweir 	SdrRectObj::RestGeoData(rGeo);
1103cdf0e10cSrcweir 	SdrGrafObjGeoData& rGGeo=(SdrGrafObjGeoData&)rGeo;
1104cdf0e10cSrcweir 	bMirrored=rGGeo.bMirrored;
1105cdf0e10cSrcweir }
1106cdf0e10cSrcweir 
1107cdf0e10cSrcweir // -----------------------------------------------------------------------------
1108cdf0e10cSrcweir 
1109cdf0e10cSrcweir void SdrGrafObj::SetPage( SdrPage* pNewPage )
1110cdf0e10cSrcweir {
1111cdf0e10cSrcweir 	FASTBOOL bRemove = pNewPage == NULL && pPage != NULL;
1112cdf0e10cSrcweir 	FASTBOOL bInsert = pNewPage != NULL && pPage == NULL;
1113cdf0e10cSrcweir 
1114cdf0e10cSrcweir 	if( bRemove )
1115cdf0e10cSrcweir 	{
1116cdf0e10cSrcweir 		// hier kein SwapIn noetig, weil wenn nicht geladen, dann auch nicht animiert.
1117cdf0e10cSrcweir 		if( pGraphic->IsAnimated())
1118cdf0e10cSrcweir 			pGraphic->StopAnimation();
1119cdf0e10cSrcweir 
1120cdf0e10cSrcweir 		if( pGraphicLink != NULL )
1121cdf0e10cSrcweir 			ImpLinkAbmeldung();
1122cdf0e10cSrcweir 	}
1123cdf0e10cSrcweir 
11249e9dd2d5SArmin Le Grand     if(!pModel && !GetStyleSheet() && pNewPage->GetModel())
11259e9dd2d5SArmin Le Grand     {
11269e9dd2d5SArmin Le Grand         // #119287# Set default StyleSheet for SdrGrafObj here, it is different from 'Default'. This
11279e9dd2d5SArmin Le Grand         // needs to be done before the style 'Default' is set from the :SetModel() call which is triggered
11289e9dd2d5SArmin Le Grand         // from the following :SetPage().
11299e9dd2d5SArmin Le Grand         // TTTT: Needs to be moved in branch aw080 due to having a SdrModel from the beginning, is at this
11309e9dd2d5SArmin Le Grand         // place for convenience currently (works in both versions, is not in the way)
11319e9dd2d5SArmin Le Grand 		SfxStyleSheet* pSheet = pNewPage->GetModel()->GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj();
11329e9dd2d5SArmin Le Grand 
11339e9dd2d5SArmin Le Grand 		if(pSheet)
11349e9dd2d5SArmin Le Grand 		{
11359e9dd2d5SArmin Le Grand 			SetStyleSheet(pSheet, false);
11369e9dd2d5SArmin Le Grand 		}
11379e9dd2d5SArmin Le Grand         else
11389e9dd2d5SArmin Le Grand         {
11399e9dd2d5SArmin Le Grand 		    SetMergedItem(XFillStyleItem(XFILL_NONE));
11409e9dd2d5SArmin Le Grand 		    SetMergedItem(XLineStyleItem(XLINE_NONE));
11419e9dd2d5SArmin Le Grand         }
11429e9dd2d5SArmin Le Grand     }
11439e9dd2d5SArmin Le Grand 
1144cdf0e10cSrcweir 	SdrRectObj::SetPage( pNewPage );
1145cdf0e10cSrcweir 
1146cdf0e10cSrcweir 	if(aFileName.Len() && bInsert)
1147cdf0e10cSrcweir 		ImpLinkAnmeldung();
1148cdf0e10cSrcweir }
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir // -----------------------------------------------------------------------------
1151cdf0e10cSrcweir 
1152cdf0e10cSrcweir void SdrGrafObj::SetModel( SdrModel* pNewModel )
1153cdf0e10cSrcweir {
1154cdf0e10cSrcweir 	FASTBOOL bChg = pNewModel != pModel;
1155cdf0e10cSrcweir 
1156cdf0e10cSrcweir 	if( bChg )
1157cdf0e10cSrcweir 	{
1158cdf0e10cSrcweir 		if( pGraphic->HasUserData() )
1159cdf0e10cSrcweir 		{
1160cdf0e10cSrcweir 			ForceSwapIn();
1161cdf0e10cSrcweir 			pGraphic->SetUserData();
1162cdf0e10cSrcweir 		}
1163cdf0e10cSrcweir 
1164cdf0e10cSrcweir 		if( pGraphicLink != NULL )
1165cdf0e10cSrcweir 			ImpLinkAbmeldung();
1166cdf0e10cSrcweir 	}
1167cdf0e10cSrcweir 
1168cdf0e10cSrcweir 	// Model umsetzen
1169cdf0e10cSrcweir 	SdrRectObj::SetModel(pNewModel);
1170cdf0e10cSrcweir 
1171cdf0e10cSrcweir 	if( bChg && aFileName.Len() )
1172cdf0e10cSrcweir 		ImpLinkAnmeldung();
1173cdf0e10cSrcweir }
1174cdf0e10cSrcweir 
1175cdf0e10cSrcweir // -----------------------------------------------------------------------------
1176cdf0e10cSrcweir 
1177cdf0e10cSrcweir void SdrGrafObj::StartAnimation( OutputDevice* /*pOutDev*/, const Point& /*rPoint*/, const Size& /*rSize*/, long /*nExtraData*/)
1178cdf0e10cSrcweir {
1179cdf0e10cSrcweir 	// #111096#
1180cdf0e10cSrcweir 	// use new graf animation
1181cdf0e10cSrcweir 	SetGrafAnimationAllowed(sal_True);
1182cdf0e10cSrcweir }
1183cdf0e10cSrcweir 
1184cdf0e10cSrcweir // -----------------------------------------------------------------------------
1185cdf0e10cSrcweir 
1186cdf0e10cSrcweir void SdrGrafObj::StopAnimation(OutputDevice* /*pOutDev*/, long /*nExtraData*/)
1187cdf0e10cSrcweir {
1188cdf0e10cSrcweir 	// #111096#
1189cdf0e10cSrcweir 	// use new graf animation
1190cdf0e10cSrcweir 	SetGrafAnimationAllowed(sal_False);
1191cdf0e10cSrcweir }
1192cdf0e10cSrcweir 
1193cdf0e10cSrcweir // -----------------------------------------------------------------------------
1194cdf0e10cSrcweir 
1195cdf0e10cSrcweir FASTBOOL SdrGrafObj::HasGDIMetaFile() const
1196cdf0e10cSrcweir {
1197cdf0e10cSrcweir 	return( pGraphic->GetType() == GRAPHIC_GDIMETAFILE );
1198cdf0e10cSrcweir }
1199cdf0e10cSrcweir 
1200cdf0e10cSrcweir // -----------------------------------------------------------------------------
1201cdf0e10cSrcweir 
1202cdf0e10cSrcweir const GDIMetaFile* SdrGrafObj::GetGDIMetaFile() const
1203cdf0e10cSrcweir {
1204cdf0e10cSrcweir 	DBG_ERROR( "Invalid return value! Don't use it! (KA)" );
1205cdf0e10cSrcweir 	return &GetGraphic().GetGDIMetaFile();
1206cdf0e10cSrcweir }
1207cdf0e10cSrcweir 
1208cdf0e10cSrcweir // -----------------------------------------------------------------------------
1209cdf0e10cSrcweir 
1210ddde725dSArmin Le Grand bool SdrGrafObj::isEmbeddedSvg() const
1211ddde725dSArmin Le Grand {
1212ddde725dSArmin Le Grand     return GRAPHIC_BITMAP == GetGraphicType() && GetGraphic().getSvgData().get();
1213ddde725dSArmin Le Grand }
1214ddde725dSArmin Le Grand 
1215ddde725dSArmin Le Grand GDIMetaFile SdrGrafObj::getMetafileFromEmbeddedSvg() const
1216ddde725dSArmin Le Grand {
1217ddde725dSArmin Le Grand     GDIMetaFile aRetval;
1218ddde725dSArmin Le Grand 
1219ddde725dSArmin Le Grand     if(isEmbeddedSvg() && GetModel())
1220ddde725dSArmin Le Grand     {
1221ddde725dSArmin Le Grand         VirtualDevice aOut;
1222ddde725dSArmin Le Grand         const Rectangle aBoundRect(GetCurrentBoundRect());
1223ddde725dSArmin Le Grand         const MapMode aMap(GetModel()->GetScaleUnit(), Point(), GetModel()->GetScaleFraction(), GetModel()->GetScaleFraction());
1224ddde725dSArmin Le Grand 
1225ddde725dSArmin Le Grand         aOut.EnableOutput(false);
1226ddde725dSArmin Le Grand         aOut.SetMapMode(aMap);
1227ddde725dSArmin Le Grand         aRetval.Record(&aOut);
1228ddde725dSArmin Le Grand         SingleObjectPainter(aOut);
1229ddde725dSArmin Le Grand         aRetval.Stop();
1230ddde725dSArmin Le Grand         aRetval.WindStart();
1231ddde725dSArmin Le Grand         aRetval.Move(-aBoundRect.Left(), -aBoundRect.Top());
1232ddde725dSArmin Le Grand         aRetval.SetPrefMapMode(aMap);
1233ddde725dSArmin Le Grand         aRetval.SetPrefSize(aBoundRect.GetSize());
1234ddde725dSArmin Le Grand     }
1235ddde725dSArmin Le Grand 
1236ddde725dSArmin Le Grand     return aRetval;
1237ddde725dSArmin Le Grand }
1238ddde725dSArmin Le Grand 
1239a5258243SPedro Giffuni SdrObject* SdrGrafObj::DoConvertToPolyObj(sal_Bool bBezier, bool bAddText) const
1240cdf0e10cSrcweir {
1241cdf0e10cSrcweir 	SdrObject* pRetval = NULL;
1242ddde725dSArmin Le Grand     GraphicType aGraphicType(GetGraphicType());
1243ddde725dSArmin Le Grand     GDIMetaFile aMtf;
1244cdf0e10cSrcweir 
1245ddde725dSArmin Le Grand     if(isEmbeddedSvg())
1246ddde725dSArmin Le Grand     {
1247ddde725dSArmin Le Grand         // Embedded Svg
1248ddde725dSArmin Le Grand         // There is currently no helper to create SdrObjects from primitives (even if I'm thinking
1249ddde725dSArmin Le Grand         // about writing one for some time). To get the roundtrip to SdrObjects it is necessary to
1250ddde725dSArmin Le Grand         // use the old converter path over the MetaFile mechanism. Create Metafile from Svg
1251ddde725dSArmin Le Grand         // primitives here pretty directly
1252ddde725dSArmin Le Grand         aMtf = getMetafileFromEmbeddedSvg();
1253ddde725dSArmin Le Grand         aGraphicType = GRAPHIC_GDIMETAFILE;
1254ddde725dSArmin Le Grand     }
1255ddde725dSArmin Le Grand     else if(GRAPHIC_GDIMETAFILE == aGraphicType)
1256ddde725dSArmin Le Grand     {
1257ddde725dSArmin Le Grand         aMtf = GetTransformedGraphic(SDRGRAFOBJ_TRANSFORMATTR_COLOR|SDRGRAFOBJ_TRANSFORMATTR_MIRROR).GetGDIMetaFile();
1258ddde725dSArmin Le Grand     }
1259ddde725dSArmin Le Grand 
1260ddde725dSArmin Le Grand 	switch(aGraphicType)
1261cdf0e10cSrcweir 	{
1262cdf0e10cSrcweir 		case GRAPHIC_GDIMETAFILE:
1263cdf0e10cSrcweir 		{
1264cdf0e10cSrcweir 			// NUR die aus dem MetaFile erzeugbaren Objekte in eine Gruppe packen und zurueckliefern
12658718d260SArmin Le Grand 			ImpSdrGDIMetaFileImport aFilter(*GetModel(), GetLayer(), aRect);
1266a5258243SPedro Giffuni 			SdrObjGroup* pGrp = new SdrObjGroup();
1267ddde725dSArmin Le Grand 			sal_uInt32 nInsAnz = aFilter.DoImport(aMtf, *pGrp->GetSubList(), 0);
1268a5258243SPedro Giffuni 
1269cdf0e10cSrcweir             if(nInsAnz)
1270cdf0e10cSrcweir 			{
1271a5258243SPedro Giffuni                 {
1272a5258243SPedro Giffuni                         // copy transformation
1273a5258243SPedro Giffuni                 	GeoStat aGeoStat(GetGeoStat());
1274a5258243SPedro Giffuni 
1275a5258243SPedro Giffuni 	                if(aGeoStat.nShearWink)
1276a5258243SPedro Giffuni                     {
1277a5258243SPedro Giffuni                         aGeoStat.RecalcTan();
1278a5258243SPedro Giffuni                         pGrp->NbcShear(aRect.TopLeft(), aGeoStat.nShearWink, aGeoStat.nTan, false);
1279a5258243SPedro Giffuni                     }
1280a5258243SPedro Giffuni 
1281a5258243SPedro Giffuni 	                if(aGeoStat.nDrehWink)
1282a5258243SPedro Giffuni                     {
1283a5258243SPedro Giffuni 	                    aGeoStat.RecalcSinCos();
1284a5258243SPedro Giffuni                         pGrp->NbcRotate(aRect.TopLeft(), aGeoStat.nDrehWink, aGeoStat.nSin, aGeoStat.nCos);
1285a5258243SPedro Giffuni                     }
1286a5258243SPedro Giffuni                 }
1287a5258243SPedro Giffuni 
1288cdf0e10cSrcweir                 pRetval = pGrp;
1289cdf0e10cSrcweir 				pGrp->NbcSetLayer(GetLayer());
1290cdf0e10cSrcweir 				pGrp->SetModel(GetModel());
1291dfe9de19SHerbert Dürr 
1292dfe9de19SHerbert Dürr                 if(bAddText)
1293dfe9de19SHerbert Dürr                 {
1294cdf0e10cSrcweir 				    pRetval = ImpConvertAddText(pRetval, bBezier);
1295dfe9de19SHerbert Dürr                 }
1296cdf0e10cSrcweir 
1297cdf0e10cSrcweir                 // convert all children
1298cdf0e10cSrcweir                 if( pRetval )
1299cdf0e10cSrcweir                 {
1300cdf0e10cSrcweir                     SdrObject* pHalfDone = pRetval;
1301a5258243SPedro Giffuni                     pRetval = pHalfDone->DoConvertToPolyObj(bBezier, bAddText);
1302cdf0e10cSrcweir                     SdrObject::Free( pHalfDone ); // resulting object is newly created
1303cdf0e10cSrcweir 
1304cdf0e10cSrcweir                     if( pRetval )
1305cdf0e10cSrcweir                     {
1306cdf0e10cSrcweir                         // flatten subgroups. As we call
1307cdf0e10cSrcweir                         // DoConvertToPolyObj() on the resulting group
1308cdf0e10cSrcweir                         // objects, subgroups can exist (e.g. text is
1309cdf0e10cSrcweir                         // a group object for every line).
1310cdf0e10cSrcweir                         SdrObjList* pList = pRetval->GetSubList();
1311cdf0e10cSrcweir                         if( pList )
1312cdf0e10cSrcweir                             pList->FlattenGroups();
1313cdf0e10cSrcweir                     }
1314cdf0e10cSrcweir                 }
1315cdf0e10cSrcweir 			}
1316cdf0e10cSrcweir 			else
1317a5258243SPedro Giffuni             {
1318cdf0e10cSrcweir 				delete pGrp;
1319a5258243SPedro Giffuni             }
1320a5258243SPedro Giffuni 
1321a5258243SPedro Giffuni             // #i118485# convert line and fill
1322a5258243SPedro Giffuni             SdrObject* pLineFill = SdrRectObj::DoConvertToPolyObj(bBezier, false);
1323a5258243SPedro Giffuni 
1324a5258243SPedro Giffuni             if(pLineFill)
1325a5258243SPedro Giffuni             {
1326a5258243SPedro Giffuni                 if(pRetval)
1327a5258243SPedro Giffuni                 {
1328a5258243SPedro Giffuni                     pGrp = dynamic_cast< SdrObjGroup* >(pRetval);
1329a5258243SPedro Giffuni 
1330a5258243SPedro Giffuni                     if(!pGrp)
1331a5258243SPedro Giffuni                     {
1332a5258243SPedro Giffuni             			pGrp = new SdrObjGroup();
1333a5258243SPedro Giffuni 
1334a5258243SPedro Giffuni                         pGrp->NbcSetLayer(GetLayer());
1335a5258243SPedro Giffuni 				        pGrp->SetModel(GetModel());
1336a5258243SPedro Giffuni                         pGrp->GetSubList()->NbcInsertObject(pRetval);
1337a5258243SPedro Giffuni                     }
1338a5258243SPedro Giffuni 
1339a5258243SPedro Giffuni                     pGrp->GetSubList()->NbcInsertObject(pLineFill, 0);
1340a5258243SPedro Giffuni                 }
1341a5258243SPedro Giffuni                 else
1342a5258243SPedro Giffuni                 {
1343a5258243SPedro Giffuni                     pRetval = pLineFill;
1344a5258243SPedro Giffuni                 }
1345a5258243SPedro Giffuni             }
1346a5258243SPedro Giffuni 
1347cdf0e10cSrcweir 			break;
1348cdf0e10cSrcweir 		}
1349cdf0e10cSrcweir 		case GRAPHIC_BITMAP:
1350cdf0e10cSrcweir 		{
1351cdf0e10cSrcweir 			// Grundobjekt kreieren und Fuellung ergaenzen
1352a5258243SPedro Giffuni 			pRetval = SdrRectObj::DoConvertToPolyObj(bBezier, bAddText);
1353cdf0e10cSrcweir 
1354cdf0e10cSrcweir 			// Bitmap als Attribut retten
1355cdf0e10cSrcweir 			if(pRetval)
1356cdf0e10cSrcweir 			{
1357cdf0e10cSrcweir 				// Bitmap als Fuellung holen
1358cdf0e10cSrcweir 				SfxItemSet aSet(GetObjectItemSet());
1359cdf0e10cSrcweir 
1360cdf0e10cSrcweir 				aSet.Put(XFillStyleItem(XFILL_BITMAP));
136170d3707aSArmin Le Grand 				const BitmapEx aBitmapEx(GetTransformedGraphic().GetBitmapEx());
136270d3707aSArmin Le Grand 				aSet.Put(XFillBitmapItem(String(), Graphic(aBitmapEx)));
136370d3707aSArmin Le Grand 				aSet.Put(XFillBmpTileItem(false));
1364cdf0e10cSrcweir 
1365cdf0e10cSrcweir 				pRetval->SetMergedItemSet(aSet);
1366cdf0e10cSrcweir 			}
1367cdf0e10cSrcweir 			break;
1368cdf0e10cSrcweir 		}
1369cdf0e10cSrcweir 		case GRAPHIC_NONE:
1370cdf0e10cSrcweir 		case GRAPHIC_DEFAULT:
1371cdf0e10cSrcweir 		{
1372a5258243SPedro Giffuni 			pRetval = SdrRectObj::DoConvertToPolyObj(bBezier, bAddText);
1373cdf0e10cSrcweir 			break;
1374cdf0e10cSrcweir 		}
1375cdf0e10cSrcweir 	}
1376cdf0e10cSrcweir 
1377cdf0e10cSrcweir 	return pRetval;
1378cdf0e10cSrcweir }
1379cdf0e10cSrcweir 
1380cdf0e10cSrcweir // -----------------------------------------------------------------------------
1381cdf0e10cSrcweir 
1382cdf0e10cSrcweir void SdrGrafObj::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
1383cdf0e10cSrcweir {
1384cdf0e10cSrcweir 	SetXPolyDirty();
1385cdf0e10cSrcweir 	SdrRectObj::Notify( rBC, rHint );
1386cdf0e10cSrcweir 	ImpSetAttrToGrafInfo();
1387cdf0e10cSrcweir }
1388cdf0e10cSrcweir 
1389cdf0e10cSrcweir void SdrGrafObj::ImpSetAttrToGrafInfo()
1390cdf0e10cSrcweir {
1391cdf0e10cSrcweir 	const SfxItemSet& rSet = GetObjectItemSet();
1392cdf0e10cSrcweir 	const sal_uInt16 nTrans = ( (SdrGrafTransparenceItem&) rSet.Get( SDRATTR_GRAFTRANSPARENCE ) ).GetValue();
1393cdf0e10cSrcweir 	const SdrGrafCropItem&	rCrop = (const SdrGrafCropItem&) rSet.Get( SDRATTR_GRAFCROP );
1394cdf0e10cSrcweir 
1395cdf0e10cSrcweir 	aGrafInfo.SetLuminance( ( (SdrGrafLuminanceItem&) rSet.Get( SDRATTR_GRAFLUMINANCE ) ).GetValue() );
1396cdf0e10cSrcweir 	aGrafInfo.SetContrast( ( (SdrGrafContrastItem&) rSet.Get( SDRATTR_GRAFCONTRAST ) ).GetValue() );
1397cdf0e10cSrcweir 	aGrafInfo.SetChannelR( ( (SdrGrafRedItem&) rSet.Get( SDRATTR_GRAFRED ) ).GetValue() );
1398cdf0e10cSrcweir 	aGrafInfo.SetChannelG( ( (SdrGrafGreenItem&) rSet.Get( SDRATTR_GRAFGREEN ) ).GetValue() );
1399cdf0e10cSrcweir 	aGrafInfo.SetChannelB( ( (SdrGrafBlueItem&) rSet.Get( SDRATTR_GRAFBLUE ) ).GetValue() );
1400cdf0e10cSrcweir 	aGrafInfo.SetGamma( ( (SdrGrafGamma100Item&) rSet.Get( SDRATTR_GRAFGAMMA ) ).GetValue() * 0.01 );
1401cdf0e10cSrcweir 	aGrafInfo.SetTransparency( (sal_uInt8) FRound( Min( nTrans, (sal_uInt16) 100 )  * 2.55 ) );
1402cdf0e10cSrcweir 	aGrafInfo.SetInvert( ( (SdrGrafInvertItem&) rSet.Get( SDRATTR_GRAFINVERT ) ).GetValue() );
1403cdf0e10cSrcweir 	aGrafInfo.SetDrawMode( ( (SdrGrafModeItem&) rSet.Get( SDRATTR_GRAFMODE ) ).GetValue() );
1404cdf0e10cSrcweir 	aGrafInfo.SetCrop( rCrop.GetLeft(), rCrop.GetTop(), rCrop.GetRight(), rCrop.GetBottom() );
1405cdf0e10cSrcweir 
1406cdf0e10cSrcweir 	SetXPolyDirty();
1407cdf0e10cSrcweir 	SetRectsDirty();
1408cdf0e10cSrcweir }
1409cdf0e10cSrcweir 
1410cdf0e10cSrcweir // -----------------------------------------------------------------------------
1411cdf0e10cSrcweir 
1412cdf0e10cSrcweir void SdrGrafObj::ImpSetGrafInfoToAttr()
1413cdf0e10cSrcweir {
1414cdf0e10cSrcweir 	SetObjectItem( SdrGrafLuminanceItem( aGrafInfo.GetLuminance() ) );
1415cdf0e10cSrcweir 	SetObjectItem( SdrGrafContrastItem( aGrafInfo.GetContrast() ) );
1416cdf0e10cSrcweir 	SetObjectItem( SdrGrafRedItem( aGrafInfo.GetChannelR() ) );
1417cdf0e10cSrcweir 	SetObjectItem( SdrGrafGreenItem( aGrafInfo.GetChannelG() ) );
1418cdf0e10cSrcweir 	SetObjectItem( SdrGrafBlueItem( aGrafInfo.GetChannelB() ) );
1419cdf0e10cSrcweir 	SetObjectItem( SdrGrafGamma100Item( FRound( aGrafInfo.GetGamma() * 100.0 ) ) );
1420cdf0e10cSrcweir 	SetObjectItem( SdrGrafTransparenceItem( (sal_uInt16) FRound( aGrafInfo.GetTransparency() / 2.55 ) ) );
1421cdf0e10cSrcweir 	SetObjectItem( SdrGrafInvertItem( aGrafInfo.IsInvert() ) );
1422cdf0e10cSrcweir 	SetObjectItem( SdrGrafModeItem( aGrafInfo.GetDrawMode() ) );
1423cdf0e10cSrcweir 	SetObjectItem( SdrGrafCropItem( aGrafInfo.GetLeftCrop(), aGrafInfo.GetTopCrop(), aGrafInfo.GetRightCrop(), aGrafInfo.GetBottomCrop() ) );
1424cdf0e10cSrcweir }
1425cdf0e10cSrcweir 
1426cdf0e10cSrcweir // -----------------------------------------------------------------------------
1427cdf0e10cSrcweir 
1428cdf0e10cSrcweir void SdrGrafObj::AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly )
1429cdf0e10cSrcweir {
1430cdf0e10cSrcweir 	Size aSize;
1431cdf0e10cSrcweir 	Size aMaxSize( rMaxRect.GetSize() );
1432cdf0e10cSrcweir 	if ( pGraphic->GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
1433cdf0e10cSrcweir 		aSize = Application::GetDefaultDevice()->PixelToLogic( pGraphic->GetPrefSize(), MAP_100TH_MM );
1434cdf0e10cSrcweir 	else
1435cdf0e10cSrcweir 		aSize = OutputDevice::LogicToLogic( pGraphic->GetPrefSize(),
1436cdf0e10cSrcweir 										    pGraphic->GetPrefMapMode(),
1437cdf0e10cSrcweir 										    MapMode( MAP_100TH_MM ) );
1438cdf0e10cSrcweir 
1439cdf0e10cSrcweir 	if( aSize.Height() != 0 && aSize.Width() != 0 )
1440cdf0e10cSrcweir 	{
1441cdf0e10cSrcweir 		Point aPos( rMaxRect.TopLeft() );
1442cdf0e10cSrcweir 
1443cdf0e10cSrcweir 		// Falls Grafik zu gross, wird die Grafik
1444cdf0e10cSrcweir 		// in die Seite eingepasst
1445cdf0e10cSrcweir 		if ( (!bShrinkOnly                          ||
1446cdf0e10cSrcweir 	    	 ( aSize.Height() > aMaxSize.Height() ) ||
1447cdf0e10cSrcweir 		 	( aSize.Width()  > aMaxSize.Width()  ) )&&
1448cdf0e10cSrcweir 		 	aSize.Height() && aMaxSize.Height() )
1449cdf0e10cSrcweir 		{
1450cdf0e10cSrcweir 			float fGrfWH =	(float)aSize.Width() /
1451cdf0e10cSrcweir 							(float)aSize.Height();
1452cdf0e10cSrcweir 			float fWinWH =	(float)aMaxSize.Width() /
1453cdf0e10cSrcweir 							(float)aMaxSize.Height();
1454cdf0e10cSrcweir 
1455cdf0e10cSrcweir 			// Grafik an Pagesize anpassen (skaliert)
1456cdf0e10cSrcweir 			if ( fGrfWH < fWinWH )
1457cdf0e10cSrcweir 			{
1458cdf0e10cSrcweir 				aSize.Width() = (long)(aMaxSize.Height() * fGrfWH);
1459cdf0e10cSrcweir 				aSize.Height()= aMaxSize.Height();
1460cdf0e10cSrcweir 			}
1461cdf0e10cSrcweir 			else if ( fGrfWH > 0.F )
1462cdf0e10cSrcweir 			{
1463cdf0e10cSrcweir 				aSize.Width() = aMaxSize.Width();
1464cdf0e10cSrcweir 				aSize.Height()= (long)(aMaxSize.Width() / fGrfWH);
1465cdf0e10cSrcweir 			}
1466cdf0e10cSrcweir 
1467cdf0e10cSrcweir 			aPos = rMaxRect.Center();
1468cdf0e10cSrcweir 		}
1469cdf0e10cSrcweir 
1470cdf0e10cSrcweir 		if( bShrinkOnly )
1471cdf0e10cSrcweir 			aPos = aRect.TopLeft();
1472cdf0e10cSrcweir 
1473cdf0e10cSrcweir 		aPos.X() -= aSize.Width() / 2;
1474cdf0e10cSrcweir 		aPos.Y() -= aSize.Height() / 2;
1475cdf0e10cSrcweir 		SetLogicRect( Rectangle( aPos, aSize ) );
1476cdf0e10cSrcweir 	}
1477cdf0e10cSrcweir }
1478cdf0e10cSrcweir 
1479cdf0e10cSrcweir // -----------------------------------------------------------------------------
1480cdf0e10cSrcweir 
1481cdf0e10cSrcweir IMPL_LINK( SdrGrafObj, ImpSwapHdl, GraphicObject*, pO )
1482cdf0e10cSrcweir {
1483cdf0e10cSrcweir 	SvStream* pRet = GRFMGR_AUTOSWAPSTREAM_NONE;
1484cdf0e10cSrcweir 
1485cdf0e10cSrcweir 	if( pO->IsInSwapOut() )
1486cdf0e10cSrcweir 	{
1487cdf0e10cSrcweir 		if( pModel && !mbIsPreview && pModel->IsSwapGraphics() && pGraphic->GetSizeBytes() > 20480 )
1488cdf0e10cSrcweir 		{
1489cdf0e10cSrcweir 			// test if this object is visualized from someone
1490cdf0e10cSrcweir             // ## test only if there are VOCs other than the preview renderer
1491cdf0e10cSrcweir 			if(!GetViewContact().HasViewObjectContacts(true))
1492cdf0e10cSrcweir 			{
1493cdf0e10cSrcweir 				const sal_uIntPtr	nSwapMode = pModel->GetSwapGraphicsMode();
1494cdf0e10cSrcweir 
1495cdf0e10cSrcweir 				if( ( pGraphic->HasUserData() || pGraphicLink ) &&
1496cdf0e10cSrcweir 					( nSwapMode & SDR_SWAPGRAPHICSMODE_PURGE ) )
1497cdf0e10cSrcweir 				{
1498cdf0e10cSrcweir 					pRet = GRFMGR_AUTOSWAPSTREAM_LINK;
1499cdf0e10cSrcweir 				}
1500cdf0e10cSrcweir 				else if( nSwapMode & SDR_SWAPGRAPHICSMODE_TEMP )
1501cdf0e10cSrcweir 				{
1502cdf0e10cSrcweir 					pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1503cdf0e10cSrcweir 					pGraphic->SetUserData();
1504cdf0e10cSrcweir 				}
1505cdf0e10cSrcweir 
1506cdf0e10cSrcweir 				// #i102380#
1507cdf0e10cSrcweir 				sdr::contact::ViewContactOfGraphic* pVC = dynamic_cast< sdr::contact::ViewContactOfGraphic* >(&GetViewContact());
1508cdf0e10cSrcweir 
1509cdf0e10cSrcweir 				if(pVC)
1510cdf0e10cSrcweir 				{
1511cdf0e10cSrcweir 					pVC->flushGraphicObjects();
1512cdf0e10cSrcweir 				}
1513cdf0e10cSrcweir 			}
1514cdf0e10cSrcweir 		}
1515cdf0e10cSrcweir 	}
1516cdf0e10cSrcweir 	else if( pO->IsInSwapIn() )
1517cdf0e10cSrcweir 	{
1518cdf0e10cSrcweir 		// kann aus dem original Doc-Stream nachgeladen werden...
1519cdf0e10cSrcweir 		if( pModel != NULL )
1520cdf0e10cSrcweir 		{
1521cdf0e10cSrcweir 			if( pGraphic->HasUserData() )
1522cdf0e10cSrcweir 			{
1523cdf0e10cSrcweir 				SdrDocumentStreamInfo aStreamInfo;
1524cdf0e10cSrcweir 
1525cdf0e10cSrcweir 				aStreamInfo.mbDeleteAfterUse = sal_False;
1526cdf0e10cSrcweir 				aStreamInfo.maUserData = pGraphic->GetUserData();
1527cdf0e10cSrcweir 
1528cdf0e10cSrcweir 				SvStream* pStream = pModel->GetDocumentStream( aStreamInfo );
1529cdf0e10cSrcweir 
1530cdf0e10cSrcweir 				if( pStream != NULL )
1531cdf0e10cSrcweir 				{
1532cdf0e10cSrcweir 					Graphic aGraphic;
1533cdf0e10cSrcweir 
1534cdf0e10cSrcweir                     com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >* pFilterData = NULL;
1535cdf0e10cSrcweir 
1536cdf0e10cSrcweir 					if(mbInsidePaint && !GetViewContact().HasViewObjectContacts(true))
1537cdf0e10cSrcweir                     {
1538cdf0e10cSrcweir                         pFilterData = new com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >( 3 );
1539cdf0e10cSrcweir 
1540*d2c409beSOliver-Rainer Wittmann                         const com::sun::star::awt::Size aPreviewSizeHint( 64, 64 );
1541*d2c409beSOliver-Rainer Wittmann                         const sal_Bool bAllowPartialStreamRead = sal_True;
1542*d2c409beSOliver-Rainer Wittmann                         // create <GfxLink> instance also for previews in order to avoid that its corresponding
1543*d2c409beSOliver-Rainer Wittmann                         // data is cleared in the graphic cache entry in case that the preview data equals the complete graphic data
1544*d2c409beSOliver-Rainer Wittmann                         const sal_Bool bCreateNativeLink = sal_True;
1545cdf0e10cSrcweir                         (*pFilterData)[ 0 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "PreviewSizeHint" ) );
1546cdf0e10cSrcweir                         (*pFilterData)[ 0 ].Value <<= aPreviewSizeHint;
1547cdf0e10cSrcweir                         (*pFilterData)[ 1 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "AllowPartialStreamRead" ) );
1548cdf0e10cSrcweir                         (*pFilterData)[ 1 ].Value <<= bAllowPartialStreamRead;
1549cdf0e10cSrcweir                         (*pFilterData)[ 2 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "CreateNativeLink" ) );
1550cdf0e10cSrcweir                         (*pFilterData)[ 2 ].Value <<= bCreateNativeLink;
1551cdf0e10cSrcweir 
1552cdf0e10cSrcweir                         mbIsPreview = sal_True;
1553cdf0e10cSrcweir                     }
1554cdf0e10cSrcweir 
1555ddde725dSArmin Le Grand                     if(!GraphicFilter::GetGraphicFilter()->ImportGraphic(
1556ddde725dSArmin Le Grand                         aGraphic, aStreamInfo.maUserData, *pStream,
1557cdf0e10cSrcweir                         GRFILTER_FORMAT_DONTKNOW, NULL, 0, pFilterData))
1558cdf0e10cSrcweir                     {
1559cdf0e10cSrcweir                         const String aUserData( pGraphic->GetUserData() );
1560cdf0e10cSrcweir 
1561cdf0e10cSrcweir                         pGraphic->SetGraphic( aGraphic );
1562cdf0e10cSrcweir                         pGraphic->SetUserData( aUserData );
1563cdf0e10cSrcweir 
1564cdf0e10cSrcweir                         // #142146# Graphic successfully swapped in.
1565cdf0e10cSrcweir                         pRet = GRFMGR_AUTOSWAPSTREAM_LOADED;
1566cdf0e10cSrcweir                     }
1567cdf0e10cSrcweir                     delete pFilterData;
1568cdf0e10cSrcweir 
1569cdf0e10cSrcweir                     pStream->ResetError();
1570cdf0e10cSrcweir 
1571cdf0e10cSrcweir                     if( aStreamInfo.mbDeleteAfterUse || aStreamInfo.mxStorageRef.is() )
1572cdf0e10cSrcweir                     {
1573cdf0e10cSrcweir                         if ( aStreamInfo.mxStorageRef.is() )
1574cdf0e10cSrcweir                         {
1575cdf0e10cSrcweir                             aStreamInfo.mxStorageRef->dispose();
1576cdf0e10cSrcweir                             aStreamInfo.mxStorageRef = 0;
1577cdf0e10cSrcweir                         }
1578cdf0e10cSrcweir 
1579cdf0e10cSrcweir                         delete pStream;
1580cdf0e10cSrcweir                     }
1581cdf0e10cSrcweir                 }
1582cdf0e10cSrcweir 			}
1583cdf0e10cSrcweir 			else if( !ImpUpdateGraphicLink( sal_False ) )
1584cdf0e10cSrcweir             {
1585cdf0e10cSrcweir 				pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1586cdf0e10cSrcweir             }
1587cdf0e10cSrcweir 			else
1588cdf0e10cSrcweir             {
1589cdf0e10cSrcweir                 pRet = GRFMGR_AUTOSWAPSTREAM_LOADED;
1590cdf0e10cSrcweir             }
1591cdf0e10cSrcweir 		}
1592cdf0e10cSrcweir 		else
1593cdf0e10cSrcweir 			pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1594cdf0e10cSrcweir 	}
1595cdf0e10cSrcweir 
1596cdf0e10cSrcweir 	return (long)(void*) pRet;
1597cdf0e10cSrcweir }
1598cdf0e10cSrcweir 
1599cdf0e10cSrcweir // -----------------------------------------------------------------------------
1600cdf0e10cSrcweir 
1601cdf0e10cSrcweir // #111096#
1602cdf0e10cSrcweir // Access to GrafAnimationAllowed flag
1603cdf0e10cSrcweir sal_Bool SdrGrafObj::IsGrafAnimationAllowed() const
1604cdf0e10cSrcweir {
1605cdf0e10cSrcweir 	return mbGrafAnimationAllowed;
1606cdf0e10cSrcweir }
1607cdf0e10cSrcweir 
1608cdf0e10cSrcweir void SdrGrafObj::SetGrafAnimationAllowed(sal_Bool bNew)
1609cdf0e10cSrcweir {
1610cdf0e10cSrcweir 	if(mbGrafAnimationAllowed != bNew)
1611cdf0e10cSrcweir 	{
1612cdf0e10cSrcweir 		mbGrafAnimationAllowed = bNew;
1613cdf0e10cSrcweir 		ActionChanged();
1614cdf0e10cSrcweir 	}
1615cdf0e10cSrcweir }
1616cdf0e10cSrcweir 
1617cdf0e10cSrcweir // #i25616#
1618cdf0e10cSrcweir sal_Bool SdrGrafObj::IsObjectTransparent() const
1619cdf0e10cSrcweir {
1620cdf0e10cSrcweir 	if(((const SdrGrafTransparenceItem&)GetObjectItem(SDRATTR_GRAFTRANSPARENCE)).GetValue()
1621cdf0e10cSrcweir 		|| pGraphic->IsTransparent())
1622cdf0e10cSrcweir 	{
1623cdf0e10cSrcweir 		return sal_True;
1624cdf0e10cSrcweir 	}
1625cdf0e10cSrcweir 
1626cdf0e10cSrcweir 	return sal_False;
1627cdf0e10cSrcweir }
1628cdf0e10cSrcweir 
1629cdf0e10cSrcweir Reference< XInputStream > SdrGrafObj::getInputStream()
1630cdf0e10cSrcweir {
1631cdf0e10cSrcweir 	Reference< XInputStream > xStream;
1632cdf0e10cSrcweir 
1633cdf0e10cSrcweir 	if( pModel )
1634cdf0e10cSrcweir 	{
1635cdf0e10cSrcweir //		if( !pGraphic->HasUserData() )
1636cdf0e10cSrcweir //			pGraphic->SwapOut();
1637cdf0e10cSrcweir 
1638cdf0e10cSrcweir 		// kann aus dem original Doc-Stream nachgeladen werden...
1639cdf0e10cSrcweir 		if( pGraphic->HasUserData() )
1640cdf0e10cSrcweir 		{
1641cdf0e10cSrcweir 			SdrDocumentStreamInfo aStreamInfo;
1642cdf0e10cSrcweir 
1643cdf0e10cSrcweir 			aStreamInfo.mbDeleteAfterUse = sal_False;
1644cdf0e10cSrcweir 			aStreamInfo.maUserData = pGraphic->GetUserData();
1645cdf0e10cSrcweir 
1646cdf0e10cSrcweir 			SvStream* pStream = pModel->GetDocumentStream( aStreamInfo );
1647cdf0e10cSrcweir 
1648cdf0e10cSrcweir 			if( pStream )
1649cdf0e10cSrcweir 				xStream.set( new utl::OInputStreamWrapper( pStream, sal_True ) );
1650cdf0e10cSrcweir 		}
1651cdf0e10cSrcweir 		else if( pGraphic && GetGraphic().IsLink() )
1652cdf0e10cSrcweir 		{
1653cdf0e10cSrcweir 			Graphic aGraphic( GetGraphic() );
1654cdf0e10cSrcweir 			GfxLink aLink( aGraphic.GetLink() );
1655cdf0e10cSrcweir 			sal_uInt32 nSize = aLink.GetDataSize();
1656cdf0e10cSrcweir 			const void* pSourceData = (const void*)aLink.GetData();
1657cdf0e10cSrcweir 			if( nSize && pSourceData )
1658cdf0e10cSrcweir 			{
1659cdf0e10cSrcweir 				sal_uInt8 * pBuffer = new sal_uInt8[ nSize ];
1660cdf0e10cSrcweir 				if( pBuffer )
1661cdf0e10cSrcweir 				{
1662cdf0e10cSrcweir 					memcpy( pBuffer, pSourceData, nSize );
1663cdf0e10cSrcweir 
1664cdf0e10cSrcweir 					SvMemoryStream* pStream = new SvMemoryStream( (void*)pBuffer, (sal_Size)nSize, STREAM_READ );
1665cdf0e10cSrcweir 					pStream->ObjectOwnsMemory( sal_True );
1666cdf0e10cSrcweir 					xStream.set( new utl::OInputStreamWrapper( pStream, sal_True ) );
1667cdf0e10cSrcweir 				}
1668cdf0e10cSrcweir 			}
1669cdf0e10cSrcweir 		}
1670cdf0e10cSrcweir 
1671cdf0e10cSrcweir 		if( !xStream.is() && aFileName.Len() )
1672cdf0e10cSrcweir 		{
1673cdf0e10cSrcweir 			SvFileStream* pStream = new SvFileStream( aFileName, STREAM_READ );
1674cdf0e10cSrcweir 			if( pStream )
1675cdf0e10cSrcweir 				xStream.set( new utl::OInputStreamWrapper( pStream ) );
1676cdf0e10cSrcweir 		}
1677cdf0e10cSrcweir 	}
1678cdf0e10cSrcweir 
1679cdf0e10cSrcweir 	return xStream;
1680cdf0e10cSrcweir }
1681cdf0e10cSrcweir 
1682414a0e15SArmin Le Grand // moved crop handle creation here; this is the object type using them
1683414a0e15SArmin Le Grand void SdrGrafObj::addCropHandles(SdrHdlList& rTarget) const
1684414a0e15SArmin Le Grand {
1685414a0e15SArmin Le Grand     basegfx::B2DHomMatrix aMatrix;
1686414a0e15SArmin Le Grand     basegfx::B2DPolyPolygon aPolyPolygon;
1687414a0e15SArmin Le Grand 
1688414a0e15SArmin Le Grand     // get object transformation
1689414a0e15SArmin Le Grand     TRGetBaseGeometry(aMatrix, aPolyPolygon);
1690414a0e15SArmin Le Grand 
1691414a0e15SArmin Le Grand     // part of object transformation correction, but used later, so defined outside next scope
1692414a0e15SArmin Le Grand     double fShearX(0.0), fRotate(0.0);
1693414a0e15SArmin Le Grand 
1694414a0e15SArmin Le Grand     {   // TTTT correct shear, it comes currently mirrored from TRGetBaseGeometry, can be removed with aw080
1695414a0e15SArmin Le Grand         basegfx::B2DTuple aScale;
1696414a0e15SArmin Le Grand         basegfx::B2DTuple aTranslate;
1697414a0e15SArmin Le Grand 
1698414a0e15SArmin Le Grand         aMatrix.decompose(aScale, aTranslate, fRotate, fShearX);
1699414a0e15SArmin Le Grand 
1700414a0e15SArmin Le Grand         if(!basegfx::fTools::equalZero(fShearX))
1701414a0e15SArmin Le Grand         {
1702414a0e15SArmin Le Grand             // shearX is used, correct it
1703414a0e15SArmin Le Grand             fShearX = -fShearX;
1704414a0e15SArmin Le Grand         }
1705414a0e15SArmin Le Grand 
1706414a0e15SArmin Le Grand         aMatrix = basegfx::tools::createScaleShearXRotateTranslateB2DHomMatrix(
1707414a0e15SArmin Le Grand             aScale,
1708414a0e15SArmin Le Grand             fShearX,
1709414a0e15SArmin Le Grand             fRotate,
1710414a0e15SArmin Le Grand             aTranslate);
1711414a0e15SArmin Le Grand     }
1712414a0e15SArmin Le Grand 
1713414a0e15SArmin Le Grand     // get crop values
1714414a0e15SArmin Le Grand     const SdrGrafCropItem& rCrop = static_cast< const SdrGrafCropItem& >(GetMergedItem(SDRATTR_GRAFCROP));
1715414a0e15SArmin Le Grand 
1716414a0e15SArmin Le Grand     if(rCrop.GetLeft() || rCrop.GetTop() || rCrop.GetRight() ||rCrop.GetBottom())
1717414a0e15SArmin Le Grand     {
1718414a0e15SArmin Le Grand         // decompose object transformation to have current translate and scale
1719414a0e15SArmin Le Grand         basegfx::B2DVector aScale, aTranslate;
1720414a0e15SArmin Le Grand         double fRotate, fShearX;
1721414a0e15SArmin Le Grand 
1722414a0e15SArmin Le Grand         aMatrix.decompose(aScale, aTranslate, fRotate, fShearX);
1723414a0e15SArmin Le Grand 
1724414a0e15SArmin Le Grand         if(!aScale.equalZero())
1725414a0e15SArmin Le Grand         {
1726414a0e15SArmin Le Grand             // get crop scale
1727414a0e15SArmin Le Grand             const basegfx::B2DVector aCropScaleFactor(
1728414a0e15SArmin Le Grand                 GetGraphicObject().calculateCropScaling(
1729414a0e15SArmin Le Grand                     aScale.getX(),
1730414a0e15SArmin Le Grand                     aScale.getY(),
1731414a0e15SArmin Le Grand                     rCrop.GetLeft(),
1732414a0e15SArmin Le Grand                     rCrop.GetTop(),
1733414a0e15SArmin Le Grand                     rCrop.GetRight(),
1734414a0e15SArmin Le Grand                     rCrop.GetBottom()));
1735414a0e15SArmin Le Grand 
1736414a0e15SArmin Le Grand             // apply crop scale
1737414a0e15SArmin Le Grand             const double fCropLeft(rCrop.GetLeft() * aCropScaleFactor.getX());
1738414a0e15SArmin Le Grand             const double fCropTop(rCrop.GetTop() * aCropScaleFactor.getY());
1739414a0e15SArmin Le Grand             const double fCropRight(rCrop.GetRight() * aCropScaleFactor.getX());
1740414a0e15SArmin Le Grand             const double fCropBottom(rCrop.GetBottom() * aCropScaleFactor.getY());
1741414a0e15SArmin Le Grand             basegfx::B2DHomMatrix aMatrixForCropViewHdl(aMatrix);
1742414a0e15SArmin Le Grand 
1743414a0e15SArmin Le Grand             if(IsMirrored())
1744414a0e15SArmin Le Grand             {
1745414a0e15SArmin Le Grand                 // create corrected new matrix, TTTT can be removed with aw080
1746414a0e15SArmin Le Grand                 // the old mirror only can mirror horizontally; the vertical mirror
1747414a0e15SArmin Le Grand                 // is faked by using the horizontal and 180 degree rotation. Since
1748414a0e15SArmin Le Grand                 // the object can be rotated differently from 180 degree, this is
1749414a0e15SArmin Le Grand                 // not safe to detect. Just correct horizontal mirror (which is
1750414a0e15SArmin Le Grand                 // in IsMirrored()) and keep the rotation angle
1751414a0e15SArmin Le Grand                 // caution: Do not modify aMatrix, it is used below to calculate
1752414a0e15SArmin Le Grand                 // the exact handle positions
1753414a0e15SArmin Le Grand                 basegfx::B2DHomMatrix aPreMultiply;
1754414a0e15SArmin Le Grand 
1755414a0e15SArmin Le Grand                 // mirrored X, apply
1756414a0e15SArmin Le Grand                 aPreMultiply.translate(-0.5, 0.0);
1757414a0e15SArmin Le Grand                 aPreMultiply.scale(-1.0, 1.0);
1758414a0e15SArmin Le Grand                 aPreMultiply.translate(0.5, 0.0);
1759414a0e15SArmin Le Grand 
1760414a0e15SArmin Le Grand                 aMatrixForCropViewHdl = aMatrixForCropViewHdl * aPreMultiply;
1761414a0e15SArmin Le Grand             }
1762414a0e15SArmin Le Grand 
1763414a0e15SArmin Le Grand             rTarget.AddHdl(
1764414a0e15SArmin Le Grand                 new SdrCropViewHdl(
1765414a0e15SArmin Le Grand                     aMatrixForCropViewHdl,
1766414a0e15SArmin Le Grand                     GetGraphicObject().GetGraphic(),
1767414a0e15SArmin Le Grand                     fCropLeft,
1768414a0e15SArmin Le Grand                     fCropTop,
1769414a0e15SArmin Le Grand                     fCropRight,
1770414a0e15SArmin Le Grand                     fCropBottom));
1771414a0e15SArmin Le Grand         }
1772414a0e15SArmin Le Grand     }
1773414a0e15SArmin Le Grand 
1774414a0e15SArmin Le Grand     basegfx::B2DPoint aPos;
1775414a0e15SArmin Le Grand 
1776414a0e15SArmin Le Grand     aPos = aMatrix * basegfx::B2DPoint(0.0, 0.0);
1777414a0e15SArmin Le Grand     rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_UPLFT, fShearX, fRotate));
1778414a0e15SArmin Le Grand     aPos = aMatrix * basegfx::B2DPoint(0.5, 0.0);
1779414a0e15SArmin Le Grand     rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_UPPER, fShearX, fRotate));
1780414a0e15SArmin Le Grand     aPos = aMatrix * basegfx::B2DPoint(1.0, 0.0);
1781414a0e15SArmin Le Grand     rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_UPRGT, fShearX, fRotate));
1782414a0e15SArmin Le Grand     aPos = aMatrix * basegfx::B2DPoint(0.0, 0.5);
1783414a0e15SArmin Le Grand     rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_LEFT , fShearX, fRotate));
1784414a0e15SArmin Le Grand     aPos = aMatrix * basegfx::B2DPoint(1.0, 0.5);
1785414a0e15SArmin Le Grand     rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_RIGHT, fShearX, fRotate));
1786414a0e15SArmin Le Grand     aPos = aMatrix * basegfx::B2DPoint(0.0, 1.0);
1787414a0e15SArmin Le Grand     rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_LWLFT, fShearX, fRotate));
1788414a0e15SArmin Le Grand     aPos = aMatrix * basegfx::B2DPoint(0.5, 1.0);
1789414a0e15SArmin Le Grand     rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_LOWER, fShearX, fRotate));
1790414a0e15SArmin Le Grand     aPos = aMatrix * basegfx::B2DPoint(1.0, 1.0);
1791414a0e15SArmin Le Grand     rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_LWRGT, fShearX, fRotate));
1792414a0e15SArmin Le Grand }
1793414a0e15SArmin Le Grand 
1794cdf0e10cSrcweir // eof
1795