fix handling of desiredcolumn

This commit is contained in:
nightwing 2012-03-25 12:15:33 +05:00
commit ec9ef6c843
2 changed files with 363 additions and 381 deletions

View file

@ -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]

View file

@ -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;