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

Reply via email to