xref: /AOO41X/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