JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.3
[ckeditor.git] / _source / plugins / colordialog / dialogs / colordialog.js
index e8e5d31..891947e 100644 (file)
@@ -22,21 +22,157 @@ CKEDITOR.dialog.add( 'colordialog', function( editor )
                        };\r
                }\r
 \r
-               var table = new $el( 'table' );\r
-               createColorTable();\r
+               function clearSelected()\r
+               {\r
+                       $doc.getById( selHiColorId ).removeStyle( 'background-color' );\r
+                       dialog.getContentElement( 'picker', 'selectedColor' ).setValue( '' );\r
+               }\r
 \r
-               var cellMouseover = function( event )\r
+               function updateSelected( evt )\r
                {\r
-                       var color = new $el( event.data.getTarget() ).getAttribute( 'title' );\r
-                       $doc.getById( hicolorId ).setStyle( 'background-color', color );\r
-                       $doc.getById( hicolorTextId ).setHtml( color );\r
-               };\r
+                       if ( ! (evt instanceof CKEDITOR.dom.event ) )\r
+                               evt = new CKEDITOR.dom.event( evt );\r
+\r
+                       var target = evt.getTarget(),\r
+                                       color;\r
 \r
-               var cellClick = function( event )\r
+                       if ( target.getName() == 'a' && ( color = target.getChild( 0 ).getHtml() ) )\r
+                               dialog.getContentElement( 'picker', 'selectedColor' ).setValue( color );\r
+               }\r
+\r
+               function updateHighlight( event )\r
                {\r
-                       var color = new $el( event.data.getTarget() ).getAttribute( 'title' );\r
-                       dialog.getContentElement( 'picker', 'selectedColor' ).setValue( color );\r
-               };\r
+                       if ( ! (event instanceof CKEDITOR.dom.event ) )\r
+                               event = event.data;\r
+\r
+                       var target = event.getTarget(),\r
+                                       color;\r
+\r
+                       if ( target.getName() == 'a' && ( color = target.getChild( 0 ).getHtml() ) )\r
+                       {\r
+                               $doc.getById( hicolorId ).setStyle( 'background-color', color );\r
+                               $doc.getById( hicolorTextId ).setHtml( color );\r
+                       }\r
+               }\r
+\r
+               function clearHighlight()\r
+               {\r
+                       $doc.getById( hicolorId ).removeStyle( 'background-color' );\r
+                       $doc.getById( hicolorTextId ).setHtml( ' ' );\r
+               }\r
+\r
+               var onMouseout = $tools.addFunction( clearHighlight );\r
+\r
+               var onClick = updateSelected,\r
+                               onClickHandler = CKEDITOR.tools.addFunction( onClick );\r
+\r
+               var onFocus = updateHighlight,\r
+                               onBlur = clearHighlight;\r
+\r
+               var onKeydownHandler = CKEDITOR.tools.addFunction( function( ev )\r
+               {\r
+                       ev = new CKEDITOR.dom.event( ev );\r
+                       var element = ev.getTarget();\r
+                       var relative, nodeToMove;\r
+                       var keystroke = ev.getKeystroke();\r
+                       var rtl = editor.lang.dir == 'rtl';\r
+\r
+                       switch ( keystroke )\r
+                       {\r
+                               // UP-ARROW\r
+                               case 38 :\r
+                                       // relative is TR\r
+                                       if ( ( relative = element.getParent().getParent().getPrevious() ) )\r
+                                       {\r
+                                               nodeToMove = relative.getChild( [element.getParent().getIndex(), 0] );\r
+                                               nodeToMove.focus();\r
+                                               onBlur( ev, element );\r
+                                               onFocus( ev, nodeToMove );\r
+                                       }\r
+                                       ev.preventDefault();\r
+                                       break;\r
+                               // DOWN-ARROW\r
+                               case 40 :\r
+                                       // relative is TR\r
+                                       if ( ( relative = element.getParent().getParent().getNext() ) )\r
+                                       {\r
+                                               nodeToMove = relative.getChild( [ element.getParent().getIndex(), 0 ] );\r
+                                               if ( nodeToMove && nodeToMove.type == 1 )\r
+                                               {\r
+                                                       nodeToMove.focus();\r
+                                                       onBlur( ev, element );\r
+                                                       onFocus( ev, nodeToMove );\r
+                                               }\r
+                                       }\r
+                                       ev.preventDefault();\r
+                                       break;\r
+                               // SPACE\r
+                               // ENTER is already handled as onClick\r
+                               case 32 :\r
+                                       onClick( ev );\r
+                                       ev.preventDefault();\r
+                                       break;\r
+\r
+                               // RIGHT-ARROW\r
+                               case rtl ? 37 : 39 :\r
+                                       // relative is TD\r
+                                       if ( ( relative = element.getParent().getNext() ) )\r
+                                       {\r
+                                               nodeToMove = relative.getChild( 0 );\r
+                                               if ( nodeToMove.type == 1 )\r
+                                               {\r
+                                                       nodeToMove.focus();\r
+                                                       onBlur( ev, element );\r
+                                                       onFocus( ev, nodeToMove );\r
+                                                       ev.preventDefault( true );\r
+                                               }\r
+                                               else\r
+                                                       onBlur( null, element );\r
+                                       }\r
+                                       // relative is TR\r
+                                       else if ( ( relative = element.getParent().getParent().getNext() ) )\r
+                                       {\r
+                                               nodeToMove = relative.getChild( [ 0, 0 ] );\r
+                                               if ( nodeToMove && nodeToMove.type == 1 )\r
+                                               {\r
+                                                       nodeToMove.focus();\r
+                                                       onBlur( ev, element );\r
+                                                       onFocus( ev, nodeToMove );\r
+                                                       ev.preventDefault( true );\r
+                                               }\r
+                                               else\r
+                                                       onBlur( null, element );\r
+                                       }\r
+                                       break;\r
+\r
+                               // LEFT-ARROW\r
+                               case rtl ? 39 : 37 :\r
+                                       // relative is TD\r
+                                       if ( ( relative = element.getParent().getPrevious() ) )\r
+                                       {\r
+                                               nodeToMove = relative.getChild( 0 );\r
+                                               nodeToMove.focus();\r
+                                               onBlur( ev, element );\r
+                                               onFocus( ev, nodeToMove );\r
+                                               ev.preventDefault( true );\r
+                                       }\r
+                                       // relative is TR\r
+                                       else if ( ( relative = element.getParent().getParent().getPrevious() ) )\r
+                                       {\r
+                                               nodeToMove = relative.getLast().getChild( 0 );\r
+                                               nodeToMove.focus();\r
+                                               onBlur( ev, element );\r
+                                               onFocus( ev, nodeToMove );\r
+                                               ev.preventDefault( true );\r
+                                       }\r
+                                       else\r
+                                               onBlur( null, element );\r
+                                       break;\r
+                               default :\r
+                                       // Do not stop not handled events.\r
+                                       return;\r
+                       }\r
+               });\r
 \r
                function createColorTable()\r
                {\r
@@ -70,8 +206,15 @@ CKEDITOR.dialog.add( 'colordialog', function( editor )
                                cell.setStyle( 'width', '15px' );\r
                                cell.setStyle( 'height', '15px' );\r
 \r
-                               // Pass unparsed color value in some markup-degradable form.\r
-                               cell.setAttribute( 'title', color );\r
+                               var index = cell.$.cellIndex + 1 + 18 * targetRow.rowIndex;\r
+                               cell.append( CKEDITOR.dom.element.createFromHtml(\r
+                                               '<a href="javascript: void(0);" role="option"' +\r
+                                               ' aria-posinset="' + index + '"' +\r
+                                               ' aria-setsize="' + 13 * 18 + '"' +\r
+                                               ' style="cursor: pointer;display:block;width:100%;height:100% " title="'+ CKEDITOR.tools.htmlEncode( color )+ '"' +\r
+                                               ' onkeydown="CKEDITOR.tools.callFunction( ' + onKeydownHandler + ', event, this )"' +\r
+                                               ' onclick="CKEDITOR.tools.callFunction(' + onClickHandler + ', event, this ); return false;"' +\r
+                                               ' tabindex="-1"><span class="cke_voice_label">' + color + '</span></a>', CKEDITOR.document ) );\r
                        }\r
 \r
                        appendColorRow( 0, 0 );\r
@@ -95,19 +238,13 @@ CKEDITOR.dialog.add( 'colordialog', function( editor )
                        }\r
                }\r
 \r
-               function clear()\r
-               {\r
-                       $doc.getById( selHiColorId ).removeStyle( 'background-color' );\r
-                       dialog.getContentElement( 'picker', 'selectedColor' ).setValue( '' );\r
-               }\r
-\r
-               var clearActual = $tools.addFunction( function()\r
-               {\r
-                       $doc.getById( hicolorId ).removeStyle( 'background-color' );\r
-                       $doc.getById( hicolorTextId ).setHtml( '&nbsp;' );\r
-               } );\r
+               var table = new $el( 'table' );\r
+               createColorTable();\r
 \r
-               var numbering = function( id ){ return id + CKEDITOR.tools.getNextNumber(); },\r
+               var numbering = function( id )\r
+                       {\r
+                               return id + CKEDITOR.tools.getNextNumber();\r
+                       },\r
                        hicolorId = numbering( 'hicolor' ),\r
                        hicolorTextId = numbering( 'hicolortext' ),\r
                        selHiColorId = numbering( 'selhicolor' );\r
@@ -136,12 +273,17 @@ CKEDITOR.dialog.add( 'colordialog', function( editor )
                                                        [\r
                                                                {\r
                                                                        type : 'html',\r
-                                                                       html : '<table onmouseout="CKEDITOR.tools.callFunction( ' + clearActual + ' );">' + table.getHtml() + '</table>',\r
+                                                                       html : '<table role="listbox" aria-labelledby="color_table_label" onmouseout="CKEDITOR.tools.callFunction( ' + onMouseout + ' );">' + table.getHtml() + '</table>' +\r
+                                                                                               '<span id="color_table_label" class="cke_voice_label">' + lang.options +'</span>',\r
                                                                        onLoad : function()\r
                                                                        {\r
                                                                                var table = CKEDITOR.document.getById( this.domId );\r
-                                                                               table.on( 'mouseover', cellMouseover );\r
-                                                                               table.on( 'click', cellClick );\r
+                                                                               table.on( 'mouseover', updateHighlight );\r
+                                                                       },\r
+                                                                       focus: function()\r
+                                                                       {\r
+                                                                               var firstColor = this.getElement().getElementsByTag( 'a' ).getItem( 0 );\r
+                                                                               firstColor.focus();\r
                                                                        }\r
                                                                },\r
                                                                spacer(),\r
@@ -155,12 +297,13 @@ CKEDITOR.dialog.add( 'colordialog', function( editor )
                                                                                        type : 'html',\r
                                                                                        html : '<span>' + lang.highlight +'</span>\\r
                                                                                                <div id="' + hicolorId + '" style="border: 1px solid; height: 74px; width: 74px;"></div>\\r
-                                                                                               <div id="' + hicolorTextId + '">&nbsp;</div>\\r
-                                                                                               <span>' + lang.selected +'</span>\\r
+                                                                                               <div id="' + hicolorTextId + '">&nbsp;</div><span>' + lang.selected + '</span>\\r
                                                                                                <div id="' + selHiColorId + '" style="border: 1px solid; height: 20px; width: 74px;"></div>'\r
                                                                                },\r
                                                                                {\r
                                                                                        type : 'text',\r
+                                                                                       label : lang.selected,\r
+                                                                                       labelStyle: 'display:none',\r
                                                                                        id : 'selectedColor',\r
                                                                                        style : 'width: 74px',\r
                                                                                        onChange : function()\r
@@ -172,7 +315,7 @@ CKEDITOR.dialog.add( 'colordialog', function( editor )
                                                                                                }\r
                                                                                                catch ( e )\r
                                                                                                {\r
-                                                                                                       clear();\r
+                                                                                                       clearSelected();\r
                                                                                                }\r
                                                                                        }\r
                                                                                },\r
@@ -182,7 +325,7 @@ CKEDITOR.dialog.add( 'colordialog', function( editor )
                                                                                        id : 'clear',\r
                                                                                        style : 'margin-top: 5px',\r
                                                                                        label : lang.clear,\r
-                                                                                       onClick : clear\r
+                                                                                       onClick : clearSelected\r
                                                                                }\r
                                                                        ]\r
                                                                }\r