JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.0
[ckeditor.git] / _source / plugins / listblock / plugin.js
diff --git a/_source/plugins/listblock/plugin.js b/_source/plugins/listblock/plugin.js
new file mode 100644 (file)
index 0000000..946a54f
--- /dev/null
@@ -0,0 +1,231 @@
+/*\r
+Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r
+For licensing, see LICENSE.html or http://ckeditor.com/license\r
+*/\r
+\r
+CKEDITOR.plugins.add( 'listblock',\r
+{\r
+       requires : [ 'panel' ],\r
+\r
+       onLoad : function()\r
+       {\r
+               CKEDITOR.ui.panel.prototype.addListBlock = function( name, multiSelect )\r
+               {\r
+                       return this.addBlock( name, new CKEDITOR.ui.listBlock( this.getHolderElement(), multiSelect ) );\r
+               };\r
+\r
+               CKEDITOR.ui.listBlock = CKEDITOR.tools.createClass(\r
+                       {\r
+                               base : CKEDITOR.ui.panel.block,\r
+\r
+                               $ : function( blockHolder, multiSelect )\r
+                               {\r
+                                       // Call the base contructor.\r
+                                       this.base( blockHolder );\r
+\r
+                                       this.multiSelect = !!multiSelect;\r
+\r
+                                       var keys = this.keys;\r
+                                       keys[ 40 ]      = 'next';                                       // ARROW-DOWN\r
+                                       keys[ 9 ]       = 'next';                                       // TAB\r
+                                       keys[ 38 ]      = 'prev';                                       // ARROW-UP\r
+                                       keys[ CKEDITOR.SHIFT + 9 ]      = 'prev';       // SHIFT + TAB\r
+                                       keys[ 32 ]      = 'click';                                      // SPACE\r
+\r
+                                       this._.pendingHtml = [];\r
+                                       this._.items = {};\r
+                                       this._.groups = {};\r
+                               },\r
+\r
+                               _ :\r
+                               {\r
+                                       close : function()\r
+                                       {\r
+                                               if ( this._.started )\r
+                                               {\r
+                                                       this._.pendingHtml.push( '</ul>' );\r
+                                                       delete this._.started;\r
+                                               }\r
+                                       },\r
+\r
+                                       getClick : function()\r
+                                       {\r
+                                               if ( !this._.click )\r
+                                               {\r
+                                                       this._.click = CKEDITOR.tools.addFunction( function( value )\r
+                                                               {\r
+                                                                       var marked = true;\r
+\r
+                                                                       if ( this.multiSelect )\r
+                                                                               marked = this.toggle( value );\r
+                                                                       else\r
+                                                                               this.mark( value );\r
+\r
+                                                                       if ( this.onClick )\r
+                                                                               this.onClick( value, marked );\r
+                                                               },\r
+                                                               this );\r
+                                               }\r
+                                               return this._.click;\r
+                                       }\r
+                               },\r
+\r
+                               proto :\r
+                               {\r
+                                       add : function( value, html, title )\r
+                                       {\r
+                                               var pendingHtml = this._.pendingHtml,\r
+                                                       id = 'cke_' + CKEDITOR.tools.getNextNumber();\r
+\r
+                                               if ( !this._.started )\r
+                                               {\r
+                                                       pendingHtml.push( '<ul class=cke_panel_list>' );\r
+                                                       this._.started = 1;\r
+                                               }\r
+\r
+                                               this._.items[ value ] = id;\r
+\r
+                                               pendingHtml.push(\r
+                                                       '<li id=', id, ' class=cke_panel_listItem>' +\r
+                                                               '<a _cke_focus=1 hidefocus=true' +\r
+                                                                       ' title="', title || value, '"' +\r
+                                                                       ' href="javascript:void(\'', value, '\')"' +\r
+                                                                       ' onclick="CKEDITOR.tools.callFunction(', this._.getClick(), ',\'', value, '\'); return false;">',\r
+                                                                       html || value,\r
+                                                               '</a>' +\r
+                                                       '</li>' );\r
+                                       },\r
+\r
+                                       startGroup : function( title )\r
+                                       {\r
+                                               this._.close();\r
+\r
+                                               var id = 'cke_' + CKEDITOR.tools.getNextNumber();\r
+\r
+                                               this._.groups[ title ] = id;\r
+\r
+                                               this._.pendingHtml.push( '<h1 id=', id, ' class=cke_panel_grouptitle>', title, '</h1>' );\r
+                                       },\r
+\r
+                                       commit : function()\r
+                                       {\r
+                                               this._.close();\r
+                                               this.element.appendHtml( this._.pendingHtml.join( '' ) );\r
+                                               this._.pendingHtml = [];\r
+                                       },\r
+\r
+                                       toggle : function( value )\r
+                                       {\r
+                                               var isMarked = this.isMarked( value );\r
+\r
+                                               if ( isMarked )\r
+                                                       this.unmark( value );\r
+                                               else\r
+                                                       this.mark( value );\r
+\r
+                                               return !isMarked;\r
+                                       },\r
+\r
+                                       hideGroup : function( groupTitle )\r
+                                       {\r
+                                               var group = this.element.getDocument().getById( this._.groups[ groupTitle ] ),\r
+                                                       list = group && group.getNext();\r
+\r
+                                               if ( group )\r
+                                               {\r
+                                                       group.setStyle( 'display', 'none' );\r
+\r
+                                                       if ( list && list.getName() == 'ul' )\r
+                                                               list.setStyle( 'display', 'none' );\r
+                                               }\r
+                                       },\r
+\r
+                                       hideItem : function( value )\r
+                                       {\r
+                                               this.element.getDocument().getById( this._.items[ value ] ).setStyle( 'display', 'none' );\r
+                                       },\r
+\r
+                                       showAll : function()\r
+                                       {\r
+                                               var items = this._.items,\r
+                                                       groups = this._.groups,\r
+                                                       doc = this.element.getDocument();\r
+\r
+                                               for ( var value in items )\r
+                                               {\r
+                                                       doc.getById( items[ value ] ).setStyle( 'display', '' );\r
+                                               }\r
+\r
+                                               for ( var title in groups )\r
+                                               {\r
+                                                       var group = doc.getById( groups[ title ] ),\r
+                                                               list = group.getNext();\r
+\r
+                                                       group.setStyle( 'display', '' );\r
+\r
+                                                       if ( list && list.getName() == 'ul' )\r
+                                                               list.setStyle( 'display', '' );\r
+                                               }\r
+                                       },\r
+\r
+                                       mark : function( value )\r
+                                       {\r
+                                               if ( !this.multiSelect )\r
+                                                       this.unmarkAll();\r
+\r
+                                               this.element.getDocument().getById( this._.items[ value ] ).addClass( 'cke_selected' );\r
+                                       },\r
+\r
+                                       unmark : function( value )\r
+                                       {\r
+                                               this.element.getDocument().getById( this._.items[ value ] ).removeClass( 'cke_selected' );\r
+                                       },\r
+\r
+                                       unmarkAll : function()\r
+                                       {\r
+                                               var items = this._.items,\r
+                                                       doc = this.element.getDocument();\r
+\r
+                                               for ( var value in items )\r
+                                               {\r
+                                                       doc.getById( items[ value ] ).removeClass( 'cke_selected' );\r
+                                               }\r
+                                       },\r
+\r
+                                       isMarked : function( value )\r
+                                       {\r
+                                               return this.element.getDocument().getById( this._.items[ value ] ).hasClass( 'cke_selected' );\r
+                                       },\r
+\r
+                                       focus : function( value )\r
+                                       {\r
+                                               this._.focusIndex = -1;\r
+\r
+                                               if ( value )\r
+                                               {\r
+                                                       var selected = this.element.getDocument().getById( this._.items[ value ] ).getFirst();\r
+\r
+                                                       var links = this.element.getElementsByTag( 'a' ),\r
+                                                               link,\r
+                                                               i = -1;\r
+\r
+                                                       while( ( link = links.getItem( ++i ) ) )\r
+                                                       {\r
+                                                               if ( link.equals( selected ) )\r
+                                                               {\r
+                                                                       this._.focusIndex = i;\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       setTimeout( function()\r
+                                                               {\r
+                                                                       selected.focus();\r
+                                                               },\r
+                                                               0 );\r
+                                               }\r
+                                       }\r
+                               }\r
+                       });\r
+       }\r
+});\r