<?xml version="1.0" encoding="utf-8"?>
<!--

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.

-->
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
		 xmlns:s="library://ns.adobe.com/flex/spark" 
		 xmlns:mx="library://ns.adobe.com/flex/mx" 
		 xmlns:c="com.flexcapacitor.controls.*"
		 
		 creationComplete="group1_creationCompleteHandler(event)">
	
	
	<!-- 
	
	-->
	<fx:Script>
		<![CDATA[
			import com.flexcapacitor.controller.Radiate;
			import com.flexcapacitor.events.RadiateEvent;
			import com.flexcapacitor.tools.ITool;
			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
			
			import mx.core.UIComponent;
			import mx.events.FlexEvent;
			
			/**
			 * Reference to Radiate
			 * */
			public var radiate:Radiate;
			
			public var componentDescription:ComponentDescription;

			private var _tool:ITool;
			
			public function get tool():ITool {
				return _tool;
			}
			
			[Bindable]
			public function set tool(value:ITool):void {
				
				_tool = value;
				
				if (_tool) {
					
				}
				else {
					
				}
			}
			
			protected function group1_creationCompleteHandler(event:FlexEvent):void {
				radiate = Radiate.getInstance();
				radiate.addEventListener(RadiateEvent.TOOL_CHANGE, handleToolChange);
				
				if (radiate.selectedTool) {
					updateTool(radiate.selectedTool);
				}
			}
			
			protected function handleToolChange(event:RadiateEvent):void {
				
				updateTool(event.tool);
			}
			
			
			public function updateTool(newTool:ITool):void {
				var inspectorInstance:UIComponent;
				
				if (tool!=newTool) {
					removeAllElements();
				}
				
				tool = newTool;
				
				if (tool) {
					componentDescription = Radiate.getInstance().getToolDescription(tool);
					inspectorInstance = componentDescription.getInspectorInstance();
					
					if (inspectorInstance) {
						addElement(inspectorInstance);
					}
				}
			}
		]]>
	</fx:Script>
	
	
</s:Group>