refactor panel and containerview to share more code
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/22365eb5 Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/22365eb5 Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/22365eb5 Branch: refs/heads/develop Commit: 22365eb508548041ae5d345880dc7ce07e33a4cb Parents: 34527c2 Author: Alex Harui <[email protected]> Authored: Mon Oct 13 12:45:12 2014 -0700 Committer: Alex Harui <[email protected]> Committed: Fri Oct 17 22:38:43 2014 -0700 ---------------------------------------------------------------------- .../org/apache/flex/html/beads/ContainerView.as | 68 +++++++++--- .../src/org/apache/flex/html/beads/PanelView.as | 109 ++++++------------- 2 files changed, 85 insertions(+), 92 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/22365eb5/frameworks/as/projects/FlexJSUI/src/org/apache/flex/html/beads/ContainerView.as ---------------------------------------------------------------------- diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/html/beads/ContainerView.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/html/beads/ContainerView.as index 0928372..9979516 100644 --- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/html/beads/ContainerView.as +++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/html/beads/ContainerView.as @@ -28,6 +28,8 @@ package org.apache.flex.html.beads import org.apache.flex.core.IUIBase; import org.apache.flex.core.UIBase; import org.apache.flex.core.ValuesManager; + import org.apache.flex.events.Event; + import org.apache.flex.events.IEventDispatcher; import org.apache.flex.html.Container; import org.apache.flex.html.supportClasses.Border; import org.apache.flex.html.supportClasses.ContainerContentArea; @@ -79,56 +81,92 @@ package org.apache.flex.html.beads override public function set strand(value:IStrand):void { super.strand = value; + changeHandler(null); + IEventDispatcher(_strand).addEventListener("childrenAdded", changeHandler); + IEventDispatcher(_strand).addEventListener("widthChanged", changeHandler); + IEventDispatcher(_strand).addEventListener("heightChanged", changeHandler); + } + + private var inChangeHandler:Boolean; + + /** + * React if the size changed or content changed + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + protected function changeHandler(event:Event):void + { + if (inChangeHandler) return; + + inChangeHandler = true; + + var host:UIBase = UIBase(_strand); var padding:Object = determinePadding(); if (contentAreaNeeded()) { - actualParent = new ContainerContentArea(); - UIBase(value).addElement(actualParent); - Container(value).setActualParent(actualParent); + if (actualParent == null || actualParent == host) + { + actualParent = new ContainerContentArea(); + host.addElement(actualParent); + Container(host).setActualParent(actualParent); + } actualParent.x = padding.paddingLeft; actualParent.y = padding.paddingTop; + if (!isNaN(host.explicitWidth) || !isNaN(host.percentWidth)) + actualParent.width = host.width; + else + host.dispatchEvent(new Event("widthChanged")); + + if (!isNaN(host.explicitHeight) || !isNaN(host.percentHeight)) + actualParent.height = host.height; + else + host.dispatchEvent(new Event("heightChanged")); } else { - actualParent = value as UIBase; + actualParent = host; } - var backgroundColor:Object = ValuesManager.valuesImpl.getValue(value, "background-color"); - var backgroundImage:Object = ValuesManager.valuesImpl.getValue(value, "background-image"); + var backgroundColor:Object = ValuesManager.valuesImpl.getValue(host, "background-color"); + var backgroundImage:Object = ValuesManager.valuesImpl.getValue(host, "background-image"); if (backgroundColor != null || backgroundImage != null) { - if (value.getBeadByType(IBackgroundBead) == null) - value.addBead(new (ValuesManager.valuesImpl.getValue(value, "iBackgroundBead")) as IBead); + if (host.getBeadByType(IBackgroundBead) == null) + host.addBead(new (ValuesManager.valuesImpl.getValue(host, "iBackgroundBead")) as IBead); } var borderStyle:String; - var borderStyles:Object = ValuesManager.valuesImpl.getValue(value, "border"); + var borderStyles:Object = ValuesManager.valuesImpl.getValue(host, "border"); if (borderStyles is Array) { borderStyle = borderStyles[1]; } if (borderStyle == null) { - borderStyle = ValuesManager.valuesImpl.getValue(value, "border-style") as String; + borderStyle = ValuesManager.valuesImpl.getValue(host, "border-style") as String; } if (borderStyle != null && borderStyle != "none") { - if (value.getBeadByType(IBorderBead) == null) - value.addBead(new (ValuesManager.valuesImpl.getValue(value, "iBorderBead")) as IBead); + if (host.getBeadByType(IBorderBead) == null) + host.addBead(new (ValuesManager.valuesImpl.getValue(host, "iBorderBead")) as IBead); } if (_strand.getBeadByType(IBeadLayout) == null) { - var c:Class = ValuesManager.valuesImpl.getValue(_strand, "iBeadLayout"); + var c:Class = ValuesManager.valuesImpl.getValue(host, "iBeadLayout"); if (c) { var mapper:IBeadLayout = new c() as IBeadLayout; _strand.addBead(mapper); } - } - + } + + inChangeHandler = false; } /** http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/22365eb5/frameworks/as/projects/FlexJSUI/src/org/apache/flex/html/beads/PanelView.as ---------------------------------------------------------------------- diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/html/beads/PanelView.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/html/beads/PanelView.as index a493fa8..c832a13 100644 --- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/html/beads/PanelView.as +++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/html/beads/PanelView.as @@ -89,89 +89,44 @@ package org.apache.flex.html.beads */ override public function set strand(value:IStrand):void { - super.strand = value; - + var host:UIBase = UIBase(value); + if (!_titleBar) _titleBar = new TitleBar(); // replace the TitleBar's model with the Panel's model (it implements ITitleBarModel) so that // any changes to values in the Panel's model that correspond values in the TitleBar will // be picked up automatically by the TitleBar. - titleBar.model = Panel(_strand).model; - Container(_strand).addElement(titleBar); - - layoutChromeElements(); - - IEventDispatcher(_strand).addEventListener("childrenAdded", changeHandler); - } - - /** - * Always returns true because Panel's content is separate from its chrome - * elements such as the title bar and optional control bar. - * - * @langversion 3.0 - * @playerversion Flash 10.2 - * @playerversion AIR 2.6 - * @productversion FlexJS 0.0 - */ - override protected function contentAreaNeeded():Boolean - { - return true; - } - - /** - * @private - */ - private function layoutChromeElements():void - { - var metrics:UIMetrics = BeadMetrics.getMetrics(_strand); - - titleBar.x = 0; - titleBar.y = 0; - titleBar.width = UIBase(_strand).width; - - var ypos:Number = titleBar.y + titleBar.height; - - actualParent.x = 0; - actualParent.y = ypos; - - ypos = actualParent.y + actualParent.height; - trace("ypos is "+ypos+" because actualParent.height is "+actualParent.height); - - UIBase(_strand).dispatchEvent(new Event("widthChanged")); - } - - /** - * @private - */ - private function changeHandler(event:Event):void - { - layoutChromeElements(); - } - private function changeHandlerOLD(event:Event):void - { - var metrics:UIMetrics = BeadMetrics.getMetrics(_strand); - - var w:Number = UIBase(_strand).explicitWidth; - if (isNaN(w)) w = Math.max(titleBar.width,actualParent.width+metrics.left+metrics.right,0); - - var h:Number = UIBase(_strand).explicitHeight; - if (isNaN(h)) h = titleBar.height + actualParent.height + - metrics.top + metrics.bottom; - - titleBar.x = 0; - titleBar.y = 0; - titleBar.width = w; - - var remainingHeight:Number = h - titleBar.height; - - actualParent.x = metrics.left; - actualParent.y = titleBar.y + titleBar.height + metrics.top; - actualParent.width = w; - actualParent.height = remainingHeight - metrics.top - metrics.bottom; - - UIBase(_strand).width = w; - UIBase(_strand).height = h; + titleBar.model = host.model; + host.addElement(titleBar); + titleBar.addEventListener("heightChanged", changeHandler); + if (isNaN(host.explicitWidth) && isNaN(host.percentWidth)) + titleBar.addEventListener("widthChanged", changeHandler); + + super.strand = value; + } + /** + * @private + * Panel always needs content area. + */ + override protected function contentAreaNeeded():Boolean + { + return true; + } + + /** + * @private + */ + override protected function determinePadding():Object + { + var paddings:Object = super.determinePadding(); + titleBar.x = paddings.left; + titleBar.y = paddings.top; + titleBar.width = UIBase(_strand).width; + paddings.paddingTop += titleBar.height; + return paddings; + } + } }
