JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
946a54f19c9ef5c2c6d9909930f92f216f7d2172
[ckeditor.git] / _source / plugins / listblock / plugin.js
1 /*\r
2 Copyright (c) 2003-2009, 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, multiSelect )\r
13                 {\r
14                         return this.addBlock( name, new CKEDITOR.ui.listBlock( this.getHolderElement(), multiSelect ) );\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, multiSelect )\r
22                                 {\r
23                                         // Call the base contructor.\r
24                                         this.base( blockHolder );\r
25 \r
26                                         this.multiSelect = !!multiSelect;\r
27 \r
28                                         var keys = this.keys;\r
29                                         keys[ 40 ]      = 'next';                                       // ARROW-DOWN\r
30                                         keys[ 9 ]       = 'next';                                       // TAB\r
31                                         keys[ 38 ]      = 'prev';                                       // ARROW-UP\r
32                                         keys[ CKEDITOR.SHIFT + 9 ]      = 'prev';       // SHIFT + TAB\r
33                                         keys[ 32 ]      = 'click';                                      // SPACE\r
34 \r
35                                         this._.pendingHtml = [];\r
36                                         this._.items = {};\r
37                                         this._.groups = {};\r
38                                 },\r
39 \r
40                                 _ :\r
41                                 {\r
42                                         close : function()\r
43                                         {\r
44                                                 if ( this._.started )\r
45                                                 {\r
46                                                         this._.pendingHtml.push( '</ul>' );\r
47                                                         delete this._.started;\r
48                                                 }\r
49                                         },\r
50 \r
51                                         getClick : function()\r
52                                         {\r
53                                                 if ( !this._.click )\r
54                                                 {\r
55                                                         this._.click = CKEDITOR.tools.addFunction( function( value )\r
56                                                                 {\r
57                                                                         var marked = true;\r
58 \r
59                                                                         if ( this.multiSelect )\r
60                                                                                 marked = this.toggle( value );\r
61                                                                         else\r
62                                                                                 this.mark( value );\r
63 \r
64                                                                         if ( this.onClick )\r
65                                                                                 this.onClick( value, marked );\r
66                                                                 },\r
67                                                                 this );\r
68                                                 }\r
69                                                 return this._.click;\r
70                                         }\r
71                                 },\r
72 \r
73                                 proto :\r
74                                 {\r
75                                         add : function( value, html, title )\r
76                                         {\r
77                                                 var pendingHtml = this._.pendingHtml,\r
78                                                         id = 'cke_' + CKEDITOR.tools.getNextNumber();\r
79 \r
80                                                 if ( !this._.started )\r
81                                                 {\r
82                                                         pendingHtml.push( '<ul class=cke_panel_list>' );\r
83                                                         this._.started = 1;\r
84                                                 }\r
85 \r
86                                                 this._.items[ value ] = id;\r
87 \r
88                                                 pendingHtml.push(\r
89                                                         '<li id=', id, ' class=cke_panel_listItem>' +\r
90                                                                 '<a _cke_focus=1 hidefocus=true' +\r
91                                                                         ' title="', title || value, '"' +\r
92                                                                         ' href="javascript:void(\'', value, '\')"' +\r
93                                                                         ' onclick="CKEDITOR.tools.callFunction(', this._.getClick(), ',\'', value, '\'); return false;">',\r
94                                                                         html || value,\r
95                                                                 '</a>' +\r
96                                                         '</li>' );\r
97                                         },\r
98 \r
99                                         startGroup : function( title )\r
100                                         {\r
101                                                 this._.close();\r
102 \r
103                                                 var id = 'cke_' + CKEDITOR.tools.getNextNumber();\r
104 \r
105                                                 this._.groups[ title ] = id;\r
106 \r
107                                                 this._.pendingHtml.push( '<h1 id=', id, ' class=cke_panel_grouptitle>', title, '</h1>' );\r
108                                         },\r
109 \r
110                                         commit : function()\r
111                                         {\r
112                                                 this._.close();\r
113                                                 this.element.appendHtml( this._.pendingHtml.join( '' ) );\r
114                                                 this._.pendingHtml = [];\r
115                                         },\r
116 \r
117                                         toggle : function( value )\r
118                                         {\r
119                                                 var isMarked = this.isMarked( value );\r
120 \r
121                                                 if ( isMarked )\r
122                                                         this.unmark( value );\r
123                                                 else\r
124                                                         this.mark( value );\r
125 \r
126                                                 return !isMarked;\r
127                                         },\r
128 \r
129                                         hideGroup : function( groupTitle )\r
130                                         {\r
131                                                 var group = this.element.getDocument().getById( this._.groups[ groupTitle ] ),\r
132                                                         list = group && group.getNext();\r
133 \r
134                                                 if ( group )\r
135                                                 {\r
136                                                         group.setStyle( 'display', 'none' );\r
137 \r
138                                                         if ( list && list.getName() == 'ul' )\r
139                                                                 list.setStyle( 'display', 'none' );\r
140                                                 }\r
141                                         },\r
142 \r
143                                         hideItem : function( value )\r
144                                         {\r
145                                                 this.element.getDocument().getById( this._.items[ value ] ).setStyle( 'display', 'none' );\r
146                                         },\r
147 \r
148                                         showAll : function()\r
149                                         {\r
150                                                 var items = this._.items,\r
151                                                         groups = this._.groups,\r
152                                                         doc = this.element.getDocument();\r
153 \r
154                                                 for ( var value in items )\r
155                                                 {\r
156                                                         doc.getById( items[ value ] ).setStyle( 'display', '' );\r
157                                                 }\r
158 \r
159                                                 for ( var title in groups )\r
160                                                 {\r
161                                                         var group = doc.getById( groups[ title ] ),\r
162                                                                 list = group.getNext();\r
163 \r
164                                                         group.setStyle( 'display', '' );\r
165 \r
166                                                         if ( list && list.getName() == 'ul' )\r
167                                                                 list.setStyle( 'display', '' );\r
168                                                 }\r
169                                         },\r
170 \r
171                                         mark : function( value )\r
172                                         {\r
173                                                 if ( !this.multiSelect )\r
174                                                         this.unmarkAll();\r
175 \r
176                                                 this.element.getDocument().getById( this._.items[ value ] ).addClass( 'cke_selected' );\r
177                                         },\r
178 \r
179                                         unmark : function( value )\r
180                                         {\r
181                                                 this.element.getDocument().getById( this._.items[ value ] ).removeClass( 'cke_selected' );\r
182                                         },\r
183 \r
184                                         unmarkAll : function()\r
185                                         {\r
186                                                 var items = this._.items,\r
187                                                         doc = this.element.getDocument();\r
188 \r
189                                                 for ( var value in items )\r
190                                                 {\r
191                                                         doc.getById( items[ value ] ).removeClass( 'cke_selected' );\r
192                                                 }\r
193                                         },\r
194 \r
195                                         isMarked : function( value )\r
196                                         {\r
197                                                 return this.element.getDocument().getById( this._.items[ value ] ).hasClass( 'cke_selected' );\r
198                                         },\r
199 \r
200                                         focus : function( value )\r
201                                         {\r
202                                                 this._.focusIndex = -1;\r
203 \r
204                                                 if ( value )\r
205                                                 {\r
206                                                         var selected = this.element.getDocument().getById( this._.items[ value ] ).getFirst();\r
207 \r
208                                                         var links = this.element.getElementsByTag( 'a' ),\r
209                                                                 link,\r
210                                                                 i = -1;\r
211 \r
212                                                         while( ( link = links.getItem( ++i ) ) )\r
213                                                         {\r
214                                                                 if ( link.equals( selected ) )\r
215                                                                 {\r
216                                                                         this._.focusIndex = i;\r
217                                                                         break;\r
218                                                                 }\r
219                                                         }\r
220 \r
221                                                         setTimeout( function()\r
222                                                                 {\r
223                                                                         selected.focus();\r
224                                                                 },\r
225                                                                 0 );\r
226                                                 }\r
227                                         }\r
228                                 }\r
229                         });\r
230         }\r
231 });\r