summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Thiebaud <nthiebaud@gmail.com>2012-06-17 13:33:03 -0500
committerNorbert Thiebaud <nthiebaud@gmail.com>2012-06-17 13:33:03 -0500
commitde1c42d9f552bc57b28d50f4313bc982c63b84d4 (patch)
tree685551f80f6a1bf6bc49055c223b7f7ae0dda4d7
parent794e2e601fcbed83e6f886db14f3754b68ae0311 (diff)
writer:crash(i118878) when adding columns and chang. properties in a frame
when adding columns, GetNumCols() reflect the new number of columns before the actual columns available are updated. Due to the way and order in which properties are updated the code that adjust the columns can be run before the new columns are avialable.. and was using GetNumCols(). This patch avoid using that api and rely on the column iterator to determine the acutal number of column available. Change-Id: I52e75ec82c1ace65b05b8df9e54f4689f2aec8d3
-rw-r--r--sw/source/core/layout/colfrm.cxx46
1 files changed, 27 insertions, 19 deletions
diff --git a/sw/source/core/layout/colfrm.cxx b/sw/source/core/layout/colfrm.cxx
index 99648f3e8f65..99a5885c40fe 100644
--- a/sw/source/core/layout/colfrm.cxx
+++ b/sw/source/core/layout/colfrm.cxx
@@ -349,20 +349,26 @@ void SwLayoutFrm::AdjustColumns( const SwFmtCol *pAttr, sal_Bool bAdjustAttribut
const sal_Bool bLine = pAttr->GetLineAdj() != COLADJ_NONE;
const sal_uInt16 nMin = bLine ? sal_uInt16( 20 + ( pAttr->GetLineWidth() / 2) ) : 0;
- const sal_Bool bR2L = IsRightToLeft();
- SwFrm *pCol = bR2L ? GetLastLower() : Lower();
-
// #i27399#
// bOrtho means we have to adjust the column frames manually. Otherwise
// we may use the values returned by CalcColWidth:
const sal_Bool bOrtho = pAttr->IsOrtho() && pAttr->GetNumCols() > 0;
long nGutter = 0;
+ sal_uInt16 real_nb_col = 0;
+
+ SwFrm* pColHead = Lower();;
+ SwFrm* pColTail;
+ for ( pColTail = pColHead; pColTail; pColTail = pColTail->GetNext(), real_nb_col += 1 );
+
+ sal_uInt16 i = IsRightToLeft() ? real_nb_col : 0;
- for ( sal_uInt16 i = 0; i < pAttr->GetNumCols(); ++i )
+ for ( SwFrm* pColCursor = IsRightToLeft() ? pColTail : pColHead;
+ pColCursor;
+ (pColCursor = IsRightToLeft() ? pColCursor->GetPrev() : pColCursor->GetNext()), (i += IsRightToLeft() ? -1 : +1) )
{
if( !bOrtho )
{
- const SwTwips nWidth = i == (pAttr->GetNumCols() - 1) ?
+ const SwTwips nWidth = (pColCursor == (IsRightToLeft() ? pColTail : pColHead) ) ?
nAvail :
pAttr->CalcColWidth( i, sal_uInt16( (Prt().*fnRect->fnGetWidth)() ) );
@@ -370,14 +376,14 @@ void SwLayoutFrm::AdjustColumns( const SwFmtCol *pAttr, sal_Bool bAdjustAttribut
Size( Prt().Width(), nWidth ) :
Size( nWidth, Prt().Height() );
- pCol->ChgSize( aColSz );
+ pColCursor->ChgSize( aColSz );
// With this, the ColumnBodyFrms from page columns gets adjusted and
// their bFixHeight flag is set so they won't shrink/grow.
// Don't use the flag with frame columns because BodyFrms in frame
// columns can grow/shrink.
if( IsBodyFrm() )
- ((SwLayoutFrm*)pCol)->Lower()->ChgSize( aColSz );
+ ((SwLayoutFrm*)pColCursor)->Lower()->ChgSize( aColSz );
nAvail -= nWidth;
}
@@ -385,7 +391,7 @@ void SwLayoutFrm::AdjustColumns( const SwFmtCol *pAttr, sal_Bool bAdjustAttribut
if ( bOrtho || bAdjustAttributes )
{
const SwColumn *pC = &pAttr->GetColumns()[i];
- const SwAttrSet* pSet = pCol->GetAttrSet();
+ const SwAttrSet* pSet = pColCursor->GetAttrSet();
SvxLRSpaceItem aLR( pSet->GetLRSpace() );
//In order to have enough space for the separation lines, we have to
@@ -421,42 +427,44 @@ void SwLayoutFrm::AdjustColumns( const SwFmtCol *pAttr, sal_Bool bAdjustAttribut
aUL.SetUpper( pC->GetUpper());
aUL.SetLower( pC->GetLower());
- ((SwLayoutFrm*)pCol)->GetFmt()->SetFmtAttr( aLR );
- ((SwLayoutFrm*)pCol)->GetFmt()->SetFmtAttr( aUL );
+ ((SwLayoutFrm*)pColCursor)->GetFmt()->SetFmtAttr( aLR );
+ ((SwLayoutFrm*)pColCursor)->GetFmt()->SetFmtAttr( aUL );
}
nGutter += aLR.GetLeft() + aLR.GetRight();
}
-
- pCol = bR2L ? pCol->GetPrev() : pCol->GetNext();
}
if( bOrtho )
{
long nInnerWidth = ( nAvail - nGutter ) / pAttr->GetNumCols();
- pCol = Lower();
- for( sal_uInt16 i = 0; i < pAttr->GetNumCols(); pCol = pCol->GetNext(), ++i )
+ i = 0;
+ for (SwFrm* pColCursor = pColHead; pColCursor; pColCursor = pColCursor->GetNext(), i++)
{
SwTwips nWidth;
if ( i == pAttr->GetNumCols() - 1 )
+ {
nWidth = nAvail;
+ }
else
{
- SvxLRSpaceItem aLR( pCol->GetAttrSet()->GetLRSpace() );
+ SvxLRSpaceItem aLR( pColCursor->GetAttrSet()->GetLRSpace() );
nWidth = nInnerWidth + aLR.GetLeft() + aLR.GetRight();
}
if( nWidth < 0 )
+ {
nWidth = 0;
-
+ }
const Size aColSz = bVert ?
Size( Prt().Width(), nWidth ) :
Size( nWidth, Prt().Height() );
- pCol->ChgSize( aColSz );
+ pColCursor->ChgSize( aColSz );
if( IsBodyFrm() )
- ((SwLayoutFrm*)pCol)->Lower()->ChgSize( aColSz );
-
+ {
+ ((SwLayoutFrm*)pColCursor)->Lower()->ChgSize( aColSz );
+ }
nAvail -= nWidth;
}
}