summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
Diffstat (limited to 'sw')
-rw-r--r--sw/qa/extras/layout/data/tdf124601b.docbin0 -> 62976 bytes
-rw-r--r--sw/qa/extras/layout/layout.cxx17
-rw-r--r--sw/source/core/layout/flylay.cxx4
-rw-r--r--sw/source/core/layout/tabfrm.cxx12
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
new file mode 100644
index 000000000000..4428a7daf7b3
--- /dev/null
+++ b/sw/qa/extras/layout/data/tdf124601b.doc
Binary files differ
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();