- addTarget : function( element, nativeContextMenuOnCtrl )\r
- {\r
- // Opera doesn't support 'contextmenu' event, we have duo approaches employed here:\r
- // 1. Inherit the 'button override' hack we introduced in v2 (#4530), while this require the Opera browser\r
- // option 'Allow script to detect context menu/right click events' to be always turned on.\r
- // 2. Considering the fact that ctrl/meta key is not been occupied\r
- // for multiple range selecting (like Gecko), we use this key\r
- // combination as a fallback for triggering context-menu. (#4530)\r
- if ( CKEDITOR.env.opera )\r
- {\r
- var contextMenuOverrideButton;\r
- element.on( 'mousedown', function( evt )\r
- {\r
- evt = evt.data;\r
- if( evt.$.button != 2 )\r
- {\r
- if ( evt.getKeystroke() == CKEDITOR.CTRL + 1 )\r
- element.fire( 'contextmenu', evt );\r
- return;\r
- }\r
-\r
- if ( nativeContextMenuOnCtrl\r
- && ( evt.$.ctrlKey || evt.$.metaKey ) )\r
- return;\r
-\r
- var target = evt.getTarget();\r
-\r
- if( !contextMenuOverrideButton )\r
- {\r
- var ownerDoc = target.getDocument();\r
- contextMenuOverrideButton = ownerDoc.createElement( 'input' ) ;\r
- contextMenuOverrideButton.$.type = 'button' ;\r
- ownerDoc.getBody().append( contextMenuOverrideButton ) ;\r
- }\r
-\r
- contextMenuOverrideButton.setAttribute( 'style', 'position:absolute;top:' + ( evt.$.clientY - 2 ) +\r
- 'px;left:' + ( evt.$.clientX - 2 ) +\r
- 'px;width:5px;height:5px;opacity:0.01' );\r
-\r
- } );\r
-\r
- element.on( 'mouseup', function ( evt )\r
- {\r
- if ( contextMenuOverrideButton )\r
- {\r
- contextMenuOverrideButton.remove();\r
- contextMenuOverrideButton = undefined;\r
- // Simulate 'contextmenu' event.\r
- element.fire( 'contextmenu', evt.data );\r
- }\r
- } );\r
- }\r
-\r
- element.on( 'contextmenu', function( event )\r
- {\r
- var domEvent = event.data;\r
-\r
- if ( nativeContextMenuOnCtrl &&\r
- // Safari on Windows always show 'ctrlKey' as true in 'contextmenu' event,\r
- // which make this property unreliable. (#4826)\r
- ( CKEDITOR.env.webkit ? holdCtrlKey : domEvent.$.ctrlKey || domEvent.$.metaKey ) )\r
- return;\r
-\r
- // Selection will be unavailable after context menu shows up\r
- // in IE, lock it now.\r
- if ( CKEDITOR.env.ie )\r
- {\r
- var selection = this.editor.getSelection();\r
- selection && selection.lock();\r
- }\r
-\r
- // Cancel the browser context menu.\r
- domEvent.preventDefault();\r
-\r
- var offsetParent = domEvent.getTarget().getDocument().getDocumentElement(),\r
- offsetX = domEvent.$.clientX,\r
- offsetY = domEvent.$.clientY;\r
-\r
- CKEDITOR.tools.setTimeout( function()\r
- {\r
- this._.onMenu( offsetParent, null, offsetX, offsetY );\r
- },\r
- 0, this );\r
- },\r
- this );\r