<?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.
-->
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:textEditBar="textEditBar.*" 
	addedToStage="onAddedToStage()" removedFromStage="onRemovedFromStage()"
	horizontalScrollPolicy="off" verticalScrollPolicy="off" xmlns:ns="library://ns.adobe.com/flex/mx">
	<mx:Metadata>
		<!-- event generated by this component -->
		[Event(name="containerPropsChange", type="textEditBar.MultiContainerChangeEvent")]
		
		<!-- undocumented -->
		[DefaultTriggerEvent("containerPropsChange")]

	</mx:Metadata>
	
	<mx:Script>
		<![CDATA[
			import mx.events.MenuEvent;
			import flashx.textLayout.edit.ElementRange;
			import flashx.textLayout.elements.TextFlow;
			
			[Bindable]
			private var linkList:Array = [
				{ label:"1"},
				{ label:"2"},
				{ label:"3"},
				{ label:"4"},
				{ label:"5"}
			];
			
			public var activeFlow:TextFlow;
			
			[Bindable]
			private var arrangeList:Array = [
				{ label:"ViewStack", data:MultiContainerChangeEvent.ARRANGE_AS_VIEWSTACK},
				{ label:"SideBySide",data:MultiContainerChangeEvent.ARRANGE_SIDE_BY_SIDE}
			];
			
			private var onStage:Boolean = false;
		    private var addedFrameEventListener:Boolean = false;
			private function onAddedToStage():void
			{
				// the dataProviders aren't set up yet - delay to the frame
				onStage = true;
				if (!addedFrameEventListener)
				{
					addedFrameEventListener = true;
					addEventListener("enterFrame",onEnterFrame);
				}
			}
				
			private var numContainersValue:int = -1;
			private var arrangementValue:String = null;
			private var visibleContainerValue:int = -1;
			
			private function onEnterFrame(p:Event):void
			{
				this.removeEventListener("enterFrame",onEnterFrame);
				addedFrameEventListener = false;
				
				var lcv:int = numContainersValue;
				var av:String = arrangementValue;
				var vcv:int = visibleContainerValue;
				numContainersValue = -1;
				arrangementValue = null;
				visibleContainerValue = -1;
				updateControllerProps(lcv,av,vcv);				
			}
			
			private function onRemovedFromStage():void
			{
				onStage = false;
			}
			
			private function dataChangedHandler():void
			{
				var numContainers:int = int(linkComboBox.text);
				var arrangeType:String = arrangeList[arrangeBox.selectedIndex].data;
				var indexStr:String = visibleComboBox.text;
				var visibleIndex:int = int(visibleComboBox.text);
				dispatchEvent(new MultiContainerChangeEvent(MultiContainerChangeEvent.CONTAINER_PROPS_CHANGE,numContainers,arrangeType,visibleIndex));
			}
			
			private function drawBoundsChangedHandler():void
			{
				var dataEvent:DataEvent = new DataEvent(MultiContainerChangeEvent.CONTAINER_DRAW_BOUNDS_CHANGE);
				dataEvent.data = showContentBounds.selected ? "true" : "false";
				dispatchEvent(dataEvent);
			}
			
			// Dummy function - can't get controller prorties from active flow
			public function update(range:ElementRange):void
			{
				
			}
			public function updateControllerProps(numContainers:int,arrangement:String,visibleContainer:int):void
			{
				if (onStage)
				{
					linkComboBox.text = numContainers.toString();
					visibleComboBox.text = visibleContainer.toString();
					
					var idx:int = 0;
					for (idx = 0; idx < arrangeList.length; idx++)
					{
						var obj:Object = arrangeList[idx];
						if (obj.data == arrangement)
						{
							arrangeBox.selectedIndex = idx;
							break;
						}
					}
				}
				
				numContainersValue = numContainers;
				arrangementValue = arrangement;
				visibleContainerValue = visibleContainer;
				
			}			
		]]>
	</mx:Script>

	<mx:Label text="NumContainers:" fontWeight="bold"/>
	<mx:ComboBox id="linkComboBox" dataProvider="{linkList}" enter="dataChangedHandler()" close="dataChangedHandler()" width="60" editable="true" selectedIndex="-1"/>
	<mx:ComboBox id="arrangeBox"   dataProvider="{arrangeList}" enter="dataChangedHandler()" close="dataChangedHandler()" selectedIndex="-1"/>
	<mx:Label text="VisibleContainer:" fontWeight="bold"/>
	<mx:ComboBox id="visibleComboBox" dataProvider="{linkList}" enter="dataChangedHandler()" close="dataChangedHandler()" width="60" editable="true" selectedIndex="-1"/>
	<ns:CheckBox id="showContentBounds" valueCommit="drawBoundsChangedHandler()" label="Show Content Bounds"/>
	 
</mx:HBox>
