From 5a70acd99f557d84bb5b3766d749b52b1774b9ff Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Mon, 26 Jun 2017 15:01:36 +0200 Subject: Revert "tdf#108524 sw: attempt to split section frames inside table cells" This reverts commit f991b842addddeada6dc45c4054deeca5aa7f17b. It doesn't really work and crashes on ooo61225-1.sxw in 1 in SwFrame::FindTabFrame() (this=0x0) at sw/source/core/inc/frame.hxx:913 2 in SwFrame::GetNextSctLeaf(MakePageType) (this=0x3137130, eMakePage=MAKEPAGE_INSERT) at sw/source/core/layout/sectfrm.cxx:1529 3 in SwFrame::GetLeaf(MakePageType, bool) (this=0x3137130, eMakePage=MAKEPAGE_INSERT, bFwd=true) at sw/source/core/layout/flowfrm.cxx:805 4 in SwFlowFrame::MoveFwd(bool, bool, bool) (this=0x31371d8, bMakePage=true, bPageBreak=false, bMoveAlways=false) at sw/source/core/layout/flowfrm.cxx:1861 The code added in GetNextSctLeaf() looks unfinished to me: it assumes that something else has added a follow-frame for the SwCellFrame containing the SwSectionFrame already, but AFAICT the GetNextSctLeaf() function is responsible for creating that SwCellFrame follow. The caller (in GetLeaf()) specifically checks for this condition and avoids calling GetNextCellLeaf(). (cherry picked from commit 272d5a02a3de2350f8af7a93281b651316b24ae5) Conflicts: sw/qa/extras/uiwriter/uiwriter.cxx Change-Id: I51875830771f07f5d2fec293f6063c73fc68d468 --- sw/qa/extras/uiwriter/uiwriter.cxx | 1 + sw/source/core/inc/frame.hxx | 8 -------- sw/source/core/layout/findfrm.cxx | 12 ------------ sw/source/core/layout/sectfrm.cxx | 32 ++++---------------------------- 4 files changed, 5 insertions(+), 48 deletions(-) diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index 7cd2dd41c39b..e2001dc3ef81 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -305,6 +305,7 @@ public: CPPUNIT_TEST(testTdf84695NormalChar); CPPUNIT_TEST(testParagraphOfTextRange); CPPUNIT_TEST(testTdf108524); +// CPPUNIT_TEST(testTdf108524); CPPUNIT_TEST(testTableInSection); CPPUNIT_TEST_SUITE_END(); diff --git a/sw/source/core/inc/frame.hxx b/sw/source/core/inc/frame.hxx index 37bc0c08f09c..df85c55ae326 100644 --- a/sw/source/core/inc/frame.hxx +++ b/sw/source/core/inc/frame.hxx @@ -42,7 +42,6 @@ class SwFootnoteFrame; class SwFootnoteBossFrame; class SwTabFrame; class SwRowFrame; -class SwCellFrame; class SwFlowFrame; class SwContentFrame; class SfxPoolItem; @@ -228,7 +227,6 @@ class SW_DLLPUBLIC SwFrame: public SwClient, public SfxBroadcaster const SwLayoutFrame* ImplGetNextLayoutLeaf( bool bFwd ) const; SwPageFrame* ImplFindPageFrame(); - SwCellFrame* ImplFindCellFrame(); protected: SwSortedObjs* mpDrawObjs; // draw objects, can be 0 @@ -772,12 +770,6 @@ public: virtual void dumpAsXmlAttributes(xmlTextWriterPtr writer) const; void dumpChildrenAsXml(xmlTextWriterPtr writer) const; bool IsCollapse() const; - - /// Find the nearest table cell frame that contains us, if any. - SwCellFrame* FindCellFrame() - { - return IsInTab() ? ImplFindCellFrame() : nullptr; - } }; inline bool SwFrame::IsInDocBody() const diff --git a/sw/source/core/layout/findfrm.cxx b/sw/source/core/layout/findfrm.cxx index d0981628b2eb..fb5854a80c9c 100644 --- a/sw/source/core/layout/findfrm.cxx +++ b/sw/source/core/layout/findfrm.cxx @@ -459,18 +459,6 @@ SwTabFrame* SwFrame::ImplFindTabFrame() return static_cast(pRet); } -SwCellFrame* SwFrame::ImplFindCellFrame() -{ - SwFrame *pRet = this; - while (!pRet->IsCellFrame()) - { - pRet = pRet->GetUpper(); - if (!pRet) - return nullptr; - } - return static_cast(pRet); -} - SwSectionFrame* SwFrame::ImplFindSctFrame() { SwFrame *pRet = this; diff --git a/sw/source/core/layout/sectfrm.cxx b/sw/source/core/layout/sectfrm.cxx index f23a93c3ebd3..86dac9e92664 100644 --- a/sw/source/core/layout/sectfrm.cxx +++ b/sw/source/core/layout/sectfrm.cxx @@ -22,7 +22,6 @@ #include #include #include "sectfrm.hxx" -#include "cellfrm.hxx" #include "section.hxx" #include #include "rootfrm.hxx" @@ -588,16 +587,6 @@ namespace return pLayFrame->GetNextLayoutLeaf(); return pLayFrame; } - - /// Checks if pFrame is in a table, which itself is in a section. - bool IsInTableInSection(SwFrame* pFrame) - { - if (!pFrame->IsInTab()) - return false; - - // The frame is in a table, see if the table is in a section. - return pFrame->FindTabFrame()->IsInSct(); - } } void SwSectionFrame::MoveContentAndDelete( SwSectionFrame* pDel, bool bSave ) @@ -1450,9 +1439,9 @@ SwLayoutFrame *SwFrame::GetNextSctLeaf( MakePageType eMakePage ) return static_cast(static_cast(GetUpper()->GetNext())->Lower()); if( GetUpper()->IsColBodyFrame() && GetUpper()->GetUpper()->GetNext() ) return static_cast(static_cast(GetUpper()->GetUpper()->GetNext())->Lower()); - // Inside a table-in-section, or sections of headers/footers, there can be only + // Inside a section, in tables, or sections of headers/footers, there can be only // one column shift be made, one of the above shortcuts should have applied! - if( IsInTableInSection(GetUpper()) || FindFooterOrHeader() ) + if( GetUpper()->IsInTab() || FindFooterOrHeader() ) return nullptr; SwSectionFrame *pSect = FindSctFrame(); @@ -1509,9 +1498,6 @@ SwLayoutFrame *SwFrame::GetNextSctLeaf( MakePageType eMakePage ) const bool bBody = IsInDocBody(); const bool bFootnotePage = FindPageFrame()->IsFootnotePage(); - // The "pLayLeaf is in a table" case is rejected by default, so that it - // can't happen that we try to move a table to one of its own cells. - bool bLayLeafTableAllowed = false; SwLayoutFrame *pLayLeaf; // A shortcut for TabFrames such that not all cells need to be visited if( bWrongPage ) @@ -1521,16 +1507,6 @@ SwLayoutFrame *SwFrame::GetNextSctLeaf( MakePageType eMakePage ) SwContentFrame* pTmpCnt = static_cast(this)->FindLastContent(); pLayLeaf = pTmpCnt ? pTmpCnt->GetUpper() : nullptr; } - else if (IsInTab() && !IsInTableInSection(this)) - { - // This frame is in a table-not-in-section, its follow should be - // inserted under the follow of the frame's cell. - pLayLeaf = FindCellFrame()->GetFollowCell(); - if (pLayLeaf->FindTabFrame() == FindTabFrame()) - SAL_WARN("sw.layout", "my table frame and my follow's table frame is the same"); - // In this case pLayLeaf pointing to an in-table frame is OK. - bLayLeafTableAllowed = true; - } else { pLayLeaf = GetNextLayoutLeaf(); @@ -1558,10 +1534,10 @@ SwLayoutFrame *SwFrame::GetNextSctLeaf( MakePageType eMakePage ) pLayLeaf = nullptr; continue; } - // Once inBody always inBody, don't step into tables-in-sections and not into other sections + // Once inBody always inBody, don't step into tables and not into other sections if ( (bBody && !pLayLeaf->IsInDocBody()) || (IsInFootnote() != pLayLeaf->IsInFootnote() ) || - (pLayLeaf->IsInTab() && !bLayLeafTableAllowed) || + pLayLeaf->IsInTab() || ( pLayLeaf->IsInSct() && ( !pSect->HasFollow() || pSect->GetFollow() != pLayLeaf->FindSctFrame() ) ) ) { -- cgit