Kaydet (Commit) 78d1f1c2 authored tarafından Miklos Vajna's avatar Miklos Vajna

fdo#68607 bnc#816593 DomainMapperTableHandler: don't always start a frame

This is a port of commit 8fe8bd6c
"Related: fdo#61594 SwWW8ImplReader::StartApo: don't always start a
frame" from the WW8 filter to the DOCX one.

(regression from edc4861a)

Change-Id: If1bb4a8a3786aacd618585cf859b57ce9be85c51
üst 624ebf61
......@@ -130,6 +130,7 @@ public:
void testTableAutoNested();
void testTableStyleParprop();
void testTablePagebreak();
void testFdo68607();
CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT)
......@@ -226,6 +227,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},
};
header();
for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
......@@ -1530,6 +1532,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();
......
......@@ -823,7 +823,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)
{
......
......@@ -1203,6 +1203,11 @@ void SectionPropertyMap::SetFirstPaperBin( sal_Int32 nSet )
}
sal_Int32 SectionPropertyMap::GetPageWidth()
{
return operator[](PropertyDefinition(PROP_WIDTH)).get<sal_Int32>();
}
StyleSheetPropertyMap::StyleSheetPropertyMap() :
mnCT_Spacing_line( 0 ),
mnCT_Spacing_lineRule( 0 ),
......
......@@ -241,11 +241,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; }
......
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