diff --git a/sw/inc/ndole.hxx b/sw/inc/ndole.hxx index 4d3a3fbbb68a..d9223c4af070 100644 --- a/sw/inc/ndole.hxx +++ b/sw/inc/ndole.hxx @@ -41,6 +41,10 @@ class SW_DLLPUBLIC SwOLEObj svt::EmbeddedObjectRef xOLERef; OUString aName; + // eventually buffered data if it is a chart OLE + drawinglayer::primitive2d::Primitive2DContainer m_aPrimitive2DSequence; + basegfx::B2DRange m_aRange; + SwOLEObj( const SwOLEObj& rObj ) = delete; void SetNode( SwOLENode* pNode ); @@ -62,6 +66,11 @@ public: const OUString& GetCurrentPersistName() const { return aName; } OUString GetStyleString(); bool IsOleRef() const; ///< To avoid unnecessary loading of object. + + // try to get OLE visualization in form of a Primitive2DSequence + // and the corresponding B2DRange. This data may be locally buffered + drawinglayer::primitive2d::Primitive2DContainer tryToGetChartContentAsPrimitive2DSequence(basegfx::B2DRange& rRange); + void resetBufferedData(); }; // SwOLENode diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx index d25ca031404c..e58f646d639a 100644 --- a/sw/source/core/doc/notxtfrm.cxx +++ b/sw/source/core/doc/notxtfrm.cxx @@ -69,7 +69,6 @@ #include #include #include -#include #include #include #include @@ -999,29 +998,22 @@ void SwNoTextFrame::PaintPicture( vcl::RenderContext* pOut, const SwRect &rGrfAr if(bIsChart) { - const uno::Reference< frame::XModel > aXModel(pOLENd->GetOLEObj().GetOleRef()->getComponent(), uno::UNO_QUERY); + basegfx::B2DRange aSourceRange; + const drawinglayer::primitive2d::Primitive2DContainer aSequence( + pOLENd->GetOLEObj().tryToGetChartContentAsPrimitive2DSequence( + aSourceRange)); - if(aXModel.is()) + if(!aSequence.empty() && !aSourceRange.isEmpty()) { - basegfx::B2DRange aSourceRange; + const basegfx::B2DRange aTargetRange( + aAlignedGrfArea.Left(), aAlignedGrfArea.Top(), + aAlignedGrfArea.Right(), aAlignedGrfArea.Bottom()); - const drawinglayer::primitive2d::Primitive2DContainer aSequence( - ChartHelper::tryToGetChartContentAsPrimitive2DSequence( - aXModel, - aSourceRange)); - - if(!aSequence.empty() && !aSourceRange.isEmpty()) - { - const basegfx::B2DRange aTargetRange( - aAlignedGrfArea.Left(), aAlignedGrfArea.Top(), - aAlignedGrfArea.Right(), aAlignedGrfArea.Bottom()); - - bDone = paintUsingPrimitivesHelper( - *pOut, - aSequence, - aSourceRange, - aTargetRange); - } + bDone = paintUsingPrimitivesHelper( + *pOut, + aSequence, + aSourceRange, + aTargetRange); } } diff --git a/sw/source/core/ole/ndole.cxx b/sw/source/core/ole/ndole.cxx index 95ca597ca56b..e5439758573f 100644 --- a/sw/source/core/ole/ndole.cxx +++ b/sw/source/core/ole/ndole.cxx @@ -56,6 +56,7 @@ #include #include #include +#include #include @@ -124,6 +125,10 @@ void SAL_CALL SwOLEListener_Impl::stateChanged( const lang::EventObject&, ::sal_ if (g_pOLELRU_Cache) g_pOLELRU_Cache->RemoveObj( *mpObj ); } + else if(mpObj && nNewState == embed::EmbedStates::RUNNING) + { + mpObj->resetBufferedData(); + } } void SwOLEListener_Impl::Release() @@ -640,7 +645,9 @@ bool SwOLENode::IsChart() const SwOLEObj::SwOLEObj( const svt::EmbeddedObjectRef& xObj ) : pOLENd( nullptr ), pListener( nullptr ), - xOLERef( xObj ) + xOLERef( xObj ), + m_aPrimitive2DSequence(), + m_aRange() { xOLERef.Lock(); if ( xObj.is() ) @@ -654,7 +661,9 @@ SwOLEObj::SwOLEObj( const svt::EmbeddedObjectRef& xObj ) : SwOLEObj::SwOLEObj( const OUString &rString, sal_Int64 nAspect ) : pOLENd( nullptr ), pListener( nullptr ), - aName( rString ) + aName( rString ), + m_aPrimitive2DSequence(), + m_aRange() { xOLERef.Lock(); xOLERef.SetViewAspect( nAspect ); @@ -899,6 +908,34 @@ OUString SwOLEObj::GetDescription() return SW_RESSTR(STR_OLE); } +drawinglayer::primitive2d::Primitive2DContainer SwOLEObj::tryToGetChartContentAsPrimitive2DSequence(basegfx::B2DRange& rRange) +{ + if(m_aPrimitive2DSequence.empty() && m_aRange.isEmpty() && xOLERef.is() && xOLERef.IsChart()) + { + const uno::Reference< frame::XModel > aXModel(xOLERef->getComponent(), uno::UNO_QUERY); + + if(aXModel.is()) + { + m_aPrimitive2DSequence = ChartHelper::tryToGetChartContentAsPrimitive2DSequence( + aXModel, + m_aRange); + } + } + + if(!m_aPrimitive2DSequence.empty() && !m_aRange.isEmpty()) + { + rRange = m_aRange; + } + + return m_aPrimitive2DSequence; +} + +void SwOLEObj::resetBufferedData() +{ + m_aPrimitive2DSequence = drawinglayer::primitive2d::Primitive2DContainer(); + m_aRange.reset(); +} + SwOLELRUCache::SwOLELRUCache() : utl::ConfigItem(OUString("Office.Common/Cache")) , m_nLRU_InitSize( 20 )