diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2023-12-12 15:23:16 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2023-12-13 08:27:14 +0100 |
commit | f625928c346109216045d08b4dda30dbada005f5 (patch) | |
tree | ae4bf3d29b6c85c8853cc2ae203e1b59e218be20 /svx | |
parent | 91b4bfee9d52a7aa169eec81aa017d03108e4026 (diff) |
tdf#158636 Wrong border behaviour when cells are merged
regression from
commit e27d4cc31e04be4c47b5085dfa2363ee45457e8a
Author: Noel Grandin <noel.grandin@collabora.co.uk>
Date: Mon Jun 19 12:23:55 2023 +0200
tdf#150534 reduce the memory consumption of cells when calculating
where I accidentally removed a line in lclSetMergedRange that
set mbMergedOrg to true.
And then the singlevalfields plugin spotted that
mbMergedOrig had only value, and so it got removed in:
commit 884a2cd39a7c0433a5bbbf4e83e2a9b16cdad71c
Author: Noel Grandin <noel.grandin@collabora.co.uk>
Date: Fri Jun 30 15:36:51 2023 +0200
loplugin:singlevalfields
Change-Id: I9fc057f63e14df36c73d25c421ddbec72f7723e7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160619
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/dialog/framelinkarray.cxx | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/svx/source/dialog/framelinkarray.cxx b/svx/source/dialog/framelinkarray.cxx index 21afef6441f5..fa5829438698 100644 --- a/svx/source/dialog/framelinkarray.cxx +++ b/svx/source/dialog/framelinkarray.cxx @@ -64,6 +64,7 @@ public: SvxRotateMode meRotMode; double mfOrientation; + bool mbMergeOrig; bool mbOverlapX; bool mbOverlapY; @@ -88,7 +89,7 @@ public: const Style& GetStyleTLBR() const { return maTLBR; } const Style& GetStyleBLTR() const { return maBLTR; } - bool IsMerged() const { return mbOverlapX || mbOverlapY; } + bool IsMerged() const { return mbMergeOrig || mbOverlapX || mbOverlapY; } bool IsRotated() const { return mfOrientation != 0.0; } void MirrorSelfX(); @@ -206,6 +207,7 @@ Cell::Cell() : mnAddBottom( 0 ), meRotMode(SvxRotateMode::SVX_ROTATE_MODE_STANDARD ), mfOrientation( 0.0 ), + mbMergeOrig( false ), mbOverlapX( false ), mbOverlapY( false ) { @@ -229,6 +231,7 @@ bool Cell::operator==(const Cell& rOther) const && mnAddBottom == rOther.mnAddBottom && meRotMode == rOther.meRotMode && mfOrientation == rOther.mfOrientation + && mbMergeOrig == rOther.mbMergeOrig && mbOverlapX == rOther.mbOverlapX && mbOverlapY == rOther.mbOverlapY; } @@ -248,6 +251,7 @@ size_t Cell::hashCode() const o3tl::hash_combine(seed, mnAddBottom); o3tl::hash_combine(seed, meRotMode); o3tl::hash_combine(seed, mfOrientation); + o3tl::hash_combine(seed, mbMergeOrig); o3tl::hash_combine(seed, mbOverlapX); o3tl::hash_combine(seed, mbOverlapY); return seed; @@ -352,7 +356,7 @@ struct ArrayImpl bool HasCellRotation() const; - Cell* createOrFind(const Cell& rCell); + const Cell* createOrFind(const Cell& rCell); }; static void lclSetMergedRange( ArrayImpl& rImpl, CellVec& rCells, sal_Int32 nWidth, sal_Int32 nFirstCol, sal_Int32 nFirstRow, sal_Int32 nLastCol, sal_Int32 nLastRow ) @@ -363,12 +367,14 @@ static void lclSetMergedRange( ArrayImpl& rImpl, CellVec& rCells, sal_Int32 nWid { const Cell* pCell = rCells[ nRow * nWidth + nCol ]; Cell aTempCell(*pCell); + aTempCell.mbMergeOrig = false; aTempCell.mbOverlapX = nCol > nFirstCol; aTempCell.mbOverlapY = nRow > nFirstRow; rCells[ nRow * nWidth + nCol ] = rImpl.createOrFind(aTempCell); } } Cell aTempCell(*rCells[ nFirstRow * nWidth + nFirstCol ]); + aTempCell.mbMergeOrig = true; rCells[ nFirstRow * nWidth + nFirstCol ] = rImpl.createOrFind(aTempCell); } @@ -399,7 +405,7 @@ ArrayImpl::~ArrayImpl() delete pCell; } -Cell* ArrayImpl::createOrFind(const Cell& rCell) +const Cell* ArrayImpl::createOrFind(const Cell& rCell) { auto it = maRegisteredCells.find(const_cast<Cell*>(&rCell)); if (it != maRegisteredCells.end()) @@ -1142,6 +1148,20 @@ void Array::MirrorSelfX() aNewCells.push_back( mxImpl->createOrFind(aTempCell) ); } } + for( nRow = 0; nRow < mxImpl->mnHeight; ++nRow ) + { + for( nCol = 0; nCol < mxImpl->mnWidth; ++nCol ) + { + if( mxImpl->GetCell( nCol, nRow )->mbMergeOrig ) + { + sal_Int32 nLastCol = mxImpl->GetMergedLastCol( nCol, nRow ); + sal_Int32 nLastRow = mxImpl->GetMergedLastRow( nCol, nRow ); + lclSetMergedRange( *mxImpl, aNewCells, mxImpl->mnWidth, + mxImpl->GetMirrorCol( nLastCol ), nRow, + mxImpl->GetMirrorCol( nCol ), nLastRow ); + } + } + } mxImpl->maCells.swap( aNewCells ); std::reverse( mxImpl->maWidths.begin(), mxImpl->maWidths.end() ); |