diff options
Diffstat (limited to 'lotuswordpro/source/filter/lwplayout.cxx')
-rw-r--r-- | lotuswordpro/source/filter/lwplayout.cxx | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/lotuswordpro/source/filter/lwplayout.cxx b/lotuswordpro/source/filter/lwplayout.cxx index 487058cbb08b..5e548d1a6019 100644 --- a/lotuswordpro/source/filter/lwplayout.cxx +++ b/lotuswordpro/source/filter/lwplayout.cxx @@ -588,6 +588,7 @@ void LwpLayoutMisc::Read(LwpObjectStream* pStrm) LwpMiddleLayout::LwpMiddleLayout( LwpObjectHeader const &objHdr, LwpSvStream* pStrm ) : LwpVirtualLayout(objHdr, pStrm) , m_bGettingGeometry(false) + , m_bGettingBackgroundStuff(false) { } @@ -655,21 +656,28 @@ rtl::Reference<LwpObject> LwpMiddleLayout::GetBasedOnStyle() * @descr: Get the geometry of current layout * */ -LwpLayoutGeometry* LwpMiddleLayout::Geometry() +LwpLayoutGeometry* LwpMiddleLayout::GetGeometry() { + if (m_bGettingGeometry) + throw std::runtime_error("recursion in layout"); + m_bGettingGeometry = true; + + LwpLayoutGeometry* pRet = nullptr; if( !m_LayGeometry.IsNull() ) { - return dynamic_cast<LwpLayoutGeometry*> (m_LayGeometry.obj().get()); + pRet = dynamic_cast<LwpLayoutGeometry*> (m_LayGeometry.obj().get()); } else { rtl::Reference<LwpObject> xBase(GetBasedOnStyle()); if (LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*>(xBase.get())) { - return pLay->GetGeometry(); + pRet = pLay->GetGeometry(); } } - return nullptr; + + m_bGettingGeometry = false; + return pRet; } /** @@ -818,21 +826,30 @@ LwpBorderStuff* LwpMiddleLayout::GetBorderStuff() */ LwpBackgroundStuff* LwpMiddleLayout::GetBackgroundStuff() { + if (m_bGettingBackgroundStuff) + throw std::runtime_error("recursion in layout"); + m_bGettingBackgroundStuff = true; + + LwpBackgroundStuff* pRet = nullptr; + if(m_nOverrideFlag & OVER_BACKGROUND) { LwpLayoutBackground* pLayoutBackground = dynamic_cast<LwpLayoutBackground*>(m_LayBackgroundStuff.obj().get()); - return pLayoutBackground ? &pLayoutBackground->GetBackgoudStuff() : nullptr; + pRet = pLayoutBackground ? &pLayoutBackground->GetBackgoudStuff() : nullptr; } else { rtl::Reference<LwpObject> xBase(GetBasedOnStyle()); if (LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*>(xBase.get())) { - return pLay->GetBackgroundStuff(); + pRet = pLay->GetBackgroundStuff(); } } - return nullptr; + + m_bGettingBackgroundStuff = false; + return pRet; } + /** * @descr: create xfborder. */ |