X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Felementspath%2Fplugin.js;h=7b81d61c53eef0adaf5a6c41f0a93be662a537d6;hb=3fe9cac293e090ea459a3ee10d78cbe9e1dd0e03;hp=58cacc3397a1915e70ec789b1b0a6208eb94e10f;hpb=614511639979907ceb0da3614122a4d8eb963ad4;p=ckeditor.git diff --git a/_source/plugins/elementspath/plugin.js b/_source/plugins/elementspath/plugin.js index 58cacc3..7b81d61 100644 --- a/_source/plugins/elementspath/plugin.js +++ b/_source/plugins/elementspath/plugin.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ @@ -14,13 +14,16 @@ For licensing, see LICENSE.html or http://ckeditor.com/license { toolbarFocus : { + editorFocus : false, + readOnly : 1, exec : function( editor ) { var idBase = editor._.elementsPath.idBase; var element = CKEDITOR.document.getById( idBase + '0' ); - if ( element ) - element.focus(); + // Make the first button focus accessible for IE. (#3417) + // Adobe AIR instead need while of delay. + element && element.focus( CKEDITOR.env.ie || CKEDITOR.env.air ); } } }; @@ -56,6 +59,60 @@ For licensing, see LICENSE.html or http://ckeditor.com/license } }); + function onClick( elementIndex ) + { + editor.focus(); + var element = editor._.elementsPath.list[ elementIndex ]; + if ( element.is( 'body' ) ) + { + var range = new CKEDITOR.dom.range( editor.document ); + range.selectNodeContents( element ); + range.select(); + } + else + editor.getSelection().selectElement( element ); + } + + var onClickHanlder = CKEDITOR.tools.addFunction( onClick ); + + var onKeyDownHandler = CKEDITOR.tools.addFunction( function( elementIndex, ev ) + { + var idBase = editor._.elementsPath.idBase, + element; + + ev = new CKEDITOR.dom.event( ev ); + + var rtl = editor.lang.dir == 'rtl'; + switch ( ev.getKeystroke() ) + { + case rtl ? 39 : 37 : // LEFT-ARROW + case 9 : // TAB + element = CKEDITOR.document.getById( idBase + ( elementIndex + 1 ) ); + if ( !element ) + element = CKEDITOR.document.getById( idBase + '0' ); + element.focus(); + return false; + + case rtl ? 37 : 39 : // RIGHT-ARROW + case CKEDITOR.SHIFT + 9 : // SHIFT + TAB + element = CKEDITOR.document.getById( idBase + ( elementIndex - 1 ) ); + if ( !element ) + element = CKEDITOR.document.getById( idBase + ( editor._.elementsPath.list.length - 1 ) ); + element.focus(); + return false; + + case 27 : // ESC + editor.focus(); + return false; + + case 13 : // ENTER // Opera + case 32 : // SPACE + onClick( elementIndex ); + return false; + } + return true; + }); + editor.on( 'selectionChange', function( ev ) { var env = CKEDITOR.env, @@ -68,24 +125,30 @@ For licensing, see LICENSE.html or http://ckeditor.com/license while ( element ) { - var ignore = 0; + var ignore = 0, + name; + + if ( element.data( 'cke-display-name' ) ) + name = element.data( 'cke-display-name' ); + else if ( element.data( 'cke-real-element-type' ) ) + name = element.data( 'cke-real-element-type' ); + else + name = element.getName(); + for ( var i = 0; i < filters.length; i++ ) { - if ( filters[ i ]( element ) === false ) + var ret = filters[ i ]( element, name ); + if ( ret === false ) { ignore = 1; break; } + name = ret || name; } if ( !ignore ) { var index = elementsList.push( element ) - 1; - var name; - if ( element.getAttribute( '_cke_real_element_type' ) ) - name = element.getAttribute( '_cke_real_element_type' ); - else - name = element.getName(); // Use this variable to add conditional stuff to the // HTML (because we are doing it in reverse order... unshift). @@ -112,9 +175,9 @@ For licensing, see LICENSE.html or http://ckeditor.com/license ( ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 ) ? ' onfocus="event.preventBubble();"' : '' ) + ' hidefocus="true" ' + - ' onkeydown="return CKEDITOR._.elementsPath.keydown(\'', editor.name, '\',', index, ', event);"' + + ' onkeydown="return CKEDITOR.tools.callFunction(', onKeyDownHandler, ',', index, ', event );"' + extra , - ' onclick="return CKEDITOR._.elementsPath.click(\'', editor.name, '\',', index, ');"', + ' onclick="CKEDITOR.tools.callFunction('+ onClickHanlder, ',', index, '); return false;"', ' role="button" aria-labelledby="' + idBase + index + '_label">', name, '' + label + '', @@ -128,15 +191,19 @@ For licensing, see LICENSE.html or http://ckeditor.com/license element = element.getParent(); } - getSpaceElement().setHtml( html.join('') + emptyHtml ); + var space = getSpaceElement(); + space.setHtml( html.join('') + emptyHtml ); + editor.fire( 'elementsPathUpdate', { space : space } ); }); - editor.on( 'contentDomUnload', function() - { - // If the spaceElement hasn't been initialized, don't try to do it at this time - // Only reuse existing reference. - spaceElement && spaceElement.setHtml( emptyHtml ); - }); + function empty() + { + spaceElement && spaceElement.setHtml( emptyHtml ); + delete editor._.elementsPath.list; + } + + editor.on( 'readOnly', empty ); + editor.on( 'contentDomUnload', empty ); editor.addCommand( 'elementsPathFocus', commands.toolbarFocus ); } @@ -144,71 +211,8 @@ For licensing, see LICENSE.html or http://ckeditor.com/license })(); /** - * Handles the click on an element in the element path. - * @private + * Fired when the contents of the elementsPath are changed + * @name CKEDITOR.editor#elementsPathUpdate + * @event + * @param {Object} eventData.space The elementsPath container */ -CKEDITOR._.elementsPath = -{ - click : function( instanceName, elementIndex ) - { - var editor = CKEDITOR.instances[ instanceName ]; - editor.focus(); - - var element = editor._.elementsPath.list[ elementIndex ]; - - if ( element.is( 'body' ) ) - { - var range = new CKEDITOR.dom.range( editor.document ); - range.selectNodeContents( element ); - range.select(); - } - else - editor.getSelection().selectElement( element ); - - return false; - }, - - keydown : function( instanceName, elementIndex, ev ) - { - var instance = CKEDITOR.ui.button._.instances[ elementIndex ]; - var editor = CKEDITOR.instances[ instanceName ]; - var idBase = editor._.elementsPath.idBase; - - var element; - - ev = new CKEDITOR.dom.event( ev ); - - var rtl = editor.lang.dir == 'rtl'; - switch ( ev.getKeystroke() ) - { - case rtl ? 39 : 37 : // LEFT-ARROW - case 9 : // TAB - element = CKEDITOR.document.getById( idBase + ( elementIndex + 1 ) ); - if ( !element ) - element = CKEDITOR.document.getById( idBase + '0' ); - element.focus(); - return false; - - case rtl ? 37 : 39 : // RIGHT-ARROW - case CKEDITOR.SHIFT + 9 : // SHIFT + TAB - element = CKEDITOR.document.getById( idBase + ( elementIndex - 1 ) ); - if ( !element ) - element = CKEDITOR.document.getById( idBase + ( editor._.elementsPath.list.length - 1 ) ); - element.focus(); - return false; - - case 27 : // ESC - editor.focus(); - return false; - - case 13 : // ENTER // Opera - case 32 : // SPACE - this.click( instanceName, elementIndex ); - return false; - - //default : - // alert( ev.getKeystroke() ); - } - return true; - } -};