c9-core/plugins/c9.ide.dialog.wizard/wizard.js

336 wiersze
9.8 KiB
JavaScript

define(function(require, module, exports) {
main.consumes = ["Plugin", "ui", "Dialog", "apf"];
main.provides = ["Wizard", "WizardPage"];
return main;
function main(options, imports, register) {
var Plugin = imports.Plugin;
var Dialog = imports.Dialog;
var apf = imports.apf;
var ui = imports.ui;
/***** Initialization *****/
function Wizard(developer, deps, options) {
var plugin = new Dialog(developer, deps.concat(main.consumes), {
name: "dialog.wizard",
allowClose: options.allowClose || false,
class: "wizard " + (options.class || ""),
height: options.height,
width: options.width,
resizable: options.resizable,
title: options.title,
modal: options.modal === undefined ? true : options.modal,
custom: true,
elements: [
{ type: "button", id: "cancel", caption: "Cancel", visible: false, onclick: cancel },
{ type: "filler" },
{ type: "button", id: "previous", caption: "Previous", visible: false, onclick: previous },
{ type: "button", id: "next", caption: "Next", color: "green", "default": true, onclick: next },
{ type: "button", id: "finish", caption: "Finish", visible: false, onclick: finish }
]
});
var emit = plugin.getEmitter();
var path = [];
var current = -1;
var body, startPage, lastPage;
var drawn = false;
function draw(options) {
if (drawn) return;
drawn = true;
var aml = new ui.bar();
options.aml.parentNode.insertBefore(aml, options.aml);
options.aml.removeNode();
body = { html: aml.$ext, aml: aml };
}
/***** Methods *****/
function cancel() {
emit("cancel", { activePage: lastPage });
}
function previous() {
current--;
activate(path[current]);
emit("previous", {
activePage: path[current]
});
}
function next() {
path.splice(current + 1);
plugin.update([
{ id: "previous", visible: true },
{ id: "next", visible: true }
]);
var page = emit("next", {
activePage: path[path.length - 1]
});
current = path.push(page) - 1;
activate(page, true);
}
function gotoPage(page) {
current = path.push(page) - 1;
activate(page, true);
}
function finish() {
plugin.hide();
emit("finish", { activePage: lastPage });
}
function activate(page, noButtons) {
var idx = path.indexOf(page);
if (idx == -1) throw new Error();
if (!noButtons) {
plugin.update([
{ id: "previous", visible: idx > 0 },
{ id: "next", visible: true }
]);
}
if (lastPage)
lastPage.hide();
page.show(body);
lastPage = page;
}
function show(reset) {
return plugin.queue(function() {
if (reset || current == -1) {
path = [startPage];
current = 0;
activate(startPage);
}
}, true);
}
/***** Lifecycle *****/
plugin.on("draw", function(options) {
draw(options);
});
/***** Register and define API *****/
plugin.freezePublicAPI.baseclass();
/**
*
*/
plugin.freezePublicAPI({
/**
*
*/
get activePage() { return path[current]; },
/**
*
*/
get startPage() { return startPage; },
set startPage(v) { startPage = v; },
/**
*
*/
get showPrevious() {
return plugin.getElement("previous").visible;
},
set showPrevious(value) {
plugin.update([
{ id: "previous", visible: value }
]);
},
/**
*
*/
get showNext() {
return plugin.getElement("next").visible;
},
set showNext(value) {
plugin.update([
{ id: "next", visible: value }
]);
},
/**
*
*/
get showCancel() {
return plugin.getElement("cancel").visible;
},
set showCancel(value) {
plugin.update([
{ id: "cancel", visible: value }
]);
},
/**
*
*/
get showFinish() {
return plugin.getElement("finish").visible;
},
set showFinish(value) {
plugin.update([
{ id: "finish", visible: value }
]);
},
_events: [
/**
* @event cancel
*/
"cancel",
/**
* @event previous
*/
"previous",
/**
* @event next
*/
"next",
/**
* @event finish
*/
"finish"
],
/**
*
*/
show: show,
/**
*
*/
cancel: cancel,
/**
*
*/
previous: previous,
/**
*
*/
next: next,
/**
*
*/
finish: finish,
/**
*
*/
gotoPage: gotoPage
});
return plugin;
}
function WizardPage(options, forPlugin) {
var plugin = new Plugin("Ajax.org", main.consumes);
var emit = plugin.getEmitter();
var name = options.name;
var aml;
if (forPlugin)
forPlugin.addOther(function() { plugin.unload(); });
var drawn;
function draw() {
if (drawn) return;
drawn = true;
aml = new ui.bar();
plugin.addOther(function() {
aml.removeNode();
});
apf.document.documentElement.appendChild(aml);
aml.removeNode();
emit.sticky("draw", { html: aml.$ext, aml: aml });
}
/***** Methods *****/
function hide() {
aml.parentNode.removeChild(aml);
emit("hide");
}
function show(options) {
draw();
options && options.aml.appendChild(aml);
emit("show");
}
/***** Register and define API *****/
plugin.freezePublicAPI.baseclass();
/**
*
*/
plugin.freezePublicAPI({
/**
*
*/
get name() { return name; },
/**
*
*/
get aml() { return aml; },
/**
*
*/
get container() { return aml && aml.$ext; },
_events: [
/**
* @event hide
*/
"hide",
/**
* @event show
*/
"show"
],
/**
*
*/
show: show,
/**
*
*/
hide: hide
});
return plugin;
}
register("", {
"Wizard": Wizard,
"WizardPage": WizardPage,
});
}
});