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
This commit is contained in:
committed by
Thorsten Behrens
parent
30fdc46969
commit
64e1113916
@@ -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
|
||||
|
@@ -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 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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 )
|
||||
|
Reference in New Issue
Block a user