JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.0
[ckeditor.git] / _source / plugins / justify / plugin.js
diff --git a/_source/plugins/justify/plugin.js b/_source/plugins/justify/plugin.js
new file mode 100644 (file)
index 0000000..39bf8f6
--- /dev/null
@@ -0,0 +1,164 @@
+/*\r
+Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r
+For licensing, see LICENSE.html or http://ckeditor.com/license\r
+*/\r
+\r
+/**\r
+ * @file Justify commands.\r
+ */\r
+\r
+(function()\r
+{\r
+       var alignRemoveRegex = /(-moz-|-webkit-|start|auto)/i;\r
+\r
+       function getState( editor, path )\r
+       {\r
+               var firstBlock = path.block || path.blockLimit;\r
+\r
+               if ( !firstBlock || firstBlock.getName() == 'body' )\r
+                       return CKEDITOR.TRISTATE_OFF;\r
+\r
+               var currentAlign = firstBlock.getComputedStyle( 'text-align' ).replace( alignRemoveRegex, '' );\r
+               if ( ( !currentAlign && this.isDefaultAlign ) || currentAlign == this.value )\r
+                       return CKEDITOR.TRISTATE_ON;\r
+               return CKEDITOR.TRISTATE_OFF;\r
+       }\r
+\r
+       function onSelectionChange( evt )\r
+       {\r
+               var command = evt.editor.getCommand( this.name );\r
+               command.state = getState.call( this, evt.editor, evt.data.path );\r
+               command.fire( 'state' );\r
+       }\r
+\r
+       function justifyCommand( editor, name, value )\r
+       {\r
+               this.name = name;\r
+               this.value = value;\r
+\r
+               var contentDir = editor.config.contentsLangDirection;\r
+               this.isDefaultAlign = ( value == 'left' && contentDir == 'ltr' ) ||\r
+                       ( value == 'right' && contentDir == 'rtl' );\r
+\r
+               var classes = editor.config.justifyClasses;\r
+               if ( classes )\r
+               {\r
+                       switch ( value )\r
+                       {\r
+                               case 'left' :\r
+                                       this.cssClassName = classes[0];\r
+                                       break;\r
+                               case 'center' :\r
+                                       this.cssClassName = classes[1];\r
+                                       break;\r
+                               case 'right' :\r
+                                       this.cssClassName = classes[2];\r
+                                       break;\r
+                               case 'justify' :\r
+                                       this.cssClassName = classes[3];\r
+                                       break;\r
+                       }\r
+\r
+                       this.cssClassRegex = new RegExp( '(?:^|\\s+)(?:' + classes.join( '|' ) + ')(?=$|\\s)' );\r
+               }\r
+       }\r
+\r
+       justifyCommand.prototype = {\r
+               exec : function( editor )\r
+               {\r
+                       var selection = editor.getSelection();\r
+                       if ( !selection )\r
+                               return;\r
+\r
+                       var bookmarks = selection.createBookmarks(),\r
+                               ranges = selection.getRanges();\r
+\r
+\r
+                       var cssClassName = this.cssClassName,\r
+                               iterator,\r
+                               block;\r
+                       for ( var i = ranges.length - 1 ; i >= 0 ; i-- )\r
+                       {\r
+                               iterator = ranges[ i ].createIterator();\r
+                               while ( ( block = iterator.getNextParagraph() ) )\r
+                               {\r
+                                       block.removeAttribute( 'align' );\r
+\r
+                                       if ( cssClassName )\r
+                                       {\r
+                                               // Remove any of the alignment classes from the className.\r
+                                               var className = block.$.className =\r
+                                                       CKEDITOR.tools.ltrim( block.$.className.replace( this.cssClassRegex, '' ) );\r
+\r
+                                               // Append the desired class name.\r
+                                               if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )\r
+                                                       block.addClass( cssClassName );\r
+                                               else if ( !className )\r
+                                                       block.removeAttribute( 'class' );\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )\r
+                                                       block.setStyle( 'text-align', this.value );\r
+                                               else\r
+                                                       block.removeStyle( 'text-align' );\r
+                                       }\r
+                               }\r
+\r
+                       }\r
+\r
+                       editor.focus();\r
+                       editor.forceNextSelectionCheck();\r
+                       selection.selectBookmarks( bookmarks );\r
+               }\r
+       };\r
+\r
+       CKEDITOR.plugins.add( 'justify',\r
+       {\r
+               init : function( editor )\r
+               {\r
+                       var left = new justifyCommand( editor, 'justifyleft', 'left' ),\r
+                               center = new justifyCommand( editor, 'justifycenter', 'center' ),\r
+                               right = new justifyCommand( editor, 'justifyright', 'right' ),\r
+                               justify = new justifyCommand( editor, 'justifyblock', 'justify' );\r
+\r
+                       editor.addCommand( 'justifyleft', left );\r
+                       editor.addCommand( 'justifycenter', center );\r
+                       editor.addCommand( 'justifyright', right );\r
+                       editor.addCommand( 'justifyblock', justify );\r
+\r
+                       editor.ui.addButton( 'JustifyLeft',\r
+                               {\r
+                                       label : editor.lang.justify.left,\r
+                                       command : 'justifyleft'\r
+                               } );\r
+                       editor.ui.addButton( 'JustifyCenter',\r
+                               {\r
+                                       label : editor.lang.justify.center,\r
+                                       command : 'justifycenter'\r
+                               } );\r
+                       editor.ui.addButton( 'JustifyRight',\r
+                               {\r
+                                       label : editor.lang.justify.right,\r
+                                       command : 'justifyright'\r
+                               } );\r
+                       editor.ui.addButton( 'JustifyBlock',\r
+                               {\r
+                                       label : editor.lang.justify.block,\r
+                                       command : 'justifyblock'\r
+                               } );\r
+\r
+                       editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, left ) );\r
+                       editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, right ) );\r
+                       editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, center ) );\r
+                       editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, justify ) );\r
+               },\r
+\r
+               requires : [ 'domiterator' ]\r
+       });\r
+})();\r
+\r
+CKEDITOR.tools.extend( CKEDITOR.config,\r
+       {\r
+               justifyClasses : null\r
+       } );\r