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

Miklos Vajna vmiklos at suse.cz
Mon Sep 2 01:31:41 PDT 2013


 sw/qa/extras/ooxmlimport/data/table-pagebreak.docx    |binary
 sw/qa/extras/ooxmlimport/ooxmlimport.cxx              |   11 +++++++++++
 writerfilter/source/dmapper/DomainMapper.cxx          |    6 ++++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx     |    8 +++++++-
 writerfilter/source/dmapper/DomainMapper_Impl.hxx     |    9 +++++++++
 writerfilter/source/ooxml/OOXMLFastContextHandler.cxx |   10 ++++++++++
 writerfilter/source/ooxml/model.xml                   |    1 +
 7 files changed, 44 insertions(+), 1 deletion(-)

New commits:
commit 7d3778e0ef9f54f3c8988f1b84d58e7002d6c625
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Mon Sep 2 10:27:49 2013 +0200

    bnc#816593 DOCX import: ignore page breaks in tables
    
    Change-Id: Ibb250148d41d1929fa17dd993bb71c93c0e09dcf

diff --git a/sw/qa/extras/ooxmlimport/data/table-pagebreak.docx b/sw/qa/extras/ooxmlimport/data/table-pagebreak.docx
new file mode 100755
index 0000000..06ecf95
Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/table-pagebreak.docx differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 64c0764..9927df7 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -129,6 +129,7 @@ public:
     void testBnc780044Spacing();
     void testTableAutoNested();
     void testTableStyleParprop();
+    void testTablePagebreak();
 
     CPPUNIT_TEST_SUITE(Test);
 #if !defined(MACOSX) && !defined(WNT)
@@ -224,6 +225,7 @@ void Test::run()
         {"bnc780044_spacing.docx", &Test::testBnc780044Spacing},
         {"table-auto-nested.docx", &Test::testTableAutoNested},
         {"table-style-parprop.docx", &Test::testTableStyleParprop},
+        {"table-pagebreak.docx", &Test::testTablePagebreak},
     };
     header();
     for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
@@ -1519,6 +1521,15 @@ void Test::testTableStyleParprop()
     CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(getParagraphOfText(1, xCell->getText()), "ParaBottomMargin"));
 }
 
+void Test::testTablePagebreak()
+{
+    // Page break inside table: should be ignored (was style::BreakType_PAGE_BEFORE before).
+    CPPUNIT_ASSERT_EQUAL(style::BreakType_NONE, getProperty<style::BreakType>(getParagraphOrTable(2), "BreakType"));
+
+    // This one is outside the table: should not be ignored.
+    CPPUNIT_ASSERT_EQUAL(style::BreakType_PAGE_BEFORE, getProperty<style::BreakType>(getParagraph(3), "BreakType"));
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index e592d89..261d99c 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3403,6 +3403,12 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType
         }
     }
     break;
+    case NS_ooxml::LN_tblStart:
+        m_pImpl->m_nTableDepth++;
+    break;
+    case NS_ooxml::LN_tblEnd:
+        m_pImpl->m_nTableDepth--;
+    break;
     default:
         {
 #ifdef DEBUG_DOMAINMAPPER
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 7725b86..8a4b252 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -174,7 +174,8 @@ DomainMapper_Impl::DomainMapper_Impl(
         m_xInsertTextRange(xInsertTextRange),
         m_bIsNewDoc(bIsNewDoc),
         m_bInTableStyleRunProps(false),
-        m_pSdtHelper(0)
+        m_pSdtHelper(0),
+        m_nTableDepth(0)
 
 {
     appendTableManager( );
@@ -616,6 +617,11 @@ void DomainMapper_Impl::deferBreak( BreakType deferredBreakType)
             m_bIsColumnBreakDeferred = true;
         break;
     case PAGE_BREAK:
+            // See SwWW8ImplReader::HandlePageBreakChar(), page break should be
+            // ignored inside tables.
+            if (m_nTableDepth > 0)
+                return;
+
             m_bIsPageBreakDeferred = true;
         break;
     default:
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index e342ebe..9b1ebe1 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -692,6 +692,15 @@ public:
 
     /// Document background color, applied to every page style.
     boost::optional<sal_Int32> m_oBackgroundColor;
+
+    /**
+     * This contains the raw table depth. m_nTableDepth > 0 is the same as
+     * getTableManager().isInTable(), unless we're in the first paragraph of a
+     * table, or first paragraph after a table, as the table manager is only
+     * updated once we ended the paragraph (and know if the para has the
+     * PFInTable SPRM or not).
+     */
+    sal_Int32 m_nTableDepth;
 };
 } //namespace dmapper
 } //namespace writerfilter
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index 7b73ba0..8845623 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -1957,6 +1957,16 @@ void OOXMLFastContextHandlerTextTable::lcl_endFastElement
 {
     endAction(Element);
 
+    boost::shared_ptr<OOXMLPropertySet> pProps( new OOXMLPropertySetImpl );
+    {
+        OOXMLValue::Pointer_t pVal
+            (new OOXMLIntegerValue(mnTableDepth));
+        OOXMLProperty::Pointer_t pProp
+            (new OOXMLPropertyImpl(NS_ooxml::LN_tblEnd, pVal, OOXMLPropertyImpl::SPRM));
+        pProps->add(pProp);
+    }
+    mpParserState->setCharacterProperties(pProps);
+
     mnTableDepth--;
     mpParserState->endTable();
 }
diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml
index ea8f082..63c182c 100644
--- a/writerfilter/source/ooxml/model.xml
+++ b/writerfilter/source/ooxml/model.xml
@@ -39,6 +39,7 @@
   <token tokenid="ooxml:trackchange"/>
   <token tokenid="ooxml:object"/>
   <token tokenid="ooxml:tblStart"/>
+  <token tokenid="ooxml:tblEnd"/>
   <token tokenid="ooxml:ffdata"/>
   <token tokenid="ooxml:starmath"/>
   <namespace name="dml-stylesheet" url="http://schemas.openxmlformats.org/drawingml/2006/main" file="dml-stylesheet.rng">


More information about the Libreoffice-commits mailing list