////////////////////////////////////////////////////////////////////////////////
//
//  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.
//
////////////////////////////////////////////////////////////////////////////////
package UnitTest.Tests
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	
	import flashx.textLayout.container.*;
	import flashx.textLayout.elements.*;
	import flashx.textLayout.elements.SpanElement;
	import flashx.textLayout.events.TextLayoutEvent;
	import flashx.textLayout.formats.*;
	import flashx.textLayout.formats.BreakStyle;
	

	[SWF(width="1200", height="500")]

	public class ColumnContainerBreak extends Sprite 
	{
		public var textFlow:TextFlow = new TextFlow();
		
		public function ColumnContainerBreak(columnWidth:int, textLayoutFmt1:TextLayoutFormat, textLayoutFmt2:TextLayoutFormat, textLayoutFmt3:TextLayoutFormat)
		{
			/*
			TextFlow.hostFormat        -> textLayoutFormat
			DivElement.format          -> autoFmt
			ListElement.format         -> alwaysFmt
			ListItemElement123.format  -> inheritFmt
			ParagraphElement123.format -> inheritFmt
			
			TextFlow.addController -> Sprite123(container123)  
			
			TextFlow -> ListElement -> ListItemElement123 -> ParagraphElement123 
			*/
			
			var para1String:String = "STR1ColBB " + textLayoutFmt1.columnBreakBefore 
				+ "ColBA " + textLayoutFmt1.columnBreakAfter
				+ "ConBB " + textLayoutFmt1.containerBreakBefore
				+ "ConBA " + textLayoutFmt1.containerBreakAfter;
			var para2String:String = "STR2ColBB " + textLayoutFmt2.columnBreakBefore 
				+ "ColBA " + textLayoutFmt2.columnBreakAfter
				+ "ConBB " + textLayoutFmt2.containerBreakBefore
				+ "ConBA " + textLayoutFmt2.containerBreakAfter;
			var para3String:String = "STR3ColBB " + textLayoutFmt3.columnBreakBefore 
				+ "ColBA " + textLayoutFmt3.columnBreakAfter
				+ "ConBB " + textLayoutFmt3.containerBreakBefore
				+ "ConBA " + textLayoutFmt3.containerBreakAfter;
			
			
			var listElement:ListElement = new ListElement() ;
			var listItemElement1:ListItemElement = new ListItemElement() ;
			var listItemElement2:ListItemElement = new ListItemElement() ;
			var listItemElement3:ListItemElement = new ListItemElement() ;
			
			var paragraph1:ParagraphElement = new ParagraphElement();
			var paragraph2:ParagraphElement = new ParagraphElement();
			var paragraph3:ParagraphElement = new ParagraphElement();
			
			var spanElement:SpanElement = new SpanElement();
			
			spanElement.text = para1String;
			paragraph1.addChild(spanElement);
			
			spanElement = new SpanElement() ;
			spanElement.text = para2String;
			paragraph2.addChild(spanElement) ;

			spanElement = new SpanElement() ;
			spanElement.text = para3String ;
			paragraph3.addChild(spanElement) ;

	
			listItemElement1.addChild(paragraph1) ;
			listItemElement2.addChild(paragraph2) ;
			listItemElement3.addChild(paragraph3) ;
			listElement.addChild(listItemElement1) ;
			listElement.addChild(listItemElement2) ;
			listElement.addChild(listItemElement3) ;
			
			textFlow.addChild(listElement) ;
			
			var textLayoutFormat:TextLayoutFormat = new TextLayoutFormat();
			textLayoutFormat.fontSize = 12;
			textLayoutFormat.textIndent = 10;
			textLayoutFormat.paragraphSpaceAfter = 5;
			textLayoutFormat.columnCount = 3 ;
			textLayoutFormat.fontFamily="Arial" ;
			textFlow.hostFormat = textLayoutFormat;

			paragraph1.format = textLayoutFmt1 ;
			paragraph2.format = textLayoutFmt2 ;
			paragraph3.format = textLayoutFmt3 ;
						
			if (stage)
			{
				stage.align = StageAlign.TOP_LEFT;
				stage.scaleMode = StageScaleMode.NO_SCALE;				
			}
			
			var sprite1:Sprite = new Sprite() ;
			var sprite2:Sprite = new Sprite() ;
			var sprite3:Sprite = new Sprite() ;
			
			addChild(sprite1) ;
			addChild(sprite2) ;
			addChild(sprite3) ;
			
			textFlow.flowComposer.addController(new ContainerController(sprite1, columnWidth, columnWidth)) ;
			sprite1.graphics.beginFill(0xf0f0a0) ;
			sprite1.graphics.drawRect(0, 0, columnWidth, columnWidth) ;
			sprite1.graphics.endFill() ;	
			sprite1.x = 0 ;
			sprite1.y = 0 ;

			textFlow.flowComposer.addController(new ContainerController(sprite2, columnWidth, columnWidth)) ;
			sprite2.graphics.beginFill(0xa0d0f0) ;
			sprite2.graphics.drawRect(0, 0, columnWidth, columnWidth) ;
			sprite2.graphics.endFill() ;	
			sprite2.x = sprite1.x + sprite1.width ;
			sprite2.y = 0 ;

			textFlow.flowComposer.addController(new ContainerController(sprite3, columnWidth, columnWidth)) ;
			sprite3.graphics.beginFill(0xf0d0d0) ;
			sprite3.graphics.drawRect(0, 0, columnWidth, columnWidth) ;
			sprite3.graphics.endFill() ;	
			sprite3.x = sprite2.x + sprite2.width ;
			sprite3.y = 0 ;
			
			textFlow.flowComposer.updateAllControllers() ;
			
		}
		
		
	}
}