##// END OF EJS Templates
Code for the less magic was unnecessarily reading the entire input file twice. Redundant read removed.
Code for the less magic was unnecessarily reading the entire input file twice. Redundant read removed.

File last commit:

r19112:d6a01888
r19624:8d378a70
Show More
keyboardmanager.js
232 lines | 8.4 KiB | application/javascript | JavascriptLexer
Jonathan Frederic
Fixed bug
r17866 // Copyright (c) IPython Development Team.
// Distributed under the terms of the Modified BSD License.
Matthias BUSSONNIER
Update to codemirror 4...
r18280 /**
*
*
* @module keyboardmanager
* @namespace keyboardmanager
* @class KeyboardManager
*/
Jonathan Frederic
Add scrollmanager
r17864
Jonathan Frederic
Added scroll mode selector,...
r17869 define([
'base/js/namespace',
'jquery',
'base/js/utils',
'base/js/keyboard',
], function(IPython, $, utils, keyboard) {
Brian E. Granger
Adding keyboard manager logic....
r14020 "use strict";
Jonathan Frederic
Fixed rebase indents
r17871
Jonathan Frederic
Almost done!...
r17198 // Main keyboard manager for the notebook
var keycodes = keyboard.keycodes;
Brian E. Granger
Like, OMG, keyboardmanager.js is a beast.
r14036
jon
In person review with @ellisonbg
r17210 var KeyboardManager = function (options) {
Matthias BUSSONNIER
Update to codemirror 4...
r18280 /**
* A class to deal with keyboard event and shortcut
*
* @class KeyboardManager
* @constructor
* @param options {dict} Dictionary of keyword arguments :
* @param options.events {$(Events)} instance
* @param options.pager: {Pager} pager instance
*/
Jonathan Frederic
Almost done!...
r17198 this.mode = 'command';
this.enabled = true;
jon
In person review with @ellisonbg
r17210 this.pager = options.pager;
Jonathan Frederic
Almost done!...
r17198 this.quick_help = undefined;
this.notebook = undefined;
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 this.last_mode = undefined;
Jonathan Frederic
Almost done!...
r17198 this.bind_events();
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 this.env = {pager:this.pager};
this.actions = options.actions;
this.command_shortcuts = new keyboard.ShortcutManager(undefined, options.events, this.actions, this.env );
Jonathan Frederic
Almost done!...
r17198 this.command_shortcuts.add_shortcuts(this.get_default_common_shortcuts());
this.command_shortcuts.add_shortcuts(this.get_default_command_shortcuts());
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 this.edit_shortcuts = new keyboard.ShortcutManager(undefined, options.events, this.actions, this.env);
Jonathan Frederic
Almost done!...
r17198 this.edit_shortcuts.add_shortcuts(this.get_default_common_shortcuts());
this.edit_shortcuts.add_shortcuts(this.get_default_edit_shortcuts());
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 Object.seal(this);
Jonathan Frederic
Almost done!...
r17198 };
Brian E. Granger
Like, OMG, keyboardmanager.js is a beast.
r14036
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390
Matthias BUSSONNIER
Update to codemirror 4...
r18280 /**
* Return a dict of common shortcut
* @method get_default_common_shortcuts
*
* @example Example of returned shortcut
* ```
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 * 'shortcut-key': 'action-name'
* // a string representing the shortcut as dash separated value.
* // e.g. 'shift' , 'shift-enter', 'cmd-t'
Matthias BUSSONNIER
Update to codemirror 4...
r18280 *```
*/
Jonathan Frederic
Almost done!...
r17198 KeyboardManager.prototype.get_default_common_shortcuts = function() {
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 return {
'shift' : 'ipython.ignore',
'shift-enter' : 'ipython.run-select-next',
'ctrl-enter' : 'ipython.execute-in-place',
'alt-enter' : 'ipython.execute-and-insert-after',
// cmd on mac, ctrl otherwise
'cmdtrl-s' : 'ipython.save-notebook',
Jonathan Frederic
Fixed rebase indents
r17871 };
Jonathan Frederic
jshint
r15491 };
Brian E. Granger
Like, OMG, keyboardmanager.js is a beast.
r14036
Jonathan Frederic
Almost done!...
r17198 KeyboardManager.prototype.get_default_edit_shortcuts = function() {
return {
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 'esc' : 'ipython.go-to-command-mode',
'ctrl-m' : 'ipython.go-to-command-mode',
'up' : 'ipython.move-cursor-up-or-previous-cell',
'down' : 'ipython.move-cursor-down-or-next-cell',
'ctrl-shift--' : 'ipython.split-cell-at-cursor',
'ctrl-shift-subtract' : 'ipython.split-cell-at-cursor'
Jonathan Frederic
Added scroll mode selector,...
r17869 };
Jonathan Frederic
jshint
r15491 };
Brian E. Granger
Added platform dep. logic.
r14816
Jonathan Frederic
Almost done!...
r17198 KeyboardManager.prototype.get_default_command_shortcuts = function() {
return {
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 'shift-space': 'ipython.scroll-up',
'shift-v' : 'ipython.paste-cell-before',
'shift-m' : 'ipython.merge-selected-cell-with-cell-after',
'shift-o' : 'ipython.toggle-output-scrolling-selected-cell',
'ctrl-j' : 'ipython.move-selected-cell-down',
'ctrl-k' : 'ipython.move-selected-cell-up',
'enter' : 'ipython.enter-edit-mode',
'space' : 'ipython.scroll-down',
'down' : 'ipython.select-next-cell',
'i,i' : 'ipython.interrupt-kernel',
'0,0' : 'ipython.restart-kernel',
'd,d' : 'ipython.delete-cell',
Matthias Bussonnier
close pager on escape on command mode
r19112 'esc': 'ipython.close-pager',
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 'up' : 'ipython.select-previous-cell',
'k' : 'ipython.select-previous-cell',
'j' : 'ipython.select-next-cell',
'x' : 'ipython.cut-selected-cell',
'c' : 'ipython.copy-selected-cell',
'v' : 'ipython.paste-cell-after',
'a' : 'ipython.insert-cell-before',
'b' : 'ipython.insert-cell-after',
'y' : 'ipython.change-selected-cell-to-code-cell',
'm' : 'ipython.change-selected-cell-to-markdown-cell',
'r' : 'ipython.change-selected-cell-to-raw-cell',
'1' : 'ipython.change-selected-cell-to-heading-1',
'2' : 'ipython.change-selected-cell-to-heading-2',
'3' : 'ipython.change-selected-cell-to-heading-3',
'4' : 'ipython.change-selected-cell-to-heading-4',
'5' : 'ipython.change-selected-cell-to-heading-5',
'6' : 'ipython.change-selected-cell-to-heading-6',
'o' : 'ipython.toggle-output-visibility-selected-cell',
's' : 'ipython.save-notebook',
'l' : 'ipython.toggle-line-number-selected-cell',
'h' : 'ipython.show-keyboard-shortcut-help-dialog',
'z' : 'ipython.undo-last-cell-deletion',
'q' : 'ipython.close-pager',
Jonathan Frederic
Added scroll mode selector,...
r17869 };
Brian E. Granger
Adding keyboard manager logic....
r14020 };
KeyboardManager.prototype.bind_events = function () {
var that = this;
$(document).keydown(function (event) {
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 if(event._ipkmIgnore===true||(event.originalEvent||{})._ipkmIgnore===true){
Matthias Bussonnier
rework keyboard management to avoit completer and up/down bugs
r18282 return false;
}
Brian E. Granger
Adding keyboard manager logic....
r14020 return that.handle_keydown(event);
});
};
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 KeyboardManager.prototype.set_notebook = function (notebook) {
this.notebook = notebook;
this.actions.extend_env({notebook:notebook});
};
KeyboardManager.prototype.set_quickhelp = function (notebook) {
this.actions.extend_env({quick_help:notebook});
};
Brian E. Granger
Adding keyboard manager logic....
r14020 KeyboardManager.prototype.handle_keydown = function (event) {
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 /**
* returning false from this will stop event propagation
**/
Brian E. Granger
Cleaning up console log messages.
r14089
Jonathan Frederic
jshint
r15491 if (event.which === keycodes.esc) {
Brian E. Granger
Adding keyboard manager logic....
r14020 // Intercept escape at highest level to avoid closing
// websocket connection with firefox
event.preventDefault();
}
Brian E. Granger
Removing KBN null mode and replacing with enable/disable.
r14023 if (!this.enabled) {
Jonathan Frederic
jshint
r15491 if (event.which === keycodes.esc) {
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390 this.notebook.command_mode();
Brian E. Granger
Like, OMG, keyboardmanager.js is a beast.
r14036 return false;
}
Brian E. Granger
Removing KBN null mode and replacing with enable/disable.
r14023 return true;
Brian E. Granger
Adding keyboard manager logic....
r14020 }
if (this.mode === 'edit') {
Brian E. Granger
Like, OMG, keyboardmanager.js is a beast.
r14036 return this.edit_shortcuts.call_handler(event);
} else if (this.mode === 'command') {
return this.command_shortcuts.call_handler(event);
Brian E. Granger
Adding keyboard manager logic....
r14020 }
return true;
Jonathan Frederic
jshint
r15491 };
Brian E. Granger
Adding keyboard manager logic....
r14020
KeyboardManager.prototype.edit_mode = function () {
this.last_mode = this.mode;
this.mode = 'edit';
Jonathan Frederic
jshint
r15491 };
Brian E. Granger
Adding keyboard manager logic....
r14020
KeyboardManager.prototype.command_mode = function () {
this.last_mode = this.mode;
this.mode = 'command';
Jonathan Frederic
jshint
r15491 };
Brian E. Granger
Adding keyboard manager logic....
r14020
Brian E. Granger
Adding missing enable/disable methods.
r14024 KeyboardManager.prototype.enable = function () {
Brian E. Granger
Fixing bug in KeyboardManager.enable/disable.
r14030 this.enabled = true;
Jonathan Frederic
jshint
r15491 };
Brian E. Granger
Adding missing enable/disable methods.
r14024
KeyboardManager.prototype.disable = function () {
Brian E. Granger
Fixing bug in KeyboardManager.enable/disable.
r14030 this.enabled = false;
Jonathan Frederic
jshint
r15491 };
Brian E. Granger
Adding missing enable/disable methods.
r14024
Brian E. Granger
Like, OMG, keyboardmanager.js is a beast.
r14036 KeyboardManager.prototype.register_events = function (e) {
var that = this;
Jonathan Frederic
Fixed rebase problems
r15496 var handle_focus = function () {
Brian E. Granger
Like, OMG, keyboardmanager.js is a beast.
r14036 that.disable();
Jonathan Frederic
Fixed rebase problems
r15496 };
var handle_blur = function () {
Brian E. Granger
Like, OMG, keyboardmanager.js is a beast.
r14036 that.enable();
Jonathan Frederic
Fixed rebase problems
r15496 };
e.on('focusin', handle_focus);
e.on('focusout', handle_blur);
Jonathan Frederic
Re-added widget textbox blur fix FF
r15507 // TODO: Very strange. The focusout event does not seem fire for the
Jonathan Frederic
Added comments to kbm and shrunk focus_cell lines
r15539 // bootstrap textboxes on FF25&26... This works around that by
// registering focus and blur events recursively on all inputs within
// registered element.
Jonathan Frederic
Re-added widget textbox blur fix FF
r15507 e.find('input').blur(handle_blur);
e.on('DOMNodeInserted', function (event) {
var target = $(event.target);
if (target.is('input')) {
target.blur(handle_blur);
} else {
target.find('input').blur(handle_blur);
}
});
Brian E. Granger
Fix raw_input.
r14046 // There are times (raw_input) where we remove the element from the DOM before
// focusout is called. In this case we bind to the remove event of jQueryUI,
MinRK
fix remove event in KeyboardManager.register_events...
r15328 // which gets triggered upon removal, iff it is focused at the time.
Jonathan Frederic
Added comments to kbm and shrunk focus_cell lines
r15539 // is_focused must be used to check for the case where an element within
// the element being removed is focused.
Brian E. Granger
Fix raw_input.
r14046 e.on('remove', function () {
Jonathan Frederic
Almost done!...
r17198 if (utils.is_focused(e[0])) {
MinRK
fix remove event in KeyboardManager.register_events...
r15328 that.enable();
}
Brian E. Granger
Fix raw_input.
r14046 });
Jonathan Frederic
jshint
r15491 };
Brian E. Granger
Like, OMG, keyboardmanager.js is a beast.
r14036
Matthias Bussonnier
Add notion of action that differs from shortcuts....
r18390
// For backwards compatibility.
Brian E. Granger
Adding keyboard manager logic....
r14020 IPython.KeyboardManager = KeyboardManager;
Jonathan Frederic
Return dicts instead of classes,...
r17201 return {'KeyboardManager': KeyboardManager};
Jonathan Frederic
Almost done!...
r17198 });