[Libreoffice-commits] core.git: sw/qa sw/source writerfilter/source

Miklos Vajna vmiklos at collabora.co.uk
Thu Oct 31 18:18:08 CET 2013


 sw/qa/extras/ooxmlexport/data/calendar2.docx           |binary
 sw/qa/extras/ooxmlexport/ooxmlexport.cxx               |   14 +++
 sw/source/filter/ww8/docxtablestyleexport.cxx          |   39 +++++++---
 writerfilter/source/dmapper/BorderHandler.cxx          |   66 ++++++++++++++++-
 writerfilter/source/dmapper/BorderHandler.hxx          |    6 +
 writerfilter/source/dmapper/DomainMapper.cxx           |   12 ++-
 writerfilter/source/dmapper/TDefTableHandler.cxx       |    9 +-
 writerfilter/source/dmapper/TDefTableHandler.hxx       |    2 
 writerfilter/source/dmapper/TablePropertiesHandler.cxx |    4 +
 9 files changed, 134 insertions(+), 18 deletions(-)

New commits:
commit f91775c00dfd50e89cfcbc280d90309a5d08d727
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Oct 31 17:05:57 2013 +0100

    writerfilter: implement BorderHandler::getInteropGrabBag()
    
    Change-Id: I86922585122898692dc4fb1fbbee11e1864dad29

diff --git a/sw/qa/extras/ooxmlexport/data/calendar2.docx b/sw/qa/extras/ooxmlexport/data/calendar2.docx
new file mode 100644
index 0000000..e89222f
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/calendar2.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
index f63dd4a..86e50ad 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
@@ -1323,6 +1323,20 @@ DECLARE_OOXML_TEST(testCalendar1, "calendar1.docx")
     assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:tblStylePr[@w:type='band2Horz']/w:tcPr/w:tcBorders/w:top", "themeColor", "text1");
 }
 
