c9-core/plugins/c9.ide.remote/manager.js

148 wiersze
4.3 KiB
JavaScript

define(function(require, exports, module) {
main.consumes = [
"Plugin", "watcher", "tabManager", "fs", "error_handler"
];
main.provides = ["remote"];
return main;
function main(options, imports, register) {
var Plugin = imports.Plugin;
var watcher = imports.watcher;
var fs = imports.fs;
var tabManager = imports.tabManager;
var errorHandler = imports.error_handler;
/***** Initialization *****/
var plugin = new Plugin("Ajax.org", main.consumes);
// var emit = plugin.getEmitter();
var documents = {};
var loaded = false;
function load() {
if (loaded) return false;
loaded = true;
watcher.on("delete", function(e) {
var doc = documents[e.path];
if (!doc || doc.tab) return;
// some documents e.g cssdocument needs to remove itself from active previews
// @todo should we call doc.unload() instead ??
if (doc.remove)
doc.remove();
}, plugin);
watcher.on("change", function(e) {
var doc = documents[e.path];
if (!doc || doc.tab) return;
fs.readFile(e.path, function(err, data) {
if (typeof doc.update !== "function") {
return errorHandler.log(new Error("Tracked: doc.update is not a function"), { path: e.path, err: err, doc: doc });
}
doc.update(null, data);
});
}, plugin);
// Listen for opening files
tabManager.on("open", function(e) {
var tab = e.tab;
var doc = tab.path && documents[tab.path];
if (doc) doc.tab = tab;
}, plugin);
// Listen for closing tabs
tabManager.on("tabDestroy", function(e) {
var tab = e.tab;
var doc = tab.path && documents[tab.path];
if (doc) doc.tab = null;
}, plugin);
}
/***** Methods *****/
function registerDocument(doc) {
documents[doc.path] = doc;
watcher.watch(doc.path);
doc.tab = tabManager.findTab(doc.path);
doc.addOther(function() {
delete documents[doc.path];
});
}
function findDocument(path) {
return documents[path];
}
// function isKnownFile(path) {
// var found;
// if (~session.href.indexOf(path))
// return { url: session.href, type: "html" }
// function search(arr, type) {
// if (arr.some(function(p) {
// if (~p.indexOf(path)) {
// found = p;
// return true;
// }
// })) {
// return { url: found, type: type }
// }
// }
// return search(session.styles, "css")
// || search(session.scripts, "code");
// }
/***** Lifecycle *****/
plugin.on("load", function() {
load();
});
plugin.on("enable", function() {
});
plugin.on("disable", function() {
});
plugin.on("unload", function() {
loaded = false;
});
/***** Register and define API *****/
/**
*
**/
plugin.freezePublicAPI({
get documents() { return documents; },
_events: [
/**
* @event draw
*/
"draw"
],
/**
*
*/
findDocument: findDocument,
/**
*
*/
register: registerDocument
});
register(null, {
remote: plugin
});
}
});