nicely integrate the worker code

This commit is contained in:
Fabian Jakobs 2011-01-23 14:59:53 +01:00
commit 8238e36ca1
8 changed files with 114 additions and 61 deletions

View file

@ -59,48 +59,42 @@ exports.launch = function(env) {
var emacs = require("ace/keyboard/keybinding/emacs").Emacs;
var HashHandler = require("ace/keyboard/hash_handler").HashHandler;
var WorkerClient = require("ace/worker/worker_client").WorkerClient;
var docs = {};
docs.js = new EditSession(document.getElementById("jstext").innerHTML);
docs.js.setMode(new JavaScriptMode());
docs.js.setUndoManager(new UndoManager());
var worker = new WorkerClient("../..", ["ace", "pilot"], "ace/worker/mirror", "Mirror");
worker.call("setValue", [docs.js.getValue()]);
docs.js.getDocument().on("change", function(e) {
e.range = {
start: e.data.range.start,
end: e.data.range.end
};
worker.emit("change", e);
});
if (false && window.Worker) {
var worker = new WorkerClient("../..", ["ace", "pilot"], "ace/worker/mirror", "Mirror");
worker.call("setValue", [docs.js.getValue()]);
worker.on("jslint", function(results) {
var errors = [];
for (var i=0; i<results.data.length; i++) {
var error = results.data[i];
if (error)
errors.push({
row: error.line-1,
column: error.character-1,
text: error.reason,
type: "error",
lint: error
})
}
docs.js.setAnnotations(errors)
});
window.mirror = function() {
worker.call("getValue", [], function(value) {
console.log(value)
docs.js.getDocument().on("change", function(e) {
e.range = {
start: e.data.range.start,
end: e.data.range.end
};
worker.emit("change", e);
});
}
worker.on("jslint", function(results) {
var errors = [];
for (var i=0; i<results.data.length; i++) {
var error = results.data[i];
if (error)
errors.push({
row: error.line-1,
column: error.character-1,
text: error.reason,
type: "error",
lint: error
})
}
docs.js.setAnnotations(errors)
});
};
docs.css = new EditSession(document.getElementById("csstext").innerHTML);
docs.css.setMode(new CssMode());
docs.css.setUndoManager(new UndoManager());

View file

@ -52,16 +52,14 @@ var EditSession = function(text, mode) {
this.selection = new Selection(this);
this.$breakpoints = [];
this.listeners = [];
if (mode) {
this.setMode(mode);
}
if (text instanceof Document) {
this.setDocument(text)
} else {
this.setDocument(new Document(text));
}
if (mode)
this.setMode(mode);
};
@ -288,6 +286,12 @@ var EditSession = function(text, mode) {
this.setMode = function(mode) {
if (this.$mode === mode) return;
if (this.$worker)
this.$worker.terminate();
if (window.Worker)
this.$worker = mode.createWorker(this);
this.$mode = mode;
this._dispatchEvent("changeMode");
};

View file

@ -43,6 +43,7 @@ var Tokenizer = require("ace/tokenizer").Tokenizer;
var JavaScriptHighlightRules = require("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules;
var MatchingBraceOutdent = require("ace/mode/matching_brace_outdent").MatchingBraceOutdent;
var Range = require("ace/range").Range;
var WorkerClient = require("ace/worker/worker_client").WorkerClient;
var Mode = function() {
this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());
@ -120,6 +121,39 @@ oop.inherits(Mode, TextMode);
this.autoOutdent = function(state, doc, row) {
return this.$outdent.autoOutdent(doc, row);
};
this.createWorker = function(session) {
var doc = session.getDocument();
var worker = new WorkerClient("../..", ["ace", "pilot"], "ace/mode/javascript_worker", "JavaScriptWorker");
worker.call("setValue", [doc.getValue()]);
doc.on("change", function(e) {
e.range = {
start: e.data.range.start,
end: e.data.range.end
};
worker.emit("change", e);
});
worker.on("jslint", function(results) {
var errors = [];
for (var i=0; i<results.data.length; i++) {
var error = results.data[i];
if (error)
errors.push({
row: error.line-1,
column: error.character-1,
text: error.reason,
type: "error",
lint: error
})
}
session.setAnnotations(errors)
});
return worker;
};
}).call(Mode.prototype);

View file

@ -0,0 +1,24 @@
define(function(require, exports, module) {
var oop = require("pilot/oop");
var Mirror = require("ace/worker/mirror").Mirror;
var lint = require("ace/worker/jslint").JSLINT;
var JavaScriptWorker = exports.JavaScriptWorker = function(sender) {
Mirror.call(this, sender);
this.setTimeout(500);
};
oop.inherits(JavaScriptWorker, Mirror);
(function() {
this.onUpdate = function() {
lint(this.doc.getValue(), {undef: false, onevar: false, passfail: false});
this.sender.emit("jslint", lint.errors);
}
}).call(JavaScriptWorker.prototype);
});

View file

@ -73,6 +73,10 @@ var Mode = function() {
return "";
};
this.createWorker = function(session) {
return null;
};
}).call(Mode.prototype);

View file

@ -1,16 +0,0 @@
define(function(require, exports, module) {
var Demo = exports.Demo = function(sender) {
this.sender = sender;
};
(function() {
this.juhu = function() {
console.log("JUHU")
}
}).call(Demo.prototype);
});

View file

@ -2,7 +2,6 @@
define(function(require, exports, module) {
var Document = require("ace/document").Document;
var lint = require("ace/worker/jslint").JSLINT;
var lang = require("pilot/lang");
var Mirror = exports.Mirror = function(sender) {
@ -11,17 +10,24 @@ var Mirror = exports.Mirror = function(sender) {
var deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this));
var _self = this;
sender.on("change", function(e) {
doc.applyDeltas([e.data]);
deferredUpdate.schedule(500);
deferredUpdate.schedule(_self.$timeout);
})
};
(function() {
this.$timeout = 500;
this.setTimeout = function(timeout) {
this.$timeout = timeout;
};
this.setValue = function(value) {
this.doc.setValue(value);
this.deferredUpdate.schedule(500);
this.deferredUpdate.schedule(this.$timeout);
};
this.getValue = function(callbackId) {
@ -29,9 +35,8 @@ var Mirror = exports.Mirror = function(sender) {
};
this.onUpdate = function() {
lint(this.doc.getValue(), {undef: false, onevar: false, passfail: false});
this.sender.emit("jslint", lint.errors);
}
// abstract method
};
}).call(Mirror.prototype);

View file

@ -64,6 +64,10 @@ var WorkerClient = function(baseUrl, topLevelNamespaces, module, classname) {
oop.implement(this, EventEmitter);
this.terminate = function() {
this.$worker.terminate();
};
this.send = function(cmd, args) {
this.$worker.postMessage({command: cmd, args: args});
};