2 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license
\r
8 CKEDITOR.plugins.add( 'stylescombo',
\r
10 requires : [ 'richcombo', 'styles' ],
\r
12 init : function( editor )
\r
14 var config = editor.config,
\r
15 lang = editor.lang.stylesCombo,
\r
19 function loadStylesSet( callback )
\r
21 editor.getStylesSet( function( stylesDefinitions )
\r
23 if ( !stylesList.length )
\r
28 // Put all styles into an Array.
\r
29 for ( var i = 0 ; i < stylesDefinitions.length ; i++ )
\r
31 var styleDefinition = stylesDefinitions[ i ];
\r
33 styleName = styleDefinition.name;
\r
35 style = styles[ styleName ] = new CKEDITOR.style( styleDefinition );
\r
36 style._name = styleName;
\r
37 style._.enterMode = config.enterMode;
\r
39 stylesList.push( style );
\r
42 // Sorts the Array, so the styles get grouped by type.
\r
43 stylesList.sort( sortStyles );
\r
46 callback && callback();
\r
50 editor.ui.addRichCombo( 'Styles',
\r
53 title : lang.panelTitle,
\r
54 className : 'cke_styles',
\r
58 css : editor.skin.editor.css.concat( config.contentsCss ),
\r
60 attributes : { 'aria-label' : lang.panelTitle }
\r
67 loadStylesSet( function()
\r
69 var style, styleName;
\r
71 // Loop over the Array, adding all items to the
\r
74 for ( var i = 0 ; i < stylesList.length ; i++ )
\r
76 style = stylesList[ i ];
\r
77 styleName = style._name;
\r
79 var type = style.type;
\r
81 if ( type != lastType )
\r
83 combo.startGroup( lang[ 'panelTitle' + String( type ) ] );
\r
89 style.type == CKEDITOR.STYLE_OBJECT ? styleName : style.buildPreview(),
\r
99 onClick : function( value )
\r
102 editor.fire( 'saveSnapshot' );
\r
104 var style = styles[ value ],
\r
105 selection = editor.getSelection();
\r
107 var elementPath = new CKEDITOR.dom.elementPath( selection.getStartElement() );
\r
109 if ( style.type == CKEDITOR.STYLE_INLINE && style.checkActive( elementPath ) )
\r
110 style.remove( editor.document );
\r
111 else if ( style.type == CKEDITOR.STYLE_OBJECT && style.checkActive( elementPath ) )
\r
112 style.remove( editor.document );
\r
114 style.apply( editor.document );
\r
116 editor.fire( 'saveSnapshot' );
\r
119 onRender : function()
\r
121 editor.on( 'selectionChange', function( ev )
\r
123 var currentValue = this.getValue();
\r
125 var elementPath = ev.data.path,
\r
126 elements = elementPath.elements;
\r
128 // For each element into the elements path.
\r
129 for ( var i = 0, element ; i < elements.length ; i++ )
\r
131 element = elements[i];
\r
133 // Check if the element is removable by any of
\r
135 for ( var value in styles )
\r
137 if ( styles[ value ].checkElementRemovable( element, true ) )
\r
139 if ( value != currentValue )
\r
140 this.setValue( value );
\r
146 // If no styles match, just empty it.
\r
147 this.setValue( '' );
\r
152 onOpen : function()
\r
154 if ( CKEDITOR.env.ie || CKEDITOR.env.webkit )
\r
157 var selection = editor.getSelection();
\r
159 var element = selection.getSelectedElement(),
\r
160 elementPath = new CKEDITOR.dom.elementPath( element || selection.getStartElement() );
\r
162 var counter = [ 0, 0, 0, 0 ];
\r
165 for ( var name in styles )
\r
167 var style = styles[ name ],
\r
170 if ( style.checkActive( elementPath ) )
\r
172 else if ( type == CKEDITOR.STYLE_OBJECT && !style.checkApplicable( elementPath ) )
\r
174 this.hideItem( name );
\r
181 if ( !counter[ CKEDITOR.STYLE_BLOCK ] )
\r
182 this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_BLOCK ) ] );
\r
184 if ( !counter[ CKEDITOR.STYLE_INLINE ] )
\r
185 this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_INLINE ) ] );
\r
187 if ( !counter[ CKEDITOR.STYLE_OBJECT ] )
\r
188 this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_OBJECT ) ] );
\r
192 editor.on( 'instanceReady', function() { loadStylesSet(); } );
\r
196 function sortStyles( styleA, styleB )
\r
198 var typeA = styleA.type,
\r
199 typeB = styleB.type;
\r
201 return typeA == typeB ? 0 :
\r
202 typeA == CKEDITOR.STYLE_OBJECT ? -1 :
\r
203 typeB == CKEDITOR.STYLE_OBJECT ? 1 :
\r
204 typeB == CKEDITOR.STYLE_BLOCK ? 1 :
\r