|
@@ -126,10 +126,10 @@ class CodeConsole extends Widget {
|
|
this._content = new Panel();
|
|
this._content = new Panel();
|
|
this._input = new Panel();
|
|
this._input = new Panel();
|
|
|
|
|
|
- let contentFactory = this.contentFactory = (
|
|
|
|
|
|
+ this.contentFactory = (
|
|
options.contentFactory || CodeConsole.defaultContentFactory
|
|
options.contentFactory || CodeConsole.defaultContentFactory
|
|
);
|
|
);
|
|
- let modelFactory = this.modelFactory = (
|
|
|
|
|
|
+ this.modelFactory = (
|
|
options.modelFactory || CodeConsole.defaultModelFactory
|
|
options.modelFactory || CodeConsole.defaultModelFactory
|
|
);
|
|
);
|
|
this.rendermime = options.rendermime;
|
|
this.rendermime = options.rendermime;
|
|
@@ -144,17 +144,6 @@ class CodeConsole extends Widget {
|
|
layout.addWidget(this._content);
|
|
layout.addWidget(this._content);
|
|
layout.addWidget(this._input);
|
|
layout.addWidget(this._input);
|
|
|
|
|
|
- // Create the banner.
|
|
|
|
- let model = modelFactory.createRawCell({});
|
|
|
|
- model.value.text = '...';
|
|
|
|
- let banner = this._banner = new RawCell({
|
|
|
|
- model,
|
|
|
|
- contentFactory: contentFactory
|
|
|
|
- });
|
|
|
|
- banner.addClass(BANNER_CLASS);
|
|
|
|
- banner.readOnly = true;
|
|
|
|
- this._content.addWidget(banner);
|
|
|
|
-
|
|
|
|
// Set up the foreign iopub handler.
|
|
// Set up the foreign iopub handler.
|
|
this._foreignHandler = new ForeignHandler({
|
|
this._foreignHandler = new ForeignHandler({
|
|
session: this.session,
|
|
session: this.session,
|
|
@@ -168,6 +157,7 @@ class CodeConsole extends Widget {
|
|
|
|
|
|
this._onKernelChanged();
|
|
this._onKernelChanged();
|
|
this.session.kernelChanged.connect(this._onKernelChanged, this);
|
|
this.session.kernelChanged.connect(this._onKernelChanged, this);
|
|
|
|
+ this.session.statusChanged.connect(this._onKernelStatusChanged, this);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -239,14 +229,33 @@ class CodeConsole extends Widget {
|
|
this.update();
|
|
this.update();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ addBanner() {
|
|
|
|
+ if (this._banner) {
|
|
|
|
+ // An old banner just becomes a normal cell now.
|
|
|
|
+ let cell = this._banner;
|
|
|
|
+ this._cells.push(this._banner);
|
|
|
|
+ cell.disposed.connect(this._onCellDisposed, this);
|
|
|
|
+ }
|
|
|
|
+ // Create the banner.
|
|
|
|
+ let model = this.modelFactory.createRawCell({});
|
|
|
|
+ model.value.text = '...';
|
|
|
|
+ let banner = this._banner = new RawCell({
|
|
|
|
+ model,
|
|
|
|
+ contentFactory: this.contentFactory
|
|
|
|
+ });
|
|
|
|
+ banner.addClass(BANNER_CLASS);
|
|
|
|
+ banner.readOnly = true;
|
|
|
|
+ this._content.addWidget(banner);
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Clear the code cells.
|
|
* Clear the code cells.
|
|
*/
|
|
*/
|
|
clear(): void {
|
|
clear(): void {
|
|
- // Dispose all the content cells except the first, which is the banner.
|
|
|
|
- let cells = this._content.widgets;
|
|
|
|
- while (cells.length > 1) {
|
|
|
|
- cells[1].dispose();
|
|
|
|
|
|
+ // Dispose all the content cells
|
|
|
|
+ let cells = this._cells;
|
|
|
|
+ while (cells.length > 0) {
|
|
|
|
+ cells.get(0).dispose();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -524,9 +533,7 @@ class CodeConsole extends Widget {
|
|
* Update the console based on the kernel info.
|
|
* Update the console based on the kernel info.
|
|
*/
|
|
*/
|
|
private _handleInfo(info: KernelMessage.IInfoReply): void {
|
|
private _handleInfo(info: KernelMessage.IInfoReply): void {
|
|
- let layout = this._content.layout as PanelLayout;
|
|
|
|
- let banner = layout.widgets[0] as RawCell;
|
|
|
|
- banner.model.value.text = info.banner;
|
|
|
|
|
|
+ this._banner.model.value.text = info.banner;
|
|
let lang = info.language_info as nbformat.ILanguageInfoMetadata;
|
|
let lang = info.language_info as nbformat.ILanguageInfoMetadata;
|
|
this._mimetype = this._mimeTypeService.getMimeTypeByLanguage(lang);
|
|
this._mimetype = this._mimeTypeService.getMimeTypeByLanguage(lang);
|
|
if (this.promptCell) {
|
|
if (this.promptCell) {
|
|
@@ -611,19 +618,35 @@ class CodeConsole extends Widget {
|
|
*/
|
|
*/
|
|
private _onKernelChanged(): void {
|
|
private _onKernelChanged(): void {
|
|
this.clear();
|
|
this.clear();
|
|
- let kernel = this.session.kernel;
|
|
|
|
- if (!kernel) {
|
|
|
|
- return;
|
|
|
|
|
|
+ if (this._banner) {
|
|
|
|
+ this._banner.dispose();
|
|
|
|
+ this._banner = null;
|
|
}
|
|
}
|
|
- kernel.ready.then(() => {
|
|
|
|
- if (this.isDisposed || !kernel || !kernel.info) {
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Handle a change to the kernel status.
|
|
|
|
+ */
|
|
|
|
+ private _onKernelStatusChanged(): void {
|
|
|
|
+ if (this.session.status === 'connected') {
|
|
|
|
+ // we just had a kernel restart or reconnect - reset banner
|
|
|
|
+ let kernel = this.session.kernel;
|
|
|
|
+ if (!kernel) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- this._handleInfo(kernel.info);
|
|
|
|
- });
|
|
|
|
|
|
+ this.addBanner();
|
|
|
|
+ kernel.requestKernelInfo().then(() => {
|
|
|
|
+ if (this.isDisposed || !kernel || !kernel.info) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ this._handleInfo(this.session.kernel.info);
|
|
|
|
+ }).catch(err => {
|
|
|
|
+ console.error('could not get kernel info');
|
|
|
|
+ });
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
- private _banner: RawCell;
|
|
|
|
|
|
+ private _banner: RawCell = null;
|
|
private _cells: IObservableList<Cell>;
|
|
private _cells: IObservableList<Cell>;
|
|
private _content: Panel;
|
|
private _content: Panel;
|
|
private _executed = new Signal<this, Date>(this);
|
|
private _executed = new Signal<this, Date>(this);
|