diff options
author | Michael Stahl <mstahl@redhat.com> | 2012-06-27 20:51:24 +0200 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2012-06-28 14:15:15 +0200 |
commit | 3a4b7c3555f2ffb4e89502bb04ff063d8c08f628 (patch) | |
tree | d33977a2ad67e0688a11adc37e41542de2e6b077 /sw | |
parent | aa8240e80394887a4af45710de69aacacec66d25 (diff) |
fdo#39415: sw: fix collapsing border painting more:
There is a special case for i#9860, which is for first line in follow
table (i.e. continued on new page) without repeated headlines:
Here the bottom border of the cell is used as the top border in case
the cell does not have a top border; this is fixed now with a bit of
refactoring, so the correct half width adjustment can be made.
Change-Id: I58ef81b7e13544014ef75973ea793f673a242488
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/layout/paintfrm.cxx | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index ca3d76156d28..133a6c235dc4 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -2680,6 +2680,24 @@ void SwTabFrmPainter::FindStylesForLine( const Point& rStartPoint, } } +// special case: #i9860# +// first line in follow table without repeated headlines +static bool lcl_IsFirstRowInFollowTableWithoutRepeatedHeadlines( + SwTabFrm const& rTabFrm, SwFrm const& rFrm, SvxBoxItem const& rBoxItem) +{ + SwRowFrm const*const pThisRowFrm = + dynamic_cast<const SwRowFrm*>(rFrm.GetUpper()); + return (pThisRowFrm + && (pThisRowFrm->GetUpper() == &rTabFrm) + && rTabFrm.IsFollow() + && !rTabFrm.GetTable()->GetRowsToRepeat() + && ( !pThisRowFrm->GetPrev() + || static_cast<const SwRowFrm*>(pThisRowFrm->GetPrev()) + ->IsRowSpanLine()) + && !rBoxItem.GetTop() + && rBoxItem.GetBottom()); +} + void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem ) { // build 4 line entries for the 4 borders: @@ -2690,6 +2708,10 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem ) aBorderRect.Pos() += rFrm.Frm().Pos(); } + bool const bBottomAsTop(lcl_IsFirstRowInFollowTableWithoutRepeatedHeadlines( + mrTabFrm, rFrm, rBoxItem)); + + // these are positions of the lines const SwTwips nLeft = aBorderRect._Left(); const SwTwips nRight = aBorderRect._Right(); const SwTwips nTop = aBorderRect._Top(); @@ -2700,8 +2722,9 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem ) svx::frame::Style aT( rBoxItem.GetTop() ); svx::frame::Style aB( rBoxItem.GetBottom() ); - const SwTwips nHalfTopWidth = aT.GetWidth() / 2; const SwTwips nHalfBottomWidth = aB.GetWidth() / 2; + const SwTwips nHalfTopWidth = (bBottomAsTop) + ? nHalfBottomWidth : aT.GetWidth() / 2; aR.MirrorSelf(); aB.MirrorSelf(); @@ -2717,9 +2740,10 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem ) SwLineEntry aLeft ( nLeft, nTop + nHalfTopWidth, nBottom + nHalfBottomWidth, bVert ? aB : ( bR2L ? aR : aL ) ); SwLineEntry aRight ( nRight, nTop + nHalfTopWidth, - nBottom + nHalfBottomWidth, bVert ? aT : ( bR2L ? aL : aR ) ); + nBottom + nHalfBottomWidth, + bVert ? ((bBottomAsTop) ? aB : aT) : ( bR2L ? aL : aR ) ); SwLineEntry aTop ( nTop + nHalfTopWidth, - nLeft, nRight, bVert ? aL : aT ); + nLeft, nRight, bVert ? aL : ((bBottomAsTop) ? aB : aT) ); SwLineEntry aBottom( nBottom + nHalfBottomWidth, nLeft, nRight, bVert ? aR : aB ); @@ -2727,22 +2751,6 @@ void SwTabFrmPainter::Insert( const SwFrm& rFrm, const SvxBoxItem& rBoxItem ) Insert( aRight, false ); Insert( aTop, true ); Insert( aBottom, true ); - - const SwRowFrm* pThisRowFrm = dynamic_cast<const SwRowFrm*>(rFrm.GetUpper()); - - // special case: #i9860# - // first line in follow table without repeated headlines - if ( pThisRowFrm && - pThisRowFrm->GetUpper() == &mrTabFrm && - mrTabFrm.IsFollow() && - !mrTabFrm.GetTable()->GetRowsToRepeat() && - (!pThisRowFrm->GetPrev() || static_cast<const SwRowFrm*>(pThisRowFrm->GetPrev())->IsRowSpanLine()) && - !rBoxItem.GetTop() && - rBoxItem.GetBottom() ) - { - SwLineEntry aFollowTop( !bVert ? nTop : nRight, !bVert ? nLeft : nTop, !bVert ? nRight : nBottom, aB ); - Insert( aFollowTop, !bVert ); - } } void SwTabFrmPainter::Insert( SwLineEntry& rNew, bool bHori ) |