diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2013-09-03 11:52:51 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2013-09-03 17:17:21 +0200 |
commit | d34ce87ddd17a66a074f47d11d8931e1d8594d64 (patch) | |
tree | b929bbc45bd5b188739cc463f10b0618ac4559e6 | |
parent | 5e502cf754e7c08e098ba401610aef76b4244f1f (diff) |
fdo#68607 bnc#816593 DomainMapperTableHandler: don't always start a frame
This is a port of commit 8fe8bd6c3b5b1a539b7370f8c457fa69c061d2de
"Related: fdo#61594 SwWW8ImplReader::StartApo: don't always start a
frame" from the WW8 filter to the DOCX one.
(regression from edc4861a68e0269b83b17e0ec57912a1ce4220ad)
(cherry picked from commit 78d1f1c2835b9fae0f91ed771fc1d594c7817502)
Change-Id: If1bb4a8a3786aacd618585cf859b57ce9be85c51
-rw-r--r-- | sw/qa/extras/inc/swmodeltestbase.hxx | 12 | ||||
-rw-r--r-- | sw/qa/extras/ooxmlimport/data/fdo68607.docx | bin | 0 -> 36117 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 10 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableHandler.cxx | 15 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyMap.cxx | 5 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyMap.hxx | 3 |
6 files changed, 44 insertions, 1 deletions
diff --git a/sw/qa/extras/inc/swmodeltestbase.hxx b/sw/qa/extras/inc/swmodeltestbase.hxx index a4e821329aac..cf37f7f01f18 100644 --- a/sw/qa/extras/inc/swmodeltestbase.hxx +++ b/sw/qa/extras/inc/swmodeltestbase.hxx @@ -27,9 +27,11 @@ #include <com/sun/star/container/XContentEnumerationAccess.hpp> #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> +#include <com/sun/star/text/XPageCursor.hpp> #include <com/sun/star/text/XTextDocument.hpp> #include <com/sun/star/text/XTextRange.hpp> #include <com/sun/star/text/XTextTable.hpp> +#include <com/sun/star/text/XTextViewCursorSupplier.hpp> #include <com/sun/star/table/XCell.hpp> #include <test/bootstrapfixture.hxx> @@ -248,6 +250,16 @@ protected: return getProperty<OUString>(getProperty< uno::Reference<beans::XPropertySet> >(xFormula, "Model"), "Formula"); } + /// Get page count. + int getPages() + { + uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY); + uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference<text::XPageCursor> xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY); + xCursor->jumpToLastPage(); + return xCursor->getPage(); + } + uno::Reference<lang::XComponent> mxComponent; xmlBufferPtr mpXmlBuffer; diff --git a/sw/qa/extras/ooxmlimport/data/fdo68607.docx b/sw/qa/extras/ooxmlimport/data/fdo68607.docx Binary files differnew file mode 100644 index 000000000000..11f57064ce92 --- /dev/null +++ b/sw/qa/extras/ooxmlimport/data/fdo68607.docx diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index 4da8664e649f..4d6733a59540 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -134,6 +134,7 @@ public: void testTableAutoNested(); void testTableStyleParprop(); void testTablePagebreak(); + void testFdo68607(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -217,6 +218,7 @@ void Test::run() {"table-auto-nested.docx", &Test::testTableAutoNested}, {"table-style-parprop.docx", &Test::testTableStyleParprop}, {"table-pagebreak.docx", &Test::testTablePagebreak}, + {"fdo68607.docx", &Test::testFdo68607}, }; for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) { @@ -1360,6 +1362,14 @@ void Test::testTablePagebreak() CPPUNIT_ASSERT_EQUAL(style::BreakType_PAGE_BEFORE, getProperty<style::BreakType>(getParagraph(3), "BreakType")); } +void Test::testFdo68607() +{ + // Bugdoc was 8 pages in Word, 1 in Writer due to pointlessly wrapping the + // table in a frame. Exact layout may depend on fonts available, etc. -- + // but at least make sure that our table spans over multiple pages now. + CPPUNIT_ASSERT(getPages() > 1); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx index 546ff2028d31..571ef77dcf4f 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx @@ -764,7 +764,20 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) { uno::Reference<text::XTextRange> xStart; uno::Reference<text::XTextRange> xEnd; - bool bFloating = aFrameProperties.hasElements(); + + bool bNoFly = false; + if (SectionPropertyMap* pSectionContext = m_rDMapper_Impl.GetSectionContext()) + { + sal_Int32 nTextAreaWidth = pSectionContext->GetPageWidth() - pSectionContext->GetLeftMargin() - pSectionContext->GetRightMargin(); + sal_Int32 nTableWidth = 0; + m_aTableProperties->getValue( TablePropertyMap::TABLE_WIDTH, nTableWidth ); + // If the table is wider than the text area, then don't create a fly + // for the table: no wrapping will be performed anyway, but multi-page + // tables will be broken. + bNoFly = nTableWidth >= nTextAreaWidth; + } + + bool bFloating = aFrameProperties.hasElements() && !bNoFly; // Additional checks: if we can do this. if (bFloating && (*m_pTableSeq)[0].getLength() > 0 && (*m_pTableSeq)[0][0].getLength() > 0) { diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx index 1b79667a6805..62c6272ce47c 100644 --- a/writerfilter/source/dmapper/PropertyMap.cxx +++ b/writerfilter/source/dmapper/PropertyMap.cxx @@ -1169,6 +1169,11 @@ void SectionPropertyMap::SetFirstPaperBin( sal_Int32 nSet ) } +sal_Int32 SectionPropertyMap::GetPageWidth() +{ + return operator[](PropertyDefinition(PROP_WIDTH, false)).get<sal_Int32>(); +} + StyleSheetPropertyMap::StyleSheetPropertyMap() : mnCT_Spacing_line( 0 ), mnCT_Spacing_lineRule( 0 ), diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx index 83898597bdbc..ce9987fdd59a 100644 --- a/writerfilter/source/dmapper/PropertyMap.hxx +++ b/writerfilter/source/dmapper/PropertyMap.hxx @@ -240,11 +240,14 @@ public: void SetFirstPaperBin( sal_Int32 nSet ); void SetLeftMargin( sal_Int32 nSet ) { m_nLeftMargin = nSet; } + sal_Int32 GetLeftMargin() { return m_nLeftMargin; } void SetRightMargin( sal_Int32 nSet ) { m_nRightMargin = nSet; } + sal_Int32 GetRightMargin() { return m_nRightMargin; } void SetTopMargin( sal_Int32 nSet ) { m_nTopMargin = nSet; } void SetBottomMargin( sal_Int32 nSet ) { m_nBottomMargin = nSet; } void SetHeaderTop( sal_Int32 nSet ) { m_nHeaderTop = nSet; } void SetHeaderBottom( sal_Int32 nSet ) { m_nHeaderBottom = nSet; } + sal_Int32 GetPageWidth(); void SetGutterRTL( bool bSet ) { m_bGutterRTL = bSet;} void SetDzaGutter( sal_Int32 nSet ) {m_nDzaGutter = nSet; } |