From ef489ae8e3b5764e65c8979c03866665cdb569bf Mon Sep 17 00:00:00 2001 From: nightwing Date: Thu, 7 Jun 2012 18:23:37 +0400 Subject: [PATCH] select block in braces by double clicking on the brace --- lib/ace/edit_session/bracket_match.js | 41 +++++++++++++++++++++++++-- lib/ace/mouse/default_handlers.js | 39 +++++++++++++++++++------ 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/lib/ace/edit_session/bracket_match.js b/lib/ace/edit_session/bracket_match.js index 86400214..0e646c9f 100644 --- a/lib/ace/edit_session/bracket_match.js +++ b/lib/ace/edit_session/bracket_match.js @@ -40,6 +40,7 @@ define(function(require, exports, module) { "use strict"; var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; /** * class BracketMatch @@ -76,15 +77,49 @@ function BracketMatch() { if (charBeforeCursor == "") return null; var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); - if (!match) { + if (!match) return null; + + if (match[1]) + return this.$findClosingBracket(match[1], position); + else + return this.$findOpeningBracket(match[2], position); + }; + + this.getBracketRange = function(pos) { + var line = this.getLine(pos.row); + var before = true, range; + + var chr = line.charAt(pos.column-1); + var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + if (!match) { + chr = line.charAt(pos.column); + pos.column++ + match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + before = false; } + if (!match) + return null; if (match[1]) { - return this.$findClosingBracket(match[1], position); + var bracketPos = this.$findClosingBracket(match[1], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(pos, bracketPos); + if (!before) + range.end.column++; } else { - return this.$findOpeningBracket(match[2], position); + var bracketPos = this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(bracketPos, pos); + if (!before) { + range.start.column++; + range.end.column--; + } } + + return range; }; this.$brackets = { diff --git a/lib/ace/mouse/default_handlers.js b/lib/ace/mouse/default_handlers.js index 497de75e..9af13079 100644 --- a/lib/ace/mouse/default_handlers.js +++ b/lib/ace/mouse/default_handlers.js @@ -146,8 +146,9 @@ function DefaultHandlers(mouseHandler) { } else if (cmp == 1) { anchor = this.$clickSelection.start; } else { - cursor = this.$clickSelection.end; - anchor = this.$clickSelection.start; + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + cursor = orientedRange.cursor; + anchor = orientedRange.anchor; } editor.selection.setSelectionAnchor(anchor.row, anchor.column); } @@ -175,8 +176,9 @@ function DefaultHandlers(mouseHandler) { cursor = range.end; anchor = range.start; } else { - cursor = this.$clickSelection.end; - anchor = this.$clickSelection.start; + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + cursor = orientedRange.cursor; + anchor = orientedRange.anchor; } editor.selection.setSelectionAnchor(anchor.row, anchor.column); } @@ -277,12 +279,21 @@ function DefaultHandlers(mouseHandler) { this.onDoubleClick = function(ev) { var pos = ev.getDocumentPosition(); var editor = this.editor; + var session = editor.session + var range = session.getBracketRange(pos); + if (range) { + if (range.isEmpty()) { + range.start.column--; + range.end.column++; + } + this.$clickSelection = range; + this.setState("select"); + return; + } + + this.$clickSelection = editor.selection.getWordRange(pos.row, pos.column); this.setState("selectByWords"); - - editor.moveCursorToPosition(pos); - editor.selection.selectWord(); - this.$clickSelection = editor.getSelectionRange(); }; this.onTripleClick = function(ev) { @@ -334,4 +345,16 @@ function calcDistance(ax, ay, bx, by) { return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); } +function calcRangeOrientation(range, cursor) { + if (range.start.row == range.end.row) + var cmp = 2 * cursor.column - range.start.column - range.end.column; + else + var cmp = 2 * cursor.row - range.start.row - range.end.row; + + if (cmp < 0) + return {cursor: range.start, anchor: range.end}; + else + return {cursor: range.end, anchor: range.start}; +} + });