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

László Németh (via logerrit) logerrit at kemper.freedesktop.org
Wed Feb 12 11:54:01 UTC 2020


 writerfilter/source/dmapper/DomainMapperTableHandler.cxx |   38 +++++++++++++++
 writerfilter/source/dmapper/DomainMapperTableHandler.hxx |    2 
 writerfilter/source/dmapper/DomainMapper_Impl.cxx        |    8 +++
 writerfilter/source/dmapper/DomainMapper_Impl.hxx        |   10 +++
 4 files changed, 58 insertions(+)

New commits:
commit c90b6a208d867a00252ad58d8eeab2fd12516157
Author:     László Németh <nemeth at numbertext.org>
AuthorDate: Tue Feb 4 12:54:34 2020 +0100
Commit:     László Németh <nemeth at numbertext.org>
CommitDate: Wed Feb 12 12:53:24 2020 +0100

    Revert "revert obsolete writerfilter hacks for tdf#119054 and tdf#128752"
    
    This reverts commit 749fd6508504cf3b2e3822eca52a67fa36d75fb8.
    
    Change-Id: Iad4cd836e2908e2c21e70013f88af213b3a1822d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88142
    Tested-by: Jenkins
    Reviewed-by: László Németh <nemeth at numbertext.org>

diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
index 6a546f60e6a0..e753852985a7 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
@@ -863,6 +863,9 @@ CellPropertyValuesSeq_t DomainMapperTableHandler::endTableGetCellProperties(Tabl
                 // Remove properties from style/row that aren't allowed in cells
                 pAllCellProps->Erase( PROP_HEADER_ROW_COUNT );
                 pAllCellProps->Erase( PROP_TBL_HEADER );
+                // Remove paragraph properties from style/row that paragraph style can overwrite
+                pAllCellProps->Erase( PROP_PARA_BOTTOM_MARGIN );
+                pAllCellProps->Erase( PROP_PARA_LINE_SPACING );
 
                 // Then add the cell properties
                 pAllCellProps->InsertProps(*aCellIterator);
@@ -1061,6 +1064,36 @@ css::uno::Sequence<css::beans::PropertyValues> DomainMapperTableHandler::endTabl
     return aRowProperties;
 }
 
+// table style has got bigger precedence than docDefault style,
+// but lower precedence than the paragraph styles and direct paragraph formatting
+void DomainMapperTableHandler::ApplyParaProperty(css::beans::PropertyValues aTableProperties, PropertyIds eId)
+{
+    OUString sPropertyName = getPropertyName(eId);
+    auto pTableProp = std::find_if(aTableProperties.begin(), aTableProperties.end(),
+        [&](const beans::PropertyValue& rProp) { return rProp.Name == sPropertyName; });
+    if (pTableProp != aTableProperties.end())
+    {
+        uno::Any aValue = pTableProp->Value;
+        for (const auto& rParaProp : m_rDMapper_Impl.m_aParagraphsToEndTable)
+        {
+            // there is no direct paragraph formatting
+            if (!rParaProp.m_pPropertyMap->isSet(eId))
+            {
+                OUString sParaStyleName;
+                rParaProp.m_rPropertySet->getPropertyValue("ParaStyleName") >>= sParaStyleName;
+                StyleSheetEntryPtr pEntry = m_rDMapper_Impl.GetStyleSheetTable()->FindStyleSheetByConvertedStyleName(sParaStyleName);
+                uno::Any aMargin = m_rDMapper_Impl.GetPropertyFromStyleSheet(eId, pEntry, true, true);
+                uno::Any aMarginDocDefault = m_rDMapper_Impl.GetPropertyFromStyleSheet(eId, nullptr, true, true);
+                // use table style only when 1) both values are empty (no docDefault and paragraph style definitions) or
+                // 2) both non-empty values are equal (docDefault paragraph properties are copied to the base paragraph style during import)
+                // TODO check the case, when two parent styles modify the docDefault and the last one set back the docDefault value
+                if (aMargin == aMarginDocDefault)
+                    rParaProp.m_rPropertySet->setPropertyValue(sPropertyName, aValue);
+            }
+        }
+    }
+}
+
 void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTableStartsAtCellStart)
 {
 #ifdef DBG_UTIL
@@ -1158,6 +1191,10 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab
                         }
                     }
                 }
+
+                // OOXML table style may container paragraph properties, apply these now.
+                ApplyParaProperty(aTableInfo.aTableProperties, PROP_PARA_BOTTOM_MARGIN);
+                ApplyParaProperty(aTableInfo.aTableProperties, PROP_PARA_LINE_SPACING);
             }
         }
         catch ( const lang::IllegalArgumentException & )
@@ -1235,6 +1272,7 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab
     m_aCellProperties.clear();
     m_aRowProperties.clear();
     m_bHadFootOrEndnote = false;
+    m_rDMapper_Impl.m_aParagraphsToEndTable.clear();
 
 #ifdef DBG_UTIL
     TagLogger::getInstance().endElement();
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx
index 41b6339506f9..16d2a0cc37cc 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx
@@ -91,6 +91,8 @@ public:
      */
     void startTable(const TablePropertyMapPtr& pProps);
 
+    void ApplyParaProperty(css::beans::PropertyValues aTableProperties, PropertyIds eId);
+
     /// Handle end of table.
     void endTable(unsigned int nestedTableLevel, bool bTableStartsAtCellStart);
     /**
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index ebe2aa875709..2f3e79ec852e 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1738,6 +1738,14 @@ void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap, con
 
                 css::uno::Reference<css::beans::XPropertySet> xParaProps(xTextRange, uno::UNO_QUERY);
 
+                // table style has got bigger precedence than docDefault style
+                // collect these pending paragraph properties to process in endTable()
+                if (xParaProps && m_nTableDepth > 0)
+                {
+                    TableParagraph aPending{pParaContext, xParaProps};
+                    m_aParagraphsToEndTable.push_back(aPending);
+                }
+
                 // tdf#118521 set paragraph top or bottom margin based on the paragraph style
                 // if we already set the other margin with direct formatting
                 if (xParaProps)
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 2a512eb44f8e..bc688a463cd7 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -430,6 +430,13 @@ struct SymbolData
     { }
 };
 
+/// Information about a paragraph to be finished after a table end.
+struct TableParagraph
+{
+    PropertyMapPtr m_pPropertyMap;
+    css::uno::Reference<css::beans::XPropertySet> m_rPropertySet;
+};
+
 class DomainMapper;
 class DomainMapper_Impl final
 {
@@ -1064,6 +1071,9 @@ public:
     bool m_bIsActualParagraphFramed;
     std::vector<css::uno::Any> aFramedRedlines;
 
+    /// Table paragraph properties may need style update based on table style
+    std::vector<TableParagraph> m_aParagraphsToEndTable;
+
 private:
     void PushPageHeaderFooter(bool bHeader, SectionPropertyMap::PageType eType);
     // Start a new index section; if needed, finish current paragraph


More information about the Libreoffice-commits mailing list