[Libreoffice-commits] core.git: Branch 'libreoffice-4-3' - sw/qa writerfilter/inc writerfilter/source

Miklos Vajna vmiklos at collabora.co.uk
Mon Nov 17 01:32:32 PST 2014


 sw/qa/extras/ooxmlimport/data/unbalanced-columns.docx |binary
 sw/qa/extras/ooxmlimport/ooxmlimport.cxx              |    8 ++++++++
 sw/qa/extras/rtfimport/data/unbalanced-columns.rtf    |    5 +++++
 sw/qa/extras/rtfimport/rtfimport.cxx                  |    8 ++++++++
 writerfilter/inc/dmapper/DomainMapper.hxx             |    1 +
 writerfilter/inc/resourcemodel/WW8ResourceModel.hxx   |    3 +++
 writerfilter/source/dmapper/DomainMapper.cxx          |    5 +++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx     |    6 ++++++
 writerfilter/source/dmapper/DomainMapper_Impl.hxx     |    3 +++
 writerfilter/source/dmapper/PropertyMap.cxx           |    9 ++++++---
 writerfilter/source/dmapper/PropertyMap.hxx           |    2 +-
 writerfilter/source/ooxml/OOXMLFastContextHandler.cxx |    5 +++++
 writerfilter/source/ooxml/OOXMLFastContextHandler.hxx |    1 +
 writerfilter/source/ooxml/model.xml                   |    1 +
 writerfilter/source/rtftok/rtfdocumentimpl.cxx        |    6 ++++++
 15 files changed, 59 insertions(+), 4 deletions(-)

New commits:
commit 084d5986823e7bd7baaa68450c0a6b4772c84246
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Jul 17 14:59:19 2014 +0200

    fdo#84645 RTF import: set DontBalanceTextColumns=true for the last section ...
    
    ... if it has multiple columns. See commit
    d185204737031955c56a24356ed003d342548434 (DOCX import: set
    DontBalanceTextColumns=true for the last section, 2014-07-17) for the
    DOCX equivalent of this problem; this just adapts the RTF tokenizer to
    dmapper.
    
    (cherry picked from commit d185204737031955c56a24356ed003d342548434)
    (cherry picked from commit f4bb73164a51ec83fe1d5975b1232d35f8a9e88a)
    
    Change-Id: Ib30f9b386e204b8b2987832ab17ee0cc53b3f0bc
    Reviewed-on: https://gerrit.libreoffice.org/12462
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sw/qa/extras/ooxmlimport/data/unbalanced-columns.docx b/sw/qa/extras/ooxmlimport/data/unbalanced-columns.docx
new file mode 100755
index 0000000..da6f93f
Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/unbalanced-columns.docx differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 900a25e..0082009 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -2395,6 +2395,14 @@ DECLARE_OOXMLIMPORT_TEST(testBnc821804, "bnc821804.docx")
     CPPUNIT_ASSERT_EQUAL(false,getProperty<bool>(getRun(getParagraph(10), 3), "IsStart"));
 }
 
+DECLARE_OOXMLIMPORT_TEST(testUnbalancedColumns, "unbalanced-columns.docx")
+{
+    uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xTextSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY);
+    // This was false, last section was balanced, but it's unbalanced in Word.
+    CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xTextSections->getByIndex(2), "DontBalanceTextColumns"));
+}
+
 #endif
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/qa/extras/rtfimport/data/unbalanced-columns.rtf b/sw/qa/extras/rtfimport/data/unbalanced-columns.rtf
new file mode 100644
index 0000000..aa57e38
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/unbalanced-columns.rtf
@@ -0,0 +1,5 @@
+{\rtf1
+\cols2
+\pard\plain First paragraph.\par
+Second paragraph.\par
+}
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index 1214051..8a6c6da 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -2009,6 +2009,14 @@ DECLARE_RTFIMPORT_TEST(testFdo82512, "fdo82512.rtf")
     CPPUNIT_ASSERT_EQUAL(style::BreakType_COLUMN_BEFORE, getProperty<style::BreakType>(getParagraph(2), "BreakType"));
 }
 
