X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Fcolordialog%2Fdialogs%2Fcolordialog.js;h=61d411be40101bdc047441e68c0315205dbe0e59;hb=48b1db88210b4160dce439c6e3e32e14af8c106b;hp=d99d033e3dfe51907dac975993c7495bfffc908f;hpb=941b0a9ba4e673e292510d80a5a86806994b8ea6;p=ckeditor.git diff --git a/_source/plugins/colordialog/dialogs/colordialog.js b/_source/plugins/colordialog/dialogs/colordialog.js index d99d033..61d411b 100644 --- a/_source/plugins/colordialog/dialogs/colordialog.js +++ b/_source/plugins/colordialog/dialogs/colordialog.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ @@ -14,41 +14,173 @@ CKEDITOR.dialog.add( 'colordialog', function( editor ) // Reference the dialog. var dialog; - function spacer() + var spacer = { - return { - type : 'html', - html : ' ' - }; + type : 'html', + html : ' ' + }; + + function clearSelected() + { + $doc.getById( selHiColorId ).removeStyle( 'background-color' ); + dialog.getContentElement( 'picker', 'selectedColor' ).setValue( '' ); } - var table = new $el( 'table' ); - createColorTable(); + function updateSelected( evt ) + { + if ( ! ( evt instanceof CKEDITOR.dom.event ) ) + evt = new CKEDITOR.dom.event( evt ); - var cellMouseover = function( event ) + var target = evt.getTarget(), + color; + + if ( target.getName() == 'a' && ( color = target.getChild( 0 ).getHtml() ) ) + dialog.getContentElement( 'picker', 'selectedColor' ).setValue( color ); + } + + function updateHighlight( event ) { - var color = new $el( event.data.getTarget() ).getAttribute( 'title' ); - $doc.getById( 'hicolor' ).setStyle( 'background-color', color ); - $doc.getById( 'hicolortext' ).setHtml( color ); - }; + if ( ! ( event instanceof CKEDITOR.dom.event ) ) + event = event.data; - var cellClick = function( event ) + var target = event.getTarget(), + color; + + if ( target.getName() == 'a' && ( color = target.getChild( 0 ).getHtml() ) ) + { + $doc.getById( hicolorId ).setStyle( 'background-color', color ); + $doc.getById( hicolorTextId ).setHtml( color ); + } + } + + function clearHighlight() { - var color = new $el( event.data.getTarget() ).getAttribute( 'title' ); - dialog.getContentElement( 'picker', 'selectedColor' ).setValue( color ); - }; + $doc.getById( hicolorId ).removeStyle( 'background-color' ); + $doc.getById( hicolorTextId ).setHtml( ' ' ); + } + + var onMouseout = $tools.addFunction( clearHighlight ), + onClick = updateSelected, + onClickHandler = CKEDITOR.tools.addFunction( onClick ), + onFocus = updateHighlight, + onBlur = clearHighlight; + + var onKeydownHandler = CKEDITOR.tools.addFunction( function( ev ) + { + ev = new CKEDITOR.dom.event( ev ); + var element = ev.getTarget(); + var relative, nodeToMove; + var keystroke = ev.getKeystroke(), + rtl = editor.lang.dir == 'rtl'; + + switch ( keystroke ) + { + // UP-ARROW + case 38 : + // relative is TR + if ( ( relative = element.getParent().getParent().getPrevious() ) ) + { + nodeToMove = relative.getChild( [element.getParent().getIndex(), 0] ); + nodeToMove.focus(); + onBlur( ev, element ); + onFocus( ev, nodeToMove ); + } + ev.preventDefault(); + break; + // DOWN-ARROW + case 40 : + // relative is TR + if ( ( relative = element.getParent().getParent().getNext() ) ) + { + nodeToMove = relative.getChild( [ element.getParent().getIndex(), 0 ] ); + if ( nodeToMove && nodeToMove.type == 1 ) + { + nodeToMove.focus(); + onBlur( ev, element ); + onFocus( ev, nodeToMove ); + } + } + ev.preventDefault(); + break; + // SPACE + // ENTER is already handled as onClick + case 32 : + onClick( ev ); + ev.preventDefault(); + break; + + // RIGHT-ARROW + case rtl ? 37 : 39 : + // relative is TD + if ( ( relative = element.getParent().getNext() ) ) + { + nodeToMove = relative.getChild( 0 ); + if ( nodeToMove.type == 1 ) + { + nodeToMove.focus(); + onBlur( ev, element ); + onFocus( ev, nodeToMove ); + ev.preventDefault( true ); + } + else + onBlur( null, element ); + } + // relative is TR + else if ( ( relative = element.getParent().getParent().getNext() ) ) + { + nodeToMove = relative.getChild( [ 0, 0 ] ); + if ( nodeToMove && nodeToMove.type == 1 ) + { + nodeToMove.focus(); + onBlur( ev, element ); + onFocus( ev, nodeToMove ); + ev.preventDefault( true ); + } + else + onBlur( null, element ); + } + break; + + // LEFT-ARROW + case rtl ? 39 : 37 : + // relative is TD + if ( ( relative = element.getParent().getPrevious() ) ) + { + nodeToMove = relative.getChild( 0 ); + nodeToMove.focus(); + onBlur( ev, element ); + onFocus( ev, nodeToMove ); + ev.preventDefault( true ); + } + // relative is TR + else if ( ( relative = element.getParent().getParent().getPrevious() ) ) + { + nodeToMove = relative.getLast().getChild( 0 ); + nodeToMove.focus(); + onBlur( ev, element ); + onFocus( ev, nodeToMove ); + ev.preventDefault( true ); + } + else + onBlur( null, element ); + break; + default : + // Do not stop not handled events. + return; + } + }); function createColorTable() { // Create the base colors array. - var aColors = ['00','33','66','99','cc','ff']; + var aColors = [ '00', '33', '66', '99', 'cc', 'ff' ]; // This function combines two ranges of three values from the color array into a row. function appendColorRow( rangeA, rangeB ) { for ( var i = rangeA ; i < rangeA + 3 ; i++ ) { - var row = table.$.insertRow(-1); + var row = table.$.insertRow( -1 ); for ( var j = rangeB ; j < rangeB + 3 ; j++ ) { @@ -70,8 +202,15 @@ CKEDITOR.dialog.add( 'colordialog', function( editor ) cell.setStyle( 'width', '15px' ); cell.setStyle( 'height', '15px' ); - // Pass unparsed color value in some markup-degradable form. - cell.setAttribute( 'title', color ); + var index = cell.$.cellIndex + 1 + 18 * targetRow.rowIndex; + cell.append( CKEDITOR.dom.element.createFromHtml( + '' + color + ' ', CKEDITOR.document ) ); } appendColorRow( 0, 0 ); @@ -95,17 +234,18 @@ CKEDITOR.dialog.add( 'colordialog', function( editor ) } } - function clear() - { - $doc.getById( 'selhicolor' ).removeStyle( 'background-color' ); - dialog.getContentElement( 'picker', 'selectedColor' ).setValue( '' ); - } + var table = new $el( 'table' ); + createColorTable(); + var html = table.getHtml(); - var clearActual = $tools.addFunction( function() - { - $doc.getById( 'hicolor' ).removeStyle( 'background-color' ); - $doc.getById( 'hicolortext' ).setHtml( ' ' ); - } ); + var numbering = function( id ) + { + return CKEDITOR.tools.getNextId() + '_' + id; + }, + hicolorId = numbering( 'hicolor' ), + hicolorTextId = numbering( 'hicolortext' ), + selHiColorId = numbering( 'selhicolor' ), + tableLabelId = numbering( 'color_table_label' ); return { title : lang.title, @@ -131,15 +271,23 @@ CKEDITOR.dialog.add( 'colordialog', function( editor ) [ { type : 'html', - html : '' + table.getHtml() + '
', + html : '' + + ( !CKEDITOR.env.webkit ? html : '' ) + + '
' + lang.options +'', onLoad : function() { var table = CKEDITOR.document.getById( this.domId ); - table.on( 'mouseover', cellMouseover ); - table.on( 'click', cellClick ); + table.on( 'mouseover', updateHighlight ); + // In WebKit, the table content must be inserted after this event call (#6150) + CKEDITOR.env.webkit && table.setHtml( html ); + }, + focus: function() + { + var firstColor = this.getElement().getElementsByTag( 'a' ).getItem( 0 ); + firstColor.focus(); } }, - spacer(), + spacer, { type : 'vbox', padding : 0, @@ -149,13 +297,14 @@ CKEDITOR.dialog.add( 'colordialog', function( editor ) { type : 'html', html : '' + lang.highlight +'\ -
\ -
 
\ - ' + lang.selected +'\ -
' +
\ +
 
' + lang.selected + '\ +
' }, { type : 'text', + label : lang.selected, + labelStyle: 'display:none', id : 'selectedColor', style : 'width: 74px', onChange : function() @@ -163,21 +312,21 @@ CKEDITOR.dialog.add( 'colordialog', function( editor ) // Try to update color preview with new value. If fails, then set it no none. try { - $doc.getById( 'selhicolor' ).setStyle( 'background-color', this.getValue() ); + $doc.getById( selHiColorId ).setStyle( 'background-color', this.getValue() ); } catch ( e ) { - clear(); + clearSelected(); } } }, - spacer(), + spacer, { type : 'button', id : 'clear', style : 'margin-top: 5px', label : lang.clear, - onClick : clear + onClick : clearSelected } ] }