diff --git a/demo/kitchen-sink/demo.js b/demo/kitchen-sink/demo.js index ab059f20..78fbd883 100644 --- a/demo/kitchen-sink/demo.js +++ b/demo/kitchen-sink/demo.js @@ -548,95 +548,6 @@ exports.launch = function(env) { } }); - canon.addCommand({ - name: "fold", - bindKey: { - win: "Alt-L", - mac: "Alt-L", - sender: "editor" - }, - exec: function(env) { - toggleFold(env, false); - } - }); - - canon.addCommand({ - name: "unfold", - bindKey: { - win: "Alt-Shift-L", - mac: "Alt-Shift-L", - sender: "editor" - }, - exec: function(env) { - toggleFold(env, true); - } - }); - - function isCommentRow(row) { - var session = env.editor.session; - var token; - var tokens = session.getTokens(row, row)[0].tokens; - var c = 0; - for (var i = 0; i < tokens.length; i++) { - token = tokens[i]; - if (/^comment/.test(token.type)) { - return c; - } else if (!/^text/.test(token.type)) { - return false; - } - c += token.value.length; - } - return false; - } - - function toggleFold(env, tryToUnfold) { - var session = env.editor.session; - var selection = env.editor.selection; - var range = selection.getRange(); - var addFold; - - if(range.isEmpty()) { - var br = session.findMatchingBracket(range.start); - var fold = session.getFoldAt(range.start.row, range.start.column); - var column; - - if (fold) { - session.expandFold(fold); - selection.setSelectionRange(fold.range); - } else if (br) { - if (range.compare(br.row, br.column) == 1) - range.end = br; - else - range.start = br; - addFold = true; - } else if ((column = isCommentRow(range.start.row)) !== false) { - var firstCommentRow = range.start.row; - var lastCommentRow = range.start.row; - var t; - while ((t = isCommentRow(firstCommentRow - 1)) !== false) { - firstCommentRow --; - column = t; - } - while (isCommentRow(lastCommentRow + 1) !== false) { - lastCommentRow ++; - } - range.start.row = firstCommentRow; - range.start.column = column + 2; - range.end.row = lastCommentRow; - range.end.column = session.getLine(lastCommentRow).length - 1; - addFold = true; - } - } else { - addFold = true; - } - if (addFold) { - var placeHolder = session.getTextRange(range); - if(placeHolder.length < 3) - return; - placeHolder = placeHolder.trim().substring(0, 3).replace(' ','','g') + "..."; - session.addFold(placeHolder, range); - } - } }; var themes = {}; diff --git a/lib/ace/commands/default_commands.js b/lib/ace/commands/default_commands.js index a09b8909..99eec74c 100644 --- a/lib/ace/commands/default_commands.js +++ b/lib/ace/commands/default_commands.js @@ -365,4 +365,33 @@ canon.addCommand({ exec: function(env, args, request) { env.editor.transposeLetters(); } }); +canon.addCommand({ + name: "fold", + bindKey: bindKey("Alt-L", "Alt-L"), + exec: function(env) { + env.editor.session.toggleFold(false); + } +}); +canon.addCommand({ + name: "unfold", + bindKey: bindKey("Alt-Shift-L", "Alt-Shift-L"), + exec: function(env) { + env.editor.session.toggleFold(true); + } +}); +canon.addCommand({ + name: "foldall", + bindKey: bindKey("Alt-Shift-0", "Alt-Shift-0"), + exec: function(env) { + env.editor.session.foldAll(); + } +}); +canon.addCommand({ + name: "unfoldall", + bindKey: bindKey("Alt-Shift-0", "Alt-Shift-0"), + exec: function(env) { + env.editor.session.unFoldAll(); + } +}); + }); diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index bfbd62e3..d3f442cf 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -52,7 +52,7 @@ function Folding() { var foldLine = this.getFoldLine(row); if (!foldLine) return null; - + var folds = foldLine.folds; for (var i = 0; i < folds.length; i++) { var fold = folds[i]; @@ -134,7 +134,7 @@ function Folding() { var foldLine = foldLine || this.getFoldLine(row); if (!foldLine) return null; - + var lastFold = { end: { column: 0 } }; @@ -251,7 +251,7 @@ function Folding() { var startColumn = fold.start.column; var endRow = fold.end.row; var endColumn = fold.end.column; - + // --- Some checking --- if (fold.placeholder.length < 2) throw "Placeholder has to be at least 2 characters"; @@ -489,8 +489,65 @@ function Folding() { return fd; }; -} + this.toggleFold = function(tryToUnfold) { + var selection = this.selection; + var range = selection.getRange(); + + if(range.isEmpty()) { + var cursor = range.start + var fold = this.getFoldAt(cursor.row, cursor.column); + var bracketPos, column; + + if (fold) { + this.expandFold(fold); + return; + } else if (bracketPos = this.findMatchingBracket(cursor)) { + if (range.comparePoint(bracketPos) == 1) { + range.end = bracketPos; + } else { + range.start = bracketPos; + range.start.column++; + range.end.column--; + } + } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) { + if (range.comparePoint(bracketPos) == 1) + range.end = bracketPos; + else + range.start = bracketPos; + + range.start.column++; + } + } else { + var folds = this.getFoldsInRange(range); + if (tryToUnfold && folds.length) { + this.expandFolds(folds); + return; + } else if (folds.length == 1 ) { + fold = folds[0]; + } + } + + if (!fold) + fold = this.getFoldAt(range.start.row, range.start.column); + + if (fold && fold.range.toString() == range.toString()){ + this.expandFold(fold); + return + } + + + var placeholder = "..."; + if (!range.isMultiLine()) { + placeholder = this.getTextRange(range); + if(placeholder.length < 4) + return; + placeholder = placeholder.trim().substring(0, 2) + ".." + } + + this.addFold(placeholder, range); + }; +} exports.Folding = Folding; }); \ No newline at end of file