2 Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license
\r
6 CKEDITOR.plugins.add( 'contextmenu',
\r
8 requires : [ 'menu' ],
\r
10 // Make sure the base class (CKEDITOR.menu) is loaded before it (#3318).
\r
13 CKEDITOR.plugins.contextMenu = CKEDITOR.tools.createClass(
\r
15 base : CKEDITOR.menu,
\r
17 $ : function( editor )
\r
19 this.base.call( this, editor,
\r
23 className : editor.skinClass + ' cke_contextmenu',
\r
26 'aria-label' : editor.lang.contextmenu.options
\r
34 addTarget : function( element, nativeContextMenuOnCtrl )
\r
36 // Opera doesn't support 'contextmenu' event, we have duo approaches employed here:
\r
37 // 1. Inherit the 'button override' hack we introduced in v2 (#4530), while this require the Opera browser
\r
38 // option 'Allow script to detect context menu/right click events' to be always turned on.
\r
39 // 2. Considering the fact that ctrl/meta key is not been occupied
\r
40 // for multiple range selecting (like Gecko), we use this key
\r
41 // combination as a fallback for triggering context-menu. (#4530)
\r
42 if ( CKEDITOR.env.opera && !( 'oncontextmenu' in document.body ))
\r
44 var contextMenuOverrideButton;
\r
45 element.on( 'mousedown', function( evt )
\r
48 if ( evt.$.button != 2 )
\r
50 if ( evt.getKeystroke() == CKEDITOR.CTRL + 1 )
\r
51 element.fire( 'contextmenu', evt );
\r
55 if ( nativeContextMenuOnCtrl
\r
56 && ( CKEDITOR.env.mac ? evt.$.metaKey : evt.$.ctrlKey ) )
\r
59 var target = evt.getTarget();
\r
61 if ( !contextMenuOverrideButton )
\r
63 var ownerDoc = target.getDocument();
\r
64 contextMenuOverrideButton = ownerDoc.createElement( 'input' ) ;
\r
65 contextMenuOverrideButton.$.type = 'button' ;
\r
66 ownerDoc.getBody().append( contextMenuOverrideButton ) ;
\r
69 contextMenuOverrideButton.setAttribute( 'style', 'position:absolute;top:' + ( evt.$.clientY - 2 ) +
\r
70 'px;left:' + ( evt.$.clientX - 2 ) +
\r
71 'px;width:5px;height:5px;opacity:0.01' );
\r
75 element.on( 'mouseup', function ( evt )
\r
77 if ( contextMenuOverrideButton )
\r
79 contextMenuOverrideButton.remove();
\r
80 contextMenuOverrideButton = undefined;
\r
81 // Simulate 'contextmenu' event.
\r
82 element.fire( 'contextmenu', evt.data );
\r
87 element.on( 'contextmenu', function( event )
\r
89 var domEvent = event.data;
\r
91 if ( nativeContextMenuOnCtrl &&
\r
92 // Safari on Windows always show 'ctrlKey' as true in 'contextmenu' event,
\r
93 // which make this property unreliable. (#4826)
\r
94 ( CKEDITOR.env.webkit ? holdCtrlKey : ( CKEDITOR.env.mac ? domEvent.$.metaKey : domEvent.$.ctrlKey ) ) )
\r
98 // Cancel the browser context menu.
\r
99 domEvent.preventDefault();
\r
101 var offsetParent = domEvent.getTarget().getDocument().getDocumentElement(),
\r
102 offsetX = domEvent.$.clientX,
\r
103 offsetY = domEvent.$.clientY;
\r
105 CKEDITOR.tools.setTimeout( function()
\r
107 this.open( offsetParent, null, offsetX, offsetY );
\r
113 if ( CKEDITOR.env.opera )
\r
115 // 'contextmenu' event triggered by Windows menu key is unpreventable,
\r
116 // cancel the key event itself. (#6534)
\r
117 element.on( 'keypress' , function ( evt )
\r
119 var domEvent = evt.data;
\r
121 if ( domEvent.$.keyCode === 0 )
\r
122 domEvent.preventDefault();
\r
126 if ( CKEDITOR.env.webkit )
\r
129 onKeyDown = function( event )
\r
131 holdCtrlKey = CKEDITOR.env.mac ? event.data.$.metaKey : event.data.$.ctrlKey ;
\r
133 resetOnKeyUp = function()
\r
138 element.on( 'keydown', onKeyDown );
\r
139 element.on( 'keyup', resetOnKeyUp );
\r
140 element.on( 'contextmenu', resetOnKeyUp );
\r
144 open : function( offsetParent, corner, offsetX, offsetY )
\r
146 this.editor.focus();
\r
147 offsetParent = offsetParent || CKEDITOR.document.getDocumentElement();
\r
148 this.show( offsetParent, corner, offsetX, offsetY );
\r
154 beforeInit : function( editor )
\r
156 editor.contextMenu = new CKEDITOR.plugins.contextMenu( editor );
\r
158 editor.addCommand( 'contextMenu',
\r
162 editor.contextMenu.open( editor.document.getBody() );
\r
169 * Whether to show the browser native context menu when the CTRL or the
\r
170 * META (Mac) key is pressed while opening the context menu.
\r
171 * @name CKEDITOR.config.browserContextMenuOnCtrl
\r
176 * config.browserContextMenuOnCtrl = false;
\r