diff --git a/src/Mod/Spreadsheet/App/Cell.cpp b/src/Mod/Spreadsheet/App/Cell.cpp
index 1d4aef18d0..5bdfde67d3 100644
--- a/src/Mod/Spreadsheet/App/Cell.cpp
+++ b/src/Mod/Spreadsheet/App/Cell.cpp
@@ -461,8 +461,8 @@ void Cell::setSpans(int rows, int columns)
if (rows != rowSpan || columns != colSpan) {
PropertySheet::AtomicPropertyChange signaller(*owner);
- rowSpan = rows;
- colSpan = columns;
+ rowSpan = (rows == -1 ? 1 : rows);
+ colSpan = (columns == -1 ? 1 : columns);
setUsed(SPANS_SET, (rowSpan != 1 || colSpan != 1) );
setUsed(SPANS_UPDATED);
}
diff --git a/src/Mod/Spreadsheet/App/PropertySheet.cpp b/src/Mod/Spreadsheet/App/PropertySheet.cpp
index 051834d183..4e9c26dde5 100644
--- a/src/Mod/Spreadsheet/App/PropertySheet.cpp
+++ b/src/Mod/Spreadsheet/App/PropertySheet.cpp
@@ -552,7 +552,14 @@ void PropertySheet::moveCell(CellAddress currPos, CellAddress newPos, std::mapsecond;
+ int rows, columns;
+ // Get merged cell data
+ cell->getSpans(rows, columns);
+
+ // Remove merged cell data
+ splitCell(currPos);
+
// Remove from old
removeDependencies(currPos);
data.erase(currPos);
@@ -561,6 +568,15 @@ void PropertySheet::moveCell(CellAddress currPos, CellAddress newPos, std::mapmoveAbsolute(newPos);
data[newPos] = cell;
+
+ if (rows > 1 || columns > 1) {
+ CellAddress toPos(newPos.row() + rows - 1, newPos.col() + columns - 1);
+
+ mergeCells(newPos, toPos);
+ }
+ else
+ cell->setSpans(-1, -1);
+
addDependencies(newPos);
setDirty(newPos);
@@ -875,7 +891,7 @@ void PropertySheet::splitCell(CellAddress address)
mergedCells.erase(CellAddress(r, c));
}
- setSpans(anchor, 1, 1);
+ setSpans(anchor, -1, -1);
}
void PropertySheet::getSpans(CellAddress address, int & rows, int & cols) const
@@ -885,7 +901,10 @@ void PropertySheet::getSpans(CellAddress address, int & rows, int & cols) const
if (i != mergedCells.end()) {
CellAddress anchor = i->second;
- cellAt(anchor)->getSpans(rows, cols);
+ if (anchor == address)
+ cellAt(anchor)->getSpans(rows, cols);
+ else
+ rows = cols = 1;
}
else {
rows = cols = 1;