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