}\r
else\r
{\r
- var indentCssProperty = getIndentCssProperty( element );\r
- var currentOffset = parseInt( element.getStyle( indentCssProperty ), 10 );\r
+ var indentCssProperty = getIndentCssProperty( element ),\r
+ currentOffset = parseInt( element.getStyle( indentCssProperty ), 10 );\r
if ( isNaN( currentOffset ) )\r
currentOffset = 0;\r
- currentOffset += ( self.name == 'indent' ? 1 : -1 ) * editor.config.indentOffset;\r
+ var indentOffset = editor.config.indentOffset || 40;\r
+ currentOffset += ( self.name == 'indent' ? 1 : -1 ) * indentOffset;\r
\r
if ( currentOffset < 0 )\r
return false;\r
\r
currentOffset = Math.max( currentOffset, 0 );\r
- currentOffset = Math.ceil( currentOffset / editor.config.indentOffset ) * editor.config.indentOffset;\r
- element.setStyle( indentCssProperty, currentOffset ? currentOffset + editor.config.indentUnit : '' );\r
+ currentOffset = Math.ceil( currentOffset / indentOffset ) * indentOffset;\r
+ element.setStyle( indentCssProperty, currentOffset ? currentOffset + ( editor.config.indentUnit || 'px' ) : '' );\r
if ( element.getAttribute( 'style' ) === '' )\r
element.removeAttribute( 'style' );\r
}\r
\r
- CKEDITOR.dom.element.setMarker( database, element, 'indent_processed', true );\r
+ CKEDITOR.dom.element.setMarker( database, element, 'indent_processed', 1 );\r
return true;\r
}\r
\r
var selection = editor.getSelection(),\r
- bookmarks = selection.createBookmarks( true ),\r
- ranges = selection && selection.getRanges( true ),\r
+ bookmarks = selection.createBookmarks( 1 ),\r
+ ranges = selection && selection.getRanges( 1 ),\r
range;\r
\r
- var skipBookmarks = function( node )\r
- {\r
- return ! node.hasAttribute( '_cke_bookmark' );\r
- };\r
\r
var iterator = ranges.createIterator();\r
while ( ( range = iterator.getNextRange() ) )\r
{\r
- // Do not indent body. (#6138)\r
- range.shrink( CKEDITOR.SHRINK_ELEMENT );\r
- if ( range.endContainer.getName() == 'body' )\r
- range.setEndAt( range.endContainer.getLast( skipBookmarks ), CKEDITOR.POSITION_BEFORE_END );\r
-\r
- var startContainer = range.startContainer,\r
- endContainer = range.endContainer,\r
- rangeRoot = range.getCommonAncestor(),\r
+ var rangeRoot = range.getCommonAncestor(),\r
nearestListBlock = rangeRoot;\r
\r
while ( nearestListBlock && !( nearestListBlock.type == CKEDITOR.NODE_ELEMENT &&\r
listNodeNames[ nearestListBlock.getName() ] ) )\r
nearestListBlock = nearestListBlock.getParent();\r
\r
+ // Avoid having selection enclose the entire list. (#6138)\r
+ // [<ul><li>...</li></ul>] =><ul><li>[...]</li></ul>\r
+ if ( !nearestListBlock )\r
+ {\r
+ var selectedNode = range.getEnclosedNode();\r
+ if ( selectedNode\r
+ && selectedNode.type == CKEDITOR.NODE_ELEMENT\r
+ && selectedNode.getName() in listNodeNames)\r
+ {\r
+ range.setStartAt( selectedNode, CKEDITOR.POSITION_AFTER_START );\r
+ range.setEndAt( selectedNode, CKEDITOR.POSITION_BEFORE_END );\r
+ nearestListBlock = selectedNode;\r
+ }\r
+ }\r
+\r
// Avoid selection anchors under list root.\r
// <ul>[<li>...</li>]</ul> => <ul><li>[...]</li></ul>\r
- if ( nearestListBlock && startContainer.type == CKEDITOR.NODE_ELEMENT\r
- && startContainer.getName() in listNodeNames )\r
+ if ( nearestListBlock && range.startContainer.type == CKEDITOR.NODE_ELEMENT\r
+ && range.startContainer.getName() in listNodeNames )\r
{\r
var walker = new CKEDITOR.dom.walker( range );\r
walker.evaluator = isListItem;\r
range.startContainer = walker.next();\r
}\r
\r
- if ( nearestListBlock && endContainer.type == CKEDITOR.NODE_ELEMENT\r
- && endContainer.getName() in listNodeNames )\r
+ if ( nearestListBlock && range.endContainer.type == CKEDITOR.NODE_ELEMENT\r
+ && range.endContainer.getName() in listNodeNames )\r
{\r
walker = new CKEDITOR.dom.walker( range );\r
walker.evaluator = isListItem;\r
range.endContainer = walker.previous();\r
}\r
\r
- if ( nearestListBlock )\r
+ if ( nearestListBlock )\r
{\r
var firstListItem = nearestListBlock.getFirst( function( node )\r
{\r
rangeStart = range.startContainer,\r
indentWholeList = firstListItem.equals( rangeStart ) || firstListItem.contains( rangeStart );\r
\r
- // Indent the entire list if cursor is inside the first list item. (#3893)\r
- if ( !( indentWholeList && indentElement( nearestListBlock ) ) )\r
- indentList( nearestListBlock );\r
+ // Indent the entire list if cursor is inside the first list item. (#3893)\r
+ // Only do that for indenting or when using indent classes or when there is something to outdent. (#6141)\r
+ if ( !( indentWholeList &&\r
+ ( self.name == 'indent' || self.useIndentClasses || parseInt( nearestListBlock.getStyle( getIndentCssProperty( nearestListBlock ) ), 10 ) ) &&\r
+ indentElement( nearestListBlock ) ) )\r
+ indentList( nearestListBlock );\r
}\r
else\r
indentBlock();\r
" padding-left: 40px;" +\r
"}" );\r
}\r
- },\r
\r
- requires : [ 'domiterator', 'list' ]\r
- } );\r
-})();\r
+ // Register dirChanged listener.\r
+ editor.on( 'dirChanged', function( e )\r
+ {\r
+ var range = new CKEDITOR.dom.range( editor.document );\r
+ range.setStartBefore( e.data );\r
+ range.setEndAfter( e.data );\r
\r
-CKEDITOR.tools.extend( CKEDITOR.config,\r
- {\r
- indentOffset : 40,\r
- indentUnit : 'px',\r
- indentClasses : null\r
- });\r
+ var walker = new CKEDITOR.dom.walker( range ),\r
+ node;\r
\r
-/**\r
- * Size of each indentation step\r
- * @type Number\r
- * @example\r
- * config.indentOffset = 40;\r
- */\r
+ while ( ( node = walker.next() ) )\r
+ {\r
+ if ( node.type == CKEDITOR.NODE_ELEMENT )\r
+ {\r
+ // A child with the defined dir is to be ignored.\r
+ if ( !node.equals( e.data ) && node.getDirection() )\r
+ {\r
+ range.setStartAfter( node );\r
+ walker = new CKEDITOR.dom.walker( range );\r
+ continue;\r
+ }\r
\r
- /**\r
- * Unit for the indentation style\r
- * @type String\r
- * @example\r
- * config.indentUnit = 'px';\r
- */\r
+ // Switch the margins.\r
+ var marginLeft = node.getStyle( 'margin-right' ),\r
+ marginRight = node.getStyle( 'margin-left' );\r
\r
- /**\r
- * List of classes to use for indenting the contents.\r
- * @type Array\r
- * @example\r
- * // Don't use classes for indenting. (this is the default value)\r
- * config.indentClasses = null;\r
- * @example\r
- * // Use the classes 'Indent1', 'Indent2', 'Indent3'\r
- * config.indentClasses = ['Indent1', 'Indent2', 'Indent3'];\r
- */\r
+ marginLeft ? node.setStyle( 'margin-left', marginLeft ) : node.removeStyle( 'margin-left' );\r
+ marginRight ? node.setStyle( 'margin-right', marginRight ) : node.removeStyle( 'margin-right' );\r
+ }\r
+ }\r
+ });\r
+ },\r
+\r
+ requires : [ 'domiterator', 'list' ]\r
+ } );\r
+})();\r
\r
/**\r
* Size of each indentation step\r