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 = []; | |||
|  | 				} | |||
|  | 			} ); | |||
|  | 		} | |||
|  | 	} ); | |||
|  | } )(); |