Repository: flex-asjs
Updated Branches:
  refs/heads/develop 67a1f8ee3 -> 01a641514


Fixes issues presenting scrolled content (vertical only).


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

Branch: refs/heads/develop
Commit: 01a641514b3d77a2f5c39c1d317bb65c3ecd2ae7
Parents: 67a1f8e
Author: Peter Ent <[email protected]>
Authored: Wed Jun 3 16:14:55 2015 -0400
Committer: Peter Ent <[email protected]>
Committed: Wed Jun 3 16:14:55 2015 -0400

----------------------------------------------------------------------
 .../src/org/apache/flex/html/beads/ListView.as  |   4 +-
 .../flex/html/beads/ScrollingContainerView.as   | 102 ++++---
 .../html/beads/layouts/BasicScrollingLayout.as  |  26 +-
 .../flex/html/beads/layouts/VScrollBarLayout.as |  17 +-
 .../beads/layouts/VerticalScrollingLayout.as    | 281 +++++++++++++++----
 .../flex/html/supportClasses/ScrollBar.as       |   3 +-
 6 files changed, 335 insertions(+), 98 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/01a64151/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 e35e87f..86ea70d 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
@@ -262,7 +262,9 @@ package org.apache.flex.html.beads
                        vsbm.stepSize = 1;
                        vsbm.value = 0;
                        vsb.model = vsbm;
-                       vsb.width = 16;
+                       vsb.x = IUIBase(_strand).width - 16;
+                       vsb.y = 0;
+                       vsb.setWidthAndHeight(16, IUIBase(_strand).height, 
true);
             IParent(_strand).addElement(vsb);
                        return vsb;
                }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/01a64151/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 ca702ee..a859b07 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
@@ -20,6 +20,7 @@ package org.apache.flex.html.beads
 {
        
        import org.apache.flex.core.BeadViewBase;
+       import org.apache.flex.core.ContainerBase;
        import org.apache.flex.core.IBead;
        import org.apache.flex.core.IBeadLayout;
        import org.apache.flex.core.IBeadView;
@@ -29,6 +30,7 @@ package org.apache.flex.html.beads
        import org.apache.flex.core.IStrand;
        import org.apache.flex.core.IUIBase;
        import org.apache.flex.core.UIBase;
+       import org.apache.flex.core.UIMetrics;
        import org.apache.flex.core.ValuesManager;
        import org.apache.flex.events.Event;
        import org.apache.flex.html.Container;
@@ -36,6 +38,7 @@ package org.apache.flex.html.beads
        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.utils.BeadMetrics;
        
     /**
      *  The ContainerView class is the default view for
@@ -107,6 +110,13 @@ package org.apache.flex.html.beads
                {
                        super.strand = value;
             var host:UIBase = value as UIBase;
+                       
+                       actualParent = new ContainerContentArea();
+                       actualParent.className = "ActualParent";
+                       host.addElement(actualParent, false);
+                       ContainerBase(host).setActualParent(actualParent);
+                       
+                       host.addEventListener("beadsAdded", changeHandler);
             
             if (host.isWidthSizedToContent() && host.isHeightSizedToContent())
             {
@@ -132,12 +142,12 @@ package org.apache.flex.html.beads
                 // 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
+                    if (host.numChildren == 0)
                         host.addEventListener("childrenAdded", changeHandler);
                 }
             }
+                       
+                       displayBackgroundAndBorder(host);
         }
         
         private function sizeChangeHandler(event:Event):void
@@ -146,11 +156,16 @@ package org.apache.flex.html.beads
             host.addEventListener("childrenAdded", changeHandler);
             host.addEventListener("layoutNeeded", changeHandler);
             host.addEventListener("itemsCreated", changeHandler);
-            changeHandler(event);
         }
+               
+               private var inChangeHandler:Boolean = false;
 
         private function changeHandler(event:Event):void
         {
+                       if (inChangeHandler) return;
+                       
+                       inChangeHandler = true;
+                       
             var host:UIBase = _strand as UIBase;
             if (layout == null)
             {
@@ -165,37 +180,19 @@ package org.apache.flex.html.beads
                     }
                 }
             }
-            
-            if (host.numChildren > 0)
-            {
-                actualParent = host.getChildAt(0) as UIBase;   
-            }
+                       
+                       var metrics:UIMetrics = BeadMetrics.getMetrics(host);
+                       
+                       actualParent.x = metrics.left;
+                       actualParent.y = metrics.top;
+                       actualParent.width = host.width - metrics.left - 
metrics.right;
+                       actualParent.height = host.height - metrics.top 
-metrics.bottom;
+                       // note that adding a scrollbar will go against the 
host's right
+                       // edge and be separated from the actualParent by 
padding-right
         
             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)
-                       {
-                               if (host.getBeadByType(IBackgroundBead) == null)
-                    host.addBead(new (ValuesManager.valuesImpl.getValue(host, 
"iBackgroundBead")) as IBead);                                   
-                       }
                        
-                       var borderStyle:String;
-                       var borderStyles:Object = 
ValuesManager.valuesImpl.getValue(host, "border");
-                       if (borderStyles is Array)
-                       {
-                               borderStyle = borderStyles[1];
-                       }
-                       if (borderStyle == null)
-                       {
-                               borderStyle = 
ValuesManager.valuesImpl.getValue(host, "border-style") as String;
-                       }
-                       if (borderStyle != null && borderStyle != "none")
-                       {
-                               if (host.getBeadByType(IBorderBead) == null)
-                    host.addBead(new (ValuesManager.valuesImpl.getValue(host, 
"iBorderBead")) as IBead);       
-                       }
+                       inChangeHandler = false;
                }
                
         /**
@@ -276,7 +273,10 @@ package org.apache.flex.html.beads
             var vsb:ScrollBar;
             vsb = new ScrollBar();
             vsb.model = _vScrollBarModel;
-            vsb.width = 16;
+                       // pin to right side by default
+                       vsb.x = IUIBase(_strand).width - 16;
+                       vsb.y = 0;
+                       vsb.setWidthAndHeight(16, IUIBase(_strand).height, 
true);
             IParent(_strand).addElement(vsb, false);
             return vsb;
         }
@@ -315,7 +315,41 @@ package org.apache.flex.html.beads
             return _vScrollBarModel.maximum - 
                 _vScrollBarModel.pageSize;
         }
-        
+               
+               /**
+                *  Sets up the border and background beads if necessary
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion FlexJS 0.0
+                */
+               protected function displayBackgroundAndBorder(host:UIBase) : 
void
+               {
+                       var backgroundColor:Object = 
ValuesManager.valuesImpl.getValue(host, "background-color");
+                       var backgroundImage:Object = 
ValuesManager.valuesImpl.getValue(host, "background-image");
+                       if (backgroundColor != null || backgroundImage != null)
+                       {
+                               if (host.getBeadByType(IBackgroundBead) == null)
+                                       host.addBead(new 
(ValuesManager.valuesImpl.getValue(host, "iBackgroundBead")) as IBead);         
                               
+                       }
+                       
+                       var borderStyle:String;
+                       var borderStyles:Object = 
ValuesManager.valuesImpl.getValue(host, "border");
+                       if (borderStyles is Array)
+                       {
+                               borderStyle = borderStyles[1];
+                       }
+                       if (borderStyle == null)
+                       {
+                               borderStyle = 
ValuesManager.valuesImpl.getValue(host, "border-style") as String;
+                       }
+                       if (borderStyle != null && borderStyle != "none")
+                       {
+                               if (host.getBeadByType(IBorderBead) == null)
+                                       host.addBead(new 
(ValuesManager.valuesImpl.getValue(host, "iBorderBead")) as IBead);    
+                       }
+               }
     
     }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/01a64151/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 c432985..bd440da 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
