diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2013-12-23 14:16:01 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2013-12-23 14:22:32 +0100 |
commit | 9e118293188607ac883ed65754aaccc9ef2c6abb (patch) | |
tree | 37d3a9708da2d49f75a867d1152dc2860eda804e /sw | |
parent | 190e66534868e6ed553150282d95381f5dd5f51a (diff) |
sw: drawingml export of textframe gradients
CppunitTest_sw_ooxmlexport's testTextframeGradient is a reproducer for
this problem.
Change-Id: I8a0a1e8728cd82d96bdc7167e57cae72932429c5
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/unocoll.hxx | 2 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 34 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.hxx | 2 |
3 files changed, 35 insertions, 3 deletions
diff --git a/sw/inc/unocoll.hxx b/sw/inc/unocoll.hxx index b3e77dc00872..29a95bd8c1a6 100644 --- a/sw/inc/unocoll.hxx +++ b/sw/inc/unocoll.hxx @@ -308,7 +308,7 @@ cppu::WeakImplHelper4 ::com::sun::star::lang::XServiceInfo > SwXFramesBaseClass; -class SwXFrames : public SwXFramesBaseClass, +class SW_DLLPUBLIC SwXFrames : public SwXFramesBaseClass, public SwUnoCollection { const FlyCntType eType; diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 29a6cd45b84d..99bba6d0df30 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -31,6 +31,8 @@ #include "fmtruby.hxx" #include "breakit.hxx" #include "redline.hxx" +#include "unocoll.hxx" +#include "unoframe.hxx" #include <comphelper/string.hxx> #include <oox/token/tokens.hxx> @@ -5800,12 +5802,15 @@ void DocxAttributeOutput::FormatBackground( const SvxBrushItem& rBrush ) void DocxAttributeOutput::FormatFillStyle( const XFillStyleItem& rFillStyle ) { - m_oFillStyle.reset(rFillStyle.GetValue()); + if (!m_bIgnoreNextFill) + m_oFillStyle.reset(rFillStyle.GetValue()); + else + m_bIgnoreNextFill = false; } void DocxAttributeOutput::FormatFillGradient( const XFillGradientItem& rFillGradient ) { - if (*m_oFillStyle == XFILL_GRADIENT) + if (m_oFillStyle && *m_oFillStyle == XFILL_GRADIENT && !m_bDMLTextFrameSyntax) { if ( !m_pFlyFillAttrList ) m_pFlyFillAttrList = m_pSerializer->createAttrList(); @@ -5849,11 +5854,35 @@ void DocxAttributeOutput::FormatFillGradient( const XFillGradientItem& rFillGrad m_pFlyAttrList->add(XML_fillcolor , "#" + sColor1); m_pFlyFillAttrList->add(XML_color2, "#" + sColor2); } + else if (m_oFillStyle && *m_oFillStyle == XFILL_GRADIENT && m_bDMLTextFrameSyntax) + { + uno::Reference<beans::XPropertySet> xPropertySet = SwXFrames::GetObject(const_cast<SwFrmFmt&>(m_rExport.mpParentFrame->GetFrmFmt()), FLYCNTTYPE_FRM); + m_rDrawingML.SetFS(m_pSerializer); + m_rDrawingML.WriteGradientFill(xPropertySet); + } m_oFillStyle.reset(); } void DocxAttributeOutput::FormatBox( const SvxBoxItem& rBox ) { + if (m_bDMLTextFrameSyntax) + { + // <a:gradFill> should be before <a:ln>. + const SfxPoolItem* pItem = GetExport().HasItem(RES_FILL_STYLE); + if (pItem) + { + const XFillStyleItem* pFillStyle = static_cast<const XFillStyleItem*>(pItem); + FormatFillStyle(*pFillStyle); + } + + pItem = GetExport().HasItem(RES_FILL_GRADIENT); + if (pItem) + { + const XFillGradientItem* pFillGradient = static_cast<const XFillGradientItem*>(pItem); + FormatFillGradient(*pFillGradient); + } + m_bIgnoreNextFill = true; + } if (m_bTextFrameSyntax || m_bDMLTextFrameSyntax) { const SvxBorderLine* pLeft = rBox.GetLeft( ); @@ -6314,6 +6343,7 @@ DocxAttributeOutput::DocxAttributeOutput( DocxExport &rExport, FSHelperPtr pSeri m_nextFontId( 1 ), m_tableReference(new TableReference()), m_oldTableReference(new TableReference()), + m_bIgnoreNextFill(false), m_bBtLr(false), m_bFrameBtLr(false), m_pTableStyleExport(new DocxTableStyleExport(rExport.pDoc, pSerializer)), diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index a2a39772cfea..fb7545954bb3 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -801,6 +801,8 @@ private: std::vector<ww8::WW8TableNodeInfoInner::Pointer_t> tableFirstCells; boost::optional<XFillStyle> m_oFillStyle; + /// If FormatBox() already handled fill style / gradient. + bool m_bIgnoreNextFill; /// Is fake rotation detected, so rotation with 90 degrees should be ignored in this cell? bool m_bBtLr; |