[MediaWiki-commits] [Gerrit] Implement ve.dm.Selection#getCoveringRange - change (VisualEditor/VisualEditor)
jenkins-bot has submitted this change and it was merged. Change subject: Implement ve.dm.Selection#getCoveringRange .. Implement ve.dm.Selection#getCoveringRange Change-Id: I8512e6f67ca7025f8890663c10b4d69cb8063dd0 --- M src/ce/nodes/ve.ce.SectionNode.js M src/ce/ve.ce.Surface.js M src/dm/selections/ve.dm.LinearSelection.js M src/dm/selections/ve.dm.NullSelection.js M src/dm/selections/ve.dm.TableSelection.js M src/dm/ve.dm.Selection.js M src/ui/dialogs/ve.ui.FindAndReplaceDialog.js 7 files changed, 46 insertions(+), 13 deletions(-) Approvals: Jforrester: Looks good to me, approved jenkins-bot: Verified diff --git a/src/ce/nodes/ve.ce.SectionNode.js b/src/ce/nodes/ve.ce.SectionNode.js index 3238729..3618db4 100644 --- a/src/ce/nodes/ve.ce.SectionNode.js +++ b/src/ce/nodes/ve.ce.SectionNode.js @@ -72,10 +72,10 @@ * @param {ve.dm.Selection} selection Selection */ ve.ce.SectionNode.prototype.onSurfaceModelSelect = function ( selection ) { - var ranges = selection.getRanges(), + var coveringRange = selection.getCoveringRange(), sectionNode = this; - if ( ranges.length && this.model.getRange().containsRange( ranges[ 0 ] ) ) { + if ( coveringRange && this.model.getRange().containsRange( new ve.Range( coveringRange.start ) ) ) { // Only set this as the active node if active node is empty, or not a // descendent of this node. if ( !this.surface.getActiveNode() || !this.surface.getActiveNode().traverseUpstream( function ( node ) { return node !== sectionNode; } ) ) { diff --git a/src/ce/ve.ce.Surface.js b/src/ce/ve.ce.Surface.js index 735806a..7940ccc 100644 --- a/src/ce/ve.ce.Surface.js +++ b/src/ce/ve.ce.Surface.js @@ -1696,8 +1696,15 @@ documentModel = surfaceModel.getDocument(); if ( selection instanceof ve.dm.LinearSelection ) { - range = selection.getRanges()[ 0 ]; + // Pasting over a linear selection? Remove first. + if ( !selection.isCollapsed() ) { + tx = ve.dm.Transaction.newFromRemoval( documentModel, selection.getRange() ); + selection = selection.translateByTransaction( tx ); + surfaceModel.change( tx, selection ); + } + range = selection.getRange(); } else if ( selection instanceof ve.dm.TableSelection ) { + // Selection removal is handled in after paste for tables (depends on pasted content) range = new ve.Range( selection.getRanges()[ 0 ].start ); } else { e.preventDefault(); @@ -1718,14 +1725,6 @@ .replace( /^[\s\S]*/, '' ) .replace( /[\s\S]*$/, '' ); } - } - - // Pasting into a range? Remove first. - if ( !range.isCollapsed() ) { - tx = ve.dm.Transaction.newFromRemoval( documentModel, range ); - selection = selection.translateByTransaction( tx ); - surfaceModel.change( tx, selection ); - range = selection.getRanges()[ 0 ]; } // Save scroll position before changing focus to "offscreen" paste target @@ -1940,6 +1939,7 @@ return; } + // Range to remove range = selection.getRanges()[ 0 ]; if ( slice ) { @@ -2767,7 +2767,7 @@ return; } - sequences = this.getSurface().sequenceRegistry.findMatching( model.getDocument().data, selection.getModel().getRanges()[ 0 ].end ); + sequences = this.getSurface().sequenceRegistry.findMatching( model.getDocument().data, selection.getModel().getCoveringRange().end ); // sequences.length will likely be 0 or 1 so don't cache for ( i = 0; i < sequences.length; i++ ) { diff --git a/src/dm/selections/ve.dm.LinearSelection.js b/src/dm/selections/ve.dm.LinearSelection.js index 6f475d7..e97d81c 100644 --- a/src/dm/selections/ve.dm.LinearSelection.js +++ b/src/dm/selections/ve.dm.LinearSelection.js @@ -111,6 +111,13 @@ }; /** + * @inheritdoc + */ +ve.dm.LinearSelection.prototype.getCoveringRange = function () { + return this.range; +}; + +/** * Get the range for this selection * * @return {ve.Range} Range diff --git a/src/dm/selections/ve.dm.NullSelection.js b/src/dm/selections/ve.dm.NullSelection.js index d9023aa..7f0a370 100644 --- a/src/dm/selections/ve.dm.NullSelection.js +++ b/src/dm/selections/ve.dm.NullSelection.js @@ -83,6 +83,13 @@ /** * @inheritdoc */ +ve.dm.NullSelection.prototype.getCoveringRange = function () { + return null; +}; + +/** + * @inheritdoc + */ ve.dm.NullSelection.prototype.equals = function ( other ) { return other instanceof ve.dm.NullSelection && this.getDocument() === other.getDocument(); diff --git
[MediaWiki-commits] [Gerrit] Implement ve.dm.Selection#getCoveringRange - change (VisualEditor/VisualEditor)
Esanders has uploaded a new change for review. https://gerrit.wikimedia.org/r/282463 Change subject: Implement ve.dm.Selection#getCoveringRange .. Implement ve.dm.Selection#getCoveringRange Change-Id: I8512e6f67ca7025f8890663c10b4d69cb8063dd0 --- M src/ce/nodes/ve.ce.SectionNode.js M src/ce/ve.ce.Surface.js M src/dm/selections/ve.dm.LinearSelection.js M src/dm/selections/ve.dm.NullSelection.js M src/dm/selections/ve.dm.TableSelection.js M src/dm/ve.dm.Selection.js M src/ui/dialogs/ve.ui.FindAndReplaceDialog.js 7 files changed, 42 insertions(+), 8 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor refs/changes/63/282463/1 diff --git a/src/ce/nodes/ve.ce.SectionNode.js b/src/ce/nodes/ve.ce.SectionNode.js index 3238729..3618db4 100644 --- a/src/ce/nodes/ve.ce.SectionNode.js +++ b/src/ce/nodes/ve.ce.SectionNode.js @@ -72,10 +72,10 @@ * @param {ve.dm.Selection} selection Selection */ ve.ce.SectionNode.prototype.onSurfaceModelSelect = function ( selection ) { - var ranges = selection.getRanges(), + var coveringRange = selection.getCoveringRange(), sectionNode = this; - if ( ranges.length && this.model.getRange().containsRange( ranges[ 0 ] ) ) { + if ( coveringRange && this.model.getRange().containsRange( new ve.Range( coveringRange.start ) ) ) { // Only set this as the active node if active node is empty, or not a // descendent of this node. if ( !this.surface.getActiveNode() || !this.surface.getActiveNode().traverseUpstream( function ( node ) { return node !== sectionNode; } ) ) { diff --git a/src/ce/ve.ce.Surface.js b/src/ce/ve.ce.Surface.js index 735806a..4283d8e 100644 --- a/src/ce/ve.ce.Surface.js +++ b/src/ce/ve.ce.Surface.js @@ -1696,9 +1696,9 @@ documentModel = surfaceModel.getDocument(); if ( selection instanceof ve.dm.LinearSelection ) { - range = selection.getRanges()[ 0 ]; + range = selection.getCoveringRange(); } else if ( selection instanceof ve.dm.TableSelection ) { - range = new ve.Range( selection.getRanges()[ 0 ].start ); + range = new ve.Range( selection.getCoveringRange().start ); } else { e.preventDefault(); return; @@ -1725,7 +1725,7 @@ tx = ve.dm.Transaction.newFromRemoval( documentModel, range ); selection = selection.translateByTransaction( tx ); surfaceModel.change( tx, selection ); - range = selection.getRanges()[ 0 ]; + range = selection.getCoveringRange(); } // Save scroll position before changing focus to "offscreen" paste target @@ -1940,7 +1940,7 @@ return; } - range = selection.getRanges()[ 0 ]; + range = selection.getCoveringRange(); if ( slice ) { // Pasting non-table content into table: just replace the the first cell with the pasted content @@ -2567,6 +2567,7 @@ ve.ce.Surface.prototype.handleObservedChanges = function ( oldState, newState ) { var newSelection, transaction, removedUnicorns, + activeNode, coveringRange, nodeRange, containsStart, containsEnd, surface = this, dmDoc = this.getModel().getDocument(), insertedText = false; @@ -2767,7 +2768,7 @@ return; } - sequences = this.getSurface().sequenceRegistry.findMatching( model.getDocument().data, selection.getModel().getRanges()[ 0 ].end ); + sequences = this.getSurface().sequenceRegistry.findMatching( model.getDocument().data, selection.getModel().getCoveringRange().end ); // sequences.length will likely be 0 or 1 so don't cache for ( i = 0; i < sequences.length; i++ ) { diff --git a/src/dm/selections/ve.dm.LinearSelection.js b/src/dm/selections/ve.dm.LinearSelection.js index 6f475d7..e97d81c 100644 --- a/src/dm/selections/ve.dm.LinearSelection.js +++ b/src/dm/selections/ve.dm.LinearSelection.js @@ -111,6 +111,13 @@ }; /** + * @inheritdoc + */ +ve.dm.LinearSelection.prototype.getCoveringRange = function () { + return this.range; +}; + +/** * Get the range for this selection * * @return {ve.Range} Range diff --git a/src/dm/selections/ve.dm.NullSelection.js b/src/dm/selections/ve.dm.NullSelection.js index d9023aa..7f0a370 100644 --- a/src/dm/selections/ve.dm.NullSelection.js +++ b/src/dm/selections/ve.dm.NullSelection.js @@ -83,6 +83,13 @@ /** * @inheritdoc */ +ve.dm.NullSelection.prototype.getCoveringRange = function () { + return null; +}; + +/** + * @inheritdoc + */ ve.dm.NullSelection.prototype.equals = function ( other ) { return other instanceof ve.dm.NullSelection && this.getDocument() === other.getDocument(); diff --git