Bartosz Dziewoński has uploaded a new change for review.
https://gerrit.wikimedia.org/r/172193
Change subject: [WIP] Don't un-merge spanned cells when spanned cell is removed
......................................................................
[WIP] Don't un-merge spanned cells when spanned cell is removed
Previously we inserted regular cells in place of every placeholder in
the matrix, which meant that deleting a row which happened to contain
a rowspanned cell would split the rest of the cell apart. (Same for
columns.)
Now we only replace one of the placeholders with a new spanned cell,
appropriately smaller. The problem is, it should inherit all of the
properties and content of the removed cell, but it currently doesn't.
I need to figure that out.
Bug: 73213
Change-Id: I62e56657c18bc67be859ece882770ce008bc3838
---
M src/dm/nodes/ve.dm.TableCellNode.js
M src/ui/actions/ve.ui.TableAction.js
2 files changed, 27 insertions(+), 15 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor
refs/changes/93/172193/1
diff --git a/src/dm/nodes/ve.dm.TableCellNode.js
b/src/dm/nodes/ve.dm.TableCellNode.js
index ba267d1..e1ead94 100644
--- a/src/dm/nodes/ve.dm.TableCellNode.js
+++ b/src/dm/nodes/ve.dm.TableCellNode.js
@@ -88,7 +88,10 @@
/**
* Creates data that can be inserted into the model to create a new table cell.
*
- * @param {Object} [options] An object with property 'style' which can be
either 'header' or 'data'.
+ * @param {Object} [options]
+ * @param {string} [options.style='data'] Either 'header' or 'data'
+ * @param {number} [options.rowspan=1]
+ * @param {number} [options.colspan=1]
* @return {Array} Model data for a new table cell
*/
ve.dm.TableCellNode.static.createData = function ( options ) {
@@ -97,7 +100,9 @@
{
type: 'tableCell',
attributes: {
- style: options.style || 'data'
+ style: options.style || 'data',
+ rowspan: options.rowspan || 1,
+ colspan: options.colspan || 1
}
},
{ type: 'paragraph' },
diff --git a/src/ui/actions/ve.ui.TableAction.js
b/src/ui/actions/ve.ui.TableAction.js
index 8126098..8199f2c 100644
--- a/src/ui/actions/ve.ui.TableAction.js
+++ b/src/ui/actions/ve.ui.TableAction.js
@@ -446,10 +446,10 @@
surfaceModel = this.surface.getModel();
// Deleting cells can have two additional consequences:
- // 1. The cell is a Placeholder. The owner's span might be decreased.
+ // 1. The cell is a Placeholder. The owner's span must be decreased.
// 2. The cell is owner of placeholders which get orphaned by the
deletion.
- // New, empty cells must be inserted to replace the placeholders and
keep the
- // table in proper shape.
+ // The first of the placeholders now becomes the real cell, with the
span adjusted.
+ // It should inherit all of its properties and content, but
currently doesn't.
// Insertions and deletions of cells must be done in an appropriate
order, so that the transactions
// do not interfere with each other. To achieve that, we record
insertions and deletions and
// sort them by the position of the cell (row, column) in the table
matrix.
@@ -492,13 +492,14 @@
}
endRow = cell.row + cell.node.getRowspan() - 1;
endCol = cell.col + cell.node.getColspan() - 1;
-
+
// Record the insertion to apply it later
- for ( row = startRow; row <= endRow; row++ ) {
- for ( col = startCol; col <= endCol; col++ ) {
- actions.push( { action: 'insert', cell:
matrix.getCell( row, col ) } );
- }
- }
+ actions.push( {
+ action: 'insert',
+ cell: matrix.getCell( startRow, startCol ),
+ colspan: 1 + endCol - startCol,
+ rowspan: 1 + endRow - startRow
+ } );
}
// Cell nodes only get deleted when deleting columns (otherwise
row nodes)
@@ -518,7 +519,9 @@
// First replace orphaned placeholders which are below the last
deleted row,
// thus, this works with regard to transaction offsets
for ( i = 0; i < actions.length; i++ ) {
- txs.push( this.replacePlaceholder( matrix,
actions[i].cell ) );
+ txs.push( this.replacePlaceholder(
+ matrix, actions[i].cell, actions[i].colspan,
actions[i].rowspan
+ ) );
}
// Remove rows in reverse order to have valid transaction
offsets
for ( row = maxIndex; row >= minIndex; row-- ) {
@@ -528,7 +531,9 @@
} else {
for ( i = 0; i < actions.length; i++ ) {
if ( actions[i].action === 'insert' ) {
- txs.push( this.replacePlaceholder( matrix,
actions[i].cell ) );
+ txs.push( this.replacePlaceholder(
+ matrix, actions[i].cell,
actions[i].colspan, actions[i].rowspan
+ ) );
} else {
txs.push( ve.dm.Transaction.newFromRemoval(
surfaceModel.getDocument(), actions[i].cell.node.getOuterRange() ) );
}
@@ -542,9 +547,11 @@
*
* @param {ve.dm.TableMatrix} matrix Table matrix
* @param {ve.dm.TableMatrixCell} placeholder Placeholder cell to replace
+ * @param {number} [colspan] Column span to set
+ * @param {number} [rowspan] Row span to set
* @return {ve.dm.Transaction} Transaction
*/
-ve.ui.TableAction.prototype.replacePlaceholder = function ( matrix,
placeholder ) {
+ve.ui.TableAction.prototype.replacePlaceholder = function ( matrix,
placeholder, colspan, rowspan ) {
var range, offset, data, style,
// For inserting the new cell a reference cell node
// which is used to get an insertion offset.
@@ -561,7 +568,7 @@
offset = range.start;
style = placeholder.node.getStyle();
}
- data = ve.dm.TableCellNode.static.createData( { style: style } );
+ data = ve.dm.TableCellNode.static.createData( { style: style, colspan:
colspan, rowspan: rowspan } );
return ve.dm.Transaction.newFromInsertion( surfaceModel.getDocument(),
offset, data );
};
--
To view, visit https://gerrit.wikimedia.org/r/172193
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I62e56657c18bc67be859ece882770ce008bc3838
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Bartosz Dziewoński <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits