package view { /** * TODO: allow size and position to be specified relative to a specific object * allow to set size and padding according to actual object settings */ import flash.display.DisplayObject; import flash.display.Stage; import flash.events.Event; public class LayoutManager { private var targets:Array; private var stage:Stage; public function LayoutManager(stage:Stage) { targets = new Array(); this.stage = stage; this.stage.addEventListener(Event.RESIZE, resizeListener); } private function getTarget(obj:DisplayObject):LayoutTarget { for each(var target:LayoutTarget in targets) { if (target.target == obj) return target; } return null; } public function registerObject(obj:DisplayObject, isScalable:Boolean):void { var target:LayoutTarget = getTarget(obj); if (target == null) { target = new LayoutTarget(obj, isScalable); targets.push(target); } else target.scalable = isScalable; } public function unregisterObject(obj:DisplayObject):void { var target:LayoutTarget = getTarget(obj); if (target != null) targets.splice(targets.indexOf(target), 1); } public function setRelativeSize(obj:DisplayObject, relativeWidth:Number, relativeHeight:Number, maintainAspectRatio:Boolean = true, allowOverflow = false):void { var target:LayoutTarget = getTarget(obj); if (target != null) target.setRelativeSize(relativeWidth, relativeHeight, maintainAspectRatio, allowOverflow); } public function setSizeLimits(obj:DisplayObject, minWidth:Number = undefined, minHeight:Number = undefined, maxWidth:Number = undefined, maxHeight:Number = undefined):void { var target:LayoutTarget = getTarget(obj); if (target != null) target.setSizeLimits(minWidth, minHeight, maxWidth, maxHeight); } public function setPadding( obj:DisplayObject, types:Array, values:Array ):void { var target:LayoutTarget = getTarget(obj); if (target != null) target.setPadding(types, values); } public function align(obj:DisplayObject, horizontal:String, vertical:String):void { var target:LayoutTarget = getTarget(obj); if (target != null) target.align(horizontal, vertical); } public function setUpdateFunction(obj:DisplayObject, updateFunction:Function):void { var target:LayoutTarget = getTarget(obj); if (target != null) target.setUpdateFunction(updateFunction); } public function forceUpdate():void { resizeListener(null); } private function resizeListener(e:Event):void { for each(var target:LayoutTarget in targets) { target.updateSize(stage.stageWidth, stage.stageHeight); target.updatePosition(stage.stageWidth, stage.stageHeight); target.customUpdate(stage.stageWidth, stage.stageHeight); } } } }