+DECLARE_OOXML_TEST(testCalendar2, "calendar2.docx")
+{
+    // This paragraph property was missing in table style.
+    xmlDocPtr pXmlStyles = parseExport("word/styles.xml");
+    assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:pPr/w:jc", "val", "center");
+
+    // These run properties were missing
+    assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:rPr/w:lang", "val", "en-US");
+    assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:rPr/w:lang", "bidi", "ar-SA");
+
+    // Table borders were also missing
+    assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:tblPr/w:tblBorders/w:insideV", "themeTint", "99");
+}
+
 DECLARE_OOXML_TEST(testSmartart, "smartart.docx")
 {
     uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
diff --git a/sw/source/filter/ww8/docxtablestyleexport.cxx b/sw/source/filter/ww8/docxtablestyleexport.cxx
index 940301f..cc92461 100644
--- a/sw/source/filter/ww8/docxtablestyleexport.cxx
+++ b/sw/source/filter/ww8/docxtablestyleexport.cxx
@@ -97,6 +97,7 @@ static DocxStringTokenMap const aTcBorderTokens[] = {
     {"color", XML_color},
     {"space", XML_space},
     {"themeColor", XML_themeColor},
+    {"themeTint", XML_themeTint},
     {0, 0}
 };
 
@@ -129,17 +130,17 @@ DocxStringTokenMap const aTcBordersTokens[] = {
     {0, 0}
 };
 
-/// Export of w:tcBorders in a table style.
-void lcl_TableStyleTcBorders(sax_fastparser::FSHelperPtr pSerializer, uno::Sequence<beans::PropertyValue>& rTcBorders)
+/// Export of w:tcBorders (and w:tblBorders) in a table style.
+void lcl_TableStyleTcBorders(sax_fastparser::FSHelperPtr pSerializer, uno::Sequence<beans::PropertyValue>& rTcBorders, sal_Int32 nToken = XML_tcBorders)
 {
     if (!rTcBorders.hasElements())
         return;
 
-    pSerializer->startElementNS(XML_w, XML_tcBorders, FSEND);
+    pSerializer->startElementNS(XML_w, nToken, FSEND);
     for (sal_Int32 i = 0; i < rTcBorders.getLength(); ++i)
-        if (sal_Int32 nToken = DocxStringGetToken(aTcBordersTokens, rTcBorders[i].Name))
-            lcl_TableStyleTcBorder(pSerializer, nToken, rTcBorders[i].Value.get< uno::Sequence<beans::PropertyValue> >());
-    pSerializer->endElementNS(XML_w, XML_tcBorders);
+        if (sal_Int32 nSubToken = DocxStringGetToken(aTcBordersTokens, rTcBorders[i].Name))
+            lcl_TableStyleTcBorder(pSerializer, nSubToken, rTcBorders[i].Value.get< uno::Sequence<beans::PropertyValue> >());
+    pSerializer->endElementNS(XML_w, nToken);
 }
 
 /// Export of w:shd in a table style.
@@ -189,6 +190,10 @@ void lcl_TableStyleRLang(sax_fastparser::FSHelperPtr pSerializer, uno::Sequence<
     {
         if (rLang[i].Name == "eastAsia")
             pAttributeList->add(FSNS(XML_w, XML_eastAsia), OUStringToOString(rLang[i].Value.get<OUString>(), RTL_TEXTENCODING_UTF8).getStr());
+        else if (rLang[i].Name == "val")
+            pAttributeList->add(FSNS(XML_w, XML_val), OUStringToOString(rLang[i].Value.get<OUString>(), RTL_TEXTENCODING_UTF8).getStr());
+        else if (rLang[i].Name == "bidi")
+            pAttributeList->add(FSNS(XML_w, XML_bidi), OUStringToOString(rLang[i].Value.get<OUString>(), RTL_TEXTENCODING_UTF8).getStr());
     }
     sax_fastparser::XFastAttributeListRef xAttributeList(pAttributeList);
     pSerializer->singleElementNS(XML_w, XML_lang, xAttributeList);
@@ -280,7 +285,7 @@ void lcl_TableStyleRPr(sax_fastparser::FSHelperPtr pSerializer, uno::Sequence<be
     pSerializer->startElementNS(XML_w, XML_rPr, FSEND);
 
     uno::Sequence<beans::PropertyValue> aRFonts, aLang, aColor;
-    OUString aB, aI, aSz;
+    OUString aB, aI, aSz, aSzCs;
     for (sal_Int32 i = 0; i < rRPr.getLength(); ++i)
     {
         if (rRPr[i].Name == "rFonts")
@@ -295,6 +300,8 @@ void lcl_TableStyleRPr(sax_fastparser::FSHelperPtr pSerializer, uno::Sequence<be
             aColor = rRPr[i].Value.get< uno::Sequence<beans::PropertyValue> >();
         else if (rRPr[i].Name == "sz")
             aSz = rRPr[i].Value.get<OUString>();
+        else if (rRPr[i].Name == "szCs")
+            aSzCs = rRPr[i].Value.get<OUString>();
     }
     lcl_TableStyleRRFonts(pSerializer, aRFonts);
     lcl_TableStyleRLang(pSerializer, aLang);
@@ -305,6 +312,10 @@ void lcl_TableStyleRPr(sax_fastparser::FSHelperPtr pSerializer, uno::Sequence<be
         pSerializer->singleElementNS(XML_w, XML_sz,
                 FSNS(XML_w, XML_val), OUStringToOString(aSz, RTL_TEXTENCODING_UTF8).getStr(),
                 FSEND);
+    if (!aSzCs.isEmpty())
+        pSerializer->singleElementNS(XML_w, XML_szCs,
+                FSNS(XML_w, XML_val), OUStringToOString(aSzCs, RTL_TEXTENCODING_UTF8).getStr(),
+                FSEND);
 
     pSerializer->endElementNS(XML_w, XML_rPr);
 }
@@ -319,16 +330,23 @@ void lcl_TableStylePPr(sax_fastparser::FSHelperPtr pSerializer, uno::Sequence<be
 
     uno::Sequence<beans::PropertyValue> aSpacing;
     bool bWordWrap = false;
+    OUString aJc;
     for (sal_Int32 i = 0; i < rPPr.getLength(); ++i)
     {
         if (rPPr[i].Name == "spacing")
             aSpacing = rPPr[i].Value.get< uno::Sequence<beans::PropertyValue> >();
-        if (rPPr[i].Name == "wordWrap")
+        else if (rPPr[i].Name == "wordWrap")
             bWordWrap = true;
+        else if (rPPr[i].Name == "jc")
+            aJc = rPPr[i].Value.get<OUString>();
     }
     if (bWordWrap)
         pSerializer->singleElementNS(XML_w, XML_wordWrap, FSEND);
     lcl_TableStylePSpacing(pSerializer, aSpacing);
+    if (!aJc.isEmpty())
+        pSerializer->singleElementNS(XML_w, XML_jc,
+                FSNS(XML_w, XML_val), OUStringToOString(aJc, RTL_TEXTENCODING_UTF8).getStr(),
+                FSEND);
 
     pSerializer->endElementNS(XML_w, XML_pPr);
 }
@@ -341,7 +359,7 @@ void lcl_TableStyleTblPr(sax_fastparser::FSHelperPtr pSerializer, uno::Sequence<
 
     pSerializer->startElementNS(XML_w, XML_tblPr, FSEND);
 
-    uno::Sequence<beans::PropertyValue> aTblInd, aTblCellMar;
+    uno::Sequence<beans::PropertyValue> aTblInd, aTblBorders, aTblCellMar;
     boost::optional<sal_Int32> oTblStyleRowBandSize, oTblStyleColBandSize;
     for (sal_Int32 i = 0; i < rTblPr.getLength(); ++i)
     {
@@ -351,6 +369,8 @@ void lcl_TableStyleTblPr(sax_fastparser::FSHelperPtr pSerializer, uno::Sequence<
             oTblStyleColBandSize = rTblPr[i].Value.get<sal_Int32>();
         else if (rTblPr[i].Name == "tblInd")
             aTblInd = rTblPr[i].Value.get< uno::Sequence<beans::PropertyValue> >();
+        else if (rTblPr[i].Name == "tblBorders")
+            aTblBorders = rTblPr[i].Value.get< uno::Sequence<beans::PropertyValue> >();
         else if (rTblPr[i].Name == "tblCellMar")
             aTblCellMar = rTblPr[i].Value.get< uno::Sequence<beans::PropertyValue> >();
     }
@@ -363,6 +383,7 @@ void lcl_TableStyleTblPr(sax_fastparser::FSHelperPtr pSerializer, uno::Sequence<
                 FSNS(XML_w, XML_val), OString::number(oTblStyleColBandSize.get()),
                 FSEND);
     lcl_TableStyleTblInd(pSerializer, aTblInd);
+    lcl_TableStyleTcBorders(pSerializer, aTblBorders, XML_tblBorders);
     lcl_TableStyleTblCellMar(pSerializer, aTblCellMar);
 
     pSerializer->endElementNS(XML_w, XML_tblPr);
diff --git a/writerfilter/source/dmapper/BorderHandler.cxx b/writerfilter/source/dmapper/BorderHandler.cxx
index a5d8560..c010c13 100644
--- a/writerfilter/source/dmapper/BorderHandler.cxx
+++ b/writerfilter/source/dmapper/BorderHandler.cxx
@@ -17,6 +17,7 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 #include <BorderHandler.hxx>
+#include <TDefTableHandler.hxx>
 #include <PropertyMap.hxx>
 #include <resourcemodel/QNameToString.hxx>
 #include <doctok/resourceids.hxx>
@@ -24,6 +25,7 @@
 #include <com/sun/star/table/BorderLine2.hpp>
 #include <ooxml/resourceids.hxx>
 #include <dmapperLoggers.hxx>
+#include <filter/msfilter/util.hxx>
 
 namespace writerfilter {
 
@@ -72,16 +74,20 @@ void BorderHandler::lcl_attribute(Id rName, Value & rVal)
         case NS_rtf::LN_DPTLINEWIDTH: // 0x2871
             //  width of a single line in 1/8 pt, max of 32 pt -> twip * 5 / 2.
             m_nLineWidth = nIntValue * 5 / 2;
+            appendGrabBag("sz", OUString::number(nIntValue));
         break;
         case NS_rtf::LN_BRCTYPE:    // 0x2872
             m_nLineType = nIntValue;
+            appendGrabBag("val", TDefTableHandler::getBorderTypeString(nIntValue));
         break;
         case NS_ooxml::LN_CT_Border_color:
         case NS_rtf::LN_ICO:        // 0x2873
             m_nLineColor = nIntValue;
+            appendGrabBag("color", OStringToOUString(msfilter::util::ConvertColor(nIntValue), RTL_TEXTENCODING_UTF8));
         break;
         case NS_rtf::LN_DPTSPACE:   // border distance in points
             m_nLineDistance = ConversionHelper::convertTwipToMM100( nIntValue * 20 );
+            appendGrabBag("space", OUString::number(nIntValue));
         break;
         case NS_rtf::LN_FSHADOW:    // 0x2875
             m_bShadow = nIntValue;
@@ -90,8 +96,12 @@ void BorderHandler::lcl_attribute(Id rName, Value & rVal)
         case NS_rtf::LN_UNUSED2_15: // 0x2877
             // ignored
         break;
-        case NS_ooxml::LN_CT_Border_themeTint: break;
-        case NS_ooxml::LN_CT_Border_themeColor: break;
+        case NS_ooxml::LN_CT_Border_themeTint:
+            appendGrabBag("themeTint", OUString::number(nIntValue, 16));
+            break;
+        case NS_ooxml::LN_CT_Border_themeColor:
+            appendGrabBag("themeColor", TDefTableHandler::getThemeColorTypeString(nIntValue));
+            break;
         default:
             OSL_FAIL( "unknown attribute");
     }
@@ -101,31 +111,40 @@ void BorderHandler::lcl_sprm(Sprm & rSprm)
 {
     BorderPosition pos = BORDER_COUNT; // invalid pos
     bool rtl = false; // TODO detect
+    OUString aBorderPos;
     switch( rSprm.getId())
     {
         case NS_ooxml::LN_CT_TblBorders_top:
             pos = BORDER_TOP;
+            aBorderPos = "top";
             break;
         case NS_ooxml::LN_CT_TblBorders_start:
             pos = rtl ? BORDER_RIGHT : BORDER_LEFT;
+            aBorderPos = "start";
             break;
         case NS_ooxml::LN_CT_TblBorders_left:
             pos = BORDER_LEFT;
+            aBorderPos = "left";
             break;
         case NS_ooxml::LN_CT_TblBorders_bottom:
             pos = BORDER_BOTTOM;
+            aBorderPos = "bottom";
             break;
         case NS_ooxml::LN_CT_TblBorders_end:
             pos = rtl ? BORDER_LEFT : BORDER_RIGHT;
+            aBorderPos = "end";
             break;
         case NS_ooxml::LN_CT_TblBorders_right:
             pos = BORDER_RIGHT;
+            aBorderPos = "right";
             break;
         case NS_ooxml::LN_CT_TblBorders_insideH:
             pos = BORDER_HORIZONTAL;
+            aBorderPos = "insideH";
             break;
         case NS_ooxml::LN_CT_TblBorders_insideV:
             pos = BORDER_VERTICAL;
+            aBorderPos = "insideV";
             break;
         default:
             break;
@@ -134,7 +153,20 @@ void BorderHandler::lcl_sprm(Sprm & rSprm)
     {
         writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
         if( pProperties.get())
+        {
+            std::vector<beans::PropertyValue> aSavedGrabBag;
+            if (!m_aInteropGrabBagName.isEmpty())
+            {
+                aSavedGrabBag = m_aInteropGrabBag;
+                m_aInteropGrabBag.clear();
+            }
             pProperties->resolve(*this);
+            if (!m_aInteropGrabBagName.isEmpty())
+            {
+                aSavedGrabBag.push_back(getInteropGrabBag(aBorderPos));
+                m_aInteropGrabBag = aSavedGrabBag;
+            }
+        }
         ConversionHelper::MakeBorderLine( m_nLineWidth,   m_nLineType, m_nLineColor,
                                m_aBorderLines[ pos ], m_bOOXML );
         m_aFilledLines[ pos ] = true;
@@ -180,6 +212,36 @@ bool BorderHandler::getShadow()
     return m_bShadow;
 }
 
+void BorderHandler::enableInteropGrabBag(OUString aName)
+{
+    m_aInteropGrabBagName = aName;
+}
+
+beans::PropertyValue BorderHandler::getInteropGrabBag(OUString aName)
+{
+    beans::PropertyValue aRet;
+    if (aName.isEmpty())
+        aRet.Name = m_aInteropGrabBagName;
+    else
+        aRet.Name = aName;
+
+    uno::Sequence<beans::PropertyValue> aSeq(m_aInteropGrabBag.size());
+    beans::PropertyValue* pSeq = aSeq.getArray();
+    for (std::vector<beans::PropertyValue>::iterator i = m_aInteropGrabBag.begin(); i != m_aInteropGrabBag.end(); ++i)
+        *pSeq++ = *i;
+
+    aRet.Value = uno::makeAny(aSeq);
+    return aRet;
+}
+
+void BorderHandler::appendGrabBag(OUString aKey, OUString aValue)
+{
+    beans::PropertyValue aProperty;
+    aProperty.Name = aKey;
+    aProperty.Value = uno::makeAny(aValue);
+    m_aInteropGrabBag.push_back(aProperty);
+}
+
 } //namespace dmapper
 } //namespace writerfilter
 
diff --git a/writerfilter/source/dmapper/BorderHandler.hxx b/writerfilter/source/dmapper/BorderHandler.hxx
index 3d43c4a..692d7ca 100644
--- a/writerfilter/source/dmapper/BorderHandler.hxx
+++ b/writerfilter/source/dmapper/BorderHandler.hxx
@@ -23,6 +23,7 @@
 #include <resourcemodel/LoggedResources.hxx>
 #include <boost/shared_ptr.hpp>
 #include <com/sun/star/table/BorderLine2.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
 
 namespace writerfilter {
 namespace dmapper
@@ -55,6 +56,9 @@ private:
 
     bool                                        m_aFilledLines[BORDER_COUNT];
     ::com::sun::star::table::BorderLine2        m_aBorderLines[BORDER_COUNT];
+    OUString m_aInteropGrabBagName;
+    std::vector<beans::PropertyValue> m_aInteropGrabBag;
+    void appendGrabBag(OUString aKey, OUString aValue);
 
     // Properties
     virtual void lcl_attribute(Id Name, Value & val);
@@ -68,6 +72,8 @@ public:
     ::com::sun::star::table::BorderLine2        getBorderLine();
     sal_Int32                                   getLineDistance() const { return m_nLineDistance;}
     bool                                        getShadow();
+    void enableInteropGrabBag(OUString aName);
+    beans::PropertyValue getInteropGrabBag(OUString aName = OUString());
 };
 typedef boost::shared_ptr< BorderHandler >          BorderHandlerPtr;
 }}
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index a0c4bef..0d48d99 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -1168,6 +1168,10 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
         {
             if (nName == NS_ooxml::LN_CT_Language_eastAsia)
                 m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "eastAsia", sStringValue);
+            else if (nName == NS_ooxml::LN_CT_Language_val)
+                m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "val", sStringValue);
+            else if (nName == NS_ooxml::LN_CT_Language_bidi)
+                m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "bidi", sStringValue);
             lang::Locale aLocale( LanguageTag::convertToLocale( sStringValue));
             if (m_pImpl->GetTopContext())
                 m_pImpl->GetTopContext()->Insert(NS_ooxml::LN_CT_Language_val== nName ? PROP_CHAR_LOCALE :
@@ -2251,8 +2255,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType
             // Make sure char sizes defined in the stylesheets don't affect char props from direct formatting.
             if (!m_pImpl->IsStyleSheetImport())
                 m_pImpl->deferCharacterProperty( nSprmId, uno::makeAny( nIntValue ));
-            if (nSprmId == NS_sprm::LN_CHps)
-                m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "sz", OUString::number(nIntValue));
+            m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, (nSprmId == NS_sprm::LN_CHps ? OUString("sz") : OUString("szCs")), OUString::number(nIntValue));
         }
         break;
     case NS_sprm::LN_CHpsInc:
