jupyterlab-emrys
Version:
A computational environment for Jupyter. Powered by Emrys
215 lines (214 loc) • 7.61 kB
JavaScript
// Copyright (c) Jupyter Development Team.
// Distributed under the terms of the Modified BSD License.
"use strict";
var jupyter_js_services_1 = require('jupyter-js-services');
var phosphor_menus_1 = require('phosphor-menus');
var docregistry_1 = require('../docregistry');
var inspector_1 = require('../inspector');
var plugin_1 = require('../mainmenu/plugin');
var rendermime_1 = require('../rendermime');
var widgettracker_1 = require('../widgettracker');
var _1 = require('./');
/**
* The console extension.
*/
exports.consoleExtension = {
id: 'jupyter.extensions.console',
requires: [jupyter_js_services_1.ServiceManager, rendermime_1.RenderMime, plugin_1.MainMenu, inspector_1.Inspector],
activate: activateConsole
};
/**
* The class name for all main area landscape tab icons.
*/
var LANDSCAPE_ICON_CLASS = 'jp-MainAreaLandscapeIcon';
/**
* The class name for the console icon from the default theme.
*/
var CONSOLE_ICON_CLASS = 'jp-ImageConsole';
/**
* Activate the console extension.
*/
function activateConsole(app, services, rendermime, mainMenu, inspector) {
var tracker = new widgettracker_1.WidgetTracker();
var manager = services.sessions;
// Set the source of the code inspector to the current console.
tracker.activeWidgetChanged.connect(function (sender, panel) {
inspector.source = panel.content.inspectionHandler;
});
var newSubmenuItems = [];
// Add the ability to create new consoles for each kernel.
var specs = services.kernelspecs;
var displayNameMap = Object.create(null);
for (var kernelName in specs.kernelspecs) {
var displayName = specs.kernelspecs[kernelName].spec.display_name;
displayNameMap[displayName] = kernelName;
}
var displayNames = Object.keys(displayNameMap).sort(function (a, b) {
return a.localeCompare(b);
});
var count = 0;
var _loop_1 = function(displayName) {
var id = "console:create-" + displayNameMap[displayName];
app.commands.add([{
id: id,
handler: function () {
manager.startNew({
path: "Console-" + count++,
kernelName: "" + displayNameMap[displayName]
}).then(function (session) {
var panel = new _1.ConsolePanel({
session: session, rendermime: rendermime.clone()
});
panel.id = "console-" + count;
panel.title.text = displayName + " (" + count + ")";
panel.title.icon = LANDSCAPE_ICON_CLASS + " " + CONSOLE_ICON_CLASS;
panel.title.closable = true;
app.shell.addToMainArea(panel);
tracker.addWidget(panel);
});
}
}]);
app.palette.add([{
command: id,
category: 'Console',
text: "New " + displayName + " console"
}]);
newSubmenuItems.push(new phosphor_menus_1.MenuItem({
text: displayName + " console",
handler: function () {
app.commands.execute(id);
}
}));
};
for (var _i = 0, displayNames_1 = displayNames; _i < displayNames_1.length; _i++) {
var displayName = displayNames_1[_i];
_loop_1(displayName);
}
app.commands.add([
{
id: 'console:clear',
handler: function () {
if (tracker.activeWidget) {
tracker.activeWidget.content.clear();
}
}
},
{
id: 'console:dismiss-completion',
handler: function () {
if (tracker.activeWidget) {
tracker.activeWidget.content.dismissCompletion();
}
}
},
{
id: 'console:execute',
handler: function () {
if (tracker.activeWidget) {
tracker.activeWidget.content.execute();
}
}
},
{
id: 'console:interrupt-kernel',
handler: function () {
if (tracker.activeWidget) {
var kernel = tracker.activeWidget.content.session.kernel;
if (kernel) {
kernel.interrupt();
}
}
}
},
{
id: 'console:switch-kernel',
handler: function () {
if (tracker.activeWidget) {
var widget_1 = tracker.activeWidget.content;
var session_1 = widget_1.session;
var lang_1 = '';
if (session_1.kernel) {
lang_1 = specs.kernelspecs[session_1.kernel.name].spec.language;
}
manager.listRunning().then(function (sessions) {
var options = {
name: widget_1.parent.title.text,
specs: specs,
sessions: sessions,
preferredLanguage: lang_1,
kernel: session_1.kernel.model,
host: widget_1.parent.node
};
return docregistry_1.selectKernel(options);
}).then(function (kernelId) {
if (kernelId) {
session_1.changeKernel(kernelId);
}
else {
session_1.kernel.shutdown();
}
});
}
}
}
]);
app.palette.add([
{
command: 'console:clear',
category: 'Console',
text: 'Clear Cells'
},
{
command: 'console:execute',
category: 'Console',
text: 'Execute Cell'
},
{
command: 'console:interrupt-kernel',
category: 'Console',
text: 'Interrupt Kernel'
},
{
command: 'console:switch-kernel',
category: 'Console',
text: 'Switch Kernel'
}
]);
var newSubmenu = new phosphor_menus_1.Menu(newSubmenuItems);
var menu = new phosphor_menus_1.Menu([
new phosphor_menus_1.MenuItem({
text: 'New',
submenu: newSubmenu
}),
new phosphor_menus_1.MenuItem({
text: 'Clear Cells',
handler: function () {
app.commands.execute('console:clear');
}
}),
new phosphor_menus_1.MenuItem({
text: 'Execute Cell',
handler: function () {
app.commands.execute('console:execute');
}
}),
new phosphor_menus_1.MenuItem({
text: 'Interrupt Kernel',
handler: function () {
app.commands.execute('console:interrupt-kernel');
}
}),
new phosphor_menus_1.MenuItem({
text: 'Switch Kernel',
handler: function () {
app.commands.execute('console:switch-kernel');
}
})
]);
var consoleMenu = new phosphor_menus_1.MenuItem({
text: 'Console',
submenu: menu
});
mainMenu.addItem(consoleMenu, { rank: 50 });
return Promise.resolve(void 0);
}