##// END OF EJS Templates
Reverse hscrollbar min-height hack on OS X...
Reverse hscrollbar min-height hack on OS X OS X has optional behavior to only draw scrollbars during scroll, which causes problems for CodeMirror's scrollbars. CodeMirror's solution is to set a minimum size for their scrollbars, which is always present. The trade is that the container overlays most of the last line, swallowing click events when there is scrolling to do, even when no scrollbar is visible. This reverses the trade, recovering the click events at the expense of never showing the horizontal scrollbar on OS X when this option is enabled.

File last commit:

r20226:fa4b962d
r20298:2907e856
Show More
tooltip.js
326 lines | 11.3 KiB | application/javascript | JavascriptLexer
MinRK
update completion_ and objection_info_request...
r16580 // Copyright (c) IPython Development Team.
// Distributed under the terms of the Modified BSD License.
Jonathan Frederic
Almost done!...
r17198 define([
'base/js/namespace',
Jonathan Frederic
MWE,...
r17200 'jquery',
Jonathan Frederic
Almost done!...
r17198 'base/js/utils',
], function(IPython, $, utils) {
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173 "use strict";
Matthias Bussonnier
tooltip to mac
r7145
Matthias BUSSONNIER
clean and comment tooltip file
r7162 // tooltip constructor
Jonathan Frederic
Almost done!...
r17198 var Tooltip = function (events) {
var that = this;
this.events = events;
this.time_before_tooltip = 1200;
Jessica B. Hamrick
Closes #3788
r11715
Jonathan Frederic
Almost done!...
r17198 // handle to html
this.tooltip = $('#tooltip');
this._hidden = true;
Matthias BUSSONNIER
beautify tooltip.js
r7189
Jonathan Frederic
Almost done!...
r17198 // variable for consecutive call
this._old_cell = null;
this._old_request = null;
this._consecutive_counter = 0;
Matthias BUSSONNIER
beautify tooltip.js
r7189
Jonathan Frederic
Almost done!...
r17198 // 'sticky ?'
this._sticky = false;
Matthias BUSSONNIER
beautify tooltip.js
r7189
Jonathan Frederic
Almost done!...
r17198 // display tooltip if the docstring is empty?
this._hide_if_no_docstring = false;
// contain the button in the upper right corner
this.buttons = $('<div/>').addClass('tooltipbuttons');
// will contain the docstring
this.text = $('<div/>').addClass('tooltiptext').addClass('smalltooltip');
// build the buttons menu on the upper right
// expand the tooltip to see more
var expandlink = $('<a/>').attr('href', "#").addClass("ui-corner-all") //rounded corner
.attr('role', "button").attr('id', 'expanbutton').attr('title', 'Grow the tooltip vertically (press shift-tab twice)').click(function () {
that.expand();
Mathieu
prevent page jump on tooltip actions\n\nExpands the fix of #7367 to tooltip buttons
r19949 event.preventDefault();
Jonathan Frederic
Almost done!...
r17198 }).append(
$('<span/>').text('Expand').addClass('ui-icon').addClass('ui-icon-plus'));
// open in pager
var morelink = $('<a/>').attr('href', "#").attr('role', "button").addClass('ui-button').attr('title', 'show the current docstring in pager (press shift-tab 4 times)');
var morespan = $('<span/>').text('Open in Pager').addClass('ui-icon').addClass('ui-icon-arrowstop-l-n');
morelink.append(morespan);
morelink.click(function () {
that.showInPager(that._old_cell);
Mathieu
prevent page jump on tooltip actions\n\nExpands the fix of #7367 to tooltip buttons
r19949 event.preventDefault();
Jonathan Frederic
Almost done!...
r17198 });
Matthias BUSSONNIER
improve new tooltip
r7147
Jonathan Frederic
Almost done!...
r17198 // close the tooltip
var closelink = $('<a/>').attr('href', "#").attr('role', "button").addClass('ui-button');
var closespan = $('<span/>').text('Close').addClass('ui-icon').addClass('ui-icon-close');
closelink.append(closespan);
closelink.click(function () {
that.remove_and_cancel_tooltip(true);
Mathieu
prevent page jump on tooltip actions\n\nExpands the fix of #7367 to tooltip buttons
r19949 event.preventDefault();
Jonathan Frederic
Almost done!...
r17198 });
Matthias BUSSONNIER
clean and comment tooltip file
r7162
Jonathan Frederic
Almost done!...
r17198 this._clocklink = $('<a/>').attr('href', "#");
this._clocklink.attr('role', "button");
this._clocklink.addClass('ui-button');
Min RK
more fixes for locating tooltip...
r20226 this._clocklink.attr('title', 'Tooltip is not dismissed while typing for 10 seconds');
Jonathan Frederic
Almost done!...
r17198 var clockspan = $('<span/>').text('Close');
clockspan.addClass('ui-icon');
clockspan.addClass('ui-icon-clock');
this._clocklink.append(clockspan);
this._clocklink.click(function () {
that.cancel_stick();
Mathieu
prevent page jump on tooltip actions\n\nExpands the fix of #7367 to tooltip buttons
r19949 event.preventDefault();
Jonathan Frederic
Almost done!...
r17198 });
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173
Jonathan Frederic
Almost done!...
r17198 //construct the tooltip
// add in the reverse order you want them to appear
this.buttons.append(closelink);
this.buttons.append(expandlink);
this.buttons.append(morelink);
this.buttons.append(this._clocklink);
this._clocklink.hide();
// we need a phony element to make the small arrow
// of the tooltip in css
// we will move the arrow later
this.arrow = $('<div/>').addClass('pretooltiparrow');
this.tooltip.append(this.buttons);
this.tooltip.append(this.arrow);
this.tooltip.append(this.text);
// function that will be called if you press tab 1, 2, 3... times in a row
this.tabs_functions = [function (cell, text, cursor) {
that._request_tooltip(cell, text, cursor);
}, function () {
that.expand();
}, function () {
that.stick();
}, function (cell) {
that.cancel_stick();
that.showInPager(cell);
}];
// call after all the tabs function above have bee call to clean their effects
// if necessary
this.reset_tabs_function = function (cell, text) {
this._old_cell = (cell) ? cell : null;
this._old_request = (text) ? text : null;
this._consecutive_counter = 0;
Matthias BUSSONNIER
beautify tooltip.js
r7189 };
Jonathan Frederic
Almost done!...
r17198 };
Matthias BUSSONNIER
beautify tooltip.js
r7189
Jonathan Frederic
Fixed lots of bugs...
r15493 Tooltip.prototype.is_visible = function () {
return !this._hidden;
};
Matthias BUSSONNIER
space before function keyword in js
r7191 Tooltip.prototype.showInPager = function (cell) {
Jonathan Frederic
Ran function comment conversion tool
r19176 /**
* reexecute last call in pager by appending ? to show back in pager
*/
Matthias Bussonnier
handle somehting selected and multiple cursors and 4 tabs show content in pager
r18284 this.events.trigger('open_with_text.Pager', this._reply.content);
Matthias BUSSONNIER
make tooltip tabs fonction configurable
r7172 this.remove_and_cancel_tooltip();
Jonathan Frederic
Fixed lots of bugs...
r15493 };
Matthias BUSSONNIER
multiple tooltip action...
r7160
Matthias BUSSONNIER
clean and comment tooltip file
r7162 // grow the tooltip verticaly
Matthias BUSSONNIER
space before function keyword in js
r7191 Tooltip.prototype.expand = function () {
Matthias BUSSONNIER
multiple tooltip action...
r7160 this.text.removeClass('smalltooltip');
this.text.addClass('bigtooltip');
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173 $('#expanbutton').hide('slow');
Jonathan Frederic
Fixed lots of bugs...
r15493 };
Matthias BUSSONNIER
multiple tooltip action...
r7160
Matthias Bussonnier
fix scrolltop
r7151 // deal with all the logic of hiding the tooltip
// and reset it's status
Matthias BUSSONNIER
rename show/hide methods to avoid jQuery conflict....
r7202 Tooltip.prototype._hide = function () {
Jonathan Frederic
Fixed lots of bugs...
r15493 this._hidden = true;
Matthias BUSSONNIER
rename show/hide methods to avoid jQuery conflict....
r7202 this.tooltip.fadeOut('fast');
Matthias BUSSONNIER
beautify tooltip.js
r7189 $('#expanbutton').show('slow');
this.text.removeClass('bigtooltip');
this.text.addClass('smalltooltip');
// keep scroll top to be sure to always see the first line
this.text.scrollTop(0);
Matthias BUSSONNIER
fix tooltip keep focus on wrong cell...
r7204 this.code_mirror = null;
Jonathan Frederic
Fixed lots of bugs...
r15493 };
Matthias Bussonnier
tooltip to mac
r7145
Takeshi Kanmae
Have remove_and_cancel_tooltip() return a boolean
r12459 // return true on successfully removing a visible tooltip; otherwise return
// false.
Matthias BUSSONNIER
space before function keyword in js
r7191 Tooltip.prototype.remove_and_cancel_tooltip = function (force) {
Jonathan Frederic
Ran function comment conversion tool
r19176 /**
* note that we don't handle closing directly inside the calltip
* as in the completer, because it is not focusable, so won't
* get the event.
*/
MinRK
fix tooltip cancel...
r12955 this.cancel_pending();
Takeshi Kanmae
Update boolean tests
r12533 if (!this._hidden) {
if (force || !this._sticky) {
Takeshi Kanmae
Have remove_and_cancel_tooltip() return a boolean
r12459 this.cancel_stick();
this._hide();
}
this.reset_tabs_function();
return true;
} else {
return false;
Matthias BUSSONNIER
multiple tooltip action...
r7160 }
Jonathan Frederic
Fixed lots of bugs...
r15493 };
Matthias BUSSONNIER
multiple tooltip action...
r7160
Matthias BUSSONNIER
clean and comment tooltip file
r7162 // cancel autocall done after '(' for example.
Matthias BUSSONNIER
space before function keyword in js
r7191 Tooltip.prototype.cancel_pending = function () {
Jonathan Frederic
Fixed lots of bugs...
r15493 if (this._tooltip_timeout !== null) {
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173 clearTimeout(this._tooltip_timeout);
this._tooltip_timeout = null;
Matthias Bussonnier
tooltip to mac
r7145 }
Jonathan Frederic
Fixed lots of bugs...
r15493 };
Matthias BUSSONNIER
clean and comment tooltip file
r7162
// will trigger tooltip after timeout
Jessica B. Hamrick
Closes #3788
r11715 Tooltip.prototype.pending = function (cell, hide_if_no_docstring) {
Matthias BUSSONNIER
call tooltip after time
r7157 var that = this;
Matthias BUSSONNIER
space before function keyword in js
r7191 this._tooltip_timeout = setTimeout(function () {
Jonathan Frederic
Fixed lots of bugs...
r15493 that.request(cell, hide_if_no_docstring);
Matthias BUSSONNIER
beautify tooltip.js
r7189 }, that.time_before_tooltip);
Jonathan Frederic
Fixed lots of bugs...
r15493 };
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173
Matthias BUSSONNIER
Factorise code in tooltip for julia monkeypatching
r12819 // easy access for julia monkey patching.
MinRK
fix tooltip token regex for single-character names...
r14716 Tooltip.last_token_re = /[a-z_][0-9a-z._]*$/gi;
Matthias BUSSONNIER
Factorise code in tooltip for julia monkeypatching
r12819
MinRK
update completion_ and objection_info_request...
r16580 Tooltip.prototype._request_tooltip = function (cell, text, cursor_pos) {
Matthias BUSSONNIER
fix and add shim for change introduce by #4195...
r13327 var callbacks = $.proxy(this._show, this);
MinRK
s/object_info_request/inspect_request
r16587 var msg_id = cell.kernel.inspect(text, cursor_pos, callbacks);
MinRK
refactor js callbacks...
r13207 };
Matthias BUSSONNIER
clean and comment tooltip file
r7162
Matthias Bussonnier
handle somehting selected and multiple cursors and 4 tabs show content in pager
r18284 // make an immediate completion request
Jessica B. Hamrick
Closes #3788
r11715 Tooltip.prototype.request = function (cell, hide_if_no_docstring) {
Jonathan Frederic
Ran function comment conversion tool
r19176 /**
* request(codecell)
* Deal with extracting the text from the cell and counting
* call in a row
*/
Matthias BUSSONNIER
multiple tooltip action...
r7160 this.cancel_pending();
var editor = cell.code_mirror;
var cursor = editor.getCursor();
MinRK
complete_reply has cursor_start and cursor_end, not matched_text
r16588 var cursor_pos = utils.to_absolute_cursor_pos(editor, cursor);
MinRK
update completion_ and objection_info_request...
r16580 var text = cell.get_text();
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173
Jessica B. Hamrick
Closes #3788
r11715 this._hide_if_no_docstring = hide_if_no_docstring;
Bussonnier Matthias
shift tqb for tooltip
r8949 if(editor.somethingSelected()){
Matthias Bussonnier
handle somehting selected and multiple cursors and 4 tabs show content in pager
r18284 // get only the most recent selection.
Bussonnier Matthias
shift tqb for tooltip
r8949 text = editor.getSelection();
}
Matthias Bussonnier
handle somehting selected and multiple cursors and 4 tabs show content in pager
r18284 // need a permanent handle to code_mirror for future auto recall
Matthias BUSSONNIER
make tooltip tabs fonction configurable
r7172 this.code_mirror = editor;
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173 // now we treat the different number of keypress
Matthias BUSSONNIER
make tooltip tabs fonction configurable
r7172 // first if same cell, same text, increment counter by 1
Jonathan Frederic
Fixed lots of bugs...
r15493 if (this._old_cell == cell && this._old_request == text && this._hidden === false) {
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173 this._consecutive_counter++;
Matthias BUSSONNIER
multiple tooltip action...
r7160 } else {
Matthias BUSSONNIER
make tooltip tabs fonction configurable
r7172 // else reset
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173 this.cancel_stick();
Matthias BUSSONNIER
space before function keyword in js
r7191 this.reset_tabs_function (cell, text);
Matthias BUSSONNIER
multiple tooltip action...
r7160 }
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173
MinRK
update completion_ and objection_info_request...
r16580 this.tabs_functions[this._consecutive_counter](cell, text, cursor_pos);
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173
// then if we are at the end of list function, reset
Steve Fox
Bug fix for #4643: Regex object needs to be reset between calls in tooltip.js
r13793 if (this._consecutive_counter == this.tabs_functions.length) {
MinRK
update completion_ and objection_info_request...
r16580 this.reset_tabs_function (cell, text, cursor);
}
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173
Matthias BUSSONNIER
make tooltip tabs fonction configurable
r7172 return;
Jonathan Frederic
Fixed lots of bugs...
r15493 };
Matthias BUSSONNIER
clean and comment tooltip file
r7162
// cancel the option of having the tooltip to stick
Matthias BUSSONNIER
space before function keyword in js
r7191 Tooltip.prototype.cancel_stick = function () {
Matthias BUSSONNIER
beautify tooltip.js
r7189 clearTimeout(this._stick_timeout);
this._stick_timeout = null;
this._clocklink.hide('slow');
this._sticky = false;
Jonathan Frederic
Fixed lots of bugs...
r15493 };
Matthias BUSSONNIER
multiple tooltip action...
r7160
Matthias BUSSONNIER
clean and comment tooltip file
r7162 // put the tooltip in a sicky state for 10 seconds
// it won't be removed by remove_and_cancell() unless you called with
// the first parameter set to true.
// remove_and_cancell_tooltip(true)
Matthias BUSSONNIER
space before function keyword in js
r7191 Tooltip.prototype.stick = function (time) {
Jonathan Frederic
Fixed lots of bugs...
r15493 time = (time !== undefined) ? time : 10;
Matthias BUSSONNIER
clean and comment tooltip file
r7162 var that = this;
Matthias BUSSONNIER
multiple tooltip action...
r7160 this._sticky = true;
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173 this._clocklink.show('slow');
Matthias BUSSONNIER
space before function keyword in js
r7191 this._stick_timeout = setTimeout(function () {
Matthias BUSSONNIER
multiple tooltip action...
r7160 that._sticky = false;
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173 that._clocklink.hide('slow');
Matthias BUSSONNIER
beautify tooltip.js
r7189 }, time * 1000);
Jonathan Frederic
Fixed lots of bugs...
r15493 };
Matthias BUSSONNIER
call tooltip by cell reference
r7156
Matthias BUSSONNIER
clean and comment tooltip file
r7162 // should be called with the kernel reply to actually show the tooltip
Matthias BUSSONNIER
rename show/hide methods to avoid jQuery conflict....
r7202 Tooltip.prototype._show = function (reply) {
Jonathan Frederic
Ran function comment conversion tool
r19176 /**
* move the bubble if it is not hidden
* otherwise fade it
*/
MinRK
update completion_ and objection_info_request...
r16580 this._reply = reply;
MinRK
refactor js callbacks...
r13207 var content = reply.content;
MinRK
don't show tooltip if object is not found...
r14787 if (!content.found) {
// object not found, nothing to show
return;
}
MinRK
refactor js callbacks...
r13207 this.name = content.name;
Matthias BUSSONNIER
multiple tooltip action...
r7160
// do some math to have the tooltip arrow on more or less on left or right
Min RK
more fixes for locating tooltip...
r20226 // position of the editor
var cm_pos = $(this.code_mirror.getWrapperElement()).position();
// anchor and head positions are local within CodeMirror element
var anchor = this.code_mirror.cursorCoords(false, 'local');
var head = this.code_mirror.cursorCoords(true, 'local');
// locate the target at the center of anchor, head
var center_left = (head.left + anchor.left) / 2;
// locate the left edge of the tooltip, at most 450 px left of the arrow
var edge_left = Math.max(center_left - 450, 0);
// locate the arrow at the cursor. A 24 px offset seems necessary.
var arrow_left = center_left - edge_left - 24;
Min RK
fix tooltip location...
r20207
Min RK
more fixes for locating tooltip...
r20226 // locate left, top within container element
var left = (cm_pos.left + edge_left) + 'px';
var top = (cm_pos.top + head.bottom + 10) + 'px';
Matthias BUSSONNIER
clean and comment tooltip file
r7162
Jonathan Frederic
Fixed lots of bugs...
r15493 if (this._hidden === false) {
Matthias BUSSONNIER
beautify tooltip.js
r7189 this.tooltip.animate({
Min RK
fix tooltip location...
r20207 left: left,
top: top
Matthias BUSSONNIER
beautify tooltip.js
r7189 });
} else {
this.tooltip.css({
Min RK
fix tooltip location...
r20207 left: left
Matthias BUSSONNIER
beautify tooltip.js
r7189 });
this.tooltip.css({
Min RK
fix tooltip location...
r20207 top: top
Matthias BUSSONNIER
beautify tooltip.js
r7189 });
Matthias BUSSONNIER
animation if already shown
r7153 }
Matthias BUSSONNIER
beautify tooltip.js
r7189 this.arrow.animate({
Min RK
more fixes for locating tooltip...
r20226 'left': arrow_left + 'px'
Matthias BUSSONNIER
beautify tooltip.js
r7189 });
MinRK
update completion_ and objection_info_request...
r16580
Jessica B. Hamrick
Closes #3788
r11715 this._hidden = false;
Jonathan Frederic
Fixed lots of bugs...
r15493 this.tooltip.fadeIn('fast');
Matthias BUSSONNIER
improve new tooltip
r7147 this.text.children().remove();
MinRK
update completion_ and objection_info_request...
r16580
// This should support rich data types, but only text/plain for now
Jonathan Frederic
Audit .html() calls take #2
r15376 // Any HTML within the docstring is escaped by the fixConsole() method.
MinRK
update completion_ and objection_info_request...
r16580 var pre = $('<pre/>').html(utils.fixConsole(content.data['text/plain']));
Matthias Bussonnier
fix scrolltop
r7151 this.text.append(pre);
Matthias BUSSONNIER
almost all logic in tooltip.js, padding right button
r7158 // keep scroll top to be sure to always see the first line
this.text.scrollTop(0);
Jonathan Frederic
Fixed lots of bugs...
r15493 };
Matthias BUSSONNIER
call tooltip by cell reference
r7156
Matthias Bussonnier
handle somehting selected and multiple cursors and 4 tabs show content in pager
r18284 // Backwards compatibility.
Matthias Bussonnier
tooltip to mac
r7145 IPython.Tooltip = Tooltip;
Matthias BUSSONNIER
clean code, show clock if tooltip is 'sticky'...
r7173
Jonathan Frederic
Return dicts instead of classes,...
r17201 return {'Tooltip': Tooltip};
Jonathan Frederic
Almost done!...
r17198 });