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]*<!-- *StartFragment *-->/, '' ) .replace( /<!-- *EndFragment *-->[\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 a/src/dm/selections/ve.dm.TableSelection.js b/src/dm/selections/ve.dm.TableSelection.js index a094f8c..5822dbe 100644 --- a/src/dm/selections/ve.dm.TableSelection.js +++ b/src/dm/selections/ve.dm.TableSelection.js @@ -184,6 +184,16 @@ }; /** + * @inheritdoc + * + * Note that this returns the table range, and not the minimal range covering + * all cells, as that would be far more expensive to compute. + */ +ve.dm.TableSelection.prototype.getCoveringRange = function () { + return this.tableRange; +}; + +/** * Get all the ranges required to build a table slice from the selection * * In addition to the outer ranges of the cells, this also includes the start and diff --git a/src/dm/ve.dm.Selection.js b/src/dm/ve.dm.Selection.js index 56a23cc..dc80892 100644 --- a/src/dm/ve.dm.Selection.js +++ b/src/dm/ve.dm.Selection.js @@ -173,6 +173,15 @@ ve.dm.Selection.prototype.getRanges = null; /** + * Get the covering linear range for this selection + * + * @abstract + * @method + * @return {ve.Range|null} Covering range, if not null + */ +ve.dm.Selection.prototype.getCoveringRange = null; + +/** * Get the document model this selection applies to * * @return {ve.dm.Document} Document model diff --git a/src/ui/dialogs/ve.ui.FindAndReplaceDialog.js b/src/ui/dialogs/ve.ui.FindAndReplaceDialog.js index 036df46..3396a3c 100644 --- a/src/ui/dialogs/ve.ui.FindAndReplaceDialog.js +++ b/src/ui/dialogs/ve.ui.FindAndReplaceDialog.js @@ -494,7 +494,7 @@ return; } - this.startOffset = this.fragments[ this.focusedIndex ].getSelection().getRanges()[ 0 ].start; + this.startOffset = this.fragments[ this.focusedIndex ].getSelection().getCoveringRange().start; this.$findResults .find( '.ve-ui-findAndReplaceDialog-findResult-focused' ) -- To view, visit https://gerrit.wikimedia.org/r/282463 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I8512e6f67ca7025f8890663c10b4d69cb8063dd0 Gerrit-PatchSet: 2 Gerrit-Project: VisualEditor/VisualEditor Gerrit-Branch: master Gerrit-Owner: Esanders <esand...@wikimedia.org> Gerrit-Reviewer: Jforrester <jforres...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits