update the way layout works

Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/3c23b3a1
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/3c23b3a1
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/3c23b3a1

Branch: refs/heads/develop
Commit: 3c23b3a1a2882cd13bfccdfa14044e470a12bc20
Parents: 40b5b8c
Author: Alex Harui <[email protected]>
Authored: Mon May 18 10:43:35 2015 -0700
Committer: Alex Harui <[email protected]>
Committed: Mon May 18 10:44:42 2015 -0700

----------------------------------------------------------------------
 .../src/productsView/CatalogTitleButtons.mxml   |   1 +
 .../ProductCatalogPanelTitleBarView.mxml        |   4 +-
 .../productsView/ProductCatalogThumbnail.mxml   |   1 +
 .../flex/binding/ApplicationDataBinding.as      |   4 +-
 .../apache/flex/binding/ContainerDataBinding.as |   4 +-
 .../org/apache/flex/charts/beads/ChartView.as   |  16 +-
 .../charts/beads/layouts/ChartBaseLayout.as     |  13 +-
 .../as/src/org/apache/flex/core/Application.as  |   8 +
 .../src/org/apache/flex/core/ContainerBase.as   | 138 +++++++++++++-
 .../as/src/org/apache/flex/core/IBeadLayout.as  |   5 +-
 .../Core/as/src/org/apache/flex/core/UIBase.as  |  16 +-
 .../as/src/org/apache/flex/core/UIButtonBase.as |  20 +-
 .../as/src/org/apache/flex/core/ViewBase.as     |   2 +
 .../apache/flex/utils/MXMLDataInterpreter.as    |  13 +-
 frameworks/projects/HTML/as/defaults.css        |  12 ++
 .../as/src/org/apache/flex/html/Container.as    | 119 +-----------
 .../HTML/as/src/org/apache/flex/html/Label.as   |  15 +-
 .../org/apache/flex/html/beads/ContainerView.as | 173 ++++++++++++-----
 .../src/org/apache/flex/html/beads/ListView.as  |  62 ++++--
 .../src/org/apache/flex/html/beads/PanelView.as |   1 +
 .../org/apache/flex/html/beads/ScrollBarView.as |  30 ++-
 .../flex/html/beads/ScrollingContainerView.as   |  77 +++++++-
 .../flex/html/beads/SolidBackgroundBead.as      |   7 +-
 .../flex/html/beads/layouts/BasicLayout.as      | 170 ++++++++++++-----
 .../html/beads/layouts/BasicScrollingLayout.as  |  19 +-
 .../flex/html/beads/layouts/ButtonBarLayout.as  |  11 +-
 .../flex/html/beads/layouts/HorizontalLayout.as | 190 ++++++++++++-------
 .../beads/layouts/HorizontalScrollingLayout.as  |  15 +-
 .../flex/html/beads/layouts/TileLayout.as       |  28 +--
 .../flex/html/beads/layouts/VScrollBarLayout.as |  18 +-
 .../flex/html/beads/layouts/VerticalLayout.as   | 188 +++++++++++-------
 .../beads/layouts/VerticalScrollingLayout.as    |  18 +-
 .../org/apache/flex/html/beads/DataGridView.as  |   2 +-
 .../flex/html/beads/layouts/DataGridLayout.as   |  15 +-
 .../FlexibleFirstChildHorizontalLayout.as       |  40 ++--
 .../layouts/OneFlexibleChildHorizontalLayout.as |  36 +---
 .../layouts/OneFlexibleChildVerticalLayout.as   |  38 +---
 .../html/beads/layouts/VerticalColumnLayout.as  |  13 +-
 38 files changed, 938 insertions(+), 604 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/examples/FlexJSStore/src/productsView/CatalogTitleButtons.mxml
----------------------------------------------------------------------
diff --git a/examples/FlexJSStore/src/productsView/CatalogTitleButtons.mxml 
b/examples/FlexJSStore/src/productsView/CatalogTitleButtons.mxml
index 9dbd4c8..5269fc0 100755
--- a/examples/FlexJSStore/src/productsView/CatalogTitleButtons.mxml
+++ b/examples/FlexJSStore/src/productsView/CatalogTitleButtons.mxml
@@ -28,6 +28,7 @@ limitations under the License.
     <js:beads>
         <js:ParentDocumentBead id="pdb" />
         <js:ContainerDataBinding />
+        <js:LayoutChangeNotifier watchedProperty="{viewCart.text}" 
initialValue="#FFFFFF" />
     </js:beads>
     <fx:Script>
         <![CDATA[

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/examples/FlexJSStore/src/productsView/ProductCatalogPanelTitleBarView.mxml
----------------------------------------------------------------------
diff --git 
a/examples/FlexJSStore/src/productsView/ProductCatalogPanelTitleBarView.mxml 
b/examples/FlexJSStore/src/productsView/ProductCatalogPanelTitleBarView.mxml
index b89c7b6..5e82f95 100755
--- a/examples/FlexJSStore/src/productsView/ProductCatalogPanelTitleBarView.mxml
+++ b/examples/FlexJSStore/src/productsView/ProductCatalogPanelTitleBarView.mxml
@@ -38,12 +38,12 @@ limitations under the License.
     <js:beads>
         <js:MXMLBeadViewBaseDataBinding />
         <js:ParentDocumentBead id="pdb" />
-        <js:LayoutChangeNotifier watchedProperty="{titleLabel.height}" />
+        <js:LayoutChangeNotifier watchedProperty="{buttons.width}" />
     </js:beads>
     <js:Label id="titleLabel" text="{ITitleBarModel(model).title}" 
                  />
     <js:CloseButton id="closeButton" click="clickHandler()"
                        visible="{ITitleBarModel(model).showCloseButton}";
                        />
-    <productsView:CatalogTitleButtons />
+    <productsView:CatalogTitleButtons id="buttons" />
 </js:MXMLBeadViewBase>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/examples/FlexJSStore/src/productsView/ProductCatalogThumbnail.mxml
----------------------------------------------------------------------
diff --git a/examples/FlexJSStore/src/productsView/ProductCatalogThumbnail.mxml 
b/examples/FlexJSStore/src/productsView/ProductCatalogThumbnail.mxml
index 848d202..cabbe81 100755
--- a/examples/FlexJSStore/src/productsView/ProductCatalogThumbnail.mxml
+++ b/examples/FlexJSStore/src/productsView/ProductCatalogThumbnail.mxml
@@ -73,6 +73,7 @@ limitations under the License.
             borderStyles.borderColor = "#CCCCCC";
             //style["dropShadowEnabled"] = true;
             buttons.visible = true;
+            dispatchEvent(new Event("layoutNeeded"));
         }
 
         private function rollOutHandler(event:MouseEvent):void

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ApplicationDataBinding.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ApplicationDataBinding.as
 
b/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ApplicationDataBinding.as
index e4379bd..4038645 100644
--- 
a/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ApplicationDataBinding.as
+++ 
b/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ApplicationDataBinding.as
@@ -150,11 +150,11 @@ package org.apache.flex.binding
                                     if (destObject)
                                     {
                                         cb.destination = destObject;
-                                        _strand.addBead(sb);
+                                        _strand.addBead(cb);
                                     }
                                     else
                                     {
-                                        
deferredBindings[binding.destination[0]] = sb;
+                                        
deferredBindings[binding.destination[0]] = cb;
                                         
IEventDispatcher(_strand).addEventListener("valueChange", 
deferredBindingsHandler);
                                     }
                                 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ContainerDataBinding.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ContainerDataBinding.as
 
b/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ContainerDataBinding.as
index fbe399f..d138d60 100644
--- 
a/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ContainerDataBinding.as
+++ 
b/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ContainerDataBinding.as
@@ -153,11 +153,11 @@ package org.apache.flex.binding
                                     if (destObject)
                                     {
                                         cb.destination = destObject;
-                                        _strand.addBead(sb);
+                                        _strand.addBead(cb);
                                     }
                                     else
                                     {
-                                        
deferredBindings[binding.destination[0]] = sb;
+                                        
deferredBindings[binding.destination[0]] = cb;
                                         
IEventDispatcher(_strand).addEventListener("valueChange", 
deferredBindingsHandler);
                                     }
                                 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/Charts/asjs/src/org/apache/flex/charts/beads/ChartView.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/Charts/asjs/src/org/apache/flex/charts/beads/ChartView.as 
b/frameworks/projects/Charts/asjs/src/org/apache/flex/charts/beads/ChartView.as
index 6593d1a..feadcce 100644
--- 
a/frameworks/projects/Charts/asjs/src/org/apache/flex/charts/beads/ChartView.as
+++ 
b/frameworks/projects/Charts/asjs/src/org/apache/flex/charts/beads/ChartView.as
@@ -56,9 +56,7 @@ package org.apache.flex.charts.beads
                        super.strand = value;
                        
                        _strand = value;
-                       
IEventDispatcher(_strand).addEventListener("widthChanged", handleLocalChange);
-                       
IEventDispatcher(_strand).addEventListener("heightChanged",handleLocalChange);
-                       
+            
                        var listModel:ISelectionModel = 
value.getBeadByType(ISelectionModel) as ISelectionModel;
                        listModel.addEventListener("dataProviderChanged", 
dataProviderChangeHandler);
                        
@@ -77,15 +75,7 @@ package org.apache.flex.charts.beads
                                vaxis.axisGroup = _verticalAxisGroup;
                                IParent(_strand).addElement(_verticalAxisGroup);
                        }
-                       
-                       if (_strand.getBeadByType(IBeadLayout) == null)
-                       {
-                               var layout:IBeadLayout = new 
(ValuesManager.valuesImpl.getValue(_strand, "iBeadLayout")) as IBeadLayout;
-                               _strand.addBead(layout);
-                       }
-                       
-                       handleLocalChange(null);
-                       
+                                               
                        IEventDispatcher(_strand).dispatchEvent( new 
Event("viewCreated") );
                }
                
@@ -118,7 +108,7 @@ package org.apache.flex.charts.beads
                /**
                 * @private
                 */
-               private function handleLocalChange(event:Event):void
+               override protected function layoutList():void
                {       
                        var widthAdjustment:Number = 0;
                        var heightAdjustment:Number = 0;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/Charts/asjs/src/org/apache/flex/charts/beads/layouts/ChartBaseLayout.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/Charts/asjs/src/org/apache/flex/charts/beads/layouts/ChartBaseLayout.as
 
b/frameworks/projects/Charts/asjs/src/org/apache/flex/charts/beads/layouts/ChartBaseLayout.as
index ef4e9b8..87f288b 100644
--- 
a/frameworks/projects/Charts/asjs/src/org/apache/flex/charts/beads/layouts/ChartBaseLayout.as
+++ 
b/frameworks/projects/Charts/asjs/src/org/apache/flex/charts/beads/layouts/ChartBaseLayout.as
@@ -47,10 +47,6 @@ package org.apache.flex.charts.beads.layouts
                public function set strand(value:IStrand):void
                {
                        _strand = value;
-                       
IEventDispatcher(value).addEventListener("widthChanged", changeHandler);
-                       
IEventDispatcher(value).addEventListener("childrenAdded", changeHandler);
-                       
IEventDispatcher(value).addEventListener("itemsCreated", changeHandler);
-                       
IEventDispatcher(value).addEventListener("layoutNeeded", changeHandler);
                }
                
                /**
@@ -122,12 +118,13 @@ package org.apache.flex.charts.beads.layouts
                        return _chartDataGroup;
                }
                
-               /**
-                * @private
-                */
-               private function changeHandler(event:Event):void
+        /**
+         * @copy org.apache.flex.core.IBeadLayout#layout
+         */
+               public function layout():Boolean
                {
                        performLayout();
+            return true;
                }
                
                /**

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/Core/as/src/org/apache/flex/core/Application.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/Core/as/src/org/apache/flex/core/Application.as 
b/frameworks/projects/Core/as/src/org/apache/flex/core/Application.as
index a7d0a77..c44a0bb 100644
--- a/frameworks/projects/Core/as/src/org/apache/flex/core/Application.as
+++ b/frameworks/projects/Core/as/src/org/apache/flex/core/Application.as
@@ -147,6 +147,14 @@ package org.apache.flex.core
                 if (isNaN(initialView.explicitHeight))
                     initialView.setHeight(stage.stageHeight);
                    this.addElement(initialView);
+                var bgColor:Object = ValuesManager.valuesImpl.getValue(this, 
"background-color");
+                if (bgColor != null)
+                {
+                    var backgroundColor:uint = 
ValuesManager.valuesImpl.convertColor(bgColor);
+                    graphics.beginFill(backgroundColor);
+                    graphics.drawRect(0, 0, stage.stageWidth, 
stage.stageHeight);
+                    graphics.endFill();
+                }
                 dispatchEvent(new org.apache.flex.events.Event("viewChanged"));
             }
             dispatchEvent(new 
org.apache.flex.events.Event("applicationComplete"));

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/Core/as/src/org/apache/flex/core/ContainerBase.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/Core/as/src/org/apache/flex/core/ContainerBase.as 
b/frameworks/projects/Core/as/src/org/apache/flex/core/ContainerBase.as
index daeeae6..f3efca6 100644
--- a/frameworks/projects/Core/as/src/org/apache/flex/core/ContainerBase.as
+++ b/frameworks/projects/Core/as/src/org/apache/flex/core/ContainerBase.as
@@ -18,12 +18,14 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.flex.core
 {
-       import org.apache.flex.states.State;
+       import flash.display.DisplayObject;
+       import flash.display.DisplayObjectContainer;
        
        import org.apache.flex.core.IMXMLDocument;
-    import org.apache.flex.core.ValuesManager;
+       import org.apache.flex.core.ValuesManager;
        import org.apache.flex.events.Event;
        import org.apache.flex.events.ValueChangeEvent;
+       import org.apache.flex.states.State;
        import org.apache.flex.utils.MXMLDataInterpreter;
 
     /**
@@ -72,7 +74,7 @@ package org.apache.flex.core
      *  @playerversion AIR 2.6
      *  @productversion FlexJS 0.0
      */
-       public class ContainerBase extends UIBase implements IMXMLDocument, 
IStatesObject
+       public class ContainerBase extends UIBase implements IMXMLDocument, 
IStatesObject, IContainer
        {
         /**
          *  Constructor.
@@ -85,9 +87,138 @@ package org.apache.flex.core
                public function ContainerBase()
                {
                        super();
+            actualParent = this;
                }
                
         /**
+         *  False if IChrome children are treated just like
+         *  any other children.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+        protected var supportsChromeChildren:Boolean = true;
+        
+        private var actualParent:DisplayObjectContainer;
+        
+        /**
+         *  Set a platform-specific object as the actual parent for 
+         *  children.  This must be public so it can be accessed
+         *  by beads.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+        public function setActualParent(parent:DisplayObjectContainer):void
+        {
+            actualParent = parent;     
+        }
+        
+        /**
+         *  @private
+         */
+        override public function getElementIndex(c:Object):int
+        {
+            if (c is IUIBase)
+                return actualParent.getChildIndex(IUIBase(c).element as 
DisplayObject);
+            else
+                return actualParent.getChildIndex(c as DisplayObject);
+        }
+        
+        /**
+         *  @private
+         */
+        override public function addElement(c:Object, dispatchEvent:Boolean = 
true):void
+        {
+            if (c is IUIBase)
+            {
+                if (supportsChromeChildren && c is IChrome) {
+                    addChild(IUIBase(c).element as DisplayObject);
+                    IUIBase(c).addedToParent();
+                }
+                else {
+                    actualParent.addChild(IUIBase(c).element as DisplayObject);
+                    IUIBase(c).addedToParent();
+                }
+            }
+            else {
+                if (supportsChromeChildren && c is IChrome) {
+                    addChild(c as DisplayObject);
+                }
+                else {
+                    actualParent.addChild(c as DisplayObject);
+                }
+            }
+            if (dispatchEvent)
+                this.dispatchEvent(new Event("childrenAdded"));
+        }
+        
+        /**
+         *  @private
+         */
+        override public function addElementAt(c:Object, index:int, 
dispatchEvent:Boolean = true):void
+        {
+            if (c is IUIBase)
+            {
+                if (supportsChromeChildren && c is IChrome) {
+                    addChildAt(IUIBase(c).element as DisplayObject, index);
+                    IUIBase(c).addedToParent();
+                }
+                else {
+                    actualParent.addChildAt(IUIBase(c).element as 
DisplayObject, index);
+                    IUIBase(c).addedToParent();
+                }
+            }
+            else {
+                if (supportsChromeChildren && c is IChrome) {
+                    addChildAt(c as DisplayObject, index);
+                } else {
+                    actualParent.addChildAt(c as DisplayObject, index);
+                }
+            }
+            if (dispatchEvent)
+                this.dispatchEvent(new Event("childrenAdded"));
+        }
+        
+        /**
+         *  @private
+         */
+        override public function removeElement(c:Object, dispatchEvent:Boolean 
= true):void
+        {
+            if (c is IUIBase)
+                actualParent.removeChild(IUIBase(c).element as DisplayObject);
+            else
+                actualParent.removeChild(c as DisplayObject);
+            if (dispatchEvent)
+                this.dispatchEvent(new Event("childrenRemoved"));
+        }
+        
+        /**
+         *  Get the array of children.  To change the children use
+         *  addElement, removeElement.
+         */
+        public function getChildren():Array
+        {
+            var children:Array = [];
+            var n:int = actualParent.numChildren;
+            for (var i:int = 0; i < n; i++)
+                children.push(actualParent.getChildAt(i));
+            return children;
+        }
+        
+        /**
+         *  @private
+         */
+        public function childrenAdded():void
+        {
+            dispatchEvent(new Event("childrenAdded"));
+        }
+        
+        /**
          *  A ContainerBase doesn't create its children until it is added to
          *  a parent.
          *  
@@ -114,7 +245,6 @@ package org.apache.flex.core
                        dispatchEvent(new Event("initComplete"));
                 _initialized = true;
             }
-                       dispatchEvent(new Event("childrenAdded"));
                }
 
         private var _mxmlDescriptor:Array;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/Core/as/src/org/apache/flex/core/IBeadLayout.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/Core/as/src/org/apache/flex/core/IBeadLayout.as 
b/frameworks/projects/Core/as/src/org/apache/flex/core/IBeadLayout.as
index 0166f24..fcc5569 100644
--- a/frameworks/projects/Core/as/src/org/apache/flex/core/IBeadLayout.as
+++ b/frameworks/projects/Core/as/src/org/apache/flex/core/IBeadLayout.as
@@ -32,6 +32,9 @@ package org.apache.flex.core
      */
        public interface IBeadLayout extends IBead
        {
-               
+        /**
+         * @return true if size changed 
+         */
+               function layout():Boolean;
        }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/Core/as/src/org/apache/flex/core/UIBase.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/as/src/org/apache/flex/core/UIBase.as 
b/frameworks/projects/Core/as/src/org/apache/flex/core/UIBase.as
index 2f8bca1..3bec8fb 100644
--- a/frameworks/projects/Core/as/src/org/apache/flex/core/UIBase.as
+++ b/frameworks/projects/Core/as/src/org/apache/flex/core/UIBase.as
@@ -518,7 +518,11 @@ package org.apache.flex.core
             if (!isNaN(_percentWidth))
                 return false;
             var value:* = ValuesManager.valuesImpl.getValue(this, "width");
-            return value === undefined;
+            if (value !== undefined)
+                return false;
+            var left:* = ValuesManager.valuesImpl.getValue(this, "left");
+            var right:* = ValuesManager.valuesImpl.getValue(this, "right");
+            return (left === undefined || right === undefined);
 
         }
         
@@ -537,7 +541,11 @@ package org.apache.flex.core
             if (!isNaN(_percentHeight))
                 return false;
             var value:* = ValuesManager.valuesImpl.getValue(this, "height");
-            return value === undefined;            
+            if (value !== undefined)
+                return false;
+            var top:* = ValuesManager.valuesImpl.getValue(this, "top");
+            var bottom:* = ValuesManager.valuesImpl.getValue(this, "bottom");
+            return (top === undefined || bottom === undefined);          
         }
                
                /**
@@ -1056,5 +1064,9 @@ package org.apache.flex.core
             _stageProxy = null;
         }
         
+        protected function repeaterListener(event:Event):void
+        {
+            dispatchEvent(event);
+        }
        }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/Core/as/src/org/apache/flex/core/UIButtonBase.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/Core/as/src/org/apache/flex/core/UIButtonBase.as 
b/frameworks/projects/Core/as/src/org/apache/flex/core/UIButtonBase.as
index d3f0a25..be1bc05 100644
--- a/frameworks/projects/Core/as/src/org/apache/flex/core/UIButtonBase.as
+++ b/frameworks/projects/Core/as/src/org/apache/flex/core/UIButtonBase.as
@@ -256,13 +256,10 @@ package org.apache.flex.core
                 *  @productversion FlexJS 0.0
                 */
                public function get clientWidth():Number
