diff options
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/extras/layout/data/tdf124601b.doc | bin | 0 -> 62976 bytes | |||
-rw-r--r-- | sw/qa/extras/layout/layout.cxx | 17 | ||||
-rw-r--r-- | sw/source/core/layout/flylay.cxx | 4 | ||||
-rw-r--r-- | sw/source/core/layout/tabfrm.cxx | 12 |
4 files changed, 30 insertions, 3 deletions
diff --git a/sw/qa/extras/layout/data/tdf124601b.doc b/sw/qa/extras/layout/data/tdf124601b.doc Binary files differnew file mode 100644 index 000000000000..4428a7daf7b3 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf124601b.doc diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index 87a86a354253..df7231649060 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -3234,6 +3234,23 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf124601) assertXPath(pXmlDoc, "/root/page[2]/ftncont", 1); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf124601b) +{ + // Table has an image, which is anchored in the first row, but its vertical position is large + // enough to be rendered in the second row. + // The shape has layoutInCell=1, so should match what Word does here. + createDoc("tdf124601b.doc"); + xmlDocPtr pXmlDoc = parseLayoutDump(); + + sal_Int32 nFlyTop = getXPath(pXmlDoc, "//fly/infos/bounds", "top").toInt32(); + sal_Int32 nSecondRowTop = getXPath(pXmlDoc, "//tab/row[2]/infos/bounds", "top").toInt32(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected greater than: 3736 + // - Actual : 2852 + // i.e. the image was still inside the first row. + CPPUNIT_ASSERT_GREATER(nSecondRowTop, nFlyTop); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/layout/flylay.cxx b/sw/source/core/layout/flylay.cxx index 4a7030ea241e..1589c12670fe 100644 --- a/sw/source/core/layout/flylay.cxx +++ b/sw/source/core/layout/flylay.cxx @@ -501,11 +501,11 @@ void SwFlyFreeFrame::CheckClip( const SwFormatFrameSize &rSz ) !GetDrawObjs() && !GetAnchorFrame()->IsInTab() ) { SwFrame* pHeader = FindFooterOrHeader(); - // In a header, correction of the position is no good idea. + // In a header or footer, correction of the position is no good idea. // If the fly moves, some paragraphs have to be formatted, this // could cause a change of the height of the headerframe, // now the flyframe can change its position and so on ... - if ( !pHeader || !pHeader->IsHeaderFrame() ) + if ( !pHeader ) { const long nOld = getFrameArea().Top(); diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx index 4395bd231900..7333acc59c9d 100644 --- a/sw/source/core/layout/tabfrm.cxx +++ b/sw/source/core/layout/tabfrm.cxx @@ -3839,11 +3839,21 @@ long CalcHeightWithFlys( const SwFrame *pFrame ) // OD 30.09.2003 #i18732# - only objects, which follow // the text flow have to be considered. const SwFrameFormat& rFrameFormat = pAnchoredObj->GetFrameFormat(); + bool bFollowTextFlow = rFrameFormat.GetFollowTextFlow().GetValue(); const bool bConsiderObj = (rFrameFormat.GetAnchor().GetAnchorId() != RndStdIds::FLY_AS_CHAR) && pAnchoredObj->GetObjRect().Top() != FAR_AWAY && - rFrameFormat.GetFollowTextFlow().GetValue() && + bFollowTextFlow && pAnchoredObj->GetPageFrame() == pTmp->FindPageFrame(); + bool bWrapThrough = rFrameFormat.GetSurround().GetValue() == text::WrapTextMode_THROUGH; + if (pFrame->IsInTab() && bFollowTextFlow && bWrapThrough) + { + // Ignore wrap-through objects when determining the cell height. + // Normally FollowTextFlow requires a resize of the cell, but not in case of + // wrap-through. + continue; + } + if ( bConsiderObj ) { const SwFormatFrameSize &rSz = rFrameFormat.GetFrameSize(); |