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;
+        }
+                
        }
 }

Reply via email to