-               {
-                       var padding:Object = determinePadding();
-                       var pl:Number = 0;
-                       var pr:Number = 0;
-                       if (!isNaN(padding.paddingLeft)) pl = 
padding.paddingLeft;
-                       if (!isNaN(padding.paddingRight)) pr = 
padding.paddingRight;
-                       return width + pl + pr;
+               {                       
+            // button views should already factor in padding to set
+            // the borders
+                       return width;
                }
                
                /**
@@ -276,12 +273,9 @@ package org.apache.flex.core
                 */
                public function get clientHeight():Number
                {
-                       var padding:Object = determinePadding();
-                       var pt:Number = 0;
-                       var pb:Number = 0;
-                       if (!isNaN(padding.paddingTop)) pt = padding.paddingTop;
-                       if (!isNaN(padding.paddingBottom)) pb = 
padding.paddingBottom;
-                       return height + pt + pb;
+            // button views should already factor in padding to set
+            // the borders
+                       return height;
                }
                
                private var _width:Number;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/Core/as/src/org/apache/flex/core/ViewBase.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/as/src/org/apache/flex/core/ViewBase.as 
b/frameworks/projects/Core/as/src/org/apache/flex/core/ViewBase.as
index fc4fafb..74c30ce 100644
--- a/frameworks/projects/Core/as/src/org/apache/flex/core/ViewBase.as
+++ b/frameworks/projects/Core/as/src/org/apache/flex/core/ViewBase.as
@@ -63,6 +63,8 @@ package org.apache.flex.core
                {
                        super();
                        
+            supportsChromeChildren = false;
+            
                        className = "flexjs";
                }
                

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/Core/as/src/org/apache/flex/utils/MXMLDataInterpreter.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/Core/as/src/org/apache/flex/utils/MXMLDataInterpreter.as 
b/frameworks/projects/Core/as/src/org/apache/flex/utils/MXMLDataInterpreter.as
index 7b2982d..89ce693 100644
--- 
a/frameworks/projects/Core/as/src/org/apache/flex/utils/MXMLDataInterpreter.as
+++ 
b/frameworks/projects/Core/as/src/org/apache/flex/utils/MXMLDataInterpreter.as
@@ -269,7 +269,7 @@ public class MXMLDataInterpreter
         }
         if (parent && comp is DisplayObject)
         {
-            parent.addElement(comp, !(comp is IContainer));
+            parent.addElement(comp, !(parent is IContainer));
         }
         
         if (children)
@@ -277,12 +277,6 @@ public class MXMLDataInterpreter
             if (!(comp is IMXMLDocument))
             {
                 generateMXMLInstances(document, comp as IParent, children);
-            
-                // maybe we can remove this.  All IContainers should be 
IMXMLDocuments?
-                if (comp is IContainer)
-                {
-                    IContainer(comp).childrenAdded();
-                }
             }
         }
         
@@ -313,6 +307,11 @@ public class MXMLDataInterpreter
                if (!data) return;
                
         generateMXMLArray(document, parent, data);
+        // maybe we can remove this.  All IContainers should be IMXMLDocuments?
+        if (parent is IContainer)
+        {
+            IContainer(parent).childrenAdded();
+        }
     }
     
     /**

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/defaults.css
----------------------------------------------------------------------
diff --git a/frameworks/projects/HTML/as/defaults.css 
b/frameworks/projects/HTML/as/defaults.css
index 1363157..67717a6 100644
--- a/frameworks/projects/HTML/as/defaults.css
+++ b/frameworks/projects/HTML/as/defaults.css
@@ -213,6 +213,13 @@ ToolTip
     background-color: #FFFFCC;
 }
 
+ViewBase
+{
+    IBeadView: ClassReference("org.apache.flex.html.beads.ContainerView");
+    IBeadLayout: 
ClassReference("org.apache.flex.html.beads.layouts.BasicLayout");
+}
+
+
 /* Global Style Declaration */
 global
 {
@@ -448,6 +455,11 @@ ToggleTextButton
     IBeadView:  ClassReference("org.apache.flex.html.beads.CSSTextButtonView");
 }
 
+ViewBase
+{
+    iBackgroundBead: 
ClassReference("org.apache.flex.html.beads.SolidBackgroundBead");
+    iBorderBead: 
ClassReference("org.apache.flex.html.beads.SingleLineBorderBead");
+}
 
 /* SVG */
 

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/Container.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/Container.as 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/Container.as
index 70caf45..fb9b867 100644
--- a/frameworks/projects/HTML/as/src/org/apache/flex/html/Container.as
+++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/Container.as
@@ -58,7 +58,7 @@ package org.apache.flex.html
      *  @playerversion AIR 2.6
      *  @productversion FlexJS 0.0
      */    
-       public class Container extends ContainerBase implements IContainer
+       public class Container extends ContainerBase
        {
         /**
          *  Constructor.
@@ -71,124 +71,7 @@ package org.apache.flex.html
                public function Container()
                {
                        super();
-                       actualParent = this;
-               }
-               
-               private var actualParent:DisplayObjectContainer;
-               
-        /**
-         *  Set a platform-specific object as the actual parent for 
-         *  children.  This must be public so it can be accessed
-         *  by beads.
-         *  
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion FlexJS 0.0
-         */
-               public function 
setActualParent(parent:DisplayObjectContainer):void
-               {
-                       actualParent = parent;  
-               }
-               
-        /**
-         *  @private
-         */
-        override public function getElementIndex(c:Object):int
-        {
-            if (c is IUIBase)
-                return actualParent.getChildIndex(IUIBase(c).element as 
DisplayObject);
-            else
-                return actualParent.getChildIndex(c as DisplayObject);
-        }
-
-        /**
-         *  @private
-         */
-        override public function addElement(c:Object, dispatchEvent:Boolean = 
true):void
-        {
-            if (c is IUIBase)
-            {
-                               if (c is IChrome ) {
-                                       addChild(IUIBase(c).element as 
DisplayObject);
-                                       IUIBase(c).addedToParent();
-                               }
-                               else {
-                       actualParent.addChild(IUIBase(c).element as 
DisplayObject);
-                       IUIBase(c).addedToParent();
-                               }
-            }
-            else {
-                               if (c is IChrome) {
-                                       addChild(c as DisplayObject);
-                               }
-                               else {
-                                       actualParent.addChild(c as 
DisplayObject);
-                               }
-                       }
-            if (dispatchEvent)
-                this.dispatchEvent(new Event("childrenAdded"));
-        }
-        
-        /**
-         *  @private
-         */
-        override public function addElementAt(c:Object, index:int, 
dispatchEvent:Boolean = true):void
-        {
-            if (c is IUIBase)
-            {
-                               if (c is IChrome) {
-                                       addChildAt(IUIBase(c).element as 
DisplayObject, index);
-                                       IUIBase(c).addedToParent();
-                               }
-                               else {
-                       actualParent.addChildAt(IUIBase(c).element as 
DisplayObject, index);
-                       IUIBase(c).addedToParent();
-                               }
-            }
-            else {
-                               if (c is IChrome) {
-                                       addChildAt(c as DisplayObject, index);
-                               } else {
-                       actualParent.addChildAt(c as DisplayObject, index);
-                               }
-                       }
-            if (dispatchEvent)
-                this.dispatchEvent(new Event("childrenAdded"));
-        }
-        
-        /**
-         *  @private
-         */
-        override public function removeElement(c:Object, dispatchEvent:Boolean 
= true):void
-        {
-            if (c is IUIBase)
-                actualParent.removeChild(IUIBase(c).element as DisplayObject);
-            else
-                actualParent.removeChild(c as DisplayObject);
-            if (dispatchEvent)
-                this.dispatchEvent(new Event("childrenRemoved"));
-        }
-        
-        /**
-         *  Get the array of children.  To change the children use
-         *  addElement, removeElement.
-         */
-        public function getChildren():Array
-               {
-                       var children:Array = [];
-                       var n:int = actualParent.numChildren;
-                       for (var i:int = 0; i < n; i++)
-                               children.push(actualParent.getChildAt(i));
-                       return children;
                }
 
-        /**
-         *  @private
-         */
-               public function childrenAdded():void
-               {
-                       dispatchEvent(new Event("childrenAdded"));
-               }
        }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/Label.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/Label.as 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/Label.as
