c9-core/plugins/c9.ide.format/format.js

150 wiersze
4.6 KiB
JavaScript

define(function(require, exports, module) {
main.consumes = [
"Plugin", "ui", "commands", "menus", "tabManager", "dialog.alert", "preferences"
];
main.provides = ["format"];
return main;
function main(options, imports, register) {
var Plugin = imports.Plugin;
var ui = imports.ui;
var commands = imports.commands;
var tabManager = imports.tabManager;
var menus = imports.menus;
var alert = imports["dialog.alert"].show;
var prefs = imports.preferences;
/***** Initialization *****/
var plugin = new Plugin("Ajax.org", main.consumes);
var emit = plugin.getEmitter();
var count = 300;
var mnuFormat;
var loaded = false;
function load() {
if (loaded) return false;
loaded = true;
commands.addCommand({
name: "formatcode",
hint: "reformat selected JavaScript code in the editor",
msg: "Beautifying selection.",
bindKey: { mac: "Command-Shift-B", win: "Ctrl-Shift-B" },
exec: function(editor, args) {
formatCode(args.mode, editor, args.all);
}
}, plugin);
commands.addCommand({
name: "formatprefs",
hint: "open language & formatting preferences",
exec: function(editor, args) {
commands.exec("openpreferences", null, {
panel: "preferences.project",
section: "JavaScript Support"
});
}
}, plugin);
mnuFormat = new ui.menu({
onitemclick: function(e) {
if (e.value && e.value != "auto")
formatCode(e.value);
}
});
menus.addItemByPath("Edit/Code Formatting", mnuFormat, 1400, plugin);
menus.addItemByPath("Edit/Code Formatting/Apply Code Formatting", new ui.item({
selected: true,
value: "auto",
command: "formatcode"
}), 100, plugin);
menus.addItemByPath("Edit/Code Formatting/Open Language & Formatting Preferences...", new ui.item({
selected: true,
value: "auto",
command: "formatprefs"
}), 200, plugin);
}
/***** Methods *****/
function getMode(editor) {
return editor.ace.session.syntax;
}
function formatCode(mode, editor, all) {
if (!editor)
editor = tabManager.focussedTab.editor;
if (!mode || mode === "auto")
mode = getMode(editor);
if (editor.ace.selection.isEmpty())
all = true;
if (!emit("format", { mode: mode, editor: editor, all: all })) {
alert("Error",
"This code could not be beautified",
'"' + mode + "\" is not supported yet");
}
}
function addFormatter(caption, mode, plugin) {
if (count === 300)
menus.addItemByPath("Edit/Code Formatting/~", new ui.divider(), 300, plugin);
menus.addItemByPath("Edit/Code Formatting/" + caption, new ui.item({
value: mode,
isAvailable: commands.commands.formatcode.isAvailable
}), count += 100, plugin);
}
/***** Lifecycle *****/
plugin.on("load", function() {
load();
});
plugin.on("enable", function() {
});
plugin.on("disable", function() {
});
plugin.on("unload", function() {
loaded = false;
mnuFormat = null;
});
/***** Register and define API *****/
/**
*
**/
plugin.freezePublicAPI({
/**
*
*/
formatCode: formatCode,
/**
*
*/
addFormatter: addFormatter,
_events: [
/**
* @event format
* @param {Object} e
* @param {String} e.mode
*/
"format"
]
});
register(null, {
format: plugin
});
}
});