sw/source/core/frmedt/tblsel.cxx | 2 - sw/source/core/inc/flowfrm.hxx | 28 +++++++++------------------ sw/source/core/layout/flowfrm.cxx | 38 +++++++++++++++++++++++++++++++++---- sw/source/core/layout/laycache.cxx | 1 sw/source/core/layout/sectfrm.cxx | 11 ---------- sw/source/core/layout/ssfrm.cxx | 3 -- sw/source/core/layout/tabfrm.cxx | 1 sw/source/core/text/frmform.cxx | 5 +--- sw/source/core/text/xmldump.cxx | 12 +++++------ 9 files changed, 54 insertions(+), 47 deletions(-)
New commits: commit 4c36086e3a8b546d906e0dd9f0472abd7013852e Author: Michael Stahl <mst...@redhat.com> Date: Mon Feb 13 18:36:28 2012 +0100 fdo#41712: sw: remove superfluous flag: This removes SwFlowFrm::bIsFollow, which is pointless duplication of m_pPrecede; this fixes lots of assertions (probably some real problem as well). Signed-off-by: Cédric Bosdonnat <cedric.bosdonnat....@free.fr> diff --git a/sw/source/core/frmedt/tblsel.cxx b/sw/source/core/frmedt/tblsel.cxx index 34fd69d..4397073 100644 --- a/sw/source/core/frmedt/tblsel.cxx +++ b/sw/source/core/frmedt/tblsel.cxx @@ -2250,7 +2250,7 @@ void _FndBox::SetTableLines( const SwTable &rTable ) inline void UnsetFollow( SwFlowFrm *pTab ) { - pTab->bIsFollow = sal_False; + pTab->m_pPrecede = 0; } void _FndBox::DelFrms( SwTable &rTable ) diff --git a/sw/source/core/inc/flowfrm.hxx b/sw/source/core/inc/flowfrm.hxx index 9617988..8facb39 100644 --- a/sw/source/core/inc/flowfrm.hxx +++ b/sw/source/core/inc/flowfrm.hxx @@ -117,7 +117,6 @@ protected: SwFlowFrm *m_pFollow; SwFlowFrm *m_pPrecede; - sal_Bool bIsFollow :1; //Ist's ein Follow sal_Bool bLockJoin :1; //Join (und damit deleten) verboten wenn sal_True! sal_Bool bUndersized:1; // wir sind kleiner als gewuenscht sal_Bool bFtnAtEnd :1; // For sectionfrms only: footnotes at the end of section @@ -168,8 +167,7 @@ public: void MoveSubTree( SwLayoutFrm* pParent, SwFrm* pSibling = 0 ); sal_Bool HasFollow() const { return m_pFollow ? sal_True : sal_False; } - sal_Bool IsFollow() const { return bIsFollow; } - inline void _SetIsFollow( sal_Bool bSet ) { bIsFollow = bSet; } + sal_Bool IsFollow() const { return 0 != m_pPrecede; } const SwFlowFrm *GetFollow() const { return m_pFollow; } SwFlowFrm *GetFollow() { return m_pFollow; } sal_Bool IsAnFollow( const SwFlowFrm *pFlow ) const; diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx index c5e083f..5b4a588 100644 --- a/sw/source/core/layout/flowfrm.cxx +++ b/sw/source/core/layout/flowfrm.cxx @@ -84,7 +84,7 @@ SwFlowFrm::SwFlowFrm( SwFrm &rFrm ) : m_pFollow( 0 ), m_pPrecede( 0 ) { - bLockJoin = bIsFollow = bCntntLock = bOwnFtnNum = + bLockJoin = bCntntLock = bOwnFtnNum = bFtnLock = bFlyLock = sal_False; } diff --git a/sw/source/core/layout/laycache.cxx b/sw/source/core/layout/laycache.cxx index 850e38b..61b40ce 100644 --- a/sw/source/core/layout/laycache.cxx +++ b/sw/source/core/layout/laycache.cxx @@ -934,7 +934,6 @@ sal_Bool SwLayHelper::CheckInsert( sal_uLong nNodeIndex ) { SwTxtFrm *pNew = new SwTxtFrm( ((SwTxtFrm*)rpFrm)-> GetTxtNode(), rpFrm ); - pNew->_SetIsFollow( sal_True ); pNew->ManipOfst( nOfst ); pNew->SetFollow( ((SwTxtFrm*)rpFrm)->GetFollow() ); ((SwTxtFrm*)rpFrm)->SetFollow( pNew ); diff --git a/sw/source/core/layout/sectfrm.cxx b/sw/source/core/layout/sectfrm.cxx index eee5a68..60e6d2d 100644 --- a/sw/source/core/layout/sectfrm.cxx +++ b/sw/source/core/layout/sectfrm.cxx @@ -102,15 +102,11 @@ SwSectionFrm::SwSectionFrm( SwSectionFrm &rSect, sal_Bool bMaster ) : { SwSectionFrm* pMaster = rSect.FindMaster(); pMaster->SetFollow( this ); - bIsFollow = sal_True; } - else - rSect.bIsFollow = sal_True; SetFollow( &rSect ); } else { - bIsFollow = sal_True; SetFollow( rSect.GetFollow() ); rSect.SetFollow( this ); if( !GetFollow() ) @@ -171,7 +167,6 @@ SwSectionFrm::~SwSectionFrm() else if( HasFollow() ) { PROTOCOL( this, PROT_SECTION, ACT_DEL_MASTER, GetFollow() ) - GetFollow()->bIsFollow = sal_False; } } } @@ -219,10 +214,7 @@ void SwSectionFrm::DelEmpty( sal_Bool bRemove ) // freigeben, deshalb wird die Size des Masters invalidiert. if( !GetFollow() && !pMaster->IsColLocked() ) pMaster->InvalidateSize(); - bIsFollow = sal_False; } - else if( HasFollow() ) - GetFollow()->bIsFollow = sal_False; SetFollow(0); if( pUp ) { @@ -506,7 +498,6 @@ void SwSectionFrm::MergeNext( SwSectionFrm* pNxt ) } SetFollow( pNxt->GetFollow() ); pNxt->SetFollow( NULL ); - pNxt->bIsFollow = sal_False; pNxt->Cut(); delete pNxt; InvalidateSize(); diff --git a/sw/source/core/layout/ssfrm.cxx b/sw/source/core/layout/ssfrm.cxx index b2dc389..6ac8bc7 100644 --- a/sw/source/core/layout/ssfrm.cxx +++ b/sw/source/core/layout/ssfrm.cxx @@ -523,13 +523,10 @@ void SwCntntFrm::DelFrms( const SwCntntNode& rNode ) } } // <-- - if( pFrm->HasFollow() ) - pFrm->GetFollow()->_SetIsFollow( pFrm->IsFollow() ); if( pFrm->IsFollow() ) { SwCntntFrm* pMaster = (SwTxtFrm*)pFrm->FindMaster(); pMaster->SetFollow( pFrm->GetFollow() ); - pFrm->_SetIsFollow( sal_False ); } pFrm->SetFollow( 0 );//Damit er nicht auf dumme Gedanken kommt. //Andernfalls kann es sein, dass ein Follow diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx index aaa73ca..d8a2a02 100644 --- a/sw/source/core/layout/tabfrm.cxx +++ b/sw/source/core/layout/tabfrm.cxx @@ -124,7 +124,6 @@ SwTabFrm::SwTabFrm( SwTabFrm &rTab ) : SwFlowFrm( (SwFrm&)*this ), pTable( rTab.GetTable() ) { - bIsFollow = sal_True; bLockJoin = bComplete = bONECalcLowers = bCalcLowers = bLowersFormatted = bLockBackMove = bResizeHTMLTable = bHasFollowFlowLine = bIsRebuildLastLine = bRestrictTableGrowth = bRemoveFollowFlowLinePending = sal_False; diff --git a/sw/source/core/text/frmform.cxx b/sw/source/core/text/frmform.cxx index 464eab7..dd5495f 100644 --- a/sw/source/core/text/frmform.cxx +++ b/sw/source/core/text/frmform.cxx @@ -701,7 +701,6 @@ SwCntntFrm *SwTxtFrm::SplitFrm( const xub_StrLen nTxtPos ) // Damit meine Daten nicht verschwinden, locke ich mich. SwTxtFrmLocker aLock( this ); SwTxtFrm *pNew = (SwTxtFrm *)(GetTxtNode()->MakeFrm( this )); - pNew->bIsFollow = sal_True; pNew->SetFollow( GetFollow() ); SetFollow( pNew ); commit 33e8891ea9d75519da56431073897a57ab251d6a Author: Michael Stahl <mst...@redhat.com> Date: Mon Feb 13 18:27:59 2012 +0100 fdo#41712: sw: fix crash in layout frame linked lists: The pPrecede member is not maintained properly when setting the corresponding pFollow member. The change in SwTxtFrm::JoinFrm() fixes the crash, the other changes are perhaps fixes for other crashes... (regression from cc3d0d182cafef9649e45f4657233ac2221fdd0a) Signed-off-by: Cédric Bosdonnat <cedric.bosdonnat....@free.fr> diff --git a/sw/source/core/inc/flowfrm.hxx b/sw/source/core/inc/flowfrm.hxx index 1f9009d..9617988 100644 --- a/sw/source/core/inc/flowfrm.hxx +++ b/sw/source/core/inc/flowfrm.hxx @@ -150,6 +150,7 @@ protected: public: SwFlowFrm( SwFrm &rFrm ); + virtual ~SwFlowFrm(); const SwFrm *GetFrm() const { return &rThis; } SwFrm *GetFrm() { return &rThis; } diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx index 738c7e3..c5e083f 100644 --- a/sw/source/core/layout/flowfrm.cxx +++ b/sw/source/core/layout/flowfrm.cxx @@ -88,12 +88,33 @@ SwFlowFrm::SwFlowFrm( SwFrm &rFrm ) : bFtnLock = bFlyLock = sal_False; } +SwFlowFrm::~SwFlowFrm() +{ + if (m_pFollow) + { + m_pFollow->m_pPrecede = 0; + } + if (m_pPrecede) + { + m_pPrecede->m_pFollow = 0; + } +} void SwFlowFrm::SetFollow(SwFlowFrm *const pFollow) { + if (m_pFollow) + { + assert(this == m_pFollow->m_pPrecede); + m_pFollow->m_pPrecede = 0; + } m_pFollow = pFollow; if (m_pFollow != NULL) { + if (m_pFollow->m_pPrecede) // re-chaining pFollow? + { + assert(m_pFollow == m_pFollow->m_pPrecede->m_pFollow); + m_pFollow->m_pPrecede->m_pFollow = 0; + } m_pFollow->m_pPrecede = this; } } diff --git a/sw/source/core/layout/sectfrm.cxx b/sw/source/core/layout/sectfrm.cxx index 2b21733..eee5a68 100644 --- a/sw/source/core/layout/sectfrm.cxx +++ b/sw/source/core/layout/sectfrm.cxx @@ -223,7 +223,7 @@ void SwSectionFrm::DelEmpty( sal_Bool bRemove ) } else if( HasFollow() ) GetFollow()->bIsFollow = sal_False; - m_pFollow = NULL; + SetFollow(0); if( pUp ) { Frm().Height( 0 ); diff --git a/sw/source/core/text/frmform.cxx b/sw/source/core/text/frmform.cxx index 619c700..464eab7 100644 --- a/sw/source/core/text/frmform.cxx +++ b/sw/source/core/text/frmform.cxx @@ -684,8 +684,8 @@ SwCntntFrm *SwTxtFrm::JoinFrm() } // <-- pFoll->Cut(); + SetFollow(pNxt); delete pFoll; - m_pFollow = pNxt; return pNxt; } commit e1dad1357ac57009483d232f2c8a9dccebbf69c3 Author: Michael Stahl <mst...@redhat.com> Date: Mon Feb 13 18:21:53 2012 +0100 fdo#41712: rename members to track down assignments Signed-off-by: Cédric Bosdonnat <cedric.bosdonnat....@free.fr> diff --git a/sw/source/core/inc/flowfrm.hxx b/sw/source/core/inc/flowfrm.hxx index bc9557a..1f9009d 100644 --- a/sw/source/core/inc/flowfrm.hxx +++ b/sw/source/core/inc/flowfrm.hxx @@ -114,8 +114,8 @@ class SwFlowFrm protected: - SwFlowFrm *pFollow; - SwFlowFrm *pPrecede; + SwFlowFrm *m_pFollow; + SwFlowFrm *m_pPrecede; sal_Bool bIsFollow :1; //Ist's ein Follow sal_Bool bLockJoin :1; //Join (und damit deleten) verboten wenn sal_True! @@ -166,16 +166,16 @@ public: //neuen Parent Moven. void MoveSubTree( SwLayoutFrm* pParent, SwFrm* pSibling = 0 ); - sal_Bool HasFollow() const { return pFollow ? sal_True : sal_False; } + sal_Bool HasFollow() const { return m_pFollow ? sal_True : sal_False; } sal_Bool IsFollow() const { return bIsFollow; } inline void _SetIsFollow( sal_Bool bSet ) { bIsFollow = bSet; } - const SwFlowFrm *GetFollow() const { return pFollow; } - SwFlowFrm *GetFollow() { return pFollow; } + const SwFlowFrm *GetFollow() const { return m_pFollow; } + SwFlowFrm *GetFollow() { return m_pFollow; } sal_Bool IsAnFollow( const SwFlowFrm *pFlow ) const; - inline void SetFollow( SwFlowFrm *pNew ); + void SetFollow( SwFlowFrm *const pFollow ); - const SwFlowFrm *GetPrecede() const { return pPrecede; } - SwFlowFrm *GetPrecede() { return pPrecede; } + const SwFlowFrm *GetPrecede() const { return m_pPrecede; } + SwFlowFrm *GetPrecede() { return m_pPrecede; } sal_Bool IsJoinLocked() const { return bLockJoin; } sal_Bool IsAnyJoinLocked() const { return bLockJoin || HasLockedFollow(); } @@ -253,13 +253,6 @@ inline sal_Bool SwFlowFrm::IsFwdMoveAllowed() return rThis.GetIndPrev() != 0; } -inline void SwFlowFrm::SetFollow( SwFlowFrm *pNew ) -{ - pFollow = pNew; - if ( pFollow != NULL ) - pFollow->pPrecede = this; -} - #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx index 51cb49b..738c7e3 100644 --- a/sw/source/core/layout/flowfrm.cxx +++ b/sw/source/core/layout/flowfrm.cxx @@ -81,14 +81,23 @@ sal_Bool SwFlowFrm::bMoveBwdJump = sal_False; SwFlowFrm::SwFlowFrm( SwFrm &rFrm ) : rThis( rFrm ), - pFollow( 0 ), - pPrecede( 0 ) + m_pFollow( 0 ), + m_pPrecede( 0 ) { bLockJoin = bIsFollow = bCntntLock = bOwnFtnNum = bFtnLock = bFlyLock = sal_False; } +void SwFlowFrm::SetFollow(SwFlowFrm *const pFollow) +{ + m_pFollow = pFollow; + if (m_pFollow != NULL) + { + m_pFollow->m_pPrecede = this; + } +} + /************************************************************************* |* |* SwFlowFrm::IsFollowLocked() @@ -215,7 +224,7 @@ sal_Bool SwFlowFrm::IsKeep( const SwAttrSet& rAttrs, bool bCheckIfLastRowShouldK { SwFrm *pNxt; if( 0 != (pNxt = rThis.FindNextCnt()) && - (!pFollow || pNxt != pFollow->GetFrm())) + (!m_pFollow || pNxt != m_pFollow->GetFrm())) { // --> FME 2006-05-15 #135914# // The last row of a table only keeps with the next content diff --git a/sw/source/core/layout/sectfrm.cxx b/sw/source/core/layout/sectfrm.cxx index 6f8bf2f..2b21733 100644 --- a/sw/source/core/layout/sectfrm.cxx +++ b/sw/source/core/layout/sectfrm.cxx @@ -223,7 +223,7 @@ void SwSectionFrm::DelEmpty( sal_Bool bRemove ) } else if( HasFollow() ) GetFollow()->bIsFollow = sal_False; - pFollow = NULL; + m_pFollow = NULL; if( pUp ) { Frm().Height( 0 ); diff --git a/sw/source/core/text/frmform.cxx b/sw/source/core/text/frmform.cxx index c383c7e..619c700 100644 --- a/sw/source/core/text/frmform.cxx +++ b/sw/source/core/text/frmform.cxx @@ -685,7 +685,7 @@ SwCntntFrm *SwTxtFrm::JoinFrm() // <-- pFoll->Cut(); delete pFoll; - pFollow = pNxt; + m_pFollow = pNxt; return pNxt; } @@ -2050,7 +2050,7 @@ sal_Bool SwTxtFrm::FormatQuick( bool bForceQuickFormat ) return sal_False; } - if( pFollow && nStart != ((SwTxtFrm*)pFollow)->GetOfst() ) + if( m_pFollow && nStart != (static_cast<SwTxtFrm*>(m_pFollow))->GetOfst() ) return sal_False; // kann z.B. durch Orphans auftreten (35083,35081) // Geschafft, wir sind durch ... diff --git a/sw/source/core/text/xmldump.cxx b/sw/source/core/text/xmldump.cxx index 2d76660..5a65799 100644 --- a/sw/source/core/text/xmldump.cxx +++ b/sw/source/core/text/xmldump.cxx @@ -314,8 +314,8 @@ void SwTxtFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer ) if ( HasFollow() ) xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "follow" ), "%p", GetFollow() ); - if ( pPrecede != NULL ) - xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%p", (SwTxtFrm*)pPrecede ); + if ( m_pPrecede != NULL ) + xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%p", (SwTxtFrm*)m_pPrecede ); } void SwSectionFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer ) @@ -324,8 +324,8 @@ void SwSectionFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer ) if ( HasFollow() ) xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "follow" ), "%p", GetFollow() ); - if ( pPrecede != NULL ) - xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%p", (SwSectionFrm*)pPrecede ); + if ( m_pPrecede != NULL ) + xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%p", (SwSectionFrm*)m_pPrecede ); } void SwTabFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer ) @@ -334,8 +334,8 @@ void SwTabFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer ) if ( HasFollow() ) xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "follow" ), "%p", GetFollow() ); - if ( pPrecede != NULL ) - xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%p", (SwTabFrm*)pPrecede ); + if ( m_pPrecede != NULL ) + xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%p", (SwTabFrm*)m_pPrecede ); } #endif
_______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits