diff --git a/lib/ace/css/editor.css b/lib/ace/css/editor.css index f884f35c..e88cb4fe 100644 --- a/lib/ace/css/editor.css +++ b/lib/ace/css/editor.css @@ -185,5 +185,41 @@ } .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="); +} + diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index 544a635c..864cedad 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -515,6 +515,8 @@ var EditSession = function(text, mode) { this.tokenRe = mode.tokenRe; this.nonTokenRe = mode.nonTokenRe; + this.$setFolding(mode); + this._dispatchEvent("changeMode"); }; diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index 32dd00c4..e05c7056 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -591,7 +591,15 @@ function Folding() { this.addFold(placeholder, range); }; + + // structured folding + this.$setFolding = function(mode) { + }; + + this.onFoldWidgetClick = function(e) { + }; } + exports.Folding = Folding; }); \ No newline at end of file diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 9b34b9b0..4953f3d3 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -637,6 +637,19 @@ var Editor = function(renderer, session) { 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) { if (this.selection.isEmpty()){ if(dir == "left") diff --git a/lib/ace/layer/gutter.js b/lib/ace/layer/gutter.js index f5f527f3..ae3e8530 100644 --- a/lib/ace/layer/gutter.js +++ b/lib/ace/layer/gutter.js @@ -45,6 +45,7 @@ var Gutter = function(parentEl) { this.element = dom.createElement("div"); this.element.className = "ace_layer ace_gutter-layer"; parentEl.appendChild(this.element); + this.setShowFoldWidgets(this.$showFoldWidgets); this.$breakpoints = []; this.$annotations = []; @@ -105,6 +106,7 @@ var Gutter = function(parentEl) { var lastRow = config.lastRow; var fold = this.session.getNextFoldLine(i); var foldStart = fold ? fold.start.row : Infinity; + var foldWidgets = this.$showFoldWidgets && this.session.foldWidgets; while (true) { if(i > foldStart) { @@ -123,6 +125,18 @@ var Gutter = function(parentEl) { "' title='", annotation.text.join("\n"), "' 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( + "" + ); + } + var wrappedRowLength = this.session.getRowLength(i) - 1; while (wrappedRowLength--) { html.push("