JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
39bf8f65e55d1fc8227ef19e3de84a0e43973969
[ckeditor.git] / _source / plugins / justify / plugin.js
1 /*\r
2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 /**\r
7  * @file Justify commands.\r
8  */\r
9 \r
10 (function()\r
11 {\r
12         var alignRemoveRegex = /(-moz-|-webkit-|start|auto)/i;\r
13 \r
14         function getState( editor, path )\r
15         {\r
16                 var firstBlock = path.block || path.blockLimit;\r
17 \r
18                 if ( !firstBlock || firstBlock.getName() == 'body' )\r
19                         return CKEDITOR.TRISTATE_OFF;\r
20 \r
21                 var currentAlign = firstBlock.getComputedStyle( 'text-align' ).replace( alignRemoveRegex, '' );\r
22                 if ( ( !currentAlign && this.isDefaultAlign ) || currentAlign == this.value )\r
23                         return CKEDITOR.TRISTATE_ON;\r
24                 return CKEDITOR.TRISTATE_OFF;\r
25         }\r
26 \r
27         function onSelectionChange( evt )\r
28         {\r
29                 var command = evt.editor.getCommand( this.name );\r
30                 command.state = getState.call( this, evt.editor, evt.data.path );\r
31                 command.fire( 'state' );\r
32         }\r
33 \r
34         function justifyCommand( editor, name, value )\r
35         {\r
36                 this.name = name;\r
37                 this.value = value;\r
38 \r
39                 var contentDir = editor.config.contentsLangDirection;\r
40                 this.isDefaultAlign = ( value == 'left' && contentDir == 'ltr' ) ||\r
41                         ( value == 'right' && contentDir == 'rtl' );\r
42 \r
43                 var classes = editor.config.justifyClasses;\r
44                 if ( classes )\r
45                 {\r
46                         switch ( value )\r
47                         {\r
48                                 case 'left' :\r
49                                         this.cssClassName = classes[0];\r
50                                         break;\r
51                                 case 'center' :\r
52                                         this.cssClassName = classes[1];\r
53                                         break;\r
54                                 case 'right' :\r
55                                         this.cssClassName = classes[2];\r
56                                         break;\r
57                                 case 'justify' :\r
58                                         this.cssClassName = classes[3];\r
59                                         break;\r
60                         }\r
61 \r
62                         this.cssClassRegex = new RegExp( '(?:^|\\s+)(?:' + classes.join( '|' ) + ')(?=$|\\s)' );\r
63                 }\r
64         }\r
65 \r
66         justifyCommand.prototype = {\r
67                 exec : function( editor )\r
68                 {\r
69                         var selection = editor.getSelection();\r
70                         if ( !selection )\r
71                                 return;\r
72 \r
73                         var bookmarks = selection.createBookmarks(),\r
74                                 ranges = selection.getRanges();\r
75 \r
76 \r
77                         var cssClassName = this.cssClassName,\r
78                                 iterator,\r
79                                 block;\r
80                         for ( var i = ranges.length - 1 ; i >= 0 ; i-- )\r
81                         {\r
82                                 iterator = ranges[ i ].createIterator();\r
83                                 while ( ( block = iterator.getNextParagraph() ) )\r
84                                 {\r
85                                         block.removeAttribute( 'align' );\r
86 \r
87                                         if ( cssClassName )\r
88                                         {\r
89                                                 // Remove any of the alignment classes from the className.\r
90                                                 var className = block.$.className =\r
91                                                         CKEDITOR.tools.ltrim( block.$.className.replace( this.cssClassRegex, '' ) );\r
92 \r
93                                                 // Append the desired class name.\r
94                                                 if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )\r
95                                                         block.addClass( cssClassName );\r
96                                                 else if ( !className )\r
97                                                         block.removeAttribute( 'class' );\r
98                                         }\r
99                                         else\r
100                                         {\r
101                                                 if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )\r
102                                                         block.setStyle( 'text-align', this.value );\r
103                                                 else\r
104                                                         block.removeStyle( 'text-align' );\r
105                                         }\r
106                                 }\r
107 \r
108                         }\r
109 \r
110                         editor.focus();\r
111                         editor.forceNextSelectionCheck();\r
112                         selection.selectBookmarks( bookmarks );\r
113                 }\r
114         };\r
115 \r
116         CKEDITOR.plugins.add( 'justify',\r
117         {\r
118                 init : function( editor )\r
119                 {\r
120                         var left = new justifyCommand( editor, 'justifyleft', 'left' ),\r
121                                 center = new justifyCommand( editor, 'justifycenter', 'center' ),\r
122                                 right = new justifyCommand( editor, 'justifyright', 'right' ),\r
123                                 justify = new justifyCommand( editor, 'justifyblock', 'justify' );\r
124 \r
125                         editor.addCommand( 'justifyleft', left );\r
126                         editor.addCommand( 'justifycenter', center );\r
127                         editor.addCommand( 'justifyright', right );\r
128                         editor.addCommand( 'justifyblock', justify );\r
129 \r
130                         editor.ui.addButton( 'JustifyLeft',\r
131                                 {\r
132                                         label : editor.lang.justify.left,\r
133                                         command : 'justifyleft'\r
134                                 } );\r
135                         editor.ui.addButton( 'JustifyCenter',\r
136                                 {\r
137                                         label : editor.lang.justify.center,\r
138                                         command : 'justifycenter'\r
139                                 } );\r
140                         editor.ui.addButton( 'JustifyRight',\r
141                                 {\r
142                                         label : editor.lang.justify.right,\r
143                                         command : 'justifyright'\r
144                                 } );\r
145                         editor.ui.addButton( 'JustifyBlock',\r
146                                 {\r
147                                         label : editor.lang.justify.block,\r
148                                         command : 'justifyblock'\r
149                                 } );\r
150 \r
151                         editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, left ) );\r
152                         editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, right ) );\r
153                         editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, center ) );\r
154                         editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, justify ) );\r
155                 },\r
156 \r
157                 requires : [ 'domiterator' ]\r
158         });\r
159 })();\r
160 \r
161 CKEDITOR.tools.extend( CKEDITOR.config,\r
162         {\r
163                 justifyClasses : null\r
164         } );\r