<?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:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="0xffffff" resize="handleResize()">
	
	<mx:Script>
		<![CDATA[
		import flashx.textLayout.elements.TextFlow;
		import flashx.textLayout.compose.StandardFlowComposer;
		import flashx.textLayout.container.ContainerController;
		import textEditBar.SpriteWithIME;
		
		
		private var _activeFlow:TextFlow;
		
		public function changeContainerSetup(newActiveFlow:TextFlow):void
 		{
 			_activeFlow = newActiveFlow;
 			if (_activeFlow)
 			{
 				if (!_activeFlow.flowComposer)
 					_activeFlow.flowComposer = new StandardFlowComposer();
 				if (_activeFlow.flowComposer.numControllers < 1)
 					_activeFlow.flowComposer.addController(new ContainerController(new SpriteWithIME()));
				rawChildren.addChild(_activeFlow.flowComposer.getControllerAt(0).container);	
				handleResize();
 			}
  		}
 		
		public function handleResize():void
		{
			if (!_activeFlow)
				return;
				
			var newFrameWidth:Number = width;
			var newFrameHeight:Number = height;

			var cont:ContainerController = _activeFlow.flowComposer.getControllerAt(0);
			if (cont.container)
				updateFrameDimensions(cont,0,0,newFrameWidth,newFrameHeight);

			_activeFlow.flowComposer.updateAllControllers();
				
			if (_activeFlow.interactionManager && _activeFlow.interactionManager.hasSelection())
				_activeFlow.flowComposer.getControllerAt(0).scrollToRange(_activeFlow.interactionManager.activePosition,_activeFlow.interactionManager.anchorPosition);	

		}
				
 		/** helper function to update a frame's dimensions */
 		private function updateFrameDimensions(controller:ContainerController,x:Number,y:Number,w:Number,h:Number):void
 		{
 			var tc:DisplayObject = controller.container;
 			
   			if (tc.x != x)
 				tc.x = x;
 			if (tc.y != y)
 				tc.y = y;
			controller.setCompositionSize(w,h);
 		}
 		
		]]>
	</mx:Script>
</mx:Canvas>
