diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 098e2750..4b6a3538 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -415,7 +415,7 @@ var Editor =function(renderer, session) { if (this.getBehavioursEnabled()) { // Get a transform if the current mode wants one. - var transform = mode.transformInsert(session.getState(cursor.row), this, session, text); + var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); if (transform) text = transform.text; } @@ -637,7 +637,10 @@ var Editor =function(renderer, session) { if (this.getBehavioursEnabled()) { var session = this.session; var state = session.getState(range.start.row); - range = session.getMode().transformRemove(state, this, session, range); + var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); + if (new_range !== false) { + range = new_range; + } } this.session.remove(range); diff --git a/lib/ace/mode/behaviour.js b/lib/ace/mode/behaviour.js index 46886a21..6b57d3d3 100644 --- a/lib/ace/mode/behaviour.js +++ b/lib/ace/mode/behaviour.js @@ -44,20 +44,24 @@ var Behaviour = function() { (function () { - this.add = function (name, insert, remove) { - if (this.$behaviours === undefined) { - this.$behaviours = {}; + this.add = function (name, action, callback) { + switch (undefined) { + case this.$behaviours: + this.$behaviours = {}; + case this.$behaviours[name]: + this.$behaviours[name] = {}; } - this.$behaviours[name] = { - insert: insert, - remove: remove - }; + this.$behaviours[name][action] = callback; } this.addBehaviours = function (behaviours) { for (var key in behaviours) { if (behaviours.hasOwnProperty(key)) { - this.addBehaviour(key, behaviours[key].insert, behaviours[key].remove); + for (var action in behaviours[key]) { + if (behaviours[key].hasOwnProperty(action)) { + this.add(key, action, behaviours[key][action]); + } + } } } } @@ -74,11 +78,7 @@ var Behaviour = function() { } else { var behaviours = mode.getBehaviours(); } - for (var key in behaviours) { - if (behaviours.hasOwnProperty(key)) { - this.add(key, behaviours[key].insert, behaviours[key].remove); - } - } + this.addBehaviours(behaviours); } this.getBehaviours = function (filter) { diff --git a/lib/ace/mode/behaviour/cstyle.js b/lib/ace/mode/behaviour/cstyle.js index 801f81da..cbbbb283 100644 --- a/lib/ace/mode/behaviour/cstyle.js +++ b/lib/ace/mode/behaviour/cstyle.js @@ -43,7 +43,7 @@ var Behaviour = require('ace/mode/behaviour').Behaviour; var CstyleBehaviour = function () { - this.add("brace_insert", function (state, editor, session, text) { + this.add("braces", "insertion", function (state, action, editor, session, text) { if (text == '{') { var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); @@ -88,7 +88,9 @@ var CstyleBehaviour = function () { } } return false; - }, function (state, editor, session, range) { + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '{') { var line = session.doc.getLine(range.start.row); @@ -101,7 +103,7 @@ var CstyleBehaviour = function () { return false; }); - this.add("parens_insert", function (state, editor, session, text) { + this.add("parens", "insertion", function (state, action, editor, session, text) { if (text == '(') { var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); @@ -131,7 +133,9 @@ var CstyleBehaviour = function () { } } return false; - }, function (state, editor, session, range) { + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '(') { var line = session.doc.getLine(range.start.row); @@ -144,7 +148,7 @@ var CstyleBehaviour = function () { return false; }); - this.add("string_dquotes", function (state, editor, session, text) { + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { if (text == '"') { var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); @@ -193,7 +197,9 @@ var CstyleBehaviour = function () { } } return false; - }, function (state, editor, session, range) { + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '"') { var line = session.doc.getLine(range.start.row); diff --git a/lib/ace/mode/text.js b/lib/ace/mode/text.js index 620364a7..7e2e96a2 100644 --- a/lib/ace/mode/text.js +++ b/lib/ace/mode/text.js @@ -153,7 +153,7 @@ var Mode = function() { this.$modes[this.$embeds[i]] = new mapping[this.$embeds[i]](); } - var delegations = ['toggleCommentLines', 'getNextLineIndent', 'checkOutdent', 'autoOutdent', 'transformInsert', 'transformRemove']; + var delegations = ['toggleCommentLines', 'getNextLineIndent', 'checkOutdent', 'autoOutdent', 'transformAction']; for (var i = 0; i < delegations.length; i++) { (function(scope) { @@ -182,36 +182,21 @@ var Mode = function() { return defaultHandler ? defaultHandler.apply(this, args) : undefined; }; - this.transformInsert = function(state, editor, session, text) { + this.transformAction = function(state, action, editor, session, param) { if (this.$behaviour) { - var behaviours = this.$behaviour.getBehaviours(); - for (var key in behaviours) { - if (behaviours.hasOwnProperty(key)) { - var ret = behaviours[key].insert.apply(this, arguments); - if (ret !== false) { - return ret; - } - } - } + var behaviours = this.$behaviour.getBehaviours(); + for (var key in behaviours) { + if (behaviours.hasOwnProperty(key) && behaviours[key][action]) { + var ret = behaviours[key][action].apply(this, arguments); + if (ret !== false) { + return ret; + } + } + } } return false; - }; + } - this.transformRemove = function(state, editor, session, range) { - if (this.$behaviour) { - var behaviours = this.$behaviour.getBehaviours(); - for (var key in behaviours) { - if (behaviours.hasOwnProperty(key)) { - var ret = behaviours[key].remove.apply(this, arguments); - if (ret !== false) { - return ret; - } - } - } - } - return range; - }; - }).call(Mode.prototype); exports.Mode = Mode;