@@ -4056,19 +4059,23 @@ void DomainMapper::handleParaJustification(const sal_Int32 nIntValue, const ::bo
 {
     sal_Int16 nAdjust = 0;
     sal_Int16 nLastLineAdjust = 0;
+    OUString aStringValue = "left";
     switch(nIntValue)
     {
     case 1:
         nAdjust = style::ParagraphAdjust_CENTER;
+        aStringValue = "center";
         break;
     case 2:
         nAdjust = static_cast< sal_Int16 > (bExchangeLeftRight ? style::ParagraphAdjust_LEFT : style::ParagraphAdjust_RIGHT);
+        aStringValue = "right";
         break;
     case 4:
         nLastLineAdjust = style::ParagraphAdjust_BLOCK;
         //no break;
     case 3:
         nAdjust = style::ParagraphAdjust_BLOCK;
+        aStringValue = "both";
         break;
     case 0:
     default:
@@ -4077,6 +4084,7 @@ void DomainMapper::handleParaJustification(const sal_Int32 nIntValue, const ::bo
     }
     pContext->Insert( PROP_PARA_ADJUST, uno::makeAny( nAdjust ) );
     pContext->Insert( PROP_PARA_LAST_LINE_ADJUST, uno::makeAny( nLastLineAdjust ) );
+    m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "jc", aStringValue);
 }
 
 bool DomainMapper::getColorFromIndex(const sal_Int32 nIndex, sal_Int32 &nColor)
diff --git a/writerfilter/source/dmapper/TDefTableHandler.cxx b/writerfilter/source/dmapper/TDefTableHandler.cxx
index f242f28..737ddef 100644
--- a/writerfilter/source/dmapper/TDefTableHandler.cxx
+++ b/writerfilter/source/dmapper/TDefTableHandler.cxx
@@ -50,7 +50,7 @@ TDefTableHandler::~TDefTableHandler()
 {
 }
 
-OUString lcl_getBorderTypeString(sal_Int32 nType)
+OUString TDefTableHandler::getBorderTypeString(sal_Int32 nType)
 {
     switch (nType)
     {
@@ -250,7 +250,7 @@ OUString lcl_getBorderTypeString(sal_Int32 nType)
     return OUString();
 }
 
-OUString lcl_getThemeColorTypeString(sal_Int32 nType)
+OUString TDefTableHandler::getThemeColorTypeString(sal_Int32 nType)
 {
     switch (nType)
     {
@@ -332,7 +332,7 @@ void TDefTableHandler::lcl_attribute(Id rName, Value & rVal)
         break;
         case NS_rtf::LN_BRCTYPE:    // 0x2872
             m_nLineType = nIntValue;
-            appendGrabBag("val", lcl_getBorderTypeString(nIntValue));
+            appendGrabBag("val", TDefTableHandler::getBorderTypeString(nIntValue));
         break;
         case NS_ooxml::LN_CT_Border_color:
         case NS_rtf::LN_ICO:        // 0x2873
@@ -350,7 +350,7 @@ void TDefTableHandler::lcl_attribute(Id rName, Value & rVal)
             // ignored
         break;
         case NS_ooxml::LN_CT_Border_themeColor:
-            appendGrabBag("themeColor", lcl_getThemeColorTypeString(nIntValue));
+            appendGrabBag("themeColor", TDefTableHandler::getThemeColorTypeString(nIntValue));
         break;
         case NS_ooxml::LN_CT_Border_themeTint:
         case NS_ooxml::LN_CT_Border_themeShade:
@@ -373,7 +373,6 @@ void TDefTableHandler::localResolve(Id rName, writerfilter::Reference<Properties
             aSavedGrabBag = m_aInteropGrabBag;
             m_aInteropGrabBag.clear();
         }
-        m_aInteropGrabBag.clear();
         pProperties->resolve( *this );
         table::BorderLine2 aBorderLine;
         ConversionHelper::MakeBorderLine( m_nLineWidth,   m_nLineType, m_nLineColor,
diff --git a/writerfilter/source/dmapper/TDefTableHandler.hxx b/writerfilter/source/dmapper/TDefTableHandler.hxx
index 993baf7..11be966 100644
--- a/writerfilter/source/dmapper/TDefTableHandler.hxx
+++ b/writerfilter/source/dmapper/TDefTableHandler.hxx
@@ -82,6 +82,8 @@ public:
     sal_Int32                                   getTableWidth() const;
     void enableInteropGrabBag(OUString aName);
     beans::PropertyValue getInteropGrabBag(OUString aName = OUString());
+    static OUString getBorderTypeString(sal_Int32 nType);
+    static OUString getThemeColorTypeString(sal_Int32 nType);
 };
 typedef boost::shared_ptr< TDefTableHandler >          TDefTableHandlerPtr;
 }}
diff --git a/writerfilter/source/dmapper/TablePropertiesHandler.cxx b/writerfilter/source/dmapper/TablePropertiesHandler.cxx
index fe64c47..824cd0b 100644
--- a/writerfilter/source/dmapper/TablePropertiesHandler.cxx
+++ b/writerfilter/source/dmapper/TablePropertiesHandler.cxx
@@ -169,7 +169,11 @@ namespace dmapper {
                 if( pProperties.get())
                 {
                     BorderHandlerPtr pBorderHandler( new BorderHandler(m_bOOXML) );
+                    if (m_pCurrentInteropGrabBag)
+                        pBorderHandler->enableInteropGrabBag("tblBorders");
                     pProperties->resolve(*pBorderHandler);
+                    if (m_pCurrentInteropGrabBag)
+                        m_pCurrentInteropGrabBag->push_back(pBorderHandler->getInteropGrabBag());
                     TablePropertyMapPtr pTablePropMap( new TablePropertyMap );
                     pTablePropMap->InsertProps(pBorderHandler->getProperties());
 


More information about the Libreoffice-commits mailing list