summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2023-12-12 15:23:16 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2023-12-13 08:27:14 +0100
commitf625928c346109216045d08b4dda30dbada005f5 (patch)
treeae4bf3d29b6c85c8853cc2ae203e1b59e218be20 /svx
parent91b4bfee9d52a7aa169eec81aa017d03108e4026 (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.cxx26
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() );