summaryrefslogtreecommitdiff
path: root/sw/source
diff options
context:
space:
mode:
authorXisco Fauli <xiscofauli@libreoffice.org>2019-03-26 00:48:12 +0100
committerMichael Stahl <Michael.Stahl@cib.de>2019-04-05 15:42:32 +0200
commitf15146021b722dda0cf10cb08de6e0a3c525168a (patch)
treeb8b5202ec657e8b7ccf9f970baf7217ee8633d67 /sw/source
parentb8412f1d8b70ee097f8cf00bf159514bd443ea07 (diff)
tdf#114306: Revert commits fixing this issue ( 6.1 only )
Revert "tdf#114306 fix crash caused by special document 2" This reverts commit d30eefb677b446886f7b5bab6de93d489ba63529. Revert "tdf#114306 fix crash caused by special document" This reverts commit e4400f4c4e267f8528df3a7d5a09623c888bd10c. Revert "tdf#114306 fix unexpected page break in row-spanned table" This reverts commit 18765b9fa739337d2d891513f6e2fb7c3ce23b50 Change-Id: Ifff799616f12ee428a3f923f6510b20059f5bc71 Reviewed-on: https://gerrit.libreoffice.org/69848 Tested-by: Jenkins Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
Diffstat (limited to 'sw/source')
-rw-r--r--sw/source/core/layout/findfrm.cxx8
-rw-r--r--sw/source/core/layout/flowfrm.cxx9
-rw-r--r--sw/source/core/layout/tabfrm.cxx67
3 files changed, 21 insertions, 63 deletions
diff --git a/sw/source/core/layout/findfrm.cxx b/sw/source/core/layout/findfrm.cxx
index b720d9936a45..c327ebfcab2c 100644
--- a/sw/source/core/layout/findfrm.cxx
+++ b/sw/source/core/layout/findfrm.cxx
@@ -1340,14 +1340,8 @@ bool SwFrame::IsMoveable( const SwLayoutFrame* _pLayoutFrame ) const
_pLayoutFrame->IsInDocBody() ||
_pLayoutFrame->IsInFootnote() )
{
- // If IsMovable() is called before a MoveFwd() the method
- // may return false if there is no NextCellLeaf. If
- // IsMovable() is called before a MoveBwd() the method may
- // return false if there is no PrevCellLeaf.
if ( _pLayoutFrame->IsInTab() && !IsTabFrame() &&
- ( !IsContentFrame() || (!const_cast<SwFrame*>(this)->GetNextCellLeaf()
- && !const_cast<SwFrame*>(this)->GetPrevCellLeaf()) )
- )
+ ( !IsContentFrame() || !const_cast<SwFrame*>(this)->GetNextCellLeaf() ) )
{
bRetVal = false;
}
diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx
index 4366c98af710..34a3258e68b4 100644
--- a/sw/source/core/layout/flowfrm.cxx
+++ b/sw/source/core/layout/flowfrm.cxx
@@ -2041,19 +2041,14 @@ bool SwFlowFrame::MoveBwd( bool &rbReformat )
const SwLayoutFrame* pUpperFrame = m_rThis.GetUpper();
while ( pUpperFrame )
{
- if ( pUpperFrame->IsTabFrame() || pUpperFrame->IsRowFrame() )
+ if ( pUpperFrame->IsTabFrame() )
{
return false;
}
// If the text frame is a follow-section-in-table, that can move
// backward as well.
bool bIsFollowSection = pUpperFrame->IsSctFrame() && static_cast<const SwSectionFrame*>(pUpperFrame)->GetPrecede();
-
- // If the text frame is a follow-in-table, that can move
- // backward as well.
- bool bIsFollow = const_cast<SwLayoutFrame*>(pUpperFrame)->GetPrevCellLeaf();
-
- if ( ( pUpperFrame->IsColumnFrame() && pUpperFrame->IsInSct() ) || bIsFollowSection || bIsFollow )
+ if ( ( pUpperFrame->IsColumnFrame() && pUpperFrame->IsInSct() ) || bIsFollowSection )
{
break;
}
diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index 8e3d9b1d93c3..d50e8211f492 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -164,7 +164,7 @@ void SwTabFrame::RegistFlys()
}
void SwInvalidateAll( SwFrame *pFrame, long nBottom );
-static bool lcl_RecalcRow( SwRowFrame* pRow, long nBottom );
+static void lcl_RecalcRow( SwRowFrame& rRow, long nBottom );
static bool lcl_ArrangeLowers( SwLayoutFrame *pLay, long lYStart, bool bInva );
// #i26945# - add parameter <_bOnlyRowsAndCells> to control
// that only row and cell frames are formatted.
@@ -290,7 +290,7 @@ static void lcl_InvalidateLowerObjs( SwLayoutFrame& _rLayoutFrame,
}
}
-// Local helper function to shrink all lowers of pRow to 0 height
+// Local helper function to shrink all lowers of rRow to 0 height
static void lcl_ShrinkCellsAndAllContent( SwRowFrame& rRow )
{
SwCellFrame* pCurrMasterCell = static_cast<SwCellFrame*>(rRow.Lower());
@@ -682,7 +682,7 @@ static bool lcl_RecalcSplitLine( SwRowFrame& rLastLine, SwRowFrame& rFollowLine,
rLastLine.SetInSplit();
// Do the recalculation
- lcl_RecalcRow( &rLastLine, LONG_MAX );
+ lcl_RecalcRow( rLastLine, LONG_MAX );
// #115759# - force a format of the last line in order to
// get the correct height.
rLastLine.InvalidateSize();
@@ -1567,8 +1567,7 @@ static bool lcl_InnerCalcLayout( SwFrame *pFrame,
return bRet;
}
-// returns false if pRow is invalid
-static bool lcl_RecalcRow( SwRowFrame* pRow, long nBottom )
+static void lcl_RecalcRow( SwRowFrame& rRow, long nBottom )
{
// FME 2007-08-30 #i81146# new loop control
int nLoopControlRuns_1 = 0;
@@ -1582,14 +1581,14 @@ static bool lcl_RecalcRow( SwRowFrame* pRow, long nBottom )
int nLoopControlRuns_2 = 0;
sal_uInt16 nLoopControlStage_2 = 0;
- while( lcl_InnerCalcLayout( pRow, nBottom ) )
+ while( lcl_InnerCalcLayout( &rRow, nBottom ) )
{
if ( ++nLoopControlRuns_2 > nLoopControlMax )
{
SAL_WARN_IF(nLoopControlStage_2 == 0, "sw.layout", "LoopControl_2 in lcl_RecalcRow: Stage 1!");
SAL_WARN_IF(nLoopControlStage_2 == 1, "sw.layout", "LoopControl_2 in lcl_RecalcRow: Stage 2!!");
SAL_WARN_IF(nLoopControlStage_2 >= 2, "sw.layout", "LoopControl_2 in lcl_RecalcRow: Stage 3!!!");
- pRow->ValidateThisAndAllLowers( nLoopControlStage_2++ );
+ rRow.ValidateThisAndAllLowers( nLoopControlStage_2++ );
nLoopControlRuns_2 = 0;
if( nLoopControlStage_2 > 2 )
break;
@@ -1602,39 +1601,14 @@ static bool lcl_RecalcRow( SwRowFrame* pRow, long nBottom )
{
// #115759# - force another format of the
// lowers, if at least one of it was invalid.
-
- // tdf#114306 writer may crash because pRow points to a deleted SwRowFrame
- SwRowFrame* pOriginalRow = pRow;
- OSL_ENSURE(pOriginalRow->GetUpper() && pOriginalRow->GetUpper()->IsTabFrame(), "No table");
- SwTabFrame* pOriginalTab = static_cast<SwTabFrame*>(pRow->GetUpper());
-
- bCheck = SwContentFrame::CalcLowers( pRow, pRow->GetUpper(), nBottom, true );
-
- bool bRowStillExists = false;
- SwFrame* pTestRow = pOriginalTab->Lower();
-
- while (pTestRow)
- {
- if (pTestRow == pRow)
- {
- bRowStillExists = true;
- break;
- }
- pTestRow = pTestRow->GetNext();
- }
-
- if (!bRowStillExists)
- {
- SAL_WARN("sw.layout", "no row anymore at " << pRow);
- return false;
- }
+ bCheck = SwContentFrame::CalcLowers( &rRow, rRow.GetUpper(), nBottom, true );
// NEW TABLES
// First we calculate the cells with row span of < 1, afterwards
// all cells with row span of > 1:
for ( int i = 0; i < 2; ++i )
{
- SwCellFrame* pCellFrame = static_cast<SwCellFrame*>(pRow->Lower());
+ SwCellFrame* pCellFrame = static_cast<SwCellFrame*>(rRow.Lower());
while ( pCellFrame )
{
const bool bCalc = 0 == i ?
@@ -1660,7 +1634,7 @@ static bool lcl_RecalcRow( SwRowFrame* pRow, long nBottom )
SAL_WARN_IF(nLoopControlStage_1 == 0, "sw.layout", "LoopControl_1 in lcl_RecalcRow: Stage 1!");
SAL_WARN_IF(nLoopControlStage_1 == 1, "sw.layout", "LoopControl_1 in lcl_RecalcRow: Stage 2!!");
SAL_WARN_IF(nLoopControlStage_1 >= 2, "sw.layout", "LoopControl_1 in lcl_RecalcRow: Stage 3!!!");
- pRow->ValidateThisAndAllLowers( nLoopControlStage_1++ );
+ rRow.ValidateThisAndAllLowers( nLoopControlStage_1++ );
nLoopControlRuns_1 = 0;
if( nLoopControlStage_1 > 2 )
break;
@@ -1670,8 +1644,7 @@ static bool lcl_RecalcRow( SwRowFrame* pRow, long nBottom )
}
}
break;
- } while (true);
- return true;
+ } while( true );
}
static void lcl_RecalcTable( SwTabFrame& rTab,
@@ -1686,7 +1659,7 @@ static void lcl_RecalcTable( SwTabFrame& rTab,
rNotify.SetLowersComplete( true );
}
::SwInvalidatePositions( pFirstRow, LONG_MAX );
- lcl_RecalcRow( static_cast<SwRowFrame*>(pFirstRow), LONG_MAX );
+ lcl_RecalcRow( static_cast<SwRowFrame&>(*pFirstRow), LONG_MAX );
}
}
@@ -2152,7 +2125,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext)
{
::SwInvalidateAll( pLastLine, LONG_MAX );
SetRebuildLastLine( true );
- lcl_RecalcRow( static_cast<SwRowFrame*>(pLastLine), LONG_MAX );
+ lcl_RecalcRow( static_cast<SwRowFrame&>(*pLastLine), LONG_MAX );
SetRebuildLastLine( false );
}
@@ -2278,7 +2251,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext)
}
else if (m_bONECalcLowers)
{
- lcl_RecalcRow( static_cast<SwRowFrame*>(Lower()), LONG_MAX );
+ lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), LONG_MAX );
m_bONECalcLowers = false;
}
}
@@ -2301,7 +2274,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext)
}
else if (m_bONECalcLowers)
{
- lcl_RecalcRow( static_cast<SwRowFrame*>(Lower()), LONG_MAX );
+ lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), LONG_MAX );
m_bONECalcLowers = false;
}
@@ -2358,7 +2331,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext)
// 1. Try: bTryToSplit = true => Try to split the row.
// 2. Try: bTryToSplit = false => Split the table between the rows.
- if ((pFirstNonHeadlineRow && pFirstNonHeadlineRow->GetNext()) || bTryToSplit )
+ if ( pFirstNonHeadlineRow->GetNext() || bTryToSplit )
{
SwTwips nDeadLine = aRectFnSet.GetPrtBottom(*GetUpper());
if( IsInSct() || GetUpper()->IsInTab() ) // TABLE IN TABLE)
@@ -2367,11 +2340,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext)
{
SetInRecalcLowerRow( true );
- SwRowFrame* pRow = static_cast<SwRowFrame*>(Lower());
- if (!lcl_RecalcRow(pRow, nDeadLine))
- {
- pFirstNonHeadlineRow = GetFirstNonHeadlineRow();
- }
+ ::lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), nDeadLine );
SetInRecalcLowerRow( false );
}
m_bLowersFormatted = true;
@@ -2471,7 +2440,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext)
// to nDeadLine may not be enough.
if ( bSplitError && bTryToSplit ) // no restart if we did not try to split: i72847, i79426
{
- lcl_RecalcRow( static_cast<SwRowFrame*>(Lower()), LONG_MAX );
+ lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), LONG_MAX );
setFrameAreaPositionValid(false);
bTryToSplit = false;
continue;
@@ -2512,7 +2481,7 @@ void SwTabFrame::MakeAll(vcl::RenderContext* pRenderContext)
// its content.
const bool bOldJoinLock = GetFollow()->IsJoinLocked();
GetFollow()->LockJoin();
- ::lcl_RecalcRow( static_cast<SwRowFrame*>(GetFollow()->Lower()),
+ ::lcl_RecalcRow( static_cast<SwRowFrame&>(*GetFollow()->Lower()),
fnRectX.GetBottom(GetFollow()->GetUpper()->getFrameArea()) );
// #i43913#
// #i63632# Do not unlock the