123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- // Copyright (c) Jupyter Development Team.
- // Distributed under the terms of the Modified BSD License.
- import {
- ISessionContext,
- SessionContext,
- sessionContextDialogs
- } from '@jupyterlab/apputils';
- import { IEditorMimeTypeService } from '@jupyterlab/codeeditor';
- import { PathExt, Time } from '@jupyterlab/coreutils';
- import { UUID } from '@lumino/coreutils';
- import {
- IRenderMimeRegistry,
- RenderMimeRegistry
- } from '@jupyterlab/rendermime';
- import { ServiceManager } from '@jupyterlab/services';
- import { Token } from '@lumino/coreutils';
- import { Message } from '@lumino/messaging';
- import { Panel } from '@lumino/widgets';
- import { CodeConsole } from './widget';
- import { IDisposable } from '@lumino/disposable';
- /**
- * 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.uuid4()}`;
- }
- let sessionContext = (this._sessionContext = new SessionContext({
- sessionManager: manager.sessions,
- specsManager: manager.kernelspecs,
- path,
- name: name || `Console ${count}`,
- type: 'console',
- kernelPreference: options.kernelPreference,
- setBusy: options.setBusy
- }));
- let resolver = new RenderMimeRegistry.UrlResolver({
- session: sessionContext,
- contents: manager.contents
- });
- rendermime = rendermime.clone({ resolver });
- this.console = contentFactory.createConsole({
- rendermime,
- sessionContext: sessionContext,
- mimeTypeService,
- contentFactory,
- modelFactory
- });
- this.addWidget(this.console);
- void sessionContext.initialize().then(async value => {
- if (value) {
- await sessionContextDialogs.selectKernel(sessionContext);
- }
- this._connected = new Date();
- this._updateTitle();
- });
- this.console.executed.connect(this._onExecuted, this);
- this._updateTitle();
- sessionContext.kernelChanged.connect(this._updateTitle, this);
- sessionContext.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 sessionContext(): ISessionContext {
- return this._sessionContext;
- }
- /**
- * Dispose of the resources held by the widget.
- */
- dispose(): void {
- this.sessionContext.dispose();
- this.console.dispose();
- super.dispose();
- }
- /**
- * 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 _sessionContext: SessionContext;
- }
- /**
- * 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: IRenderMimeRegistry;
- /**
- * 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?: ISessionContext.IKernelPreference;
- /**
- * The model factory for the console widget.
- */
- modelFactory?: CodeConsole.IModelFactory;
- /**
- * The service used to look up mime types.
- */
- mimeTypeService: IEditorMimeTypeService;
- /**
- * A function to call when the kernel is busy.
- */
- setBusy?: () => IDisposable;
- }
- /**
- * 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 sessionContext = panel.console.sessionContext.session;
- if (sessionContext) {
- let caption =
- `Name: ${sessionContext.name}\n` +
- `Directory: ${PathExt.dirname(sessionContext.path)}\n` +
- `Kernel: ${panel.console.sessionContext.kernelDisplayName}`;
- if (connected) {
- caption += `\nConnected: ${Time.format(connected.toISOString())}`;
- }
- if (executed) {
- caption += `\nLast Execution: ${Time.format(executed.toISOString())}`;
- }
- panel.title.label = sessionContext.name;
- panel.title.caption = caption;
- } else {
- panel.title.label = 'Console';
- panel.title.caption = '';
- }
- }
- }
|