Merge remote-tracking branch 'nightwing/pullreq'
This commit is contained in:
commit
7f8235c0dd
20 changed files with 452 additions and 86 deletions
|
|
@ -105,6 +105,9 @@
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ace_text-layer {
|
.ace_text-layer {
|
||||||
|
|
@ -184,3 +187,39 @@
|
||||||
.ace_dragging .ace_content {
|
.ace_dragging .ace_content {
|
||||||
cursor: move;
|
cursor: move;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ace_folding-enabled .ace_gutter-cell {
|
||||||
|
padding-right: 9px!important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ace_fold-widget {
|
||||||
|
margin-right: -9px;
|
||||||
|
display: inline-block;
|
||||||
|
height: 9px;
|
||||||
|
width: 9px;
|
||||||
|
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41Ljg3O4BdAAAAbUlEQVQoU2NgoBqIiIibCcRn0tPzbufmlt4uKam+XVXVdLuhoeN2UVHlGSCeCbYsMTHjdlxcSjOyzSB+a2vvbbhYXV2rGsgkoIQvSBBEg0wCiaM4GSQAsg5kAsg6DAUw1SAJkJtwKkBWSFaoAADKrzXSD2pEpgAAAABJRU5ErkJggg==") no-repeat;
|
||||||
|
background-origin: content-box;
|
||||||
|
padding: 1px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ace_fold-widget.end{
|
||||||
|
transform: scaleY(-1);
|
||||||
|
-moz-transform: scaleY(-1);
|
||||||
|
-webkit-transform: scaleY(-1);
|
||||||
|
opacity:0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ace_fold-widget.closed{
|
||||||
|
-moz-transform: none;
|
||||||
|
-webkit-transform: none;
|
||||||
|
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAC1QTFRF////fn6FXl5kXl5kWFhecnJ5WFhecnJ5YWFoZ2dubW11dHR7enqCgICIhYWNjO3uwQAAAA90Uk5TACZNg5mZzMzb29vb29vbP7t0EwAAACtJREFUCFtjYAhgAIE6ARB5+SKIPKAD4mxg3ggkF2iB2JMngsQzwGocgBgA2zEHmb0961QAAAAASUVORK5CYII=");
|
||||||
|
}
|
||||||
|
|
||||||
|
.ace_fold-widget:hover {
|
||||||
|
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41Ljg3O4BdAAAASklEQVQoU2NgoBqQWHFlJhD/lzny/TY6BomD5MGWgSQPvPj5H4bXP4GwQeJw1wA5augKoaaqoTgZWSFWBTDVMIUgGq+nCSrApRsAuCZYT+KbmI0AAAAASUVORK5CYII=");
|
||||||
|
}
|
||||||
|
|
||||||
|
.ace_fold-widget.closed:hover {
|
||||||
|
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABVQTFRF////HMT3GKjUHMT3GKjUr+T5wOj5rFcpYAAAAAR0Uk5TACaZ2z7RZscAAAAkSURBVAhbY2BQYAABZwEQaWYIIk2TQRyzNBDHDMI2RKgBqQcAaNgD0/oixWYAAAAASUVORK5CYII=");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -515,6 +515,8 @@ var EditSession = function(text, mode) {
|
||||||
this.tokenRe = mode.tokenRe;
|
this.tokenRe = mode.tokenRe;
|
||||||
this.nonTokenRe = mode.nonTokenRe;
|
this.nonTokenRe = mode.nonTokenRe;
|
||||||
|
|
||||||
|
this.$setFolding(mode);
|
||||||
|
|
||||||
this._dispatchEvent("changeMode");
|
this._dispatchEvent("changeMode");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -835,6 +837,12 @@ var EditSession = function(text, mode) {
|
||||||
return Math.max(0, Math.min(row, this.doc.getLength()-1));
|
return Math.max(0, Math.min(row, this.doc.getLength()-1));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.$clipColumnToRow = function(row, column) {
|
||||||
|
if (column < 0)
|
||||||
|
return 0;
|
||||||
|
return Math.min(this.doc.getLine(row).length, column);
|
||||||
|
};
|
||||||
|
|
||||||
this.$clipPositionToDocument = function(row, column) {
|
this.$clipPositionToDocument = function(row, column) {
|
||||||
column = Math.max(0, column);
|
column = Math.max(0, column);
|
||||||
|
|
||||||
|
|
@ -857,6 +865,30 @@ var EditSession = function(text, mode) {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.$clipRangeToDocument = function(range) {
|
||||||
|
if (range.start.row < 0) {
|
||||||
|
range.start.row = 0;
|
||||||
|
range.start.column = 0
|
||||||
|
} else {
|
||||||
|
range.start.column = this.$clipColumnToRow(
|
||||||
|
range.start.row,
|
||||||
|
range.start.column
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
var len = this.doc.getLength() - 1;
|
||||||
|
if (range.end.row > len) {
|
||||||
|
range.end.row = len;
|
||||||
|
range.end.column = this.doc.getLine(len).length;
|
||||||
|
} else {
|
||||||
|
range.end.column = this.$clipColumnToRow(
|
||||||
|
range.end.row,
|
||||||
|
range.end.column
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return range;
|
||||||
|
};
|
||||||
|
|
||||||
// WRAPMODE
|
// WRAPMODE
|
||||||
this.$wrapLimit = 80;
|
this.$wrapLimit = 80;
|
||||||
this.$useWrapMode = false;
|
this.$useWrapMode = false;
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,42 @@ var Fold = exports.Fold = function(range, placeholder) {
|
||||||
return fold;
|
return fold;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.addSubFold = function(fold) {
|
||||||
|
if (this.range.isEequal(fold))
|
||||||
|
return this;
|
||||||
|
|
||||||
|
if (!this.range.containsRange(fold))
|
||||||
|
throw "A fold can't intersect already existing fold" + fold.range + this.range;
|
||||||
|
|
||||||
|
var row = fold.range.start.row, column = fold.range.start.column;
|
||||||
|
for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {
|
||||||
|
cmp = this.subFolds[i].range.compare(row, column);
|
||||||
|
if (cmp != 1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
var afterStart = this.subFolds[i];
|
||||||
|
|
||||||
|
if (cmp == 0)
|
||||||
|
return afterStart.addSubFold(fold)
|
||||||
|
|
||||||
|
// cmp == -1
|
||||||
|
var row = fold.range.end.row, column = fold.range.end.column;
|
||||||
|
for (var j = i, cmp = -1; j < this.subFolds.length; j++) {
|
||||||
|
cmp = this.subFolds[j].range.compare(row, column);
|
||||||
|
if (cmp != 1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
var afterEnd = this.subFolds[j];
|
||||||
|
|
||||||
|
if (cmp == 0)
|
||||||
|
throw "A fold can't intersect already existing fold" + fold.range + this.range;
|
||||||
|
|
||||||
|
var consumedFolds = this.subFolds.splice(i, j - i, fold)
|
||||||
|
fold.setFoldLine(this.foldLine);
|
||||||
|
|
||||||
|
return fold;
|
||||||
|
}
|
||||||
|
|
||||||
}).call(Fold.prototype);
|
}).call(Fold.prototype);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
@ -41,7 +41,7 @@ define(function(require, exports, module) {
|
||||||
var Range = require("../range").Range;
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the an array is passed in, the folds are expected to be sorted already.
|
* If an array is passed in, the folds are expected to be sorted already.
|
||||||
*/
|
*/
|
||||||
function FoldLine(foldData, folds) {
|
function FoldLine(foldData, folds) {
|
||||||
this.foldData = foldData;
|
this.foldData = foldData;
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ define(function(require, exports, module) {
|
||||||
var Range = require("../range").Range;
|
var Range = require("../range").Range;
|
||||||
var FoldLine = require("./fold_line").FoldLine;
|
var FoldLine = require("./fold_line").FoldLine;
|
||||||
var Fold = require("./fold").Fold;
|
var Fold = require("./fold").Fold;
|
||||||
|
var TokenIterator = require("../token_iterator").TokenIterator;
|
||||||
|
|
||||||
function Folding() {
|
function Folding() {
|
||||||
/**
|
/**
|
||||||
|
|
@ -247,6 +248,8 @@ function Folding() {
|
||||||
else
|
else
|
||||||
fold = new Fold(range, placeholder);
|
fold = new Fold(range, placeholder);
|
||||||
|
|
||||||
|
this.$clipRangeToDocument(fold.range);
|
||||||
|
|
||||||
var startRow = fold.start.row;
|
var startRow = fold.start.row;
|
||||||
var startColumn = fold.start.column;
|
var startColumn = fold.start.column;
|
||||||
var endRow = fold.end.row;
|
var endRow = fold.end.row;
|
||||||
|
|
@ -259,29 +262,18 @@ function Folding() {
|
||||||
if (startRow == endRow && endColumn - startColumn < 2)
|
if (startRow == endRow && endColumn - startColumn < 2)
|
||||||
throw "The range has to be at least 2 characters width";
|
throw "The range has to be at least 2 characters width";
|
||||||
|
|
||||||
var existingFold = this.getFoldAt(startRow, startColumn, 1);
|
var startFold = this.getFoldAt(startRow, startColumn, 1);
|
||||||
|
var endFold = this.getFoldAt(endRow, endColumn, -1);
|
||||||
|
if (startFold && endFold == startFold)
|
||||||
|
return startFold.addSubFold(fold);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
existingFold
|
(startFold && !startFold.range.isStart(startRow, startColumn))
|
||||||
&& existingFold.range.isEnd(endRow, endColumn)
|
|| (endFold && !endFold.range.isEnd(endRow, endColumn))
|
||||||
&& existingFold.range.isStart(startRow, startColumn)
|
|
||||||
) {
|
) {
|
||||||
return fold;
|
throw "A fold can't intersect already existing fold" + fold.range + startFold.range;
|
||||||
}
|
}
|
||||||
|
|
||||||
existingFold = this.getFoldAt(startRow, startColumn, 1);
|
|
||||||
if (existingFold && !existingFold.range.isStart(startRow, startColumn))
|
|
||||||
throw "A fold can't start inside of an already existing fold";
|
|
||||||
|
|
||||||
existingFold = this.getFoldAt(endRow, endColumn, -1);
|
|
||||||
if (existingFold && !existingFold.range.isEnd(endRow, endColumn))
|
|
||||||
throw "A fold can't end inside of an already existing fold";
|
|
||||||
|
|
||||||
if (endRow >= this.doc.getLength())
|
|
||||||
throw "End of fold is outside of the document.";
|
|
||||||
|
|
||||||
if (endColumn > this.getLine(endRow).length || startColumn > this.getLine(startRow).length)
|
|
||||||
throw "End of fold is outside of the document.";
|
|
||||||
|
|
||||||
// Check if there are folds in the range we create the new fold for.
|
// Check if there are folds in the range we create the new fold for.
|
||||||
var folds = this.getFoldsInRange(fold.range);
|
var folds = this.getFoldsInRange(fold.range);
|
||||||
if (folds.length > 0) {
|
if (folds.length > 0) {
|
||||||
|
|
@ -542,25 +534,7 @@ function Folding() {
|
||||||
|
|
||||||
range.start.column++;
|
range.start.column++;
|
||||||
} else {
|
} else {
|
||||||
var token = this.getTokenAt(cursor.row, cursor.column);
|
range = this.getCommentFoldRange(cursor.row, cursor.column) || range;
|
||||||
if (token && /^comment|string/.test(token.type)) {
|
|
||||||
var startRow = cursor.row;
|
|
||||||
var endRow = cursor.row;
|
|
||||||
var t = token;
|
|
||||||
while ((t = this.getTokenAt(startRow - 1)) && t.type == token.type) {
|
|
||||||
startRow --;
|
|
||||||
token = t;
|
|
||||||
}
|
|
||||||
range.start.row = startRow;
|
|
||||||
range.start.column = token.start + 2;
|
|
||||||
|
|
||||||
while ((t = this.getTokenAt(endRow + 1, 0)) && t.type == token.type) {
|
|
||||||
endRow ++;
|
|
||||||
token = t;
|
|
||||||
}
|
|
||||||
range.end.row = endRow;
|
|
||||||
range.end.column = token.start + token.value.length - 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var folds = this.getFoldsInRange(range);
|
var folds = this.getFoldsInRange(range);
|
||||||
|
|
@ -580,7 +554,6 @@ function Folding() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var placeholder = "...";
|
var placeholder = "...";
|
||||||
if (!range.isMultiLine()) {
|
if (!range.isMultiLine()) {
|
||||||
placeholder = this.getTextRange(range);
|
placeholder = this.getTextRange(range);
|
||||||
|
|
@ -591,7 +564,215 @@ function Folding() {
|
||||||
|
|
||||||
this.addFold(placeholder, range);
|
this.addFold(placeholder, range);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.getCommentFoldRange = function(row, column) {
|
||||||
|
var iterator = new TokenIterator(this, row, column);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
if (token && /^comment|string/.test(token.type)) {
|
||||||
|
var range = new Range;
|
||||||
|
do {
|
||||||
|
t = iterator.stepBackward();
|
||||||
|
} while(t && t.type == token.type)
|
||||||
|
|
||||||
|
iterator.stepForward();
|
||||||
|
range.start.row = iterator.getCurrentTokenRow();
|
||||||
|
range.start.column = iterator.getCurrentTokenColumn() + 2;
|
||||||
|
|
||||||
|
var iterator = new TokenIterator(this, row, column);
|
||||||
|
|
||||||
|
do {
|
||||||
|
t = iterator.stepForward();
|
||||||
|
} while(t && t.type == token.type)
|
||||||
|
t = iterator.stepBackward();
|
||||||
|
|
||||||
|
range.end.row = iterator.getCurrentTokenRow();
|
||||||
|
range.end.column = iterator.getCurrentTokenColumn() + t.value.length - 1;
|
||||||
|
return range
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.foldAll = function() {
|
||||||
|
var foldWidgets = this.foldWidgets
|
||||||
|
for (var row = foldWidgets.length; row--; ) {
|
||||||
|
if (foldWidgets[row] == null)
|
||||||
|
foldWidgets[row] = this.getFoldWidget(row)
|
||||||
|
if (foldWidgets[row] != "start")
|
||||||
|
continue
|
||||||
|
|
||||||
|
var range = this.getFoldWidgetRange(row);
|
||||||
|
console.log(row, range)
|
||||||
|
if (range)
|
||||||
|
this.addFold("...", range)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// structured folding
|
||||||
|
this.$setFolding = function(mode) {
|
||||||
|
mode = mode && mode.foldingRules;
|
||||||
|
var foldRules = Folding.commonFoldingRules
|
||||||
|
if (typeof mode == "string")
|
||||||
|
mode = foldRules[mode];
|
||||||
|
|
||||||
|
if (mode) {
|
||||||
|
this.foldWidgets = [];
|
||||||
|
this.removeListener('change', this.$updateFoldWidgets);
|
||||||
|
|
||||||
|
if (mode.getFoldWidget)
|
||||||
|
this.getFoldWidget = mode.getFoldWidget;
|
||||||
|
else if (mode.foldingStopMarker)
|
||||||
|
this.getFoldWidget = foldRules.$testBoth;
|
||||||
|
else
|
||||||
|
this.getFoldWidget = foldRules.$testStart;
|
||||||
|
|
||||||
|
this.foldingStopMarker = mode.foldingStopMarker;
|
||||||
|
this.foldingStartMarker = mode.foldingStartMarker;
|
||||||
|
|
||||||
|
if (typeof mode.getFoldWidgetRange == "string")
|
||||||
|
this.getFoldWidgetRange = foldRules[mode.getFoldWidgetRange];
|
||||||
|
else
|
||||||
|
this.getFoldWidgetRange = mode.getFoldWidgetRange;
|
||||||
|
|
||||||
|
|
||||||
|
this.$updateFoldWidgets = (mode.onChange || foldRules.onChange).bind(this);
|
||||||
|
|
||||||
|
this.on('change', this.$updateFoldWidgets);
|
||||||
|
} else {
|
||||||
|
this.foldWidgets = null;
|
||||||
|
this.removeListener('change', this.$updateFoldWidgets);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.onFoldWidgetClick = function(row, htmlEvent) {
|
||||||
|
var type = this.getFoldWidget(row);
|
||||||
|
var line = this.getLine(row);
|
||||||
|
|
||||||
|
if (type == "end")
|
||||||
|
var fold = this.getFoldAt(row, 0, -1);
|
||||||
|
else
|
||||||
|
var fold = this.getFoldAt(row, line.length, 1);
|
||||||
|
|
||||||
|
if (fold) {
|
||||||
|
this.expandFold(fold);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
range = this.getFoldWidgetRange(row);
|
||||||
|
if (range)
|
||||||
|
this.addFold("...", range);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Folding.commonFoldingRules = {
|
||||||
|
$testStart: function(row) {
|
||||||
|
if(this.foldingStartMarker.test(this.getLine(row)))
|
||||||
|
return "start";
|
||||||
|
return "";
|
||||||
|
},
|
||||||
|
$testBoth: function(row) {
|
||||||
|
var line = this.getLine(row);
|
||||||
|
if(this.foldingStartMarker.test(line))
|
||||||
|
return "start";
|
||||||
|
if(this.foldingStopMarker.test(line))
|
||||||
|
return "end";
|
||||||
|
return "";
|
||||||
|
},
|
||||||
|
onChange: function(e) {
|
||||||
|
var delta = e.data;
|
||||||
|
var range = delta.range;
|
||||||
|
var firstRow = range.start.row;
|
||||||
|
var len = range.end.row - firstRow;
|
||||||
|
|
||||||
|
if (len == 0) {
|
||||||
|
this.foldWidgets[firstRow] = null;
|
||||||
|
} else if (delta.action == "removeText" || delta.action == "removeLines") {
|
||||||
|
this.foldWidgets.splice(firstRow, len + 1, null);
|
||||||
|
} else {
|
||||||
|
var args = Array(len + 1);
|
||||||
|
args.unshift(firstRow, 1)
|
||||||
|
this.foldWidgets.splice.apply(this.foldWidgets, args);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
indentationBlock: function(row) {
|
||||||
|
var re = /^\s*/;
|
||||||
|
var startRow = row, endRow = row;
|
||||||
|
var line = this.getLine(row);
|
||||||
|
var startColumn = line.length - 1;
|
||||||
|
var startLevel = line.match(re)[0].length;
|
||||||
|
|
||||||
|
while (line = this.getLine(++row)) {
|
||||||
|
var level = line.match(re)[0].length;
|
||||||
|
|
||||||
|
if (level == line.length)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (level <= startLevel)
|
||||||
|
break;
|
||||||
|
|
||||||
|
endRow = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endRow > startRow) {
|
||||||
|
endColumn = this.getLine(endRow).length;
|
||||||
|
return new Range(startRow, startColumn, endRow, endColumn);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"cStyle": {
|
||||||
|
foldingStartMarker : /(\{|\[)[^\}\]]*$|^\s*(\/\*)/,
|
||||||
|
foldingStopMarker : /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,
|
||||||
|
getFoldWidgetRange: function(row) {
|
||||||
|
var line = this.getLine(row);
|
||||||
|
var match = line.match(this.foldingStartMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index;
|
||||||
|
|
||||||
|
if (match[2])
|
||||||
|
return this.getCommentFoldRange(row, i + match[0].length);
|
||||||
|
|
||||||
|
var start = {row: row, column: i+1};
|
||||||
|
var end = this.$findClosingBracket(match[1], start);
|
||||||
|
if (end) {
|
||||||
|
var fw = this.foldWidgets[end.row];
|
||||||
|
if (fw == null)
|
||||||
|
fw = this.getFoldWidget(end.row);
|
||||||
|
|
||||||
|
if (fw == "start"){
|
||||||
|
end.row --;
|
||||||
|
end.column = this.getLine(end.row).length;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
end = {row: this.getLength(), column: 0};
|
||||||
|
}
|
||||||
|
|
||||||
|
return Range.fromPoints(start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
var match = line.match(this.foldingStopMarker);
|
||||||
|
if (match) {
|
||||||
|
var i = match.index + match[0].length;
|
||||||
|
|
||||||
|
if (match[2])
|
||||||
|
return this.getCommentFoldRange(row, i);
|
||||||
|
|
||||||
|
var end = {row: row, column: i};
|
||||||
|
var start = this.$findOpeningBracket(match[1], end)
|
||||||
|
if (start){
|
||||||
|
start.column++;
|
||||||
|
end.column--;
|
||||||
|
} else {
|
||||||
|
start = {row: 0, column: this.getLine(0).length}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Range.fromPoints(start, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// TODO: folding based only on indentation
|
||||||
|
"indentation": null
|
||||||
|
}
|
||||||
|
|
||||||
exports.Folding = Folding;
|
exports.Folding = Folding;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
@ -930,7 +930,7 @@ module.exports = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tryAddFold("foo", new Range(0, 13, 0, 17), true);
|
tryAddFold("foo", new Range(0, 13, 0, 17), false);
|
||||||
tryAddFold("foo", new Range(0, 14, 0, 18), true);
|
tryAddFold("foo", new Range(0, 14, 0, 18), true);
|
||||||
tryAddFold("foo", new Range(0, 13, 0, 18), false);
|
tryAddFold("foo", new Range(0, 13, 0, 18), false);
|
||||||
assert.equal(session.$foldData[0].folds.length, 1);
|
assert.equal(session.$foldData[0].folds.length, 1);
|
||||||
|
|
@ -940,9 +940,9 @@ module.exports = {
|
||||||
assert.equal(session.$foldData[0].folds.length, 2);
|
assert.equal(session.$foldData[0].folds.length, 2);
|
||||||
session.removeFold(fold);
|
session.removeFold(fold);
|
||||||
|
|
||||||
tryAddFold("foo", new Range(0, 18, 0, 22), true);
|
tryAddFold("foo", new Range(0, 18, 0, 22), false);
|
||||||
tryAddFold("foo", new Range(0, 18, 0, 19), true);
|
tryAddFold("foo", new Range(0, 18, 0, 19), true);
|
||||||
tryAddFold("foo", new Range(0, 22, 1, 10), true);
|
tryAddFold("foo", new Range(0, 22, 1, 10), false);
|
||||||
},
|
},
|
||||||
|
|
||||||
"test add subfolds": function() {
|
"test add subfolds": function() {
|
||||||
|
|
@ -972,6 +972,12 @@ module.exports = {
|
||||||
assert.equal(foldData[0].folds.length, 1);
|
assert.equal(foldData[0].folds.length, 1);
|
||||||
assert.equal(foldData[0].folds[0], oldFold);
|
assert.equal(foldData[0].folds[0], oldFold);
|
||||||
assert.equal(fold.subFolds.length, 0);
|
assert.equal(fold.subFolds.length, 0);
|
||||||
|
|
||||||
|
session.unfold(null, true);
|
||||||
|
fold = session.addFold("fold0", new Range(0, 0, 0, 21));
|
||||||
|
session.addFold("fold0", new Range(0, 1, 0, 5));
|
||||||
|
session.addFold("fold0", new Range(0, 6, 0, 8));
|
||||||
|
assert.equal(fold.subFolds.length, 2);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -637,6 +637,19 @@ var Editor = function(renderer, session) {
|
||||||
return this.$modeBehaviours;
|
return this.$modeBehaviours;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.setShowFoldWidgets = function(show) {
|
||||||
|
var gutter = this.renderer.$gutterLayer;
|
||||||
|
if (gutter.getShowFoldWidgets() == show)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.renderer.$gutterLayer.setShowFoldWidgets(show);
|
||||||
|
this.$showFoldWidgets = show;
|
||||||
|
this.renderer.updateFull();
|
||||||
|
};
|
||||||
|
this.getShowFoldWidgets = function() {
|
||||||
|
return this.renderer.$gutterLayer.getShowFoldWidgets();
|
||||||
|
};
|
||||||
|
|
||||||
this.remove = function(dir) {
|
this.remove = function(dir) {
|
||||||
if (this.selection.isEmpty()){
|
if (this.selection.isEmpty()){
|
||||||
if(dir == "left")
|
if(dir == "left")
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ var Gutter = function(parentEl) {
|
||||||
this.element = dom.createElement("div");
|
this.element = dom.createElement("div");
|
||||||
this.element.className = "ace_layer ace_gutter-layer";
|
this.element.className = "ace_layer ace_gutter-layer";
|
||||||
parentEl.appendChild(this.element);
|
parentEl.appendChild(this.element);
|
||||||
|
this.setShowFoldWidgets(this.$showFoldWidgets);
|
||||||
|
|
||||||
this.$breakpoints = [];
|
this.$breakpoints = [];
|
||||||
this.$annotations = [];
|
this.$annotations = [];
|
||||||
|
|
@ -105,6 +106,7 @@ var Gutter = function(parentEl) {
|
||||||
var lastRow = config.lastRow;
|
var lastRow = config.lastRow;
|
||||||
var fold = this.session.getNextFoldLine(i);
|
var fold = this.session.getNextFoldLine(i);
|
||||||
var foldStart = fold ? fold.start.row : Infinity;
|
var foldStart = fold ? fold.start.row : Infinity;
|
||||||
|
var foldWidgets = this.$showFoldWidgets && this.session.foldWidgets;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if(i > foldStart) {
|
if(i > foldStart) {
|
||||||
|
|
@ -123,6 +125,18 @@ var Gutter = function(parentEl) {
|
||||||
"' title='", annotation.text.join("\n"),
|
"' title='", annotation.text.join("\n"),
|
||||||
"' style='height:", config.lineHeight, "px;'>", (i+1));
|
"' style='height:", config.lineHeight, "px;'>", (i+1));
|
||||||
|
|
||||||
|
if (foldWidgets) {
|
||||||
|
var c = foldWidgets[i];
|
||||||
|
if (c == null)
|
||||||
|
c = foldWidgets[i] = this.session.getFoldWidget(i);
|
||||||
|
if(c)
|
||||||
|
html.push(
|
||||||
|
"<span class='ace_fold-widget ", c,
|
||||||
|
c == "start" && i == foldStart && i < fold.end.row ? " closed" : " open",
|
||||||
|
"'></span>"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
var wrappedRowLength = this.session.getRowLength(i) - 1;
|
var wrappedRowLength = this.session.getRowLength(i) - 1;
|
||||||
while (wrappedRowLength--) {
|
while (wrappedRowLength--) {
|
||||||
html.push("</div><div class='ace_gutter-cell' style='height:", config.lineHeight, "px'>\xA6");
|
html.push("</div><div class='ace_gutter-cell' style='height:", config.lineHeight, "px'>\xA6");
|
||||||
|
|
@ -136,6 +150,19 @@ var Gutter = function(parentEl) {
|
||||||
this.element.style.height = config.minHeight + "px";
|
this.element.style.height = config.minHeight + "px";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.$showFoldWidgets = true;
|
||||||
|
this.setShowFoldWidgets = function(show) {
|
||||||
|
if (show)
|
||||||
|
dom.addCssClass(this.element, "ace_folding-enabled");
|
||||||
|
else
|
||||||
|
dom.removeCssClass(this.element, "ace_folding-enabled");
|
||||||
|
|
||||||
|
this.$showFoldWidgets = show;
|
||||||
|
};
|
||||||
|
this.getShowFoldWidgets = function() {
|
||||||
|
return this.$showFoldWidgets;
|
||||||
|
};
|
||||||
|
|
||||||
}).call(Gutter.prototype);
|
}).call(Gutter.prototype);
|
||||||
|
|
||||||
exports.Gutter = Gutter;
|
exports.Gutter = Gutter;
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,6 @@ var EventEmitter = require("../lib/event_emitter").EventEmitter;
|
||||||
var Text = function(parentEl) {
|
var Text = function(parentEl) {
|
||||||
this.element = dom.createElement("div");
|
this.element = dom.createElement("div");
|
||||||
this.element.className = "ace_layer ace_text-layer";
|
this.element.className = "ace_layer ace_text-layer";
|
||||||
this.element.style.width = "auto";
|
|
||||||
parentEl.appendChild(this.element);
|
parentEl.appendChild(this.element);
|
||||||
|
|
||||||
this.$characterSize = this.$measureSizes() || {width: 0, height: 0};
|
this.$characterSize = this.$measureSizes() || {width: 0, height: 0};
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,8 @@ oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
|
this.foldingRules = "cStyle";
|
||||||
|
|
||||||
this.toggleCommentLines = function(state, doc, startRow, endRow) {
|
this.toggleCommentLines = function(state, doc, startRow, endRow) {
|
||||||
var outdent = true;
|
var outdent = true;
|
||||||
var outentedRows = [];
|
var outentedRows = [];
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@ oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
|
this.foldingRules = "cStyle";
|
||||||
|
|
||||||
this.getNextLineIndent = function(state, line, tab) {
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
var indent = this.$getIndent(line);
|
var indent = this.$getIndent(line);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,8 @@ oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
|
this.foldingRules = "cStyle";
|
||||||
|
|
||||||
this.getNextLineIndent = function(state, line, tab) {
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
var indent = this.$getIndent(line);
|
var indent = this.$getIndent(line);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@ oop.inherits(Mode, JavaScriptMode);
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
|
this.foldingRules = "cStyle";
|
||||||
|
|
||||||
this.createWorker = function(session) {
|
this.createWorker = function(session) {
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,8 @@ oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
|
this.foldingRules = "cStyle";
|
||||||
|
|
||||||
this.toggleCommentLines = function(state, doc, startRow, endRow) {
|
this.toggleCommentLines = function(state, doc, startRow, endRow) {
|
||||||
var outdent = true;
|
var outdent = true;
|
||||||
var re = /^(\s*)\/\//;
|
var re = /^(\s*)\/\//;
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,8 @@ oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
|
this.foldingRules = "cStyle";
|
||||||
|
|
||||||
this.getNextLineIndent = function(state, line, tab) {
|
this.getNextLineIndent = function(state, line, tab) {
|
||||||
var indent = this.$getIndent(line);
|
var indent = this.$getIndent(line);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,11 @@ oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
|
this.foldingRules = {
|
||||||
|
foldingStartMarker: /\:(:?\s*)?(:?#.*)?$/,
|
||||||
|
getFoldWidgetRange: "indentationBlock"
|
||||||
|
};
|
||||||
|
|
||||||
this.toggleCommentLines = function(state, doc, startRow, endRow) {
|
this.toggleCommentLines = function(state, doc, startRow, endRow) {
|
||||||
var outdent = true;
|
var outdent = true;
|
||||||
var outentedRows = [];
|
var outentedRows = [];
|
||||||
|
|
|
||||||
|
|
@ -259,6 +259,9 @@ function DefaultHandlers(editor) {
|
||||||
// If the user dclicked on a fold, then expand it.
|
// If the user dclicked on a fold, then expand it.
|
||||||
var fold = editor.session.getFoldAt(pos.row, pos.column, 1);
|
var fold = editor.session.getFoldAt(pos.row, pos.column, 1);
|
||||||
if (fold) {
|
if (fold) {
|
||||||
|
if (ev.getAccelKey())
|
||||||
|
editor.session.removeFold(fold);
|
||||||
|
else
|
||||||
editor.session.expandFold(fold);
|
editor.session.expandFold(fold);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,10 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
|
||||||
return this.domEvent.shiftKey;
|
return this.domEvent.shiftKey;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.getAccelKey = function() {
|
||||||
|
return this.domEvent.ctrlKey || this.domEvent.metaKey ;
|
||||||
|
};
|
||||||
|
|
||||||
}).call(MouseEvent.prototype);
|
}).call(MouseEvent.prototype);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
@ -50,6 +50,12 @@ var Range = function(startRow, startColumn, endRow, endColumn) {
|
||||||
};
|
};
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
this.isEequal = function(range) {
|
||||||
|
return this.start.row == range.start.row &&
|
||||||
|
this.end.row == range.end.row &&
|
||||||
|
this.start.column == range.start.column &&
|
||||||
|
this.end.column == range.end.column
|
||||||
|
};
|
||||||
|
|
||||||
this.toString = function() {
|
this.toString = function() {
|
||||||
return ("Range: [" + this.start.row + "/" + this.start.column +
|
return ("Range: [" + this.start.row + "/" + this.start.column +
|
||||||
|
|
|
||||||
|
|
@ -264,11 +264,14 @@ var VirtualRenderer = function(container, theme) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.$onGutterClick = function(e) {
|
this.$onGutterClick = function(e) {
|
||||||
var pageX = event.getDocumentX(e);
|
|
||||||
var pageY = event.getDocumentY(e);
|
var pageY = event.getDocumentY(e);
|
||||||
|
var row = this.screenToTextCoordinates(0, pageY).row;
|
||||||
|
|
||||||
|
if (e.target.className.indexOf('ace_fold-widget') != -1)
|
||||||
|
return this.session.onFoldWidgetClick(row, e);
|
||||||
|
|
||||||
this._dispatchEvent("gutter" + e.type, {
|
this._dispatchEvent("gutter" + e.type, {
|
||||||
row: this.screenToTextCoordinates(pageX, pageY).row,
|
row: row,
|
||||||
htmlEvent: e
|
htmlEvent: e
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue