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()) {
// 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);

View file

@ -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) {

View file

@ -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);

View file

@ -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;