package 
{
	//import com.example.programmingas3.filterWorkbench.ColorStringFormatter;
	//import com.example.programmingas3.filterWorkbench.IFilterFactory;
	
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.filters.BitmapFilter;
	import flash.filters.DropShadowFilter;
	
	// ------- Events -------
	[Event(name="change", type="flash.events.Event")]
	
	
	public class actionscript_book_FilterWorkbench_com_example_programmingas3_filterWorkbench_DropShadowFactory extends EventDispatcher implements actionscript_book_FilterWorkbench_com_example_programmingas3_filterWorkbench_IFilterFactory
	{
		// ------- Private vars -------
		private var _filter:DropShadowFilter;
		private var _paramString:String;
		
		
		// ------- Constructor -------
		public function actionscript_book_FilterWorkbench_com_example_programmingas3_filterWorkbench_DropShadowFactory(distance:Number = 4,
											angle:Number = 45,
											color:uint = 0x000000,
											alpha:Number = 1,
											blurX:Number = 4,
											blurY:Number = 4,
											strength:Number = 1,
											quality:int = 1,
											inner:Boolean = false,
											knockout:Boolean = false,
											hideObject:Boolean = false)
		{
			_filter = new DropShadowFilter(distance, angle, color, alpha, blurX, blurY, strength, quality, inner, knockout, hideObject);
			_paramString = buildParamString(distance, angle, color, alpha, blurX, blurY, strength, quality, inner, knockout, hideObject);
		}
		
		
		// ------- IFilterFactory implementation -------
		public function getFilter():BitmapFilter
		{
			return _filter;
		}
		
		
		public function getCode():String
		{
			var result:String = "";
			result += "import flash.filters.BitmapFilterQuality;\n";
			result += "import flash.filters.DropShadowFilter;\n";
			result += "\n";
			result += "var dropShadow:DropShadowFilter;\n";
			result += "dropShadow = new DropShadowFilter(" + _paramString + ");\n";
			result += "\n";
			result += "myDisplayObject.filters = [dropShadow];";
			return result;
		}
		
		
		// ------- Public methods -------
		public function modifyFilter(distance:Number = 4,
									   angle:Number = 45,
									   color:uint = 0x000000,
									   alpha:Number = 1,
									   blurX:Number = 4,
									   blurY:Number = 4,
									   strength:Number = 1,
									   quality:int = 1,
									   inner:Boolean = false,
									   knockout:Boolean = false,
									   hideObject:Boolean = false):void
		{
			_filter = new DropShadowFilter(distance, angle, color, alpha, blurX, blurY, strength, quality, inner, knockout, hideObject);
			_paramString = buildParamString(distance, angle, color, alpha, blurX, blurY, strength, quality, inner, knockout, hideObject);
			dispatchEvent(new Event(Event.CHANGE));
		}
		
		
		// ------- Private methods -------
		private function buildParamString(distance:Number,
											angle:Number,
											color:uint,
											alpha:Number,
											blurX:Number,
											blurY:Number,
											strength:Number,
											quality:int,
											inner:Boolean,
											knockout:Boolean,
											hideObject:Boolean):String
		{
			var result:String = "\n\t\t\t" + distance.toString() + ",\n\t\t\t" + angle.toString() + ",\n\t\t\t";
			result += actionscript_book_FilterWorkbench_com_example_programmingas3_filterWorkbench_ColorStringFormatter.formatColorHex24(color) + ",\n\t\t\t" + alpha.toString() + ",\n\t\t\t";
			result += blurX.toString() + ",\n\t\t\t" + blurY.toString() + ",\n\t\t\t" + strength.toString() + ",\n\t\t\t";
			
			switch (quality)
			{
				case 1:
					result += "BitmapFilterQuality.LOW";
					break;
				case 2:
					result += "BitmapFilterQuality.MEDIUM";
					break;
				case 3:
					result += "BitmapFilterQuality.HIGH";
					break;
			}
			
			result += ",\n\t\t\t";
			
			result += inner.toString() + ",\n\t\t\t" + knockout.toString() + ",\n\t\t\t" + hideObject.toString();
			
			return result;
		}
	}
}