JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
63f85c72bafa1696683324a088fb606c3d433f21
[ckeditor.git] / _source / plugins / listblock / plugin.js
1 /*\r
2 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 CKEDITOR.plugins.add( 'listblock',\r
7 {\r
8         requires : [ 'panel' ],\r
9 \r
10         onLoad : function()\r
11         {\r
12                 CKEDITOR.ui.panel.prototype.addListBlock = function( name, definition )\r
13                 {\r
14                         return this.addBlock( name, new CKEDITOR.ui.listBlock( this.getHolderElement(), definition ) );\r
15                 };\r
16 \r
17                 CKEDITOR.ui.listBlock = CKEDITOR.tools.createClass(\r
18                         {\r
19                                 base : CKEDITOR.ui.panel.block,\r
20 \r
21                                 $ : function( blockHolder, blockDefinition )\r
22                                 {\r
23                                         blockDefinition = blockDefinition || {};\r
24 \r
25                                         var attribs = blockDefinition.attributes || ( blockDefinition.attributes = {} );\r
26                                         ( this.multiSelect = !!blockDefinition.multiSelect ) &&\r
27                                                 ( attribs[ 'aria-multiselectable' ] = true );\r
28                                         // Provide default role of 'listbox'.\r
29                                         !attribs.role && ( attribs.role = 'listbox' );\r
30 \r
31                                         // Call the base contructor.\r
32                                         this.base.apply( this, arguments );\r
33 \r
34                                         var keys = this.keys;\r
35                                         keys[ 40 ]      = 'next';                                       // ARROW-DOWN\r
36                                         keys[ 9 ]       = 'next';                                       // TAB\r
37                                         keys[ 38 ]      = 'prev';                                       // ARROW-UP\r
38                                         keys[ CKEDITOR.SHIFT + 9 ]      = 'prev';       // SHIFT + TAB\r
39                                         keys[ 32 ]      = 'click';                                      // SPACE\r
40 \r
41                                         this._.pendingHtml = [];\r
42                                         this._.items = {};\r
43                                         this._.groups = {};\r
44                                 },\r
45 \r
46                                 _ :\r
47                                 {\r
48                                         close : function()\r
49                                         {\r
50                                                 if ( this._.started )\r
51                                                 {\r
52                                                         this._.pendingHtml.push( '</ul>' );\r
53                                                         delete this._.started;\r
54                                                 }\r
55                                         },\r
56 \r
57                                         getClick : function()\r
58                                         {\r
59                                                 if ( !this._.click )\r
60                                                 {\r
61                                                         this._.click = CKEDITOR.tools.addFunction( function( value )\r
62                                                                 {\r
63                                                                         var marked = true;\r
64 \r
65                                                                         if ( this.multiSelect )\r
66                                                                                 marked = this.toggle( value );\r
67                                                                         else\r
68                                                                                 this.mark( value );\r
69 \r
70                                                                         if ( this.onClick )\r
71                                                                                 this.onClick( value, marked );\r
72                                                                 },\r
73                                                                 this );\r
74                                                 }\r
75                                                 return this._.click;\r
76                                         }\r
77                                 },\r
78 \r
79                                 proto :\r
80                                 {\r
81                                         add : function( value, html, title )\r
82                                         {\r
83                                                 var pendingHtml = this._.pendingHtml,\r
84                                                         id = 'cke_' + CKEDITOR.tools.getNextNumber();\r
85 \r
86                                                 if ( !this._.started )\r
87                                                 {\r
88                                                         pendingHtml.push( '<ul role="presentation" class=cke_panel_list>' );\r
89                                                         this._.started = 1;\r
90                                                         this._.size = this._.size || 0;\r
91                                                 }\r
92 \r
93                                                 this._.items[ value ] = id;\r
94 \r
95                                                 pendingHtml.push(\r
96                                                         '<li id=', id, ' class=cke_panel_listItem>' +\r
97                                                                 '<a id="', id, '_option" _cke_focus=1 hidefocus=true' +\r
98                                                                         ' title="', title || value, '"' +\r
99                                                                         ' href="javascript:void(\'', value, '\')"' +\r
100                                                                         ' onclick="CKEDITOR.tools.callFunction(', this._.getClick(), ',\'', value, '\'); return false;"',\r
101                                                                         ' role="option"' +\r
102                                                                         ' aria-posinset="' + ++this._.size + '">',\r
103                                                                         html || value,\r
104                                                                 '</a>' +\r
105                                                         '</li>' );\r
106                                         },\r
107 \r
108                                         startGroup : function( title )\r
109                                         {\r
110                                                 this._.close();\r
111 \r
112                                                 var id = 'cke_' + CKEDITOR.tools.getNextNumber();\r
113 \r
114                                                 this._.groups[ title ] = id;\r
115 \r
116                                                 this._.pendingHtml.push( '<h1 role="presentation" id=', id, ' class=cke_panel_grouptitle>', title, '</h1>' );\r
117                                         },\r
118 \r
119                                         commit : function()\r
120                                         {\r
121                                                 this._.close();\r
122                                                 this.element.appendHtml( this._.pendingHtml.join( '' ) );\r
123 \r
124                                                 var items = this._.items,\r
125                                                         doc = this.element.getDocument();\r
126                                                 for ( var value in items )\r
127                                                         doc.getById( items[ value ] + '_option' ).setAttribute( 'aria-setsize', this._.size );\r
128                                                 delete this._.size;\r
129 \r
130                                                 this._.pendingHtml = [];\r
131                                         },\r
132 \r
133                                         toggle : function( value )\r
134                                         {\r
135                                                 var isMarked = this.isMarked( value );\r
136 \r
137                                                 if ( isMarked )\r
138                                                         this.unmark( value );\r
139                                                 else\r
140                                                         this.mark( value );\r
141 \r
142                                                 return !isMarked;\r
143                                         },\r
144 \r
145                                         hideGroup : function( groupTitle )\r
146                                         {\r
147                                                 var group = this.element.getDocument().getById( this._.groups[ groupTitle ] ),\r
148                                                         list = group && group.getNext();\r
149 \r
150                                                 if ( group )\r
151                                                 {\r
152                                                         group.setStyle( 'display', 'none' );\r
153 \r
154                                                         if ( list && list.getName() == 'ul' )\r
155                                                                 list.setStyle( 'display', 'none' );\r
156                                                 }\r
157                                         },\r
158 \r
159                                         hideItem : function( value )\r
160                                         {\r
161                                                 this.element.getDocument().getById( this._.items[ value ] ).setStyle( 'display', 'none' );\r
162                                         },\r
163 \r
164                                         showAll : function()\r
165                                         {\r
166                                                 var items = this._.items,\r
167                                                         groups = this._.groups,\r
168                                                         doc = this.element.getDocument();\r
169 \r
170                                                 for ( var value in items )\r
171                                                 {\r
172                                                         doc.getById( items[ value ] ).setStyle( 'display', '' );\r
173                                                 }\r
174 \r
175                                                 for ( var title in groups )\r
176                                                 {\r
177                                                         var group = doc.getById( groups[ title ] ),\r
178                                                                 list = group.getNext();\r
179 \r
180                                                         group.setStyle( 'display', '' );\r
181 \r
182                                                         if ( list && list.getName() == 'ul' )\r
183                                                                 list.setStyle( 'display', '' );\r
184                                                 }\r
185                                         },\r
186 \r
187                                         mark : function( value )\r
188                                         {\r
189                                                 if ( !this.multiSelect )\r
190                                                         this.unmarkAll();\r
191 \r
192                                                 var itemId = this._.items[ value ],\r
193                                                         item = this.element.getDocument().getById( itemId );\r
194                                                 item.addClass( 'cke_selected' );\r
195 \r
196                                                 this.element.getDocument().getById( itemId + '_option' ).setAttribute( 'aria-selected', true );\r
197                                                 this.element.setAttribute( 'aria-activedescendant', itemId + '_option' );\r
198 \r
199                                                 this.onMark && this.onMark( item );\r
200                                         },\r
201 \r
202                                         unmark : function( value )\r
203                                         {\r
204                                                 this.element.getDocument().getById( this._.items[ value ] ).removeClass( 'cke_selected' );\r
205                                                 this.onUnmark && this.onUnmark( this._.items[ value ] );\r
206                                         },\r
207 \r
208                                         unmarkAll : function()\r
209                                         {\r
210                                                 var items = this._.items,\r
211                                                         doc = this.element.getDocument();\r
212 \r
213                                                 for ( var value in items )\r
214                                                 {\r
215                                                         doc.getById( items[ value ] ).removeClass( 'cke_selected' );\r
216                                                 }\r
217 \r
218                                                 this.onUnmark && this.onUnmark();\r
219                                         },\r
220 \r
221                                         isMarked : function( value )\r
222                                         {\r
223                                                 return this.element.getDocument().getById( this._.items[ value ] ).hasClass( 'cke_selected' );\r
224                                         },\r
225 \r
226                                         focus : function( value )\r
227                                         {\r
228                                                 this._.focusIndex = -1;\r
229 \r
230                                                 if ( value )\r
231                                                 {\r
232                                                         var selected = this.element.getDocument().getById( this._.items[ value ] ).getFirst();\r
233 \r
234                                                         var links = this.element.getElementsByTag( 'a' ),\r
235                                                                 link,\r
236                                                                 i = -1;\r
237 \r
238                                                         while ( ( link = links.getItem( ++i ) ) )\r
239                                                         {\r
240                                                                 if ( link.equals( selected ) )\r
241                                                                 {\r
242                                                                         this._.focusIndex = i;\r
243                                                                         break;\r
244                                                                 }\r
245                                                         }\r
246 \r
247                                                         setTimeout( function()\r
248                                                                 {\r
249                                                                         selected.focus();\r
250                                                                 },\r
251                                                                 0 );\r
252                                                 }\r
253                                         }\r
254                                 }\r
255                         });\r
256         }\r
257 });\r