189 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			189 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved.
							 | 
						|||
| 
								 | 
							
								 * For licensing, see LICENSE.md or http://ckeditor.com/license
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								( function() {
							 | 
						|||
| 
								 | 
							
									'use strict';
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									CKEDITOR.plugins.add( 'stylescombo', {
							 | 
						|||
| 
								 | 
							
										requires: 'richcombo',
							 | 
						|||
| 
								 | 
							
										lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE%
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										init: function( editor ) {
							 | 
						|||
| 
								 | 
							
											var config = editor.config,
							 | 
						|||
| 
								 | 
							
												lang = editor.lang.stylescombo,
							 | 
						|||
| 
								 | 
							
												styles = {},
							 | 
						|||
| 
								 | 
							
												stylesList = [],
							 | 
						|||
| 
								 | 
							
												combo,
							 | 
						|||
| 
								 | 
							
												allowedContent = [];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											editor.on( 'stylesSet', function( evt ) {
							 | 
						|||
| 
								 | 
							
												var stylesDefinitions = evt.data.styles;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												if ( !stylesDefinitions )
							 | 
						|||
| 
								 | 
							
													return;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												var style, styleName;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												// Put all styles into an Array.
							 | 
						|||
| 
								 | 
							
												for ( var i = 0, count = stylesDefinitions.length; i < count; i++ ) {
							 | 
						|||
| 
								 | 
							
													var styleDefinition = stylesDefinitions[ i ];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													if ( editor.blockless && ( styleDefinition.element in CKEDITOR.dtd.$block ) )
							 | 
						|||
| 
								 | 
							
														continue;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													styleName = styleDefinition.name;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													style = new CKEDITOR.style( styleDefinition );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													if ( !editor.filter.customConfig || editor.filter.check( style ) ) {
							 | 
						|||
| 
								 | 
							
														style._name = styleName;
							 | 
						|||
| 
								 | 
							
														style._.enterMode = config.enterMode;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														// Weight is used to sort styles (#9029).
							 | 
						|||
| 
								 | 
							
														style._.weight = i + ( style.type == CKEDITOR.STYLE_OBJECT ? 1 : style.type == CKEDITOR.STYLE_BLOCK ? 2 : 3 ) * 1000;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														styles[ styleName ] = style;
							 | 
						|||
| 
								 | 
							
														stylesList.push( style );
							 | 
						|||
| 
								 | 
							
														allowedContent.push( style );
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												// Sorts the Array, so the styles get grouped by type in proper order (#9029).
							 | 
						|||
| 
								 | 
							
												stylesList.sort( function( styleA, styleB ) { return styleA._.weight - styleB._.weight; } );
							 | 
						|||
| 
								 | 
							
											} );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											editor.ui.addRichCombo( 'Styles', {
							 | 
						|||
| 
								 | 
							
												label: lang.label,
							 | 
						|||
| 
								 | 
							
												title: lang.panelTitle,
							 | 
						|||
| 
								 | 
							
												toolbar: 'styles,10',
							 | 
						|||
| 
								 | 
							
												allowedContent: allowedContent,
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												panel: {
							 | 
						|||
| 
								 | 
							
													css: [ CKEDITOR.skin.getPath( 'editor' ) ].concat( config.contentsCss ),
							 | 
						|||
| 
								 | 
							
													multiSelect: true,
							 | 
						|||
| 
								 | 
							
													attributes: { 'aria-label': lang.panelTitle }
							 | 
						|||
| 
								 | 
							
												},
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												init: function() {
							 | 
						|||
| 
								 | 
							
													var style, styleName, lastType, type, i, count;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													// Loop over the Array, adding all items to the
							 | 
						|||
| 
								 | 
							
													// combo.
							 | 
						|||
| 
								 | 
							
													for ( i = 0, count = stylesList.length; i < count; i++ ) {
							 | 
						|||
| 
								 | 
							
														style = stylesList[ i ];
							 | 
						|||
| 
								 | 
							
														styleName = style._name;
							 | 
						|||
| 
								 | 
							
														type = style.type;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														if ( type != lastType ) {
							 | 
						|||
| 
								 | 
							
															this.startGroup( lang[ 'panelTitle' + String( type ) ] );
							 | 
						|||
| 
								 | 
							
															lastType = type;
							 | 
						|||
| 
								 | 
							
														}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														this.add( styleName, style.type == CKEDITOR.STYLE_OBJECT ? styleName : style.buildPreview(), styleName );
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													this.commit();
							 | 
						|||
| 
								 | 
							
												},
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												onClick: function( value ) {
							 | 
						|||
| 
								 | 
							
													editor.focus();
							 | 
						|||
| 
								 | 
							
													editor.fire( 'saveSnapshot' );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													var style = styles[ value ],
							 | 
						|||
| 
								 | 
							
														elementPath = editor.elementPath();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													editor[ style.checkActive( elementPath ) ? 'removeStyle' : 'applyStyle' ]( style );
							 | 
						|||
| 
								 | 
							
													editor.fire( 'saveSnapshot' );
							 | 
						|||
| 
								 | 
							
												},
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												onRender: function() {
							 | 
						|||
| 
								 | 
							
													editor.on( 'selectionChange', function( ev ) {
							 | 
						|||
| 
								 | 
							
														var currentValue = this.getValue(),
							 | 
						|||
| 
								 | 
							
															elementPath = ev.data.path,
							 | 
						|||
| 
								 | 
							
															elements = elementPath.elements;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														// For each element into the elements path.
							 | 
						|||
| 
								 | 
							
														for ( var i = 0, count = elements.length, element; i < count; i++ ) {
							 | 
						|||
| 
								 | 
							
															element = elements[ i ];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
															// Check if the element is removable by any of
							 | 
						|||
| 
								 | 
							
															// the styles.
							 | 
						|||
| 
								 | 
							
															for ( var value in styles ) {
							 | 
						|||
| 
								 | 
							
																if ( styles[ value ].checkElementRemovable( element, true ) ) {
							 | 
						|||
| 
								 | 
							
																	if ( value != currentValue )
							 | 
						|||
| 
								 | 
							
																		this.setValue( value );
							 | 
						|||
| 
								 | 
							
																	return;
							 | 
						|||
| 
								 | 
							
																}
							 | 
						|||
| 
								 | 
							
															}
							 | 
						|||
| 
								 | 
							
														}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														// If no styles match, just empty it.
							 | 
						|||
| 
								 | 
							
														this.setValue( '' );
							 | 
						|||
| 
								 | 
							
													}, this );
							 | 
						|||
| 
								 | 
							
												},
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												onOpen: function() {
							 | 
						|||
| 
								 | 
							
													var selection = editor.getSelection(),
							 | 
						|||
| 
								 | 
							
														element = selection.getSelectedElement(),
							 | 
						|||
| 
								 | 
							
														elementPath = editor.elementPath( element ),
							 | 
						|||
| 
								 | 
							
														counter = [ 0, 0, 0, 0 ];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													this.showAll();
							 | 
						|||
| 
								 | 
							
													this.unmarkAll();
							 | 
						|||
| 
								 | 
							
													for ( var name in styles ) {
							 | 
						|||
| 
								 | 
							
														var style = styles[ name ],
							 | 
						|||
| 
								 | 
							
															type = style.type;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														if ( style.checkApplicable( elementPath, editor.activeFilter ) )
							 | 
						|||
| 
								 | 
							
															counter[ type ]++;
							 | 
						|||
| 
								 | 
							
														else
							 | 
						|||
| 
								 | 
							
															this.hideItem( name );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														if ( style.checkActive( elementPath ) )
							 | 
						|||
| 
								 | 
							
															this.mark( name );
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													if ( !counter[ CKEDITOR.STYLE_BLOCK ] )
							 | 
						|||
| 
								 | 
							
														this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_BLOCK ) ] );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													if ( !counter[ CKEDITOR.STYLE_INLINE ] )
							 | 
						|||
| 
								 | 
							
														this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_INLINE ) ] );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													if ( !counter[ CKEDITOR.STYLE_OBJECT ] )
							 | 
						|||
| 
								 | 
							
														this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_OBJECT ) ] );
							 | 
						|||
| 
								 | 
							
												},
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												refresh: function() {
							 | 
						|||
| 
								 | 
							
													var elementPath = editor.elementPath();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													if ( !elementPath )
							 | 
						|||
| 
								 | 
							
														return;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													for ( var name in styles ) {
							 | 
						|||
| 
								 | 
							
														var style = styles[ name ];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														if ( style.checkApplicable( elementPath, editor.activeFilter ) )
							 | 
						|||
| 
								 | 
							
															return;
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													this.setState( CKEDITOR.TRISTATE_DISABLED );
							 | 
						|||
| 
								 | 
							
												},
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												// Force a reload of the data
							 | 
						|||
| 
								 | 
							
												reset: function() {
							 | 
						|||
| 
								 | 
							
													if ( combo ) {
							 | 
						|||
| 
								 | 
							
														delete combo._.panel;
							 | 
						|||
| 
								 | 
							
														delete combo._.list;
							 | 
						|||
| 
								 | 
							
														combo._.committed = 0;
							 | 
						|||
| 
								 | 
							
														combo._.items = {};
							 | 
						|||
| 
								 | 
							
														combo._.state = CKEDITOR.TRISTATE_OFF;
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													styles = {};
							 | 
						|||
| 
								 | 
							
													stylesList = [];
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											} );
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									} );
							 | 
						|||
| 
								 | 
							
								} )();
							 |