xref: /aoo4110/main/sw/source/core/ole/ndole.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XEmbedPersist.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XLinkageSupport.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/Aspects.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/EmbedMisc.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/EmbedStates.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XCloseable.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XModifiable.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEventBroadcaster.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XChartDocument.hpp>	// #i119941
37*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase2.hxx>
40*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx>
41*b1cdbd2cSJim Jagielski #include <hintids.hxx>
42*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
43*b1cdbd2cSJim Jagielski #include <sfx2/docfile.hxx>
44*b1cdbd2cSJim Jagielski #include <sfx2/app.hxx>
45*b1cdbd2cSJim Jagielski #include <sfx2/linkmgr.hxx>
46*b1cdbd2cSJim Jagielski #include <unotools/configitem.hxx>
47*b1cdbd2cSJim Jagielski #ifndef _OUTDEV_HXX //autogen
48*b1cdbd2cSJim Jagielski #include <vcl/outdev.hxx>
49*b1cdbd2cSJim Jagielski #endif
50*b1cdbd2cSJim Jagielski #include <fmtanchr.hxx>
51*b1cdbd2cSJim Jagielski #include <frmfmt.hxx>
52*b1cdbd2cSJim Jagielski #include <doc.hxx>
53*b1cdbd2cSJim Jagielski #include <docsh.hxx>
54*b1cdbd2cSJim Jagielski #include <pam.hxx>
55*b1cdbd2cSJim Jagielski #include <section.hxx>
56*b1cdbd2cSJim Jagielski #include <cntfrm.hxx>
57*b1cdbd2cSJim Jagielski #include <frmatr.hxx>
58*b1cdbd2cSJim Jagielski #ifndef _DOCSH_HXX
59*b1cdbd2cSJim Jagielski #include <docsh.hxx>
60*b1cdbd2cSJim Jagielski #endif
61*b1cdbd2cSJim Jagielski #include <ndole.hxx>
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski #include <comphelper/classids.hxx>
64*b1cdbd2cSJim Jagielski #include <vcl/graph.hxx>
65*b1cdbd2cSJim Jagielski #include <sot/formats.hxx>
66*b1cdbd2cSJim Jagielski #include <unotools/ucbstreamhelper.hxx>
67*b1cdbd2cSJim Jagielski #include <svtools/filter.hxx>
68*b1cdbd2cSJim Jagielski #ifndef _COMCORE_HRC
69*b1cdbd2cSJim Jagielski #include <comcore.hrc>
70*b1cdbd2cSJim Jagielski #endif
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski using rtl::OUString;
73*b1cdbd2cSJim Jagielski using namespace utl;
74*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
75*b1cdbd2cSJim Jagielski using namespace com::sun::star;
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski class SwOLELRUCache : private SvPtrarr, private utl::ConfigItem
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski 	sal_uInt16 nLRU_InitSize;
80*b1cdbd2cSJim Jagielski 	sal_Bool bInUnload;
81*b1cdbd2cSJim Jagielski     uno::Sequence< rtl::OUString > GetPropertyNames();
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski public:
84*b1cdbd2cSJim Jagielski 	SwOLELRUCache();
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski     virtual void Notify( const uno::Sequence<
87*b1cdbd2cSJim Jagielski 								rtl::OUString>& aPropertyNames );
88*b1cdbd2cSJim Jagielski 	virtual void Commit();
89*b1cdbd2cSJim Jagielski 	void Load();
90*b1cdbd2cSJim Jagielski 
SetInUnload(sal_Bool bFlag)91*b1cdbd2cSJim Jagielski 	void SetInUnload( sal_Bool bFlag ) 	{ bInUnload = bFlag; }
92*b1cdbd2cSJim Jagielski 	using SvPtrarr::Count;
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski 	void InsertObj( SwOLEObj& rObj );
95*b1cdbd2cSJim Jagielski 	void RemoveObj( SwOLEObj& rObj );
96*b1cdbd2cSJim Jagielski 
RemovePtr(SwOLEObj * pObj)97*b1cdbd2cSJim Jagielski 	void RemovePtr( SwOLEObj* pObj )
98*b1cdbd2cSJim Jagielski 	{
99*b1cdbd2cSJim Jagielski 		sal_uInt16 nPos = SvPtrarr::GetPos( pObj );
100*b1cdbd2cSJim Jagielski 		if( USHRT_MAX != nPos )
101*b1cdbd2cSJim Jagielski 			SvPtrarr::Remove( nPos );
102*b1cdbd2cSJim Jagielski 	}
103*b1cdbd2cSJim Jagielski };
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski SwOLELRUCache* pOLELRU_Cache = 0;
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski class SwOLEListener_Impl : public ::cppu::WeakImplHelper1< embed::XStateChangeListener >
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski     SwOLEObj* mpObj;
110*b1cdbd2cSJim Jagielski public:
111*b1cdbd2cSJim Jagielski     SwOLEListener_Impl( SwOLEObj* pObj );
112*b1cdbd2cSJim Jagielski     void Release();
113*b1cdbd2cSJim Jagielski     virtual void SAL_CALL changingState( const lang::EventObject& aEvent, ::sal_Int32 nOldState, ::sal_Int32 nNewState ) throw (embed::WrongStateException, uno::RuntimeException);
114*b1cdbd2cSJim Jagielski     virtual void SAL_CALL stateChanged( const lang::EventObject& aEvent, ::sal_Int32 nOldState, ::sal_Int32 nNewState ) throw (uno::RuntimeException);
115*b1cdbd2cSJim Jagielski     virtual void SAL_CALL disposing( const lang::EventObject& aEvent ) throw (uno::RuntimeException);
116*b1cdbd2cSJim Jagielski };
117*b1cdbd2cSJim Jagielski 
SwOLEListener_Impl(SwOLEObj * pObj)118*b1cdbd2cSJim Jagielski SwOLEListener_Impl::SwOLEListener_Impl( SwOLEObj* pObj )
119*b1cdbd2cSJim Jagielski : mpObj( pObj )
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski     if ( mpObj->IsOleRef() && mpObj->GetOleRef()->getCurrentState() == embed::EmbedStates::RUNNING )
122*b1cdbd2cSJim Jagielski     {
123*b1cdbd2cSJim Jagielski         pOLELRU_Cache->InsertObj( *mpObj );
124*b1cdbd2cSJim Jagielski     }
125*b1cdbd2cSJim Jagielski }
126*b1cdbd2cSJim Jagielski 
changingState(const lang::EventObject &,::sal_Int32,::sal_Int32)127*b1cdbd2cSJim Jagielski void SAL_CALL SwOLEListener_Impl::changingState( const lang::EventObject&, ::sal_Int32 , ::sal_Int32 ) throw (embed::WrongStateException, uno::RuntimeException)
128*b1cdbd2cSJim Jagielski {
129*b1cdbd2cSJim Jagielski }
130*b1cdbd2cSJim Jagielski 
stateChanged(const lang::EventObject &,::sal_Int32 nOldState,::sal_Int32 nNewState)131*b1cdbd2cSJim Jagielski void SAL_CALL SwOLEListener_Impl::stateChanged( const lang::EventObject&, ::sal_Int32 nOldState, ::sal_Int32 nNewState ) throw (uno::RuntimeException)
132*b1cdbd2cSJim Jagielski {
133*b1cdbd2cSJim Jagielski     if ( mpObj && nOldState == embed::EmbedStates::LOADED && nNewState == embed::EmbedStates::RUNNING )
134*b1cdbd2cSJim Jagielski     {
135*b1cdbd2cSJim Jagielski         if( !pOLELRU_Cache )
136*b1cdbd2cSJim Jagielski             pOLELRU_Cache = new SwOLELRUCache;
137*b1cdbd2cSJim Jagielski         pOLELRU_Cache->InsertObj( *mpObj );
138*b1cdbd2cSJim Jagielski     }
139*b1cdbd2cSJim Jagielski     else if ( mpObj && nNewState == embed::EmbedStates::LOADED && nOldState == embed::EmbedStates::RUNNING )
140*b1cdbd2cSJim Jagielski     {
141*b1cdbd2cSJim Jagielski         if ( pOLELRU_Cache )
142*b1cdbd2cSJim Jagielski             pOLELRU_Cache->RemoveObj( *mpObj );
143*b1cdbd2cSJim Jagielski     }
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski 
Release()146*b1cdbd2cSJim Jagielski void SwOLEListener_Impl::Release()
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski     if ( mpObj && pOLELRU_Cache )
149*b1cdbd2cSJim Jagielski         pOLELRU_Cache->RemoveObj( *mpObj );
150*b1cdbd2cSJim Jagielski     mpObj=0;
151*b1cdbd2cSJim Jagielski     release();
152*b1cdbd2cSJim Jagielski }
153*b1cdbd2cSJim Jagielski 
disposing(const lang::EventObject &)154*b1cdbd2cSJim Jagielski void SAL_CALL SwOLEListener_Impl::disposing( const lang::EventObject& ) throw (uno::RuntimeException)
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski     if ( mpObj && pOLELRU_Cache )
157*b1cdbd2cSJim Jagielski         pOLELRU_Cache->RemoveObj( *mpObj );
158*b1cdbd2cSJim Jagielski }
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski // --------------------
161*b1cdbd2cSJim Jagielski // SwEmbedObjectLink
162*b1cdbd2cSJim Jagielski // --------------------
163*b1cdbd2cSJim Jagielski // TODO/LATER: actually SwEmbedObjectLink should be used here, but because different objects are used to control
164*b1cdbd2cSJim Jagielski //             embedded object different link objects with the same functionality had to be implemented
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski class SwEmbedObjectLink : public sfx2::SvBaseLink
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski 	SwOLENode*			pOleNode;
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski public:
171*b1cdbd2cSJim Jagielski 						SwEmbedObjectLink(SwOLENode* pNode);
172*b1cdbd2cSJim Jagielski 	virtual				~SwEmbedObjectLink();
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 	virtual void		Closed();
175*b1cdbd2cSJim Jagielski 	virtual void		DataChanged( const String& rMimeType,
176*b1cdbd2cSJim Jagielski                                 const uno::Any & rValue );
177*b1cdbd2cSJim Jagielski 
Connect()178*b1cdbd2cSJim Jagielski 	sal_Bool			Connect() { return GetRealObject() != NULL; }
179*b1cdbd2cSJim Jagielski };
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
182*b1cdbd2cSJim Jagielski 
SwEmbedObjectLink(SwOLENode * pNode)183*b1cdbd2cSJim Jagielski SwEmbedObjectLink::SwEmbedObjectLink(SwOLENode* pNode):
184*b1cdbd2cSJim Jagielski 	::sfx2::SvBaseLink( ::sfx2::LINKUPDATE_ONCALL, SOT_FORMATSTR_ID_SVXB ),
185*b1cdbd2cSJim Jagielski 	pOleNode(pNode)
186*b1cdbd2cSJim Jagielski {
187*b1cdbd2cSJim Jagielski 	SetSynchron( sal_False );
188*b1cdbd2cSJim Jagielski }
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
191*b1cdbd2cSJim Jagielski 
~SwEmbedObjectLink()192*b1cdbd2cSJim Jagielski SwEmbedObjectLink::~SwEmbedObjectLink()
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
197*b1cdbd2cSJim Jagielski 
DataChanged(const String &,const uno::Any &)198*b1cdbd2cSJim Jagielski void SwEmbedObjectLink::DataChanged( const String& ,
199*b1cdbd2cSJim Jagielski                                 const uno::Any & )
200*b1cdbd2cSJim Jagielski {
201*b1cdbd2cSJim Jagielski 	if ( !pOleNode->UpdateLinkURL_Impl() )
202*b1cdbd2cSJim Jagielski 	{
203*b1cdbd2cSJim Jagielski 		// the link URL was not changed
204*b1cdbd2cSJim Jagielski 		uno::Reference< embed::XEmbeddedObject > xObject = pOleNode->GetOLEObj().GetOleRef();
205*b1cdbd2cSJim Jagielski 		OSL_ENSURE( xObject.is(), "The object must exist always!\n" );
206*b1cdbd2cSJim Jagielski 		if ( xObject.is() )
207*b1cdbd2cSJim Jagielski 		{
208*b1cdbd2cSJim Jagielski 			// let the object reload the link
209*b1cdbd2cSJim Jagielski 			// TODO/LATER: reload call could be used for this case
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 			try
212*b1cdbd2cSJim Jagielski 			{
213*b1cdbd2cSJim Jagielski 				sal_Int32 nState = xObject->getCurrentState();
214*b1cdbd2cSJim Jagielski 				if ( nState != embed::EmbedStates::LOADED )
215*b1cdbd2cSJim Jagielski 				{
216*b1cdbd2cSJim Jagielski 					// in some cases the linked file probably is not locked so it could be changed
217*b1cdbd2cSJim Jagielski 					xObject->changeState( embed::EmbedStates::LOADED );
218*b1cdbd2cSJim Jagielski 					xObject->changeState( nState );
219*b1cdbd2cSJim Jagielski 				}
220*b1cdbd2cSJim Jagielski 			}
221*b1cdbd2cSJim Jagielski 			catch ( uno::Exception& )
222*b1cdbd2cSJim Jagielski 			{
223*b1cdbd2cSJim Jagielski 			}
224*b1cdbd2cSJim Jagielski 		}
225*b1cdbd2cSJim Jagielski 	}
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 	pOleNode->GetNewReplacement();
228*b1cdbd2cSJim Jagielski 	// Initiate repainting
229*b1cdbd2cSJim Jagielski 	// pObj->SetChanged();
230*b1cdbd2cSJim Jagielski }
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
233*b1cdbd2cSJim Jagielski 
Closed()234*b1cdbd2cSJim Jagielski void SwEmbedObjectLink::Closed()
235*b1cdbd2cSJim Jagielski {
236*b1cdbd2cSJim Jagielski 	pOleNode->BreakFileLink_Impl();
237*b1cdbd2cSJim Jagielski 	SvBaseLink::Closed();
238*b1cdbd2cSJim Jagielski }
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski // --------------------
242*b1cdbd2cSJim Jagielski // SwOLENode
243*b1cdbd2cSJim Jagielski // --------------------
244*b1cdbd2cSJim Jagielski 
SwOLENode(const SwNodeIndex & rWhere,const svt::EmbeddedObjectRef & xObj,SwGrfFmtColl * pGrfColl,SwAttrSet * pAutoAttr)245*b1cdbd2cSJim Jagielski SwOLENode::SwOLENode( const SwNodeIndex &rWhere,
246*b1cdbd2cSJim Jagielski                     const svt::EmbeddedObjectRef& xObj,
247*b1cdbd2cSJim Jagielski 					SwGrfFmtColl *pGrfColl,
248*b1cdbd2cSJim Jagielski 					SwAttrSet* pAutoAttr ) :
249*b1cdbd2cSJim Jagielski 	SwNoTxtNode( rWhere, ND_OLENODE, pGrfColl, pAutoAttr ),
250*b1cdbd2cSJim Jagielski     aOLEObj( xObj ),
251*b1cdbd2cSJim Jagielski     pGraphic(0),
252*b1cdbd2cSJim Jagielski 	bOLESizeInvalid( sal_False ),
253*b1cdbd2cSJim Jagielski 	mpObjectLink( NULL )
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski 	aOLEObj.SetNode( this );
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski 
SwOLENode(const SwNodeIndex & rWhere,const String & rString,sal_Int64 nAspect,SwGrfFmtColl * pGrfColl,SwAttrSet * pAutoAttr)258*b1cdbd2cSJim Jagielski SwOLENode::SwOLENode( const SwNodeIndex &rWhere,
259*b1cdbd2cSJim Jagielski 					const String &rString,
260*b1cdbd2cSJim Jagielski 					sal_Int64 nAspect,
261*b1cdbd2cSJim Jagielski 					SwGrfFmtColl *pGrfColl,
262*b1cdbd2cSJim Jagielski 					SwAttrSet* pAutoAttr ) :
263*b1cdbd2cSJim Jagielski 	SwNoTxtNode( rWhere, ND_OLENODE, pGrfColl, pAutoAttr ),
264*b1cdbd2cSJim Jagielski 	aOLEObj( rString, nAspect ),
265*b1cdbd2cSJim Jagielski     pGraphic(0),
266*b1cdbd2cSJim Jagielski 	bOLESizeInvalid( sal_False ),
267*b1cdbd2cSJim Jagielski 	mpObjectLink( NULL )
268*b1cdbd2cSJim Jagielski {
269*b1cdbd2cSJim Jagielski 	aOLEObj.SetNode( this );
270*b1cdbd2cSJim Jagielski }
271*b1cdbd2cSJim Jagielski 
~SwOLENode()272*b1cdbd2cSJim Jagielski SwOLENode::~SwOLENode()
273*b1cdbd2cSJim Jagielski {
274*b1cdbd2cSJim Jagielski 	DisconnectFileLink_Impl();
275*b1cdbd2cSJim Jagielski     delete pGraphic;
276*b1cdbd2cSJim Jagielski }
277*b1cdbd2cSJim Jagielski 
GetGraphic()278*b1cdbd2cSJim Jagielski Graphic* SwOLENode::GetGraphic()
279*b1cdbd2cSJim Jagielski {
280*b1cdbd2cSJim Jagielski     if ( aOLEObj.GetOleRef().is() )
281*b1cdbd2cSJim Jagielski         return aOLEObj.xOLERef.GetGraphic();
282*b1cdbd2cSJim Jagielski     return pGraphic;
283*b1cdbd2cSJim Jagielski }
284*b1cdbd2cSJim Jagielski 
GetHCGraphic()285*b1cdbd2cSJim Jagielski Graphic* SwOLENode::GetHCGraphic()
286*b1cdbd2cSJim Jagielski {
287*b1cdbd2cSJim Jagielski 	return aOLEObj.xOLERef.GetHCGraphic();
288*b1cdbd2cSJim Jagielski }
289*b1cdbd2cSJim Jagielski 
SplitCntntNode(const SwPosition &)290*b1cdbd2cSJim Jagielski SwCntntNode *SwOLENode::SplitCntntNode( const SwPosition & )
291*b1cdbd2cSJim Jagielski {
292*b1cdbd2cSJim Jagielski 	// OLE-Objecte vervielfaeltigen ??
293*b1cdbd2cSJim Jagielski 	ASSERT( sal_False, "OleNode: can't split." );
294*b1cdbd2cSJim Jagielski 	return this;
295*b1cdbd2cSJim Jagielski }
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski // Laden eines in den Undo-Bereich verschobenen OLE-Objekts
298*b1cdbd2cSJim Jagielski 
RestorePersistentData()299*b1cdbd2cSJim Jagielski sal_Bool SwOLENode::RestorePersistentData()
300*b1cdbd2cSJim Jagielski {
301*b1cdbd2cSJim Jagielski     DBG_ASSERT( aOLEObj.GetOleRef().is(), "No object to restore!" );
302*b1cdbd2cSJim Jagielski     if ( aOLEObj.xOLERef.is() )
303*b1cdbd2cSJim Jagielski     {
304*b1cdbd2cSJim Jagielski 		// Falls bereits eine SvPersist-Instanz existiert, nehmen wir diese
305*b1cdbd2cSJim Jagielski         SfxObjectShell* p = GetDoc()->GetPersist();
306*b1cdbd2cSJim Jagielski         if( !p )
307*b1cdbd2cSJim Jagielski         {
308*b1cdbd2cSJim Jagielski             // TODO/LATER: reicht hier nicht ein EmbeddedObjectContainer? Was passiert mit
309*b1cdbd2cSJim Jagielski             // diesem Dokument?
310*b1cdbd2cSJim Jagielski 			ASSERT( !this, "warum wird hier eine DocShell angelegt?" );
311*b1cdbd2cSJim Jagielski             p = new SwDocShell( GetDoc(), SFX_CREATE_MODE_INTERNAL );
312*b1cdbd2cSJim Jagielski             p->DoInitNew( NULL );
313*b1cdbd2cSJim Jagielski         }
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski         uno::Reference < container::XChild > xChild( aOLEObj.xOLERef.GetObject(), uno::UNO_QUERY );
316*b1cdbd2cSJim Jagielski         if ( xChild.is() )
317*b1cdbd2cSJim Jagielski             xChild->setParent( p->GetModel() );
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski         DBG_ASSERT( aOLEObj.aName.Len(), "No object name!" );
320*b1cdbd2cSJim Jagielski         ::rtl::OUString aObjName;
321*b1cdbd2cSJim Jagielski         if ( !p->GetEmbeddedObjectContainer().InsertEmbeddedObject( aOLEObj.xOLERef.GetObject(), aObjName ) )
322*b1cdbd2cSJim Jagielski         {
323*b1cdbd2cSJim Jagielski             if ( xChild.is() )
324*b1cdbd2cSJim Jagielski                 xChild->setParent( 0 );
325*b1cdbd2cSJim Jagielski             DBG_ERROR( "InsertObject failed" );
326*b1cdbd2cSJim Jagielski         }
327*b1cdbd2cSJim Jagielski         else
328*b1cdbd2cSJim Jagielski         {
329*b1cdbd2cSJim Jagielski             aOLEObj.aName = aObjName;
330*b1cdbd2cSJim Jagielski             aOLEObj.xOLERef.AssignToContainer( &p->GetEmbeddedObjectContainer(), aObjName );
331*b1cdbd2cSJim Jagielski 			CheckFileLink_Impl();
332*b1cdbd2cSJim Jagielski         }
333*b1cdbd2cSJim Jagielski     }
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski 	return sal_True;
336*b1cdbd2cSJim Jagielski }
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski // OLE object is transported into UNDO area
SavePersistentData()339*b1cdbd2cSJim Jagielski sal_Bool SwOLENode::SavePersistentData()
340*b1cdbd2cSJim Jagielski {
341*b1cdbd2cSJim Jagielski     if( aOLEObj.xOLERef.is() )
342*b1cdbd2cSJim Jagielski 	{
343*b1cdbd2cSJim Jagielski 		comphelper::EmbeddedObjectContainer* pCnt = aOLEObj.xOLERef.GetContainer();
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
346*b1cdbd2cSJim Jagielski         SfxObjectShell* p = GetDoc()->GetPersist();
347*b1cdbd2cSJim Jagielski         DBG_ASSERT( p, "No document!" );
348*b1cdbd2cSJim Jagielski         if( p )
349*b1cdbd2cSJim Jagielski         {
350*b1cdbd2cSJim Jagielski             comphelper::EmbeddedObjectContainer& rCnt = p->GetEmbeddedObjectContainer();
351*b1cdbd2cSJim Jagielski 			OSL_ENSURE( !pCnt || &rCnt == pCnt, "The helper is assigned to unexpected container!\n" );
352*b1cdbd2cSJim Jagielski         }
353*b1cdbd2cSJim Jagielski #endif
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski 		if ( pCnt && pCnt->HasEmbeddedObject( aOLEObj.aName ) )
356*b1cdbd2cSJim Jagielski 		{
357*b1cdbd2cSJim Jagielski 			uno::Reference < container::XChild > xChild( aOLEObj.xOLERef.GetObject(), uno::UNO_QUERY );
358*b1cdbd2cSJim Jagielski 			if ( xChild.is() )
359*b1cdbd2cSJim Jagielski 				xChild->setParent( 0 );
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski           // pCnt->RemoveEmbeddedObject( aOLEObj.aName, sal_False );
362*b1cdbd2cSJim Jagielski            /* #i119941: When cut or move the chart, SwUndoFlyBase::DelFly will call SaveSection to store the comtent to strorage.
363*b1cdbd2cSJim Jagielski            In this step, chart filter functions will be called. And chart filter will call chart core functions to create the chart again.
364*b1cdbd2cSJim Jagielski            Then chart core function will call the class ExplicitCategoryProvider to create data source.
365*b1cdbd2cSJim Jagielski            In this step, when SW data source provider create the data source, it will create a new SwFlyFrm.
366*b1cdbd2cSJim Jagielski            But later in SwUndoFlyBase::DelFly, it will clear anchor related attributes of SwFlyFrm. Then finally null pointer occur.
367*b1cdbd2cSJim Jagielski            Resolution:
368*b1cdbd2cSJim Jagielski            In pCnt->RemoveEmbeddedObject in SaveSection process of table chart, only remove the object from the object container,
369*b1cdbd2cSJim Jagielski            without removing it's storage and graphic stream. The chart already removed from formatter.> */
370*b1cdbd2cSJim Jagielski            sal_Bool	bChartWithInternalProvider = sal_False;
371*b1cdbd2cSJim Jagielski            sal_Bool	bKeepObjectToTempStorage = sal_True;
372*b1cdbd2cSJim Jagielski            uno::Reference < embed::XEmbeddedObject > xIP = GetOLEObj().GetOleRef();
373*b1cdbd2cSJim Jagielski            if ( svt::EmbeddedObjectRef::TryRunningState( xIP ) )
374*b1cdbd2cSJim Jagielski            {
375*b1cdbd2cSJim Jagielski                uno::Reference< chart2::XChartDocument > xChart( xIP->getComponent(), UNO_QUERY );
376*b1cdbd2cSJim Jagielski                if ( xChart.is() && xChart->hasInternalDataProvider() )
377*b1cdbd2cSJim Jagielski                    bChartWithInternalProvider = sal_True;
378*b1cdbd2cSJim Jagielski            }
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski            if ( IsChart() && sChartTblName.Len() && !bChartWithInternalProvider )
381*b1cdbd2cSJim Jagielski                bKeepObjectToTempStorage = sal_False;
382*b1cdbd2cSJim Jagielski            pCnt->RemoveEmbeddedObject( aOLEObj.aName, sal_False, bKeepObjectToTempStorage );
383*b1cdbd2cSJim Jagielski            // modify end
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 			// TODO/LATER: aOLEObj.aName has no meaning here, since the undo container contains the object
387*b1cdbd2cSJim Jagielski 			// by different name, in future it might makes sence that the name is transported here.
388*b1cdbd2cSJim Jagielski             aOLEObj.xOLERef.AssignToContainer( 0, aOLEObj.aName );
389*b1cdbd2cSJim Jagielski             try
390*b1cdbd2cSJim Jagielski             {
391*b1cdbd2cSJim Jagielski                 // "unload" object
392*b1cdbd2cSJim Jagielski                 aOLEObj.xOLERef->changeState( embed::EmbedStates::LOADED );
393*b1cdbd2cSJim Jagielski             }
394*b1cdbd2cSJim Jagielski             catch ( uno::Exception& )
395*b1cdbd2cSJim Jagielski             {
396*b1cdbd2cSJim Jagielski             }
397*b1cdbd2cSJim Jagielski 		}
398*b1cdbd2cSJim Jagielski 	}
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski 	DisconnectFileLink_Impl();
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 	return sal_True;
403*b1cdbd2cSJim Jagielski }
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski 
MakeOLENode(const SwNodeIndex & rWhere,const svt::EmbeddedObjectRef & xObj,SwGrfFmtColl * pGrfColl,SwAttrSet * pAutoAttr)406*b1cdbd2cSJim Jagielski SwOLENode * SwNodes::MakeOLENode( const SwNodeIndex & rWhere,
407*b1cdbd2cSJim Jagielski                     const svt::EmbeddedObjectRef& xObj,
408*b1cdbd2cSJim Jagielski 									SwGrfFmtColl* pGrfColl,
409*b1cdbd2cSJim Jagielski 									SwAttrSet* pAutoAttr )
410*b1cdbd2cSJim Jagielski {
411*b1cdbd2cSJim Jagielski 	ASSERT( pGrfColl,"SwNodes::MakeOLENode: Formatpointer ist 0." );
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski 	SwOLENode *pNode =
414*b1cdbd2cSJim Jagielski         new SwOLENode( rWhere, xObj, pGrfColl, pAutoAttr );
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski     // set parent if XChild is supported
417*b1cdbd2cSJim Jagielski     //!! needed to supply Math objects with a valid reference device
418*b1cdbd2cSJim Jagielski     uno::Reference< container::XChild > xChild( pNode->GetOLEObj().GetObject().GetObject(), UNO_QUERY );
419*b1cdbd2cSJim Jagielski     if (xChild.is())
420*b1cdbd2cSJim Jagielski     {
421*b1cdbd2cSJim Jagielski         SwDocShell *pDocSh = GetDoc()->GetDocShell();
422*b1cdbd2cSJim Jagielski         if (pDocSh)
423*b1cdbd2cSJim Jagielski             xChild->setParent( pDocSh->GetModel() );
424*b1cdbd2cSJim Jagielski     }
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski     return pNode;
427*b1cdbd2cSJim Jagielski }
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski 
MakeOLENode(const SwNodeIndex & rWhere,const String & rName,sal_Int64 nAspect,SwGrfFmtColl * pGrfColl,SwAttrSet * pAutoAttr)430*b1cdbd2cSJim Jagielski SwOLENode * SwNodes::MakeOLENode( const SwNodeIndex & rWhere,
431*b1cdbd2cSJim Jagielski 	const String &rName, sal_Int64 nAspect, SwGrfFmtColl* pGrfColl, SwAttrSet* pAutoAttr )
432*b1cdbd2cSJim Jagielski {
433*b1cdbd2cSJim Jagielski 	ASSERT( pGrfColl,"SwNodes::MakeOLENode: Formatpointer ist 0." );
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski 	SwOLENode *pNode =
436*b1cdbd2cSJim Jagielski 		new SwOLENode( rWhere, rName, nAspect, pGrfColl, pAutoAttr );
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski     // set parent if XChild is supported
439*b1cdbd2cSJim Jagielski     //!! needed to supply Math objects with a valid reference device
440*b1cdbd2cSJim Jagielski     uno::Reference< container::XChild > xChild( pNode->GetOLEObj().GetObject().GetObject(), UNO_QUERY );
441*b1cdbd2cSJim Jagielski     if (xChild.is())
442*b1cdbd2cSJim Jagielski     {
443*b1cdbd2cSJim Jagielski         SwDocShell *pDocSh= GetDoc()->GetDocShell();
444*b1cdbd2cSJim Jagielski         if (pDocSh)
445*b1cdbd2cSJim Jagielski             xChild->setParent( pDocSh->GetModel() );
446*b1cdbd2cSJim Jagielski     }
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski     return pNode;
449*b1cdbd2cSJim Jagielski }
450*b1cdbd2cSJim Jagielski 
GetTwipSize() const451*b1cdbd2cSJim Jagielski Size SwOLENode::GetTwipSize() const
452*b1cdbd2cSJim Jagielski {
453*b1cdbd2cSJim Jagielski 	MapMode aMapMode( MAP_TWIP );
454*b1cdbd2cSJim Jagielski 	return ((SwOLENode*)this)->aOLEObj.GetObject().GetSize( &aMapMode );
455*b1cdbd2cSJim Jagielski }
456*b1cdbd2cSJim Jagielski 
MakeCopy(SwDoc * pDoc,const SwNodeIndex & rIdx) const457*b1cdbd2cSJim Jagielski SwCntntNode* SwOLENode::MakeCopy( SwDoc* pDoc, const SwNodeIndex& rIdx ) const
458*b1cdbd2cSJim Jagielski {
459*b1cdbd2cSJim Jagielski 	// Falls bereits eine SvPersist-Instanz existiert, nehmen wir diese
460*b1cdbd2cSJim Jagielski     SfxObjectShell* pPersistShell = pDoc->GetPersist();
461*b1cdbd2cSJim Jagielski 	if( !pPersistShell )
462*b1cdbd2cSJim Jagielski 	{
463*b1cdbd2cSJim Jagielski         // TODO/LATER: is EmbeddedObjectContainer not enough?
464*b1cdbd2cSJim Jagielski         // the created document will be closed by pDoc ( should use SfxObjectShellLock )
465*b1cdbd2cSJim Jagielski 		pPersistShell = new SwDocShell( pDoc, SFX_CREATE_MODE_INTERNAL );
466*b1cdbd2cSJim Jagielski 		pDoc->SetTmpDocShell( pPersistShell );
467*b1cdbd2cSJim Jagielski 		pPersistShell->DoInitNew( NULL );
468*b1cdbd2cSJim Jagielski 	}
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski 	// Wir hauen das Ding auf SvPersist-Ebene rein
471*b1cdbd2cSJim Jagielski     // TODO/LATER: check if using the same naming scheme for all apps works here
472*b1cdbd2cSJim Jagielski     ::rtl::OUString aNewName/*( Sw3Io::UniqueName( p->GetStorage(), "Obj" ) )*/;
473*b1cdbd2cSJim Jagielski     SfxObjectShell* pSrc = GetDoc()->GetPersist();
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski 	pPersistShell->GetEmbeddedObjectContainer().CopyAndGetEmbeddedObject(
476*b1cdbd2cSJim Jagielski 		pSrc->GetEmbeddedObjectContainer(),
477*b1cdbd2cSJim Jagielski 		pSrc->GetEmbeddedObjectContainer().GetEmbeddedObject( aOLEObj.aName ),
478*b1cdbd2cSJim Jagielski 		aNewName );
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski 	SwOLENode* pOLENd = pDoc->GetNodes().MakeOLENode( rIdx, aNewName, GetAspect(),
481*b1cdbd2cSJim Jagielski 									(SwGrfFmtColl*)pDoc->GetDfltGrfFmtColl(),
482*b1cdbd2cSJim Jagielski 									(SwAttrSet*)GetpSwAttrSet() );
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski 	pOLENd->SetChartTblName( GetChartTblName() );
485*b1cdbd2cSJim Jagielski     pOLENd->SetTitle( GetTitle() );
486*b1cdbd2cSJim Jagielski     pOLENd->SetDescription( GetDescription() );
487*b1cdbd2cSJim Jagielski     pOLENd->SetContour( HasContour(), HasAutomaticContour() );
488*b1cdbd2cSJim Jagielski 	pOLENd->SetAspect( GetAspect() ); // the replacement image must be already copied
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski 	pOLENd->SetOLESizeInvalid( sal_True );
491*b1cdbd2cSJim Jagielski 	pDoc->SetOLEPrtNotifyPending();
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski 	return pOLENd;
494*b1cdbd2cSJim Jagielski }
495*b1cdbd2cSJim Jagielski 
IsInGlobalDocSection() const496*b1cdbd2cSJim Jagielski sal_Bool SwOLENode::IsInGlobalDocSection() const
497*b1cdbd2cSJim Jagielski {
498*b1cdbd2cSJim Jagielski 	// suche den "Body Anchor"
499*b1cdbd2cSJim Jagielski 	sal_uLong nEndExtraIdx = GetNodes().GetEndOfExtras().GetIndex();
500*b1cdbd2cSJim Jagielski 	const SwNode* pAnchorNd = this;
501*b1cdbd2cSJim Jagielski 	do {
502*b1cdbd2cSJim Jagielski 		SwFrmFmt* pFlyFmt = pAnchorNd->GetFlyFmt();
503*b1cdbd2cSJim Jagielski 		if( !pFlyFmt )
504*b1cdbd2cSJim Jagielski 			return sal_False;
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski 		const SwFmtAnchor& rAnchor = pFlyFmt->GetAnchor();
507*b1cdbd2cSJim Jagielski 		if( !rAnchor.GetCntntAnchor() )
508*b1cdbd2cSJim Jagielski 			return sal_False;
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski 		pAnchorNd = &rAnchor.GetCntntAnchor()->nNode.GetNode();
511*b1cdbd2cSJim Jagielski 	} while( pAnchorNd->GetIndex() < nEndExtraIdx );
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski 	const SwSectionNode* pSectNd = pAnchorNd->FindSectionNode();
514*b1cdbd2cSJim Jagielski 	if( !pSectNd )
515*b1cdbd2cSJim Jagielski 		return sal_False;
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski 	while( pSectNd )
518*b1cdbd2cSJim Jagielski 	{
519*b1cdbd2cSJim Jagielski 		pAnchorNd = pSectNd;
520*b1cdbd2cSJim Jagielski         pSectNd = pAnchorNd->StartOfSectionNode()->FindSectionNode();
521*b1cdbd2cSJim Jagielski 	}
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski 	// in pAnchorNd steht der zuletzt gefundene Section Node. Der muss
524*b1cdbd2cSJim Jagielski 	// jetzt die Bedingung fuers GlobalDoc erfuellen.
525*b1cdbd2cSJim Jagielski 	pSectNd = (SwSectionNode*)pAnchorNd;
526*b1cdbd2cSJim Jagielski 	return FILE_LINK_SECTION == pSectNd->GetSection().GetType() &&
527*b1cdbd2cSJim Jagielski 			pSectNd->GetIndex() > nEndExtraIdx;
528*b1cdbd2cSJim Jagielski }
529*b1cdbd2cSJim Jagielski 
IsOLEObjectDeleted() const530*b1cdbd2cSJim Jagielski sal_Bool SwOLENode::IsOLEObjectDeleted() const
531*b1cdbd2cSJim Jagielski {
532*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
533*b1cdbd2cSJim Jagielski     if( aOLEObj.xOLERef.is() )
534*b1cdbd2cSJim Jagielski 	{
535*b1cdbd2cSJim Jagielski         SfxObjectShell* p = GetDoc()->GetPersist();
536*b1cdbd2cSJim Jagielski 		if( p )		// muss da sein
537*b1cdbd2cSJim Jagielski 		{
538*b1cdbd2cSJim Jagielski             return !p->GetEmbeddedObjectContainer().HasEmbeddedObject( aOLEObj.aName );
539*b1cdbd2cSJim Jagielski             //SvInfoObjectRef aRef( p->Find( aOLEObj.aName ) );
540*b1cdbd2cSJim Jagielski             //if( aRef.Is() )
541*b1cdbd2cSJim Jagielski             //    bRet = aRef->IsDeleted();
542*b1cdbd2cSJim Jagielski 		}
543*b1cdbd2cSJim Jagielski 	}
544*b1cdbd2cSJim Jagielski 	return bRet;
545*b1cdbd2cSJim Jagielski }
546*b1cdbd2cSJim Jagielski 
GetNewReplacement()547*b1cdbd2cSJim Jagielski void SwOLENode::GetNewReplacement()
548*b1cdbd2cSJim Jagielski {
549*b1cdbd2cSJim Jagielski 	if ( aOLEObj.xOLERef.is() )
550*b1cdbd2cSJim Jagielski 		aOLEObj.xOLERef.UpdateReplacement();
551*b1cdbd2cSJim Jagielski }
552*b1cdbd2cSJim Jagielski 
UpdateLinkURL_Impl()553*b1cdbd2cSJim Jagielski sal_Bool SwOLENode::UpdateLinkURL_Impl()
554*b1cdbd2cSJim Jagielski {
555*b1cdbd2cSJim Jagielski 	sal_Bool bResult = sal_False;
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski 	if ( mpObjectLink )
558*b1cdbd2cSJim Jagielski 	{
559*b1cdbd2cSJim Jagielski 		String aNewLinkURL;
560*b1cdbd2cSJim Jagielski 		GetDoc()->GetLinkManager().GetDisplayNames( mpObjectLink, 0, &aNewLinkURL, 0, 0 );
561*b1cdbd2cSJim Jagielski 		if ( !aNewLinkURL.EqualsIgnoreCaseAscii( maLinkURL ) )
562*b1cdbd2cSJim Jagielski 		{
563*b1cdbd2cSJim Jagielski 			if ( !aOLEObj.xOLERef.is() )
564*b1cdbd2cSJim Jagielski 				aOLEObj.GetOleRef();
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski 			uno::Reference< embed::XEmbeddedObject > xObj = aOLEObj.xOLERef.GetObject();
567*b1cdbd2cSJim Jagielski 			uno::Reference< embed::XCommonEmbedPersist > xPersObj( xObj, uno::UNO_QUERY );
568*b1cdbd2cSJim Jagielski 			OSL_ENSURE( xPersObj.is(), "The object must exist!\n" );
569*b1cdbd2cSJim Jagielski     		if ( xPersObj.is() )
570*b1cdbd2cSJim Jagielski 			{
571*b1cdbd2cSJim Jagielski 				try
572*b1cdbd2cSJim Jagielski 				{
573*b1cdbd2cSJim Jagielski 					sal_Int32 nCurState = xObj->getCurrentState();
574*b1cdbd2cSJim Jagielski 					if ( nCurState != embed::EmbedStates::LOADED )
575*b1cdbd2cSJim Jagielski 						xObj->changeState( embed::EmbedStates::LOADED );
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 					// TODO/LATER: there should be possible to get current mediadescriptor settings from the object
578*b1cdbd2cSJim Jagielski 					uno::Sequence< beans::PropertyValue > aArgs( 1 );
579*b1cdbd2cSJim Jagielski 					aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
580*b1cdbd2cSJim Jagielski 					aArgs[0].Value <<= ::rtl::OUString( aNewLinkURL );
581*b1cdbd2cSJim Jagielski 					xPersObj->reload( aArgs, uno::Sequence< beans::PropertyValue >() );
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski 					maLinkURL = aNewLinkURL;
584*b1cdbd2cSJim Jagielski 					bResult = sal_True;
585*b1cdbd2cSJim Jagielski 
586*b1cdbd2cSJim Jagielski 					if ( nCurState != embed::EmbedStates::LOADED )
587*b1cdbd2cSJim Jagielski 						xObj->changeState( nCurState );
588*b1cdbd2cSJim Jagielski 				}
589*b1cdbd2cSJim Jagielski 				catch( uno::Exception& )
590*b1cdbd2cSJim Jagielski 				{}
591*b1cdbd2cSJim Jagielski 			}
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski 			if ( !bResult )
594*b1cdbd2cSJim Jagielski 			{
595*b1cdbd2cSJim Jagielski 				// TODO/LATER: return the old name to the link manager, is it possible?
596*b1cdbd2cSJim Jagielski 			}
597*b1cdbd2cSJim Jagielski 		}
598*b1cdbd2cSJim Jagielski 	}
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski 	return bResult;
601*b1cdbd2cSJim Jagielski }
602*b1cdbd2cSJim Jagielski 
BreakFileLink_Impl()603*b1cdbd2cSJim Jagielski void SwOLENode::BreakFileLink_Impl()
604*b1cdbd2cSJim Jagielski {
605*b1cdbd2cSJim Jagielski 	SfxObjectShell* pPers = GetDoc()->GetPersist();
606*b1cdbd2cSJim Jagielski 
607*b1cdbd2cSJim Jagielski 	if ( pPers )
608*b1cdbd2cSJim Jagielski 	{
609*b1cdbd2cSJim Jagielski 		uno::Reference< embed::XStorage > xStorage = pPers->GetStorage();
610*b1cdbd2cSJim Jagielski 		if ( xStorage.is() )
611*b1cdbd2cSJim Jagielski 		{
612*b1cdbd2cSJim Jagielski 			try
613*b1cdbd2cSJim Jagielski 			{
614*b1cdbd2cSJim Jagielski 				uno::Reference< embed::XLinkageSupport > xLinkSupport( aOLEObj.GetOleRef(), uno::UNO_QUERY_THROW );
615*b1cdbd2cSJim Jagielski 				xLinkSupport->breakLink( xStorage, aOLEObj.GetCurrentPersistName() );
616*b1cdbd2cSJim Jagielski 				DisconnectFileLink_Impl();
617*b1cdbd2cSJim Jagielski 				maLinkURL = String();
618*b1cdbd2cSJim Jagielski 			}
619*b1cdbd2cSJim Jagielski 			catch( uno::Exception& )
620*b1cdbd2cSJim Jagielski 			{
621*b1cdbd2cSJim Jagielski 			}
622*b1cdbd2cSJim Jagielski 		}
623*b1cdbd2cSJim Jagielski 	}
624*b1cdbd2cSJim Jagielski }
625*b1cdbd2cSJim Jagielski 
DisconnectFileLink_Impl()626*b1cdbd2cSJim Jagielski void SwOLENode::DisconnectFileLink_Impl()
627*b1cdbd2cSJim Jagielski {
628*b1cdbd2cSJim Jagielski 	if ( mpObjectLink )
629*b1cdbd2cSJim Jagielski 	{
630*b1cdbd2cSJim Jagielski         GetDoc()->GetLinkManager().Remove( mpObjectLink );
631*b1cdbd2cSJim Jagielski 		mpObjectLink = NULL;
632*b1cdbd2cSJim Jagielski 	}
633*b1cdbd2cSJim Jagielski }
634*b1cdbd2cSJim Jagielski 
CheckFileLink_Impl()635*b1cdbd2cSJim Jagielski void SwOLENode::CheckFileLink_Impl()
636*b1cdbd2cSJim Jagielski {
637*b1cdbd2cSJim Jagielski 	if ( aOLEObj.xOLERef.GetObject().is() && !mpObjectLink )
638*b1cdbd2cSJim Jagielski 	{
639*b1cdbd2cSJim Jagielski 		try
640*b1cdbd2cSJim Jagielski 		{
641*b1cdbd2cSJim Jagielski 			uno::Reference< embed::XLinkageSupport > xLinkSupport( aOLEObj.xOLERef.GetObject(), uno::UNO_QUERY_THROW );
642*b1cdbd2cSJim Jagielski 			if ( xLinkSupport->isLink() )
643*b1cdbd2cSJim Jagielski 			{
644*b1cdbd2cSJim Jagielski 				String aLinkURL = xLinkSupport->getLinkURL();
645*b1cdbd2cSJim Jagielski 				if ( aLinkURL.Len() )
646*b1cdbd2cSJim Jagielski 				{
647*b1cdbd2cSJim Jagielski 					// this is a file link so the model link manager should handle it
648*b1cdbd2cSJim Jagielski 					mpObjectLink = new SwEmbedObjectLink( this );
649*b1cdbd2cSJim Jagielski 					maLinkURL = aLinkURL;
650*b1cdbd2cSJim Jagielski 					GetDoc()->GetLinkManager().InsertFileLink( *mpObjectLink, OBJECT_CLIENT_OLE, aLinkURL, NULL, NULL );
651*b1cdbd2cSJim Jagielski 					mpObjectLink->Connect();
652*b1cdbd2cSJim Jagielski 				}
653*b1cdbd2cSJim Jagielski 			}
654*b1cdbd2cSJim Jagielski 		}
655*b1cdbd2cSJim Jagielski 		catch( uno::Exception& )
656*b1cdbd2cSJim Jagielski 		{
657*b1cdbd2cSJim Jagielski 		}
658*b1cdbd2cSJim Jagielski 	}
659*b1cdbd2cSJim Jagielski }
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski // --> OD 2009-03-05 #i99665#
IsChart() const662*b1cdbd2cSJim Jagielski bool SwOLENode::IsChart() const
663*b1cdbd2cSJim Jagielski {
664*b1cdbd2cSJim Jagielski     bool bIsChart( false );
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski     const uno::Reference< embed::XEmbeddedObject > xEmbObj =
667*b1cdbd2cSJim Jagielski                             const_cast<SwOLEObj&>(GetOLEObj()).GetOleRef();
668*b1cdbd2cSJim Jagielski     if ( xEmbObj.is() )
669*b1cdbd2cSJim Jagielski     {
670*b1cdbd2cSJim Jagielski         SvGlobalName aClassID( xEmbObj->getClassID() );
671*b1cdbd2cSJim Jagielski         bIsChart = SotExchange::IsChart( aClassID );
672*b1cdbd2cSJim Jagielski     }
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski     return bIsChart;
675*b1cdbd2cSJim Jagielski }
676*b1cdbd2cSJim Jagielski // <--
677*b1cdbd2cSJim Jagielski 
SwOLEObj(const svt::EmbeddedObjectRef & xObj)678*b1cdbd2cSJim Jagielski SwOLEObj::SwOLEObj( const svt::EmbeddedObjectRef& xObj ) :
679*b1cdbd2cSJim Jagielski     pOLENd( 0 ),
680*b1cdbd2cSJim Jagielski     pListener( 0 ),
681*b1cdbd2cSJim Jagielski     xOLERef( xObj )
682*b1cdbd2cSJim Jagielski {
683*b1cdbd2cSJim Jagielski     xOLERef.Lock( sal_True );
684*b1cdbd2cSJim Jagielski     if ( xObj.is() )
685*b1cdbd2cSJim Jagielski     {
686*b1cdbd2cSJim Jagielski         pListener = new SwOLEListener_Impl( this );
687*b1cdbd2cSJim Jagielski         pListener->acquire();
688*b1cdbd2cSJim Jagielski         xObj->addStateChangeListener( pListener );
689*b1cdbd2cSJim Jagielski     }
690*b1cdbd2cSJim Jagielski }
691*b1cdbd2cSJim Jagielski 
692*b1cdbd2cSJim Jagielski 
SwOLEObj(const String & rString,sal_Int64 nAspect)693*b1cdbd2cSJim Jagielski SwOLEObj::SwOLEObj( const String &rString, sal_Int64 nAspect ) :
694*b1cdbd2cSJim Jagielski 	pOLENd( 0 ),
695*b1cdbd2cSJim Jagielski     pListener( 0 ),
696*b1cdbd2cSJim Jagielski     aName( rString )
697*b1cdbd2cSJim Jagielski {
698*b1cdbd2cSJim Jagielski     xOLERef.Lock( sal_True );
699*b1cdbd2cSJim Jagielski 	xOLERef.SetViewAspect( nAspect );
700*b1cdbd2cSJim Jagielski }
701*b1cdbd2cSJim Jagielski 
702*b1cdbd2cSJim Jagielski 
~SwOLEObj()703*b1cdbd2cSJim Jagielski SwOLEObj::~SwOLEObj()
704*b1cdbd2cSJim Jagielski {
705*b1cdbd2cSJim Jagielski     if( pListener )
706*b1cdbd2cSJim Jagielski     {
707*b1cdbd2cSJim Jagielski         if ( xOLERef.is() )
708*b1cdbd2cSJim Jagielski             xOLERef->removeStateChangeListener( pListener );
709*b1cdbd2cSJim Jagielski         pListener->Release();
710*b1cdbd2cSJim Jagielski     }
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski     if( pOLENd && !pOLENd->GetDoc()->IsInDtor() )
713*b1cdbd2cSJim Jagielski 	{
714*b1cdbd2cSJim Jagielski         // if the model is not currently in destruction it means that this object should be removed from the model
715*b1cdbd2cSJim Jagielski 		comphelper::EmbeddedObjectContainer* pCnt = xOLERef.GetContainer();
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
718*b1cdbd2cSJim Jagielski         SfxObjectShell* p = pOLENd->GetDoc()->GetPersist();
719*b1cdbd2cSJim Jagielski         DBG_ASSERT( p, "No document!" );
720*b1cdbd2cSJim Jagielski         if( p )
721*b1cdbd2cSJim Jagielski         {
722*b1cdbd2cSJim Jagielski             comphelper::EmbeddedObjectContainer& rCnt = p->GetEmbeddedObjectContainer();
723*b1cdbd2cSJim Jagielski 			OSL_ENSURE( !pCnt || &rCnt == pCnt, "The helper is assigned to unexpected container!\n" );
724*b1cdbd2cSJim Jagielski         }
725*b1cdbd2cSJim Jagielski #endif
726*b1cdbd2cSJim Jagielski 
727*b1cdbd2cSJim Jagielski 		if ( pCnt && pCnt->HasEmbeddedObject( aName ) )
728*b1cdbd2cSJim Jagielski 		{
729*b1cdbd2cSJim Jagielski 			uno::Reference < container::XChild > xChild( xOLERef.GetObject(), uno::UNO_QUERY );
730*b1cdbd2cSJim Jagielski 			if ( xChild.is() )
731*b1cdbd2cSJim Jagielski 				xChild->setParent( 0 );
732*b1cdbd2cSJim Jagielski 
733*b1cdbd2cSJim Jagielski 			// not already removed by deleting the object
734*b1cdbd2cSJim Jagielski 			xOLERef.AssignToContainer( 0, aName );
735*b1cdbd2cSJim Jagielski 
736*b1cdbd2cSJim Jagielski 			// unlock object so that object can be closed in RemoveEmbeddedObject
737*b1cdbd2cSJim Jagielski 			// successful closing of the object will automatically clear the reference then
738*b1cdbd2cSJim Jagielski 			xOLERef.Lock(sal_False);
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski 			// Always remove object from conteiner it is connected to
741*b1cdbd2cSJim Jagielski             try
742*b1cdbd2cSJim Jagielski             {
743*b1cdbd2cSJim Jagielski                 pCnt->RemoveEmbeddedObject( aName );
744*b1cdbd2cSJim Jagielski             }
745*b1cdbd2cSJim Jagielski             catch ( uno::Exception& )
746*b1cdbd2cSJim Jagielski             {
747*b1cdbd2cSJim Jagielski             }
748*b1cdbd2cSJim Jagielski 		}
749*b1cdbd2cSJim Jagielski 
750*b1cdbd2cSJim Jagielski 	}
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski     if ( xOLERef.is() )
753*b1cdbd2cSJim Jagielski         // in case the object wasn't closed: release it
754*b1cdbd2cSJim Jagielski         // in case the object was not in the container: it's still locked, try to close
755*b1cdbd2cSJim Jagielski         xOLERef.Clear();
756*b1cdbd2cSJim Jagielski }
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski 
SetNode(SwOLENode * pNode)759*b1cdbd2cSJim Jagielski void SwOLEObj::SetNode( SwOLENode* pNode )
760*b1cdbd2cSJim Jagielski {
761*b1cdbd2cSJim Jagielski 	pOLENd = pNode;
762*b1cdbd2cSJim Jagielski     if ( !aName.Len() )
763*b1cdbd2cSJim Jagielski 	{
764*b1cdbd2cSJim Jagielski 		SwDoc* pDoc = pNode->GetDoc();
765*b1cdbd2cSJim Jagielski 
766*b1cdbd2cSJim Jagielski 		// Falls bereits eine SvPersist-Instanz existiert, nehmen wir diese
767*b1cdbd2cSJim Jagielski         SfxObjectShell* p = pDoc->GetPersist();
768*b1cdbd2cSJim Jagielski         if( !p )
769*b1cdbd2cSJim Jagielski         {
770*b1cdbd2cSJim Jagielski             // TODO/LATER: reicht hier nicht ein EmbeddedObjectContainer? Was passiert mit
771*b1cdbd2cSJim Jagielski             // diesem Dokument?
772*b1cdbd2cSJim Jagielski 			ASSERT( !this, "warum wird hier eine DocShell angelegt?" );
773*b1cdbd2cSJim Jagielski             p = new SwDocShell( pDoc, SFX_CREATE_MODE_INTERNAL );
774*b1cdbd2cSJim Jagielski             p->DoInitNew( NULL );
775*b1cdbd2cSJim Jagielski         }
776*b1cdbd2cSJim Jagielski 
777*b1cdbd2cSJim Jagielski         ::rtl::OUString aObjName;
778*b1cdbd2cSJim Jagielski         uno::Reference < container::XChild > xChild( xOLERef.GetObject(), uno::UNO_QUERY );
779*b1cdbd2cSJim Jagielski         if ( xChild.is() && xChild->getParent() != p->GetModel() )
780*b1cdbd2cSJim Jagielski             // it is possible that the parent was set already
781*b1cdbd2cSJim Jagielski             xChild->setParent( p->GetModel() );
782*b1cdbd2cSJim Jagielski         if (!p->GetEmbeddedObjectContainer().InsertEmbeddedObject( xOLERef.GetObject(), aObjName ) )
783*b1cdbd2cSJim Jagielski         {
784*b1cdbd2cSJim Jagielski             DBG_ERROR( "InsertObject failed" );
785*b1cdbd2cSJim Jagielski         if ( xChild.is() )
786*b1cdbd2cSJim Jagielski             xChild->setParent( 0 );
787*b1cdbd2cSJim Jagielski         }
788*b1cdbd2cSJim Jagielski         else
789*b1cdbd2cSJim Jagielski             xOLERef.AssignToContainer( &p->GetEmbeddedObjectContainer(), aObjName );
790*b1cdbd2cSJim Jagielski 
791*b1cdbd2cSJim Jagielski 		( (SwOLENode*)pOLENd )->CheckFileLink_Impl(); // for this notification nonconst access is required
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski         aName = aObjName;
794*b1cdbd2cSJim Jagielski 	}
795*b1cdbd2cSJim Jagielski }
796*b1cdbd2cSJim Jagielski 
GetStyleString()797*b1cdbd2cSJim Jagielski String SwOLEObj::GetStyleString()
798*b1cdbd2cSJim Jagielski {
799*b1cdbd2cSJim Jagielski 	String strStyle;
800*b1cdbd2cSJim Jagielski 	if (xOLERef.is() && xOLERef.IsChart())
801*b1cdbd2cSJim Jagielski 		strStyle = xOLERef.GetChartType();
802*b1cdbd2cSJim Jagielski 	return strStyle;
803*b1cdbd2cSJim Jagielski }
IsOleRef() const804*b1cdbd2cSJim Jagielski sal_Bool SwOLEObj::IsOleRef() const
805*b1cdbd2cSJim Jagielski {
806*b1cdbd2cSJim Jagielski     return xOLERef.is();
807*b1cdbd2cSJim Jagielski }
808*b1cdbd2cSJim Jagielski 
GetOleRef()809*b1cdbd2cSJim Jagielski const uno::Reference < embed::XEmbeddedObject > SwOLEObj::GetOleRef()
810*b1cdbd2cSJim Jagielski {
811*b1cdbd2cSJim Jagielski     if( !xOLERef.is() )
812*b1cdbd2cSJim Jagielski 	{
813*b1cdbd2cSJim Jagielski         SfxObjectShell* p = pOLENd->GetDoc()->GetPersist();
814*b1cdbd2cSJim Jagielski 		ASSERT( p, "kein SvPersist vorhanden" );
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski         uno::Reference < embed::XEmbeddedObject > xObj = p->GetEmbeddedObjectContainer().GetEmbeddedObject( aName );
817*b1cdbd2cSJim Jagielski         ASSERT( !xOLERef.is(), "rekursiver Aufruf von GetOleRef() ist nicht erlaubt" )
818*b1cdbd2cSJim Jagielski 
819*b1cdbd2cSJim Jagielski 		if ( !xObj.is() )
820*b1cdbd2cSJim Jagielski 		{
821*b1cdbd2cSJim Jagielski 			//Das Teil konnte nicht geladen werden (wahrsch. Kaputt).
822*b1cdbd2cSJim Jagielski 			Rectangle aArea;
823*b1cdbd2cSJim Jagielski 			SwFrm *pFrm = pOLENd->getLayoutFrm(0);
824*b1cdbd2cSJim Jagielski 			if ( pFrm )
825*b1cdbd2cSJim Jagielski 			{
826*b1cdbd2cSJim Jagielski 				Size aSz( pFrm->Frm().SSize() );
827*b1cdbd2cSJim Jagielski 				const MapMode aSrc ( MAP_TWIP );
828*b1cdbd2cSJim Jagielski 				const MapMode aDest( MAP_100TH_MM );
829*b1cdbd2cSJim Jagielski 				aSz = OutputDevice::LogicToLogic( aSz, aSrc, aDest );
830*b1cdbd2cSJim Jagielski 				aArea.SetSize( aSz );
831*b1cdbd2cSJim Jagielski 			}
832*b1cdbd2cSJim Jagielski 			else
833*b1cdbd2cSJim Jagielski 				aArea.SetSize( Size( 5000,  5000 ) );
834*b1cdbd2cSJim Jagielski             // TODO/LATER: set replacement graphic for dead object
835*b1cdbd2cSJim Jagielski             // It looks as if it should work even without the object, because the replace will be generated automatically
836*b1cdbd2cSJim Jagielski             ::rtl::OUString aTmpName;
837*b1cdbd2cSJim Jagielski             xObj = p->GetEmbeddedObjectContainer().CreateEmbeddedObject( SvGlobalName( SO3_DUMMY_CLASSID ).GetByteSequence(), aTmpName );
838*b1cdbd2cSJim Jagielski 		}
839*b1cdbd2cSJim Jagielski         // else
840*b1cdbd2cSJim Jagielski         {
841*b1cdbd2cSJim Jagielski             xOLERef.Assign( xObj, xOLERef.GetViewAspect() );
842*b1cdbd2cSJim Jagielski             xOLERef.AssignToContainer( &p->GetEmbeddedObjectContainer(), aName );
843*b1cdbd2cSJim Jagielski             pListener = new SwOLEListener_Impl( this );
844*b1cdbd2cSJim Jagielski             pListener->acquire();
845*b1cdbd2cSJim Jagielski             xObj->addStateChangeListener( pListener );
846*b1cdbd2cSJim Jagielski         }
847*b1cdbd2cSJim Jagielski 
848*b1cdbd2cSJim Jagielski 		( (SwOLENode*)pOLENd )->CheckFileLink_Impl(); // for this notification nonconst access is required
849*b1cdbd2cSJim Jagielski 	}
850*b1cdbd2cSJim Jagielski     else if ( xOLERef->getCurrentState() == embed::EmbedStates::RUNNING )
851*b1cdbd2cSJim Jagielski     {
852*b1cdbd2cSJim Jagielski         // move object to first position in cache
853*b1cdbd2cSJim Jagielski         if( !pOLELRU_Cache )
854*b1cdbd2cSJim Jagielski             pOLELRU_Cache = new SwOLELRUCache;
855*b1cdbd2cSJim Jagielski         pOLELRU_Cache->InsertObj( *this );
856*b1cdbd2cSJim Jagielski     }
857*b1cdbd2cSJim Jagielski 
858*b1cdbd2cSJim Jagielski     return xOLERef.GetObject();
859*b1cdbd2cSJim Jagielski }
860*b1cdbd2cSJim Jagielski 
GetObject()861*b1cdbd2cSJim Jagielski svt::EmbeddedObjectRef& SwOLEObj::GetObject()
862*b1cdbd2cSJim Jagielski {
863*b1cdbd2cSJim Jagielski     GetOleRef();
864*b1cdbd2cSJim Jagielski     return xOLERef;
865*b1cdbd2cSJim Jagielski }
866*b1cdbd2cSJim Jagielski 
UnloadObject()867*b1cdbd2cSJim Jagielski sal_Bool SwOLEObj::UnloadObject()
868*b1cdbd2cSJim Jagielski {
869*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_True;
870*b1cdbd2cSJim Jagielski 	//Nicht notwendig im Doc DTor (MM)
871*b1cdbd2cSJim Jagielski     //ASSERT( pOLERef && pOLERef->Is() && 1 < (*pOLERef)->GetRefCount(),
872*b1cdbd2cSJim Jagielski     //        "Falscher RefCount fuers Unload" );
873*b1cdbd2cSJim Jagielski 	if ( pOLENd )
874*b1cdbd2cSJim Jagielski 	{
875*b1cdbd2cSJim Jagielski 		const SwDoc* pDoc = pOLENd->GetDoc();
876*b1cdbd2cSJim Jagielski 		bRet = UnloadObject( xOLERef.GetObject(), pDoc, xOLERef.GetViewAspect() );
877*b1cdbd2cSJim Jagielski 	}
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski 	return bRet;
880*b1cdbd2cSJim Jagielski }
881*b1cdbd2cSJim Jagielski 
UnloadObject(uno::Reference<embed::XEmbeddedObject> xObj,const SwDoc * pDoc,sal_Int64 nAspect)882*b1cdbd2cSJim Jagielski sal_Bool SwOLEObj::UnloadObject( uno::Reference< embed::XEmbeddedObject > xObj, const SwDoc* pDoc, sal_Int64 nAspect )
883*b1cdbd2cSJim Jagielski {
884*b1cdbd2cSJim Jagielski 	if ( !pDoc )
885*b1cdbd2cSJim Jagielski 		return sal_False;
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_True;
888*b1cdbd2cSJim Jagielski    	sal_Int32 nState = xObj.is() ? xObj->getCurrentState() : embed::EmbedStates::LOADED;
889*b1cdbd2cSJim Jagielski    	sal_Bool bIsActive = ( nState != embed::EmbedStates::LOADED && nState != embed::EmbedStates::RUNNING );
890*b1cdbd2cSJim Jagielski 	sal_Int64 nMiscStatus = xObj->getStatus( nAspect );
891*b1cdbd2cSJim Jagielski 
892*b1cdbd2cSJim Jagielski    	if( nState != embed::EmbedStates::LOADED && !pDoc->IsInDtor() && !bIsActive &&
893*b1cdbd2cSJim Jagielski 		embed::EmbedMisc::MS_EMBED_ALWAYSRUN != ( nMiscStatus & embed::EmbedMisc::MS_EMBED_ALWAYSRUN ) &&
894*b1cdbd2cSJim Jagielski 		embed::EmbedMisc::EMBED_ACTIVATEIMMEDIATELY != ( nMiscStatus & embed::EmbedMisc::EMBED_ACTIVATEIMMEDIATELY ) )
895*b1cdbd2cSJim Jagielski 	{
896*b1cdbd2cSJim Jagielski         SfxObjectShell* p = pDoc->GetPersist();
897*b1cdbd2cSJim Jagielski 		if( p )
898*b1cdbd2cSJim Jagielski 		{
899*b1cdbd2cSJim Jagielski 			if( pDoc->get(IDocumentSettingAccess::PURGE_OLE) )
900*b1cdbd2cSJim Jagielski 			{
901*b1cdbd2cSJim Jagielski                 try
902*b1cdbd2cSJim Jagielski                 {
903*b1cdbd2cSJim Jagielski                     uno::Reference < util::XModifiable > xMod( xObj->getComponent(), uno::UNO_QUERY );
904*b1cdbd2cSJim Jagielski                     if( xMod.is() && xMod->isModified() )
905*b1cdbd2cSJim Jagielski                     {
906*b1cdbd2cSJim Jagielski                         uno::Reference < embed::XEmbedPersist > xPers( xObj, uno::UNO_QUERY );
907*b1cdbd2cSJim Jagielski                         if ( xPers.is() )
908*b1cdbd2cSJim Jagielski                             xPers->storeOwn();
909*b1cdbd2cSJim Jagielski                         else {
910*b1cdbd2cSJim Jagielski                             DBG_ERROR("Modified object without persistance in cache!");
911*b1cdbd2cSJim Jagielski                         }
912*b1cdbd2cSJim Jagielski                     }
913*b1cdbd2cSJim Jagielski 
914*b1cdbd2cSJim Jagielski                     // setting object to loaded state will remove it from cache
915*b1cdbd2cSJim Jagielski                     xObj->changeState( embed::EmbedStates::LOADED );
916*b1cdbd2cSJim Jagielski                 }
917*b1cdbd2cSJim Jagielski                 catch ( uno::Exception& )
918*b1cdbd2cSJim Jagielski                 {
919*b1cdbd2cSJim Jagielski                     bRet = sal_False;
920*b1cdbd2cSJim Jagielski                 }
921*b1cdbd2cSJim Jagielski 			}
922*b1cdbd2cSJim Jagielski 			else
923*b1cdbd2cSJim Jagielski 				bRet = sal_False;
924*b1cdbd2cSJim Jagielski 		}
925*b1cdbd2cSJim Jagielski 	}
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski 	return bRet;
928*b1cdbd2cSJim Jagielski }
929*b1cdbd2cSJim Jagielski 
GetDescription()930*b1cdbd2cSJim Jagielski String SwOLEObj::GetDescription()
931*b1cdbd2cSJim Jagielski {
932*b1cdbd2cSJim Jagielski     String aResult;
933*b1cdbd2cSJim Jagielski 	uno::Reference< embed::XEmbeddedObject > xEmbObj = GetOleRef();
934*b1cdbd2cSJim Jagielski     if ( xEmbObj.is() )
935*b1cdbd2cSJim Jagielski     {
936*b1cdbd2cSJim Jagielski 		SvGlobalName aClassID( xEmbObj->getClassID() );
937*b1cdbd2cSJim Jagielski         if ( SotExchange::IsMath( aClassID ) )
938*b1cdbd2cSJim Jagielski             aResult = SW_RES(STR_MATH_FORMULA);
939*b1cdbd2cSJim Jagielski         else if ( SotExchange::IsChart( aClassID ) )
940*b1cdbd2cSJim Jagielski             aResult = SW_RES(STR_CHART);
941*b1cdbd2cSJim Jagielski         else
942*b1cdbd2cSJim Jagielski             aResult = SW_RES(STR_OLE);
943*b1cdbd2cSJim Jagielski     }
944*b1cdbd2cSJim Jagielski 
945*b1cdbd2cSJim Jagielski     return aResult;
946*b1cdbd2cSJim Jagielski }
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski 
SwOLELRUCache()949*b1cdbd2cSJim Jagielski SwOLELRUCache::SwOLELRUCache()
950*b1cdbd2cSJim Jagielski 	: SvPtrarr( 64, 16 ),
951*b1cdbd2cSJim Jagielski 	utl::ConfigItem( OUString::createFromAscii( "Office.Common/Cache" )),
952*b1cdbd2cSJim Jagielski     nLRU_InitSize( 20 ),
953*b1cdbd2cSJim Jagielski     bInUnload( sal_False )
954*b1cdbd2cSJim Jagielski {
955*b1cdbd2cSJim Jagielski 	EnableNotification( GetPropertyNames() );
956*b1cdbd2cSJim Jagielski 	Load();
957*b1cdbd2cSJim Jagielski }
958*b1cdbd2cSJim Jagielski 
GetPropertyNames()959*b1cdbd2cSJim Jagielski uno::Sequence< rtl::OUString > SwOLELRUCache::GetPropertyNames()
960*b1cdbd2cSJim Jagielski {
961*b1cdbd2cSJim Jagielski 	Sequence< OUString > aNames( 1 );
962*b1cdbd2cSJim Jagielski 	OUString* pNames = aNames.getArray();
963*b1cdbd2cSJim Jagielski 	pNames[0] = OUString::createFromAscii( "Writer/OLE_Objects" );
964*b1cdbd2cSJim Jagielski 	return aNames;
965*b1cdbd2cSJim Jagielski }
966*b1cdbd2cSJim Jagielski 
Notify(const uno::Sequence<rtl::OUString> &)967*b1cdbd2cSJim Jagielski void SwOLELRUCache::Notify( const uno::Sequence< rtl::OUString>&  )
968*b1cdbd2cSJim Jagielski {
969*b1cdbd2cSJim Jagielski 	Load();
970*b1cdbd2cSJim Jagielski }
971*b1cdbd2cSJim Jagielski 
Commit()972*b1cdbd2cSJim Jagielski void SwOLELRUCache::Commit()
973*b1cdbd2cSJim Jagielski {
974*b1cdbd2cSJim Jagielski }
975*b1cdbd2cSJim Jagielski 
Load()976*b1cdbd2cSJim Jagielski void SwOLELRUCache::Load()
977*b1cdbd2cSJim Jagielski {
978*b1cdbd2cSJim Jagielski 	Sequence< OUString > aNames( GetPropertyNames() );
979*b1cdbd2cSJim Jagielski 	Sequence< Any > aValues = GetProperties( aNames );
980*b1cdbd2cSJim Jagielski 	const Any* pValues = aValues.getConstArray();
981*b1cdbd2cSJim Jagielski 	DBG_ASSERT( aValues.getLength() == aNames.getLength(), "GetProperties failed" );
982*b1cdbd2cSJim Jagielski     if( aValues.getLength() == aNames.getLength() && pValues->hasValue() )
983*b1cdbd2cSJim Jagielski 	{
984*b1cdbd2cSJim Jagielski 		sal_Int32 nVal = 0;
985*b1cdbd2cSJim Jagielski 		*pValues >>= nVal;
986*b1cdbd2cSJim Jagielski         //if( 20 > nVal )
987*b1cdbd2cSJim Jagielski         //    nVal = 20;
988*b1cdbd2cSJim Jagielski 
989*b1cdbd2cSJim Jagielski 		{
990*b1cdbd2cSJim Jagielski             if( nVal < nLRU_InitSize )
991*b1cdbd2cSJim Jagielski 			{
992*b1cdbd2cSJim Jagielski                 // size of cache has been changed
993*b1cdbd2cSJim Jagielski                 sal_uInt16 nCount = SvPtrarr::Count();
994*b1cdbd2cSJim Jagielski                 sal_uInt16 nPos = nCount;
995*b1cdbd2cSJim Jagielski 
996*b1cdbd2cSJim Jagielski                 // try to remove the last entries until new maximum size is reached
997*b1cdbd2cSJim Jagielski                 while( nCount > nVal )
998*b1cdbd2cSJim Jagielski 				{
999*b1cdbd2cSJim Jagielski 					SwOLEObj* pObj = (SwOLEObj*) SvPtrarr::GetObject( --nPos );
1000*b1cdbd2cSJim Jagielski                     if ( pObj->UnloadObject() )
1001*b1cdbd2cSJim Jagielski                         nCount--;
1002*b1cdbd2cSJim Jagielski                     if ( !nPos )
1003*b1cdbd2cSJim Jagielski                         break;
1004*b1cdbd2cSJim Jagielski 				}
1005*b1cdbd2cSJim Jagielski 			}
1006*b1cdbd2cSJim Jagielski 		}
1007*b1cdbd2cSJim Jagielski 
1008*b1cdbd2cSJim Jagielski 		nLRU_InitSize = (sal_uInt16)nVal;
1009*b1cdbd2cSJim Jagielski 	}
1010*b1cdbd2cSJim Jagielski }
1011*b1cdbd2cSJim Jagielski 
InsertObj(SwOLEObj & rObj)1012*b1cdbd2cSJim Jagielski void SwOLELRUCache::InsertObj( SwOLEObj& rObj )
1013*b1cdbd2cSJim Jagielski {
1014*b1cdbd2cSJim Jagielski     SwOLEObj* pObj = &rObj;
1015*b1cdbd2cSJim Jagielski     sal_uInt16 nPos = SvPtrarr::GetPos( pObj );
1016*b1cdbd2cSJim Jagielski     if( nPos )
1017*b1cdbd2cSJim Jagielski     {
1018*b1cdbd2cSJim Jagielski         // object is currently not the first in cache
1019*b1cdbd2cSJim Jagielski         if( USHRT_MAX != nPos )
1020*b1cdbd2cSJim Jagielski             SvPtrarr::Remove( nPos );
1021*b1cdbd2cSJim Jagielski 
1022*b1cdbd2cSJim Jagielski         SvPtrarr::Insert( pObj, 0 );
1023*b1cdbd2cSJim Jagielski 
1024*b1cdbd2cSJim Jagielski         // try to remove objects if necessary (of course not the freshly inserted one at nPos=0)
1025*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = SvPtrarr::Count();
1026*b1cdbd2cSJim Jagielski         nPos = nCount-1;
1027*b1cdbd2cSJim Jagielski         while( nPos && nCount > nLRU_InitSize )
1028*b1cdbd2cSJim Jagielski         {
1029*b1cdbd2cSJim Jagielski             pObj = (SwOLEObj*) SvPtrarr::GetObject( nPos-- );
1030*b1cdbd2cSJim Jagielski             if ( pObj->UnloadObject() )
1031*b1cdbd2cSJim Jagielski                 nCount--;
1032*b1cdbd2cSJim Jagielski         }
1033*b1cdbd2cSJim Jagielski     }
1034*b1cdbd2cSJim Jagielski }
1035*b1cdbd2cSJim Jagielski 
RemoveObj(SwOLEObj & rObj)1036*b1cdbd2cSJim Jagielski void SwOLELRUCache::RemoveObj( SwOLEObj& rObj )
1037*b1cdbd2cSJim Jagielski {
1038*b1cdbd2cSJim Jagielski     sal_uInt16 nPos = SvPtrarr::GetPos( &rObj );
1039*b1cdbd2cSJim Jagielski     if ( nPos != 0xFFFF )
1040*b1cdbd2cSJim Jagielski         SvPtrarr::Remove( nPos );
1041*b1cdbd2cSJim Jagielski     if( !Count() )
1042*b1cdbd2cSJim Jagielski         DELETEZ( pOLELRU_Cache );
1043*b1cdbd2cSJim Jagielski }
1044*b1cdbd2cSJim Jagielski 
1045