      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( 'panelbutton',
      7 {
      8 	requires : [ 'button' ],
      9 	beforeInit : function( editor )
     10 	{
     11 		editor.ui.addHandler( CKEDITOR.UI_PANELBUTTON, CKEDITOR.ui.panelButton.handler );
     12 	}
     13 });
     14
     15 /**
     16  * Button UI element.
     17  * @constant
     18  * @example
     19  */
     20 CKEDITOR.UI_PANELBUTTON = 4;
     21
     22 (function()
     23 {
     24 	var clickFn = function( editor )
     25 	{
     26 		var _ = this._;
     27
     28 		if ( _.state == CKEDITOR.TRISTATE_DISABLED )
     29 			return;
     30
     31 		this.createPanel( editor );
     32
     33 		if ( _.on )
     34 		{
     35 			_.panel.hide();
     36 			return;
     37 		}
     38
     39 		_.panel.showBlock( this._.id, this.document.getById( this._.id ), 4 );
     40 	};
     41
     42
     43 	CKEDITOR.ui.panelButton = CKEDITOR.tools.createClass(
     44 	{
     45 		base : CKEDITOR.ui.button,
     46
     47 		$ : function( definition )
     48 		{
     49 			// We don't want the panel definition in this object.
     50 			var panelDefinition = definition.panel;
     51 			delete definition.panel;
     52
     53 			this.base( definition );
     54
     55 			this.document = ( panelDefinition
     56 								&& panelDefinition.parent
     57 								&& panelDefinition.parent.getDocument() )
     58 							|| CKEDITOR.document;
     59
     60 			this.hasArrow = true;
     61
     62 			this.click = clickFn;
     63
     64 			this._ =
     65 			{
     66 				panelDefinition : panelDefinition
     67 			};
     68 		},
     69
     70 		statics :
     71 		{
     72 			handler :
     73 			{
     74 				create : function( definition )
     75 				{
     76 					return new CKEDITOR.ui.panelButton( definition );
     77 				}
     78 			}
     79 		},
     80
     81 		proto :
     82 		{
     83 			createPanel : function( editor )
     84 			{
     85 				var _ = this._;
     86
     87 				if ( _.panel )
     88 					return;
     89
     90 				var panelDefinition = this._.panelDefinition || {},
     91 					panelParentElement = panelDefinition.parent || CKEDITOR.document.getBody(),
     92 					panel = this._.panel = new CKEDITOR.ui.floatPanel( editor, panelParentElement, panelDefinition ),
     93 					me = this;
     94
     95 				panel.onShow = function()
     96 					{
     97 						if ( me.className )
     98 							this.element.getFirst().addClass( me.className + '_panel' );
     99
    100 						_.oldState = me._.state;
    101 						me.setState( CKEDITOR.TRISTATE_ON );
    102
    103 						_.on = 1;
    104
    105 						if ( me.onOpen )
    106 							me.onOpen();
    107 					};
    108
    109 				panel.onHide = function()
    110 					{
    111 						if ( me.className )
    112 							this.element.getFirst().removeClass( me.className + '_panel' );
    113
    114 						me.setState( _.oldState );
    115
    116 						_.on = 0;
    117
    118 						if ( me.onClose )
    119 							me.onClose();
    120 					};
    121
    122 				panel.onEscape = function()
    123 					{
    124 						panel.hide();
    125 						me.document.getById( _.id ).focus();
    126 					};
    127
    128 				if ( this.onBlock )
    129 					this.onBlock( panel, _.id );
    130
    131 				panel.getBlock( _.id ).onHide = function()
    132 						{
    133 								_.on = 0;
    134 								me.setState( CKEDITOR.TRISTATE_OFF );
    135 						};
    136 			}
    137 		}
    138 	});
    139
    140 })();
    141