/* Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ CKEDITOR.plugins.add( 'panelbutton', { requires : [ 'button' ], beforeInit : function( editor ) { editor.ui.addHandler( CKEDITOR.UI_PANELBUTTON, CKEDITOR.ui.panelButton.handler ); } }); /** * Button UI element. * @constant * @example */ CKEDITOR.UI_PANELBUTTON = 4; (function() { var clickFn = function( editor ) { var _ = this._; if ( _.state == CKEDITOR.TRISTATE_DISABLED ) return; this.createPanel( editor ); if ( _.on ) { _.panel.hide(); return; } _.panel.showBlock( this._.id, this.document.getById( this._.id ), 4 ); }; CKEDITOR.ui.panelButton = CKEDITOR.tools.createClass( { base : CKEDITOR.ui.button, $ : function( definition ) { // We don't want the panel definition in this object. var panelDefinition = definition.panel; delete definition.panel; this.base( definition ); this.document = ( panelDefinition && panelDefinition.parent && panelDefinition.parent.getDocument() ) || CKEDITOR.document; panelDefinition.block = { attributes : panelDefinition.attributes }; this.hasArrow = true; this.click = clickFn; this._ = { panelDefinition : panelDefinition }; }, statics : { handler : { create : function( definition ) { return new CKEDITOR.ui.panelButton( definition ); } } }, proto : { createPanel : function( editor ) { var _ = this._; if ( _.panel ) return; var panelDefinition = this._.panelDefinition || {}, panelBlockDefinition = this._.panelDefinition.block, panelParentElement = panelDefinition.parent || CKEDITOR.document.getBody(), panel = this._.panel = new CKEDITOR.ui.floatPanel( editor, panelParentElement, panelDefinition ), block = panel.addBlock( _.id, panelBlockDefinition ), me = this; panel.onShow = function() { if ( me.className ) this.element.getFirst().addClass( me.className + '_panel' ); me.setState( CKEDITOR.TRISTATE_ON ); _.on = 1; if ( me.onOpen ) me.onOpen(); }; panel.onHide = function( preventOnClose ) { if ( me.className ) this.element.getFirst().removeClass( me.className + '_panel' ); me.setState( me.modes && me.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED ); _.on = 0; if ( !preventOnClose && me.onClose ) me.onClose(); }; panel.onEscape = function() { panel.hide(); me.document.getById( _.id ).focus(); }; if ( this.onBlock ) this.onBlock( panel, block ); block.onHide = function() { _.on = 0; me.setState( CKEDITOR.TRISTATE_OFF ); }; } } }); })();