+DECLARE_RTFIMPORT_TEST(testUnbalancedColumns, "unbalanced-columns.rtf")
+{
+    uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xTextSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY);
+    // This was false, last section was balanced, but it's unbalanced in Word.
+    CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xTextSections->getByIndex(0), "DontBalanceTextColumns"));
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/inc/dmapper/DomainMapper.hxx b/writerfilter/inc/dmapper/DomainMapper.hxx
index 9266f08..7143219 100644
--- a/writerfilter/inc/dmapper/DomainMapper.hxx
+++ b/writerfilter/inc/dmapper/DomainMapper.hxx
@@ -87,6 +87,7 @@ public:
 
     // Stream
     virtual void markLastParagraphInSection() SAL_OVERRIDE;
+    virtual void markLastSectionGroup() SAL_OVERRIDE;
 
     // BinaryObj
     virtual void data(const sal_uInt8* buf, size_t len,
diff --git a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
index 0d36342..dd64b34 100644
--- a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
+++ b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
@@ -197,6 +197,9 @@ public:
     */
     virtual void endSectionGroup() = 0;
 
+    /// The current section is the last one in this body text.
+    virtual void markLastSectionGroup( ) { };
+
     /**
        Receives start mark for group with the same paragraph properties.
      */
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 7c8ac20..8bc3320 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2576,6 +2576,11 @@ void DomainMapper::markLastParagraphInSection( )
     m_pImpl->SetIsLastParagraphInSection( true );
 }
 
+void DomainMapper::markLastSectionGroup( )
+{
+    m_pImpl->SetIsLastSectionGroup( true );
+}
+
 void DomainMapper::lcl_startShape( uno::Reference< drawing::XShape > xShape )
 {
     if (m_pImpl->GetTopContext())
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 41d12af..c3343f1 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -188,6 +188,7 @@ DomainMapper_Impl::DomainMapper_Impl(
         m_bDummyParaAddedForTableInSection( false ),
         m_bTextFrameInserted(false),
         m_bIsLastParaInSection( false ),
+        m_bIsLastSectionGroup( false ),
         m_bIsInComments( false ),
         m_bParaSectpr( false ),
         m_bUsingEnhancedFields( false ),
@@ -396,6 +397,11 @@ sal_Int32 DomainMapper_Impl::GetSymbolData()
     return m_nSymboldata;
 }
 
+void DomainMapper_Impl::SetIsLastSectionGroup( bool bIsLast )
+{
+    m_bIsLastSectionGroup = bIsLast;
+}
+
 void DomainMapper_Impl::SetIsLastParagraphInSection( bool bIsLast )
 {
     m_bIsLastParaInSection = bIsLast;
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index e60eab4..f72c866 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -374,6 +374,7 @@ private:
     bool                            m_bDummyParaAddedForTableInSection;
     bool                            m_bTextFrameInserted;
     bool                            m_bIsLastParaInSection;
+    bool                            m_bIsLastSectionGroup;
     bool                            m_bIsInComments;
     /// If the current paragraph contains section property definitions.
     bool                            m_bParaSectpr;
@@ -452,6 +453,8 @@ public:
     void RemoveLastParagraph( );
     void SetIsLastParagraphInSection( bool bIsLast );
     bool GetIsLastParagraphInSection();
+    void SetIsLastSectionGroup( bool bIsLast );
+    bool GetIsLastSectionGroup() { return m_bIsLastSectionGroup;}
     void SetIsFirstParagraphInSection( bool bIsFirst );
     bool GetIsFirstParagraphInSection();
     void SetIsDummyParaAddedForTableInSection( bool bIsAdded );
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx
index 2512a9d..5014d63 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -619,7 +619,7 @@ void SectionPropertyMap::SetBorderDistance( uno::Reference< beans::XPropertySet
 
 
 uno::Reference< text::XTextColumns > SectionPropertyMap::ApplyColumnProperties(
-                            uno::Reference< beans::XPropertySet > xColumnContainer )
+                            uno::Reference< beans::XPropertySet > xColumnContainer, bool bLast )
 {
     uno::Reference< text::XTextColumns > xColumns;
     try
@@ -671,6 +671,8 @@ uno::Reference< text::XTextColumns > SectionPropertyMap::ApplyColumnProperties(
                 rPropNameSupplier.GetName( PROP_SEPARATOR_LINE_IS_ON ),
                 uno::makeAny( m_bSeparatorLineIsOn ));
         xColumnContainer->setPropertyValue( sTextColumns, uno::makeAny( xColumns ) );
+        if (bLast)
+            xColumnContainer->setPropertyValue("DontBalanceTextColumns", uno::makeAny(true));
     }
     catch( const uno::Exception& )
     {
@@ -980,7 +982,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
         uno::Reference< beans::XPropertySet > xSection =
                                     rDM_Impl.appendTextSectionAfter( m_xStartingRange );
         if( m_nColumnCount > 0 && xSection.is())
-            ApplyColumnProperties( xSection );
+            ApplyColumnProperties( xSection, rDM_Impl.GetIsLastSectionGroup() );
         uno::Reference<beans::XPropertySet> xRangeProperties(lcl_GetRangeProperties(m_bIsFirstSection, rDM_Impl, m_xStartingRange));
         if (xRangeProperties.is())
         {
@@ -1036,7 +1038,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
         }
         uno::Reference< text::XTextColumns > xColumns;
         if( m_nColumnCount > 0 )
-            xColumns = ApplyColumnProperties( xFollowPageStyle );
+            xColumns = ApplyColumnProperties( xFollowPageStyle, rDM_Impl.GetIsLastSectionGroup() );
 
         //prepare text grid properties
         sal_Int32 nHeight = 1;
@@ -1197,6 +1199,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
             OSL_FAIL( "Exception in SectionPropertyMap::CloseSectionGroup");
         }
     }
+    rDM_Impl.SetIsLastSectionGroup(false);
     rDM_Impl.SetIsFirstParagraphInSection(true);
 }
 
diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx
index 58487d6..63721b6 100644
--- a/writerfilter/source/dmapper/PropertyMap.hxx
+++ b/writerfilter/source/dmapper/PropertyMap.hxx
@@ -221,7 +221,7 @@ class SectionPropertyMap : public PropertyMap
 
     void _ApplyProperties( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xStyle );
     ::com::sun::star::uno::Reference< com::sun::star::text::XTextColumns > ApplyColumnProperties(
-            ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xFollowPageStyle );
+            ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xFollowPageStyle, bool bLast );
     void CopyLastHeaderFooter( bool bFirstPage, DomainMapper_Impl& rDM_Impl );
     void CopyHeaderFooter( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPrevStyle,
         ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xStyle );
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index 7fd973c..5104574 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -738,6 +738,11 @@ void OOXMLFastContextHandler::setLastParagraphInSection()
     mpStream->markLastParagraphInSection( );
 }
 
+void OOXMLFastContextHandler::setLastSectionGroup()
+{
+    mpStream->markLastSectionGroup( );
+}
+
 void OOXMLFastContextHandler::newProperty
 (const Id & /*nId*/, OOXMLValue::Pointer_t /*pVal*/)
 {
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
index a7d9bfa..f56f5e9 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
@@ -186,6 +186,7 @@ public:
 
     void startSectionGroup();
     void setLastParagraphInSection();
+    void setLastSectionGroup();
     void endSectionGroup();
     void startParagraphGroup();
     void endParagraphGroup();
diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml
index b3f25af..1e427b1 100644
--- a/writerfilter/source/ooxml/model.xml
+++ b/writerfilter/source/ooxml/model.xml
@@ -25887,6 +25887,7 @@
       -->
       <action name="end" action="endCharacterGroup"/>
       <action name="end" action="endParagraphGroup"/>
+      <action name="end" action="setLastSectionGroup"/>
       <action name="end" action="endSectionGroup"/>
     </resource>
     <resource xmlns:v="urn:schemas-microsoft-com:vml" name="CT_ShapeDefaults" resource="Properties" tag="shape">
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 6c6e282..b372d34 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -601,6 +601,12 @@ void RTFDocumentImpl::sectBreak(bool bFinal = false)
     writerfilter::Reference<Properties>::Pointer_t const pProperties(
         new RTFReferenceProperties(aAttributes, aSprms)
     );
+
+    if (bFinal && !m_pSuperstream)
+        // This is the end of the document, not just the end of e.g. a header.
+        // This makes sure that dmapper can set DontBalanceTextColumns=true for this section if necessary.
+        Mapper().markLastSectionGroup();
+
     // The trick is that we send properties of the previous section right now, which will be exactly what dmapper expects.
     Mapper().props(pProperties);
     Mapper().endParagraphGroup();


More information about the Libreoffice-commits mailing list