fix handling of desiredcolumn
This commit is contained in:
parent
bcf8430ec4
commit
ec9ef6c843
2 changed files with 363 additions and 381 deletions
|
|
@ -44,51 +44,6 @@ var Selection = require("./selection").Selection;
|
||||||
var Range = require("./range").Range;
|
var Range = require("./range").Range;
|
||||||
var event = require("./lib/event");
|
var event = require("./lib/event");
|
||||||
|
|
||||||
function VirtualSelection(selection) {
|
|
||||||
this.session = selection.session;
|
|
||||||
this.doc = selection.doc;
|
|
||||||
|
|
||||||
this.clearSelection();
|
|
||||||
this.selectionLead = this.doc.createAnchor(0, 0);
|
|
||||||
this.selectionAnchor = this.doc.createAnchor(0, 0);
|
|
||||||
|
|
||||||
/*var _self = this;
|
|
||||||
this.selectionLead.on("change", function(e) {
|
|
||||||
_self._emit("changeCursor");
|
|
||||||
if (!_self.$isEmpty)
|
|
||||||
_self._emit("changeSelection");
|
|
||||||
if (!_self.$preventUpdateDesiredColumnOnChange && e.old.column != e.value.column)
|
|
||||||
_self.$updateDesiredColumn();
|
|
||||||
});
|
|
||||||
|
|
||||||
this.selectionAnchor.on("change", function() {
|
|
||||||
if (!_self.$isEmpty)
|
|
||||||
_self._emit("changeSelection");
|
|
||||||
}); */
|
|
||||||
|
|
||||||
this.detach = function() {
|
|
||||||
this.selectionLead.detach();
|
|
||||||
this.selectionAnchor.detach();
|
|
||||||
this.session = this.doc = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.fromRange = function(r) {
|
|
||||||
this.setSelectionRange(r, r.cursor == r.start)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.toRange = function(r) {
|
|
||||||
var r1 = this.getRange()
|
|
||||||
|
|
||||||
r.start.column = r1.start.column
|
|
||||||
r.start.row = r1.start.row
|
|
||||||
r.end.column = r1.end.column
|
|
||||||
r.end.row = r1.end.row
|
|
||||||
|
|
||||||
r.cursor = this.isBackwards() ? r.start : r.end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
VirtualSelection.prototype = Selection.prototype;
|
|
||||||
|
|
||||||
|
|
||||||
function forEachSelection(editor, cmd, args) {
|
function forEachSelection(editor, cmd, args) {
|
||||||
if (editor.session.multiSelection.inVirtualMode)
|
if (editor.session.multiSelection.inVirtualMode)
|
||||||
|
|
@ -100,14 +55,13 @@ function forEachSelection(editor, cmd, args) {
|
||||||
var reg = selection._eventRegistry;
|
var reg = selection._eventRegistry;
|
||||||
selection._eventRegistry = {};
|
selection._eventRegistry = {};
|
||||||
|
|
||||||
var sh = new VirtualSelection(selection)
|
var sh = new Selection(session);
|
||||||
editor.session.multiSelection.inVirtualMode = true
|
editor.session.multiSelection.inVirtualMode = true;
|
||||||
for (var i = rangeList.ranges.length; i--;) {
|
for (var i = rangeList.ranges.length; i--;) {
|
||||||
sh.fromRange(rangeList.ranges[i])
|
sh.fromOrientedRange(rangeList.ranges[i])
|
||||||
editor.selection = session.selection = sh
|
editor.selection = session.selection = sh
|
||||||
cmd.exec(editor, args || {})
|
cmd.exec(editor, args || {})
|
||||||
|
sh.toOrientedRange(rangeList.ranges[i])
|
||||||
sh.toRange(rangeList.ranges[i])
|
|
||||||
}
|
}
|
||||||
sh.detach();
|
sh.detach();
|
||||||
|
|
||||||
|
|
@ -116,7 +70,7 @@ function forEachSelection(editor, cmd, args) {
|
||||||
editor.session.multiSelection.inVirtualMode = false;
|
editor.session.multiSelection.inVirtualMode = false;
|
||||||
selection._eventRegistry = reg;
|
selection._eventRegistry = reg;
|
||||||
|
|
||||||
selection.setSelectionRange(selection.rangeList.all[0])
|
selection.fromOrientedRange(selection.rangeList.all[0])
|
||||||
editor.renderer.updateCursor();
|
editor.renderer.updateCursor();
|
||||||
editor.renderer.updateBackMarkers();
|
editor.renderer.updateBackMarkers();
|
||||||
|
|
||||||
|
|
@ -134,7 +88,7 @@ function exec(command, editor, args) {
|
||||||
if (editor && editor.$readOnly && !command.readOnly)
|
if (editor && editor.$readOnly && !command.readOnly)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (/^(remove|insert|select|go|jumptomatching|del|backspace)/.test(command.name)) {
|
if (/^(remove|insert|select|go|jumptomatching|del|backspace|to(?:upp|low)ercase)/.test(command.name)) {
|
||||||
forEachSelection(editor, command, args)
|
forEachSelection(editor, command, args)
|
||||||
}else
|
}else
|
||||||
command.exec(editor, args || {});
|
command.exec(editor, args || {});
|
||||||
|
|
@ -215,7 +169,7 @@ var addSelectionRange = function(editor, orientedRange) {
|
||||||
selection.rangeList.add(orientedRange);
|
selection.rangeList.add(orientedRange);
|
||||||
selection.rangeCount = selection.rangeList.all.length + selection.secondarySelections.length;
|
selection.rangeCount = selection.rangeList.all.length + selection.secondarySelections.length;
|
||||||
|
|
||||||
selection.setSelectionRange(orientedRange, orientedRange.cursor == orientedRange.start)
|
selection.fromOrientedRange(orientedRange)
|
||||||
editor.renderer.updateCursor();
|
editor.renderer.updateCursor();
|
||||||
editor.renderer.updateBackMarkers();
|
editor.renderer.updateBackMarkers();
|
||||||
};
|
};
|
||||||
|
|
@ -226,6 +180,8 @@ function addCursorV(editor, dir){
|
||||||
range.cursor = isBackwards ? range.start : range.end;
|
range.cursor = isBackwards ? range.start : range.end;
|
||||||
|
|
||||||
var screenLead = editor.session.documentToScreenPosition(range.cursor);
|
var screenLead = editor.session.documentToScreenPosition(range.cursor);
|
||||||
|
screenLead.column = editor.selection.$desiredColumn;
|
||||||
|
|
||||||
var lead = editor.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);
|
var lead = editor.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);
|
||||||
|
|
||||||
if (!range.isEmpty()) {
|
if (!range.isEmpty()) {
|
||||||
|
|
@ -242,6 +198,7 @@ function addCursorV(editor, dir){
|
||||||
var newRange = Range.fromPoints(anchor, lead)
|
var newRange = Range.fromPoints(anchor, lead)
|
||||||
newRange.cursor = newRange.end
|
newRange.cursor = newRange.end
|
||||||
}
|
}
|
||||||
|
newRange.desiredColumn = editor.selection.$desiredColumn
|
||||||
if (!editor.inMultiSelectMode) {
|
if (!editor.inMultiSelectMode) {
|
||||||
addSelectionRange(editor, range)
|
addSelectionRange(editor, range)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -326,9 +283,7 @@ function onMouseDown(e) {
|
||||||
return // dragging
|
return // dragging
|
||||||
|
|
||||||
if (!isMultiSelect) {
|
if (!isMultiSelect) {
|
||||||
var tmpSel = selection.getRange();
|
addSelectionRange(editor, selection.toOrientedRange())
|
||||||
tmpSel.cursor = selection.isBackwards() ? tmpSel.start : tmpSel.end;
|
|
||||||
addSelectionRange(editor, tmpSel)
|
|
||||||
}
|
}
|
||||||
if (inSelection)
|
if (inSelection)
|
||||||
selection.clearSelection();
|
selection.clearSelection();
|
||||||
|
|
@ -344,8 +299,7 @@ function onMouseDown(e) {
|
||||||
selection.secondarySelections.splice(i, 1);
|
selection.secondarySelections.splice(i, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
var tmpSel = selection.getRange();
|
var tmpSel = selection.toOrientedRange();
|
||||||
tmpSel.cursor = selection.isBackwards() ? tmpSel.start : tmpSel.end;
|
|
||||||
|
|
||||||
if (oldRange && oldRange.isEmpty() && tmpSel.isEequal(oldRange)) {
|
if (oldRange && oldRange.isEmpty() && tmpSel.isEequal(oldRange)) {
|
||||||
var range = selection.rangeList.all[0]
|
var range = selection.rangeList.all[0]
|
||||||
|
|
|
||||||
|
|
@ -504,6 +504,34 @@ var Selection = function(session) {
|
||||||
this.moveCursorTo(row, column, preventUpdateDesiredColumn);
|
this.moveCursorTo(row, column, preventUpdateDesiredColumn);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// remove listeners from document
|
||||||
|
this.detach = function() {
|
||||||
|
this.selectionLead.detach();
|
||||||
|
this.selectionAnchor.detach();
|
||||||
|
this.session = this.doc = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.fromOrientedRange = function(range) {
|
||||||
|
this.setSelectionRange(range, range.cursor == range.start);
|
||||||
|
this.$desiredColumn = range.desiredColumn || this.$desiredColumn;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.toOrientedRange = function(range) {
|
||||||
|
var r = this.getRange();
|
||||||
|
if (range) {
|
||||||
|
range.start.column = r.start.column;
|
||||||
|
range.start.row = r.start.row;
|
||||||
|
range.end.column = r.end.column;
|
||||||
|
range.end.row = r.end.row;
|
||||||
|
} else {
|
||||||
|
range = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
range.cursor = this.isBackwards() ? range.start : range.end;
|
||||||
|
range.desiredColumn = this.$desiredColumn;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
}).call(Selection.prototype);
|
}).call(Selection.prototype);
|
||||||
|
|
||||||
exports.Selection = Selection;
|
exports.Selection = Selection;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue