X-Git-Url: https://scm.cri.ensmp.fr/git/ckeditor.git/blobdiff_plain/256592bf803e851aa7fc953e08a6e9e58d970f8c..871bad8291b6dbc29d489d95d185458caab25158:/skins/ckeditor/_source/plugins/keystrokes/plugin.js diff --git a/skins/ckeditor/_source/plugins/keystrokes/plugin.js b/skins/ckeditor/_source/plugins/keystrokes/plugin.js new file mode 100644 index 0000000..b49a893 --- /dev/null +++ b/skins/ckeditor/_source/plugins/keystrokes/plugin.js @@ -0,0 +1,225 @@ +/* +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +// Register a plugin named "sample". +CKEDITOR.plugins.add( 'keystrokes', +{ + beforeInit : function( editor ) + { + /** + * Controls keystrokes typing in this editor instance. + * @name CKEDITOR.editor.prototype.keystrokeHandler + * @type CKEDITOR.keystrokeHandler + * @example + */ + editor.keystrokeHandler = new CKEDITOR.keystrokeHandler( editor ); + + editor.specialKeys = {}; + }, + + init : function( editor ) + { + var keystrokesConfig = editor.config.keystrokes, + blockedConfig = editor.config.blockedKeystrokes; + + var keystrokes = editor.keystrokeHandler.keystrokes, + blockedKeystrokes = editor.keystrokeHandler.blockedKeystrokes; + + for ( var i = 0 ; i < keystrokesConfig.length ; i++ ) + keystrokes[ keystrokesConfig[i][0] ] = keystrokesConfig[i][1]; + + for ( i = 0 ; i < blockedConfig.length ; i++ ) + blockedKeystrokes[ blockedConfig[i] ] = 1; + } +}); + +/** + * Controls keystrokes typing in an editor instance. + * @constructor + * @param {CKEDITOR.editor} editor The editor instance. + * @example + */ +CKEDITOR.keystrokeHandler = function( editor ) +{ + if ( editor.keystrokeHandler ) + return editor.keystrokeHandler; + + /** + * List of keystrokes associated to commands. Each entry points to the + * command to be executed. + * @type Object + * @example + */ + this.keystrokes = {}; + + /** + * List of keystrokes that should be blocked if not defined at + * {@link keystrokes}. In this way it is possible to block the default + * browser behavior for those keystrokes. + * @type Object + * @example + */ + this.blockedKeystrokes = {}; + + this._ = + { + editor : editor + }; + + return this; +}; + +(function() +{ + var cancel; + + var onKeyDown = function( event ) + { + // The DOM event object is passed by the "data" property. + event = event.data; + + var keyCombination = event.getKeystroke(); + var command = this.keystrokes[ keyCombination ]; + var editor = this._.editor; + + cancel = ( editor.fire( 'key', { keyCode : keyCombination } ) === true ); + + if ( !cancel ) + { + if ( command ) + { + var data = { from : 'keystrokeHandler' }; + cancel = ( editor.execCommand( command, data ) !== false ); + } + + if ( !cancel ) + { + var handler = editor.specialKeys[ keyCombination ]; + cancel = ( handler && handler( editor ) === true ); + + if ( !cancel ) + cancel = !!this.blockedKeystrokes[ keyCombination ]; + } + } + + if ( cancel ) + event.preventDefault( true ); + + return !cancel; + }; + + var onKeyPress = function( event ) + { + if ( cancel ) + { + cancel = false; + event.data.preventDefault( true ); + } + }; + + CKEDITOR.keystrokeHandler.prototype = + { + /** + * Attaches this keystroke handle to a DOM object. Keystrokes typed + ** over this object will get handled by this keystrokeHandler. + * @param {CKEDITOR.dom.domObject} domObject The DOM object to attach + * to. + * @example + */ + attach : function( domObject ) + { + // For most browsers, it is enough to listen to the keydown event + // only. + domObject.on( 'keydown', onKeyDown, this ); + + // Some browsers instead, don't cancel key events in the keydown, but in the + // keypress. So we must do a longer trip in those cases. + if ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.mac ) ) + domObject.on( 'keypress', onKeyPress, this ); + } + }; +})(); + +/** + * A list of keystrokes to be blocked if not defined in the {@link CKEDITOR.config.keystrokes} + * setting. In this way it is possible to block the default browser behavior + * for those keystrokes. + * @type Array + * @default (see example) + * @example + * // This is actually the default value. + * config.blockedKeystrokes = + * [ + * CKEDITOR.CTRL + 66 /*B*/, + * CKEDITOR.CTRL + 73 /*I*/, + * CKEDITOR.CTRL + 85 /*U*/ + * ]; + */ +CKEDITOR.config.blockedKeystrokes = +[ + CKEDITOR.CTRL + 66 /*B*/, + CKEDITOR.CTRL + 73 /*I*/, + CKEDITOR.CTRL + 85 /*U*/ +]; + +/** + * A list associating keystrokes to editor commands. Each element in the list + * is an array where the first item is the keystroke, and the second is the + * name of the command to be executed. + * @type Array + * @default (see example) + * @example + * // This is actually the default value. + * config.keystrokes = + * [ + * [ CKEDITOR.ALT + 121 /*F10*/, 'toolbarFocus' ], + * [ CKEDITOR.ALT + 122 /*F11*/, 'elementsPathFocus' ], + * + * [ CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' ], + * + * [ CKEDITOR.CTRL + 90 /*Z*/, 'undo' ], + * [ CKEDITOR.CTRL + 89 /*Y*/, 'redo' ], + * [ CKEDITOR.CTRL + CKEDITOR.SHIFT + 90 /*Z*/, 'redo' ], + * + * [ CKEDITOR.CTRL + 76 /*L*/, 'link' ], + * + * [ CKEDITOR.CTRL + 66 /*B*/, 'bold' ], + * [ CKEDITOR.CTRL + 73 /*I*/, 'italic' ], + * [ CKEDITOR.CTRL + 85 /*U*/, 'underline' ], + * + * [ CKEDITOR.ALT + 109 /*-*/, 'toolbarCollapse' ] + * ]; + */ +CKEDITOR.config.keystrokes = +[ + [ CKEDITOR.ALT + 121 /*F10*/, 'toolbarFocus' ], + [ CKEDITOR.ALT + 122 /*F11*/, 'elementsPathFocus' ], + + [ CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' ], + [ CKEDITOR.CTRL + CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' ], + + [ CKEDITOR.CTRL + 90 /*Z*/, 'undo' ], + [ CKEDITOR.CTRL + 89 /*Y*/, 'redo' ], + [ CKEDITOR.CTRL + CKEDITOR.SHIFT + 90 /*Z*/, 'redo' ], + + [ CKEDITOR.CTRL + 76 /*L*/, 'link' ], + + [ CKEDITOR.CTRL + 66 /*B*/, 'bold' ], + [ CKEDITOR.CTRL + 73 /*I*/, 'italic' ], + [ CKEDITOR.CTRL + 85 /*U*/, 'underline' ], + + [ CKEDITOR.ALT + ( CKEDITOR.env.ie || CKEDITOR.env.webkit ? 189 : 109 ) /*-*/, 'toolbarCollapse' ], + [ CKEDITOR.ALT + 48 /*0*/, 'a11yHelp' ] +]; + +/** + * Fired when any keyboard key (or combination) is pressed into the editing area. + * @name CKEDITOR.editor#key + * @event + * @param {Number} data.keyCode A number representing the key code (or + * combination). It is the sum of the current key code and the + * {@link CKEDITOR.CTRL}, {@link CKEDITOR.SHIFT} and {@link CKEDITOR.ALT} + * constants, if those are pressed. + */