]>
git.immae.eu Git - perso/Immae/Projets/packagist/piedsjaloux-ckeditor-component.git/blob - sources/plugins/tab/plugin.js
2 * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license
9 modes: { wysiwyg: 1, source: 1 }
13 exec: function( editor
) {
14 editor
.container
.focusNext( true, editor
.tabIndex
);
18 var blurBackCommand
= {
19 exec: function( editor
) {
20 editor
.container
.focusPrevious( true, editor
.tabIndex
);
24 function selectNextCellCommand( backward
) {
28 modes: { wysiwyg: 1 },
29 exec: function( editor
) {
30 if ( editor
.editable().hasFocus
) {
31 var sel
= editor
.getSelection(),
32 path
= new CKEDITOR
.dom
.elementPath( sel
.getCommonAncestor(), sel
.root
),
35 if ( ( cell
= path
.contains( { td: 1, th: 1 }, 1 ) ) ) {
36 var resultRange
= editor
.createRange(),
37 next
= CKEDITOR
.tools
.tryThese( function() {
38 var row
= cell
.getParent(),
39 next
= row
.$.cells
[ cell
.$.cellIndex
+ ( backward
? -1 : 1 ) ];
41 // Invalid any empty value.
42 next
.parentNode
.parentNode
;
45 var row
= cell
.getParent(),
46 table
= row
.getAscendant( 'table' ),
47 nextRow
= table
.$.rows
[ row
.$.rowIndex
+ ( backward
? -1 : 1 ) ];
49 return nextRow
.cells
[ backward
? nextRow
.cells
.length
- 1 : 0 ];
52 // Clone one more row at the end of table and select the first newly established cell.
53 if ( !( next
|| backward
) ) {
54 var table
= cell
.getAscendant( 'table' ).$,
55 cells
= cell
.getParent().$.cells
;
57 var newRow
= new CKEDITOR
.dom
.element( table
.insertRow( -1 ), editor
.document
);
59 for ( var i
= 0, count
= cells
.length
; i
< count
; i
++ ) {
60 var newCell
= newRow
.append( new CKEDITOR
.dom
.element( cells
[ i
], editor
.document
).clone( false, false ) );
61 newCell
.appendBogus();
64 resultRange
.moveToElementEditStart( newRow
);
66 next
= new CKEDITOR
.dom
.element( next
);
67 resultRange
.moveToElementEditStart( next
);
68 // Avoid selecting empty block makes the cursor blind.
69 if ( !( resultRange
.checkStartOfBlock() && resultRange
.checkEndOfBlock() ) )
70 resultRange
.selectNodeContents( next
);
75 resultRange
.select( true );
85 CKEDITOR
.plugins
.add( 'tab', {
86 init: function( editor
) {
87 var tabTools
= editor
.config
.enableTabKeyTools
!== false,
88 tabSpaces
= editor
.config
.tabSpaces
|| 0,
95 editor
.on( 'key', function( ev
) {
97 if ( ev
.data
.keyCode
== 9 ) {
98 editor
.insertText( tabText
);
105 editor
.on( 'key', function( ev
) {
106 if ( ev
.data
.keyCode
== 9 && editor
.execCommand( 'selectNextCell' ) || // TAB
107 ev
.data
.keyCode
== ( CKEDITOR
.SHIFT
+ 9 ) && editor
.execCommand( 'selectPreviousCell' ) ) // SHIFT+TAB
112 editor
.addCommand( 'blur', CKEDITOR
.tools
.extend( blurCommand
, meta
) );
113 editor
.addCommand( 'blurBack', CKEDITOR
.tools
.extend( blurBackCommand
, meta
) );
114 editor
.addCommand( 'selectNextCell', selectNextCellCommand() );
115 editor
.addCommand( 'selectPreviousCell', selectNextCellCommand( true ) );
121 * Moves the UI focus to the element following this element in the tabindex order.
123 * var element = CKEDITOR.document.getById( 'example' );
124 * element.focusNext();
126 * @param {Boolean} [ignoreChildren=false]
127 * @param {Number} [indexToUse]
128 * @member CKEDITOR.dom.element
130 CKEDITOR
.dom
.element
.prototype.focusNext = function( ignoreChildren
, indexToUse
) {
131 var curTabIndex
= ( indexToUse
=== undefined ? this.getTabIndex() : indexToUse
),
132 passedCurrent
, enteredCurrent
, elected
, electedTabIndex
, element
, elementTabIndex
;
134 if ( curTabIndex
<= 0 ) {
135 // If this element has tabindex <= 0 then we must simply look for any
136 // element following it containing tabindex=0.
138 element
= this.getNextSourceNode( ignoreChildren
, CKEDITOR
.NODE_ELEMENT
);
141 if ( element
.isVisible() && element
.getTabIndex() === 0 ) {
146 element
= element
.getNextSourceNode( false, CKEDITOR
.NODE_ELEMENT
);
149 // If this element has tabindex > 0 then we must look for:
150 // 1. An element following this element with the same tabindex.
151 // 2. The first element in source other with the lowest tabindex
152 // that is higher than this element tabindex.
153 // 3. The first element with tabindex=0.
155 element
= this.getDocument().getBody().getFirst();
157 while ( ( element
= element
.getNextSourceNode( false, CKEDITOR
.NODE_ELEMENT
) ) ) {
158 if ( !passedCurrent
) {
159 if ( !enteredCurrent
&& element
.equals( this ) ) {
160 enteredCurrent
= true;
162 // Ignore this element, if required.
163 if ( ignoreChildren
) {
164 if ( !( element
= element
.getNextSourceNode( true, CKEDITOR
.NODE_ELEMENT
) ) )
168 } else if ( enteredCurrent
&& !this.contains( element
) ) {
173 if ( !element
.isVisible() || ( elementTabIndex
= element
.getTabIndex() ) < 0 )
176 if ( passedCurrent
&& elementTabIndex
== curTabIndex
) {
181 if ( elementTabIndex
> curTabIndex
&& ( !elected
|| !electedTabIndex
|| elementTabIndex
< electedTabIndex
) ) {
183 electedTabIndex
= elementTabIndex
;
184 } else if ( !elected
&& elementTabIndex
=== 0 ) {
186 electedTabIndex
= elementTabIndex
;
196 * Moves the UI focus to the element before this element in the tabindex order.
198 * var element = CKEDITOR.document.getById( 'example' );
199 * element.focusPrevious();
201 * @param {Boolean} [ignoreChildren=false]
202 * @param {Number} [indexToUse]
203 * @member CKEDITOR.dom.element
205 CKEDITOR
.dom
.element
.prototype.focusPrevious = function( ignoreChildren
, indexToUse
) {
206 var curTabIndex
= ( indexToUse
=== undefined ? this.getTabIndex() : indexToUse
),
207 passedCurrent
, enteredCurrent
, elected
,
211 var element
= this.getDocument().getBody().getLast();
213 while ( ( element
= element
.getPreviousSourceNode( false, CKEDITOR
.NODE_ELEMENT
) ) ) {
214 if ( !passedCurrent
) {
215 if ( !enteredCurrent
&& element
.equals( this ) ) {
216 enteredCurrent
= true;
218 // Ignore this element, if required.
219 if ( ignoreChildren
) {
220 if ( !( element
= element
.getPreviousSourceNode( true, CKEDITOR
.NODE_ELEMENT
) ) )
224 } else if ( enteredCurrent
&& !this.contains( element
) ) {
229 if ( !element
.isVisible() || ( elementTabIndex
= element
.getTabIndex() ) < 0 )
232 if ( curTabIndex
<= 0 ) {
233 // If this element has tabindex <= 0 then we must look for:
234 // 1. An element before this one containing tabindex=0.
235 // 2. The last element with the highest tabindex.
237 if ( passedCurrent
&& elementTabIndex
=== 0 ) {
242 if ( elementTabIndex
> electedTabIndex
) {
244 electedTabIndex
= elementTabIndex
;
247 // If this element has tabindex > 0 we must look for:
248 // 1. An element preceeding this one, with the same tabindex.
249 // 2. The last element in source other with the highest tabindex
250 // that is lower than this element tabindex.
252 if ( passedCurrent
&& elementTabIndex
== curTabIndex
) {
257 if ( elementTabIndex
< curTabIndex
&& ( !elected
|| elementTabIndex
> electedTabIndex
) ) {
259 electedTabIndex
= elementTabIndex
;
269 * Intructs the editor to add a number of spaces (` `) to the text when
270 * hitting the <kbd>Tab</kbd> key. If set to zero, the <kbd>Tab</kbd> key will be used to move the
271 * cursor focus to the next element in the page, out of the editor focus.
273 * config.tabSpaces = 4;
275 * @cfg {Number} [tabSpaces=0]
276 * @member CKEDITOR.config
280 * Allow context-sensitive <kbd>Tab</kbd> key behaviors, including the following scenarios:
282 * When selection is anchored inside **table cells**:
284 * * If <kbd>Tab</kbd> is pressed, select the content of the "next" cell. If in the last
285 * cell in the table, add a new row to it and focus its first cell.
286 * * If <kbd>Shift+Tab</kbd> is pressed, select the content of the "previous" cell.
287 * Do nothing when it is in the first cell.
291 * config.enableTabKeyTools = false;
293 * @cfg {Boolean} [enableTabKeyTools=true]
294 * @member CKEDITOR.config
297 // If the <kbd>Tab</kbd> key is not supposed to be enabled for navigation, the following
298 // settings could be used alternatively:
299 // config.keystrokes.push(
300 // [ CKEDITOR.ALT + 38 /*Arrow Up*/, 'selectPreviousCell' ],
301 // [ CKEDITOR.ALT + 40 /*Arrow Down*/, 'selectNextCell' ]