123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- // Copyright (c) Jupyter Development Team.
- // Distributed under the terms of the Modified BSD License.
- import {
- ClientSession, IClientSession
- } from '@jupyterlab/apputils';
- import {
- IEditorMimeTypeService
- } from '@jupyterlab/codeeditor';
- import {
- PathExt, Time, uuid
- } from '@jupyterlab/coreutils';
- import {
- RenderMimeRegistry
- } from '@jupyterlab/rendermime';
- import {
- ServiceManager
- } from '@jupyterlab/services';
- import {
- Token
- } from '@phosphor/coreutils';
- import {
- Message
- } from '@phosphor/messaging';
- import {
- Panel
- } from '@phosphor/widgets';
- import {
- CodeConsole
- } from './widget';
- /**
- * The class name added to console panels.
- */
- const PANEL_CLASS = 'jp-ConsolePanel';
- const CONSOLE_ICON_CLASS = 'jp-CodeConsoleIcon';
- /**
- * A panel which contains a console and the ability to add other children.
- */
- export
- class ConsolePanel extends Panel {
- /**
- * Construct a console panel.
- */
- constructor(options: ConsolePanel.IOptions) {
- super();
- this.addClass(PANEL_CLASS);
- let {
- rendermime, mimeTypeService, path, basePath, name, manager, modelFactory
- } = options;
- let contentFactory = this.contentFactory = (
- options.contentFactory || ConsolePanel.defaultContentFactory
- );
- let count = Private.count++;
- if (!path) {
- path = `${basePath || ''}/console-${count}-${uuid()}`;
- }
- let session = this._session = new ClientSession({
- manager: manager.sessions,
- path,
- name: name || `Console ${count}`,
- type: 'console',
- kernelPreference: options.kernelPreference
- });
- let resolver = new RenderMimeRegistry.UrlResolver({
- session,
- contents: manager.contents
- });
- rendermime = rendermime.clone({ resolver });
- this.console = contentFactory.createConsole({
- rendermime, session, mimeTypeService, contentFactory, modelFactory
- });
- this.addWidget(this.console);
- session.ready.then(() => {
- this._connected = new Date();
- this._updateTitle();
- });
- this.console.executed.connect(this._onExecuted, this);
- session.kernelChanged.connect(this._updateTitle, this);
- session.propertyChanged.connect(this._updateTitle, this);
- this.title.icon = CONSOLE_ICON_CLASS;
- this.title.closable = true;
- this.id = `console-${count}`;
- }
- /**
- * The content factory used by the console panel.
- */
- readonly contentFactory: ConsolePanel.IContentFactory;
- /**
- * The console widget used by the panel.
- */
- readonly console: CodeConsole;
- /**
- * The session used by the panel.
- */
- get session(): IClientSession {
- return this._session;
- }
- /**
- * Dispose of the resources held by the widget.
- */
- dispose(): void {
- this.console.dispose();
- super.dispose();
- }
- /**
- * Handle `'after-attach'` messages.
- */
- protected onAfterAttach(msg: Message): void {
- this._session.initialize();
- let prompt = this.console.promptCell;
- if (prompt) {
- prompt.editor.focus();
- }
- }
- /**
- * Handle `'activate-request'` messages.
- */
- protected onActivateRequest(msg: Message): void {
- let prompt = this.console.promptCell;
- if (prompt) {
- prompt.editor.focus();
- }
- }
- /**
- * Handle `'close-request'` messages.
- */
- protected onCloseRequest(msg: Message): void {
- super.onCloseRequest(msg);
- this.dispose();
- }
- /**
- * Handle a console execution.
- */
- private _onExecuted(sender: CodeConsole, args: Date) {
- this._executed = args;
- this._updateTitle();
- }
- /**
- * Update the console panel title.
- */
- private _updateTitle(): void {
- Private.updateTitle(this, this._connected, this._executed);
- }
- private _executed: Date | null = null;
- private _connected: Date | null = null;
- private _session: ClientSession;
- }
- /**
- * A namespace for ConsolePanel statics.
- */
- export
- namespace ConsolePanel {
- /**
- * The initialization options for a console panel.
- */
- export
- interface IOptions {
- /**
- * The rendermime instance used by the panel.
- */
- rendermime: RenderMimeRegistry;
- /**
- * The content factory for the panel.
- */
- contentFactory: IContentFactory;
- /**
- * The service manager used by the panel.
- */
- manager: ServiceManager.IManager;
- /**
- * The path of an existing console.
- */
- path?: string;
- /**
- * The base path for a new console.
- */
- basePath?: string;
- /**
- * The name of the console.
- */
- name?: string;
- /**
- * A kernel preference.
- */
- kernelPreference?: IClientSession.IKernelPreference;
- /**
- * The model factory for the console widget.
- */
- modelFactory?: CodeConsole.IModelFactory;
- /**
- * The service used to look up mime types.
- */
- mimeTypeService: IEditorMimeTypeService;
- }
- /**
- * The console panel renderer.
- */
- export
- interface IContentFactory extends CodeConsole.IContentFactory {
- /**
- * Create a new console panel.
- */
- createConsole(options: CodeConsole.IOptions): CodeConsole;
- }
- /**
- * Default implementation of `IContentFactory`.
- */
- export
- class ContentFactory extends CodeConsole.ContentFactory implements IContentFactory {
- /**
- * Create a new console panel.
- */
- createConsole(options: CodeConsole.IOptions): CodeConsole {
- return new CodeConsole(options);
- }
- }
- /**
- * A namespace for the console panel content factory.
- */
- export
- namespace ContentFactory {
- /**
- * Options for the code console content factory.
- */
- export
- interface IOptions extends CodeConsole.ContentFactory.IOptions { }
- }
- /**
- * A default code console content factory.
- */
- export
- const defaultContentFactory: IContentFactory = new ContentFactory();
- /* tslint:disable */
- /**
- * The console renderer token.
- */
- export
- const IContentFactory = new Token<IContentFactory>('@jupyterlab/console:IContentFactory');
- /* tslint:enable */
- }
- /**
- * A namespace for private data.
- */
- namespace Private {
- /**
- * The counter for new consoles.
- */
- export
- let count = 1;
- /**
- * Update the title of a console panel.
- */
- export
- function updateTitle(panel: ConsolePanel, connected: Date | null, executed: Date | null) {
- let session = panel.console.session;
- let caption = (
- `Name: ${session.name}\n` +
- `Directory: ${PathExt.dirname(session.path)}\n` +
- `Kernel: ${session.kernelDisplayName}`
- );
- if (connected) {
- caption += `\nConnected: ${Time.format(connected.toISOString())}`;
- }
- if (executed) {
- caption += `\nLast Execution: ${Time.format(executed.toISOString())}`;
- }
- panel.title.label = session.name;
- panel.title.caption = caption;
- }
- }
|