index 27d54ed..c47d8b9 100644
--- a/frameworks/projects/HTML/as/src/org/apache/flex/html/Label.as
+++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/Label.as
@@ -56,6 +56,7 @@ package org.apache.flex.html
                        super();
                }
                
+        [Bindable("textChange")]
         /**
          *  The text to display in the label.
          *  
@@ -77,6 +78,7 @@ package org.apache.flex.html
                        ITextModel(model).text = value;
                }
                
+        [Bindable("htmlChange")]
         /**
          *  The html-formatted text to display in the label.
          *  
@@ -97,6 +99,17 @@ package org.apache.flex.html
                {
                        ITextModel(model).html = value;
                }
-                               
+
+        
+        /**
+         *  @private
+         */
+        override public function addedToParent():void
+        {
+            super.addedToParent();
+            model.addEventListener("textChange", repeaterListener);
+            model.addEventListener("htmlChange", repeaterListener);
+        }
+
        }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ContainerView.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ContainerView.as 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ContainerView.as
index 59fb6f5..a6e8b25 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ContainerView.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ContainerView.as
@@ -19,25 +19,25 @@
 package org.apache.flex.html.beads
 {
     import org.apache.flex.core.BeadViewBase;
-       import org.apache.flex.core.IBead;
+    import org.apache.flex.core.ContainerBase;
+    import org.apache.flex.core.IBead;
     import org.apache.flex.core.IBeadLayout;
-       import org.apache.flex.core.IBeadView;
-       import org.apache.flex.core.ILayoutParent;
+    import org.apache.flex.core.IBeadView;
+    import org.apache.flex.core.ILayoutParent;
     import org.apache.flex.core.IParentIUIBase;
-       import org.apache.flex.core.IStrand;
+    import org.apache.flex.core.IStrand;
     import org.apache.flex.core.IUIBase;
     import org.apache.flex.core.UIBase;
-       import org.apache.flex.core.ValuesManager;
+    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;
-       import org.apache.flex.html.supportClasses.ScrollBar;
+    import org.apache.flex.html.supportClasses.Border;
+    import org.apache.flex.html.supportClasses.ContainerContentArea;
+    import org.apache.flex.html.supportClasses.ScrollBar;
        
     /**
      *  The ContainerView class is the default view for
-     *  the org.apache.flex.html.Container class.
+     *  the org.apache.flex.core.ContainerBase classes.
      *  It lets you use some CSS styles to manage the border, background
      *  and padding around the content area.
      *  
@@ -71,6 +71,20 @@ package org.apache.flex.html.beads
                protected var actualParent:UIBase;
                                
         /**
+         *  The layout.  The layout may actually layout
+         *  the children of the internal content area
+         *  and not the pieces of the "chrome" like titlebars
+         *  and borders.  The ContainerView or its subclass will have some
+         *  baked-in logic for handling the chrome.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */        
+        protected var layout:IBeadLayout;
+        
+        /**
          *  @copy org.apache.flex.core.IBead#strand
          *  
          *  @langversion 3.0
@@ -86,29 +100,30 @@ package org.apache.flex.html.beads
             
             if (host.isWidthSizedToContent() && host.isHeightSizedToContent())
             {
+                // if both dimensions are sized to content, then only draw the
+                // borders, etc, after a child is added.  The children in an 
MXML
+                // document don't send this event until the last child is 
added.
                 host.addEventListener("childrenAdded", changeHandler);
-                checkActualParent();
+                host.addEventListener("layoutNeeded", changeHandler);
+                // listen for width and height changes as well in case the app
+                // switches away from content sizing via binding or other code
+                host.addEventListener("widthChanged", changeHandler);
+                host.addEventListener("heightChanged", changeHandler);
             }
             else
             {
+                // otherwise, listen for size changes before drawing
+                // borders and laying out children.
                 host.addEventListener("widthChanged", changeHandler);
                 host.addEventListener("heightChanged", changeHandler);
                 host.addEventListener("sizeChanged", sizeChangeHandler);
+                // if we have fixed size in both dimensions, wait for children
+                // to be added then run a layout pass right then as the
+                // parent won't kick off any other event in the child
                 if (!isNaN(host.explicitWidth) && !isNaN(host.explicitHeight))
-                    sizeChangeHandler(null);
-                else
-                    checkActualParent();
-            }
-            
-            if (_strand.getBeadByType(IBeadLayout) == null)
-            {
-                var c:Class = ValuesManager.valuesImpl.getValue(host, 
"iBeadLayout");
-                if (c)
-                {
-                    var layout:IBeadLayout = new c() as IBeadLayout;
-                    _strand.addBead(layout);
-                }
+                    host.addEventListener("childrenAdded", changeHandler);
             }            
+            checkActualParent();
         }
         
         private function checkActualParent():Boolean
@@ -120,8 +135,8 @@ package org.apache.flex.html.beads
                 {
                     actualParent = new ContainerContentArea();
                                        actualParent.className = "ActualParent";
-                    host.addElement(actualParent);
-                    Container(host).setActualParent(actualParent);
+                    host.addElement(actualParent, false);
+                    ContainerBase(host).setActualParent(actualParent);
                 }
                 return true;
             }
@@ -137,6 +152,7 @@ package org.apache.flex.html.beads
             var host:UIBase = UIBase(_strand);
             host.addEventListener("childrenAdded", changeHandler);
             host.addEventListener("layoutNeeded", changeHandler);
+            host.addEventListener("itemsCreated", changeHandler);
             changeHandler(event);
         }
         
@@ -157,29 +173,73 @@ package org.apache.flex.html.beads
             inChangeHandler = true;
             
             var host:UIBase = UIBase(_strand);
-                       
+
+            if (layout == null)
+            {
+                layout = _strand.getBeadByType(IBeadLayout) as IBeadLayout;
+                if (layout == null)
+                {
+                    var c:Class = ValuesManager.valuesImpl.getValue(host, 
"iBeadLayout");
+                    if (c)
+                    {
+                        layout = new c() as IBeadLayout;
+                        _strand.addBead(layout);
+                    }
+                }
+            }
+            
                        var padding:Object = determinePadding();
                        
                        if (checkActualParent())
                        {
                                actualParent.x = padding.paddingLeft;
                                actualParent.y = padding.paddingTop;
-                var pb:Number = padding.paddingBottom;
-                if (isNaN(pb))
-                    pb = 0;
-                var pr:Number = padding.paddingRight;
-                if (isNaN(pr))
-                    pr = 0;
-                if (!isNaN(host.explicitWidth) || !isNaN(host.percentWidth))
+            }
+            var pb:Number = padding.paddingBottom;
+            if (isNaN(pb))
+                pb = 0;
+            var pr:Number = padding.paddingRight;
+            if (isNaN(pr))
+                pr = 0;
+            // if the width is dictated by the parent
+            if (!host.isWidthSizedToContent())
+            {
+                if (actualParent != host)
+                {
+                    // force the width of the internal content area as desired.
                     actualParent.setWidth(host.width - padding.paddingLeft - 
pr);
+                }
+                // run the layout
+                layout.layout();
+            }
+            else 
+            {
+                // if the height is dictated by the parent
+                if (!host.isHeightSizedToContent())
+                {
+                    if (actualParent != host)
+                    {
+                        // force the height
+                        actualParent.setHeight(host.height - 
padding.paddingTop - pb);
+                    }
+                }
+                layout.layout();
+                if (actualParent != host)
+                {
+                    // actualParent.width should be the new width after layout.
+                    // set the host's width.  This should send a widthChanged 
event and
+                    // have it blocked at the beginning of this method
+                    host.setWidth(padding.paddingLeft + pr + 
actualParent.width);
+                }
+            }
+            // and if the height is sized to content, set the height now as 
well.
+            if (host != actualParent)
+            {
+                if (host.isHeightSizedToContent())
+                    host.setHeight(padding.paddingTop + pb + 
actualParent.height);
                 else
-                    host.dispatchEvent(new Event("widthChanged"));
-                
-                if (!isNaN(host.explicitHeight) || !isNaN(host.percentHeight))
                     actualParent.setHeight(host.height - padding.paddingTop - 
pb);
-                else
-                    host.dispatchEvent(new Event("heightChanged"));
-                       }
+            }
                        
                        var backgroundColor:Object = 
ValuesManager.valuesImpl.getValue(host, "background-color");
                        var backgroundImage:Object = 
ValuesManager.valuesImpl.getValue(host, "background-image");
@@ -272,11 +332,10 @@ package org.apache.flex.html.beads
                 */
                protected function contentAreaNeeded():Boolean
                {
-                       return true;
-//                     var padding:Object = determinePadding();
-//                     
-//                     return (!isNaN(padding.paddingLeft) && 
padding.paddingLeft > 0 ||
-//                                 !isNaN(padding.paddingTop) && 
padding.paddingTop > 0);
+                       var padding:Object = determinePadding();
+                       
+                       return (!isNaN(padding.paddingLeft) && 
padding.paddingLeft > 0 ||
+                                   !isNaN(padding.paddingTop) && 
padding.paddingTop > 0);
                }
                
         /**
@@ -305,6 +364,8 @@ package org.apache.flex.html.beads
                        return _strand as IUIBase;
                }
                
+        private var inGetViewHeight:Boolean;
+        
                /**
                 *  @copy org.apache.flex.core.IBeadView#viewHeight
                 *  
@@ -315,11 +376,19 @@ package org.apache.flex.html.beads
                 */
                override public function get viewHeight():Number
                {
-                       // don't want to put $height in an interface
+            if (inGetViewHeight)
+            {
+                trace("ContainerView: no height set for " + host);
+                return host["$height"];
+            }
+            inGetViewHeight = true;
                        var vh:Number = contentView.height;
-                       return vh;
+            inGetViewHeight = false;
+            return vh;
                }
                
