diff options
author | Armin Le Grand <Armin.Le.Grand@cib.de> | 2016-07-01 14:20:00 +0200 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2016-07-07 22:32:38 +0200 |
commit | 64e1113916a6b19b30f95b454018528571ac84df (patch) | |
tree | 3228110d392555e90dd95402b9b9febb09fec0bd | |
parent | 30fdc46969f3c90c47cddf18d0dde640c8ea280e (diff) |
tdf#50613 buffer OLE primitives for charts
If OLE is a chart, buffer the primitives used for presentation as
info at the SwOLEObj, after getting them the first time using the
ChartHelper.
Change-Id: I6d7486185f6eac450de9328d37ea800f424f351b
-rw-r--r-- | sw/inc/ndole.hxx | 9 | ||||
-rw-r--r-- | sw/source/core/doc/notxtfrm.cxx | 36 | ||||
-rw-r--r-- | sw/source/core/ole/ndole.cxx | 41 |
3 files changed, 62 insertions, 24 deletions
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 <com/sun/star/embed/EmbedMisc.hpp> #include <com/sun/star/embed/EmbedStates.hpp> #include <svtools/embedhlp.hxx> -#include <svx/charthelper.hxx> #include <dview.hxx> #include <basegfx/matrix/b2dhommatrix.hxx> #include <drawinglayer/processor2d/baseprocessor2d.hxx> @@ -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 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); - } + const basegfx::B2DRange aTargetRange( + aAlignedGrfArea.Left(), aAlignedGrfArea.Top(), + aAlignedGrfArea.Right(), aAlignedGrfArea.Bottom()); + + 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 <unotools/ucbstreamhelper.hxx> #include <vcl/graphicfilter.hxx> #include <comcore.hrc> +#include <svx/charthelper.hxx> #include <deque> @@ -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 ) |