Merge branch 'master' of github.com:ajaxorg/ace
This commit is contained in:
commit
593d95f482
9 changed files with 73 additions and 30 deletions
|
|
@ -570,10 +570,10 @@ function Folding() {
|
||||||
var token = iterator.getCurrentToken();
|
var token = iterator.getCurrentToken();
|
||||||
if (token && /^comment|string/.test(token.type)) {
|
if (token && /^comment|string/.test(token.type)) {
|
||||||
var range = new Range();
|
var range = new Range();
|
||||||
var t;
|
var re = new RegExp(token.type.replace(/\..*/, "\\."));
|
||||||
do {
|
do {
|
||||||
t = iterator.stepBackward();
|
token = iterator.stepBackward();
|
||||||
} while(t && t.type == token.type);
|
} while(token && re.test(token.type))
|
||||||
|
|
||||||
iterator.stepForward();
|
iterator.stepForward();
|
||||||
range.start.row = iterator.getCurrentTokenRow();
|
range.start.row = iterator.getCurrentTokenRow();
|
||||||
|
|
@ -582,29 +582,33 @@ function Folding() {
|
||||||
var iterator = new TokenIterator(this, row, column);
|
var iterator = new TokenIterator(this, row, column);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
t = iterator.stepForward();
|
token = iterator.stepForward();
|
||||||
} while(t && t.type == token.type);
|
} while(token && re.test(token.type))
|
||||||
t = iterator.stepBackward();
|
token = iterator.stepBackward();
|
||||||
|
|
||||||
range.end.row = iterator.getCurrentTokenRow();
|
range.end.row = iterator.getCurrentTokenRow();
|
||||||
range.end.column = iterator.getCurrentTokenColumn() + t.value.length - 1;
|
range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 1;
|
||||||
return range;
|
return range
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.foldAll = function() {
|
this.foldAll = function(startRow, endRow) {
|
||||||
var foldWidgets = this.foldWidgets;
|
var foldWidgets = this.foldWidgets;
|
||||||
for (var row = foldWidgets.length; row--; ) {
|
endRow = endRow || foldWidgets.length;
|
||||||
|
for (var row = startRow || 0; row < endRow; row++) {
|
||||||
if (foldWidgets[row] == null)
|
if (foldWidgets[row] == null)
|
||||||
foldWidgets[row] = this.getFoldWidget(row);
|
foldWidgets[row] = this.getFoldWidget(row);
|
||||||
if (foldWidgets[row] != "start")
|
if (foldWidgets[row] != "start")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
var range = this.getFoldWidgetRange(row);
|
var range = this.getFoldWidgetRange(row);
|
||||||
if (range)
|
// sometimes range can be incompatible with existing fold
|
||||||
|
// wouldn't it be better for addFold to return null istead of throwing?
|
||||||
|
if (range && range.end.row < endRow) try {
|
||||||
this.addFold("...", range);
|
this.addFold("...", range);
|
||||||
|
} catch(e) {}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
// structured folding
|
// structured folding
|
||||||
this.$setFolding = function(foldMode) {
|
this.$setFolding = function(foldMode) {
|
||||||
|
|
@ -628,9 +632,11 @@ function Folding() {
|
||||||
this.on('change', this.$updateFoldWidgets);
|
this.on('change', this.$updateFoldWidgets);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.onFoldWidgetClick = function(row, htmlEvent) {
|
this.onFoldWidgetClick = function(row, e) {
|
||||||
var type = this.getFoldWidget(row);
|
var type = this.getFoldWidget(row);
|
||||||
var line = this.getLine(row);
|
var line = this.getLine(row);
|
||||||
|
var onlySubfolds = e.shiftKey;
|
||||||
|
var addSubfolds = onlySubfolds || e.ctrlKey || e.altKey || e.metaKey;
|
||||||
var fold;
|
var fold;
|
||||||
|
|
||||||
if (type == "end")
|
if (type == "end")
|
||||||
|
|
@ -639,13 +645,21 @@ function Folding() {
|
||||||
fold = this.getFoldAt(row, line.length, 1);
|
fold = this.getFoldAt(row, line.length, 1);
|
||||||
|
|
||||||
if (fold) {
|
if (fold) {
|
||||||
this.expandFold(fold);
|
if (addSubfolds)
|
||||||
|
this.removeFold(fold);
|
||||||
|
else
|
||||||
|
this.expandFold(fold);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var range = this.getFoldWidgetRange(row);
|
var range = this.getFoldWidgetRange(row);
|
||||||
if (range)
|
if (range) {
|
||||||
this.addFold("...", range);
|
if (!onlySubfolds)
|
||||||
|
this.addFold("...", range);
|
||||||
|
|
||||||
|
if (addSubfolds)
|
||||||
|
this.foldAll(range.start.row + 1, range.end.row);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.updateFoldWidgets = function(e) {
|
this.updateFoldWidgets = function(e) {
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,8 @@ var Gutter = function(parentEl) {
|
||||||
|
|
||||||
if (foldWidgets) {
|
if (foldWidgets) {
|
||||||
var c = foldWidgets[i];
|
var c = foldWidgets[i];
|
||||||
if (!c)
|
// check if cached value is invalidated and we need to recompute
|
||||||
|
if (c == null)
|
||||||
c = foldWidgets[i] = this.session.getFoldWidget(i);
|
c = foldWidgets[i] = this.session.getFoldWidget(i);
|
||||||
if (c)
|
if (c)
|
||||||
html.push(
|
html.push(
|
||||||
|
|
|
||||||
|
|
@ -69,9 +69,6 @@ oop.inherits(FoldMode, BaseFoldMode);
|
||||||
end.row --;
|
end.row --;
|
||||||
end.column = session.getLine(end.row).length;
|
end.column = session.getLine(end.row).length;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
|
||||||
end = {row: session.getLength(), column: 0};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Range.fromPoints(start, end);
|
return Range.fromPoints(start, end);
|
||||||
|
|
@ -90,11 +87,6 @@ oop.inherits(FoldMode, BaseFoldMode);
|
||||||
if (start) {
|
if (start) {
|
||||||
start.column++;
|
start.column++;
|
||||||
end.column--;
|
end.column--;
|
||||||
} else {
|
|
||||||
start = {
|
|
||||||
row: 0,
|
|
||||||
column: session.getLine(0).length
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Range.fromPoints(start, end);
|
return Range.fromPoints(start, end);
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ var FoldMode = exports.FoldMode = function() {};
|
||||||
this.foldingStartMarker = null;
|
this.foldingStartMarker = null;
|
||||||
this.foldingStopMarker = null;
|
this.foldingStopMarker = null;
|
||||||
|
|
||||||
|
// must return "" if there's no fold, to enable caching
|
||||||
this.getFoldWidget = function(session, row) {
|
this.getFoldWidget = function(session, row) {
|
||||||
if (this.foldingStartMarker) {
|
if (this.foldingStartMarker) {
|
||||||
if (this.foldingStopMarker) {
|
if (this.foldingStopMarker) {
|
||||||
|
|
|
||||||
|
|
@ -66,13 +66,13 @@ oop.inherits(FoldMode, BaseFoldMode);
|
||||||
var fold = tags[0];
|
var fold = tags[0];
|
||||||
|
|
||||||
if (!fold || this.voidElements[fold])
|
if (!fold || this.voidElements[fold])
|
||||||
return;
|
return "";
|
||||||
|
|
||||||
if (fold.charAt(0) == "/")
|
if (fold.charAt(0) == "/")
|
||||||
return "end";
|
return "end";
|
||||||
|
|
||||||
if (tags.indexOf("/" + fold) !== -1)
|
if (tags.indexOf("/" + fold) !== -1)
|
||||||
return;
|
return "";
|
||||||
|
|
||||||
return "start";
|
return "start";
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,7 @@ function DefaultHandlers(editor) {
|
||||||
editor.moveCursorToPosition(pos);
|
editor.moveCursorToPosition(pos);
|
||||||
}
|
}
|
||||||
if(button == 2) {
|
if(button == 2) {
|
||||||
editor.textInput.onContextMenu({x: pageX, y: pageY}, selectionEmpty);
|
editor.textInput.onContextMenu({x: ev.clientX, y: ev.clientY}, selectionEmpty);
|
||||||
event.capture(editor.container, function(){}, editor.textInput.onContextMenuClose);
|
event.capture(editor.container, function(){}, editor.textInput.onContextMenuClose);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,9 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
|
||||||
this.pageX = event.getDocumentX(domEvent);
|
this.pageX = event.getDocumentX(domEvent);
|
||||||
this.pageY = event.getDocumentY(domEvent);
|
this.pageY = event.getDocumentY(domEvent);
|
||||||
|
|
||||||
|
this.clientX = domEvent.clientX;
|
||||||
|
this.clientY = domEvent.clientY;
|
||||||
|
|
||||||
this.$pos = null;
|
this.$pos = null;
|
||||||
this.$inSelection = null;
|
this.$inSelection = null;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,8 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass)
|
||||||
};
|
};
|
||||||
|
|
||||||
this.$pos = pos;
|
this.$pos = pos;
|
||||||
|
// Used for reset
|
||||||
|
this.$undoStackDepth = session.getUndoManager().$undoStack ? session.getUndoManager().$undoStack.length : -1;
|
||||||
this.setup();
|
this.setup();
|
||||||
|
|
||||||
session.selection.on("changeCursor", this.$onCursorChange);
|
session.selection.on("changeCursor", this.$onCursorChange);
|
||||||
|
|
@ -188,6 +190,16 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass)
|
||||||
this.others[i].detach();
|
this.others[i].detach();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.cancel = function() {
|
||||||
|
if(this.$undoStackDepth === -1)
|
||||||
|
throw Error("Canceling placeholders only supported with undo manager attached to session.");
|
||||||
|
var undoManager = this.session.getUndoManager();
|
||||||
|
var undosRequired = undoManager.$undoStack.length - this.$undoStackDepth;
|
||||||
|
for (var i = 0; i < undosRequired; i++) {
|
||||||
|
undoManager.undo(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
}).call(PlaceHolder.prototype);
|
}).call(PlaceHolder.prototype);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,7 @@ var MockRenderer = require("./test/mockrenderer").MockRenderer;
|
||||||
var assert = require("./test/assertions");
|
var assert = require("./test/assertions");
|
||||||
var JavaScriptMode = require("./mode/javascript").Mode;
|
var JavaScriptMode = require("./mode/javascript").Mode;
|
||||||
var PlaceHolder = require('./placeholder').PlaceHolder;
|
var PlaceHolder = require('./placeholder').PlaceHolder;
|
||||||
|
var UndoManager = require('./undomanager').UndoManager;
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
||||||
|
|
@ -133,6 +134,25 @@ module.exports = {
|
||||||
editor.moveCursorTo(1, 0);
|
editor.moveCursorTo(1, 0);
|
||||||
p.onCursorChange(); // Have to do this by hand because moveCursorTo doesn't trigger the event
|
p.onCursorChange(); // Have to do this by hand because moveCursorTo doesn't trigger the event
|
||||||
assert.ok(left);
|
assert.ok(left);
|
||||||
|
},
|
||||||
|
|
||||||
|
"test: cancel": function(next) {
|
||||||
|
var session = new EditSession("var a = 10;\nconsole.log(a, a);", new JavaScriptMode());
|
||||||
|
session.setUndoManager(new UndoManager());
|
||||||
|
var editor = new Editor(new MockRenderer(), session);
|
||||||
|
var p = new PlaceHolder(session, 1, {row: 0, column: 4}, [{row: 1, column: 12}, {row: 1, column: 15}]);
|
||||||
|
|
||||||
|
editor.moveCursorTo(0, 5);
|
||||||
|
editor.insert('b');
|
||||||
|
editor.insert('cd');
|
||||||
|
editor.remove('left');
|
||||||
|
assert.equal(session.doc.getValue(), "var abc = 10;\nconsole.log(abc, abc);");
|
||||||
|
// Wait a little for the changes to enter the undo stack
|
||||||
|
setTimeout(function() {
|
||||||
|
p.cancel();
|
||||||
|
assert.equal(session.doc.getValue(), "var a = 10;\nconsole.log(a, a);");
|
||||||
|
next();
|
||||||
|
}, 80);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue