142 lines
4.4 KiB
JavaScript
142 lines
4.4 KiB
JavaScript
|
/*
|
|||
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
|||
|
* Copyright (C) 2003-2009 Frederico Caldeira Knabben
|
|||
|
*
|
|||
|
* == BEGIN LICENSE ==
|
|||
|
*
|
|||
|
* Licensed under the terms of any of the following licenses at your
|
|||
|
* choice:
|
|||
|
*
|
|||
|
* - GNU General Public License Version 2 or later (the "GPL")
|
|||
|
* http://www.gnu.org/licenses/gpl.html
|
|||
|
*
|
|||
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
|||
|
* http://www.gnu.org/licenses/lgpl.html
|
|||
|
*
|
|||
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
|||
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
|||
|
*
|
|||
|
* == END LICENSE ==
|
|||
|
*
|
|||
|
* Control keyboard keystroke combinations.
|
|||
|
*/
|
|||
|
|
|||
|
var FCKKeystrokeHandler = function( cancelCtrlDefaults )
|
|||
|
{
|
|||
|
this.Keystrokes = new Object() ;
|
|||
|
this.CancelCtrlDefaults = ( cancelCtrlDefaults !== false ) ;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Listen to keystroke events in an element or DOM document object.
|
|||
|
* @target: The element or document to listen to keystroke events.
|
|||
|
*/
|
|||
|
FCKKeystrokeHandler.prototype.AttachToElement = function( target )
|
|||
|
{
|
|||
|
// For newer browsers, it is enough to listen to the keydown event only.
|
|||
|
// 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.
|
|||
|
FCKTools.AddEventListenerEx( target, 'keydown', _FCKKeystrokeHandler_OnKeyDown, this ) ;
|
|||
|
if ( FCKBrowserInfo.IsGecko10 || FCKBrowserInfo.IsOpera || ( FCKBrowserInfo.IsGecko && FCKBrowserInfo.IsMac ) )
|
|||
|
FCKTools.AddEventListenerEx( target, 'keypress', _FCKKeystrokeHandler_OnKeyPress, this ) ;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Sets a list of keystrokes. It can receive either a single array or "n"
|
|||
|
* arguments, each one being an array of 1 or 2 elemenst. The first element
|
|||
|
* is the keystroke combination, and the second is the value to assign to it.
|
|||
|
* If the second element is missing, the keystroke definition is removed.
|
|||
|
*/
|
|||
|
FCKKeystrokeHandler.prototype.SetKeystrokes = function()
|
|||
|
{
|
|||
|
// Look through the arguments.
|
|||
|
for ( var i = 0 ; i < arguments.length ; i++ )
|
|||
|
{
|
|||
|
var keyDef = arguments[i] ;
|
|||
|
|
|||
|
// If the configuration for the keystrokes is missing some element or has any extra comma
|
|||
|
// this item won't be valid, so skip it and keep on processing.
|
|||
|
if ( !keyDef )
|
|||
|
continue ;
|
|||
|
|
|||
|
if ( typeof( keyDef[0] ) == 'object' ) // It is an array with arrays defining the keystrokes.
|
|||
|
this.SetKeystrokes.apply( this, keyDef ) ;
|
|||
|
else
|
|||
|
{
|
|||
|
if ( keyDef.length == 1 ) // If it has only one element, remove the keystroke.
|
|||
|
delete this.Keystrokes[ keyDef[0] ] ;
|
|||
|
else // Otherwise add it.
|
|||
|
this.Keystrokes[ keyDef[0] ] = keyDef[1] === true ? true : keyDef ;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function _FCKKeystrokeHandler_OnKeyDown( ev, keystrokeHandler )
|
|||
|
{
|
|||
|
// Get the key code.
|
|||
|
var keystroke = ev.keyCode || ev.which ;
|
|||
|
|
|||
|
// Combine it with the CTRL, SHIFT and ALT states.
|
|||
|
var keyModifiers = 0 ;
|
|||
|
|
|||
|
if ( ev.ctrlKey || ev.metaKey )
|
|||
|
keyModifiers += CTRL ;
|
|||
|
|
|||
|
if ( ev.shiftKey )
|
|||
|
keyModifiers += SHIFT ;
|
|||
|
|
|||
|
if ( ev.altKey )
|
|||
|
keyModifiers += ALT ;
|
|||
|
|
|||
|
var keyCombination = keystroke + keyModifiers ;
|
|||
|
|
|||
|
var cancelIt = keystrokeHandler._CancelIt = false ;
|
|||
|
|
|||
|
// Look for its definition availability.
|
|||
|
var keystrokeValue = keystrokeHandler.Keystrokes[ keyCombination ] ;
|
|||
|
|
|||
|
// FCKDebug.Output( 'KeyDown: ' + keyCombination + ' - Value: ' + keystrokeValue ) ;
|
|||
|
|
|||
|
// If the keystroke is defined
|
|||
|
if ( keystrokeValue )
|
|||
|
{
|
|||
|
// If the keystroke has been explicitly set to "true" OR calling the
|
|||
|
// "OnKeystroke" event, it doesn't return "true", the default behavior
|
|||
|
// must be preserved.
|
|||
|
if ( keystrokeValue === true || !( keystrokeHandler.OnKeystroke && keystrokeHandler.OnKeystroke.apply( keystrokeHandler, keystrokeValue ) ) )
|
|||
|
return true ;
|
|||
|
|
|||
|
cancelIt = true ;
|
|||
|
}
|
|||
|
|
|||
|
// By default, it will cancel all combinations with the CTRL key only (except positioning keys).
|
|||
|
if ( cancelIt || ( keystrokeHandler.CancelCtrlDefaults && keyModifiers == CTRL && ( keystroke < 33 || keystroke > 40 ) ) )
|
|||
|
{
|
|||
|
keystrokeHandler._CancelIt = true ;
|
|||
|
|
|||
|
if ( ev.preventDefault )
|
|||
|
return ev.preventDefault() ;
|
|||
|
|
|||
|
ev.returnValue = false ;
|
|||
|
ev.cancelBubble = true ;
|
|||
|
return false ;
|
|||
|
}
|
|||
|
|
|||
|
return true ;
|
|||
|
}
|
|||
|
|
|||
|
function _FCKKeystrokeHandler_OnKeyPress( ev, keystrokeHandler )
|
|||
|
{
|
|||
|
if ( keystrokeHandler._CancelIt )
|
|||
|
{
|
|||
|
// FCKDebug.Output( 'KeyPress Cancel', 'Red') ;
|
|||
|
|
|||
|
if ( ev.preventDefault )
|
|||
|
return ev.preventDefault() ;
|
|||
|
|
|||
|
return false ;
|
|||
|
}
|
|||
|
|
|||
|
return true ;
|
|||
|
}
|