define([
'require',
'jquery',
'base/js/namespace',
'base/js/events',
'base/js/utils',
'notebook/js/codecell',
], function (
requirejs,
$,
Jupyter,
events,
utils,
codecell
) {
"use strict";
var CodeCell = codecell.CodeCell;
var Scratchpad = function (nb) {
var scratchpad = this;
this.notebook = nb;
this.kernel = nb.kernel;
this.km = nb.keyboard_manager;
this.collapsed = true;
// create elements
this.element = $("
");
this.close_button = $("
").addClass("fa fa-caret-square-o-down scratchpad-btn scratchpad-close");
this.open_button = $("").addClass("fa fa-caret-square-o-up scratchpad-btn scratchpad-open");
this.element.append(this.close_button);
this.element.append(this.open_button);
this.open_button.click(function () {
scratchpad.expand();
});
this.close_button.click(function () {
scratchpad.collapse();
});
// create my cell
var cell = this.cell = new CodeCell(nb.kernel, {
events: nb.events,
config: nb.config,
keyboard_manager: nb.keyboard_manager,
notebook: nb,
tooltip: nb.tooltip,
});
cell.set_input_prompt();
this.element.append($("").addClass('cell-wrapper').append(this.cell.element));
cell.render();
cell.refresh();
this.collapse();
// override ctrl/shift-enter to execute me if I'm focused instead of the notebook's cell
var execute_and_select_action = this.km.actions.register({
handler: $.proxy(this.execute_and_select_event, this),
}, 'scratchpad-execute-and-select');
var execute_action = this.km.actions.register({
handler: $.proxy(this.execute_event, this),
}, 'scratchpad-execute');
var toggle_action = this.km.actions.register({
handler: $.proxy(this.toggle, this),
}, 'scratchpad-toggle');
var shortcuts = {
'shift-enter': execute_and_select_action,
'ctrl-enter': execute_action,
'ctrl-b': toggle_action,
}
this.km.edit_shortcuts.add_shortcuts(shortcuts);
this.km.command_shortcuts.add_shortcuts(shortcuts);
// finally, add me to the page
$("body").append(this.element);
};
Scratchpad.prototype.toggle = function () {
if (this.collapsed) {
this.expand();
} else {
this.collapse();
}
return false;
};
Scratchpad.prototype.expand = function () {
this.collapsed = false;
var site_height = $("#site").height();
this.element.animate({
height: site_height,
}, 200);
this.open_button.hide();
this.close_button.show();
this.cell.element.show();
this.cell.focus_editor();
//$("#notebook-container").css('margin-left', 0);
};
Scratchpad.prototype.collapse = function () {
this.collapsed = true;
//$("#notebook-container").css('margin-left', 'auto');
this.element.animate({
height: 0,
}, 100);
this.close_button.hide();
this.open_button.show();
this.cell.element.hide();
};
Scratchpad.prototype.execute_and_select_event = function (evt) {
if (utils.is_focused(this.element)) {
this.cell.execute();
} else {
this.notebook.execute_cell_and_select_below();
}
};
Scratchpad.prototype.execute_event = function (evt) {
if (utils.is_focused(this.element)) {
this.cell.execute();
} else {
this.notebook.execute_selected_cells();
}
};
function setup_scratchpad () {
// lazy, hook it up to Jupyter.notebook as the handle on all the singletons
console.log("Setting up scratchpad");
return new Scratchpad(Jupyter.notebook);
}
function load_extension () {
// add css
var link = document.createElement("link");
link.type = "text/css";
link.rel = "stylesheet";
link.href = requirejs.toUrl("./scratchpad.css");
document.getElementsByTagName("head")[0].appendChild(link);
// load when the kernel's ready
if (Jupyter.notebook.kernel) {
setup_scratchpad();
} else {
events.on('kernel_ready.Kernel', setup_scratchpad);
}
}
return {
load_ipython_extension: load_extension,
};
});