Kaydet (Commit) 14087d3e authored tarafından Justin Luth's avatar Justin Luth

tdf#121670 ooxmlimport: no columns in page styles, only sections

LIKELY TO EXPOSE SECTION EXPORT/IMPORT PROBLEMS. That is already
happening somewhat because support for forms/protected sections was
added in LO6.2. By making this change, it will help to expose
problems faster, with the hope that they can still be fixed for 6.2.

Columns in page styles are very problematic, because it doesn't
let you override the number of columns (except to put sub-columns
inside one of the existing columns). So, always
attempt to insert a column into it's own section,
and never into the page style itself.

I'm rather excited that this didn't cause any unit test failures.
I've made a lot of section fixes over the years
(and some this week which are required for the unit test to work).
This change seems very natural, and gets rid of a regression-prone
hack.

I found all of the existing unit tests with columns and tested them.
About 10 files - all look fine including complex files
tdf81345.docx and tdf104061_tableSectionColumns.docx

Change-Id: If02f1bfd91b1cf8210665244d0782ff926cc2869
Reviewed-on: https://gerrit.libreoffice.org/65557
Tested-by: Jenkins
Reviewed-by: 's avatarJustin Luth <justin_luth@sil.org>
üst 3539a1ef
...@@ -855,6 +855,23 @@ DECLARE_OOXMLEXPORT_TEST(testUnbalancedColumns, "unbalanced-columns.docx") ...@@ -855,6 +855,23 @@ DECLARE_OOXMLEXPORT_TEST(testUnbalancedColumns, "unbalanced-columns.docx")
CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xTextSections->getByIndex(2), "DontBalanceTextColumns")); CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xTextSections->getByIndex(2), "DontBalanceTextColumns"));
} }
DECLARE_OOXMLEXPORT_TEST(testTdf121670_columnsInSectionsOnly, "tdf121670_columnsInSectionsOnly.docx")
{
uno::Reference<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xTextSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL_MESSAGE("DontBalanceTextColumns?", true, getProperty<bool>(xTextSections->getByIndex(0), "DontBalanceTextColumns"));
uno::Reference<beans::XPropertySet> xTextSection = getProperty< uno::Reference<beans::XPropertySet> >(getParagraph(2), "TextSection");
CPPUNIT_ASSERT(xTextSection.is());
uno::Reference<text::XTextColumns> xTextColumns = getProperty< uno::Reference<text::XTextColumns> >(xTextSection, "TextColumns");
CPPUNIT_ASSERT_EQUAL_MESSAGE("# of columns", sal_Int16(3), xTextColumns->getColumnCount());
xTextSection.set( getProperty< uno::Reference<beans::XPropertySet> >(getParagraph(3), "TextSection") );
CPPUNIT_ASSERT(xTextSection.is());
xTextColumns.set( getProperty< uno::Reference<text::XTextColumns> >(xTextSection, "TextColumns") );
CPPUNIT_ASSERT_EQUAL_MESSAGE("# of columns", sal_Int16(0), xTextColumns->getColumnCount());
}
DECLARE_OOXMLEXPORT_TEST(testTdf106492, "tdf106492.docx") DECLARE_OOXMLEXPORT_TEST(testTdf106492, "tdf106492.docx")
{ {
if (xmlDocPtr pXmlDoc = parseExport()) if (xmlDocPtr pXmlDoc = parseExport())
......
...@@ -1408,13 +1408,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) ...@@ -1408,13 +1408,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
} }
} }
// depending on the break type no page styles should be created if ( m_nBreakType == static_cast<sal_Int32>(NS_ooxml::LN_Value_ST_SectionMark_continuous) )
// Continuous sections usually create only a section, and not a new page style
const bool bTreatAsContinuous = m_nBreakType == NS_ooxml::LN_Value_ST_SectionMark_nextPage
&& m_nColumnCount > 0
&& (m_bIsFirstSection || (!HasHeader( m_bTitlePage ) && !HasFooter( m_bTitlePage )) )
&& (m_bIsFirstSection || m_sFollowPageStyleName.isEmpty() || (m_sFirstPageStyleName.isEmpty() && m_bTitlePage));
if ( m_nBreakType == static_cast<sal_Int32>(NS_ooxml::LN_Value_ST_SectionMark_continuous) || bTreatAsContinuous )
{ {
//todo: insert a section or access the already inserted section //todo: insert a section or access the already inserted section
uno::Reference< beans::XPropertySet > xSection = uno::Reference< beans::XPropertySet > xSection =
...@@ -1479,7 +1473,15 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) ...@@ -1479,7 +1473,15 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
} }
uno::Reference< text::XTextColumns > xColumns; uno::Reference< text::XTextColumns > xColumns;
if ( m_nColumnCount > 0 ) if ( m_nColumnCount > 0 )
xColumns = ApplyColumnProperties( xFollowPageStyle, rDM_Impl ); {
// prefer setting column properties into a section, not a page style if at all possible.
if ( !xSection.is() )
xSection = rDM_Impl.appendTextSectionAfter( m_xStartingRange );
if ( xSection.is() )
ApplyColumnProperties( xSection, rDM_Impl );
else
xColumns = ApplyColumnProperties( xFollowPageStyle, rDM_Impl );
}
// these BreakTypes are effectively page-breaks: don't evenly distribute text in columns before a page break; // these BreakTypes are effectively page-breaks: don't evenly distribute text in columns before a page break;
SectionPropertyMap* pLastContext = rDM_Impl.GetLastSectionContext(); SectionPropertyMap* pLastContext = rDM_Impl.GetLastSectionContext();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment