2 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license
\r
10 exec : function( editor )
\r
12 editor.container.focusNext( true );
\r
16 var blurBackCommand =
\r
18 exec : function( editor )
\r
20 editor.container.focusPrevious( true );
\r
24 CKEDITOR.plugins.add( 'tab',
\r
26 requires : [ 'keystrokes' ],
\r
28 init : function( editor )
\r
30 // Register the keystrokes.
\r
31 var keystrokes = editor.keystrokeHandler.keystrokes;
\r
32 keystrokes[ 9 /* TAB */ ] = 'tab';
\r
33 keystrokes[ CKEDITOR.SHIFT + 9 /* TAB */ ] = 'shiftTab';
\r
35 var tabSpaces = editor.config.tabSpaces,
\r
38 while ( tabSpaces-- )
\r
41 // Register the "tab" and "shiftTab" commands.
\r
42 editor.addCommand( 'tab',
\r
44 exec : function( editor )
\r
46 // Fire the "tab" event, making it possible to
\r
47 // customize the TAB key behavior on specific cases.
\r
48 if ( !editor.fire( 'tab' ) )
\r
50 if ( tabText.length > 0 )
\r
51 editor.insertHtml( tabText );
\r
54 // All browsers jump to the next field on TAB,
\r
55 // except Safari, so we have to do that manually
\r
57 /// https://bugs.webkit.org/show_bug.cgi?id=20597
\r
58 return editor.execCommand( 'blur' );
\r
66 editor.addCommand( 'shiftTab',
\r
68 exec : function( editor )
\r
70 // Fire the "tab" event, making it possible to
\r
71 // customize the TAB key behavior on specific cases.
\r
72 if ( !editor.fire( 'shiftTab' ) )
\r
73 return editor.execCommand( 'blurBack' );
\r
79 editor.addCommand( 'blur', blurCommand );
\r
80 editor.addCommand( 'blurBack', blurBackCommand );
\r
86 * Moves the UI focus to the element following this element in the tabindex
\r
89 * var element = CKEDITOR.document.getById( 'example' );
\r
90 * element.focusNext();
\r
92 CKEDITOR.dom.element.prototype.focusNext = function( ignoreChildren )
\r
95 curTabIndex = this.getTabIndex(),
\r
96 passedCurrent, enteredCurrent,
\r
97 elected, electedTabIndex,
\r
98 element, elementTabIndex;
\r
100 if ( curTabIndex <= 0 )
\r
102 // If this element has tabindex <= 0 then we must simply look for any
\r
103 // element following it containing tabindex=0.
\r
105 element = this.getNextSourceNode( ignoreChildren, CKEDITOR.NODE_ELEMENT );
\r
109 if ( element.isVisible() && element.getTabIndex() === 0 )
\r
115 element = element.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT );
\r
120 // If this element has tabindex > 0 then we must look for:
\r
121 // 1. An element following this element with the same tabindex.
\r
122 // 2. The first element in source other with the lowest tabindex
\r
123 // that is higher than this element tabindex.
\r
124 // 3. The first element with tabindex=0.
\r
126 element = this.getDocument().getBody().getFirst();
\r
128 while( ( element = element.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT ) ) )
\r
130 if ( !passedCurrent )
\r
132 if ( !enteredCurrent && element.equals( this ) )
\r
134 enteredCurrent = true;
\r
136 // Ignore this element, if required.
\r
137 if ( ignoreChildren )
\r
139 if ( !( element = element.getNextSourceNode( true, CKEDITOR.NODE_ELEMENT ) ) )
\r
144 else if ( enteredCurrent && !this.contains( element ) )
\r
148 if ( !element.isVisible() || ( elementTabIndex = element.getTabIndex() ) < 0 )
\r
151 if ( passedCurrent && elementTabIndex == curTabIndex )
\r
157 if ( elementTabIndex > curTabIndex && ( !elected || !electedTabIndex || elementTabIndex < electedTabIndex ) )
\r
160 electedTabIndex = elementTabIndex;
\r
162 else if ( !elected && elementTabIndex === 0 )
\r
165 electedTabIndex = elementTabIndex;
\r
175 * Moves the UI focus to the element before this element in the tabindex order.
\r
177 * var element = CKEDITOR.document.getById( 'example' );
\r
178 * element.focusPrevious();
\r
180 CKEDITOR.dom.element.prototype.focusPrevious = function( ignoreChildren )
\r
183 curTabIndex = this.getTabIndex(),
\r
184 passedCurrent, enteredCurrent,
\r
186 electedTabIndex = 0,
\r
189 var element = this.getDocument().getBody().getLast();
\r
191 while( ( element = element.getPreviousSourceNode( false, CKEDITOR.NODE_ELEMENT ) ) )
\r
193 if ( !passedCurrent )
\r
195 if ( !enteredCurrent && element.equals( this ) )
\r
197 enteredCurrent = true;
\r
199 // Ignore this element, if required.
\r
200 if ( ignoreChildren )
\r
202 if ( !( element = element.getPreviousSourceNode( true, CKEDITOR.NODE_ELEMENT ) ) )
\r
207 else if ( enteredCurrent && !this.contains( element ) )
\r
211 if ( !element.isVisible() || ( elementTabIndex = element.getTabIndex() ) < 0 )
\r
214 if ( curTabIndex <= 0 )
\r
216 // If this element has tabindex <= 0 then we must look for:
\r
217 // 1. An element before this one containing tabindex=0.
\r
218 // 2. The last element with the highest tabindex.
\r
220 if ( passedCurrent && elementTabIndex === 0 )
\r
226 if ( elementTabIndex > electedTabIndex )
\r
229 electedTabIndex = elementTabIndex;
\r
234 // If this element has tabindex > 0 we must look for:
\r
235 // 1. An element preceeding this one, with the same tabindex.
\r
236 // 2. The last element in source other with the highest tabindex
\r
237 // that is lower than this element tabindex.
\r
239 if ( passedCurrent && elementTabIndex == curTabIndex )
\r
245 if ( elementTabIndex < curTabIndex && ( !elected || elementTabIndex > electedTabIndex ) )
\r
248 electedTabIndex = elementTabIndex;
\r
258 * Intructs the editor to add a number of spaces (&nbsp;) to the text when
\r
259 * hitting the TAB key. If set to zero, the TAB key will be used to move the
\r
260 * cursor focus to the next element in the page, out of the editor focus.
\r
264 * config.tabSpaces = 4;
\r
266 CKEDITOR.config.tabSpaces = 0 ;
\r