JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.6.1
[ckeditor.git] / _source / plugins / listblock / plugin.js
1 /*\r
2 Copyright (c) 2003-2011, 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 ]      = CKEDITOR.env.ie ? 'mouseup' : 'click';                                        // SPACE\r
40                                         CKEDITOR.env.ie && ( keys[ 13 ] = 'mouseup' );          // Manage ENTER, since onclick is blocked in IE (#8041).\r
41 \r
42                                         this._.pendingHtml = [];\r
43                                         this._.items = {};\r
44                                         this._.groups = {};\r
45                                 },\r
46 \r
47                                 _ :\r
48                                 {\r
49                                         close : function()\r
50                                         {\r
51                                                 if ( this._.started )\r
52                                                 {\r
53                                                         this._.pendingHtml.push( '</ul>' );\r
54                                                         delete this._.started;\r
55                                                 }\r
56                                         },\r
57 \r
58                                         getClick : function()\r
59                                         {\r
60                                                 if ( !this._.click )\r
61                                                 {\r
62                                                         this._.click = CKEDITOR.tools.addFunction( function( value )\r
63                                                                 {\r
64                                                                         var marked = true;\r
65 \r
66                                                                         if ( this.multiSelect )\r
67                                                                                 marked = this.toggle( value );\r
68                                                                         else\r
69                                                                                 this.mark( value );\r
70 \r
71                                                                         if ( this.onClick )\r
72                                                                                 this.onClick( value, marked );\r
73                                                                 },\r
74                                                                 this );\r
75                                                 }\r
76                                                 return this._.click;\r
77                                         }\r
78                                 },\r
79 \r
80                                 proto :\r
81                                 {\r
82                                         add : function( value, html, title )\r
83                                         {\r
84                                                 var pendingHtml = this._.pendingHtml,\r
85                                                         id = CKEDITOR.tools.getNextId();\r
86 \r
87                                                 if ( !this._.started )\r
88                                                 {\r
89                                                         pendingHtml.push( '<ul role="presentation" class=cke_panel_list>' );\r
90                                                         this._.started = 1;\r
91                                                         this._.size = this._.size || 0;\r
92                                                 }\r
93 \r
94                                                 this._.items[ value ] = id;\r
95 \r
96                                                 pendingHtml.push(\r
97                                                         '<li id=', id, ' class=cke_panel_listItem role=presentation>' +\r
98                                                                 '<a id="', id, '_option" _cke_focus=1 hidefocus=true' +\r
99                                                                         ' title="', title || value, '"' +\r
100                                                                         ' href="javascript:void(\'', value, '\')" ' +\r
101                                                                         ( CKEDITOR.env.ie ? 'onclick="return false;" onmouseup' : 'onclick' ) +         // #188\r
102                                                                                 '="CKEDITOR.tools.callFunction(', this._.getClick(), ',\'', value, '\'); return false;"',\r
103                                                                         ' role="option"' +\r
104                                                                         ' aria-posinset="' + ++this._.size + '">',\r
105                                                                         html || value,\r
106                                                                 '</a>' +\r
107                                                         '</li>' );\r
108                                         },\r
109 \r
110                                         startGroup : function( title )\r
111                                         {\r
112                                                 this._.close();\r
113 \r
114                                                 var id = CKEDITOR.tools.getNextId();\r
115 \r
116                                                 this._.groups[ title ] = id;\r
117 \r
118                                                 this._.pendingHtml.push( '<h1 role="presentation" id=', id, ' class=cke_panel_grouptitle>', title, '</h1>' );\r
119                                         },\r
120 \r
121                                         commit : function()\r
122                                         {\r
123                                                 this._.close();\r
124                                                 this.element.appendHtml( this._.pendingHtml.join( '' ) );\r
125 \r
126                                                 var items = this._.items,\r
127                                                         doc = this.element.getDocument();\r
128                                                 for ( var value in items )\r
129                                                         doc.getById( items[ value ] + '_option' ).setAttribute( 'aria-setsize', this._.size );\r
130                                                 delete this._.size;\r
131 \r
132                                                 this._.pendingHtml = [];\r
133                                         },\r
134 \r
135                                         toggle : function( value )\r
136                                         {\r
137                                                 var isMarked = this.isMarked( value );\r
138 \r
139                                                 if ( isMarked )\r
140                                                         this.unmark( value );\r
141                                                 else\r
142                                                         this.mark( value );\r
143 \r
144                                                 return !isMarked;\r
145                                         },\r
146 \r
147                                         hideGroup : function( groupTitle )\r
148                                         {\r
149                                                 var group = this.element.getDocument().getById( this._.groups[ groupTitle ] ),\r
150                                                         list = group && group.getNext();\r
151 \r
152                                                 if ( group )\r
153                                                 {\r
154                                                         group.setStyle( 'display', 'none' );\r
155 \r
156                                                         if ( list && list.getName() == 'ul' )\r
157                                                                 list.setStyle( 'display', 'none' );\r
158                                                 }\r
159                                         },\r
160 \r
161                                         hideItem : function( value )\r
162                                         {\r
163                                                 this.element.getDocument().getById( this._.items[ value ] ).setStyle( 'display', 'none' );\r
164                                         },\r
165 \r
166                                         showAll : function()\r
167                                         {\r
168                                                 var items = this._.items,\r
169                                                         groups = this._.groups,\r
170                                                         doc = this.element.getDocument();\r
171 \r
172                                                 for ( var value in items )\r
173                                                 {\r
174                                                         doc.getById( items[ value ] ).setStyle( 'display', '' );\r
175                                                 }\r
176 \r
177                                                 for ( var title in groups )\r
178                                                 {\r
179                                                         var group = doc.getById( groups[ title ] ),\r
180                                                                 list = group.getNext();\r
181 \r
182                                                         group.setStyle( 'display', '' );\r
183 \r
184                                                         if ( list && list.getName() == 'ul' )\r
185                                                                 list.setStyle( 'display', '' );\r
186                                                 }\r
187                                         },\r
188 \r
189                                         mark : function( value )\r
190                                         {\r
191                                                 if ( !this.multiSelect )\r
192                                                         this.unmarkAll();\r
193 \r
194                                                 var itemId = this._.items[ value ],\r
195                                                         item = this.element.getDocument().getById( itemId );\r
196                                                 item.addClass( 'cke_selected' );\r
197 \r
198                                                 this.element.getDocument().getById( itemId + '_option' ).setAttribute( 'aria-selected', true );\r
199                                                 this.element.setAttribute( 'aria-activedescendant', itemId + '_option' );\r
200 \r
201                                                 this.onMark && this.onMark( item );\r
202                                         },\r
203 \r
204                                         unmark : function( value )\r
205                                         {\r
206                                                 var doc = this.element.getDocument(),\r
207                                                         itemId = this._.items[ value ],\r
208                                                         item = doc.getById( itemId );\r
209 \r
210                                                 item.removeClass( 'cke_selected' );\r
211                                                 doc.getById( itemId + '_option' ).removeAttribute( 'aria-selected' );\r
212 \r
213                                                 this.onUnmark && this.onUnmark( item );\r
214                                         },\r
215 \r
216                                         unmarkAll : function()\r
217                                         {\r
218                                                 var items = this._.items,\r
219                                                         doc = this.element.getDocument();\r
220 \r
221                                                 for ( var value in items )\r
222                                                 {\r
223                                                         var itemId = items[ value ];\r
224 \r
225                                                         doc.getById( itemId ).removeClass( 'cke_selected' );\r
226                                                         doc.getById( itemId + '_option' ).removeAttribute( 'aria-selected' );\r
227                                                 }\r
228 \r
229                                                 this.onUnmark && this.onUnmark();\r
230                                         },\r
231 \r
232                                         isMarked : function( value )\r
233                                         {\r
234                                                 return this.element.getDocument().getById( this._.items[ value ] ).hasClass( 'cke_selected' );\r
235                                         },\r
236 \r
237                                         focus : function( value )\r
238                                         {\r
239                                                 this._.focusIndex = -1;\r
240 \r
241                                                 if ( value )\r
242                                                 {\r
243                                                         var selected = this.element.getDocument().getById( this._.items[ value ] ).getFirst();\r
244 \r
245                                                         var links = this.element.getElementsByTag( 'a' ),\r
246                                                                 link,\r
247                                                                 i = -1;\r
248 \r
249                                                         while ( ( link = links.getItem( ++i ) ) )\r
250                                                         {\r
251                                                                 if ( link.equals( selected ) )\r
252                                                                 {\r
253                                                                         this._.focusIndex = i;\r
254                                                                         break;\r
255                                                                 }\r
256                                                         }\r
257 \r
258                                                         setTimeout( function()\r
259                                                                 {\r
260                                                                         selected.focus();\r
261                                                                 },\r
262                                                                 0 );\r
263                                                 }\r
264                                         }\r
265                                 }\r
266                         });\r
267         }\r
268 });\r