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 editorFocus : false,
\r
11 modes : { wysiwyg:1, source:1 }
\r
16 exec : function( editor )
\r
18 editor.container.focusNext( true );
\r
22 var blurBackCommand =
\r
24 exec : function( editor )
\r
26 editor.container.focusPrevious( true );
\r
30 CKEDITOR.plugins.add( 'tab',
\r
32 requires : [ 'keystrokes' ],
\r
34 init : function( editor )
\r
36 // Register the keystrokes.
\r
37 var keystrokes = editor.keystrokeHandler.keystrokes;
\r
38 keystrokes[ 9 /* TAB */ ] = 'tab';
\r
39 keystrokes[ CKEDITOR.SHIFT + 9 /* TAB */ ] = 'shiftTab';
\r
41 var tabSpaces = editor.config.tabSpaces,
\r
44 while ( tabSpaces-- )
\r
47 // Register the "tab" and "shiftTab" commands.
\r
48 editor.addCommand( 'tab', CKEDITOR.tools.extend(
\r
50 exec : function( editor )
\r
52 // Fire the "tab" event, making it possible to
\r
53 // customize the TAB key behavior on specific cases.
\r
54 if ( !editor.fire( 'tab' ) )
\r
56 if ( tabText.length > 0 )
\r
57 editor.insertHtml( tabText );
\r
60 // All browsers jump to the next field on TAB,
\r
61 // except Safari, so we have to do that manually
\r
63 /// https://bugs.webkit.org/show_bug.cgi?id=20597
\r
64 return editor.execCommand( 'blur' );
\r
72 editor.addCommand( 'shiftTab', CKEDITOR.tools.extend(
\r
74 exec : function( editor )
\r
76 // Fire the "tab" event, making it possible to
\r
77 // customize the TAB key behavior on specific cases.
\r
78 if ( !editor.fire( 'shiftTab' ) )
\r
79 return editor.execCommand( 'blurBack' );
\r
85 editor.addCommand( 'blur', CKEDITOR.tools.extend( blurCommand, meta ) );
\r
86 editor.addCommand( 'blurBack', CKEDITOR.tools.extend( blurBackCommand, meta ) );
\r
92 * Moves the UI focus to the element following this element in the tabindex
\r
95 * var element = CKEDITOR.document.getById( 'example' );
\r
96 * element.focusNext();
\r
98 CKEDITOR.dom.element.prototype.focusNext = function( ignoreChildren )
\r
101 curTabIndex = this.getTabIndex(),
\r
102 passedCurrent, enteredCurrent,
\r
103 elected, electedTabIndex,
\r
104 element, elementTabIndex;
\r
106 if ( curTabIndex <= 0 )
\r
108 // If this element has tabindex <= 0 then we must simply look for any
\r
109 // element following it containing tabindex=0.
\r
111 element = this.getNextSourceNode( ignoreChildren, CKEDITOR.NODE_ELEMENT );
\r
115 if ( element.isVisible() && element.getTabIndex() === 0 )
\r
121 element = element.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT );
\r
126 // If this element has tabindex > 0 then we must look for:
\r
127 // 1. An element following this element with the same tabindex.
\r
128 // 2. The first element in source other with the lowest tabindex
\r
129 // that is higher than this element tabindex.
\r
130 // 3. The first element with tabindex=0.
\r
132 element = this.getDocument().getBody().getFirst();
\r
134 while ( ( element = element.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT ) ) )
\r
136 if ( !passedCurrent )
\r
138 if ( !enteredCurrent && element.equals( this ) )
\r
140 enteredCurrent = true;
\r
142 // Ignore this element, if required.
\r
143 if ( ignoreChildren )
\r
145 if ( !( element = element.getNextSourceNode( true, CKEDITOR.NODE_ELEMENT ) ) )
\r
150 else if ( enteredCurrent && !this.contains( element ) )
\r
154 if ( !element.isVisible() || ( elementTabIndex = element.getTabIndex() ) < 0 )
\r
157 if ( passedCurrent && elementTabIndex == curTabIndex )
\r
163 if ( elementTabIndex > curTabIndex && ( !elected || !electedTabIndex || elementTabIndex < electedTabIndex ) )
\r
166 electedTabIndex = elementTabIndex;
\r
168 else if ( !elected && elementTabIndex === 0 )
\r
171 electedTabIndex = elementTabIndex;
\r
181 * Moves the UI focus to the element before this element in the tabindex order.
\r
183 * var element = CKEDITOR.document.getById( 'example' );
\r
184 * element.focusPrevious();
\r
186 CKEDITOR.dom.element.prototype.focusPrevious = function( ignoreChildren )
\r
189 curTabIndex = this.getTabIndex(),
\r
190 passedCurrent, enteredCurrent,
\r
192 electedTabIndex = 0,
\r
195 var element = this.getDocument().getBody().getLast();
\r
197 while ( ( element = element.getPreviousSourceNode( false, CKEDITOR.NODE_ELEMENT ) ) )
\r
199 if ( !passedCurrent )
\r
201 if ( !enteredCurrent && element.equals( this ) )
\r
203 enteredCurrent = true;
\r
205 // Ignore this element, if required.
\r
206 if ( ignoreChildren )
\r
208 if ( !( element = element.getPreviousSourceNode( true, CKEDITOR.NODE_ELEMENT ) ) )
\r
213 else if ( enteredCurrent && !this.contains( element ) )
\r
217 if ( !element.isVisible() || ( elementTabIndex = element.getTabIndex() ) < 0 )
\r
220 if ( curTabIndex <= 0 )
\r
222 // If this element has tabindex <= 0 then we must look for:
\r
223 // 1. An element before this one containing tabindex=0.
\r
224 // 2. The last element with the highest tabindex.
\r
226 if ( passedCurrent && elementTabIndex === 0 )
\r
232 if ( elementTabIndex > electedTabIndex )
\r
235 electedTabIndex = elementTabIndex;
\r
240 // If this element has tabindex > 0 we must look for:
\r
241 // 1. An element preceeding this one, with the same tabindex.
\r
242 // 2. The last element in source other with the highest tabindex
\r
243 // that is lower than this element tabindex.
\r
245 if ( passedCurrent && elementTabIndex == curTabIndex )
\r
251 if ( elementTabIndex < curTabIndex && ( !elected || elementTabIndex > electedTabIndex ) )
\r
254 electedTabIndex = elementTabIndex;
\r
264 * Intructs the editor to add a number of spaces (&nbsp;) to the text when
\r
265 * hitting the TAB key. If set to zero, the TAB key will be used to move the
\r
266 * cursor focus to the next element in the page, out of the editor focus.
\r
270 * config.tabSpaces = 4;
\r
272 CKEDITOR.config.tabSpaces = 0 ;
\r