JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.1.1
[ckeditor.git] / _source / plugins / justify / plugin.js
1 /*\r
2 Copyright (c) 2003-2010, 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                                 enterMode = editor.config.enterMode;\r
71 \r
72                         if ( !selection )\r
73                                 return;\r
74 \r
75                         var bookmarks = selection.createBookmarks(),\r
76                                 ranges = selection.getRanges();\r
77 \r
78 \r
79                         var cssClassName = this.cssClassName,\r
80                                 iterator,\r
81                                 block;\r
82                         for ( var i = ranges.length - 1 ; i >= 0 ; i-- )\r
83                         {\r
84                                 iterator = ranges[ i ].createIterator();\r
85                                 iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;\r
86 \r
87                                 while ( ( block = iterator.getNextParagraph() ) )\r
88                                 {\r
89                                         block.removeAttribute( 'align' );\r
90 \r
91                                         if ( cssClassName )\r
92                                         {\r
93                                                 // Remove any of the alignment classes from the className.\r
94                                                 var className = block.$.className =\r
95                                                         CKEDITOR.tools.ltrim( block.$.className.replace( this.cssClassRegex, '' ) );\r
96 \r
97                                                 // Append the desired class name.\r
98                                                 if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )\r
99                                                         block.addClass( cssClassName );\r
100                                                 else if ( !className )\r
101                                                         block.removeAttribute( 'class' );\r
102                                         }\r
103                                         else\r
104                                         {\r
105                                                 if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )\r
106                                                         block.setStyle( 'text-align', this.value );\r
107                                                 else\r
108                                                         block.removeStyle( 'text-align' );\r
109                                         }\r
110                                 }\r
111 \r
112                         }\r
113 \r
114                         editor.focus();\r
115                         editor.forceNextSelectionCheck();\r
116                         selection.selectBookmarks( bookmarks );\r
117                 }\r
118         };\r
119 \r
120         CKEDITOR.plugins.add( 'justify',\r
121         {\r
122                 init : function( editor )\r
123                 {\r
124                         var left = new justifyCommand( editor, 'justifyleft', 'left' ),\r
125                                 center = new justifyCommand( editor, 'justifycenter', 'center' ),\r
126                                 right = new justifyCommand( editor, 'justifyright', 'right' ),\r
127                                 justify = new justifyCommand( editor, 'justifyblock', 'justify' );\r
128 \r
129                         editor.addCommand( 'justifyleft', left );\r
130                         editor.addCommand( 'justifycenter', center );\r
131                         editor.addCommand( 'justifyright', right );\r
132                         editor.addCommand( 'justifyblock', justify );\r
133 \r
134                         editor.ui.addButton( 'JustifyLeft',\r
135                                 {\r
136                                         label : editor.lang.justify.left,\r
137                                         command : 'justifyleft'\r
138                                 } );\r
139                         editor.ui.addButton( 'JustifyCenter',\r
140                                 {\r
141                                         label : editor.lang.justify.center,\r
142                                         command : 'justifycenter'\r
143                                 } );\r
144                         editor.ui.addButton( 'JustifyRight',\r
145                                 {\r
146                                         label : editor.lang.justify.right,\r
147                                         command : 'justifyright'\r
148                                 } );\r
149                         editor.ui.addButton( 'JustifyBlock',\r
150                                 {\r
151                                         label : editor.lang.justify.block,\r
152                                         command : 'justifyblock'\r
153                                 } );\r
154 \r
155                         editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, left ) );\r
156                         editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, right ) );\r
157                         editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, center ) );\r
158                         editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, justify ) );\r
159                 },\r
160 \r
161                 requires : [ 'domiterator' ]\r
162         });\r
163 })();\r
164 \r
165 CKEDITOR.tools.extend( CKEDITOR.config,\r
166         {\r
167                 justifyClasses : null\r
168         } );\r