1 /* 2 Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. 3 For licensing, see LICENSE.html or http://ckeditor.com/license 4 */ 5 6 CKEDITOR.plugins.add( 'menubutton', 7 { 8 requires : [ 'button', 'menu' ], 9 beforeInit : function( editor ) 10 { 11 editor.ui.addHandler( CKEDITOR.UI_MENUBUTTON, CKEDITOR.ui.menuButton.handler ); 12 } 13 }); 14 15 /** 16 * Button UI element. 17 * @constant 18 * @example 19 */ 20 CKEDITOR.UI_MENUBUTTON = 'menubutton'; 21 22 (function() 23 { 24 var clickFn = function( editor ) 25 { 26 var _ = this._; 27 28 // Do nothing if this button is disabled. 29 if ( _.state === CKEDITOR.TRISTATE_DISABLED ) 30 return; 31 32 _.previousState = _.state; 33 34 // Check if we already have a menu for it, otherwise just create it. 35 var menu = _.menu; 36 if ( !menu ) 37 { 38 menu = _.menu = new CKEDITOR.menu( editor, 39 { 40 panel: 41 { 42 className : editor.skinClass + ' cke_contextmenu', 43 attributes : { 'aria-label' : editor.lang.common.options } 44 } 45 }); 46 47 menu.onHide = CKEDITOR.tools.bind( function() 48 { 49 this.setState( this.modes && this.modes[ editor.mode ] ? _.previousState : CKEDITOR.TRISTATE_DISABLED ); 50 }, 51 this ); 52 53 // Initialize the menu items at this point. 54 if ( this.onMenu ) 55 menu.addListener( this.onMenu ); 56 } 57 58 if ( _.on ) 59 { 60 menu.hide(); 61 return; 62 } 63 64 this.setState( CKEDITOR.TRISTATE_ON ); 65 66 menu.show( CKEDITOR.document.getById( this._.id ), 4 ); 67 }; 68 69 70 CKEDITOR.ui.menuButton = CKEDITOR.tools.createClass( 71 { 72 base : CKEDITOR.ui.button, 73 74 $ : function( definition ) 75 { 76 // We don't want the panel definition in this object. 77 var panelDefinition = definition.panel; 78 delete definition.panel; 79 80 this.base( definition ); 81 82 this.hasArrow = true; 83 84 this.click = clickFn; 85 }, 86 87 statics : 88 { 89 handler : 90 { 91 create : function( definition ) 92 { 93 return new CKEDITOR.ui.menuButton( definition ); 94 } 95 } 96 } 97 }); 98 })(); 99