package com.asawilliams { import flash.display.DisplayObject; import mx.containers.Canvas; import mx.controls.Label; [DefaultProperty("children")] public class FieldSetContainer extends Canvas { protected var titleLabel:Label; private var dataChanged:Boolean = false; private var _title:String = ""; public function set title(value:String):void { _title = value; dataChanged = true; invalidateProperties(); } private var _childrenChanged:Boolean = false; private var _children:Array = []; public function set children(value:*):void { if( value is DisplayObject ) _children = [ value ]; else _children = value; _childrenChanged = true; invalidateDisplayList(); } public function FieldSetContainer() { super(); } override protected function commitProperties():void { super.commitProperties(); if(dataChanged) { dataChanged = false; titleLabel.text = _title; invalidateDisplayList(); } } override protected function createChildren():void { super.createChildren(); titleLabel = new Label(); titleLabel.x = 10; titleLabel.y = 0; titleLabel.setStyle("color", 0x333333); titleLabel.setStyle("paddingRight", 7); titleLabel.text = _title; addChild(titleLabel); } override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { super.updateDisplayList(unscaledWidth, unscaledHeight); if(_childrenChanged) { _childrenChanged = false; var index:uint = 1; for each(var child:DisplayObject in _children) { child.y += titleLabel.measuredHeight; child.x += 1; this.addChildAt(child, index); index++; } } createBorders(unscaledWidth, unscaledHeight); } protected function createBorders(width:Number, height:Number):void { var borderTopY:uint = titleLabel.height/2; this.graphics.clear(); this.graphics.lineStyle(1, 0x858585); this.graphics.moveTo(7, borderTopY); this.graphics.lineTo(0, borderTopY); this.graphics.lineTo(0, height); this.graphics.lineTo(width, height); this.graphics.lineTo(width, borderTopY); this.graphics.lineTo(titleLabel.x + titleLabel.width - 2, borderTopY); } } }