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