226 lines
6.2 KiB
JavaScript
226 lines
6.2 KiB
JavaScript
/*
|
|
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.
|
|
*/
|