summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/source/core/inc/frmtool.hxx14
-rw-r--r--sw/source/core/layout/frmtool.cxx27
-rw-r--r--sw/source/core/layout/laycache.cxx5
-rw-r--r--sw/source/core/layout/tabfrm.cxx21
-rw-r--r--sw/source/core/layout/wsfrm.cxx8
5 files changed, 47 insertions, 28 deletions
diff --git a/sw/source/core/inc/frmtool.hxx b/sw/source/core/inc/frmtool.hxx
index 1974338f7936..4e328ca32af9 100644
--- a/sw/source/core/inc/frmtool.hxx
+++ b/sw/source/core/inc/frmtool.hxx
@@ -150,9 +150,6 @@ void MakeFrames( SwDoc *pDoc, const SwNodeIndex &rSttIdx,
extern bool bObjsDirect;
-// prevent creation of Flys in InsertCnt_, e.g. for table headlines
-extern bool bDontCreateObjects;
-
// for FlyCnts, see SwFlyAtContentFrame::MakeAll()
extern bool bSetCompletePaintOnInvalidate;
@@ -161,9 +158,14 @@ SwTwips CalcRowRstHeight( SwLayoutFrame *pRow );
tools::Long CalcHeightWithFlys( const SwFrame *pFrame );
namespace sw {
-
-bool IsRightPageByNumber(SwRootFrame const& rLayout, sal_uInt16 nPageNum);
-
+ bool IsRightPageByNumber(SwRootFrame const& rLayout, sal_uInt16 nPageNum);
+ class FlyCreationSuppressor
+ {
+ const bool m_wasAlreadySuppressed;
+ public:
+ FlyCreationSuppressor(bool isAlreadySuppressedAllowed = true);
+ ~FlyCreationSuppressor();
+ };
} // namespace sw
SwPageFrame *InsertNewPage( SwPageDesc &rDesc, SwFrame *pUpper,
diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx
index c50061bcf68e..59429f55ddf2 100644
--- a/sw/source/core/layout/frmtool.cxx
+++ b/sw/source/core/layout/frmtool.cxx
@@ -79,8 +79,25 @@
using namespace ::com::sun::star;
+namespace {
+ // FIXME: would likely better be a member of SwRootFrame instead of a global flag
+ bool isFlyCreationSuppressed = false;
+}
+namespace sw {
+ FlyCreationSuppressor::FlyCreationSuppressor(bool wasAlreadySuppressedAllowed)
+ : m_wasAlreadySuppressed(isFlyCreationSuppressed)
+ {
+ (void)wasAlreadySuppressedAllowed;
+ assert(wasAlreadySuppressedAllowed || !isFlyCreationSuppressed);
+ isFlyCreationSuppressed = true;
+ }
+ FlyCreationSuppressor::~FlyCreationSuppressor()
+ {
+ isFlyCreationSuppressed = m_wasAlreadySuppressed;
+ }
+}
+
bool bObjsDirect = true;
-bool bDontCreateObjects = false;
bool bSetCompletePaintOnInvalidate = false;
sal_uInt8 StackHack::s_nCnt = 0;
@@ -1588,7 +1605,7 @@ void InsertCnt_( SwLayoutFrame *pLay, SwDoc *pDoc,
lcl_SetPos( *pFrame, *pLay );
pPrv = pFrame;
- if ( !pTable->empty() && bObjsDirect && !bDontCreateObjects )
+ if ( !pTable->empty() && bObjsDirect && !isFlyCreationSuppressed )
AppendObjs( pTable, nIndex, pFrame, pPage, pDoc );
}
else if ( pNd->IsTableNode() )
@@ -1893,7 +1910,7 @@ void InsertCnt_( SwLayoutFrame *pLay, SwDoc *pDoc,
assert(false); // actually a fly-section can't be deleted?
continue; // skip it
}
- if ( !pTable->empty() && bObjsDirect && !bDontCreateObjects )
+ if ( !pTable->empty() && bObjsDirect && !isFlyCreationSuppressed )
{
SwFlyFrame* pFly = pLay->FindFlyFrame();
if( pFly )
@@ -1922,7 +1939,7 @@ void InsertCnt_( SwLayoutFrame *pLay, SwDoc *pDoc,
if ( bPages ) // let the Flys connect to each other
{
- if ( !bDontCreateObjects )
+ if ( !isFlyCreationSuppressed )
AppendAllObjs( pTable, pLayout );
bObjsDirect = true;
}
@@ -2110,7 +2127,7 @@ void MakeFrames( SwDoc *pDoc, const SwNodeIndex &rSttIdx,
nEndIdx, pPrv, eMode );
// OD 23.06.2003 #108784# - correction: append objects doesn't
// depend on value of <bAllowMove>
- if( !bDontCreateObjects )
+ if( !isFlyCreationSuppressed )
{
const SwFrameFormats *pTable = pDoc->GetSpzFrameFormats();
if( !pTable->empty() )
diff --git a/sw/source/core/layout/laycache.cxx b/sw/source/core/layout/laycache.cxx
index b9f8b1e96dbd..1e4ae047b5fc 100644
--- a/sw/source/core/layout/laycache.cxx
+++ b/sw/source/core/layout/laycache.cxx
@@ -833,8 +833,7 @@ bool SwLayHelper::CheckInsert( sal_uLong nNodeIndex )
SwFrame *pPrv;
if( nRepeat > 0 )
{
- bDontCreateObjects = true; //frmtool
-
+ sw::FlyCreationSuppressor aSuppressor;
// Insert new headlines:
sal_uInt16 nRowIdx = 0;
SwRowFrame* pHeadline = nullptr;
@@ -849,8 +848,6 @@ bool SwLayHelper::CheckInsert( sal_uLong nNodeIndex )
++nRowIdx;
}
-
- bDontCreateObjects = false;
pPrv = pHeadline;
nRows = nRows + nRepeat;
}
diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index 384c79615348..c54b24d59e3d 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -1215,14 +1215,15 @@ bool SwTabFrame::Split( const SwTwips nCutPos, bool bTryToSplit, bool bTableRowK
pFoll->InsertBehind( GetUpper(), this );
// Repeat the headlines.
+ auto& rLines = GetTable()->GetTabLines();
for ( nRowCount = 0; nRowCount < nRepeat; ++nRowCount )
{
// Insert new headlines:
- bDontCreateObjects = true; //frmtool
- SwRowFrame* pHeadline = new SwRowFrame(
- *GetTable()->GetTabLines()[ nRowCount ], this );
- pHeadline->SetRepeatedHeadline( true );
- bDontCreateObjects = false;
+ SwRowFrame* pHeadline = new SwRowFrame(*rLines[nRowCount], this);
+ {
+ sw::FlyCreationSuppressor aSuppressor;
+ pHeadline->SetRepeatedHeadline(true);
+ }
pHeadline->InsertBefore( pFoll, nullptr );
SwPageFrame *pPage = pHeadline->FindPageFrame();
@@ -3377,12 +3378,14 @@ void SwTabFrame::UpdateAttr_( const SfxPoolItem *pOld, const SfxPoolItem *pNew,
// insert new headlines
const sal_uInt16 nNewRepeat = GetTable()->GetRowsToRepeat();
+ auto& rLines = GetTable()->GetTabLines();
for ( sal_uInt16 nIdx = 0; nIdx < nNewRepeat; ++nIdx )
{
- bDontCreateObjects = true; //frmtool
- SwRowFrame* pHeadline = new SwRowFrame( *GetTable()->GetTabLines()[ nIdx ], this );
- pHeadline->SetRepeatedHeadline( true );
- bDontCreateObjects = false;
+ SwRowFrame* pHeadline = new SwRowFrame(*rLines[nIdx], this);
+ {
+ sw::FlyCreationSuppressor aSuppressor;
+ pHeadline->SetRepeatedHeadline(true);
+ }
pHeadline->Paste( this, pLowerRow );
}
}
diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx
index 9bf5cddc6d2a..53bf49df5346 100644
--- a/sw/source/core/layout/wsfrm.cxx
+++ b/sw/source/core/layout/wsfrm.cxx
@@ -4494,10 +4494,10 @@ static void UnHideRedlines(SwRootFrame & rLayout,
// InsertCnt_ also checks for hidden sections
SwNodeIndex const start(rNodes, i);
SwNodeIndex const end(rNodes, j);
- assert(!bDontCreateObjects);
- bDontCreateObjects = true; // suppress here, to be called once
- ::MakeFrames(rLayout.GetFormat()->GetDoc(), start, end);
- bDontCreateObjects = false;
+ {
+ sw::FlyCreationSuppressor aSuppressor(false);
+ ::MakeFrames(rLayout.GetFormat()->GetDoc(), start, end);
+ }
i = j - 1; // will be incremented again
}
}