diff --git a/IPython/html/static/notebook/js/widget.js b/IPython/html/static/notebook/js/widget.js
index 6b3927c2a..189b1ce6e 100644
--- a/IPython/html/static/notebook/js/widget.js
+++ b/IPython/html/static/notebook/js/widget.js
@@ -29,9 +29,9 @@ define(["components/underscore/underscore-min",
// WidgetModel class
//--------------------------------------------------------------------
var WidgetModel = Backbone.Model.extend({
- constructor: function(comm_manager, comm, widget_view_types) {
+ constructor: function(comm_manager, comm, widget_manager) {
this.comm_manager = comm_manager;
- this.widget_view_types = widget_view_types;
+ this.widget_manager = widget_manager;
this.pending_msgs = 0;
this.msg_throttle = 3;
this.msg_buffer = null;
@@ -53,8 +53,8 @@ define(["components/underscore/underscore-min",
this.last_modified_view = caller;
this.save(this.changedAttributes(), {patch: true});
- for (var output_area in this.views) {
- var views = this.views[output_area];
+ for (var cell in this.views) {
+ var views = this.views[cell];
for (var view_index in views) {
var view = views[view_index];
if (view !== caller) {
@@ -65,7 +65,7 @@ define(["components/underscore/underscore-min",
},
- handle_status: function (output_area, msg) {
+ handle_status: function (cell, msg) {
//execution_state : ('busy', 'idle', 'starting')
if (msg.content.execution_state=='idle') {
@@ -74,8 +74,8 @@ define(["components/underscore/underscore-min",
if (this.msg_buffer != null &&
this.msg_throttle == this.pending_msgs) {
- var output_area = this._get_output_area(msg.parent_header.msg_id);
- var callbacks = this._make_callbacks(output_area);
+ var cell = this._get_msg_cell(msg.parent_header.msg_id);
+ var callbacks = this._make_callbacks(cell);
var data = {sync_method: 'update', sync_data: this.msg_buffer};
this.comm.send(data, callbacks);
this.msg_buffer = null;
@@ -125,12 +125,12 @@ define(["components/underscore/underscore-min",
var data = {sync_method: method, sync_data: send_json};
- var output_area = null;
+ var cell = null;
if (this.last_modified_view != undefined && this.last_modified_view != null) {
- output_area = this.last_modified_view.output_area;
+ cell = this.last_modified_view.cell;
}
- var callbacks = this._make_callbacks(output_area);
+ var callbacks = this._make_callbacks(cell);
this.comm.send(data, callbacks);
this.pending_msgs++;
}
@@ -149,14 +149,14 @@ define(["components/underscore/underscore-min",
case 'display':
// Try to get the cell index.
- var output_area = this._get_output_area(msg.parent_header.msg_id);
- if (output_area == null) {
+ var cell = this._get_msg_cell(msg.parent_header.msg_id);
+ if (cell == null) {
console.log("Could not determine where the display" +
" message was from. Widget will not be displayed")
} else {
this.display_view(msg.content.data.view_name,
msg.content.data.parent,
- output_area);
+ cell);
}
break;
case 'update':
@@ -189,8 +189,8 @@ define(["components/underscore/underscore-min",
// Handle when a widget is closed.
handle_comm_closed: function (msg) {
- for (var output_area in this.views) {
- var views = this.views[output_area];
+ for (var cell in this.views) {
+ var views = this.views[cell];
for (var view_index in views) {
var view = views[view_index];
view.remove();
@@ -200,18 +200,18 @@ define(["components/underscore/underscore-min",
// Create view that represents the model.
- display_view: function (view_name, parent_comm_id, output_area) {
+ display_view: function (view_name, parent_comm_id, cell) {
var new_views = [];
var displayed = false;
if (parent_comm_id != undefined) {
var parent_comm = this.comm_manager.comms[parent_comm_id];
var parent_model = parent_comm.model;
- var parent_views = parent_model.views[output_area];
+ var parent_views = parent_model.views[cell];
for (var parent_view_index in parent_views) {
var parent_view = parent_views[parent_view_index];
if (parent_view.display_child != undefined) {
- var view = this._create_view(view_name, output_area);
+ var view = this._create_view(view_name, cell);
new_views.push(view);
parent_view.display_child(view);
displayed = true;
@@ -222,11 +222,13 @@ define(["components/underscore/underscore-min",
if (!displayed) {
// No parent view is defined or exists. Add the view's
// element to cell's widget div.
- var view = this._create_view(view_name, output_area);
+ var view = this._create_view(view_name, cell);
new_views.push(view);
- this._get_widget_area_element(output_area, true)
- .append(view.$el);
-
+
+ if (cell.widget_subarea != undefined && cell.widget_subarea != null) {
+ cell.widget_area.show();
+ cell.widget_subarea.append(view.$el);
+ }
}
for (var view_index in new_views) {
@@ -237,25 +239,25 @@ define(["components/underscore/underscore-min",
// Create a view
- _create_view: function (view_name, output_area) {
- var view = new this.widget_view_types[view_name]({model: this});
+ _create_view: function (view_name, cell) {
+ var view = new this.widget_manager.widget_view_types[view_name]({model: this});
view.render();
- if (this.views[output_area]==undefined) {
- this.views[output_area] = []
+ if (this.views[cell]==undefined) {
+ this.views[cell] = []
}
- this.views[output_area].push(view);
- view.output_area = output_area;
+ this.views[cell].push(view);
+ view.cell = cell;
// Handle when the view element is remove from the page.
var that = this;
view.$el.on("remove", function(){
- var index = that.views[output_area].indexOf(view);
+ var index = that.views[cell].indexOf(view);
if (index > -1) {
- that.views[output_area].splice(index, 1);
+ that.views[cell].splice(index, 1);
}
view.remove(); // Clean-up view
- if (that.views[output_area].length()==0) {
- delete that.views[output_area];
+ if (that.views[cell].length()==0) {
+ delete that.views[cell];
}
// Close the comm if there are no views left.
@@ -268,21 +270,21 @@ define(["components/underscore/underscore-min",
// Build a callback dict.
- _make_callbacks: function (output_area) {
+ _make_callbacks: function (cell) {
var callbacks = {};
- if (output_area != null) {
+ if (cell != null && cell.output_area != undefined && cell.output_area != null) {
var that = this;
callbacks = {
iopub : {
- output : $.proxy(output_area.handle_output, output_area),
- clear_output : $.proxy(output_area.handle_clear_output, output_area),
+ output : $.proxy(cell.output_area.handle_output, cell.output_area),
+ clear_output : $.proxy(cell.output_area.handle_clear_output, cell.output_area),
status : function(msg){
- that.handle_status(output_area, msg);
+ that.handle_status(cell, msg);
},
- get_output_area : function() {
+ get_cell : function() {
if (that.last_modified_view != undefined &&
- that.last_modified_view.output_area != undefined) {
- return that.last_modified_view.output_area;
+ that.last_modified_view.cell != undefined) {
+ return that.last_modified_view.cell;
} else {
return null
}
@@ -295,47 +297,33 @@ define(["components/underscore/underscore-min",
// Get the output area corresponding to the msg_id.
- // output_area is an instance of Ipython.OutputArea
- _get_output_area: function (msg_id) {
+ // cell is an instance of IPython.Cell
+ _get_msg_cell: function (msg_id) {
// First, check to see if the msg was triggered by cell execution.
- var cell = IPython.notebook.get_msg_cell(msg_id);
+ var cell = this.widget_manager.get_msg_cell(msg_id);
if (cell != null) {
- return cell.output_area;
+ return cell;
}
- // Second, check to see if a get_output_area callback was defined
- // for the message. get_output_area callbacks are registered for
+ // Second, check to see if a get_cell callback was defined
+ // for the message. get_cell callbacks are registered for
// widget messages, so this block is actually checking to see if the
// message was triggered by a widget.
var kernel = this.comm_manager.kernel;
var callbacks = kernel.get_callbacks_for_msg(msg_id);
if (callbacks != undefined &&
callbacks.iopub != undefined &&
- callbacks.iopub.get_output_area != undefined) {
+ callbacks.iopub.get_cell != undefined) {
- var output_area = callbacks.iopub.get_output_area();
- if (output_area != null) {
- return output_area;
- }
+ return callbacks.iopub.get_cell();
}
- // Not triggered by a cell or widget (no get_output_area callback
+ // Not triggered by a cell or widget (no get_cell callback
// exists).
return null;
},
- // Gets widget output area (as a JQuery element) from the
- // output_area (Ipython.OutputArea instance)
- _get_widget_area_element: function (output_area, show) {
- var widget_area = output_area.element
- .parent() // output_wrapper
- .parent() // cell
- .find('.widget-area');
- if (show) { widget_area.show(); }
- return widget_area.find('.widget-subarea');
- },
-
});
@@ -469,7 +457,14 @@ define(["components/underscore/underscore-min",
WidgetManager.prototype.handle_com_open = function (comm, msg) {
var widget_type_name = msg.content.target_name;
- var widget_model = new this.widget_model_types[widget_type_name](this.comm_manager, comm, this.widget_view_types);
+ var widget_model = new this.widget_model_types[widget_type_name](this.comm_manager, comm, this);
+ }
+
+
+ WidgetManager.prototype.get_msg_cell = function (msg_id) {
+ if (IPython.notebook != undefined && IPython.notebook != null) {
+ return IPython.notebook.get_msg_cell(msg_id);
+ }
}