<?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:Application 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:modules="modules.*"
			   minWidth="955" minHeight="600"
			   applicationComplete="application1_applicationCompleteHandler(event)" xmlns:utils="com.flexcapacitor.utils.*">
	
	<!--
	TODO:
	
	- Add Add new perspective
	- Add switch perspective
	- Add delete perspective
	- Add start docked
	- Add Mini Inspector cmd click
	- Add selector 
	
	-->
	
	
	<fx:Script>
		<![CDATA[
			import mx.events.FlexEvent;
			import mx.managers.PopUpManager;
			
			import spark.components.Group;
			import spark.components.TitleContainer;
			import spark.components.TitleWindow;PopUpManager;
			
			
			public static const FLOATING_TEXT:String = "Floating";
			public static const DOCKED_TEXT:String = "Docked";
			
			public var popup:Group;
			public var titleWindow:TitleWindow;
			public var dropRectangle:Group;
			
			protected function button1_clickHandler(event:MouseEvent):void {
				var newTitleContainer:TitleContainer = new TitleContainer();
				newTitleContainer.showInspector();
			}
			
			protected function application1_applicationCompleteHandler(event:FlexEvent):void {
				var newTitleContainer:TitleContainer = new TitleContainer();
				newTitleContainer.showInspector();
				
				//showInspector();
				newTitleContainer.setDocked(true);
			}
		]]>
	</fx:Script>
	
	
	<fx:Declarations>
		<modules:InspectorContainer clearSharedObject="false"/>
		<utils:MiniInspector />
	</fx:Declarations>
	
	<s:Button left="50" top="50" label="Get Thing" click="button1_clickHandler(event)"/>
	
</s:Application>
