////////////////////////////////////////////////////////////////////////////////
//
//  Licensed to the Apache Software Foundation (ASF) under one or more
//  contributor license agreements.  See the NOTICE file distributed with
//  this work for additional information regarding copyright ownership.
//  The ASF licenses this file to You under the Apache License, Version 2.0
//  (the "License"); you may not use this file except in compliance with
//  the License.  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package flashx.textLayout.operations
{
	import flashx.textLayout.debug.assert;
	import flashx.textLayout.edit.SelectionState;
	import flashx.textLayout.elements.ContainerFormattedElement;
	import flashx.textLayout.elements.FlowElement;
	import flashx.textLayout.elements.FlowGroupElement;
	import flashx.textLayout.elements.ParagraphFormattedElement;
	import flashx.textLayout.elements.TextFlow;

	import flashx.textLayout.tlf_internal;

	use namespace tlf_internal;
	
	[Deprecated(replacement="ApplyFormatToElementOperation", deprecatedSince="2.0")]
	/**
	 * The ApplyElementUserStyleOperation class encapsulates a change in a style value of an element.
	 *
	 * @see flashx.textLayout.elements.FlowElement#userStyles
	 * @see flashx.textLayout.edit.EditManager
	 * @see flashx.textLayout.events.FlowOperationEvent
	 * 
	 * @playerversion Flash 10
	 * @playerversion AIR 1.5
	 * @langversion 3.0 
	 */
	public class ApplyElementUserStyleOperation extends FlowElementOperation
	{	
		private var _styleName:String;
		
		private var _origValue:*;
		private var _newValue:*;
		
		/** 
		 * Creates a ApplyElementUserStyleOperation object.
		 * 
		 * <p>If the <code>relativeStart</code> and <code>relativeEnd</code> parameters are set, then the existing
		 * element is split into multiple elements, the selected portion using the new 
		 * style value and the rest using the existing style value.</p>
		 * 
		 * @param operationState Describes the range of text to style.
		 * @param targetElement Specifies the element to change.
		 * @param styleName The name of the style to change.
		 * @param value The new style value.
		 * @param relativeStart An offset from the beginning of the target element.
		 * @param relativeEnd An offset from the end of the target element.
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
	 	 * @langversion 3.0 
		*/
		public function ApplyElementUserStyleOperation(operationState:SelectionState, targetElement:FlowElement, styleName:String, value:*, relativeStart:int = 0, relativeEnd:int = -1)
		{
			_styleName = styleName;
			_newValue = value;
			
			super(operationState,targetElement,relativeStart,relativeEnd);
		}
		
		/** 
		 * The name of the style changed. 
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
	 	 * @langversion 3.0 
		 */
		public function get styleName():String
		{ return _styleName; }
		public function set styleName(val:String):void
		{ _styleName = val; }
		
		/** 
		 * The new style value.
		 * 
		 * @playerversion Flash 10
		 * @playerversion AIR 1.5
	 	 * @langversion 3.0 
		 */
		public function get newValue():*
		{ return _newValue; }
		public function set newValue(val:*):void
		{ _newValue = val; }

		/** @private */
		public override function doOperation():Boolean
		{
			var targetElement:FlowElement = getTargetElement();
			_origValue = targetElement.getStyle(_styleName);
			
			adjustForDoOperation(targetElement);
			
			targetElement.setStyle(_styleName,_newValue);
			return true;
		}	
		
		/** @private */
		public override function undo():SelectionState
		{
			var targetElement:FlowElement = getTargetElement();
			targetElement.setStyle(_styleName,_origValue);
			
			adjustForUndoOperation(targetElement);
			
			return originalSelectionState;
		}
	}
}