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