Caret/js/tab.js

164 lines
4.4 KiB
JavaScript
Raw Normal View History

define([
"command",
"storage/file",
"util/manos",
"settings!ace,user",
"util/template!templates/tab.html"
], function(command, File, M, Settings, inflate) {
2014-02-27 06:34:02 +00:00
/*
Tabs are just augmented versions of regular Ace sessions. We add properties
to track the attached file, detect syntax, render the tab UI, and fire events
when the tab is removed.
*/
var EditSession = ace.require("ace/edit_session").EditSession;
var Tab = function(contents, file) {
contents = contents || "";
EditSession.call(this, contents, "ace/mode/text");
if (contents) {
this.setValue(contents);
}
if (file) {
this.setFile(file);
} else {
this.fileName = "untitled.txt";
}
this.modified = false;
this.setUndoManager(new ace.UndoManager());
var self = this;
this.on("change", function() {
if (self.modified) return;
self.modified = true;
command.fire("session:render");
});
this.animationClass = "enter";
};
//hopefully this never screws up unaugmented Ace sessions.
Tab.prototype = EditSession.prototype;
Tab.prototype.setFile = function(file) {
this.file = file;
this.fileName = file.entry.name;
this.modifiedAt = new Date();
}
Tab.prototype.save = function(as, c) {
if (typeof as == "function") {
c = as;
as = false;
}
//strip final whitespace, if enabled
if (Settings.get("user").trimTrailingWhitespace) {
command.fire("ace:trim-whitespace");
}
var content = this.getValue();
var self = this;
2013-12-23 19:20:04 +00:00
var deferred = M.deferred();
2013-12-23 19:20:04 +00:00
var whenOpen = function() {
self.file.write(content).then(function() {
self.modifiedAt = new Date();
self.modified = false;
command.fire("session:render");
deferred.done();
}, deferred.fail.bind(deferred));
};
if (!self.file || as) {
var file = new File();
file.open("save")
.then(function() {
self.file = file;
self.fileName = file.entry.name;
delete self.syntaxMode;
self.detectSyntax();
2013-12-23 19:20:04 +00:00
}, function(err) {
dialog(err);
deferred.fail();
})
.then(whenOpen);
} else {
whenOpen();
2013-12-23 19:20:04 +00:00
}
2013-12-23 19:20:04 +00:00
if (c) M.pton(deferred, c);
return deferred.promise();
};
Tab.prototype.drop = function() {
2013-11-03 01:30:37 +00:00
//let listeners know, like the project manager
this._emit("close");
if (!this.file || !chrome.fileSystem.retainEntry) return;
var id = this.file.retain();
if (!id) return;
chrome.storage.local.get("retained", function(data) {
if (!data.retained) return;
var filtered = data.retained.filter(function(item) { return item != id });
chrome.storage.local.set({ retained: filtered });
});
};
Tab.prototype.render = function(index) {
var element = inflate.get("templates/tab.html", {
index: index,
fileName: this.fileName,
modified: this.modified,
animation: this.animationClass
});
this.animationClass = "";
return element;
}
Tab.prototype.detectSyntax = function(userConfig) {
//settings are async
2014-01-21 07:19:25 +00:00
var self = this;
Settings.pull("user").then(function(data) {
var userConfig = data.user;
2014-01-21 07:19:25 +00:00
self.setUseSoftTabs(!userConfig.useTabs);
self.setTabSize(userConfig.indentation || 2);
self.setUseWrapMode(userConfig.wordWrap);
self.setWrapLimit(userConfig.wrapLimit || null);
self.setNewLineMode(userConfig.lineEnding || "auto");
self.setUseWorker(userConfig.useWorker);
});
//syntax, however, is sync
2014-02-22 06:37:13 +00:00
var syntaxValue = this.syntaxMode || "plain_text";
2014-02-22 06:49:40 +00:00
if (this.file) {
if (this.file.virtual) {
//settings files are special
syntaxValue = "javascript";
this.setMode("ace/mode/javascript");
} else if (this.file.entry) {
var extension = this.file.entry.name.split(".").pop();
//this won't ever change, safe to get each time
var aceConfig = Settings.get("ace");
for (var i = 0; i < aceConfig.modes.length; i++) {
var mode = aceConfig.modes[i];
if (mode.extensions.indexOf(extension) > -1) {
syntaxValue = mode.name;
break;
}
}
}
}
2014-02-22 06:37:13 +00:00
this.setMode("ace/mode/" + syntaxValue);
2014-02-22 06:27:36 +00:00
this.syntaxMode = syntaxValue;
return syntaxValue;
}
return Tab;
});