JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.4.2
[ckeditor.git] / _source / plugins / indent / plugin.js
index 4c1406e..50b1356 100644 (file)
@@ -256,72 +256,77 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                }\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
@@ -330,9 +335,12 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                                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
@@ -382,43 +390,43 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                        "       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