JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.6.3
[ckeditor.git] / _source / plugins / indent / plugin.js
index c49ce88..1e3ec49 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.\r
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\r
 For licensing, see LICENSE.html or http://ckeditor.com/license\r
 */\r
 \r
@@ -9,33 +9,28 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
 \r
 (function()\r
 {\r
-       var listNodeNames = { ol : 1, ul : 1 };\r
-\r
-       var isNotWhitespaces = CKEDITOR.dom.walker.whitespaces( true ),\r
+       var listNodeNames = { ol : 1, ul : 1 },\r
+               isNotWhitespaces = CKEDITOR.dom.walker.whitespaces( true ),\r
                isNotBookmark = CKEDITOR.dom.walker.bookmark( false, true );\r
 \r
-       function setState( editor, state )\r
-       {\r
-               editor.getCommand( this.name ).setState( state );\r
-       }\r
-\r
        function onSelectionChange( evt )\r
        {\r
-               var editor = evt.editor;\r
+               if ( evt.editor.readOnly )\r
+                       return null;\r
 \r
-               var elementPath = evt.data.path,\r
-                               list = elementPath && elementPath.contains( listNodeNames );\r
+               var editor = evt.editor,\r
+                       elementPath = evt.data.path,\r
+                       list = elementPath && elementPath.contains( listNodeNames ),\r
+                       firstBlock = elementPath.block || elementPath.blockLimit;\r
 \r
                if ( list )\r
-                               return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );\r
+                               return this.setState( CKEDITOR.TRISTATE_OFF );\r
 \r
                if ( !this.useIndentClasses && this.name == 'indent' )\r
-                       return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );\r
+                       return this.setState( CKEDITOR.TRISTATE_OFF );\r
 \r
-               var path = evt.data.path,\r
-                       firstBlock = path.block || path.blockLimit;\r
                if ( !firstBlock )\r
-                       return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED );\r
+                       return this.setState( CKEDITOR.TRISTATE_DISABLED );\r
 \r
                if ( this.useIndentClasses )\r
                {\r
@@ -48,8 +43,8 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                        }\r
                        if ( ( this.name == 'outdent' && !indentStep ) ||\r
                                        ( this.name == 'indent' && indentStep == editor.config.indentClasses.length ) )\r
-                               return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED );\r
-                       return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );\r
+                               return this.setState( CKEDITOR.TRISTATE_DISABLED );\r
+                       return this.setState( CKEDITOR.TRISTATE_OFF );\r
                }\r
                else\r
                {\r
@@ -57,8 +52,8 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                        if ( isNaN( indent ) )\r
                                indent = 0;\r
                        if ( indent <= 0 )\r
-                               return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED );\r
-                       return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );\r
+                               return this.setState( CKEDITOR.TRISTATE_DISABLED );\r
+                       return this.setState( CKEDITOR.TRISTATE_OFF );\r
                }\r
        }\r
 \r
@@ -85,7 +80,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
 \r
        function isListItem( node )\r
        {\r
-               return node.type = CKEDITOR.NODE_ELEMENT && node.is( 'li' );\r
+               return node.type == CKEDITOR.NODE_ELEMENT && node.is( 'li' );\r
        }\r
 \r
        indentCommand.prototype = {\r
@@ -215,7 +210,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                iterator.enforceRealBlocks = true;\r
                                iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;\r
                                var block;\r
-                               while ( ( block = iterator.getNextParagraph() ) )\r
+                               while ( ( block = iterator.getNextParagraph( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ) )\r
                                        indentElement( block );\r
                        }\r
 \r
@@ -354,10 +349,8 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                init : function( editor )\r
                {\r
                        // Register commands.\r
-                       var indent = new indentCommand( editor, 'indent' ),\r
-                               outdent = new indentCommand( editor, 'outdent' );\r
-                       editor.addCommand( 'indent', indent );\r
-                       editor.addCommand( 'outdent', outdent );\r
+                       var indent = editor.addCommand( 'indent', new indentCommand( editor, 'indent' ) ),\r
+                               outdent = editor.addCommand( 'outdent', new indentCommand( editor, 'outdent' ) );\r
 \r
                        // Register the toolbar buttons.\r
                        editor.ui.addButton( 'Indent',\r
@@ -432,6 +425,25 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                        }\r
                                }\r
                        });\r
+\r
+                       editor.on( 'key', function( evt )\r
+                       {\r
+                               // Backspace at the beginning of  list item should outdent it.\r
+                               if ( editor.mode == 'wysiwyg' && evt.data.keyCode == 8 )\r
+                               {\r
+                                       var sel = editor.getSelection(),\r
+                                               range = sel.getRanges()[ 0 ],\r
+                                               li;\r
+\r
+                                       if ( range.collapsed &&\r
+                                                ( li = range.startContainer.getAscendant( 'li', 1 ) ) &&\r
+                                                range.checkBoundaryOfElement( li, CKEDITOR.START ) )\r
+                                       {\r
+                                               editor.execCommand( 'outdent' );\r
+                                               evt.cancel();\r
+                                       }\r
+                               }\r
+                       });\r
                },\r
 \r
                requires : [ 'domiterator', 'list' ]\r
@@ -461,7 +473,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
  * and instead the {@link #indentUnit} and {@link #indentOffset} properties will be used.\r
  * @name CKEDITOR.config.indentClasses\r
  * @type Array\r
- * default null\r
+ * @default null\r
  * @example\r
  * // Use the classes 'Indent1', 'Indent2', 'Indent3'\r
  * config.indentClasses = ['Indent1', 'Indent2', 'Indent3'];\r