From 55198434a41f9759d3f19f68f94f27b63ce778be Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 12 Dec 2011 23:56:56 +0400 Subject: [PATCH 1/3] folds should respond only to click events (not dblclick) --- lib/ace/virtual_renderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 5af85462..7c2445bd 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -267,7 +267,7 @@ var VirtualRenderer = function(container, theme) { var pageY = event.getDocumentY(e); var row = this.screenToTextCoordinates(0, pageY).row; - if (e.target.className.indexOf('ace_fold-widget') != -1) + if (e.type == "click" && e.target.className.indexOf('ace_fold-widget') != -1) return this.session.onFoldWidgetClick(row, e); this._dispatchEvent("gutter" + e.type, { From 0a9a997883e6c2a681d07196063e0b852856e4f4 Mon Sep 17 00:00:00 2001 From: nightwing Date: Tue, 13 Dec 2011 01:03:15 +0400 Subject: [PATCH 2/3] better folding for python and coffeeScript --- lib/ace/mode/coffee.js | 2 ++ lib/ace/mode/folding/cstyle.js | 24 ++++------------- lib/ace/mode/folding/fold_mode.js | 27 +++++++++++++++---- .../mode/folding/{python.js => pythonic.js} | 16 ++++++++--- lib/ace/mode/python.js | 4 +-- 5 files changed, 44 insertions(+), 29 deletions(-) rename lib/ace/mode/folding/{python.js => pythonic.js} (79%) diff --git a/lib/ace/mode/coffee.js b/lib/ace/mode/coffee.js index 60fc3eb1..39054995 100644 --- a/lib/ace/mode/coffee.js +++ b/lib/ace/mode/coffee.js @@ -40,6 +40,7 @@ define(function(require, exports, module) { var Tokenizer = require("../tokenizer").Tokenizer; var Rules = require("./coffee_highlight_rules").CoffeeHighlightRules; var Outdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var PythonFoldMode = require("./folding/pythonic").FoldMode; var Range = require("../range").Range; var TextMode = require("./text").Mode; var WorkerClient = require("../worker/worker_client").WorkerClient; @@ -48,6 +49,7 @@ var oop = require("../lib/oop"); function Mode() { this.$tokenizer = new Tokenizer(new Rules().getRules()); this.$outdent = new Outdent(); + this.foldingRules = new PythonFoldMode("\\[|=|(=>)|(->)"); } oop.inherits(Mode, TextMode); diff --git a/lib/ace/mode/folding/cstyle.js b/lib/ace/mode/folding/cstyle.js index ee378196..70282096 100644 --- a/lib/ace/mode/folding/cstyle.js +++ b/lib/ace/mode/folding/cstyle.js @@ -55,26 +55,12 @@ oop.inherits(FoldMode, BaseFoldMode); if (match) { var i = match.index; - if (match[2]) { - var range = session.getCommentFoldRange(row, i + match[0].length); - range.end.column -= 2; - return range; - } + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); - var start = {row: row, column: i+1}; - var end = session.$findClosingBracket(match[1], start); - if (!end) - return; - - var fw = session.foldWidgets[end.row]; - if (fw == null) - fw = this.getFoldWidget(session, end.row); - - if (fw == "start") { - end.row --; - end.column = session.getLine(end.row).length; - } - return Range.fromPoints(start, end); + var range = session.getCommentFoldRange(row, i + match[0].length); + range.end.column -= 2; + return range; } if (foldStyle !== "markbeginend") diff --git a/lib/ace/mode/folding/fold_mode.js b/lib/ace/mode/folding/fold_mode.js index 288795be..5180ec73 100644 --- a/lib/ace/mode/folding/fold_mode.js +++ b/lib/ace/mode/folding/fold_mode.js @@ -43,8 +43,6 @@ var FoldMode = exports.FoldMode = function() {}; (function() { - this.FOO = 12; - this.foldingStartMarker = null; this.foldingStopMarker = null; @@ -70,15 +68,17 @@ var FoldMode = exports.FoldMode = function() {}; return null; }; - this.indentationBlock = function(session, foldStyle, row) { + this.indentationBlock = function(session, row) { var re = /^\s*/; var startRow = row; var endRow = row; var line = session.getLine(row); var startColumn = line.length - 1; var startLevel = line.match(re)[0].length; - - while (line = session.getLine(++row)) { + var maxRow = session.getLength() + + while (++row < maxRow) { + line = session.getLine(row); var level = line.match(re)[0].length; if (level == line.length) @@ -96,6 +96,23 @@ var FoldMode = exports.FoldMode = function() {}; } }; + this.openingBracketBlock = function(session, bracket, row, column) { + var start = {row: row, column: column + 1}; + var end = session.$findClosingBracket(bracket, start); + if (!end) + return; + + var fw = session.foldWidgets[end.row]; + if (fw == null) + fw = this.getFoldWidget(session, end.row); + + if (fw == "start") { + end.row --; + end.column = session.getLine(end.row).length; + } + return Range.fromPoints(start, end); + }; + this.$testStart = function(session, foldStyle, row) { if (this.foldingStartMarker.test(session.getLine(row))) return "start"; diff --git a/lib/ace/mode/folding/python.js b/lib/ace/mode/folding/pythonic.js similarity index 79% rename from lib/ace/mode/folding/python.js rename to lib/ace/mode/folding/pythonic.js index ff68241b..2bfecfd2 100644 --- a/lib/ace/mode/folding/python.js +++ b/lib/ace/mode/folding/pythonic.js @@ -40,13 +40,23 @@ define(function(require, exports, module) { var oop = require("../../lib/oop"); var BaseFoldMode = require("./fold_mode").FoldMode; -var FoldMode = exports.FoldMode = function() {}; +var FoldMode = exports.FoldMode = function(markers) { + this.foldingStartMarker = new RegExp("(?:(\\[)|" + markers + ")(?:\\s*)(?:#.*)?$"); +}; oop.inherits(FoldMode, BaseFoldMode); (function() { - this.foldingStartMarker = /\:(:?\s*)?(:?#.*)?$/; - this.getFoldWidgetRange = BaseFoldMode.prototype.indentationBlock; + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + if (match[1]) + return this.openingBracketBlock(session, match[1], row, match.index); + + return this.indentationBlock(session, row) + } + } }).call(FoldMode.prototype); diff --git a/lib/ace/mode/python.js b/lib/ace/mode/python.js index dade489b..d8469f2a 100644 --- a/lib/ace/mode/python.js +++ b/lib/ace/mode/python.js @@ -42,12 +42,12 @@ var oop = require("../lib/oop"); var TextMode = require("./text").Mode; var Tokenizer = require("../tokenizer").Tokenizer; var PythonHighlightRules = require("./python_highlight_rules").PythonHighlightRules; -var PythonFoldMode = require("./folding/python").FoldMode; +var PythonFoldMode = require("./folding/pythonic").FoldMode; var Range = require("../range").Range; var Mode = function() { this.$tokenizer = new Tokenizer(new PythonHighlightRules().getRules()); - this.foldingRules = new PythonFoldMode(); + this.foldingRules = new PythonFoldMode("\\:"); }; oop.inherits(Mode, TextMode); From d10ea1fe0dd721cfc7895bca20ca888491768323 Mon Sep 17 00:00:00 2001 From: nightwing Date: Tue, 13 Dec 2011 01:23:13 +0400 Subject: [PATCH 3/3] show some feedback to user action, when fold can't be added --- lib/ace/css/editor.css | 8 +++++++- lib/ace/edit_session/folding.js | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/ace/css/editor.css b/lib/ace/css/editor.css index 32449578..35c524db 100644 --- a/lib/ace/css/editor.css +++ b/lib/ace/css/editor.css @@ -224,6 +224,8 @@ background-image: url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82"); background-repeat: no-repeat; background-position: center 5px; + + border-radius: 3px; } .ace_fold-widget.end { @@ -237,7 +239,6 @@ .ace_fold-widget:hover { border: 1px solid rgba(0, 0, 0, 0.3); background-color: rgba(255, 255, 255, 0.2); - border-radius: 3px; -moz-box-shadow:inset 0 1px 1px rgba(255, 255, 255, 0.7); -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7); -webkit-box-shadow:inset 0 1px 1px rgba(255, 255, 255, 0.7); @@ -257,3 +258,8 @@ box-shadow:inset 0 1px 1px rgba(255, 255, 255); box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8); } + +.ace_fold-widget.invalid { + background-color: #FFB4B4; + border-color: #DE5555; +} \ No newline at end of file diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index 5137800a..894524b9 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -706,6 +706,8 @@ function Folding() { if (addSubfolds) this.foldAll(range.start.row + 1, range.end.row); + } else { + e.target.className += " invalid" } };