Make behavioural actions easily extensible

This commit is contained in:
c-spencer 2011-05-22 14:34:01 +01:00
commit bc45a88928
4 changed files with 42 additions and 48 deletions

View file

@ -415,7 +415,7 @@ var Editor =function(renderer, session) {
if (this.getBehavioursEnabled()) { if (this.getBehavioursEnabled()) {
// Get a transform if the current mode wants one. // 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) if (transform)
text = transform.text; text = transform.text;
} }
@ -637,7 +637,10 @@ var Editor =function(renderer, session) {
if (this.getBehavioursEnabled()) { if (this.getBehavioursEnabled()) {
var session = this.session; var session = this.session;
var state = session.getState(range.start.row); 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); this.session.remove(range);

View file

@ -44,20 +44,24 @@ var Behaviour = function() {
(function () { (function () {
this.add = function (name, insert, remove) { this.add = function (name, action, callback) {
if (this.$behaviours === undefined) { switch (undefined) {
case this.$behaviours:
this.$behaviours = {}; this.$behaviours = {};
case this.$behaviours[name]:
this.$behaviours[name] = {};
} }
this.$behaviours[name] = { this.$behaviours[name][action] = callback;
insert: insert,
remove: remove
};
} }
this.addBehaviours = function (behaviours) { this.addBehaviours = function (behaviours) {
for (var key in behaviours) { for (var key in behaviours) {
if (behaviours.hasOwnProperty(key)) { 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 { } else {
var behaviours = mode.getBehaviours(); var behaviours = mode.getBehaviours();
} }
for (var key in behaviours) { this.addBehaviours(behaviours);
if (behaviours.hasOwnProperty(key)) {
this.add(key, behaviours[key].insert, behaviours[key].remove);
}
}
} }
this.getBehaviours = function (filter) { this.getBehaviours = function (filter) {

View file

@ -43,7 +43,7 @@ var Behaviour = require('ace/mode/behaviour').Behaviour;
var CstyleBehaviour = function () { var CstyleBehaviour = function () {
this.add("brace_insert", function (state, editor, session, text) { this.add("braces", "insertion", function (state, action, editor, session, text) {
if (text == '{') { if (text == '{') {
var selection = editor.getSelectionRange(); var selection = editor.getSelectionRange();
var selected = session.doc.getTextRange(selection); var selected = session.doc.getTextRange(selection);
@ -88,7 +88,9 @@ var CstyleBehaviour = function () {
} }
} }
return false; return false;
}, function (state, editor, session, range) { });
this.add("braces", "deletion", function (state, action, editor, session, range) {
var selected = session.doc.getTextRange(range); var selected = session.doc.getTextRange(range);
if (!range.isMultiLine() && selected == '{') { if (!range.isMultiLine() && selected == '{') {
var line = session.doc.getLine(range.start.row); var line = session.doc.getLine(range.start.row);
@ -101,7 +103,7 @@ var CstyleBehaviour = function () {
return false; return false;
}); });
this.add("parens_insert", function (state, editor, session, text) { this.add("parens", "insertion", function (state, action, editor, session, text) {
if (text == '(') { if (text == '(') {
var selection = editor.getSelectionRange(); var selection = editor.getSelectionRange();
var selected = session.doc.getTextRange(selection); var selected = session.doc.getTextRange(selection);
@ -131,7 +133,9 @@ var CstyleBehaviour = function () {
} }
} }
return false; return false;
}, function (state, editor, session, range) { });
this.add("parens", "deletion", function (state, action, editor, session, range) {
var selected = session.doc.getTextRange(range); var selected = session.doc.getTextRange(range);
if (!range.isMultiLine() && selected == '(') { if (!range.isMultiLine() && selected == '(') {
var line = session.doc.getLine(range.start.row); var line = session.doc.getLine(range.start.row);
@ -144,7 +148,7 @@ var CstyleBehaviour = function () {
return false; return false;
}); });
this.add("string_dquotes", function (state, editor, session, text) { this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {
if (text == '"') { if (text == '"') {
var selection = editor.getSelectionRange(); var selection = editor.getSelectionRange();
var selected = session.doc.getTextRange(selection); var selected = session.doc.getTextRange(selection);
@ -193,7 +197,9 @@ var CstyleBehaviour = function () {
} }
} }
return false; return false;
}, function (state, editor, session, range) { });
this.add("string_dquotes", "deletion", function (state, action, editor, session, range) {
var selected = session.doc.getTextRange(range); var selected = session.doc.getTextRange(range);
if (!range.isMultiLine() && selected == '"') { if (!range.isMultiLine() && selected == '"') {
var line = session.doc.getLine(range.start.row); var line = session.doc.getLine(range.start.row);

View file

@ -153,7 +153,7 @@ var Mode = function() {
this.$modes[this.$embeds[i]] = new mapping[this.$embeds[i]](); 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++) { for (var i = 0; i < delegations.length; i++) {
(function(scope) { (function(scope) {
@ -182,12 +182,12 @@ var Mode = function() {
return defaultHandler ? defaultHandler.apply(this, args) : undefined; 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) { if (this.$behaviour) {
var behaviours = this.$behaviour.getBehaviours(); var behaviours = this.$behaviour.getBehaviours();
for (var key in behaviours) { for (var key in behaviours) {
if (behaviours.hasOwnProperty(key)) { if (behaviours.hasOwnProperty(key) && behaviours[key][action]) {
var ret = behaviours[key].insert.apply(this, arguments); var ret = behaviours[key][action].apply(this, arguments);
if (ret !== false) { if (ret !== false) {
return ret; return ret;
} }
@ -195,22 +195,7 @@ var Mode = function() {
} }
} }
return false; 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); }).call(Mode.prototype);