sw/qa/extras/ooxmltok/data/n766481.docx           |binary
 sw/qa/extras/ooxmltok/ooxmltok.cxx                |   21 ++++++++++++++
 writerfilter/source/dmapper/DomainMapper.cxx      |   11 +++++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   31 ++++++++++++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.hxx |   10 +++++++
 writerfilter/source/dmapper/PropertyMap.cxx       |    1 
 6 files changed, 74 insertions(+)

New commits:
commit 0eb3a0f2fa66e67f21035c5c14a41d2d6fb4b345
Author: Miklos Vajna <vmik...@suse.cz>
Date:   Mon Jun 25 16:01:37 2012 +0200

    n#766481 testcase
    
    Change-Id: I0ebcb5c35f2e255da593c62b0a98cd4e0f44ba99

diff --git a/sw/qa/extras/ooxmltok/data/n766481.docx 
b/sw/qa/extras/ooxmltok/data/n766481.docx
new file mode 100644
index 0000000..e1521ec
Binary files /dev/null and b/sw/qa/extras/ooxmltok/data/n766481.docx differ
diff --git a/sw/qa/extras/ooxmltok/ooxmltok.cxx 
b/sw/qa/extras/ooxmltok/ooxmltok.cxx
index 4cd2aa3..1d1bbb1 100644
--- a/sw/qa/extras/ooxmltok/ooxmltok.cxx
+++ b/sw/qa/extras/ooxmltok/ooxmltok.cxx
@@ -71,6 +71,7 @@ public:
     void testN764745();
     void testN766477();
     void testN758883();
+    void testN766481();
 
     CPPUNIT_TEST_SUITE(Test);
 #if !defined(MACOSX) && !defined(WNT)
@@ -92,6 +93,7 @@ public:
     CPPUNIT_TEST(testN764745);
     CPPUNIT_TEST(testN766477);
     CPPUNIT_TEST(testN758883);
+    CPPUNIT_TEST(testN766481);
 #endif
     CPPUNIT_TEST_SUITE_END();
 
@@ -605,6 +607,25 @@ void Test::testN758883()
     CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER, 
eAnchorType);
 }
 
