xref: /trunk/main/svtools/source/misc/embedhlp.cxx (revision 2bfcd321e2172336182a43e6d401b533c4283ceb)
15900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
35900e8ecSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
45900e8ecSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
55900e8ecSAndrew Rist  * distributed with this work for additional information
65900e8ecSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
75900e8ecSAndrew Rist  * to you under the Apache License, Version 2.0 (the
85900e8ecSAndrew Rist  * "License"); you may not use this file except in compliance
95900e8ecSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
115900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
135900e8ecSAndrew Rist  * Unless required by applicable law or agreed to in writing,
145900e8ecSAndrew Rist  * software distributed under the License is distributed on an
155900e8ecSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165900e8ecSAndrew Rist  * KIND, either express or implied.  See the License for the
175900e8ecSAndrew Rist  * specific language governing permissions and limitations
185900e8ecSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
205900e8ecSAndrew Rist  *************************************************************/
215900e8ecSAndrew Rist 
225900e8ecSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <svtools/embedhlp.hxx>
28cdf0e10cSrcweir #include <svtools/filter.hxx>
29cdf0e10cSrcweir #include <svtools/svtools.hrc>
30cdf0e10cSrcweir #include <svtools/svtdata.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <comphelper/embeddedobjectcontainer.hxx>
33cdf0e10cSrcweir #include <comphelper/seqstream.hxx>
34cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
35cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx>
36cdf0e10cSrcweir #include <unotools/streamwrap.hxx>
37*2bfcd321SSteve Yin //IAccessibility2 Implementation 2009-----
38*2bfcd321SSteve Yin #include <com/sun/star/chart2/XChartDocument.hpp>
39*2bfcd321SSteve Yin #include <com/sun/star/chart2/XCoordinateSystem.hpp>
40*2bfcd321SSteve Yin #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
41*2bfcd321SSteve Yin #include <com/sun/star/chart2/XDiagram.hpp>
42*2bfcd321SSteve Yin #include <com/sun/star/chart2/XChartTypeContainer.hpp>
43*2bfcd321SSteve Yin #include <com/sun/star/chart2/XChartType.hpp>
44*2bfcd321SSteve Yin //-----IAccessibility2 Implementation 2009
45cdf0e10cSrcweir #include <tools/globname.hxx>
46cdf0e10cSrcweir #include <sot/clsids.hxx>
47cdf0e10cSrcweir #include <com/sun/star/util/XModifyListener.hpp>
48cdf0e10cSrcweir #ifndef _COM_SUN_STAR_UTIL_XMODIFYiBLE_HPP_
49cdf0e10cSrcweir #include <com/sun/star/util/XModifiable.hpp>
50cdf0e10cSrcweir #endif
51cdf0e10cSrcweir #include <com/sun/star/embed/EmbedStates.hpp>
52cdf0e10cSrcweir #include <com/sun/star/embed/EmbedMisc.hpp>
53cdf0e10cSrcweir #include <com/sun/star/embed/XStateChangeListener.hpp>
54cdf0e10cSrcweir #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
55cdf0e10cSrcweir #include <com/sun/star/util/XModifiable.hpp>
56cdf0e10cSrcweir #include <com/sun/star/datatransfer/XTransferable.hpp>
57cdf0e10cSrcweir #include <com/sun/star/chart2/XDefaultSizeTransmitter.hpp>
58cdf0e10cSrcweir #include <cppuhelper/implbase4.hxx>
59cdf0e10cSrcweir #include "vcl/svapp.hxx"
60cdf0e10cSrcweir #include <rtl/logfile.hxx>
61cdf0e10cSrcweir #include <vos/mutex.hxx>
62cdf0e10cSrcweir 
63cdf0e10cSrcweir using namespace com::sun::star;
64cdf0e10cSrcweir 
65cdf0e10cSrcweir namespace svt
66cdf0e10cSrcweir {
67cdf0e10cSrcweir 
68cdf0e10cSrcweir class EmbedEventListener_Impl : public ::cppu::WeakImplHelper4 < embed::XStateChangeListener,
69cdf0e10cSrcweir                                                                  document::XEventListener,
70cdf0e10cSrcweir                                                                  util::XModifyListener,
71cdf0e10cSrcweir                                                                  util::XCloseListener >
72cdf0e10cSrcweir {
73cdf0e10cSrcweir public:
74cdf0e10cSrcweir     EmbeddedObjectRef*          pObject;
75cdf0e10cSrcweir     sal_Int32                   nState;
76cdf0e10cSrcweir 
77cdf0e10cSrcweir                                 EmbedEventListener_Impl( EmbeddedObjectRef* p ) :
78cdf0e10cSrcweir                                     pObject(p)
79cdf0e10cSrcweir                                     , nState(-1)
80cdf0e10cSrcweir                                 {}
81cdf0e10cSrcweir 
82cdf0e10cSrcweir     static EmbedEventListener_Impl* Create( EmbeddedObjectRef* );
83cdf0e10cSrcweir 
84cdf0e10cSrcweir     virtual void SAL_CALL changingState( const lang::EventObject& aEvent, ::sal_Int32 nOldState, ::sal_Int32 nNewState )
85cdf0e10cSrcweir                                     throw (embed::WrongStateException, uno::RuntimeException);
86cdf0e10cSrcweir     virtual void SAL_CALL stateChanged( const lang::EventObject& aEvent, ::sal_Int32 nOldState, ::sal_Int32 nNewState )
87cdf0e10cSrcweir                                     throw (uno::RuntimeException);
88cdf0e10cSrcweir     virtual void SAL_CALL queryClosing( const lang::EventObject& Source, ::sal_Bool GetsOwnership )
89cdf0e10cSrcweir                                     throw (util::CloseVetoException, uno::RuntimeException);
90cdf0e10cSrcweir     virtual void SAL_CALL notifyClosing( const lang::EventObject& Source ) throw (uno::RuntimeException);
91cdf0e10cSrcweir     virtual void SAL_CALL notifyEvent( const document::EventObject& aEvent ) throw( uno::RuntimeException );
92cdf0e10cSrcweir     virtual void SAL_CALL disposing( const lang::EventObject& aEvent ) throw( uno::RuntimeException );
93cdf0e10cSrcweir     virtual void SAL_CALL modified( const ::com::sun::star::lang::EventObject& aEvent ) throw (::com::sun::star::uno::RuntimeException);
94cdf0e10cSrcweir };
95cdf0e10cSrcweir 
96cdf0e10cSrcweir EmbedEventListener_Impl* EmbedEventListener_Impl::Create( EmbeddedObjectRef* p )
97cdf0e10cSrcweir {
98cdf0e10cSrcweir     EmbedEventListener_Impl* xRet = new EmbedEventListener_Impl( p );
99cdf0e10cSrcweir     xRet->acquire();
100cdf0e10cSrcweir 
101cdf0e10cSrcweir     if ( p->GetObject().is() )
102cdf0e10cSrcweir     {
103cdf0e10cSrcweir         p->GetObject()->addStateChangeListener( xRet );
104cdf0e10cSrcweir 
105cdf0e10cSrcweir         uno::Reference < util::XCloseable > xClose( p->GetObject(), uno::UNO_QUERY );
106cdf0e10cSrcweir         DBG_ASSERT( xClose.is(), "Object does not support XCloseable!" );
107cdf0e10cSrcweir         if ( xClose.is() )
108cdf0e10cSrcweir             xClose->addCloseListener( xRet );
109cdf0e10cSrcweir 
110cdf0e10cSrcweir         uno::Reference < document::XEventBroadcaster > xBrd( p->GetObject(), uno::UNO_QUERY );
111cdf0e10cSrcweir         if ( xBrd.is() )
112cdf0e10cSrcweir             xBrd->addEventListener( xRet );
113cdf0e10cSrcweir 
114cdf0e10cSrcweir         xRet->nState = p->GetObject()->getCurrentState();
115cdf0e10cSrcweir         if ( xRet->nState == embed::EmbedStates::RUNNING )
116cdf0e10cSrcweir         {
117cdf0e10cSrcweir             uno::Reference < util::XModifiable > xMod( p->GetObject()->getComponent(), uno::UNO_QUERY );
118cdf0e10cSrcweir             if ( xMod.is() )
119cdf0e10cSrcweir                 // listen for changes in running state (update replacements in case of changes)
120cdf0e10cSrcweir                 xMod->addModifyListener( xRet );
121cdf0e10cSrcweir         }
122cdf0e10cSrcweir     }
123cdf0e10cSrcweir 
124cdf0e10cSrcweir     return xRet;
125cdf0e10cSrcweir }
126cdf0e10cSrcweir 
127cdf0e10cSrcweir void SAL_CALL EmbedEventListener_Impl::changingState( const lang::EventObject&,
128cdf0e10cSrcweir                                                     ::sal_Int32,
129cdf0e10cSrcweir                                                     ::sal_Int32 )
130cdf0e10cSrcweir     throw ( embed::WrongStateException,
131cdf0e10cSrcweir             uno::RuntimeException )
132cdf0e10cSrcweir {
133cdf0e10cSrcweir }
134cdf0e10cSrcweir 
135cdf0e10cSrcweir void SAL_CALL EmbedEventListener_Impl::stateChanged( const lang::EventObject&,
136cdf0e10cSrcweir                                                     ::sal_Int32 nOldState,
137cdf0e10cSrcweir                                                     ::sal_Int32 nNewState )
138cdf0e10cSrcweir     throw ( uno::RuntimeException )
139cdf0e10cSrcweir {
140cdf0e10cSrcweir     ::vos::OGuard aGuard( Application::GetSolarMutex() );
141cdf0e10cSrcweir     nState = nNewState;
142cdf0e10cSrcweir     if ( !pObject )
143cdf0e10cSrcweir         return;
144cdf0e10cSrcweir 
145cdf0e10cSrcweir     uno::Reference < util::XModifiable > xMod( pObject->GetObject()->getComponent(), uno::UNO_QUERY );
146cdf0e10cSrcweir     if ( nNewState == embed::EmbedStates::RUNNING )
147cdf0e10cSrcweir     {
148cdf0e10cSrcweir         // TODO/LATER: container must be set before!
149cdf0e10cSrcweir         // When is this event created? Who sets the new container when it changed?
150cdf0e10cSrcweir         if( ( pObject->GetViewAspect() != embed::Aspects::MSOLE_ICON ) && nOldState != embed::EmbedStates::LOADED && !pObject->IsChart() )
151cdf0e10cSrcweir             // get new replacement after deactivation
152cdf0e10cSrcweir             pObject->UpdateReplacement();
153cdf0e10cSrcweir 
154cdf0e10cSrcweir         if( pObject->IsChart() && nOldState == embed::EmbedStates::UI_ACTIVE )
155cdf0e10cSrcweir         {
156cdf0e10cSrcweir             //create a new metafile replacement when leaving the edit mode
157cdf0e10cSrcweir             //for buggy documents where the old image looks different from the correct one
158cdf0e10cSrcweir             if( xMod.is() && !xMod->isModified() )//in case of modification a new replacement will be requested anyhow
159cdf0e10cSrcweir                 pObject->UpdateReplacementOnDemand();
160cdf0e10cSrcweir         }
161cdf0e10cSrcweir 
162cdf0e10cSrcweir         if ( xMod.is() && nOldState == embed::EmbedStates::LOADED )
163cdf0e10cSrcweir             // listen for changes (update replacements in case of changes)
164cdf0e10cSrcweir             xMod->addModifyListener( this );
165cdf0e10cSrcweir     }
166cdf0e10cSrcweir     else if ( nNewState == embed::EmbedStates::LOADED )
167cdf0e10cSrcweir     {
168cdf0e10cSrcweir         // in loaded state we can't listen
169cdf0e10cSrcweir         if ( xMod.is() )
170cdf0e10cSrcweir             xMod->removeModifyListener( this );
171cdf0e10cSrcweir     }
172cdf0e10cSrcweir }
173cdf0e10cSrcweir 
174cdf0e10cSrcweir void SAL_CALL EmbedEventListener_Impl::modified( const lang::EventObject& ) throw (uno::RuntimeException)
175cdf0e10cSrcweir {
176cdf0e10cSrcweir     ::vos::OGuard aGuard( Application::GetSolarMutex() );
177cdf0e10cSrcweir     if ( pObject && pObject->GetViewAspect() != embed::Aspects::MSOLE_ICON )
178cdf0e10cSrcweir     {
179cdf0e10cSrcweir         if ( nState == embed::EmbedStates::RUNNING )
180cdf0e10cSrcweir         {
181cdf0e10cSrcweir             // updates only necessary in non-active states
182cdf0e10cSrcweir             if( pObject->IsChart() )
183cdf0e10cSrcweir                 pObject->UpdateReplacementOnDemand();
184cdf0e10cSrcweir             else
185cdf0e10cSrcweir                 pObject->UpdateReplacement();
186cdf0e10cSrcweir         }
187cdf0e10cSrcweir         else if ( nState == embed::EmbedStates::UI_ACTIVE || nState == embed::EmbedStates::INPLACE_ACTIVE )
188cdf0e10cSrcweir         {
189cdf0e10cSrcweir             // in case the object is inplace or UI active the replacement image should be updated on demand
190cdf0e10cSrcweir             pObject->UpdateReplacementOnDemand();
191cdf0e10cSrcweir         }
192cdf0e10cSrcweir     }
193cdf0e10cSrcweir }
194cdf0e10cSrcweir 
195cdf0e10cSrcweir void SAL_CALL EmbedEventListener_Impl::notifyEvent( const document::EventObject& aEvent ) throw( uno::RuntimeException )
196cdf0e10cSrcweir {
197cdf0e10cSrcweir     ::vos::OGuard aGuard( Application::GetSolarMutex() );
198cdf0e10cSrcweir 
199cdf0e10cSrcweir #if 0
200cdf0e10cSrcweir     if ( pObject && aEvent.EventName.equalsAscii("OnSaveDone") || aEvent.EventName.equalsAscii("OnSaveAsDone") )
201cdf0e10cSrcweir     {
202cdf0e10cSrcweir         // TODO/LATER: container must be set before!
203cdf0e10cSrcweir         // When is this event created? Who sets the new container when it changed?
204cdf0e10cSrcweir         pObject->UpdateReplacement();
205cdf0e10cSrcweir     }
206cdf0e10cSrcweir     else
207cdf0e10cSrcweir #endif
208cdf0e10cSrcweir     if ( pObject && aEvent.EventName.equalsAscii("OnVisAreaChanged") && pObject->GetViewAspect() != embed::Aspects::MSOLE_ICON && !pObject->IsChart() )
209cdf0e10cSrcweir     {
210cdf0e10cSrcweir         pObject->UpdateReplacement();
211cdf0e10cSrcweir     }
212cdf0e10cSrcweir }
213cdf0e10cSrcweir 
214cdf0e10cSrcweir void SAL_CALL EmbedEventListener_Impl::queryClosing( const lang::EventObject& Source, ::sal_Bool )
215cdf0e10cSrcweir         throw ( util::CloseVetoException, uno::RuntimeException)
216cdf0e10cSrcweir {
217cdf0e10cSrcweir     // An embedded object can be shared between several objects (f.e. for undo purposes)
218cdf0e10cSrcweir     // the object will not be closed before the last "customer" is destroyed
219cdf0e10cSrcweir     // Now the EmbeddedObjectRef helper class works like a "lock" on the object
220cdf0e10cSrcweir     if ( pObject && pObject->IsLocked() && Source.Source == pObject->GetObject() )
221cdf0e10cSrcweir         throw util::CloseVetoException();
222cdf0e10cSrcweir }
223cdf0e10cSrcweir 
224cdf0e10cSrcweir void SAL_CALL EmbedEventListener_Impl::notifyClosing( const lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException)
225cdf0e10cSrcweir {
226cdf0e10cSrcweir     if ( pObject && Source.Source == pObject->GetObject() )
227cdf0e10cSrcweir     {
228cdf0e10cSrcweir         pObject->Clear();
229cdf0e10cSrcweir         pObject = 0;
230cdf0e10cSrcweir     }
231cdf0e10cSrcweir }
232cdf0e10cSrcweir 
233cdf0e10cSrcweir void SAL_CALL EmbedEventListener_Impl::disposing( const lang::EventObject& aEvent ) throw( uno::RuntimeException )
234cdf0e10cSrcweir {
235cdf0e10cSrcweir     if ( pObject && aEvent.Source == pObject->GetObject() )
236cdf0e10cSrcweir     {
237cdf0e10cSrcweir         pObject->Clear();
238cdf0e10cSrcweir         pObject = 0;
239cdf0e10cSrcweir     }
240cdf0e10cSrcweir }
241cdf0e10cSrcweir 
242cdf0e10cSrcweir struct EmbeddedObjectRef_Impl
243cdf0e10cSrcweir {
244cdf0e10cSrcweir     EmbedEventListener_Impl*                    xListener;
245cdf0e10cSrcweir     ::rtl::OUString                             aPersistName;
246cdf0e10cSrcweir     ::rtl::OUString                             aMediaType;
247cdf0e10cSrcweir     comphelper::EmbeddedObjectContainer*        pContainer;
248cdf0e10cSrcweir     Graphic*                                    pGraphic;
249cdf0e10cSrcweir     Graphic*                                    pHCGraphic;
250cdf0e10cSrcweir     sal_Int64                                   nViewAspect;
251cdf0e10cSrcweir     sal_Bool                                        bIsLocked;
252cdf0e10cSrcweir     sal_Bool                                    bNeedUpdate;
253cdf0e10cSrcweir 
254cdf0e10cSrcweir     // #i104867#
255cdf0e10cSrcweir     sal_uInt32                                  mnGraphicVersion;
256cdf0e10cSrcweir     awt::Size                                   aDefaultSizeForChart_In_100TH_MM;//#i103460# charts do not necessaryly have an own size within ODF files, in this case they need to use the size settings from the surrounding frame, which is made available with this member
257cdf0e10cSrcweir };
258cdf0e10cSrcweir 
259cdf0e10cSrcweir void EmbeddedObjectRef::Construct_Impl()
260cdf0e10cSrcweir {
261cdf0e10cSrcweir     mpImp = new EmbeddedObjectRef_Impl;
262cdf0e10cSrcweir     mpImp->pContainer = 0;
263cdf0e10cSrcweir     mpImp->pGraphic = 0;
264cdf0e10cSrcweir     mpImp->pHCGraphic = 0;
265cdf0e10cSrcweir     mpImp->nViewAspect = embed::Aspects::MSOLE_CONTENT;
266cdf0e10cSrcweir     mpImp->bIsLocked = sal_False;
267cdf0e10cSrcweir     mpImp->bNeedUpdate = sal_False;
268cdf0e10cSrcweir     mpImp->mnGraphicVersion = 0;
269cdf0e10cSrcweir     mpImp->aDefaultSizeForChart_In_100TH_MM = awt::Size(8000,7000);
270cdf0e10cSrcweir }
271cdf0e10cSrcweir 
272cdf0e10cSrcweir EmbeddedObjectRef::EmbeddedObjectRef()
273cdf0e10cSrcweir {
274cdf0e10cSrcweir     Construct_Impl();
275cdf0e10cSrcweir }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir EmbeddedObjectRef::EmbeddedObjectRef( const NS_UNO::Reference < NS_EMBED::XEmbeddedObject >& xObj, sal_Int64 nAspect )
278cdf0e10cSrcweir {
279cdf0e10cSrcweir     Construct_Impl();
280cdf0e10cSrcweir     mpImp->nViewAspect = nAspect;
281cdf0e10cSrcweir     mxObj = xObj;
282cdf0e10cSrcweir     mpImp->xListener = EmbedEventListener_Impl::Create( this );
283cdf0e10cSrcweir }
284cdf0e10cSrcweir 
285cdf0e10cSrcweir EmbeddedObjectRef::EmbeddedObjectRef( const EmbeddedObjectRef& rObj )
286cdf0e10cSrcweir {
287cdf0e10cSrcweir     mpImp = new EmbeddedObjectRef_Impl;
288cdf0e10cSrcweir     mpImp->pContainer = rObj.mpImp->pContainer;
289cdf0e10cSrcweir     mpImp->nViewAspect = rObj.mpImp->nViewAspect;
290cdf0e10cSrcweir     mpImp->bIsLocked = rObj.mpImp->bIsLocked;
291cdf0e10cSrcweir     mxObj = rObj.mxObj;
292cdf0e10cSrcweir     mpImp->xListener = EmbedEventListener_Impl::Create( this );
293cdf0e10cSrcweir     mpImp->aPersistName = rObj.mpImp->aPersistName;
294cdf0e10cSrcweir     mpImp->aMediaType = rObj.mpImp->aMediaType;
295cdf0e10cSrcweir     mpImp->bNeedUpdate = rObj.mpImp->bNeedUpdate;
296cdf0e10cSrcweir     mpImp->aDefaultSizeForChart_In_100TH_MM = rObj.mpImp->aDefaultSizeForChart_In_100TH_MM;
297cdf0e10cSrcweir 
298cdf0e10cSrcweir     if ( rObj.mpImp->pGraphic && !rObj.mpImp->bNeedUpdate )
299cdf0e10cSrcweir         mpImp->pGraphic = new Graphic( *rObj.mpImp->pGraphic );
300cdf0e10cSrcweir     else
301cdf0e10cSrcweir         mpImp->pGraphic = 0;
302cdf0e10cSrcweir 
303cdf0e10cSrcweir     mpImp->pHCGraphic = 0;
304cdf0e10cSrcweir     mpImp->mnGraphicVersion = 0;
305cdf0e10cSrcweir }
306cdf0e10cSrcweir 
307cdf0e10cSrcweir EmbeddedObjectRef::~EmbeddedObjectRef()
308cdf0e10cSrcweir {
309cdf0e10cSrcweir     delete mpImp->pGraphic;
310cdf0e10cSrcweir     if ( mpImp->pHCGraphic )
311cdf0e10cSrcweir         DELETEZ( mpImp->pHCGraphic );
312cdf0e10cSrcweir     Clear();
3134fa9ac85SHerbert Dürr     delete mpImp;
314cdf0e10cSrcweir }
315cdf0e10cSrcweir /*
316cdf0e10cSrcweir EmbeddedObjectRef& EmbeddedObjectRef::operator = ( const EmbeddedObjectRef& rObj )
317cdf0e10cSrcweir {
318cdf0e10cSrcweir     DBG_ASSERT( !mxObj.is(), "Never assign an already assigned object!" );
319cdf0e10cSrcweir 
320cdf0e10cSrcweir     delete mpImp->pGraphic;
321cdf0e10cSrcweir     if ( mpImp->pHCGraphic ) DELETEZ( mpImp->pHCGraphic );
322cdf0e10cSrcweir     Clear();
323cdf0e10cSrcweir 
324cdf0e10cSrcweir     mpImp->nViewAspect = rObj.mpImp->nViewAspect;
325cdf0e10cSrcweir     mpImp->bIsLocked = rObj.mpImp->bIsLocked;
326cdf0e10cSrcweir     mxObj = rObj.mxObj;
327cdf0e10cSrcweir     mpImp->xListener = EmbedEventListener_Impl::Create( this );
328cdf0e10cSrcweir     mpImp->pContainer = rObj.mpImp->pContainer;
329cdf0e10cSrcweir     mpImp->aPersistName = rObj.mpImp->aPersistName;
330cdf0e10cSrcweir     mpImp->aMediaType = rObj.mpImp->aMediaType;
331cdf0e10cSrcweir     mpImp->bNeedUpdate = rObj.mpImp->bNeedUpdate;
332cdf0e10cSrcweir 
333cdf0e10cSrcweir     if ( rObj.mpImp->pGraphic && !rObj.mpImp->bNeedUpdate )
334cdf0e10cSrcweir         mpImp->pGraphic = new Graphic( *rObj.mpImp->pGraphic );
335cdf0e10cSrcweir     else
336cdf0e10cSrcweir         mpImp->pGraphic = 0;
337cdf0e10cSrcweir     return *this;
338cdf0e10cSrcweir }
339cdf0e10cSrcweir */
340cdf0e10cSrcweir void EmbeddedObjectRef::Assign( const NS_UNO::Reference < NS_EMBED::XEmbeddedObject >& xObj, sal_Int64 nAspect )
341cdf0e10cSrcweir {
342cdf0e10cSrcweir     DBG_ASSERT( !mxObj.is(), "Never assign an already assigned object!" );
343cdf0e10cSrcweir 
344cdf0e10cSrcweir     Clear();
345cdf0e10cSrcweir     mpImp->nViewAspect = nAspect;
346cdf0e10cSrcweir     mxObj = xObj;
347cdf0e10cSrcweir     mpImp->xListener = EmbedEventListener_Impl::Create( this );
348cdf0e10cSrcweir 
349cdf0e10cSrcweir     //#i103460#
350cdf0e10cSrcweir     if ( IsChart() )
351cdf0e10cSrcweir     {
352cdf0e10cSrcweir         ::com::sun::star::uno::Reference < ::com::sun::star::chart2::XDefaultSizeTransmitter > xSizeTransmitter( xObj, uno::UNO_QUERY );
353cdf0e10cSrcweir         DBG_ASSERT( xSizeTransmitter.is(), "Object does not support XDefaultSizeTransmitter -> will cause #i103460#!" );
354cdf0e10cSrcweir         if( xSizeTransmitter.is() )
355cdf0e10cSrcweir             xSizeTransmitter->setDefaultSize( mpImp->aDefaultSizeForChart_In_100TH_MM );
356cdf0e10cSrcweir     }
357cdf0e10cSrcweir }
358cdf0e10cSrcweir 
359cdf0e10cSrcweir void EmbeddedObjectRef::Clear()
360cdf0e10cSrcweir {
361cdf0e10cSrcweir     if ( mxObj.is() && mpImp->xListener )
362cdf0e10cSrcweir     {
363cdf0e10cSrcweir         mxObj->removeStateChangeListener( mpImp->xListener );
364cdf0e10cSrcweir 
365cdf0e10cSrcweir         uno::Reference < util::XCloseable > xClose( mxObj, uno::UNO_QUERY );
366cdf0e10cSrcweir         if ( xClose.is() )
367cdf0e10cSrcweir             xClose->removeCloseListener( mpImp->xListener );
368cdf0e10cSrcweir 
369cdf0e10cSrcweir         uno::Reference < document::XEventBroadcaster > xBrd( mxObj, uno::UNO_QUERY );
370cdf0e10cSrcweir         if ( xBrd.is() )
371cdf0e10cSrcweir             xBrd->removeEventListener( mpImp->xListener );
372cdf0e10cSrcweir 
373cdf0e10cSrcweir         if ( mpImp->bIsLocked )
374cdf0e10cSrcweir         {
375cdf0e10cSrcweir             if ( xClose.is() )
376cdf0e10cSrcweir             {
377cdf0e10cSrcweir                 try
378cdf0e10cSrcweir                 {
379cdf0e10cSrcweir                     mxObj->changeState( embed::EmbedStates::LOADED );
380cdf0e10cSrcweir                     xClose->close( sal_True );
381cdf0e10cSrcweir                 }
382cdf0e10cSrcweir                 catch ( util::CloseVetoException& )
383cdf0e10cSrcweir                 {
384cdf0e10cSrcweir                     // there's still someone who needs the object!
385cdf0e10cSrcweir                 }
386cdf0e10cSrcweir                 catch ( uno::Exception& )
387cdf0e10cSrcweir                 {
388cdf0e10cSrcweir                     OSL_ENSURE( sal_False, "Error on switching of the object to loaded state and closing!\n" );
389cdf0e10cSrcweir                 }
390cdf0e10cSrcweir             }
391cdf0e10cSrcweir         }
392cdf0e10cSrcweir 
393cdf0e10cSrcweir         if ( mpImp->xListener )
394cdf0e10cSrcweir         {
395cdf0e10cSrcweir             mpImp->xListener->pObject = 0;
396cdf0e10cSrcweir             mpImp->xListener->release();
397cdf0e10cSrcweir             mpImp->xListener = 0;
398cdf0e10cSrcweir         }
399cdf0e10cSrcweir 
400cdf0e10cSrcweir         mxObj = 0;
401cdf0e10cSrcweir         mpImp->bNeedUpdate = sal_False;
402cdf0e10cSrcweir     }
403cdf0e10cSrcweir 
404cdf0e10cSrcweir     mpImp->pContainer = 0;
405cdf0e10cSrcweir     mpImp->bIsLocked = sal_False;
406cdf0e10cSrcweir     mpImp->bNeedUpdate = sal_False;
407cdf0e10cSrcweir }
408cdf0e10cSrcweir 
409cdf0e10cSrcweir void EmbeddedObjectRef::AssignToContainer( comphelper::EmbeddedObjectContainer* pContainer, const ::rtl::OUString& rPersistName )
410cdf0e10cSrcweir {
411cdf0e10cSrcweir     mpImp->pContainer = pContainer;
412cdf0e10cSrcweir     mpImp->aPersistName = rPersistName;
413cdf0e10cSrcweir 
414cdf0e10cSrcweir     if ( mpImp->pGraphic && !mpImp->bNeedUpdate && pContainer )
415cdf0e10cSrcweir         SetGraphicToContainer( *mpImp->pGraphic, *pContainer, mpImp->aPersistName, ::rtl::OUString() );
416cdf0e10cSrcweir }
417cdf0e10cSrcweir 
418cdf0e10cSrcweir comphelper::EmbeddedObjectContainer* EmbeddedObjectRef::GetContainer() const
419cdf0e10cSrcweir {
420cdf0e10cSrcweir     return mpImp->pContainer;
421cdf0e10cSrcweir }
422cdf0e10cSrcweir 
423cdf0e10cSrcweir ::rtl::OUString EmbeddedObjectRef::GetPersistName() const
424cdf0e10cSrcweir {
425cdf0e10cSrcweir     return mpImp->aPersistName;
426cdf0e10cSrcweir }
427cdf0e10cSrcweir 
428cdf0e10cSrcweir MapUnit EmbeddedObjectRef::GetMapUnit() const
429cdf0e10cSrcweir {
430cdf0e10cSrcweir     if ( mpImp->nViewAspect == embed::Aspects::MSOLE_CONTENT )
431cdf0e10cSrcweir         return VCLUnoHelper::UnoEmbed2VCLMapUnit( mxObj->getMapUnit( mpImp->nViewAspect ) );
432cdf0e10cSrcweir     else
433cdf0e10cSrcweir         // TODO/LATER: currently only CONTENT aspect requires communication with the object
434cdf0e10cSrcweir         return MAP_100TH_MM;
435cdf0e10cSrcweir }
436cdf0e10cSrcweir 
437cdf0e10cSrcweir sal_Int64 EmbeddedObjectRef::GetViewAspect() const
438cdf0e10cSrcweir {
439cdf0e10cSrcweir     return mpImp->nViewAspect;
440cdf0e10cSrcweir }
441cdf0e10cSrcweir 
442cdf0e10cSrcweir void EmbeddedObjectRef::SetViewAspect( sal_Int64 nAspect )
443cdf0e10cSrcweir {
444cdf0e10cSrcweir     mpImp->nViewAspect = nAspect;
445cdf0e10cSrcweir }
446cdf0e10cSrcweir 
447cdf0e10cSrcweir void EmbeddedObjectRef::Lock( sal_Bool bLock )
448cdf0e10cSrcweir {
449cdf0e10cSrcweir     mpImp->bIsLocked = bLock;
450cdf0e10cSrcweir }
451cdf0e10cSrcweir 
452cdf0e10cSrcweir sal_Bool EmbeddedObjectRef::IsLocked() const
453cdf0e10cSrcweir {
454cdf0e10cSrcweir     return mpImp->bIsLocked;
455cdf0e10cSrcweir }
456cdf0e10cSrcweir 
457cdf0e10cSrcweir void EmbeddedObjectRef::GetReplacement( sal_Bool bUpdate )
458cdf0e10cSrcweir {
459cdf0e10cSrcweir     if ( bUpdate )
460cdf0e10cSrcweir     {
461cdf0e10cSrcweir         DELETEZ( mpImp->pGraphic );
462cdf0e10cSrcweir         mpImp->aMediaType = ::rtl::OUString();
463cdf0e10cSrcweir         mpImp->pGraphic = new Graphic;
464cdf0e10cSrcweir         if ( mpImp->pHCGraphic )
465cdf0e10cSrcweir             DELETEZ( mpImp->pHCGraphic );
466cdf0e10cSrcweir         mpImp->mnGraphicVersion++;
467cdf0e10cSrcweir     }
468cdf0e10cSrcweir     else if ( !mpImp->pGraphic )
469cdf0e10cSrcweir     {
470cdf0e10cSrcweir         mpImp->pGraphic = new Graphic;
471cdf0e10cSrcweir         mpImp->mnGraphicVersion++;
472cdf0e10cSrcweir     }
473cdf0e10cSrcweir     else
474cdf0e10cSrcweir     {
475cdf0e10cSrcweir         DBG_ERROR("No update, but replacement exists already!");
476cdf0e10cSrcweir         return;
477cdf0e10cSrcweir     }
478cdf0e10cSrcweir 
479cdf0e10cSrcweir     SvStream* pGraphicStream = GetGraphicStream( bUpdate );
480cdf0e10cSrcweir     if ( pGraphicStream )
481cdf0e10cSrcweir     {
482cdf0e10cSrcweir         GraphicFilter* pGF = GraphicFilter::GetGraphicFilter();
483cdf0e10cSrcweir         if( mpImp->pGraphic )
484cdf0e10cSrcweir             pGF->ImportGraphic( *mpImp->pGraphic, String(), *pGraphicStream, GRFILTER_FORMAT_DONTKNOW );
485cdf0e10cSrcweir         mpImp->mnGraphicVersion++;
486cdf0e10cSrcweir         delete pGraphicStream;
487cdf0e10cSrcweir     }
488cdf0e10cSrcweir }
489cdf0e10cSrcweir 
490cdf0e10cSrcweir Graphic* EmbeddedObjectRef::GetGraphic( ::rtl::OUString* pMediaType ) const
491cdf0e10cSrcweir {
4922c35faf5SArmin Le Grand     try
4932c35faf5SArmin Le Grand     {
494cdf0e10cSrcweir         if ( mpImp->bNeedUpdate )
495cdf0e10cSrcweir             // bNeedUpdate will be set to false while retrieving new replacement
496cdf0e10cSrcweir             const_cast < EmbeddedObjectRef* >(this)->GetReplacement( sal_True );
497cdf0e10cSrcweir         else if ( !mpImp->pGraphic )
498cdf0e10cSrcweir             const_cast < EmbeddedObjectRef* >(this)->GetReplacement( sal_False );
4992c35faf5SArmin Le Grand     }
5002c35faf5SArmin Le Grand     catch( uno::Exception& )
5012c35faf5SArmin Le Grand     {
5022c35faf5SArmin Le Grand         OSL_ENSURE( sal_False, "Something went wrong on getting the graphic!" );
5032c35faf5SArmin Le Grand     }
504cdf0e10cSrcweir 
505cdf0e10cSrcweir     if ( mpImp->pGraphic && pMediaType )
506cdf0e10cSrcweir         *pMediaType = mpImp->aMediaType;
507cdf0e10cSrcweir     return mpImp->pGraphic;
508cdf0e10cSrcweir }
509cdf0e10cSrcweir 
510cdf0e10cSrcweir Size EmbeddedObjectRef::GetSize( MapMode* pTargetMapMode ) const
511cdf0e10cSrcweir {
512cdf0e10cSrcweir     MapMode aSourceMapMode( MAP_100TH_MM );
513cdf0e10cSrcweir     Size aResult;
514cdf0e10cSrcweir 
515cdf0e10cSrcweir     if ( mpImp->nViewAspect == embed::Aspects::MSOLE_ICON )
516cdf0e10cSrcweir     {
517cdf0e10cSrcweir         Graphic* pGraphic = GetGraphic();
518cdf0e10cSrcweir         if ( pGraphic )
519cdf0e10cSrcweir         {
520cdf0e10cSrcweir             aSourceMapMode = pGraphic->GetPrefMapMode();
521cdf0e10cSrcweir             aResult = pGraphic->GetPrefSize();
522cdf0e10cSrcweir         }
523cdf0e10cSrcweir         else
524cdf0e10cSrcweir             aResult = Size( 2500, 2500 );
525cdf0e10cSrcweir     }
526cdf0e10cSrcweir     else
527cdf0e10cSrcweir     {
528cdf0e10cSrcweir         awt::Size aSize;
529cdf0e10cSrcweir 
530cdf0e10cSrcweir         if ( mxObj.is() )
531cdf0e10cSrcweir         {
532cdf0e10cSrcweir             try
533cdf0e10cSrcweir             {
534cdf0e10cSrcweir                 aSize = mxObj->getVisualAreaSize( mpImp->nViewAspect );
535cdf0e10cSrcweir             }
536cdf0e10cSrcweir             catch( embed::NoVisualAreaSizeException& )
537cdf0e10cSrcweir             {
538cdf0e10cSrcweir             }
539cdf0e10cSrcweir             catch( uno::Exception& )
540cdf0e10cSrcweir             {
541cdf0e10cSrcweir                 OSL_ENSURE( sal_False, "Something went wrong on getting of the size of the object!" );
542cdf0e10cSrcweir             }
543cdf0e10cSrcweir 
544cdf0e10cSrcweir             try
545cdf0e10cSrcweir             {
546cdf0e10cSrcweir                 aSourceMapMode = VCLUnoHelper::UnoEmbed2VCLMapUnit( mxObj->getMapUnit( mpImp->nViewAspect ) );
547cdf0e10cSrcweir             }
548cdf0e10cSrcweir             catch( uno::Exception )
549cdf0e10cSrcweir             {
550cdf0e10cSrcweir                 OSL_ENSURE( sal_False, "Can not get the map mode!" );
551cdf0e10cSrcweir             }
552cdf0e10cSrcweir         }
553cdf0e10cSrcweir 
554cdf0e10cSrcweir         if ( !aSize.Height && !aSize.Width )
555cdf0e10cSrcweir         {
556cdf0e10cSrcweir             aSize.Width = 5000;
557cdf0e10cSrcweir             aSize.Height = 5000;
558cdf0e10cSrcweir         }
559cdf0e10cSrcweir 
560cdf0e10cSrcweir         aResult = Size( aSize.Width, aSize.Height );
561cdf0e10cSrcweir     }
562cdf0e10cSrcweir 
563cdf0e10cSrcweir     if ( pTargetMapMode )
564cdf0e10cSrcweir         aResult = OutputDevice::LogicToLogic( aResult, aSourceMapMode, *pTargetMapMode );
565cdf0e10cSrcweir 
566cdf0e10cSrcweir     return aResult;
567cdf0e10cSrcweir }
568cdf0e10cSrcweir 
569cdf0e10cSrcweir Graphic* EmbeddedObjectRef::GetHCGraphic() const
570cdf0e10cSrcweir {
571cdf0e10cSrcweir     if ( !mpImp->pHCGraphic )
572cdf0e10cSrcweir     {
573cdf0e10cSrcweir         uno::Reference< io::XInputStream > xInStream;
574cdf0e10cSrcweir         try
575cdf0e10cSrcweir         {
576cdf0e10cSrcweir             // if the object needs size on load, that means that it is not our object
577cdf0e10cSrcweir             // currently the HC mode is supported only for OOo own objects so the following
578cdf0e10cSrcweir             // check is used as an optimization
579cdf0e10cSrcweir             // TODO/LATER: shouldn't there be a special status flag to detect alien implementation?
580cdf0e10cSrcweir             if ( mpImp->nViewAspect == embed::Aspects::MSOLE_CONTENT
581cdf0e10cSrcweir               && mxObj.is() && !( mxObj->getStatus( mpImp->nViewAspect ) & embed::EmbedMisc::EMBED_NEEDSSIZEONLOAD ) )
582cdf0e10cSrcweir             {
583cdf0e10cSrcweir                 // TODO/LATER: optimization, it makes no sence to do it for OLE objects
584cdf0e10cSrcweir                 if ( mxObj->getCurrentState() == embed::EmbedStates::LOADED )
585cdf0e10cSrcweir                     mxObj->changeState( embed::EmbedStates::RUNNING );
586cdf0e10cSrcweir 
587cdf0e10cSrcweir                 // TODO: return for the aspect of the document
588cdf0e10cSrcweir                 embed::VisualRepresentation aVisualRepresentation;
589cdf0e10cSrcweir                 uno::Reference< datatransfer::XTransferable > xTransferable( mxObj->getComponent(), uno::UNO_QUERY );
590cdf0e10cSrcweir                 if ( !xTransferable.is() )
591cdf0e10cSrcweir                     throw uno::RuntimeException();
592cdf0e10cSrcweir 
593cdf0e10cSrcweir                 datatransfer::DataFlavor aDataFlavor(
594cdf0e10cSrcweir                         ::rtl::OUString::createFromAscii(
595cdf0e10cSrcweir                                 "application/x-openoffice-highcontrast-gdimetafile;windows_formatname=\"GDIMetaFile\"" ),
596cdf0e10cSrcweir                         ::rtl::OUString::createFromAscii( "GDIMetaFile" ),
597cdf0e10cSrcweir                         ::getCppuType( (const uno::Sequence< sal_Int8 >*) NULL ) );
598cdf0e10cSrcweir 
599cdf0e10cSrcweir                 uno::Sequence < sal_Int8 > aSeq;
600cdf0e10cSrcweir                 if ( ( xTransferable->getTransferData( aDataFlavor ) >>= aSeq ) && aSeq.getLength() )
601cdf0e10cSrcweir                     xInStream = new ::comphelper::SequenceInputStream( aSeq );
602cdf0e10cSrcweir             }
603cdf0e10cSrcweir         }
604cdf0e10cSrcweir         catch ( uno::Exception& )
605cdf0e10cSrcweir         {
6062c35faf5SArmin Le Grand             OSL_ENSURE( sal_False, "Something went wrong on getting the high contrast graphic!" );
607cdf0e10cSrcweir         }
608cdf0e10cSrcweir 
609cdf0e10cSrcweir         if ( xInStream.is() )
610cdf0e10cSrcweir         {
611cdf0e10cSrcweir             SvStream* pStream = NULL;
612cdf0e10cSrcweir             pStream = ::utl::UcbStreamHelper::CreateStream( xInStream );
613cdf0e10cSrcweir             if ( pStream )
614cdf0e10cSrcweir             {
615cdf0e10cSrcweir                 if ( !pStream->GetError() )
616cdf0e10cSrcweir                 {
617cdf0e10cSrcweir                     GraphicFilter* pGF = GraphicFilter::GetGraphicFilter();
618cdf0e10cSrcweir                     Graphic* pGraphic = new Graphic();
619cdf0e10cSrcweir                     if ( pGF->ImportGraphic( *pGraphic, String(), *pStream, GRFILTER_FORMAT_DONTKNOW ) == 0 )
620cdf0e10cSrcweir                         mpImp->pHCGraphic = pGraphic;
621cdf0e10cSrcweir                     else
622cdf0e10cSrcweir                         delete pGraphic;
623cdf0e10cSrcweir                     mpImp->mnGraphicVersion++;
624cdf0e10cSrcweir                 }
625cdf0e10cSrcweir 
626cdf0e10cSrcweir                 delete pStream;
627cdf0e10cSrcweir             }
628cdf0e10cSrcweir         }
629cdf0e10cSrcweir     }
630cdf0e10cSrcweir 
631cdf0e10cSrcweir     return mpImp->pHCGraphic;
632cdf0e10cSrcweir }
633cdf0e10cSrcweir 
634cdf0e10cSrcweir void EmbeddedObjectRef::SetGraphicStream( const uno::Reference< io::XInputStream >& xInGrStream,
635cdf0e10cSrcweir                                             const ::rtl::OUString& rMediaType )
636cdf0e10cSrcweir {
637cdf0e10cSrcweir     if ( mpImp->pGraphic )
638cdf0e10cSrcweir         delete mpImp->pGraphic;
639cdf0e10cSrcweir     mpImp->pGraphic = new Graphic();
640cdf0e10cSrcweir     mpImp->aMediaType = rMediaType;
641cdf0e10cSrcweir     if ( mpImp->pHCGraphic )
642cdf0e10cSrcweir         DELETEZ( mpImp->pHCGraphic );
643cdf0e10cSrcweir     mpImp->mnGraphicVersion++;
644cdf0e10cSrcweir 
645cdf0e10cSrcweir     SvStream* pGraphicStream = ::utl::UcbStreamHelper::CreateStream( xInGrStream );
646cdf0e10cSrcweir 
647cdf0e10cSrcweir     if ( pGraphicStream )
648cdf0e10cSrcweir     {
649cdf0e10cSrcweir         GraphicFilter* pGF = GraphicFilter::GetGraphicFilter();
650cdf0e10cSrcweir         pGF->ImportGraphic( *mpImp->pGraphic, String(), *pGraphicStream, GRFILTER_FORMAT_DONTKNOW );
651cdf0e10cSrcweir         mpImp->mnGraphicVersion++;
652cdf0e10cSrcweir 
653cdf0e10cSrcweir         if ( mpImp->pContainer )
654cdf0e10cSrcweir         {
655cdf0e10cSrcweir             pGraphicStream->Seek( 0 );
656cdf0e10cSrcweir             uno::Reference< io::XInputStream > xInSeekGrStream = new ::utl::OSeekableInputStreamWrapper( pGraphicStream );
657cdf0e10cSrcweir 
658cdf0e10cSrcweir             mpImp->pContainer->InsertGraphicStream( xInSeekGrStream, mpImp->aPersistName, rMediaType );
659cdf0e10cSrcweir         }
660cdf0e10cSrcweir 
661cdf0e10cSrcweir         delete pGraphicStream;
662cdf0e10cSrcweir     }
663cdf0e10cSrcweir 
664cdf0e10cSrcweir     mpImp->bNeedUpdate = sal_False;
665cdf0e10cSrcweir 
666cdf0e10cSrcweir }
667cdf0e10cSrcweir 
668cdf0e10cSrcweir void EmbeddedObjectRef::SetGraphic( const Graphic& rGraphic, const ::rtl::OUString& rMediaType )
669cdf0e10cSrcweir {
670cdf0e10cSrcweir     if ( mpImp->pGraphic )
671cdf0e10cSrcweir         delete mpImp->pGraphic;
672cdf0e10cSrcweir     mpImp->pGraphic = new Graphic( rGraphic );
673cdf0e10cSrcweir     mpImp->aMediaType = rMediaType;
674cdf0e10cSrcweir     if ( mpImp->pHCGraphic )
675cdf0e10cSrcweir         DELETEZ( mpImp->pHCGraphic );
676cdf0e10cSrcweir     mpImp->mnGraphicVersion++;
677cdf0e10cSrcweir 
678cdf0e10cSrcweir     if ( mpImp->pContainer )
679cdf0e10cSrcweir         SetGraphicToContainer( rGraphic, *mpImp->pContainer, mpImp->aPersistName, rMediaType );
680cdf0e10cSrcweir 
681cdf0e10cSrcweir     mpImp->bNeedUpdate = sal_False;
682cdf0e10cSrcweir }
683cdf0e10cSrcweir 
684cdf0e10cSrcweir SvStream* EmbeddedObjectRef::GetGraphicStream( sal_Bool bUpdate ) const
685cdf0e10cSrcweir {
686cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT( aLog, "svtools (mv76033) svt::EmbeddedObjectRef::GetGraphicStream" );
687cdf0e10cSrcweir     DBG_ASSERT( bUpdate || mpImp->pContainer, "Can't retrieve current graphic!" );
688cdf0e10cSrcweir     uno::Reference < io::XInputStream > xStream;
689cdf0e10cSrcweir     if ( mpImp->pContainer && !bUpdate )
690cdf0e10cSrcweir     {
691cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_TRACE( aLog, "getting stream from container" );
692cdf0e10cSrcweir         // try to get graphic stream from container storage
693cdf0e10cSrcweir         xStream = mpImp->pContainer->GetGraphicStream( mxObj, &mpImp->aMediaType );
694cdf0e10cSrcweir         if ( xStream.is() )
695cdf0e10cSrcweir         {
696cdf0e10cSrcweir             const sal_Int32 nConstBufferSize = 32000;
697cdf0e10cSrcweir             SvStream *pStream = new SvMemoryStream( 32000, 32000 );
698cdf0e10cSrcweir             sal_Int32 nRead=0;
699cdf0e10cSrcweir             uno::Sequence < sal_Int8 > aSequence ( nConstBufferSize );
700cdf0e10cSrcweir             do
701cdf0e10cSrcweir             {
702cdf0e10cSrcweir                 nRead = xStream->readBytes ( aSequence, nConstBufferSize );
703cdf0e10cSrcweir                 pStream->Write( aSequence.getConstArray(), nRead );
704cdf0e10cSrcweir             }
705cdf0e10cSrcweir             while ( nRead == nConstBufferSize );
706cdf0e10cSrcweir             pStream->Seek(0);
707cdf0e10cSrcweir             return pStream;
708cdf0e10cSrcweir         }
709cdf0e10cSrcweir     }
710cdf0e10cSrcweir 
711cdf0e10cSrcweir     if ( !xStream.is() )
712cdf0e10cSrcweir     {
713cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_TRACE( aLog, "getting stream from object" );
714cdf0e10cSrcweir         // update wanted or no stream in container storage available
715cdf0e10cSrcweir         xStream = GetGraphicReplacementStream( mpImp->nViewAspect, mxObj, &mpImp->aMediaType );
716cdf0e10cSrcweir 
717cdf0e10cSrcweir         if ( xStream.is() )
718cdf0e10cSrcweir         {
719cdf0e10cSrcweir             if ( mpImp->pContainer )
720cdf0e10cSrcweir                 mpImp->pContainer->InsertGraphicStream( xStream, mpImp->aPersistName, mpImp->aMediaType );
721cdf0e10cSrcweir 
722cdf0e10cSrcweir             SvStream* pResult = ::utl::UcbStreamHelper::CreateStream( xStream );
723cdf0e10cSrcweir             if ( pResult && bUpdate )
724cdf0e10cSrcweir                 mpImp->bNeedUpdate = sal_False;
725cdf0e10cSrcweir 
726cdf0e10cSrcweir             return pResult;
727cdf0e10cSrcweir         }
728cdf0e10cSrcweir     }
729cdf0e10cSrcweir 
730cdf0e10cSrcweir     return NULL;
731cdf0e10cSrcweir }
732cdf0e10cSrcweir 
733cdf0e10cSrcweir void EmbeddedObjectRef::DrawPaintReplacement( const Rectangle &rRect, const String &rText, OutputDevice *pOut )
734cdf0e10cSrcweir {
735cdf0e10cSrcweir     MapMode aMM( MAP_APPFONT );
736cdf0e10cSrcweir     Size aAppFontSz = pOut->LogicToLogic( Size( 0, 8 ), &aMM, NULL );
737cdf0e10cSrcweir     Font aFnt( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "Helvetica" ) ), aAppFontSz );
738cdf0e10cSrcweir     aFnt.SetTransparent( sal_True );
739cdf0e10cSrcweir     aFnt.SetColor( Color( COL_LIGHTRED ) );
740cdf0e10cSrcweir     aFnt.SetWeight( WEIGHT_BOLD );
741cdf0e10cSrcweir     aFnt.SetFamily( FAMILY_SWISS );
742cdf0e10cSrcweir 
743cdf0e10cSrcweir     pOut->Push();
744cdf0e10cSrcweir     pOut->SetBackground();
745cdf0e10cSrcweir     pOut->SetFont( aFnt );
746cdf0e10cSrcweir 
747cdf0e10cSrcweir     Point aPt;
748cdf0e10cSrcweir     // Nun den Text so skalieren, dass er in das Rect passt.
749cdf0e10cSrcweir     // Wir fangen mit der Defaultsize an und gehen 1-AppFont runter
750cdf0e10cSrcweir     for( sal_uInt16 i = 8; i > 2; i-- )
751cdf0e10cSrcweir     {
752cdf0e10cSrcweir         aPt.X() = (rRect.GetWidth()  - pOut->GetTextWidth( rText )) / 2;
753cdf0e10cSrcweir         aPt.Y() = (rRect.GetHeight() - pOut->GetTextHeight()) / 2;
754cdf0e10cSrcweir 
755cdf0e10cSrcweir         sal_Bool bTiny = sal_False;
756cdf0e10cSrcweir         if( aPt.X() < 0 ) bTiny = sal_True, aPt.X() = 0;
757cdf0e10cSrcweir         if( aPt.Y() < 0 ) bTiny = sal_True, aPt.Y() = 0;
758cdf0e10cSrcweir         if( bTiny )
759cdf0e10cSrcweir         {
760cdf0e10cSrcweir             // heruntergehen bei kleinen Bildern
761cdf0e10cSrcweir             aFnt.SetSize( Size( 0, aAppFontSz.Height() * i / 8 ) );
762cdf0e10cSrcweir             pOut->SetFont( aFnt );
763cdf0e10cSrcweir         }
764cdf0e10cSrcweir         else
765cdf0e10cSrcweir             break;
766cdf0e10cSrcweir     }
767cdf0e10cSrcweir 
768cdf0e10cSrcweir     Bitmap aBmp( SvtResId( BMP_PLUGIN ) );
769cdf0e10cSrcweir     long nHeight = rRect.GetHeight() - pOut->GetTextHeight();
770cdf0e10cSrcweir     long nWidth = rRect.GetWidth();
771cdf0e10cSrcweir     if( nHeight > 0 )
772cdf0e10cSrcweir     {
773cdf0e10cSrcweir         aPt.Y() = nHeight;
774cdf0e10cSrcweir         Point   aP = rRect.TopLeft();
775cdf0e10cSrcweir         Size    aBmpSize = aBmp.GetSizePixel();
776cdf0e10cSrcweir         // Bitmap einpassen
777cdf0e10cSrcweir         if( nHeight * 10 / nWidth
778cdf0e10cSrcweir           > aBmpSize.Height() * 10 / aBmpSize.Width() )
779cdf0e10cSrcweir         {
780cdf0e10cSrcweir             // nach der Breite ausrichten
781cdf0e10cSrcweir             // Proportion beibehalten
782cdf0e10cSrcweir             long nH = nWidth * aBmpSize.Height() / aBmpSize.Width();
783cdf0e10cSrcweir             // zentrieren
784cdf0e10cSrcweir             aP.Y() += (nHeight - nH) / 2;
785cdf0e10cSrcweir             nHeight = nH;
786cdf0e10cSrcweir         }
787cdf0e10cSrcweir         else
788cdf0e10cSrcweir         {
789cdf0e10cSrcweir             // nach der H"ohe ausrichten
790cdf0e10cSrcweir             // Proportion beibehalten
791cdf0e10cSrcweir             long nW = nHeight * aBmpSize.Width() / aBmpSize.Height();
792cdf0e10cSrcweir             // zentrieren
793cdf0e10cSrcweir             aP.X() += (nWidth - nW) / 2;
794cdf0e10cSrcweir             nWidth = nW;
795cdf0e10cSrcweir         }
796cdf0e10cSrcweir 
797cdf0e10cSrcweir         pOut->DrawBitmap( aP, Size( nWidth, nHeight ), aBmp );
798cdf0e10cSrcweir     }
799cdf0e10cSrcweir 
800cdf0e10cSrcweir     pOut->IntersectClipRegion( rRect );
801cdf0e10cSrcweir     aPt += rRect.TopLeft();
802cdf0e10cSrcweir     pOut->DrawText( aPt, rText );
803cdf0e10cSrcweir     pOut->Pop();
804cdf0e10cSrcweir }
805cdf0e10cSrcweir 
806cdf0e10cSrcweir void EmbeddedObjectRef::DrawShading( const Rectangle &rRect, OutputDevice *pOut )
807cdf0e10cSrcweir {
808cdf0e10cSrcweir     GDIMetaFile * pMtf = pOut->GetConnectMetaFile();
809cdf0e10cSrcweir     if( pMtf && pMtf->IsRecord() )
810cdf0e10cSrcweir         return;
811cdf0e10cSrcweir 
812cdf0e10cSrcweir     pOut->Push();
813cdf0e10cSrcweir     pOut->SetLineColor( Color( COL_BLACK ) );
814cdf0e10cSrcweir 
815cdf0e10cSrcweir     Size aPixSize = pOut->LogicToPixel( rRect.GetSize() );
816cdf0e10cSrcweir     aPixSize.Width() -= 1;
817cdf0e10cSrcweir     aPixSize.Height() -= 1;
818cdf0e10cSrcweir     Point aPixViewPos = pOut->LogicToPixel( rRect.TopLeft() );
819cdf0e10cSrcweir     sal_Int32 nMax = aPixSize.Width() + aPixSize.Height();
820cdf0e10cSrcweir     for( sal_Int32 i = 5; i < nMax; i += 5 )
821cdf0e10cSrcweir     {
822cdf0e10cSrcweir         Point a1( aPixViewPos ), a2( aPixViewPos );
823cdf0e10cSrcweir         if( i > aPixSize.Width() )
824cdf0e10cSrcweir             a1 += Point( aPixSize.Width(), i - aPixSize.Width() );
825cdf0e10cSrcweir         else
826cdf0e10cSrcweir             a1 += Point( i, 0 );
827cdf0e10cSrcweir         if( i > aPixSize.Height() )
828cdf0e10cSrcweir             a2 += Point( i - aPixSize.Height(), aPixSize.Height() );
829cdf0e10cSrcweir         else
830cdf0e10cSrcweir             a2 += Point( 0, i );
831cdf0e10cSrcweir 
832cdf0e10cSrcweir         pOut->DrawLine( pOut->PixelToLogic( a1 ), pOut->PixelToLogic( a2 ) );
833cdf0e10cSrcweir     }
834cdf0e10cSrcweir 
835cdf0e10cSrcweir     pOut->Pop();
836cdf0e10cSrcweir 
837cdf0e10cSrcweir }
838cdf0e10cSrcweir 
839cdf0e10cSrcweir sal_Bool EmbeddedObjectRef::TryRunningState()
840cdf0e10cSrcweir {
841cdf0e10cSrcweir     return TryRunningState( mxObj );
842cdf0e10cSrcweir }
843cdf0e10cSrcweir 
844cdf0e10cSrcweir sal_Bool EmbeddedObjectRef::TryRunningState( const uno::Reference < embed::XEmbeddedObject >& xEmbObj )
845cdf0e10cSrcweir {
846cdf0e10cSrcweir     if ( !xEmbObj.is() )
847cdf0e10cSrcweir         return sal_False;
848cdf0e10cSrcweir 
849cdf0e10cSrcweir     try
850cdf0e10cSrcweir     {
851cdf0e10cSrcweir         if ( xEmbObj->getCurrentState() == embed::EmbedStates::LOADED )
852cdf0e10cSrcweir             xEmbObj->changeState( embed::EmbedStates::RUNNING );
853cdf0e10cSrcweir     }
854cdf0e10cSrcweir     catch ( uno::Exception& )
855cdf0e10cSrcweir     {
856cdf0e10cSrcweir         return sal_False;
857cdf0e10cSrcweir     }
858cdf0e10cSrcweir 
859cdf0e10cSrcweir     return sal_True;
860cdf0e10cSrcweir }
861cdf0e10cSrcweir 
862cdf0e10cSrcweir void EmbeddedObjectRef::SetGraphicToContainer( const Graphic& rGraphic,
863cdf0e10cSrcweir                                                 comphelper::EmbeddedObjectContainer& aContainer,
864cdf0e10cSrcweir                                                 const ::rtl::OUString& aName,
865cdf0e10cSrcweir                                                 const ::rtl::OUString& aMediaType )
866cdf0e10cSrcweir {
867cdf0e10cSrcweir     SvMemoryStream aStream;
868cdf0e10cSrcweir     aStream.SetVersion( SOFFICE_FILEFORMAT_CURRENT );
869cdf0e10cSrcweir     if ( rGraphic.ExportNative( aStream ) )
870cdf0e10cSrcweir     {
871cdf0e10cSrcweir         aStream.Seek( 0 );
872cdf0e10cSrcweir 
873cdf0e10cSrcweir         uno::Reference < io::XInputStream > xStream = new ::utl::OSeekableInputStreamWrapper( aStream );
874cdf0e10cSrcweir         aContainer.InsertGraphicStream( xStream, aName, aMediaType );
875cdf0e10cSrcweir     }
876cdf0e10cSrcweir     else
877cdf0e10cSrcweir         OSL_ENSURE( sal_False, "Export of graphic is failed!\n" );
878cdf0e10cSrcweir }
879cdf0e10cSrcweir 
880cdf0e10cSrcweir sal_Bool EmbeddedObjectRef::ObjectIsModified( const uno::Reference< embed::XEmbeddedObject >& xObj )
881cdf0e10cSrcweir     throw( uno::Exception )
882cdf0e10cSrcweir {
883cdf0e10cSrcweir     sal_Bool bResult = sal_False;
884cdf0e10cSrcweir 
885cdf0e10cSrcweir     sal_Int32 nState = xObj->getCurrentState();
886cdf0e10cSrcweir     if ( nState != embed::EmbedStates::LOADED && nState != embed::EmbedStates::RUNNING )
887cdf0e10cSrcweir     {
888cdf0e10cSrcweir         // the object is active so if the model is modified the replacement
889cdf0e10cSrcweir         // should be retrieved from the object
890cdf0e10cSrcweir         uno::Reference< util::XModifiable > xModifiable( xObj->getComponent(), uno::UNO_QUERY );
891cdf0e10cSrcweir         if ( xModifiable.is() )
892cdf0e10cSrcweir             bResult = xModifiable->isModified();
893cdf0e10cSrcweir     }
894cdf0e10cSrcweir 
895cdf0e10cSrcweir     return bResult;
896cdf0e10cSrcweir }
897cdf0e10cSrcweir 
898cdf0e10cSrcweir uno::Reference< io::XInputStream > EmbeddedObjectRef::GetGraphicReplacementStream(
899cdf0e10cSrcweir                                                                 sal_Int64 nViewAspect,
900cdf0e10cSrcweir                                                                 const uno::Reference< embed::XEmbeddedObject >& xObj,
901cdf0e10cSrcweir                                                                 ::rtl::OUString* pMediaType )
902cdf0e10cSrcweir     throw()
903cdf0e10cSrcweir {
904cdf0e10cSrcweir     return ::comphelper::EmbeddedObjectContainer::GetGraphicReplacementStream(nViewAspect,xObj,pMediaType);
905cdf0e10cSrcweir }
906cdf0e10cSrcweir 
907cdf0e10cSrcweir void EmbeddedObjectRef::UpdateReplacementOnDemand()
908cdf0e10cSrcweir {
909cdf0e10cSrcweir     DELETEZ( mpImp->pGraphic );
910cdf0e10cSrcweir     mpImp->bNeedUpdate = sal_True;
911cdf0e10cSrcweir     if ( mpImp->pHCGraphic )
912cdf0e10cSrcweir         DELETEZ( mpImp->pHCGraphic );
913cdf0e10cSrcweir     mpImp->mnGraphicVersion++;
914cdf0e10cSrcweir 
915cdf0e10cSrcweir     if( mpImp->pContainer )
916cdf0e10cSrcweir     {
917cdf0e10cSrcweir         //remove graphic from container thus a new up to date one is requested on save
918cdf0e10cSrcweir         mpImp->pContainer->RemoveGraphicStream( mpImp->aPersistName );
919cdf0e10cSrcweir     }
920cdf0e10cSrcweir }
921cdf0e10cSrcweir 
922cdf0e10cSrcweir sal_Bool EmbeddedObjectRef::IsChart() const
923cdf0e10cSrcweir {
924cdf0e10cSrcweir     //todo maybe for 3.0:
925cdf0e10cSrcweir     //if the changes work good for chart
926cdf0e10cSrcweir     //we should apply them for all own ole objects
927cdf0e10cSrcweir 
928cdf0e10cSrcweir     //#i83708# #i81857# #i79578# request an ole replacement image only if really necessary
929cdf0e10cSrcweir     //as this call can be very expensive and does block the user interface as long at it takes
930cdf0e10cSrcweir 
931cdf0e10cSrcweir     if ( !mxObj.is() )
932cdf0e10cSrcweir         return false;
933cdf0e10cSrcweir 
934cdf0e10cSrcweir     SvGlobalName aObjClsId( mxObj->getClassID() );
935cdf0e10cSrcweir     if(
936cdf0e10cSrcweir         SvGlobalName(SO3_SCH_CLASSID_30) == aObjClsId
937cdf0e10cSrcweir         || SvGlobalName(SO3_SCH_CLASSID_40) == aObjClsId
938cdf0e10cSrcweir         || SvGlobalName(SO3_SCH_CLASSID_50) == aObjClsId
939cdf0e10cSrcweir         || SvGlobalName(SO3_SCH_CLASSID_60) == aObjClsId)
940cdf0e10cSrcweir     {
941cdf0e10cSrcweir         return sal_True;
942cdf0e10cSrcweir     }
943cdf0e10cSrcweir 
944cdf0e10cSrcweir     return sal_False;
945cdf0e10cSrcweir }
946cdf0e10cSrcweir 
947*2bfcd321SSteve Yin //IAccessibility2 Implementation 2009-----
948*2bfcd321SSteve Yin // MT: Only used for getting accessible attributes, which are not localized
949*2bfcd321SSteve Yin rtl::OUString EmbeddedObjectRef::GetChartType()
950*2bfcd321SSteve Yin {
951*2bfcd321SSteve Yin     rtl::OUString Style;
952*2bfcd321SSteve Yin     if ( mxObj.is() )
953*2bfcd321SSteve Yin     {
954*2bfcd321SSteve Yin         if ( IsChart() )
955*2bfcd321SSteve Yin         {
956*2bfcd321SSteve Yin             if ( svt::EmbeddedObjectRef::TryRunningState( mxObj ) )
957*2bfcd321SSteve Yin             {
958*2bfcd321SSteve Yin                 uno::Reference< chart2::XChartDocument > xChart( mxObj->getComponent(), uno::UNO_QUERY );
959*2bfcd321SSteve Yin                 if (xChart.is())
960*2bfcd321SSteve Yin                 {
961*2bfcd321SSteve Yin                     uno::Reference< chart2::XDiagram > xDiagram( xChart->getFirstDiagram());
962*2bfcd321SSteve Yin                     if( ! xDiagram.is())
963*2bfcd321SSteve Yin                         return String();
964*2bfcd321SSteve Yin                     uno::Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDiagram, uno::UNO_QUERY_THROW );
965*2bfcd321SSteve Yin                     uno::Sequence< uno::Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems());
966*2bfcd321SSteve Yin                     // IA2 CWS. Unused: int nCoordinateCount = aCooSysSeq.getLength();
967*2bfcd321SSteve Yin                     sal_Bool bGetChartType = sal_False;
968*2bfcd321SSteve Yin                     for( sal_Int32 nCooSysIdx=0; nCooSysIdx<aCooSysSeq.getLength(); ++nCooSysIdx )
969*2bfcd321SSteve Yin                     {
970*2bfcd321SSteve Yin                         uno::Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[nCooSysIdx], uno::UNO_QUERY_THROW );
971*2bfcd321SSteve Yin                         uno::Sequence< uno::Reference< chart2::XChartType > > aChartTypes( xCTCnt->getChartTypes());
972*2bfcd321SSteve Yin                         int nDimesionCount = aCooSysSeq[nCooSysIdx]->getDimension();
973*2bfcd321SSteve Yin                         if( nDimesionCount == 3 )
974*2bfcd321SSteve Yin                             Style += rtl::OUString::createFromAscii("3D ");
975*2bfcd321SSteve Yin                         else
976*2bfcd321SSteve Yin                             Style += rtl::OUString::createFromAscii("2D ");
977*2bfcd321SSteve Yin                         for( sal_Int32 nCTIdx=0; nCTIdx<aChartTypes.getLength(); ++nCTIdx )
978*2bfcd321SSteve Yin                         {
979*2bfcd321SSteve Yin                             rtl::OUString strChartType = aChartTypes[nCTIdx]->getChartType();
980*2bfcd321SSteve Yin                             if (strChartType.equals(::rtl::OUString::createFromAscii("com.sun.star.chart2.AreaChartType")))
981*2bfcd321SSteve Yin                             {
982*2bfcd321SSteve Yin                                 Style += rtl::OUString::createFromAscii("Areas");
983*2bfcd321SSteve Yin                                 bGetChartType = sal_True;
984*2bfcd321SSteve Yin                             }
985*2bfcd321SSteve Yin                             else if (strChartType.equals(::rtl::OUString::createFromAscii("com.sun.star.chart2.BarChartType")))
986*2bfcd321SSteve Yin                             {
987*2bfcd321SSteve Yin                                 Style += rtl::OUString::createFromAscii("Bars");
988*2bfcd321SSteve Yin                                 bGetChartType = sal_True;
989*2bfcd321SSteve Yin                             }
990*2bfcd321SSteve Yin                             else if (strChartType.equals(::rtl::OUString::createFromAscii("com.sun.star.chart2.ColumnChartType")))
991*2bfcd321SSteve Yin                             {
992*2bfcd321SSteve Yin                                 uno::Reference< beans::XPropertySet > xProp( aCooSysSeq[nCooSysIdx], uno::UNO_QUERY );
993*2bfcd321SSteve Yin                                 if( xProp.is())
994*2bfcd321SSteve Yin                                 {
995*2bfcd321SSteve Yin                                     bool bCurrent = false;
996*2bfcd321SSteve Yin                                     if( xProp->getPropertyValue( rtl::OUString::createFromAscii("SwapXAndYAxis") ) >>= bCurrent )
997*2bfcd321SSteve Yin                                     {
998*2bfcd321SSteve Yin                                         if (bCurrent)
999*2bfcd321SSteve Yin                                             Style += rtl::OUString::createFromAscii("Bars");
1000*2bfcd321SSteve Yin                                         else
1001*2bfcd321SSteve Yin                                             Style += rtl::OUString::createFromAscii("Columns");
1002*2bfcd321SSteve Yin                                         bGetChartType = sal_True;
1003*2bfcd321SSteve Yin                                     }
1004*2bfcd321SSteve Yin                                 }
1005*2bfcd321SSteve Yin                             }
1006*2bfcd321SSteve Yin                             else if (strChartType.equals(::rtl::OUString::createFromAscii("com.sun.star.chart2.LineChartType")))
1007*2bfcd321SSteve Yin                             {
1008*2bfcd321SSteve Yin                                 Style += rtl::OUString::createFromAscii("Lines");
1009*2bfcd321SSteve Yin                                 bGetChartType = sal_True;
1010*2bfcd321SSteve Yin                             }
1011*2bfcd321SSteve Yin                             else if (strChartType.equals(::rtl::OUString::createFromAscii("com.sun.star.chart2.ScatterChartType")))
1012*2bfcd321SSteve Yin                             {
1013*2bfcd321SSteve Yin                                 Style += rtl::OUString::createFromAscii("XY Chart");
1014*2bfcd321SSteve Yin                                 bGetChartType = sal_True;
1015*2bfcd321SSteve Yin                             }
1016*2bfcd321SSteve Yin                             else if (strChartType.equals(::rtl::OUString::createFromAscii("com.sun.star.chart2.PieChartType")))
1017*2bfcd321SSteve Yin                             {
1018*2bfcd321SSteve Yin                                 Style += rtl::OUString::createFromAscii("Pies");
1019*2bfcd321SSteve Yin                                 bGetChartType = sal_True;
1020*2bfcd321SSteve Yin                             }
1021*2bfcd321SSteve Yin                             else if (strChartType.equals(::rtl::OUString::createFromAscii("com.sun.star.chart2.NetChartType")))
1022*2bfcd321SSteve Yin                             {
1023*2bfcd321SSteve Yin                                 Style += rtl::OUString::createFromAscii("Radar");
1024*2bfcd321SSteve Yin                                 bGetChartType = sal_True;
1025*2bfcd321SSteve Yin                             }
1026*2bfcd321SSteve Yin                             else if (strChartType.equals(::rtl::OUString::createFromAscii("com.sun.star.chart2.CandleStickChartType")))
1027*2bfcd321SSteve Yin                             {
1028*2bfcd321SSteve Yin                                 Style += rtl::OUString::createFromAscii("Candle Stick Chart");
1029*2bfcd321SSteve Yin                                 bGetChartType = sal_True;
1030*2bfcd321SSteve Yin                             }
1031*2bfcd321SSteve Yin                             if (bGetChartType)
1032*2bfcd321SSteve Yin                                 return Style;
1033*2bfcd321SSteve Yin                         }
1034*2bfcd321SSteve Yin                     }
1035*2bfcd321SSteve Yin                 }
1036*2bfcd321SSteve Yin             }
1037*2bfcd321SSteve Yin         }
1038*2bfcd321SSteve Yin     }
1039*2bfcd321SSteve Yin     return Style;
1040*2bfcd321SSteve Yin }
1041*2bfcd321SSteve Yin //-----IAccessibility2 Implementation 2009
1042*2bfcd321SSteve Yin 
1043cdf0e10cSrcweir // #i104867#
1044cdf0e10cSrcweir sal_uInt32 EmbeddedObjectRef::getGraphicVersion() const
1045cdf0e10cSrcweir {
1046cdf0e10cSrcweir     return mpImp->mnGraphicVersion;
1047cdf0e10cSrcweir }
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir void EmbeddedObjectRef::SetDefaultSizeForChart( const Size& rSizeIn_100TH_MM )
1050cdf0e10cSrcweir {
1051cdf0e10cSrcweir     //#i103460# charts do not necessaryly have an own size within ODF files,
1052cdf0e10cSrcweir     //for this case they need to use the size settings from the surrounding frame,
1053cdf0e10cSrcweir     //which is made available with this method
1054cdf0e10cSrcweir 
1055cdf0e10cSrcweir     mpImp->aDefaultSizeForChart_In_100TH_MM = awt::Size( rSizeIn_100TH_MM.getWidth(), rSizeIn_100TH_MM.getHeight() );
1056cdf0e10cSrcweir 
1057cdf0e10cSrcweir     ::com::sun::star::uno::Reference < ::com::sun::star::chart2::XDefaultSizeTransmitter > xSizeTransmitter( mxObj, uno::UNO_QUERY );
1058cdf0e10cSrcweir     DBG_ASSERT( xSizeTransmitter.is(), "Object does not support XDefaultSizeTransmitter -> will cause #i103460#!" );
1059cdf0e10cSrcweir     if( xSizeTransmitter.is() )
1060cdf0e10cSrcweir         xSizeTransmitter->setDefaultSize( mpImp->aDefaultSizeForChart_In_100TH_MM );
1061cdf0e10cSrcweir }
1062cdf0e10cSrcweir 
1063cdf0e10cSrcweir } // namespace svt
1064cdf0e10cSrcweir 
1065