move background tokenizer from the editor to the edit session

This commit is contained in:
Fabian Jakobs 2011-04-26 10:39:27 +02:00
commit f9bf9bfc9a
5 changed files with 61 additions and 62 deletions

View file

@ -52,7 +52,6 @@ var MouseHandler = require("ace/mouse_handler").MouseHandler;
var KeyBinding = require("ace/keyboard/keybinding").KeyBinding;
var EditSession = require("ace/edit_session").EditSession;
var Search = require("ace/search").Search;
var BackgroundTokenizer = require("ace/background_tokenizer").BackgroundTokenizer;
var Range = require("ace/range").Range;
var EventEmitter = require("pilot/event_emitter").EventEmitter;
@ -122,6 +121,7 @@ var Editor =function(renderer, session) {
var oldSession = this.session;
this.session.removeEventListener("change", this.$onDocumentChange);
this.session.removeEventListener("changeMode", this.$onChangeMode);
this.session.removeEventListener("tokenizerUpdate", this.$onTokenizerUpdate);
this.session.removeEventListener("changeTabSize", this.$onChangeTabSize);
this.session.removeEventListener("changeWrapLimit", this.$onChangeWrapLimit);
this.session.removeEventListener("changeWrapMode", this.$onChangeWrapMode);
@ -147,6 +147,9 @@ var Editor =function(renderer, session) {
this.$onChangeMode = this.onChangeMode.bind(this);
session.addEventListener("changeMode", this.$onChangeMode);
this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);
session.addEventListener("tokeizerupdate", this.$onTokenizerUpdate);
this.$onChangeTabSize = this.renderer.updateText.bind(this.renderer);
session.addEventListener("changeTabSize", this.$onChangeTabSize);
@ -178,8 +181,6 @@ var Editor =function(renderer, session) {
this.selection.addEventListener("changeSelection", this.$onSelectionChange);
this.onChangeMode();
this.bgTokenizer.setDocument(session.getDocument());
this.bgTokenizer.start(0);
this.onCursorChange();
this.onSelectionChange();
@ -278,7 +279,6 @@ var Editor =function(renderer, session) {
var delta = e.data;
var range = delta.range;
this.bgTokenizer.start(range.start.row);
if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines")
var lastRow = range.end.row;
else
@ -341,7 +341,7 @@ var Editor =function(renderer, session) {
this.onCursorChange(e);
if (this.$highlightSelectedWord)
this.mode.highlightSelection(this);
this.session.getMode().highlightSelection(this);
};
this.onChangeFrontMarker = function() {
@ -361,22 +361,7 @@ var Editor =function(renderer, session) {
};
this.onChangeMode = function() {
var mode = this.session.getMode();
if (this.mode == mode)
return;
this.mode = mode;
var tokenizer = mode.getTokenizer();
if (!this.bgTokenizer) {
var onUpdate = this.onTokenizerUpdate.bind(this);
this.bgTokenizer = new BackgroundTokenizer(tokenizer, this);
this.bgTokenizer.addEventListener("update", onUpdate);
} else {
this.bgTokenizer.setTokenizer(tokenizer);
}
this.renderer.setTokenizer(this.bgTokenizer);
this.renderer.updateText()
};
this.onChangeWrapLimit = function() {
@ -410,6 +395,9 @@ var Editor =function(renderer, session) {
if (this.$readOnly)
return;
var session = this.session;
var mode = session.getMode();
var cursor = this.getCursorPosition();
text = text.replace("\t", this.session.getTabString());
@ -426,28 +414,27 @@ var Editor =function(renderer, session) {
this.clearSelection();
var lineState = this.bgTokenizer.getState(cursor.row);
var shouldOutdent = this.mode.checkOutdent(lineState, this.session.getLine(cursor.row), text);
var line = this.session.getLine(cursor.row);
var lineIndent = this.mode.getNextLineIndent(lineState, line.slice(0, cursor.column), this.session.getTabString());
var end = this.session.insert(cursor, text);
var lineState = session.getState(cursor.row);
var shouldOutdent = mode.checkOutdent(lineState, session.getLine(cursor.row), text);
var line = session.getLine(cursor.row);
var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());
var end = session.insert(cursor, text);
var lineState = this.bgTokenizer.getState(cursor.row);
var lineState = session.getState(cursor.row);
// TODO disabled multiline auto indent
// possibly doing the indent before inserting the text
// if (cursor.row !== end.row) {
if (this.session.getDocument().isNewLine(text)) {
if (session.getDocument().isNewLine(text)) {
this.moveCursorTo(cursor.row+1, 0);
var size = this.session.getTabSize(),
minIndent = Number.MAX_VALUE;
var size = session.getTabSize();
var minIndent = Number.MAX_VALUE;
for (var row = cursor.row + 1; row <= end.row; ++row) {
var indent = 0;
line = this.session.getLine(row);
line = session.getLine(row);
for (var i = 0; i < line.length; ++i)
if (line.charAt(i) == '\t')
indent += size;
@ -462,18 +449,18 @@ var Editor =function(renderer, session) {
for (var row = cursor.row + 1; row <= end.row; ++row) {
var outdent = minIndent;
line = this.session.getLine(row);
line = session.getLine(row);
for (var i = 0; i < line.length && outdent > 0; ++i)
if (line.charAt(i) == '\t')
outdent -= size;
else if (line.charAt(i) == ' ')
outdent -= 1;
this.session.remove(new Range(row, 0, row, i));
session.remove(new Range(row, 0, row, i));
}
this.session.indentRows(cursor.row + 1, end.row, lineIndent);
session.indentRows(cursor.row + 1, end.row, lineIndent);
} else {
if (shouldOutdent) {
this.mode.autoOutdent(lineState, this.session, cursor.row);
mode.autoOutdent(lineState, session, cursor.row);
}
};
}
@ -538,9 +525,9 @@ var Editor =function(renderer, session) {
this.$highlightSelectedWord = shouldHighlight;
if (shouldHighlight)
this.mode.highlightSelection(this);
this.session.getMode().highlightSelection(this);
else
this.mode.clearSelectionHighlight(this);
this.session.getMode().clearSelectionHighlight(this);
};
this.getHighlightSelectedWord = function() {
@ -726,9 +713,9 @@ var Editor =function(renderer, session) {
if (this.$readOnly)
return;
var state = this.bgTokenizer.getState(this.getCursorPosition().row);
var state = this.session.getState(this.getCursorPosition().row);
var rows = this.$getSelectedRows()
this.mode.toggleCommentLines(state, this.session, rows.first, rows.last);
this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);
};
this.removeLines = function() {