+void Test::testN766481()
+{
+    /*
+     * The problem was that we had an additional paragraph before the 
pagebreak.
+     *
+     * oParas = ThisComponent.Text.createEnumeration
+     * oPara = oParas.nextElement
+     * oPara = oParas.nextElement
+     * xray oParas.hasMoreElements ' should be false
+     */
+    load("n766481.docx");
+    uno::Reference<text::XTextDocument> xTextDocument(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XEnumerationAccess> 
xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY);
+    uno::Reference<container::XEnumeration> 
xParaEnum(xParaEnumAccess->createEnumeration());
+    for (int i = 0; i < 2; ++i)
+        xParaEnum->nextElement();
+    CPPUNIT_ASSERT_EQUAL(sal_False, xParaEnum->hasMoreElements());
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
commit b696600821d8aafb63b6a88016d299ef89478f56
Author: Miklos Vajna <vmik...@suse.cz>
Date:   Mon Jun 25 15:58:11 2012 +0200

    n#766481 dmapper: don't import fake paragraph containing sectpr only, take 
two
    
    Change-Id: I4623dfd05498b5ba8de73b7e301eaf486f667738

diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index f51ce3f..c11935d 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2795,6 +2795,8 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, 
PropertyMapPtr rContext, SprmType
     case NS_ooxml::LN_CT_Style_rPr:
     case NS_ooxml::LN_CT_PPr_rPr:
     case NS_ooxml::LN_CT_PPrBase_numPr:
+        if (nSprmId == NS_ooxml::LN_CT_PPr_sectPr)
+            m_pImpl->SetParaSectpr(true);
         resolveSprmProps(*this, rSprm);
     break;
     case NS_ooxml::LN_EG_SectPrContents_footnotePr:
@@ -3396,7 +3398,16 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, 
size_t len)
 
         // RTF always uses text() instead of utext() for run break
         if(len == 1 && ((*data_) == 0x0d || (*data_) == 0x07) && 
!IsRTFImport())
+        {
+            bool bSingleParagraph = m_pImpl->GetIsFirstParagraphInSection() && 
m_pImpl->GetIsLastParagraphInSection();
+            // If the paragraph contains only the section properties and it has
+            // no runs, we should not create a paragraph for it in Writer, 
unless that would remove the whole section.
+            bool bRemove = !m_pImpl->GetParaChanged() && 
m_pImpl->GetParaSectpr() && !bSingleParagraph;
+            m_pImpl->SetParaSectpr(false);
             
m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH));
+            if (bRemove)
+                m_pImpl->RemoveLastParagraph();
+        }
         else
         {
 
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 8e6d2c6..776aaba 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -206,7 +206,9 @@ DomainMapper_Impl::DomainMapper_Impl(
         m_bIsCustomFtnMark( false ),
         m_bIsParaChange( false ),
         m_bParaChanged( false ),
+        m_bIsFirstParaInSection( true ),
         m_bIsLastParaInSection( false ),
+        m_bParaSectpr( false ),
         m_bUsingEnhancedFields( false )
 {
     appendTableManager( );
@@ -307,7 +309,35 @@ void DomainMapper_Impl::SetIsLastParagraphInSection( bool 
bIsLast )
     m_bIsLastParaInSection = bIsLast;
 }
 
+bool DomainMapper_Impl::GetIsLastParagraphInSection()
+{
+    return m_bIsLastParaInSection;
+}
+
+void DomainMapper_Impl::SetIsFirstParagraphInSection( bool bIsFirst )
+{
+    m_bIsFirstParaInSection = bIsFirst;
+}
+
+bool DomainMapper_Impl::GetIsFirstParagraphInSection()
+{
+    return m_bIsFirstParaInSection;
+}
 
+void DomainMapper_Impl::SetParaSectpr(bool bParaSectpr)
+{
+    m_bParaSectpr = bParaSectpr;
+}
+
+bool DomainMapper_Impl::GetParaSectpr()
+{
+    return m_bParaSectpr;
+}
+
+bool DomainMapper_Impl::GetParaChanged()
+{
+    return m_bParaChanged;
+}
 
 void    DomainMapper_Impl::PushProperties(ContextType eId)
 {
@@ -1030,6 +1060,7 @@ void DomainMapper_Impl::finishParagraph( PropertyMapPtr 
pPropertyMap )
                 uno::Reference< text::XTextRange > xParaEnd( xCur, 
uno::UNO_QUERY );
                 CheckParaRedline( xParaEnd );
 
+                m_bIsFirstParaInSection = false;
                 m_bIsLastParaInSection = false;
                 m_bParaChanged = false;
 
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 77a2b62..0cfee56 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -349,8 +349,12 @@ private:
     RedlineParamsPtr                m_pParaRedline;
     bool                            m_bIsParaChange;
 
+    /// If the current paragraph has any runs.
     bool                            m_bParaChanged;
+    bool                            m_bIsFirstParaInSection;
     bool                            m_bIsLastParaInSection;
+    /// If the current paragraph contains section property definitions.
+    bool                            m_bParaSectpr;
     bool                            m_bUsingEnhancedFields;
 
     //annotation import
@@ -406,6 +410,12 @@ public:
 
     void RemoveLastParagraph( );
     void SetIsLastParagraphInSection( bool bIsLast );
+    bool GetIsLastParagraphInSection();
+    void SetIsFirstParagraphInSection( bool bIsFirst );
+    bool GetIsFirstParagraphInSection();
+    void SetParaSectpr(bool bParaSectpr);
+    bool GetParaSectpr();
+    bool GetParaChanged();
 
     void deferBreak( BreakType deferredBreakType );
     bool isBreakDeferred( BreakType deferredBreakType );
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx 
b/writerfilter/source/dmapper/PropertyMap.cxx
index 913eaac..2d3d4cb 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -1025,6 +1025,7 @@ void SectionPropertyMap::CloseSectionGroup( 
DomainMapper_Impl& rDM_Impl )
             OSL_FAIL( "Exception in SectionPropertyMap::CloseSectionGroup");
         }
     }
+    rDM_Impl.SetIsFirstParagraphInSection(true);
 }
 
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to