pager.js
169 lines
| 5.4 KiB
| application/javascript
|
JavascriptLexer
MinRK
|
r16586 | // Copyright (c) IPython Development Team. | ||
// Distributed under the terms of the Modified BSD License. | ||||
Brian E. Granger
|
r4357 | |||
Jonathan Frederic
|
r17196 | define([ | ||
'base/js/namespace', | ||||
Jonathan Frederic
|
r17215 | 'jqueryui', | ||
Jonathan Frederic
|
r17197 | 'base/js/utils', | ||
Jonathan Frederic
|
r17198 | ], function(IPython, $, utils) { | ||
Matthias BUSSONNIER
|
r12103 | "use strict"; | ||
Brian E. Granger
|
r4357 | |||
Jonathan Frederic
|
r19179 | var Pager = function (pager_selector, options) { | ||
Jonathan Frederic
|
r19176 | /** | ||
* Constructor | ||||
* | ||||
* Parameters: | ||||
* pager_selector: string | ||||
* options: dictionary | ||||
* Dictionary of keyword arguments. | ||||
* events: $(Events) instance | ||||
*/ | ||||
jon
|
r17210 | this.events = options.events; | ||
Brian E. Granger
|
r4357 | this.pager_element = $(pager_selector); | ||
Jonathan Frederic
|
r19207 | this.pager_button_area = $('#pager-button-area'); | ||
Matthias Bussonnier
|
r19872 | this._default_end_space = 100; | ||
Jonathan Frederic
|
r19207 | this.pager_element.resizable({handles: 'n', resize: $.proxy(this._resize, this)}); | ||
Matthias BUSSONNIER
|
r6723 | this.expanded = false; | ||
Matthias BUSSONNIER
|
r8265 | this.create_button_area(); | ||
Brian E. Granger
|
r4357 | this.bind_events(); | ||
}; | ||||
Matthias BUSSONNIER
|
r8265 | Pager.prototype.create_button_area = function(){ | ||
var that = this; | ||||
this.pager_button_area.append( | ||||
$('<a>').attr('role', "button") | ||||
Erik Tollerud
|
r10469 | .attr('title',"Open the pager in an external window") | ||
Matthias BUSSONNIER
|
r8265 | .addClass('ui-button') | ||
Jonathan Frederic
|
r17196 | .click(function(){that.detach();}) | ||
Matthias BUSSONNIER
|
r8265 | .append( | ||
Bussonnier Matthias
|
r8449 | $('<span>').addClass("ui-icon ui-icon-extlink") | ||
Matthias BUSSONNIER
|
r8265 | ) | ||
Jonathan Frederic
|
r17196 | ); | ||
Erik Tollerud
|
r10469 | this.pager_button_area.append( | ||
$('<a>').attr('role', "button") | ||||
Erik Tollerud
|
r10474 | .attr('title',"Close the pager") | ||
Erik Tollerud
|
r10469 | .addClass('ui-button') | ||
Jonathan Frederic
|
r17196 | .click(function(){that.collapse();}) | ||
Erik Tollerud
|
r10469 | .append( | ||
$('<span>').addClass("ui-icon ui-icon-close") | ||||
) | ||||
Jonathan Frederic
|
r17196 | ); | ||
Matthias BUSSONNIER
|
r8265 | }; | ||
Brian E. Granger
|
r4357 | |||
Pager.prototype.bind_events = function () { | ||||
var that = this; | ||||
Brian E. Granger
|
r4361 | |||
Matthias BUSSONNIER
|
r6739 | this.pager_element.bind('collapse_pager', function (event, extrap) { | ||
Jonathan Frederic
|
r19181 | // Animate hiding of the pager. | ||
Jonathan Frederic
|
r19207 | var time = (extrap && extrap.duration) ? extrap.duration : 'fast'; | ||
Min RK
|
r19936 | that.pager_element.animate({ | ||
height: 'toggle' | ||||
}, { | ||||
duration: time, | ||||
done: function() { | ||||
$('.end_space').css('height', that._default_end_space); | ||||
} | ||||
Jonathan Frederic
|
r19207 | }); | ||
Brian E. Granger
|
r4361 | }); | ||
Matthias BUSSONNIER
|
r6739 | this.pager_element.bind('expand_pager', function (event, extrap) { | ||
Jonathan Frederic
|
r19181 | // Clear the pager's height attr if it's set. This allows the | ||
// pager to size itself according to its contents. | ||||
that.pager_element.height('initial'); | ||||
// Animate the showing of the pager | ||||
var time = (extrap && extrap.duration) ? extrap.duration : 'fast'; | ||||
that.pager_element.show(time, function() { | ||||
// Explicitly set pager height once the pager has shown itself. | ||||
// This allows the pager-contents div to use percentage sizing. | ||||
that.pager_element.height(that.pager_element.height()); | ||||
Jonathan Frederic
|
r19207 | that._resize(); | ||
Jonathan Frederic
|
r19181 | }); | ||
Brian E. Granger
|
r4357 | }); | ||
Jonathan Frederic
|
r17196 | this.events.on('open_with_text.Pager', function (event, payload) { | ||
MinRK
|
r16586 | // FIXME: support other mime types | ||
if (payload.data['text/plain'] && payload.data['text/plain'] !== "") { | ||||
Brian Granger
|
r7168 | that.clear(); | ||
that.expand(); | ||||
MinRK
|
r16586 | that.append_text(payload.data['text/plain']); | ||
} | ||||
Brian Granger
|
r7168 | }); | ||
Brian E. Granger
|
r4357 | }; | ||
Matthias BUSSONNIER
|
r6723 | Pager.prototype.collapse = function (extrap) { | ||
Brian E. Granger
|
r4361 | if (this.expanded === true) { | ||
this.expanded = false; | ||||
Jonathan Frederic
|
r19182 | this.pager_element.trigger('collapse_pager', extrap); | ||
MinRK
|
r16586 | } | ||
Brian E. Granger
|
r4357 | }; | ||
Matthias BUSSONNIER
|
r6723 | Pager.prototype.expand = function (extrap) { | ||
Brian E. Granger
|
r4361 | if (this.expanded !== true) { | ||
this.expanded = true; | ||||
Jonathan Frederic
|
r19182 | this.pager_element.trigger('expand_pager', extrap); | ||
MinRK
|
r16586 | } | ||
Brian E. Granger
|
r4361 | }; | ||
Pager.prototype.toggle = function () { | ||||
if (this.expanded === true) { | ||||
this.collapse(); | ||||
} else { | ||||
this.expand(); | ||||
MinRK
|
r16586 | } | ||
Brian E. Granger
|
r4357 | }; | ||
Pager.prototype.clear = function (text) { | ||||
MinRK
|
r10914 | this.pager_element.find(".container").empty(); | ||
Brian E. Granger
|
r4357 | }; | ||
Matthias BUSSONNIER
|
r8265 | Pager.prototype.detach = function(){ | ||
MinRK
|
r11542 | var w = window.open("","_blank"); | ||
Matthias BUSSONNIER
|
r8265 | $(w.document.head) | ||
.append( | ||||
$('<link>') | ||||
.attr('rel',"stylesheet") | ||||
.attr('href',"/static/css/notebook.css") | ||||
.attr('type',"text/css") | ||||
Bussonnier Matthias
|
r8449 | ) | ||
.append( | ||||
$('<title>').text("IPython Pager") | ||||
Matthias BUSSONNIER
|
r8265 | ); | ||
MinRK
|
r11542 | var pager_body = $(w.document.body); | ||
pager_body.css('overflow','scroll'); | ||||
Matthias BUSSONNIER
|
r8265 | |||
MinRK
|
r11542 | pager_body.append(this.pager_element.clone().children()); | ||
Matthias BUSSONNIER
|
r8265 | w.document.close(); | ||
this.collapse(); | ||||
MinRK
|
r16586 | }; | ||
Brian E. Granger
|
r4357 | |||
Pager.prototype.append_text = function (text) { | ||||
Jonathan Frederic
|
r19176 | /** | ||
* The only user content injected with this HTML call is escaped by | ||||
* the fixConsole() method. | ||||
*/ | ||||
Jonathan Frederic
|
r17198 | this.pager_element.find(".container").append($('<pre/>').html(utils.fixCarriageReturn(utils.fixConsole(text)))); | ||
Matthias BUSSONNIER
|
r6723 | }; | ||
Brian E. Granger
|
r4357 | |||
Jonathan Frederic
|
r19207 | |||
Pager.prototype._resize = function() { | ||||
/** | ||||
* Update document based on pager size. | ||||
*/ | ||||
// Make sure the padding at the end of the notebook is large | ||||
// enough that the user can scroll to the bottom of the | ||||
// notebook. | ||||
$('.end_space').css('height', Math.max(this.pager_element.height(), this._default_end_space)); | ||||
}; | ||||
Jonathan Frederic
|
r17196 | // Backwards compatability. | ||
Brian E. Granger
|
r4357 | IPython.Pager = Pager; | ||
Jonathan Frederic
|
r17201 | return {'Pager': Pager}; | ||
Jonathan Frederic
|
r17196 | }); | ||