1 /*
  2 Copyright (c) 2003-2009, 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' ],
  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 = 5;
 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.plugins.contextMenu( editor );
 39
 40 			menu.onHide = CKEDITOR.tools.bind( function()
 41 				{
 42 					this.setState( _.previousState );
 43 				},
 44 				this );
 45
 46 			// Initialize the menu items at this point.
 47 			if ( this.onMenu )
 48 			{
 49 				menu.addListener( this.onMenu );
 50 			}
 51 		}
 52
 53 		if ( _.on )
 54 		{
 55 			menu.hide();
 56 			return;
 57 		}
 58
 59 		this.setState( CKEDITOR.TRISTATE_ON );
 60
 61 		menu.show( CKEDITOR.document.getById( this._.id ), 4 );
 62 	};
 63
 64
 65 	CKEDITOR.ui.menuButton = CKEDITOR.tools.createClass(
 66 	{
 67 		base : CKEDITOR.ui.button,
 68
 69 		$ : function( definition )
 70 		{
 71 			// We don't want the panel definition in this object.
 72 			var panelDefinition = definition.panel;
 73 			delete definition.panel;
 74
 75 			this.base( definition );
 76
 77 			this.hasArrow = true;
 78
 79 			this.click = clickFn;
 80 		},
 81
 82 		statics :
 83 		{
 84 			handler :
 85 			{
 86 				create : function( definition )
 87 				{
 88 					return new CKEDITOR.ui.menuButton( definition );
 89 				}
 90 			}
 91 		}
 92 	});
 93 })();
 94