@@ -112,7 +112,9 @@ package org.apache.flex.html.beads.layouts
             }
             contentView.x = (border) ? borderModel.offsets.left : 0;
             contentView.y = (border) ? borderModel.offsets.top : 0;
-                       DisplayObject(contentView).scrollRect = new 
Rectangle(0,0,contentView.width,contentView.height);
+                       if (DisplayObject(contentView).scrollRect == null) {
+                               DisplayObject(contentView).scrollRect = new 
Rectangle(0,0,contentView.width,contentView.height);
+                       }
             
             var w:Number = contentView.width;
             var h:Number = contentView.height;
@@ -179,7 +181,11 @@ package org.apache.flex.html.beads.layouts
                        }
             if (yy > contentView.height)
             {
-                vScrollBar = layoutParent.vScrollBar;
+                               if (vScrollBar == null) {
+                                       vScrollBar = layoutParent.vScrollBar;
+                                       vScrollBar.addEventListener("scroll", 
scrollHandler);
+                                       contentView.width -= vScrollBar.width;
+                               }
                 if (ilcv)
                     ilcv.setWidth(contentView.width - vScrollBar.width);
                 else
@@ -188,12 +194,14 @@ package org.apache.flex.html.beads.layouts
                 IScrollBarModel(vScrollBar.model).pageSize = 
contentView.height;
                 IScrollBarModel(vScrollBar.model).pageStepSize = 
contentView.height;
                 vScrollBar.visible = true;
-                vScrollBar.height = contentView.height;
-                vScrollBar.y = contentView.y;
-                vScrollBar.x = contentView.width;
                 var vpos:Number = IScrollBarModel(vScrollBar.model).value;
-                DisplayObject(contentView).scrollRect = new Rectangle(0, vpos, 
contentView.width, vpos + contentView.height);
-                vScrollBar.addEventListener("scroll", scrollHandler);
+                               if (DisplayObject(contentView).scrollRect == 
null) {
+                                       var rect:Rectangle = new Rectangle(0, 
0, contentView.width, contentView.height);
+                                       DisplayObject(contentView).scrollRect = 
rect;
+                               }
+                               rect = DisplayObject(contentView).scrollRect;
+                               rect.y = vpos;
+                               DisplayObject(contentView).scrollRect = rect;
             }
             else if (vScrollBar)
             {
@@ -209,7 +217,9 @@ package org.apache.flex.html.beads.layouts
             var contentView:IParentIUIBase = layoutParent.contentView;
             
             var vpos:Number = IScrollBarModel(vScrollBar.model).value;
-            DisplayObject(contentView).scrollRect = new Rectangle(0, vpos, 
contentView.width, vpos + contentView.height);
+                       var rect:Rectangle = 
DisplayObject(contentView).scrollRect;
+                       rect.y = vpos;
+                       DisplayObject(contentView).scrollRect = rect;
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/01a64151/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 6d299eb..081208c 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
@@ -23,9 +23,11 @@ package org.apache.flex.html.beads.layouts
        import org.apache.flex.core.IBeadLayout;
        import org.apache.flex.core.IScrollBarModel;
        import org.apache.flex.core.IStrand;
+       import org.apache.flex.core.UIMetrics;
        import org.apache.flex.events.Event;
        import org.apache.flex.events.IEventDispatcher;
        import org.apache.flex.html.beads.IScrollBarView;
+       import org.apache.flex.utils.BeadMetrics;
 
     /**
      *  The VScrollBarLayout class is a layout
@@ -70,7 +72,7 @@ package org.apache.flex.html.beads.layouts
                        _strand = value;
                        sbView = _strand.getBeadByType(IScrollBarView) as 
IScrollBarView;
                }
-       
+                       
         /**
          * @copy org.apache.flex.core.IBeadLayout#layout
          */
@@ -78,8 +80,10 @@ package org.apache.flex.html.beads.layouts
                {
             if (!sbModel)
                 sbModel = _strand.getBeadByType(IScrollBarModel) as 
IScrollBarModel
+                                       
+                       var metrics:UIMetrics = BeadMetrics.getMetrics(_strand);
                     
-                       var h:Number = DisplayObject(_strand).height;
+                       var h:Number = DisplayObject(_strand).height + 
metrics.top + metrics.bottom;
                        var increment:DisplayObject = sbView.increment;
                        var decrement:DisplayObject = sbView.decrement;
                        var track:DisplayObject = sbView.track;
@@ -87,8 +91,14 @@ package org.apache.flex.html.beads.layouts
                        
                        decrement.x = 0;
                        decrement.y = 0;
+                       decrement.width = DisplayObject(_strand).width;
+                       decrement.height = decrement.width;
+                       
                        increment.x = 0;
-                       increment.y = h - increment.height;
+                       increment.width = DisplayObject(_strand).width;
+                       increment.height = increment.width;
+                       increment.y = h - increment.height - 1;
+
                        track.x = 0;
                        track.y = decrement.height;
                        track.height = increment.y - decrement.height;
@@ -102,6 +112,7 @@ package org.apache.flex.html.beads.layouts
                        {
                                thumb.visible = false;
                        }
+                       
             return true;
                }
                                                

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/01a64151/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/VerticalScrollingLayout.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/VerticalScrollingLayout.as
 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/VerticalScrollingLayout.as
index 2c6116c..91f3f7c 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/VerticalScrollingLayout.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/layouts/VerticalScrollingLayout.as
@@ -23,13 +23,14 @@ package org.apache.flex.html.beads.layouts
        
        import org.apache.flex.core.IBeadLayout;
        import org.apache.flex.core.IBorderModel;
-    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.IScrollBarModel;
        import org.apache.flex.core.IScrollingLayoutParent;
        import org.apache.flex.core.IStrand;
        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.html.supportClasses.Border;
@@ -61,9 +62,12 @@ package org.apache.flex.html.beads.layouts
                {
                }
         
-        private var vScrollBar:ScrollBar;      
-
-               private var _strand:IStrand;
+        private var vScrollBar:ScrollBar;
+               
+               // the strand/host container is also an ILayoutChild because
+               // can have its size dictated by the host's parent which is
+               // important to know for layout optimization
+               private var host:ILayoutChild;
                
         /**
          *  @copy org.apache.flex.core.IBead#strand
@@ -75,7 +79,7 @@ package org.apache.flex.html.beads.layouts
          */
                public function set strand(value:IStrand):void
                {
-                       _strand = value;
+                       host = value as ILayoutChild; 
                }
                
         /**
@@ -83,80 +87,255 @@ package org.apache.flex.html.beads.layouts
          */
                public function layout():Boolean
                {            
-            var layoutParent:IScrollingLayoutParent = 
-                _strand.getBeadByType(IScrollingLayoutParent) as 
IScrollingLayoutParent;
-            var contentView:IParentIUIBase = layoutParent.contentView as 
IParentIUIBase;
-            
-                       var border:Border = layoutParent.border;
-                       var borderModel:IBorderModel;
-            if (border)
-                borderModel = border.model as IBorderModel;
-            var ww:Number = layoutParent.resizableView.width;
-            var hh:Number = layoutParent.resizableView.height;
-            if (border)
-            {
-                border.width = ww;
-                border.height = hh;
-            }
-            
-            var ilc:ILayoutChild = contentView as ILayoutChild;
-            if (ilc)
-            {
-                ilc.setWidth(ww - ((border) ? borderModel.offsets.left + 
borderModel.offsets.right : 0));
-                ilc.setHeight(hh - ((border) ? borderModel.offsets.top - 
borderModel.offsets.bottom : 0));                
-            }
-            else
-            {
-                contentView.width = ww - ((border) ? borderModel.offsets.left 
+ borderModel.offsets.right : 0);
-                contentView.height = hh - ((border) ? borderModel.offsets.top 
- borderModel.offsets.bottom : 0);                
-            }
-                       contentView.x = (border) ? borderModel.offsets.left : 0;
-                       contentView.y = (border) ? borderModel.offsets.top : 0;
+                       var layoutParent:IScrollingLayoutParent = 
host.getBeadByType(IScrollingLayoutParent) as IScrollingLayoutParent;
+                       var contentView:IParentIUIBase = layoutParent ? 
layoutParent.contentView : IParentIUIBase(host);
                        
                        var n:int = contentView.numElements;
-                       var yy:Number = 0;
-                       
+                       var hasHorizontalFlex:Boolean;
+                       var hostSizedToContent:Boolean = 
host.isWidthSizedToContent();
+                       var flexibleHorizontalMargins:Array = [];
+                       var ilc:ILayoutChild;
+                       var marginLeft:Object;
+                       var marginRight:Object;
+                       var marginTop:Object;
+                       var marginBottom:Object;
+                       var margin:Object;
+                       var maxWidth:Number = 0;
+                       // asking for contentView.width can result in infinite 
loop if host isn't sized already
+                       var w:Number = hostSizedToContent ? 0 : 
contentView.width;
                        for (var i:int = 0; i < n; i++)
                        {
-                               var ir:IUIBase = contentView.getElementAt(i) as 
IUIBase;
-                               if (ir == null || !ir.visible) continue;
-                               ir.y = yy;
-                               ir.width = contentView.width;
-                               yy += ir.height;                        
+                               var child:IUIBase = contentView.getElementAt(i) 
as IUIBase;
+                               if (child == null || !child.visible) continue;
+                               ilc = child as ILayoutChild;
+                               var left:Number = 
ValuesManager.valuesImpl.getValue(child, "left");
+                               var right:Number = 
ValuesManager.valuesImpl.getValue(child, "right");
+                               margin = 
ValuesManager.valuesImpl.getValue(child, "margin");
+                               if (margin is Array)
+                               {
+                                       if (margin.length == 1)
+                                               marginLeft = marginTop = 
marginRight = marginBottom = margin[0];
+                                       else if (margin.length <= 3)
+                                       {
+                                               marginLeft = marginRight = 
margin[1];
+                                               marginTop = marginBottom = 
margin[0];
+                                       }
+                                       else if (margin.length == 4)
+                                       {
+                                               marginLeft = margin[3];
+                                               marginBottom = margin[2];
+                                               marginRight = margin[1];
+                                               marginTop = margin[0];          
                        
+                                       }
+                               }
+                               else if (margin == null)
+                               {
+                                       marginLeft = 
ValuesManager.valuesImpl.getValue(child, "margin-left");
+                                       marginTop = 
ValuesManager.valuesImpl.getValue(child, "margin-top");
+                                       marginRight = 
ValuesManager.valuesImpl.getValue(child, "margin-right");
+                                       marginBottom = 
ValuesManager.valuesImpl.getValue(child, "margin-bottom");
+                               }
+                               else
+                               {
+                                       marginLeft = marginTop = marginBottom = 
marginRight = margin;
+                               }
+                               var ml:Number;
+                               var mr:Number;
+                               var mt:Number;
+                               var mb:Number;
+                               var lastmb:Number;
+                               mt = Number(marginTop);
+                               if (isNaN(mt))
+                                       mt = 0;
+                               mb = Number(marginBottom);
+                               if (isNaN(mb))
+                                       mb = 0;
+                               var yy:Number;
+                               if (i == 0)
+                                       child.y = mt;
+                               else
+                                       child.y = yy + Math.max(mt, lastmb);
+                               if (ilc)
+                               {
+                                       if (!isNaN(ilc.percentHeight))
+                                               
ilc.setHeight(contentView.height * ilc.percentHeight / 100, 
!isNaN(ilc.percentWidth));
+                               }
+                               lastmb = mb;
+                               var marginObject:Object = {};
+                               flexibleHorizontalMargins[i] = marginObject;
+                               if (marginLeft == "auto")
+                               {
+                                       ml = 0;
+                                       marginObject.marginLeft = marginLeft;
+                                       hasHorizontalFlex = true;
+                               }
+                               else
+                               {
+                                       ml = Number(marginLeft);
+                                       if (isNaN(ml))
+                                       {
+                                               ml = 0;
+                                               marginObject.marginLeft = 
marginLeft;
+                                       }
+                                       else
+                                               marginObject.marginLeft = ml;
+                               }
+                               if (marginRight == "auto")
+                               {
+                                       mr = 0;
+                                       marginObject.marginRight = marginRight;
+                                       hasHorizontalFlex = true;
+                               }
+                               else
+                               {
+                                       mr = Number(marginRight);
+                                       if (isNaN(mr))
+                                       {
+                                               mr = 0;
+                                               marginObject.marginRight = 
marginRight;
+                                       }
+                                       else
+                                               marginObject.marginRight = mr;
+                               }
+                               if (!hostSizedToContent)
+                               {
+                                       // if host is sized by parent,
+                                       // we can position and size children 
horizontally now
+                                       setPositionAndWidth(child, left, ml, 
right, mr, w);
+                               }
+                               else
+                               {
+                                       if (!isNaN(left))
+                                       {
+                                               ml = left;
+                                               marginObject.left = ml;
+                                       }
+                                       if (!isNaN(right))
+                                       {
+                                               mr = right;
+                                               marginObject.right = mr;
+                                       }
+                                       maxWidth = Math.max(maxWidth, ml + 
child.width + mr);                    
+                               }
+                               yy = child.y + child.height;
+                       }
+                       if (hostSizedToContent)
+                       {
+                               ILayoutChild(contentView).setWidth(maxWidth, 
true);
+                               if (host.isHeightSizedToContent())
+                                       ILayoutChild(contentView).setHeight(yy, 
true);
+                               for (i = 0; i < n; i++)
+                               {
+                                       child = contentView.getElementAt(i) as 
IUIBase;
+                                       if (child == null || !child.visible) 
continue;
+                                       var obj:Object = 
flexibleHorizontalMargins[i];
+                                       setPositionAndWidth(child, obj.left, 
obj.marginLeft,
+                                               obj.right, obj.marginRight, 
maxWidth);
+                               }
+                       }
+                       if (hasHorizontalFlex)
+                       {
+                               for (i = 0; i < n; i++)
+                               {
+                                       child = contentView.getElementAt(i) as 
IUIBase;
+                                       if (child == null || !child.visible) 
continue;
+                                       ilc = child as ILayoutChild;
+                                       obj = flexibleHorizontalMargins[i];
+                                       if (hasHorizontalFlex)
+                                       {
+                                               if (obj.marginLeft == "auto" && 
obj.marginRight == "auto")
+                                                       child.x = maxWidth - 
child.width / 2;
+                                               else if (obj.marginLeft == 
"auto")
+                                                       child.x = maxWidth - 
child.width - obj.marginRight;
+                                       }
+                               }
                        }
                        if (yy > contentView.height)
                        {
-                               vScrollBar = layoutParent.vScrollBar;
+                               if (vScrollBar == null) {
+                                       vScrollBar = layoutParent.vScrollBar;
+                                       vScrollBar.addEventListener("scroll", 
scrollHandler);
+                                       contentView.width -= vScrollBar.width;
+                               }
                 if (ilc)
                                ilc.setWidth(contentView.width - 
vScrollBar.width);
-                else
-                    contentView.width -= vScrollBar.width;
                                IScrollBarModel(vScrollBar.model).maximum = yy;
                                IScrollBarModel(vScrollBar.model).pageSize = 
contentView.height;
                                IScrollBarModel(vScrollBar.model).pageStepSize 
= contentView.height;
                                vScrollBar.visible = true;
-                               vScrollBar.height = contentView.height;
-                               vScrollBar.y = contentView.y;
-                               vScrollBar.x = contentView.width;
                 var vpos:Number = IScrollBarModel(vScrollBar.model).value;
-                DisplayObject(contentView).scrollRect = new Rectangle(0, vpos, 
contentView.width, vpos + contentView.height);
-                vScrollBar.addEventListener("scroll", scrollHandler);
+                               if (DisplayObject(contentView).scrollRect == 
null) {
+                                       var rect:Rectangle = new Rectangle(0, 
0, contentView.width, contentView.height);
+                                       DisplayObject(contentView).scrollRect = 
rect;
+                               }
+                               rect = DisplayObject(contentView).scrollRect;
+                               rect.y = vpos;
+                DisplayObject(contentView).scrollRect = rect;//new 
Rectangle(0, vpos, contentView.width, vpos + contentView.height);
                        }
                        else if (vScrollBar)
                        {
                 DisplayObject(contentView).scrollRect = null;
                                vScrollBar.visible = false;
                        }
+                       
+                       
                        return true;
                }
+               
+               private function setPositionAndWidth(child:IUIBase, 
left:Number, ml:Number,
+                                                                               
         right:Number, mr:Number, w:Number):void
+               {
+                       var widthSet:Boolean = false;
+                       
+                       var ww:Number = w;
+                       var ilc:ILayoutChild = child as ILayoutChild;
+                       if (!isNaN(left))
+                       {
+                               child.x = left + ml;
+                               ww -= left + ml;
+                       }
+                       else 
+                       {
+                               child.x = ml;
+                               ww -= ml;
+                       }
+                       if (!isNaN(right))
+                       {
+                               if (!isNaN(left))
+                               {
+                                       if (ilc)
+                                               ilc.setWidth(ww - right - mr, 
true);
+                                       else
+                                       {
+                                               child.width = ww - right - mr;
+                                               widthSet = true;
+                                       }
+                               }
+                               else
+                                       child.x = w - right - mr - child.width;
+                       }
+                       if (ilc)
+                       {
+                               if (!isNaN(ilc.percentWidth))
+                                       ilc.setWidth(w * ilc.percentWidth / 
100, true);
+                               else {
+                                       child.width = ww;
+                                       widthSet = true;
+                               }
+                       }
+                       if (!widthSet)
+                               child.dispatchEvent(new Event("sizeChanged"));
+               }
 
         private function scrollHandler(event:Event):void
         {
-                       var layoutParent:ILayoutParent = 
_strand.getBeadByType(ILayoutParent) as ILayoutParent;
+                       var layoutParent:ILayoutParent = 
host.getBeadByType(ILayoutParent) as ILayoutParent;
                        var contentView:IParentIUIBase = 
layoutParent.contentView;
                        
             var vpos:Number = IScrollBarModel(vScrollBar.model).value;
-                       DisplayObject(contentView).scrollRect = new 
Rectangle(0, vpos, contentView.width, vpos + contentView.height);
+                       var rect:Rectangle = 
DisplayObject(contentView).scrollRect;
+                       rect.y = vpos;
+                       DisplayObject(contentView).scrollRect = rect;//new 
Rectangle(0, vpos, contentView.width, vpos + contentView.height);
         }
        }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/01a64151/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/ScrollBar.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/ScrollBar.as
 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/ScrollBar.as
index 5cf725d..3aa2571 100644
--- 
a/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/ScrollBar.as
+++ 
b/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/ScrollBar.as
@@ -19,6 +19,7 @@
 package org.apache.flex.html.supportClasses
 {
        import org.apache.flex.core.UIBase;
+       import org.apache.flex.core.IChrome;
        
        /**
         *  The ScrollBar class represents either a vertical or horizontal 
control
@@ -30,7 +31,7 @@ package org.apache.flex.html.supportClasses
         *  @playerversion AIR 2.6
         *  @productversion FlexJS 0.0
         */
-       public class ScrollBar extends UIBase
+       public class ScrollBar extends UIBase implements IChrome
        {
                /**
                 *  constructor.

Reply via email to