2 Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
3 For licensing, see LICENSE.html or http://ckeditor.com/license
8 CKEDITOR.plugins.add( 'stylescombo',
10 requires : [ 'richcombo', 'styles' ],
12 init : function( editor )
14 var config = editor.config,
15 lang = editor.lang.stylesCombo,
20 function loadStylesSet( callback )
22 editor.getStylesSet( function( stylesDefinitions )
24 if ( !stylesList.length )
29 // Put all styles into an Array.
30 for ( var i = 0, count = stylesDefinitions.length ; i < count ; i++ )
32 var styleDefinition = stylesDefinitions[ i ];
34 styleName = styleDefinition.name;
36 style = styles[ styleName ] = new CKEDITOR.style( styleDefinition );
37 style._name = styleName;
38 style._.enterMode = config.enterMode;
40 stylesList.push( style );
43 // Sorts the Array, so the styles get grouped by type.
44 stylesList.sort( sortStyles );
47 callback && callback();
51 editor.ui.addRichCombo( 'Styles',
54 title : lang.panelTitle,
55 className : 'cke_styles',
59 css : editor.skin.editor.css.concat( config.contentsCss ),
61 attributes : { 'aria-label' : lang.panelTitle }
68 loadStylesSet( function()
77 // Loop over the Array, adding all items to the
79 for ( i = 0, count = stylesList.length ; i < count ; i++ )
81 style = stylesList[ i ];
82 styleName = style._name;
85 if ( type != lastType )
87 combo.startGroup( lang[ 'panelTitle' + String( type ) ] );
93 style.type == CKEDITOR.STYLE_OBJECT ? styleName : style.buildPreview(),
102 onClick : function( value )
105 editor.fire( 'saveSnapshot' );
107 var style = styles[ value ],
108 selection = editor.getSelection(),
109 elementPath = new CKEDITOR.dom.elementPath( selection.getStartElement() );
111 style[ style.checkActive( elementPath ) ? 'remove' : 'apply' ]( editor.document );
113 editor.fire( 'saveSnapshot' );
116 onRender : function()
118 editor.on( 'selectionChange', function( ev )
120 var currentValue = this.getValue(),
121 elementPath = ev.data.path,
122 elements = elementPath.elements;
124 // For each element into the elements path.
125 for ( var i = 0, count = elements.length, element ; i < count ; i++ )
127 element = elements[i];
129 // Check if the element is removable by any of
131 for ( var value in styles )
133 if ( styles[ value ].checkElementRemovable( element, true ) )
135 if ( value != currentValue )
136 this.setValue( value );
142 // If no styles match, just empty it.
150 if ( CKEDITOR.env.ie || CKEDITOR.env.webkit )
153 var selection = editor.getSelection(),
154 element = selection.getSelectedElement(),
155 elementPath = new CKEDITOR.dom.elementPath( element || selection.getStartElement() ),
156 counter = [ 0, 0, 0, 0 ];
160 for ( var name in styles )
162 var style = styles[ name ],
165 if ( style.checkActive( elementPath ) )
167 else if ( type == CKEDITOR.STYLE_OBJECT && !style.checkApplicable( elementPath ) )
169 this.hideItem( name );
176 if ( !counter[ CKEDITOR.STYLE_BLOCK ] )
177 this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_BLOCK ) ] );
179 if ( !counter[ CKEDITOR.STYLE_INLINE ] )
180 this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_INLINE ) ] );
182 if ( !counter[ CKEDITOR.STYLE_OBJECT ] )
183 this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_OBJECT ) ] );
186 // Force a reload of the data
191 delete combo._.panel;
193 combo._.committed = 0;
195 combo._.state = CKEDITOR.TRISTATE_OFF;
203 editor.on( 'instanceReady', function() { loadStylesSet(); } );
207 function sortStyles( styleA, styleB )
209 var typeA = styleA.type,
212 return typeA == typeB ? 0 :
213 typeA == CKEDITOR.STYLE_OBJECT ? -1 :
214 typeB == CKEDITOR.STYLE_OBJECT ? 1 :
215 typeB == CKEDITOR.STYLE_BLOCK ? 1 :