kopia lustrzana https://github.com/c9/core
227 wiersze
7.2 KiB
JavaScript
227 wiersze
7.2 KiB
JavaScript
define(function(require, exports, module) {
|
|
"use strict";
|
|
|
|
main.consumes = [
|
|
"Plugin", "c9", "ui", "menus", "tabManager", "commands", "tree"
|
|
];
|
|
main.provides = ["newresource"];
|
|
return main;
|
|
|
|
function main(options, imports, register) {
|
|
var Plugin = imports.Plugin;
|
|
var c9 = imports.c9;
|
|
var ui = imports.ui;
|
|
var menus = imports.menus;
|
|
var commands = imports.commands;
|
|
var tabs = imports.tabManager;
|
|
var tree = imports.tree;
|
|
|
|
var templates = options.templates || require("text!./default.templates");
|
|
|
|
/***** Initialization *****/
|
|
|
|
var plugin = new Plugin("Ajax.org", main.consumes);
|
|
// var emit = plugin.getEmitter();
|
|
|
|
var readonly = c9.readonly;
|
|
var defaultExtension = "";
|
|
|
|
var loaded = false;
|
|
function load(callback) {
|
|
if (loaded) return false;
|
|
loaded = true;
|
|
|
|
commands.addCommand({
|
|
name: "newfile",
|
|
hint: "create a new file resource",
|
|
msg: "New file created.",
|
|
bindKey: { mac: "Ctrl-N", win: "Alt-N" },
|
|
exec: function () { newFile(); }
|
|
}, plugin);
|
|
|
|
// commands.addCommand({
|
|
// name: "newfiletemplate",
|
|
// hint: "open the new file template dialog",
|
|
// msg: "New directory created.",
|
|
// bindKey: { mac: "Ctrl-Shift-N", win: "Ctrl-Shift-N" },
|
|
// exec: function() { newFileTemplate(); }
|
|
// }, plugin);
|
|
|
|
commands.addCommand({
|
|
name: "newfolder",
|
|
hint: "create a new directory resource",
|
|
exec: function() { newFolder(); }
|
|
}, plugin);
|
|
|
|
menus.addItemByPath("File/New File", new ui.item({
|
|
disabled: readonly,
|
|
command: "newfile"
|
|
}), 100, plugin);
|
|
menus.addItemByPath("File/New From Template", new ui.item({
|
|
disabled: readonly,
|
|
}), 200, plugin);
|
|
|
|
// menus.addItemByPath("File/New Folder", new ui.item({
|
|
// disabled: readonly,
|
|
// command: "newfolder"
|
|
// }), 300, plugin);
|
|
// menus.addItemByPath("File/~", new ui.divider(), 400, plugin);
|
|
|
|
addFileTemplate(templates, plugin);
|
|
}
|
|
|
|
/***** Methods *****/
|
|
|
|
function getDirPath () {
|
|
var node = tree.getSelectedNode();
|
|
var path = node.path || node.getAttribute("path");
|
|
if (node.getAttribute ? node.getAttribute("type") == "file"
|
|
|| node.tagName == "file" : !node.isFolder)
|
|
path = path.replace(/\/[^\/]*$/, "/");
|
|
|
|
if (!/\/$/.test(path))
|
|
path += "/";
|
|
|
|
return path;
|
|
}
|
|
|
|
function newFile(type, value, path) {
|
|
if (readonly) return;
|
|
|
|
var filePath;
|
|
var name = "Untitled";
|
|
var count = 1;
|
|
type = type || "";
|
|
path = path || getDirPath();
|
|
var ext = defaultExtension;
|
|
|
|
while (tabs.findTab(filePath = path + name + (count || "") + type + ext))
|
|
count++;
|
|
|
|
tabs.open({
|
|
path: filePath,
|
|
value: value || "",
|
|
focus: true,
|
|
document: {
|
|
meta: {
|
|
newfile: true
|
|
}
|
|
}
|
|
}, function(err, tab) {
|
|
if (err)
|
|
return; // reported already
|
|
});
|
|
|
|
// ide.dispatchEvent("track_action", {type: "template", template: type});
|
|
}
|
|
|
|
function newFolder(path, callback) {
|
|
tree.createFolder(path, false, callback || function() {});
|
|
}
|
|
|
|
function parse(data) {
|
|
var list = [];
|
|
var context = { template: []};
|
|
list.push(context);
|
|
|
|
var restart;
|
|
data.split("\n").forEach(function(line) {
|
|
if (/^(?:\t| {4})(.*)/.test(line)) {
|
|
context.template.push(RegExp.$1);
|
|
restart = true;
|
|
return;
|
|
}
|
|
else if (restart) {
|
|
list.push(context = { template: []});
|
|
restart = false;
|
|
}
|
|
|
|
if (!line) return;
|
|
|
|
var m = line.match(/^(\w+) (.*)$/);
|
|
if (m)
|
|
context[m[1]] = m[2];
|
|
});
|
|
|
|
return list;
|
|
}
|
|
|
|
function addFileTemplate(data, forPlugin) {
|
|
// if (!plugin.loaded) return;
|
|
|
|
var list = parse(data);
|
|
|
|
list.forEach(function(item) {
|
|
menus.addItemByPath("File/New From Template/" + item.caption, new ui.item({
|
|
disabled: readonly,
|
|
onclick: function() {
|
|
newFile(item.filename, item.template.join("\n"));
|
|
}
|
|
}), 200, forPlugin);
|
|
});
|
|
|
|
// plugin.addOther(function(){
|
|
// list.forEach(functon(item){
|
|
// delete templates[name];
|
|
// });
|
|
// });
|
|
}
|
|
|
|
/***** Lifecycle *****/
|
|
|
|
plugin.on("load", function() {
|
|
load();
|
|
});
|
|
plugin.on("unload", function() {
|
|
loaded = false;
|
|
defaultExtension = null;
|
|
});
|
|
|
|
/***** Register and define API *****/
|
|
|
|
/**
|
|
* Adds File->New File and File->New Folder menu items as well as the
|
|
* commands for opening a new file as well as an API.
|
|
* @singleton
|
|
**/
|
|
plugin.freezePublicAPI({
|
|
/**
|
|
* Create a new file in the workspace
|
|
*
|
|
* @param {String} type The encoding of the content for the file
|
|
* @param {String} value The content of the file
|
|
* @param {String} path The path of the file to write
|
|
*/
|
|
newFile: newFile,
|
|
|
|
/**
|
|
* Create a new folder in the workspace and starts its renaming
|
|
*
|
|
* @param {String} name The name of the folder to create
|
|
* @param {String} dirPath The directory to create the folder into
|
|
* @param {Function} callback Called after the folder is created
|
|
* @param {Error} callback.err The error object if any error occured.
|
|
*/
|
|
newFolder: newFolder,
|
|
|
|
/**
|
|
*
|
|
*/
|
|
addFileTemplate: addFileTemplate,
|
|
|
|
/**
|
|
* Sets the default extension for newly created files
|
|
* @param extension The default extension to use
|
|
*/
|
|
set defaultExtension(extension) {
|
|
defaultExtension = extension ? "." + extension : "";
|
|
tree.defaultExtension = extension;
|
|
}
|
|
});
|
|
|
|
register(null, {
|
|
newresource: plugin
|
|
});
|
|
}
|
|
});
|