##// END OF EJS Templates
remove msg.content.data.view_name and corrosponding create_view param
Jonathan Frederic -
Show More
@@ -1,284 +1,292 b''
1 //----------------------------------------------------------------------------
1 //----------------------------------------------------------------------------
2 // Copyright (C) 2013 The IPython Development Team
2 // Copyright (C) 2013 The IPython Development Team
3 //
3 //
4 // Distributed under the terms of the BSD License. The full license is in
4 // Distributed under the terms of the BSD License. The full license is in
5 // the file COPYING, distributed as part of this software.
5 // the file COPYING, distributed as part of this software.
6 //----------------------------------------------------------------------------
6 //----------------------------------------------------------------------------
7
7
8 //============================================================================
8 //============================================================================
9 // WidgetModel, WidgetView, and WidgetManager
9 // WidgetModel, WidgetView, and WidgetManager
10 //============================================================================
10 //============================================================================
11 /**
11 /**
12 * Base Widget classes
12 * Base Widget classes
13 * @module IPython
13 * @module IPython
14 * @namespace IPython
14 * @namespace IPython
15 * @submodule widget
15 * @submodule widget
16 */
16 */
17
17
18 (function () {
18 (function () {
19 "use strict";
19 "use strict";
20
20
21 // Use require.js 'define' method so that require.js is intelligent enough to
21 // Use require.js 'define' method so that require.js is intelligent enough to
22 // syncronously load everything within this file when it is being 'required'
22 // syncronously load everything within this file when it is being 'required'
23 // elsewhere.
23 // elsewhere.
24 define(["underscore",
24 define(["underscore",
25 "backbone",
25 "backbone",
26 ], function (underscore, backbone) {
26 ], function (underscore, backbone) {
27
27
28 Backbone.sync = function (method, model, options, error) {
28 Backbone.sync = function (method, model, options, error) {
29 var result = model._handle_sync(method, options);
29 var result = model._handle_sync(method, options);
30 if (options.success) {
30 if (options.success) {
31 options.success(result);
31 options.success(result);
32 }
32 }
33 };
33 };
34
34
35 //--------------------------------------------------------------------
35 //--------------------------------------------------------------------
36 // WidgetManager class
36 // WidgetManager class
37 //--------------------------------------------------------------------
37 //--------------------------------------------------------------------
38 var WidgetManager = function () {
38 var WidgetManager = function () {
39 this.comm_manager = null;
39 this.comm_manager = null;
40 this._model_types = {}; /* Dictionary of model type names
40 this._model_types = {}; /* Dictionary of model type names
41 (target_name) and model types. */
41 (target_name) and model types. */
42 this._view_types = {}; /* Dictionary of view names and view types. */
42 this._view_types = {}; /* Dictionary of view names and view types. */
43 this._models = {}; /* Dictionary of model ids and model instances */
43 this._models = {}; /* Dictionary of model ids and model instances */
44 };
44 };
45
45
46
46
47 WidgetManager.prototype.attach_comm_manager = function (comm_manager) {
47 WidgetManager.prototype.attach_comm_manager = function (comm_manager) {
48 this.comm_manager = comm_manager;
48 this.comm_manager = comm_manager;
49
49
50 // Register already-registered widget model types with the comm manager.
50 // Register already-registered widget model types with the comm manager.
51 for (var widget_model_name in this._model_types) {
51 for (var widget_model_name in this._model_types) {
52 this.comm_manager.register_target(widget_model_name, $.proxy(this._handle_comm_open, this));
52 this.comm_manager.register_target(widget_model_name, $.proxy(this._handle_comm_open, this));
53 }
53 }
54 };
54 };
55
55
56
56
57 WidgetManager.prototype.register_widget_model = function (widget_model_name, widget_model_type) {
57 WidgetManager.prototype.register_widget_model = function (widget_model_name, widget_model_type) {
58 // Register the widget with the comm manager. Make sure to pass this object's context
58 // Register the widget with the comm manager. Make sure to pass this object's context
59 // in so `this` works in the call back.
59 // in so `this` works in the call back.
60 if (this.comm_manager !== null) {
60 if (this.comm_manager !== null) {
61 this.comm_manager.register_target(widget_model_name, $.proxy(this._handle_comm_open, this));
61 this.comm_manager.register_target(widget_model_name, $.proxy(this._handle_comm_open, this));
62 }
62 }
63 this._model_types[widget_model_name] = widget_model_type;
63 this._model_types[widget_model_name] = widget_model_type;
64 };
64 };
65
65
66
66
67 WidgetManager.prototype.register_widget_view = function (widget_view_name, widget_view_type) {
67 WidgetManager.prototype.register_widget_view = function (widget_view_name, widget_view_type) {
68 this._view_types[widget_view_name] = widget_view_type;
68 this._view_types[widget_view_name] = widget_view_type;
69 };
69 };
70
70
71
71
72 WidgetManager.prototype.handle_msg = function(msg, model) {
72 WidgetManager.prototype.handle_msg = function(msg, model) {
73 var method = msg.content.data.method;
73 var method = msg.content.data.method;
74 switch (method) {
74 switch (method) {
75 case 'display':
75 case 'display':
76 var cell = this.get_msg_cell(msg.parent_header.msg_id);
76 var cell = this.get_msg_cell(msg.parent_header.msg_id);
77 if (cell === null) {
77 if (cell === null) {
78 console.log("Could not determine where the display" +
78 console.log("Could not determine where the display" +
79 " message was from. Widget will not be displayed");
79 " message was from. Widget will not be displayed");
80 } else {
80 } else {
81 var view = this.create_view(model, msg.content.data.view_name);
81 var view = this.create_view(model);
82 if (view !== undefined
82 if (view !== undefined
83 && cell.widget_subarea !== undefined
83 && cell.widget_subarea !== undefined
84 && cell.widget_subarea !== null) {
84 && cell.widget_subarea !== null) {
85
85
86 view.cell = cell;
86 view.cell = cell;
87 cell.widget_area.show();
87 cell.widget_area.show();
88 cell.widget_subarea.append(view.$el);
88 cell.widget_subarea.append(view.$el);
89 }
89 }
90 }
90 }
91 break;
91 break;
92 }
92 }
93 }
93 }
94
94
95 <<<<<<< HEAD
95 <<<<<<< HEAD
96 <<<<<<< HEAD
96 <<<<<<< HEAD
97 <<<<<<< HEAD
97 WidgetManager.prototype.create_view = function(model, view_name, cell) {
98 WidgetManager.prototype.create_view = function(model, view_name, cell) {
98 =======
99 =======
99 WidgetManager.prototype.create_view = function(model, view_name, options) {
100 WidgetManager.prototype.create_view = function(model, view_name, options) {
100 >>>>>>> Completely remove cell from model and view.
101 >>>>>>> Completely remove cell from model and view.
101 view_name = view_name || model.get('default_view_name');
102 view_name = view_name || model.get('default_view_name');
102 <<<<<<< HEAD
103 <<<<<<< HEAD
103 =======
104 =======
104 WidgetManager.prototype.create_view = function(model, view_name, cell, options) {
105 WidgetManager.prototype.create_view = function(model, view_name, cell, options) {
105 view_name = view_name || model.get('default_view_name');
106 view_name = view_name || model.get('default_view_name');
106 >>>>>>> Add widget view options in creating child views
107 >>>>>>> Add widget view options in creating child views
107 var ViewType = this.widget_view_types[view_name];
108 var ViewType = this.widget_view_types[view_name];
108 =======
109 =======
110 =======
111 WidgetManager.prototype.create_view = function(model, options) {
112 var view_name = model.get('view_name');
113 >>>>>>> remove msg.content.data.view_name and corrosponding create_view param
109 var ViewType = this._view_types[view_name];
114 var ViewType = this._view_types[view_name];
110 >>>>>>> _model_types, _view_types, _models - and document what keys and values are
115 >>>>>>> _model_types, _view_types, _models - and document what keys and values are
111 if (ViewType !== undefined && ViewType !== null) {
116 if (ViewType !== undefined && ViewType !== null) {
112 var view = new ViewType({model: model, widget_manager: this, options: options});
117 var view = new ViewType({model: model, widget_manager: this, options: options});
113 view.render();
118 view.render();
114 model.views.push(view);
119 model.views.push(view);
115 model.on('destroy', view.remove, view);
120 model.on('destroy', view.remove, view);
116 <<<<<<< HEAD
121 <<<<<<< HEAD
122 <<<<<<< HEAD
117 /*
123 /*
118 // TODO: handle view deletion. Don't forget to delete child views
124 // TODO: handle view deletion. Don't forget to delete child views
119 var that = this;
125 var that = this;
120 view.$el.on("remove", function () {
126 view.$el.on("remove", function () {
121 var index = that.views.indexOf(view);
127 var index = that.views.indexOf(view);
122 if (index > -1) {
128 if (index > -1) {
123 that.views.splice(index, 1);
129 that.views.splice(index, 1);
124 =======
130 =======
125 /*
131 /*
126 // TODO: handle view deletion. Don't forget to delete child views
132 // TODO: handle view deletion. Don't forget to delete child views
127 var that = this;
133 var that = this;
128 view.$el.on("remove", function () {
134 view.$el.on("remove", function () {
129 var index = that.views.indexOf(view);
135 var index = that.views.indexOf(view);
130 if (index > -1) {
136 if (index > -1) {
131 that.views.splice(index, 1);
137 that.views.splice(index, 1);
132 }
138 }
133 view.remove(); // Clean-up view
139 view.remove(); // Clean-up view
134
140
135 // Close the comm if there are no views left.
141 // Close the comm if there are no views left.
136 if (that.views.length() === 0) {
142 if (that.views.length() === 0) {
137 //trigger comm close event?
143 //trigger comm close event?
138 }
144 }
139
145
140
146
141 if (that.comm !== undefined) {
147 if (that.comm !== undefined) {
142 that.comm.close();
148 that.comm.close();
143 delete that.comm.model; // Delete ref so GC will collect widget model.
149 delete that.comm.model; // Delete ref so GC will collect widget model.
144 delete that.comm;
150 delete that.comm;
145 >>>>>>> Add widget view options in creating child views
151 >>>>>>> Add widget view options in creating child views
146 }
152 }
147 view.remove(); // Clean-up view
153 view.remove(); // Clean-up view
148
154
149 // Close the comm if there are no views left.
155 // Close the comm if there are no views left.
150 if (that.views.length() === 0) {
156 if (that.views.length() === 0) {
151 //trigger comm close event?
157 //trigger comm close event?
152 }
158 }
153
159
154
160
155 if (that.comm !== undefined) {
161 if (that.comm !== undefined) {
156 that.comm.close();
162 that.comm.close();
157 delete that.comm.model; // Delete ref so GC will collect widget model.
163 delete that.comm.model; // Delete ref so GC will collect widget model.
158 delete that.comm;
164 delete that.comm;
159 }
165 }
160 delete that.model_id; // Delete id from model so widget manager cleans up.
166 delete that.model_id; // Delete id from model so widget manager cleans up.
161 });
167 });
162 */
168 */
169 =======
170 >>>>>>> remove msg.content.data.view_name and corrosponding create_view param
163 return view;
171 return view;
164 }
172 }
165 },
173 },
166
174
167 WidgetManager.prototype.get_msg_cell = function (msg_id) {
175 WidgetManager.prototype.get_msg_cell = function (msg_id) {
168 var cell = null;
176 var cell = null;
169 // First, check to see if the msg was triggered by cell execution.
177 // First, check to see if the msg was triggered by cell execution.
170 if (IPython.notebook !== undefined && IPython.notebook !== null) {
178 if (IPython.notebook !== undefined && IPython.notebook !== null) {
171 cell = IPython.notebook.get_msg_cell(msg_id);
179 cell = IPython.notebook.get_msg_cell(msg_id);
172 }
180 }
173 if (cell !== null) {
181 if (cell !== null) {
174 return cell
182 return cell
175 }
183 }
176 // Second, check to see if a get_cell callback was defined
184 // Second, check to see if a get_cell callback was defined
177 // for the message. get_cell callbacks are registered for
185 // for the message. get_cell callbacks are registered for
178 // widget messages, so this block is actually checking to see if the
186 // widget messages, so this block is actually checking to see if the
179 // message was triggered by a widget.
187 // message was triggered by a widget.
180 var kernel = this.get_kernel();
188 var kernel = this.get_kernel();
181 if (kernel !== undefined && kernel !== null) {
189 if (kernel !== undefined && kernel !== null) {
182 var callbacks = kernel.get_callbacks_for_msg(msg_id);
190 var callbacks = kernel.get_callbacks_for_msg(msg_id);
183 if (callbacks !== undefined &&
191 if (callbacks !== undefined &&
184 callbacks.iopub !== undefined &&
192 callbacks.iopub !== undefined &&
185 callbacks.iopub.get_cell !== undefined) {
193 callbacks.iopub.get_cell !== undefined) {
186
194
187 return callbacks.iopub.get_cell();
195 return callbacks.iopub.get_cell();
188 }
196 }
189 }
197 }
190
198
191 // Not triggered by a cell or widget (no get_cell callback
199 // Not triggered by a cell or widget (no get_cell callback
192 // exists).
200 // exists).
193 return null;
201 return null;
194 };
202 };
195
203
196 WidgetManager.prototype.callbacks = function (view) {
204 WidgetManager.prototype.callbacks = function (view) {
197 // callback handlers specific a view
205 // callback handlers specific a view
198 var callbacks = {};
206 var callbacks = {};
199 var cell = view.cell;
207 var cell = view.cell;
200 if (cell !== null) {
208 if (cell !== null) {
201 // Try to get output handlers
209 // Try to get output handlers
202 var handle_output = null;
210 var handle_output = null;
203 var handle_clear_output = null;
211 var handle_clear_output = null;
204 if (cell.output_area !== undefined && cell.output_area !== null) {
212 if (cell.output_area !== undefined && cell.output_area !== null) {
205 handle_output = $.proxy(cell.output_area.handle_output, cell.output_area);
213 handle_output = $.proxy(cell.output_area.handle_output, cell.output_area);
206 handle_clear_output = $.proxy(cell.output_area.handle_clear_output, cell.output_area);
214 handle_clear_output = $.proxy(cell.output_area.handle_clear_output, cell.output_area);
207 }
215 }
208
216
209 // Create callback dict using what is known
217 // Create callback dict using what is known
210 var that = this;
218 var that = this;
211 callbacks = {
219 callbacks = {
212 iopub : {
220 iopub : {
213 output : handle_output,
221 output : handle_output,
214 clear_output : handle_clear_output,
222 clear_output : handle_clear_output,
215
223
216 status : function (msg) {
224 status : function (msg) {
217 view.model._handle_status(msg, that.callbacks(view));
225 view.model._handle_status(msg, that.callbacks(view));
218 },
226 },
219
227
220 // Special function only registered by widget messages.
228 // Special function only registered by widget messages.
221 // Allows us to get the cell for a message so we know
229 // Allows us to get the cell for a message so we know
222 // where to add widgets if the code requires it.
230 // where to add widgets if the code requires it.
223 get_cell : function () {
231 get_cell : function () {
224 return cell;
232 return cell;
225 },
233 },
226 },
234 },
227 };
235 };
228 }
236 }
229 return callbacks;
237 return callbacks;
230 };
238 };
231
239
232
240
233 WidgetManager.prototype.get_model = function (model_id) {
241 WidgetManager.prototype.get_model = function (model_id) {
234 var model = this._models[model_id];
242 var model = this._models[model_id];
235 if (model !== undefined && model.id == model_id) {
243 if (model !== undefined && model.id == model_id) {
236 return model;
244 return model;
237 }
245 }
238 return null;
246 return null;
239 };
247 };
240
248
241
249
242 WidgetManager.prototype.get_kernel = function () {
250 WidgetManager.prototype.get_kernel = function () {
243 if (this.comm_manager === null) {
251 if (this.comm_manager === null) {
244 return null;
252 return null;
245 } else {
253 } else {
246 return this.comm_manager.kernel;
254 return this.comm_manager.kernel;
247 }
255 }
248 };
256 };
249
257
250
258
251 WidgetManager.prototype.on_create_widget = function (callback) {
259 WidgetManager.prototype.on_create_widget = function (callback) {
252 this._create_widget_callback = callback;
260 this._create_widget_callback = callback;
253 };
261 };
254
262
255
263
256 WidgetManager.prototype._handle_create_widget = function (widget_model) {
264 WidgetManager.prototype._handle_create_widget = function (widget_model) {
257 if (this._create_widget_callback) {
265 if (this._create_widget_callback) {
258 try {
266 try {
259 this._create_widget_callback(widget_model);
267 this._create_widget_callback(widget_model);
260 } catch (e) {
268 } catch (e) {
261 console.log("Exception in WidgetManager callback", e, widget_model);
269 console.log("Exception in WidgetManager callback", e, widget_model);
262 }
270 }
263 }
271 }
264 };
272 };
265
273
266
274
267 WidgetManager.prototype._handle_comm_open = function (comm, msg) {
275 WidgetManager.prototype._handle_comm_open = function (comm, msg) {
268 var widget_type_name = msg.content.target_name;
276 var widget_type_name = msg.content.target_name;
269 var widget_model = new this._model_types[widget_type_name](this, comm.comm_id, comm);
277 var widget_model = new this._model_types[widget_type_name](this, comm.comm_id, comm);
270 this._models[comm.comm_id] = widget_model; // comm_id == model_id
278 this._models[comm.comm_id] = widget_model; // comm_id == model_id
271 this._handle_create_widget(widget_model);
279 this._handle_create_widget(widget_model);
272 };
280 };
273
281
274 //--------------------------------------------------------------------
282 //--------------------------------------------------------------------
275 // Init code
283 // Init code
276 //--------------------------------------------------------------------
284 //--------------------------------------------------------------------
277 IPython.WidgetManager = WidgetManager;
285 IPython.WidgetManager = WidgetManager;
278 if (IPython.widget_manager === undefined || IPython.widget_manager === null) {
286 if (IPython.widget_manager === undefined || IPython.widget_manager === null) {
279 IPython.widget_manager = new WidgetManager();
287 IPython.widget_manager = new WidgetManager();
280 }
288 }
281
289
282 return IPython.widget_manager;
290 return IPython.widget_manager;
283 });
291 });
284 }());
292 }());
General Comments 0
You need to be logged in to leave comments. Login now