+        private var inGetViewWidth:Boolean;
+        
                /**
                 *  @copy org.apache.flex.core.IBeadView#viewWidth
                 *  
@@ -330,10 +399,16 @@ package org.apache.flex.html.beads
                 */
                override public function get viewWidth():Number
                {
-                       // don't want to put $width in an interface
+            if (inGetViewWidth)
+            {
+                trace("ContainerView: no width set for " + host);
+                return host["$width"];
+            }
+            inGetViewWidth = true;
                        var vw:Number = contentView.width;
+            inGetViewWidth = false;
                        return vw;
                }
-                               
+               
        }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ListView.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ListView.as 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ListView.as
index 7b14d2a..87ac761 100644
--- a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ListView.as
+++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ListView.as
@@ -147,6 +147,8 @@ package org.apache.flex.html.beads
                        return _strand as IUIBase;
                }
                
+        private var _layout:IBeadLayout;
+        
         /**
          * @private
          */
@@ -170,12 +172,15 @@ package org.apache.flex.html.beads
                        _strand = value;
                        
             for each (var bead:IBead in beads)
-            addBead(bead);
+                addBead(bead);
             
             dispatchEvent(new org.apache.flex.events.Event("beadsAdded"));
                        
IEventDispatcher(_strand).addEventListener("widthChanged", handleSizeChange);
                        
IEventDispatcher(_strand).addEventListener("heightChanged",handleSizeChange);
             
+            // this gets sent at least once after the beads are all in place.
+            
IEventDispatcher(_strand).addEventListener("layoutNeeded",handleSizeChange);
+            
             listModel = value.getBeadByType(ISelectionModel) as 
ISelectionModel;
             listModel.addEventListener("selectedIndexChanged", 
selectionChangeHandler);
             listModel.addEventListener("rollOverIndexChanged", 
rollOverIndexChangeHandler);
@@ -191,13 +196,6 @@ package org.apache.flex.html.beads
                        }
                        IParent(_strand).addElement(_dataGroup);
             
-            if (_strand.getBeadByType(IBeadLayout) == null)
-            {
-                var mapper:IBeadLayout = new 
(ValuesManager.valuesImpl.getValue(_strand, "iBeadLayout")) as IBeadLayout;
-                               _strand.addBead(mapper);
-            }  
-                       
-                       handleSizeChange(null);
                }
                
                private var lastSelectedIndex:int = -1;
@@ -268,16 +266,46 @@ package org.apache.flex.html.beads
             IParent(_strand).addElement(vsb);
                        return vsb;
                }
