diff options
Diffstat (limited to 'sw/source/core/text/txtfrm.cxx')
-rw-r--r-- | sw/source/core/text/txtfrm.cxx | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx index 758eb0bd99e1..9c4ac5b0e546 100644 --- a/sw/source/core/text/txtfrm.cxx +++ b/sw/source/core/text/txtfrm.cxx @@ -3237,7 +3237,7 @@ bool SwTextFrame::TestFormat( const SwFrame* pPrv, SwTwips &rMaxHeight, bool &bS SwTestFormat aSave( this, pPrv, rMaxHeight ); - return SwTextFrame::WouldFit( rMaxHeight, bSplit, true ); + return SwTextFrame::WouldFit(rMaxHeight, bSplit, true, false); } /** @@ -3252,7 +3252,7 @@ bool SwTextFrame::TestFormat( const SwFrame* pPrv, SwTwips &rMaxHeight, bool &bS * * @returns true if I can split */ -bool SwTextFrame::WouldFit( SwTwips &rMaxHeight, bool &bSplit, bool bTst ) +bool SwTextFrame::WouldFit(SwTwips &rMaxHeight, bool &bSplit, bool bTst, bool bMoveBwd) { OSL_ENSURE( ! IsVertical() || ! IsSwapped(), "SwTextFrame::WouldFit with swapped frame" ); @@ -3335,7 +3335,7 @@ bool SwTextFrame::WouldFit( SwTwips &rMaxHeight, bool &bSplit, bool bTst ) // is breaking necessary? bSplit = !aFrameBreak.IsInside( aLine ); if ( bSplit ) - bRet = !aFrameBreak.IsKeepAlways() && aFrameBreak.WouldFit( aLine, rMaxHeight, bTst ); + bRet = !aFrameBreak.IsKeepAlways() && aFrameBreak.WouldFit(aLine, rMaxHeight, bTst, bMoveBwd); else { // we need the total height including the current line @@ -3766,7 +3766,42 @@ sal_uInt16 SwTextFrame::FirstLineHeight() const if ( !pPara ) return USHRT_MAX; - return pPara->Height(); + // tdf#146500 Lines with only fly overlap cannot be "moved", so the idea + // here is to continue until there's some text. + // FIXME ideally we want to count a fly to the line in which it is anchored + // - it may even be anchored in some other paragraph! SwFlyPortion doesn't + // have a pointer sadly so no way to find out. + sal_uInt16 nHeight(0); + for (SwLineLayout const* pLine = pPara; pLine; pLine = pLine->GetNext()) + { + nHeight += pLine->Height(); + bool hasNonFly(false); + for (SwLinePortion const* pPortion = pLine->GetFirstPortion(); + pPortion; pPortion = pPortion->GetNextPortion()) + { + switch (pPortion->GetWhichPor()) + { + case PortionType::Fly: + case PortionType::Glue: + case PortionType::Margin: + break; + default: + { + hasNonFly = true; + break; + } + } + if (hasNonFly) + { + break; + } + } + if (hasNonFly) + { + break; + } + } + return nHeight; } sal_uInt16 SwTextFrame::GetLineCount(TextFrameIndex const nPos) |