summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Le Grand <Armin.Le.Grand@cib.de>2016-07-01 14:20:00 +0200
committerArmin Le Grand <Armin.Le.Grand@cib.de>2016-07-07 15:08:02 +0200
commit94a71e84ae39019daf786e8aa33cc41a2c239b99 (patch)
tree3556331239a4c59bea03f421ec0dac7db4e6138b
parent86dcdf9a68c2425b85c3bebcc368dee7aaeb33a9 (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.hxx9
-rw-r--r--sw/source/core/doc/notxtfrm.cxx36
-rw-r--r--sw/source/core/ole/ndole.cxx41
3 files changed, 62 insertions, 24 deletions
diff --git a/sw/inc/ndole.hxx b/sw/inc/ndole.hxx
index fe1bab2f599d..ec901a69ab16 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 83ca26989316..cef1f47e0730 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 )