-               
-               /**
-                * @private
-                */
-               private function handleSizeChange(event:Event):void
+
+        /**
+         *  Layout everything except the DataGroup, 
+         *  but size the DataGroup as needed
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+        protected function layoutList():void
+        {
+            UIBase(_dataGroup).x = 0;
+            UIBase(_dataGroup).y = 0;
+            UIBase(_dataGroup).width = UIBase(_strand).width;
+            UIBase(_dataGroup).height = UIBase(_strand).height;
+        }
+        
+        /**
+         *  respond to a change in size or request to re-layout everything
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               protected function handleSizeChange(event:Event):void
                {
-                       UIBase(_dataGroup).x = 0;
-                       UIBase(_dataGroup).y = 0;
-                       UIBase(_dataGroup).width = UIBase(_strand).width;
-                       UIBase(_dataGroup).height = UIBase(_strand).height;
+            layoutList();
+            
+            if (_layout == null)
+            {
+                _layout = _strand.getBeadByType(IBeadLayout) as IBeadLayout;
+                if (_layout == null)
+                {
+                    _layout = new (ValuesManager.valuesImpl.getValue(_strand, 
"iBeadLayout")) as IBeadLayout;
+                    _strand.addBead(_layout);
+                }  
+            }
+            _layout.layout();
                }
                                
         /**

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelView.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelView.as 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelView.as
index dac93ad..8be59e0 100644
--- a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelView.as
+++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/PanelView.as
@@ -93,6 +93,7 @@ package org.apache.flex.html.beads
             
             if (!_titleBar)
                 _titleBar = new TitleBar();
+            _titleBar.percentWidth = 100;
                        // 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.

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollBarView.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollBarView.as 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollBarView.as
index 8091b71..e6f31cf 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollBarView.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollBarView.as
@@ -29,6 +29,8 @@ package org.apache.flex.html.beads
        import org.apache.flex.core.Strand;
        import org.apache.flex.core.UIBase;
        import org.apache.flex.core.ValuesManager;
+    import org.apache.flex.events.IEventDispatcher;
+    import org.apache.flex.events.Event;
        import org.apache.flex.html.Button;
        import 
org.apache.flex.html.beads.controllers.ButtonAutoRepeatController;
 
@@ -63,6 +65,16 @@ package org.apache.flex.html.beads
                private var _strand:IStrand;
                
         /**
+         *  The layout. 
+         * 
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+        private var layout:IBeadLayout;
+        
+        /**
          *  The host component. 
          * 
          *  @langversion 3.0
@@ -91,6 +103,13 @@ package org.apache.flex.html.beads
                 addBead(bead);
                         
                        sbModel = value.getBeadByType(IScrollBarModel) as 
IScrollBarModel;
+            sbModel = _strand.getBeadByType(IScrollBarModel) as 
IScrollBarModel;
+            sbModel.addEventListener("maximumChange", changeHandler);
+            sbModel.addEventListener("minimumChange", changeHandler);
+            sbModel.addEventListener("snapIntervalChange", changeHandler);
+            sbModel.addEventListener("stepSizeChange", changeHandler);
+            sbModel.addEventListener("pageSizeChange", changeHandler);
+            sbModel.addEventListener("valueChange", changeHandler);
             
             // TODO: (aharui) put in values impl
                        _increment = new Button();
@@ -109,13 +128,20 @@ package org.apache.flex.html.beads
             UIBase(value).addChild(_track);
             UIBase(value).addChild(_thumb);
             
+            IEventDispatcher(_strand).addEventListener("heightChanged", 
changeHandler);
+            
             if( _strand.getBeadByType(IBeadLayout) == null ) {
-                var layout:IBeadLayout = new 
(ValuesManager.valuesImpl.getValue(_strand, "iBeadLayout")) as IBeadLayout;
+                layout = new (ValuesManager.valuesImpl.getValue(_strand, 
"iBeadLayout")) as IBeadLayout;
                 _strand.addBead(layout);
             }
-            
+            layout.layout();
                }
                                                
+        private function changeHandler(event:Event):void
+        {
+            layout.layout();    
+        }
+        
                private var _decrement:DisplayObject;
                private var _increment:DisplayObject;
                private var _track:DisplayObject;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollingContainerView.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollingContainerView.as
 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollingContainerView.as
index b6098cc..ca702ee 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollingContainerView.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/ScrollingContainerView.as
@@ -21,6 +21,7 @@ package org.apache.flex.html.beads
        
        import org.apache.flex.core.BeadViewBase;
        import org.apache.flex.core.IBead;
+       import org.apache.flex.core.IBeadLayout;
        import org.apache.flex.core.IBeadView;
        import org.apache.flex.core.IParent;
        import org.apache.flex.core.IParentIUIBase;
@@ -29,7 +30,7 @@ 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.Event;
        import org.apache.flex.html.Container;
        import org.apache.flex.html.beads.models.ScrollBarModel;
        import org.apache.flex.html.supportClasses.Border;
@@ -81,6 +82,20 @@ package org.apache.flex.html.beads
                protected var actualParent:UIBase;
                                
         /**
+         *  The layout.  The layout may actually layout
+         *  the children of the internal content area
+         *  and not the pieces of the "chrome" like titlebars
+         *  and borders.  The ContainerView or its subclass will have some
+         *  baked-in logic for handling the chrome.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */        
+        protected var layout:IBeadLayout;
+        
+        /**
          *  @copy org.apache.flex.core.IBead#strand
          *  
          *  @langversion 3.0
@@ -92,20 +107,72 @@ package org.apache.flex.html.beads
                {
                        super.strand = value;
             var host:UIBase = value as UIBase;
-            if (host.numChildren > 0)
-                childHandler(null);  
+            
+            if (host.isWidthSizedToContent() && host.isHeightSizedToContent())
+            {
+                // if both dimensions are sized to content, then only draw the
+                // borders, etc, after a child is added.  The children in an 
MXML
+                // document don't send this event until the last child is 
added.
+                host.addEventListener("childrenAdded", changeHandler);
+                host.addEventListener("layoutNeeded", changeHandler);
+                // listen for width and height changes as well in case the app
+                // switches away from content sizing via binding or other code
+                host.addEventListener("widthChanged", changeHandler);
+                host.addEventListener("heightChanged", changeHandler);
+            }
             else
-                host.addEventListener("childrenAdded", childHandler);
+            {
+                // otherwise, listen for size changes before drawing
+                // borders and laying out children.
+                host.addEventListener("widthChanged", changeHandler);
+                host.addEventListener("heightChanged", changeHandler);
+                host.addEventListener("sizeChanged", sizeChangeHandler);
+                // if we have fixed size in both dimensions, wait for children
+                // to be added then run a layout pass right then as the
+                // parent won't kick off any other event in the child
+                if (!isNaN(host.explicitWidth) && !isNaN(host.explicitHeight))
+                {
+                    if (host.numChildren > 0)
+                        changeHandler(null);
+                    else
+                        host.addEventListener("childrenAdded", changeHandler);
+                }
+            }
         }
         
-        private function childHandler(event:Event):void
+        private function sizeChangeHandler(event:Event):void
+        {
+            var host:UIBase = UIBase(_strand);
+            host.addEventListener("childrenAdded", changeHandler);
+            host.addEventListener("layoutNeeded", changeHandler);
+            host.addEventListener("itemsCreated", changeHandler);
+            changeHandler(event);
+        }
+
+        private function changeHandler(event:Event):void
         {
             var host:UIBase = _strand as UIBase;
+            if (layout == null)
+            {
+                layout = host.getBeadByType(IBeadLayout) as IBeadLayout;
+                if (layout == null)
+                {
+                    var c:Class = ValuesManager.valuesImpl.getValue(host, 
"iBeadLayout");
+                    if (c)
+                    {
+                        layout = new c() as IBeadLayout;
+                        host.addBead(layout);
+                    }
+                }
+            }
+            
             if (host.numChildren > 0)
             {
                 actualParent = host.getChildAt(0) as UIBase;   
             }
         
+            layout.layout();
+            
                        var backgroundColor:Object = 
ValuesManager.valuesImpl.getValue(host, "background-color");
                        var backgroundImage:Object = 
ValuesManager.valuesImpl.getValue(host, "background-image");
                        if (backgroundColor != null || backgroundImage != null)

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/SolidBackgroundBead.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/SolidBackgroundBead.as
 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/SolidBackgroundBead.as
index c62b59b..3078048 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/SolidBackgroundBead.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/SolidBackgroundBead.as
@@ -86,12 +86,7 @@ package org.apache.flex.html.beads
                        if( bgAlpha != null ) {
                                opacity = Number(bgAlpha);
                        }
-            var ilc:ILayoutChild = value as ILayoutChild;
-            if (ilc)
-            {
-                if (!isNaN(ilc.explicitWidth) && !isNaN(ilc.explicitHeight))
-                    changeHandler(null);
-            }
+            changeHandler(null);
                }
                
                private var _backgroundColor:uint;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/BasicLayout.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/BasicLayout.as
 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/BasicLayout.as
index 665e169..bb1bc08 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/BasicLayout.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/BasicLayout.as
@@ -71,46 +71,25 @@ package org.apache.flex.html.beads.layouts
                public function set strand(value:IStrand):void
                {
             host = value as ILayoutChild;
-            
-            // if host is going to be sized by its parent, then don't
-            // run layout when the children are added until after the
-            // initial sizing by the parent.
-            if (host.isWidthSizedToContent() && host.isHeightSizedToContent())
-            {
-                addOtherListeners();
-            }
-            else
-            {
-                host.addEventListener("heightChanged", changeHandler);
-                host.addEventListener("widthChanged", changeHandler);
-                host.addEventListener("sizeChanged", sizeChangeHandler);
-                if (!isNaN(host.explicitWidth) && !isNaN(host.explicitHeight))
-                    addOtherListeners();
-            }
                }
-       
-        private function addOtherListeners():void
-        {
-            host.addEventListener("childrenAdded", changeHandler);
-            host.addEventListener("layoutNeeded", changeHandler);
-            host.addEventListener("itemsCreated", changeHandler);
-        }
-        
-        private function sizeChangeHandler(event:Event):void
-        {
-            addOtherListeners();
-            changeHandler(event);
-        }
-        
-               private function changeHandler(event:Event):void
+               
+        /**
+         * @copy org.apache.flex.core.IBeadLayout#layout
+         */
+               public function layout():Boolean
                {
             //trace(DOMPathUtil.getPath(host), event ? event.type : "fixed 
size");
                        var layoutParent:ILayoutParent = 
host.getBeadByType(ILayoutParent) as ILayoutParent;
                        var contentView:IParentIUIBase = layoutParent ? 
layoutParent.contentView : IParentIUIBase(host);
                        
-            var w:Number = contentView.width;
-            var h:Number = contentView.height;
+            var hostWidthSizedToContent:Boolean = host.isWidthSizedToContent();
+            var hostHeightSizedToContent:Boolean = 
host.isHeightSizedToContent();
+            var w:Number = hostWidthSizedToContent ? 0 : contentView.width;
+            var h:Number = hostHeightSizedToContent ? 0 : contentView.height;
                        var n:int = contentView.numElements;
+            var maxWidth:Number = 0;
+            var maxHeight:Number = 0;
+            var childData:Array = [];
                        for (var i:int = 0; i < n; i++)
                        {
                                var child:IUIBase = contentView.getElementAt(i) 
as IUIBase;
@@ -134,42 +113,131 @@ package org.apache.flex.html.beads.layouts
                 var ilc:ILayoutChild = child as ILayoutChild;
                 if (ilc)
                 {
-                    ilc = child as ILayoutChild;
-                    if (!isNaN(ilc.percentWidth))
-                        ilc.setWidth((ww - (isNaN(right) ? 0 : right)) * 
ilc.percentWidth / 100, true);
+                    if (!hostWidthSizedToContent)
+                    {
+                        if (!isNaN(ilc.percentWidth))
+                            ilc.setWidth((ww - (isNaN(right) ? 0 : right)) * 
ilc.percentWidth / 100, true);
+                    }
+                    else
+                        childData[i] = { bottom: bottom, right: right, ww: ww, 
ilc: ilc, child: child };
                 }
                 if (!isNaN(right))
                 {
-                    if (!isNaN(left))
+                    if (!hostWidthSizedToContent)
                     {
-                        if (ilc)
-                            ilc.setWidth(ww - right);
+                        if (!isNaN(left))
+                        {
+                            if (ilc)
+                                ilc.setWidth(ww - right, true);
+                            else
+                                child.width = ww - right;
+                        }
                         else
-                            child.width = ww - right;
+                            child.x = w - right - child.clientWidth;
                     }
                     else
-                        child.x = w - right - child.clientWidth;
+                        childData[i] = { ww: ww, left: left, right: right, 
ilc: ilc, child: child };
                 }
-                if (child is ILayoutChild)
+                if (ilc)
                 {
-                    ilc = child as ILayoutChild;
-                    if (!isNaN(ilc.percentHeight))
-                        ilc.setHeight((hh - (isNaN(bottom) ? 0 : bottom)) * 
ilc.percentHeight / 100, true);
+                    if (!hostHeightSizedToContent)
+                    {
+                        if (!isNaN(ilc.percentHeight))
+                            ilc.setHeight((hh - (isNaN(bottom) ? 0 : bottom)) 
* ilc.percentHeight / 100, true);
+                    }
+                    else
+                    {
+                        if (!childData[i])
+                            childData[i] = { hh: hh, bottom: bottom, ilc: ilc, 
child: child };
+                        else
+                        {
+                            childData[i].hh = hh;
+                            childData[i].bottom = bottom;
+                        }
+                    }
                 }
                 if (!isNaN(bottom))
                 {
-                    if (!isNaN(top))
+                    if (!hostHeightSizedToContent)
                     {
-                        if (ilc)
-                            ilc.setHeight(hh - bottom);
+                        if (!isNaN(top))
+                        {
+                            if (ilc)
+                                ilc.setHeight(hh - bottom, true);
+                            else
+                                child.height = hh - bottom;
+                        }
                         else
-                            child.height = hh - bottom;
+                            child.y = h - bottom - child.clientHeight;
                     }
                     else
-                        child.y = h - bottom - child.clientHeight;
+                    {
+                        if (!childData[i])
+                            childData[i] = { top: top, bottom: bottom, hh:hh, 
ilc: ilc, child: child };
+                        else
+                        {
+                            childData[i].top = top;
+                            childData[i].bottom = bottom;
+                            childData[i].hh = hh;
+                        }
+                    }
                 }
-                child.dispatchEvent(new Event("sizeChanged"));
+                if (!childData[i])
+                    child.dispatchEvent(new Event("sizeChanged"));
+                maxWidth = Math.max(maxWidth, child.x + child.clientWidth);
+                maxHeight = Math.max(maxHeight, child.y + child.clientHeight);
                        }
+            if (hostHeightSizedToContent || hostWidthSizedToContent)
+            {
+                if (hostHeightSizedToContent)
+                    ILayoutChild(contentView).setHeight(maxHeight, true);
+                if (hostHeightSizedToContent)
+                    ILayoutChild(contentView).setWidth(maxWidth, true);
+                for (i = 0; i < n; i++)
+                {
+                    var data:Object = childData[i];
+                    if (data)
+                    {
+                        if (hostWidthSizedToContent)
+                        {
+                            if (data.ilc && !isNaN(data.ilc.percentWidth))
+                                data.ilc.setWidth((data.ww - 
(isNaN(data.right) ? 0 : data.right)) * data.ilc.percentWidth / 100, true);
+                            if (!isNaN(data.right))
+                            {
+                                if (!isNaN(data.left))
+                                {
+                                    if (data.ilc)
+                                        data.ilc.setWidth(data.ww - 
data.right, true);
+                                    else
+                                        data.child.width = data.ww - 
data.right;
+                                }
+                                else
+                                    data.child.x = maxWidth - data.right - 
data.child.clientWidth;
+                            }
+                        }
+                        if (hostHeightSizedToContent)
+                        {
+                            if (data.ilc && !isNaN(data.ilc.percentHeight))
+                                data.ilc.setHeight((data.hh - 
(isNaN(data.bottom) ? 0 : data.bottom)) * data.ilc.percentHeight / 100, true);
+                            if (!isNaN(data.bottom))
+                            {
+                                if (!isNaN(data.top))
+                                {
+                                    if (data.ilc)
+                                        data.ilc.setHeight(data.hh - 
data.bottom, true);
+                                    else
+                                        data.child.height = data.hh - 
data.bottom;
+                                }
+                                else
+                                    data.child.y = maxHeight - data.bottom - 
data.child.clientHeight;
+                            }
+                        }
+                        child.dispatchEvent(new Event("sizeChanged"));
+                    }
+                }
+
+            }
+            return true;
                }
        }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/BasicScrollingLayout.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/BasicScrollingLayout.as
 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/BasicScrollingLayout.as
