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
10f6e50924SAndrew Rist *
11f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12f6e50924SAndrew Rist *
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.
19f6e50924SAndrew Rist *
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
getCacheTimeInMs()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
ImpLoadLinkedGraphic(const String aFileName,const String aFilterName)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
15386e1cf34SPedro Giffuni // that it is a SVG graphic, but only because no one 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
Connect()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
GraphicLinkChanged(const String & rFileName)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
SdrGraphicUpdater(const String & rFileName,const String & rFilterName,SdrGraphicLink & rGraphicLink)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
~SdrGraphicUpdater(void)219cdf0e10cSrcweir SdrGraphicUpdater::~SdrGraphicUpdater( void )
220cdf0e10cSrcweir {
221cdf0e10cSrcweir }
222cdf0e10cSrcweir
Terminate()223cdf0e10cSrcweir void SdrGraphicUpdater::Terminate()
224cdf0e10cSrcweir {
225cdf0e10cSrcweir mbIsTerminated = sal_True;
226cdf0e10cSrcweir }
227cdf0e10cSrcweir
onTerminated(void)228cdf0e10cSrcweir void SAL_CALL SdrGraphicUpdater::onTerminated(void)
229cdf0e10cSrcweir {
230cdf0e10cSrcweir delete this;
231cdf0e10cSrcweir }
232cdf0e10cSrcweir
run(void)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
SdrGraphicLink(SdrGrafObj * pObj)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
~SdrGraphicLink()256cdf0e10cSrcweir SdrGraphicLink::~SdrGraphicLink()
257cdf0e10cSrcweir {
258cdf0e10cSrcweir if ( pGraphicUpdater )
259cdf0e10cSrcweir pGraphicUpdater->Terminate();
260cdf0e10cSrcweir }
261cdf0e10cSrcweir
262cdf0e10cSrcweir // -----------------------------------------------------------------------------
263cdf0e10cSrcweir
DataChanged(const Graphic & rGraphic)264cdf0e10cSrcweir void SdrGraphicLink::DataChanged( const Graphic& rGraphic )
265cdf0e10cSrcweir {
266cdf0e10cSrcweir pGrafObj->ImpSetLinkedGraphic( rGraphic );
267cdf0e10cSrcweir }
268cdf0e10cSrcweir
269cdf0e10cSrcweir // -----------------------------------------------------------------------------
270cdf0e10cSrcweir
RemoveGraphicUpdater()271cdf0e10cSrcweir void SdrGraphicLink::RemoveGraphicUpdater()
272cdf0e10cSrcweir {
273cdf0e10cSrcweir pGraphicUpdater = NULL;
274cdf0e10cSrcweir }
275cdf0e10cSrcweir
276cdf0e10cSrcweir // -----------------------------------------------------------------------------
277cdf0e10cSrcweir
DataChanged(const String & rMimeType,const::com::sun::star::uno::Any & rValue)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
Closed()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
UpdateAsynchron()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
CreateObjectSpecificProperties()339cdf0e10cSrcweir sdr::properties::BaseProperties* SdrGrafObj::CreateObjectSpecificProperties()
340cdf0e10cSrcweir {
341cdf0e10cSrcweir return new sdr::properties::GraphicProperties(*this);
342cdf0e10cSrcweir }
343cdf0e10cSrcweir
344cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
345cdf0e10cSrcweir // DrawContact section
346cdf0e10cSrcweir
CreateObjectSpecificViewContact()347cdf0e10cSrcweir sdr::contact::ViewContact* SdrGrafObj::CreateObjectSpecificViewContact()
348cdf0e10cSrcweir {
349cdf0e10cSrcweir return new sdr::contact::ViewContactOfGraphic(*this);
350cdf0e10cSrcweir }
351cdf0e10cSrcweir
352172c67b2SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
353172c67b2SArmin Le Grand // check if SVG and if try to get ObjectInfoPrimitive2D and extract info
354172c67b2SArmin Le Grand
onGraphicChanged()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
404cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
405cdf0e10cSrcweir
406cdf0e10cSrcweir TYPEINIT1(SdrGrafObj,SdrRectObj);
407cdf0e10cSrcweir
408cdf0e10cSrcweir // -----------------------------------------------------------------------------
409cdf0e10cSrcweir
SdrGrafObj()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
SdrGrafObj(const Graphic & rGrf,const Rectangle & rRect)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
SdrGrafObj(const Graphic & rGrf)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
~SdrGrafObj()491cdf0e10cSrcweir SdrGrafObj::~SdrGrafObj()
492cdf0e10cSrcweir {
493cdf0e10cSrcweir delete pGraphic;
494ddde725dSArmin Le Grand delete mpReplacementGraphic;
495cdf0e10cSrcweir ImpLinkAbmeldung();
496cdf0e10cSrcweir }
497cdf0e10cSrcweir
498cdf0e10cSrcweir // -----------------------------------------------------------------------------
499cdf0e10cSrcweir
SetGraphicObject(const GraphicObject & rGrfObj)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
GetGraphicObject(bool bForceSwapIn) const515cdf0e10cSrcweir const GraphicObject& SdrGrafObj::GetGraphicObject(bool bForceSwapIn) const
516cdf0e10cSrcweir {
517cdf0e10cSrcweir if(bForceSwapIn)
518cdf0e10cSrcweir {
519cdf0e10cSrcweir ForceSwapIn();
520cdf0e10cSrcweir }
521cdf0e10cSrcweir
522cdf0e10cSrcweir return *pGraphic;
523cdf0e10cSrcweir }
524cdf0e10cSrcweir
GetReplacementGraphicObject() const525ddde725dSArmin 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
NbcSetGraphic(const Graphic & rGrf)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
SetGraphic(const Graphic & rGrf)552cdf0e10cSrcweir void SdrGrafObj::SetGraphic( const Graphic& rGrf )
553cdf0e10cSrcweir {
554cdf0e10cSrcweir NbcSetGraphic(rGrf);
555cdf0e10cSrcweir SetChanged();
556cdf0e10cSrcweir BroadcastObjectChange();
557cdf0e10cSrcweir }
558cdf0e10cSrcweir
559cdf0e10cSrcweir // -----------------------------------------------------------------------------
560cdf0e10cSrcweir
GetGraphic() const561cdf0e10cSrcweir const Graphic& SdrGrafObj::GetGraphic() const
562cdf0e10cSrcweir {
563cdf0e10cSrcweir ForceSwapIn();
564cdf0e10cSrcweir return pGraphic->GetGraphic();
565cdf0e10cSrcweir }
566cdf0e10cSrcweir
567cdf0e10cSrcweir // -----------------------------------------------------------------------------
568cdf0e10cSrcweir
GetTransformedGraphic(sal_uIntPtr nTransformFlags) const569cdf0e10cSrcweir 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
GetGraphicType() const611cdf0e10cSrcweir GraphicType SdrGrafObj::GetGraphicType() const
612cdf0e10cSrcweir {
613cdf0e10cSrcweir return pGraphic->GetType();
614cdf0e10cSrcweir }
615cdf0e10cSrcweir
IsAnimated() const616cdf0e10cSrcweir sal_Bool SdrGrafObj::IsAnimated() const
617cdf0e10cSrcweir {
618cdf0e10cSrcweir return pGraphic->IsAnimated();
619cdf0e10cSrcweir }
620cdf0e10cSrcweir
IsEPS() const621cdf0e10cSrcweir sal_Bool SdrGrafObj::IsEPS() const
622cdf0e10cSrcweir {
623cdf0e10cSrcweir return pGraphic->IsEPS();
624cdf0e10cSrcweir }
625cdf0e10cSrcweir
IsSwappedOut() const626cdf0e10cSrcweir sal_Bool SdrGrafObj::IsSwappedOut() const
627cdf0e10cSrcweir {
628cdf0e10cSrcweir return mbIsPreview ? sal_True : pGraphic->IsSwappedOut();
629cdf0e10cSrcweir }
630cdf0e10cSrcweir
GetGrafPrefMapMode() const631cdf0e10cSrcweir const MapMode& SdrGrafObj::GetGrafPrefMapMode() const
632cdf0e10cSrcweir {
633cdf0e10cSrcweir return pGraphic->GetPrefMapMode();
634cdf0e10cSrcweir }
635cdf0e10cSrcweir
GetGrafPrefSize() const636cdf0e10cSrcweir const Size& SdrGrafObj::GetGrafPrefSize() const
637cdf0e10cSrcweir {
638cdf0e10cSrcweir return pGraphic->GetPrefSize();
639cdf0e10cSrcweir }
640cdf0e10cSrcweir
641cdf0e10cSrcweir // -----------------------------------------------------------------------------
642cdf0e10cSrcweir
SetGrafStreamURL(const String & rGraphicStreamURL)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
GetGrafStreamURL() const662cdf0e10cSrcweir String SdrGrafObj::GetGrafStreamURL() const
663cdf0e10cSrcweir {
664cdf0e10cSrcweir return pGraphic->GetUserData();
665cdf0e10cSrcweir }
666cdf0e10cSrcweir
667cdf0e10cSrcweir // -----------------------------------------------------------------------------
668cdf0e10cSrcweir
SetFileName(const String & rFileName)669cdf0e10cSrcweir void SdrGrafObj::SetFileName(const String& rFileName)
670cdf0e10cSrcweir {
671cdf0e10cSrcweir aFileName = rFileName;
672cdf0e10cSrcweir SetChanged();
673cdf0e10cSrcweir }
674cdf0e10cSrcweir
675cdf0e10cSrcweir // -----------------------------------------------------------------------------
676cdf0e10cSrcweir
SetFilterName(const String & rFilterName)677cdf0e10cSrcweir void SdrGrafObj::SetFilterName(const String& rFilterName)
678cdf0e10cSrcweir {
679cdf0e10cSrcweir aFilterName = rFilterName;
680cdf0e10cSrcweir SetChanged();
681cdf0e10cSrcweir }
682cdf0e10cSrcweir
683cdf0e10cSrcweir // -----------------------------------------------------------------------------
684cdf0e10cSrcweir
ForceSwapIn() const685cdf0e10cSrcweir 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
ForceSwapOut() const716cdf0e10cSrcweir void SdrGrafObj::ForceSwapOut() const
717cdf0e10cSrcweir {
718cdf0e10cSrcweir pGraphic->FireSwapOutRequest();
719cdf0e10cSrcweir }
720cdf0e10cSrcweir
721cdf0e10cSrcweir // -----------------------------------------------------------------------------
722cdf0e10cSrcweir
ImpLinkAnmeldung()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
ImpLinkAbmeldung()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
SetGraphicLink(const String & rFileName,const String & rFilterName)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
ReleaseGraphicLink()768cdf0e10cSrcweir void SdrGrafObj::ReleaseGraphicLink()
769cdf0e10cSrcweir {
770cdf0e10cSrcweir ImpLinkAbmeldung();
771cdf0e10cSrcweir aFileName = String();
772cdf0e10cSrcweir aFilterName = String();
773cdf0e10cSrcweir }
774cdf0e10cSrcweir
775cdf0e10cSrcweir // -----------------------------------------------------------------------------
776cdf0e10cSrcweir
TakeObjInfo(SdrObjTransformInfoRec & rInfo) const777cdf0e10cSrcweir 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
797a5258243SPedro Giffuni 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
GetObjIdentifier() const807cdf0e10cSrcweir 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 */
ImpUpdateGraphicLink(sal_Bool bAsynchron) const817cdf0e10cSrcweir sal_Bool SdrGrafObj::ImpUpdateGraphicLink( sal_Bool bAsynchron ) const
818cdf0e10cSrcweir {
819cdf0e10cSrcweir sal_Bool bRet = sal_False;
820cdf0e10cSrcweir if( pGraphicLink )
821cdf0e10cSrcweir {
822*3e413e36SArrigo Marchiori sfx2::LinkManager *linkMgr = pGraphicLink->GetLinkManager();
823*3e413e36SArrigo Marchiori if ((linkMgr == NULL) || (linkMgr->GetUserAllowsLinkUpdate(NULL))) {
824*3e413e36SArrigo Marchiori if ( bAsynchron )
825*3e413e36SArrigo Marchiori pGraphicLink->UpdateAsynchron();
826*3e413e36SArrigo Marchiori else
827*3e413e36SArrigo Marchiori pGraphicLink->DataChanged( ImpLoadLinkedGraphic( aFileName, aFilterName ) );
828*3e413e36SArrigo Marchiori } // else links shall not be updated
829cdf0e10cSrcweir bRet = sal_True;
830cdf0e10cSrcweir }
831cdf0e10cSrcweir return bRet;
832cdf0e10cSrcweir }
833cdf0e10cSrcweir
834cdf0e10cSrcweir // -----------------------------------------------------------------------------
835cdf0e10cSrcweir
ImpSetLinkedGraphic(const Graphic & rGraphic)836cdf0e10cSrcweir void SdrGrafObj::ImpSetLinkedGraphic( const Graphic& rGraphic )
837cdf0e10cSrcweir {
838cdf0e10cSrcweir const sal_Bool bIsChanged = GetModel()->IsChanged();
839cdf0e10cSrcweir NbcSetGraphic( rGraphic );
840cdf0e10cSrcweir ActionChanged();
841cdf0e10cSrcweir BroadcastObjectChange();
842cdf0e10cSrcweir GetModel()->SetChanged( bIsChanged );
843cdf0e10cSrcweir }
844cdf0e10cSrcweir
845cdf0e10cSrcweir // -----------------------------------------------------------------------------
846cdf0e10cSrcweir
TakeObjNameSingul(XubString & rName) const847cdf0e10cSrcweir void SdrGrafObj::TakeObjNameSingul(XubString& rName) const
848cdf0e10cSrcweir {
849ddde725dSArmin Le Grand if(pGraphic)
850ddde725dSArmin Le Grand {
851ddde725dSArmin Le Grand const SvgDataPtr& rSvgDataPtr = pGraphic->GetGraphic().getSvgData();
852cdf0e10cSrcweir
853ddde725dSArmin Le Grand if(rSvgDataPtr.get())
854ddde725dSArmin Le Grand {
855ddde725dSArmin Le Grand rName = ImpGetResStr(STR_ObjNameSingulGRAFSVG);
856cdf0e10cSrcweir }
857ddde725dSArmin Le Grand else
858ddde725dSArmin Le Grand {
859ddde725dSArmin Le Grand switch( pGraphic->GetType() )
860ddde725dSArmin Le Grand {
861ddde725dSArmin Le Grand case GRAPHIC_BITMAP:
862ddde725dSArmin Le Grand {
863ddde725dSArmin Le Grand const sal_uInt16 nId = ( ( pGraphic->IsTransparent() || ( (const SdrGrafTransparenceItem&) GetObjectItem( SDRATTR_GRAFTRANSPARENCE ) ).GetValue() ) ?
864ddde725dSArmin Le Grand ( IsLinkedGraphic() ? STR_ObjNameSingulGRAFBMPTRANSLNK : STR_ObjNameSingulGRAFBMPTRANS ) :
865ddde725dSArmin Le Grand ( IsLinkedGraphic() ? STR_ObjNameSingulGRAFBMPLNK : STR_ObjNameSingulGRAFBMP ) );
866cdf0e10cSrcweir
867ddde725dSArmin Le Grand rName=ImpGetResStr( nId );
868ddde725dSArmin Le Grand }
869ddde725dSArmin Le Grand break;
870cdf0e10cSrcweir
871ddde725dSArmin Le Grand case GRAPHIC_GDIMETAFILE:
872ddde725dSArmin Le Grand rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFMTFLNK : STR_ObjNameSingulGRAFMTF );
873ddde725dSArmin Le Grand break;
874cdf0e10cSrcweir
875ddde725dSArmin Le Grand case GRAPHIC_NONE:
876ddde725dSArmin Le Grand rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFNONELNK : STR_ObjNameSingulGRAFNONE );
877ddde725dSArmin Le Grand break;
878cdf0e10cSrcweir
879ddde725dSArmin Le Grand default:
880ddde725dSArmin Le Grand rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFLNK : STR_ObjNameSingulGRAF );
881ddde725dSArmin Le Grand break;
882ddde725dSArmin Le Grand }
883ddde725dSArmin Le Grand }
884cdf0e10cSrcweir
885ddde725dSArmin Le Grand const String aName(GetName());
886ddde725dSArmin Le Grand
887ddde725dSArmin Le Grand if( aName.Len() )
888ddde725dSArmin Le Grand {
889ddde725dSArmin Le Grand rName.AppendAscii( " '" );
890ddde725dSArmin Le Grand rName += aName;
891ddde725dSArmin Le Grand rName += sal_Unicode( '\'' );
892ddde725dSArmin Le Grand }
893ddde725dSArmin Le Grand }
894cdf0e10cSrcweir }
895cdf0e10cSrcweir
896cdf0e10cSrcweir // -----------------------------------------------------------------------------
897cdf0e10cSrcweir
TakeObjNamePlural(XubString & rName) const898cdf0e10cSrcweir void SdrGrafObj::TakeObjNamePlural( XubString& rName ) const
899cdf0e10cSrcweir {
900ddde725dSArmin Le Grand if(pGraphic)
901ddde725dSArmin Le Grand {
902ddde725dSArmin Le Grand const SvgDataPtr& rSvgDataPtr = pGraphic->GetGraphic().getSvgData();
903cdf0e10cSrcweir
904ddde725dSArmin Le Grand if(rSvgDataPtr.get())
905ddde725dSArmin Le Grand {
906ddde725dSArmin Le Grand rName = ImpGetResStr(STR_ObjNamePluralGRAFSVG);
907cdf0e10cSrcweir }
908ddde725dSArmin Le Grand else
909ddde725dSArmin Le Grand {
910ddde725dSArmin Le Grand switch( pGraphic->GetType() )
911ddde725dSArmin Le Grand {
912ddde725dSArmin Le Grand case GRAPHIC_BITMAP:
913ddde725dSArmin Le Grand {
914ddde725dSArmin Le Grand const sal_uInt16 nId = ( ( pGraphic->IsTransparent() || ( (const SdrGrafTransparenceItem&) GetObjectItem( SDRATTR_GRAFTRANSPARENCE ) ).GetValue() ) ?
915ddde725dSArmin Le Grand ( IsLinkedGraphic() ? STR_ObjNamePluralGRAFBMPTRANSLNK : STR_ObjNamePluralGRAFBMPTRANS ) :
916ddde725dSArmin Le Grand ( IsLinkedGraphic() ? STR_ObjNamePluralGRAFBMPLNK : STR_ObjNamePluralGRAFBMP ) );
917cdf0e10cSrcweir
918ddde725dSArmin Le Grand rName=ImpGetResStr( nId );
919ddde725dSArmin Le Grand }
920ddde725dSArmin Le Grand break;
921cdf0e10cSrcweir
922ddde725dSArmin Le Grand case GRAPHIC_GDIMETAFILE:
923ddde725dSArmin Le Grand rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFMTFLNK : STR_ObjNamePluralGRAFMTF );
924ddde725dSArmin Le Grand break;
925cdf0e10cSrcweir
926ddde725dSArmin Le Grand case GRAPHIC_NONE:
927ddde725dSArmin Le Grand rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFNONELNK : STR_ObjNamePluralGRAFNONE );
928ddde725dSArmin Le Grand break;
929cdf0e10cSrcweir
930ddde725dSArmin Le Grand default:
931ddde725dSArmin Le Grand rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFLNK : STR_ObjNamePluralGRAF );
932ddde725dSArmin Le Grand break;
933ddde725dSArmin Le Grand }
934ddde725dSArmin Le Grand }
935cdf0e10cSrcweir
936ddde725dSArmin Le Grand const String aName(GetName());
937ddde725dSArmin Le Grand
938ddde725dSArmin Le Grand if( aName.Len() )
939ddde725dSArmin Le Grand {
940ddde725dSArmin Le Grand rName.AppendAscii( " '" );
941ddde725dSArmin Le Grand rName += aName;
942ddde725dSArmin Le Grand rName += sal_Unicode( '\'' );
943ddde725dSArmin Le Grand }
944ddde725dSArmin Le Grand }
945cdf0e10cSrcweir }
946cdf0e10cSrcweir
947cdf0e10cSrcweir // -----------------------------------------------------------------------------
948cdf0e10cSrcweir
getFullDragClone() const949cdf0e10cSrcweir SdrObject* SdrGrafObj::getFullDragClone() const
950cdf0e10cSrcweir {
951cdf0e10cSrcweir // call parent
952cdf0e10cSrcweir SdrGrafObj* pRetval = static_cast< SdrGrafObj* >(SdrRectObj::getFullDragClone());
953cdf0e10cSrcweir
954cdf0e10cSrcweir // #i103116# the full drag clone leads to problems
955cdf0e10cSrcweir // with linked graphics, so reset the link in this
956cdf0e10cSrcweir // temporary interaction object and load graphic
957cdf0e10cSrcweir if(pRetval && IsLinkedGraphic())
958cdf0e10cSrcweir {
959cdf0e10cSrcweir pRetval->ForceSwapIn();
960cdf0e10cSrcweir pRetval->ReleaseGraphicLink();
961cdf0e10cSrcweir }
962cdf0e10cSrcweir
963cdf0e10cSrcweir return pRetval;
964cdf0e10cSrcweir }
965cdf0e10cSrcweir
operator =(const SdrObject & rObj)966cdf0e10cSrcweir void SdrGrafObj::operator=( const SdrObject& rObj )
967cdf0e10cSrcweir {
968cdf0e10cSrcweir SdrRectObj::operator=( rObj );
969cdf0e10cSrcweir
970cdf0e10cSrcweir const SdrGrafObj& rGraf = (SdrGrafObj&) rObj;
971cdf0e10cSrcweir
972cdf0e10cSrcweir pGraphic->SetGraphic( rGraf.GetGraphic(), &rGraf.GetGraphicObject() );
973cdf0e10cSrcweir aCropRect = rGraf.aCropRect;
974cdf0e10cSrcweir aFileName = rGraf.aFileName;
975cdf0e10cSrcweir aFilterName = rGraf.aFilterName;
976cdf0e10cSrcweir bMirrored = rGraf.bMirrored;
977cdf0e10cSrcweir
978cdf0e10cSrcweir if( rGraf.pGraphicLink != NULL)
979cdf0e10cSrcweir {
980cdf0e10cSrcweir SetGraphicLink( aFileName, aFilterName );
981cdf0e10cSrcweir }
982cdf0e10cSrcweir
983cdf0e10cSrcweir ImpSetAttrToGrafInfo();
984cdf0e10cSrcweir }
985cdf0e10cSrcweir
986cdf0e10cSrcweir // -----------------------------------------------------------------------------
987cdf0e10cSrcweir // #i25616#
988cdf0e10cSrcweir
TakeXorPoly() const989cdf0e10cSrcweir basegfx::B2DPolyPolygon SdrGrafObj::TakeXorPoly() const
990cdf0e10cSrcweir {
991cdf0e10cSrcweir if(mbInsidePaint)
992cdf0e10cSrcweir {
993cdf0e10cSrcweir basegfx::B2DPolyPolygon aRetval;
994cdf0e10cSrcweir
995cdf0e10cSrcweir // take grown rectangle
996cdf0e10cSrcweir const sal_Int32 nHalfLineWidth(ImpGetLineWdt() / 2);
997cdf0e10cSrcweir const Rectangle aGrownRect(
998cdf0e10cSrcweir aRect.Left() - nHalfLineWidth,
999cdf0e10cSrcweir aRect.Top() - nHalfLineWidth,
1000cdf0e10cSrcweir aRect.Right() + nHalfLineWidth,
1001cdf0e10cSrcweir aRect.Bottom() + nHalfLineWidth);
1002cdf0e10cSrcweir
1003cdf0e10cSrcweir XPolygon aXPoly(ImpCalcXPoly(aGrownRect, GetEckenradius()));
1004cdf0e10cSrcweir aRetval.append(aXPoly.getB2DPolygon());
1005cdf0e10cSrcweir
1006cdf0e10cSrcweir return aRetval;
1007cdf0e10cSrcweir }
1008cdf0e10cSrcweir else
1009cdf0e10cSrcweir {
1010cdf0e10cSrcweir // call parent
1011cdf0e10cSrcweir return SdrRectObj::TakeXorPoly();
1012cdf0e10cSrcweir }
1013cdf0e10cSrcweir }
1014cdf0e10cSrcweir
1015cdf0e10cSrcweir // -----------------------------------------------------------------------------
1016cdf0e10cSrcweir
GetHdlCount() const1017cdf0e10cSrcweir sal_uInt32 SdrGrafObj::GetHdlCount() const
1018cdf0e10cSrcweir {
1019cdf0e10cSrcweir return 8L;
1020cdf0e10cSrcweir }
1021cdf0e10cSrcweir
1022cdf0e10cSrcweir // -----------------------------------------------------------------------------
1023cdf0e10cSrcweir
GetHdl(sal_uInt32 nHdlNum) const1024cdf0e10cSrcweir SdrHdl* SdrGrafObj::GetHdl(sal_uInt32 nHdlNum) const
1025cdf0e10cSrcweir {
1026cdf0e10cSrcweir return SdrRectObj::GetHdl( nHdlNum + 1L );
1027cdf0e10cSrcweir }
1028cdf0e10cSrcweir
1029cdf0e10cSrcweir // -----------------------------------------------------------------------------
1030cdf0e10cSrcweir
NbcResize(const Point & rRef,const Fraction & xFact,const Fraction & yFact)1031cdf0e10cSrcweir void SdrGrafObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
1032cdf0e10cSrcweir {
1033cdf0e10cSrcweir SdrRectObj::NbcResize( rRef, xFact, yFact );
1034cdf0e10cSrcweir
1035cdf0e10cSrcweir FASTBOOL bMirrX = xFact.GetNumerator() < 0;
1036cdf0e10cSrcweir FASTBOOL bMirrY = yFact.GetNumerator() < 0;
1037cdf0e10cSrcweir
1038cdf0e10cSrcweir if( bMirrX != bMirrY )
1039cdf0e10cSrcweir bMirrored = !bMirrored;
1040cdf0e10cSrcweir }
1041cdf0e10cSrcweir
1042cdf0e10cSrcweir // -----------------------------------------------------------------------------
1043cdf0e10cSrcweir
NbcRotate(const Point & rRef,long nWink,double sn,double cs)1044cdf0e10cSrcweir void SdrGrafObj::NbcRotate(const Point& rRef, long nWink, double sn, double cs)
1045cdf0e10cSrcweir {
1046cdf0e10cSrcweir SdrRectObj::NbcRotate(rRef,nWink,sn,cs);
1047cdf0e10cSrcweir }
1048cdf0e10cSrcweir
1049cdf0e10cSrcweir // -----------------------------------------------------------------------------
1050cdf0e10cSrcweir
NbcMirror(const Point & rRef1,const Point & rRef2)1051cdf0e10cSrcweir void SdrGrafObj::NbcMirror(const Point& rRef1, const Point& rRef2)
1052cdf0e10cSrcweir {
1053cdf0e10cSrcweir SdrRectObj::NbcMirror(rRef1,rRef2);
1054cdf0e10cSrcweir bMirrored = !bMirrored;
1055cdf0e10cSrcweir }
1056cdf0e10cSrcweir
1057cdf0e10cSrcweir // -----------------------------------------------------------------------------
1058cdf0e10cSrcweir
NbcShear(const Point & rRef,long nWink,double tn,FASTBOOL bVShear)1059cdf0e10cSrcweir void SdrGrafObj::NbcShear(const Point& rRef, long nWink, double tn, FASTBOOL bVShear)
1060cdf0e10cSrcweir {
1061a5258243SPedro Giffuni // #i118485# Call Shear now, old version redirected to rotate
1062a5258243SPedro Giffuni SdrRectObj::NbcShear(rRef, nWink, tn, bVShear);
1063cdf0e10cSrcweir }
1064cdf0e10cSrcweir
1065cdf0e10cSrcweir // -----------------------------------------------------------------------------
1066cdf0e10cSrcweir
NbcSetSnapRect(const Rectangle & rRect)1067cdf0e10cSrcweir void SdrGrafObj::NbcSetSnapRect(const Rectangle& rRect)
1068cdf0e10cSrcweir {
1069cdf0e10cSrcweir SdrRectObj::NbcSetSnapRect(rRect);
1070cdf0e10cSrcweir }
1071cdf0e10cSrcweir
1072cdf0e10cSrcweir // -----------------------------------------------------------------------------
1073cdf0e10cSrcweir
NbcSetLogicRect(const Rectangle & rRect)1074cdf0e10cSrcweir void SdrGrafObj::NbcSetLogicRect( const Rectangle& rRect)
1075cdf0e10cSrcweir {
1076cdf0e10cSrcweir //int bChg=rRect.GetSize()!=aRect.GetSize();
1077cdf0e10cSrcweir SdrRectObj::NbcSetLogicRect(rRect);
1078cdf0e10cSrcweir }
1079cdf0e10cSrcweir
1080cdf0e10cSrcweir // -----------------------------------------------------------------------------
1081cdf0e10cSrcweir
NewGeoData() const1082cdf0e10cSrcweir SdrObjGeoData* SdrGrafObj::NewGeoData() const
1083cdf0e10cSrcweir {
1084cdf0e10cSrcweir return new SdrGrafObjGeoData;
1085cdf0e10cSrcweir }
1086cdf0e10cSrcweir
1087cdf0e10cSrcweir // -----------------------------------------------------------------------------
1088cdf0e10cSrcweir
SaveGeoData(SdrObjGeoData & rGeo) const1089cdf0e10cSrcweir void SdrGrafObj::SaveGeoData(SdrObjGeoData& rGeo) const
1090cdf0e10cSrcweir {
1091cdf0e10cSrcweir SdrRectObj::SaveGeoData(rGeo);
1092cdf0e10cSrcweir SdrGrafObjGeoData& rGGeo=(SdrGrafObjGeoData&)rGeo;
1093cdf0e10cSrcweir rGGeo.bMirrored=bMirrored;
1094cdf0e10cSrcweir }
1095cdf0e10cSrcweir
1096cdf0e10cSrcweir // -----------------------------------------------------------------------------
1097cdf0e10cSrcweir
RestGeoData(const SdrObjGeoData & rGeo)1098cdf0e10cSrcweir void SdrGrafObj::RestGeoData(const SdrObjGeoData& rGeo)
1099cdf0e10cSrcweir {
1100cdf0e10cSrcweir //long nDrehMerk = aGeo.nDrehWink;
1101cdf0e10cSrcweir //long nShearMerk = aGeo.nShearWink;
1102cdf0e10cSrcweir //int bMirrMerk = bMirrored;
1103cdf0e10cSrcweir Size aSizMerk( aRect.GetSize() );
1104cdf0e10cSrcweir
1105cdf0e10cSrcweir SdrRectObj::RestGeoData(rGeo);
1106cdf0e10cSrcweir SdrGrafObjGeoData& rGGeo=(SdrGrafObjGeoData&)rGeo;
1107cdf0e10cSrcweir bMirrored=rGGeo.bMirrored;
1108cdf0e10cSrcweir }
1109cdf0e10cSrcweir
1110cdf0e10cSrcweir // -----------------------------------------------------------------------------
1111cdf0e10cSrcweir
SetPage(SdrPage * pNewPage)1112cdf0e10cSrcweir void SdrGrafObj::SetPage( SdrPage* pNewPage )
1113cdf0e10cSrcweir {
1114cdf0e10cSrcweir FASTBOOL bRemove = pNewPage == NULL && pPage != NULL;
1115cdf0e10cSrcweir FASTBOOL bInsert = pNewPage != NULL && pPage == NULL;
1116cdf0e10cSrcweir
1117cdf0e10cSrcweir if( bRemove )
1118cdf0e10cSrcweir {
1119cdf0e10cSrcweir // hier kein SwapIn noetig, weil wenn nicht geladen, dann auch nicht animiert.
1120cdf0e10cSrcweir if( pGraphic->IsAnimated())
1121cdf0e10cSrcweir pGraphic->StopAnimation();
1122cdf0e10cSrcweir
1123cdf0e10cSrcweir if( pGraphicLink != NULL )
1124cdf0e10cSrcweir ImpLinkAbmeldung();
1125cdf0e10cSrcweir }
1126cdf0e10cSrcweir
11279e9dd2d5SArmin Le Grand if(!pModel && !GetStyleSheet() && pNewPage->GetModel())
11289e9dd2d5SArmin Le Grand {
11299e9dd2d5SArmin Le Grand // #119287# Set default StyleSheet for SdrGrafObj here, it is different from 'Default'. This
11309e9dd2d5SArmin Le Grand // needs to be done before the style 'Default' is set from the :SetModel() call which is triggered
11319e9dd2d5SArmin Le Grand // from the following :SetPage().
11329e9dd2d5SArmin Le Grand // TTTT: Needs to be moved in branch aw080 due to having a SdrModel from the beginning, is at this
11339e9dd2d5SArmin Le Grand // place for convenience currently (works in both versions, is not in the way)
11349e9dd2d5SArmin Le Grand SfxStyleSheet* pSheet = pNewPage->GetModel()->GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj();
11359e9dd2d5SArmin Le Grand
11369e9dd2d5SArmin Le Grand if(pSheet)
11379e9dd2d5SArmin Le Grand {
11389e9dd2d5SArmin Le Grand SetStyleSheet(pSheet, false);
11399e9dd2d5SArmin Le Grand }
11409e9dd2d5SArmin Le Grand else
11419e9dd2d5SArmin Le Grand {
11429e9dd2d5SArmin Le Grand SetMergedItem(XFillStyleItem(XFILL_NONE));
11439e9dd2d5SArmin Le Grand SetMergedItem(XLineStyleItem(XLINE_NONE));
11449e9dd2d5SArmin Le Grand }
11459e9dd2d5SArmin Le Grand }
11469e9dd2d5SArmin Le Grand
1147cdf0e10cSrcweir SdrRectObj::SetPage( pNewPage );
1148cdf0e10cSrcweir
1149cdf0e10cSrcweir if(aFileName.Len() && bInsert)
1150cdf0e10cSrcweir ImpLinkAnmeldung();
1151cdf0e10cSrcweir }
1152cdf0e10cSrcweir
1153cdf0e10cSrcweir // -----------------------------------------------------------------------------
1154cdf0e10cSrcweir
SetModel(SdrModel * pNewModel)1155cdf0e10cSrcweir void SdrGrafObj::SetModel( SdrModel* pNewModel )
1156cdf0e10cSrcweir {
1157cdf0e10cSrcweir FASTBOOL bChg = pNewModel != pModel;
1158cdf0e10cSrcweir
1159cdf0e10cSrcweir if( bChg )
1160cdf0e10cSrcweir {
1161cdf0e10cSrcweir if( pGraphic->HasUserData() )
1162cdf0e10cSrcweir {
1163cdf0e10cSrcweir ForceSwapIn();
1164cdf0e10cSrcweir pGraphic->SetUserData();
1165cdf0e10cSrcweir }
1166cdf0e10cSrcweir
1167cdf0e10cSrcweir if( pGraphicLink != NULL )
1168cdf0e10cSrcweir ImpLinkAbmeldung();
1169cdf0e10cSrcweir }
1170cdf0e10cSrcweir
1171cdf0e10cSrcweir // Model umsetzen
1172cdf0e10cSrcweir SdrRectObj::SetModel(pNewModel);
1173cdf0e10cSrcweir
1174cdf0e10cSrcweir if( bChg && aFileName.Len() )
1175cdf0e10cSrcweir ImpLinkAnmeldung();
1176cdf0e10cSrcweir }
1177cdf0e10cSrcweir
1178cdf0e10cSrcweir // -----------------------------------------------------------------------------
1179cdf0e10cSrcweir
StartAnimation(OutputDevice *,const Point &,const Size &,long)1180cdf0e10cSrcweir void SdrGrafObj::StartAnimation( OutputDevice* /*pOutDev*/, const Point& /*rPoint*/, const Size& /*rSize*/, long /*nExtraData*/)
1181cdf0e10cSrcweir {
1182cdf0e10cSrcweir // #111096#
1183cdf0e10cSrcweir // use new graf animation
1184cdf0e10cSrcweir SetGrafAnimationAllowed(sal_True);
1185cdf0e10cSrcweir }
1186cdf0e10cSrcweir
1187cdf0e10cSrcweir // -----------------------------------------------------------------------------
1188cdf0e10cSrcweir
StopAnimation(OutputDevice *,long)1189cdf0e10cSrcweir void SdrGrafObj::StopAnimation(OutputDevice* /*pOutDev*/, long /*nExtraData*/)
1190cdf0e10cSrcweir {
1191cdf0e10cSrcweir // #111096#
1192cdf0e10cSrcweir // use new graf animation
1193cdf0e10cSrcweir SetGrafAnimationAllowed(sal_False);
1194cdf0e10cSrcweir }
1195cdf0e10cSrcweir
1196cdf0e10cSrcweir // -----------------------------------------------------------------------------
1197cdf0e10cSrcweir
HasGDIMetaFile() const1198cdf0e10cSrcweir FASTBOOL SdrGrafObj::HasGDIMetaFile() const
1199cdf0e10cSrcweir {
1200cdf0e10cSrcweir return( pGraphic->GetType() == GRAPHIC_GDIMETAFILE );
1201cdf0e10cSrcweir }
1202cdf0e10cSrcweir
1203cdf0e10cSrcweir // -----------------------------------------------------------------------------
1204cdf0e10cSrcweir
GetGDIMetaFile() const1205cdf0e10cSrcweir const GDIMetaFile* SdrGrafObj::GetGDIMetaFile() const
1206cdf0e10cSrcweir {
1207cdf0e10cSrcweir DBG_ERROR( "Invalid return value! Don't use it! (KA)" );
1208cdf0e10cSrcweir return &GetGraphic().GetGDIMetaFile();
1209cdf0e10cSrcweir }
1210cdf0e10cSrcweir
1211cdf0e10cSrcweir // -----------------------------------------------------------------------------
1212cdf0e10cSrcweir
isEmbeddedSvg() const1213ddde725dSArmin Le Grand bool SdrGrafObj::isEmbeddedSvg() const
1214ddde725dSArmin Le Grand {
1215ddde725dSArmin Le Grand return GRAPHIC_BITMAP == GetGraphicType() && GetGraphic().getSvgData().get();
1216ddde725dSArmin Le Grand }
1217ddde725dSArmin Le Grand
getMetafileFromEmbeddedSvg() const1218ddde725dSArmin Le Grand GDIMetaFile SdrGrafObj::getMetafileFromEmbeddedSvg() const
1219ddde725dSArmin Le Grand {
1220ddde725dSArmin Le Grand GDIMetaFile aRetval;
1221ddde725dSArmin Le Grand
1222ddde725dSArmin Le Grand if(isEmbeddedSvg() && GetModel())
1223ddde725dSArmin Le Grand {
1224ddde725dSArmin Le Grand VirtualDevice aOut;
1225ddde725dSArmin Le Grand const Rectangle aBoundRect(GetCurrentBoundRect());
1226ddde725dSArmin Le Grand const MapMode aMap(GetModel()->GetScaleUnit(), Point(), GetModel()->GetScaleFraction(), GetModel()->GetScaleFraction());
1227ddde725dSArmin Le Grand
1228ddde725dSArmin Le Grand aOut.EnableOutput(false);
1229ddde725dSArmin Le Grand aOut.SetMapMode(aMap);
1230ddde725dSArmin Le Grand aRetval.Record(&aOut);
1231ddde725dSArmin Le Grand SingleObjectPainter(aOut);
1232ddde725dSArmin Le Grand aRetval.Stop();
1233ddde725dSArmin Le Grand aRetval.WindStart();
1234ddde725dSArmin Le Grand aRetval.Move(-aBoundRect.Left(), -aBoundRect.Top());
1235ddde725dSArmin Le Grand aRetval.SetPrefMapMode(aMap);
1236ddde725dSArmin Le Grand aRetval.SetPrefSize(aBoundRect.GetSize());
1237ddde725dSArmin Le Grand }
1238ddde725dSArmin Le Grand
1239ddde725dSArmin Le Grand return aRetval;
1240ddde725dSArmin Le Grand }
1241ddde725dSArmin Le Grand
DoConvertToPolyObj(sal_Bool bBezier,bool bAddText) const1242a5258243SPedro Giffuni SdrObject* SdrGrafObj::DoConvertToPolyObj(sal_Bool bBezier, bool bAddText) const
1243cdf0e10cSrcweir {
1244cdf0e10cSrcweir SdrObject* pRetval = NULL;
1245ddde725dSArmin Le Grand GraphicType aGraphicType(GetGraphicType());
1246ddde725dSArmin Le Grand GDIMetaFile aMtf;
1247cdf0e10cSrcweir
1248ddde725dSArmin Le Grand if(isEmbeddedSvg())
1249ddde725dSArmin Le Grand {
1250ddde725dSArmin Le Grand // Embedded Svg
1251ddde725dSArmin Le Grand // There is currently no helper to create SdrObjects from primitives (even if I'm thinking
1252ddde725dSArmin Le Grand // about writing one for some time). To get the roundtrip to SdrObjects it is necessary to
1253ddde725dSArmin Le Grand // use the old converter path over the MetaFile mechanism. Create Metafile from Svg
1254ddde725dSArmin Le Grand // primitives here pretty directly
1255ddde725dSArmin Le Grand aMtf = getMetafileFromEmbeddedSvg();
1256ddde725dSArmin Le Grand aGraphicType = GRAPHIC_GDIMETAFILE;
1257ddde725dSArmin Le Grand }
1258ddde725dSArmin Le Grand else if(GRAPHIC_GDIMETAFILE == aGraphicType)
1259ddde725dSArmin Le Grand {
1260ddde725dSArmin Le Grand aMtf = GetTransformedGraphic(SDRGRAFOBJ_TRANSFORMATTR_COLOR|SDRGRAFOBJ_TRANSFORMATTR_MIRROR).GetGDIMetaFile();
1261ddde725dSArmin Le Grand }
1262ddde725dSArmin Le Grand
1263ddde725dSArmin Le Grand switch(aGraphicType)
1264cdf0e10cSrcweir {
1265cdf0e10cSrcweir case GRAPHIC_GDIMETAFILE:
1266cdf0e10cSrcweir {
1267cdf0e10cSrcweir // NUR die aus dem MetaFile erzeugbaren Objekte in eine Gruppe packen und zurueckliefern
12688718d260SArmin Le Grand ImpSdrGDIMetaFileImport aFilter(*GetModel(), GetLayer(), aRect);
1269a5258243SPedro Giffuni SdrObjGroup* pGrp = new SdrObjGroup();
1270ddde725dSArmin Le Grand sal_uInt32 nInsAnz = aFilter.DoImport(aMtf, *pGrp->GetSubList(), 0);
1271a5258243SPedro Giffuni
1272a5258243SPedro Giffuni if(nInsAnz)
1273cdf0e10cSrcweir {
1274a5258243SPedro Giffuni {
1275ddde725dSArmin Le Grand // copy transformation
1276a5258243SPedro Giffuni GeoStat aGeoStat(GetGeoStat());
1277a5258243SPedro Giffuni
1278a5258243SPedro Giffuni if(aGeoStat.nShearWink)
1279a5258243SPedro Giffuni {
1280a5258243SPedro Giffuni aGeoStat.RecalcTan();
1281a5258243SPedro Giffuni pGrp->NbcShear(aRect.TopLeft(), aGeoStat.nShearWink, aGeoStat.nTan, false);
1282a5258243SPedro Giffuni }
1283a5258243SPedro Giffuni
1284a5258243SPedro Giffuni if(aGeoStat.nDrehWink)
1285a5258243SPedro Giffuni {
1286a5258243SPedro Giffuni aGeoStat.RecalcSinCos();
1287a5258243SPedro Giffuni pGrp->NbcRotate(aRect.TopLeft(), aGeoStat.nDrehWink, aGeoStat.nSin, aGeoStat.nCos);
1288a5258243SPedro Giffuni }
1289a5258243SPedro Giffuni }
1290a5258243SPedro Giffuni
1291a5258243SPedro Giffuni pRetval = pGrp;
1292cdf0e10cSrcweir pGrp->NbcSetLayer(GetLayer());
1293cdf0e10cSrcweir pGrp->SetModel(GetModel());
1294dfe9de19SHerbert Dürr
1295dfe9de19SHerbert Dürr if(bAddText)
1296dfe9de19SHerbert Dürr {
1297dfe9de19SHerbert Dürr pRetval = ImpConvertAddText(pRetval, bBezier);
1298dfe9de19SHerbert Dürr }
1299cdf0e10cSrcweir
1300cdf0e10cSrcweir // convert all children
1301cdf0e10cSrcweir if( pRetval )
1302cdf0e10cSrcweir {
1303cdf0e10cSrcweir SdrObject* pHalfDone = pRetval;
1304a5258243SPedro Giffuni pRetval = pHalfDone->DoConvertToPolyObj(bBezier, bAddText);
1305cdf0e10cSrcweir SdrObject::Free( pHalfDone ); // resulting object is newly created
1306cdf0e10cSrcweir
1307cdf0e10cSrcweir if( pRetval )
1308cdf0e10cSrcweir {
1309cdf0e10cSrcweir // flatten subgroups. As we call
1310cdf0e10cSrcweir // DoConvertToPolyObj() on the resulting group
1311cdf0e10cSrcweir // objects, subgroups can exist (e.g. text is
1312cdf0e10cSrcweir // a group object for every line).
1313cdf0e10cSrcweir SdrObjList* pList = pRetval->GetSubList();
1314cdf0e10cSrcweir if( pList )
1315cdf0e10cSrcweir pList->FlattenGroups();
1316cdf0e10cSrcweir }
1317cdf0e10cSrcweir }
1318cdf0e10cSrcweir }
1319cdf0e10cSrcweir else
1320a5258243SPedro Giffuni {
1321cdf0e10cSrcweir delete pGrp;
1322a5258243SPedro Giffuni }
1323a5258243SPedro Giffuni
1324a5258243SPedro Giffuni // #i118485# convert line and fill
1325a5258243SPedro Giffuni SdrObject* pLineFill = SdrRectObj::DoConvertToPolyObj(bBezier, false);
1326a5258243SPedro Giffuni
1327a5258243SPedro Giffuni if(pLineFill)
1328a5258243SPedro Giffuni {
1329a5258243SPedro Giffuni if(pRetval)
1330a5258243SPedro Giffuni {
1331a5258243SPedro Giffuni pGrp = dynamic_cast< SdrObjGroup* >(pRetval);
1332a5258243SPedro Giffuni
1333a5258243SPedro Giffuni if(!pGrp)
1334a5258243SPedro Giffuni {
1335a5258243SPedro Giffuni pGrp = new SdrObjGroup();
1336a5258243SPedro Giffuni
1337a5258243SPedro Giffuni pGrp->NbcSetLayer(GetLayer());
1338a5258243SPedro Giffuni pGrp->SetModel(GetModel());
1339a5258243SPedro Giffuni pGrp->GetSubList()->NbcInsertObject(pRetval);
1340a5258243SPedro Giffuni }
1341a5258243SPedro Giffuni
1342a5258243SPedro Giffuni pGrp->GetSubList()->NbcInsertObject(pLineFill, 0);
1343a5258243SPedro Giffuni }
1344a5258243SPedro Giffuni else
1345a5258243SPedro Giffuni {
1346a5258243SPedro Giffuni pRetval = pLineFill;
1347a5258243SPedro Giffuni }
1348a5258243SPedro Giffuni }
1349a5258243SPedro Giffuni
1350cdf0e10cSrcweir break;
1351cdf0e10cSrcweir }
1352cdf0e10cSrcweir case GRAPHIC_BITMAP:
1353cdf0e10cSrcweir {
1354cdf0e10cSrcweir // Grundobjekt kreieren und Fuellung ergaenzen
1355a5258243SPedro Giffuni pRetval = SdrRectObj::DoConvertToPolyObj(bBezier, bAddText);
1356cdf0e10cSrcweir
1357cdf0e10cSrcweir // Bitmap als Attribut retten
1358cdf0e10cSrcweir if(pRetval)
1359cdf0e10cSrcweir {
1360cdf0e10cSrcweir // Bitmap als Fuellung holen
1361cdf0e10cSrcweir SfxItemSet aSet(GetObjectItemSet());
1362cdf0e10cSrcweir
1363cdf0e10cSrcweir aSet.Put(XFillStyleItem(XFILL_BITMAP));
136470d3707aSArmin Le Grand const BitmapEx aBitmapEx(GetTransformedGraphic().GetBitmapEx());
136570d3707aSArmin Le Grand aSet.Put(XFillBitmapItem(String(), Graphic(aBitmapEx)));
136670d3707aSArmin Le Grand aSet.Put(XFillBmpTileItem(false));
1367cdf0e10cSrcweir
1368cdf0e10cSrcweir pRetval->SetMergedItemSet(aSet);
1369cdf0e10cSrcweir }
1370cdf0e10cSrcweir break;
1371cdf0e10cSrcweir }
1372cdf0e10cSrcweir case GRAPHIC_NONE:
1373cdf0e10cSrcweir case GRAPHIC_DEFAULT:
1374cdf0e10cSrcweir {
1375a5258243SPedro Giffuni pRetval = SdrRectObj::DoConvertToPolyObj(bBezier, bAddText);
1376cdf0e10cSrcweir break;
1377cdf0e10cSrcweir }
1378cdf0e10cSrcweir }
1379cdf0e10cSrcweir
1380cdf0e10cSrcweir return pRetval;
1381cdf0e10cSrcweir }
1382cdf0e10cSrcweir
1383cdf0e10cSrcweir // -----------------------------------------------------------------------------
1384cdf0e10cSrcweir
Notify(SfxBroadcaster & rBC,const SfxHint & rHint)1385cdf0e10cSrcweir void SdrGrafObj::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
1386cdf0e10cSrcweir {
1387cdf0e10cSrcweir SetXPolyDirty();
1388cdf0e10cSrcweir SdrRectObj::Notify( rBC, rHint );
1389cdf0e10cSrcweir ImpSetAttrToGrafInfo();
1390cdf0e10cSrcweir }
1391cdf0e10cSrcweir
ImpSetAttrToGrafInfo()1392cdf0e10cSrcweir void SdrGrafObj::ImpSetAttrToGrafInfo()
1393cdf0e10cSrcweir {
1394cdf0e10cSrcweir const SfxItemSet& rSet = GetObjectItemSet();
1395cdf0e10cSrcweir const sal_uInt16 nTrans = ( (SdrGrafTransparenceItem&) rSet.Get( SDRATTR_GRAFTRANSPARENCE ) ).GetValue();
1396cdf0e10cSrcweir const SdrGrafCropItem& rCrop = (const SdrGrafCropItem&) rSet.Get( SDRATTR_GRAFCROP );
1397cdf0e10cSrcweir
1398cdf0e10cSrcweir aGrafInfo.SetLuminance( ( (SdrGrafLuminanceItem&) rSet.Get( SDRATTR_GRAFLUMINANCE ) ).GetValue() );
1399cdf0e10cSrcweir aGrafInfo.SetContrast( ( (SdrGrafContrastItem&) rSet.Get( SDRATTR_GRAFCONTRAST ) ).GetValue() );
1400cdf0e10cSrcweir aGrafInfo.SetChannelR( ( (SdrGrafRedItem&) rSet.Get( SDRATTR_GRAFRED ) ).GetValue() );
1401cdf0e10cSrcweir aGrafInfo.SetChannelG( ( (SdrGrafGreenItem&) rSet.Get( SDRATTR_GRAFGREEN ) ).GetValue() );
1402cdf0e10cSrcweir aGrafInfo.SetChannelB( ( (SdrGrafBlueItem&) rSet.Get( SDRATTR_GRAFBLUE ) ).GetValue() );
1403cdf0e10cSrcweir aGrafInfo.SetGamma( ( (SdrGrafGamma100Item&) rSet.Get( SDRATTR_GRAFGAMMA ) ).GetValue() * 0.01 );
1404cdf0e10cSrcweir aGrafInfo.SetTransparency( (sal_uInt8) FRound( Min( nTrans, (sal_uInt16) 100 ) * 2.55 ) );
1405cdf0e10cSrcweir aGrafInfo.SetInvert( ( (SdrGrafInvertItem&) rSet.Get( SDRATTR_GRAFINVERT ) ).GetValue() );
1406cdf0e10cSrcweir aGrafInfo.SetDrawMode( ( (SdrGrafModeItem&) rSet.Get( SDRATTR_GRAFMODE ) ).GetValue() );
1407cdf0e10cSrcweir aGrafInfo.SetCrop( rCrop.GetLeft(), rCrop.GetTop(), rCrop.GetRight(), rCrop.GetBottom() );
1408cdf0e10cSrcweir
1409cdf0e10cSrcweir SetXPolyDirty();
1410cdf0e10cSrcweir SetRectsDirty();
1411cdf0e10cSrcweir }
1412cdf0e10cSrcweir
1413cdf0e10cSrcweir // -----------------------------------------------------------------------------
1414cdf0e10cSrcweir
ImpSetGrafInfoToAttr()1415cdf0e10cSrcweir void SdrGrafObj::ImpSetGrafInfoToAttr()
1416cdf0e10cSrcweir {
1417cdf0e10cSrcweir SetObjectItem( SdrGrafLuminanceItem( aGrafInfo.GetLuminance() ) );
1418cdf0e10cSrcweir SetObjectItem( SdrGrafContrastItem( aGrafInfo.GetContrast() ) );
1419cdf0e10cSrcweir SetObjectItem( SdrGrafRedItem( aGrafInfo.GetChannelR() ) );
1420cdf0e10cSrcweir SetObjectItem( SdrGrafGreenItem( aGrafInfo.GetChannelG() ) );
1421cdf0e10cSrcweir SetObjectItem( SdrGrafBlueItem( aGrafInfo.GetChannelB() ) );
1422cdf0e10cSrcweir SetObjectItem( SdrGrafGamma100Item( FRound( aGrafInfo.GetGamma() * 100.0 ) ) );
1423cdf0e10cSrcweir SetObjectItem( SdrGrafTransparenceItem( (sal_uInt16) FRound( aGrafInfo.GetTransparency() / 2.55 ) ) );
1424cdf0e10cSrcweir SetObjectItem( SdrGrafInvertItem( aGrafInfo.IsInvert() ) );
1425cdf0e10cSrcweir SetObjectItem( SdrGrafModeItem( aGrafInfo.GetDrawMode() ) );
1426cdf0e10cSrcweir SetObjectItem( SdrGrafCropItem( aGrafInfo.GetLeftCrop(), aGrafInfo.GetTopCrop(), aGrafInfo.GetRightCrop(), aGrafInfo.GetBottomCrop() ) );
1427cdf0e10cSrcweir }
1428cdf0e10cSrcweir
1429cdf0e10cSrcweir // -----------------------------------------------------------------------------
1430cdf0e10cSrcweir
AdjustToMaxRect(const Rectangle & rMaxRect,bool bShrinkOnly)1431cdf0e10cSrcweir void SdrGrafObj::AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly )
1432cdf0e10cSrcweir {
1433cdf0e10cSrcweir Size aSize;
1434cdf0e10cSrcweir Size aMaxSize( rMaxRect.GetSize() );
1435cdf0e10cSrcweir if ( pGraphic->GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
1436cdf0e10cSrcweir aSize = Application::GetDefaultDevice()->PixelToLogic( pGraphic->GetPrefSize(), MAP_100TH_MM );
1437cdf0e10cSrcweir else
1438cdf0e10cSrcweir aSize = OutputDevice::LogicToLogic( pGraphic->GetPrefSize(),
1439cdf0e10cSrcweir pGraphic->GetPrefMapMode(),
1440cdf0e10cSrcweir MapMode( MAP_100TH_MM ) );
1441cdf0e10cSrcweir
1442cdf0e10cSrcweir if( aSize.Height() != 0 && aSize.Width() != 0 )
1443cdf0e10cSrcweir {
1444cdf0e10cSrcweir Point aPos( rMaxRect.TopLeft() );
1445cdf0e10cSrcweir
1446cdf0e10cSrcweir // Falls Grafik zu gross, wird die Grafik
1447cdf0e10cSrcweir // in die Seite eingepasst
1448cdf0e10cSrcweir if ( (!bShrinkOnly ||
1449cdf0e10cSrcweir ( aSize.Height() > aMaxSize.Height() ) ||
1450cdf0e10cSrcweir ( aSize.Width() > aMaxSize.Width() ) )&&
1451cdf0e10cSrcweir aSize.Height() && aMaxSize.Height() )
1452cdf0e10cSrcweir {
1453cdf0e10cSrcweir float fGrfWH = (float)aSize.Width() /
1454cdf0e10cSrcweir (float)aSize.Height();
1455cdf0e10cSrcweir float fWinWH = (float)aMaxSize.Width() /
1456cdf0e10cSrcweir (float)aMaxSize.Height();
1457cdf0e10cSrcweir
1458cdf0e10cSrcweir // Grafik an Pagesize anpassen (skaliert)
1459cdf0e10cSrcweir if ( fGrfWH < fWinWH )
1460cdf0e10cSrcweir {
1461cdf0e10cSrcweir aSize.Width() = (long)(aMaxSize.Height() * fGrfWH);
1462cdf0e10cSrcweir aSize.Height()= aMaxSize.Height();
1463cdf0e10cSrcweir }
1464cdf0e10cSrcweir else if ( fGrfWH > 0.F )
1465cdf0e10cSrcweir {
1466cdf0e10cSrcweir aSize.Width() = aMaxSize.Width();
1467cdf0e10cSrcweir aSize.Height()= (long)(aMaxSize.Width() / fGrfWH);
1468cdf0e10cSrcweir }
1469cdf0e10cSrcweir
1470cdf0e10cSrcweir aPos = rMaxRect.Center();
1471cdf0e10cSrcweir }
1472cdf0e10cSrcweir
1473cdf0e10cSrcweir if( bShrinkOnly )
1474cdf0e10cSrcweir aPos = aRect.TopLeft();
1475cdf0e10cSrcweir
1476cdf0e10cSrcweir aPos.X() -= aSize.Width() / 2;
1477cdf0e10cSrcweir aPos.Y() -= aSize.Height() / 2;
1478cdf0e10cSrcweir SetLogicRect( Rectangle( aPos, aSize ) );
1479cdf0e10cSrcweir }
1480cdf0e10cSrcweir }
1481cdf0e10cSrcweir
1482cdf0e10cSrcweir // -----------------------------------------------------------------------------
1483cdf0e10cSrcweir
IMPL_LINK(SdrGrafObj,ImpSwapHdl,GraphicObject *,pO)1484cdf0e10cSrcweir IMPL_LINK( SdrGrafObj, ImpSwapHdl, GraphicObject*, pO )
1485cdf0e10cSrcweir {
1486cdf0e10cSrcweir SvStream* pRet = GRFMGR_AUTOSWAPSTREAM_NONE;
1487cdf0e10cSrcweir
1488cdf0e10cSrcweir if( pO->IsInSwapOut() )
1489cdf0e10cSrcweir {
1490cdf0e10cSrcweir if( pModel && !mbIsPreview && pModel->IsSwapGraphics() && pGraphic->GetSizeBytes() > 20480 )
1491cdf0e10cSrcweir {
1492cdf0e10cSrcweir // test if this object is visualized from someone
1493cdf0e10cSrcweir // ## test only if there are VOCs other than the preview renderer
1494cdf0e10cSrcweir if(!GetViewContact().HasViewObjectContacts(true))
1495cdf0e10cSrcweir {
1496cdf0e10cSrcweir const sal_uIntPtr nSwapMode = pModel->GetSwapGraphicsMode();
1497cdf0e10cSrcweir
1498cdf0e10cSrcweir if( ( pGraphic->HasUserData() || pGraphicLink ) &&
1499cdf0e10cSrcweir ( nSwapMode & SDR_SWAPGRAPHICSMODE_PURGE ) )
1500cdf0e10cSrcweir {
1501cdf0e10cSrcweir pRet = GRFMGR_AUTOSWAPSTREAM_LINK;
1502cdf0e10cSrcweir }
1503cdf0e10cSrcweir else if( nSwapMode & SDR_SWAPGRAPHICSMODE_TEMP )
1504cdf0e10cSrcweir {
1505cdf0e10cSrcweir pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1506cdf0e10cSrcweir pGraphic->SetUserData();
1507cdf0e10cSrcweir }
1508cdf0e10cSrcweir
1509cdf0e10cSrcweir // #i102380#
1510cdf0e10cSrcweir sdr::contact::ViewContactOfGraphic* pVC = dynamic_cast< sdr::contact::ViewContactOfGraphic* >(&GetViewContact());
1511cdf0e10cSrcweir
1512cdf0e10cSrcweir if(pVC)
1513cdf0e10cSrcweir {
1514cdf0e10cSrcweir pVC->flushGraphicObjects();
1515cdf0e10cSrcweir }
1516cdf0e10cSrcweir }
1517cdf0e10cSrcweir }
1518cdf0e10cSrcweir }
1519cdf0e10cSrcweir else if( pO->IsInSwapIn() )
1520cdf0e10cSrcweir {
1521cdf0e10cSrcweir // kann aus dem original Doc-Stream nachgeladen werden...
1522cdf0e10cSrcweir if( pModel != NULL )
1523cdf0e10cSrcweir {
1524cdf0e10cSrcweir if( pGraphic->HasUserData() )
1525cdf0e10cSrcweir {
1526cdf0e10cSrcweir SdrDocumentStreamInfo aStreamInfo;
1527cdf0e10cSrcweir
1528cdf0e10cSrcweir aStreamInfo.mbDeleteAfterUse = sal_False;
1529cdf0e10cSrcweir aStreamInfo.maUserData = pGraphic->GetUserData();
1530cdf0e10cSrcweir
1531cdf0e10cSrcweir SvStream* pStream = pModel->GetDocumentStream( aStreamInfo );
1532cdf0e10cSrcweir
1533cdf0e10cSrcweir if( pStream != NULL )
1534cdf0e10cSrcweir {
1535cdf0e10cSrcweir Graphic aGraphic;
1536cdf0e10cSrcweir
1537cdf0e10cSrcweir com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >* pFilterData = NULL;
1538cdf0e10cSrcweir
1539cdf0e10cSrcweir if(mbInsidePaint && !GetViewContact().HasViewObjectContacts(true))
1540cdf0e10cSrcweir {
1541cdf0e10cSrcweir pFilterData = new com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >( 3 );
1542cdf0e10cSrcweir
15432183ced9SOliver-Rainer Wittmann const com::sun::star::awt::Size aPreviewSizeHint( 64, 64 );
15442183ced9SOliver-Rainer Wittmann const sal_Bool bAllowPartialStreamRead = sal_True;
15452183ced9SOliver-Rainer Wittmann // create <GfxLink> instance also for previews in order to avoid that its corresponding
15462183ced9SOliver-Rainer Wittmann // data is cleared in the graphic cache entry in case that the preview data equals the complete graphic data
15472183ced9SOliver-Rainer Wittmann const sal_Bool bCreateNativeLink = sal_True;
1548cdf0e10cSrcweir (*pFilterData)[ 0 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "PreviewSizeHint" ) );
1549cdf0e10cSrcweir (*pFilterData)[ 0 ].Value <<= aPreviewSizeHint;
1550cdf0e10cSrcweir (*pFilterData)[ 1 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "AllowPartialStreamRead" ) );
1551cdf0e10cSrcweir (*pFilterData)[ 1 ].Value <<= bAllowPartialStreamRead;
1552cdf0e10cSrcweir (*pFilterData)[ 2 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "CreateNativeLink" ) );
1553cdf0e10cSrcweir (*pFilterData)[ 2 ].Value <<= bCreateNativeLink;
1554cdf0e10cSrcweir
1555cdf0e10cSrcweir mbIsPreview = sal_True;
1556cdf0e10cSrcweir }
1557cdf0e10cSrcweir
1558ddde725dSArmin Le Grand if(!GraphicFilter::GetGraphicFilter()->ImportGraphic(
1559ddde725dSArmin Le Grand aGraphic, aStreamInfo.maUserData, *pStream,
1560ddde725dSArmin Le Grand GRFILTER_FORMAT_DONTKNOW, NULL, 0, pFilterData))
1561cdf0e10cSrcweir {
1562cdf0e10cSrcweir const String aUserData( pGraphic->GetUserData() );
1563cdf0e10cSrcweir
1564cdf0e10cSrcweir pGraphic->SetGraphic( aGraphic );
1565cdf0e10cSrcweir pGraphic->SetUserData( aUserData );
1566cdf0e10cSrcweir
1567cdf0e10cSrcweir // #142146# Graphic successfully swapped in.
1568cdf0e10cSrcweir pRet = GRFMGR_AUTOSWAPSTREAM_LOADED;
1569cdf0e10cSrcweir }
1570cdf0e10cSrcweir delete pFilterData;
1571cdf0e10cSrcweir
1572cdf0e10cSrcweir pStream->ResetError();
1573cdf0e10cSrcweir
1574cdf0e10cSrcweir if( aStreamInfo.mbDeleteAfterUse || aStreamInfo.mxStorageRef.is() )
1575cdf0e10cSrcweir {
1576cdf0e10cSrcweir if ( aStreamInfo.mxStorageRef.is() )
1577cdf0e10cSrcweir {
1578cdf0e10cSrcweir aStreamInfo.mxStorageRef->dispose();
1579cdf0e10cSrcweir aStreamInfo.mxStorageRef = 0;
1580cdf0e10cSrcweir }
1581cdf0e10cSrcweir
1582cdf0e10cSrcweir delete pStream;
1583cdf0e10cSrcweir }
1584cdf0e10cSrcweir }
1585cdf0e10cSrcweir }
1586cdf0e10cSrcweir else if( !ImpUpdateGraphicLink( sal_False ) )
1587cdf0e10cSrcweir {
1588cdf0e10cSrcweir pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1589cdf0e10cSrcweir }
1590cdf0e10cSrcweir else
1591cdf0e10cSrcweir {
1592cdf0e10cSrcweir pRet = GRFMGR_AUTOSWAPSTREAM_LOADED;
1593cdf0e10cSrcweir }
1594cdf0e10cSrcweir }
1595cdf0e10cSrcweir else
1596cdf0e10cSrcweir pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1597cdf0e10cSrcweir }
1598cdf0e10cSrcweir
1599cdf0e10cSrcweir return (long)(void*) pRet;
1600cdf0e10cSrcweir }
1601cdf0e10cSrcweir
1602cdf0e10cSrcweir // -----------------------------------------------------------------------------
1603cdf0e10cSrcweir
1604cdf0e10cSrcweir // #111096#
1605cdf0e10cSrcweir // Access to GrafAnimationAllowed flag
IsGrafAnimationAllowed() const1606cdf0e10cSrcweir sal_Bool SdrGrafObj::IsGrafAnimationAllowed() const
1607cdf0e10cSrcweir {
1608cdf0e10cSrcweir return mbGrafAnimationAllowed;
1609cdf0e10cSrcweir }
1610cdf0e10cSrcweir
SetGrafAnimationAllowed(sal_Bool bNew)1611cdf0e10cSrcweir void SdrGrafObj::SetGrafAnimationAllowed(sal_Bool bNew)
1612cdf0e10cSrcweir {
1613cdf0e10cSrcweir if(mbGrafAnimationAllowed != bNew)
1614cdf0e10cSrcweir {
1615cdf0e10cSrcweir mbGrafAnimationAllowed = bNew;
1616cdf0e10cSrcweir ActionChanged();
1617cdf0e10cSrcweir }
1618cdf0e10cSrcweir }
1619cdf0e10cSrcweir
1620cdf0e10cSrcweir // #i25616#
IsObjectTransparent() const1621cdf0e10cSrcweir sal_Bool SdrGrafObj::IsObjectTransparent() const
1622cdf0e10cSrcweir {
1623cdf0e10cSrcweir if(((const SdrGrafTransparenceItem&)GetObjectItem(SDRATTR_GRAFTRANSPARENCE)).GetValue()
1624cdf0e10cSrcweir || pGraphic->IsTransparent())
1625cdf0e10cSrcweir {
1626cdf0e10cSrcweir return sal_True;
1627cdf0e10cSrcweir }
1628cdf0e10cSrcweir
1629cdf0e10cSrcweir return sal_False;
1630cdf0e10cSrcweir }
1631cdf0e10cSrcweir
getInputStream()1632cdf0e10cSrcweir Reference< XInputStream > SdrGrafObj::getInputStream()
1633cdf0e10cSrcweir {
1634cdf0e10cSrcweir Reference< XInputStream > xStream;
1635cdf0e10cSrcweir
1636cdf0e10cSrcweir if( pModel )
1637cdf0e10cSrcweir {
1638cdf0e10cSrcweir // if( !pGraphic->HasUserData() )
1639cdf0e10cSrcweir // pGraphic->SwapOut();
1640cdf0e10cSrcweir
1641cdf0e10cSrcweir // kann aus dem original Doc-Stream nachgeladen werden...
1642cdf0e10cSrcweir if( pGraphic->HasUserData() )
1643cdf0e10cSrcweir {
1644cdf0e10cSrcweir SdrDocumentStreamInfo aStreamInfo;
1645cdf0e10cSrcweir
1646cdf0e10cSrcweir aStreamInfo.mbDeleteAfterUse = sal_False;
1647cdf0e10cSrcweir aStreamInfo.maUserData = pGraphic->GetUserData();
1648cdf0e10cSrcweir
1649cdf0e10cSrcweir SvStream* pStream = pModel->GetDocumentStream( aStreamInfo );
1650cdf0e10cSrcweir
1651cdf0e10cSrcweir if( pStream )
1652cdf0e10cSrcweir xStream.set( new utl::OInputStreamWrapper( pStream, sal_True ) );
1653cdf0e10cSrcweir }
1654cdf0e10cSrcweir else if( pGraphic && GetGraphic().IsLink() )
1655cdf0e10cSrcweir {
1656cdf0e10cSrcweir Graphic aGraphic( GetGraphic() );
1657cdf0e10cSrcweir GfxLink aLink( aGraphic.GetLink() );
1658cdf0e10cSrcweir sal_uInt32 nSize = aLink.GetDataSize();
1659cdf0e10cSrcweir const void* pSourceData = (const void*)aLink.GetData();
1660cdf0e10cSrcweir if( nSize && pSourceData )
1661cdf0e10cSrcweir {
1662cdf0e10cSrcweir sal_uInt8 * pBuffer = new sal_uInt8[ nSize ];
1663cdf0e10cSrcweir if( pBuffer )
1664cdf0e10cSrcweir {
1665cdf0e10cSrcweir memcpy( pBuffer, pSourceData, nSize );
1666cdf0e10cSrcweir
1667cdf0e10cSrcweir SvMemoryStream* pStream = new SvMemoryStream( (void*)pBuffer, (sal_Size)nSize, STREAM_READ );
1668cdf0e10cSrcweir pStream->ObjectOwnsMemory( sal_True );
1669cdf0e10cSrcweir xStream.set( new utl::OInputStreamWrapper( pStream, sal_True ) );
1670cdf0e10cSrcweir }
1671cdf0e10cSrcweir }
1672cdf0e10cSrcweir }
1673cdf0e10cSrcweir
1674cdf0e10cSrcweir if( !xStream.is() && aFileName.Len() )
1675cdf0e10cSrcweir {
1676cdf0e10cSrcweir SvFileStream* pStream = new SvFileStream( aFileName, STREAM_READ );
1677cdf0e10cSrcweir if( pStream )
1678cdf0e10cSrcweir xStream.set( new utl::OInputStreamWrapper( pStream ) );
1679cdf0e10cSrcweir }
1680cdf0e10cSrcweir }
1681cdf0e10cSrcweir
1682cdf0e10cSrcweir return xStream;
1683cdf0e10cSrcweir }
1684cdf0e10cSrcweir
1685414a0e15SArmin Le Grand // moved crop handle creation here; this is the object type using them
addCropHandles(SdrHdlList & rTarget) const1686414a0e15SArmin Le Grand void SdrGrafObj::addCropHandles(SdrHdlList& rTarget) const
1687414a0e15SArmin Le Grand {
1688414a0e15SArmin Le Grand basegfx::B2DHomMatrix aMatrix;
1689414a0e15SArmin Le Grand basegfx::B2DPolyPolygon aPolyPolygon;
1690414a0e15SArmin Le Grand
1691414a0e15SArmin Le Grand // get object transformation
1692414a0e15SArmin Le Grand TRGetBaseGeometry(aMatrix, aPolyPolygon);
1693414a0e15SArmin Le Grand
1694414a0e15SArmin Le Grand // part of object transformation correction, but used later, so defined outside next scope
1695414a0e15SArmin Le Grand double fShearX(0.0), fRotate(0.0);
1696414a0e15SArmin Le Grand
1697414a0e15SArmin Le Grand { // TTTT correct shear, it comes currently mirrored from TRGetBaseGeometry, can be removed with aw080
1698414a0e15SArmin Le Grand basegfx::B2DTuple aScale;
1699414a0e15SArmin Le Grand basegfx::B2DTuple aTranslate;
1700414a0e15SArmin Le Grand
1701414a0e15SArmin Le Grand aMatrix.decompose(aScale, aTranslate, fRotate, fShearX);
1702414a0e15SArmin Le Grand
1703414a0e15SArmin Le Grand if(!basegfx::fTools::equalZero(fShearX))
1704414a0e15SArmin Le Grand {
1705414a0e15SArmin Le Grand // shearX is used, correct it
1706414a0e15SArmin Le Grand fShearX = -fShearX;
1707414a0e15SArmin Le Grand }
1708414a0e15SArmin Le Grand
1709414a0e15SArmin Le Grand aMatrix = basegfx::tools::createScaleShearXRotateTranslateB2DHomMatrix(
1710414a0e15SArmin Le Grand aScale,
1711414a0e15SArmin Le Grand fShearX,
1712414a0e15SArmin Le Grand fRotate,
1713414a0e15SArmin Le Grand aTranslate);
1714414a0e15SArmin Le Grand }
1715414a0e15SArmin Le Grand
1716414a0e15SArmin Le Grand // get crop values
1717414a0e15SArmin Le Grand const SdrGrafCropItem& rCrop = static_cast< const SdrGrafCropItem& >(GetMergedItem(SDRATTR_GRAFCROP));
1718414a0e15SArmin Le Grand
1719414a0e15SArmin Le Grand if(rCrop.GetLeft() || rCrop.GetTop() || rCrop.GetRight() ||rCrop.GetBottom())
1720414a0e15SArmin Le Grand {
1721414a0e15SArmin Le Grand // decompose object transformation to have current translate and scale
1722414a0e15SArmin Le Grand basegfx::B2DVector aScale, aTranslate;
1723414a0e15SArmin Le Grand double fRotate, fShearX;
1724414a0e15SArmin Le Grand
1725414a0e15SArmin Le Grand aMatrix.decompose(aScale, aTranslate, fRotate, fShearX);
1726414a0e15SArmin Le Grand
1727414a0e15SArmin Le Grand if(!aScale.equalZero())
1728414a0e15SArmin Le Grand {
1729414a0e15SArmin Le Grand // get crop scale
1730414a0e15SArmin Le Grand const basegfx::B2DVector aCropScaleFactor(
1731414a0e15SArmin Le Grand GetGraphicObject().calculateCropScaling(
1732414a0e15SArmin Le Grand aScale.getX(),
1733414a0e15SArmin Le Grand aScale.getY(),
1734414a0e15SArmin Le Grand rCrop.GetLeft(),
1735414a0e15SArmin Le Grand rCrop.GetTop(),
1736414a0e15SArmin Le Grand rCrop.GetRight(),
1737414a0e15SArmin Le Grand rCrop.GetBottom()));
1738414a0e15SArmin Le Grand
1739414a0e15SArmin Le Grand // apply crop scale
1740414a0e15SArmin Le Grand const double fCropLeft(rCrop.GetLeft() * aCropScaleFactor.getX());
1741414a0e15SArmin Le Grand const double fCropTop(rCrop.GetTop() * aCropScaleFactor.getY());
1742414a0e15SArmin Le Grand const double fCropRight(rCrop.GetRight() * aCropScaleFactor.getX());
1743414a0e15SArmin Le Grand const double fCropBottom(rCrop.GetBottom() * aCropScaleFactor.getY());
1744414a0e15SArmin Le Grand basegfx::B2DHomMatrix aMatrixForCropViewHdl(aMatrix);
1745414a0e15SArmin Le Grand
1746414a0e15SArmin Le Grand if(IsMirrored())
1747414a0e15SArmin Le Grand {
1748414a0e15SArmin Le Grand // create corrected new matrix, TTTT can be removed with aw080
1749414a0e15SArmin Le Grand // the old mirror only can mirror horizontally; the vertical mirror
1750414a0e15SArmin Le Grand // is faked by using the horizontal and 180 degree rotation. Since
1751414a0e15SArmin Le Grand // the object can be rotated differently from 180 degree, this is
1752414a0e15SArmin Le Grand // not safe to detect. Just correct horizontal mirror (which is
1753414a0e15SArmin Le Grand // in IsMirrored()) and keep the rotation angle
1754414a0e15SArmin Le Grand // caution: Do not modify aMatrix, it is used below to calculate
1755414a0e15SArmin Le Grand // the exact handle positions
1756414a0e15SArmin Le Grand basegfx::B2DHomMatrix aPreMultiply;
1757414a0e15SArmin Le Grand
1758414a0e15SArmin Le Grand // mirrored X, apply
1759414a0e15SArmin Le Grand aPreMultiply.translate(-0.5, 0.0);
1760414a0e15SArmin Le Grand aPreMultiply.scale(-1.0, 1.0);
1761414a0e15SArmin Le Grand aPreMultiply.translate(0.5, 0.0);
1762414a0e15SArmin Le Grand
1763414a0e15SArmin Le Grand aMatrixForCropViewHdl = aMatrixForCropViewHdl * aPreMultiply;
1764414a0e15SArmin Le Grand }
1765414a0e15SArmin Le Grand
1766414a0e15SArmin Le Grand rTarget.AddHdl(
1767414a0e15SArmin Le Grand new SdrCropViewHdl(
1768414a0e15SArmin Le Grand aMatrixForCropViewHdl,
1769414a0e15SArmin Le Grand GetGraphicObject().GetGraphic(),
1770414a0e15SArmin Le Grand fCropLeft,
1771414a0e15SArmin Le Grand fCropTop,
1772414a0e15SArmin Le Grand fCropRight,
1773414a0e15SArmin Le Grand fCropBottom));
1774414a0e15SArmin Le Grand }
1775414a0e15SArmin Le Grand }
1776414a0e15SArmin Le Grand
1777414a0e15SArmin Le Grand basegfx::B2DPoint aPos;
1778414a0e15SArmin Le Grand
1779414a0e15SArmin Le Grand aPos = aMatrix * basegfx::B2DPoint(0.0, 0.0);
1780414a0e15SArmin Le Grand rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_UPLFT, fShearX, fRotate));
1781414a0e15SArmin Le Grand aPos = aMatrix * basegfx::B2DPoint(0.5, 0.0);
1782414a0e15SArmin Le Grand rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_UPPER, fShearX, fRotate));
1783414a0e15SArmin Le Grand aPos = aMatrix * basegfx::B2DPoint(1.0, 0.0);
1784414a0e15SArmin Le Grand rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_UPRGT, fShearX, fRotate));
1785414a0e15SArmin Le Grand aPos = aMatrix * basegfx::B2DPoint(0.0, 0.5);
1786414a0e15SArmin Le Grand rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_LEFT , fShearX, fRotate));
1787414a0e15SArmin Le Grand aPos = aMatrix * basegfx::B2DPoint(1.0, 0.5);
1788414a0e15SArmin Le Grand rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_RIGHT, fShearX, fRotate));
1789414a0e15SArmin Le Grand aPos = aMatrix * basegfx::B2DPoint(0.0, 1.0);
1790414a0e15SArmin Le Grand rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_LWLFT, fShearX, fRotate));
1791414a0e15SArmin Le Grand aPos = aMatrix * basegfx::B2DPoint(0.5, 1.0);
1792414a0e15SArmin Le Grand rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_LOWER, fShearX, fRotate));
1793414a0e15SArmin Le Grand aPos = aMatrix * basegfx::B2DPoint(1.0, 1.0);
1794414a0e15SArmin Le Grand rTarget.AddHdl(new SdrCropHdl(Point(basegfx::fround(aPos.getX()), basegfx::fround(aPos.getY())), HDL_LWRGT, fShearX, fRotate));
1795414a0e15SArmin Le Grand }
1796414a0e15SArmin Le Grand
1797cdf0e10cSrcweir // eof
1798