summaryrefslogtreecommitdiff
path: root/_source/plugins/contextmenu/plugin.js
diff options
context:
space:
mode:
Diffstat (limited to '_source/plugins/contextmenu/plugin.js')
-rw-r--r--_source/plugins/contextmenu/plugin.js178
1 files changed, 178 insertions, 0 deletions
diff --git a/_source/plugins/contextmenu/plugin.js b/_source/plugins/contextmenu/plugin.js
new file mode 100644
index 0000000..5e1bf61
--- /dev/null
+++ b/_source/plugins/contextmenu/plugin.js
@@ -0,0 +1,178 @@
+/*
+Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.add( 'contextmenu',
+{
+ requires : [ 'menu' ],
+
+ beforeInit : function( editor )
+ {
+ editor.contextMenu = new CKEDITOR.plugins.contextMenu( editor );
+
+ editor.addCommand( 'contextMenu',
+ {
+ exec : function()
+ {
+ editor.contextMenu.show( editor.document.getBody() );
+ }
+ });
+ }
+});
+
+CKEDITOR.plugins.contextMenu = CKEDITOR.tools.createClass(
+{
+ $ : function( editor )
+ {
+ this.id = 'cke_' + CKEDITOR.tools.getNextNumber();
+ this.editor = editor;
+ this._.listeners = [];
+ this._.functionId = CKEDITOR.tools.addFunction( function( commandName )
+ {
+ this._.panel.hide();
+ editor.focus();
+ editor.execCommand( commandName );
+ },
+ this);
+ },
+
+ _ :
+ {
+ onMenu : function( offsetParent, corner, offsetX, offsetY )
+ {
+ var menu = this._.menu,
+ editor = this.editor;
+
+ if ( menu )
+ {
+ menu.hide();
+ menu.removeAll();
+ }
+ else
+ {
+ menu = this._.menu = new CKEDITOR.menu( editor );
+ menu.onClick = CKEDITOR.tools.bind( function( item )
+ {
+ var noUnlock = true;
+ menu.hide();
+
+ if ( CKEDITOR.env.ie )
+ menu.onEscape();
+
+ if ( item.onClick )
+ item.onClick();
+ else if ( item.command )
+ editor.execCommand( item.command );
+
+ noUnlock = false;
+ }, this );
+
+ menu.onEscape = function()
+ {
+ editor.focus();
+
+ if ( CKEDITOR.env.ie )
+ editor.getSelection().unlock( true );
+ };
+ }
+
+ var listeners = this._.listeners,
+ includedItems = [];
+
+ var selection = this.editor.getSelection(),
+ element = selection && selection.getStartElement();
+
+ // Lock the selection in IE, so it can be restored when closing the
+ // menu.
+ if ( CKEDITOR.env.ie )
+ selection.lock();
+
+ menu.onHide = CKEDITOR.tools.bind( function()
+ {
+ menu.onHide = null;
+
+ if ( CKEDITOR.env.ie )
+ editor.getSelection().unlock();
+
+ this.onHide && this.onHide();
+ },
+ this );
+
+ // Call all listeners, filling the list of items to be displayed.
+ for ( var i = 0 ; i < listeners.length ; i++ )
+ {
+ var listenerItems = listeners[ i ]( element, selection );
+
+ if ( listenerItems )
+ {
+ for ( var itemName in listenerItems )
+ {
+ var item = this.editor.getMenuItem( itemName );
+
+ if ( item )
+ {
+ item.state = listenerItems[ itemName ];
+ menu.add( item );
+ }
+ }
+ }
+ }
+
+ menu.show( offsetParent, corner || ( editor.lang.dir == 'rtl' ? 2 : 1 ), offsetX, offsetY );
+ }
+ },
+
+ proto :
+ {
+ addTarget : function( element )
+ {
+ element.on( 'contextmenu', function( event )
+ {
+ var domEvent = event.data;
+
+ // Cancel the browser context menu.
+ domEvent.preventDefault();
+
+ var offsetParent = domEvent.getTarget().getDocument().getDocumentElement(),
+ offsetX = domEvent.$.clientX,
+ offsetY = domEvent.$.clientY;
+
+ CKEDITOR.tools.setTimeout( function()
+ {
+ this._.onMenu( offsetParent, null, offsetX, offsetY );
+ },
+ 0, this );
+ },
+ this );
+ },
+
+ addListener : function( listenerFn )
+ {
+ this._.listeners.push( listenerFn );
+ },
+
+ show : function( offsetParent, corner, offsetX, offsetY )
+ {
+ this.editor.focus();
+ this._.onMenu( offsetParent || CKEDITOR.document.getDocumentElement(), corner, offsetX || 0, offsetY || 0 );
+ }
+ }
+});
+
+// Fix the "contextmenu" event for DOM elements.
+// We may do this if we identify browsers that don't support the context meny
+// event on element directly. Leaving here for reference.
+//if ( <specific browsers> )
+//{
+// CKEDITOR.dom.element.prototype.on = CKEDITOR.tools.override( CKEDITOR.dom.element.prototype.on, function( originalOn )
+// {
+// return function( eventName )
+// {
+// if ( eventName != 'contextmenu' )
+// return originalOn.apply( this, arguments );
+//
+// // TODO : Implement the fix.
+// };
+// });
+//}