index e9ef9ef..c432985 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/BasicScrollingLayout.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/BasicScrollingLayout.as
@@ -77,23 +77,15 @@ package org.apache.flex.html.beads.layouts
                public function set strand(value:IStrand):void
                {
                        _strand = value;
-                       
IEventDispatcher(value).addEventListener("heightChanged", changeHandler);
-            IEventDispatcher(value).addEventListener("widthChanged", 
changeHandler);
-                       
IEventDispatcher(value).addEventListener("childrenAdded", changeHandler);
-            IEventDispatcher(value).addEventListener("layoutNeeded", 
changeHandler);
-                       
IEventDispatcher(value).addEventListener("itemsCreated", changeHandler);
-                       IEventDispatcher(value).addEventListener("beadsAdded", 
changeHandler);
                }
        
-               private function changeHandler(event:Event):void
+        /**
+         * @copy org.apache.flex.core.IBeadLayout#layout
+         */
+               public function layout():Boolean
                {
                        var layoutParent:IScrollingLayoutParent = 
_strand.getBeadByType(IScrollingLayoutParent) as IScrollingLayoutParent;
                        var contentView:IParentIUIBase = 
layoutParent.contentView;
-            if (!contentView)
-                return;
-            
-            IEventDispatcher(contentView).addEventListener("childrenAdded", 
changeHandler);
-            IEventDispatcher(contentView).addEventListener("layoutNeeded", 
changeHandler);
                        
             var border:Border = layoutParent.border;
             var borderModel:IBorderModel;
@@ -208,8 +200,7 @@ package org.apache.flex.html.beads.layouts
                 DisplayObject(contentView).scrollRect = null;
                 vScrollBar.visible = false;
             }
-            
-            IEventDispatcher(_strand).dispatchEvent(new 
Event("layoutComplete"));
+            return true;
         }
         
         private function scrollHandler(event:Event):void

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/ButtonBarLayout.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/ButtonBarLayout.as
 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/ButtonBarLayout.as
index 7589cdb..83e6803 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/ButtonBarLayout.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/ButtonBarLayout.as
@@ -71,12 +71,6 @@ package org.apache.flex.html.beads.layouts
                public function set strand(value:IStrand):void
                {
                        _strand = value;
-            IEventDispatcher(value).addEventListener("sizeChanged", 
changeHandler);
-                       
IEventDispatcher(value).addEventListener("widthChanged", changeHandler);
-                       
IEventDispatcher(value).addEventListener("heightChanged", changeHandler);
-                       
IEventDispatcher(value).addEventListener("childrenAdded", changeHandler);
-                       
IEventDispatcher(value).addEventListener("itemsCreated", changeHandler);
-                       
IEventDispatcher(value).addEventListener("layoutNeeded", changeHandler);
                }
                
                private var _buttonWidths:Array = null;
@@ -100,9 +94,9 @@ package org.apache.flex.html.beads.layouts
                }
                
                /**
-                * @private
+                * @copy org.apache.flex.core.IBeadLayout#layout
                 */
-               private function changeHandler(event:Event):void
+               public function layout():Boolean
                {
                        var layoutParent:ILayoutParent = 
_strand.getBeadByType(ILayoutParent) as ILayoutParent;
                        var contentView:IParent = layoutParent.contentView;
@@ -133,6 +127,7 @@ package org.apache.flex.html.beads.layouts
                                else UIBase(ir).width = useWidth;
                                xpos += UIBase(ir).width;
                        }
+            return true;
                }
        }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalLayout.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalLayout.as
 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalLayout.as
index 0105e2b..5400432 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalLayout.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalLayout.as
@@ -19,15 +19,15 @@
 package org.apache.flex.html.beads.layouts
 {
        import org.apache.flex.core.IBeadLayout;
-    import org.apache.flex.core.ILayoutChild;
+       import org.apache.flex.core.ILayoutChild;
        import org.apache.flex.core.ILayoutParent;
+       import org.apache.flex.core.IParentIUIBase;
        import org.apache.flex.core.IStrand;
-    import org.apache.flex.core.IParentIUIBase;
-    import org.apache.flex.core.IUIBase;
+       import org.apache.flex.core.IUIBase;
        import org.apache.flex.core.ValuesManager;
        import org.apache.flex.events.Event;
        import org.apache.flex.events.IEventDispatcher;
-    import org.apache.flex.utils.dbg.DOMPathUtil;
+       import org.apache.flex.utils.dbg.DOMPathUtil;
 
     /**
      *  The HorizontalLayout class is a simple layout
@@ -70,44 +70,19 @@ package org.apache.flex.html.beads.layouts
                public function set strand(value:IStrand):void
                {
                        host = value as ILayoutChild;
-            
-            // if host is going to be sized by its parent, then don't
-            // run layout when the children are added until after the
-            // initial sizing by the parent.
-            if (host.isWidthSizedToContent() && host.isHeightSizedToContent())
-            {
-                addOtherListeners();
-            }
-            else
-            {
-                       host.addEventListener("widthChanged", changeHandler);
-                host.addEventListener("heightChanged", changeHandler);
-                host.addEventListener("sizeChanged", sizeChangeHandler);
-                if (!isNaN(host.explicitWidth) && !isNaN(host.explicitHeight))
-                    addOtherListeners();
-            }
                }
        
-        private function addOtherListeners():void
-        {
-            host.addEventListener("childrenAdded", changeHandler);
-            host.addEventListener("layoutNeeded", changeHandler);
-            host.addEventListener("itemsCreated", changeHandler);
-        }
-        
-        private function sizeChangeHandler(event:Event):void
-        {
-            addOtherListeners();
-            changeHandler(event);
-        }
-        
-               private function changeHandler(event:Event):void
+        /**
+         * @copy org.apache.flex.core.IBeadLayout#layout
+         */
+               public function layout():Boolean
                {
             //trace(DOMPathUtil.getPath(host), event ? event.type : "fixed 
size");
                        var layoutParent:ILayoutParent = 
host.getBeadByType(ILayoutParent) as ILayoutParent;
                        var contentView:IParentIUIBase = 
layoutParent.contentView;
                        
                        var n:int = contentView.numElements;
+            var hostSizedToContent:Boolean = host.isHeightSizedToContent();
             var ilc:ILayoutChild;
                        var marginLeft:Object;
                        var marginRight:Object;
@@ -115,12 +90,18 @@ package org.apache.flex.html.beads.layouts
                        var marginBottom:Object;
                        var margin:Object;
                        var maxHeight:Number = 0;
+            // asking for contentView.width can result in infinite loop if 
host isn't sized already
+            var h:Number = hostSizedToContent ? 0 : contentView.height;
                        var verticalMargins:Array = [];
+            var hasVerticalAlign:Boolean;
                        
                        for (var i:int = 0; i < n; i++)
                        {
                                var child:IUIBase = contentView.getElementAt(i) 
as IUIBase;
                                if (child == null || !child.visible) continue;
+                var top:Number = ValuesManager.valuesImpl.getValue(child, 
"top");
+                var bottom:Number = ValuesManager.valuesImpl.getValue(child, 
"bottom");
+                ilc = child as ILayoutChild;
                                margin = 
ValuesManager.valuesImpl.getValue(child, "margin");
                                if (margin is Array)
                                {
@@ -161,6 +142,16 @@ package org.apache.flex.html.beads.layouts
                                mb = Number(marginBottom);
                                if (isNaN(mb))
                                        mb = 0;
+                var xx:Number;
+                if (i == 0)
+                    child.x = ml;
+                else
+                    child.x = xx + ml + lastmr;
+                if (ilc)
+                {
+                    if (!isNaN(ilc.percentWidth))
+                        ilc.setWidth(contentView.width * ilc.percentWidth / 
100, !isNaN(ilc.percentHeight));
+                }
                                if (marginLeft == "auto")
                                        ml = 0;
                                else
@@ -177,43 +168,112 @@ package org.apache.flex.html.beads.layouts
                                        if (isNaN(mr))
                                                mr = 0;
                                }
-                               child.y = mt;
-                               maxHeight = Math.max(maxHeight, ml + 
child.clientHeight + mr);
-                               var xx:Number;
-                               if (i == 0)
-                                       child.x = ml;
-                               else
-                                       child.x = xx + ml + lastmr;
-                if (child is ILayoutChild)
+                lastmr = mr;
+                var marginObject:Object = {};
+                verticalMargins[i] = marginObject;
+                if (!hostSizedToContent)
                 {
-                    ilc = child as ILayoutChild;
-                    if (!isNaN(ilc.percentWidth))
-                        ilc.setWidth(contentView.width * ilc.percentWidth / 
100, true);
+                    // if host is sized by parent,
+                    // we can position and size children horizontally now
+                    setPositionAndHeight(child, top, mt, bottom, mb, h);
+                }
+                else
+                {
+                    if (!isNaN(top))
+                    {
+                        mt = top;
+                        marginObject.top = mt;
+                    }
+                    if (!isNaN(bottom))
+                    {
+                        mb = bottom;
+                        marginObject.bottom = mb;
+                    }
+                    maxHeight = Math.max(maxHeight, mt + child.clientHeight + 
mb);
                 }
                                xx = child.x + child.clientWidth;
-                               lastmr = mr;
-                               var valign:Object = 
ValuesManager.valuesImpl.getValue(child, "vertical-align");
-                               verticalMargins.push({ marginTop: mt, 
marginBottom: mb, valign: valign });
+                               var valign:* = 
ValuesManager.valuesImpl.getValue(child, "vertical-align");
+                               marginObject.valign = valign;
+                if (valign !== undefined)
+                    hasVerticalAlign = true;
                        }
-                       for (i = 0; i < n; i++)
-                       {
-                               var obj:Object = verticalMargins[0]
-                               child = contentView.getElementAt(i) as IUIBase;
-                               if (child == null || !child.visible) continue;
-                if (child is ILayoutChild)
+            if (hostSizedToContent)
+            {
+                ILayoutChild(contentView).setHeight(maxHeight, true);
+                if (host.isWidthSizedToContent())
+                    ILayoutChild(contentView).setWidth(xx, true);
+                for (i = 0; i < n; i++)
                 {
-                    ilc = child as ILayoutChild;
-                    if (!isNaN(ilc.percentHeight))
-                        ilc.setHeight(contentView.height * ilc.percentHeight / 
100, true);
+                    child = contentView.getElementAt(i) as IUIBase;
+                    if (child == null || !child.visible) continue;
+                    var obj:Object = verticalMargins[i];
+                    setPositionAndHeight(child, obj.top, obj.marginTop,
+                        obj.bottom, obj.marginBottom, maxHeight);
                 }
-                               if (obj.valign == "middle")
-                                       child.y = (maxHeight - 
child.clientHeight) / 2;
-                               else if (valign == "bottom")
-                                       child.y = maxHeight - 
child.clientHeight - obj.marginBottom;
-                               else
-                                       child.y = obj.marginTop;
-                child.dispatchEvent(new Event("sizeChanged"));
-                       }
+            }
+            if (hasVerticalAlign)
+            {
+                       for (i = 0; i < n; i++)
+                       {
+                               child = contentView.getElementAt(i) as IUIBase;
+                               if (child == null || !child.visible) continue;
+                    obj = verticalMargins[i];
+                    if (child is ILayoutChild)
+                    {
+                        ilc = child as ILayoutChild;
+                        if (!isNaN(ilc.percentHeight))
+                            ilc.setHeight(contentView.height * 
ilc.percentHeight / 100, !isNaN(ilc.percentHeight));
+                    }
+                               if (obj.valign == "middle")
+                                       child.y = (maxHeight - 
child.clientHeight) / 2;
+                               else if (valign == "bottom")
+                                       child.y = maxHeight - 
child.clientHeight - obj.marginBottom;
+                               else
+                                       child.y = obj.marginTop;
+                       }
+            }
+            return true;
                }
+        
+        private function setPositionAndHeight(child:IUIBase, top:Number, 
mt:Number,
+                                             bottom:Number, mb:Number, 
h:Number):void
+        {
+            var heightSet:Boolean = false;
+            
+            var hh:Number = h;
+            var ilc:ILayoutChild = child as ILayoutChild;
+            if (!isNaN(top))
+            {
+                child.y = top + mt;
+                hh -= top + mt;
+            }
+            else 
+            {
+                child.y = mt;
+                hh -= top;
+            }
+            if (!isNaN(bottom))
+            {
+                if (!isNaN(top))
+                {
+                    if (ilc)
+                        ilc.setHeight(hh - bottom - mb, true);
+                    else 
+                    {
+                        child.height = hh - bottom - mb;
+                        heightSet = true;
+                    }
+                }
+                else
+                    child.y = h - bottom - mb - child.clientHeight;
+            }
+            if (ilc)
+            {
+                if (!isNaN(ilc.percentHeight))
+                    ilc.setHeight(h * ilc.percentHeight / 100, true);
+            }
+            if (!heightSet)
+                child.dispatchEvent(new Event("sizeChanged"));
+        }
        }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalScrollingLayout.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalScrollingLayout.as
 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalScrollingLayout.as
