2 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
\r
3 * Copyright (C) 2003-2009 Frederico Caldeira Knabben
\r
5 * == BEGIN LICENSE ==
\r
7 * Licensed under the terms of any of the following licenses at your
\r
10 * - GNU General Public License Version 2 or later (the "GPL")
\r
11 * http://www.gnu.org/licenses/gpl.html
\r
13 * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
\r
14 * http://www.gnu.org/licenses/lgpl.html
\r
16 * - Mozilla Public License Version 1.1 or later (the "MPL")
\r
17 * http://www.mozilla.org/MPL/MPL-1.1.html
\r
21 * FCKJustifyCommand Class: controls block justification.
\r
24 var FCKJustifyCommand = function( alignValue )
\r
26 this.AlignValue = alignValue ;
\r
28 // Detect whether this is the instance for the default alignment.
\r
29 var contentDir = FCKConfig.ContentLangDirection.toLowerCase() ;
\r
30 this.IsDefaultAlign = ( alignValue == 'left' && contentDir == 'ltr' ) ||
\r
31 ( alignValue == 'right' && contentDir == 'rtl' ) ;
\r
33 // Get the class name to be used by this instance.
\r
34 var cssClassName = this._CssClassName = ( function()
\r
36 var classes = FCKConfig.JustifyClasses ;
\r
39 switch ( alignValue )
\r
42 return classes[0] || null ;
\r
44 return classes[1] || null ;
\r
46 return classes[2] || null ;
\r
48 return classes[3] || null ;
\r
54 if ( cssClassName && cssClassName.length > 0 )
\r
55 this._CssClassRegex = new RegExp( '(?:^|\\s+)' + cssClassName + '(?=$|\\s)' ) ;
\r
58 FCKJustifyCommand._GetClassNameRegex = function()
\r
60 var regex = FCKJustifyCommand._ClassRegex ;
\r
61 if ( regex != undefined )
\r
66 var classes = FCKConfig.JustifyClasses ;
\r
69 for ( var i = 0 ; i < 4 ; i++ )
\r
71 var className = classes[i] ;
\r
72 if ( className && className.length > 0 )
\r
73 names.push( className ) ;
\r
77 if ( names.length > 0 )
\r
78 regex = new RegExp( '(?:^|\\s+)(?:' + names.join( '|' ) + ')(?=$|\\s)' ) ;
\r
82 return FCKJustifyCommand._ClassRegex = regex ;
\r
85 FCKJustifyCommand.prototype =
\r
87 Execute : function()
\r
89 // Save an undo snapshot before doing anything.
\r
90 FCKUndo.SaveUndoStep() ;
\r
92 var range = new FCKDomRange( FCK.EditorWindow ) ;
\r
93 range.MoveToSelection() ;
\r
95 var currentState = this.GetState() ;
\r
96 if ( currentState == FCK_TRISTATE_DISABLED )
\r
99 // Store a bookmark of the selection since the paragraph iterator might
\r
100 // change the DOM tree and break selections.
\r
101 var bookmark = range.CreateBookmark() ;
\r
103 var cssClassName = this._CssClassName ;
\r
105 // Apply alignment setting for each paragraph.
\r
106 var iterator = new FCKDomRangeIterator( range ) ;
\r
108 while ( ( block = iterator.GetNextParagraph() ) )
\r
110 block.removeAttribute( 'align' ) ;
\r
112 if ( cssClassName )
\r
114 // Remove the any of the alignment classes from the className.
\r
115 var className = block.className.replace( FCKJustifyCommand._GetClassNameRegex(), '' ) ;
\r
117 // Append the desired class name.
\r
118 if ( currentState == FCK_TRISTATE_OFF )
\r
120 if ( className.length > 0 )
\r
122 block.className = className + cssClassName ;
\r
124 else if ( className.length == 0 )
\r
125 FCKDomTools.RemoveAttribute( block, 'class' ) ;
\r
129 var style = block.style ;
\r
130 if ( currentState == FCK_TRISTATE_OFF )
\r
131 style.textAlign = this.AlignValue ;
\r
134 style.textAlign = '' ;
\r
135 if ( style.cssText.length == 0 )
\r
136 block.removeAttribute( 'style' ) ;
\r
141 // Restore previous selection.
\r
142 range.MoveToBookmark( bookmark ) ;
\r
146 FCK.Events.FireEvent( 'OnSelectionChange' ) ;
\r
149 GetState : function()
\r
151 // Disabled if not WYSIWYG.
\r
152 if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
\r
153 return FCK_TRISTATE_DISABLED ;
\r
155 // Retrieve the first selected block.
\r
156 var path = new FCKElementPath( FCKSelection.GetBoundaryParentElement( true ) ) ;
\r
157 var firstBlock = path.Block || path.BlockLimit ;
\r
159 if ( !firstBlock || firstBlock.nodeName.toLowerCase() == 'body' )
\r
160 return FCK_TRISTATE_OFF ;
\r
162 // Check if the desired style is already applied to the block.
\r
164 if ( FCKBrowserInfo.IsIE )
\r
165 currentAlign = firstBlock.currentStyle.textAlign ;
\r
167 currentAlign = FCK.EditorWindow.getComputedStyle( firstBlock, '' ).getPropertyValue( 'text-align' );
\r
168 currentAlign = currentAlign.replace( /(-moz-|-webkit-|start|auto)/i, '' );
\r
169 if ( ( !currentAlign && this.IsDefaultAlign ) || currentAlign == this.AlignValue )
\r
170 return FCK_TRISTATE_ON ;
\r
171 return FCK_TRISTATE_OFF ;
\r