index 1e19e48..066d5f1 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalScrollingLayout.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/HorizontalScrollingLayout.as
@@ -70,13 +70,17 @@ package org.apache.flex.html.beads.layouts
                public function set strand(value:IStrand):void
                {
                        _strand = value;
-                       
-                       
IEventDispatcher(value).addEventListener("heightChanged", changeHandler);
-                       
IEventDispatcher(value).addEventListener("widthChanged", changeHandler);
-                       
IEventDispatcher(value).addEventListener("itemsCreated", changeHandler);
                }
                
-               private function changeHandler(event:Event):void
+        /**
+         *  @copy org.apache.flex.core.IBeadLayout#layout
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function layout():Boolean
                {            
                        var layoutParent:IScrollingLayoutParent = 
                         _strand.getBeadByType(IScrollingLayoutParent) as 
IScrollingLayoutParent;
@@ -126,6 +130,7 @@ package org.apache.flex.html.beads.layouts
                                hScrollBar.visible = false;
                        }
                        */
+            return true;
                }
                
                /*private function scrollHandler(event:Event):void

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/TileLayout.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/TileLayout.as
 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/TileLayout.as
index cbdb4dc..ea7e7df 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/TileLayout.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/TileLayout.as
@@ -63,11 +63,7 @@ package org.apache.flex.html.beads.layouts
                 */
                public function set strand(value:IStrand):void
                {
-                       _strand = value;
-                       
-                       
IEventDispatcher(_strand).addEventListener("itemsCreated",handleCreated);
-                       
IEventDispatcher(_strand).addEventListener("childrenAdded",handleCreated);
-                       
IEventDispatcher(_strand).addEventListener("layoutNeeded",handleCreated);
+                       _strand = value;                        
                }
                
                private var _numColumns:Number = 4;
@@ -129,32 +125,21 @@ package org.apache.flex.html.beads.layouts
                        _rowHeight = value;
                }
                
-               /**
-                * @private
-                */
-               private function handleCreated(event:Event):void
-               {
-                       // this is where we know the strand has things in it 
and we want to
-                       // get the part of the strand that holds the items for 
the layout
-                       updateLayout();
-               }
-               
-               /**
-                * @private
-                */
-               protected function updateLayout():void
+        /**
+         * @copy org.apache.flex.core.IBeadLayout#layout
+         */
+               public function layout():Boolean
                {
                        // this is where the layout is calculated
                        var p:ILayoutParent = 
_strand.getBeadByType(ILayoutParent) as ILayoutParent;
                        var area:UIBase = p.contentView as UIBase;
-                       if (area == null) return;
                        
                        var xpos:Number = 0;
                        var ypos:Number = 0;
                        var useWidth:Number = columnWidth;
                        var useHeight:Number = rowHeight;
                        var n:Number = area.numChildren;
-                       if (n == 0) return;
+                       if (n == 0) return false;
                        
                        var realN:Number = n;
                        for(var j:int=0; j < n; j++)
@@ -188,6 +173,7 @@ package org.apache.flex.html.beads.layouts
                                        ypos += useHeight;
                                } 
                        }
+            return true;
                }
        }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/3c23b3a1/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/VScrollBarLayout.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/VScrollBarLayout.as
 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/VScrollBarLayout.as
index f01b2b4..6d299eb 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/VScrollBarLayout.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/VScrollBarLayout.as
@@ -69,19 +69,16 @@ package org.apache.flex.html.beads.layouts
                {
                        _strand = value;
                        sbView = _strand.getBeadByType(IScrollBarView) as 
IScrollBarView;
-                       sbModel = _strand.getBeadByType(IScrollBarModel) as 
IScrollBarModel;
-                       sbModel.addEventListener("maximumChange", 
changeHandler);
-                       sbModel.addEventListener("minimumChange", 
changeHandler);
-                       sbModel.addEventListener("snapIntervalChange", 
changeHandler);
-                       sbModel.addEventListener("stepSizeChange", 
changeHandler);
-            sbModel.addEventListener("pageSizeChange", changeHandler);
-                       sbModel.addEventListener("valueChange", changeHandler);
-                       
IEventDispatcher(_strand).addEventListener("heightChanged", changeHandler);
-                       changeHandler(null);
                }
        
-               private function changeHandler(event:Event):void
+        /**
+         * @copy org.apache.flex.core.IBeadLayout#layout
+         */
+               public function layout():Boolean
                {
+            if (!sbModel)
+                sbModel = _strand.getBeadByType(IScrollBarModel) as 
IScrollBarModel
+                    
                        var h:Number = DisplayObject(_strand).height;
                        var increment:DisplayObject = sbView.increment;
                        var decrement:DisplayObject = sbView.decrement;
@@ -105,6 +102,7 @@ package org.apache.flex.html.beads.layouts
                        {
                                thumb.visible = false;
                        }
+            return true;
                }
                                                
        }

Reply via email to